From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030188AbWIESio (ORCPT ); Tue, 5 Sep 2006 14:38:44 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932210AbWIESio (ORCPT ); Tue, 5 Sep 2006 14:38:44 -0400 Received: from nf-out-0910.google.com ([64.233.182.191]:9189 "EHLO nf-out-0910.google.com") by vger.kernel.org with ESMTP id S932212AbWIESil (ORCPT ); Tue, 5 Sep 2006 14:38:41 -0400 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=AoDSCLNxLkTP0PN23fC74HCZzi8F92Nw58Bfrt6cb8YBEro4HLFIF6cWGsU9B18atVYljqF8OsD241zBU82F85fqmDpI2NtOi7/LWWGibNuAKhYzoAQ2zMef8YAfvahG+uU5zWaFL7sEQ0UqoUUYch1wnolmwECr7wJiE/mF1U0= Message-ID: Date: Tue, 5 Sep 2006 14:38:39 -0400 From: "Kimball Murray" To: "Arjan van de Ven" Subject: Re: [Feature] x86_64 page tracking for Stratus servers Cc: linux-kernel@vger.kernel.org, akpm@digeo.com, ak@suse.de In-Reply-To: <1157478021.9036.29.camel@laptopd505.fenrus.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_4317_323804.1157481519037" References: <20060905173229.14149.60535.sendpatchset@dhcp83-86.boston.redhat.com> <1157478021.9036.29.camel@laptopd505.fenrus.org> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org ------=_Part_4317_323804.1157481519037 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi Arjan, Unfortunately, our situation has not changed much, so I feel this may be a replay of the last time you asked. One of our modules is GPL, and that is the one that implements the page tracking. It's fairly large because it also provides PCI hotplug functionality and other things for our platform. As before, Stratus would not object to providing all kernel modules as GPL, but still our problem is that there is some code that reflects some of our chipset vendor's proprietary information, so they won't allow us to release it under GPL. So the best we can do under those circumstances is to mimic something like the NVIDIA driver model to satisfy our chipset vendors. The file that implements the page tracking is called harvest.c, and is part of the GPL module. I have attached the code, in its developmental form (so please pardon the #Ifdef's). The entry point for the page tracking is the routine fosil_synchronize_memory. At 1400 lines, I should probably find a server to make this available. But not having one at the moment, please forgive the attachment. -kimball On 9/5/06, Arjan van de Ven wrote: > On Tue, 2006-09-05 at 13:34 -0400, Kimball Murray wrote: > > Attached is a git patch that implements a feature that is used by Stratus > > fault-tolerant servers running on Intel x86_64 platforms. It provides the > > kernel mechanism that allows a loadable module to be able to keep track of > > recently dirtied pages for the purpose of copying live, currently active > > memory, to a spare memory module. > > > last time this came up, your module wasn't open source.... has that > changed since? > Maybe you should just post it... > > > > ------=_Part_4317_323804.1157481519037 Content-Type: text/x-c; name=harvest.c; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_erqmg25w Content-Disposition: attachment; filename="harvest.c" LyoKICogTG93LWxldmVsIHJvdXRpbmVzIGZvciBtZW1vcnkgbWlycm9yaW5nLiAgVHJhY2tzIGRp cnR5IHBhZ2VzIGFuZAogKiB1dGlsaXplcyBwcm92aWRlZCBjb3B5IHJvdXRpbmUgdG8gdHJhbnNm ZXIgcGFnZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkCiAqIGJldHdlZW4gaGFydmVzdCBwYXNzZXMuCiAq CiAqIENvcHlyaWdodCAoQykgMjAwNiBTdHJhdHVzIFRlY2hub2xvZ2llcyBCZXJtdWRhIEx0ZC4K ICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK ICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy ZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAz MzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KI2luY2x1ZGUgImZvc2lsLmgiCiNp bmNsdWRlICJzeW5jZC5oIgojaW5jbHVkZSAiaGFydmVzdC5oIgojaW5jbHVkZSAic21hbGxwbWQu aCIKCi8qCiAqIFRoZSBmb2xsb3dpbmcgaWZkZWYgYWxsb3dzIGhhcnZlc3QgdG8gYmUgYnVpbHQg YWdhaW5zdCBhIGtlcm5lbAogKiB3aGljaCBkb2VzIG5vdCBpbXBsZW1lbnQgbWVtb3J5IHRyYWNr aW5nLgogKi8KI2lmZGVmIENPTkZJR19UUkFDS19ESVJUWV9QQUdFUwoKI2luY2x1ZGUgPGxpbnV4 L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvbW0uaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxs b2MuaD4KI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5j bHVkZSA8YXNtL2F0b21pYy5oPgojaW5jbHVkZSA8YXNtL3RsYi5oPgojaW5jbHVkZSA8YXNtL3Vh Y2Nlc3MuaD4KCiNkZWZpbmUgSEFSVkVTVF9CWV9UQUJMRSAxCiNkZWZpbmUgU01QX0hBUlZFU1Qg MQovLyNkZWZpbmUgVVNFX1NNQUxMX1BNRAkxCiNkZWZpbmUgVVNFX1RBU0tfSEFSVkVTVAkxCgoj ZGVmaW5lIE1BWF9DT1BZUkFOR0UJMTAwCS8qIHRoaXMgaXMgYWN0dWFsbHkgZGVmaW5lZCBpbiBj Yy9ob3N0LmggKi8KI2RlZmluZSBNQiAoMTAyNCoxMDI0KQojZGVmaW5lIE5FQVJCWQkJNgoKI2lm ZGVmIENPTkZJR19YODZfUEFFCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHBhZGRyX3Q7CS8q IHBoeXNpY2FsIGFkZHJlc3MgdHlwZSAqLwojZGVmaW5lIFBBRERSX0ZNVCAiJTA5bHgiCQkvKiBw cmludGYgZm9ybWF0IGZvciBwYWRkcl90ICovCiNlbHNlCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBw YWRkcl90OwkJLyogcGh5c2ljYWwgYWRkcmVzcyB0eXBlICovCiNkZWZpbmUgUEFERFJfRk1UICIl MDhseCIJCS8qIHByaW50ZiBmb3JtYXQgZm9yIHBhZGRyX3QgKi8KI2VuZGlmCgplbnVtIHsKCURC R0xWTF9OT05FICAgICA9IDB4MDAsCglEQkdMVkxfSEFSVkVTVCAgPSAweDAxLAoJREJHTFZMX0JS T1dOT1VUID0gMHgwMiwKCURCR0xWTF9USU1FUiAgICA9IDB4MDQsCn07CgpzdGF0aWMgaW50IGRi Z21hc2sgPSBEQkdMVkxfTk9ORTsKCiNkZWZpbmUgREJHUFJOVChsdmwsIGFyZ3MuLi4pCQkJXAoo ewkJCQkJCVwKCWlmIChsdmwgJiBkYmdtYXNrKQkJCVwKCQlwcmludGsoYXJncyk7CQkJXAp9KQoK ZW51bSB7CglJTl9CUk9XTk9VVCA9IDAsCglJTl9CTEFDS09VVCA9IDEsCn07CgpzdHJ1Y3QgdGlt ZXJfc2V0IHsKCXVuc2lnbmVkIGxvbmcgbG9uZyBiZWZvcmU7Cgl1bnNpZ25lZCBsb25nIGxvbmcg YWZ0ZXI7Cn07CgpzdHJ1Y3Qgc3luY2RfZGF0YSB7Cgl1bnNpZ25lZCBsb25nIGZsYWdzW05SX0NQ VVNdOwoJY29weV9wcm9jIGNvcHk7CglzeW5jX3Byb2Mgc3luYzsKCXZvaWQgKiBjb250ZXh0OwoJ aXNfcGZuX3ZhbGlkX3Byb2MgaXNfcGZuX3ZhbGlkOwoJaXNfcGZucmFuZ2VfdmFsaWRfcHJvYyBp c19wZm5yYW5nZV92YWxpZDsKCWludCBzdGF0dXM7CQkvLyByZXR1cm4gc3RhdHVzIGZyb20gY29t bWFuZCBpbnNpZGUgYmxhY2tvdXQKCWludCBtYXhfcmFuZ2U7CQkvLyAjIG9mIHZhbGlkIHJhbmdl cyBpbiBmb2xsb3dpbmcgQ29weVJhbmdlCglmb3NpbF9wYWdlX3JhbmdlX3QgQ29weVJhbmdlW01B WF9DT1BZUkFOR0VdOwoJdW5zaWduZWQgbG9uZyBuZWFyYnk7CS8vIGluc2VydCBtZXJnZSB0dW5h YmxlCgl1bnNpZ25lZCBpbnQgIGR1cmF0aW9uX2luX21zOwkvLyBibGFja291dCBkdXJpbmcKCXVu c2lnbmVkIGxvbmcgYml0Y250OwkvLyBudW1iZXIgb2YgYml0cyBmaW5kIGluIGxhc3QgaGFydmVz dAoJaW50IGJsYWNrb3V0OwkJLy8gMSA9PSBibGFja291dCwgMCA9PSBicm93bm91dAoJaW50IHBh c3M7CQkvLyAjIG9mIHRpbWVzIHRocm91Z2ggaGFydmVzdC9wcm9jZXNzIGN5Y2xlCglpbnQgZG9u ZTsJCS8vIDEgPT0gZG9uZSAtIHRpbWUgdG8gbGVhdmUKCXVuc2lnbmVkIGludCB0aHJlc2hvbGQ7 CS8vIG51bWJlciBvZiBkaXJ0eSBwYWdlcyBiZWZvcmUgc3luYwoJYXRvbWljX3QgcjsKfTsKCiNp ZmRlZiBIQVJWRVNUX0JZX1RBQkxFCnZvaWQgaGFydmVzdF90YWJsZShwZ2RfdCAqIHBnZF9iYXNl LCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKewoJdW5zaWduZWQgbG9u ZyBpLCBqLCBrLCBsOwoKCXBnZF90ICpwZ2Q7CgoJdW5zaWduZWQgbG9uZyBwZ2Rfc3RhcnQsIHBn ZF9lbmQ7Cgl1bnNpZ25lZCBsb25nIHB1ZF9zdGFydCwgcHVkX2VuZDsKCXVuc2lnbmVkIGxvbmcg cG1kX3N0YXJ0LCBwbWRfZW5kOwoJdW5zaWduZWQgbG9uZyBwdGVfc3RhcnQsIHB0ZV9lbmQ7CgoJ dW5zaWduZWQgbG9uZyBwdWRfbGFzdDsKCXVuc2lnbmVkIGxvbmcgcG1kX2xhc3Q7Cgl1bnNpZ25l ZCBsb25nIHB0ZV9sYXN0OwoKCS8qCgkgKiBlbmQgbWFya3MgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIg dGhlIHVwcGVyIGxpbWl0IG9mIHRoZSBhZGRyZXNzCgkgKiByYW5nZQoJICovCgllbmQtLTsKCglp ZiAoIXBnZF9iYXNlKSB7CgkJcHJpbnRrKCIlczogbnVsbCBwZ2Q/XG4iLCBfX2Z1bmNfXyk7CgkJ cmV0dXJuOwoJfQoKCXBnZF9zdGFydCA9IHBnZF9pbmRleChzdGFydCk7CglwZ2RfZW5kID0gcGdk X2luZGV4KGVuZCk7CgoJcHVkX3N0YXJ0ID0gcHVkX2luZGV4KHN0YXJ0KTsKCXB1ZF9lbmQgPSBw dWRfaW5kZXgoZW5kKTsKCglwbWRfc3RhcnQgPSBwbWRfaW5kZXgoc3RhcnQpOwoJcG1kX2VuZCA9 IHBtZF9pbmRleChlbmQpOwoKCXB0ZV9zdGFydCA9IHB0ZV9pbmRleChzdGFydCk7CglwdGVfZW5k ID0gcHRlX2luZGV4KGVuZCk7CgoJcGdkID0gcGdkX2Jhc2UgKyBwZ2Rfc3RhcnQ7CgoJZm9yIChp ID0gcGdkX3N0YXJ0OyBpIDw9IHBnZF9lbmQ7IGkrKywgcGdkKyspIHsKCgkJcHVkX3QgKnB1ZDsK CgkJaWYgKHBnZF9ub25lKCpwZ2QpIHx8ICFwZ2RfcHJlc2VudCgqcGdkKSkKCQkJY29udGludWU7 CgoJCWlmIChpID09IHBnZF9zdGFydCkKCQkJaiA9IHB1ZF9zdGFydDsKCQllbHNlCgkJCWogPSAw OwoKCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMCkgKyBqOwoKCQlpZiAoaSA9PSBwZ2RfZW5kKQoJ CQlwdWRfbGFzdCA9IHB1ZF9lbmQ7CgkJZWxzZQoJCQlwdWRfbGFzdCA9IFBUUlNfUEVSX1BVRCAt IDE7CgoJCWZvciAoOyBqIDw9IHB1ZF9sYXN0OyBqKyssIHB1ZCsrKSB7CgkJCXBtZF90ICpwbWQ7 CgkJCXVuc2lnbmVkIGxvbmcgYWRkcjsKCQkJcHVkX3QgdG1wX3B1ZCA9ICpwdWQ7CgoJCQlhZGRy ID0gaSA8PCBQR0RJUl9TSElGVDsKCQkJYWRkciArPSBqIDw8IFBVRF9TSElGVDsKCgkJCWlmIChw dWRfbm9uZSh0bXBfcHVkKSB8fCAhcHVkX3ByZXNlbnQodG1wX3B1ZCkpCgkJCQljb250aW51ZTsK CgkJCWlmICgoaSA9PSBwZ2Rfc3RhcnQpICYmIChqID09IHB1ZF9zdGFydCkpCgkJCQlrID0gcG1k X3N0YXJ0OwoJCQllbHNlCgkJCQlrID0gMDsKCgkJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCAwKSAr IGs7CgoJCQlpZiAoKGkgPT0gcGdkX2VuZCkgJiYgKGogPT0gcHVkX2VuZCkpCgkJCQlwbWRfbGFz dCA9IHBtZF9lbmQ7CgkJCWVsc2UKCQkJCXBtZF9sYXN0ID0gUFRSU19QRVJfUE1EIC0gMTsKCgkJ CWZvciAoOyBrIDw9IHBtZF9sYXN0OyBrKyssIHBtZCsrKSB7CgkJCQlwdGVfdCAqcHRlOwoJCQkJ cG1kX3QgdG1wX3BtZCA9ICpwbWQ7CgoJCQkJYWRkciArPSBrIDw8IFBNRF9TSElGVDsKCgkJCQlp ZiAocG1kX25vbmUodG1wX3BtZCkgfHwgIXBtZF9wcmVzZW50KHRtcF9wbWQpKQoJCQkJCWNvbnRp bnVlOwoJCQkJCgkJCQlpZiAocG1kX2xhcmdlKHRtcF9wbWQpKSB7CgkJCQkJaWYgKHBtZF92YWwo dG1wX3BtZCkgJiBfUEFHRV9ESVJUWSkgewoJCQkJCQlwbWRfdmFsKHRtcF9wbWQpICY9IH5fUEFH RV9ESVJUWTsKCQkJCQkJcG1kX3ZhbCh0bXBfcG1kKSB8PSBfUEFHRV9TT0ZURElSVFk7CgkJCQkJ CW1tX3RyYWNrX3BtZChwbWQpOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAocG1kX3ZhbCh0bXBfcG1k KSAhPSBwbWRfdmFsKCpwbWQpKSB7CgkJCQkJKnBtZCA9IHRtcF9wbWQ7CgkJCQkJaWYgKHBtZF92 YWwodG1wX3BtZCkgJiBfUEFHRV9HTE9CQUwpCgkJCQkJCV9fZmx1c2hfdGxiX2dsb2JhbCgpOwoJ CQkJCWVsc2UKCQkJCQkJX19mbHVzaF90bGJfb25lKGFkZHIpOwoJCQkJCW1tX3RyYWNrX3BoeXMo KHZvaWQqKXZpcnRfdG9fcGh5cyhwbWQpKTsKCQkJCX0KCgkJCQlpZiAocG1kX2xhcmdlKHRtcF9w bWQpKQoJCQkJCWNvbnRpbnVlOwoKCQkJCWlmICgoaSA9PSBwZ2Rfc3RhcnQpICYmIChqID09IHB1 ZF9zdGFydCkgJiYgKGsgPT0gcG1kX3N0YXJ0KSkKCQkJCQlsID0gcHRlX3N0YXJ0OwoJCQkJZWxz ZQoJCQkJCWwgPSAwOwoKCQkJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCkgKyBsOwoK CQkJCWlmICgoaSA9PSBwZ2RfZW5kKSAmJiAoaiA9PSBwdWRfZW5kKSAmJiAoayA9PSBwbWRfZW5k KSkKCQkJCQlwdGVfbGFzdCA9IHB0ZV9lbmQ7CgkJCQllbHNlCgkJCQkJcHRlX2xhc3QgPSBQVFJT X1BFUl9QVEUgLSAxOwoKCQkJCWZvciAoOyBsIDw9IHB0ZV9sYXN0OyBsKyssIHB0ZSsrKSB7CgoJ CQkJCXVuc2lnbmVkIGxvbmcgYWRkcl9wdGUgPSBhZGRyICsgKGsgPDwgUEFHRV9TSElGVCk7CgkJ CQkJcHRlX3QgdG1wX3B0ZSA9ICpwdGU7CgoJCQkJCWlmIChwdGVfdmFsKHRtcF9wdGUpICYgX1BB R0VfRElSVFkpIHsKCQkJCQkJcHRlX3ZhbCh0bXBfcHRlKSAmPSB+X1BBR0VfRElSVFk7CgkJCQkJ CXB0ZV92YWwodG1wX3B0ZSkgfD0gX1BBR0VfU09GVERJUlRZOwoJCQkJCQltbV90cmFja19wdGUo cHRlKTsKCQkJCQl9CgoJCQkJCWlmIChwdGVfdmFsKHRtcF9wdGUpICE9IHB0ZV92YWwoKnB0ZSkp IHsKCQkJCQkJKnB0ZSA9IHRtcF9wdGU7CgkJCQkJCWlmIChwdGVfdmFsKHRtcF9wdGUpICYgX1BB R0VfR0xPQkFMKQoJCQkJCQkJX19mbHVzaF90bGJfZ2xvYmFsKCk7CgkJCQkJCWVsc2UKCQkJCQkJ CV9fZmx1c2hfdGxiX29uZShhZGRyX3B0ZSk7CgkJCQkJCW1tX3RyYWNrX3BoeXMoKHZvaWQqKXZp cnRfdG9fcGh5cyhwdGUpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9Cn0KI2Vsc2UKc3RhdGlj IHZvaWQgaGFydmVzdF9wYWdlKHBnZF90ICogcGdkX2Jhc2UsIHVuc2lnbmVkIGxvbmcgYWRkcikK ewoJLy8gZm9yIGFsbCBwYWdlcyBpbiB0aGlzIHZtX2FyZWFfc3RydWN0CglwZ2RfdCAqcGdkOwoJ cG1kX3QgKnBtZDsKCXB0ZV90ICpwdGU7CgoJREJHUFJOVChEQkdMVkxfSEFSVkVTVCwgInBnZF9i YXNlICVwICsgb2Zmc2V0ICVsZFxuIiwKCQlwZ2RfYmFzZSwgcGdkX2luZGV4KGFkZHIpKTsKCglE QkdQUk5UKERCR0xWTF9IQVJWRVNULCAiICAgIHBnZFswXSAlMDlseFxuIiwgcGdkX3ZhbChwZ2Rf YmFzZVswXSkpOwoJREJHUFJOVChEQkdMVkxfSEFSVkVTVCwgIiAgICBwZ2RbMV0gJTA5bHhcbiIs IHBnZF92YWwocGdkX2Jhc2VbMV0pKTsKCURCR1BSTlQoREJHTFZMX0hBUlZFU1QsICIgICAgcGdk WzJdICUwOWx4XG4iLCBwZ2RfdmFsKHBnZF9iYXNlWzJdKSk7CglEQkdQUk5UKERCR0xWTF9IQVJW RVNULCAiICAgIHBnZFszXSAlMDlseFxuIiwgcGdkX3ZhbChwZ2RfYmFzZVszXSkpOwoKCXBnZCA9 IHBnZF9iYXNlICsgcGdkX2luZGV4KGFkZHIpOwoJaWYgKHBnZF9ub25lKCpwZ2QpKQoJCXJldHVy bjsKCglpZiAoIXBnZF9wcmVzZW50KCpwZ2QpKQoJCXJldHVybjsKCglwbWQgPSBwbWRfb2Zmc2V0 KHBnZCwgYWRkcik7CgoJREJHUFJOVChEQkdMVkxfSEFSVkVTVCwgIiAgICAgICAgcG1kWyVsZF0g JXAgaXMgJWx4XG4iLAoJCXBtZF9pbmRleChhZGRyKSwgcG1kLCBwbWRfdmFsKCpwbWQpKTsKCglp ZiAocG1kX25vbmUoKnBtZCkpCgkJcmV0dXJuOwoKCWlmICghcG1kX3ByZXNlbnQoKnBtZCkpCgkJ cmV0dXJuOwoKCS8vIGxhcmdlIHBhZ2VzCglpZiAocG1kX2xhcmdlKCpwbWQpKSB7CgoJCWlmICgo cG1kX3ZhbCgqcG1kKSAmIF9QQUdFX0RJUlRZKSA9PSAwKQoJCQlyZXR1cm47CgoJCW1tX3RyYWNr X3BtZChwbWQpOwoKCQlwbWRfdmFsKCpwbWQpICY9IH5fUEFHRV9ESVJUWTsKCQlwbWRfdmFsKCpw bWQpIHw9IF9QQUdFX1NPRlRESVJUWTsKCgkJcmV0dXJuOwoJfQoKCWlmIChhZGRyIDwgUEFHRV9P RkZTRVQpCgkJcHRlID0gcHRlX29mZnNldF9tYXAocG1kLCBhZGRyKTsKCWVsc2UKCQlwdGUgPSBw dGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpOwoKCURCR1BSTlQoREJHTFZMX0hBUlZFU1QsICIg ICAgICAgICAgICBwYWdlIHRhYmxlICVseFxuIiwKCQlwbWRfdmFsKCpwbWQpICYgUEFHRV9NQVNL KTsKCURCR1BSTlQoREJHTFZMX0hBUlZFU1QsICIgICAgICAgICAgICBwdGVbJWxkXSAlcCBpcyAl bHhcbiIsCgkJcHRlX2luZGV4KGFkZHIpLCBwdGUsIHB0ZV92YWwoKnB0ZSkpOwoKCWlmIChwdGVf bm9uZSgqcHRlKSB8fCAhcHRlX3ByZXNlbnQoKnB0ZSkpCgkJZ290byBvdXRfdW5tYXBfcHRlOwoK CWlmICghKHB0ZV92YWwoKnB0ZSkgJiBfUEFHRV9ESVJUWSkpCgkJZ290byBvdXRfdW5tYXBfcHRl OwoKCW1tX3RyYWNrX3B0ZShwdGUpOwoKCXB0ZV92YWwoKnB0ZSkgJj0gfl9QQUdFX0RJUlRZOwoJ cHRlX3ZhbCgqcHRlKSB8PSBfUEFHRV9TT0ZURElSVFk7CgoJREJHUFJOVChEQkdMVkxfSEFSVkVT VCwgImEgICAgICAgICAgIHB0ZVslbGRdICVwIGlzICVseFxuIiwKCQlwdGVfaW5kZXgoYWRkciks IHB0ZSwgcHRlX3ZhbCgqcHRlKSk7CgpvdXRfdW5tYXBfcHRlOgoJaWYgKGFkZHIgPCBQQUdFX09G RlNFVCkKCQlwdGVfdW5tYXAocHRlKTsKCglyZXR1cm47Cn0KI2VuZGlmCgpzdGF0aWMgcGdkX3Qg KmdldF9wZ2QodW5zaWduZWQgbG9uZyBhZGRyZXNzKSB7CiNpZiAwCiAgICAgICAgcGdkX3QgKnBn ZDsKCiAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3ZxICUlY3IzLCUwIiA6ICI9ciIgKHBnZCkpOwoK ICAgICAgICBwZ2QgPSBfX3ZhKCh1bnNpZ25lZCBsb25nKXBnZCAmIFBIWVNJQ0FMX1BBR0VfTUFT Syk7CiAgICAgICAgcGdkICs9IHBnZF9pbmRleChhZGRyZXNzKTsKICAgICAgICBpZiAoIXBnZF9w cmVzZW50KCpwZ2QpKSB7CgkJcHJpbnRrKCIlcy1LQU06IHBnZCBub3QgcHJlc2VudCAoJXApXG4i LCBfX2Z1bmNfXywKCQkJKHZvaWQqKShwZ2RfdmFsKCpwZ2QpKSk7CgkJcmV0dXJuIE5VTEw7Cgl9 CgoJaWYgKHBnZCAhPSBpbml0X2xldmVsNF9wZ3QpCgkJcHJpbnRrKCIlczogZ290ICVwLCBidXQg aW5pdF9sZXZlbDRfcGd0IGlzICVwXG4iLCBfX2Z1bmNfXywKCQkJcGdkLCBpbml0X2xldmVsNF9w Z3QpOwoKCXJldHVybiBwZ2Q7CiNlbHNlCglyZXR1cm4gaW5pdF9sZXZlbDRfcGd0OwojZW5kaWYK fQoKLyoKICogVHJhdmVyc2UgdGhlIGtlcm5lbCBwYWdlIHRhYmxlcywgYnV0IGRvbid0IHVzZSB0 aGUKICogbG9vcC1vdmVyLWFsbC1rZXJuZWwtYWRkcmVzcyB0ZWNobmlxdWUsIGFzIHRoYXQKICog dGFrZXMgb25lIGZvdXJ0aCBvZiBmb3JldmVyIG9uIGEgNjQtYml0IG1hY2hpbmUuCiAqIEluc3Rl YWQsIGl0ZXJhdGUgb3ZlciB0aGUgcGFnZSB0YWJsZXMgdGhlbXNlbHZlcywKICogc3RhcnRpbmcg d2l0aCB0aGUgcGdkIHRhYmxlLiAgVGhpcyB3aWxsIGJlIGEgcXVhZHJ1cGxlLQogKiBuZXN0ZWQg bG9vcCwgIHJlbHlpbmcgb24gcFttbDQvZ2QvbWQvdGVdX25vbmUgY2hlY2tzCiAqIGZvciBlYXJs eS1vdXRzIGluIHRoZSBsb29wcy4KICogQmUgbmljZSB0byBmaW5kIGEgdXNlZnVsIHdheSB0byBT TVAtaWZ5IHRoaXMgdHJhdmVyc2FsLAogKiBidXQgc28gZmFyIGhhdmVuJ3QgZm91bmQgYSB3YXku CiAqLwpzdGF0aWMgdm9pZCBoYXJ2ZXN0X2tlcm5lbCh2b2lkKQp7Cgl1bnNpZ25lZCBsb25nIG4s IGksIGosIGs7CgoJcGdkX3QgKnBnZF8wID0gZ2V0X3BnZCgwKTsKCXBnZF90ICpwZ2QgPSBnZXRf cGdkKFBBR0VfT0ZGU0VUKTsKCglpZiAoIXBnZF8wKSB7CgkJcHJpbnRrKCIlczogbnVsbCBwZ2Rf MFxuIiwgX19mdW5jX18pOwoJCXJldHVybjsKCX0KCglpZiAoIXBnZCkgewoJCXByaW50aygiJXM6 IG51bGwgcGdkXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuOwoJfQoKCS8vIFNraXAgYWRkcnMgPCBQ QUdFX09GRlNFVAoJZm9yIChuID0gcGdkIC0gcGdkXzA7IG4gPCBQVFJTX1BFUl9QR0Q7IG4rKywg cGdkKyspIHsKCQlwdWRfdCAqcHVkOwoKCQlpZiAocGdkX25vbmUoKnBnZCkgfHwgIXBnZF9wcmVz ZW50KCpwZ2QpKQoJCQljb250aW51ZTsKCgkJcHVkID0gcHVkX29mZnNldChwZ2QsIDApOwoKCQlp ZiAoIXB1ZCkgewoJCQlwcmludGsoIiVzOiBudWxsIHB1ZD9cbiIsIF9fZnVuY19fKTsKCQkJcmV0 dXJuOwoJCX0KCgkJbW1fdHJhY2tfcGh5cygodm9pZCopdmlydF90b19waHlzKHB1ZCkpOwoJCQoJ CWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QVUQ7IGkrKywgcHVkKyspIHsKCgkJCXBtZF90ICpw bWQ7CgoJCQlpZiAocHVkX25vbmUoKnB1ZCkgfHwgIXB1ZF9wcmVzZW50KCpwdWQpKQoJCQkJY29u dGludWU7CgoJCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgMCk7CgoJCQlmb3IgKGogPSAwOyBqIDwg UFRSU19QRVJfUE1EOyBqKyssIHBtZCsrKSB7CgkJCQlwdGVfdCAqcHRlOwoJCQkJcG1kX3QgdG1w X3BtZCA9ICpwbWQ7CgkJCQl1bnNpZ25lZCBsb25nIGFkZHI7CgoJCQkJYWRkciA9IG4gPDwgUEdE SVJfU0hJRlQ7CgkJCQlhZGRyICs9IGkgPDwgUFVEX1NISUZUOwoJCQkJYWRkciArPSBqIDw8IFBN RF9TSElGVDsKCgkJCQlpZiAocG1kX25vbmUodG1wX3BtZCkgfHwgIXBtZF9wcmVzZW50KHRtcF9w bWQpKQoJCQkJCWNvbnRpbnVlOwoKCQkJCWlmIChwbWRfbGFyZ2UodG1wX3BtZCkpIHsKCQkJCQlp ZiAocG1kX3ZhbCh0bXBfcG1kKSAmIF9QQUdFX0RJUlRZKSB7CgkJCQkJCXBtZF92YWwodG1wX3Bt ZCkgJj0gfl9QQUdFX0RJUlRZOwoJCQkJCQlwbWRfdmFsKHRtcF9wbWQpIHw9IF9QQUdFX1NPRlRE SVJUWTsKCQkJCQkJbW1fdHJhY2tfcG1kKHBtZCk7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChwbWRf dmFsKHRtcF9wbWQpICE9IHBtZF92YWwoKnBtZCkpIHsKCQkJCQkqcG1kID0gdG1wX3BtZDsKCQkJ CQlpZiAocG1kX3ZhbCh0bXBfcG1kKSAmIF9QQUdFX0dMT0JBTCkKCQkJCQkJX19mbHVzaF90bGJf Z2xvYmFsKCk7CgkJCQkJZWxzZQoJCQkJCQlfX2ZsdXNoX3RsYl9vbmUoYWRkcik7CgkJCQkJbW1f dHJhY2tfcGh5cygodm9pZCopdmlydF90b19waHlzKHBtZCkpOwoJCQkJfQoKCQkJCWlmIChwbWRf bGFyZ2UodG1wX3BtZCkpCgkJCQkJY29udGludWU7CgoJCQkJcHRlID0gcHRlX29mZnNldF9rZXJu ZWwocG1kLCAwKTsKCgkJCQlmb3IgKGsgPSAwOyBrIDwgUFRSU19QRVJfUFRFOyBrKyssIHB0ZSsr KSB7CgkJCQkJdW5zaWduZWQgbG9uZyBhZGRyX3B0ZSA9IGFkZHIgKyAoayA8PCBQQUdFX1NISUZU KTsKCQkJCQlwdGVfdCB0bXBfcHRlID0gKnB0ZTsKCgkJCQkJaWYgKHB0ZV9ub25lKHRtcF9wdGUp IHx8ICFwdGVfcHJlc2VudCh0bXBfcHRlKSkKCQkJCQkJY29udGludWU7CgoJCQkJCWlmIChwdGVf dmFsKHRtcF9wdGUpICYgX1BBR0VfRElSVFkpIHsKCQkJCQkJcHRlX3ZhbCh0bXBfcHRlKSAmPSB+ X1BBR0VfRElSVFk7CgkJCQkJCXB0ZV92YWwodG1wX3B0ZSkgfD0gX1BBR0VfU09GVERJUlRZOwoJ CQkJCQltbV90cmFja19wdGUocHRlKTsKCQkJCQl9CgoJCQkJCWlmIChwdGVfdmFsKHRtcF9wdGUp ICE9IHB0ZV92YWwoKnB0ZSkpIHsKCQkJCQkJKnB0ZSA9IHRtcF9wdGU7CgkJCQkJCWlmIChwdGVf dmFsKHRtcF9wdGUpICYgX1BBR0VfR0xPQkFMKQoJCQkJCQkJX19mbHVzaF90bGJfZ2xvYmFsKCk7 CgkJCQkJCWVsc2UKCQkJCQkJCV9fZmx1c2hfdGxiX29uZShhZGRyX3B0ZSk7CgkJCQkJCW1tX3Ry YWNrX3BoeXMoKHZvaWQqKXZpcnRfdG9fcGh5cyhwdGUpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9 Cgl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIG1hcF9rZXJuZWxfc21hbGxfcG1kKHZvaWQgKiBf X2F0dHJpYnV0ZV9fICgodW51c2VkKSkgdW51c2VkX2FyZykKewojaWZkZWYgVVNFX1NNQUxMX1BN RAoJc21hbGxfcG1kX2VudGVyKCk7CiNlbmRpZgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB1bnNpZ25l ZCBsb25nIG1hcF9rZXJuZWxfb3JpZ19wbWQodm9pZCAqIF9fYXR0cmlidXRlX18gKCh1bnVzZWQp KSB1bnVzZWRfYXJnKQp7CiNpZmRlZiBVU0VfU01BTExfUE1ECglzbWFsbF9wbWRfbGVhdmUoKTsK I2VuZGlmCglyZXR1cm4gMDsKfQoKI2lmZGVmIFVTRV9UQVNLX0hBUlZFU1QKc3RhdGljIHZvaWQg aGFydmVzdF9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkgewoJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICogbW1hcCwgKiB2bWE7CgoJdm1hID0gbW1hcCA9IG1tLT5tbWFwOwoJaWYgKCFtbWFwKQoJCXJl dHVybjsKCglkbyB7CgkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwoKCQlpZiAoIXZtYSkKCQkJ YnJlYWs7CgoJCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKCQllbmQgICA9IHZtYS0+dm1fZW5kOwoK I2lmZGVmIEhBUlZFU1RfQllfVEFCTEUKCQloYXJ2ZXN0X3RhYmxlKG1tLT5wZ2QsIHN0YXJ0LCBl bmQpOwojZWxzZQoJCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDw9IGVuZDsgYWRkciArPSBQQUdF X1NJWkUpCgkJCWhhcnZlc3RfcGFnZShtbS0+cGdkLCBhZGRyKTsKI2VuZGlmCgoJfSB3aGlsZSAo KHZtYSA9IHZtYS0+dm1fbmV4dCkgIT0gbW1hcCk7Cn0KCnN0YXRpYyB2b2lkIGhhcnZlc3RfdXNl cih2b2lkKQp7CglzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CglpbnQgdGFza19jb3VudCA9IDA7Cglp bnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CglpbnQgbnVtX2NwdXMgPSBudW1fb25s aW5lX2NwdXMoKTsKCglmb3JfZWFjaF9wcm9jZXNzKHApIHsKCQlzdHJ1Y3QgbW1fc3RydWN0ICpt bSA9IHAtPm1tOwoKI2lmZGVmIFNNUF9IQVJWRVNUCgkJaWYgKHRoaXNfY3B1ICE9ICh0YXNrX2Nv dW50KysgJSBudW1fY3B1cykpCgkJCWNvbnRpbnVlOwojZW5kaWYKCgkJaWYgKCFtbSkKCQkJY29u dGludWU7CgoJCWhhcnZlc3RfbW0obW0pOwoJfQp9CiNlbHNlCnN0YXRpYyB2b2lkIGhhcnZlc3Rf dXNlcih2b2lkKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICogbSA9IE5VTEw7CglzdHJ1Y3QgbW1fc3Ry dWN0ICogbW1lbnRyeTsKCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIG1tYXAsICogdm1hOwojaWZu ZGVmIEhBUlZFU1RfQllfVEFCTEUKCXVuc2lnbmVkIGxvbmcgYWRkcjsKI2VuZGlmCglpbnQgbnVt X2NwdXMgPSBudW1fb25saW5lX2NwdXMoKTsKCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3Jf aWQoKTsKCWludCBwZ2RfY291bnQgPSAwOwoKCW0gPSAmaW5pdF9tbS5tbWxpc3Q7CgoJZG8gewoJ CW1tZW50cnkgPSBsaXN0X2VudHJ5KG0sIHN0cnVjdCBtbV9zdHJ1Y3QsIG1tbGlzdCk7CgkJbSA9 IG0tPm5leHQ7CgoJCXZtYSA9IG1tYXAgPSBtbWVudHJ5LT5tbWFwOwoJCWlmICghbW1hcCkKCQkJ Y29udGludWU7CgojaWZkZWYgU01QX0hBUlZFU1QKCQlpZiAodGhpc19jcHUgIT0gKHBnZF9jb3Vu dCsrICUgbnVtX2NwdXMpKQoJCQljb250aW51ZTsKI2VuZGlmCgoJCWRvIHsKCQkJdW5zaWduZWQg bG9uZyBzdGFydCwgZW5kOwoKCQkJaWYgKCF2bWEpCgkJCQlicmVhazsKCgkJCXN0YXJ0ID0gdm1h LT52bV9zdGFydDsKCQkJZW5kICAgPSB2bWEtPnZtX2VuZDsKCiNpZmRlZiBIQVJWRVNUX0JZX1RB QkxFCgkJCWhhcnZlc3RfdGFibGUobW1lbnRyeS0+cGdkLCBzdGFydCwgZW5kKTsKI2Vsc2UKCQkJ Zm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPD0gZW5kOyBhZGRyICs9IFBBR0VfU0laRSkKCQkJCWhh cnZlc3RfcGFnZShtbWVudHJ5LT5wZ2QsIGFkZHIpOwojZW5kaWYKCgkJfSB3aGlsZSAoKHZtYSA9 IHZtYS0+dm1fbmV4dCkgIT0gbW1hcCk7CgoJfSB3aGlsZSAobSAhPSAmaW5pdF9tbS5tbWxpc3Qp Owp9CiNlbmRpZgoKI2RlZmluZSBWSVJUX1RPX1BGTihwZm4pICh2aXJ0X3RvX3BoeXMocGZuKSA+ PiBQQUdFX1NISUZUKQoKI2RlZmluZSBURVNUX0JJVCh4LCBwZm4sIHZlY3RvcikJCQkJXAooewkJ CQkJCQkJXAoJaW50IHJldHZhbDsJCQkJCQlcCgkJCQkJCQkJXAoJaWYgKHgtPmJsYWNrb3V0KQkJ CQkJXAoJCXJldHZhbCA9IHRlc3RfYml0KHBmbiwgdmVjdG9yKTsJCQlcCgllbHNlCQkJCQkJCVwK CQlyZXR2YWwgPSB0ZXN0X2FuZF9jbGVhcl9iaXQocGZuLCB2ZWN0b3IpOwlcCgkJCQkJCQkJXAoJ cmV0dmFsOwkJCQkJCQlcCn0pCgpzdGF0aWMgdm9pZCBwcm9jZXNzX3ZlY3Rvcih2b2lkICogYXJn KQp7CglzdHJ1Y3Qgc3luY2RfZGF0YSAqIHggPSAoc3RydWN0IHN5bmNkX2RhdGEgKikgYXJnOwoJ dW5zaWduZWQgbG9uZyBwZm47Cgl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgcnVubGVuZ3RoOwoK CS8vIHRyYXZlcnNlIHRoZSB0aGUgYml0bWFwIGxvb2tpbmcgZm9yIGRpcnR5IHBhZ2VzCglydW5s ZW5ndGggPSAwOwoJc3RhcnRfcGZuID0gMDsKCglmb3IgKHBmbiA9IDA7IHBmbiA8IG1tX3RyYWNr aW5nX3N0cnVjdC5iaXRjbnQ7IHBmbisrKSB7CgkJaWYgKFRFU1RfQklUKHgsIHBmbiwgbW1fdHJh Y2tpbmdfc3RydWN0LnZlY3RvcikpIHsKCQkJaWYgKCEoeC0+YmxhY2tvdXQpKQoJCQkJYXRvbWlj X2RlYygmbW1fdHJhY2tpbmdfc3RydWN0LmNvdW50KTsKCQkgICAgCWlmICh4LT5pc19wZm5fdmFs aWQocGZuKSkgewoJCQkJaWYgKHJ1bmxlbmd0aCA9PSAwKSB7CgkJCQkJc3RhcnRfcGZuID0gcGZu OwoJCQkJfQoJCQkJcnVubGVuZ3RoKys7CgkJCX0gZWxzZSB7CgkJCQlpZiAocnVubGVuZ3RoKSB7 CgkJCQkJeC0+c3RhdHVzID0geC0+Y29weShzdGFydF9wZm4sIHJ1bmxlbmd0aCwKCQkJCQkJCSAg ICB4LT5ibGFja291dCwgeC0+Y29udGV4dCk7CgkJCQkJaWYgKHgtPnN0YXR1cyAhPSBGT1NJTF9F UlJfT0spIHsKCQkJCQkJcHJpbnRrKCIlczogJWQgZXJyb3IgKCVkKSwgc3RhcnRfcGZuICVseCwg cnVubGVuZ3RoICVseFxuIiwKCQkJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sCgkJCQkJCQl4 LT5zdGF0dXMsCgkJCQkJCQlzdGFydF9wZm4sCgkJCQkJCQlydW5sZW5ndGgpOwoJCQkJCQlyZXR1 cm47CgkJCQkJfQoJCQkJfQoJCQkJc3RhcnRfcGZuID0gcnVubGVuZ3RoID0gMDsKCQkJfQoKCQl9 IGVsc2UgaWYgKHJ1bmxlbmd0aCkgewoJCQl4LT5zdGF0dXMgPSB4LT5jb3B5KHN0YXJ0X3Bmbiwg cnVubGVuZ3RoLAoJCQkJCSAgICB4LT5ibGFja291dCwgeC0+Y29udGV4dCk7CgkJCWlmICh4LT5z dGF0dXMgIT0gRk9TSUxfRVJSX09LKSB7CgkJCQlwcmludGsoIiVzOiAlZCBlcnJvciAoJWQpLCBz dGFydF9wZm4gJWx4LCBydW5sZW5ndGggJWx4XG4iLAoJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5F X18sCgkJCQkJeC0+c3RhdHVzLAoJCQkJCXN0YXJ0X3BmbiwKCQkJCQlydW5sZW5ndGgpOwoJCQkJ cmV0dXJuOwoJCQl9CgkJCXN0YXJ0X3BmbiA9IHJ1bmxlbmd0aCA9IDA7CgkJfQoJfQoKCS8vIENh dGNoIHRoZSBsYXN0IG9uZXMuCglpZiAocnVubGVuZ3RoKSB7CgkJeC0+c3RhdHVzID0geC0+Y29w eShzdGFydF9wZm4sIHJ1bmxlbmd0aCwKCQkJCSAgICB4LT5ibGFja291dCwgeC0+Y29udGV4dCk7 CgkJaWYgKHgtPnN0YXR1cyAhPSBGT1NJTF9FUlJfT0spIHsKCQkJcHJpbnRrKCIlczogJWRcbiIs IF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwoJCQlyZXR1cm47CgkJfQoJfQp9CgpzdGF0aWMgdm9p ZCBlbmFibGVfdHJhY2tpbmcodm9pZCkKewoJLy8gaW5pdGlhbGl6ZSB0cmFja2luZyBzdHJ1Y3R1 cmUKCWF0b21pY19zZXQoJm1tX3RyYWNraW5nX3N0cnVjdC5jb3VudCwgMCk7CgltZW1zZXQobW1f dHJhY2tpbmdfc3RydWN0LnZlY3RvciwgMCwgbW1fdHJhY2tpbmdfc3RydWN0LmJpdGNudC84KTsK CiAgICAgICAgLy8gdHVybiBvbiB0cmFja2luZwogICAgICAgIG1tX3RyYWNraW5nX3N0cnVjdC5h Y3RpdmUgPSAxOwp9CgpzdGF0aWMgdm9pZCBkaXNhYmxlX3RyYWNraW5nKHZvaWQpCnsKCS8vIHR1 cm4gb2ZmIHRyYWNraW5nCgltbV90cmFja2luZ19zdHJ1Y3QuYWN0aXZlID0gMDsKfQoKLyoKICog RGlmZmVyZW5jZSBvciB6ZXJvCiAqCiAqICBkIDwtICh4IC0geSksIHggPj0geQogKgkgICAgMAks IHggPCB5CiAqLwp1bnNpZ25lZCBsb25nCmRveih1bnNpZ25lZCBsb25nIHgsIHVuc2lnbmVkIGxv bmcgeSkKewoJaWYgKHggPCB5KQoJCXJldHVybiAwOwoKCXJldHVybiB4IC0geTsKfQoKLyoKICog TWVyZ2UgY2xvc2VzdCB0d28gcmVnaW9ucyB0byBmcmVlIHVwIG9uZSBzbG90IGluIHRhYmxlLgog Ki8KaW50Cm1lcmdlKHN0cnVjdCBzeW5jZF9kYXRhICogeCkKewoJaW50IGksIGlpOwoJdW5zaWdu ZWQgbG9uZyBkZWx0YSwgbmRlbHRhOwoJdW5zaWduZWQgbG9uZyBlbmQ7Cglmb3NpbF9wYWdlX3Jh bmdlX3QgKiBjciA9IHgtPkNvcHlSYW5nZTsKCglpID0gMDsKCWlpID0gfjA7CglkZWx0YSA9IH4w VUw7CglkbyB7CgkJZW5kID0gY3JbaV0uc3RhcnQgKyBjcltpXS5udW0gLSAxOwoJCW5kZWx0YSA9 IGNyW2krMV0uc3RhcnQgLSBlbmQ7CgoJCWlmICgheC0+aXNfcGZucmFuZ2VfdmFsaWQoZW5kLCBj cltpKzFdLnN0YXJ0KSkKCQkJY29udGludWU7CgoJCWlmIChuZGVsdGEgPD0gZGVsdGEpIHsKCQkJ ZGVsdGEgPSBuZGVsdGE7CgkJCWlpID0gaTsKCQl9Cgl9IHdoaWxlIChpKysgPCAoeC0+bWF4X3Jh bmdlIC0gMSkpOwoKCWlmIChpaSA9PSB+MCkKCQlyZXR1cm4gMTsKCgljcltpaV0ubnVtID0gKGNy W2lpKzFdLnN0YXJ0ICsgY3JbaWkrMV0ubnVtKSAtIGNyW2lpXS5zdGFydDsKCgkvLyBzaGlmdCBl dmVyeW9uZSBkb3duCgl4LT5tYXhfcmFuZ2UtLTsKCWZvciAoaSA9IGlpICsgMTsgaSA8IHgtPm1h eF9yYW5nZTsgaSsrKSB7CgkJY3JbaV0uc3RhcnQgPSBjcltpKzFdLnN0YXJ0OwoJCWNyW2ldLm51 bSAgID0gY3JbaSsxXS5udW07Cgl9CgoJcmV0dXJuIDA7Cn0KCmludAppbnNlcnRfcGZuKHN0cnVj dCBzeW5jZF9kYXRhICogeCwgdW5zaWduZWQgbG9uZyBwZm4pCnsKCWludCBpOwoJaW50IGlpOwoJ Zm9zaWxfcGFnZV9yYW5nZV90ICogY3IgPSB4LT5Db3B5UmFuZ2U7CglpbnQgbmVhcmJ5ID0geC0+ bmVhcmJ5OwoKCWlmICgheC0+aXNfcGZuX3ZhbGlkKHBmbikpCgkJcmV0dXJuIDA7CiByZXN0YXJ0 OgoJZm9yIChpID0gMDsgaSA8IHgtPm1heF9yYW5nZTsgaSsrKSB7CgkJdW5zaWduZWQgbG9uZyBz dGFydCA9IGNyW2ldLnN0YXJ0OwoJCXVuc2lnbmVkIGxvbmcgbGVuICAgPSBjcltpXS5udW07CgkJ dW5zaWduZWQgbG9uZyBlbmQgICA9IHN0YXJ0ICsgbGVuIC0gMTsKCgkJLy8gaW5zaWRlIGN1cnJl bnQgcmVnaW9uCXN0YXJ0IDw9IHBmbiA8PSBlbmQKCQlpZiAoKHBmbiAtIHN0YXJ0KSA8PSAobGVu IC0gMSkpCgkJCXJldHVybiAwOwoKCQkvLyBhZGphY2VudCB0byBzdGFydAkJc3RhcnQtbmVhcmJ5 IDw9IHBmbiA8PSBzdGFydAoJCWlmICgocGZuIC0gZG96KHN0YXJ0LCBuZWFyYnkpKSA8PSBzdGFy dCAtIGRveihzdGFydCwgbmVhcmJ5KSkgewoJCQljcltpXS5udW0gICs9IChjcltpXS5zdGFydCAt IHBmbik7CgkJCWNyW2ldLnN0YXJ0ID0gcGZuOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIGFkamFj ZW50IHRvIGVuZAkJZW5kIDw9IHBmbiA8PSBlbmQrbmVhcmJ5CgkJaWYgKChwZm4gLSBlbmQpIDw9 IG5lYXJieSkgewoJCQljcltpXS5udW0gKz0gcGZuIC0gZW5kOwoJCQllbmQgKz0gcGZuIC0gZW5k OwogYWdhaW46CgkJCWlmIChpKzEgPT0geC0+bWF4X3JhbmdlKQoJCQkJcmV0dXJuIDA7CgoJCQkv LyB0aGlzIHJhbmdlIG1heSBvdmVybGFwIG9yIGFidXQgbmV4dCByYW5nZQoJCQkvLyBhZnRlciBp bnNlcnQJCShuZXh0LnN0YXJ0IC0gbmVhcmJ5KSA8PSBlbmQKCQkJaWYgKGRveihjcltpKzFdLnN0 YXJ0LCBuZWFyYnkpIDw9IGVuZCkgewoJCQkJY3JbaV0ubnVtID0gKGNyW2krMV0uc3RhcnQgKyBj cltpKzFdLm51bSkKCQkJCQktIGNyW2ldLnN0YXJ0OwoJCQkJZW5kID0gY3JbaV0uc3RhcnQgKyBj cltpXS5udW0gLSAxOwoKCQkJCS8vIHNoaWZ0IGV2ZXJ5b25lIGRvd24KCQkJCXgtPm1heF9yYW5n ZS0tOwoJCQkJZm9yIChpaSA9IGkgKyAxOyBpaSA8IHgtPm1heF9yYW5nZTsgaWkrKykgewoJCQkJ CWNyW2lpXS5zdGFydCA9IGNyW2lpKzFdLnN0YXJ0OwoJCQkJCWNyW2lpXS5udW0gICA9IGNyW2lp KzFdLm51bTsKCQkJCX0KCQkJCWdvdG8gYWdhaW47CgkJCX0KCgkJCXJldHVybiAwOwoJCX0KCgkJ Ly8gYmVmb3JlIHJlZ2lvbglwZm4gPCBzdGFydC1uZWFyYnkJLSBPUiAtCgkJLy8JCQkhYXQgZW5k IG9mIGFycmF5CS0gQU5EIC0KCQkvLyBiZXR3ZWVuIHJlZ2lvbnMJZW5kK25lYXJieSA8IHBmbiA8 IG5leHQuc3RhcnQtbmVhcmJ5CgkJaWYgKChwZm4gPCBkb3ooc3RhcnQsIG5lYXJieSkpIHx8CgkJ CSgoaSsxID09IHgtPm1heF9yYW5nZSkgJiYKCQkJKChlbmQrbmVhcmJ5IDwgcGZuKSAmJgoJCQkg KHBmbiA8IGRveihjcltpKzFdLnN0YXJ0LCBuZWFyYnkpKSkpKSB7CgkJCWlmICh4LT5tYXhfcmFu Z2UgPT0gTUFYX0NPUFlSQU5HRSkgewoJCQkJaWYgKG1lcmdlKHgpKQoJCQkJCXJldHVybiAxOwoJ CQkJZ290byByZXN0YXJ0OwoJCQl9CgkJCS8vIHNoaWZ0IGV2ZXJ5b25lIHVwIHRvIG1ha2Ugcm9v bQoJCQlmb3IgKGlpID0geC0+bWF4X3JhbmdlOyBpaSA+IGk7IGlpLS0pIHsKCQkJCWNyW2lpXS5z dGFydCA9IGNyW2lpLTFdLnN0YXJ0OwoJCQkJY3JbaWldLm51bSAgID0gY3JbaWktMV0ubnVtOwoJ CQl9CgkJCWlmIChwZm4gPCBkb3ooc3RhcnQsIG5lYXJieSkpCgkJCQlpaSA9IGk7CQkvLyBiZWZv cmUgcmVnaW9uCgkJCWVsc2UKCQkJCWlpID0gaSArIDE7CS8vIGJldHdlZW4gcmVnaW9ucwoJCQlj cltpaV0uc3RhcnQgPSBwZm47CgkJCWNyW2lpXS5udW0gPSAxOwoJCQl4LT5tYXhfcmFuZ2UrKzsK CQkJcmV0dXJuIDA7CgkJfQoJfQoKCWlmICh4LT5tYXhfcmFuZ2UgPT0gTUFYX0NPUFlSQU5HRSkK CQlpZiAobWVyZ2UoeCkpCgkJCXJldHVybiAxOwoKCS8vIGFwcGVuZCB0byBhcnJheQoJY3JbeC0+ bWF4X3JhbmdlXS5zdGFydCA9IHBmbjsKCWNyW3gtPm1heF9yYW5nZV0ubnVtID0gMTsKCXgtPm1h eF9yYW5nZSsrOwoKCXJldHVybiAwOwp9CgovKgogKiB4ODZfNjQgc3RhY2tzIGFyZSBkaWZmZXJl bnQgZnJvbSBpMzg2IGluIHRoYXQgeW91IGRvbid0IGdldAogKiB0aGVyZSBieSBhZGRpbmcgMiBw YWdlcyB0byAiY3VycmVudCIuICBJbnN0ZWFkLCB3ZSdsbCBwdXQKICogYSBkdW1teSB2YXJpYWJs ZSBvbiB0aGUgc3RhY2sgYW5kIGxvb2sgYXQgaXRzIGFkZHJlc3MuCiAqLwpzdGF0aWMgaW50IGFk ZF9zdGFja19wYWdlcyhzdHJ1Y3Qgc3luY2RfZGF0YSAqIHgpIHsKCXVuc2lnbmVkIGxvbmcgZHVt bXk7Cgl1bnNpZ25lZCBsb25nICpzdGFjayA9ICZkdW1teTsKCXVuc2lnbmVkIGxvbmcgcGZuLCBu dW1fcGZuczsKCWludCByYyA9IDA7CgoJdW5zaWduZWQgbG9uZyBpOwoJcGZuID0gKHVuc2lnbmVk IGxvbmcpKHZpcnRfdG9fcGh5cyhzdGFjaykgJiB+KFRIUkVBRF9TSVpFIC0gMSkpOwoJcGZuID4+ PSBQQUdFX1NISUZUOwoJbnVtX3BmbnMgPSAoVEhSRUFEX1NJWkUgKyAoUEFHRV9TSVpFIC0gMSkp ID4+IFBBR0VfU0hJRlQ7CgoJZm9yIChpID0gMDsgaSA8IG51bV9wZm5zOyBpKyssIHBmbisrKSB7 CgkJcmMgPSBpbnNlcnRfcGZuKHgsIHBmbik7CgkJaWYgKHJjKQoJCQlyZXR1cm4gcmM7Cgl9CgoJ cmV0dXJuIDA7Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGZuKHZvaWQgKmFkZHIp IHsKCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHZpcnRfdG9fcGh5cyhhZGRyKTsKCXJldHVybiBwaHlz ID4+IFBBR0VfU0hJRlQ7Cn0KCi8qCiAqIGZ0bW9kIGRpcnRpZXMgYSBwYWdlIGZvciBPU19ERUJV RyBwcmludHMgKHJpbmdidWZmZXIpLgogKiBQcm92aWRlIHRoYXQgcGFnZSBoZXJlLCBzbyB3ZSBj YW4gdHJhY2sgaXQsIGFzIGl0IHdpbGwgYmUKICogZGlydGllZCBvbiB0aGUgd2F5IHRvIHRoZSBz eW5jIHBvaW50LgogKi8Kdm9pZCAqZm9zaWxfc2NyYXRjaF9wYWdlOwpFWFBPUlRfU1lNQk9MX0dQ TChmb3NpbF9zY3JhdGNoX3BhZ2UpOwpzdGF0aWMgc3BpbmxvY2tfdCAqZm9zaWxfc2NyYXRjaF9s b2NrOwpFWFBPUlRfU1lNQk9MX0dQTChmb3NpbF9zY3JhdGNoX2xvY2spOwoKCi8qCiAqIFdpdGgg YSBmdW5kYW1lbnRhbCBrbm93bGVkZ2Ugb2Ygd2hhdCBhYnNvbHV0ZWx5IE1VU1QgYmUgY29waWVk CiAqIGJ5IHRoZSBIT1NUIGR1cmluZyBibGFja291dCwgYWRkIHBmbidzIHRvIHRoZSBjb3B5IHJh bmdlIGxpc3QuCiAqCiAqIEFsbCBwYWdlIHRhYmxlcyBhcmUgYWRkZWQgdG8gYXZvaWQgaGF2aW5n IHRvIGRlYWwgd2l0aCBvcHRpbWl6aW5nCiAqIHdoaWNoIHB0ZXMgbWlnaHQgYmUgc2V0IGRpcnR5 IG9yIGFjY2Vzc2VkIGJ5IHRoZSBsYXN0IGZldyBvcGVyYXRpb25zCiAqIGJlZm9yZSBibGFja291 dC4KICoKICogQWZ0ZXIgcGFnZSB0YWJsZXMsIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhZ2VzIGFy ZSBvdXIga25vd24gIndvcmtpbmcKICogc2V0Ii4gIFRoaXMgaW5jbHVkZXMgdGhlIHN0YWNrIGZy YW1lcyBmb3IgdGhpcyB0YXNrIGFuZCBwcm9jZXNzb3IgYW5kCiAqIHRoZSBzeW5jZCBzdHJ1Y3R1 cmUgKHdoaWNoIHdlIGFyZSBtYWtpbmcgZGlydHkgYnkgY29tcGlsaW5nIHRoaXMgbGlzdCkuCiAq CiAqIEZpbmFsbHksIGFsbCBwYWdlcyBtYXJrZWQgYXMgZGlydHkgaW4gdGhlaXIgcHRlJ3MgYXJl IGFkZGVkIHRvIHRoZQogKiBsaXN0LiAgVGhlc2UgYXJlIHBhZ2VzIHdoaWNoIGVzY2FwZWQgdGhl IGhhcnZlc3QvcHJvY2VzcyBjeWNsZXMgYW5kCiAqIHdlcmUgcHJlc3VtYWJseSBkaXJ0aWVkIGJl dHdlZW4gaGFydmVzdCBhbmQgaGVyZS4KICovCnN0YXRpYyBpbnQgc2V0dXBfYmxhY2tvdXRfY29w eWxpc3Qoc3RydWN0IHN5bmNkX2RhdGEgKiB4KQp7CglwZ2RfdCAqcGdkOwoKCWludCBpLCBqLCBr OwoJaW50IG47CgoJeC0+bWF4X3JhbmdlID0gMDsKCglwZ2QgPSBnZXRfcGdkKDApOwoKCWlmICgh cGdkKSB7CgkJcHJpbnRrKCIlczogbm8gcGdkP1xuIiwgX19mdW5jX18pOwoJCXJldHVybiBGT1NJ TF9FUlJfTUVSR0VfRkFJTDsKCX0KCglpZiAoaW5zZXJ0X3Bmbih4LCB2aXJ0X3RvX3BmbihwZ2Qp KSkKCQlyZXR1cm4gRk9TSUxfRVJSX01FUkdFX0ZBSUw7CgoJZm9yIChuID0gMDsgbiA8IFBUUlNf UEVSX1BHRDsgbisrLCBwZ2QrKykgewoKCQlwdWRfdCAqcHVkOwoKCQlpZiAocGdkX25vbmUoKnBn ZCkgfHwgIXBnZF9wcmVzZW50KCpwZ2QpKQoJCQljb250aW51ZTsKCgkJcHVkID0gcHVkX29mZnNl dChwZ2QsIDApOwoKCQlpZiAoaW5zZXJ0X3Bmbih4LCB2aXJ0X3RvX3BmbihwdWQpKSkKCQkJcmV0 dXJuIEZPU0lMX0VSUl9NRVJHRV9GQUlMOwoKCQlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUFVE OyBpKyssIHB1ZCsrKSB7CgoJCQlwbWRfdCAqcG1kOwoKCQkJaWYgKHB1ZF9ub25lKCpwdWQpIHx8 ICFwdWRfcHJlc2VudCgqcHVkKSkKCQkJCWNvbnRpbnVlOwoKCQkJcG1kID0gcG1kX29mZnNldChw dWQsIDApOwoKCQkJaWYgKGluc2VydF9wZm4oeCwgdmlydF90b19wZm4ocG1kKSkpCgkJCQlyZXR1 cm4gRk9TSUxfRVJSX01FUkdFX0ZBSUw7CgoJCQlmb3IgKGogPSAwOyBqIDwgUFRSU19QRVJfUE1E OyBqKyssIHBtZCsrKSB7CgoJCQkJcHRlX3QgKnB0ZTsKCgkJCQlpZiAocG1kX25vbmUoKnBtZCkg fHwgIXBtZF9wcmVzZW50KCpwbWQpKQoJCQkJCWNvbnRpbnVlOwoKCQkJCWlmIChwbWRfbGFyZ2Uo KnBtZCkpIHsKCQkJCQkvKiBTa2lwIGl0IGlmIGl0IGNvdmVycyBhbiBpbnZhbGlkIGFyZWEgKi8K CQkJCQlpZiAoIXgtPmlzX3Bmbl92YWxpZChwbWRfcGZuKCpwbWQpKSkKCQkJCQkJY29udGludWU7 CgoJCQkJCWlmICgocG1kX3ZhbCgqcG1kKSAmIF9QQUdFX0RJUlRZKSkgewoJCQkJCQl1bnNpZ25l ZCBsb25nIHAsIHBmbiA9IHBtZF9wZm4oKnBtZCk7CgkJCQkJCWZvciAocCA9IDA7IHAgPCAweDIw MDsgcCsrKSB7CgkJCQkJCQlpZiAoaW5zZXJ0X3Bmbih4LCBwZm4gKyBwKSkKCQkJCQkJCQlyZXR1 cm4gRk9TSUxfRVJSX01FUkdFX0ZBSUw7CgkJCQkJCX0JCgkJCQkJfQoJCQkJCWNvbnRpbnVlOwoJ CQkJfQoKCQkJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCk7CgoJCQkJaWYgKGluc2Vy dF9wZm4oeCwgdmlydF90b19wZm4ocHRlKSkpCgkJCQkJcmV0dXJuIEZPU0lMX0VSUl9NRVJHRV9G QUlMOwoKCQkJCWZvciAoayA9IDA7IGsgPCBQVFJTX1BFUl9QVEU7IGsrKywgcHRlKyspIHsKCgkJ CQkJaWYgKHB0ZV9ub25lKCpwdGUpIHx8ICFwdGVfcHJlc2VudCgqcHRlKSkKCQkJCQkJY29udGlu dWU7CgoJCQkJCS8qIFNraXAgaXQgaWYgaXQgY292ZXJzIGFuIGludmFsaWQgYXJlYSAqLwoJCQkJ CWlmICgheC0+aXNfcGZuX3ZhbGlkKHB0ZV9wZm4oKnB0ZSkpKQoJCQkJCQljb250aW51ZTsKCgkJ CQkJaWYgKHB0ZV92YWwoKnB0ZSkgJiBfUEFHRV9ESVJUWSkgewoJCQkJCQlpZiAoaW5zZXJ0X3Bm bih4LCBwdGVfcGZuKCpwdGUpKSkKCQkJCQkJCXJldHVybiBGT1NJTF9FUlJfTUVSR0VfRkFJTDsK CQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gY29weSB0aGUgc3RhY2sgd2UgYXJlIHdvcmtp bmcgZnJvbSAKCWlmIChhZGRfc3RhY2tfcGFnZXMoeCkpCgkJcmV0dXJuIEZPU0lMX0VSUl9NRVJH RV9GQUlMOwoKCS8vIGFkZCBzeW5jZCBzdHJ1Y3R1cmUKCWlmIChpbnNlcnRfcGZuKHgsIHZpcnRf dG9fcGZuKHgpKSkKCQlyZXR1cm4gRk9TSUxfRVJSX01FUkdFX0ZBSUw7CgoJLy8gYWRkIG1tX3Ry YWNraW5nX3N0cnVjdCAoZGlzYWJsZV90cmFja2luZygpIGRpcnRpZWQgaXQpLgoJaWYgKGluc2Vy dF9wZm4oeCwgdmlydF90b19wZm4oJm1tX3RyYWNraW5nX3N0cnVjdCkpKQoJCXJldHVybiBGT1NJ TF9FUlJfTUVSR0VfRkFJTDsKCgkvLyBhZGQgdGhlIHNjcmF0Y2ggcGFnZSwgaW4gY2FzZSBmdG1v ZCB3YW50cyB0byBkaXJ0eSBpdCBvbiB0aGUgd2F5IHRvIHN5bmMuCglpZiAoaW5zZXJ0X3Bmbih4 LCB2aXJ0X3RvX3Bmbihmb3NpbF9zY3JhdGNoX3BhZ2UpKSkKCQlyZXR1cm4gRk9TSUxfRVJSX01F UkdFX0ZBSUw7CgoJaWYgKGluc2VydF9wZm4oeCwgdmlydF90b19wZm4oZm9zaWxfc2NyYXRjaF9s b2NrKSkpCgkJcmV0dXJuIEZPU0lMX0VSUl9NRVJHRV9GQUlMOwoKCXJldHVybiBGT1NJTF9FUlJf T0s7Cn0KCnN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkgZG9fYmxhY2tv dXQodm9pZCAqIGFyZykKewoJc3RydWN0IHN5bmNkX2RhdGEgKiB4ID0gKHN0cnVjdCBzeW5jZF9k YXRhICopIGFyZzsKCWZvc2lsX3BhZ2VfcmFuZ2VfdCByYW5nZXNbMV0gPSB7ezAsIH4wfX07CgoJ eC0+c3RhdHVzID0geC0+c3luYygxLCByYW5nZXMsICZ4LT5kdXJhdGlvbl9pbl9tcywgeC0+Y29u dGV4dCk7Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIGhhcnZlc3Qodm9pZCAqIGFyZykKewojaWZk ZWYgU01QX0hBUlZFU1QKCXN0cnVjdCBzeW5jZF9kYXRhICogeCA9IChzdHJ1Y3Qgc3luY2RfZGF0 YSAqKSBhcmc7CiNlbHNlCglpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApCgkJcmV0dXJuIDA7 CiNlbmRpZgoKCWhhcnZlc3RfdXNlcigpOwoKI2lmZGVmIFNNUF9IQVJWRVNUCglyZW5kZXp2b3Vz KCZ4LT5yKTsKCglpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID09IDApCgkJaGFydmVzdF9rZXJuZWwo KTsKI2Vsc2UKCWhhcnZlc3Rfa2VybmVsKCk7CiNlbmRpZgoKCXJldHVybiAwOwp9CgovKgogKiBU aGlzIGlzIHdoZXJlIGFsbCBwcm9jZXNzb3JzIGFyZSBzZW50IGZvciBibGFja291dCBwcm9jZXNz aW5nLiAgCiAqIFRoZSBkcml2aW5nIHByb2Nlc3NvciBpcyBkaXZlcnRlZCB0byB3b3JrIG9uIGhh cnZlc3QgYW5kIGlmIG5lY2Vzc2FyeQogKiBlbnRyeSB0byBDb21tb24gQ29kZSBmb3Igc3luY2hy b25pemF0aW9uLiAgQWxsIG90aGVyIHByb2Nlc3NvcnMgYXJlCiAqIHNwaW5uaW5nIGluIGEgcmVu ZGV6dm91cyBhdCB0aGUgYm90dG9tIG9mIHRoaXMgcm91dGluZSB3YWl0aW5nIGZvcgogKiB0aGUg ZHJpdmluZyBwcm9jZXNzb3IgdG8gZmluaXNoLgogKi8Kc3RhdGljIHVuc2lnbmVkIGxvbmcgYnJv d25vdXRfY3ljbGUodm9pZCAqIGFyZykKewoJc3RydWN0IHN5bmNkX2RhdGEgKiB4ID0gKHN0cnVj dCBzeW5jZF9kYXRhICopIGFyZzsKCXVuc2lnbmVkIGxvbmcgbG9uZyBiZWZvcmUsIGFmdGVyOwoJ dW5zaWduZWQgbG9uZyBkZWx0YTsKCiNpZm5kZWYgU01QX0hBUlZFU1QKCWlmIChzbXBfcHJvY2Vz c29yX2lkKCkgIT0gMCkKCQlyZXR1cm4gMDsKI2VuZGlmCgoJcmR0c2NsbChiZWZvcmUpOwoKCWhh cnZlc3RfdXNlcigpOwoKI2lmZGVmIFNNUF9IQVJWRVNUCglyZW5kZXp2b3VzKCZ4LT5yKTsKCglp ZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApCgkJcmV0dXJuIDA7CiNlbmRpZgoKCWhhcnZlc3Rf a2VybmVsKCk7CgoJeC0+Yml0Y250ID0gYXRvbWljX3JlYWQoJm1tX3RyYWNraW5nX3N0cnVjdC5j b3VudCk7CgoJaWYgKCh4LT5iaXRjbnQgPCB4LT50aHJlc2hvbGQpIHx8ICh4LT5wYXNzID09IDAp KSB7CgkJeC0+YmxhY2tvdXQgPSBJTl9CTEFDS09VVDsKCgkJZGlzYWJsZV90cmFja2luZygpOwoK CQl4LT5zdGF0dXMgPSBzZXR1cF9ibGFja291dF9jb3B5bGlzdCh4KTsKCQlpZiAoeC0+c3RhdHVz KQoJCQlyZXR1cm4gMDsKCgkJcHJvY2Vzc192ZWN0b3IoeCk7CgkJaWYgKHgtPnN0YXR1cykKCQkJ cmV0dXJuIEZPU0lMX0VSUl9DT1BZX0ZBSUw7CgoJCXJkdHNjbGwoYWZ0ZXIpOwoKCQl4LT5zdGF0 dXMgPSB4LT5zeW5jKHgtPm1heF9yYW5nZSwKCQkJCSAgICB4LT5Db3B5UmFuZ2UsCgkJCQkgICAg JngtPmR1cmF0aW9uX2luX21zLCB4LT5jb250ZXh0KTsKCQl4LT5kb25lID0gMTsKCgkJaWYgKHgt PnN0YXR1cykgewoJCQlwcmludGsoIiVzOiAlZCAoJXMpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElO RV9fLAoJCQkgICAgICAgRk9TSUxfRVJSX1NUUklORyh4LT5zdGF0dXMpKTsKCQl9CgoJCWRlbHRh ID0gYWZ0ZXIgLSBiZWZvcmU7CgkJcmV0dXJuIHgtPmR1cmF0aW9uX2luX21zICsgKGRlbHRhIC8g Y3B1X2toeik7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHJvbGxfdGltZV9mb3J3YXJk KHVuc2lnbmVkIGxvbmcgYWRqdXN0X2luX21zKQp7CiNpZiAwCS8vIEZJWE1FCglzdHJ1Y3QgdGlt ZXZhbCB0djsKCXN0cnVjdCB0aW1lc3BlYyB0czsKCglkb19nZXR0aW1lb2ZkYXkoJnR2KTsKCgl0 cy50dl9zZWMgPSB0di50dl9zZWM7Cgl0cy50dl9uc2VjID0gdHYudHZfdXNlYyArIGFkanVzdF9p bl9tcyAqIFVTRUNfUEVSX1NFQzsKCXdoaWxlKHVubGlrZWx5KHRzLnR2X25zZWMgPj0gTlNFQ19Q RVJfU0VDKSkgewoJCXRzLnR2X25zZWMgLT0gTlNFQ19QRVJfU0VDOwoJCSsrdHMudHZfc2VjOwoJ fQoJZG9fc2V0dGltZW9mZGF5KCZ0cyk7CiNlbmRpZgp9CgpzdHJ1Y3QgYmxhY2tvdXRfZGF0YSB7 CglhdG9taWNfdCByWzVdOwoJdW5zaWduZWQgaW50IG9uY3B1OwoJdW5zaWduZWQgbG9uZyAoKmZ1 bmMpKHZvaWQgKik7Cgl2b2lkICogYXJnOwp9OwoKc3RhdGljIHZvaWQgZm9zaWxfYmxhY2tvdXQo dm9pZCAqIGFyZykKewoJc3RydWN0IGJsYWNrb3V0X2RhdGEgKiB4ID0gKHN0cnVjdCBibGFja291 dF9kYXRhICopIGFyZzsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBsb25nIGxvbmcg YmVmb3JlLCBhZnRlcjsKCXVuc2lnbmVkIGxvbmcgZGVsdGEsIGFkanVzdDsKCWludCB0aGlzX2Nw dSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKCglyZW5kZXp2b3VzKCZ4LT5yWzBdKTsKCWxvY2FsX2Jo X2Rpc2FibGUoKTsKCXJlbmRlenZvdXMoJngtPnJbMV0pOwoJbG9jYWxfaXJxX3NhdmUoZmxhZ3Mp OwoJcmVuZGV6dm91cygmeC0+clsyXSk7CgoJcmR0c2NsbChiZWZvcmUpOwoJYWRqdXN0ID0geC0+ ZnVuYyh4LT5hcmcpOwoJcmR0c2NsbChhZnRlcik7CgoJaWYgKGFkanVzdCkgewoJCWRlbHRhID0g YWRqdXN0OwoJfSBlbHNlIHsKCQlkZWx0YSA9IGFmdGVyIC0gYmVmb3JlOwoJCWRlbHRhIC89IGNw dV9raHo7Cgl9CgoJcmVuZGV6dm91cygmeC0+clszXSk7CgoJaWYgKHRoaXNfY3B1ID09IHgtPm9u Y3B1KQoJCXJvbGxfdGltZV9mb3J3YXJkKGRlbHRhKTsKCglyZW5kZXp2b3VzKCZ4LT5yWzRdKTsK Cglsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cglsb2NhbF9iaF9lbmFibGUoKTsKfQoKCi8qCiAq IENhbGwgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlIGFyZ3VtZW50IGlu CiAqIGR1cmluZyBhIGJsYWNrb3V0LgogKi8Kdm9pZCBmb3NpbF9leGVjX29uYWxsKHVuc2lnbmVk IGxvbmcgKCpmdW5jKSh2b2lkICopLCB2b2lkICogYXJnKQp7CglzdHJ1Y3QgYmxhY2tvdXRfZGF0 YSB4OwoKCWluaXRfcmVuZGV6dm91cygmeC5yWzBdKTsKCWluaXRfcmVuZGV6dm91cygmeC5yWzFd KTsKCWluaXRfcmVuZGV6dm91cygmeC5yWzJdKTsKCWluaXRfcmVuZGV6dm91cygmeC5yWzNdKTsK CWluaXRfcmVuZGV6dm91cygmeC5yWzRdKTsKCXgub25jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7 Cgl4LmZ1bmMgID0gZnVuYzsKCXguYXJnICAgPSBhcmc7CgoJZm9zaWxfc3luY2Rfc3RhcnQoU1lO Q0RfT05fQUxMX1BST0NFU1NPUlMsIGZvc2lsX2JsYWNrb3V0LCAmeCwgMCk7Cglmb3NpbF9zeW5j ZF9maW5pc2goKTsKfQoKLyoKICogVGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBkcml2 aW5nIGFsbCBvZiB0aGUgbWVtb3J5CiAqIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzaW5nLiAgV2hl biBjb21wbGV0ZSB0aGUgc3luYyBmdW5jdGlvbiBzaG91bGQKICogYmUgY2FsbGVkIHRvIGVudGVy IGJsYWNrb3V0IGFuZCBmaW5hbGl6ZSBzeW5jaHJvbml6YXRpb24uCiAqLwppbnQgZm9zaWxfc3lu Y2hyb25pemVfbWVtb3J5KGNvcHlfcHJvYyBjb3B5LAoJCQkgICAgIHN5bmNfcHJvYyBzeW5jLAoJ CQkgICAgIGlzX3Bmbl92YWxpZF9wcm9jIGlzX3Bmbl92YWxpZCwKCQkJICAgICBpc19wZm5yYW5n ZV92YWxpZF9wcm9jIGlzX3BmbnJhbmdlX3ZhbGlkLAoJCQkgICAgIHVuc2lnbmVkIGludCB0aHJl c2hvbGQsCgkJCSAgICAgdW5zaWduZWQgaW50IHBhc3NlcywKCQkJICAgICB2b2lkICogY29udGV4 dCkKewoJaW50IHN0YXR1czsKCXN0cnVjdCBzeW5jZF9kYXRhICogeDsKCgl4ID0ga21hbGxvYyhz aXplb2Yoc3RydWN0IHN5bmNkX2RhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICh4ID09IE5VTEwpIHsK CQlwcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSBzeW5jZCBjb250cm9sIHN0cnVjdHVyZVxuIik7 CgkJcmV0dXJuIDE7Cgl9CgoJbWVtc2V0KHgsIDAsIHNpemVvZihzdHJ1Y3Qgc3luY2RfZGF0YSkp OwoKCXgtPmNvcHkgPSBjb3B5OwoJeC0+c3luYyA9IHN5bmM7Cgl4LT5pc19wZm5fdmFsaWQgPSBp c19wZm5fdmFsaWQ7Cgl4LT5pc19wZm5yYW5nZV92YWxpZCA9IGlzX3BmbnJhbmdlX3ZhbGlkOwoJ eC0+Yml0Y250ID0gMDsKCXgtPmJsYWNrb3V0ID0gSU5fQlJPV05PVVQ7Cgl4LT5kb25lID0gMDsK CXgtPnRocmVzaG9sZCA9IHRocmVzaG9sZDsKCXgtPmNvbnRleHQgPSBjb250ZXh0OwoJeC0+bmVh cmJ5ID0gTkVBUkJZOwoKCWZvc2lsX2V4ZWNfb25hbGwobWFwX2tlcm5lbF9zbWFsbF9wbWQsIE5V TEwpOwoKCS8vIGNsZWFuIHVwIGhhcmR3YXJlIGRpcnR5IGJpdHMKCWluaXRfcmVuZGV6dm91cygm eC0+cik7Cglmb3NpbF9leGVjX29uYWxsKGhhcnZlc3QsIHgpOwoKCWVuYWJsZV90cmFja2luZygp OwoKCS8qCgkgKiBDb3B5IGFsbCBtZW1vcnkuICBBZnRlciB0aGlzIHdlIG9ubHkgY29weSBtb2Rp ZmllZAoJICogcGFnZXMsIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSB1bmNoYW5nZWQgcGFy dHMKCSAqIGdldCBjb3BpZWQgYXQgbGVhc3Qgb25jZS4KCSAqLwoJc3RhdHVzID0geC0+Y29weSgw LCB+MCwgMCwgeC0+Y29udGV4dCk7CglpZiAoc3RhdHVzICE9IEZPU0lMX0VSUl9PSykgewoJCXBy aW50aygiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKCQlnb3RvIGZvc2lsX3N5 bmNfb3V0OwoJfQoKCWZvciAoeC0+cGFzcyA9IHBhc3NlczsgKHgtPnBhc3MgPj0gMCk7IHgtPnBh c3MtLSkgewoJCURCR1BSTlQoREJHTFZMX0JST1dOT1VULAoJCQkiYnJvd25vdXQgcGFzcyAlZCAt ICVsZCBwYWdlcyBmb3VuZCAoJWQpXG4iLAoJCQl4LT5wYXNzLCB4LT5iaXRjbnQsCgkJCWF0b21p Y19yZWFkKCZtbV90cmFja2luZ19zdHJ1Y3QuY291bnQpKTsKCgkJaW5pdF9yZW5kZXp2b3VzKCZ4 LT5yKTsKCQlmb3NpbF9leGVjX29uYWxsKGJyb3dub3V0X2N5Y2xlLCB4KTsKCQlpZiAoeC0+c3Rh dHVzKSB7CgkJCXByaW50aygiJXMoJWQpOiBicm93bm91dF9jeWNsZSBmYWlsZWQgXG4iLAoJCQkg ICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CgkJCS8vIGZsdXNoIGFueSBpbmNvbXBsZXRl IHRyYW5zYWN0aW9ucwoJCQl4LT5jb3B5KH4wLCB+MCwgMCwgeC0+Y29udGV4dCk7CgkJCWJyZWFr OwoJCX0KCQlpZiAoeC0+ZG9uZSkKCQkJYnJlYWs7CgoJCS8qIEdpdmUgYmFjayBzb21lIHRpbWUg dG8gZXZlcnlib2R5IGVsc2UgKi8KCQlzY2hlZHVsZSgpOwoKCQlwcm9jZXNzX3ZlY3Rvcih4KTsK CQlpZiAoeC0+c3RhdHVzKSB7CgkJCXByaW50aygiJXMoJWQpOiBwcm9jZXNzX3ZlY3RvciBmYWls ZWQgXG4iLAoJCQkgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CgkJCS8vIGZsdXNoIGFu eSBpbmNvbXBsZXRlIHRyYW5zYWN0aW9ucwoJCQl4LT5jb3B5KH4wLCB+MCwgMCwgeC0+Y29udGV4 dCk7CgkJCWJyZWFrOwoJCX0KCX0KCglkaXNhYmxlX3RyYWNraW5nKCk7CiNpZiAwCgl7CgkJaW50 IGk7CgkJaW50IHRvdGFsID0gMDsKCQlmb3IgKGkgPSAwOyBpIDwgeC0+bWF4X3JhbmdlOyBpKysp IHsKCQkJcHJpbnRrKCJzdGFydCAlMDhseCBudW0gJWx4KCVsZCkgZ2FwIFslbGRdXG4iLAoJCQkJ eC0+Q29weVJhbmdlW2ldLnN0YXJ0LAoJCQkJeC0+Q29weVJhbmdlW2ldLm51bSwKCQkJCXgtPkNv cHlSYW5nZVtpXS5udW0sCgkJCQkoaT09MCk/MDooeC0+Q29weVJhbmdlW2ldLnN0YXJ0IC0KCQkJ CQkgICh4LT5Db3B5UmFuZ2VbaS0xXS5zdGFydCArCgkJCQkJICAgeC0+Q29weVJhbmdlW2ktMV0u bnVtKSkpOwoJCQl0b3RhbCArPSB4LT5Db3B5UmFuZ2VbaV0ubnVtOwoJCX0KCQlwcmludGsoIm1h eCByYW5nZSAlZCB0b3RhbCBwYWdlcyAlZFxuIiwKCQkJeC0+bWF4X3JhbmdlLCB0b3RhbCk7Cgl9 CiNlbmRpZgoJREJHUFJOVChEQkdMVkxfQlJPV05PVVQsICJsYXN0IHBhc3MgZm91bmQgJWxkIHBh Z2VzXG4iLCB4LT5iaXRjbnQpOwoJREJHUFJOVChEQkdMVkxfQlJPV05PVVQsICJjb3B5IHJhbmdl IG1heCAlZFxuIiwgeC0+bWF4X3JhbmdlKTsKCglzdGF0dXMgPSB4LT5zdGF0dXM7Cgpmb3NpbF9z eW5jX291dDoKCglrZnJlZSh4KTsKCglmb3NpbF9leGVjX29uYWxsKG1hcF9rZXJuZWxfb3JpZ19w bWQsIE5VTEwpOwoKCXJldHVybiBzdGF0dXM7Cn0KRVhQT1JUX1NZTUJPTChmb3NpbF9zeW5jaHJv bml6ZV9tZW1vcnkpOwoKI2lmZGVmIFJFUExBQ0VfS0VSTl9GVU5DUwpzdGF0aWMgdm9pZCAoKm9y aWdfdHJhY2tfcG1kKSh2b2lkICopOwoKc3RhdGljIGludCBjaGVja19vbGRfcHRlcyhwbWRfdCAq cG1kLCBpbnQgKnVfY291bnQsIGludCAqa19jb3VudCkgewoJaW50IGksIGxvc3RfcHRlID0gMDsK CXVuc2lnbmVkIGxvbmcgcGZuOwoJcHRlX3QgKnB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwg MCk7CgoJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BURTsgaSsrLCBwdGUrKykgewoJCWlmIChw dGVfbm9uZSgqcHRlKSB8fCAhcHRlX3ByZXNlbnQoKnB0ZSkpCgkJCWNvbnRpbnVlOwoKCQlwZm4g PSBwdGVfcGZuKCpwdGUpOwoJCQoJCWlmIChwZm4gPj0gbW1fdHJhY2tpbmdfc3RydWN0LmJpdGNu dCkKCQkJY29udGludWU7CgoJCWlmICghdGVzdF9hbmRfc2V0X2JpdChwZm4sIG1tX3RyYWNraW5n X3N0cnVjdC52ZWN0b3IpKSB7CgkJCWlmIChwdGVfdmFsKCpwdGUpICYgX1BBR0VfVVNFUikKCQkJ CSgqdV9jb3VudCkrKzsKCQkJZWxzZQoJCQkJKCprX2NvdW50KSsrOwoJCQlhdG9taWNfaW5jKCZt bV90cmFja2luZ19zdHJ1Y3QuY291bnQpOwoJCQlsb3N0X3B0ZSsrOwoJCX0KCX0KCglyZXR1cm4g bG9zdF9wdGU7Cn0KCnN0YXRpYyB2b2lkIGZvc2lsX3RyYWNrX3BtZCh2b2lkICogdmFsKSB7Cglw bWRfdCAqcG1kID0gKHBtZF90Kil2YWw7CglpbnQgdV9jb3VudCA9IDAsIGtfY291bnQgPSAwOwoK CWlmIChwbWRfbGFyZ2UoKnBtZCkpIHsKCQlvcmlnX3RyYWNrX3BtZCh2YWwpOwoJCXJldHVybjsK CX0KCgljaGVja19vbGRfcHRlcyhwbWQsICZ1X2NvdW50LCAma19jb3VudCk7CgoJb3JpZ190cmFj a19wbWQodmFsKTsKfQojZW5kaWYKCmludCBfX2luaXQgZm9zaWxfaGFydmVzdF9pbml0KHZvaWQp CnsKCWV4dGVybiB1bnNpZ25lZCBsb25nIG51bV9waHlzcGFnZXM7CgojaWZkZWYgVVNFX1NNQUxM X1BNRAoJaWYgKHNtYWxsX3BtZF9pbml0KCkpCgkJZ290byBvdXRfc21hbGxfcG1kOwojZW5kaWYK CiNpZmRlZiBSRVBMQUNFX0tFUk5fRlVOQ1MKCW9yaWdfdHJhY2tfcG1kID0gZG9fbW1fdHJhY2tf cG1kOwoJZG9fbW1fdHJhY2tfcG1kID0gZm9zaWxfdHJhY2tfcG1kOwojZW5kaWYKCgltbV90cmFj a2luZ19zdHJ1Y3QudmVjdG9yID0gdm1hbGxvYyhudW1fcGh5c3BhZ2VzLzgpOwoJbW1fdHJhY2tp bmdfc3RydWN0LmJpdGNudCA9IG51bV9waHlzcGFnZXM7CgoJaWYgKG1tX3RyYWNraW5nX3N0cnVj dC52ZWN0b3IgPT0gTlVMTCkgewoJCXByaW50aygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1v cnkgdHJhY2tpbmcgYml0bWFwXG4iLAoJCSAgICAgICBfX0ZVTkNUSU9OX18pOwoJCWdvdG8gb3V0 X25vX21tX3RyYWNrOwoJfQoKCWZvc2lsX3NjcmF0Y2hfcGFnZSA9ICh2b2lkKilfX2dldF9mcmVl X3BhZ2VzKEdGUF9LRVJORUwsIDApOwoJaWYgKCFmb3NpbF9zY3JhdGNoX3BhZ2UpCgkJZ290byBv dXRfbm9fZnNwOwoKCWZvc2lsX3NjcmF0Y2hfbG9jayA9IChzcGlubG9ja190KilrbWFsbG9jKHNp emVvZihzcGlubG9ja190KSwgR0ZQX0tFUk5FTCk7CglpZiAoIWZvc2lsX3NjcmF0Y2hfbG9jaykK CQlnb3RvIG91dF9ub19mc2w7CgoJc3Bpbl9sb2NrX2luaXQoZm9zaWxfc2NyYXRjaF9sb2NrKTsK CglyZXR1cm4gMDsKCm91dF9ub19mc2w6CglmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWZvc2ls X3NjcmF0Y2hfcGFnZSwgMCk7Cm91dF9ub19mc3A6Cgl2ZnJlZShtbV90cmFja2luZ19zdHJ1Y3Qu dmVjdG9yKTsKb3V0X25vX21tX3RyYWNrOgojaWZkZWYgVVNFX1NNQUxMX1BNRAoJc21hbGxfcG1k X2V4aXQoKTsKb3V0X3NtYWxsX3BtZDoKI2VuZGlmCglyZXR1cm4gLUVOT01FTTsKfQoKdm9pZCBf X2V4aXQgZm9zaWxfaGFydmVzdF9jbGVhbnVwKHZvaWQpCnsKI2lmZGVmIFVTRV9TTUFMTF9QTUQK CXNtYWxsX3BtZF9leGl0KCk7CiNlbmRpZgoKI2lmZGVmIFJFUExBQ0VfS0VSTl9GVU5DUwoJZG9f bW1fdHJhY2tfcG1kID0gb3JpZ190cmFja19wbWQ7CiNlbmRpZgoKCS8vIG1ha2Ugc3VyZSB0cmFj a2luZyBpcyBkZWZpbml0ZWx5IHR1cm5lZCBvZmYKCWRpc2FibGVfdHJhY2tpbmcoKTsKCgkvLyB3 YWtlIG1lIGFmdGVyIGV2ZXJ5b25lIGlzIHN1cmUgdG8gYmUgZG9uZSB3aXRoIG1tX3RyYWNrKCkK CXN5bmNocm9uaXplX3NjaGVkKCk7CgoJaWYgKG1tX3RyYWNraW5nX3N0cnVjdC52ZWN0b3IpCgkJ dmZyZWUobW1fdHJhY2tpbmdfc3RydWN0LnZlY3Rvcik7CgoJaWYgKGZvc2lsX3NjcmF0Y2hfcGFn ZSkKCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWZvc2lsX3NjcmF0Y2hfcGFnZSwgMCk7CgoJ aWYgKGZvc2lsX3NjcmF0Y2hfbG9jaykKCQlrZnJlZShmb3NpbF9zY3JhdGNoX2xvY2spOwoKCW1t X3RyYWNraW5nX3N0cnVjdC5iaXRjbnQgPSAwOwoKCXJldHVybjsKfQoKI2Vsc2UgLyogQ09ORklH X1RSQUNLX0RJUlRZX1BBR0VTICovCgoKaW50IF9faW5pdCBmb3NpbF9oYXJ2ZXN0X2luaXQodm9p ZCkKewoJcmV0dXJuIDA7Cn0KCnZvaWQgX19leGl0IGZvc2lsX2hhcnZlc3RfY2xlYW51cCh2b2lk KQp7CglyZXR1cm47Cn0KCiNlbmRpZiAvKiBDT05GSUdfVFJBQ0tfRElSVFlfUEFHRVMgKi8KCg== ------=_Part_4317_323804.1157481519037--