From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH 3/4] tests/gem_userptr_blits: Expanded userptr test cases Date: Mon, 3 Feb 2014 10:59:42 +0000 Message-ID: <1391425183-1980-4-git-send-email-tvrtko.ursulin@linux.intel.com> References: <1391425183-1980-1-git-send-email-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id 173B51057C7 for ; Mon, 3 Feb 2014 07:11:45 -0800 (PST) In-Reply-To: <1391425183-1980-1-git-send-email-tvrtko.ursulin@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org To: Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCkEgc2V0IG9m IHVzZXJwdHIgdGVzdCBjYXNlcyB0byBzdXBwb3J0IHRoZSBuZXcgZmVhdHVyZS4KCkZvciB0aGUg ZXZpY3Rpb24gYW5kIHN3YXBwaW5nIHN0cmVzcyB0ZXN0aW5nIEkgaGF2ZSBleHRyYWN0ZWQKc29t ZSBjb21tb24gYmVoYXZpb3VyIGZyb20gZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcgYW5kIG1hZGUgYm90 aAp0ZXN0IGNhc2VzIHVzZSBpdCB0byBhdm9pZCBkdXBsaWNhdGluZyB0aGUgY29kZS4KCkJvdGgg dW5zeW5jaHJvbml6ZWQgYW5kIHN5bmNocm9uaXplZCB1c2VycHRyIG9iamVjdHMgYXJlCnRlc3Rl ZCBidXQgdGhlIGxhdHRlciBzZXQgb2YgdGVzdHMgd2lsbCBiZSBza2lwcGVkIGlmIGtlcm5lbApp cyBjb21waWxlZCB3aXRob3V0IE1NVV9OT1RJRklFUlMuCgpBbHNvLCB3aXRoIDMyLWJpdCB1c2Vy c3BhY2Ugc3dhcHBpbmcgdGVzdHMgYXJlIHNraXBwZWQgaWYKdGhlIHN5c3RlbSBoYXMgYSBsb3Qg bW9yZSBSQU0gdGhhbiBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuCkZvcmtpbmcgc3dhcHBpbmcgdGVz dHMgYXJlIG5vdCBza2lwcGVkIHNpbmNlIHRoZXkgY2FuIHN0aWxsCnRyaWdnZXIgc3dhcHBpbmcg YnkgY3VtdWxhdGl2ZSBlZmZlY3QuCgpTaWduZWQtb2ZmLWJ5OiBUdnJ0a28gVXJzdWxpbiA8dHZy dGtvLnVyc3VsaW5AaW50ZWwuY29tPgotLS0KIHRlc3RzLy5naXRpZ25vcmUgICAgICAgICAgfCAg ICAxICsKIHRlc3RzL01ha2VmaWxlLnNvdXJjZXMgICAgfCAgICAxICsKIHRlc3RzL2dlbV91c2Vy cHRyX2JsaXRzLmMgfCAxMTg1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAxMTg3IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2Rl IDEwMDY0NCB0ZXN0cy9nZW1fdXNlcnB0cl9ibGl0cy5jCgpkaWZmIC0tZ2l0IGEvdGVzdHMvLmdp dGlnbm9yZSBiL3Rlc3RzLy5naXRpZ25vcmUKaW5kZXggNzM3NzI3NS4uNzdhYjM0ZSAxMDA2NDQK LS0tIGEvdGVzdHMvLmdpdGlnbm9yZQorKysgYi90ZXN0cy8uZ2l0aWdub3JlCkBAIC05Miw2ICs5 Miw3IEBAIGdlbV90aWxpbmdfbWF4X3N0cmlkZQogZ2VtX3VuZmVuY2VfYWN0aXZlX2J1ZmZlcnMK IGdlbV91bnJlZl9hY3RpdmVfYnVmZmVycwogZ2VtX3ZtYXBfYmxpdHMKK2dlbV91c2VycHRyX2Js aXRzCiBnZW1fd2FpdF9yZW5kZXJfdGltZW91dAogZ2VtX3dyaXRlX3JlYWRfcmluZ19zd2l0Y2gK IGdlbjNfbWl4ZWRfYmxpdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMgYi90 ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IGE4YzBjOTYuLjc2OTlhODQgMTAwNjQ0Ci0tLSBh L3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKKysrIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwpAQCAt MTE2LDYgKzExNiw3IEBAIFRFU1RTX3Byb2dzID0gXAogCWdlbV91bmZlbmNlX2FjdGl2ZV9idWZm ZXJzIFwKIAlnZW1fdW5yZWZfYWN0aXZlX2J1ZmZlcnMgXAogCWdlbV92bWFwX2JsaXRzIFwKKwln ZW1fdXNlcnB0cl9ibGl0cyBcCiAJZ2VtX3dhaXRfcmVuZGVyX3RpbWVvdXQgXAogCWdlbjNfbWl4 ZWRfYmxpdHMgXAogCWdlbjNfcmVuZGVyX2xpbmVhcl9ibGl0cyBcCmRpZmYgLS1naXQgYS90ZXN0 cy9nZW1fdXNlcnB0cl9ibGl0cy5jIGIvdGVzdHMvZ2VtX3VzZXJwdHJfYmxpdHMuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDcyYjY3Ci0tLSAvZGV2L251bGwKKysrIGIv dGVzdHMvZ2VtX3VzZXJwdHJfYmxpdHMuYwpAQCAtMCwwICsxLDExODUgQEAKKy8qCisgKiBDb3B5 cmlnaHQgwqkgMjAwOS0yMDE0IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBp cyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5n IGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9u IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRo b3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmln aHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3Vi bGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBw ZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRv IHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJv dmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5n IHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMg b3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUg U09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lO RCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBU SEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAq IFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlN LCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9G IENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9S IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFM SU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFu aG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICogICAgQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13 aWxzb24uY28udWs+CisgKiAgICBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwu Y29tPgorICoKKyAqLworCisvKiogQGZpbGUgZ2VtX3VzZXJwdHJfYmxpdHMuYworICoKKyAqIFRo aXMgaXMgYSB0ZXN0IG9mIGRvaW5nIG1hbnkgYmxpdHMgdXNpbmcgYSBtaXh0dXJlIG9mIG5vcm1h bCBzeXN0ZW0gcGFnZXMKKyAqIGFuZCB1bmNhY2hlZCBsaW5lYXIgYnVmZmVycywgd2l0aCBhIHdv cmtpbmcgc2V0IGxhcmdlciB0aGFuIHRoZQorICogYXBlcnR1cmUgc2l6ZS4KKyAqCisgKiBUaGUg Z29hbCBpcyB0byBzaW1wbHkgZW5zdXJlIHRoZSBiYXNpY3Mgd29yay4KKyAqLworCisjaW5jbHVk ZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNp bmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8u aD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVk ZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpOTE1X2RybS5oIgor I2luY2x1ZGUgImRybXRlc3QuaCIKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKyNpbmNsdWRl ICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgorI2luY2x1ZGUgImludGVsX2dwdV90b29scy5oIgorCisj aW5jbHVkZSAiZXZpY3Rpb25fY29tbW9uLmMiCisKKyNkZWZpbmUgV0lEVEggNTEyCisjZGVmaW5l IEhFSUdIVCA1MTIKKyNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKKworI2RlZmluZSBMT0NBTF9JOTE1 X0dFTV9VU0VSUFRSICAgICAgIDB4MzQKKyNkZWZpbmUgTE9DQUxfSU9DVExfSTkxNV9HRU1fVVNF UlBUUiBEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIExPQ0FMX0k5MTVfR0VNX1VTRVJQVFIs IHN0cnVjdCBsb2NhbF9pOTE1X2dlbV91c2VycHRyKQorc3RydWN0IGxvY2FsX2k5MTVfZ2VtX3Vz ZXJwdHIgeworCXVpbnQ2NF90IHVzZXJfcHRyOworCXVpbnQ2NF90IHVzZXJfc2l6ZTsKKwl1aW50 MzJfdCBmbGFnczsKKyNkZWZpbmUgSTkxNV9VU0VSUFRSX1JFQURfT05MWSAoMTw8MCkKKyNkZWZp bmUgSTkxNV9VU0VSUFRSX1VOU1lOQ0hST05JWkVEICgxPDwzMSkKKwl1aW50MzJfdCBoYW5kbGU7 Cit9OworCitzdGF0aWMgdWludDMyX3QgdXNlcnB0cl9mbGFnczsKKworc3RhdGljIHVpbnQzMl90 IGxpbmVhcltXSURUSCpIRUlHSFRdOworCitzdGF0aWMgdm9pZCBnZW1fdXNlcnB0cl90ZXN0X3Vu c3luY2hyb25pemVkKHZvaWQpCit7CisJdXNlcnB0cl9mbGFncyA9IEk5MTVfVVNFUlBUUl9VTlNZ TkNIUk9OSVpFRDsKK30KKworc3RhdGljIHZvaWQgZ2VtX3VzZXJwdHJfdGVzdF9zeW5jaHJvbml6 ZWQodm9pZCkKK3sKKwl1c2VycHRyX2ZsYWdzID0gMDsKK30KKworc3RhdGljIGludCBnZW1fdXNl cnB0cihpbnQgZmQsIHZvaWQgKnB0ciwgaW50IHNpemUsIGludCByZWFkX29ubHksIHVpbnQzMl90 ICpoYW5kbGUpCit7CisJc3RydWN0IGxvY2FsX2k5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKKwlp bnQgcmV0OworCisJdXNlcnB0ci51c2VyX3B0ciA9ICh1aW50cHRyX3QpcHRyOworCXVzZXJwdHIu dXNlcl9zaXplID0gc2l6ZTsKKwl1c2VycHRyLmZsYWdzID0gdXNlcnB0cl9mbGFnczsKKwlpZiAo cmVhZF9vbmx5KQorCQl1c2VycHRyLmZsYWdzIHw9IEk5MTVfVVNFUlBUUl9SRUFEX09OTFk7CisK KwlyZXQgPSBkcm1Jb2N0bChmZCwgTE9DQUxfSU9DVExfSTkxNV9HRU1fVVNFUlBUUiwgJnVzZXJw dHIpOworCWlmIChyZXQpCisJCXJldCA9IGVycm5vOworCWlndF9za2lwX29uX2YocmV0ID09IEVO T0RFViAmJgorCQkgICAgICAodXNlcnB0cl9mbGFncyAmIEk5MTVfVVNFUlBUUl9VTlNZTkNIUk9O SVpFRCkgPT0gMCwKKwkJICAgICAgIlNraXBwaW5nLCBzeW5jaHJvbml6ZWQgbWFwcGluZ3Mgd2l0 aCBubyBrZXJuZWwgQ09ORklHX01NVV9OT1RJRklFUj8iKTsKKwlpZiAocmV0ID09IDApCisJCSpo YW5kbGUgPSB1c2VycHRyLmhhbmRsZTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZv aWQgZ2VtX3VzZXJwdHJfc3luYyhpbnQgZmQsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlnZW1fc2V0 X2RvbWFpbihmZCwgaGFuZGxlLCBJOTE1X0dFTV9ET01BSU5fQ1BVLCBJOTE1X0dFTV9ET01BSU5f Q1BVKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHkoaW50IGZkLCB1aW50MzJfdCBkc3QsIHVpbnQz Ml90IHNyYywgdW5zaWduZWQgaW50IGVycm9yKQoreworCXVpbnQzMl90IGJhdGNoWzEwXTsKKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgcmVsb2NbMl07CisJc3RydWN0IGRy bV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqWzNdOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhl Y2J1ZmZlcjIgZXhlYzsKKwl1aW50MzJfdCBoYW5kbGU7CisJaW50IHJldDsKKworCWJhdGNoWzBd ID0gWFlfU1JDX0NPUFlfQkxUX0NNRCB8CisJCSAgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhB IHwKKwkJICBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfUkdCIHwgNjsKKwliYXRjaFsxXSA9ICgzIDw8 IDI0KSB8IC8qIDMyIGJpdHMgKi8KKwkJICAoMHhjYyA8PCAxNikgfCAvKiBjb3B5IFJPUCAqLwor CQkgIFdJRFRIKjQ7CisJYmF0Y2hbMl0gPSAwOyAvKiBkc3QgeDEseTEgKi8KKwliYXRjaFszXSA9 IChIRUlHSFQgPDwgMTYpIHwgV0lEVEg7IC8qIGRzdCB4Mix5MiAqLworCWJhdGNoWzRdID0gMDsg LyogZHN0IHJlbG9jICovCisJYmF0Y2hbNV0gPSAwOyAvKiBzcmMgeDEseTEgKi8KKwliYXRjaFs2 XSA9IFdJRFRIKjQ7CisJYmF0Y2hbN10gPSAwOyAvKiBzcmMgcmVsb2MgKi8KKwliYXRjaFs4XSA9 IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisJYmF0Y2hbOV0gPSBNSV9OT09QOworCisJaGFuZGxlID0g Z2VtX2NyZWF0ZShmZCwgNDA5Nik7CisJZ2VtX3dyaXRlKGZkLCBoYW5kbGUsIDAsIGJhdGNoLCBz aXplb2YoYmF0Y2gpKTsKKworCXJlbG9jWzBdLnRhcmdldF9oYW5kbGUgPSBkc3Q7CisJcmVsb2Nb MF0uZGVsdGEgPSAwOworCXJlbG9jWzBdLm9mZnNldCA9IDQgKiBzaXplb2YoYmF0Y2hbMF0pOwor CXJlbG9jWzBdLnByZXN1bWVkX29mZnNldCA9IDA7CisJcmVsb2NbMF0ucmVhZF9kb21haW5zID0g STkxNV9HRU1fRE9NQUlOX1JFTkRFUjs7CisJcmVsb2NbMF0ud3JpdGVfZG9tYWluID0gSTkxNV9H RU1fRE9NQUlOX1JFTkRFUjsKKworCXJlbG9jWzFdLnRhcmdldF9oYW5kbGUgPSBzcmM7CisJcmVs b2NbMV0uZGVsdGEgPSAwOworCXJlbG9jWzFdLm9mZnNldCA9IDcgKiBzaXplb2YoYmF0Y2hbMF0p OworCXJlbG9jWzFdLnByZXN1bWVkX29mZnNldCA9IDA7CisJcmVsb2NbMV0ucmVhZF9kb21haW5z ID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjs7CisJcmVsb2NbMV0ud3JpdGVfZG9tYWluID0gMDsK KworCW9ialswXS5oYW5kbGUgPSBkc3Q7CisJb2JqWzBdLnJlbG9jYXRpb25fY291bnQgPSAwOwor CW9ialswXS5yZWxvY3NfcHRyID0gMDsKKwlvYmpbMF0uYWxpZ25tZW50ID0gMDsKKwlvYmpbMF0u b2Zmc2V0ID0gMDsKKwlvYmpbMF0uZmxhZ3MgPSAwOworCW9ialswXS5yc3ZkMSA9IDA7CisJb2Jq WzBdLnJzdmQyID0gMDsKKworCW9ialsxXS5oYW5kbGUgPSBzcmM7CisJb2JqWzFdLnJlbG9jYXRp b25fY291bnQgPSAwOworCW9ialsxXS5yZWxvY3NfcHRyID0gMDsKKwlvYmpbMV0uYWxpZ25tZW50 ID0gMDsKKwlvYmpbMV0ub2Zmc2V0ID0gMDsKKwlvYmpbMV0uZmxhZ3MgPSAwOworCW9ialsxXS5y c3ZkMSA9IDA7CisJb2JqWzFdLnJzdmQyID0gMDsKKworCW9ialsyXS5oYW5kbGUgPSBoYW5kbGU7 CisJb2JqWzJdLnJlbG9jYXRpb25fY291bnQgPSAyOworCW9ialsyXS5yZWxvY3NfcHRyID0gKHVp bnRwdHJfdClyZWxvYzsKKwlvYmpbMl0uYWxpZ25tZW50ID0gMDsKKwlvYmpbMl0ub2Zmc2V0ID0g MDsKKwlvYmpbMl0uZmxhZ3MgPSAwOworCW9ialsyXS5yc3ZkMSA9IG9ialsyXS5yc3ZkMiA9IDA7 CisKKwlleGVjLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdClvYmo7CisJZXhlYy5idWZmZXJfY291 bnQgPSAzOworCWV4ZWMuYmF0Y2hfc3RhcnRfb2Zmc2V0ID0gMDsKKwlleGVjLmJhdGNoX2xlbiA9 IHNpemVvZihiYXRjaCk7CisJZXhlYy5EUjEgPSBleGVjLkRSNCA9IDA7CisJZXhlYy5udW1fY2xp cHJlY3RzID0gMDsKKwlleGVjLmNsaXByZWN0c19wdHIgPSAwOworCWV4ZWMuZmxhZ3MgPSBIQVNf QkxUX1JJTkcoaW50ZWxfZ2V0X2RybV9kZXZpZChmZCkpID8gSTkxNV9FWEVDX0JMVCA6IDA7CisJ ZXhlYy5yc3ZkMSA9IGV4ZWMucnN2ZDIgPSAwOworCisJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9J T0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgJmV4ZWMpOworCWlmIChyZXQpCisJCXJldCA9IGVy cm5vOworCisJaWYgKGVycm9yID09IH4wKQorCQlpZ3RfYXNzZXJ0KHJldCAhPSAwKTsKKwllbHNl CisJCWlndF9hc3NlcnQocmV0ID09IGVycm9yKTsKKworCWdlbV9jbG9zZShmZCwgaGFuZGxlKTsK K30KKworc3RhdGljIHZvaWQKK2JsaXQoaW50IGZkLCB1aW50MzJfdCBkc3QsIHVpbnQzMl90IHNy YywgdWludDMyX3QgKmFsbF9ibywgaW50IG5fYm8sIGludCBlcnJvcikKK3sKKwl1aW50MzJfdCBi YXRjaFsxMl07CisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IHJlbG9jWzJd OworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpvYmo7CisJc3RydWN0IGRybV9p OTE1X2dlbV9leGVjYnVmZmVyMiBleGVjOworCXVpbnQzMl90IGhhbmRsZTsKKwlpbnQgbiwgcmV0 LCBpPTA7CisKKwliYXRjaFtpKytdID0gKFhZX1NSQ19DT1BZX0JMVF9DTUQgfAorCQkgICAgWFlf U1JDX0NPUFlfQkxUX1dSSVRFX0FMUEhBIHwKKwkJICAgIFhZX1NSQ19DT1BZX0JMVF9XUklURV9S R0IgfCA2KTsKKwlpZiAoaW50ZWxfZ2VuKGludGVsX2dldF9kcm1fZGV2aWQoZmQpKSA+PSA4KQor CQliYXRjaFtpIC0gMV0gKz0gMjsKKwliYXRjaFtpKytdID0gKDMgPDwgMjQpIHwgLyogMzIgYml0 cyAqLworCQkgICgweGNjIDw8IDE2KSB8IC8qIGNvcHkgUk9QICovCisJCSAgV0lEVEgqNDsKKwli YXRjaFtpKytdID0gMDsgLyogZHN0IHgxLHkxICovCisJYmF0Y2hbaSsrXSA9IChIRUlHSFQgPDwg MTYpIHwgV0lEVEg7IC8qIGRzdCB4Mix5MiAqLworCWJhdGNoW2krK10gPSAwOyAvKiBkc3QgcmVs b2MgKi8KKwlpZiAoaW50ZWxfZ2VuKGludGVsX2dldF9kcm1fZGV2aWQoZmQpKSA+PSA4KQorCQli YXRjaFtpKytdID0gMDsgLyogRklYTUUgKi8KKwliYXRjaFtpKytdID0gMDsgLyogc3JjIHgxLHkx ICovCisJYmF0Y2hbaSsrXSA9IFdJRFRIKjQ7CisJYmF0Y2hbaSsrXSA9IDA7IC8qIHNyYyByZWxv YyAqLworCWlmIChpbnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChmZCkpID49IDgpCisJCWJh dGNoW2krK10gPSAwOyAvKiBGSVhNRSAqLworCWJhdGNoW2krK10gPSBNSV9CQVRDSF9CVUZGRVJf RU5EOworCWJhdGNoW2krK10gPSBNSV9OT09QOworCisJaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwg NDA5Nik7CisJZ2VtX3dyaXRlKGZkLCBoYW5kbGUsIDAsIGJhdGNoLCBzaXplb2YoYmF0Y2gpKTsK KworCXJlbG9jWzBdLnRhcmdldF9oYW5kbGUgPSBkc3Q7CisJcmVsb2NbMF0uZGVsdGEgPSAwOwor CXJlbG9jWzBdLm9mZnNldCA9IDQgKiBzaXplb2YoYmF0Y2hbMF0pOworCXJlbG9jWzBdLnByZXN1 bWVkX29mZnNldCA9IDA7CisJcmVsb2NbMF0ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlO X1JFTkRFUjsKKwlyZWxvY1swXS53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fUkVOREVS OworCisJcmVsb2NbMV0udGFyZ2V0X2hhbmRsZSA9IHNyYzsKKwlyZWxvY1sxXS5kZWx0YSA9IDA7 CisJcmVsb2NbMV0ub2Zmc2V0ID0gNyAqIHNpemVvZihiYXRjaFswXSk7CisJaWYgKGludGVsX2dl bihpbnRlbF9nZXRfZHJtX2RldmlkKGZkKSkgPj0gOCkKKwkJcmVsb2NbMV0ub2Zmc2V0ICs9IHNp emVvZihiYXRjaFswXSk7CisJcmVsb2NbMV0ucHJlc3VtZWRfb2Zmc2V0ID0gMDsKKwlyZWxvY1sx XS5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOworCXJlbG9jWzFdLndyaXRl X2RvbWFpbiA9IDA7CisKKwlvYmogPSBjYWxsb2Mobl9ibyArIDEsIHNpemVvZigqb2JqKSk7CisJ Zm9yIChuID0gMDsgbiA8IG5fYm87IG4rKykKKwkJb2JqW25dLmhhbmRsZSA9IGFsbF9ib1tuXTsK KwlvYmpbbl0uaGFuZGxlID0gaGFuZGxlOworCW9ialtuXS5yZWxvY2F0aW9uX2NvdW50ID0gMjsK KwlvYmpbbl0ucmVsb2NzX3B0ciA9ICh1aW50cHRyX3QpcmVsb2M7CisKKwlleGVjLmJ1ZmZlcnNf cHRyID0gKHVpbnRwdHJfdClvYmo7CisJZXhlYy5idWZmZXJfY291bnQgPSBuX2JvICsgMTsKKwll eGVjLmJhdGNoX3N0YXJ0X29mZnNldCA9IDA7CisJZXhlYy5iYXRjaF9sZW4gPSBpICogNDsKKwll eGVjLkRSMSA9IGV4ZWMuRFI0ID0gMDsKKwlleGVjLm51bV9jbGlwcmVjdHMgPSAwOworCWV4ZWMu Y2xpcHJlY3RzX3B0ciA9IDA7CisJZXhlYy5mbGFncyA9IEhBU19CTFRfUklORyhpbnRlbF9nZXRf ZHJtX2RldmlkKGZkKSkgPyBJOTE1X0VYRUNfQkxUIDogMDsKKwlpOTE1X2V4ZWNidWZmZXIyX3Nl dF9jb250ZXh0X2lkKGV4ZWMsIDApOworCWV4ZWMucnN2ZDIgPSAwOworCisJcmV0ID0gZHJtSW9j dGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgJmV4ZWMpOworCWlmIChyZXQp CisJCXJldCA9IGVycm5vOworCisJaWd0X2Fzc2VydChyZXQgPT0gZXJyb3IpOworCisJZ2VtX2Ns b3NlKGZkLCBoYW5kbGUpOworCWZyZWUob2JqKTsKK30KKworc3RhdGljIHVpbnQzMl90CitjcmVh dGVfdXNlcnB0cihpbnQgZmQsIHVpbnQzMl90IHZhbCwgdWludDMyX3QgKnB0cikKK3sKKwl1aW50 MzJfdCBoYW5kbGU7CisJaW50IGksIHJldDsKKworCXJldCA9IGdlbV91c2VycHRyKGZkLCBwdHIs IHNpemVvZihsaW5lYXIpLCAwLCAmaGFuZGxlKTsKKwlpZ3RfYXNzZXJ0KHJldCA9PSAwKTsKKwlp Z3RfYXNzZXJ0KGhhbmRsZSAhPSAwKTsKKworCS8qIEZpbGwgdGhlIEJPIHdpdGggZHdvcmRzIHN0 YXJ0aW5nIGF0IHZhbCAqLworCWZvciAoaSA9IDA7IGkgPCBXSURUSCpIRUlHSFQ7IGkrKykKKwkJ cHRyW2ldID0gdmFsKys7CisKKwlyZXR1cm4gaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCAqKmhh bmRsZV9wdHJfbWFwOworc3RhdGljIHVuc2lnbmVkIGludCBudW1faGFuZGxlX3B0cl9tYXA7CisK K3N0YXRpYyB2b2lkIGFkZF9oYW5kbGVfcHRyKHVpbnQzMl90IGhhbmRsZSwgdm9pZCAqcHRyKQor eworCWlmIChoYW5kbGUgPj0gbnVtX2hhbmRsZV9wdHJfbWFwKSB7CisJCWhhbmRsZV9wdHJfbWFw ID0gcmVhbGxvYyhoYW5kbGVfcHRyX21hcCwKKwkJCQkJIChoYW5kbGUgKyAxMDAwKSAqIHNpemVv Zih2b2lkKikpOworCQludW1faGFuZGxlX3B0cl9tYXAgPSBoYW5kbGUgKyAxMDAwOworCX0KKwor CWhhbmRsZV9wdHJfbWFwW2hhbmRsZV0gPSBwdHI7Cit9CisKK3N0YXRpYyB2b2lkICpnZXRfaGFu ZGxlX3B0cih1aW50MzJfdCBoYW5kbGUpCit7CisJcmV0dXJuIGhhbmRsZV9wdHJfbWFwW2hhbmRs ZV07Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaGFuZGxlX3B0cih1aW50MzJfdCBoYW5kbGUpCit7 CisJaWd0X2Fzc2VydChoYW5kbGUgPCBudW1faGFuZGxlX3B0cl9tYXApOworCWlndF9hc3NlcnQo aGFuZGxlX3B0cl9tYXBbaGFuZGxlXSk7CisKKwlmcmVlKGhhbmRsZV9wdHJfbWFwW2hhbmRsZV0p OworCWhhbmRsZV9wdHJfbWFwW2hhbmRsZV0gPSBOVUxMOworfQorCitzdGF0aWMgdWludDMyX3Qg Y3JlYXRlX3VzZXJwdHJfYm8oaW50IGZkLCBpbnQgc2l6ZSkKK3sKKwl2b2lkICpwdHI7CisJdWlu dDMyX3QgaGFuZGxlOworCWludCByZXQ7CisKKwlyZXQgPSBwb3NpeF9tZW1hbGlnbigmcHRyLCBQ QUdFX1NJWkUsIHNpemUpOworCWlndF9hc3NlcnQocmV0ID09IDApOworCisJcmV0ID0gZ2VtX3Vz ZXJwdHIoZmQsICh1aW50MzJfdCAqKXB0ciwgc2l6ZSwgMCwgJmhhbmRsZSk7CisJaWd0X2Fzc2Vy dChyZXQgPT0gMCk7CisJYWRkX2hhbmRsZV9wdHIoaGFuZGxlLCBwdHIpOworCisJcmV0dXJuIGhh bmRsZTsKK30KKworc3RhdGljIHZvaWQgY2xlYXIoaW50IGZkLCB1aW50MzJfdCBoYW5kbGUsIGlu dCBzaXplKQoreworCXZvaWQgKnB0ciA9IGdldF9oYW5kbGVfcHRyKGhhbmRsZSk7CisKKwlpZ3Rf YXNzZXJ0KHB0ciAhPSBOVUxMKTsKKworCW1lbXNldChwdHIsIDAsIHNpemUpOworfQorCitzdGF0 aWMgdm9pZCBmcmVlX3VzZXJwdHJfYm8oaW50IGZkLCB1aW50MzJfdCBoYW5kbGUpCit7CisJZ2Vt X2Nsb3NlKGZkLCBoYW5kbGUpOworCWZyZWVfaGFuZGxlX3B0cihoYW5kbGUpOworfQorCitzdGF0 aWMgdWludDMyX3QKK2NyZWF0ZV9ibyhpbnQgZmQsIHVpbnQzMl90IHZhbCkKK3sKKwl1aW50MzJf dCBoYW5kbGU7CisJaW50IGk7CisKKwloYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBzaXplb2YobGlu ZWFyKSk7CisKKwkvKiBGaWxsIHRoZSBCTyB3aXRoIGR3b3JkcyBzdGFydGluZyBhdCB2YWwgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgV0lEVEgqSEVJR0hUOyBpKyspCisJCWxpbmVhcltpXSA9IHZhbCsr OworCWdlbV93cml0ZShmZCwgaGFuZGxlLCAwLCBsaW5lYXIsIHNpemVvZihsaW5lYXIpKTsKKwor CXJldHVybiBoYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19jcHUodWludDMyX3QgKnB0 ciwgdWludDMyX3QgdmFsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFdJRFRIKkhF SUdIVDsgaSsrKSB7CisJCWlmIChwdHJbaV0gIT0gdmFsKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwg IkV4cGVjdGVkIDB4JTA4eCwgZm91bmQgMHglMDh4ICIKKwkJCQkiYXQgb2Zmc2V0IDB4JTA4eFxu IiwKKwkJCQl2YWwsIHB0cltpXSwgaSAqIDQpOworCQkJYWJvcnQoKTsKKwkJfQorCQl2YWwrKzsK Kwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19ncHUoaW50IGZkLCB1aW50MzJfdCBoYW5kbGUs IHVpbnQzMl90IHZhbCkKK3sKKwlnZW1fcmVhZChmZCwgaGFuZGxlLCAwLCBsaW5lYXIsIHNpemVv ZihsaW5lYXIpKTsKKwljaGVja19jcHUobGluZWFyLCB2YWwpOworfQorCitzdGF0aWMgaW50IGhh c191c2VycHRyKGludCBmZCkKK3sKKwl1aW50MzJfdCBoYW5kbGUgPSAwOworCXZvaWQgKnB0cjsK Kwl1aW50MzJfdCBvbGRmbGFnczsKKwlpbnQgcmV0OworCisJYXNzZXJ0KHBvc2l4X21lbWFsaWdu KCZwdHIsIFBBR0VfU0laRSwgUEFHRV9TSVpFKSA9PSAwKTsKKwlvbGRmbGFncyA9IHVzZXJwdHJf ZmxhZ3M7CisJZ2VtX3VzZXJwdHJfdGVzdF91bnN5bmNocm9uaXplZCgpOworCXJldCA9IGdlbV91 c2VycHRyKGZkLCBwdHIsIFBBR0VfU0laRSwgMCwgJmhhbmRsZSk7CisJdXNlcnB0cl9mbGFncyA9 IG9sZGZsYWdzOworCWlmIChyZXQgIT0gMCkgeworCQlmcmVlKHB0cik7CisJCXJldHVybiAwOwor CX0KKworCWdlbV9jbG9zZShmZCwgaGFuZGxlKTsKKwlmcmVlKHB0cik7CisKKwlyZXR1cm4gaGFu ZGxlICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9pbnB1dF9jaGVja2luZyhpbnQgZmQpCit7 CisJc3RydWN0IGxvY2FsX2k5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKKwlpbnQgcmV0OworCisJ LyogSW52YWxpZCBmbGFncy4gKi8KKwl1c2VycHRyLnVzZXJfcHRyID0gMDsKKwl1c2VycHRyLnVz ZXJfc2l6ZSA9IDA7CisJdXNlcnB0ci5mbGFncyA9IH4wOworCXJldCA9IGRybUlvY3RsKGZkLCBM T0NBTF9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSLCAmdXNlcnB0cik7CisJaWd0X2Fzc2VydChyZXQg IT0gMCk7CisKKwkvKiBUb28gYmlnLiAqLworCXVzZXJwdHIudXNlcl9wdHIgPSAwOworCXVzZXJw dHIudXNlcl9zaXplID0gfjA7CisJdXNlcnB0ci5mbGFncyA9IDA7CisJcmV0ID0gZHJtSW9jdGwo ZmQsIExPQ0FMX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIsICZ1c2VycHRyKTsKKwlpZ3RfYXNzZXJ0 KHJldCAhPSAwKTsKKworCS8qIEJvdGggd3JvbmcuICovCisJdXNlcnB0ci51c2VyX3B0ciA9IDA7 CisJdXNlcnB0ci51c2VyX3NpemUgPSB+MDsKKwl1c2VycHRyLmZsYWdzID0gfjA7CisJcmV0ID0g ZHJtSW9jdGwoZmQsIExPQ0FMX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIsICZ1c2VycHRyKTsKKwlp Z3RfYXNzZXJ0KHJldCAhPSAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3Rf YWNjZXNzX2NvbnRyb2woaW50IGZkKQoreworCWlndF9mb3JrKGNoaWxkLCAxKSB7CisJCXZvaWQg KnB0cjsKKwkJaW50IHJldDsKKwkJdWludDMyX3QgaGFuZGxlOworCisJCWlndF9kcm9wX3Jvb3Qo KTsKKworCQkvKiBDQVBfU1lTX0FETUlOIGlzIG5lZWRlZCBmb3IgVU5TWU5DSFJPTklaRUQgbWFw cGluZ3MuICovCisJCWdlbV91c2VycHRyX3Rlc3RfdW5zeW5jaHJvbml6ZWQoKTsKKworCQlpZ3Rf YXNzZXJ0KHBvc2l4X21lbWFsaWduKCZwdHIsIFBBR0VfU0laRSwgUEFHRV9TSVpFKSA9PSAwKTsK KworCQlyZXQgPSBnZW1fdXNlcnB0cihmZCwgcHRyLCBQQUdFX1NJWkUsIDAsICZoYW5kbGUpOwor CQlpZiAocmV0ID09IDApCisJCQlnZW1fY2xvc2UoZmQsIGhhbmRsZSk7CisJCWZyZWUocHRyKTsK KwkJaWd0X2Fzc2VydChyZXQgPT0gRVBFUk0pOworCX0KKworCWlndF93YWl0Y2hpbGRyZW4oKTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfaW52YWxpZF9tYXBwaW5nKGludCBm ZCkKK3sKKwlpbnQgcmV0OworCXVpbnQzMl90IGhhbmRsZSwgaGFuZGxlMjsKKwl2b2lkICpwdHI7 CisKKwkvKiBOVUxMIHBvaW50ZXIuICovCisJcmV0ID0gZ2VtX3VzZXJwdHIoZmQsIE5VTEwsIFBB R0VfU0laRSwgMCwgJmhhbmRsZSk7CisJaWd0X2Fzc2VydChyZXQgPT0gMCk7CisJY29weShmZCwg aGFuZGxlLCBoYW5kbGUsIH4wKTsgLyogUVFRIFByZWNpc2UgZXJybm8/ICovCisJZ2VtX2Nsb3Nl KGZkLCBoYW5kbGUpOworCisJLyogR1RUIG1hcHBpbmcgKi8KKwloYW5kbGUgPSBjcmVhdGVfYm8o ZmQsIDApOworCXB0ciA9IGdlbV9tbWFwX19ndHQoZmQsIGhhbmRsZSwgc2l6ZW9mKGxpbmVhciks IFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOworCWlmIChwdHIgPT0gTlVMTCkKKwkJZ2VtX2Nsb3Nl KGZkLCBoYW5kbGUpOworCWFzc2VydChwdHIgIT0gTlVMTCk7CisJYXNzZXJ0KCgodW5zaWduZWQg bG9uZylwdHIgJiAoUEFHRV9TSVpFIC0gMSkpID09IDApOworCWFzc2VydCgoc2l6ZW9mKGxpbmVh cikgJiAoUEFHRV9TSVpFIC0gMSkpID09IDApOworCXJldCA9IGdlbV91c2VycHRyKGZkLCBwdHIs IHNpemVvZihsaW5lYXIpLCAwLCAmaGFuZGxlMik7CisJaWd0X2Fzc2VydChyZXQgPT0gMCk7CisJ Y29weShmZCwgaGFuZGxlLCBoYW5kbGUsIH4wKTsgLyogUVFRIFByZWNpc2UgZXJybm8/ICovCisJ Z2VtX2Nsb3NlKGZkLCBoYW5kbGUyKTsKKwltdW5tYXAocHRyLCBzaXplb2YobGluZWFyKSk7CisJ Z2VtX2Nsb3NlKGZkLCBoYW5kbGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVz dF9mb3JiaWRkZW5fb3BzKGludCBmZCkKK3sKKwl2b2lkICpwdHI7CisJaW50IHJldDsKKwl1aW50 MzJfdCBoYW5kbGU7CisJY2hhciBidWZbUEFHRV9TSVpFXTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X3ByZWFkIGdlbV9wcmVhZDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSBnZW1fcHdyaXRl OworCisJYXNzZXJ0KHBvc2l4X21lbWFsaWduKCZwdHIsIFBBR0VfU0laRSwgUEFHRV9TSVpFKSA9 PSAwKTsKKworCXJldCA9IGdlbV91c2VycHRyKGZkLCBwdHIsIFBBR0VfU0laRSwgMCwgJmhhbmRs ZSk7CisJaWd0X2Fzc2VydChyZXQgPT0gMCk7CisKKwlnZW1fcHJlYWQuaGFuZGxlID0gaGFuZGxl OworCWdlbV9wcmVhZC5vZmZzZXQgPSAwOworCWdlbV9wcmVhZC5zaXplID0gUEFHRV9TSVpFOwor CWdlbV9wcmVhZC5kYXRhX3B0ciA9ICh1aW50cHRyX3QpYnVmOworCXJldCA9IGRybUlvY3RsKGZk LCBEUk1fSU9DVExfSTkxNV9HRU1fUFJFQUQsICZnZW1fcHJlYWQpOworCWlmIChyZXQgPT0gMCkg eworCQlnZW1fY2xvc2UoZmQsIGhhbmRsZSk7CisJCWZyZWUocHRyKTsKKwl9CisJaWd0X2Fzc2Vy dChyZXQgIT0gMCk7CisKKwlnZW1fcHdyaXRlLmhhbmRsZSA9IGhhbmRsZTsKKwlnZW1fcHdyaXRl Lm9mZnNldCA9IDA7CisJZ2VtX3B3cml0ZS5zaXplID0gUEFHRV9TSVpFOworCWdlbV9wd3JpdGUu ZGF0YV9wdHIgPSAodWludHB0cl90KWJ1ZjsKKwlyZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RM X0k5MTVfR0VNX1BXUklURSwgJmdlbV9wd3JpdGUpOworCWlmIChyZXQgPT0gMCkgeworCQlnZW1f Y2xvc2UoZmQsIGhhbmRsZSk7CisJCWZyZWUocHRyKTsKKwl9CisJaWd0X2Fzc2VydChyZXQgIT0g MCk7CisKKwlnZW1fY2xvc2UoZmQsIGhhbmRsZSk7CisJZnJlZShwdHIpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBjaGFyIGNvdW50ZXI7CisKK3N0YXRpYyB2b2lkCitjaGVja19ibyhpbnQg ZmQxLCB1aW50MzJfdCBoYW5kbGUxLCBpbnQgaXNfdXNlcnB0ciwgaW50IGZkMiwgdWludDMyX3Qg aGFuZGxlMikKK3sKKwljaGFyICpwdHIxLCAqcHRyMjsKKwlpbnQgaTsKKworCWlmIChpc191c2Vy cHRyKQorCQlwdHIxID0gZ2V0X2hhbmRsZV9wdHIoaGFuZGxlMSk7CisJZWxzZQorCQlwdHIxID0g Z2VtX21tYXBfX2NwdShmZDEsIGhhbmRsZTEsIHNpemVvZihsaW5lYXIpLCBQUk9UX1JFQUQgfCBQ Uk9UX1dSSVRFKTsKKworCXB0cjIgPSBnZW1fbW1hcChmZDIsIGhhbmRsZTIsIHNpemVvZihsaW5l YXIpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKKworCWlndF9hc3NlcnQocHRyMSk7CisKKwkv KiBjaGVjayB3aGV0aGVyIGl0J3Mgc3RpbGwgb3VyIG9sZCBvYmplY3QgZmlyc3QuICovCisJZm9y IChpID0gMDsgaSA8IHNpemVvZihsaW5lYXIpOyBpKyspIHsKKwkJaWd0X2Fzc2VydChwdHIxW2ld ID09IGNvdW50ZXIpOworCQlpZ3RfYXNzZXJ0KHB0cjJbaV0gPT0gY291bnRlcik7CisJfQorCisJ Y291bnRlcisrOworCisJbWVtc2V0KHB0cjEsIGNvdW50ZXIsIHNpemVvZihsaW5lYXIpKTsKKwlp Z3RfYXNzZXJ0KG1lbWNtcChwdHIxLCBwdHIyLCBzaXplb2YobGluZWFyKSkgPT0gMCk7CisKKwlp ZiAoIWlzX3VzZXJwdHIpCisJCW11bm1hcChwdHIxLCBzaXplb2YobGluZWFyKSk7CisJbXVubWFw KHB0cjIsIHNpemVvZihsaW5lYXIpKTsKK30KKworc3RhdGljIGludCBleHBvcnRfaGFuZGxlKGlu dCBmZCwgdWludDMyX3QgaGFuZGxlLCBpbnQgKm91dGZkKQoreworCXN0cnVjdCBkcm1fcHJpbWVf aGFuZGxlIGFyZ3M7CisJaW50IHJldDsKKworCWFyZ3MuaGFuZGxlID0gaGFuZGxlOworCWFyZ3Mu ZmxhZ3MgPSBEUk1fQ0xPRVhFQzsKKwlhcmdzLmZkID0gLTE7CisKKwlyZXQgPSBkcm1Jb2N0bChm ZCwgRFJNX0lPQ1RMX1BSSU1FX0hBTkRMRV9UT19GRCwgJmFyZ3MpOworCSpvdXRmZCA9IGFyZ3Mu ZmQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlc3RfZG1hYnVmKHZvaWQpCit7 CisJaW50IGZkMSwgZmQyOworCXVpbnQzMl90IGhhbmRsZSwgaGFuZGxlX2ltcG9ydDEsIGhhbmRs ZV9pbXBvcnQyLCBoYW5kbGVfc2VsZmltcG9ydDsKKwlpbnQgZG1hX2J1Zl9mZCA9IC0xOworCWlu dCByZXQ7CisKKwlmZDEgPSBkcm1fb3Blbl9hbnkoKTsKKwlmZDIgPSBkcm1fb3Blbl9hbnkoKTsK KworCWhhbmRsZSA9IGNyZWF0ZV91c2VycHRyX2JvKGZkMSwgc2l6ZW9mKGxpbmVhcikpOworCisJ cmV0ID0gZXhwb3J0X2hhbmRsZShmZDEsIGhhbmRsZSwgJmRtYV9idWZfZmQpOworCWlmICh1c2Vy cHRyX2ZsYWdzICYgSTkxNV9VU0VSUFRSX1VOU1lOQ0hST05JWkVEKSB7CisJCWlndF9hc3NlcnQo cmV0ID09IEVJTlZBTCk7CisJCWZyZWVfdXNlcnB0cl9ibyhmZDEsIGhhbmRsZSk7CisKKwkJcmV0 dXJuIDA7CisJfSBlbHNlIHsKKwkJaWd0X2Fzc2VydChyZXQgPT0gMCk7CisJCWlndF9hc3NlcnQo ZG1hX2J1Zl9mZCA+PSAwKTsKKwl9CisJaGFuZGxlX2ltcG9ydDEgPSBwcmltZV9mZF90b19oYW5k bGUoZmQyLCBkbWFfYnVmX2ZkKTsKKworCWNoZWNrX2JvKGZkMSwgaGFuZGxlLCAxLCBmZDIsIGhh bmRsZV9pbXBvcnQxKTsKKworCS8qIHJlaW1wb3J0IHNob3VsZCBnaXZlIHVzIHRoZSBzYW1lIGhh bmRsZSBzbyB0aGF0IHVzZXJzcGFjZSBjYW4gY2hlY2sKKwkgKiB3aGV0aGVyIGl0IGhhcyB0aGF0 IGJvIGFscmVhZHkgc29tZXdoZXJlLiAqLworCWhhbmRsZV9pbXBvcnQyID0gcHJpbWVfZmRfdG9f aGFuZGxlKGZkMiwgZG1hX2J1Zl9mZCk7CisJaWd0X2Fzc2VydChoYW5kbGVfaW1wb3J0MSA9PSBo YW5kbGVfaW1wb3J0Mik7CisKKwkvKiBTYW1lIGZvciByZS1pbXBvcnRpbmcgb24gdGhlIGV4cG9y dGluZyBmZC4gKi8KKwloYW5kbGVfc2VsZmltcG9ydCA9IHByaW1lX2ZkX3RvX2hhbmRsZShmZDEs IGRtYV9idWZfZmQpOworCWlndF9hc3NlcnQoaGFuZGxlID09IGhhbmRsZV9zZWxmaW1wb3J0KTsK KworCS8qIGNsb3NlIGRtYV9idWYsIGNoZWNrIHdoZXRoZXIgbm90aGluZyBkaXNhcHBlYXJzLiAq LworCWNsb3NlKGRtYV9idWZfZmQpOworCWNoZWNrX2JvKGZkMSwgaGFuZGxlLCAxLCBmZDIsIGhh bmRsZV9pbXBvcnQxKTsKKworCWZyZWVfdXNlcnB0cl9ibyhmZDEsIGhhbmRsZSk7CisJY2hlY2tf Ym8oZmQyLCBoYW5kbGVfaW1wb3J0MSwgMCwgZmQyLCBoYW5kbGVfaW1wb3J0MSk7CisKKwkvKiBy ZS1pbXBvcnQgaW50byBvbGQgZXhwb3J0ZXIgKi8KKwlkbWFfYnVmX2ZkID0gcHJpbWVfaGFuZGxl X3RvX2ZkKGZkMiwgaGFuZGxlX2ltcG9ydDEpOworCS8qIGJ1dCBkcm9wIGFsbCByZWZlcmVuY2Vz IHRvIHRoZSBvYmogaW4gYmV0d2VlbiAqLworCWdlbV9jbG9zZShmZDIsIGhhbmRsZV9pbXBvcnQx KTsKKwloYW5kbGUgPSBwcmltZV9mZF90b19oYW5kbGUoZmQxLCBkbWFfYnVmX2ZkKTsKKwloYW5k bGVfaW1wb3J0MSA9IHByaW1lX2ZkX3RvX2hhbmRsZShmZDIsIGRtYV9idWZfZmQpOworCWNoZWNr X2JvKGZkMSwgaGFuZGxlLCAwLCBmZDIsIGhhbmRsZV9pbXBvcnQxKTsKKworCS8qIENvbXBsZXRl bHkgcmlwIG91dCBleHBvcnRpbmcgZmQuICovCisJY2xvc2UoZmQxKTsKKwljaGVja19ibyhmZDIs IGhhbmRsZV9pbXBvcnQxLCAwLCBmZDIsIGhhbmRsZV9pbXBvcnQxKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IHRlc3RfdXNhZ2VfcmVzdHJpY3Rpb25zKGludCBmZCkKK3sKKwl2b2lk ICpwdHI7CisJaW50IHJldDsKKwl1aW50MzJfdCBoYW5kbGU7CisKKwlhc3NlcnQocG9zaXhfbWVt YWxpZ24oJnB0ciwgUEFHRV9TSVpFLCBQQUdFX1NJWkUgKiAyKSA9PSAwKTsKKworCS8qIEFkZHJl c3Mgbm90IGFsaWduZWQuICovCisJcmV0ID0gZ2VtX3VzZXJwdHIoZmQsIChjaGFyICopcHRyICsg MSwgUEFHRV9TSVpFLCAwLCAmaGFuZGxlKTsKKwlpZ3RfYXNzZXJ0KHJldCAhPSAwKTsKKworCS8q IFNpemUgbm90IHJvdW5kZWQgdG8gcGFnZSBzaXplLiAqLworCXJldCA9IGdlbV91c2VycHRyKGZk LCBwdHIsIFBBR0VfU0laRSAtIDEsIDAsICZoYW5kbGUpOworCWlndF9hc3NlcnQocmV0ICE9IDAp OworCisJLyogQm90aCB3cm9uZy4gKi8KKwlyZXQgPSBnZW1fdXNlcnB0cihmZCwgKGNoYXIgKilw dHIgKyAxLCBQQUdFX1NJWkUgLSAxLCAwLCAmaGFuZGxlKTsKKwlpZ3RfYXNzZXJ0KHJldCAhPSAw KTsKKworCWZyZWUocHRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfY3Jl YXRlX2Rlc3Ryb3koaW50IGZkKQoreworCXZvaWQgKnB0cjsKKwlpbnQgcmV0OworCXVpbnQzMl90 IGhhbmRsZTsKKworCWlndF9hc3NlcnQocG9zaXhfbWVtYWxpZ24oJnB0ciwgUEFHRV9TSVpFLCBQ QUdFX1NJWkUpID09IDApOworCisJcmV0ID0gZ2VtX3VzZXJwdHIoZmQsIHB0ciwgUEFHRV9TSVpF LCAwLCAmaGFuZGxlKTsKKwlpZ3RfYXNzZXJ0KHJldCA9PSAwKTsKKworCWdlbV9jbG9zZShmZCwg aGFuZGxlKTsKKwlmcmVlKHB0cik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0 X2NvaGVyZW5jeShpbnQgZmQsIGludCBjb3VudCkKK3sKKwl1aW50MzJfdCAqbWVtb3J5OworCXVp bnQzMl90ICpjcHUsICpjcHVfdmFsOworCXVpbnQzMl90ICpncHUsICpncHVfdmFsOworCXVpbnQz Ml90IHN0YXJ0ID0gMDsKKwlpbnQgaSwgcmV0OworCisJcHJpbnRmKCJVc2luZyAyeCVkIDFNaUIg YnVmZmVyc1xuIiwgY291bnQpOworCisJcmV0ID0gcG9zaXhfbWVtYWxpZ24oKHZvaWQgKiopJm1l bW9yeSwgUEFHRV9TSVpFLCBjb3VudCpzaXplb2YobGluZWFyKSk7CisJaWYgKHJldCAhPSAwIHx8 IG1lbW9yeSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRl ICVsbGQgYnl0ZXNcbiIsCisJCQkobG9uZyBsb25nKWNvdW50KnNpemVvZihsaW5lYXIpKTsKKwkJ cmV0dXJuIDE7CisJfQorCisJZ3B1ID0gbWFsbG9jKHNpemVvZih1aW50MzJfdCkqY291bnQqNCk7 CisJZ3B1X3ZhbCA9IGdwdSArIGNvdW50OworCWNwdSA9IGdwdV92YWwgKyBjb3VudDsKKwljcHVf dmFsID0gY3B1ICsgY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQln cHVbaV0gPSBjcmVhdGVfYm8oZmQsIHN0YXJ0KTsKKwkJZ3B1X3ZhbFtpXSA9IHN0YXJ0OworCQlz dGFydCArPSBXSURUSCpIRUlHSFQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKysp IHsKKwkJY3B1W2ldID0gY3JlYXRlX3VzZXJwdHIoZmQsIHN0YXJ0LCBtZW1vcnkraSpXSURUSCpI RUlHSFQpOworCQljcHVfdmFsW2ldID0gc3RhcnQ7CisJCXN0YXJ0ICs9IFdJRFRIKkhFSUdIVDsK Kwl9CisKKwlwcmludGYoIlZlcmlmeWluZyBpbml0aWFsaXNhdGlvbi4uLlxuIik7CisJZm9yIChp ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJY2hlY2tfZ3B1KGZkLCBncHVbaV0sIGdwdV92YWxb aV0pOworCQljaGVja19jcHUobWVtb3J5K2kqV0lEVEgqSEVJR0hULCBjcHVfdmFsW2ldKTsKKwl9 CisKKwlwcmludGYoIkN5Y2xpYyBibGl0cyBjcHUtPmdwdSwgZm9yd2FyZC4uLlxuIik7CisJZm9y IChpID0gMDsgaSA8IGNvdW50ICogNDsgaSsrKSB7CisJCWludCBzcmMgPSBpICUgY291bnQ7CisJ CWludCBkc3QgPSAoaSArIDEpICUgY291bnQ7CisKKwkJY29weShmZCwgZ3B1W2RzdF0sIGNwdVtz cmNdLCAwKTsKKwkJZ3B1X3ZhbFtkc3RdID0gY3B1X3ZhbFtzcmNdOworCX0KKwlmb3IgKGkgPSAw OyBpIDwgY291bnQ7IGkrKykKKwkJY2hlY2tfZ3B1KGZkLCBncHVbaV0sIGdwdV92YWxbaV0pOwor CisJcHJpbnRmKCJDeWNsaWMgYmxpdHMgZ3B1LT5jcHUsIGJhY2t3YXJkLi4uXG4iKTsKKwlmb3Ig KGkgPSAwOyBpIDwgY291bnQgKiA0OyBpKyspIHsKKwkJaW50IHNyYyA9IChpICsgMSkgJSBjb3Vu dDsKKwkJaW50IGRzdCA9IGkgJSBjb3VudDsKKworCQljb3B5KGZkLCBjcHVbZHN0XSwgZ3B1W3Ny Y10sIDApOworCQljcHVfdmFsW2RzdF0gPSBncHVfdmFsW3NyY107CisJfQorCWZvciAoaSA9IDA7 IGkgPCBjb3VudDsgaSsrKSB7CisJCWdlbV91c2VycHRyX3N5bmMoZmQsIGNwdVtpXSk7CisJCWNo ZWNrX2NwdShtZW1vcnkraSpXSURUSCpIRUlHSFQsIGNwdV92YWxbaV0pOworCX0KKworCXByaW50 ZigiUmFuZG9tIGJsaXRzLi4uXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQgKiA0OyBpKysp IHsKKwkJaW50IHNyYyA9IHJhbmRvbSgpICUgY291bnQ7CisJCWludCBkc3QgPSByYW5kb20oKSAl IGNvdW50OworCisJCWlmIChyYW5kb20oKSAmIDEpIHsKKwkJCWNvcHkoZmQsIGdwdVtkc3RdLCBj cHVbc3JjXSwgMCk7CisJCQlncHVfdmFsW2RzdF0gPSBjcHVfdmFsW3NyY107CisJCX0gZWxzZSB7 CisJCQljb3B5KGZkLCBjcHVbZHN0XSwgZ3B1W3NyY10sIDApOworCQkJY3B1X3ZhbFtkc3RdID0g Z3B1X3ZhbFtzcmNdOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJ CWNoZWNrX2dwdShmZCwgZ3B1W2ldLCBncHVfdmFsW2ldKTsKKwkJZ2VtX2Nsb3NlKGZkLCBncHVb aV0pOworCisJCWdlbV91c2VycHRyX3N5bmMoZmQsIGNwdVtpXSk7CisJCWNoZWNrX2NwdShtZW1v cnkraSpXSURUSCpIRUlHSFQsIGNwdV92YWxbaV0pOworCQlnZW1fY2xvc2UoZmQsIGNwdVtpXSk7 CisJfQorCisJZnJlZShncHUpOworCWZyZWUobWVtb3J5KTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgc3RydWN0IGlndF9ldmljdGlvbl90ZXN0X29wcyBmYXVsdF9vcHMgPSB7CisJLmNyZWF0 ZSA9IGNyZWF0ZV91c2VycHRyX2JvLAorCS5jbG9zZSA9IGZyZWVfdXNlcnB0cl9ibywKKwkuY29w eSA9IGJsaXQsCisJLmNsZWFyID0gY2xlYXIsCit9OworCitzdGF0aWMgaW50IGNhbl9zd2FwKHZv aWQpCit7CisJdW5zaWduZWQgbG9uZyBhcywgcmFtOworCisJLyogQ2Fubm90IHN3YXAgaWYgbm90 IGVub3VnaCBhZGRyZXNzIHNwYWNlICovCisKKwkvKiBGSVhNRTogSW1wcm92ZSBjaGVjayBjcml0 ZXJpYS4gKi8KKwlpZiAoc2l6ZW9mKHZvaWQqKSA8IDgpCisJCWFzID0gMyAqIDEwMjQ7CisJZWxz ZQorCQlhcyA9IDI1NiAqIDEwMjQ7IC8qIEp1c3QgYSBiaWcgbnVtYmVyICovCisKKwlyYW0gPSBp bnRlbF9nZXRfdG90YWxfcmFtX21iKCk7CisKKwlpZiAoKGFzIC0gMTI4KSA8IChyYW0gLSAyNTYp KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisjZGVmaW5lIG1pbihhLCBiKSAoKGEp IDwgKGIpID8gKGEpIDogKGIpKQorCitzdGF0aWMgdm9pZCB0ZXN0X2ZvcmtpbmdfZXZpY3Rpb25z KGludCBmZCwgaW50IHNpemUsIGludCBjb3VudCwKKwkJCSAgICAgdW5zaWduZWQgZmxhZ3MpCit7 CisJaW50IHRyYXNoX2NvdW50OworCWludCBudW1fdGhyZWFkczsKKworCXRyYXNoX2NvdW50ID0g aW50ZWxfZ2V0X3RvdGFsX3JhbV9tYigpICogMTEgLyAxMDsKKwkvKiBVc2UgdGhlIGZhY3QgdGVz dCB3aWxsIHNwYXduIGEgbnVtYmVyIG9mIGNoaWxkCisJICogcHJvY2Vzc2VzIG1lYW5pbmcgc3dh cHBpbmcgd2lsbCBiZSB0cmlnZ2VyZWQgc3lzdGVtCisJICogd2lkZSBldmVuIGlmIG9uZSBwcm9j ZXNzIG9uIGl0J3Mgb3duIGNhbid0IGRvIGl0LgorCSAqLworCW51bV90aHJlYWRzID0gbWluKHN5 c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pICogNCwgMTIpOworCXRyYXNoX2NvdW50IC89IG51 bV90aHJlYWRzOworCWlmIChjb3VudCA+IHRyYXNoX2NvdW50KQorCQljb3VudCA9IHRyYXNoX2Nv dW50OworCisJZm9ya2luZ19ldmljdGlvbnMoZmQsICZmYXVsdF9vcHMsIHNpemUsIGNvdW50LCB0 cmFzaF9jb3VudCwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3N3YXBwaW5nX2V2aWN0 aW9ucyhpbnQgZmQsIGludCBzaXplLCBpbnQgY291bnQpCit7CisJaW50IHRyYXNoX2NvdW50Owor CisJaWd0X3NraXBfb25fZighY2FuX3N3YXAoKSwKKwkJIk5vdCBlbm91Z2ggcHJvY2VzcyBhZGRy ZXNzIHNwYWNlIGZvciBzd2FwcGluZyB0ZXN0cy5cbiIpOworCisJdHJhc2hfY291bnQgPSBpbnRl bF9nZXRfdG90YWxfcmFtX21iKCkgKiAxMSAvIDEwOworCisJc3dhcHBpbmdfZXZpY3Rpb25zKGZk LCAmZmF1bHRfb3BzLCBzaXplLCBjb3VudCwgdHJhc2hfY291bnQpOworfQorCitzdGF0aWMgdm9p ZCB0ZXN0X21pbm9yX2V2aWN0aW9ucyhpbnQgZmQsIGludCBzaXplLCBpbnQgY291bnQpCit7CisJ bWlub3JfZXZpY3Rpb25zKGZkLCAmZmF1bHRfb3BzLCBzaXplLCBjb3VudCk7Cit9CisKK3N0YXRp YyB2b2lkIHRlc3RfbWFqb3JfZXZpY3Rpb25zKGludCBmZCwgaW50IHNpemUsIGludCBjb3VudCkK K3sKKwltYWpvcl9ldmljdGlvbnMoZmQsICZmYXVsdF9vcHMsIHNpemUsIGNvdW50KTsKK30KKwor c3RhdGljIGludCB0ZXN0X292ZXJsYXAoaW50IGZkLCBpbnQgZXhwZWN0ZWQpCit7CisJY2hhciAq cHRyOworCWludCByZXQ7CisJdWludDMyX3QgaGFuZGxlLCBoYW5kbGUyOworCisJaWd0X2Fzc2Vy dChwb3NpeF9tZW1hbGlnbigodm9pZCAqKSZwdHIsIFBBR0VfU0laRSwgUEFHRV9TSVpFICogMykg PT0gMCk7CisKKwlyZXQgPSBnZW1fdXNlcnB0cihmZCwgcHRyICsgUEFHRV9TSVpFLCBQQUdFX1NJ WkUsIDAsICZoYW5kbGUpOworCWlndF9hc3NlcnQocmV0ID09IDApOworCisJcmV0ID0gZ2VtX3Vz ZXJwdHIoZmQsIHB0ciwgUEFHRV9TSVpFLCAwLCAmaGFuZGxlMik7CisJaWd0X2Fzc2VydChyZXQg PT0gMCk7CisJZ2VtX2Nsb3NlKGZkLCBoYW5kbGUyKTsKKworCXJldCA9IGdlbV91c2VycHRyKGZk LCBwdHIgKyBQQUdFX1NJWkUgKiAyLCBQQUdFX1NJWkUsIDAsICZoYW5kbGUyKTsKKwlpZ3RfYXNz ZXJ0KHJldCA9PSAwKTsKKwlnZW1fY2xvc2UoZmQsIGhhbmRsZTIpOworCisJcmV0ID0gZ2VtX3Vz ZXJwdHIoZmQsIHB0ciwgUEFHRV9TSVpFICogMiwgMCwgJmhhbmRsZTIpOworCWlndF9hc3NlcnQo cmV0ID09IGV4cGVjdGVkKTsKKwlpZiAocmV0ID09IDApCisJCWdlbV9jbG9zZShmZCwgaGFuZGxl Mik7CisKKwlyZXQgPSBnZW1fdXNlcnB0cihmZCwgcHRyICsgUEFHRV9TSVpFLCBQQUdFX1NJWkUg KiAyLCAwLCAmaGFuZGxlMik7CisJaWd0X2Fzc2VydChyZXQgPT0gZXhwZWN0ZWQpOworCWlmIChy ZXQgPT0gMCkKKwkJZ2VtX2Nsb3NlKGZkLCBoYW5kbGUyKTsKKworCXJldCA9IGdlbV91c2VycHRy KGZkLCBwdHIsIFBBR0VfU0laRSAqIDMsIDAsICZoYW5kbGUyKTsKKwlpZ3RfYXNzZXJ0KHJldCA9 PSBleHBlY3RlZCk7CisJaWYgKHJldCA9PSAwKQorCQlnZW1fY2xvc2UoZmQsIGhhbmRsZTIpOwor CisJZ2VtX2Nsb3NlKGZkLCBoYW5kbGUpOworCWZyZWUocHRyKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IHRlc3RfdW5tYXAoaW50IGZkLCBpbnQgZXhwZWN0ZWQpCit7CisJY2hhciAq cHRyLCAqYm9fcHRyOworCWNvbnN0IHVuc2lnbmVkIGludCBudW1fb2JqID0gMzsKKwl1bnNpZ25l ZCBpbnQgaTsKKwl1aW50MzJfdCBib1tudW1fb2JqICsgMV07CisJc2l6ZV90IG1hcF9zaXplID0g c2l6ZW9mKGxpbmVhcikgKiBudW1fb2JqICsgKFBBR0VfU0laRSAtIDEpOworCWludCByZXQ7CisK KwlwdHIgPSBtbWFwKE5VTEwsIG1hcF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJ CU1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApOworCWFzc2VydChwdHIgIT0gTUFQ X0ZBSUxFRCk7CisKKwlib19wdHIgPSAoY2hhciAqKSgoKHVuc2lnbmVkIGxvbmcpcHRyICsgKFBB R0VfU0laRSAtIDEpKQorCQkJCQkJJiB+KFBBR0VfU0laRSAtIDEpKTsKKworCWZvciAoaSA9IDA7 IGkgPCBudW1fb2JqOyBpKyssIGJvX3B0ciArPSBzaXplb2YobGluZWFyKSkgeworCQlyZXQgPSBn ZW1fdXNlcnB0cihmZCwgYm9fcHRyLCBzaXplb2YobGluZWFyKSwgMCwgJmJvW2ldKTsKKwkJaWd0 X2Fzc2VydChyZXQgPT0gMCk7CisJfQorCisJYm9bbnVtX29ial0gPSBjcmVhdGVfYm8oZmQsIDAp OworCisJZm9yIChpID0gMDsgaSA8IG51bV9vYmo7IGkrKykKKwkJY29weShmZCwgYm9bbnVtX29i al0sIGJvW2ldLCAwKTsKKworCXJldCA9IG11bm1hcChwdHIsIG1hcF9zaXplKTsKKwlhc3NlcnQo cmV0ID09IDApOworCisJZm9yIChpID0gMDsgaSA8IG51bV9vYmo7IGkrKykKKwkJY29weShmZCwg Ym9bbnVtX29ial0sIGJvW2ldLCBleHBlY3RlZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKG51bV9v YmogKyAxKTsgaSsrKQorCQlnZW1fY2xvc2UoZmQsIGJvW2ldKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IHRlc3RfdW5tYXBfYWZ0ZXJfY2xvc2UoaW50IGZkKQoreworCWNoYXIgKnB0 ciwgKmJvX3B0cjsKKwljb25zdCB1bnNpZ25lZCBpbnQgbnVtX29iaiA9IDM7CisJdW5zaWduZWQg aW50IGk7CisJdWludDMyX3QgYm9bbnVtX29iaiArIDFdOworCXNpemVfdCBtYXBfc2l6ZSA9IHNp emVvZihsaW5lYXIpICogbnVtX29iaiArIChQQUdFX1NJWkUgLSAxKTsKKwlpbnQgcmV0OworCisJ cHRyID0gbW1hcChOVUxMLCBtYXBfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQlN QVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKKwlhc3NlcnQocHRyICE9IE1BUF9G QUlMRUQpOworCisJYm9fcHRyID0gKGNoYXIgKikoKCh1bnNpZ25lZCBsb25nKXB0ciArIChQQUdF X1NJWkUgLSAxKSkKKwkJCQkJCSYgfihQQUdFX1NJWkUgLSAxKSk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbnVtX29iajsgaSsrLCBib19wdHIgKz0gc2l6ZW9mKGxpbmVhcikpIHsKKwkJcmV0ID0gZ2Vt X3VzZXJwdHIoZmQsIGJvX3B0ciwgc2l6ZW9mKGxpbmVhciksIDAsICZib1tpXSk7CisJCWlndF9h c3NlcnQocmV0ID09IDApOworCX0KKworCWJvW251bV9vYmpdID0gY3JlYXRlX2JvKGZkLCAwKTsK KworCWZvciAoaSA9IDA7IGkgPCBudW1fb2JqOyBpKyspCisJCWNvcHkoZmQsIGJvW251bV9vYmpd LCBib1tpXSwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKG51bV9vYmogKyAxKTsgaSsrKQorCQln ZW1fY2xvc2UoZmQsIGJvW2ldKTsKKworCXJldCA9IG11bm1hcChwdHIsIG1hcF9zaXplKTsKKwlh c3NlcnQocmV0ID09IDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF91bm1h cF9jeWNsZXMoaW50IGZkLCBpbnQgZXhwZWN0ZWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAw OyBpIDwgMTAwMDsgaSsrKQorCQl0ZXN0X3VubWFwKGZkLCBleHBlY3RlZCk7CisKKwlyZXR1cm4g MDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVpbnQ2NF90IGFw ZXJ0dXJlX3NpemU7CisJdW5zaWduZWQgaW50IHRvdGFsX3JhbTsKKwlpbnQgZmQgPSAtMSwgY291 bnQgPSAwLCBzaXplID0gMCwgcmV0OworCisJaWd0X3NraXBfb25fc2ltdWxhdGlvbigpOworCisJ aWd0X3N1YnRlc3RfaW5pdChhcmdjLCBhcmd2KTsKKworCWlndF9maXh0dXJlIHsKKwkJZmQgPSBk cm1fb3Blbl9hbnkoKTsKKwkJaWd0X2Fzc2VydChmZCA+PSAwKTsKKworCQlyZXQgPSBoYXNfdXNl cnB0cihmZCk7CisJCWlndF9za2lwX29uX2YocmV0ID09IDAsICJObyB1c2VycHRyIHN1cHBvcnQg LSAlcyAoJWQpXG4iLAorCQkJICAgICAgc3RyZXJyb3IoZXJybm8pLCByZXQpOworCisJCXNpemUg PSBzaXplb2YobGluZWFyKTsKKworCQlhcGVydHVyZV9zaXplID0gZ2VtX2FwZXJ0dXJlX3NpemUo ZmQpOworCQlwcmludGYoIkFwZXJ0dXJlIHNpemUgaXMgJWx1IE1pQlxuIiwgKGxvbmcpKGFwZXJ0 dXJlX3NpemUgLyAoMTAyNCoxMDI0KSkpOworCisJCWlmIChhcmdjID4gMSkKKwkJCWNvdW50ID0g YXRvaShhcmd2WzFdKTsKKwkJaWYgKGNvdW50ID09IDApCisJCQljb3VudCA9IDIgKiBhcGVydHVy ZV9zaXplIC8gKDEwMjQqMTAyNCkgLyAzOworCisJCXRvdGFsX3JhbSA9IGludGVsX2dldF90b3Rh bF9yYW1fbWIoKTsKKwkJcHJpbnRmKCJUb3RhbCBSQU0gaXMgJXUgTWlCXG4iLCB0b3RhbF9yYW0p OworCisJCWlmIChjb3VudCA+IHRvdGFsX3JhbSAqIDMgLyA0KSB7CisJCQljb3VudCA9IGludGVs X2dldF90b3RhbF9yYW1fbWIoKSAqIDMgLyA0OworCQkJcHJpbnRmKCJOb3QgZW5vdWdoIFJBTSB0 byBydW4gdGVzdCwgcmVkdWNpbmcgYnVmZmVyIGNvdW50LlxuIik7CisJCX0KKwl9CisKKwlpZ3Rf c3VidGVzdCgiaW5wdXQtY2hlY2tpbmciKQorCQl0ZXN0X2lucHV0X2NoZWNraW5nKGZkKTsKKwor CWlndF9zdWJ0ZXN0KCJ1c2FnZS1yZXN0cmljdGlvbnMiKQorCQl0ZXN0X3VzYWdlX3Jlc3RyaWN0 aW9ucyhmZCk7CisKKwlpZ3Rfc3VidGVzdCgiaW52YWxpZC1tYXBwaW5nIikKKwkJdGVzdF9pbnZh bGlkX21hcHBpbmcoZmQpOworCisJaWd0X3N1YnRlc3QoImZvcmJpZGRlbi1vcGVyYXRpb25zIikK KwkJdGVzdF9mb3JiaWRkZW5fb3BzKGZkKTsKKworCXByaW50ZigiVGVzdGluZyB1bnN5bmNocm9u aXplZCBtYXBwaW5ncy4uLlxuIik7CisJZ2VtX3VzZXJwdHJfdGVzdF91bnN5bmNocm9uaXplZCgp OworCisJaWd0X3N1YnRlc3QoImNyZWF0ZS1kZXN0cm95LXVuc3luYyIpCisJCXRlc3RfY3JlYXRl X2Rlc3Ryb3koZmQpOworCisJaWd0X3N1YnRlc3QoInVuc3luYy1vdmVybGFwIikKKwkJdGVzdF9v dmVybGFwKGZkLCAwKTsKKworCWlndF9zdWJ0ZXN0KCJ1bnN5bmMtdW5tYXAiKQorCQl0ZXN0X3Vu bWFwKGZkLCAwKTsKKworCWlndF9zdWJ0ZXN0KCJ1bnN5bmMtdW5tYXAtY3ljbGVzIikKKwkJdGVz dF91bm1hcF9jeWNsZXMoZmQsIDApOworCisJaWd0X3N1YnRlc3QoInVuc3luYy11bm1hcC1hZnRl ci1jbG9zZSIpCisJCXRlc3RfdW5tYXBfYWZ0ZXJfY2xvc2UoZmQpOworCisJaWd0X3N1YnRlc3Qo ImNvaGVyZW5jeS11bnN5bmMiKQorCQl0ZXN0X2NvaGVyZW5jeShmZCwgY291bnQpOworCisJaWd0 X3N1YnRlc3QoImRtYWJ1Zi11bnN5bmMiKQorCQl0ZXN0X2RtYWJ1ZigpOworCisJZm9yICh1bnNp Z25lZCBmbGFncyA9IDA7IGZsYWdzIDwgQUxMX0ZPUktJTkdfRVZJQ1RJT05TICsgMTsgZmxhZ3Mr KykgeworCQlpZ3Rfc3VidGVzdF9mKCJmb3JrZWQtdW5zeW5jJXMlcyVzLSVzIiwKKwkJICAgIGZs YWdzICYgRk9SS0lOR19FVklDVElPTlNfU1dBUFBJTkcgPyAiLXN3YXBwaW5nIiA6ICIiLAorCQkg ICAgZmxhZ3MgJiBGT1JLSU5HX0VWSUNUSU9OU19EVVBfRFJNRkQgPyAiLW11bHRpZmQiIDogIiIs CisJCSAgICBmbGFncyAmIEZPUktJTkdfRVZJQ1RJT05TX01FTU9SWV9QUkVTU1VSRSA/CisJCQkJ Ii1tZW1wcmVzc3VyZSIgOiAiIiwKKwkJICAgIGZsYWdzICYgRk9SS0lOR19FVklDVElPTlNfSU5U RVJSVVBUSUJMRSA/CisJCQkJImludGVycnVwdGlibGUiIDogIm5vcm1hbCIpIHsKKwkJCXRlc3Rf Zm9ya2luZ19ldmljdGlvbnMoZmQsIHNpemUsIGNvdW50LCBmbGFncyk7CisJCX0KKwl9CisKKwlp Z3Rfc3VidGVzdCgic3dhcHBpbmctdW5zeW5jLW5vcm1hbCIpCisJCXRlc3Rfc3dhcHBpbmdfZXZp Y3Rpb25zKGZkLCBzaXplLCBjb3VudCk7CisKKwlpZ3Rfc3VidGVzdCgibWlub3ItdW5zeW5jLW5v cm1hbCIpCisJCXRlc3RfbWlub3JfZXZpY3Rpb25zKGZkLCBzaXplLCBjb3VudCk7CisKKwlpZ3Rf c3VidGVzdCgibWFqb3ItdW5zeW5jLW5vcm1hbCIpIHsKKwkJc2l6ZSA9IDIwMCAqIDEwMjQgKiAx MDI0OworCQljb3VudCA9IChnZW1fYXBlcnR1cmVfc2l6ZShmZCkgLyBzaXplKSArIDI7CisJCXRl c3RfbWFqb3JfZXZpY3Rpb25zKGZkLCBzaXplLCBjb3VudCk7CisJfQorCisJaWd0X2ZpeHR1cmUg eworCQlzaXplID0gc2l6ZW9mKGxpbmVhcik7CisJCWNvdW50ID0gMiAqIGdlbV9hcGVydHVyZV9z aXplKGZkKSAvICgxMDI0KjEwMjQpIC8gMzsKKwkJaWYgKGNvdW50ID4gdG90YWxfcmFtICogMyAv IDQpCisJCQljb3VudCA9IGludGVsX2dldF90b3RhbF9yYW1fbWIoKSAqIDMgLyA0OworCX0KKwor CWlndF9mb3JrX3NpZ25hbF9oZWxwZXIoKTsKKworCWlndF9zdWJ0ZXN0KCJzd2FwcGluZy11bnN5 bmMtaW50ZXJydXB0aWJsZSIpCisJCXRlc3Rfc3dhcHBpbmdfZXZpY3Rpb25zKGZkLCBzaXplLCBj b3VudCk7CisKKwlpZ3Rfc3VidGVzdCgibWlub3ItdW5zeW5jLWludGVycnVwdGlibGUiKQorCQl0 ZXN0X21pbm9yX2V2aWN0aW9ucyhmZCwgc2l6ZSwgY291bnQpOworCisJaWd0X3N1YnRlc3QoIm1h am9yLXVuc3luYy1pbnRlcnJ1cHRpYmxlIikgeworCQlzaXplID0gMjAwICogMTAyNCAqIDEwMjQ7 CisJCWNvdW50ID0gKGdlbV9hcGVydHVyZV9zaXplKGZkKSAvIHNpemUpICsgMjsKKwkJdGVzdF9t YWpvcl9ldmljdGlvbnMoZmQsIHNpemUsIGNvdW50KTsKKwl9CisKKwlpZ3Rfc3RvcF9zaWduYWxf aGVscGVyKCk7CisKKwlwcmludGYoIlRlc3Rpbmcgc3luY2hyb25pemVkIG1hcHBpbmdzLi4uXG4i KTsKKworCWlndF9maXh0dXJlIHsKKwkJc2l6ZSA9IHNpemVvZihsaW5lYXIpOworCQljb3VudCA9 IDIgKiBnZW1fYXBlcnR1cmVfc2l6ZShmZCkgLyAoMTAyNCoxMDI0KSAvIDM7CisJCWlmIChjb3Vu dCA+IHRvdGFsX3JhbSAqIDMgLyA0KQorCQkJY291bnQgPSBpbnRlbF9nZXRfdG90YWxfcmFtX21i KCkgKiAzIC8gNDsKKwl9CisKKwlnZW1fdXNlcnB0cl90ZXN0X3N5bmNocm9uaXplZCgpOworCisJ aWd0X3N1YnRlc3QoImNyZWF0ZS1kZXN0cm95LXN5bmMiKQorCQl0ZXN0X2NyZWF0ZV9kZXN0cm95 KGZkKTsKKworCWlndF9zdWJ0ZXN0KCJzeW5jLW92ZXJsYXAiKQorCQl0ZXN0X292ZXJsYXAoZmQs IEVJTlZBTCk7CisKKwlpZ3Rfc3VidGVzdCgic3luYy11bm1hcCIpCisJCXRlc3RfdW5tYXAoZmQs IEVGQVVMVCk7CisKKwlpZ3Rfc3VidGVzdCgic3luYy11bm1hcC1jeWNsZXMiKQorCQl0ZXN0X3Vu bWFwX2N5Y2xlcyhmZCwgRUZBVUxUKTsKKworCWlndF9zdWJ0ZXN0KCJzeW5jLXVubWFwLWFmdGVy LWNsb3NlIikKKwkJdGVzdF91bm1hcF9hZnRlcl9jbG9zZShmZCk7CisKKwlpZ3Rfc3VidGVzdCgi Y29oZXJlbmN5LXN5bmMiKQorCQl0ZXN0X2NvaGVyZW5jeShmZCwgY291bnQpOworCisJaWd0X3N1 YnRlc3QoImRtYWJ1Zi1zeW5jIikKKwkJdGVzdF9kbWFidWYoKTsKKworCWZvciAodW5zaWduZWQg ZmxhZ3MgPSAwOyBmbGFncyA8IEFMTF9GT1JLSU5HX0VWSUNUSU9OUyArIDE7IGZsYWdzKyspIHsK KwkJaWd0X3N1YnRlc3RfZigiZm9ya2VkLXN5bmMlcyVzJXMtJXMiLAorCQkgICAgZmxhZ3MgJiBG T1JLSU5HX0VWSUNUSU9OU19TV0FQUElORyA/ICItc3dhcHBpbmciIDogIiIsCisJCSAgICBmbGFn cyAmIEZPUktJTkdfRVZJQ1RJT05TX0RVUF9EUk1GRCA/ICItbXVsdGlmZCIgOiAiIiwKKwkJICAg IGZsYWdzICYgRk9SS0lOR19FVklDVElPTlNfTUVNT1JZX1BSRVNTVVJFID8KKwkJCQkiLW1lbXBy ZXNzdXJlIiA6ICIiLAorCQkgICAgZmxhZ3MgJiBGT1JLSU5HX0VWSUNUSU9OU19JTlRFUlJVUFRJ QkxFID8KKwkJCQkiaW50ZXJydXB0aWJsZSIgOiAibm9ybWFsIikgeworCQkJdGVzdF9mb3JraW5n X2V2aWN0aW9ucyhmZCwgc2l6ZSwgY291bnQsIGZsYWdzKTsKKwkJfQorCX0KKworCWlndF9zdWJ0 ZXN0KCJzd2FwcGluZy1ub3JtYWwtc3luYyIpCisJCXRlc3Rfc3dhcHBpbmdfZXZpY3Rpb25zKGZk LCBzaXplLCBjb3VudCk7CisKKwlpZ3Rfc3VidGVzdCgibWlub3Itbm9ybWFsLXN5bmMiKQorCQl0 ZXN0X21pbm9yX2V2aWN0aW9ucyhmZCwgc2l6ZSwgY291bnQpOworCisJaWd0X3N1YnRlc3QoIm1h am9yLW5vcm1hbC1zeW5jIikgeworCQlzaXplID0gMjAwICogMTAyNCAqIDEwMjQ7CisJCWNvdW50 ID0gKGdlbV9hcGVydHVyZV9zaXplKGZkKSAvIHNpemUpICsgMjsKKwkJdGVzdF9tYWpvcl9ldmlj dGlvbnMoZmQsIHNpemUsIGNvdW50KTsKKwl9CisKKwlpZ3RfZml4dHVyZSB7CisJCXNpemUgPSAx MDI0ICogMTAyNDsKKwkJY291bnQgPSAyICogZ2VtX2FwZXJ0dXJlX3NpemUoZmQpIC8gKDEwMjQq MTAyNCkgLyAzOworCQlpZiAoY291bnQgPiB0b3RhbF9yYW0gKiAzIC8gNCkKKwkJCWNvdW50ID0g aW50ZWxfZ2V0X3RvdGFsX3JhbV9tYigpICogMyAvIDQ7CisJfQorCisJaWd0X2Zvcmtfc2lnbmFs X2hlbHBlcigpOworCisJaWd0X3N1YnRlc3QoInN3YXBwaW5nLXN5bmMtaW50ZXJydXB0aWJsZSIp CisJCXRlc3Rfc3dhcHBpbmdfZXZpY3Rpb25zKGZkLCBzaXplLCBjb3VudCk7CisKKwlpZ3Rfc3Vi dGVzdCgibWlub3Itc3luYy1pbnRlcnJ1cHRpYmxlIikKKwkJdGVzdF9taW5vcl9ldmljdGlvbnMo ZmQsIHNpemUsIGNvdW50KTsKKworCWlndF9zdWJ0ZXN0KCJtYWpvci1zeW5jLWludGVycnVwdGli bGUiKSB7CisJCXNpemUgPSAyMDAgKiAxMDI0ICogMTAyNDsKKwkJY291bnQgPSAoZ2VtX2FwZXJ0 dXJlX3NpemUoZmQpIC8gc2l6ZSkgKyAyOworCQl0ZXN0X21ham9yX2V2aWN0aW9ucyhmZCwgc2l6 ZSwgY291bnQpOworCX0KKworCWlndF9zdG9wX3NpZ25hbF9oZWxwZXIoKTsKKworCWlndF9zdWJ0 ZXN0KCJhY2Nlc3MtY29udHJvbCIpCisJdGVzdF9hY2Nlc3NfY29udHJvbChmZCk7CisKKwlpZ3Rf ZXhpdCgpOworCisJcmV0dXJuIDA7Cit9Ci0tIAoxLjguNC4zCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVs LWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=