From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulo Zanoni Subject: [PATCH 7/7] lib: add igt_draw Date: Wed, 1 Apr 2015 19:40:59 -0300 Message-ID: <1427928059-2129-1-git-send-email-przanoni@gmail.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qg0-f51.google.com (mail-qg0-f51.google.com [209.85.192.51]) by gabe.freedesktop.org (Postfix) with ESMTP id B790F6E1BE for ; Wed, 1 Apr 2015 15:41:40 -0700 (PDT) Received: by qgh3 with SMTP id 3so56075233qgh.2 for ; Wed, 01 Apr 2015 15:41:40 -0700 (PDT) In-Reply-To: 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: Paulo Zanoni List-Id: intel-gfx@lists.freedesktop.org RnJvbTogUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+CgpGb3IgYWxsIHRo b3NlIElHVCB0ZXN0cyB0aGF0IG5lZWQgYW4gZWFzeSB3YXkgdG8gZHJhdyByZWN0YW5nbGVzIG9u CmJ1ZmZlcnMgdXNpbmcgZGlmZmVyZW50IG1ldGhvZHMuIEN1cnJlbnQgcGxhbm5lZCB1c2Vyczog RkJDIGFuZCBQU1IKQ1JDIHRlc3RzLgoKVGhlcmUgaXMgYWxzbyBhIHRlc3RzL2ttc19kcmF3X2Ny YyBwcm9ncmFtIHRvIGNoZWNrIGlmIHRoZSBsaWJyYXJ5IGlzCnNhbmUuCgp2MjogLSBNb3ZlIHRo ZSB0ZXN0IGZyb20gbGliL3Rlc3RzIHRvIHRlc3RzLyAoRGFuaWVsKS4KICAgIC0gQWRkIGlndF9y ZXF1aXJlKCkgdG8gZmlsdGVyIG91dCB0aGUgc3dpenpsaW5nL3RpbGluZyBtZXRob2RzIHdlCiAg ICAgIGRvbid0IHN1cHBvcnQgKERhbmllbCkuCiAgICAtIFNpbXBsaWZ5IHJlbG9jIGhhbmRsaW5n IG9uIHRoZSBCTFQgY2FzZSAoRGFuaWVsKS4KICAgIC0gRG9jdW1lbnQgZW51bSBpZ3RfZHJhd19t ZXRob2QgKERhbmllbCkuCiAgICAtIERvY3VtZW50IGlndF9kcmF3X2dldF9tZXRob2RfbmFtZSgp IChQYXVsbykuCnYzOiAtIEFkZCBJR1RfRFJBV19NTUFQX1dDIChDaHJpcykuCiAgICAtIEltcGxl bWVudCB0aGUgb3RoZXIgdHJpdmlhbCBzd2l6emxpbmcgbWV0aG9kcyAoQ2hyaXMpLgogICAgLSBS ZW1vdmUgdGhlIGdlbV9zeW5jKCkgY2FsbHMgKENocmlzKS4KClNpZ25lZC1vZmYtYnk6IFBhdWxv IFphbm9uaSA8cGF1bG8uci56YW5vbmlAaW50ZWwuY29tPgotLS0KIGxpYi9NYWtlZmlsZS5zb3Vy Y2VzICAgfCAgIDIgKwogbGliL2lndF9kcmF3LmMgICAgICAgICB8IDU2MiArKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBsaWIvaWd0X2RyYXcuaCAgICAg ICAgIHwgIDY1ICsrKysrKwogdGVzdHMvLmdpdGlnbm9yZSAgICAgICB8ICAgMSArCiB0ZXN0cy9N YWtlZmlsZS5zb3VyY2VzIHwgICAxICsKIHRlc3RzL2ttc19kcmF3X2NyYy5jICAgfCAyNDcgKysr KysrKysrKysrKysrKysrKysrKwogNiBmaWxlcyBjaGFuZ2VkLCA4NzggaW5zZXJ0aW9ucygrKQog Y3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9pZ3RfZHJhdy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGli L2lndF9kcmF3LmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9rbXNfZHJhd19jcmMuYwoKZGlm ZiAtLWdpdCBhL2xpYi9NYWtlZmlsZS5zb3VyY2VzIGIvbGliL01ha2VmaWxlLnNvdXJjZXMKaW5k ZXggM2Q5MzYyOS4uODVkYzMyMSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlLnNvdXJjZXMKKysr IGIvbGliL01ha2VmaWxlLnNvdXJjZXMKQEAgLTUyLDYgKzUyLDggQEAgbGliaW50ZWxfdG9vbHNf bGFfU09VUkNFUyA9IAlcCiAJaWd0X2ZiLmgJCVwKIAlpZ3RfY29yZS5jCQlcCiAJaWd0X2NvcmUu aAkJXAorCWlndF9kcmF3LmMJCVwKKwlpZ3RfZHJhdy5oCQlcCiAJJChOVUxMKQogCiAuUEhPTlk6 IHZlcnNpb24uaC50bXAKZGlmZiAtLWdpdCBhL2xpYi9pZ3RfZHJhdy5jIGIvbGliL2lndF9kcmF3 LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlNDcwZgotLS0gL2Rldi9u dWxsCisrKyBiL2xpYi9pZ3RfZHJhdy5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogQ29weXJp Z2h0IMKpIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVi eSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICog Y29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMg KHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVz dHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8g dXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNl LAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw ZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1 YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5 cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5l eHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJz dGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS RVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFV VEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFH RVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJB Q1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisg KiBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisj aW5jbHVkZSAiaWd0X2RyYXcuaCIKKworI2luY2x1ZGUgImRybXRlc3QuaCIKKyNpbmNsdWRlICJp bnRlbF9jaGlwc2V0LmgiCisjaW5jbHVkZSAiaWd0X2NvcmUuaCIKKyNpbmNsdWRlICJpZ3RfZmIu aCIKKyNpbmNsdWRlICJpb2N0bF93cmFwcGVycy5oIgorCisvKioKKyAqIFNFQ1RJT046aWd0X2Ry YXcKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogZHJhd2luZyBoZWxwZXJzIGZvciB0ZXN0cworICog QHRpdGxlOiBpLWctdCBkcmF3CisgKiBAaW5jbHVkZTogaWd0X2RyYXcuaAorICoKKyAqIFRoaXMg bGlicmFyeSBjb250YWlucyBzb21lIGZ1bmN0aW9ucyBmb3IgZHJhd2luZyByZWN0YW5nbGVzIG9u IGJ1ZmZlcnMgdXNpbmcKKyAqIHRoZSBtYW55IGRpZmZlcmVudCBkcmF3aW5nIG1ldGhvZHMgd2Ug aGF2ZS4gSXQgYWxzbyBjb250YWlucyBzb21lIHdyYXBwZXJzCisgKiB0aGF0IG1ha2UgdGhlIHBy b2Nlc3MgZWFzaWVyIGlmIHlvdSBoYXZlIHRoZSBhYnN0cmFjdCBvYmplY3RzIGluIGhhbmQuCisg KgorICogQWxsIGZ1bmN0aW9ucyBhc3N1bWUgdGhlIGJ1ZmZlcnMgYXJlIGluIHRoZSBYUkdCIDg6 ODo4IGZvcm1hdC4KKyAqCisgKi8KKworLyogU29tZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMg dG8gYXZvaWQgaGF2aW5nIHRvIHBhc3MgdG9ucyBvZiBwYXJhbWV0ZXJzCisgKiBhcm91bmQgZXZl cnl0aGluZy4gKi8KK3N0cnVjdCBjbWRfZGF0YSB7CisJZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdy OworCWRybV9pbnRlbF9jb250ZXh0ICpjb250ZXh0OworfTsKKworc3RydWN0IGJ1Zl9kYXRhIHsK Kwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBzdHJpZGU7Cit9 OworCitzdHJ1Y3QgcmVjdCB7CisJaW50IHg7CisJaW50IHk7CisJaW50IHc7CisJaW50IGg7Cit9 OworCisvKioKKyAqIGlndF9kcmF3X2dldF9tZXRob2RfbmFtZToKKyAqCisgKiBTaW1wbGUgZnVu Y3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBlbnVtIGludG8gYSBzdHJpbmcuIFVzZWZ1bCB3aGVuIG5h bWluZworICogc3VidGVzdHMgYW5kIHByaW50aW5nIGRlYnVnIG1lc3NhZ2VzLgorICovCitjb25z dCBjaGFyICppZ3RfZHJhd19nZXRfbWV0aG9kX25hbWUoZW51bSBpZ3RfZHJhd19tZXRob2QgbWV0 aG9kKQoreworCXN3aXRjaCAobWV0aG9kKSB7CisJY2FzZSBJR1RfRFJBV19NTUFQX0NQVToKKwkJ cmV0dXJuICJtbWFwLWNwdSI7CisJY2FzZSBJR1RfRFJBV19NTUFQX0dUVDoKKwkJcmV0dXJuICJt bWFwLWd0dCI7CisJY2FzZSBJR1RfRFJBV19NTUFQX1dDOgorCQlyZXR1cm4gIm1tYXAtd2MiOwor CWNhc2UgSUdUX0RSQVdfUFdSSVRFOgorCQlyZXR1cm4gInB3cml0ZSI7CisJY2FzZSBJR1RfRFJB V19CTFQ6CisJCXJldHVybiAiYmx0IjsKKwljYXNlIElHVF9EUkFXX1JFTkRFUjoKKwkJcmV0dXJu ICJyZW5kZXIiOworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnQoZmFsc2UpOworCX0KK30KKworI2Rl ZmluZSBCSVQobnVtLCBiaXQpICgobnVtID4+IGJpdCkgJiAxKQorCitzdGF0aWMgaW50IHN3aXp6 bGVfYWRkcihpbnQgYWRkciwgaW50IHN3aXp6bGUpCit7CisJaW50IGJpdDY7CisKKwlzd2l0Y2gg KHN3aXp6bGUpIHsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOgorCQliaXQ2ID0gQklU KGFkZHIsIDYpOworCQlicmVhazsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85OgorCQliaXQ2 ID0gQklUKGFkZHIsIDYpIF4gQklUKGFkZHIsIDkpOworCQlicmVhazsKKwljYXNlIEk5MTVfQklU XzZfU1dJWlpMRV85XzEwOgorCQliaXQ2ID0gQklUKGFkZHIsIDYpIF4gQklUKGFkZHIsIDkpIF4g QklUKGFkZHIsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMToK KwkJYml0NiA9IEJJVChhZGRyLCA2KSBeIEJJVChhZGRyLCA5KSBeIEJJVChhZGRyLCAxMSk7CisJ CWJyZWFrOworCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTE6CisJCWJpdDYgPSBCSVQo YWRkciwgNikgXiBCSVQoYWRkciwgOSkgXiBCSVQoYWRkciwgMTApIF4KKwkJICAgICAgIEJJVChh ZGRyLCAxMSk7CisJCWJyZWFrOworCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV046CisJ Y2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xNzoKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85 XzEwXzE3OgorCWRlZmF1bHQ6CisJCS8qIElmIHdlIGhpdCB0aGlzIGNhc2UsIHdlIG5lZWQgdG8g aW1wbGVtZW50IHN1cHBvcnQgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzd2l6emxpbmcgbWV0 aG9kLiAqLworCQlpZ3RfcmVxdWlyZShmYWxzZSk7CisJCWJyZWFrOworCX0KKworCWFkZHIgJj0g figxIDw8IDYpOworCWFkZHIgfD0gKGJpdDYgPDwgNik7CisJcmV0dXJuIGFkZHI7Cit9CisKKy8q IEl0J3MgYWxsIGluICJwaXhlbCBjb29yZGluYXRlcyIsIHNvIG1ha2Ugc3VyZSB5b3UgbXVsdGlw bHkvZGl2aWRlIGJ5IHRoZSBicHAKKyAqIGlmIHlvdSBuZWVkIHRvLiAqLworc3RhdGljIGludCBs aW5lYXJfeF95X3RvX3RpbGVkX3BvcyhpbnQgeCwgaW50IHksIHVpbnQzMl90IHN0cmlkZSwgaW50 IHN3aXp6bGUpCit7CisJaW50IHhfdGlsZV9zaXplLCB5X3RpbGVfc2l6ZTsKKwlpbnQgeF90aWxl X24sIHlfdGlsZV9uLCB4X3RpbGVfb2ZmLCB5X3RpbGVfb2ZmOworCWludCBsaW5lX3NpemUsIHRp bGVfc2l6ZTsKKwlpbnQgdGlsZV9uLCB0aWxlX29mZjsKKwlpbnQgdGlsZWRfcG9zLCB0aWxlc19w ZXJfbGluZTsKKwlpbnQgYnBwOworCisJbGluZV9zaXplID0gc3RyaWRlOworCXhfdGlsZV9zaXpl ID0gNTEyOworCXlfdGlsZV9zaXplID0gODsKKwl0aWxlX3NpemUgPSB4X3RpbGVfc2l6ZSAqIHlf dGlsZV9zaXplOworCXRpbGVzX3Blcl9saW5lID0gbGluZV9zaXplIC8geF90aWxlX3NpemU7CisJ YnBwID0gc2l6ZW9mKHVpbnQzMl90KTsKKworCXlfdGlsZV9uID0geSAvIHlfdGlsZV9zaXplOwor CXlfdGlsZV9vZmYgPSB5ICUgeV90aWxlX3NpemU7CisKKwl4X3RpbGVfbiA9ICh4ICogYnBwKSAv IHhfdGlsZV9zaXplOworCXhfdGlsZV9vZmYgPSAoeCAqIGJwcCkgJSB4X3RpbGVfc2l6ZTsKKwor CXRpbGVfbiA9IHlfdGlsZV9uICogdGlsZXNfcGVyX2xpbmUgKyB4X3RpbGVfbjsKKwl0aWxlX29m ZiA9IHlfdGlsZV9vZmYgKiB4X3RpbGVfc2l6ZSArIHhfdGlsZV9vZmY7CisJdGlsZWRfcG9zID0g dGlsZV9uICogdGlsZV9zaXplICsgdGlsZV9vZmY7CisKKwl0aWxlZF9wb3MgPSBzd2l6emxlX2Fk ZHIodGlsZWRfcG9zLCBzd2l6emxlKTsKKworCXJldHVybiB0aWxlZF9wb3MgLyBicHA7Cit9CisK Ky8qIEl0J3MgYWxsIGluICJwaXhlbCBjb29yZGluYXRlcyIsIHNvIG1ha2Ugc3VyZSB5b3UgbXVs dGlwbHkvZGl2aWRlIGJ5IHRoZSBicHAKKyAqIGlmIHlvdSBuZWVkIHRvLiAqLworc3RhdGljIHZv aWQgdGlsZWRfcG9zX3RvX3hfeV9saW5lYXIoaW50IHRpbGVkX3BvcywgdWludDMyX3Qgc3RyaWRl LAorCQkJCSAgICBpbnQgc3dpenpsZSwgaW50ICp4LCBpbnQgKnkpCit7CisJaW50IHRpbGVfbiwg dGlsZV9vZmYsIHRpbGVzX3Blcl9saW5lLCBsaW5lX3NpemU7CisJaW50IHhfdGlsZV9vZmYsIHlf dGlsZV9vZmY7CisJaW50IHhfdGlsZV9uLCB5X3RpbGVfbjsKKwlpbnQgeF90aWxlX3NpemUsIHlf dGlsZV9zaXplLCB0aWxlX3NpemU7CisJaW50IGJwcDsKKworCXRpbGVkX3BvcyA9IHN3aXp6bGVf YWRkcih0aWxlZF9wb3MsIHN3aXp6bGUpOworCisJbGluZV9zaXplID0gc3RyaWRlOworCXhfdGls ZV9zaXplID0gNTEyOworCXlfdGlsZV9zaXplID0gODsKKwl0aWxlX3NpemUgPSB4X3RpbGVfc2l6 ZSAqIHlfdGlsZV9zaXplOworCXRpbGVzX3Blcl9saW5lID0gbGluZV9zaXplIC8geF90aWxlX3Np emU7CisJYnBwID0gc2l6ZW9mKHVpbnQzMl90KTsKKworCXRpbGVfbiA9IHRpbGVkX3BvcyAvIHRp bGVfc2l6ZTsKKwl0aWxlX29mZiA9IHRpbGVkX3BvcyAlIHRpbGVfc2l6ZTsKKworCXlfdGlsZV9v ZmYgPSB0aWxlX29mZiAvIHhfdGlsZV9zaXplOworCXhfdGlsZV9vZmYgPSB0aWxlX29mZiAlIHhf dGlsZV9zaXplOworCisJeF90aWxlX24gPSB0aWxlX24gJSB0aWxlc19wZXJfbGluZTsKKwl5X3Rp bGVfbiA9IHRpbGVfbiAvIHRpbGVzX3Blcl9saW5lOworCisJKnggPSAoeF90aWxlX24gKiB4X3Rp bGVfc2l6ZSArIHhfdGlsZV9vZmYpIC8gYnBwOworCSp5ID0geV90aWxlX24gKiB5X3RpbGVfc2l6 ZSArIHlfdGlsZV9vZmY7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfcmVjdF9wdHJfbGluZWFyKHVp bnQzMl90ICpwdHIsIHVpbnQzMl90IHN0cmlkZSwKKwkJCQkgIHN0cnVjdCByZWN0ICpyZWN0LCB1 aW50MzJfdCBjb2xvcikKK3sKKwlpbnQgeCwgeSwgbGluZV9iZWdpbjsKKworCWZvciAoeSA9IHJl Y3QtPnk7IHkgPCByZWN0LT55ICsgcmVjdC0+aDsgeSsrKSB7CisJCWxpbmVfYmVnaW4gPSB5ICog c3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KTsKKwkJZm9yICh4ID0gcmVjdC0+eDsgeCA8IHJlY3Qt PnggKyByZWN0LT53OyB4KyspCisJCQlwdHJbbGluZV9iZWdpbiArIHhdID0gY29sb3I7CisJfQor Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfcmVjdF9wdHJfdGlsZWQodWludDMyX3QgKnB0ciwgdWlu dDMyX3Qgc3RyaWRlLCBpbnQgc3dpenpsZSwKKwkJCQkgc3RydWN0IHJlY3QgKnJlY3QsIHVpbnQz Ml90IGNvbG9yKQoreworCWludCB4LCB5LCBwb3M7CisKKwlmb3IgKHkgPSByZWN0LT55OyB5IDwg cmVjdC0+eSArIHJlY3QtPmg7IHkrKykgeworCQlmb3IgKHggPSByZWN0LT54OyB4IDwgcmVjdC0+ eCArIHJlY3QtPnc7IHgrKykgeworCQkJcG9zID0gbGluZWFyX3hfeV90b190aWxlZF9wb3MoeCwg eSwgc3RyaWRlLCBzd2l6emxlKTsKKwkJCXB0cltwb3NdID0gY29sb3I7CisJCX0KKwl9Cit9CisK K3N0YXRpYyB2b2lkIGRyYXdfcmVjdF9tbWFwX2NwdShpbnQgZmQsIHN0cnVjdCBidWZfZGF0YSAq YnVmLCBzdHJ1Y3QgcmVjdCAqcmVjdCwKKwkJCSAgICAgICB1aW50MzJfdCBjb2xvcikKK3sKKwl1 aW50MzJfdCAqcHRyOworCXVpbnQzMl90IHRpbGluZywgc3dpenpsZTsKKworCWdlbV9zZXRfZG9t YWluKGZkLCBidWYtPmhhbmRsZSwgSTkxNV9HRU1fRE9NQUlOX0NQVSwKKwkJICAgICAgIEk5MTVf R0VNX0RPTUFJTl9DUFUpOworCWdlbV9nZXRfdGlsaW5nKGZkLCBidWYtPmhhbmRsZSwgJnRpbGlu ZywgJnN3aXp6bGUpOworCisJLyogV2UgZGlkbid0IGltcGxlbWVudCBzdXBvcnQgZm9yIHRoZSBv bGRlciB0aWxpbmcgbWV0aG9kcyB5ZXQuICovCisJaWYgKHRpbGluZyAhPSBJOTE1X1RJTElOR19O T05FKQorCQlpZ3RfcmVxdWlyZShpbnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChmZCkpID49 IDUpOworCisJcHRyID0gZ2VtX21tYXBfX2NwdShmZCwgYnVmLT5oYW5kbGUsIDAsIGJ1Zi0+c2l6 ZSwgMCk7CisJaWd0X2Fzc2VydChwdHIpOworCisJc3dpdGNoICh0aWxpbmcpIHsKKwljYXNlIEk5 MTVfVElMSU5HX05PTkU6CisJCWRyYXdfcmVjdF9wdHJfbGluZWFyKHB0ciwgYnVmLT5zdHJpZGUs IHJlY3QsIGNvbG9yKTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X1RJTElOR19YOgorCQlkcmF3X3Jl Y3RfcHRyX3RpbGVkKHB0ciwgYnVmLT5zdHJpZGUsIHN3aXp6bGUsIHJlY3QsIGNvbG9yKTsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJaWd0X2Fzc2VydChmYWxzZSk7CisJCWJyZWFrOworCX0KKwor CWdlbV9zd19maW5pc2goZmQsIGJ1Zi0+aGFuZGxlKTsKKworCWlndF9hc3NlcnQobXVubWFwKHB0 ciwgYnVmLT5zaXplKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgZHJhd19yZWN0X21tYXBfZ3R0 KGludCBmZCwgc3RydWN0IGJ1Zl9kYXRhICpidWYsIHN0cnVjdCByZWN0ICpyZWN0LAorCQkJICAg ICAgIHVpbnQzMl90IGNvbG9yKQoreworCXVpbnQzMl90ICpwdHI7CisKKwlwdHIgPSBnZW1fbW1h cF9fZ3R0KGZkLCBidWYtPmhhbmRsZSwgYnVmLT5zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRF KTsKKwlpZ3RfYXNzZXJ0KHB0cik7CisKKwlkcmF3X3JlY3RfcHRyX2xpbmVhcihwdHIsIGJ1Zi0+ c3RyaWRlLCByZWN0LCBjb2xvcik7CisKKwlpZ3RfYXNzZXJ0KG11bm1hcChwdHIsIGJ1Zi0+c2l6 ZSkgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfcmVjdF9tbWFwX3djKGludCBmZCwgc3Ry dWN0IGJ1Zl9kYXRhICpidWYsIHN0cnVjdCByZWN0ICpyZWN0LAorCQkJICAgICAgdWludDMyX3Qg Y29sb3IpCit7CisJdWludDMyX3QgKnB0cjsKKwl1aW50MzJfdCB0aWxpbmcsIHN3aXp6bGU7CisK KwlnZW1fZ2V0X3RpbGluZyhmZCwgYnVmLT5oYW5kbGUsICZ0aWxpbmcsICZzd2l6emxlKTsKKwor CS8qIFdlIGRpZG4ndCBpbXBsZW1lbnQgc3Vwb3J0IGZvciB0aGUgb2xkZXIgdGlsaW5nIG1ldGhv ZHMgeWV0LiAqLworCWlmICh0aWxpbmcgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJaWd0X3JlcXVp cmUoaW50ZWxfZ2VuKGludGVsX2dldF9kcm1fZGV2aWQoZmQpKSA+PSA1KTsKKworCXB0ciA9IGdl bV9tbWFwX193YyhmZCwgYnVmLT5oYW5kbGUsIDAsIGJ1Zi0+c2l6ZSwKKwkJCSAgIFBST1RfUkVB RCB8IFBST1RfV1JJVEUpOworCWlndF9hc3NlcnQocHRyKTsKKworCXN3aXRjaCAodGlsaW5nKSB7 CisJY2FzZSBJOTE1X1RJTElOR19OT05FOgorCQlkcmF3X3JlY3RfcHRyX2xpbmVhcihwdHIsIGJ1 Zi0+c3RyaWRlLCByZWN0LCBjb2xvcik7CisJCWJyZWFrOworCWNhc2UgSTkxNV9USUxJTkdfWDoK KwkJZHJhd19yZWN0X3B0cl90aWxlZChwdHIsIGJ1Zi0+c3RyaWRlLCBzd2l6emxlLCByZWN0LCBj b2xvcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnQoZmFsc2UpOworCQlicmVh azsKKwl9CisKKwlpZ3RfYXNzZXJ0KG11bm1hcChwdHIsIGJ1Zi0+c2l6ZSkgPT0gMCk7Cit9CisK K3N0YXRpYyB2b2lkIGRyYXdfcmVjdF9wd3JpdGVfdW50aWxlZChpbnQgZmQsIHN0cnVjdCBidWZf ZGF0YSAqYnVmLAorCQkJCSAgICAgc3RydWN0IHJlY3QgKnJlY3QsIHVpbnQzMl90IGNvbG9yKQor eworCXVpbnQzMl90IHRtcFtyZWN0LT53XTsKKwlpbnQgaSwgeSwgb2Zmc2V0LCBicHA7CisKKwli cHAgPSBzaXplb2YodWludDMyX3QpOworCisJZm9yIChpID0gMDsgaSA8IHJlY3QtPnc7IGkrKykK KwkJdG1wW2ldID0gY29sb3I7CisKKwlmb3IgKHkgPSByZWN0LT55OyB5IDwgcmVjdC0+eSArIHJl Y3QtPmg7IHkrKykgeworCQlvZmZzZXQgPSAoeSAqIGJ1Zi0+c3RyaWRlKSArIChyZWN0LT54ICog YnBwKTsKKwkJZ2VtX3dyaXRlKGZkLCBidWYtPmhhbmRsZSwgb2Zmc2V0LCB0bXAsIHJlY3QtPncg KiBicHApOworCX0KK30KKworc3RhdGljIHZvaWQgZHJhd19yZWN0X3B3cml0ZV90aWxlZChpbnQg ZmQsIHN0cnVjdCBidWZfZGF0YSAqYnVmLAorCQkJCSAgIHN0cnVjdCByZWN0ICpyZWN0LCB1aW50 MzJfdCBjb2xvciwKKwkJCQkgICB1aW50MzJfdCBzd2l6emxlKQoreworCWludCBpOworCWludCB0 aWxlZF9wb3MsIGJwcCwgeCwgeTsKKwl1aW50MzJfdCB0bXBbMTAyNF07CisJaW50IHRtcF91c2Vk ID0gMCwgdG1wX3NpemUgPSBBUlJBWV9TSVpFKHRtcCk7CisJYm9vbCBmbHVzaF90bXAgPSBmYWxz ZTsKKwlpbnQgdG1wX3N0YXJ0X3BvcyA9IDA7CisKKwkvKiBXZSBkaWRuJ3QgaW1wbGVtZW50IHN1 cG9ydCBmb3IgdGhlIG9sZGVyIHRpbGluZyBtZXRob2RzIHlldC4gKi8KKwlpZ3RfcmVxdWlyZShp bnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChmZCkpID49IDUpOworCisJYnBwID0gc2l6ZW9m KHVpbnQzMl90KTsKKworCS8qIEluc3RlYWQgb2YgZG9pbmcgb25lIHB3cml0ZSBwZXIgcGl4ZWws IHdlIHRyeSB0byBncm91cCB0aGUgbWF4aW11bQorCSAqIGFtb3VudCBvZiBjb25zZWN1dGl2ZSBw aXhlbHMgd2UgY2FuIGluIGEgc2luZ2xlIHB3cml0ZTogdGhhdCdzIHdoeSB3ZQorCSAqIHVzZSB0 aGUgInRtcCIgdmFyaWFibGVzLiAqLworCWZvciAoaSA9IDA7IGkgPCB0bXBfc2l6ZTsgaSsrKQor CQl0bXBbaV0gPSBjb2xvcjsKKworCWZvciAodGlsZWRfcG9zID0gMDsgdGlsZWRfcG9zIDwgYnVm LT5zaXplOyB0aWxlZF9wb3MgKz0gYnBwKSB7CisJCXRpbGVkX3Bvc190b194X3lfbGluZWFyKHRp bGVkX3BvcywgYnVmLT5zdHJpZGUsIHN3aXp6bGUsICZ4LCAmeSk7CisKKwkJaWYgKHggPj0gcmVj dC0+eCAmJiB4IDwgcmVjdC0+eCArIHJlY3QtPncgJiYKKwkJICAgIHkgPj0gcmVjdC0+eSAmJiB5 IDwgcmVjdC0+eSArIHJlY3QtPmgpIHsKKwkJCWlmICh0bXBfdXNlZCA9PSAwKQorCQkJCXRtcF9z dGFydF9wb3MgPSB0aWxlZF9wb3M7CisJCQl0bXBfdXNlZCsrOworCQl9IGVsc2UgeworCQkJZmx1 c2hfdG1wID0gdHJ1ZTsKKwkJfQorCisJCWlmICh0bXBfdXNlZCA9PSB0bXBfc2l6ZSB8fCAoZmx1 c2hfdG1wICYmIHRtcF91c2VkID4gMCkpIHsKKwkJCWdlbV93cml0ZShmZCwgYnVmLT5oYW5kbGUs IHRtcF9zdGFydF9wb3MsIHRtcCwKKwkJCQkgIHRtcF91c2VkICogYnBwKTsKKwkJCWZsdXNoX3Rt cCA9IGZhbHNlOworCQkJdG1wX3VzZWQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBk cmF3X3JlY3RfcHdyaXRlKGludCBmZCwgc3RydWN0IGJ1Zl9kYXRhICpidWYsCisJCQkgICAgIHN0 cnVjdCByZWN0ICpyZWN0LCB1aW50MzJfdCBjb2xvcikKK3sKKwl1aW50MzJfdCB0aWxpbmcsIHN3 aXp6bGU7CisKKwlnZW1fZ2V0X3RpbGluZyhmZCwgYnVmLT5oYW5kbGUsICZ0aWxpbmcsICZzd2l6 emxlKTsKKworCXN3aXRjaCAodGlsaW5nKSB7CisJY2FzZSBJOTE1X1RJTElOR19OT05FOgorCQlk cmF3X3JlY3RfcHdyaXRlX3VudGlsZWQoZmQsIGJ1ZiwgcmVjdCwgY29sb3IpOworCQlicmVhazsK KwljYXNlIEk5MTVfVElMSU5HX1g6CisJCWRyYXdfcmVjdF9wd3JpdGVfdGlsZWQoZmQsIGJ1Ziwg cmVjdCwgY29sb3IsIHN3aXp6bGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0 KGZhbHNlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X3JlY3RfYmx0KGlu dCBmZCwgc3RydWN0IGNtZF9kYXRhICpjbWRfZGF0YSwKKwkJCSAgc3RydWN0IGJ1Zl9kYXRhICpi dWYsIHN0cnVjdCByZWN0ICpyZWN0LAorCQkJICB1aW50MzJfdCBjb2xvcikKK3sKKwlkcm1faW50 ZWxfYm8gKmRzdDsKKwlzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoOworCWludCBibHRf Y21kX2xlbiwgYmx0X2NtZF90aWxpbmc7CisJdWludDMyX3QgZGV2aWQgPSBpbnRlbF9nZXRfZHJt X2RldmlkKGZkKTsKKwlpbnQgZ2VuID0gaW50ZWxfZ2VuKGRldmlkKTsKKwl1aW50MzJfdCB0aWxp bmcsIHN3aXp6bGU7CisJaW50IHBpdGNoOworCisJZ2VtX2dldF90aWxpbmcoZmQsIGJ1Zi0+aGFu ZGxlLCAmdGlsaW5nLCAmc3dpenpsZSk7CisKKwlkc3QgPSBnZW1faGFuZGxlX3RvX2xpYmRybV9i byhjbWRfZGF0YS0+YnVmbWdyLCBmZCwgIiIsIGJ1Zi0+aGFuZGxlKTsKKwlpZ3RfYXNzZXJ0KGRz dCk7CisKKwliYXRjaCA9IGludGVsX2JhdGNoYnVmZmVyX2FsbG9jKGNtZF9kYXRhLT5idWZtZ3Is IGRldmlkKTsKKwlpZ3RfYXNzZXJ0KGJhdGNoKTsKKworCWJsdF9jbWRfbGVuID0gKGdlbiA+PSA4 KSA/ICAweDUgOiAweDQ7CisJYmx0X2NtZF90aWxpbmcgPSAodGlsaW5nKSA/IFhZX0NPTE9SX0JM VF9USUxFRCA6IDA7CisJcGl0Y2ggPSAodGlsaW5nKSA/IGJ1Zi0+c3RyaWRlIC8gNCA6IGJ1Zi0+ c3RyaWRlOworCisJQkVHSU5fQkFUQ0goNiwgMSk7CisJT1VUX0JBVENIKFhZX0NPTE9SX0JMVF9D TURfTk9MRU4gfCBYWV9DT0xPUl9CTFRfV1JJVEVfQUxQSEEgfAorCQkgIFhZX0NPTE9SX0JMVF9X UklURV9SR0IgfCBibHRfY21kX3RpbGluZyB8IGJsdF9jbWRfbGVuKTsKKwlPVVRfQkFUQ0goKDMg PDwgMjQpIHwgKDB4RjAgPDwgMTYpIHwgcGl0Y2gpOworCU9VVF9CQVRDSCgocmVjdC0+eSA8PCAx NikgfCByZWN0LT54KTsKKwlPVVRfQkFUQ0goKChyZWN0LT55ICsgcmVjdC0+aCkgPDwgMTYpIHwg KHJlY3QtPnggKyByZWN0LT53KSk7CisJT1VUX1JFTE9DX0ZFTkNFRChkc3QsIDAsIEk5MTVfR0VN X0RPTUFJTl9SRU5ERVIsIDApOworCU9VVF9CQVRDSChjb2xvcik7CisJQURWQU5DRV9CQVRDSCgp OworCisJaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goYmF0Y2gpOworCWludGVsX2JhdGNoYnVmZmVy X2ZyZWUoYmF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBkcmF3X3JlY3RfcmVuZGVyKGludCBmZCwg c3RydWN0IGNtZF9kYXRhICpjbWRfZGF0YSwKKwkJCSAgICAgc3RydWN0IGJ1Zl9kYXRhICpidWYs IHN0cnVjdCByZWN0ICpyZWN0LAorCQkJICAgICB1aW50MzJfdCBjb2xvcikKK3sKKwlkcm1faW50 ZWxfYm8gKnNyYywgKmRzdDsKKwl1aW50MzJfdCBkZXZpZCA9IGludGVsX2dldF9kcm1fZGV2aWQo ZmQpOworCWlndF9yZW5kZXJfY29weWZ1bmNfdCByZW5kZXJjb3B5ID0gaWd0X2dldF9yZW5kZXJf Y29weWZ1bmMoZGV2aWQpOworCXN0cnVjdCBpZ3RfYnVmIHNyY19idWYsIGRzdF9idWY7CisJc3Ry dWN0IGludGVsX2JhdGNoYnVmZmVyICpiYXRjaDsKKwl1aW50MzJfdCB0aWxpbmcsIHN3aXp6bGU7 CisJc3RydWN0IGJ1Zl9kYXRhIHRtcDsKKworCWlndF9za2lwX29uKCFyZW5kZXJjb3B5KTsKKwor CWdlbV9nZXRfdGlsaW5nKGZkLCBidWYtPmhhbmRsZSwgJnRpbGluZywgJnN3aXp6bGUpOworCisJ LyogV2UgY3JlYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgY29weSBmcm9tIGl0IHVzaW5nIHJl bmRlcmNvcHkuICovCisJdG1wLnNpemUgPSByZWN0LT53ICogcmVjdC0+aCAqIHNpemVvZih1aW50 MzJfdCk7CisJdG1wLmhhbmRsZSA9IGdlbV9jcmVhdGUoZmQsIHRtcC5zaXplKTsKKwl0bXAuc3Ry aWRlID0gcmVjdC0+dyAqIHNpemVvZih1aW50MzJfdCk7CisJZHJhd19yZWN0X21tYXBfY3B1KGZk LCAmdG1wLCAmKHN0cnVjdCByZWN0KXswLCAwLCByZWN0LT53LCByZWN0LT5ofSwKKwkJCSAgIGNv bG9yKTsKKworCXNyYyA9IGdlbV9oYW5kbGVfdG9fbGliZHJtX2JvKGNtZF9kYXRhLT5idWZtZ3Is IGZkLCAiIiwgdG1wLmhhbmRsZSk7CisJaWd0X2Fzc2VydChzcmMpOworCWRzdCA9IGdlbV9oYW5k bGVfdG9fbGliZHJtX2JvKGNtZF9kYXRhLT5idWZtZ3IsIGZkLCAiIiwgYnVmLT5oYW5kbGUpOwor CWlndF9hc3NlcnQoZHN0KTsKKworCXNyY19idWYuYm8gPSBzcmM7CisJc3JjX2J1Zi5zdHJpZGUg PSB0bXAuc3RyaWRlOworCXNyY19idWYudGlsaW5nID0gSTkxNV9USUxJTkdfTk9ORTsKKwlzcmNf YnVmLnNpemUgPSB0bXAuc2l6ZTsKKwlkc3RfYnVmLmJvID0gZHN0OworCWRzdF9idWYuc3RyaWRl ID0gYnVmLT5zdHJpZGU7CisJZHN0X2J1Zi50aWxpbmcgPSB0aWxpbmc7CisJZHN0X2J1Zi5zaXpl ID0gYnVmLT5zaXplOworCisJYmF0Y2ggPSBpbnRlbF9iYXRjaGJ1ZmZlcl9hbGxvYyhjbWRfZGF0 YS0+YnVmbWdyLCBkZXZpZCk7CisJaWd0X2Fzc2VydChiYXRjaCk7CisKKwlyZW5kZXJjb3B5KGJh dGNoLCBjbWRfZGF0YS0+Y29udGV4dCwgJnNyY19idWYsIDAsIDAsIHJlY3QtPncsIHJlY3QtPmgs CisJCSAgICZkc3RfYnVmLCByZWN0LT54LCByZWN0LT55KTsKKworCWludGVsX2JhdGNoYnVmZmVy X2ZyZWUoYmF0Y2gpOworCWdlbV9jbG9zZShmZCwgdG1wLmhhbmRsZSk7Cit9CisKKy8qKgorICog aWd0X2RyYXdfcmVjdDoKKyAqIEBmZDogdGhlIERSTSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBidWZt Z3I6IHRoZSBsaWJkcm0gYnVmbWdyLCBvbmx5IHJlcXVpcmVkIGZvciBJR1RfRFJBV19CTFQgYW5k CisgKiAgICAgICAgICBJR1RfRFJBV19SRU5ERVIKKyAqIEBjb250ZXh0OiB0aGUgY29udGV4dCwg Y2FuIGJlIE5VTEwgaWYgeW91IGRvbid0IHdhbnQgdG8gdGhpbmsgYWJvdXQgaXQKKyAqIEBidWZf aGFuZGxlOiB0aGUgaGFuZGxlIG9mIHRoZSBidWZmZXIgd2hlcmUgeW91J3JlIGdvaW5nIHRvIGRy YXcgdG8KKyAqIEBidWZfc2l6ZTogdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQGJ1Zl9zdHJp ZGU6IHRoZSBzdHJpZGUgb2YgdGhlIGJ1ZmZlcgorICogQG1ldGhvZDogbWV0aG9kIHlvdSdyZSBn b2luZyB0byB1c2UgdG8gd3JpdGUgdG8gdGhlIGJ1ZmZlcgorICogQHJlY3RfeDogaG9yaXpvbnRh bCBwb3NpdGlvbiBvbiB0aGUgYnVmZmVyIHdoZXJlIHlvdXIgcmVjdGFuZ2xlIHN0YXJ0cworICog QHJlY3RfeTogdmVydGljYWwgcG9zaXRpb24gb24gdGhlIGJ1ZmZlciB3aGVyZSB5b3VyIHJlY3Rh bmdsZSBzdGFydHMKKyAqIEByZWN0X3c6IHdpZHRoIG9mIHRoZSByZWN0YW5nbGUKKyAqIEByZWN0 X2g6IGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCisgKiBAY29sb3I6IGNvbG9yIG9mIHRoZSByZWN0 YW5nbGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRyYXdzIGEgY29sb3JlZCByZWN0YW5nbGUgb24g dGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYWxsb3dpbmcKKyAqIHlvdSB0byBzcGVjaWZ5IHRoZSBt ZXRob2QgdXNlZCB0byBkcmF3IHRoZSByZWN0YW5nbGUuIFdlIGFzc3VtZSAzMiBiaXQgcGl4ZWxz CisgKiB3aXRoIDggYml0cyBwZXIgY29sb3IuCisgKi8KK3ZvaWQgaWd0X2RyYXdfcmVjdChpbnQg ZmQsIGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgZHJtX2ludGVsX2NvbnRleHQgKmNvbnRleHQs CisJCSAgIHVpbnQzMl90IGJ1Zl9oYW5kbGUsIHVpbnQzMl90IGJ1Zl9zaXplLCB1aW50MzJfdCBi dWZfc3RyaWRlLAorCQkgICBlbnVtIGlndF9kcmF3X21ldGhvZCBtZXRob2QsIGludCByZWN0X3gs IGludCByZWN0X3ksCisJCSAgIGludCByZWN0X3csIGludCByZWN0X2gsIHVpbnQzMl90IGNvbG9y KQoreworCXN0cnVjdCBjbWRfZGF0YSBjbWRfZGF0YSA9IHsKKwkJLmJ1Zm1nciA9IGJ1Zm1nciwK KwkJLmNvbnRleHQgPSBjb250ZXh0LAorCX07CisJc3RydWN0IGJ1Zl9kYXRhIGJ1ZiA9IHsKKwkJ LmhhbmRsZSA9IGJ1Zl9oYW5kbGUsCisJCS5zaXplID0gYnVmX3NpemUsCisJCS5zdHJpZGUgPSBi dWZfc3RyaWRlLAorCX07CisJc3RydWN0IHJlY3QgcmVjdCA9IHsKKwkJLnggPSByZWN0X3gsCisJ CS55ID0gcmVjdF95LAorCQkudyA9IHJlY3RfdywKKwkJLmggPSByZWN0X2gsCisJfTsKKworCXN3 aXRjaCAobWV0aG9kKSB7CisJY2FzZSBJR1RfRFJBV19NTUFQX0NQVToKKwkJZHJhd19yZWN0X21t YXBfY3B1KGZkLCAmYnVmLCAmcmVjdCwgY29sb3IpOworCQlicmVhazsKKwljYXNlIElHVF9EUkFX X01NQVBfR1RUOgorCQlkcmF3X3JlY3RfbW1hcF9ndHQoZmQsICZidWYsICZyZWN0LCBjb2xvcik7 CisJCWJyZWFrOworCWNhc2UgSUdUX0RSQVdfTU1BUF9XQzoKKwkJZHJhd19yZWN0X21tYXBfd2Mo ZmQsICZidWYsICZyZWN0LCBjb2xvcik7CisJCWJyZWFrOworCWNhc2UgSUdUX0RSQVdfUFdSSVRF OgorCQlkcmF3X3JlY3RfcHdyaXRlKGZkLCAmYnVmLCAmcmVjdCwgY29sb3IpOworCQlicmVhazsK KwljYXNlIElHVF9EUkFXX0JMVDoKKwkJZHJhd19yZWN0X2JsdChmZCwgJmNtZF9kYXRhLCAmYnVm LCAmcmVjdCwgY29sb3IpOworCQlicmVhazsKKwljYXNlIElHVF9EUkFXX1JFTkRFUjoKKwkJZHJh d19yZWN0X3JlbmRlcihmZCwgJmNtZF9kYXRhLCAmYnVmLCAmcmVjdCwgY29sb3IpOworCQlicmVh azsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0KGZhbHNlKTsKKwkJYnJlYWs7CisJfQorfQorCisv KioKKyAqIGlndF9kcmF3X3JlY3RfZmI6CisgKgorICogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1l IGFzIGlndF9kcmF3X3JlY3QsIGJ1dCB5b3UgY2FuIHBhc3MgYW4gaWd0X2ZiIGluc3RlYWQKKyAq IG9mIG1hbnVhbGx5IHByb3ZpZGluZyBpdHMgZGV0YWlscy4gU2VlIGlndF9kcmF3X3JlY3QuCisg Ki8KK3ZvaWQgaWd0X2RyYXdfcmVjdF9mYihpbnQgZmQsIGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1n ciwKKwkJICAgICAgZHJtX2ludGVsX2NvbnRleHQgKmNvbnRleHQsIHN0cnVjdCBpZ3RfZmIgKmZi LAorCQkgICAgICBlbnVtIGlndF9kcmF3X21ldGhvZCBtZXRob2QsIGludCByZWN0X3gsIGludCBy ZWN0X3ksCisJCSAgICAgIGludCByZWN0X3csIGludCByZWN0X2gsIHVpbnQzMl90IGNvbG9yKQor eworCWlndF9kcmF3X3JlY3QoZmQsIGJ1Zm1nciwgY29udGV4dCwgZmItPmdlbV9oYW5kbGUsIGZi LT5zaXplLCBmYi0+c3RyaWRlLAorCQkgICAgICBtZXRob2QsIHJlY3RfeCwgcmVjdF95LCByZWN0 X3csIHJlY3RfaCwgY29sb3IpOworfQorCisvKioKKyAqIGlndF9kcmF3X2ZpbGxfZmI6CisgKiBA ZmQ6IHRoZSBEUk0gZmlsZSBkZXNjcmlwdG9yCisgKiBAZmI6IHRoZSBGQiB0aGF0IGlzIGdvaW5n IHRvIGJlIGZpbGxlZAorICogQGNvbG9yOiB0aGUgY29sb3IgeW91J3JlIGdvaW5nIHRvIHBhaW50 IGl0CisgKgorICogVGhpcyBmdW5jdGlvbiBqdXN0IHBhaW50cyBhbiBpZ3RfZmIgdXNpbmcgdGhl IHByb3ZpZGVkIGNvbG9yLiBJdCBhc3N1bWVzIDMyCisgKiBiaXQgcGl4ZWxzIHdpdGggOCBiaXQg Y29sb3JzLgorICovCit2b2lkIGlndF9kcmF3X2ZpbGxfZmIoaW50IGZkLCBzdHJ1Y3QgaWd0X2Zi ICpmYiwgdWludDMyX3QgY29sb3IpCit7CisJaWd0X2RyYXdfcmVjdF9mYihmZCwgTlVMTCwgTlVM TCwgZmIsIElHVF9EUkFXX01NQVBfR1RULAorCQkJIDAsIDAsIGZiLT53aWR0aCwgZmItPmhlaWdo dCwgY29sb3IpOworfQpkaWZmIC0tZ2l0IGEvbGliL2lndF9kcmF3LmggYi9saWIvaWd0X2RyYXcu aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWZmYWQ1Ci0tLSAvZGV2L251 bGwKKysrIGIvbGliL2lndF9kcmF3LmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdo dCDCqSAyMDE1IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkg Z3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNv cHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0 aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3Ry aWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVz ZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwK KyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVy c29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJq ZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0 CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3Rh bnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVT UyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFO VElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRI T1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VT IE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICog SU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fSUdUX0RSQVdfSF9fCisjZGVm aW5lIF9fSUdUX0RSQVdfSF9fCisKKyNpbmNsdWRlIDxpbnRlbF9idWZtZ3IuaD4KKyNpbmNsdWRl ICJpZ3RfZmIuaCIKKworLyoqCisgKmlndF9kcmF3X21ldGhvZDoKKyAqIEBJR1RfRFJBV19NTUFQ X0NQVTogZHJhdyB1c2luZyBhIENQVSBtbWFwLgorICogQElHVF9EUkFXX01NQVBfR1RUOiBkcmF3 IHVzaW5nIGEgR1RUIG1tYXAuCisgKiBASUdULURSQVdfTU1BUF9XQzogZHJhdyB1c2luZyB0aGUg V0MgbW1hcC4KKyAqIEBJR1RfRFJBV19QV1JJVEU6IGRyYXcgdXNpbmcgdGhlIHB3cml0ZSBpb2N0 bC4KKyAqIEBJR1RfRFJBV19CTFQ6IGRyYXcgdXNpbmcgdGhlIEJMVCByaW5nLgorICogQElHVF9E UkFXX1JFTkRFUjogZHJhdyB1c2luZyB0aGUgcmVuZGVyIHJpbmcuCisgKiBASUdUX0RSQVdfTUVU SE9EX0NPVU5UOiB1c2VmdWwgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5dGhpbmcuCisgKi8K K2VudW0gaWd0X2RyYXdfbWV0aG9kIHsKKwlJR1RfRFJBV19NTUFQX0NQVSwKKwlJR1RfRFJBV19N TUFQX0dUVCwKKwlJR1RfRFJBV19NTUFQX1dDLAorCUlHVF9EUkFXX1BXUklURSwKKwlJR1RfRFJB V19CTFQsCisJSUdUX0RSQVdfUkVOREVSLAorCUlHVF9EUkFXX01FVEhPRF9DT1VOVCwKK307CisK K2NvbnN0IGNoYXIgKmlndF9kcmF3X2dldF9tZXRob2RfbmFtZShlbnVtIGlndF9kcmF3X21ldGhv ZCBtZXRob2QpOworCit2b2lkIGlndF9kcmF3X3JlY3QoaW50IGZkLCBkcm1faW50ZWxfYnVmbWdy ICpidWZtZ3IsIGRybV9pbnRlbF9jb250ZXh0ICpjb250ZXh0LAorCQkgICB1aW50MzJfdCBidWZf aGFuZGxlLCB1aW50MzJfdCBidWZfc2l6ZSwgdWludDMyX3QgYnVmX3N0cmlkZSwKKwkJICAgZW51 bSBpZ3RfZHJhd19tZXRob2QgbWV0aG9kLCBpbnQgcmVjdF94LCBpbnQgcmVjdF95LAorCQkgICBp bnQgcmVjdF93LCBpbnQgcmVjdF9oLCB1aW50MzJfdCBjb2xvcik7CisKK3ZvaWQgaWd0X2RyYXdf cmVjdF9mYihpbnQgZmQsIGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKKwkJICAgICAgZHJtX2lu dGVsX2NvbnRleHQgKmNvbnRleHQsIHN0cnVjdCBpZ3RfZmIgKmZiLAorCQkgICAgICBlbnVtIGln dF9kcmF3X21ldGhvZCBtZXRob2QsIGludCByZWN0X3gsIGludCByZWN0X3ksCisJCSAgICAgIGlu dCByZWN0X3csIGludCByZWN0X2gsIHVpbnQzMl90IGNvbG9yKTsKKwordm9pZCBpZ3RfZHJhd19m aWxsX2ZiKGludCBmZCwgc3RydWN0IGlndF9mYiAqZmIsIHVpbnQzMl90IGNvbG9yKTsKKworI2Vu ZGlmIC8qIF9fSUdUX0RSQVdfSF9fICovCmRpZmYgLS1naXQgYS90ZXN0cy8uZ2l0aWdub3JlIGIv dGVzdHMvLmdpdGlnbm9yZQppbmRleCAxZjBlMmQxLi5hZTlkZTI5IDEwMDY0NAotLS0gYS90ZXN0 cy8uZ2l0aWdub3JlCisrKyBiL3Rlc3RzLy5naXRpZ25vcmUKQEAgLTEyNSw2ICsxMjUsNyBAQCBn ZW43X2ZvcmNld2FrZV9tdAoga21zXzNkCiBrbXNfYWRkZmIKIGttc19jdXJzb3JfY3JjCitrbXNf ZHJhd19jcmMKIGttc19mYmNfY3JjCiBrbXNfZmVuY2VfcGluX2xlYWsKIGttc19mbGlwCmRpZmYg LS1naXQgYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwpp bmRleCA5M2UwNWU0Li5iODk0MWIwIDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2Vz CisrKyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKQEAgLTY5LDYgKzY5LDcgQEAgVEVTVFNfcHJv Z3NfTSA9IFwKIAlnZW1fd3JpdGVfcmVhZF9yaW5nX3N3aXRjaCBcCiAJa21zX2FkZGZiIFwKIAlr bXNfY3Vyc29yX2NyYyBcCisJa21zX2RyYXdfY3JjIFwKIAlrbXNfZmJjX2NyYyBcCiAJa21zX2Zs aXAgXAogCWttc19mbGlwX2V2ZW50X2xlYWsgXApkaWZmIC0tZ2l0IGEvdGVzdHMva21zX2RyYXdf Y3JjLmMgYi90ZXN0cy9rbXNfZHJhd19jcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi4xNjMwY2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMva21zX2RyYXdfY3JjLmMK QEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3Jh dGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdl LCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5k IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8g ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhv dXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2Us IHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMg b2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNv ZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNv bmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVy bWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBi ZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQor ICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJ VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xV RElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ LAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVO VC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVS UyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZ LCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFS SVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJF IE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisg Ki8KKworLyogVGhpcyBwcm9ncmFtIHRlc3RzIHdoZXRoZXIgdGhlIGlndF9kcmF3IGxpYnJhcnkg YWN0dWFsbHkgd29ya3MuICovCisKKyNpbmNsdWRlICJkcm10ZXN0LmgiCisjaW5jbHVkZSAiaWd0 X2F1eC5oIgorI2luY2x1ZGUgImlndF9kcmF3LmgiCisjaW5jbHVkZSAiaWd0X2RlYnVnZnMuaCIK KyNpbmNsdWRlICJpZ3RfZmIuaCIKKyNpbmNsdWRlICJpZ3Rfa21zLmgiCisKKyNkZWZpbmUgTUFY X0NPTk5FQ1RPUlMgMzIKKworc3RydWN0IG1vZGVzZXRfcGFyYW1zIHsKKwl1aW50MzJfdCBjcnRj X2lkOworCXVpbnQzMl90IGNvbm5lY3Rvcl9pZDsKKwlkcm1Nb2RlTW9kZUluZm9QdHIgbW9kZTsK K307CisKK2ludCBkcm1fZmQ7Citkcm1Nb2RlUmVzUHRyIGRybV9yZXM7Citkcm1Nb2RlQ29ubmVj dG9yUHRyIGRybV9jb25uZWN0b3JzW01BWF9DT05ORUNUT1JTXTsKK2RybV9pbnRlbF9idWZtZ3Ig KmJ1Zm1ncjsKK2lndF9waXBlX2NyY190ICpwaXBlX2NyYzsKKworYm9vbCBoYXNfbWV0aG9kX2Jh c2VfY3JjID0gZmFsc2U7CitpZ3RfY3JjX3QgbWV0aG9kX2Jhc2VfY3JjOworCitzdHJ1Y3QgbW9k ZXNldF9wYXJhbXMgbXM7CisKK3N0YXRpYyB2b2lkIGZpbmRfbW9kZXNldF9wYXJhbXModm9pZCkK K3sKKwlpbnQgaTsKKwl1aW50MzJfdCBjb25uZWN0b3JfaWQgPSAwLCBjcnRjX2lkOworCWRybU1v ZGVNb2RlSW5mb1B0ciBtb2RlID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBkcm1fcmVzLT5j b3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJZHJtTW9kZUNvbm5lY3RvclB0ciBjID0gZHJtX2Nv bm5lY3RvcnNbaV07CisKKwkJaWYgKGMtPmNvdW50X21vZGVzKSB7CisJCQljb25uZWN0b3JfaWQg PSBjLT5jb25uZWN0b3JfaWQ7CisJCQltb2RlID0gJmMtPm1vZGVzWzBdOworCQkJYnJlYWs7CisJ CX0KKwl9CisJaWd0X3JlcXVpcmUoY29ubmVjdG9yX2lkKTsKKworCWNydGNfaWQgPSBkcm1fcmVz LT5jcnRjc1swXTsKKwlpZ3RfYXNzZXJ0KGNydGNfaWQpOworCWlndF9hc3NlcnQobW9kZSk7CisK Kwltcy5jb25uZWN0b3JfaWQgPSBjb25uZWN0b3JfaWQ7CisJbXMuY3J0Y19pZCA9IGNydGNfaWQ7 CisJbXMubW9kZSA9IG1vZGU7CisKK30KKworc3RhdGljIHZvaWQgZ2V0X21ldGhvZF9jcmMoZW51 bSBpZ3RfZHJhd19tZXRob2QgbWV0aG9kLCB1aW50NjRfdCB0aWxpbmcsCisJCQkgICBpZ3RfY3Jj X3QgKmNyYykKK3sKKwlzdHJ1Y3QgaWd0X2ZiIGZiOworCWludCByYzsKKworCWlndF9jcmVhdGVf ZmIoZHJtX2ZkLCBtcy5tb2RlLT5oZGlzcGxheSwgbXMubW9kZS0+dmRpc3BsYXksCisJCSAgICAg IERSTV9GT1JNQVRfWFJHQjg4ODgsIHRpbGluZywgJmZiKTsKKwlpZ3RfZHJhd19yZWN0X2ZiKGRy bV9mZCwgYnVmbWdyLCBOVUxMLCAmZmIsIG1ldGhvZCwKKwkJCSAwLCAwLCBmYi53aWR0aCwgZmIu aGVpZ2h0LCAweEZGKTsKKworCWlndF9kcmF3X3JlY3RfZmIoZHJtX2ZkLCBidWZtZ3IsIE5VTEws ICZmYiwgbWV0aG9kLAorCQkJIGZiLndpZHRoIC8gNCwgZmIuaGVpZ2h0IC8gNCwKKwkJCSBmYi53 aWR0aCAvIDIsIGZiLmhlaWdodCAvIDIsIDB4RkYwMCk7CisJaWd0X2RyYXdfcmVjdF9mYihkcm1f ZmQsIGJ1Zm1nciwgTlVMTCwgJmZiLCBtZXRob2QsCisJCQkgZmIud2lkdGggLyA4LCBmYi5oZWln aHQgLyA4LAorCQkJIGZiLndpZHRoIC8gNCwgZmIuaGVpZ2h0IC8gNCwgMHhGRjAwMDApOworCWln dF9kcmF3X3JlY3RfZmIoZHJtX2ZkLCBidWZtZ3IsIE5VTEwsICZmYiwgbWV0aG9kLAorCQkJIGZi LndpZHRoIC8gMiwgZmIuaGVpZ2h0IC8gMiwKKwkJCSBmYi53aWR0aCAvIDMsIGZiLmhlaWdodCAv IDMsIDB4RkYwMEZGKTsKKworCXJjID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBtcy5jcnRjX2lk LCBmYi5mYl9pZCwgMCwgMCwKKwkJCSAgICAmbXMuY29ubmVjdG9yX2lkLCAxLCBtcy5tb2RlKTsK KwlpZ3RfYXNzZXJ0KHJjID09IDApOworCisJaWd0X2RlYnVnX3dhaXRfZm9yX2tleXByZXNzKCJj cmMiKTsKKwlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMocGlwZV9jcmMsIGNyYyk7CisKKwlrbXN0 ZXN0X3Vuc2V0X2FsbF9jcnRjcyhkcm1fZmQsIGRybV9yZXMpOworCWlndF9yZW1vdmVfZmIoZHJt X2ZkLCAmZmIpOworfQorCitzdGF0aWMgdm9pZCBkcmF3X21ldGhvZF9zdWJ0ZXN0KGVudW0gaWd0 X2RyYXdfbWV0aG9kIG1ldGhvZCwgdWludDY0X3QgdGlsaW5nKQoreworCWlndF9jcmNfdCBjcmM7 CisKKwlrbXN0ZXN0X3Vuc2V0X2FsbF9jcnRjcyhkcm1fZmQsIGRybV9yZXMpOworCisJZmluZF9t b2Rlc2V0X3BhcmFtcygpOworCisJLyogVXNlIElHVF9EUkFXX01NQVBfR1RUIG9uIGFuIHVudGls ZWQgYnVmZmVyIGFzIHRoZSBwYXJhbWV0ZXIgZm9yCisJICogY29tcGFyaXNvbi4gQ2FjaGUgdGhl IHZhbHVlIHNvIHdlIGRvbid0IHJlY29tcHV0ZSBpdCBmb3IgZXZlcnkgc2luZ2xlCisJICogc3Vi dGVzdC4gKi8KKwlpZiAoIWhhc19tZXRob2RfYmFzZV9jcmMpIHsKKwkJZ2V0X21ldGhvZF9jcmMo SUdUX0RSQVdfTU1BUF9HVFQsIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkgICAgICAg Jm1ldGhvZF9iYXNlX2NyYyk7CisJCWhhc19tZXRob2RfYmFzZV9jcmMgPSB0cnVlOworCX0KKwor CWdldF9tZXRob2RfY3JjKG1ldGhvZCwgdGlsaW5nLCAmY3JjKTsKKwlpZ3RfYXNzZXJ0X2NyY19l cXVhbCgmY3JjLCAmbWV0aG9kX2Jhc2VfY3JjKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2ZpbGxf Y3JjKHVpbnQ2NF90IHRpbGluZywgaWd0X2NyY190ICpjcmMpCit7CisJc3RydWN0IGlndF9mYiBm YjsKKwlpbnQgcmM7CisKKwlpZ3RfY3JlYXRlX2ZiKGRybV9mZCwgbXMubW9kZS0+aGRpc3BsYXks IG1zLm1vZGUtPnZkaXNwbGF5LAorCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LCB0aWxpbmcs ICZmYik7CisKKwlpZ3RfZHJhd19maWxsX2ZiKGRybV9mZCwgJmZiLCAweEZGKTsKKworCXJjID0g ZHJtTW9kZVNldENydGMoZHJtX2ZkLCBtcy5jcnRjX2lkLCBmYi5mYl9pZCwgMCwgMCwKKwkJCSAg ICAmbXMuY29ubmVjdG9yX2lkLCAxLCBtcy5tb2RlKTsKKwlpZ3RfYXNzZXJ0KHJjID09IDApOwor CisJaWd0X2RlYnVnX3dhaXRfZm9yX2tleXByZXNzKCJjcmMiKTsKKwlpZ3RfcGlwZV9jcmNfY29s bGVjdF9jcmMocGlwZV9jcmMsIGNyYyk7CisKKwlrbXN0ZXN0X3Vuc2V0X2FsbF9jcnRjcyhkcm1f ZmQsIGRybV9yZXMpOworCWlndF9yZW1vdmVfZmIoZHJtX2ZkLCAmZmIpOworfQorCitzdGF0aWMg dm9pZCBmaWxsX2ZiX3N1YnRlc3Qodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGlndF9mYiBm YjsKKwlpZ3RfY3JjX3QgYmFzZV9jcmMsIGNyYzsKKworCWttc3Rlc3RfdW5zZXRfYWxsX2NydGNz KGRybV9mZCwgZHJtX3Jlcyk7CisKKwlmaW5kX21vZGVzZXRfcGFyYW1zKCk7CisKKwlpZ3RfY3Jl YXRlX2ZiKGRybV9mZCwgbXMubW9kZS0+aGRpc3BsYXksIG1zLm1vZGUtPnZkaXNwbGF5LAorCQkg ICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LCBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLCAmZmIp OworCisJaWd0X2RyYXdfcmVjdF9mYihkcm1fZmQsIGJ1Zm1nciwgTlVMTCwgJmZiLCBJR1RfRFJB V19NTUFQX0dUVCwKKwkJCSAwLCAwLCBmYi53aWR0aCwgZmIuaGVpZ2h0LCAweEZGKTsKKworCXJj ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBtcy5jcnRjX2lkLCBmYi5mYl9pZCwgMCwgMCwKKwkJ CSAgICAmbXMuY29ubmVjdG9yX2lkLCAxLCBtcy5tb2RlKTsKKwlpZ3RfYXNzZXJ0KHJjID09IDAp OworCisJaWd0X2RlYnVnX3dhaXRfZm9yX2tleXByZXNzKCJjcmMiKTsKKwlpZ3RfcGlwZV9jcmNf Y29sbGVjdF9jcmMocGlwZV9jcmMsICZiYXNlX2NyYyk7CisKKwlnZXRfZmlsbF9jcmMoTE9DQUxf RFJNX0ZPUk1BVF9NT0RfTk9ORSwgJmNyYyk7CisJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmNyYywg JmJhc2VfY3JjKTsKKworCWdldF9maWxsX2NyYyhMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxF RCwgJmNyYyk7CisJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmNyYywgJmJhc2VfY3JjKTsKKworCWtt c3Rlc3RfdW5zZXRfYWxsX2NydGNzKGRybV9mZCwgZHJtX3Jlcyk7CisJaWd0X3JlbW92ZV9mYihk cm1fZmQsICZmYik7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2Vudmlyb25tZW50KHZvaWQpCit7 CisJaW50IGk7CisKKwlkcm1fZmQgPSBkcm1fb3Blbl9hbnlfbWFzdGVyKCk7CisJaWd0X3JlcXVp cmUoZHJtX2ZkID49IDApOworCisJZHJtX3JlcyA9IGRybU1vZGVHZXRSZXNvdXJjZXMoZHJtX2Zk KTsKKwlpZ3RfYXNzZXJ0KGRybV9yZXMtPmNvdW50X2Nvbm5lY3RvcnMgPD0gTUFYX0NPTk5FQ1RP UlMpOworCisJZm9yIChpID0gMDsgaSA8IGRybV9yZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykK KwkJZHJtX2Nvbm5lY3RvcnNbaV0gPSBkcm1Nb2RlR2V0Q29ubmVjdG9yKGRybV9mZCwKKwkJCQkJ CQlkcm1fcmVzLT5jb25uZWN0b3JzW2ldKTsKKworCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21v ZGUoKTsKKworCWJ1Zm1nciA9IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2luaXQoZHJtX2ZkLCA0MDk2 KTsKKwlpZ3RfYXNzZXJ0KGJ1Zm1ncik7CisJZHJtX2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3Jl dXNlKGJ1Zm1ncik7CisKKwlwaXBlX2NyYyA9IGlndF9waXBlX2NyY19uZXcoMCwgSU5URUxfUElQ RV9DUkNfU09VUkNFX0FVVE8pOworfQorCitzdGF0aWMgdm9pZCB0ZWFyZG93bl9lbnZpcm9ubWVu dCh2b2lkKQoreworCWludCBpOworCisJaWd0X3BpcGVfY3JjX2ZyZWUocGlwZV9jcmMpOworCisJ ZHJtX2ludGVsX2J1Zm1ncl9kZXN0cm95KGJ1Zm1ncik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJt X3Jlcy0+Y291bnRfY29ubmVjdG9yczsgaSsrKQorCQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihkcm1f Y29ubmVjdG9yc1tpXSk7CisKKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhkcm1fcmVzKTsKKwljbG9z ZShkcm1fZmQpOworfQorCitpZ3RfbWFpbgoreworCWVudW0gaWd0X2RyYXdfbWV0aG9kIG1ldGhv ZDsKKworCWlndF9maXh0dXJlCisJCXNldHVwX2Vudmlyb25tZW50KCk7CisKKwlmb3IgKG1ldGhv ZCA9IDA7IG1ldGhvZCA8IElHVF9EUkFXX01FVEhPRF9DT1VOVDsgbWV0aG9kKyspIHsKKwkJaWd0 X3N1YnRlc3RfZigiZHJhdy1tZXRob2QtJXMtdW50aWxlZCIsCisJCQkgICAgICBpZ3RfZHJhd19n ZXRfbWV0aG9kX25hbWUobWV0aG9kKSkKKwkJCWRyYXdfbWV0aG9kX3N1YnRlc3QobWV0aG9kLCBM T0NBTF9EUk1fRk9STUFUX01PRF9OT05FKTsKKwkJaWd0X3N1YnRlc3RfZigiZHJhdy1tZXRob2Qt JXMtdGlsZWQiLAorCQkJICAgICAgaWd0X2RyYXdfZ2V0X21ldGhvZF9uYW1lKG1ldGhvZCkpCisJ CQlkcmF3X21ldGhvZF9zdWJ0ZXN0KG1ldGhvZCwKKwkJCQkJICAgIExPQ0FMX0k5MTVfRk9STUFU X01PRF9YX1RJTEVEKTsKKwl9CisKKwlpZ3Rfc3VidGVzdCgiZmlsbC1mYiIpCisJCWZpbGxfZmJf c3VidGVzdCgpOworCisJaWd0X2ZpeHR1cmUKKwkJdGVhcmRvd25fZW52aXJvbm1lbnQoKTsKK30K LS0gCjIuMS40CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcK aHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=