From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id CE00E6E8C2 for ; Fri, 20 Nov 2020 11:31:52 +0000 (UTC) From: =?UTF-8?q?Zbigniew=20Kempczy=C5=84ski?= Date: Fri, 20 Nov 2020 12:31:06 +0100 Message-Id: <20201120113131.67971-7-zbigniew.kempczynski@intel.com> In-Reply-To: <20201120113131.67971-1-zbigniew.kempczynski@intel.com> References: <20201120113131.67971-1-zbigniew.kempczynski@intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v10 06/31] lib/intel_allocator: Add intel_allocator core List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org Cc: Petri Latvala , Chris Wilson List-ID: Rm9yIGRpc2NyZXRlIGdlbnMgd2UgaGF2ZSB0byBjZWFzZSBvZiB1c2luZyByZWxvY2F0aW9ucyB3 aGVuIGJhdGNoCmJ1ZmZlcnMgYXJlIHN1Ym1pdHRlZCB0byBHUFUuIENhcmRzIHdoaWNoIGhhdmUg cHBndHQgY2FuIHVzZSBzb2Z0cGluCmFuZCBlc3RhYmxpc2ggYWRkcmVzc2VzIG9uIG91ciBvd24u CgpXZSBhZGRlZCBzaW1wbGUgYWxsb2NhdG9yICh0YWtlbiBmcm9tIE1lc2E7IHdvcmtzIG9uIGxp c3RzKSBhbmQgYWRkZWQKcmFuZG9tIGFsbG9jYXRvciB0byBleGVyY2lzZSBiYXRjaGVzIHdpdGgg ZGlmZmVyZW50IGFkZHJlc3Nlcy4gQWxsCm9mIHRoYXQgd29ya3MgZm9yIHNpbmdsZSBWTSAoY29u dGV4dCkgc28gd2UgaGF2ZSB0byBhZGQgYWRkaXRpb25hbApsYXllciAoaW50ZWxfYWxsb2NhdG9y KSB0byBzdXBwb3J0IG11bHRpcHJvY2Vzc2luZyAvIG11bHRpdGhyZWFkaW5nLgoKRm9yIG1haW4g SUdUIHByb2Nlc3MgKGFsc28gZm9yIHRocmVhZHMgY3JlYXRlZCBpbiBpdCkgaW50ZWxfYWxsb2Nh dG9yCnJlc29sdmVzIGFkZHJlc3NlcyAibG9jYWxseSIsIGp1c3QgYnkgbXV0ZXhpbmcgYWNjZXNz IHRvIGdsb2JhbAphbGxvY2F0b3IgZGF0YSAoYWxsb2NhdG9ycyBtYXApLiBXaGVuIGZvcmsoKSBp cyBpbiB1c2UgY2hpbGRyZW4gY2Fubm90CmVzdGFibGlzaCBhZGRyZXNzZXMgb24gdGhleSBvd24g YW5kIGhhdmUgdG8gY29udGFjdCB0byB0aGUgdGhyZWFkCnNwYXduZWQgd2l0aGluIG1haW4gSUdU IHByb2Nlc3MuIEN1cnJlbnRseSBTeXNWIElQQyBtZXNzYWdlIHF1ZXVlIHdhcwpjaG9zZW4gYXMg YSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgYmV0d2VlbiBjaGlsZHJlbiBhbmQgYWxsb2NhdG9yIHRo cmVhZC4KQ2hpbGQgY2FsbHMgc2FtZSBmdW5jdGlvbnMgYXMgbWFpbiBJR1QgcHJvY2Vzcywgb25s eSBjb21tdW5pY2F0aW9uIHBhdGgKd2lsbCBiZSBjaG9zZW4gaW5zdGVhZCBvZiBhY3F1aXJpbmcg YWRkcmVzc2VzIGxvY2FsbHkuCgpTaWduZWQtb2ZmLWJ5OiBaYmlnbmlldyBLZW1wY3p5xYRza2kg PHpiaWduaWV3LmtlbXBjenluc2tpQGludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogRG9taW5payBH cnplZ29yemVrIDxkb21pbmlrLmdyemVnb3J6ZWtAaW50ZWwuY29tPgpDYzogQ2hyaXMgV2lsc29u IDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+CkNjOiBQZXRyaSBMYXR2YWxhIDxwZXRyaS5sYXR2 YWxhQGludGVsLmNvbT4KLS0tCiAuLi4vaWd0LWdwdS10b29scy9pZ3QtZ3B1LXRvb2xzLWRvY3Mu eG1sICAgICAgfCAgIDEgKwogbGliL2lndF9jb3JlLmMgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDEzICsKIGxpYi9pbnRlbF9hbGxvY2F0b3IuYyAgICAgICAgICAgICAgICAgICAg ICAgICB8IDkzOCArKysrKysrKysrKysrKysrKysKIGxpYi9pbnRlbF9hbGxvY2F0b3IuaCAgICAg ICAgICAgICAgICAgICAgICAgICB8IDEzNiArKysKIGxpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hh bm5lbC5jICAgICAgICAgICAgICB8IDE4MiArKysrCiBsaWIvaW50ZWxfYWxsb2NhdG9yX21zZ2No YW5uZWwuaCAgICAgICAgICAgICAgfCAxNDAgKysrCiBsaWIvaW50ZWxfYWxsb2NhdG9yX3NpbXBs ZS5jICAgICAgICAgICAgICAgICAgfCAgIDIgLQogbGliL21lc29uLmJ1aWxkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA0ICsKIDggZmlsZXMgY2hhbmdlZCwgMTQxNCBpbnNlcnRp b25zKCspLCAyIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9pbnRlbF9hbGxv Y2F0b3IuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9pbnRlbF9hbGxvY2F0b3IuaAogY3JlYXRl IG1vZGUgMTAwNjQ0IGxpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5jCiBjcmVhdGUgbW9k ZSAxMDA2NDQgbGliL2ludGVsX2FsbG9jYXRvcl9tc2djaGFubmVsLmgKCmRpZmYgLS1naXQgYS9k b2NzL3JlZmVyZW5jZS9pZ3QtZ3B1LXRvb2xzL2lndC1ncHUtdG9vbHMtZG9jcy54bWwgYi9kb2Nz L3JlZmVyZW5jZS9pZ3QtZ3B1LXRvb2xzL2lndC1ncHUtdG9vbHMtZG9jcy54bWwKaW5kZXggYmY1 YWM1NDIuLjE5MmQxZGY3IDEwMDY0NAotLS0gYS9kb2NzL3JlZmVyZW5jZS9pZ3QtZ3B1LXRvb2xz L2lndC1ncHUtdG9vbHMtZG9jcy54bWwKKysrIGIvZG9jcy9yZWZlcmVuY2UvaWd0LWdwdS10b29s cy9pZ3QtZ3B1LXRvb2xzLWRvY3MueG1sCkBAIC00Myw2ICs0Myw3IEBACiAgICAgPHhpOmluY2x1 ZGUgaHJlZj0ieG1sL2lndF92YzQueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2ln dF92Z2VtLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9pZ3RfeDg2LnhtbCIvPgor ICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9pbnRlbF9hbGxvY2F0b3IueG1sIi8+CiAgICAgPHhp OmluY2x1ZGUgaHJlZj0ieG1sL2ludGVsX2JhdGNoYnVmZmVyLnhtbCIvPgogICAgIDx4aTppbmNs dWRlIGhyZWY9InhtbC9pbnRlbF9idWZvcHMueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0i eG1sL2ludGVsX2NoaXBzZXQueG1sIi8+CmRpZmYgLS1naXQgYS9saWIvaWd0X2NvcmUuYyBiL2xp Yi9pZ3RfY29yZS5jCmluZGV4IGJlNmY4NDI5Li5mYmIyN2UzMSAxMDA2NDQKLS0tIGEvbGliL2ln dF9jb3JlLmMKKysrIGIvbGliL2lndF9jb3JlLmMKQEAgLTE0MTQsNiArMTQxNCwxOSBAQCBzdGF0 aWMgdm9pZCBleGl0X3N1YnRlc3QoY29uc3QgY2hhciAqcmVzdWx0KQogCX0KIAludW1fdGVzdF9j aGlsZHJlbiA9IDA7CiAKKwkvKgorCSAqIFdoZW4gdGVzdCBjb21wbGV0ZXMgLSBtb3N0bHkgaW4g ZmFpbCBzdGF0ZSBpdCBjYW4gbGVhdmUgYWxsb2NhdGVkCisJICogb2JqZWN0cy4gQW4gYWxsb2Nh dG9yIGlzIG5vdCBhbiBleGNlcHRpb24gYXMgaXQgaXMgZ2xvYmFsIElHVAorCSAqIGVudGl0eSBh bmQgd2hlbiB0ZXN0IHdpbGwgYWxsb2NhdGUgc29tZSByYW5nZXMgYW5kIHRoZW4gaXQgd2lsbAor CSAqIGZhaWwgbm8gZnJlZS9jbG9zZSBsaWtlbHkgd2lsbCBiZSBjYWxsZWQgKGNvbnRyb2xpbmcg cG90ZW50aWFsCisJICogZmFpbHMgYW5kIGNsZWFyaW5nIGJlZm9yZSBhc3NlcnRpb25zIGluIElH VCBpcyBub3QgY29tbW9uKS4KKwkgKgorCSAqIFdlIGNhbGwgaW50ZWxfYWxsb2NhdG9yX2luaXQo KSB0aGVuIHRvIHByZXBhcmUgdGhlIGFsbG9jYXRvcgorCSAqIGluZnJhc3RydWN0dXJlIGZyb20g c2NyYXRjaCBmb3IgZWFjaCB0ZXN0LiBJbml0IGFsc28gcmVtb3ZlcworCSAqIHJlbW5hbnRzIGZy b20gcHJldmlvdXMgYWxsb2NhdG9yIHJ1biAoaWYgYW55KS4KKwkgKi8KKwlpbnRlbF9hbGxvY2F0 b3JfaW5pdCgpOworCiAJaWYgKCFpbl9keW5hbWljX3N1YnRlc3QpCiAJCV9pZ3RfZHluYW1pY190 ZXN0c19leGVjdXRlZCA9IC0xOwogCmRpZmYgLS1naXQgYS9saWIvaW50ZWxfYWxsb2NhdG9yLmMg Yi9saWIvaW50ZWxfYWxsb2NhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAuLjkyOTEzMjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2ludGVsX2FsbG9jYXRvci5jCkBA IC0wLDAgKzEsOTM4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMjAgSW50ZWwgQ29ycG9yYXRp b24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwg dG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBh c3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRl YWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0 IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBw dWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9m IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0 d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25k aXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1p c3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUg aW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAq IFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRI T1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJ TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK KyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQu ICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMg QkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwg V0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklT SU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBP UiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICov CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1 ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvbXNnLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4K KyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3Rk bGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSAi aWd0X21hcC5oIgorI2luY2x1ZGUgImludGVsX2FsbG9jYXRvci5oIgorI2luY2x1ZGUgImludGVs X2FsbG9jYXRvcl9tc2djaGFubmVsLmgiCisKKy8vI2RlZmluZSBBTExPQ0RCRworI2lmZGVmIEFM TE9DREJHCisjZGVmaW5lIGFsbG9jX2luZm8gaWd0X2luZm8KKyNkZWZpbmUgYWxsb2NfZGVidWcg aWd0X2RlYnVnCitzdGF0aWMgY29uc3QgY2hhciAqcmVxdHlwZV9zdHJbXSA9IHsKKwlbUkVRX1NU T1BdCQk9ICJzdG9wIiwKKwlbUkVRX09QRU5dCQk9ICJvcGVuIiwKKwlbUkVRX0NMT1NFXQkJPSAi Y2xvc2UiLAorCVtSRVFfQUREUkVTU19SQU5HRV0JPSAiYWRkcmVzcyByYW5nZSIsCisJW1JFUV9B TExPQ10JCT0gImFsbG9jIiwKKwlbUkVRX0ZSRUVdCQk9ICJmcmVlIiwKKwlbUkVRX0lTX0FMTE9D QVRFRF0JPSAiaXMgYWxsb2NhdGVkIiwKKwlbUkVRX1JFU0VSVkVdCQk9ICJyZXNlcnZlIiwKKwlb UkVRX1VOUkVTRVJWRV0JCT0gInVucmVzZXJ2ZSIsCisJW1JFUV9SRVNFUlZFX0lGX05PVF9BTExP Q0FURURdID0gInJlc2VydmUtaW5hIiwKKwlbUkVRX0lTX1JFU0VSVkVEXQk9ICJpcyByZXNlcnZl ZCIsCit9Oworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpyZXFzdHIoZW51bSByZXF0eXBlIHJl cXVlc3RfdHlwZSkKK3sKKwlpZ3RfYXNzZXJ0KHJlcXVlc3RfdHlwZSA+PSBSRVFfU1RPUCAmJiBy ZXF1ZXN0X3R5cGUgPD0gUkVRX0lTX1JFU0VSVkVEKTsKKwlyZXR1cm4gcmVxdHlwZV9zdHJbcmVx dWVzdF90eXBlXTsKK30KKyNlbHNlCisjZGVmaW5lIGFsbG9jX2luZm8oLi4uKSB7fQorI2RlZmlu ZSBhbGxvY19kZWJ1ZyguLi4pIHt9CisjZW5kaWYKKworc3RydWN0IGludGVsX2FsbG9jYXRvciAq aW50ZWxfYWxsb2NhdG9yX3JhbmRvbV9jcmVhdGUoaW50IGZkLCB1aW50MzJfdCBjdHgpOworc3Ry dWN0IGludGVsX2FsbG9jYXRvciAqaW50ZWxfYWxsb2NhdG9yX3NpbXBsZV9jcmVhdGUoaW50IGZk LCB1aW50MzJfdCBjdHgpOworCitzdGF0aWMgc3RydWN0IGlndF9tYXAgKmFsbG9jYXRvcnNfbWFw Oworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBtYXBfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJ QUxJWkVSOworc3RhdGljIGJvb2wgbXVsdGlwcm9jZXNzOworc3RhdGljIHB0aHJlYWRfdCBhbGxv Y2F0b3JfdGhyZWFkOworCitzdGF0aWMgYm9vbCB3YXJuX2lmX25vdF9lbXB0eTsKKworLyogRm9y IGFsbG9jYXRvciBwdXJwb3NlcyB3ZSBuZWVkIHRvIHRyYWNrIHBpZC90aWQgKi8KK3N0YXRpYyBw aWRfdCBhbGxvY2F0b3JfcGlkID0gLTE7CitleHRlcm4gcGlkX3QgY2hpbGRfcGlkOworZXh0ZXJu IF9fdGhyZWFkIHBpZF90IGNoaWxkX3RpZDsKKworc3RhdGljIHN0cnVjdCBtc2dfY2hhbm5lbCAq Y2hhbm5lbDsKKworc3RhdGljIGludCBzZW5kX2FsbG9jX3N0b3Aoc3RydWN0IG1zZ19jaGFubmVs ICptc2djaGFuKQoreworCXN0cnVjdCBhbGxvY19yZXEgcmVxID0gezB9OworCisJcmVxLnJlcXVl c3RfdHlwZSA9IFJFUV9TVE9QOworCisJcmV0dXJuIG1zZ2NoYW4tPnNlbmRfcmVxKG1zZ2NoYW4s ICZyZXEpOworfQorCitzdGF0aWMgaW50IHNlbmRfcmVxKHN0cnVjdCBtc2dfY2hhbm5lbCAqbXNn Y2hhbiwgcGlkX3QgdGlkLAorCQkgICAgc3RydWN0IGFsbG9jX3JlcSAqcmVxdWVzdCkKK3sKKwly ZXF1ZXN0LT50aWQgPSB0aWQ7CisJcmV0dXJuIG1zZ2NoYW4tPnNlbmRfcmVxKG1zZ2NoYW4sIHJl cXVlc3QpOworfQorCitzdGF0aWMgaW50IHJlY3ZfcmVxKHN0cnVjdCBtc2dfY2hhbm5lbCAqbXNn Y2hhbiwgc3RydWN0IGFsbG9jX3JlcSAqcmVxdWVzdCkKK3sKKwlyZXR1cm4gbXNnY2hhbi0+cmVj dl9yZXEobXNnY2hhbiwgcmVxdWVzdCk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9yZXNwKHN0cnVj dCBtc2dfY2hhbm5lbCAqbXNnY2hhbiwKKwkJICAgICBwaWRfdCB0aWQsIHN0cnVjdCBhbGxvY19y ZXNwICpyZXNwb25zZSkKK3sKKwlyZXNwb25zZS0+dGlkID0gdGlkOworCXJldHVybiBtc2djaGFu LT5zZW5kX3Jlc3AobXNnY2hhbiwgcmVzcG9uc2UpOworfQorCitzdGF0aWMgaW50IHJlY3ZfcmVz cChzdHJ1Y3QgbXNnX2NoYW5uZWwgKm1zZ2NoYW4sCisJCSAgICAgcGlkX3QgdGlkLCBzdHJ1Y3Qg YWxsb2NfcmVzcCAqcmVzcG9uc2UpCit7CisJcmVzcG9uc2UtPnRpZCA9IHRpZDsKKwlyZXR1cm4g bXNnY2hhbi0+cmVjdl9yZXNwKG1zZ2NoYW4sIHJlc3BvbnNlKTsKK30KKworc3RhdGljIHN0cnVj dCBpbnRlbF9hbGxvY2F0b3IgKmludGVsX2FsbG9jYXRvcl9jcmVhdGUoaW50IGZkLCB1aW50MzJf dCBjdHgsCisJCQkJCQkgICAgICB1aW50OF90IGFsbG9jYXRvcl90eXBlKQoreworCXN0cnVjdCBp bnRlbF9hbGxvY2F0b3IgKmlhbDsKKworCXN3aXRjaCAoYWxsb2NhdG9yX3R5cGUpIHsKKwljYXNl IElOVEVMX0FMTE9DQVRPUl9OT05FOgorCQlpZ3RfYXNzZXJ0X2YoYWxsb2NhdG9yX3R5cGUgIT0g SU5URUxfQUxMT0NBVE9SX05PTkUsCisJCQkgICAgICJCdWcsIHRyeWluZyB0byB1c2UgYWxsb2Nh dG9yIHdpdGggcmVsb2NhdGlvbnMiKTsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9BTExPQ0FUT1Jf UkFORE9NOgorCQlpYWwgPSBpbnRlbF9hbGxvY2F0b3JfcmFuZG9tX2NyZWF0ZShmZCwgY3R4KTsK KwkJYnJlYWs7CisJY2FzZSBJTlRFTF9BTExPQ0FUT1JfU0lNUExFOgorCQlpYWwgPSBpbnRlbF9h bGxvY2F0b3Jfc2ltcGxlX2NyZWF0ZShmZCwgY3R4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ aWd0X2Fzc2VydF9mKGlhbCwgIkFsbG9jYXRvciB0eXBlICVkIG5vdCBpbXBsZW1lbnRlZFxuIiwK KwkJCSAgICAgYWxsb2NhdG9yX3R5cGUpOworCQlicmVhazsKKwl9CisKKwlpYWwtPnR5cGUgPSBh bGxvY2F0b3JfdHlwZTsKKwlhdG9taWNfZmV0Y2hfYWRkKCZpYWwtPnJlZmNvdW50LCAxKTsKKwlw dGhyZWFkX211dGV4X2luaXQoJmlhbC0+bXV0ZXgsIE5VTEwpOworCisJaWd0X21hcF9hZGQoYWxs b2NhdG9yc19tYXAsIGlhbCwgaWFsKTsKKworCXJldHVybiBpYWw7Cit9CisKK3N0YXRpYyB2b2lk IGludGVsX2FsbG9jYXRvcl9kZXN0cm95KHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCkKK3sK KwlhbGxvY19pbmZvKCJEZXN0cm95aW5nIGFsbG9jYXRvciAoZW1wdHk6ICVkKVxuIiwKKwkJICAg aWFsLT5pc19lbXB0eShpYWwpKTsKKworCWlhbC0+ZGVzdHJveShpYWwpOworfQorCitzdGF0aWMg c3RydWN0IGludGVsX2FsbG9jYXRvciAqX19hbGxvY2F0b3JfZ2V0KGludCBmZCwgdWludDMyX3Qg Y3R4KQoreworCXN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwgaWFscyA9IHsgLmZkID0gZmQs IC5jdHggPSBjdHggfTsKKwlpbnQgcmVmY291bnQ7CisKKwlpYWwgPSBpZ3RfbWFwX2ZpbmQoYWxs b2NhdG9yc19tYXAsICZpYWxzKTsKKwlpZiAoIWlhbCkKKwkJZ290byBvdXRfZ2V0OworCisJcmVm Y291bnQgPSBhdG9taWNfZmV0Y2hfYWRkKCZpYWwtPnJlZmNvdW50LCAxKTsKKwlpZ3RfYXNzZXJ0 KHJlZmNvdW50ID4gMCk7CisKK291dF9nZXQ6CisKKwlyZXR1cm4gaWFsOworfQorCitzdGF0aWMg Ym9vbCBfX2FsbG9jYXRvcl9wdXQoc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsKQoreworCXN0 cnVjdCBpbnRlbF9hbGxvY2F0b3IgaWFscyA9IHsgLmZkID0gaWFsLT5mZCwgLmN0eCA9IGlhbC0+ Y3R4IH07CisJYm9vbCByZWxlYXNlZCA9IGZhbHNlOworCWludCByZWZjb3VudDsKKworCWlhbCA9 IGlndF9tYXBfZmluZChhbGxvY2F0b3JzX21hcCwgJmlhbHMpOworCWlndF9hc3NlcnQoaWFsKTsK KworCXJlZmNvdW50ID0gYXRvbWljX2ZldGNoX3N1YigmaWFsLT5yZWZjb3VudCwgMSk7CisJYWxs b2NfZGVidWcoIlJlZmNvdW50OiAlZFxuIiwgcmVmY291bnQpOworCWlndF9hc3NlcnQocmVmY291 bnQgPj0gMSk7CisJaWYgKHJlZmNvdW50ID09IDEpIHsKKwkJaWd0X21hcF9kZWwoYWxsb2NhdG9y c19tYXAsIGlhbCk7CisKKwkJaWYgKCFpYWwtPmlzX2VtcHR5KGlhbCkgJiYgd2Fybl9pZl9ub3Rf ZW1wdHkpCisJCQlpZ3Rfd2FybigiQWxsb2NhdG9yIG5vdCBjbGVhciBiZWZvcmUgZGVzdHJveSFc biIpOworCisJCXJlbGVhc2VkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gcmVsZWFzZWQ7Cit9CisK K3N0YXRpYyBzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICphbGxvY2F0b3Jfb3BlbihpbnQgZmQsIHVp bnQzMl90IGN0eCwKKwkJCQkJICAgICAgdWludDhfdCBhbGxvY2F0b3JfdHlwZSkKK3sKKwlzdHJ1 Y3QgaW50ZWxfYWxsb2NhdG9yICppYWw7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJm1hcF9tdXRl eCk7CisKKwlpYWwgPSBfX2FsbG9jYXRvcl9nZXQoZmQsIGN0eCk7CisJaWYgKGlhbCkgeworCQlp ZiAoaWFsLT50eXBlICE9IGFsbG9jYXRvcl90eXBlKQorCQkJcHRocmVhZF9tdXRleF91bmxvY2so Jm1hcF9tdXRleCk7CisJCWlndF9hc3NlcnRfZihpYWwtPnR5cGUgPT0gYWxsb2NhdG9yX3R5cGUs CisJCQkgICAgICJBbGxvY2F0b3IgbXVzdCBiZSBzYW1lIHR5cGUgZm9yIGZkL2N0eFxuIik7CisJ fSBlbHNlIHsKKwkJYWxsb2NfZGVidWcoIkFsbG9jYXRvciBmZDogJWQsIGN0eDogJXUgbm90IGZv dW5kLCBjcmVhdGluZyBvbmVcbiIsCisJCQkgICAgZmQsIGN0eCk7CisJCWlhbCA9IGludGVsX2Fs bG9jYXRvcl9jcmVhdGUoZmQsIGN0eCwgYWxsb2NhdG9yX3R5cGUpOworCX0KKworCXB0aHJlYWRf bXV0ZXhfdW5sb2NrKCZtYXBfbXV0ZXgpOworCisJcmV0dXJuIGlhbDsKK30KKworc3RhdGljIGJv b2wgYWxsb2NhdG9yX2Nsb3NlKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUpCit7CisJc3RydWN0 IGludGVsX2FsbG9jYXRvciAqaWFsID0gZnJvbV91c2VyX3BvaW50ZXIoYWxsb2NhdG9yX2hhbmRs ZSk7CisJYm9vbCByZWxlYXNlZCwgaXNfZW1wdHkgPSBmYWxzZTsKKworCWlndF9hc3NlcnQoaWFs KTsKKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbWFwX211dGV4KTsKKworCXJlbGVhc2VkID0gX19h bGxvY2F0b3JfcHV0KGlhbCk7CisJaWYgKHJlbGVhc2VkKSB7CisJCWlzX2VtcHR5ID0gaWFsLT5p c19lbXB0eShpYWwpOworCQlpbnRlbF9hbGxvY2F0b3JfZGVzdHJveShpYWwpOworCX0KKworCXB0 aHJlYWRfbXV0ZXhfdW5sb2NrKCZtYXBfbXV0ZXgpOworCisJcmV0dXJuIGlzX2VtcHR5OworfQor CitzdGF0aWMgaW50IHNlbmRfcmVxX3JlY3ZfcmVzcChzdHJ1Y3QgbXNnX2NoYW5uZWwgKm1zZ2No YW4sCisJCQkgICAgICBzdHJ1Y3QgYWxsb2NfcmVxICpyZXF1ZXN0LAorCQkJICAgICAgc3RydWN0 IGFsbG9jX3Jlc3AgKnJlc3BvbnNlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzZW5kX3JlcSht c2djaGFuLCBjaGlsZF90aWQsIHJlcXVlc3QpOworCWlmIChyZXQgPCAwKSB7CisJCWlndF93YXJu KCJFcnJvciBzZW5kaW5nIHJlcXVlc3QgW3R5cGU6ICVkXTogZXJyID0gJWQgWyVzXVxuIiwKKwkJ CSByZXF1ZXN0LT5yZXF1ZXN0X3R5cGUsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCisJCXJl dHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVjdl9yZXNwKG1zZ2NoYW4sIGNoaWxkX3RpZCwgcmVz cG9uc2UpOworCWlmIChyZXQgPCAwKQorCQlpZ3Rfd2FybigiRXJyb3IgcmVjZWl2aW5nIHJlc3Bv bnNlIFt0eXBlOiAlZF06IGVyciA9ICVkIFslc11cbiIsCisJCQkgcmVxdWVzdC0+cmVxdWVzdF90 eXBlLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qCisJICogVGhpcyBpcyBtYWluIGFz c3VtcHRpb24gLSB3ZSByZWNlaXZlIG1lc3NhZ2Ugd2hpY2ggc2l6ZSBtdXN0IGJlID4gMC4KKwkg KiBJZiB0aGlzIGlzIGZ1bGZpbGxlZCB3ZSByZXR1cm4gMCBhcyBhIHN1Y2Nlc3MuCisJICovCisJ aWYgKHJldCA+IDApCisJCXJldCA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IGhhbmRsZV9yZXF1ZXN0KHN0cnVjdCBhbGxvY19yZXEgKnJlcSwgc3RydWN0IGFsbG9jX3Jlc3Ag KnJlc3ApCit7CisJYm9vbCBzYW1lX3Byb2Nlc3MgPSBjaGlsZF9waWQgPT0gLTE7CisJaW50IHJl dDsKKworCW1lbXNldChyZXNwLCAwLCBzaXplb2YoKnJlc3ApKTsKKworCWlmIChzYW1lX3Byb2Nl c3MpIHsKKwkJc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsOworCQl1aW50NjRfdCBzdGFydCwg ZW5kLCBzaXplOworCQlib29sIGFsbG9jYXRlZCwgcmVzZXJ2ZWQsIHVucmVzZXJ2ZWQ7CisKKwkJ LyogTXV0ZXggb25seSB3b3JrIG9uIGFsbG9jYXRvciBpbnN0YW5jZSwgbm90IHN0b3Avb3Blbi9j bG9zZSAqLworCQlpZiAocmVxLT5yZXF1ZXN0X3R5cGUgPiBSRVFfQ0xPU0UpIHsKKwkJCWlhbCA9 IGZyb21fdXNlcl9wb2ludGVyKHJlcS0+YWxsb2NhdG9yX2hhbmRsZSk7CisJCQlpZ3RfYXNzZXJ0 KGlhbCk7CisKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmaWFsLT5tdXRleCk7CisJCX0KKworCQlz d2l0Y2ggKHJlcS0+cmVxdWVzdF90eXBlKSB7CisJCWNhc2UgUkVRX1NUT1A6CisJCQlhbGxvY19p bmZvKCI8c3RvcD5cbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVFfT1BFTjoKKwkJCWlhbCA9 IGFsbG9jYXRvcl9vcGVuKHJlcS0+b3Blbi5mZCwgcmVxLT5vcGVuLmN0eCwKKwkJCQkJICAgICBy ZXEtPm9wZW4uYWxsb2NhdG9yX3R5cGUpOworCQkJaWd0X2Fzc2VydChpYWwpOworCisJCQlyZXNw LT5yZXNwb25zZV90eXBlID0gUkVTUF9PUEVOOworCQkJcmVzcC0+b3Blbi5hbGxvY2F0b3JfaGFu ZGxlID0gdG9fdXNlcl9wb2ludGVyKGlhbCk7CisJCQlhbGxvY19pbmZvKCI8b3Blbj4gW3RpZDog JWxkXSBmZDogJWQsIGN0eDogJXUsIGFsbG9jX3R5cGU6ICV1LCAiCisJCQkJICAgImFobmQ6ICVw LCByZWZjbnQ6ICVkXG4iLAorCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5vcGVuLmZkLCBy ZXEtPm9wZW4uY3R4LAorCQkJCSAgIHJlcS0+b3Blbi5hbGxvY2F0b3JfdHlwZSwgaWFsLAorCQkJ CSAgIGF0b21pY19sb2FkKCZpYWwtPnJlZmNvdW50KSk7CisJCQlicmVhazsKKworCQljYXNlIFJF UV9DTE9TRToKKwkJCWlhbCA9IGZyb21fdXNlcl9wb2ludGVyKHJlcS0+YWxsb2NhdG9yX2hhbmRs ZSk7CisJCQlpZ3RfYXNzZXJ0KGlhbCk7CisKKwkJCXJlc3AtPnJlc3BvbnNlX3R5cGUgPSBSRVNQ X0NMT1NFOworCQkJcmV0ID0gYXRvbWljX2xvYWQoJmlhbC0+cmVmY291bnQpOworCQkJcmVzcC0+ Y2xvc2UuaXNfZW1wdHkgPSBhbGxvY2F0b3JfY2xvc2UocmVxLT5hbGxvY2F0b3JfaGFuZGxlKTsK KwkJCWFsbG9jX2luZm8oIjxjbG9zZT4gW3RpZDogJWxkXSBhaG5kOiAlcCwgaXNfZW1wdHk6ICVk LCByZWZjbnQ6ICVkXG4iLAorCQkJCSAgIChsb25nKSByZXEtPnRpZCwgaWFsLCByZXNwLT5jbG9z ZS5pc19lbXB0eSwgcmV0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVRX0FERFJFU1NfUkFOR0U6 CisJCQlyZXNwLT5yZXNwb25zZV90eXBlID0gUkVTUF9BRERSRVNTX1JBTkdFOworCQkJaWFsLT5n ZXRfYWRkcmVzc19yYW5nZShpYWwsICZzdGFydCwgJmVuZCk7CisJCQlyZXNwLT5hZGRyZXNzX3Jh bmdlLnN0YXJ0ID0gc3RhcnQ7CisJCQlyZXNwLT5hZGRyZXNzX3JhbmdlLmVuZCA9IGVuZDsKKwkJ CWFsbG9jX2luZm8oIjxhZGRyZXNzIHJhbmdlPiBbdGlkOiAlbGRdIHN0YXJ0OiAlIiBQUkl4NjQK KwkJCQkgICAiLCBlbmQ6ICUiIFBSSWQ2NCAiXG4iLCAobG9uZykgcmVxLT50aWQsCisJCQkJICAg c3RhcnQsIGVuZCk7CisJCQlicmVhazsKKworCQljYXNlIFJFUV9BTExPQzoKKwkJCXJlc3AtPnJl c3BvbnNlX3R5cGUgPSBSRVNQX0FMTE9DOworCQkJcmVzcC0+YWxsb2Mub2Zmc2V0ID0gaWFsLT5h bGxvYyhpYWwsCisJCQkJCQkJcmVxLT5hbGxvYy5oYW5kbGUsCisJCQkJCQkJcmVxLT5hbGxvYy5z aXplLAorCQkJCQkJCXJlcS0+YWxsb2MuYWxpZ25tZW50KTsKKwkJCWFsbG9jX2luZm8oIjxhbGxv Yz4gW3RpZDogJWxkXSBoYW5kbGU6ICV1LCBvZmZzZXQ6ICUiIFBSSXg2NAorCQkJCSAgICIsIGFs aWdubWVudDogJSIgUFJJeDY0ICJcbiIsCisJCQkJICAgKGxvbmcpIHJlcS0+dGlkLCByZXEtPmFs bG9jLmhhbmRsZSwKKwkJCQkgICByZXNwLT5hbGxvYy5vZmZzZXQsIHJlcS0+YWxsb2MuYWxpZ25t ZW50KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVRX0ZSRUU6CisJCQlyZXNwLT5yZXNwb25zZV90 eXBlID0gUkVTUF9GUkVFOworCQkJcmVzcC0+ZnJlZS5mcmVlZCA9IGlhbC0+ZnJlZShpYWwsIHJl cS0+ZnJlZS5oYW5kbGUpOworCQkJYWxsb2NfaW5mbygiPGZyZWU+IFt0aWQ6ICVsZF0gaGFuZGxl OiAldSwgZnJlZWQ6ICVkXG4iLAorCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5mcmVlLmhh bmRsZSwgcmVzcC0+ZnJlZS5mcmVlZCk7CisJCQlicmVhazsKKworCQljYXNlIFJFUV9JU19BTExP Q0FURUQ6CisJCQlyZXNwLT5yZXNwb25zZV90eXBlID0gUkVTUF9JU19BTExPQ0FURUQ7CisJCQlh bGxvY2F0ZWQgPSBpYWwtPmlzX2FsbG9jYXRlZChpYWwsCisJCQkJCQkgICAgICByZXEtPmlzX2Fs bG9jYXRlZC5oYW5kbGUsCisJCQkJCQkgICAgICByZXEtPmlzX2FsbG9jYXRlZC5zaXplLAorCQkJ CQkJICAgICAgcmVxLT5pc19hbGxvY2F0ZWQub2Zmc2V0KTsKKwkJCXJlc3AtPmlzX2FsbG9jYXRl ZC5hbGxvY2F0ZWQgPSBhbGxvY2F0ZWQ7CisJCQlhbGxvY19pbmZvKCI8aXMgYWxsb2NhdGVkPiBb dGlkOiAlbGRdIG9mZnNldDogJSIgUFJJeDY0CisJCQkJICAgIiwgYWxsb2NhdGVkOiAlZFxuIiwg KGxvbmcpIHJlcS0+dGlkLAorCQkJCSAgIHJlcS0+aXNfYWxsb2NhdGVkLm9mZnNldCwgYWxsb2Nh dGVkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVRX1JFU0VSVkU6CisJCQlyZXNwLT5yZXNwb25z ZV90eXBlID0gUkVTUF9SRVNFUlZFOworCQkJcmVzZXJ2ZWQgPSBpYWwtPnJlc2VydmUoaWFsLAor CQkJCQkJcmVxLT5yZXNlcnZlLmhhbmRsZSwKKwkJCQkJCXJlcS0+cmVzZXJ2ZS5zdGFydCwKKwkJ CQkJCXJlcS0+cmVzZXJ2ZS5lbmQpOworCQkJcmVzcC0+cmVzZXJ2ZS5yZXNlcnZlZCA9IHJlc2Vy dmVkOworCQkJYWxsb2NfaW5mbygiPHJlc2VydmU+IFt0aWQ6ICVsZF0gaGFuZGxlOiAldSwgc3Rh cnQ6ICUiIFBSSXg2NAorCQkJCSAgICIsIGVuZDogJSIgUFJJeDY0ICIsIHJlc2VydmVkOiAlZFxu IiwKKwkJCQkgICAobG9uZykgcmVxLT50aWQsIHJlcS0+cmVzZXJ2ZS5oYW5kbGUsCisJCQkJICAg cmVxLT5yZXNlcnZlLnN0YXJ0LCByZXEtPnJlc2VydmUuZW5kLCByZXNlcnZlZCk7CisJCQlicmVh azsKKworCQljYXNlIFJFUV9VTlJFU0VSVkU6CisJCQlyZXNwLT5yZXNwb25zZV90eXBlID0gUkVT UF9VTlJFU0VSVkU7CisJCQl1bnJlc2VydmVkID0gaWFsLT51bnJlc2VydmUoaWFsLAorCQkJCQkJ ICAgIHJlcS0+dW5yZXNlcnZlLmhhbmRsZSwKKwkJCQkJCSAgICByZXEtPnVucmVzZXJ2ZS5zdGFy dCwKKwkJCQkJCSAgICByZXEtPnVucmVzZXJ2ZS5lbmQpOworCQkJcmVzcC0+dW5yZXNlcnZlLnVu cmVzZXJ2ZWQgPSB1bnJlc2VydmVkOworCQkJYWxsb2NfaW5mbygiPHVucmVzZXJ2ZT4gW3RpZDog JWxkXSBoYW5kbGU6ICV1LCBzdGFydDogJSIgUFJJeDY0CisJCQkJICAgIiwgZW5kOiAlIiBQUkl4 NjQgIiwgdW5yZXNlcnZlZDogJWRcbiIsCisJCQkJICAgKGxvbmcpIHJlcS0+dGlkLCByZXEtPnVu cmVzZXJ2ZS5oYW5kbGUsCisJCQkJICAgcmVxLT51bnJlc2VydmUuc3RhcnQsIHJlcS0+dW5yZXNl cnZlLmVuZCwKKwkJCQkgICB1bnJlc2VydmVkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVRX0lT X1JFU0VSVkVEOgorCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJFU1BfSVNfUkVTRVJWRUQ7CisJ CQlyZXNlcnZlZCA9IGlhbC0+aXNfcmVzZXJ2ZWQoaWFsLAorCQkJCQkJICAgIHJlcS0+aXNfcmVz ZXJ2ZWQuc3RhcnQsCisJCQkJCQkgICAgcmVxLT5pc19yZXNlcnZlZC5lbmQpOworCQkJcmVzcC0+ aXNfcmVzZXJ2ZWQucmVzZXJ2ZWQgPSByZXNlcnZlZDsKKwkJCWFsbG9jX2luZm8oIjxpcyByZXNl cnZlZD4gW3RpZDogJWxkXSBzdGFydDogJSIgUFJJeDY0CisJCQkJICAgIiwgZW5kOiAlIiBQUkl4 NjQgIiwgcmVzZXJ2ZWQ6ICVkXG4iLAorCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5pc19y ZXNlcnZlZC5zdGFydCwKKwkJCQkgICByZXEtPmlzX3Jlc2VydmVkLmVuZCwgcmVzZXJ2ZWQpOwor CQkJYnJlYWs7CisKKwkJY2FzZSBSRVFfUkVTRVJWRV9JRl9OT1RfQUxMT0NBVEVEOgorCQkJcmVz cC0+cmVzcG9uc2VfdHlwZSA9IFJFU1BfUkVTRVJWRV9JRl9OT1RfQUxMT0NBVEVEOworCQkJc2l6 ZSA9IHJlcS0+cmVzZXJ2ZS5lbmQgLSByZXEtPnJlc2VydmUuc3RhcnQ7CisKKwkJCWFsbG9jYXRl ZCA9IGlhbC0+aXNfYWxsb2NhdGVkKGlhbCwgcmVxLT5yZXNlcnZlLmhhbmRsZSwKKwkJCQkJCSAg ICAgIHNpemUsIHJlcS0+cmVzZXJ2ZS5zdGFydCk7CisJCQlpZiAoYWxsb2NhdGVkKSB7CisJCQkJ cmVzcC0+cmVzZXJ2ZV9pZl9ub3RfYWxsb2NhdGVkLmFsbG9jYXRlZCA9IGFsbG9jYXRlZDsKKwkJ CQlhbGxvY19pbmZvKCI8cmVzZXJ2ZSBpZiBub3QgYWxsb2NhdGVkPiBbdGlkOiAlbGRdIGhhbmRs ZTogJXUgIgorCQkJCQkgICAic2l6ZTogJWx4LCBzdGFydDogJSIgUFJJeDY0CisJCQkJCSAgICIs IGVuZDogJSIgUFJJeDY0ICIsIGFsbG9jYXRlZDogJWQsIHJlc2VydmVkOiAlZFxuIiwKKwkJCQkJ ICAgKGxvbmcpIHJlcS0+dGlkLCByZXEtPnJlc2VydmUuaGFuZGxlLAorCQkJCQkgICAobG9uZykg c2l6ZSwgcmVxLT5yZXNlcnZlLnN0YXJ0LAorCQkJCQkgICByZXEtPnJlc2VydmUuZW5kLCBhbGxv Y2F0ZWQsIGZhbHNlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcmVzZXJ2ZWQgPSBpYWwtPnJl c2VydmUoaWFsLAorCQkJCQkJcmVxLT5yZXNlcnZlLmhhbmRsZSwKKwkJCQkJCXJlcS0+cmVzZXJ2 ZS5zdGFydCwKKwkJCQkJCXJlcS0+cmVzZXJ2ZS5lbmQpOworCQkJcmVzcC0+cmVzZXJ2ZV9pZl9u b3RfYWxsb2NhdGVkLnJlc2VydmVkID0gcmVzZXJ2ZWQ7CisJCQlhbGxvY19pbmZvKCI8cmVzZXJ2 ZSBpZiBub3QgYWxsb2NhdGVkPiBbdGlkOiAlbGRdIGhhbmRsZTogJXUiCisJCQkJICAgIiwgc3Rh cnQ6ICUiIFBSSXg2NAorCQkJCSAgICIsIGVuZDogJSIgUFJJeDY0ICIsIGFsbG9jYXRlZDogJWQs IHJlc2VydmVkOiAlZFxuIiwKKwkJCQkgICAobG9uZykgcmVxLT50aWQsIHJlcS0+cmVzZXJ2ZS5o YW5kbGUsCisJCQkJICAgcmVxLT5yZXNlcnZlLnN0YXJ0LCByZXEtPnJlc2VydmUuZW5kLAorCQkJ CSAgIGZhbHNlLCByZXNlcnZlZCk7CisJCQlicmVhazsKKworCQl9CisKKwkJaWYgKHJlcS0+cmVx dWVzdF90eXBlID4gUkVRX0NMT1NFKQorCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmlhbC0+bXV0 ZXgpOworCisJCXJldHVybiAwOworCX0KKworCXJldCA9IHNlbmRfcmVxX3JlY3ZfcmVzcChjaGFu bmVsLCByZXEsIHJlc3ApOworCisJaWYgKHJldCA8IDApCisJCWV4aXQoMCk7CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgdm9pZCBraWxsX2NoaWxkcmVuKGludCBzaWcpCit7CisJc2lnbmFs KHNpZywgU0lHX0lHTik7CisJa2lsbCgtZ2V0cGdycCgpLCBzaWcpOworCXNpZ25hbChzaWcsIFNJ R19ERkwpOworfQorCitzdGF0aWMgdm9pZCAqYWxsb2NhdG9yX3RocmVhZF9sb29wKHZvaWQgKmRh dGEpCit7CisJc3RydWN0IGFsbG9jX3JlcSByZXE7CisJc3RydWN0IGFsbG9jX3Jlc3AgcmVzcDsK KwlpbnQgcmV0OworCSh2b2lkKSBkYXRhOworCisJYWxsb2NfaW5mbygiQWxsb2NhdG9yIHBpZDog JWxkLCB0aWQ6ICVsZFxuIiwKKwkJICAgKGxvbmcpIGFsbG9jYXRvcl9waWQsIChsb25nKSBnZXR0 aWQoKSk7CisJYWxsb2NfaW5mbygiRW50ZXJpbmcgYWxsb2NhdG9yIGxvb3BcbiIpOworCisJd2hp bGUgKDEpIHsKKwkJcmV0ID0gcmVjdl9yZXEoY2hhbm5lbCwgJnJlcSk7CisKKwkJaWYgKHJldCA9 PSAtMSkgeworCQkJaWd0X3dhcm4oIkVycm9yIHJlY2VpdmluZyByZXF1ZXN0IGluIHRocmVhZCwg cmV0ID0gJWQgWyVzXVxuIiwKKwkJCQkgcmV0LCBzdHJlcnJvcihlcnJubykpOworCQkJa2lsbF9j aGlsZHJlbihTSUdJTlQpOworCQkJcmV0dXJuICh2b2lkICopIC0xOworCQl9CisKKwkJLyogRmFr ZSBtZXNzYWdlIHRvIHN0b3AgdGhlIHRocmVhZCAqLworCQlpZiAocmVxLnJlcXVlc3RfdHlwZSA9 PSBSRVFfU1RPUCkgeworCQkJYWxsb2NfaW5mbygiPHN0b3AgcmVxdWVzdD5cbiIpOworCQkJYnJl YWs7CisJCX0KKworCQlyZXQgPSBoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCk7CisJCWlmIChy ZXQpIHsKKwkJCWlndF93YXJuKCJFcnJvciBoYW5kbGluZyByZXF1ZXN0IGluIHRocmVhZCwgcmV0 ID0gJWQgWyVzXVxuIiwKKwkJCQkgcmV0LCBzdHJlcnJvcihlcnJubykpOworCQkJYnJlYWs7CisJ CX0KKworCQlyZXQgPSBzZW5kX3Jlc3AoY2hhbm5lbCwgcmVxLnRpZCwgJnJlc3ApOworCQlpZiAo cmV0KSB7CisJCQlpZ3Rfd2FybigiRXJyb3Igc2VuZGluZyByZXNwb25zZSBpbiB0aHJlYWQsIHJl dCA9ICVkIFslc11cbiIsCisJCQkJIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKworCQkJa2lsbF9j aGlsZHJlbihTSUdJTlQpOworCQkJcmV0dXJuICh2b2lkICopIC0xOworCQl9CisJfQorCisJcmV0 dXJuIE5VTEw7Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9yX211bHRpcHJvY2Vzc19zdGFy dDoKKyAqCisgKiBGdW5jdGlvbiB0dXJucyBvbiBpbnRlbF9hbGxvY2F0b3IgbXVsdGlwcm9jZXNz IG1vZGUgd2hhdCBtZWFucworICogYWxsIGFsbG9jYXRpb25zIGZyb20gY2hpbGRyZW4gcHJvY2Vz c2VzIGFyZSBwZXJmb3JtZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAqIHdpdGhpbiBtYWluIGln dCBwcm9jZXNzLiBDaGlsZHJlbiBhcmUgYXdhcmUgb2YgdGhlIHNpdHVhdGlvbiBhbmQgdXNlCisg KiBzb21lIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIGNoYW5uZWwgdG8gc2VuZC9yZWNlaXZl IG1lc3NhZ2VzCisgKiAob3BlbiwgY2xvc2UsIGFsbG9jLCBmcmVlLCAuLi4pIHRvL2Zyb20gYWxs b2NhdG9yIHRocmVhZC4KKyAqCisgKiBNdXN0IGJlIHVzZWQgd2hlbiB5b3Ugd2FudCB0byB1c2Ug YW4gYWxsb2NhdG9yIGluIG5vbiBzaW5nbGUtcHJvY2VzcyBjb2RlLgorICogQWxsIGFsbG9jYXRp b25zIGluIHRocmVhZHMgc3Bhd25lZCBpbiBtYWluIGlndCBwcm9jZXNzIGFyZSBoYW5kbGVkIGJ5 CisgKiBtdXRleGluZywgbm90IGJ5IHNlbmRpbmcvcmVjZWl2aW5nIG1lc3NhZ2VzIHRvL2Zyb20g YWxsb2NhdG9yIHRocmVhZC4KKyAqCisgKiBOb3RlLiBUaGlzIGRlc3Ryb3lzIGFsbCBwcmV2aW91 c2x5IGNyZWF0ZWQgYWxsb2NhdG9ycyBhbmQgdGhlaXJzIGNvbnRlbnQuCisgKi8KK3ZvaWQgaW50 ZWxfYWxsb2NhdG9yX211bHRpcHJvY2Vzc19zdGFydCh2b2lkKQoreworCWFsbG9jX2luZm8oImFs bG9jYXRvciBtdWx0aXByb2Nlc3Mgc3RhcnRcbiIpOworCisJaW50ZWxfYWxsb2NhdG9yX2luaXQo KTsKKworCW11bHRpcHJvY2VzcyA9IHRydWU7CisJY2hhbm5lbC0+aW5pdChjaGFubmVsKTsKKwor CXB0aHJlYWRfY3JlYXRlKCZhbGxvY2F0b3JfdGhyZWFkLCBOVUxMLAorCQkgICAgICAgYWxsb2Nh dG9yX3RocmVhZF9sb29wLCBOVUxMKTsKK30KKworLyoqCisgKiBpbnRlbF9hbGxvY2F0b3JfbXVs dGlwcm9jZXNzX3N0b3A6CisgKgorICogRnVuY3Rpb24gdHVybnMgb2ZmIGludGVsX2FsbG9jYXRv ciBtdWx0aXByb2Nlc3MgbW9kZSB3aGF0IG1lYW5zIG1lYW5zCisgKiBzdG9wcGluZyBhbGxvY2F0 b3IgdGhyZWFkIGFuZCBkZWluaXRpYWxpemluZyBpdHMgZGF0YS4KKyAqLwordm9pZCBpbnRlbF9h bGxvY2F0b3JfbXVsdGlwcm9jZXNzX3N0b3Aodm9pZCkKK3sKKwlhbGxvY19pbmZvKCJhbGxvY2F0 b3IgbXVsdGlwcm9jZXNzIHN0b3BcbiIpOworCisJaWYgKG11bHRpcHJvY2VzcykgeworCQlzZW5k X2FsbG9jX3N0b3AoY2hhbm5lbCk7CisJCS8qIERlaW5pdCwgdGhpcyBzaG91bGQgc3RvcCBhbGwg YmxvY2tlZCBzeXNjYWxscywgaWYgYW55ICovCisJCWNoYW5uZWwtPmRlaW5pdChjaGFubmVsKTsK KwkJcHRocmVhZF9qb2luKGFsbG9jYXRvcl90aHJlYWQsIE5VTEwpOworCQkvKiBCdXQgd2UncmUg bm90IHN1cmUgZG9lcyBjaGlsZCB3aWxsIHN0dWNrICovCisJCWtpbGxfY2hpbGRyZW4oU0lHSU5U KTsKKwkJaWd0X3dhaXRjaGlsZHJlbl90aW1lb3V0KDUsICJTdG9wcGluZyBjaGlsZHJlbiIpOwor CQltdWx0aXByb2Nlc3MgPSBmYWxzZTsKKwl9Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9y X29wZW46CisgKiBAZmQ6IGk5MTUgZGVzY3JpcHRvcgorICogQGN0eDogY29udGV4dAorICogQGFs bG9jYXRvcl90eXBlOiBvbmUgb2YgSU5URUxfQUxMT0NBVE9SXyogZGVmaW5lCisgKgorICogRnVu Y3Rpb24gb3BlbnMgYW4gYWxsb2NhdG9yIGluc3RhbmNlIGZvciBnaXZlbiBAZmQgYW5kIEBjdHgg YW5kIHJldHVybnMKKyAqIGl0cyBoYW5kbGUuIElmIHRoZSBhbGxvY2F0b3IgZm9yIHN1Y2ggcGFp ciBkb2Vzbid0IGV4aXN0IGl0IGlzIGNyZWF0ZWQKKyAqIHdpdGggcmVmY291bnQgPSAxLiBQYXJh bGxlbCBvcGVucyByZXR1cm5zIHNhbWUgaGFuZGxlIGJ1bXBpbmcgaXRzIHJlZmNvdW50LgorICoK KyAqIFJldHVybnM6IHVuaXF1ZSBoYW5kbGUgdG8gdGhlIGN1cnJlbnRseSBvcGVuZWQgYWxsb2Nh dG9yLgorICovCit1aW50NjRfdCBpbnRlbF9hbGxvY2F0b3Jfb3BlbihpbnQgZmQsIHVpbnQzMl90 IGN0eCwgdWludDhfdCBhbGxvY2F0b3JfdHlwZSkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJlcSA9 IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9PUEVOLAorCQkJCSAub3Blbi5mZCA9IGZkLAorCQkJCSAu b3Blbi5jdHggPSBjdHgsCisJCQkJIC5vcGVuLmFsbG9jYXRvcl90eXBlID0gYWxsb2NhdG9yX3R5 cGUgfTsKKwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwOworCisJLyogR2V0IGNoaWxkX3RpZCBvbmx5 IG9uY2UgYXQgb3BlbigpICovCisJaWYgKGNoaWxkX3RpZCA9PSAtMSkKKwkJY2hpbGRfdGlkID0g Z2V0dGlkKCk7CisKKwlpZ3RfYXNzZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNwKSA9PSAw KTsKKwlpZ3RfYXNzZXJ0KHJlc3Aub3Blbi5hbGxvY2F0b3JfaGFuZGxlKTsKKwlpZ3RfYXNzZXJ0 KHJlc3AucmVzcG9uc2VfdHlwZSA9PSBSRVNQX09QRU4pOworCisJcmV0dXJuIHJlc3Aub3Blbi5h bGxvY2F0b3JfaGFuZGxlOworfQorCisvKioKKyAqIGludGVsX2FsbG9jYXRvcl9jbG9zZToKKyAq IEBhbGxvY2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIGFsbG9jYXRvciB0aGF0IHdpbGwgYmUg Y2xvc2VkCisgKgorICogRnVuY3Rpb24gZGVjcmVhc2VzIGFuIGFsbG9jYXRvciByZWZjb3VudCBm b3IgdGhlIGdpdmVuIEBoYW5kbGUuCisgKiBXaGVuIHJlZmNvdW50IHJlYWNoZXMgemVybyBhbGxv Y2F0b3IgaXMgY2xvc2VkIChkZXN0cm95ZWQpIGFuZCBhbGwKKyAqIGFsbG9jYXRlZCAvIHJlc2Vy dmVkIGFyZWFzIGFyZSBmcmVlZC4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlmIGNsb3NlZCBhbGxv Y2F0b3Igd2FzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgaW50ZWxfYWxsb2Nh dG9yX2Nsb3NlKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUpCit7CisJc3RydWN0IGFsbG9jX3Jl cSByZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfQ0xPU0UsCisJCQkJIC5hbGxvY2F0b3JfaGFu ZGxlID0gYWxsb2NhdG9yX2hhbmRsZSB9OworCXN0cnVjdCBhbGxvY19yZXNwIHJlc3A7CisKKwlp Z3RfYXNzZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNwKSA9PSAwKTsKKwlpZ3RfYXNzZXJ0 KHJlc3AucmVzcG9uc2VfdHlwZSA9PSBSRVNQX0NMT1NFKTsKKworCXJldHVybiByZXNwLmNsb3Nl LmlzX2VtcHR5OworfQorCisvKioKKyAqIGludGVsX2FsbG9jYXRvcl9nZXRfYWRkcmVzc19yYW5n ZToKKyAqIEBhbGxvY2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9yCisgKiBAc3Rh cnRwOiBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB3aGVyZSBmdW5jdGlvbiB3cml0ZXMgc3RhcnRp bmcgb2Zmc2V0CisgKiBAZW5kcDogcG9pbnRlciB0byB0aGUgdmFyaWFibGUgd2hlcmUgZnVuY3Rp b24gd3JpdGVzIGVuZGluZyBvZmZzZXQKKyAqCisgKiBGdW5jdGlvbiBmaWxscyBAc3RhcnRwLCBA ZW5kcCB3aXRoIHJlc3BlY3RpdmVseSwgc3RhcnRpbmcgYW5kIGVuZGluZyBvZmZzZXQKKyAqIG9m IHRoZSBhbGxvY2F0b3Igd29ya2luZyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgcmFuZ2UuCisgKgor ICogTm90ZS4gQWxsb2NhdG9ycyB3b3JraW5nIHJhbmdlcyBjYW4gZGlmZmVyIGRlcGVuZGluZyBv biB0aGUgZGV2aWNlIG9yCisgKiB0aGUgYWxsb2NhdG9yIHR5cGUgc28gYmVmb3JlIHJlc2Vydmlu ZyBhIHNwZWNpZmljIG9mZnNldCBhIGdvb2QgcHJhY3Rpc2UKKyAqIGlzIHRvIGVuc3VyZSB0aGF0 IGFkZHJlc3MgaXMgYmV0d2VlbiBhY2NlcHRlZCByYW5nZS4KKyAqLwordm9pZCBpbnRlbF9hbGxv Y2F0b3JfZ2V0X2FkZHJlc3NfcmFuZ2UodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkg ICAgICAgdWludDY0X3QgKnN0YXJ0cCwgdWludDY0X3QgKmVuZHApCit7CisJc3RydWN0IGFsbG9j X3JlcSByZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfQUREUkVTU19SQU5HRSwKKwkJCQkgLmFs bG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlIH07CisJc3RydWN0IGFsbG9jX3Jlc3Ag cmVzcDsKKworCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJlc3ApID09IDApOwor CWlndF9hc3NlcnQocmVzcC5yZXNwb25zZV90eXBlID09IFJFU1BfQUREUkVTU19SQU5HRSk7CisK KwlpZiAoc3RhcnRwKQorCQkqc3RhcnRwID0gcmVzcC5hZGRyZXNzX3JhbmdlLnN0YXJ0OworCisJ aWYgKGVuZHApCisJCSplbmRwID0gcmVzcC5hZGRyZXNzX3JhbmdlLmVuZDsKK30KKworLyoqCisg KiBpbnRlbF9hbGxvY2F0b3JfYWxsb2M6CisgKiBAYWxsb2NhdG9yX2hhbmRsZTogaGFuZGxlIHRv IGFuIGFsbG9jYXRvcgorICogQGhhbmRsZTogaGFuZGxlIHRvIGFuIG9iamVjdAorICogQHNpemU6 IHNpemUgb2YgYW4gb2JqZWN0CisgKiBAYWxpZ25tZW50OiBkZXRlcm1pbmVzIG9iamVjdCBhbGln bm1lbnQKKyAqCisgKiBGdW5jdGlvbiBmaW5kcyBhbmQgcmV0dXJucyB0aGUgbW9zdCBzdWl0YWJs ZSBvZmZzZXQgd2l0aCBnaXZlbiBAYWxpZ25tZW50CisgKiBmb3IgYW4gb2JqZWN0IHdpdGggQHNp emUgaWRlbnRpZmllZCBieSB0aGUgQGhhbmRsZS4KKyAqCisgKiBSZXR1cm5zOiBjdXJyZW50bHkg YXNzaWduZWQgYWRkcmVzcyBmb3IgYSBnaXZlbiBvYmplY3QuIElmIGFuIG9iamVjdCB3YXMKKyAq IGFscmVhZHkgYWxsb2NhdGVkIHJldHVybnMgc2FtZSBhZGRyZXNzLgorICovCit1aW50NjRfdCBp bnRlbF9hbGxvY2F0b3JfYWxsb2ModWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3Qg aGFuZGxlLAorCQkJICAgICAgIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCkKK3sK KwlzdHJ1Y3QgYWxsb2NfcmVxIHJlcSA9IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9BTExPQywKKwkJ CQkgLmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSAuYWxsb2MuaGFu ZGxlID0gaGFuZGxlLAorCQkJCSAuYWxsb2Muc2l6ZSA9IHNpemUsCisJCQkJIC5hbGxvYy5hbGln bm1lbnQgPSBhbGlnbm1lbnQgfTsKKwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwOworCisJaWd0X2Fz c2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCkgPT0gMCk7CisJaWd0X2Fzc2VydChyZXNw LnJlc3BvbnNlX3R5cGUgPT0gUkVTUF9BTExPQyk7CisKKwlyZXR1cm4gcmVzcC5hbGxvYy5vZmZz ZXQ7Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9yX2ZyZWU6CisgKiBAYWxsb2NhdG9yX2hh bmRsZTogaGFuZGxlIHRvIGFuIGFsbG9jYXRvcgorICogQGhhbmRsZTogaGFuZGxlIHRvIGFuIG9i amVjdCB0byBiZSBmcmVlZAorICoKKyAqIEZ1bmN0aW9uIGZyZWUgb2JqZWN0IGlkZW50aWZpZWQg YnkgdGhlIEBoYW5kbGUgaW4gYWxsb2NhdG9yIHdoYXQgbWFrZXMgaXQKKyAqIG9mZnNldCBhZ2Fp biBhbGxvY2FibGUuCisgKgorICogTm90ZS4gUmVzZXJ2ZWQgb2JqZWN0cyBjYW4gb25seSBiZSBm cmVlZCBieSBhbiAjaW50ZWxfYWxsb2NhdG9yX3VucmVzZXJ2ZQorICogZnVuY3Rpb24uCisgKgor ICogUmV0dXJuczogdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBzdWNjZXNzZnVsbHkgZnJlZWQsIG90 aGVyd2lzZSBmYWxzZS4KKyAqLworYm9vbCBpbnRlbF9hbGxvY2F0b3JfZnJlZSh1aW50NjRfdCBh bGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5kbGUpCit7CisJc3RydWN0IGFsbG9jX3JlcSBy ZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfRlJFRSwKKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUg PSBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSAuZnJlZS5oYW5kbGUgPSBoYW5kbGUgfTsKKwlzdHJ1 Y3QgYWxsb2NfcmVzcCByZXNwOworCisJaWd0X2Fzc2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAm cmVzcCkgPT0gMCk7CisJaWd0X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5cGUgPT0gUkVTUF9GUkVF KTsKKworCXJldHVybiByZXNwLmZyZWUuZnJlZWQ7Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2Nh dG9yX2lzX2FsbG9jYXRlZDoKKyAqIEBhbGxvY2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gYW4gYWxs b2NhdG9yCisgKiBAaGFuZGxlOiBoYW5kbGUgdG8gYW4gb2JqZWN0CisgKiBAc2l6ZTogc2l6ZSBv ZiBhbiBvYmplY3QKKyAqIEBvZmZzZXQ6IGFkZHJlc3Mgb2YgYW4gb2JqZWN0CisgKgorICogRnVu Y3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIG9iamVjdCBpZGVudGlmaWVkIGJ5IHRoZSBAaGFuZGxl IGFuZCBAc2l6ZQorICogaXMgYWxsb2NhdGVkIGF0IHRoZSBAb2Zmc2V0LgorICoKKyAqIFJldHVy bnM6IHRydWUgaWYgdGhlIG9iamVjdCBpcyBjdXJyZW50bHkgYWxsb2NhdGVkIGF0IHRoZSBAb2Zm c2V0LAorICogb3RoZXJ3aXNlIGZhbHNlLgorICovCitib29sIGludGVsX2FsbG9jYXRvcl9pc19h bGxvY2F0ZWQodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3QgaGFuZGxlLAorCQkJ CSAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0KQoreworCXN0cnVjdCBhbGxvY19yZXEg cmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX0lTX0FMTE9DQVRFRCwKKwkJCQkgLmFsbG9jYXRv cl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSAuaXNfYWxsb2NhdGVkLmhhbmRsZSA9 IGhhbmRsZSwKKwkJCQkgLmlzX2FsbG9jYXRlZC5zaXplID0gc2l6ZSwKKwkJCQkgLmlzX2FsbG9j YXRlZC5vZmZzZXQgPSBvZmZzZXQgfTsKKwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwOworCisJaWd0 X2Fzc2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCkgPT0gMCk7CisJaWd0X2Fzc2VydChy ZXNwLnJlc3BvbnNlX3R5cGUgPT0gUkVTUF9JU19BTExPQ0FURUQpOworCisJcmV0dXJuIHJlc3Au aXNfYWxsb2NhdGVkLmFsbG9jYXRlZDsKK30KKworLyoqCisgKiBpbnRlbF9hbGxvY2F0b3JfcmVz ZXJ2ZToKKyAqIEBhbGxvY2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9yCisgKiBA aGFuZGxlOiBoYW5kbGUgdG8gYW4gb2JqZWN0CisgKiBAc2l6ZTogc2l6ZSBvZiBhbiBvYmplY3QK KyAqIEBvZmZzZXQ6IGFkZHJlc3Mgb2YgYW4gb2JqZWN0CisgKgorICogRnVuY3Rpb24gcmVzZXJ2 ZXMgc3BhY2UgdGhhdCBzdGFydHMgYXQgdGhlIEBvZmZzZXQgYW5kIGhhcyBAc2l6ZS4KKyAqIE9w dGlvbmFsbHkgd2UgY2FuIHBhc3MgQGhhbmRsZSB0byBtYXJrIHRoYXQgc3BhY2UgaXMgZm9yIGEg c3BlY2lmaWMKKyAqIG9iamVjdCwgb3RoZXJ3aXNlIHBhc3MgLTEuCisgKgorICogTm90ZS4gUmVz ZXJ2ZWQgc3BhY2UgaXMgaWRlbnRpZmllZCBieSBvZmZzZXQgYW5kIHNpemUsIG5vdCBhIGhhbmRs ZS4KKyAqIFNvIGFuIG9iamVjdCBjYW4gaGF2ZSBtdWx0aXBsZSByZXNlcnZlZCBzcGFjZXMgd2l0 aCBpdHMgaGFuZGxlLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgc3BhY2UgaXMgc3VjY2Vzc2Z1 bGx5IHJlc2VydmVkLCBvdGhlcndpc2UgZmFsc2UuCisgKi8KK2Jvb2wgaW50ZWxfYWxsb2NhdG9y X3Jlc2VydmUodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3QgaGFuZGxlLAorCQkJ ICAgICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBvZmZzZXQpCit7CisJc3RydWN0IGFsbG9jX3Jl cSByZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfUkVTRVJWRSwKKwkJCQkgLmFsbG9jYXRvcl9o YW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSAucmVzZXJ2ZS5oYW5kbGUgPSBoYW5kbGUs CisJCQkJIC5yZXNlcnZlLnN0YXJ0ID0gb2Zmc2V0LAorCQkJCSAucmVzZXJ2ZS5lbmQgPSBvZmZz ZXQgKyBzaXplIH07CisJc3RydWN0IGFsbG9jX3Jlc3AgcmVzcDsKKworCWlndF9hc3NlcnQoaGFu ZGxlX3JlcXVlc3QoJnJlcSwgJnJlc3ApID09IDApOworCWlndF9hc3NlcnQocmVzcC5yZXNwb25z ZV90eXBlID09IFJFU1BfUkVTRVJWRSk7CisKKwlyZXR1cm4gcmVzcC5yZXNlcnZlLnJlc2VydmVk OworfQorCisvKioKKyAqIGludGVsX2FsbG9jYXRvcl91bnJlc2VydmU6CisgKiBAYWxsb2NhdG9y X2hhbmRsZTogaGFuZGxlIHRvIGFuIGFsbG9jYXRvcgorICogQGhhbmRsZTogaGFuZGxlIHRvIGFu IG9iamVjdAorICogQHNpemU6IHNpemUgb2YgYW4gb2JqZWN0CisgKiBAb2Zmc2V0OiBhZGRyZXNz IG9mIGFuIG9iamVjdAorICoKKyAqIEZ1bmN0aW9uIHVucmVzZXJ2ZXMgc3BhY2UgdGhhdCBzdGFy dHMgYXQgdGhlIEBvZmZzZXQsIEBzaXplIGFuZCBAaGFuZGxlLgorICoKKyAqIE5vdGUuIEBoYW5k bGUsIEBzaXplIGFuZCBAb2Zmc2V0IGhhdmUgdG8gbWF0Y2ggdGhvc2UgdXNlZCBpbiByZXNlcnZh dGlvbi4KKyAqIGkuZS4gY2hlY2sgd2l0aCB0aGUgc2FtZSBvZmZzZXQgYnV0IGV2ZW4gc21hbGxl ciBzaXplIHdpbGwgZmFpbC4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlmIHRoZSBzcGFjZSBpcyBz dWNjZXNzZnVsbHkgdW5yZXNlcnZlZCwgb3RoZXJ3aXNlIGZhbHNlLgorICovCitib29sIGludGVs X2FsbG9jYXRvcl91bnJlc2VydmUodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3Qg aGFuZGxlLAorCQkJICAgICAgIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCkKK3sKKwlz dHJ1Y3QgYWxsb2NfcmVxIHJlcSA9IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9VTlJFU0VSVkUsCisJ CQkJIC5hbGxvY2F0b3JfaGFuZGxlID0gYWxsb2NhdG9yX2hhbmRsZSwKKwkJCQkgLnVucmVzZXJ2 ZS5oYW5kbGUgPSBoYW5kbGUsCisJCQkJIC51bnJlc2VydmUuc3RhcnQgPSBvZmZzZXQsCisJCQkJ IC51bnJlc2VydmUuZW5kID0gb2Zmc2V0ICsgc2l6ZSB9OworCXN0cnVjdCBhbGxvY19yZXNwIHJl c3A7CisKKwlpZ3RfYXNzZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNwKSA9PSAwKTsKKwlp Z3RfYXNzZXJ0KHJlc3AucmVzcG9uc2VfdHlwZSA9PSBSRVNQX1VOUkVTRVJWRSk7CisKKwlyZXR1 cm4gcmVzcC51bnJlc2VydmUudW5yZXNlcnZlZDsKK30KKworLyoqCisgKiBpbnRlbF9hbGxvY2F0 b3JfaXNfcmVzZXJ2ZWQ6CisgKiBAYWxsb2NhdG9yX2hhbmRsZTogaGFuZGxlIHRvIGFuIGFsbG9j YXRvcgorICogQHNpemU6IHNpemUgb2YgYW4gb2JqZWN0CisgKiBAb2Zmc2V0OiBhZGRyZXNzIG9m IGFuIG9iamVjdAorICoKKyAqIEZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHNwYWNlIHN0YXJ0aW5n IGF0IHRoZSBAb2Zmc2V0IGFuZCBAc2l6ZSBpcworICogY3VycmVudGx5IHVuZGVyIHJlc2VydmF0 aW9uLgorICoKKyAqIE5vdGUuIEBzaXplIGFuZCBAb2Zmc2V0IGhhdmUgdG8gbWF0Y2ggdGhvc2Ug dXNlZCBpbiByZXNlcnZhdGlvbiwKKyAqIGkuZS4gY2hlY2sgd2l0aCB0aGUgc2FtZSBvZmZzZXQg YnV0IGV2ZW4gc21hbGxlciBzaXplIHdpbGwgZmFpbC4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlm IHNwYWNlIGlzIHJlc2VydmVkLCBvdGh3ZXJpc2UgZmFsc2UuCisgKi8KK2Jvb2wgaW50ZWxfYWxs b2NhdG9yX2lzX3Jlc2VydmVkKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsCisJCQkJIHVpbnQ2 NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJlcSA9IHsg LnJlcXVlc3RfdHlwZSA9IFJFUV9JU19SRVNFUlZFRCwKKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUg PSBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSAuaXNfcmVzZXJ2ZWQuc3RhcnQgPSBvZmZzZXQsCisJ CQkJIC5pc19yZXNlcnZlZC5lbmQgPSBvZmZzZXQgKyBzaXplIH07CisJc3RydWN0IGFsbG9jX3Jl c3AgcmVzcDsKKworCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJlc3ApID09IDAp OworCWlndF9hc3NlcnQocmVzcC5yZXNwb25zZV90eXBlID09IFJFU1BfSVNfUkVTRVJWRUQpOwor CisJcmV0dXJuIHJlc3AuaXNfcmVzZXJ2ZWQucmVzZXJ2ZWQ7Cit9CisKKy8qKgorICogaW50ZWxf YWxsb2NhdG9yX3Jlc2VydmVfaWZfbm90X2FsbG9jYXRlZDoKKyAqIEBhbGxvY2F0b3JfaGFuZGxl OiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9yCisgKiBAaGFuZGxlOiBoYW5kbGUgdG8gYW4gb2JqZWN0 CisgKiBAc2l6ZTogc2l6ZSBvZiBhbiBvYmplY3QKKyAqIEBvZmZzZXQ6IGFkZHJlc3Mgb2YgYW4g b2JqZWN0CisgKiBAaXNfYWxsb2NhdGVkcDogaWYgbm90IE5VTEwgZnVuY3Rpb24gd3JpdGVzIHRo ZXJlIG9iamVjdCBhbGxvY2F0aW9uIHN0YXR1cworICogKHRydWUvZmFsc2UpCisgKgorICogRnVu Y3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIG9iamVjdCBpZGVudGlmaWVkIGJ5IHRoZSBAaGFuZGxl IGFuZCBAc2l6ZQorICogaXMgYWxsb2NhdGVkIGF0IHRoZSBAb2Zmc2V0IGFuZCB3cml0ZXMgdGhl IHJlc3VsdCB0byBAaXNfYWxsb2NhdGVkcC4KKyAqIElmIGl0J3Mgbm90IGl0IHJlc2VydmVzIGl0 IGF0IHRoZSBnaXZlbiBAb2Zmc2V0LgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHNwYWNl IGZvciBhbiBvYmplY3Qgd2FzIHJlc2VydmVkLCBvdGhlcndpc2UgZmFsc2UuCisgKi8KK2Jvb2wg aW50ZWxfYWxsb2NhdG9yX3Jlc2VydmVfaWZfbm90X2FsbG9jYXRlZCh1aW50NjRfdCBhbGxvY2F0 b3JfaGFuZGxlLAorCQkJCQkgICAgICB1aW50MzJfdCBoYW5kbGUsCisJCQkJCSAgICAgIHVpbnQ2 NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCwKKwkJCQkJICAgICAgYm9vbCAqaXNfYWxsb2NhdGVk cCkKK3sKKwlzdHJ1Y3QgYWxsb2NfcmVxIHJlcSA9IHsgLnJlcXVlc3RfdHlwZSA9IFJFUV9SRVNF UlZFX0lGX05PVF9BTExPQ0FURUQsCisJCQkJIC5hbGxvY2F0b3JfaGFuZGxlID0gYWxsb2NhdG9y X2hhbmRsZSwKKwkJCQkgLnJlc2VydmUuaGFuZGxlID0gaGFuZGxlLAorCQkJCSAucmVzZXJ2ZS5z dGFydCA9IG9mZnNldCwKKwkJCQkgLnJlc2VydmUuZW5kID0gb2Zmc2V0ICsgc2l6ZSB9OworCXN0 cnVjdCBhbGxvY19yZXNwIHJlc3A7CisKKwlpZ3RfYXNzZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEs ICZyZXNwKSA9PSAwKTsKKwlpZ3RfYXNzZXJ0KHJlc3AucmVzcG9uc2VfdHlwZSA9PSBSRVNQX1JF U0VSVkVfSUZfTk9UX0FMTE9DQVRFRCk7CisKKwlpZiAoaXNfYWxsb2NhdGVkcCkKKwkJKmlzX2Fs bG9jYXRlZHAgPSByZXNwLnJlc2VydmVfaWZfbm90X2FsbG9jYXRlZC5hbGxvY2F0ZWQ7CisKKwly ZXR1cm4gcmVzcC5yZXNlcnZlX2lmX25vdF9hbGxvY2F0ZWQucmVzZXJ2ZWQ7Cit9CisKKy8qKgor ICogaW50ZWxfYWxsb2NhdG9yX3ByaW50OgorICogQGFsbG9jYXRvcl9oYW5kbGU6IGhhbmRsZSB0 byBhbiBhbGxvY2F0b3IKKyAqCisgKiBGdW5jdGlvbiBwcmludHMgc3RhdGlzdGljcyBhbmQgY29u dGVudCBvZiB0aGUgYWxsb2NhdG9yLgorICogTWFpbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMu CisgKgorICogTm90ZS4gUHJpbnRpbmcgcG9zc2libGUgb25seSBpbiB0aGUgbWFpbiBwcm9jZXNz LgorICoqLwordm9pZCBpbnRlbF9hbGxvY2F0b3JfcHJpbnQodWludDY0X3QgYWxsb2NhdG9yX2hh bmRsZSkKK3sKKwlib29sIHNhbWVfcHJvY2VzczsKKworCWlndF9hc3NlcnQoYWxsb2NhdG9yX2hh bmRsZSk7CisKKwlzYW1lX3Byb2Nlc3MgPSBjaGlsZF9waWQgPT0gLTE7CisKKwlpZiAoIW11bHRp cHJvY2VzcyB8fCBzYW1lX3Byb2Nlc3MpIHsKKwkJc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFs ID0gZnJvbV91c2VyX3BvaW50ZXIoYWxsb2NhdG9yX2hhbmRsZSk7CisJCXB0aHJlYWRfbXV0ZXhf bG9jaygmbWFwX211dGV4KTsKKwkJaWFsLT5wcmludChpYWwsIHRydWUpOworCQlwdGhyZWFkX211 dGV4X3VubG9jaygmbWFwX211dGV4KTsKKwl9IGVsc2UgeworCQlpZ3Rfd2FybigiUHJpbnQgc3Rh dHMgaXMgaW4gbWFpbiBwcm9jZXNzIG9ubHlcbiIpOworCX0KK30KKworc3RhdGljIGJvb2wgZXF1 YWxfYWxsb2NhdG9ycyhjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyKQoreworCWNv bnN0IHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmExID0ga2V5MSwgKmEyID0ga2V5MjsKKworCWFs bG9jX2RlYnVnKCJhMTogPGZkOiAlZCwgY3R4OiAldT4sIGEyIDxmZDogJWQsIGN0eDogJXU+XG4i LAorCQkgICBhMS0+ZmQsIGExLT5jdHgsIGEyLT5mZCwgYTItPmN0eCk7CisKKwlyZXR1cm4gYTEt PmZkID09IGEyLT5mZCAmJiBhMS0+Y3R4ID09IGEyLT5jdHg7Cit9CisKKy8qICAyXjYzICsgMl42 MSAtIDJeNTcgKyAyXjU0IC0gMl41MSAtIDJeMTggKyAxICovCisjZGVmaW5lIEdPTERFTl9SQVRJ T19QUklNRV82NCAweDllMzdmZmZmZmZmYzAwMDFVTAorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90 IGhhc2hfYWxsb2NhdG9ycyhjb25zdCB2b2lkICp2YWwsIHVuc2lnbmVkIGludCBiaXRzKQorewor CXVpbnQ2NF90IGhhc2ggPSAoKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKikgdmFsKS0+ZmQ7CisK KwloYXNoID0gaGFzaCAqIEdPTERFTl9SQVRJT19QUklNRV82NDsKKwlyZXR1cm4gaGFzaCA+PiAo NjQgLSBiaXRzKTsKK30KKworc3RhdGljIHZvaWQgX19mcmVlX2FsbG9jYXRvcnModm9pZCkKK3sK KwlzdHJ1Y3QgaWd0X21hcF9lbnRyeSAqcG9zOworCXN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlh bDsKKwlpbnQgaTsKKworCWlmIChhbGxvY2F0b3JzX21hcCkgeworCQlpZ3RfbWFwX2Zvcl9lYWNo KGFsbG9jYXRvcnNfbWFwLCBpLCBwb3MpIHsKKwkJCWlhbCA9IHBvcy0+dmFsdWU7CisJCQlpYWwt PmRlc3Ryb3koaWFsKTsKKwkJfQorCX0KKworCWlndF9tYXBfZnJlZShhbGxvY2F0b3JzX21hcCk7 Cit9CisKKy8qKgorICogaW50ZWxfYWxsb2NhdG9yX2luaXQ6CisgKgorICogRnVuY3Rpb24gaW5p dGlhbGl6ZXMgdGhlIGFsbG9jYXRvcnMgaW5mcmFzdHJ1Y3R1cmUuIFRoZSBzZWNvbmQgY2FsbCB3 aWxsCisgKiBvdmVycmlkZSBjdXJyZW50IGluZnJhIGFuZCBkZXN0cm95IGV4aXN0aW5nIHRoZXJl IGFsbG9jYXRvcnMuIEl0IGlzIGNhbGxlZAorICogaW4gaWd0X2NvbnN0cnVjdG9yLgorICoqLwor dm9pZCBpbnRlbF9hbGxvY2F0b3JfaW5pdCh2b2lkKQoreworCWFsbG9jX2luZm8oIlByZXBhcmUg YW4gYWxsb2NhdG9yIGluZnJhc3RydWN0dXJlXG4iKTsKKworCWFsbG9jYXRvcl9waWQgPSBnZXRw aWQoKTsKKwlhbGxvY19pbmZvKCJBbGxvY2F0b3IgcGlkOiAlbGRcbiIsIChsb25nKSBhbGxvY2F0 b3JfcGlkKTsKKworCWlmIChhbGxvY2F0b3JzX21hcCkgeworCQlfX2ZyZWVfYWxsb2NhdG9ycygp OworCQlmcmVlKGFsbG9jYXRvcnNfbWFwKTsKKwl9CisKKwlhbGxvY2F0b3JzX21hcCA9IGNhbGxv YyhzaXplb2YoKmFsbG9jYXRvcnNfbWFwKSwgMSk7CisJaWd0X2Fzc2VydChhbGxvY2F0b3JzX21h cCk7CisKKwlpZ3RfbWFwX2luaXQoYWxsb2NhdG9yc19tYXAsIGVxdWFsX2FsbG9jYXRvcnMsIGhh c2hfYWxsb2NhdG9ycywgOCk7CisKKwljaGFubmVsID0gaW50ZWxfYWxsb2NhdG9yX2dldF9tc2dj aGFubmVsKENIQU5ORUxfU1lTVklQQ19NU0dRVUVVRSk7Cit9CisKK2lndF9jb25zdHJ1Y3RvciB7 CisJaW50ZWxfYWxsb2NhdG9yX2luaXQoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9pbnRlbF9hbGxv Y2F0b3IuaCBiL2xpYi9pbnRlbF9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMC4uMDY1NGIzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaW50ZWxfYWxsb2Nh dG9yLmgKQEAgLTAsMCArMSwxMzYgQEAKKyNpZm5kZWYgX19JTlRFTF9BTExPQ0FUT1JfSF9fCisj ZGVmaW5lIF9fSU5URUxfQUxMT0NBVE9SX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5j bHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRpbnQu aD4KKyNpbmNsdWRlIDxzdGRhdG9taWMuaD4KKworLyoqCisgKiBTRUNUSU9OOmludGVsX2FsbG9j YXRvcgorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBpZ3QgaW1wbGVtZW50YXRpb24gb2YgYWxsb2Nh dG9yCisgKiBAdGl0bGU6IEludGVsIGFsbG9jYXRvcgorICogQGluY2x1ZGU6IGludGVsX2FsbG9j YXRvci5oCisgKgorICogIyBJbnRlbCBhbGxvY2F0b3IKKyAqCisgKiBTaW5jZSBHUFUgZGV2aWNl cyBkcml2ZXIgaGFzIGFiYW5kb25lZCByZWxvY2F0aW9ucyBmb3IgbmV3ZXIgZ2VuZXJhdGlvbnMs CisgKiB3ZSBhcmUgZmFjaW5nIHRoZSBuZWVkIHRvIG1hbmFnZSBhZGRyZXNzZXMgaW4gdXNlcnNw YWNlLiBJbnRlbCBhbGxvY2F0b3IKKyAqIHN1cHBseSBvdXQgb2YgdGhlIGJveCBtZWNoYW5pc21z IHByb3ZpZGluZyBjb3JyZWN0IHZpcnR1YWwgYWRkcmVzc2VzLgorICogU3BlY2lmaWNhbGx5LCBp bnRlbF9hbGxvY2F0b3IgaXMgYSBtdWx0aS10aHJlYWRpbmcgaW5mcmFzdHJ1Y3R1cmUgd3JhcHBp bmcKKyAqIGEgcHJvcGVyIHNpbmdsZS10aHJlYWQgYWxsb2NhdG9yLCB0aGF0IGNhbiBiZSB0aGUg b25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKgorICogICogSU5URUxfQUxMT0NBVE9SX1NJTVBMRSAt IHBvcnRlZCBmcm9tIE1lc2EsIGxpc3QtYmFzZWQsIHNpbXBsZSBhbGxvY2F0b3IKKyAqICAqIElO VEVMX0FMTE9DQVRPUl9SQU5ET00gLSBzdGF0ZWxlc3MgYWxsb2NhdG9yLCB0aGF0IHByb3ZpZGVz IHJhbmRvbSBhZGRyZXNzZXMKKyAqICAoc29tZXRpbWUgaW4gdGhlIGZ1dHVyZSB0aGUgbGlzdCBj YW4gZ3JvdykKKyAqCisgKiBVc2FnZSBleGFtcGxlOgorICoKKyAqIHxbPCEtLSBsYW5ndWFnZT0i YyIgLS0+CisgKiBzdHJ1Y3Qgb2JqZWN0IHsKKyAqIAl1aW50MzJfdCBoYW5kbGU7CisgKiAJdWlu dDY0X3Qgb2Zmc2V0OworICogCXVpbnQ2NF90IHNpemU7CisgKiB9OworICoKKyAqIHN0cnVjdCBv YmplY3Qgb2JqMSwgb2JqMjsKKyAqIHVpbnQ2NF90IGFobmQsIHN0YXJ0cCwgZW5kcDsKKyAqIGlu dCBmZCA9IC0xOworICoKKyAqIGZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7Cisg KiBhaG5kID0gaW50ZWxfYWxsb2NhdG9yX29wZW4oZmQsIDAsIElOVEVMX0FMTE9DQVRPUl9TSU1Q TEUpOworICoKKyAqIG9iajEuaGFuZGxlID0gZ2VtX2NyZWF0ZSg0MDk2KTsKKyAqIG9iajIuaGFu ZGxlID0gZ2VtX2NyZWF0ZSg0MDk2KTsKKyAqCisgKiAvLyBSZXNlcnZlIGhvbGUgZm9yIGFuIG9i amVjdCBpbiBnaXZlbiBhZGRyZXNzLgorICogLy8gSW4gdGhpcyBleGFtcGxlIHRoZSBmaXJzdCBw b3NzaWJsZSBhZGRyZXNzLgorICogaW50ZWxfYWxsb2NhdG9yX2dldF9hZGRyZXNzX3JhbmdlKGFo bmQsICZzdGFydHAsICZlbmRwKTsKKyAqIG9iajEub2Zmc2V0ID0gc3RhcnRwOworICogaWd0X2Fz c2VydChpbnRlbF9hbGxvY2F0b3JfcmVzZXJ2ZShhaG5kLCBvYmoxLmhhbmRsZSwgNDA5Niwgc3Rh cnRwKSk7CisgKgorICogLy8gR2V0IHRoZSBtb3N0IHN1aXRhYmxlIG9mZnNldCBmb3IgdGhlIG9i amVjdC4gUHJlZmVyZWQgd2F5LgorICogb2JqMi5vZmZzZXQgPSBpbnRlbF9hbGxvY2F0b3JfYWxs b2MoYWhuZCwgb2JqMi5oYW5kbGUsIDQwOTYsIDEgPDwgMTMpOworICoKKyAqICAuLi4KKyAqCisg KiAvLyBSZXNlcnZlZCBhZGRyZXNzZXMgY2FuIGJlIG9ubHkgZnJlZWQgYnkgdW5yZXNlcnZlLgor ICogaW50ZWxfYWxsb2NhdG9yX3VucmVzZXJ2ZShhaG5kLCBvYmoxLmhhbmRsZSwgNDA5Niwgb2Jq MS5vZmZzZXQpOworICogaW50ZWxfYWxsb2NhdG9yX2ZyZWUoYWhuZCwgb2JqMi5oYW5kbGUpOwor ICoKKyAqIGdlbV9jbG9zZShvYmoxLmhhbmRsZSk7CisgKiBnZW1fY2xvc2Uob2JqMi5oYW5kbGUp OworICogXXwKKyAqCisgKi8KKworc3RydWN0IGludGVsX2FsbG9jYXRvciB7CisJaW50IGZkOwor CXVpbnQzMl90IGN0eDsKKwl1aW50OF90IHR5cGU7CisJX0F0b21pYyhpbnQzMl90KSByZWZjb3Vu dDsKKwlwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisKKwkvKiBhbGxvY2F0b3IncyBwcml2YXRlIHN0 cnVjdHVyZSAqLworCXZvaWQgKnByaXY7CisKKwl2b2lkICgqZ2V0X2FkZHJlc3NfcmFuZ2UpKHN0 cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwKKwkJCQkgIHVpbnQ2NF90ICpzdGFydHAsIHVpbnQ2 NF90ICplbmRwKTsKKwl1aW50NjRfdCAoKmFsbG9jKShzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICpp YWwsIHVpbnQzMl90IGhhbmRsZSwKKwkJCSAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3QgYWxpZ25t ZW50KTsKKwlib29sICgqaXNfYWxsb2NhdGVkKSAoc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFs LCB1aW50MzJfdCBoYW5kbGUsCisJCQkgICAgICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhbGln bm1lbnQpOworCWJvb2wgKCpyZXNlcnZlKShzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwsCisJ CQl1aW50MzJfdCBoYW5kbGUsIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplKTsKKwlib29s ICgqdW5yZXNlcnZlKShzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwsCisJCQkgIHVpbnQzMl90 IGhhbmRsZSwgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IHNpemUpOworCWJvb2wgKCppc19yZXNl cnZlZCkgKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwKKwkJCSAgICAgdWludDY0X3Qgc3Rh cnQsIHVpbnQ2NF90IHNpemUpOworCWJvb2wgKCpmcmVlKShzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9y ICppYWwsIHVpbnQzMl90IGhhbmRsZSk7CisKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGludGVs X2FsbG9jYXRvciAqaWFsKTsKKworCWJvb2wgKCppc19lbXB0eSkoc3RydWN0IGludGVsX2FsbG9j YXRvciAqaWFsKTsKKworCXZvaWQgKCpwcmludCkoc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFs LCBib29sIGZ1bGwpOworfTsKKwordm9pZCBpbnRlbF9hbGxvY2F0b3JfaW5pdCh2b2lkKTsKK3Zv aWQgaW50ZWxfYWxsb2NhdG9yX211bHRpcHJvY2Vzc19zdGFydCh2b2lkKTsKK3ZvaWQgaW50ZWxf YWxsb2NhdG9yX211bHRpcHJvY2Vzc19zdG9wKHZvaWQpOworCit1aW50NjRfdCBpbnRlbF9hbGxv Y2F0b3Jfb3BlbihpbnQgZmQsIHVpbnQzMl90IGN0eCwgdWludDhfdCBhbGxvY2F0b3JfdHlwZSk7 Citib29sIGludGVsX2FsbG9jYXRvcl9jbG9zZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlKTsK K3ZvaWQgaW50ZWxfYWxsb2NhdG9yX2dldF9hZGRyZXNzX3JhbmdlKHVpbnQ2NF90IGFsbG9jYXRv cl9oYW5kbGUsCisJCQkJICAgICAgIHVpbnQ2NF90ICpzdGFydHAsIHVpbnQ2NF90ICplbmRwKTsK K3VpbnQ2NF90IGludGVsX2FsbG9jYXRvcl9hbGxvYyh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxl LCB1aW50MzJfdCBoYW5kbGUsCisJCQkgICAgICAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3QgYWxp Z25tZW50KTsKK2Jvb2wgaW50ZWxfYWxsb2NhdG9yX2ZyZWUodWludDY0X3QgYWxsb2NhdG9yX2hh bmRsZSwgdWludDMyX3QgaGFuZGxlKTsKK2Jvb2wgaW50ZWxfYWxsb2NhdG9yX2lzX2FsbG9jYXRl ZCh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5kbGUsCisJCQkJICB1aW50 NjRfdCBzaXplLCB1aW50NjRfdCBvZmZzZXQpOworYm9vbCBpbnRlbF9hbGxvY2F0b3JfcmVzZXJ2 ZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLCB1aW50MzJfdCBoYW5kbGUsCisJCQkgICAgIHVp bnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCk7Citib29sIGludGVsX2FsbG9jYXRvcl91bnJl c2VydmUodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3QgaGFuZGxlLAorCQkJICAg ICAgIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCk7Citib29sIGludGVsX2FsbG9jYXRv cl9pc19yZXNlcnZlZCh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLAorCQkJCSB1aW50NjRfdCBz aXplLCB1aW50NjRfdCBvZmZzZXQpOworYm9vbCBpbnRlbF9hbGxvY2F0b3JfcmVzZXJ2ZV9pZl9u b3RfYWxsb2NhdGVkKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsCisJCQkJCSAgICAgIHVpbnQz Ml90IGhhbmRsZSwKKwkJCQkJICAgICAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0LAor CQkJCQkgICAgICBib29sICppc19hbGxvY2F0ZWRwKTsKKwordm9pZCBpbnRlbF9hbGxvY2F0b3Jf cHJpbnQodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSk7CisKKyNkZWZpbmUgSU5URUxfQUxMT0NB VE9SX05PTkUgICAwCisjZGVmaW5lIElOVEVMX0FMTE9DQVRPUl9SQU5ET00gMQorI2RlZmluZSBJ TlRFTF9BTExPQ0FUT1JfU0lNUExFIDIKKworc3RhdGljIGlubGluZSB1aW50NjRfdCBDQU5PTklD QUwodWludDY0X3QgYWRkcmVzcykKK3sKKwlyZXR1cm4gKGludDY0X3QpKGFkZHJlc3MgPDwgMTYp ID4+IDE2OworfQorCisjZGVmaW5lIERFQ0FOT05JQ0FMKG9mZnNldCkgKG9mZnNldCAmICgoMXVs bCA8PCA0OCkgLSAxKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvaW50ZWxfYWxsb2NhdG9y X21zZ2NoYW5uZWwuYyBiL2xpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4wODRhOTc3ZAotLS0gL2Rldi9udWxsCisrKyBi L2xpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5jCkBAIC0wLDAgKzEsMTgyIEBACisjaW5j bHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9t c2cuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVk ZSAiaWd0LmgiCisjaW5jbHVkZSAiaW50ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwuaCIKKworZXh0 ZXJuIF9fdGhyZWFkIHBpZF90IGNoaWxkX3RpZDsKKworLyogLS0tLS0gU1lTVklQQyBNU0dRVUVV RSAtLS0tLSAqLworCisjZGVmaW5lIEZUT0tfSUdUX0FMTE9DQVRPUl9LRVkgIi90bXAvaWd0LmFs bG9jYXRvci5rZXkiCisjZGVmaW5lIEZUT0tfSUdUX0FMTE9DQVRPUl9QUk9KSUQgMjAyMAorCisj ZGVmaW5lIEFMTE9DQVRPUl9SRVFVRVNUIDEKKworc3RydWN0IG1zZ3F1ZXVlX2RhdGEgeworCWtl eV90IGtleTsKKwlpbnQgcXVldWU7Cit9OworCitzdHJ1Y3QgbXNncXVldWVfYnVmIHsKKyAgICAg ICBsb25nIG10eXBlOworICAgICAgIHVuaW9uIHsKKwkgICAgICAgc3RydWN0IGFsbG9jX3JlcSBy ZXF1ZXN0OworCSAgICAgICBzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwb25zZTsKKyAgICAgICB9IGRh dGE7Cit9OworCitzdGF0aWMgdm9pZCBtc2dxdWV1ZV9pbml0KHN0cnVjdCBtc2dfY2hhbm5lbCAq Y2hhbm5lbCkKK3sKKwlzdHJ1Y3QgbXNncXVldWVfZGF0YSAqbXNnZGF0YTsKKwlzdHJ1Y3QgbXNx aWRfZHMgcXN0YXQ7CisJa2V5X3Qga2V5OworCWludCBmZCwgcXVldWU7CisKKwlpZ3RfZGVidWco IkluaXQgbXNncXVldWVcbiIpOworCisJLyogQ3JlYXRlIGZ0b2sga2V5IG9ubHkgaWYgbm90IGV4 aXN0cyAqLworCWZkID0gb3BlbihGVE9LX0lHVF9BTExPQ0FUT1JfS0VZLCBPX0NSRUFUIHwgT19F WENMIHwgT19XUk9OTFksIDA2MDApOworCWlndF9hc3NlcnQoZmQgPj0gMCB8fCBlcnJubyA9PSBF RVhJU1QpOworCWlmIChmZCA+PSAwKQorCQljbG9zZShmZCk7CisKKwlrZXkgPSBmdG9rKEZUT0tf SUdUX0FMTE9DQVRPUl9LRVksIEZUT0tfSUdUX0FMTE9DQVRPUl9QUk9KSUQpOworCWlndF9hc3Nl cnQoa2V5ICE9IC0xKTsKKwlpZ3RfZGVidWcoIlF1ZXVlIGtleTogJXhcbiIsIChpbnQpIGtleSk7 CisKKwlxdWV1ZSA9IG1zZ2dldChrZXksIDApOworCWlmIChxdWV1ZSAhPSAtMSkgeworCQlpZ3Rf YXNzZXJ0KG1zZ2N0bChxdWV1ZSwgSVBDX1NUQVQsICZxc3RhdCkgPT0gMCk7CisJCWlndF9kZWJ1 Zygib2xkIG1lc3NhZ2VzOiAlbHVcbiIsIHFzdGF0Lm1zZ19xbnVtKTsKKwkJaWd0X2Fzc2VydCht c2djdGwocXVldWUsIElQQ19STUlELCBOVUxMKSA9PSAwKTsKKwl9CisKKwlxdWV1ZSA9IG1zZ2dl dChrZXksIElQQ19DUkVBVCk7CisJaWd0X2RlYnVnKCJtc2cgcXVldWU6ICVkXG4iLCBxdWV1ZSk7 CisKKwltc2dkYXRhID0gY2FsbG9jKDEsIHNpemVvZigqbXNnZGF0YSkpOworCWlndF9hc3NlcnQo bXNnZGF0YSk7CisJbXNnZGF0YS0+a2V5ID0ga2V5OworCW1zZ2RhdGEtPnF1ZXVlID0gcXVldWU7 CisJY2hhbm5lbC0+cHJpdiA9IG1zZ2RhdGE7Cit9CisKK3N0YXRpYyB2b2lkIG1zZ3F1ZXVlX2Rl aW5pdChzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2Rh dGEgKm1zZ2RhdGEgPSBjaGFubmVsLT5wcml2OworCisJaWd0X2RlYnVnKCJEZWluaXQgbXNncXVl dWVcbiIpOworCW1zZ2N0bChtc2dkYXRhLT5xdWV1ZSwgSVBDX1JNSUQsIE5VTEwpOworCWZyZWUo Y2hhbm5lbC0+cHJpdik7Cit9CisKK3N0YXRpYyBpbnQgbXNncXVldWVfc2VuZF9yZXEoc3RydWN0 IG1zZ19jaGFubmVsICpjaGFubmVsLAorCQkJICAgICBzdHJ1Y3QgYWxsb2NfcmVxICpyZXF1ZXN0 KQoreworCXN0cnVjdCBtc2dxdWV1ZV9kYXRhICptc2dkYXRhID0gY2hhbm5lbC0+cHJpdjsKKwlz dHJ1Y3QgbXNncXVldWVfYnVmIGJ1ZiA9IHswfTsKKwlpbnQgcmV0OworCisJYnVmLm10eXBlID0g QUxMT0NBVE9SX1JFUVVFU1Q7CisJYnVmLmRhdGEucmVxdWVzdC5yZXF1ZXN0X3R5cGUgPSAxOwor CW1lbWNweSgmYnVmLmRhdGEucmVxdWVzdCwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSk7CisK K3JldHJ5OgorCXJldCA9IG1zZ3NuZChtc2dkYXRhLT5xdWV1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1Zikg LSBzaXplb2YobG9uZyksIDApOworCWlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJ CWdvdG8gcmV0cnk7CisKKwlpZiAocmV0ID09IC0xKQorCQlpZ3Rfd2FybigiRXJyb3I6ICVzXG4i LCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc2dx dWV1ZV9yZWN2X3JlcShzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkgICAgIHN0cnVj dCBhbGxvY19yZXEgKnJlcXVlc3QpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2RhdGEgKm1zZ2RhdGEg PSBjaGFubmVsLT5wcml2OworCXN0cnVjdCBtc2dxdWV1ZV9idWYgYnVmID0gezB9OworCWludCBy ZXQsIHNpemUgPSBzaXplb2YoYnVmKSAtIHNpemVvZihsb25nKTsKKworcmV0cnk6CisJcmV0ID0g bXNncmN2KG1zZ2RhdGEtPnF1ZXVlLCAmYnVmLCBzaXplLCBBTExPQ0FUT1JfUkVRVUVTVCwgMCk7 CisJaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKwkJZ290byByZXRyeTsKKworCWlm IChyZXQgPT0gc2l6ZSkKKwkJbWVtY3B5KHJlcXVlc3QsICZidWYuZGF0YS5yZXF1ZXN0LCBzaXpl b2YoKnJlcXVlc3QpKTsKKwllbHNlIGlmIChyZXQgPT0gLTEpCisJCWlndF93YXJuKCJFcnJvcjog JXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IG1zZ3F1ZXVlX3NlbmRfcmVzcChzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkgICAg ICBzdHJ1Y3QgYWxsb2NfcmVzcCAqcmVzcG9uc2UpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2RhdGEg Km1zZ2RhdGEgPSBjaGFubmVsLT5wcml2OworCXN0cnVjdCBtc2dxdWV1ZV9idWYgYnVmID0gezB9 OworCWludCByZXQ7CisKKwlidWYubXR5cGUgPSByZXNwb25zZS0+dGlkOworCW1lbWNweSgmYnVm LmRhdGEucmVzcG9uc2UsIHJlc3BvbnNlLCBzaXplb2YoKnJlc3BvbnNlKSk7CisKK3JldHJ5Ogor CXJldCA9IG1zZ3NuZChtc2dkYXRhLT5xdWV1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikgLSBzaXplb2Yo bG9uZyksIDApOworCWlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJCWdvdG8gcmV0 cnk7CisKKwlpZiAocmV0ID09IC0xKQorCQlpZ3Rfd2FybigiRXJyb3I6ICVzXG4iLCBzdHJlcnJv cihlcnJubykpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc2dxdWV1ZV9yZWN2 X3Jlc3Aoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsLAorCQkJICAgICAgc3RydWN0IGFsbG9j X3Jlc3AgKnJlc3BvbnNlKQoreworCXN0cnVjdCBtc2dxdWV1ZV9kYXRhICptc2dkYXRhID0gY2hh bm5lbC0+cHJpdjsKKwlzdHJ1Y3QgbXNncXVldWVfYnVmIGJ1ZiA9IHswfTsKKwlpbnQgcmV0LCBz aXplID0gc2l6ZW9mKGJ1ZikgLSBzaXplb2YobG9uZyk7CisKK3JldHJ5OgorCXJldCA9IG1zZ3Jj dihtc2dkYXRhLT5xdWV1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikgLSBzaXplb2YobG9uZyksCisJCSAg ICAgcmVzcG9uc2UtPnRpZCwgMCk7CisJaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikK KwkJZ290byByZXRyeTsKKworCWlmIChyZXQgPT0gc2l6ZSkKKwkJbWVtY3B5KHJlc3BvbnNlLCAm YnVmLmRhdGEucmVzcG9uc2UsIHNpemVvZigqcmVzcG9uc2UpKTsKKwllbHNlIGlmIChyZXQgPT0g LTEpCisJCWlndF93YXJuKCJFcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG1zZ19jaGFubmVsIG1zZ3F1ZXVlX2NoYW5uZWwg PSB7CisJLnByaXYgPSBOVUxMLAorCS5pbml0ID0gbXNncXVldWVfaW5pdCwKKwkuZGVpbml0ID0g bXNncXVldWVfZGVpbml0LAorCS5zZW5kX3JlcSA9IG1zZ3F1ZXVlX3NlbmRfcmVxLAorCS5yZWN2 X3JlcSA9IG1zZ3F1ZXVlX3JlY3ZfcmVxLAorCS5zZW5kX3Jlc3AgPSBtc2dxdWV1ZV9zZW5kX3Jl c3AsCisJLnJlY3ZfcmVzcCA9IG1zZ3F1ZXVlX3JlY3ZfcmVzcCwKK307CisKK3N0cnVjdCBtc2df Y2hhbm5lbCAqaW50ZWxfYWxsb2NhdG9yX2dldF9tc2djaGFubmVsKGVudW0gbXNnX2NoYW5uZWxf dHlwZSB0eXBlKQoreworCXN0cnVjdCBtc2dfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisKKwlz d2l0Y2ggKHR5cGUpIHsKKwljYXNlIENIQU5ORUxfU1lTVklQQ19NU0dRVUVVRToKKwkJY2hhbm5l bCA9ICZtc2dxdWV1ZV9jaGFubmVsOworCX0KKworCWlndF9hc3NlcnQoY2hhbm5lbCk7CisKKwly ZXR1cm4gY2hhbm5lbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hh bm5lbC5oIGIvbGliL2ludGVsX2FsbG9jYXRvcl9tc2djaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAuLmFiNDZkOWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2lu dGVsX2FsbG9jYXRvcl9tc2djaGFubmVsLmgKQEAgLTAsMCArMSwxNDAgQEAKKyNpZm5kZWYgX19J TlRFTF9BTExPQ0FUT1JfTVNHQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19JTlRFTF9BTExPQ0FUT1Jf TVNHQ0hBTk5FTF9IX18KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0 ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitlbnVtIHJlcXR5cGUgeworCVJFUV9TVE9QLAor CVJFUV9PUEVOLAorCVJFUV9DTE9TRSwKKwlSRVFfQUREUkVTU19SQU5HRSwKKwlSRVFfQUxMT0Ms CisJUkVRX0ZSRUUsCisJUkVRX0lTX0FMTE9DQVRFRCwKKwlSRVFfUkVTRVJWRSwKKwlSRVFfVU5S RVNFUlZFLAorCVJFUV9SRVNFUlZFX0lGX05PVF9BTExPQ0FURUQsCisJUkVRX0lTX1JFU0VSVkVE LAorfTsKKworZW51bSByZXNwdHlwZSB7CisJUkVTUF9PUEVOLAorCVJFU1BfQ0xPU0UsCisJUkVT UF9BRERSRVNTX1JBTkdFLAorCVJFU1BfQUxMT0MsCisJUkVTUF9GUkVFLAorCVJFU1BfSVNfQUxM T0NBVEVELAorCVJFU1BfUkVTRVJWRSwKKwlSRVNQX1VOUkVTRVJWRSwKKwlSRVNQX0lTX1JFU0VS VkVELAorCVJFU1BfUkVTRVJWRV9JRl9OT1RfQUxMT0NBVEVELAorfTsKKworc3RydWN0IGFsbG9j X3JlcSB7CisJZW51bSByZXF0eXBlIHJlcXVlc3RfdHlwZTsKKworCS8qIENvbW1vbiAqLworCXBp ZF90IHRpZDsKKwl1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlOworCisJdW5pb24geworCQlzdHJ1 Y3QgeworCQkJaW50IGZkOworCQkJdWludDMyX3QgY3R4OworCQkJdWludDhfdCBhbGxvY2F0b3Jf dHlwZTsKKwkJfSBvcGVuOworCisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCBoYW5kbGU7CisJCQl1 aW50NjRfdCBzaXplOworCQkJdWludDY0X3QgYWxpZ25tZW50OworCQl9IGFsbG9jOworCisJCXN0 cnVjdCB7CisJCQl1aW50MzJfdCBoYW5kbGU7CisJCX0gZnJlZTsKKworCQlzdHJ1Y3QgeworCQkJ dWludDMyX3QgaGFuZGxlOworCQkJdWludDY0X3Qgc2l6ZTsKKwkJCXVpbnQ2NF90IG9mZnNldDsK KwkJfSBpc19hbGxvY2F0ZWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQzMl90IGhhbmRsZTsKKwkJ CXVpbnQ2NF90IHN0YXJ0OworCQkJdWludDY0X3QgZW5kOworCQl9IHJlc2VydmUsIHVucmVzZXJ2 ZTsKKworCQlzdHJ1Y3QgeworCQkJdWludDY0X3Qgc3RhcnQ7CisJCQl1aW50NjRfdCBlbmQ7CisJ CX0gaXNfcmVzZXJ2ZWQ7CisKKwl9OworfTsKKworc3RydWN0IGFsbG9jX3Jlc3AgeworCWVudW0g cmVzcHR5cGUgcmVzcG9uc2VfdHlwZTsKKwlwaWRfdCB0aWQ7CisKKwl1bmlvbiB7CisJCXN0cnVj dCB7CisJCQl1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlOworCQl9IG9wZW47CisKKwkJc3RydWN0 IHsKKwkJCWJvb2wgaXNfZW1wdHk7CisJCX0gY2xvc2U7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ2 NF90IHN0YXJ0OworCQkJdWludDY0X3QgZW5kOworCQl9IGFkZHJlc3NfcmFuZ2U7CisKKwkJc3Ry dWN0IHsKKwkJCXVpbnQ2NF90IG9mZnNldDsKKwkJfSBhbGxvYzsKKworCQlzdHJ1Y3QgeworCQkJ Ym9vbCBmcmVlZDsKKwkJfSBmcmVlOworCisJCXN0cnVjdCB7CisJCQlib29sIGFsbG9jYXRlZDsK KwkJfSBpc19hbGxvY2F0ZWQ7CisKKwkJc3RydWN0IHsKKwkJCWJvb2wgcmVzZXJ2ZWQ7CisJCX0g cmVzZXJ2ZSwgaXNfcmVzZXJ2ZWQ7CisKKwkJc3RydWN0IHsKKwkJCWJvb2wgdW5yZXNlcnZlZDsK KwkJfSB1bnJlc2VydmU7CisKKwkJc3RydWN0IHsKKwkJCWJvb2wgYWxsb2NhdGVkOworCQkJYm9v bCByZXNlcnZlZDsKKwkJfSByZXNlcnZlX2lmX25vdF9hbGxvY2F0ZWQ7CisJfTsKK307CisKK3N0 cnVjdCBtc2dfY2hhbm5lbCB7CisJdm9pZCAqcHJpdjsKKwl2b2lkICgqaW5pdCkoc3RydWN0IG1z Z19jaGFubmVsICpjaGFubmVsKTsKKwl2b2lkICgqZGVpbml0KShzdHJ1Y3QgbXNnX2NoYW5uZWwg KmNoYW5uZWwpOworCWludCAoKnNlbmRfcmVxKShzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWws IHN0cnVjdCBhbGxvY19yZXEgKnJlcXVlc3QpOworCWludCAoKnJlY3ZfcmVxKShzdHJ1Y3QgbXNn X2NoYW5uZWwgKmNoYW5uZWwsIHN0cnVjdCBhbGxvY19yZXEgKnJlcXVlc3QpOworCWludCAoKnNl bmRfcmVzcCkoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsLCBzdHJ1Y3QgYWxsb2NfcmVzcCAq cmVzcG9uc2UpOworCWludCAoKnJlY3ZfcmVzcCkoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVs LCBzdHJ1Y3QgYWxsb2NfcmVzcCAqcmVzcG9uc2UpOworfTsKKworZW51bSBtc2dfY2hhbm5lbF90 eXBlIHsKKwlDSEFOTkVMX1NZU1ZJUENfTVNHUVVFVUUKK307CisKK3N0cnVjdCBtc2dfY2hhbm5l bCAqaW50ZWxfYWxsb2NhdG9yX2dldF9tc2djaGFubmVsKGVudW0gbXNnX2NoYW5uZWxfdHlwZSB0 eXBlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvaW50ZWxfYWxsb2NhdG9yX3NpbXBsZS5j IGIvbGliL2ludGVsX2FsbG9jYXRvcl9zaW1wbGUuYwppbmRleCAxZjUyZGIzZi4uMWQwZTExN2Qg MTAwNjQ0Ci0tLSBhL2xpYi9pbnRlbF9hbGxvY2F0b3Jfc2ltcGxlLmMKKysrIGIvbGliL2ludGVs X2FsbG9jYXRvcl9zaW1wbGUuYwpAQCAtODIsOCArODIsNiBAQCBzdHJ1Y3QgaW50ZWxfYWxsb2Nh dG9yX3JlY29yZCB7CiAjZGVmaW5lIHNpbXBsZV92bWFfZm9yZWFjaF9ob2xlX3NhZmVfcmV2KF9o b2xlLCBfaGVhcCwgX3RtcCkgXAogCWlndF9saXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJz ZShfaG9sZSwgX3RtcCwgICYoX2hlYXApLT5ob2xlcywgbGluaykKIAotI2RlZmluZSBERUNBTk9O SUNBTChvZmZzZXQpIChvZmZzZXQgJiAoKDF1bGwgPDwgNDgpIC0gMSkpCi0KIHN0YXRpYyB1aW50 NjRfdCBnZXRfYmlhcyhpbnQgZmQpCiB7CiAJKHZvaWQpIGZkOwpkaWZmIC0tZ2l0IGEvbGliL21l c29uLmJ1aWxkIGIvbGliL21lc29uLmJ1aWxkCmluZGV4IDQ4NGQzYzdiLi43YTMyMmE0NCAxMDA2 NDQKLS0tIGEvbGliL21lc29uLmJ1aWxkCisrKyBiL2xpYi9tZXNvbi5idWlsZApAQCAtMzIsNiAr MzIsMTAgQEAgbGliX3NvdXJjZXMgPSBbCiAJJ2lndF92Z2VtLmMnLAogCSdpZ3RfeDg2LmMnLAog CSdpbnN0ZG9uZS5jJywKKwknaW50ZWxfYWxsb2NhdG9yLmMnLAorCSdpbnRlbF9hbGxvY2F0b3Jf bXNnY2hhbm5lbC5jJywKKwknaW50ZWxfYWxsb2NhdG9yX3JhbmRvbS5jJywKKwknaW50ZWxfYWxs b2NhdG9yX3NpbXBsZS5jJywKIAknaW50ZWxfYmF0Y2hidWZmZXIuYycsCiAJJ2ludGVsX2J1Zm9w cy5jJywKIAknaW50ZWxfY2hpcHNldC5jJywKLS0gCjIuMjYuMAoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWlsaW5nIGxpc3QKaWd0LWRl dkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9pZ3QtZGV2Cg==