From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 79CAC6E324 for ; Mon, 30 Apr 2018 09:29:16 +0000 (UTC) From: Petri Latvala Date: Mon, 30 Apr 2018 12:28:47 +0300 Message-Id: <20180430092848.10830-4-petri.latvala@intel.com> In-Reply-To: <20180430092848.10830-1-petri.latvala@intel.com> References: <20180430092848.10830-1-petri.latvala@intel.com> Subject: [igt-dev] [PATCH i-g-t 3/4] runner: New test runner List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org Cc: Tomi Sarvela , Martin Peres List-ID: VGhpcyBpcyBhIG5ldyB0ZXN0IHJ1bm5lciB0byByZXBsYWNlIHBpZ2xpdC4gUGlnbGl0IGhhcyBi ZWVuIHZlcnkKdXNlZnVsIGFzIGEgdGVzdCBydW5uZXIsIGJ1dCBjZXJ0YWluIGltcHJvdmVtZW50 cyBoYXZlIGJlZW4gdmVyeQpkaWZmaWN1bHQgaWYgcG9zc2libGUgYXQgYWxsIGluIGEgZ2VuZXJp YyB0ZXN0IHJ1bm5pbmcgZnJhbWV3b3JrLgoKSW1wb3J0YW50IGltcHJvdmVtZW50cyBvdmVyIHBp Z2xpdDoKCi0gRmFzdGVyIHRvIGxhdW5jaC4gQmVpbmcgYWJsZSB0byBtYWtlIGFzc3VtcHRpb25z IGFib3V0IHdoYXQgd2UncmUKICBleGVjdXRpbmcgbWFrZXMgaXQgcG9zc2libGUgdG8gc2F2ZSBz aWduaWZpY2FudCBhbW91bnRzIG9mIHRpbWUuIEZvcgogIGV4YW1wbGUsIGEgdGVzdGxpc3QgZmls ZSdzIGxpbmUgImlndEBzb21lYmluYXJ5QHNvbWVzdWJ0ZXN0IiBhbHJlYWR5CiAgaGFzIGFsbCB0 aGUgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGNvcnJlY3QgY29tbWFuZAog IGxpbmUgdG8gZXhlY3V0ZSB0aGF0IHBhcnRpY3VsYXIgc3VidGVzdCwgaW5zdGVhZCBvZiBsaXN0 aW5nIGFsbAogIHN1YnRlc3RzIG9mIGFsbCB0ZXN0IGJpbmFyaWVzIGFuZCBtYXBwaW5nIHRoZW0g dG8gY29tbWFuZAogIGxpbmVzLiBTYW1lIGdvZXMgZm9yIHRoZSByZWdleHAgZmlsdGVycyBjb21t YW5kIGxpbmUgZmxhZ3MgLXQgYW5kCiAgLXg7IElmIHdlIHVzZSAteCBzb21lYmluYXJ5bmFtZSwg d2UgZG9uJ3QgbmVlZCB0byBsaXN0IHN1YnRlc3RzIGZyb20KICBzb21lYmluYXJ5bmFtZSwgd2Ug YWxyZWFkeSBrbm93IG5vbmUgb2YgdGhlbSB3aWxsIGdldCBleGVjdXRlZC4KCi0gTG9ncyBvZiBp bmNvbXBsZXRlIHRlc3RzLiBQaWdsaXQgY29sbGVjdHMgdGVzdCBvdXRwdXQgdG8gbWVtb3J5IGFu ZAogIGR1bXBzIHRoZW0gdG8gYSBmaWxlIHdoZW4gdGhlIHRlc3QgaXMgY29tcGxldGUuIFRoZSBu ZXcgcnVubmVyCiAgd3JpdGVzIGFsbCBvdXRwdXQgdG8gZGlzayBpbW1lZGlhdGVseS4KCi0gQWJp bGl0eSB0byBleGVjdXRlIG11bHRpcGxlIHN1YnRlc3RzIGluIG9uZSBiaW5hcnkgZXhlY3V0aW9u LiBUaGlzCiAgd2FzIHBvc3NpYmxlIHdpdGggcGlnbGl0LCBidXQgaXRzIHNlbWFudGljcyBtYWRl IGl0IHZlcnkgaGFyZCB0bwogIGltcGxlbWVudCBpbiBwcmFjdGljZS4gRm9yIGV4YW1wbGUsIGhh dmluZyBhIHRlc3RsaXN0IGZpbGUgbm90IG9ubHkKICBzZWxlY3RlZCBhIHN1YnNldCBvZiB0ZXN0 cyB0byBydW4sIGJ1dCBhbHNvIG1hbmRhdGVkIHRoYXQgdGhleSBiZQogIGV4ZWN1dGVkIGluIHRo ZSBzYW1lIG9yZGVyLgoKLSBGbGV4aWJsZSB0aW1lb3V0IHN1cHBvcnQuIEluc3RlYWQgb2YgbWFu ZGF0aW5nIGEgdGltZSB0ZXN0cyBjYW5ub3QKICBleGNlZWQsIHRoZSBuZXcgcnVubmVyIGhhcyBh IHRpbWVvdXQgb24gaW5hY3Rpdml0eS4gQWN0aXZpdHkgaXMKICBhbnkgb3V0cHV0IG9uIHRoZSB0 ZXN0J3Mgc3Rkb3V0IG9yIHN0ZGVyciwgb3Iga2VybmVsIGFjdGl2aXR5IHZpYQogIC9kZXYva21z Zy4KClRoZSBydW5uZXIgaXMgZmFpcmx5IHBpZ2xpdCBjb21wYXRpYmxlLiBUaGUgY29tbWFuZCBs aW5lIGlzIHZlcnkKc2ltaWxhciwgd2l0aCBhIGZldyBhZGRpdGlvbnMuIElHVF9URVNUX1JPT1Qg ZW52aXJvbm1lbnQgZmxhZyBpcyBzdGlsbApzdXBwb3J0ZWQsIGJ1dCBjYW4gYWxzbyBiZSBzZXQg dmlhIGNvbW1hbmQgbGluZSAoaW4gcGxhY2Ugb2YgaWd0LnB5IGluCnBpZ2xpdCBjb21tYW5kIGxp bmUpLgoKVGhlIHJlc3VsdHMgYXJlIGEgc2V0IG9mIGxvZyBmaWxlcywgcHJvY2Vzc2VkIGludG8g YSBwaWdsaXQtY29tcGF0aWJsZQpyZXN1bHRzLmpzb24gZmlsZSAoQloyIGNvbXByZXNzaW9uIFRP RE8pLiBUaGVyZSBhcmUgc29tZSBuZXcgZmllbGRzIGluCnRoZSBqc29uIGZvciBleHRyYSBpbmZv cm1hdGlvbjoKCi0gImlndC12ZXJzaW9uIiBjb250YWlucyB0aGUgSUdUIHZlcnNpb24gbGluZS4g SW4KICBtdWx0aXBsZS1zdWJ0ZXN0cy1tb2RlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIG9u bHkgcHJpbnRlZCBvbmNlLAogIHNvIGl0IG5lZWRzIHRvIGJlIGR1cGxpY2F0ZWQgdG8gYWxsIHN1 YnRlc3QgcmVzdWx0cyB0aGlzIHdheS4KLSAiZG1lc2ctd2FybmluZ3MiIGNvbnRhaW5zIHRoZSBk bWVzZyBsaW5lcyB0aGF0IHRyaWdnZXJlZCBhCiAgZG1lc2ctd2Fybi9kbWVzZy1mYWlsIHN0YXRl LgotIFJ1bnRpbWUgaW5mb3JtYXRpb24gd2lsbCBiZSBkaWZmZXJlbnQuIFBpZ2xpdCB0YWtlcyBh IHRpbWVzdGFtcCBhdAogIHRoZSBiZWdpbm5pbmcgYW5kIGF0IHRoZSBlbmQgb2YgZXhlY3V0aW9u IGZvciBydW50aW1lLiBUaGUgbmV3CiAgcnVubmVyIHVzZXMgdGhlIHN1YnRlc3Qgb3V0cHV0IHRl eHQuIFRoZSBiaW5hcnkgZXhlY3V0aW9uIHRpbWUgd2lsbAogIGFsc28gYmUgaW5jbHVkZWQ7IFRo ZSBrZXkgImlndEBzb21lYmluYXJ5IiB3aWxsIGhhdmUgdGhlIHJ1bnRpbWUgb2YKICB0aGUgYmlu YXJ5ICJzb21lYmluYXJ5Iiwgd2hlcmVhcyAiaWd0QHNvbWViaW5hcnlAYSIgZXRjIHdpbGwgaGF2 ZQogIHRoZSBydW50aW1lIG9mIHRoZSBzdWJ0ZXN0cy4gU3Vic3RyYWN0aW5nIHRoZSBzdWJ0ZXN0 IHJ1bnRpbWVzIGZyb20KICB0aGUgYmluYXJ5IHJ1bnRpbWUgeWllbGRzIHRoZSB0b3RhbCB0aW1l IHNwZW50IGRvaW5nIHNldHVwIGluCiAgaWd0X2ZpeHR1cmUgYmxvY2tzLgoKU2lnbmVkLW9mZi1i eTogUGV0cmkgTGF0dmFsYSA8cGV0cmkubGF0dmFsYUBpbnRlbC5jb20+CkNjOiBNYWFydGVuIExh bmtob3JzdCA8bWFhcnRlbi5sYW5raG9yc3RAbGludXguaW50ZWwuY29tPgpDYzogQXJrYWRpdXN6 IEhpbGVyIDxhcmthZGl1c3ouaGlsZXJAaW50ZWwuY29tPgpDYzogVG9taSBTYXJ2ZWxhIDx0b21p LnAuc2FydmVsYUBpbnRlbC5jb20+CkNjOiBNYXJ0aW4gUGVyZXMgPG1hcnRpbi5wZXJlc0BsaW51 eC5pbnRlbC5jb20+Ci0tLQogbWVzb24uYnVpbGQgICAgICAgIHwgICAgMSArCiBydW5uZXIvZXhl Y3V0b3IuYyAgfCAxMDc2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIHJ1bm5lci9leGVjdXRvci5oICB8ICAgNDIgKysKIHJ1bm5lci9qb2JfbGlz dC5jICB8ICA0OTIgKysrKysrKysrKysrKysrKysrKysrKysrCiBydW5uZXIvam9iX2xpc3QuaCAg fCAgIDM3ICsrCiBydW5uZXIvbWVzb24uYnVpbGQgfCAgIDI0ICsrCiBydW5uZXIvcmVzdWx0Z2Vu LmMgfCAgODY0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBydW5u ZXIvcmVzdWx0Z2VuLmggfCAgICA5ICsKIHJ1bm5lci9yZXN1bHRzLmMgICB8ICAgMjYgKysKIHJ1 bm5lci9ydW5uZXIuYyAgICB8ICAgNDAgKysKIHJ1bm5lci9zZXR0aW5ncy5jICB8ICA1MDYgKysr KysrKysrKysrKysrKysrKysrKysrCiBydW5uZXIvc2V0dGluZ3MuaCAgfCAgMTExICsrKysrKwog MTIgZmlsZXMgY2hhbmdlZCwgMzIyOCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQg cnVubmVyL2V4ZWN1dG9yLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydW5uZXIvZXhlY3V0b3IuaAog Y3JlYXRlIG1vZGUgMTAwNjQ0IHJ1bm5lci9qb2JfbGlzdC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg cnVubmVyL2pvYl9saXN0LmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydW5uZXIvbWVzb24uYnVpbGQK IGNyZWF0ZSBtb2RlIDEwMDY0NCBydW5uZXIvcmVzdWx0Z2VuLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBydW5uZXIvcmVzdWx0Z2VuLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydW5uZXIvcmVzdWx0cy5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgcnVubmVyL3J1bm5lci5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg cnVubmVyL3NldHRpbmdzLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBydW5uZXIvc2V0dGluZ3MuaAoK ZGlmZiAtLWdpdCBhL21lc29uLmJ1aWxkIGIvbWVzb24uYnVpbGQKaW5kZXggNWI3ODNlNWQuLjM1 ZTQyNjMxIDEwMDY0NAotLS0gYS9tZXNvbi5idWlsZAorKysgYi9tZXNvbi5idWlsZApAQCAtMTM2 LDYgKzEzNiw3IEBAIHN1YmRpcignbGliJykKIHN1YmRpcigndGVzdHMnKQogc3ViZGlyKCdiZW5j aG1hcmtzJykKIHN1YmRpcigndG9vbHMnKQorc3ViZGlyKCdydW5uZXInKQogaWYgbGliZHJtX2lu dGVsLmZvdW5kKCkKIAlzdWJkaXIoJ2Fzc2VtYmxlcicpCiAJaWYgWyd4ODYnLCAneDg2XzY0J10u Y29udGFpbnMoaG9zdF9tYWNoaW5lLmNwdV9mYW1pbHkoKSkKZGlmZiAtLWdpdCBhL3J1bm5lci9l eGVjdXRvci5jIGIvcnVubmVyL2V4ZWN1dG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAuLjI3NTRmNWEyCi0tLSAvZGV2L251bGwKKysrIGIvcnVubmVyL2V4ZWN1dG9yLmMK QEAgLTAsMCArMSwxMDc2IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5o PgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5j bHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4K KyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVk ZSA8c3lzL3NpZ25hbGZkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMv dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+ CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiZXhl Y3V0b3IuaCIKKworLyogQ2xvY2sgaGFuZGxpbmcgY29waWVkIGZyb20gaWd0X2NvcmUuYyAqLwor CitzdGF0aWMgY2xvY2tpZF90IGlndF9jbG9jazsKKworI2RlZmluZSB0aW1lX3ZhbGlkKHRzKSAo KHRzKS0+dHZfc2VjIHx8ICh0cyktPnR2X25zZWMpCisKK3N0YXRpYyBkb3VibGUKK3RpbWVfZWxh cHNlZChzdHJ1Y3QgdGltZXNwZWMgKnRoZW4sCisJICAgICBzdHJ1Y3QgdGltZXNwZWMgKm5vdykK K3sKKwlkb3VibGUgZWxhcHNlZCA9IC0xLjsKKworCWlmICh0aW1lX3ZhbGlkKHRoZW4pICYmIHRp bWVfdmFsaWQobm93KSkgeworCQllbGFwc2VkID0gbm93LT50dl9zZWMgLSB0aGVuLT50dl9zZWM7 CisJCWVsYXBzZWQgKz0gKG5vdy0+dHZfbnNlYyAtIHRoZW4tPnR2X25zZWMpICogMWUtOTsKKwl9 CisKKwlyZXR1cm4gZWxhcHNlZDsKK30KKworc3RhdGljIGludCBnZXR0aW1lKHN0cnVjdCB0aW1l c3BlYyAqdHMpCit7CisJbWVtc2V0KHRzLCAwLCBzaXplb2YoKnRzKSk7CisJZXJybm8gPSAwOwor CisJLyogU3RheSBvbiB0aGUgc2FtZSBjbG9jayBmb3IgY29uc2lzdGVuY3kuICovCisJaWYgKGln dF9jbG9jayAhPSAoY2xvY2tpZF90KS0xKSB7CisJCWlmIChjbG9ja19nZXR0aW1lKGlndF9jbG9j aywgdHMpKQorCQkJZ290byBlcnJvcjsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgQ0xPQ0tf TU9OT1RPTklDX1JBVworCWlmICghY2xvY2tfZ2V0dGltZShpZ3RfY2xvY2sgPSBDTE9DS19NT05P VE9OSUNfUkFXLCB0cykpCisJCXJldHVybiAwOworI2VuZGlmCisjaWZkZWYgQ0xPQ0tfTU9OT1RP TklDX0NPQVJTRQorCWlmICghY2xvY2tfZ2V0dGltZShpZ3RfY2xvY2sgPSBDTE9DS19NT05PVE9O SUNfQ09BUlNFLCB0cykpCisJCXJldHVybiAwOworI2VuZGlmCisJaWYgKCFjbG9ja19nZXR0aW1l KGlndF9jbG9jayA9IENMT0NLX01PTk9UT05JQywgdHMpKQorCQlyZXR1cm4gMDsKK2Vycm9yOgor CWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogQ291bGQgbm90IHJlYWQgbW9ub3RvbmljIHRpbWU6 ICVzXG4iLAorCQlzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIC1lcnJubzsKK30KKworc3Ry dWN0IHdhdGNoZG9ncworeworCWludCAqZmRzOworCXNpemVfdCBudW1fZG9nczsKK30gd2F0Y2hk b2dzOworCitzdGF0aWMgdm9pZCBjbG9zZV93YXRjaGRvZ3Moc3RydWN0IHNldHRpbmdzICpzZXR0 aW5ncykKK3sKKwlzaXplX3QgaTsKKworCWlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy0+bG9nX2xl dmVsID49IExPR19MRVZFTF9WRVJCT1NFKQorCQlwcmludGYoIkNsb3Npbmcgd2F0Y2hkb2dzXG4i KTsKKworCWZvciAoaSA9IDA7IGkgPCB3YXRjaGRvZ3MubnVtX2RvZ3M7IGkrKykgeworCQl3cml0 ZSh3YXRjaGRvZ3MuZmRzW2ldLCAiViIsIDEpOworCQljbG9zZSh3YXRjaGRvZ3MuZmRzW2ldKTsK Kwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX3dhdGNoZG9nc19hdGV4aXQoKQoreworCWNsb3Nl X3dhdGNoZG9ncyhOVUxMKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF93YXRjaGRvZ3Moc3RydWN0 IHNldHRpbmdzICpzZXR0aW5ncykKK3sKKwlpbnQgaTsKKwljaGFyIG5hbWVbMzJdOworCWludCBm ZDsKKworCW1lbXNldCgmd2F0Y2hkb2dzLCAwLCBzaXplb2Yod2F0Y2hkb2dzKSk7CisKKwlpZiAo IXNldHRpbmdzLT51c2Vfd2F0Y2hkb2cgfHwgc2V0dGluZ3MtPmluYWN0aXZpdHlfdGltZW91dCA8 PSAwKQorCQlyZXR1cm47CisKKwlpZiAoc2V0dGluZ3MtPmxvZ19sZXZlbCA+PSBMT0dfTEVWRUxf VkVSQk9TRSkgeworCQlwcmludGYoIkluaXRpYWxpemluZyB3YXRjaGRvZ3NcbiIpOworCX0KKwor CWF0ZXhpdChjbG9zZV93YXRjaGRvZ3NfYXRleGl0KTsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7 CisJCXNucHJpbnRmKG5hbWUsIDMyLCAiL2Rldi93YXRjaGRvZyVkIiwgaSk7CisJCWlmICgoZmQg PSBvcGVuKG5hbWUsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkKKwkJCWJyZWFrOworCisJCXdh dGNoZG9ncy5udW1fZG9ncysrOworCQl3YXRjaGRvZ3MuZmRzID0gcmVhbGxvYyh3YXRjaGRvZ3Mu ZmRzLCB3YXRjaGRvZ3MubnVtX2RvZ3MgKiBzaXplb2YoaW50KSk7CisJCXdhdGNoZG9ncy5mZHNb aV0gPSBmZDsKKworCQlpZiAoc2V0dGluZ3MtPmxvZ19sZXZlbCA+PSBMT0dfTEVWRUxfVkVSQk9T RSkKKwkJCXByaW50ZigiICVzXG4iLCBuYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2F0Y2hk b2dzX3NldF90aW1lb3V0KGludCB0aW1lb3V0KQoreworCXNpemVfdCBpOworCWludCBvcmlnX3Rp bWVvdXQgPSB0aW1lb3V0OworCisJZm9yIChpID0gMDsgaSA8IHdhdGNoZG9ncy5udW1fZG9nczsg aSsrKSB7CisJCWlmIChpb2N0bCh3YXRjaGRvZ3MuZmRzW2ldLCBXRElPQ19TRVRUSU1FT1VULCAm dGltZW91dCkpIHsKKwkJCXdyaXRlKHdhdGNoZG9ncy5mZHNbaV0sICJWIiwgMSk7CisJCQljbG9z ZSh3YXRjaGRvZ3MuZmRzW2ldKTsKKwkJCXdhdGNoZG9ncy5mZHNbaV0gPSAtMTsKKwkJCWNvbnRp bnVlOworCQl9CisKKwkJaWYgKHRpbWVvdXQgPCBvcmlnX3RpbWVvdXQpIHsKKwkJCS8qCisJCQkg KiBUaW1lb3V0IG9mIHRoaXMgY2FsaWJlciByZWZ1c2VkLiBXZSB3YW50IHRvCisJCQkgKiB1c2Ug dGhlIHNhbWUgdGltZW91dCBmb3IgYWxsIGRldmljZXMuCisJCQkgKi8KKwkJCXJldHVybiB3YXRj aGRvZ3Nfc2V0X3RpbWVvdXQodGltZW91dCk7CisJCX0KKwl9CisKKwlyZXR1cm4gdGltZW91dDsK K30KKworc3RhdGljIHZvaWQgcGluZ193YXRjaGRvZ3MoKQoreworCXNpemVfdCBpOworCisJZm9y IChpID0gMDsgaSA8IHdhdGNoZG9ncy5udW1fZG9nczsgaSsrKSB7CisJCWlvY3RsKHdhdGNoZG9n cy5mZHNbaV0sIFdESU9DX0tFRVBBTElWRSwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcnVu ZV9zdWJ0ZXN0KHN0cnVjdCBqb2JfbGlzdF9lbnRyeSAqZW50cnksIGNoYXIgKnN1YnRlc3QpCit7 CisJY2hhciAqZXhjbDsKKworCS8qCisJICogU3VidGVzdCBwcnVuaW5nIGlzIGRvbmUgYnkgYWRk aW5nIGV4Y2x1c2lvbiBzdHJpbmdzIHRvIHRoZQorCSAqIHN1YnRlc3QgbGlzdC4gVGhlIGxhc3Qg bWF0Y2hpbmcgaXRlbSBvbiB0aGUgc3VidGVzdAorCSAqIHNlbGVjdGlvbiBjb21tYW5kIGxpbmUg ZmxhZyBkZWNpZGVzIHdoZXRoZXIgdG8gcnVuIGEKKwkgKiBzdWJ0ZXN0LCBzZWUgaWd0X2NvcmUu YyBmb3IgZGV0YWlscy4gIElmIHRoZSBsaXN0IGlzIGVtcHR5LAorCSAqIHRoZSBleHBlY3RlZCBz dWJ0ZXN0IHNldCBpcyB1bmtub3duLCBzbyB3ZSBuZWVkIHRvIGFkZCAnKicKKwkgKiBmaXJzdCBz byB3ZSBjYW4gc3RhcnQgZXhjbHVkaW5nLgorCSAqLworCisJaWYgKGVudHJ5LT5zdWJ0ZXN0X2Nv dW50ID09IDApIHsKKwkJZW50cnktPnN1YnRlc3RfY291bnQrKzsKKwkJZW50cnktPnN1YnRlc3Rz ID0gcmVhbGxvYyhlbnRyeS0+c3VidGVzdHMsIGVudHJ5LT5zdWJ0ZXN0X2NvdW50ICogc2l6ZW9m KCplbnRyeS0+c3VidGVzdHMpKTsKKwkJZW50cnktPnN1YnRlc3RzWzBdID0gc3RyZHVwKCIqIik7 CisJfQorCisJZXhjbCA9IG1hbGxvYyhzdHJsZW4oc3VidGVzdCkgKyAyKTsKKwlleGNsWzBdID0g JyEnOworCXN0cmNweShleGNsICsgMSwgc3VidGVzdCk7CisKKwllbnRyeS0+c3VidGVzdF9jb3Vu dCsrOworCWVudHJ5LT5zdWJ0ZXN0cyA9IHJlYWxsb2MoZW50cnktPnN1YnRlc3RzLCBlbnRyeS0+ c3VidGVzdF9jb3VudCAqIHNpemVvZigqZW50cnktPnN1YnRlc3RzKSk7CisJZW50cnktPnN1YnRl c3RzW2VudHJ5LT5zdWJ0ZXN0X2NvdW50IC0gMV0gPSBleGNsOworfQorCitzdGF0aWMgYm9vbCBw cnVuZV9mcm9tX2pvdXJuYWwoc3RydWN0IGpvYl9saXN0X2VudHJ5ICplbnRyeSwgaW50IGZkKQor eworCWNoYXIgKnN1YnRlc3Q7CisJRklMRSAqZjsKKwlib29sIGFueV9wcnVuZWQgPSBmYWxzZTsK KworCS8qCisJICogRWFjaCBqb3VybmFsIGxpbmUgaXMgYSBzdWJ0ZXN0IHRoYXQgaGFzIGJlZW4g c3RhcnRlZCwgb3IKKwkgKiB0aGUgbGluZSAnZXhpdDokZXhpdGNvZGUgKHRpbWUpJywgb3IgJ3Rp bWVvdXQ6JGV4aXRjb2RlICh0aW1lKScuCisJICovCisKKwlmID0gZmRvcGVuKGZkLCAiciIpOwor CWlmICghZikKKwkJcmV0dXJuIGZhbHNlOworCisJd2hpbGUgKGZzY2FuZihmLCAiJW1zIiwgJnN1 YnRlc3QpID09IDEpIHsKKwkJaWYgKHN1YnRlc3RbMF0gPT0gJ1wwJykgeworCQkJLyogRU9GICov CisJCQlmcmVlKHN1YnRlc3QpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXN0cm5jbXAoc3Vi dGVzdCwgImV4aXQ6IiwgNSkpIHsKKwkJCS8qIEZ1bGx5IGRvbmUuIE1hcmsgdGhhdCBieSBtYWtp bmcgdGhlIGJpbmFyeSBuYW1lIGludmFsaWQuICovCisJCQlmc2NhbmYoZiwgIiAoJSpmcykiKTsK KwkJCWVudHJ5LT5iaW5hcnlbMF0gPSAnXDAnOworCQkJZnJlZShzdWJ0ZXN0KTsKKwkJCWNvbnRp bnVlOworCQl9CisKKwkJaWYgKCFzdHJuY21wKHN1YnRlc3QsICJ0aW1lb3V0OiIsIDgpKSB7CisJ CQlmc2NhbmYoZiwgIiAoJSpmcykiKTsKKwkJCWZyZWUoc3VidGVzdCk7CisJCQljb250aW51ZTsK KwkJfQorCisJCXBydW5lX3N1YnRlc3QoZW50cnksIHN1YnRlc3QpOworCisJCWZyZWUoc3VidGVz dCk7CisJCWFueV9wcnVuZWQgPSB0cnVlOworCX0KKworCWZjbG9zZShmKTsKKwlyZXR1cm4gYW55 X3BydW5lZDsKK30KKworc3RhdGljIGNoYXIgKmZpbGVuYW1lc1tdID0geworCSJqb3VybmFsLnR4 dCIsCisJIm91dC50eHQiLAorCSJlcnIudHh0IiwKKwkiZG1lc2cudHh0IiwKK307CisKK3N0YXRp YyBpbnQgb3Blbl9hdF9lbmQoaW50IGRpcmZkLCBjaGFyICpuYW1lKQoreworCWludCBmZCA9IG9w ZW5hdChkaXJmZCwgbmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fQ0xPRVhFQywgMDY2Nik7CisJ Y2hhciBsYXN0OworCisJaWYgKGZkID49IDApIHsKKwkJaWYgKGxzZWVrKGZkLCAtMSwgU0VFS19F TkQpID49IDAgJiYKKwkJICAgIHJlYWQoZmQsICZsYXN0LCAxKSA9PSAxICYmCisJCSAgICBsYXN0 ICE9ICdcbicpIHsKKwkJCXdyaXRlKGZkLCAiXG4iLCAxKTsKKwkJfQorCQlsc2VlayhmZCwgMCwg U0VFS19FTkQpOworCX0KKworCXJldHVybiBmZDsKK30KKworc3RhdGljIGludCBvcGVuX2Zvcl9y ZWFkaW5nKGludCBkaXJmZCwgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gb3BlbmF0KGRpcmZkLCBu YW1lLCBPX1JET05MWSk7Cit9CisKK2Jvb2wgb3Blbl9vdXRwdXRfZmlsZXMoaW50IGRpcmZkLCBp bnQgKmZkcywgYm9vbCB3cml0ZSkKK3sKKwlpbnQgaTsKKwlpbnQgKCpvcGVuZnVuYykoaW50LCBj aGFyKikgPSB3cml0ZSA/IG9wZW5fYXRfZW5kIDogb3Blbl9mb3JfcmVhZGluZzsKKworCWZvciAo aSA9IDA7IGkgPCBfRl9MQVNUOyBpKyspIHsKKwkJaWYgKChmZHNbaV0gPSBvcGVuZnVuYyhkaXJm ZCwgZmlsZW5hbWVzW2ldKSkgPCAwKSB7CisJCQl3aGlsZSAoLS1pID49IDApCisJCQkJY2xvc2Uo ZmRzW2ldKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQor Cit2b2lkIGNsb3NlX291dHB1dHMoaW50ICpmZHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAw OyBpIDwgX0ZfTEFTVDsgaSsrKSB7CisJCWNsb3NlKGZkc1tpXSk7CisJfQorfQorCitzdGF0aWMg dm9pZCBkdW1wX2RtZXNnKGludCBrbXNnZmQsIGludCBvdXRmZCkKK3sKKwkvKgorCSAqIFdyaXRl IGtlcm5lbCBtZXNzYWdlcyB0byB0aGUgbG9nIGZpbGUgdW50aWwgd2UgcmVhY2gKKwkgKiAnbm93 Jy4gVW5mb3J0dW5hdGVseSwgL2Rldi9rbXNnIGRvZXNuJ3Qgc3VwcG9ydCBzZWVraW5nIHRvCisJ ICogLTEgZnJvbSBTRUVLX0VORCBzbyB3ZSBuZWVkIHRvIHVzZSBhIHNlY29uZCBmZCB0byByZWFk IGEKKwkgKiBtZXNzYWdlIHRvIG1hdGNoIGFnYWluc3QsIG9yIHN0b3Agd2hlbiB3ZSByZWFjaCBF QUdBSU4uCisJICovCisKKwlpbnQgY29tcGFyZWZkID0gb3BlbigiL2Rldi9rbXNnIiwgT19SRE9O TFkgfCBPX05PTkJMT0NLKTsKKwl1bnNpZ25lZCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGxvbmcg c2VxLCBjbXBzZXEsIHVzZWM7CisJY2hhciBjb250OworCWNoYXIgYnVmWzI1Nl07CisJc3NpemVf dCByOworCisJaWYgKGNvbXBhcmVmZCA8IDApCisJCXJldHVybjsKKworCWlmIChmY250bChrbXNn ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spKQorCQlyZXR1cm47CisKKwl3aGlsZSAoMSkgeworCQlp ZiAoY29tcGFyZWZkID49IDApIHsKKwkJCXIgPSByZWFkKGNvbXBhcmVmZCwgYnVmLCBzaXplb2Yo YnVmKSAtIDEpOworCQkJaWYgKHIgPCAwKSB7CisJCQkJaWYgKGVycm5vICE9IEVBR0FJTiAmJiBl cnJubyAhPSBFUElQRSkKKwkJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlidWZbcl0gPSAn XDAnOworCQkJCWlmIChzc2NhbmYoYnVmLCAiJXUsJWxsdSwlbGx1LCVjOyIsCisJCQkJCSAgICZm bGFncywgJmNtcHNlcSwgJnVzZWMsICZjb250KSA9PSA0KSB7CisJCQkJCWNsb3NlKGNvbXBhcmVm ZCk7CisJCQkJCWNvbXBhcmVmZCA9IC0xOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXIgPSByZWFk KGttc2dmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJCWlmIChyIDw9IDApIHsKKwkJCWlmIChlcnJu byA9PSBFUElQRSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIElmIEVBR0FJTiwgd2Un cmUgZG9uZS4gSWYgc29tZSBvdGhlciBlcnJvciwKKwkJCSAqIHdlIGNhbid0IGRvIGFueXRoaW5n IGFueXdheS4KKwkJCSAqLworCQkJcmV0dXJuOworCQl9CisKKwkJd3JpdGUob3V0ZmQsIGJ1Ziwg cik7CisKKwkJaWYgKGNvbXBhcmVmZCA8IDAgJiYgc3NjYW5mKGJ1ZiwgIiV1LCVsbHUsJWxsdSwl YzsiLAorCQkJCQkgICAgJmZsYWdzLCAmc2VxLCAmdXNlYywgJmNvbnQpID09IDQpIHsKKwkJCWlm IChzZXEgPj0gY21wc2VxKQorCQkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIGJvb2wg a2lsbF9jaGlsZChib29sIHVzZV9zaWdraWxsLAorCQkgICAgICAgc3RydWN0IHNldHRpbmdzICpz ZXR0aW5ncywKKwkJICAgICAgIHBpZF90IGNoaWxkKQoreworCWludCBzaWcgPSB1c2Vfc2lna2ls bCA/IFNJR0tJTEwgOiBTSUdURVJNOworCisJLyoKKwkgKiBTZW5kIHRoZSBzaWduYWwgdG8gdGhl IGNoaWxkIGRpcmVjdGx5LCBhbmQgdG8gdGhlIGNoaWxkJ3MKKwkgKiBwcm9jZXNzIGdyb3VwLgor CSAqLworCWtpbGwoLWNoaWxkLCBzaWcpOworCWlmIChraWxsKGNoaWxkLCBzaWcpICYmIGVycm5v ID09IEVTUkNIKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2hpbGQgcHJvY2VzcyBkb2VzIG5vdCBl eGlzdC4gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLlxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisK KwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNoYXIgc3RhcnRpbmdfc3VidGVzdFtdID0gIlN0 YXJ0aW5nIHN1YnRlc3Q6ICI7CitzdGF0aWMgc2l6ZV90IHN0YXJ0aW5nX2xlbiA9IHNpemVvZihz dGFydGluZ19zdWJ0ZXN0KSAtIDE7CitzdGF0aWMgY2hhciBzdWJ0ZXN0X3Jlc3VsdF9iZWdbXSA9 ICJTdWJ0ZXN0ICI7CitzdGF0aWMgc2l6ZV90IHN1YnRlc3RfcmVzdWx0X2xlbiA9IHNpemVvZihz dWJ0ZXN0X3Jlc3VsdF9iZWcpIC0gMTsKKy8qCisgKiBSZXR1cm5zOgorICogID4wIC0gU3VjY2Vz cworICogID0wIC0gRmFpbHVyZSBleGVjdXRpbmcKKyAqICA8MCAtIFRpbWVvdXQgaGFwcGVuZWQs IG5lZWQgdG8gcmVjcmVhdGUgZnJvbSBqb3VybmFsCisgKi8KK3N0YXRpYyBpbnQgbW9uaXRvcl9v dXRwdXQocGlkX3QgY2hpbGQsCisJCQkgICBpbnQgb3V0ZmQsIGludCBlcnJmZCwgaW50IGttc2dm ZCwgaW50IHNpZ2ZkLAorCQkJICAgaW50ICpvdXRwdXRzLAorCQkJICAgc3RydWN0IHNldHRpbmdz ICpzZXR0aW5ncykKK3sKKwlmZF9zZXQgc2V0OworCWNoYXIgYnVmWzI1Nl07CisJY2hhciAqb3V0 YnVmID0gTlVMTDsKKwlzaXplX3Qgb3V0YnVmc2l6ZSA9IDA7CisJY2hhciBjdXJyZW50X3N1YnRl c3RbMjU2XSA9IHt9OworCXN0cnVjdCBzaWduYWxmZF9zaWdpbmZvIHNpZ2luZm87CisJc3NpemVf dCBzOworCWludCBuLCBzdGF0dXM7CisJaW50IG5mZHMgPSBvdXRmZDsKKwlpbnQgdGltZW91dCA9 IHNldHRpbmdzLT5pbmFjdGl2aXR5X3RpbWVvdXQ7CisJaW50IHRpbWVvdXRfaW50ZXJ2YWxzID0g MSwgaW50ZXJ2YWxzX2xlZnQ7CisJaW50IHdkX2V4dHJhID0gMTA7CisJaW50IGtpbGxlZCA9IDA7 IC8qIDEgPSBzaWd0ZXJtIHNlbnQsIDIgPSBzaWdraWxsIHNlbnQgKi8KKwlzdHJ1Y3QgdGltZXNw ZWMgdGltZV9iZWcsIHRpbWVfZW5kOworCWJvb2wgYWJvcnRpbmcgPSBmYWxzZTsKKworCWdldHRp bWUoJnRpbWVfYmVnKTsKKworCWlmIChlcnJmZCA+IG5mZHMpCisJCW5mZHMgPSBlcnJmZDsKKwlp ZiAoa21zZ2ZkID4gbmZkcykKKwkJbmZkcyA9IGttc2dmZDsKKwlpZiAoc2lnZmQgPiBuZmRzKQor CQluZmRzID0gc2lnZmQ7CisJbmZkcysrOworCisJaWYgKHRpbWVvdXQgPiAwKSB7CisJCS8qCisJ CSAqIFVzZSBvcmlnaW5hbCB0aW1lb3V0IHBsdXMgc29tZSBsZWV3YXkuIElmIHdlJ3JlIHN0aWxs CisJCSAqIGFsaXZlLCB3ZSB3YW50IHRvIGtpbGwgdGhlIHRlc3QgcHJvY2VzcyBpbnN0ZWFkIG9m IGN1dHRpbmcKKwkJICogcG93ZXIuCisJCSAqLworCQlpbnQgd2RfdGltZW91dCA9IHdhdGNoZG9n c19zZXRfdGltZW91dCh0aW1lb3V0ICsgd2RfZXh0cmEpOworCisJCWlmICh3ZF90aW1lb3V0IDwg dGltZW91dCArIHdkX2V4dHJhKSB7CisJCQkvKiBXYXRjaGRvZyB0aW1lb3V0IHNtYWxsZXIsIHNv IHBpbmcgaXQgbW9yZSBvZnRlbiAqLworCQkJaWYgKHdkX3RpbWVvdXQgLSB3ZF9leHRyYSA8IDAp CisJCQkJd2RfZXh0cmEgPSB3ZF90aW1lb3V0IC8gMjsKKwkJCXRpbWVvdXRfaW50ZXJ2YWxzID0g dGltZW91dCAvICh3ZF90aW1lb3V0IC0gd2RfZXh0cmEpOworCQkJaW50ZXJ2YWxzX2xlZnQgPSB0 aW1lb3V0X2ludGVydmFsczsKKwkJCXRpbWVvdXQgLz0gdGltZW91dF9pbnRlcnZhbHM7CisKKwkJ CWlmIChzZXR0aW5ncy0+bG9nX2xldmVsID49IExPR19MRVZFTF9WRVJCT1NFKSB7CisJCQkJcHJp bnRmKCJXYXRjaGRvZyBkb2Vzbid0IHN1cHBvcnQgdGhlIHRpbWVvdXQgd2UgcmVxdWVzdGVkIChz aG9ydGVuZWQgdG8gJWQgc2Vjb25kcykuXG4iCisJCQkJICAgICAgICJVc2luZyAlZCBpbnRlcnZh bHMgb2YgJWQgc2Vjb25kcy5cbiIsCisJCQkJICAgICAgIHdkX3RpbWVvdXQsIHRpbWVvdXRfaW50 ZXJ2YWxzLCB0aW1lb3V0KTsKKwkJCX0KKwkJfQorCX0KKworCXdoaWxlIChvdXRmZCA+PSAwIHx8 IGVycmZkID49IDAgfHwgc2lnZmQgPj0gMCkgeworCQlzdHJ1Y3QgdGltZXZhbCB0diA9IHsgLnR2 X3NlYyA9IHRpbWVvdXQgfTsKKworCQlGRF9aRVJPKCZzZXQpOworCQlpZiAob3V0ZmQgPj0gMCkK KwkJCUZEX1NFVChvdXRmZCwgJnNldCk7CisJCWlmIChlcnJmZCA+PSAwKQorCQkJRkRfU0VUKGVy cmZkLCAmc2V0KTsKKwkJaWYgKGttc2dmZCA+PSAwKQorCQkJRkRfU0VUKGttc2dmZCwgJnNldCk7 CisJCWlmIChzaWdmZCA+PSAwKQorCQkJRkRfU0VUKHNpZ2ZkLCAmc2V0KTsKKworCQluID0gc2Vs ZWN0KG5mZHMsICZzZXQsIE5VTEwsIE5VTEwsIHRpbWVvdXQgPT0gMCA/IE5VTEwgOiAmdHYpOwor CQlpZiAobiA8IDApIHsKKwkJCS8qIFRPRE8gKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYg KG4gPT0gMCkgeworCQkJaW50ZXJ2YWxzX2xlZnQtLTsKKwkJCWlmIChpbnRlcnZhbHNfbGVmdCkg eworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwaW5nX3dhdGNoZG9ncygpOworCisJCQlzd2l0 Y2ggKGtpbGxlZCkgeworCQkJY2FzZSAwOgorCQkJCWlmIChzZXR0aW5ncy0+bG9nX2xldmVsID49 IExPR19MRVZFTF9OT1JNQUwpIHsKKwkJCQkJcHJpbnRmKCJUaW1lb3V0LiBLaWxsaW5nIHRoZSBj dXJyZW50IHRlc3Qgd2l0aCBTSUdURVJNLlxuIik7CisJCQkJfQorCisJCQkJaWYgKCFraWxsX2No aWxkKGZhbHNlLCBzZXR0aW5ncywgY2hpbGQpKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlraWxsZWQg PSAxOworCisJCQkJLyoKKwkJCQkgKiBOb3cgY29udGludWUgdGhlIGxvb3AgYW5kIGxldCB0aGUK KwkJCQkgKiBkeWluZyBjaGlsZCBiZSBoYW5kbGVkIG5vcm1hbGx5LgorCQkJCSAqLworCQkJCXRp bWVvdXQgPSAyOyAvKiBUaW1lb3V0IGZvciB3YWl0aW5nIHNlbGVjdGVkIGJ5IGZhaXIgZGljZSBy b2xsLiAqLworCQkJCXdhdGNoZG9nc19zZXRfdGltZW91dCgyMCk7CisJCQkJaW50ZXJ2YWxzX2xl ZnQgPSB0aW1lb3V0X2ludGVydmFscyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJ aWYgKHNldHRpbmdzLT5sb2dfbGV2ZWwgPj0gTE9HX0xFVkVMX05PUk1BTCkgeworCQkJCQlwcmlu dGYoIlRpbWVvdXQuIEtpbGxpbmcgdGhlIGN1cnJlbnQgdGVzdCB3aXRoIFNJR0tJTEwuXG4iKTsK KwkJCQl9CisKKwkJCQlpZiAoIWtpbGxfY2hpbGQodHJ1ZSwgc2V0dGluZ3MsIGNoaWxkKSkKKwkJ CQkJcmV0dXJuIDA7CisKKwkJCQlraWxsZWQgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgor CQkJCS8qIE5vdGhpbmcgdGhhdCBjYW4gYmUgZG9uZSwgcmVhbGx5LiBMZXQncyB0ZWxsIHRoZSBj YWxsZXIgd2Ugd2FudCB0byBhYm9ydC4gKi8KKwkJCQlpZiAoc2V0dGluZ3MtPmxvZ19sZXZlbCA+ PSBMT0dfTEVWRUxfTk9STUFMKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiQ2hpbGQgcmVmdXNl cyB0byBkaWUuIEFib3J0aW5nLlxuIik7CisJCQkJfQorCQkJCWNsb3NlX3dhdGNoZG9ncyhzZXR0 aW5ncyk7CisJCQkJZnJlZShvdXRidWYpOworCQkJCWNsb3NlKG91dGZkKTsKKwkJCQljbG9zZShl cnJmZCk7CisJCQkJY2xvc2Uoa21zZ2ZkKTsKKwkJCQljbG9zZShzaWdmZCk7CisJCQkJcmV0dXJu IDA7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaW50ZXJ2YWxzX2xlZnQgPSB0aW1l b3V0X2ludGVydmFsczsKKwkJcGluZ193YXRjaGRvZ3MoKTsKKworCQlpZiAob3V0ZmQgPj0gMCAm JiBGRF9JU1NFVChvdXRmZCwgJnNldCkpIHsKKwkJCWNoYXIgKm5ld2xpbmU7CisKKwkJCXMgPSBy ZWFkKG91dGZkLCBidWYsIHNpemVvZihidWYpKTsKKwkJCWlmIChzIDw9IDApIHsKKwkJCQlpZiAo cyA8IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciByZWFkaW5nIHRlc3QncyBzdGRv dXQ6ICVzXG4iLAorCQkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCQl9CisKKwkJCQljbG9zZShv dXRmZCk7CisJCQkJb3V0ZmQgPSAtMTsKKwkJCQlnb3RvIG91dF9lbmQ7CisJCQl9CisKKwkJCXdy aXRlKG91dHB1dHNbX0ZfT1VUXSwgYnVmLCBzKTsKKwkJCWlmIChzZXR0aW5ncy0+c3luYykgewor CQkJCWZkYXRhc3luYyhvdXRwdXRzW19GX09VVF0pOworCQkJfQorCisJCQlvdXRidWYgPSByZWFs bG9jKG91dGJ1Ziwgb3V0YnVmc2l6ZSArIHMpOworCQkJbWVtY3B5KG91dGJ1ZiArIG91dGJ1ZnNp emUsIGJ1Ziwgcyk7CisJCQlvdXRidWZzaXplICs9IHM7CisKKwkJCXdoaWxlICgobmV3bGluZSA9 IG1lbWNocihvdXRidWYsICdcbicsIG91dGJ1ZnNpemUpKSAhPSBOVUxMKSB7CisJCQkJc2l6ZV90 IGxpbmVsZW4gPSBuZXdsaW5lIC0gb3V0YnVmICsgMTsKKworCQkJCWlmIChsaW5lbGVuID4gc3Rh cnRpbmdfbGVuICYmCisJCQkJICAgICFtZW1jbXAob3V0YnVmLCBzdGFydGluZ19zdWJ0ZXN0LCBz dGFydGluZ19sZW4pKSB7CisJCQkJCXdyaXRlKG91dHB1dHNbX0ZfSk9VUk5BTF0sIG91dGJ1ZiAr IHN0YXJ0aW5nX2xlbiwKKwkJCQkJICAgICAgbGluZWxlbiAtIHN0YXJ0aW5nX2xlbik7CisJCQkJ CW1lbWNweShjdXJyZW50X3N1YnRlc3QsIG91dGJ1ZiArIHN0YXJ0aW5nX2xlbiwKKwkJCQkJICAg ICAgIGxpbmVsZW4gLSBzdGFydGluZ19sZW4pOworCQkJCQljdXJyZW50X3N1YnRlc3RbbGluZWxl biAtIHN0YXJ0aW5nX2xlbl0gPSAnXDAnOworCisJCQkJCWlmIChzZXR0aW5ncy0+bG9nX2xldmVs ID49IExPR19MRVZFTF9WRVJCT1NFKSB7CisJCQkJCQlmd3JpdGUob3V0YnVmLCAxLCBsaW5lbGVu LCBzdGRvdXQpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChsaW5lbGVuID4gc3VidGVzdF9yZXN1 bHRfbGVuICYmCisJCQkJICAgICFtZW1jbXAob3V0YnVmLCBzdWJ0ZXN0X3Jlc3VsdF9iZWcsIHN1 YnRlc3RfcmVzdWx0X2xlbikpIHsKKwkJCQkJY2hhciAqZGVsaW0gPSBtZW1jaHIob3V0YnVmLCAn OicsIGxpbmVsZW4pOworCisJCQkJCWlmIChkZWxpbSAhPSBOVUxMKSB7CisJCQkJCQlzaXplX3Qg c3VidGVzdGxlbiA9IGRlbGltIC0gb3V0YnVmIC0gc3VidGVzdF9yZXN1bHRfbGVuOworCQkJCQkJ aWYgKG1lbWNtcChjdXJyZW50X3N1YnRlc3QsIG91dGJ1ZiArIHN1YnRlc3RfcmVzdWx0X2xlbiwK KwkJCQkJCQkgICBzdWJ0ZXN0bGVuKSkgeworCQkJCQkJCS8qIFJlc3VsdCBmb3IgYSB0ZXN0IHRo YXQgZGlkbid0IGV2ZXIgc3RhcnQgKi8KKwkJCQkJCQl3cml0ZShvdXRwdXRzW19GX0pPVVJOQUxd LAorCQkJCQkJCSAgICAgIG91dGJ1ZiArIHN1YnRlc3RfcmVzdWx0X2xlbiwKKwkJCQkJCQkgICAg ICBzdWJ0ZXN0bGVuKTsKKwkJCQkJCQl3cml0ZShvdXRwdXRzW19GX0pPVVJOQUxdLCAiXG4iLCAx KTsKKwkJCQkJCQlpZiAoc2V0dGluZ3MtPnN5bmMpIHsKKwkJCQkJCQkJZmRhdGFzeW5jKG91dHB1 dHNbX0ZfSk9VUk5BTF0pOworCQkJCQkJCX0KKwkJCQkJCQljdXJyZW50X3N1YnRlc3RbMF0gPSAn XDAnOworCQkJCQkJfQorCisJCQkJCQlpZiAoc2V0dGluZ3MtPmxvZ19sZXZlbCA+PSBMT0dfTEVW RUxfVkVSQk9TRSkgeworCQkJCQkJCWZ3cml0ZShvdXRidWYsIDEsIGxpbmVsZW4sIHN0ZG91dCk7 CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQltZW1tb3ZlKG91dGJ1ZiwgbmV3bGluZSAr IDEsIG91dGJ1ZnNpemUgLSBsaW5lbGVuKTsKKwkJCQlvdXRidWZzaXplIC09IGxpbmVsZW47CisJ CQl9CisJCX0KKwlvdXRfZW5kOgorCisJCWlmIChlcnJmZCA+PSAwICYmIEZEX0lTU0VUKGVycmZk LCAmc2V0KSkgeworCQkJcyA9IHJlYWQoZXJyZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJaWYg KHMgPD0gMCkgeworCQkJCWlmIChzIDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9y IHJlYWRpbmcgdGVzdCdzIHN0ZGVycjogJXNcbiIsCisJCQkJCQlzdHJlcnJvcihlcnJubykpOwor CQkJCX0KKwkJCQljbG9zZShlcnJmZCk7CisJCQkJZXJyZmQgPSAtMTsKKwkJCX0gZWxzZSB7CisJ CQkJd3JpdGUob3V0cHV0c1tfRl9FUlJdLCBidWYsIHMpOworCQkJCWlmIChzZXR0aW5ncy0+c3lu YykgeworCQkJCQlmZGF0YXN5bmMob3V0cHV0c1tfRl9FUlJdKTsKKwkJCQl9CisJCQl9CisJCX0K KworCQlpZiAoa21zZ2ZkID49IDAgJiYgRkRfSVNTRVQoa21zZ2ZkLCAmc2V0KSkgeworCQkJcyA9 IHJlYWQoa21zZ2ZkLCBidWYsIHNpemVvZihidWYpKTsKKwkJCWlmIChzIDwgMCkgeworCQkJCWlm IChlcnJubyAhPSBFUElQRSkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcg ZnJvbSBrbXNnLCBzdG9wcGluZyBtb25pdG9yaW5nOiAlc1xuIiwKKwkJCQkJCXN0cmVycm9yKGVy cm5vKSk7CisJCQkJCWNsb3NlKGttc2dmZCk7CisJCQkJCWttc2dmZCA9IC0xOworCQkJCX0KKwkJ CX0gZWxzZSB7CisJCQkJd3JpdGUob3V0cHV0c1tfRl9ETUVTR10sIGJ1Ziwgcyk7CisJCQkJaWYg KHNldHRpbmdzLT5zeW5jKSB7CisJCQkJCWZkYXRhc3luYyhvdXRwdXRzW19GX0RNRVNHXSk7CisJ CQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHNpZ2ZkID49IDAgJiYgRkRfSVNTRVQoc2lnZmQsICZz ZXQpKSB7CisJCQlkb3VibGUgdGltZTsKKworCQkJcyA9IHJlYWQoc2lnZmQsICZzaWdpbmZvLCBz aXplb2Yoc2lnaW5mbykpOworCQkJaWYgKHMgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJF cnJvciByZWFkaW5nIGZyb20gc2lnbmFsZmQ6ICVzXG4iLAorCQkJCQlzdHJlcnJvcihlcnJubykp OworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChzaWdpbmZvLnNzaV9zaWdubyA9PSBTSUdD SExEKSB7CisJCQkJaWYgKGNoaWxkICE9IHdhaXRwaWQoY2hpbGQsICZzdGF0dXMsIFdOT0hBTkcp KSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlYXAgY2hpbGRcbiIpOworCQkJ CQlzdGF0dXMgPSA5OTk5OworCQkJCX0gZWxzZSBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKwkJ CQkJc3RhdHVzID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwkJCQkJaWYgKHN0YXR1cyA+PSAxMjgp IHsKKwkJCQkJCXN0YXR1cyA9IDEyOCAtIHN0YXR1czsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAo V0lGU0lHTkFMRUQoc3RhdHVzKSkgeworCQkJCQlzdGF0dXMgPSAtV1RFUk1TSUcoc3RhdHVzKTsK KwkJCQl9IGVsc2UgeworCQkJCQlzdGF0dXMgPSA5OTk5OworCQkJCX0KKwkJCX0gZWxzZSB7CisJ CQkJLyogV2UncmUgZHlpbmcsIHNvIHdlJ3JlIHRha2luZyB0aGVtIHdpdGggdXMgKi8KKwkJCQlp ZiAoc2V0dGluZ3MtPmxvZ19sZXZlbCA+PSBMT0dfTEVWRUxfTk9STUFMKQorCQkJCQlwcmludGYo IkFib3J0IHJlcXVlc3RlZCwgdGVybWluYXRpbmcgY2hpbGRyZW5cbiIpOworCisJCQkJaWYgKCFr aWxsX2NoaWxkKGZhbHNlLCBzZXR0aW5ncywgY2hpbGQpKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlh Ym9ydGluZyA9IHRydWU7CisJCQkJdGltZW91dCA9IDI7CisJCQkJa2lsbGVkID0gMTsKKworCQkJ CWNvbnRpbnVlOworCQkJfQorCisJCQlnZXR0aW1lKCZ0aW1lX2VuZCk7CisKKwkJCXRpbWUgPSB0 aW1lX2VsYXBzZWQoJnRpbWVfYmVnLCAmdGltZV9lbmQpOworCQkJaWYgKHRpbWUgPCAwLjApCisJ CQkJdGltZSA9IDAuMDsKKworCQkJaWYgKCFhYm9ydGluZykgeworCQkJCWRwcmludGYob3V0cHV0 c1tfRl9KT1VSTkFMXSwgIiVzOiVkICglLjNmcylcbiIsCisJCQkJCWtpbGxlZCA/ICJ0aW1lb3V0 IiA6ICJleGl0IiwKKwkJCQkJc3RhdHVzLCB0aW1lKTsKKwkJCQlpZiAoc2V0dGluZ3MtPnN5bmMp IHsKKwkJCQkJZmRhdGFzeW5jKG91dHB1dHNbX0ZfSk9VUk5BTF0pOworCQkJCX0KKwkJCX0KKwor CQkJY2xvc2Uoc2lnZmQpOworCQkJc2lnZmQgPSAtMTsKKwkJCWNoaWxkID0gMDsKKwkJfQorCX0K KworCWR1bXBfZG1lc2coa21zZ2ZkLCBvdXRwdXRzW19GX0RNRVNHXSk7CisJaWYgKHNldHRpbmdz LT5zeW5jKQorCQlmZGF0YXN5bmMob3V0cHV0c1tfRl9ETUVTR10pOworCisJZnJlZShvdXRidWYp OworCWNsb3NlKG91dGZkKTsKKwljbG9zZShlcnJmZCk7CisJY2xvc2Uoa21zZ2ZkKTsKKwljbG9z ZShzaWdmZCk7CisKKwlpZiAoYWJvcnRpbmcpCisJCXJldHVybiAwOworCisJcmV0dXJuIGtpbGxl ZCA/IC0xIDogMTsKK30KKworc3RhdGljIHZvaWQgZXhlY3V0ZV90ZXN0X3Byb2Nlc3MoaW50IG91 dGZkLCBpbnQgZXJyZmQsCisJCQkJIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MsCisJCQkJIHN0 cnVjdCBqb2JfbGlzdF9lbnRyeSAqZW50cnkpCit7CisJY2hhciAqYXJndls0XSA9IHt9OworCXNp emVfdCByb290bGVuOworCisJZHVwMihvdXRmZCwgU1RET1VUX0ZJTEVOTyk7CisJZHVwMihlcnJm ZCwgU1RERVJSX0ZJTEVOTyk7CisKKwlzZXRwZ2lkKDAsIDApOworCisJcm9vdGxlbiA9IHN0cmxl bihzZXR0aW5ncy0+dGVzdF9yb290KTsKKwlhcmd2WzBdID0gbWFsbG9jKHJvb3RsZW4gKyBzdHJs ZW4oZW50cnktPmJpbmFyeSkgKyAyKTsKKwlzdHJjcHkoYXJndlswXSwgc2V0dGluZ3MtPnRlc3Rf cm9vdCk7CisJYXJndlswXVtyb290bGVuXSA9ICcvJzsKKwlzdHJjcHkoYXJndlswXSArIHJvb3Rs ZW4gKyAxLCBlbnRyeS0+YmluYXJ5KTsKKworCWlmIChlbnRyeS0+c3VidGVzdF9jb3VudCkgewor CQlzaXplX3QgYXJnc2l6ZTsKKwkJc2l6ZV90IGk7CisKKwkJYXJndlsxXSA9ICItLXJ1bi1zdWJ0 ZXN0IjsKKwkJYXJnc2l6ZSA9IHN0cmxlbihlbnRyeS0+c3VidGVzdHNbMF0pOworCQlhcmd2WzJd ID0gbWFsbG9jKGFyZ3NpemUgKyAxKTsKKwkJc3RyY3B5KGFyZ3ZbMl0sIGVudHJ5LT5zdWJ0ZXN0 c1swXSk7CisKKwkJZm9yIChpID0gMTsgaSA8IGVudHJ5LT5zdWJ0ZXN0X2NvdW50OyBpKyspIHsK KwkJCWNoYXIgKnN1YiA9IGVudHJ5LT5zdWJ0ZXN0c1tpXTsKKwkJCXNpemVfdCBzdWJsZW4gPSBz dHJsZW4oc3ViKTsKKworCQkJYXJndlsyXSA9IHJlYWxsb2MoYXJndlsyXSwgYXJnc2l6ZSArIHN1 YmxlbiArIDIpOworCQkJYXJndlsyXVthcmdzaXplXSA9ICcsJzsKKwkJCXN0cmNweShhcmd2WzJd ICsgYXJnc2l6ZSArIDEsIHN1Yik7CisJCQlhcmdzaXplICs9IHN1YmxlbiArIDE7CisJCX0KKwl9 CisKKwlleGVjdihhcmd2WzBdLCBhcmd2KTsKKwlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBleGVj dXRlICVzXG4iLCBhcmd2WzBdKTsKKwlleGl0KDc5KTsKK30KKworc3RhdGljIGludCBkaWdpdHMo c2l6ZV90IG51bSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3aGlsZSAobnVtKSB7CisJCW51bSAvPSAx MDsKKwkJcmV0Kys7CisJfQorCisJaWYgKHJldCA9PSAwKSByZXQrKzsKKwlyZXR1cm4gcmV0Owor fQorCisvKgorICogUmV0dXJuczoKKyAqICA+MCAtIFN1Y2Nlc3MKKyAqICA9MCAtIEZhaWx1cmUg ZXhlY3V0aW5nCisgKiAgPDAgLSBUaW1lb3V0IGhhcHBlbmVkLCBuZWVkIHRvIHJlY3JlYXRlIGZy b20gam91cm5hbAorICovCitzdGF0aWMgaW50IGV4ZWN1dGVfZW50cnkoc2l6ZV90IGlkeCwKKwkJ CSAgc2l6ZV90IHRvdGFsLAorCQkJICBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJICBz dHJ1Y3Qgam9iX2xpc3RfZW50cnkgKmVudHJ5LAorCQkJICBpbnQgdGVzdGRpcmZkLCBpbnQgcmVz ZGlyZmQpCit7CisJaW50IGRpcmZkOworCWludCBvdXRwdXRzW19GX0xBU1RdOworCWludCBrbXNn ZmQ7CisJaW50IHNpZ2ZkOworCXNpZ3NldF90IG1hc2s7CisJaW50IG91dHBpcGVbMl0gPSB7IC0x LCAtMSB9OworCWludCBlcnJwaXBlWzJdID0geyAtMSwgLTEgfTsKKwljaGFyIG5hbWVbMzJdOwor CXBpZF90IGNoaWxkOworCWludCByZXN1bHQ7CisKKwlzbnByaW50ZihuYW1lLCAzMiwgIiV6ZCIs IGlkeCk7CisJbWtkaXJhdChyZXNkaXJmZCwgbmFtZSwgMDc3Nyk7CisJaWYgKChkaXJmZCA9IG9w ZW5hdChyZXNkaXJmZCwgbmFtZSwgT19ESVJFQ1RPUlkgfCBPX1JET05MWSB8IE9fQ0xPRVhFQykp IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGFjY2Vzc2luZyBpbmRpdmlkdWFsIHRl c3QgcmVzdWx0IGRpcmVjdG9yeVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghb3Blbl9v dXRwdXRfZmlsZXMoZGlyZmQsIG91dHB1dHMsIHRydWUpKSB7CisJCWNsb3NlKGRpcmZkKTsKKwkJ ZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlc1xuIik7CisJCXJldHVy biAwOworCX0KKworCWlmIChzZXR0aW5ncy0+c3luYykgeworCQlmc3luYyhkaXJmZCk7CisJCWZz eW5jKHJlc2RpcmZkKTsKKwl9CisKKwlpZiAocGlwZShvdXRwaXBlKSB8fCBwaXBlKGVycnBpcGUp KSB7CisJCWNsb3NlX291dHB1dHMob3V0cHV0cyk7CisJCWNsb3NlKGRpcmZkKTsKKwkJY2xvc2Uo b3V0cGlwZVswXSk7CisJCWNsb3NlKG91dHBpcGVbMV0pOworCQljbG9zZShlcnJwaXBlWzBdKTsK KwkJY2xvc2UoZXJycGlwZVsxXSk7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcg cGlwZXM6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAo KGttc2dmZCA9IG9wZW4oIi9kZXYva21zZyIsIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkgPCAwKSB7 CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogQ2Fubm90IG9wZW4gL2Rldi9rbXNnXG4iKTsK Kwl9IGVsc2UgeworCQkvKiBUT0RPOiBDaGVja2luZyBvZiBhYm9ydCBjb25kaXRpb25zIGluIHBy ZS1leGVjdXRlIGRtZXNnICovCisJCWxzZWVrKGttc2dmZCwgMCwgU0VFS19FTkQpOworCX0KKwor CXNpZ2VtcHR5c2V0KCZtYXNrKTsKKwlzaWdhZGRzZXQoJm1hc2ssIFNJR0NITEQpOworCXNpZ2Fk ZHNldCgmbWFzaywgU0lHSU5UKTsKKwlzaWdhZGRzZXQoJm1hc2ssIFNJR1RFUk0pOworCXNpZ2Fk ZHNldCgmbWFzaywgU0lHUVVJVCk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgTlVM TCk7CisJc2lnZmQgPSBzaWduYWxmZCgtMSwgJm1hc2ssIE9fQ0xPRVhFQyk7CisKKwlpZiAoc2ln ZmQgPCAwKSB7CisJCS8qIFRPRE86IEhhbmRsZSBiZXR0ZXIgKi8KKwkJZnByaW50ZihzdGRlcnIs ICJDYW5ub3QgbW9uaXRvciBjaGlsZCBwcm9jZXNzIHdpdGggc2lnbmFsZmRcbiIpOworCQljbG9z ZShvdXRwaXBlWzBdKTsKKwkJY2xvc2UoZXJycGlwZVswXSk7CisJCWNsb3NlKG91dHBpcGVbMV0p OworCQljbG9zZShlcnJwaXBlWzFdKTsKKwkJY2xvc2Uoa21zZ2ZkKTsKKwkJY2xvc2Vfb3V0cHV0 cyhvdXRwdXRzKTsKKwkJY2xvc2UoZGlyZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2V0 dGluZ3MtPmxvZ19sZXZlbCA+PSBMT0dfTEVWRUxfTk9STUFMKSB7CisJCWludCB3aWR0aCA9IGRp Z2l0cyh0b3RhbCk7CisJCXByaW50ZigiWyUwKnpkLyUwKnpkXSAlcyIsIHdpZHRoLCBpZHggKyAx LCB3aWR0aCwgdG90YWwsIGVudHJ5LT5iaW5hcnkpOworCQlpZiAoZW50cnktPnN1YnRlc3RfY291 bnQgPiAwKSB7CisJCQlzaXplX3QgaTsKKwkJCWNoYXIgKmRlbGltID0gIiI7CisKKwkJCXByaW50 ZigiICgiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBlbnRyeS0+c3VidGVzdF9jb3VudDsgaSsrKSB7 CisJCQkJcHJpbnRmKCIlcyVzIiwgZGVsaW0sIGVudHJ5LT5zdWJ0ZXN0c1tpXSk7CisJCQkJZGVs aW0gPSAiLCAiOworCQkJfQorCQkJcHJpbnRmKCIpIik7CisJCX0KKwkJcHJpbnRmKCJcbiIpOwor CX0KKworCWlmICgoY2hpbGQgPSBmb3JrKCkpKSB7CisJCWludCBvdXRmZCA9IG91dHBpcGVbMF07 CisJCWludCBlcnJmZCA9IGVycnBpcGVbMF07CisJCWNsb3NlKG91dHBpcGVbMV0pOworCQljbG9z ZShlcnJwaXBlWzFdKTsKKworCQlyZXN1bHQgPSBtb25pdG9yX291dHB1dChjaGlsZCwgb3V0ZmQs IGVycmZkLCBrbXNnZmQsIHNpZ2ZkLAorCQkJCQlvdXRwdXRzLCBzZXR0aW5ncyk7CisJfSBlbHNl IHsKKwkJaW50IG91dGZkID0gb3V0cGlwZVsxXTsKKwkJaW50IGVycmZkID0gZXJycGlwZVsxXTsK KwkJY2xvc2Uob3V0cGlwZVswXSk7CisJCWNsb3NlKGVycnBpcGVbMF0pOworCisJCXNpZ3Byb2Nt YXNrKFNJR19VTkJMT0NLLCAmbWFzaywgTlVMTCk7CisKKwkJc2V0ZW52KCJJR1RfU0VOVElORUxf T05fU1RERVJSIiwgIjEiLCAxKTsKKworCQlleGVjdXRlX3Rlc3RfcHJvY2VzcyhvdXRmZCwgZXJy ZmQsIHNldHRpbmdzLCBlbnRyeSk7CisJfQorCisJY2xvc2Uob3V0cGlwZVsxXSk7CisJY2xvc2Uo ZXJycGlwZVsxXSk7CisJY2xvc2Uoa21zZ2ZkKTsKKwljbG9zZV9vdXRwdXRzKG91dHB1dHMpOwor CWNsb3NlKGRpcmZkKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBib29sIGNsZWFy X3Rlc3RfcmVzdWx0X2RpcmVjdG9yeShpbnQgZGlyZmQpCit7CisJaWYgKHVubGlua2F0KGRpcmZk LCAib3V0LnR4dCIsIDApIHx8CisJICAgIHVubGlua2F0KGRpcmZkLCAiZXJyLnR4dCIsIDApIHx8 CisJICAgIHVubGlua2F0KGRpcmZkLCAiZG1lc2cudHh0IiwgMCkgfHwKKwkgICAgdW5saW5rYXQo ZGlyZmQsICJqb3VybmFsLnR4dCIsIDApKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJ CWZwcmludGYoc3RkZXJyLCAiRXJyb3IgY2xlYXJpbmcgdGVzdCByZXN1bHQgZGlyZWN0b3JpZXM6 ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9 CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2xlYXJfb2xkX3Jlc3VsdHMoY2hh ciAqcGF0aCkKK3sKKwlpbnQgZGlyZmQ7CisJc2l6ZV90IGk7CisKKwlpZiAoKGRpcmZkID0gb3Bl bihwYXRoLCBPX0RJUkVDVE9SWSB8IE9fUkRPTkxZKSkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBF Tk9FTlQpIHsKKwkJCS8qIFN1Y2Nlc3NmdWxseSBjbGVhcmVkIGlmIGl0IGRvZXNuJ3QgZXZlbiBl eGlzdCAqLworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9y IGNsZWFyaW5nIG9sZCByZXN1bHRzOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJu IGZhbHNlOworCX0KKworCWlmICh1bmxpbmthdChkaXJmZCwgInVuYW1lLnR4dCIsIDApICYmIGVy cm5vICE9IEVOT0VOVCkgeworCQljbG9zZShkaXJmZCk7CisJCWZwcmludGYoc3RkZXJyLCAiRXJy b3IgY2xlYXJpbmcgb2xkIHJlc3VsdHM6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1 cm4gZmFsc2U7CisJfQorCisJZm9yIChpID0gMDsgdHJ1ZTsgaSsrKSB7CisJCWNoYXIgbmFtZVsz Ml07CisJCWludCByZXNkaXJmZDsKKworCQlzbnByaW50ZihuYW1lLCAzMiwgIiV6ZCIsIGkpOwor CQlpZiAoKHJlc2RpcmZkID0gb3BlbmF0KGRpcmZkLCBuYW1lLCBPX0RJUkVDVE9SWSB8IE9fUkRP TkxZKSkgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKCFjbGVhcl90ZXN0X3Jlc3VsdF9kaXJlY3Rv cnkocmVzZGlyZmQpKSB7CisJCQljbG9zZShyZXNkaXJmZCk7CisJCQljbG9zZShkaXJmZCk7CisJ CQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJY2xvc2UocmVzZGlyZmQpOworCQl1bmxpbmthdChkaXJm ZCwgbmFtZSwgQVRfUkVNT1ZFRElSKTsKKwl9CisKKwljbG9zZShkaXJmZCk7CisKKwlyZXR1cm4g dHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaW5pdGlhbGl6ZV9leGVjdXRlX2Zyb21fcmVzdW1lKHN0 cnVjdCBleGVjdXRlX3N0YXRlICpzdGF0ZSwKKwkJCQkJICAgc3RydWN0IHNldHRpbmdzICpvcmln X3NldHRpbmdzLAorCQkJCQkgICBzdHJ1Y3Qgam9iX2xpc3QgKm9yaWdfam9iX2xpc3QpCit7CisJ c3RydWN0IHNldHRpbmdzIHNldHRpbmdzOworCXN0cnVjdCBqb2JfbGlzdCBsaXN0OworCXN0cnVj dCBqb2JfbGlzdF9lbnRyeSAqZW50cnk7CisJaW50IGRpcmZkLCByZXNkaXJmZCwgZmQsIGk7CisK Kwlpbml0X3NldHRpbmdzKCZzZXR0aW5ncyk7CisJaW5pdF9qb2JfbGlzdCgmbGlzdCk7CisKKwlp ZiAoKGRpcmZkID0gb3BlbihvcmlnX3NldHRpbmdzLT5yZXN1bHRzX3BhdGgsIE9fRElSRUNUT1JZ IHwgT19SRE9OTFkpKSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCWlmICghcmVhZF9zZXR0aW5n cygmc2V0dGluZ3MsIGRpcmZkKSB8fAorCSAgICAhcmVhZF9qb2JfbGlzdCgmbGlzdCwgZGlyZmQp KSB7CisJCWNsb3NlKGRpcmZkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWZvciAoaSA9IGxp c3Quc2l6ZTsgaSA+PSAwOyBpLS0pIHsKKwkJY2hhciBuYW1lWzMyXTsKKworCQlzbnByaW50Zihu YW1lLCAzMiwgIiVkIiwgaSk7CisJCWlmICgocmVzZGlyZmQgPSBvcGVuYXQoZGlyZmQsIG5hbWUs IE9fRElSRUNUT1JZIHwgT19SRE9OTFkpKSA+PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwor CWlmIChpIDwgMCkgeworCQkvKiBOb3RoaW5nIGhhcyBiZWVuIGV4ZWN1dGVkIHlldCwgc3RhdGUg aXMgZmluZSBhcyBpcyAqLworCQlnb3RvIHN1Y2Nlc3M7CisJfQorCisJZW50cnkgPSAmbGlzdC5l bnRyaWVzW2ldOworCXN0YXRlLT5uZXh0ID0gaTsKKwlpZiAoKGZkID0gb3BlbmF0KHJlc2RpcmZk LCBmaWxlbmFtZXNbX0ZfSk9VUk5BTF0sIE9fUkRPTkxZKSkgPj0gMCkgeworCQlpZiAoIXBydW5l X2Zyb21fam91cm5hbChlbnRyeSwgZmQpKSB7CisJCQkvKgorCQkJICogVGhlIHRlc3QgZG9lcyBu b3QgaGF2ZSBzdWJ0ZXN0cywgb3IKKwkJCSAqIGluY29tcGxldGVkIGJlZm9yZSB0aGUgZmlyc3Qg c3VidGVzdAorCQkJICogYmVnYW4uIEVpdGhlciB3YXksIG5vdCBzdWl0YWJsZSB0bworCQkJICog cmUtcnVuLgorCQkJICovCisJCQlzdGF0ZS0+bmV4dCA9IGkgKyAxOworCQl9IGVsc2UgaWYgKGVu dHJ5LT5iaW5hcnlbMF0gPT0gJ1wwJykgeworCQkJLyogVGhpcyB0ZXN0IGlzIGZ1bGx5IGNvbXBs ZXRlZCAqLworCQkJc3RhdGUtPm5leHQgPSBpICsgMTsKKwkJfQorCisJCWNsb3NlKGZkKTsKKwl9 CisKKyBzdWNjZXNzOgorCWZyZWVfc2V0dGluZ3Mob3JpZ19zZXR0aW5ncyk7CisJZnJlZV9qb2Jf bGlzdChvcmlnX2pvYl9saXN0KTsKKwkqb3JpZ19zZXR0aW5ncyA9IHNldHRpbmdzOworCSpvcmln X2pvYl9saXN0ID0gbGlzdDsKKwljbG9zZShyZXNkaXJmZCk7CisJY2xvc2UoZGlyZmQpOworCisJ cmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaW5pdGlhbGl6ZV9leGVjdXRlX3N0YXRlKHN0cnVjdCBl eGVjdXRlX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3Ms CisJCQkgICAgICBzdHJ1Y3Qgam9iX2xpc3QgKmpvYl9saXN0KQoreworCW1lbXNldChzdGF0ZSwg MCwgc2l6ZW9mKCpzdGF0ZSkpOworCisJaWYgKCF2YWxpZGF0ZV9zZXR0aW5ncyhzZXR0aW5ncykp CisJCXJldHVybiBmYWxzZTsKKworCWlmIChzZXR0aW5ncy0+b3ZlcndyaXRlICYmCisJICAgICFj bGVhcl9vbGRfcmVzdWx0cyhzZXR0aW5ncy0+cmVzdWx0c19wYXRoKSkKKwkJcmV0dXJuIGZhbHNl OworCisJaWYgKCFzZXJpYWxpemVfc2V0dGluZ3Moc2V0dGluZ3MpIHx8CisJICAgICFzZXJpYWxp emVfam9iX2xpc3Qoam9iX2xpc3QsIHNldHRpbmdzKSkKKwkJcmV0dXJuIGluaXRpYWxpemVfZXhl Y3V0ZV9mcm9tX3Jlc3VtZShzdGF0ZSwgc2V0dGluZ3MsIGpvYl9saXN0KTsKKworCXJldHVybiB0 cnVlOworfQorCitib29sIGV4ZWN1dGUoc3RydWN0IGV4ZWN1dGVfc3RhdGUgKnN0YXRlLAorCSAg ICAgc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywKKwkgICAgIHN0cnVjdCBqb2JfbGlzdCAqam9i X2xpc3QpCit7CisJc3RydWN0IHV0c25hbWUgdW5hbWVidWY7CisJaW50IHJlc2RpcmZkLCB0ZXN0 ZGlyZmQsIHVuYW1lZmQ7CisKKwlpZiAoKHJlc2RpcmZkID0gb3BlbihzZXR0aW5ncy0+cmVzdWx0 c19wYXRoLCBPX0RJUkVDVE9SWSB8IE9fUkRPTkxZKSkgPCAwKSB7CisJCS8qIEluaXRpYWxpemUg c3RhdGUgc2hvdWxkIGhhdmUgZG9uZSB0aGlzICovCisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6 IEZhaWx1cmUgb3BlbmluZyByZXN1bHRzIHBhdGggJXNcbiIsCisJCQlzZXR0aW5ncy0+cmVzdWx0 c19wYXRoKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICgodGVzdGRpcmZkID0gb3Blbihz ZXR0aW5ncy0+dGVzdF9yb290LCBPX0RJUkVDVE9SWSB8IE9fUkRPTkxZKSkgPCAwKSB7CisJCWZw cmludGYoc3RkZXJyLCAiRXJyb3I6IEZhaWx1cmUgb3BlbmluZyB0ZXN0IHJvb3QgJXNcbiIsCisJ CQlzZXR0aW5ncy0+dGVzdF9yb290KTsKKwkJY2xvc2UocmVzZGlyZmQpOworCQlyZXR1cm4gZmFs c2U7CisJfQorCisJLyogVE9ETzogT24gcmVzdW1lLCBkb24ndCByZXdyaXRlLCB2ZXJpZnkgdGhh dCBjb250ZW50IG1hdGNoZXMgY3VycmVudCBpbnN0ZWFkICovCisJaWYgKCh1bmFtZWZkID0gb3Bl bmF0KHJlc2RpcmZkLCAidW5hbWUudHh0IiwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywg MDY2NikpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBGYWlsdXJlIGNyZWF0aW5n IG9wZW5pbmcgdW5hbWUudHh0OiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3Nl KHRlc3RkaXJmZCk7CisJCWNsb3NlKHJlc2RpcmZkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwor CWluaXRfd2F0Y2hkb2dzKHNldHRpbmdzKTsKKworCWlmICghdW5hbWUoJnVuYW1lYnVmKSkgewor CQlkcHJpbnRmKHVuYW1lZmQsICIlcyAlcyAlcyAlcyAlc1xuIiwKKwkJCXVuYW1lYnVmLnN5c25h bWUsCisJCQl1bmFtZWJ1Zi5ub2RlbmFtZSwKKwkJCXVuYW1lYnVmLnJlbGVhc2UsCisJCQl1bmFt ZWJ1Zi52ZXJzaW9uLAorCQkJdW5hbWVidWYubWFjaGluZSk7CisJfSBlbHNlIHsKKwkJZHByaW50 Zih1bmFtZWZkLCAidW5hbWUoKSBmYWlsZWRcbiIpOworCX0KKwljbG9zZSh1bmFtZWZkKTsKKwor CWZvciAoOyBzdGF0ZS0+bmV4dCA8IGpvYl9saXN0LT5zaXplOworCSAgICAgc3RhdGUtPm5leHQr KykgeworCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZV9lbnRyeShzdGF0ZS0+bmV4dCwKKwkJCQkJICAg am9iX2xpc3QtPnNpemUsCisJCQkJCSAgIHNldHRpbmdzLAorCQkJCQkgICAmam9iX2xpc3QtPmVu dHJpZXNbc3RhdGUtPm5leHRdLAorCQkJCQkgICB0ZXN0ZGlyZmQsIHJlc2RpcmZkKTsKKwkJaWYg KHJlc3VsdCA8PSAwKSB7CisJCQljbG9zZSh0ZXN0ZGlyZmQpOworCQkJY2xvc2UocmVzZGlyZmQp OworCQkJY2xvc2Vfd2F0Y2hkb2dzKHNldHRpbmdzKTsKKwkJCWlmIChyZXN1bHQgPCAwKSB7CisJ CQkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisJCQkJaW5pdGlhbGl6ZV9leGVj dXRlX2Zyb21fcmVzdW1lKHN0YXRlLCBzZXR0aW5ncywgam9iX2xpc3QpOworCQkJCXJldHVybiBl eGVjdXRlKHN0YXRlLCBzZXR0aW5ncywgam9iX2xpc3QpOworCQkJfQorCQkJcmV0dXJuIGZhbHNl OworCQl9CisJfQorCisJY2xvc2UodGVzdGRpcmZkKTsKKwljbG9zZShyZXNkaXJmZCk7CisJY2xv c2Vfd2F0Y2hkb2dzKHNldHRpbmdzKTsKKwlyZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3J1 bm5lci9leGVjdXRvci5oIGIvcnVubmVyL2V4ZWN1dG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAuLmJkZGE5ODNhCi0tLSAvZGV2L251bGwKKysrIGIvcnVubmVyL2V4ZWN1 dG9yLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBSVU5ORVJfRVhFQ1VUT1JfSAorI2RlZmlu ZSBSVU5ORVJfRVhFQ1VUT1JfSAorCisjaW5jbHVkZSAiam9iX2xpc3QuaCIKKyNpbmNsdWRlICJz ZXR0aW5ncy5oIgorCitzdHJ1Y3QgZXhlY3V0ZV9zdGF0ZQoreworCXNpemVfdCBuZXh0OworfTsK KworZW51bSB7CisJX0ZfSk9VUk5BTCwKKwlfRl9PVVQsCisJX0ZfRVJSLAorCV9GX0RNRVNHLAor CV9GX0xBU1QsCit9OworCitib29sIG9wZW5fb3V0cHV0X2ZpbGVzKGludCBkaXJmZCwgaW50ICpm ZHMsIGJvb2wgd3JpdGUpOwordm9pZCBjbG9zZV9vdXRwdXRzKGludCAqZmRzKTsKKworLyoKKyAq IEluaXRpYWxpemUgZXhlY3V0ZV9zdGF0ZSBvYmplY3QgdG8gYSBzdGF0ZSB3aGVyZSBpdCdzIHJl YWR5IHRvCisgKiByZXN1bWUuIFdpbGwgdmFsaWRhdGUgdGhlIHNldHRpbmdzIGFuZCBzZXJpYWxp emUgYm90aCBzZXR0aW5ncyBhbmQKKyAqIHRoZSBqb2JfbGlzdCBpbnRvIHRoZSByZXN1bHQgZGly ZWN0b3J5IGlmIHRoZXkgYXJlIG5vdCB5ZXQgd3JpdHRlbgorICogdGhlcmUuCisgKgorICogSWYg ZXhlY3V0aW9ucyBoYXZlIGFscmVhZHkgc3RhcnRlZCwgd2lsbCBjb21tdW5pY2F0ZSB0aGUgcmVz dW1lCisgKiBwb2ludCBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBuZXh0X2pvYl9saXN0X2Vu dHJ5IHZhbHVlLCBhbmQKKyAqIHBvc3NpYmx5IG1vZGlmeWluZyB0aGUgam9iX2xpc3Qgb2JqZWN0 LgorICovCitib29sIGluaXRpYWxpemVfZXhlY3V0ZV9zdGF0ZShzdHJ1Y3QgZXhlY3V0ZV9zdGF0 ZSAqc3RhdGUsCisJCQkgICAgICBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJICAgICAg c3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCk7CisKK2Jvb2wgZXhlY3V0ZShzdHJ1Y3QgZXhlY3V0 ZV9zdGF0ZSAqc3RhdGUsCisJICAgICBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCSAgICAg c3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ydW5u ZXIvam9iX2xpc3QuYyBiL3J1bm5lci9qb2JfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwLi5lYzk0MjQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3J1bm5lci9qb2JfbGlz dC5jCkBAIC0wLDAgKzEsNDkyIEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250 bC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5j bHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQu aD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1 ZGUgImpvYl9saXN0LmgiCisjaW5jbHVkZSAiaWd0X2NvcmUuaCIKKworc3RhdGljIGJvb2wgbWF0 Y2hlc19hbnkoY29uc3QgY2hhciAqbmVlZGxlLCBzdHJ1Y3QgcmVnZXhfbGlzdCAqaGF5c3RhY2tz KQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IGhheXN0YWNrcy0+c2l6ZTsgaSsr KSB7CisJCWlmIChyZWdleGVjKGhheXN0YWNrcy0+cmVnZXhlc1tpXSwgbmVlZGxlLAorCQkJICAg IChzaXplX3QpMCwgTlVMTCwgMCkgPT0gMCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisK KwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9qb2JfbGlzdF9lbnRyeShzdHJ1 Y3Qgam9iX2xpc3QgKmpvYl9saXN0LAorCQkJICAgICAgIGNoYXIgKmJpbmFyeSwKKwkJCSAgICAg ICBjaGFyICoqc3VidGVzdHMsCisJCQkgICAgICAgc2l6ZV90IHN1YnRlc3RfY291bnQpCit7CisJ c3RydWN0IGpvYl9saXN0X2VudHJ5ICplbnRyeTsKKworCWpvYl9saXN0LT5zaXplKys7CisJam9i X2xpc3QtPmVudHJpZXMgPSByZWFsbG9jKGpvYl9saXN0LT5lbnRyaWVzLCBqb2JfbGlzdC0+c2l6 ZSAqIHNpemVvZigqam9iX2xpc3QtPmVudHJpZXMpKTsKKwllbnRyeSA9ICZqb2JfbGlzdC0+ZW50 cmllc1tqb2JfbGlzdC0+c2l6ZSAtIDFdOworCisJZW50cnktPmJpbmFyeSA9IGJpbmFyeTsKKwll bnRyeS0+c3VidGVzdHMgPSBzdWJ0ZXN0czsKKwllbnRyeS0+c3VidGVzdF9jb3VudCA9IHN1YnRl c3RfY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9zdWJ0ZXN0cyhzdHJ1Y3Qgam9iX2xpc3Qg KmpvYl9saXN0LCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLAorCQkJIGNoYXIgKmJpbmFyeSwK KwkJCSBzdHJ1Y3QgcmVnZXhfbGlzdCAqaW5jbHVkZSwgc3RydWN0IHJlZ2V4X2xpc3QgKmV4Y2x1 ZGUpCit7CisJRklMRSAqcDsKKwljaGFyIGNtZFsyNTZdID0ge307CisJY2hhciAqc3VidGVzdG5h bWU7CisJY2hhciAqKnN1YnRlc3RzID0gTlVMTDsKKwlzaXplX3QgbnVtX3N1YnRlc3RzID0gMDsK KwlzaXplX3Qgcm9vdGxlbiA9IHN0cmxlbihzZXR0aW5ncy0+dGVzdF9yb290KTsKKwlzaXplX3Qg YmluYXJ5bGVuID0gc3RybGVuKGJpbmFyeSk7CisJaW50IGlkeCwgczsKKworCWlmIChyb290bGVu ICsgYmluYXJ5bGVuICsgc3RybGVuKCIgLS1saXN0LXN1YnRlc3RzIikgKyAxID4gMjU2KSB7CisJ CS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLworCQlmcHJpbnRmKHN0ZGVyciwgIlBhdGggdG8g YmluYXJ5IHRvbyBsb25nLCBpZ25vcmluZzogJXMvJXNcbiIsCisJCQlzZXR0aW5ncy0+dGVzdF9y b290LCBiaW5hcnkpOworCQlyZXR1cm47CisJfQorCisJc3RyY3B5KGNtZCwgc2V0dGluZ3MtPnRl c3Rfcm9vdCk7CisJaWR4ID0gcm9vdGxlbjsKKwljbWRbaWR4KytdID0gJy8nOworCXN0cmNweShj bWQgKyBpZHgsIGJpbmFyeSk7CisJaWR4ICs9IGJpbmFyeWxlbjsKKwlzdHJjcHkoY21kICsgaWR4 LCAiIC0tbGlzdC1zdWJ0ZXN0cyIpOworCisJcCA9IHBvcGVuKGNtZCwgInIiKTsKKwlpZiAoIXAp IHsKKwkJZnByaW50ZihzdGRlcnIsICJwb3BlbiBmYWlsZWQgd2hlbiBleGVjdXRpbmcgJXM6ICVz XG4iLAorCQkJY21kLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCXdo aWxlIChmc2NhbmYocCwgIiVtcyIsICZzdWJ0ZXN0bmFtZSkgPT0gMSkgeworCQlpZiAoZXhjbHVk ZSAmJiBleGNsdWRlLT5zaXplICYmIG1hdGNoZXNfYW55KHN1YnRlc3RuYW1lLCBleGNsdWRlKSkg eworCQkJZnJlZShzdWJ0ZXN0bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpbmNs dWRlICYmIGluY2x1ZGUtPnNpemUgJiYgIW1hdGNoZXNfYW55KHN1YnRlc3RuYW1lLCBpbmNsdWRl KSkgeworCQkJZnJlZShzdWJ0ZXN0bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChz ZXR0aW5ncy0+bXVsdGlwbGVfbW9kZSkgeworCQkJbnVtX3N1YnRlc3RzKys7CisJCQlzdWJ0ZXN0 cyA9IHJlYWxsb2Moc3VidGVzdHMsIG51bV9zdWJ0ZXN0cyAqIHNpemVvZigqc3VidGVzdHMpKTsK KwkJCXN1YnRlc3RzW251bV9zdWJ0ZXN0cyAtIDFdID0gc3RyZHVwKHN1YnRlc3RuYW1lKTsKKwkJ fSBlbHNlIHsKKwkJCXN1YnRlc3RzID0gbWFsbG9jKHNpemVvZigqc3VidGVzdHMpKTsKKwkJCSpz dWJ0ZXN0cyA9IHN0cmR1cChzdWJ0ZXN0bmFtZSk7CisJCQlhZGRfam9iX2xpc3RfZW50cnkoam9i X2xpc3QsIHN0cmR1cChiaW5hcnkpLCBzdWJ0ZXN0cywgMSk7CisJCQlzdWJ0ZXN0cyA9IE5VTEw7 CisJCX0KKworCQlmcmVlKHN1YnRlc3RuYW1lKTsKKwl9CisKKwlpZiAobnVtX3N1YnRlc3RzKSB7 CisJCWFkZF9qb2JfbGlzdF9lbnRyeShqb2JfbGlzdCwgc3RyZHVwKGJpbmFyeSksIHN1YnRlc3Rz LCBudW1fc3VidGVzdHMpOworCX0KKworCXMgPSBwY2xvc2UocCk7CisJaWYgKHMgPT0gMCkgewor CQlyZXR1cm47CisJfSBlbHNlIGlmIChzID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAicG9w ZW4gZXJyb3Igd2hlbiBleGVjdXRpbmcgJXM6ICVzXG4iLCBiaW5hcnksIHN0cmVycm9yKGVycm5v KSk7CisJfSBlbHNlIGlmIChXSUZFWElURUQocykpIHsKKwkJaWYgKFdFWElUU1RBVFVTKHMpID09 IElHVF9FWElUX0lOVkFMSUQpIHsKKwkJCS8qIE5vIHN1YnRlc3RzIG9uIHRoaXMgb25lICovCisJ CQlpZiAoZXhjbHVkZSAmJiBleGNsdWRlLT5zaXplICYmIG1hdGNoZXNfYW55KGJpbmFyeSwgZXhj bHVkZSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIWluY2x1ZGUgfHwgIWluY2x1ZGUt PnNpemUgfHwgbWF0Y2hlc19hbnkoYmluYXJ5LCBpbmNsdWRlKSkgeworCQkJCWFkZF9qb2JfbGlz dF9lbnRyeShqb2JfbGlzdCwgc3RyZHVwKGJpbmFyeSksIE5VTEwsIDApOworCQkJCXJldHVybjsK KwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGVzdCBiaW5hcnkgJXMg ZGllZCB1bmV4cGVjdGVkbHlcbiIsIGJpbmFyeSk7CisJfQorfQorCitzdGF0aWMgYm9vbCBmaWx0 ZXJlZF9qb2JfbGlzdChzdHJ1Y3Qgam9iX2xpc3QgKmpvYl9saXN0LAorCQkJICAgICAgc3RydWN0 IHNldHRpbmdzICpzZXR0aW5ncywKKwkJCSAgICAgIGludCBmZCkKK3sKKwlGSUxFICpmOworCWNo YXIgYnVmWzEyOF07CisKKwlpZiAoam9iX2xpc3QtPmVudHJpZXMgIT0gTlVMTCkgeworCQlmcHJp bnRmKHN0ZGVyciwgIkpvYiBsaXN0IG5vdCBjbGVhcmVkLCB0aGlzIHNob3VsZG4ndCBoYXBwZW5c biIpOworCQlleGl0KDEpOworCX0KKworCWYgPSBmZG9wZW4oZmQsICJyIik7CisKKwl3aGlsZSAo ZnNjYW5mKGYsICIlMTI3cyIsIGJ1ZikgPT0gMSkgeworCQlpZiAoIXN0cmNtcChidWYsICJURVNU TElTVCIpIHx8ICEoc3RyY21wKGJ1ZiwgIkVORCIpKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJ CSAqIElmIHRoZSBiaW5hcnkgbmFtZSBtYXRjaGVzIGV4Y2x1ZGUgZmlsdGVycywgbm8KKwkJICog c3VidGVzdHMgYXJlIGFkZGVkLgorCQkgKi8KKwkJaWYgKHNldHRpbmdzLT5leGNsdWRlX3JlZ2V4 ZXMuc2l6ZSAmJiBtYXRjaGVzX2FueShidWYsICZzZXR0aW5ncy0+ZXhjbHVkZV9yZWdleGVzKSkK KwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIElmIHRoZSBiaW5hcnkgbmFtZSBtYXRjaGVzIGlu Y2x1ZGUgZmlsdGVycyAob3IgaW5jbHVkZSBmaWx0ZXJzIG5vdCBwcmVzZW50KSwKKwkJICogYWxs IHN1YnRlc3RzIGV4Y2VwdCB0aG9zZSBtYXRjaGluZyBleGNsdWRlIGZpbHRlcnMgYXJlIGFkZGVk LgorCQkgKi8KKwkJaWYgKCFzZXR0aW5ncy0+aW5jbHVkZV9yZWdleGVzLnNpemUgfHwgbWF0Y2hl c19hbnkoYnVmLCAmc2V0dGluZ3MtPmluY2x1ZGVfcmVnZXhlcykpIHsKKwkJCWlmIChzZXR0aW5n cy0+bXVsdGlwbGVfbW9kZSAmJiAhc2V0dGluZ3MtPmV4Y2x1ZGVfcmVnZXhlcy5zaXplKQorCQkJ CS8qCisJCQkJICogT3B0aW1pemF0aW9uOyB3ZSBrbm93IHRoYXQgYWxsCisJCQkJICogc3VidGVz dHMgd2lsbCBiZSBpbmNsdWRlZCwgc28gd2UKKwkJCQkgKiBnZXQgdG8gb21pdCBleGVjdXRpbmcK KwkJCQkgKiAtLWxpc3Qtc3VidGVzdHMuCisJCQkJICovCisJCQkJYWRkX2pvYl9saXN0X2VudHJ5 KGpvYl9saXN0LCBzdHJkdXAoYnVmKSwgTlVMTCwgMCk7CisJCQllbHNlCisJCQkJYWRkX3N1YnRl c3RzKGpvYl9saXN0LCBzZXR0aW5ncywgYnVmLAorCQkJCQkgICAgIE5VTEwsICZzZXR0aW5ncy0+ ZXhjbHVkZV9yZWdleGVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogQmluYXJ5 IG5hbWUgZG9lc24ndCBtYXRjaCBleGNsdWRlIG9yIGluY2x1ZGUgZmlsdGVycy4KKwkJICovCisJ CWFkZF9zdWJ0ZXN0cyhqb2JfbGlzdCwgc2V0dGluZ3MsIGJ1ZiwKKwkJCSAgICAgJnNldHRpbmdz LT5pbmNsdWRlX3JlZ2V4ZXMsCisJCQkgICAgICZzZXR0aW5ncy0+ZXhjbHVkZV9yZWdleGVzKTsK Kwl9CisKKwlyZXR1cm4gam9iX2xpc3QtPnNpemUgIT0gMDsKK30KKworc3RhdGljIGJvb2wgam9i X2xpc3RfZnJvbV90ZXN0X2xpc3Qoc3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCwKKwkJCQkgICAg c3RydWN0IHNldHRpbmdzICpzZXR0aW5ncykKK3sKKwlGSUxFICpmOworCXNzaXplX3QgcmVhZDsK KwljaGFyICpsaW5lID0gTlVMTDsKKwlzaXplX3QgbGluZV9sZW4gPSAwOworCXN0cnVjdCBqb2Jf bGlzdF9lbnRyeSBlbnRyeSA9IHt9OworCWJvb2wgYW55ID0gZmFsc2U7CisKKwlpZiAoKGYgPSBm b3BlbihzZXR0aW5ncy0+dGVzdF9saXN0LCAiciIpKSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3Rk ZXJyLCAiQ2Fubm90IG9wZW4gdGVzdCBsaXN0IGZpbGUgJXNcbiIsIHNldHRpbmdzLT50ZXN0X2xp c3QpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJd2hpbGUgKChyZWFkID0gZ2V0bGluZSgmbGlu ZSwgJmxpbmVfbGVuLCBmKSkpIHsKKwkJY2hhciAqYmluYXJ5OworCQljaGFyICpkZWxpbTsKKwor CQlpZiAocmVhZCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsK KwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQorCisJCS8qICMgc3RhcnRzIGEgY29tbWVudCAqLwor CQlpZiAoKGRlbGltID0gc3RyY2hyKGxpbmUsICcjJykpICE9IE5VTEwpIHsKKwkJCSpkZWxpbSA9 ICdcMCc7CisJCX0KKworCQlpZiAoc3NjYW5mKGxpbmUsICJpZ3RAJW1zIiwgJmJpbmFyeSkgPT0g MSkgeworCQkJaWYgKChkZWxpbSA9IHN0cmNocihiaW5hcnksICdAJykpICE9IE5VTEwpIHsKKwkJ CQkqZGVsaW0rKyA9ICdcMCc7CisJCQl9CisKKwkJCWlmICghc2V0dGluZ3MtPm11bHRpcGxlX21v ZGUpIHsKKwkJCQljaGFyICoqc3VidGVzdHMgPSBOVUxMOworCQkJCWlmIChkZWxpbSkgeworCQkJ CQlzdWJ0ZXN0cyA9IG1hbGxvYyhzaXplb2YoY2hhciopKTsKKwkJCQkJc3VidGVzdHNbMF0gPSBz dHJkdXAoZGVsaW0pOworCQkJCX0KKwkJCQlhZGRfam9iX2xpc3RfZW50cnkoam9iX2xpc3QsIHN0 cmR1cChiaW5hcnkpLAorCQkJCQkJICAgc3VidGVzdHMsIChzaXplX3QpKHN1YnRlc3RzICE9IE5V TEwpKTsKKwkJCQlhbnkgPSB0cnVlOworCQkJCWZyZWUoYmluYXJ5KTsKKwkJCQliaW5hcnkgPSBO VUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgdGhlIGN1cnJlbnRs eSBidWlsdCBlbnRyeSBoYXMgdGhlIHNhbWUKKwkJCSAqIGJpbmFyeSwgYWRkIGEgc3VidGVzdC4g T3RoZXJ3aXNlIHN1Ym1pdAorCQkJICogd2hhdCdzIGFscmVhZHkgYnVpbHQgYW5kIHN0YXJ0IGEg bmV3IG9uZS4KKwkJCSAqLworCQkJaWYgKGVudHJ5LmJpbmFyeSAmJiAhc3RyY21wKGVudHJ5LmJp bmFyeSwgYmluYXJ5KSkgeworCQkJCWlmICghZGVsaW0pIHsKKwkJCQkJLyogLi4uIGV4Y2VwdCB3 ZSBkaWRuJ3QgZ2V0IGEgc3VidGVzdCAqLworCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJF cnJvcjogVW5leHBlY3RlZCB0ZXN0IHdpdGhvdXQgc3VidGVzdHMgIgorCQkJCQkJImFmdGVyIHNh bWUgdGVzdCBoYWQgc3VidGVzdHNcbiIpOworCQkJCQlmcmVlKGJpbmFyeSk7CisJCQkJCWZjbG9z ZShmKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQllbnRyeS5zdWJ0ZXN0X2NvdW50 Kys7CisJCQkJZW50cnkuc3VidGVzdHMgPSByZWFsbG9jKGVudHJ5LnN1YnRlc3RzLAorCQkJCQkJ CSBlbnRyeS5zdWJ0ZXN0X2NvdW50ICoKKwkJCQkJCQkgc2l6ZW9mKCplbnRyeS5zdWJ0ZXN0cykp OworCQkJCWVudHJ5LnN1YnRlc3RzW2VudHJ5LnN1YnRlc3RfY291bnQgLSAxXSA9IHN0cmR1cChk ZWxpbSk7CisJCQkJZnJlZShiaW5hcnkpOworCQkJCWJpbmFyeSA9IE5VTEw7CisJCQkJY29udGlu dWU7CisJCQl9CisKKwkJCWlmIChlbnRyeS5iaW5hcnkpIHsKKwkJCQlhZGRfam9iX2xpc3RfZW50 cnkoam9iX2xpc3QsIGVudHJ5LmJpbmFyeSwgZW50cnkuc3VidGVzdHMsIGVudHJ5LnN1YnRlc3Rf Y291bnQpOworCQkJCWFueSA9IHRydWU7CisJCQl9CisKKwkJCW1lbXNldCgmZW50cnksIDAsIHNp emVvZihlbnRyeSkpOworCQkJZW50cnkuYmluYXJ5ID0gc3RyZHVwKGJpbmFyeSk7CisJCQlpZiAo ZGVsaW0pIHsKKwkJCQllbnRyeS5zdWJ0ZXN0cyA9IG1hbGxvYyhzaXplb2YoKmVudHJ5LnN1YnRl c3RzKSk7CisJCQkJZW50cnkuc3VidGVzdHNbMF0gPSBzdHJkdXAoZGVsaW0pOworCQkJCWVudHJ5 LnN1YnRlc3RfY291bnQgPSAxOworCQkJfQorCisJCQlmcmVlKGJpbmFyeSk7CisJCQliaW5hcnkg PSBOVUxMOworCQl9CisJfQorCisJaWYgKGVudHJ5LmJpbmFyeSkgeworCQlhZGRfam9iX2xpc3Rf ZW50cnkoam9iX2xpc3QsIGVudHJ5LmJpbmFyeSwgZW50cnkuc3VidGVzdHMsIGVudHJ5LnN1YnRl c3RfY291bnQpOworCQlhbnkgPSB0cnVlOworCX0KKworCWZyZWUobGluZSk7CisJZmNsb3NlKGYp OworCXJldHVybiBhbnk7Cit9CisKK3ZvaWQgaW5pdF9qb2JfbGlzdChzdHJ1Y3Qgam9iX2xpc3Qg KmpvYl9saXN0KQoreworCW1lbXNldChqb2JfbGlzdCwgMCwgc2l6ZW9mKCpqb2JfbGlzdCkpOwor fQorCit2b2lkIGZyZWVfam9iX2xpc3Qoc3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCkKK3sKKwlp bnQgaSwgazsKKworCWZvciAoaSA9IDA7IGkgPCBqb2JfbGlzdC0+c2l6ZTsgaSsrKSB7CisJCXN0 cnVjdCBqb2JfbGlzdF9lbnRyeSAqZW50cnkgPSAmam9iX2xpc3QtPmVudHJpZXNbaV07CisKKwkJ ZnJlZShlbnRyeS0+YmluYXJ5KTsKKwkJZm9yIChrID0gMDsgayA8IGVudHJ5LT5zdWJ0ZXN0X2Nv dW50OyBrKyspIHsKKwkJCWZyZWUoZW50cnktPnN1YnRlc3RzW2tdKTsKKwkJfQorCQlmcmVlKGVu dHJ5LT5zdWJ0ZXN0cyk7CisJfQorCWZyZWUoam9iX2xpc3QtPmVudHJpZXMpOworCWluaXRfam9i X2xpc3Qoam9iX2xpc3QpOworfQorCitib29sIGNyZWF0ZV9qb2JfbGlzdChzdHJ1Y3Qgam9iX2xp c3QgKmpvYl9saXN0LAorCQkgICAgIHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MpCit7CisJaW50 IGRpcmZkLCBmZDsKKwlib29sIHJlc3VsdDsKKworCWlmICghc2V0dGluZ3MtPnRlc3Rfcm9vdCkg eworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHRlc3Qgcm9vdCBzZXQ7IHRoaXMgc2hvdWxkbid0IGhh cHBlblxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlmcmVlX2pvYl9saXN0KGpvYl9saXN0 KTsKKworCWRpcmZkID0gb3BlbihzZXR0aW5ncy0+dGVzdF9yb290LCBPX0RJUkVDVE9SWSB8IE9f UkRPTkxZKTsKKwlpZiAoZGlyZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGVzdCBkaXJl Y3RvcnkgJXMgY2Fubm90IGJlIG9wZW5lZFxuIiwgc2V0dGluZ3MtPnRlc3Rfcm9vdCk7CisJCXJl dHVybiBmYWxzZTsKKwl9CisKKwlmZCA9IG9wZW5hdChkaXJmZCwgInRlc3QtbGlzdC50eHQiLCBP X1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVu ICVzL3Rlc3QtbGlzdC50eHRcbiIsIHNldHRpbmdzLT50ZXN0X3Jvb3QpOworCQljbG9zZShkaXJm ZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIElmIGEgdGVzdF9saXN0IGlzIGdp dmVuIChub3QgdG8gYmUgY29uZnVzZWQgd2l0aAorCSAqIHRlc3QtbGlzdC50eHQpLCB3ZSB1c2Ug aXQgZGlyZWN0bHkgd2l0aG91dCBtYWtpbmcgdGVzdHMKKwkgKiBsaXN0IHRoZWlyIHN1YnRlc3Rz LiBJZiBpbmNsdWRlL2V4Y2x1ZGUgZmlsdGVycyBhcmUgZ2l2ZW4KKwkgKiB3ZSBmaWx0ZXIgdGhl bSBkaXJlY3RseSBmcm9tIHRoZSB0ZXN0X2xpc3QuCisJICovCisJaWYgKHNldHRpbmdzLT50ZXN0 X2xpc3QpCisJCXJlc3VsdCA9IGpvYl9saXN0X2Zyb21fdGVzdF9saXN0KGpvYl9saXN0LCBzZXR0 aW5ncyk7CisJZWxzZQorCQlyZXN1bHQgPSBmaWx0ZXJlZF9qb2JfbGlzdChqb2JfbGlzdCwgc2V0 dGluZ3MsIGZkKTsKKworCWNsb3NlKGZkKTsKKwljbG9zZShkaXJmZCk7CisKKwlyZXR1cm4gcmVz dWx0OworfQorCitzdGF0aWMgY2hhciBqb2JsaXN0X2ZpbGVuYW1lW10gPSAiam9ibGlzdC50eHQi OworYm9vbCBzZXJpYWxpemVfam9iX2xpc3Qoc3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCwgc3Ry dWN0IHNldHRpbmdzICpzZXR0aW5ncykKK3sKKwlpbnQgZGlyZmQsIGZkOworCXNpemVfdCBpLCBr OworCUZJTEUgKmY7CisKKwlpZiAoIXNldHRpbmdzLT5yZXN1bHRzX3BhdGgpIHsKKwkJZnByaW50 ZihzdGRlcnIsICJObyByZXN1bHRzLXBhdGggc2V0OyB0aGlzIHNob3VsZG4ndCBoYXBwZW5cbiIp OworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKChkaXJmZCA9IG9wZW4oc2V0dGluZ3MtPnJl c3VsdHNfcGF0aCwgT19ESVJFQ1RPUlkgfCBPX1JET05MWSkpIDwgMCkgeworCQlta2RpcihzZXR0 aW5ncy0+cmVzdWx0c19wYXRoLCAwNzc3KTsKKwkJaWYgKChkaXJmZCA9IG9wZW4oc2V0dGluZ3Mt PnJlc3VsdHNfcGF0aCwgT19ESVJFQ1RPUlkgfCBPX1JET05MWSkpIDwgMCkgeworCQkJZnByaW50 ZihzdGRlcnIsICJDcmVhdGluZyByZXN1bHRzLXBhdGggZmFpbGVkXG4iKTsKKwkJCXJldHVybiBm YWxzZTsKKwkJfQorCX0KKworCWlmICgoZmQgPSBvcGVuYXQoZGlyZmQsIGpvYmxpc3RfZmlsZW5h bWUsIE9fUkRPTkxZKSkgPj0gMCkgeworCQljbG9zZShmZCk7CisKKwkJaWYgKCFzZXR0aW5ncy0+ b3ZlcndyaXRlKSB7CisJCQkvKiBTZXJpYWxpemF0aW9uIGRhdGEgYWxyZWFkeSBleGlzdHMsIG5v dCBvdmVyd3JpdGluZy4gKi8KKwkJCWNsb3NlKGZkKTsKKwkJCWNsb3NlKGRpcmZkKTsKKwkJCXJl dHVybiBmYWxzZTsKKwkJfQorCisJCWlmICh1bmxpbmthdChkaXJmZCwgam9ibGlzdF9maWxlbmFt ZSwgMCkgIT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBvdmVyd3JpdGluZyBvbGQg am9iIGxpc3RcbiIpOworCQkJY2xvc2UoZGlyZmQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJ fQorCisJaWYgKChmZCA9IG9wZW5hdChkaXJmZCwgam9ibGlzdF9maWxlbmFtZSwgT19DUkVBVCB8 IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ3Jl YXRpbmcgam9iIGxpc3Qgc2VyaWFsaXphdGlvbiBmaWxlIGZhaWxlZFxuIik7CisJCXJldHVybiBm YWxzZTsKKwl9CisKKwlmID0gZmRvcGVuKGZkLCAidyIpOworCWlmICghZikgeworCQljbG9zZShm ZCk7CisJCWNsb3NlKGRpcmZkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWZvciAoaSA9IDA7 IGkgPCBqb2JfbGlzdC0+c2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBqb2JfbGlzdF9lbnRyeSAqZW50 cnkgPSAmam9iX2xpc3QtPmVudHJpZXNbaV07CisJCWZwcmludGYoZiwgIiVzIiwgZW50cnktPmJp bmFyeSk7CisKKwkJaWYgKGVudHJ5LT5zdWJ0ZXN0X2NvdW50KSB7CisJCQljaGFyICpkZWxpbSA9 ICIiOworCisJCQlmcHJpbnRmKGYsICIgIik7CisKKwkJCWZvciAoayA9IDA7IGsgPCBlbnRyeS0+ c3VidGVzdF9jb3VudDsgaysrKSB7CisJCQkJZnByaW50ZihmLCAiJXMlcyIsIGRlbGltLCBlbnRy eS0+c3VidGVzdHNba10pOworCQkJCWRlbGltID0gIiwiOworCQkJfQorCQl9CisKKwkJZnByaW50 ZihmLCAiXG4iKTsKKwl9CisKKwlpZiAoc2V0dGluZ3MtPnN5bmMpIHsKKwkJZnN5bmMoZmQpOwor CQlmc3luYyhkaXJmZCk7CisJfQorCisJZmNsb3NlKGYpOworCWNsb3NlKGRpcmZkKTsKKwlyZXR1 cm4gdHJ1ZTsKK30KKworYm9vbCByZWFkX2pvYl9saXN0KHN0cnVjdCBqb2JfbGlzdCAqam9iX2xp c3QsIGludCBkaXJmZCkKK3sKKwlpbnQgZmQ7CisJRklMRSAqZjsKKwlzc2l6ZV90IHJlYWQ7CisJ Y2hhciAqbGluZSA9IE5VTEw7CisJc2l6ZV90IGxpbmVfbGVuID0gMDsKKworCWZyZWVfam9iX2xp c3Qoam9iX2xpc3QpOworCisJaWYgKChmZCA9IG9wZW5hdChkaXJmZCwgam9ibGlzdF9maWxlbmFt ZSwgT19SRE9OTFkpKSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCWYgPSBmZG9wZW4oZmQsICJy Iik7CisJaWYgKCFmKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXdo aWxlICgocmVhZCA9IGdldGxpbmUoJmxpbmUsICZsaW5lX2xlbiwgZikpKSB7CisJCWNoYXIgKmJp bmFyeSwgKnN1Ymxpc3QsICpjb21tYTsKKwkJY2hhciAqKnN1YnRlc3RzID0gTlVMTDsKKwkJc2l6 ZV90IG51bV9zdWJ0ZXN0cyA9IDAsIGxlbjsKKworCQlpZiAocmVhZCA8IDApIHsKKwkJCWlmIChl cnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQor CisJCWxlbiA9IHN0cmxlbihsaW5lKTsKKwkJaWYgKGxlbiA+IDAgJiYgbGluZVtsZW4gLSAxXSA9 PSAnXG4nKQorCQkJbGluZVtsZW4gLSAxXSA9ICdcMCc7CisKKwkJc3VibGlzdCA9IHN0cmNocihs aW5lLCAnICcpOworCQlpZiAoIXN1Ymxpc3QpIHsKKwkJCWFkZF9qb2JfbGlzdF9lbnRyeShqb2Jf bGlzdCwgc3RyZHVwKGxpbmUpLCBOVUxMLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJKnN1 Ymxpc3QrKyA9ICdcMCc7CisJCWJpbmFyeSA9IHN0cmR1cChsaW5lKTsKKworCQlkbyB7CisJCQlj b21tYSA9IHN0cmNocihzdWJsaXN0LCAnLCcpOworCQkJaWYgKGNvbW1hKSB7CisJCQkJKmNvbW1h KysgPSAnXDAnOworCQkJfQorCisJCQkrK251bV9zdWJ0ZXN0czsKKwkJCXN1YnRlc3RzID0gcmVh bGxvYyhzdWJ0ZXN0cywgbnVtX3N1YnRlc3RzICogc2l6ZW9mKCpzdWJ0ZXN0cykpOworCQkJc3Vi dGVzdHNbbnVtX3N1YnRlc3RzIC0gMV0gPSBzdHJkdXAoc3VibGlzdCk7CisJCQlzdWJsaXN0ID0g Y29tbWE7CisJCX0gd2hpbGUgKGNvbW1hICE9IE5VTEwpOworCisJCWFkZF9qb2JfbGlzdF9lbnRy eShqb2JfbGlzdCwgYmluYXJ5LCBzdWJ0ZXN0cywgbnVtX3N1YnRlc3RzKTsKKwl9CisKKwlmcmVl KGxpbmUpOworCWZjbG9zZShmKTsKKworCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvcnVu bmVyL2pvYl9saXN0LmggYi9ydW5uZXIvam9iX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMC4uYzcyNmFiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9ydW5uZXIvam9iX2xp c3QuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIFJVTk5FUl9KT0JfTElTVF9ICisjZGVmaW5l IFJVTk5FUl9KT0JfTElTVF9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlICJz ZXR0aW5ncy5oIgorCitzdHJ1Y3Qgam9iX2xpc3RfZW50cnkgeworCWNoYXIgKmJpbmFyeTsKKwlj aGFyICoqc3VidGVzdHM7CisJLyoKKwkgKiAwID0gYWxsLCBvciB0ZXN0IGhhcyBubyBzdWJ0ZXN0 cy4KKwkgKgorCSAqIElmIHRoZSBvcmlnaW5hbCBqb2JfbGlzdCB3YXMgdG8gcnVuIGFsbCBzdWJ0 ZXN0cyBvZiBhCisJICogYmluYXJ5IGFuZCBzdWNoIGEgcnVuIHdhcyBpbmNvbXBsZXRlLCByZXN1 bWluZyBmcm9tIHRoZQorCSAqIGV4ZWN1dGlvbiBqb3VybmFsIHdpbGwgZmlsbCB0aGUgc3VidGVz dCBhcnJheSB3aXRoIGFscmVhZHkKKwkgKiBzdGFydGVkIHN1YnRlc3RzIHByZXBlbmRlZCB3aXRo ICchJyBzbyB0aGUgdGVzdCBiaW5hcnkgd2lsbAorCSAqIG5vdCBydW4gdGhlbS4gc3VidGVzdF9j b3VudCB3aWxsIHN0aWxsIHJlZmxlY3QgdGhlIHNpemUgb2YKKwkgKiB0aGUgYWJvdmUgYXJyYXku CisJICovCisJc2l6ZV90IHN1YnRlc3RfY291bnQ7Cit9OworCitzdHJ1Y3Qgam9iX2xpc3QKK3sK KwlzdHJ1Y3Qgam9iX2xpc3RfZW50cnkgKmVudHJpZXM7CisJc2l6ZV90IHNpemU7Cit9OworCit2 b2lkIGluaXRfam9iX2xpc3Qoc3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCk7Cit2b2lkIGZyZWVf am9iX2xpc3Qoc3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCk7Citib29sIGNyZWF0ZV9qb2JfbGlz dChzdHJ1Y3Qgam9iX2xpc3QgKmpvYl9saXN0LCBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzKTsK KworYm9vbCBzZXJpYWxpemVfam9iX2xpc3Qoc3RydWN0IGpvYl9saXN0ICpqb2JfbGlzdCwgc3Ry dWN0IHNldHRpbmdzICpzZXR0aW5ncyk7Citib29sIHJlYWRfam9iX2xpc3Qoc3RydWN0IGpvYl9s aXN0ICpqb2JfbGlzdCwgaW50IGRpcmZkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ydW5uZXIv bWVzb24uYnVpbGQgYi9ydW5uZXIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAuLjc3M2I0ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvcnVubmVyL21lc29uLmJ1 aWxkCkBAIC0wLDAgKzEsMjQgQEAKK2pzb25jID0gZGVwZW5kZW5jeSgnanNvbi1jJywgcmVxdWly ZWQ6IHRydWUpCisKK3J1bm5lcmxpYl9zb3VyY2VzID0gWyAnc2V0dGluZ3MuYycsCisJCSAgICAg ICdqb2JfbGlzdC5jJywKKwkJICAgICAgJ2V4ZWN1dG9yLmMnLAorCQkgICAgICAncmVzdWx0Z2Vu LmMnLAorCQkgICAgXQorCitydW5uZXJfc291cmNlcyA9IFsgJ3J1bm5lci5jJywKKwkJIF0KKwor cnVubmVybGliID0gc3RhdGljX2xpYnJhcnkoJ2lndF9ydW5uZXInLCBydW5uZXJsaWJfc291cmNl cywKKwkJCSAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBpbmMsCisJCQkgICBkZXBlbmRlbmNpZXMg OiBqc29uYykKKworcnVubmVyID0gZXhlY3V0YWJsZSgncnVubmVyJywgcnVubmVyX3NvdXJjZXMs CisJCSAgICBsaW5rX3dpdGggOiBydW5uZXJsaWIsCisJCSAgICBpbnN0YWxsIDogdHJ1ZSwKKwkJ ICAgIGluc3RhbGxfZGlyIDogYmluZGlyLAorCQkgICAgZGVwZW5kZW5jaWVzIDogaWd0X2RlcHMp CisKK3Jlc3VsdHMgPSBleGVjdXRhYmxlKCdyZXN1bHRzJywgJ3Jlc3VsdHMuYycsCisJCSAgICAg bGlua193aXRoIDogcnVubmVybGliLAorKQpkaWZmIC0tZ2l0IGEvcnVubmVyL3Jlc3VsdGdlbi5j IGIvcnVubmVyL3Jlc3VsdGdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw Li45NzhjMDdiZQotLS0gL2Rldi9udWxsCisrKyBiL3J1bm5lci9yZXN1bHRnZW4uYwpAQCAtMCww ICsxLDg2NCBAQAorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNs dWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+ CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRl IDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGpzb24uaD4KKworI2luY2x1ZGUgInJlc3VsdGdlbi5o IgorI2luY2x1ZGUgInNldHRpbmdzLmgiCisjaW5jbHVkZSAiZXhlY3V0b3IuaCIKKyNpbmNsdWRl ICJpZ3RfY29yZS5oIgorCitzdGF0aWMgY2hhciBzdWJ0ZXN0X3Jlc3VsdF9iZWdbXSA9ICJTdWJ0 ZXN0ICI7CitzdGF0aWMgc2l6ZV90IHN1YnRlc3RfcmVzdWx0X2xlbiA9IHNpemVvZihzdWJ0ZXN0 X3Jlc3VsdF9iZWcpIC0gMTsKK3N0YXRpYyBjaGFyIHN0YXJ0aW5nX3N1YnRlc3RbXSA9ICJTdGFy dGluZyBzdWJ0ZXN0OiAiOworc3RhdGljIHNpemVfdCBzdGFydGluZ19sZW4gPSBzaXplb2Yoc3Rh cnRpbmdfc3VidGVzdCkgLSAxOworc3RhdGljIGNoYXIgc3RhcnRpbmdfc3VidGVzdF9kbWVzZ1td ID0gIjogc3RhcnRpbmcgc3VidGVzdCAiOworc3RhdGljIHNpemVfdCBzdGFydGluZ19zdWJ0ZXN0 X2RtZXNnX2xlbiA9IHNpemVvZihzdGFydGluZ19zdWJ0ZXN0X2RtZXNnKSAtIDE7CisKK3N0cnVj dCBzdWJ0ZXN0cworeworCWNoYXIgKipuYW1lczsKKwlzaXplX3Qgc2l6ZTsKK307CisKK3N0YXRp YyBjaGFyICpmaW5kX2xpbmUoY2hhciAqaGF5c3RhY2ssIGNoYXIgKm5lZWRsZSwgc2l6ZV90IG5l ZWRsZV9zaXplLCBjaGFyICplbmQpCit7CisJY2hhciAqbGluZSA9IGhheXN0YWNrOworCisJd2hp bGUgKGxpbmUgPCBlbmQpIHsKKwkJY2hhciAqbGluZV9lbmQgPSBtZW1jaHIobGluZSwgJ1xuJywg ZW5kIC0gbGluZSk7CisKKwkJaWYgKGVuZCAtIGxpbmUgPCBuZWVkbGVfc2l6ZSkKKwkJCXJldHVy biBOVUxMOworCQlpZiAoIW1lbWNtcChsaW5lLCBuZWVkbGUsIG5lZWRsZV9zaXplKSkKKwkJCXJl dHVybiBsaW5lOworCQlpZiAobGluZV9lbmQgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQls aW5lID0gbGluZV9lbmQgKyAxOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hh ciAqZmluZF9laXRoZXJfbGluZShjaGFyICpoYXlzdGFjaywKKwkJCSAgICAgIGNoYXIgKm5lZWRs ZTEsIHNpemVfdCBuZWVkbGUxX3NpemUsCisJCQkgICAgICBjaGFyICpuZWVkbGUyLCBzaXplX3Qg bmVlZGxlMl9zaXplLAorCQkJICAgICAgY2hhciAqZW5kKQoreworCWNoYXIgKmxpbmUgPSBoYXlz dGFjazsKKworCXdoaWxlIChsaW5lIDwgZW5kKSB7CisJCWNoYXIgKmxpbmVfZW5kID0gbWVtY2hy KGxpbmUsICdcbicsIGVuZCAtIGxpbmUpOworCQlzaXplX3QgbGluZWxlbiA9IGxpbmVfZW5kICE9 IE5VTEwgPyBsaW5lX2VuZCAtIGxpbmUgOiBlbmQgLSBsaW5lOworCQlpZiAoKGxpbmVsZW4gPj0g bmVlZGxlMV9zaXplICYmICFtZW1jbXAobGluZSwgbmVlZGxlMSwgbmVlZGxlMV9zaXplKSkgfHwK KwkJICAgIChsaW5lbGVuID49IG5lZWRsZTJfc2l6ZSAmJiAhbWVtY21wKGxpbmUsIG5lZWRsZTIs IG5lZWRsZTJfc2l6ZSkpKQorCQkJcmV0dXJuIGxpbmU7CisKKwkJaWYgKGxpbmVfZW5kID09IE5V TEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlsaW5lID0gbGluZV9lbmQgKyAxOworCX0KKworCXJl dHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqbmV4dF9saW5lKGNoYXIgKmxpbmUsIGNoYXIg KmJ1ZmVuZCkKK3sKKwljaGFyICpyZXQ7CisKKwlpZiAoIWxpbmUpCisJCXJldHVybiBOVUxMOwor CisJcmV0ID0gbWVtY2hyKGxpbmUsICdcbicsIGJ1ZmVuZCAtIGxpbmUpOworCWlmIChyZXQpCisJ CXJldCsrOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNpemVfdCBjb3VudF9saW5lcyhj aGFyICpidWYsIGNoYXIgKmJ1ZmVuZCkKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwl3aGlsZSAoKGJ1 ZiA9IG5leHRfbGluZShidWYsIGJ1ZmVuZCkpICE9IE5VTEwpCisJCXJldCsrOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGNoYXIgKmxvd2VyY2FzZShjaGFyICpzdHIpCit7CisJY2hhciAq cmV0ID0gbWFsbG9jKHN0cmxlbihzdHIpICsgMSk7CisJY2hhciAqcSA9IHJldDsKKworCXdoaWxl ICgqc3RyKSB7CisJCWlmIChpc3NwYWNlKCpzdHIpKQorCQkJYnJlYWs7CisKKwkJKnErKyA9IHRv bG93ZXIoKnN0cisrKTsKKwl9CisJKnEgPSAnXDAnOworCisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIHZvaWQgYXBwZW5kX2xpbmUoY2hhciAqKmJ1Ziwgc2l6ZV90ICpidWZsZW4sIGNoYXIgKmxp bmUpCit7CisJc2l6ZV90IGxpbmVsZW4gPSBzdHJsZW4obGluZSk7CisKKwkqYnVmID0gcmVhbGxv YygqYnVmLCAqYnVmbGVuICsgbGluZWxlbiArIDEpOworCXN0cmNweSgqYnVmICsgKmJ1Zmxlbiwg bGluZSk7CisJKmJ1ZmxlbiArPSBsaW5lbGVuOworfQorCitzdGF0aWMgY2hhciAqZ2VuX2lndF9u YW1lKGNoYXIgKmJpbmFyeSwgY2hhciAqc3VidGVzdCkKK3sKKwlzdGF0aWMgY2hhciBuYW1lYnVm WzI1Nl07CisKKwljaGFyICpsY19iaW5hcnkgPSBsb3dlcmNhc2UoYmluYXJ5KTsKKwljaGFyICps Y19zdWJ0ZXN0ID0gTlVMTDsKKworCWlmICghc3VidGVzdCkgeworCQlzbnByaW50ZihuYW1lYnVm LCAyNTYsICJpZ3RAJXMiLCBsY19iaW5hcnkpOworCQlmcmVlKGxjX2JpbmFyeSk7CisJCXJldHVy biBuYW1lYnVmOworCX0KKworCWxjX3N1YnRlc3QgPSBsb3dlcmNhc2Uoc3VidGVzdCk7CisKKwlz bnByaW50ZihuYW1lYnVmLCAyNTYsICJpZ3RAJXNAJXMiLCBsY19iaW5hcnksIGxjX3N1YnRlc3Qp OworCisJZnJlZShsY19iaW5hcnkpOworCWZyZWUobGNfc3VidGVzdCk7CisJcmV0dXJuIG5hbWVi dWY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgKm91dHB1dF9zdHI7CisJY2hhciAqcmVz dWx0X3N0cjsKK30gcmVzdWx0bWFwW10gPSB7CisJeyAiU1VDQ0VTUyIsICJwYXNzIiB9LAorCXsg IlNLSVAiLCAic2tpcCIgfSwKKwl7ICJGQUlMIiwgImZhaWwiIH0sCisJeyAiQ1JBU0giLCAiY3Jh c2giIH0sCisJeyAiVElNRU9VVCIsICJ0aW1lb3V0IiB9LAorfTsKK3N0YXRpYyB2b2lkIHBhcnNl X3Jlc3VsdF9zdHJpbmcoY2hhciAqcmVzdWx0c3RyaW5nLCBzaXplX3QgbGVuLCBjaGFyICoqcmVz dWx0LCBkb3VibGUgKnRpbWUpCit7CisJc2l6ZV90IGk7CisJc2l6ZV90IHdvcmRsZW4gPSAwOwor CisJd2hpbGUgKHdvcmRsZW4gPCBsZW4pIHsKKwkJaWYgKGlzc3BhY2UocmVzdWx0c3RyaW5nW3dv cmRsZW5dKSkKKwkJCWJyZWFrOworCQl3b3JkbGVuKys7CisJfQorCisJZm9yIChpID0gMDsgaSA8 IChzaXplb2YocmVzdWx0bWFwKSAvIHNpemVvZihyZXN1bHRtYXBbMF0pKTsgaSsrKSB7CisJCWlm ICghc3RybmNtcChyZXN1bHRzdHJpbmcsIHJlc3VsdG1hcFtpXS5vdXRwdXRfc3RyLCB3b3JkbGVu KSkgeworCQkJKnJlc3VsdCA9IHJlc3VsdG1hcFtpXS5yZXN1bHRfc3RyOworCQkJYnJlYWs7CisJ CX0KKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBmaW5kIGEgcmVzdWx0IGxpbmUsIHRoZSB0ZXN0IGRp ZG4ndCBmaW5pc2guICovCisJaWYgKCEqcmVzdWx0KQorCQkqcmVzdWx0ID0gImluY29tcGxldGUi OworCisJd29yZGxlbisrOworCWlmICh3b3JkbGVuIDwgbGVuICYmIHJlc3VsdHN0cmluZ1t3b3Jk bGVuXSA9PSAnKCcpIHsKKwkJd29yZGxlbisrOworCQljaGFyICpkdXAgPSBtYWxsb2MobGVuIC0g d29yZGxlbik7CisJCW1lbWNweShkdXAsIHJlc3VsdHN0cmluZyArIHdvcmRsZW4sIGxlbiAtIHdv cmRsZW4pOworCQlkdXBbbGVuIC0gd29yZGxlbl0gPSAnXDAnOworCQkqdGltZSA9IHN0cnRvZChk dXAsIE5VTEwpOworCisJCWZyZWUoZHVwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3N1 YnRlc3RfcmVzdWx0KGNoYXIgKnN1YnRlc3QsIGNoYXIgKipyZXN1bHQsIGRvdWJsZSAqdGltZSwg Y2hhciAqYnVmLCBjaGFyICpidWZlbmQpCit7CisJY2hhciAqbGluZTsKKwljaGFyICpsaW5lX2Vu ZDsKKwljaGFyICpyZXN1bHRzdHJpbmc7CisJc2l6ZV90IGxpbmVsZW47CisJc2l6ZV90IHN1YnRl c3RsZW4gPSBzdHJsZW4oc3VidGVzdCk7CisKKwkqcmVzdWx0ID0gTlVMTDsKKwkqdGltZSA9IDAu MDsKKworCWlmICghYnVmKSByZXR1cm47CisKKwlsaW5lID0gZmluZF9saW5lKGJ1Ziwgc3VidGVz dF9yZXN1bHRfYmVnLCBzdWJ0ZXN0X3Jlc3VsdF9sZW4sIGJ1ZmVuZCk7CisJaWYgKCFsaW5lKSB7 CisJCSpyZXN1bHQgPSAiaW5jb21wbGV0ZSI7CisJCXJldHVybjsKKwl9CisKKwlsaW5lX2VuZCA9 IG1lbWNocihsaW5lLCAnXG4nLCBidWZlbmQgLSBsaW5lKTsKKwlsaW5lbGVuID0gbGluZV9lbmQg IT0gTlVMTCA/IGxpbmVfZW5kIC0gbGluZSA6IGJ1ZmVuZCAtIGxpbmU7CisKKwlpZiAoc3VidGVz dF9yZXN1bHRfbGVuICsgc3VidGVzdGxlbiArIDIgPiBsaW5lbGVuIHx8CisJICAgIHN0cm5jbXAo bGluZSArIHN1YnRlc3RfcmVzdWx0X2xlbiwgc3VidGVzdCwgc3VidGVzdGxlbikpCisJCXJldHVy biBwYXJzZV9zdWJ0ZXN0X3Jlc3VsdChzdWJ0ZXN0LCByZXN1bHQsIHRpbWUsIGxpbmUgKyBsaW5l bGVuLCBidWZlbmQpOworCisJcmVzdWx0c3RyaW5nID0gbGluZSArIHN1YnRlc3RfcmVzdWx0X2xl biArIHN1YnRlc3RsZW4gKyAyOworCXBhcnNlX3Jlc3VsdF9zdHJpbmcocmVzdWx0c3RyaW5nLCBs aW5lbGVuIC0gKHJlc3VsdHN0cmluZyAtIGxpbmUpLCByZXN1bHQsIHRpbWUpOworfQorCitzdGF0 aWMgc3RydWN0IGpzb25fb2JqZWN0ICpnZXRfb3JfY3JlYXRlX2pzb25fb2JqZWN0KHN0cnVjdCBq c29uX29iamVjdCAqYmFzZSwKKwkJCQkJCSAgICAgY2hhciAqa2V5KQoreworCXN0cnVjdCBqc29u X29iamVjdCAqcmV0OworCisJaWYgKGpzb25fb2JqZWN0X29iamVjdF9nZXRfZXgoYmFzZSwga2V5 LCAmcmV0KSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGpzb25fb2JqZWN0X25ld19vYmplY3Qo KTsKKwlqc29uX29iamVjdF9vYmplY3RfYWRkKGJhc2UsIGtleSwgcmV0KTsKKworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9vcl9vdmVycmlkZV9yZXN1bHQoc3RydWN0IGpzb25f b2JqZWN0ICpvYmosIGNoYXIgKmZyb20sIGNoYXIgKnRvKQoreworCXN0cnVjdCBqc29uX29iamVj dCAqY3VycmVudDsKKwljb25zdCBjaGFyICpvbGRyZXN1bHQ7CisKKwlpZiAoIWpzb25fb2JqZWN0 X29iamVjdF9nZXRfZXgob2JqLCAicmVzdWx0IiwgJmN1cnJlbnQpKSB7CisJCWpzb25fb2JqZWN0 X29iamVjdF9hZGQob2JqLCAicmVzdWx0IiwKKwkJCQkgICAgICAganNvbl9vYmplY3RfbmV3X3N0 cmluZyh0bykpOworCQlyZXR1cm47CisJfQorCisJb2xkcmVzdWx0ID0ganNvbl9vYmplY3RfZ2V0 X3N0cmluZyhjdXJyZW50KTsKKwlpZiAoZnJvbSAhPSBOVUxMICYmICFzdHJjbXAob2xkcmVzdWx0 LCBmcm9tKSkKKwkJanNvbl9vYmplY3Rfb2JqZWN0X2FkZChvYmosICJyZXN1bHQiLAorCQkJCSAg ICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nKHRvKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9y dW50aW1lKHN0cnVjdCBqc29uX29iamVjdCAqb2JqLCBkb3VibGUgdGltZSkKK3sKKwlkb3VibGUg b2xkdGltZTsKKwlzdHJ1Y3QganNvbl9vYmplY3QgKnRpbWVvYmogPSBnZXRfb3JfY3JlYXRlX2pz b25fb2JqZWN0KG9iaiwgInRpbWUiKTsKKwlzdHJ1Y3QganNvbl9vYmplY3QgKm9sZGVuZDsKKwor CWpzb25fb2JqZWN0X29iamVjdF9hZGQodGltZW9iaiwgIl9fdHlwZV9fIiwKKwkJCSAgICAgICBq c29uX29iamVjdF9uZXdfc3RyaW5nKCJUaW1lQXR0cmlidXRlIikpOworCWpzb25fb2JqZWN0X29i amVjdF9hZGQodGltZW9iaiwgInN0YXJ0IiwKKwkJCSAgICAgICBqc29uX29iamVjdF9uZXdfZG91 YmxlKDAuMCkpOworCisJaWYgKCFqc29uX29iamVjdF9vYmplY3RfZ2V0X2V4KHRpbWVvYmosICJl bmQiLCAmb2xkZW5kKSkgeworCQlqc29uX29iamVjdF9vYmplY3RfYWRkKHRpbWVvYmosICJlbmQi LAorCQkJCSAgICAgICBqc29uX29iamVjdF9uZXdfZG91YmxlKHRpbWUpKTsKKwkJcmV0dXJuOwor CX0KKworCW9sZHRpbWUgPSBqc29uX29iamVjdF9nZXRfZG91YmxlKG9sZGVuZCk7CisJdGltZSAr PSBvbGR0aW1lOworCWpzb25fb2JqZWN0X29iamVjdF9hZGQodGltZW9iaiwgImVuZCIsCisJCQkg ICAgICAganNvbl9vYmplY3RfbmV3X2RvdWJsZSh0aW1lKSk7Cit9CisKK3N0YXRpYyBjaGFyIHZl cnNpb25zdHJpbmdbXSA9ICJJR1QtVmVyc2lvbjogIjsKK3N0YXRpYyBzaXplX3QgdmVyc2lvbmxl biA9IHNpemVvZih2ZXJzaW9uc3RyaW5nKSAtIDE7CitzdGF0aWMgYm9vbCBmaWxsX2Zyb21fb3V0 cHV0KGludCBmZCwgY2hhciAqYmluYXJ5LCBib29sIGlzX3N0ZG91dCwKKwkJCSAgICAgc3RydWN0 IHN1YnRlc3RzICpzdWJ0ZXN0cywKKwkJCSAgICAgc3RydWN0IGpzb25fb2JqZWN0ICp0ZXN0cykK K3sKKwljaGFyICpidWYsICpidWZlbmQ7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwljaGFyICpp Z3RfbmFtZSA9IE5VTEw7CisJY2hhciAqaWd0X3ZlcnNpb24gPSBOVUxMOworCXNpemVfdCBpZ3Rf dmVyc2lvbl9sZW4gPSAwOworCXN0cnVjdCBqc29uX29iamVjdCAqY3VycmVudF90ZXN0ID0gTlVM TDsKKwlzaXplX3QgaTsKKworCWlmIChmc3RhdChmZCwgJnN0YXRidWYpKQorCQlyZXR1cm4gZmFs c2U7CisKKwlidWYgPSBtbWFwKE5VTEwsIHN0YXRidWYuc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBf U0hBUkVELCBmZCwgMCk7CisJaWYgKCFidWYpCisJCXJldHVybiBmYWxzZTsKKworCWJ1ZmVuZCA9 IGJ1ZiArIHN0YXRidWYuc3Rfc2l6ZTsKKworCWlmIChpc19zdGRvdXQpIHsKKwkJY2hhciAqbmV3 bGluZTsKKworCQlpZ3RfdmVyc2lvbiA9IGZpbmRfbGluZShidWYsIHZlcnNpb25zdHJpbmcsIHZl cnNpb25sZW4sIGJ1ZmVuZCk7CisJCWlmIChpZ3RfdmVyc2lvbikgeworCQkJbmV3bGluZSA9IG1l bWNocihpZ3RfdmVyc2lvbiwgJ1xuJywgYnVmZW5kIC0gaWd0X3ZlcnNpb24pOworCQkJaWd0X3Zl cnNpb25fbGVuID0gbmV3bGluZSAtIGlndF92ZXJzaW9uOworCQl9IGVsc2UgeworCQkJaWd0X3Zl cnNpb24gPSBOVUxMOworCQl9CisJfQorCisJaWYgKHN1YnRlc3RzLT5zaXplID09IDApIHsKKwkJ LyogTm8gc3VidGVzdHMgKi8KKwkJaWd0X25hbWUgPSBnZW5faWd0X25hbWUoYmluYXJ5LCBOVUxM KTsKKwkJY3VycmVudF90ZXN0ID0gZ2V0X29yX2NyZWF0ZV9qc29uX29iamVjdCh0ZXN0cywgaWd0 X25hbWUpOworCisJCWpzb25fb2JqZWN0X29iamVjdF9hZGQoY3VycmVudF90ZXN0LCBpc19zdGRv dXQgPyAib3V0IiA6ICJlcnIiLAorCQkJCSAgICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nX2xl bihidWYsIHN0YXRidWYuc3Rfc2l6ZSkpOworCQlpZiAoIWlzX3N0ZG91dCAmJiBjb3VudF9saW5l cyhidWYsIGJ1ZiArIHN0YXRidWYuc3Rfc2l6ZSkgPiAyKSB7CisJCQlhZGRfb3Jfb3ZlcnJpZGVf cmVzdWx0KGN1cnJlbnRfdGVzdCwgInBhc3MiLCAid2FybiIpOworCQl9CisJCWlmIChpZ3RfdmVy c2lvbikgeworCQkJanNvbl9vYmplY3Rfb2JqZWN0X2FkZChjdXJyZW50X3Rlc3QsICJpZ3QtdmVy c2lvbiIsCisJCQkJCSAgICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nX2xlbihpZ3RfdmVyc2lv biwKKwkJCQkJCQkJCSAgaWd0X3ZlcnNpb25fbGVuKSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJ fQorCisJZm9yIChpID0gMDsgaSA8IHN1YnRlc3RzLT5zaXplOyBpKyspIHsKKwkJY2hhciAqYmVn aW5fc3VidGVzdDsKKwkJY2hhciAqc3VidGVzdF9yZXN1bHQ7CisJCWNoYXIgKmJlZywgKmVuZCwg KnN0YXJ0bGluZTsKKwkJaW50IGJlZ2luX2xlbjsKKwkJaW50IHJlc3VsdF9sZW47CisKKwkJaWd0 X25hbWUgPSBnZW5faWd0X25hbWUoYmluYXJ5LCBzdWJ0ZXN0cy0+bmFtZXNbaV0pOworCQljdXJy ZW50X3Rlc3QgPSBnZXRfb3JfY3JlYXRlX2pzb25fb2JqZWN0KHRlc3RzLCBpZ3RfbmFtZSk7CisK KwkJYmVnaW5fbGVuID0gYXNwcmludGYoJmJlZ2luX3N1YnRlc3QsICIlcyVzXG4iLCBzdGFydGlu Z19zdWJ0ZXN0LCBzdWJ0ZXN0cy0+bmFtZXNbaV0pOworCQlyZXN1bHRfbGVuID0gYXNwcmludGYo JnN1YnRlc3RfcmVzdWx0LCAiJXMlczogIiwgc3VidGVzdF9yZXN1bHRfYmVnLCBzdWJ0ZXN0cy0+ bmFtZXNbaV0pOworCisJCWlmIChiZWdpbl9sZW4gPCAwIHx8IHJlc3VsdF9sZW4gPCAwKSB7CisJ CQlmcHJpbnRmKHN0ZGVyciwgIkZhaWx1cmUgZ2VuZXJhdGluZyBzdHJpbmdzXG4iKTsKKwkJCXJl dHVybiBmYWxzZTsKKwkJfQorCisJCWJlZyA9IGZpbmRfbGluZShidWYsIGJlZ2luX3N1YnRlc3Qs IGJlZ2luX2xlbiwgYnVmZW5kKTsKKwkJZW5kID0gZmluZF9saW5lKGJ1Ziwgc3VidGVzdF9yZXN1 bHQsIHJlc3VsdF9sZW4sIGJ1ZmVuZCk7CisJCXN0YXJ0bGluZSA9IGJlZzsKKworCQlmcmVlKGJl Z2luX3N1YnRlc3QpOworCQlmcmVlKHN1YnRlc3RfcmVzdWx0KTsKKworCQlpZiAoYmVnID09IE5V TEwgJiYgZW5kID09IE5VTEwpIHsKKwkJCS8qIE5vIG91dHB1dCBhdCBhbGwgKi8KKwkJCWJlZyA9 IGJ1ZmVuZDsKKwkJCWVuZCA9IGJ1ZmVuZDsKKwkJfQorCisJCWlmIChiZWcgPT0gTlVMTCkgewor CQkJLyoKKwkJCSAqIFN1YnRlc3QgZGlkbid0IHN0YXJ0LCBwcm9iYWJseSBza2lwcGVkIGZyb20K KwkJCSAqIGZpeHR1cmUgYWxyZWFkeS4gRmluZCB0aGUgcHJldmlvdXMgc3VidGVzdAorCQkJICog b3V0cHV0LgorCQkJICovCisJCQliZWcgPSBmaW5kX2VpdGhlcl9saW5lKGJ1ZiwKKwkJCQkJICAg ICAgIHN0YXJ0aW5nX3N1YnRlc3QsIHN0YXJ0aW5nX2xlbiwKKwkJCQkJICAgICAgIHN1YnRlc3Rf cmVzdWx0X2JlZywgc3VidGVzdF9yZXN1bHRfbGVuLAorCQkJCQkgICAgICAgZW5kKTsKKwkJCWlm IChiZWcgPT0gTlVMTCkgeworCQkJCWJlZyA9IGJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkJd2hpbGUg KGJlZyA8IGVuZCkgeworCQkJCQljaGFyICpyZXN1bHQ7CisJCQkJCWJlZyA9IG5leHRfbGluZShi ZWcsIGJ1ZmVuZCk7CisJCQkJCXJlc3VsdCA9IGZpbmRfZWl0aGVyX2xpbmUoYmVnLAorCQkJCQkJ CQkgIHN0YXJ0aW5nX3N1YnRlc3QsIHN0YXJ0aW5nX2xlbiwKKwkJCQkJCQkJICBzdWJ0ZXN0X3Jl c3VsdF9iZWcsIHN1YnRlc3RfcmVzdWx0X2xlbiwKKwkJCQkJCQkJICBidWZlbmQpOworCQkJCQlp ZiAocmVzdWx0ID09IE5VTEwgfHwgcmVzdWx0ID4gZW5kKSB7CisJCQkJCQlicmVhazsKKwkJCQkJ fQorCQkJCQliZWcgPSByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLyogSW5j bHVkZSB0aGUgb3V0cHV0IGFmdGVyIHRoZSBwcmV2aW91cyBzdWJ0ZXN0IG91dHB1dCAqLworCQkJ Y2hhciAqcHJldnRlc3QgPSBmaW5kX2VpdGhlcl9saW5lKGJ1ZiwKKwkJCQkJCQkgIHN0YXJ0aW5n X3N1YnRlc3QsIHN0YXJ0aW5nX2xlbiwKKwkJCQkJCQkgIHN1YnRlc3RfcmVzdWx0X2JlZywgc3Vi dGVzdF9yZXN1bHRfbGVuLAorCQkJCQkJCSAgYmVnKTsKKworCQkJaWYgKHByZXZ0ZXN0ID09IE5V TEwpIHsKKwkJCQliZWcgPSBidWY7CisJCQl9IGVsc2UgeworCQkJCXdoaWxlIChwcmV2dGVzdCAh PSBOVUxMICYmIHByZXZ0ZXN0IDwgYmVnKSB7CisJCQkJCWNoYXIgKnJlc3VsdDsKKwkJCQkJcHJl dnRlc3QgPSBuZXh0X2xpbmUocHJldnRlc3QsIGJlZyk7CisJCQkJCXJlc3VsdCA9IGZpbmRfZWl0 aGVyX2xpbmUocHJldnRlc3QsCisJCQkJCQkJCSAgc3RhcnRpbmdfc3VidGVzdCwgc3RhcnRpbmdf bGVuLAorCQkJCQkJCQkgIHN1YnRlc3RfcmVzdWx0X2JlZywgc3VidGVzdF9yZXN1bHRfbGVuLAor CQkJCQkJCQkgIGJlZyk7CisJCQkJCWlmIChyZXN1bHQgPT0gTlVMTCkgeworCQkJCQkJYmVnID0g cHJldnRlc3Q7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlwcmV2dGVzdCA9IHJlc3VsdDsK KwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZW5kID09IE5VTEwpIHsKKwkJCS8qIEluY29tcGxl dGUgcmVzdWx0LiBGaW5kIHRoZSBuZXh0IHN0YXJ0aW5nIHN1YnRlc3Qgb3IgcmVzdWx0LiAqLwor CQkJZW5kID0gbmV4dF9saW5lKHN0YXJ0bGluZSwgYnVmZW5kKTsKKwkJCWlmIChlbmQgIT0gTlVM TCkgeworCQkJCWVuZCA9IGZpbmRfZWl0aGVyX2xpbmUoZW5kLAorCQkJCQkJICAgICAgIHN0YXJ0 aW5nX3N1YnRlc3QsIHN0YXJ0aW5nX2xlbiwKKwkJCQkJCSAgICAgICBzdWJ0ZXN0X3Jlc3VsdF9i ZWcsIHN1YnRlc3RfcmVzdWx0X2xlbiwKKwkJCQkJCSAgICAgICBidWZlbmQpOworCQkJfQorCQkJ aWYgKGVuZCA9PSBOVUxMKSB7CisJCQkJZW5kID0gYnVmZW5kOworCQkJfQorCQl9IGVsc2Ugewor CQkJLyogU3RyZXRjaCBvbndhcmRzIHVudGlsIHRoZSBuZXh0IHN1YnRlc3QgYmVnaW5zIG9yIGVu ZHMgKi8KKwkJCWNoYXIgKm5leHR0ZXN0ID0gbmV4dF9saW5lKGVuZCwgYnVmZW5kKTsKKwkJCWlm IChuZXh0dGVzdCAhPSBOVUxMKSB7CisJCQkJbmV4dHRlc3QgPSBmaW5kX2VpdGhlcl9saW5lKG5l eHR0ZXN0LAorCQkJCQkJCSAgICBzdGFydGluZ19zdWJ0ZXN0LCBzdGFydGluZ19sZW4sCisJCQkJ CQkJICAgIHN1YnRlc3RfcmVzdWx0X2JlZywgc3VidGVzdF9yZXN1bHRfbGVuLAorCQkJCQkJCSAg ICBidWZlbmQpOworCQkJfQorCQkJaWYgKG5leHR0ZXN0ICE9IE5VTEwpIHsKKwkJCQllbmQgPSBu ZXh0dGVzdDsKKwkJCX0gZWxzZSB7CisJCQkJZW5kID0gYnVmZW5kOworCQkJfQorCQl9CisKKwkJ anNvbl9vYmplY3Rfb2JqZWN0X2FkZChjdXJyZW50X3Rlc3QsIGlzX3N0ZG91dCA/ICJvdXQiIDog ImVyciIsCisJCQkJICAgICAgIGpzb25fb2JqZWN0X25ld19zdHJpbmdfbGVuKGJlZywgZW5kIC0g YmVnKSk7CisKKwkJaWYgKGlzX3N0ZG91dCkgeworCQkJY2hhciAqcmVzdWx0OworCQkJZG91Ymxl IHRpbWU7CisJCQlwYXJzZV9zdWJ0ZXN0X3Jlc3VsdChzdWJ0ZXN0cy0+bmFtZXNbaV0sICZyZXN1 bHQsICZ0aW1lLCBiZWcsIGVuZCk7CisJCQlhZGRfb3Jfb3ZlcnJpZGVfcmVzdWx0KGN1cnJlbnRf dGVzdCwgTlVMTCwgcmVzdWx0KTsKKwkJCWFkZF9ydW50aW1lKGN1cnJlbnRfdGVzdCwgdGltZSk7 CisJCQlpZiAoaWd0X3ZlcnNpb24pIHsKKwkJCQlqc29uX29iamVjdF9vYmplY3RfYWRkKGN1cnJl bnRfdGVzdCwgImlndC12ZXJzaW9uIiwKKwkJCQkJCSAgICAgICBqc29uX29iamVjdF9uZXdfc3Ry aW5nX2xlbihpZ3RfdmVyc2lvbiwKKwkJCQkJCQkJCQkgIGlndF92ZXJzaW9uX2xlbikpOworCQkJ fQorCQl9IGVsc2UgaWYgKGNvdW50X2xpbmVzKHN0YXJ0bGluZSwgZW5kKSA+IDIpIHsKKwkJCWFk ZF9vcl9vdmVycmlkZV9yZXN1bHQoY3VycmVudF90ZXN0LCAicGFzcyIsICJ3YXJuIik7CisJCX0K Kwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFRoaXMgcmVnZXhwIGNvbnRyb2xzIHRo ZSBrbXNnIGhhbmRsaW5nLiBBbGwga2VybmVsIGxvZyByZWNvcmRzIHRoYXQKKyAqIGhhdmUgbG9n IGxldmVsIG9mIHdhcm5pbmcgb3IgaGlnaGVyIGNvbnZlcnQgdGhlIHJlc3VsdCB0bworICogZG1l c2ctd2Fybi9kbWVzZy1mYWlsIHVubGVzcyB0aGV5IG1hdGNoIHRoaXMgcmVnZXhwLgorICovCisK KyNkZWZpbmUgXyAifCIKK3N0YXRpYyBjb25zdCBjaGFyIGlndF9kbWVzZ193aGl0ZWxpc3RbXSA9 CisJIkFDUEk6IGJ1dHRvbjogVGhlIGxpZCBkZXZpY2UgaXMgbm90IGNvbXBsaWFudCB0byBTV19M SUQiIF8KKwkiQUNQSTogLio6IFVuYWJsZSB0byBkb2NrISIgXworCSJJUlEgWzAtOV0rOiBubyBs b25nZXIgYWZmaW5lIHRvIENQVVswLTldKyIgXworCSJJUlEgZml4dXA6IGlycSBbMC05XSsgbW92 ZSBpbiBwcm9ncmVzcywgb2xkIHZlY3RvciBbMC05XSsiIF8KKwkvKiBpOTE1IHRlc3RzIHNldCBt b2R1bGUgb3B0aW9ucywgZXhwZWN0ZWQgbWVzc2FnZSAqLworCSJTZXR0aW5nIGRhbmdlcm91cyBv cHRpb24gW2Etel9dKyAtIHRhaW50aW5nIGtlcm5lbCIgXworCS8qIFJhdyBwcmludGsoKSBjYWxs LCB1c2VzIGRlZmF1bHQgbG9nIGxldmVsICh3YXJuKSAqLworCSJTdXNwZW5kaW5nIGNvbnNvbGVc XChzXFwpIFxcKHVzZSBub19jb25zb2xlX3N1c3BlbmQgdG8gZGVidWdcXCkiIF8KKwkiYXRrYmQg c2VyaW9bMC05XSs6IEZhaWxlZCB0byAoZGVhY3RpdmF0ZXxlbmFibGUpIGtleWJvYXJkIG9uIGlz YVswLTldKy9zZXJpb1swLTldKyIgXworCSJjYWNoZTogcGFyZW50IGNwdVswLTldKyBzaG91bGQg bm90IGJlIHNsZWVwaW5nIiBfCisJImhwZXRbMC05XSs6IGxvc3QgWzAtOV0rIHJ0YyBpbnRlcnJ1 cHRzIiBfCisJLyogaTkxNSBzZWxmdGVzdHMgdGVybWluYXRlIG5vcm1hbGx5IHdpdGggRU5PREVW IGZyb20gdGhlCisJICogbW9kdWxlIGxvYWQgYWZ0ZXIgdGhlIHRlc3RpbmcgZmluaXNoZXMsIHdo aWNoIHByb2R1Y2VzIHRoaXMKKwkgKiBtZXNzYWdlLgorCSAqLworCSJpOTE1OiBwcm9iZSBvZiBb MC05Oi5dKyBmYWlsZWQgd2l0aCBlcnJvciAtMjUiIF8KKwkvKiBzd2lvdGJsIHdhcm5zIGV2ZW4g d2hlbiBhc2tlZCBub3QgdG8gKi8KKwkibW9jazogRE1BOiBPdXQgb2YgU1ctSU9NTVUgc3BhY2Ug Zm9yIFswLTldKyBieXRlcyIgXworCSJ1c2IgdXNiWzAtOV0rOiByb290IGh1YiBsb3N0IHBvd2Vy IG9yIHdhcyByZXNldCIKKwk7CisjdW5kZWYgXworCitzdGF0aWMgcmVnZXhfdCByZTsKKworc3Rh dGljIGJvb2wgaW5pdF9yZWdleF93aGl0ZWxpc3QoKQoreworCWludCBzdGF0dXMgPSAtMTsKKwor CWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJaWYgKHJlZ2NvbXAoJnJlLCBpZ3RfZG1lc2dfd2hpdGVs aXN0LCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpICE9IDApIHsKKwkJCWZwcmludGYoc3RkZXJy LCAiQ2Fubm90IGNvbXBpbGUgZG1lc2cgd2hpdGVsaXN0IHJlZ2V4cFxuIik7CisJCQlzdGF0dXMg PSAwOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJc3RhdHVzID0gMTsKKwl9CisKKwlyZXR1 cm4gc3RhdHVzOworfQorCitzdGF0aWMgYm9vbCBmaWxsX2Zyb21fZG1lc2coaW50IGZkLCBjaGFy ICpiaW5hcnksCisJCQkgICAgc3RydWN0IHN1YnRlc3RzICpzdWJ0ZXN0cywKKwkJCSAgICBzdHJ1 Y3QganNvbl9vYmplY3QgKnRlc3RzKQoreworCWNoYXIgKmxpbmUgPSBOVUxMLCAqd2FybmluZ3Mg PSBOVUxMLCAqZG1lc2cgPSBOVUxMOworCXNpemVfdCBsaW5lbGVuID0gMCwgd2FybmluZ3NsZW4g PSAwLCBkbWVzZ2xlbiA9IDA7CisJc3RydWN0IGpzb25fb2JqZWN0ICpjdXJyZW50X3Rlc3QgPSBO VUxMOworCUZJTEUgKmYgPSBmZG9wZW4oZmQsICJyIik7CisJY2hhciAqaWd0X25hbWUgPSBOVUxM OworCXNzaXplX3QgcmVhZDsKKwlzaXplX3QgaTsKKworCWlmICghZikgeworCQlyZXR1cm4gZmFs c2U7CisJfQorCisJaWYgKGluaXRfcmVnZXhfd2hpdGVsaXN0KCkgIT0gMSkgeworCQlmY2xvc2Uo Zik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwl3aGlsZSAoKHJlYWQgPSBnZXRsaW5lKCZsaW5l LCAmbGluZWxlbiwgZikpID4gMCkgeworCQljaGFyIGZvcm1hdHRlZFsyNTZdOworCQl1bnNpZ25l ZCBmbGFnczsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHNlcSwgdHNfdXNlYzsKKwkJY2hhciBjb250 aW51YXRpb247CisJCWNoYXIgKm1lc3NhZ2UsICpzdWJ0ZXN0OworCQlpbnQgczsKKworCQlzID0g c3NjYW5mKGxpbmUsICIldSwlbGx1LCVsbHUsJWM7IiwgJmZsYWdzLCAmc2VxLCAmdHNfdXNlYywg JmNvbnRpbnVhdGlvbik7CisKKwkJaWYgKHMgIT0gNCkgeworCQkJLyoKKwkJCSAqIE1hY2hpbmUg cmVhZGFibGUga2V5L3ZhbHVlIHBhaXJzIGJlZ2luIHdpdGgKKwkJCSAqIGEgc3BhY2UuIFdlIGln bm9yZSB0aGVtLgorCQkJICovCisJCQlpZiAobGluZVswXSAhPSAnICcpIHsKKwkJCQlmcHJpbnRm KHN0ZGVyciwgIkNhbm5vdCBwYXJzZSBrbXNnIHJlY29yZDogJXNcbiIsIGxpbmUpOworCQkJfQor CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lc3NhZ2UgPSBzdHJjaHIobGluZSwgJzsnKTsKKwkJ aWYgKCFtZXNzYWdlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIDsgZm91bmQsIHRoaXMgc2hv dWxkbid0IGhhcHBlblxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJbWVzc2FnZSsrOwor CQlzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCAiPCV1PiBbJWxsdS4lMDZs bHVdICVzIiwKKwkJCSBmbGFncyAmIDB4MDcsIHRzX3VzZWMgLyAxMDAwMDAwLCB0c191c2VjICUg MTAwMDAwMCwgbWVzc2FnZSk7CisKKwkJaWYgKChzdWJ0ZXN0ID0gc3Ryc3RyKG1lc3NhZ2UsIHN0 YXJ0aW5nX3N1YnRlc3RfZG1lc2cpKSAhPSBOVUxMKSB7CisJCQlpZiAoY3VycmVudF90ZXN0ICE9 IE5VTEwpIHsKKwkJCQkvKiBEb25lIHdpdGggdGhlIHByZXZpb3VzIHN1YnRlc3QsIGZpbGUgdXAg Ki8KKwkJCQlqc29uX29iamVjdF9vYmplY3RfYWRkKGN1cnJlbnRfdGVzdCwgImRtZXNnIiwKKwkJ CQkJCSAgICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nX2xlbihkbWVzZywgZG1lc2dsZW4pKTsK KwkJCQlpZiAod2FybmluZ3MpIHsKKwkJCQkJanNvbl9vYmplY3Rfb2JqZWN0X2FkZChjdXJyZW50 X3Rlc3QsICJkbWVzZy13YXJuaW5ncyIsCisJCQkJCQkJICAgICAgIGpzb25fb2JqZWN0X25ld19z dHJpbmdfbGVuKHdhcm5pbmdzLCB3YXJuaW5nc2xlbikpOworCQkJCQlhZGRfb3Jfb3ZlcnJpZGVf cmVzdWx0KGN1cnJlbnRfdGVzdCwgInBhc3MiLCAiZG1lc2ctd2FybiIpOworCQkJCQlhZGRfb3Jf b3ZlcnJpZGVfcmVzdWx0KGN1cnJlbnRfdGVzdCwgImZhaWwiLCAiZG1lc2ctZmFpbCIpOworCQkJ CQlhZGRfb3Jfb3ZlcnJpZGVfcmVzdWx0KGN1cnJlbnRfdGVzdCwgIndhcm4iLCAiZG1lc2ctd2Fy biIpOworCQkJCX0KKwkJCQlmcmVlKGRtZXNnKTsKKwkJCQlmcmVlKHdhcm5pbmdzKTsKKwkJCQlk bWVzZyA9IHdhcm5pbmdzID0gTlVMTDsKKwkJCQlkbWVzZ2xlbiA9IHdhcm5pbmdzbGVuID0gMDsK KwkJCX0KKworCQkJc3VidGVzdCArPSBzdGFydGluZ19zdWJ0ZXN0X2RtZXNnX2xlbjsKKwkJCWln dF9uYW1lID0gZ2VuX2lndF9uYW1lKGJpbmFyeSwgc3VidGVzdCk7CisJCQljdXJyZW50X3Rlc3Qg PSBnZXRfb3JfY3JlYXRlX2pzb25fb2JqZWN0KHRlc3RzLCBpZ3RfbmFtZSk7CisJCX0KKworCQlp ZiAoKGZsYWdzICYgMHgwNykgPD0gNCAmJiBjb250aW51YXRpb24gIT0gJ2MnICYmCisJCSAgICBy ZWdleGVjKCZyZSwgbWVzc2FnZSwgKHNpemVfdCkwLCBOVUxMLCAwKSA9PSBSRUdfTk9NQVRDSCkg eworCQkJYXBwZW5kX2xpbmUoJndhcm5pbmdzLCAmd2FybmluZ3NsZW4sIGZvcm1hdHRlZCk7CisJ CX0KKwkJYXBwZW5kX2xpbmUoJmRtZXNnLCAmZG1lc2dsZW4sIGZvcm1hdHRlZCk7CisJfQorCisJ aWYgKGN1cnJlbnRfdGVzdCAhPSBOVUxMKSB7CisJCWpzb25fb2JqZWN0X29iamVjdF9hZGQoY3Vy cmVudF90ZXN0LCAiZG1lc2ciLAorCQkJCSAgICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nX2xl bihkbWVzZywgZG1lc2dsZW4pKTsKKwkJaWYgKHdhcm5pbmdzKSB7CisJCQlqc29uX29iamVjdF9v YmplY3RfYWRkKGN1cnJlbnRfdGVzdCwgImRtZXNnLXdhcm5pbmdzIiwKKwkJCQkJICAgICAgIGpz b25fb2JqZWN0X25ld19zdHJpbmdfbGVuKHdhcm5pbmdzLCB3YXJuaW5nc2xlbikpOworCQkJYWRk X29yX292ZXJyaWRlX3Jlc3VsdChjdXJyZW50X3Rlc3QsICJwYXNzIiwgImRtZXNnLXdhcm4iKTsK KwkJCWFkZF9vcl9vdmVycmlkZV9yZXN1bHQoY3VycmVudF90ZXN0LCAiZmFpbCIsICJkbWVzZy1m YWlsIik7CisJCQlhZGRfb3Jfb3ZlcnJpZGVfcmVzdWx0KGN1cnJlbnRfdGVzdCwgIndhcm4iLCAi ZG1lc2ctd2FybiIpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRGlkbid0IGdldCBhbnkg c3VidGVzdCBtZXNzYWdlcyBhdCBhbGwuIElmIHRoZXJlCisJCSAqIGFyZSBzdWJ0ZXN0cywgYWRk IGFsbCBvZiB0aGUgZG1lc2cgZ290dGVuIHRvIGFsbCBvZgorCQkgKiB0aGVtLgorCQkgKi8KKwkJ Zm9yIChpID0gMDsgaSA8IHN1YnRlc3RzLT5zaXplOyBpKyspIHsKKwkJCWlndF9uYW1lID0gZ2Vu X2lndF9uYW1lKGJpbmFyeSwgc3VidGVzdHMtPm5hbWVzW2ldKTsKKwkJCWN1cnJlbnRfdGVzdCA9 IGdldF9vcl9jcmVhdGVfanNvbl9vYmplY3QodGVzdHMsIGlndF9uYW1lKTsKKwkJCWpzb25fb2Jq ZWN0X29iamVjdF9hZGQoY3VycmVudF90ZXN0LCAiZG1lc2ciLAorCQkJCQkgICAgICAganNvbl9v YmplY3RfbmV3X3N0cmluZ19sZW4oZG1lc2csIGRtZXNnbGVuKSk7CisJCQkvKgorCQkJICogRG9u J3QgYm90aGVyIHdpdGggd2FybmluZ3MsIGFueSBzdWJ0ZXN0cworCQkJICogdGhlcmUgYXJlIHdv dWxkIGhhdmUgc2tpcCBhcyB0aGVpciByZXN1bHQKKwkJCSAqIGFueXdheS4KKwkJCSAqLworCQl9 CisKKwkJaWYgKGkgPT0gMCkgeworCQkJLyogVGhlcmUgd2VyZSBubyBzdWJ0ZXN0cyAqLworCQkJ aWd0X25hbWUgPSBnZW5faWd0X25hbWUoYmluYXJ5LCBOVUxMKTsKKwkJCWN1cnJlbnRfdGVzdCA9 IGdldF9vcl9jcmVhdGVfanNvbl9vYmplY3QodGVzdHMsIGlndF9uYW1lKTsKKwkJCWpzb25fb2Jq ZWN0X29iamVjdF9hZGQoY3VycmVudF90ZXN0LCAiZG1lc2ciLAorCQkJCQkgICAgICAganNvbl9v YmplY3RfbmV3X3N0cmluZ19sZW4oZG1lc2csIGRtZXNnbGVuKSk7CisJCQlpZiAod2FybmluZ3Mp IHsKKwkJCQlqc29uX29iamVjdF9vYmplY3RfYWRkKGN1cnJlbnRfdGVzdCwgImRtZXNnLXdhcm5p bmdzIiwKKwkJCQkJCSAgICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nX2xlbih3YXJuaW5ncywg d2FybmluZ3NsZW4pKTsKKwkJCQlhZGRfb3Jfb3ZlcnJpZGVfcmVzdWx0KGN1cnJlbnRfdGVzdCwg InBhc3MiLCAiZG1lc2ctd2FybiIpOworCQkJCWFkZF9vcl9vdmVycmlkZV9yZXN1bHQoY3VycmVu dF90ZXN0LCAiZmFpbCIsICJkbWVzZy1mYWlsIik7CisJCQkJYWRkX29yX292ZXJyaWRlX3Jlc3Vs dChjdXJyZW50X3Rlc3QsICJ3YXJuIiwgImRtZXNnLXdhcm4iKTsKKwkJCX0KKwkJfQorCX0KKwor CS8qCisJICogQWRkIGFuIGVtcHR5IHN0cmluZyBhcyB0aGUgZG1lc2cgb2YgYWxsIHN1YnRlc3Rz IHRoYXQKKwkgKiBkaWRuJ3QgZ2V0IGFueSBkbWVzZyB5ZXQuCisJICovCisJZm9yIChpID0gMDsg aSA8IHN1YnRlc3RzLT5zaXplOyBpKyspIHsKKwkJaWd0X25hbWUgPSBnZW5faWd0X25hbWUoYmlu YXJ5LCBzdWJ0ZXN0cy0+bmFtZXNbaV0pOworCQljdXJyZW50X3Rlc3QgPSBnZXRfb3JfY3JlYXRl X2pzb25fb2JqZWN0KHRlc3RzLCBpZ3RfbmFtZSk7CisJCWlmICghanNvbl9vYmplY3Rfb2JqZWN0 X2dldF9leChjdXJyZW50X3Rlc3QsICJkbWVzZyIsIE5VTEwpKSB7CisJCQlqc29uX29iamVjdF9v YmplY3RfYWRkKGN1cnJlbnRfdGVzdCwgImRtZXNnIiwKKwkJCQkJICAgICAgIGpzb25fb2JqZWN0 X25ld19zdHJpbmcoIiIpKTsKKwkJfQorCX0KKworCWZyZWUoZG1lc2cpOworCWZyZWUod2Fybmlu Z3MpOworCWZjbG9zZShmKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNoYXIgKnJlc3Vs dF9mcm9tX2V4aXRjb2RlKGludCBleGl0Y29kZSkKK3sKKwlzd2l0Y2ggKGV4aXRjb2RlKSB7CisJ Y2FzZSBJR1RfRVhJVF9USU1FT1VUOgorCQlyZXR1cm4gInRpbWVvdXQiOworCWNhc2UgSUdUX0VY SVRfU0tJUDoKKwkJcmV0dXJuICJza2lwIjsKKwljYXNlIElHVF9FWElUX1NVQ0NFU1M6CisJCXJl dHVybiAicGFzcyI7CisJY2FzZSBJR1RfRVhJVF9JTlZBTElEOgorCQlyZXR1cm4gIm5vdHJ1biI7 CisJZGVmYXVsdDoKKwkJcmV0dXJuICJmYWlsIjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9z dWJ0ZXN0KHN0cnVjdCBzdWJ0ZXN0cyAqc3VidGVzdHMsIGNoYXIgKnN1YnRlc3QpCit7CisJc2l6 ZV90IGxlbiA9IHN0cmxlbihzdWJ0ZXN0KTsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuOwor CisJaWYgKHN1YnRlc3RbbGVuIC0gMV0gPT0gJ1xuJykKKwkJc3VidGVzdFtsZW4gLSAxXSA9ICdc MCc7CisKKwlzdWJ0ZXN0cy0+c2l6ZSsrOworCXN1YnRlc3RzLT5uYW1lcyA9IHJlYWxsb2Moc3Vi dGVzdHMtPm5hbWVzLCBzaXplb2YoKnN1YnRlc3RzLT5uYW1lcykgKiBzdWJ0ZXN0cy0+c2l6ZSk7 CisJc3VidGVzdHMtPm5hbWVzW3N1YnRlc3RzLT5zaXplIC0gMV0gPSBzdWJ0ZXN0OworfQorCitz dGF0aWMgYm9vbCBmaWxsX2Zyb21fam91cm5hbChpbnQgZmQsIGNoYXIgKmJpbmFyeSwKKwkJCQkg IHN0cnVjdCBzdWJ0ZXN0cyAqc3VidGVzdHMsCisJCQkJICBzdHJ1Y3QganNvbl9vYmplY3QgKnRl c3RzKQoreworCUZJTEUgKmYgPSBmZG9wZW4oZmQsICJyIik7CisJY2hhciAqbGluZSA9IE5VTEw7 CisJc2l6ZV90IGxpbmVsZW4gPSAwOworCXNzaXplX3QgcmVhZDsKKwljaGFyIGV4aXRsaW5lW10g PSAiZXhpdDoiOworCXNpemVfdCBleGl0bGVuID0gc2l6ZW9mKGV4aXRsaW5lKSAtIDE7CisJY2hh ciB0aW1lb3V0bGluZVtdID0gInRpbWVvdXQ6IjsKKwlzaXplX3QgdGltZW91dGxlbiA9IHNpemVv Zih0aW1lb3V0bGluZSkgLSAxOworCWludCBleGl0Y29kZSA9IDEwMDAwOworCisJd2hpbGUgKChy ZWFkID0gZ2V0bGluZSgmbGluZSwgJmxpbmVsZW4sIGYpKSA+IDApIHsKKwkJaWYgKHJlYWQgPj0g ZXhpdGxlbiAmJiAhbWVtY21wKGxpbmUsIGV4aXRsaW5lLCBleGl0bGVuKSkgeworCQkJY2hhciAq cCA9IHN0cmNocihsaW5lLCAnKCcpOworCQkJY2hhciAqaWd0X25hbWUgPSBnZW5faWd0X25hbWUo YmluYXJ5LCBOVUxMKTsKKwkJCWRvdWJsZSB0aW1lID0gMC4wOworCQkJc3RydWN0IGpzb25fb2Jq ZWN0ICpvYmogPSBnZXRfb3JfY3JlYXRlX2pzb25fb2JqZWN0KHRlc3RzLCBpZ3RfbmFtZSk7CisK KwkJCWV4aXRjb2RlID0gYXRvaShsaW5lICsgZXhpdGxlbik7CisKKwkJCWlmIChwKSB7CisJCQkJ dGltZSA9IHN0cnRvZChwICsgMSwgTlVMTCk7CisJCQl9CisKKwkJCWFkZF9ydW50aW1lKG9iaiwg dGltZSk7CisJCX0gZWxzZSBpZiAocmVhZCA+PSB0aW1lb3V0bGVuICYmICFtZW1jbXAobGluZSwg dGltZW91dGxpbmUsIHRpbWVvdXRsZW4pKSB7CisJCQlpZiAoc3VidGVzdHMtPnNpemUpIHsKKwkJ CQljaGFyICpsYXN0X3N1YnRlc3QgPSBzdWJ0ZXN0cy0+bmFtZXNbc3VidGVzdHMtPnNpemUgLSAx XTsKKwkJCQljaGFyICppZ3RfbmFtZSA9IGdlbl9pZ3RfbmFtZShiaW5hcnksIGxhc3Rfc3VidGVz dCk7CisJCQkJY2hhciAqcCA9IHN0cmNocihsaW5lLCAnKCcpOworCQkJCWRvdWJsZSB0aW1lID0g MC4wOworCQkJCXN0cnVjdCBqc29uX29iamVjdCAqb2JqID0gZ2V0X29yX2NyZWF0ZV9qc29uX29i amVjdCh0ZXN0cywgaWd0X25hbWUpOworCisJCQkJanNvbl9vYmplY3Rfb2JqZWN0X2FkZChvYmos ICJyZXN1bHQiLAorCQkJCQkJICAgICAgIGpzb25fb2JqZWN0X25ld19zdHJpbmcoInRpbWVvdXQi KSk7CisKKwkJCQlpZiAocCkgeworCQkJCQl0aW1lID0gc3RydG9kKHAgKyAxLCBOVUxMKTsKKwkJ CQl9CisKKwkJCQlhZGRfcnVudGltZShvYmosIHRpbWUpOworCisJCQkJaWd0X25hbWUgPSBnZW5f aWd0X25hbWUoYmluYXJ5LCBOVUxMKTsKKwkJCQlvYmogPSBnZXRfb3JfY3JlYXRlX2pzb25fb2Jq ZWN0KHRlc3RzLCBpZ3RfbmFtZSk7CisJCQkJYWRkX3J1bnRpbWUob2JqLCB0aW1lKTsKKwkJCX0K KwkJfSBlbHNlIHsKKwkJCWFkZF9zdWJ0ZXN0KHN1YnRlc3RzLCBzdHJkdXAobGluZSkpOworCQl9 CisJfQorCisJaWYgKHN1YnRlc3RzLT5zaXplID09IDAgJiYgZXhpdGNvZGUgIT0gMTAwMDApIHsK KwkJY2hhciAqaWd0X25hbWUgPSBnZW5faWd0X25hbWUoYmluYXJ5LCBOVUxMKTsKKwkJc3RydWN0 IGpzb25fb2JqZWN0ICpvYmogPSBnZXRfb3JfY3JlYXRlX2pzb25fb2JqZWN0KHRlc3RzLCBpZ3Rf bmFtZSk7CisJCWNoYXIgKnJlc3VsdCA9IHJlc3VsdF9mcm9tX2V4aXRjb2RlKGV4aXRjb2RlKTsK KwkJanNvbl9vYmplY3Rfb2JqZWN0X2FkZChvYmosICJyZXN1bHQiLAorCQkJCSAgICAgICBqc29u X29iamVjdF9uZXdfc3RyaW5nKHJlc3VsdCkpOworCX0KKworCWZyZWUobGluZSk7CisJcmV0dXJu IHRydWU7Cit9CisKK3N0YXRpYyBib29sIHBhcnNlX3Rlc3RfZGlyZWN0b3J5KGludCBkaXJmZCwg Y2hhciAqYmluYXJ5LCBzdHJ1Y3QganNvbl9vYmplY3QgKnRlc3RzKQoreworCWludCBmZHNbX0Zf TEFTVF07CisJc3RydWN0IHN1YnRlc3RzIHN1YnRlc3RzID0ge307CisKKwlpZiAoIW9wZW5fb3V0 cHV0X2ZpbGVzKGRpcmZkLCBmZHMsIGZhbHNlKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9y IG9wZW5pbmcgb3V0cHV0IGZpbGVzXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIGZp bGxfZnJvbV9qb3VybmFsIGFsc28gZmlsbHMgdGhlIHN1YnRlc3RzIHN0cnVjdCAqLworCWlmICgh ZmlsbF9mcm9tX2pvdXJuYWwoZmRzW19GX0pPVVJOQUxdLCBiaW5hcnksICZzdWJ0ZXN0cywgdGVz dHMpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBmcm9tIGpvdXJuYWxcbiIp OworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogT3JkZXIgb2YgdGhlc2UgaXMgaW1wb3J0YW50 ICovCisJaWYgKCFmaWxsX2Zyb21fb3V0cHV0KGZkc1tfRl9PVVRdLCBiaW5hcnksIHRydWUsICZz dWJ0ZXN0cywgdGVzdHMpIHx8CisJICAgICFmaWxsX2Zyb21fb3V0cHV0KGZkc1tfRl9FUlJdLCBi aW5hcnksIGZhbHNlLCAmc3VidGVzdHMsIHRlc3RzKSB8fAorCSAgICAhZmlsbF9mcm9tX2RtZXNn KGZkc1tfRl9ETUVTR10sIGJpbmFyeSwgJnN1YnRlc3RzLCB0ZXN0cykpIHsKKwkJZnByaW50Zihz dGRlcnIsICJFcnJvciBwYXJzaW5nIG91dHB1dCBmaWxlc1xuIik7CisJCXJldHVybiBmYWxzZTsK Kwl9CisKKwljbG9zZV9vdXRwdXRzKGZkcyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBn ZW5lcmF0ZV9yZXN1bHRzKGludCBkaXJmZCkKK3sKKwlzdHJ1Y3Qgc2V0dGluZ3Mgc2V0dGluZ3M7 CisJc3RydWN0IGpvYl9saXN0IGpvYl9saXN0OworCXN0cnVjdCBqc29uX29iamVjdCAqb2JqLCAq dGVzdHM7CisJaW50IHJlc3VsdHNmZCwgdGVzdGRpcmZkLCB1bmFtZWZkOworCWNvbnN0IGNoYXIg Kmpzb25fc3RyaW5nOworCXNpemVfdCBpOworCisJaW5pdF9zZXR0aW5ncygmc2V0dGluZ3MpOwor CWluaXRfam9iX2xpc3QoJmpvYl9saXN0KTsKKworCWlmICghcmVhZF9zZXR0aW5ncygmc2V0dGlu Z3MsIGRpcmZkKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlc3VsdGdlbjogQ2Fubm90IHBhcnNl IHNldHRpbmdzXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghcmVhZF9qb2JfbGlz dCgmam9iX2xpc3QsIGRpcmZkKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlc3VsdGdlbjogQ2Fu bm90IHBhcnNlIGpvYiBsaXN0XG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIFRPRE86 IHNldHRpbmdzLm92ZXJ3cml0ZSAqLworCWlmICgocmVzdWx0c2ZkID0gb3BlbmF0KGRpcmZkLCAi cmVzdWx0cy5qc29uIiwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY2NikpIDwgMCkg eworCQlmcHJpbnRmKHN0ZGVyciwgInJlc3VsdGdlbjogQ2Fubm90IGNyZWF0ZSByZXN1bHRzIGZp bGVcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJb2JqID0ganNvbl9vYmplY3RfbmV3X29i amVjdCgpOworCWpzb25fb2JqZWN0X29iamVjdF9hZGQob2JqLCAiX190eXBlX18iLCBqc29uX29i amVjdF9uZXdfc3RyaW5nKCJUZXN0cnVuUmVzdWx0IikpOworCWpzb25fb2JqZWN0X29iamVjdF9h ZGQob2JqLCAicmVzdWx0c192ZXJzaW9uIiwganNvbl9vYmplY3RfbmV3X2ludCg5KSk7CisJanNv bl9vYmplY3Rfb2JqZWN0X2FkZChvYmosICJuYW1lIiwKKwkJCSAgICAgICBzZXR0aW5ncy5uYW1l ID8KKwkJCSAgICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nKHNldHRpbmdzLm5hbWUpIDoKKwkJ CSAgICAgICBqc29uX29iamVjdF9uZXdfc3RyaW5nKCIiKSk7CisKKwlpZiAoKHVuYW1lZmQgPSBv cGVuYXQoZGlyZmQsICJ1bmFtZS50eHQiLCBPX1JET05MWSkpID49IDApIHsKKwkJY2hhciBidWZb MTI4XTsKKwkJc3NpemVfdCByID0gcmVhZCh1bmFtZWZkLCBidWYsIDEyOCk7CisKKwkJaWYgKHIg PiAwICYmIGJ1ZltyIC0gMV0gPT0gJ1xuJykKKwkJCXItLTsKKworCQlqc29uX29iamVjdF9vYmpl Y3RfYWRkKG9iaiwgInVuYW1lIiwKKwkJCQkgICAgICAganNvbl9vYmplY3RfbmV3X3N0cmluZ19s ZW4oYnVmLCByKSk7CisJCWNsb3NlKHVuYW1lZmQpOworCX0KKworCS8qIGxzcGNpICovCisJLyog cmVzdWx0c192ZXJzaW9uICovCisJLyogZ2x4aW5mbyAqLworCS8qIHdnbGluZm8gKi8KKwkvKiBj bGluZm8gKi8KKwkvKiBvcHRpb25zICovCisJLyogdGltZV9lbGFwc2VkICovCisJLyogdG90YWxz ICovCisKKwl0ZXN0cyA9IGpzb25fb2JqZWN0X25ld19vYmplY3QoKTsKKwlqc29uX29iamVjdF9v YmplY3RfYWRkKG9iaiwgInRlc3RzIiwgdGVzdHMpOworCisJZm9yIChpID0gMDsgaSA8IGpvYl9s aXN0LnNpemU7IGkrKykgeworCQljaGFyIG5hbWVbMTZdOworCisJCXNucHJpbnRmKG5hbWUsIDE2 LCAiJXpkIiwgaSk7CisJCWlmICgodGVzdGRpcmZkID0gb3BlbmF0KGRpcmZkLCBuYW1lLCBPX0RJ UkVDVE9SWSB8IE9fUkRPTkxZKSkgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6 IENhbm5vdCBvcGVuIHJlc3VsdCBkaXJlY3RvcnkgJXNcbiIsIG5hbWUpOworCQkJYnJlYWs7CisJ CX0KKworCQlpZiAoIXBhcnNlX3Rlc3RfZGlyZWN0b3J5KHRlc3RkaXJmZCwgam9iX2xpc3QuZW50 cmllc1tpXS5iaW5hcnksIHRlc3RzKSkgeworCQkJY2xvc2UocmVzdWx0c2ZkKTsKKwkJCXJldHVy biBmYWxzZTsKKwkJfQorCX0KKworCWpzb25fc3RyaW5nID0ganNvbl9vYmplY3RfdG9fanNvbl9z dHJpbmdfZXh0KG9iaiwgSlNPTl9DX1RPX1NUUklOR19QUkVUVFkpOworCXdyaXRlKHJlc3VsdHNm ZCwganNvbl9zdHJpbmcsIHN0cmxlbihqc29uX3N0cmluZykpOworCXJldHVybiB0cnVlOworfQor Citib29sIGdlbmVyYXRlX3Jlc3VsdHNfcGF0aChjaGFyICpyZXN1bHRzcGF0aCkKK3sKKwlpbnQg ZGlyZmQgPSBvcGVuKHJlc3VsdHNwYXRoLCBPX0RJUkVDVE9SWSB8IE9fUkRPTkxZKTsKKworCWlm IChkaXJmZCA8IDApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBnZW5lcmF0ZV9yZXN1bHRz KGRpcmZkKTsKK30KZGlmZiAtLWdpdCBhL3J1bm5lci9yZXN1bHRnZW4uaCBiL3J1bm5lci9yZXN1 bHRnZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uODNhMDg3NmIKLS0t IC9kZXYvbnVsbAorKysgYi9ydW5uZXIvcmVzdWx0Z2VuLmgKQEAgLTAsMCArMSw5IEBACisjaWZu ZGVmIFJVTk5FUl9SRVNVTFRHRU5fSAorI2RlZmluZSBSVU5ORVJfUkVTVUxUR0VOX0gKKworI2lu Y2x1ZGUgPHN0ZGJvb2wuaD4KKworYm9vbCBnZW5lcmF0ZV9yZXN1bHRzKGludCBkaXJmZCk7Citi b29sIGdlbmVyYXRlX3Jlc3VsdHNfcGF0aChjaGFyICpyZXN1bHRzcGF0aCk7CisKKyNlbmRpZgpk aWZmIC0tZ2l0IGEvcnVubmVyL3Jlc3VsdHMuYyBiL3J1bm5lci9yZXN1bHRzLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjNlYjdjYjE1Ci0tLSAvZGV2L251bGwKKysrIGIv cnVubmVyL3Jlc3VsdHMuYwpAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8ZmNudGwuaD4KKyNp bmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0 Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJyZXN1bHRnZW4uaCIKKwor aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBkaXJmZDsKKworCWlmIChh cmdjIDwgMikKKwkJZXhpdCgxKTsKKworCWRpcmZkID0gb3Blbihhcmd2WzFdLCBPX0RJUkVDVE9S WSB8IE9fUkRPTkxZKTsKKwlpZiAoZGlyZmQgPCAwKQorCQlleGl0KDEpOworCisJaWYgKGdlbmVy YXRlX3Jlc3VsdHMoZGlyZmQpKSB7CisJCXByaW50ZigiUmVzdWx0cyBnZW5lcmF0ZWRcbiIpOwor CQlleGl0KDApOworCX0KKworCWV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9ydW5uZXIvcnVubmVy LmMgYi9ydW5uZXIvcnVubmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAu LmI2ODU3ODZhCi0tLSAvZGV2L251bGwKKysrIGIvcnVubmVyL3J1bm5lci5jCkBAIC0wLDAgKzEs NDAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVk ZSAic2V0dGluZ3MuaCIKKyNpbmNsdWRlICJqb2JfbGlzdC5oIgorI2luY2x1ZGUgImV4ZWN1dG9y LmgiCisjaW5jbHVkZSAicmVzdWx0Z2VuLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoq YXJndikKK3sKKwlzdHJ1Y3Qgc2V0dGluZ3Mgc2V0dGluZ3M7CisJc3RydWN0IGpvYl9saXN0IGpv Yl9saXN0OworCXN0cnVjdCBleGVjdXRlX3N0YXRlIHN0YXRlOworCisJaW5pdF9zZXR0aW5ncygm c2V0dGluZ3MpOworCWluaXRfam9iX2xpc3QoJmpvYl9saXN0KTsKKworCWlmICghcGFyc2Vfb3B0 aW9ucyhhcmdjLCBhcmd2LCAmc2V0dGluZ3MpKSB7CisJCXJldHVybiAxOworCX0KKworCWlmICgh Y3JlYXRlX2pvYl9saXN0KCZqb2JfbGlzdCwgJnNldHRpbmdzKSkgeworCQlyZXR1cm4gMTsKKwl9 CisKKwlpZiAoIWluaXRpYWxpemVfZXhlY3V0ZV9zdGF0ZSgmc3RhdGUsICZzZXR0aW5ncywgJmpv Yl9saXN0KSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWV4ZWN1dGUoJnN0YXRlLCAmc2V0 dGluZ3MsICZqb2JfbGlzdCkpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFnZW5lcmF0ZV9y ZXN1bHRzX3BhdGgoc2V0dGluZ3MucmVzdWx0c19wYXRoKSkgeworCQlyZXR1cm4gMTsKKwl9CisK KwlwcmludGYoIkRvbmUuXG4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3J1bm5lci9z ZXR0aW5ncy5jIGIvcnVubmVyL3NldHRpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAuLjUwZTRlYTEwCi0tLSAvZGV2L251bGwKKysrIGIvcnVubmVyL3NldHRpbmdzLmMK QEAgLTAsMCArMSw1MDYgQEAKKyNpbmNsdWRlICJzZXR0aW5ncy5oIgorCisjaW5jbHVkZSA8ZmNu dGwuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNpbmNsdWRl IDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lu Y2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9z dGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2VudW0geworCU9QVF9BQk9SVF9PTl9FUlJP UiwKKwlPUFRfVEVTVF9MSVNULAorCU9QVF9JR05PUkVfTUlTU0lORywKKwlPUFRfSEVMUCA9ICdo JywKKwlPUFRfTkFNRSA9ICduJywKKwlPUFRfRFJZX1JVTiA9ICdkJywKKwlPUFRfSU5DTFVERSA9 ICd0JywKKwlPUFRfRVhDTFVERSA9ICd4JywKKwlPUFRfU1lOQyA9ICdzJywKKwlPUFRfTE9HX0xF VkVMID0gJ2wnLAorCU9QVF9PVkVSV1JJVEUgPSAnbycsCisJT1BUX01VTFRJUExFID0gJ20nLAor CU9QVF9USU1FT1VUID0gJ2MnLAorCU9QVF9XQVRDSERPRyA9ICdnJywKK307CisKK3N0YXRpYyBz dHJ1Y3QgeworCWludCBsZXZlbDsKKwljb25zdCBjaGFyICpuYW1lOworfSBsb2dfbGV2ZWxzW10g PSB7CisJeyBMT0dfTEVWRUxfTk9STUFMLCAibm9ybWFsIiB9LAorCXsgTE9HX0xFVkVMX1FVSUVU LCAicXVpZXQiIH0sCisJeyBMT0dfTEVWRUxfVkVSQk9TRSwgInZlcmJvc2UiIH0sCisJeyAwLCAw IH0sCit9OworCitzdGF0aWMgYm9vbCBzZXRfbG9nX2xldmVsKHN0cnVjdCBzZXR0aW5ncyogc2V0 dGluZ3MsIGNvbnN0IGNoYXIgKmxldmVsKQoreworCWludCBjOworCisJZm9yIChjID0gMDsgbG9n X2xldmVsc1tjXS5uYW1lICE9IE5VTEw7IGMrKykgeworCQlpZiAoIXN0cmNtcChsZXZlbCwgbG9n X2xldmVsc1tjXS5uYW1lKSkgeworCQkJc2V0dGluZ3MtPmxvZ19sZXZlbCA9IGxvZ19sZXZlbHNb Y10ubGV2ZWw7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30K Kworc3RhdGljIGNvbnN0IGNoYXIgKnVzYWdlX3N0ciA9CisJInVzYWdlOiBydW5uZXIgW29wdGlv bnNdIFt0ZXN0X3Jvb3RdIHJlc3VsdHMtcGF0aFxuXG4iCisJIk9wdGlvbnM6XG4iCisJIiBQaWds aXQgY29tcGF0aWJsZTpcbiIKKwkiICAtaCwgLS1oZWxwICAgICAgICAgICAgU2hvdyB0aGlzIGhl bHAgbWVzc2FnZSBhbmQgZXhpdFxuIgorCSIgIC1uIDx0ZXN0IG5hbWU+LCAtLW5hbWUgPHRlc3Qg bmFtZT5cbiIKKwkiICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGlzIHRlc3QgcnVu XG4iCisJIiAgLWQsIC0tZHJ5LXJ1biAgICAgICAgIERvIG5vdCBleGVjdXRlIHRoZSB0ZXN0c1xu IgorCSIgIC10IDxyZWdleD4sIC0taW5jbHVkZS10ZXN0cyA8cmVnZXg+XG4iCisJIiAgICAgICAg ICAgICAgICAgICAgICAgIFJ1biBvbmx5IG1hdGNoaW5nIHRlc3RzIChjYW4gYmUgdXNlZCBtb3Jl IHRoYW4gb25jZSlcbiIKKwkiICAteCA8cmVnZXg+LCAtLWV4Y2x1ZGUtdGVzdHMgPHJlZ2V4Plxu IgorCSIgICAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRlIG1hdGNoaW5nIHRlc3RzIChjYW4g YmUgdXNlZCBtb3JlIHRoYW4gb25jZSlcbiIKKwkiICAtLWFib3J0LW9uLW1vbml0b3JlZC1lcnJv clxuIgorCSIgICAgICAgICAgICAgICAgICAgICAgICBBYm9ydCBleGVjdXRpb24gd2hlbiBhIGZh dGFsIGNvbmRpdGlvbiBpcyBkZXRlY3RlZC5cbiIKKwkiICAgICAgICAgICAgICAgICAgICAgICAg PFRPRE8+XG4iCisJIiAgLXMsIC0tc3luYyAgICAgICAgICAgIFN5bmMgcmVzdWx0cyB0byBkaXNr IGFmdGVyIGV2ZXJ5IHRlc3RcbiIKKwkiICAtbCB7cXVpZXQsdmVyYm9zZSxkdW1teX0sIC0tbG9n LWxldmVsIHtxdWlldCx2ZXJib3NlLGR1bW15fVxuIgorCSIgICAgICAgICAgICAgICAgICAgICAg ICBTZXQgdGhlIGxvZ2dlciB2ZXJib3NpdHkgbGV2ZWxcbiIKKwkiICAtLXRlc3QtbGlzdCBURVNU X0xJU1RcbiIKKwkiICAgICAgICAgICAgICAgICAgICAgICAgQSBmaWxlIGNvbnRhaW5pbmcgYSBs aXN0IG9mIHRlc3RzIHRvIHJ1blxuIgorCSIgIC1vLCAtLW92ZXJ3cml0ZSAgICAgICBJZiB0aGUg cmVzdWx0cy1wYXRoIGFscmVhZHkgZXhpc3RzLCBkZWxldGUgaXRcbiIKKwkiICAtLWlnbm9yZS1t aXNzaW5nICAgICAgSWdub3JlZCBidXQgYWNjZXB0ZWQsIGZvciBwaWdsaXQgY29tcGF0aWJpbGl0 eVxuIgorCSJcbiIKKwkiIEluY29tcGF0aWJsZSBvcHRpb25zOlxuIgorCSIgIC1tLCAtLW11bHRp cGxlLW1vZGUgICBSdW4gbXVsdGlwbGUgc3VidGVzdHMgaW4gdGhlIHNhbWUgYmluYXJ5IGV4ZWN1 dGlvbi5cbiIKKwkiICAgICAgICAgICAgICAgICAgICAgICAgSWYgYSB0ZXN0bGlzdCBmaWxlIGlz IGdpdmVuLCBjb25zZWN1dGl2ZSBzdWJ0ZXN0cyBhcmVcbiIKKwkiICAgICAgICAgICAgICAgICAg ICAgICAgcnVuIGluIHRoZSBzYW1lIGV4ZWN1dGlvbiBpZiB0aGV5IGFyZSBmcm9tIHRoZSBzYW1l XG4iCisJIiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeS4gTm90ZSB0aGF0IGluIHRoYXQg Y2FzZSByZWxhdGl2ZSBvcmRlcmluZyBvZiB0aGVcbiIKKwkiICAgICAgICAgICAgICAgICAgICAg ICAgc3VidGVzdCBleGVjdXRpb24gaXMgZGljdGF0ZWQgYnkgdGhlIHRlc3QgYmluYXJ5LCBub3Rc biIKKwkiICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRlc3RsaXN0XG4iCisJIiAgLS1pbmFj dGl2aXR5LXRpbWVvdXQgPHNlY29uZHM+XG4iCisJIiAgICAgICAgICAgICAgICAgICAgICAgIEtp bGwgdGhlIHJ1bm5pbmcgdGVzdCBhZnRlciA8c2Vjb25kcz4gb2YgaW5hY3Rpdml0eSBpblxuIgor CSIgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVzdCdzIHN0ZG91dCwgc3RkZXJyLCBvciBk bWVzZ1xuIgorCSIgIC0tdXNlLXdhdGNoZG9nICAgICAgICBVc2UgaGFyZHdhcmUgd2F0Y2hkb2cg Zm9yIGxldGhhbCBlbmZvcmNlbWVudCBvZiB0aGVcbiIKKwkiICAgICAgICAgICAgICAgICAgICAg ICAgYWJvdmUgdGltZW91dC4gS2lsbGluZyB0aGUgdGVzdCBwcm9jZXNzIGlzIHN0aWxsXG4iCisJ IiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZCBhdCB0aW1lb3V0IHRyaWdnZXIuXG4i CisJIiAgW3Rlc3Rfcm9vdF0gICAgICAgICAgIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBJ R1QgdGVzdHMuIFRoZSBlbnZpcm9ubWVudFxuIgorCSIgICAgICAgICAgICAgICAgICAgICAgICB2 YXJpYWJsZSBJR1RfVEVTVF9ST09UIHdpbGwgYmUgdXNlZCBpZiBzZXQsIG92ZXJyaWRpbmdcbiIK KwkiICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBvcHRpb24gaWYgZ2l2ZW4uXG4iCisJOwor CitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICpleHRyYV9tZXNzYWdlLCBib29sIHVzZV9z dGRlcnIpCit7CisJRklMRSAqZiA9IHVzZV9zdGRlcnIgPyBzdGRlcnIgOiBzdGRvdXQ7CisKKwlp ZiAoZXh0cmFfbWVzc2FnZSkKKwkJZnByaW50ZihmLCAiJXNcblxuIiwgZXh0cmFfbWVzc2FnZSk7 CisKKwlmcHJpbnRmKGYsICIlcyIsIHVzYWdlX3N0cik7Cit9CisKK3N0YXRpYyBib29sIGFkZF9y ZWdleChzdHJ1Y3QgcmVnZXhfbGlzdCAqbGlzdCwgY2hhciAqbmV3KQoreworCXJlZ2V4X3QgKnJl Z2V4OworCXNpemVfdCBidWZsZW47CisJY2hhciAqYnVmOworCWludCBzOworCisJcmVnZXggPSBt YWxsb2Moc2l6ZW9mKCpyZWdleCkpOworCisJaWYgKChzID0gcmVnY29tcChyZWdleCwgbmV3LAor CQkJIFJFR19FWFRFTkRFRCB8IFJFR19OT1NVQikpICE9IDApIHsKKwkJYnVmbGVuID0gcmVnZXJy b3IocywgcmVnZXgsIE5VTEwsIDApOworCQlidWYgPSBtYWxsb2MoYnVmbGVuKTsKKwkJcmVnZXJy b3IocywgcmVnZXgsIGJ1ZiwgYnVmbGVuKTsKKwkJdXNhZ2UoYnVmLCB0cnVlKTsKKworCQlmcmVl KGJ1Zik7CisJCXJlZ2ZyZWUocmVnZXgpOworCQlmcmVlKHJlZ2V4KTsKKwkJcmV0dXJuIGZhbHNl OworCX0KKworCWxpc3QtPnJlZ2V4ZXMgPSByZWFsbG9jKGxpc3QtPnJlZ2V4ZXMsCisJCQkJKGxp c3QtPnNpemUgKyAxKSAqIHNpemVvZigqbGlzdC0+cmVnZXhlcykpOworCWxpc3QtPnJlZ2V4X3N0 cmluZ3MgPSByZWFsbG9jKGxpc3QtPnJlZ2V4X3N0cmluZ3MsCisJCQkJICAgICAgKGxpc3QtPnNp emUgKyAxKSAqIHNpemVvZigqbGlzdC0+cmVnZXhfc3RyaW5ncykpOworCWxpc3QtPnJlZ2V4ZXNb bGlzdC0+c2l6ZV0gPSByZWdleDsKKwlsaXN0LT5yZWdleF9zdHJpbmdzW2xpc3QtPnNpemVdID0g bmV3OworCWxpc3QtPnNpemUrKzsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBm cmVlX3JlZ2V4ZXMoc3RydWN0IHJlZ2V4X2xpc3QgKnJlZ2V4ZXMpCit7CisJc2l6ZV90IGk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgcmVnZXhlcy0+c2l6ZTsgaSsrKSB7CisJCWZyZWUocmVnZXhlcy0+ cmVnZXhfc3RyaW5nc1tpXSk7CisJCXJlZ2ZyZWUocmVnZXhlcy0+cmVnZXhlc1tpXSk7CisJCWZy ZWUocmVnZXhlcy0+cmVnZXhlc1tpXSk7CisJfQorCWZyZWUocmVnZXhlcy0+cmVnZXhfc3RyaW5n cyk7CisJZnJlZShyZWdleGVzLT5yZWdleGVzKTsKK30KKworc3RhdGljIGJvb2wgcmVhZGFibGVf ZmlsZShjaGFyICpmaWxlbmFtZSkKK3sKKwlyZXR1cm4gIWFjY2VzcyhmaWxlbmFtZSwgUl9PSyk7 Cit9CisKK3ZvaWQgaW5pdF9zZXR0aW5ncyhzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzKQorewor CW1lbXNldChzZXR0aW5ncywgMCwgc2l6ZW9mKCpzZXR0aW5ncykpOworfQorCit2b2lkIGZyZWVf c2V0dGluZ3Moc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncykKK3sKKwlmcmVlKHNldHRpbmdzLT50 ZXN0X2xpc3QpOworCWZyZWUoc2V0dGluZ3MtPm5hbWUpOworCWZyZWUoc2V0dGluZ3MtPnRlc3Rf cm9vdCk7CisJZnJlZShzZXR0aW5ncy0+cmVzdWx0c19wYXRoKTsKKworCWZyZWVfcmVnZXhlcygm c2V0dGluZ3MtPmluY2x1ZGVfcmVnZXhlcyk7CisJZnJlZV9yZWdleGVzKCZzZXR0aW5ncy0+ZXhj bHVkZV9yZWdleGVzKTsKKworCWluaXRfc2V0dGluZ3Moc2V0dGluZ3MpOworfQorCitib29sIHBh cnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQkgICBzdHJ1Y3Qgc2V0dGluZ3Mg KnNldHRpbmdzKQoreworCWludCBjOworCWNoYXIgKmVudl90ZXN0X3Jvb3Q7CisKKwlzdGF0aWMg c3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJeyJoZWxwIiwgbm9fYXJndW1lbnQs IE5VTEwsIE9QVF9IRUxQfSwKKwkJeyJuYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9Q VF9OQU1FfSwKKwkJeyJkcnktcnVuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVF9EUllfUlVOfSwK KwkJeyJpbmNsdWRlLXRlc3RzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVF9JTkNMVURF fSwKKwkJeyJleGNsdWRlLXRlc3RzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVF9FWENM VURFfSwKKwkJeyJhYm9ydC1vbi1tb25pdG9yZWQtZXJyb3IiLCBub19hcmd1bWVudCwgTlVMTCwg T1BUX0FCT1JUX09OX0VSUk9SfSwKKwkJeyJzeW5jIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVF9T WU5DfSwKKwkJeyJsb2ctbGV2ZWwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUX0xPR19M RVZFTH0sCisJCXsidGVzdC1saXN0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVF9URVNU X0xJU1R9LAorCQl7Im92ZXJ3cml0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRfT1ZFUldSSVRF fSwKKwkJeyJpZ25vcmUtbWlzc2luZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRfSUdOT1JFX01J U1NJTkd9LAorCQl7Im11bHRpcGxlLW1vZGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUX01VTFRJ UExFfSwKKwkJeyJpbmFjdGl2aXR5LXRpbWVvdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwg T1BUX1RJTUVPVVR9LAorCQl7InVzZS13YXRjaGRvZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRf V0FUQ0hET0d9LAorCQl7IDAsIDAsIDAsIDB9LAorCX07CisKKwlmcmVlX3NldHRpbmdzKHNldHRp bmdzKTsKKworCW9wdGluZCA9IDE7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBh cmd2LCAiaG46ZHQ6eDpzbDpvbSIsIGxvbmdfb3B0aW9ucywgTlVMTCkpICE9IC0xKSB7CisJCXN3 aXRjaCAoYykgeworCQljYXNlIE9QVF9IRUxQOgorCQkJdXNhZ2UoTlVMTCwgZmFsc2UpOworCQkJ Z290byBlcnJvcjsKKwkJY2FzZSBPUFRfTkFNRToKKwkJCXNldHRpbmdzLT5uYW1lID0gc3RyZHVw KG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRFJZX1JVTjoKKwkJCXNldHRpbmdzLT5k cnlfcnVuID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9JTkNMVURFOgorCQkJaWYgKCFh ZGRfcmVnZXgoJnNldHRpbmdzLT5pbmNsdWRlX3JlZ2V4ZXMsIHN0cmR1cChvcHRhcmcpKSkKKwkJ CQlnb3RvIGVycm9yOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0VYQ0xVREU6CisJCQlpZiAoIWFk ZF9yZWdleCgmc2V0dGluZ3MtPmV4Y2x1ZGVfcmVnZXhlcywgc3RyZHVwKG9wdGFyZykpKQorCQkJ CWdvdG8gZXJyb3I7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfQUJPUlRfT05fRVJST1I6CisJCQlz ZXR0aW5ncy0+YWJvcnRfb25fZXJyb3IgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1NZ TkM6CisJCQlzZXR0aW5ncy0+c3luYyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfTE9H X0xFVkVMOgorCQkJaWYgKCFzZXRfbG9nX2xldmVsKHNldHRpbmdzLCBvcHRhcmcpKSB7CisJCQkJ dXNhZ2UoIkNhbm5vdCBwYXJzZSBsb2cgbGV2ZWwiLCB0cnVlKTsKKwkJCQlnb3RvIGVycm9yOwor CQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BUX1RFU1RfTElTVDoKKwkJCXNldHRpbmdzLT50ZXN0 X2xpc3QgPSBhYnNvbHV0ZV9wYXRoKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfT1ZF UldSSVRFOgorCQkJc2V0dGluZ3MtPm92ZXJ3cml0ZSA9IHRydWU7CisJCQlicmVhazsKKwkJY2Fz ZSBPUFRfSUdOT1JFX01JU1NJTkc6CisJCQkvKiBJZ25vcmVkLCBwaWdsaXQgY29tcGF0aWJpbGl0 eSAqLworCQkJYnJlYWs7CisJCWNhc2UgT1BUX01VTFRJUExFOgorCQkJc2V0dGluZ3MtPm11bHRp cGxlX21vZGUgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1RJTUVPVVQ6CisJCQlzZXR0 aW5ncy0+aW5hY3Rpdml0eV90aW1lb3V0ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNh c2UgT1BUX1dBVENIRE9HOgorCQkJc2V0dGluZ3MtPnVzZV93YXRjaGRvZyA9IHRydWU7CisJCQli cmVhazsKKwkJY2FzZSAnPyc6CisJCQl1c2FnZShOVUxMLCB0cnVlKTsKKwkJCWdvdG8gZXJyb3I7 CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgiQ2Fubm90IHBhcnNlIG9wdGlvbnMiLCB0cnVlKTsKKwkJ CWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGFyZ2MgLSBvcHRpbmQpIHsKKwljYXNl IDI6CisJCXNldHRpbmdzLT50ZXN0X3Jvb3QgPSBhYnNvbHV0ZV9wYXRoKGFyZ3Zbb3B0aW5kXSk7 CisJCSsrb3B0aW5kOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgMToKKwkJc2V0dGluZ3Mt PnJlc3VsdHNfcGF0aCA9IGFic29sdXRlX3BhdGgoYXJndltvcHRpbmRdKTsKKwkJYnJlYWs7CisJ Y2FzZSAwOgorCQl1c2FnZSgiUmVzdWx0cy1wYXRoIG1pc3NpbmciLCB0cnVlKTsKKwkJZ290byBl cnJvcjsKKwlkZWZhdWx0OgorCQl1c2FnZSgiRXh0cmEgYXJndW1lbnRzIGFmdGVyIHJlc3VsdHMt cGF0aCIsIHRydWUpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICgoZW52X3Rlc3Rfcm9vdCA9 IGdldGVudigiSUdUX1RFU1RfUk9PVCIpKSAhPSBOVUxMKSB7CisJCWZyZWUoc2V0dGluZ3MtPnRl c3Rfcm9vdCk7CisJCXNldHRpbmdzLT50ZXN0X3Jvb3QgPSBhYnNvbHV0ZV9wYXRoKGVudl90ZXN0 X3Jvb3QpOworCX0KKworCWlmICghc2V0dGluZ3MtPnRlc3Rfcm9vdCkgeworCQl1c2FnZSgiVGVz dCByb290IG5vdCBzZXQiLCB0cnVlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoIXNldHRp bmdzLT5uYW1lKSB7CisJCWNoYXIgKm5hbWUgPSBzdHJkdXAoc2V0dGluZ3MtPnJlc3VsdHNfcGF0 aCk7CisJCXNldHRpbmdzLT5uYW1lID0gc3RyZHVwKGJhc2VuYW1lKG5hbWUpKTsKKwkJZnJlZShu YW1lKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKKworIGVycm9yOgorCWZyZWVfc2V0dGluZ3Moc2V0 dGluZ3MpOworCXJldHVybiBmYWxzZTsKK30KKworYm9vbCB2YWxpZGF0ZV9zZXR0aW5ncyhzdHJ1 Y3Qgc2V0dGluZ3MgKnNldHRpbmdzKQoreworCWludCBkaXJmZCwgZmQ7CisKKwlpZiAoc2V0dGlu Z3MtPnRlc3RfbGlzdCAmJiAhcmVhZGFibGVfZmlsZShzZXR0aW5ncy0+dGVzdF9saXN0KSkgewor CQl1c2FnZSgiQ2Fubm90IG9wZW4gdGVzdC1saXN0IGZpbGUiLCB0cnVlKTsKKwkJcmV0dXJuIGZh bHNlOworCX0KKworCWlmICghc2V0dGluZ3MtPnJlc3VsdHNfcGF0aCkgeworCQl1c2FnZSgiTm8g cmVzdWx0cy1wYXRoIHNldDsgdGhpcyBzaG91bGRuJ3QgaGFwcGVuIiwgdHJ1ZSk7CisJCXJldHVy biBmYWxzZTsKKwl9CisKKwlpZiAoIXNldHRpbmdzLT50ZXN0X3Jvb3QpIHsKKwkJdXNhZ2UoIk5v IHRlc3Qgcm9vdCBzZXQ7IHRoaXMgc2hvdWxkbid0IGhhcHBlbiIsIHRydWUpOworCQlyZXR1cm4g ZmFsc2U7CisJfQorCisJZGlyZmQgPSBvcGVuKHNldHRpbmdzLT50ZXN0X3Jvb3QsIE9fRElSRUNU T1JZIHwgT19SRE9OTFkpOworCWlmIChkaXJmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJU ZXN0IGRpcmVjdG9yeSAlcyBjYW5ub3QgYmUgb3BlbmVkXG4iLCBzZXR0aW5ncy0+dGVzdF9yb290 KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWZkID0gb3BlbmF0KGRpcmZkLCAidGVzdC1saXN0 LnR4dCIsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fu bm90IG9wZW4gJXMvdGVzdC1saXN0LnR4dFxuIiwgc2V0dGluZ3MtPnRlc3Rfcm9vdCk7CisJCWNs b3NlKGRpcmZkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWNsb3NlKGZkKTsKKwljbG9zZShk aXJmZCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworY2hhciAqYWJzb2x1dGVfcGF0aChjaGFyICpw YXRoKQoreworCWNoYXIgKnJlc3VsdCA9IE5VTEw7CisJY2hhciAqdG1wcGF0aCwgKnRtcG5hbWU7 CisKKwlyZXN1bHQgPSByZWFscGF0aChwYXRoLCBOVUxMKTsKKwlpZiAocmVzdWx0ICE9IE5VTEwp CisJCXJldHVybiByZXN1bHQ7CisKKwl0bXBwYXRoID0gc3RyZHVwKHBhdGgpOworCXRtcG5hbWUg PSBkaXJuYW1lKHRtcHBhdGgpOworCWZyZWUocmVzdWx0KTsKKwlyZXN1bHQgPSByZWFscGF0aCh0 bXBuYW1lLCBOVUxMKTsKKwlmcmVlKHRtcHBhdGgpOworCisJaWYgKHJlc3VsdCAhPSBOVUxMKSB7 CisJCXRtcHBhdGggPSBzdHJkdXAocGF0aCk7CisJCXRtcG5hbWUgPSBiYXNlbmFtZSh0bXBwYXRo KTsKKwkJc3RyY2F0KHJlc3VsdCwgIi8iKTsKKwkJc3RyY2F0KHJlc3VsdCwgdG1wbmFtZSk7CisJ CWZyZWUodG1wcGF0aCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJZnJlZShyZXN1bHQpOwor CXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciBzZXR0aW5nc19maWxlbmFtZVtdID0gIm1l dGFkYXRhLnR4dCI7Citib29sIHNlcmlhbGl6ZV9zZXR0aW5ncyhzdHJ1Y3Qgc2V0dGluZ3MgKnNl dHRpbmdzKQoreworI2RlZmluZSBTRVJJQUxJWkVfTElORShmLCBzLCBuYW1lLCBmb3JtYXQpIGZw cmludGYoZiwgIiVzIDogIiBmb3JtYXQgIlxuIiwgI25hbWUsIHMtPm5hbWUpCisKKwlpbnQgZGly ZmQsIGZkOworCUZJTEUgKmY7CisKKwlpZiAoIXNldHRpbmdzLT5yZXN1bHRzX3BhdGgpIHsKKwkJ dXNhZ2UoIk5vIHJlc3VsdHMtcGF0aCBzZXQ7IHRoaXMgc2hvdWxkbid0IGhhcHBlbiIsIHRydWUp OworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKChkaXJmZCA9IG9wZW4oc2V0dGluZ3MtPnJl c3VsdHNfcGF0aCwgT19ESVJFQ1RPUlkgfCBPX1JET05MWSkpIDwgMCkgeworCQlta2RpcihzZXR0 aW5ncy0+cmVzdWx0c19wYXRoLCAwNzU1KTsKKwkJaWYgKChkaXJmZCA9IG9wZW4oc2V0dGluZ3Mt PnJlc3VsdHNfcGF0aCwgT19ESVJFQ1RPUlkgfCBPX1JET05MWSkpIDwgMCkgeworCQkJdXNhZ2Uo IkNyZWF0aW5nIHJlc3VsdHMtcGF0aCBmYWlsZWQiLCB0cnVlKTsKKwkJCXJldHVybiBmYWxzZTsK KwkJfQorCX0KKworCWlmICgoZmQgPSBvcGVuYXQoZGlyZmQsIHNldHRpbmdzX2ZpbGVuYW1lLCBP X1JET05MWSkpID49IDApIHsKKwkJY2xvc2UoZmQpOworCisJCWlmICghc2V0dGluZ3MtPm92ZXJ3 cml0ZSkgeworCQkJLyogU2VyaWFsaXphdGlvbiBkYXRhIGFscmVhZHkgZXhpc3RzLCBub3Qgb3Zl cndyaXRpbmcgKi8KKwkJCWNsb3NlKGRpcmZkKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJ CWlmICh1bmxpbmthdChkaXJmZCwgc2V0dGluZ3NfZmlsZW5hbWUsIDApICE9IDApIHsKKwkJCXVz YWdlKCJFcnJvciBvdmVyd3JpdGluZyBvbGQgc2V0dGluZ3MgbWV0YWRhdGEiLCB0cnVlKTsKKwkJ CWNsb3NlKGRpcmZkKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCWlmICgoZmQgPSBv cGVuYXQoZGlyZmQsIHNldHRpbmdzX2ZpbGVuYW1lLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9O TFksIDA2NjYpKSA8IDApIHsKKwkJdXNhZ2UoIkNyZWF0aW5nIHNldHRpbmdzIHNlcmlhbGl6YXRp b24gZmlsZSBmYWlsZWQiLCB0cnVlKTsKKwkJY2xvc2UoZGlyZmQpOworCQlyZXR1cm4gZmFsc2U7 CisJfQorCisJZiA9IGZkb3BlbihmZCwgInciKTsKKwlpZiAoIWYpIHsKKwkJY2xvc2UoZmQpOwor CQljbG9zZShkaXJmZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlTRVJJQUxJWkVfTElORShm LCBzZXR0aW5ncywgYWJvcnRfb25fZXJyb3IsICIlZCIpOworCWlmIChzZXR0aW5ncy0+dGVzdF9s aXN0KQorCQlTRVJJQUxJWkVfTElORShmLCBzZXR0aW5ncywgdGVzdF9saXN0LCAiJXMiKTsKKwlp ZiAoc2V0dGluZ3MtPm5hbWUpCisJCVNFUklBTElaRV9MSU5FKGYsIHNldHRpbmdzLCBuYW1lLCAi JXMiKTsKKwlTRVJJQUxJWkVfTElORShmLCBzZXR0aW5ncywgZHJ5X3J1biwgIiVkIik7CisJU0VS SUFMSVpFX0xJTkUoZiwgc2V0dGluZ3MsIHN5bmMsICIlZCIpOworCVNFUklBTElaRV9MSU5FKGYs IHNldHRpbmdzLCBsb2dfbGV2ZWwsICIlZCIpOworCVNFUklBTElaRV9MSU5FKGYsIHNldHRpbmdz LCBvdmVyd3JpdGUsICIlZCIpOworCVNFUklBTElaRV9MSU5FKGYsIHNldHRpbmdzLCBtdWx0aXBs ZV9tb2RlLCAiJWQiKTsKKwlTRVJJQUxJWkVfTElORShmLCBzZXR0aW5ncywgaW5hY3Rpdml0eV90 aW1lb3V0LCAiJWQiKTsKKwlTRVJJQUxJWkVfTElORShmLCBzZXR0aW5ncywgdXNlX3dhdGNoZG9n LCAiJWQiKTsKKwlTRVJJQUxJWkVfTElORShmLCBzZXR0aW5ncywgdGVzdF9yb290LCAiJXMiKTsK KwlTRVJJQUxJWkVfTElORShmLCBzZXR0aW5ncywgcmVzdWx0c19wYXRoLCAiJXMiKTsKKworCWlm IChzZXR0aW5ncy0+c3luYykgeworCQlmc3luYyhmZCk7CisJCWZzeW5jKGRpcmZkKTsKKwl9CisK KwlmY2xvc2UoZik7CisJY2xvc2UoZGlyZmQpOworCXJldHVybiB0cnVlOworCisjdW5kZWYgU0VS SUFMSVpFX0xJTkUKK30KKworc3RhdGljIGNoYXIgKm1heWJlX3N0cmR1cChjaGFyICpzdHIpCit7 CisJaWYgKCFzdHIpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHN0cmR1cChzdHIpOworfQor Citib29sIHJlYWRfc2V0dGluZ3Moc3RydWN0IHNldHRpbmdzICpzZXR0aW5ncywgaW50IGRpcmZk KQoreworI2RlZmluZSBQQVJTRV9MSU5FKHMsIG5hbWUsIHZhbCwgZmllbGQsIHdyaXRlKSBcCisJ aWYgKCFzdHJjbXAobmFtZSwgI2ZpZWxkKSkgewkgICAgICAgXAorCQlzLT5maWVsZCA9IHdyaXRl OwkgICAgICAgXAorCQlmcmVlKG5hbWUpOwkJICAgICAgIFwKKwkJZnJlZSh2YWwpOwkJICAgICAg IFwKKwkJbmFtZSA9IHZhbCA9IE5VTEw7CSAgICAgICBcCisJCWNvbnRpbnVlOwkJICAgICAgIFwK Kwl9CisKKwlpbnQgZmQ7CisJRklMRSAqZjsKKwljaGFyICpuYW1lID0gTlVMTCwgKnZhbCA9IE5V TEw7CisKKwlmcmVlX3NldHRpbmdzKHNldHRpbmdzKTsKKworCWlmICgoZmQgPSBvcGVuYXQoZGly ZmQsIHNldHRpbmdzX2ZpbGVuYW1lLCBPX1JET05MWSkpIDwgMCkKKwkJcmV0dXJuIGZhbHNlOwor CisJZiA9IGZkb3BlbihmZCwgInIiKTsKKwlpZiAoIWYpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1 cm4gZmFsc2U7CisJfQorCisJd2hpbGUgKGZzY2FuZihmLCAiJW1zIDogJW1zIiwgJm5hbWUsICZ2 YWwpID09IDIpIHsKKwkJaW50IG51bXZhbCA9IGF0b2kodmFsKTsKKwkJUEFSU0VfTElORShzZXR0 aW5ncywgbmFtZSwgdmFsLCBhYm9ydF9vbl9lcnJvciwgbnVtdmFsKTsKKwkJUEFSU0VfTElORShz ZXR0aW5ncywgbmFtZSwgdmFsLCB0ZXN0X2xpc3QsIG1heWJlX3N0cmR1cCh2YWwpKTsKKwkJUEFS U0VfTElORShzZXR0aW5ncywgbmFtZSwgdmFsLCBuYW1lLCBtYXliZV9zdHJkdXAodmFsKSk7CisJ CVBBUlNFX0xJTkUoc2V0dGluZ3MsIG5hbWUsIHZhbCwgZHJ5X3J1biwgbnVtdmFsKTsKKwkJUEFS U0VfTElORShzZXR0aW5ncywgbmFtZSwgdmFsLCBzeW5jLCBudW12YWwpOworCQlQQVJTRV9MSU5F KHNldHRpbmdzLCBuYW1lLCB2YWwsIGxvZ19sZXZlbCwgbnVtdmFsKTsKKwkJUEFSU0VfTElORShz ZXR0aW5ncywgbmFtZSwgdmFsLCBvdmVyd3JpdGUsIG51bXZhbCk7CisJCVBBUlNFX0xJTkUoc2V0 dGluZ3MsIG5hbWUsIHZhbCwgbXVsdGlwbGVfbW9kZSwgbnVtdmFsKTsKKwkJUEFSU0VfTElORShz ZXR0aW5ncywgbmFtZSwgdmFsLCBpbmFjdGl2aXR5X3RpbWVvdXQsIG51bXZhbCk7CisJCVBBUlNF X0xJTkUoc2V0dGluZ3MsIG5hbWUsIHZhbCwgdXNlX3dhdGNoZG9nLCBudW12YWwpOworCQlQQVJT RV9MSU5FKHNldHRpbmdzLCBuYW1lLCB2YWwsIHRlc3Rfcm9vdCwgbWF5YmVfc3RyZHVwKHZhbCkp OworCQlQQVJTRV9MSU5FKHNldHRpbmdzLCBuYW1lLCB2YWwsIHJlc3VsdHNfcGF0aCwgbWF5YmVf c3RyZHVwKHZhbCkpOworCisJCXByaW50ZigiV2FybmluZzogVW5rbm93biBmaWVsZCBpbiBzZXR0 aW5ncyBmaWxlOiAlcyA9ICVzXG4iLAorCQkgICAgICAgbmFtZSwgdmFsKTsKKwkJZnJlZShuYW1l KTsKKwkJZnJlZSh2YWwpOworCQluYW1lID0gdmFsID0gTlVMTDsKKwl9CisKKwlmcmVlKG5hbWUp OworCWZyZWUodmFsKTsKKwlmY2xvc2UoZik7CisKKwlyZXR1cm4gdHJ1ZTsKKworI3VuZGVmIFBB UlNFX0xJTkUKK30KZGlmZiAtLWdpdCBhL3J1bm5lci9zZXR0aW5ncy5oIGIvcnVubmVyL3NldHRp bmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjlkMWYwM2ZiCi0tLSAv ZGV2L251bGwKKysrIGIvcnVubmVyL3NldHRpbmdzLmgKQEAgLTAsMCArMSwxMTEgQEAKKyNpZm5k ZWYgUlVOTkVSX1NFVFRJTkdTX0gKKyNkZWZpbmUgUlVOTkVSX1NFVFRJTkdTX0gKKworI2luY2x1 ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMu aD4KKyNpbmNsdWRlIDxyZWdleC5oPgorCitlbnVtIHsKKwlMT0dfTEVWRUxfTk9STUFMID0gMCwK KwlMT0dfTEVWRUxfUVVJRVQgPSAtMSwKKwlMT0dfTEVWRUxfVkVSQk9TRSA9IDEsCit9OworCitz dHJ1Y3QgcmVnZXhfbGlzdCB7CisJY2hhciAqKnJlZ2V4X3N0cmluZ3M7CisJcmVnZXhfdCoqIHJl Z2V4ZXM7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3Qgc2V0dGluZ3MgeworCWJvb2wgYWJv cnRfb25fZXJyb3I7CisJY2hhciAqdGVzdF9saXN0OworCWNoYXIgKm5hbWU7CisJYm9vbCBkcnlf cnVuOworCXN0cnVjdCByZWdleF9saXN0IGluY2x1ZGVfcmVnZXhlczsKKwlzdHJ1Y3QgcmVnZXhf bGlzdCBleGNsdWRlX3JlZ2V4ZXM7CisJYm9vbCBzeW5jOworCWludCBsb2dfbGV2ZWw7CisJYm9v bCBvdmVyd3JpdGU7CisJYm9vbCBtdWx0aXBsZV9tb2RlOworCWludCBpbmFjdGl2aXR5X3RpbWVv dXQ7CisJYm9vbCB1c2Vfd2F0Y2hkb2c7CisJY2hhciAqdGVzdF9yb290OworCWNoYXIgKnJlc3Vs dHNfcGF0aDsKK307CisKKy8qKgorICogaW5pdF9zZXR0aW5nczoKKyAqCisgKiBJbml0aWFsaXpl cyBhIHNldHRpbmdzIG9iamVjdCB0byBhbiBlbXB0eSBzdGF0ZSAoYWxsIHZhbHVlcyBOVUxMLCAw CisgKiBvciBmYWxzZSkuCisgKgorICogQHNldHRpbmdzOiBPYmplY3QgdG8gaW5pdGlhbGl6ZS4g U3RvcmFnZSBmb3IgaXQgbXVzdCBleGlzdC4KKyAqLwordm9pZCBpbml0X3NldHRpbmdzKHN0cnVj dCBzZXR0aW5ncyAqc2V0dGluZ3MpOworCisvKioKKyAqIGZyZWVfc2V0dGluZ3M6CisgKgorICog UmVsZWFzZXMgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMgZm9yIGEgc2V0dGluZ3Mgb2JqZWN0IGFu ZAorICogaW5pdGlhbGl6ZXMgaXQgdG8gYW4gZW1wdHkgc3RhdGUgKHNlZSAjaW5pdF9zZXR0aW5n cykuCisgKgorICogQHNldHRpbmdzOiBPYmplY3QgdG8gcmVsZWFzZSBhbmQgaW5pdGlhbGl6ZS4K KyAqLwordm9pZCBmcmVlX3NldHRpbmdzKHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MpOworCisv KioKKyAqIHBhcnNlX29wdGlvbnM6CisgKgorICogUGFyc2VzIGNvbW1hbmQgbGluZSBvcHRpb25z IGFuZCBzZXRzIHRoZSBzZXR0aW5ncyBvYmplY3QgdG8KKyAqIGRlc2lnbmF0ZWQgdmFsdWVzLgor ICoKKyAqIFRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFnYWluIG9uIHRoZSBzYW1lIHNldHRp bmdzIG9iamVjdC4gVGhlCisgKiBvbGQgdmFsdWVzIHdpbGwgYmUgcHJvcGVybHkgcmVsZWFzZWQg YW5kIGNsZWFyZWQuIE9uIGEgcGFyc2UKKyAqIGZhaWx1cmUsIHRoZSBzZXR0aW5ncyBvYmplY3Qg d2lsbCBiZSBpbiBhbiBlbXB0eSBzdGF0ZSAoc2VlCisgKiAjaW5pdF9zZXR0aW5ncykgYW5kIHVz YWdlIGluc3RydWN0aW9ucyB3aWxsIGJlIHByaW50ZWQgd2l0aCBhbgorICogZXJyb3IgbWVzc2Fn ZS4KKyAqCisgKiBAYXJnYzogQXJndW1lbnQgY291bnQKKyAqIEBhcmd2OiBBcmd1bWVudCBhcnJh eS4gRmlyc3QgZWxlbWVudCBpcyB0aGUgcHJvZ3JhbSBuYW1lLgorICogQHNldHRpbmdzOiBTZXR0 aW5ncyBvYmplY3QgdG8gZmlsbCB3aXRoIHZhbHVlcy4gTXVzdCBoYXZlIHByb3BlcgorICogc3Rv cmFnZS4KKyAqCisgKiBSZXR1cm5zOiBUcnVlIG9uIHN1Y2Nlc3NmdWwgcGFyc2UsIGZhbHNlIG9u IGVycm9yLgorICovCitib29sIHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LAor CQkgICBzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzKTsKKworLyoqCisgKiB2YWxpZGF0ZV9zZXR0 aW5nczoKKyAqCisgKiBDaGVja3MgdGhlIHNldHRpbmdzIG9iamVjdCBhZ2FpbnN0IHRoZSBzeXN0 ZW0gdG8gc2VlIGlmIGV4ZWN1dGluZworICogb24gaXQgY2FuIGJlIGRvbmUuIENoZWNrcyBwYXRo bmFtZXMgZm9yIGV4aXN0ZW5jZSBhbmQgYWNjZXNzCisgKiByaWdodHMuIE5vdGUgdGhhdCB0aGlz IGZ1bmN0aW9uIHdpbGwgbm90IGNoZWNrIHRoYXQgdGhlIGRlc2lnbmF0ZWQKKyAqIGpvYiBsaXN0 aW5nICh0aHJvdWdoIGEgdGVzdC1saXN0IGZpbGUgb3IgdGhlIC10Ly14IGZsYWdzKSB5aWVsZHMg YQorICogbm9uLXplcm8gYW1vdW50IG9mIHRlc3RpbmcgdG8gYmUgZG9uZS4gT24gZXJyb3JzLCB1 c2FnZQorICogaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgcHJpbnRlZCB3aXRoIGFuIGVycm9yIG1lc3Nh Z2UuCisgKgorICogQHNldHRpbmdzOiBTZXR0aW5ncyBvYmplY3QgdG8gY2hlY2suCisgKgorICog UmV0dXJuczogVHJ1ZSBvbiB2YWxpZCBzZXR0aW5ncywgZmFsc2Ugb24gYW55IGVycm9yLgorICov Citib29sIHZhbGlkYXRlX3NldHRpbmdzKHN0cnVjdCBzZXR0aW5ncyAqc2V0dGluZ3MpOworCisv KiBUT0RPOiBCZXR0ZXIgcGxhY2UgZm9yIHRoaXMgKi8KK2NoYXIgKmFic29sdXRlX3BhdGgoY2hh ciAqcGF0aCk7CisKKy8qKgorICogc2VyaWFsaXplX3NldHRpbmdzOgorICoKKyAqIFNlcmlhbGl6 ZXMgdGhlIHNldHRpbmdzIG9iamVjdCB0byBhIGZpbGUgaW4gdGhlIHJlc3VsdHNfcGF0aAorICog ZGlyZWN0b3J5LgorICoKKyAqIEBzZXR0aW5nczogU2V0dGluZ3Mgb2JqZWN0IHRvIHNlcmlhbGl6 ZS4KKyAqLworYm9vbCBzZXJpYWxpemVfc2V0dGluZ3Moc3RydWN0IHNldHRpbmdzICpzZXR0aW5n cyk7CisKK2Jvb2wgcmVhZF9zZXR0aW5ncyhzdHJ1Y3Qgc2V0dGluZ3MgKnNldHRpbmdzLCBpbnQg ZGlyZmQpOworCisjZW5kaWYKLS0gCjIuMTQuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWlsaW5nIGxpc3QKaWd0LWRldkBsaXN0cy5m cmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9pZ3QtZGV2Cg==