LyoKICoJT1NTIGRyaXZlciBmb3IgTGludXggMi5bNDZdLnggZm9yCiAqCiAqCVRyaWRlbnQgNEQtV2F2ZQogKglTaVMgNzAxOAogKglBTGkgNTQ1MQogKglUdmlhL0lHU1QgQ3liZXJQcm8gNTA1MAogKgogKglEcml2ZXI6IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCiAqICBCdWlsdCBmcm9tOgogKglMb3cgbGV2ZWwgY29kZTogPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+IGZyb20gQUxTQQogKglGcmFtZXdvcms6IFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4KICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPiAgCiAqCiAqICBIYWNrZWQgdXAgYnk6CiAqCUFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPgogKglPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+IFNpUyA3MDE4IEF1ZGlvIENvcmUgU3VwcG9ydAogKglDaGluZy1MaW5nIExlZSA8Y2xpbmctbGlAYWxpLmNvbS50dz4gQUxpIDU0NTEgQXVkaW8gQ29yZSBTdXBwb3J0IAogKglNYXR0IFd1IDxtYXR0d3VAYWNlcnNvZnRlY2guY29tLmNuPiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKICoJUGV0ZXIgV+RjaHRsZXIgPHB3YWVjaHRsZXJAbG9ld2Uta29tcC5kZT4gQ3liZXJQcm81MDUwIHN1cHBvcnQKICogICAgICBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICoKICoKICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqICBIaXN0b3J5CiAqICB2MC4xNC4xMGoKICogIAlKYW51YXJ5IDMgMjAwNCBFdWdlbmUgVGVvIDxldWdlbmV0ZW9AZXVnZW5ldGVvLm5ldD4KICogIAltaW5vciBjbGVhbnVwIHRvIHVzZSBwcl9kZWJ1ZyBpbnN0ZWFkIG9mIFRSREJHIHNpbmNlIGl0IGlzIGFscmVhZHkKICogIAlkZWZpbmVkIGluIGxpbnV4L2tlcm5lbC5oLgogKiAgdjAuMTQuMTBpCiAqICAgICAgRGVjZW1iZXIgMjkgMjAwMyBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICogICAgICBtYWpvciBjbGVhbnVwIGZvciAyLjYsIGZpeCBhIGZldyBlcnJvciBwYXRjaCBidWdsZXRzCiAqICAgICAgd2l0aCByZXR1cm5pbmcgd2l0aG91dCBwcm9wZXJseSBjbGVhbmluZyB1cCBmaXJzdCwKICogICAgICBnZXQgcmlkIG9mIGxvY2tfa2VybmVsKCkuCiAqICB2MC4xNC4xMGgKICoJU2VwdCAxMCAyMDAyIFBhc2NhbCBTY2htaWR0IDxkZXIuZXJlbWl0QGVtYWlsLmRlPgogKglhZGRlZCBzdXBwb3J0IGZvciBBTGkgNTQ1MSBqb3lzdGljayBwb3J0CiAqICB2MC4xNC4xMGcKICoJU2VwdCAwNSAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCWFkYXB0IHRvIG5ldyBwY2kgam95c3RpY2sgYXR0YWNobWVudCBpbnRlcmZhY2UKICogIHYwLjE0LjEwZgogKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBwYXRjaCBmcm9tIEVyaWMgTGVtYXIgKHZpYSBJYW4gU29ib3JvZmYpOiBpbiBzdXNwZW5kIGFuZCByZXN1bWUsIAogKiAgICAgIGZpeCB3cm9uZyBjYXN0IGZyb20gcGNpX2RldiogdG8gc3RydWN0IHRyaWRlbnRfY2FyZCouIAogKiAgdjAuMTQuMTBlCiAqICAgICAgSnVseSAxOSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIHJld3JpdGUgdGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbi9kZWFsbGNvYXRpb24gZnVuY3Rpb25zLCB0byBtYWtlIGl0IAogKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5IAogKiAgICAgIG9idGFpbmVkIHdpdGggcGNpX2FsbG9jX2NvbnNpc3RlbnQuIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZiAKICogICAgICBDT05GSUdfUFJPQ19GUyBhbmQgdmFyaW91cyBvdGhlciBjbGVhbnVwcy4KICogIHYwLjE0LjEwZAogKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBtYWRlIHNldmVyYWwgcHJpbnRrKEtFUk5fTk9USUNFLi4uKSBpbnRvIFRSREJHKC4uLiksIHRvIGF2b2lkIHNwYW1taW5nCiAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAogKiAgdjAuMTQuMTBjCiAqICAgICAgSnVseSAxNiAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIENsZWFuZWQgdXAgTGVpIEh1J3MgMC40LjEwIGRyaXZlciB0byBjb25mb3JtIHRvIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKICogICAgICBhbmQgdGhlIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAKICogIHYwLjE0LjEwYgogKiAgICAgIEp1bmUgMjMgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBhZGQgYSBtaXNzaW5nIHVubG9ja19zZXRfZm10LCByZW1vdmUgYSBzdXBlcmZsb3VzIGxvY2svdW5sb2NrIHBhaXIgCiAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uIAogKiAgdjAuMTQuMTBhCiAqICAgICAgSnVuZSAyMSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPiAKICogICAgICB1c2UgYSBkZWJ1ZyBtYWNybyBpbnN0ZWFkIG9mICNpZmRlZiBDT05GSUdfREVCVUcsIHRyaW0gdG8gODAgY29sdW1ucyAKICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAogKiAgdjAuMTQuMTAKICogICAgICBKdW5lIDYgMjAwMiBMZWkgSHUgPExlaV9odUBhbGkuY29tLnR3PgogKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEgCiAqICB2MC4xNC45ZQogKiAgICAgIEphbnVhcnkgMiAyMDAyIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4gYWRkZWQgZ2FtZXBvcnQKICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCiAqICB2MC4xNC45ZAogKiAgCU9jdG9iZXIgOCAyMDAxIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgogKgl1c2Ugc2V0X2N1cnJlbnRfc3RhdGUsIHByb3Blcmx5IHJlbGVhc2UgcmVzb3VyY2VzIG9uIGZhaWx1cmUgaW4KICoJdHJpZGVudF9wcm9iZSwgZ2V0IHJpZCBvZiBjaGVja19yZWdpb24KICogIHYwLjE0LjljCiAqCUF1Z3VzdCAxMCAyMDAxIFBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+CiAqCWFkZGVkIHN1cHBvcnQgZm9yIFR2aWEgKGZvcm1lcmx5IEludGVncmFwaGljcy9JR1NUKSBDeWJlclBybzUwNTAKICoJdGhpcyBjaGlwIGlzIG9mdGVuIGZvdW5kIGluIHNldHRvcCBib3hlcyAoY29tYmluZWQgdmlkZW8rYXVkaW8pCiAqICB2MC4xNC45YgogKglTd2l0Y2ggdG8gc3RhdGljIGlubGluZSBub3QgZXh0ZXJuIGlubGluZSAoZ2NjIDMpCiAqICB2MC4xNC45YQogKglBdWcgNiAyMDAxIEFsYW4gQ294CiAqCTAuMTQuOSBjcmFzaGVkIG9uIHJtbW9kIGR1ZSB0byBhIHRpbWVyL2JoIGxlZnQgcnVubmluZy4gU2ltcGxpZmllZAogKgl0aGUgZXhpc3RpbmcgbG9naWMgKHRoZSBCSCBkb2Vzbid0IGhlbHAgYXMgYWM5NyBpcyBsb2NrX2lycXNhdmUpCiAqCWFuZCB1c2VkIGRlbF90aW1lcl9zeW5jIHRvIGNsZWFuIHVwCiAqCUZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0aGUgQUxpIGNoYW5nZSBicm9rZSBteSBnZW5lcmljIGNhcmQKICogIHYwLjE0LjkKICoJSnVsIDEwIDIwMDEgTWF0dCBXdQogKglBZGQgSC9XIFZvbHVtZSBDb250cm9sCiAqICB2MC4xNC44YQogKglKdWx5IDcgMjAwMSBBbGFuIENveAogKglNb3ZlZCBNYXR0IFd1J3MgYWM5NyByZWdpc3RlciBjYWNoZSBpbnRvIHRoZSBjYXJkIHN0cnVjdHVyZQogKiAgdjAuMTQuOAogKglBcHIgMzAgMjAwMSBNYXR0IFd1CiAqCVNldCBFQlVGMSBhbmQgRUJVRjIgdG8gc3RpbGwgbW9kZQogKglBZGQgZGM5Ny9hYzk3IHJlc2V0IGZ1bmN0aW9uCiAqCUZpeCBwb3dlciBtYW5hZ2VtZW50OiBhbGlfcmVzdG9yZV9yZWdzCiAqICB1bnJlbGVhc2VkIAogKglNYXIgMDkgMjAwMSBNYXR0IFd1CiAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKICogIHYwLjE0LjcKICoJRmViIDA2IDIwMDEgTWF0dCBXdQogKglGaXggYWM5NyBpbml0aWFsaXphdGlvbgogKglGaXggYnVnOiBhbiBleHRyYSB0YWlsIHdpbGwgYmUgcGxheWVkIHdoZW4gcGxheWluZwogKglKYW4gMDUgMjAwMSBNYXR0IFd1CiAqCUltcGxlbWVudCBtdWx0aS1jaGFubmVscyBhbmQgUy9QRElGIGluIHN1cHBvcnQgZm9yIEFMaSAxNTM1KwogKiAgdjAuMTQuNiAKICoJTm92IDEgMjAwMCBDaGluZy1MaW5nIExlZQogKglGaXggdGhlIGJ1ZyBvZiBtZW1vcnkgbGVhayB3aGVuIHN3aXRjaGluZyA1LjEtY2hhbm5lbHMgdG8gMiBjaGFubmVscy4KICoJQWRkIGxvY2sgcHJvdGVjdGlvbiBpbnRvIGR5bmFtaWMgY2hhbmdpbmcgZm9ybWF0IG9mIGRhdGEuCiAqCU9jdCAxOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCTUuMS1jaGFubmVscyBzdXBwb3J0IGZvciBBTGkKICoJSnVuZSAyOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCVMvUERJRiBvdXQvaW4ocGxheWJhY2svcmVjb3JkKSBzdXBwb3J0IGZvciBBTGkgMTUzNSssIHVzaW5nIC9wcm9jIHRvIGJlIHNlbGVjdGVkIGJ5IHVzZXIKICoJU2ltcGxlIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgQUxpCiAqICB2MC4xNC41IE1heSAyMyAyMDAwIE9sbGllIExobwogKiAgCU1pc2MgYnVnIGZpeCBmcm9tIHRoZSBOZXQKICogIHYwLjE0LjQgTWF5IDIwIDIwMDAgQWFyb24gSG9sdHptYW4KICogIAlGaXgga2ZyZWUnZCBtZW1vcnkgYWNjZXNzIGluIHJlbGVhc2UKICogIAlGaXggcmFjZSBpbiBvcGVuIHdoaWxlIGxvb2tpbmcgZm9yIGEgZnJlZSB2aXJ0dWFsIGNoYW5uZWwgc2xvdAogKiAgCXJlbW92ZSBvcGVuX3dhaXQgd3EgKHdoaWNoIGFwcGVhcnMgdG8gYmUgdW51c2VkKQogKiAgdjAuMTQuMyBNYXkgMTAgMjAwMCBPbGxpZSBMaG8KICoJZml4ZWQgYSBzbWFsbCBidWcgaW4gdHJpZGVudF91cGRhdGVfcHRyLCB4bW1zIDEuMC4xIG5vIGxvbmdlciB1c2VzIDEwMCUgQ1BVCiAqICB2MC4xNC4yIE1hciAyOSAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFkZCBjbGVhciB0byBzaWxlbmNlIGFkdmFuY2UgaW4gdHJpZGVudF91cGRhdGVfcHRyIAogKglmaXggaW52YWxpZCBkYXRhIG9mIHRoZSBlbmQgb2YgdGhlIHNvdW5kCiAqICB2MC4xNC4xIE1hciAyNCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFMaSA1NDUxIHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgTy5LLgogKglBTGkgNTQ1MSBvcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgc3RydWN0dXJlZCBiYXNlZCBvbiBzb25pY3ZpYmVzLCBhbmQKICoJc3VnZ2VzdGVkIHRvIG1lcmdlIGludG8gdGhpcyBmaWxlIGJ5IEFsYW4gQ294LgogKiAgdjAuMTQgTWFyIDE1IDIwMDAgT2xsaWUgTGhvCiAqCTUuMSBjaGFubmVsIG91dHB1dCBzdXBwb3J0IHdpdGggY2hhbm5lbCBiaW5kaW5nLiBXaGF0J3MgdGhlIE1hdHJpeCA/CiAqICB2MC4xMy4xIE1hciAxMCAyMDAwIE9sbGllIExobwogKglmZXcgbWlub3IgYnVncyBvbiBkdWFsIGNvZGVjIHN1cHBvcnQsIG5lZWRzIG1vcmUgdGVzdGluZwogKiAgdjAuMTMgTWFyIDAzIDIwMDAgT2xsaWUgTGhvCiAqCW5ldyBwY2lfKiBmb3IgMi40IGtlcm5lbCwgYmFjayBwb3J0ZWQgdG8gMi4yCiAqICB2MC4xMiBGZWIgMjMgMjAwMCBPbGxpZSBMaG8KICoJUHJlbGltaW5hcnkgUmVjb3JkaW5nIHN1cHBvcnQKICogIHYwLjExLjIgRmViIDE5IDIwMDAgT2xsaWUgTGhvCiAqCXJlbW92ZWQgaW5jb21wbGV0ZSBmdWxsLWR1bHBsZXggc3VwcG9ydAogKiAgdjAuMTEuMSBKYW4gMjggMjAwMCBPbGxpZSBMaG8KICoJc21hbGwgYnVnIGluIHNldHRpbmcgc2FtcGxlIHJhdGUgZm9yIDRkLW54IChyZXBvcnRlZCBieSBBYXJvbikKICogIHYwLjExIEphbiAyNyAyMDAwIE9sbGllIExobwogKglETUEgYnVnLCBzY2hlZHVsZXIgbGF0ZW5jeSwgc2Vjb25kIHRyeQogKiAgdjAuMTAgSmFuIDI0IDIwMDAgT2xsaWUgTGhvCiAqCURNQSBidWcgZml4ZWQsIGZvdW5kIGtlcm5lbCBzY2hlZHVsaW5nIHByb2JsZW0KICogIHYwLjA5IEphbiAyMCAyMDAwIE9sbGllIExobwogKglDbGVhbiB1cCBvZiBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lIChwcmVwYXJlIGZvciBjaGFubmVsIGJpbmRpbmcpCiAqICB2MC4wOCBKYW4gMTQgMjAwMCBPbGxpZSBMaG8KICoJSXNvbGF0aW9uIG9mIEFDOTcgY29kZWMgY29kZQogKiAgdjAuMDcgSmFuIDEzIDIwMDAgT2xsaWUgTGhvCiAqCUdldCByaWQgb2YgdWdseSBvbGQgbG93IGxldmVsIGFjY2VzcyByb3V0aW5lcyAoZS5nLiBDSFJlZ3MubHAqKioqKQogKiAgdjAuMDYgSmFuIDExIDIwMDAgT2xsaWUgTGhvCiAqCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGR1YWwgKG1vcmUgPykgQUM5NyBjb2RlY3MKICogIHYwLjA1IEphbiAwOCAyMDAwIEx1Y2EgTW9udGVjY2hpYW5pIDxtLmx1Y2FAaW5hbWUuY29tPgogKglhZGFwdCB0byAyLjMueCBuZXcgX19zZXR1cC9fX2luaXQgY2FsbAogKiAgdjAuMDQgRGVjIDMxIDE5OTkgT2xsaWUgTGhvCiAqCU11bHRpcGxlIE9wZW4sIHVzaW5nIE1pZGRsZSBMb29wIEludGVycnVwdCB0byBzbW9vdGggcGxheWJhY2sKICogIHYwLjAzIERlYyAyNCAxOTk5IE9sbGllIExobwogKgltZW0gbGVhayBpbiBwcm9nX2RtYWJ1ZiBhbmQgZGVhbGxvY19kbWFidWYgcmVtb3ZlZAogKiAgdjAuMDIgRGVjIDE1IDE5OTkgT2xsaWUgTGhvCiAqCVNpUyA3MDE4IHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIE8uSy4KICogIHYwLjAxIEFsYW4gQ294IGV0LiBhbC4KICoJSW5pdGlhbCBSZWxlYXNlIGluIGtlcm5lbCAyLjMuMzAsIGRvZXMgbm90IHdvcmsKICogCiAqICBUb0RvCiAqCUNsZWFuIHVwIG9mIGxvdyBsZXZlbCBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyBjb2RlLiAoZG9uZSkKICoJRml4IHRoZSBidWcgb24gZG1hIGJ1ZmZlciBtYW5hZ2VtZW50IGluIHVwZGF0ZV9wdHIsIHJlYWQvd3JpdGUsIGRyYWluX2RhYyAoZG9uZSkKICoJRHVhbCBBQzk3IGNvZGVjcyBzdXBwb3J0IChkb25lKQogKglSZWNvcmRpbmcgc3VwcG9ydCAoZG9uZSkKICoJTW1hcCBzdXBwb3J0CiAqCSJDaGFubmVsIEJpbmRpbmciIGlvY3RsIGV4dGVuc2lvbiAoZG9uZSkKICoJbmV3IHBjaSBkZXZpY2UgZHJpdmVyIGludGVyZmFjZSBmb3IgMi40IGtlcm5lbCAoZG9uZSkKICoKICoJTG9jayBvcmRlciAoaGlnaC0+bG93KQogKgkJbG9jawktCWhhcmR3YXJlIGxvY2sKICoJCW9wZW5fbXV0ZXggLSAJZ3VhcmQgb3BlbnMKICoJCXNlbQktCWd1YXJkIGRtYWJ1Ziwgd3JpdGUgcmUtZW50cnkgZXRjCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvcG0uaD4KI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgoKI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9kbWEuaD4KCiNpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9OQVVUSUxVUykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEFfR0VORVJJQykKI2luY2x1ZGUgPGFzbS9od3JwYi5oPgojZW5kaWYKCiNpbmNsdWRlICJ0cmlkZW50LmgiCgojZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjE0LjEwai0yLjYiCgojaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKI2RlZmluZSBTVVBQT1JUX0pPWVNUSUNLIDEKI2VuZGlmCgovKiBtYWdpYyBudW1iZXJzIHRvIHByb3RlY3Qgb3VyIGRhdGEgc3RydWN0dXJlcyAqLwojZGVmaW5lIFRSSURFTlRfQ0FSRF9NQUdJQwkweDUwNzI2OTZFCS8qICJQcmluIiAqLwojZGVmaW5lIFRSSURFTlRfU1RBVEVfTUFHSUMJMHg2MzY1NzM3MwkvKiAiY2VzcyIgKi8KCiNkZWZpbmUgVFJJREVOVF9ETUFfTUFTSwkweDNmZmZmZmZmCS8qIERNQSBidWZmZXIgbWFzayBmb3IgcGNpX2FsbG9jX2NvbnNpc3QgKi8KI2RlZmluZSBBTElfRE1BX01BU0sJCTB4N2ZmZmZmZmYJLyogQUxJIFRyaWRlbnRzIGhhdmUgMzEtYml0IERNQS4gV293LiAqLwoKI2RlZmluZSBOUl9IV19DSAkJMzIKCi8qIG1heGltdW0gbnVtYmVyIG9mIEFDOTcgY29kZWNzIGNvbm5lY3RlZCwgQUM5NyAyLjAgZGVmaW5lZCA0LCBidXQgNzAxOCBhbmQgNEQtTlggb25seQogICBoYXZlIDIgU0RBVEFfSU4gbGluZXMgKGN1cnJlbnRseSkgKi8KI2RlZmluZSBOUl9BQzk3CQkyCgovKiBtaW5vciBudW1iZXIgb2YgL2Rldi9zd21vZGVtICh0ZW1wb3JhcnksIGV4cGVyaW1lbnRhbCkgKi8KI2RlZmluZSBTTkRfREVWX1NXTU9ERU0JNwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGFsaV9tdWx0aV9jaGFubmVsc181XzFbXSA9IHsKCS8qQUxJX1NVUlJfTEVGVF9DSEFOTkVMLCBBTElfU1VSUl9SSUdIVF9DSEFOTkVMLCAqLwoJQUxJX0NFTlRFUl9DSEFOTkVMLAoJQUxJX0xFRl9DSEFOTkVMLAoJQUxJX1NVUlJfTEVGVF9DSEFOTkVMLAoJQUxJX1NVUlJfUklHSFRfQ0hBTk5FTAp9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CgpzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPSBLRVJOX0NSSVQgInRyaWRlbnQ6IGludmFsaWQgbWFnaWMgdmFsdWUgaW4gJXNcbiI7CgplbnVtIHsKCVRSSURFTlRfNERfRFggPSAwLAoJVFJJREVOVF80RF9OWCwKCVNJU183MDE4LAoJQUxJXzU0NTEsCglDWUJFUjUwNTAKfTsKCnN0YXRpYyBjaGFyICpjYXJkX25hbWVzW10gPSB7CgkiVHJpZGVudCA0RFdhdmUgRFgiLAoJIlRyaWRlbnQgNERXYXZlIE5YIiwKCSJTaVMgNzAxOCBQQ0kgQXVkaW8iLAoJIkFMaSBBdWRpbyBBY2NlbGVyYXRvciIsCgkiVHZpYS9JR1NUIEN5YmVyUHJvIDUwNTAiCn07CgpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdHJpZGVudF9wY2lfdGJsW10gPSB7Cgl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFgpLAoJCVBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPIDw8IDgsIDB4ZmZmZjAwLCBUUklERU5UXzREX0RYfSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWCksCgkJMCwgMCwgVFJJREVOVF80RF9OWH0sCgl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpLCAwLCAwLCBTSVNfNzAxOH0sCgl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FMSSwgUENJX0RFVklDRV9JRF9BTElfNTQ1MSksIDAsIDAsIEFMSV81NDUxfSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URVJHLCBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSwKCQkwLCAwLCBDWUJFUjUwNTB9LAoJezAsfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRyaWRlbnRfcGNpX3RibCk7CgovKiAic29mdHdhcmUiIG9yIHZpcnR1YWwgY2hhbm5lbCwgYW4gaW5zdGFuY2Ugb2Ygb3BlbmVkIC9kZXYvZHNwICovCnN0cnVjdCB0cmlkZW50X3N0YXRlIHsKCXVuc2lnbmVkIGludCBtYWdpYzsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQ7CS8qIENhcmQgaW5mbyAqLwoKCS8qIGZpbGUgbW9kZSAqLwoJbW9kZV90IG9wZW5fbW9kZTsKCgkvKiB2aXJ0dWFsIGNoYW5uZWwgbnVtYmVyICovCglpbnQgdmlydDsKCglzdHJ1Y3QgZG1hYnVmIHsKCQkvKiB3YXZlIHNhbXBsZSBzdHVmZiAqLwoJCXVuc2lnbmVkIGludCByYXRlOwoJCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7CgoJCS8qIGhhcmR3YXJlIGNoYW5uZWwgKi8KCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsOwoKCQkvKiBPU1MgYnVmZmVyIG1hbmFnZW1lbnQgc3R1ZmYgKi8KCQl2b2lkICpyYXdidWY7CgkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwoJCXVuc2lnbmVkIGJ1Zm9yZGVyOwoJCXVuc2lnbmVkIG51bWZyYWc7CgkJdW5zaWduZWQgZnJhZ3NoaWZ0OwoKCQkvKiBvdXIgYnVmZmVyIGFjdHMgbGlrZSBhIGNpcmN1bGFyIHJpbmcgKi8KCQl1bnNpZ25lZCBod3B0cjsJLyogd2hlcmUgZG1hIGxhc3Qgc3RhcnRlZCwgdXBkYXRlZCBieSB1cGRhdGVfcHRyICovCgkJdW5zaWduZWQgc3dwdHI7CS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCwgdXBkYXRlZCBieSByZWFkL3dyaXRlICovCgkJaW50IGNvdW50OwkvKiBieXRlcyB0byBiZSBjb21zdW1lZCBvciBiZWVuIGdlbmVyYXRlZCBieSBkbWEgbWFjaGluZSAqLwoJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvKiB0b3RhbCBieXRlcyBkbWFlZCBieSBoYXJkd2FyZSAqLwoKCQl1bnNpZ25lZCBlcnJvcjsJLyogbnVtYmVyIG9mIG92ZXIvdW5kZXJydW5zICovCiAgICAgICAgICAgICAgICAvKiBwdXQgcHJvY2VzcyBvbiB3YWl0IHF1ZXVlIHdoZW4gbm8gbW9yZSBzcGFjZSBpbiBidWZmZXIgKi8KCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkKCgkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLwoJCXVuc2lnbmVkIGZyYWdzaXplOwoJCXVuc2lnbmVkIGRtYXNpemU7CgkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CgoJCS8qIE9TUyBzdHVmZiAqLwoJCXVuc2lnbmVkIG1hcHBlZDoxOwoJCXVuc2lnbmVkIHJlYWR5OjE7CgkJdW5zaWduZWQgZW5kY2xlYXJlZDoxOwoJCXVuc2lnbmVkIHVwZGF0ZV9mbGFnOwoJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKCQlpbnQgb3NzbWF4ZnJhZ3M7CgkJdW5zaWduZWQgc3ViZGl2aXNpb247CgoJfSBkbWFidWY7CgoJLyogNS4xIGNoYW5uZWxzICovCglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqb3RoZXJfc3RhdGVzWzRdOwoJaW50IG11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudDsKCXVuc2lnbmVkIGNoYW5zX251bTsKCXVuc2lnbmVkIGxvbmcgZm10X2ZsYWc7CgkvKiBHdWFyZCBhZ2FpbnN0IG1tYXAvd3JpdGUvcmVhZCByYWNlcyAqLwoJc3RydWN0IG11dGV4IHNlbTsKCn07CgovKiBoYXJkd2FyZSBjaGFubmVscyAqLwpzdHJ1Y3QgdHJpZGVudF9jaGFubmVsIHsKCWludCBudW07IC8qIGNoYW5uZWwgbnVtYmVyICovCgl1MzIgbGJhOyAvKiBMb29wIEJlZ2luZSBBZGRyZXNzLCB3aGVyZSBkbWEgYnVmZmVyIHN0YXJ0cyAqLwoJdTMyIGVzbzsgLyogRW5kIFNhbXBsZSBPZmZzZXQsIHdlaHJlIGRtYSBidWZmZXIgZW5kcyAqLyAKCSAgICAgICAgIC8qIChpbiB0aGUgdW5pdCBvZiBzYW1wbGVzKSAqLwoJdTMyIGRlbHRhOyAvKiBkZWx0YSB2YWx1ZSwgc2FtcGxlIHJhdGUgLyA0OGsgZm9yIHBsYXliYWNrLCAqLwoJICAgICAgICAgICAvKiA0OGsvc2FtcGxlIHJhdGUgZm9yIHJlY29yZGluZyAqLwoJdTE2IGF0dHJpYnV0ZTsgLyogY29udHJvbCB3aGVyZSBQQ00gZGF0YSBnbyBhbmQgY29tZSAgKi8KCXUxNiBmbV92b2w7Cgl1MzIgY29udHJvbDsgLyogc2lnbmVkL3Vuc2lnbmVkLCA4LzE2IGJpdHMsIG1vbm8vc3RlcmVvICovCn07CgpzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzIHsKCXUzMiBzdGFydDsKCXUzMiBzdG9wOwoJdTMyIGFpbnQ7Cgl1MzIgYWludF9lbjsKfTsKCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzIGJhbmtfYV9hZGRycyA9IHsKCVQ0RF9TVEFSVF9BLAoJVDREX1NUT1BfQSwKCVQ0RF9BSU5UX0EsCglUNERfQUlOVEVOX0EKfTsKCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzIGJhbmtfYl9hZGRycyA9IHsKCVQ0RF9TVEFSVF9CLAoJVDREX1NUT1BfQiwKCVQ0RF9BSU5UX0IsCglUNERfQUlOVEVOX0IKfTsKCnN0cnVjdCB0cmlkZW50X3BjbV9iYW5rIHsKCS8qIHJlZ2lzdGVyIGFkZHJlc3NlcyB0byBjb250cm9sIGJhbmsgb3BlcmF0aW9ucyAqLwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmtfYWRkcmVzcyAqYWRkcmVzc2VzOwoJLyogZWFjaCBiYW5rIGhhcyAzMiBjaGFubmVscyAqLwoJdTMyIGJpdG1hcDsJCS8qIGNoYW5uZWwgYWxsb2NhdGlvbiBiaXRtYXAgKi8KCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgY2hhbm5lbHNbMzJdOwp9OwoKc3RydWN0IHRyaWRlbnRfY2FyZCB7Cgl1bnNpZ25lZCBpbnQgbWFnaWM7CgoJLyogV2Uga2VlcCB0cmlkZW50IGNhcmRzIGluIGEgbGlua2VkIGxpc3QgKi8KCXN0cnVjdCB0cmlkZW50X2NhcmQgKm5leHQ7CgoJLyogc2luZ2xlIG9wZW4gbG9jayBtZWNoYW5pc20sIG9ubHkgdXNlZCBmb3IgcmVjb3JkaW5nICovCglzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsKCgkvKiBUaGUgdHJpZGVudCBoYXMgYSBjZXJ0YWluIGFtb3VudCBvZiBjcm9zcyBjaGFubmVsIGludGVyYWN0aW9uCgkgICBzbyB3ZSB1c2UgYSBzaW5nbGUgcGVyIGNhcmQgbG9jayAqLwoJc3BpbmxvY2tfdCBsb2NrOwoKCS8qIFBDSSBkZXZpY2Ugc3R1ZmYgKi8KCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwoJdTE2IHBjaV9pZDsKCXU4IHJldmlzaW9uOwoKCS8qIHNvdW5kY29yZSBzdHVmZiAqLwoJaW50IGRldl9hdWRpbzsKCgkvKiBzdHJ1Y3R1cmVzIGZvciBhYnN0cmFjdGlvbiBvZiBoYXJkd2FyZSBmYWNpbGl0aWVzLCBjb2RlY3MsICovIAoJLyogYmFua3MgYW5kIGNoYW5uZWxzICovCglzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rIGJhbmtzW05SX0JBTktTXTsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZXNbTlJfSFdfQ0hdOwoKCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLwoJdW5zaWduZWQgbG9uZyBpb2Jhc2U7Cgl1MzIgaXJxOwoKCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKigqYWxsb2NfcGNtX2NoYW5uZWwpIChzdHJ1Y3QgdHJpZGVudF9jYXJkICopOwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqKCphbGxvY19yZWNfcGNtX2NoYW5uZWwpIChzdHJ1Y3QgdHJpZGVudF9jYXJkICopOwoJdm9pZCAoKmZyZWVfcGNtX2NoYW5uZWwpIChzdHJ1Y3QgdHJpZGVudF9jYXJkICosIHVuc2lnbmVkIGludCBjaGFuKTsKCXZvaWQgKCphZGRyZXNzX2ludGVycnVwdCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7CgoJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxIGZvciBzcGRpZiBpbiAqLwoJaW50IG11bHRpX2NoYW5uZWxfdXNlX2NvdW50OwoJaW50IHJlY19jaGFubmVsX3VzZV9jb3VudDsKCXUxNiBtaXhlcl9yZWdzWzY0XVtOUl9BQzk3XTsJLyogTWFkZSBjYXJkIGxvY2FsIGJ5IEFsYW4gKi8KCWludCBtaXhlcl9yZWdzX3JlYWR5OwoKCS8qIEFkZGVkIGZvciBoYXJkd2FyZSB2b2x1bWUgY29udHJvbCAqLwoJaW50IGh3dm9sY3RsOwoJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CgoJLyogR2FtZSBwb3J0IHN1cHBvcnQgKi8KCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7Cn07CgplbnVtIGRtYWJ1Zl9tb2RlIHsKCURNX1BMQVlCQUNLID0gMCwKCURNX1JFQ09SRAp9OwoKLyogdGFibGUgdG8gbWFwIGZyb20gQ0hBTk5FTE1BU0sgdG8gY2hhbm5lbCBhdHRyaWJ1dGUgZm9yIFNpUyA3MDE4ICovCnN0YXRpYyB1MTYgbWFzazJhdHRyW10gPSB7CglQQ01fTFIsIFBDTV9MUiwgU1VSUl9MUiwgQ0VOVEVSX0xGRSwKCUhTRVQsIE1JQywgTU9ERU1fTElORTEsIE1PREVNX0xJTkUyLAoJSTJTX0xSLCBTUERJRl9MUgp9OwoKLyogdGFibGUgdG8gbWFwIGZyb20gY2hhbm5lbCBhdHRyaWJ1dGUgdG8gQ0hBTk5FTE1BU0sgZm9yIFNpUyA3MDE4ICovCnN0YXRpYyBpbnQgYXR0cjJtYXNrW10gPSB7CglEU1BfQklORF9NT0RFTTEsIERTUF9CSU5EX01PREVNMiwgRFNQX0JJTkRfRlJPTlQsIERTUF9CSU5EX0hBTkRTRVQsCglEU1BfQklORF9JMlMsIERTUF9CSU5EX0NFTlRFUl9MRkUsIERTUF9CSU5EX1NVUlIsIERTUF9CSU5EX1NQRElGCn07CgovKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCnN0YXRpYyBpbnQgYWxpX2Nsb3NlX211bHRpX2NoYW5uZWxzKHZvaWQpOwpzdGF0aWMgdm9pZCBhbGlfZGVsYXkoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGludGVydmFsKTsKc3RhdGljIHZvaWQgYWxpX2RldGVjdF9zcGRpZl9yYXRlKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwoKc3RhdGljIHZvaWQgYWxpX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOwpzdGF0aWMgdTE2IGFsaV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpOwoKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NhcmQgKmRldnM7CgpzdGF0aWMgdm9pZCB0cmlkZW50X2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKTsKc3RhdGljIHUxNiB0cmlkZW50X2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKCnN0YXRpYyBpbnQgdHJpZGVudF9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CnN0YXRpYyBpbnQgdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAoJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwoKc3RhdGljIHZvaWQgYWxpX2FjOTdfc2V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBzZWNvbmRhcnksIHU4IHJlZywgdTE2IHZhbCk7CnN0YXRpYyB1MTYgYWxpX2FjOTdfZ2V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBzZWNvbmRhcnksIHU4IHJlZyk7CnN0YXRpYyB2b2lkIGFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHJhdGUpOwpzdGF0aWMgdm9pZCBhbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdCk7CnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICphbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqYWxpX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CnN0YXRpYyBpbnQgYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpOwpzdGF0aWMgdW5zaWduZWQgaW50IGFsaV9nZXRfc3BkaWZfaW5fcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKc3RhdGljIHZvaWQgYWxpX3NldHVwX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKc3RhdGljIHZvaWQgYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaCk7CnN0YXRpYyB2b2lkIGFsaV9zZXR1cF9zcGRpZl9vdXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGZsYWcpOwpzdGF0aWMgaW50IGFsaV93cml0ZV81XzEoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLAoJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgCgkJCSBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsIAoJCQkgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpOwpzdGF0aWMgaW50IGFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgCgkJCQkJICAgICAgIGludCBjaGFuX251bXMpOwpzdGF0aWMgdm9pZCBhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSk7CgojZGVmaW5lIHNlZWtfb2Zmc2V0KGRtYV9wdHIsIGJ1ZmZlciwgY250LCBvZmZzZXQsIGNvcHlfY291bnQpCWRvIHsgXAogICAgICAgIChkbWFfcHRyKSArPSAob2Zmc2V0KTsJICBcCgkoYnVmZmVyKSArPSAob2Zmc2V0KTsJICBcCiAgICAgICAgKGNudCkgLT0gKG9mZnNldCk7CSAgXAoJKGNvcHlfY291bnQpICs9IChvZmZzZXQpOyBcCn0gd2hpbGUgKDApCgpzdGF0aWMgaW5saW5lIGludCBsb2NrX3NldF9mbXQoc3RydWN0IHRyaWRlbnRfc3RhdGUqIHN0YXRlKQp7CglpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmc3RhdGUtPmZtdF9mbGFnKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19zZXRfZm10KHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKewoJY2xlYXJfYml0KDAsICZzdGF0ZS0+Zm10X2ZsYWcpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfZW5hYmxlX2xvb3BfaW50ZXJydXB0cyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MzIgZ2xvYmFsX2NvbnRyb2w7CgoJZ2xvYmFsX2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCglzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgewoJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CgkJZ2xvYmFsX2NvbnRyb2wgfD0gKEVORExQX0lFIHwgTUlETFBfSUUgfCBCQU5LX0JfRU4pOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxOgoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCWdsb2JhbF9jb250cm9sIHw9IChFTkRMUF9JRSB8IE1JRExQX0lFKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9CgoJb3V0bChnbG9iYWxfY29udHJvbCwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCglwcl9kZWJ1ZygidHJpZGVudDogRW5hYmxlIExvb3AgSW50ZXJydXB0cywgZ2xvYmN0bCA9IDB4JTA4WFxuIiwKCQkgaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSkpOwoKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfZGlzYWJsZV9sb29wX2ludGVycnVwdHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdTMyIGdsb2JhbF9jb250cm9sOwoKCWdsb2JhbF9jb250cm9sID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CglnbG9iYWxfY29udHJvbCAmPSB+KEVORExQX0lFIHwgTUlETFBfSUUpOwoJb3V0bChnbG9iYWxfY29udHJvbCwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCglwcl9kZWJ1ZygidHJpZGVudDogRGlzYWJsZWQgTG9vcCBJbnRlcnJ1cHRzLCBnbG9iY3RsID0gMHglMDhYXG4iLAoJCSBnbG9iYWxfY29udHJvbCk7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkCnRyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIHJlZywgYWRkciA9IGJhbmstPmFkZHJlc3Nlcy0+YWludF9lbjsKCglyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoJcmVnIHw9IG1hc2s7CglvdXRsKHJlZywgVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoKI2lmZGVmIERFQlVHCglyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoJcHJfZGVidWcoInRyaWRlbnQ6IGVuYWJsZWQgSVJRIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAoJCSBjaGFubmVsLCBhZGRyID09IFQ0RF9BSU5URU5fQiA/ICJBSU5URU5fQiIgOiAiQUlOVEVOX0EiLAoJCSByZWcsIGFkZHIpOwojZW5kaWYgLyogREVCVUcgKi8KfQoKc3RhdGljIHZvaWQKdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIHJlZywgYWRkciA9IGJhbmstPmFkZHJlc3Nlcy0+YWludF9lbjsKCglyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoJcmVnICY9IH5tYXNrOwoJb3V0bChyZWcsIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCgkvKiBBY2sgdGhlIGNoYW5uZWwgaW4gY2FzZSB0aGUgaW50ZXJydXB0IHdhcyBzZXQgYmVmb3JlIHdlIGRpc2FibGUgaXQuICovCglvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGJhbmstPmFkZHJlc3Nlcy0+YWludCkpOwoKI2lmZGVmIERFQlVHCglyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoJcHJfZGVidWcoInRyaWRlbnQ6IGRpc2FibGVkIElSUSBvbiBjaGFubmVsICVkLCAlcyA9IDB4JTA4eChhZGRyOiVYKVxuIiwKCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfQUlOVEVOX0IgPyAiQUlOVEVOX0IiIDogIkFJTlRFTl9BIiwKCQkgcmVnLCBhZGRyKTsKI2VuZGlmIC8qIERFQlVHICovCn0KCnN0YXRpYyB2b2lkCnRyaWRlbnRfc3RhcnRfdm9pY2Uoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbCA+PiA1XTsKCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5zdGFydDsKCiNpZmRlZiBERUJVRwoJdTMyIHJlZzsKI2VuZGlmIC8qIERFQlVHICovCgoJb3V0bChtYXNrLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogc3RhcnQgdm9pY2Ugb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCgkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX1NUQVJUX0IgPyAiU1RBUlRfQiIgOiAiU1RBUlRfQSIsCgkJIHJlZywgYWRkcik7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgdm9pZAp0cmlkZW50X3N0b3Bfdm9pY2Uoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbCA+PiA1XTsKCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5zdG9wOwoKI2lmZGVmIERFQlVHCgl1MzIgcmVnOwojZW5kaWYgLyogREVCVUcgKi8KCglvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCiNpZmRlZiBERUJVRwoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCXByX2RlYnVnKCJ0cmlkZW50OiBzdG9wIHZvaWNlIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAoJCSBjaGFubmVsLCBhZGRyID09IFQ0RF9TVE9QX0IgPyAiU1RPUF9CIiA6ICJTVE9QX0EiLAoJCSByZWcsIGFkZHIpOwojZW5kaWYgLyogREVCVUcgKi8KfQoKc3RhdGljIHUzMgp0cmlkZW50X2dldF9pbnRlcnJ1cHRfbWFzayhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbF07Cgl1MzIgYWRkciA9IGJhbmstPmFkZHJlc3Nlcy0+YWludDsKCXJldHVybiBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfY2hlY2tfY2hhbm5lbF9pbnRlcnJ1cHQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwoJdTMyIHJlZyA9IHRyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKGNhcmQsIGNoYW5uZWwgPj4gNSk7CgojaWZkZWYgREVCVUcKCWlmIChyZWcgJiBtYXNrKQoJCXByX2RlYnVnKCJ0cmlkZW50OiBjaGFubmVsICVkIGhhcyBpbnRlcnJ1cHQsICVzID0gMHglMDh4XG4iLAoJCQkgY2hhbm5lbCwgcmVnID09IFQ0RF9BSU5UX0IgPyAiQUlOVF9CIiA6ICJBSU5UX0EiLAoJCQkgcmVnKTsKI2VuZGlmIC8qIERFQlVHICovCglyZXR1cm4gKHJlZyAmIG1hc2spID8gMSA6IDA7Cn0KCnN0YXRpYyB2b2lkCnRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWwgPj4gNV07Cgl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50OwoKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CglyZWcgJj0gbWFzazsKCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9CKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogQWNrIGNoYW5uZWwgJWQgaW50ZXJydXB0LCBBSU5UX0IgPSAweCUwOHhcbiIsCgkJIGNoYW5uZWwsIHJlZyk7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCnRyaWRlbnRfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19CXTsKCglmb3IgKGlkeCA9IDMxOyBpZHggPj0gMDsgaWR4LS0pIHsKCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CgkJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQkJY2hhbm5lbC0+bnVtID0gaWR4ICsgMzI7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCgkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhaWxhYmxlICovCglwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQi5cbiIpOwoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCnRyaWRlbnRfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJaW50IGJhbms7Cgl1bnNpZ25lZCBjaGFyIGI7CgoJaWYgKGNoYW5uZWwgPCAzMSB8fCBjaGFubmVsID4gNjMpCgkJcmV0dXJuOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWCB8fCAKCSAgICBjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWCkgewoJCWIgPSBpbmIoVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOwoJCWlmICgoYiAmIH4weDgwKSA9PSBjaGFubmVsKQoJCQlvdXRiKDB4MCwgVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOwoJfQoKCWJhbmsgPSBjaGFubmVsID4+IDU7CgljaGFubmVsID0gY2hhbm5lbCAmIDB4MWY7CgoJY2FyZC0+YmFua3NbYmFua10uYml0bWFwICY9IH4oMSA8PCAoY2hhbm5lbCkpOwp9CgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCmN5YmVyX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rOwoJaW50IGlkeDsKCgkvKiBUaGUgY3liZXJwcm8gNTA1MCBoYXMgb25seSAzMiB2b2ljZXMgYW5kIG9uZSBiYW5rICovCgkvKiAuLiBhdCBsZWFzdCB0aGV5IGFyZSBub3QgZG9jdW1lbnRlZCAoaWYgeW91IHdhbnQgdG8gY2FsbCB0aGF0IAoJICogY3JhcCBkb2N1bWVudGF0aW9uKSwgcGVyaGFwcyBicm9rZW4gPyAqLwoKCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKCglmb3IgKGlkeCA9IDMxOyBpZHggPj0gMDsgaWR4LS0pIHsKCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CgkJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQkJY2hhbm5lbC0+bnVtID0gaWR4OwoJCQlyZXR1cm4gY2hhbm5lbDsKCQl9Cgl9CgoJLyogbm8gbW9yZSBmcmVlIGNoYW5uZWxzIGF2YWlsYWJsZSAqLwoJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOwoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCmN5YmVyX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCWlmIChjaGFubmVsID4gMzEpCgkJcmV0dXJuOwoJY2FyZC0+YmFua3NbQkFOS19BXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZApjeWJlcl9vdXRpZHgoaW50IHBvcnQsIGludCBpZHgsIGludCBkYXRhKQp7CglvdXRiKGlkeCwgcG9ydCk7CglvdXRiKGRhdGEsIHBvcnQgKyAxKTsKfQoKc3RhdGljIGlubGluZSBpbnQKY3liZXJfaW5pZHgoaW50IHBvcnQsIGludCBpZHgpCnsKCW91dGIoaWR4LCBwb3J0KTsKCXJldHVybiBpbmIocG9ydCArIDEpOwp9CgpzdGF0aWMgaW50CmN5YmVyX2luaXRfcml0dWFsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCS8qIHNvbWUgYmxhY2sgbWFnaWMsIHRha2VuIGZyb20gU0RLIHNhbXBsZXMgKi8KCS8qIHJlbW92ZSB0aGlzIGFuZCBub3RoaW5nIHdpbGwgd29yayAqLwoJaW50IHBvcnREYXQ7CglpbnQgcmV0ID0gMDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJLyoKCSAqICAgICAgS2VlcCBpbnRlcnJ1cHRzIG9mZiBmb3IgdGhlIGNvbmZpZ3VyZSAtIHdlIGRvbid0IHdhbnQgdG8KCSAqICAgICAgY2xhc2ggd2l0aCBhbm90aGVyIGN5YmVycHJvIGNvbmZpZyBldmVudAoJICovCgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCXBvcnREYXQgPSBjeWJlcl9pbmlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFKTsKCS8qIGVuYWJsZSwgaWYgaXQgd2FzIGRpc2FibGVkICovCglpZiAoKHBvcnREYXQgJiBDWUJFUl9CTVNLX0FVRU5aKSAhPSBDWUJFUl9CTVNLX0FVRU5aX0VOQUJMRSkgewoJCXByaW50ayhLRVJOX0lORk8gImN5YmVycHJvNTA1MDogZW5hYmxpbmcgYXVkaW8gY29udHJvbGxlclxuIik7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUsIAoJCQkgICAgIHBvcnREYXQgfCBDWUJFUl9CTVNLX0FVRU5aX0VOQUJMRSk7CgkJLyogY2hlY2sgYWdhaW4gaWYgaGFyZHdhcmUgaXMgZW5hYmxlZCBub3cgKi8KCQlwb3J0RGF0ID0gY3liZXJfaW5pZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSk7Cgl9CglpZiAoKHBvcnREYXQgJiBDWUJFUl9CTVNLX0FVRU5aKSAhPSBDWUJFUl9CTVNLX0FVRU5aX0VOQUJMRSkgewoJCXByaW50ayhLRVJOX0VSUiAiY3liZXJwcm81MDUwOiBpbml0QXVkaW9BY2Nlc3M6IG5vIHN1Y2Nlc3NcbiIpOwoJCXJldCA9IC0xOwoJfSBlbHNlIHsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0lSUV9FTkFCTEUsIAoJCQkgICAgIENZQkVSX0JNU0tfQVVESU9fSU5UX0VOQUJMRSk7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmYsIDB4MDEpOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJhLCAweDIwKTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiYiwgMHgwOCk7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmYsIDB4MDIpOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGIzLCAweDA2KTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMCk7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglyZXR1cm4gcmV0Owp9CgovKiAgY2FsbGVkIHdpdGggc3BpbiBsb2NrIGhlbGQgKi8KCnN0YXRpYyBpbnQKdHJpZGVudF9sb2FkX2NoYW5uZWxfcmVnaXN0ZXJzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHUzMiAqIGRhdGEsIAoJCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCWludCBpOwoKCWlmIChjaGFubmVsID4gNjMpCgkJcmV0dXJuIDA7CgoJLyogc2VsZWN0IGhhcmR3YXJlIGNoYW5uZWwgdG8gd3JpdGUgKi8KCW91dGIoY2hhbm5lbCwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCgkvKiBPdXRwdXQgdGhlIGNoYW5uZWwgcmVnaXN0ZXJzLCBidXQgZG9uJ3Qgd3JpdGUgcmVnaXN0ZXIKCSAgIHRocmVlIHRvIGFuIEFMSSBjaGlwLiAqLwoJZm9yIChpID0gMDsgaSA8IENIQU5ORUxfUkVHUzsgaSsrKSB7CgkJaWYgKGkgPT0gMyAmJiBjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKCQkJY29udGludWU7CgkJb3V0bChkYXRhW2ldLCBUUklEX1JFRyhjYXJkLCBDSEFOTkVMX1NUQVJUICsgNCAqIGkpKTsKCX0KCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fCAKCSAgICBjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewoJCW91dGwoQUxJX0VNT0RfU3RpbGwsIFRSSURfUkVHKGNhcmQsIEFMSV9FQlVGMSkpOwoJCW91dGwoQUxJX0VNT0RfU3RpbGwsIFRSSURfUkVHKGNhcmQsIEFMSV9FQlVGMikpOwoJfQoJcmV0dXJuIDE7Cn0KCi8qIGNhbGxlZCB3aXRoIHNwaW4gbG9jayBoZWxkICovCnN0YXRpYyBpbnQKdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJdW5zaWduZWQgaW50IGRhdGFbQ0hBTk5FTF9SRUdTICsgMV07CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsOwoKCWNoYW5uZWwgPSBzdGF0ZS0+ZG1hYnVmLmNoYW5uZWw7CgoJZGF0YVsxXSA9IGNoYW5uZWwtPmxiYTsKCWRhdGFbNF0gPSBjaGFubmVsLT5jb250cm9sOwoKCXN3aXRjaCAoc3RhdGUtPmNhcmQtPnBjaV9pZCkgewoJY2FzZSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxOgoJCWRhdGFbMF0gPSAwOwkvKiBDdXJyZW50IFNhbXBsZSBPZmZzZXQgKi8KCQlkYXRhWzJdID0gKGNoYW5uZWwtPmVzbyA8PCAxNikgfCAoY2hhbm5lbC0+ZGVsdGEgJiAweGZmZmYpOwoJCWRhdGFbM10gPSAwOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJZGF0YVswXSA9IDA7CS8qIEN1cnJlbnQgU2FtcGxlIE9mZnNldCAqLwoJCWRhdGFbMl0gPSAoY2hhbm5lbC0+ZXNvIDw8IDE2KSB8IChjaGFubmVsLT5kZWx0YSAmIDB4ZmZmZik7CgkJZGF0YVszXSA9IChjaGFubmVsLT5hdHRyaWJ1dGUgPDwgMTYpIHwgKGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZik7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgkJZGF0YVswXSA9IDA7CS8qIEN1cnJlbnQgU2FtcGxlIE9mZnNldCAqLwoJCWRhdGFbMl0gPSAoY2hhbm5lbC0+ZXNvIDw8IDE2KSB8IChjaGFubmVsLT5kZWx0YSAmIDB4ZmZmZik7CgkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKCQlkYXRhWzBdID0gKGNoYW5uZWwtPmRlbHRhIDw8IDI0KTsKCQlkYXRhWzJdID0gKChjaGFubmVsLT5kZWx0YSA8PCAxNikgJiAweGZmMDAwMDAwKSB8IAoJCQkoY2hhbm5lbC0+ZXNvICYgMHgwMGZmZmZmZik7CgkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9CgoJcmV0dXJuIHRyaWRlbnRfbG9hZF9jaGFubmVsX3JlZ2lzdGVycyhzdGF0ZS0+Y2FyZCwgZGF0YSwgY2hhbm5lbC0+bnVtKTsKfQoKc3RhdGljIGludApjb21wdXRlX3JhdGVfcGxheSh1MzIgcmF0ZSkKewoJaW50IGRlbHRhOwoJLyogV2Ugc3BlY2lhbCBjYXNlIDQ0MTAwIGFuZCA4MDAwIHNpbmNlIHJvdW5kaW5nIHdpdGggdGhlIGVxdWF0aW9uCgkgICBkb2VzIG5vdCBnaXZlIHVzIGFuIGFjY3VyYXRlIGVub3VnaCB2YWx1ZS4gRm9yIDExMDI1IGFuZCAyMjA1MAoJICAgdGhlIGVxdWF0aW9uIGdpdmVzIHVzIHRoZSBiZXN0IGFuc3dlci4gQWxsIG90aGVyIGZyZXF1ZW5jaWVzIHdpbGwKCSAgIGFsc28gdXNlIHRoZSBlcXVhdGlvbi4gSkRXICovCglpZiAocmF0ZSA9PSA0NDEwMCkKCQlkZWx0YSA9IDB4ZWIzOwoJZWxzZSBpZiAocmF0ZSA9PSA4MDAwKQoJCWRlbHRhID0gMHgyYWI7CgllbHNlIGlmIChyYXRlID09IDQ4MDAwKQoJCWRlbHRhID0gMHgxMDAwOwoJZWxzZQoJCWRlbHRhID0gKCgocmF0ZSA8PCAxMikgKyByYXRlKSAvIDQ4MDAwKSAmIDB4MDAwMGZmZmY7CglyZXR1cm4gZGVsdGE7Cn0KCnN0YXRpYyBpbnQKY29tcHV0ZV9yYXRlX3JlYyh1MzIgcmF0ZSkKewoJaW50IGRlbHRhOwoKCWlmIChyYXRlID09IDQ0MTAwKQoJCWRlbHRhID0gMHgxMTZhOwoJZWxzZSBpZiAocmF0ZSA9PSA4MDAwKQoJCWRlbHRhID0gMHg2MDAwOwoJZWxzZSBpZiAocmF0ZSA9PSA0ODAwMCkKCQlkZWx0YSA9IDB4MTAwMDsKCWVsc2UKCQlkZWx0YSA9ICgoNDgwMDAgPDwgMTIpIC8gcmF0ZSkgJiAweDAwMDBmZmZmOwoKCXJldHVybiBkZWx0YTsKfQoKLyogc2V0IHBsYXliYWNrIHNhbXBsZSByYXRlICovCnN0YXRpYyB1bnNpZ25lZCBpbnQKdHJpZGVudF9zZXRfZGFjX3JhdGUoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CgoJaWYgKHJhdGUgPiA0ODAwMCkKCQlyYXRlID0gNDgwMDA7CglpZiAocmF0ZSA8IDQwMDApCgkJcmF0ZSA9IDQwMDA7CgoJZG1hYnVmLT5yYXRlID0gcmF0ZTsKCWRtYWJ1Zi0+Y2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcGxheShyYXRlKTsKCgl0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RhdGUpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBjYWxsZWQgdHJpZGVudF9zZXRfZGFjX3JhdGUgOiByYXRlID0gJWRcbiIsIHJhdGUpOwoKCXJldHVybiByYXRlOwp9CgovKiBzZXQgcmVjb3JkaW5nIHNhbXBsZSByYXRlICovCnN0YXRpYyB1bnNpZ25lZCBpbnQKdHJpZGVudF9zZXRfYWRjX3JhdGUoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CgoJaWYgKHJhdGUgPiA0ODAwMCkKCQlyYXRlID0gNDgwMDA7CglpZiAocmF0ZSA8IDQwMDApCgkJcmF0ZSA9IDQwMDA7CgoJZG1hYnVmLT5yYXRlID0gcmF0ZTsKCWRtYWJ1Zi0+Y2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcmVjKHJhdGUpOwoKCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IGNhbGxlZCB0cmlkZW50X3NldF9hZGNfcmF0ZSA6IHJhdGUgPSAlZFxuIiwgcmF0ZSk7CgoJcmV0dXJuIHJhdGU7Cn0KCi8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciBwbGF5YmFjayAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X3BsYXlfc2V0dXAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSBkbWFidWYtPmNoYW5uZWw7CgoJY2hhbm5lbC0+bGJhID0gZG1hYnVmLT5kbWFfaGFuZGxlOwoJY2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcGxheShkbWFidWYtPnJhdGUpOwoKCWNoYW5uZWwtPmVzbyA9IGRtYWJ1Zi0+ZG1hc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJY2hhbm5lbC0+ZXNvIC09IDE7CgoJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CgkJY2hhbm5lbC0+YXR0cmlidXRlID0gMDsKCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWlmICgoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSB8fCAKCQkJICAgIChjaGFubmVsLT5udW0gPT0gQUxJX1BDTV9JTl9DSEFOTkVMKSkKCQkJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdGF0ZS0+Y2FyZCwgY2hhbm5lbC0+bnVtKTsKCQkJZWxzZSBpZiAoKGlubChUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgCgkJCQkgICYgQUxJX1NQRElGX09VVF9DSF9FTkFCTEUpCgkJCQkgJiYgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfT1VUX0NIQU5ORUwpKSB7CgkJCQlhbGlfc2V0X3NwZGlmX291dF9yYXRlKHN0YXRlLT5jYXJkLCAKCQkJCQkJICAgICAgIHN0YXRlLT5kbWFidWYucmF0ZSk7CgkJCQlzdGF0ZS0+ZG1hYnVmLmNoYW5uZWwtPmRlbHRhID0gMHgxMDAwOwoJCQl9CgkJfQoJfQoKCWNoYW5uZWwtPmZtX3ZvbCA9IDB4MDsKCgljaGFubmVsLT5jb250cm9sID0gQ0hBTk5FTF9MT09QOwoJaWYgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpIHsKCQkvKiAxNi1iaXRzICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMXzE2QklUUzsKCQkvKiBzaWduZWQgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU0lHTkVEOwoJfQoJaWYgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfU1RFUkVPKQoJCS8qIHN0ZXJlbyAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TVEVSRU87CgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcGxheV9zZXR1cCwgTEJBID0gMHglMDh4LCBEZWx0YSA9IDB4JTA4eCwgIgoJCSAiRVNPID0gMHglMDh4LCBDb250cm9sID0gMHglMDh4XG4iLCBjaGFubmVsLT5sYmEsCgkJIGNoYW5uZWwtPmRlbHRhLCBjaGFubmVsLT5lc28sIGNoYW5uZWwtPmNvbnRyb2wpOwoKCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7Cn0KCi8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciByZWNvcmRpbmcgKi8Kc3RhdGljIHZvaWQKdHJpZGVudF9yZWNfc2V0dXAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7Cgl1MTYgdzsKCXU4IGJ2YWw7CgoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gZG1hYnVmLT5jaGFubmVsOwoJdW5zaWduZWQgaW50IHJhdGU7CgoJLyogRW5hYmxlIEFDLTk3IEFEQyAoY2FwdHVyZSkgKi8KCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgkJYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RhdGUpOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CgkJLyogZm9yIDcwMTgsIHRoZSBhYzk3IGlzIGFsd2F5cyBpbiBwbGF5YmFjay9yZWNvcmQgKGR1cGxleCkgbW9kZSAqLwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJCXcgPSBpbmIoVFJJRF9SRUcoY2FyZCwgRFhfQUNSMl9BQzk3X0NPTV9TVEFUKSk7CgkJb3V0Yih3IHwgMHg0OCwgVFJJRF9SRUcoY2FyZCwgRFhfQUNSMl9BQzk3X0NPTV9TVEFUKSk7CgkJLyogZW5hYmxlIGFuZCBzZXQgcmVjb3JkIGNoYW5uZWwgKi8KCQlvdXRiKDB4ODAgfCBjaGFubmVsLT5udW0sIFRSSURfUkVHKGNhcmQsIFQ0RF9SRUNfQ0gpKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKCQl3ID0gaW53KFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkJb3V0dyh3IHwgMHgxMDAwLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCS8qIGVuYWJsZSBhbmQgc2V0IHJlY29yZCBjaGFubmVsICovCgkJb3V0YigweDgwIHwgY2hhbm5lbC0+bnVtLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJLyogZG9uJ3Qga25vdyB5ZXQsIHVzaW5nIHNwZWNpYWwgY2hhbm5lbCAyMiBpbiBHQzEoMHhkNCk/ICovCgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybjsKCX0KCgljaGFubmVsLT5sYmEgPSBkbWFidWYtPmRtYV9oYW5kbGU7CgljaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9yZWMoZG1hYnVmLT5yYXRlKTsKCWlmICgoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpICYmIAoJICAgIChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpKSB7CgkJcmF0ZSA9IGFsaV9nZXRfc3BkaWZfaW5fcmF0ZShjYXJkKTsKCQlpZiAocmF0ZSA9PSAwKSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyaWRlbnQ6IEFMaSA1NDUxICIKCQkJICAgICAgICJTL1BESUYgaW5wdXQgc2V0dXAgZXJyb3IhXG4iKTsKCQkJcmF0ZSA9IDQ4MDAwOwoJCX0KCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CgkJaWYgKGJ2YWwgJiAweDEwKSB7CgkJCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogY2xlYXJlZCBBTGkgIgoJCQkgICAgICAgIjU0NTEgUy9QRElGIHBhcml0eSBlcnJvciBmbGFnLlxuIik7CgkJfQoKCQlpZiAocmF0ZSAhPSA0ODAwMCkKCQkJY2hhbm5lbC0+ZGVsdGEgPSAoKHJhdGUgPDwgMTIpIC8gZG1hYnVmLT5yYXRlKSAmIDB4MDAwMGZmZmY7Cgl9CgoJY2hhbm5lbC0+ZXNvID0gZG1hYnVmLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CgljaGFubmVsLT5lc28gLT0gMTsKCglpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOwoJfQoKCWNoYW5uZWwtPmZtX3ZvbCA9IDB4MDsKCgljaGFubmVsLT5jb250cm9sID0gQ0hBTk5FTF9MT09QOwoJaWYgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpIHsKCQkvKiAxNi1iaXRzICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMXzE2QklUUzsKCQkvKiBzaWduZWQgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU0lHTkVEOwoJfQoJaWYgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfU1RFUkVPKQoJCS8qIHN0ZXJlbyAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TVEVSRU87CgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcmVjX3NldHVwLCBMQkEgPSAweCUwOHgsIERlbGF0ID0gMHglMDh4LCAiCgkJICJFU08gPSAweCUwOHgsIENvbnRyb2wgPSAweCUwOHhcbiIsIGNoYW5uZWwtPmxiYSwKCQkgY2hhbm5lbC0+ZGVsdGEsIGNoYW5uZWwtPmVzbywgY2hhbm5lbC0+Y29udHJvbCk7CgoJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKfQoKLyogZ2V0IGN1cnJlbnQgcGxheWJhY2svcmVjb3JkaW5nIGRtYSBidWZmZXIgcG9pbnRlciAoYnl0ZSBvZmZzZXQgZnJvbSBMQkEpLAogICBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkISAqLwpzdGF0aWMgaW5saW5lIHVuc2lnbmVkCnRyaWRlbnRfZ2V0X2RtYV9hZGRyKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1MzIgY3NvOwoKCWlmICghZG1hYnVmLT5lbmFibGUpCgkJcmV0dXJuIDA7CgoJb3V0YihkbWFidWYtPmNoYW5uZWwtPm51bSwgVFJJRF9SRUcoc3RhdGUtPmNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CgoJc3dpdGNoIChzdGF0ZS0+Y2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQkvKiAxNiBiaXRzIEVTTywgQ1NPIGZvciA3MDE4IGFuZCBEWCAqLwoJCWNzbyA9IGludyhUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQ0hfRFhfQ1NPX0FMUEhBX0ZNUyArIDIpKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKCQkvKiAyNCBiaXRzIEVTTywgQ1NPIGZvciBOWCAqLwoJCWNzbyA9IGlubChUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQ0hfTlhfREVMVEFfQ1NPKSkgJiAweDAwZmZmZmZmOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9nZXRfZG1hX2FkZHI6IGNoaXAgcmVwb3J0ZWQgY2hhbm5lbDogJWQsICIKCQkgImNzbyA9IDB4JTA0eFxuIiwgZG1hYnVmLT5jaGFubmVsLT5udW0sIGNzbyk7CgoJLyogRVNPIGFuZCBDU08gYXJlIGluIHVuaXRzIG9mIFNhbXBsZXMsIGNvbnZlcnQgdG8gYnl0ZSBvZmZzZXQgKi8KCWNzbyA8PD0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCglyZXR1cm4gKGNzbyAlIGRtYWJ1Zi0+ZG1hc2l6ZSk7Cn0KCi8qIFN0b3AgcmVjb3JkaW5nIChsb2NrIGhlbGQpICovCnN0YXRpYyBpbmxpbmUgdm9pZApfX3N0b3BfYWRjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBpbnQgY2hhbl9udW0gPSBkbWFidWYtPmNoYW5uZWwtPm51bTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCglkbWFidWYtPmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7Cgl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbl9udW0pOwoJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7Cn0KCnN0YXRpYyB2b2lkCnN0b3BfYWRjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJX19zdG9wX2FkYyhzdGF0ZSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkCnN0YXJ0X2FkYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgaW50IGNoYW5fbnVtID0gZG1hYnVmLT5jaGFubmVsLT5udW07CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IAoJICAgICBkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplKSAmJiAKCSAgICBkbWFidWYtPnJlYWR5KSB7CgkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CgkJdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIGNoYW5fbnVtKTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKLyogc3RvcCBwbGF5YmFjayAobG9jayBoZWxkKSAqLwpzdGF0aWMgaW5saW5lIHZvaWQKX19zdG9wX2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgaW50IGNoYW5fbnVtID0gZG1hYnVmLT5jaGFubmVsLT5udW07CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CgoJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOwoJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGNoYW5fbnVtKTsKCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+CgkJCQkgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+CgkJCQkgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+CgkJCQkgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+CgkJCQkgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCX0KCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOwp9CgpzdGF0aWMgdm9pZApzdG9wX2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCV9fc3RvcF9kYWMoc3RhdGUpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMgdm9pZApzdGFydF9kYWMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJaWYgKChkbWFidWYtPm1hcHBlZCB8fCBkbWFidWYtPmNvdW50ID4gMCkgJiYgZG1hYnVmLT5yZWFkeSkgewoJCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOwoJCXRyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7CgkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBjaGFuX251bSk7CgkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPgoJCQkJCSAgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KCQkJCQkgICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+CgkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPgoJCQkJCSAgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQl9Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCiNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTUtUEFHRV9TSElGVCkKI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQoKLyogYWxsb2MgYSBETUEgYnVmZmVyIG9mIHdpdGggYSBidWZmZXIgb2YgdGhpcyBvcmRlciAqLwpzdGF0aWMgaW50CmFsbG9jX2RtYWJ1ZihzdHJ1Y3QgZG1hYnVmICpkbWFidWYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBpbnQgb3JkZXIpCnsKCXZvaWQgKnJhd2J1ZiA9IE5VTEw7CglzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CgoJaWYgKCEocmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAKCQkJCQkgICAgJmRtYWJ1Zi0+ZG1hX2hhbmRsZSkpKQoJCXJldHVybiAtRU5PTUVNOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBhbGxvY2F0ZWQgJWxkIChvcmRlciA9ICVkKSBieXRlcyBhdCAlcFxuIiwKCQkgUEFHRV9TSVpFIDw8IG9yZGVyLCBvcmRlciwgcmF3YnVmKTsKCglkbWFidWYtPnJlYWR5ID0gZG1hYnVmLT5tYXBwZWQgPSAwOwoJZG1hYnVmLT5yYXdidWYgPSByYXdidWY7CglkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7CgoJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgKi8gCgkvKiByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KCXBlbmQgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKTsKCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CgoJcmV0dXJuIDA7Cn0KCi8qIGFsbG9jYXRlIHRoZSBtYWluIERNQSBidWZmZXIsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgYnVmZmVyIHNob3VsZCBiZSAqLwovKiBhbGxvY2F0ZWQgc2VwYXJhdGVseSAqLwpzdGF0aWMgaW50CmFsbG9jX21haW5fZG1hYnVmKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CglpbnQgb3JkZXI7CglpbnQgcmV0ID0gLUVOT01FTTsKCgkvKiBhbGxvYyBhcyBiaWcgYSBjaHVuayBhcyB3ZSBjYW4sIEZJWE1FOiBpcyB0aGlzIG5lY2Vzc2FyeSA/PyAqLwoJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkgewoJCWlmICghKHJldCA9IGFsbG9jX2RtYWJ1ZihkbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2LCBvcmRlcikpKQoJCQlyZXR1cm4gMDsKCQkvKiBlbHNlIHRyeSBhZ2FpbiAqLwoJfQoJcmV0dXJuIHJldDsKfQoKLyogZGVhbGxvY2F0ZSBhIERNQSBidWZmZXIgKi8Kc3RhdGljIHZvaWQKZGVhbGxvY19kbWFidWYoc3RydWN0IGRtYWJ1ZiAqZG1hYnVmLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKewoJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOwoKCWlmIChkbWFidWYtPnJhd2J1ZikgewoJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KCQlwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOwoJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQoJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyLCAKCQkJCSAgICBkbWFidWYtPnJhd2J1ZiwgZG1hYnVmLT5kbWFfaGFuZGxlKTsKCQlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7Cgl9CglkbWFidWYtPm1hcHBlZCA9IGRtYWJ1Zi0+cmVhZHkgPSAwOwp9CgpzdGF0aWMgaW50CnByb2dfZG1hYnVmKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgZW51bSBkbWFidWZfbW9kZSByZWMpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgYnl0ZXBlcnNlYzsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzID0gc3RhdGU7Cgl1bnNpZ25lZCBidWZzaXplLCBkbWFfbnVtczsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgcmV0LCBpLCBvcmRlcjsKCglpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKCQlyZXR1cm4gcmV0OwoKCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpCgkJZG1hX251bXMgPSA1OwoJZWxzZQoJCWRtYV9udW1zID0gMTsKCglmb3IgKGkgPSAwOyBpIDwgZG1hX251bXM7IGkrKykgewoJCWlmIChpID4gMCkgewoJCQlzID0gc3RhdGUtPm90aGVyX3N0YXRlc1tpIC0gMV07CgkJCWRtYWJ1ZiA9ICZzLT5kbWFidWY7CgkJCWRtYWJ1Zi0+Zm10ID0gc3RhdGUtPmRtYWJ1Zi5mbXQ7CgkJCWRtYWJ1Zi0+cmF0ZSA9IHN0YXRlLT5kbWFidWYucmF0ZTsKCQl9CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJZG1hYnVmLT5od3B0ciA9IGRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IDA7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIGlmIG5vdCBhbGxvY2F0ZWQgeWV0ICovCgkJaWYgKCFkbWFidWYtPnJhd2J1ZikgewoJCQlpZiAoaSA9PSAwKSB7CgkJCQlpZiAoKHJldCA9IGFsbG9jX21haW5fZG1hYnVmKHN0YXRlKSkpIHsKCQkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXJldCA9IC1FTk9NRU07CgkJCQlvcmRlciA9IHN0YXRlLT5kbWFidWYuYnVmb3JkZXIgLSAxOwoJCQkJaWYgKG9yZGVyID49IERNQUJVRl9NSU5PUkRFUikgewoJCQkJCXJldCA9IGFsbG9jX2RtYWJ1ZihkbWFidWYsCgkJCQkJCQkgICBzdGF0ZS0+Y2FyZC0+cGNpX2RldiwKCQkJCQkJCSAgIG9yZGVyKTsKCQkJCX0KCQkJCWlmIChyZXQpIHsKCQkJCQkvKiByZWxlYXNlIHRoZSBtYWluIERNQSBidWZmZXIgKi8KCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPmRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOwoJCQkJCS8qIHJlbGVhc2UgdGhlIGF1eGlsaWFyeSBETUEgYnVmZmVycyAqLwoJCQkJCWZvciAoaSAtPSAyOyBpID49IDA7IGktLSkKCQkJCQkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZiwgCgkJCQkJCQkgICAgICAgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOwoJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoJCQl9CgkJfQoJCS8qIEZJWE1FOiBmaWd1cmUgb3V0IGFsbCB0aGlzIE9TUyBmcmFnbWVudCBzdHVmZiAqLwoJCWJ5dGVwZXJzZWMgPSBkbWFidWYtPnJhdGUgPDwgc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCQlidWZzaXplID0gUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXI7CgkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0KSB7CgkJCWlmICgoMTAwMCA8PCBkbWFidWYtPm9zc2ZyYWdzaGlmdCkgPCBieXRlcGVyc2VjKQoJCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYyAvIDEwMDApOwoJCQllbHNlCgkJCQlkbWFidWYtPmZyYWdzaGlmdCA9IGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0OwoJCX0gZWxzZSB7CgkJCS8qIGxldHMgaGFuZCBvdXQgcmVhc29uYWJsZSBiaWcgYXNzIGJ1ZmZlcnMgYnkgZGVmYXVsdCAqLwoJCQlkbWFidWYtPmZyYWdzaGlmdCA9IChkbWFidWYtPmJ1Zm9yZGVyICsgUEFHRV9TSElGVCAtIDIpOwoJCX0KCQlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCXdoaWxlIChkbWFidWYtPm51bWZyYWcgPCA0ICYmIGRtYWJ1Zi0+ZnJhZ3NoaWZ0ID4gMykgewoJCQlkbWFidWYtPmZyYWdzaGlmdC0tOwoJCQlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCX0KCQlkbWFidWYtPmZyYWdzaXplID0gMSA8PCBkbWFidWYtPmZyYWdzaGlmdDsKCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA+PSA0ICYmIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCBkbWFidWYtPm51bWZyYWcpCgkJCWRtYWJ1Zi0+bnVtZnJhZyA9IGRtYWJ1Zi0+b3NzbWF4ZnJhZ3M7CgkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IGRtYWJ1Zi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CgoJCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAoJCSAgICAgICBkbWFidWYtPmRtYXNpemUpOwoKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWlmIChyZWMgPT0gRE1fUkVDT1JEKQoJCQl0cmlkZW50X3JlY19zZXR1cChzKTsKCQllbHNlIC8qIERNX1BMQVlCQUNLICovCgkJCXRyaWRlbnRfcGxheV9zZXR1cChzKTsKCgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCgkJZG1hYnVmLT5yZWFkeSA9IDE7CgoJCXByX2RlYnVnKCJ0cmlkZW50OiBwcm9nX2RtYWJ1ZiglZCksIHNhbXBsZSByYXRlID0gJWQsICIKCQkJICJmb3JtYXQgPSAlZCwgbnVtZnJhZyA9ICVkLCBmcmFnc2l6ZSA9ICVkICIKCQkJICJkbWFzaXplID0gJWRcbiIsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLAoJCQkgZG1hYnVmLT5yYXRlLCBkbWFidWYtPmZtdCwgZG1hYnVmLT5udW1mcmFnLAoJCQkgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5kbWFzaXplKTsKCX0KCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCXJldHVybiAwOwp9CgoKc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfcmVjb3JkKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKewoJcmV0dXJuIHByb2dfZG1hYnVmKHN0YXRlLCBETV9SRUNPUkQpOwp9CgpzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCnsKCXJldHVybiBwcm9nX2RtYWJ1ZihzdGF0ZSwgRE1fUExBWUJBQ0spOwp9CgovKiB3ZSBhcmUgZG9pbmcgcXVhbnR1bSBtZWNoYW5pY3MgaGVyZSwgdGhlIGJ1ZmZlciBjYW4gb25seSBiZSBlbXB0eSwgaGFsZiBvciBmdWxsIGZpbGxlZCBpLmUuCiAgIHwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfCAgIG9yICAgfHh4eHh4eHh4eHh4eHwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fHh4eHh4eHh4eHh4eHwKICAgYnV0IHdlIGFsbW9zdCBhbHdheXMgZ2V0IHRoaXMKICAgfHh4eHh4eC0tLS0tLXwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fHh4eHh4LS0tLS0tLXwKICAgc28gd2UgaGF2ZSB0byBjbGVhciB0aGUgdGFpbCBzcGFjZSB0byAic2lsZW5jZSIKICAgfHh4eHh4eDAwMDAwMHwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fHh4eHh4eDAwMDAwMHwKKi8Kc3RhdGljIHZvaWQKdHJpZGVudF9jbGVhcl90YWlsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBzd3B0cjsKCXVuc2lnbmVkIGNoYXIgc2lsZW5jZSA9IChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IDAgOiAweDgwOwoJdW5zaWduZWQgaW50IGxlbjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Cglzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCWlmIChzd3B0ciA9PSAwIHx8IHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIgfHwgCgkgICAgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplKQoJCXJldHVybjsKCglpZiAoc3dwdHIgPCBkbWFidWYtPmRtYXNpemUgLyAyKQoJCWxlbiA9IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIgLSBzd3B0cjsKCWVsc2UKCQlsZW4gPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKCgltZW1zZXQoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgc2lsZW5jZSwgbGVuKTsKCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlkbWFidWYtPnN3cHRyICs9IGxlbjsKCQlkbWFidWYtPmNvdW50ICs9IGxlbjsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJfQoKCS8qIHJlc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGluIGNhc2UgaXQgaXMgaGFsdGVkICovCglzdGFydF9kYWMoc3RhdGUpOwp9CgpzdGF0aWMgaW50CmRyYWluX2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGludCBub25ibG9jaykKewoJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBsb25nIHRtbzsKCWludCBjb3VudDsKCXVuc2lnbmVkIGxvbmcgZGlmZiA9IDA7CgoJaWYgKGRtYWJ1Zi0+bWFwcGVkIHx8ICFkbWFidWYtPnJlYWR5KQoJCXJldHVybiAwOwoKCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKCWZvciAoOzspIHsKCQkvKiBJdCBzZWVtcyB0aGF0IHdlIGhhdmUgdG8gc2V0IHRoZSBjdXJyZW50IHN0YXRlIHRvIFRBU0tfSU5URVJSVVBUSUJMRQoJCSAgIGV2ZXJ5IHRpbWUgdG8gbWFrZSB0aGUgcHJvY2VzcyByZWFsbHkgZ28gdG8gc2xlZXAgKi8KCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwoKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQljb3VudCA9IGRtYWJ1Zi0+Y291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJaWYgKGNvdW50IDw9IDApCgkJCWJyZWFrOwoKCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCWJyZWFrOwoKCQlpZiAobm9uYmxvY2spIHsKCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwoJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCgkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIGRhdGEgaXMgbGVmdCBpbiB0aGUgYnVmZmVyLCB3ZSBoYXZlIHRvIHdhaXQgdW50aWwKCQkgICBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8IAoJCSAgICBzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKCQkJZGlmZiA9IGRtYWJ1Zi0+c3dwdHIgLSB0cmlkZW50X2dldF9kbWFfYWRkcihzdGF0ZSkgKyBkbWFidWYtPmRtYXNpemU7CgkJCWRpZmYgPSBkaWZmICUgKGRtYWJ1Zi0+ZG1hc2l6ZSk7CgkJCXRtbyA9IChkaWZmICogSFopIC8gZG1hYnVmLT5yYXRlOwoJCX0gZWxzZSB7CgkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyBkbWFidWYtPnJhdGU7CgkJfQoJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gdG1vIDogMSkgJiYgdG1vKSB7CgkJCWJyZWFrOwoJCX0KCX0KCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CglpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKCglyZXR1cm4gMDsKfQoKLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgKi8gCi8qIGRtYWJ1Zi0+Y291bnQgYW5kIGRtYWJ1Zi0+aHdwdHIgKi8Kc3RhdGljIHZvaWQKdHJpZGVudF91cGRhdGVfcHRyKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBod3B0ciwgc3dwdHI7CglpbnQgY2xlYXJfY250ID0gMDsKCWludCBkaWZmOwoJdW5zaWduZWQgY2hhciBzaWxlbmNlOwoJdW5zaWduZWQgaGFsZl9kbWFzaXplOwoKCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCglod3B0ciA9IHRyaWRlbnRfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKCgkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBBREMgKi8KCWlmIChkbWFidWYtPmVuYWJsZSA9PSBBRENfUlVOTklORykgewoJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQlkbWFidWYtPmNvdW50IC09IGRpZmY7CgkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwoJCX0gZWxzZSB7CgkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKCgkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCAKCQkJICAgIGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgKi8gCgkJCQkvKiB3ZSBoYXZlIG5vIHdheSB0byByZWNvdmVyIGl0IGhlcmUsIGp1c3QgKi8gCgkJCQkvKiBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgKi8gCgkJCQkvKiBmb3JjZSBod3B0ciBhbmQgc3dwdHIgdG8gc3luYyAqLwoJCQkJX19zdG9wX2FkYyhzdGF0ZSk7CgkJCQlkbWFidWYtPmVycm9yKys7CgkJCX0KCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgLyAyKQoJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKCQl9Cgl9CgoJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgREFDICovCglpZiAoZG1hYnVmLT5lbmFibGUgPT0gREFDX1JVTk5JTkcpIHsKCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwoJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQoJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKCQl9IGVsc2UgewoJCQlkbWFidWYtPmNvdW50IC09IGRpZmY7CgoJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCgkJCSAgICBkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7CgkJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sIHdlIGhhdmUgbm8gd2F5IHRvIHJlY292ZXIKCQkJCSAgIGl0IGhlcmUsIGp1c3Qgc3RvcCB0aGUgbWFjaGluZSBhbmQgbGV0IHRoZSBwcm9jZXNzIGZvcmNlIGh3cHRyCgkJCQkgICBhbmQgc3dwdHIgdG8gc3luYyAqLwoJCQkJX19zdG9wX2RhYyhzdGF0ZSk7CgkJCQlkbWFidWYtPmVycm9yKys7CgkJCX0gZWxzZSBpZiAoIWRtYWJ1Zi0+ZW5kY2xlYXJlZCkgewoJCQkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwoJCQkJc2lsZW5jZSA9IChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUID8gMCA6IDB4ODApOwoJCQkJaWYgKGRtYWJ1Zi0+dXBkYXRlX2ZsYWcgJiBBTElfQUREUkVTU19JTlRfVVBEQVRFKSB7CgkJCQkJLyogV2UgbXVzdCBjbGVhciBlbmQgZGF0YSBvZiAxLzIgZG1hYnVmIGlmIG5lZWRlZC4KCQkJCQkgICBBY2NvcmRpbmcgdG8gMS8yIGFsZ29yaXRobSBvZiBBZGRyZXNzIEVuZ2luZSBJbnRlcnJ1cHQsCgkJCQkJICAgY2hlY2sgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRhdGEgb2YgaGFsZiBkbWFzaXplLiAqLwoJCQkJCWhhbGZfZG1hc2l6ZSA9IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDI7CgkJCQkJaWYgKChkaWZmID0gaHdwdHIgLSBoYWxmX2RtYXNpemUpIDwgMCkKCQkJCQkJZGlmZiA9IGh3cHRyOwoJCQkJCWlmICgoZG1hYnVmLT5jb3VudCArIGRpZmYpIDwgaGFsZl9kbWFzaXplKSB7CgkJCQkJCS8vdGhlcmUgaXMgaW52YWxpZCBkYXRhIGluIHRoZSBlbmQgb2YgaGFsZiBidWZmZXIKCQkJCQkJaWYgKChjbGVhcl9jbnQgPSBoYWxmX2RtYXNpemUgLSBzd3B0cikgPCAwKQoJCQkJCQkJY2xlYXJfY250ICs9IGhhbGZfZG1hc2l6ZTsKCQkJCQkJLy9jbGVhciB0aGUgaW52YWxpZCBkYXRhCgkJCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CgkJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwoJCQkJCQkJc3dwdHIgPSBzd3B0ciAvIDI7CgkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQl9CgkJCQkJCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDE7CgkJCQkJfQoJCQkJfSBlbHNlIGlmIChkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkgewoJCQkJCWNsZWFyX2NudCA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CgkJCQkJaWYgKChzd3B0ciArIGNsZWFyX2NudCkgPiBkbWFidWYtPmRtYXNpemUpCgkJCQkJCWNsZWFyX2NudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwoJCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKCQkJCQkJY2xlYXJfY250ID0gY2xlYXJfY250IC8gMjsKCQkJCQkJc3dwdHIgPSBzd3B0ciAvIDI7CgkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQl9CgkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKCQkJCX0KCQkJfQoJCQkvKiB0cmlkZW50X3VwZGF0ZV9wdHIgaXMgY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyIG9yIGJ5IHByb2Nlc3MgdmlhCgkJCSAgIGlvY3RsL3BvbGwsIHdlIG9ubHkgd2FrZSB1cCB0aGUgd2FpdGluZyBwcm9jZXNzIHdoZW4gd2UgaGF2ZSBtb3JlCgkJCSAgIHRoYW4gMS8yIGJ1ZmZlciBmcmVlIChhbHdheXMgdHJ1ZSBmb3IgaW50ZXJydXB0IGhhbmRsZXIpICovCgkJCWlmIChkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplIC8gMikKCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CgkJfQoJfQoJZG1hYnVmLT51cGRhdGVfZmxhZyAmPSB+QUxJX0FERFJFU1NfSU5UX1VQREFURTsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9hZGRyZXNzX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglpbnQgaTsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZTsKCXVuc2lnbmVkIGludCBjaGFubmVsOwoKCS8qIFVwZGF0ZSB0aGUgcG9pbnRlcnMgZm9yIGFsbCBjaGFubmVscyB3ZSBhcmUgcnVubmluZy4gKi8KCS8qIEZJWE1FOiBzaG91bGQgcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLwoJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKCQljaGFubmVsID0gNjMgLSBpOwoJCWlmICh0cmlkZW50X2NoZWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpKSB7CgkJCXRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpOwoJCQlpZiAoKHN0YXRlID0gY2FyZC0+c3RhdGVzW2ldKSAhPSBOVUxMKSB7CgkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCQl9IGVsc2UgewoJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogc3B1cmlvdXMgY2hhbm5lbCAiIAoJCQkJICAgICAgICJpcnEgJWQuXG4iLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbm5lbCk7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkCmFsaV9od3ZvbF9jb250cm9sKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCnsKCXUxNiBkd1RlbXAsIHZvbHVtZVsyXSwgbXV0ZSwgZGlmZiwgKnBWb2xbMl07CgoJZHdUZW1wID0gYWxpX2FjOTdfcmVhZChjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyKTsKCW11dGUgPSBkd1RlbXAgJiAweDgwMDA7Cgl2b2x1bWVbMF0gPSBkd1RlbXAgJiAweDAwMWY7Cgl2b2x1bWVbMV0gPSAoZHdUZW1wICYgMHgxZjAwKSA+PiA4OwoJaWYgKHZvbHVtZVswXSA8IHZvbHVtZVsxXSkgewoJCXBWb2xbMF0gPSAmdm9sdW1lWzBdOwoJCXBWb2xbMV0gPSAmdm9sdW1lWzFdOwoJfSBlbHNlIHsKCQlwVm9sWzFdID0gJnZvbHVtZVswXTsKCQlwVm9sWzBdID0gJnZvbHVtZVsxXTsKCX0KCWRpZmYgPSAqKHBWb2xbMV0pIC0gKihwVm9sWzBdKTsKCglpZiAob3B0ID09IDEpIHsJCS8vIE1VVEUKCQlkd1RlbXAgXj0gMHg4MDAwOwoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIAoJCQkgICAgICAgMHgwMiwgZHdUZW1wKTsKCX0gZWxzZSBpZiAob3B0ID09IDIpIHsJLy8gRG93bgoJCWlmIChtdXRlKQoJCQlyZXR1cm47CgkJaWYgKCoocFZvbFsxXSkgPCAweDAwMWYpIHsKCQkJKCpwVm9sWzFdKSsrOwoJCQkqKHBWb2xbMF0pID0gKihwVm9sWzFdKSAtIGRpZmY7CgkJfQoJCWR3VGVtcCAmPSAweGUwZTA7CgkJZHdUZW1wIHw9ICh2b2x1bWVbMF0pIHwgKHZvbHVtZVsxXSA8PCA4KTsKCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOwoJCWNhcmQtPmFjOTdfY29kZWNbMF0tPm1peGVyX3N0YXRlWzBdID0gKCgzMiAtIHZvbHVtZVswXSkgKiAyNSAvIDgpIHwgCgkJCSgoKDMyIC0gdm9sdW1lWzFdKSAqIDI1IC8gOCkgPDwgOCk7Cgl9IGVsc2UgaWYgKG9wdCA9PSA0KSB7CS8vIFVwCgkJaWYgKG11dGUpCgkJCXJldHVybjsKCQlpZiAoKihwVm9sWzBdKSA+IDApIHsKCQkJKCpwVm9sWzBdKS0tOwoJCQkqKHBWb2xbMV0pID0gKihwVm9sWzBdKSArIGRpZmY7CgkJfQoJCWR3VGVtcCAmPSAweGUwZTA7CgkJZHdUZW1wIHw9ICh2b2x1bWVbMF0pIHwgKHZvbHVtZVsxXSA8PCA4KTsKCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOwoJCWNhcmQtPmFjOTdfY29kZWNbMF0tPm1peGVyX3N0YXRlWzBdID0gKCgzMiAtIHZvbHVtZVswXSkgKiAyNSAvIDgpIHwgCgkJCSgoKDMyIC0gdm9sdW1lWzFdKSAqIDI1IC8gOCkgPDwgOCk7Cgl9IGVsc2UgewoJCS8qIE5vdGhpbmcgbmVlZHMgZG9pbmcgKi8KCX0KfQoKLyoKICoJUmUtZW5hYmxlIHJlcG9ydGluZyBvZiB2b2wgY2hhbmdlIGFmdGVyIDAuMSBzZWNvbmRzCiAqLwoKc3RhdGljIHZvaWQKYWxpX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwdHIpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBwdHI7Cgl1MTYgdGVtcCA9IDA7CgoJLyogRW5hYmxlIEdQSU8gSVJRIChNSVNDSU5UIGJpdCAxOGgpICovCgl0ZW1wID0gaW53KFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOwoJdGVtcCB8PSAweDAwMDQ7CglvdXR3KHRlbXAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOwp9CgovKgogKglTZXQgdXAgdGhlIHRpbWVyIHRvIGNsZWFyIHRoZSB2b2wgY2hhbmdlIG5vdGlmaWNhdGlvbgogKi8KCnN0YXRpYyB2b2lkCmFsaV9zZXRfdGltZXIoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJLyogQWRkIFRpbWVyIFJvdXRpbmUgdG8gRW5hYmxlIEdQSU8gSVJRICovCglkZWxfdGltZXIoJmNhcmQtPnRpbWVyKTsJLyogTmV2ZXIgcXVldWUgdHdpY2UgKi8KCWNhcmQtPnRpbWVyLmZ1bmN0aW9uID0gYWxpX3RpbWVvdXQ7CgljYXJkLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQ7CgljYXJkLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMTA7CglhZGRfdGltZXIoJmNhcmQtPnRpbWVyKTsKfQoKLyoKICoJUHJvY2VzcyBhIEdQSU8gZXZlbnQKICovCgpzdGF0aWMgdm9pZAphbGlfcXVldWVfdGFzayhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgb3B0KQp7Cgl1MTYgdGVtcDsKCgkvKiBEaXNhYmxlIEdQSU8gSVJRIChNSVNDSU5UIGJpdCAxOGgpICovCgl0ZW1wID0gaW53KFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOwoJdGVtcCAmPSAodTE2KSAofjB4MDAwNCk7CglvdXR3KHRlbXAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOwoKCS8qIEFkanVzdCB0aGUgdm9sdW1lICovCglhbGlfaHd2b2xfY29udHJvbChjYXJkLCBvcHQpOwoKCS8qIFNldCB0aGUgdGltZXIgZm9yIDEvMTB0aCBzZWMgKi8KCWFsaV9zZXRfdGltZXIoY2FyZCk7Cn0KCnN0YXRpYyB2b2lkCmN5YmVyX2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBpLCBpcnFfc3RhdHVzOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOwoJdW5zaWduZWQgaW50IGNoYW5uZWw7CgoJLyogVXBkYXRlIHRoZSBwb2ludGVycyBmb3IgYWxsIGNoYW5uZWxzIHdlIGFyZSBydW5uaW5nLiAqLwoJLyogRklYRUQ6IHJlYWQgaW50ZXJydXB0IHN0YXR1cyBvbmx5IG9uY2UgKi8KCWlycV9zdGF0dXMgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRfQSkpOwoKCXByX2RlYnVnKCJjeWJlcl9hZGRyZXNzX2ludGVycnVwdDogaXJxX3N0YXR1cyAweCVYXG4iLCBpcnFfc3RhdHVzKTsKCglmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCWNoYW5uZWwgPSAzMSAtIGk7CgkJaWYgKGlycV9zdGF0dXMgJiAoMSA8PCBjaGFubmVsKSkgewoJCQkvKiBjbGVhciBiaXQgYnkgd3JpdGluZyBhIDEsIHplcm9lcyBhcmUgaWdub3JlZCAqLwoJCQlvdXRsKCgxIDw8IGNoYW5uZWwpLCBUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9BKSk7CgoJCQlwcl9kZWJ1ZygiY3liZXJfaW50ZXJydXB0OiBjaGFubmVsICVkXG4iLCBjaGFubmVsKTsKCgkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKCQkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJCX0gZWxzZSB7CgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeWJlcjUwNTA6IHNwdXJpb3VzICIgCgkJCQkgICAgICAgImNoYW5uZWwgaXJxICVkLlxuIiwgY2hhbm5lbCk7CgkJCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbm5lbCk7CgkJCQl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5uZWwpOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgaXJxcmV0dXJuX3QKdHJpZGVudF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgZGV2X2lkOwoJdTMyIGV2ZW50OwoJdTMyIGdwaW87CgoJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfaW50ZXJydXB0IGNhbGxlZCwgTUlTQ0lOVCA9IDB4JTA4eFxuIiwKCQkgZXZlbnQpOwoKCWlmIChldmVudCAmIEFERFJFU1NfSVJRKSB7CgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQoY2FyZCk7Cgl9CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJLyogR1BJTyBJUlEgKEgvVyBWb2x1bWUgQ29udHJvbCkgKi8KCQlldmVudCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCWlmIChldmVudCAmICgxIDw8IDI1KSkgewoJCQlncGlvID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HUElPKSk7CgkJCWlmICghdGltZXJfcGVuZGluZygmY2FyZC0+dGltZXIpKQoJCQkJYWxpX3F1ZXVlX3Rhc2soY2FyZCwgZ3BpbyAmIDB4MDcpOwoJCX0KCQlldmVudCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAoJCSAgICAgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoKCS8qIG1hbnVhbGx5IGNsZWFyIGludGVycnVwdCBzdGF0dXMsIGJhZCBoYXJkd2FyZSBkZXNpZ24sIGJsYW1lIFReMiAqLwoJb3V0bCgoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAoJICAgICBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyAqLyAKLyogdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCi8qIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLwpzdGF0aWMgc3NpemVfdAp0cmlkZW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cglzc2l6ZV90IHJldCA9IDA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgc3dwdHI7CglpbnQgY250OwoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X3JlYWQgY2FsbGVkLCBjb3VudCA9ICV6ZFxuIiwgY291bnQpOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCglpZiAoZG1hYnVmLT5tYXBwZWQpCgkJcmV0dXJuIC1FTlhJTzsKCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CglpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQoJCWdvdG8gb3V0OwoKCXdoaWxlIChjb3VudCA+IDApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlpZiAoZG1hYnVmLT5jb3VudCA+IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSkgewoJCQkvKiBidWZmZXIgb3ZlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLyAKCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8gCgkJCS8qIG1ha2UgcHJvY2VzcyBmbHVzaCB0aGUgYnVmZmVyICovCgkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CgkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwoJCX0KCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CgkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CgkJaWYgKGRtYWJ1Zi0+Y291bnQgPCBjbnQpCgkJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJdW5zaWduZWQgbG9uZyB0bW87CgkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKCQkJLyogd2FpdCBmb3IgZGF0YSB0byBiZSByZWNvcmRlZCAqLwoJCQlzdGFydF9hZGMoc3RhdGUpOwoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FQUdBSU47CgkJCQlnb3RvIG91dDsKCQkJfQoKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIHNwYWNlIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCgkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLyAKCQkJLyogd2hlbiBhZGRyZXNzIGVuZ2luZSBpbnRlcnJ1cHRzICovCgkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CgkJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCQkJLyogVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIHdoZW4gc2xlZXBfb25fdGltZW91dCByZXR1cm5zLCBvbmUgaXMgd2hlbgoJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKCQkJICAgSVNSIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoIG1lYW5zIHRoYXQKCQkJICAgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQKCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQoJCQkgICB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgYnVmZmVyIG92ZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMKCQkJICAgTk9USElORyB3ZSBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRtYWJ1Zi0+d2FpdCwgdG1vKSkgewoJCQkJcHJfZGVidWcoS0VSTl9FUlIgInRyaWRlbnQ6IHJlY29yZGluZyBzY2hlZHVsZSB0aW1lb3V0LCAiCgkJCQkJICJkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCgkJCQkJIGRtYWJ1Zi0+ZG1hc2l6ZSwgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5jb3VudCwKCQkJCQkgZG1hYnVmLT5od3B0ciwgZG1hYnVmLT5zd3B0cik7CgoJCQkJLyogYSBidWZmZXIgb3ZlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5IHVudGlsIG5leHQgdGltZSB0aGUKCQkJCSAgIHdoaWxlIGxvb3AgYmVnaW4gYW5kIHdlIFJFQUxMWSBoYXZlIHNwYWNlIHRvIHJlY29yZCAqLwoJCQl9CgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CgkJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVOWElPOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJY29udGludWU7CgkJfQoKCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgY250KSkgewoJCQlpZiAoIXJldCkKCQkJCXJldCA9IC1FRkFVTFQ7CgkJCWdvdG8gb3V0OwoJCX0KCgkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOwoKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CgkJZG1hYnVmLT5jb3VudCAtPSBjbnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJY291bnQgLT0gY250OwoJCWJ1ZmZlciArPSBjbnQ7CgkJcmV0ICs9IGNudDsKCQlzdGFydF9hZGMoc3RhdGUpOwoJfQpvdXQ6CgltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoJcmV0dXJuIHJldDsKfQoKLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgZG1hIHRvCiAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KCnN0YXRpYyBzc2l6ZV90CnRyaWRlbnRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cglzc2l6ZV90IHJldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBzd3B0cjsKCWludCBjbnQ7Cgl1bnNpZ25lZCBpbnQgc3RhdGVfY250OwoJdW5zaWduZWQgaW50IGNvcHlfY291bnQ7CglpbnQgbHJldDsgLyogZm9yIGxvY2tfc2V0X2ZtdCAqLwoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X3dyaXRlIGNhbGxlZCwgY291bnQgPSAlemRcbiIsIGNvdW50KTsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoJLyoKCSAqICAgICAgR3VhcmQgYWdhaW5zdCBhbiBtbWFwIG9yIGlvY3RsIHdoaWxlIHdyaXRpbmcKCSAqLwoKCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwoKCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCXJldCA9IC1FTlhJTzsKCQlnb3RvIG91dDsKCX0KCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKCQlnb3RvIG91dDsKCglpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpIHsKCQlyZXQgPSAtRUZBVUxUOwoJCWdvdG8gb3V0OwoJfQoKCXJldCA9IDA7CgoJd2hpbGUgKGNvdW50ID4gMCkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWlmIChkbWFidWYtPmNvdW50IDwgMCkgewoJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8gCgkJCS8qIHNsZWVwX29uX3RpbWVvdXQsIHJlc3luYyBod3B0ciBhbmQgc3dwdHIgKi8KCQkJZG1hYnVmLT5jb3VudCA9IDA7CgkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwoJCX0KCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CgkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CgkJaWYgKGRtYWJ1Zi0+Y291bnQgKyBjbnQgPiBkbWFidWYtPmRtYXNpemUpCgkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+Y291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJdW5zaWduZWQgbG9uZyB0bW87CgkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAoJCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZCAqLwoJCQlzdGFydF9kYWMoc3RhdGUpOwoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FQUdBSU47CgkJCQlnb3RvIG91dDsKCQkJfQoJCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIsICovIAoJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCgkJCS8qIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwoJCQlsb2NrX3NldF9mbXQoc3RhdGUpOwoJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSAqIDIpOwoJCQl0bW8gPj49IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CgkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCgkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgKi8gCgkJCS8qIHJldHVybnMsIG9uZSBpcyB3aGVuIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgKi8gCgkJCS8qIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkgSVNSICovIAoJCQkvKiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCAqLyAKCQkJLyogbWVhbnMgdGhhdCBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCAqLyAKCQkJLyogY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQgaXMgVE9PIExBVEUgKi8gCgkJCS8qIGZvciB0aGUgcHJvY2VzcyB0byBiZSBzY2hlZHVsZWQgdG8gcnVuICovIAoJCQkvKiAoc2NoZWR1bGVyIGxhdGVuY3kpIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSAqLyAKCQkJLyogYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzIE5PVEhJTkcgd2UgKi8gCgkJCS8qIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLwoJCQlpZiAoIWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmZG1hYnVmLT53YWl0LCB0bW8pKSB7CgkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcGxheWJhY2sgc2NoZWR1bGUgIgoJCQkJCSAidGltZW91dCwgZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICVpICIKCQkJCQkgImh3cHRyICV1IHN3cHRyICV1XG4iLCBkbWFidWYtPmRtYXNpemUsCgkJCQkJIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCgkJCQkJIGRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+c3dwdHIpOwoKCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgKi8gCgkJCQkvKiB1bnRpbCBuZXh0IHRpbWUgdGhlIHdoaWxlIGxvb3AgYmVnaW4gYW5kICovIAoJCQkJLyogd2UgUkVBTExZIGhhdmUgZGF0YSB0byBwbGF5ICovCgkJCX0KCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CgkJCQlnb3RvIG91dF9ub2xvY2s7CgkJCX0KCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CgkJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVOWElPOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJY29udGludWU7CgkJfQoJCWlmICgobHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkgewoJCQlyZXQgPSBscmV0OwoJCQlnb3RvIG91dDsKCQl9CgoJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKCQkJY29weV9jb3VudCA9IDA7CgkJCXN0YXRlX2NudCA9IDA7CgkJCWlmIChhbGlfd3JpdGVfNV8xKHN0YXRlLCBidWZmZXIsIGNudCwgJmNvcHlfY291bnQsIAoJCQkJCSAgJnN0YXRlX2NudCkgPT0gLUVGQVVMVCkgewoJCQkJaWYgKHN0YXRlX2NudCkgewoJCQkJCXN3cHRyID0gKHN3cHRyICsgc3RhdGVfY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQkJCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CgkJCQkJZG1hYnVmLT5jb3VudCArPSBzdGF0ZV9jbnQ7CgkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMDsKCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCQkJfQoJCQkJcmV0ICs9IGNvcHlfY291bnQ7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUZBVUxUOwoJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJZ290byBvdXQ7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBjbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUZBVUxUOwoJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJc3RhdGVfY250ID0gY250OwoJCX0KCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgoJCXN3cHRyID0gKHN3cHRyICsgc3RhdGVfY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOwoJCWRtYWJ1Zi0+Y291bnQgKz0gc3RhdGVfY250OwoJCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDA7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJY291bnQgLT0gY250OwoJCWJ1ZmZlciArPSBjbnQ7CgkJcmV0ICs9IGNudDsKCQlzdGFydF9kYWMoc3RhdGUpOwoJfQpvdXQ6CgltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwpvdXRfbm9sb2NrOgoJcmV0dXJuIHJldDsKfQoKLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgaW50IG1hc2sgPSAwOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCgkvKgoJICogICAgICBHdWFyZCBhZ2FpbnN0IGEgcGFyYWxsZWwgcG9sbCBhbmQgd3JpdGUgY2F1c2luZyBtdWx0aXBsZQoJICogICAgICBwcm9nX2RtYWJ1ZiBldmVudHMKCSAqLwoKCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwoKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpIHsKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJcmV0dXJuIDA7CgkJfQoJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKCX0KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpIHsKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJcmV0dXJuIDA7CgkJfQoJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKCX0KCgltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwoJfQoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwoJCX0gZWxzZSB7CgkJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAoJCQkgICAgKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CgkJfQoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gbWFzazsKfQoKc3RhdGljIGludAp0cmlkZW50X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQp7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCWludCByZXQgPSAtRUlOVkFMOwoJdW5zaWduZWQgbG9uZyBzaXplOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCgkvKgoJICogICAgICBMb2NrIGFnYWluc3QgcG9sbCByZWFkIHdyaXRlIG9yIG1tYXAgY3JlYXRpbmcgYnVmZmVycy4gQWxzbyBsb2NrCgkgKiAgICAgIGEgcmVhZCBvciB3cml0ZSBhZ2FpbnN0IGFuIG1tYXAuCgkgKi8KCgltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCglpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CgkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpICE9IDApCgkJCWdvdG8gb3V0OwoJfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgewoJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkgIT0gMCkKCQkJZ290byBvdXQ7Cgl9IGVsc2UKCQlnb3RvIG91dDsKCglyZXQgPSAtRUlOVkFMOwoJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKCQlnb3RvIG91dDsKCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CglpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCgkJZ290byBvdXQ7CglyZXQgPSAtRUFHQUlOOwoJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCgkJCSAgICAgdmlydF90b19waHlzKGRtYWJ1Zi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAoJCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKCQlnb3RvIG91dDsKCWRtYWJ1Zi0+bWFwcGVkID0gMTsKCXJldCA9IDA7Cm91dDoKCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50CnRyaWRlbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAoJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKCWNvdW50X2luZm8gY2luZm87CglpbnQgdmFsLCBtYXBwZWQsIHJldCA9IDA7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCWludCBfX3VzZXIgKnAgPSBhcmdwOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCgoJbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiAoRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEKSkgJiYgZG1hYnVmLT5tYXBwZWQpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X2lvY3RsLCBjb21tYW5kID0gJTJkLCBhcmcgPSAweCUwOHhcbiIsCgkJIF9JT0NfTlIoY21kKSwgYXJnID8gKnAgOiAwKTsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBPU1NfR0VUVkVSU0lPTjoKCQlyZXQgPSBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfUkVTRVQ6CgkJLyogRklYTUU6IHNwaW5fbG9jayA/ICovCgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CgkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CgkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQlzeW5jaHJvbml6ZV9pcnEoY2FyZC0+aXJxKTsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwoJCX0KCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU1lOQzoKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCgkJCXJldCA9IGRyYWluX2RhYyhzdGF0ZSwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoJLyogc2V0IHNtYXBsZSByYXRlICovCgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmICh2YWwgPj0gMCkgewoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgdmFsKTsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCX0KCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJCXN0b3BfYWRjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCX0KCQl9CgkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLwoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKCQkJcmV0dXJuIHJldDsKCgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWlmICh2YWwpCgkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CgkJCWVsc2UKCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCXN0b3BfYWRjKHN0YXRlKTsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWlmICh2YWwpCgkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CgkJCWVsc2UKCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CgkJfQoJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQoJCQkJcmV0ID0gdmFsOwoJCQllbHNlCgkJCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKCQkJYnJlYWs7CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCWlmICgodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCgkJCQlyZXQgPSB2YWw7CgkJCWVsc2UKCQkJCXJldCA9IHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUsIHApOwoJCQlicmVhazsKCQl9CgkJLyogbmVpdGhlciBSRUFEIG5vciBXUklURT8gaXMgdGhpcyBldmVuIHBvc3NpYmxlPyAqLwoJCXJldCA9IC1FSU5WQUw7CgkJYnJlYWs7CgoKCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAqLwoJCXJldCA9IHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwgCgkJCSAgICAgICBBRk1UX1U4LCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBTZWxlY3Qgc2FtcGxlIGZvcm1hdCAqLwoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKCQkJcmV0dXJuIHJldDsKCgkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQkJc3RvcF9kYWMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQoJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCQkJZWxzZQoJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF8xNkJJVDsKCQkJfQoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQoJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCQkJZWxzZQoJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF8xNkJJVDsKCQkJfQoJCX0KCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKCQkJICAgICAgIEFGTVRfVTgsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHZhbCAhPSAwKSB7CgkJCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQoJCQkJcmV0dXJuIHJldDsKCgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQkJc3RvcF9kYWMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgoJCQkJLy9wcmV2ZW50IGZyb20gbWVtb3J5IGxlYWsKCQkJCWlmICgoc3RhdGUtPmNoYW5zX251bSA+IDIpICYmIChzdGF0ZS0+Y2hhbnNfbnVtICE9IHZhbCkpIHsKCQkJCQlhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0YXRlKTsKCQkJCQlzdGF0ZS0+Y2hhbnNfbnVtID0gMTsKCQkJCX0KCgkJCQlpZiAodmFsID49IDIpIHsKCgkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOwoJCQkJCWlmICgodmFsID09IDYpICYmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpKSB7CgkJCQkJCWlmIChjYXJkLT5yZWNfY2hhbm5lbF91c2VfY291bnQgPiAwKSB7CgkJCQkJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IFJlY29yZCBpcyAiCgkJCQkJCQkgICAgICAgIndvcmtpbmcgb24gdGhlIGNhcmQhXG4iKTsKCQkJCQkJCXJldCA9IC1FQlVTWTsKCQkJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQlyZXQgPSBhbGlfc2V0dXBfbXVsdGlfY2hhbm5lbHMoc3RhdGUtPmNhcmQsIDYpOwoJCQkJCQlpZiAocmV0IDwgMCkgewoJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJbXV0ZXhfbG9jaygmc3RhdGUtPmNhcmQtPm9wZW5fbXV0ZXgpOwoJCQkJCQlyZXQgPSBhbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdGF0ZSwgNik7CgkJCQkJCWlmIChyZXQgPCAwKSB7CgkJCQkJCQltdXRleF91bmxvY2soJnN0YXRlLT5jYXJkLT5vcGVuX211dGV4KTsKCQkJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCXN0YXRlLT5jYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCsrOwoJCQkJCQltdXRleF91bmxvY2soJnN0YXRlLT5jYXJkLT5vcGVuX211dGV4KTsKCQkJCQl9IGVsc2UKCQkJCQkJdmFsID0gMjsJLyp5aWVsZCB0byAyLWNoYW5uZWxzICovCgkJCQl9IGVsc2UKCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfU1RFUkVPOwoJCQkJc3RhdGUtPmNoYW5zX251bSA9IHZhbDsKCQkJfQoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlpZiAodmFsID49IDIpIHsKCQkJCQlpZiAoISgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIAoJCQkJCSAgICAgICh2YWwgPT0gNikpKQoJCQkJCQl2YWwgPSAyOwoJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UX1NURVJFTzsKCQkJCX0gZWxzZQoJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CgkJCQlzdGF0ZS0+Y2hhbnNfbnVtID0gdmFsOwoJCQl9CgkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQl9CgkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfUE9TVDoKCQkvKiBDYXVzZSB0aGUgd29ya2luZyBmcmFnbWVudCB0byBiZSBvdXRwdXQgKi8KCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgoJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gdmFsOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgoJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwoJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPCA0KQoJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDQ7CgkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID4gMTUpCgkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMTU7CgkJaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCA0KQoJCQlkbWFidWYtPm9zc21heGZyYWdzID0gNDsKCgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKSB7CgkJCXJldCA9IHZhbDsKCQkJYnJlYWs7CgkJfQoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OwoJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwoJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAoJCQktRUZBVUxUIDogMDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOwoJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQ7CgkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CgkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8gCgkJCS1FRkFVTFQgOiAwOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CgkJcmV0ID0gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IAoJCQkgICAgICAgRFNQX0NBUF9NTUFQIHwgRFNQX0NBUF9CSU5ELCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKCQl2YWwgPSAwOwoJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgZG1hYnVmLT5lbmFibGUpCgkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOwoJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIGRtYWJ1Zi0+ZW5hYmxlKQoJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CgkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAKCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCgkJCQkJYnJlYWs7CgkJCQlzdGFydF9hZGMoc3RhdGUpOwoJCQl9IGVsc2UKCQkJCXN0b3BfYWRjKHN0YXRlKTsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewoJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAoJCQkJICAgIChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQoJCQkJCWJyZWFrOwoJCQkJc3RhcnRfZGFjKHN0YXRlKTsKCQkJfSBlbHNlCgkJCQlzdG9wX2RhYyhzdGF0ZSk7CgkJfQoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpCgkJICAgICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CgkJY2luZm8uYmxvY2tzID0gZG1hYnVmLT5jb3VudCA+PiBkbWFidWYtPmZyYWdzaGlmdDsKCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOwoJCWlmIChkbWFidWYtPm1hcHBlZCkKCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmZyYWdzaXplIC0gMTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAoJCQktRUZBVUxUIDogMDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKQoJCSAgICAhPSAwKSB7CgkJCXJldCA9IHZhbDsKCQkJYnJlYWs7CgkJfQoKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlczsKCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQoJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8gCgkJCS1FRkFVTFQgOiAwOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CgkJcmV0ID0gLUVJTlZBTDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQl2YWwgPSBkbWFidWYtPmNvdW50OwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKCQlicmVhazsKCgljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CgkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKCQlicmVhazsKCgljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgoJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UX1NURVJFTykgPyAyIDogMSwgCgkJCSAgICAgICBwKTsKCQlicmVhazsKCgljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CgkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKCQkJICAgICAgIEFGTVRfVTgsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSzoKCQlyZXQgPSBwdXRfdXNlcihEU1BfQklORF9GUk9OVCB8IERTUF9CSU5EX1NVUlIgfCAKCQkJICAgICAgIERTUF9CSU5EX0NFTlRFUl9MRkUsICBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAodmFsID09IERTUF9CSU5EX1FVRVJZKSB7CgkJCXZhbCA9IGRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlIHwgMHgzYzAwOwoJCQl2YWwgPSBhdHRyMm1hc2tbdmFsID4+IDhdOwoJCX0gZWxzZSB7CgkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwgCgkJCQkJCQkgICAgICBTUkNfRU5BQkxFKTsKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQoJCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9TUENfUEIgfCAKCQkJCQkJCSAgICAgIFNSQ19FTkFCTEUpOwoJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSB8PSBtYXNrMmF0dHJbZmZzKHZhbCldOwoJCX0KCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CgljYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgoJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgoJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CglkZWZhdWx0OgoJCXJldCA9IC1FSU5WQUw7CgkJYnJlYWs7CgoJfQoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludAp0cmlkZW50X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWludCBpID0gMDsKCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZGV2czsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IE5VTEw7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOwoKCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLwoJLyogVE9ETzogdGhlcmUncyBzb21lIHJlZHVuZGFjeSBoZXJlIHdydCB0aGUgY2hlY2sgYmVsb3cgKi8KCS8qIGZvciBtdWx0aV91c2VfY291bnQgPiAwLiBTaG91bGQgd2UgcmV0dXJuIC1FQlVTWSBvciBmaW5kICovCgkvKiBhIGRpZmZlcmVudCBjYXJkPyBmb3Igbm93LCBkb24ndCBicmVhayBjdXJyZW50IGJlaGF2aW91ciAqLwoJLyogLS0gbXVsaXggKi8KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWlmIChjYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA+IDApCgkJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCX0KCgkvKiBmaW5kIGFuIGF2YWlsYWJsZSB2aXJ0dWFsIGNoYW5uZWwgKGluc3RhbmNlIG9mIC9kZXYvZHNwKSAqLwoJd2hpbGUgKGNhcmQgIT0gTlVMTCkgewoJCW11dGV4X2xvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCS8qIFNraXAgb3BlbnMgb24gY2FyZHMgdGhhdCBhcmUgaW4gNiBjaGFubmVsIG1vZGUgKi8KCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID4gMCkgewoJCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX211dGV4KTsKCQkJCWNhcmQgPSBjYXJkLT5uZXh0OwoJCQkJY29udGludWU7CgkJCX0KCQl9CgkJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKCQkJaWYgKGNhcmQtPnN0YXRlc1tpXSA9PSBOVUxMKSB7CgkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSA9IGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOwoJCQkJaWYgKHN0YXRlID09IE5VTEwpIHsKCQkJCQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoJCQkJCXJldHVybiAtRU5PTUVNOwoJCQkJfQoJCQkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CgkJCQltdXRleF9pbml0KCZzdGF0ZS0+c2VtKTsKCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJCQkJZ290byBmb3VuZF92aXJ0OwoJCQl9CgkJfQoJCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgkJY2FyZCA9IGNhcmQtPm5leHQ7Cgl9CgkvKiBubyBtb3JlIHZpcnR1YWwgY2hhbm5lbCBhdmFpYWJsZSAqLwoJaWYgKCFzdGF0ZSkgewoJCXJldHVybiAtRU5PREVWOwoJfQogICAgICBmb3VuZF92aXJ0OgoJLyogZm91bmQgYSBmcmVlIHZpcnR1YWwgY2hhbm5lbCwgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbHMgKi8KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQoJCWRtYWJ1Zi0+Y2hhbm5lbCA9IGNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChjYXJkKTsKCWVsc2UKCQlkbWFidWYtPmNoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKTsKCglpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKCQlrZnJlZShjYXJkLT5zdGF0ZXNbaV0pOwoJCWNhcmQtPnN0YXRlc1tpXSA9IE5VTEw7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCglzdGF0ZS0+dmlydCA9IGk7CglzdGF0ZS0+Y2FyZCA9IGNhcmQ7CglzdGF0ZS0+bWFnaWMgPSBUUklERU5UX1NUQVRFX01BR0lDOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKCWZpbGUtPnByaXZhdGVfZGF0YSA9IHN0YXRlOwoKCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzICovIAoJLyogR3VpZGUgIC9kZXYvZHNwIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgKi8gCgkvKiB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX01BU0s7CgkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCgkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gMDsKCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byBub3JtYWwgcGxheWJhY2sgKi8KCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSBDSEFOTkVMX1BCOwoJCX0KCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7Cgl9CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkvKiBGSVhNRTogVHJpZGVudCA0ZCBjYW4gb25seSByZWNvcmQgaW4gc2lnbmVkIDE2LWJpdHMgc3RlcmVvLCAqLyAKCQkvKiA0OGtIeiBzYW1wbGUsIHRvIGJlIGRlYWxlZCB3aXRoIGluIHRyaWRlbnRfc2V0X2FkY19yYXRlKCkgPz8gKi8KCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKCQlpZiAoKG1pbm9yICYgMHgwZikgPT0gU05EX0RFVl9EU1AxNikKCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfMTZCSVQ7CgkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOwoJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAwOwoJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSAwOwoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CgkJCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgYXR0cmlidXRlIHRvIDB4OGE4MCwgcmVjb3JkIGZyb20KCQkJICAgUENNIEwvUiBGSUZPIGFuZCBtb25vID0gKGxlZnQgKyByaWdodCArIDEpLzIgKi8KCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCBQQ01fTFIgfCAKCQkJCQkJICAgICAgTU9OT19NSVgpOwoJCX0KCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLwoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKCQkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50Kys7Cgl9CgoJc3RhdGUtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IG9wZW4gdmlydHVhbCBjaGFubmVsICVkLCBoYXJkIGNoYW5uZWwgJWRcbiIsCgkJIHN0YXRlLT52aXJ0LCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CgoJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoJY2FyZCA9IHN0YXRlLT5jYXJkOwoJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJdHJpZGVudF9jbGVhcl90YWlsKHN0YXRlKTsKCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKCX0KCglwcl9kZWJ1ZygidHJpZGVudDogY2xvc2luZyB2aXJ0dWFsIGNoYW5uZWwgJWQsIGhhcmQgY2hhbm5lbCAlZFxuIiwKCQkgc3RhdGUtPnZpcnQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKCgkvKiBzdG9wIERNQSBzdGF0ZSBtYWNoaW5lIGFuZCBmcmVlIERNQSBidWZmZXJzL2NoYW5uZWxzICovCgltdXRleF9sb2NrKCZjYXJkLT5vcGVuX211dGV4KTsKCglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQlzdG9wX2RhYyhzdGF0ZSk7CgkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwoKCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID4gMikgewoJCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50LS0gPCAwKQoJCQkJCWNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKCQkJCWlmIChjYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9PSAwKQoJCQkJCWFsaV9jbG9zZV9tdWx0aV9jaGFubmVscygpOwoJCQkJYWxpX2ZyZWVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdGF0ZSk7CgkJCX0KCQl9Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCXN0b3BfYWRjKHN0YXRlKTsKCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPmRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOwoJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgKi8KCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudC0tIDwgMCkKCQkJCWNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCA9IDA7CgkJfQoJfQoKCWNhcmQtPnN0YXRlc1tzdGF0ZS0+dmlydF0gPSBOVUxMOwoJa2ZyZWUoc3RhdGUpOwoKCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fbXV0ZXggKi8KCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9hdWRpb19mb3BzID0gewoJLm93bmVyID0gVEhJU19NT0RVTEUsCgkubGxzZWVrID0gbm9fbGxzZWVrLAoJLnJlYWQgPSB0cmlkZW50X3JlYWQsCgkud3JpdGUgPSB0cmlkZW50X3dyaXRlLAoJLnBvbGwgPSB0cmlkZW50X3BvbGwsCgkuaW9jdGwgPSB0cmlkZW50X2lvY3RsLAoJLm1tYXAgPSB0cmlkZW50X21tYXAsCgkub3BlbiA9IHRyaWRlbnRfb3BlbiwKCS5yZWxlYXNlID0gdHJpZGVudF9yZWxlYXNlLAp9OwoKLyogdHJpZGVudCBzcGVjaWZpYyBBQzk3IGZ1bmN0aW9ucyAqLwovKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOwoJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7Cgl1bnNpZ25lZCBzaG9ydCBjb3VudCA9IDB4ZmZmZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1MzIgZGF0YTsKCglkYXRhID0gKCh1MzIpIHZhbCkgPDwgMTY7CgoJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKCWRlZmF1bHQ6CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQlhZGRyZXNzID0gU0lfQUM5N19XUklURTsKCQltYXNrID0gU0lfQUM5N19CVVNZX1dSSVRFIHwgU0lfQUM5N19BVURJT19CVVNZOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnVzeSA9IFNJX0FDOTdfQlVTWV9XUklURTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQlhZGRyZXNzID0gRFhfQUNSMF9BQzk3X1c7CgkJbWFzayA9IGJ1c3kgPSBEWF9BQzk3X0JVU1lfV1JJVEU7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgkJYWRkcmVzcyA9IE5YX0FDUjFfQUM5N19XOwoJCW1hc2sgPSBOWF9BQzk3X0JVU1lfV1JJVEU7CgkJaWYgKGNvZGVjLT5pZCkKCQkJbWFzayB8PSBOWF9BQzk3X1dSSVRFX1NFQ09OREFSWTsKCQlidXN5ID0gTlhfQUM5N19CVVNZX1dSSVRFOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCWFkZHJlc3MgPSBTSV9BQzk3X1dSSVRFOwoJCW1hc2sgPSBidXN5ID0gU0lfQUM5N19CVVNZX1dSSVRFOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnJlYWs7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWRvIHsKCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSkgJiBidXN5KSA9PSAwKQoJCQlicmVhazsKCX0gd2hpbGUgKGNvdW50LS0pOwoKCWRhdGEgfD0gKG1hc2sgfCAocmVnICYgQUM5N19SRUdfQUREUikpOwoKCWlmIChjb3VudCA9PSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBBQzk3IENPREVDIHdyaXRlIHRpbWVkIG91dC5cbiIpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXR1cm47Cgl9CgoJb3V0bChkYXRhLCBUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCi8qIFJlYWQgQUM5NyBjb2RlYyByZWdpc3RlcnMgKi8Kc3RhdGljIHUxNgp0cmlkZW50X2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOwoJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7Cgl1bnNpZ25lZCBzaG9ydCBjb3VudCA9IDB4ZmZmZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1MzIgZGF0YTsKCglzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgewoJZGVmYXVsdDoKCWNhc2UgUENJX0RFVklDRV9JRF9TSV83MDE4OgoJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CgkJbWFzayA9IFNJX0FDOTdfQlVTWV9SRUFEIHwgU0lfQUM5N19BVURJT19CVVNZOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnVzeSA9IFNJX0FDOTdfQlVTWV9SRUFEOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJCWFkZHJlc3MgPSBEWF9BQ1IxX0FDOTdfUjsKCQltYXNrID0gYnVzeSA9IERYX0FDOTdfQlVTWV9SRUFEOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCWlmIChjb2RlYy0+aWQpCgkJCWFkZHJlc3MgPSBOWF9BQ1IzX0FDOTdfUl9TRUNPTkRBUlk7CgkJZWxzZQoJCQlhZGRyZXNzID0gTlhfQUNSMl9BQzk3X1JfUFJJTUFSWTsKCQltYXNrID0gTlhfQUM5N19CVVNZX1JFQUQ7CgkJYnVzeSA9IE5YX0FDOTdfQlVTWV9SRUFEIHwgTlhfQUM5N19CVVNZX0RBVEE7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJYWRkcmVzcyA9IFNJX0FDOTdfUkVBRDsKCQltYXNrID0gYnVzeSA9IFNJX0FDOTdfQlVTWV9SRUFEOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnJlYWs7Cgl9CgoJZGF0YSA9IChtYXNrIHwgKHJlZyAmIEFDOTdfUkVHX0FERFIpKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJb3V0bChkYXRhLCBUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CglkbyB7CgkJZGF0YSA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CgkJaWYgKChkYXRhICYgYnVzeSkgPT0gMCkKCQkJYnJlYWs7Cgl9IHdoaWxlIChjb3VudC0tKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglpZiAoY291bnQgPT0gMCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogQUM5NyBDT0RFQyByZWFkIHRpbWVkIG91dC5cbiIpOwoJCWRhdGEgPSAwOwoJfQoJcmV0dXJuICgodTE2KSAoZGF0YSA+PiAxNikpOwp9CgovKiByZXdyaXRlIGFjOTcgcmVhZCBhbmQgd3JpdGUgbWl4ZXIgcmVnaXN0ZXIgYnkgaHVsZWkgZm9yIEFMSSovCnN0YXRpYyBpbnQKYWNxdWlyZWNvZGVjYWNjZXNzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXUxNiB3c2VtYW1hc2sgPSAweDYwMDA7CS8qIGJpdCAxNC4uMTMgKi8KCXUxNiB3c2VtYWJpdHM7Cgl1MTYgd2NvbnRyb2w7CglpbnQgYmxvY2sgPSAwOwoJaW50IG5jb3VudCA9IDI1OwoJd2hpbGUgKDEpIHsKCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCXdzZW1hYml0cyA9IHdjb250cm9sICYgd3NlbWFtYXNrOwoKCQlpZiAod3NlbWFiaXRzID09IDB4NDAwMCkKCQkJcmV0dXJuIDE7CS8qIDB4NDAwMCBpcyBhdWRpbyAsdGhlbiBzdWNjZXNzICovCgkJaWYgKG5jb3VudC0tIDwgMCkKCQkJYnJlYWs7CgkJaWYgKHdzZW1hYml0cyA9PSAwKSB7CgkJICAgICAgdW5sb2NrOgoJCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksIAoJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CgkJCWNvbnRpbnVlOwoJCX0KCQl1ZGVsYXkoMjApOwoJfQoJaWYgKCFibG9jaykgewoJCXByX2RlYnVnKCJhY2Nlc3Njb2RlY3NlbWFwaG9yZTogdHJ5IHVubG9ja1xuIik7CgkJYmxvY2sgPSAxOwoJCWdvdG8gdW5sb2NrOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnJlbGVhc2Vjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIHdjb250cm9sOwoJd2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCW91dGwoKHdjb250cm9sICYgMHhmZmZmMWVmZiksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7Cn0KCnN0YXRpYyBpbnQKd2FpdGZvcnN0aW1lcnRpY2soc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBjaGsxLCBjaGsyOwoJdW5zaWduZWQgaW50IHdjb3VudCA9IDB4ZmZmZjsKCWNoazEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwoKCXdoaWxlICgxKSB7CgkJY2hrMiA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CgkJaWYgKCh3Y291bnQgPiAwKSAmJiBjaGsxICE9IGNoazIpCgkJCXJldHVybiAxOwoJCWlmICh3Y291bnQgPD0gMCkKCQkJYnJlYWs7CgkJdWRlbGF5KDUwKTsKCX0KCXJldHVybiAwOwp9CgovKiBSZWFkIEFDOTcgY29kZWMgcmVnaXN0ZXJzIGZvciBBTGkqLwpzdGF0aWMgdTE2CmFsaV9hYzk3X2dldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcpCnsKCXVuc2lnbmVkIGludCBhZGRyZXNzLCBtYXNrOwoJdW5zaWduZWQgaW50IG5jb3VudDsKCXVuc2lnbmVkIGxvbmcgYXVkX3JlZzsKCXUzMiBkYXRhOwoJdTE2IHdjb250cm9sOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglpZiAoIWNhcmQpCgkJQlVHKCk7CgoJYWRkcmVzcyA9IEFMSV9BQzk3X1JFQUQ7CglpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKSB7CgkJYWRkcmVzcyA9IEFMSV9BQzk3X1dSSVRFOwoJfQoJbWFzayA9IEFMSV9BQzk3X1JFQURfQUNUSU9OIHwgQUxJX0FDOTdfQVVESU9fQlVTWTsKCWlmIChzZWNvbmRhcnkpCgkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglpZiAoIWFjcXVpcmVjb2RlY2FjY2VzcyhjYXJkKSkKCQlwcmludGsoS0VSTl9FUlIgImFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKCgl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJd2NvbnRyb2wgJj0gMHhmZTAwOwoJd2NvbnRyb2wgfD0gKDB4ODAwMCB8IHJlZyk7CglvdXR3KHdjb250cm9sLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoKCWRhdGEgPSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CgoJaWYgKCF3YWl0Zm9yc3RpbWVydGljayhjYXJkKSkgewoJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfcmVhZDogQklUX0NMT0NLIGlzIGRlYWRcbiIpOwoJCWdvdG8gcmVsZWFzZWNvZGVjOwoJfQoKCXVkZWxheSgyMCk7CgoJbmNvdW50ID0gMTA7CgoJd2hpbGUgKDEpIHsKCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKSAKCQkgICAgIT0gMCkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudCA8PSAwKQoJCQlicmVhazsKCQlpZiAobmNvdW50LS0gPT0gMSkgewoJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfcmVhZCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZ1xuIik7CgkJCWF1ZF9yZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCQkJb3V0bCgoYXVkX3JlZyAmIDB4ZmZmZjdmZmYpLCAKCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCX0KCQl1ZGVsYXkoMTApOwoJfQoKCWRhdGEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gKCh1MTYpIChkYXRhID4+IDE2KSk7CgogICAgICByZWxlYXNlY29kZWM6CglyZWxlYXNlY29kZWNhY2Nlc3MoY2FyZCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglwcmludGsoS0VSTl9FUlIgImFsaV9hYzk3X3JlYWQ6IEFDOTcgQ09ERUMgcmVhZCB0aW1lZCBvdXQuXG4iKTsKCXJldHVybiAwOwp9CgovKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgaHVsZWkqLwpzdGF0aWMgdm9pZAphbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKQp7Cgl1bnNpZ25lZCBpbnQgYWRkcmVzcywgbWFzazsKCXVuc2lnbmVkIGludCBuY291bnQ7Cgl1MzIgZGF0YTsKCXUxNiB3Y29udHJvbDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGF0YSA9ICgodTMyKSB2YWwpIDw8IDE2OwoKCWlmICghY2FyZCkKCQlCVUcoKTsKCglhZGRyZXNzID0gQUxJX0FDOTdfV1JJVEU7CgltYXNrID0gQUxJX0FDOTdfV1JJVEVfQUNUSU9OIHwgQUxJX0FDOTdfQVVESU9fQlVTWTsKCWlmIChzZWNvbmRhcnkpCgkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CglpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQoJCW1hc2sgfD0gQUxJX0FDOTdfV1JJVEVfTUlYRVJfUkVHSVNURVI7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWlmICghYWNxdWlyZWNvZGVjYWNjZXNzKGNhcmQpKQoJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfd3JpdGU6IGFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKCgl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJd2NvbnRyb2wgJj0gMHhmZjAwOwoJd2NvbnRyb2wgfD0gKDB4ODEwMCB8IHJlZyk7IC8qIGJpdCA4PTE6IChhbGkxNTM1IClyZXNlcnZlZC8gKi8gCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxpMTUzNSsgd3JpdGUgKi8KCW91dGwoKGRhdGEgfCB3Y29udHJvbCksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CgoJaWYgKCF3YWl0Zm9yc3RpbWVydGljayhjYXJkKSkgewoJCXByaW50ayhLRVJOX0VSUiAiQklUX0NMT0NLIGlzIGRlYWRcbiIpOwoJCWdvdG8gcmVsZWFzZWNvZGVjOwoJfQoKCW5jb3VudCA9IDEwOwoJd2hpbGUgKDEpIHsKCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCWlmICghKHdjb250cm9sICYgMHg4MDAwKSkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudCA8PSAwKQoJCQlicmVhazsKCQlpZiAobmNvdW50LS0gPT0gMSkgewoJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfc2V0IDp0cnkgY2xlYXIgYnVzeSBmbGFnISFcbiIpOwoJCQlvdXR3KHdjb250cm9sICYgMHg3ZmZmLCAKCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCX0KCQl1ZGVsYXkoMTApOwoJfQoKICAgICAgcmVsZWFzZWNvZGVjOgoJcmVsZWFzZWNvZGVjYWNjZXNzKGNhcmQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZAphbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdCkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXQtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIHNfY2hhbm5lbHM7CgoJc19jaGFubmVscyA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCXNfY2hhbm5lbHMgfD0gKDEgPDwgc3RhdC0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CglvdXRsKHNfY2hhbm5lbHMsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwp9CgpzdGF0aWMgdTE2CmFsaV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpCnsKCWludCBpZDsKCXUxNiBkYXRhOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IE5VTEw7CgoJLyogQWRkZWQgYnkgTWF0dCBXdSAqLwoJaWYgKCFjb2RlYykKCQlCVUcoKTsKCgljYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgY29kZWMtPnByaXZhdGVfZGF0YTsKCglpZiAoIWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkpCgkJcmV0dXJuIGFsaV9hYzk3X2dldChjYXJkLCBjb2RlYy0+aWQsIHJlZyk7CgoJLyoKCSAqICAgICAgRklYTUU6IG5lZWQgdG8gc3RvcCB0aGlzIGNhY2hpbmcgc29tZSByZWdpc3RlcnMKCSAqLwoJaWYgKGNvZGVjLT5pZCkKCQlpZCA9IDE7CgllbHNlCgkJaWQgPSAwOwoKCWRhdGEgPSBjYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXTsKCXJldHVybiBkYXRhOwp9CgpzdGF0aWMgdm9pZAphbGlfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCkKewoJaW50IGlkOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCgkvKiAgQWRkZWQgYnkgTWF0dCBXdSAqLwoJaWYgKCFjb2RlYykKCQlCVUcoKTsKCgljYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgY29kZWMtPnByaXZhdGVfZGF0YTsKCglpZiAoIWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkpIHsKCQlhbGlfYWM5N19zZXQoY2FyZCwgY29kZWMtPmlkLCByZWcsIHZhbCk7CgkJcmV0dXJuOwoJfQoKCWlmIChjb2RlYy0+aWQpCgkJaWQgPSAxOwoJZWxzZQoJCWlkID0gMDsKCgljYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXSA9IHZhbDsKCWFsaV9hYzk3X3NldChjYXJkLCBjb2RlYy0+aWQsIHJlZywgdmFsKTsKfQoKLyoKZmxhZzoJQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQKCUFMSV9QQ01fVE9fU1BESUZfT1VUCiovCgpzdGF0aWMgdm9pZAphbGlfc2V0dXBfc3BkaWZfb3V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBmbGFnKQp7Cgl1bnNpZ25lZCBsb25nIHNwZGlmOwoJdW5zaWduZWQgY2hhciBjaDsKCgljaGFyIHRlbXA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsCgkJCQkgcGNpX2Rldik7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybjsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsICZ0ZW1wKTsKCXRlbXAgfD0gMHg0MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDYxLCB0ZW1wKTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsICZ0ZW1wKTsKCXRlbXAgfD0gMHgwMTsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdkLCB0ZW1wKTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2UsICZ0ZW1wKTsKCXRlbXAgJj0gKH4weDIwKTsKCXRlbXAgfD0gMHgxMDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdlLCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCgljaCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCW91dGIoY2ggfCBBTElfU1BESUZfT1VUX0VOQUJMRSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgljaCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJb3V0YihjaCAmIEFMSV9TUERJRl9PVVRfQ0hfU1RBVFVTLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoKCWlmIChmbGFnICYgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQpIHsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX0NIX0VOQUJMRTsKCQlzcGRpZiAmPSBBTElfU1BESUZfT1VUX1NFTF9TUERJRjsKCQlvdXR3KHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MpKTsKCQlpZiAoZmxhZyAmIEFMSV9TUERJRl9PVVRfTk9OX1BDTSkKCQkJc3BkaWYgfD0gMHgwMDAyOwoJCWVsc2UKCQkJc3BkaWYgJj0gKH4weDAwMDIpOwoJCW91dHcoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUykpOwoJfSBlbHNlIHsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX1NFTF9QQ007CgkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgY2gpCnsKCXVuc2lnbmVkIGxvbmcgc2M7CgoJc2MgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzYyAmPSB+KDEgPDwgY2gpOwoJb3V0bChzYywgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXVuc2lnbmVkIGxvbmcgc3BkaWY7CgoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiAmPSAofkFMSV9TUERJRl9JTl9TVVBQT1JUKTsKCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfSU5fQ0hBTk5FTCk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9zZXR1cF9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIHNwZGlmOwoKCS8vU2V0IFNQRElGIElOIFN1cHBvcnRlZAoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fU1VQUE9SVDsKCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCS8vU2V0IFNQRElGIElOIFJlYwoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fQ0hfRU5BQkxFOwoJb3V0bChzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgoJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9DSF9TVEFUVVM7CglvdXRiKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwovKgoJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9GVU5DX0VOQUJMRTsKCW91dGIoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CiovCn0KCnN0YXRpYyB2b2lkCmFsaV9kZWxheShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgaW50ZXJ2YWwpCnsKCXVuc2lnbmVkIGxvbmcgYmVnaW50aW1lciwgY3VycmVudHRpbWVyOwoKCWJlZ2ludGltZXIgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwoJY3VycmVudHRpbWVyID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TVElNRVIpKTsKCgl3aGlsZSAoY3VycmVudHRpbWVyIDwgYmVnaW50aW1lciArIGludGVydmFsKQoJCWN1cnJlbnR0aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MTYgd3ZhbCA9IDA7Cgl1MTYgY291bnQgPSAwOwoJdTggYnZhbCA9IDAsIFIxID0gMCwgUjIgPSAwOwoKCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCWJ2YWwgfD0gMHgwMjsKCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCglidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwoJYnZhbCB8PSAweDFGOwoJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDEpKTsKCgl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYgCgkgICAgICAgY291bnQgPD0gNTAwMDApIHsKCQljb3VudCsrOwoKCQlhbGlfZGVsYXkoY2FyZCwgNik7CgoJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CgkJUjEgPSBidmFsICYgMHgxRjsKCX0KCglpZiAoY291bnQgPiA1MDAwMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyaWRlbnQ6IEVycm9yIGluICIKCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOwoJCXJldHVybjsKCX0KCgljb3VudCA9IDA7CgoJd2hpbGUgKGNvdW50IDw9IDUwMDAwKSB7CgkJY291bnQrKzsKCgkJYWxpX2RlbGF5KGNhcmQsIDYpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwoJCVIyID0gYnZhbCAmIDB4MUY7CgoJCWlmIChSMiAhPSBSMSkKCQkJUjEgPSBSMjsKCQllbHNlCgkJCWJyZWFrOwoJfQoKCWlmIChjb3VudCA+IDUwMDAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogRXJyb3IgaW4gIgoJCSAgICAgICAiYWxpX2RldGVjdF9zcGRpZl9yYXRlIVxuIik7CgkJcmV0dXJuOwoJfQoKCXN3aXRjaCAoUjIpIHsKCWNhc2UgMHgwYjoKCWNhc2UgMHgwYzoKCWNhc2UgMHgwZDoKCWNhc2UgMHgwZToKCQl3dmFsID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoJCXd2YWwgJj0gMHhFMEYwOwoJCXd2YWwgfD0gKHUxNikgMHgwOSA8PCA4IHwgKHUxNikgMHgwNTsKCQlvdXR3KHd2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CgkJb3V0YihidmFsIHwgMHgwMiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMykpOwoJCWJyZWFrOwoKCWNhc2UgMHgxMjoKCQl3dmFsID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoJCXd2YWwgJj0gMHhFMEYwOwoJCXd2YWwgfD0gKHUxNikgMHgwRSA8PCA4IHwgKHUxNikgMHgwODsKCQlvdXR3KHd2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CgkJb3V0YihidmFsIHwgMHgwMywgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMykpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9Cgp9CgpzdGF0aWMgdW5zaWduZWQgaW50CmFsaV9nZXRfc3BkaWZfaW5fcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MzIgZHdSYXRlID0gMDsKCXU4IGJ2YWwgPSAwOwoKCWFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShjYXJkKTsKCglidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglidmFsICY9IDB4N0Y7CglidmFsIHw9IDB4NDA7CglvdXRiKGJ2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CgoJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSk7CglidmFsICY9IDB4MEY7CgoJc3dpdGNoIChidmFsKSB7CgljYXNlIDA6CgkJZHdSYXRlID0gNDQxMDA7CgkJYnJlYWs7CgljYXNlIDE6CgkJZHdSYXRlID0gNDgwMDA7CgkJYnJlYWs7CgljYXNlIDI6CgkJZHdSYXRlID0gMzIwMDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCS8vIEVycm9yIG9jY3VycwoJCWJyZWFrOwoJfQoKCXJldHVybiBkd1JhdGU7Cgp9CgpzdGF0aWMgaW50CmFsaV9jbG9zZV9tdWx0aV9jaGFubmVscyh2b2lkKQp7CgljaGFyIHRlbXAgPSAwOwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwoKCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAoJCQkJIHBjaV9kZXYpOwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgMHg1OSwgJnRlbXApOwoJdGVtcCAmPSB+MHg4MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwKCQkJCSBOVUxMKTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4QjgsICZ0ZW1wKTsKCXRlbXAgJj0gfjB4MjA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHhCOCwgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpCnsKCXVuc2lnbmVkIGxvbmcgZHdWYWx1ZTsKCWNoYXIgdGVtcCA9IDA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsCgkJCQkgcGNpX2Rldik7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NTksICZ0ZW1wKTsKCXRlbXAgfD0gMHg4MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwKCQkJCSBOVUxMKTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgKGludCkgMHhCOCwgJnRlbXApOwoJdGVtcCB8PSAweDIwOwoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIChpbnQpIDB4QjgsICh1OCkgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJaWYgKGNoYW5fbnVtcyA9PSA2KSB7CgkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKSB8IDB4MDAwZjAwMDA7CgkJb3V0bChkd1ZhbHVlLCBUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQltZGVsYXkoNCk7CgkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQlpZiAoZHdWYWx1ZSAmIDB4MjAwMDAwMCkgewoJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCA4MDgwKTsKCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgzNiwgMCk7CgkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MzgsIDApOwoJCQkvKgoJCQkgKiAgICAgIE9uIGEgYm9hcmQgd2l0aCBhIHNpbmdsZSBjb2RlYyB5b3Ugd29uJ3QgZ2V0IHRoZQoJCQkgKiAgICAgIHN1cnJvdW5kLiBPbiBvdGhlciBib2FyZHMgY29uZmlndXJlIGl0LgoJCQkgKi8KCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbMV0gIT0gTlVMTCkgewoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHgzNiwgMCk7CgkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDM4LCAwKTsKCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MDIsIDB4MDYwNik7CgkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDE4LCAweDAzMDMpOwoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHg3NCwgMHgzKTsKCQkJfQoJCQlyZXR1cm4gMTsKCQl9Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIHZvaWQKYWxpX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCWludCBiYW5rOwoKCWlmIChjaGFubmVsID4gMzEpCgkJcmV0dXJuOwoKCWJhbmsgPSBjaGFubmVsID4+IDU7CgljaGFubmVsID0gY2hhbm5lbCAmIDB4MWY7CgoJY2FyZC0+YmFua3NbYmFua10uYml0bWFwICY9IH4oMSA8PCAoY2hhbm5lbCkpOwp9CgpzdGF0aWMgaW50CmFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgaW50IGNoYW5fbnVtcykKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnM7CglpbnQgaSwgc3RhdGVfY291bnQgPSAwOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsOwoJdW5zaWduZWQgbG9uZyBudW07CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWlmIChjaGFuX251bXMgIT0gNikKCQlyZXR1cm4gMDsKCglmb3IgKGkgPSAwOyAoaSA8IEFMSV9DSEFOTkVMUykgJiYgKHN0YXRlX2NvdW50ICE9IDQpOyBpKyspIHsKCQlpZiAoY2FyZC0+c3RhdGVzW2ldKQoJCQljb250aW51ZTsKCgkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgbnVtKSkpIHsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgbnVtOwoJCQljaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW251bV07CgkJCWNoYW5uZWwtPm51bSA9IG51bTsKCQl9IGVsc2UgewoJCQlzdGF0ZV9jb3VudC0tOwoJCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOwoJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCQkJYWxpX2ZyZWVfcGNtX2NoYW5uZWwoY2FyZCwgbnVtKTsKCQkJfQoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQlzID0gY2FyZC0+c3RhdGVzW2ldID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CgkJaWYgKCFzKSB7CgkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCQlzdGF0ZV9jb3VudC0tOwoJCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOwoJCQl9CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQltZW1zZXQocywgMCwgc2l6ZW9mKCpzdGF0ZSkpOwoKCQlzLT5kbWFidWYuY2hhbm5lbCA9IGNoYW5uZWw7CgkJcy0+ZG1hYnVmLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYWJ1Zi5vc3NtYXhmcmFncyA9CgkJCXMtPmRtYWJ1Zi5zdWJkaXZpc2lvbiA9IDA7CgkJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hYnVmLndhaXQpOwoJCXMtPm1hZ2ljID0gY2FyZC0+bWFnaWM7CgkJcy0+Y2FyZCA9IGNhcmQ7CgkJcy0+dmlydCA9IGk7CgkJYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwocyk7CgkJc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudCsrXSA9IHM7Cgl9CgoJaWYgKHN0YXRlX2NvdW50ICE9IDQpIHsKCQlzdGF0ZV9jb3VudC0tOwoJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CgkJCWtmcmVlKHN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnRdKTsKCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCWFsaV9mcmVlX3BjbV9jaGFubmVsKGNhcmQsIG51bSk7CgkJfQoJCXJldHVybiAtRUJVU1k7Cgl9CglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QTQovKiBzYXZlIHJlZ2lzdGVycyBmb3IgQUxpIFBvd2VyIE1hbmFnZW1lbnQgKi8Kc3RhdGljIHN0cnVjdCBhbGlfc2F2ZWRfcmVnaXN0ZXJzIHsKCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX3JlZ3NbQUxJX0dMT0JBTF9SRUdTXTsKCXVuc2lnbmVkIGxvbmcgY2hhbm5lbF9yZWdzW0FMSV9DSEFOTkVMU11bQUxJX0NIQU5ORUxfUkVHU107Cgl1bnNpZ25lZCBtaXhlcl9yZWdzW0FMSV9NSVhFUl9SRUdTXTsKfSBhbGlfcmVnaXN0ZXJzOwoKc3RhdGljIHZvaWQKYWxpX3NhdmVfcmVncyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IGksIGo7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkvL2FsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0gPSBpbmwoVFJJRF9SRUcoY2FyZCxUNERfU1RBUlRfQSkpOyAgICAKCWFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMV0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX1NUT1BfQSkpOwoKCS8vZGlzYWJsZSBhbGwgSVJRIGJpdHMKCW91dGwoQUxJX0RJU0FCTEVfQUxMX0lSUSwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCglmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKCQlhbGlfcmVnaXN0ZXJzLm1peGVyX3JlZ3NbaV0gPSBhbGlfYWM5N19yZWFkKGNhcmQtPmFjOTdfY29kZWNbMF0sIAoJCQkJCQkJICAgIGkgKiAyKTsKCglmb3IgKGkgPSAwOyBpIDwgQUxJX0dMT0JBTF9SRUdTOyBpKyspIHsKCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkpCgkJCWNvbnRpbnVlOwoJCWFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbaV0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgaSAqIDQpKTsKCX0KCglmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CgkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKCQkJYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgCgkJCQkJCQkJCWogKiA0ICsgMHhlMCkpOwoJfQoKCS8vU3RvcCBhbGwgSFcgY2hhbm5lbAoJb3V0bChBTElfU1RPUF9BTExfQ0hBTk5FTFMsIFRSSURfUkVHKGNhcmQsIFQ0RF9TVE9QX0EpKTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9yZXN0b3JlX3JlZ3Moc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBpLCBqOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgoJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCgkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgaSAqIDIsIAoJCQkgICAgICAgYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldKTsKCglmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CgkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKCQkJb3V0bChhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSwgCgkJCSAgICAgVFJJRF9SRUcoY2FyZCwgaiAqIDQgKyAweGUwKSk7Cgl9CgoJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7CgkJaWYgKChpICogNCA9PSBUNERfTUlTQ0lOVCkgfHwgKGkgKiA0ID09IFQ0RF9TVE9QX0EpIHx8IAoJCSAgICAoaSAqIDQgPT0gVDREX1NUQVJUX0EpKQoJCQljb250aW51ZTsKCQlvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbaV0sIFRSSURfUkVHKGNhcmQsIGkgKiA0KSk7Cgl9CgoJLy9zdGFydCBIVyBjaGFubmVsCglvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0sIFRSSURfUkVHKGNhcmQsIFQ0RF9TVEFSVF9BKSk7CgkvL3Jlc3RvcmUgSVJRIGVuYWJsZSBiaXRzCglvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyY10sIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgdW51c2VkKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJYWxpX3NhdmVfcmVncyhjYXJkKTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQlhbGlfcmVzdG9yZV9yZWdzKGNhcmQpOwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmCgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCmFsaV9hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuazsKCWludCBpZHg7CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiAKCSAgICAoQUxJX1NQRElGX09VVF9DSF9FTkFCTEUpKSB7CgkJaWR4ID0gQUxJX1NQRElGX09VVF9DSEFOTkVMOwoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHg7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCglmb3IgKGlkeCA9IEFMSV9QQ01fT1VUX0NIQU5ORUxfRklSU1Q7IGlkeCA8PSBBTElfUENNX09VVF9DSEFOTkVMX0xBU1Q7IAoJICAgICBpZHgrKykgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHg7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCgkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhbGlhYmxlICovCiNpZiAwIAoJcHJpbnRrKEtFUk5fRVJSICJhbGk6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOwojZW5kaWYgLyogMCAqLyAKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCmFsaV9hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiBBTElfU1BESUZfSU5fU1VQUE9SVCkKCQlpZHggPSBBTElfU1BESUZfSU5fQ0hBTk5FTDsKCWVsc2UKCQlpZHggPSBBTElfUENNX0lOX0NIQU5ORUw7CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOwoJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQljaGFubmVsLT5udW0gPSBpZHg7CgkJcmV0dXJuIGNoYW5uZWw7Cgl9CgoJLyogbm8gZnJlZSByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLwojaWYgMCAKCXByaW50ayhLRVJOX0VSUiAiYWxpOiBubyByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBCYW5rIEEuXG4iKTsKI2VuZGlmIC8qIDAgKi8gCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgcmF0ZSkKewoJdW5zaWduZWQgY2hhciBjaF9zdF9zZWw7Cgl1bnNpZ25lZCBzaG9ydCBzdGF0dXNfcmF0ZTsKCglzd2l0Y2ggKHJhdGUpIHsKCWNhc2UgNDQxMDA6CgkJc3RhdHVzX3JhdGUgPSAwOwoJCWJyZWFrOwoJY2FzZSAzMjAwMDoKCQlzdGF0dXNfcmF0ZSA9IDB4MzAwOwoJCWJyZWFrOwoJY2FzZSA0ODAwMDoKCWRlZmF1bHQ6CgkJc3RhdHVzX3JhdGUgPSAweDIwMDsKCQlicmVhazsKCX0KCgkvKiBzZWxlY3Qgc3BkaWZfb3V0ICovIAoJY2hfc3Rfc2VsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSkgJiBBTElfU1BESUZfT1VUX0NIX1NUQVRVUzsKCgljaF9zdF9zZWwgfD0gMHg4MDsJLyogc2VsZWN0IHJpZ2h0ICovIAoJb3V0YihjaF9zdF9zZWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglvdXRiKHN0YXR1c19yYXRlIHwgMHgyMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMikpOwoKCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvKiBzZWxlY3QgbGVmdCAqLyAKCW91dGIoY2hfc3Rfc2VsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJb3V0dyhzdGF0dXNfcmF0ZSB8IDB4MTAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKfQoKc3RhdGljIHZvaWQKYWxpX2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBpLCBjaGFubmVsOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOwoJdTMyIG1hc2ssIGNoYW5uZWxfbWFzazsKCgltYXNrID0gdHJpZGVudF9nZXRfaW50ZXJydXB0X21hc2soY2FyZCwgMCk7Cglmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pID09IE5VTEwpCgkJCWNvbnRpbnVlOwoJCWNoYW5uZWwgPSBzdGF0ZS0+ZG1hYnVmLmNoYW5uZWwtPm51bTsKCQlpZiAoKGNoYW5uZWxfbWFzayA9IDEgPDwgY2hhbm5lbCkgJiBtYXNrKSB7CgkJCW1hc2sgJj0gfmNoYW5uZWxfbWFzazsKCQkJdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCk7CgkJCXVkZWxheSgxMDApOwoJCQlzdGF0ZS0+ZG1hYnVmLnVwZGF0ZV9mbGFnIHw9IEFMSV9BRERSRVNTX0lOVF9VUERBVEU7CgkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJfQoJfQoJaWYgKG1hc2spIHsKCQlmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCQlpZiAobWFzayAmICgxIDw8IGkpKSB7CgkJCQlwcmludGsoImFsaTogc3B1cmlvdXMgY2hhbm5lbCBpcnEgJWQuXG4iLCBpKTsKCQkJCXRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGkpOwoJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGkpOwoJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBpKTsKCQkJfQoJCX0KCX0KfQoKLyogVXBkYXRpbmcgdGhlIHZhbHVlcyBvZiBjb3VudGVycyBvZiBvdGhlcl9zdGF0ZXMnIERNQXMgd2l0aG91dCBsb2NrIApwcm90ZWN0aW9uIGlzIG5vIGhhcm0gYmVjYXVzZSBhbGwgRE1BcyBvZiBtdWx0aS1jaGFubmVscyBhbmQgaW50ZXJydXB0CmRlcGVuZCBvbiBhIG1hc3RlciBzdGF0ZSdzIERNQSwgYW5kIGNoYW5naW5nIHRoZSBjb3VudGVycyBvZiB0aGUgbWFzdGVyCnN0YXRlIERNQSBpcyBwcm90ZWN0ZWQgYnkgYSBzcGlubG9jay4KKi8Kc3RhdGljIGludAphbGlfd3JpdGVfNV8xKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgCgkgICAgICBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsIAoJICAgICAgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpCnsKCglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1Zl90ZW1wOwoJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciA9IGJ1ZjsKCXVuc2lnbmVkIHN3cHRyLCBvdGhlcl9kbWFfbnVtcywgc2FtcGxlX3M7Cgl1bnNpZ25lZCBpbnQgaSwgbG9vcDsKCglvdGhlcl9kbWFfbnVtcyA9IDQ7CglzYW1wbGVfcyA9IHNhbXBsZV9zaXplW2RtYWJ1Zi0+Zm10XSA+PiAxOwoJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwoKCWlmICgoaSA9IHN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQpID4gMCkgewoJCWlmIChpID09IDEpIHsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQkJaS0tOwoJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CgkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQrKzsKCQl9IGVsc2UKCQkJaSA9IGkgLSAoc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zKTsKCQlmb3IgKDsgKGkgPCBvdGhlcl9kbWFfbnVtcykgJiYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApOyBpKyspIHsKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQl9CgkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA9PSAwKQoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ICs9IGk7Cgl9CglpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCWxvb3AgPSBjbnRfZm9yX211bHRpX2NoYW5uZWwgLyAoc3RhdGUtPmNoYW5zX251bSAqIHNhbXBsZV9zKTsKCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIAoJCQkJCSAgIHNhbXBsZV9zICogMikpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcyAqIDIsICpjb3B5X2NvdW50KTsKCQkJKCpzdGF0ZV9jbnQpICs9IChzYW1wbGVfcyAqIDIpOwoKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgoJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWY7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQl9CgoJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CgkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgPSBjbnRfZm9yX211bHRpX2NoYW5uZWwgLyBzYW1wbGVfczsKCgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKCgkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CgkJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKCgkJCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCQkJCWludCBkaWZmID0gc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zOwoJCQkJCWxvb3AgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50IC0gZGlmZjsKCQkJCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7CgkJCQkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKCQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyAKCQkJCQkJCQkgICBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCAKCQkJCQkJCSAgICBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlCgkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgPSAwOwoJfQoJZm9yIChpID0gMDsgaSA8IG90aGVyX2RtYV9udW1zOyBpKyspIHsKCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CgkJZG1hYnVmX3RlbXAtPnN3cHRyID0gZG1hYnVmX3RlbXAtPnN3cHRyICUgZG1hYnVmX3RlbXAtPmRtYXNpemU7Cgl9CglyZXR1cm4gKnN0YXRlX2NudDsKfQoKc3RhdGljIHZvaWQKYWxpX2ZyZWVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCWludCBpOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnM7Cgl1bnNpZ25lZCBvdGhlcl9zdGF0ZXNfY291bnQ7CgoJb3RoZXJfc3RhdGVzX2NvdW50ID0gc3RhdGUtPmNoYW5zX251bSAtIDI7IC8qIGV4Y2VwdCBQQ00gTC9SIGNoYW5uZWxzICovCglmb3IgKGkgPSAwOyBpIDwgb3RoZXJfc3RhdGVzX2NvdW50OyBpKyspIHsKCQlzID0gc3RhdGUtPm90aGVyX3N0YXRlc1tpXTsKCQlkZWFsbG9jX2RtYWJ1Zigmcy0+ZG1hYnVmLCBjYXJkLT5wY2lfZGV2KTsKCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwocy0+Y2FyZCwgcy0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwocy0+Y2FyZCwgcy0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJY2FyZC0+c3RhdGVzW3MtPnZpcnRdID0gTlVMTDsKCQlrZnJlZShzKTsKCX0KfQoKc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVzOwoKc3RhdGljIGludAphbGlfd3JpdGVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGRhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJY2hhciBjOwoKCWlmIChjb3VudCA8IDApCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gMDsKCWlmIChnZXRfdXNlcihjLCBidWZmZXIpKQoJCXJldHVybiAtRUZBVUxUOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cglzd2l0Y2ggKGMpIHsKCWNhc2UgJzAnOgoJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1BDTV9UT19TUERJRl9PVVQpOwoJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfT1VUX0NIQU5ORUwpOwoJCWJyZWFrOwoJY2FzZSAnMSc6CgkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8IAoJCQkJICAgIEFMSV9TUERJRl9PVVRfUENNKTsKCQlicmVhazsKCWNhc2UgJzInOgoJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfCAKCQkJCSAgICBBTElfU1BESUZfT1VUX05PTl9QQ00pOwoJCWJyZWFrOwoJY2FzZSAnMyc6CgkJYWxpX2Rpc2FibGVfc3BkaWZfaW4oY2FyZCk7CS8vZGVmYXVsdAoJCWJyZWFrOwoJY2FzZSAnNCc6CgkJYWxpX3NldHVwX3NwZGlmX2luKGNhcmQpOwoJCWJyZWFrOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoKCXJldHVybiBjb3VudDsKfQoKLyogT1NTIC9kZXYvbWl4ZXIgZmlsZSBvcGVyYXRpb24gbWV0aG9kcyAqLwpzdGF0aWMgaW50CnRyaWRlbnRfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWludCBpID0gMDsKCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZGV2czsKCglmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KQoJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCgkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYgCgkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCgkJCQlnb3RvIG1hdGNoOwoKCWlmICghY2FyZCkgewoJCXJldHVybiAtRU5PREVWOwoJfQogICAgICBtYXRjaDoKCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQtPmFjOTdfY29kZWNbaV07CgoJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCAKCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwoKCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKfQoKc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmlkZW50X21peGVyX2ZvcHMgPSB7Cgkub3duZXIgPSBUSElTX01PRFVMRSwKCS5sbHNlZWsgPSBub19sbHNlZWssCgkuaW9jdGwgPSB0cmlkZW50X2lvY3RsX21peGRldiwKCS5vcGVuID0gdHJpZGVudF9vcGVuX21peGRldiwKfTsKCnN0YXRpYyBpbnQKYWxpX3Jlc2V0XzU0NTEoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwoJdW5zaWduZWQgaW50IGR3VmFsOwoJdW5zaWduZWQgc2hvcnQgd0NvdW50LCB3UmVnOwoKCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAoJCQkJIHBjaV9kZXYpOwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsIGR3VmFsIHwgMHgwODAwMDAwMCk7Cgl1ZGVsYXkoNTAwMCk7CglwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgJmR3VmFsKTsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgZHdWYWwgJiAweGY3ZmZmZmZmKTsKCXVkZWxheSg1MDAwKTsKCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwoKCXBjaV9kZXYgPSBjYXJkLT5wY2lfZGV2OwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsICZkd1ZhbCk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsIGR3VmFsIHwgMHgwMDBjMDAwMCk7Cgl1ZGVsYXkoNTAwKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCAmZHdWYWwpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCBkd1ZhbCAmIDB4ZmZmYmZmZmYpOwoJdWRlbGF5KDUwMDApOwoKCS8qIFRPRE86IHJlY29nbml6ZSBpZiB3ZSBoYXZlIGEgUE0gY2FwYWJsZSBjb2RlYyBhbmQgb25seSBkbyB0aGlzICovCgkvKiBpZiB0aGUgY29kZWMgaXMgUE0gY2FwYWJsZSAqLwoJd0NvdW50ID0gMjAwMDsKCXdoaWxlICh3Q291bnQtLSkgewoJCXdSZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKCQlpZiAoKHdSZWcgJiAweDAwMGYpID09IDB4MDAwZikKCQkJcmV0dXJuIDA7CgkJdWRlbGF5KDUwMDApOwoJfQoJLyogVGhpcyBpcyBub24gZmF0YWwgaWYgeW91IGhhdmUgYSBub24gUE0gY2FwYWJsZSBjb2RlYy4uICovCglyZXR1cm4gMDsKfQoKLyogQUM5NyBjb2RlYyBpbml0aWFsaXNhdGlvbi4gKi8Kc3RhdGljIGludCBfX2RldmluaXQKdHJpZGVudF9hYzk3X2luaXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJaW50IG51bV9hYzk3ID0gMDsKCXVuc2lnbmVkIGxvbmcgcmVhZHlfMm5kID0gMDsKCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKCWludCBpID0gMDsKCgkvKiBpbml0aWFsaXplIGNvbnRyb2xsZXIgc2lkZSBvZiBBQyBsaW5rLCBhbmQgZmluZCBvdXQgaWYgc2Vjb25kYXJ5IGNvZGVzCgkgICByZWFsbHkgZXhpc3QgKi8KCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgkJaWYgKGFsaV9yZXNldF81NDUxKGNhcmQpKSB7CgkJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudF9hYzk3X2luaXQ6IGVycm9yICIKCQkJICAgICAgICJyZXNldHRpbmcgNTQ1MS5cbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCW91dGwoMHg4MDAwMDAwMSwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgkJb3V0bCgweDAwMDAwMDAwLCBUUklEX1JFRyhjYXJkLCBUNERfQUlOVEVOX0EpKTsKCQlvdXRsKDB4ZmZmZmZmZmYsIFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0EpKTsKCQlvdXRsKDB4MDAwMDAwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NVVNJQ1ZPTF9XQVZFVk9MKSk7CgkJb3V0YigweDEwLCBUUklEX1JFRyhjYXJkLCBBTElfTVBVUjIpKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgkJcmVhZHlfMm5kICY9IDB4M2ZmZjsKCQlvdXRsKHJlYWR5XzJuZCB8IFBDTU9VVCB8IDB4ODAwMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlpZiAoY2FyZC0+cmV2aXNpb24gPCBBTElfNTQ1MV9WMDIpCgkJCXJlYWR5XzJuZCA9IDA7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQkvKiBkaXNhYmxlIEFDOTcgR1BJTyBpbnRlcnJ1cHQgKi8KCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOwoJCS8qIHdoZW4gcG93ZXIgdXAgdGhlIEFDIGxpbmsgaXMgaW4gY29sZCByZXNldCBtb2RlIHNvIHN0b3AgaXQgKi8KCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQgfCBTRUNPTkRBUllfSUQsIAoJCSAgICAgVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwoJCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAqLyAKCQkvKiAoZXNwZWNpYWxseSB3aGVuIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29kZWMpICovCgkJdWRlbGF5KDIwMDApOwoJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CgkJcmVhZHlfMm5kICY9IFNJX0FDOTdfU0VDT05EQVJZX1JFQURZOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJCS8qIHBsYXliYWNrIG9uICovCgkJb3V0bChEWF9BQzk3X1BMQVlCQUNLLCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKCQkvKiBlbmFibGUgQUM5NyBPdXRwdXQgU2xvdCAzLDQgKFBDTSBMZWZ0L1JpZ2h0IFBsYXliYWNrKSAqLwoJCW91dGwoTlhfQUM5N19QQ01fT1VUUFVULCBUUklEX1JFRyhjYXJkLCBOWF9BQ1IwX0FDOTdfQ09NX1NUQVQpKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CgkJcmVhZHlfMm5kICY9IE5YX0FDOTdfU0VDT05EQVJZX1JFQURZOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLwoJCW91dGwoMHgwMCwgVFJJRF9SRUcoY2FyZCwgU0lfQUM5N19HUElPKSk7CgkJLyogd2hlbiBwb3dlciB1cCwgdGhlIEFDIGxpbmsgaXMgaW4gY29sZCByZXNldCBtb2RlLCBzbyBzdG9wIGl0ICovCgkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VULCAKCQkgICAgIFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKGVzcGVjaWFsbHkgKi8gCgkJLyogd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLwoJCXVkZWxheSgyMDAwKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlicmVhazsKCX0KCglmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7CgkJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKCQkJcmV0dXJuIC1FTk9NRU07CgoJCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzICovIAoJCS8qIHdpbGwgYmUgZmlsbGVkIGluIGFjOTdfcHJvYmVfY29kZWMgKi8KCQljb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKCgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWNvZGVjLT5jb2RlY19yZWFkID0gYWxpX2FjOTdfcmVhZDsKCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gYWxpX2FjOTdfd3JpdGU7CgkJfSBlbHNlIHsKCQkJY29kZWMtPmNvZGVjX3JlYWQgPSB0cmlkZW50X2FjOTdfZ2V0OwoJCQljb2RlYy0+Y29kZWNfd3JpdGUgPSB0cmlkZW50X2FjOTdfc2V0OwoJCX0KCgkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApCgkJCWJyZWFrOwoKCQljb2RlYy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnRyaWRlbnRfbWl4ZXJfZm9wcywgLTEpOwoJCWlmIChjb2RlYy0+ZGV2X21peGVyIDwgMCkgewoJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGNvdWxkbid0IHJlZ2lzdGVyIG1peGVyIVxuIik7CgkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CgkJCWJyZWFrOwoJCX0KCgkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBjb2RlYzsKCgkJLyogaWYgdGhlcmUgaXMgbm8gc2Vjb25kYXJ5IGNvZGVjIGF0IGFsbCwgZG9uJ3QgcHJvYmUgYW55IG1vcmUgKi8KCQlpZiAoIXJlYWR5XzJuZCkKCQkJYnJlYWs7Cgl9CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgewoJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPT0gTlVMTCkKCQkJCWJyZWFrOwoJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewoJCQkJdTE2IHJlZyA9IGFsaV9hYzk3X2dldChjYXJkLCBudW1fYWM5NywgaSAqIDIpOwoJCQkJY2FyZC0+bWl4ZXJfcmVnc1tpXVtudW1fYWM5N10gPSByZWc7CgkJCX0KCQl9Cgl9CglyZXR1cm4gbnVtX2FjOTcgKyAxOwp9CgojaWZkZWYgU1VQUE9SVF9KT1lTVElDSwovKiBHYW1lcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBjYXJkcyBBREMgZ2FtZXBvcnQgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaWRlbnRfZ2FtZV9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoKCXJldHVybiBpbmIoVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfTEVHKSk7Cn0KCnN0YXRpYyB2b2lkIHRyaWRlbnRfZ2FtZV90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoKCW91dGIoMHhmZiwgVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfTEVHKSk7Cn0KCnN0YXRpYyBpbnQgdHJpZGVudF9nYW1lX2Nvb2tlZF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsCgkJCQkgICAgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoJaW50IGk7CgoJKmJ1dHRvbnMgPSAofmluYihUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKSA+PiA0KSAmIDB4ZjsKCglmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkJYXhlc1tpXSA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9BWEQpICsgaSAqIHNpemVvZiAodTE2KSk7CgkJaWYgKGF4ZXNbaV0gPT0gMHhmZmZmKQoJCQlheGVzW2ldID0gLTE7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgdHJpZGVudF9nYW1lX29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoKCXN3aXRjaCAobW9kZSkgewoJY2FzZSBHQU1FUE9SVF9NT0RFX0NPT0tFRDoKCQlvdXRiKDB4ODAsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0NSKSk7CgkJbXNsZWVwKDIwKTsKCQlyZXR1cm4gMDsKCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CgkJb3V0YigweDAwLCBUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9DUikpOwoJCXJldHVybiAwOwoJZGVmYXVsdDoKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IGdhbWVwb3J0ICpncDsKCgljYXJkLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwoJaWYgKCFncCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglnYW1lcG9ydF9zZXRfbmFtZShncCwgIlRyaWRlbnQgNERXYXZlIik7CglnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKCWdwLT5yZWFkID0gdHJpZGVudF9nYW1lX3JlYWQ7CglncC0+dHJpZ2dlciA9IHRyaWRlbnRfZ2FtZV90cmlnZ2VyOwoJZ3AtPmNvb2tlZF9yZWFkID0gdHJpZGVudF9nYW1lX2Nvb2tlZF9yZWFkOwoJZ3AtPm9wZW4gPSB0cmlkZW50X2dhbWVfb3BlbjsKCWdwLT5mdXp6ID0gNjQ7CglncC0+cG9ydF9kYXRhID0gY2FyZDsKCglnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglpZiAoY2FyZC0+Z2FtZXBvcnQpCgkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGNhcmQtPmdhbWVwb3J0KTsKfQoKI2Vsc2UKc3RhdGljIGlubGluZSBpbnQgdHJpZGVudF9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKSB7IHJldHVybiAtRU5PU1lTOyB9CnN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkZW50X3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkgeyB9CiNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCgovKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyICovIAovKiBub3csIHRoZXkgYXJlIGRlZmVyZWQgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5ICovIAovKiBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8Kc3RhdGljIGludCBfX2RldmluaXQKdHJpZGVudF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKewoJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkOwoJdTggYml0czsKCXU4IHJldmlzaW9uOwoJaW50IGkgPSAwOwoJdTE2IHRlbXA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9tMTUzMyA9IE5VTEw7CglpbnQgcmMgPSAtRU5PREVWOwoJdTY0IGRtYV9tYXNrOwoKCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKCQlnb3RvIG91dDsKCglpZiAocGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpCgkJZG1hX21hc2sgPSBBTElfRE1BX01BU0s7CgllbHNlCgkJZG1hX21hc2sgPSBUUklERU5UX0RNQV9NQVNLOwoJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgZG1hX21hc2spKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIgCgkJICAgICAgICIgJXMgUENJIGJ1c21hc3RlciBETUFcbiIsIAoJCSAgICAgICBwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSA/IAoJCSAgICAgICAiMzItYml0IiA6ICIzMC1iaXQiKTsKCQlnb3RvIG91dDsKCX0KCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKCglpZiAocGNpX2lkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkKCQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMSk7CgllbHNlCgkJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOwoKCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCAyNTYsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0pKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjYW4ndCBhbGxvY2F0ZSBJL08gc3BhY2UgYXQgIgoJCSAgICAgICAiMHglNC40bHhcbiIsIGlvYmFzZSk7CgkJZ290byBvdXQ7Cgl9CgoJcmMgPSAtRU5PTUVNOwoJaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2YoKmNhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogb3V0IG9mIG1lbW9yeVxuIik7CgkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Cgl9CgltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mICgqY2FyZCkpOwoKCWluaXRfdGltZXIoJmNhcmQtPnRpbWVyKTsKCWNhcmQtPmlvYmFzZSA9IGlvYmFzZTsKCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2X2dldChwY2lfZGV2KTsKCWNhcmQtPnBjaV9pZCA9IHBjaV9pZC0+ZGV2aWNlOwoJY2FyZC0+cmV2aXNpb24gPSByZXZpc2lvbjsKCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKCWNhcmQtPm5leHQgPSBkZXZzOwoJY2FyZC0+bWFnaWMgPSBUUklERU5UX0NBUkRfTUFHSUM7CgljYXJkLT5iYW5rc1tCQU5LX0FdLmFkZHJlc3NlcyA9ICZiYW5rX2FfYWRkcnM7CgljYXJkLT5iYW5rc1tCQU5LX0FdLmJpdG1hcCA9IDBVTDsKCWNhcmQtPmJhbmtzW0JBTktfQl0uYWRkcmVzc2VzID0gJmJhbmtfYl9hZGRyczsKCWNhcmQtPmJhbmtzW0JBTktfQl0uYml0bWFwID0gMFVMOwoKCW11dGV4X2luaXQoJmNhcmQtPm9wZW5fbXV0ZXgpOwoJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwoJaW5pdF90aW1lcigmY2FyZC0+dGltZXIpOwoKCWRldnMgPSBjYXJkOwoKCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwoKCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6ICVzIGZvdW5kIGF0IElPIDB4JTA0bHgsIElSUSAlZFxuIiwgCgkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCS8qIEFMaSBjaGFubmVsIE1hbmFnZW1lbnQgKi8KCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGFsaV9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBhbGlfZnJlZV9wY21fY2hhbm5lbDsKCgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQgPSBhbGlfYWRkcmVzc19pbnRlcnJ1cHQ7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSBmb3Igc3BkaWYgaW4gKi8KCQljYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9IDA7CgkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKCgkJLyogQUxpIFNQRElGIE9VVCBmdW5jdGlvbiAqLwoJCWlmIChjYXJkLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIHsKCQkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfUENNX1RPX1NQRElGX09VVCk7CgkJCXJlcyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJBTGk1NDUxIiwgMCwgTlVMTCk7CgkJCWlmIChyZXMpIHsKCQkJCXJlcy0+d3JpdGVfcHJvYyA9IGFsaV93cml0ZV9wcm9jOwoJCQkJcmVzLT5kYXRhID0gY2FyZDsKCQkJfQoJCX0KCgkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KCQljYXJkLT5od3ZvbGN0bCA9IDA7CgkJcGNpX2Rldl9tMTUzMyA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCAKCQkJCQkJUENJX0RFVklDRV9JRF9BTF9NMTUzMywgCgkJCQkJCXBjaV9kZXZfbTE1MzMpOwoJCXJjID0gLUVOT0RFVjsKCQlpZiAocGNpX2Rldl9tMTUzMyA9PSBOVUxMKQoJCQlnb3RvIG91dF9wcm9jX2ZzOwoJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4NjMsICZiaXRzKTsKCQlpZiAoYml0cyAmICgxIDw8IDUpKQoJCQljYXJkLT5od3ZvbGN0bCA9IDE7CgkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CgkJCS8qIENsZWFyIG0xNTMzIHBjaSBjZmcgNzhoIGJpdCAzMCB0byB6ZXJvLCB3aGljaCBtYWtlcwoJCQkgICBHUElPMTEvMTIvMTMgd29yayBhcyBBQ0dQX1VQL0RPV04vTVVURS4gKi8KCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2Rldl9tMTUzMywgMHg3YiwgJmJpdHMpOwoJCQliaXRzICY9IDB4YmY7CS8qY2xlYXIgYml0IDYgKi8KCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4N2IsIGJpdHMpOwoJCX0KCX0gZWxzZSBpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBjeWJlcl9mcmVlX3BjbV9jaGFubmVsOwoJCWNhcmQtPmFkZHJlc3NfaW50ZXJydXB0ID0gY3liZXJfYWRkcmVzc19pbnRlcnJ1cHQ7CgkJY3liZXJfaW5pdF9yaXR1YWwoY2FyZCk7Cgl9IGVsc2UgewoJCWNhcmQtPmFsbG9jX3BjbV9jaGFubmVsID0gdHJpZGVudF9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2ZyZWVfcGNtX2NoYW5uZWw7CgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQgPSB0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0OwoJfQoKCS8qIGNsYWltIG91ciBpcnEgKi8KCXJjID0gLUVOT0RFVjsKCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZ0cmlkZW50X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCgkJCWNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCAKCQkgICAgICAgY2FyZC0+aXJxKTsKCQlnb3RvIG91dF9wcm9jX2ZzOwoJfQoJLyogcmVnaXN0ZXIgL2Rldi9kc3AgKi8KCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZ0cmlkZW50X2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjb3VsZG4ndCByZWdpc3RlciBEU1AgZGV2aWNlIVxuIik7CgkJZ290byBvdXRfZnJlZV9pcnE7Cgl9CgljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMDsKCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLwoJaWYgKHRyaWRlbnRfYWM5N19pbml0KGNhcmQpIDw9IDApIHsKCQkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKSB7CgkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKCQkJCXN0cnVjdCBhYzk3X2NvZGVjKiBjb2RlYyA9IGNhcmQtPmFjOTdfY29kZWNbaV07CgkJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNvZGVjLT5kZXZfbWl4ZXIpOwoJCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKCQkJfQoJCX0KCQlnb3RvIG91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDsKCX0KCWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkgPSAxOwoJb3V0bCgweDAwLCBUUklEX1JFRyhjYXJkLCBUNERfTVVTSUNWT0xfV0FWRVZPTCkpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCS8qIEFkZCBIL1cgVm9sdW1lIENvbnRyb2wgQnkgTWF0dCBXdSBKdWwuIDA2LCAyMDAxICovCgkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CgkJCS8qIEVuYWJsZSBHUElPIElSUSAoTUlTQ0lOVCBiaXQgMThoKSAqLwoJCQl0ZW1wID0gaW53KFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOwoJCQl0ZW1wIHw9IDB4MDAwNDsKCQkJb3V0dyh0ZW1wLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKCgkJCS8qIEVuYWJsZSBIL1cgVm9sdW1lIENvbnRyb2wgR0xPVkFMIENPTlRST0wgYml0IDAgKi8KCQkJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQkJdGVtcCB8PSAweDAwMDE7CgkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgoJCX0KCQlpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQoJCQlhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHMoKTsKCQkvKiBlZGl0ZWQgYnkgSE1TRU8gZm9yIEdUIHNvdW5kICovCiNpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9OQVVUSUxVUykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEFfR0VORVJJQykKCQl7CgkJCXUxNiBhYzk3X2RhdGE7CgkJCWV4dGVybiBzdHJ1Y3QgaHdycGJfc3RydWN0ICpod3JwYjsKCgkJCWlmICgoaHdycGItPnN5c190eXBlKSA9PSAyMDEpIHsKCQkJCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6IFJ1bm5pbmcgb24gQWxwaGEgc3lzdGVtICIKCQkJCSAgICAgICAidHlwZSBOYXV0aWx1c1xuIik7CgkJCQlhYzk3X2RhdGEgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKCQkJCWFsaV9hYzk3X3NldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wsIAoJCQkJCSAgICAgYWM5N19kYXRhIHwgQUxJX0VBUERfUE9XRVJfRE9XTik7CgkJCX0KCQl9CiNlbmRpZgkJCQkvKiBDT05GSUdfQUxQSEFfTkFVVElMVVMgfHwgQ09ORklHX0FMUEhBX0dFTkVSSUMgKi8KCQkvKiBlZGl0ZWQgYnkgSE1TRU8gZm9yIEdUIHNvdW5kICovCgl9CglyYyA9IDA7CglwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2FyZCk7CgoJLyogRW5hYmxlIEFkZHJlc3MgRW5naW5lIEludGVycnVwdHMgKi8KCXRyaWRlbnRfZW5hYmxlX2xvb3BfaW50ZXJydXB0cyhjYXJkKTsKCgkvKiBSZWdpc3RlciBnYW1lcG9ydCAqLwoJdHJpZGVudF9yZWdpc3Rlcl9nYW1lcG9ydChjYXJkKTsKCm91dDoKCXJldHVybiByYzsKCm91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDoKCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7Cm91dF9mcmVlX2lycToKCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Cm91dF9wcm9jX2ZzOgoJcGNpX2Rldl9wdXQoY2FyZC0+cGNpX2Rldik7CglpZiAocmVzKSB7CgkJcmVtb3ZlX3Byb2NfZW50cnkoIkFMaTU0NTEiLCBOVUxMKTsKCQlyZXMgPSBOVUxMOwoJfQoJa2ZyZWUoY2FyZCk7CglkZXZzID0gTlVMTDsKb3V0X3JlbGVhc2VfcmVnaW9uOgoJcmVsZWFzZV9yZWdpb24oaW9iYXNlLCAyNTYpOwoJcmV0dXJuIHJjOyAKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0CnRyaWRlbnRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQp7CglpbnQgaTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CgoJLyoKCSAqICAgICAgS2lsbCBydW5uaW5nIHRpbWVycyBiZWZvcmUgdW5sb2FkLiBXZSBjYW4ndCBoYXZlIHRoZW0KCSAqICAgICAgZ29pbmcgb2ZmIGFmdGVyIHJtbW9kIQoJICovCglpZiAoY2FyZC0+aHd2b2xjdGwpCgkJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPnRpbWVyKTsKCgkvKiBBTGkgUy9QRElGIGFuZCBQb3dlciBNYW5hZ2VtZW50ICovCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9QQ01fVE9fU1BESUZfT1VUKTsKCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY2FyZCwgQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKCQlhbGlfZGlzYWJsZV9zcGRpZl9pbihjYXJkKTsKCQlyZW1vdmVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIE5VTEwpOwoJfQoKCS8qIFVucmVnaXN0ZXIgZ2FtZXBvcnQgKi8KCXRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChjYXJkKTsKCgkvKiBLaWxsIGludGVycnVwdHMsIGFuZCBTUC9ESUYgKi8KCXRyaWRlbnRfZGlzYWJsZV9sb29wX2ludGVycnVwdHMoY2FyZCk7CgoJLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CglyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDI1Nik7CgoJLyogdW5yZWdpc3RlciBhdWRpbyBkZXZpY2VzICovCglmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQoJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIpOwoJCQlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5N19jb2RlY1tpXSk7CgkJfQoJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKCglwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CglwY2lfZGV2X3B1dChjYXJkLT5wY2lfZGV2KTsKCWtmcmVlKGNhcmQpOwp9CgpNT0RVTEVfQVVUSE9SKCJBbGFuIENveCwgQWFyb24gSG9sdHptYW4sIE9sbGllIExobywgQ2hpbmcgTGluZyBMZWUsIE11bGkgQmVuLVllaHVkYSIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlRyaWRlbnQgNERXYXZlL1NpUyA3MDE4L0FMaSA1NDUxIGFuZCBUdmlhL0lHU1QgQ3liZXJQcm81MDUwIFBDSSAiCgkJICAgIkF1ZGlvIERyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgojZGVmaW5lIFRSSURFTlRfTU9EVUxFX05BTUUgInRyaWRlbnQiCgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHJpZGVudF9wY2lfZHJpdmVyID0gewoJLm5hbWUgPSBUUklERU5UX01PRFVMRV9OQU1FLAoJLmlkX3RhYmxlID0gdHJpZGVudF9wY2lfdGJsLAoJLnByb2JlID0gdHJpZGVudF9wcm9iZSwKCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cmlkZW50X3JlbW92ZSksCiNpZmRlZiBDT05GSUdfUE0KCS5zdXNwZW5kID0gdHJpZGVudF9zdXNwZW5kLAoJLnJlc3VtZSA9IHRyaWRlbnRfcmVzdW1lCiNlbmRpZgp9OwoKc3RhdGljIGludCBfX2luaXQKdHJpZGVudF9pbml0X21vZHVsZSh2b2lkKQp7CglwcmludGsoS0VSTl9JTkZPICJUcmlkZW50IDREV2F2ZS9TaVMgNzAxOC9BTGkgNTQ1MSxUdmlhIEN5YmVyUHJvICIgCgkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgCgkgICAgICAgX19EQVRFX18gIlxuIik7CgoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRyaWRlbnRfcGNpX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdAp0cmlkZW50X2NsZWFudXBfbW9kdWxlKHZvaWQpCnsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHJpZGVudF9wY2lfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQodHJpZGVudF9pbml0X21vZHVsZSk7Cm1vZHVsZV9leGl0KHRyaWRlbnRfY2xlYW51cF9tb2R1bGUpOwo=