From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrei Borzenkov Subject: Re: [PATCH] F2FS support Date: Sat, 28 Mar 2015 10:31:55 +0300 Message-ID: <20150328103155.5c961fec@opensuse.site> References: <1427185140-41120-1-git-send-email-jaegeuk@kernel.org> Reply-To: The development of GNU GRUB Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1427185140-41120-1-git-send-email-jaegeuk@kernel.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: grub-devel-bounces+gcbgd-grub-devel=m.gmane.org@gnu.org Sender: grub-devel-bounces+gcbgd-grub-devel=m.gmane.org@gnu.org To: Jaegeuk Kim Cc: grub-devel@gnu.org, linux-f2fs-devel@lists.sourceforge.net List-Id: linux-f2fs-devel.lists.sourceforge.net 0JIgVHVlLCAyNCBNYXIgMjAxNSAwMToxOTowMCAtMDcwMApKYWVnZXVrIEtpbSA8amFlZ2V1a0Br ZXJuZWwub3JnPiDQv9C40YjQtdGCOgoKPiAgKiBNYWtlZmlsZS51dGlsLmRlZjogQWRkIGYyZnMu Yy4KPiAgKiBkb2MvZ3J1Yi50ZXhpOiBBZGQgZjJmcyBkZXNjcmlwdGlvbi4KPiAgKiBncnViLWNv cmUvTWFrZWZpbGUuY29yZS5kZWY6IEFkZCBmMmZzIG1vZHVsZS4KPiAgKiBncnViLWNvcmUvZnMv ZjJmcy5jOiBOZXcgZmlsZS4KPiAgKiB0ZXN0cy9mMmZzX3Rlc3QuaW46IE5ldyBmaWxlLgo+ICAq IHRlc3RzL3V0aWwvZ3J1Yi1mcy10ZXN0ZXIuaW46IEFkZCBmMmZzIHJlcXVpcmVtZW50cy4KPiAK Ckl0J3Mgbm90IHRoZSBtb3N0IHVzZWZ1bCBjb21taXQgbWVzc2FnZS4gQmV0dGVyIHdvdWxkIGJl IHNob3J0CmV4cGxhbmF0aW9uIG9mIHVzZSBjYXNlcyBhbmQgaW50ZW5kZWQgcGxhdGZvcm1zLiBJ J20gY3VyaW91cyBoZXJlIC0KRjJGUyBpcyBpbnRlbmRlZCBmb3IgcmF3IGZsYXNoIGFjY2Vzcywg b24gd2hpY2ggcGxhdGZvcm0ocykgZ3J1YiBoYXMKYWNjZXNzIHRvIHN1Y2ggZGV2aWNlcz8gCgo+ IAo+IGRpZmYgLS1naXQgYS9DaGFuZ2VMb2ctMjAxNSBiL0NoYW5nZUxvZy0yMDE1CgpXZSBkbyBu b3QgdXNlIENoYW5nZUxvZyBhbnkgbW9yZSwgaXQgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIGNvbW1p dHMuClRoaXMgZmlsZSBpcyBsZWdhY3kgYmVmb3JlIHRoaXMgY2hhbmdlLCBkbyBub3QgY2hhbmdl IGl0LgoKPiBkaWZmIC0tZ2l0IGEvZ3J1Yi1jb3JlL2ZzL2YyZnMuYyBiL2dydWItY29yZS9mcy9m MmZzLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjQwMzYwZDUKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvZ3J1Yi1jb3JlL2ZzL2YyZnMuYwo+IEBAIC0wLDAgKzEsMTMy MSBAQAo+ICsvKgo+ICsgKiAgZjJmcy5jIC0gRmxhc2gtRnJpZW5kbHkgRmlsZSBTeXN0ZW0KPiAr ICoKPiArICogIFdyaXR0ZW4gYnkgSmFlZ2V1ayBLaW0gPGphZWdldWtAa2VybmVsLm9yZz4KPiAr ICoKPiArICogIENvcHlyaWdodCAoQykgMjAxNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ bmMuCj4gKyAqCj4gKyAqICBHUlVCIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cj4gKyAqICB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgo+ ICsgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPiArICoKPiArICogIEdS VUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiAr ICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCj4gKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKPiArICogIGFsb25nIHdpdGgg R1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KPiArICov Cj4gKyNpbmNsdWRlIDxncnViL2Vyci5oPgo+ICsjaW5jbHVkZSA8Z3J1Yi9maWxlLmg+Cj4gKyNp bmNsdWRlIDxncnViL21tLmg+Cj4gKyNpbmNsdWRlIDxncnViL21pc2MuaD4KPiArI2luY2x1ZGUg PGdydWIvZGlzay5oPgo+ICsjaW5jbHVkZSA8Z3J1Yi9kbC5oPgo+ICsjaW5jbHVkZSA8Z3J1Yi90 eXBlcy5oPgo+ICsjaW5jbHVkZSA8Z3J1Yi9jaGFyc2V0Lmg+Cj4gKyNpbmNsdWRlIDxncnViL2Zz aGVscC5oPgo+ICsKPiArR1JVQl9NT0RfTElDRU5TRSAoIkdQTHYzKyIpOwo+ICsKPiArLyogRjJG UyBNYWdpYyBOdW1iZXIgKi8KPiArI2RlZmluZSBGMkZTX1NVUEVSX01BR0lDCTB4RjJGNTIwMTAK PiArCj4gKy8qIGJ5dGUtc2l6ZSBvZmZzZXQgKi8KPiArI2RlZmluZSBGMkZTX1NVUEVSX09GRlNF VAkJMTAyNAo+ICsKPiArLyogMTIgYml0cyBmb3IgNDA5NiBieXRlcyAqLwo+ICsjZGVmaW5lIEYy RlNfTUFYX0xPR19TRUNUT1JfU0laRQkxMgo+ICsKPiArLyogOSBiaXRzIGZvciA1MTIgYnl0ZXMg Ki8KPiArI2RlZmluZSBGMkZTX01JTl9MT0dfU0VDVE9SX1NJWkUJOQo+ICsKPiArLyogc3VwcG9y dCBvbmx5IDRLQiBibG9jayAqLwo+ICsjZGVmaW5lIEYyRlNfQkxLU0laRQkJCTQwOTYKCigyIDw8 IEYyRlNfQkxLX0JJVFMpPwoKPiArI2RlZmluZSBGMkZTX0JMS19CSVRTCQkJMTIKPiArI2RlZmlu ZSBGMkZTX0JMS19TRUNfQklUUwkJKDMpCgoKSXQgaXMgY29uZnVzaW5nIHRvIGhhdmUgc29tZSBk ZWZpbmVzIHBhcmVudGhlc2l6ZWQgYW5kIHNvbWUgbm90LiBDb3VsZAppdCBiZSB1bmlmaWVkIHNv bWVob3c/CgpBbHNvIHRoaXMgY2FuIGJlIGNvbXB1dGVkIGZyb20gRjJGU19CTEtfQklUUyBhbmQg R1JVQl9ESVNLX1NFQ1RPUl9CSVRTCi0gb25lIG1hZ2ljIG51bWJlciBsZXNzLgoKLi4uCj4gK3N0 cnVjdCBncnViX2YyZnNfaW5saW5lX2RlbnRyeQo+ICt7Cj4gKyAgZ3J1Yl91aW50OF90IGRlbnRy eV9iaXRtYXBbSU5MSU5FX0RFTlRSWV9CSVRNQVBfU0laRV07CgpUaGlzIGlzIGNhc3QgdG8gZ3J1 Yl91aW50MzJfdCBldmVyeXdoZXJlLiBDYW4gaXQgYmUgbm9uLW11bHRpcGxlIG9mIDQKYnl0ZXM/ IElmIG5vdCwgbWF5IGJlIGp1c3QgZGVmaW5lIGFzIHN1Y2g/IAoKPiArICBncnViX3VpbnQ4X3Qg cmVzZXJ2ZWRbSU5MSU5FX1JFU0VSVkVEX1NJWkVdOwo+ICsgIHN0cnVjdCBncnViX2YyZnNfZGly X2VudHJ5IGRlbnRyeVtOUl9JTkxJTkVfREVOVFJZXTsKPiArICBncnViX3VpbnQ4X3QgZmlsZW5h bWVbTlJfSU5MSU5FX0RFTlRSWV1bRjJGU19TTE9UX0xFTl07Cj4gK30gR1JVQl9QQUNLRUQ7Cj4g Kwo+ICtzdHJ1Y3QgZ3J1Yl9mMmZzX2RlbnRyeV9ibG9jayB7Cj4gKyAgZ3J1Yl91aW50OF90IGRl bnRyeV9iaXRtYXBbU0laRV9PRl9ERU5UUllfQklUTUFQXTsKCmRpdHRvCgo+ICsgIGdydWJfdWlu dDhfdCByZXNlcnZlZFtTSVpFX09GX1JFU0VSVkVEXTsKPiArICBzdHJ1Y3QgZ3J1Yl9mMmZzX2Rp cl9lbnRyeSBkZW50cnlbTlJfREVOVFJZX0lOX0JMT0NLXTsKPiArICBncnViX3VpbnQ4X3QgZmls ZW5hbWVbTlJfREVOVFJZX0lOX0JMT0NLXVtGMkZTX1NMT1RfTEVOXTsKPiArfSBHUlVCX1BBQ0tF RDsKPiArCgoKLi4uCj4gKwo+ICsjZGVmaW5lIHZlcl9hZnRlciAoYSwgYikgKHR5cGVjaGVjayAo dW5zaWduZWQgbG9uZyBsb25nLCBhKSAmJiAgICAgICAgICBcCj4gKwkJdHlwZWNoZWNrICh1bnNp Z25lZCBsb25nIGxvbmcsIGIpICYmICAgICAgICAgICAgICAgICAgICBcCj4gKwkJKChsb25nIGxv bmcpKChhKSAtIChiKSkgPiAwKSkKPiArCgpXaGVyZSB0eXBlY2hlY2sgZGVmaW5pdGlvbiBjb21l cyBmcm9tPwoKLi4uCj4gKwo+ICtzdGF0aWMgaW5saW5lIGludAo+ICtfX3Rlc3RfYml0IChpbnQg bnIsIGdydWJfdWludDMyX3QgKmFkZHIpCj4gK3sKPiArICByZXR1cm4gMVVMICYgKGFkZHJbbnIg LyAzMl0gPj4gKG5yICYgKDMxKSkpOwpFeHRyYSBwYXJlbnRoZXNpcyAoMzEpCgo+ICt9Cj4gKwoK SXQgaXMgdXNlZCBmb3IgZGVudHJ5X2JpdG1hcCB3aGljaCBpcyBrZXB0IGluIExFIGZvcm1hdCBh bmQgbm90CmNvbnZlcnRlZCBhcyBmYXIgYXMgSSBjYW4gdGVsbC4gVGhpcyBuZWVkcyBmaXhpbmcg Zm9yIEJFIHN5c3RlbXMuIExpbnV4Cmtlcm5lbCBpcyBleHBsaWNpdGx5IHVzaW5nIHRlc3RfYml0 X2xlIGhlcmUuIFRoaXMgd2lsbCBhbHNvIHdvcmsgZm9yCmlub2RlIGZsYWdzIChqdXN0IHNraXAg ZXhwbGljaXQgY29udmVyc2lvbikuCgpUaGVyZSBhcmUgdHdvIGZ1bmN0aW9ucyB3aXRoIG1vcmUg b3IgbGVzcyBpZGVudGljYWwgbmFtZXMuIE1heSBiZSBtYWtlCnRoZW0KCmdydWJfZjJmc190ZXN0 X2JpdF9sZTMyCmdydWJfZjJmc190ZXN0X2JpdAoKQXMgYSBnZW5lcmFsIGNvbW1lbnQgLSBtYXJr aW5nIG5vbi1tb2RpZmllZCBhcmd1bWVudHMgYXMgY29uc3QKZXZlcnl3aGVyZSB3b3VsZCBiZSBn b29kLgoKPiArc3RhdGljIGlubGluZSBjaGFyICoKPiArX19pbmxpbmVfYWRkciAoc3RydWN0IGdy dWJfZjJmc19pbm9kZSAqaW5vZGUpCj4gK3sKPiArICByZXR1cm4gKGNoYXIgKikmKGlub2RlLT5p X2FkZHJbMV0pOwpSZWR1bmRhbnQgcGFyZW5zIGFyb3VuZCBpbm9kZS0+Cgo+ICt9Cj4gKwo+ICtz dGF0aWMgaW5saW5lIGdydWJfdWludDY0X3QKPiArX19pX3NpemUgKHN0cnVjdCBncnViX2YyZnNf aW5vZGUgKmlub2RlKQoKQ291bGQgd2UgbWFrZSBpdCBncnViX2YyZnNfZmlsZV9zaXplIG9yIHNp bWlsYXI/IGlfc2l6ZSByZWFsbHkgZG9lcyBub3QKdGVsbCBtdWNoIG91dHNpZGUgb2YgbGludXgg a2VybmVsLgoKPiArewo+ICsgIHJldHVybiBncnViX2xlX3RvX2NwdTY0IChpbm9kZS0+aV9zaXpl KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBncnViX3VpbnQzMl90Cj4gK19fc3RhcnRfY3Bf YWRkciAoc3RydWN0IGdydWJfZjJmc19kYXRhICpkYXRhKQo+ICt7Cj4gKyAgc3RydWN0IGdydWJf ZjJmc19jaGVja3BvaW50ICpja3B0ID0gJmRhdGEtPmNrcHQ7Cj4gKyAgZ3J1Yl91aW50NjRfdCBj a3B0X3ZlcnNpb24gPSBncnViX2xlX3RvX2NwdTY0IChja3B0LT5jaGVja3BvaW50X3Zlcik7Cj4g KyAgZ3J1Yl91aW50MzJfdCBzdGFydF9hZGRyID0gZGF0YS0+Y3BfYmxrYWRkcjsKPiArCj4gKyAg aWYgKCEoY2twdF92ZXJzaW9uICYgMSkpCj4gKyAgICByZXR1cm4gc3RhcnRfYWRkciArIGRhdGEt PmJsb2Nrc19wZXJfc2VnOwo+ICsgIHJldHVybiBzdGFydF9hZGRyOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW5saW5lIGdydWJfdWludDMyX3QKPiArX19zdGFydF9zdW1fYmxvY2sgKHN0cnVjdCBncnVi X2YyZnNfZGF0YSAqZGF0YSkKPiArewo+ICsgIHN0cnVjdCBncnViX2YyZnNfY2hlY2twb2ludCAq Y2twdCA9ICZkYXRhLT5ja3B0Owo+ICsKPiArICByZXR1cm4gX19zdGFydF9jcF9hZGRyIChkYXRh KSArIGdydWJfbGVfdG9fY3B1MzIgKGNrcHQtPmNwX3BhY2tfc3RhcnRfc3VtKTsKPiArfQo+ICsK PiArc3RhdGljIGlubGluZSBncnViX3VpbnQzMl90Cj4gK19fc3VtX2Jsa19hZGRyIChzdHJ1Y3Qg Z3J1Yl9mMmZzX2RhdGEgKmRhdGEsIGludCBiYXNlLCBpbnQgdHlwZSkKPiArewo+ICsgIHN0cnVj dCBncnViX2YyZnNfY2hlY2twb2ludCAqY2twdCA9ICZkYXRhLT5ja3B0Owo+ICsKPiArICByZXR1 cm4gX19zdGFydF9jcF9hZGRyIChkYXRhKSArCj4gKwkJZ3J1Yl9sZV90b19jcHUzMiAoY2twdC0+ Y3BfcGFja190b3RhbF9ibG9ja19jb3VudCkKPiArCQktIChiYXNlICsgMSkgKyB0eXBlOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGludAo+ICtfX2NrcHRfZmxhZ19zZXQgKHN0cnVjdCBncnVi X2YyZnNfY2hlY2twb2ludCAqY2twdCwgdW5zaWduZWQgaW50IGYpCj4gK3sKPiArICBncnViX3Vp bnQzMl90IGNrcHRfZmxhZ3MgPSBncnViX2xlX3RvX2NwdTMyIChja3B0LT5ja3B0X2ZsYWdzKTsK PiArICByZXR1cm4gY2twdF9mbGFncyAmIGY7CgpBbGwgZmxhZ3MgYXJlIGNvbnN0YW50IHNvIHlv dSBjYW4gc2ltcGx5IGRvIAoKY2twdC0+Y2twdF9mbGFncyAmIGdydWJfY3B1X3RvX2xlMzJfY29t cGlsZV90aW1lIChGTEFHKQoKaW4gcGxhY2UgdG8gYXZvaWQgZXh0cmEgY2FsbHMuIFRoaXMgbWFr ZXMgZnVuY3Rpb24gcmVkdW5kYW50LgoKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQKPiAr X19pbm9kZV9mbGFnX3NldCAoc3RydWN0IGdydWJfZjJmc19pbm9kZSAqaW5vZGUsIGludCBmbGFn KQo+ICt7Cj4gKyAgZ3J1Yl91aW50MzJfdCBpX2ZsYWdzID0gZ3J1Yl9sZV90b19jcHUzMiAoaW5v ZGUtPmlfZmxhZ3MpOwo+ICsgIHJldHVybiBfX3Rlc3RfYml0IChmbGFnLCAmaV9mbGFncyk7Cj4g K30KCmdydWJfZjJmc190ZXN0X2JpdF9sZTMyPwoKPiArCj4gKy8qCj4gKyAqIENSQzMyCj4gKyAq Lwo+ICsjZGVmaW5lIENSQ1BPTFlfTEUgMHhlZGI4ODMyMAo+ICsKPiArc3RhdGljIGlubGluZSBn cnViX3VpbnQzMl90Cj4gK2dydWJfZjJmc19jYWxfY3JjMzIgKGdydWJfdWludDMyX3QgY3JjLCB2 b2lkICpidWYsIGludCBsZW4pCgpXaHkgY3JjIGlzIHBhcmFtZXRlciBoZXJlPyBUaGlzIGZ1bmN0 aW9uIGlzIHVzZWQgZXhhY3RseSBvbmNlIHdpdGgKZml4ZWQgdmFsdWUgZm9yIGluaXRpYWwgY3Jj LgoKPiArewo+ICsgIGludCBpOwo+ICsgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hh ciAqKWJ1ZjsKPiArCj4gKyAgd2hpbGUgKGxlbi0tKQo+ICsgICAgewo+ICsgICAgICBjcmMgXj0g KnArKzsKPiArICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKPiArICAgICAgICBjcmMgPSAo Y3JjID4+IDEpIF4gKChjcmMgJiAxKSA/IENSQ1BPTFlfTEUgOiAwKTsKPiArICAgIH0KPiArICBy ZXR1cm4gY3JjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGludAo+ICtncnViX2YyZnNfY3Jj X3ZhbGlkIChncnViX3VpbnQzMl90IGJsa19jcmMsIHZvaWQgKmJ1ZiwgaW50IGxlbikKPiArewo+ ICsgIGdydWJfdWludDMyX3QgY2FsX2NyYyA9IDA7Cj4gKwo+ICsgIGNhbF9jcmMgPSBncnViX2Yy ZnNfY2FsX2NyYzMyIChGMkZTX1NVUEVSX01BR0lDLCBidWYsIGxlbik7Cj4gKwo+ICsgIHJldHVy biAoY2FsX2NyYyA9PSBibGtfY3JjKSA/IDEgOiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5l IGludAo+ICtncnViX2YyZnNfdGVzdF9iaXQgKGdydWJfdWludDMyX3QgbnIsIGNvbnN0IGNoYXIg KnApCj4gK3sKPiArICBpbnQgbWFzazsKPiArICBjaGFyICphZGRyID0gKGNoYXIgKilwOwoKV2h5 IGNhc3Q/IFdlIGFyZSBub3QgZ29pbmcgdG8gbW9kaWZ5IGl0LCByaWdodD8KCj4gKwo+ICsgIGFk ZHIgKz0gKG5yID4+IDMpOwo+ICsgIG1hc2sgPSAxIDw8ICg3IC0gKG5yICYgMHgwNykpOwo+ICsg IHJldHVybiAobWFzayAmICphZGRyKSAhPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50Cj4gK2dy dWJfZjJmc19zYW5pdHlfY2hlY2tfc2IgKHN0cnVjdCBncnViX2YyZnNfc3VwZXJibG9jayAqc2Ip Cj4gK3sKPiArICB1bnNpZ25lZCBpbnQgYmxvY2tzaXplOwo+ICsKPiArICBpZiAoRjJGU19TVVBF Ul9NQUdJQyAhPSBncnViX2xlX3RvX2NwdTMyIChzYi0+bWFnaWMpKQoKc2ItPm1hZ2ljICE9IGdy dWJfY3B1X3RvX2xlMzJfY29tcGlsZV90aW1lIChGMkZTX1NVUEVSX01BR0lDKQoKPiArICAgIHJl dHVybiAtMTsKPiArCj4gKyAgYmxvY2tzaXplID0gMSA8PCBncnViX2xlX3RvX2NwdTMyIChzYi0+ bG9nX2Jsb2Nrc2l6ZSk7Cj4gKyAgaWYgKGJsb2Nrc2l6ZSAhPSBGMkZTX0JMS1NJWkUpCgpzYi0+ bG9nX2Jsa3NpemUgIT0gZ3J1Yl9jcHVfdG9fbGUzMl9jb21waWxlX3RpbWUgKEYyRlNfQkxLX0JJ VFMpCgo+ICsgICAgcmV0dXJuIC0xOwo+ICsKPiArICBpZiAoZ3J1Yl9sZV90b19jcHUzMiAoc2It PmxvZ19zZWN0b3JzaXplKSA+IEYyRlNfTUFYX0xPR19TRUNUT1JfU0laRSkKPiArICAgIHJldHVy biAtMTsKPiArCj4gKyAgaWYgKGdydWJfbGVfdG9fY3B1MzIgKHNiLT5sb2dfc2VjdG9yc2l6ZSkg PCBGMkZTX01JTl9MT0dfU0VDVE9SX1NJWkUpCj4gKyAgICByZXR1cm4gLTE7Cj4gKwo+ICsgIGlm IChncnViX2xlX3RvX2NwdTMyIChzYi0+bG9nX3NlY3RvcnNfcGVyX2Jsb2NrKSArCj4gKyAgICAg IGdydWJfbGVfdG9fY3B1MzIgKHNiLT5sb2dfc2VjdG9yc2l6ZSkgIT0gRjJGU19NQVhfTE9HX1NF Q1RPUl9TSVpFKQoKU2hvdWxkIG5vdCBpdCBiZSBGMkZTX0JMS1NJWkU/IEF0IGxlYXN0IGl0IHNv dW5kcyBsb2dpY2FsLiBBbHNvIHBsZWFzZQpjb252ZXJ0IGxvZ19zZWN0b3JzaXplIGp1c3Qgb25j ZS4KCj4gKyAgICByZXR1cm4gLTE7Cj4gKwo+ICsgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgZ3J1Yl9lcnJfdAo+ICtncnViX2YyZnNfcmVhZF9zYiAoc3RydWN0IGdydWJfZjJmc19kYXRh ICpkYXRhLCBpbnQgYmxvY2spCj4gK3sKPiArICBncnViX2Rpc2tfdCBkaXNrID0gZGF0YS0+ZGlz azsKPiArICBncnViX3VpbnQ2NF90IG9mZnNldDsKPiArICBncnViX2Vycl90IGVycjsKPiArCj4g KyAgaWYgKGJsb2NrID09IDApCj4gKyAgICBvZmZzZXQgPSBGMkZTX1NVUEVSX09GRlNFVDsKPiAr ICBlbHNlCj4gKyAgICBvZmZzZXQgPSBGMkZTX0JMS1NJWkUgKyBGMkZTX1NVUEVSX09GRlNFVDsK PiArCgpQbGVhc2UgbmFtZSBpdCAic2Vjb25kYXJ5IiBvciBzaW1pbGFyIGluc3RlYWQgb2YgImJs b2NrIiB0byBhdm9pZApjb25mdXNpb24uIFlvdSBkbyBub3QgcmVhbGx5IHdhbnQgdG8gcmVhZCBh cmJpdHJhcnkgYmxvY2ssIHJpZ2h0PwoKb2Zmc2V0ID0gRjJGU19TVVBFUl9PRkZFU1Q7CmlmIChz ZWNvbmRhcnkpCiAgb2Zmc2V0ICs9IEYyRlNfQkxLU0laRTsKCj4gKyAgLyogUmVhZCBmaXJzdCBz dXBlciBibG9jay4gKi8KPiArICBlcnIgPSBncnViX2Rpc2tfcmVhZCAoZGlzaywgb2Zmc2V0ID4+ IEdSVUJfRElTS19TRUNUT1JfQklUUywgMCwKPiArCQkJc2l6ZW9mIChkYXRhLT5zYmxvY2spLCAm ZGF0YS0+c2Jsb2NrKTsKPiArICBpZiAoZXJyKQo+ICsgICAgcmV0dXJuIGVycjsKPiArCj4gKyAg aWYgKGdydWJfZjJmc19zYW5pdHlfY2hlY2tfc2IgKCZkYXRhLT5zYmxvY2spKQo+ICsgICAgZXJy ID0gR1JVQl9FUlJfQkFEX0ZTOwo+ICsKPiArICByZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCAqCj4gK3ZhbGlkYXRlX2NoZWNrcG9pbnQgKHN0cnVjdCBncnViX2YyZnNfZGF0YSAq ZGF0YSwgZ3J1Yl91aW50MzJfdCBjcF9hZGRyLAo+ICsJCQkJCQlncnViX3VpbnQ2NF90ICp2ZXJz aW9uKQo+ICt7Cj4gKyAgdm9pZCAqY3BfcGFnZV8xLCAqY3BfcGFnZV8yOwo+ICsgIHN0cnVjdCBn cnViX2YyZnNfY2hlY2twb2ludCAqY3BfYmxvY2s7Cj4gKyAgZ3J1Yl91aW50NjRfdCBjdXJfdmVy c2lvbiA9IDAsIHByZV92ZXJzaW9uID0gMDsKPiArICBncnViX3VpbnQzMl90IGNyYyA9IDA7Cj4g KyAgZ3J1Yl91aW50MzJfdCBjcmNfb2Zmc2V0Owo+ICsgIGdydWJfZXJyX3QgZXJyOwo+ICsKPiAr ICAvKiBSZWFkIHRoZSAxc3QgY3AgYmxvY2sgaW4gdGhpcyBDUCBwYWNrICovCj4gKyAgY3BfcGFn ZV8xID0gZ3J1Yl9tYWxsb2MgKEYyRlNfQkxLU0laRSk7Cj4gKyAgaWYgKCFjcF9wYWdlXzEpCj4g KyAgICByZXR1cm4gTlVMTDsKPiArCj4gKyAgZXJyID0gZ3J1Yl9mMmZzX2Jsb2NrX3JlYWQgKGRh dGEsIGNwX2FkZHIsIGNwX3BhZ2VfMSk7Cj4gKyAgaWYgKGVycikKPiArICAgIGdvdG8gaW52YWxp ZF9jcDE7Cj4gKwo+ICsgIGNwX2Jsb2NrID0gKHN0cnVjdCBncnViX2YyZnNfY2hlY2twb2ludCAq KWNwX3BhZ2VfMTsKPiArICBjcmNfb2Zmc2V0ID0gZ3J1Yl9sZV90b19jcHUzMiAoY3BfYmxvY2st PmNoZWNrc3VtX29mZnNldCk7Cj4gKyAgaWYgKGNyY19vZmZzZXQgPj0gRjJGU19CTEtTSVpFKQo+ ICsgICAgZ290byBpbnZhbGlkX2NwMTsKPiArCj4gKyAgY3JjID0gKihncnViX3VpbnQzMl90ICop KChjaGFyICopY3BfYmxvY2sgKyBjcmNfb2Zmc2V0KTsKCklzIHVuYWxpZ25lZCBhY2Nlc3MgcG9z c2libGUgaGVyZT8gSWYgeWVzLCBpdCBwcm9iYWJseSBzaG91bGQgYmUKZ3J1Yl9nZXRfdW5hbGln bmVkMzIuCgo+ICsgIGlmICghZ3J1Yl9mMmZzX2NyY192YWxpZCAoY3JjLCBjcF9ibG9jaywgY3Jj X29mZnNldCkpCj4gKyAgICBnb3RvIGludmFsaWRfY3AxOwo+ICsKClNob3VsZCBub3QgQ1JDIGJl IGNvbnZlcnRlZCBmcm9tIExFPwoKPiArICBwcmVfdmVyc2lvbiA9IGdydWJfbGVfdG9fY3B1NjQg KGNwX2Jsb2NrLT5jaGVja3BvaW50X3Zlcik7Cj4gKwo+ICsgIC8qIFJlYWQgdGhlIDJuZCBjcCBi bG9jayBpbiB0aGlzIENQIHBhY2sgKi8KPiArICBjcF9wYWdlXzIgPSBncnViX21hbGxvYyAoRjJG U19CTEtTSVpFKTsKPiArICBpZiAoIWNwX3BhZ2VfMikKPiArICAgIGdvdG8gaW52YWxpZF9jcDE7 Cj4gKwo+ICsgIGNwX2FkZHIgKz0gZ3J1Yl9sZV90b19jcHUzMiAoY3BfYmxvY2stPmNwX3BhY2tf dG90YWxfYmxvY2tfY291bnQpIC0gMTsKPiArCj4gKyAgZXJyID0gZ3J1Yl9mMmZzX2Jsb2NrX3Jl YWQgKGRhdGEsIGNwX2FkZHIsIGNwX3BhZ2VfMik7Cj4gKyAgaWYgKGVycikKPiArICAgIGdvdG8g aW52YWxpZF9jcDI7Cj4gKwo+ICsgIGNwX2Jsb2NrID0gKHN0cnVjdCBncnViX2YyZnNfY2hlY2tw b2ludCAqKWNwX3BhZ2VfMjsKPiArICBjcmNfb2Zmc2V0ID0gZ3J1Yl9sZV90b19jcHUzMiAoY3Bf YmxvY2stPmNoZWNrc3VtX29mZnNldCk7Cj4gKyAgaWYgKGNyY19vZmZzZXQgPj0gRjJGU19CTEtT SVpFKQo+ICsgICAgZ290byBpbnZhbGlkX2NwMjsKPiArCj4gKyAgY3JjID0gKihncnViX3VpbnQz Ml90ICopKChjaGFyICopY3BfYmxvY2sgKyBjcmNfb2Zmc2V0KTsKCkRpdHRvIGFsaWdubWVudC4K Cj4gKyAgaWYgKCFncnViX2YyZnNfY3JjX3ZhbGlkIChjcmMsIGNwX2Jsb2NrLCBjcmNfb2Zmc2V0 KSkKRGl0dG8gZW5kaWFubmVzcy4KCj4gKyAgICBnb3RvIGludmFsaWRfY3AyOwo+ICsKPiArICBj dXJfdmVyc2lvbiA9IGdydWJfbGVfdG9fY3B1NjQgKGNwX2Jsb2NrLT5jaGVja3BvaW50X3Zlcik7 Cj4gKyAgaWYgKGN1cl92ZXJzaW9uID09IHByZV92ZXJzaW9uKQo+ICsgICAgewo+ICsgICAgICAq dmVyc2lvbiA9IGN1cl92ZXJzaW9uOwo+ICsgICAgICBncnViX2ZyZWUgKGNwX3BhZ2VfMik7Cj4g KyAgICAgIHJldHVybiBjcF9wYWdlXzE7Cj4gKyAgICB9Cj4gKwo+ICtpbnZhbGlkX2NwMjoKPiAr ICBncnViX2ZyZWUgKGNwX3BhZ2VfMik7Cj4gK2ludmFsaWRfY3AxOgo+ICsgIGdydWJfZnJlZSAo Y3BfcGFnZV8xKTsKPiArICByZXR1cm4gTlVMTDsKPiArfQo+ICsKPiArc3RhdGljIGdydWJfZXJy X3QKPiArZ3J1Yl9mMmZzX3JlYWRfY3AgKHN0cnVjdCBncnViX2YyZnNfZGF0YSAqZGF0YSkKPiAr ewo+ICsgIHZvaWQgKmNwMSwgKmNwMiwgKmN1cl9wYWdlOwo+ICsgIGdydWJfdWludDY0X3QgY3Ax X3ZlcnNpb24gPSAwLCBjcDJfdmVyc2lvbiA9IDA7Cj4gKyAgZ3J1Yl91aW50NjRfdCBjcF9zdGFy dF9ibGtfbm87Cj4gKwo+ICsgIC8qCj4gKyAgICogRmluZGluZyBvdXQgdmFsaWQgY3AgYmxvY2sg aW52b2x2ZXMgcmVhZCBib3RoCj4gKyAgICogc2V0cyAoY3AgcGFjazEgYW5kIGNwIHBhY2sgMikK PiArICAgKi8KPiArICBjcF9zdGFydF9ibGtfbm8gPSBkYXRhLT5jcF9ibGthZGRyOwo+ICsgIGNw MSA9IHZhbGlkYXRlX2NoZWNrcG9pbnQgKGRhdGEsIGNwX3N0YXJ0X2Jsa19ubywgJmNwMV92ZXJz aW9uKTsKPiArICBpZiAoIWNwMSAmJiBncnViX2Vycm5vKQo+ICsgICAgICByZXR1cm4gZ3J1Yl9l cnJubzsKPiArCj4gKyAgLyogVGhlIHNlY29uZCBjaGVja3BvaW50IHBhY2sgc2hvdWxkIHN0YXJ0 IGF0IHRoZSBuZXh0IHNlZ21lbnQgKi8KPiArICBjcF9zdGFydF9ibGtfbm8gKz0gZGF0YS0+Ymxv Y2tzX3Blcl9zZWc7Cj4gKyAgY3AyID0gdmFsaWRhdGVfY2hlY2twb2ludCAoZGF0YSwgY3Bfc3Rh cnRfYmxrX25vLCAmY3AyX3ZlcnNpb24pOwo+ICsgIGlmICghY3AyICYmIGdydWJfZXJybm8pCj4g KyAgICB7Cj4gKyAgICAgIGdydWJfZnJlZSAoY3AxKTsKPiArICAgICAgcmV0dXJuIGdydWJfZXJy bm87Cj4gKyAgICB9Cj4gKwo+ICsgIGlmIChjcDEgJiYgY3AyKQo+ICsgICAgY3VyX3BhZ2UgPSAo Y3AyX3ZlcnNpb24gPiBjcDFfdmVyc2lvbikgPyBjcDIgOiBjcDE7Cj4gKyAgZWxzZSBpZiAoY3Ax KQo+ICsgICAgY3VyX3BhZ2UgPSBjcDE7Cj4gKyAgZWxzZSBpZiAoY3AyKQo+ICsgICAgY3VyX3Bh Z2UgPSBjcDI7Cj4gKyAgZWxzZQo+ICsgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JB RF9GUywgIm5vIGNoZWNrcG9pbnRzXG4iKTsKPiArCj4gKyAgZ3J1Yl9tZW1jcHkgKCZkYXRhLT5j a3B0LCBjdXJfcGFnZSwgRjJGU19CTEtTSVpFKTsKPiArCj4gKyAgZ3J1Yl9mcmVlIChjcDEpOwo+ ICsgIGdydWJfZnJlZSAoY3AyKTsKPiArICByZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGlu dAoKc3RhdGljIGdydWJfZXJyb3JfdAoKPiArZ2V0X25hdF9qb3VybmFsIChzdHJ1Y3QgZ3J1Yl9m MmZzX2RhdGEgKmRhdGEpCj4gK3sKPiArICBncnViX3VpbnQzMl90IGJsb2NrOwo+ICsgIGNoYXIg KmJ1ZjsKPiArICBncnViX2Vycl90IGVycjsKPiArCj4gKyAgYnVmID0gZ3J1Yl9tYWxsb2MgKEYy RlNfQkxLU0laRSk7Cj4gKyAgaWYgKCFidWYpCj4gKyAgICByZXR1cm4gZ3J1Yl9lcnJubzsKPiAr Cj4gKyAgaWYgKF9fY2twdF9mbGFnX3NldCAoJmRhdGEtPmNrcHQsIENQX0NPTVBBQ1RfU1VNX0ZM QUcpKQo+ICsgICAgYmxvY2sgPSBfX3N0YXJ0X3N1bV9ibG9jayAoZGF0YSk7Cj4gKyAgZWxzZSBp ZiAoX19ja3B0X2ZsYWdfc2V0ICgmZGF0YS0+Y2twdCwgQ1BfVU1PVU5UX0ZMQUcpKQoKQXMgbWVu dGlvbmVkLCB1c2UgZ3J1Yl9jcHVfdG9fbGVYWF9jb21waWxlX3RpbWUgdG8gYXZvaWQgcnVuIHRp bWUKY29udmVyc2lvbi4KCj4gKyAgICBibG9jayA9IF9fc3VtX2Jsa19hZGRyIChkYXRhLCBOUl9D VVJTRUdfVFlQRSwgQ1VSU0VHX0hPVF9EQVRBKTsKPiArICBlbHNlCj4gKyAgICBibG9jayA9IF9f c3VtX2Jsa19hZGRyIChkYXRhLCBOUl9DVVJTRUdfREFUQV9UWVBFLCBDVVJTRUdfSE9UX0RBVEEp Owo+ICsKPiArICBlcnIgPSBncnViX2YyZnNfYmxvY2tfcmVhZCAoZGF0YSwgYmxvY2ssIGJ1Zik7 Cj4gKyAgaWYgKGVycikKPiArICAgIGdvdG8gZmFpbDsKPiArCj4gKyAgaWYgKF9fY2twdF9mbGFn X3NldCAoJmRhdGEtPmNrcHQsIENQX0NPTVBBQ1RfU1VNX0ZMQUcpKQo+ICsgICAgZ3J1Yl9tZW1j cHkgKCZkYXRhLT5uYXRfaiwgYnVmLCBTVU1fSk9VUk5BTF9TSVpFKTsKPiArICBlbHNlCj4gKyAg ICBncnViX21lbWNweSAoJmRhdGEtPm5hdF9qLCBidWYgKyBTVU1fRU5UUklFU19TSVpFLCBTVU1f Sk9VUk5BTF9TSVpFKTsKPiArCj4gK2ZhaWw6Cj4gKyAgZ3J1Yl9mcmVlIChidWYpOwo+ICsgIHJl dHVybiBlcnI7Cj4gK30KPiArCi4uLgo+ICtzdGF0aWMgaW50Cj4gK2dydWJfZ2V0X25vZGVfcGF0 aCAoc3RydWN0IGdydWJfZjJmc19pbm9kZSAqaW5vZGUsIGdydWJfdWludDMyX3QgYmxvY2ssCj4g KwkJCWdydWJfdWludDMyX3Qgb2Zmc2V0WzRdLCBncnViX3VpbnQzMl90IG5vZmZzZXRbNF0pCj4g K3sKPiArICBncnViX3VpbnQzMl90IGRpcmVjdF9ibGtzID0gQUREUlNfUEVSX0JMT0NLOwo+ICsg IGdydWJfdWludDMyX3QgZHB0cnNfcGVyX2JsayA9IE5JRFNfUEVSX0JMT0NLOwo+ICsgIGdydWJf dWludDMyX3QgaW5kaXJlY3RfYmxrcyA9IEFERFJTX1BFUl9CTE9DSyAqIE5JRFNfUEVSX0JMT0NL Owo+ICsgIGdydWJfdWludDMyX3QgZGluZGlyZWN0X2Jsa3MgPSBpbmRpcmVjdF9ibGtzICogTklE U19QRVJfQkxPQ0s7Cj4gKyAgZ3J1Yl91aW50MzJfdCBkaXJlY3RfaW5kZXggPSBERUZfQUREUlNf UEVSX0lOT0RFOwo+ICsgIGludCBuID0gMDsKPiArICBpbnQgbGV2ZWwgPSAwOwo+ICsKPiArICBp ZiAoX19pbm9kZV9mbGFnX3NldCAoaW5vZGUsIEZJX0lOTElORV9YQVRUUikpCj4gKyAgICBkaXJl Y3RfaW5kZXggLT0gRjJGU19JTkxJTkVfWEFUVFJfQUREUlM7Cj4gKwo+ICsgIG5vZmZzZXRbMF0g PSAwOwo+ICsKPiArICBpZiAoYmxvY2sgPCBkaXJlY3RfaW5kZXgpCj4gKyAgICB7Cj4gKyAgICAg IG9mZnNldFtuXSA9IGJsb2NrOwo+ICsgICAgICBnb3RvIGdvdDsKPiArICAgIH0KPiArCj4gKyAg YmxvY2sgLT0gZGlyZWN0X2luZGV4Owo+ICsgIGlmIChibG9jayA8IGRpcmVjdF9ibGtzKQo+ICsg ICAgewo+ICsgICAgICBvZmZzZXRbbisrXSA9IE5PREVfRElSMV9CTE9DSzsKPiArICAgICAgbm9m ZnNldFtuXSA9IDE7Cj4gKyAgICAgIG9mZnNldFtuXSA9IGJsb2NrOwo+ICsgICAgICBsZXZlbCA9 IDE7Cj4gKyAgICAgIGdvdG8gZ290Owo+ICsgICAgfQo+ICsKPiArICBibG9jayAtPSBkaXJlY3Rf YmxrczsKPiArICBpZiAoYmxvY2sgPCBkaXJlY3RfYmxrcykKPiArICAgIHsKPiArICAgICAgb2Zm c2V0W24rK10gPSBOT0RFX0RJUjJfQkxPQ0s7Cj4gKyAgICAgIG5vZmZzZXRbbl0gPSAyOwo+ICsg ICAgICBvZmZzZXRbbl0gPSBibG9jazsKPiArICAgICAgbGV2ZWwgPSAxOwo+ICsgICAgICBnb3Rv IGdvdDsKPiArICAgIH0KPiArCj4gKyAgYmxvY2sgLT0gZGlyZWN0X2Jsa3M7Cj4gKyAgaWYgKGJs b2NrIDwgaW5kaXJlY3RfYmxrcykKPiArICAgIHsKPiArICAgICAgb2Zmc2V0W24rK10gPSBOT0RF X0lORDFfQkxPQ0s7Cj4gKyAgICAgIG5vZmZzZXRbbl0gPSAzOwo+ICsgICAgICBvZmZzZXRbbisr XSA9IGJsb2NrIC8gZGlyZWN0X2Jsa3M7Cj4gKyAgICAgIG5vZmZzZXRbbl0gPSA0ICsgb2Zmc2V0 W24gLSAxXTsKClRoYXQgZG9lcyBub3QgZml0LiBZb3UgZGVjbGFyZWQgb2Zmc2V0IGFuZCBub2Zm c2V0IGFzIGFycmF5cyBvZiBmb3VyCmVsZW1lbnRzIGFuZCBwYXNzIGFycmF5cyBvZiBmb3VyIGVs ZW1lbnRzOyBoZXJlIGlzIG91dCBvZiBib3VuZAphY2Nlc3MgYWxyZWFkeS4KCj4gKyAgICAgIG9m ZnNldFtuXSA9IGJsb2NrICUgZGlyZWN0X2Jsa3M7Cj4gKyAgICAgIGxldmVsID0gMjsKPiArICAg ICAgZ290byBnb3Q7Cj4gKyAgICB9Cj4gKwo+ICsgIGJsb2NrIC09IGluZGlyZWN0X2Jsa3M7Cj4g KyAgaWYgKGJsb2NrIDwgaW5kaXJlY3RfYmxrcykKPiArICAgIHsKPiArICAgICAgb2Zmc2V0W24r K10gPSBOT0RFX0lORDJfQkxPQ0s7Cj4gKyAgICAgIG5vZmZzZXRbbl0gPSA0ICsgZHB0cnNfcGVy X2JsazsKPiArICAgICAgb2Zmc2V0W24rK10gPSBibG9jayAvIGRpcmVjdF9ibGtzOwo+ICsgICAg ICBub2Zmc2V0W25dID0gNSArIGRwdHJzX3Blcl9ibGsgKyBvZmZzZXRbbiAtIDFdOwo+ICsgICAg ICBvZmZzZXRbbl0gPSBibG9jayAlIGRpcmVjdF9ibGtzOwo+ICsgICAgICBsZXZlbCA9IDI7Cj4g KyAgICAgIGdvdG8gZ290Owo+ICsgICAgfQo+ICsKPiArICBibG9jayAtPSBpbmRpcmVjdF9ibGtz Owo+ICsgIGlmIChibG9jayA8IGRpbmRpcmVjdF9ibGtzKQo+ICsgICAgewo+ICsgICAgICBvZmZz ZXRbbisrXSA9IE5PREVfRElORF9CTE9DSzsKPiArICAgICAgbm9mZnNldFtuXSA9IDUgKyAoZHB0 cnNfcGVyX2JsayAqIDIpOwo+ICsgICAgICBvZmZzZXRbbisrXSA9IGJsb2NrIC8gaW5kaXJlY3Rf YmxrczsKPiArICAgICAgbm9mZnNldFtuXSA9IDYgKyAoZHB0cnNfcGVyX2JsayAqIDIpICsKPiAr CQlvZmZzZXRbbiAtIDFdICogKGRwdHJzX3Blcl9ibGsgKyAxKTsKPiArICAgICAgb2Zmc2V0W24r K10gPSAoYmxvY2sgLyBkaXJlY3RfYmxrcykgJSBkcHRyc19wZXJfYmxrOwo+ICsgICAgICBub2Zm c2V0W25dID0gNyArIChkcHRyc19wZXJfYmxrICogMikgKwo+ICsJCW9mZnNldFtuIC0gMl0gKiAo ZHB0cnNfcGVyX2JsayArIDEpICsKPiArCQlvZmZzZXRbbiAtIDFdOwo+ICsgICAgICBvZmZzZXRb bl0gPSBibG9jayAlIGRpcmVjdF9ibGtzOwo+ICsgICAgICBsZXZlbCA9IDM7Cj4gKyAgICAgIGdv dG8gZ290Owo+ICsgICAgfQo+ICtnb3Q6Cj4gKyAgcmV0dXJuIGxldmVsOwo+ICt9Cj4gKwo+ICsK PiArc3RhdGljIGdydWJfZXJyX3QKPiArbG9hZF9uYXRfaW5mbyAoc3RydWN0IGdydWJfZjJmc19k YXRhICpkYXRhKQo+ICt7Cj4gKyAgdm9pZCAqdmVyc2lvbl9iaXRtYXA7Cj4gKyAgZ3J1Yl9lcnJf dCBlcnI7Cj4gKwo+ICsgIGRhdGEtPm5hdF9iaXRtYXAgPSBncnViX21hbGxvYyAoX19uYXRfYml0 bWFwX3NpemUgKGRhdGEpKTsKPiArICBpZiAoIWRhdGEtPm5hdF9iaXRtYXApCj4gKyAgICByZXR1 cm4gZ3J1Yl9lcnJubzsKPiArCj4gKyAgdmVyc2lvbl9iaXRtYXAgPSBfX25hdF9iaXRtYXBfcHRy IChkYXRhKTsKPiArCj4gKyAgLyogY29weSB2ZXJzaW9uIGJpdG1hcCAqLwo+ICsgIGdydWJfbWVt Y3B5IChkYXRhLT5uYXRfYml0bWFwLCB2ZXJzaW9uX2JpdG1hcCwgX19uYXRfYml0bWFwX3NpemUg KGRhdGEpKTsKPiArCgpBbnkgcmVhc29uIHRvIGFjdHVhbGx5IGNvcHkgaXQ/IFdoeSBpcyBpdCBu b3QgcG9zc2libGUgdG8ganVzdCBzZXQKcG9pbnRlciB0byBzb3VyY2UsIHdoaWNoIGlzIGF2YWls YWJsZSBhbGwgdGhlIHRpbWUgYW55d2F5PwoKPiArICBlcnIgPSBnZXRfbmF0X2pvdXJuYWwgKGRh dGEpOwo+ICsgIGlmIChlcnIpCj4gKyAgICBncnViX2ZyZWUgKGRhdGEtPm5hdF9iaXRtYXApOwo+ ICsKPiArICByZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+ICtncnVi X2YyZnNfcmVhZF9ub2RlIChzdHJ1Y3QgZ3J1Yl9mMmZzX2RhdGEgKmRhdGEsCj4gKwkJCWdydWJf dWludDMyX3QgbmlkLCBzdHJ1Y3QgZ3J1Yl9mMmZzX25vZGUgKm5wKQo+ICt7Cj4gKyAgZ3J1Yl91 aW50MzJfdCBibGthZGRyOwo+ICsKPiArICBibGthZGRyID0gZ2V0X25vZGVfYmxrYWRkciAoZGF0 YSwgbmlkKTsKPiArICBpZiAoIWJsa2FkZHIpCj4gKyAgICByZXR1cm4gZ3J1Yl9lcnJubzsKPiAr Cj4gKyAgcmV0dXJuIGdydWJfZjJmc19ibG9ja19yZWFkIChkYXRhLCBibGthZGRyLCBucCk7CgpJ cyBzdHJ1Y3QgZ3J1Yl9mMmZzX25vZGUgZ3VhcmFudGVlZCB0byBhbHdheXMgaGF2ZSB0aGUgc2Ft ZSBzaXplIGFzIEYyRlMKYmxvY2s/IFRoZW4gYWRkaW5nIGNoYXIgW0YyRlNfQkxLU0laRV0gdG8g dW5pb24gdG8gbWFrZSBpdCBvYnZpb3VzIGlzCmJldHRlciBhbmQgZW5zdXJlcyB0aGF0IGl0IHdp bGwgYWx3YXlzIGJlIGF0IGxlYXN0IHRoaXMgc2l6ZS4KCj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1 Y3QgZ3J1Yl9mMmZzX2RhdGEgKgo+ICtncnViX2YyZnNfbW91bnQgKGdydWJfZGlza190IGRpc2sp Cj4gK3sKPiArICBzdHJ1Y3QgZ3J1Yl9mMmZzX2RhdGEgKmRhdGE7Cj4gKyAgZ3J1Yl9lcnJfdCBl cnI7Cj4gKwo+ICsgIGRhdGEgPSBncnViX3phbGxvYyAoc2l6ZW9mICgqZGF0YSkpOwo+ICsgIGlm ICghZGF0YSkKPiArICAgIHJldHVybiBOVUxMOwo+ICsKPiArICBkYXRhLT5kaXNrID0gZGlzazsK PiArCj4gKyAgZXJyID0gZ3J1Yl9mMmZzX3JlYWRfc2IgKGRhdGEsIDApOwo+ICsgIGlmIChlcnIp Cj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZjJmc19yZWFkX3NiIChkYXRhLCAxKTsKPiAr ICAgICAgaWYgKGVycikKPiArICAgICAgICB7Cj4gKyAgICAgICAgICBncnViX2Vycm9yIChHUlVC X0VSUl9CQURfRlMsICJub3QgYSBGMkZTIGZpbGVzeXN0ZW0iKTsKCk1heSBiZSBtZW50aW9uaW5n IHRoYXQgc3VwZXJibG9jayBjb3VsZCBub3QgYmUgcmVhZD8gSW4gYW5vdGhlciBwbGFjZQp5b3Ug YWxyZWFkeSB0ZWxsIHRoYXQgY2hlY2twb2ludHMgY291bGQgbm90IGJlIGZvdW5kLiBJdCBoZWxw cyB0bwp0cm91Ymxlc2hvb3QgaXNzdWVzLgoKPiArICAgICAgICAgIGdvdG8gZmFpbDsKPiArCX0K PiArICAgIH0KPiArCj4gKyAgZGF0YS0+cm9vdF9pbm8gPSBncnViX2xlX3RvX2NwdTMyIChkYXRh LT5zYmxvY2sucm9vdF9pbm8pOwo+ICsgIGRhdGEtPmNwX2Jsa2FkZHIgPSBncnViX2xlX3RvX2Nw dTMyIChkYXRhLT5zYmxvY2suY3BfYmxrYWRkcik7Cj4gKyAgZGF0YS0+bmF0X2Jsa2FkZHIgPSBn cnViX2xlX3RvX2NwdTMyIChkYXRhLT5zYmxvY2submF0X2Jsa2FkZHIpOwo+ICsgIGRhdGEtPmJs b2Nrc19wZXJfc2VnID0gMSA8PAo+ICsJCWdydWJfbGVfdG9fY3B1MzIgKGRhdGEtPnNibG9jay5s b2dfYmxvY2tzX3Blcl9zZWcpOwo+ICsKPiArICBlcnIgPSBncnViX2YyZnNfcmVhZF9jcCAoZGF0 YSk7Cj4gKyAgaWYgKGVycikKPiArICAgIGdvdG8gZmFpbDsKPiArCj4gKyAgZXJyID0gbG9hZF9u YXRfaW5mbyAoZGF0YSk7Cj4gKyAgaWYgKGVycikKPiArICAgIGdvdG8gZmFpbDsKPiArCj4gKyAg ZGF0YS0+ZGlyb3Blbi5kYXRhID0gZGF0YTsKPiArICBkYXRhLT5kaXJvcGVuLmlubyA9IGRhdGEt PnJvb3RfaW5vOwo+ICsgIGRhdGEtPmRpcm9wZW4uaW5vZGVfcmVhZCA9IDE7Cj4gKyAgZGF0YS0+ aW5vZGUgPSAmZGF0YS0+ZGlyb3Blbi5pbm9kZTsKPiArCj4gKyAgZXJyID0gZ3J1Yl9mMmZzX3Jl YWRfbm9kZSAoZGF0YSwgZGF0YS0+cm9vdF9pbm8sIGRhdGEtPmlub2RlKTsKPiArICBpZiAoZXJy KQo+ICsgICAgZ290byBmYWlsOwo+ICsKPiArICByZXR1cm4gZGF0YTsKPiArCj4gK2ZhaWw6Cj4g KyAgaWYgKGRhdGEpCj4gKyAgICBncnViX2ZyZWUgKGRhdGEtPm5hdF9iaXRtYXApOwoKRG91Ymxl IGZyZWUgYWZ0ZXIgbG9hZF9uYXRfaW5mbyBmYWlsdXJlLiBBc3N1bWluZyB0aGF0IHdlIGRvIG5l ZWQgdG8KYWxsb2NhdGUgYW55dGhpbmcgYXQgYWxsIChzZWUgYWJvdmUpLgoKPiArICBncnViX2Zy ZWUgKGRhdGEpOwo+ICsgIHJldHVybiBOVUxMOwo+ICt9Cj4gKwo+ICsvKiBndWFyYW50ZWUgaW5s aW5lX2RhdGEgd2FzIGhhbmRsZWQgYnkgY2FsbGVyICovCj4gK3N0YXRpYyBncnViX2Rpc2tfYWRk cl90Cj4gK2dydWJfZjJmc19yZWFkX2Jsb2NrIChncnViX2ZzaGVscF9ub2RlX3Qgbm9kZSwgZ3J1 Yl9kaXNrX2FkZHJfdCBibG9ja19vZnMpCgpZb3UgaGF2ZSBncnViX2YyZnNfcmVhZF9ibG9jayBh bmQgZ3J1Yl9mMmZzX2Jsb2NrX3JlYWQuIENvdWxkIHdlIG1ha2UKdGhlbSBtb3JlIGRpZmZlcmVu dCBhbmQgc2VsZi1leHBsYWluaW5nPyBJbiBwYXJ0aWN1bGFyLCB0aGlzIG9uZSBkb2VzCm5vdCBy ZWFkIGFueXRoaW5nLCBpdCByZXR1cm5zIGRpc2sgYWRkcmVzcy4gZ3J1Yl9mMmZzX21hcF9maWxl X2Jsb2NrPwoKPiArewo+ICsgIHN0cnVjdCBncnViX2YyZnNfZGF0YSAqZGF0YSA9IG5vZGUtPmRh dGE7Cj4gKyAgc3RydWN0IGdydWJfZjJmc19pbm9kZSAqaW5vZGUgPSAmbm9kZS0+aW5vZGUuaTsK PiArICBncnViX3VpbnQzMl90IG9mZnNldFs0XSwgbm9mZnNldFs0XSwgbmlkc1s0XTsKClNlZSBh Ym92ZSBhYm91dCBvdmVyZmxvdyBpbiBncnViX2dldF9pbm9kZV9wYXRoLgoKPiArICBzdHJ1Y3Qg Z3J1Yl9mMmZzX25vZGUgKm5vZGVfYmxvY2s7Cj4gKyAgZ3J1Yl91aW50MzJfdCBibG9ja19hZGRy ID0gLTE7Cj4gKyAgaW50IGxldmVsLCBpOwo+ICsKPiArICBsZXZlbCA9IGdydWJfZ2V0X25vZGVf cGF0aCAoaW5vZGUsIGJsb2NrX29mcywgb2Zmc2V0LCBub2Zmc2V0KTsKPiArICBpZiAobGV2ZWwg PT0gMCkKPiArICAgICAgcmV0dXJuIGdydWJfbGVfdG9fY3B1MzIgKGlub2RlLT5pX2FkZHJbb2Zm c2V0WzBdXSk7Cj4gKwo+ICsgIG5vZGVfYmxvY2sgPSBncnViX21hbGxvYyAoRjJGU19CTEtTSVpF KTsKPiArICBpZiAoIW5vZGVfYmxvY2spCj4gKyAgICByZXR1cm4gLTE7Cj4gKwo+ICsgIG5pZHNb MV0gPSBfX2dldF9ub2RlX2lkICgmbm9kZS0+aW5vZGUsIG9mZnNldFswXSwgMSk7Cj4gKwo+ICsg IC8qIGdldCBpbmRpcmVjdCBvciBkaXJlY3Qgbm9kZXMgKi8KPiArICBmb3IgKGkgPSAxOyBpIDw9 IGxldmVsOyBpKyspCj4gKyAgICB7Cj4gKyAgICAgIGdydWJfZjJmc19yZWFkX25vZGUgKGRhdGEs IG5pZHNbaV0sIG5vZGVfYmxvY2spOwo+ICsgICAgICBpZiAoZ3J1Yl9lcnJubykKPiArICAgICAg ICBnb3RvIGZhaWw7Cj4gKwo+ICsgICAgICBpZiAoaSA8IGxldmVsKQo+ICsgICAgICAgIG5pZHNb aSArIDFdID0gX19nZXRfbm9kZV9pZCAobm9kZV9ibG9jaywgb2Zmc2V0W2ldLCAwKTsKPiArICAg IH0KPiArCj4gKyAgYmxvY2tfYWRkciA9IGdydWJfbGVfdG9fY3B1MzIgKG5vZGVfYmxvY2stPmRu LmFkZHJbb2Zmc2V0W2xldmVsXV0pOwo+ICtmYWlsOgo+ICsgIGdydWJfZnJlZSAobm9kZV9ibG9j ayk7Cj4gKyAgcmV0dXJuIGJsb2NrX2FkZHI7Cj4gK30KPiArCi4uLgo+ICsKPiArc3RhdGljIGNo YXIgKgo+ICtncnViX2YyZnNfcmVhZF9zeW1saW5rIChncnViX2ZzaGVscF9ub2RlX3Qgbm9kZSkK PiArewo+ICsgIGNoYXIgKnN5bWxpbms7Cj4gKyAgc3RydWN0IGdydWJfZnNoZWxwX25vZGUgKmRp cm8gPSBub2RlOwo+ICsKPiArICBpZiAoIWRpcm8tPmlub2RlX3JlYWQpCj4gKyAgICB7Cj4gKyAg ICAgIGdydWJfZjJmc19yZWFkX25vZGUgKGRpcm8tPmRhdGEsIGRpcm8tPmlubywgJmRpcm8tPmlu b2RlKTsKPiArICAgICAgaWYgKGdydWJfZXJybm8pCj4gKwlyZXR1cm4gMDsKPiArICAgIH0KPiAr Cj4gKyAgc3ltbGluayA9IGdydWJfbWFsbG9jIChfX2lfc2l6ZSAoJmRpcm8tPmlub2RlLmkpICsg MSk7Cj4gKyAgaWYgKCFzeW1saW5rKQo+ICsgICAgcmV0dXJuIDA7Cj4gKwo+ICsgIGdydWJfZjJm c19yZWFkX2ZpbGUgKGRpcm8sIDAsIDAsIDAsIF9faV9zaXplICgmZGlyby0+aW5vZGUuaSksIHN5 bWxpbmspOwo+ICsgIGlmIChncnViX2Vycm5vKQo+ICsgICAgewo+ICsgICAgICBncnViX2ZyZWUg KHN5bWxpbmspOwo+ICsgICAgICByZXR1cm4gMDsKPiArICAgIH0KPiArCgpXaGF0IGFib3V0IHNo b3J0IHJlYWQ/IElzIHRoaXMgYW4gZXJyb3Igb3Igbm90PwoKPiArICBzeW1saW5rW19faV9zaXpl ICgmZGlyby0+aW5vZGUuaSldID0gJ1wwJzsKPiArICByZXR1cm4gc3ltbGluazsKPiArfQo+ICsK PiArc3RhdGljIGludAo+ICtncnViX2YyZnNfY2hlY2tfZGVudHJpZXMgKHN0cnVjdCBncnViX2Yy ZnNfZGlyX2l0ZXJfY3R4ICpjdHgpCj4gK3sKPiArICBzdHJ1Y3QgZ3J1Yl9mc2hlbHBfbm9kZSAq ZmRpcm87Cj4gKyAgaW50IGk7Cj4gKwo+ICsgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm1heDspCj4g KyAgICB7Cj4gKyAgICAgIGNoYXIgZmlsZW5hbWVbRjJGU19OQU1FX0xFTiArIDFdOwoKQ291bGQg d2UgYXZvaWQgbGFyZ2Ugc3RhY2sgYWxsb2NhdGlvbnM/Cgo+ICsgICAgICBlbnVtIGdydWJfZnNo ZWxwX2ZpbGV0eXBlIHR5cGUgPSBHUlVCX0ZTSEVMUF9VTktOT1dOOwo+ICsgICAgICBlbnVtIEZJ TEVfVFlQRSBmdHlwZTsKPiArICAgICAgaW50IG5hbWVfbGVuOwo+ICsKPiArICAgICAgaWYgKF9f dGVzdF9iaXQgKGksIGN0eC0+Yml0bWFwKSA9PSAwKQoKZ3J1Yl9mMmZzX3Rlc3RfYml0X2xlMzI/ Cgo+ICsgICAgICAgIHsKPiArICAgICAgICAgIGkrKzsKPiArICAgICAgICAgIGNvbnRpbnVlOwo+ ICsgICAgICAgIH0KPiArCj4gKyAgICAgIGZ0eXBlID0gY3R4LT5kZW50cnlbaV0uZmlsZV90eXBl Owo+ICsgICAgICBuYW1lX2xlbiA9IGdydWJfbGVfdG9fY3B1MTYgKGN0eC0+ZGVudHJ5W2ldLm5h bWVfbGVuKTsKPiArICAgICAgZ3J1Yl9tZW1jcHkgKGZpbGVuYW1lLCBjdHgtPmZpbGVuYW1lW2ld LCBuYW1lX2xlbik7Cj4gKyAgICAgIGZpbGVuYW1lW25hbWVfbGVuXSA9ICdcMCc7Cj4gKwo+ICsg ICAgICBmZGlybyA9IGdydWJfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBncnViX2ZzaGVscF9ub2Rl KSk7Cj4gKyAgICAgIGlmICghZmRpcm8pCj4gKyAgICAgICAgcmV0dXJuIDA7Cj4gKwo+ICsgICAg ICBpZiAoZnR5cGUgPT0gRjJGU19GVF9ESVIpCj4gKyAgICAgICAgdHlwZSA9IEdSVUJfRlNIRUxQ X0RJUjsKPiArICAgICAgZWxzZSBpZiAoZnR5cGUgPT0gRjJGU19GVF9TWU1MSU5LKQo+ICsgICAg ICAgIHR5cGUgPSBHUlVCX0ZTSEVMUF9TWU1MSU5LOwo+ICsgICAgICBlbHNlIGlmIChmdHlwZSA9 PSBGMkZTX0ZUX1JFR19GSUxFKQo+ICsgICAgICAgIHR5cGUgPSBHUlVCX0ZTSEVMUF9SRUc7Cj4g Kwo+ICsgICAgICBmZGlyby0+ZGF0YSA9IGN0eC0+ZGF0YTsKPiArICAgICAgZmRpcm8tPmlubyA9 IGdydWJfbGVfdG9fY3B1MzIgKGN0eC0+ZGVudHJ5W2ldLmlubyk7Cj4gKyAgICAgIGZkaXJvLT5p bm9kZV9yZWFkID0gMDsKPiArCj4gKyAgICAgIGlmIChjdHgtPmhvb2sgKGZpbGVuYW1lLCB0eXBl LCBmZGlybywgY3R4LT5ob29rX2RhdGEpKQo+ICsgICAgICAgIHJldHVybiAxOwo+ICsKPiArICAg ICAgaSArPSAobmFtZV9sZW4gKyBGMkZTX1NMT1RfTEVOIC0gMSkgLyBGMkZTX1NMT1RfTEVOOwo+ ICsgICAgfQo+ICsgICAgcmV0dXJuIDA7Cj4gK30KPiArCi4uLgo+ICsKPiArc3RhdGljIGludAo+ ICtncnViX2YyZnNfaXRlcmF0ZV9kaXIgKGdydWJfZnNoZWxwX25vZGVfdCBkaXIsCj4gKwkJCSBn cnViX2ZzaGVscF9pdGVyYXRlX2Rpcl9ob29rX3QgaG9vaywgdm9pZCAqaG9va19kYXRhKQo+ICt7 Cj4gKyAgc3RydWN0IGdydWJfZnNoZWxwX25vZGUgKmRpcm8gPSAoc3RydWN0IGdydWJfZnNoZWxw X25vZGUgKikgZGlyOwo+ICsgIHN0cnVjdCBncnViX2YyZnNfaW5vZGUgKmlub2RlOwo+ICsgIHN0 cnVjdCBncnViX2YyZnNfZGlyX2l0ZXJfY3R4IGN0eCA9IHsKPiArICAgIC5kYXRhID0gZGlyby0+ ZGF0YSwKPiArICAgIC5ob29rID0gaG9vaywKPiArICAgIC5ob29rX2RhdGEgPSBob29rX2RhdGEK PiArICB9Owo+ICsgIGdydWJfb2ZmX3QgZnBvcyA9IDA7Cj4gKwo+ICsgIGlmICghZGlyby0+aW5v ZGVfcmVhZCkKPiArICAgIHsKPiArICAgICAgZ3J1Yl9mMmZzX3JlYWRfbm9kZSAoZGlyby0+ZGF0 YSwgZGlyby0+aW5vLCAmZGlyby0+aW5vZGUpOwo+ICsgICAgICBpZiAoZ3J1Yl9lcnJubykKPiAr CXJldHVybiAwOwo+ICsgICAgfQo+ICsKPiArICBpbm9kZSA9ICZkaXJvLT5pbm9kZS5pOwo+ICsK PiArICBpZiAoX19pbm9kZV9mbGFnX3NldCAoaW5vZGUsIEZJX0lOTElORV9ERU5UUlkpKQo+ICsg ICAgcmV0dXJuIGdydWJfZjJmc19pdGVyYXRlX2lubGluZV9kaXIgKGlub2RlLCAmY3R4KTsKPiAr Cj4gKyAgd2hpbGUgKGZwb3MgPCBfX2lfc2l6ZSAoaW5vZGUpKQo+ICsgICAgewo+ICsgICAgICBz dHJ1Y3QgZ3J1Yl9mMmZzX2RlbnRyeV9ibG9jayAqZGVfYmxrOwo+ICsgICAgICBjaGFyICpidWY7 Cj4gKwo+ICsgICAgICBidWYgPSBncnViX3phbGxvYyAoRjJGU19CTEtTSVpFKTsKPiArICAgICAg aWYgKCFidWYpCj4gKyAgICAgICAgcmV0dXJuIDA7Cj4gKwo+ICsgICAgICBncnViX2YyZnNfcmVh ZF9maWxlIChkaXJvLCAwLCAwLCBmcG9zLCBGMkZTX0JMS1NJWkUsIGJ1Zik7Cj4gKyAgICAgIGlm IChncnViX2Vycm5vKQo+ICsgICAgICAgIHsKPiArICAgICAgICAgIGdydWJfZnJlZSAoYnVmKTsK PiArICAgICAgICAgIHJldHVybiAwOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIGRlX2JsayA9 IChzdHJ1Y3QgZ3J1Yl9mMmZzX2RlbnRyeV9ibG9jayAqKSBidWY7Cj4gKwo+ICsgICAgICBjdHgu Yml0bWFwID0gKGdydWJfdWludDMyX3QgKikgZGVfYmxrLT5kZW50cnlfYml0bWFwOwo+ICsgICAg ICBjdHguZGVudHJ5ID0gZGVfYmxrLT5kZW50cnk7Cj4gKyAgICAgIGN0eC5maWxlbmFtZSA9IGRl X2Jsay0+ZmlsZW5hbWU7Cj4gKyAgICAgIGN0eC5tYXggPSBOUl9ERU5UUllfSU5fQkxPQ0s7Cj4g Kwo+ICsgICAgICBpZiAoZ3J1Yl9mMmZzX2NoZWNrX2RlbnRyaWVzICgmY3R4KSkKPiArICAgICAg ICByZXR1cm4gMTsKCm1lbW9yeSBsZWFrCgo+ICsKPiArICAgICAgZ3J1Yl9mcmVlIChidWYpOwo+ ICsKPiArICAgICAgZnBvcyArPSBGMkZTX0JMS1NJWkU7Cj4gKyAgICB9Cj4gKyAgcmV0dXJuIDA7 Cj4gK30KPiArCi4uLgo+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+ICtncnViX2YyZnNfZGlyIChncnVi X2RldmljZV90IGRldmljZSwgY29uc3QgY2hhciAqcGF0aCwKPiArCQkgZ3J1Yl9mc19kaXJfaG9v a190IGhvb2ssIHZvaWQgKmhvb2tfZGF0YSkKPiArewo+ICsgIHN0cnVjdCBncnViX2YyZnNfZGly X2N0eCBjdHggPSB7Cj4gKyAgICAuaG9vayA9IGhvb2ssCj4gKyAgICAuaG9va19kYXRhID0gaG9v a19kYXRhCj4gKyAgfTsKPiArICBzdHJ1Y3QgZ3J1Yl9mc2hlbHBfbm9kZSAqZmRpcm8gPSAwOwo+ ICsKPiArICBncnViX2RsX3JlZiAobXlfbW9kKTsKPiArCj4gKyAgY3R4LmRhdGEgPSBncnViX2Yy ZnNfbW91bnQgKGRldmljZS0+ZGlzayk7Cj4gKyAgaWYgKCFjdHguZGF0YSkKPiArICAgIGdvdG8g ZmFpbDsKPiArCj4gKyAgZ3J1Yl9mc2hlbHBfZmluZF9maWxlIChwYXRoLCAmY3R4LmRhdGEtPmRp cm9wZW4sICZmZGlybywKPiArCQkJIGdydWJfZjJmc19pdGVyYXRlX2RpciwgZ3J1Yl9mMmZzX3Jl YWRfc3ltbGluaywKPiArCQkJIEdSVUJfRlNIRUxQX0RJUik7Cj4gKyAgaWYgKGdydWJfZXJybm8p Cj4gKyAgICBnb3RvIGZhaWw7Cj4gKwo+ICsgIGdydWJfZjJmc19pdGVyYXRlX2RpciAoZmRpcm8s IGdydWJfZjJmc19kaXJfaXRlciwgJmN0eCk7Cj4gKwo+ICtmYWlsOgo+ICsgIGlmIChmZGlybyAh PSAmY3R4LmRhdGEtPmRpcm9wZW4pCj4gKyAgICBncnViX2ZyZWUgKGZkaXJvKTsKPiArICBpZiAo Y3R4LmRhdGEpCj4gKyAgICBncnViX2ZyZWUgKGN0eC5kYXRhLT5uYXRfYml0bWFwKTsKClRyaXBs ZSBmcmVlIDopCgo+ICsgIGdydWJfZnJlZSAoY3R4LmRhdGEpOwo+ICsgIGdydWJfZGxfdW5yZWYg KG15X21vZCk7Cj4gKyAgcmV0dXJuIGdydWJfZXJybm87Cj4gK30KPiArCj4gKwo+ICsvKiBPcGVu IGEgZmlsZSBuYW1lZCBOQU1FIGFuZCBpbml0aWFsaXplIEZJTEUuICAqLwo+ICtzdGF0aWMgZ3J1 Yl9lcnJfdAo+ICtncnViX2YyZnNfb3BlbiAoc3RydWN0IGdydWJfZmlsZSAqZmlsZSwgY29uc3Qg Y2hhciAqbmFtZSkKPiArewo+ICsgIHN0cnVjdCBncnViX2YyZnNfZGF0YSAqZGF0YSA9IE5VTEw7 Cj4gKyAgc3RydWN0IGdydWJfZnNoZWxwX25vZGUgKmZkaXJvID0gMDsKPiArCj4gKyAgZ3J1Yl9k bF9yZWYgKG15X21vZCk7Cj4gKwo+ICsgIGRhdGEgPSBncnViX2YyZnNfbW91bnQgKGZpbGUtPmRl dmljZS0+ZGlzayk7Cj4gKyAgaWYgKCFkYXRhKQo+ICsgICAgZ290byBmYWlsOwo+ICsKPiArICBn cnViX2ZzaGVscF9maW5kX2ZpbGUgKG5hbWUsICZkYXRhLT5kaXJvcGVuLCAmZmRpcm8sCj4gKwkJ CSBncnViX2YyZnNfaXRlcmF0ZV9kaXIsIGdydWJfZjJmc19yZWFkX3N5bWxpbmssCj4gKwkJCSBH UlVCX0ZTSEVMUF9SRUcpOwo+ICsgIGlmIChncnViX2Vycm5vKQo+ICsgICAgZ290byBmYWlsOwo+ ICsKPiArICBpZiAoIWZkaXJvLT5pbm9kZV9yZWFkKQo+ICsgICAgewo+ICsgICAgICBncnViX2Yy ZnNfcmVhZF9ub2RlIChkYXRhLCBmZGlyby0+aW5vLCAmZmRpcm8tPmlub2RlKTsKPiArICAgICAg aWYgKGdydWJfZXJybm8pCj4gKwlnb3RvIGZhaWw7Cj4gKyAgICB9Cj4gKwo+ICsgIGdydWJfbWVt Y3B5IChkYXRhLT5pbm9kZSwgJmZkaXJvLT5pbm9kZSwgRjJGU19CTEtTSVpFKTsKc2l6ZW9mICgq ZGF0YS0+aW5vZGUpPyBPciB0aGV5IGNhbiBiZSBkaWZmZXJlbnQ/Cgo+ICsgIGdydWJfZnJlZSAo ZmRpcm8pOwo+ICsKPiArICBmaWxlLT5zaXplID0gX19pX3NpemUgKCYoZGF0YS0+aW5vZGUtPmkp KTsKPiArICBmaWxlLT5kYXRhID0gZGF0YTsKPiArICBmaWxlLT5vZmZzZXQgPSAwOwo+ICsKPiAr ICByZXR1cm4gMDsKPiArCj4gK2ZhaWw6Cj4gKyAgaWYgKGZkaXJvICE9ICZkYXRhLT5kaXJvcGVu KQo+ICsgICAgZ3J1Yl9mcmVlIChmZGlybyk7Cj4gKyAgaWYgKGRhdGEpCj4gKyAgICBncnViX2Zy ZWUgKGRhdGEtPm5hdF9iaXRtYXApOwoKQWdhaW4uCgo+ICsgIGdydWJfZnJlZSAoZGF0YSk7Cj4g Kwo+ICsgIGdydWJfZGxfdW5yZWYgKG15X21vZCk7Cj4gKwo+ICsgIHJldHVybiBncnViX2Vycm5v Owo+ICt9Cj4gKwo+ICtzdGF0aWMgZ3J1Yl9zc2l6ZV90Cj4gK2dydWJfZjJmc19yZWFkIChncnVi X2ZpbGVfdCBmaWxlLCBjaGFyICpidWYsIGdydWJfc2l6ZV90IGxlbikKPiArewo+ICsgIHN0cnVj dCBncnViX2YyZnNfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgZ3J1Yl9mMmZzX2RhdGEgKikgZmlsZS0+ ZGF0YTsKPiArCj4gKyAgcmV0dXJuIGdydWJfZjJmc19yZWFkX2ZpbGUgKCZkYXRhLT5kaXJvcGVu LAo+ICsJCQkJZmlsZS0+cmVhZF9ob29rLCBmaWxlLT5yZWFkX2hvb2tfZGF0YSwKPiArCQkJCWZp bGUtPm9mZnNldCwgbGVuLCBidWYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+ICtn cnViX2YyZnNfY2xvc2UgKGdydWJfZmlsZV90IGZpbGUpCj4gK3sKPiArICBzdHJ1Y3QgZ3J1Yl9m MmZzX2RhdGEgKmRhdGEgPSAoc3RydWN0IGdydWJfZjJmc19kYXRhICopIGZpbGUtPmRhdGE7Cj4g Kwo+ICsgIGlmIChkYXRhKQo+ICsgICAgZ3J1Yl9mcmVlIChkYXRhLT5uYXRfYml0bWFwKTsKCkFn YWluLgoKPiArICBncnViX2ZyZWUgKGRhdGEpOwo+ICsKPiArICBncnViX2RsX3VucmVmIChteV9t b2QpOwo+ICsKPiArICByZXR1cm4gR1JVQl9FUlJfTk9ORTsKPiArfQo+ICsKPiArc3RhdGljIGdy dWJfZXJyX3QKPiArZ3J1Yl9mMmZzX2xhYmVsIChncnViX2RldmljZV90IGRldmljZSwgY2hhciAq KmxhYmVsKQo+ICt7Cj4gKyAgc3RydWN0IGdydWJfZjJmc19kYXRhICpkYXRhOwo+ICsgIGdydWJf ZGlza190IGRpc2sgPSBkZXZpY2UtPmRpc2s7Cj4gKwo+ICsgIGdydWJfZGxfcmVmIChteV9tb2Qp Owo+ICsKPiArICBkYXRhID0gZ3J1Yl9mMmZzX21vdW50IChkaXNrKTsKPiArICBpZiAoZGF0YSkK PiArICAgIHsKPiArICAgICAgKmxhYmVsID0gZ3J1Yl96YWxsb2MgKHNpemVvZiAoZGF0YS0+c2Js b2NrLnZvbHVtZV9uYW1lKSk7Cj4gKyAgICAgIGdydWJfdXRmMTZfdG9fdXRmOCAoKGdydWJfdWlu dDhfdCAqKSAoKmxhYmVsKSwKCm1hbGxvYyBmYWlsdXJlIGNoZWNrPwoKPiArCQkJCWRhdGEtPnNi bG9jay52b2x1bWVfbmFtZSwgNTEyKTsKCldoZXJlIDUxMiBjb21lcyBmcm9tPyBTaG91bGQgaXQg bm90IGJlIHNpemVvZgooZGF0YS0+c2Jsb2NrLnZvbHVtZV9uYW1lKSBhcyB3ZWxsPwoKPiArICAg IH0KPiArICBlbHNlCj4gKyAgICAqbGFiZWwgPSBOVUxMOwo+ICsKPiArICBpZiAoZGF0YSkKPiAr ICAgIGdydWJfZnJlZSAoZGF0YS0+bmF0X2JpdG1hcCk7CgpBZ2Fpbi4KCj4gKyAgZ3J1Yl9mcmVl IChkYXRhKTsKPiArICBncnViX2RsX3VucmVmIChteV9tb2QpOwo+ICsgIHJldHVybiBncnViX2Vy cm5vOwo+ICt9Cj4gKwouLi4KPiBkaWZmIC0tZ2l0IGEvdGVzdHMvdXRpbC9ncnViLWZzLXRlc3Rl ci5pbiBiL3Rlc3RzL3V0aWwvZ3J1Yi1mcy10ZXN0ZXIuaW4KPiBpbmRleCBlOWU4NWMyLi5hY2Mz NWNjIDEwMDY0NAo+IC0tLSBhL3Rlc3RzL3V0aWwvZ3J1Yi1mcy10ZXN0ZXIuaW4KPiArKysgYi90 ZXN0cy91dGlsL2dydWItZnMtdGVzdGVyLmluCj4gQEAgLTM2LDcgKzM2LDcgQEAgY2FzZSB4IiRm cyIgaW4KPiAgCU1JTkxPR1NFQ1NJWkU9OAo+ICAJICAgICMgIE9TIExJTUlUQVRJT046IEl0IGNv dWxkIGdvIHVwIHRvIDMyNzY4IGJ1dCBMaW51eCByZWplY3RzIHNlY3RvciBzaXplcyA+IDQwOTYK PiAgCU1BWExPR1NFQ1NJWkU9MTI7Owo+IC0gICAgeHhmcykKPiArICAgIHh4ZnN8eGYyZnMpCj4g IAlNSU5MT0dTRUNTSVpFPTkKPiAgICAJICAgICMgT1MgTElNSVRBVElPTjogR05VL0xpbnV4IGRv ZXNuJ3QgYWNjZXB0ID4gNDA5Ngo+ICAJTUFYTE9HU0VDU0laRT0xMjs7Cj4gQEAgLTEzNSw2ICsx MzUsMTAgQEAgZm9yICgoTE9HU0VDU0laRT1NSU5MT0dTRUNTSVpFO0xPR1NFQ1NJWkU8PU1BWExP R1NFQ1NJWkU7TE9HU0VDU0laRT1MT0dTRUNTSVpFICsKPiAgCSAgICBmaQo+ICAJICAgIE1BWEJM S1NJWkU9NDA5Ngo+ICAJICAgIDs7Cj4gKwl4ZjJmcykKPiArCSAgICBNSU5CTEtTSVpFPSRTRUNT SVpFCj4gKwkJIyBPUyBMaW1pdGF0aW9uOiBHTlUvTGludXggZG9lc24ndCBhY2NlcHQgPiA0MDk2 Cj4gKwkgICAgTUFYQkxLU0laRT00MDk2OzsKPiAgCXhzcXVhc2gqKQo+ICAJICAgIE1JTkJMS1NJ WkU9NDA5Ngo+ICAJICAgIE1BWEJMS1NJWkU9MTA0ODU3Njs7Cj4gQEAgLTI1Niw3ICsyNjAsOSBA QCBmb3IgKChMT0dTRUNTSVpFPU1JTkxPR1NFQ1NJWkU7TE9HU0VDU0laRTw9TUFYTE9HU0VDU0la RTtMT0dTRUNTSVpFPUxPR1NFQ1NJWkUgKwo+ICAJICAgICMgRlMgTElNSVRBVElPTjogYnRyZnMg bGFiZWwgaXMgYXQgbW9zdCAyNTUgVVRGLTggY2hhcnMKPiAgCQl4ImJ0cmZzIiopCj4gIAkJICAg IEZTTEFCRUw9ImdydWJfOy90ZXN0w6nwr6ab8K+mnfCfmIHQutC40YDQuNGCaSB1cmV3ZmNlbml1 ZXdydWV2cmV3bnV1aXJldXJldnVldXJuaWV2cmV3Zm5lcmZjbmV2aXJpdmlucmV3dm5pcmV3bml2 cmV3aXV2Y3Jld3ZudWV3dnJycmV3bml1ZXJ3cmVpdXZpdXJld2l1dml1cmV3bnV2ZXdudnJlbnVy bnVudXZyZXZ1dXJlcmVqaXJlbXZyZWlqbnZjcmVpdmlyZSBudmVyaXZucmVpdnJldm51cmVpb3Jm bmZydm9lb2lyb2lyZW9pcmVvaWZyZWZvaWVyb2lmb2lyZW9pZiI7Owo+IC0KPiArCSAgICAjIEZT IExJTUlUQVRJT046IGJ0cmZzIGxhYmVsIGlzIGF0IG1vc3QgNTEyIFVURi0xNiBjaGFycwoKRjJG Uywgbm90IGJ0cmZzCgo+ICsJCXgiZjJmcyIpCj4gKwkJICAgIEZTTEFCRUw9ImdydWJfOy90ZXN0 amFlZ2V1ayBraW0gCgpDb3VsZCB5b3UgbGVhdmUgaW5pdGlhbCBwYXJ0IGluIHBsYWNlPyBUaGlz IGluY2x1ZGVzIHNvbWUgZnVubnkgVU5JQ09ERQpjaGFyYWN0ZXJzIGZvciBhIHJlYXNvbiwgYWN0 dWFsbHkuIFVubGVzcyB0aGlzIGlzIG5vdCBwb3NzaWJsZSB3aXRoCmYyZnM/CgpmMmZzYXNrZGZq a2FzZGxmYWpza2RmamFrc2RqZmtqYXNramtqa3pqa2pja3pqdmtjamtqa2pla3Fqa3dlamtxd3Js a2FzZGZqa3NhZGpmbGFza2Roenhodmp6eGNodmp6a3hjaHZqa2hha2pzZGhmamtocWprd2Vocmpr aGFzamtkZmhqa2FzaGRmamtoanpreGhjamt2emh4Y2prdmh6eGpjaHZremh4Y2tqdmhqemt4Y2h2 amtoempreGNodmpremh4Y2tqdmh6a3hqY2h2a2p6eGhja2p2enhjamt2aGp6eGtjaGt2amh6eGtq Y3ZoamtoamthaHNqa2Roa2pxaHdla3JqaGFranNkZmhramFzaGRranpoeGN2amtoenhjdnp4Y3Zn Z2dnZ2dnZ2dnZiI7Owo+ICAJICAgICMgRlMgTElNSVRBVElPTjogZXhmYXQgaXMgYXQgbW9zdCAx NSBVVEYtMTYgY2hhcnMKPiAgCQl4ImV4ZmF0IikKPiAgCQkgICAgRlNMQUJFTD0iZ8Op0YIgOy/w r6ab8K+mnfCfmIHQutC40YAiOzsKPiBAQCAtNDY2LDcgKzQ3Miw3IEBAIGZvciAoKExPR1NFQ1NJ WkU9TUlOTE9HU0VDU0laRTtMT0dTRUNTSVpFPD1NQVhMT0dTRUNTSVpFO0xPR1NFQ1NJWkU9TE9H U0VDU0laRSArCj4gIAkgICAgIyBGSVhNRTogTm90IHN1cmUgYWJvdXQgQnRyRlMsIE5URlMsIEpG UywgQUZTLCBVREYgYW5kIFNGUy4gQ2hlY2sgaXQuCj4gIAkjIEZTIExJTUlUQVRJT046IGFzIGZh ciBhcyBJIGtub3cgdGhvc2UgRlMgZG9uJ3Qgc3RvcmUgdGhlaXIgbGFzdCBtb2RpZmljYXRpb24g ZGF0ZS4KPiAgCQl4Impmc19jYXNlaW5zIiB8IHgiamZzIiB8IHgieGZzInwgeCJidHJmcyIqIHwg eCJyZWlzZXJmc19vbGQiIHwgeCJyZWlzZXJmcyIgXAo+IC0JCSAgICB8IHgiYmZzIiB8IHgiYWZz IiBcCj4gKwkJICAgIHwgeCJiZnMiIHwgeCJhZnMiIHwgeCJmMmZzIiBcCj4gIAkJICAgIHwgeCJ0 YXJmcyIgfCB4ImNwaW9fIiogfCB4Im1pbml4IiB8IHgibWluaXgyIiBcCj4gIAkJICAgIHwgeCJt aW5peDMiIHwgeCJudGZzIiogfCB4InVkZiIgfCB4InNmcyIqKQo+ICAJCSAgICBOT0ZTVElNRT15 OzsKPiBAQCAtNzQ1LDYgKzc1MSw4IEBAIGZvciAoKExPR1NFQ1NJWkU9TUlOTE9HU0VDU0laRTtM T0dTRUNTSVpFPD1NQVhMT0dTRUNTSVpFO0xPR1NFQ1NJWkU9TE9HU0VDU0laRSArCj4gIAkJICAg IE1PVU5UREVWSUNFPSIvZGV2L21hcHBlci9ncnViX3Rlc3QtdGVzdHZvbCIKPiAgCQkgICAgTU9V TlRGUz1leHQyCj4gIAkJICAgICJta2ZzLmV4dDIiIC1MICIkRlNMQUJFTCIgLXEgIiR7TU9VTlRE RVZJQ0V9IiAgOzsKPiArCQl4ZjJmcykKPiArCQkgICAgIm1rZnMuZjJmcyIgLWwgIiRGU0xBQkVM IiAtcSAiJHtMT0RFVklDRVNbMF19IiA7Owo+ICAJCXhuaWxmczIpCj4gIAkJICAgICJta2ZzLm5p bGZzMiIgLUwgIiRGU0xBQkVMIiAtYiAkQkxLU0laRSAgLXEgIiR7TE9ERVZJQ0VTWzBdfSIgOzsK PiAgCQl4ZXh0Ml9vbGQpCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KR3J1Yi1kZXZlbCBtYWlsaW5nIGxpc3QKR3J1Yi1kZXZlbEBnbnUub3JnCmh0dHBz Oi8vbGlzdHMuZ251Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2dydWItZGV2ZWwK