From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mblankhorst.nl (mblankhorst.nl [IPv6:2a02:2308::216:3eff:fe92:dfa3]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9504B6E8A6 for ; Fri, 29 Mar 2019 10:35:29 +0000 (UTC) From: Maarten Lankhorst Date: Fri, 29 Mar 2019 11:35:26 +0100 Message-Id: <20190329103526.12364-2-maarten.lankhorst@linux.intel.com> In-Reply-To: <20190329103526.12364-1-maarten.lankhorst@linux.intel.com> References: <20190329103526.12364-1-maarten.lankhorst@linux.intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t 2/2] otests/kms_yuv: Add yuv specific tests, v5. List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org List-ID: QWRkIHRlc3RzIGV4Y2VyY2lzaW5nIHN3aXRjaGluZyBiZXR3ZWVuIHZhcmlvdXMgc2NhbGVkL3Vu c2NhbGVkCnRyYW5zaXRpb25zIHRvIGFuZCBmcm9tIHZhcmlvdXMgbnYxMiBmb3JtYXRzLCBzaW5j ZSBzb21lIG9mIHRoZQp3b3JrYXJvdW5kcyBtZW50aW9uIHRoaXMgbWF5IGZhaWwuCgpXZSBhbHNv IGFkZCBOVjEyIHNwZWNpZmljIGNsaXBwaW5nL3NjYWxpbmcgdGVzdHMsIHRvIG1ha2Ugc3VyZQp0 aGF0IFlVViBzcmMgY29vcmRpbmF0ZXMgYXJlIGFsd2F5cyBwcm9ncmFtbWVkIGFzIGEgbXVsdGlw bGUgb2YgMgpjb3JyZWN0bHksIGFuZCB2ZXJpZnkgc2NhbGluZy9jbGlwcGluZyB3b3JrcyB3aXRo IENSQyB0ZXN0cy4KCmNyb3Atc2NhbGUtYnVnIHNob3dzIGEgY29ycnVwdGlvbiB3aGVuIHNjYWxp bmcgYW5kIGNyb3BwaW5nIGF0IHRoZQpzYW1lIHRpbWUuCgpUaGUgc3VicGl4ZWwgY2xpcCB0ZXN0 IHJvdGF0ZXMgYW5kIGNsaXBzIGEgcmVjdGFuZ2xlIG9uIGVhY2ggc2lkZSwKd2hpY2ggc2hvdWxk IHByb2R1Y2UgdGhlIHNhbWUgQ1JDIGFzIHdoZW4gdGhhdCBwYXJ0IG9mIHRoZSByZWN0YW5nbGUK aXMgaGlkZGVuIGJ5IGEgY3Vyc29yIGFuZCBhIHdob2xlIDJ4MiBwaXhlbCBpcyBoaWRkZW4uCgpD aGFuZ2VzIHNpbmNlIHYxOgotIFJlc2V0IHBsYW5lIHBvc2l0aW9uIHRvIDAsMCBhdCB0aGUgc3Rh cnQgb2YgeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKCkuCi0gSGFuZGxlIFN3YXRpJ3MgZmVlZGJhY2su CkNoYW5nZXMgc2luY2UgdjI6Ci0gU2tpcCA5MMKwLzI3MMKwIHJvdGF0aW9uIGluIHRlc3RzIHdo ZW4gZm9ybWF0cyBkb24ndCBzdXBwb3J0IGl0LgotIEFkZCBhbGwgbmV3IEhEUiBmb3JtYXRzIHRv IHRlc3QuCi0gVXNlIGlndF9wbGFuZV9oYXNfZm9ybWF0X21vZC4KLSBTdXBwb3J0IHRlc3RzIG9u ICFpOTE1IGJ5IGNoZWNraW5nIGlmIFgvWSB0aWxpbmcgbW9kaWZpZXJzIGFyZSBzdXBwb3J0ZWQu Ci0gRG8gbm90IGVuYWJsZSB1bnRlc3RlZCBwbGFuZXMgdG8gcHJldmVudCBleGhhdXNpbmcgbWVt b3J5IGJhbmR3aWR0aAogIGFuZCBhdmFpbGFibGUgTlYxMiBZIHBsYW5lcyBpbiB0aGUgcmdiLXN3 aXRjaC1zY2FsZWQgdGVzdC4KQ2hhbmdlcyBzaW5jZSB2MzoKLSBBZGQgYSBzYW5pdHkgdGVzdCB0 byBzYW5pdHkgdGVzdCBZVVYgY29udmVyc2lvbiBwYXRocywgb24gYWxsIHBsYW5lcyBhbmQgcGlw ZXMuCi0gRHluYW1pY2FsbHkgZ2VuZXJhdGUgbGlzdCBvZiBZVVYgdGVzdHMgdGhyb3VnaCBpZ3Rf Zm9ybWF0X2FycmF5X2ZpbGwuCkNoYW5nZXMgc2luY2UgdjQ6Ci0gRGVjcmVhc2Ugc2l6ZSB0byA2 NHg2NCB0byByZWR1Y2UgdGVzdCBleGVjdXRpb24gdGltZSBldmVuIG1vcmUsCiAgc29tZSBZVVYg Y29udmVyc2lvbiByb3V0aW5lcyBhcmUgc2xvdy4KLSBEb24ndCBjbGVhciBkZWdhbW1hL2N0bSwg dGhpcyBpcyBkb25lIGluIGNvcmUgbm93LgoKU2lnbmVkLW9mZi1ieTogTWFhcnRlbiBMYW5raG9y c3QgPG1hYXJ0ZW4ubGFua2hvcnN0QGxpbnV4LmludGVsLmNvbT4KLS0tCiB0ZXN0cy9NYWtlZmls ZS5zb3VyY2VzIHwgICAxICsKIHRlc3RzL2ttc195dXYuYyAgICAgICAgfCA5MzYgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHRlc3RzL21lc29uLmJ1aWxkICAgICAg fCAgIDEgKwogMyBmaWxlcyBjaGFuZ2VkLCA5MzggaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUg MTAwNjQ0IHRlc3RzL2ttc195dXYuYwoKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLnNvdXJj ZXMgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IDcxY2NmMDBhZjI1Ni4uNWViNDYwODdl MzYyIDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01ha2Vm aWxlLnNvdXJjZXMKQEAgLTc0LDYgKzc0LDcgQEAgVEVTVFNfcHJvZ3MgPSBcCiAJa21zX3VuaXZl cnNhbF9wbGFuZSBcCiAJa21zX3ZibGFuayBcCiAJa21zX3ZyciBcCisJa21zX3l1diBcCiAJbWV0 YV90ZXN0IFwKIAlwZXJmIFwKIAlwZXJmX3BtdSBcCmRpZmYgLS1naXQgYS90ZXN0cy9rbXNfeXV2 LmMgYi90ZXN0cy9rbXNfeXV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAwLi44YzMzNzZiOTdjMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXNfeXV2LmMKQEAg LTAsMCArMSw5MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOSBJbnRlbCBDb3Jwb3JhdGlv bgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFz c29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVh bCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQg bGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1 Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2Yg dGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3 YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRp dGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlz c2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3Rh bnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQ Uk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9S CisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVT IE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF IEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBP UiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBP VEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9S VCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9O IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRI RSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgTWFhcnRlbiBMYW5raG9yc3QgPG1h YXJ0ZW4ubGFua2hvcnN0QGxpbnV4LmludGVsLmNvbT4KKyAqLworI2luY2x1ZGUgImNvbmZpZy5o IgorCisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxlcnJu by5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUg PHN5cy90aW1lLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpZ3RfZGlzcGxheV90IGRpc3BsYXk7 CisKKwlpZ3RfcGlwZV9jcmNfdCAqcGlwZV9jcmM7CisJc3RydWN0IGlndF9mYiBmYls2XTsKK30g ZGF0YV90OworCitzdGF0aWMgdWludDY0X3QgeF9tb2RpZmllciA9IExPQ0FMX0RSTV9GT1JNQVRf TU9EX05PTkU7CitzdGF0aWMgdWludDY0X3QgeV9tb2RpZmllciA9IExPQ0FMX0RSTV9GT1JNQVRf TU9EX05PTkU7CitzdGF0aWMgdWludDMyX3QgKmZvcm1hdHMsIGNvdW50X2Zvcm1hdHM7CisKK3N0 YXRpYyBib29sIHBpcGVfc3VwcG9ydHNfZm9ybWF0KGlndF9kaXNwbGF5X3QgKmRpc3BsYXksIGVu dW0gcGlwZSBwaXBlLAorCQkJCSB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHRpbGluZykKK3sK KwlpZ3RfcGxhbmVfdCAqcGxhbmU7CisKKwlmb3JfZWFjaF9wbGFuZV9vbl9waXBlKGRpc3BsYXks IHBpcGUsIHBsYW5lKQorCQlpZiAoaWd0X3BsYW5lX2hhc19mb3JtYXRfbW9kKHBsYW5lLCBmb3Jt YXQsIHRpbGluZykpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworCitz dGF0aWMgdm9pZCByZW1vdmVfZmJzKGRhdGFfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPmZiKTsgaSsrKQorCQlpZ3RfcmVtb3ZlX2ZiKGRh dGEtPmRpc3BsYXkuZHJtX2ZkLCAmZGF0YS0+ZmJbaV0pOworfQorCitzdGF0aWMgdm9pZCBwcmVw YXJlX2NydGMoZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlwZSwgaWd0X291dHB1dF90ICpvdXRw dXQpCit7CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCisJcmVt b3ZlX2ZicyhkYXRhKTsKKwlpZ3RfZGlzcGxheV9yZXNldChkaXNwbGF5KTsKKwlpZ3Rfb3V0cHV0 X3NldF9waXBlKG91dHB1dCwgcGlwZSk7CisJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBD T01NSVRfQVRPTUlDKTsKKworCWlndF9waXBlX2NyY19mcmVlKGRhdGEtPnBpcGVfY3JjKTsKKwlk YXRhLT5waXBlX2NyYyA9IGlndF9waXBlX2NyY19uZXcoZGlzcGxheS0+ZHJtX2ZkLCBwaXBlLAor CQkJCQkgIElOVEVMX1BJUEVfQ1JDX1NPVVJDRV9BVVRPKTsKK30KKworc3RhdGljIHZvaWQgZnVk Z2VfbHV0KGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIHVpbnQxNl90IG1hc2spCit7CisJ aWd0X3BpcGVfdCAqcGlwZV9vYmogPSAmZGF0YS0+ZGlzcGxheS5waXBlc1twaXBlXTsKKwl1aW50 MTZfdCAqbHV0OworCWludCBpLCBsdXRfc2l6ZTsKKworCWlmICghaWd0X3BpcGVfb2JqX2hhc19w cm9wKHBpcGVfb2JqLCBJR1RfQ1JUQ19HQU1NQV9MVVRfU0laRSkpCisJCXJldHVybjsKKworCWx1 dF9zaXplID0gaWd0X3BpcGVfb2JqX2dldF9wcm9wKHBpcGVfb2JqLCBJR1RfQ1JUQ19HQU1NQV9M VVRfU0laRSk7CisKKwlsdXQgPSBtYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIGx1dF9zaXplKTsK Kwlmb3IgKGkgPSAwOyBpIDwgbHV0X3NpemU7IGkrKykKKwkJbHV0W2ldID0gKGkgKiAweGZmZmYg LyAobHV0X3NpemUgLSAxKSkgJiBtYXNrOworCisJaWd0X3BpcGVfb2JqX3JlcGxhY2VfcHJvcF9i bG9iKHBpcGVfb2JqLCBJR1RfQ1JUQ19HQU1NQV9MVVQsIGx1dCwgbHV0X3NpemUgKiBzaXplb2Yo dWludDE2X3QpKTsKKwlmcmVlKGx1dCk7Cit9CisKK3N0YXRpYyB2b2lkIHVuZnVkZ2VfbHV0KGRh dGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUpCit7CisJaWd0X3BpcGVfdCAqcGlwZV9vYmogPSAm ZGF0YS0+ZGlzcGxheS5waXBlc1twaXBlXTsKKworCWlmIChpZ3RfcGlwZV9vYmpfaGFzX3Byb3Ao cGlwZV9vYmosIElHVF9DUlRDX0dBTU1BX0xVVCkpCisJCWlndF9waXBlX29ial9yZXBsYWNlX3By b3BfYmxvYihwaXBlX29iaiwgSUdUX0NSVENfR0FNTUFfTFVULCBOVUxMLCAwKTsKK30KKworLyoK KyAqIFRlc3QgdGhhdCB3ZSBpbml0aWFsaXplIGEgWVVWIGZiIGFzIGJsYWNrIGNvcnJlY3RseSwK KyAqIHRoYXQgd2hlbiB3ZSB3cml0ZSBhIGJsYWNrIEZCIGl0IHdpbGwgZ2V0IHRoZSBzYW1lIENS QywgYW5kIHRoYXQKKyAqIGFsbCBjb2xvcnMgd2UgdGVzdCB3aWxsIGdpdmUgdGhlIHNhbWUgQ1JD IG9uIGFsbCBmb3JtYXRzLgorICovCitzdGF0aWMgdm9pZCB5dXZfc2FuaXR5KGRhdGFfdCAqZGF0 YSwgZW51bSBwaXBlIHBpcGUsIGlndF9vdXRwdXRfdCAqb3V0cHV0KQoreworCWlndF9kaXNwbGF5 X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfcGxhbmVfdCAqcGxhbmU7CisJaWd0 X2NyY190IGJsYWNrX2NyYywgY29sb3JfY3JjLCBjcmM7CisJYm9vbCBmaXJzdCA9IHRydWU7CisK KwlwcmVwYXJlX2NydGMoZGF0YSwgcGlwZSwgb3V0cHV0KTsKKworCWZvcl9lYWNoX3BsYW5lX29u X3BpcGUoZGlzcGxheSwgcGlwZSwgcGxhbmUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3Vu dF9mb3JtYXRzOyBpKyspIHsKKwkJCXN0cnVjdCBpZ3RfZmIgKmZiID0gJmRhdGEtPmZiWzBdOwor CQkJY2Fpcm9fdCAqY3I7CisKKwkJCWlmICghaWd0X2Zvcm1hdF9pc195dXYoZm9ybWF0c1tpXSkg fHwKKwkJCSAgICAhaWd0X3BsYW5lX2hhc19mb3JtYXRfbW9kKHBsYW5lLCBmb3JtYXRzW2ldLCB4 X21vZGlmaWVyKSkKKwkJCQljb250aW51ZTsKKworCQkJaWd0X2RlYnVnKCJUZXN0aW5nICVzIGZv cm1hdCAlLjRzIG9uIHBsYW5lICVpXG4iLAorCQkJCSAoY2hhciAqKSZmb3JtYXRzW2ldLCBwbGFu ZS0+aW5kZXgpOworCQkJaWd0X2NyZWF0ZV9mYihkaXNwbGF5LT5kcm1fZmQsIDY0LCA2NCwgZm9y bWF0c1tpXSwKKwkJCQkgICAgICB4X21vZGlmaWVyLCBmYik7CisKKwkJCWlndF9wbGFuZV9zZXRf ZmIocGxhbmUsIGZiKTsKKwkJCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FU T01JQyk7CisJCQlpZiAoIWZpcnN0KSB7CisJCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRh dGEtPnBpcGVfY3JjLCAmY3JjKTsKKwkJCQlpZ3RfYXNzZXJ0X2NyY19lcXVhbCgmYmxhY2tfY3Jj LCAmY3JjKTsKKwkJCX0gZWxzZSB7CisJCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEt PnBpcGVfY3JjLCAmYmxhY2tfY3JjKTsKKwkJCX0KKworCQkJLyogQ29tcGFyZSBpbml0aWFsIGJs YWNrIGZiIHdpdGggcmVmZXJlbmNlIHBhaW50ZWQgYmxhY2sgY29sb3IgKi8KKwkJCWNyID0gaWd0 X2dldF9jYWlyb19jdHgoZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlpZ3RfcGFpbnRfY29sb3Io Y3IsIDAsIDAsIGZiLT53aWR0aCwgZmItPmhlaWdodCwgMC4sIDAuLCAwLik7CisJCQlpZ3RfcHV0 X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGZiLCBjcik7CisJCQlpZ3RfZGlydHlfZmIoZGlz cGxheS0+ZHJtX2ZkLCBmYik7CisJCQlpZ3Rfd2FpdF9mb3JfdmJsYW5rKGRpc3BsYXktPmRybV9m ZCwgcGlwZSk7CisJCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMsICZj cmMpOworCQkJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmJsYWNrX2NyYywgJmNyYyk7CisKKworCQkJ LyogV3JpdGUgYSBjb2xvciBmYiAqLworCQkJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChkaXNwbGF5 LT5kcm1fZmQsIGZiKTsKKwkJCWlndF9wYWludF9jb2xvcihjciwgMCwgMCwgZmItPndpZHRoLCBm Yi0+aGVpZ2h0LCAxLiwgMS4sIDAuKTsKKwkJCWlndF9wdXRfY2Fpcm9fY3R4KGRpc3BsYXktPmRy bV9mZCwgZmIsIGNyKTsKKwkJCWZ1ZGdlX2x1dChkYXRhLCBwaXBlLCAweGZjMDApOworCQkJaWd0 X3BsYW5lX3NldF9mYihwbGFuZSwgZmIpOworCQkJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5 LCBDT01NSVRfQVRPTUlDKTsKKworCQkJaWYgKCFmaXJzdCkgeworCQkJCWlndF9waXBlX2NyY19j b2xsZWN0X2NyYyhkYXRhLT5waXBlX2NyYywgJmNyYyk7CisJCQkJaWd0X2Fzc2VydF9jcmNfZXF1 YWwoJmNvbG9yX2NyYywgJmNyYyk7CisJCQl9IGVsc2UgeworCQkJCWlndF9waXBlX2NyY19jb2xs ZWN0X2NyYyhkYXRhLT5waXBlX2NyYywgJmNvbG9yX2NyYyk7CisJCQkJZmlyc3QgPSBmYWxzZTsK KwkJCX0KKworCQkJLyogQ29udmVydCBmcm9tIFlVViwgYmFjayB0byBZVVYsIHRvIGV4cG9zZSBi dWdzIGluIGNvbnZlcnNpb24gcm91dGluZXMgKi8KKwkJCWNyID0gaWd0X2dldF9jYWlyb19jdHgo ZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlpZ3RfcHV0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1f ZmQsIGZiLCBjcik7CisJCQlpZ3RfZGlydHlfZmIoZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlp Z3Rfd2FpdF9mb3JfdmJsYW5rKGRpc3BsYXktPmRybV9mZCwgcGlwZSk7CisJCQlpZ3RfcGlwZV9j cmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMsICZjcmMpOworCQkJaWd0X2Fzc2VydF9jcmNf ZXF1YWwoJmNvbG9yX2NyYywgJmNyYyk7CisKKwkJCXVuZnVkZ2VfbHV0KGRhdGEsIHBpcGUpOwor CQkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgTlVMTCk7CisJCQlpZ3RfcmVtb3ZlX2ZiKGRpc3Bs YXktPmRybV9mZCwgJmRhdGEtPmZiWzBdKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2V0 X2ZiKGlndF9wbGFuZV90ICpwbGFuZSwgc3RydWN0IGlndF9mYiAqZmIsCisJCSAgIGJvb2wgc2Nh bGVkLCBpZ3Rfcm90YXRpb25fdCByb3QpCit7CisJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgZmIp OworCisJaWYgKHNjYWxlZCAmJiBmYikKKwkJaWd0X2ZiX3NldF9zaXplKGZiLCBwbGFuZSwgZmIt PndpZHRoLCAxNik7CisKKwlpZ3RfcGxhbmVfc2V0X3JvdGF0aW9uKHBsYW5lLCByb3QpOworCWlm IChmYiAmJiAocm90ID09IElHVF9ST1RBVElPTl85MCB8fCByb3QgPT0gSUdUX1JPVEFUSU9OXzI3 MCkpCisJCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgZmItPmhlaWdodCwgZmItPndpZHRoKTsK K30KKworc3RhdGljIHZvaWQgeXV2X3JnYl9zd2l0Y2goZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUg cGlwZSwKKwkJCSAgIGlndF9vdXRwdXRfdCAqb3V0cHV0LCBib29sIHNjYWxlZCwgdW5zaWduZWQg Zm9ybWF0KQoreworCWRybU1vZGVNb2RlSW5mbyAqbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUo b3V0cHV0KTsKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisJaWd0 X3BsYW5lX3QgKnBsYW5lOworCWludCBpOworCWlndF9jcmNfdCByZWZfY3JjWzRdLCBjcmM7CisJ Ym9vbCB2YWxpZFs0XSA9IHt9OworCisJcHJlcGFyZV9jcnRjKGRhdGEsIHBpcGUsIG91dHB1dCk7 CisKKwlpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGlzcGxheS0+ZHJtX2ZkLCBtb2RlLT5oZGlzcGxh eSwgbW9kZS0+dmRpc3BsYXksCisJCQkgICAgICBmb3JtYXQsIHhfbW9kaWZpZXIsICZkYXRhLT5m YlswXSk7CisKKwlpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGlzcGxheS0+ZHJtX2ZkLCBtb2RlLT52 ZGlzcGxheSwgbW9kZS0+aGRpc3BsYXksCisJCQkgICAgICBmb3JtYXQsIHlfbW9kaWZpZXIsICZk YXRhLT5mYlsxXSk7CisKKwlpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGlzcGxheS0+ZHJtX2ZkLCBt b2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3BsYXksCisJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4 ODg4LCB4X21vZGlmaWVyLCAmZGF0YS0+ZmJbMl0pOworCisJaWd0X2NyZWF0ZV9wYXR0ZXJuX2Zi KGRpc3BsYXktPmRybV9mZCwgbW9kZS0+dmRpc3BsYXksIG1vZGUtPmhkaXNwbGF5LAorCQkJICAg ICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwgeV9tb2RpZmllciwgJmRhdGEtPmZiWzNdKTsKKworCWZv cl9lYWNoX3BsYW5lX29uX3BpcGUoZGlzcGxheSwgcGlwZSwgcGxhbmUpIHsKKwkJY29uc3QgaW50 IHNlcVtdID0geworCQkJMiwgMCwgMiwgMSwgMywgMSwgMworCQl9OworCisJCWlmICghaWd0X3Bs YW5lX2hhc19mb3JtYXRfbW9kKHBsYW5lLCBmb3JtYXQsIGRhdGEtPmZiWzBdLm1vZGlmaWVyKSkK KwkJCWNvbnRpbnVlOworCisJCS8qIENvbGxlY3QgcmVmZXJlbmNlIGNyYyB3aXRoIHRvZ2dsZSBp biBiZXR3ZWVuLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWZfY3JjKTsgaSsr KSB7CisJCQlpZ3Rfcm90YXRpb25fdCByb3QgPSAoaSA9PSAxIHx8IGkgPT0gMykgPworCQkJCUlH VF9ST1RBVElPTl85MCA6IElHVF9ST1RBVElPTl8wOworCisJCQlzZXRfZmIocGxhbmUsICZkYXRh LT5mYltpXSwgc2NhbGVkLCByb3QpOworCisJCQlpZ3RfZGlzcGxheV9jb21taXQyKGRpc3BsYXks IENPTU1JVF9BVE9NSUMpOworCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVf Y3JjLCAmcmVmX2NyY1tpXSk7CisJCQl2YWxpZFtpXSA9IHRydWU7CisKKwkJCXNldF9mYihwbGFu ZSwgTlVMTCwgc2NhbGVkLCByb3QpOworCQkJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBD T01NSVRfQVRPTUlDKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlcSk7 IGkrKykgeworCQkJaW50IGogPSBzZXFbaV07CisJCQlpZ3Rfcm90YXRpb25fdCByb3QgPSAoaiA9 PSAxIHx8IGogPT0gMykgPworCQkJCUlHVF9ST1RBVElPTl85MCA6IElHVF9ST1RBVElPTl8wOwor CisJCQlpZiAoIXZhbGlkW2pdKQorCQkJCWNvbnRpbnVlOworCisJCQlzZXRfZmIocGxhbmUsICZk YXRhLT5mYltqXSwgc2NhbGVkLCByb3QpOworCQkJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5 LCBDT01NSVRfQVRPTUlDKTsKKworCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBp cGVfY3JjLCAmY3JjKTsKKwkJCWlndF9hc3NlcnRfY3JjX2VxdWFsKCZyZWZfY3JjW2pdLCAmY3Jj KTsKKwkJfQorCisJCS8qIFdlIG9ubHkgaGF2ZSBmZXcgc2NhbGVycywgZG9uJ3QgdXNlIDEgZm9y IHVudXNlZCBwbGFuZXMgKi8KKwkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgTlVMTCk7CisJfQor fQorCisjZGVmaW5lIGFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKHBpcGVfY3JjLCBjcmMsIHJl Zl9jcmMpIFwKKwlkbyB7IFwKKwkJaWd0X3BpcGVfY3JjX2dldF9jdXJyZW50KGRpc3BsYXktPmRy bV9mZCwgcGlwZV9jcmMsIGNyYyk7CVwKKwkJaWd0X2Fzc2VydF9jcmNfZXF1YWwocmVmX2NyYywg Y3JjKTsJXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHNldF9zcmNfY29vcmRzKGlndF9w bGFuZV90ICpwbGFuZSwgc3RydWN0IGlndF9mYiAqZmIsCisJCQkgICBpZ3Rfcm90YXRpb25fdCBy b3QsIGludCB2aXMsIGludCBoaWRkZW4pCit7CisJc3dpdGNoIChyb3QpIHsKKwljYXNlIElHVF9S T1RBVElPTl8wOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndpZHRoIC8g MiAtIHZpcywgZmItPmhlaWdodCAvIDIgLSB2aXMpOworCQlicmVhazsKKwljYXNlIElHVF9ST1RB VElPTl85MDoKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDIg LSBoaWRkZW4sIGZiLT5oZWlnaHQgLyAyIC0gdmlzKTsKKwkJYnJlYWs7CisJY2FzZSBJR1RfUk9U QVRJT05fMTgwOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndpZHRoIC8g MiAtIGhpZGRlbiwgZmItPmhlaWdodCAvIDIgLSBoaWRkZW4pOworCQlicmVhazsKKwljYXNlIElH VF9ST1RBVElPTl8yNzA6CisJCWlndF9mYl9zZXRfcG9zaXRpb24oZmIsIHBsYW5lLCBmYi0+d2lk dGggLyAyIC0gdmlzLCBmYi0+aGVpZ2h0IC8gMiAtIGhpZGRlbik7CisJCWJyZWFrOworCWRlZmF1 bHQ6IGlndF9hc3NlcnQoMCk7CisJfQorCWlndF9mYl9zZXRfc2l6ZShmYiwgcGxhbmUsIHZpcyAr IGhpZGRlbiwgdmlzICsgaGlkZGVuKTsKK30KKworc3RhdGljIHZvaWQgeXV2X3ZhbGlkX3dpZHRo X3BsYW5lKGRhdGFfdCAqZGF0YSwgZHJtTW9kZU1vZGVJbmZvICptb2RlLAorCQkJCSAgaWd0X3Bs YW5lX3QgKnBsYW5lLCBpZ3Rfcm90YXRpb25fdCByb3QsCisJCQkJICBpZ3RfY3JjX3QgKnJlZl9j cmMpCit7CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWlndF9j cmNfdCBjcmM7CisJc3RydWN0IGlndF9mYiAqY2xpcF9mYiA9ICZkYXRhLT5mYlsyXTsKKwlpbnQg aSwgcmV0OworCisJLyogSnVzdCBjbGlwcGluZy4uICovCisJaWd0X3BsYW5lX3NldF9mYihwbGFu ZSwgY2xpcF9mYik7CisJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFuZSwgcm90KTsKKwlpZiAo cm90ICYgKElHVF9ST1RBVElPTl85MCB8IElHVF9ST1RBVElPTl8yNzApKQorCQlpZ3RfcGxhbmVf c2V0X3NpemUocGxhbmUsIGNsaXBfZmItPmhlaWdodCwgY2xpcF9mYi0+d2lkdGgpOworCWlndF9w bGFuZV9zZXRfcG9zaXRpb24ocGxhbmUsIG1vZGUtPmhkaXNwbGF5IC0gY2xpcF9mYi0+d2lkdGgg LyAyLCBtb2RlLT52ZGlzcGxheSAtIGNsaXBfZmItPmhlaWdodCAvIDIpOworCWlmICgocm90ID09 IElHVF9ST1RBVElPTl85MCB8fCByb3QgPT0gSUdUX1JPVEFUSU9OXzI3MCkgJiYKKwkgICAgaWd0 X2Rpc3BsYXlfdHJ5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQykgPCAwKSB7CisJCWln dF9kZWJ1ZygiVGhpcyByb3RhdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGZvcm1hdC5cbiIp OworCQlyZXR1cm47CisJfQorCisJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRf QVRPTUlDKTsKKwlhc3NlcnRfY29sbGVjdGVkX2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywgJmNy YywgcmVmX2NyYyk7CisKKwkvKiBDbGlwcGluZyBhbmQgc2NhbGluZy4gKi8KKwlpZ3RfZmJfc2V0 X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCBjbGlwX2ZiLT53aWR0aCAvIDIgLSAxNiwgY2xpcF9m Yi0+aGVpZ2h0IC8gMiAtIDE2KTsKKwlpZ3RfZmJfc2V0X3NpemUoY2xpcF9mYiwgcGxhbmUsIDMy LCAzMik7CisJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKwlh c3NlcnRfY29sbGVjdGVkX2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywgJmNyYywgcmVmX2NyYyk7 CisKKwkvKiBUcnkgbnZhbGlkIDwgOCBzcmMgdmlzaWJsZS4gKi8KKwlzZXRfc3JjX2Nvb3Jkcyhw bGFuZSwgY2xpcF9mYiwgcm90LCA0LCA0KTsKKwlpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNw bGF5LCBDT01NSVRfQVRPTUlDKTsKKworCS8qIFRyeSBkaWZmZXJlbnQgYWxpZ25tZW50cyBmb3Ig eC95IHRvIHNlZSBpZiBhbnkgaGl0IHVuZGVycnVucyAqLworCWZvciAoaSA9IDE7IGkgPCA0OyBp KyspIHsKKwkJc2V0X3NyY19jb29yZHMocGxhbmUsIGNsaXBfZmIsIHJvdCwgMTYgKyAyICogaSwg MTYgLSAyICogaSk7CisJCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01J Qyk7CisJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCBy ZWZfY3JjKTsKKworCQkvKiBBbmQgYWxzbyBzaG93IG1vcmUgb2YgdGhlIHNjcmVlbiAqLworCQlz ZXRfc3JjX2Nvb3JkcyhwbGFuZSwgY2xpcF9mYiwgcm90LCAxNiArIGksIDE2ICsgaSk7CisJCXJl dCA9IGlndF9kaXNwbGF5X3RyeV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9NSUMpOworCisJ CWlmIChyZXQgPT0gLUVJTlZBTCkgeworCQkJaWd0X2Fzc2VydChpICUgMiB8fCByb3QgPT0gSUdU X1JPVEFUSU9OXzI3MCB8fCByb3QgPT0gKElHVF9ST1RBVElPTl85MCB8IElHVF9SRUZMRUNUX1gp KTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKKwkJ YXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMp OworCX0KKworCS8qCisJICogQXMgYSBmaW5hbCB0ZXN0LCB0cnkgd2l0aCAxNiBzcmMgdmlzaWJs ZSwgYW5kIHZhcmlvdXMgaW52aXNpYmxlCisJICogY29tcG9uZW50cyB0byBjaGVjayBjbGlwcGlu ZyBkb2Vzbid0IGRyb3AgdGhlIHZpc2libGUgc3JjIGJlbG93IDE2LgorCSAqLworCWZvciAoaSA9 IDA7IGkgPCAxNjsgaSArPSA0KSB7CisJCXNldF9zcmNfY29vcmRzKHBsYW5lLCBjbGlwX2ZiLCBy b3QsIDE2LCBpKTsKKwkJaWYgKHJvdCAmIChJR1RfUk9UQVRJT05fOTAgfCBJR1RfUk9UQVRJT05f MjcwKSkKKwkJCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgKGNsaXBfZmItPmhlaWdodCAvIDMy KSAqICgxNiArIGkpLAorCQkJCQkgICAoY2xpcF9mYi0+d2lkdGggLyAzMikgKiAoMTYgKyBpKSk7 CisJCWVsc2UKKwkJCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgKGNsaXBfZmItPndpZHRoIC8g MzIpICogKDE2ICsgaSksCisJCQkJCSAgIChjbGlwX2ZiLT5oZWlnaHQgLyAzMikgKiAoMTYgKyBp KSk7CisJCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQyk7CisJCWFz c2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsK Kwl9Cit9CisKK3N0YXRpYyB2b2lkIHl1dl92YWxpZF93aWR0aChkYXRhX3QgKmRhdGEsIGVudW0g cGlwZSBwaXBlLCBpZ3Rfb3V0cHV0X3QgKm91dHB1dCwgdW5zaWduZWQgZm9ybWF0KQoreworCWRy bU1vZGVNb2RlSW5mbyAqbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUob3V0cHV0KTsKKwlpZ3Rf ZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisJaWd0X3BsYW5lX3QgKnBsYW5l OworCXN0cnVjdCBpZ3RfZmIgKmNsaXBfZmIgPSAmZGF0YS0+ZmJbMl07CisJc3RydWN0IGlndF9m YiAqcmVmX2ZiID0gJmRhdGEtPmZiWzNdOworCisJcHJlcGFyZV9jcnRjKGRhdGEsIHBpcGUsIG91 dHB1dCk7CisKKwlpZ3RfY3JlYXRlX2ZiKGRpc3BsYXktPmRybV9mZCwgNjQsIDY0LCBmb3JtYXQs IHlfbW9kaWZpZXIsIHJlZl9mYik7CisKKwlpZ3RfY3JlYXRlX2ZiKGRpc3BsYXktPmRybV9mZCwg MiAqIHJlZl9mYi0+d2lkdGgsCisJCSAgICAgIDIgKiByZWZfZmItPmhlaWdodCwgZm9ybWF0LCB5 X21vZGlmaWVyLCBjbGlwX2ZiKTsKKworCWlndF9waXBlX2NyY19zdGFydChkYXRhLT5waXBlX2Ny Yyk7CisKKwlmb3JfZWFjaF9wbGFuZV9vbl9waXBlKGRpc3BsYXksIHBpcGUsIHBsYW5lKSB7CisJ CWlndF9jcmNfdCByZWZfY3JjWzRdOworCQljYWlyb190ICpjcjsKKwkJc3RhdGljIGNvbnN0IGRv dWJsZSBjb2xvcnNbNF1bM10gPSB7CisJCQl7IDEuLCAwLiwgMC4gfSwKKwkJCXsgMC4sIDEuLCAw LiB9LAorCQkJeyAwLiwgMC4sIDEuIH0sCisJCQl7IDEuLCAxLiwgMS4gfQorCQl9OworCQlpbnQg aTsKKworCQlpZiAoIWlndF9wbGFuZV9oYXNfZm9ybWF0X21vZChwbGFuZSwgZm9ybWF0LCBkYXRh LT5mYlswXS5tb2RpZmllcikpCisJCQljb250aW51ZTsKKworCQkvKiBEcmF3IHRoZSBGQiB0aGF0 IHdpbGwgYmUgdXNlZCBmb3IgY2xpcHBpbmcgdGVzdHMuICovCisJCWNyID0gaWd0X2dldF9jYWly b19jdHgoZGlzcGxheS0+ZHJtX2ZkLCBjbGlwX2ZiKTsKKwkJaWd0X3BhaW50X2NvbG9yKGNyLCAw LCAwLCBjbGlwX2ZiLT53aWR0aCAvIDIsIGNsaXBfZmItPmhlaWdodCAvIDIsCisJCQkJY29sb3Jz WzBdWzBdLCBjb2xvcnNbMF1bMV0sIGNvbG9yc1swXVsyXSk7CisKKwkJaWd0X3BhaW50X2NvbG9y KGNyLCBjbGlwX2ZiLT53aWR0aCAvIDIsIDAsCisJCQkJY2xpcF9mYi0+d2lkdGggLyAyLCBjbGlw X2ZiLT5oZWlnaHQgLyAyLAorCQkJCWNvbG9yc1sxXVswXSwgY29sb3JzWzFdWzFdLCBjb2xvcnNb MV1bMl0pOworCisJCWlndF9wYWludF9jb2xvcihjciwgY2xpcF9mYi0+d2lkdGggLyAyLCBjbGlw X2ZiLT5oZWlnaHQgLyAyLAorCQkJCWNsaXBfZmItPndpZHRoIC8gMiwgY2xpcF9mYi0+aGVpZ2h0 IC8gMiwKKwkJCQljb2xvcnNbMl1bMF0sIGNvbG9yc1syXVsxXSwgY29sb3JzWzJdWzJdKTsKKwor CQlpZ3RfcGFpbnRfY29sb3IoY3IsIDAsIGNsaXBfZmItPmhlaWdodCAvIDIsCisJCQkJY2xpcF9m Yi0+d2lkdGggLyAyLCBjbGlwX2ZiLT5oZWlnaHQgLyAyLAorCQkJCWNvbG9yc1szXVswXSwgY29s b3JzWzNdWzFdLCBjb2xvcnNbM11bMl0pOworCisJCWlndF9wdXRfY2Fpcm9fY3R4KGRpc3BsYXkt PmRybV9mZCwgY2xpcF9mYiwgY3IpOworCisJCS8qIERyYXcgYWxsIHJlZmVyZW5jZSBGQidzIHRv IGNvbGxlY3QgdGhlIENSQy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJY3Ig PSBpZ3RfZ2V0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIHJlZl9mYik7CisJCQlpZ3RfcGFp bnRfY29sb3IoY3IsIDAsIDAsIHJlZl9mYi0+d2lkdGgsIHJlZl9mYi0+aGVpZ2h0LAorCQkJCQlj b2xvcnNbaV1bMF0sIGNvbG9yc1tpXVsxXSwgY29sb3JzW2ldWzJdKTsKKwkJCWlndF9wdXRfY2Fp cm9fY3R4KGRpc3BsYXktPmRybV9mZCwgJmRhdGEtPmZiWzNdLCBjcik7CisKKwkJCWlmICghaSkg eworCQkJCWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIHJlZl9mYik7CisJCQkJaWd0X3BsYW5lX3Nl dF9wb3NpdGlvbihwbGFuZSwgbW9kZS0+aGRpc3BsYXkgLSByZWZfZmItPndpZHRoLCBtb2RlLT52 ZGlzcGxheSAtIHJlZl9mYi0+aGVpZ2h0KTsKKwkJCQlpZ3RfZGlzcGxheV9jb21taXQyKGRpc3Bs YXksIENPTU1JVF9BVE9NSUMpOworCQkJfSBlbHNlIHsKKwkJCQlpZ3RfZGlydHlfZmIoZGlzcGxh eS0+ZHJtX2ZkLCByZWZfZmIpOworCQkJCWlndF93YWl0X2Zvcl92YmxhbmsoZGlzcGxheS0+ZHJt X2ZkLCBwaXBlKTsKKwkJCX0KKworCQkJaWd0X3BpcGVfY3JjX2RyYWluKGRhdGEtPnBpcGVfY3Jj KTsKKwkJCWlndF9waXBlX2NyY19nZXRfc2luZ2xlKGRhdGEtPnBpcGVfY3JjLCAmcmVmX2NyY1tp XSk7CisJCX0KKworCQlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBOVUxMKTsKKwkJaWd0X3BsYW5l X3NldF9wb3NpdGlvbihwbGFuZSwgMCwgMCk7CisKKwkJeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKGRh dGEsIG1vZGUsIHBsYW5lLCBJR1RfUk9UQVRJT05fMCwgJnJlZl9jcmNbMF0pOworCQl5dXZfdmFs aWRfd2lkdGhfcGxhbmUoZGF0YSwgbW9kZSwgcGxhbmUsIElHVF9ST1RBVElPTl85MCwgJnJlZl9j cmNbMV0pOworCQl5dXZfdmFsaWRfd2lkdGhfcGxhbmUoZGF0YSwgbW9kZSwgcGxhbmUsIElHVF9S T1RBVElPTl8xODAsICZyZWZfY3JjWzJdKTsKKwkJeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKGRhdGEs IG1vZGUsIHBsYW5lLCBJR1RfUk9UQVRJT05fMjcwLCAmcmVmX2NyY1szXSk7CisKKwkJaWd0X3Bs YW5lX3NldF9mYihwbGFuZSwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgYm9vbCB5dXZfY29tbWl0 X3JvdGF0ZWQoaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSwgaWd0X3JvdGF0aW9uX3Qgcm90KQorewor CWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDAp IHsKKwkJaWd0X2RlYnVnKCJTa2lwcGluZyByb3RhdGVkIHRlc3QsIGFsaWdubWVudCBpcyB3cm9u Zy5cbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRp YyB2b2lkIHl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShkYXRhX3QgKmRhdGEsIGRybU1vZGVNb2Rl SW5mbyAqbW9kZSwKKwkJCQkgICAgICBpZ3RfcGxhbmVfdCAqcGxhbmUsIHN0cnVjdCBpZ3RfZmIg KmZiLAorCQkJCSAgICAgIGlndF9yb3RhdGlvbl90IHJvdCwgaWd0X2NyY190ICpyZWZfY3JjKQor eworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3Qg Y3JjOworCWludCBvZnNbXSA9IHsgMCwgMSwgLTEsIDIsIC0yIH07CisJaW50IGksIGo7CisKKwlp Z3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBmYik7CisJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFu ZSwgcm90KTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NCwgNjQpOworCWlndF9w bGFuZV9zZXRfc2l6ZShwbGFuZSwgMjU2LCAyNTYpOworCisJaWd0X2ZiX3NldF9wb3NpdGlvbihm YiwgcGxhbmUsIGZiLT53aWR0aCAvIDQsIGZiLT5oZWlnaHQgLyA0KTsKKwlpZ3RfZmJfc2V0X3Np emUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyLCBmYi0+aGVpZ2h0IC8gMik7CisJaWYgKChyb3Qg PT0gSUdUX1JPVEFUSU9OXzkwIHx8IHJvdCA9PSBJR1RfUk9UQVRJT05fMjcwKSAmJgorCSAgICBp Z3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDApIHsKKwkJ aWd0X2RlYnVnKCJUaGlzIHJvdGF0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZm9ybWF0Llxu Iik7CisJCXJldHVybjsKKwl9CisKKwlpZ3RfZGlzcGxheV9jb21taXQyKGRpc3BsYXksIENPTU1J VF9BVE9NSUMpOworCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAm Y3JjLCByZWZfY3JjKTsKKworCS8qIE1ha2Ugc3VyZSBib3VuZGFyaWVzIG1hdGNoICovCisJaWd0 X2ZiX3NldF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDQgLSAyLCBmYi0+aGVpZ2h0 IC8gNCAtIDIpOworCWlndF9mYl9zZXRfc2l6ZShmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDIgKyA0 LCBmYi0+aGVpZ2h0IC8gMiArIDQpOworCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09N TUlUX0FUT01JQyk7CisJYXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMs ICZjcmMsIHJlZl9jcmMpOworCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUob2ZzKTsgaSsr KSB7CisJCWlndF9kZWJ1ZygiVGVzdGluZyB3aXRoIHJvdCAleCBhbmQgZXh0cmEgJWkgb24gdGhl IGxlZnQgc2lkZVxuIiwgcm90LCBvZnNbaV0pOworCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBw bGFuZSwgZmItPndpZHRoIC8gNCArIG9mc1tpXSwgZmItPmhlaWdodCAvIDQgLSAyKTsKKwkJaWd0 X2ZiX3NldF9zaXplKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gMiArIDIgLSBvZnNbaV0sIGZiLT5o ZWlnaHQgLyAyICsgNCk7CisJCWlmICh5dXZfY29tbWl0X3JvdGF0ZWQoZGlzcGxheSwgcm90KSkK KwkJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZf Y3JjKTsKKworCQlpZ3RfZGVidWcoIlRlc3Rpbmcgd2l0aCByb3QgJXggYW5kIGV4dHJhICVpIG9u IHRoZSB0b3Agc2lkZVxuIiwgcm90LCBvZnNbaV0pOworCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZi LCBwbGFuZSwgZmItPndpZHRoIC8gNCAtIDIsIGZiLT5oZWlnaHQgLyA0ICsgb2ZzW2ldKTsKKwkJ aWd0X2ZiX3NldF9zaXplKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gMiArIDQsIGZiLT5oZWlnaHQg LyAyICsgMiAtIG9mc1tpXSk7CisJCWlmICh5dXZfY29tbWl0X3JvdGF0ZWQoZGlzcGxheSwgcm90 KSkKKwkJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCBy ZWZfY3JjKTsKKworCQlpZ3RfZGVidWcoIlRlc3Rpbmcgd2l0aCByb3QgJXggYW5kIGV4dHJhICVp IG9uIHRoZSByaWdodCBzaWRlXG4iLCByb3QsIG9mc1tpXSk7CisJCWlndF9mYl9zZXRfcG9zaXRp b24oZmIsIHBsYW5lLCBmYi0+d2lkdGggLyA0IC0gMiwgZmItPmhlaWdodCAvIDQpOworCQlpZ3Rf ZmJfc2V0X3NpemUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyICsgMiArIG9mc1tpXSwgZmItPmhl aWdodCAvIDIpOworCQlpZiAoeXV2X2NvbW1pdF9yb3RhdGVkKGRpc3BsYXksIHJvdCkpCisJCQlh c3NlcnRfY29sbGVjdGVkX2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywgJmNyYywgcmVmX2NyYyk7 CisKKwkJaWd0X2RlYnVnKCJUZXN0aW5nIHdpdGggcm90ICV4IGFuZCBleHRyYSAlaSBvbiB0aGUg Ym90dG9tIHNpZGVcbiIsIHJvdCwgb2ZzW2ldKTsKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihmYiwg cGxhbmUsIGZiLT53aWR0aCAvIDQgLSAyLCBmYi0+aGVpZ2h0IC8gNCAtIDIpOworCQlpZ3RfZmJf c2V0X3NpemUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyICsgNCwgZmItPmhlaWdodCAvIDIgKyAy ICsgb2ZzW2ldKTsKKwkJaWYgKHl1dl9jb21taXRfcm90YXRlZChkaXNwbGF5LCByb3QpKQorCQkJ YXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMp OworCisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2ZzKTsgaSsrKQorCQlmb3Ig KGogPSAhaTsgaiA8IEFSUkFZX1NJWkUob2ZzKTsgaisrKSB7CisJCQlpZ3RfZGVidWcoIlRlc3Rp bmcgd2l0aCByb3QgJXggYW5kIGV4dHJhICglaSwgJWkpIGF0IHRoZSBlZGdlc1xuIiwgcm90LCBv ZnNbaV0sIG9mc1tqXSk7CisKKwkJCWlndF9mYl9zZXRfcG9zaXRpb24oZmIsIHBsYW5lLCBmYi0+ d2lkdGggLyA0ICsgb2ZzW2ldLCBmYi0+aGVpZ2h0IC8gNCArIG9mc1tqXSk7CisJCQlpZ3RfZmJf c2V0X3NpemUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyIC0gMiAqIG9mc1tpXSwgZmItPmhlaWdo dCAvIDIgLSAyICogb2ZzW2pdKTsKKworCQkJaWYgKHl1dl9jb21taXRfcm90YXRlZChkaXNwbGF5 LCByb3QpKQorCQkJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAm Y3JjLCByZWZfY3JjKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X2NsaXBfZmIoaWd0X2Rp c3BsYXlfdCAqZGlzcGxheSwgc3RydWN0IGlndF9mYiAqY2xpcF9mYikKK3sKKwljYWlyb190ICpj ciA9IGlndF9nZXRfY2Fpcm9fY3R4KGRpc3BsYXktPmRybV9mZCwgY2xpcF9mYik7CisKKwlpZ3Rf cGFpbnRfY29sb3IoY3IsIDAsIDAsIGNsaXBfZmItPndpZHRoLCBjbGlwX2ZiLT5oZWlnaHQsIC4w LCAuMCwgLjUpOworCWlndF9wYWludF9jb2xvcihjciwgY2xpcF9mYi0+d2lkdGggLyA0IC0gMiwg Y2xpcF9mYi0+aGVpZ2h0IC8gNCAtIDIsCisJCQljbGlwX2ZiLT53aWR0aCAvIDIgKyA0LCBjbGlw X2ZiLT5oZWlnaHQgLyAyICsgNCwgMS4sIDEuLCAxLik7CisKKwlpZ3RfcHV0X2NhaXJvX2N0eChk aXNwbGF5LT5kcm1fZmQsIGNsaXBfZmIsIGNyKTsKK30KKworc3RhdGljIHZvaWQgeXV2X2Nyb3Bf c2NhbGVfYnVnKGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIGlndF9vdXRwdXRfdCAqb3V0 cHV0LCB1bnNpZ25lZCBmb3JtYXQpCit7CisJZHJtTW9kZU1vZGVJbmZvICptb2RlID0gaWd0X291 dHB1dF9nZXRfbW9kZShvdXRwdXQpOworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ ZGlzcGxheTsKKwlpZ3RfcGxhbmVfdCAqcGxhbmUsICpwcmltYXJ5ID0gaWd0X3BpcGVfZ2V0X3Bs YW5lX3R5cGUoJmRpc3BsYXktPnBpcGVzW3BpcGVdLCBEUk1fUExBTkVfVFlQRV9QUklNQVJZKTsK KwlzdHJ1Y3QgaWd0X2ZiICpyZWZfZmIgPSAmZGF0YS0+ZmJbMl07CisJc3RydWN0IGlndF9mYiAq Y2xpcF9mYiA9ICZkYXRhLT5mYlszXTsKKwlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiX3h0aWxlZCA9 ICZkYXRhLT5mYls0XTsKKwlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiX3l0aWxlZCA9ICZkYXRhLT5m Yls1XTsKKworCXByZXBhcmVfY3J0YyhkYXRhLCBwaXBlLCBvdXRwdXQpOworCisJaWd0X2NyZWF0 ZV9jb2xvcl9mYihkaXNwbGF5LT5kcm1fZmQsIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxh eSwKKwkJCSAgICBmb3JtYXQsIHhfbW9kaWZpZXIsIC41LCAuNSwgLjUsICZkYXRhLT5mYlswXSk7 CisKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRpc3BsYXktPmRybV9mZCwgMjU2LCAyNTYsIGZvcm1h dCwKKwkJCSAgICB4X21vZGlmaWVyLCAxLiwgMS4sIDEuLCByZWZfZmIpOworCisJaWd0X2NyZWF0 ZV9mYihkaXNwbGF5LT5kcm1fZmQsIDgwLCAxMjgsIGZvcm1hdCwKKwkJICAgICAgTE9DQUxfRFJN X0ZPUk1BVF9NT0RfTk9ORSwgY2xpcF9mYik7CisKKwlpZ3RfY3JlYXRlX2ZiKGRpc3BsYXktPmRy bV9mZCwgODAsIDEyOCwgZm9ybWF0LAorCQkgICAgICB4X21vZGlmaWVyLCBjbGlwX2ZiX3h0aWxl ZCk7CisJaWd0X2NyZWF0ZV9mYihkaXNwbGF5LT5kcm1fZmQsIDgwLCAxMjgsIGZvcm1hdCwKKwkJ ICAgICAgeV9tb2RpZmllciwgY2xpcF9mYl95dGlsZWQpOworCisJZHJhd19jbGlwX2ZiKGRpc3Bs YXksIGNsaXBfZmIpOworCWRyYXdfY2xpcF9mYihkaXNwbGF5LCBjbGlwX2ZiX3h0aWxlZCk7CisJ ZHJhd19jbGlwX2ZiKGRpc3BsYXksIGNsaXBfZmJfeXRpbGVkKTsKKworCWlndF9wbGFuZV9zZXRf ZmIocHJpbWFyeSwgJmRhdGEtPmZiWzBdKTsKKworCWZvcl9lYWNoX3BsYW5lX29uX3BpcGUoZGlz cGxheSwgcGlwZSwgcGxhbmUpIHsKKwkJaWd0X2NyY190IHJlZl9jcmM7CisKKwkJaWYgKCFpZ3Rf cGxhbmVfaGFzX2Zvcm1hdF9tb2QocGxhbmUsIGZvcm1hdCwgZGF0YS0+ZmJbMF0ubW9kaWZpZXIp KQorCQkJY29udGludWU7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgcmVmX2ZiKTsKKwkJ aWd0X3BsYW5lX3NldF9wb3NpdGlvbihwbGFuZSwgNjQsIDY0KTsKKwkJaWd0X2Rpc3BsYXlfY29t bWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKworCQlpZ3RfcGlwZV9jcmNfc3RhcnQoZGF0 YS0+cGlwZV9jcmMpOworCQlpZ3RfcGlwZV9jcmNfZ2V0X3NpbmdsZShkYXRhLT5waXBlX2NyYywg JnJlZl9jcmMpOworCisJCXl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShkYXRhLCBtb2RlLCBwbGFu ZSwgY2xpcF9mYiwgSUdUX1JPVEFUSU9OXzAsICZyZWZfY3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVf YnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3h0aWxlZCwgSUdUX1JPVEFUSU9O XzAsICZyZWZfY3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBs YW5lLCBjbGlwX2ZiX3l0aWxlZCwgSUdUX1JPVEFUSU9OXzAsICZyZWZfY3JjKTsKKwkJeXV2X2Ny b3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3l0aWxlZCwgSUdU X1JPVEFUSU9OXzkwLCAmcmVmX2NyYyk7CisJCXl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShkYXRh LCBtb2RlLCBwbGFuZSwgY2xpcF9mYiwgSUdUX1JPVEFUSU9OXzE4MCwgJnJlZl9jcmMpOworCQl5 dXZfY3JvcF9zY2FsZV9idWdfcGxhbmUoZGF0YSwgbW9kZSwgcGxhbmUsIGNsaXBfZmJfeHRpbGVk LCBJR1RfUk9UQVRJT05fMTgwLCAmcmVmX2NyYyk7CisJCXl1dl9jcm9wX3NjYWxlX2J1Z19wbGFu ZShkYXRhLCBtb2RlLCBwbGFuZSwgY2xpcF9mYl95dGlsZWQsIElHVF9ST1RBVElPTl8xODAsICZy ZWZfY3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBj bGlwX2ZiX3l0aWxlZCwgSUdUX1JPVEFUSU9OXzI3MCwgJnJlZl9jcmMpOworCisJCWlndF9wbGFu ZV9zZXRfZmIocGxhbmUsIHBsYW5lICE9IHByaW1hcnkgPyBOVUxMIDogJmRhdGEtPmZiWzBdKTsK KwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBf cGxhbmVfd2l0aF9jdXJzb3IoZGF0YV90ICpkYXRhLAorCQkJCQkJCWlndF9wbGFuZV90ICpwbGFu ZSwKKwkJCQkJCQlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiLAorCQkJCQkJCWlndF9wbGFuZV90ICpj dXJzb3IsCisJCQkJCQkJc3RydWN0IGlndF9mYiAqY3Vyc29yX2ZiLAorCQkJCQkJCWlndF9jcmNf dCAqcmVmX2NyYywKKwkJCQkJCQlpbnQgY3Vyc29yX3gsIGludCBjdXJzb3JfeSkKK3sKKwlpZ3Rf ZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisKKwlpZ3RfcGxhbmVfc2V0X2Zi KHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NCwgNjQp OworCWlndF9wbGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIElHVF9ST1RBVElPTl8wKTsKKworCWln dF9wbGFuZV9zZXRfZmIoY3Vyc29yLCBjdXJzb3JfZmIpOworCWlndF9wbGFuZV9zZXRfcG9zaXRp b24oY3Vyc29yLCBjdXJzb3JfeCwgY3Vyc29yX3kpOworCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlz cGxheSwgQ09NTUlUX0FUT01JQyk7CisKKwlpZ3RfcGlwZV9jcmNfZHJhaW4oZGF0YS0+cGlwZV9j cmMpOworCWlndF9waXBlX2NyY19nZXRfc2luZ2xlKGRhdGEtPnBpcGVfY3JjLCByZWZfY3JjKTsK KworCWlndF9wbGFuZV9zZXRfZmIoY3Vyc29yLCBOVUxMKTsKK30KKworc3RhdGljIGJvb2wgeXV2 X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX3JpZ2h0KGRhdGFfdCAqZGF0YSwKKwkJCQkJCSBp Z3Rfcm90YXRpb25fdCByb3RhdGlvbiwKKwkJCQkJCSBpZ3RfcGxhbmVfdCAqcGxhbmUsCisJCQkJ CQkgc3RydWN0IGlndF9mYiAqY2xpcF9mYiwKKwkJCQkJCSBpZ3RfY3JjX3QgKnJlZl9jcmMpCit7 CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWlndF9jcmNfdCBj cmMgPSB7fTsKKworCWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIGNsaXBfZmIpOworCWlndF9wbGFu ZV9zZXRfcG9zaXRpb24ocGxhbmUsIDY0LCA2NCk7CisJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihw bGFuZSwgcm90YXRpb24pOworCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgY2xpcF9mYi0+d2lk dGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCisJc3dpdGNoIChyb3RhdGlvbikgeworCWNhc2Ug SUdUX1JPVEFUSU9OXzE4MDoKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihjbGlwX2ZiLCBwbGFuZSwg MSwgMCk7CisJY2FzZSBJR1RfUk9UQVRJT05fMDoKKwkJaWd0X2ZiX3NldF9zaXplKGNsaXBfZmIs IHBsYW5lLCBjbGlwX2ZiLT53aWR0aCAtIDEsIGNsaXBfZmItPmhlaWdodCk7CisJCWJyZWFrOwor CisJY2FzZSBJR1RfUk9UQVRJT05fMjcwOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIs IHBsYW5lLCAwLCAxKTsKKwljYXNlIElHVF9ST1RBVElPTl85MDoKKwkJaWd0X2ZiX3NldF9zaXpl KGNsaXBfZmIsIHBsYW5lLCBjbGlwX2ZiLT53aWR0aCwgY2xpcF9mYi0+aGVpZ2h0IC0gMSk7CisJ CWJyZWFrOworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnRfZigwLCAiVW5oYW5kbGVkIHJvdGF0aW9u ICV4XG4iLCByb3RhdGlvbik7CisJfQorCisJaWYgKGlndF9kaXNwbGF5X3RyeV9jb21taXQyKGRp c3BsYXksIENPTU1JVF9BVE9NSUMpIDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJYXNzZXJ0X2Nv bGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMpOworCXJldHVy biB0cnVlOworfQorCitzdGF0aWMgYm9vbCB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVf Ym90dG9tKGRhdGFfdCAqZGF0YSwKKwkJCQkJCSAgaWd0X3JvdGF0aW9uX3Qgcm90YXRpb24sCisJ CQkJCQkgIGlndF9wbGFuZV90ICpwbGFuZSwKKwkJCQkJCSAgc3RydWN0IGlndF9mYiAqY2xpcF9m YiwKKwkJCQkJCSAgaWd0X2NyY190ICpyZWZfY3JjKQoreworCWlndF9kaXNwbGF5X3QgKmRpc3Bs YXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3QgY3JjID0ge307CisKKwlpZ3RfcGxhbmVf c2V0X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2 NCwgNjQpOworCWlndF9wbGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIHJvdGF0aW9uKTsKKwlpZ3Rf cGxhbmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmItPndpZHRoLCBjbGlwX2ZiLT5oZWlnaHQgLSAx KTsKKworCXN3aXRjaCAocm90YXRpb24pIHsKKwljYXNlIElHVF9ST1RBVElPTl8xODA6CisJCWln dF9mYl9zZXRfcG9zaXRpb24oY2xpcF9mYiwgcGxhbmUsIDAsIDEpOworCWNhc2UgSUdUX1JPVEFU SU9OXzA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGgs IGNsaXBfZmItPmhlaWdodCAtIDEpOworCQlicmVhazsKKworCWNhc2UgSUdUX1JPVEFUSU9OXzkw OgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAxLCAwKTsKKwljYXNlIElH VF9ST1RBVElPTl8yNzA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9m Yi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlp Z3RfYXNzZXJ0X2YoMCwgIlVuaGFuZGxlZCByb3RhdGlvbiAleFxuIiwgcm90YXRpb24pOworCX0K KworCWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8 IDApCisJCXJldHVybiBmYWxzZTsKKworCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEt PnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJv b2wgeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQoZGF0YV90ICpkYXRhLAorCQkJ CQkJaWd0X3JvdGF0aW9uX3Qgcm90YXRpb24sCisJCQkJCQlpZ3RfcGxhbmVfdCAqcGxhbmUsCisJ CQkJCQlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiLAorCQkJCQkJaWd0X2NyY190ICpyZWZfY3JjKQor eworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3Qg Y3JjID0ge307CisKKwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxh bmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NSwgNjQpOworCWlndF9wbGFuZV9zZXRfcm90YXRpb24o cGxhbmUsIHJvdGF0aW9uKTsKKwlpZ3RfcGxhbmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmItPndp ZHRoIC0gMSwgY2xpcF9mYi0+aGVpZ2h0KTsKKworCXN3aXRjaCAocm90YXRpb24pIHsKKwljYXNl IElHVF9ST1RBVElPTl8wOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAx LCAwKTsKKwljYXNlIElHVF9ST1RBVElPTl8xODA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2Zi LCBwbGFuZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCQlicmVhazsK KworCWNhc2UgSUdUX1JPVEFUSU9OXzkwOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIs IHBsYW5lLCAwLCAxKTsKKwljYXNlIElHVF9ST1RBVElPTl8yNzA6CisJCWlndF9mYl9zZXRfc2l6 ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGgsIGNsaXBfZmItPmhlaWdodCAtIDEpOwor CQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0X2YoMCwgIlVuaGFuZGxlZCByb3RhdGlv biAleFxuIiwgcm90YXRpb24pOworCX0KKworCWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0Mihk aXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCWFzc2VydF9j b2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwlyZXR1 cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgYm9vbCB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxh bmVfdG9wKGRhdGFfdCAqZGF0YSwKKwkJCQkJICAgICAgaWd0X3JvdGF0aW9uX3Qgcm90YXRpb24s CisJCQkJCSAgICAgIGlndF9wbGFuZV90ICpwbGFuZSwKKwkJCQkJICAgICAgc3RydWN0IGlndF9m YiAqY2xpcF9mYiwKKwkJCQkJICAgICAgaWd0X2NyY190ICpyZWZfY3JjKQoreworCWlndF9kaXNw bGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3QgY3JjID0ge307CisK KwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0 aW9uKHBsYW5lLCA2NCwgNjUpOworCWlndF9wbGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIHJvdGF0 aW9uKTsKKwlpZ3RfcGxhbmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmItPndpZHRoLCBjbGlwX2Zi LT5oZWlnaHQgLSAxKTsKKworCXN3aXRjaCAocm90YXRpb24pIHsKKwljYXNlIElHVF9ST1RBVElP Tl8wOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAwLCAxKTsKKwljYXNl IElHVF9ST1RBVElPTl8xODA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xp cF9mYi0+d2lkdGgsIGNsaXBfZmItPmhlaWdodCAtIDEpOworCQlicmVhazsKKworCWNhc2UgSUdU X1JPVEFUSU9OXzI3MDoKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihjbGlwX2ZiLCBwbGFuZSwgMSwg MCk7CisJY2FzZSBJR1RfUk9UQVRJT05fOTA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBw bGFuZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlpZ3RfYXNzZXJ0X2YoMCwgIlVuaGFuZGxlZCByb3RhdGlvbiAleFxuIiwgcm90 YXRpb24pOworCX0KKworCWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01N SVRfQVRPTUlDKSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCWFzc2VydF9jb2xsZWN0ZWRfY3Jj X2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwlyZXR1cm4gdHJ1ZTsKK30K Kworc3RhdGljIHZvaWQgeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwKGRhdGFfdCAqZGF0YSwgZW51 bSBwaXBlIHBpcGUsIGlndF9vdXRwdXRfdCAqb3V0cHV0LCB1bnNpZ25lZCBmb3JtYXQpCit7CisJ ZHJtTW9kZU1vZGVJbmZvICptb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQpOworCWln dF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfcGlwZV90ICpwaXBl X29iaiA9ICZkaXNwbGF5LT5waXBlc1twaXBlXTsKKwlzdHJ1Y3QgaWd0X2ZiICpiZ19mYiA9ICZk YXRhLT5mYlswXTsKKwlzdHJ1Y3QgaWd0X2ZiICpiZ19jdXJzb3JfZmIgPSAmZGF0YS0+ZmJbMV07 CisJc3RydWN0IGlndF9mYiAqYmxhY2tfY3Vyc29yX2ZiID0gJmRhdGEtPmZiWzJdOworCXN0cnVj dCBpZ3RfZmIgKmNsaXBfZmIgPSAmZGF0YS0+ZmJbM107CisJaWd0X3BsYW5lX3QgKnByaW1hcnkg PSBpZ3RfcGlwZV9nZXRfcGxhbmVfdHlwZShwaXBlX29iaiwgRFJNX1BMQU5FX1RZUEVfUFJJTUFS WSk7CisJaWd0X3BsYW5lX3QgKmN1cnNvciA9IGlndF9waXBlX2dldF9wbGFuZV90eXBlKHBpcGVf b2JqLCBEUk1fUExBTkVfVFlQRV9DVVJTT1IpOworCWlndF9wbGFuZV90ICpwbGFuZTsKKwljYWly b190ICpjcjsKKwlib29sIHJldCA9IGZhbHNlOworCisJcHJlcGFyZV9jcnRjKGRhdGEsIHBpcGUs IG91dHB1dCk7CisKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRpc3BsYXktPmRybV9mZCwgbW9kZS0+ aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5LAorCQkJICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsIHhf bW9kaWZpZXIsCisJCQkgICAgLjAsIC4wLCAxLiwgYmdfZmIpOworCisJaWd0X2NyZWF0ZV9jb2xv cl9mYihkaXNwbGF5LT5kcm1fZmQsIDI1NiwgMjU2LAorCQkgICAgICAgICAgICBEUk1fRk9STUFU X0FSR0I4ODg4LCBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJICAgIC4wLCAuMCwgMS4s IGJnX2N1cnNvcl9mYik7CisKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRpc3BsYXktPmRybV9mZCwg MjU2LCAyNTYsCisJCSAgICAgICAgICAgIERSTV9GT1JNQVRfQVJHQjg4ODgsIExPQ0FMX0RSTV9G T1JNQVRfTU9EX05PTkUsCisJCQkgICAgLjAsIC4wLCAuMCwgYmxhY2tfY3Vyc29yX2ZiKTsKKwor CWlndF9jcmVhdGVfZmIoZGlzcGxheS0+ZHJtX2ZkLCAyNTYsIDI1NiwKKwkJICAgICAgZm9ybWF0 LCB5X21vZGlmaWVyLCBjbGlwX2ZiKTsKKworCS8qIERyYXcgdGhlIEZCIHRoYXQgd2lsbCBiZSB1 c2VkIGZvciBjbGlwcGluZyB0aGUgY2hyb21hIHN1YnBpeGVsIHRlc3QuICovCisJY3IgPSBpZ3Rf Z2V0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGNsaXBfZmIpOworCisJaWd0X3BhaW50X2Nv bG9yKGNyLCAwLCAwLCBjbGlwX2ZiLT53aWR0aCwgY2xpcF9mYi0+aGVpZ2h0LCAxLiwgMC4sIDAu KTsKKwlpZ3RfcGFpbnRfY29sb3IoY3IsIDIsIDIsIGNsaXBfZmItPndpZHRoIC0gNCwgY2xpcF9m Yi0+aGVpZ2h0IC0gNCwgMC4sIDEuLCAxLik7CisJaWd0X3BhaW50X2NvbG9yKGNyLCA0LCA0LCBj bGlwX2ZiLT53aWR0aCAtIDgsIGNsaXBfZmItPmhlaWdodCAtIDgsIC43NSwgLjc1LCAxLik7CisK KwkvKiBXaGl0ZSBkb3RzIGluIHRoZSBjb3JuZXJzLiAqLworCWlndF9wYWludF9jb2xvcihjciwg MCwgMCwgNiwgNiwgMS4sIDEuLCAxLik7CisJaWd0X3BhaW50X2NvbG9yKGNyLCBjbGlwX2ZiLT53 aWR0aCAtIDYsIDAsIDYsIDYsIDEuLCAxLiwgMS4pOworCWlndF9wYWludF9jb2xvcihjciwgMCwg Y2xpcF9mYi0+aGVpZ2h0IC0gNiwgNiwgNiwgMS4sIDEuLCAxLik7CisJaWd0X3BhaW50X2NvbG9y KGNyLCBjbGlwX2ZiLT53aWR0aCAtIDYsIGNsaXBfZmItPmhlaWdodCAtIDYsIDYsIDYsIDEuLCAx LiwgMS4pOworCisJaWd0X3B1dF9jYWlyb19jdHgoZGlzcGxheS0+ZHJtX2ZkLCBjbGlwX2ZiLCBj cik7CisKKwlpZ3RfcGlwZV9jcmNfc3RhcnQoZGF0YS0+cGlwZV9jcmMpOworCisJaWd0X3BsYW5l X3NldF9mYihwcmltYXJ5LCBiZ19mYik7CisJZm9yX2VhY2hfcGxhbmVfb25fcGlwZShkaXNwbGF5 LCBwaXBlLCBwbGFuZSkgeworCQlzdHJ1Y3QgaWd0X2ZiICpjdXJzb3JfZmIgPSBwbGFuZSA9PSBw cmltYXJ5ID8gYmxhY2tfY3Vyc29yX2ZiIDogYmdfY3Vyc29yX2ZiOworCQlpZ3RfY3JjX3QgcmVm X2NyYzsKKworCQlpZiAoIWlndF9wbGFuZV9oYXNfZm9ybWF0X21vZChwbGFuZSwgZm9ybWF0LCBj bGlwX2ZiLT5tb2RpZmllcikgfHwgcGxhbmUgPT0gY3Vyc29yKQorCQkJY29udGludWU7CisKKwkJ eXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX3dpdGhfY3Vyc29yKGRhdGEsIHBsYW5lLCBj bGlwX2ZiLCBjdXJzb3IsIGN1cnNvcl9mYiwgJnJlZl9jcmMsIDYzICsgY2xpcF9mYi0+d2lkdGgs IDY0KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9yaWdodChkYXRh LCBJR1RfUk9UQVRJT05fMCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1 dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9yaWdodChkYXRhLCBJR1RfUk9UQVRJT05fOTAs IHBsYW5lLCBjbGlwX2ZiLCAmcmVmX2NyYyk7CisJCXJldCB8PSB5dXZfY2hyb21hX3N1YnBpeGVs X2NsaXBfcGxhbmVfcmlnaHQoZGF0YSwgSUdUX1JPVEFUSU9OXzE4MCwgcGxhbmUsIGNsaXBfZmIs ICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9yaWdo dChkYXRhLCBJR1RfUk9UQVRJT05fMjcwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCisJ CXl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV93aXRoX2N1cnNvcihkYXRhLCBwbGFuZSwg Y2xpcF9mYiwgY3Vyc29yLCBjdXJzb3JfZmIsICZyZWZfY3JjLCA2NCwgNjMgKyBjbGlwX2ZiLT5o ZWlnaHQpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2JvdHRvbShk YXRhLCBJR1RfUk9UQVRJT05fMCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9 IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9ib3R0b20oZGF0YSwgSUdUX1JPVEFUSU9O XzkwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJw aXhlbF9jbGlwX3BsYW5lX2JvdHRvbShkYXRhLCBJR1RfUk9UQVRJT05fMTgwLCBwbGFuZSwgY2xp cF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5l X2JvdHRvbShkYXRhLCBJR1RfUk9UQVRJT05fMjcwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMp OworCisJCXl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV93aXRoX2N1cnNvcihkYXRhLCBw bGFuZSwgY2xpcF9mYiwgY3Vyc29yLCBjdXJzb3JfZmIsICZyZWZfY3JjLCA2NSAtIGN1cnNvcl9m Yi0+d2lkdGgsIDY0KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9s ZWZ0KGRhdGEsIElHVF9ST1RBVElPTl8wLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCQly ZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQoZGF0YSwgSUdUX1JPVEFU SU9OXzkwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9tYV9z dWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQoZGF0YSwgSUdUX1JPVEFUSU9OXzE4MCwgcGxhbmUsIGNs aXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFu ZV9sZWZ0KGRhdGEsIElHVF9ST1RBVElPTl8yNzAsIHBsYW5lLCBjbGlwX2ZiLCAmcmVmX2NyYyk7 CisKKwkJeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX3dpdGhfY3Vyc29yKGRhdGEsIHBs YW5lLCBjbGlwX2ZiLCBjdXJzb3IsIGN1cnNvcl9mYiwgJnJlZl9jcmMsIDY0LCA2NSAtIGN1cnNv cl9mYi0+aGVpZ2h0KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV90 b3AoZGF0YSwgSUdUX1JPVEFUSU9OXzAsIHBsYW5lLCBjbGlwX2ZiLCAmcmVmX2NyYyk7CisJCXJl dCB8PSB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVfdG9wKGRhdGEsIElHVF9ST1RBVElP Tl85MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3Vi cGl4ZWxfY2xpcF9wbGFuZV90b3AoZGF0YSwgSUdUX1JPVEFUSU9OXzE4MCwgcGxhbmUsIGNsaXBf ZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV90 b3AoZGF0YSwgSUdUX1JPVEFUSU9OXzI3MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwor CQkvKiBSZXNldCB0byBkZWZhdWx0cyAqLworCQlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5l LCAwLCAwKTsKKwkJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFuZSwgSUdUX1JPVEFUSU9OXzAp OworCQlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBwbGFuZSA9PSBwcmltYXJ5ID8gYmdfZmIgOiBO VUxMKTsKKwl9CisKKwlpZ3RfcmVxdWlyZV9mKHJldCwgIkNvdWxkIG5vdCB0ZXN0IHN1YnBpeGVs IGNsaXBwaW5nIGluIGFueSBjb3JuZXJcbiIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJl dHRpZnkodWludDMyX3QgZm91cmNjKQoreworCXN0YXRpYyBjaGFyIHN0cls1XTsKKworCW1lbWNw eShzdHIsICZmb3VyY2MsIDQpOworCXN0cls0XSA9IDA7CisJcmV0dXJuIHN0cjsKK30KKworc3Rh dGljIHZvaWQgcnVuX3Rlc3RzX2Zvcl9mb3JtYXQoZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlw ZSwgaWd0X291dHB1dF90ICpvdXRwdXQsIHVuc2lnbmVkIGludCBmb3JtYXQpCit7CisJaWd0X2Rp c3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWNvbnN0IGNoYXIgKmZzdHIgPSBw cmV0dGlmeShmb3JtYXQpOworCisJaWd0X2ZpeHR1cmUKKwkJaWd0X3JlcXVpcmUocGlwZV9zdXBw b3J0c19mb3JtYXQoZGlzcGxheSwgcGlwZSwgZm9ybWF0LCB4X21vZGlmaWVyKSk7CisKKwlpZ3Rf c3VidGVzdF9mKCJwaXBlLSVzLSVzLXJnYi1zd2l0Y2giLCBrbXN0ZXN0X3BpcGVfbmFtZShwaXBl KSwgZnN0cikKKwkJeXV2X3JnYl9zd2l0Y2goZGF0YSwgcGlwZSwgb3V0cHV0LCBmYWxzZSwgZm9y bWF0KTsKKworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtJXMtcmdiLXNjYWxlZC1zd2l0Y2giLCBr bXN0ZXN0X3BpcGVfbmFtZShwaXBlKSwgZnN0cikKKwkJeXV2X3JnYl9zd2l0Y2goZGF0YSwgcGlw ZSwgb3V0cHV0LCB0cnVlLCBmb3JtYXQpOworCisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy0lcy12 YWxpZC13aWR0aCIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUpLCBmc3RyKQorCQl5dXZfdmFsaWRf d2lkdGgoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3JtYXQpOworCisJaWd0X3N1YnRlc3RfZigicGlw ZS0lcy0lcy1jcm9wLXNjYWxlLWJ1ZyIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUpLCBmc3RyKQor CQl5dXZfY3JvcF9zY2FsZV9idWcoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3JtYXQpOworCisJaWd0 X3N1YnRlc3RfZigicGlwZS0lcy0lcy1jaHJvbWEtc3VicGl4ZWwtY2xpcCIsIGttc3Rlc3RfcGlw ZV9uYW1lKHBpcGUpLCBmc3RyKQorCQl5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXAoZGF0YSwgcGlw ZSwgb3V0cHV0LCBmb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBydW5fdGVzdHNfZm9yX3BpcGUo ZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlwZSkKK3sKKwlpZ3Rfb3V0cHV0X3QgKm91dHB1dCA9 IE5VTEw7CisKKwlpZ3RfZml4dHVyZQorCQlpZ3RfcmVxdWlyZSgob3V0cHV0ID0gaWd0X2dldF9z aW5nbGVfb3V0cHV0X2Zvcl9waXBlKCZkYXRhLT5kaXNwbGF5LCBwaXBlKSkpOworCisJaWd0X3N1 YnRlc3RfZigicGlwZS0lcy15dXYtc2FuaXR5LWNyYyIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUp KQorCQl5dXZfc2FuaXR5KGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlmb3IgKGludCBpID0gMDsg aSA8IGNvdW50X2Zvcm1hdHM7IGkrKykKKwkJaWYgKGlndF9mb3JtYXRfaXNfeXV2KGZvcm1hdHNb aV0pKQorCQkJcnVuX3Rlc3RzX2Zvcl9mb3JtYXQoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3JtYXRz W2ldKTsKK30KKworaWd0X21haW4KK3sKKwlkYXRhX3QgZGF0YSA9IHt9OworCWVudW0gcGlwZSBw aXBlOworCisJaWd0X3NraXBfb25fc2ltdWxhdGlvbigpOworCisJaWd0X2ZpeHR1cmUgeworCQlk YXRhLmRpc3BsYXkuZHJtX2ZkID0gZHJtX29wZW5fZHJpdmVyX21hc3RlcihEUklWRVJfQU5ZKTsK KworCQlrbXN0ZXN0X3NldF92dF9ncmFwaGljc19tb2RlKCk7CisJCWlndF9kaXNwbGF5X3JlcXVp cmUoJmRhdGEuZGlzcGxheSwgZGF0YS5kaXNwbGF5LmRybV9mZCk7CisJCWlndF9yZXF1aXJlKGRh dGEuZGlzcGxheS5pc19hdG9taWMpOworCQlpZ3RfcmVxdWlyZV9waXBlX2NyYyhkYXRhLmRpc3Bs YXkuZHJtX2ZkKTsKKworCQlpZiAoaWd0X2Rpc3BsYXlfaGFzX2Zvcm1hdF9tb2QoJmRhdGEuZGlz cGxheSwgRFJNX0ZPUk1BVF9YUkdCODg4OCwgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQp KQorCQkJeF9tb2RpZmllciA9IExPQ0FMX0k5MTVfRk9STUFUX01PRF9YX1RJTEVEOworCisJCWlm IChpZ3RfZGlzcGxheV9oYXNfZm9ybWF0X21vZCgmZGF0YS5kaXNwbGF5LCBEUk1fRk9STUFUX1hS R0I4ODg4LCBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWV9USUxFRCkpCisJCQl5X21vZGlmaWVyID0g TE9DQUxfSTkxNV9GT1JNQVRfTU9EX1lfVElMRUQ7CisJfQorCisJaWd0X2Zvcm1hdF9hcnJheV9m aWxsKCZmb3JtYXRzLCAmY291bnRfZm9ybWF0cywgdHJ1ZSk7CisKKwlmb3JfZWFjaF9waXBlX3N0 YXRpYyhwaXBlKQorCQlpZ3Rfc3VidGVzdF9ncm91cAorCQkJcnVuX3Rlc3RzX2Zvcl9waXBlKCZk YXRhLCBwaXBlKTsKKworCWlndF9maXh0dXJlIHsKKwkJaWd0X2Rpc3BsYXlfZmluaSgmZGF0YS5k aXNwbGF5KTsKKwkJY2xvc2UoZGF0YS5kaXNwbGF5LmRybV9mZCk7CisJfQorfQpkaWZmIC0tZ2l0 IGEvdGVzdHMvbWVzb24uYnVpbGQgYi90ZXN0cy9tZXNvbi5idWlsZAppbmRleCA5MDE1ZjgwOWVk MDUuLjhjYTdmZTVmNDkxNyAxMDA2NDQKLS0tIGEvdGVzdHMvbWVzb24uYnVpbGQKKysrIGIvdGVz dHMvbWVzb24uYnVpbGQKQEAgLTYxLDYgKzYxLDcgQEAgdGVzdF9wcm9ncyA9IFsKIAkna21zX3Vu aXZlcnNhbF9wbGFuZScsCiAJJ2ttc192YmxhbmsnLAogCSdrbXNfdnJyJywKKwkna21zX3l1dics CiAJJ21ldGFfdGVzdCcsCiAJJ3BlcmYnLAogCSdwcmltZV9idXN5JywKLS0gCjIuMjAuMQoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWls aW5nIGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3QtZGV2