From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH v3 4/5] x86: split PVH dom0 builder to hvm/dom0_build.c Date: Mon, 20 Mar 2017 14:14:25 +0000 Message-ID: <20170320141426.20780-5-wei.liu2@citrix.com> References: <20170320141426.20780-1-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cpy60-0006fU-03 for xen-devel@lists.xenproject.org; Mon, 20 Mar 2017 14:15:40 +0000 In-Reply-To: <20170320141426.20780-1-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Xen-devel Cc: Andrew Cooper , Wei Liu , Jan Beulich , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= List-Id: xen-devel@lists.xenproject.org TG9uZyB0ZXJtIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBkaXNlbnRhbmdsZSBQViBhbmQgSFZNIGNv ZGUuIE1vdmUKdGhlIFBWSCBkb21haW4gYnVpbGRlciB0byBhIGRlZGljYXRlZCBmaWxlLgoKTGlm dCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgdG8gZG9tMF9idWlsZC5oIGFuZCByZW5hbWUgdGhlbSB3 aGVuCm5lY2Vzc2FyeS4KCk5vIGZ1bmN0aW9uYWwgY2hhbmdlLgoKU2lnbmVkLW9mZi1ieTogV2Vp IExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4KQWNrZWQtYnk6IFJvZ2VyIFBhdSBNb25uw6kgPHJv Z2VyLnBhdUBjaXRyaXguY29tPgotLS0KdjM6CjEuIGFkYXB0IHRvIHByZXZpb3VzIHBhdGNoCgp2 MjoKMS4gYWRkIGNvcHlyaWdodCBoZWFkZXIKLS0tCiB4ZW4vYXJjaC94ODYvZG9tMF9idWlsZC5j ICAgICAgICB8IDEwNzEgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB4ZW4v YXJjaC94ODYvaHZtL01ha2VmaWxlICAgICAgICB8ICAgIDEgKwogeGVuL2FyY2gveDg2L2h2bS9k b20wX2J1aWxkLmMgICAgfCAxMTE0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCiB4ZW4vaW5jbHVkZS9hc20teDg2L2RvbTBfYnVpbGQuaCB8ICAgIDkgKwogNCBmaWxlcyBj aGFuZ2VkLCAxMTI3IGluc2VydGlvbnMoKyksIDEwNjggZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9k ZSAxMDA2NDQgeGVuL2FyY2gveDg2L2h2bS9kb20wX2J1aWxkLmMKCmRpZmYgLS1naXQgYS94ZW4v YXJjaC94ODYvZG9tMF9idWlsZC5jIGIveGVuL2FyY2gveDg2L2RvbTBfYnVpbGQuYwppbmRleCBj YjQ0YTIwNzkyLi45ZGMyZjgwM2FlIDEwMDY0NAotLS0gYS94ZW4vYXJjaC94ODYvZG9tMF9idWls ZC5jCisrKyBiL3hlbi9hcmNoL3g4Ni9kb20wX2J1aWxkLmMKQEAgLTUwLDI3ICs1MCw2IEBAIHN0 YXRpYyBsb25nIF9faW5pdGRhdGEgZG9tMF9ucnBhZ2VzOwogc3RhdGljIGxvbmcgX19pbml0ZGF0 YSBkb20wX21pbl9ucnBhZ2VzOwogc3RhdGljIGxvbmcgX19pbml0ZGF0YSBkb20wX21heF9ucnBh Z2VzID0gTE9OR19NQVg7CiAKLS8qCi0gKiBIYXZlIHRoZSBUU1MgY292ZXIgdGhlIElTQSBwb3J0 IHJhbmdlLCB3aGljaCBtYWtlcyBpdAotICogLSAxMDQgYnl0ZXMgYmFzZSBzdHJ1Y3R1cmUKLSAq IC0gMzIgYnl0ZXMgaW50ZXJydXB0IHJlZGlyZWN0aW9uIGJpdG1hcAotICogLSAxMjggYnl0ZXMg SS9PIGJpdG1hcAotICogLSBvbmUgdHJhaWxpbmcgYnl0ZQotICogb3IgYSB0b3RhbCBvZiAyNjUg Ynl0ZXMuCi0gKgotICogTkI6IGFzIFBWSHYyIERvbTAgZG9lc24ndCBoYXZlIGxlZ2FjeSBkZXZp Y2VzIChJU0EpLCBpdCBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAqIGJ1c2luZXNzIGluIGFjY2Vzc2lu ZyB0aGUgSVNBIHBvcnQgcmFuZ2UsIG11Y2ggbGVzcyBpbiByZWFsIG1vZGUsIGFuZCBkdWUgdG8K LSAqIHRoZSBsYWNrIG9mIGZpcm13YXJlIGl0IHNob3VsZG4ndCBhbHNvIGV4ZWN1dGUgYW55IElO VCBpbnN0cnVjdGlvbi4gVGhpcyBpcwotICogZG9uZSBqdXN0IGZvciBjb25zaXN0ZW5jeSB3aXRo IHdoYXQgaHZtbG9hZGVyIGRvZXMuCi0gKi8KLSNkZWZpbmUgSFZNX1ZNODZfVFNTX1NJWkUgMjY1 Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBhY3BpX2ludHJfb3ZlcnJpZGVzOwot c3RhdGljIHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlIF9faW5pdGRhdGEgKmlu dHNyY292cjsKLQotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIGFjcGlfbm1pX3NvdXJj ZXM7Ci1zdGF0aWMgc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlIF9faW5pdGRhdGEgKm5taXNy YzsKLQogLyoKICAqIGRvbTBfbWVtPVttaW46PG1pbl9hbXQ+LF1bbWF4OjxtYXhfYW10PixdWzxh bXQ+XQogICogCkBAIC0yNjMsOCArMjQyLDggQEAgYm9vbGVhbl9wYXJhbSgicm8taHBldCIsIHJv X2hwZXQpOwogCiB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBkb20wX21lbWZsYWdzID0gTUVNRl9u b19kbWF8TUVNRl9leGFjdF9ub2RlOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZG9t MF9wYWdpbmdfcGFnZXMoY29uc3Qgc3RydWN0IGRvbWFpbiAqZCwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQordW5z aWduZWQgbG9uZyBfX2luaXQgZG9tMF9wYWdpbmdfcGFnZXMoY29uc3Qgc3RydWN0IGRvbWFpbiAq ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcg bnJfcGFnZXMpCiB7CiAgICAgLyogQ29waWVkIGZyb206IGxpYnhsX2dldF9yZXF1aXJlZF9zaGFk b3dfbWVtb3J5KCkgKi8KICAgICB1bnNpZ25lZCBsb25nIG1lbWtiID0gbnJfcGFnZXMgKiAoUEFH RV9TSVpFIC8gMTAyNCk7CkBAIC00OTMsMTA1MCArNDcyLDYgQEAgaW50IF9faW5pdCBkb20wX3Nl dHVwX3Blcm1pc3Npb25zKHN0cnVjdCBkb21haW4gKmQpCiAgICAgcmV0dXJuIHJjOwogfQogCi1z dGF0aWMgaW50IF9faW5pdCBtb2RpZnlfaWRlbnRpdHlfbW1pbyhzdHJ1Y3QgZG9tYWluICpkLCB1 bnNpZ25lZCBsb25nIHBmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGNvbnN0IGJvb2wgbWFwKQotewotICAgIGludCByYzsK LQotICAgIGZvciAoIDsgOyApCi0gICAgewotICAgICAgICByYyA9IChtYXAgPyBtYXBfbW1pb19y ZWdpb25zIDogdW5tYXBfbW1pb19yZWdpb25zKQotICAgICAgICAgICAgIChkLCBfZ2ZuKHBmbiks IG5yX3BhZ2VzLCBfbWZuKHBmbikpOwotICAgICAgICBpZiAoIHJjID09IDAgKQotICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgIGlmICggcmMgPCAwICkKLSAgICAgICAgewotICAgICAgICAgICAg cHJpbnRrKFhFTkxPR19XQVJOSU5HCi0gICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpZGVu dGl0eSAlc21hcCBbJSNseCwlI2x4KSBmb3IgZCVkOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAg ICBtYXAgPyAiIiA6ICJ1biIsIHBmbiwgcGZuICsgbnJfcGFnZXMsIGQtPmRvbWFpbl9pZCwgcmMp OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbnJfcGFnZXMgLT0gcmM7 Ci0gICAgICAgIHBmbiArPSByYzsKLSAgICAgICAgcHJvY2Vzc19wZW5kaW5nX3NvZnRpcnFzKCk7 Ci0gICAgfQotCi0gICAgcmV0dXJuIHJjOwotfQotCi0vKiBQb3B1bGF0ZSBhIEhWTSBtZW1vcnkg cmFuZ2UgdXNpbmcgdGhlIGJpZ2dlc3QgcG9zc2libGUgb3JkZXIuICovCi1zdGF0aWMgaW50IF9f aW5pdCBwdmhfcG9wdWxhdGVfbWVtb3J5X3JhbmdlKHN0cnVjdCBkb21haW4gKmQsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxv bmcgbnJfcGFnZXMpCi17Ci0gICAgdW5zaWduZWQgaW50IG9yZGVyLCBpID0gMDsKLSAgICBzdHJ1 Y3QgcGFnZV9pbmZvICpwYWdlOwotICAgIGludCByYzsKLSNkZWZpbmUgTUFQX01BWF9JVEVSIDY0 Ci0KLSAgICBvcmRlciA9IE1BWF9PUkRFUjsKLSAgICB3aGlsZSAoIG5yX3BhZ2VzICE9IDAgKQot ICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHJhbmdlX29yZGVyID0gZ2V0X29yZGVyX2Zyb21f cGFnZXMobnJfcGFnZXMgKyAxKTsKLQotICAgICAgICBvcmRlciA9IG1pbihyYW5nZV9vcmRlciA/ IHJhbmdlX29yZGVyIC0gMSA6IDAsIG9yZGVyKTsKLSAgICAgICAgcGFnZSA9IGFsbG9jX2RvbWhl YXBfcGFnZXMoZCwgb3JkZXIsIGRvbTBfbWVtZmxhZ3MpOwotICAgICAgICBpZiAoIHBhZ2UgPT0g TlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggb3JkZXIgPT0gMCAmJiBkb20wX21l bWZsYWdzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUcnkgYWdhaW4gd2l0 aG91dCBhbnkgZG9tMF9tZW1mbGFncy4gKi8KLSAgICAgICAgICAgICAgICBkb20wX21lbWZsYWdz ID0gMDsKLSAgICAgICAgICAgICAgICBvcmRlciA9IE1BWF9PUkRFUjsKLSAgICAgICAgICAgICAg ICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggb3JkZXIgPT0gMCAp Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2Nh dGUgbWVtb3J5IHdpdGggb3JkZXIgMCFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5P TUVNOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3JkZXItLTsKLSAgICAgICAgICAgIGNv bnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmMgPSBndWVzdF9waHlzbWFwX2FkZF9wYWdl KGQsIF9nZm4oc3RhcnQpLCBfbWZuKHBhZ2VfdG9fbWZuKHBhZ2UpKSwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKLSAgICAgICAgaWYgKCByYyAhPSAwICkKLSAg ICAgICAgewotICAgICAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gcG9wdWxhdGUgbWVtb3J5OiBb JSNseCwlbHgpOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RhcnQgKyAoMVVM IDw8IG9yZGVyKSwgcmMpOwotICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0K LSAgICAgICAgc3RhcnQgKz0gMVVMIDw8IG9yZGVyOwotICAgICAgICBucl9wYWdlcyAtPSAxVUwg PDwgb3JkZXI7Ci0gICAgICAgIGlmICggKCsraSAlIE1BUF9NQVhfSVRFUikgPT0gMCApCi0gICAg ICAgICAgICBwcm9jZXNzX3BlbmRpbmdfc29mdGlycXMoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g MDsKLSN1bmRlZiBNQVBfTUFYX0lURVIKLX0KLQotLyogU3RlYWwgUkFNIGZyb20gdGhlIGVuZCBv ZiBhIG1lbW9yeSByZWdpb24uICovCi1zdGF0aWMgaW50IF9faW5pdCBwdmhfc3RlYWxfcmFtKHN0 cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwgcGFkZHJfdCBsaW1pdCwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCAqYWRkcikKLXsKLSAgICB1bnNpZ25lZCBp bnQgaSA9IGQtPmFyY2gubnJfZTgyMDsKLQotICAgIC8qCi0gICAgICogQWxpZ25tZW50IDAgc2hv dWxkIGJlIHNldCB0byAxLCBzbyBpdCBkb2Vzbid0IHdyYXAgYXJvdW5kIGluIHRoZQotICAgICAq IGNhbGN1bGF0aW9ucyBiZWxvdy4KLSAgICAgKi8KLSAgICBhbGlnbiA9IGFsaWduID8gOiAxOwot ICAgIHdoaWxlICggaS0tICkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBlODIwZW50cnkgKmVudHJ5 ID0gJmQtPmFyY2guZTgyMFtpXTsKLQotICAgICAgICBpZiAoIGVudHJ5LT50eXBlICE9IEU4MjBf UkFNIHx8IGVudHJ5LT5hZGRyICsgZW50cnktPnNpemUgPiBsaW1pdCB8fAotICAgICAgICAgICAg IGVudHJ5LT5hZGRyIDwgTUIoMSkgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg KmFkZHIgPSAoZW50cnktPmFkZHIgKyBlbnRyeS0+c2l6ZSAtIHNpemUpICYgfihhbGlnbiAtIDEp OwotICAgICAgICBpZiAoICphZGRyIDwgZW50cnktPmFkZHIgKQotICAgICAgICAgICAgY29udGlu dWU7Ci0KLSAgICAgICAgZW50cnktPnNpemUgPSAqYWRkciAtIGVudHJ5LT5hZGRyOwotICAgICAg ICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gLUVOT01FTTsKLX0KLQotLyogTkI6IG1l bW9yeSBtYXAgbXVzdCBiZSBzb3J0ZWQgYXQgYWxsIHRpbWVzIGZvciB0aGlzIHRvIHdvcmsgY29y cmVjdGx5LiAqLwotc3RhdGljIGludCBfX2luaXQgcHZoX2FkZF9tZW1fcmFuZ2Uoc3RydWN0IGRv bWFpbiAqZCwgdWludDY0X3QgcywgdWludDY0X3QgZSwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eXBlKQotewotICAgIHN0cnVjdCBlODIwZW50cnkg Km1hcDsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgZC0+YXJj aC5ucl9lODIwOyBpKysgKQotICAgIHsKLSAgICAgICAgdWludDY0X3QgcnMgPSBkLT5hcmNoLmU4 MjBbaV0uYWRkcjsKLSAgICAgICAgdWludDY0X3QgcmUgPSBycyArIGQtPmFyY2guZTgyMFtpXS5z aXplOwotCi0gICAgICAgIGlmICggcnMgPT0gZSAmJiBkLT5hcmNoLmU4MjBbaV0udHlwZSA9PSB0 eXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLmFkZHIgPSBzOwot ICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHJlID09IHMg JiYgZC0+YXJjaC5lODIwW2ldLnR5cGUgPT0gdHlwZSAmJgotICAgICAgICAgICAgIChpICsgMSA9 PSBkLT5hcmNoLm5yX2U4MjAgfHwgZC0+YXJjaC5lODIwW2kgKyAxXS5hZGRyID49IGUpICkKLSAg ICAgICAgewotICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnNpemUgKz0gZSAtIHM7Ci0gICAg ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcnMgPj0gZSApCi0g ICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIHJlID4gcyApCi0gICAgICAgICAgICBy ZXR1cm4gLUVFWElTVDsKLSAgICB9Ci0KLSAgICBtYXAgPSB4emFsbG9jX2FycmF5KHN0cnVjdCBl ODIwZW50cnksIGQtPmFyY2gubnJfZTgyMCArIDEpOwotICAgIGlmICggIW1hcCApCi0gICAgewot ICAgICAgICBwcmludGsoWEVOTE9HX1dBUk5JTkcgIkU4MjA6IG91dCBvZiBtZW1vcnkgdG8gYWRk IHJlZ2lvblxuIik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLQotICAgIG1lbWNw eShtYXAsIGQtPmFyY2guZTgyMCwgaSAqIHNpemVvZigqZC0+YXJjaC5lODIwKSk7Ci0gICAgbWVt Y3B5KG1hcCArIGkgKyAxLCBkLT5hcmNoLmU4MjAgKyBpLAotICAgICAgICAgICAoZC0+YXJjaC5u cl9lODIwIC0gaSkgKiBzaXplb2YoKmQtPmFyY2guZTgyMCkpOwotICAgIG1hcFtpXS5hZGRyID0g czsKLSAgICBtYXBbaV0uc2l6ZSA9IGUgLSBzOwotICAgIG1hcFtpXS50eXBlID0gdHlwZTsKLSAg ICB4ZnJlZShkLT5hcmNoLmU4MjApOwotICAgIGQtPmFyY2guZTgyMCA9IG1hcDsKLSAgICBkLT5h cmNoLm5yX2U4MjArKzsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBw dmhfc2V0dXBfdm14X3JlYWxtb2RlX2hlbHBlcnMoc3RydWN0IGRvbWFpbiAqZCkKLXsKLSAgICBw Mm1fdHlwZV90IHAybXQ7Ci0gICAgdWludDMyX3QgcmMsICppZGVudF9wdDsKLSAgICBtZm5fdCBt Zm47Ci0gICAgcGFkZHJfdCBnYWRkcjsKLSAgICBzdHJ1Y3QgdmNwdSAqdiA9IGQtPnZjcHVbMF07 Ci0KLSAgICAvKgotICAgICAqIFN0ZWFsIHNvbWUgc3BhY2UgZnJvbSB0aGUgbGFzdCBSQU0gcmVn aW9uIGJlbG93IDRHQiBhbmQgdXNlIGl0IHRvCi0gICAgICogc3RvcmUgdGhlIHJlYWwtbW9kZSBU U1MuIEl0IG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gMTI4IHNvIHRoYXQgdGhlCi0gICAgICogVFNT IHN0cnVjdHVyZSAod2hpY2ggYWNjb3VudHMgZm9yIHRoZSBmaXJzdCAxMDRiKSBkb2Vzbid0IGNy b3NzCi0gICAgICogYSBwYWdlIGJvdW5kYXJ5LgotICAgICAqLwotICAgIGlmICggIXB2aF9zdGVh bF9yYW0oZCwgSFZNX1ZNODZfVFNTX1NJWkUsIDEyOCwgR0IoNCksICZnYWRkcikgKQotICAgIHsK LSAgICAgICAgaWYgKCBodm1fY29weV90b19ndWVzdF9waHlzKGdhZGRyLCBOVUxMLCBIVk1fVk04 Nl9UU1NfU0laRSwgdikgIT0KLSAgICAgICAgICAgICBIVk1DT1BZX29rYXkgKQotICAgICAgICAg ICAgcHJpbnRrKCJVbmFibGUgdG8gemVybyBWTTg2IFRTUyBhcmVhXG4iKTsKLSAgICAgICAgZC0+ YXJjaC5odm1fZG9tYWluLnBhcmFtc1tIVk1fUEFSQU1fVk04Nl9UU1NfU0laRURdID0KLSAgICAg ICAgICAgIFZNODZfVFNTX1VQREFURUQgfCAoKHVpbnQ2NF90KUhWTV9WTTg2X1RTU19TSVpFIDw8 IDMyKSB8IGdhZGRyOwotICAgICAgICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQsIGdhZGRyLCBn YWRkciArIEhWTV9WTTg2X1RTU19TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEU4MjBfUkVTRVJWRUQpICkKLSAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIHNldCBWTTg2 IFRTUyBhcyByZXNlcnZlZCBpbiB0aGUgbWVtb3J5IG1hcFxuIik7Ci0gICAgfQotICAgIGVsc2UK LSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgVk04NiBUU1MgYXJlYVxuIik7Ci0K LSAgICAvKiBTdGVhbCBzb21lIG1vcmUgUkFNIGZvciB0aGUgaWRlbnRpdHkgcGFnZSB0YWJsZXMu ICovCi0gICAgaWYgKCBwdmhfc3RlYWxfcmFtKGQsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBHQig0 KSwgJmdhZGRyKSApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBmaW5kIG1lbW9y eSB0byBzdGFzaCB0aGUgaWRlbnRpdHkgcGFnZSB0YWJsZXNcbiIpOwotICAgICAgICByZXR1cm4g LUVOT01FTTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElkZW50aXR5LW1hcCBwYWdlIHRhYmxl IGlzIHJlcXVpcmVkIGZvciBydW5uaW5nIHdpdGggQ1IwLlBHPTAKLSAgICAgKiB3aGVuIHVzaW5n IEludGVsIEVQVC4gQ3JlYXRlIGEgMzItYml0IG5vbi1QQUUgcGFnZSBkaXJlY3Rvcnkgb2YKLSAg ICAgKiBzdXBlcnBhZ2VzLgotICAgICAqLwotICAgIGlkZW50X3B0ID0gbWFwX2RvbWFpbl9nZm4o cDJtX2dldF9ob3N0cDJtKGQpLCBfZ2ZuKFBGTl9ET1dOKGdhZGRyKSksCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAmbWZuLCAmcDJtdCwgMCwgJnJjKTsKLSAgICBpZiAoIGlkZW50X3B0 ID09IE5VTEwgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gbWFwIGlkZW50aXR5 IHBhZ2UgdGFibGVzXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotICAgIHdy aXRlXzMyYml0X3BzZV9pZGVudG1hcChpZGVudF9wdCk7Ci0gICAgdW5tYXBfZG9tYWluX3BhZ2Uo aWRlbnRfcHQpOwotICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKG1mbl94KG1mbikpKTsKLSAgICBk LT5hcmNoLmh2bV9kb21haW4ucGFyYW1zW0hWTV9QQVJBTV9JREVOVF9QVF0gPSBnYWRkcjsKLSAg ICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQsIGdhZGRyLCBnYWRkciArIFBBR0VfU0laRSwgRTgy MF9SRVNFUlZFRCkgKQotICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gc2V0IGlkZW50aXR5 IHBhZ2UgdGFibGVzIGFzIHJlc2VydmVkIGluIHRoZSBtZW1vcnkgbWFwXG4iKTsKLQotICAgIHJl dHVybiAwOwotfQotCi0vKiBBc3NpZ24gdGhlIGxvdyAxTUIgdG8gRG9tMC4gKi8KLXN0YXRpYyB2 b2lkIF9faW5pdCBwdmhfc3RlYWxfbG93X3JhbShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBs b25nIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVk IGxvbmcgbnJfcGFnZXMpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBtZm47Ci0KLSAgICBBU1NFUlQo c3RhcnQgKyBucl9wYWdlcyA8PSBQRk5fRE9XTihNQigxKSkpOwotCi0gICAgZm9yICggbWZuID0g c3RhcnQ7IG1mbiA8IHN0YXJ0ICsgbnJfcGFnZXM7IG1mbisrICkKLSAgICB7Ci0gICAgICAgIHN0 cnVjdCBwYWdlX2luZm8gKnBnID0gbWZuX3RvX3BhZ2UobWZuKTsKLSAgICAgICAgaW50IHJjOwot Ci0gICAgICAgIHJjID0gdW5zaGFyZV94ZW5fcGFnZV93aXRoX2d1ZXN0KHBnLCBkb21faW8pOwot ICAgICAgICBpZiAoIHJjICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUg dG8gdW5zaGFyZSBYZW4gbWZuICUjbHg6ICVkXG4iLCBtZm4sIHJjKTsKLSAgICAgICAgICAgIGNv bnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2hhcmVfeGVuX3BhZ2Vfd2l0aF9ndWVzdChw ZywgZCwgWEVOU0hBUkVfd3JpdGFibGUpOwotICAgICAgICByYyA9IGd1ZXN0X3BoeXNtYXBfYWRk X2VudHJ5KGQsIF9nZm4obWZuKSwgX21mbihtZm4pLCAwLCBwMm1fcmFtX3J3KTsKLSAgICAgICAg aWYgKCByYyApCi0gICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhZGQgbWZuICUjbHggdG8g cDJtOiAlZFxuIiwgbWZuLCByYyk7Ci0gICAgfQotfQotCi1zdGF0aWMgX19pbml0IHZvaWQgcHZo X3NldHVwX2U4MjAoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKLXsK LSAgICBzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeSwgKmVudHJ5X2d1ZXN0OwotICAgIHVuc2lnbmVk IGludCBpOwotICAgIHVuc2lnbmVkIGxvbmcgcGFnZXMsIGN1cl9wYWdlcyA9IDA7Ci0gICAgdWlu dDY0X3Qgc3RhcnQsIGVuZDsKLQotICAgIC8qCi0gICAgICogQ3JhZnQgdGhlIGU4MjAgbWVtb3J5 IG1hcCBmb3IgRG9tMCBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgZTgyMCBtYXAuCi0gICAgICovCi0g ICAgZC0+YXJjaC5lODIwID0geHphbGxvY19hcnJheShzdHJ1Y3QgZTgyMGVudHJ5LCBlODIwLm5y X21hcCk7Ci0gICAgaWYgKCAhZC0+YXJjaC5lODIwICkKLSAgICAgICAgcGFuaWMoIlVuYWJsZSB0 byBhbGxvY2F0ZSBtZW1vcnkgZm9yIERvbTAgZTgyMCBtYXAiKTsKLSAgICBlbnRyeV9ndWVzdCA9 IGQtPmFyY2guZTgyMDsKLQotICAgIC8qIENsYW1wIGU4MjAgbWVtb3J5IG1hcCB0byBtYXRjaCB0 aGUgbWVtb3J5IGFzc2lnbmVkIHRvIERvbTAgKi8KLSAgICBmb3IgKCBpID0gMCwgZW50cnkgPSBl ODIwLm1hcDsgaSA8IGU4MjAubnJfbWFwOyBpKyssIGVudHJ5KysgKQotICAgIHsKLSAgICAgICAg aWYgKCBlbnRyeS0+dHlwZSAhPSBFODIwX1JBTSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpl bnRyeV9ndWVzdCA9ICplbnRyeTsKLSAgICAgICAgICAgIGdvdG8gbmV4dDsKLSAgICAgICAgfQot Ci0gICAgICAgIGlmICggbnJfcGFnZXMgPT0gY3VyX3BhZ2VzICkKLSAgICAgICAgewotICAgICAg ICAgICAgLyoKLSAgICAgICAgICAgICAqIFdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGFzc2lnbmVk IG1lbW9yeSwKLSAgICAgICAgICAgICAqIHNraXAgdGhpcyBlbnRyeQotICAgICAgICAgICAgICov Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAg ICAqIE1ha2Ugc3VyZSB0aGUgc3RhcnQgYW5kIGxlbmd0aCBhcmUgYWxpZ25lZCB0byBQQUdFX1NJ WkUsIGJlY2F1c2UKLSAgICAgICAgICogdGhhdCdzIHRoZSBtaW5pbXVtIGdyYW51bGFyaXR5IG9m IHRoZSAybmQgc3RhZ2UgdHJhbnNsYXRpb24uIFNpbmNlCi0gICAgICAgICAqIHRoZSBwMm0gY29k ZSB1c2VzIFBBR0VfT1JERVJfNEsgaW50ZXJuYWxseSwgYWxzbyB1c2UgaXQgaGVyZSBpbgotICAg ICAgICAgKiBvcmRlciB0byBwcmV2ZW50IHRoaXMgY29kZSBmcm9tIGdldHRpbmcgb3V0IG9mIHN5 bmMuCi0gICAgICAgICAqLwotICAgICAgICBzdGFydCA9IFJPVU5EVVAoZW50cnktPmFkZHIsIFBB R0VfU0laRSA8PCBQQUdFX09SREVSXzRLKTsKLSAgICAgICAgZW5kID0gKGVudHJ5LT5hZGRyICsg ZW50cnktPnNpemUpICYKLSAgICAgICAgICAgICAgfigoUEFHRV9TSVpFIDw8IFBBR0VfT1JERVJf NEspIC0gMSk7Ci0gICAgICAgIGlmICggc3RhcnQgPj0gZW5kICkKLSAgICAgICAgICAgIGNvbnRp bnVlOwotCi0gICAgICAgIGVudHJ5X2d1ZXN0LT50eXBlID0gRTgyMF9SQU07Ci0gICAgICAgIGVu dHJ5X2d1ZXN0LT5hZGRyID0gc3RhcnQ7Ci0gICAgICAgIGVudHJ5X2d1ZXN0LT5zaXplID0gZW5k IC0gc3RhcnQ7Ci0gICAgICAgIHBhZ2VzID0gUEZOX0RPV04oZW50cnlfZ3Vlc3QtPnNpemUpOwot ICAgICAgICBpZiAoIChjdXJfcGFnZXMgKyBwYWdlcykgPiBucl9wYWdlcyApCi0gICAgICAgIHsK LSAgICAgICAgICAgIC8qIFRydW5jYXRlIHJlZ2lvbiAqLwotICAgICAgICAgICAgZW50cnlfZ3Vl c3QtPnNpemUgPSAobnJfcGFnZXMgLSBjdXJfcGFnZXMpIDw8IFBBR0VfU0hJRlQ7Ci0gICAgICAg ICAgICBjdXJfcGFnZXMgPSBucl9wYWdlczsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAg ICAgIHsKLSAgICAgICAgICAgIGN1cl9wYWdlcyArPSBwYWdlczsKLSAgICAgICAgfQotIG5leHQ6 Ci0gICAgICAgIGQtPmFyY2gubnJfZTgyMCsrOwotICAgICAgICBlbnRyeV9ndWVzdCsrOwotICAg IH0KLSAgICBBU1NFUlQoY3VyX3BhZ2VzID09IG5yX3BhZ2VzKTsKLSAgICBBU1NFUlQoZC0+YXJj aC5ucl9lODIwIDw9IGU4MjAubnJfbWFwKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHZoX3Nl dHVwX3AybShzdHJ1Y3QgZG9tYWluICpkKQotewotICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNw dVswXTsKLSAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwotICAgIHVuc2lnbmVkIGludCBpOwot ICAgIGludCByYzsKLSAgICBib29sIHByZWVtcHRlZDsKLSNkZWZpbmUgTUIxX1BBR0VTIFBGTl9E T1dOKE1CKDEpKQotCi0gICAgbnJfcGFnZXMgPSBkb20wX2NvbXB1dGVfbnJfcGFnZXMoZCwgTlVM TCwgMCk7Ci0KLSAgICBwdmhfc2V0dXBfZTgyMChkLCBucl9wYWdlcyk7Ci0gICAgZG8gewotICAg ICAgICBwcmVlbXB0ZWQgPSBmYWxzZTsKLSAgICAgICAgcGFnaW5nX3NldF9hbGxvY2F0aW9uKGQs IGRvbTBfcGFnaW5nX3BhZ2VzKGQsIG5yX3BhZ2VzKSwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZwcmVlbXB0ZWQpOwotICAgICAgICBwcm9jZXNzX3BlbmRpbmdfc29mdGlycXMoKTsK LSAgICB9IHdoaWxlICggcHJlZW1wdGVkICk7Ci0KLSAgICAvKgotICAgICAqIE1lbW9yeSBiZWxv dyAxTUIgaXMgaWRlbnRpdHkgbWFwcGVkLgotICAgICAqIE5COiB0aGlzIG9ubHkgbWFrZXMgc2Vu c2Ugd2hlbiBib290ZWQgZnJvbSBsZWdhY3kgQklPUy4KLSAgICAgKi8KLSAgICByYyA9IG1vZGlm eV9pZGVudGl0eV9tbWlvKGQsIDAsIE1CMV9QQUdFUywgdHJ1ZSk7Ci0gICAgaWYgKCByYyApCi0g ICAgewotICAgICAgICBwcmludGsoIkZhaWxlZCB0byBpZGVudGl0eSBtYXAgbG93IDFNQjogJWRc biIsIHJjKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIC8qIFBvcHVsYXRlIG1l bW9yeSBtYXAuICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBkLT5hcmNoLm5yX2U4MjA7IGkrKyAp Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemU7Ci0KLSAgICAgICAgaWYg KCBkLT5hcmNoLmU4MjBbaV0udHlwZSAhPSBFODIwX1JBTSApCi0gICAgICAgICAgICBjb250aW51 ZTsKLQotICAgICAgICBhZGRyID0gUEZOX0RPV04oZC0+YXJjaC5lODIwW2ldLmFkZHIpOwotICAg ICAgICBzaXplID0gUEZOX0RPV04oZC0+YXJjaC5lODIwW2ldLnNpemUpOwotCi0gICAgICAgIGlm ICggYWRkciA+PSBNQjFfUEFHRVMgKQotICAgICAgICAgICAgcmMgPSBwdmhfcG9wdWxhdGVfbWVt b3J5X3JhbmdlKGQsIGFkZHIsIHNpemUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAg ICAgICAgIEFTU0VSVChhZGRyICsgc2l6ZSA8IE1CMV9QQUdFUyk7Ci0gICAgICAgICAgICBwdmhf c3RlYWxfbG93X3JhbShkLCBhZGRyLCBzaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgg cmMgKQotICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIGlmICggY3B1X2hhc192 bXggJiYgcGFnaW5nX21vZGVfaGFwKGQpICYmICF2bXhfdW5yZXN0cmljdGVkX2d1ZXN0KHYpICkK LSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFNpbmNlIERvbTAgY2Fubm90IGJlIG1pZ3Jh dGVkLCB3ZSB3aWxsIG9ubHkgc2V0dXAgdGhlCi0gICAgICAgICAqIHVucmVzdHJpY3RlZCBndWVz dCBoZWxwZXJzIGlmIHRoZXkgYXJlIG5lZWRlZCBieSB0aGUgY3VycmVudAotICAgICAgICAgKiBo YXJkd2FyZSB3ZSBhcmUgcnVubmluZyBvbi4KLSAgICAgICAgICovCi0gICAgICAgIHJjID0gcHZo X3NldHVwX3ZteF9yZWFsbW9kZV9oZWxwZXJzKGQpOwotICAgICAgICBpZiAoIHJjICkKLSAgICAg ICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSN1bmRlZiBNQjFfUEFH RVMKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHZoX2xvYWRfa2VybmVsKHN0cnVjdCBkb21haW4g KmQsIGNvbnN0IG1vZHVsZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nIGltYWdlX2hlYWRyb29tLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG1vZHVsZV90ICppbml0cmQsIHZvaWQgKmltYWdlX2Jhc2UsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21kbGluZSwgcGFkZHJfdCAqZW50cnks Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCAqc3RhcnRfaW5mb19h ZGRyKQotewotICAgIHZvaWQgKmltYWdlX3N0YXJ0ID0gaW1hZ2VfYmFzZSArIGltYWdlX2hlYWRy b29tOwotICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2VfbGVuID0gaW1hZ2UtPm1vZF9lbmQ7Ci0gICAg c3RydWN0IGVsZl9iaW5hcnkgZWxmOwotICAgIHN0cnVjdCBlbGZfZG9tX3Bhcm1zIHBhcm1zOwot ICAgIHBhZGRyX3QgbGFzdF9hZGRyOwotICAgIHN0cnVjdCBodm1fc3RhcnRfaW5mbyBzdGFydF9p bmZvID0geyAwIH07Ci0gICAgc3RydWN0IGh2bV9tb2RsaXN0X2VudHJ5IG1vZCA9IHsgMCB9Owot ICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAo IChyYyA9IGJ6aW1hZ2VfcGFyc2UoaW1hZ2VfYmFzZSwgJmltYWdlX3N0YXJ0LCAmaW1hZ2VfbGVu KSkgIT0gMCApCi0gICAgewotICAgICAgICBwcmludGsoIkVycm9yIHRyeWluZyB0byBkZXRlY3Qg YnogY29tcHJlc3NlZCBrZXJuZWxcbiIpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0g ICAgaWYgKCAocmMgPSBlbGZfaW5pdCgmZWxmLCBpbWFnZV9zdGFydCwgaW1hZ2VfbGVuKSkgIT0g MCApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBpbml0IEVMRlxuIik7Ci0gICAg ICAgIHJldHVybiByYzsKLSAgICB9Ci0jaWZkZWYgVkVSQk9TRQotICAgIGVsZl9zZXRfdmVyYm9z ZSgmZWxmKTsKLSNlbmRpZgotICAgIGVsZl9wYXJzZV9iaW5hcnkoJmVsZik7Ci0gICAgaWYgKCAo cmMgPSBlbGZfeGVuX3BhcnNlKCZlbGYsICZwYXJtcykpICE9IDAgKQotICAgIHsKLSAgICAgICAg cHJpbnRrKCJVbmFibGUgdG8gcGFyc2Uga2VybmVsIGZvciBFTEZOT1RFU1xuIik7Ci0gICAgICAg IHJldHVybiByYzsKLSAgICB9Ci0KLSAgICBpZiAoIHBhcm1zLnBoeXNfZW50cnkgPT0gVU5TRVRf QUREUjMyICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIGZpbmQgWEVOX0VMRk5P VEVfUEhZUzMyX0VOVFJZIGFkZHJlc3NcbiIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAg ICB9Ci0KLSAgICBwcmludGsoIk9TOiAlcyB2ZXJzaW9uOiAlcyBsb2FkZXI6ICVzIGJpdG5lc3M6 ICVzXG4iLCBwYXJtcy5ndWVzdF9vcywKLSAgICAgICAgICAgcGFybXMuZ3Vlc3RfdmVyLCBwYXJt cy5sb2FkZXIsCi0gICAgICAgICAgIGVsZl82NGJpdCgmZWxmKSA/ICI2NC1iaXQiIDogIjMyLWJp dCIpOwotCi0gICAgLyogQ29weSB0aGUgT1MgaW1hZ2UgYW5kIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZl ci4gKi8KLSAgICBlbGYuZGVzdF9iYXNlID0gKHZvaWQgKikocGFybXMudmlydF9rc3RhcnQgLSBw YXJtcy52aXJ0X2Jhc2UpOwotICAgIGVsZi5kZXN0X3NpemUgPSBwYXJtcy52aXJ0X2tlbmQgLSBw YXJtcy52aXJ0X2tzdGFydDsKLQotICAgIGVsZl9zZXRfdmNwdSgmZWxmLCB2KTsKLSAgICByYyA9 IGVsZl9sb2FkX2JpbmFyeSgmZWxmKTsKLSAgICBpZiAoIHJjIDwgMCApCi0gICAgewotICAgICAg ICBwcmludGsoIkZhaWxlZCB0byBsb2FkIGtlcm5lbDogJWRcbiIsIHJjKTsKLSAgICAgICAgcHJp bnRrKCJYZW4gZG9tMCBrZXJuZWwgYnJva2VuIEVMRjogJXNcbiIsIGVsZl9jaGVja19icm9rZW4o JmVsZikpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgbGFzdF9hZGRyID0gUk9V TkRVUChwYXJtcy52aXJ0X2tlbmQgLSBwYXJtcy52aXJ0X2Jhc2UsIFBBR0VfU0laRSk7Ci0KLSAg ICBpZiAoIGluaXRyZCAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAgIHJjID0gaHZtX2NvcHlfdG9f Z3Vlc3RfcGh5cyhsYXN0X2FkZHIsIG1mbl90b192aXJ0KGluaXRyZC0+bW9kX3N0YXJ0KSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRyZC0+bW9kX2VuZCwgdik7Ci0g ICAgICAgIGlmICggcmMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0 byBjb3B5IGluaXRyZCB0byBndWVzdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gcmM7Ci0gICAg ICAgIH0KLQotICAgICAgICBtb2QucGFkZHIgPSBsYXN0X2FkZHI7Ci0gICAgICAgIG1vZC5zaXpl ID0gaW5pdHJkLT5tb2RfZW5kOwotICAgICAgICBsYXN0X2FkZHIgKz0gUk9VTkRVUChpbml0cmQt Pm1vZF9lbmQsIFBBR0VfU0laRSk7Ci0gICAgfQotCi0gICAgLyogRnJlZSB0ZW1wb3JhcnkgYnVm ZmVycy4gKi8KLSAgICBkaXNjYXJkX2luaXRpYWxfaW1hZ2VzKCk7Ci0KLSAgICBpZiAoIGNtZGxp bmUgIT0gTlVMTCApCi0gICAgewotICAgICAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMo bGFzdF9hZGRyLCBjbWRsaW5lLCBzdHJsZW4oY21kbGluZSkgKyAxLCB2KTsKLSAgICAgICAgaWYg KCByYyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgZ3Vl c3QgY29tbWFuZCBsaW5lXG4iKTsKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgfQot ICAgICAgICBzdGFydF9pbmZvLmNtZGxpbmVfcGFkZHIgPSBsYXN0X2FkZHI7Ci0gICAgICAgIC8q Ci0gICAgICAgICAqIFJvdW5kIHVwIHRvIDMyLzY0IGJpdHMgKGRlcGVuZGluZyBvbiB0aGUgZ3Vl c3Qga2VybmVsIGJpdG5lc3MpIHNvCi0gICAgICAgICAqIHRoZSBtb2RsaXN0L3N0YXJ0X2luZm8g aXMgYWxpZ25lZC4KLSAgICAgICAgICovCi0gICAgICAgIGxhc3RfYWRkciArPSBST1VORFVQKHN0 cmxlbihjbWRsaW5lKSArIDEsIGVsZl82NGJpdCgmZWxmKSA/IDggOiA0KTsKLSAgICB9Ci0gICAg aWYgKCBpbml0cmQgIT0gTlVMTCApCi0gICAgewotICAgICAgICByYyA9IGh2bV9jb3B5X3RvX2d1 ZXN0X3BoeXMobGFzdF9hZGRyLCAmbW9kLCBzaXplb2YobW9kKSwgdik7Ci0gICAgICAgIGlmICgg cmMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IGd1ZXN0 IG1vZHVsZXNcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICB9Ci0gICAgICAg IHN0YXJ0X2luZm8ubW9kbGlzdF9wYWRkciA9IGxhc3RfYWRkcjsKLSAgICAgICAgc3RhcnRfaW5m by5ucl9tb2R1bGVzID0gMTsKLSAgICAgICAgbGFzdF9hZGRyICs9IHNpemVvZihtb2QpOwotICAg IH0KLQotICAgIHN0YXJ0X2luZm8ubWFnaWMgPSBYRU5fSFZNX1NUQVJUX01BR0lDX1ZBTFVFOwot ICAgIHN0YXJ0X2luZm8uZmxhZ3MgPSBTSUZfUFJJVklMRUdFRCB8IFNJRl9JTklURE9NQUlOOwot ICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhsYXN0X2FkZHIsICZzdGFydF9pbmZvLCBz aXplb2Yoc3RhcnRfaW5mbyksIHYpOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJp bnRrKCJVbmFibGUgdG8gY29weSBzdGFydCBpbmZvIHRvIGd1ZXN0XG4iKTsKLSAgICAgICAgcmV0 dXJuIHJjOwotICAgIH0KLQotICAgICplbnRyeSA9IHBhcm1zLnBoeXNfZW50cnk7Ci0gICAgKnN0 YXJ0X2luZm9fYWRkciA9IGxhc3RfYWRkcjsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMg aW50IF9faW5pdCBwdmhfc2V0dXBfY3B1cyhzdHJ1Y3QgZG9tYWluICpkLCBwYWRkcl90IGVudHJ5 LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCBzdGFydF9pbmZvKQot ewotICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAgICB1bnNpZ25lZCBpbnQgY3B1 LCBpOwotICAgIGludCByYzsKLSAgICAvKiAKLSAgICAgKiBUaGlzIHNldHMgdGhlIHZDUFUgc3Rh dGUgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBkZXNjcmliZWQgaW4KLSAgICAgKiBkb2NzL21pc2Mv aHZtbGl0ZS5tYXJrZG93bi4KLSAgICAgKi8KLSAgICB2Y3B1X2h2bV9jb250ZXh0X3QgY3B1X2N0 eCA9IHsKLSAgICAgICAgLm1vZGUgPSBWQ1BVX0hWTV9NT0RFXzMyQiwKLSAgICAgICAgLmNwdV9y ZWdzLng4Nl8zMi5lYnggPSBzdGFydF9pbmZvLAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmVp cCA9IGVudHJ5LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmNyMCA9IFg4Nl9DUjBfUEUgfCBY ODZfQ1IwX0VULAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmNzX2xpbWl0ID0gfjB1LAotICAg ICAgICAuY3B1X3JlZ3MueDg2XzMyLmRzX2xpbWl0ID0gfjB1LAotICAgICAgICAuY3B1X3JlZ3Mu eDg2XzMyLnNzX2xpbWl0ID0gfjB1LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLnRyX2xpbWl0 ID0gMHg2NywKLSAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5jc19hciA9IDB4YzliLAotICAgICAg ICAuY3B1X3JlZ3MueDg2XzMyLmRzX2FyID0gMHhjOTMsCi0gICAgICAgIC5jcHVfcmVncy54ODZf MzIuc3NfYXIgPSAweGM5MywKLSAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi50cl9hciA9IDB4OGIs Ci0gICAgfTsKLQotICAgIGNwdSA9IHYtPnByb2Nlc3NvcjsKLSAgICBmb3IgKCBpID0gMTsgaSA8 IGQtPm1heF92Y3B1czsgaSsrICkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCB2Y3B1ICpwID0gZG9t MF9zZXR1cF92Y3B1KGQsIGksIGNwdSk7Ci0KLSAgICAgICAgaWYgKCBwICkKLSAgICAgICAgICAg IGNwdSA9IHAtPnByb2Nlc3NvcjsKLSAgICB9Ci0KLSAgICByYyA9IGFyY2hfc2V0X2luZm9faHZt X2d1ZXN0KHYsICZjcHVfY3R4KTsKLSAgICBpZiAoIHJjICkKLSAgICB7Ci0gICAgICAgIHByaW50 aygiVW5hYmxlIHRvIHNldHVwIERvbTAgQlNQIGNvbnRleHQ6ICVkXG4iLCByYyk7Ci0gICAgICAg IHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByYyA9IGRvbTBfc2V0dXBfcGVybWlzc2lvbnMoZCk7 Ci0gICAgaWYgKCByYyApCi0gICAgewotICAgICAgICBwYW5pYygiVW5hYmxlIHRvIHNldHVwIERv bTAgcGVybWlzc2lvbnM6ICVkXG4iLCByYyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0K LSAgICB1cGRhdGVfZG9tYWluX3dhbGxjbG9ja190aW1lKGQpOwotCi0gICAgY2xlYXJfYml0KF9W UEZfZG93biwgJnYtPnBhdXNlX2ZsYWdzKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMg aW50IF9faW5pdCBhY3BpX2NvdW50X2ludHJfb3ZyKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRl ciAqaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVu c2lnbmVkIGxvbmcgZW5kKQotewotCi0gICAgYWNwaV9pbnRyX292ZXJyaWRlcysrOwotICAgIHJl dHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3NldF9pbnRyX292cihzdHJ1Y3Qg YWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQotewotICAgIGNvbnN0IHN0cnVjdCBh Y3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlICppbnRyID0KLSAgICAgICAgY29udGFpbmVyX29m KGhlYWRlciwgc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUsIGhlYWRlcik7Ci0K LSAgICAqaW50c3Jjb3ZyID0gKmludHI7Ci0gICAgaW50c3Jjb3ZyKys7Ci0KLSAgICByZXR1cm4g MDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9jb3VudF9ubWlfc3JjKHN0cnVjdCBhY3Bp X3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQotewotCi0gICAgYWNwaV9ubWlfc291cmNl cysrOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3NldF9ubWlf c3JjKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLSAgICBjb25z dCBzdHJ1Y3QgYWNwaV9tYWR0X25taV9zb3VyY2UgKnNyYyA9Ci0gICAgICAgIGNvbnRhaW5lcl9v ZihoZWFkZXIsIHN0cnVjdCBhY3BpX21hZHRfbm1pX3NvdXJjZSwgaGVhZGVyKTsKLQotICAgICpu bWlzcmMgPSAqc3JjOwotICAgIG5taXNyYysrOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgX19pbml0IHB2aF9zZXR1cF9hY3BpX21hZHQoc3RydWN0IGRvbWFpbiAqZCwgcGFkZHJf dCAqYWRkcikKLXsKLSAgICBzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICptYWR0OwotICAgIHN0cnVj dCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7Ci0gICAgc3RydWN0IGFjcGlfbWFkdF9pb19hcGlj ICppb19hcGljOwotICAgIHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfeDJhcGljICp4MmFwaWM7Ci0g ICAgYWNwaV9zdGF0dXMgc3RhdHVzOwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICB1bnNp Z25lZCBpbnQgaSwgbWF4X3ZjcHVzOwotICAgIGludCByYzsKLQotICAgIC8qIENvdW50IG51bWJl ciBvZiBpbnRlcnJ1cHQgb3ZlcnJpZGVzIGluIHRoZSBNQURULiAqLwotICAgIGFjcGlfdGFibGVf cGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfT1ZFUlJJREUsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgIGFjcGlfY291bnRfaW50cl9vdnIsIFVJTlRfTUFYKTsKLQotICAgIC8q IENvdW50IG51bWJlciBvZiBOTUkgc291cmNlcyBpbiB0aGUgTUFEVC4gKi8KLSAgICBhY3BpX3Rh YmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfTk1JX1NPVVJDRSwgYWNwaV9jb3VudF9ubWlf c3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX01BWCk7Ci0KLSAgICBtYXhfdmNw dXMgPSBkb20wX21heF92Y3B1cygpOwotICAgIC8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUg Y3JhZnRlZCBNQURULiAqLwotICAgIHNpemUgPSBzaXplb2YoKm1hZHQpOwotICAgIC8qCi0gICAg ICogRklYTUU6IHRoZSBjdXJyZW50IHZJTy1BUElDIGNvZGUganVzdCBzdXBwb3J0cyBvbmUgSU8t QVBJQyBpbnN0YW5jZQotICAgICAqIHBlciBkb21haW4uIFRoaXMgbXVzdCBiZSBmaXhlZCBpbiBv cmRlciB0byBwcm92aWRlIHRoZSBzYW1lIGFtb3VudCBvZgotICAgICAqIElPIEFQSUNzIGFzIGF2 YWlsYWJsZSBvbiBiYXJlIG1ldGFsLgotICAgICAqLwotICAgIHNpemUgKz0gc2l6ZW9mKCppb19h cGljKTsKLSAgICBzaXplICs9IHNpemVvZigqaW50c3Jjb3ZyKSAqIGFjcGlfaW50cl9vdmVycmlk ZXM7Ci0gICAgc2l6ZSArPSBzaXplb2YoKm5taXNyYykgKiBhY3BpX25taV9zb3VyY2VzOwotICAg IHNpemUgKz0gc2l6ZW9mKCp4MmFwaWMpICogbWF4X3ZjcHVzOwotCi0gICAgbWFkdCA9IHh6YWxs b2NfYnl0ZXMoc2l6ZSk7Ci0gICAgaWYgKCAhbWFkdCApCi0gICAgewotICAgICAgICBwcmludGso IlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1BRFQgdGFibGVcbiIpOwotICAgICAgICBy YyA9IC1FTk9NRU07Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIC8qIENvcHkgdGhl IG5hdGl2ZSBNQURUIHRhYmxlIGhlYWRlci4gKi8KLSAgICBzdGF0dXMgPSBhY3BpX2dldF90YWJs ZShBQ1BJX1NJR19NQURULCAwLCAmdGFibGUpOwotICAgIGlmICggIUFDUElfU1VDQ0VTUyhzdGF0 dXMpICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiRmFpbGVkIHRvIGdldCBNQURUIEFDUEkgdGFi bGUsIGFib3J0aW5nLlxuIik7Ci0gICAgICAgIHJjID0gLUVJTlZBTDsKLSAgICAgICAgZ290byBv dXQ7Ci0gICAgfQotICAgIG1hZHQtPmhlYWRlciA9ICp0YWJsZTsKLSAgICBtYWR0LT5hZGRyZXNz ID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKLSAgICAvKgotICAgICAqIE5COiB0aGlzIGlzIGN1 cnJlbnRseSBzZXQgdG8gNCwgd2hpY2ggaXMgdGhlIHJldmlzaW9uIGluIHRoZSBBQ1BJCi0gICAg ICogc3BlYyA2LjEuIFNhZGx5IEFDUElDQSBkb2Vzbid0IHByb3ZpZGUgcmV2aXNpb24gbnVtYmVy cyBmb3IgdGhlCi0gICAgICogdGFibGVzIGRlc2NyaWJlZCBpbiB0aGUgaGVhZGVycy4KLSAgICAg Ki8KLSAgICBtYWR0LT5oZWFkZXIucmV2aXNpb24gPSBtaW5fdCh1bnNpZ25lZCBjaGFyLCB0YWJs ZS0+cmV2aXNpb24sIDQpOwotCi0gICAgLyoKLSAgICAgKiBTZXR1cCB0aGUgSU8gQVBJQyBlbnRy eS4KLSAgICAgKiBGSVhNRTogdGhlIGN1cnJlbnQgdklPLUFQSUMgY29kZSBqdXN0IHN1cHBvcnRz IG9uZSBJTy1BUElDIGluc3RhbmNlCi0gICAgICogcGVyIGRvbWFpbi4gVGhpcyBtdXN0IGJlIGZp eGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHNhbWUgYW1vdW50IG9mCi0gICAgICogSU8gQVBJ Q3MgYXMgYXZhaWxhYmxlIG9uIGJhcmUgbWV0YWwsIGFuZCB3aXRoIHRoZSBzYW1lIElEcyBhcyBm b3VuZCBpbgotICAgICAqIHRoZSBuYXRpdmUgSU8gQVBJQyBNQURUIGVudHJpZXMuCi0gICAgICov Ci0gICAgaWYgKCBucl9pb2FwaWNzID4gMSApCi0gICAgICAgIHByaW50aygiV0FSTklORzogZm91 bmQgJWQgSU8gQVBJQ3MsIERvbTAgd2lsbCBvbmx5IGhhdmUgYWNjZXNzIHRvIDEgZW11bGF0ZWQg SU8gQVBJQ1xuIiwKLSAgICAgICAgICAgICAgIG5yX2lvYXBpY3MpOwotICAgIGlvX2FwaWMgPSAo dm9pZCAqKShtYWR0ICsgMSk7Ci0gICAgaW9fYXBpYy0+aGVhZGVyLnR5cGUgPSBBQ1BJX01BRFRf VFlQRV9JT19BUElDOwotICAgIGlvX2FwaWMtPmhlYWRlci5sZW5ndGggPSBzaXplb2YoKmlvX2Fw aWMpOwotICAgIGlvX2FwaWMtPmlkID0gZG9tYWluX3Zpb2FwaWMoZCktPmlkOwotICAgIGlvX2Fw aWMtPmFkZHJlc3MgPSBWSU9BUElDX0RFRkFVTFRfQkFTRV9BRERSRVNTOwotCi0gICAgeDJhcGlj ID0gKHZvaWQgKikoaW9fYXBpYyArIDEpOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbWF4X3ZjcHVz OyBpKysgKQotICAgIHsKLSAgICAgICAgeDJhcGljLT5oZWFkZXIudHlwZSA9IEFDUElfTUFEVF9U WVBFX0xPQ0FMX1gyQVBJQzsKLSAgICAgICAgeDJhcGljLT5oZWFkZXIubGVuZ3RoID0gc2l6ZW9m KCp4MmFwaWMpOwotICAgICAgICB4MmFwaWMtPnVpZCA9IGk7Ci0gICAgICAgIHgyYXBpYy0+bG9j YWxfYXBpY19pZCA9IGkgKiAyOwotICAgICAgICB4MmFwaWMtPmxhcGljX2ZsYWdzID0gQUNQSV9N QURUX0VOQUJMRUQ7Ci0gICAgICAgIHgyYXBpYysrOwotICAgIH0KLQotICAgIC8qIFNldHVwIGlu dGVycnVwdCBvdmVycmlkZXMuICovCi0gICAgaW50c3Jjb3ZyID0gKHZvaWQgKil4MmFwaWM7Ci0g ICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0lOVEVSUlVQVF9PVkVSUklE RSwgYWNwaV9zZXRfaW50cl9vdnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfaW50 cl9vdmVycmlkZXMpOwotCi0gICAgLyogU2V0dXAgTk1JIHNvdXJjZXMuICovCi0gICAgbm1pc3Jj ID0gKHZvaWQgKilpbnRzcmNvdnI7Ci0gICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFE VF9UWVBFX05NSV9TT1VSQ0UsIGFjcGlfc2V0X25taV9zcmMsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgIGFjcGlfbm1pX3NvdXJjZXMpOwotCi0gICAgQVNTRVJUKCgodm9pZCAqKW5taXNyYyAt ICh2b2lkICopbWFkdCkgPT0gc2l6ZSk7Ci0gICAgbWFkdC0+aGVhZGVyLmxlbmd0aCA9IHNpemU7 Ci0gICAgLyoKLSAgICAgKiBDYWxsaW5nIGFjcGlfdGJfY2hlY2tzdW0gaGVyZSBpcyBhIGxheWVy aW5nIHZpb2xhdGlvbiwgYnV0Ci0gICAgICogaW50cm9kdWNpbmcgYSB3cmFwcGVyIGZvciBzdWNo IHNpbXBsZSB1c2FnZSBzZWVtcyBvdmVya2lsbC4KLSAgICAgKi8KLSAgICBtYWR0LT5oZWFkZXIu Y2hlY2tzdW0gLT0gYWNwaV90Yl9jaGVja3N1bShBQ1BJX0NBU1RfUFRSKHU4LCBtYWR0KSwgc2l6 ZSk7Ci0KLSAgICAvKiBQbGFjZSB0aGUgbmV3IE1BRFQgaW4gZ3Vlc3QgbWVtb3J5IHNwYWNlLiAq LwotICAgIGlmICggcHZoX3N0ZWFsX3JhbShkLCBzaXplLCAwLCBHQig0KSwgYWRkcikgKQotICAg IHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gZmluZCBhbGxvY2F0ZSBndWVzdCBSQU0gZm9y IE1BRFRcbiIpOwotICAgICAgICByYyA9IC1FTk9NRU07Ci0gICAgICAgIGdvdG8gb3V0OwotICAg IH0KLQotICAgIC8qIE1hcmsgdGhpcyByZWdpb24gYXMgRTgyMF9BQ1BJLiAqLwotICAgIGlmICgg cHZoX2FkZF9tZW1fcmFuZ2UoZCwgKmFkZHIsICphZGRyICsgc2l6ZSwgRTgyMF9BQ1BJKSApCi0g ICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBNQURUIHJlZ2lvbiB0byBtZW1vcnkgbWFwXG4i KTsKLQotICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cygqYWRkciwgbWFkdCwgc2l6ZSwg ZC0+dmNwdVswXSk7Ci0gICAgaWYgKCByYyApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJs ZSB0byBjb3B5IE1BRFQgaW50byBndWVzdCBtZW1vcnlcbiIpOwotICAgICAgICBnb3RvIG91dDsK LSAgICB9Ci0KLSAgICByYyA9IDA7Ci0KLSBvdXQ6Ci0gICAgeGZyZWUobWFkdCk7Ci0KLSAgICBy ZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBib29sIF9faW5pdCBhY3BpX21lbW9yeV9iYW5uZWQodW5z aWduZWQgbG9uZyBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBtZm4sIG5yX3BhZ2Vz LCBpOwotCi0gICAgbWZuID0gUEZOX0RPV04oYWRkcmVzcyk7Ci0gICAgbnJfcGFnZXMgPSBQRk5f VVAoKGFkZHJlc3MgJiB+UEFHRV9NQVNLKSArIHNpemUpOwotICAgIGZvciAoIGkgPSAwIDsgaSA8 IG5yX3BhZ2VzOyBpKysgKQotICAgICAgICBpZiAoICFwYWdlX2lzX3JhbV90eXBlKG1mbiArIGks IFJBTV9UWVBFX1JFU0VSVkVEKSAmJgotICAgICAgICAgICAgICFwYWdlX2lzX3JhbV90eXBlKG1m biArIGksIFJBTV9UWVBFX0FDUEkpICkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAg cmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBfX2luaXQgcHZoX2FjcGlfdGFibGVfYWxs b3dlZChjb25zdCBjaGFyICpzaWcpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgX19pbml0Y29u c3QgYmFubmVkX3RhYmxlc1tdW0FDUElfTkFNRV9TSVpFXSA9IHsKLSAgICAgICAgQUNQSV9TSUdf SFBFVCwgQUNQSV9TSUdfU0xJVCwgQUNQSV9TSUdfU1JBVCwgQUNQSV9TSUdfTVBTVCwKLSAgICAg ICAgQUNQSV9TSUdfUE1UVCwgQUNQSV9TSUdfTUFEVCwgQUNQSV9TSUdfRE1BUn07Ci0gICAgdW5z aWduZWQgaW50IGk7Ci0KLSAgICBmb3IgKCBpID0gMCA7IGkgPCBBUlJBWV9TSVpFKGJhbm5lZF90 YWJsZXMpOyBpKysgKQotICAgICAgICBpZiAoIHN0cm5jbXAoc2lnLCBiYW5uZWRfdGFibGVzW2ld LCBBQ1BJX05BTUVfU0laRSkgPT0gMCApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg ICAvKiBNYWtlIHN1cmUgdGFibGUgZG9lc24ndCByZXNpZGUgaW4gYSBSQU0gcmVnaW9uLiAqLwot ICAgIGlmICggYWNwaV9tZW1vcnlfYmFubmVkKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJs ZXNbaV0uYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9yb290 X3RhYmxlX2xpc3QudGFibGVzW2ldLmxlbmd0aCkgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJT a2lwcGluZyB0YWJsZSAlLjRzIGJlY2F1c2UgcmVzaWRlcyBpbiBhIG5vbi1BQ1BJLCBub24tcmVz ZXJ2ZWQgcmVnaW9uXG4iLAotICAgICAgICAgICAgICAgc2lnKTsKLSAgICAgICAgcmV0dXJuIGZh bHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBw dmhfc2V0dXBfYWNwaV94c2R0KHN0cnVjdCBkb21haW4gKmQsIHBhZGRyX3QgbWFkdF9hZGRyLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkcl90ICphZGRyKQotewot ICAgIHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQgKnhzZHQ7Ci0gICAgc3RydWN0IGFjcGlfdGFibGVf aGVhZGVyICp0YWJsZTsKLSAgICBzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwOwotICAgIHVu c2lnbmVkIGxvbmcgc2l6ZSA9IHNpemVvZigqeHNkdCk7Ci0gICAgdW5zaWduZWQgaW50IGksIGos IG51bV90YWJsZXMgPSAwOwotICAgIHBhZGRyX3QgeHNkdF9wYWRkcjsKLSAgICBpbnQgcmM7Ci0K LSAgICAvKgotICAgICAqIFJlc3RvcmUgb3JpZ2luYWwgRE1BUiB0YWJsZSBzaWduYXR1cmUsIHdl IGFyZSBnb2luZyB0byBmaWx0ZXIgaXQgZnJvbQotICAgICAqIHRoZSBuZXcgWFNEVCB0aGF0IGlz IHByZXNlbnRlZCB0byB0aGUgZ3Vlc3QsIHNvIGl0IGlzIG5vIGxvbmdlcgotICAgICAqIG5lY2Vz c2FyeSB0byBoYXZlIGl0J3Mgc2lnbmF0dXJlIHphcHBlZC4KLSAgICAgKi8KLSAgICBhY3BpX2Rt YXJfcmVpbnN0YXRlKCk7Ci0KLSAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHRhYmxlcyB0aGF0 IHdpbGwgYmUgYWRkZWQgdG8gdGhlIFhTRFQuICovCi0gICAgZm9yKCBpID0gMDsgaSA8IGFjcGlf Z2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICAgIGNvbnN0IGNo YXIgKnNpZyA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlLmFz Y2lpOwotCi0gICAgICAgIGlmICggcHZoX2FjcGlfdGFibGVfYWxsb3dlZChzaWcpICkKLSAgICAg ICAgICAgIG51bV90YWJsZXMrKzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE5vIG5lZWQgdG8g YWRkIG9yIHN1YnRyYWN0IGFueXRoaW5nIGJlY2F1c2Ugc3RydWN0IGFjcGlfdGFibGVfeHNkdAot ICAgICAqIGluY2x1ZGVzIG9uZSBhcnJheSBzbG90IGFscmVhZHksIGFuZCB3ZSBoYXZlIGZpbHRl cmVkIG91dCB0aGUgb3JpZ2luYWwKLSAgICAgKiBNQURUIGFuZCB3ZSBhcmUgZ29pbmcgdG8gYWRk IGEgY3VzdG9tIGJ1aWx0IE1BRFQuCi0gICAgICovCi0gICAgc2l6ZSArPSBudW1fdGFibGVzICog c2l6ZW9mKHhzZHQtPnRhYmxlX29mZnNldF9lbnRyeVswXSk7Ci0KLSAgICB4c2R0ID0geHphbGxv Y19ieXRlcyhzaXplKTsKLSAgICBpZiAoICF4c2R0ICkKLSAgICB7Ci0gICAgICAgIHByaW50aygi VW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgWFNEVCB0YWJsZVxuIik7Ci0gICAgICAgIHJj ID0gLUVOT01FTTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgLyogQ29weSB0aGUg bmF0aXZlIFhTRFQgdGFibGUgaGVhZGVyLiAqLwotICAgIHJzZHAgPSBhY3BpX29zX21hcF9tZW1v cnkoYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKCksIHNpemVvZigqcnNkcCkpOwotICAgIGlmICgg IXJzZHAgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gbWFwIFJTRFBcbiIpOwot ICAgICAgICByYyA9IC1FSU5WQUw7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICB4c2R0 X3BhZGRyID0gcnNkcC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOwotICAgIGFjcGlfb3NfdW5tYXBf bWVtb3J5KHJzZHAsIHNpemVvZigqcnNkcCkpOwotICAgIHRhYmxlID0gYWNwaV9vc19tYXBfbWVt b3J5KHhzZHRfcGFkZHIsIHNpemVvZigqdGFibGUpKTsKLSAgICBpZiAoICF0YWJsZSApCi0gICAg ewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBtYXAgWFNEVFxuIik7Ci0gICAgICAgIHJjID0g LUVJTlZBTDsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHhzZHQtPmhlYWRlciA9ICp0 YWJsZTsKLSAgICBhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwgc2l6ZW9mKCp0YWJsZSkpOwot Ci0gICAgLyogQWRkIHRoZSBjdXN0b20gTUFEVC4gKi8KLSAgICB4c2R0LT50YWJsZV9vZmZzZXRf ZW50cnlbMF0gPSBtYWR0X2FkZHI7Ci0KLSAgICAvKiBDb3B5IHRoZSBhZGRyZXNzZXMgb2YgdGhl IHJlc3Qgb2YgdGhlIGFsbG93ZWQgdGFibGVzLiAqLwotICAgIGZvciggaSA9IDAsIGogPSAxOyBp IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyBpKysgKQotICAgIHsKLSAgICAgICAg Y29uc3QgY2hhciAqc2lnID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5zaWdu YXR1cmUuYXNjaWk7Ci0KLSAgICAgICAgaWYgKCBwdmhfYWNwaV90YWJsZV9hbGxvd2VkKHNpZykg KQotICAgICAgICAgICAgeHNkdC0+dGFibGVfb2Zmc2V0X2VudHJ5W2orK10gPQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ld LmFkZHJlc3M7Ci0gICAgfQotCi0gICAgeHNkdC0+aGVhZGVyLnJldmlzaW9uID0gMTsKLSAgICB4 c2R0LT5oZWFkZXIubGVuZ3RoID0gc2l6ZTsKLSAgICAvKgotICAgICAqIENhbGxpbmcgYWNwaV90 Yl9jaGVja3N1bSBoZXJlIGlzIGEgbGF5ZXJpbmcgdmlvbGF0aW9uLCBidXQKLSAgICAgKiBpbnRy b2R1Y2luZyBhIHdyYXBwZXIgZm9yIHN1Y2ggc2ltcGxlIHVzYWdlIHNlZW1zIG92ZXJraWxsLgot ICAgICAqLwotICAgIHhzZHQtPmhlYWRlci5jaGVja3N1bSAtPSBhY3BpX3RiX2NoZWNrc3VtKEFD UElfQ0FTVF9QVFIodTgsIHhzZHQpLCBzaXplKTsKLQotICAgIC8qIFBsYWNlIHRoZSBuZXcgWFNE VCBpbiBndWVzdCBtZW1vcnkgc3BhY2UuICovCi0gICAgaWYgKCBwdmhfc3RlYWxfcmFtKGQsIHNp emUsIDAsIEdCKDQpLCBhZGRyKSApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBm aW5kIGd1ZXN0IFJBTSBmb3IgWFNEVFxuIik7Ci0gICAgICAgIHJjID0gLUVOT01FTTsKLSAgICAg ICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgLyogTWFyayB0aGlzIHJlZ2lvbiBhcyBFODIwX0FD UEkuICovCi0gICAgaWYgKCBwdmhfYWRkX21lbV9yYW5nZShkLCAqYWRkciwgKmFkZHIgKyBzaXpl LCBFODIwX0FDUEkpICkKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWRkIFhTRFQgcmVnaW9u IHRvIG1lbW9yeSBtYXBcbiIpOwotCi0gICAgcmMgPSBodm1fY29weV90b19ndWVzdF9waHlzKCph ZGRyLCB4c2R0LCBzaXplLCBkLT52Y3B1WzBdKTsKLSAgICBpZiAoIHJjICkKLSAgICB7Ci0gICAg ICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgWFNEVCBpbnRvIGd1ZXN0IG1lbW9yeVxuIik7Ci0g ICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIHJjID0gMDsKLQotIG91dDoKLSAgICB4ZnJl ZSh4c2R0KTsKLQotICAgIHJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHZoX3Nl dHVwX2FjcGkoc3RydWN0IGRvbWFpbiAqZCwgcGFkZHJfdCBzdGFydF9pbmZvKQotewotICAgIHVu c2lnbmVkIGxvbmcgcGZuLCBucl9wYWdlczsKLSAgICBwYWRkcl90IG1hZHRfcGFkZHIsIHhzZHRf cGFkZHIsIHJzZHBfcGFkZHI7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgaW50IHJjOwotICAg IHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAgKm5hdGl2ZV9yc2RwLCByc2RwID0gewotICAgICAgICAu c2lnbmF0dXJlID0gQUNQSV9TSUdfUlNEUCwKLSAgICAgICAgLnJldmlzaW9uID0gMiwKLSAgICAg ICAgLmxlbmd0aCA9IHNpemVvZihyc2RwKSwKLSAgICB9OwotCi0KLSAgICAvKiBTY2FuIHRvcC1s ZXZlbCB0YWJsZXMgYW5kIGFkZCB0aGVpciByZWdpb25zIHRvIHRoZSBndWVzdCBtZW1vcnkgbWFw LiAqLwotICAgIGZvciggaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7 IGkrKyApCi0gICAgewotICAgICAgICBjb25zdCBjaGFyICpzaWcgPSBhY3BpX2dibF9yb290X3Rh YmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZS5hc2NpaTsKLSAgICAgICAgdW5zaWduZWQgbG9u ZyBhZGRyID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5hZGRyZXNzOwotICAg ICAgICB1bnNpZ25lZCBsb25nIHNpemUgPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVz W2ldLmxlbmd0aDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIG9yaWdp bmFsIE1BRFQgaXMgYWxzbyBtYXBwZWQsIHNvIHRoYXQgRG9tMCBjYW4KLSAgICAgICAgICogcHJv cGVybHkgYWNjZXNzIHRoZSBkYXRhIHJldHVybmVkIGJ5IF9NQVQgbWV0aG9kcyBpbiBjYXNlIGl0 J3MKLSAgICAgICAgICogcmUtdXNpbmcgTUFEVCBtZW1vcnkuCi0gICAgICAgICAqLwotICAgICAg ICBpZiAoIHN0cm5jbXAoc2lnLCBBQ1BJX1NJR19NQURULCBBQ1BJX05BTUVfU0laRSkKLSAgICAg ICAgICAgICA/IHB2aF9hY3BpX3RhYmxlX2FsbG93ZWQoc2lnKQotICAgICAgICAgICAgIDogIWFj cGlfbWVtb3J5X2Jhbm5lZChhZGRyLCBzaXplKSApCi0gICAgICAgICAgICAgcHZoX2FkZF9tZW1f cmFuZ2UoZCwgYWRkciwgYWRkciArIHNpemUsIEU4MjBfQUNQSSk7Ci0gICAgfQotCi0gICAgLyog SWRlbnRpdHkgbWFwIEFDUEkgZTgyMCByZWdpb25zLiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwg ZC0+YXJjaC5ucl9lODIwOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKCBkLT5hcmNoLmU4MjBb aV0udHlwZSAhPSBFODIwX0FDUEkgJiYKLSAgICAgICAgICAgICBkLT5hcmNoLmU4MjBbaV0udHlw ZSAhPSBFODIwX05WUyApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBwZm4gPSBQ Rk5fRE9XTihkLT5hcmNoLmU4MjBbaV0uYWRkcik7Ci0gICAgICAgIG5yX3BhZ2VzID0gUEZOX1VQ KChkLT5hcmNoLmU4MjBbaV0uYWRkciAmIH5QQUdFX01BU0spICsKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnNpemUpOwotCi0gICAgICAgIHJjID0gbW9kaWZ5X2lk ZW50aXR5X21taW8oZCwgcGZuLCBucl9wYWdlcywgdHJ1ZSk7Ci0gICAgICAgIGlmICggcmMgKQot ICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIkZhaWxlZCB0byBtYXAgQUNQSSByZWdpb24g WyUjbHgsICUjbHgpIGludG8gRG9tMCBtZW1vcnkgbWFwXG4iLAotICAgICAgICAgICAgICAgICAg IHBmbiwgcGZuICsgbnJfcGFnZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICB9 Ci0gICAgfQotCi0gICAgcmMgPSBwdmhfc2V0dXBfYWNwaV9tYWR0KGQsICZtYWR0X3BhZGRyKTsK LSAgICBpZiAoIHJjICkKLSAgICAgICAgcmV0dXJuIHJjOwotCi0gICAgcmMgPSBwdmhfc2V0dXBf YWNwaV94c2R0KGQsIG1hZHRfcGFkZHIsICZ4c2R0X3BhZGRyKTsKLSAgICBpZiAoIHJjICkKLSAg ICAgICAgcmV0dXJuIHJjOwotCi0gICAgLyogQ3JhZnQgYSBjdXN0b20gUlNEUC4gKi8KLSAgICBu YXRpdmVfcnNkcCA9IGFjcGlfb3NfbWFwX21lbW9yeShhY3BpX29zX2dldF9yb290X3BvaW50ZXIo KSwgc2l6ZW9mKHJzZHApKTsKLSAgICBpZiAoICFuYXRpdmVfcnNkcCApCi0gICAgewotICAgICAg ICBwcmludGsoIkZhaWxlZCB0byBtYXAgbmF0aXZlIFJTRFBcbiIpOwotICAgICAgICByZXR1cm4g LUVOT01FTTsKLSAgICB9Ci0gICAgbWVtY3B5KHJzZHAub2VtX2lkLCBuYXRpdmVfcnNkcC0+b2Vt X2lkLCBzaXplb2YocnNkcC5vZW1faWQpKTsKLSAgICBhY3BpX29zX3VubWFwX21lbW9yeShuYXRp dmVfcnNkcCwgc2l6ZW9mKHJzZHApKTsKLSAgICByc2RwLnhzZHRfcGh5c2ljYWxfYWRkcmVzcyA9 IHhzZHRfcGFkZHI7Ci0gICAgLyoKLSAgICAgKiBDYWxsaW5nIGFjcGlfdGJfY2hlY2tzdW0gaGVy ZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbiwgYnV0Ci0gICAgICogaW50cm9kdWNpbmcgYSB3cmFw cGVyIGZvciBzdWNoIHNpbXBsZSB1c2FnZSBzZWVtcyBvdmVya2lsbC4KLSAgICAgKi8KLSAgICBy c2RwLmNoZWNrc3VtIC09IGFjcGlfdGJfY2hlY2tzdW0oQUNQSV9DQVNUX1BUUih1OCwgJnJzZHAp LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX1JTRFBfUkVWMF9T SVpFKTsKLSAgICByc2RwLmV4dGVuZGVkX2NoZWNrc3VtIC09IGFjcGlfdGJfY2hlY2tzdW0oQUNQ SV9DQVNUX1BUUih1OCwgJnJzZHApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzaXplb2YocnNkcCkpOwotCi0gICAgLyoKLSAgICAgKiBQbGFjZSB0aGUg bmV3IFJTRFAgaW4gZ3Vlc3QgbWVtb3J5IHNwYWNlLgotICAgICAqCi0gICAgICogTkI6IHRoaXMg UlNEUCBpcyBub3QgZ29pbmcgdG8gcmVwbGFjZSB0aGUgb3JpZ2luYWwgUlNEUCwgd2hpY2ggc2hv dWxkCi0gICAgICogc3RpbGwgYmUgYWNjZXNzaWJsZSB0byB0aGUgZ3Vlc3QuIEhvd2V2ZXIgdGhh dCBSU0RQIGlzIGdvaW5nIHRvIHBvaW50IHRvCi0gICAgICogdGhlIG5hdGl2ZSBSU0RULCBhbmQg c2hvdWxkIG5vdCBiZSB1c2VkIGZvciB0aGUgRG9tMCBrZXJuZWwncyBib290Ci0gICAgICogcHVy cG9zZXMgKHdlIGtlZXAgaXQgdmlzaWJsZSBmb3IgcG9zdCBib290IGFjY2VzcykuCi0gICAgICov Ci0gICAgaWYgKCBwdmhfc3RlYWxfcmFtKGQsIHNpemVvZihyc2RwKSwgMCwgR0IoNCksICZyc2Rw X3BhZGRyKSApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBndWVz dCBSQU0gZm9yIFJTRFBcbiIpOwotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0KLSAg ICAvKiBNYXJrIHRoaXMgcmVnaW9uIGFzIEU4MjBfQUNQSS4gKi8KLSAgICBpZiAoIHB2aF9hZGRf bWVtX3JhbmdlKGQsIHJzZHBfcGFkZHIsIHJzZHBfcGFkZHIgKyBzaXplb2YocnNkcCksCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICBFODIwX0FDUEkpICkKLSAgICAgICAgcHJpbnRrKCJVbmFi bGUgdG8gYWRkIFJTRFAgcmVnaW9uIHRvIG1lbW9yeSBtYXBcbiIpOwotCi0gICAgLyogQ29weSBS U0RQIGludG8gZ3Vlc3QgbWVtb3J5LiAqLwotICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5 cyhyc2RwX3BhZGRyLCAmcnNkcCwgc2l6ZW9mKHJzZHApLCBkLT52Y3B1WzBdKTsKLSAgICBpZiAo IHJjICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgUlNEUCBpbnRvIGd1 ZXN0IG1lbW9yeVxuIik7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICAvKiBDb3B5 IFJTRFAgYWRkcmVzcyB0byBzdGFydF9pbmZvLiAqLwotICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vl c3RfcGh5cyhzdGFydF9pbmZvICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zm c2V0b2Yoc3RydWN0IGh2bV9zdGFydF9pbmZvLCByc2RwX3BhZGRyKSwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJnJzZHBfcGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNpemVvZigoKHN0cnVjdCBodm1fc3RhcnRfaW5mbyAqKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDApLT5yc2RwX3BhZGRyKSwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZC0+dmNwdVswXSk7Ci0gICAgaWYgKCByYyApCi0gICAgewotICAg ICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IFJTRFAgaW50byBndWVzdCBtZW1vcnlcbiIpOwot ICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBp bnQgX19pbml0IGNvbnN0cnVjdF9kb20wX3B2aChzdHJ1Y3QgZG9tYWluICpkLCBjb25zdCBtb2R1 bGVfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWdu ZWQgbG9uZyBpbWFnZV9oZWFkcm9vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBtb2R1bGVfdCAqaW5pdHJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHZvaWQgKigqYm9vdHN0cmFwX21hcCkoY29uc3QgbW9kdWxlX3QgKiksCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21kbGluZSkKLXsKLSAgICBwYWRkcl90 IGVudHJ5LCBzdGFydF9pbmZvOwotICAgIGludCByYzsKLQotICAgIHByaW50aygiKiogQnVpbGRp bmcgYSBQVkggRG9tMCAqKlxuIik7Ci0KLSAgICBpb21tdV9od2RvbV9pbml0KGQpOwotCi0gICAg cmMgPSBwdmhfc2V0dXBfcDJtKGQpOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJp bnRrKCJGYWlsZWQgdG8gc2V0dXAgRG9tMCBwaHlzaWNhbCBtZW1vcnkgbWFwXG4iKTsKLSAgICAg ICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJjID0gcHZoX2xvYWRfa2VybmVsKGQsIGltYWdl LCBpbWFnZV9oZWFkcm9vbSwgaW5pdHJkLCBib290c3RyYXBfbWFwKGltYWdlKSwKLSAgICAgICAg ICAgICAgICAgICAgICAgICBjbWRsaW5lLCAmZW50cnksICZzdGFydF9pbmZvKTsKLSAgICBpZiAo IHJjICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiRmFpbGVkIHRvIGxvYWQgRG9tMCBrZXJuZWxc biIpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcmMgPSBwdmhfc2V0dXBfY3B1 cyhkLCBlbnRyeSwgc3RhcnRfaW5mbyk7Ci0gICAgaWYgKCByYyApCi0gICAgewotICAgICAgICBw cmludGsoIkZhaWxlZCB0byBzZXR1cCBEb20wIENQVXM6ICVkXG4iLCByYyk7Ci0gICAgICAgIHJl dHVybiByYzsKLSAgICB9Ci0KLSAgICByYyA9IHB2aF9zZXR1cF9hY3BpKGQsIHN0YXJ0X2luZm8p OwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gc2V0dXAg RG9tMCBBQ1BJIHRhYmxlczogJWRcbiIsIHJjKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0K LQotICAgIHBhbmljKCJCdWlsZGluZyBhIFBWSHYyIERvbTAgaXMgbm90IHlldCBzdXBwb3J0ZWQu Iik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBfX2luaXQgY29uc3RydWN0X2RvbTAoc3RydWN0 IGRvbWFpbiAqZCwgY29uc3QgbW9kdWxlX3QgKmltYWdlLAogICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nIGltYWdlX2hlYWRyb29tLCBtb2R1bGVfdCAqaW5pdHJkLAogICAg ICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKmJvb3RzdHJhcF9tYXApKGNvbnN0IG1vZHVs ZV90ICopLApAQCAtMTU0OSw3ICs0ODQsNyBAQCBpbnQgX19pbml0IGNvbnN0cnVjdF9kb20wKHN0 cnVjdCBkb21haW4gKmQsIGNvbnN0IG1vZHVsZV90ICppbWFnZSwKIAogICAgIHByb2Nlc3NfcGVu ZGluZ19zb2Z0aXJxcygpOwogCi0gICAgcmV0dXJuIChpc19odm1fZG9tYWluKGQpID8gY29uc3Ry dWN0X2RvbTBfcHZoIDogZG9tMF9jb25zdHJ1Y3RfcHYpCisgICAgcmV0dXJuIChpc19odm1fZG9t YWluKGQpID8gZG9tMF9jb25zdHJ1Y3RfcHZoIDogZG9tMF9jb25zdHJ1Y3RfcHYpCiAgICAgICAg ICAgIChkLCBpbWFnZSwgaW1hZ2VfaGVhZHJvb20sIGluaXRyZCxib290c3RyYXBfbWFwLCBjbWRs aW5lKTsKIH0KIApkaWZmIC0tZ2l0IGEveGVuL2FyY2gveDg2L2h2bS9NYWtlZmlsZSBiL3hlbi9h cmNoL3g4Ni9odm0vTWFrZWZpbGUKaW5kZXggZWMwZGFhZTBlYS4uMGEzZDBmNGY3ZSAxMDA2NDQK LS0tIGEveGVuL2FyY2gveDg2L2h2bS9NYWtlZmlsZQorKysgYi94ZW4vYXJjaC94ODYvaHZtL01h a2VmaWxlCkBAIC0zLDYgKzMsNyBAQCBzdWJkaXIteSArPSB2bXgKIAogb2JqLXkgKz0gYXNpZC5v CiBvYmoteSArPSBkbS5vCitvYmotYmluLXkgKz0gZG9tMF9idWlsZC5pbml0Lm8KIG9iai15ICs9 IGVtdWxhdGUubwogb2JqLXkgKz0gaHBldC5vCiBvYmoteSArPSBodm0ubwpkaWZmIC0tZ2l0IGEv eGVuL2FyY2gveDg2L2h2bS9kb20wX2J1aWxkLmMgYi94ZW4vYXJjaC94ODYvaHZtL2RvbTBfYnVp bGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4wNGE2NTg5OWY1Ci0t LSAvZGV2L251bGwKKysrIGIveGVuL2FyY2gveDg2L2h2bS9kb20wX2J1aWxkLmMKQEAgLTAsMCAr MSwxMTE0IEBACisvKgorICogaHZtL2RvbTBfYnVpbGQuYworICoKKyAqIERvbTAgYnVpbGRlciBm b3IgUFZIIGd1ZXN0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBDaXRyaXggU3lzdGVtcyBS JkQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRp b25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBw cm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3 YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07 IElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5j bHVkZSA8eGVuL2FjcGkuaD4KKyNpbmNsdWRlIDx4ZW4vaW5pdC5oPgorI2luY2x1ZGUgPHhlbi9s aWJlbGYuaD4KKyNpbmNsdWRlIDx4ZW4vbXVsdGlib290Lmg+CisjaW5jbHVkZSA8eGVuL3NvZnRp cnEuaD4KKworI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KKworI2luY2x1ZGUgPGFzbS9iemlt YWdlLmg+CisjaW5jbHVkZSA8YXNtL2RvbTBfYnVpbGQuaD4KKyNpbmNsdWRlIDxhc20vaHZtL3N1 cHBvcnQuaD4KKyNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9wMm0uaD4K KyNpbmNsdWRlIDxhc20vcGFnaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNs dWRlIDxwdWJsaWMvYXJjaC14ODYvaHZtL3N0YXJ0X2luZm8uaD4KKyNpbmNsdWRlIDxwdWJsaWMv aHZtL2h2bV9pbmZvX3RhYmxlLmg+CisjaW5jbHVkZSA8cHVibGljL2h2bS9odm1fdmNwdS5oPgor CisvKgorICogSGF2ZSB0aGUgVFNTIGNvdmVyIHRoZSBJU0EgcG9ydCByYW5nZSwgd2hpY2ggbWFr ZXMgaXQKKyAqIC0gMTA0IGJ5dGVzIGJhc2Ugc3RydWN0dXJlCisgKiAtIDMyIGJ5dGVzIGludGVy cnVwdCByZWRpcmVjdGlvbiBiaXRtYXAKKyAqIC0gMTI4IGJ5dGVzIEkvTyBiaXRtYXAKKyAqIC0g b25lIHRyYWlsaW5nIGJ5dGUKKyAqIG9yIGEgdG90YWwgb2YgMjY1IGJ5dGVzLgorICoKKyAqIE5C OiBhcyBQVkh2MiBEb20wIGRvZXNuJ3QgaGF2ZSBsZWdhY3kgZGV2aWNlcyAoSVNBKSwgaXQgc2hv dWxkbid0IGhhdmUgYW55CisgKiBidXNpbmVzcyBpbiBhY2Nlc3NpbmcgdGhlIElTQSBwb3J0IHJh bmdlLCBtdWNoIGxlc3MgaW4gcmVhbCBtb2RlLCBhbmQgZHVlIHRvCisgKiB0aGUgbGFjayBvZiBm aXJtd2FyZSBpdCBzaG91bGRuJ3QgYWxzbyBleGVjdXRlIGFueSBJTlQgaW5zdHJ1Y3Rpb24uIFRo aXMgaXMKKyAqIGRvbmUganVzdCBmb3IgY29uc2lzdGVuY3kgd2l0aCB3aGF0IGh2bWxvYWRlciBk b2VzLgorICovCisjZGVmaW5lIEhWTV9WTTg2X1RTU19TSVpFIDI2NQorCitzdGF0aWMgdW5zaWdu ZWQgaW50IF9faW5pdGRhdGEgYWNwaV9pbnRyX292ZXJyaWRlczsKK3N0YXRpYyBzdHJ1Y3QgYWNw aV9tYWR0X2ludGVycnVwdF9vdmVycmlkZSBfX2luaXRkYXRhICppbnRzcmNvdnI7CisKK3N0YXRp YyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBhY3BpX25taV9zb3VyY2VzOworc3RhdGljIHN0cnVj dCBhY3BpX21hZHRfbm1pX3NvdXJjZSBfX2luaXRkYXRhICpubWlzcmM7CisKK3N0YXRpYyBpbnQg X19pbml0IG1vZGlmeV9pZGVudGl0eV9tbWlvKHN0cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGxv bmcgcGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg bG9uZyBucl9wYWdlcywgY29uc3QgYm9vbCBtYXApCit7CisgICAgaW50IHJjOworCisgICAgZm9y ICggOyA7ICkKKyAgICB7CisgICAgICAgIHJjID0gKG1hcCA/IG1hcF9tbWlvX3JlZ2lvbnMgOiB1 bm1hcF9tbWlvX3JlZ2lvbnMpCisgICAgICAgICAgICAgKGQsIF9nZm4ocGZuKSwgbnJfcGFnZXMs IF9tZm4ocGZuKSk7CisgICAgICAgIGlmICggcmMgPT0gMCApCisgICAgICAgICAgICBicmVhazsK KyAgICAgICAgaWYgKCByYyA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoWEVO TE9HX1dBUk5JTkcKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGlkZW50aXR5ICVzbWFw IFslI2x4LCUjbHgpIGZvciBkJWQ6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIG1hcCA/ICIi IDogInVuIiwgcGZuLCBwZm4gKyBucl9wYWdlcywgZC0+ZG9tYWluX2lkLCByYyk7CisgICAgICAg ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBucl9wYWdlcyAtPSByYzsKKyAgICAgICAg cGZuICs9IHJjOworICAgICAgICBwcm9jZXNzX3BlbmRpbmdfc29mdGlycXMoKTsKKyAgICB9CisK KyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFBvcHVsYXRlIGEgSFZNIG1lbW9yeSByYW5nZSB1c2lu ZyB0aGUgYmlnZ2VzdCBwb3NzaWJsZSBvcmRlci4gKi8KK3N0YXRpYyBpbnQgX19pbml0IHB2aF9w b3B1bGF0ZV9tZW1vcnlfcmFuZ2Uoc3RydWN0IGRvbWFpbiAqZCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucl9wYWdl cykKK3sKKyAgICB1bnNpZ25lZCBpbnQgb3JkZXIsIGkgPSAwOworICAgIHN0cnVjdCBwYWdlX2lu Zm8gKnBhZ2U7CisgICAgaW50IHJjOworI2RlZmluZSBNQVBfTUFYX0lURVIgNjQKKworICAgIG9y ZGVyID0gTUFYX09SREVSOworICAgIHdoaWxlICggbnJfcGFnZXMgIT0gMCApCisgICAgeworICAg ICAgICB1bnNpZ25lZCBpbnQgcmFuZ2Vfb3JkZXIgPSBnZXRfb3JkZXJfZnJvbV9wYWdlcyhucl9w YWdlcyArIDEpOworCisgICAgICAgIG9yZGVyID0gbWluKHJhbmdlX29yZGVyID8gcmFuZ2Vfb3Jk ZXIgLSAxIDogMCwgb3JkZXIpOworICAgICAgICBwYWdlID0gYWxsb2NfZG9taGVhcF9wYWdlcyhk LCBvcmRlciwgZG9tMF9tZW1mbGFncyk7CisgICAgICAgIGlmICggcGFnZSA9PSBOVUxMICkKKyAg ICAgICAgeworICAgICAgICAgICAgaWYgKCBvcmRlciA9PSAwICYmIGRvbTBfbWVtZmxhZ3MgKQor ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRyeSBhZ2FpbiB3aXRob3V0IGFueSBk b20wX21lbWZsYWdzLiAqLworICAgICAgICAgICAgICAgIGRvbTBfbWVtZmxhZ3MgPSAwOworICAg ICAgICAgICAgICAgIG9yZGVyID0gTUFYX09SREVSOworICAgICAgICAgICAgICAgIGNvbnRpbnVl OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBvcmRlciA9PSAwICkKKyAgICAgICAg ICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkg d2l0aCBvcmRlciAwIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAg ICAgICAgICB9CisgICAgICAgICAgICBvcmRlci0tOworICAgICAgICAgICAgY29udGludWU7Cisg ICAgICAgIH0KKworICAgICAgICByYyA9IGd1ZXN0X3BoeXNtYXBfYWRkX3BhZ2UoZCwgX2dmbihz dGFydCksIF9tZm4ocGFnZV90b19tZm4ocGFnZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgb3JkZXIpOworICAgICAgICBpZiAoIHJjICE9IDAgKQorICAgICAgICB7Cisg ICAgICAgICAgICBwcmludGsoIkZhaWxlZCB0byBwb3B1bGF0ZSBtZW1vcnk6IFslI2x4LCVseCk6 ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBzdGFydCArICgxVUwgPDwgb3JkZXIp LCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICBz dGFydCArPSAxVUwgPDwgb3JkZXI7CisgICAgICAgIG5yX3BhZ2VzIC09IDFVTCA8PCBvcmRlcjsK KyAgICAgICAgaWYgKCAoKytpICUgTUFQX01BWF9JVEVSKSA9PSAwICkKKyAgICAgICAgICAgIHBy b2Nlc3NfcGVuZGluZ19zb2Z0aXJxcygpOworICAgIH0KKworICAgIHJldHVybiAwOworI3VuZGVm IE1BUF9NQVhfSVRFUgorfQorCisvKiBTdGVhbCBSQU0gZnJvbSB0aGUgZW5kIG9mIGEgbWVtb3J5 IHJlZ2lvbi4gKi8KK3N0YXRpYyBpbnQgX19pbml0IHB2aF9zdGVhbF9yYW0oc3RydWN0IGRvbWFp biAqZCwgdW5zaWduZWQgbG9uZyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB1bnNpZ25lZCBsb25nIGFsaWduLCBwYWRkcl90IGxpbWl0LAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwYWRkcl90ICphZGRyKQoreworICAgIHVuc2lnbmVkIGludCBpID0gZC0+ YXJjaC5ucl9lODIwOworCisgICAgLyoKKyAgICAgKiBBbGlnbm1lbnQgMCBzaG91bGQgYmUgc2V0 IHRvIDEsIHNvIGl0IGRvZXNuJ3Qgd3JhcCBhcm91bmQgaW4gdGhlCisgICAgICogY2FsY3VsYXRp b25zIGJlbG93LgorICAgICAqLworICAgIGFsaWduID0gYWxpZ24gPyA6IDE7CisgICAgd2hpbGUg KCBpLS0gKQorICAgIHsKKyAgICAgICAgc3RydWN0IGU4MjBlbnRyeSAqZW50cnkgPSAmZC0+YXJj aC5lODIwW2ldOworCisgICAgICAgIGlmICggZW50cnktPnR5cGUgIT0gRTgyMF9SQU0gfHwgZW50 cnktPmFkZHIgKyBlbnRyeS0+c2l6ZSA+IGxpbWl0IHx8CisgICAgICAgICAgICAgZW50cnktPmFk ZHIgPCBNQigxKSApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAqYWRkciA9IChl bnRyeS0+YWRkciArIGVudHJ5LT5zaXplIC0gc2l6ZSkgJiB+KGFsaWduIC0gMSk7CisgICAgICAg IGlmICggKmFkZHIgPCBlbnRyeS0+YWRkciApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAg ICAgICBlbnRyeS0+c2l6ZSA9ICphZGRyIC0gZW50cnktPmFkZHI7CisgICAgICAgIHJldHVybiAw OworICAgIH0KKworICAgIHJldHVybiAtRU5PTUVNOworfQorCisvKiBOQjogbWVtb3J5IG1hcCBt dXN0IGJlIHNvcnRlZCBhdCBhbGwgdGltZXMgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHkuICov CitzdGF0aWMgaW50IF9faW5pdCBwdmhfYWRkX21lbV9yYW5nZShzdHJ1Y3QgZG9tYWluICpkLCB1 aW50NjRfdCBzLCB1aW50NjRfdCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgaW50IHR5cGUpCit7CisgICAgc3RydWN0IGU4MjBlbnRyeSAqbWFwOworICAg IHVuc2lnbmVkIGludCBpOworCisgICAgZm9yICggaSA9IDA7IGkgPCBkLT5hcmNoLm5yX2U4MjA7 IGkrKyApCisgICAgeworICAgICAgICB1aW50NjRfdCBycyA9IGQtPmFyY2guZTgyMFtpXS5hZGRy OworICAgICAgICB1aW50NjRfdCByZSA9IHJzICsgZC0+YXJjaC5lODIwW2ldLnNpemU7CisKKyAg ICAgICAgaWYgKCBycyA9PSBlICYmIGQtPmFyY2guZTgyMFtpXS50eXBlID09IHR5cGUgKQorICAg ICAgICB7CisgICAgICAgICAgICBkLT5hcmNoLmU4MjBbaV0uYWRkciA9IHM7CisgICAgICAgICAg ICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmUgPT0gcyAmJiBkLT5hcmNo LmU4MjBbaV0udHlwZSA9PSB0eXBlICYmCisgICAgICAgICAgICAgKGkgKyAxID09IGQtPmFyY2gu bnJfZTgyMCB8fCBkLT5hcmNoLmU4MjBbaSArIDFdLmFkZHIgPj0gZSkgKQorICAgICAgICB7Cisg ICAgICAgICAgICBkLT5hcmNoLmU4MjBbaV0uc2l6ZSArPSBlIC0gczsKKyAgICAgICAgICAgIHJl dHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBycyA+PSBlICkKKyAgICAgICAgICAg IGJyZWFrOworCisgICAgICAgIGlmICggcmUgPiBzICkKKyAgICAgICAgICAgIHJldHVybiAtRUVY SVNUOworICAgIH0KKworICAgIG1hcCA9IHh6YWxsb2NfYXJyYXkoc3RydWN0IGU4MjBlbnRyeSwg ZC0+YXJjaC5ucl9lODIwICsgMSk7CisgICAgaWYgKCAhbWFwICkKKyAgICB7CisgICAgICAgIHBy aW50ayhYRU5MT0dfV0FSTklORyAiRTgyMDogb3V0IG9mIG1lbW9yeSB0byBhZGQgcmVnaW9uXG4i KTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgbWVtY3B5KG1hcCwgZC0+ YXJjaC5lODIwLCBpICogc2l6ZW9mKCpkLT5hcmNoLmU4MjApKTsKKyAgICBtZW1jcHkobWFwICsg aSArIDEsIGQtPmFyY2guZTgyMCArIGksCisgICAgICAgICAgIChkLT5hcmNoLm5yX2U4MjAgLSBp KSAqIHNpemVvZigqZC0+YXJjaC5lODIwKSk7CisgICAgbWFwW2ldLmFkZHIgPSBzOworICAgIG1h cFtpXS5zaXplID0gZSAtIHM7CisgICAgbWFwW2ldLnR5cGUgPSB0eXBlOworICAgIHhmcmVlKGQt PmFyY2guZTgyMCk7CisgICAgZC0+YXJjaC5lODIwID0gbWFwOworICAgIGQtPmFyY2gubnJfZTgy MCsrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHB2aF9zZXR1cF92 bXhfcmVhbG1vZGVfaGVscGVycyhzdHJ1Y3QgZG9tYWluICpkKQoreworICAgIHAybV90eXBlX3Qg cDJtdDsKKyAgICB1aW50MzJfdCByYywgKmlkZW50X3B0OworICAgIG1mbl90IG1mbjsKKyAgICBw YWRkcl90IGdhZGRyOworICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKKworICAgIC8q CisgICAgICogU3RlYWwgc29tZSBzcGFjZSBmcm9tIHRoZSBsYXN0IFJBTSByZWdpb24gYmVsb3cg NEdCIGFuZCB1c2UgaXQgdG8KKyAgICAgKiBzdG9yZSB0aGUgcmVhbC1tb2RlIFRTUy4gSXQgbmVl ZHMgdG8gYmUgYWxpZ25lZCB0byAxMjggc28gdGhhdCB0aGUKKyAgICAgKiBUU1Mgc3RydWN0dXJl ICh3aGljaCBhY2NvdW50cyBmb3IgdGhlIGZpcnN0IDEwNGIpIGRvZXNuJ3QgY3Jvc3MKKyAgICAg KiBhIHBhZ2UgYm91bmRhcnkuCisgICAgICovCisgICAgaWYgKCAhcHZoX3N0ZWFsX3JhbShkLCBI Vk1fVk04Nl9UU1NfU0laRSwgMTI4LCBHQig0KSwgJmdhZGRyKSApCisgICAgeworICAgICAgICBp ZiAoIGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMoZ2FkZHIsIE5VTEwsIEhWTV9WTTg2X1RTU19TSVpF LCB2KSAhPQorICAgICAgICAgICAgIEhWTUNPUFlfb2theSApCisgICAgICAgICAgICBwcmludGso IlVuYWJsZSB0byB6ZXJvIFZNODYgVFNTIGFyZWFcbiIpOworICAgICAgICBkLT5hcmNoLmh2bV9k b21haW4ucGFyYW1zW0hWTV9QQVJBTV9WTTg2X1RTU19TSVpFRF0gPQorICAgICAgICAgICAgVk04 Nl9UU1NfVVBEQVRFRCB8ICgodWludDY0X3QpSFZNX1ZNODZfVFNTX1NJWkUgPDwgMzIpIHwgZ2Fk ZHI7CisgICAgICAgIGlmICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgZ2FkZHIsIGdhZGRyICsgSFZN X1ZNODZfVFNTX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTgyMF9SRVNF UlZFRCkgKQorICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gc2V0IFZNODYgVFNTIGFzIHJl c2VydmVkIGluIHRoZSBtZW1vcnkgbWFwXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBw cmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBWTTg2IFRTUyBhcmVhXG4iKTsKKworICAgIC8qIFN0 ZWFsIHNvbWUgbW9yZSBSQU0gZm9yIHRoZSBpZGVudGl0eSBwYWdlIHRhYmxlcy4gKi8KKyAgICBp ZiAoIHB2aF9zdGVhbF9yYW0oZCwgUEFHRV9TSVpFLCBQQUdFX1NJWkUsIEdCKDQpLCAmZ2FkZHIp ICkKKyAgICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGZpbmQgbWVtb3J5IHRvIHN0YXNo IHRoZSBpZGVudGl0eSBwYWdlIHRhYmxlc1xuIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOwor ICAgIH0KKworICAgIC8qCisgICAgICogSWRlbnRpdHktbWFwIHBhZ2UgdGFibGUgaXMgcmVxdWly ZWQgZm9yIHJ1bm5pbmcgd2l0aCBDUjAuUEc9MAorICAgICAqIHdoZW4gdXNpbmcgSW50ZWwgRVBU LiBDcmVhdGUgYSAzMi1iaXQgbm9uLVBBRSBwYWdlIGRpcmVjdG9yeSBvZgorICAgICAqIHN1cGVy cGFnZXMuCisgICAgICovCisgICAgaWRlbnRfcHQgPSBtYXBfZG9tYWluX2dmbihwMm1fZ2V0X2hv c3RwMm0oZCksIF9nZm4oUEZOX0RPV04oZ2FkZHIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZtZm4sICZwMm10LCAwLCAmcmMpOworICAgIGlmICggaWRlbnRfcHQgPT0gTlVMTCAp CisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBtYXAgaWRlbnRpdHkgcGFnZSB0YWJs ZXNcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisgICAgd3JpdGVfMzJiaXRf cHNlX2lkZW50bWFwKGlkZW50X3B0KTsKKyAgICB1bm1hcF9kb21haW5fcGFnZShpZGVudF9wdCk7 CisgICAgcHV0X3BhZ2UobWZuX3RvX3BhZ2UobWZuX3gobWZuKSkpOworICAgIGQtPmFyY2guaHZt X2RvbWFpbi5wYXJhbXNbSFZNX1BBUkFNX0lERU5UX1BUXSA9IGdhZGRyOworICAgIGlmICggcHZo X2FkZF9tZW1fcmFuZ2UoZCwgZ2FkZHIsIGdhZGRyICsgUEFHRV9TSVpFLCBFODIwX1JFU0VSVkVE KSApCisgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBzZXQgaWRlbnRpdHkgcGFnZSB0YWJs ZXMgYXMgcmVzZXJ2ZWQgaW4gdGhlIG1lbW9yeSBtYXBcbiIpOworCisgICAgcmV0dXJuIDA7Cit9 CisKKy8qIEFzc2lnbiB0aGUgbG93IDFNQiB0byBEb20wLiAqLworc3RhdGljIHZvaWQgX19pbml0 IHB2aF9zdGVhbF9sb3dfcmFtKHN0cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGxvbmcgc3RhcnQs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucl9w YWdlcykKK3sKKyAgICB1bnNpZ25lZCBsb25nIG1mbjsKKworICAgIEFTU0VSVChzdGFydCArIG5y X3BhZ2VzIDw9IFBGTl9ET1dOKE1CKDEpKSk7CisKKyAgICBmb3IgKCBtZm4gPSBzdGFydDsgbWZu IDwgc3RhcnQgKyBucl9wYWdlczsgbWZuKysgKQorICAgIHsKKyAgICAgICAgc3RydWN0IHBhZ2Vf aW5mbyAqcGcgPSBtZm5fdG9fcGFnZShtZm4pOworICAgICAgICBpbnQgcmM7CisKKyAgICAgICAg cmMgPSB1bnNoYXJlX3hlbl9wYWdlX3dpdGhfZ3Vlc3QocGcsIGRvbV9pbyk7CisgICAgICAgIGlm ICggcmMgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byB1bnNoYXJl IFhlbiBtZm4gJSNseDogJWRcbiIsIG1mbiwgcmMpOworICAgICAgICAgICAgY29udGludWU7Cisg ICAgICAgIH0KKworICAgICAgICBzaGFyZV94ZW5fcGFnZV93aXRoX2d1ZXN0KHBnLCBkLCBYRU5T SEFSRV93cml0YWJsZSk7CisgICAgICAgIHJjID0gZ3Vlc3RfcGh5c21hcF9hZGRfZW50cnkoZCwg X2dmbihtZm4pLCBfbWZuKG1mbiksIDAsIHAybV9yYW1fcncpOworICAgICAgICBpZiAoIHJjICkK KyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBtZm4gJSNseCB0byBwMm06ICVkXG4i LCBtZm4sIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBwdmhfc2V0dXBfZTgy MChzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQoreworICAgIHN0cnVj dCBlODIwZW50cnkgKmVudHJ5LCAqZW50cnlfZ3Vlc3Q7CisgICAgdW5zaWduZWQgaW50IGk7Cisg ICAgdW5zaWduZWQgbG9uZyBwYWdlcywgY3VyX3BhZ2VzID0gMDsKKyAgICB1aW50NjRfdCBzdGFy dCwgZW5kOworCisgICAgLyoKKyAgICAgKiBDcmFmdCB0aGUgZTgyMCBtZW1vcnkgbWFwIGZvciBE b20wIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBlODIwIG1hcC4KKyAgICAgKi8KKyAgICBkLT5hcmNo LmU4MjAgPSB4emFsbG9jX2FycmF5KHN0cnVjdCBlODIwZW50cnksIGU4MjAubnJfbWFwKTsKKyAg ICBpZiAoICFkLT5hcmNoLmU4MjAgKQorICAgICAgICBwYW5pYygiVW5hYmxlIHRvIGFsbG9jYXRl IG1lbW9yeSBmb3IgRG9tMCBlODIwIG1hcCIpOworICAgIGVudHJ5X2d1ZXN0ID0gZC0+YXJjaC5l ODIwOworCisgICAgLyogQ2xhbXAgZTgyMCBtZW1vcnkgbWFwIHRvIG1hdGNoIHRoZSBtZW1vcnkg YXNzaWduZWQgdG8gRG9tMCAqLworICAgIGZvciAoIGkgPSAwLCBlbnRyeSA9IGU4MjAubWFwOyBp IDwgZTgyMC5ucl9tYXA7IGkrKywgZW50cnkrKyApCisgICAgeworICAgICAgICBpZiAoIGVudHJ5 LT50eXBlICE9IEU4MjBfUkFNICkKKyAgICAgICAgeworICAgICAgICAgICAgKmVudHJ5X2d1ZXN0 ID0gKmVudHJ5OworICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgICAg aWYgKCBucl9wYWdlcyA9PSBjdXJfcGFnZXMgKQorICAgICAgICB7CisgICAgICAgICAgICAvKgor ICAgICAgICAgICAgICogV2UgYWxyZWFkeSBoYXZlIGFsbCB0aGUgYXNzaWduZWQgbWVtb3J5LAor ICAgICAgICAgICAgICogc2tpcCB0aGlzIGVudHJ5CisgICAgICAgICAgICAgKi8KKyAgICAgICAg ICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSBz dXJlIHRoZSBzdGFydCBhbmQgbGVuZ3RoIGFyZSBhbGlnbmVkIHRvIFBBR0VfU0laRSwgYmVjYXVz ZQorICAgICAgICAgKiB0aGF0J3MgdGhlIG1pbmltdW0gZ3JhbnVsYXJpdHkgb2YgdGhlIDJuZCBz dGFnZSB0cmFuc2xhdGlvbi4gU2luY2UKKyAgICAgICAgICogdGhlIHAybSBjb2RlIHVzZXMgUEFH RV9PUkRFUl80SyBpbnRlcm5hbGx5LCBhbHNvIHVzZSBpdCBoZXJlIGluCisgICAgICAgICAqIG9y ZGVyIHRvIHByZXZlbnQgdGhpcyBjb2RlIGZyb20gZ2V0dGluZyBvdXQgb2Ygc3luYy4KKyAgICAg ICAgICovCisgICAgICAgIHN0YXJ0ID0gUk9VTkRVUChlbnRyeS0+YWRkciwgUEFHRV9TSVpFIDw8 IFBBR0VfT1JERVJfNEspOworICAgICAgICBlbmQgPSAoZW50cnktPmFkZHIgKyBlbnRyeS0+c2l6 ZSkgJgorICAgICAgICAgICAgICB+KChQQUdFX1NJWkUgPDwgUEFHRV9PUkRFUl80SykgLSAxKTsK KyAgICAgICAgaWYgKCBzdGFydCA+PSBlbmQgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg ICAgICAgZW50cnlfZ3Vlc3QtPnR5cGUgPSBFODIwX1JBTTsKKyAgICAgICAgZW50cnlfZ3Vlc3Qt PmFkZHIgPSBzdGFydDsKKyAgICAgICAgZW50cnlfZ3Vlc3QtPnNpemUgPSBlbmQgLSBzdGFydDsK KyAgICAgICAgcGFnZXMgPSBQRk5fRE9XTihlbnRyeV9ndWVzdC0+c2l6ZSk7CisgICAgICAgIGlm ICggKGN1cl9wYWdlcyArIHBhZ2VzKSA+IG5yX3BhZ2VzICkKKyAgICAgICAgeworICAgICAgICAg ICAgLyogVHJ1bmNhdGUgcmVnaW9uICovCisgICAgICAgICAgICBlbnRyeV9ndWVzdC0+c2l6ZSA9 IChucl9wYWdlcyAtIGN1cl9wYWdlcykgPDwgUEFHRV9TSElGVDsKKyAgICAgICAgICAgIGN1cl9w YWdlcyA9IG5yX3BhZ2VzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAg ICAgICAgICAgY3VyX3BhZ2VzICs9IHBhZ2VzOworICAgICAgICB9CisgbmV4dDoKKyAgICAgICAg ZC0+YXJjaC5ucl9lODIwKys7CisgICAgICAgIGVudHJ5X2d1ZXN0Kys7CisgICAgfQorICAgIEFT U0VSVChjdXJfcGFnZXMgPT0gbnJfcGFnZXMpOworICAgIEFTU0VSVChkLT5hcmNoLm5yX2U4MjAg PD0gZTgyMC5ucl9tYXApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBfcDJtKHN0 cnVjdCBkb21haW4gKmQpCit7CisgICAgc3RydWN0IHZjcHUgKnYgPSBkLT52Y3B1WzBdOworICAg IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgaW50IHJj OworICAgIGJvb2wgcHJlZW1wdGVkOworI2RlZmluZSBNQjFfUEFHRVMgUEZOX0RPV04oTUIoMSkp CisKKyAgICBucl9wYWdlcyA9IGRvbTBfY29tcHV0ZV9ucl9wYWdlcyhkLCBOVUxMLCAwKTsKKwor ICAgIHB2aF9zZXR1cF9lODIwKGQsIG5yX3BhZ2VzKTsKKyAgICBkbyB7CisgICAgICAgIHByZWVt cHRlZCA9IGZhbHNlOworICAgICAgICBwYWdpbmdfc2V0X2FsbG9jYXRpb24oZCwgZG9tMF9wYWdp bmdfcGFnZXMoZCwgbnJfcGFnZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBy ZWVtcHRlZCk7CisgICAgICAgIHByb2Nlc3NfcGVuZGluZ19zb2Z0aXJxcygpOworICAgIH0gd2hp bGUgKCBwcmVlbXB0ZWQgKTsKKworICAgIC8qCisgICAgICogTWVtb3J5IGJlbG93IDFNQiBpcyBp ZGVudGl0eSBtYXBwZWQuCisgICAgICogTkI6IHRoaXMgb25seSBtYWtlcyBzZW5zZSB3aGVuIGJv b3RlZCBmcm9tIGxlZ2FjeSBCSU9TLgorICAgICAqLworICAgIHJjID0gbW9kaWZ5X2lkZW50aXR5 X21taW8oZCwgMCwgTUIxX1BBR0VTLCB0cnVlKTsKKyAgICBpZiAoIHJjICkKKyAgICB7CisgICAg ICAgIHByaW50aygiRmFpbGVkIHRvIGlkZW50aXR5IG1hcCBsb3cgMU1COiAlZFxuIiwgcmMpOwor ICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogUG9wdWxhdGUgbWVtb3J5IG1hcC4g Ki8KKyAgICBmb3IgKCBpID0gMDsgaSA8IGQtPmFyY2gubnJfZTgyMDsgaSsrICkKKyAgICB7Cisg ICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZTsKKworICAgICAgICBpZiAoIGQtPmFyY2gu ZTgyMFtpXS50eXBlICE9IEU4MjBfUkFNICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg ICAgIGFkZHIgPSBQRk5fRE9XTihkLT5hcmNoLmU4MjBbaV0uYWRkcik7CisgICAgICAgIHNpemUg PSBQRk5fRE9XTihkLT5hcmNoLmU4MjBbaV0uc2l6ZSk7CisKKyAgICAgICAgaWYgKCBhZGRyID49 IE1CMV9QQUdFUyApCisgICAgICAgICAgICByYyA9IHB2aF9wb3B1bGF0ZV9tZW1vcnlfcmFuZ2Uo ZCwgYWRkciwgc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQVNT RVJUKGFkZHIgKyBzaXplIDwgTUIxX1BBR0VTKTsKKyAgICAgICAgICAgIHB2aF9zdGVhbF9sb3df cmFtKGQsIGFkZHIsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCByYyApCisgICAg ICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKCBjcHVfaGFzX3ZteCAmJiBwYWdp bmdfbW9kZV9oYXAoZCkgJiYgIXZteF91bnJlc3RyaWN0ZWRfZ3Vlc3QodikgKQorICAgIHsKKyAg ICAgICAgLyoKKyAgICAgICAgICogU2luY2UgRG9tMCBjYW5ub3QgYmUgbWlncmF0ZWQsIHdlIHdp bGwgb25seSBzZXR1cCB0aGUKKyAgICAgICAgICogdW5yZXN0cmljdGVkIGd1ZXN0IGhlbHBlcnMg aWYgdGhleSBhcmUgbmVlZGVkIGJ5IHRoZSBjdXJyZW50CisgICAgICAgICAqIGhhcmR3YXJlIHdl IGFyZSBydW5uaW5nIG9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmMgPSBwdmhfc2V0dXBfdm14 X3JlYWxtb2RlX2hlbHBlcnMoZCk7CisgICAgICAgIGlmICggcmMgKQorICAgICAgICAgICAgcmV0 dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAwOworI3VuZGVmIE1CMV9QQUdFUworfQorCitz dGF0aWMgaW50IF9faW5pdCBwdmhfbG9hZF9rZXJuZWwoc3RydWN0IGRvbWFpbiAqZCwgY29uc3Qg bW9kdWxlX3QgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2ln bmVkIGxvbmcgaW1hZ2VfaGVhZHJvb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbW9kdWxlX3QgKmluaXRyZCwgdm9pZCAqaW1hZ2VfYmFzZSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjaGFyICpjbWRsaW5lLCBwYWRkcl90ICplbnRyeSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkcl90ICpzdGFydF9pbmZvX2FkZHIpCit7Cisg ICAgdm9pZCAqaW1hZ2Vfc3RhcnQgPSBpbWFnZV9iYXNlICsgaW1hZ2VfaGVhZHJvb207CisgICAg dW5zaWduZWQgbG9uZyBpbWFnZV9sZW4gPSBpbWFnZS0+bW9kX2VuZDsKKyAgICBzdHJ1Y3QgZWxm X2JpbmFyeSBlbGY7CisgICAgc3RydWN0IGVsZl9kb21fcGFybXMgcGFybXM7CisgICAgcGFkZHJf dCBsYXN0X2FkZHI7CisgICAgc3RydWN0IGh2bV9zdGFydF9pbmZvIHN0YXJ0X2luZm8gPSB7IDAg fTsKKyAgICBzdHJ1Y3QgaHZtX21vZGxpc3RfZW50cnkgbW9kID0geyAwIH07CisgICAgc3RydWN0 IHZjcHUgKnYgPSBkLT52Y3B1WzBdOworICAgIGludCByYzsKKworICAgIGlmICggKHJjID0gYnpp bWFnZV9wYXJzZShpbWFnZV9iYXNlLCAmaW1hZ2Vfc3RhcnQsICZpbWFnZV9sZW4pKSAhPSAwICkK KyAgICB7CisgICAgICAgIHByaW50aygiRXJyb3IgdHJ5aW5nIHRvIGRldGVjdCBieiBjb21wcmVz c2VkIGtlcm5lbFxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoIChy YyA9IGVsZl9pbml0KCZlbGYsIGltYWdlX3N0YXJ0LCBpbWFnZV9sZW4pKSAhPSAwICkKKyAgICB7 CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGluaXQgRUxGXG4iKTsKKyAgICAgICAgcmV0dXJu IHJjOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZWxmX3NldF92ZXJib3NlKCZlbGYpOwor I2VuZGlmCisgICAgZWxmX3BhcnNlX2JpbmFyeSgmZWxmKTsKKyAgICBpZiAoIChyYyA9IGVsZl94 ZW5fcGFyc2UoJmVsZiwgJnBhcm1zKSkgIT0gMCApCisgICAgeworICAgICAgICBwcmludGsoIlVu YWJsZSB0byBwYXJzZSBrZXJuZWwgZm9yIEVMRk5PVEVTXG4iKTsKKyAgICAgICAgcmV0dXJuIHJj OworICAgIH0KKworICAgIGlmICggcGFybXMucGh5c19lbnRyeSA9PSBVTlNFVF9BRERSMzIgKQor ICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gZmluZCBYRU5fRUxGTk9URV9QSFlTMzJf RU5UUlkgYWRkcmVzc1xuIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAg IHByaW50aygiT1M6ICVzIHZlcnNpb246ICVzIGxvYWRlcjogJXMgYml0bmVzczogJXNcbiIsIHBh cm1zLmd1ZXN0X29zLAorICAgICAgICAgICBwYXJtcy5ndWVzdF92ZXIsIHBhcm1zLmxvYWRlciwK KyAgICAgICAgICAgZWxmXzY0Yml0KCZlbGYpID8gIjY0LWJpdCIgOiAiMzItYml0Iik7CisKKyAg ICAvKiBDb3B5IHRoZSBPUyBpbWFnZSBhbmQgZnJlZSB0ZW1wb3JhcnkgYnVmZmVyLiAqLworICAg IGVsZi5kZXN0X2Jhc2UgPSAodm9pZCAqKShwYXJtcy52aXJ0X2tzdGFydCAtIHBhcm1zLnZpcnRf YmFzZSk7CisgICAgZWxmLmRlc3Rfc2l6ZSA9IHBhcm1zLnZpcnRfa2VuZCAtIHBhcm1zLnZpcnRf a3N0YXJ0OworCisgICAgZWxmX3NldF92Y3B1KCZlbGYsIHYpOworICAgIHJjID0gZWxmX2xvYWRf YmluYXJ5KCZlbGYpOworICAgIGlmICggcmMgPCAwICkKKyAgICB7CisgICAgICAgIHByaW50aygi RmFpbGVkIHRvIGxvYWQga2VybmVsOiAlZFxuIiwgcmMpOworICAgICAgICBwcmludGsoIlhlbiBk b20wIGtlcm5lbCBicm9rZW4gRUxGOiAlc1xuIiwgZWxmX2NoZWNrX2Jyb2tlbigmZWxmKSk7Cisg ICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBsYXN0X2FkZHIgPSBST1VORFVQKHBhcm1z LnZpcnRfa2VuZCAtIHBhcm1zLnZpcnRfYmFzZSwgUEFHRV9TSVpFKTsKKworICAgIGlmICggaW5p dHJkICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcmMgPSBodm1fY29weV90b19ndWVzdF9waHlz KGxhc3RfYWRkciwgbWZuX3RvX3ZpcnQoaW5pdHJkLT5tb2Rfc3RhcnQpLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdHJkLT5tb2RfZW5kLCB2KTsKKyAgICAgICAgaWYg KCByYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgaW5p dHJkIHRvIGd1ZXN0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisg ICAgICAgIG1vZC5wYWRkciA9IGxhc3RfYWRkcjsKKyAgICAgICAgbW9kLnNpemUgPSBpbml0cmQt Pm1vZF9lbmQ7CisgICAgICAgIGxhc3RfYWRkciArPSBST1VORFVQKGluaXRyZC0+bW9kX2VuZCwg UEFHRV9TSVpFKTsKKyAgICB9CisKKyAgICAvKiBGcmVlIHRlbXBvcmFyeSBidWZmZXJzLiAqLwor ICAgIGRpc2NhcmRfaW5pdGlhbF9pbWFnZXMoKTsKKworICAgIGlmICggY21kbGluZSAhPSBOVUxM ICkKKyAgICB7CisgICAgICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhsYXN0X2FkZHIs IGNtZGxpbmUsIHN0cmxlbihjbWRsaW5lKSArIDEsIHYpOworICAgICAgICBpZiAoIHJjICkKKyAg ICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gY29weSBndWVzdCBjb21tYW5k IGxpbmVcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIHN0 YXJ0X2luZm8uY21kbGluZV9wYWRkciA9IGxhc3RfYWRkcjsKKyAgICAgICAgLyoKKyAgICAgICAg ICogUm91bmQgdXAgdG8gMzIvNjQgYml0cyAoZGVwZW5kaW5nIG9uIHRoZSBndWVzdCBrZXJuZWwg Yml0bmVzcykgc28KKyAgICAgICAgICogdGhlIG1vZGxpc3Qvc3RhcnRfaW5mbyBpcyBhbGlnbmVk LgorICAgICAgICAgKi8KKyAgICAgICAgbGFzdF9hZGRyICs9IFJPVU5EVVAoc3RybGVuKGNtZGxp bmUpICsgMSwgZWxmXzY0Yml0KCZlbGYpID8gOCA6IDQpOworICAgIH0KKyAgICBpZiAoIGluaXRy ZCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhs YXN0X2FkZHIsICZtb2QsIHNpemVvZihtb2QpLCB2KTsKKyAgICAgICAgaWYgKCByYyApCisgICAg ICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgZ3Vlc3QgbW9kdWxlc1xu Iik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRfaW5m by5tb2RsaXN0X3BhZGRyID0gbGFzdF9hZGRyOworICAgICAgICBzdGFydF9pbmZvLm5yX21vZHVs ZXMgPSAxOworICAgICAgICBsYXN0X2FkZHIgKz0gc2l6ZW9mKG1vZCk7CisgICAgfQorCisgICAg c3RhcnRfaW5mby5tYWdpYyA9IFhFTl9IVk1fU1RBUlRfTUFHSUNfVkFMVUU7CisgICAgc3RhcnRf aW5mby5mbGFncyA9IFNJRl9QUklWSUxFR0VEIHwgU0lGX0lOSVRET01BSU47CisgICAgcmMgPSBo dm1fY29weV90b19ndWVzdF9waHlzKGxhc3RfYWRkciwgJnN0YXJ0X2luZm8sIHNpemVvZihzdGFy dF9pbmZvKSwgdik7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJs ZSB0byBjb3B5IHN0YXJ0IGluZm8gdG8gZ3Vlc3RcbiIpOworICAgICAgICByZXR1cm4gcmM7Cisg ICAgfQorCisgICAgKmVudHJ5ID0gcGFybXMucGh5c19lbnRyeTsKKyAgICAqc3RhcnRfaW5mb19h ZGRyID0gbGFzdF9hZGRyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0 IHB2aF9zZXR1cF9jcHVzKHN0cnVjdCBkb21haW4gKmQsIHBhZGRyX3QgZW50cnksCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkcl90IHN0YXJ0X2luZm8pCit7CisgICAgc3Ry dWN0IHZjcHUgKnYgPSBkLT52Y3B1WzBdOworICAgIHVuc2lnbmVkIGludCBjcHUsIGk7CisgICAg aW50IHJjOworICAgIC8qCisgICAgICogVGhpcyBzZXRzIHRoZSB2Q1BVIHN0YXRlIGFjY29yZGlu ZyB0byB0aGUgc3RhdGUgZGVzY3JpYmVkIGluCisgICAgICogZG9jcy9taXNjL2h2bWxpdGUubWFy a2Rvd24uCisgICAgICovCisgICAgdmNwdV9odm1fY29udGV4dF90IGNwdV9jdHggPSB7CisgICAg ICAgIC5tb2RlID0gVkNQVV9IVk1fTU9ERV8zMkIsCisgICAgICAgIC5jcHVfcmVncy54ODZfMzIu ZWJ4ID0gc3RhcnRfaW5mbywKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5laXAgPSBlbnRyeSwK KyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5jcjAgPSBYODZfQ1IwX1BFIHwgWDg2X0NSMF9FVCwK KyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5jc19saW1pdCA9IH4wdSwKKyAgICAgICAgLmNwdV9y ZWdzLng4Nl8zMi5kc19saW1pdCA9IH4wdSwKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5zc19s aW1pdCA9IH4wdSwKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi50cl9saW1pdCA9IDB4NjcsCisg ICAgICAgIC5jcHVfcmVncy54ODZfMzIuY3NfYXIgPSAweGM5YiwKKyAgICAgICAgLmNwdV9yZWdz Lng4Nl8zMi5kc19hciA9IDB4YzkzLAorICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLnNzX2FyID0g MHhjOTMsCisgICAgICAgIC5jcHVfcmVncy54ODZfMzIudHJfYXIgPSAweDhiLAorICAgIH07CisK KyAgICBjcHUgPSB2LT5wcm9jZXNzb3I7CisgICAgZm9yICggaSA9IDE7IGkgPCBkLT5tYXhfdmNw dXM7IGkrKyApCisgICAgeworICAgICAgICBzdHJ1Y3QgdmNwdSAqcCA9IGRvbTBfc2V0dXBfdmNw dShkLCBpLCBjcHUpOworCisgICAgICAgIGlmICggcCApCisgICAgICAgICAgICBjcHUgPSBwLT5w cm9jZXNzb3I7CisgICAgfQorCisgICAgcmMgPSBhcmNoX3NldF9pbmZvX2h2bV9ndWVzdCh2LCAm Y3B1X2N0eCk7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0 byBzZXR1cCBEb20wIEJTUCBjb250ZXh0OiAlZFxuIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7 CisgICAgfQorCisgICAgcmMgPSBkb20wX3NldHVwX3Blcm1pc3Npb25zKGQpOworICAgIGlmICgg cmMgKQorICAgIHsKKyAgICAgICAgcGFuaWMoIlVuYWJsZSB0byBzZXR1cCBEb20wIHBlcm1pc3Np b25zOiAlZFxuIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgdXBkYXRl X2RvbWFpbl93YWxsY2xvY2tfdGltZShkKTsKKworICAgIGNsZWFyX2JpdChfVlBGX2Rvd24sICZ2 LT5wYXVzZV9mbGFncyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQg YWNwaV9jb3VudF9pbnRyX292cihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25n IGVuZCkKK3sKKworICAgIGFjcGlfaW50cl9vdmVycmlkZXMrKzsKKyAgICByZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBfX2luaXQgYWNwaV9zZXRfaW50cl9vdnIoc3RydWN0IGFjcGlfc3VidGFi bGVfaGVhZGVyICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYWNwaV9tYWR0X2lu dGVycnVwdF9vdmVycmlkZSAqaW50ciA9CisgICAgICAgIGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0 cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlLCBoZWFkZXIpOworCisgICAgKmludHNy Y292ciA9ICppbnRyOworICAgIGludHNyY292cisrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgX19pbml0IGFjcGlfY291bnRfbm1pX3NyYyhzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9o ZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z dCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKworICAgIGFjcGlfbm1pX3NvdXJjZXMrKzsKKyAgICBy ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNwaV9zZXRfbm1pX3NyYyhzdHJ1Y3Qg YWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisgICAgY29uc3Qgc3RydWN0IGFj cGlfbWFkdF9ubWlfc291cmNlICpzcmMgPQorICAgICAgICBjb250YWluZXJfb2YoaGVhZGVyLCBz dHJ1Y3QgYWNwaV9tYWR0X25taV9zb3VyY2UsIGhlYWRlcik7CisKKyAgICAqbm1pc3JjID0gKnNy YzsKKyAgICBubWlzcmMrKzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5p dCBwdmhfc2V0dXBfYWNwaV9tYWR0KHN0cnVjdCBkb21haW4gKmQsIHBhZGRyX3QgKmFkZHIpCit7 CisgICAgc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqbWFkdDsKKyAgICBzdHJ1Y3QgYWNwaV90YWJs ZV9oZWFkZXIgKnRhYmxlOworICAgIHN0cnVjdCBhY3BpX21hZHRfaW9fYXBpYyAqaW9fYXBpYzsK KyAgICBzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3gyYXBpYyAqeDJhcGljOworICAgIGFjcGlfc3Rh dHVzIHN0YXR1czsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgdW5zaWduZWQgaW50IGks IG1heF92Y3B1czsKKyAgICBpbnQgcmM7CisKKyAgICAvKiBDb3VudCBudW1iZXIgb2YgaW50ZXJy dXB0IG92ZXJyaWRlcyBpbiB0aGUgTUFEVC4gKi8KKyAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQo QUNQSV9NQURUX1RZUEVfSU5URVJSVVBUX09WRVJSSURFLAorICAgICAgICAgICAgICAgICAgICAg ICAgICBhY3BpX2NvdW50X2ludHJfb3ZyLCBVSU5UX01BWCk7CisKKyAgICAvKiBDb3VudCBudW1i ZXIgb2YgTk1JIHNvdXJjZXMgaW4gdGhlIE1BRFQuICovCisgICAgYWNwaV90YWJsZV9wYXJzZV9t YWR0KEFDUElfTUFEVF9UWVBFX05NSV9TT1VSQ0UsIGFjcGlfY291bnRfbm1pX3NyYywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgVUlOVF9NQVgpOworCisgICAgbWF4X3ZjcHVzID0gZG9tMF9t YXhfdmNwdXMoKTsKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGNyYWZ0ZWQgTUFE VC4gKi8KKyAgICBzaXplID0gc2l6ZW9mKCptYWR0KTsKKyAgICAvKgorICAgICAqIEZJWE1FOiB0 aGUgY3VycmVudCB2SU8tQVBJQyBjb2RlIGp1c3Qgc3VwcG9ydHMgb25lIElPLUFQSUMgaW5zdGFu Y2UKKyAgICAgKiBwZXIgZG9tYWluLiBUaGlzIG11c3QgYmUgZml4ZWQgaW4gb3JkZXIgdG8gcHJv dmlkZSB0aGUgc2FtZSBhbW91bnQgb2YKKyAgICAgKiBJTyBBUElDcyBhcyBhdmFpbGFibGUgb24g YmFyZSBtZXRhbC4KKyAgICAgKi8KKyAgICBzaXplICs9IHNpemVvZigqaW9fYXBpYyk7CisgICAg c2l6ZSArPSBzaXplb2YoKmludHNyY292cikgKiBhY3BpX2ludHJfb3ZlcnJpZGVzOworICAgIHNp emUgKz0gc2l6ZW9mKCpubWlzcmMpICogYWNwaV9ubWlfc291cmNlczsKKyAgICBzaXplICs9IHNp emVvZigqeDJhcGljKSAqIG1heF92Y3B1czsKKworICAgIG1hZHQgPSB4emFsbG9jX2J5dGVzKHNp emUpOworICAgIGlmICggIW1hZHQgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8g YWxsb2NhdGUgbWVtb3J5IGZvciBNQURUIHRhYmxlXG4iKTsKKyAgICAgICAgcmMgPSAtRU5PTUVN OworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBDb3B5IHRoZSBuYXRpdmUgTUFE VCB0YWJsZSBoZWFkZXIuICovCisgICAgc3RhdHVzID0gYWNwaV9nZXRfdGFibGUoQUNQSV9TSUdf TUFEVCwgMCwgJnRhYmxlKTsKKyAgICBpZiAoICFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSApCisgICAg eworICAgICAgICBwcmludGsoIkZhaWxlZCB0byBnZXQgTUFEVCBBQ1BJIHRhYmxlLCBhYm9ydGlu Zy5cbiIpOworICAgICAgICByYyA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0K KyAgICBtYWR0LT5oZWFkZXIgPSAqdGFibGU7CisgICAgbWFkdC0+YWRkcmVzcyA9IEFQSUNfREVG QVVMVF9QSFlTX0JBU0U7CisgICAgLyoKKyAgICAgKiBOQjogdGhpcyBpcyBjdXJyZW50bHkgc2V0 IHRvIDQsIHdoaWNoIGlzIHRoZSByZXZpc2lvbiBpbiB0aGUgQUNQSQorICAgICAqIHNwZWMgNi4x LiBTYWRseSBBQ1BJQ0EgZG9lc24ndCBwcm92aWRlIHJldmlzaW9uIG51bWJlcnMgZm9yIHRoZQor ICAgICAqIHRhYmxlcyBkZXNjcmliZWQgaW4gdGhlIGhlYWRlcnMuCisgICAgICovCisgICAgbWFk dC0+aGVhZGVyLnJldmlzaW9uID0gbWluX3QodW5zaWduZWQgY2hhciwgdGFibGUtPnJldmlzaW9u LCA0KTsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIElPIEFQSUMgZW50cnkuCisgICAgICog RklYTUU6IHRoZSBjdXJyZW50IHZJTy1BUElDIGNvZGUganVzdCBzdXBwb3J0cyBvbmUgSU8tQVBJ QyBpbnN0YW5jZQorICAgICAqIHBlciBkb21haW4uIFRoaXMgbXVzdCBiZSBmaXhlZCBpbiBvcmRl ciB0byBwcm92aWRlIHRoZSBzYW1lIGFtb3VudCBvZgorICAgICAqIElPIEFQSUNzIGFzIGF2YWls YWJsZSBvbiBiYXJlIG1ldGFsLCBhbmQgd2l0aCB0aGUgc2FtZSBJRHMgYXMgZm91bmQgaW4KKyAg ICAgKiB0aGUgbmF0aXZlIElPIEFQSUMgTUFEVCBlbnRyaWVzLgorICAgICAqLworICAgIGlmICgg bnJfaW9hcGljcyA+IDEgKQorICAgICAgICBwcmludGsoIldBUk5JTkc6IGZvdW5kICVkIElPIEFQ SUNzLCBEb20wIHdpbGwgb25seSBoYXZlIGFjY2VzcyB0byAxIGVtdWxhdGVkIElPIEFQSUNcbiIs CisgICAgICAgICAgICAgICBucl9pb2FwaWNzKTsKKyAgICBpb19hcGljID0gKHZvaWQgKikobWFk dCArIDEpOworICAgIGlvX2FwaWMtPmhlYWRlci50eXBlID0gQUNQSV9NQURUX1RZUEVfSU9fQVBJ QzsKKyAgICBpb19hcGljLT5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKCppb19hcGljKTsKKyAgICBp b19hcGljLT5pZCA9IGRvbWFpbl92aW9hcGljKGQpLT5pZDsKKyAgICBpb19hcGljLT5hZGRyZXNz ID0gVklPQVBJQ19ERUZBVUxUX0JBU0VfQUREUkVTUzsKKworICAgIHgyYXBpYyA9ICh2b2lkICop KGlvX2FwaWMgKyAxKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG1heF92Y3B1czsgaSsrICkKKyAg ICB7CisgICAgICAgIHgyYXBpYy0+aGVhZGVyLnR5cGUgPSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9Y MkFQSUM7CisgICAgICAgIHgyYXBpYy0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZigqeDJhcGljKTsK KyAgICAgICAgeDJhcGljLT51aWQgPSBpOworICAgICAgICB4MmFwaWMtPmxvY2FsX2FwaWNfaWQg PSBpICogMjsKKyAgICAgICAgeDJhcGljLT5sYXBpY19mbGFncyA9IEFDUElfTUFEVF9FTkFCTEVE OworICAgICAgICB4MmFwaWMrKzsKKyAgICB9CisKKyAgICAvKiBTZXR1cCBpbnRlcnJ1cHQgb3Zl cnJpZGVzLiAqLworICAgIGludHNyY292ciA9ICh2b2lkICopeDJhcGljOworICAgIGFjcGlfdGFi bGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfT1ZFUlJJREUsIGFjcGlfc2V0 X2ludHJfb3ZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2ludHJfb3ZlcnJpZGVz KTsKKworICAgIC8qIFNldHVwIE5NSSBzb3VyY2VzLiAqLworICAgIG5taXNyYyA9ICh2b2lkICop aW50c3Jjb3ZyOworICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9OTUlf U09VUkNFLCBhY3BpX3NldF9ubWlfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Bp X25taV9zb3VyY2VzKTsKKworICAgIEFTU0VSVCgoKHZvaWQgKilubWlzcmMgLSAodm9pZCAqKW1h ZHQpID09IHNpemUpOworICAgIG1hZHQtPmhlYWRlci5sZW5ndGggPSBzaXplOworICAgIC8qCisg ICAgICogQ2FsbGluZyBhY3BpX3RiX2NoZWNrc3VtIGhlcmUgaXMgYSBsYXllcmluZyB2aW9sYXRp b24sIGJ1dAorICAgICAqIGludHJvZHVjaW5nIGEgd3JhcHBlciBmb3Igc3VjaCBzaW1wbGUgdXNh Z2Ugc2VlbXMgb3ZlcmtpbGwuCisgICAgICovCisgICAgbWFkdC0+aGVhZGVyLmNoZWNrc3VtIC09 IGFjcGlfdGJfY2hlY2tzdW0oQUNQSV9DQVNUX1BUUih1OCwgbWFkdCksIHNpemUpOworCisgICAg LyogUGxhY2UgdGhlIG5ldyBNQURUIGluIGd1ZXN0IG1lbW9yeSBzcGFjZS4gKi8KKyAgICBpZiAo IHB2aF9zdGVhbF9yYW0oZCwgc2l6ZSwgMCwgR0IoNCksIGFkZHIpICkKKyAgICB7CisgICAgICAg IHByaW50aygiVW5hYmxlIHRvIGZpbmQgYWxsb2NhdGUgZ3Vlc3QgUkFNIGZvciBNQURUXG4iKTsK KyAgICAgICAgcmMgPSAtRU5PTUVNOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAv KiBNYXJrIHRoaXMgcmVnaW9uIGFzIEU4MjBfQUNQSS4gKi8KKyAgICBpZiAoIHB2aF9hZGRfbWVt X3JhbmdlKGQsICphZGRyLCAqYWRkciArIHNpemUsIEU4MjBfQUNQSSkgKQorICAgICAgICBwcmlu dGsoIlVuYWJsZSB0byBhZGQgTUFEVCByZWdpb24gdG8gbWVtb3J5IG1hcFxuIik7CisKKyAgICBy YyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMoKmFkZHIsIG1hZHQsIHNpemUsIGQtPnZjcHVbMF0p OworICAgIGlmICggcmMgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gY29weSBN QURUIGludG8gZ3Vlc3QgbWVtb3J5XG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisg ICAgcmMgPSAwOworCisgb3V0OgorICAgIHhmcmVlKG1hZHQpOworCisgICAgcmV0dXJuIHJjOwor fQorCitzdGF0aWMgYm9vbCBfX2luaXQgYWNwaV9tZW1vcnlfYmFubmVkKHVuc2lnbmVkIGxvbmcg YWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg bG9uZyBzaXplKQoreworICAgIHVuc2lnbmVkIGxvbmcgbWZuLCBucl9wYWdlcywgaTsKKworICAg IG1mbiA9IFBGTl9ET1dOKGFkZHJlc3MpOworICAgIG5yX3BhZ2VzID0gUEZOX1VQKChhZGRyZXNz ICYgflBBR0VfTUFTSykgKyBzaXplKTsKKyAgICBmb3IgKCBpID0gMCA7IGkgPCBucl9wYWdlczsg aSsrICkKKyAgICAgICAgaWYgKCAhcGFnZV9pc19yYW1fdHlwZShtZm4gKyBpLCBSQU1fVFlQRV9S RVNFUlZFRCkgJiYKKyAgICAgICAgICAgICAhcGFnZV9pc19yYW1fdHlwZShtZm4gKyBpLCBSQU1f VFlQRV9BQ1BJKSApCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxz ZTsKK30KKworc3RhdGljIGJvb2wgX19pbml0IHB2aF9hY3BpX3RhYmxlX2FsbG93ZWQoY29uc3Qg Y2hhciAqc2lnKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIF9faW5pdGNvbnN0IGJhbm5lZF90 YWJsZXNbXVtBQ1BJX05BTUVfU0laRV0gPSB7CisgICAgICAgIEFDUElfU0lHX0hQRVQsIEFDUElf U0lHX1NMSVQsIEFDUElfU0lHX1NSQVQsIEFDUElfU0lHX01QU1QsCisgICAgICAgIEFDUElfU0lH X1BNVFQsIEFDUElfU0lHX01BRFQsIEFDUElfU0lHX0RNQVJ9OworICAgIHVuc2lnbmVkIGludCBp OworCisgICAgZm9yICggaSA9IDAgOyBpIDwgQVJSQVlfU0laRShiYW5uZWRfdGFibGVzKTsgaSsr ICkKKyAgICAgICAgaWYgKCBzdHJuY21wKHNpZywgYmFubmVkX3RhYmxlc1tpXSwgQUNQSV9OQU1F X1NJWkUpID09IDAgKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLyogTWFrZSBz dXJlIHRhYmxlIGRvZXNuJ3QgcmVzaWRlIGluIGEgUkFNIHJlZ2lvbi4gKi8KKyAgICBpZiAoIGFj cGlfbWVtb3J5X2Jhbm5lZChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLmFkZHJl c3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0 LnRhYmxlc1tpXS5sZW5ndGgpICkKKyAgICB7CisgICAgICAgIHByaW50aygiU2tpcHBpbmcgdGFi bGUgJS40cyBiZWNhdXNlIHJlc2lkZXMgaW4gYSBub24tQUNQSSwgbm9uLXJlc2VydmVkIHJlZ2lv blxuIiwKKyAgICAgICAgICAgICAgIHNpZyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9 CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHZoX3NldHVwX2Fj cGlfeHNkdChzdHJ1Y3QgZG9tYWluICpkLCBwYWRkcl90IG1hZHRfYWRkciwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCAqYWRkcikKK3sKKyAgICBzdHJ1Y3Qg YWNwaV90YWJsZV94c2R0ICp4c2R0OworICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFi bGU7CisgICAgc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcDsKKyAgICB1bnNpZ25lZCBsb25n IHNpemUgPSBzaXplb2YoKnhzZHQpOworICAgIHVuc2lnbmVkIGludCBpLCBqLCBudW1fdGFibGVz ID0gMDsKKyAgICBwYWRkcl90IHhzZHRfcGFkZHI7CisgICAgaW50IHJjOworCisgICAgLyoKKyAg ICAgKiBSZXN0b3JlIG9yaWdpbmFsIERNQVIgdGFibGUgc2lnbmF0dXJlLCB3ZSBhcmUgZ29pbmcg dG8gZmlsdGVyIGl0IGZyb20KKyAgICAgKiB0aGUgbmV3IFhTRFQgdGhhdCBpcyBwcmVzZW50ZWQg dG8gdGhlIGd1ZXN0LCBzbyBpdCBpcyBubyBsb25nZXIKKyAgICAgKiBuZWNlc3NhcnkgdG8gaGF2 ZSBpdCdzIHNpZ25hdHVyZSB6YXBwZWQuCisgICAgICovCisgICAgYWNwaV9kbWFyX3JlaW5zdGF0 ZSgpOworCisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiB0YWJsZXMgdGhhdCB3aWxsIGJlIGFk ZGVkIHRvIHRoZSBYU0RULiAqLworICAgIGZvciggaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3Rh YmxlX2xpc3QuY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpzaWcgPSBh Y3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZS5hc2NpaTsKKworICAg ICAgICBpZiAoIHB2aF9hY3BpX3RhYmxlX2FsbG93ZWQoc2lnKSApCisgICAgICAgICAgICBudW1f dGFibGVzKys7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBObyBuZWVkIHRvIGFkZCBvciBzdWJ0 cmFjdCBhbnl0aGluZyBiZWNhdXNlIHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQKKyAgICAgKiBpbmNs dWRlcyBvbmUgYXJyYXkgc2xvdCBhbHJlYWR5LCBhbmQgd2UgaGF2ZSBmaWx0ZXJlZCBvdXQgdGhl IG9yaWdpbmFsCisgICAgICogTUFEVCBhbmQgd2UgYXJlIGdvaW5nIHRvIGFkZCBhIGN1c3RvbSBi dWlsdCBNQURULgorICAgICAqLworICAgIHNpemUgKz0gbnVtX3RhYmxlcyAqIHNpemVvZih4c2R0 LT50YWJsZV9vZmZzZXRfZW50cnlbMF0pOworCisgICAgeHNkdCA9IHh6YWxsb2NfYnl0ZXMoc2l6 ZSk7CisgICAgaWYgKCAheHNkdCApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBh bGxvY2F0ZSBtZW1vcnkgZm9yIFhTRFQgdGFibGVcbiIpOworICAgICAgICByYyA9IC1FTk9NRU07 CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIENvcHkgdGhlIG5hdGl2ZSBYU0RU IHRhYmxlIGhlYWRlci4gKi8KKyAgICByc2RwID0gYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlfb3Nf Z2V0X3Jvb3RfcG9pbnRlcigpLCBzaXplb2YoKnJzZHApKTsKKyAgICBpZiAoICFyc2RwICkKKyAg ICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIG1hcCBSU0RQXG4iKTsKKyAgICAgICAgcmMg PSAtRUlOVkFMOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgeHNkdF9wYWRkciA9IHJz ZHAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzczsKKyAgICBhY3BpX29zX3VubWFwX21lbW9yeShyc2Rw LCBzaXplb2YoKnJzZHApKTsKKyAgICB0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeSh4c2R0X3Bh ZGRyLCBzaXplb2YoKnRhYmxlKSk7CisgICAgaWYgKCAhdGFibGUgKQorICAgIHsKKyAgICAgICAg cHJpbnRrKCJVbmFibGUgdG8gbWFwIFhTRFRcbiIpOworICAgICAgICByYyA9IC1FSU5WQUw7Cisg ICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICB4c2R0LT5oZWFkZXIgPSAqdGFibGU7CisgICAg YWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIHNpemVvZigqdGFibGUpKTsKKworICAgIC8qIEFk ZCB0aGUgY3VzdG9tIE1BRFQuICovCisgICAgeHNkdC0+dGFibGVfb2Zmc2V0X2VudHJ5WzBdID0g bWFkdF9hZGRyOworCisgICAgLyogQ29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSByZXN0IG9mIHRo ZSBhbGxvd2VkIHRhYmxlcy4gKi8KKyAgICBmb3IoIGkgPSAwLCBqID0gMTsgaSA8IGFjcGlfZ2Js X3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIg KnNpZyA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlLmFzY2lp OworCisgICAgICAgIGlmICggcHZoX2FjcGlfdGFibGVfYWxsb3dlZChzaWcpICkKKyAgICAgICAg ICAgIHhzZHQtPnRhYmxlX29mZnNldF9lbnRyeVtqKytdID0KKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5hZGRyZXNzOwor ICAgIH0KKworICAgIHhzZHQtPmhlYWRlci5yZXZpc2lvbiA9IDE7CisgICAgeHNkdC0+aGVhZGVy Lmxlbmd0aCA9IHNpemU7CisgICAgLyoKKyAgICAgKiBDYWxsaW5nIGFjcGlfdGJfY2hlY2tzdW0g aGVyZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbiwgYnV0CisgICAgICogaW50cm9kdWNpbmcgYSB3 cmFwcGVyIGZvciBzdWNoIHNpbXBsZSB1c2FnZSBzZWVtcyBvdmVya2lsbC4KKyAgICAgKi8KKyAg ICB4c2R0LT5oZWFkZXIuY2hlY2tzdW0gLT0gYWNwaV90Yl9jaGVja3N1bShBQ1BJX0NBU1RfUFRS KHU4LCB4c2R0KSwgc2l6ZSk7CisKKyAgICAvKiBQbGFjZSB0aGUgbmV3IFhTRFQgaW4gZ3Vlc3Qg bWVtb3J5IHNwYWNlLiAqLworICAgIGlmICggcHZoX3N0ZWFsX3JhbShkLCBzaXplLCAwLCBHQig0 KSwgYWRkcikgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gZmluZCBndWVzdCBS QU0gZm9yIFhTRFRcbiIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gb3V0 OworICAgIH0KKworICAgIC8qIE1hcmsgdGhpcyByZWdpb24gYXMgRTgyMF9BQ1BJLiAqLworICAg IGlmICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgKmFkZHIsICphZGRyICsgc2l6ZSwgRTgyMF9BQ1BJ KSApCisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBYU0RUIHJlZ2lvbiB0byBtZW1vcnkg bWFwXG4iKTsKKworICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cygqYWRkciwgeHNkdCwg c2l6ZSwgZC0+dmNwdVswXSk7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBwcmludGso IlVuYWJsZSB0byBjb3B5IFhTRFQgaW50byBndWVzdCBtZW1vcnlcbiIpOworICAgICAgICBnb3Rv IG91dDsKKyAgICB9CisKKyAgICByYyA9IDA7CisKKyBvdXQ6CisgICAgeGZyZWUoeHNkdCk7CisK KyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHB2aF9zZXR1cF9hY3BpKHN0 cnVjdCBkb21haW4gKmQsIHBhZGRyX3Qgc3RhcnRfaW5mbykKK3sKKyAgICB1bnNpZ25lZCBsb25n IHBmbiwgbnJfcGFnZXM7CisgICAgcGFkZHJfdCBtYWR0X3BhZGRyLCB4c2R0X3BhZGRyLCByc2Rw X3BhZGRyOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGludCByYzsKKyAgICBzdHJ1Y3QgYWNw aV90YWJsZV9yc2RwICpuYXRpdmVfcnNkcCwgcnNkcCA9IHsKKyAgICAgICAgLnNpZ25hdHVyZSA9 IEFDUElfU0lHX1JTRFAsCisgICAgICAgIC5yZXZpc2lvbiA9IDIsCisgICAgICAgIC5sZW5ndGgg PSBzaXplb2YocnNkcCksCisgICAgfTsKKworCisgICAgLyogU2NhbiB0b3AtbGV2ZWwgdGFibGVz IGFuZCBhZGQgdGhlaXIgcmVnaW9ucyB0byB0aGUgZ3Vlc3QgbWVtb3J5IG1hcC4gKi8KKyAgICBm b3IoIGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyBpKysgKQorICAg IHsKKyAgICAgICAgY29uc3QgY2hhciAqc2lnID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRh Ymxlc1tpXS5zaWduYXR1cmUuYXNjaWk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciA9IGFj cGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uYWRkcmVzczsKKyAgICAgICAgdW5zaWdu ZWQgbG9uZyBzaXplID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5sZW5ndGg7 CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSBzdXJlIHRoZSBvcmlnaW5hbCBNQURUIGlz IGFsc28gbWFwcGVkLCBzbyB0aGF0IERvbTAgY2FuCisgICAgICAgICAqIHByb3Blcmx5IGFjY2Vz cyB0aGUgZGF0YSByZXR1cm5lZCBieSBfTUFUIG1ldGhvZHMgaW4gY2FzZSBpdCdzCisgICAgICAg ICAqIHJlLXVzaW5nIE1BRFQgbWVtb3J5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBzdHJu Y21wKHNpZywgQUNQSV9TSUdfTUFEVCwgQUNQSV9OQU1FX1NJWkUpCisgICAgICAgICAgICAgPyBw dmhfYWNwaV90YWJsZV9hbGxvd2VkKHNpZykKKyAgICAgICAgICAgICA6ICFhY3BpX21lbW9yeV9i YW5uZWQoYWRkciwgc2l6ZSkgKQorICAgICAgICAgICAgIHB2aF9hZGRfbWVtX3JhbmdlKGQsIGFk ZHIsIGFkZHIgKyBzaXplLCBFODIwX0FDUEkpOworICAgIH0KKworICAgIC8qIElkZW50aXR5IG1h cCBBQ1BJIGU4MjAgcmVnaW9ucy4gKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8IGQtPmFyY2gubnJf ZTgyMDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmICggZC0+YXJjaC5lODIwW2ldLnR5cGUgIT0g RTgyMF9BQ1BJICYmCisgICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnR5cGUgIT0gRTgyMF9O VlMgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcGZuID0gUEZOX0RPV04oZC0+ YXJjaC5lODIwW2ldLmFkZHIpOworICAgICAgICBucl9wYWdlcyA9IFBGTl9VUCgoZC0+YXJjaC5l ODIwW2ldLmFkZHIgJiB+UEFHRV9NQVNLKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGQt PmFyY2guZTgyMFtpXS5zaXplKTsKKworICAgICAgICByYyA9IG1vZGlmeV9pZGVudGl0eV9tbWlv KGQsIHBmbiwgbnJfcGFnZXMsIHRydWUpOworICAgICAgICBpZiAoIHJjICkKKyAgICAgICAgewor ICAgICAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gbWFwIEFDUEkgcmVnaW9uIFslI2x4LCAlI2x4 KSBpbnRvIERvbTAgbWVtb3J5IG1hcFxuIiwKKyAgICAgICAgICAgICAgICAgICBwZm4sIHBmbiAr IG5yX3BhZ2VzKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKwor ICAgIHJjID0gcHZoX3NldHVwX2FjcGlfbWFkdChkLCAmbWFkdF9wYWRkcik7CisgICAgaWYgKCBy YyApCisgICAgICAgIHJldHVybiByYzsKKworICAgIHJjID0gcHZoX3NldHVwX2FjcGlfeHNkdChk LCBtYWR0X3BhZGRyLCAmeHNkdF9wYWRkcik7CisgICAgaWYgKCByYyApCisgICAgICAgIHJldHVy biByYzsKKworICAgIC8qIENyYWZ0IGEgY3VzdG9tIFJTRFAuICovCisgICAgbmF0aXZlX3JzZHAg PSBhY3BpX29zX21hcF9tZW1vcnkoYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKCksIHNpemVvZihy c2RwKSk7CisgICAgaWYgKCAhbmF0aXZlX3JzZHAgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJG YWlsZWQgdG8gbWFwIG5hdGl2ZSBSU0RQXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07Cisg ICAgfQorICAgIG1lbWNweShyc2RwLm9lbV9pZCwgbmF0aXZlX3JzZHAtPm9lbV9pZCwgc2l6ZW9m KHJzZHAub2VtX2lkKSk7CisgICAgYWNwaV9vc191bm1hcF9tZW1vcnkobmF0aXZlX3JzZHAsIHNp emVvZihyc2RwKSk7CisgICAgcnNkcC54c2R0X3BoeXNpY2FsX2FkZHJlc3MgPSB4c2R0X3BhZGRy OworICAgIC8qCisgICAgICogQ2FsbGluZyBhY3BpX3RiX2NoZWNrc3VtIGhlcmUgaXMgYSBsYXll cmluZyB2aW9sYXRpb24sIGJ1dAorICAgICAqIGludHJvZHVjaW5nIGEgd3JhcHBlciBmb3Igc3Vj aCBzaW1wbGUgdXNhZ2Ugc2VlbXMgb3ZlcmtpbGwuCisgICAgICovCisgICAgcnNkcC5jaGVja3N1 bSAtPSBhY3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FTVF9QVFIodTgsICZyc2RwKSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9SU0RQX1JFVjBfU0laRSk7CisgICAg cnNkcC5leHRlbmRlZF9jaGVja3N1bSAtPSBhY3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FTVF9QVFIo dTgsICZyc2RwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc2l6ZW9mKHJzZHApKTsKKworICAgIC8qCisgICAgICogUGxhY2UgdGhlIG5ldyBSU0RQIGlu IGd1ZXN0IG1lbW9yeSBzcGFjZS4KKyAgICAgKgorICAgICAqIE5COiB0aGlzIFJTRFAgaXMgbm90 IGdvaW5nIHRvIHJlcGxhY2UgdGhlIG9yaWdpbmFsIFJTRFAsIHdoaWNoIHNob3VsZAorICAgICAq IHN0aWxsIGJlIGFjY2Vzc2libGUgdG8gdGhlIGd1ZXN0LiBIb3dldmVyIHRoYXQgUlNEUCBpcyBn b2luZyB0byBwb2ludCB0bworICAgICAqIHRoZSBuYXRpdmUgUlNEVCwgYW5kIHNob3VsZCBub3Qg YmUgdXNlZCBmb3IgdGhlIERvbTAga2VybmVsJ3MgYm9vdAorICAgICAqIHB1cnBvc2VzICh3ZSBr ZWVwIGl0IHZpc2libGUgZm9yIHBvc3QgYm9vdCBhY2Nlc3MpLgorICAgICAqLworICAgIGlmICgg cHZoX3N0ZWFsX3JhbShkLCBzaXplb2YocnNkcCksIDAsIEdCKDQpLCAmcnNkcF9wYWRkcikgKQor ICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgZ3Vlc3QgUkFNIGZvciBS U0RQXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgLyogTWFyayB0 aGlzIHJlZ2lvbiBhcyBFODIwX0FDUEkuICovCisgICAgaWYgKCBwdmhfYWRkX21lbV9yYW5nZShk LCByc2RwX3BhZGRyLCByc2RwX3BhZGRyICsgc2l6ZW9mKHJzZHApLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgRTgyMF9BQ1BJKSApCisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBS U0RQIHJlZ2lvbiB0byBtZW1vcnkgbWFwXG4iKTsKKworICAgIC8qIENvcHkgUlNEUCBpbnRvIGd1 ZXN0IG1lbW9yeS4gKi8KKyAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMocnNkcF9wYWRk ciwgJnJzZHAsIHNpemVvZihyc2RwKSwgZC0+dmNwdVswXSk7CisgICAgaWYgKCByYyApCisgICAg eworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IFJTRFAgaW50byBndWVzdCBtZW1vcnlc biIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQ29weSBSU0RQIGFkZHJl c3MgdG8gc3RhcnRfaW5mby4gKi8KKyAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMoc3Rh cnRfaW5mbyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVj dCBodm1fc3RhcnRfaW5mbywgcnNkcF9wYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZyc2RwX3BhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl b2YoKChzdHJ1Y3QgaHZtX3N0YXJ0X2luZm8gKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAwKS0+cnNkcF9wYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGQtPnZjcHVbMF0pOworICAgIGlmICggcmMgKQorICAgIHsKKyAgICAgICAgcHJpbnRr KCJVbmFibGUgdG8gY29weSBSU0RQIGludG8gZ3Vlc3QgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0 dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgX19pbml0IGRvbTBfY29u c3RydWN0X3B2aChzdHJ1Y3QgZG9tYWluICpkLCBjb25zdCBtb2R1bGVfdCAqaW1hZ2UsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGltYWdlX2hlYWRyb29tLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3QgKmluaXRyZCwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKigqYm9vdHN0cmFwX21hcCkoY29uc3QgbW9kdWxl X3QgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjbWRsaW5lKQorewor ICAgIHBhZGRyX3QgZW50cnksIHN0YXJ0X2luZm87CisgICAgaW50IHJjOworCisgICAgcHJpbnRr KCIqKiBCdWlsZGluZyBhIFBWSCBEb20wICoqXG4iKTsKKworICAgIGlvbW11X2h3ZG9tX2luaXQo ZCk7CisKKyAgICByYyA9IHB2aF9zZXR1cF9wMm0oZCk7CisgICAgaWYgKCByYyApCisgICAgewor ICAgICAgICBwcmludGsoIkZhaWxlZCB0byBzZXR1cCBEb20wIHBoeXNpY2FsIG1lbW9yeSBtYXBc biIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBwdmhfbG9hZF9rZXJu ZWwoZCwgaW1hZ2UsIGltYWdlX2hlYWRyb29tLCBpbml0cmQsIGJvb3RzdHJhcF9tYXAoaW1hZ2Up LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNtZGxpbmUsICZlbnRyeSwgJnN0YXJ0X2luZm8p OworICAgIGlmICggcmMgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gbG9hZCBE b20wIGtlcm5lbFxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IHB2 aF9zZXR1cF9jcHVzKGQsIGVudHJ5LCBzdGFydF9pbmZvKTsKKyAgICBpZiAoIHJjICkKKyAgICB7 CisgICAgICAgIHByaW50aygiRmFpbGVkIHRvIHNldHVwIERvbTAgQ1BVczogJWRcbiIsIHJjKTsK KyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gcHZoX3NldHVwX2FjcGkoZCwg c3RhcnRfaW5mbyk7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBwcmludGsoIkZhaWxl ZCB0byBzZXR1cCBEb20wIEFDUEkgdGFibGVzOiAlZFxuIiwgcmMpOworICAgICAgICByZXR1cm4g cmM7CisgICAgfQorCisgICAgcGFuaWMoIkJ1aWxkaW5nIGEgUFZIdjIgRG9tMCBpcyBub3QgeWV0 IHN1cHBvcnRlZC4iKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxl czoKKyAqIG1vZGU6IEMKKyAqIGMtZmlsZS1zdHlsZTogIkJTRCIKKyAqIGMtYmFzaWMtb2Zmc2V0 OiA0CisgKiB0YWItd2lkdGg6IDQKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgor ICovCmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9hc20teDg2L2RvbTBfYnVpbGQuaCBiL3hlbi9p bmNsdWRlL2FzbS14ODYvZG9tMF9idWlsZC5oCmluZGV4IDVkMDkzNjczZDkuLmQ4M2QyYjQzODcg MTAwNjQ0Ci0tLSBhL3hlbi9pbmNsdWRlL2FzbS14ODYvZG9tMF9idWlsZC5oCisrKyBiL3hlbi9p bmNsdWRlL2FzbS14ODYvZG9tMF9idWlsZC5oCkBAIC0yMCw2ICsyMCwxNSBAQCBpbnQgZG9tMF9j b25zdHJ1Y3RfcHYoc3RydWN0IGRvbWFpbiAqZCwgY29uc3QgbW9kdWxlX3QgKmltYWdlLAogICAg ICAgICAgICAgICAgICAgICAgIHZvaWQgKigqYm9vdHN0cmFwX21hcCkoY29uc3QgbW9kdWxlX3Qg KiksCiAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21kbGluZSk7CiAKK2ludCBkb20wX2Nv bnN0cnVjdF9wdmgoc3RydWN0IGRvbWFpbiAqZCwgY29uc3QgbW9kdWxlX3QgKmltYWdlLAorICAg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGltYWdlX2hlYWRyb29tLAorICAgICAg ICAgICAgICAgICAgICAgICBtb2R1bGVfdCAqaW5pdHJkLAorICAgICAgICAgICAgICAgICAgICAg ICB2b2lkICooKmJvb3RzdHJhcF9tYXApKGNvbnN0IG1vZHVsZV90ICopLAorICAgICAgICAgICAg ICAgICAgICAgICBjaGFyICpjbWRsaW5lKTsKKwordW5zaWduZWQgbG9uZyBkb20wX3BhZ2luZ19w YWdlcyhjb25zdCBzdHJ1Y3QgZG9tYWluICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTsKKwogI2VuZGlmCS8qIF9ET00wX0JVSUxEX0hf ICovCiAKIC8qCi0tIAoyLjExLjAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4u b3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK