From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulo Zanoni Subject: [PATCH igt] tests: add kms_frontbuffer_tracking Date: Mon, 25 May 2015 18:40:58 -0300 Message-ID: <1432590058-1747-1-git-send-email-przanoni@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qg0-f43.google.com (mail-qg0-f43.google.com [209.85.192.43]) by gabe.freedesktop.org (Postfix) with ESMTP id 108926E286 for ; Mon, 25 May 2015 14:42:09 -0700 (PDT) Received: by qgez61 with SMTP id z61so51681175qge.1 for ; Mon, 25 May 2015 14:42:08 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: daniel.vetter@ffwll.ch, Paulo Zanoni , rodrigo.vivi@intel.com List-Id: intel-gfx@lists.freedesktop.org RnJvbTogUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+CgpUaGlzIGlzIGEg bmV3IHRlc3QgdGhhdCBzaG91bGQgZXhlcmNpc2UgdGhlIGZyb250YnVmZmVyIHRyYWNraW5nCmZl YXR1cmUgb2YgdGhlIEtlcm5lbCBpbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cy4gV2UgdXNl IGRpZmZlcmVudApkcmF3aW5nIG1ldGhvZHMsIHdlIHVzZSB0aGUgcHJpbWFyeSwgY3Vyc29yIGFu ZCBzcHJpdGUgcGxhbmVzLCB3ZSBjYW4KdGVzdCBib3RoIG9uIHNpbmdsZSBhbmQgZHVhbCBwaXBl cywgYWxzbyBvbiBidWZmZXJzIG5vdCBhc3NvY2lhdGVkCndpdGggYW55IENSVENzLCBldGMuCgpX ZSBjdXJyZW50bHkgaGF2ZSBhc3NlcnRpb25zIGZvciBib3RoIEZCQyBhbmQgUFNSLCBhbmQgd2Ug YWxzbyBoYXZlIGEKIm5vcCIgdGVzdCBtb2RlIHRoYXQgc2hvdWxkIGRpc2FibGUgYm90aCBGQkMg YW5kIFBTUiwgYW5kIGNhbiBiZQp1c2VkIGZvciBkZWJ1Z2dpbmcuCgpUaGlzIHRlc3QgaXMgYWxz byBjYXBhYmxlIG9mIHRlc3RpbmcgYm90aCBGQkMgYW5kIFBTUiBldmVuIGlmIHRoZXkgYXJlCmRp c2FibGVkIGJ5IGRlZmF1bHQgb24gdGhlIEtlcm5lbDogdGhlIHRlc3Qga25vd3MgaG93IHRvIGNo YW5nZSB0aGUKaTkxNS5rbyBwYXJhbWV0ZXJzIGFuZCB0aGVuIHNldCB0aGVtIGJhY2sgYWZ0ZXIg dGVzdGluZy4KCkkgYW0gZ2V0dGluZyBhIHNtYWxsIG51bWJlciBvZiBmYWlsdXJlcyB3aGVuIEkg cnVuIHRoaXMgdGVzdCwgd2hpY2gKbWVhbnMgd2UgaGF2ZSBzb21lIHdvcmsgdG8gZG8gb24gdGhl IEtlcm5lbC4KCkkgYWxzbyBzdGlsbCBoYXZlIGEgc21hbGwgbGlzdCBvZiBhZGRpdGlvbmFsIHN1 YnRlc3RzIHRoYXQgSSBwbGFuIHRvCmFkZCB0byB0aGlzIHRlc3QsIGFuZCB0aG9zZSB0ZXN0cyBh cmUgZG9jdW1lbnRlZCBvbiB0aGUgbWFpbiBmdW5jdGlvbi4KClNpZ25lZC1vZmYtYnk6IFBhdWxv IFphbm9uaSA8cGF1bG8uci56YW5vbmlAaW50ZWwuY29tPgotLS0KIHRlc3RzLy5naXRpZ25vcmUg ICAgICAgICAgICAgICAgIHwgICAgMSArCiB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzICAgICAgICAg ICB8ICAgIDEgKwogdGVzdHMva21zX2Zyb250YnVmZmVyX3RyYWNraW5nLmMgfCAxODI1ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDE4Mjcg aW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2ttc19mcm9udGJ1ZmZlcl90 cmFja2luZy5jCgpTb21lIGludGVyZXN0aW5nIGRldGFpbHM6CgpPbiBhIHRyZWUgZnJvbSAyMDE1 LCBNYXkgMDYsIEkgZ2V0IDE4IGZhaWx1cmVzIGFuZCAzNTcgc3VjY2Vzc2VzLiBUaGUKb25seSBG QkMgZmFpbHVyZXMgSSBnZXQgYXJlIGZyb20gdGhlIE1NQVBfV0MgZHJhdyBtZXRob2QsIHdoaWNo IGlzCm1heWJlIGxhY2tpbmcgcHJvcGVyIGZyb250YnVmZmVyIHRyYWNraW5nIHN1cHBvcnQgb24g dGhlIEtlcm5lbC4gVGhlCm90aGVyIDE2IGZhaWx1cmVzIGFyZSBmb3IgUFNSLCBtb3N0IG9mIHRo ZW0gd2l0aCBHVFQgTU1BUHMuCgpCdXQgaWYgSSB1c2UgYSB0cmVlIGZyb20gMjAxNSwgTWF5IDI1 LCBldmVyeSBzaW5nbGUgUFNSIHRlc3QgZmFpbHMuIFdlCm5lZWQgdG8gaW52ZXN0aWdhdGUgdGhh dC4gTWF5YmUgaWYgSSBoYWQgZmluaXNoZWQgdGhpcyBlYXJsaWVyIHdlCndvdWxkIGhhdmUgYW4g YXV0b21hdGVkIGJpc2VjdC4gVGhpcyBhbHNvIGhpZ2hsaWdodHMgdGhlIGltcG9ydGFuY2Ugb2YK dGVzdGluZyBzdHVmZiBldmVuIHdoZW4gdGhleSBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCEgSSBw bGFuIHRvIHBhdGNoCnRoZSBvdGhlciB0ZXN0cyB0byBkbyB0aGUgc2FtZSB0aGluZy4KCkkgYW0g YWxzbyBzZWVpbmcgc29tZSBGQkMgZmFpbHVyZXMgdGhhdCBoYXBwZW4gcmlnaHQgYWZ0ZXIgYm9v dGluZy4gSXQKc2VlbXMgdGhhdCB0aGUgdmVyeSBmaXJzdCB0ZXN0cyBmYWlsIHVudGlsIEkgcnVu IGEgdGVzdCB0aGF0IHVzZXMgdGhlCnJlbmRlciByaW5nLiAgSSdsbCBoYXZlIHRvIGludmVzdGln YXRlIHRoaXMuCgpJIGFtIGFsc28gc2VlaW5nIHNvbWUgb2NjYXNpb25hbCBjb3JydXB0aW9ucyBv biBteSBlRFAgcGFuZWwsIGJ1dCBvbgp0aGVzZSBjYXNlcyBib3RoIHRoZSBwaXBlIGFuZCBzaW5r IENSQyB0ZXN0cyBzdWNjZWVkISBNYXliZSB0aGlzIGlzCnNvbWUgd2VpcmQgcGFuZWwgbWFsZnVu Y3Rpb24gY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgd2UncmUgZG9pbmcgdG9ucwphbmQgdG9ucyBv ZiBtb2Rlc2V0cyBvbiB0aGUgcGFuZWwuCgpkaWZmIC0tZ2l0IGEvdGVzdHMvLmdpdGlnbm9yZSBi L3Rlc3RzLy5naXRpZ25vcmUKaW5kZXggYTNmMzE0My4uZGNlYWQyYyAxMDA2NDQKLS0tIGEvdGVz dHMvLmdpdGlnbm9yZQorKysgYi90ZXN0cy8uZ2l0aWdub3JlCkBAIC0xMzQsNiArMTM0LDcgQEAg a21zX2ZsaXAKIGttc19mbGlwX2V2ZW50X2xlYWsKIGttc19mbGlwX3RpbGluZwoga21zX2ZvcmNl X2Nvbm5lY3Rvcgora21zX2Zyb250YnVmZmVyX3RyYWNraW5nCiBrbXNfbGVnYWN5X2NvbG9ya2V5 CiBrbXNfbW1pb192c19jc19mbGlwCiBrbXNfcGlwZV9iX2NfaXZiCmRpZmYgLS1naXQgYS90ZXN0 cy9NYWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwppbmRleCA5OTRjMzFi Li4zYzkzMzM3IDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3Rz L01ha2VmaWxlLnNvdXJjZXMKQEAgLTY2LDYgKzY2LDcgQEAgVEVTVFNfcHJvZ3NfTSA9IFwKIAlr bXNfZmxpcCBcCiAJa21zX2ZsaXBfZXZlbnRfbGVhayBcCiAJa21zX2ZsaXBfdGlsaW5nIFwKKwlr bXNfZnJvbnRidWZmZXJfdHJhY2tpbmcgXAogCWttc19sZWdhY3lfY29sb3JrZXkgXAogCWttc19t bWlvX3ZzX2NzX2ZsaXAgXAogCWttc19waXBlX2JfY19pdmIgXApkaWZmIC0tZ2l0IGEvdGVzdHMv a21zX2Zyb250YnVmZmVyX3RyYWNraW5nLmMgYi90ZXN0cy9rbXNfZnJvbnRidWZmZXJfdHJhY2tp bmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjU1NGY5Ci0tLSAvZGV2 L251bGwKKysrIGIvdGVzdHMva21zX2Zyb250YnVmZmVyX3RyYWNraW5nLmMKQEAgLTAsMCArMSwx ODI1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisg KiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBl cnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVk IGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhl IFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRp b24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBk aXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0 d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBm dXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgor ICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90 aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQg aW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJl LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBF VkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxF IEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczog UGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+CisgKgorICovCisKKyNpbmNs dWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRs Lmg+CisKKyNpbmNsdWRlICJkcm10ZXN0LmgiCisjaW5jbHVkZSAiaWd0X2F1eC5oIgorI2luY2x1 ZGUgImlndF9kcmF3LmgiCisjaW5jbHVkZSAiaWd0X2ttcy5oIgorI2luY2x1ZGUgImlndF9kZWJ1 Z2ZzLmgiCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgorI2luY2x1ZGUgImlvY3RsX3dyYXBw ZXJzLmgiCisKKyNkZWZpbmUgRkJDX1BBUkFNX1BBVEggIi9zeXMvbW9kdWxlL2k5MTUvcGFyYW1l dGVycy9lbmFibGVfZmJjIgorI2RlZmluZSBQU1JfUEFSQU1fUEFUSCAiL3N5cy9tb2R1bGUvaTkx NS9wYXJhbWV0ZXJzL2VuYWJsZV9wc3IiCisKK3N0cnVjdCB0ZXN0X21vZGUgeworCWVudW0gewor CQlQSVBFX1NJTkdMRSA9IDAsCisJCVBJUEVfRFVBTCwKKwkJUElQRV9DT1VOVCwKKwl9IHBpcGVz OworCisJZW51bSB7CisJCVNDUkVFTl9QUklNID0gMCwKKwkJU0NSRUVOX1NDTkQsCisJCVNDUkVF Tl9PRkZTQ1JFRU4sCisJCVNDUkVFTl9DT1VOVCwKKwl9IHNjcmVlbjsKKworCWVudW0geworCQlQ TEFORV9QUkkgPSAwLAorCQlQTEFORV9DVVIsCisJCVBMQU5FX1NQUiwKKwkJUExBTkVfQ09VTlQs CisJfSBwbGFuZTsKKworCWVudW0geworCQlGRUFUVVJFX05PTkUgPSAwLAorCQlGRUFUVVJFX0ZC QywKKwkJRkVBVFVSRV9QU1IsCisJCUZFQVRVUkVfQ09VTlQsCisJfSBmZWF0dXJlOworCisJZW51 bSBpZ3RfZHJhd19tZXRob2QgbWV0aG9kOworfTsKKworZW51bSBmZWF0dXJlX3N0YXR1cyB7CisJ RU5BQkxFRCwKKwlESVNBQkxFRCwKK307CisKK3N0cnVjdCByZWN0IHsKKwlpbnQgeDsKKwlpbnQg eTsKKwlpbnQgdzsKKwlpbnQgaDsKKwl1aW50MzJfdCBjb2xvcjsKK307CisKKyNkZWZpbmUgTUFY X0NPTk5FQ1RPUlMgMzIKK3N0cnVjdCB7CisJaW50IGZkOworCWRybU1vZGVSZXNQdHIgcmVzOwor CWRybU1vZGVDb25uZWN0b3JQdHIgY29ubmVjdG9yc1tNQVhfQ09OTkVDVE9SU107CisJZHJtTW9k ZVBsYW5lUmVzUHRyIHBsYW5lczsKKwlkcm1faW50ZWxfYnVmbWdyICpidWZtZ3I7Cit9IGRybTsK Kworc3RydWN0IHsKKwlpbnQgZmQ7CisKKwljaGFyIHBhcmFtX29yaWdpbmFsX3ZhbHVlWzE2XTsK KworCWJvb2wgc3VwcG9ydHNfY29tcHJlc3Npbmc7CisJYm9vbCBzdXBwb3J0c19sYXN0X2FjdGlv bjsKKworCXN0cnVjdCB0aW1lc3BlYyBsYXN0X2FjdGlvbjsKK30gZmJjID0geworCS5mZCA9IC0x LAorCS5zdXBwb3J0c19sYXN0X2FjdGlvbiA9IGZhbHNlLAorCS5zdXBwb3J0c19jb21wcmVzc2lu ZyA9IGZhbHNlLAorfTsKKworc3RydWN0IHsKKwlpbnQgZmQ7CisJYm9vbCBjYW5fdGVzdDsKKwor CWNoYXIgcGFyYW1fb3JpZ2luYWxfdmFsdWVbMTZdOworfSBwc3IgPSB7CisJLmZkID0gLTEsCisJ LmNhbl90ZXN0ID0gZmFsc2UsCit9OworCisKKyNkZWZpbmUgU0lOS19DUkNfU0laRSAxMgordHlw ZWRlZiBzdHJ1Y3QgeworCWNoYXIgZGF0YVtTSU5LX0NSQ19TSVpFXTsKK30gc2lua19jcmNfdDsK Kworc3RydWN0IGJvdGhfY3JjcyB7CisJaWd0X2NyY190IHBpcGU7CisJc2lua19jcmNfdCBzaW5r OworfTsKKworaWd0X3BpcGVfY3JjX3QgKnBpcGVfY3JjOworc3RydWN0IGJvdGhfY3JjcyBibHVl X2NyYzsKK3N0cnVjdCBib3RoX2NyY3MgKndhbnRlZF9jcmM7CisKK3N0cnVjdCB7CisJaW50IGZk OworfSBzaW5rX2NyYzsKKworc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvIHsKKwlib29sIGluaXRp YWxpemVkOworCWJvb2wgZnJhbWVzX3N0YWNrOworCWludCBuX3JlY3RzOworCXN0cnVjdCBib3Ro X2NyY3MgKmNyY3M7CisJc3RydWN0IHJlY3QgKCpnZXRfcmVjdCkoc3RydWN0IGlndF9mYiAqZmIs IGludCByKTsKK307CisKKy8qIERyYXcgYmlnIHJlY3RhbmdsZXMgb24gdGhlIHNjcmVlbi4gKi8K K3N0cnVjdCBkcmF3X3BhdHRlcm5faW5mbyBwYXR0ZXJuMTsKKy8qIDY0eDY0IHJlY3RhbmdsZXMg YXQgeDowLHk6MCwganVzdCBzbyB3ZSBjYW4gZHJhdyBvbiB0aGUgY3Vyc29yIGFuZCBzcHJpdGUu ICovCitzdHJ1Y3QgZHJhd19wYXR0ZXJuX2luZm8gcGF0dGVybjI7CisvKiA2NHg2NCByZWN0YW5n bGVzIGF0IGRpZmZlcmVudCBwb3NpdGlvbnMsIHNhbWUgY29sb3IsIGZvciB0aGUgbW92ZSB0ZXN0 LiAqLworc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvIHBhdHRlcm4zOworLyogSnVzdCBhIGZ1bGxz Y3JlZW4gZ3JlZW4gc3F1YXJlLiAqLworc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvIHBhdHRlcm40 OworCisvKiBDb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gKi8KK3N0cnVjdCB7CisJYm9vbCBjaGVj a19zdGF0dXM7CisJYm9vbCBjaGVja19jcmM7CisJYm9vbCBmYmNfY2hlY2tfY29tcHJlc3Npb247 CisJYm9vbCBmYmNfY2hlY2tfbGFzdF9hY3Rpb247CisJYm9vbCBub19lZHA7CisJYm9vbCBzbWFs bF9tb2RlczsKKwlpbnQgc3RlcDsKKwlpbnQgb25seV9mZWF0dXJlOworCWludCBvbmx5X3BpcGVz OworfSBvcHQgPSB7CisJLmNoZWNrX3N0YXR1cyA9IHRydWUsCisJLmNoZWNrX2NyYyA9IHRydWUs CisJLmZiY19jaGVja19jb21wcmVzc2lvbiA9IHRydWUsCisJLmZiY19jaGVja19sYXN0X2FjdGlv biA9IHRydWUsCisJLm5vX2VkcCA9IGZhbHNlLAorCS5zbWFsbF9tb2RlcyA9IGZhbHNlLAorCS5z dGVwID0gMCwKKwkub25seV9mZWF0dXJlID0gRkVBVFVSRV9DT1VOVCwKKwkub25seV9waXBlcyA9 IFBJUEVfQ09VTlQsCit9OworCitzdHJ1Y3QgbW9kZXNldF9wYXJhbXMgeworCXVpbnQzMl90IGNy dGNfaWQ7CisJdWludDMyX3QgY29ubmVjdG9yX2lkOworCXVpbnQzMl90IHNwcml0ZV9pZDsKKwlk cm1Nb2RlTW9kZUluZm9QdHIgbW9kZTsKKwlzdHJ1Y3QgaWd0X2ZiIGZiOworCXN0cnVjdCBpZ3Rf ZmIgY3Vyc29yOworCXN0cnVjdCBpZ3RfZmIgc3ByaXRlOworfTsKKworc3RydWN0IG1vZGVzZXRf cGFyYW1zIHByaW1fbW9kZV9wYXJhbXM7CitzdHJ1Y3QgbW9kZXNldF9wYXJhbXMgc2NuZF9tb2Rl X3BhcmFtczsKK3N0cnVjdCBpZ3RfZmIgb2Zmc2NyZWVuX2ZiOworCitzdGF0aWMgZHJtTW9kZU1v ZGVJbmZvUHRyIGdldF9jb25uZWN0b3Jfc21hbGxlc3RfbW9kZShkcm1Nb2RlQ29ubmVjdG9yUHRy IGMpCit7CisJaW50IGk7CisJZHJtTW9kZU1vZGVJbmZvUHRyIHNtYWxsZXN0ID0gTlVMTDsKKwor CWZvciAoaSA9IDA7IGkgPCBjLT5jb3VudF9tb2RlczsgaSsrKSB7CisJCWRybU1vZGVNb2RlSW5m b1B0ciBtb2RlID0gJmMtPm1vZGVzW2ldOworCisJCWlmICghc21hbGxlc3QpCisJCQlzbWFsbGVz dCA9IG1vZGU7CisKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ICogbW9kZS0+dmRpc3BsYXkgPAorCQkg ICAgc21hbGxlc3QtPmhkaXNwbGF5ICogc21hbGxlc3QtPnZkaXNwbGF5KQorCQkJc21hbGxlc3Qg PSBtb2RlOworCX0KKworCXJldHVybiBzbWFsbGVzdDsKK30KKworc3RhdGljIGRybU1vZGVDb25u ZWN0b3JQdHIgZ2V0X2Nvbm5lY3Rvcih1aW50MzJfdCBpZCkKK3sKKwlpbnQgaTsKKworCWZvciAo aSA9IDA7IGkgPCBkcm0ucmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspCisJCWlmIChkcm0ucmVz LT5jb25uZWN0b3JzW2ldID09IGlkKQorCQkJcmV0dXJuIGRybS5jb25uZWN0b3JzW2ldOworCisJ aWd0X2Fzc2VydChmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21vZGVfaW5mbyhjb25z dCBjaGFyICpzY3JlZW4sIHN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqcGFyYW1zKQoreworCWRybU1v ZGVDb25uZWN0b3JQdHIgYyA9IGdldF9jb25uZWN0b3IocGFyYW1zLT5jb25uZWN0b3JfaWQpOwor CisJaWd0X2luZm8oIiVzIHNjcmVlbjogJXMgJXNcbiIsCisJCSBzY3JlZW4sCisJCSBrbXN0ZXN0 X2Nvbm5lY3Rvcl90eXBlX3N0cihjLT5jb25uZWN0b3JfdHlwZSksCisJCSBwYXJhbXMtPm1vZGUt Pm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBpbml0X21vZGVfcGFyYW1zKHN0cnVjdCBtb2Rlc2V0 X3BhcmFtcyAqcGFyYW1zLCB1aW50MzJfdCBjcnRjX2lkLAorCQkJICAgICBpbnQgY3J0Y19pbmRl eCwgdWludDMyX3QgY29ubmVjdG9yX2lkLAorCQkJICAgICBkcm1Nb2RlTW9kZUluZm9QdHIgbW9k ZSkKK3sKKwl1aW50MzJfdCBwbGFuZV9pZCA9IDA7CisJaW50IGk7CisKKwlpZ3RfY3JlYXRlX2Zi KGRybS5mZCwgbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5LAorCQkgICAgICBEUk1fRk9S TUFUX1hSR0I4ODg4LCBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxFRCwKKwkJICAgICAgJnBh cmFtcy0+ZmIpOworCWlndF9jcmVhdGVfZmIoZHJtLmZkLCA2NCwgNjQsIERSTV9GT1JNQVRfQVJH Qjg4ODgsCisJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsICZwYXJhbXMtPmN1cnNv cik7CisJaWd0X2NyZWF0ZV9mYihkcm0uZmQsIDY0LCA2NCwgRFJNX0ZPUk1BVF9YUkdCODg4OCwK KwkJICAgICAgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQsICZwYXJhbXMtPnNwcml0ZSk7 CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJtLnBsYW5lcy0+Y291bnRfcGxhbmVzICYmIHBsYW5lX2lk ID09IDA7IGkrKykgeworCQlkcm1Nb2RlUGxhbmVQdHIgcGxhbmU7CisKKwkJcGxhbmUgPSBkcm1N b2RlR2V0UGxhbmUoZHJtLmZkLCBkcm0ucGxhbmVzLT5wbGFuZXNbaV0pOworCQlpZ3RfYXNzZXJ0 KHBsYW5lKTsKKworCQlpZiAocGxhbmUtPnBvc3NpYmxlX2NydGNzICYgKDEgPDwgY3J0Y19pbmRl eCkpCisJCQlwbGFuZV9pZCA9IHBsYW5lLT5wbGFuZV9pZDsKKworCQlkcm1Nb2RlRnJlZVBsYW5l KHBsYW5lKTsKKwl9CisJaWd0X2Fzc2VydChwbGFuZV9pZCk7CisKKwlwYXJhbXMtPmNydGNfaWQg PSBjcnRjX2lkOworCXBhcmFtcy0+Y29ubmVjdG9yX2lkID0gY29ubmVjdG9yX2lkOworCXBhcmFt cy0+bW9kZSA9IG1vZGU7CisJcGFyYW1zLT5zcHJpdGVfaWQgPSBwbGFuZV9pZDsKK30KKworZHJt TW9kZU1vZGVJbmZvIHN0ZF8xMDI0X21vZGUgPSB7CisJLmNsb2NrID0gNjUwMDAsCisJLmhkaXNw bGF5ID0gMTAyNCwKKwkuaHN5bmNfc3RhcnQgPSAxMDQ4LAorCS5oc3luY19lbmQgPSAxMTg0LAor CS5odG90YWwgPSAxMzQ0LAorCS52dG90YWwgPSA4MDYsCisJLmhza2V3ID0gMCwKKwkudmRpc3Bs YXkgPSA3NjgsCisJLnZzeW5jX3N0YXJ0ID0gNzcxLAorCS52c3luY19lbmQgPSA3NzcsCisJLnZ0 b3RhbCA9IDgwNiwKKwkudnNjYW4gPSAwLAorCS52cmVmcmVzaCA9IDYwLAorCS5mbGFncyA9IDB4 QSwKKwkudHlwZSA9IDB4NDAsCisJLm5hbWUgPSAiQ3VzdG9tIDEwMjR4NzY4IiwKK307CisKK3N0 YXRpYyBib29sIGNvbm5lY3Rvcl9nZXRfbW9kZShkcm1Nb2RlQ29ubmVjdG9yUHRyIGMsIGRybU1v ZGVNb2RlSW5mb1B0ciAqbW9kZSkKK3sKKwkqbW9kZSA9IE5VTEw7CisKKwlpZiAoYy0+Y29ubmVj dGlvbiAhPSBEUk1fTU9ERV9DT05ORUNURUQgfHwgIWMtPmNvdW50X21vZGVzKQorCQlyZXR1cm4g ZmFsc2U7CisKKwlpZiAoYy0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VE UCAmJiBvcHQubm9fZWRwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAob3B0LnNtYWxsX21vZGVz KQorCQkqbW9kZSA9IGdldF9jb25uZWN0b3Jfc21hbGxlc3RfbW9kZShjKTsKKwllbHNlCisJCSpt b2RlID0gJmMtPm1vZGVzWzBdOworCisJLyogQmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzIHdlIGRv bid0IGhhdmUgZW5vdWdoIHN0b2xlbiBtZW1vcnkgdG8gZml0IGluCisJICogdGhvc2UgM2sgcGFu ZWxzLiBBbmQgb24gSFNXIHRoZSBDUkMgV0EgaXMgc28gYXdmdWwgdGhhdCBpdCBtYWtlcyB5b3UK KwkgKiB0aGluayBldmVyeXRoaW5nIGlzIGJ1Z2dlZC4gKi8KKwlpZiAoYy0+Y29ubmVjdG9yX3R5 cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKKwkJKm1vZGUgPSAmc3RkXzEwMjRfbW9kZTsK KworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpbml0X21vZGVzZXRfY2FjaGVkX3Bh cmFtcyh2b2lkKQoreworCWludCBpOworCXVpbnQzMl90IHByaW1fY29ubmVjdG9yX2lkID0gMCwg c2NuZF9jb25uZWN0b3JfaWQgPSAwOworCWRybU1vZGVNb2RlSW5mb1B0ciBwcmltX21vZGUgPSBO VUxMLCBzY25kX21vZGUgPSBOVUxMOworCWRybU1vZGVNb2RlSW5mb1B0ciB0bXBfbW9kZTsKKwor CS8qIEZpcnN0LCB0cnkgdG8gZmluZCBhbiBlRFAgbW9uaXRvciBzaW5jZSBpdCdzIHRoZSBvbmx5 IHBvc3NpYmxlIHR5cGUKKwkgKiBmb3IgUFNSLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZHJtLnJl cy0+Y291bnRfY29ubmVjdG9yczsgaSsrKSB7CisJCWlmIChkcm0uY29ubmVjdG9yc1tpXS0+Y29u bmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKKwkJCWNvbnRpbnVlOworCisJ CWlmIChjb25uZWN0b3JfZ2V0X21vZGUoZHJtLmNvbm5lY3RvcnNbaV0sICZ0bXBfbW9kZSkpIHsK KwkJCXByaW1fY29ubmVjdG9yX2lkID0gZHJtLnJlcy0+Y29ubmVjdG9yc1tpXTsKKwkJCXByaW1f bW9kZSA9IHRtcF9tb2RlOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBkcm0ucmVzLT5jb3Vu dF9jb25uZWN0b3JzOyBpKyspIHsKKwkJLyogRG9uJ3QgcGljayBhZ2FpbiB3aGF0IHdlIGp1c3Qg c2VsZWN0ZWQgb24gdGhlIGFib3ZlIGxvb3AuICovCisJCWlmIChkcm0ucmVzLT5jb25uZWN0b3Jz W2ldID09IHByaW1fY29ubmVjdG9yX2lkKQorCQkJY29udGludWU7CisKKwkJaWYgKGNvbm5lY3Rv cl9nZXRfbW9kZShkcm0uY29ubmVjdG9yc1tpXSwgJnRtcF9tb2RlKSkgeworCQkJaWYgKCFwcmlt X2Nvbm5lY3Rvcl9pZCkgeworCQkJCXByaW1fY29ubmVjdG9yX2lkID0gZHJtLnJlcy0+Y29ubmVj dG9yc1tpXTsKKwkJCQlwcmltX21vZGUgPSB0bXBfbW9kZTsKKwkJCX0gZWxzZSBpZiAoIXNjbmRf Y29ubmVjdG9yX2lkKSB7CisJCQkJc2NuZF9jb25uZWN0b3JfaWQgPSBkcm0ucmVzLT5jb25uZWN0 b3JzW2ldOworCQkJCXNjbmRfbW9kZSA9IHRtcF9tb2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9 CisJfQorCisJaWYgKCFwcmltX2Nvbm5lY3Rvcl9pZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaW5p dF9tb2RlX3BhcmFtcygmcHJpbV9tb2RlX3BhcmFtcywgZHJtLnJlcy0+Y3J0Y3NbMF0sIDAsCisJ CQkgcHJpbV9jb25uZWN0b3JfaWQsIHByaW1fbW9kZSk7CisJcHJpbnRfbW9kZV9pbmZvKCJQcmlt YXJ5IiwgJnByaW1fbW9kZV9wYXJhbXMpOworCisJaWYgKCFzY25kX2Nvbm5lY3Rvcl9pZCkgewor CQlzY25kX21vZGVfcGFyYW1zLmNvbm5lY3Rvcl9pZCA9IDA7CisJCXJldHVybiB0cnVlOworCX0K KworCWlndF9hc3NlcnQoZHJtLnJlcy0+Y291bnRfY3J0Y3MgPj0gMik7CisJaW5pdF9tb2RlX3Bh cmFtcygmc2NuZF9tb2RlX3BhcmFtcywgZHJtLnJlcy0+Y3J0Y3NbMV0sIDEsCisJCQkgc2NuZF9j b25uZWN0b3JfaWQsIHNjbmRfbW9kZSk7CisJcHJpbnRfbW9kZV9pbmZvKCJTZWNvbmRhcnkiLCAm c2NuZF9tb2RlX3BhcmFtcyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgc2V0 X21vZGVfZm9yX3BhcmFtcyhzdHJ1Y3QgbW9kZXNldF9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQg cmM7CisKKwlyYyA9IGRybU1vZGVTZXRDcnRjKGRybS5mZCwgcGFyYW1zLT5jcnRjX2lkLCBwYXJh bXMtPmZiLmZiX2lkLCAwLCAwLAorCQkJICAgICZwYXJhbXMtPmNvbm5lY3Rvcl9pZCwgMSwgcGFy YW1zLT5tb2RlKTsKKwlyZXR1cm4gKHJjID09IDApOworfQorCisjZGVmaW5lIERFQlVHRlNfTVNH X1NJWkUgMjU2CisKK3N0YXRpYyB2b2lkIGdldF9kZWJ1Z2ZzX3N0cmluZyhpbnQgZmQsIGNoYXIg KmJ1ZikKK3sKKwlzc2l6ZV90IG5fcmVhZDsKKworCWxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisK KwluX3JlYWQgPSByZWFkKGZkLCBidWYsIERFQlVHRlNfTVNHX1NJWkUgLTEpOworCWlndF9hc3Nl cnQobl9yZWFkID49IDApOworCWJ1ZltuX3JlYWRdID0gJ1wwJzsKK30KKworc3RhdGljIGVudW0g ZmVhdHVyZV9zdGF0dXMgZmJjX2dldF9zdGF0dXModm9pZCkKK3sKKwljaGFyIGJ1ZltERUJVR0ZT X01TR19TSVpFXTsKKworCWdldF9kZWJ1Z2ZzX3N0cmluZyhmYmMuZmQsIGJ1Zik7CisKKwlpZiAo c3Ryc3RyKGJ1ZiwgIkZCQyBlbmFibGVkXG4iKSkKKwkJcmV0dXJuIEVOQUJMRUQ7CisJZWxzZQor CQlyZXR1cm4gRElTQUJMRUQ7Cit9CisKK3N0YXRpYyBlbnVtIGZlYXR1cmVfc3RhdHVzIHBzcl9n ZXRfc3RhdHVzKHZvaWQpCit7CisJY2hhciBidWZbREVCVUdGU19NU0dfU0laRV07CisKKwlnZXRf ZGVidWdmc19zdHJpbmcocHNyLmZkLCBidWYpOworCisJaWYgKHN0cnN0cihidWYsICJcbkFjdGl2 ZTogeWVzXG4iKSkKKwkJcmV0dXJuIEVOQUJMRUQ7CisJZWxzZQorCQlyZXR1cm4gRElTQUJMRUQ7 Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgZmJjX2dldF9sYXN0X2FjdGlvbih2b2lkKQor eworCXN0cnVjdCB0aW1lc3BlYyByZXQgPSB7IDAsIDAgfTsKKwljaGFyIGJ1ZltERUJVR0ZTX01T R19TSVpFXTsKKwljaGFyICphY3Rpb247CisJc3NpemVfdCBuX3JlYWQ7CisKKwlnZXRfZGVidWdm c19zdHJpbmcoZmJjLmZkLCBidWYpOworCisJYWN0aW9uID0gc3Ryc3RyKGJ1ZiwgIlxuTGFzdCBh Y3Rpb246Iik7CisJaWd0X2Fzc2VydChhY3Rpb24pOworCisJbl9yZWFkID0gc3NjYW5mKGFjdGlv biwgIkxhc3QgYWN0aW9uOiAlbGQuJWxkIiwKKwkJCSZyZXQudHZfc2VjLCAmcmV0LnR2X25zZWMp OworCWlndF9hc3NlcnQobl9yZWFkID09IDIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IGJvb2wgZmJjX2xhc3RfYWN0aW9uX2NoYW5nZWQodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMg dF9uZXcsIHRfb2xkOworCisJdF9vbGQgPSBmYmMubGFzdF9hY3Rpb247CisJdF9uZXcgPSBmYmNf Z2V0X2xhc3RfYWN0aW9uKCk7CisKKwlmYmMubGFzdF9hY3Rpb24gPSB0X25ldzsKKworI2lmIDAK KwlpZ3RfaW5mbygib2xkOiAlbGQuJWxkXG4iLCB0X29sZC50dl9zZWMsIHRfb2xkLnR2X25zZWMp OworCWlndF9pbmZvKCJuZXc6ICVsZC4lbGRcbiIsIHRfbmV3LnR2X3NlYywgdF9uZXcudHZfbnNl Yyk7CisjZW5kaWYKKworCXJldHVybiB0X29sZC50dl9zZWMgIT0gdF9uZXcudHZfc2VjIHx8CisJ ICAgICAgIHRfb2xkLnR2X25zZWMgIT0gdF9uZXcudHZfbnNlYzsKK30KKworc3RhdGljIHZvaWQg ZmJjX3VwZGF0ZV9sYXN0X2FjdGlvbih2b2lkKQoreworCWlmICghZmJjLnN1cHBvcnRzX2xhc3Rf YWN0aW9uKQorCQlyZXR1cm47CisKKwlmYmMubGFzdF9hY3Rpb24gPSBmYmNfZ2V0X2xhc3RfYWN0 aW9uKCk7CisKKyNpZiAwCisJaWd0X2luZm8oIkxhc3QgYWN0aW9uOiAlbGQuJWxkXG4iLAorCQkg ZmJjLmxhc3RfYWN0aW9uLnR2X3NlYywgZmJjLmxhc3RfYWN0aW9uLnR2X25zZWMpOworI2VuZGlm Cit9CisKK3N0YXRpYyB2b2lkIGZiY19zZXR1cF9sYXN0X2FjdGlvbih2b2lkKQoreworCXNzaXpl X3Qgbl9yZWFkOworCWNoYXIgYnVmW0RFQlVHRlNfTVNHX1NJWkVdOworCWNoYXIgKmFjdGlvbjsK KworCWdldF9kZWJ1Z2ZzX3N0cmluZyhmYmMuZmQsIGJ1Zik7CisKKwlhY3Rpb24gPSBzdHJzdHIo YnVmLCAiXG5MYXN0IGFjdGlvbjoiKTsKKwlpZiAoIWFjdGlvbikgeworCQlpZ3RfaW5mbygiRkJD IGxhc3QgYWN0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJZmJjLnN1 cHBvcnRzX2xhc3RfYWN0aW9uID0gdHJ1ZTsKKworCW5fcmVhZCA9IHNzY2FuZihhY3Rpb24sICJM YXN0IGFjdGlvbjogJWxkLiVsZCIsCisJCQkmZmJjLmxhc3RfYWN0aW9uLnR2X3NlYywgJmZiYy5s YXN0X2FjdGlvbi50dl9uc2VjKTsKKwlpZ3RfYXNzZXJ0KG5fcmVhZCA9PSAyKTsKK30KKworc3Rh dGljIGJvb2wgZmJjX2lzX2NvbXByZXNzaW5nKHZvaWQpCit7CisJY2hhciBidWZbREVCVUdGU19N U0dfU0laRV07CisKKwlnZXRfZGVidWdmc19zdHJpbmcoZmJjLmZkLCBidWYpOworCXJldHVybiBz dHJzdHIoYnVmLCAiXG5Db21wcmVzc2luZzogeWVzXG4iKSAhPSBOVUxMOworfQorCitzdGF0aWMg Ym9vbCBmYmNfd2FpdF9mb3JfY29tcHJlc3Npb24odm9pZCkKK3sKKwlyZXR1cm4gaWd0X3dhaXQo ZmJjX2lzX2NvbXByZXNzaW5nKCksIDUwMDAsIDEpOworfQorCitzdGF0aWMgdm9pZCBmYmNfc2V0 dXBfY29tcHJlc3Npbmcodm9pZCkKK3sKKwljaGFyIGJ1ZltERUJVR0ZTX01TR19TSVpFXTsKKwor CWdldF9kZWJ1Z2ZzX3N0cmluZyhmYmMuZmQsIGJ1Zik7CisKKwlpZiAoc3Ryc3RyKGJ1ZiwgIlxu Q29tcHJlc3Npbmc6IikpCisJCWZiYy5zdXBwb3J0c19jb21wcmVzc2luZyA9IHRydWU7CisJZWxz ZQorCQlpZ3RfaW5mbygiRkJDIGNvbXByZXNzaW9uIGluZm9ybWF0aW9uIG5vdCBzdXBwb3J0ZWRc biIpOworfQorCitzdGF0aWMgYm9vbCBmYmNfd2FpdF9mb3Jfc3RhdHVzKGVudW0gZmVhdHVyZV9z dGF0dXMgc3RhdHVzKQoreworCXJldHVybiBpZ3Rfd2FpdChmYmNfZ2V0X3N0YXR1cygpID09IHN0 YXR1cywgNTAwMCwgMSk7Cit9CisKK3N0YXRpYyBib29sIHBzcl93YWl0X2Zvcl9zdGF0dXMoZW51 bSBmZWF0dXJlX3N0YXR1cyBzdGF0dXMpCit7CisJcmV0dXJuIGlndF93YWl0KHBzcl9nZXRfc3Rh dHVzKCkgPT0gc3RhdHVzLCA1MDAwLCAxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtKGNv bnN0IGNoYXIgKnBhdGgsIGJvb2wgZW5hYmxlKQoreworCWludCBmZDsKKwljb25zdCBjaGFyICpz dHI7CisKKwlmZCA9IG9wZW4ocGF0aCwgT19SRFdSKTsKKwlpZ3RfYXNzZXJ0KGZkID49IDApOwor CisJc3RyID0gZW5hYmxlID8gIjFcbiIgOiAiMFxuIjsKKwlpZ3RfYXNzZXJ0KHdyaXRlKGZkLCBz dHIsIDIpID09IDIpOworCisJaWd0X2Fzc2VydChjbG9zZShmZCkgPT0gMCk7Cit9CisjZGVmaW5l IGZiY19lbmFibGUoKSBzZXRfcGFyYW0oRkJDX1BBUkFNX1BBVEgsIHRydWUpCisjZGVmaW5lIGZi Y19kaXNhYmxlKCkgc2V0X3BhcmFtKEZCQ19QQVJBTV9QQVRILCBmYWxzZSkKKyNkZWZpbmUgcHNy X2VuYWJsZSgpIHNldF9wYXJhbShQU1JfUEFSQU1fUEFUSCwgdHJ1ZSkKKyNkZWZpbmUgcHNyX2Rp c2FibGUoKSBzZXRfcGFyYW0oUFNSX1BBUkFNX1BBVEgsIGZhbHNlKQorCitzdGF0aWMgdm9pZCBz YXZlX3BhcmFtKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgY2hhciAqcGFyYW1fdmFsdWUpCit7CisJ aW50IGZkOworCXNzaXplX3QgbjsKKworCWZkID0gb3BlbihmaWxlX3BhdGgsIE9fUkRXUik7CisJ aWd0X2Fzc2VydChmZCA+PSAwKTsKKworCW4gPSByZWFkKGZkLCBwYXJhbV92YWx1ZSwgMTUpOwor CWlndF9hc3NlcnQobiA+IDApOworCXBhcmFtX3ZhbHVlW25dID0gJ1wwJzsKKwlpZ3RfYXNzZXJ0 KGNsb3NlKGZkKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3NpbmtfY3JjKHNpbmtfY3Jj X3QgKmNyYykKK3sKKwlsc2VlayhzaW5rX2NyYy5mZCwgMCwgU0VFS19TRVQpOworCisJaWd0X2Fz c2VydChyZWFkKHNpbmtfY3JjLmZkLCBjcmMtPmRhdGEsIFNJTktfQ1JDX1NJWkUpID09CisJCSAg IFNJTktfQ1JDX1NJWkUpOworfQorCitzdGF0aWMgYm9vbCBzaW5rX2NyY19lcXVhbChzaW5rX2Ny Y190ICphLCBzaW5rX2NyY190ICpiKQoreworCXJldHVybiAobWVtY21wKGEtPmRhdGEsIGItPmRh dGEsIFNJTktfQ1JDX1NJWkUpID09IDApOworfQorCisjZGVmaW5lIGFzc2VydF9zaW5rX2NyY19l cXVhbChhLCBiKSBpZ3RfYXNzZXJ0KHNpbmtfY3JjX2VxdWFsKGEsIGIpKQorCitzdGF0aWMgc3Ry dWN0IHJlY3QgcGF0MV9nZXRfcmVjdChzdHJ1Y3QgaWd0X2ZiICpmYiwgaW50IHIpCit7CisJc3Ry dWN0IHJlY3QgcmVjdDsKKworCXN3aXRjaCAocikgeworCWNhc2UgMDoKKwkJcmVjdC54ID0gMDsK KwkJcmVjdC55ID0gMDsKKwkJcmVjdC53ID0gZmItPndpZHRoICAvIDg7CisJCXJlY3QuaCA9IGZi LT5oZWlnaHQgLyA4OworCQlyZWN0LmNvbG9yID0gMHgwMEZGMDA7CisJCWJyZWFrOworCWNhc2Ug MToKKwkJcmVjdC54ID0gZmItPndpZHRoICAvIDg7CisJCXJlY3QueSA9IGZiLT5oZWlnaHQgLyA4 OworCQlyZWN0LncgPSBmYi0+d2lkdGggIC8gODsKKwkJcmVjdC5oID0gZmItPmhlaWdodCAvIDg7 CisJCXJlY3QuY29sb3IgPSAweEZGMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZWN0Lngg PSBmYi0+d2lkdGggIC8gOCAqIDQ7CisJCXJlY3QueSA9IGZiLT5oZWlnaHQgLyA4ICogNDsKKwkJ cmVjdC53ID0gZmItPndpZHRoICAvIDggKiAyOworCQlyZWN0LmggPSBmYi0+aGVpZ2h0IC8gOCAq IDI7CisJCXJlY3QuY29sb3IgPSAweEZGMDBGRjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlyZWN0 LnggPSBmYi0+d2lkdGggIC8gMTY7CisJCXJlY3QueSA9IGZiLT5oZWlnaHQgLyAxNjsKKwkJcmVj dC53ID0gZmItPndpZHRoICAvIDg7CisJCXJlY3QuaCA9IGZiLT5oZWlnaHQgLyA4OworCQlyZWN0 LmNvbG9yID0gMHgwMEZGRkY7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcmVjdC54ID0gZmItPndp ZHRoIC0gNjQ7CisJCXJlY3QueSA9IGZiLT5oZWlnaHQgLSA2NDsKKwkJcmVjdC53ID0gNjQ7CisJ CXJlY3QuaCA9IDY0OworCQlyZWN0LmNvbG9yID0gMHhGRkZGRkY7CisJCWJyZWFrOworCWRlZmF1 bHQ6CisJCWlndF9hc3NlcnQoMCk7CisJfQorCisJcmV0dXJuIHJlY3Q7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgcmVjdCBwYXQyX2dldF9yZWN0KHN0cnVjdCBpZ3RfZmIgKmZiLCBpbnQgcikKK3sKKwlz dHJ1Y3QgcmVjdCByZWN0OworCisJcmVjdC54ID0gMDsKKwlyZWN0LnkgPSAwOworCXJlY3QudyA9 IDY0OworCXJlY3QuaCA9IDY0OworCisJc3dpdGNoIChyKSB7CisJY2FzZSAwOgorCQlyZWN0LmNv bG9yID0gMHhGRjAwRkYwMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZWN0LncgPSAzMjsKKwkJ cmVjdC5oID0gMzI7CisJCXJlY3QuY29sb3IgPSAweEZGRkYwMDAwOworCQlicmVhazsKKwljYXNl IDI6CisJCXJlY3QueCA9IDMyOworCQlyZWN0LnkgPSAzMjsKKwkJcmVjdC53ID0gMzI7CisJCXJl Y3QuaCA9IDMyOworCQlyZWN0LmNvbG9yID0gMHhGRkZGMDBGRjsKKwkJYnJlYWs7CisJY2FzZSAz OgorCQlyZWN0LnggPSAxNjsKKwkJcmVjdC55ID0gMTY7CisJCXJlY3QudyA9IDMyOworCQlyZWN0 LmggPSAzMjsKKwkJcmVjdC5jb2xvciA9IDB4RkYwMEZGRkY7CisJCWJyZWFrOworCWNhc2UgNDoK KwkJcmVjdC5jb2xvciA9IDB4RkZGRkZGMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlndF9h c3NlcnQoMCk7CisJfQorCisJcmV0dXJuIHJlY3Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVjdCBw YXQzX2dldF9yZWN0KHN0cnVjdCBpZ3RfZmIgKmZiLCBpbnQgcikKK3sKKwlzdHJ1Y3QgcmVjdCBy ZWN0OworCisJcmVjdC53ID0gNjQ7CisJcmVjdC5oID0gNjQ7CisJcmVjdC5jb2xvciA9IDB4RkYw MEZGMDA7CisKKwlzd2l0Y2ggKHIpIHsKKwljYXNlIDA6CisJCXJlY3QueCA9IDA7CisJCXJlY3Qu eSA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmVjdC54ID0gNjQ7CisJCXJlY3QueSA9IDY0 OworCQlicmVhazsKKwljYXNlIDI6CisJCXJlY3QueCA9IDE7CisJCXJlY3QueSA9IDE7CisJCWJy ZWFrOworCWNhc2UgMzoKKwkJcmVjdC54ID0gZmItPndpZHRoIC0gNjQ7CisJCXJlY3QueSA9IGZi LT5oZWlnaHQgLSA2NDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlyZWN0LnggPSBmYi0+d2lkdGgg LyAyIC0gMzI7CisJCXJlY3QueSA9IGZiLT5oZWlnaHQgLyAyIC0gMzI7CisJCWJyZWFrOworCWRl ZmF1bHQ6CisJCWlndF9hc3NlcnQoMCk7CisJfQorCisJcmV0dXJuIHJlY3Q7Cit9CisKK3N0YXRp YyBzdHJ1Y3QgcmVjdCBwYXQ0X2dldF9yZWN0KHN0cnVjdCBpZ3RfZmIgKmZiLCBpbnQgcikKK3sK KwlzdHJ1Y3QgcmVjdCByZWN0OworCisJaWd0X2Fzc2VydChyID09IDApOworCisJcmVjdC54ID0g MDsKKwlyZWN0LnkgPSAwOworCXJlY3QudyA9IGZiLT53aWR0aDsKKwlyZWN0LmggPSBmYi0+aGVp Z2h0OworCXJlY3QuY29sb3IgPSAweEZGMDBGRjAwOworCisJcmV0dXJuIHJlY3Q7Cit9CisKK3N0 YXRpYyB2b2lkIGRyYXdfcmVjdChzdHJ1Y3QgZHJhd19wYXR0ZXJuX2luZm8gKnBhdHRlcm4sIHN0 cnVjdCBpZ3RfZmIgKmZiLAorCQkgICAgICBlbnVtIGlndF9kcmF3X21ldGhvZCBtZXRob2QsIGlu dCByKQoreworCXN0cnVjdCByZWN0IHJlY3QgPSBwYXR0ZXJuLT5nZXRfcmVjdChmYiwgcik7CisK KwlpZ3RfZHJhd19yZWN0X2ZiKGRybS5mZCwgZHJtLmJ1Zm1nciwgTlVMTCwgZmIsIG1ldGhvZCwg cmVjdC54LCByZWN0LnksCisJCQkgcmVjdC53LCByZWN0LmgsIHJlY3QuY29sb3IpOworfQorCitz dGF0aWMgdm9pZCB1bnNldF9hbGxfY3J0Y3Modm9pZCkKK3sKKwlpbnQgaSwgcmM7CisKKwlmb3Ig KGkgPSAwOyBpIDwgZHJtLnJlcy0+Y291bnRfY3J0Y3M7IGkrKykgeworCQlyYyA9IGRybU1vZGVT ZXRDcnRjKGRybS5mZCwgZHJtLnJlcy0+Y3J0Y3NbaV0sIC0xLCAwLCAwLCBOVUxMLAorCQkJCSAg ICAwLCBOVUxMKTsKKwkJaWd0X2Fzc2VydChyYyA9PSAwKTsKKworCQlyYyA9IGRybU1vZGVTZXRD dXJzb3IoZHJtLmZkLCBkcm0ucmVzLT5jcnRjc1tpXSwgMCwgMCwgMCk7CisJCWlndF9hc3NlcnQo cmMgPT0gMCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRybS5wbGFuZXMtPmNvdW50X3BsYW5l czsgaSsrKSB7CisJCXJjID0gZHJtTW9kZVNldFBsYW5lKGRybS5mZCwgZHJtLnBsYW5lcy0+cGxh bmVzW2ldLCAwLCAwLCAwLCAwLAorCQkJCSAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisJCWln dF9hc3NlcnQocmMgPT0gMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2ZlYXR1cmVz KHZvaWQpCit7CisJZmJjX2Rpc2FibGUoKTsKKwlwc3JfZGlzYWJsZSgpOworfQorCitzdGF0aWMg dm9pZCBwcmludF9jcmMoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgYm90aF9jcmNzICpjcmMpCit7 CisJaW50IGk7CisJY2hhciAqcGlwZV9zdHI7CisKKwlwaXBlX3N0ciA9IGlndF9jcmNfdG9fc3Ry aW5nKCZjcmMtPnBpcGUpOworCisJaWd0X2RlYnVnKCIlcyBwaXBlOlslc10gc2luazpbIiwgc3Ry LCBwaXBlX3N0cik7CisJZm9yIChpID0gMDsgaSA8IFNJTktfQ1JDX1NJWkU7IGkrKykKKwkJaWd0 X2RlYnVnKCIlYyIsIGNyYy0+c2luay5kYXRhW2ldKTsKKwlpZ3RfZGVidWcoIl1cbiIpOworCisJ ZnJlZShwaXBlX3N0cik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxlY3RfY3JjcyhzdHJ1Y3QgYm90 aF9jcmNzICpjcmNzKQoreworCWRybU1vZGVDb25uZWN0b3JQdHIgYzsKKworCWlndF9waXBlX2Ny Y19jb2xsZWN0X2NyYyhwaXBlX2NyYywgJmNyY3MtPnBpcGUpOworCisJYyA9IGdldF9jb25uZWN0 b3IocHJpbV9tb2RlX3BhcmFtcy5jb25uZWN0b3JfaWQpOworCWlmIChjLT5jb25uZWN0b3JfdHlw ZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKQorCQlnZXRfc2lua19jcmMoJmNyY3MtPnNpbmsp OworCWVsc2UKKwkJbWVtY3B5KCZjcmNzLT5zaW5rLCAidW5zdXBwb3J0ZWQhIiwgU0lOS19DUkNf U0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfYmx1ZV9jcmModm9pZCkKK3sKKwlzdHJ1Y3Qg aWd0X2ZiIGJsdWU7CisJaW50IHJjOworCisJZGlzYWJsZV9mZWF0dXJlcygpOworCXVuc2V0X2Fs bF9jcnRjcygpOworCisJaWd0X2NyZWF0ZV9mYihkcm0uZmQsIHByaW1fbW9kZV9wYXJhbXMubW9k ZS0+aGRpc3BsYXksCisJCSAgICAgIHByaW1fbW9kZV9wYXJhbXMubW9kZS0+dmRpc3BsYXksIERS TV9GT1JNQVRfWFJHQjg4ODgsCisJCSAgICAgIExPQ0FMX0k5MTVfRk9STUFUX01PRF9YX1RJTEVE LCAmYmx1ZSk7CisKKwlpZ3RfZHJhd19maWxsX2ZiKGRybS5mZCwgJmJsdWUsIDB4RkYpOworCisJ cmMgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm0uZmQsIHByaW1fbW9kZV9wYXJhbXMuY3J0Y19pZCwKKwkJ CSAgICBibHVlLmZiX2lkLCAwLCAwLCAmcHJpbV9tb2RlX3BhcmFtcy5jb25uZWN0b3JfaWQsIDEs CisJCQkgICAgcHJpbV9tb2RlX3BhcmFtcy5tb2RlKTsKKwlpZ3RfYXNzZXJ0KHJjID09IDApOwor CWNvbGxlY3RfY3JjcygmYmx1ZV9jcmMpOworCisJcHJpbnRfY3JjKCJCbHVlIENSQzogICIsICZi bHVlX2NyYyk7CisKKwlpZ3RfcmVtb3ZlX2ZiKGRybS5mZCwgJmJsdWUpOworfQorCitzdGF0aWMg dm9pZCBpbml0X2NyY3Moc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvICpwYXR0ZXJuKQoreworCWlu dCByLCByXywgcmM7CisJc3RydWN0IGlndF9mYiBmYnNbcGF0dGVybi0+bl9yZWN0c107CisKKwlp ZiAocGF0dGVybi0+aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCXBhdHRlcm4tPmNyY3MgPSBj YWxsb2MocGF0dGVybi0+bl9yZWN0cywgc2l6ZW9mKCoocGF0dGVybi0+Y3JjcykpKTsKKworCWZv ciAociA9IDA7IHIgPCBwYXR0ZXJuLT5uX3JlY3RzOyByKyspCisJCWlndF9jcmVhdGVfZmIoZHJt LmZkLCBwcmltX21vZGVfcGFyYW1zLm1vZGUtPmhkaXNwbGF5LAorCQkJICAgICAgcHJpbV9tb2Rl X3BhcmFtcy5tb2RlLT52ZGlzcGxheSwKKwkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCisJ CQkgICAgICBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxFRCwgJmZic1tyXSk7CisKKwlmb3Ig KHIgPSAwOyByIDwgcGF0dGVybi0+bl9yZWN0czsgcisrKQorCQlpZ3RfZHJhd19maWxsX2ZiKGRy bS5mZCwgJmZic1tyXSwgMHhGRik7CisKKwlpZiAocGF0dGVybi0+ZnJhbWVzX3N0YWNrKSB7CisJ CWZvciAociA9IDA7IHIgPCBwYXR0ZXJuLT5uX3JlY3RzOyByKyspCisJCQlmb3IgKHJfID0gMDsg cl8gPD0gcjsgcl8rKykKKwkJCQlkcmF3X3JlY3QocGF0dGVybiwgJmZic1tyXSwgSUdUX0RSQVdf UFdSSVRFLAorCQkJCQkgIHJfKTsKKwl9IGVsc2UgeworCQlmb3IgKHIgPSAwOyByIDwgcGF0dGVy bi0+bl9yZWN0czsgcisrKQorCQkJZHJhd19yZWN0KHBhdHRlcm4sICZmYnNbcl0sIElHVF9EUkFX X1BXUklURSwgcik7CisJfQorCisJZm9yIChyID0gMDsgciA8IHBhdHRlcm4tPm5fcmVjdHM7IHIr KykgeworCQlyYyA9IGRybU1vZGVTZXRDcnRjKGRybS5mZCwgcHJpbV9tb2RlX3BhcmFtcy5jcnRj X2lkLAorCQkJCSAgIGZic1tyXS5mYl9pZCwgMCwgMCwKKwkJCQkgICAmcHJpbV9tb2RlX3BhcmFt cy5jb25uZWN0b3JfaWQsIDEsCisJCQkJICAgcHJpbV9tb2RlX3BhcmFtcy5tb2RlKTsKKwkJaWd0 X2Fzc2VydChyYyA9PSAwKTsKKwkJY29sbGVjdF9jcmNzKCZwYXR0ZXJuLT5jcmNzW3JdKTsKKwl9 CisKKwlmb3IgKHIgPSAwOyByIDwgcGF0dGVybi0+bl9yZWN0czsgcisrKSB7CisJCWlndF9kZWJ1 ZygiUmVjdCAlZCBDUkM6Iiwgcik7CisJCXByaW50X2NyYygiIiwgJnBhdHRlcm4tPmNyY3Nbcl0p OworCX0KKworCXVuc2V0X2FsbF9jcnRjcygpOworCisJZm9yIChyID0gMDsgciA8IHBhdHRlcm4t Pm5fcmVjdHM7IHIrKykKKwkJaWd0X3JlbW92ZV9mYihkcm0uZmQsICZmYnNbcl0pOworCisJcGF0 dGVybi0+aW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9kcm0odm9p ZCkKK3sKKwlpbnQgaTsKKworCWRybS5mZCA9IGRybV9vcGVuX2FueV9tYXN0ZXIoKTsKKwlpZ3Rf cmVxdWlyZShkcm0uZmQgPj0gMCk7CisKKwlkcm0ucmVzID0gZHJtTW9kZUdldFJlc291cmNlcyhk cm0uZmQpOworCWlndF9hc3NlcnQoZHJtLnJlcy0+Y291bnRfY29ubmVjdG9ycyA8PSBNQVhfQ09O TkVDVE9SUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJtLnJlcy0+Y291bnRfY29ubmVjdG9yczsg aSsrKQorCQlkcm0uY29ubmVjdG9yc1tpXSA9IGRybU1vZGVHZXRDb25uZWN0b3IoZHJtLmZkLAor CQkJCQkJZHJtLnJlcy0+Y29ubmVjdG9yc1tpXSk7CisKKwlkcm0ucGxhbmVzID0gZHJtTW9kZUdl dFBsYW5lUmVzb3VyY2VzKGRybS5mZCk7CisKKwlkcm0uYnVmbWdyID0gZHJtX2ludGVsX2J1Zm1n cl9nZW1faW5pdChkcm0uZmQsIDQwOTYpOworCWlndF9hc3NlcnQoZHJtLmJ1Zm1ncik7CisJZHJt X2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3JldXNlKGRybS5idWZtZ3IpOworfQorCitzdGF0aWMg dm9pZCB0ZWFyZG93bl9kcm0odm9pZCkKK3sKKwlpbnQgaTsKKworCWRybV9pbnRlbF9idWZtZ3Jf ZGVzdHJveShkcm0uYnVmbWdyKTsKKworCWRybU1vZGVGcmVlUGxhbmVSZXNvdXJjZXMoZHJtLnBs YW5lcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJtLnJlcy0+Y291bnRfY29ubmVjdG9yczsgaSsr KQorCQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihkcm0uY29ubmVjdG9yc1tpXSk7CisKKwlkcm1Nb2Rl RnJlZVJlc291cmNlcyhkcm0ucmVzKTsKKwljbG9zZShkcm0uZmQpOworfQorCitzdGF0aWMgdm9p ZCBzZXR1cF9tb2Rlc2V0KHZvaWQpCit7CisJaWd0X3JlcXVpcmUoaW5pdF9tb2Rlc2V0X2NhY2hl ZF9wYXJhbXMoKSk7CisKKwlrbXN0ZXN0X3NldF92dF9ncmFwaGljc19tb2RlKCk7CisKKwlpZ3Rf Y3JlYXRlX2ZiKGRybS5mZCwgMTAyNCwgMTAyNCwgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJICAg ICAgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQsICZvZmZzY3JlZW5fZmIpOworfQorCitz dGF0aWMgdm9pZCB0ZWFyZG93bl9tb2Rlc2V0KHZvaWQpCit7CisJaWYgKHNjbmRfbW9kZV9wYXJh bXMuY29ubmVjdG9yX2lkKSB7CisJCWlndF9yZW1vdmVfZmIoZHJtLmZkLCAmc2NuZF9tb2RlX3Bh cmFtcy5mYik7CisJCWlndF9yZW1vdmVfZmIoZHJtLmZkLCAmc2NuZF9tb2RlX3BhcmFtcy5jdXJz b3IpOworCQlpZ3RfcmVtb3ZlX2ZiKGRybS5mZCwgJnNjbmRfbW9kZV9wYXJhbXMuc3ByaXRlKTsK Kwl9CisJaWd0X3JlbW92ZV9mYihkcm0uZmQsICZwcmltX21vZGVfcGFyYW1zLmZiKTsKKwlpZ3Rf cmVtb3ZlX2ZiKGRybS5mZCwgJnByaW1fbW9kZV9wYXJhbXMuY3Vyc29yKTsKKwlpZ3RfcmVtb3Zl X2ZiKGRybS5mZCwgJnByaW1fbW9kZV9wYXJhbXMuc3ByaXRlKTsKKwlpZ3RfcmVtb3ZlX2ZiKGRy bS5mZCwgJm9mZnNjcmVlbl9mYik7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2NyY3Modm9pZCkK K3sKKwlwaXBlX2NyYyA9IGlndF9waXBlX2NyY19uZXcoMCwgSU5URUxfUElQRV9DUkNfU09VUkNF X0FVVE8pOworCisJc2lua19jcmMuZmQgPSBvcGVuKCIvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvMC9p OTE1X3NpbmtfY3JjX2VEUDEiLAorCQkJICAgT19SRE9OTFkpOworCWlndF9hc3NlcnQoc2lua19j cmMuZmQgPj0gMCk7CisKKwlpbml0X2JsdWVfY3JjKCk7CisKKwlwYXR0ZXJuMS5pbml0aWFsaXpl ZCA9IGZhbHNlOworCXBhdHRlcm4xLmZyYW1lc19zdGFjayA9IHRydWU7CisJcGF0dGVybjEubl9y ZWN0cyA9IDU7CisJcGF0dGVybjEuY3JjcyA9IE5VTEw7CisJcGF0dGVybjEuZ2V0X3JlY3QgPSBw YXQxX2dldF9yZWN0OworCisJcGF0dGVybjIuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwlwYXR0ZXJu Mi5mcmFtZXNfc3RhY2sgPSB0cnVlOworCXBhdHRlcm4yLm5fcmVjdHMgPSA1OworCXBhdHRlcm4y LmNyY3MgPSBOVUxMOworCXBhdHRlcm4yLmdldF9yZWN0ID0gcGF0Ml9nZXRfcmVjdDsKKworCXBh dHRlcm4zLmluaXRpYWxpemVkID0gZmFsc2U7CisJcGF0dGVybjMuZnJhbWVzX3N0YWNrID0gZmFs c2U7CisJcGF0dGVybjMubl9yZWN0cyA9IDU7CisJcGF0dGVybjMuY3JjcyA9IE5VTEw7CisJcGF0 dGVybjMuZ2V0X3JlY3QgPSBwYXQzX2dldF9yZWN0OworCisJcGF0dGVybjQuaW5pdGlhbGl6ZWQg PSBmYWxzZTsKKwlwYXR0ZXJuNC5mcmFtZXNfc3RhY2sgPSBmYWxzZTsKKwlwYXR0ZXJuNC5uX3Jl Y3RzID0gMTsKKwlwYXR0ZXJuNC5jcmNzID0gTlVMTDsKKwlwYXR0ZXJuNC5nZXRfcmVjdCA9IHBh dDRfZ2V0X3JlY3Q7Cit9CisKK3N0YXRpYyB2b2lkIHRlYXJkb3duX2NyY3Modm9pZCkKK3sKKwlp ZiAocGF0dGVybjEuY3JjcykKKwkJZnJlZShwYXR0ZXJuMS5jcmNzKTsKKwlpZiAocGF0dGVybjIu Y3JjcykKKwkJZnJlZShwYXR0ZXJuMi5jcmNzKTsKKwlpZiAocGF0dGVybjMuY3JjcykKKwkJZnJl ZShwYXR0ZXJuMy5jcmNzKTsKKwlpZiAocGF0dGVybjQuY3JjcykKKwkJZnJlZShwYXR0ZXJuNC5j cmNzKTsKKworCWNsb3NlKHNpbmtfY3JjLmZkKTsKKworCWlndF9waXBlX2NyY19mcmVlKHBpcGVf Y3JjKTsKK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV9wYXJhbShjb25zdCBjaGFyICpmaWxlX3Bh dGgsIGNoYXIgKnBhcmFtX3ZhbHVlKQoreworCWludCBmZDsKKworCWZkID0gb3BlbihmaWxlX3Bh dGgsIE9fUkRXUik7CisJaWYgKGZkID49IDApIHsKKwkJd3JpdGUoZmQsIHBhcmFtX3ZhbHVlLCBz dHJsZW4ocGFyYW1fdmFsdWUpKTsKKwkJY2xvc2UoZmQpOworCX0KK30KKworc3RhdGljIHZvaWQg ZXhpdF9oYW5kbGVyKGludCBzaWcpCit7CisJcmVzdG9yZV9wYXJhbShGQkNfUEFSQU1fUEFUSCwg ZmJjLnBhcmFtX29yaWdpbmFsX3ZhbHVlKTsKKwlyZXN0b3JlX3BhcmFtKFBTUl9QQVJBTV9QQVRI LCBwc3IucGFyYW1fb3JpZ2luYWxfdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9mYmMo dm9pZCkKK3sKKwlmYmMuZmQgPSBvcGVuKCIvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvMC9pOTE1X2Zi Y19zdGF0dXMiLCBPX1JET05MWSk7CisJaWd0X2Fzc2VydChmYmMuZmQgPj0gMCk7CisKKwlzYXZl X3BhcmFtKEZCQ19QQVJBTV9QQVRILCBmYmMucGFyYW1fb3JpZ2luYWxfdmFsdWUpOworCisJZmJj X3NldHVwX2xhc3RfYWN0aW9uKCk7CisJZmJjX3NldHVwX2NvbXByZXNzaW5nKCk7Cit9CisKK3N0 YXRpYyB2b2lkIHRlYXJkb3duX2ZiYyh2b2lkKQoreworCWlmIChmYmMuZmQgIT0gLTEpCisJCWNs b3NlKGZiYy5mZCk7Cit9CisKK3N0YXRpYyBib29sIHBzcl9zaW5rX2hhc19zdXBwb3J0KHZvaWQp Cit7CisJY2hhciBidWZbREVCVUdGU19NU0dfU0laRV07CisKKwlnZXRfZGVidWdmc19zdHJpbmco cHNyLmZkLCBidWYpOworCisJcmV0dXJuIHN0cnN0cihidWYsICJTaW5rX1N1cHBvcnQ6IHllc1xu Iik7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3Bzcih2b2lkKQoreworCWlmIChnZXRfY29ubmVj dG9yKHByaW1fbW9kZV9wYXJhbXMuY29ubmVjdG9yX2lkKS0+Y29ubmVjdG9yX3R5cGUgIT0KKwkg ICAgRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgeworCQlpZ3RfaW5mbygiQ2FuJ3QgdGVzdCBQU1I6 IG5vIHVzYWJsZSBlRFAgc2NyZWVuLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlwc3IuZmQgPSBv cGVuKCIvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvMC9pOTE1X2VkcF9wc3Jfc3RhdHVzIiwgT19SRE9O TFkpOworCWlndF9hc3NlcnQocHNyLmZkID49IDApOworCisJaWYgKCFwc3Jfc2lua19oYXNfc3Vw cG9ydCgpKSB7CisJCWlndF9pbmZvKCJDYW4ndCB0ZXN0IFBTUjogbm90IHN1cHBvcnRlZCBieSBz aW5rLlxuIik7CisJCXJldHVybjsKKwl9CisJcHNyLmNhbl90ZXN0ID0gdHJ1ZTsKKworCXNhdmVf cGFyYW0oUFNSX1BBUkFNX1BBVEgsIHBzci5wYXJhbV9vcmlnaW5hbF92YWx1ZSk7Cit9CisKK3N0 YXRpYyB2b2lkIHRlYXJkb3duX3Bzcih2b2lkKQoreworCWlmIChwc3IuZmQgIT0gLTEpCisJCWNs b3NlKHBzci5mZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2Vudmlyb25tZW50KHZvaWQpCit7 CisJc2V0dXBfZHJtKCk7CisJc2V0dXBfbW9kZXNldCgpOworCisJaWd0X2luc3RhbGxfZXhpdF9o YW5kbGVyKGV4aXRfaGFuZGxlcik7CisJc2V0dXBfZmJjKCk7CisJc2V0dXBfcHNyKCk7CisKKwlz ZXR1cF9jcmNzKCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlYXJkb3duX2Vudmlyb25tZW50KHZvaWQp Cit7CisJdGVhcmRvd25fY3JjcygpOworCXRlYXJkb3duX3BzcigpOworCXRlYXJkb3duX2ZiYygp OworCXRlYXJkb3duX21vZGVzZXQoKTsKKwl0ZWFyZG93bl9kcm0oKTsKK30KKworc3RhdGljIHZv aWQgd2FpdF91c2VyKHZvaWQpCit7CisJaWd0X2luZm8oIlByZXNzIGVudGVyLi4uXG4iKTsKKwl3 aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpCisJCTsKK30KKworc3RhdGljIHN0cnVjdCBtb2Rlc2V0 X3BhcmFtcyAqcGlja19wYXJhbXMoY29uc3Qgc3RydWN0IHRlc3RfbW9kZSAqdCkKK3sKKwlzd2l0 Y2ggKHQtPnNjcmVlbikgeworCWNhc2UgU0NSRUVOX1BSSU06CisJCXJldHVybiAmcHJpbV9tb2Rl X3BhcmFtczsKKwljYXNlIFNDUkVFTl9TQ05EOgorCQlyZXR1cm4gJnNjbmRfbW9kZV9wYXJhbXM7 CisJY2FzZSBTQ1JFRU5fT0ZGU0NSRUVOOgorCQlyZXR1cm4gTlVMTDsKKwlkZWZhdWx0OgorCQlp Z3RfYXNzZXJ0KGZhbHNlKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWd0X2ZiICpwaWNrX3Rh cmdldChjb25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0LAorCQkJCSAgc3RydWN0IG1vZGVzZXRfcGFy YW1zICpwYXJhbXMpCit7CisJaWYgKCFwYXJhbXMpCisJCXJldHVybiAmb2Zmc2NyZWVuX2ZiOwor CisJc3dpdGNoICh0LT5wbGFuZSkgeworCWNhc2UgUExBTkVfUFJJOgorCQlyZXR1cm4gJnBhcmFt cy0+ZmI7CisJY2FzZSBQTEFORV9DVVI6CisJCXJldHVybiAmcGFyYW1zLT5jdXJzb3I7CisJY2Fz ZSBQTEFORV9TUFI6CisJCXJldHVybiAmcGFyYW1zLT5zcHJpdGU7CisJZGVmYXVsdDoKKwkJaWd0 X2Fzc2VydChmYWxzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19mbHVzaChjb25zdCBzdHJ1 Y3QgdGVzdF9tb2RlICp0KQoreworCXN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqcGFyYW1zID0gcGlj a19wYXJhbXModCk7CisJc3RydWN0IGlndF9mYiAqdGFyZ2V0ID0gcGlja190YXJnZXQodCwgcGFy YW1zKTsKKworCWdlbV9zZXRfZG9tYWluKGRybS5mZCwgdGFyZ2V0LT5nZW1faGFuZGxlLCBJOTE1 X0dFTV9ET01BSU5fR1RULCAwKTsKK30KKworI2RlZmluZSBET05UX0FTU0VSVF9DUkMJCQkoMSA8 PCAwKQorCisjZGVmaW5lIEZCQ19BU1NFUlRfRkxBR1MJCSgweEYgPDwgMSkKKyNkZWZpbmUgQVNT RVJUX0ZCQ19FTkFCTEVECQkoMSA8PCAxKQorI2RlZmluZSBBU1NFUlRfRkJDX0RJU0FCTEVECQko MSA8PCAyKQorI2RlZmluZSBBU1NFUlRfTEFTVF9BQ1RJT05fQ0hBTkdFRAkoMSA8PCAzKQorI2Rl ZmluZSBBU1NFUlRfTk9fQUNUSU9OX0NIQU5HRQkJKDEgPDwgNCkKKworI2RlZmluZSBQU1JfQVNT RVJUX0ZMQUdTCQkoMyA8PCA1KQorI2RlZmluZSBBU1NFUlRfUFNSX0VOQUJMRUQJCSgxIDw8IDUp CisjZGVmaW5lIEFTU0VSVF9QU1JfRElTQUJMRUQJCSgxIDw8IDYpCisKK3N0YXRpYyBpbnQgYWRq dXN0X2Fzc2VydGlvbl9mbGFncyhjb25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0LCBpbnQgZmxhZ3Mp Cit7CisJaWYgKCEoZmxhZ3MgJiBBU1NFUlRfRkJDX0RJU0FCTEVEKSkKKwkJZmxhZ3MgfD0gQVNT RVJUX0ZCQ19FTkFCTEVEOworCWlmICghKGZsYWdzICYgQVNTRVJUX1BTUl9ESVNBQkxFRCkpCisJ CWZsYWdzIHw9IEFTU0VSVF9QU1JfRU5BQkxFRDsKKworCWlmICh0LT5mZWF0dXJlICE9IEZFQVRV UkVfRkJDKQorCQlmbGFncyAmPSB+RkJDX0FTU0VSVF9GTEFHUzsKKwlpZiAodC0+ZmVhdHVyZSAh PSBGRUFUVVJFX1BTUikKKwkJZmxhZ3MgJj0gflBTUl9BU1NFUlRfRkxBR1M7CisKKwlyZXR1cm4g ZmxhZ3M7Cit9CisKKyNkZWZpbmUgZG9fY3JjX2Fzc2VydGlvbnMoZmxhZ3MpIGRvIHsJCQkJCVwK KwlpbnQgZmxhZ3NfXyA9IChmbGFncyk7CQkJCQkJXAorCXN0cnVjdCBib3RoX2NyY3MgY3JjXzsJ CQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKCFvcHQuY2hlY2tfY3JjIHx8IChmbGFnc19fICYgRE9O VF9BU1NFUlRfQ1JDKSkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwljb2xsZWN0 X2NyY3MoJmNyY18pOwkJCQkJCVwKKwlwcmludF9jcmMoIkNhbGN1bGF0ZWQgQ1JDOiIsICZjcmNf KTsJCQkJXAorCQkJCQkJCQkJXAorCWlndF9hc3NlcnQod2FudGVkX2NyYyk7CQkJCQkJXAorCWln dF9hc3NlcnRfY3JjX2VxdWFsKCZjcmNfLnBpcGUsICZ3YW50ZWRfY3JjLT5waXBlKTsJCVwKKwlh c3NlcnRfc2lua19jcmNfZXF1YWwoJmNyY18uc2luaywgJndhbnRlZF9jcmMtPnNpbmspOwkJXAor fSB3aGlsZSAoMCkKKworI2RlZmluZSBkb19hc3NlcnRpb25zKGZsYWdzKSBkbyB7CQkJCQlcCisJ aW50IGZsYWdzXyA9IGFkanVzdF9hc3NlcnRpb25fZmxhZ3ModCwgKGZsYWdzKSk7CQlcCisJCQkJ CQkJCQlcCisJaWYgKG9wdC5zdGVwID4gMSkJCQkJCQlcCisJCXdhaXRfdXNlcigpOwkJCQkJCVwK KwkJCQkJCQkJCVwKKwkvKiBDaGVjayB0aGUgQ1JDIHRvIG1ha2Ugc3VyZSB0aGUgZHJhd2luZyBv cGVyYXRpb25zIHdvcmsJXAorCSAqIGltbWVkaWF0ZWx5LCBpbmRlcGVuZGVudGx5IG9mIHRoZSBm ZWF0dXJlcyBiZWluZyBlbmFibGVkICovCVwKKwlkb19jcmNfYXNzZXJ0aW9ucyhmbGFnc18pOwkJ CQkJXAorCQkJCQkJCQkJXAorCS8qIE5vdyB3ZSBjYW4gZmx1c2ggdGhpbmdzIHRvIG1ha2UgdGhl IHRlc3QgZmFzdGVyLiAqLwkJXAorCWRvX2ZsdXNoKHQpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJ aWYgKG9wdC5jaGVja19zdGF0dXMpIHsJCQkJCQlcCisJCWlmIChmbGFnc18gJiBBU1NFUlRfRkJD X0VOQUJMRUQpIHsJCQlcCisJCQlpZ3RfYXNzZXJ0KGZiY193YWl0X2Zvcl9zdGF0dXMoRU5BQkxF RCkpOwlcCisJCQkJCQkJCQlcCisJCQlpZiAoZmJjLnN1cHBvcnRzX2NvbXByZXNzaW5nICYmIAkJ XAorCQkJICAgIG9wdC5mYmNfY2hlY2tfY29tcHJlc3Npb24pCQkJXAorCQkJCWlndF9hc3NlcnQo ZmJjX3dhaXRfZm9yX2NvbXByZXNzaW9uKCkpOwlcCisJCX0gZWxzZSBpZiAoZmxhZ3NfICYgQVNT RVJUX0ZCQ19ESVNBQkxFRCkgewkJXAorCQkJaWd0X2Fzc2VydChmYmNfd2FpdF9mb3Jfc3RhdHVz KERJU0FCTEVEKSk7CVwKKwkJfQkJCQkJCQlcCisJCQkJCQkJCQlcCisJCWlmIChmbGFnc18gJiBB U1NFUlRfUFNSX0VOQUJMRUQpCQkJXAorCQkJaWd0X2Fzc2VydChwc3Jfd2FpdF9mb3Jfc3RhdHVz KEVOQUJMRUQpKTsJXAorCQllbHNlIGlmIChmbGFnc18gJiBBU1NFUlRfUFNSX0RJU0FCTEVEKQkJ CVwKKwkJCWlndF9hc3NlcnQocHNyX3dhaXRfZm9yX3N0YXR1cyhESVNBQkxFRCkpOwlcCisJfSBl bHNlIHsJCQkJCQkJXAorCQkvKiBNYWtlIHN1cmUgd2Ugc2V0dGxlIGJlZm9yZSBjb250aW51aW5n LiAqLwkJXAorCQlzbGVlcCgxKTsJCQkJCQlcCisJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCS8q IENoZWNrIENSQyBhZ2FpbiB0byBtYWtlIHN1cmUgdGhlIGNvbXByZXNzZWQgc2NyZWVuIGlzIG9r LiAqLwlcCisJZG9fY3JjX2Fzc2VydGlvbnMoZmxhZ3NfKTsJCQkJCVwKKwkJCQkJCQkJCVwKKwlp ZiAoZmJjLnN1cHBvcnRzX2xhc3RfYWN0aW9uICYmIG9wdC5mYmNfY2hlY2tfbGFzdF9hY3Rpb24p IHsJXAorCQlpZiAoZmxhZ3NfICYgQVNTRVJUX0xBU1RfQUNUSU9OX0NIQU5HRUQpCQlcCisJCQlp Z3RfYXNzZXJ0KGZiY19sYXN0X2FjdGlvbl9jaGFuZ2VkKCkpOwkJXAorCQllbHNlIGlmIChmbGFn c18gJiBBU1NFUlRfTk9fQUNUSU9OX0NIQU5HRSkJCVwKKwkJCWlndF9hc3NlcnQoIWZiY19sYXN0 X2FjdGlvbl9jaGFuZ2VkKCkpOwkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAob3B0 LnN0ZXApCQkJCQkJCVwKKwkJd2FpdF91c2VyKCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworc3Rh dGljIHZvaWQgZW5hYmxlX3ByaW1fc2NyZWVuX2FuZF93YWl0KGNvbnN0IHN0cnVjdCB0ZXN0X21v ZGUgKnQpCit7CisJaWd0X2RyYXdfZmlsbF9mYihkcm0uZmQsICZwcmltX21vZGVfcGFyYW1zLmZi LCAweEZGKTsKKwlzZXRfbW9kZV9mb3JfcGFyYW1zKCZwcmltX21vZGVfcGFyYW1zKTsKKworCXdh bnRlZF9jcmMgPSAmYmx1ZV9jcmM7CisJZmJjX3VwZGF0ZV9sYXN0X2FjdGlvbigpOworCisJZG9f YXNzZXJ0aW9ucyhBU1NFUlRfTk9fQUNUSU9OX0NIQU5HRSk7Cit9CisKK3N0YXRpYyB2b2lkIGVu YWJsZV9zY25kX3NjcmVlbl9hbmRfd2FpdChjb25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0KQorewor CWlndF9kcmF3X2ZpbGxfZmIoZHJtLmZkLCAmc2NuZF9tb2RlX3BhcmFtcy5mYiwgMHg4MCk7CisJ c2V0X21vZGVfZm9yX3BhcmFtcygmc2NuZF9tb2RlX3BhcmFtcyk7CisJZG9fYXNzZXJ0aW9ucyhB U1NFUlRfTk9fQUNUSU9OX0NIQU5HRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jdXJzb3JfZm9y X3Rlc3QoY29uc3Qgc3RydWN0IHRlc3RfbW9kZSAqdCwKKwkJCQlzdHJ1Y3QgbW9kZXNldF9wYXJh bXMgKnBhcmFtcykKK3sKKwlpbnQgcmM7CisKKwlpZ3RfZHJhd19maWxsX2ZiKGRybS5mZCwgJnBh cmFtcy0+Y3Vyc29yLCAweEZGMDAwMEZGKTsKKworCXJjID0gZHJtTW9kZU1vdmVDdXJzb3IoZHJt LmZkLCBwYXJhbXMtPmNydGNfaWQsIDAsIDApOworCWlndF9hc3NlcnQocmMgPT0gMCk7CisKKwly YyA9IGRybU1vZGVTZXRDdXJzb3IoZHJtLmZkLCBwYXJhbXMtPmNydGNfaWQsCisJCQkgICAgICBw YXJhbXMtPmN1cnNvci5nZW1faGFuZGxlLCBwYXJhbXMtPmN1cnNvci53aWR0aCwKKwkJCSAgICAg IHBhcmFtcy0+Y3Vyc29yLmhlaWdodCk7CisJaWd0X2Fzc2VydChyYyA9PSAwKTsKKworCWRvX2Fz c2VydGlvbnMoQVNTRVJUX05PX0FDVElPTl9DSEFOR0UpOworfQorCitzdGF0aWMgdm9pZCBzZXRf c3ByaXRlX2Zvcl90ZXN0KGNvbnN0IHN0cnVjdCB0ZXN0X21vZGUgKnQsCisJCQkJc3RydWN0IG1v ZGVzZXRfcGFyYW1zICpwYXJhbXMpCit7CisJaW50IHJjOworCisJaWd0X2RyYXdfZmlsbF9mYihk cm0uZmQsICZwYXJhbXMtPnNwcml0ZSwgMHhGRjAwMDBGRik7CisKKwlyYyA9IGRybU1vZGVTZXRQ bGFuZShkcm0uZmQsIHBhcmFtcy0+c3ByaXRlX2lkLCBwYXJhbXMtPmNydGNfaWQsCisJCQkgICAg IHBhcmFtcy0+c3ByaXRlLmZiX2lkLCAwLCAwLCAwLAorCQkJICAgICBwYXJhbXMtPnNwcml0ZS53 aWR0aCwgcGFyYW1zLT5zcHJpdGUuaGVpZ2h0LAorCQkJICAgICAwLCAwLCBwYXJhbXMtPnNwcml0 ZS53aWR0aCA8PCAxNiwKKwkJCSAgICAgcGFyYW1zLT5zcHJpdGUuaGVpZ2h0IDw8IDE2KTsKKwlp Z3RfYXNzZXJ0KHJjID09IDApOworCisJZG9fYXNzZXJ0aW9ucyhBU1NFUlRfTk9fQUNUSU9OX0NI QU5HRSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9mZWF0dXJlc19mb3JfdGVzdChjb25zdCBz dHJ1Y3QgdGVzdF9tb2RlICp0KQoreworCXN3aXRjaCAodC0+ZmVhdHVyZSkgeworCWNhc2UgRkVB VFVSRV9OT05FOgorCQlicmVhazsKKwljYXNlIEZFQVRVUkVfRkJDOgorCQlmYmNfZW5hYmxlKCk7 CisJCWJyZWFrOworCWNhc2UgRkVBVFVSRV9QU1I6CisJCXBzcl9lbmFibGUoKTsKKwkJYnJlYWs7 CisJZGVmYXVsdDoKKwkJaWd0X2Fzc2VydChmYWxzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBj aGVja190ZXN0X3JlcXVpcmVtZW50cyhjb25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0KQoreworCWlm ICh0LT5waXBlcyA9PSBQSVBFX0RVQUwpCisJCWlndF9yZXF1aXJlKHNjbmRfbW9kZV9wYXJhbXMu Y29ubmVjdG9yX2lkKTsKKworCWlmICh0LT5mZWF0dXJlID09IEZFQVRVUkVfUFNSKQorCQlpZ3Rf cmVxdWlyZShwc3IuY2FuX3Rlc3QpOworCisJaWYgKG9wdC5vbmx5X2ZlYXR1cmUgIT0gRkVBVFVS RV9DT1VOVCkKKwkJaWd0X3JlcXVpcmUodC0+ZmVhdHVyZSA9PSBvcHQub25seV9mZWF0dXJlKTsK KworCWlmIChvcHQub25seV9waXBlcyAhPSBQSVBFX0NPVU5UKQorCQlpZ3RfcmVxdWlyZSh0LT5w aXBlcyA9PSBvcHQub25seV9waXBlcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zY3JlZW5zX2Zv cl90ZXN0KGNvbnN0IHN0cnVjdCB0ZXN0X21vZGUgKnQsCisJCQkJIHN0cnVjdCBkcmF3X3BhdHRl cm5faW5mbyAqcGF0dGVybikKK3sKKwljaGVja190ZXN0X3JlcXVpcmVtZW50cyh0KTsKKworCWlm ICh0LT5zY3JlZW4gPT0gU0NSRUVOX09GRlNDUkVFTikKKwkJaWd0X2RyYXdfZmlsbF9mYihkcm0u ZmQsICZvZmZzY3JlZW5fZmIsIDB4ODApOworCisJZGlzYWJsZV9mZWF0dXJlcygpOworCXVuc2V0 X2FsbF9jcnRjcygpOworCWluaXRfY3JjcyhwYXR0ZXJuKTsKKwllbmFibGVfZmVhdHVyZXNfZm9y X3Rlc3QodCk7CisKKwllbmFibGVfcHJpbV9zY3JlZW5fYW5kX3dhaXQodCk7CisJaWYgKHQtPnNj cmVlbiA9PSBTQ1JFRU5fUFJJTSkgeworCQlpZiAodC0+cGxhbmUgPT0gUExBTkVfQ1VSKQorCQkJ c2V0X2N1cnNvcl9mb3JfdGVzdCh0LCAmcHJpbV9tb2RlX3BhcmFtcyk7CisJCWlmICh0LT5wbGFu ZSA9PSBQTEFORV9TUFIpCisJCQlzZXRfc3ByaXRlX2Zvcl90ZXN0KHQsICZwcmltX21vZGVfcGFy YW1zKTsKKwl9CisKKwlpZiAodC0+cGlwZXMgPT0gUElQRV9TSU5HTEUpCisJCXJldHVybjsKKwor CWVuYWJsZV9zY25kX3NjcmVlbl9hbmRfd2FpdCh0KTsKKwlpZiAodC0+c2NyZWVuID09IFNDUkVF Tl9TQ05EKSB7CisJCWlmICh0LT5wbGFuZSA9PSBQTEFORV9DVVIpCisJCQlzZXRfY3Vyc29yX2Zv cl90ZXN0KHQsICZzY25kX21vZGVfcGFyYW1zKTsKKwkJaWYgKHQtPnBsYW5lID09IFBMQU5FX1NQ UikKKwkJCXNldF9zcHJpdGVfZm9yX3Rlc3QodCwgJnNjbmRfbW9kZV9wYXJhbXMpOworCX0KK30K Kworc3RhdGljIHZvaWQgcnRlX3N1YnRlc3QoY29uc3Qgc3RydWN0IHRlc3RfbW9kZSAqdCkKK3sK KwljaGVja190ZXN0X3JlcXVpcmVtZW50cyh0KTsKKworCWRpc2FibGVfZmVhdHVyZXMoKTsKKwll bmFibGVfZmVhdHVyZXNfZm9yX3Rlc3QodCk7CisJdW5zZXRfYWxsX2NydGNzKCk7CisJZG9fYXNz ZXJ0aW9ucyhBU1NFUlRfRkJDX0RJU0FCTEVEIHwgQVNTRVJUX1BTUl9ESVNBQkxFRCB8CisJCSAg ICAgIERPTlRfQVNTRVJUX0NSQyk7CisKKwllbmFibGVfcHJpbV9zY3JlZW5fYW5kX3dhaXQodCk7 CisJc2V0X2N1cnNvcl9mb3JfdGVzdCh0LCAmcHJpbV9tb2RlX3BhcmFtcyk7CisJc2V0X3Nwcml0 ZV9mb3JfdGVzdCh0LCAmcHJpbV9tb2RlX3BhcmFtcyk7CisKKwlpZiAodC0+cGlwZXMgPT0gUElQ RV9TSU5HTEUpCisJCXJldHVybjsKKworCWVuYWJsZV9zY25kX3NjcmVlbl9hbmRfd2FpdCh0KTsK KwlzZXRfY3Vyc29yX2Zvcl90ZXN0KHQsICZzY25kX21vZGVfcGFyYW1zKTsKKwlzZXRfc3ByaXRl X2Zvcl90ZXN0KHQsICZzY25kX21vZGVfcGFyYW1zKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRl X3dhbnRlZF9jcmMoY29uc3Qgc3RydWN0IHRlc3RfbW9kZSAqdCwgc3RydWN0IGJvdGhfY3JjcyAq Y3JjKQoreworCWlmICh0LT5zY3JlZW4gPT0gU0NSRUVOX1BSSU0pCisJCXdhbnRlZF9jcmMgPSBj cmM7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfc3VidGVzdChjb25zdCBzdHJ1Y3QgdGVzdF9tb2Rl ICp0KQoreworCWludCByOworCWludCBhc3NlcnRpb25zID0gMDsKKwlzdHJ1Y3QgZHJhd19wYXR0 ZXJuX2luZm8gKnBhdHRlcm47CisJc3RydWN0IG1vZGVzZXRfcGFyYW1zICpwYXJhbXMgPSBwaWNr X3BhcmFtcyh0KTsKKwlzdHJ1Y3QgaWd0X2ZiICp0YXJnZXQgPSBwaWNrX3RhcmdldCh0LCBwYXJh bXMpOworCisJc3dpdGNoICh0LT5zY3JlZW4pIHsKKwljYXNlIFNDUkVFTl9QUklNOgorCQlpZiAo dC0+bWV0aG9kICE9IElHVF9EUkFXX01NQVBfR1RUICYmIHQtPnBsYW5lID09IFBMQU5FX1BSSSkK KwkJCWFzc2VydGlvbnMgfD0gQVNTRVJUX0xBU1RfQUNUSU9OX0NIQU5HRUQ7CisJCWJyZWFrOwor CWNhc2UgU0NSRUVOX1NDTkQ6CisJY2FzZSBTQ1JFRU5fT0ZGU0NSRUVOOgorCQlhc3NlcnRpb25z IHw9IEFTU0VSVF9OT19BQ1RJT05fQ0hBTkdFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3Rf YXNzZXJ0KGZhbHNlKTsKKwl9CisKKwlzd2l0Y2ggKHQtPnBsYW5lKSB7CisJY2FzZSBQTEFORV9Q Ukk6CisJCXBhdHRlcm4gPSAmcGF0dGVybjE7CisJCWJyZWFrOworCWNhc2UgUExBTkVfQ1VSOgor CWNhc2UgUExBTkVfU1BSOgorCQlwYXR0ZXJuID0gJnBhdHRlcm4yOworCQlicmVhazsKKwlkZWZh dWx0OgorCQlpZ3RfYXNzZXJ0KGZhbHNlKTsKKwl9CisKKwlzZXRfc2NyZWVuc19mb3JfdGVzdCh0 LCBwYXR0ZXJuKTsKKworCWZvciAociA9IDA7IHIgPCBwYXR0ZXJuLT5uX3JlY3RzOyByKyspIHsK KwkJZHJhd19yZWN0KHBhdHRlcm4sIHRhcmdldCwgdC0+bWV0aG9kLCByKTsKKwkJdXBkYXRlX3dh bnRlZF9jcmModCwgJnBhdHRlcm4tPmNyY3Nbcl0pOworCQlkb19hc3NlcnRpb25zKGFzc2VydGlv bnMpOworCX0KK30KKworc3RhdGljIHZvaWQgZmxpcF9zdWJ0ZXN0KGNvbnN0IHN0cnVjdCB0ZXN0 X21vZGUgKnQpCit7CisJaW50IHIsIHJjOworCWludCBhc3NlcnRpb25zID0gMDsKKwlzdHJ1Y3Qg aWd0X2ZiIGZiMiwgKnRhcmdldDsKKwlzdHJ1Y3QgbW9kZXNldF9wYXJhbXMgKnBhcmFtcyA9IHBp Y2tfcGFyYW1zKHQpOworCXN0cnVjdCBkcmF3X3BhdHRlcm5faW5mbyAqcGF0dGVybiA9ICZwYXR0 ZXJuMTsKKwl1aW50MzJfdCBiZ19jb2xvcjsKKworCXN3aXRjaCAodC0+c2NyZWVuKSB7CisJY2Fz ZSBTQ1JFRU5fUFJJTToKKwkJYXNzZXJ0aW9ucyB8PSBBU1NFUlRfTEFTVF9BQ1RJT05fQ0hBTkdF RDsKKwkJYmdfY29sb3IgPSAweEZGOworCQlicmVhazsKKwljYXNlIFNDUkVFTl9TQ05EOgorCQlh c3NlcnRpb25zIHw9IEFTU0VSVF9OT19BQ1RJT05fQ0hBTkdFOworCQliZ19jb2xvciA9IDB4ODA7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnQoZmFsc2UpOworCX0KKworCXNldF9z Y3JlZW5zX2Zvcl90ZXN0KHQsIHBhdHRlcm4pOworCisJaWd0X2NyZWF0ZV9mYihkcm0uZmQsIHBh cmFtcy0+bW9kZS0+aGRpc3BsYXksIHBhcmFtcy0+bW9kZS0+dmRpc3BsYXksCisJCSAgICAgIERS TV9GT1JNQVRfWFJHQjg4ODgsIExPQ0FMX0k5MTVfRk9STUFUX01PRF9YX1RJTEVELCAmZmIyKTsK KwlpZ3RfZHJhd19maWxsX2ZiKGRybS5mZCwgJmZiMiwgYmdfY29sb3IpOworCisJZm9yIChyID0g MDsgciA8IHBhdHRlcm4tPm5fcmVjdHM7IHIrKykgeworCQl0YXJnZXQgPSAociAlIDIgPT0gMCkg PyAmZmIyIDogJnBhcmFtcy0+ZmI7CisKKwkJaWYgKHIgIT0gMCkKKwkJCWRyYXdfcmVjdChwYXR0 ZXJuLCB0YXJnZXQsIHQtPm1ldGhvZCwgciAtIDEpOworCQlkcmF3X3JlY3QocGF0dGVybiwgdGFy Z2V0LCB0LT5tZXRob2QsIHIpOworCQl1cGRhdGVfd2FudGVkX2NyYyh0LCAmcGF0dGVybi0+Y3Jj c1tyXSk7CisKKwkJcmMgPSBkcm1Nb2RlUGFnZUZsaXAoZHJtLmZkLCBwYXJhbXMtPmNydGNfaWQs IHRhcmdldC0+ZmJfaWQsIDAsCisJCQkJICAgICBOVUxMKTsKKwkJaWd0X2Fzc2VydChyYyA9PSAw KTsKKworCQlkb19hc3NlcnRpb25zKGFzc2VydGlvbnMpOworCX0KKworCWlndF9yZW1vdmVfZmIo ZHJtLmZkLCAmZmIyKTsKK30KKworc3RhdGljIHZvaWQgbW92ZV9zdWJ0ZXN0KGNvbnN0IHN0cnVj dCB0ZXN0X21vZGUgKnQpCit7CisJaW50IHIsIHJjOworCWludCBhc3NlcnRpb25zID0gQVNTRVJU X05PX0FDVElPTl9DSEFOR0U7CisJc3RydWN0IG1vZGVzZXRfcGFyYW1zICpwYXJhbXMgPSBwaWNr X3BhcmFtcyh0KTsKKwlzdHJ1Y3QgZHJhd19wYXR0ZXJuX2luZm8gKnBhdHRlcm4gPSAmcGF0dGVy bjM7CisJYm9vbCByZXBlYXQgPSBmYWxzZTsKKworCXNldF9zY3JlZW5zX2Zvcl90ZXN0KHQsIHBh dHRlcm4pOworCisJLyogSnVzdCBwYWludCB0aGUgcmlnaHQgY29sb3Igc2luY2Ugd2Ugc3RhcnQg YXQgMHgwLiAqLworCWRyYXdfcmVjdChwYXR0ZXJuLCBwaWNrX3RhcmdldCh0LCBwYXJhbXMpLCB0 LT5tZXRob2QsIDApOworCXVwZGF0ZV93YW50ZWRfY3JjKHQsICZwYXR0ZXJuLT5jcmNzWzBdKTsK KworCWRvX2Fzc2VydGlvbnMoYXNzZXJ0aW9ucyk7CisKKwlmb3IgKHIgPSAxOyByIDwgcGF0dGVy bi0+bl9yZWN0czsgcisrKSB7CisJCXN0cnVjdCByZWN0IHJlY3QgPSBwYXR0ZXJuLT5nZXRfcmVj dCgmcGFyYW1zLT5mYiwgcik7CisKKwkJc3dpdGNoICh0LT5wbGFuZSkgeworCQljYXNlIFBMQU5F X0NVUjoKKwkJCXJjID0gZHJtTW9kZU1vdmVDdXJzb3IoZHJtLmZkLCBwYXJhbXMtPmNydGNfaWQs IHJlY3QueCwKKwkJCQkJICAgICAgIHJlY3QueSk7CisJCQlpZ3RfYXNzZXJ0KHJjID09IDApOwor CQkJYnJlYWs7CisJCWNhc2UgUExBTkVfU1BSOgorCQkJcmMgPSBkcm1Nb2RlU2V0UGxhbmUoZHJt LmZkLCBwYXJhbXMtPnNwcml0ZV9pZCwKKwkJCQkJICAgICBwYXJhbXMtPmNydGNfaWQsCisJCQkJ CSAgICAgcGFyYW1zLT5zcHJpdGUuZmJfaWQsIDAsCisJCQkJCSAgICAgcmVjdC54LCByZWN0Lnks IHJlY3QudywKKwkJCQkJICAgICByZWN0LmgsIDAsIDAsIHJlY3QudyA8PCAxNiwKKwkJCQkJICAg ICByZWN0LmggPDwgMTYpOworCQkJaWd0X2Fzc2VydChyYyA9PSAwKTsKKwkJCWJyZWFrOworCQlk ZWZhdWx0OgorCQkJaWd0X2Fzc2VydChmYWxzZSk7CisJCX0KKwkJdXBkYXRlX3dhbnRlZF9jcmMo dCwgJnBhdHRlcm4tPmNyY3Nbcl0pOworCisJCWRvX2Fzc2VydGlvbnMoYXNzZXJ0aW9ucyk7CisK KwkJLyogIk1vdmUiIHRoZSBsYXN0IHJlY3QgdG8gdGhlIHNhbWUgcG9zaXRpb24ganVzdCB0byBt YWtlIHN1cmUKKwkJICogdGhpcyB3b3JrcyB0b28uICovCisJCWlmIChyKzEgPT0gcGF0dGVybi0+ bl9yZWN0cyAmJiAhcmVwZWF0KSB7CisJCQlyZXBlYXQgPSB0cnVlOworCQkJci0tOworCQl9CisJ fQorfQorCitzdGF0aWMgdm9pZCBvbm9mZl9zdWJ0ZXN0KGNvbnN0IHN0cnVjdCB0ZXN0X21vZGUg KnQpCit7CisJaW50IHIsIHJjOworCWludCBhc3NlcnRpb25zID0gQVNTRVJUX05PX0FDVElPTl9D SEFOR0U7CisJc3RydWN0IG1vZGVzZXRfcGFyYW1zICpwYXJhbXMgPSBwaWNrX3BhcmFtcyh0KTsK KwlzdHJ1Y3QgZHJhd19wYXR0ZXJuX2luZm8gKnBhdHRlcm4gPSAmcGF0dGVybjM7CisKKwlzZXRf c2NyZWVuc19mb3JfdGVzdCh0LCBwYXR0ZXJuKTsKKworCS8qIEp1c3QgcGFpbnQgdGhlIHJpZ2h0 IGNvbG9yIHNpbmNlIHdlIHN0YXJ0IGF0IDB4MC4gKi8KKwlkcmF3X3JlY3QocGF0dGVybiwgcGlj a190YXJnZXQodCwgcGFyYW1zKSwgdC0+bWV0aG9kLCAwKTsKKwl1cGRhdGVfd2FudGVkX2NyYyh0 LCAmcGF0dGVybi0+Y3Jjc1swXSk7CisJZG9fYXNzZXJ0aW9ucyhhc3NlcnRpb25zKTsKKworCWZv ciAociA9IDA7IHIgPCA0OyByKyspIHsKKwkJaWYgKHIgJSAyID09IDApIHsKKwkJCXN3aXRjaCAo dC0+cGxhbmUpIHsKKwkJCWNhc2UgUExBTkVfQ1VSOgorCQkJCXJjID0gZHJtTW9kZVNldEN1cnNv cihkcm0uZmQsIHBhcmFtcy0+Y3J0Y19pZCwKKwkJCQkJCSAgICAgIDAsIDAsIDApOworCQkJCWln dF9hc3NlcnQocmMgPT0gMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBMQU5FX1NQUjoKKwkJCQly YyA9IGRybU1vZGVTZXRQbGFuZShkcm0uZmQsIHBhcmFtcy0+c3ByaXRlX2lkLAorCQkJCQkJICAg ICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkJCQkJICAgICAwLCAwKTsKKwkJCQlpZ3Rf YXNzZXJ0KHJjID09IDApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZ3RfYXNzZXJ0 KGZhbHNlKTsKKwkJCX0KKwkJCXVwZGF0ZV93YW50ZWRfY3JjKHQsICZibHVlX2NyYyk7CisKKwkJ fSBlbHNlIHsKKwkJCXN3aXRjaCAodC0+cGxhbmUpIHsKKwkJCWNhc2UgUExBTkVfQ1VSOgorCQkJ CXJjID0gZHJtTW9kZVNldEN1cnNvcihkcm0uZmQsIHBhcmFtcy0+Y3J0Y19pZCwKKwkJCQkJCSAg ICAgIHBhcmFtcy0+Y3Vyc29yLmdlbV9oYW5kbGUsCisJCQkJCQkgICAgICBwYXJhbXMtPmN1cnNv ci53aWR0aCwKKwkJCQkJCSAgICAgIHBhcmFtcy0+Y3Vyc29yLmhlaWdodCk7CisJCQkJaWd0X2Fz c2VydChyYyA9PSAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUExBTkVfU1BSOgorCQkJCXJjID0g ZHJtTW9kZVNldFBsYW5lKGRybS5mZCwgcGFyYW1zLT5zcHJpdGVfaWQsCisJCQkJCQkgICAgIHBh cmFtcy0+Y3J0Y19pZCwKKwkJCQkJCSAgICAgcGFyYW1zLT5zcHJpdGUuZmJfaWQsIDAsCisJCQkJ CQkgICAgIDAsIDAsIHBhcmFtcy0+c3ByaXRlLndpZHRoLAorCQkJCQkJICAgICBwYXJhbXMtPnNw cml0ZS5oZWlnaHQsIDAsCisJCQkJCQkgICAgIDAsCisJCQkJCQkgICAgIHBhcmFtcy0+c3ByaXRl LndpZHRoIDw8IDE2LAorCQkJCQkJICAgICBwYXJhbXMtPnNwcml0ZS5oZWlnaHQgPDwgMTYpOwor CQkJCWlndF9hc3NlcnQocmMgPT0gMCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWln dF9hc3NlcnQoZmFsc2UpOworCQkJfQorCQkJdXBkYXRlX3dhbnRlZF9jcmModCwgJnBhdHRlcm4t PmNyY3NbMF0pOworCisJCX0KKworCQlkb19hc3NlcnRpb25zKGFzc2VydGlvbnMpOworCX0KK30K Kworc3RhdGljIHZvaWQgZnVsbHNjcmVlbl9wbGFuZV9zdWJ0ZXN0KGNvbnN0IHN0cnVjdCB0ZXN0 X21vZGUgKnQpCit7CisJc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvICpwYXR0ZXJuID0gJnBhdHRl cm40OworCXN0cnVjdCBpZ3RfZmIgZnVsbHNjcmVlbl9mYjsKKwlzdHJ1Y3QgcmVjdCByZWN0Owor CXN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqcGFyYW1zID0gcGlja19wYXJhbXModCk7CisJaW50IGFz c2VydGlvbnM7CisJaW50IHJjOworCisJc2V0X3NjcmVlbnNfZm9yX3Rlc3QodCwgcGF0dGVybik7 CisKKwlyZWN0ID0gcGF0dGVybi0+Z2V0X3JlY3QoJnBhcmFtcy0+ZmIsIDApOworCWlndF9jcmVh dGVfZmIoZHJtLmZkLCByZWN0LncsIHJlY3QuaCwgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJICAg ICAgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQsICZmdWxsc2NyZWVuX2ZiKTsKKwlpZ3Rf ZHJhd19maWxsX2ZiKGRybS5mZCwgJmZ1bGxzY3JlZW5fZmIsIHJlY3QuY29sb3IpOworCisJcmMg PSBkcm1Nb2RlU2V0UGxhbmUoZHJtLmZkLCBwYXJhbXMtPnNwcml0ZV9pZCwgcGFyYW1zLT5jcnRj X2lkLAorCQkJICAgICBmdWxsc2NyZWVuX2ZiLmZiX2lkLCAwLCAwLCAwLCBmdWxsc2NyZWVuX2Zi LndpZHRoLAorCQkJICAgICBmdWxsc2NyZWVuX2ZiLmhlaWdodCwgMCwgMCwKKwkJCSAgICAgZnVs bHNjcmVlbl9mYi53aWR0aCA8PCAxNiwKKwkJCSAgICAgZnVsbHNjcmVlbl9mYi5oZWlnaHQgPDwg MTYpOworCWlndF9hc3NlcnQocmMgPT0gMCk7CisJdXBkYXRlX3dhbnRlZF9jcmModCwgJnBhdHRl cm4tPmNyY3NbMF0pOworCisJc3dpdGNoICh0LT5zY3JlZW4pIHsKKwljYXNlIFNDUkVFTl9QUklN OgorCQlhc3NlcnRpb25zID0gQVNTRVJUX0ZCQ19ESVNBQkxFRCB8CisJCQkgICAgIEFTU0VSVF9M QVNUX0FDVElPTl9DSEFOR0VEOworCQlicmVhazsKKwljYXNlIFNDUkVFTl9TQ05EOgorCQlhc3Nl cnRpb25zID0gQVNTRVJUX05PX0FDVElPTl9DSEFOR0U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJ CWlndF9hc3NlcnQoZmFsc2UpOworCX0KKwlkb19hc3NlcnRpb25zKGFzc2VydGlvbnMpOworCisJ cmMgPSBkcm1Nb2RlU2V0UGxhbmUoZHJtLmZkLCBwYXJhbXMtPnNwcml0ZV9pZCwgMCwgMCwgMCwg MCwgMCwgMCwgMCwgMCwKKwkJCSAgICAgMCwgMCwgMCk7CisJaWd0X2Fzc2VydChyYyA9PSAwKTsK KworCWlmICh0LT5zY3JlZW4gPT0gU0NSRUVOX1BSSU0pCisJCWFzc2VydGlvbnMgPSBBU1NFUlRf TEFTVF9BQ1RJT05fQ0hBTkdFRDsKKwl1cGRhdGVfd2FudGVkX2NyYyh0LCAmYmx1ZV9jcmMpOwor CWRvX2Fzc2VydGlvbnMoYXNzZXJ0aW9ucyk7CisKKwlpZ3RfcmVtb3ZlX2ZiKGRybS5mZCwgJmZ1 bGxzY3JlZW5fZmIpOworfQorCitzdGF0aWMgaW50IG9wdF9oYW5kbGVyKGludCBvcHRpb24sIGlu dCBvcHRpb25faW5kZXgpCit7CisJc3dpdGNoIChvcHRpb24pIHsKKwljYXNlICdzJzoKKwkJb3B0 LmNoZWNrX3N0YXR1cyA9IGZhbHNlOworCQlicmVhazsKKwljYXNlICdjJzoKKwkJb3B0LmNoZWNr X2NyYyA9IGZhbHNlOworCQlicmVhazsKKwljYXNlICdvJzoKKwkJb3B0LmZiY19jaGVja19jb21w cmVzc2lvbiA9IGZhbHNlOworCQlicmVhazsKKwljYXNlICdhJzoKKwkJb3B0LmZiY19jaGVja19s YXN0X2FjdGlvbiA9IGZhbHNlOworCQlicmVhazsKKwljYXNlICdlJzoKKwkJb3B0Lm5vX2VkcCA9 IHRydWU7CisJCWJyZWFrOworCWNhc2UgJ20nOgorCQlvcHQuc21hbGxfbW9kZXMgPSB0cnVlOwor CQlicmVhazsKKwljYXNlICd0JzoKKwkJb3B0LnN0ZXArKzsKKwkJYnJlYWs7CisJY2FzZSAnbic6 CisJCWlndF9hc3NlcnQob3B0Lm9ubHlfZmVhdHVyZSA9PSBGRUFUVVJFX0NPVU5UKTsKKwkJb3B0 Lm9ubHlfZmVhdHVyZSA9IEZFQVRVUkVfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSAnZic6CisJCWln dF9hc3NlcnQob3B0Lm9ubHlfZmVhdHVyZSA9PSBGRUFUVVJFX0NPVU5UKTsKKwkJb3B0Lm9ubHlf ZmVhdHVyZSA9IEZFQVRVUkVfRkJDOworCQlicmVhazsKKwljYXNlICdwJzoKKwkJaWd0X2Fzc2Vy dChvcHQub25seV9mZWF0dXJlID09IEZFQVRVUkVfQ09VTlQpOworCQlvcHQub25seV9mZWF0dXJl ID0gRkVBVFVSRV9QU1I7CisJCWJyZWFrOworCWNhc2UgJzEnOgorCQlpZ3RfYXNzZXJ0KG9wdC5v bmx5X3BpcGVzID09IFBJUEVfQ09VTlQpOworCQlvcHQub25seV9waXBlcyA9IFBJUEVfU0lOR0xF OworCQlicmVhazsKKwljYXNlICcyJzoKKwkJaWd0X2Fzc2VydChvcHQub25seV9waXBlcyA9PSBQ SVBFX0NPVU5UKTsKKwkJb3B0Lm9ubHlfcGlwZXMgPSBQSVBFX0RVQUw7CisJCWJyZWFrOworCWRl ZmF1bHQ6CisJCWlndF9hc3NlcnQoZmFsc2UpOworCX0KKworCXJldHVybiAwOworfQorCitjb25z dCBjaGFyICpoZWxwX3N0ciA9CisiICAtLW5vLXN0YXR1cy1jaGVjayAgICAgICAgICAgRG9uJ3Qg Y2hlY2sgZm9yIGVuYWJsZS9kaXNhYmxlIHN0YXR1c1xuIgorIiAgLS1uby1jcmMtY2hlY2sgICAg ICAgICAgICAgIERvbid0IGNoZWNrIGZvciBDUkMgdmFsdWVzXG4iCisiICAtLW5vLWZiYy1jb21w cmVzc2lvbi1jaGVjayAgRG9uJ3QgY2hlY2sgZm9yIHRoZSBGQkMgY29tcHJlc3Npb24gc3RhdHVz XG4iCisiICAtLW5vLWZiYy1hY3Rpb24tY2hlY2sgICAgICAgRG9uJ3QgY2hlY2sgZm9yIHRoZSBG QkMgbGFzdCBhY3Rpb25cbiIKKyIgIC0tbm8tZWRwICAgICAgICAgICAgICAgICAgICBEb24ndCB1 c2UgZURQIG1vbml0b3JzXG4iCisiICAtLXVzZS1zbWFsbC1tb2RlcyAgICAgICAgICAgVXNlIHNt YWxsZXIgcmVzb2x1dGlvbnMgZm9yIHRoZSBtb2Rlc1xuIgorIiAgLS1zdGVwICAgICAgICAgICAg ICAgICAgICAgIFN0b3Agb24gZWFjaCBzdGVwIHNvIHlvdSBjYW4gY2hlY2sgdGhlIHNjcmVlblxu IgorIiAgLS1ub3Atb25seSAgICAgICAgICAgICAgICAgIE9ubHkgcnVuIHRoZSBcIm5vcFwiIGZl YXR1cmUgc3VidGVzdHNcbiIKKyIgIC0tZmJjLW9ubHkgICAgICAgICAgICAgICAgICBPbmx5IHJ1 biB0aGUgXCJmYmNcIiBmZWF0dXJlIHN1YnRlc3RzXG4iCisiICAtLXBzci1vbmx5ICAgICAgICAg ICAgICAgICAgT25seSBydW4gdGhlIFwicHNyXCIgZmVhdHVyZSBzdWJ0ZXN0c1xuIgorIiAgLS0x cC1vbmx5ICAgICAgICAgICAgICAgICAgIE9ubHkgcnVuIHN1YnRlc3RzIHRoYXQgdXNlIDEgcGlw ZVxuIgorIiAgLS0ycC1vbmx5ICAgICAgICAgICAgICAgICAgIE9ubHkgcnVuIHN1YnRlc3RzIHRo YXQgdXNlIDIgcGlwZXNcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpwaXBlc19zdHIoaW50IHBp cGVzKQoreworCXN3aXRjaCAocGlwZXMpIHsKKwljYXNlIFBJUEVfU0lOR0xFOgorCQlyZXR1cm4g IjFwIjsKKwljYXNlIFBJUEVfRFVBTDoKKwkJcmV0dXJuICIycCI7CisJZGVmYXVsdDoKKwkJaWd0 X2Fzc2VydChmYWxzZSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2NyZWVuX3N0cihp bnQgc2NyZWVuKQoreworCXN3aXRjaCAoc2NyZWVuKSB7CisJY2FzZSBTQ1JFRU5fUFJJTToKKwkJ cmV0dXJuICJwcmltc2NybiI7CisJY2FzZSBTQ1JFRU5fU0NORDoKKwkJcmV0dXJuICJzY25kc2Ny biI7CisJY2FzZSBTQ1JFRU5fT0ZGU0NSRUVOOgorCQlyZXR1cm4gIm9mZnNjcmVuIjsKKwlkZWZh dWx0OgorCQlpZ3RfYXNzZXJ0KGZhbHNlKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpw bGFuZV9zdHIoaW50IHBsYW5lKQoreworCXN3aXRjaCAocGxhbmUpIHsKKwljYXNlIFBMQU5FX1BS SToKKwkJcmV0dXJuICJwcmkiOworCWNhc2UgUExBTkVfQ1VSOgorCQlyZXR1cm4gImN1ciI7CisJ Y2FzZSBQTEFORV9TUFI6CisJCXJldHVybiAic3ByIjsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0 KGZhbHNlKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmZWF0dXJlX3N0cihpbnQgZmVh dHVyZSkKK3sKKwlzd2l0Y2ggKGZlYXR1cmUpIHsKKwljYXNlIEZFQVRVUkVfTk9ORToKKwkJcmV0 dXJuICJub3AiOworCWNhc2UgRkVBVFVSRV9GQkM6CisJCXJldHVybiAiZmJjIjsKKwljYXNlIEZF QVRVUkVfUFNSOgorCQlyZXR1cm4gInBzciI7CisJZGVmYXVsdDoKKwkJaWd0X2Fzc2VydChmYWxz ZSk7CisJfQorfQorCisjZGVmaW5lIFRFU1RfTU9ERV9JVEVSX0JFR0lOKHQpIFwKKwlmb3IgKHQu cGlwZXMgPSAwOyB0LnBpcGVzIDwgUElQRV9DT1VOVDsgdC5waXBlcysrKSB7IFwKKwlmb3IgKHQu c2NyZWVuID0gMDsgdC5zY3JlZW4gPCBTQ1JFRU5fQ09VTlQ7IHQuc2NyZWVuKyspIHsgXAorCWZv ciAodC5wbGFuZSA9IDA7IHQucGxhbmUgPCBQTEFORV9DT1VOVDsgdC5wbGFuZSsrKSB7IFwKKwlm b3IgKHQubWV0aG9kID0gMDsgdC5tZXRob2QgPCBJR1RfRFJBV19NRVRIT0RfQ09VTlQ7IHQubWV0 aG9kKyspIHsgXAorCWZvciAodC5mZWF0dXJlID0gMDsgdC5mZWF0dXJlIDwgRkVBVFVSRV9DT1VO VDsgdC5mZWF0dXJlKyspIHsgXAorCQlpZiAodC5waXBlcyA9PSBQSVBFX1NJTkdMRSAmJiB0LnNj cmVlbiA9PSBTQ1JFRU5fU0NORCkgXAorCQkJY29udGludWU7CisKKyNkZWZpbmUgVEVTVF9NT0RF X0lURVJfRU5EIH0gfSB9IH0gfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQor eworCXN0cnVjdCB0ZXN0X21vZGUgdDsKKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0g eworCQl7ICJuby1zdGF0dXMtY2hlY2siLCAgICAgICAgICAwLCAwLCAncyd9LAorCQl7ICJuby1j cmMtY2hlY2siLCAgICAgICAgICAgICAwLCAwLCAnYyd9LAorCQl7ICJuby1mYmMtY29tcHJlc3Np b24tY2hlY2siLCAwLCAwLCAnbyd9LAorCQl7ICJuby1mYmMtYWN0aW9uLWNoZWNrIiwgICAgICAw LCAwLCAnYSd9LAorCQl7ICJuby1lZHAiLCAgICAgICAgICAgICAgICAgICAwLCAwLCAnZSd9LAor CQl7ICJ1c2Utc21hbGwtbW9kZXMiLCAgICAgICAgICAwLCAwLCAnbSd9LAorCQl7ICJzdGVwIiwg ICAgICAgICAgICAgICAgICAgICAwLCAwLCAndCd9LAorCQl7ICJub3Atb25seSIsICAgICAgICAg ICAgICAgICAwLCAwLCAnbid9LAorCQl7ICJmYmMtb25seSIsICAgICAgICAgICAgICAgICAwLCAw LCAnZid9LAorCQl7ICJwc3Itb25seSIsICAgICAgICAgICAgICAgICAwLCAwLCAncCd9LAorCQl7 ICIxcC1vbmx5IiwgICAgICAgICAgICAgICAgICAwLCAwLCAnMSd9LAorCQl7ICIycC1vbmx5Iiwg ICAgICAgICAgICAgICAgICAwLCAwLCAnMid9LAorCQl7IDAsIDAsIDAsIDAgfQorCX07CisKKwlp Z3Rfc3VidGVzdF9pbml0X3BhcnNlX29wdHMoJmFyZ2MsIGFyZ3YsICIiLCBsb25nX29wdGlvbnMs IGhlbHBfc3RyLAorCQkJCSAgICBvcHRfaGFuZGxlcik7CisKKwlpZ3RfZml4dHVyZQorCQlzZXR1 cF9lbnZpcm9ubWVudCgpOworCisJZm9yICh0LnBpcGVzID0gMDsgdC5waXBlcyA8IFBJUEVfQ09V TlQ7IHQucGlwZXMrKykgeworCQlmb3IgKHQuZmVhdHVyZSA9IDA7IHQuZmVhdHVyZSA8IEZFQVRV UkVfQ09VTlQ7IHQuZmVhdHVyZSsrKSB7CisJCQl0LnNjcmVlbiA9IFNDUkVFTl9QUklNOworCQkJ dC5wbGFuZSA9IFBMQU5FX1BSSTsKKwkJCS8qIE1ha2Ugc3VyZSBub3RoaW5nIGlzIHVzaW5nIHRo aXMgdmFsdWUuICovCisJCQl0Lm1ldGhvZCA9IC0xOworCisJCQlpZ3Rfc3VidGVzdF9mKCIlcy1y dGUtJXMiLAorCQkJCSAgICAgIHBpcGVzX3N0cih0LnBpcGVzKSwKKwkJCQkgICAgICBmZWF0dXJl X3N0cih0LmZlYXR1cmUpKQorCQkJCXJ0ZV9zdWJ0ZXN0KCZ0KTsKKwkJfQorCX0KKworCVRFU1Rf TU9ERV9JVEVSX0JFR0lOKHQpCisJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLWRyYXctJXMtJXMi LAorCQkJICAgICAgcGlwZXNfc3RyKHQucGlwZXMpLAorCQkJICAgICAgc2NyZWVuX3N0cih0LnNj cmVlbiksCisJCQkgICAgICBwbGFuZV9zdHIodC5wbGFuZSksCisJCQkgICAgICBpZ3RfZHJhd19n ZXRfbWV0aG9kX25hbWUodC5tZXRob2QpLAorCQkJICAgICAgZmVhdHVyZV9zdHIodC5mZWF0dXJl KSkKKwkJCWRyYXdfc3VidGVzdCgmdCk7CisJVEVTVF9NT0RFX0lURVJfRU5ECisKKworCVRFU1Rf TU9ERV9JVEVSX0JFR0lOKHQpCisJCWlmICh0LnBsYW5lICE9IFBMQU5FX1BSSSkKKwkJCWNvbnRp bnVlOworCisJCWlmICh0LnNjcmVlbiA9PSBTQ1JFRU5fT0ZGU0NSRUVOKQorCQkJY29udGludWU7 CisKKwkJaWd0X3N1YnRlc3RfZigiJXMtJXMtZmxpcC0lcy0lcyIsCisJCQkgICAgICBwaXBlc19z dHIodC5waXBlcyksCisJCQkgICAgICBzY3JlZW5fc3RyKHQuc2NyZWVuKSwKKwkJCSAgICAgIGln dF9kcmF3X2dldF9tZXRob2RfbmFtZSh0Lm1ldGhvZCksCisJCQkgICAgICBmZWF0dXJlX3N0cih0 LmZlYXR1cmUpKQorCQkJZmxpcF9zdWJ0ZXN0KCZ0KTsKKwlURVNUX01PREVfSVRFUl9FTkQKKwor CVRFU1RfTU9ERV9JVEVSX0JFR0lOKHQpCisJCWlmICh0LnNjcmVlbiA9PSBTQ1JFRU5fT0ZGU0NS RUVOKQorCQkJY29udGludWU7CisJCWlmICh0Lm1ldGhvZCAhPSBJR1RfRFJBV19CTFQpCisJCQlj b250aW51ZTsKKwkJaWYgKHQucGxhbmUgPT0gUExBTkVfUFJJKQorCQkJY29udGludWU7CisKKwkJ aWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtbW92ZS0lcyIsCisJCQkgICAgICBwaXBlc19zdHIodC5w aXBlcyksCisJCQkgICAgICBzY3JlZW5fc3RyKHQuc2NyZWVuKSwKKwkJCSAgICAgIHBsYW5lX3N0 cih0LnBsYW5lKSwKKwkJCSAgICAgIGZlYXR1cmVfc3RyKHQuZmVhdHVyZSkpCisJCQltb3ZlX3N1 YnRlc3QoJnQpOworCisJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLW9ub2ZmLSVzIiwKKwkJCSAg ICAgIHBpcGVzX3N0cih0LnBpcGVzKSwKKwkJCSAgICAgIHNjcmVlbl9zdHIodC5zY3JlZW4pLAor CQkJICAgICAgcGxhbmVfc3RyKHQucGxhbmUpLAorCQkJICAgICAgZmVhdHVyZV9zdHIodC5mZWF0 dXJlKSkKKwkJCW9ub2ZmX3N1YnRlc3QoJnQpOworCVRFU1RfTU9ERV9JVEVSX0VORAorCisJVEVT VF9NT0RFX0lURVJfQkVHSU4odCkKKwkJaWYgKHQuc2NyZWVuID09IFNDUkVFTl9PRkZTQ1JFRU4p CisJCQljb250aW51ZTsKKwkJaWYgKHQubWV0aG9kICE9IElHVF9EUkFXX0JMVCkKKwkJCWNvbnRp bnVlOworCQlpZiAodC5wbGFuZSAhPSBQTEFORV9TUFIpCisJCQljb250aW51ZTsKKworCQlpZ3Rf c3VidGVzdF9mKCIlcy0lcy0lcy1mdWxsc2NyZWVuLSVzIiwKKwkJCSAgICAgIHBpcGVzX3N0cih0 LnBpcGVzKSwKKwkJCSAgICAgIHNjcmVlbl9zdHIodC5zY3JlZW4pLAorCQkJICAgICAgcGxhbmVf c3RyKHQucGxhbmUpLAorCQkJICAgICAgZmVhdHVyZV9zdHIodC5mZWF0dXJlKSkKKwkJCWZ1bGxz Y3JlZW5fcGxhbmVfc3VidGVzdCgmdCk7CisJVEVTVF9NT0RFX0lURVJfRU5ECisKKwkvKgorCSAq IFRPRE86IGlkZWFzIGZvciBzdWJ0ZXN0czoKKwkgKiAtIEFkZCBhIG5ldyBwaXBlIGNvbmZpZ3Vy YXRpb24gd2hlcmUgYm90aCBwaXBlcyBjYW4gc2hhcmUgYSBiaWcKKwkgKiAgIGZyYW1lYnVmZmVy IChpbnN0ZWFkIG9mIGVhY2ggcGlwZSBoYXZpbmcgaXRzIG93biBGQikuIFRoaXMgd2lsbAorCSAq ICAgcG9zc2libHkgcmVxdWlyZSBzb21lIHdyYXBwaW5nIG9mIHN0cnVjdCBpZ3RfZmIgdG8gbWFr ZSB0aGUKKwkgKiAgIGltcGxlbWVudGF0aW9uIGVhc2llci4KKwkgKiAtIEFkZCBhIHRlc3QgdGhh dCBhbHRlcm5hdGVzIGJldHdlZW4gZGlmZmVyZW50IHdyaXRpbmcgbWV0aG9kcy4gRG9uJ3QKKwkg KiAgIGZvcmdldCB0byBhZGQgdGhlIHByb3BlciBkb21haW4gaGFuZGxpbmcuCisJICogLSBBZGQg YSBuZXcgZW51bSB0byBzdHJ1Y3QgdGVzdF9tb2RlIHRoYXQgYWxsb3dzIHVzIHRvIHNwZWNpZnkg dGhlCisJICogICBCUFAvZGVwdGggY29uZmlndXJhdGlvbi4KKwkgKi8KKworCWlndF9maXh0dXJl CisJCXRlYXJkb3duX2Vudmlyb25tZW50KCk7CisKKwlpZ3RfZXhpdCgpOworfQotLSAKMi4xLjQK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdm eCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==