LyoKICoJT1NTIGRyaXZlciBmb3IgTGludXggMi5bNDZdLnggZm9yCiAqCiAqCVRyaWRlbnQgNEQtV2F2ZQogKglTaVMgNzAxOAogKglBTGkgNTQ1MQogKglUdmlhL0lHU1QgQ3liZXJQcm8gNTA1MAogKgogKglEcml2ZXI6IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCiAqICBCdWlsdCBmcm9tOgogKglMb3cgbGV2ZWwgY29kZTogPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+IGZyb20gQUxTQQogKglGcmFtZXdvcms6IFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4KICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPiAgCiAqCiAqICBIYWNrZWQgdXAgYnk6CiAqCUFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPgogKglPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+IFNpUyA3MDE4IEF1ZGlvIENvcmUgU3VwcG9ydAogKglDaGluZy1MaW5nIExlZSA8Y2xpbmctbGlAYWxpLmNvbS50dz4gQUxpIDU0NTEgQXVkaW8gQ29yZSBTdXBwb3J0IAogKglNYXR0IFd1IDxtYXR0d3VAYWNlcnNvZnRlY2guY29tLmNuPiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKICoJUGV0ZXIgV+RjaHRsZXIgPHB3YWVjaHRsZXJAbG9ld2Uta29tcC5kZT4gQ3liZXJQcm81MDUwIHN1cHBvcnQKICogICAgICBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICoKICoKICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqICBIaXN0b3J5CiAqICB2MC4xNC4xMGoKICogIAlKYW51YXJ5IDMgMjAwNCBFdWdlbmUgVGVvIDxldWdlbmV0ZW9AZXVnZW5ldGVvLm5ldD4KICogIAltaW5vciBjbGVhbnVwIHRvIHVzZSBwcl9kZWJ1ZyBpbnN0ZWFkIG9mIFRSREJHIHNpbmNlIGl0IGlzIGFscmVhZHkKICogIAlkZWZpbmVkIGluIGxpbnV4L2tlcm5lbC5oLgogKiAgdjAuMTQuMTBpCiAqICAgICAgRGVjZW1iZXIgMjkgMjAwMyBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICogICAgICBtYWpvciBjbGVhbnVwIGZvciAyLjYsIGZpeCBhIGZldyBlcnJvciBwYXRjaCBidWdsZXRzCiAqICAgICAgd2l0aCByZXR1cm5pbmcgd2l0aG91dCBwcm9wZXJseSBjbGVhbmluZyB1cCBmaXJzdCwKICogICAgICBnZXQgcmlkIG9mIGxvY2tfa2VybmVsKCkuCiAqICB2MC4xNC4xMGgKICoJU2VwdCAxMCAyMDAyIFBhc2NhbCBTY2htaWR0IDxkZXIuZXJlbWl0QGVtYWlsLmRlPgogKglhZGRlZCBzdXBwb3J0IGZvciBBTGkgNTQ1MSBqb3lzdGljayBwb3J0CiAqICB2MC4xNC4xMGcKICoJU2VwdCAwNSAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCWFkYXB0IHRvIG5ldyBwY2kgam95c3RpY2sgYXR0YWNobWVudCBpbnRlcmZhY2UKICogIHYwLjE0LjEwZgogKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBwYXRjaCBmcm9tIEVyaWMgTGVtYXIgKHZpYSBJYW4gU29ib3JvZmYpOiBpbiBzdXNwZW5kIGFuZCByZXN1bWUsIAogKiAgICAgIGZpeCB3cm9uZyBjYXN0IGZyb20gcGNpX2RldiogdG8gc3RydWN0IHRyaWRlbnRfY2FyZCouIAogKiAgdjAuMTQuMTBlCiAqICAgICAgSnVseSAxOSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIHJld3JpdGUgdGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbi9kZWFsbGNvYXRpb24gZnVuY3Rpb25zLCB0byBtYWtlIGl0IAogKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5IAogKiAgICAgIG9idGFpbmVkIHdpdGggcGNpX2FsbG9jX2NvbnNpc3RlbnQuIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZiAKICogICAgICBDT05GSUdfUFJPQ19GUyBhbmQgdmFyaW91cyBvdGhlciBjbGVhbnVwcy4KICogIHYwLjE0LjEwZAogKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBtYWRlIHNldmVyYWwgcHJpbnRrKEtFUk5fTk9USUNFLi4uKSBpbnRvIFRSREJHKC4uLiksIHRvIGF2b2lkIHNwYW1taW5nCiAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAogKiAgdjAuMTQuMTBjCiAqICAgICAgSnVseSAxNiAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIENsZWFuZWQgdXAgTGVpIEh1J3MgMC40LjEwIGRyaXZlciB0byBjb25mb3JtIHRvIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKICogICAgICBhbmQgdGhlIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAKICogIHYwLjE0LjEwYgogKiAgICAgIEp1bmUgMjMgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBhZGQgYSBtaXNzaW5nIHVubG9ja19zZXRfZm10LCByZW1vdmUgYSBzdXBlcmZsb3VzIGxvY2svdW5sb2NrIHBhaXIgCiAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uIAogKiAgdjAuMTQuMTBhCiAqICAgICAgSnVuZSAyMSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPiAKICogICAgICB1c2UgYSBkZWJ1ZyBtYWNybyBpbnN0ZWFkIG9mICNpZmRlZiBDT05GSUdfREVCVUcsIHRyaW0gdG8gODAgY29sdW1ucyAKICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAogKiAgdjAuMTQuMTAKICogICAgICBKdW5lIDYgMjAwMiBMZWkgSHUgPExlaV9odUBhbGkuY29tLnR3PgogKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEgCiAqICB2MC4xNC45ZQogKiAgICAgIEphbnVhcnkgMiAyMDAyIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4gYWRkZWQgZ2FtZXBvcnQKICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCiAqICB2MC4xNC45ZAogKiAgCU9jdG9iZXIgOCAyMDAxIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgogKgl1c2Ugc2V0X2N1cnJlbnRfc3RhdGUsIHByb3Blcmx5IHJlbGVhc2UgcmVzb3VyY2VzIG9uIGZhaWx1cmUgaW4KICoJdHJpZGVudF9wcm9iZSwgZ2V0IHJpZCBvZiBjaGVja19yZWdpb24KICogIHYwLjE0LjljCiAqCUF1Z3VzdCAxMCAyMDAxIFBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+CiAqCWFkZGVkIHN1cHBvcnQgZm9yIFR2aWEgKGZvcm1lcmx5IEludGVncmFwaGljcy9JR1NUKSBDeWJlclBybzUwNTAKICoJdGhpcyBjaGlwIGlzIG9mdGVuIGZvdW5kIGluIHNldHRvcCBib3hlcyAoY29tYmluZWQgdmlkZW8rYXVkaW8pCiAqICB2MC4xNC45YgogKglTd2l0Y2ggdG8gc3RhdGljIGlubGluZSBub3QgZXh0ZXJuIGlubGluZSAoZ2NjIDMpCiAqICB2MC4xNC45YQogKglBdWcgNiAyMDAxIEFsYW4gQ294CiAqCTAuMTQuOSBjcmFzaGVkIG9uIHJtbW9kIGR1ZSB0byBhIHRpbWVyL2JoIGxlZnQgcnVubmluZy4gU2ltcGxpZmllZAogKgl0aGUgZXhpc3RpbmcgbG9naWMgKHRoZSBCSCBkb2Vzbid0IGhlbHAgYXMgYWM5NyBpcyBsb2NrX2lycXNhdmUpCiAqCWFuZCB1c2VkIGRlbF90aW1lcl9zeW5jIHRvIGNsZWFuIHVwCiAqCUZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0aGUgQUxpIGNoYW5nZSBicm9rZSBteSBnZW5lcmljIGNhcmQKICogIHYwLjE0LjkKICoJSnVsIDEwIDIwMDEgTWF0dCBXdQogKglBZGQgSC9XIFZvbHVtZSBDb250cm9sCiAqICB2MC4xNC44YQogKglKdWx5IDcgMjAwMSBBbGFuIENveAogKglNb3ZlZCBNYXR0IFd1J3MgYWM5NyByZWdpc3RlciBjYWNoZSBpbnRvIHRoZSBjYXJkIHN0cnVjdHVyZQogKiAgdjAuMTQuOAogKglBcHIgMzAgMjAwMSBNYXR0IFd1CiAqCVNldCBFQlVGMSBhbmQgRUJVRjIgdG8gc3RpbGwgbW9kZQogKglBZGQgZGM5Ny9hYzk3IHJlc2V0IGZ1bmN0aW9uCiAqCUZpeCBwb3dlciBtYW5hZ2VtZW50OiBhbGlfcmVzdG9yZV9yZWdzCiAqICB1bnJlbGVhc2VkIAogKglNYXIgMDkgMjAwMSBNYXR0IFd1CiAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKICogIHYwLjE0LjcKICoJRmViIDA2IDIwMDEgTWF0dCBXdQogKglGaXggYWM5NyBpbml0aWFsaXphdGlvbgogKglGaXggYnVnOiBhbiBleHRyYSB0YWlsIHdpbGwgYmUgcGxheWVkIHdoZW4gcGxheWluZwogKglKYW4gMDUgMjAwMSBNYXR0IFd1CiAqCUltcGxlbWVudCBtdWx0aS1jaGFubmVscyBhbmQgUy9QRElGIGluIHN1cHBvcnQgZm9yIEFMaSAxNTM1KwogKiAgdjAuMTQuNiAKICoJTm92IDEgMjAwMCBDaGluZy1MaW5nIExlZQogKglGaXggdGhlIGJ1ZyBvZiBtZW1vcnkgbGVhayB3aGVuIHN3aXRjaGluZyA1LjEtY2hhbm5lbHMgdG8gMiBjaGFubmVscy4KICoJQWRkIGxvY2sgcHJvdGVjdGlvbiBpbnRvIGR5bmFtaWMgY2hhbmdpbmcgZm9ybWF0IG9mIGRhdGEuCiAqCU9jdCAxOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCTUuMS1jaGFubmVscyBzdXBwb3J0IGZvciBBTGkKICoJSnVuZSAyOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCVMvUERJRiBvdXQvaW4ocGxheWJhY2svcmVjb3JkKSBzdXBwb3J0IGZvciBBTGkgMTUzNSssIHVzaW5nIC9wcm9jIHRvIGJlIHNlbGVjdGVkIGJ5IHVzZXIKICoJU2ltcGxlIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgQUxpCiAqICB2MC4xNC41IE1heSAyMyAyMDAwIE9sbGllIExobwogKiAgCU1pc2MgYnVnIGZpeCBmcm9tIHRoZSBOZXQKICogIHYwLjE0LjQgTWF5IDIwIDIwMDAgQWFyb24gSG9sdHptYW4KICogIAlGaXgga2ZyZWUnZCBtZW1vcnkgYWNjZXNzIGluIHJlbGVhc2UKICogIAlGaXggcmFjZSBpbiBvcGVuIHdoaWxlIGxvb2tpbmcgZm9yIGEgZnJlZSB2aXJ0dWFsIGNoYW5uZWwgc2xvdAogKiAgCXJlbW92ZSBvcGVuX3dhaXQgd3EgKHdoaWNoIGFwcGVhcnMgdG8gYmUgdW51c2VkKQogKiAgdjAuMTQuMyBNYXkgMTAgMjAwMCBPbGxpZSBMaG8KICoJZml4ZWQgYSBzbWFsbCBidWcgaW4gdHJpZGVudF91cGRhdGVfcHRyLCB4bW1zIDEuMC4xIG5vIGxvbmdlciB1c2VzIDEwMCUgQ1BVCiAqICB2MC4xNC4yIE1hciAyOSAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFkZCBjbGVhciB0byBzaWxlbmNlIGFkdmFuY2UgaW4gdHJpZGVudF91cGRhdGVfcHRyIAogKglmaXggaW52YWxpZCBkYXRhIG9mIHRoZSBlbmQgb2YgdGhlIHNvdW5kCiAqICB2MC4xNC4xIE1hciAyNCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFMaSA1NDUxIHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgTy5LLgogKglBTGkgNTQ1MSBvcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgc3RydWN0dXJlZCBiYXNlZCBvbiBzb25pY3ZpYmVzLCBhbmQKICoJc3VnZ2VzdGVkIHRvIG1lcmdlIGludG8gdGhpcyBmaWxlIGJ5IEFsYW4gQ294LgogKiAgdjAuMTQgTWFyIDE1IDIwMDAgT2xsaWUgTGhvCiAqCTUuMSBjaGFubmVsIG91dHB1dCBzdXBwb3J0IHdpdGggY2hhbm5lbCBiaW5kaW5nLiBXaGF0J3MgdGhlIE1hdHJpeCA/CiAqICB2MC4xMy4xIE1hciAxMCAyMDAwIE9sbGllIExobwogKglmZXcgbWlub3IgYnVncyBvbiBkdWFsIGNvZGVjIHN1cHBvcnQsIG5lZWRzIG1vcmUgdGVzdGluZwogKiAgdjAuMTMgTWFyIDAzIDIwMDAgT2xsaWUgTGhvCiAqCW5ldyBwY2lfKiBmb3IgMi40IGtlcm5lbCwgYmFjayBwb3J0ZWQgdG8gMi4yCiAqICB2MC4xMiBGZWIgMjMgMjAwMCBPbGxpZSBMaG8KICoJUHJlbGltaW5hcnkgUmVjb3JkaW5nIHN1cHBvcnQKICogIHYwLjExLjIgRmViIDE5IDIwMDAgT2xsaWUgTGhvCiAqCXJlbW92ZWQgaW5jb21wbGV0ZSBmdWxsLWR1bHBsZXggc3VwcG9ydAogKiAgdjAuMTEuMSBKYW4gMjggMjAwMCBPbGxpZSBMaG8KICoJc21hbGwgYnVnIGluIHNldHRpbmcgc2FtcGxlIHJhdGUgZm9yIDRkLW54IChyZXBvcnRlZCBieSBBYXJvbikKICogIHYwLjExIEphbiAyNyAyMDAwIE9sbGllIExobwogKglETUEgYnVnLCBzY2hlZHVsZXIgbGF0ZW5jeSwgc2Vjb25kIHRyeQogKiAgdjAuMTAgSmFuIDI0IDIwMDAgT2xsaWUgTGhvCiAqCURNQSBidWcgZml4ZWQsIGZvdW5kIGtlcm5lbCBzY2hlZHVsaW5nIHByb2JsZW0KICogIHYwLjA5IEphbiAyMCAyMDAwIE9sbGllIExobwogKglDbGVhbiB1cCBvZiBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lIChwcmVwYXJlIGZvciBjaGFubmVsIGJpbmRpbmcpCiAqICB2MC4wOCBKYW4gMTQgMjAwMCBPbGxpZSBMaG8KICoJSXNvbGF0aW9uIG9mIEFDOTcgY29kZWMgY29kZQogKiAgdjAuMDcgSmFuIDEzIDIwMDAgT2xsaWUgTGhvCiAqCUdldCByaWQgb2YgdWdseSBvbGQgbG93IGxldmVsIGFjY2VzcyByb3V0aW5lcyAoZS5nLiBDSFJlZ3MubHAqKioqKQogKiAgdjAuMDYgSmFuIDExIDIwMDAgT2xsaWUgTGhvCiAqCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGR1YWwgKG1vcmUgPykgQUM5NyBjb2RlY3MKICogIHYwLjA1IEphbiAwOCAyMDAwIEx1Y2EgTW9udGVjY2hpYW5pIDxtLmx1Y2FAaW5hbWUuY29tPgogKglhZGFwdCB0byAyLjMueCBuZXcgX19zZXR1cC9fX2luaXQgY2FsbAogKiAgdjAuMDQgRGVjIDMxIDE5OTkgT2xsaWUgTGhvCiAqCU11bHRpcGxlIE9wZW4sIHVzaW5nIE1pZGRsZSBMb29wIEludGVycnVwdCB0byBzbW9vdGggcGxheWJhY2sKICogIHYwLjAzIERlYyAyNCAxOTk5IE9sbGllIExobwogKgltZW0gbGVhayBpbiBwcm9nX2RtYWJ1ZiBhbmQgZGVhbGxvY19kbWFidWYgcmVtb3ZlZAogKiAgdjAuMDIgRGVjIDE1IDE5OTkgT2xsaWUgTGhvCiAqCVNpUyA3MDE4IHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIE8uSy4KICogIHYwLjAxIEFsYW4gQ294IGV0LiBhbC4KICoJSW5pdGlhbCBSZWxlYXNlIGluIGtlcm5lbCAyLjMuMzAsIGRvZXMgbm90IHdvcmsKICogCiAqICBUb0RvCiAqCUNsZWFuIHVwIG9mIGxvdyBsZXZlbCBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyBjb2RlLiAoZG9uZSkKICoJRml4IHRoZSBidWcgb24gZG1hIGJ1ZmZlciBtYW5hZ2VtZW50IGluIHVwZGF0ZV9wdHIsIHJlYWQvd3JpdGUsIGRyYWluX2RhYyAoZG9uZSkKICoJRHVhbCBBQzk3IGNvZGVjcyBzdXBwb3J0IChkb25lKQogKglSZWNvcmRpbmcgc3VwcG9ydCAoZG9uZSkKICoJTW1hcCBzdXBwb3J0CiAqCSJDaGFubmVsIEJpbmRpbmciIGlvY3RsIGV4dGVuc2lvbiAoZG9uZSkKICoJbmV3IHBjaSBkZXZpY2UgZHJpdmVyIGludGVyZmFjZSBmb3IgMi40IGtlcm5lbCAoZG9uZSkKICoKICoJTG9jayBvcmRlciAoaGlnaC0+bG93KQogKgkJbG9jawktCWhhcmR3YXJlIGxvY2sKICoJCW9wZW5fbXV0ZXggLSAJZ3VhcmQgb3BlbnMKICoJCXNlbQktCWd1YXJkIGRtYWJ1Ziwgd3JpdGUgcmUtZW50cnkgZXRjCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvcG0uaD4KI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgoKI2lmIGRlZmluZWQoQ09ORklHX0FMUEhBX05BVVRJTFVTKSB8fCBkZWZpbmVkKENPTkZJR19BTFBIQV9HRU5FUklDKQojaW5jbHVkZSA8YXNtL2h3cnBiLmg+CiNlbmRpZgoKI2luY2x1ZGUgInRyaWRlbnQuaCIKCiNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTQuMTBqLTIuNiIKCiNpZiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVCkgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVF9NT0RVTEUpKQojZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQojZW5kaWYKCi8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCiNkZWZpbmUgVFJJREVOVF9DQVJEX01BR0lDCTB4NTA3MjY5NkUJLyogIlByaW4iICovCiNkZWZpbmUgVFJJREVOVF9TVEFURV9NQUdJQwkweDYzNjU3MzczCS8qICJjZXNzIiAqLwoKI2RlZmluZSBUUklERU5UX0RNQV9NQVNLCTB4M2ZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLwojZGVmaW5lIEFMSV9ETUFfTUFTSwkJMHg3ZmZmZmZmZgkvKiBBTEkgVHJpZGVudHMgaGF2ZSAzMS1iaXQgRE1BLiBXb3cuICovCgojZGVmaW5lIE5SX0hXX0NICQkzMgoKLyogbWF4aW11bSBudW1iZXIgb2YgQUM5NyBjb2RlY3MgY29ubmVjdGVkLCBBQzk3IDIuMCBkZWZpbmVkIDQsIGJ1dCA3MDE4IGFuZCA0RC1OWCBvbmx5CiAgIGhhdmUgMiBTREFUQV9JTiBsaW5lcyAoY3VycmVudGx5KSAqLwojZGVmaW5lIE5SX0FDOTcJCTIKCi8qIG1pbm9yIG51bWJlciBvZiAvZGV2L3N3bW9kZW0gKHRlbXBvcmFyeSwgZXhwZXJpbWVudGFsKSAqLwojZGVmaW5lIFNORF9ERVZfU1dNT0RFTQk3CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgYWxpX211bHRpX2NoYW5uZWxzXzVfMVtdID0gewoJLypBTElfU1VSUl9MRUZUX0NIQU5ORUwsIEFMSV9TVVJSX1JJR0hUX0NIQU5ORUwsICovCglBTElfQ0VOVEVSX0NIQU5ORUwsCglBTElfTEVGX0NIQU5ORUwsCglBTElfU1VSUl9MRUZUX0NIQU5ORUwsCglBTElfU1VSUl9SSUdIVF9DSEFOTkVMCn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKCnN0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCAidHJpZGVudDogaW52YWxpZCBtYWdpYyB2YWx1ZSBpbiAlc1xuIjsKCmVudW0gewoJVFJJREVOVF80RF9EWCA9IDAsCglUUklERU5UXzREX05YLAoJU0lTXzcwMTgsCglBTElfNTQ1MSwKCUNZQkVSNTA1MAp9OwoKc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSA9IHsKCSJUcmlkZW50IDREV2F2ZSBEWCIsCgkiVHJpZGVudCA0RFdhdmUgTlgiLAoJIlNpUyA3MDE4IFBDSSBBdWRpbyIsCgkiQUxpIEF1ZGlvIEFjY2VsZXJhdG9yIiwKCSJUdmlhL0lHU1QgQ3liZXJQcm8gNTA1MCIKfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0cmlkZW50X3BjaV90YmxbXSA9IHsKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWCksCgkJUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gPDwgOCwgMHhmZmZmMDAsIFRSSURFTlRfNERfRFh9LAoJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UUklERU5ULCBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSwKCQkwLCAwLCBUUklERU5UXzREX05YfSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNzAxOCksIDAsIDAsIFNJU183MDE4fSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQUxJLCBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSwgMCwgMCwgQUxJXzU0NTF9LAoJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFUkcsIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApLAoJCTAsIDAsIENZQkVSNTA1MH0sCgl7MCx9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHJpZGVudF9wY2lfdGJsKTsKCi8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8Kc3RydWN0IHRyaWRlbnRfc3RhdGUgewoJdW5zaWduZWQgaW50IG1hZ2ljOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCgoJLyogZmlsZSBtb2RlICovCgltb2RlX3Qgb3Blbl9tb2RlOwoKCS8qIHZpcnR1YWwgY2hhbm5lbCBudW1iZXIgKi8KCWludCB2aXJ0OwoKCXN0cnVjdCBkbWFidWYgewoJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCgkJdW5zaWduZWQgaW50IHJhdGU7CgkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZTsKCgkJLyogaGFyZHdhcmUgY2hhbm5lbCAqLwoJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CgoJCS8qIE9TUyBidWZmZXIgbWFuYWdlbWVudCBzdHVmZiAqLwoJCXZvaWQgKnJhd2J1ZjsKCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CgkJdW5zaWduZWQgYnVmb3JkZXI7CgkJdW5zaWduZWQgbnVtZnJhZzsKCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CgoJCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLwoJCXVuc2lnbmVkIGh3cHRyOwkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KCQl1bnNpZ25lZCBzd3B0cjsJLyogd2hlcmUgZHJpdmVyIGxhc3QgY2xlYXIvZmlsbGVkLCB1cGRhdGVkIGJ5IHJlYWQvd3JpdGUgKi8KCQlpbnQgY291bnQ7CS8qIGJ5dGVzIHRvIGJlIGNvbXN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCgkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIGRtYWVkIGJ5IGhhcmR3YXJlICovCgoJCXVuc2lnbmVkIGVycm9yOwkvKiBudW1iZXIgb2Ygb3Zlci91bmRlcnJ1bnMgKi8KICAgICAgICAgICAgICAgIC8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLwoJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CQoKCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCgkJdW5zaWduZWQgZnJhZ3NpemU7CgkJdW5zaWduZWQgZG1hc2l6ZTsKCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKCgkJLyogT1NTIHN0dWZmICovCgkJdW5zaWduZWQgbWFwcGVkOjE7CgkJdW5zaWduZWQgcmVhZHk6MTsKCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CgkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CgkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OwoJCWludCBvc3NtYXhmcmFnczsKCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKCgl9IGRtYWJ1ZjsKCgkvKiA1LjEgY2hhbm5lbHMgKi8KCXN0cnVjdCB0cmlkZW50X3N0YXRlICpvdGhlcl9zdGF0ZXNbNF07CglpbnQgbXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50OwoJdW5zaWduZWQgY2hhbnNfbnVtOwoJdW5zaWduZWQgbG9uZyBmbXRfZmxhZzsKCS8qIEd1YXJkIGFnYWluc3QgbW1hcC93cml0ZS9yZWFkIHJhY2VzICovCglzdHJ1Y3QgbXV0ZXggc2VtOwoKfTsKCi8qIGhhcmR3YXJlIGNoYW5uZWxzICovCnN0cnVjdCB0cmlkZW50X2NoYW5uZWwgewoJaW50IG51bTsgLyogY2hhbm5lbCBudW1iZXIgKi8KCXUzMiBsYmE7IC8qIExvb3AgQmVnaW5lIEFkZHJlc3MsIHdoZXJlIGRtYSBidWZmZXIgc3RhcnRzICovCgl1MzIgZXNvOyAvKiBFbmQgU2FtcGxlIE9mZnNldCwgd2VocmUgZG1hIGJ1ZmZlciBlbmRzICovIAoJICAgICAgICAgLyogKGluIHRoZSB1bml0IG9mIHNhbXBsZXMpICovCgl1MzIgZGVsdGE7IC8qIGRlbHRhIHZhbHVlLCBzYW1wbGUgcmF0ZSAvIDQ4ayBmb3IgcGxheWJhY2ssICovCgkgICAgICAgICAgIC8qIDQ4ay9zYW1wbGUgcmF0ZSBmb3IgcmVjb3JkaW5nICovCgl1MTYgYXR0cmlidXRlOyAvKiBjb250cm9sIHdoZXJlIFBDTSBkYXRhIGdvIGFuZCBjb21lICAqLwoJdTE2IGZtX3ZvbDsKCXUzMiBjb250cm9sOyAvKiBzaWduZWQvdW5zaWduZWQsIDgvMTYgYml0cywgbW9uby9zdGVyZW8gKi8KfTsKCnN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgewoJdTMyIHN0YXJ0OwoJdTMyIHN0b3A7Cgl1MzIgYWludDsKCXUzMiBhaW50X2VuOwp9OwoKc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19hX2FkZHJzID0gewoJVDREX1NUQVJUX0EsCglUNERfU1RPUF9BLAoJVDREX0FJTlRfQSwKCVQ0RF9BSU5URU5fQQp9OwoKc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19iX2FkZHJzID0gewoJVDREX1NUQVJUX0IsCglUNERfU1RPUF9CLAoJVDREX0FJTlRfQiwKCVQ0RF9BSU5URU5fQgp9OwoKc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgewoJLyogcmVnaXN0ZXIgYWRkcmVzc2VzIHRvIGNvbnRyb2wgYmFuayBvcGVyYXRpb25zICovCglzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzICphZGRyZXNzZXM7CgkvKiBlYWNoIGJhbmsgaGFzIDMyIGNoYW5uZWxzICovCgl1MzIgYml0bWFwOwkJLyogY2hhbm5lbCBhbGxvY2F0aW9uIGJpdG1hcCAqLwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCBjaGFubmVsc1szMl07Cn07CgpzdHJ1Y3QgdHJpZGVudF9jYXJkIHsKCXVuc2lnbmVkIGludCBtYWdpYzsKCgkvKiBXZSBrZWVwIHRyaWRlbnQgY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqbmV4dDsKCgkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwoKCS8qIFRoZSB0cmlkZW50IGhhcyBhIGNlcnRhaW4gYW1vdW50IG9mIGNyb3NzIGNoYW5uZWwgaW50ZXJhY3Rpb24KCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCglzcGlubG9ja190IGxvY2s7CgoJLyogUENJIGRldmljZSBzdHVmZiAqLwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Cgl1MTYgcGNpX2lkOwoJdTggcmV2aXNpb247CgoJLyogc291bmRjb3JlIHN0dWZmICovCglpbnQgZGV2X2F1ZGlvOwoKCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgKi8gCgkvKiBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjW05SX0FDOTddOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgYmFua3NbTlJfQkFOS1NdOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlc1tOUl9IV19DSF07CgoJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCgl1bnNpZ25lZCBsb25nIGlvYmFzZTsKCXUzMiBpcnE7CgoJLyogRnVuY3Rpb24gc3VwcG9ydCAqLwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICooKmFsbG9jX3JlY19wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7Cgl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKiwgdW5zaWduZWQgaW50IGNoYW4pOwoJdm9pZCAoKmFkZHJlc3NfaW50ZXJydXB0KSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKTsKCgkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCglpbnQgbXVsdGlfY2hhbm5lbF91c2VfY291bnQ7CglpbnQgcmVjX2NoYW5uZWxfdXNlX2NvdW50OwoJdTE2IG1peGVyX3JlZ3NbNjRdW05SX0FDOTddOwkvKiBNYWRlIGNhcmQgbG9jYWwgYnkgQWxhbiAqLwoJaW50IG1peGVyX3JlZ3NfcmVhZHk7CgoJLyogQWRkZWQgZm9yIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sICovCglpbnQgaHd2b2xjdGw7CglzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKCgkvKiBHYW1lIHBvcnQgc3VwcG9ydCAqLwoJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKfTsKCmVudW0gZG1hYnVmX21vZGUgewoJRE1fUExBWUJBQ0sgPSAwLAoJRE1fUkVDT1JECn07CgovKiB0YWJsZSB0byBtYXAgZnJvbSBDSEFOTkVMTUFTSyB0byBjaGFubmVsIGF0dHJpYnV0ZSBmb3IgU2lTIDcwMTggKi8Kc3RhdGljIHUxNiBtYXNrMmF0dHJbXSA9IHsKCVBDTV9MUiwgUENNX0xSLCBTVVJSX0xSLCBDRU5URVJfTEZFLAoJSFNFVCwgTUlDLCBNT0RFTV9MSU5FMSwgTU9ERU1fTElORTIsCglJMlNfTFIsIFNQRElGX0xSCn07CgovKiB0YWJsZSB0byBtYXAgZnJvbSBjaGFubmVsIGF0dHJpYnV0ZSB0byBDSEFOTkVMTUFTSyBmb3IgU2lTIDcwMTggKi8Kc3RhdGljIGludCBhdHRyMm1hc2tbXSA9IHsKCURTUF9CSU5EX01PREVNMSwgRFNQX0JJTkRfTU9ERU0yLCBEU1BfQklORF9GUk9OVCwgRFNQX0JJTkRfSEFORFNFVCwKCURTUF9CSU5EX0kyUywgRFNQX0JJTkRfQ0VOVEVSX0xGRSwgRFNQX0JJTkRfU1VSUiwgRFNQX0JJTkRfU1BESUYKfTsKCi8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSBmb3Igc3BkaWYgaW4gKi8Kc3RhdGljIGludCBhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHModm9pZCk7CnN0YXRpYyB2b2lkIGFsaV9kZWxheShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgaW50ZXJ2YWwpOwpzdGF0aWMgdm9pZCBhbGlfZGV0ZWN0X3NwZGlmX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CgpzdGF0aWMgdm9pZCBhbGlfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCk7CnN0YXRpYyB1MTYgYWxpX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZyk7CgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2FyZCAqZGV2czsKCnN0YXRpYyB2b2lkIHRyaWRlbnRfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOwpzdGF0aWMgdTE2IHRyaWRlbnRfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpOwoKc3RhdGljIGludCB0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKc3RhdGljIGludCB0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCgkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CgpzdGF0aWMgdm9pZCBhbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKTsKc3RhdGljIHUxNiBhbGlfYWM5N19nZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnKTsKc3RhdGljIHZvaWQgYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgcmF0ZSk7CnN0YXRpYyB2b2lkIGFsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0KTsKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmFsaV9hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICphbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyB2b2lkIGFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKc3RhdGljIGludCBhbGlfc2V0dXBfbXVsdGlfY2hhbm5lbHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoYW5fbnVtcyk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYWxpX2dldF9zcGRpZl9pbl9yYXRlKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfc2V0dXBfc3BkaWZfaW4oc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyB2b2lkIGFsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoKTsKc3RhdGljIHZvaWQgYWxpX3NldHVwX3NwZGlmX291dChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgZmxhZyk7CnN0YXRpYyBpbnQgYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsCgkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCAKCQkJIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCgkJCSB1bnNpZ25lZCBpbnQgKnN0YXRlX2NudCk7CnN0YXRpYyBpbnQgYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCAKCQkJCQkgICAgICAgaW50IGNoYW5fbnVtcyk7CnN0YXRpYyB2b2lkIGFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKTsKCiNkZWZpbmUgc2Vla19vZmZzZXQoZG1hX3B0ciwgYnVmZmVyLCBjbnQsIG9mZnNldCwgY29weV9jb3VudCkJZG8geyBcCiAgICAgICAgKGRtYV9wdHIpICs9IChvZmZzZXQpOwkgIFwKCShidWZmZXIpICs9IChvZmZzZXQpOwkgIFwKICAgICAgICAoY250KSAtPSAob2Zmc2V0KTsJICBcCgkoY29weV9jb3VudCkgKz0gKG9mZnNldCk7IFwKfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUgaW50IGxvY2tfc2V0X2ZtdChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCnsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzdGF0ZS0+Zm10X2ZsYWcpKQoJCXJldHVybiAtRUZBVUxUOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX3NldF9mbXQoc3RydWN0IHRyaWRlbnRfc3RhdGUqIHN0YXRlKQp7CgljbGVhcl9iaXQoMCwgJnN0YXRlLT5mbXRfZmxhZyk7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9lbmFibGVfbG9vcF9pbnRlcnJ1cHRzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXUzMiBnbG9iYWxfY29udHJvbDsKCglnbG9iYWxfY29udHJvbCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQlnbG9iYWxfY29udHJvbCB8PSAoRU5ETFBfSUUgfCBNSURMUF9JRSB8IEJBTktfQl9FTik7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJZ2xvYmFsX2NvbnRyb2wgfD0gKEVORExQX0lFIHwgTUlETFBfSUUpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglvdXRsKGdsb2JhbF9jb250cm9sLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBFbmFibGUgTG9vcCBJbnRlcnJ1cHRzLCBnbG9iY3RsID0gMHglMDhYXG4iLAoJCSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKSk7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9kaXNhYmxlX2xvb3BfaW50ZXJydXB0cyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MzIgZ2xvYmFsX2NvbnRyb2w7CgoJZ2xvYmFsX2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCWdsb2JhbF9jb250cm9sICY9IH4oRU5ETFBfSUUgfCBNSURMUF9JRSk7CglvdXRsKGdsb2JhbF9jb250cm9sLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBEaXNhYmxlZCBMb29wIEludGVycnVwdHMsIGdsb2JjdGwgPSAweCUwOFhcbiIsCgkJIGdsb2JhbF9jb250cm9sKTsKCglyZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWwgPj4gNV07Cgl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOwoKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CglyZWcgfD0gbWFzazsKCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogZW5hYmxlZCBJUlEgb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCgkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX0FJTlRFTl9CID8gIkFJTlRFTl9CIiA6ICJBSU5URU5fQSIsCgkJIHJlZywgYWRkcik7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgdm9pZAp0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWwgPj4gNV07Cgl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOwoKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CglyZWcgJj0gfm1hc2s7CglvdXRsKHJlZywgVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoKCS8qIEFjayB0aGUgY2hhbm5lbCBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2FzIHNldCBiZWZvcmUgd2UgZGlzYWJsZSBpdC4gKi8KCW91dGwobWFzaywgVFJJRF9SRUcoY2FyZCwgYmFuay0+YWRkcmVzc2VzLT5haW50KSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogZGlzYWJsZWQgSVJRIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAoJCSBjaGFubmVsLCBhZGRyID09IFQ0RF9BSU5URU5fQiA/ICJBSU5URU5fQiIgOiAiQUlOVEVOX0EiLAoJCSByZWcsIGFkZHIpOwojZW5kaWYgLyogREVCVUcgKi8KfQoKc3RhdGljIHZvaWQKdHJpZGVudF9zdGFydF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPnN0YXJ0OwoKI2lmZGVmIERFQlVHCgl1MzIgcmVnOwojZW5kaWYgLyogREVCVUcgKi8KCglvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCiNpZmRlZiBERUJVRwoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCXByX2RlYnVnKCJ0cmlkZW50OiBzdGFydCB2b2ljZSBvbiBjaGFubmVsICVkLCAlcyA9IDB4JTA4eChhZGRyOiVYKVxuIiwKCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfU1RBUlRfQiA/ICJTVEFSVF9CIiA6ICJTVEFSVF9BIiwKCQkgcmVnLCBhZGRyKTsKI2VuZGlmIC8qIERFQlVHICovCn0KCnN0YXRpYyB2b2lkCnRyaWRlbnRfc3RvcF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPnN0b3A7CgojaWZkZWYgREVCVUcKCXUzMiByZWc7CiNlbmRpZiAvKiBERUJVRyAqLwoKCW91dGwobWFzaywgVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoKI2lmZGVmIERFQlVHCglyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoJcHJfZGVidWcoInRyaWRlbnQ6IHN0b3Agdm9pY2Ugb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCgkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX1NUT1BfQiA/ICJTVE9QX0IiIDogIlNUT1BfQSIsCgkJIHJlZywgYWRkcik7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgdTMyCnRyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsXTsKCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50OwoJcmV0dXJuIGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9jaGVja19jaGFubmVsX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7Cgl1MzIgcmVnID0gdHJpZGVudF9nZXRfaW50ZXJydXB0X21hc2soY2FyZCwgY2hhbm5lbCA+PiA1KTsKCiNpZmRlZiBERUJVRwoJaWYgKHJlZyAmIG1hc2spCgkJcHJfZGVidWcoInRyaWRlbnQ6IGNoYW5uZWwgJWQgaGFzIGludGVycnVwdCwgJXMgPSAweCUwOHhcbiIsCgkJCSBjaGFubmVsLCByZWcgPT0gVDREX0FJTlRfQiA/ICJBSU5UX0IiIDogIkFJTlRfQSIsCgkJCSByZWcpOwojZW5kaWYgLyogREVCVUcgKi8KCXJldHVybiAocmVnICYgbWFzaykgPyAxIDogMDsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbCA+PiA1XTsKCXUzMiByZWcsIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPmFpbnQ7CgoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCXJlZyAmPSBtYXNrOwoJb3V0bChyZWcsIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCiNpZmRlZiBERUJVRwoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0IpKTsKCXByX2RlYnVnKCJ0cmlkZW50OiBBY2sgY2hhbm5lbCAlZCBpbnRlcnJ1cHQsIEFJTlRfQiA9IDB4JTA4eFxuIiwKCQkgY2hhbm5lbCwgcmVnKTsKI2VuZGlmIC8qIERFQlVHICovCn0KCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKdHJpZGVudF9hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuazsKCWludCBpZHg7CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0JdOwoKCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHggKyAzMjsKCQkJcmV0dXJuIGNoYW5uZWw7CgkJfQoJfQoKCS8qIG5vIG1vcmUgZnJlZSBjaGFubmVscyBhdmFpbGFibGUgKi8KCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBCLlxuIik7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglpbnQgYmFuazsKCXVuc2lnbmVkIGNoYXIgYjsKCglpZiAoY2hhbm5lbCA8IDMxIHx8IGNoYW5uZWwgPiA2MykKCQlyZXR1cm47CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYIHx8IAoJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSB7CgkJYiA9IGluYihUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CgkJaWYgKChiICYgfjB4ODApID09IGNoYW5uZWwpCgkJCW91dGIoMHgwLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7Cgl9CgoJYmFuayA9IGNoYW5uZWwgPj4gNTsKCWNoYW5uZWwgPSBjaGFubmVsICYgMHgxZjsKCgljYXJkLT5iYW5rc1tiYW5rXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKY3liZXJfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCS8qIFRoZSBjeWJlcnBybyA1MDUwIGhhcyBvbmx5IDMyIHZvaWNlcyBhbmQgb25lIGJhbmsgKi8KCS8qIC4uIGF0IGxlYXN0IHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIChpZiB5b3Ugd2FudCB0byBjYWxsIHRoYXQgCgkgKiBjcmFwIGRvY3VtZW50YXRpb24pLCBwZXJoYXBzIGJyb2tlbiA/ICovCgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHg7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCgkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhaWxhYmxlICovCglwcmludGsoS0VSTl9FUlIgImN5YmVycHJvNTA1MDogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKY3liZXJfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJaWYgKGNoYW5uZWwgPiAzMSkKCQlyZXR1cm47CgljYXJkLT5iYW5rc1tCQU5LX0FdLmJpdG1hcCAmPSB+KDEgPDwgKGNoYW5uZWwpKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCmN5YmVyX291dGlkeChpbnQgcG9ydCwgaW50IGlkeCwgaW50IGRhdGEpCnsKCW91dGIoaWR4LCBwb3J0KTsKCW91dGIoZGF0YSwgcG9ydCArIDEpOwp9CgpzdGF0aWMgaW5saW5lIGludApjeWJlcl9pbmlkeChpbnQgcG9ydCwgaW50IGlkeCkKewoJb3V0YihpZHgsIHBvcnQpOwoJcmV0dXJuIGluYihwb3J0ICsgMSk7Cn0KCnN0YXRpYyBpbnQKY3liZXJfaW5pdF9yaXR1YWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJLyogc29tZSBibGFjayBtYWdpYywgdGFrZW4gZnJvbSBTREsgc2FtcGxlcyAqLwoJLyogcmVtb3ZlIHRoaXMgYW5kIG5vdGhpbmcgd2lsbCB3b3JrICovCglpbnQgcG9ydERhdDsKCWludCByZXQgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKgoJICogICAgICBLZWVwIGludGVycnVwdHMgb2ZmIGZvciB0aGUgY29uZmlndXJlIC0gd2UgZG9uJ3Qgd2FudCB0bwoJICogICAgICBjbGFzaCB3aXRoIGFub3RoZXIgY3liZXJwcm8gY29uZmlnIGV2ZW50CgkgKi8KCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJcG9ydERhdCA9IGN5YmVyX2luaWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUpOwoJLyogZW5hYmxlLCBpZiBpdCB3YXMgZGlzYWJsZWQgKi8KCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiY3liZXJwcm81MDUwOiBlbmFibGluZyBhdWRpbyBjb250cm9sbGVyXG4iKTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSwgCgkJCSAgICAgcG9ydERhdCB8IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKTsKCQkvKiBjaGVjayBhZ2FpbiBpZiBoYXJkd2FyZSBpcyBlbmFibGVkIG5vdyAqLwoJCXBvcnREYXQgPSBjeWJlcl9pbmlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFKTsKCX0KCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IGluaXRBdWRpb0FjY2Vzczogbm8gc3VjY2Vzc1xuIik7CgkJcmV0ID0gLTE7Cgl9IGVsc2UgewoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfSVJRX0VOQUJMRSwgCgkJCSAgICAgQ1lCRVJfQk1TS19BVURJT19JTlRfRU5BQkxFKTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMSk7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmEsIDB4MjApOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJiLCAweDA4KTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMik7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YjMsIDB4MDYpOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJmLCAweDAwKTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCXJldHVybiByZXQ7Cn0KCi8qICBjYWxsZWQgd2l0aCBzcGluIGxvY2sgaGVsZCAqLwoKc3RhdGljIGludAp0cmlkZW50X2xvYWRfY2hhbm5lbF9yZWdpc3RlcnMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdTMyICogZGF0YSwgCgkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJaW50IGk7CgoJaWYgKGNoYW5uZWwgPiA2MykKCQlyZXR1cm4gMDsKCgkvKiBzZWxlY3QgaGFyZHdhcmUgY2hhbm5lbCB0byB3cml0ZSAqLwoJb3V0YihjaGFubmVsLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCS8qIE91dHB1dCB0aGUgY2hhbm5lbCByZWdpc3RlcnMsIGJ1dCBkb24ndCB3cml0ZSByZWdpc3RlcgoJICAgdGhyZWUgdG8gYW4gQUxJIGNoaXAuICovCglmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9SRUdTOyBpKyspIHsKCQlpZiAoaSA9PSAzICYmIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQoJCQljb250aW51ZTsKCQlvdXRsKGRhdGFbaV0sIFRSSURfUkVHKGNhcmQsIENIQU5ORUxfU1RBUlQgKyA0ICogaSkpOwoJfQoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8IAoJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CgkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYxKSk7CgkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYyKSk7Cgl9CglyZXR1cm4gMTsKfQoKLyogY2FsbGVkIHdpdGggc3BpbiBsb2NrIGhlbGQgKi8Kc3RhdGljIGludAp0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7Cgl1bnNpZ25lZCBpbnQgZGF0YVtDSEFOTkVMX1JFR1MgKyAxXTsKCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CgoJY2hhbm5lbCA9IHN0YXRlLT5kbWFidWYuY2hhbm5lbDsKCglkYXRhWzFdID0gY2hhbm5lbC0+bGJhOwoJZGF0YVs0XSA9IGNoYW5uZWwtPmNvbnRyb2w7CgoJc3dpdGNoIChzdGF0ZS0+Y2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgkJZGF0YVswXSA9IDA7CS8qIEN1cnJlbnQgU2FtcGxlIE9mZnNldCAqLwoJCWRhdGFbMl0gPSAoY2hhbm5lbC0+ZXNvIDw8IDE2KSB8IChjaGFubmVsLT5kZWx0YSAmIDB4ZmZmZik7CgkJZGF0YVszXSA9IDA7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCgkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKCQlkYXRhWzNdID0gKGNoYW5uZWwtPmF0dHJpYnV0ZSA8PCAxNikgfCAoY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCgkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKCQlkYXRhWzNdID0gY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCWRhdGFbMF0gPSAoY2hhbm5lbC0+ZGVsdGEgPDwgMjQpOwoJCWRhdGFbMl0gPSAoKGNoYW5uZWwtPmRlbHRhIDw8IDE2KSAmIDB4ZmYwMDAwMDApIHwgCgkJCShjaGFubmVsLT5lc28gJiAweDAwZmZmZmZmKTsKCQlkYXRhWzNdID0gY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gdHJpZGVudF9sb2FkX2NoYW5uZWxfcmVnaXN0ZXJzKHN0YXRlLT5jYXJkLCBkYXRhLCBjaGFubmVsLT5udW0pOwp9CgpzdGF0aWMgaW50CmNvbXB1dGVfcmF0ZV9wbGF5KHUzMiByYXRlKQp7CglpbnQgZGVsdGE7CgkvKiBXZSBzcGVjaWFsIGNhc2UgNDQxMDAgYW5kIDgwMDAgc2luY2Ugcm91bmRpbmcgd2l0aCB0aGUgZXF1YXRpb24KCSAgIGRvZXMgbm90IGdpdmUgdXMgYW4gYWNjdXJhdGUgZW5vdWdoIHZhbHVlLiBGb3IgMTEwMjUgYW5kIDIyMDUwCgkgICB0aGUgZXF1YXRpb24gZ2l2ZXMgdXMgdGhlIGJlc3QgYW5zd2VyLiBBbGwgb3RoZXIgZnJlcXVlbmNpZXMgd2lsbAoJICAgYWxzbyB1c2UgdGhlIGVxdWF0aW9uLiBKRFcgKi8KCWlmIChyYXRlID09IDQ0MTAwKQoJCWRlbHRhID0gMHhlYjM7CgllbHNlIGlmIChyYXRlID09IDgwMDApCgkJZGVsdGEgPSAweDJhYjsKCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDApCgkJZGVsdGEgPSAweDEwMDA7CgllbHNlCgkJZGVsdGEgPSAoKChyYXRlIDw8IDEyKSArIHJhdGUpIC8gNDgwMDApICYgMHgwMDAwZmZmZjsKCXJldHVybiBkZWx0YTsKfQoKc3RhdGljIGludApjb21wdXRlX3JhdGVfcmVjKHUzMiByYXRlKQp7CglpbnQgZGVsdGE7CgoJaWYgKHJhdGUgPT0gNDQxMDApCgkJZGVsdGEgPSAweDExNmE7CgllbHNlIGlmIChyYXRlID09IDgwMDApCgkJZGVsdGEgPSAweDYwMDA7CgllbHNlIGlmIChyYXRlID09IDQ4MDAwKQoJCWRlbHRhID0gMHgxMDAwOwoJZWxzZQoJCWRlbHRhID0gKCg0ODAwMCA8PCAxMikgLyByYXRlKSAmIDB4MDAwMGZmZmY7CgoJcmV0dXJuIGRlbHRhOwp9CgovKiBzZXQgcGxheWJhY2sgc2FtcGxlIHJhdGUgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3NldF9kYWNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCglpZiAocmF0ZSA+IDQ4MDAwKQoJCXJhdGUgPSA0ODAwMDsKCWlmIChyYXRlIDwgNDAwMCkKCQlyYXRlID0gNDAwMDsKCglkbWFidWYtPnJhdGUgPSByYXRlOwoJZG1hYnVmLT5jaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KHJhdGUpOwoKCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IGNhbGxlZCB0cmlkZW50X3NldF9kYWNfcmF0ZSA6IHJhdGUgPSAlZFxuIiwgcmF0ZSk7CgoJcmV0dXJuIHJhdGU7Cn0KCi8qIHNldCByZWNvcmRpbmcgc2FtcGxlIHJhdGUgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3NldF9hZGNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCglpZiAocmF0ZSA+IDQ4MDAwKQoJCXJhdGUgPSA0ODAwMDsKCWlmIChyYXRlIDwgNDAwMCkKCQlyYXRlID0gNDAwMDsKCglkbWFidWYtPnJhdGUgPSByYXRlOwoJZG1hYnVmLT5jaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9yZWMocmF0ZSk7CgoJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKCglwcl9kZWJ1ZygidHJpZGVudDogY2FsbGVkIHRyaWRlbnRfc2V0X2FkY19yYXRlIDogcmF0ZSA9ICVkXG4iLCByYXRlKTsKCglyZXR1cm4gcmF0ZTsKfQoKLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHBsYXliYWNrICovCnN0YXRpYyB2b2lkCnRyaWRlbnRfcGxheV9zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9IGRtYWJ1Zi0+Y2hhbm5lbDsKCgljaGFubmVsLT5sYmEgPSBkbWFidWYtPmRtYV9oYW5kbGU7CgljaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KGRtYWJ1Zi0+cmF0ZSk7CgoJY2hhbm5lbC0+ZXNvID0gZG1hYnVmLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CgljaGFubmVsLT5lc28gLT0gMTsKCglpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOwoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkJaWYgKChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpIHx8IAoJCQkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfUENNX0lOX0NIQU5ORUwpKQoJCQkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0YXRlLT5jYXJkLCBjaGFubmVsLT5udW0pOwoJCQllbHNlIGlmICgoaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKSAKCQkJCSAgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKCQkJCSAmJiAoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9PVVRfQ0hBTk5FTCkpIHsKCQkJCWFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RhdGUtPmNhcmQsIAoJCQkJCQkgICAgICAgc3RhdGUtPmRtYWJ1Zi5yYXRlKTsKCQkJCXN0YXRlLT5kbWFidWYuY2hhbm5lbC0+ZGVsdGEgPSAweDEwMDA7CgkJCX0KCQl9Cgl9CgoJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOwoKCWNoYW5uZWwtPmNvbnRyb2wgPSBDSEFOTkVMX0xPT1A7CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgewoJCS8qIDE2LWJpdHMgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfMTZCSVRTOwoJCS8qIHNpZ25lZCAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TSUdORUQ7Cgl9CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCgkJLyogc3RlcmVvICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMX1NURVJFTzsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9wbGF5X3NldHVwLCBMQkEgPSAweCUwOHgsIERlbHRhID0gMHglMDh4LCAiCgkJICJFU08gPSAweCUwOHgsIENvbnRyb2wgPSAweCUwOHhcbiIsIGNoYW5uZWwtPmxiYSwKCQkgY2hhbm5lbC0+ZGVsdGEsIGNoYW5uZWwtPmVzbywgY2hhbm5lbC0+Y29udHJvbCk7CgoJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKfQoKLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHJlY29yZGluZyAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X3JlY19zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXUxNiB3OwoJdTggYnZhbDsKCglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSBkbWFidWYtPmNoYW5uZWw7Cgl1bnNpZ25lZCBpbnQgcmF0ZTsKCgkvKiBFbmFibGUgQUMtOTcgQURDIChjYXB0dXJlKSAqLwoJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKCQlhbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdGF0ZSk7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQkvKiBmb3IgNzAxOCwgdGhlIGFjOTcgaXMgYWx3YXlzIGluIHBsYXliYWNrL3JlY29yZCAoZHVwbGV4KSBtb2RlICovCgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgkJdyA9IGluYihUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQlvdXRiKHcgfCAweDQ4LCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQkvKiBlbmFibGUgYW5kIHNldCByZWNvcmQgY2hhbm5lbCAqLwoJCW91dGIoMHg4MCB8IGNoYW5uZWwtPm51bSwgVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCXcgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCQlvdXR3KHcgfCAweDEwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkJLyogZW5hYmxlIGFuZCBzZXQgcmVjb3JkIGNoYW5uZWwgKi8KCQlvdXRiKDB4ODAgfCBjaGFubmVsLT5udW0sIFRSSURfUkVHKGNhcmQsIFQ0RF9SRUNfQ0gpKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQkvKiBkb24ndCBrbm93IHlldCwgdXNpbmcgc3BlY2lhbCBjaGFubmVsIDIyIGluIEdDMSgweGQ0KT8gKi8KCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuOwoJfQoKCWNoYW5uZWwtPmxiYSA9IGRtYWJ1Zi0+ZG1hX2hhbmRsZTsKCWNoYW5uZWwtPmRlbHRhID0gY29tcHV0ZV9yYXRlX3JlYyhkbWFidWYtPnJhdGUpOwoJaWYgKChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgJiYgCgkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkpIHsKCQlyYXRlID0gYWxpX2dldF9zcGRpZl9pbl9yYXRlKGNhcmQpOwoJCWlmIChyYXRlID09IDApIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogQUxpIDU0NTEgIgoJCQkgICAgICAgIlMvUERJRiBpbnB1dCBzZXR1cCBlcnJvciFcbiIpOwoJCQlyYXRlID0gNDgwMDA7CgkJfQoJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCQlpZiAoYnZhbCAmIDB4MTApIHsKCQkJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBjbGVhcmVkIEFMaSAiCgkJCSAgICAgICAiNTQ1MSBTL1BESUYgcGFyaXR5IGVycm9yIGZsYWcuXG4iKTsKCQl9CgoJCWlmIChyYXRlICE9IDQ4MDAwKQoJCQljaGFubmVsLT5kZWx0YSA9ICgocmF0ZSA8PCAxMikgLyBkbWFidWYtPnJhdGUpICYgMHgwMDAwZmZmZjsKCX0KCgljaGFubmVsLT5lc28gPSBkbWFidWYtPmRtYXNpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCWNoYW5uZWwtPmVzbyAtPSAxOwoKCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCWNoYW5uZWwtPmF0dHJpYnV0ZSA9IDA7Cgl9CgoJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOwoKCWNoYW5uZWwtPmNvbnRyb2wgPSBDSEFOTkVMX0xPT1A7CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgewoJCS8qIDE2LWJpdHMgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfMTZCSVRTOwoJCS8qIHNpZ25lZCAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TSUdORUQ7Cgl9CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCgkJLyogc3RlcmVvICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMX1NURVJFTzsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9yZWNfc2V0dXAsIExCQSA9IDB4JTA4eCwgRGVsYXQgPSAweCUwOHgsICIKCQkgIkVTTyA9IDB4JTA4eCwgQ29udHJvbCA9IDB4JTA4eFxuIiwgY2hhbm5lbC0+bGJhLAoJCSBjaGFubmVsLT5kZWx0YSwgY2hhbm5lbC0+ZXNvLCBjaGFubmVsLT5jb250cm9sKTsKCgl0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RhdGUpOwp9CgovKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCiAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQKdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXUzMiBjc287CgoJaWYgKCFkbWFidWYtPmVuYWJsZSkKCQlyZXR1cm4gMDsKCglvdXRiKGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLCBUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCglzd2l0Y2ggKHN0YXRlLT5jYXJkLT5wY2lfaWQpIHsKCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKCWNhc2UgUENJX0RFVklDRV9JRF9TSV83MDE4OgoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCS8qIDE2IGJpdHMgRVNPLCBDU08gZm9yIDcwMTggYW5kIERYICovCgkJY3NvID0gaW53KFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9EWF9DU09fQUxQSEFfRk1TICsgMikpOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCS8qIDI0IGJpdHMgRVNPLCBDU08gZm9yIE5YICovCgkJY3NvID0gaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9OWF9ERUxUQV9DU08pKSAmIDB4MDBmZmZmZmY7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAwOwoJfQoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X2dldF9kbWFfYWRkcjogY2hpcCByZXBvcnRlZCBjaGFubmVsOiAlZCwgIgoJCSAiY3NvID0gMHglMDR4XG4iLCBkbWFidWYtPmNoYW5uZWwtPm51bSwgY3NvKTsKCgkvKiBFU08gYW5kIENTTyBhcmUgaW4gdW5pdHMgb2YgU2FtcGxlcywgY29udmVydCB0byBieXRlIG9mZnNldCAqLwoJY3NvIDw8PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoKCXJldHVybiAoY3NvICUgZG1hYnVmLT5kbWFzaXplKTsKfQoKLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8Kc3RhdGljIGlubGluZSB2b2lkCl9fc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoKCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFuX251bSk7Cgl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKfQoKc3RhdGljIHZvaWQKc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglfX3N0b3BfYWRjKHN0YXRlKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQKc3RhcnRfYWRjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBpbnQgY2hhbl9udW0gPSBkbWFidWYtPmNoYW5uZWwtPm51bTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWlmICgoZG1hYnVmLT5tYXBwZWQgfHwgCgkgICAgIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpICYmIAoJICAgIGRtYWJ1Zi0+cmVhZHkpIHsKCQlkbWFidWYtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKCQl0cmlkZW50X2VuYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOwoJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgY2hhbl9udW0pOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgovKiBzdG9wIHBsYXliYWNrIChsb2NrIGhlbGQpICovCnN0YXRpYyBpbmxpbmUgdm9pZApfX3N0b3BfZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBpbnQgY2hhbl9udW0gPSBkbWFidWYtPmNoYW5uZWwtPm51bTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCglkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7Cgl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbl9udW0pOwoJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJfQoJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7Cn0KCnN0YXRpYyB2b2lkCnN0b3BfZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJX19zdG9wX2RhYyhzdGF0ZSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkCnN0YXJ0X2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgaW50IGNoYW5fbnVtID0gZG1hYnVmLT5jaGFubmVsLT5udW07CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IGRtYWJ1Zi0+Y291bnQgPiAwKSAmJiBkbWFidWYtPnJlYWR5KSB7CgkJZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7CgkJdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIGNoYW5fbnVtKTsKCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CgkJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+CgkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPgoJCQkJCSAgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KCQkJCQkgICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+CgkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCX0KCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNS1QQUdFX1NISUZUKQojZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCgovKiBhbGxvYyBhIERNQSBidWZmZXIgb2Ygd2l0aCBhIGJ1ZmZlciBvZiB0aGlzIG9yZGVyICovCnN0YXRpYyBpbnQKYWxsb2NfZG1hYnVmKHN0cnVjdCBkbWFidWYgKmRtYWJ1Ziwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGludCBvcmRlcikKewoJdm9pZCAqcmF3YnVmID0gTlVMTDsKCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKCglpZiAoIShyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsIAoJCQkJCSAgICAmZG1hYnVmLT5kbWFfaGFuZGxlKSkpCgkJcmV0dXJuIC1FTk9NRU07CgoJcHJfZGVidWcoInRyaWRlbnQ6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAoJCSBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCByYXdidWYpOwoKCWRtYWJ1Zi0+cmVhZHkgPSBkbWFidWYtPm1hcHBlZCA9IDA7CglkbWFidWYtPnJhd2J1ZiA9IHJhd2J1ZjsKCWRtYWJ1Zi0+YnVmb3JkZXIgPSBvcmRlcjsKCgkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSAqLyAKCS8qIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLwoJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOwoJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQoJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKCglyZXR1cm4gMDsKfQoKLyogYWxsb2NhdGUgdGhlIG1haW4gRE1BIGJ1ZmZlciwgcGxheWJhY2sgYW5kIHJlY29yZGluZyBidWZmZXIgc2hvdWxkIGJlICovCi8qIGFsbG9jYXRlZCBzZXBhcmF0ZWx5ICovCnN0YXRpYyBpbnQKYWxsb2NfbWFpbl9kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCWludCBvcmRlcjsKCWludCByZXQgPSAtRU5PTUVNOwoKCS8qIGFsbG9jIGFzIGJpZyBhIGNodW5rIGFzIHdlIGNhbiwgRklYTUU6IGlzIHRoaXMgbmVjZXNzYXJ5ID8/ICovCglmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKSB7CgkJaWYgKCEocmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYsIG9yZGVyKSkpCgkJCXJldHVybiAwOwoJCS8qIGVsc2UgdHJ5IGFnYWluICovCgl9CglyZXR1cm4gcmV0Owp9CgovKiBkZWFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLwpzdGF0aWMgdm9pZApkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgZG1hYnVmICpkbWFidWYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQp7CglzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CgoJaWYgKGRtYWJ1Zi0+cmF3YnVmKSB7CgkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLwoJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7CgkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCgkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOwoJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIsIAoJCQkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9oYW5kbGUpOwoJCWRtYWJ1Zi0+cmF3YnVmID0gTlVMTDsKCX0KCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cn0KCnN0YXRpYyBpbnQKcHJvZ19kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCBlbnVtIGRtYWJ1Zl9tb2RlIHJlYykKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBieXRlcGVyc2VjOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnMgPSBzdGF0ZTsKCXVuc2lnbmVkIGJ1ZnNpemUsIGRtYV9udW1zOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCByZXQsIGksIG9yZGVyOwoKCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQoJCXJldHVybiByZXQ7CgoJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikKCQlkbWFfbnVtcyA9IDU7CgllbHNlCgkJZG1hX251bXMgPSAxOwoKCWZvciAoaSA9IDA7IGkgPCBkbWFfbnVtczsgaSsrKSB7CgkJaWYgKGkgPiAwKSB7CgkJCXMgPSBzdGF0ZS0+b3RoZXJfc3RhdGVzW2kgLSAxXTsKCQkJZG1hYnVmID0gJnMtPmRtYWJ1ZjsKCQkJZG1hYnVmLT5mbXQgPSBzdGF0ZS0+ZG1hYnVmLmZtdDsKCQkJZG1hYnVmLT5yYXRlID0gc3RhdGUtPmRtYWJ1Zi5yYXRlOwoJCX0KCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwoJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gMDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KCQlpZiAoIWRtYWJ1Zi0+cmF3YnVmKSB7CgkJCWlmIChpID09IDApIHsKCQkJCWlmICgocmV0ID0gYWxsb2NfbWFpbl9kbWFidWYoc3RhdGUpKSkgewoJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcmV0ID0gLUVOT01FTTsKCQkJCW9yZGVyID0gc3RhdGUtPmRtYWJ1Zi5idWZvcmRlciAtIDE7CgkJCQlpZiAob3JkZXIgPj0gRE1BQlVGX01JTk9SREVSKSB7CgkJCQkJcmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1ZiwKCQkJCQkJCSAgIHN0YXRlLT5jYXJkLT5wY2lfZGV2LAoJCQkJCQkJICAgb3JkZXIpOwoJCQkJfQoJCQkJaWYgKHJldCkgewoJCQkJCS8qIHJlbGVhc2UgdGhlIG1haW4gRE1BIGJ1ZmZlciAqLwoJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CgkJCQkJLyogcmVsZWFzZSB0aGUgYXV4aWxpYXJ5IERNQSBidWZmZXJzICovCgkJCQkJZm9yIChpIC09IDI7IGkgPj0gMDsgaS0tKQoJCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLCAKCQkJCQkJCSAgICAgICBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CgkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgkJCX0KCQl9CgkJLyogRklYTUU6IGZpZ3VyZSBvdXQgYWxsIHRoaXMgT1NTIGZyYWdtZW50IHN0dWZmICovCgkJYnl0ZXBlcnNlYyA9IGRtYWJ1Zi0+cmF0ZSA8PCBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWJ1ZnNpemUgPSBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcjsKCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQpIHsKCQkJaWYgKCgxMDAwIDw8IGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCgkJCQlkbWFidWYtPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjIC8gMTAwMCk7CgkJCWVsc2UKCQkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gZG1hYnVmLT5vc3NmcmFnc2hpZnQ7CgkJfSBlbHNlIHsKCQkJLyogbGV0cyBoYW5kIG91dCByZWFzb25hYmxlIGJpZyBhc3MgYnVmZmVycyBieSBkZWZhdWx0ICovCgkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gKGRtYWJ1Zi0+YnVmb3JkZXIgKyBQQUdFX1NISUZUIC0gMik7CgkJfQoJCWRtYWJ1Zi0+bnVtZnJhZyA9IGJ1ZnNpemUgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJd2hpbGUgKGRtYWJ1Zi0+bnVtZnJhZyA8IDQgJiYgZG1hYnVmLT5mcmFnc2hpZnQgPiAzKSB7CgkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0LS07CgkJCWRtYWJ1Zi0+bnVtZnJhZyA9IGJ1ZnNpemUgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJfQoJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAxIDw8IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCWlmIChkbWFidWYtPm9zc21heGZyYWdzID49IDQgJiYgZG1hYnVmLT5vc3NtYXhmcmFncyA8IGRtYWJ1Zi0+bnVtZnJhZykKCQkJZG1hYnVmLT5udW1mcmFnID0gZG1hYnVmLT5vc3NtYXhmcmFnczsKCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gZG1hYnVmLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWRtYWJ1Zi0+ZG1hc2l6ZSA9IGRtYWJ1Zi0+bnVtZnJhZyA8PCBkbWFidWYtPmZyYWdzaGlmdDsKCgkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCgkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJaWYgKHJlYyA9PSBETV9SRUNPUkQpCgkJCXRyaWRlbnRfcmVjX3NldHVwKHMpOwoJCWVsc2UgLyogRE1fUExBWUJBQ0sgKi8KCQkJdHJpZGVudF9wbGF5X3NldHVwKHMpOwoKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCS8qIHNldCB0aGUgcmVhZHkgZmxhZyBmb3IgdGhlIGRtYSBidWZmZXIgKi8KCQlkbWFidWYtPnJlYWR5ID0gMTsKCgkJcHJfZGVidWcoInRyaWRlbnQ6IHByb2dfZG1hYnVmKCVkKSwgc2FtcGxlIHJhdGUgPSAlZCwgIgoJCQkgImZvcm1hdCA9ICVkLCBudW1mcmFnID0gJWQsIGZyYWdzaXplID0gJWQgIgoJCQkgImRtYXNpemUgPSAlZFxuIiwgZG1hYnVmLT5jaGFubmVsLT5udW0sCgkJCSBkbWFidWYtPnJhdGUsIGRtYWJ1Zi0+Zm10LCBkbWFidWYtPm51bWZyYWcsCgkJCSBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpOwoJfQoJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RydWN0IHRyaWRlbnRfc3RhdGUqIHN0YXRlKQp7CglyZXR1cm4gcHJvZ19kbWFidWYoc3RhdGUsIERNX1JFQ09SRCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKewoJcmV0dXJuIHByb2dfZG1hYnVmKHN0YXRlLCBETV9QTEFZQkFDSyk7Cn0KCi8qIHdlIGFyZSBkb2luZyBxdWFudHVtIG1lY2hhbmljcyBoZXJlLCB0aGUgYnVmZmVyIGNhbiBvbmx5IGJlIGVtcHR5LCBoYWxmIG9yIGZ1bGwgZmlsbGVkIGkuZS4KICAgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4eHh4eHh4fAogICBidXQgd2UgYWxtb3N0IGFsd2F5cyBnZXQgdGhpcwogICB8eHh4eHh4LS0tLS0tfC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHgtLS0tLS0tfAogICBzbyB3ZSBoYXZlIHRvIGNsZWFyIHRoZSB0YWlsIHNwYWNlIHRvICJzaWxlbmNlIgogICB8eHh4eHh4MDAwMDAwfC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4MDAwMDAwfAoqLwpzdGF0aWMgdm9pZAp0cmlkZW50X2NsZWFyX3RhaWwoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIHN3cHRyOwoJdW5zaWduZWQgY2hhciBzaWxlbmNlID0gKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gMCA6IDB4ODA7Cgl1bnNpZ25lZCBpbnQgbGVuOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJaWYgKHN3cHRyID09IDAgfHwgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplIC8gMiB8fCAKCSAgICBzd3B0ciA9PSBkbWFidWYtPmRtYXNpemUpCgkJcmV0dXJuOwoKCWlmIChzd3B0ciA8IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpCgkJbGVuID0gZG1hYnVmLT5kbWFzaXplIC8gMiAtIHN3cHRyOwoJZWxzZQoJCWxlbiA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwoKCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBzaWxlbmNlLCBsZW4pOwoJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWRtYWJ1Zi0+c3dwdHIgKz0gbGVuOwoJCWRtYWJ1Zi0+Y291bnQgKz0gbGVuOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Cgl9CgoJLyogcmVzdGFydCB0aGUgZG1hIG1hY2hpbmUgaW4gY2FzZSBpdCBpcyBoYWx0ZWQgKi8KCXN0YXJ0X2RhYyhzdGF0ZSk7Cn0KCnN0YXRpYyBpbnQKZHJhaW5fZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgaW50IG5vbmJsb2NrKQp7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGxvbmcgdG1vOwoJaW50IGNvdW50OwoJdW5zaWduZWQgbG9uZyBkaWZmID0gMDsKCglpZiAoZG1hYnVmLT5tYXBwZWQgfHwgIWRtYWJ1Zi0+cmVhZHkpCgkJcmV0dXJuIDA7CgoJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwoJZm9yICg7OykgewoJCS8qIEl0IHNlZW1zIHRoYXQgd2UgaGF2ZSB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFCgkJICAgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzIHJlYWxseSBnbyB0byBzbGVlcCAqLwoJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQlpZiAoY291bnQgPD0gMCkKCQkJYnJlYWs7CgoJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJYnJlYWs7CgoJCWlmIChub25ibG9jaykgewoJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CgkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CgkJCXJldHVybiAtRUJVU1k7CgkJfQoKCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAoJCSAgIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwgCgkJICAgIHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewoJCQlkaWZmID0gZG1hYnVmLT5zd3B0ciAtIHRyaWRlbnRfZ2V0X2RtYV9hZGRyKHN0YXRlKSArIGRtYWJ1Zi0+ZG1hc2l6ZTsKCQkJZGlmZiA9IGRpZmYgJSAoZG1hYnVmLT5kbWFzaXplKTsKCQkJdG1vID0gKGRpZmYgKiBIWikgLyBkbWFidWYtPnJhdGU7CgkJfSBlbHNlIHsKCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKCQl9CgkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8pIHsKCQkJYnJlYWs7CgkJfQoJfQoJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwoJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCXJldHVybiAwOwp9CgovKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCAqLyAKLyogZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X3VwZGF0ZV9wdHIoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKCWludCBjbGVhcl9jbnQgPSAwOwoJaW50IGRpZmY7Cgl1bnNpZ25lZCBjaGFyIHNpbGVuY2U7Cgl1bnNpZ25lZCBoYWxmX2RtYXNpemU7CgoJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KCWh3cHRyID0gdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RhdGUpOwoJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOwoJZG1hYnVmLT5od3B0ciA9IGh3cHRyOwoJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOwoKCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIEFEQyAqLwoJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CgkJfSBlbHNlIHsKCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwoKCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8IAoJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewoJCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCAqLyAKCQkJCS8qIHdlIGhhdmUgbm8gd2F5IHRvIHJlY292ZXIgaXQgaGVyZSwganVzdCAqLyAKCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLyAKCQkJCS8qIGZvcmNlIGh3cHRyIGFuZCBzd3B0ciB0byBzeW5jICovCgkJCQlfX3N0b3BfYWRjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKCQkJfQoJCQlpZiAoZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpCgkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwoJCX0KCX0KCgkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KCWlmIChkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORykgewoJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7CgkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwoJCX0gZWxzZSB7CgkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKCgkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCAKCQkJICAgIGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlcgoJCQkJICAgaXQgaGVyZSwganVzdCBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgZm9yY2UgaHdwdHIKCQkJCSAgIGFuZCBzd3B0ciB0byBzeW5jICovCgkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKCQkJfSBlbHNlIGlmICghZG1hYnVmLT5lbmRjbGVhcmVkKSB7CgkJCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CgkJCQlzaWxlbmNlID0gKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQgPyAwIDogMHg4MCk7CgkJCQlpZiAoZG1hYnVmLT51cGRhdGVfZmxhZyAmIEFMSV9BRERSRVNTX0lOVF9VUERBVEUpIHsKCQkJCQkvKiBXZSBtdXN0IGNsZWFyIGVuZCBkYXRhIG9mIDEvMiBkbWFidWYgaWYgbmVlZGVkLgoJCQkJCSAgIEFjY29yZGluZyB0byAxLzIgYWxnb3JpdGhtIG9mIEFkZHJlc3MgRW5naW5lIEludGVycnVwdCwKCQkJCQkgICBjaGVjayB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZGF0YSBvZiBoYWxmIGRtYXNpemUuICovCgkJCQkJaGFsZl9kbWFzaXplID0gZG1hYnVmLT5kbWFzaXplIC8gMjsKCQkJCQlpZiAoKGRpZmYgPSBod3B0ciAtIGhhbGZfZG1hc2l6ZSkgPCAwKQoJCQkJCQlkaWZmID0gaHdwdHI7CgkJCQkJaWYgKChkbWFidWYtPmNvdW50ICsgZGlmZikgPCBoYWxmX2RtYXNpemUpIHsKCQkJCQkJLy90aGVyZSBpcyBpbnZhbGlkIGRhdGEgaW4gdGhlIGVuZCBvZiBoYWxmIGJ1ZmZlcgoJCQkJCQlpZiAoKGNsZWFyX2NudCA9IGhhbGZfZG1hc2l6ZSAtIHN3cHRyKSA8IDApCgkJCQkJCQljbGVhcl9jbnQgKz0gaGFsZl9kbWFzaXplOwoJCQkJCQkvL2NsZWFyIHRoZSBpbnZhbGlkIGRhdGEKCQkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKCQkJCQkJCWNsZWFyX2NudCA9IGNsZWFyX2NudCAvIDI7CgkJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCX0KCQkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYgKGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKSB7CgkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5mcmFnc2l6ZTsKCQkJCQlpZiAoKHN3cHRyICsgY2xlYXJfY250KSA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKCQkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CgkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwoJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCX0KCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAxOwoJCQkJfQoJCQl9CgkJCS8qIHRyaWRlbnRfdXBkYXRlX3B0ciBpcyBjYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgb3IgYnkgcHJvY2VzcyB2aWEKCQkJICAgaW9jdGwvcG9sbCwgd2Ugb25seSB3YWtlIHVwIHRoZSB3YWl0aW5nIHByb2Nlc3Mgd2hlbiB3ZSBoYXZlIG1vcmUKCQkJICAgdGhhbiAxLzIgYnVmZmVyIGZyZWUgKGFsd2F5cyB0cnVlIGZvciBpbnRlcnJ1cHQgaGFuZGxlcikgKi8KCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgLyAyKQoJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKCQl9Cgl9CglkbWFidWYtPnVwZGF0ZV9mbGFnICY9IH5BTElfQUREUkVTU19JTlRfVVBEQVRFOwp9CgpzdGF0aWMgdm9pZAp0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBpOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOwoJdW5zaWduZWQgaW50IGNoYW5uZWw7CgoJLyogVXBkYXRlIHRoZSBwb2ludGVycyBmb3IgYWxsIGNoYW5uZWxzIHdlIGFyZSBydW5uaW5nLiAqLwoJLyogRklYTUU6IHNob3VsZCByZWFkIGludGVycnVwdCBzdGF0dXMgb25seSBvbmNlICovCglmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCWNoYW5uZWwgPSA2MyAtIGk7CgkJaWYgKHRyaWRlbnRfY2hlY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCkpIHsKCQkJdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCk7CgkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKCQkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJCX0gZWxzZSB7CgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIgCgkJCQkgICAgICAgImlycSAlZC5cbiIsIGNoYW5uZWwpOwoJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGNoYW5uZWwpOwoJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQKYWxpX2h3dm9sX2NvbnRyb2woc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IG9wdCkKewoJdTE2IGR3VGVtcCwgdm9sdW1lWzJdLCBtdXRlLCBkaWZmLCAqcFZvbFsyXTsKCglkd1RlbXAgPSBhbGlfYWM5N19yZWFkKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIpOwoJbXV0ZSA9IGR3VGVtcCAmIDB4ODAwMDsKCXZvbHVtZVswXSA9IGR3VGVtcCAmIDB4MDAxZjsKCXZvbHVtZVsxXSA9IChkd1RlbXAgJiAweDFmMDApID4+IDg7CglpZiAodm9sdW1lWzBdIDwgdm9sdW1lWzFdKSB7CgkJcFZvbFswXSA9ICZ2b2x1bWVbMF07CgkJcFZvbFsxXSA9ICZ2b2x1bWVbMV07Cgl9IGVsc2UgewoJCXBWb2xbMV0gPSAmdm9sdW1lWzBdOwoJCXBWb2xbMF0gPSAmdm9sdW1lWzFdOwoJfQoJZGlmZiA9ICoocFZvbFsxXSkgLSAqKHBWb2xbMF0pOwoKCWlmIChvcHQgPT0gMSkgewkJLy8gTVVURQoJCWR3VGVtcCBePSAweDgwMDA7CgkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgCgkJCSAgICAgICAweDAyLCBkd1RlbXApOwoJfSBlbHNlIGlmIChvcHQgPT0gMikgewkvLyBEb3duCgkJaWYgKG11dGUpCgkJCXJldHVybjsKCQlpZiAoKihwVm9sWzFdKSA8IDB4MDAxZikgewoJCQkoKnBWb2xbMV0pKys7CgkJCSoocFZvbFswXSkgPSAqKHBWb2xbMV0pIC0gZGlmZjsKCQl9CgkJZHdUZW1wICY9IDB4ZTBlMDsKCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7CgkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKCX0gZWxzZSBpZiAob3B0ID09IDQpIHsJLy8gVXAKCQlpZiAobXV0ZSkKCQkJcmV0dXJuOwoJCWlmICgqKHBWb2xbMF0pID4gMCkgewoJCQkoKnBWb2xbMF0pLS07CgkJCSoocFZvbFsxXSkgPSAqKHBWb2xbMF0pICsgZGlmZjsKCQl9CgkJZHdUZW1wICY9IDB4ZTBlMDsKCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7CgkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKCX0gZWxzZSB7CgkJLyogTm90aGluZyBuZWVkcyBkb2luZyAqLwoJfQp9CgovKgogKglSZS1lbmFibGUgcmVwb3J0aW5nIG9mIHZvbCBjaGFuZ2UgYWZ0ZXIgMC4xIHNlY29uZHMKICovCgpzdGF0aWMgdm9pZAphbGlfdGltZW91dCh1bnNpZ25lZCBsb25nIHB0cikKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIHB0cjsKCXUxNiB0ZW1wID0gMDsKCgkvKiBFbmFibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cgl0ZW1wIHw9IDB4MDAwNDsKCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cn0KCi8qCiAqCVNldCB1cCB0aGUgdGltZXIgdG8gY2xlYXIgdGhlIHZvbCBjaGFuZ2Ugbm90aWZpY2F0aW9uCiAqLwoKc3RhdGljIHZvaWQKYWxpX3NldF90aW1lcihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CgkvKiBBZGQgVGltZXIgUm91dGluZSB0byBFbmFibGUgR1BJTyBJUlEgKi8KCWRlbF90aW1lcigmY2FyZC0+dGltZXIpOwkvKiBOZXZlciBxdWV1ZSB0d2ljZSAqLwoJY2FyZC0+dGltZXIuZnVuY3Rpb24gPSBhbGlfdGltZW91dDsKCWNhcmQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2FyZDsKCWNhcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKCWFkZF90aW1lcigmY2FyZC0+dGltZXIpOwp9CgovKgogKglQcm9jZXNzIGEgR1BJTyBldmVudAogKi8KCnN0YXRpYyB2b2lkCmFsaV9xdWV1ZV90YXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCnsKCXUxNiB0ZW1wOwoKCS8qIERpc2FibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cgl0ZW1wICY9ICh1MTYpICh+MHgwMDA0KTsKCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CgoJLyogQWRqdXN0IHRoZSB2b2x1bWUgKi8KCWFsaV9od3ZvbF9jb250cm9sKGNhcmQsIG9wdCk7CgoJLyogU2V0IHRoZSB0aW1lciBmb3IgMS8xMHRoIHNlYyAqLwoJYWxpX3NldF90aW1lcihjYXJkKTsKfQoKc3RhdGljIHZvaWQKY3liZXJfYWRkcmVzc19pbnRlcnJ1cHQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJaW50IGksIGlycV9zdGF0dXM7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGU7Cgl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKCgkvKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGZvciBhbGwgY2hhbm5lbHMgd2UgYXJlIHJ1bm5pbmcuICovCgkvKiBGSVhFRDogcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLwoJaXJxX3N0YXR1cyA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9BKSk7CgoJcHJfZGVidWcoImN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OiBpcnFfc3RhdHVzIDB4JVhcbiIsIGlycV9zdGF0dXMpOwoKCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CgkJY2hhbm5lbCA9IDMxIC0gaTsKCQlpZiAoaXJxX3N0YXR1cyAmICgxIDw8IGNoYW5uZWwpKSB7CgkJCS8qIGNsZWFyIGJpdCBieSB3cml0aW5nIGEgMSwgemVyb2VzIGFyZSBpZ25vcmVkICovCgkJCW91dGwoKDEgPDwgY2hhbm5lbCksIFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0EpKTsKCgkJCXByX2RlYnVnKCJjeWJlcl9pbnRlcnJ1cHQ6IGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOwoKCQkJaWYgKChzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSkgIT0gTlVMTCkgewoJCQkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQkJfSBlbHNlIHsKCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImN5YmVyNTA1MDogc3B1cmlvdXMgIiAKCQkJCSAgICAgICAiY2hhbm5lbCBpcnEgJWQuXG4iLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbm5lbCk7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdAp0cmlkZW50X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgZGV2X2lkOwoJdTMyIGV2ZW50OwoJdTMyIGdwaW87CgoJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfaW50ZXJydXB0IGNhbGxlZCwgTUlTQ0lOVCA9IDB4JTA4eFxuIiwKCQkgZXZlbnQpOwoKCWlmIChldmVudCAmIEFERFJFU1NfSVJRKSB7CgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQoY2FyZCk7Cgl9CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJLyogR1BJTyBJUlEgKEgvVyBWb2x1bWUgQ29udHJvbCkgKi8KCQlldmVudCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCWlmIChldmVudCAmICgxIDw8IDI1KSkgewoJCQlncGlvID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HUElPKSk7CgkJCWlmICghdGltZXJfcGVuZGluZygmY2FyZC0+dGltZXIpKQoJCQkJYWxpX3F1ZXVlX3Rhc2soY2FyZCwgZ3BpbyAmIDB4MDcpOwoJCX0KCQlldmVudCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAoJCSAgICAgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoKCS8qIG1hbnVhbGx5IGNsZWFyIGludGVycnVwdCBzdGF0dXMsIGJhZCBoYXJkd2FyZSBkZXNpZ24sIGJsYW1lIFReMiAqLwoJb3V0bCgoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAoJICAgICBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyAqLyAKLyogdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCi8qIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLwpzdGF0aWMgc3NpemVfdAp0cmlkZW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cglzc2l6ZV90IHJldCA9IDA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgc3dwdHI7CglpbnQgY250OwoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X3JlYWQgY2FsbGVkLCBjb3VudCA9ICVkXG4iLCBjb3VudCk7CgoJVkFMSURBVEVfU1RBVEUoc3RhdGUpOwoKCWlmIChkbWFidWYtPm1hcHBlZCkKCQlyZXR1cm4gLUVOWElPOwoJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKCQlyZXR1cm4gLUVGQVVMVDsKCgltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCgkJZ290byBvdXQ7CgoJd2hpbGUgKGNvdW50ID4gMCkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWlmIChkbWFidWYtPmNvdW50ID4gKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplKSB7CgkJCS8qIGJ1ZmZlciBvdmVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAoJCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyLCAqLyAKCQkJLyogbWFrZSBwcm9jZXNzIGZsdXNoIHRoZSBidWZmZXIgKi8KCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CgkJfQoJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKCQlpZiAoZG1hYnVmLT5jb3VudCA8IGNudCkKCQkJY250ID0gZG1hYnVmLT5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQlpZiAoY250ID4gY291bnQpCgkJCWNudCA9IGNvdW50OwoJCWlmIChjbnQgPD0gMCkgewoJCQl1bnNpZ25lZCBsb25nIHRtbzsKCQkJLyogYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAoJCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHJlY29yZGVkICovCgkJCXN0YXJ0X2FkYyhzdGF0ZSk7CgkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVBR0FJTjsKCQkJCWdvdG8gb3V0OwoJCQl9CgoJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoJCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggc3BhY2UgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLyAKCQkJLyogd2UgaGF2ZSB0byB3YWl0IHVudGlsIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPICovIAoJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIChkbWFidWYtPnJhdGUgKiAyKTsKCQkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCgkJCSAgIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieQoJCQkgICBJU1IgT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggbWVhbnMgdGhhdAoJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAoJCQkgICBpcyBUT08gTEFURSBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAoc2NoZWR1bGVyIGxhdGVuY3kpCgkJCSAgIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSBidWZmZXIgb3ZlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcwoJCQkgICBOT1RISU5HIHdlIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLwoJCQlpZiAoIWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmZG1hYnVmLT53YWl0LCB0bW8pKSB7CgkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcmVjb3JkaW5nIHNjaGVkdWxlIHRpbWVvdXQsICIKCQkJCQkgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKCQkJCQkgZG1hYnVmLT5kbWFzaXplLCBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAoJCQkJCSBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKCgkJCQkvKiBhIGJ1ZmZlciBvdmVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgdW50aWwgbmV4dCB0aW1lIHRoZQoJCQkJICAgd2hpbGUgbG9vcCBiZWdpbiBhbmQgd2UgUkVBTExZIGhhdmUgc3BhY2UgdG8gcmVjb3JkICovCgkJCX0KCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CgkJCQlnb3RvIG91dDsKCQkJfQoJCQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRU5YSU87CgkJCQlnb3RvIG91dDsKCQkJfQoJCQljb250aW51ZTsKCQl9CgoJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CgkJCWlmICghcmV0KQoJCQkJcmV0ID0gLUVGQVVMVDsKCQkJZ290byBvdXQ7CgkJfQoKCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKCQlkbWFidWYtPmNvdW50IC09IGNudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQljb3VudCAtPSBjbnQ7CgkJYnVmZmVyICs9IGNudDsKCQlyZXQgKz0gY250OwoJCXN0YXJ0X2FkYyhzdGF0ZSk7Cgl9Cm91dDoKCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CglyZXR1cm4gcmV0Owp9CgovKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBkbWEgdG8KICAgdGhlIHNvdW5kY2FyZC4gIGl0IGlzIGRyYWluZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBmaWxsZWQgYnkgdGhpcyBsb29wLiAqLwoKc3RhdGljIHNzaXplX3QKdHJpZGVudF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQp7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXNzaXplX3QgcmV0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIHN3cHRyOwoJaW50IGNudDsKCXVuc2lnbmVkIGludCBzdGF0ZV9jbnQ7Cgl1bnNpZ25lZCBpbnQgY29weV9jb3VudDsKCWludCBscmV0OyAvKiBmb3IgbG9ja19zZXRfZm10ICovCgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfd3JpdGUgY2FsbGVkLCBjb3VudCA9ICVkXG4iLCBjb3VudCk7CgoJVkFMSURBVEVfU1RBVEUoc3RhdGUpOwoKCS8qCgkgKiAgICAgIEd1YXJkIGFnYWluc3QgYW4gbW1hcCBvciBpb2N0bCB3aGlsZSB3cml0aW5nCgkgKi8KCgltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCglpZiAoZG1hYnVmLT5tYXBwZWQpIHsKCQlyZXQgPSAtRU5YSU87CgkJZ290byBvdXQ7Cgl9CglpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkpCgkJZ290byBvdXQ7CgoJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKSB7CgkJcmV0ID0gLUVGQVVMVDsKCQlnb3RvIG91dDsKCX0KCglyZXQgPSAwOwoKCXdoaWxlIChjb3VudCA+IDApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKCQkJLyogYnVmZmVyIHVuZGVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAoJCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyICovCgkJCWRtYWJ1Zi0+Y291bnQgPSAwOwoJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKCQl9CgkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwoJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwoJCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplKQoJCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCWlmIChjbnQgPiBjb3VudCkKCQkJY250ID0gY291bnQ7CgkJaWYgKGNudCA8PSAwKSB7CgkJCXVuc2lnbmVkIGxvbmcgdG1vOwoJCQkvKiBidWZmZXIgaXMgZnVsbCwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKCQkJLyogd2FpdCBmb3IgZGF0YSB0byBiZSBwbGF5ZWQgKi8KCQkJc3RhcnRfZGFjKHN0YXRlKTsKCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUFHQUlOOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIGRhdGEgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLyAKCQkJLyogd2UgaGF2ZSB0byB3YWl0IHVudGlsIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPICovIAoJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KCQkJbG9ja19zZXRfZm10KHN0YXRlKTsKCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIChkbWFidWYtPnJhdGUgKiAyKTsKCQkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CgoJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0ICovIAoJCQkvKiByZXR1cm5zLCBvbmUgaXMgd2hlbiB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkICovIAoJCQkvKiBjb3JyZWN0bHkgYW5kIHRoZSBwcm9jZXNzIGlzIHdha2VkIHVwIGJ5IElTUiAqLyAKCQkJLyogT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggKi8gCgkJCS8qIG1lYW5zIHRoYXQgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgKi8gCgkJCS8qIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0IGlzIFRPTyBMQVRFICovIAoJCQkvKiBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAqLyAKCQkJLyogKHNjaGVkdWxlciBsYXRlbmN5KSB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgKi8gCgkJCS8qIGJ1ZmZlciB1bmRlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcyBOT1RISU5HIHdlICovIAoJCQkvKiBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRtYWJ1Zi0+d2FpdCwgdG1vKSkgewoJCQkJcHJfZGVidWcoS0VSTl9FUlIgInRyaWRlbnQ6IHBsYXliYWNrIHNjaGVkdWxlICIKCQkJCQkgInRpbWVvdXQsIGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSAiCgkJCQkJICJod3B0ciAldSBzd3B0ciAldVxuIiwgZG1hYnVmLT5kbWFzaXplLAoJCQkJCSBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAoJCQkJCSBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKCgkJCQkvKiBhIGJ1ZmZlciB1bmRlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5ICovIAoJCQkJLyogdW50aWwgbmV4dCB0aW1lIHRoZSB3aGlsZSBsb29wIGJlZ2luIGFuZCAqLyAKCQkJCS8qIHdlIFJFQUxMWSBoYXZlIGRhdGEgdG8gcGxheSAqLwoJCQl9CgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwoJCQkJZ290byBvdXRfbm9sb2NrOwoJCQl9CgkJCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwoJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FTlhJTzsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoKGxyZXQgPSBsb2NrX3NldF9mbXQoc3RhdGUpKSA8IDApIHsKCQkJcmV0ID0gbHJldDsKCQkJZ290byBvdXQ7CgkJfQoKCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CgkJCWNvcHlfY291bnQgPSAwOwoJCQlzdGF0ZV9jbnQgPSAwOwoJCQlpZiAoYWxpX3dyaXRlXzVfMShzdGF0ZSwgYnVmZmVyLCBjbnQsICZjb3B5X2NvdW50LCAKCQkJCQkgICZzdGF0ZV9jbnQpID09IC1FRkFVTFQpIHsKCQkJCWlmIChzdGF0ZV9jbnQpIHsKCQkJCQlzd3B0ciA9IChzd3B0ciArIHN0YXRlX2NudCkgJSBkbWFidWYtPmRtYXNpemU7CgkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCQkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOwoJCQkJCWRtYWJ1Zi0+Y291bnQgKz0gc3RhdGVfY250OwoJCQkJCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDA7CgkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQkJCX0KCQkJCXJldCArPSBjb3B5X2NvdW50OwoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVGQVVMVDsKCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgY250KSkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVGQVVMVDsKCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJCXN0YXRlX2NudCA9IGNudDsKCQl9CgkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoKCQlzd3B0ciA9IChzd3B0ciArIHN0YXRlX2NudCkgJSBkbWFidWYtPmRtYXNpemU7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKCQlkbWFidWYtPmNvdW50ICs9IHN0YXRlX2NudDsKCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAwOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCWNvdW50IC09IGNudDsKCQlidWZmZXIgKz0gY250OwoJCXJldCArPSBjbnQ7CgkJc3RhcnRfZGFjKHN0YXRlKTsKCX0Kb3V0OgoJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKb3V0X25vbG9jazoKCXJldHVybiByZXQ7Cn0KCi8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCnN0YXRpYyB1bnNpZ25lZCBpbnQKdHJpZGVudF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCnsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCBtYXNrID0gMDsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoJLyoKCSAqICAgICAgR3VhcmQgYWdhaW5zdCBhIHBhcmFsbGVsIHBvbGwgYW5kIHdyaXRlIGNhdXNpbmcgbXVsdGlwbGUKCSAqICAgICAgcHJvZ19kbWFidWYgZXZlbnRzCgkgKi8KCgltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSB7CgkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CgkJCXJldHVybiAwOwoJCX0KCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RhdGUpKSB7CgkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CgkJCXJldHVybiAwOwoJCX0KCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Cgl9CgoJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKCX0KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQoJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKCQl9IGVsc2UgewoJCQlpZiAoKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplID49IGRtYWJ1Zi0+Y291bnQgKyAKCQkJICAgIChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwoJCX0KCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJcmV0dXJuIG1hc2s7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CglpbnQgcmV0ID0gLUVJTlZBTDsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoJLyoKCSAqICAgICAgTG9jayBhZ2FpbnN0IHBvbGwgcmVhZCB3cml0ZSBvciBtbWFwIGNyZWF0aW5nIGJ1ZmZlcnMuIEFsc28gbG9jawoJICogICAgICBhIHJlYWQgb3Igd3JpdGUgYWdhaW5zdCBhbiBtbWFwLgoJICovCgoJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CgoJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgewoJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKQoJCQlnb3RvIG91dDsKCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpICE9IDApCgkJCWdvdG8gb3V0OwoJfSBlbHNlCgkJZ290byBvdXQ7CgoJcmV0ID0gLUVJTlZBTDsKCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCgkJZ290byBvdXQ7CglzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwoJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpKQoJCWdvdG8gb3V0OwoJcmV0ID0gLUVBR0FJTjsKCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAoJCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKCQkJICAgICBzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCgkJZ290byBvdXQ7CglkbWFidWYtPm1hcHBlZCA9IDE7CglyZXQgPSAwOwpvdXQ6CgltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludAp0cmlkZW50X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglhdWRpb19idWZfaW5mbyBhYmluZm87Cgljb3VudF9pbmZvIGNpbmZvOwoJaW50IHZhbCwgbWFwcGVkLCByZXQgPSAwOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CglpbnQgX191c2VyICpwID0gYXJncDsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoKCW1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpICYmIGRtYWJ1Zi0+bWFwcGVkKTsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9pb2N0bCwgY29tbWFuZCA9ICUyZCwgYXJnID0gMHglMDh4XG4iLAoJCSBfSU9DX05SKGNtZCksIGFyZyA/ICpwIDogMCk7CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgT1NTX0dFVFZFUlNJT046CgkJcmV0ID0gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgoJCS8qIEZJWE1FOiBzcGluX2xvY2sgPyAqLwoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQlzdG9wX2RhYyhzdGF0ZSk7CgkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOwoJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOwoJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCXN0b3BfYWRjKHN0YXRlKTsKCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CgkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CgkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKCQl9CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NZTkM6CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQoJCQlyZXQgPSBkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU1BFRUQ6CS8qIHNldCBzbWFwbGUgcmF0ZSAqLwoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAodmFsID49IDApIHsKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCQlzdG9wX2RhYyhzdGF0ZSk7CgkJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCQkJdHJpZGVudF9zZXRfZGFjX3JhdGUoc3RhdGUsIHZhbCk7CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCQl9CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCQlzdG9wX2FkYyhzdGF0ZSk7CgkJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCQkJdHJpZGVudF9zZXRfYWRjX3JhdGUoc3RhdGUsIHZhbCk7CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCQl9CgkJfQoJCXJldCA9IHB1dF91c2VyKGRtYWJ1Zi0+cmF0ZSwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoJLyogc2V0IHN0ZXJlbyBvciBtb25vIGNoYW5uZWwgKi8KCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKChyZXQgPSBsb2NrX3NldF9mbXQoc3RhdGUpKSA8IDApCgkJCXJldHVybiByZXQ7CgoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQlzdG9wX2RhYyhzdGF0ZSk7CgkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQlpZiAodmFsKQoJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOwoJCQllbHNlCgkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfU1RFUkVPOwoJCX0KCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQlzdG9wX2FkYyhzdGF0ZSk7CgkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQlpZiAodmFsKQoJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOwoJCQllbHNlCgkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfU1RFUkVPOwoJCX0KCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCWlmICgodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKCQkJCXJldCA9IHZhbDsKCQkJZWxzZQoJCQkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5mcmFnc2l6ZSwgcCk7CgkJCWJyZWFrOwoJCX0KCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQoJCQkJcmV0ID0gdmFsOwoJCQllbHNlCgkJCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKCQkJYnJlYWs7CgkJfQoJCS8qIG5laXRoZXIgUkVBRCBub3IgV1JJVEU/IGlzIHRoaXMgZXZlbiBwb3NzaWJsZT8gKi8KCQlyZXQgPSAtRUlOVkFMOwoJCWJyZWFrOwoKCgljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgb2Ygc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQgKi8KCQlyZXQgPSBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8IAoJCQkgICAgICAgQUZNVF9VOCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoJLyogU2VsZWN0IHNhbXBsZSBmb3JtYXQgKi8KCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKChyZXQgPSBsb2NrX3NldF9mbXQoc3RhdGUpKSA8IDApCgkJCXJldHVybiByZXQ7CgoJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgewoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKCQkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF8xNkJJVDsKCQkJCWVsc2UKCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfMTZCSVQ7CgkJCX0KCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJCXN0b3BfYWRjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKCQkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF8xNkJJVDsKCQkJCWVsc2UKCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfMTZCSVQ7CgkJCX0KCQl9CgkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDogCgkJCSAgICAgICBBRk1UX1U4LCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmICh2YWwgIT0gMCkgewoJCQlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKCQkJCXJldHVybiByZXQ7CgoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoKCQkJCS8vcHJldmVudCBmcm9tIG1lbW9yeSBsZWFrCgkJCQlpZiAoKHN0YXRlLT5jaGFuc19udW0gPiAyKSAmJiAoc3RhdGUtPmNoYW5zX251bSAhPSB2YWwpKSB7CgkJCQkJYWxpX2ZyZWVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdGF0ZSk7CgkJCQkJc3RhdGUtPmNoYW5zX251bSA9IDE7CgkJCQl9CgoJCQkJaWYgKHZhbCA+PSAyKSB7CgoJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UX1NURVJFTzsKCQkJCQlpZiAoKHZhbCA9PSA2KSAmJiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSkgewoJCQkJCQlpZiAoY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50ID4gMCkgewoJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBSZWNvcmQgaXMgIgoJCQkJCQkJICAgICAgICJ3b3JraW5nIG9uIHRoZSBjYXJkIVxuIik7CgkJCQkJCQlyZXQgPSAtRUJVU1k7CgkJCQkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQkJcmV0ID0gYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0YXRlLT5jYXJkLCA2KTsKCQkJCQkJaWYgKHJldCA8IDApIHsKCQkJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCW11dGV4X2xvY2soJnN0YXRlLT5jYXJkLT5vcGVuX211dGV4KTsKCQkJCQkJcmV0ID0gYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RhdGUsIDYpOwoJCQkJCQlpZiAocmV0IDwgMCkgewoJCQkJCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+Y2FyZC0+b3Blbl9tdXRleCk7CgkJCQkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlzdGF0ZS0+Y2FyZC0+bXVsdGlfY2hhbm5lbF91c2VfY291bnQrKzsKCQkJCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+Y2FyZC0+b3Blbl9tdXRleCk7CgkJCQkJfSBlbHNlCgkJCQkJCXZhbCA9IDI7CS8qeWllbGQgdG8gMi1jaGFubmVscyAqLwoJCQkJfSBlbHNlCgkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKCQkJCXN0YXRlLT5jaGFuc19udW0gPSB2YWw7CgkJCX0KCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJCXN0b3BfYWRjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQkJaWYgKHZhbCA+PSAyKSB7CgkJCQkJaWYgKCEoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAKCQkJCQkgICAgICAodmFsID09IDYpKSkKCQkJCQkJdmFsID0gMjsKCQkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CgkJCQl9IGVsc2UKCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfU1RFUkVPOwoJCQkJc3RhdGUtPmNoYW5zX251bSA9IHZhbDsKCQkJfQoJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJfQoJCXJldCA9IHB1dF91c2VyKHZhbCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CgkJLyogQ2F1c2UgdGhlIHdvcmtpbmcgZnJhZ21lbnQgdG8gYmUgb3V0cHV0ICovCgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKCQlpZiAoZG1hYnVmLT5zdWJkaXZpc2lvbikgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoKCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKCQlkbWFidWYtPm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CgkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0IDwgNCkKCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSA0OwoJCWlmIChkbWFidWYtPm9zc2ZyYWdzaGlmdCA+IDE1KQoJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDE1OwoJCWlmIChkbWFidWYtPm9zc21heGZyYWdzIDwgNCkKCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9IDQ7CgoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CgkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkgIT0gMCkgewoJCQlyZXQgPSB2YWw7CgkJCWJyZWFrOwoJCX0KCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CgkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+bnVtZnJhZzsKCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZiAoYWJpbmZvKSkgPyAKCQkJLUVGQVVMVCA6IDA7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RhdGUpKSAhPSAwKSB7CgkJCXJldCA9IHZhbDsKCQkJYnJlYWs7CgkJfQoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmNvdW50OwoJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwoJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAoJCQktRUZBVUxUIDogMDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CgkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgoJCXJldCA9IHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCAKCQkJICAgICAgIERTUF9DQVBfTU1BUCB8IERTUF9DQVBfQklORCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CgkJdmFsID0gMDsKCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYWJ1Zi0+ZW5hYmxlKQoJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBkbWFidWYtPmVuYWJsZSkKCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOwoJCXJldCA9IHB1dF91c2VyKHZhbCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7CgkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgCgkJCQkgICAgKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQoJCQkJCWJyZWFrOwoJCQkJc3RhcnRfYWRjKHN0YXRlKTsKCQkJfSBlbHNlCgkJCQlzdG9wX2FkYyhzdGF0ZSk7CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAKCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKCQkJCQlicmVhazsKCQkJCXN0YXJ0X2RhYyhzdGF0ZSk7CgkJCX0gZWxzZQoJCQkJc3RvcF9kYWMoc3RhdGUpOwoJCX0KCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RhdGUpKQoJCSAgICAhPSAwKSB7CgkJCXJldCA9IHZhbDsKCQkJYnJlYWs7CgkJfQoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOwoJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0cjsKCQlpZiAoZG1hYnVmLT5tYXBwZWQpCgkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5mcmFnc2l6ZSAtIDE7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAKCQkJLUVGQVVMVCA6IDA7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CgkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0YXRlKSkKCQkgICAgIT0gMCkgewoJCQlyZXQgPSB2YWw7CgkJCWJyZWFrOwoJCX0KCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CgkJY2luZm8uYmxvY2tzID0gZG1hYnVmLT5jb3VudCA+PiBkbWFidWYtPmZyYWdzaGlmdDsKCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOwoJCWlmIChkbWFidWYtPm1hcHBlZCkKCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmZyYWdzaXplIC0gMTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAoJCQktRUZBVUxUIDogMDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgoJCXJldCA9IC1FSU5WQUw7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKSB7CgkJCXJldCA9IHZhbDsKCQkJYnJlYWs7CgkJfQoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJdmFsID0gZG1hYnVmLT5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXJldCA9IHB1dF91c2VyKHZhbCwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgoJCXJldCA9IHB1dF91c2VyKGRtYWJ1Zi0+cmF0ZSwgcCk7CgkJYnJlYWs7CgoJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pID8gMiA6IDEsIAoJCQkgICAgICAgcCk7CgkJYnJlYWs7CgoJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgoJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDogCgkJCSAgICAgICBBRk1UX1U4LCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0s6CgkJcmV0ID0gcHV0X3VzZXIoRFNQX0JJTkRfRlJPTlQgfCBEU1BfQklORF9TVVJSIHwgCgkJCSAgICAgICBEU1BfQklORF9DRU5URVJfTEZFLCAgcCk7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTDoKCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHZhbCA9PSBEU1BfQklORF9RVUVSWSkgewoJCQl2YWwgPSBkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSB8IDB4M2MwMDsKCQkJdmFsID0gYXR0cjJtYXNrW3ZhbCA+PiA4XTsKCQl9IGVsc2UgewoJCQlkbWFidWYtPnJlYWR5ID0gMDsKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCgkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8IAoJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfU1BDX1BCIHwgCgkJCQkJCQkgICAgICBTUkNfRU5BQkxFKTsKCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgfD0gbWFzazJhdHRyW2Zmcyh2YWwpXTsKCQl9CgkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfTUFQSU5CVUY6CgljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgoJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgoJZGVmYXVsdDoKCQlyZXQgPSAtRUlOVkFMOwoJCWJyZWFrOwoKCX0KCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglpbnQgaSA9IDA7CglpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGRldnM7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSBOVUxMOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKCgkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgKi8KCS8qIFRPRE86IHRoZXJlJ3Mgc29tZSByZWR1bmRhY3kgaGVyZSB3cnQgdGhlIGNoZWNrIGJlbG93ICovCgkvKiBmb3IgbXVsdGlfdXNlX2NvdW50ID4gMC4gU2hvdWxkIHdlIHJldHVybiAtRUJVU1kgb3IgZmluZCAqLwoJLyogYSBkaWZmZXJlbnQgY2FyZD8gZm9yIG5vdywgZG9uJ3QgYnJlYWsgY3VycmVudCBiZWhhdmlvdXIgKi8KCS8qIC0tIG11bGl4ICovCglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCQlpZiAoY2FyZC0+bXVsdGlfY2hhbm5lbF91c2VfY291bnQgPiAwKQoJCQkJcmV0dXJuIC1FQlVTWTsKCQl9Cgl9CgoJLyogZmluZCBhbiBhdmFpbGFibGUgdmlydHVhbCBjaGFubmVsIChpbnN0YW5jZSBvZiAvZGV2L2RzcCkgKi8KCXdoaWxlIChjYXJkICE9IE5VTEwpIHsKCQltdXRleF9sb2NrKCZjYXJkLT5vcGVuX211dGV4KTsKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQkvKiBTa2lwIG9wZW5zIG9uIGNhcmRzIHRoYXQgYXJlIGluIDYgY2hhbm5lbCBtb2RlICovCgkJCWlmIChjYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA+IDApIHsKCQkJCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgkJCQljYXJkID0gY2FyZC0+bmV4dDsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CgkJCWlmIChjYXJkLT5zdGF0ZXNbaV0gPT0gTlVMTCkgewoJCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0gPSBrbWFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKCQkJCWlmIChzdGF0ZSA9PSBOVUxMKSB7CgkJCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX211dGV4KTsKCQkJCQlyZXR1cm4gLUVOT01FTTsKCQkJCX0KCQkJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOwoJCQkJbXV0ZXhfaW5pdCgmc3RhdGUtPnNlbSk7CgkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCQkJCWdvdG8gZm91bmRfdmlydDsKCQkJfQoJCX0KCQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoJCWNhcmQgPSBjYXJkLT5uZXh0OwoJfQoJLyogbm8gbW9yZSB2aXJ0dWFsIGNoYW5uZWwgYXZhaWFibGUgKi8KCWlmICghc3RhdGUpIHsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KICAgICAgZm91bmRfdmlydDoKCS8qIGZvdW5kIGEgZnJlZSB2aXJ0dWFsIGNoYW5uZWwsIGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWxzICovCglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKCQlkbWFidWYtPmNoYW5uZWwgPSBjYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwoY2FyZCk7CgllbHNlCgkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CgoJaWYgKGRtYWJ1Zi0+Y2hhbm5lbCA9PSBOVUxMKSB7CgkJa2ZyZWUoY2FyZC0+c3RhdGVzW2ldKTsKCQljYXJkLT5zdGF0ZXNbaV0gPSBOVUxMOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLwoJc3RhdGUtPnZpcnQgPSBpOwoJc3RhdGUtPmNhcmQgPSBjYXJkOwoJc3RhdGUtPm1hZ2ljID0gVFJJREVOVF9TVEFURV9NQUdJQzsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CglmaWxlLT5wcml2YXRlX2RhdGEgPSBzdGF0ZTsKCgkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyAqLyAKCS8qIEd1aWRlICAvZGV2L2RzcCBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sICovIAoJLyogd2l0aCBzYW1wbGUgcmF0ZSA4a0h6IGFuZCAvZGV2L2RzcFcgd2lsbCBhY2NlcHQgMTYtYml0cyBzYW1wbGUgKi8KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9NQVNLOwoJCWlmICgobWlub3IgJiAweDBmKSA9PSBTTkRfREVWX0RTUDE2KQoJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF8xNkJJVDsKCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDA7CgkJZG1hYnVmLT5vc3NtYXhmcmFncyA9IDA7CgkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IDA7CgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKCQkJLyogc2V0IGRlZmF1bHQgY2hhbm5lbCBhdHRyaWJ1dGUgdG8gbm9ybWFsIHBsYXliYWNrICovCgkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gQ0hBTk5FTF9QQjsKCQl9CgkJdHJpZGVudF9zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOwoJfQoKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJLyogRklYTUU6IFRyaWRlbnQgNGQgY2FuIG9ubHkgcmVjb3JkIGluIHNpZ25lZCAxNi1iaXRzIHN0ZXJlbywgKi8gCgkJLyogNDhrSHogc2FtcGxlLCB0byBiZSBkZWFsZWQgd2l0aCBpbiB0cmlkZW50X3NldF9hZGNfcmF0ZSgpID8/ICovCgkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX01BU0s7CgkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCgkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gMDsKCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byAweDhhODAsIHJlY29yZCBmcm9tCgkJCSAgIFBDTSBML1IgRklGTyBhbmQgbW9ubyA9IChsZWZ0ICsgcmlnaHQgKyAxKS8yICovCgkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwgUENNX0xSIHwgCgkJCQkJCSAgICAgIE1PTk9fTUlYKTsKCQl9CgkJdHJpZGVudF9zZXRfYWRjX3JhdGUoc3RhdGUsIDgwMDApOwoKCQkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgKi8KCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpCgkJCWNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCsrOwoJfQoKCXN0YXRlLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CgltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBvcGVuIHZpcnR1YWwgY2hhbm5lbCAlZCwgaGFyZCBjaGFubmVsICVkXG4iLAoJCSBzdGF0ZS0+dmlydCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwoKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludAp0cmlkZW50X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQ7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CgoJVkFMSURBVEVfU1RBVEUoc3RhdGUpOwoKCWNhcmQgPSBzdGF0ZS0+Y2FyZDsKCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCXRyaWRlbnRfY2xlYXJfdGFpbChzdGF0ZSk7CgkJZHJhaW5fZGFjKHN0YXRlLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cgl9CgoJcHJfZGVidWcoInRyaWRlbnQ6IGNsb3NpbmcgdmlydHVhbCBjaGFubmVsICVkLCBoYXJkIGNoYW5uZWwgJWRcbiIsCgkJIHN0YXRlLT52aXJ0LCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CgoJLyogc3RvcCBETUEgc3RhdGUgbWFjaGluZSBhbmQgZnJlZSBETUEgYnVmZmVycy9jaGFubmVscyAqLwoJbXV0ZXhfbG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJc3RvcF9kYWMoc3RhdGUpOwoJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CgkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKCgkJLyogQWRkZWQgYnkgTWF0dCBXdSAqLwoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCQlpZiAoc3RhdGUtPmNoYW5zX251bSA+IDIpIHsKCQkJCWlmIChjYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudC0tIDwgMCkKCQkJCQljYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9IDA7CgkJCQlpZiAoY2FyZC0+bXVsdGlfY2hhbm5lbF91c2VfY291bnQgPT0gMCkKCQkJCQlhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHMoKTsKCQkJCWFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RhdGUpOwoJCQl9CgkJfQoJfQoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQlzdG9wX2FkYyhzdGF0ZSk7CgkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwoKCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWlmIChjYXJkLT5yZWNfY2hhbm5lbF91c2VfY291bnQtLSA8IDApCgkJCQljYXJkLT5yZWNfY2hhbm5lbF91c2VfY291bnQgPSAwOwoJCX0KCX0KCgljYXJkLT5zdGF0ZXNbc3RhdGUtPnZpcnRdID0gTlVMTDsKCWtmcmVlKHN0YXRlKTsKCgkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX211dGV4ICovCgltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyaWRlbnRfYXVkaW9fZm9wcyA9IHsKCS5vd25lciA9IFRISVNfTU9EVUxFLAoJLmxsc2VlayA9IG5vX2xsc2VlaywKCS5yZWFkID0gdHJpZGVudF9yZWFkLAoJLndyaXRlID0gdHJpZGVudF93cml0ZSwKCS5wb2xsID0gdHJpZGVudF9wb2xsLAoJLmlvY3RsID0gdHJpZGVudF9pb2N0bCwKCS5tbWFwID0gdHJpZGVudF9tbWFwLAoJLm9wZW4gPSB0cmlkZW50X29wZW4sCgkucmVsZWFzZSA9IHRyaWRlbnRfcmVsZWFzZSwKfTsKCi8qIHRyaWRlbnQgc3BlY2lmaWMgQUM5NyBmdW5jdGlvbnMgKi8KLyogV3JpdGUgQUM5NyBjb2RlYyByZWdpc3RlcnMgKi8Kc3RhdGljIHZvaWQKdHJpZGVudF9hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopY29kZWMtPnByaXZhdGVfZGF0YTsKCXVuc2lnbmVkIGludCBhZGRyZXNzLCBtYXNrLCBidXN5OwoJdW5zaWduZWQgc2hvcnQgY291bnQgPSAweGZmZmY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTMyIGRhdGE7CgoJZGF0YSA9ICgodTMyKSB2YWwpIDw8IDE2OwoKCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CglkZWZhdWx0OgoJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CgkJYWRkcmVzcyA9IFNJX0FDOTdfV1JJVEU7CgkJbWFzayA9IFNJX0FDOTdfQlVTWV9XUklURSB8IFNJX0FDOTdfQVVESU9fQlVTWTsKCQlpZiAoY29kZWMtPmlkKQoJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOwoJCWJ1c3kgPSBTSV9BQzk3X0JVU1lfV1JJVEU7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgkJYWRkcmVzcyA9IERYX0FDUjBfQUM5N19XOwoJCW1hc2sgPSBidXN5ID0gRFhfQUM5N19CVVNZX1dSSVRFOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCWFkZHJlc3MgPSBOWF9BQ1IxX0FDOTdfVzsKCQltYXNrID0gTlhfQUM5N19CVVNZX1dSSVRFOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gTlhfQUM5N19XUklURV9TRUNPTkRBUlk7CgkJYnVzeSA9IE5YX0FDOTdfQlVTWV9XUklURTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQlhZGRyZXNzID0gU0lfQUM5N19XUklURTsKCQltYXNrID0gYnVzeSA9IFNJX0FDOTdfQlVTWV9XUklURTsKCQlpZiAoY29kZWMtPmlkKQoJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOwoJCWJyZWFrOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglkbyB7CgkJaWYgKChpbncoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpICYgYnVzeSkgPT0gMCkKCQkJYnJlYWs7Cgl9IHdoaWxlIChjb3VudC0tKTsKCglkYXRhIHw9IChtYXNrIHwgKHJlZyAmIEFDOTdfUkVHX0FERFIpKTsKCglpZiAoY291bnQgPT0gMCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogQUM5NyBDT0RFQyB3cml0ZSB0aW1lZCBvdXQuXG4iKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0dXJuOwoJfQoKCW91dGwoZGF0YSwgVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgovKiBSZWFkIEFDOTcgY29kZWMgcmVnaXN0ZXJzICovCnN0YXRpYyB1MTYKdHJpZGVudF9hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopY29kZWMtPnByaXZhdGVfZGF0YTsKCXVuc2lnbmVkIGludCBhZGRyZXNzLCBtYXNrLCBidXN5OwoJdW5zaWduZWQgc2hvcnQgY291bnQgPSAweGZmZmY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTMyIGRhdGE7CgoJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKCWRlZmF1bHQ6CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQlhZGRyZXNzID0gU0lfQUM5N19SRUFEOwoJCW1hc2sgPSBTSV9BQzk3X0JVU1lfUkVBRCB8IFNJX0FDOTdfQVVESU9fQlVTWTsKCQlpZiAoY29kZWMtPmlkKQoJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOwoJCWJ1c3kgPSBTSV9BQzk3X0JVU1lfUkVBRDsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQlhZGRyZXNzID0gRFhfQUNSMV9BQzk3X1I7CgkJbWFzayA9IGJ1c3kgPSBEWF9BQzk3X0JVU1lfUkVBRDsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKCQlpZiAoY29kZWMtPmlkKQoJCQlhZGRyZXNzID0gTlhfQUNSM19BQzk3X1JfU0VDT05EQVJZOwoJCWVsc2UKCQkJYWRkcmVzcyA9IE5YX0FDUjJfQUM5N19SX1BSSU1BUlk7CgkJbWFzayA9IE5YX0FDOTdfQlVTWV9SRUFEOwoJCWJ1c3kgPSBOWF9BQzk3X0JVU1lfUkVBRCB8IE5YX0FDOTdfQlVTWV9EQVRBOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CgkJbWFzayA9IGJ1c3kgPSBTSV9BQzk3X0JVU1lfUkVBRDsKCQlpZiAoY29kZWMtPmlkKQoJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOwoJCWJyZWFrOwoJfQoKCWRhdGEgPSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCW91dGwoZGF0YSwgVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOwoJZG8gewoJCWRhdGEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOwoJCWlmICgoZGF0YSAmIGJ1c3kpID09IDApCgkJCWJyZWFrOwoJfSB3aGlsZSAoY291bnQtLSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgoJaWYgKGNvdW50ID09IDApIHsKCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IEFDOTcgQ09ERUMgcmVhZCB0aW1lZCBvdXQuXG4iKTsKCQlkYXRhID0gMDsKCX0KCXJldHVybiAoKHUxNikgKGRhdGEgPj4gMTYpKTsKfQoKLyogcmV3cml0ZSBhYzk3IHJlYWQgYW5kIHdyaXRlIG1peGVyIHJlZ2lzdGVyIGJ5IGh1bGVpIGZvciBBTEkqLwpzdGF0aWMgaW50CmFjcXVpcmVjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MTYgd3NlbWFtYXNrID0gMHg2MDAwOwkvKiBiaXQgMTQuLjEzICovCgl1MTYgd3NlbWFiaXRzOwoJdTE2IHdjb250cm9sOwoJaW50IGJsb2NrID0gMDsKCWludCBuY291bnQgPSAyNTsKCXdoaWxlICgxKSB7CgkJd2NvbnRyb2wgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCQl3c2VtYWJpdHMgPSB3Y29udHJvbCAmIHdzZW1hbWFzazsKCgkJaWYgKHdzZW1hYml0cyA9PSAweDQwMDApCgkJCXJldHVybiAxOwkvKiAweDQwMDAgaXMgYXVkaW8gLHRoZW4gc3VjY2VzcyAqLwoJCWlmIChuY291bnQtLSA8IDApCgkJCWJyZWFrOwoJCWlmICh3c2VtYWJpdHMgPT0gMCkgewoJCSAgICAgIHVubG9jazoKCQkJb3V0bCgoKHUzMikgKHdjb250cm9sICYgMHgxZWZmKSB8IDB4MDAwMDQwMDApLCAKCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCQljb250aW51ZTsKCQl9CgkJdWRlbGF5KDIwKTsKCX0KCWlmICghYmxvY2spIHsKCQlwcl9kZWJ1ZygiYWNjZXNzY29kZWNzZW1hcGhvcmU6IHRyeSB1bmxvY2tcbiIpOwoJCWJsb2NrID0gMTsKCQlnb3RvIHVubG9jazsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZApyZWxlYXNlY29kZWNhY2Nlc3Moc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyB3Y29udHJvbDsKCXdjb250cm9sID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CglvdXRsKCh3Y29udHJvbCAmIDB4ZmZmZjFlZmYpLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwp9CgpzdGF0aWMgaW50CndhaXRmb3JzdGltZXJ0aWNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXVuc2lnbmVkIGxvbmcgY2hrMSwgY2hrMjsKCXVuc2lnbmVkIGludCB3Y291bnQgPSAweGZmZmY7CgljaGsxID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TVElNRVIpKTsKCgl3aGlsZSAoMSkgewoJCWNoazIgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwoJCWlmICgod2NvdW50ID4gMCkgJiYgY2hrMSAhPSBjaGsyKQoJCQlyZXR1cm4gMTsKCQlpZiAod2NvdW50IDw9IDApCgkJCWJyZWFrOwoJCXVkZWxheSg1MCk7Cgl9CglyZXR1cm4gMDsKfQoKLyogUmVhZCBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgQUxpKi8Kc3RhdGljIHUxNgphbGlfYWM5N19nZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnKQp7Cgl1bnNpZ25lZCBpbnQgYWRkcmVzcywgbWFzazsKCXVuc2lnbmVkIGludCBuY291bnQ7Cgl1bnNpZ25lZCBsb25nIGF1ZF9yZWc7Cgl1MzIgZGF0YTsKCXUxNiB3Y29udHJvbDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJaWYgKCFjYXJkKQoJCUJVRygpOwoKCWFkZHJlc3MgPSBBTElfQUM5N19SRUFEOwoJaWYgKGNhcmQtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgewoJCWFkZHJlc3MgPSBBTElfQUM5N19XUklURTsKCX0KCW1hc2sgPSBBTElfQUM5N19SRUFEX0FDVElPTiB8IEFMSV9BQzk3X0FVRElPX0JVU1k7CglpZiAoc2Vjb25kYXJ5KQoJCW1hc2sgfD0gQUxJX0FDOTdfU0VDT05EQVJZOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgoJaWYgKCFhY3F1aXJlY29kZWNhY2Nlc3MoY2FyZCkpCgkJcHJpbnRrKEtFUk5fRVJSICJhY2Nlc3MgY29kZWMgZmFpbFxuIik7CgoJd2NvbnRyb2wgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCXdjb250cm9sICY9IDB4ZmUwMDsKCXdjb250cm9sIHw9ICgweDgwMDAgfCByZWcpOwoJb3V0dyh3Y29udHJvbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCglkYXRhID0gKG1hc2sgfCAocmVnICYgQUM5N19SRUdfQUREUikpOwoKCWlmICghd2FpdGZvcnN0aW1lcnRpY2soY2FyZCkpIHsKCQlwcmludGsoS0VSTl9FUlIgImFsaV9hYzk3X3JlYWQ6IEJJVF9DTE9DSyBpcyBkZWFkXG4iKTsKCQlnb3RvIHJlbGVhc2Vjb2RlYzsKCX0KCgl1ZGVsYXkoMjApOwoKCW5jb3VudCA9IDEwOwoKCXdoaWxlICgxKSB7CgkJaWYgKChpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKSAmIEFMSV9BQzk3X0JVU1lfUkVBRCkgCgkJICAgICE9IDApCgkJCWJyZWFrOwoJCWlmIChuY291bnQgPD0gMCkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudC0tID09IDEpIHsKCQkJcHJfZGVidWcoImFsaV9hYzk3X3JlYWQgOnRyeSBjbGVhciBidXN5IGZsYWdcbiIpOwoJCQlhdWRfcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CgkJCW91dGwoKGF1ZF9yZWcgJiAweGZmZmY3ZmZmKSwgCgkJCSAgICAgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCQl9CgkJdWRlbGF5KDEwKTsKCX0KCglkYXRhID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHJlc3MpKTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgoJcmV0dXJuICgodTE2KSAoZGF0YSA+PiAxNikpOwoKICAgICAgcmVsZWFzZWNvZGVjOgoJcmVsZWFzZWNvZGVjYWNjZXNzKGNhcmQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJcHJpbnRrKEtFUk5fRVJSICJhbGlfYWM5N19yZWFkOiBBQzk3IENPREVDIHJlYWQgdGltZWQgb3V0LlxuIik7CglyZXR1cm4gMDsKfQoKLyogV3JpdGUgQUM5NyBjb2RlYyByZWdpc3RlcnMgZm9yIGh1bGVpKi8Kc3RhdGljIHZvaWQKYWxpX2FjOTdfc2V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBzZWNvbmRhcnksIHU4IHJlZywgdTE2IHZhbCkKewoJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2s7Cgl1bnNpZ25lZCBpbnQgbmNvdW50OwoJdTMyIGRhdGE7Cgl1MTYgd2NvbnRyb2w7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWRhdGEgPSAoKHUzMikgdmFsKSA8PCAxNjsKCglpZiAoIWNhcmQpCgkJQlVHKCk7CgoJYWRkcmVzcyA9IEFMSV9BQzk3X1dSSVRFOwoJbWFzayA9IEFMSV9BQzk3X1dSSVRFX0FDVElPTiB8IEFMSV9BQzk3X0FVRElPX0JVU1k7CglpZiAoc2Vjb25kYXJ5KQoJCW1hc2sgfD0gQUxJX0FDOTdfU0VDT05EQVJZOwoJaWYgKGNhcmQtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikKCQltYXNrIHw9IEFMSV9BQzk3X1dSSVRFX01JWEVSX1JFR0lTVEVSOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglpZiAoIWFjcXVpcmVjb2RlY2FjY2VzcyhjYXJkKSkKCQlwcmludGsoS0VSTl9FUlIgImFsaV9hYzk3X3dyaXRlOiBhY2Nlc3MgY29kZWMgZmFpbFxuIik7CgoJd2NvbnRyb2wgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCXdjb250cm9sICY9IDB4ZmYwMDsKCXdjb250cm9sIHw9ICgweDgxMDAgfCByZWcpOyAvKiBiaXQgOD0xOiAoYWxpMTUzNSApcmVzZXJ2ZWQvICovIAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsaTE1MzUrIHdyaXRlICovCglvdXRsKChkYXRhIHwgd2NvbnRyb2wpLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoKCWlmICghd2FpdGZvcnN0aW1lcnRpY2soY2FyZCkpIHsKCQlwcmludGsoS0VSTl9FUlIgIkJJVF9DTE9DSyBpcyBkZWFkXG4iKTsKCQlnb3RvIHJlbGVhc2Vjb2RlYzsKCX0KCgluY291bnQgPSAxMDsKCXdoaWxlICgxKSB7CgkJd2NvbnRyb2wgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCQlpZiAoISh3Y29udHJvbCAmIDB4ODAwMCkpCgkJCWJyZWFrOwoJCWlmIChuY291bnQgPD0gMCkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudC0tID09IDEpIHsKCQkJcHJfZGVidWcoImFsaV9hYzk3X3NldCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZyEhXG4iKTsKCQkJb3V0dyh3Y29udHJvbCAmIDB4N2ZmZiwgCgkJCSAgICAgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCQl9CgkJdWRlbGF5KDEwKTsKCX0KCiAgICAgIHJlbGVhc2Vjb2RlYzoKCXJlbGVhc2Vjb2RlY2FjY2VzcyhjYXJkKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCXJldHVybjsKfQoKc3RhdGljIHZvaWQKYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXQpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0LT5jYXJkOwoJdW5zaWduZWQgbG9uZyBzX2NoYW5uZWxzOwoKCXNfY2hhbm5lbHMgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzX2NoYW5uZWxzIHw9ICgxIDw8IHN0YXQtPmRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJb3V0bChzX2NoYW5uZWxzLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKfQoKc3RhdGljIHUxNgphbGlfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQp7CglpbnQgaWQ7Cgl1MTYgZGF0YTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBOVUxMOwoKCS8qIEFkZGVkIGJ5IE1hdHQgV3UgKi8KCWlmICghY29kZWMpCgkJQlVHKCk7CgoJY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGNvZGVjLT5wcml2YXRlX2RhdGE7CgoJaWYgKCFjYXJkLT5taXhlcl9yZWdzX3JlYWR5KQoJCXJldHVybiBhbGlfYWM5N19nZXQoY2FyZCwgY29kZWMtPmlkLCByZWcpOwoKCS8qCgkgKiAgICAgIEZJWE1FOiBuZWVkIHRvIHN0b3AgdGhpcyBjYWNoaW5nIHNvbWUgcmVnaXN0ZXJzCgkgKi8KCWlmIChjb2RlYy0+aWQpCgkJaWQgPSAxOwoJZWxzZQoJCWlkID0gMDsKCglkYXRhID0gY2FyZC0+bWl4ZXJfcmVnc1tyZWcgLyAyXVtpZF07CglyZXR1cm4gZGF0YTsKfQoKc3RhdGljIHZvaWQKYWxpX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpCnsKCWludCBpZDsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQ7CgoJLyogIEFkZGVkIGJ5IE1hdHQgV3UgKi8KCWlmICghY29kZWMpCgkJQlVHKCk7CgoJY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGNvZGVjLT5wcml2YXRlX2RhdGE7CgoJaWYgKCFjYXJkLT5taXhlcl9yZWdzX3JlYWR5KSB7CgkJYWxpX2FjOTdfc2V0KGNhcmQsIGNvZGVjLT5pZCwgcmVnLCB2YWwpOwoJCXJldHVybjsKCX0KCglpZiAoY29kZWMtPmlkKQoJCWlkID0gMTsKCWVsc2UKCQlpZCA9IDA7CgoJY2FyZC0+bWl4ZXJfcmVnc1tyZWcgLyAyXVtpZF0gPSB2YWw7CglhbGlfYWM5N19zZXQoY2FyZCwgY29kZWMtPmlkLCByZWcsIHZhbCk7Cn0KCi8qCmZsYWc6CUFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUCglBTElfUENNX1RPX1NQRElGX09VVAoqLwoKc3RhdGljIHZvaWQKYWxpX3NldHVwX3NwZGlmX291dChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgZmxhZykKewoJdW5zaWduZWQgbG9uZyBzcGRpZjsKCXVuc2lnbmVkIGNoYXIgY2g7CgoJY2hhciB0ZW1wOwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwoKCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAoJCQkJIHBjaV9kZXYpOwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm47CglwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDYxLCAmdGVtcCk7Cgl0ZW1wIHw9IDB4NDA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHg2MSwgdGVtcCk7CglwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdkLCAmdGVtcCk7Cgl0ZW1wIHw9IDB4MDE7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHg3ZCwgdGVtcCk7CglwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdlLCAmdGVtcCk7Cgl0ZW1wICY9ICh+MHgyMCk7Cgl0ZW1wIHw9IDB4MTA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHg3ZSwgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJY2ggPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CglvdXRiKGNoIHwgQUxJX1NQRElGX09VVF9FTkFCTEUsIFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOwoJY2ggPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCW91dGIoY2ggJiBBTElfU1BESUZfT1VUX0NIX1NUQVRVUywgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCglpZiAoZmxhZyAmIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUKSB7CgkJc3BkaWYgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgkJc3BkaWYgfD0gQUxJX1NQRElGX09VVF9DSF9FTkFCTEU7CgkJc3BkaWYgJj0gQUxJX1NQRElGX09VVF9TRUxfU1BESUY7CgkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgkJc3BkaWYgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTKSk7CgkJaWYgKGZsYWcgJiBBTElfU1BESUZfT1VUX05PTl9QQ00pCgkJCXNwZGlmIHw9IDB4MDAwMjsKCQllbHNlCgkJCXNwZGlmICY9ICh+MHgwMDAyKTsKCQlvdXR3KHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MpKTsKCX0gZWxzZSB7CgkJc3BkaWYgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgkJc3BkaWYgfD0gQUxJX1NQRElGX09VVF9TRUxfUENNOwoJCW91dHcoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoJfQp9CgpzdGF0aWMgdm9pZAphbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoKQp7Cgl1bnNpZ25lZCBsb25nIHNjOwoKCXNjID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoJc2MgJj0gfigxIDw8IGNoKTsKCW91dGwoc2MsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwp9CgpzdGF0aWMgdm9pZAphbGlfZGlzYWJsZV9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIHNwZGlmOwoKCXNwZGlmID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoJc3BkaWYgJj0gKH5BTElfU1BESUZfSU5fU1VQUE9SVCk7CglvdXRsKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCglhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY2FyZCwgQUxJX1NQRElGX0lOX0NIQU5ORUwpOwp9CgpzdGF0aWMgdm9pZAphbGlfc2V0dXBfc3BkaWZfaW4oc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBzcGRpZjsKCgkvL1NldCBTUERJRiBJTiBTdXBwb3J0ZWQKCXNwZGlmID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoJc3BkaWYgfD0gQUxJX1NQRElGX0lOX1NVUFBPUlQ7CglvdXRsKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCgkvL1NldCBTUERJRiBJTiBSZWMKCXNwZGlmID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoJc3BkaWYgfD0gQUxJX1NQRElGX0lOX0NIX0VOQUJMRTsKCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCXNwZGlmID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fQ0hfU1RBVFVTOwoJb3V0YihzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKLyoKCXNwZGlmID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fRlVOQ19FTkFCTEU7CglvdXRiKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoqLwp9CgpzdGF0aWMgdm9pZAphbGlfZGVsYXkoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGludGVydmFsKQp7Cgl1bnNpZ25lZCBsb25nIGJlZ2ludGltZXIsIGN1cnJlbnR0aW1lcjsKCgliZWdpbnRpbWVyID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TVElNRVIpKTsKCWN1cnJlbnR0aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CgoJd2hpbGUgKGN1cnJlbnR0aW1lciA8IGJlZ2ludGltZXIgKyBpbnRlcnZhbCkKCQljdXJyZW50dGltZXIgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwp9CgpzdGF0aWMgdm9pZAphbGlfZGV0ZWN0X3NwZGlmX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdTE2IHd2YWwgPSAwOwoJdTE2IGNvdW50ID0gMDsKCXU4IGJ2YWwgPSAwLCBSMSA9IDAsIFIyID0gMDsKCglidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglidmFsIHw9IDB4MDI7CglvdXRiKGJ2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CgoJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDEpKTsKCWJ2YWwgfD0gMHgxRjsKCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CgoJd2hpbGUgKCgoUjEgPCAweDBCKSB8fCAoUjEgPiAweDBFKSkgJiYgKFIxICE9IDB4MTIpICYmIAoJICAgICAgIGNvdW50IDw9IDUwMDAwKSB7CgkJY291bnQrKzsKCgkJYWxpX2RlbGF5KGNhcmQsIDYpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwoJCVIxID0gYnZhbCAmIDB4MUY7Cgl9CgoJaWYgKGNvdW50ID4gNTAwMDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBFcnJvciBpbiAiCgkJICAgICAgICJhbGlfZGV0ZWN0X3NwZGlmX3JhdGUhXG4iKTsKCQlyZXR1cm47Cgl9CgoJY291bnQgPSAwOwoKCXdoaWxlIChjb3VudCA8PSA1MDAwMCkgewoJCWNvdW50Kys7CgoJCWFsaV9kZWxheShjYXJkLCA2KTsKCgkJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDEpKTsKCQlSMiA9IGJ2YWwgJiAweDFGOwoKCQlpZiAoUjIgIT0gUjEpCgkJCVIxID0gUjI7CgkJZWxzZQoJCQlicmVhazsKCX0KCglpZiAoY291bnQgPiA1MDAwMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyaWRlbnQ6IEVycm9yIGluICIKCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKFIyKSB7CgljYXNlIDB4MGI6CgljYXNlIDB4MGM6CgljYXNlIDB4MGQ6CgljYXNlIDB4MGU6CgkJd3ZhbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKCQl3dmFsICY9IDB4RTBGMDsKCQl3dmFsIHw9ICh1MTYpIDB4MDkgPDwgOCB8ICh1MTYpIDB4MDU7CgkJb3V0dyh3dmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKCgkJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSkgJiAweEYwOwoJCW91dGIoYnZhbCB8IDB4MDIsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKTsKCQlicmVhazsKCgljYXNlIDB4MTI6CgkJd3ZhbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKCQl3dmFsICY9IDB4RTBGMDsKCQl3dmFsIHw9ICh1MTYpIDB4MEUgPDwgOCB8ICh1MTYpIDB4MDg7CgkJb3V0dyh3dmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKCgkJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSkgJiAweEYwOwoJCW91dGIoYnZhbCB8IDB4MDMsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKTsKCQlicmVhazsKCglkZWZhdWx0OgoJCWJyZWFrOwoJfQoKfQoKc3RhdGljIHVuc2lnbmVkIGludAphbGlfZ2V0X3NwZGlmX2luX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdTMyIGR3UmF0ZSA9IDA7Cgl1OCBidmFsID0gMDsKCglhbGlfZGV0ZWN0X3NwZGlmX3JhdGUoY2FyZCk7CgoJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJYnZhbCAmPSAweDdGOwoJYnZhbCB8PSAweDQwOwoJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoKCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMykpOwoJYnZhbCAmPSAweDBGOwoKCXN3aXRjaCAoYnZhbCkgewoJY2FzZSAwOgoJCWR3UmF0ZSA9IDQ0MTAwOwoJCWJyZWFrOwoJY2FzZSAxOgoJCWR3UmF0ZSA9IDQ4MDAwOwoJCWJyZWFrOwoJY2FzZSAyOgoJCWR3UmF0ZSA9IDMyMDAwOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQkvLyBFcnJvciBvY2N1cnMKCQlicmVhazsKCX0KCglyZXR1cm4gZHdSYXRlOwoKfQoKc3RhdGljIGludAphbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHModm9pZCkKewoJY2hhciB0ZW1wID0gMDsKCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NMTUzMywKCQkJCSBwY2lfZGV2KTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NTksICZ0ZW1wKTsKCXRlbXAgJj0gfjB4ODA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHg1OSwgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTcxMDEsCgkJCQkgTlVMTCk7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCglwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweEI4LCAmdGVtcCk7Cgl0ZW1wICY9IH4weDIwOwoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4QjgsIHRlbXApOwoKCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmFsaV9zZXR1cF9tdWx0aV9jaGFubmVscyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgY2hhbl9udW1zKQp7Cgl1bnNpZ25lZCBsb25nIGR3VmFsdWU7CgljaGFyIHRlbXAgPSAwOwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwoKCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAoJCQkJIHBjaV9kZXYpOwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCAmdGVtcCk7Cgl0ZW1wIHw9IDB4ODA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHg1OSwgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTcxMDEsCgkJCQkgTlVMTCk7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIChpbnQpIDB4QjgsICZ0ZW1wKTsKCXRlbXAgfD0gMHgyMDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAoaW50KSAweEI4LCAodTgpIHRlbXApOwoKCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwoKCWlmIChjaGFuX251bXMgPT0gNikgewoJCWR3VmFsdWUgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSkgfCAweDAwMGYwMDAwOwoJCW91dGwoZHdWYWx1ZSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgkJbWRlbGF5KDQpOwoJCWR3VmFsdWUgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgkJaWYgKGR3VmFsdWUgJiAweDIwMDAwMDApIHsKCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgwMiwgODA4MCk7CgkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MzYsIDApOwoJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDM4LCAwKTsKCQkJLyoKCQkJICogICAgICBPbiBhIGJvYXJkIHdpdGggYSBzaW5nbGUgY29kZWMgeW91IHdvbid0IGdldCB0aGUKCQkJICogICAgICBzdXJyb3VuZC4gT24gb3RoZXIgYm9hcmRzIGNvbmZpZ3VyZSBpdC4KCQkJICovCgkJCWlmIChjYXJkLT5hYzk3X2NvZGVjWzFdICE9IE5VTEwpIHsKCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MzYsIDApOwoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHgzOCwgMCk7CgkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDAyLCAweDA2MDYpOwoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHgxOCwgMHgwMzAzKTsKCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4NzQsIDB4Myk7CgkJCX0KCQkJcmV0dXJuIDE7CgkJfQoJfQoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyB2b2lkCmFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglpbnQgYmFuazsKCglpZiAoY2hhbm5lbCA+IDMxKQoJCXJldHVybjsKCgliYW5rID0gY2hhbm5lbCA+PiA1OwoJY2hhbm5lbCA9IGNoYW5uZWwgJiAweDFmOwoKCWNhcmQtPmJhbmtzW2JhbmtdLmJpdG1hcCAmPSB+KDEgPDwgKGNoYW5uZWwpKTsKfQoKc3RhdGljIGludAphbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGludCBjaGFuX251bXMpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzOwoJaW50IGksIHN0YXRlX2NvdW50ID0gMDsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rOwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbDsKCXVuc2lnbmVkIGxvbmcgbnVtOwoKCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKCglpZiAoY2hhbl9udW1zICE9IDYpCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgKGkgPCBBTElfQ0hBTk5FTFMpICYmIChzdGF0ZV9jb3VudCAhPSA0KTsgaSsrKSB7CgkJaWYgKGNhcmQtPnN0YXRlc1tpXSkKCQkJY29udGludWU7CgoJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IG51bSkpKSB7CgkJCWJhbmstPmJpdG1hcCB8PSAxIDw8IG51bTsKCQkJY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tudW1dOwoJCQljaGFubmVsLT5udW0gPSBudW07CgkJfSBlbHNlIHsKCQkJc3RhdGVfY291bnQtLTsKCQkJZm9yICg7IHN0YXRlX2NvdW50ID49IDA7IHN0YXRlX2NvdW50LS0pIHsKCQkJCWtmcmVlKHN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnRdKTsKCQkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCQkJCWFsaV9mcmVlX3BjbV9jaGFubmVsKGNhcmQsIG51bSk7CgkJCX0KCQkJcmV0dXJuIC1FQlVTWTsKCQl9CgkJcyA9IGNhcmQtPnN0YXRlc1tpXSA9IGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOwoJCWlmICghcykgewoJCQludW0gPSBhbGlfbXVsdGlfY2hhbm5lbHNfNV8xW3N0YXRlX2NvdW50XTsKCQkJYWxpX2ZyZWVfcGNtX2NoYW5uZWwoY2FyZCwgbnVtKTsKCQkJc3RhdGVfY291bnQtLTsKCQkJZm9yICg7IHN0YXRlX2NvdW50ID49IDA7IHN0YXRlX2NvdW50LS0pIHsKCQkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCQkJYWxpX2ZyZWVfcGNtX2NoYW5uZWwoY2FyZCwgbnVtKTsKCQkJCWtmcmVlKHN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnRdKTsKCQkJfQoJCQlyZXR1cm4gLUVOT01FTTsKCQl9CgkJbWVtc2V0KHMsIDAsIHNpemVvZigqc3RhdGUpKTsKCgkJcy0+ZG1hYnVmLmNoYW5uZWwgPSBjaGFubmVsOwoJCXMtPmRtYWJ1Zi5vc3NmcmFnc2hpZnQgPSBzLT5kbWFidWYub3NzbWF4ZnJhZ3MgPQoJCQlzLT5kbWFidWYuc3ViZGl2aXNpb24gPSAwOwoJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYWJ1Zi53YWl0KTsKCQlzLT5tYWdpYyA9IGNhcmQtPm1hZ2ljOwoJCXMtPmNhcmQgPSBjYXJkOwoJCXMtPnZpcnQgPSBpOwoJCWFsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHMpOwoJCXN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnQrK10gPSBzOwoJfQoKCWlmIChzdGF0ZV9jb3VudCAhPSA0KSB7CgkJc3RhdGVfY291bnQtLTsKCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQlrZnJlZShzdGF0ZS0+b3RoZXJfc3RhdGVzW3N0YXRlX2NvdW50XSk7CgkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCX0KCQlyZXR1cm4gLUVCVVNZOwoJfQoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBDT05GSUdfUE0KLyogc2F2ZSByZWdpc3RlcnMgZm9yIEFMaSBQb3dlciBNYW5hZ2VtZW50ICovCnN0YXRpYyBzdHJ1Y3QgYWxpX3NhdmVkX3JlZ2lzdGVycyB7Cgl1bnNpZ25lZCBsb25nIGdsb2JhbF9yZWdzW0FMSV9HTE9CQUxfUkVHU107Cgl1bnNpZ25lZCBsb25nIGNoYW5uZWxfcmVnc1tBTElfQ0hBTk5FTFNdW0FMSV9DSEFOTkVMX1JFR1NdOwoJdW5zaWduZWQgbWl4ZXJfcmVnc1tBTElfTUlYRVJfUkVHU107Cn0gYWxpX3JlZ2lzdGVyczsKCnN0YXRpYyB2b2lkCmFsaV9zYXZlX3JlZ3Moc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBpLCBqOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgoJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDJjXSA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsgICAgCglhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjFdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9TVE9QX0EpKTsKCgkvL2Rpc2FibGUgYWxsIElSUSBiaXRzCglvdXRsKEFMSV9ESVNBQkxFX0FMTF9JUlEsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgoJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCgkJYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldID0gYWxpX2FjOTdfcmVhZChjYXJkLT5hYzk3X2NvZGVjWzBdLCAKCQkJCQkJCSAgICBpICogMik7CgoJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7CgkJaWYgKChpICogNCA9PSBUNERfTUlTQ0lOVCkgfHwgKGkgKiA0ID09IFQ0RF9TVE9QX0EpKQoJCQljb250aW51ZTsKCQlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzW2ldID0gaW5sKFRSSURfUkVHKGNhcmQsIGkgKiA0KSk7Cgl9CgoJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CgkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCgkJCWFsaV9yZWdpc3RlcnMuY2hhbm5lbF9yZWdzW2ldW2pdID0gaW5sKFRSSURfUkVHKGNhcmQsIAoJCQkJCQkJCQlqICogNCArIDB4ZTApKTsKCX0KCgkvL1N0b3AgYWxsIEhXIGNoYW5uZWwKCW91dGwoQUxJX1NUT1BfQUxMX0NIQU5ORUxTLCBUUklEX1JFRyhjYXJkLCBUNERfU1RPUF9BKSk7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMgdm9pZAphbGlfcmVzdG9yZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgaSwgajsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoKCWZvciAoaSA9IDE7IGkgPCBBTElfTUlYRVJfUkVHUzsgaSsrKQoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIGkgKiAyLCAKCQkJICAgICAgIGFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSk7CgoJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CgkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCgkJCW91dGwoYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0sIAoJCQkgICAgIFRSSURfUkVHKGNhcmQsIGogKiA0ICsgMHhlMCkpOwoJfQoKCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgewoJCWlmICgoaSAqIDQgPT0gVDREX01JU0NJTlQpIHx8IChpICogNCA9PSBUNERfU1RPUF9BKSB8fCAKCQkgICAgKGkgKiA0ID09IFQ0RF9TVEFSVF9BKSkKCQkJY29udGludWU7CgkJb3V0bChhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzW2ldLCBUUklEX1JFRyhjYXJkLCBpICogNCkpOwoJfQoKCS8vc3RhcnQgSFcgY2hhbm5lbAoJb3V0bChhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdLCBUUklEX1JFRyhjYXJkLCBUNERfU1RBUlRfQSkpOwoJLy9yZXN0b3JlIElSUSBlbmFibGUgYml0cwoJb3V0bChhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIGludAp0cmlkZW50X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHVudXNlZCkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCWFsaV9zYXZlX3JlZ3MoY2FyZCk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp0cmlkZW50X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJYWxpX3Jlc3RvcmVfcmVncyhjYXJkKTsKCX0KCXJldHVybiAwOwp9CiNlbmRpZgoKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgphbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKCglpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgCgkgICAgKEFMSV9TUERJRl9PVVRfQ0hfRU5BQkxFKSkgewoJCWlkeCA9IEFMSV9TUERJRl9PVVRfQ0hBTk5FTDsKCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CgkJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQkJY2hhbm5lbC0+bnVtID0gaWR4OwoJCQlyZXR1cm4gY2hhbm5lbDsKCQl9Cgl9CgoJZm9yIChpZHggPSBBTElfUENNX09VVF9DSEFOTkVMX0ZJUlNUOyBpZHggPD0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9MQVNUOyAKCSAgICAgaWR4KyspIHsKCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CgkJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQkJY2hhbm5lbC0+bnVtID0gaWR4OwoJCQlyZXR1cm4gY2hhbm5lbDsKCQl9Cgl9CgoJLyogbm8gbW9yZSBmcmVlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLwojaWYgMCAKCXByaW50ayhLRVJOX0VSUiAiYWxpOiBubyBtb3JlIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBCYW5rIEEuXG4iKTsKI2VuZGlmIC8qIDAgKi8gCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgphbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rOwoJaW50IGlkeDsKCglpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgQUxJX1NQRElGX0lOX1NVUFBPUlQpCgkJaWR4ID0gQUxJX1NQRElGX0lOX0NIQU5ORUw7CgllbHNlCgkJaWR4ID0gQUxJX1BDTV9JTl9DSEFOTkVMOwoKCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKCglpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewoJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQliYW5rLT5iaXRtYXAgfD0gMSA8PCBpZHg7CgkJY2hhbm5lbC0+bnVtID0gaWR4OwoJCXJldHVybiBjaGFubmVsOwoJfQoKCS8qIG5vIGZyZWUgcmVjb3JkYWJsZSBjaGFubmVscyBhdmFsaWFibGUgKi8KI2lmIDAgCglwcmludGsoS0VSTl9FUlIgImFsaTogbm8gcmVjb3JkYWJsZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7CiNlbmRpZiAvKiAwICovIAoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCmFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHJhdGUpCnsKCXVuc2lnbmVkIGNoYXIgY2hfc3Rfc2VsOwoJdW5zaWduZWQgc2hvcnQgc3RhdHVzX3JhdGU7CgoJc3dpdGNoIChyYXRlKSB7CgljYXNlIDQ0MTAwOgoJCXN0YXR1c19yYXRlID0gMDsKCQlicmVhazsKCWNhc2UgMzIwMDA6CgkJc3RhdHVzX3JhdGUgPSAweDMwMDsKCQlicmVhazsKCWNhc2UgNDgwMDA6CglkZWZhdWx0OgoJCXN0YXR1c19yYXRlID0gMHgyMDA7CgkJYnJlYWs7Cgl9CgoJLyogc2VsZWN0IHNwZGlmX291dCAqLyAKCWNoX3N0X3NlbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpICYgQUxJX1NQRElGX09VVF9DSF9TVEFUVVM7CgoJY2hfc3Rfc2VsIHw9IDB4ODA7CS8qIHNlbGVjdCByaWdodCAqLyAKCW91dGIoY2hfc3Rfc2VsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJb3V0YihzdGF0dXNfcmF0ZSB8IDB4MjAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKCgljaF9zdF9zZWwgJj0gKH4weDgwKTsJLyogc2VsZWN0IGxlZnQgKi8gCglvdXRiKGNoX3N0X3NlbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCW91dHcoc3RhdHVzX3JhdGUgfCAweDEwLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAyKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9hZGRyZXNzX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglpbnQgaSwgY2hhbm5lbDsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZTsKCXUzMiBtYXNrLCBjaGFubmVsX21hc2s7CgoJbWFzayA9IHRyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKGNhcmQsIDApOwoJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKCQlpZiAoKHN0YXRlID0gY2FyZC0+c3RhdGVzW2ldKSA9PSBOVUxMKQoJCQljb250aW51ZTsKCQljaGFubmVsID0gc3RhdGUtPmRtYWJ1Zi5jaGFubmVsLT5udW07CgkJaWYgKChjaGFubmVsX21hc2sgPSAxIDw8IGNoYW5uZWwpICYgbWFzaykgewoJCQltYXNrICY9IH5jaGFubmVsX21hc2s7CgkJCXRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpOwoJCQl1ZGVsYXkoMTAwKTsKCQkJc3RhdGUtPmRtYWJ1Zi51cGRhdGVfZmxhZyB8PSBBTElfQUREUkVTU19JTlRfVVBEQVRFOwoJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCX0KCX0KCWlmIChtYXNrKSB7CgkJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKCQkJaWYgKG1hc2sgJiAoMSA8PCBpKSkgewoJCQkJcHJpbnRrKCJhbGk6IHNwdXJpb3VzIGNoYW5uZWwgaXJxICVkLlxuIiwgaSk7CgkJCQl0cmlkZW50X2Fja19jaGFubmVsX2ludGVycnVwdChjYXJkLCBpKTsKCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBpKTsKCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgaSk7CgkJCX0KCQl9Cgl9Cn0KCi8qIFVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgY291bnRlcnMgb2Ygb3RoZXJfc3RhdGVzJyBETUFzIHdpdGhvdXQgbG9jayAKcHJvdGVjdGlvbiBpcyBubyBoYXJtIGJlY2F1c2UgYWxsIERNQXMgb2YgbXVsdGktY2hhbm5lbHMgYW5kIGludGVycnVwdApkZXBlbmQgb24gYSBtYXN0ZXIgc3RhdGUncyBETUEsIGFuZCBjaGFuZ2luZyB0aGUgY291bnRlcnMgb2YgdGhlIG1hc3RlcgpzdGF0ZSBETUEgaXMgcHJvdGVjdGVkIGJ5IGEgc3BpbmxvY2suCiovCnN0YXRpYyBpbnQKYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIAoJICAgICAgaW50IGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgdW5zaWduZWQgaW50ICpjb3B5X2NvdW50LCAKCSAgICAgIHVuc2lnbmVkIGludCAqc3RhdGVfY250KQp7CgoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWZfdGVtcDsKCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIgPSBidWY7Cgl1bnNpZ25lZCBzd3B0ciwgb3RoZXJfZG1hX251bXMsIHNhbXBsZV9zOwoJdW5zaWduZWQgaW50IGksIGxvb3A7CgoJb3RoZXJfZG1hX251bXMgPSA0OwoJc2FtcGxlX3MgPSBzYW1wbGVfc2l6ZVtkbWFidWYtPmZtdF0gPj4gMTsKCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCglpZiAoKGkgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50KSA+IDApIHsKCQlpZiAoaSA9PSAxKSB7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCWktLTsKCQkJKCpzdGF0ZV9jbnQpICs9IHNhbXBsZV9zOwoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50Kys7CgkJfSBlbHNlCgkJCWkgPSBpIC0gKHN0YXRlLT5jaGFuc19udW0gLSBvdGhlcl9kbWFfbnVtcyk7CgkJZm9yICg7IChpIDwgb3RoZXJfZG1hX251bXMpICYmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKTsgaSsrKSB7CgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJfQoJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPT0gMCkKCQkJc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCArPSBpOwoJfQoJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApIHsKCQlsb29wID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gKHN0YXRlLT5jaGFuc19udW0gKiBzYW1wbGVfcyk7CgkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgewoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCAKCQkJCQkgICBzYW1wbGVfcyAqIDIpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MgKiAyLCAqY29weV9jb3VudCk7CgkJCSgqc3RhdGVfY250KSArPSAoc2FtcGxlX3MgKiAyKTsKCgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgoJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWY7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJfQoKCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gc2FtcGxlX3M7CgoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CgoJCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAoJCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CgoJCQkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApIHsKCQkJCQlpbnQgZGlmZiA9IHN0YXRlLT5jaGFuc19udW0gLSBvdGhlcl9kbWFfbnVtczsKCQkJCQlsb29wID0gc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCAtIGRpZmY7CgkJCQkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgewoJCQkJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CgkJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgCgkJCQkJCQkJICAgZG1hYnVmX3RlbXAtPnN3cHRyLCAKCQkJCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgCgkJCQkJCQkgICAgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gZWxzZQoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ID0gMDsKCX0KCWZvciAoaSA9IDA7IGkgPCBvdGhlcl9kbWFfbnVtczsgaSsrKSB7CgkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmOwoJCWRtYWJ1Zl90ZW1wLT5zd3B0ciA9IGRtYWJ1Zl90ZW1wLT5zd3B0ciAlIGRtYWJ1Zl90ZW1wLT5kbWFzaXplOwoJfQoJcmV0dXJuICpzdGF0ZV9jbnQ7Cn0KCnN0YXRpYyB2b2lkCmFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglpbnQgaTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzOwoJdW5zaWduZWQgb3RoZXJfc3RhdGVzX2NvdW50OwoKCW90aGVyX3N0YXRlc19jb3VudCA9IHN0YXRlLT5jaGFuc19udW0gLSAyOyAvKiBleGNlcHQgUENNIEwvUiBjaGFubmVscyAqLwoJZm9yIChpID0gMDsgaSA8IG90aGVyX3N0YXRlc19jb3VudDsgaSsrKSB7CgkJcyA9IHN0YXRlLT5vdGhlcl9zdGF0ZXNbaV07CgkJZGVhbGxvY19kbWFidWYoJnMtPmRtYWJ1ZiwgY2FyZC0+cGNpX2Rldik7CgkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHMtPmNhcmQsIHMtPmRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHMtPmNhcmQsIHMtPmRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCWNhcmQtPnN0YXRlc1tzLT52aXJ0XSA9IE5VTEw7CgkJa2ZyZWUocyk7Cgl9Cn0KCnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlczsKCnN0YXRpYyBpbnQKYWxpX3dyaXRlX3Byb2Moc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBkYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWNoYXIgYzsKCglpZiAoY291bnQgPCAwKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKGNvdW50ID09IDApCgkJcmV0dXJuIDA7CglpZiAoZ2V0X3VzZXIoYywgYnVmZmVyKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJc3dpdGNoIChjKSB7CgljYXNlICcwJzoKCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9QQ01fVE9fU1BESUZfT1VUKTsKCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY2FyZCwgQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKCQlicmVhazsKCWNhc2UgJzEnOgoJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfCAKCQkJCSAgICBBTElfU1BESUZfT1VUX1BDTSk7CgkJYnJlYWs7CgljYXNlICcyJzoKCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCgkJCQkgICAgQUxJX1NQRElGX09VVF9OT05fUENNKTsKCQlicmVhazsKCWNhc2UgJzMnOgoJCWFsaV9kaXNhYmxlX3NwZGlmX2luKGNhcmQpOwkvL2RlZmF1bHQKCQlicmVhazsKCWNhc2UgJzQnOgoJCWFsaV9zZXR1cF9zcGRpZl9pbihjYXJkKTsKCQlicmVhazsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gY291bnQ7Cn0KCi8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8Kc3RhdGljIGludAp0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglpbnQgaSA9IDA7CglpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGRldnM7CgoJZm9yIChjYXJkID0gZGV2czsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dCkKCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQoJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmIAoJCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQoJCQkJZ290byBtYXRjaDsKCglpZiAoIWNhcmQpIHsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KICAgICAgbWF0Y2g6CglmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOwoKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludAp0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgCgkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopIGZpbGUtPnByaXZhdGVfZGF0YTsKCglyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cn0KCnN0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9taXhlcl9mb3BzID0gewoJLm93bmVyID0gVEhJU19NT0RVTEUsCgkubGxzZWVrID0gbm9fbGxzZWVrLAoJLmlvY3RsID0gdHJpZGVudF9pb2N0bF9taXhkZXYsCgkub3BlbiA9IHRyaWRlbnRfb3Blbl9taXhkZXYsCn07CgpzdGF0aWMgaW50CmFsaV9yZXNldF81NDUxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKCXVuc2lnbmVkIGludCBkd1ZhbDsKCXVuc2lnbmVkIHNob3J0IHdDb3VudCwgd1JlZzsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NMTUzMywKCQkJCSBwY2lfZGV2KTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCAmZHdWYWwpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCBkd1ZhbCB8IDB4MDgwMDAwMDApOwoJdWRlbGF5KDUwMDApOwoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsIGR3VmFsICYgMHhmN2ZmZmZmZik7Cgl1ZGVsYXkoNTAwMCk7CglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gY2FyZC0+cGNpX2RldjsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCAmZHdWYWwpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCBkd1ZhbCB8IDB4MDAwYzAwMDApOwoJdWRlbGF5KDUwMCk7CglwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgJmR3VmFsKTsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgZHdWYWwgJiAweGZmZmJmZmZmKTsKCXVkZWxheSg1MDAwKTsKCgkvKiBUT0RPOiByZWNvZ25pemUgaWYgd2UgaGF2ZSBhIFBNIGNhcGFibGUgY29kZWMgYW5kIG9ubHkgZG8gdGhpcyAqLwoJLyogaWYgdGhlIGNvZGVjIGlzIFBNIGNhcGFibGUgKi8KCXdDb3VudCA9IDIwMDA7Cgl3aGlsZSAod0NvdW50LS0pIHsKCQl3UmVnID0gYWxpX2FjOTdfZ2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CgkJaWYgKCh3UmVnICYgMHgwMDBmKSA9PSAweDAwMGYpCgkJCXJldHVybiAwOwoJCXVkZWxheSg1MDAwKTsKCX0KCS8qIFRoaXMgaXMgbm9uIGZhdGFsIGlmIHlvdSBoYXZlIGEgbm9uIFBNIGNhcGFibGUgY29kZWMuLiAqLwoJcmV0dXJuIDA7Cn0KCi8qIEFDOTcgY29kZWMgaW5pdGlhbGlzYXRpb24uICovCnN0YXRpYyBpbnQgX19kZXZpbml0CnRyaWRlbnRfYWM5N19pbml0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBudW1fYWM5NyA9IDA7Cgl1bnNpZ25lZCBsb25nIHJlYWR5XzJuZCA9IDA7CglzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CglpbnQgaSA9IDA7CgoJLyogaW5pdGlhbGl6ZSBjb250cm9sbGVyIHNpZGUgb2YgQUMgbGluaywgYW5kIGZpbmQgb3V0IGlmIHNlY29uZGFyeSBjb2RlcwoJICAgcmVhbGx5IGV4aXN0ICovCglzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgewoJY2FzZSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxOgoJCWlmIChhbGlfcmVzZXRfNTQ1MShjYXJkKSkgewoJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnRfYWM5N19pbml0OiBlcnJvciAiCgkJCSAgICAgICAicmVzZXR0aW5nIDU0NTEuXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlvdXRsKDB4ODAwMDAwMDEsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoJCW91dGwoMHgwMDAwMDAwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRFTl9BKSk7CgkJb3V0bCgweGZmZmZmZmZmLCBUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9BKSk7CgkJb3V0bCgweDAwMDAwMDAwLCBUUklEX1JFRyhjYXJkLCBUNERfTVVTSUNWT0xfV0FWRVZPTCkpOwoJCW91dGIoMHgxMCwgVFJJRF9SRUcoY2FyZCwgQUxJX01QVVIyKSk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSAweDNmZmY7CgkJb3V0bChyZWFkeV8ybmQgfCBQQ01PVVQgfCAweDgwMDAsIFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOwoJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQlyZWFkeV8ybmQgJj0gU0lfQUM5N19TRUNPTkRBUllfUkVBRFk7CgkJaWYgKGNhcmQtPnJldmlzaW9uIDwgQUxJXzU0NTFfVjAyKQoJCQlyZWFkeV8ybmQgPSAwOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CgkJLyogZGlzYWJsZSBBQzk3IEdQSU8gaW50ZXJydXB0ICovCgkJb3V0bCgweDAwLCBUUklEX1JFRyhjYXJkLCBTSV9BQzk3X0dQSU8pKTsKCQkvKiB3aGVuIHBvd2VyIHVwIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSBzbyBzdG9wIGl0ICovCgkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VUIHwgU0VDT05EQVJZX0lELCAKCQkgICAgIFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKi8gCgkJLyogKGVzcGVjaWFsbHkgd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLwoJCXVkZWxheSgyMDAwKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQkvKiBwbGF5YmFjayBvbiAqLwoJCW91dGwoRFhfQUM5N19QTEFZQkFDSywgVFJJRF9SRUcoY2FyZCwgRFhfQUNSMl9BQzk3X0NPTV9TVEFUKSk7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgkJLyogZW5hYmxlIEFDOTcgT3V0cHV0IFNsb3QgMyw0IChQQ00gTGVmdC9SaWdodCBQbGF5YmFjaykgKi8KCQlvdXRsKE5YX0FDOTdfUENNX09VVFBVVCwgVFJJRF9SRUcoY2FyZCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIE5YX0FDUjBfQUM5N19DT01fU1RBVCkpOwoJCXJlYWR5XzJuZCAmPSBOWF9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQkvKiBkaXNhYmxlIEFDOTcgR1BJTyBpbnRlcnJ1cHQgKi8KCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOwoJCS8qIHdoZW4gcG93ZXIgdXAsIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSwgc28gc3RvcCBpdCAqLwoJCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCwgCgkJICAgICBUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CgkJLyogaXQgdGFrZSBhIGxvbmcgdGltZSB0byByZWNvdmVyIGZyb20gYSBjb2xkIHJlc2V0IChlc3BlY2lhbGx5ICovIAoJCS8qIHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb2RlYykgKi8KCQl1ZGVsYXkoMjAwMCk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKCQlyZWFkeV8ybmQgJj0gU0lfQUM5N19TRUNPTkRBUllfUkVBRFk7CgkJYnJlYWs7Cgl9CgoJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgewoJCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCgkJCXJldHVybiAtRU5PTUVNOwoKCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyAqLyAKCQkvKiB3aWxsIGJlIGZpbGxlZCBpbiBhYzk3X3Byb2JlX2NvZGVjICovCgkJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CgkJY29kZWMtPmlkID0gbnVtX2FjOTc7CgoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCQljb2RlYy0+Y29kZWNfcmVhZCA9IGFsaV9hYzk3X3JlYWQ7CgkJCWNvZGVjLT5jb2RlY193cml0ZSA9IGFsaV9hYzk3X3dyaXRlOwoJCX0gZWxzZSB7CgkJCWNvZGVjLT5jb2RlY19yZWFkID0gdHJpZGVudF9hYzk3X2dldDsKCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gdHJpZGVudF9hYzk3X3NldDsKCQl9CgoJCWlmIChhYzk3X3Byb2JlX2NvZGVjKGNvZGVjKSA9PSAwKQoJCQlicmVhazsKCgkJY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZ0cmlkZW50X21peGVyX2ZvcHMsIC0xKTsKCQlpZiAoY29kZWMtPmRldl9taXhlciA8IDApIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOwoJCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOwoJCQlicmVhazsKCQl9CgoJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gY29kZWM7CgoJCS8qIGlmIHRoZXJlIGlzIG5vIHNlY29uZGFyeSBjb2RlYyBhdCBhbGwsIGRvbid0IHByb2JlIGFueSBtb3JlICovCgkJaWYgKCFyZWFkeV8ybmQpCgkJCWJyZWFrOwoJfQoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IE5SX0FDOTc7IG51bV9hYzk3KyspIHsKCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID09IE5VTEwpCgkJCQlicmVhazsKCQkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKCQkJCXUxNiByZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgbnVtX2FjOTcsIGkgKiAyKTsKCQkJCWNhcmQtPm1peGVyX3JlZ3NbaV1bbnVtX2FjOTddID0gcmVnOwoJCQl9CgkJfQoJfQoJcmV0dXJuIG51bV9hYzk3ICsgMTsKfQoKI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKLyogR2FtZXBvcnQgZnVuY3Rpb25zIGZvciB0aGUgY2FyZHMgQURDIGdhbWVwb3J0ICovCgpzdGF0aWMgdW5zaWduZWQgY2hhciB0cmlkZW50X2dhbWVfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCglyZXR1cm4gaW5iKFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwp9CgpzdGF0aWMgdm9pZCB0cmlkZW50X2dhbWVfdHJpZ2dlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCglvdXRiKDB4ZmYsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwp9CgpzdGF0aWMgaW50IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LAoJCQkJICAgIGludCAqYXhlcywgaW50ICpidXR0b25zKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCWludCBpOwoKCSpidXR0b25zID0gKH5pbmIoVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfTEVHKSkgPj4gNCkgJiAweGY7CgoJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJCWF4ZXNbaV0gPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfQVhEKSArIGkgKiBzaXplb2YgKHUxNikpOwoJCWlmIChheGVzW2ldID09IDB4ZmZmZikKCQkJYXhlc1tpXSA9IC0xOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHRyaWRlbnRfZ2FtZV9vcGVuKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCBtb2RlKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKCglzd2l0Y2ggKG1vZGUpIHsKCWNhc2UgR0FNRVBPUlRfTU9ERV9DT09LRUQ6CgkJb3V0YigweDgwLCBUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9DUikpOwoJCW1zbGVlcCgyMCk7CgkJcmV0dXJuIDA7CgljYXNlIEdBTUVQT1JUX01PREVfUkFXOgoJCW91dGIoMHgwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfQ1IpKTsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJcmV0dXJuIC0xOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCB0cmlkZW50X3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CgoJY2FyZC0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKCWlmICghZ3ApIHsKCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJUcmlkZW50IDREV2F2ZSIpOwoJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CglncC0+cmVhZCA9IHRyaWRlbnRfZ2FtZV9yZWFkOwoJZ3AtPnRyaWdnZXIgPSB0cmlkZW50X2dhbWVfdHJpZ2dlcjsKCWdwLT5jb29rZWRfcmVhZCA9IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZDsKCWdwLT5vcGVuID0gdHJpZGVudF9nYW1lX29wZW47CglncC0+ZnV6eiA9IDY0OwoJZ3AtPnBvcnRfZGF0YSA9IGNhcmQ7CgoJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkZW50X3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJaWYgKGNhcmQtPmdhbWVwb3J0KQoJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjYXJkLT5nYW1lcG9ydCk7Cn0KCiNlbHNlCnN0YXRpYyBpbmxpbmUgaW50IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkgeyByZXR1cm4gLUVOT1NZUzsgfQpzdGF0aWMgaW5saW5lIHZvaWQgdHJpZGVudF91bnJlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpIHsgfQojZW5kaWYgLyogU1VQUE9SVF9KT1lTVElDSyAqLwoKLyogaW5zdGFsbCB0aGUgZHJpdmVyLCB3ZSBkbyBub3QgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBub3IgRE1BIGJ1ZmZlciAqLyAKLyogbm93LCB0aGV5IGFyZSBkZWZlcmVkIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSAqLyAKLyogb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCnN0YXRpYyBpbnQgX19kZXZpbml0CnRyaWRlbnRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCnsKCXVuc2lnbmVkIGxvbmcgaW9iYXNlOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCXU4IGJpdHM7Cgl1OCByZXZpc2lvbjsKCWludCBpID0gMDsKCXUxNiB0ZW1wOwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfbTE1MzMgPSBOVUxMOwoJaW50IHJjID0gLUVOT0RFVjsKCXU2NCBkbWFfbWFzazsKCglpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCgkJZ290byBvdXQ7CgoJaWYgKHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQoJCWRtYV9tYXNrID0gQUxJX0RNQV9NQVNLOwoJZWxzZQoJCWRtYV9tYXNrID0gVFJJREVOVF9ETUFfTUFTSzsKCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIGRtYV9tYXNrKSkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQiIAoJCSAgICAgICAiICVzIFBDSSBidXNtYXN0ZXIgRE1BXG4iLCAKCQkgICAgICAgcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgPyAKCQkgICAgICAgIjMyLWJpdCIgOiAiMzAtYml0Iik7CgkJZ290byBvdXQ7Cgl9CglwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXZpc2lvbik7CgoJaWYgKHBjaV9pZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApCgkJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDEpOwoJZWxzZQoJCWlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKTsKCglpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgMjU2LCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKSkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY2FuJ3QgYWxsb2NhdGUgSS9PIHNwYWNlIGF0ICIKCQkgICAgICAgIjB4JTQuNGx4XG4iLCBpb2Jhc2UpOwoJCWdvdG8gb3V0OwoJfQoKCXJjID0gLUVOT01FTTsKCWlmICgoY2FyZCA9IGttYWxsb2Moc2l6ZW9mKCpjYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IG91dCBvZiBtZW1vcnlcbiIpOwoJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwoJfQoJbWVtc2V0KGNhcmQsIDAsIHNpemVvZiAoKmNhcmQpKTsKCglpbml0X3RpbWVyKCZjYXJkLT50aW1lcik7CgljYXJkLT5pb2Jhc2UgPSBpb2Jhc2U7CgljYXJkLT5wY2lfZGV2ID0gcGNpX2Rldl9nZXQocGNpX2Rldik7CgljYXJkLT5wY2lfaWQgPSBwY2lfaWQtPmRldmljZTsKCWNhcmQtPnJldmlzaW9uID0gcmV2aXNpb247CgljYXJkLT5pcnEgPSBwY2lfZGV2LT5pcnE7CgljYXJkLT5uZXh0ID0gZGV2czsKCWNhcmQtPm1hZ2ljID0gVFJJREVOVF9DQVJEX01BR0lDOwoJY2FyZC0+YmFua3NbQkFOS19BXS5hZGRyZXNzZXMgPSAmYmFua19hX2FkZHJzOwoJY2FyZC0+YmFua3NbQkFOS19BXS5iaXRtYXAgPSAwVUw7CgljYXJkLT5iYW5rc1tCQU5LX0JdLmFkZHJlc3NlcyA9ICZiYW5rX2JfYWRkcnM7CgljYXJkLT5iYW5rc1tCQU5LX0JdLmJpdG1hcCA9IDBVTDsKCgltdXRleF9pbml0KCZjYXJkLT5vcGVuX211dGV4KTsKCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKCWluaXRfdGltZXIoJmNhcmQtPnRpbWVyKTsKCglkZXZzID0gY2FyZDsKCglwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKCglwcmludGsoS0VSTl9JTkZPICJ0cmlkZW50OiAlcyBmb3VuZCBhdCBJTyAweCUwNGx4LCBJUlEgJWRcbiIsIAoJICAgICAgIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQtPmlvYmFzZSwgY2FyZC0+aXJxKTsKCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkvKiBBTGkgY2hhbm5lbCBNYW5hZ2VtZW50ICovCgkJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcGNtX2NoYW5uZWw7CgkJY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsID0gYWxpX2FsbG9jX3JlY19wY21fY2hhbm5lbDsKCQljYXJkLT5mcmVlX3BjbV9jaGFubmVsID0gYWxpX2ZyZWVfcGNtX2NoYW5uZWw7CgoJCWNhcmQtPmFkZHJlc3NfaW50ZXJydXB0ID0gYWxpX2FkZHJlc3NfaW50ZXJydXB0OwoKCQkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCgkJY2FyZC0+bXVsdGlfY2hhbm5lbF91c2VfY291bnQgPSAwOwoJCWNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCA9IDA7CgoJCS8qIEFMaSBTUERJRiBPVVQgZnVuY3Rpb24gKi8KCQlpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKSB7CgkJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1BDTV9UT19TUERJRl9PVVQpOwoJCQlyZXMgPSBjcmVhdGVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIDAsIE5VTEwpOwoJCQlpZiAocmVzKSB7CgkJCQlyZXMtPndyaXRlX3Byb2MgPSBhbGlfd3JpdGVfcHJvYzsKCQkJCXJlcy0+ZGF0YSA9IGNhcmQ7CgkJCX0KCQl9CgoJCS8qIEFkZCBIL1cgVm9sdW1lIENvbnRyb2wgQnkgTWF0dCBXdSBKdWwuIDA2LCAyMDAxICovCgkJY2FyZC0+aHd2b2xjdGwgPSAwOwoJCXBjaV9kZXZfbTE1MzMgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgCgkJCQkJCVBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIAoJCQkJCQlwY2lfZGV2X20xNTMzKTsKCQlyYyA9IC1FTk9ERVY7CgkJaWYgKHBjaV9kZXZfbTE1MzMgPT0gTlVMTCkKCQkJZ290byBvdXRfcHJvY19mczsKCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2X20xNTMzLCAweDYzLCAmYml0cyk7CgkJaWYgKGJpdHMgJiAoMSA8PCA1KSkKCQkJY2FyZC0+aHd2b2xjdGwgPSAxOwoJCWlmIChjYXJkLT5od3ZvbGN0bCkgewoJCQkvKiBDbGVhciBtMTUzMyBwY2kgY2ZnIDc4aCBiaXQgMzAgdG8gemVybywgd2hpY2ggbWFrZXMKCQkJICAgR1BJTzExLzEyLzEzIHdvcmsgYXMgQUNHUF9VUC9ET1dOL01VVEUuICovCgkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4N2IsICZiaXRzKTsKCQkJYml0cyAmPSAweGJmOwkvKmNsZWFyIGJpdCA2ICovCgkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2X20xNTMzLCAweDdiLCBiaXRzKTsKCQl9Cgl9IGVsc2UgaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CgkJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBjeWJlcl9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBjeWJlcl9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5mcmVlX3BjbV9jaGFubmVsID0gY3liZXJfZnJlZV9wY21fY2hhbm5lbDsKCQljYXJkLT5hZGRyZXNzX2ludGVycnVwdCA9IGN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OwoJCWN5YmVyX2luaXRfcml0dWFsKGNhcmQpOwoJfSBlbHNlIHsKCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IHRyaWRlbnRfYWxsb2NfcGNtX2NoYW5uZWw7CgkJY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsID0gdHJpZGVudF9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5mcmVlX3BjbV9jaGFubmVsID0gdHJpZGVudF9mcmVlX3BjbV9jaGFubmVsOwoJCWNhcmQtPmFkZHJlc3NfaW50ZXJydXB0ID0gdHJpZGVudF9hZGRyZXNzX2ludGVycnVwdDsKCX0KCgkvKiBjbGFpbSBvdXIgaXJxICovCglyYyA9IC1FTk9ERVY7CglpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCAmdHJpZGVudF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAoJCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkKSkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwgCgkJICAgICAgIGNhcmQtPmlycSk7CgkJZ290byBvdXRfcHJvY19mczsKCX0KCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCglpZiAoKGNhcmQtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmdHJpZGVudF9hdWRpb19mb3BzLCAtMSkpIDwgMCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY291bGRuJ3QgcmVnaXN0ZXIgRFNQIGRldmljZSFcbiIpOwoJCWdvdG8gb3V0X2ZyZWVfaXJxOwoJfQoJY2FyZC0+bWl4ZXJfcmVnc19yZWFkeSA9IDA7CgkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KCWlmICh0cmlkZW50X2FjOTdfaW5pdChjYXJkKSA8PSAwKSB7CgkJLyogdW5yZWdpc3RlciBhdWRpbyBkZXZpY2VzICovCgkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykgewoJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMKSB7CgkJCQlzdHJ1Y3QgYWM5N19jb2RlYyogY29kZWMgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOwoJCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjb2RlYy0+ZGV2X21peGVyKTsKCQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CgkJCX0KCQl9CgkJZ290byBvdXRfdW5yZWdpc3Rlcl9zb3VuZF9kc3A7Cgl9CgljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMTsKCW91dGwoMHgwMCwgVFJJRF9SRUcoY2FyZCwgVDREX01VU0lDVk9MX1dBVkVWT0wpKTsKCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkvKiBBZGQgSC9XIFZvbHVtZSBDb250cm9sIEJ5IE1hdHQgV3UgSnVsLiAwNiwgMjAwMSAqLwoJCWlmIChjYXJkLT5od3ZvbGN0bCkgewoJCQkvKiBFbmFibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KCQkJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKCQkJdGVtcCB8PSAweDAwMDQ7CgkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CgoJCQkvKiBFbmFibGUgSC9XIFZvbHVtZSBDb250cm9sIEdMT1ZBTCBDT05UUk9MIGJpdCAwICovCgkJCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgkJCXRlbXAgfD0gMHgwMDAxOwoJCQlvdXR3KHRlbXAsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCQl9CgkJaWYgKGNhcmQtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikKCQkJYWxpX2Nsb3NlX211bHRpX2NoYW5uZWxzKCk7CgkJLyogZWRpdGVkIGJ5IEhNU0VPIGZvciBHVCBzb3VuZCAqLwojaWYgZGVmaW5lZChDT05GSUdfQUxQSEFfTkFVVElMVVMpIHx8IGRlZmluZWQoQ09ORklHX0FMUEhBX0dFTkVSSUMpCgkJewoJCQl1MTYgYWM5N19kYXRhOwoJCQlleHRlcm4gc3RydWN0IGh3cnBiX3N0cnVjdCAqaHdycGI7CgoJCQlpZiAoKGh3cnBiLT5zeXNfdHlwZSkgPT0gMjAxKSB7CgkJCQlwcmludGsoS0VSTl9JTkZPICJ0cmlkZW50OiBSdW5uaW5nIG9uIEFscGhhIHN5c3RlbSAiCgkJCQkgICAgICAgInR5cGUgTmF1dGlsdXNcbiIpOwoJCQkJYWM5N19kYXRhID0gYWxpX2FjOTdfZ2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CgkJCQlhbGlfYWM5N19zZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MLCAKCQkJCQkgICAgIGFjOTdfZGF0YSB8IEFMSV9FQVBEX1BPV0VSX0RPV04pOwoJCQl9CgkJfQojZW5kaWYJCQkJLyogQ09ORklHX0FMUEhBX05BVVRJTFVTIHx8IENPTkZJR19BTFBIQV9HRU5FUklDICovCgkJLyogZWRpdGVkIGJ5IEhNU0VPIGZvciBHVCBzb3VuZCAqLwoJfQoJcmMgPSAwOwoJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGNhcmQpOwoKCS8qIEVuYWJsZSBBZGRyZXNzIEVuZ2luZSBJbnRlcnJ1cHRzICovCgl0cmlkZW50X2VuYWJsZV9sb29wX2ludGVycnVwdHMoY2FyZCk7CgoJLyogUmVnaXN0ZXIgZ2FtZXBvcnQgKi8KCXRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoY2FyZCk7CgpvdXQ6CglyZXR1cm4gcmM7CgpvdXRfdW5yZWdpc3Rlcl9zb3VuZF9kc3A6Cgl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5kZXZfYXVkaW8pOwpvdXRfZnJlZV9pcnE6CglmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwpvdXRfcHJvY19mczoKCXBjaV9kZXZfcHV0KGNhcmQtPnBjaV9kZXYpOwoJaWYgKHJlcykgewoJCXJlbW92ZV9wcm9jX2VudHJ5KCJBTGk1NDUxIiwgTlVMTCk7CgkJcmVzID0gTlVMTDsKCX0KCWtmcmVlKGNhcmQpOwoJZGV2cyA9IE5VTEw7Cm91dF9yZWxlYXNlX3JlZ2lvbjoKCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgMjU2KTsKCXJldHVybiByYzsgCn0KCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdAp0cmlkZW50X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKewoJaW50IGk7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwoKCS8qCgkgKiAgICAgIEtpbGwgcnVubmluZyB0aW1lcnMgYmVmb3JlIHVubG9hZC4gV2UgY2FuJ3QgaGF2ZSB0aGVtCgkgKiAgICAgIGdvaW5nIG9mZiBhZnRlciBybW1vZCEKCSAqLwoJaWYgKGNhcmQtPmh3dm9sY3RsKQoJCWRlbF90aW1lcl9zeW5jKCZjYXJkLT50aW1lcik7CgoJLyogQUxpIFMvUERJRiBhbmQgUG93ZXIgTWFuYWdlbWVudCAqLwoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfUENNX1RPX1NQRElGX09VVCk7CgkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNhcmQsIEFMSV9TUERJRl9PVVRfQ0hBTk5FTCk7CgkJYWxpX2Rpc2FibGVfc3BkaWZfaW4oY2FyZCk7CgkJcmVtb3ZlX3Byb2NfZW50cnkoIkFMaTU0NTEiLCBOVUxMKTsKCX0KCgkvKiBVbnJlZ2lzdGVyIGdhbWVwb3J0ICovCgl0cmlkZW50X3VucmVnaXN0ZXJfZ2FtZXBvcnQoY2FyZCk7CgoJLyogS2lsbCBpbnRlcnJ1cHRzLCBhbmQgU1AvRElGICovCgl0cmlkZW50X2Rpc2FibGVfbG9vcF9pbnRlcnJ1cHRzKGNhcmQpOwoKCS8qIGZyZWUgaGFyZHdhcmUgcmVzb3VyY2VzICovCglmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwoJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCAyNTYpOwoKCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLwoJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMKSB7CgkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTdfY29kZWNbaV0pOwoJCX0KCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CgoJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOwoJcGNpX2Rldl9wdXQoY2FyZC0+cGNpX2Rldik7CglrZnJlZShjYXJkKTsKfQoKTU9EVUxFX0FVVEhPUigiQWxhbiBDb3gsIEFhcm9uIEhvbHR6bWFuLCBPbGxpZSBMaG8sIENoaW5nIExpbmcgTGVlLCBNdWxpIEJlbi1ZZWh1ZGEiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJUcmlkZW50IDREV2F2ZS9TaVMgNzAxOC9BTGkgNTQ1MSBhbmQgVHZpYS9JR1NUIEN5YmVyUHJvNTA1MCBQQ0kgIgoJCSAgICJBdWRpbyBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKI2RlZmluZSBUUklERU5UX01PRFVMRV9OQU1FICJ0cmlkZW50IgoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRyaWRlbnRfcGNpX2RyaXZlciA9IHsKCS5uYW1lID0gVFJJREVOVF9NT0RVTEVfTkFNRSwKCS5pZF90YWJsZSA9IHRyaWRlbnRfcGNpX3RibCwKCS5wcm9iZSA9IHRyaWRlbnRfcHJvYmUsCgkucmVtb3ZlID0gX19kZXZleGl0X3AodHJpZGVudF9yZW1vdmUpLAojaWZkZWYgQ09ORklHX1BNCgkuc3VzcGVuZCA9IHRyaWRlbnRfc3VzcGVuZCwKCS5yZXN1bWUgPSB0cmlkZW50X3Jlc3VtZQojZW5kaWYKfTsKCnN0YXRpYyBpbnQgX19pbml0CnRyaWRlbnRfaW5pdF9tb2R1bGUodm9pZCkKewoJcHJpbnRrKEtFUk5fSU5GTyAiVHJpZGVudCA0RFdhdmUvU2lTIDcwMTgvQUxpIDU0NTEsVHZpYSBDeWJlclBybyAiIAoJICAgICAgICI1MDUwIFBDSSBBdWRpbywgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIAoJICAgICAgIF9fREFURV9fICJcbiIpOwoKCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0cmlkZW50X3BjaV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQKdHJpZGVudF9jbGVhbnVwX21vZHVsZSh2b2lkKQp7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRyaWRlbnRfcGNpX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0KHRyaWRlbnRfaW5pdF9tb2R1bGUpOwptb2R1bGVfZXhpdCh0cmlkZW50X2NsZWFudXBfbW9kdWxlKTsK