From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH i-g-t] tests: make color management tests part of the BAT Date: Tue, 19 Jul 2016 08:48:11 +0200 Message-ID: <20160719064811.GF17101@phenom.ffwll.local> References: <1468591259-2654-1-git-send-email-lionel.g.landwerlin@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 244CE6E5B3 for ; Tue, 19 Jul 2016 06:48:18 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id x83so1641858wma.3 for ; Mon, 18 Jul 2016 23:48:18 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1468591259-2654-1-git-send-email-lionel.g.landwerlin@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Lionel Landwerlin Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gRnJpLCBKdWwgMTUsIDIwMTYgYXQgMDM6MDA6NTlQTSArMDEwMCwgTGlvbmVsIExhbmR3ZXJs aW4gd3JvdGU6Cj4gU2lnbmVkLW9mZi1ieTogTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxh bmR3ZXJsaW5AaW50ZWwuY29tPgoKRG8gd2UgaGF2ZSB0aGUgdGltZSBmb3IgdGhvc2UgaW4gdGhl IEJBVCBidWRnZXQ/Ci1EYW5pZWwKCj4gLS0tCj4gIHRlc3RzL01ha2VmaWxlLnNvdXJjZXMgICAg ICAgfCAgICAyICstCj4gIHRlc3RzL2ttc19waXBlX2NvbG9yLmMgICAgICAgfCAxMTg0IC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICB0ZXN0cy9rbXNfcGlwZV9j b2xvcl9iYXNpYy5jIHwgMTE4NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAxMTg1IGluc2VydGlvbnMoKyksIDExODUgZGVsZXRp b25zKC0pCj4gIGRlbGV0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9rbXNfcGlwZV9jb2xvci5jCj4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9rbXNfcGlwZV9jb2xvcl9iYXNpYy5jCj4gCj4gZGlmZiAt LWdpdCBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCj4g aW5kZXggOGE5YTdlYy4uNTNhZmUzYyAxMDA2NDQKPiAtLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3Vy Y2VzCj4gKysrIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwo+IEBAIC05OCw3ICs5OCw3IEBAIFRF U1RTX3Byb2dzX00gPSBcCj4gIAlrbXNfbGVnYWN5X2NvbG9ya2V5IFwKPiAgCWttc19tbWlvX3Zz X2NzX2ZsaXAgXAo+ICAJa21zX3BpcGVfYl9jX2l2YiBcCj4gLQlrbXNfcGlwZV9jb2xvciBcCj4g KwlrbXNfcGlwZV9jb2xvcl9iYXNpYyBcCj4gIAlrbXNfcGlwZV9jcmNfYmFzaWMgXAo+ICAJa21z X3BsYW5lIFwKPiAgCWttc19wc3Jfc2lua19jcmMgXAo+IGRpZmYgLS1naXQgYS90ZXN0cy9rbXNf cGlwZV9jb2xvci5jIGIvdGVzdHMva21zX3BpcGVfY29sb3IuYwo+IGRlbGV0ZWQgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDlmN2FjN2UuLjAwMDAwMDAKPiAtLS0gYS90ZXN0cy9rbXNfcGlwZV9j b2xvci5jCj4gKysrIC9kZXYvbnVsbAo+IEBAIC0xLDExODQgKzAsMCBAQAo+IC0vKgo+IC0gKiBD b3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgo+IC0gKgo+IC0gICogUGVybWlzc2lv biBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWlu aW5nIGEKPiAtICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50 YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPiAtICogdG8gZGVhbCBpbiB0aGUgU29mdHdh cmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgo+IC0g KiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJp YnV0ZSwgc3VibGljZW5zZSwKPiAtICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2Fy ZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gLSAqIFNvZnR3YXJlIGlzIGZ1 cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4g LSAqCj4gLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24g bm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKPiAtICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNs dWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQo+IC0gKiBT b2Z0d2FyZS4KPiAtICoKPiAtICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJ VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiAtICogSU1QTElFRCwgSU5D TFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ VFksCj4gLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5H RU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAo+IC0gKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQg SE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+IC0gKiBM SUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVS V0lTRSwgQVJJU0lORwo+IC0gKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRI RSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCj4gLSAqIElOIFRIRSBTT0ZU V0FSRS4KPiAtICoKPiAtICovCj4gLQo+IC0jaW5jbHVkZSA8bWF0aC5oPgo+IC0jaW5jbHVkZSA8 dW5pc3RkLmg+Cj4gLQo+IC0jaW5jbHVkZSAiZHJtLmgiCj4gLSNpbmNsdWRlICJkcm10ZXN0Lmgi Cj4gLSNpbmNsdWRlICJpZ3QuaCIKPiAtCj4gLUlHVF9URVNUX0RFU0NSSVBUSU9OKCJUZXN0IENv bG9yIEZlYXR1cmVzIGF0IFBpcGUgbGV2ZWwiKTsKPiAtCj4gLS8qIERhdGEgc3RydWN0dXJlcyBm b3IgZ2FtbWEvZGVnYW1tYSByYW1wcyAmIGN0bSBtYXRyaXguICovCj4gLXN0cnVjdCBfZHJtX2Nv bG9yX2N0bSB7Cj4gLQkvKiBUcmFuc2Zvcm1hdGlvbiBtYXRyaXggaW4gUzMxLjMyIGZvcm1hdC4g Ki8KPiAtCV9fczY0IG1hdHJpeFs5XTsKPiAtfTsKPiAtCj4gLXN0cnVjdCBfZHJtX2NvbG9yX2x1 dCB7Cj4gLQkvKgo+IC0JICogRGF0YSBpcyBVMC4xNiBmaXhlZCBwb2ludCBmb3JtYXQuCj4gLQkg Ki8KPiAtCV9fdTE2IHJlZDsKPiAtCV9fdTE2IGdyZWVuOwo+IC0JX191MTYgYmx1ZTsKPiAtCV9f dTE2IHJlc2VydmVkOwo+IC19Owo+IC0KPiAtLyogSW50ZXJuYWwgKi8KPiAtdHlwZWRlZiBzdHJ1 Y3Qgewo+IC0JZG91YmxlIHIsIGcsIGI7Cj4gLX0gY29sb3JfdDsKPiAtCj4gLXR5cGVkZWYgc3Ry dWN0IHsKPiAtCWludCBkcm1fZmQ7Cj4gLQl1aW50MzJfdCBkZXZpZDsKPiAtCWlndF9kaXNwbGF5 X3QgZGlzcGxheTsKPiAtCWlndF9waXBlX2NyY190ICpwaXBlX2NyYzsKPiAtCj4gLQl1aW50MzJf dCBjb2xvcl9kZXB0aDsKPiAtCXVpbnQ2NF90IGRlZ2FtbWFfbHV0X3NpemU7Cj4gLQl1aW50NjRf dCBnYW1tYV9sdXRfc2l6ZTsKPiAtfSBkYXRhX3Q7Cj4gLQo+IC0KPiAtc3RhdGljIHZvaWQgcGFp bnRfZ3JhZGllbnRfcmVjdGFuZ2xlcyhkYXRhX3QgKmRhdGEsCj4gLQkJCQkgICAgICBkcm1Nb2Rl TW9kZUluZm8gKm1vZGUsCj4gLQkJCQkgICAgICBjb2xvcl90ICpjb2xvcnMsCj4gLQkJCQkgICAg ICBzdHJ1Y3QgaWd0X2ZiICpmYikKPiAtewo+IC0JY2Fpcm9fdCAqY3IgPSBpZ3RfZ2V0X2NhaXJv X2N0eChkYXRhLT5kcm1fZmQsIGZiKTsKPiAtCWludCBpLCBsID0gbW9kZS0+aGRpc3BsYXkgLyAz Owo+IC0KPiAtCS8qIFBhaW50IDMgZ3JhZGllbnQgcmVjdGFuZ2xlcyB3aXRoIHJlZC9ncmVlbi9i bHVlIGJldHdlZW4gMS4wIGFuZAo+IC0JICogMC41LiBXZSB3YW50IHRvIGF2b2lkIDAgc28gZWFj aCBtYXggTFVUcyBvbmx5IGFmZmVjdCB0aGVpciBvd24KPiAtCSAqIHJlY3RhbmdsZS4KPiAtCSAq Lwo+IC0JZm9yIChpID0gMCA7IGkgPCAzOyBpKyspIHsKPiAtCQlpZ3RfcGFpbnRfY29sb3JfZ3Jh ZGllbnRfcmFuZ2UoY3IsIGkgKiBsLCAwLCBsLCBtb2RlLT52ZGlzcGxheSwKPiAtCQkJCQkgICAg ICAgY29sb3JzW2ldLnIgIT0gMCA/IDAuMiA6IDAsCj4gLQkJCQkJICAgICAgIGNvbG9yc1tpXS5n ICE9IDAgPyAwLjIgOiAwLAo+IC0JCQkJCSAgICAgICBjb2xvcnNbaV0uYiAhPSAwID8gMC4yIDog MCwKPiAtCQkJCQkgICAgICAgY29sb3JzW2ldLnIsCj4gLQkJCQkJICAgICAgIGNvbG9yc1tpXS5n LAo+IC0JCQkJCSAgICAgICBjb2xvcnNbaV0uYik7Cj4gLQl9Cj4gLQo+IC0JY2Fpcm9fZGVzdHJv eShjcik7Cj4gLX0KPiAtCj4gLXN0YXRpYyB2b2lkIHBhaW50X3JlY3RhbmdsZXMoZGF0YV90ICpk YXRhLAo+IC0JCQkgICAgIGRybU1vZGVNb2RlSW5mbyAqbW9kZSwKPiAtCQkJICAgICBjb2xvcl90 ICpjb2xvcnMsCj4gLQkJCSAgICAgc3RydWN0IGlndF9mYiAqZmIpCj4gLXsKPiAtCWNhaXJvX3Qg KmNyID0gaWd0X2dldF9jYWlyb19jdHgoZGF0YS0+ZHJtX2ZkLCBmYik7Cj4gLQlpbnQgaSwgbCA9 IG1vZGUtPmhkaXNwbGF5IC8gMzsKPiAtCj4gLQkvKiBQYWludCAzIHNvbGlkIHJlY3RhbmdsZXMu ICovCj4gLQlmb3IgKGkgPSAwIDsgaSA8IDM7IGkrKykgewo+IC0JCWlndF9wYWludF9jb2xvcihj ciwgaSAqIGwsIDAsIGwsIG1vZGUtPnZkaXNwbGF5LAo+IC0JCQkJY29sb3JzW2ldLnIsIGNvbG9y c1tpXS5nLCBjb2xvcnNbaV0uYik7Cj4gLQl9Cj4gLQo+IC0JY2Fpcm9fZGVzdHJveShjcik7Cj4g LX0KPiAtCj4gLXN0YXRpYyBkb3VibGUgKmdlbmVyYXRlX3RhYmxlKHVpbnQzMl90IGx1dF9zaXpl LCBkb3VibGUgZXhwKQo+IC17Cj4gLQlkb3VibGUgKmNvZWZmcyA9IG1hbGxvYyhzaXplb2YoZG91 YmxlKSAqIGx1dF9zaXplKTsKPiAtCXVpbnQzMl90IGk7Cj4gLQo+IC0JZm9yIChpID0gMDsgaSA8 IGx1dF9zaXplOyBpKyspCj4gLQkJY29lZmZzW2ldID0gcG93ZigoZG91YmxlKSBpICogMS4wIC8g KGRvdWJsZSkgKGx1dF9zaXplIC0gMSksIGV4cCk7Cj4gLQo+IC0JcmV0dXJuIGNvZWZmczsKPiAt fQo+IC0KPiAtc3RhdGljIGRvdWJsZSAqZ2VuZXJhdGVfdGFibGVfbWF4KHVpbnQzMl90IGx1dF9z aXplKQo+IC17Cj4gLQlkb3VibGUgKmNvZWZmcyA9IG1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGx1 dF9zaXplKTsKPiAtCXVpbnQzMl90IGk7Cj4gLQo+IC0JY29lZmZzWzBdID0gMC4wOwo+IC0JZm9y IChpID0gMTsgaSA8IGx1dF9zaXplOyBpKyspCj4gLQkJY29lZmZzW2ldID0gMS4wOwo+IC0KPiAt CXJldHVybiBjb2VmZnM7Cj4gLX0KPiAtCj4gLXN0YXRpYyBkb3VibGUgKmdlbmVyYXRlX3RhYmxl X3plcm8odWludDMyX3QgbHV0X3NpemUpCj4gLXsKPiAtCWRvdWJsZSAqY29lZmZzID0gbWFsbG9j KHNpemVvZihkb3VibGUpICogbHV0X3NpemUpOwo+IC0JdWludDMyX3QgaTsKPiAtCj4gLQlmb3Ig KGkgPSAwOyBpIDwgbHV0X3NpemU7IGkrKykKPiAtCQljb2VmZnNbaV0gPSAwLjA7Cj4gLQo+IC0J cmV0dXJuIGNvZWZmczsKPiAtfQo+IC0KPiAtc3RhdGljIHN0cnVjdCBfZHJtX2NvbG9yX2x1dCAq Y29lZmZzX3RvX2x1dChkYXRhX3QgKmRhdGEsCj4gLQkJCQkJICAgIGNvbnN0IGRvdWJsZSAqY29l ZmZpY2llbnRzLAo+IC0JCQkJCSAgICB1aW50MzJfdCBsdXRfc2l6ZSwKPiAtCQkJCQkgICAgdWlu dDMyX3QgY29sb3JfZGVwdGgsCj4gLQkJCQkJICAgIGludCBvZmYpCj4gLXsKPiAtCXN0cnVjdCBf ZHJtX2NvbG9yX2x1dCAqbHV0Owo+IC0JdWludDMyX3QgaTsKPiAtCXVpbnQzMl90IG1heF92YWx1 ZSA9ICgxIDw8IDE2KSAtIDE7Cj4gLQl1aW50MzJfdCBtYXNrID0gKCgxIDw8IGNvbG9yX2RlcHRo KSAtIDEpIDw8IDg7Cj4gLQo+IC0JbHV0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgX2RybV9jb2xv cl9sdXQpICogbHV0X3NpemUpOwo+IC0KPiAtCWlmIChJU19DSEVSUllWSUVXKGRhdGEtPmRldmlk KSkKPiAtCQlsdXRfc2l6ZSAtPSAxOwo+IC0JZm9yIChpID0gMDsgaSA8IGx1dF9zaXplOyBpKysp IHsKPiAtCQl1aW50MzJfdCB2ID0gKGNvZWZmaWNpZW50c1tpXSAqIG1heF92YWx1ZSk7Cj4gLQo+ IC0JCS8qCj4gLQkJICogSGFyZHdhcmUgbWlnaHQgZW5jb2RlIGNvbG9ycyBvbiBhIGRpZmZlcmVu dCBudW1iZXIgb2YgYml0cwo+IC0JCSAqIHRoYW4gd2hhdCBpcyBpbiBvdXIgZnJhbWVidWZmZXIg KDEwIG9yIDEyYml0cyBmb3IgZXhhbXBsZSkuCj4gLQkJICogTWFzayB0aGUgbG93ZXIgYml0cyBu b3QgcHJvdmlkZWQgYnkgdGhlIGZyYW1lYnVmZmVyIHNvIHdlCj4gLQkJICogY2FuIGRvIENSQyBj b21wYXJpc29ucy4KPiAtCQkgKi8KPiAtCQl2ICY9IG1hc2s7Cj4gLQo+IC0JCWx1dFtpXS5yZWQg PSB2Owo+IC0JCWx1dFtpXS5ncmVlbiA9IHY7Cj4gLQkJbHV0W2ldLmJsdWUgPSB2Owo+IC0JfQo+ IC0KPiAtCWlmIChJU19DSEVSUllWSUVXKGRhdGEtPmRldmlkKSkKPiAtCQlsdXRbbHV0X3NpemVd LnJlZCA9Cj4gLQkJCWx1dFtsdXRfc2l6ZV0uZ3JlZW4gPQo+IC0JCQlsdXRbbHV0X3NpemVdLmJs dWUgPSBsdXRbbHV0X3NpemUgLSAxXS5yZWQ7Cj4gLQo+IC0JcmV0dXJuIGx1dDsKPiAtfQo+IC0K PiAtc3RhdGljIHZvaWQgc2V0X2RlZ2FtbWEoZGF0YV90ICpkYXRhLAo+IC0JCQlpZ3RfcGlwZV90 ICpwaXBlLAo+IC0JCQljb25zdCBkb3VibGUgKmNvZWZmaWNpZW50cykKPiAtewo+IC0Jc2l6ZV90 IHNpemUgPSBzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfbHV0KSAqIGRhdGEtPmRlZ2FtbWFfbHV0 X3NpemU7Cj4gLQlzdHJ1Y3QgX2RybV9jb2xvcl9sdXQgKmx1dCA9IGNvZWZmc190b19sdXQoZGF0 YSwKPiAtCQkJCQkJICAgY29lZmZpY2llbnRzLAo+IC0JCQkJCQkgICBkYXRhLT5kZWdhbW1hX2x1 dF9zaXplLAo+IC0JCQkJCQkgICBkYXRhLT5jb2xvcl9kZXB0aCwgMCk7Cj4gLQo+IC0JaWd0X3Bp cGVfc2V0X2RlZ2FtbWFfbHV0KHBpcGUsIGx1dCwgc2l6ZSk7Cj4gLQo+IC0JZnJlZShsdXQpOwo+ IC19Cj4gLQo+IC1zdGF0aWMgdm9pZCBzZXRfZ2FtbWEoZGF0YV90ICpkYXRhLAo+IC0JCSAgICAg IGlndF9waXBlX3QgKnBpcGUsCj4gLQkJICAgICAgY29uc3QgZG91YmxlICpjb2VmZmljaWVudHMp Cj4gLXsKPiAtCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBfZHJtX2NvbG9yX2x1dCkgKiBk YXRhLT5nYW1tYV9sdXRfc2l6ZTsKPiAtCXN0cnVjdCBfZHJtX2NvbG9yX2x1dCAqbHV0ID0gY29l ZmZzX3RvX2x1dChkYXRhLAo+IC0JCQkJCQkgICBjb2VmZmljaWVudHMsCj4gLQkJCQkJCSAgIGRh dGEtPmdhbW1hX2x1dF9zaXplLAo+IC0JCQkJCQkgICBkYXRhLT5jb2xvcl9kZXB0aCwgMCk7Cj4g LQo+IC0JaWd0X3BpcGVfc2V0X2dhbW1hX2x1dChwaXBlLCBsdXQsIHNpemUpOwo+IC0KPiAtCWZy ZWUobHV0KTsKPiAtfQo+IC0KPiAtc3RhdGljIHZvaWQgc2V0X2N0bShpZ3RfcGlwZV90ICpwaXBl LCBjb25zdCBkb3VibGUgKmNvZWZmaWNpZW50cykKPiAtewo+IC0Jc3RydWN0IF9kcm1fY29sb3Jf Y3RtIGN0bTsKPiAtCWludCBpOwo+IC0KPiAtCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0 bS5tYXRyaXgpOyBpKyspIHsKPiAtCQlpZiAoY29lZmZpY2llbnRzW2ldIDwgMCkgewo+IC0JCQlj dG0ubWF0cml4W2ldID0KPiAtCQkJCShpbnQ2NF90KSAoLWNvZWZmaWNpZW50c1tpXSAqICgoaW50 NjRfdCkgMUwgPDwgMzIpKTsKPiAtCQkJY3RtLm1hdHJpeFtpXSB8PSAxVUxMIDw8IDYzOwo+IC0J CX0gZWxzZQo+IC0JCQljdG0ubWF0cml4W2ldID0KPiAtCQkJCShpbnQ2NF90KSAoY29lZmZpY2ll bnRzW2ldICogKChpbnQ2NF90KSAxTCA8PCAzMikpOwo+IC0JfQo+IC0KPiAtCWlndF9waXBlX3Nl dF9jdG1fbWF0cml4KHBpcGUsICZjdG0sIHNpemVvZihjdG0pKTsKPiAtfQo+IC0KPiAtI2RlZmlu ZSBkaXNhYmxlX2RlZ2FtbWEocGlwZSkgaWd0X3BpcGVfc2V0X2RlZ2FtbWFfbHV0KHBpcGUsIE5V TEwsIDApCj4gLSNkZWZpbmUgZGlzYWJsZV9nYW1tYShwaXBlKSBpZ3RfcGlwZV9zZXRfZ2FtbWFf bHV0KHBpcGUsIE5VTEwsIDApCj4gLSNkZWZpbmUgZGlzYWJsZV9jdG0ocGlwZSkgaWd0X3BpcGVf c2V0X2N0bV9tYXRyaXgocGlwZSwgTlVMTCwgMCkKPiAtCj4gLXN0YXRpYyB2b2lkIG91dHB1dF9z ZXRfcHJvcGVydHlfZW51bShpZ3Rfb3V0cHV0X3QgKm91dHB1dCwKPiAtCQkJCSAgICAgY29uc3Qg Y2hhciAqcHJvcGVydHksCj4gLQkJCQkgICAgIGNvbnN0IGNoYXIgKmVudW1fdmFsdWUpCj4gLXsK PiAtCWludCBpOwo+IC0JaW50MzJfdCB2YWx1ZSA9IC0xOwo+IC0JdWludDMyX3QgcHJvcF9pZDsK PiAtCWRybU1vZGVQcm9wZXJ0eVB0ciBwcm9wOwo+IC0KPiAtCWlmICgha21zdGVzdF9nZXRfcHJv cGVydHkob3V0cHV0LT5kaXNwbGF5LT5kcm1fZmQsCj4gLQkJCQkgIG91dHB1dC0+aWQsCj4gLQkJ CQkgIERSTV9NT0RFX09CSkVDVF9DT05ORUNUT1IsCj4gLQkJCQkgIHByb3BlcnR5LAo+IC0JCQkJ ICAmcHJvcF9pZCwgTlVMTCwgJnByb3ApKQo+IC0JCXJldHVybjsKPiAtCj4gLQlpZ3RfYXNzZXJ0 KHByb3AtPmZsYWdzICYgRFJNX01PREVfUFJPUF9FTlVNKTsKPiAtCj4gLQlmb3IgKGkgPSAwOyBp IDwgcHJvcC0+Y291bnRfZW51bXM7IGkrKykgewo+IC0JCWlmICghc3RyY21wKHByb3AtPmVudW1z W2ldLm5hbWUsIGVudW1fdmFsdWUpKSB7Cj4gLQkJCXZhbHVlID0gcHJvcC0+ZW51bXNbaV0udmFs dWU7Cj4gLQkJCWJyZWFrOwo+IC0JCX0KPiAtCX0KPiAtCWlndF9hc3NlcnRfbmVxKHZhbHVlLCAt MSk7Cj4gLQo+IC0JaWd0X2Fzc2VydF9lcShkcm1Nb2RlT2JqZWN0U2V0UHJvcGVydHkob3V0cHV0 LT5kaXNwbGF5LT5kcm1fZmQsCj4gLQkJCQkJICAgICAgIG91dHB1dC0+aWQsCj4gLQkJCQkJICAg ICAgIERSTV9NT0RFX09CSkVDVF9DT05ORUNUT1IsCj4gLQkJCQkJICAgICAgIHByb3BfaWQsIHZh bHVlKSwgMCk7Cj4gLQo+IC0KPiAtCWRybU1vZGVGcmVlUHJvcGVydHkocHJvcCk7Cj4gLX0KPiAt Cj4gLS8qCj4gLSAqIERyYXcgMyBncmFkaWVudCByZWN0YW5nbGVzIGluIHJlZCwgZ3JlZW4gYW5k IGJsdWUsIHdpdGggYSBtYXhlZCBvdXQKPiAtICogZGVnYW1tYSBMVVQgYW5kIHZlcmlmeSB3ZSBo YXZlIHRoZSBzYW1lIENSQyBhcyBkcmF3aW5nIHNvbGlkIGNvbG9yCj4gLSAqIHJlY3RhbmdsZXMg d2l0aCBsaW5lYXIgZGVnYW1tYSBMVVQuCj4gLSAqLwo+IC1zdGF0aWMgdm9pZCB0ZXN0X3BpcGVf ZGVnYW1tYShkYXRhX3QgKmRhdGEsCj4gLQkJCSAgICAgIGlndF9wbGFuZV90ICpwcmltYXJ5KQo+ IC17Cj4gLQlpZ3Rfb3V0cHV0X3QgKm91dHB1dDsKPiAtCWRvdWJsZSAqZGVnYW1tYV9saW5lYXIs ICpkZWdhbW1hX2Z1bGw7Cj4gLQlkb3VibGUgKmdhbW1hX2xpbmVhcjsKPiAtCWNvbG9yX3QgcmVk X2dyZWVuX2JsdWVbXSA9IHsKPiAtCQl7IDEuMCwgMC4wLCAwLjAgfSwKPiAtCQl7IDAuMCwgMS4w LCAwLjAgfSwKPiAtCQl7IDAuMCwgMC4wLCAxLjAgfQo+IC0JfTsKPiAtCj4gLQlkZWdhbW1hX2xp bmVhciA9IGdlbmVyYXRlX3RhYmxlKGRhdGEtPmRlZ2FtbWFfbHV0X3NpemUsIDEuMCk7Cj4gLQlk ZWdhbW1hX2Z1bGwgPSBnZW5lcmF0ZV90YWJsZV9tYXgoZGF0YS0+ZGVnYW1tYV9sdXRfc2l6ZSk7 Cj4gLQo+IC0JZ2FtbWFfbGluZWFyID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+Z2FtbWFfbHV0X3Np emUsIDEuMCk7Cj4gLQo+IC0JZm9yX2VhY2hfY29ubmVjdGVkX291dHB1dCgmZGF0YS0+ZGlzcGxh eSwgb3V0cHV0KSB7Cj4gLQkJZHJtTW9kZU1vZGVJbmZvICptb2RlOwo+IC0JCXN0cnVjdCBpZ3Rf ZmIgZmJfbW9kZXNldCwgZmI7Cj4gLQkJaWd0X2NyY190IGNyY19mdWxsZ2FtbWEsIGNyY19mdWxs Y29sb3JzOwo+IC0JCWludCBmYl9pZCwgZmJfbW9kZXNldF9pZDsKPiAtCj4gLQkJaWd0X291dHB1 dF9zZXRfcGlwZShvdXRwdXQsIHByaW1hcnktPnBpcGUtPnBpcGUpOwo+IC0JCW1vZGUgPSBpZ3Rf b3V0cHV0X2dldF9tb2RlKG91dHB1dCk7Cj4gLQo+IC0JCS8qIENyZWF0ZSBhIGZyYW1lYnVmZmVy IGF0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQuICovCj4gLQkJZmJfaWQgPSBpZ3RfY3JlYXRlX2Zi KGRhdGEtPmRybV9mZCwKPiAtCQkJCSAgICAgIG1vZGUtPmhkaXNwbGF5LAo+IC0JCQkJICAgICAg bW9kZS0+dmRpc3BsYXksCj4gLQkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+IC0JCQkJ ICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiAtCQkJCSAgICAgICZmYik7Cj4gLQkJ aWd0X2Fzc2VydChmYl9pZCk7Cj4gLQo+IC0JCWZiX21vZGVzZXRfaWQgPSBpZ3RfY3JlYXRlX2Zi KGRhdGEtPmRybV9mZCwKPiAtCQkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwKPiAtCQkJCQkgICAg ICBtb2RlLT52ZGlzcGxheSwKPiAtCQkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+IC0J CQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCj4gLQkJCQkJICAgICAgJmZiX21v ZGVzZXQpOwo+IC0JCWlndF9hc3NlcnQoZmJfbW9kZXNldF9pZCk7Cj4gLQo+IC0JCWlndF9wbGFu ZV9zZXRfZmIocHJpbWFyeSwgJmZiX21vZGVzZXQpOwo+IC0JCWRpc2FibGVfY3RtKHByaW1hcnkt PnBpcGUpOwo+IC0JCWRpc2FibGVfZGVnYW1tYShwcmltYXJ5LT5waXBlKTsKPiAtCQlzZXRfZ2Ft bWEoZGF0YSwgcHJpbWFyeS0+cGlwZSwgZ2FtbWFfbGluZWFyKTsKPiAtCQlpZ3RfZGlzcGxheV9j b21taXQoJmRhdGEtPmRpc3BsYXkpOwo+IC0KPiAtCQkvKiBEcmF3IHNvbGlkIGNvbG9ycyB3aXRo IG5vIGRlZ2FtbWEgdHJhbnNmb3JtYXRpb24uICovCj4gLQkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRh LCBtb2RlLCByZWRfZ3JlZW5fYmx1ZSwgJmZiKTsKPiAtCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1h cnksICZmYik7Cj4gLQkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiAtCQlp Z3Rfd2FpdF9mb3JfdmJsYW5rKGRhdGEtPmRybV9mZCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4g LQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjX2Z1bGxjb2xv cnMpOwo+IC0KPiAtCQkvKiBEcmF3IGEgZ3JhZGllbnQgd2l0aCBkZWdhbW1hIExVVCB0byByZW1h cCBhbGwKPiAtCQkgKiB2YWx1ZXMgdG8gbWF4IHJlZC9ncmVlbi9ibHVlLgo+IC0JCSAqLwo+IC0J CXBhaW50X2dyYWRpZW50X3JlY3RhbmdsZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVuX2JsdWUsICZm Yik7Cj4gLQkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCAmZmIpOwo+IC0JCXNldF9kZWdhbW1h KGRhdGEsIHByaW1hcnktPnBpcGUsIGRlZ2FtbWFfZnVsbCk7Cj4gLQkJaWd0X2Rpc3BsYXlfY29t bWl0KCZkYXRhLT5kaXNwbGF5KTsKPiAtCQlpZ3Rfd2FpdF9mb3JfdmJsYW5rKGRhdGEtPmRybV9m ZCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gLQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRh dGEtPnBpcGVfY3JjLCAmY3JjX2Z1bGxnYW1tYSk7Cj4gLQo+IC0JCS8qIFZlcmlmeSB0aGF0IHRo ZSBDUkMgb2YgdGhlIHNvZnR3YXJlIGNvbXB1dGVkIG91dHB1dCBpcwo+IC0JCSAqIGVxdWFsIHRv IHRoZSBDUkMgb2YgdGhlIGRlZ2FtbWEgTFVUIHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KPiAtCQkg Ki8KPiAtCQlpZ3RfYXNzZXJ0X2NyY19lcXVhbCgmY3JjX2Z1bGxnYW1tYSwgJmNyY19mdWxsY29s b3JzKTsKPiAtCj4gLQkJaWd0X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIFBJUEVfQU5ZKTsKPiAt CX0KPiAtCj4gLQlmcmVlKGRlZ2FtbWFfbGluZWFyKTsKPiAtCWZyZWUoZGVnYW1tYV9mdWxsKTsK PiAtCWZyZWUoZ2FtbWFfbGluZWFyKTsKPiAtfQo+IC0KPiAtLyoKPiAtICogRHJhdyAzIGdyYWRp ZW50IHJlY3RhbmdsZXMgaW4gcmVkLCBncmVlbiBhbmQgYmx1ZSwgd2l0aCBhIG1heGVkIG91dCBn YW1tYQo+IC0gKiBMVVQgYW5kIHZlcmlmeSB3ZSBoYXZlIHRoZSBzYW1lIENSQyBhcyBkcmF3aW5n IHNvbGlkIGNvbG9yIHJlY3RhbmdsZXMuCj4gLSAqLwo+IC1zdGF0aWMgdm9pZCB0ZXN0X3BpcGVf Z2FtbWEoZGF0YV90ICpkYXRhLAo+IC0JCQkgICAgaWd0X3BsYW5lX3QgKnByaW1hcnkpCj4gLXsK PiAtCWlndF9vdXRwdXRfdCAqb3V0cHV0Owo+IC0JZG91YmxlICpnYW1tYV9mdWxsOwo+IC0JY29s b3JfdCByZWRfZ3JlZW5fYmx1ZVtdID0gewo+IC0JCXsgMS4wLCAwLjAsIDAuMCB9LAo+IC0JCXsg MC4wLCAxLjAsIDAuMCB9LAo+IC0JCXsgMC4wLCAwLjAsIDEuMCB9Cj4gLQl9Owo+IC0KPiAtCWdh bW1hX2Z1bGwgPSBnZW5lcmF0ZV90YWJsZV9tYXgoZGF0YS0+Z2FtbWFfbHV0X3NpemUpOwo+IC0K PiAtCWZvcl9lYWNoX2Nvbm5lY3RlZF9vdXRwdXQoJmRhdGEtPmRpc3BsYXksIG91dHB1dCkgewo+ IC0JCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKPiAtCQlzdHJ1Y3QgaWd0X2ZiIGZiX21vZGVzZXQs IGZiOwo+IC0JCWlndF9jcmNfdCBjcmNfZnVsbGdhbW1hLCBjcmNfZnVsbGNvbG9yczsKPiAtCQlp bnQgZmJfaWQsIGZiX21vZGVzZXRfaWQ7Cj4gLQo+IC0JCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0 cHV0LCBwcmltYXJ5LT5waXBlLT5waXBlKTsKPiAtCQltb2RlID0gaWd0X291dHB1dF9nZXRfbW9k ZShvdXRwdXQpOwo+IC0KPiAtCQkvKiBDcmVhdGUgYSBmcmFtZWJ1ZmZlciBhdCB0aGUgc2l6ZSBv ZiB0aGUgb3V0cHV0LiAqLwo+IC0JCWZiX2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1fZmQs Cj4gLQkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwKPiAtCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5 LAo+IC0JCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKPiAtCQkJCSAgICAgIExPQ0FMX0RS TV9GT1JNQVRfTU9EX05PTkUsCj4gLQkJCQkgICAgICAmZmIpOwo+IC0JCWlndF9hc3NlcnQoZmJf aWQpOwo+IC0KPiAtCQlmYl9tb2Rlc2V0X2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1fZmQs Cj4gLQkJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCj4gLQkJCQkJICAgICAgbW9kZS0+dmRpc3Bs YXksCj4gLQkJCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKPiAtCQkJCQkgICAgICBMT0NB TF9EUk1fRk9STUFUX01PRF9OT05FLAo+IC0JCQkJCSAgICAgICZmYl9tb2Rlc2V0KTsKPiAtCQlp Z3RfYXNzZXJ0KGZiX21vZGVzZXRfaWQpOwo+IC0KPiAtCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1h cnksICZmYl9tb2Rlc2V0KTsKPiAtCQlkaXNhYmxlX2N0bShwcmltYXJ5LT5waXBlKTsKPiAtCQlk aXNhYmxlX2RlZ2FtbWEocHJpbWFyeS0+cGlwZSk7Cj4gLQkJc2V0X2dhbW1hKGRhdGEsIHByaW1h cnktPnBpcGUsIGdhbW1hX2Z1bGwpOwo+IC0JCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlz cGxheSk7Cj4gLQo+IC0JCS8qIERyYXcgc29saWQgY29sb3JzIHdpdGggbm8gZ2FtbWEgdHJhbnNm b3JtYXRpb24uICovCj4gLQkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2RlLCByZWRfZ3JlZW5f Ymx1ZSwgJmZiKTsKPiAtCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7Cj4gLQkJaWd0 X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiAtCQlpZ3Rfd2FpdF9mb3JfdmJsYW5r KGRhdGEtPmRybV9mZCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gLQkJaWd0X3BpcGVfY3JjX2Nv bGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjX2Z1bGxjb2xvcnMpOwo+IC0KPiAtCQkvKiBE cmF3IGEgZ3JhZGllbnQgd2l0aCBnYW1tYSBMVVQgdG8gcmVtYXAgYWxsIHZhbHVlcwo+IC0JCSAq IHRvIG1heCByZWQvZ3JlZW4vYmx1ZS4KPiAtCQkgKi8KPiAtCQlwYWludF9ncmFkaWVudF9yZWN0 YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlLCAmZmIpOwo+IC0JCWlndF9wbGFuZV9z ZXRfZmIocHJpbWFyeSwgJmZiKTsKPiAtCQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3Bs YXkpOwo+IC0JCWlndF93YWl0X2Zvcl92YmxhbmsoZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBl LT5waXBlKTsKPiAtCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMsICZj cmNfZnVsbGdhbW1hKTsKPiAtCj4gLQkJLyogVmVyaWZ5IHRoYXQgdGhlIENSQyBvZiB0aGUgc29m dHdhcmUgY29tcHV0ZWQgb3V0cHV0IGlzCj4gLQkJICogZXF1YWwgdG8gdGhlIENSQyBvZiB0aGUg Z2FtbWEgTFVUIHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KPiAtCQkgKi8KPiAtCQlpZ3RfYXNzZXJ0 X2NyY19lcXVhbCgmY3JjX2Z1bGxnYW1tYSwgJmNyY19mdWxsY29sb3JzKTsKPiAtCj4gLQkJaWd0 X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIFBJUEVfQU5ZKTsKPiAtCX0KPiAtCj4gLQlmcmVlKGdh bW1hX2Z1bGwpOwo+IC19Cj4gLQo+IC0vKgo+IC0gKiBEcmF3IDMgZ3JhZGllbnQgcmVjdGFuZ2xl cyBpbiByZWQsIGdyZWVuIGFuZCBibHVlLCB3aXRoIGEgbWF4ZWQgb3V0IGxlZ2FjeQo+IC0gKiBn YW1tYSBMVVQgYW5kIHZlcmlmeSB3ZSBoYXZlIHRoZSBzYW1lIENSQyBhcyBkcmF3aW5nIHNvbGlk IGNvbG9yIHJlY3RhbmdsZXMKPiAtICogd2l0aCBsaW5lYXIgbGVnYWN5IGdhbW1hIExVVC4KPiAt ICovCj4gLXN0YXRpYyB2b2lkIHRlc3RfcGlwZV9sZWdhY3lfZ2FtbWEoZGF0YV90ICpkYXRhLAo+ IC0JCQkJICAgaWd0X3BsYW5lX3QgKnByaW1hcnkpCj4gLXsKPiAtCWlndF9vdXRwdXRfdCAqb3V0 cHV0Owo+IC0JY29sb3JfdCByZWRfZ3JlZW5fYmx1ZVtdID0gewo+IC0JCXsgMS4wLCAwLjAsIDAu MCB9LAo+IC0JCXsgMC4wLCAxLjAsIDAuMCB9LAo+IC0JCXsgMC4wLCAwLjAsIDEuMCB9Cj4gLQl9 Owo+IC0JZHJtTW9kZUNydGMgKmttc19jcnRjOwo+IC0JdWludDMyX3QgaSwgbGVnYWN5X2x1dF9z aXplOwo+IC0JdWludDE2X3QgKnJlZF9sdXQsICpncmVlbl9sdXQsICpibHVlX2x1dDsKPiAtCj4g LQlrbXNfY3J0YyA9IGRybU1vZGVHZXRDcnRjKGRhdGEtPmRybV9mZCwgcHJpbWFyeS0+cGlwZS0+ Y3J0Y19pZCk7Cj4gLQlsZWdhY3lfbHV0X3NpemUgPSBrbXNfY3J0Yy0+Z2FtbWFfc2l6ZTsKPiAt CWRybU1vZGVGcmVlQ3J0YyhrbXNfY3J0Yyk7Cj4gLQo+IC0JcmVkX2x1dCA9IG1hbGxvYyhzaXpl b2YodWludDE2X3QpICogbGVnYWN5X2x1dF9zaXplKTsKPiAtCWdyZWVuX2x1dCA9IG1hbGxvYyhz aXplb2YodWludDE2X3QpICogbGVnYWN5X2x1dF9zaXplKTsKPiAtCWJsdWVfbHV0ID0gbWFsbG9j KHNpemVvZih1aW50MTZfdCkgKiBsZWdhY3lfbHV0X3NpemUpOwo+IC0KPiAtCWZvcl9lYWNoX2Nv bm5lY3RlZF9vdXRwdXQoJmRhdGEtPmRpc3BsYXksIG91dHB1dCkgewo+IC0JCWRybU1vZGVNb2Rl SW5mbyAqbW9kZTsKPiAtCQlzdHJ1Y3QgaWd0X2ZiIGZiX21vZGVzZXQsIGZiOwo+IC0JCWlndF9j cmNfdCBjcmNfZnVsbGdhbW1hLCBjcmNfZnVsbGNvbG9yczsKPiAtCQlpbnQgZmJfaWQsIGZiX21v ZGVzZXRfaWQ7Cj4gLQo+IC0JCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBwcmltYXJ5LT5w aXBlLT5waXBlKTsKPiAtCQltb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQpOwo+IC0K PiAtCQkvKiBDcmVhdGUgYSBmcmFtZWJ1ZmZlciBhdCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0LiAq Lwo+IC0JCWZiX2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1fZmQsCj4gLQkJCQkgICAgICBt b2RlLT5oZGlzcGxheSwKPiAtCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAo+IC0JCQkJICAgICAg RFJNX0ZPUk1BVF9YUkdCODg4OCwKPiAtCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05P TkUsCj4gLQkJCQkgICAgICAmZmIpOwo+IC0JCWlndF9hc3NlcnQoZmJfaWQpOwo+IC0KPiAtCQlm Yl9tb2Rlc2V0X2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1fZmQsCj4gLQkJCQkJICAgICAg bW9kZS0+aGRpc3BsYXksCj4gLQkJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCj4gLQkJCQkJICAg ICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKPiAtCQkJCQkgICAgICBMT0NBTF9EUk1fRk9STUFUX01P RF9OT05FLAo+IC0JCQkJCSAgICAgICZmYl9tb2Rlc2V0KTsKPiAtCQlpZ3RfYXNzZXJ0KGZiX21v ZGVzZXRfaWQpOwo+IC0KPiAtCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYl9tb2Rlc2V0 KTsKPiAtCQlkaXNhYmxlX2RlZ2FtbWEocHJpbWFyeS0+cGlwZSk7Cj4gLQkJZGlzYWJsZV9nYW1t YShwcmltYXJ5LT5waXBlKTsKPiAtCQlkaXNhYmxlX2N0bShwcmltYXJ5LT5waXBlKTsKPiAtCQlp Z3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+IC0KPiAtCQkvKiBEcmF3IHNvbGlk IGNvbG9ycyB3aXRoIG5vIGdhbW1hIHRyYW5zZm9ybWF0aW9uLiAqLwo+IC0JCXBhaW50X3JlY3Rh bmdsZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVuX2JsdWUsICZmYik7Cj4gLQkJaWd0X3BsYW5lX3Nl dF9mYihwcmltYXJ5LCAmZmIpOwo+IC0JCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxh eSk7Cj4gLQkJaWd0X3dhaXRfZm9yX3ZibGFuayhkYXRhLT5kcm1fZmQsIHByaW1hcnktPnBpcGUt PnBpcGUpOwo+IC0JCWlndF9waXBlX2NyY19jb2xsZWN0X2NyYyhkYXRhLT5waXBlX2NyYywgJmNy Y19mdWxsY29sb3JzKTsKPiAtCj4gLQkJLyogRHJhdyBhIGdyYWRpZW50IHdpdGggZ2FtbWEgTFVU IHRvIHJlbWFwIGFsbCB2YWx1ZXMKPiAtCQkgKiB0byBtYXggcmVkL2dyZWVuL2JsdWUuCj4gLQkJ ICovCj4gLQkJcGFpbnRfZ3JhZGllbnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2RlLCByZWRfZ3JlZW5f Ymx1ZSwgJmZiKTsKPiAtCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7Cj4gLQo+IC0J CXJlZF9sdXRbMF0gPSBncmVlbl9sdXRbMF0gPSBibHVlX2x1dFswXSA9IDA7Cj4gLQkJZm9yIChp ID0gMTsgaSA8IGxlZ2FjeV9sdXRfc2l6ZTsgaSsrKQo+IC0JCQlyZWRfbHV0W2ldID0gZ3JlZW5f bHV0W2ldID0gYmx1ZV9sdXRbaV0gPSAweGZmZmY7Cj4gLQkJaWd0X2Fzc2VydF9lcShkcm1Nb2Rl Q3J0Y1NldEdhbW1hKGRhdGEtPmRybV9mZCwgcHJpbWFyeS0+cGlwZS0+Y3J0Y19pZCwKPiAtCQkJ CQkJICBsZWdhY3lfbHV0X3NpemUsIHJlZF9sdXQsIGdyZWVuX2x1dCwgYmx1ZV9sdXQpLCAwKTsK PiAtCQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+IC0JCWlndF93YWl0X2Zv cl92YmxhbmsoZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBlLT5waXBlKTsKPiAtCQlpZ3RfcGlw ZV9jcmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMsICZjcmNfZnVsbGdhbW1hKTsKPiAtCj4g LQkJLyogVmVyaWZ5IHRoYXQgdGhlIENSQyBvZiB0aGUgc29mdHdhcmUgY29tcHV0ZWQgb3V0cHV0 IGlzCj4gLQkJICogZXF1YWwgdG8gdGhlIENSQyBvZiB0aGUgZ2FtbWEgTFVUIHRyYW5zZm9ybWF0 aW9uIG91dHB1dC4KPiAtCQkgKi8KPiAtCQlpZ3RfYXNzZXJ0X2NyY19lcXVhbCgmY3JjX2Z1bGxn YW1tYSwgJmNyY19mdWxsY29sb3JzKTsKPiAtCj4gLQkJLyogUmVzZXQgb3V0cHV0LiAqLwo+IC0J CWZvciAoaSA9IDE7IGkgPCBsZWdhY3lfbHV0X3NpemU7IGkrKykKPiAtCQkJcmVkX2x1dFtpXSA9 IGdyZWVuX2x1dFtpXSA9IGJsdWVfbHV0W2ldID0gaSA8PCA4Owo+IC0KPiAtCQlpZ3RfYXNzZXJ0 X2VxKGRybU1vZGVDcnRjU2V0R2FtbWEoZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBlLT5jcnRj X2lkLAo+IC0JCQkJCQkgIGxlZ2FjeV9sdXRfc2l6ZSwgcmVkX2x1dCwgZ3JlZW5fbHV0LCBibHVl X2x1dCksIDApOwo+IC0JCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7Cj4gLQo+ IC0JCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBQSVBFX0FOWSk7Cj4gLQl9Cj4gLQo+IC0J ZnJlZShyZWRfbHV0KTsKPiAtCWZyZWUoZ3JlZW5fbHV0KTsKPiAtCWZyZWUoYmx1ZV9sdXQpOwo+ IC19Cj4gLQo+IC1zdGF0aWMgZHJtTW9kZVByb3BlcnR5QmxvYlB0cgo+IC1nZXRfYmxvYihkYXRh X3QgKmRhdGEsIGlndF9waXBlX3QgKnBpcGUsIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUpCj4g LXsKPiAtCXVpbnQ2NF90IHByb3BfdmFsdWU7Cj4gLQlkcm1Nb2RlUHJvcGVydHlQdHIgcHJvcDsK PiAtCWRybU1vZGVQcm9wZXJ0eUJsb2JQdHIgYmxvYjsKPiAtCj4gLQlpZ3RfYXNzZXJ0KGlndF9w aXBlX2dldF9wcm9wZXJ0eShwaXBlLCBwcm9wZXJ0eV9uYW1lLAo+IC0JCQkJCSBOVUxMLCAmcHJv cF92YWx1ZSwgJnByb3ApKTsKPiAtCj4gLQlpZiAocHJvcF92YWx1ZSA9PSAwKQo+IC0JCXJldHVy biBOVUxMOwo+IC0KPiAtCWlndF9hc3NlcnQocHJvcC0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0JM T0IpOwo+IC0JYmxvYiA9IGRybU1vZGVHZXRQcm9wZXJ0eUJsb2IoZGF0YS0+ZHJtX2ZkLCBwcm9w X3ZhbHVlKTsKPiAtCWRybU1vZGVGcmVlUHJvcGVydHkocHJvcCk7Cj4gLQo+IC0JcmV0dXJuIGJs b2I7Cj4gLX0KPiAtCj4gLS8qCj4gLSAqIFZlcmlmeSB0aGF0IHNldHRpbmcgdGhlIGxlZ2FjeSBn YW1tYSBMVVQgcmVzZXRzIHRoZSBnYW1tYSBMVVQgc2V0Cj4gLSAqIHRocm91Z2ggdGhlIEdBTU1B X0xVVCBwcm9wZXJ0eS4KPiAtICovCj4gLXN0YXRpYyB2b2lkIHRlc3RfcGlwZV9sZWdhY3lfZ2Ft bWFfcmVzZXQoZGF0YV90ICpkYXRhLAo+IC0JCQkJCSBpZ3RfcGxhbmVfdCAqcHJpbWFyeSkKPiAt ewo+IC0JY29uc3QgZG91YmxlIGN0bV9pZGVudGl0eVtdID0gewo+IC0JCTEuMCwgMC4wLCAwLjAs Cj4gLQkJMC4wLCAxLjAsIDAuMCwKPiAtCQkwLjAsIDAuMCwgMS4wCj4gLQl9Owo+IC0JZHJtTW9k ZUNydGMgKmttc19jcnRjOwo+IC0JZG91YmxlICpkZWdhbW1hX2xpbmVhciwgKmdhbW1hX3plcm87 Cj4gLQl1aW50MzJfdCBpLCBsZWdhY3lfbHV0X3NpemU7Cj4gLQl1aW50MTZfdCAqcmVkX2x1dCwg KmdyZWVuX2x1dCwgKmJsdWVfbHV0Owo+IC0Jc3RydWN0IF9kcm1fY29sb3JfbHV0ICpsdXQ7Cj4g LQlkcm1Nb2RlUHJvcGVydHlCbG9iUHRyIGJsb2I7Cj4gLQlpZ3Rfb3V0cHV0X3QgKm91dHB1dDsK PiAtCj4gLQlkZWdhbW1hX2xpbmVhciA9IGdlbmVyYXRlX3RhYmxlKGRhdGEtPmRlZ2FtbWFfbHV0 X3NpemUsIDEuMCk7Cj4gLQlnYW1tYV96ZXJvID0gZ2VuZXJhdGVfdGFibGVfemVybyhkYXRhLT5n YW1tYV9sdXRfc2l6ZSk7Cj4gLQo+IC0JZm9yX2VhY2hfY29ubmVjdGVkX291dHB1dCgmZGF0YS0+ ZGlzcGxheSwgb3V0cHV0KSB7Cj4gLQkJaWd0X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIHByaW1h cnktPnBpcGUtPnBpcGUpOwo+IC0KPiAtCQkvKiBFbnN1cmUgd2UgaGF2ZSBhIGNsZWFuIHN0YXRl IHRvIHN0YXJ0IHdpdGguICovCj4gLQkJZGlzYWJsZV9kZWdhbW1hKHByaW1hcnktPnBpcGUpOwo+ IC0JCWRpc2FibGVfY3RtKHByaW1hcnktPnBpcGUpOwo+IC0JCWRpc2FibGVfZ2FtbWEocHJpbWFy eS0+cGlwZSk7Cj4gLQkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiAtCj4g LQkJLyogU2V0IGEgZGVnYW1hICYgZ2FtbWEgTFVUIGFuZCBhIENUTSB1c2luZyB0aGUKPiAtCQkg KiBwcm9wZXJ0aWVzIGFuZCB2ZXJpZnkgdGhlIGNvbnRlbnQgb2YgdGhlCj4gLQkJICogcHJvcGVy dGllcy4gKi8KPiAtCQlzZXRfZGVnYW1tYShkYXRhLCBwcmltYXJ5LT5waXBlLCBkZWdhbW1hX2xp bmVhcik7Cj4gLQkJc2V0X2N0bShwcmltYXJ5LT5waXBlLCBjdG1faWRlbnRpdHkpOwo+IC0JCXNl dF9nYW1tYShkYXRhLCBwcmltYXJ5LT5waXBlLCBnYW1tYV96ZXJvKTsKPiAtCQlpZ3RfZGlzcGxh eV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+IC0KPiAtCQlibG9iID0gZ2V0X2Jsb2IoZGF0YSwg cHJpbWFyeS0+cGlwZSwgIkRFR0FNTUFfTFVUIik7Cj4gLQkJaWd0X2Fzc2VydChibG9iICYmCj4g LQkJCSAgIGJsb2ItPmxlbmd0aCA9PSAoc2l6ZW9mKHN0cnVjdCBfZHJtX2NvbG9yX2x1dCkgKgo+ IC0JCQkJCSAgICBkYXRhLT5kZWdhbW1hX2x1dF9zaXplKSk7Cj4gLQkJZHJtTW9kZUZyZWVQcm9w ZXJ0eUJsb2IoYmxvYik7Cj4gLQo+IC0JCWJsb2IgPSBnZXRfYmxvYihkYXRhLCBwcmltYXJ5LT5w aXBlLCAiQ1RNIik7Cj4gLQkJaWd0X2Fzc2VydChibG9iICYmCj4gLQkJCSAgIGJsb2ItPmxlbmd0 aCA9PSBzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfY3RtKSk7Cj4gLQkJZHJtTW9kZUZyZWVQcm9w ZXJ0eUJsb2IoYmxvYik7Cj4gLQo+IC0JCWJsb2IgPSBnZXRfYmxvYihkYXRhLCBwcmltYXJ5LT5w aXBlLCAiR0FNTUFfTFVUIik7Cj4gLQkJaWd0X2Fzc2VydChibG9iICYmCj4gLQkJCSAgIGJsb2It Pmxlbmd0aCA9PSAoc2l6ZW9mKHN0cnVjdCBfZHJtX2NvbG9yX2x1dCkgKgo+IC0JCQkJCSAgICBk YXRhLT5nYW1tYV9sdXRfc2l6ZSkpOwo+IC0JCWx1dCA9IChzdHJ1Y3QgX2RybV9jb2xvcl9sdXQg KikgYmxvYi0+ZGF0YTsKPiAtCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+Z2FtbWFfbHV0X3NpemU7 IGkrKykKPiAtCQkJaWd0X2Fzc2VydChsdXRbaV0ucmVkID09IDAgJiYKPiAtCQkJCSAgIGx1dFtp XS5ncmVlbiA9PSAwICYmCj4gLQkJCQkgICBsdXRbaV0uYmx1ZSA9PSAwKTsKPiAtCQlkcm1Nb2Rl RnJlZVByb3BlcnR5QmxvYihibG9iKTsKPiAtCj4gLQkJLyogU2V0IGEgZ2FtbWEgTFVUIHVzaW5n IHRoZSBsZWdhY3kgaW9jdGwgYW5kIHZlcmlmeQo+IC0JCSAqIHRoZSBjb250ZW50IG9mIHRoZSBH QU1NQV9MVVQgcHJvcGVydHkgaXMgY2hhbmdlZAo+IC0JCSAqIGFuZCB0aGF0IENUTSBhbmQgREVH QU1NQV9MVVQgYXJlIGVtcHR5LiAqLwo+IC0JCWttc19jcnRjID0gZHJtTW9kZUdldENydGMoZGF0 YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBlLT5jcnRjX2lkKTsKPiAtCQlsZWdhY3lfbHV0X3NpemUg PSBrbXNfY3J0Yy0+Z2FtbWFfc2l6ZTsKPiAtCQlkcm1Nb2RlRnJlZUNydGMoa21zX2NydGMpOwo+ IC0KPiAtCQlyZWRfbHV0ID0gbWFsbG9jKHNpemVvZih1aW50MTZfdCkgKiBsZWdhY3lfbHV0X3Np emUpOwo+IC0JCWdyZWVuX2x1dCA9IG1hbGxvYyhzaXplb2YodWludDE2X3QpICogbGVnYWN5X2x1 dF9zaXplKTsKPiAtCQlibHVlX2x1dCA9IG1hbGxvYyhzaXplb2YodWludDE2X3QpICogbGVnYWN5 X2x1dF9zaXplKTsKPiAtCj4gLQkJZm9yIChpID0gMDsgaSA8IGxlZ2FjeV9sdXRfc2l6ZTsgaSsr KQo+IC0JCQlyZWRfbHV0W2ldID0gZ3JlZW5fbHV0W2ldID0gYmx1ZV9sdXRbaV0gPSAweGZmZmY7 Cj4gLQo+IC0JCWlndF9hc3NlcnRfZXEoZHJtTW9kZUNydGNTZXRHYW1tYShkYXRhLT5kcm1fZmQs Cj4gLQkJCQkJCSAgcHJpbWFyeS0+cGlwZS0+Y3J0Y19pZCwKPiAtCQkJCQkJICBsZWdhY3lfbHV0 X3NpemUsCj4gLQkJCQkJCSAgcmVkX2x1dCwgZ3JlZW5fbHV0LCBibHVlX2x1dCksCj4gLQkJCSAg ICAgIDApOwo+IC0JCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7Cj4gLQo+IC0J CWlndF9hc3NlcnQoZ2V0X2Jsb2IoZGF0YSwgcHJpbWFyeS0+cGlwZSwKPiAtCQkJCSAgICAiREVH QU1NQV9MVVQiKSA9PSBOVUxMKTsKPiAtCQlpZ3RfYXNzZXJ0KGdldF9ibG9iKGRhdGEsIHByaW1h cnktPnBpcGUsICJDVE0iKSA9PSBOVUxMKTsKPiAtCj4gLQkJYmxvYiA9IGdldF9ibG9iKGRhdGEs IHByaW1hcnktPnBpcGUsICJHQU1NQV9MVVQiKTsKPiAtCQlpZ3RfYXNzZXJ0KGJsb2IgJiYKPiAt CQkJICAgYmxvYi0+bGVuZ3RoID09IChzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfbHV0KSAqCj4g LQkJCQkJICAgIGxlZ2FjeV9sdXRfc2l6ZSkpOwo+IC0JCWx1dCA9IChzdHJ1Y3QgX2RybV9jb2xv cl9sdXQgKikgYmxvYi0+ZGF0YTsKPiAtCQlmb3IgKGkgPSAwOyBpIDwgbGVnYWN5X2x1dF9zaXpl OyBpKyspCj4gLQkJCWlndF9hc3NlcnQobHV0W2ldLnJlZCA9PSAweGZmZmYgJiYKPiAtCQkJCSAg IGx1dFtpXS5ncmVlbiA9PSAweGZmZmYgJiYKPiAtCQkJCSAgIGx1dFtpXS5ibHVlID09IDB4ZmZm Zik7Cj4gLQkJZHJtTW9kZUZyZWVQcm9wZXJ0eUJsb2IoYmxvYik7Cj4gLQo+IC0JCWlndF9vdXRw dXRfc2V0X3BpcGUob3V0cHV0LCBQSVBFX0FOWSk7Cj4gLQl9Cj4gLQo+IC0JZnJlZShkZWdhbW1h X2xpbmVhcik7Cj4gLQlmcmVlKGdhbW1hX3plcm8pOwo+IC19Cj4gLQo+IC0vKgo+IC0gKiBEcmF3 IDMgcmVjdGFuZ2xlcyB1c2luZyBiZWZvcmUgY29sb3JzIHdpdGggdGhlIGN0bSBtYXRyaXggYXBw bHkgYW5kIHZlcmlmeQo+IC0gKiB0aGUgQ1JDIGlzIGVxdWFsIHRvIHVzaW5nIGFmdGVyIGNvbG9y cyB3aXRoIGFuIGlkZW50aWZ5IGN0bSBtYXRyaXguCj4gLSAqLwo+IC1zdGF0aWMgYm9vbCB0ZXN0 X3BpcGVfY3RtKGRhdGFfdCAqZGF0YSwKPiAtCQkJICBpZ3RfcGxhbmVfdCAqcHJpbWFyeSwKPiAt CQkJICBjb2xvcl90ICpiZWZvcmUsCj4gLQkJCSAgY29sb3JfdCAqYWZ0ZXIsCj4gLQkJCSAgZG91 YmxlICpjdG1fbWF0cml4KQo+IC17Cj4gLQljb25zdCBkb3VibGUgY3RtX2lkZW50aXR5W10gPSB7 Cj4gLQkJMS4wLCAwLjAsIDAuMCwKPiAtCQkwLjAsIDEuMCwgMC4wLAo+IC0JCTAuMCwgMC4wLCAx LjAKPiAtCX07Cj4gLQlkb3VibGUgKmRlZ2FtbWFfbGluZWFyLCAqZ2FtbWFfbGluZWFyOwo+IC0J aWd0X291dHB1dF90ICpvdXRwdXQ7Cj4gLQlib29sIHJldCA9IHRydWU7Cj4gLQo+IC0JZGVnYW1t YV9saW5lYXIgPSBnZW5lcmF0ZV90YWJsZShkYXRhLT5kZWdhbW1hX2x1dF9zaXplLCAxLjApOwo+ IC0JZ2FtbWFfbGluZWFyID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+Z2FtbWFfbHV0X3NpemUsIDEu MCk7Cj4gLQo+IC0JZm9yX2VhY2hfY29ubmVjdGVkX291dHB1dCgmZGF0YS0+ZGlzcGxheSwgb3V0 cHV0KSB7Cj4gLQkJZHJtTW9kZU1vZGVJbmZvICptb2RlOwo+IC0JCXN0cnVjdCBpZ3RfZmIgZmJf bW9kZXNldCwgZmI7Cj4gLQkJaWd0X2NyY190IGNyY19zb2Z0d2FyZSwgY3JjX2hhcmR3YXJlOwo+ IC0JCWludCBmYl9pZCwgZmJfbW9kZXNldF9pZDsKPiAtCj4gLQkJaWd0X291dHB1dF9zZXRfcGlw ZShvdXRwdXQsIHByaW1hcnktPnBpcGUtPnBpcGUpOwo+IC0JCW1vZGUgPSBpZ3Rfb3V0cHV0X2dl dF9tb2RlKG91dHB1dCk7Cj4gLQo+IC0JCS8qIENyZWF0ZSBhIGZyYW1lYnVmZmVyIGF0IHRoZSBz aXplIG9mIHRoZSBvdXRwdXQuICovCj4gLQkJZmJfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRy bV9mZCwKPiAtCQkJCSAgICAgIG1vZGUtPmhkaXNwbGF5LAo+IC0JCQkJICAgICAgbW9kZS0+dmRp c3BsYXksCj4gLQkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+IC0JCQkJICAgICAgTE9D QUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiAtCQkJCSAgICAgICZmYik7Cj4gLQkJaWd0X2Fzc2Vy dChmYl9pZCk7Cj4gLQo+IC0JCWZiX21vZGVzZXRfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRy bV9mZCwKPiAtCQkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwKPiAtCQkJCQkgICAgICBtb2RlLT52 ZGlzcGxheSwKPiAtCQkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+IC0JCQkJCSAgICAg IExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCj4gLQkJCQkJICAgICAgJmZiX21vZGVzZXQpOwo+ IC0JCWlndF9hc3NlcnQoZmJfbW9kZXNldF9pZCk7Cj4gLQkJaWd0X3BsYW5lX3NldF9mYihwcmlt YXJ5LCAmZmJfbW9kZXNldCk7Cj4gLQo+IC0JCXNldF9kZWdhbW1hKGRhdGEsIHByaW1hcnktPnBp cGUsIGRlZ2FtbWFfbGluZWFyKTsKPiAtCQlzZXRfZ2FtbWEoZGF0YSwgcHJpbWFyeS0+cGlwZSwg Z2FtbWFfbGluZWFyKTsKPiAtCQlkaXNhYmxlX2N0bShwcmltYXJ5LT5waXBlKTsKPiAtCQlpZ3Rf ZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+IC0KPiAtCQlwYWludF9yZWN0YW5nbGVz KGRhdGEsIG1vZGUsIGFmdGVyLCAmZmIpOwo+IC0JCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwg JmZiKTsKPiAtCQlzZXRfY3RtKHByaW1hcnktPnBpcGUsIGN0bV9pZGVudGl0eSk7Cj4gLQkJaWd0 X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiAtCQlpZ3Rfd2FpdF9mb3JfdmJsYW5r KGRhdGEtPmRybV9mZCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gLQkJaWd0X3BpcGVfY3JjX2Nv bGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjX3NvZnR3YXJlKTsKPiAtCj4gLQkJLyogV2l0 aCBDVE0gdHJhbnNmb3JtYXRpb24uICovCj4gLQkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2Rl LCBiZWZvcmUsICZmYik7Cj4gLQkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCAmZmIpOwo+IC0J CXNldF9jdG0ocHJpbWFyeS0+cGlwZSwgY3RtX21hdHJpeCk7Cj4gLQkJaWd0X2Rpc3BsYXlfY29t bWl0KCZkYXRhLT5kaXNwbGF5KTsKPiAtCQlpZ3Rfd2FpdF9mb3JfdmJsYW5rKGRhdGEtPmRybV9m ZCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gLQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRh dGEtPnBpcGVfY3JjLCAmY3JjX2hhcmR3YXJlKTsKPiAtCj4gLQkJLyogVmVyaWZ5IHRoYXQgdGhl IENSQyBvZiB0aGUgc29mdHdhcmUgY29tcHV0ZWQgb3V0cHV0IGlzCj4gLQkJICogZXF1YWwgdG8g dGhlIENSQyBvZiB0aGUgQ1RNIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQuCj4gLQkJICov Cj4gLQkJcmV0ICY9IGlndF9jcmNfZXF1YWwoJmNyY19zb2Z0d2FyZSwgJmNyY19oYXJkd2FyZSk7 Cj4gLQo+IC0JCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBQSVBFX0FOWSk7Cj4gLQl9Cj4g LQo+IC0JZnJlZShkZWdhbW1hX2xpbmVhcik7Cj4gLQlmcmVlKGdhbW1hX2xpbmVhcik7Cj4gLQo+ IC0JcmV0dXJuIHJldDsKPiAtfQo+IC0KPiAtLyoKPiAtICogSGFyZHdhcmUgY29tcHV0ZXMgQ1JD IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYml0cyBpdCBpcyB3b3JraW5nIHdpdGggKDgsCj4gLSAq IDEwLCAxMiwgMTYgYml0cyksIG1lYW5pbmcgd2l0aCBhIGZyYW1lYnVmZmVyIG9mIDhiaXRzIHBl ciBjb2xvciB3aWxsCj4gLSAqIHVzdWFsbHkgbGVhdmUgdGhlIHJlbWFpbmluZyBsb3dlciBiaXRz IGF0IDAuCj4gLSAqCj4gLSAqIFdlJ3JlIHByb2dyYW1taW5nIHRoZSBnYW1tYSBMVVQgaW4gb3Jk ZXIgdG8gZ2V0IHJpZCBvZiB0aG9zZSBsb3dlciBiaXRzIHNvCj4gLSAqIHdlIGNhbiBjb21wYXJl IHRoZSBDUkMgb2YgYSBmcmFtZWJ1ZmZlciB3aXRob3V0IGFueSB0cmFuc2Zvcm1hdGlvbiB0byBh IENSQwo+IC0gKiB3aXRoIHRyYW5zZm9ybWF0aW9uIGFwcGxpZWQgYW5kIHZlcmlmeSB0aGUgQ1JD cyBtYXRjaC4KPiAtICoKPiAtICogVGhpcyB0ZXN0IGlzIGN1cnJlbnRseSBkaXNhYmxlZCBhcyB0 aGUgQ1JDIGNvbXB1dGVkIG9uIEludGVsIGhhcmR3YXJlIHNlZW1zCj4gLSAqIHRvIGluY2x1ZGUg ZGF0YSBvbiB0aGUgbG93ZXIgYml0cywgdGhpcyBpcyBwcmV2ZW50aW5nIHVzIHRvIENSQyBjaGVj a3MuCj4gLSAqLwo+IC0jaWYgMAo+IC1zdGF0aWMgdm9pZCB0ZXN0X3BpcGVfbGltaXRlZF9yYW5n ZV9jdG0oZGF0YV90ICpkYXRhLAo+IC0JCQkJCWlndF9wbGFuZV90ICpwcmltYXJ5KQo+IC17Cj4g LQlkb3VibGUgbGltaXRlZF9yZXN1bHQgPSAyMzUuMCAvIDI1NS4wOwo+IC0JY29sb3JfdCByZWRf Z3JlZW5fYmx1ZV9saW1pdGVkW10gPSB7Cj4gLQkJeyBsaW1pdGVkX3Jlc3VsdCwgMC4wLCAwLjAg fSwKPiAtCQl7IDAuMCwgbGltaXRlZF9yZXN1bHQsIDAuMCB9LAo+IC0JCXsgMC4wLCAwLjAsIGxp bWl0ZWRfcmVzdWx0IH0KPiAtCX07Cj4gLQljb2xvcl90IHJlZF9ncmVlbl9ibHVlX2Z1bGxbXSA9 IHsKPiAtCQl7IDAuNSwgMC4wLCAwLjAgfSwKPiAtCQl7IDAuMCwgMC41LCAwLjAgfSwKPiAtCQl7 IDAuMCwgMC4wLCAwLjUgfQo+IC0JfTsKPiAtCWRvdWJsZSBjdG1bXSA9IHsgMS4wLCAwLjAsIDAu MCwKPiAtCQkJMC4wLCAxLjAsIDAuMCwKPiAtCQkJMC4wLCAwLjAsIDEuMCB9Owo+IC0JZG91Ymxl ICpkZWdhbW1hX2xpbmVhciwgKmdhbW1hX2xpbmVhcjsKPiAtCWlndF9vdXRwdXRfdCAqb3V0cHV0 Owo+IC0KPiAtCWRlZ2FtbWFfbGluZWFyID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+ZGVnYW1tYV9s dXRfc2l6ZSwgMS4wKTsKPiAtCWdhbW1hX2xpbmVhciA9IGdlbmVyYXRlX3RhYmxlKGRhdGEtPmdh bW1hX2x1dF9zaXplLCAxLjApOwo+IC0KPiAtCWZvcl9lYWNoX2Nvbm5lY3RlZF9vdXRwdXQoJmRh dGEtPmRpc3BsYXksIG91dHB1dCkgewo+IC0JCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKPiAtCQlz dHJ1Y3QgaWd0X2ZiIGZiX21vZGVzZXQsIGZiOwo+IC0JCWlndF9jcmNfdCBjcmNfZnVsbCwgY3Jj X2xpbWl0ZWQ7Cj4gLQkJaW50IGZiX2lkLCBmYl9tb2Rlc2V0X2lkOwo+IC0KPiAtCQlpZ3Rfb3V0 cHV0X3NldF9waXBlKG91dHB1dCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gLQkJbW9kZSA9IGln dF9vdXRwdXRfZ2V0X21vZGUob3V0cHV0KTsKPiAtCj4gLQkJLyogQ3JlYXRlIGEgZnJhbWVidWZm ZXIgYXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dC4gKi8KPiAtCQlmYl9pZCA9IGlndF9jcmVhdGVf ZmIoZGF0YS0+ZHJtX2ZkLAo+IC0JCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCj4gLQkJCQkgICAg ICBtb2RlLT52ZGlzcGxheSwKPiAtCQkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gLQkJ CQkgICAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAo+IC0JCQkJICAgICAgJmZiKTsKPiAt CQlpZ3RfYXNzZXJ0KGZiX2lkKTsKPiAtCj4gLQkJZmJfbW9kZXNldF9pZCA9IGlndF9jcmVhdGVf ZmIoZGF0YS0+ZHJtX2ZkLAo+IC0JCQkJCSAgICAgIG1vZGUtPmhkaXNwbGF5LAo+IC0JCQkJCSAg ICAgIG1vZGUtPnZkaXNwbGF5LAo+IC0JCQkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4g LQkJCQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiAtCQkJCQkgICAgICAmZmJf bW9kZXNldCk7Cj4gLQkJaWd0X2Fzc2VydChmYl9tb2Rlc2V0X2lkKTsKPiAtCQlpZ3RfcGxhbmVf c2V0X2ZiKHByaW1hcnksICZmYl9tb2Rlc2V0KTsKPiAtCj4gLQkJc2V0X2RlZ2FtbWEoZGF0YSwg cHJpbWFyeS0+cGlwZSwgZGVnYW1tYV9saW5lYXIpOwo+IC0JCXNldF9nYW1tYShkYXRhLCBwcmlt YXJ5LT5waXBlLCBnYW1tYV9saW5lYXIpOwo+IC0JCXNldF9jdG0ocHJpbWFyeS0+cGlwZSwgY3Rt KTsKPiAtCj4gLQkJb3V0cHV0X3NldF9wcm9wZXJ0eV9lbnVtKG91dHB1dCwgIkJyb2FkY2FzdCBS R0IiLCAiRnVsbCIpOwo+IC0JCXBhaW50X3JlY3RhbmdsZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVu X2JsdWVfbGltaXRlZCwgJmZiKTsKPiAtCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7 Cj4gLQkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiAtCQlpZ3Rfd2FpdF9m b3JfdmJsYW5rKGRhdGEtPmRybV9mZCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gLQkJaWd0X3Bp cGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjX2Z1bGwpOwo+IC0KPiAtCQkv KiBTZXQgdGhlIG91dHB1dCBpbnRvIGxpbWl0ZWQgcmFuZ2UuICovCj4gLQkJb3V0cHV0X3NldF9w cm9wZXJ0eV9lbnVtKG91dHB1dCwgIkJyb2FkY2FzdCBSR0IiLCAiTGltaXRlZCAxNjoyMzUiKTsK PiAtCQlwYWludF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlX2Z1bGwsICZm Yik7Cj4gLQkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCAmZmIpOwo+IC0JCWlndF9kaXNwbGF5 X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7Cj4gLQkJaWd0X3dhaXRfZm9yX3ZibGFuayhkYXRhLT5k cm1fZmQsIHByaW1hcnktPnBpcGUtPnBpcGUpOwo+IC0JCWlndF9waXBlX2NyY19jb2xsZWN0X2Ny YyhkYXRhLT5waXBlX2NyYywgJmNyY19saW1pdGVkKTsKPiAtCj4gLQkJLyogVmVyaWZ5IHRoYXQg dGhlIENSQyBvZiB0aGUgc29mdHdhcmUgY29tcHV0ZWQgb3V0cHV0IGlzCj4gLQkJICogZXF1YWwg dG8gdGhlIENSQyBvZiB0aGUgQ1RNIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQuCj4gLQkJ ICovCj4gLQkJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmNyY19mdWxsLCAmY3JjX2xpbWl0ZWQpOwo+ IC0KPiAtCQlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgUElQRV9BTlkpOwo+IC0JfQo+IC0K PiAtCWZyZWUoZ2FtbWFfbGluZWFyKTsKPiAtCWZyZWUoZGVnYW1tYV9saW5lYXIpOwo+IC19Cj4g LSNlbmRpZgo+IC0KPiAtc3RhdGljIHZvaWQKPiAtcnVuX3Rlc3RzX2Zvcl9waXBlKGRhdGFfdCAq ZGF0YSwgZW51bSBwaXBlIHApCj4gLXsKPiAtCWlndF9vdXRwdXRfdCAqb3V0cHV0Owo+IC0JaWd0 X3BpcGVfdCAqcGlwZTsKPiAtCWlndF9wbGFuZV90ICpwcmltYXJ5Owo+IC0JZG91YmxlIGRlbHRh Owo+IC0JaW50IGk7Cj4gLQljb2xvcl90IHJlZF9ncmVlbl9ibHVlW10gPSB7Cj4gLQkJeyAxLjAs IDAuMCwgMC4wIH0sCj4gLQkJeyAwLjAsIDEuMCwgMC4wIH0sCj4gLQkJeyAwLjAsIDAuMCwgMS4w IH0KPiAtCX07Cj4gLQo+IC0JaWd0X2ZpeHR1cmUgewo+IC0JCWlndF9yZXF1aXJlX3BpcGVfY3Jj KCk7Cj4gLQo+IC0JCWlmIChwID49IGRhdGEtPmRpc3BsYXkubl9waXBlcykKPiAtCQkJcmV0dXJu Owo+IC0KPiAtCQlwaXBlID0gJmRhdGEtPmRpc3BsYXkucGlwZXNbcF07Cj4gLQkJaWYgKHBpcGUt Pm5fcGxhbmVzIDwgSUdUX1BMQU5FX1BSSU1BUlkpCj4gLQkJCXJldHVybjsKPiAtCj4gLQkJcHJp bWFyeSA9ICZwaXBlLT5wbGFuZXNbSUdUX1BMQU5FX1BSSU1BUlldOwo+IC0KPiAtCQlkYXRhLT5w aXBlX2NyYyA9IGlndF9waXBlX2NyY19uZXcocHJpbWFyeS0+cGlwZS0+cGlwZSwKPiAtCQkJCQkJ ICBJTlRFTF9QSVBFX0NSQ19TT1VSQ0VfQVVUTyk7Cj4gLQo+IC0JCWlndF9yZXF1aXJlKGlndF9w aXBlX2dldF9wcm9wZXJ0eSgmZGF0YS0+ZGlzcGxheS5waXBlc1twXSwKPiAtCQkJCQkJICAiREVH QU1NQV9MVVRfU0laRSIsCj4gLQkJCQkJCSAgTlVMTCwKPiAtCQkJCQkJICAmZGF0YS0+ZGVnYW1t YV9sdXRfc2l6ZSwKPiAtCQkJCQkJICBOVUxMKSk7Cj4gLQkJaWd0X3JlcXVpcmUoaWd0X3BpcGVf Z2V0X3Byb3BlcnR5KCZkYXRhLT5kaXNwbGF5LnBpcGVzW3BdLAo+IC0JCQkJCQkgICJHQU1NQV9M VVRfU0laRSIsCj4gLQkJCQkJCSAgTlVMTCwKPiAtCQkJCQkJICAmZGF0YS0+Z2FtbWFfbHV0X3Np emUsCj4gLQkJCQkJCSAgTlVMTCkpOwo+IC0KPiAtCQlmb3JfZWFjaF9jb25uZWN0ZWRfb3V0cHV0 KCZkYXRhLT5kaXNwbGF5LCBvdXRwdXQpCj4gLQkJCW91dHB1dF9zZXRfcHJvcGVydHlfZW51bShv dXRwdXQsICJCcm9hZGNhc3QgUkdCIiwgIkZ1bGwiKTsKPiAtCX0KPiAtCj4gLQkvKiBXZSBhc3N1 bWUgYW4gOGJpdHMgZGVwdGggcGVyIGNvbG9yIGZvciBkZWdhbW1hL2dhbW1hIExVVHMKPiAtCSAq IGZvciBDUkMgY2hlY2tzIHdpdGggZnJhbWVidWZmZXIgcmVmZXJlbmNlcy4gKi8KPiAtCWRhdGEt PmNvbG9yX2RlcHRoID0gODsKPiAtCWRlbHRhID0gMS4wIC8gKDEgPDwgZGF0YS0+Y29sb3JfZGVw dGgpOwo+IC0KPiAtCWlndF9zdWJ0ZXN0X2YoImN0bS1yZWQtdG8tYmx1ZS1waXBlJWQiLCBwKSB7 Cj4gLQkJY29sb3JfdCBibHVlX2dyZWVuX2JsdWVbXSA9IHsKPiAtCQkJeyAwLjAsIDAuMCwgMS4w IH0sCj4gLQkJCXsgMC4wLCAxLjAsIDAuMCB9LAo+IC0JCQl7IDAuMCwgMC4wLCAxLjAgfQo+IC0J CX07Cj4gLQkJZG91YmxlIGN0bVtdID0geyAwLjAsIDAuMCwgMC4wLAo+IC0JCQkJMC4wLCAxLjAs IDAuMCwKPiAtCQkJCTEuMCwgMC4wLCAxLjAgfTsKPiAtCQlpZ3RfYXNzZXJ0KHRlc3RfcGlwZV9j dG0oZGF0YSwgcHJpbWFyeSwgcmVkX2dyZWVuX2JsdWUsCj4gLQkJCQkJIGJsdWVfZ3JlZW5fYmx1 ZSwgY3RtKSk7Cj4gLQl9Cj4gLQo+IC0JaWd0X3N1YnRlc3RfZigiY3RtLWdyZWVuLXRvLXJlZC1w aXBlJWQiLCBwKSB7Cj4gLQkJY29sb3JfdCByZWRfcmVkX2JsdWVbXSA9IHsKPiAtCQkJeyAxLjAs IDAuMCwgMC4wIH0sCj4gLQkJCXsgMS4wLCAwLjAsIDAuMCB9LAo+IC0JCQl7IDAuMCwgMC4wLCAx LjAgfQo+IC0JCX07Cj4gLQkJZG91YmxlIGN0bVtdID0geyAxLjAsIDEuMCwgMC4wLAo+IC0JCQkJ MC4wLCAwLjAsIDAuMCwKPiAtCQkJCTAuMCwgMC4wLCAxLjAgfTsKPiAtCQlpZ3RfYXNzZXJ0KHRl c3RfcGlwZV9jdG0oZGF0YSwgcHJpbWFyeSwgcmVkX2dyZWVuX2JsdWUsCj4gLQkJCQkJIHJlZF9y ZWRfYmx1ZSwgY3RtKSk7Cj4gLQl9Cj4gLQo+IC0JaWd0X3N1YnRlc3RfZigiY3RtLWJsdWUtdG8t cmVkLXBpcGUlZCIsIHApIHsKPiAtCQljb2xvcl90IHJlZF9ncmVlbl9yZWRbXSA9IHsKPiAtCQkJ eyAxLjAsIDAuMCwgMC4wIH0sCj4gLQkJCXsgMC4wLCAxLjAsIDAuMCB9LAo+IC0JCQl7IDEuMCwg MC4wLCAwLjAgfQo+IC0JCX07Cj4gLQkJZG91YmxlIGN0bVtdID0geyAxLjAsIDAuMCwgMS4wLAo+ IC0JCQkJMC4wLCAxLjAsIDAuMCwKPiAtCQkJCTAuMCwgMC4wLCAwLjAgfTsKPiAtCQlpZ3RfYXNz ZXJ0KHRlc3RfcGlwZV9jdG0oZGF0YSwgcHJpbWFyeSwgcmVkX2dyZWVuX2JsdWUsCj4gLQkJCQkJ IHJlZF9ncmVlbl9yZWQsIGN0bSkpOwo+IC0JfQo+IC0KPiAtCS8qIFdlIHRlc3RzIGEgZmV3IHZh bHVlcyBhcm91bmQgdGhlIGV4cGVjdGVkIHJlc3VsdCBiZWNhdXNlCj4gLQkgKiB0aGUgaXQgZGVw ZW5kcyBvbiB0aGUgaGFyZHdhcmUgd2UncmUgZGVhbGluZyB3aXRoLCB3ZSBjYW4KPiAtCSAqIGVp dGhlciBnZXQgY2xhbXBlZCBvciByb3VuZGVkIHZhbHVlcyBhbmQgd2UgYWxzbyBuZWVkIHRvCj4g LQkgKiBhY2NvdW50IGZvciBvZGQgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBMVVRzLiAqLwo+IC0J aWd0X3N1YnRlc3RfZigiY3RtLTAtMjUtcGlwZSVkIiwgcCkgewo+IC0JCWNvbG9yX3QgZXhwZWN0 ZWRfY29sb3JzW10gPSB7Cj4gLQkJCXsgMC4wLCB9LCB7IDAuMCwgfSwgeyAwLjAsIH0KPiAtCQl9 Owo+IC0JCWRvdWJsZSBjdG1bXSA9IHsgMC4yNSwgMC4wLCAgMC4wLAo+IC0JCQkJIDAuMCwgIDAu MjUsIDAuMCwKPiAtCQkJCSAwLjAsICAwLjAsICAwLjI1IH07Cj4gLQkJYm9vbCBzdWNjZXNzID0g ZmFsc2U7Cj4gLQo+IC0JCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKPiAtCQkJZXhwZWN0ZWRf Y29sb3JzWzBdLnIgPQo+IC0JCQkJZXhwZWN0ZWRfY29sb3JzWzFdLmcgPQo+IC0JCQkJZXhwZWN0 ZWRfY29sb3JzWzJdLmIgPQo+IC0JCQkJMC4yNSArIGRlbHRhICogKGkgLSAyKTsKPiAtCQkJc3Vj Y2VzcyB8PSB0ZXN0X3BpcGVfY3RtKGRhdGEsIHByaW1hcnksCj4gLQkJCQkJCSByZWRfZ3JlZW5f Ymx1ZSwKPiAtCQkJCQkJIGV4cGVjdGVkX2NvbG9ycywgY3RtKTsKPiAtCQl9Cj4gLQkJaWd0X2Fz c2VydChzdWNjZXNzKTsKPiAtCX0KPiAtCj4gLQlpZ3Rfc3VidGVzdF9mKCJjdG0tMC01LXBpcGUl ZCIsIHApIHsKPiAtCQljb2xvcl90IGV4cGVjdGVkX2NvbG9yc1tdID0gewo+IC0JCQl7IDAuMCwg fSwgeyAwLjAsIH0sIHsgMC4wLCB9Cj4gLQkJfTsKPiAtCQlkb3VibGUgY3RtW10gPSB7IDAuNSwg MC4wLCAwLjAsCj4gLQkJCQkgMC4wLCAwLjUsIDAuMCwKPiAtCQkJCSAwLjAsIDAuMCwgMC41IH07 Cj4gLQkJYm9vbCBzdWNjZXNzID0gZmFsc2U7Cj4gLQo+IC0JCWZvciAoaSA9IDA7IGkgPCA1OyBp KyspIHsKPiAtCQkJZXhwZWN0ZWRfY29sb3JzWzBdLnIgPQo+IC0JCQkJZXhwZWN0ZWRfY29sb3Jz WzFdLmcgPQo+IC0JCQkJZXhwZWN0ZWRfY29sb3JzWzJdLmIgPQo+IC0JCQkJMC41ICsgZGVsdGEg KiAoaSAtIDIpOwo+IC0JCQlzdWNjZXNzIHw9IHRlc3RfcGlwZV9jdG0oZGF0YSwgcHJpbWFyeSwK PiAtCQkJCQkJIHJlZF9ncmVlbl9ibHVlLAo+IC0JCQkJCQkgZXhwZWN0ZWRfY29sb3JzLCBjdG0p Owo+IC0JCX0KPiAtCQlpZ3RfYXNzZXJ0KHN1Y2Nlc3MpOwo+IC0JfQo+IC0KPiAtCWlndF9zdWJ0 ZXN0X2YoImN0bS0wLTc1LXBpcGUlZCIsIHApIHsKPiAtCQljb2xvcl90IGV4cGVjdGVkX2NvbG9y c1tdID0gewo+IC0JCQl7IDAuMCwgfSwgeyAwLjAsIH0sIHsgMC4wLCB9Cj4gLQkJfTsKPiAtCQlk b3VibGUgY3RtW10gPSB7IDAuNzUsIDAuMCwgIDAuMCwKPiAtCQkJCSAwLjAsICAwLjc1LCAwLjAs Cj4gLQkJCQkgMC4wLCAgMC4wLCAgMC43NSB9Owo+IC0JCWJvb2wgc3VjY2VzcyA9IGZhbHNlOwo+ IC0KPiAtCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7Cj4gLQkJCWV4cGVjdGVkX2NvbG9yc1sw XS5yID0KPiAtCQkJCWV4cGVjdGVkX2NvbG9yc1sxXS5nID0KPiAtCQkJCWV4cGVjdGVkX2NvbG9y c1syXS5iID0KPiAtCQkJCTAuNzUgKyBkZWx0YSAqIChpIC0gMyk7Cj4gLQkJCXN1Y2Nlc3MgfD0g dGVzdF9waXBlX2N0bShkYXRhLCBwcmltYXJ5LAo+IC0JCQkJCQkgcmVkX2dyZWVuX2JsdWUsCj4g LQkJCQkJCSBleHBlY3RlZF9jb2xvcnMsIGN0bSk7Cj4gLQkJfQo+IC0JCWlndF9hc3NlcnQoc3Vj Y2Vzcyk7Cj4gLQl9Cj4gLQo+IC0JaWd0X3N1YnRlc3RfZigiY3RtLW1heC1waXBlJWQiLCBwKSB7 Cj4gLQkJY29sb3JfdCBmdWxsX3JnYltdID0gewo+IC0JCQl7IDEuMCwgMC4wLCAwLjAgfSwKPiAt CQkJeyAwLjAsIDEuMCwgMC4wIH0sCj4gLQkJCXsgMC4wLCAwLjAsIDEuMCB9Cj4gLQkJfTsKPiAt CQlkb3VibGUgY3RtW10gPSB7IDEwMC4wLCAgIDAuMCwgICAwLjAsCj4gLQkJCQkgMC4wLCAgIDEw MC4wLCAgIDAuMCwKPiAtCQkJCSAwLjAsICAgICAwLjAsIDEwMC4wIH07Cj4gLQo+IC0JCS8qIENo ZXJyeVZpZXcgZ2VuZXJhdGVzIHZhbHVlcyBvbiAxMGJpdHMgdGhhdCB3ZQo+IC0JCSAqIHByb2R1 Y2Ugd2l0aCBhbiA4IGJpdHMgcGVyIGNvbG9yIGZyYW1lYnVmZmVyLiAqLwo+IC0JCWlndF9yZXF1 aXJlKCFJU19DSEVSUllWSUVXKGRhdGEtPmRldmlkKSk7Cj4gLQo+IC0JCWlndF9hc3NlcnQodGVz dF9waXBlX2N0bShkYXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwKPiAtCQkJCQkgZnVsbF9y Z2IsIGN0bSkpOwo+IC0JfQo+IC0KPiAtCWlndF9zdWJ0ZXN0X2YoImN0bS1uZWdhdGl2ZS1waXBl JWQiLCBwKSB7Cj4gLQkJY29sb3JfdCBhbGxfYmxhY2tbXSA9IHsKPiAtCQkJeyAwLjAsIDAuMCwg MC4wIH0sCj4gLQkJCXsgMC4wLCAwLjAsIDAuMCB9LAo+IC0JCQl7IDAuMCwgMC4wLCAwLjAgfQo+ IC0JCX07Cj4gLQkJZG91YmxlIGN0bVtdID0geyAtMS4wLCAgMC4wLCAgMC4wLAo+IC0JCQkJIDAu MCwgLTEuMCwgIDAuMCwKPiAtCQkJCSAwLjAsICAwLjAsIC0xLjAgfTsKPiAtCQlpZ3RfYXNzZXJ0 KHRlc3RfcGlwZV9jdG0oZGF0YSwgcHJpbWFyeSwgcmVkX2dyZWVuX2JsdWUsCj4gLQkJCQkJIGFs bF9ibGFjaywgY3RtKSk7Cj4gLQl9Cj4gLQo+IC0jaWYgMAo+IC0JaWd0X3N1YnRlc3RfZigiY3Rt LWxpbWl0ZWQtcmFuZ2UtcGlwZSVkIiwgcCkKPiAtCQl0ZXN0X3BpcGVfbGltaXRlZF9yYW5nZV9j dG0oZGF0YSwgcHJpbWFyeSk7Cj4gLSNlbmRpZgo+IC0KPiAtCWlndF9zdWJ0ZXN0X2YoImRlZ2Ft bWEtcGlwZSVkIiwgcCkKPiAtCQl0ZXN0X3BpcGVfZGVnYW1tYShkYXRhLCBwcmltYXJ5KTsKPiAt Cj4gLQlpZ3Rfc3VidGVzdF9mKCJnYW1tYS1waXBlJWQiLCBwKQo+IC0JCXRlc3RfcGlwZV9nYW1t YShkYXRhLCBwcmltYXJ5KTsKPiAtCj4gLQlpZ3Rfc3VidGVzdF9mKCJsZWdhY3ktZ2FtbWEtcGlw ZSVkIiwgcCkKPiAtCQl0ZXN0X3BpcGVfbGVnYWN5X2dhbW1hKGRhdGEsIHByaW1hcnkpOwo+IC0K PiAtCWlndF9zdWJ0ZXN0X2YoImxlZ2FjeS1nYW1tYS1yZXNldC1waXBlJWQiLCBwKQo+IC0JCXRl c3RfcGlwZV9sZWdhY3lfZ2FtbWFfcmVzZXQoZGF0YSwgcHJpbWFyeSk7Cj4gLQo+IC0JaWd0X2Zp eHR1cmUgewo+IC0JCWZvcl9lYWNoX2Nvbm5lY3RlZF9vdXRwdXQoJmRhdGEtPmRpc3BsYXksIG91 dHB1dCkKPiAtCQkJb3V0cHV0X3NldF9wcm9wZXJ0eV9lbnVtKG91dHB1dCwgIkJyb2FkY2FzdCBS R0IiLCAiRnVsbCIpOwo+IC0KPiAtCQlkaXNhYmxlX2RlZ2FtbWEocHJpbWFyeS0+cGlwZSk7Cj4g LQkJZGlzYWJsZV9nYW1tYShwcmltYXJ5LT5waXBlKTsKPiAtCQlkaXNhYmxlX2N0bShwcmltYXJ5 LT5waXBlKTsKPiAtCQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+IC0KPiAt CQlpZ3RfcGlwZV9jcmNfZnJlZShkYXRhLT5waXBlX2NyYyk7Cj4gLQkJZGF0YS0+cGlwZV9jcmMg PSBOVUxMOwo+IC0JfQo+IC19Cj4gLQo+IC1zdGF0aWMgaW50Cj4gLXBpcGVfc2V0X3Byb3BlcnR5 X2Jsb2JfaWQoaWd0X3BpcGVfdCAqcGlwZSwgY29uc3QgY2hhciAqcHJvcGVydHksIHVpbnQzMl90 IGJsb2JfaWQpCj4gLXsKPiAtCXVpbnQzMl90IHByb3BfaWQ7Cj4gLQo+IC0JaWd0X2Fzc2VydChr bXN0ZXN0X2dldF9wcm9wZXJ0eShwaXBlLT5kaXNwbGF5LT5kcm1fZmQsCj4gLQkJCQkJcGlwZS0+ Y3J0Y19pZCwKPiAtCQkJCQlEUk1fTU9ERV9PQkpFQ1RfQ1JUQywKPiAtCQkJCQlwcm9wZXJ0eSwK PiAtCQkJCQkmcHJvcF9pZCwgTlVMTCwgTlVMTCkpOwo+IC0KPiAtCXJldHVybiBkcm1Nb2RlT2Jq ZWN0U2V0UHJvcGVydHkocGlwZS0+ZGlzcGxheS0+ZHJtX2ZkLAo+IC0JCQkJCXBpcGUtPmNydGNf aWQsCj4gLQkJCQkJRFJNX01PREVfT0JKRUNUX0NSVEMsCj4gLQkJCQkJcHJvcF9pZCwgYmxvYl9p ZCk7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQKPiAtcGlwZV9zZXRfcHJvcGVydHlfYmxvYihpZ3Rf cGlwZV90ICpwaXBlLCBjb25zdCBjaGFyICpwcm9wZXJ0eSwgdm9pZCAqcHRyLCBzaXplX3QgbGVu Z3RoKQo+IC17Cj4gLQlpbnQgcmV0ID0gMDsKPiAtCXVpbnQzMl90IGJsb2JfaWQgPSAwOwo+IC0K PiAtCWlmIChsZW5ndGggPiAwKQo+IC0JCWlndF9hc3NlcnRfZXEoZHJtTW9kZUNyZWF0ZVByb3Bl cnR5QmxvYihwaXBlLT5kaXNwbGF5LT5kcm1fZmQsCj4gLQkJCQkJCQlwdHIsIGxlbmd0aCwKPiAt CQkJCQkJCSZibG9iX2lkKSwgMCk7Cj4gLQo+IC0JcmV0ID0gcGlwZV9zZXRfcHJvcGVydHlfYmxv Yl9pZChwaXBlLCBwcm9wZXJ0eSwgYmxvYl9pZCk7Cj4gLQo+IC0JaWYgKGJsb2JfaWQgIT0gMCkK PiAtCQlpZ3RfYXNzZXJ0X2VxKGRybU1vZGVEZXN0cm95UHJvcGVydHlCbG9iKHBpcGUtPmRpc3Bs YXktPmRybV9mZCwgYmxvYl9pZCksIDApOwo+IC0KPiAtCXJldHVybiByZXQ7Cj4gLX0KPiAtCj4g LXN0YXRpYyB2b2lkCj4gLWludmFsaWRfbHV0X3NpemVzKGRhdGFfdCAqZGF0YSkKPiAtewo+IC0J aWd0X3BpcGVfdCAqcGlwZSA9ICZkYXRhLT5kaXNwbGF5LnBpcGVzWzBdOwo+IC0Jc2l6ZV90IGRl Z2FtbWFfbHV0X3NpemUgPSBkYXRhLT5kZWdhbW1hX2x1dF9zaXplICogc2l6ZW9mKHN0cnVjdCBf ZHJtX2NvbG9yX2x1dCk7Cj4gLQlzaXplX3QgZ2FtbWFfbHV0X3NpemUgPSBkYXRhLT5nYW1tYV9s dXRfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgX2RybV9jb2xvcl9sdXQpOwo+IC0KPiAtCXN0cnVjdCBf ZHJtX2NvbG9yX2x1dCAqZGVnYW1tYV9sdXQgPSBtYWxsb2MoZGF0YS0+ZGVnYW1tYV9sdXRfc2l6 ZSAqIHNpemVvZihzdHJ1Y3QgX2RybV9jb2xvcl9sdXQpICogMik7Cj4gLQlzdHJ1Y3QgX2RybV9j b2xvcl9sdXQgKmdhbW1hX2x1dCA9IG1hbGxvYyhkYXRhLT5nYW1tYV9sdXRfc2l6ZSAqIHNpemVv ZihzdHJ1Y3QgX2RybV9jb2xvcl9sdXQpICogMik7Cj4gLQo+IC0JaWd0X2Fzc2VydF9lcShwaXBl X3NldF9wcm9wZXJ0eV9ibG9iKHBpcGUsICJERUdBTU1BX0xVVCIsCj4gLQkJCQkJICAgICBkZWdh bW1hX2x1dCwgMSksIC1FSU5WQUwpOwo+IC0JaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0 eV9ibG9iKHBpcGUsICJERUdBTU1BX0xVVCIsCj4gLQkJCQkJICAgICBkZWdhbW1hX2x1dCwgZGVn YW1tYV9sdXRfc2l6ZSArIDEpLAo+IC0JCSAgICAgIC1FSU5WQUwpOwo+IC0JaWd0X2Fzc2VydF9l cShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iKHBpcGUsICJERUdBTU1BX0xVVCIsCj4gLQkJCQkJICAg ICBkZWdhbW1hX2x1dCwgZGVnYW1tYV9sdXRfc2l6ZSAtIDEpLAo+IC0JCSAgICAgIC1FSU5WQUwp Owo+IC0JaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iKHBpcGUsICJERUdBTU1B X0xVVCIsCj4gLQkJCQkJICAgICBkZWdhbW1hX2x1dCwgZGVnYW1tYV9sdXRfc2l6ZSArIHNpemVv ZihzdHJ1Y3QgX2RybV9jb2xvcl9sdXQpKSwKPiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCWlndF9h c3NlcnRfZXEocGlwZV9zZXRfcHJvcGVydHlfYmxvYl9pZChwaXBlLCAiREVHQU1NQV9MVVQiLCBw aXBlLT5jcnRjX2lkKSwKPiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCWlndF9hc3NlcnRfZXEocGlw ZV9zZXRfcHJvcGVydHlfYmxvYl9pZChwaXBlLCAiREVHQU1NQV9MVVQiLCA0MDk2ICogNDA5Niks Cj4gLQkJICAgICAgLUVJTlZBTCk7Cj4gLQo+IC0JaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9w ZXJ0eV9ibG9iKHBpcGUsICJHQU1NQV9MVVQiLAo+IC0JCQkJCSAgICAgZ2FtbWFfbHV0LCAxKSwK PiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCWlndF9hc3NlcnRfZXEocGlwZV9zZXRfcHJvcGVydHlf YmxvYihwaXBlLCAiR0FNTUFfTFVUIiwKPiAtCQkJCQkgICAgIGdhbW1hX2x1dCwgZ2FtbWFfbHV0 X3NpemUgKyAxKSwKPiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCWlndF9hc3NlcnRfZXEocGlwZV9z ZXRfcHJvcGVydHlfYmxvYihwaXBlLCAiR0FNTUFfTFVUIiwKPiAtCQkJCQkgICAgIGdhbW1hX2x1 dCwgZ2FtbWFfbHV0X3NpemUgLSAxKSwKPiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCWlndF9hc3Nl cnRfZXEocGlwZV9zZXRfcHJvcGVydHlfYmxvYihwaXBlLCAiR0FNTUFfTFVUIiwKPiAtCQkJCQkg ICAgIGdhbW1hX2x1dCwgZ2FtbWFfbHV0X3NpemUgKyBzaXplb2Yoc3RydWN0IF9kcm1fY29sb3Jf bHV0KSksCj4gLQkJICAgICAgLUVJTlZBTCk7Cj4gLQlpZ3RfYXNzZXJ0X2VxKHBpcGVfc2V0X3By b3BlcnR5X2Jsb2JfaWQocGlwZSwgIkdBTU1BX0xVVCIsIHBpcGUtPmNydGNfaWQpLAo+IC0JCSAg ICAgIC1FSU5WQUwpOwo+IC0JaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iX2lk KHBpcGUsICJHQU1NQV9MVVQiLCA0MDk2ICogNDA5NiksCj4gLQkJICAgICAgLUVJTlZBTCk7Cj4g LQo+IC0JZnJlZShkZWdhbW1hX2x1dCk7Cj4gLQlmcmVlKGdhbW1hX2x1dCk7Cj4gLX0KPiAtCj4g LXN0YXRpYyB2b2lkCj4gLWludmFsaWRfY3RtX21hdHJpeF9zaXplcyhkYXRhX3QgKmRhdGEpCj4g LXsKPiAtCWlndF9waXBlX3QgKnBpcGUgPSAmZGF0YS0+ZGlzcGxheS5waXBlc1swXTsKPiAtCXZv aWQgKnB0ciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfY3RtKSAqIDQpOwo+IC0K PiAtCWlndF9hc3NlcnRfZXEocGlwZV9zZXRfcHJvcGVydHlfYmxvYihwaXBlLCAiQ1RNIiwgcHRy LCAxKSwKPiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCWlndF9hc3NlcnRfZXEocGlwZV9zZXRfcHJv cGVydHlfYmxvYihwaXBlLCAiQ1RNIiwgcHRyLAo+IC0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBf ZHJtX2NvbG9yX2N0bSkgKyAxKSwKPiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCWlndF9hc3NlcnRf ZXEocGlwZV9zZXRfcHJvcGVydHlfYmxvYihwaXBlLCAiQ1RNIiwgcHRyLAo+IC0JCQkJCSAgICAg c2l6ZW9mKHN0cnVjdCBfZHJtX2NvbG9yX2N0bSkgLSAxKSwKPiAtCQkgICAgICAtRUlOVkFMKTsK PiAtCWlndF9hc3NlcnRfZXEocGlwZV9zZXRfcHJvcGVydHlfYmxvYihwaXBlLCAiQ1RNIiwgcHRy LAo+IC0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBfZHJtX2NvbG9yX2N0bSkgKiAyKSwKPiAtCQkg ICAgICAtRUlOVkFMKTsKPiAtCWlndF9hc3NlcnRfZXEocGlwZV9zZXRfcHJvcGVydHlfYmxvYl9p ZChwaXBlLCAiQ1RNIiwgcGlwZS0+Y3J0Y19pZCksCj4gLQkJICAgICAgLUVJTlZBTCk7Cj4gLQlp Z3RfYXNzZXJ0X2VxKHBpcGVfc2V0X3Byb3BlcnR5X2Jsb2JfaWQocGlwZSwgIkNUTSIsIDQwOTYg KiA0MDk2KSwKPiAtCQkgICAgICAtRUlOVkFMKTsKPiAtCj4gLQlmcmVlKHB0cik7Cj4gLX0KPiAt Cj4gLWlndF9tYWluCj4gLXsKPiAtCWRhdGFfdCBkYXRhID0ge307Cj4gLQo+IC0JaWd0X3NraXBf b25fc2ltdWxhdGlvbigpOwo+IC0KPiAtCWlndF9maXh0dXJlIHsKPiAtCQlkYXRhLmRybV9mZCA9 IGRybV9vcGVuX2RyaXZlcl9tYXN0ZXIoRFJJVkVSX0lOVEVMKTsKPiAtCQlkYXRhLmRldmlkID0g aW50ZWxfZ2V0X2RybV9kZXZpZChkYXRhLmRybV9mZCk7Cj4gLQkJa21zdGVzdF9zZXRfdnRfZ3Jh cGhpY3NfbW9kZSgpOwo+IC0KPiAtCQlpZ3RfZGlzcGxheV9pbml0KCZkYXRhLmRpc3BsYXksIGRh dGEuZHJtX2ZkKTsKPiAtCX0KPiAtCj4gLQlmb3IgKGludCBwaXBlID0gMDsgcGlwZSA8IEk5MTVf TUFYX1BJUEVTOyBwaXBlKyspCj4gLQkJcnVuX3Rlc3RzX2Zvcl9waXBlKCZkYXRhLCBwaXBlKTsK PiAtCj4gLQlpZ3Rfc3VidGVzdF9mKCJpbnZhbGlkLWx1dC1zaXplcyIpCj4gLQkJaW52YWxpZF9s dXRfc2l6ZXMoJmRhdGEpOwo+IC0KPiAtCWlndF9zdWJ0ZXN0X2YoImludmFsaWQtY3RtLW1hdHJp eC1zaXplcyIpCj4gLQkJaW52YWxpZF9jdG1fbWF0cml4X3NpemVzKCZkYXRhKTsKPiAtCj4gLQlp Z3RfZml4dHVyZSB7Cj4gLQkJaWd0X2Rpc3BsYXlfZmluaSgmZGF0YS5kaXNwbGF5KTsKPiAtCX0K PiAtfQo+IGRpZmYgLS1naXQgYS90ZXN0cy9rbXNfcGlwZV9jb2xvcl9iYXNpYy5jIGIvdGVzdHMv a21zX3BpcGVfY29sb3JfYmFzaWMuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAw MDAwMC4uOWY3YWM3ZQo+IC0tLSAvZGV2L251bGwKPiArKysgYi90ZXN0cy9rbXNfcGlwZV9jb2xv cl9iYXNpYy5jCj4gQEAgLTAsMCArMSwxMTg0IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCDCqSAy MDE1IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBj b3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAo dGhlICJTb2Z0d2FyZSIpLAo+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJl c3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCj4gKyAqIHRoZSByaWdodHMg dG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNl bnNlLAo+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKPiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRv IHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiArICoKPiArICogVGhl IGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1 ZGluZyB0aGUgbmV4dAo+ICsgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBj b3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCj4gKyAqIFNvZnR3YXJlLgo+ICsg Kgo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiArICogRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5P IEVWRU5UIFNIQUxMCj4gKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJ QUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5H Cj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9S IFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKgo+ ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxtYXRoLmg+Cj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4KPiAr Cj4gKyNpbmNsdWRlICJkcm0uaCIKPiArI2luY2x1ZGUgImRybXRlc3QuaCIKPiArI2luY2x1ZGUg ImlndC5oIgo+ICsKPiArSUdUX1RFU1RfREVTQ1JJUFRJT04oIlRlc3QgQ29sb3IgRmVhdHVyZXMg YXQgUGlwZSBsZXZlbCIpOwo+ICsKPiArLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBnYW1tYS9kZWdh bW1hIHJhbXBzICYgY3RtIG1hdHJpeC4gKi8KPiArc3RydWN0IF9kcm1fY29sb3JfY3RtIHsKPiAr CS8qIFRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpbiBTMzEuMzIgZm9ybWF0LiAqLwo+ICsJX19zNjQg bWF0cml4WzldOwo+ICt9Owo+ICsKPiArc3RydWN0IF9kcm1fY29sb3JfbHV0IHsKPiArCS8qCj4g KwkgKiBEYXRhIGlzIFUwLjE2IGZpeGVkIHBvaW50IGZvcm1hdC4KPiArCSAqLwo+ICsJX191MTYg cmVkOwo+ICsJX191MTYgZ3JlZW47Cj4gKwlfX3UxNiBibHVlOwo+ICsJX191MTYgcmVzZXJ2ZWQ7 Cj4gK307Cj4gKwo+ICsvKiBJbnRlcm5hbCAqLwo+ICt0eXBlZGVmIHN0cnVjdCB7Cj4gKwlkb3Vi bGUgciwgZywgYjsKPiArfSBjb2xvcl90Owo+ICsKPiArdHlwZWRlZiBzdHJ1Y3Qgewo+ICsJaW50 IGRybV9mZDsKPiArCXVpbnQzMl90IGRldmlkOwo+ICsJaWd0X2Rpc3BsYXlfdCBkaXNwbGF5Owo+ ICsJaWd0X3BpcGVfY3JjX3QgKnBpcGVfY3JjOwo+ICsKPiArCXVpbnQzMl90IGNvbG9yX2RlcHRo Owo+ICsJdWludDY0X3QgZGVnYW1tYV9sdXRfc2l6ZTsKPiArCXVpbnQ2NF90IGdhbW1hX2x1dF9z aXplOwo+ICt9IGRhdGFfdDsKPiArCj4gKwo+ICtzdGF0aWMgdm9pZCBwYWludF9ncmFkaWVudF9y ZWN0YW5nbGVzKGRhdGFfdCAqZGF0YSwKPiArCQkJCSAgICAgIGRybU1vZGVNb2RlSW5mbyAqbW9k ZSwKPiArCQkJCSAgICAgIGNvbG9yX3QgKmNvbG9ycywKPiArCQkJCSAgICAgIHN0cnVjdCBpZ3Rf ZmIgKmZiKQo+ICt7Cj4gKwljYWlyb190ICpjciA9IGlndF9nZXRfY2Fpcm9fY3R4KGRhdGEtPmRy bV9mZCwgZmIpOwo+ICsJaW50IGksIGwgPSBtb2RlLT5oZGlzcGxheSAvIDM7Cj4gKwo+ICsJLyog UGFpbnQgMyBncmFkaWVudCByZWN0YW5nbGVzIHdpdGggcmVkL2dyZWVuL2JsdWUgYmV0d2VlbiAx LjAgYW5kCj4gKwkgKiAwLjUuIFdlIHdhbnQgdG8gYXZvaWQgMCBzbyBlYWNoIG1heCBMVVRzIG9u bHkgYWZmZWN0IHRoZWlyIG93bgo+ICsJICogcmVjdGFuZ2xlLgo+ICsJICovCj4gKwlmb3IgKGkg PSAwIDsgaSA8IDM7IGkrKykgewo+ICsJCWlndF9wYWludF9jb2xvcl9ncmFkaWVudF9yYW5nZShj ciwgaSAqIGwsIDAsIGwsIG1vZGUtPnZkaXNwbGF5LAo+ICsJCQkJCSAgICAgICBjb2xvcnNbaV0u ciAhPSAwID8gMC4yIDogMCwKPiArCQkJCQkgICAgICAgY29sb3JzW2ldLmcgIT0gMCA/IDAuMiA6 IDAsCj4gKwkJCQkJICAgICAgIGNvbG9yc1tpXS5iICE9IDAgPyAwLjIgOiAwLAo+ICsJCQkJCSAg ICAgICBjb2xvcnNbaV0uciwKPiArCQkJCQkgICAgICAgY29sb3JzW2ldLmcsCj4gKwkJCQkJICAg ICAgIGNvbG9yc1tpXS5iKTsKPiArCX0KPiArCj4gKwljYWlyb19kZXN0cm95KGNyKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgcGFpbnRfcmVjdGFuZ2xlcyhkYXRhX3QgKmRhdGEsCj4gKwkJCSAg ICAgZHJtTW9kZU1vZGVJbmZvICptb2RlLAo+ICsJCQkgICAgIGNvbG9yX3QgKmNvbG9ycywKPiAr CQkJICAgICBzdHJ1Y3QgaWd0X2ZiICpmYikKPiArewo+ICsJY2Fpcm9fdCAqY3IgPSBpZ3RfZ2V0 X2NhaXJvX2N0eChkYXRhLT5kcm1fZmQsIGZiKTsKPiArCWludCBpLCBsID0gbW9kZS0+aGRpc3Bs YXkgLyAzOwo+ICsKPiArCS8qIFBhaW50IDMgc29saWQgcmVjdGFuZ2xlcy4gKi8KPiArCWZvciAo aSA9IDAgOyBpIDwgMzsgaSsrKSB7Cj4gKwkJaWd0X3BhaW50X2NvbG9yKGNyLCBpICogbCwgMCwg bCwgbW9kZS0+dmRpc3BsYXksCj4gKwkJCQljb2xvcnNbaV0uciwgY29sb3JzW2ldLmcsIGNvbG9y c1tpXS5iKTsKPiArCX0KPiArCj4gKwljYWlyb19kZXN0cm95KGNyKTsKPiArfQo+ICsKPiArc3Rh dGljIGRvdWJsZSAqZ2VuZXJhdGVfdGFibGUodWludDMyX3QgbHV0X3NpemUsIGRvdWJsZSBleHAp Cj4gK3sKPiArCWRvdWJsZSAqY29lZmZzID0gbWFsbG9jKHNpemVvZihkb3VibGUpICogbHV0X3Np emUpOwo+ICsJdWludDMyX3QgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbHV0X3NpemU7IGkr KykKPiArCQljb2VmZnNbaV0gPSBwb3dmKChkb3VibGUpIGkgKiAxLjAgLyAoZG91YmxlKSAobHV0 X3NpemUgLSAxKSwgZXhwKTsKPiArCj4gKwlyZXR1cm4gY29lZmZzOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgZG91YmxlICpnZW5lcmF0ZV90YWJsZV9tYXgodWludDMyX3QgbHV0X3NpemUpCj4gK3sKPiAr CWRvdWJsZSAqY29lZmZzID0gbWFsbG9jKHNpemVvZihkb3VibGUpICogbHV0X3NpemUpOwo+ICsJ dWludDMyX3QgaTsKPiArCj4gKwljb2VmZnNbMF0gPSAwLjA7Cj4gKwlmb3IgKGkgPSAxOyBpIDwg bHV0X3NpemU7IGkrKykKPiArCQljb2VmZnNbaV0gPSAxLjA7Cj4gKwo+ICsJcmV0dXJuIGNvZWZm czsKPiArfQo+ICsKPiArc3RhdGljIGRvdWJsZSAqZ2VuZXJhdGVfdGFibGVfemVybyh1aW50MzJf dCBsdXRfc2l6ZSkKPiArewo+ICsJZG91YmxlICpjb2VmZnMgPSBtYWxsb2Moc2l6ZW9mKGRvdWJs ZSkgKiBsdXRfc2l6ZSk7Cj4gKwl1aW50MzJfdCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBs dXRfc2l6ZTsgaSsrKQo+ICsJCWNvZWZmc1tpXSA9IDAuMDsKPiArCj4gKwlyZXR1cm4gY29lZmZz Owo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IF9kcm1fY29sb3JfbHV0ICpjb2VmZnNfdG9fbHV0 KGRhdGFfdCAqZGF0YSwKPiArCQkJCQkgICAgY29uc3QgZG91YmxlICpjb2VmZmljaWVudHMsCj4g KwkJCQkJICAgIHVpbnQzMl90IGx1dF9zaXplLAo+ICsJCQkJCSAgICB1aW50MzJfdCBjb2xvcl9k ZXB0aCwKPiArCQkJCQkgICAgaW50IG9mZikKPiArewo+ICsJc3RydWN0IF9kcm1fY29sb3JfbHV0 ICpsdXQ7Cj4gKwl1aW50MzJfdCBpOwo+ICsJdWludDMyX3QgbWF4X3ZhbHVlID0gKDEgPDwgMTYp IC0gMTsKPiArCXVpbnQzMl90IG1hc2sgPSAoKDEgPDwgY29sb3JfZGVwdGgpIC0gMSkgPDwgODsK PiArCj4gKwlsdXQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBfZHJtX2NvbG9yX2x1dCkgKiBsdXRf c2l6ZSk7Cj4gKwo+ICsJaWYgKElTX0NIRVJSWVZJRVcoZGF0YS0+ZGV2aWQpKQo+ICsJCWx1dF9z aXplIC09IDE7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgbHV0X3NpemU7IGkrKykgewo+ICsJCXVpbnQz Ml90IHYgPSAoY29lZmZpY2llbnRzW2ldICogbWF4X3ZhbHVlKTsKPiArCj4gKwkJLyoKPiArCQkg KiBIYXJkd2FyZSBtaWdodCBlbmNvZGUgY29sb3JzIG9uIGEgZGlmZmVyZW50IG51bWJlciBvZiBi aXRzCj4gKwkJICogdGhhbiB3aGF0IGlzIGluIG91ciBmcmFtZWJ1ZmZlciAoMTAgb3IgMTJiaXRz IGZvciBleGFtcGxlKS4KPiArCQkgKiBNYXNrIHRoZSBsb3dlciBiaXRzIG5vdCBwcm92aWRlZCBi eSB0aGUgZnJhbWVidWZmZXIgc28gd2UKPiArCQkgKiBjYW4gZG8gQ1JDIGNvbXBhcmlzb25zLgo+ ICsJCSAqLwo+ICsJCXYgJj0gbWFzazsKPiArCj4gKwkJbHV0W2ldLnJlZCA9IHY7Cj4gKwkJbHV0 W2ldLmdyZWVuID0gdjsKPiArCQlsdXRbaV0uYmx1ZSA9IHY7Cj4gKwl9Cj4gKwo+ICsJaWYgKElT X0NIRVJSWVZJRVcoZGF0YS0+ZGV2aWQpKQo+ICsJCWx1dFtsdXRfc2l6ZV0ucmVkID0KPiArCQkJ bHV0W2x1dF9zaXplXS5ncmVlbiA9Cj4gKwkJCWx1dFtsdXRfc2l6ZV0uYmx1ZSA9IGx1dFtsdXRf c2l6ZSAtIDFdLnJlZDsKPiArCj4gKwlyZXR1cm4gbHV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBzZXRfZGVnYW1tYShkYXRhX3QgKmRhdGEsCj4gKwkJCWlndF9waXBlX3QgKnBpcGUsCj4gKwkJ CWNvbnN0IGRvdWJsZSAqY29lZmZpY2llbnRzKQo+ICt7Cj4gKwlzaXplX3Qgc2l6ZSA9IHNpemVv ZihzdHJ1Y3QgX2RybV9jb2xvcl9sdXQpICogZGF0YS0+ZGVnYW1tYV9sdXRfc2l6ZTsKPiArCXN0 cnVjdCBfZHJtX2NvbG9yX2x1dCAqbHV0ID0gY29lZmZzX3RvX2x1dChkYXRhLAo+ICsJCQkJCQkg ICBjb2VmZmljaWVudHMsCj4gKwkJCQkJCSAgIGRhdGEtPmRlZ2FtbWFfbHV0X3NpemUsCj4gKwkJ CQkJCSAgIGRhdGEtPmNvbG9yX2RlcHRoLCAwKTsKPiArCj4gKwlpZ3RfcGlwZV9zZXRfZGVnYW1t YV9sdXQocGlwZSwgbHV0LCBzaXplKTsKPiArCj4gKwlmcmVlKGx1dCk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIHNldF9nYW1tYShkYXRhX3QgKmRhdGEsCj4gKwkJICAgICAgaWd0X3BpcGVfdCAq cGlwZSwKPiArCQkgICAgICBjb25zdCBkb3VibGUgKmNvZWZmaWNpZW50cykKPiArewo+ICsJc2l6 ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfbHV0KSAqIGRhdGEtPmdhbW1hX2x1 dF9zaXplOwo+ICsJc3RydWN0IF9kcm1fY29sb3JfbHV0ICpsdXQgPSBjb2VmZnNfdG9fbHV0KGRh dGEsCj4gKwkJCQkJCSAgIGNvZWZmaWNpZW50cywKPiArCQkJCQkJICAgZGF0YS0+Z2FtbWFfbHV0 X3NpemUsCj4gKwkJCQkJCSAgIGRhdGEtPmNvbG9yX2RlcHRoLCAwKTsKPiArCj4gKwlpZ3RfcGlw ZV9zZXRfZ2FtbWFfbHV0KHBpcGUsIGx1dCwgc2l6ZSk7Cj4gKwo+ICsJZnJlZShsdXQpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBzZXRfY3RtKGlndF9waXBlX3QgKnBpcGUsIGNvbnN0IGRvdWJs ZSAqY29lZmZpY2llbnRzKQo+ICt7Cj4gKwlzdHJ1Y3QgX2RybV9jb2xvcl9jdG0gY3RtOwo+ICsJ aW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3RtLm1hdHJpeCk7IGkr Kykgewo+ICsJCWlmIChjb2VmZmljaWVudHNbaV0gPCAwKSB7Cj4gKwkJCWN0bS5tYXRyaXhbaV0g PQo+ICsJCQkJKGludDY0X3QpICgtY29lZmZpY2llbnRzW2ldICogKChpbnQ2NF90KSAxTCA8PCAz MikpOwo+ICsJCQljdG0ubWF0cml4W2ldIHw9IDFVTEwgPDwgNjM7Cj4gKwkJfSBlbHNlCj4gKwkJ CWN0bS5tYXRyaXhbaV0gPQo+ICsJCQkJKGludDY0X3QpIChjb2VmZmljaWVudHNbaV0gKiAoKGlu dDY0X3QpIDFMIDw8IDMyKSk7Cj4gKwl9Cj4gKwo+ICsJaWd0X3BpcGVfc2V0X2N0bV9tYXRyaXgo cGlwZSwgJmN0bSwgc2l6ZW9mKGN0bSkpOwo+ICt9Cj4gKwo+ICsjZGVmaW5lIGRpc2FibGVfZGVn YW1tYShwaXBlKSBpZ3RfcGlwZV9zZXRfZGVnYW1tYV9sdXQocGlwZSwgTlVMTCwgMCkKPiArI2Rl ZmluZSBkaXNhYmxlX2dhbW1hKHBpcGUpIGlndF9waXBlX3NldF9nYW1tYV9sdXQocGlwZSwgTlVM TCwgMCkKPiArI2RlZmluZSBkaXNhYmxlX2N0bShwaXBlKSBpZ3RfcGlwZV9zZXRfY3RtX21hdHJp eChwaXBlLCBOVUxMLCAwKQo+ICsKPiArc3RhdGljIHZvaWQgb3V0cHV0X3NldF9wcm9wZXJ0eV9l bnVtKGlndF9vdXRwdXRfdCAqb3V0cHV0LAo+ICsJCQkJICAgICBjb25zdCBjaGFyICpwcm9wZXJ0 eSwKPiArCQkJCSAgICAgY29uc3QgY2hhciAqZW51bV92YWx1ZSkKPiArewo+ICsJaW50IGk7Cj4g KwlpbnQzMl90IHZhbHVlID0gLTE7Cj4gKwl1aW50MzJfdCBwcm9wX2lkOwo+ICsJZHJtTW9kZVBy b3BlcnR5UHRyIHByb3A7Cj4gKwo+ICsJaWYgKCFrbXN0ZXN0X2dldF9wcm9wZXJ0eShvdXRwdXQt PmRpc3BsYXktPmRybV9mZCwKPiArCQkJCSAgb3V0cHV0LT5pZCwKPiArCQkJCSAgRFJNX01PREVf T0JKRUNUX0NPTk5FQ1RPUiwKPiArCQkJCSAgcHJvcGVydHksCj4gKwkJCQkgICZwcm9wX2lkLCBO VUxMLCAmcHJvcCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWlndF9hc3NlcnQocHJvcC0+ZmxhZ3Mg JiBEUk1fTU9ERV9QUk9QX0VOVU0pOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBwcm9wLT5jb3Vu dF9lbnVtczsgaSsrKSB7Cj4gKwkJaWYgKCFzdHJjbXAocHJvcC0+ZW51bXNbaV0ubmFtZSwgZW51 bV92YWx1ZSkpIHsKPiArCQkJdmFsdWUgPSBwcm9wLT5lbnVtc1tpXS52YWx1ZTsKPiArCQkJYnJl YWs7Cj4gKwkJfQo+ICsJfQo+ICsJaWd0X2Fzc2VydF9uZXEodmFsdWUsIC0xKTsKPiArCj4gKwlp Z3RfYXNzZXJ0X2VxKGRybU1vZGVPYmplY3RTZXRQcm9wZXJ0eShvdXRwdXQtPmRpc3BsYXktPmRy bV9mZCwKPiArCQkJCQkgICAgICAgb3V0cHV0LT5pZCwKPiArCQkJCQkgICAgICAgRFJNX01PREVf T0JKRUNUX0NPTk5FQ1RPUiwKPiArCQkJCQkgICAgICAgcHJvcF9pZCwgdmFsdWUpLCAwKTsKPiAr Cj4gKwo+ICsJZHJtTW9kZUZyZWVQcm9wZXJ0eShwcm9wKTsKPiArfQo+ICsKPiArLyoKPiArICog RHJhdyAzIGdyYWRpZW50IHJlY3RhbmdsZXMgaW4gcmVkLCBncmVlbiBhbmQgYmx1ZSwgd2l0aCBh IG1heGVkIG91dAo+ICsgKiBkZWdhbW1hIExVVCBhbmQgdmVyaWZ5IHdlIGhhdmUgdGhlIHNhbWUg Q1JDIGFzIGRyYXdpbmcgc29saWQgY29sb3IKPiArICogcmVjdGFuZ2xlcyB3aXRoIGxpbmVhciBk ZWdhbW1hIExVVC4KPiArICovCj4gK3N0YXRpYyB2b2lkIHRlc3RfcGlwZV9kZWdhbW1hKGRhdGFf dCAqZGF0YSwKPiArCQkJICAgICAgaWd0X3BsYW5lX3QgKnByaW1hcnkpCj4gK3sKPiArCWlndF9v dXRwdXRfdCAqb3V0cHV0Owo+ICsJZG91YmxlICpkZWdhbW1hX2xpbmVhciwgKmRlZ2FtbWFfZnVs bDsKPiArCWRvdWJsZSAqZ2FtbWFfbGluZWFyOwo+ICsJY29sb3JfdCByZWRfZ3JlZW5fYmx1ZVtd ID0gewo+ICsJCXsgMS4wLCAwLjAsIDAuMCB9LAo+ICsJCXsgMC4wLCAxLjAsIDAuMCB9LAo+ICsJ CXsgMC4wLCAwLjAsIDEuMCB9Cj4gKwl9Owo+ICsKPiArCWRlZ2FtbWFfbGluZWFyID0gZ2VuZXJh dGVfdGFibGUoZGF0YS0+ZGVnYW1tYV9sdXRfc2l6ZSwgMS4wKTsKPiArCWRlZ2FtbWFfZnVsbCA9 IGdlbmVyYXRlX3RhYmxlX21heChkYXRhLT5kZWdhbW1hX2x1dF9zaXplKTsKPiArCj4gKwlnYW1t YV9saW5lYXIgPSBnZW5lcmF0ZV90YWJsZShkYXRhLT5nYW1tYV9sdXRfc2l6ZSwgMS4wKTsKPiAr Cj4gKwlmb3JfZWFjaF9jb25uZWN0ZWRfb3V0cHV0KCZkYXRhLT5kaXNwbGF5LCBvdXRwdXQpIHsK PiArCQlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7Cj4gKwkJc3RydWN0IGlndF9mYiBmYl9tb2Rlc2V0 LCBmYjsKPiArCQlpZ3RfY3JjX3QgY3JjX2Z1bGxnYW1tYSwgY3JjX2Z1bGxjb2xvcnM7Cj4gKwkJ aW50IGZiX2lkLCBmYl9tb2Rlc2V0X2lkOwo+ICsKPiArCQlpZ3Rfb3V0cHV0X3NldF9waXBlKG91 dHB1dCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gKwkJbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21v ZGUob3V0cHV0KTsKPiArCj4gKwkJLyogQ3JlYXRlIGEgZnJhbWVidWZmZXIgYXQgdGhlIHNpemUg b2YgdGhlIG91dHB1dC4gKi8KPiArCQlmYl9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2Zk LAo+ICsJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCj4gKwkJCQkgICAgICBtb2RlLT52ZGlzcGxh eSwKPiArCQkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkgICAgICBMT0NBTF9E Uk1fRk9STUFUX01PRF9OT05FLAo+ICsJCQkJICAgICAgJmZiKTsKPiArCQlpZ3RfYXNzZXJ0KGZi X2lkKTsKPiArCj4gKwkJZmJfbW9kZXNldF9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2Zk LAo+ICsJCQkJCSAgICAgIG1vZGUtPmhkaXNwbGF5LAo+ICsJCQkJCSAgICAgIG1vZGUtPnZkaXNw bGF5LAo+ICsJCQkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkJICAgICAgTE9D QUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiArCQkJCQkgICAgICAmZmJfbW9kZXNldCk7Cj4gKwkJ aWd0X2Fzc2VydChmYl9tb2Rlc2V0X2lkKTsKPiArCj4gKwkJaWd0X3BsYW5lX3NldF9mYihwcmlt YXJ5LCAmZmJfbW9kZXNldCk7Cj4gKwkJZGlzYWJsZV9jdG0ocHJpbWFyeS0+cGlwZSk7Cj4gKwkJ ZGlzYWJsZV9kZWdhbW1hKHByaW1hcnktPnBpcGUpOwo+ICsJCXNldF9nYW1tYShkYXRhLCBwcmlt YXJ5LT5waXBlLCBnYW1tYV9saW5lYXIpOwo+ICsJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ ZGlzcGxheSk7Cj4gKwo+ICsJCS8qIERyYXcgc29saWQgY29sb3JzIHdpdGggbm8gZGVnYW1tYSB0 cmFuc2Zvcm1hdGlvbi4gKi8KPiArCQlwYWludF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9n cmVlbl9ibHVlLCAmZmIpOwo+ICsJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiKTsKPiAr CQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+ICsJCWlndF93YWl0X2Zvcl92 YmxhbmsoZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBlLT5waXBlKTsKPiArCQlpZ3RfcGlwZV9j cmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMsICZjcmNfZnVsbGNvbG9ycyk7Cj4gKwo+ICsJ CS8qIERyYXcgYSBncmFkaWVudCB3aXRoIGRlZ2FtbWEgTFVUIHRvIHJlbWFwIGFsbAo+ICsJCSAq IHZhbHVlcyB0byBtYXggcmVkL2dyZWVuL2JsdWUuCj4gKwkJICovCj4gKwkJcGFpbnRfZ3JhZGll bnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2RlLCByZWRfZ3JlZW5fYmx1ZSwgJmZiKTsKPiArCQlpZ3Rf cGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7Cj4gKwkJc2V0X2RlZ2FtbWEoZGF0YSwgcHJpbWFy eS0+cGlwZSwgZGVnYW1tYV9mdWxsKTsKPiArCQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRp c3BsYXkpOwo+ICsJCWlndF93YWl0X2Zvcl92YmxhbmsoZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5w aXBlLT5waXBlKTsKPiArCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMs ICZjcmNfZnVsbGdhbW1hKTsKPiArCj4gKwkJLyogVmVyaWZ5IHRoYXQgdGhlIENSQyBvZiB0aGUg c29mdHdhcmUgY29tcHV0ZWQgb3V0cHV0IGlzCj4gKwkJICogZXF1YWwgdG8gdGhlIENSQyBvZiB0 aGUgZGVnYW1tYSBMVVQgdHJhbnNmb3JtYXRpb24gb3V0cHV0Lgo+ICsJCSAqLwo+ICsJCWlndF9h c3NlcnRfY3JjX2VxdWFsKCZjcmNfZnVsbGdhbW1hLCAmY3JjX2Z1bGxjb2xvcnMpOwo+ICsKPiAr CQlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgUElQRV9BTlkpOwo+ICsJfQo+ICsKPiArCWZy ZWUoZGVnYW1tYV9saW5lYXIpOwo+ICsJZnJlZShkZWdhbW1hX2Z1bGwpOwo+ICsJZnJlZShnYW1t YV9saW5lYXIpOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBEcmF3IDMgZ3JhZGllbnQgcmVjdGFuZ2xl cyBpbiByZWQsIGdyZWVuIGFuZCBibHVlLCB3aXRoIGEgbWF4ZWQgb3V0IGdhbW1hCj4gKyAqIExV VCBhbmQgdmVyaWZ5IHdlIGhhdmUgdGhlIHNhbWUgQ1JDIGFzIGRyYXdpbmcgc29saWQgY29sb3Ig cmVjdGFuZ2xlcy4KPiArICovCj4gK3N0YXRpYyB2b2lkIHRlc3RfcGlwZV9nYW1tYShkYXRhX3Qg KmRhdGEsCj4gKwkJCSAgICBpZ3RfcGxhbmVfdCAqcHJpbWFyeSkKPiArewo+ICsJaWd0X291dHB1 dF90ICpvdXRwdXQ7Cj4gKwlkb3VibGUgKmdhbW1hX2Z1bGw7Cj4gKwljb2xvcl90IHJlZF9ncmVl bl9ibHVlW10gPSB7Cj4gKwkJeyAxLjAsIDAuMCwgMC4wIH0sCj4gKwkJeyAwLjAsIDEuMCwgMC4w IH0sCj4gKwkJeyAwLjAsIDAuMCwgMS4wIH0KPiArCX07Cj4gKwo+ICsJZ2FtbWFfZnVsbCA9IGdl bmVyYXRlX3RhYmxlX21heChkYXRhLT5nYW1tYV9sdXRfc2l6ZSk7Cj4gKwo+ICsJZm9yX2VhY2hf Y29ubmVjdGVkX291dHB1dCgmZGF0YS0+ZGlzcGxheSwgb3V0cHV0KSB7Cj4gKwkJZHJtTW9kZU1v ZGVJbmZvICptb2RlOwo+ICsJCXN0cnVjdCBpZ3RfZmIgZmJfbW9kZXNldCwgZmI7Cj4gKwkJaWd0 X2NyY190IGNyY19mdWxsZ2FtbWEsIGNyY19mdWxsY29sb3JzOwo+ICsJCWludCBmYl9pZCwgZmJf bW9kZXNldF9pZDsKPiArCj4gKwkJaWd0X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIHByaW1hcnkt PnBpcGUtPnBpcGUpOwo+ICsJCW1vZGUgPSBpZ3Rfb3V0cHV0X2dldF9tb2RlKG91dHB1dCk7Cj4g Kwo+ICsJCS8qIENyZWF0ZSBhIGZyYW1lYnVmZmVyIGF0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQu ICovCj4gKwkJZmJfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKPiArCQkJCSAgICAg IG1vZGUtPmhkaXNwbGF5LAo+ICsJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCj4gKwkJCQkgICAg ICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ICsJCQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0Rf Tk9ORSwKPiArCQkJCSAgICAgICZmYik7Cj4gKwkJaWd0X2Fzc2VydChmYl9pZCk7Cj4gKwo+ICsJ CWZiX21vZGVzZXRfaWQgPSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKPiArCQkJCQkgICAg ICBtb2RlLT5oZGlzcGxheSwKPiArCQkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKPiArCQkJCQkg ICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ICsJCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRf TU9EX05PTkUsCj4gKwkJCQkJICAgICAgJmZiX21vZGVzZXQpOwo+ICsJCWlndF9hc3NlcnQoZmJf bW9kZXNldF9pZCk7Cj4gKwo+ICsJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiX21vZGVz ZXQpOwo+ICsJCWRpc2FibGVfY3RtKHByaW1hcnktPnBpcGUpOwo+ICsJCWRpc2FibGVfZGVnYW1t YShwcmltYXJ5LT5waXBlKTsKPiArCQlzZXRfZ2FtbWEoZGF0YSwgcHJpbWFyeS0+cGlwZSwgZ2Ft bWFfZnVsbCk7Cj4gKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiArCj4g KwkJLyogRHJhdyBzb2xpZCBjb2xvcnMgd2l0aCBubyBnYW1tYSB0cmFuc2Zvcm1hdGlvbi4gKi8K PiArCQlwYWludF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlLCAmZmIpOwo+ ICsJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiKTsKPiArCQlpZ3RfZGlzcGxheV9jb21t aXQoJmRhdGEtPmRpc3BsYXkpOwo+ICsJCWlndF93YWl0X2Zvcl92YmxhbmsoZGF0YS0+ZHJtX2Zk LCBwcmltYXJ5LT5waXBlLT5waXBlKTsKPiArCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0 YS0+cGlwZV9jcmMsICZjcmNfZnVsbGNvbG9ycyk7Cj4gKwo+ICsJCS8qIERyYXcgYSBncmFkaWVu dCB3aXRoIGdhbW1hIExVVCB0byByZW1hcCBhbGwgdmFsdWVzCj4gKwkJICogdG8gbWF4IHJlZC9n cmVlbi9ibHVlLgo+ICsJCSAqLwo+ICsJCXBhaW50X2dyYWRpZW50X3JlY3RhbmdsZXMoZGF0YSwg bW9kZSwgcmVkX2dyZWVuX2JsdWUsICZmYik7Cj4gKwkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5 LCAmZmIpOwo+ICsJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7Cj4gKwkJaWd0 X3dhaXRfZm9yX3ZibGFuayhkYXRhLT5kcm1fZmQsIHByaW1hcnktPnBpcGUtPnBpcGUpOwo+ICsJ CWlndF9waXBlX2NyY19jb2xsZWN0X2NyYyhkYXRhLT5waXBlX2NyYywgJmNyY19mdWxsZ2FtbWEp Owo+ICsKPiArCQkvKiBWZXJpZnkgdGhhdCB0aGUgQ1JDIG9mIHRoZSBzb2Z0d2FyZSBjb21wdXRl ZCBvdXRwdXQgaXMKPiArCQkgKiBlcXVhbCB0byB0aGUgQ1JDIG9mIHRoZSBnYW1tYSBMVVQgdHJh bnNmb3JtYXRpb24gb3V0cHV0Lgo+ICsJCSAqLwo+ICsJCWlndF9hc3NlcnRfY3JjX2VxdWFsKCZj cmNfZnVsbGdhbW1hLCAmY3JjX2Z1bGxjb2xvcnMpOwo+ICsKPiArCQlpZ3Rfb3V0cHV0X3NldF9w aXBlKG91dHB1dCwgUElQRV9BTlkpOwo+ICsJfQo+ICsKPiArCWZyZWUoZ2FtbWFfZnVsbCk7Cj4g K30KPiArCj4gKy8qCj4gKyAqIERyYXcgMyBncmFkaWVudCByZWN0YW5nbGVzIGluIHJlZCwgZ3Jl ZW4gYW5kIGJsdWUsIHdpdGggYSBtYXhlZCBvdXQgbGVnYWN5Cj4gKyAqIGdhbW1hIExVVCBhbmQg dmVyaWZ5IHdlIGhhdmUgdGhlIHNhbWUgQ1JDIGFzIGRyYXdpbmcgc29saWQgY29sb3IgcmVjdGFu Z2xlcwo+ICsgKiB3aXRoIGxpbmVhciBsZWdhY3kgZ2FtbWEgTFVULgo+ICsgKi8KPiArc3RhdGlj IHZvaWQgdGVzdF9waXBlX2xlZ2FjeV9nYW1tYShkYXRhX3QgKmRhdGEsCj4gKwkJCQkgICBpZ3Rf cGxhbmVfdCAqcHJpbWFyeSkKPiArewo+ICsJaWd0X291dHB1dF90ICpvdXRwdXQ7Cj4gKwljb2xv cl90IHJlZF9ncmVlbl9ibHVlW10gPSB7Cj4gKwkJeyAxLjAsIDAuMCwgMC4wIH0sCj4gKwkJeyAw LjAsIDEuMCwgMC4wIH0sCj4gKwkJeyAwLjAsIDAuMCwgMS4wIH0KPiArCX07Cj4gKwlkcm1Nb2Rl Q3J0YyAqa21zX2NydGM7Cj4gKwl1aW50MzJfdCBpLCBsZWdhY3lfbHV0X3NpemU7Cj4gKwl1aW50 MTZfdCAqcmVkX2x1dCwgKmdyZWVuX2x1dCwgKmJsdWVfbHV0Owo+ICsKPiArCWttc19jcnRjID0g ZHJtTW9kZUdldENydGMoZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBlLT5jcnRjX2lkKTsKPiAr CWxlZ2FjeV9sdXRfc2l6ZSA9IGttc19jcnRjLT5nYW1tYV9zaXplOwo+ICsJZHJtTW9kZUZyZWVD cnRjKGttc19jcnRjKTsKPiArCj4gKwlyZWRfbHV0ID0gbWFsbG9jKHNpemVvZih1aW50MTZfdCkg KiBsZWdhY3lfbHV0X3NpemUpOwo+ICsJZ3JlZW5fbHV0ID0gbWFsbG9jKHNpemVvZih1aW50MTZf dCkgKiBsZWdhY3lfbHV0X3NpemUpOwo+ICsJYmx1ZV9sdXQgPSBtYWxsb2Moc2l6ZW9mKHVpbnQx Nl90KSAqIGxlZ2FjeV9sdXRfc2l6ZSk7Cj4gKwo+ICsJZm9yX2VhY2hfY29ubmVjdGVkX291dHB1 dCgmZGF0YS0+ZGlzcGxheSwgb3V0cHV0KSB7Cj4gKwkJZHJtTW9kZU1vZGVJbmZvICptb2RlOwo+ ICsJCXN0cnVjdCBpZ3RfZmIgZmJfbW9kZXNldCwgZmI7Cj4gKwkJaWd0X2NyY190IGNyY19mdWxs Z2FtbWEsIGNyY19mdWxsY29sb3JzOwo+ICsJCWludCBmYl9pZCwgZmJfbW9kZXNldF9pZDsKPiAr Cj4gKwkJaWd0X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIHByaW1hcnktPnBpcGUtPnBpcGUpOwo+ ICsJCW1vZGUgPSBpZ3Rfb3V0cHV0X2dldF9tb2RlKG91dHB1dCk7Cj4gKwo+ICsJCS8qIENyZWF0 ZSBhIGZyYW1lYnVmZmVyIGF0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQuICovCj4gKwkJZmJfaWQg PSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKPiArCQkJCSAgICAgIG1vZGUtPmhkaXNwbGF5 LAo+ICsJCQkJICAgICAgbW9kZS0+dmRpc3BsYXksCj4gKwkJCQkgICAgICBEUk1fRk9STUFUX1hS R0I4ODg4LAo+ICsJCQkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiArCQkJCSAg ICAgICZmYik7Cj4gKwkJaWd0X2Fzc2VydChmYl9pZCk7Cj4gKwo+ICsJCWZiX21vZGVzZXRfaWQg PSBpZ3RfY3JlYXRlX2ZiKGRhdGEtPmRybV9mZCwKPiArCQkJCQkgICAgICBtb2RlLT5oZGlzcGxh eSwKPiArCQkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKPiArCQkJCQkgICAgICBEUk1fRk9STUFU X1hSR0I4ODg4LAo+ICsJCQkJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCj4gKwkJ CQkJICAgICAgJmZiX21vZGVzZXQpOwo+ICsJCWlndF9hc3NlcnQoZmJfbW9kZXNldF9pZCk7Cj4g Kwo+ICsJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiX21vZGVzZXQpOwo+ICsJCWRpc2Fi bGVfZGVnYW1tYShwcmltYXJ5LT5waXBlKTsKPiArCQlkaXNhYmxlX2dhbW1hKHByaW1hcnktPnBp cGUpOwo+ICsJCWRpc2FibGVfY3RtKHByaW1hcnktPnBpcGUpOwo+ICsJCWlndF9kaXNwbGF5X2Nv bW1pdCgmZGF0YS0+ZGlzcGxheSk7Cj4gKwo+ICsJCS8qIERyYXcgc29saWQgY29sb3JzIHdpdGgg bm8gZ2FtbWEgdHJhbnNmb3JtYXRpb24uICovCj4gKwkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBt b2RlLCByZWRfZ3JlZW5fYmx1ZSwgJmZiKTsKPiArCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnks ICZmYik7Cj4gKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiArCQlpZ3Rf d2FpdF9mb3JfdmJsYW5rKGRhdGEtPmRybV9mZCwgcHJpbWFyeS0+cGlwZS0+cGlwZSk7Cj4gKwkJ aWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjX2Z1bGxjb2xvcnMp Owo+ICsKPiArCQkvKiBEcmF3IGEgZ3JhZGllbnQgd2l0aCBnYW1tYSBMVVQgdG8gcmVtYXAgYWxs IHZhbHVlcwo+ICsJCSAqIHRvIG1heCByZWQvZ3JlZW4vYmx1ZS4KPiArCQkgKi8KPiArCQlwYWlu dF9ncmFkaWVudF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUsIHJlZF9ncmVlbl9ibHVlLCAmZmIpOwo+ ICsJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiKTsKPiArCj4gKwkJcmVkX2x1dFswXSA9 IGdyZWVuX2x1dFswXSA9IGJsdWVfbHV0WzBdID0gMDsKPiArCQlmb3IgKGkgPSAxOyBpIDwgbGVn YWN5X2x1dF9zaXplOyBpKyspCj4gKwkJCXJlZF9sdXRbaV0gPSBncmVlbl9sdXRbaV0gPSBibHVl X2x1dFtpXSA9IDB4ZmZmZjsKPiArCQlpZ3RfYXNzZXJ0X2VxKGRybU1vZGVDcnRjU2V0R2FtbWEo ZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBlLT5jcnRjX2lkLAo+ICsJCQkJCQkgIGxlZ2FjeV9s dXRfc2l6ZSwgcmVkX2x1dCwgZ3JlZW5fbHV0LCBibHVlX2x1dCksIDApOwo+ICsJCWlndF9kaXNw bGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7Cj4gKwkJaWd0X3dhaXRfZm9yX3ZibGFuayhkYXRh LT5kcm1fZmQsIHByaW1hcnktPnBpcGUtPnBpcGUpOwo+ICsJCWlndF9waXBlX2NyY19jb2xsZWN0 X2NyYyhkYXRhLT5waXBlX2NyYywgJmNyY19mdWxsZ2FtbWEpOwo+ICsKPiArCQkvKiBWZXJpZnkg dGhhdCB0aGUgQ1JDIG9mIHRoZSBzb2Z0d2FyZSBjb21wdXRlZCBvdXRwdXQgaXMKPiArCQkgKiBl cXVhbCB0byB0aGUgQ1JDIG9mIHRoZSBnYW1tYSBMVVQgdHJhbnNmb3JtYXRpb24gb3V0cHV0Lgo+ ICsJCSAqLwo+ICsJCWlndF9hc3NlcnRfY3JjX2VxdWFsKCZjcmNfZnVsbGdhbW1hLCAmY3JjX2Z1 bGxjb2xvcnMpOwo+ICsKPiArCQkvKiBSZXNldCBvdXRwdXQuICovCj4gKwkJZm9yIChpID0gMTsg aSA8IGxlZ2FjeV9sdXRfc2l6ZTsgaSsrKQo+ICsJCQlyZWRfbHV0W2ldID0gZ3JlZW5fbHV0W2ld ID0gYmx1ZV9sdXRbaV0gPSBpIDw8IDg7Cj4gKwo+ICsJCWlndF9hc3NlcnRfZXEoZHJtTW9kZUNy dGNTZXRHYW1tYShkYXRhLT5kcm1fZmQsIHByaW1hcnktPnBpcGUtPmNydGNfaWQsCj4gKwkJCQkJ CSAgbGVnYWN5X2x1dF9zaXplLCByZWRfbHV0LCBncmVlbl9sdXQsIGJsdWVfbHV0KSwgMCk7Cj4g KwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiArCj4gKwkJaWd0X291dHB1 dF9zZXRfcGlwZShvdXRwdXQsIFBJUEVfQU5ZKTsKPiArCX0KPiArCj4gKwlmcmVlKHJlZF9sdXQp Owo+ICsJZnJlZShncmVlbl9sdXQpOwo+ICsJZnJlZShibHVlX2x1dCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBkcm1Nb2RlUHJvcGVydHlCbG9iUHRyCj4gK2dldF9ibG9iKGRhdGFfdCAqZGF0YSwgaWd0 X3BpcGVfdCAqcGlwZSwgY29uc3QgY2hhciAqcHJvcGVydHlfbmFtZSkKPiArewo+ICsJdWludDY0 X3QgcHJvcF92YWx1ZTsKPiArCWRybU1vZGVQcm9wZXJ0eVB0ciBwcm9wOwo+ICsJZHJtTW9kZVBy b3BlcnR5QmxvYlB0ciBibG9iOwo+ICsKPiArCWlndF9hc3NlcnQoaWd0X3BpcGVfZ2V0X3Byb3Bl cnR5KHBpcGUsIHByb3BlcnR5X25hbWUsCj4gKwkJCQkJIE5VTEwsICZwcm9wX3ZhbHVlLCAmcHJv cCkpOwo+ICsKPiArCWlmIChwcm9wX3ZhbHVlID09IDApCj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwo+ ICsJaWd0X2Fzc2VydChwcm9wLT5mbGFncyAmIERSTV9NT0RFX1BST1BfQkxPQik7Cj4gKwlibG9i ID0gZHJtTW9kZUdldFByb3BlcnR5QmxvYihkYXRhLT5kcm1fZmQsIHByb3BfdmFsdWUpOwo+ICsJ ZHJtTW9kZUZyZWVQcm9wZXJ0eShwcm9wKTsKPiArCj4gKwlyZXR1cm4gYmxvYjsKPiArfQo+ICsK PiArLyoKPiArICogVmVyaWZ5IHRoYXQgc2V0dGluZyB0aGUgbGVnYWN5IGdhbW1hIExVVCByZXNl dHMgdGhlIGdhbW1hIExVVCBzZXQKPiArICogdGhyb3VnaCB0aGUgR0FNTUFfTFVUIHByb3BlcnR5 Lgo+ICsgKi8KPiArc3RhdGljIHZvaWQgdGVzdF9waXBlX2xlZ2FjeV9nYW1tYV9yZXNldChkYXRh X3QgKmRhdGEsCj4gKwkJCQkJIGlndF9wbGFuZV90ICpwcmltYXJ5KQo+ICt7Cj4gKwljb25zdCBk b3VibGUgY3RtX2lkZW50aXR5W10gPSB7Cj4gKwkJMS4wLCAwLjAsIDAuMCwKPiArCQkwLjAsIDEu MCwgMC4wLAo+ICsJCTAuMCwgMC4wLCAxLjAKPiArCX07Cj4gKwlkcm1Nb2RlQ3J0YyAqa21zX2Ny dGM7Cj4gKwlkb3VibGUgKmRlZ2FtbWFfbGluZWFyLCAqZ2FtbWFfemVybzsKPiArCXVpbnQzMl90 IGksIGxlZ2FjeV9sdXRfc2l6ZTsKPiArCXVpbnQxNl90ICpyZWRfbHV0LCAqZ3JlZW5fbHV0LCAq Ymx1ZV9sdXQ7Cj4gKwlzdHJ1Y3QgX2RybV9jb2xvcl9sdXQgKmx1dDsKPiArCWRybU1vZGVQcm9w ZXJ0eUJsb2JQdHIgYmxvYjsKPiArCWlndF9vdXRwdXRfdCAqb3V0cHV0Owo+ICsKPiArCWRlZ2Ft bWFfbGluZWFyID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+ZGVnYW1tYV9sdXRfc2l6ZSwgMS4wKTsK PiArCWdhbW1hX3plcm8gPSBnZW5lcmF0ZV90YWJsZV96ZXJvKGRhdGEtPmdhbW1hX2x1dF9zaXpl KTsKPiArCj4gKwlmb3JfZWFjaF9jb25uZWN0ZWRfb3V0cHV0KCZkYXRhLT5kaXNwbGF5LCBvdXRw dXQpIHsKPiArCQlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgcHJpbWFyeS0+cGlwZS0+cGlw ZSk7Cj4gKwo+ICsJCS8qIEVuc3VyZSB3ZSBoYXZlIGEgY2xlYW4gc3RhdGUgdG8gc3RhcnQgd2l0 aC4gKi8KPiArCQlkaXNhYmxlX2RlZ2FtbWEocHJpbWFyeS0+cGlwZSk7Cj4gKwkJZGlzYWJsZV9j dG0ocHJpbWFyeS0+cGlwZSk7Cj4gKwkJZGlzYWJsZV9nYW1tYShwcmltYXJ5LT5waXBlKTsKPiAr CQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+ICsKPiArCQkvKiBTZXQgYSBk ZWdhbWEgJiBnYW1tYSBMVVQgYW5kIGEgQ1RNIHVzaW5nIHRoZQo+ICsJCSAqIHByb3BlcnRpZXMg YW5kIHZlcmlmeSB0aGUgY29udGVudCBvZiB0aGUKPiArCQkgKiBwcm9wZXJ0aWVzLiAqLwo+ICsJ CXNldF9kZWdhbW1hKGRhdGEsIHByaW1hcnktPnBpcGUsIGRlZ2FtbWFfbGluZWFyKTsKPiArCQlz ZXRfY3RtKHByaW1hcnktPnBpcGUsIGN0bV9pZGVudGl0eSk7Cj4gKwkJc2V0X2dhbW1hKGRhdGEs IHByaW1hcnktPnBpcGUsIGdhbW1hX3plcm8pOwo+ICsJCWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0 YS0+ZGlzcGxheSk7Cj4gKwo+ICsJCWJsb2IgPSBnZXRfYmxvYihkYXRhLCBwcmltYXJ5LT5waXBl LCAiREVHQU1NQV9MVVQiKTsKPiArCQlpZ3RfYXNzZXJ0KGJsb2IgJiYKPiArCQkJICAgYmxvYi0+ bGVuZ3RoID09IChzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfbHV0KSAqCj4gKwkJCQkJICAgIGRh dGEtPmRlZ2FtbWFfbHV0X3NpemUpKTsKPiArCQlkcm1Nb2RlRnJlZVByb3BlcnR5QmxvYihibG9i KTsKPiArCj4gKwkJYmxvYiA9IGdldF9ibG9iKGRhdGEsIHByaW1hcnktPnBpcGUsICJDVE0iKTsK PiArCQlpZ3RfYXNzZXJ0KGJsb2IgJiYKPiArCQkJICAgYmxvYi0+bGVuZ3RoID09IHNpemVvZihz dHJ1Y3QgX2RybV9jb2xvcl9jdG0pKTsKPiArCQlkcm1Nb2RlRnJlZVByb3BlcnR5QmxvYihibG9i KTsKPiArCj4gKwkJYmxvYiA9IGdldF9ibG9iKGRhdGEsIHByaW1hcnktPnBpcGUsICJHQU1NQV9M VVQiKTsKPiArCQlpZ3RfYXNzZXJ0KGJsb2IgJiYKPiArCQkJICAgYmxvYi0+bGVuZ3RoID09IChz aXplb2Yoc3RydWN0IF9kcm1fY29sb3JfbHV0KSAqCj4gKwkJCQkJICAgIGRhdGEtPmdhbW1hX2x1 dF9zaXplKSk7Cj4gKwkJbHV0ID0gKHN0cnVjdCBfZHJtX2NvbG9yX2x1dCAqKSBibG9iLT5kYXRh Owo+ICsJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5nYW1tYV9sdXRfc2l6ZTsgaSsrKQo+ICsJCQlp Z3RfYXNzZXJ0KGx1dFtpXS5yZWQgPT0gMCAmJgo+ICsJCQkJICAgbHV0W2ldLmdyZWVuID09IDAg JiYKPiArCQkJCSAgIGx1dFtpXS5ibHVlID09IDApOwo+ICsJCWRybU1vZGVGcmVlUHJvcGVydHlC bG9iKGJsb2IpOwo+ICsKPiArCQkvKiBTZXQgYSBnYW1tYSBMVVQgdXNpbmcgdGhlIGxlZ2FjeSBp b2N0bCBhbmQgdmVyaWZ5Cj4gKwkJICogdGhlIGNvbnRlbnQgb2YgdGhlIEdBTU1BX0xVVCBwcm9w ZXJ0eSBpcyBjaGFuZ2VkCj4gKwkJICogYW5kIHRoYXQgQ1RNIGFuZCBERUdBTU1BX0xVVCBhcmUg ZW1wdHkuICovCj4gKwkJa21zX2NydGMgPSBkcm1Nb2RlR2V0Q3J0YyhkYXRhLT5kcm1fZmQsIHBy aW1hcnktPnBpcGUtPmNydGNfaWQpOwo+ICsJCWxlZ2FjeV9sdXRfc2l6ZSA9IGttc19jcnRjLT5n YW1tYV9zaXplOwo+ICsJCWRybU1vZGVGcmVlQ3J0YyhrbXNfY3J0Yyk7Cj4gKwo+ICsJCXJlZF9s dXQgPSBtYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIGxlZ2FjeV9sdXRfc2l6ZSk7Cj4gKwkJZ3Jl ZW5fbHV0ID0gbWFsbG9jKHNpemVvZih1aW50MTZfdCkgKiBsZWdhY3lfbHV0X3NpemUpOwo+ICsJ CWJsdWVfbHV0ID0gbWFsbG9jKHNpemVvZih1aW50MTZfdCkgKiBsZWdhY3lfbHV0X3NpemUpOwo+ ICsKPiArCQlmb3IgKGkgPSAwOyBpIDwgbGVnYWN5X2x1dF9zaXplOyBpKyspCj4gKwkJCXJlZF9s dXRbaV0gPSBncmVlbl9sdXRbaV0gPSBibHVlX2x1dFtpXSA9IDB4ZmZmZjsKPiArCj4gKwkJaWd0 X2Fzc2VydF9lcShkcm1Nb2RlQ3J0Y1NldEdhbW1hKGRhdGEtPmRybV9mZCwKPiArCQkJCQkJICBw cmltYXJ5LT5waXBlLT5jcnRjX2lkLAo+ICsJCQkJCQkgIGxlZ2FjeV9sdXRfc2l6ZSwKPiArCQkJ CQkJICByZWRfbHV0LCBncmVlbl9sdXQsIGJsdWVfbHV0KSwKPiArCQkJICAgICAgMCk7Cj4gKwkJ aWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRhLT5kaXNwbGF5KTsKPiArCj4gKwkJaWd0X2Fzc2VydChn ZXRfYmxvYihkYXRhLCBwcmltYXJ5LT5waXBlLAo+ICsJCQkJICAgICJERUdBTU1BX0xVVCIpID09 IE5VTEwpOwo+ICsJCWlndF9hc3NlcnQoZ2V0X2Jsb2IoZGF0YSwgcHJpbWFyeS0+cGlwZSwgIkNU TSIpID09IE5VTEwpOwo+ICsKPiArCQlibG9iID0gZ2V0X2Jsb2IoZGF0YSwgcHJpbWFyeS0+cGlw ZSwgIkdBTU1BX0xVVCIpOwo+ICsJCWlndF9hc3NlcnQoYmxvYiAmJgo+ICsJCQkgICBibG9iLT5s ZW5ndGggPT0gKHNpemVvZihzdHJ1Y3QgX2RybV9jb2xvcl9sdXQpICoKPiArCQkJCQkgICAgbGVn YWN5X2x1dF9zaXplKSk7Cj4gKwkJbHV0ID0gKHN0cnVjdCBfZHJtX2NvbG9yX2x1dCAqKSBibG9i LT5kYXRhOwo+ICsJCWZvciAoaSA9IDA7IGkgPCBsZWdhY3lfbHV0X3NpemU7IGkrKykKPiArCQkJ aWd0X2Fzc2VydChsdXRbaV0ucmVkID09IDB4ZmZmZiAmJgo+ICsJCQkJICAgbHV0W2ldLmdyZWVu ID09IDB4ZmZmZiAmJgo+ICsJCQkJICAgbHV0W2ldLmJsdWUgPT0gMHhmZmZmKTsKPiArCQlkcm1N b2RlRnJlZVByb3BlcnR5QmxvYihibG9iKTsKPiArCj4gKwkJaWd0X291dHB1dF9zZXRfcGlwZShv dXRwdXQsIFBJUEVfQU5ZKTsKPiArCX0KPiArCj4gKwlmcmVlKGRlZ2FtbWFfbGluZWFyKTsKPiAr CWZyZWUoZ2FtbWFfemVybyk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIERyYXcgMyByZWN0YW5nbGVz IHVzaW5nIGJlZm9yZSBjb2xvcnMgd2l0aCB0aGUgY3RtIG1hdHJpeCBhcHBseSBhbmQgdmVyaWZ5 Cj4gKyAqIHRoZSBDUkMgaXMgZXF1YWwgdG8gdXNpbmcgYWZ0ZXIgY29sb3JzIHdpdGggYW4gaWRl bnRpZnkgY3RtIG1hdHJpeC4KPiArICovCj4gK3N0YXRpYyBib29sIHRlc3RfcGlwZV9jdG0oZGF0 YV90ICpkYXRhLAo+ICsJCQkgIGlndF9wbGFuZV90ICpwcmltYXJ5LAo+ICsJCQkgIGNvbG9yX3Qg KmJlZm9yZSwKPiArCQkJICBjb2xvcl90ICphZnRlciwKPiArCQkJICBkb3VibGUgKmN0bV9tYXRy aXgpCj4gK3sKPiArCWNvbnN0IGRvdWJsZSBjdG1faWRlbnRpdHlbXSA9IHsKPiArCQkxLjAsIDAu MCwgMC4wLAo+ICsJCTAuMCwgMS4wLCAwLjAsCj4gKwkJMC4wLCAwLjAsIDEuMAo+ICsJfTsKPiAr CWRvdWJsZSAqZGVnYW1tYV9saW5lYXIsICpnYW1tYV9saW5lYXI7Cj4gKwlpZ3Rfb3V0cHV0X3Qg Km91dHB1dDsKPiArCWJvb2wgcmV0ID0gdHJ1ZTsKPiArCj4gKwlkZWdhbW1hX2xpbmVhciA9IGdl bmVyYXRlX3RhYmxlKGRhdGEtPmRlZ2FtbWFfbHV0X3NpemUsIDEuMCk7Cj4gKwlnYW1tYV9saW5l YXIgPSBnZW5lcmF0ZV90YWJsZShkYXRhLT5nYW1tYV9sdXRfc2l6ZSwgMS4wKTsKPiArCj4gKwlm b3JfZWFjaF9jb25uZWN0ZWRfb3V0cHV0KCZkYXRhLT5kaXNwbGF5LCBvdXRwdXQpIHsKPiArCQlk cm1Nb2RlTW9kZUluZm8gKm1vZGU7Cj4gKwkJc3RydWN0IGlndF9mYiBmYl9tb2Rlc2V0LCBmYjsK PiArCQlpZ3RfY3JjX3QgY3JjX3NvZnR3YXJlLCBjcmNfaGFyZHdhcmU7Cj4gKwkJaW50IGZiX2lk LCBmYl9tb2Rlc2V0X2lkOwo+ICsKPiArCQlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgcHJp bWFyeS0+cGlwZS0+cGlwZSk7Cj4gKwkJbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUob3V0cHV0 KTsKPiArCj4gKwkJLyogQ3JlYXRlIGEgZnJhbWVidWZmZXIgYXQgdGhlIHNpemUgb2YgdGhlIG91 dHB1dC4gKi8KPiArCQlmYl9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAo+ICsJCQkJ ICAgICAgbW9kZS0+aGRpc3BsYXksCj4gKwkJCQkgICAgICBtb2RlLT52ZGlzcGxheSwKPiArCQkJ CSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkgICAgICBMT0NBTF9EUk1fRk9STUFU X01PRF9OT05FLAo+ICsJCQkJICAgICAgJmZiKTsKPiArCQlpZ3RfYXNzZXJ0KGZiX2lkKTsKPiAr Cj4gKwkJZmJfbW9kZXNldF9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAo+ICsJCQkJ CSAgICAgIG1vZGUtPmhkaXNwbGF5LAo+ICsJCQkJCSAgICAgIG1vZGUtPnZkaXNwbGF5LAo+ICsJ CQkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkJICAgICAgTE9DQUxfRFJNX0ZP Uk1BVF9NT0RfTk9ORSwKPiArCQkJCQkgICAgICAmZmJfbW9kZXNldCk7Cj4gKwkJaWd0X2Fzc2Vy dChmYl9tb2Rlc2V0X2lkKTsKPiArCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYl9tb2Rl c2V0KTsKPiArCj4gKwkJc2V0X2RlZ2FtbWEoZGF0YSwgcHJpbWFyeS0+cGlwZSwgZGVnYW1tYV9s aW5lYXIpOwo+ICsJCXNldF9nYW1tYShkYXRhLCBwcmltYXJ5LT5waXBlLCBnYW1tYV9saW5lYXIp Owo+ICsJCWRpc2FibGVfY3RtKHByaW1hcnktPnBpcGUpOwo+ICsJCWlndF9kaXNwbGF5X2NvbW1p dCgmZGF0YS0+ZGlzcGxheSk7Cj4gKwo+ICsJCXBhaW50X3JlY3RhbmdsZXMoZGF0YSwgbW9kZSwg YWZ0ZXIsICZmYik7Cj4gKwkJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCAmZmIpOwo+ICsJCXNl dF9jdG0ocHJpbWFyeS0+cGlwZSwgY3RtX2lkZW50aXR5KTsKPiArCQlpZ3RfZGlzcGxheV9jb21t aXQoJmRhdGEtPmRpc3BsYXkpOwo+ICsJCWlndF93YWl0X2Zvcl92YmxhbmsoZGF0YS0+ZHJtX2Zk LCBwcmltYXJ5LT5waXBlLT5waXBlKTsKPiArCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0 YS0+cGlwZV9jcmMsICZjcmNfc29mdHdhcmUpOwo+ICsKPiArCQkvKiBXaXRoIENUTSB0cmFuc2Zv cm1hdGlvbi4gKi8KPiArCQlwYWludF9yZWN0YW5nbGVzKGRhdGEsIG1vZGUsIGJlZm9yZSwgJmZi KTsKPiArCQlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7Cj4gKwkJc2V0X2N0bShwcmlt YXJ5LT5waXBlLCBjdG1fbWF0cml4KTsKPiArCQlpZ3RfZGlzcGxheV9jb21taXQoJmRhdGEtPmRp c3BsYXkpOwo+ICsJCWlndF93YWl0X2Zvcl92YmxhbmsoZGF0YS0+ZHJtX2ZkLCBwcmltYXJ5LT5w aXBlLT5waXBlKTsKPiArCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMs ICZjcmNfaGFyZHdhcmUpOwo+ICsKPiArCQkvKiBWZXJpZnkgdGhhdCB0aGUgQ1JDIG9mIHRoZSBz b2Z0d2FyZSBjb21wdXRlZCBvdXRwdXQgaXMKPiArCQkgKiBlcXVhbCB0byB0aGUgQ1JDIG9mIHRo ZSBDVE0gbWF0cml4IHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KPiArCQkgKi8KPiArCQlyZXQgJj0g aWd0X2NyY19lcXVhbCgmY3JjX3NvZnR3YXJlLCAmY3JjX2hhcmR3YXJlKTsKPiArCj4gKwkJaWd0 X291dHB1dF9zZXRfcGlwZShvdXRwdXQsIFBJUEVfQU5ZKTsKPiArCX0KPiArCj4gKwlmcmVlKGRl Z2FtbWFfbGluZWFyKTsKPiArCWZyZWUoZ2FtbWFfbGluZWFyKTsKPiArCj4gKwlyZXR1cm4gcmV0 Owo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBIYXJkd2FyZSBjb21wdXRlcyBDUkMgYmFzZWQgb24gdGhl IG51bWJlciBvZiBiaXRzIGl0IGlzIHdvcmtpbmcgd2l0aCAoOCwKPiArICogMTAsIDEyLCAxNiBi aXRzKSwgbWVhbmluZyB3aXRoIGEgZnJhbWVidWZmZXIgb2YgOGJpdHMgcGVyIGNvbG9yIHdpbGwK PiArICogdXN1YWxseSBsZWF2ZSB0aGUgcmVtYWluaW5nIGxvd2VyIGJpdHMgYXQgMC4KPiArICoK PiArICogV2UncmUgcHJvZ3JhbW1pbmcgdGhlIGdhbW1hIExVVCBpbiBvcmRlciB0byBnZXQgcmlk IG9mIHRob3NlIGxvd2VyIGJpdHMgc28KPiArICogd2UgY2FuIGNvbXBhcmUgdGhlIENSQyBvZiBh IGZyYW1lYnVmZmVyIHdpdGhvdXQgYW55IHRyYW5zZm9ybWF0aW9uIHRvIGEgQ1JDCj4gKyAqIHdp dGggdHJhbnNmb3JtYXRpb24gYXBwbGllZCBhbmQgdmVyaWZ5IHRoZSBDUkNzIG1hdGNoLgo+ICsg Kgo+ICsgKiBUaGlzIHRlc3QgaXMgY3VycmVudGx5IGRpc2FibGVkIGFzIHRoZSBDUkMgY29tcHV0 ZWQgb24gSW50ZWwgaGFyZHdhcmUgc2VlbXMKPiArICogdG8gaW5jbHVkZSBkYXRhIG9uIHRoZSBs b3dlciBiaXRzLCB0aGlzIGlzIHByZXZlbnRpbmcgdXMgdG8gQ1JDIGNoZWNrcy4KPiArICovCj4g KyNpZiAwCj4gK3N0YXRpYyB2b2lkIHRlc3RfcGlwZV9saW1pdGVkX3JhbmdlX2N0bShkYXRhX3Qg KmRhdGEsCj4gKwkJCQkJaWd0X3BsYW5lX3QgKnByaW1hcnkpCj4gK3sKPiArCWRvdWJsZSBsaW1p dGVkX3Jlc3VsdCA9IDIzNS4wIC8gMjU1LjA7Cj4gKwljb2xvcl90IHJlZF9ncmVlbl9ibHVlX2xp bWl0ZWRbXSA9IHsKPiArCQl7IGxpbWl0ZWRfcmVzdWx0LCAwLjAsIDAuMCB9LAo+ICsJCXsgMC4w LCBsaW1pdGVkX3Jlc3VsdCwgMC4wIH0sCj4gKwkJeyAwLjAsIDAuMCwgbGltaXRlZF9yZXN1bHQg fQo+ICsJfTsKPiArCWNvbG9yX3QgcmVkX2dyZWVuX2JsdWVfZnVsbFtdID0gewo+ICsJCXsgMC41 LCAwLjAsIDAuMCB9LAo+ICsJCXsgMC4wLCAwLjUsIDAuMCB9LAo+ICsJCXsgMC4wLCAwLjAsIDAu NSB9Cj4gKwl9Owo+ICsJZG91YmxlIGN0bVtdID0geyAxLjAsIDAuMCwgMC4wLAo+ICsJCQkwLjAs IDEuMCwgMC4wLAo+ICsJCQkwLjAsIDAuMCwgMS4wIH07Cj4gKwlkb3VibGUgKmRlZ2FtbWFfbGlu ZWFyLCAqZ2FtbWFfbGluZWFyOwo+ICsJaWd0X291dHB1dF90ICpvdXRwdXQ7Cj4gKwo+ICsJZGVn YW1tYV9saW5lYXIgPSBnZW5lcmF0ZV90YWJsZShkYXRhLT5kZWdhbW1hX2x1dF9zaXplLCAxLjAp Owo+ICsJZ2FtbWFfbGluZWFyID0gZ2VuZXJhdGVfdGFibGUoZGF0YS0+Z2FtbWFfbHV0X3NpemUs IDEuMCk7Cj4gKwo+ICsJZm9yX2VhY2hfY29ubmVjdGVkX291dHB1dCgmZGF0YS0+ZGlzcGxheSwg b3V0cHV0KSB7Cj4gKwkJZHJtTW9kZU1vZGVJbmZvICptb2RlOwo+ICsJCXN0cnVjdCBpZ3RfZmIg ZmJfbW9kZXNldCwgZmI7Cj4gKwkJaWd0X2NyY190IGNyY19mdWxsLCBjcmNfbGltaXRlZDsKPiAr CQlpbnQgZmJfaWQsIGZiX21vZGVzZXRfaWQ7Cj4gKwo+ICsJCWlndF9vdXRwdXRfc2V0X3BpcGUo b3V0cHV0LCBwcmltYXJ5LT5waXBlLT5waXBlKTsKPiArCQltb2RlID0gaWd0X291dHB1dF9nZXRf bW9kZShvdXRwdXQpOwo+ICsKPiArCQkvKiBDcmVhdGUgYSBmcmFtZWJ1ZmZlciBhdCB0aGUgc2l6 ZSBvZiB0aGUgb3V0cHV0LiAqLwo+ICsJCWZiX2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1f ZmQsCj4gKwkJCQkgICAgICBtb2RlLT5oZGlzcGxheSwKPiArCQkJCSAgICAgIG1vZGUtPnZkaXNw bGF5LAo+ICsJCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKPiArCQkJCSAgICAgIExPQ0FM X0RSTV9GT1JNQVRfTU9EX05PTkUsCj4gKwkJCQkgICAgICAmZmIpOwo+ICsJCWlndF9hc3NlcnQo ZmJfaWQpOwo+ICsKPiArCQlmYl9tb2Rlc2V0X2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1f ZmQsCj4gKwkJCQkJICAgICAgbW9kZS0+aGRpc3BsYXksCj4gKwkJCQkJICAgICAgbW9kZS0+dmRp c3BsYXksCj4gKwkJCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKPiArCQkJCQkgICAgICBM T0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAo+ICsJCQkJCSAgICAgICZmYl9tb2Rlc2V0KTsKPiAr CQlpZ3RfYXNzZXJ0KGZiX21vZGVzZXRfaWQpOwo+ICsJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFy eSwgJmZiX21vZGVzZXQpOwo+ICsKPiArCQlzZXRfZGVnYW1tYShkYXRhLCBwcmltYXJ5LT5waXBl LCBkZWdhbW1hX2xpbmVhcik7Cj4gKwkJc2V0X2dhbW1hKGRhdGEsIHByaW1hcnktPnBpcGUsIGdh bW1hX2xpbmVhcik7Cj4gKwkJc2V0X2N0bShwcmltYXJ5LT5waXBlLCBjdG0pOwo+ICsKPiArCQlv dXRwdXRfc2V0X3Byb3BlcnR5X2VudW0ob3V0cHV0LCAiQnJvYWRjYXN0IFJHQiIsICJGdWxsIik7 Cj4gKwkJcGFpbnRfcmVjdGFuZ2xlcyhkYXRhLCBtb2RlLCByZWRfZ3JlZW5fYmx1ZV9saW1pdGVk LCAmZmIpOwo+ICsJCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmZiKTsKPiArCQlpZ3RfZGlz cGxheV9jb21taXQoJmRhdGEtPmRpc3BsYXkpOwo+ICsJCWlndF93YWl0X2Zvcl92YmxhbmsoZGF0 YS0+ZHJtX2ZkLCBwcmltYXJ5LT5waXBlLT5waXBlKTsKPiArCQlpZ3RfcGlwZV9jcmNfY29sbGVj dF9jcmMoZGF0YS0+cGlwZV9jcmMsICZjcmNfZnVsbCk7Cj4gKwo+ICsJCS8qIFNldCB0aGUgb3V0 cHV0IGludG8gbGltaXRlZCByYW5nZS4gKi8KPiArCQlvdXRwdXRfc2V0X3Byb3BlcnR5X2VudW0o b3V0cHV0LCAiQnJvYWRjYXN0IFJHQiIsICJMaW1pdGVkIDE2OjIzNSIpOwo+ICsJCXBhaW50X3Jl Y3RhbmdsZXMoZGF0YSwgbW9kZSwgcmVkX2dyZWVuX2JsdWVfZnVsbCwgJmZiKTsKPiArCQlpZ3Rf cGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7Cj4gKwkJaWd0X2Rpc3BsYXlfY29tbWl0KCZkYXRh LT5kaXNwbGF5KTsKPiArCQlpZ3Rfd2FpdF9mb3JfdmJsYW5rKGRhdGEtPmRybV9mZCwgcHJpbWFy eS0+cGlwZS0+cGlwZSk7Cj4gKwkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVf Y3JjLCAmY3JjX2xpbWl0ZWQpOwo+ICsKPiArCQkvKiBWZXJpZnkgdGhhdCB0aGUgQ1JDIG9mIHRo ZSBzb2Z0d2FyZSBjb21wdXRlZCBvdXRwdXQgaXMKPiArCQkgKiBlcXVhbCB0byB0aGUgQ1JDIG9m IHRoZSBDVE0gbWF0cml4IHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KPiArCQkgKi8KPiArCQlpZ3Rf YXNzZXJ0X2NyY19lcXVhbCgmY3JjX2Z1bGwsICZjcmNfbGltaXRlZCk7Cj4gKwo+ICsJCWlndF9v dXRwdXRfc2V0X3BpcGUob3V0cHV0LCBQSVBFX0FOWSk7Cj4gKwl9Cj4gKwo+ICsJZnJlZShnYW1t YV9saW5lYXIpOwo+ICsJZnJlZShkZWdhbW1hX2xpbmVhcik7Cj4gK30KPiArI2VuZGlmCj4gKwo+ ICtzdGF0aWMgdm9pZAo+ICtydW5fdGVzdHNfZm9yX3BpcGUoZGF0YV90ICpkYXRhLCBlbnVtIHBp cGUgcCkKPiArewo+ICsJaWd0X291dHB1dF90ICpvdXRwdXQ7Cj4gKwlpZ3RfcGlwZV90ICpwaXBl Owo+ICsJaWd0X3BsYW5lX3QgKnByaW1hcnk7Cj4gKwlkb3VibGUgZGVsdGE7Cj4gKwlpbnQgaTsK PiArCWNvbG9yX3QgcmVkX2dyZWVuX2JsdWVbXSA9IHsKPiArCQl7IDEuMCwgMC4wLCAwLjAgfSwK PiArCQl7IDAuMCwgMS4wLCAwLjAgfSwKPiArCQl7IDAuMCwgMC4wLCAxLjAgfQo+ICsJfTsKPiAr Cj4gKwlpZ3RfZml4dHVyZSB7Cj4gKwkJaWd0X3JlcXVpcmVfcGlwZV9jcmMoKTsKPiArCj4gKwkJ aWYgKHAgPj0gZGF0YS0+ZGlzcGxheS5uX3BpcGVzKQo+ICsJCQlyZXR1cm47Cj4gKwo+ICsJCXBp cGUgPSAmZGF0YS0+ZGlzcGxheS5waXBlc1twXTsKPiArCQlpZiAocGlwZS0+bl9wbGFuZXMgPCBJ R1RfUExBTkVfUFJJTUFSWSkKPiArCQkJcmV0dXJuOwo+ICsKPiArCQlwcmltYXJ5ID0gJnBpcGUt PnBsYW5lc1tJR1RfUExBTkVfUFJJTUFSWV07Cj4gKwo+ICsJCWRhdGEtPnBpcGVfY3JjID0gaWd0 X3BpcGVfY3JjX25ldyhwcmltYXJ5LT5waXBlLT5waXBlLAo+ICsJCQkJCQkgIElOVEVMX1BJUEVf Q1JDX1NPVVJDRV9BVVRPKTsKPiArCj4gKwkJaWd0X3JlcXVpcmUoaWd0X3BpcGVfZ2V0X3Byb3Bl cnR5KCZkYXRhLT5kaXNwbGF5LnBpcGVzW3BdLAo+ICsJCQkJCQkgICJERUdBTU1BX0xVVF9TSVpF IiwKPiArCQkJCQkJICBOVUxMLAo+ICsJCQkJCQkgICZkYXRhLT5kZWdhbW1hX2x1dF9zaXplLAo+ ICsJCQkJCQkgIE5VTEwpKTsKPiArCQlpZ3RfcmVxdWlyZShpZ3RfcGlwZV9nZXRfcHJvcGVydHko JmRhdGEtPmRpc3BsYXkucGlwZXNbcF0sCj4gKwkJCQkJCSAgIkdBTU1BX0xVVF9TSVpFIiwKPiAr CQkJCQkJICBOVUxMLAo+ICsJCQkJCQkgICZkYXRhLT5nYW1tYV9sdXRfc2l6ZSwKPiArCQkJCQkJ ICBOVUxMKSk7Cj4gKwo+ICsJCWZvcl9lYWNoX2Nvbm5lY3RlZF9vdXRwdXQoJmRhdGEtPmRpc3Bs YXksIG91dHB1dCkKPiArCQkJb3V0cHV0X3NldF9wcm9wZXJ0eV9lbnVtKG91dHB1dCwgIkJyb2Fk Y2FzdCBSR0IiLCAiRnVsbCIpOwo+ICsJfQo+ICsKPiArCS8qIFdlIGFzc3VtZSBhbiA4Yml0cyBk ZXB0aCBwZXIgY29sb3IgZm9yIGRlZ2FtbWEvZ2FtbWEgTFVUcwo+ICsJICogZm9yIENSQyBjaGVj a3Mgd2l0aCBmcmFtZWJ1ZmZlciByZWZlcmVuY2VzLiAqLwo+ICsJZGF0YS0+Y29sb3JfZGVwdGgg PSA4Owo+ICsJZGVsdGEgPSAxLjAgLyAoMSA8PCBkYXRhLT5jb2xvcl9kZXB0aCk7Cj4gKwo+ICsJ aWd0X3N1YnRlc3RfZigiY3RtLXJlZC10by1ibHVlLXBpcGUlZCIsIHApIHsKPiArCQljb2xvcl90 IGJsdWVfZ3JlZW5fYmx1ZVtdID0gewo+ICsJCQl7IDAuMCwgMC4wLCAxLjAgfSwKPiArCQkJeyAw LjAsIDEuMCwgMC4wIH0sCj4gKwkJCXsgMC4wLCAwLjAsIDEuMCB9Cj4gKwkJfTsKPiArCQlkb3Vi bGUgY3RtW10gPSB7IDAuMCwgMC4wLCAwLjAsCj4gKwkJCQkwLjAsIDEuMCwgMC4wLAo+ICsJCQkJ MS4wLCAwLjAsIDEuMCB9Owo+ICsJCWlndF9hc3NlcnQodGVzdF9waXBlX2N0bShkYXRhLCBwcmlt YXJ5LCByZWRfZ3JlZW5fYmx1ZSwKPiArCQkJCQkgYmx1ZV9ncmVlbl9ibHVlLCBjdG0pKTsKPiAr CX0KPiArCj4gKwlpZ3Rfc3VidGVzdF9mKCJjdG0tZ3JlZW4tdG8tcmVkLXBpcGUlZCIsIHApIHsK PiArCQljb2xvcl90IHJlZF9yZWRfYmx1ZVtdID0gewo+ICsJCQl7IDEuMCwgMC4wLCAwLjAgfSwK PiArCQkJeyAxLjAsIDAuMCwgMC4wIH0sCj4gKwkJCXsgMC4wLCAwLjAsIDEuMCB9Cj4gKwkJfTsK PiArCQlkb3VibGUgY3RtW10gPSB7IDEuMCwgMS4wLCAwLjAsCj4gKwkJCQkwLjAsIDAuMCwgMC4w LAo+ICsJCQkJMC4wLCAwLjAsIDEuMCB9Owo+ICsJCWlndF9hc3NlcnQodGVzdF9waXBlX2N0bShk YXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwKPiArCQkJCQkgcmVkX3JlZF9ibHVlLCBjdG0p KTsKPiArCX0KPiArCj4gKwlpZ3Rfc3VidGVzdF9mKCJjdG0tYmx1ZS10by1yZWQtcGlwZSVkIiwg cCkgewo+ICsJCWNvbG9yX3QgcmVkX2dyZWVuX3JlZFtdID0gewo+ICsJCQl7IDEuMCwgMC4wLCAw LjAgfSwKPiArCQkJeyAwLjAsIDEuMCwgMC4wIH0sCj4gKwkJCXsgMS4wLCAwLjAsIDAuMCB9Cj4g KwkJfTsKPiArCQlkb3VibGUgY3RtW10gPSB7IDEuMCwgMC4wLCAxLjAsCj4gKwkJCQkwLjAsIDEu MCwgMC4wLAo+ICsJCQkJMC4wLCAwLjAsIDAuMCB9Owo+ICsJCWlndF9hc3NlcnQodGVzdF9waXBl X2N0bShkYXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwKPiArCQkJCQkgcmVkX2dyZWVuX3Jl ZCwgY3RtKSk7Cj4gKwl9Cj4gKwo+ICsJLyogV2UgdGVzdHMgYSBmZXcgdmFsdWVzIGFyb3VuZCB0 aGUgZXhwZWN0ZWQgcmVzdWx0IGJlY2F1c2UKPiArCSAqIHRoZSBpdCBkZXBlbmRzIG9uIHRoZSBo YXJkd2FyZSB3ZSdyZSBkZWFsaW5nIHdpdGgsIHdlIGNhbgo+ICsJICogZWl0aGVyIGdldCBjbGFt cGVkIG9yIHJvdW5kZWQgdmFsdWVzIGFuZCB3ZSBhbHNvIG5lZWQgdG8KPiArCSAqIGFjY291bnQg Zm9yIG9kZCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIExVVHMuICovCj4gKwlpZ3Rfc3VidGVzdF9m KCJjdG0tMC0yNS1waXBlJWQiLCBwKSB7Cj4gKwkJY29sb3JfdCBleHBlY3RlZF9jb2xvcnNbXSA9 IHsKPiArCQkJeyAwLjAsIH0sIHsgMC4wLCB9LCB7IDAuMCwgfQo+ICsJCX07Cj4gKwkJZG91Ymxl IGN0bVtdID0geyAwLjI1LCAwLjAsICAwLjAsCj4gKwkJCQkgMC4wLCAgMC4yNSwgMC4wLAo+ICsJ CQkJIDAuMCwgIDAuMCwgIDAuMjUgfTsKPiArCQlib29sIHN1Y2Nlc3MgPSBmYWxzZTsKPiArCj4g KwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewo+ICsJCQlleHBlY3RlZF9jb2xvcnNbMF0uciA9 Cj4gKwkJCQlleHBlY3RlZF9jb2xvcnNbMV0uZyA9Cj4gKwkJCQlleHBlY3RlZF9jb2xvcnNbMl0u YiA9Cj4gKwkJCQkwLjI1ICsgZGVsdGEgKiAoaSAtIDIpOwo+ICsJCQlzdWNjZXNzIHw9IHRlc3Rf cGlwZV9jdG0oZGF0YSwgcHJpbWFyeSwKPiArCQkJCQkJIHJlZF9ncmVlbl9ibHVlLAo+ICsJCQkJ CQkgZXhwZWN0ZWRfY29sb3JzLCBjdG0pOwo+ICsJCX0KPiArCQlpZ3RfYXNzZXJ0KHN1Y2Nlc3Mp Owo+ICsJfQo+ICsKPiArCWlndF9zdWJ0ZXN0X2YoImN0bS0wLTUtcGlwZSVkIiwgcCkgewo+ICsJ CWNvbG9yX3QgZXhwZWN0ZWRfY29sb3JzW10gPSB7Cj4gKwkJCXsgMC4wLCB9LCB7IDAuMCwgfSwg eyAwLjAsIH0KPiArCQl9Owo+ICsJCWRvdWJsZSBjdG1bXSA9IHsgMC41LCAwLjAsIDAuMCwKPiAr CQkJCSAwLjAsIDAuNSwgMC4wLAo+ICsJCQkJIDAuMCwgMC4wLCAwLjUgfTsKPiArCQlib29sIHN1 Y2Nlc3MgPSBmYWxzZTsKPiArCj4gKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewo+ICsJCQll eHBlY3RlZF9jb2xvcnNbMF0uciA9Cj4gKwkJCQlleHBlY3RlZF9jb2xvcnNbMV0uZyA9Cj4gKwkJ CQlleHBlY3RlZF9jb2xvcnNbMl0uYiA9Cj4gKwkJCQkwLjUgKyBkZWx0YSAqIChpIC0gMik7Cj4g KwkJCXN1Y2Nlc3MgfD0gdGVzdF9waXBlX2N0bShkYXRhLCBwcmltYXJ5LAo+ICsJCQkJCQkgcmVk X2dyZWVuX2JsdWUsCj4gKwkJCQkJCSBleHBlY3RlZF9jb2xvcnMsIGN0bSk7Cj4gKwkJfQo+ICsJ CWlndF9hc3NlcnQoc3VjY2Vzcyk7Cj4gKwl9Cj4gKwo+ICsJaWd0X3N1YnRlc3RfZigiY3RtLTAt NzUtcGlwZSVkIiwgcCkgewo+ICsJCWNvbG9yX3QgZXhwZWN0ZWRfY29sb3JzW10gPSB7Cj4gKwkJ CXsgMC4wLCB9LCB7IDAuMCwgfSwgeyAwLjAsIH0KPiArCQl9Owo+ICsJCWRvdWJsZSBjdG1bXSA9 IHsgMC43NSwgMC4wLCAgMC4wLAo+ICsJCQkJIDAuMCwgIDAuNzUsIDAuMCwKPiArCQkJCSAwLjAs ICAwLjAsICAwLjc1IH07Cj4gKwkJYm9vbCBzdWNjZXNzID0gZmFsc2U7Cj4gKwo+ICsJCWZvciAo aSA9IDA7IGkgPCA3OyBpKyspIHsKPiArCQkJZXhwZWN0ZWRfY29sb3JzWzBdLnIgPQo+ICsJCQkJ ZXhwZWN0ZWRfY29sb3JzWzFdLmcgPQo+ICsJCQkJZXhwZWN0ZWRfY29sb3JzWzJdLmIgPQo+ICsJ CQkJMC43NSArIGRlbHRhICogKGkgLSAzKTsKPiArCQkJc3VjY2VzcyB8PSB0ZXN0X3BpcGVfY3Rt KGRhdGEsIHByaW1hcnksCj4gKwkJCQkJCSByZWRfZ3JlZW5fYmx1ZSwKPiArCQkJCQkJIGV4cGVj dGVkX2NvbG9ycywgY3RtKTsKPiArCQl9Cj4gKwkJaWd0X2Fzc2VydChzdWNjZXNzKTsKPiArCX0K PiArCj4gKwlpZ3Rfc3VidGVzdF9mKCJjdG0tbWF4LXBpcGUlZCIsIHApIHsKPiArCQljb2xvcl90 IGZ1bGxfcmdiW10gPSB7Cj4gKwkJCXsgMS4wLCAwLjAsIDAuMCB9LAo+ICsJCQl7IDAuMCwgMS4w LCAwLjAgfSwKPiArCQkJeyAwLjAsIDAuMCwgMS4wIH0KPiArCQl9Owo+ICsJCWRvdWJsZSBjdG1b XSA9IHsgMTAwLjAsICAgMC4wLCAgIDAuMCwKPiArCQkJCSAwLjAsICAgMTAwLjAsICAgMC4wLAo+ ICsJCQkJIDAuMCwgICAgIDAuMCwgMTAwLjAgfTsKPiArCj4gKwkJLyogQ2hlcnJ5VmlldyBnZW5l cmF0ZXMgdmFsdWVzIG9uIDEwYml0cyB0aGF0IHdlCj4gKwkJICogcHJvZHVjZSB3aXRoIGFuIDgg Yml0cyBwZXIgY29sb3IgZnJhbWVidWZmZXIuICovCj4gKwkJaWd0X3JlcXVpcmUoIUlTX0NIRVJS WVZJRVcoZGF0YS0+ZGV2aWQpKTsKPiArCj4gKwkJaWd0X2Fzc2VydCh0ZXN0X3BpcGVfY3RtKGRh dGEsIHByaW1hcnksIHJlZF9ncmVlbl9ibHVlLAo+ICsJCQkJCSBmdWxsX3JnYiwgY3RtKSk7Cj4g Kwl9Cj4gKwo+ICsJaWd0X3N1YnRlc3RfZigiY3RtLW5lZ2F0aXZlLXBpcGUlZCIsIHApIHsKPiAr CQljb2xvcl90IGFsbF9ibGFja1tdID0gewo+ICsJCQl7IDAuMCwgMC4wLCAwLjAgfSwKPiArCQkJ eyAwLjAsIDAuMCwgMC4wIH0sCj4gKwkJCXsgMC4wLCAwLjAsIDAuMCB9Cj4gKwkJfTsKPiArCQlk b3VibGUgY3RtW10gPSB7IC0xLjAsICAwLjAsICAwLjAsCj4gKwkJCQkgMC4wLCAtMS4wLCAgMC4w LAo+ICsJCQkJIDAuMCwgIDAuMCwgLTEuMCB9Owo+ICsJCWlndF9hc3NlcnQodGVzdF9waXBlX2N0 bShkYXRhLCBwcmltYXJ5LCByZWRfZ3JlZW5fYmx1ZSwKPiArCQkJCQkgYWxsX2JsYWNrLCBjdG0p KTsKPiArCX0KPiArCj4gKyNpZiAwCj4gKwlpZ3Rfc3VidGVzdF9mKCJjdG0tbGltaXRlZC1yYW5n ZS1waXBlJWQiLCBwKQo+ICsJCXRlc3RfcGlwZV9saW1pdGVkX3JhbmdlX2N0bShkYXRhLCBwcmlt YXJ5KTsKPiArI2VuZGlmCj4gKwo+ICsJaWd0X3N1YnRlc3RfZigiZGVnYW1tYS1waXBlJWQiLCBw KQo+ICsJCXRlc3RfcGlwZV9kZWdhbW1hKGRhdGEsIHByaW1hcnkpOwo+ICsKPiArCWlndF9zdWJ0 ZXN0X2YoImdhbW1hLXBpcGUlZCIsIHApCj4gKwkJdGVzdF9waXBlX2dhbW1hKGRhdGEsIHByaW1h cnkpOwo+ICsKPiArCWlndF9zdWJ0ZXN0X2YoImxlZ2FjeS1nYW1tYS1waXBlJWQiLCBwKQo+ICsJ CXRlc3RfcGlwZV9sZWdhY3lfZ2FtbWEoZGF0YSwgcHJpbWFyeSk7Cj4gKwo+ICsJaWd0X3N1YnRl c3RfZigibGVnYWN5LWdhbW1hLXJlc2V0LXBpcGUlZCIsIHApCj4gKwkJdGVzdF9waXBlX2xlZ2Fj eV9nYW1tYV9yZXNldChkYXRhLCBwcmltYXJ5KTsKPiArCj4gKwlpZ3RfZml4dHVyZSB7Cj4gKwkJ Zm9yX2VhY2hfY29ubmVjdGVkX291dHB1dCgmZGF0YS0+ZGlzcGxheSwgb3V0cHV0KQo+ICsJCQlv dXRwdXRfc2V0X3Byb3BlcnR5X2VudW0ob3V0cHV0LCAiQnJvYWRjYXN0IFJHQiIsICJGdWxsIik7 Cj4gKwo+ICsJCWRpc2FibGVfZGVnYW1tYShwcmltYXJ5LT5waXBlKTsKPiArCQlkaXNhYmxlX2dh bW1hKHByaW1hcnktPnBpcGUpOwo+ICsJCWRpc2FibGVfY3RtKHByaW1hcnktPnBpcGUpOwo+ICsJ CWlndF9kaXNwbGF5X2NvbW1pdCgmZGF0YS0+ZGlzcGxheSk7Cj4gKwo+ICsJCWlndF9waXBlX2Ny Y19mcmVlKGRhdGEtPnBpcGVfY3JjKTsKPiArCQlkYXRhLT5waXBlX2NyYyA9IE5VTEw7Cj4gKwl9 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQKPiArcGlwZV9zZXRfcHJvcGVydHlfYmxvYl9pZChpZ3Rf cGlwZV90ICpwaXBlLCBjb25zdCBjaGFyICpwcm9wZXJ0eSwgdWludDMyX3QgYmxvYl9pZCkKPiAr ewo+ICsJdWludDMyX3QgcHJvcF9pZDsKPiArCj4gKwlpZ3RfYXNzZXJ0KGttc3Rlc3RfZ2V0X3By b3BlcnR5KHBpcGUtPmRpc3BsYXktPmRybV9mZCwKPiArCQkJCQlwaXBlLT5jcnRjX2lkLAo+ICsJ CQkJCURSTV9NT0RFX09CSkVDVF9DUlRDLAo+ICsJCQkJCXByb3BlcnR5LAo+ICsJCQkJCSZwcm9w X2lkLCBOVUxMLCBOVUxMKSk7Cj4gKwo+ICsJcmV0dXJuIGRybU1vZGVPYmplY3RTZXRQcm9wZXJ0 eShwaXBlLT5kaXNwbGF5LT5kcm1fZmQsCj4gKwkJCQkJcGlwZS0+Y3J0Y19pZCwKPiArCQkJCQlE Uk1fTU9ERV9PQkpFQ1RfQ1JUQywKPiArCQkJCQlwcm9wX2lkLCBibG9iX2lkKTsKPiArfQo+ICsK PiArc3RhdGljIGludAo+ICtwaXBlX3NldF9wcm9wZXJ0eV9ibG9iKGlndF9waXBlX3QgKnBpcGUs IGNvbnN0IGNoYXIgKnByb3BlcnR5LCB2b2lkICpwdHIsIHNpemVfdCBsZW5ndGgpCj4gK3sKPiAr CWludCByZXQgPSAwOwo+ICsJdWludDMyX3QgYmxvYl9pZCA9IDA7Cj4gKwo+ICsJaWYgKGxlbmd0 aCA+IDApCj4gKwkJaWd0X2Fzc2VydF9lcShkcm1Nb2RlQ3JlYXRlUHJvcGVydHlCbG9iKHBpcGUt PmRpc3BsYXktPmRybV9mZCwKPiArCQkJCQkJCXB0ciwgbGVuZ3RoLAo+ICsJCQkJCQkJJmJsb2Jf aWQpLCAwKTsKPiArCj4gKwlyZXQgPSBwaXBlX3NldF9wcm9wZXJ0eV9ibG9iX2lkKHBpcGUsIHBy b3BlcnR5LCBibG9iX2lkKTsKPiArCj4gKwlpZiAoYmxvYl9pZCAhPSAwKQo+ICsJCWlndF9hc3Nl cnRfZXEoZHJtTW9kZURlc3Ryb3lQcm9wZXJ0eUJsb2IocGlwZS0+ZGlzcGxheS0+ZHJtX2ZkLCBi bG9iX2lkKSwgMCk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQK PiAraW52YWxpZF9sdXRfc2l6ZXMoZGF0YV90ICpkYXRhKQo+ICt7Cj4gKwlpZ3RfcGlwZV90ICpw aXBlID0gJmRhdGEtPmRpc3BsYXkucGlwZXNbMF07Cj4gKwlzaXplX3QgZGVnYW1tYV9sdXRfc2l6 ZSA9IGRhdGEtPmRlZ2FtbWFfbHV0X3NpemUgKiBzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfbHV0 KTsKPiArCXNpemVfdCBnYW1tYV9sdXRfc2l6ZSA9IGRhdGEtPmdhbW1hX2x1dF9zaXplICogc2l6 ZW9mKHN0cnVjdCBfZHJtX2NvbG9yX2x1dCk7Cj4gKwo+ICsJc3RydWN0IF9kcm1fY29sb3JfbHV0 ICpkZWdhbW1hX2x1dCA9IG1hbGxvYyhkYXRhLT5kZWdhbW1hX2x1dF9zaXplICogc2l6ZW9mKHN0 cnVjdCBfZHJtX2NvbG9yX2x1dCkgKiAyKTsKPiArCXN0cnVjdCBfZHJtX2NvbG9yX2x1dCAqZ2Ft bWFfbHV0ID0gbWFsbG9jKGRhdGEtPmdhbW1hX2x1dF9zaXplICogc2l6ZW9mKHN0cnVjdCBfZHJt X2NvbG9yX2x1dCkgKiAyKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2VxKHBpcGVfc2V0X3Byb3BlcnR5 X2Jsb2IocGlwZSwgIkRFR0FNTUFfTFVUIiwKPiArCQkJCQkgICAgIGRlZ2FtbWFfbHV0LCAxKSwg LUVJTlZBTCk7Cj4gKwlpZ3RfYXNzZXJ0X2VxKHBpcGVfc2V0X3Byb3BlcnR5X2Jsb2IocGlwZSwg IkRFR0FNTUFfTFVUIiwKPiArCQkJCQkgICAgIGRlZ2FtbWFfbHV0LCBkZWdhbW1hX2x1dF9zaXpl ICsgMSksCj4gKwkJICAgICAgLUVJTlZBTCk7Cj4gKwlpZ3RfYXNzZXJ0X2VxKHBpcGVfc2V0X3By b3BlcnR5X2Jsb2IocGlwZSwgIkRFR0FNTUFfTFVUIiwKPiArCQkJCQkgICAgIGRlZ2FtbWFfbHV0 LCBkZWdhbW1hX2x1dF9zaXplIC0gMSksCj4gKwkJICAgICAgLUVJTlZBTCk7Cj4gKwlpZ3RfYXNz ZXJ0X2VxKHBpcGVfc2V0X3Byb3BlcnR5X2Jsb2IocGlwZSwgIkRFR0FNTUFfTFVUIiwKPiArCQkJ CQkgICAgIGRlZ2FtbWFfbHV0LCBkZWdhbW1hX2x1dF9zaXplICsgc2l6ZW9mKHN0cnVjdCBfZHJt X2NvbG9yX2x1dCkpLAo+ICsJCSAgICAgIC1FSU5WQUwpOwo+ICsJaWd0X2Fzc2VydF9lcShwaXBl X3NldF9wcm9wZXJ0eV9ibG9iX2lkKHBpcGUsICJERUdBTU1BX0xVVCIsIHBpcGUtPmNydGNfaWQp LAo+ICsJCSAgICAgIC1FSU5WQUwpOwo+ICsJaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0 eV9ibG9iX2lkKHBpcGUsICJERUdBTU1BX0xVVCIsIDQwOTYgKiA0MDk2KSwKPiArCQkgICAgICAt RUlOVkFMKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2VxKHBpcGVfc2V0X3Byb3BlcnR5X2Jsb2IocGlw ZSwgIkdBTU1BX0xVVCIsCj4gKwkJCQkJICAgICBnYW1tYV9sdXQsIDEpLAo+ICsJCSAgICAgIC1F SU5WQUwpOwo+ICsJaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iKHBpcGUsICJH QU1NQV9MVVQiLAo+ICsJCQkJCSAgICAgZ2FtbWFfbHV0LCBnYW1tYV9sdXRfc2l6ZSArIDEpLAo+ ICsJCSAgICAgIC1FSU5WQUwpOwo+ICsJaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0eV9i bG9iKHBpcGUsICJHQU1NQV9MVVQiLAo+ICsJCQkJCSAgICAgZ2FtbWFfbHV0LCBnYW1tYV9sdXRf c2l6ZSAtIDEpLAo+ICsJCSAgICAgIC1FSU5WQUwpOwo+ICsJaWd0X2Fzc2VydF9lcShwaXBlX3Nl dF9wcm9wZXJ0eV9ibG9iKHBpcGUsICJHQU1NQV9MVVQiLAo+ICsJCQkJCSAgICAgZ2FtbWFfbHV0 LCBnYW1tYV9sdXRfc2l6ZSArIHNpemVvZihzdHJ1Y3QgX2RybV9jb2xvcl9sdXQpKSwKPiArCQkg ICAgICAtRUlOVkFMKTsKPiArCWlndF9hc3NlcnRfZXEocGlwZV9zZXRfcHJvcGVydHlfYmxvYl9p ZChwaXBlLCAiR0FNTUFfTFVUIiwgcGlwZS0+Y3J0Y19pZCksCj4gKwkJICAgICAgLUVJTlZBTCk7 Cj4gKwlpZ3RfYXNzZXJ0X2VxKHBpcGVfc2V0X3Byb3BlcnR5X2Jsb2JfaWQocGlwZSwgIkdBTU1B X0xVVCIsIDQwOTYgKiA0MDk2KSwKPiArCQkgICAgICAtRUlOVkFMKTsKPiArCj4gKwlmcmVlKGRl Z2FtbWFfbHV0KTsKPiArCWZyZWUoZ2FtbWFfbHV0KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQK PiAraW52YWxpZF9jdG1fbWF0cml4X3NpemVzKGRhdGFfdCAqZGF0YSkKPiArewo+ICsJaWd0X3Bp cGVfdCAqcGlwZSA9ICZkYXRhLT5kaXNwbGF5LnBpcGVzWzBdOwo+ICsJdm9pZCAqcHRyID0gbWFs bG9jKHNpemVvZihzdHJ1Y3QgX2RybV9jb2xvcl9jdG0pICogNCk7Cj4gKwo+ICsJaWd0X2Fzc2Vy dF9lcShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iKHBpcGUsICJDVE0iLCBwdHIsIDEpLAo+ICsJCSAg ICAgIC1FSU5WQUwpOwo+ICsJaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iKHBp cGUsICJDVE0iLCBwdHIsCj4gKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfY3Rt KSArIDEpLAo+ICsJCSAgICAgIC1FSU5WQUwpOwo+ICsJaWd0X2Fzc2VydF9lcShwaXBlX3NldF9w cm9wZXJ0eV9ibG9iKHBpcGUsICJDVE0iLCBwdHIsCj4gKwkJCQkJICAgICBzaXplb2Yoc3RydWN0 IF9kcm1fY29sb3JfY3RtKSAtIDEpLAo+ICsJCSAgICAgIC1FSU5WQUwpOwo+ICsJaWd0X2Fzc2Vy dF9lcShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iKHBpcGUsICJDVE0iLCBwdHIsCj4gKwkJCQkJICAg ICBzaXplb2Yoc3RydWN0IF9kcm1fY29sb3JfY3RtKSAqIDIpLAo+ICsJCSAgICAgIC1FSU5WQUwp Owo+ICsJaWd0X2Fzc2VydF9lcShwaXBlX3NldF9wcm9wZXJ0eV9ibG9iX2lkKHBpcGUsICJDVE0i LCBwaXBlLT5jcnRjX2lkKSwKPiArCQkgICAgICAtRUlOVkFMKTsKPiArCWlndF9hc3NlcnRfZXEo cGlwZV9zZXRfcHJvcGVydHlfYmxvYl9pZChwaXBlLCAiQ1RNIiwgNDA5NiAqIDQwOTYpLAo+ICsJ CSAgICAgIC1FSU5WQUwpOwo+ICsKPiArCWZyZWUocHRyKTsKPiArfQo+ICsKPiAraWd0X21haW4K PiArewo+ICsJZGF0YV90IGRhdGEgPSB7fTsKPiArCj4gKwlpZ3Rfc2tpcF9vbl9zaW11bGF0aW9u KCk7Cj4gKwo+ICsJaWd0X2ZpeHR1cmUgewo+ICsJCWRhdGEuZHJtX2ZkID0gZHJtX29wZW5fZHJp dmVyX21hc3RlcihEUklWRVJfSU5URUwpOwo+ICsJCWRhdGEuZGV2aWQgPSBpbnRlbF9nZXRfZHJt X2RldmlkKGRhdGEuZHJtX2ZkKTsKPiArCQlrbXN0ZXN0X3NldF92dF9ncmFwaGljc19tb2RlKCk7 Cj4gKwo+ICsJCWlndF9kaXNwbGF5X2luaXQoJmRhdGEuZGlzcGxheSwgZGF0YS5kcm1fZmQpOwo+ ICsJfQo+ICsKPiArCWZvciAoaW50IHBpcGUgPSAwOyBwaXBlIDwgSTkxNV9NQVhfUElQRVM7IHBp cGUrKykKPiArCQlydW5fdGVzdHNfZm9yX3BpcGUoJmRhdGEsIHBpcGUpOwo+ICsKPiArCWlndF9z dWJ0ZXN0X2YoImludmFsaWQtbHV0LXNpemVzIikKPiArCQlpbnZhbGlkX2x1dF9zaXplcygmZGF0 YSk7Cj4gKwo+ICsJaWd0X3N1YnRlc3RfZigiaW52YWxpZC1jdG0tbWF0cml4LXNpemVzIikKPiAr CQlpbnZhbGlkX2N0bV9tYXRyaXhfc2l6ZXMoJmRhdGEpOwo+ICsKPiArCWlndF9maXh0dXJlIHsK PiArCQlpZ3RfZGlzcGxheV9maW5pKCZkYXRhLmRpc3BsYXkpOwo+ICsJfQo+ICt9Cj4gLS0gCj4g Mi44LjEKPiAKPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Xwo+IEludGVsLWdmeCBtYWlsaW5nIGxpc3QKPiBJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRl bC1nZngKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3Jh dGlvbgpodHRwOi8vYmxvZy5mZndsbC5jaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9pbnRlbC1nZngK