Date: Sat, 31 Jul 2010 05:17:36 +0530 From: "Jayachandran C." <c.jayachandran@gmail.com> To: Juli Mallett <jmallett@freebsd.org> Cc: freebsd-mips@freebsd.org Subject: Re: Support for 64bit userspace. Message-ID: <AANLkTin4eNd4KGfWPKXKLDHyuFZs0a3pdVoeW_qA-e0P@mail.gmail.com> In-Reply-To: <AANLkTinz-Gs-iojO9PYS%2BV3Qr-TPSfWhKCwnX9XN_rbq@mail.gmail.com> References: <AANLkTikZKS8iuST1dp5yfo6P6kaif4b1YzsKAskk_wB=@mail.gmail.com> <AANLkTinXdCLinp=07dsPYs3qr7nWJ6nZzKF5DV=z1R59@mail.gmail.com> <AANLkTinwi7v3wANCd5EGA9GHuWUrnAEP3Rq6EedGpGKe@mail.gmail.com> <20100729.131134.4959786895411328.imp@bsdimp.com> <AANLkTimOM-LmBChHPgU%2Bqa7Q_YFwc5ZYv7JkOfiV3FDU@mail.gmail.com> <AANLkTinz-Gs-iojO9PYS%2BV3Qr-TPSfWhKCwnX9XN_rbq@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--0016364166e9bf4987048ca37966 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On Fri, Jul 30, 2010 at 2:07 PM, Juli Mallett <jmallett@freebsd.org> wrote: > On Fri, Jul 30, 2010 at 01:15, Jayachandran C. <c.jayachandran@gmail.com> > wrote: > > I will look at merging them without too many ifdefs. Another > > possibility is to have a pmap.c, pmap32.c and pmap64.c, so that the > > common code is not duplicated, but that too (as far as I can see) will > > require a config option. > > I'm not really sure what the aversion to ifdefs is =97 they kind of come > with the territory and this is exactly the part of the system where > you expect to have them to conditionalize exactly this kind of > behavior. If you were going to split out some subroutines for 32-bit > and 64-bit, there are two ways you can do it without a config option > (and I agree with you that avoiding one is very desirable =97 we already > use too many knobs to get the right ABI in kernel configs). You could > do: > > #ifndef __mips_n64 > #include "pmap32.c" > #else > #include "pmap64.c" > #endif > > Or you could wrap the whole 32/64 files (modulo a "struct __hack;" or > whatever to avoid an empty translation unit) with ifdefs. > > Personally, I find having two implementations of a function a lot > harder to read and keep track of than a single implementation with > ifdefs in the body =97 there's very few places in the kernel where we do > the former. If you do split out functions into separate files I would > beg you to only split out the really big functions that are actually > doing things based on different levels of page tables and then it's > obvious why those things have two implementations and what needs to be > abstracted to merge them. Having two copies of trivial functions or > non-trivial functions that are mostly identical is a bad thing. > > You're doing the work, so at some point it's kind of your call, but I > feel like you're making style changes to things that I cleaned up and > tried to unify in pmap.c and that the way that they're done is pretty > significant given how intimidating people find pmap. If we were going > to support different kinds of MMUs (e.g. adding support for BAT-based > MMUs) I'd be in favor of splitting things up, but then I'd want to > follow PowerPC's lead. For now I think the appropriate thing to do is > to follow the lead of my 64-bit work in the MIPS pmap and the PAE work > in the i386 pmap and to use ifdefs and to try to abstract out the > page-table differences. > I had not looked at merging the files so far (mostly because it was easier to do it this way), so I will see how best this can be done. I'm really thrilled with the work you're doing and can't wait for it > to be in head =97 I'm quite eager to move everything on Octeon to n64 :) > I have checked in everything except the page table implementation code. If you like to try the current code, the attached patch has the rest of the changes. This has a few more issues fixed, n64 mostly works for me, except a csh crash I'm looking at. I'll have a look at merging pmap.c with pmap64.c, and have another look at the PAE. JC. --0016364166e9bf4987048ca37966 Content-Type: application/octet-stream; name="mips-3lvl-pt.patch" Content-Disposition: attachment; filename="mips-3lvl-pt.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gc9o4ist0 SW5kZXg6IHN5cy9jb25mL29wdGlvbnMubWlwcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvY29uZi9vcHRp b25zLm1pcHMJKHJldmlzaW9uIDIxMDYwMSkKKysrIHN5cy9jb25mL29wdGlvbnMubWlwcwkod29y a2luZyBjb3B5KQpAQCAtNTMsNiArNTMsOSBAQAogVEFSR0VUX0VNVUxBVE9SCW9wdF9kZGIuaAog VEFSR0VUX1hMUl9YTFMgIG9wdF9nbG9iYWwuaAogCitLRVJORUxfNjQJb3B0X2dsb2JhbC5oCitL RVJORUxfMzIJb3B0X2dsb2JhbC5oCisKIFRJQ0tfVVNFX1lBTU9OX0ZSRVEJb3B0X2dsb2JhbC5o CiBUSUNLX1VTRV9NQUxUQV9SVEMJb3B0X2dsb2JhbC5oCiAKSW5kZXg6IHN5cy9jb25mL2ZpbGVz Lm1pcHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gc3lzL2NvbmYvZmlsZXMubWlwcwkocmV2aXNpb24gMjEwNjAx KQorKysgc3lzL2NvbmYvZmlsZXMubWlwcwkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsOCBA QAogbWlwcy9taXBzL2V4Y2VwdGlvbi5TCQlzdGFuZGFyZAogbWlwcy9taXBzL2dkYl9tYWNoZGVw LmMJCXN0YW5kYXJkCiAjIG1pcHMvbWlwcy9tYWluYnVzLmMJCXN0YW5kYXJkCi1taXBzL21pcHMv cG1hcC5jCQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJb3B0aW9uYWwga2VybmVsXzMyCitt aXBzL21pcHMvcG1hcDY0LmMJCW9wdGlvbmFsIGtlcm5lbF82NAogbWlwcy9taXBzL3RyYXAuYwkJ c3RhbmRhcmQKIG1pcHMvbWlwcy92bV9tYWNoZGVwLmMJCXN0YW5kYXJkCiAjIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KSW5kZXg6IHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlw cy9pbmNsdWRlL3BhcmFtLmgJKHJldmlzaW9uIDIxMDYyNykKKysrIHN5cy9taXBzL2luY2x1ZGUv cGFyYW0uaAkod29ya2luZyBjb3B5KQpAQCAtMTA3LDggKzEwNywxNiBAQAogI2RlZmluZQlOUFRF UEcJCShQQUdFX1NJWkUvKHNpemVvZiAocHRfZW50cnlfdCkpKQogI2RlZmluZQlOUERFUEcJCShQ QUdFX1NJWkUvKHNpemVvZiAocGRfZW50cnlfdCkpKQogCisjaWYgZGVmaW5lZChfX21pcHNfbjY0 KQorI2RlZmluZQlTRUdTSElGVAkzMQkJLyogTE9HMihOQlNFRykgKi8KKyNkZWZpbmUJTkJTRUcJ CSgxdWwgPDwgU0VHU0hJRlQpCS8qIGJ5dGVzL3NlZ21lbnQgKi8KKyNlbHNlCiAjZGVmaW5lCVNF R1NISUZUCTIyCQkvKiBMT0cyKE5CU0VHKSAqLwogI2RlZmluZQlOQlNFRwkJKDEgPDwgU0VHU0hJ RlQpCS8qIGJ5dGVzL3NlZ21lbnQgKi8KKyNlbmRpZgorI2RlZmluZQlQRFJTSElGVAkyMiAgICAg ICAgICAgICAgLyogb25seSB1c2VkIGluIG42NCAqLworI2RlZmluZQlQRFJNQVNLCQkoKDEgPDwg UERSU0hJRlQpIC0gMSkKKyNkZWZpbmUJTkJQRFIJCSgxIDw8IFBEUlNISUZUKQkvKiBieXRlcy9w YWdlZGlyICovCiAjZGVmaW5lCVNFR01BU0sJCShOQlNFRy0xKQkvKiBieXRlIG9mZnNldCBpbnRv IHNlZ21lbnQgKi8KIAogI2RlZmluZQlNQVhQQUdFU0laRVMJMQkJLyogbWF4aW11bSBudW1iZXIg b2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgKi8KSW5kZXg6IHN5cy9taXBzL2NvbmYvWExSNjQKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL21pcHMvY29uZi9YTFI2NAkocmV2aXNpb24gMjEwNjAxKQorKysgc3lz L21pcHMvY29uZi9YTFI2NAkod29ya2luZyBjb3B5KQpAQCAtMjUsNiArMjUsOCBAQAogbWFrZW9w dGlvbnMgICAgIFRBUkdFVF9CSUdfRU5ESUFOCiAKIGluY2x1ZGUJCSIuLi9ybWkvc3RkLnhsciIK K25vb3B0aW9uCUtFUk5FTF8zMgorb3B0aW9ucwkJS0VSTkVMXzY0CiAKIG1ha2VvcHRpb25zCURF QlVHPS1nCQkjIEJ1aWxkIGtlcm5lbCB3aXRoIGdkYigxKSBkZWJ1ZyBzeW1ib2xzCiBtYWtlb3B0 aW9ucwlBUkNIX0ZMQUdTPSItbWFyY2g9bWlwczY0IC1tYWJpPTY0IgpJbmRleDogc3lzL21pcHMv Y29uZi9ERUZBVUxUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9jb25mL0RFRkFVTFRTCShyZXZp c2lvbiAyMTA2MDEpCisrKyBzeXMvbWlwcy9jb25mL0RFRkFVTFRTCSh3b3JraW5nIGNvcHkpCkBA IC0xMSwzICsxMSw0IEBACiAKIG9wdGlvbnMgCUdFT01fUEFSVF9CU0QKIG9wdGlvbnMgCUdFT01f UEFSVF9NQlIKK29wdGlvbnMJCUtFUk5FTF8zMgpJbmRleDogc3lzL21pcHMvbWlwcy9wbWFwNjQu Ywo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBzL3BtYXA2NC5jCShyZXZpc2lvbiAwKQorKysg c3lzL21pcHMvbWlwcy9wbWFwNjQuYwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyOTk5IEBACisv KgorICogQ29weXJpZ2h0IChjKSAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs aWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQg Sm9obiBTLiBEeXNvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykg MTk5NCBEYXZpZCBHcmVlbm1hbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz IGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5 CisgKiB0aGUgU3lzdGVtcyBQcm9ncmFtbWluZyBHcm91cCBvZiB0aGUgVW5pdmVyc2l0eSBvZiBV dGFoIENvbXB1dGVyCisgKiBTY2llbmNlIERlcGFydG1lbnQgYW5kIFdpbGxpYW0gSm9saXR6IG9m IFVVTkVUIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1l IG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICog ICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv bSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRT IEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElF RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg UkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5E SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAor ICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G IFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5E IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QK KyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF KSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgor ICoKKyAqCWZyb206CUAoIylwbWFwLmMJNy43IChCZXJrZWxleSkJNS8xMi85MQorICoJZnJvbTog c3JjL3N5cy9pMzg2L2kzODYvcG1hcC5jLHYgMS4yNTAuMi44IDIwMDAvMTEvMjEgMDA6MDk6MTQg cHMKKyAqCUpOUFI6IHBtYXAuYyx2IDEuMTEuMi4xIDIwMDcvMDgvMTYgMTE6NTE6MDYgZ2lyaXNo CisgKi8KKworLyoKKyAqCU1hbmFnZXMgcGh5c2ljYWwgYWRkcmVzcyBtYXBzLgorICoKKyAqCUlu IGFkZGl0aW9uIHRvIGhhcmR3YXJlIGFkZHJlc3MgbWFwcywgdGhpcworICoJbW9kdWxlIGlzIGNh bGxlZCB1cG9uIHRvIHByb3ZpZGUgc29mdHdhcmUtdXNlLW9ubHkKKyAqCW1hcHMgd2hpY2ggbWF5 IG9yIG1heSBub3QgYmUgc3RvcmVkIGluIHRoZSBzYW1lCisgKglmb3JtIGFzIGhhcmR3YXJlIG1h cHMuCVRoZXNlIHBzZXVkby1tYXBzIGFyZQorICoJdXNlZCB0byBzdG9yZSBpbnRlcm1lZGlhdGUg cmVzdWx0cyBmcm9tIGNvcHkKKyAqCW9wZXJhdGlvbnMgdG8gYW5kIGZyb20gYWRkcmVzcyBzcGFj ZXMuCisgKgorICoJU2luY2UgdGhlIGluZm9ybWF0aW9uIG1hbmFnZWQgYnkgdGhpcyBtb2R1bGUg aXMKKyAqCWFsc28gc3RvcmVkIGJ5IHRoZSBsb2dpY2FsIGFkZHJlc3MgbWFwcGluZyBtb2R1bGUs CisgKgl0aGlzIG1vZHVsZSBtYXkgdGhyb3cgYXdheSB2YWxpZCB2aXJ0dWFsLXRvLXBoeXNpY2Fs CisgKgltYXBwaW5ncyBhdCBhbG1vc3QgYW55IHRpbWUuICBIb3dldmVyLCBpbnZhbGlkYXRpb25z CisgKglvZiB2aXJ0dWFsLXRvLXBoeXNpY2FsIG1hcHBpbmdzIG11c3QgYmUgZG9uZSBhcworICoJ cmVxdWVzdGVkLgorICoKKyAqCUluIG9yZGVyIHRvIGNvcGUgd2l0aCBoYXJkd2FyZSBhcmNoaXRl Y3R1cmVzIHdoaWNoCisgKgltYWtlIHZpcnR1YWwtdG8tcGh5c2ljYWwgbWFwIGludmFsaWRhdGVz IGV4cGVuc2l2ZSwKKyAqCXRoaXMgbW9kdWxlIG1heSBkZWxheSBpbnZhbGlkYXRlIG9yIHJlZHVj ZWQgcHJvdGVjdGlvbgorICoJb3BlcmF0aW9ucyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBhcmUg YWN0dWFsbHkKKyAqCW5lY2Vzc2FyeS4gIFRoaXMgbW9kdWxlIGlzIGdpdmVuIGZ1bGwgaW5mb3Jt YXRpb24gYXMKKyAqCXRvIHdoaWNoIHByb2Nlc3NvcnMgYXJlIGN1cnJlbnRseSB1c2luZyB3aGlj aCBtYXBzLAorICoJYW5kIHRvIHdoZW4gcGh5c2ljYWwgbWFwcyBtdXN0IGJlIG1hZGUgY29ycmVj dC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IGhl YWQvc3lzL21pcHMvbWlwcy9wbWFwLmMgMjEwMzI3IDIwMTAtMDctMjEgMDk6Mjc6MDBaIGpjaGFu ZHJhICQiKTsKKworI2luY2x1ZGUgIm9wdF9tc2didWYuaCIKKyNpbmNsdWRlICJvcHRfZGRiLmgi CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNs dWRlIDxzeXMvcHJvYy5oPgorI2luY2x1ZGUgPHN5cy9tc2didWYuaD4KKyNpbmNsdWRlIDxzeXMv dm1tZXRlci5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3NtcC5oPgor I2lmZGVmIEREQgorI2luY2x1ZGUgPGRkYi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0v dm0uaD4KKyNpbmNsdWRlIDx2bS92bV9wYXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX3BoeXMuaD4K KyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUg PHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+CisjaW5jbHVkZSA8dm0vdm1f bWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5jbHVkZSA8dm0vdm1fZXh0ZXJu Lmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgorI2luY2x1ZGUgPHZtL3ZtX3BhZ2VyLmg+ CisjaW5jbHVkZSA8dm0vdW1hLmg+CisjaW5jbHVkZSA8c3lzL3BjcHUuaD4KKyNpbmNsdWRlIDxz eXMvc2NoZWQuaD4KKyNpZmRlZiBTTVAKKyNpbmNsdWRlIDxzeXMvc21wLmg+CisjZW5kaWYKKwor I2luY2x1ZGUgPG1hY2hpbmUvY2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgor I2luY2x1ZGUgPG1hY2hpbmUvdGxiLmg+CisKKyNpZiBkZWZpbmVkKERJQUdOT1NUSUMpCisjZGVm aW5lCVBNQVBfRElBR05PU1RJQworI2VuZGlmCisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZm5k ZWYgUE1BUF9TSFBHUEVSUFJPQworI2RlZmluZQlQTUFQX1NIUEdQRVJQUk9DIDIwMAorI2VuZGlm CisKKyNpZiAhZGVmaW5lZChQTUFQX0RJQUdOT1NUSUMpCisjZGVmaW5lCVBNQVBfSU5MSU5FIF9f aW5saW5lCisjZWxzZQorI2RlZmluZQlQTUFQX0lOTElORQorI2VuZGlmCisKKy8qCisgKiBHZXQg UERFcyBhbmQgUFRFcyBmb3IgdXNlci9rZXJuZWwgYWRkcmVzcyBzcGFjZQorICoKKyAqIFhYWCBU aGUgJiBmb3IgcG1hcF9zZWdzaGlmdCgpIGlzIHdyb25nLCBhcyBpcyB0aGUgZmFjdCB0aGF0IGl0 IGRvZXNuJ3QKKyAqICAgICB0cmltIG9mZiBncmF0dWl0b3VzIGJpdHMgb2YgdGhlIGFkZHJlc3Mg c3BhY2UuICBCeSBoYXZpbmcgdGhlICYKKyAqICAgICB0aGVyZSwgd2UgYnJlYWsgZGVmaW5pbmcg TlVTRVJQR1RCTFMgYmVsb3cgYmVjYXVzZSB0aGUgYWRkcmVzcyBzcGFjZQorICogICAgIGlzIGRl ZmluZWQgc3VjaCB0aGF0IGl0IGVuZHMgaW1tZWRpYXRlbHkgYWZ0ZXIgTlBERVBHKk5QVEVQRypQ QUdFX1NJWkUsCisgKiAgICAgc28gd2UgZW5kIHVwIGdldHRpbmcgTlVTRVJQR1RCTFMgb2YgMC4K KyAqLworCisjZGVmaW5lCXBtYXBfc2VnX2luZGV4KHYpCSgoKHYpID4+IFNFR1NISUZUKSAmIChO UERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9wZGVfaW5kZXgodikJKCgodikgPj4gUERSU0hJRlQp ICYgKE5QREVQRyAtIDEpKQorI2RlZmluZQlwbWFwX3B0ZV9pbmRleCh2KQkoKCh2KSA+PiBQQUdF X1NISUZUKSAmIChOUFRFUEcgLSAxKSkKKyNkZWZpbmUgcG1hcF9wZGVfcGluZGV4KHYpICAgICAg KCh2KSA+PiBQRFJTSElGVCkKKyAgCisjZGVmaW5lCU5VUERFCQkJKE5QREVQRyAqIE5QREVQRykK KyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykgIC8qIFhYWCA6IG5vdCByZWFs bHkgdXNlZCAqLworCisjZGVmaW5lCWlzX2tlcm5lbF9wbWFwKHgpCSgoeCkgPT0ga2VybmVsX3Bt YXApCisKK3N0cnVjdCBwbWFwIGtlcm5lbF9wbWFwX3N0b3JlOworcGRfZW50cnlfdCAqa2VybmVs X3NlZ21hcDsKKwordm1fb2Zmc2V0X3QgdmlydHVhbF9hdmFpbDsJLyogVkEgb2YgZmlyc3QgYXZh aWwgcGFnZSAoYWZ0ZXIga2VybmVsIGJzcykgKi8KK3ZtX29mZnNldF90IHZpcnR1YWxfZW5kOwkv KiBWQSBvZiBsYXN0IGF2YWlsIHBhZ2UgKGVuZCBvZiBrZXJuZWwgQVMpICovCisKK3N0YXRpYyBp bnQgbmtwdDsKK3Vuc2lnbmVkIHBtYXBfbWF4X2FzaWQ7CQkvKiBtYXggQVNJRCBzdXBwb3J0ZWQg YnkgdGhlIHN5c3RlbSAqLworCisjZGVmaW5lCVBNQVBfQVNJRF9SRVNFUlZFRAkwCisKK3ZtX29m ZnNldF90IGtlcm5lbF92bV9lbmQgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisKK3N0YXRpYyB2 b2lkIHBtYXBfYXNpZF9hbGxvYyhwbWFwX3QgcG1hcCk7CisKKy8qCisgKiBEYXRhIGZvciB0aGUg cHYgZW50cnkgYWxsb2NhdGlvbiBtZWNoYW5pc20KKyAqLworc3RhdGljIHVtYV96b25lX3QgcHZ6 b25lOworc3RhdGljIHN0cnVjdCB2bV9vYmplY3QgcHZ6b25lX29iajsKK3N0YXRpYyBpbnQgcHZf ZW50cnlfY291bnQgPSAwLCBwdl9lbnRyeV9tYXggPSAwLCBwdl9lbnRyeV9oaWdoX3dhdGVyID0g MDsKKworc3RhdGljIFBNQVBfSU5MSU5FIHZvaWQgZnJlZV9wdl9lbnRyeShwdl9lbnRyeV90IHB2 KTsKK3N0YXRpYyBwdl9lbnRyeV90IGdldF9wdl9lbnRyeShwbWFwX3QgbG9ja2VkX3BtYXApOwor c3RhdGljIHZvaWQgcG1hcF9wdmhfZnJlZShzdHJ1Y3QgbWRfcGFnZSAqcHZoLCBwbWFwX3QgcG1h cCwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIHB2X2VudHJ5X3QgcG1hcF9wdmhfcmVtb3ZlKHN0 cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLAorICAgIHZtX29mZnNldF90IHZhKTsKK3N0 YXRpYyBfX2lubGluZSB2b2lkIHBtYXBfY2hhbmdlYml0KHZtX3BhZ2VfdCBtLCBpbnQgYml0LCBi b29sZWFuX3Qgc2V0ZW0pOworCitzdGF0aWMgdm1fcGFnZV90IHBtYXBfZW50ZXJfcXVpY2tfbG9j a2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICB2bV9wYWdlX3QgbSwgdm1fcHJv dF90IHByb3QsIHZtX3BhZ2VfdCBtcHRlKTsKK3N0YXRpYyBpbnQgcG1hcF9yZW1vdmVfcHRlKHN0 cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNldF90IHZhKTsKK3N0YXRp YyB2b2lkIHBtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZh KTsKK3N0YXRpYyB2b2lkIHBtYXBfcmVtb3ZlX2VudHJ5KHN0cnVjdCBwbWFwICpwbWFwLCB2bV9w YWdlX3QgbSwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX3RyeV9pbnNl cnRfcHZfZW50cnkocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlLAorICAgIHZtX29mZnNldF90 IHZhLCB2bV9wYWdlX3QgbSk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBwbWFwX2ludmFsaWRhdGVf cGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIGludCBfcG1hcF91bndp cmVfcHRlX2hvbGQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSk7CisK K3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg dmEsIGludCBmbGFncyk7CitzdGF0aWMgdm1fcGFnZV90IF9wbWFwX2FsbG9jcHRlKHBtYXBfdCBw bWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIGludCBmbGFncyk7CitzdGF0aWMgaW50IHBtYXBfdW51 c2VfcHQocG1hcF90LCB2bV9vZmZzZXRfdCwgdm1fcGFnZV90KTsKK3N0YXRpYyBpbnQgaW5pdF9w dGVfcHJvdCh2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90KTsKK3N0 YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY19wdGVfcGFnZSh1bnNpZ25lZCBpbnQgaW5kZXgsIGlu dCByZXEpOworc3RhdGljIHZvaWQgcG1hcF9ncm93X3B0ZV9wYWdlX2NhY2hlKHZvaWQpOworCisj aWZkZWYgU01QCitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24odm9pZCAq YXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9hbGxfYWN0aW9uKHZvaWQgKmFyZyk7 CitzdGF0aWMgdm9pZCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpOworI2VuZGlm CisKKy8qCisgKiBUb3AgbGV2ZWwgcGFnZSB0YWJsZSBlbnRyeSBmb3IgYSB2YQorICovCitzdGF0 aWMgaW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9zZWdtYXAocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhKQoreworCXJldHVybiAoJnBtYXAtPnBtX3NlZ3RhYltwbWFwX3NlZ19pbmRleCh2YSld KTsKK30KKworc3RhdGljIGlubGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRwZV90b19wZGUocGRf ZW50cnlfdCAqcGRwZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJ cGRlID0gKHBkX2VudHJ5X3QgKikqcGRwZTsKKwlyZXR1cm4gKCZwZGVbcG1hcF9wZGVfaW5kZXgo dmEpXSk7Cit9CisKKy8qCisgKiBSZXR1cm4gcGFnZSBkaXJlY3RvcnkgZW50cnkgZm9yIGEgdmEK KyAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9wZGUocG1hcF90IHBtYXAs IHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkcGU7CisKKwlwZHBlID0gcG1hcF9z ZWdtYXAocG1hcCwgdmEpOworCWlmIChwZHBlID09IE5VTEwgfHwgKnBkcGUgPT0gTlVMTCkKKwkJ cmV0dXJuIChOVUxMKTsKKworCXJldHVybiAocG1hcF9wZHBlX3RvX3BkZShwZHBlLCB2YSkpOwor fQorCitzdGF0aWMgaW5saW5lIHB0X2VudHJ5X3QgKgorcG1hcF9wZGVfdG9fcHRlKHBkX2VudHJ5 X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCisJcHRlID0g KHB0X2VudHJ5X3QgKikqcGRlOworCXJldHVybiAoJnB0ZVtwbWFwX3B0ZV9pbmRleCh2YSldKTsK K30KKworLyoKKyAqCVJvdXRpbmU6CXBtYXBfcHRlCisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0 IHRoZSBwYWdlIHRhYmxlIGVudHJ5IGFzc29jaWF0ZWQKKyAqCQl3aXRoIHRoZSBnaXZlbiBtYXAv dmlydHVhbF9hZGRyZXNzIHBhaXIuCisgKi8KK3B0X2VudHJ5X3QgKgorcG1hcF9wdGUocG1hcF90 IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKworCXBkZSA9IHBt YXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKQorCQly ZXR1cm4gKE5VTEwpOworCisJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQor Cit2bV9vZmZzZXRfdAorcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1f c2l6ZV90IGJhbmtfc2l6ZTsKKwl2bV9vZmZzZXRfdCBwYSwgdmE7CisKKwlzaXplID0gcm91bmRf cGFnZShzaXplKTsKKworCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2YWlsWzBd OworCXdoaWxlIChzaXplID4gYmFua19zaXplKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7 IHBoeXNfYXZhaWxbaSArIDJdOyBpICs9IDIpIHsKKwkJCXBoeXNfYXZhaWxbaV0gPSBwaHlzX2F2 YWlsW2kgKyAyXTsKKwkJCXBoeXNfYXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpICsgM107CisJ CX0KKwkJcGh5c19hdmFpbFtpXSA9IDA7CisJCXBoeXNfYXZhaWxbaSArIDFdID0gMDsKKwkJaWYg KCFwaHlzX2F2YWlsWzBdKQorCQkJcGFuaWMoInBtYXBfc3RlYWxfbWVtb3J5OiBvdXQgb2YgbWVt b3J5Iik7CisJCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2YWlsWzBdOworCX0K KworCXBhID0gcGh5c19hdmFpbFswXTsKKwlwaHlzX2F2YWlsWzBdICs9IHNpemU7CisJaWYgKHBh ID49IE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlTKSB7CisJCXBhbmljKCJPdXQgb2YgbWVtb3J5IGJl bG93IDUxMk1lZz8iKTsKKwl9CisJdmEgPSBNSVBTX1BIWVNfVE9fS1NFRzAocGEpOworCWJ6ZXJv KChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gdmE7Cit9CisKKy8qCisgKiBCb290c3RyYXAg dGhlIHN5c3RlbSBlbm91Z2ggdG8gcnVuIHdpdGggdmlydHVhbCBtZW1vcnkuICBUaGlzCisgKiBh c3N1bWVzIHRoYXQgdGhlIHBoeXNfYXZhaWwgYXJyYXkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisg Ki8KK3N0YXRpYyB2b2lkIAorY3JlYXRlX2tlcm5fcGFnZV90YWJsZSh2b2lkKQoreworCWludCBu cGRlOworCWludCBpLCBqLCBucHQ7CisJdm1fb2Zmc2V0X3QgcGRhZGRyLCBwdGFkZHI7CisJcGRf ZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKworCWtlcm5lbF9zZWdtYXAgPSAocGRf ZW50cnlfdCAqKXBtYXBfc3RlYWxfbWVtb3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9j YXRlIHNlY29uZCBsZXZlbCBwYWdlIHRhYmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUg PSBob3dtYW55KE5LUFQsIE5QREVQRyk7CisJbmtwdCA9IE5LUFQ7CisJcGRhZGRyID0gcG1hcF9z dGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1v cnkoUEFHRV9TSVpFICogbmtwdCk7CisJcHJpbnRmKCJOUERFICVseCBOUEtQVCAlbHggXG4iLCAo dV9sb25nKW5wZGUsICh1X2xvbmcpbmtwdCk7CisJLyoKKwkgKiBUaGUgUls0LTddPzAwIHN0b3Jl cyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwgYml0IGluIHRoZQorCSAqIHRyYW5zbGF0aW9u IGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LiBUaHVzIGludmFsaWQKKwkg KiBlbnRyeXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuIEVudHJ5IExPIGFu ZCBFbnRyeSBISQorCSAqIEcgYml0cyBhcmUgYW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsIHByb2R1 Y2UgYSBnbG9iYWwgYml0IHRvIHN0b3JlCisJICogaW4gdGhlIHRsYi4KKwkgKi8KKwlmb3IgKGkg PSAwLCBwdGUgPSAocHRfZW50cnlfdCAqKXB0YWRkcjsgaSA8IChua3B0ICogTlBURVBHKTsgaSsr LCBwdGUrKykKKwkJKnB0ZSA9IFBURV9HOworCisJZm9yIChpID0gMCwgIG5wdCA9IG5rcHQ7IG5w dCA+IDA7IGkrKykgeworCQlrZXJuZWxfc2VnbWFwW2ldID0gKHBkX2VudHJ5X3QpKHBkYWRkciAr IGkgKiBQQUdFX1NJWkUpOworCQlwZGUgPSAocGRfZW50cnlfdCAqKWtlcm5lbF9zZWdtYXBbaV07 CisKKwkJZm9yIChqID0gMDsgaiA8IE5QREVQRyAmJiBucHQgPiAwOyBqKyssIG5wdC0tKQorCQkJ cGRlW2pdID0gKHBkX2VudHJ5X3QpKHB0YWRkciArIChpICogTlBERVBHICsgaikgKiBQQUdFX1NJ WkUpOworCX0KKworCVBNQVBfTE9DS19JTklUKGtlcm5lbF9wbWFwKTsKKwlrZXJuZWxfcG1hcC0+ cG1fc2VndGFiID0ga2VybmVsX3NlZ21hcDsKKwlrZXJuZWxfcG1hcC0+cG1fYWN0aXZlID0gfjA7 CisJVEFJTFFfSU5JVCgma2VybmVsX3BtYXAtPnBtX3B2bGlzdCk7CisJa2VybmVsX3BtYXAtPnBt X2FzaWRbMF0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwlrZXJuZWxfcG1hcC0+cG1fYXNp ZFswXS5nZW4gPSAwOworfQorCit2b2lkCitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBp OworCisJLyogU29ydC4gKi8KK2FnYWluOgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFd ICE9IDA7IGkgKz0gMikgeworCQkvKgorCQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBw YWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJcGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19h dmFpbFtpXSk7CisJCXBoeXNfYXZhaWxbaSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kg KyAxXSk7CisKKwkJaWYgKGkgPCAyKQorCQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kg LSAyXSA+IHBoeXNfYXZhaWxbaV0pIHsKKwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0 ZW1wWzBdID0gcGh5c19hdmFpbFtpICsgMF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSAr IDFdOworCisJCQlwaHlzX2F2YWlsW2kgKyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5 c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0g Ml0gPSBwdGVtcFswXTsKKwkJCXBoeXNfYXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3Rv IGFnYWluOworCQl9CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkg YmVmb3JlIHdlIHN0YXJ0IHN0ZWFsaW5nIG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9 IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0g PSBwaHlzX2F2YWlsW2ldOworCQlwaHlzbWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsg MV07CisJfQorCisJTWF4bWVtID0gYXRvcChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9v dHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJQaHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJ Zm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRk cl90IHNpemU7CisKKwkJCXNpemUgPSBwaHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07 CisJCQlwcmludGYoIiUjMDhqeCAtICUjMDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAor CQkJICAgICh1aW50bWF4X3QpIHBoeXNfYXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5 c19hdmFpbFtpICsgMV0gLSAxLAorCQkJICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3Qp IHNpemUgLyBQQUdFX1NJWkUpOworCQl9CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBseFxuIiwg cHRvYShNYXhtZW0pKTsKKwl9CisJLyoKKwkgKiBTdGVhbCB0aGUgbWVzc2FnZSBidWZmZXIgZnJv bSB0aGUgYmVnaW5uaW5nIG9mIG1lbW9yeS4KKwkgKi8KKwltc2didWZwID0gKHN0cnVjdCBtc2di dWYgKilwbWFwX3N0ZWFsX21lbW9yeShNU0dCVUZfU0laRSk7CisJbXNnYnVmaW5pdChtc2didWZw LCBNU0dCVUZfU0laRSk7CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLgorCSAqLwor CWtzdGFjazAgPSBwbWFwX3N0ZWFsX21lbW9yeShLU1RBQ0tfUEFHRVMgPDwgUEFHRV9TSElGVCk7 CisKKwl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tFUk5FTF9BRERSRVNTOworCXZpcnR1YWxfZW5k ID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOworCisjaWZkZWYgU01QCisJLyoKKwkgKiBTdGVhbCBz b21lIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB0byBtYXAgdGhlIHBjcHUgYXJlYS4KKwkgKi8KKwl2 aXJ0dWFsX2F2YWlsID0gcm91bmR1cDIodmlydHVhbF9hdmFpbCwgUEFHRV9TSVpFICogMik7CisJ cGNwdXAgPSAoc3RydWN0IHBjcHUgKil2aXJ0dWFsX2F2YWlsOworCXZpcnR1YWxfYXZhaWwgKz0g UEFHRV9TSVpFICogMjsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgd2lyZWQgVExCIGVudHJ5 IG1hcHBpbmcgdGhlIHBjcHUgcmVnaW9uIGZvcgorCSAqIHRoZSBCU1AgYXQgJ3BjcHVwJy4gVXAg dW50aWwgdGhpcyBwb2ludCB3ZSB3ZXJlIG9wZXJhdGluZworCSAqIHdpdGggdGhlICdwY3B1cCcg Zm9yIHRoZSBCU1AgcG9pbnRpbmcgdG8gYSB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBpbiBLU0VHMCBz byB0aGVyZSB3YXMgbm8gbmVlZCBmb3IgYSBUTEIgbWFwcGluZy4KKwkgKi8KKwltaXBzX3BjcHVf dGxiX2luaXQoUENQVV9BRERSKDApKTsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCJw Y3B1IGlzIGF2YWlsYWJsZSBhdCB2aXJ0dWFsIGFkZHJlc3MgJXAuXG4iLCBwY3B1cCk7CisjZW5k aWYKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3IgdGhlIGtlcm5lbAorCSAq LworCWNyZWF0ZV9rZXJuX3BhZ2VfdGFibGUoKTsKKwlwbWFwX21heF9hc2lkID0gVk1OVU1fUElE UzsKKwltaXBzX3dyX2VudHJ5aGkoMCk7CisJbWlwc193cl9wYWdlbWFzaygwKTsKK30KKworLyoK KyAqIEluaXRpYWxpemUgYSB2bV9wYWdlJ3MgbWFjaGluZS1kZXBlbmRlbnQgZmllbGRzLgorICov Cit2b2lkCitwbWFwX3BhZ2VfaW5pdCh2bV9wYWdlX3QgbSkKK3sKKworCVRBSUxRX0lOSVQoJm0t Pm1kLnB2X2xpc3QpOworCW0tPm1kLnB2X2xpc3RfY291bnQgPSAwOworCW0tPm1kLnB2X2ZsYWdz ID0gMDsKK30KKworLyoKKyAqCUluaXRpYWxpemUgdGhlIHBtYXAgbW9kdWxlLgorICoJQ2FsbGVk IGJ5IHZtX2luaXQsIHRvIGluaXRpYWxpemUgYW55IHN0cnVjdHVyZXMgdGhhdCB0aGUgcG1hcAor ICoJc3lzdGVtIG5lZWRzIHRvIG1hcCB2aXJ0dWFsIG1lbW9yeS4KKyAqCXBtYXBfaW5pdCBoYXMg YmVlbiBlbmhhbmNlZCB0byBzdXBwb3J0IGluIGEgZmFpcmx5IGNvbnNpc3RhbnQKKyAqCXdheSwg ZGlzY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuCisgKi8KK3ZvaWQKK3BtYXBfaW5pdCh2b2lk KQoreworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBhZGRyZXNzIHNwYWNlICh6b25lKSBmb3Ig dGhlIHB2IGVudHJpZXMuICBTZXQgYQorCSAqIGhpZ2ggd2F0ZXIgbWFyayBzbyB0aGF0IHRoZSBz eXN0ZW0gY2FuIHJlY292ZXIgZnJvbSBleGNlc3NpdmUKKwkgKiBudW1iZXJzIG9mIHB2IGVudHJp ZXMuCisJICovCisJcHZ6b25lID0gdW1hX3pjcmVhdGUoIlBWIEVOVFJZIiwgc2l6ZW9mKHN0cnVj dCBwdl9lbnRyeSksIE5VTEwsIE5VTEwsCisJICAgIE5VTEwsIE5VTEwsIFVNQV9BTElHTl9QVFIs IFVNQV9aT05FX1ZNIHwgVU1BX1pPTkVfTk9GUkVFKTsKKwlwdl9lbnRyeV9tYXggPSBQTUFQX1NI UEdQRVJQUk9DICogbWF4cHJvYyArIGNudC52X3BhZ2VfY291bnQ7CisJcHZfZW50cnlfaGlnaF93 YXRlciA9IDkgKiAocHZfZW50cnlfbWF4IC8gMTApOworCXVtYV96b25lX3NldF9vYmoocHZ6b25l LCAmcHZ6b25lX29iaiwgcHZfZW50cnlfbWF4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG93IGxldmVsIGhlbHBlciByb3V0 aW5lcy4uLi4uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLworCisjaWYgZGVmaW5lZChQTUFQX0RJQUdOT1NUSUMpCisKKy8qCisgKiBUaGlzIGNv ZGUgY2hlY2tzIGZvciBub24td3JpdGVhYmxlL21vZGlmaWVkIHBhZ2VzLgorICogVGhpcyBzaG91 bGQgYmUgYW4gaW52YWxpZCBjb25kaXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK3BtYXBfbndfbW9k aWZpZWQocHRfZW50cnlfdCBwdGUpCit7CisJaWYgKChwdGUgJiAoUFRFX0QgfCBQVEVfUk8pKSA9 PSAoUFRFX0QgfCBQVEVfUk8pKQorCQlyZXR1cm4gKDEpOworCWVsc2UKKwkJcmV0dXJuICgwKTsK K30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXBfdCBw bWFwKQoreworI2lmZGVmIFNNUAorCXNtcF9yZW5kZXp2b3VzKDAsIHBtYXBfaW52YWxpZGF0ZV9h bGxfYWN0aW9uLCAwLCAodm9pZCAqKXBtYXApOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZh bGlkYXRlX2FsbF9hY3Rpb24odm9pZCAqYXJnKQoreworCXBtYXBfdCBwbWFwID0gKHBtYXBfdClh cmc7CisKKyNlbmRpZgorCisJaWYgKHBtYXAgPT0ga2VybmVsX3BtYXApIHsKKwkJdGxiX2ludmFs aWRhdGVfYWxsKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocG1hcC0+cG1fYWN0aXZlICYgUENQ VV9HRVQoY3B1bWFzaykpCisJCXRsYl9pbnZhbGlkYXRlX2FsbF91c2VyKHBtYXApOworCWVsc2UK KwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IDA7Cit9CisKK3N0cnVjdCBw bWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgeworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZh OworfTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXBf dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKyNpZmRlZiBTTVAKKwlzdHJ1Y3QgcG1hcF9pbnZh bGlkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsK KworCXNtcF9yZW5kZXp2b3VzKDAsIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbiwgMCwgKHZv aWQgKikmYXJnKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlv bih2b2lkICphcmcpCit7CisJcG1hcF90IHBtYXAgPSAoKHN0cnVjdCBwbWFwX2ludmFsaWRhdGVf cGFnZV9hcmcgKilhcmcpLT5wbWFwOworCXZtX29mZnNldF90IHZhID0gKChzdHJ1Y3QgcG1hcF9p bnZhbGlkYXRlX3BhZ2VfYXJnICopYXJnKS0+dmE7CisKKyNlbmRpZgorCisJaWYgKGlzX2tlcm5l bF9wbWFwKHBtYXApKSB7CisJCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocG1hcCwgdmEpOworCQly ZXR1cm47CisJfQorCWlmIChwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuICE9IFBD UFVfR0VUKGFzaWRfZ2VuZXJhdGlvbikpCisJCXJldHVybjsKKwllbHNlIGlmICghKHBtYXAtPnBt X2FjdGl2ZSAmIFBDUFVfR0VUKGNwdW1hc2spKSkgeworCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VU KGNwdWlkKV0uZ2VuID0gMDsKKwkJcmV0dXJuOworCX0KKwl0bGJfaW52YWxpZGF0ZV9hZGRyZXNz KHBtYXAsIHZhKTsKK30KKworc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIHsKKwlwbWFwX3Qg cG1hcDsKKwl2bV9vZmZzZXRfdCB2YTsKKwlwdF9lbnRyeV90IHB0ZTsKK307CisKK3ZvaWQKK3Bt YXBfdXBkYXRlX3BhZ2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBwdF9lbnRyeV90IHB0 ZSkKK3sKKyNpZmRlZiBTTVAKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgYXJnOworCisJ YXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCWFyZy5wdGUgPSBwdGU7CisKKwlzbXBf cmVuZGV6dm91cygwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgMCwgKHZvaWQgKikmYXJnKTsK K30KKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sK KwlwbWFwX3QgcG1hcCA9ICgoc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnICopYXJnKS0+cG1h cDsKKwl2bV9vZmZzZXRfdCB2YSA9ICgoc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnICopYXJn KS0+dmE7CisJcHRfZW50cnlfdCBwdGUgPSAoKHN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyAq KWFyZyktPnB0ZTsKKworI2VuZGlmCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCXRs Yl91cGRhdGUocG1hcCwgdmEsIHB0ZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHBtYXAtPnBtX2Fz aWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gIT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSkKKwkJ cmV0dXJuOworCWVsc2UgaWYgKCEocG1hcC0+cG1fYWN0aXZlICYgUENQVV9HRVQoY3B1bWFzaykp KSB7CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gPSAwOworCQlyZXR1cm47 CisJfQorCXRsYl91cGRhdGUocG1hcCwgdmEsIHB0ZSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglw bWFwX2V4dHJhY3QKKyAqCUZ1bmN0aW9uOgorICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2Ug YWRkcmVzcyBhc3NvY2lhdGVkCisgKgkJd2l0aCB0aGUgZ2l2ZW4gbWFwL3ZpcnR1YWxfYWRkcmVz cyBwYWlyLgorICovCit2bV9wYWRkcl90CitwbWFwX2V4dHJhY3QocG1hcF90IHBtYXAsIHZtX29m ZnNldF90IHZhKQoreworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCByZXR2YWwgPSAw OworCisJUE1BUF9MT0NLKHBtYXApOworCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsKKwlpZiAo cHRlKSB7CisJCXJldHZhbCA9IFRMQkxPX1BURV9UT19QQSgqcHRlKSB8ICh2YSAmIFBBR0VfTUFT Syk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisg KglSb3V0aW5lOglwbWFwX2V4dHJhY3RfYW5kX2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21p Y2FsbHkgZXh0cmFjdCBhbmQgaG9sZCB0aGUgcGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdp dmVuIHBtYXAgYW5kIHZpcnR1YWwgYWRkcmVzcyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBl cm1pdHMgdGhlIGdpdmVuIHByb3RlY3Rpb24uCisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0 X2FuZF9ob2xkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7 CisJcHRfZW50cnlfdCBwdGU7CisJdm1fcGFnZV90IG07CisJdm1fcGFkZHJfdCBwYTsKKworCW0g PSBOVUxMOworCXBhID0gMDsKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwdGUgPSAqcG1h cF9wdGUocG1hcCwgdmEpOworCWlmIChwdGUgIT0gMCAmJiBwdGVfdGVzdCgmcHRlLCBQVEVfVikg JiYKKwkgICAgKHB0ZV90ZXN0KCZwdGUsIFBURV9EKSB8fCAocHJvdCAmIFZNX1BST1RfV1JJVEUp ID09IDApKSB7CisJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBUTEJMT19QVEVfVE9f UEEocHRlKSwgJnBhKSkKKwkJCWdvdG8gcmV0cnk7CisKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShU TEJMT19QVEVfVE9fUEEocHRlKSk7CisJCXZtX3BhZ2VfaG9sZChtKTsKKwl9CisJUEFfVU5MT0NL X0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisKKy8qKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdyBs ZXZlbCBtYXBwaW5nIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBhZGQgYSB3aXJlZCBwYWdlIHRvIHRo ZSBrdmEKKyAqLworIC8qIFBNQVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNl dF90IHZhLCB2bV9wYWRkcl90IHBhKQoreworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwdF9lbnRyeV90 IG9wdGUsIG5wdGU7CisKKyNpZmRlZiBQTUFQX0RFQlVHCisJcHJpbnRmKCJwbWFwX2tlbnRlcjog IHZhOiAlcCAtPiBwYTogJXBcbiIsICh2b2lkICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisJ bnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQVEVf VzsKKworCWlmIChpc19jYWNoZWFibGVfbWVtKHBhKSkKKwkJbnB0ZSB8PSBQVEVfQ19DQUNIRTsK KwllbHNlCisJCW5wdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisKKwlwdGUgPSBwbWFwX3B0ZShrZXJu ZWxfcG1hcCwgdmEpOworCW9wdGUgPSAqcHRlOworCSpwdGUgPSBucHRlOworCisJcG1hcF91cGRh dGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOworfQorCisvKgorICogcmVtb3ZlIGEgcGFn ZSBmcm9tIHRoZSBrZXJuZWwgcGFnZXRhYmxlcworICovCisgLyogUE1BUF9JTkxJTkUgKi8gdm9p ZAorcG1hcF9rcmVtb3ZlKHZtX29mZnNldF90IHZhKQoreworCXB0X2VudHJ5X3QgKnB0ZTsKKwor CS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGVzIGZyb20gdGhlIHBhZ2UgYmVpbmcgZGVzdHJv eWVkCisJICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgodmEsIFBBR0VfU0laRSk7 CisKKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCSpwdGUgPSBQVEVfRzsKKwlw bWFwX2ludmFsaWRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEpOworfQorCisvKgorICoJVXNlZCB0 byBtYXAgYSByYW5nZSBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgaW50byBrZXJuZWwKKyAqCXZpcnR1 YWwgYWRkcmVzcyBzcGFjZS4KKyAqCisgKglUaGUgdmFsdWUgcGFzc2VkIGluICcqdmlydCcgaXMg YSBzdWdnZXN0ZWQgdmlydHVhbCBhZGRyZXNzIGZvcgorICoJdGhlIG1hcHBpbmcuIEFyY2hpdGVj dHVyZXMgd2hpY2ggY2FuIHN1cHBvcnQgYSBkaXJlY3QtbWFwcGVkCisgKglwaHlzaWNhbCB0byB2 aXJ0dWFsIHJlZ2lvbiBjYW4gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzCisgKgl3aXRo aW4gdGhhdCByZWdpb24sIGxlYXZpbmcgJyp2aXJ0JyB1bmNoYW5nZWQuIE90aGVyCisgKglhcmNo aXRlY3R1cmVzIHNob3VsZCBtYXAgdGhlIHBhZ2VzIHN0YXJ0aW5nIGF0ICcqdmlydCcgYW5kCisg Kgl1cGRhdGUgJyp2aXJ0JyB3aXRoIHRoZSBmaXJzdCB1c2FibGUgYWRkcmVzcyBhZnRlciB0aGUg bWFwcGVkCisgKglyZWdpb24uCisgKgorICoJVXNlIFhLUEhZUyBmb3IgNjQgYml0LCBhbmQgS1NF RzAgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFw KHZtX29mZnNldF90ICp2aXJ0LCB2bV9vZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLCBp bnQgcHJvdCkKK3sKKwlyZXR1cm4gKE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHN0YXJ0KSk7 Cit9CisKKy8qCisgKiBBZGQgYSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRo aXMgcm91dGluZSBpcyBvbmx5IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdz IHRoYXQgZG8gbm90IG5lZWQgdG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJl bmNlcyByZWNvcmRlZC4KKyAqIE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0 dGVuCisgKiBvdmVyLiAgVGhlIHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFw X3FlbnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50 IGk7CisJdm1fb2Zmc2V0X3Qgb3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7 IGkrKykgeworCQlwbWFwX2ZsdXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBW TV9QQUdFX1RPX1BIWVMobVtpXSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19k Y2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisv KgorICogdGhpcyByb3V0aW5lIGplcmtzIHBhZ2UgbWFwcGluZ3MgZnJvbSB0aGUKKyAqIGtlcm5l bCAtLSBpdCBpcyBtZWFudCBvbmx5IGZvciB0ZW1wb3JhcnkgbWFwcGluZ3MuCisgKi8KK3ZvaWQK K3BtYXBfcXJlbW92ZSh2bV9vZmZzZXRfdCB2YSwgaW50IGNvdW50KQoreworCS8qCisJICogTm8g bmVlZCB0byB3Yi9pbnYgY2FjaGVzIGhlcmUsIAorCSAqICAgcG1hcF9rcmVtb3ZlIHdpbGwgZG8g aXQgZm9yIHVzCisJICovCisKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJcG1hcF9rcmVtb3Zl KHZhKTsKKwkJdmEgKz0gUEFHRV9TSVpFOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGFnZSB0YWJsZSBwYWdlIG1hbmFn ZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKworLyogIFJldmlzaW9uIDEuNTA3CisgKgorICogU2ltcGxpZnkg dGhlIHJlZmVyZW5jZSBjb3VudGluZyBvZiBwYWdlIHRhYmxlIHBhZ2VzLgkgU3BlY2lmaWNhbGx5 LCB1c2UKKyAqIHRoZSBwYWdlIHRhYmxlIHBhZ2UncyB3aXJlZCBjb3VudCByYXRoZXIgdGhhbiBp dHMgaG9sZCBjb3VudCB0byBjb250YWluCisgKiB0aGUgcmVmZXJlbmNlIGNvdW50LgorICovCisK Ky8qCisgKiBUaGlzIHJvdXRpbmUgdW5ob2xkcyBwYWdlIHRhYmxlIHBhZ2VzLCBhbmQgaWYgdGhl IGhvbGQgY291bnQKKyAqIGRyb3BzIHRvIHplcm8sIHRoZW4gaXQgZGVjcmVtZW50cyB0aGUgd2ly ZSBjb3VudC4KKyAqLworc3RhdGljIFBNQVBfSU5MSU5FIGludAorcG1hcF91bndpcmVfcHRlX2hv bGQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSkKK3sKKwktLW0tPndp cmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQgPT0gMCkKKwkJcmV0dXJuIChfcG1hcF91bndp cmVfcHRlX2hvbGQocG1hcCwgdmEsIG0pKTsKKwllbHNlCisJCXJldHVybiAoMCk7Cit9CisKK3N0 YXRpYyBpbnQKK19wbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg dmEsIHZtX3BhZ2VfdCBtKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2bV9wYWdlX3Qg cGRwZzsKKworICAgICAgICBQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKgor CSAqIHVubWFwIHRoZSBwYWdlIHRhYmxlIHBhZ2UKKwkgKi8KKworCWlmIChtLT5waW5kZXggPCBO VVBERSkKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWVsc2UKKwkJcGRlID0gcG1hcF9z ZWdtYXAocG1hcCwgdmEpOworCSpwZGUgPSAwOworCisgICAgICAgIHBtYXAtPnBtX3N0YXRzLnJl c2lkZW50X2NvdW50LS07CisKKwlpZiAobS0+cGluZGV4IDwgTlVQREUpIHsKKwkJLyoKKwkJICog UmVjdXJzaXZlbHkgZGVjcmVtZW50IG5leHQgbGV2ZWwgcGFnZXRhYmxlIHJlZmNvdW50CisJCSAq LworCQlpZiAocG1hcC0+cG1fcHRwaGludCA9PSBtKQorCQkJcG1hcC0+cG1fcHRwaGludCA9IE5V TEw7CisKKwkJcGRwID0gKHBkX2VudHJ5X3QgKikqcG1hcF9zZWdtYXAocG1hcCwgdmEpOworCQlw ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNfS1NFRzBfVE9fUEhZUyhwZHApKTsKKwkJcG1hcF91 bndpcmVfcHRlX2hvbGQocG1hcCwgdmEsIHBkcGcpOworCX0KKwkvKgorCSAqIElmIHRoZSBwYWdl IGlzIGZpbmFsbHkgdW53aXJlZCwgc2ltcGx5IGZyZWUgaXQuCisJICovCisJaWYgKDApIHByaW50 ZigiWyVkXSBmcmVlIHBpbmRleFsleF0gbSAlcCwgdmEgJXBcbiIsCisJCWN1cnRocmVhZC0+dGRf cHJvYy0+cF9waWQsIChpbnQpbS0+cGluZGV4LCBtLCAodm9pZCAqKXZhKTsKKworCXZtX3BhZ2Vf ZnJlZV96ZXJvKG0pOworCWF0b21pY19zdWJ0cmFjdF9pbnQoJmNudC52X3dpcmVfY291bnQsIDEp OworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBBZnRlciByZW1vdmluZyBhIHBhZ2UgdGFibGUg ZW50cnksIHRoaXMgcm91dGluZSBpcyB1c2VkIHRvCisgKiBjb25kaXRpb25hbGx5IGZyZWUgdGhl IHBhZ2UsIGFuZCBtYW5hZ2UgdGhlIGhvbGQvd2lyZSBjb3VudHMuCisgKi8KK3N0YXRpYyBpbnQK K3BtYXBfdW51c2VfcHQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbXB0 ZSkKK3sKKwl1bnNpZ25lZCBwdGVwaW5kZXg7CisJcGRfZW50cnlfdCBwdGV2YTsKKworCWlmICh2 YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCXJldHVybiAoMCk7CisKKwlpZiAobXB0ZSA9PSBO VUxMKSB7CisJCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChwbWFwLT5w bV9wdHBoaW50ICYmCisJCSAgICAocG1hcC0+cG1fcHRwaGludC0+cGluZGV4ID09IHB0ZXBpbmRl eCkpIHsKKwkJCW1wdGUgPSBwbWFwLT5wbV9wdHBoaW50OworCQl9IGVsc2UgeworCQkJcHRldmEg PSAqcG1hcF9wZGUocG1hcCwgdmEpOworCQkJbXB0ZSA9IFBIWVNfVE9fVk1fUEFHRShNSVBTX0tT RUcwX1RPX1BIWVMocHRldmEpKTsKKwkJCXBtYXAtPnBtX3B0cGhpbnQgPSBtcHRlOworCQl9CisJ fQorCXJldHVybiBwbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwLCB2YSwgbXB0ZSk7Cit9CisKK3Zv aWQKK3BtYXBfcGluaXQwKHBtYXBfdCBwbWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lO SVQocG1hcCk7CisJcG1hcC0+cG1fc2VndGFiID0ga2VybmVsX3NlZ21hcDsKKwlwbWFwLT5wbV9h Y3RpdmUgPSAwOworCXBtYXAtPnBtX3B0cGhpbnQgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBN QVhDUFU7IGkrKykgeworCQlwbWFwLT5wbV9hc2lkW2ldLmFzaWQgPSBQTUFQX0FTSURfUkVTRVJW RUQ7CisJCXBtYXAtPnBtX2FzaWRbaV0uZ2VuID0gMDsKKwl9CisJUENQVV9TRVQoY3VycG1hcCwg cG1hcCk7CisJVEFJTFFfSU5JVCgmcG1hcC0+cG1fcHZsaXN0KTsKKwliemVybygmcG1hcC0+cG1f c3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX2dy b3dfcHRlX3BhZ2VfY2FjaGUoKQoreworCisJdm1fY29udGlnX2dyb3dfY2FjaGUoMywgMCwgTUlQ U19LU0VHMF9MQVJHRVNUX1BIWVMpOworfQorCitzdGF0aWMgdm1fcGFnZV90CitwbWFwX2FsbG9j X3B0ZV9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJlcSkKK3sKKwl2bV9wYWdlX3QgbTsK KworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNUX0RJUkVDVCwgMCwgcmVx KTsKKwlpZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAm IFBHX1pFUk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5k ZXg7CisJYXRvbWljX2FkZF9pbnQoJmNudC52X3dpcmVfY291bnQsIDEpOworCW0tPndpcmVfY291 bnQgPSAxOworCXJldHVybiAobSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2Nh dGVkIGFuZCB6ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3Bh Y2Ugc3RydWN0dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1f b2Zmc2V0X3QgcHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpOworCisJUE1BUF9MT0NL X0lOSVQocG1hcCk7CisKKwkvKgorCSAqIGFsbG9jYXRlIHRoZSBwYWdlIGRpcmVjdG9yeSBwYWdl CisJICovCisJd2hpbGUgKChwdGRwZyA9IHBtYXBfYWxsb2NfcHRlX3BhZ2UoTlVTRVJQR1RCTFMs IFZNX0FMTE9DX05PUk1BTCkpID09IE5VTEwpCisJICAgICAgIHBtYXBfZ3Jvd19wdGVfcGFnZV9j YWNoZSgpOworCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fS1NFRzAoVk1fUEFHRV9UT19QSFlTKHB0 ZHBnKSk7CisJcG1hcC0+cG1fc2VndGFiID0gKHBkX2VudHJ5X3QgKilwdGR2YTsKKwlwbWFwLT5w bV9hY3RpdmUgPSAwOworCXBtYXAtPnBtX3B0cGhpbnQgPSBOVUxMOworCWZvciAoaSA9IDA7IGkg PCBNQVhDUFU7IGkrKykgeworCQlwbWFwLT5wbV9hc2lkW2ldLmFzaWQgPSBQTUFQX0FTSURfUkVT RVJWRUQ7CisJCXBtYXAtPnBtX2FzaWRbaV0uZ2VuID0gMDsKKwl9CisJVEFJTFFfSU5JVCgmcG1h cC0+cG1fcHZsaXN0KTsKKwliemVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9z dGF0cyk7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIGlzIGNhbGxl ZCBpZiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdAorICogbWFwcGVkIGNvcnJlY3RseS4KKyAq Lworc3RhdGljIHZtX3BhZ2VfdAorX3BtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHVuc2lnbmVk IHB0ZXBpbmRleCwgaW50IGZsYWdzKQoreworCXZtX29mZnNldF90IHBhZ2V2YTsKKwl2bV9wYWdl X3QgbTsKKwlpbnQgcGlkID0gY3VydGhyZWFkLT50ZF9wcm9jLT5wX3BpZDsKKworCUtBU1NFUlQo KGZsYWdzICYgKE1fTk9XQUlUIHwgTV9XQUlUT0spKSA9PSBNX05PV0FJVCB8fAorCSAgICAoZmxh Z3MgJiAoTV9OT1dBSVQgfCBNX1dBSVRPSykpID09IE1fV0FJVE9LLAorCSAgICAoIl9wbWFwX2Fs bG9jcHRlOiBmbGFncyBpcyBuZWl0aGVyIE1fTk9XQUlUIG5vciBNX1dBSVRPSyIpKTsKKworCS8q CisJICogRmluZCBvciBmYWJyaWNhdGUgYSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAo KG0gPSBwbWFwX2FsbG9jX3B0ZV9wYWdlKHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMKSkgPT0g TlVMTCkgeworCQlpZiAoZmxhZ3MgJiBNX1dBSVRPSykgeworCQkJUE1BUF9VTkxPQ0socG1hcCk7 CisJCQl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwkJCXBtYXBfZ3Jvd19wdGVfcGFnZV9jYWNo ZSgpOworCQkJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCQkJUE1BUF9MT0NLKHBtYXApOworCQl9 CisKKwkJLyoKKwkJICogSW5kaWNhdGUgdGhlIG5lZWQgdG8gcmV0cnkuCVdoaWxlIHdhaXRpbmcs IHRoZSBwYWdlCisJCSAqIHRhYmxlIHBhZ2UgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQuCisJCSAq LworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXBhZ2V2YSA9IE1JUFNfUEhZU19UT19LU0VHMChW TV9QQUdFX1RPX1BIWVMobSkpOworCWlmICgwKSBwcmludGYoIl9wbWFwX2FsbG9jcHRlOiBpbmRl eCAleCAoJWx4KSwgZmxhZ3MgJXggcGFnZXZhICVseFxuIiwKKwkJCXB0ZXBpbmRleCwgTlVQREUs IGZsYWdzLCAodV9sb25nKXBhZ2V2YSk7CisJLyoKKwkgKiBNYXAgdGhlIHBhZ2V0YWJsZSBwYWdl IGludG8gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSwgaWYgaXQKKwkgKiBpc24ndCBhbHJlYWR5 IHRoZXJlLgorCSAqLworCWlmIChwdGVwaW5kZXggPj0gTlVQREUpIHsKKwkJcG1hcC0+cG1fc2Vn dGFiW3B0ZXBpbmRleCAtIE5VUERFXSA9IChwZF9lbnRyeV90KXBhZ2V2YTsKKwkJaWYoMCkgcHJp bnRmKCJbJWRdc2VndGFiWyVsdV0gPSAlcFxuIiwgcGlkLCBwdGVwaW5kZXggLSBOVVBERSwgKHZv aWQgKilwYWdldmEpOworCX0gZWxzZSB7CisJCXBkX2VudHJ5X3QgKnBkZXAsICpwZGU7CisJCWlu dCBzZWdpbmRleCA9IHB0ZXBpbmRleCA+PiAoU0VHU0hJRlQgLSBQRFJTSElGVCk7CisJCWludCBw ZGVpbmRleCA9IHB0ZXBpbmRleCAmIChOUERFUEcgLSAxKTsKKwkJdm1fcGFnZV90IHBnOworCQkK KwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2VnaW5kZXhdOworCQlpZiAoKnBkZXAgPT0gTlVM TCkgeyAKKwkJCS8qIHJlY3Vyc2UgZm9yIGFsbG9jYXRpbmcgcGFnZSBkaXIgKi8KKwkJCWlmIChf cG1hcF9hbGxvY3B0ZShwbWFwLCBOVVBERSArIHNlZ2luZGV4LCAKKwkJCSAgICBmbGFncykgPT0g TlVMTCkgeworCQkJCS8qIGFsbG9jIGZhaWxlZCwgcmVsZWFzZSBjdXJyZW50ICovCisJCQkJLS1t LT53aXJlX2NvdW50OworCQkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJmNudC52X3dpcmVfY291bnQs IDEpOworCQkJCXZtX3BhZ2VfZnJlZV96ZXJvKG0pOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9 CisJCX0gZWxzZSB7CisJCQlwZyA9IFBIWVNfVE9fVk1fUEFHRShNSVBTX0tTRUcwX1RPX1BIWVMo KnBkZXApKTsKKwkJCXBnLT53aXJlX2NvdW50Kys7CisJCX0KKwkJLyogTmV4dCBsZXZlbCBlbnRy eSAqLworCQlwZGUgPSAocGRfZW50cnlfdCAqKSpwZGVwOworCQlwZGVbcGRlaW5kZXhdID0gKHBk X2VudHJ5X3QpcGFnZXZhOworCQlwbWFwLT5wbV9wdHBoaW50ID0gbTsKKwkJaWYoMClwcmludGYo IlslZF0gcGRlKCVwKVslZF0gPSAlcFxuIiwgcGlkLCBwZGUsIHBkZWluZGV4LCAodm9pZCAqKXBh Z2V2YSk7CisJfQorCXBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50Kys7CisKKwkvKgorCSAq IFNldCB0aGUgcGFnZSB0YWJsZSBoaW50CisJICovCisJcG1hcC0+cG1fcHRwaGludCA9IG07CisJ cmV0dXJuIChtKTsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3B0ZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBwdGVwaW5kZXg7 CisJcGRfZW50cnlfdCAqcGRlOworCXZtX3BhZ2VfdCBtOworCisJS0FTU0VSVCgoZmxhZ3MgJiAo TV9OT1dBSVQgfCBNX1dBSVRPSykpID09IE1fTk9XQUlUIHx8CisJICAgIChmbGFncyAmIChNX05P V0FJVCB8IE1fV0FJVE9LKSkgPT0gTV9XQUlUT0ssCisJICAgICgicG1hcF9hbGxvY3B0ZTogZmxh Z3MgaXMgbmVpdGhlciBNX05PV0FJVCBub3IgTV9XQUlUT0siKSk7CisKKwkvKgorCSAqIENhbGN1 bGF0ZSBwYWdldGFibGUgcGFnZSBpbmRleAorCSAqLworCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3Bp bmRleCh2YSk7CityZXRyeToKKwkvKgorCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkK KwkgKi8KKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisKKwkvKgorCSAqIElmIHRoZSBwYWdl IHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3ZSBqdXN0IGluY3JlbWVudCB0aGUgaG9sZAorCSAqIGNv dW50LCBhbmQgYWN0aXZhdGUgaXQuCisJICovCisJaWYgKHBkZSAhPSBOVUxMICYmICpwZGUgIT0g TlVMTCkgeworCQkvKgorCQkgKiBJbiBvcmRlciB0byBnZXQgdGhlIHBhZ2UgdGFibGUgcGFnZSwg dHJ5IHRoZSBoaW50IGZpcnN0LgorCQkgKi8KKwkJaWYgKHBtYXAtPnBtX3B0cGhpbnQgJiYKKwkJ ICAgIChwbWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0gcHRlcGluZGV4KSkgeworCQkJbSA9IHBt YXAtPnBtX3B0cGhpbnQ7CisJCX0gZWxzZSB7CisJCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNf S1NFRzBfVE9fUEhZUygqcGRlKSk7CisJCQlwbWFwLT5wbV9wdHBoaW50ID0gbTsKKwkJfQorCQlt LT53aXJlX2NvdW50Kys7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGVyZSBpZiB0aGUgcHRlIHBh Z2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorCQkgKiBkZWFsbG9jYXRlZC4KKwkJ ICovCisJCW0gPSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBwdGVwaW5kZXgsIGZsYWdzKTsKKwkJaWYg KG0gPT0gTlVMTCAmJiAoZmxhZ3MgJiBNX1dBSVRPSykpCisJCQlnb3RvIHJldHJ5OworCX0KKwly ZXR1cm4gKG0pOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyogUG1hcCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiByb3V0aW5lcy4K KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisv KgorICogIFJldmlzaW9uIDEuMzk3CisgKiAgLSBNZXJnZWQgcG1hcF9yZWxlYXNlIGFuZCBwbWFw X3JlbGVhc2VfZnJlZV9wYWdlLiAgV2hlbiBwbWFwX3JlbGVhc2UgaXMKKyAqICAgIGNhbGxlZCBv bmx5IHRoZSBwYWdlIGRpcmVjdG9yeSBwYWdlKHMpIGNhbiBiZSBsZWZ0IGluIHRoZSBwbWFwIHB0 ZQorICogICAgb2JqZWN0LCBzaW5jZSBhbGwgcGFnZSB0YWJsZSBwYWdlcyB3aWxsIGhhdmUgYmVl biBmcmVlZCBieQorICogICAgcG1hcF9yZW1vdmVfcGFnZXMgYW5kIHBtYXBfcmVtb3ZlLiAgSW4g YWRkaXRpb24sIHRoZXJlIGNhbiBvbmx5IGJlIG9uZQorICogICAgcmVmZXJlbmNlIHRvIHRoZSBw bWFwIGFuZCB0aGUgcGFnZSBkaXJlY3RvcnkgaXMgd2lyZWQsIHNvIHRoZSBwYWdlKHMpCisgKiAg ICBjYW4gbmV2ZXIgYmUgYnVzeS4gIFNvIGFsbCB0aGVyZSBpcyB0byBkbyBpcyBjbGVhciB0aGUg bWFnaWMgbWFwcGluZ3MKKyAqICAgIGZyb20gdGhlIHBhZ2UgZGlyZWN0b3J5IGFuZCBmcmVlIHRo ZSBwYWdlKHMpLgorICovCisKKworLyoKKyAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBoZWxkIGJ5 IHRoZSBnaXZlbiBwaHlzaWNhbCBtYXAuCisgKiBDYWxsZWQgd2hlbiBhIHBtYXAgaW5pdGlhbGl6 ZWQgYnkgcG1hcF9waW5pdCBpcyBiZWluZyByZWxlYXNlZC4KKyAqIFNob3VsZCBvbmx5IGJlIGNh bGxlZCBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIHZhbGlkIG1hcHBpbmdzLgorICovCit2b2lkCitw bWFwX3JlbGVhc2UocG1hcF90IHBtYXApCit7CisJdm1fb2Zmc2V0X3QgcHRkdmE7CisJdm1fcGFn ZV90IHB0ZHBnOworCisJS0FTU0VSVChwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAw LAorCSAgICAoInBtYXBfcmVsZWFzZTogcG1hcCByZXNpZGVudCBjb3VudCAlbGQgIT0gMCIsCisJ ICAgIHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50KSk7CisKKwlwdGR2YSA9ICh2bV9vZmZz ZXRfdClwbWFwLT5wbV9zZWd0YWI7CisJcHRkcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19LU0VH MF9UT19QSFlTKHB0ZHZhKSk7CisKKwlwdGRwZy0+d2lyZV9jb3VudC0tOworCWF0b21pY19zdWJ0 cmFjdF9pbnQoJmNudC52X3dpcmVfY291bnQsIDEpOworCXZtX3BhZ2VfZnJlZV96ZXJvKHB0ZHBn KTsKKwlQTUFQX0xPQ0tfREVTVFJPWShwbWFwKTsKK30KKworLyoKKyAqIGdyb3cgdGhlIG51bWJl ciBvZiBrZXJuZWwgcGFnZSB0YWJsZSBlbnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1h cF9ncm93a2VybmVsKHZtX29mZnNldF90IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcHRf ZW50cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkcGUsICpwZGU7CisJaW50IGk7CisKKwlpZiAo MCkgcHJpbnRmKCJwbWFwX2dyb3drZXJuZWwsIGFkZHIgJWx4IG1heF9vZmZzZXQgJWx4LCBrZXJu ZWxfdm1fZW5kICVseCwgbmtwdCAlZFxuIiwKKwkgICAgICAgKHVfbG9uZylhZGRyLCAodV9sb25n KWtlcm5lbF9tYXAtPm1heF9vZmZzZXQsICh1X2xvbmcpa2VybmVsX3ZtX2VuZCwgbmtwdCk7CisJ bXR4X2Fzc2VydCgma2VybmVsX21hcC0+c3lzdGVtX210eCwgTUFfT1dORUQpOworCWFkZHIgPSBy b3VuZHVwMihhZGRyLCBQQUdFX1NJWkUgKiBOUFRFUEcpOworCWlmIChhZGRyIC0gMSA+PSBrZXJu ZWxfbWFwLT5tYXhfb2Zmc2V0KQorCQlhZGRyID0ga2VybmVsX21hcC0+bWF4X29mZnNldDsKKwl3 aGlsZSAoa2VybmVsX3ZtX2VuZCA8IGFkZHIpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKGtlcm5l bF9wbWFwLCBrZXJuZWxfdm1fZW5kKTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCS8qIG5ldyBp bnRlcm1lZGlhdGUgcGFnZSB0YWJsZSBlbnRyeSAqLworCQkJbmtwZyA9IHBtYXBfYWxsb2NfcHRl X3BhZ2UobmtwdCwgVk1fQUxMT0NfSU5URVJSVVBUKTsKKwkJCWlmIChua3BnID09IE5VTEwpCisJ CQkJcGFuaWMoInBtYXBfZ3Jvd2tlcm5lbDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7CisJ CQkqcGRwZSA9IChwZF9lbnRyeV90KU1JUFNfUEhZU19UT19LU0VHMChWTV9QQUdFX1RPX1BIWVMo bmtwZykpOworCQkJY29udGludWU7IC8qIHRyeSBhZ2FpbiAqLworCQl9CisKKwkJcGRlID0gcG1h cF9wZHBlX3RvX3BkZShwZHBlLCBrZXJuZWxfdm1fZW5kKTsKKwkJaWYgKCpwZGUgIT0gMCkgewor CQkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1fZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJ CQlpZiAoa2VybmVsX3ZtX2VuZCAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkgeworCQkJ CWtlcm5lbF92bV9lbmQgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OworCQkJCWJyZWFrOworCQkJ fQorCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUaGlzIGluZGV4IGlzIGJvZ3VzLCBi dXQgb3V0IG9mIHRoZSB3YXkKKwkJKi8KKwkJbmtwZyA9IHBtYXBfYWxsb2NfcHRlX3BhZ2Uobmtw dCwgVk1fQUxMT0NfSU5URVJSVVBUKTsKKwkJaWYgKCFua3BnKQorCQkJcGFuaWMoInBtYXBfZ3Jv d2tlcm5lbDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7CisJCW5rcHQrKzsKKwkJKnBkZSA9 IChwZF9lbnRyeV90KU1JUFNfUEhZU19UT19LU0VHMChWTV9QQUdFX1RPX1BIWVMobmtwZykpOwor CisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEds b2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5zbGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVh Y2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVzIGludmFsaWQgZW50cnlzIG11c3QgaGF2ZSB0aGUg R2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkgKiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRz IGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwKKwkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQg dG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICovCisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsK KwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsgaSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CisKKwkJ a2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1fZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlm IChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJu ZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQor fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisqIHBhZ2UgbWFuYWdlbWVudCByb3V0aW5lcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBmcmVlIHRoZSBwdl9lbnRyeSBi YWNrIHRvIHRoZSBmcmVlIGxpc3QKKyAqLworc3RhdGljIFBNQVBfSU5MSU5FIHZvaWQKK2ZyZWVf cHZfZW50cnkocHZfZW50cnlfdCBwdikKK3sKKworCXB2X2VudHJ5X2NvdW50LS07CisJdW1hX3pm cmVlKHB2em9uZSwgcHYpOworfQorCisvKgorICogZ2V0IGEgbmV3IHB2X2VudHJ5LCBhbGxvY2F0 aW5nIGEgYmxvY2sgZnJvbSB0aGUgc3lzdGVtCisgKiB3aGVuIG5lZWRlZC4KKyAqIHRoZSBtZW1v cnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQgYnlwYXNzaW5nIHRoZSBtYWxsb2MgY29kZQorICog YmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YgYWxsb2NhdGlvbnMgYXQgaW50ZXJydXB0IHRp bWUuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitnZXRfcHZfZW50cnkocG1hcF90IGxvY2tlZF9w bWFwKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXZhbCBwcmludGludGVydmFsID0geyA2 MCwgMCB9OworCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBsYXN0cHJpbnQ7CisJc3RydWN0IHZwZ3F1 ZXVlcyAqdnBxOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXBtYXBfdCBwbWFwOworCXB2 X2VudHJ5X3QgYWxsb2NhdGVkX3B2LCBuZXh0X3B2LCBwdjsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2 bV9wYWdlX3QgbTsKKworCVBNQVBfTE9DS19BU1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsK KwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOworCWFsbG9jYXRlZF9w diA9IHVtYV96YWxsb2MocHZ6b25lLCBNX05PV0FJVCk7CisJaWYgKGFsbG9jYXRlZF9wdiAhPSBO VUxMKSB7CisJCXB2X2VudHJ5X2NvdW50Kys7CisJCWlmIChwdl9lbnRyeV9jb3VudCA+IHB2X2Vu dHJ5X2hpZ2hfd2F0ZXIpCisJCQlwYWdlZGFlbW9uX3dha2V1cCgpOworCQllbHNlCisJCQlyZXR1 cm4gKGFsbG9jYXRlZF9wdik7CisJfQorCS8qCisJICogUmVjbGFpbSBwdiBlbnRyaWVzOiBBdCBm aXJzdCwgZGVzdHJveSBtYXBwaW5ncyB0byBpbmFjdGl2ZQorCSAqIHBhZ2VzLiAgQWZ0ZXIgdGhh dCwgaWYgYSBwdiBlbnRyeSBpcyBzdGlsbCBuZWVkZWQsIGRlc3Ryb3kKKwkgKiBtYXBwaW5ncyB0 byBhY3RpdmUgcGFnZXMuCisJICovCisJaWYgKHJhdGVjaGVjaygmbGFzdHByaW50LCAmcHJpbnRp bnRlcnZhbCkpCisJCXByaW50ZigiQXBwcm9hY2hpbmcgdGhlIGxpbWl0IG9uIFBWIGVudHJpZXMs ICIKKwkJICAgICJpbmNyZWFzZSB0aGUgdm0ucG1hcC5zaHBncGVycHJvYyB0dW5hYmxlLlxuIik7 CisJdnBxID0gJnZtX3BhZ2VfcXVldWVzW1BRX0lOQUNUSVZFXTsKK3JldHJ5OgorCVRBSUxRX0ZP UkVBQ0gobSwgJnZwcS0+cGwsIHBhZ2VxKSB7CisJCWlmIChtLT5ob2xkX2NvdW50IHx8IG0tPmJ1 c3kpCisJCQljb250aW51ZTsKKwkJVEFJTFFfRk9SRUFDSF9TQUZFKHB2LCAmbS0+bWQucHZfbGlz dCwgcHZfbGlzdCwgbmV4dF9wdikgeworCQkJdmEgPSBwdi0+cHZfdmE7CisJCQlwbWFwID0gcHYt PnB2X3BtYXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJ CQlpZiAocG1hcCA+IGxvY2tlZF9wbWFwKQorCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCWVsc2Ug aWYgKHBtYXAgIT0gbG9ja2VkX3BtYXAgJiYgIVBNQVBfVFJZTE9DSyhwbWFwKSkKKwkJCQljb250 aW51ZTsKKwkJCXBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50LS07CisJCQlwdGUgPSBwbWFw X3B0ZShwbWFwLCB2YSk7CisJCQlLQVNTRVJUKHB0ZSAhPSBOVUxMLCAoInB0ZSIpKTsKKwkJCW9s ZHB0ZSA9IGxvYWRhbmRjbGVhcigodV9pbnQgKilwdGUpOworCQkJaWYgKGlzX2tlcm5lbF9wbWFw KHBtYXApKQorCQkJCSpwdGUgPSBQVEVfRzsKKwkJCUtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUs IFBURV9XKSwKKwkJCSAgICAoIndpcmVkIHB0ZSBmb3IgdW53aXJlZCBwYWdlIikpOworCQkJaWYg KG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQorCQkJCXZtX3BhZ2VfZmxhZ19zZXQobSwg UEdfUkVGRVJFTkNFRCk7CisJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCXZt X3BhZ2VfZGlydHkobSk7CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQlU QUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwkJCW0tPm1kLnB2 X2xpc3RfY291bnQtLTsKKwkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xp c3QpOworCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgcHYtPnB2X3B0ZW0pOworCQkJaWYgKHBt YXAgIT0gbG9ja2VkX3BtYXApCisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQlpZiAoYWxsb2Nh dGVkX3B2ID09IE5VTEwpCisJCQkJYWxsb2NhdGVkX3B2ID0gcHY7CisJCQllbHNlCisJCQkJZnJl ZV9wdl9lbnRyeShwdik7CisJCX0KKwkJaWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkg eworCQkJdm1fcGFnZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7CisJCQltLT5tZC5wdl9m bGFncyAmPSB+KFBWX1RBQkxFX1JFRiB8IFBWX1RBQkxFX01PRCk7CisJCX0KKwl9CisJaWYgKGFs bG9jYXRlZF9wdiA9PSBOVUxMKSB7CisJCWlmICh2cHEgPT0gJnZtX3BhZ2VfcXVldWVzW1BRX0lO QUNUSVZFXSkgeworCQkJdnBxID0gJnZtX3BhZ2VfcXVldWVzW1BRX0FDVElWRV07CisJCQlnb3Rv IHJldHJ5OworCQl9CisJCXBhbmljKCJnZXRfcHZfZW50cnk6IGluY3JlYXNlIHRoZSB2bS5wbWFw LnNocGdwZXJwcm9jIHR1bmFibGUiKTsKKwl9CisJcmV0dXJuIChhbGxvY2F0ZWRfcHYpOworfQor CisvKgorICogIFJldmlzaW9uIDEuMzcwCisgKgorICogIE1vdmUgcG1hcF9jb2xsZWN0KCkgb3V0 IG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBjb2RlLCByZW5hbWUgaXQKKyAqICB0byByZWZsZWN0 IGl0cyBuZXcgbG9jYXRpb24sIGFuZCBhZGQgcGFnZSBxdWV1ZSBhbmQgZmxhZyBsb2NraW5nLgor ICoKKyAqICBOb3RlczogKDEpIGFscGhhLCBpMzg2LCBhbmQgaWE2NCBoYWQgaWRlbnRpY2FsIGlt cGxlbWVudGF0aW9ucworICogIG9mIHBtYXBfY29sbGVjdCgpIGluIHRlcm1zIG9mIG1hY2hpbmUt aW5kZXBlbmRlbnQgaW50ZXJmYWNlczsKKyAqICAoMikgc3BhcmM2NCBkb2Vzbid0IHJlcXVpcmUg aXQ7ICgzKSBwb3dlcnBjIGhhZCBpdCBhcyBhIFRPRE8uCisgKgorICogIE1JUFMgaW1wbGVtZW50 YXRpb24gd2FzIGlkZW50aWNhbCB0byBhbHBoYSBbSnVub3MgOC4yXQorICovCisKKy8qCisgKiBJ ZiBpdCBpcyB0aGUgZmlyc3QgZW50cnkgb24gdGhlIGxpc3QsIGl0IGlzIGFjdHVhbGx5CisgKiBp biB0aGUgaGVhZGVyIGFuZCB3ZSBtdXN0IGNvcHkgdGhlIGZvbGxvd2luZyBlbnRyeSB1cAorICog dG8gdGhlIGhlYWRlci4gIE90aGVyd2lzZSB3ZSBtdXN0IHNlYXJjaCB0aGUgbGlzdCBmb3IKKyAq IHRoZSBlbnRyeS4gIEluIGVpdGhlciBjYXNlIHdlIGZyZWUgdGhlIG5vdyB1bnVzZWQgZW50cnku CisgKi8KKworc3RhdGljIHB2X2VudHJ5X3QKK3BtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFn ZSAqcHZoLCBwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHZfZW50cnlfdCBwdjsK KworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCW10eF9hc3NlcnQoJnZtX3Bh Z2VfcXVldWVfbXR4LCBNQV9PV05FRCk7CisJaWYgKHB2aC0+cHZfbGlzdF9jb3VudCA8IHBtYXAt PnBtX3N0YXRzLnJlc2lkZW50X2NvdW50KSB7CisJCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2 X2xpc3QsIHB2X2xpc3QpIHsKKwkJCWlmIChwbWFwID09IHB2LT5wdl9wbWFwICYmIHZhID09IHB2 LT5wdl92YSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCVRBSUxRX0ZPUkVBQ0gocHYs ICZwbWFwLT5wbV9wdmxpc3QsIHB2X3BsaXN0KSB7CisJCQlpZiAodmEgPT0gcHYtPnB2X3ZhKQor CQkJCWJyZWFrOworCQl9CisJfQorCWlmIChwdiAhPSBOVUxMKSB7CisJCVRBSUxRX1JFTU9WRSgm cHZoLT5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCXB2aC0+cHZfbGlzdF9jb3VudC0tOworCQlU QUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwl9CisJcmV0dXJu IChwdik7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpw dmgsIHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJ cHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxM LCAoInBtYXBfcHZoX2ZyZWU6IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAo dV9sb25nKVZNX1BBR0VfVE9fUEhZUyhtZW1iZXIyc3RydWN0KHZtX3BhZ2UsIG1kLCBwdmgpKSwK KwkgICAgICh1X2xvbmcpdmEpKTsKKwlmcmVlX3B2X2VudHJ5KHB2KTsKK30KKworc3RhdGljIHZv aWQKK3BtYXBfcmVtb3ZlX2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9wYWdlX3QgbSwgdm1fb2Zmc2V0 X3QgdmEpCit7CisKKwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOwor CXBtYXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJaWYgKFRBSUxRX0VNUFRZKCZtLT5t ZC5wdl9saXN0KSkKKwkJdm1fcGFnZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7Cit9CisK Ky8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSBhIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9v bGVhbl90CitwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnkocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBt cHRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICB2bV9wYWdlX3QgbSkKK3sKKwlwdl9lbnRyeV90IHB2 OworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJbXR4X2Fzc2VydCgmdm1f cGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlpZiAocHZfZW50cnlfY291bnQgPCBwdl9lbnRy eV9oaWdoX3dhdGVyICYmIAorCSAgICAocHYgPSB1bWFfemFsbG9jKHB2em9uZSwgTV9OT1dBSVQp KSAhPSBOVUxMKSB7CisJCXB2X2VudHJ5X2NvdW50Kys7CisJCXB2LT5wdl92YSA9IHZhOworCQlw di0+cHZfcG1hcCA9IHBtYXA7CisJCXB2LT5wdl9wdGVtID0gbXB0ZTsKKwkJcHYtPnB2X3dpcmVk ID0gRkFMU0U7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZwbWFwLT5wbV9wdmxpc3QsIHB2LCBwdl9w bGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7 CisJCW0tPm1kLnB2X2xpc3RfY291bnQrKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJ cmV0dXJuIChGQUxTRSk7Cit9CisKKy8qCisgKiBwbWFwX3JlbW92ZV9wdGU6IGRvIHRoZSB0aGlu Z3MgdG8gdW5tYXAgYSBwYWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMgaW50CitwbWFwX3Jl bW92ZV9wdGUoc3RydWN0IHBtYXAgKnBtYXAsIHB0X2VudHJ5X3QgKnB0cSwgdm1fb2Zmc2V0X3Qg dmEpCit7CisJcHRfZW50cnlfdCBvbGRwdGU7CisJdm1fcGFnZV90IG07CisJdm1fb2Zmc2V0X3Qg cGE7CisKKwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOworCVBNQVBf TE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCisJb2xkcHRlID0gbG9hZGFuZGNsZWFyKCh1 X2ludCAqKXB0cSk7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkqcHRxID0gUFRFX0c7 CisKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQlwbWFwLT5wbV9zdGF0cy53aXJl ZF9jb3VudCAtPSAxOworCisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0gMTsKKwlw YSA9IFRMQkxPX1BURV9UT19QQShvbGRwdGUpOworCisJaWYgKHBhZ2VfaXNfbWFuYWdlZChwYSkp IHsKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQ VEVfRCkpIHsKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKwkJCWlmIChwbWFwX253X21v ZGlmaWVkKG9sZHB0ZSkpIHsKKwkJCQlwcmludGYoCisJCQkJICAgICJwbWFwX3JlbW92ZTogbW9k aWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6IHZhOiAweCV4LCBwdGU6IDB4JXhcbiIsCisJCQkJICAg IHZhLCBvbGRwdGUpOworCQkJfQorI2VuZGlmCisJCQl2bV9wYWdlX2RpcnR5KG0pOworCQl9CisJ CWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKKwkJCXZtX3BhZ2VfZmxhZ19zZXQo bSwgUEdfUkVGRVJFTkNFRCk7CisJCW0tPm1kLnB2X2ZsYWdzICY9IH4oUFZfVEFCTEVfUkVGIHwg UFZfVEFCTEVfTU9EKTsKKworCQlwbWFwX3JlbW92ZV9lbnRyeShwbWFwLCBtLCB2YSk7CisJfQor CXJldHVybiBwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBOVUxMKTsKK30KKworLyoKKyAqIFJlbW92 ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGlj IHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZh KQoreworCXB0X2VudHJ5X3QgKnB0cTsKKworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4 LCBNQV9PV05FRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcHRxID0g cG1hcF9wdGUocG1hcCwgdmEpOworCisJLyoKKwkgKiBpZiB0aGVyZSBpcyBubyBwdGUgZm9yIHRo aXMgYWRkcmVzcywganVzdCBza2lwIGl0ISEhCisJICovCisJaWYgKCFwdHEgfHwgIXB0ZV90ZXN0 KHB0cSwgUFRFX1YpKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxs IGNhY2hlcyBmcm9tIHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hl X3diaW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUpOworCisJLyoKKwkgKiBnZXQgYSBsb2Nh bCB2YSBmb3IgbWFwcGluZ3MgZm9yIHRoaXMgcG1hcC4KKwkgKi8KKwkodm9pZClwbWFwX3JlbW92 ZV9wdGUocG1hcCwgcHRxLCB2YSk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOwor CisJcmV0dXJuOworfQorCisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNz ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhl IHN0YXJ0IGFuZCBlbmQgYXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUu CisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlKHN0cnVjdCBwbWFwICpwbWFwLCB2bV9vZmZzZXRfdCBz dmEsIHZtX29mZnNldF90IGV2YSkKK3sKKwl2bV9vZmZzZXRfdCB2YV9uZXh0OworCXBkX2VudHJ5 X3QgKnBkcGUsICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJaWYgKHBtYXAgPT0gTlVMTCkK KwkJcmV0dXJuOworCisJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ID09IDApCisJ CXJldHVybjsKKworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1hcCk7CisK KwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVtb3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkg Y29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBlYXN5IHRvIHNob3J0IGNpcmN1aXQgc29tZSBjb2Rl LgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9TSVpFKSA9PSBldmEpIHsKKwkJcG1hcF9yZW1vdmVf cGFnZShwbWFwLCBzdmEpOworCQlnb3RvIG91dDsKKwl9CisJZm9yICg7IHN2YSA8IGV2YTsgc3Zh ID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpw ZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlp ZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbmV4 dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisgCisJCXZhX25leHQgPSAoc3ZhICsgTkJQRFIp ICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwor CQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJCWlmICgqcGRlID09IDApCisJ CQljb250aW51ZTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsKKworCQlmb3Ig KDsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLCBzdmEgKz0gUEFHRV9TSVpFKSB7CisJCSAgICAgICBp ZiAoKnB0ZSA9PSAwKQorCQkJICAgICAgIGNvbnRpbnVlOworCQkgICAgICAgcG1hcF9yZW1vdmVf cGFnZShwbWFwLCBzdmEpOworCQl9CisKKyAgICAgICAgfQorb3V0OgorCXZtX3BhZ2VfdW5sb2Nr X3F1ZXVlcygpOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJUm91dGluZToJcG1h cF9yZW1vdmVfYWxsCisgKglGdW5jdGlvbjoKKyAqCQlSZW1vdmVzIHRoaXMgcGh5c2ljYWwgcGFn ZSBmcm9tCisgKgkJYWxsIHBoeXNpY2FsIG1hcHMgaW4gd2hpY2ggaXQgcmVzaWRlcy4KKyAqCQlS ZWZsZWN0cyBiYWNrIG1vZGlmeSBiaXRzIHRvIHRoZSBwYWdlci4KKyAqCisgKglOb3RlczoKKyAq CQlPcmlnaW5hbCB2ZXJzaW9ucyBvZiB0aGlzIHJvdXRpbmUgd2VyZSB2ZXJ5CisgKgkJaW5lZmZp Y2llbnQgYmVjYXVzZSB0aGV5IGl0ZXJhdGl2ZWx5IGNhbGxlZAorICoJCXBtYXBfcmVtb3ZlIChz bG93Li4uKQorICovCisKK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3QgbSkKK3sKKwlw dl9lbnRyeV90IHB2OworCXB0X2VudHJ5X3QgKnB0ZSwgdHB0ZTsKKworCUtBU1NFUlQoKG0tPmZs YWdzICYgUEdfRklDVElUSU9VUykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2Ug JXAgaXMgZmljdGl0aW91cyIsIG0pKTsKKwl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisKKwlpZiAo bS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9SRUYpCisJCXZtX3BhZ2VfZmxhZ19zZXQobSwgUEdf UkVGRVJFTkNFRCk7CisKKwl3aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3Qp KSAhPSBOVUxMKSB7CisJCVBNQVBfTE9DSyhwdi0+cHZfcG1hcCk7CisKKwkJLyoKKwkJICogSWYg aXQncyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbSAKKwkJICogdGhlIHBh Z2UgYmVpbmcgZGVzdHJveWVkCisJIAkgKi8KKwkJaWYgKG0tPm1kLnB2X2xpc3RfY291bnQgPT0g MSkgCisJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0VfU0la RSk7CisKKwkJcHYtPnB2X3BtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50LS07CisKKwkJcHRl ID0gcG1hcF9wdGUocHYtPnB2X3BtYXAsIHB2LT5wdl92YSk7CisKKwkJdHB0ZSA9IGxvYWRhbmRj bGVhcigodV9pbnQgKilwdGUpOworCQlpZiAoaXNfa2VybmVsX3BtYXAocHYtPnB2X3BtYXApKQor CQkJKnB0ZSA9IFBURV9HOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cpKQorCQkJcHYt PnB2X3BtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKwkJLyoKKwkJICogVXBkYXRlIHRo ZSB2bV9wYWdlX3QgY2xlYW4gYW5kIHJlZmVyZW5jZSBiaXRzLgorCQkgKi8KKwkJaWYgKHB0ZV90 ZXN0KCZ0cHRlLCBQVEVfRCkpIHsKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKwkJCWlm IChwbWFwX253X21vZGlmaWVkKHRwdGUpKSB7CisJCQkJcHJpbnRmKAorCQkJCSAgICAicG1hcF9y ZW1vdmVfYWxsOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6IDB4JXgsIHB0ZTogMHgl eFxuIiwKKwkJCQkgICAgcHYtPnB2X3ZhLCB0cHRlKTsKKwkJCX0KKyNlbmRpZgorCQkJdm1fcGFn ZV9kaXJ0eShtKTsKKwkJfQorCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwdi0+cHZfcG1hcCwgcHYt PnB2X3ZhKTsKKworCQlUQUlMUV9SRU1PVkUoJnB2LT5wdl9wbWFwLT5wbV9wdmxpc3QsIHB2LCBw dl9wbGlzdCk7CisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOwor CQltLT5tZC5wdl9saXN0X2NvdW50LS07CisJCXBtYXBfdW51c2VfcHQocHYtPnB2X3BtYXAsIHB2 LT5wdl92YSwgcHYtPnB2X3B0ZW0pOworCQlQTUFQX1VOTE9DSyhwdi0+cHZfcG1hcCk7CisJCWZy ZWVfcHZfZW50cnkocHYpOworCX0KKworCXZtX3BhZ2VfZmxhZ19jbGVhcihtLCBQR19XUklURUFC TEUpOworCW0tPm1kLnB2X2ZsYWdzICY9IH4oUFZfVEFCTEVfUkVGIHwgUFZfVEFCTEVfTU9EKTsK Kwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKK30KKworLyoKKyAqCVNldCB0aGUgcGh5c2ljYWwg cHJvdGVjdGlvbiBvbiB0aGUKKyAqCXNwZWNpZmllZCByYW5nZSBvZiB0aGlzIG1hcCBhcyByZXF1 ZXN0ZWQuCisgKi8KK3ZvaWQKK3BtYXBfcHJvdGVjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg c3ZhLCB2bV9vZmZzZXRfdCBldmEsIHZtX3Byb3RfdCBwcm90KQoreworCXB0X2VudHJ5X3QgKnB0 ZTsKKwlwZF9lbnRyeV90ICpwZHBlLCAqcGRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisKKwlp ZiAocG1hcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKHByb3QgJiBWTV9QUk9UX1JFQUQp ID09IFZNX1BST1RfTk9ORSkgeworCQlwbWFwX3JlbW92ZShwbWFwLCBzdmEsIGV2YSk7CisJCXJl dHVybjsKKwl9CisJaWYgKDApIHByaW50ZigiUE1BUCBwcm90ICVwIC0gJXAgJWRcbiIsICh2b2lk ICopc3ZhLCAodm9pZCAqKWV2YSwgKGludClwcm90KTsKKwlpZiAocHJvdCAmIFZNX1BST1RfV1JJ VEUpCisJCXJldHVybjsKKworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1h cCk7CisJZm9yICg7IHN2YSA8IGV2YTsgc3ZhID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9z ZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3Zh ICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisK KwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKyAgICAgICAgICAgICAgICBp ZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX25leHQgPSBldmE7 CisKKyAgICAgICAgICAgICAgICBwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJ CS8qCisgICAgICAgICAgICAgICAgICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICov CisgICAgICAgICAgICAgICAgaWYgKCpwZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCisgICAgICAg ICAgICAgICAgaWYgKHZhX25leHQgPiBldmEpCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9u ZXh0ID0gZXZhOworCisgICAgICAgICAgICAgICAgZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUo cGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCQkgICAgIHN2YSArPSBQQUdFX1NJ WkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0X2VudHJ5X3Qgb2JpdHMsIHBiaXRzOwor ICAgICAgICAgICAgICAgICAgICAgICAgdm1fcGFnZV90IG07CisJCQl2bV9wYWRkcl90IHBhOwor CityZXRyeToKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpCisJCQkJY29udGludWU7CisK KwkJCW9iaXRzID0gcGJpdHMgPSAqcHRlOworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocGJpdHMp OworCisJCQlpZiAocGFnZV9pc19tYW5hZ2VkKHBhKSAmJiBwdGVfdGVzdCgmcGJpdHMsIFBURV9E KSkgeworCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCQkJCXZtX3BhZ2VfZGlydHkobSk7 CisJCQkJbS0+bWQucHZfZmxhZ3MgJj0gflBWX1RBQkxFX01PRDsKKwkJCX0KKwkJCXB0ZV9jbGVh cigmcGJpdHMsIFBURV9EKTsKKwkJCXB0ZV9zZXQoJnBiaXRzLCBQVEVfUk8pOworCisJCQlpZiAo cGJpdHMgIT0gKnB0ZSkgeworCQkJCWlmICghYXRvbWljX2NtcHNldF9pbnQoKHVfaW50ICopcHRl LCBvYml0cywgcGJpdHMpKQorCQkJCQlnb3RvIHJldHJ5OworCQkJCXBtYXBfdXBkYXRlX3BhZ2Uo cG1hcCwgc3ZhLCBwYml0cyk7CisJCQl9CisJCX0KKwl9CisJdm1fcGFnZV91bmxvY2tfcXVldWVz KCk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKglJbnNlcnQgdGhlIGdpdmVuIHBo eXNpY2FsIHBhZ2UgKHApIGF0CisgKgl0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyAodikg aW4gdGhlCisgKgl0YXJnZXQgcGh5c2ljYWwgbWFwIHdpdGggdGhlIHByb3RlY3Rpb24gcmVxdWVz dGVkLgorICoKKyAqCUlmIHNwZWNpZmllZCwgdGhlIHBhZ2Ugd2lsbCBiZSB3aXJlZCBkb3duLCBt ZWFuaW5nCisgKgl0aGF0IHRoZSByZWxhdGVkIHB0ZSBjYW4gbm90IGJlIHJlY2xhaW1lZC4KKyAq CisgKglOQjogIFRoaXMgaXMgdGhlIG9ubHkgcm91dGluZSB3aGljaCBNQVkgTk9UIGxhenktZXZh bHVhdGUKKyAqCW9yIGxvc2UgaW5mb3JtYXRpb24uICBUaGF0IGlzLCB0aGlzIHJvdXRpbmUgbXVz dCBhY3R1YWxseQorICoJaW5zZXJ0IHRoaXMgcGFnZSBpbnRvIHRoZSBnaXZlbiBtYXAgTk9XLgor ICovCit2b2lkCitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcHJv dF90IGFjY2Vzcywgdm1fcGFnZV90IG0sCisgICAgdm1fcHJvdF90IHByb3QsIGJvb2xlYW5fdCB3 aXJlZCkKK3sKKwl2bV9vZmZzZXRfdCBwYSwgb3BhOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwdF9l bnRyeV90IG9yaWdwdGUsIG5ld3B0ZTsKKwlwdl9lbnRyeV90IHB2OworCXZtX3BhZ2VfdCBtcHRl LCBvbTsKKwlpbnQgcncgPSAwOworCWludCBkZWJ1ZyA9IDA7IC8qdmEgPCBWTV9NQVhVU0VSX0FE RFJFU1M7Ki8KKwlpbnQgcGlkID0gY3VydGhyZWFkLT50ZF9wcm9jLT5wX3BpZDsKKworCWlmIChw bWFwID09IE5VTEwpIHsKKwkJcHJpbnRmKCJOdWxsIHBtcFxuIik7CisJCXJldHVybjsKKwl9CisJ aWYgKGRlYnVnKQorCQlwcmludGYoIlslZF1WQSAlbHggcGFnZSAlcFxuIiwgcGlkLCAodV9sb25n KXZhLCBtKTsKKworCXZhICY9IH5QQUdFX01BU0s7CisgCUtBU1NFUlQodmEgPD0gVk1fTUFYX0tF Uk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2JpZyIpKTsKKwlLQVNTRVJUKChtLT5mbGFn cyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgIT0gMCB8fAorCSAgICAobS0+b2Zs YWdzICYgVlBPX0JVU1kpICE9IDAsCisJICAgICgicG1hcF9lbnRlcjogcGFnZSAlcCBpcyBub3Qg YnVzeSIsIG0pKTsKKworCW1wdGUgPSBOVUxMOworCisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOwor CVBNQVBfTE9DSyhwbWFwKTsKKworCS8qCisJICogSW4gdGhlIGNhc2UgdGhhdCBhIHBhZ2UgdGFi bGUgcGFnZSBpcyBub3QgcmVzaWRlbnQsIHdlIGFyZQorCSAqIGNyZWF0aW5nIGl0IGhlcmUuCisJ ICovCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CisJCW1wdGUgPSBwbWFwX2FsbG9j cHRlKHBtYXAsIHZhLCBNX1dBSVRPSyk7CisJfQorCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsK KworCS8qCisJICogUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVk IGEgbmV3IFBUIHBhZ2UKKwkgKi8KKwlpZiAocHRlID09IE5VTEwpIHsKKwkJcGFuaWMoInBtYXBf ZW50ZXI6IGludmFsaWQgcGFnZSBkaXJlY3RvcnksIHBkaXI9JXAsIHZhPSVwXG4iLAorCQkgICAg KHZvaWQgKilwbWFwLT5wbV9zZWd0YWIsICh2b2lkICopdmEpOworCX0KKwlwYSA9IFZNX1BBR0Vf VE9fUEhZUyhtKTsKKwlvbSA9IE5VTEw7CisJb3JpZ3B0ZSA9ICpwdGU7CisJb3BhID0gVExCTE9f UFRFX1RPX1BBKG9yaWdwdGUpOworCisJLyoKKwkgKiBNYXBwaW5nIGhhcyBub3QgY2hhbmdlZCwg bXVzdCBiZSBwcm90ZWN0aW9uIG9yIHdpcmluZyBjaGFuZ2UuCisJICovCisJaWYgKHB0ZV90ZXN0 KCZvcmlncHRlLCBQVEVfVikgJiYgb3BhID09IHBhKSB7CisJCS8qCisJCSAqIFdpcmluZyBjaGFu Z2UsIGp1c3QgdXBkYXRlIHN0YXRzLiBXZSBkb24ndCB3b3JyeSBhYm91dAorCQkgKiB3aXJpbmcg UFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorCQkgKiBh cmUgdmFsaWQgbWFwcGluZ3MgaW4gdGhlbS4gSGVuY2UsIGlmIGEgdXNlciBwYWdlIGlzCisJCSAq IHdpcmVkLCB0aGUgUFQgcGFnZSB3aWxsIGJlIGFsc28uCisJCSAqLworCQlpZiAod2lyZWQgJiYg IXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisJCQlwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3Vu dCsrOworCQllbHNlIGlmICghd2lyZWQgJiYgcHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9XKSkKKwkJ CXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05P U1RJQykKKwkJaWYgKHBtYXBfbndfbW9kaWZpZWQob3JpZ3B0ZSkpIHsKKwkJCXByaW50ZigKKwkJ CSAgICAicG1hcF9lbnRlcjogbW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6IHZhOiAweCV4LCBw dGU6IDB4JXhcbiIsCisJCQkgICAgdmEsIG9yaWdwdGUpOworCQl9CisjZW5kaWYKKwkJLyoKKwkJ ICogUmVtb3ZlIGV4dHJhIHB0ZSByZWZlcmVuY2UKKwkJICovCisJCWlmIChtcHRlKQorCQkJbXB0 ZS0+d2lyZV9jb3VudC0tOworCisJCWlmIChwYWdlX2lzX21hbmFnZWQob3BhKSkgeworCQkJb20g PSBtOworCQl9CisJCWdvdG8gdmFsaWRhdGU7CisJfQorCisJcHYgPSBOVUxMOworCisJLyoKKwkg KiBNYXBwaW5nIGhhcyBjaGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJv dWdoIHRvCisJICogaGFuZGxlIHZhbGlkYXRpbmcgbmV3IG1hcHBpbmcuCisJICovCisJaWYgKG9w YSkgeworCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9XKSkKKwkJCXBtYXAtPnBtX3N0YXRz LndpcmVkX2NvdW50LS07CisKKwkJaWYgKHBhZ2VfaXNfbWFuYWdlZChvcGEpKSB7CisJCQlvbSA9 IFBIWVNfVE9fVk1fUEFHRShvcGEpOworCQkJcHYgPSBwbWFwX3B2aF9yZW1vdmUoJm9tLT5tZCwg cG1hcCwgdmEpOworCQl9CisJCWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCW1wdGUtPndpcmVfY291 bnQtLTsKKwkJCUtBU1NFUlQobXB0ZS0+d2lyZV9jb3VudCA+IDAsCisJCQkgICAgKCJwbWFwX2Vu dGVyOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorCQkJICAgICIgdmE6 ICVwIiwgKHZvaWQgKil2YSkpOworCQl9CisJfSBlbHNlCisJCXBtYXAtPnBtX3N0YXRzLnJlc2lk ZW50X2NvdW50Kys7CisKKwkvKgorCSAqIEVudGVyIG9uIHRoZSBQViBsaXN0IGlmIHBhcnQgb2Yg b3VyIG1hbmFnZWQgbWVtb3J5LiBOb3RlIHRoYXQgd2UKKwkgKiByYWlzZSBJUEwgd2hpbGUgbWFu aXB1bGF0aW5nIHB2X3RhYmxlIHNpbmNlIHBtYXBfZW50ZXIgY2FuIGJlCisJICogY2FsbGVkIGF0 IGludGVycnVwdCB0aW1lLgorCSAqLworCWlmICgobS0+ZmxhZ3MgJiAoUEdfRklDVElUSU9VUyB8 IFBHX1VOTUFOQUdFRCkpID09IDApIHsKKwkJS0FTU0VSVCh2YSA8IGttaS5jbGVhbl9zdmEgfHwg dmEgPj0ga21pLmNsZWFuX2V2YSwKKwkJICAgICgicG1hcF9lbnRlcjogbWFuYWdlZCBtYXBwaW5n IHdpdGhpbiB0aGUgY2xlYW4gc3VibWFwIikpOworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2ID0g Z2V0X3B2X2VudHJ5KHBtYXApOworCQlwdi0+cHZfdmEgPSB2YTsKKwkJcHYtPnB2X3BtYXAgPSBw bWFwOworCQlwdi0+cHZfcHRlbSA9IG1wdGU7CisJCXB2LT5wdl93aXJlZCA9IHdpcmVkOworCQlU QUlMUV9JTlNFUlRfVEFJTCgmcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxpc3QpOworCQlUQUlM UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQltLT5tZC5wdl9s aXN0X2NvdW50Kys7CisJfSBlbHNlIGlmIChwdiAhPSBOVUxMKQorCQlmcmVlX3B2X2VudHJ5KHB2 KTsKKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzCisJICovCisJaWYgKHdpcmVkKQorCQlw bWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworCit2YWxpZGF0ZToKKwlpZiAoKGFjY2VzcyAm IFZNX1BST1RfV1JJVEUpICE9IDApCisJCW0tPm1kLnB2X2ZsYWdzIHw9IFBWX1RBQkxFX01PRCB8 IFBWX1RBQkxFX1JFRjsKKwlydyA9IGluaXRfcHRlX3Byb3QodmEsIG0sIHByb3QpOworCisjaWZk ZWYgUE1BUF9ERUJVRworCXByaW50ZigiWyVkXSBwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAl cFxuIiwgcGlkLCAodm9pZCAqKXZhLCAodm9pZCAqKXBhKTsKKyNlbmRpZgorCS8qCisJICogTm93 IHZhbGlkYXRlIG1hcHBpbmcgd2l0aCBkZXNpcmVkIHByb3RlY3Rpb24vd2lyaW5nLgorCSAqLwor CW5ld3B0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBydyB8IFBURV9WOworCisJaWYgKGlzX2Nh Y2hlYWJsZV9tZW0ocGEpKQorCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJZWxzZQorCQluZXdw dGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisKKwlpZiAod2lyZWQpCisJCW5ld3B0ZSB8PSBQVEVfVzsK KworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7 CisKKwkvKgorCSAqIGlmIHRoZSBtYXBwaW5nIG9yIHBlcm1pc3Npb24gYml0cyBhcmUgZGlmZmVy ZW50LCB3ZSBuZWVkIHRvCisJICogdXBkYXRlIHRoZSBwdGUuCisJICovCisJaWYgKG9yaWdwdGUg IT0gbmV3cHRlKSB7CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpKSB7CisJCQkqcHRl ID0gbmV3cHRlOworCQkJaWYgKHBhZ2VfaXNfbWFuYWdlZChvcGEpICYmIChvcGEgIT0gcGEpKSB7 CisJCQkJaWYgKG9tLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKKwkJCQkJdm1fcGFnZV9m bGFnX3NldChvbSwgUEdfUkVGRVJFTkNFRCk7CisJCQkJb20tPm1kLnB2X2ZsYWdzICY9CisJCQkJ ICAgIH4oUFZfVEFCTEVfUkVGIHwgUFZfVEFCTEVfTU9EKTsKKwkJCX0KKwkJCWlmIChwdGVfdGVz dCgmb3JpZ3B0ZSwgUFRFX0QpKSB7CisJCQkJS0FTU0VSVCghcHRlX3Rlc3QoJm9yaWdwdGUsIFBU RV9STyksCisJCQkJICAgICgicG1hcF9lbnRlcjogbW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6 IgorCQkJCSAgICAiIHZhOiAlcCwgcHRlOiAweCV4IiwgKHZvaWQgKil2YSwgb3JpZ3B0ZSkpOwor CQkJCWlmIChwYWdlX2lzX21hbmFnZWQob3BhKSkKKwkJCQkJdm1fcGFnZV9kaXJ0eShvbSk7CisJ CQl9CisJCQlpZiAocGFnZV9pc19tYW5hZ2VkKG9wYSkgJiYKKwkJCSAgICBUQUlMUV9FTVBUWSgm b20tPm1kLnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfZmxhZ19jbGVhcihvbSwgUEdfV1JJVEVBQkxF KTsKKwkJfSBlbHNlIHsKKwkJCSpwdGUgPSBuZXdwdGU7CisJCX0KKwl9CisJcG1hcF91cGRhdGVf cGFnZShwbWFwLCB2YSwgbmV3cHRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9y IGV4ZWN1dGFibGUgcGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlIHRoZQorCSAqIHRhcmdldCBw bWFwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKwkgKiB1 bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorCSAqLworCWlmICghaXNfa2VybmVsX3Bt YXAocG1hcCkgJiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkg ICAgKHByb3QgJiBWTV9QUk9UX0VYRUNVVEUpKSB7CisJCW1pcHNfaWNhY2hlX3N5bmNfcmFuZ2Uo dmEsIFBBR0VfU0laRSk7CisJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhLCBQQUdFX1NJWkUp OworCX0KKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlp ZiAoZGVidWcpIHsKKwkJaW50IGksIGosIGs7CisJCXBkX2VudHJ5X3QgKnAxOworCSAgICAgICAJ cHRfZW50cnlfdCAqcDI7CisKKwkJaSA9IHBtYXBfc2VnX2luZGV4KHZhKTsKKwkJcDEgPSAocGRf ZW50cnlfdCAqKXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaiA9IHBtYXBfcGRlX2luZGV4KHZhKTsK KwkJcDIgPSAocHRfZW50cnlfdCAqKXAxW2pdOworCQlrID0gcG1hcF9wdGVfaW5kZXgodmEpOwor CisJCXByaW50Zigic2VnbWFwWyVkXSA9ICVwLCBwZGVbJWRdID0gJXAgcHRlWyVkXSA9ICV4XG4i LAorCQkJaSwgcDEsIGosIHAyLCBrICwgcDJba10pOworCQlwcmludGYoInBtYXAgZW50ZXIgLSAl cCAleCAtPiAleCBkb25lXG4iLCBwdGUsIG9yaWdwdGUsIG5ld3B0ZSk7CisJfQorfQorCisvKgor ICogdGhpcyBjb2RlIG1ha2VzIHNvbWUgKk1BSk9SKiBhc3N1bXB0aW9uczoKKyAqIDEuIEN1cnJl bnQgcG1hcCAmIHBtYXAgZXhpc3RzLgorICogMi4gTm90IHdpcmVkLgorICogMy4gUmVhZCBhY2Nl c3MuCisgKiA0LiBObyBwYWdlIHRhYmxlIHBhZ2VzLgorICogYnV0IGlzICpNVUNIKiBmYXN0ZXIg dGhhbiBwbWFwX2VudGVyLi4uCisgKi8KKwordm9pZAorcG1hcF9lbnRlcl9xdWljayhwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCkKK3sKKwor CXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1hcCk7CisJKHZvaWQpcG1hcF9l bnRlcl9xdWlja19sb2NrZWQocG1hcCwgdmEsIG0sIHByb3QsIE5VTEwpOworCXZtX3BhZ2VfdW5s b2NrX3F1ZXVlcygpOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMgdm1fcGFnZV90 CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZt X3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSkKK3sKKwlwdF9l bnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0X3QgcGE7CisKKwlLQVNTRVJUKHZhIDwga21pLmNsZWFu X3N2YSB8fCB2YSA+PSBrbWkuY2xlYW5fZXZhIHx8CisJICAgIChtLT5mbGFncyAmIChQR19GSUNU SVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgIT0gMCwKKwkgICAgKCJwbWFwX2VudGVyX3F1aWNrX2xv Y2tlZDogbWFuYWdlZCBtYXBwaW5nIHdpdGhpbiB0aGUgY2xlYW4gc3VibWFwIikpOworCW10eF9h c3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4LCBNQV9PV05FRCk7CisJUE1BUF9MT0NLX0FTU0VSVChw bWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIEluIHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxl IHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3ZSBhcmUKKwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAq LworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJ CXVuc2lnbmVkIHB0ZXBpbmRleDsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBh Z2UgaW5kZXgKKwkJICovCisJCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlm IChtcHRlICYmIChtcHRlLT5waW5kZXggPT0gcHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9j b3VudCsrOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3Rvcnkg ZW50cnkKKwkJCSAqLworCQkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJ ICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3Jl bWVudCB0aGUgaG9sZCBjb3VudCwgYW5kIGFjdGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRl ICYmICpwZGUgIT0gMCkgeworCQkJCWlmIChwbWFwLT5wbV9wdHBoaW50ICYmCisJCQkJICAgIChw bWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0gcHRlcGluZGV4KSkgeworCQkJCQltcHRlID0gcG1h cC0+cG1fcHRwaGludDsKKwkJCQl9IGVsc2UgeworCQkJCQltcHRlID0gUEhZU19UT19WTV9QQUdF KAorCQkJCQkJTUlQU19LU0VHMF9UT19QSFlTKCpwZGUpKTsKKwkJCQkJcG1hcC0+cG1fcHRwaGlu dCA9IG1wdGU7CisJCQkJfQorCQkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJ CQkJbXB0ZSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBpbmRleCwKKwkJCQkgICAgTV9OT1dB SVQpOworCQkJCWlmIChtcHRlID09IE5VTEwpCisJCQkJCXJldHVybiAobXB0ZSk7CisJCQl9CisJ CX0KKwl9IGVsc2UgeworCQltcHRlID0gTlVMTDsKKwl9CisKKwlwdGUgPSBwbWFwX3B0ZShwbWFw LCB2YSk7CisJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7CisJCWlmIChtcHRlICE9IE5VTEwp IHsKKwkJCW1wdGUtPndpcmVfY291bnQtLTsKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJCXJldHVy biAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBFbnRlciBvbiB0aGUgUFYgbGlzdCBpZiBwYXJ0IG9m IG91ciBtYW5hZ2VkIG1lbW9yeS4KKwkgKi8KKwlpZiAoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElP VVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNlcnRfcHZfZW50 cnkocG1hcCwgbXB0ZSwgdmEsIG0pKSB7CisJCWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCXBtYXBf dW53aXJlX3B0ZV9ob2xkKHBtYXAsIHZhLCBtcHRlKTsKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJ CXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8K KwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCsrOworCisJcGEgPSBWTV9QQUdFX1RPX1BI WVMobSk7CisKKwkvKgorCSAqIE5vdyB2YWxpZGF0ZSBtYXBwaW5nIHdpdGggUk8gcHJvdGVjdGlv bgorCSAqLworCSpwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1Y7CisKKwlpZiAoaXNf Y2FjaGVhYmxlX21lbShwYSkpCisJCSpwdGUgfD0gUFRFX0NfQ0FDSEU7CisJZWxzZQorCQkqcHRl IHw9IFBURV9DX1VOQ0FDSEVEOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkqcHRl IHw9IFBURV9HOworCWVsc2UgeworCQkqcHRlIHw9IFBURV9STzsKKwkJLyoKKwkJICogU3luYyBJ ICYgRCBjYWNoZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlIHRoZSB0YXJnZXQgcG1hcAorCQkgKiBi ZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGFuCisJCSAqIHVucmVz b2x2YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIuICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5w X3Ztc3BhY2UtPnZtX3BtYXApIHsKKwkJCXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNo ZV9zeW5jX3JhbmdlKHZhLCBQQUdFX1NJWkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Uo dmEsIFBBR0VfU0laRSk7CisJCX0KKwl9CisJcmV0dXJuIChtcHRlKTsKK30KKworLyoKKyAqIE1h a2UgYSB0ZW1wb3JhcnkgbWFwcGluZyBmb3IgYSBwaHlzaWNhbCBhZGRyZXNzLiAgVGhpcyBpcyBv bmx5IGludGVuZGVkCisgKiB0byBiZSB1c2VkIGZvciBwYW5pYyBkdW1wcy4KKyAqCisgKiBVc2Ug WEtQSFlTIGZvciA2NCBiaXQsIGFuZCBLU0VHMCB3aGVyZSBwb3NzaWJsZSBmb3IgMzIgYml0Lgor ICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2bV9wYWRkcl90IHBhLCBpbnQgaSkK K3sKKwlyZXR1cm4gKCh2b2lkICopTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGEpKTsKK30K K3ZvaWQKK3BtYXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpCit7Cit9CisK Ky8qCisgKiBNb3ZlZCB0aGUgY29kZSB0byBNYWNoaW5lIEluZGVwZW5kZW50CisgKgkgdm1fbWFw X3BtYXBfZW50ZXIoKQorICovCisKKy8qCisgKiBNYXBzIGEgc2VxdWVuY2Ugb2YgcmVzaWRlbnQg cGFnZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9iamVjdC4KKyAqIFRoZSBzZXF1ZW5jZSBiZWdp bnMgd2l0aCB0aGUgZ2l2ZW4gcGFnZSBtX3N0YXJ0LiAgVGhpcyBwYWdlIGlzCisgKiBtYXBwZWQg YXQgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcyBzdGFydC4gIEVhY2ggc3Vic2VxdWVudCBwYWdl IGlzCisgKiBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBpcyBvZmZzZXQgZnJvbSBz dGFydCBieSB0aGUgc2FtZQorICogYW1vdW50IGFzIHRoZSBwYWdlIGlzIG9mZnNldCBmcm9tIG1f c3RhcnQgd2l0aGluIHRoZSBvYmplY3QuICBUaGUKKyAqIGxhc3QgcGFnZSBpbiB0aGUgc2VxdWVu Y2UgaXMgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFyZ2VzdCBvZmZzZXQgZnJvbQorICogbV9zdGFydCB0 aGF0IGNhbiBiZSBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3MgbGVzcyB0aGFuIHRoZSBnaXZl bgorICogdmlydHVhbCBhZGRyZXNzIGVuZC4gIE5vdCBldmVyeSB2aXJ0dWFsIHBhZ2UgYmV0d2Vl biBzdGFydCBhbmQgZW5kCisgKiBpcyBtYXBwZWQ7IG9ubHkgdGhvc2UgZm9yIHdoaWNoIGEgcmVz aWRlbnQgcGFnZSBleGlzdHMgd2l0aCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IGZyb20g bV9zdGFydCBhcmUgbWFwcGVkLgorICovCit2b2lkCitwbWFwX2VudGVyX29iamVjdChwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3Qgc3RhcnQsIHZtX29mZnNldF90IGVuZCwKKyAgICB2bV9wYWdlX3Qg bV9zdGFydCwgdm1fcHJvdF90IHByb3QpCit7CisJdm1fcGFnZV90IG0sIG1wdGU7CisJdm1fcGlu ZGV4X3QgZGlmZiwgcHNpemU7CisKKwlWTV9PQkpFQ1RfTE9DS19BU1NFUlQobV9zdGFydC0+b2Jq ZWN0LCBNQV9PV05FRCk7CisJcHNpemUgPSBhdG9wKGVuZCAtIHN0YXJ0KTsKKwltcHRlID0gTlVM TDsKKwltID0gbV9zdGFydDsKKwl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisJUE1BUF9MT0NLKHBt YXApOworCXdoaWxlIChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5w aW5kZXgpIDwgcHNpemUpIHsKKwkJbXB0ZSA9IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAs IHN0YXJ0ICsgcHRvYShkaWZmKSwgbSwKKwkJICAgIHByb3QsIG1wdGUpOworCQltID0gVEFJTFFf TkVYVChtLCBsaXN0cSk7CisJfQorCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworIAlQTUFQX1VO TE9DSyhwbWFwKTsKK30KKworLyoKKyAqIHBtYXBfb2JqZWN0X2luaXRfcHQgcHJlbG9hZHMgdGhl IHB0ZXMgZm9yIGEgZ2l2ZW4gb2JqZWN0CisgKiBpbnRvIHRoZSBzcGVjaWZpZWQgcG1hcC4gIFRo aXMgZWxpbWluYXRlcyB0aGUgYmxhc3Qgb2Ygc29mdAorICogZmF1bHRzIG9uIHByb2Nlc3Mgc3Rh cnR1cCBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gbW1hcC4KKyAqLwordm9pZAorcG1hcF9vYmpl Y3RfaW5pdF9wdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgYWRkciwKKyAgICB2bV9vYmplY3Rf dCBvYmplY3QsIHZtX3BpbmRleF90IHBpbmRleCwgdm1fc2l6ZV90IHNpemUpCit7CisJVk1fT0JK RUNUX0xPQ0tfQVNTRVJUKG9iamVjdCwgTUFfT1dORUQpOworCUtBU1NFUlQob2JqZWN0LT50eXBl ID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBPQkpUX1NHLAorCSAgICAoInBtYXBf b2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0IikpOworfQorCisvKgorICoJUm91dGlu ZToJcG1hcF9jaGFuZ2Vfd2lyaW5nCisgKglGdW5jdGlvbjoJQ2hhbmdlIHRoZSB3aXJpbmcgYXR0 cmlidXRlIGZvciBhIG1hcC92aXJ0dWFsLWFkZHJlc3MKKyAqCQkJcGFpci4KKyAqCUluL291dCBj b25kaXRpb25zOgorICoJCQlUaGUgbWFwcGluZyBtdXN0IGFscmVhZHkgZXhpc3QgaW4gdGhlIHBt YXAuCisgKi8KK3ZvaWQKK3BtYXBfY2hhbmdlX3dpcmluZyhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIGJvb2xlYW5fdCB3aXJlZCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlpZiAocG1h cCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcHRlID0gcG1hcF9w dGUocG1hcCwgdmEpOworCisJaWYgKHdpcmVkICYmICFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJ cG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQrKzsKKwllbHNlIGlmICghd2lyZWQgJiYgcHRlX3Rl c3QocHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKwkvKgor CSAqIFdpcmluZyBpcyBub3QgYSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpYyBzbyB0aGVyZSBpcyBu byBuZWVkIHRvCisJICogaW52YWxpZGF0ZSBUTEIuCisJICovCisJaWYgKHdpcmVkKQorCQlwdGVf c2V0KHB0ZSwgUFRFX1cpOworCWVsc2UKKwkJcHRlX2NsZWFyKHB0ZSwgUFRFX1cpOworCVBNQVBf VU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ29weSB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHNy Y19hZGRyL2xlbgorICoJZnJvbSB0aGUgc291cmNlIG1hcCB0byB0aGUgcmFuZ2UgZHN0X2FkZHIv bGVuCisgKglpbiB0aGUgZGVzdGluYXRpb24gbWFwLgorICoKKyAqCVRoaXMgcm91dGluZSBpcyBv bmx5IGFkdmlzb3J5IGFuZCBuZWVkIG5vdCBkbyBhbnl0aGluZy4KKyAqLworCit2b2lkCitwbWFw X2NvcHkocG1hcF90IGRzdF9wbWFwLCBwbWFwX3Qgc3JjX3BtYXAsIHZtX29mZnNldF90IGRzdF9h ZGRyLAorICAgIHZtX3NpemVfdCBsZW4sIHZtX29mZnNldF90IHNyY19hZGRyKQoreworfQorCisv KgorICoJcG1hcF96ZXJvX3BhZ2UgemVyb3MgdGhlIHNwZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5 IG1hcHBpbmcKKyAqCXRoZSBwYWdlIGludG8gS1ZNIGFuZCB1c2luZyBiemVybyB0byBjbGVhciBp dHMgY29udGVudHMuCisgKgorICogCVVzZSBYS1BIWVMgZm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdo ZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCisgKi8KK3ZvaWQKK3BtYXBfemVyb19wYWdlKHZtX3Bh Z2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0Vf VE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJ Ynplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Uo dmEsIFBBR0VfU0laRSk7Cit9CisKKy8qCisgKglwbWFwX3plcm9fcGFnZV9hcmVhIHplcm9zIHRo ZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFnZSBieSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtW TSBhbmQgdXNpbmcgYnplcm8gdG8gY2xlYXIgaXRzIGNvbnRlbnRzLgorICoKKyAqCW9mZiBhbmQg c2l6ZSBtYXkgbm90IGNvdmVyIGFuIGFyZWEgYmV5b25kIGEgc2luZ2xlIGhhcmR3YXJlIHBhZ2Uu CisgKi8KK3ZvaWQKK3BtYXBfemVyb19wYWdlX2FyZWEodm1fcGFnZV90IG0sIGludCBvZmYsIGlu dCBzaXplKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0Vf VE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJ Ynplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2Jp bnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOworfQorCit2b2lkCitwbWFwX3plcm9fcGFnZV9pZGxl KHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZN X1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5 cyk7CisJYnplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZf cmFuZ2UodmEsIFBBR0VfU0laRSk7Cit9CisKKy8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMg dGhlIHNwZWNpZmllZCAobWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0 aGUgcGFnZSBpbnRvIHZpcnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0 aGUgcGFnZSwgb25lIG1hY2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisg KiAJVXNlIFhLUEhZUyBmb3IgNjQgYml0LCBhbmQgS1NFRzAgd2hlcmUgcG9zc2libGUgZm9yIDMy IGJpdC4KKyAqLwordm9pZAorcG1hcF9jb3B5X3BhZ2Uodm1fcGFnZV90IHNyYywgdm1fcGFnZV90 IGRzdCkKK3sKKwl2bV9vZmZzZXRfdCB2YV9zcmMsIHZhX2RzdDsKKwl2bV9wYWRkcl90IHBoeV9z cmMgPSBWTV9QQUdFX1RPX1BIWVMoc3JjKTsKKwl2bV9wYWRkcl90IHBoeV9kc3QgPSBWTV9QQUdF X1RPX1BIWVMoZHN0KTsKKworCXBtYXBfZmx1c2hfcHZjYWNoZShzcmMpOworCW1pcHNfZGNhY2hl X3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9kc3QpLCBQ QUdFX1NJWkUpOworCXZhX3NyYyA9IE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9zcmMp OworCXZhX2RzdCA9IE1JUFNfUEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9kc3QpOworCWJjb3B5 KChjYWRkcl90KXZhX3NyYywgKGNhZGRyX3QpdmFfZHN0LCBQQUdFX1NJWkUpOworCW1pcHNfZGNh Y2hlX3diaW52X3JhbmdlKHZhX2RzdCwgUEFHRV9TSVpFKTsKK30KKworLyoKKyAqIFJldHVybnMg dHJ1ZSBpZiB0aGUgcG1hcCdzIHB2IGlzIG9uZSBvZiB0aGUgZmlyc3QKKyAqIDE2IHB2cyBsaW5r ZWQgdG8gZnJvbSB0aGlzIHBhZ2UuICBUaGlzIGNvdW50IG1heQorICogYmUgY2hhbmdlZCB1cHdh cmRzIG9yIGRvd253YXJkcyBpbiB0aGUgZnV0dXJlOyBpdAorICogaXMgb25seSBuZWNlc3Nhcnkg dGhhdCB0cnVlIGJlIHJldHVybmVkIGZvciBhIHNtYWxsCisgKiBzdWJzZXQgb2YgcG1hcHMgZm9y IHByb3BlciBwYWdlIGFnaW5nLgorICovCitib29sZWFuX3QKK3BtYXBfcGFnZV9leGlzdHNfcXVp Y2socG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtKQoreworCXB2X2VudHJ5X3QgcHY7CisJaW50IGxv b3BzID0gMDsKKwlib29sZWFuX3QgcnY7CisKKwlLQVNTRVJUKChtLT5mbGFncyAmIChQR19GSUNU SVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkgICAgKCJwbWFwX3BhZ2VfZXhpc3RzX3F1 aWNrOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCXJ2ID0gRkFMU0U7CisJdm1fcGFn ZV9sb2NrX3F1ZXVlcygpOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9s aXN0KSB7CisJCWlmIChwdi0+cHZfcG1hcCA9PSBwbWFwKSB7CisJCQlydiA9IFRSVUU7CisJCQli cmVhazsKKwkJfQorCQlsb29wcysrOworCQlpZiAobG9vcHMgPj0gMTYpCisJCQlicmVhazsKKwl9 CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7CisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBS ZW1vdmUgYWxsIHBhZ2VzIGZyb20gc3BlY2lmaWVkIGFkZHJlc3Mgc3BhY2UKKyAqIHRoaXMgYWlk cyBwcm9jZXNzIGV4aXQgc3BlZWRzLiAgQWxzbywgdGhpcyBjb2RlCisgKiBpcyBzcGVjaWFsIGNh c2VkIGZvciBjdXJyZW50IHByb2Nlc3Mgb25seSwgYnV0CisgKiBjYW4gaGF2ZSB0aGUgbW9yZSBn ZW5lcmljIChhbmQgc2xpZ2h0bHkgc2xvd2VyKQorICogbW9kZSBlbmFibGVkLiAgVGhpcyBpcyBt dWNoIGZhc3RlciB0aGFuIHBtYXBfcmVtb3ZlCisgKiBpbiB0aGUgY2FzZSBvZiBydW5uaW5nIGRv d24gYW4gZW50aXJlIGFkZHJlc3Mgc3BhY2UuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Vz KHBtYXBfdCBwbWFwKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgdHB0ZTsKKwlwdl9lbnRyeV90IHB2 LCBucHY7CisJdm1fcGFnZV90IG07CisKKwlpZiAocG1hcCAhPSB2bXNwYWNlX3BtYXAoY3VydGhy ZWFkLT50ZF9wcm9jLT5wX3Ztc3BhY2UpKSB7CisJCXByaW50Zigid2FybmluZzogcG1hcF9yZW1v dmVfcGFnZXMgY2FsbGVkIHdpdGggbm9uLWN1cnJlbnQgcG1hcFxuIik7CisJCXJldHVybjsKKwl9 CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCVBNQVBfTE9DSyhwbWFwKTsKKwlzY2hlZF9waW4o KTsKKwkvL1hYWCBuZWVkIHRvIGJlIFRBSUxRX0ZPUkVBQ0hfU0FGRSA/CisJZm9yIChwdiA9IFRB SUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmxpc3QpOyBwdjsgcHYgPSBucHYpIHsKKwkJcHRlID0gcG1h cF9wdGUocHYtPnB2X3BtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGUgPT0gTlVMTCkKKwkJCXBy aW50ZigicHRlIGZhaWwgLSAlcCB2YSAlcFxuIiwKKwkJCQkJcHYtPnB2X3BtYXAsICh2b2lkICop cHYtPnB2X3ZhKTsKKwkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCXBhbmljKCJwbWFw X3JlbW92ZV9wYWdlczogcGFnZSBvbiBwbV9wdmxpc3QgaGFzIG5vIHB0ZVxuIik7CisJCXRwdGUg PSAqcHRlOworCisvKgorICogV2UgY2Fubm90IHJlbW92ZSB3aXJlZCBwYWdlcyBmcm9tIGEgcHJv Y2VzcycgbWFwcGluZyBhdCB0aGlzIHRpbWUKKyAqLworCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBU RV9XKSkgeworCQkJbnB2ID0gVEFJTFFfTkVYVChwdiwgcHZfcGxpc3QpOworCQkJY29udGludWU7 CisJCX0KKwkJKnB0ZSA9IGlzX2tlcm5lbF9wbWFwKHBtYXApID8gUFRFX0cgOiAwOworCisJCW0g PSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BBKHRwdGUpKTsKKwkJS0FTU0VSVChtICE9 IE5VTEwsCisJCSAgICAoInBtYXBfcmVtb3ZlX3BhZ2VzOiBiYWQgdHB0ZSAleCIsIHRwdGUpKTsK KworCQlwdi0+cHZfcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQtLTsKKworCQkvKgorCQkg KiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLwor CQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSkKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCW5w diA9IFRBSUxRX05FWFQocHYsIHB2X3BsaXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZwdi0+cHZfcG1h cC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxpc3QpOworCisJCW0tPm1kLnB2X2xpc3RfY291bnQtLTsK KwkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCWlmIChUQUlM UV9GSVJTVCgmbS0+bWQucHZfbGlzdCkgPT0gTlVMTCkgeworCQkJdm1fcGFnZV9mbGFnX2NsZWFy KG0sIFBHX1dSSVRFQUJMRSk7CisJCX0KKwkJcG1hcF91bnVzZV9wdChwdi0+cHZfcG1hcCwgcHYt PnB2X3ZhLCBwdi0+cHZfcHRlbSk7CisJCWZyZWVfcHZfZW50cnkocHYpOworCX0KKwlzY2hlZF91 bnBpbigpOworCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7 CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7Cit9CisKKy8qCisgKiBwbWFwX3Rlc3RiaXQgdGVz dHMgYml0cyBpbiBwdGUncworICogbm90ZSB0aGF0IHRoZSB0ZXN0Yml0L2NoYW5nZWJpdCByb3V0 aW5lcyBhcmUgaW5saW5lLAorICogYW5kIGEgbG90IG9mIHRoaW5ncyBjb21waWxlLXRpbWUgZXZh bHVhdGUuCisgKi8KK3N0YXRpYyBib29sZWFuX3QKK3BtYXBfdGVzdGJpdCh2bV9wYWdlX3QgbSwg aW50IGJpdCkKK3sKKwlwdl9lbnRyeV90IHB2OworCXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFu X3QgcnYgPSBGQUxTRTsKKworCWlmIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpCisJCXJldHVy biBydjsKKworCWlmIChUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkgPT0gTlVMTCkKKwkJcmV0 dXJuIHJ2OworCisJbXR4X2Fzc2VydCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlU QUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgeworI2lmIGRlZmluZWQo UE1BUF9ESUFHTk9TVElDKQorCQlpZiAoIXB2LT5wdl9wbWFwKSB7CisJCQlwcmludGYoIk51bGwg cG1hcCAodGIpIGF0IHZhOiAweCV4XG4iLCBwdi0+cHZfdmEpOworCQkJY29udGludWU7CisJCX0K KyNlbmRpZgorCQlQTUFQX0xPQ0socHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+ cHZfcG1hcCwgcHYtPnB2X3ZhKTsKKwkJcnYgPSBwdGVfdGVzdChwdGUsIGJpdCk7CisJCVBNQVBf VU5MT0NLKHB2LT5wdl9wbWFwKTsKKwkJaWYgKHJ2KQorCQkJYnJlYWs7CisJfQorCXJldHVybiAo cnYpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gY2xlYXIgZGlydHkgYml0 cyBpbiBwdGVzCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2NoYW5nZWJpdCh2bV9w YWdlX3QgbSwgaW50IGJpdCwgYm9vbGVhbl90IHNldGVtKQoreworCXB2X2VudHJ5X3QgcHY7CisJ cHRfZW50cnlfdCAqcHRlOworCisJaWYgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykKKwkJcmV0 dXJuOworCisJbXR4X2Fzc2VydCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwkvKgor CSAqIExvb3Agb3ZlciBhbGwgY3VycmVudCBtYXBwaW5ncyBzZXR0aW5nL2NsZWFyaW5nIGFzIGFw cHJvcG9zIElmCisJICogc2V0dGluZyBSTyBkbyB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBWQUM/CisJ ICovCisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsKKyNpZiBk ZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKwkJaWYgKCFwdi0+cHZfcG1hcCkgeworCQkJcHJpbnRm KCJOdWxsIHBtYXAgKGNiKSBhdCB2YTogMHgleFxuIiwgcHYtPnB2X3ZhKTsKKwkJCWNvbnRpbnVl OworCQl9CisjZW5kaWYKKworCQlQTUFQX0xPQ0socHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFw X3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHNldGVtKSB7CisJCQkqcHRlIHw9 IGJpdDsKKwkJCXBtYXBfdXBkYXRlX3BhZ2UocHYtPnB2X3BtYXAsIHB2LT5wdl92YSwgKnB0ZSk7 CisJCX0gZWxzZSB7CisJCQlwdF9lbnRyeV90ICBwYml0cyA9ICpwdGU7CisKKwkJCWlmIChwYml0 cyAmIGJpdCkgeworCQkJCWlmIChiaXQgPT0gUFRFX0QpIHsKKwkJCQkJaWYgKHBiaXRzICYgUFRF X0QpCisJCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCQkqcHRlID0gKHBiaXRzICYgflBURV9E KSB8IFBURV9STzsKKwkJCQl9IGVsc2UgeworCQkJCQkqcHRlID0gcGJpdHMgJiB+Yml0OworCQkJ CX0KKwkJCQlwbWFwX3VwZGF0ZV9wYWdlKHB2LT5wdl9wbWFwLCBwdi0+cHZfdmEsICpwdGUpOwor CQkJfQorCQl9CisJCVBNQVBfVU5MT0NLKHB2LT5wdl9wbWFwKTsKKwl9CisJaWYgKCFzZXRlbSAm JiBiaXQgPT0gUFRFX0QpCisJCXZtX3BhZ2VfZmxhZ19jbGVhcihtLCBQR19XUklURUFCTEUpOwor fQorCisvKgorICoJcG1hcF9wYWdlX3dpcmVkX21hcHBpbmdzOgorICoKKyAqCVJldHVybiB0aGUg bnVtYmVyIG9mIG1hbmFnZWQgbWFwcGluZ3MgdG8gdGhlIGdpdmVuIHBoeXNpY2FsIHBhZ2UKKyAq CXRoYXQgYXJlIHdpcmVkLgorICovCitpbnQKK3BtYXBfcGFnZV93aXJlZF9tYXBwaW5ncyh2bV9w YWdlX3QgbSkKK3sKKwlwdl9lbnRyeV90IHB2OworCWludCBjb3VudDsKKworCWNvdW50ID0gMDsK KwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJcmV0dXJuIChjb3VudCk7 CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9saXN0KQorCSAgICBpZiAocHYtPnB2X3dpcmVkKQorCQljb3VudCsrOworCXZtX3Bh Z2VfdW5sb2NrX3F1ZXVlcygpOworCXJldHVybiAoY291bnQpOworfQorCisvKgorICogQ2xlYXIg dGhlIHdyaXRlIGFuZCBtb2RpZmllZCBiaXRzIGluIGVhY2ggb2YgdGhlIGdpdmVuIHBhZ2UncyBt YXBwaW5ncy4KKyAqLwordm9pZAorcG1hcF9yZW1vdmVfd3JpdGUodm1fcGFnZV90IG0pCit7CisJ cHZfZW50cnlfdCBwdiwgbnB2OworCXZtX29mZnNldF90IHZhOworCXB0X2VudHJ5X3QgKnB0ZTsK KworCUtBU1NFUlQoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9 PSAwLAorCSAgICAoInBtYXBfcmVtb3ZlX3dyaXRlOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg bSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgVlBPX0JVU1ksIHRoZW4gUEdfV1JJ VEVBQkxFIGNhbm5vdCBiZSBzZXQgYnkKKwkgKiBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgb2Jq ZWN0IGlzIGxvY2tlZC4gIFRodXMsIGlmIFBHX1dSSVRFQUJMRQorCSAqIGlzIGNsZWFyLCBubyBw YWdlIHRhYmxlIGVudHJpZXMgbmVlZCB1cGRhdGluZy4KKwkgKi8KKwlWTV9PQkpFQ1RfTE9DS19B U1NFUlQobS0+b2JqZWN0LCBNQV9PV05FRCk7CisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fQlVTWSkg PT0gMCAmJgorCSAgICAobS0+ZmxhZ3MgJiBQR19XUklURUFCTEUpID09IDApCisJCXJldHVybjsK KworCS8qCisJICogTG9vcCBvdmVyIGFsbCBjdXJyZW50IG1hcHBpbmdzIHNldHRpbmcvY2xlYXJp bmcgYXMgYXBwcm9wb3MuCisJICovCisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCWZvciAocHYg PSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OyBwdiA9IG5wdikgeworCQlucHYgPSBU QUlMUV9ORVhUKHB2LCBwdl9wbGlzdCk7CisJCXB0ZSA9IHBtYXBfcHRlKHB2LT5wdl9wbWFwLCBw di0+cHZfdmEpOworCQlpZiAocHRlID09IE5VTEwgfHwgIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKQor CQkJcGFuaWMoInBhZ2Ugb24gcG1fcHZsaXN0IGhhcyBubyBwdGVcbiIpOworCisJCXZhID0gcHYt PnB2X3ZhOworCQlwbWFwX3Byb3RlY3QocHYtPnB2X3BtYXAsIHZhLCB2YSArIFBBR0VfU0laRSwK KwkJICAgIFZNX1BST1RfUkVBRCB8IFZNX1BST1RfRVhFQ1VURSk7CisJfQorCXZtX3BhZ2VfZmxh Z19jbGVhcihtLCBQR19XUklURUFCTEUpOworCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworfQor CisvKgorICoJcG1hcF90c19yZWZlcmVuY2VkOgorICoKKyAqCVJldHVybiB0aGUgY291bnQgb2Yg cmVmZXJlbmNlIGJpdHMgZm9yIGEgcGFnZSwgY2xlYXJpbmcgYWxsIG9mIHRoZW0uCisgKi8KK2lu dAorcG1hcF90c19yZWZlcmVuY2VkKHZtX3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+Zmxh Z3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAgICgicG1hcF90 c19yZWZlcmVuY2VkOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCWlmIChtLT5tZC5w dl9mbGFncyAmIFBWX1RBQkxFX1JFRikgeworCQl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisJCW0t Pm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9SRUY7CisJCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygp OworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgorICoJcG1hcF9pc19t b2RpZmllZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBwaHlz aWNhbCBwYWdlIHdhcyBtb2RpZmllZAorICoJaW4gYW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jv b2xlYW5fdAorcG1hcF9pc19tb2RpZmllZCh2bV9wYWdlX3QgbSkKK3sKKwlib29sZWFuX3QgcnY7 CisKKwlLQVNTRVJUKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkg PT0gMCwKKwkgICAgKCJwbWFwX2lzX21vZGlmaWVkOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg bSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgVlBPX0JVU1ksIHRoZW4gUEdfV1JJ VEVBQkxFIGNhbm5vdCBiZQorCSAqIGNvbmN1cnJlbnRseSBzZXQgd2hpbGUgdGhlIG9iamVjdCBp cyBsb2NrZWQuICBUaHVzLCBpZiBQR19XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gUFRFcyBj YW4gaGF2ZSBQVEVfRCBzZXQuCisJICovCisJVk1fT0JKRUNUX0xPQ0tfQVNTRVJUKG0tPm9iamVj dCwgTUFfT1dORUQpOworCWlmICgobS0+b2ZsYWdzICYgVlBPX0JVU1kpID09IDAgJiYKKwkgICAg KG0tPmZsYWdzICYgUEdfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKwl2bV9w YWdlX2xvY2tfcXVldWVzKCk7CisJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfTU9EKQor CQlydiA9IFRSVUU7CisJZWxzZQorCQlydiA9IHBtYXBfdGVzdGJpdChtLCBQVEVfRCk7CisJdm1f cGFnZV91bmxvY2tfcXVldWVzKCk7CisJcmV0dXJuIChydik7Cit9CisKKy8qIE4vQyAqLworCisv KgorICoJcG1hcF9pc19wcmVmYXVsdGFibGU6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90 IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGlzIGVsZ2libGUKKyAqCWZvciBwcmVmYXVs dC4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX3ByZWZhdWx0YWJsZShwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgYWRkcikKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IHJ2OworCisJ cnYgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJaWYgKHBtYXBfc2VnbWFwKHBtYXAsIGFk ZHIpICE9IE5VTEwpIHsKKwkJcHRlID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CisJCXJ2ID0gKCpw dGUgPT0gMCk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAocnYpOworfQorCisv KgorICoJQ2xlYXIgdGhlIG1vZGlmeSBiaXRzIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFn ZS4KKyAqLwordm9pZAorcG1hcF9jbGVhcl9tb2RpZnkodm1fcGFnZV90IG0pCit7CisKKwlLQVNT RVJUKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkg ICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlW TV9PQkpFQ1RfTE9DS19BU1NFUlQobS0+b2JqZWN0LCBNQV9PV05FRCk7CisJS0FTU0VSVCgobS0+ b2ZsYWdzICYgVlBPX0JVU1kpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9tb2RpZnk6IHBhZ2Ug JXAgaXMgYnVzeSIsIG0pKTsKKworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgbm90IFBHX1dSSVRF QUJMRSwgdGhlbiBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKiBJZiB0aGUgb2JqZWN0 IGNvbnRhaW5pbmcgdGhlIHBhZ2UgaXMgbG9ja2VkIGFuZCB0aGUgcGFnZSBpcyBub3QKKwkgKiBW UE9fQlVTWSwgdGhlbiBQR19XUklURUFCTEUgY2Fubm90IGJlIGNvbmN1cnJlbnRseSBzZXQuCisJ ICovCisJaWYgKChtLT5mbGFncyAmIFBHX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCXZt X3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlpZiAobS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9NT0Qp IHsKKwkJcG1hcF9jaGFuZ2ViaXQobSwgUFRFX0QsIEZBTFNFKTsKKwkJbS0+bWQucHZfZmxhZ3Mg Jj0gflBWX1RBQkxFX01PRDsKKwl9CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7Cit9CisKKy8q CisgKglwbWFwX2lzX3JlZmVyZW5jZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRo ZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZSB3YXMgcmVmZXJlbmNlZAorICoJaW4gYW55IHBoeXNp Y2FsIG1hcHMuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19yZWZlcmVuY2VkKHZtX3BhZ2VfdCBt KQoreworCisJS0FTU0VSVCgobS0+ZmxhZ3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdF RCkpID09IDAsCisJICAgICgicG1hcF9pc19yZWZlcmVuY2VkOiBwYWdlICVwIGlzIG5vdCBtYW5h Z2VkIiwgbSkpOworCXJldHVybiAoKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKSAhPSAw KTsKK30KKworLyoKKyAqCXBtYXBfY2xlYXJfcmVmZXJlbmNlOgorICoKKyAqCUNsZWFyIHRoZSBy ZWZlcmVuY2UgYml0IG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZS4KKyAqLwordm9pZAor cG1hcF9jbGVhcl9yZWZlcmVuY2Uodm1fcGFnZV90IG0pCit7CisKKwlLQVNTRVJUKChtLT5mbGFn cyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkgICAgKCJwbWFwX2Ns ZWFyX3JlZmVyZW5jZTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwl2bV9wYWdlX2xv Y2tfcXVldWVzKCk7CisJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKSB7CisJCW0t Pm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9SRUY7CisJfQorCXZtX3BhZ2VfdW5sb2NrX3F1ZXVl cygpOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBzdXBwb3J0IHJvdXRpbmVzIGZvbGxvdwor ICovCisKKy8qCisgKiBNYXAgYSBzZXQgb2YgcGh5c2ljYWwgbWVtb3J5IHBhZ2VzIGludG8gdGhl IGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBSZXR1cm4gYSBwb2ludGVyIHRvIHdo ZXJlIGl0IGlzIG1hcHBlZC4gVGhpcworICogcm91dGluZSBpcyBpbnRlbmRlZCB0byBiZSB1c2Vk IGZvciBtYXBwaW5nIGRldmljZSBtZW1vcnksCisgKiBOT1QgcmVhbCBtZW1vcnkuCisgKi8KKwor LyoKKyAqIE1hcCBhIHNldCBvZiBwaHlzaWNhbCBtZW1vcnkgcGFnZXMgaW50byB0aGUga2VybmVs IHZpcnR1YWwKKyAqIGFkZHJlc3Mgc3BhY2UuIFJldHVybiBhIHBvaW50ZXIgdG8gd2hlcmUgaXQg aXMgbWFwcGVkLiBUaGlzCisgKiByb3V0aW5lIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG1h cHBpbmcgZGV2aWNlIG1lbW9yeSwKKyAqIE5PVCByZWFsIG1lbW9yeS4KKyAqCisgKiBVc2UgWEtQ SFlTIHVuY2FjaGVkIGZvciA2NCBiaXQsIGFuZCBLU0VHMSB3aGVyZSBwb3NzaWJsZSBmb3IgMzIg Yml0LgorICovCit2b2lkICoKK3BtYXBfbWFwZGV2KHZtX29mZnNldF90IHBhLCB2bV9zaXplX3Qg c2l6ZSkKK3sKKwlyZXR1cm4gKCh2b2lkICopTUlQU19QSFlTX1RPX1hLUEhZU19VTkNBQ0hFRChw YSkpOworfQorCit2b2lkCitwbWFwX3VubWFwZGV2KHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qg c2l6ZSkKK3sKK30KKworLyoKKyAqIHBlcmZvcm0gdGhlIHBtYXAgd29yayBmb3IgbWluY29yZQor ICovCitpbnQKK3BtYXBfbWluY29yZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgYWRkciwgdm1f cGFkZHJfdCAqbG9ja2VkX3BhKQoreworCXB0X2VudHJ5X3QgKnB0ZXAsIHB0ZTsKKwl2bV9vZmZz ZXRfdCBwYTsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgdmFsOworCWJvb2xlYW5fdCBtYW5hZ2VkOwor CisJUE1BUF9MT0NLKHBtYXApOworcmV0cnk6CisJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIGFkZHIp OworCXB0ZSA9IChwdGVwICE9IE5VTEwpID8gKnB0ZXAgOiAwOworCWlmICghcHRlX3Rlc3QoJnB0 ZSwgUFRFX1YpKSB7CisJCXZhbCA9IDA7CisJCWdvdG8gb3V0OworCX0KKwl2YWwgPSBNSU5DT1JF X0lOQ09SRTsKKwlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX0QpKQorCQl2YWwgfD0gTUlOQ09SRV9N T0RJRklFRCB8IE1JTkNPUkVfTU9ESUZJRURfT1RIRVI7CisJcGEgPSBUTEJMT19QVEVfVE9fUEEo cHRlKTsKKwltYW5hZ2VkID0gcGFnZV9pc19tYW5hZ2VkKHBhKTsKKwlpZiAobWFuYWdlZCkgewor CQkvKgorCQkgKiBUaGlzIG1heSBmYWxzZWx5IHJlcG9ydCB0aGUgZ2l2ZW4gYWRkcmVzcyBhcwor CQkgKiBNSU5DT1JFX1JFRkVSRU5DRUQuICBVbmZvcnR1bmF0ZWx5LCBkdWUgdG8gdGhlIGxhY2sg b2YKKwkJICogcGVyLVBURSByZWZlcmVuY2UgaW5mb3JtYXRpb24sIGl0IGlzIGltcG9zc2libGUg dG8KKwkJICogZGV0ZXJtaW5lIGlmIHRoZSBhZGRyZXNzIGlzIE1JTkNPUkVfUkVGRVJFTkNFRC4g IAorCQkgKi8KKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCWlmICgobS0+ZmxhZ3MgJiBQ R19SRUZFUkVOQ0VEKSAhPSAwKQorCQkJdmFsIHw9IE1JTkNPUkVfUkVGRVJFTkNFRCB8IE1JTkNP UkVfUkVGRVJFTkNFRF9PVEhFUjsKKwl9CisJaWYgKCh2YWwgJiAoTUlOQ09SRV9NT0RJRklFRF9P VEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikpICE9CisJICAgIChNSU5DT1JFX01PRElG SUVEX09USEVSIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVSKSAmJiBtYW5hZ2VkKSB7CisJCS8q IEVuc3VyZSB0aGF0ICJQSFlTX1RPX1ZNX1BBR0UocGEpLT5vYmplY3QiIGRvZXNuJ3QgY2hhbmdl LiAqLworCQlpZiAodm1fcGFnZV9wYV90cnlyZWxvY2socG1hcCwgcGEsIGxvY2tlZF9wYSkpCisJ CQlnb3RvIHJldHJ5OworCX0gZWxzZQorb3V0OgorCQlQQV9VTkxPQ0tfQ09ORCgqbG9ja2VkX3Bh KTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3ZvaWQKK3BtYXBf YWN0aXZhdGUoc3RydWN0IHRocmVhZCAqdGQpCit7CisJcG1hcF90IHBtYXAsIG9sZHBtYXA7CisJ c3RydWN0IHByb2MgKnAgPSB0ZC0+dGRfcHJvYzsKKworCWNyaXRpY2FsX2VudGVyKCk7CisKKwlw bWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJb2xkcG1hcCA9IFBDUFVfR0VUKGN1 cnBtYXApOworCisJaWYgKG9sZHBtYXApCisJCWF0b21pY19jbGVhcl8zMigmb2xkcG1hcC0+cG1f YWN0aXZlLCBQQ1BVX0dFVChjcHVtYXNrKSk7CisJYXRvbWljX3NldF8zMigmcG1hcC0+cG1fYWN0 aXZlLCBQQ1BVX0dFVChjcHVtYXNrKSk7CisJcG1hcF9hc2lkX2FsbG9jKHBtYXApOworCWlmICh0 ZCA9PSBjdXJ0aHJlYWQpIHsKKwkJUENQVV9TRVQoc2VnYmFzZSwgcG1hcC0+cG1fc2VndGFiKTsK KwkJbWlwc193cl9lbnRyeWhpKHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkKTsK Kwl9CisKKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwljcml0aWNhbF9leGl0KCk7Cit9CisK K3ZvaWQKK3BtYXBfc3luY19pY2FjaGUocG1hcF90IHBtLCB2bV9vZmZzZXRfdCB2YSwgdm1fc2l6 ZV90IHN6KQoreworfQorCisvKgorICoJSW5jcmVhc2UgdGhlIHN0YXJ0aW5nIHZpcnR1YWwgYWRk cmVzcyBvZiB0aGUgZ2l2ZW4gbWFwcGluZyBpZiBhCisgKglkaWZmZXJlbnQgYWxpZ25tZW50IG1p Z2h0IHJlc3VsdCBpbiBtb3JlIHN1cGVycGFnZSBtYXBwaW5ncy4KKyAqLwordm9pZAorcG1hcF9h bGlnbl9zdXBlcnBhZ2Uodm1fb2JqZWN0X3Qgb2JqZWN0LCB2bV9vb2Zmc2V0X3Qgb2Zmc2V0LAor ICAgIHZtX29mZnNldF90ICphZGRyLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKwl2bV9vZmZzZXRfdCBz dXBlcnBhZ2Vfb2Zmc2V0OworCisJaWYgKHNpemUgPCBOQlNFRykKKwkJcmV0dXJuOworCWlmIChv YmplY3QgIT0gTlVMTCAmJiAob2JqZWN0LT5mbGFncyAmIE9CSl9DT0xPUkVEKSAhPSAwKQorCQlv ZmZzZXQgKz0gcHRvYShvYmplY3QtPnBnX2NvbG9yKTsKKwlzdXBlcnBhZ2Vfb2Zmc2V0ID0gb2Zm c2V0ICYgU0VHTUFTSzsKKwlpZiAoc2l6ZSAtICgoTkJTRUcgLSBzdXBlcnBhZ2Vfb2Zmc2V0KSAm IFNFR01BU0spIDwgTkJTRUcgfHwKKwkgICAgKCphZGRyICYgU0VHTUFTSykgPT0gc3VwZXJwYWdl X29mZnNldCkKKwkJcmV0dXJuOworCWlmICgoKmFkZHIgJiBTRUdNQVNLKSA8IHN1cGVycGFnZV9v ZmZzZXQpCisJCSphZGRyID0gKCphZGRyICYgflNFR01BU0spICsgc3VwZXJwYWdlX29mZnNldDsK KwllbHNlCisJCSphZGRyID0gKCgqYWRkciArIFNFR01BU0spICYgflNFR01BU0spICsgc3VwZXJw YWdlX29mZnNldDsKK30KKworLyoKKyAqIAlJbmNyZWFzZSB0aGUgc3RhcnRpbmcgdmlydHVhbCBh ZGRyZXNzIG9mIHRoZSBnaXZlbiBtYXBwaW5nIHNvCisgKiAJdGhhdCBpdCBpcyBhbGlnbmVkIHRv IG5vdCBiZSB0aGUgc2Vjb25kIHBhZ2UgaW4gYSBUTEIgZW50cnkuCisgKiAJVGhpcyByb3V0aW5l IGFzc3VtZXMgdGhhdCB0aGUgbGVuZ3RoIGlzIGFwcHJvcHJpYXRlbHktc2l6ZWQgc28KKyAqIAl0 aGF0IHRoZSBhbGxvY2F0aW9uIGRvZXMgbm90IHNoYXJlIGEgVExCIGVudHJ5IGF0IGFsbCBpZiBy ZXF1aXJlZC4KKyAqLwordm9pZAorcG1hcF9hbGlnbl90bGIodm1fb2Zmc2V0X3QgKmFkZHIpCit7 CisJaWYgKCgqYWRkciAmIFBBR0VfU0laRSkgPT0gMCkKKwkJcmV0dXJuOworCSphZGRyICs9IFBB R0VfU0laRTsKKwlyZXR1cm47Cit9CisKK0RCX1NIT1dfQ09NTUFORChwdGFibGUsIGRkYl9waWRf ZHVtcCkKK3sKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1Y3QgdGhyZWFkICp0ZCA9IE5VTEw7CisJc3Ry dWN0IHByb2MgKnA7CisJaW50IGksIGosIGs7CisJdm1fcGFkZHJfdCBwYTsKKwl2bV9vZmZzZXRf dCB2YTsKKworCWlmIChoYXZlX2FkZHIpIHsKKwkJdGQgPSBkYl9sb29rdXBfdGhyZWFkKGFkZHIs IFRSVUUpOworCQlpZiAodGQgPT0gTlVMTCkgeworCQkJZGJfcHJpbnRmKCJJbnZhbGlkIHBpZCBv ciB0aWQiKTsKKwkJCXJldHVybjsKKwkJfQorCQlwID0gdGQtPnRkX3Byb2M7CisJCWlmIChwLT5w X3Ztc3BhY2UgPT0gTlVMTCkgeworCQkJZGJfcHJpbnRmKCJObyB2bXNwYWNlIGZvciBwcm9jZXNz Iik7CisJCQlyZXR1cm47CisJCX0KKwkJCXBtYXAgPSB2bXNwYWNlX3BtYXAocC0+cF92bXNwYWNl KTsKKwl9IGVsc2UKKwkJcG1hcCA9IGtlcm5lbF9wbWFwOworCisJcHJpbnRmKCJwbWFwOiVwIHNl Z3RhYjolcCBhc2lkOiV4IGdlbmVyYXRpb246JXhcbiIsCisJICAgIHBtYXAsIHBtYXAtPnBtX3Nl Z3RhYiwKKwkJCSAgICAgICBwbWFwLT5wbV9hc2lkWzBdLmFzaWQsCisJCQkgICAgICAgcG1hcC0+ cG1fYXNpZFswXS5nZW4pOworCWZvciAoaSA9IDA7IGkgPCBOUERFUEc7IGkrKykgeworCQlwZF9l bnRyeV90ICpwZHBlOworCQlwdF9lbnRyeV90ICpwZGU7CisJCXB0X2VudHJ5X3QgcHRlOworCisJ CXBkcGUgPSAocGRfZW50cnlfdCAqKXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaWYgKHBkcGUgPT0g TlVMTCkKKwkJCWNvbnRpbnVlOworCQlkYl9wcmludGYoIlslNGRdICVwXG4iLCBpLCBwZHBlKTsK KwkJZm9yIChqID0gMDsgaiA8IE5QREVQRzsgaisrKSB7CisJCQlwZGUgPSAocHRfZW50cnlfdCAq KXBkcGVbal07CisJCQlpZiAocGRlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkYl9wcmlu dGYoIlx0WyU0ZF0gJXBcbiIsIGosIHBkZSk7CisJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBr KyspIHsKKwkJCQlwdGUgPSBwZGVba107CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgm cHRlLCBQVEVfVikpCisJCQkJCWNvbnRpbnVlOworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0 ZSk7CisJCQkJdmEgPSAoKHVfbG9uZylpIDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8 IChrIDw8IFBBR0VfU0hJRlQpOworCQkJCXByaW50ZigiXHRcdFslMDRkXSB2YTogJXAgcHRlOiAl OHggcGE6JWx4XG4iLAorCQkJCQkJaywgKHZvaWQgKil2YSwgcHRlLCAodV9sb25nKXBhKTsKKwor I2lmIDAKKwkJCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQlwcmludGYoIlx0XHRb JTA0ZF0gdmE6ICVwLCBwdDogJXAsIGg6ICVkLCB3OiAlZCwgZjogMHgleFxuIiwKKwkJCQkgICAg ICAgaywgKHZvaWQgKil2YSwgKHZvaWQgKilwYSwgIG0tPmhvbGRfY291bnQsCisJCQkJCQkJICAg IG0tPndpcmVfY291bnQsCisJCQkJCQkJICAgIG0tPmZsYWdzKTsKKyNlbmRpZgorCQkJfQorCQl9 CisJfQorfQorCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgdm9pZCBwYWRzKHBtYXBf dCBwbSk7Cit2b2lkIHBtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKTsKKworLyogcHJpbnQgYWRk cmVzcyBzcGFjZSBvZiBwbWFwKi8KK3N0YXRpYyB2b2lkCitwYWRzKHBtYXBfdCBwbSkKK3sKKwl1 bnNpZ25lZCB2YSwgaSwgajsKKwlwdF9lbnRyeV90ICpwdGVwOworCisJaWYgKHBtID09IGtlcm5l bF9wbWFwKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsgaSsrKQorCQlpZiAo cG0tPnBtX3NlZ3RhYltpXSkKKwkJCWZvciAoaiA9IDA7IGogPCBOUFRFUEc7IGorKykgeworCQkJ CXZhID0gKGkgPDwgU0VHU0hJRlQpICsgKGogPDwgUEFHRV9TSElGVCk7CisJCQkJaWYgKHBtID09 IGtlcm5lbF9wbWFwICYmIHZhIDwgS0VSTkJBU0UpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChw bSAhPSBrZXJuZWxfcG1hcCAmJgorCQkJCSAgICB2YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJ CQkJCWNvbnRpbnVlOworCQkJCXB0ZXAgPSBwbWFwX3B0ZShwbSwgdmEpOworCQkJCWlmIChwbWFw X3B0ZV92KHB0ZXApKQorCQkJCQlwcmludGYoIiV4OiV4ICIsIHZhLCAqKGludCAqKXB0ZXApOwor CQkJfQorCit9CisKK3ZvaWQKK3BtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKQoreworCXJlZ2lz dGVyIHB2X2VudHJ5X3QgcHY7CisJdm1fcGFnZV90IG07CisKKwlwcmludGYoInBhICV4IiwgcGEp OworCW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCWZvciAocHYgPSBUQUlMUV9GSVJTVCgmbS0+ bWQucHZfbGlzdCk7IHB2OworCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJ CXByaW50ZigiIC0+IHBtYXAgJXAsIHZhICV4IiwgKHZvaWQgKilwdi0+cHZfcG1hcCwgcHYtPnB2 X3ZhKTsKKwkJcGFkcyhwdi0+cHZfcG1hcCk7CisJfQorCXByaW50ZigiICIpOworfQorCisvKiBO L0MgKi8KKyNlbmRpZgorCisKKy8qCisgKiBBbGxvY2F0ZSBUTEIgYWRkcmVzcyBzcGFjZSB0YWcg KGNhbGxlZCBBU0lEIG9yIFRMQlBJRCkgYW5kIHJldHVybiBpdC4KKyAqIEl0IHRha2VzIGFsbW9z dCBhcyBtdWNoIG9yIG1vcmUgdGltZSB0byBzZWFyY2ggdGhlIFRMQiBmb3IgYQorICogc3BlY2lm aWMgQVNJRCBhbmQgZmx1c2ggdGhvc2UgZW50cmllcyBhcyBpdCBkb2VzIHRvIGZsdXNoIHRoZSBl bnRpcmUgVExCLgorICogVGhlcmVmb3JlLCB3aGVuIHdlIGFsbG9jYXRlIGEgbmV3IEFTSUQsIHdl IGp1c3QgdGFrZSB0aGUgbmV4dCBudW1iZXIuIFdoZW4KKyAqIHdlIHJ1biBvdXQgb2YgbnVtYmVy cywgd2UgZmx1c2ggdGhlIFRMQiwgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIGNvdW50CisgKiBh bmQgc3RhcnQgb3Zlci4gQVNJRCB6ZXJvIGlzIHJlc2VydmVkIGZvciBrZXJuZWwgdXNlLgorICov CitzdGF0aWMgdm9pZAorcG1hcF9hc2lkX2FsbG9jKHBtYXApCisJcG1hcF90IHBtYXA7Cit7CisJ aWYgKHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkICE9IFBNQVBfQVNJRF9SRVNF UlZFRCAmJgorCSAgICBwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID09IFBDUFVf R0VUKGFzaWRfZ2VuZXJhdGlvbikpOworCWVsc2UgeworCQlpZiAoUENQVV9HRVQobmV4dF9hc2lk KSA9PSBwbWFwX21heF9hc2lkKSB7CisJCQl0bGJfaW52YWxpZGF0ZV9hbGxfdXNlcihOVUxMKTsK KwkJCVBDUFVfU0VUKGFzaWRfZ2VuZXJhdGlvbiwKKwkJCSAgICAoUENQVV9HRVQoYXNpZF9nZW5l cmF0aW9uKSArIDEpICYgQVNJREdFTl9NQVNLKTsKKwkJCWlmIChQQ1BVX0dFVChhc2lkX2dlbmVy YXRpb24pID09IDApIHsKKwkJCQlQQ1BVX1NFVChhc2lkX2dlbmVyYXRpb24sIDEpOworCQkJfQor CQkJUENQVV9TRVQobmV4dF9hc2lkLCAxKTsJLyogMCBtZWFucyBpbnZhbGlkICovCisJCX0KKwkJ cG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmFzaWQgPSBQQ1BVX0dFVChuZXh0X2FzaWQp OworCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID0gUENQVV9HRVQoYXNpZF9n ZW5lcmF0aW9uKTsKKwkJUENQVV9TRVQobmV4dF9hc2lkLCBQQ1BVX0dFVChuZXh0X2FzaWQpICsg MSk7CisJfQorfQorCitpbnQKK3BhZ2VfaXNfbWFuYWdlZCh2bV9vZmZzZXRfdCBwYSkKK3sKKwl2 bV9vZmZzZXRfdCBwZ251bSA9IG1pcHNfYnRvcChwYSk7CisKKwlpZiAocGdudW0gPj0gZmlyc3Rf cGFnZSkgeworCQl2bV9wYWdlX3QgbTsKKworCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJ aWYgKG0gPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlpZiAoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJ VElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAw OworfQorCitzdGF0aWMgaW50Citpbml0X3B0ZV9wcm90KHZtX29mZnNldF90IHZhLCB2bV9wYWdl X3QgbSwgdm1fcHJvdF90IHByb3QpCit7CisJaW50IHJ3OworCisJaWYgKCEocHJvdCAmIFZNX1BS T1RfV1JJVEUpKQorCQlydyA9ICBQVEVfViB8IFBURV9STyB8IFBURV9DX0NBQ0hFOworCWVsc2Ug aWYgKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCkgewor CQlpZiAoKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfTU9EKSAhPSAwKQorCQkJcncgPSAgUFRF X1YgfCBQVEVfRCB8IFBURV9DX0NBQ0hFOworCQllbHNlCisJCQlydyA9IFBURV9WIHwgUFRFX0Nf Q0FDSEU7CisJCXZtX3BhZ2VfZmxhZ19zZXQobSwgUEdfV1JJVEVBQkxFKTsKKwl9IGVsc2UKKwkJ LyogTmVlZG4ndCBlbXVsYXRlIGEgbW9kaWZpZWQgYml0IGZvciB1bm1hbmFnZWQgcGFnZXMuICov CisJCXJ3ID0gIFBURV9WIHwgUFRFX0QgfCBQVEVfQ19DQUNIRTsKKwlyZXR1cm4gKHJ3KTsKK30K KworLyoKKyAqCXBtYXBfc2V0X21vZGlmaWVkOgorICoKKyAqCVNldHMgdGhlIHBhZ2UgbW9kaWZp ZWQgYW5kIHJlZmVyZW5jZSBiaXRzIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQK K3BtYXBfc2V0X21vZGlmaWVkKHZtX29mZnNldF90IHBhKQoreworCisJUEhZU19UT19WTV9QQUdF KHBhKS0+bWQucHZfZmxhZ3MgfD0gKFBWX1RBQkxFX1JFRiB8IFBWX1RBQkxFX01PRCk7Cit9CisK KworLyoKKyAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKKyAqCUZ1bmN0aW9uOgorICoJCUV4dHJh Y3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCisgKgkJdmlydHVhbCBhZGRy ZXNzLgorICovCisgLyogUE1BUF9JTkxJTkUgKi8gdm1fb2Zmc2V0X3QKK3BtYXBfa2V4dHJhY3Qo dm1fb2Zmc2V0X3QgdmEpCit7CisJaW50IG1hcHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBk aXJlY3QtbWFwcGVkIHJlZ2lvbnMuCisJICovCisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJU ICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQorCQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVMo dmEpKTsKKworCWlmICh2YSA+PSBNSVBTX0tTRUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9F TkQpCisJCXJldHVybiAoTUlQU19LU0VHMF9UT19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQ U19LU0VHMV9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NF RzFfVE9fUEhZUyh2YSkpOworCisJLyoKKwkgKiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAq LworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykgeworCQlwdF9lbnRyeV90ICpwdGVwOwor CisJCWlmIChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcHRlcCA9IHBtYXBf cHRlKCZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwdGVwKSB7CisJ CQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEoKnB0ZXApIHwKKwkJCQkgICAgKHZhICYgUEFHRV9N QVNLKSk7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJLyoKKwkgKiBTaG91bGQg YmUga2VybmVsIHZpcnR1YWwgaGVyZSwgb3RoZXJ3aXNlIGZhaWwKKwkgKi8KKwltYXBwZWQgPSAo dmEgPj0gTUlQU19LU0VHMl9TVEFSVCB8fCB2YSA8IE1JUFNfS1NFRzJfRU5EKTsKKwltYXBwZWQg PSBtYXBwZWQgfHwgKHZhID49IE1JUFNfWEtTRUdfU1RBUlQgfHwgdmEgPCBNSVBTX1hLU0VHX0VO RCk7CisJLyoKKwkgKiBLZXJuZWwgdmlydHVhbC4KKwkgKi8KKworCWlmIChtYXBwZWQpIHsKKwkJ cHRfZW50cnlfdCAqcHRlcDsKKworCQkvKiBJcyB0aGUga2VybmVsIHBtYXAgaW5pdGlhbGl6ZWQ/ ICovCisJCWlmIChrZXJuZWxfcG1hcC0+cG1fYWN0aXZlKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0 aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdlICovCisJCQlwdGVwID0gcG1hcF9wdGUoa2VybmVsX3Bt YXAsIHZhKTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEoKnB0 ZXApIHwKKwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuICgw KTsKKwl9CisKKwlwYW5pYygiJXMgZm9yIHVua25vd24gYWRkcmVzcyBzcGFjZSAlcC4iLCBfX2Z1 bmNfXywgKHZvaWQgKil2YSk7Cit9CisKKwordm9pZCAKK3BtYXBfZmx1c2hfcHZjYWNoZSh2bV9w YWdlX3QgbSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJaWYgKG0gIT0gTlVMTCkgeworCQlmb3Ig KHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkgICAgCSAgICBwdiA9IFRB SUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRl eChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CisJCX0KKwl9Cit9CkluZGV4OiBzeXMvbWlwcy9taXBz L2V4Y2VwdGlvbi5TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMJKHJl dmlzaW9uIDIxMDY0NCkKKysrIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMJKHdvcmtpbmcgY29w eSkKQEAgLTEzNyw3ICsxMzcsMTUgQEAKIAlQVFJfTAkJazEsIDAoazEpCQkJIzA4OiBrMT1zZWcg ZW50cnkKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIzA5OiBrMD1iYWQgYWRkcmVz cyAoYWdhaW4pCiAJYmVxCQlrMSwgemVybywgMmYJCQkjMGE6ID09MCAtLSBubyBwYWdlIHRhYmxl Ci0Jc3JsCQlrMCwgUEFHRV9TSElGVCAtIDIJCSMwYjogazA9VlBOIChha2EgdmE+PjEwKQorI2lm ZGVmIF9fbWlwc19uNjQKKwlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1W UE4KKwlhbmRpCQlrMCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJfQUREVQlr MSwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMSkJCQkj IGsxPXBkZSBlbnRyeQorCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBh ZGRyZXNzIChhZ2FpbikKKwliZXEJCWsxLCB6ZXJvLCAyZgkJCSMgPT0wIC0tIG5vIHBhZ2UgdGFi bGUKKyNlbmRpZgorCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gMgkJIzBiOiBrMD1WUE4gKGFr YSB2YT4+MTApCiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMwYzogazA9cGFnZSB0YWIgb2Zmc2V0 CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMwZDogazE9cHRlIGFkZHJlc3MKIAlsdwkJazAsIDAo azEpCQkJIzBlOiBrMD1sbzAgcHRlCkBAIC04MzYsNiArODQ0LDE4IEBACiAJYmVxegkJazEsIDNm CiAJbm9wCiAKKyNpZmRlZiBfX21pcHNfbjY0CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZB RERSCisJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAo YWxtb3N0KQorCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5v IHBkZSB0YWIKKwlhbmRpCQlrMCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJf QUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChr MSkJCQkjIGsxPXBkZSBlbnRyeQorCisJLyogVmFsaWRhdGUgcGRlIHRhYmxlIHBvaW50ZXIuICAq LworCWJlcXoJCWsxLCAzZgorCW5vcAorI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFE X1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZU IC0gMgkJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIDB4ZmZjCQkJIyBrMD1wYWdlIHRhYiBvZmZz ZXQKQEAgLTk5Niw2ICsxMDE2LDE0IEBACiAJUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9c2VnIGVu dHJ5CiAJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFn YWluKQogCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBh Z2UgdGFibGUKKyNpZmRlZiBfX21pcHNfbjY0CisJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRS U0hJRlQJCSMgazA9VlBOCisJYW5kaQkJazAsIGswLCBQVFJNQVNLCQkJIyBrMD1wZGUgb2Zmc2V0 CisJUFRSX0FERFUJazEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJ azEsIDAoazEpCQkJIyBrMT1wZGUgZW50cnkKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFE RFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCisgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2Vybkdl bkV4Y2VwdGlvbgkjID09MCAtLSBubyBwYWdlIHRhYmxlCisjZW5kaWYKIAlQVFJfU1JMCQlrMCwg UEFHRV9TSElGVCAtIDIJCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMgazA9cGFn ZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKSW5k ZXg6IHN5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBz L2dlbmFzc3ltLmMJKHJldmlzaW9uIDIxMDYzOCkKKysrIHN5cy9taXBzL21pcHMvZ2VuYXNzeW0u Ywkod29ya2luZyBjb3B5KQpAQCAtOTMsNiArOTMsNyBAQAogQVNTWU0oUEFHRV9TSElGVCwgUEFH RV9TSElGVCk7CiBBU1NZTShQQUdFX1NJWkUsIFBBR0VfU0laRSk7CiBBU1NZTShQQUdFX01BU0ss IFBBR0VfTUFTSyk7CitBU1NZTShQRFJTSElGVCwgUERSU0hJRlQpOwogQVNTWU0oU0VHU0hJRlQs IFNFR1NISUZUKTsKIEFTU1lNKE5QVEVQRywgTlBURVBHKTsKIEFTU1lNKFRERl9ORUVEUkVTQ0hF RCwgVERGX05FRURSRVNDSEVEKTsK --0016364166e9bf4987048ca37966--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTin4eNd4KGfWPKXKLDHyuFZs0a3pdVoeW_qA-e0P>