From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH v2 3/4] x86: split PVH dom0 builder to hvm/dom0_build.c Date: Thu, 16 Mar 2017 17:54:57 +0000 Message-ID: <20170316175458.22261-4-wei.liu2@citrix.com> References: <20170316175458.22261-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.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coZcE-0002GM-Nx for xen-devel@lists.xenproject.org; Thu, 16 Mar 2017 17:55:11 +0000 In-Reply-To: <20170316175458.22261-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 IExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4KLS0tCnYyOgoxLiBhZGQgY29weXJpZ2h0IGhlYWRl cgotLS0KIHhlbi9hcmNoL3g4Ni9kb20wX2J1aWxkLmMgICAgICAgIHwgMTA2OSArLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHhlbi9hcmNoL3g4Ni9odm0vTWFrZWZpbGUgICAg ICAgIHwgICAgMSArCiB4ZW4vYXJjaC94ODYvaHZtL2RvbTBfYnVpbGQuYyAgICB8IDExMTIgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHhlbi9pbmNsdWRlL2FzbS14ODYv ZG9tMF9idWlsZC5oIHwgICAgOSArCiA0IGZpbGVzIGNoYW5nZWQsIDExMjUgaW5zZXJ0aW9ucygr KSwgMTA2NiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vYXJjaC94ODYvaHZt L2RvbTBfYnVpbGQuYwoKZGlmZiAtLWdpdCBhL3hlbi9hcmNoL3g4Ni9kb20wX2J1aWxkLmMgYi94 ZW4vYXJjaC94ODYvZG9tMF9idWlsZC5jCmluZGV4IGM3NGY5YjUyZTAuLjc3MmYwNzdkNWEgMTAw NjQ0Ci0tLSBhL3hlbi9hcmNoL3g4Ni9kb20wX2J1aWxkLmMKKysrIGIveGVuL2FyY2gveDg2L2Rv bTBfYnVpbGQuYwpAQCAtNTAsMjcgKzUwLDYgQEAgc3RhdGljIGxvbmcgX19pbml0ZGF0YSBkb20w X25ycGFnZXM7CiBzdGF0aWMgbG9uZyBfX2luaXRkYXRhIGRvbTBfbWluX25ycGFnZXM7CiBzdGF0 aWMgbG9uZyBfX2luaXRkYXRhIGRvbTBfbWF4X25ycGFnZXMgPSBMT05HX01BWDsKIAotLyoKLSAq IEhhdmUgdGhlIFRTUyBjb3ZlciB0aGUgSVNBIHBvcnQgcmFuZ2UsIHdoaWNoIG1ha2VzIGl0Ci0g KiAtIDEwNCBieXRlcyBiYXNlIHN0cnVjdHVyZQotICogLSAzMiBieXRlcyBpbnRlcnJ1cHQgcmVk aXJlY3Rpb24gYml0bWFwCi0gKiAtIDEyOCBieXRlcyBJL08gYml0bWFwCi0gKiAtIG9uZSB0cmFp bGluZyBieXRlCi0gKiBvciBhIHRvdGFsIG9mIDI2NSBieXRlcy4KLSAqCi0gKiBOQjogYXMgUFZI djIgRG9tMCBkb2Vzbid0IGhhdmUgbGVnYWN5IGRldmljZXMgKElTQSksIGl0IHNob3VsZG4ndCBo YXZlIGFueQotICogYnVzaW5lc3MgaW4gYWNjZXNzaW5nIHRoZSBJU0EgcG9ydCByYW5nZSwgbXVj aCBsZXNzIGluIHJlYWwgbW9kZSwgYW5kIGR1ZSB0bwotICogdGhlIGxhY2sgb2YgZmlybXdhcmUg aXQgc2hvdWxkbid0IGFsc28gZXhlY3V0ZSBhbnkgSU5UIGluc3RydWN0aW9uLiBUaGlzIGlzCi0g KiBkb25lIGp1c3QgZm9yIGNvbnNpc3RlbmN5IHdpdGggd2hhdCBodm1sb2FkZXIgZG9lcy4KLSAq LwotI2RlZmluZSBIVk1fVk04Nl9UU1NfU0laRSAyNjUKLQotc3RhdGljIHVuc2lnbmVkIGludCBf X2luaXRkYXRhIGFjcGlfaW50cl9vdmVycmlkZXM7Ci1zdGF0aWMgc3RydWN0IGFjcGlfbWFkdF9p bnRlcnJ1cHRfb3ZlcnJpZGUgX19pbml0ZGF0YSAqaW50c3Jjb3ZyOwotCi1zdGF0aWMgdW5zaWdu ZWQgaW50IF9faW5pdGRhdGEgYWNwaV9ubWlfc291cmNlczsKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9t YWR0X25taV9zb3VyY2UgX19pbml0ZGF0YSAqbm1pc3JjOwotCiAvKgogICogZG9tMF9tZW09W21p bjo8bWluX2FtdD4sXVttYXg6PG1heF9hbXQ+LF1bPGFtdD5dCiAgKiAKQEAgLTI2MSw4ICsyNDAs OCBAQCBib29sZWFuX3BhcmFtKCJyby1ocGV0Iiwgcm9faHBldCk7CiAKIHVuc2lnbmVkIGludCBf X2luaXRkYXRhIGRvbTBfbWVtZmxhZ3MgPSBNRU1GX25vX2RtYXxNRU1GX2V4YWN0X25vZGU7CiAK LXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBkb20wX3BhZ2luZ19wYWdlcyhjb25zdCBzdHJ1 Y3QgZG9tYWluICpkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCit1bnNpZ25lZCBsb25nIF9faW5pdCBkb20wX3Bh Z2luZ19wYWdlcyhjb25zdCBzdHJ1Y3QgZG9tYWluICpkLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKIHsKICAgICAvKiBDb3Bp ZWQgZnJvbTogbGlieGxfZ2V0X3JlcXVpcmVkX3NoYWRvd19tZW1vcnkoKSAqLwogICAgIHVuc2ln bmVkIGxvbmcgbWVta2IgPSBucl9wYWdlcyAqIChQQUdFX1NJWkUgLyAxMDI0KTsKQEAgLTQ5Miwx MDQ4ICs0NzEsNiBAQCBpbnQgX19pbml0IGRvbTBfc2V0dXBfcGVybWlzc2lvbnMoc3RydWN0IGRv bWFpbiAqZCkKIH0KIAogCi1zdGF0aWMgaW50IF9faW5pdCBtb2RpZnlfaWRlbnRpdHlfbW1pbyhz dHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIHBmbiwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGNvbnN0IGJvb2wgbWFw KQotewotICAgIGludCByYzsKLQotICAgIGZvciAoIDsgOyApCi0gICAgewotICAgICAgICByYyA9 IChtYXAgPyBtYXBfbW1pb19yZWdpb25zIDogdW5tYXBfbW1pb19yZWdpb25zKQotICAgICAgICAg ICAgIChkLCBfZ2ZuKHBmbiksIG5yX3BhZ2VzLCBfbWZuKHBmbikpOwotICAgICAgICBpZiAoIHJj ID09IDAgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICggcmMgPCAwICkKLSAgICAg ICAgewotICAgICAgICAgICAgcHJpbnRrKFhFTkxPR19XQVJOSU5HCi0gICAgICAgICAgICAgICAg ICAgIkZhaWxlZCB0byBpZGVudGl0eSAlc21hcCBbJSNseCwlI2x4KSBmb3IgZCVkOiAlZFxuIiwK LSAgICAgICAgICAgICAgICAgICBtYXAgPyAiIiA6ICJ1biIsIHBmbiwgcGZuICsgbnJfcGFnZXMs IGQtPmRvbWFpbl9pZCwgcmMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg ICAgbnJfcGFnZXMgLT0gcmM7Ci0gICAgICAgIHBmbiArPSByYzsKLSAgICAgICAgcHJvY2Vzc19w ZW5kaW5nX3NvZnRpcnFzKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJjOwotfQotCi0vKiBQb3B1 bGF0ZSBhIEhWTSBtZW1vcnkgcmFuZ2UgdXNpbmcgdGhlIGJpZ2dlc3QgcG9zc2libGUgb3JkZXIu ICovCi1zdGF0aWMgaW50IF9faW5pdCBwdmhfcG9wdWxhdGVfbWVtb3J5X3JhbmdlKHN0cnVjdCBk b21haW4gKmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGxvbmcgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCi17Ci0gICAgdW5zaWduZWQgaW50IG9yZGVy LCBpID0gMDsKLSAgICBzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlOwotICAgIGludCByYzsKLSNkZWZp bmUgTUFQX01BWF9JVEVSIDY0Ci0KLSAgICBvcmRlciA9IE1BWF9PUkRFUjsKLSAgICB3aGlsZSAo IG5yX3BhZ2VzICE9IDAgKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHJhbmdlX29yZGVy ID0gZ2V0X29yZGVyX2Zyb21fcGFnZXMobnJfcGFnZXMgKyAxKTsKLQotICAgICAgICBvcmRlciA9 IG1pbihyYW5nZV9vcmRlciA/IHJhbmdlX29yZGVyIC0gMSA6IDAsIG9yZGVyKTsKLSAgICAgICAg cGFnZSA9IGFsbG9jX2RvbWhlYXBfcGFnZXMoZCwgb3JkZXIsIGRvbTBfbWVtZmxhZ3MpOwotICAg ICAgICBpZiAoIHBhZ2UgPT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggb3Jk ZXIgPT0gMCAmJiBkb20wX21lbWZsYWdzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAg ICAvKiBUcnkgYWdhaW4gd2l0aG91dCBhbnkgZG9tMF9tZW1mbGFncy4gKi8KLSAgICAgICAgICAg ICAgICBkb20wX21lbWZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICBvcmRlciA9IE1BWF9PUkRF UjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg IGlmICggb3JkZXIgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRr KCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IHdpdGggb3JkZXIgMCFcbiIpOwotICAgICAgICAg ICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3JkZXIt LTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmMgPSBndWVz dF9waHlzbWFwX2FkZF9wYWdlKGQsIF9nZm4oc3RhcnQpLCBfbWZuKHBhZ2VfdG9fbWZuKHBhZ2Up KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKLSAgICAgICAg aWYgKCByYyAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8g cG9wdWxhdGUgbWVtb3J5OiBbJSNseCwlbHgpOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBz dGFydCwgc3RhcnQgKyAoMVVMIDw8IG9yZGVyKSwgcmMpOwotICAgICAgICAgICAgcmV0dXJuIC1F Tk9NRU07Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgKz0gMVVMIDw8IG9yZGVyOwotICAgICAg ICBucl9wYWdlcyAtPSAxVUwgPDwgb3JkZXI7Ci0gICAgICAgIGlmICggKCsraSAlIE1BUF9NQVhf SVRFUikgPT0gMCApCi0gICAgICAgICAgICBwcm9jZXNzX3BlbmRpbmdfc29mdGlycXMoKTsKLSAg ICB9Ci0KLSAgICByZXR1cm4gMDsKLSN1bmRlZiBNQVBfTUFYX0lURVIKLX0KLQotLyogU3RlYWwg UkFNIGZyb20gdGhlIGVuZCBvZiBhIG1lbW9yeSByZWdpb24uICovCi1zdGF0aWMgaW50IF9faW5p dCBwdmhfc3RlYWxfcmFtKHN0cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwgcGFkZHJf dCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCAqYWRkcikK LXsKLSAgICB1bnNpZ25lZCBpbnQgaSA9IGQtPmFyY2gubnJfZTgyMDsKLQotICAgIC8qCi0gICAg ICogQWxpZ25tZW50IDAgc2hvdWxkIGJlIHNldCB0byAxLCBzbyBpdCBkb2Vzbid0IHdyYXAgYXJv dW5kIGluIHRoZQotICAgICAqIGNhbGN1bGF0aW9ucyBiZWxvdy4KLSAgICAgKi8KLSAgICBhbGln biA9IGFsaWduID8gOiAxOwotICAgIHdoaWxlICggaS0tICkKLSAgICB7Ci0gICAgICAgIHN0cnVj dCBlODIwZW50cnkgKmVudHJ5ID0gJmQtPmFyY2guZTgyMFtpXTsKLQotICAgICAgICBpZiAoIGVu dHJ5LT50eXBlICE9IEU4MjBfUkFNIHx8IGVudHJ5LT5hZGRyICsgZW50cnktPnNpemUgPiBsaW1p dCB8fAotICAgICAgICAgICAgIGVudHJ5LT5hZGRyIDwgTUIoMSkgKQotICAgICAgICAgICAgY29u dGludWU7Ci0KLSAgICAgICAgKmFkZHIgPSAoZW50cnktPmFkZHIgKyBlbnRyeS0+c2l6ZSAtIHNp emUpICYgfihhbGlnbiAtIDEpOwotICAgICAgICBpZiAoICphZGRyIDwgZW50cnktPmFkZHIgKQot ICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZW50cnktPnNpemUgPSAqYWRkciAtIGVu dHJ5LT5hZGRyOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gLUVOT01F TTsKLX0KLQotLyogTkI6IG1lbW9yeSBtYXAgbXVzdCBiZSBzb3J0ZWQgYXQgYWxsIHRpbWVzIGZv ciB0aGlzIHRvIHdvcmsgY29ycmVjdGx5LiAqLwotc3RhdGljIGludCBfX2luaXQgcHZoX2FkZF9t ZW1fcmFuZ2Uoc3RydWN0IGRvbWFpbiAqZCwgdWludDY0X3QgcywgdWludDY0X3QgZSwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eXBlKQotewotICAg IHN0cnVjdCBlODIwZW50cnkgKm1hcDsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIGZvciAo IGkgPSAwOyBpIDwgZC0+YXJjaC5ucl9lODIwOyBpKysgKQotICAgIHsKLSAgICAgICAgdWludDY0 X3QgcnMgPSBkLT5hcmNoLmU4MjBbaV0uYWRkcjsKLSAgICAgICAgdWludDY0X3QgcmUgPSBycyAr IGQtPmFyY2guZTgyMFtpXS5zaXplOwotCi0gICAgICAgIGlmICggcnMgPT0gZSAmJiBkLT5hcmNo LmU4MjBbaV0udHlwZSA9PSB0eXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZC0+YXJjaC5l ODIwW2ldLmFkZHIgPSBzOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAg ICAgICBpZiAoIHJlID09IHMgJiYgZC0+YXJjaC5lODIwW2ldLnR5cGUgPT0gdHlwZSAmJgotICAg ICAgICAgICAgIChpICsgMSA9PSBkLT5hcmNoLm5yX2U4MjAgfHwgZC0+YXJjaC5lODIwW2kgKyAx XS5hZGRyID49IGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnNp emUgKz0gZSAtIHM7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAg IGlmICggcnMgPj0gZSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIHJlID4g cyApCi0gICAgICAgICAgICByZXR1cm4gLUVFWElTVDsKLSAgICB9Ci0KLSAgICBtYXAgPSB4emFs bG9jX2FycmF5KHN0cnVjdCBlODIwZW50cnksIGQtPmFyY2gubnJfZTgyMCArIDEpOwotICAgIGlm ICggIW1hcCApCi0gICAgewotICAgICAgICBwcmludGsoWEVOTE9HX1dBUk5JTkcgIkU4MjA6IG91 dCBvZiBtZW1vcnkgdG8gYWRkIHJlZ2lvblxuIik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwot ICAgIH0KLQotICAgIG1lbWNweShtYXAsIGQtPmFyY2guZTgyMCwgaSAqIHNpemVvZigqZC0+YXJj aC5lODIwKSk7Ci0gICAgbWVtY3B5KG1hcCArIGkgKyAxLCBkLT5hcmNoLmU4MjAgKyBpLAotICAg ICAgICAgICAoZC0+YXJjaC5ucl9lODIwIC0gaSkgKiBzaXplb2YoKmQtPmFyY2guZTgyMCkpOwot ICAgIG1hcFtpXS5hZGRyID0gczsKLSAgICBtYXBbaV0uc2l6ZSA9IGUgLSBzOwotICAgIG1hcFtp XS50eXBlID0gdHlwZTsKLSAgICB4ZnJlZShkLT5hcmNoLmU4MjApOwotICAgIGQtPmFyY2guZTgy MCA9IG1hcDsKLSAgICBkLT5hcmNoLm5yX2U4MjArKzsKLQotICAgIHJldHVybiAwOwotfQotCi1z dGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBfdm14X3JlYWxtb2RlX2hlbHBlcnMoc3RydWN0IGRv bWFpbiAqZCkKLXsKLSAgICBwMm1fdHlwZV90IHAybXQ7Ci0gICAgdWludDMyX3QgcmMsICppZGVu dF9wdDsKLSAgICBtZm5fdCBtZm47Ci0gICAgcGFkZHJfdCBnYWRkcjsKLSAgICBzdHJ1Y3QgdmNw dSAqdiA9IGQtPnZjcHVbMF07Ci0KLSAgICAvKgotICAgICAqIFN0ZWFsIHNvbWUgc3BhY2UgZnJv bSB0aGUgbGFzdCBSQU0gcmVnaW9uIGJlbG93IDRHQiBhbmQgdXNlIGl0IHRvCi0gICAgICogc3Rv cmUgdGhlIHJlYWwtbW9kZSBUU1MuIEl0IG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gMTI4IHNvIHRo YXQgdGhlCi0gICAgICogVFNTIHN0cnVjdHVyZSAod2hpY2ggYWNjb3VudHMgZm9yIHRoZSBmaXJz dCAxMDRiKSBkb2Vzbid0IGNyb3NzCi0gICAgICogYSBwYWdlIGJvdW5kYXJ5LgotICAgICAqLwot ICAgIGlmICggIXB2aF9zdGVhbF9yYW0oZCwgSFZNX1ZNODZfVFNTX1NJWkUsIDEyOCwgR0IoNCks ICZnYWRkcikgKQotICAgIHsKLSAgICAgICAgaWYgKCBodm1fY29weV90b19ndWVzdF9waHlzKGdh ZGRyLCBOVUxMLCBIVk1fVk04Nl9UU1NfU0laRSwgdikgIT0KLSAgICAgICAgICAgICBIVk1DT1BZ X29rYXkgKQotICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gemVybyBWTTg2IFRTUyBhcmVh XG4iKTsKLSAgICAgICAgZC0+YXJjaC5odm1fZG9tYWluLnBhcmFtc1tIVk1fUEFSQU1fVk04Nl9U U1NfU0laRURdID0KLSAgICAgICAgICAgIFZNODZfVFNTX1VQREFURUQgfCAoKHVpbnQ2NF90KUhW TV9WTTg2X1RTU19TSVpFIDw8IDMyKSB8IGdhZGRyOwotICAgICAgICBpZiAoIHB2aF9hZGRfbWVt X3JhbmdlKGQsIGdhZGRyLCBnYWRkciArIEhWTV9WTTg2X1RTU19TSVpFLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEU4MjBfUkVTRVJWRUQpICkKLSAgICAgICAgICAgIHByaW50aygi VW5hYmxlIHRvIHNldCBWTTg2IFRTUyBhcyByZXNlcnZlZCBpbiB0aGUgbWVtb3J5IG1hcFxuIik7 Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgVk04 NiBUU1MgYXJlYVxuIik7Ci0KLSAgICAvKiBTdGVhbCBzb21lIG1vcmUgUkFNIGZvciB0aGUgaWRl bnRpdHkgcGFnZSB0YWJsZXMuICovCi0gICAgaWYgKCBwdmhfc3RlYWxfcmFtKGQsIFBBR0VfU0la RSwgUEFHRV9TSVpFLCBHQig0KSwgJmdhZGRyKSApCi0gICAgewotICAgICAgICBwcmludGsoIlVu YWJsZSB0byBmaW5kIG1lbW9yeSB0byBzdGFzaCB0aGUgaWRlbnRpdHkgcGFnZSB0YWJsZXNcbiIp OwotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElkZW50 aXR5LW1hcCBwYWdlIHRhYmxlIGlzIHJlcXVpcmVkIGZvciBydW5uaW5nIHdpdGggQ1IwLlBHPTAK LSAgICAgKiB3aGVuIHVzaW5nIEludGVsIEVQVC4gQ3JlYXRlIGEgMzItYml0IG5vbi1QQUUgcGFn ZSBkaXJlY3Rvcnkgb2YKLSAgICAgKiBzdXBlcnBhZ2VzLgotICAgICAqLwotICAgIGlkZW50X3B0 ID0gbWFwX2RvbWFpbl9nZm4ocDJtX2dldF9ob3N0cDJtKGQpLCBfZ2ZuKFBGTl9ET1dOKGdhZGRy KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWZuLCAmcDJtdCwgMCwgJnJjKTsK LSAgICBpZiAoIGlkZW50X3B0ID09IE5VTEwgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFi bGUgdG8gbWFwIGlkZW50aXR5IHBhZ2UgdGFibGVzXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FTk9N RU07Ci0gICAgfQotICAgIHdyaXRlXzMyYml0X3BzZV9pZGVudG1hcChpZGVudF9wdCk7Ci0gICAg dW5tYXBfZG9tYWluX3BhZ2UoaWRlbnRfcHQpOwotICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKG1m bl94KG1mbikpKTsKLSAgICBkLT5hcmNoLmh2bV9kb21haW4ucGFyYW1zW0hWTV9QQVJBTV9JREVO VF9QVF0gPSBnYWRkcjsKLSAgICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQsIGdhZGRyLCBnYWRk ciArIFBBR0VfU0laRSwgRTgyMF9SRVNFUlZFRCkgKQotICAgICAgICAgICAgcHJpbnRrKCJVbmFi bGUgdG8gc2V0IGlkZW50aXR5IHBhZ2UgdGFibGVzIGFzIHJlc2VydmVkIGluIHRoZSBtZW1vcnkg bWFwXG4iKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vKiBBc3NpZ24gdGhlIGxvdyAxTUIgdG8g RG9tMC4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBwdmhfc3RlYWxfbG93X3JhbShzdHJ1Y3QgZG9t YWluICpkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBt Zm47Ci0KLSAgICBBU1NFUlQoc3RhcnQgKyBucl9wYWdlcyA8PSBQRk5fRE9XTihNQigxKSkpOwot Ci0gICAgZm9yICggbWZuID0gc3RhcnQ7IG1mbiA8IHN0YXJ0ICsgbnJfcGFnZXM7IG1mbisrICkK LSAgICB7Ci0gICAgICAgIHN0cnVjdCBwYWdlX2luZm8gKnBnID0gbWZuX3RvX3BhZ2UobWZuKTsK LSAgICAgICAgaW50IHJjOwotCi0gICAgICAgIHJjID0gdW5zaGFyZV94ZW5fcGFnZV93aXRoX2d1 ZXN0KHBnLCBkb21faW8pOwotICAgICAgICBpZiAoIHJjICkKLSAgICAgICAgewotICAgICAgICAg ICAgcHJpbnRrKCJVbmFibGUgdG8gdW5zaGFyZSBYZW4gbWZuICUjbHg6ICVkXG4iLCBtZm4sIHJj KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2hhcmVfeGVu X3BhZ2Vfd2l0aF9ndWVzdChwZywgZCwgWEVOU0hBUkVfd3JpdGFibGUpOwotICAgICAgICByYyA9 IGd1ZXN0X3BoeXNtYXBfYWRkX2VudHJ5KGQsIF9nZm4obWZuKSwgX21mbihtZm4pLCAwLCBwMm1f cmFtX3J3KTsKLSAgICAgICAgaWYgKCByYyApCi0gICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0 byBhZGQgbWZuICUjbHggdG8gcDJtOiAlZFxuIiwgbWZuLCByYyk7Ci0gICAgfQotfQotCi1zdGF0 aWMgX19pbml0IHZvaWQgcHZoX3NldHVwX2U4MjAoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQg bG9uZyBucl9wYWdlcykKLXsKLSAgICBzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeSwgKmVudHJ5X2d1 ZXN0OwotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGxvbmcgcGFnZXMsIGN1cl9w YWdlcyA9IDA7Ci0gICAgdWludDY0X3Qgc3RhcnQsIGVuZDsKLQotICAgIC8qCi0gICAgICogQ3Jh ZnQgdGhlIGU4MjAgbWVtb3J5IG1hcCBmb3IgRG9tMCBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgZTgy MCBtYXAuCi0gICAgICovCi0gICAgZC0+YXJjaC5lODIwID0geHphbGxvY19hcnJheShzdHJ1Y3Qg ZTgyMGVudHJ5LCBlODIwLm5yX21hcCk7Ci0gICAgaWYgKCAhZC0+YXJjaC5lODIwICkKLSAgICAg ICAgcGFuaWMoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIERvbTAgZTgyMCBtYXAiKTsK LSAgICBlbnRyeV9ndWVzdCA9IGQtPmFyY2guZTgyMDsKLQotICAgIC8qIENsYW1wIGU4MjAgbWVt b3J5IG1hcCB0byBtYXRjaCB0aGUgbWVtb3J5IGFzc2lnbmVkIHRvIERvbTAgKi8KLSAgICBmb3Ig KCBpID0gMCwgZW50cnkgPSBlODIwLm1hcDsgaSA8IGU4MjAubnJfbWFwOyBpKyssIGVudHJ5Kysg KQotICAgIHsKLSAgICAgICAgaWYgKCBlbnRyeS0+dHlwZSAhPSBFODIwX1JBTSApCi0gICAgICAg IHsKLSAgICAgICAgICAgICplbnRyeV9ndWVzdCA9ICplbnRyeTsKLSAgICAgICAgICAgIGdvdG8g bmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbnJfcGFnZXMgPT0gY3VyX3BhZ2VzICkK LSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFdlIGFscmVhZHkgaGF2 ZSBhbGwgdGhlIGFzc2lnbmVkIG1lbW9yeSwKLSAgICAgICAgICAgICAqIHNraXAgdGhpcyBlbnRy eQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0g ICAgICAgIC8qCi0gICAgICAgICAqIE1ha2Ugc3VyZSB0aGUgc3RhcnQgYW5kIGxlbmd0aCBhcmUg YWxpZ25lZCB0byBQQUdFX1NJWkUsIGJlY2F1c2UKLSAgICAgICAgICogdGhhdCdzIHRoZSBtaW5p bXVtIGdyYW51bGFyaXR5IG9mIHRoZSAybmQgc3RhZ2UgdHJhbnNsYXRpb24uIFNpbmNlCi0gICAg ICAgICAqIHRoZSBwMm0gY29kZSB1c2VzIFBBR0VfT1JERVJfNEsgaW50ZXJuYWxseSwgYWxzbyB1 c2UgaXQgaGVyZSBpbgotICAgICAgICAgKiBvcmRlciB0byBwcmV2ZW50IHRoaXMgY29kZSBmcm9t IGdldHRpbmcgb3V0IG9mIHN5bmMuCi0gICAgICAgICAqLwotICAgICAgICBzdGFydCA9IFJPVU5E VVAoZW50cnktPmFkZHIsIFBBR0VfU0laRSA8PCBQQUdFX09SREVSXzRLKTsKLSAgICAgICAgZW5k ID0gKGVudHJ5LT5hZGRyICsgZW50cnktPnNpemUpICYKLSAgICAgICAgICAgICAgfigoUEFHRV9T SVpFIDw8IFBBR0VfT1JERVJfNEspIC0gMSk7Ci0gICAgICAgIGlmICggc3RhcnQgPj0gZW5kICkK LSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGVudHJ5X2d1ZXN0LT50eXBlID0gRTgy MF9SQU07Ci0gICAgICAgIGVudHJ5X2d1ZXN0LT5hZGRyID0gc3RhcnQ7Ci0gICAgICAgIGVudHJ5 X2d1ZXN0LT5zaXplID0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgIHBhZ2VzID0gUEZOX0RPV04oZW50 cnlfZ3Vlc3QtPnNpemUpOwotICAgICAgICBpZiAoIChjdXJfcGFnZXMgKyBwYWdlcykgPiBucl9w YWdlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRydW5jYXRlIHJlZ2lvbiAqLwotICAg ICAgICAgICAgZW50cnlfZ3Vlc3QtPnNpemUgPSAobnJfcGFnZXMgLSBjdXJfcGFnZXMpIDw8IFBB R0VfU0hJRlQ7Ci0gICAgICAgICAgICBjdXJfcGFnZXMgPSBucl9wYWdlczsKLSAgICAgICAgfQot ICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cl9wYWdlcyArPSBwYWdlczsK LSAgICAgICAgfQotIG5leHQ6Ci0gICAgICAgIGQtPmFyY2gubnJfZTgyMCsrOwotICAgICAgICBl bnRyeV9ndWVzdCsrOwotICAgIH0KLSAgICBBU1NFUlQoY3VyX3BhZ2VzID09IG5yX3BhZ2VzKTsK LSAgICBBU1NFUlQoZC0+YXJjaC5ucl9lODIwIDw9IGU4MjAubnJfbWFwKTsKLX0KLQotc3RhdGlj IGludCBfX2luaXQgcHZoX3NldHVwX3AybShzdHJ1Y3QgZG9tYWluICpkKQotewotICAgIHN0cnVj dCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwotICAg IHVuc2lnbmVkIGludCBpOwotICAgIGludCByYzsKLSAgICBib29sIHByZWVtcHRlZDsKLSNkZWZp bmUgTUIxX1BBR0VTIFBGTl9ET1dOKE1CKDEpKQotCi0gICAgbnJfcGFnZXMgPSBkb20wX2NvbXB1 dGVfbnJfcGFnZXMoZCwgTlVMTCwgMCk7Ci0KLSAgICBwdmhfc2V0dXBfZTgyMChkLCBucl9wYWdl cyk7Ci0gICAgZG8gewotICAgICAgICBwcmVlbXB0ZWQgPSBmYWxzZTsKLSAgICAgICAgcGFnaW5n X3NldF9hbGxvY2F0aW9uKGQsIGRvbTBfcGFnaW5nX3BhZ2VzKGQsIG5yX3BhZ2VzKSwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVlbXB0ZWQpOwotICAgICAgICBwcm9jZXNzX3Bl bmRpbmdfc29mdGlycXMoKTsKLSAgICB9IHdoaWxlICggcHJlZW1wdGVkICk7Ci0KLSAgICAvKgot ICAgICAqIE1lbW9yeSBiZWxvdyAxTUIgaXMgaWRlbnRpdHkgbWFwcGVkLgotICAgICAqIE5COiB0 aGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBib290ZWQgZnJvbSBsZWdhY3kgQklPUy4KLSAgICAg Ki8KLSAgICByYyA9IG1vZGlmeV9pZGVudGl0eV9tbWlvKGQsIDAsIE1CMV9QQUdFUywgdHJ1ZSk7 Ci0gICAgaWYgKCByYyApCi0gICAgewotICAgICAgICBwcmludGsoIkZhaWxlZCB0byBpZGVudGl0 eSBtYXAgbG93IDFNQjogJWRcbiIsIHJjKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQot ICAgIC8qIFBvcHVsYXRlIG1lbW9yeSBtYXAuICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBkLT5h cmNoLm5yX2U4MjA7IGkrKyApCi0gICAgewotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHNp emU7Ci0KLSAgICAgICAgaWYgKCBkLT5hcmNoLmU4MjBbaV0udHlwZSAhPSBFODIwX1JBTSApCi0g ICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBhZGRyID0gUEZOX0RPV04oZC0+YXJjaC5l ODIwW2ldLmFkZHIpOwotICAgICAgICBzaXplID0gUEZOX0RPV04oZC0+YXJjaC5lODIwW2ldLnNp emUpOwotCi0gICAgICAgIGlmICggYWRkciA+PSBNQjFfUEFHRVMgKQotICAgICAgICAgICAgcmMg PSBwdmhfcG9wdWxhdGVfbWVtb3J5X3JhbmdlKGQsIGFkZHIsIHNpemUpOwotICAgICAgICBlbHNl Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChhZGRyICsgc2l6ZSA8IE1CMV9QQUdFUyk7 Ci0gICAgICAgICAgICBwdmhfc3RlYWxfbG93X3JhbShkLCBhZGRyLCBzaXplKTsKLSAgICAgICAg fQotCi0gICAgICAgIGlmICggcmMgKQotICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQot ICAgIGlmICggY3B1X2hhc192bXggJiYgcGFnaW5nX21vZGVfaGFwKGQpICYmICF2bXhfdW5yZXN0 cmljdGVkX2d1ZXN0KHYpICkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFNpbmNlIERv bTAgY2Fubm90IGJlIG1pZ3JhdGVkLCB3ZSB3aWxsIG9ubHkgc2V0dXAgdGhlCi0gICAgICAgICAq IHVucmVzdHJpY3RlZCBndWVzdCBoZWxwZXJzIGlmIHRoZXkgYXJlIG5lZWRlZCBieSB0aGUgY3Vy cmVudAotICAgICAgICAgKiBoYXJkd2FyZSB3ZSBhcmUgcnVubmluZyBvbi4KLSAgICAgICAgICov Ci0gICAgICAgIHJjID0gcHZoX3NldHVwX3ZteF9yZWFsbW9kZV9oZWxwZXJzKGQpOwotICAgICAg ICBpZiAoIHJjICkKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByZXR1cm4g MDsKLSN1bmRlZiBNQjFfUEFHRVMKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHZoX2xvYWRfa2Vy bmVsKHN0cnVjdCBkb21haW4gKmQsIGNvbnN0IG1vZHVsZV90ICppbWFnZSwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGltYWdlX2hlYWRyb29tLAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV90ICppbml0cmQsIHZvaWQgKmlt YWdlX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21kbGlu ZSwgcGFkZHJfdCAqZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFk ZHJfdCAqc3RhcnRfaW5mb19hZGRyKQotewotICAgIHZvaWQgKmltYWdlX3N0YXJ0ID0gaW1hZ2Vf YmFzZSArIGltYWdlX2hlYWRyb29tOwotICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2VfbGVuID0gaW1h Z2UtPm1vZF9lbmQ7Ci0gICAgc3RydWN0IGVsZl9iaW5hcnkgZWxmOwotICAgIHN0cnVjdCBlbGZf ZG9tX3Bhcm1zIHBhcm1zOwotICAgIHBhZGRyX3QgbGFzdF9hZGRyOwotICAgIHN0cnVjdCBodm1f c3RhcnRfaW5mbyBzdGFydF9pbmZvID0geyAwIH07Ci0gICAgc3RydWN0IGh2bV9tb2RsaXN0X2Vu dHJ5IG1vZCA9IHsgMCB9OwotICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAgICBp bnQgcmM7Ci0KLSAgICBpZiAoIChyYyA9IGJ6aW1hZ2VfcGFyc2UoaW1hZ2VfYmFzZSwgJmltYWdl X3N0YXJ0LCAmaW1hZ2VfbGVuKSkgIT0gMCApCi0gICAgewotICAgICAgICBwcmludGsoIkVycm9y IHRyeWluZyB0byBkZXRlY3QgYnogY29tcHJlc3NlZCBrZXJuZWxcbiIpOwotICAgICAgICByZXR1 cm4gcmM7Ci0gICAgfQotCi0gICAgaWYgKCAocmMgPSBlbGZfaW5pdCgmZWxmLCBpbWFnZV9zdGFy dCwgaW1hZ2VfbGVuKSkgIT0gMCApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBp bml0IEVMRlxuIik7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0jaWZkZWYgVkVSQk9TRQot ICAgIGVsZl9zZXRfdmVyYm9zZSgmZWxmKTsKLSNlbmRpZgotICAgIGVsZl9wYXJzZV9iaW5hcnko JmVsZik7Ci0gICAgaWYgKCAocmMgPSBlbGZfeGVuX3BhcnNlKCZlbGYsICZwYXJtcykpICE9IDAg KQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gcGFyc2Uga2VybmVsIGZvciBFTEZO T1RFU1xuIik7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICBpZiAoIHBhcm1zLnBo eXNfZW50cnkgPT0gVU5TRVRfQUREUjMyICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxl IHRvIGZpbmQgWEVOX0VMRk5PVEVfUEhZUzMyX0VOVFJZIGFkZHJlc3NcbiIpOwotICAgICAgICBy ZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBwcmludGsoIk9TOiAlcyB2ZXJzaW9uOiAlcyBs b2FkZXI6ICVzIGJpdG5lc3M6ICVzXG4iLCBwYXJtcy5ndWVzdF9vcywKLSAgICAgICAgICAgcGFy bXMuZ3Vlc3RfdmVyLCBwYXJtcy5sb2FkZXIsCi0gICAgICAgICAgIGVsZl82NGJpdCgmZWxmKSA/ ICI2NC1iaXQiIDogIjMyLWJpdCIpOwotCi0gICAgLyogQ29weSB0aGUgT1MgaW1hZ2UgYW5kIGZy ZWUgdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KLSAgICBlbGYuZGVzdF9iYXNlID0gKHZvaWQgKikocGFy bXMudmlydF9rc3RhcnQgLSBwYXJtcy52aXJ0X2Jhc2UpOwotICAgIGVsZi5kZXN0X3NpemUgPSBw YXJtcy52aXJ0X2tlbmQgLSBwYXJtcy52aXJ0X2tzdGFydDsKLQotICAgIGVsZl9zZXRfdmNwdSgm ZWxmLCB2KTsKLSAgICByYyA9IGVsZl9sb2FkX2JpbmFyeSgmZWxmKTsKLSAgICBpZiAoIHJjIDwg MCApCi0gICAgewotICAgICAgICBwcmludGsoIkZhaWxlZCB0byBsb2FkIGtlcm5lbDogJWRcbiIs IHJjKTsKLSAgICAgICAgcHJpbnRrKCJYZW4gZG9tMCBrZXJuZWwgYnJva2VuIEVMRjogJXNcbiIs IGVsZl9jaGVja19icm9rZW4oJmVsZikpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0g ICAgbGFzdF9hZGRyID0gUk9VTkRVUChwYXJtcy52aXJ0X2tlbmQgLSBwYXJtcy52aXJ0X2Jhc2Us IFBBR0VfU0laRSk7Ci0KLSAgICBpZiAoIGluaXRyZCAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAg IHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhsYXN0X2FkZHIsIG1mbl90b192aXJ0KGluaXRy ZC0+bW9kX3N0YXJ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRy ZC0+bW9kX2VuZCwgdik7Ci0gICAgICAgIGlmICggcmMgKQotICAgICAgICB7Ci0gICAgICAgICAg ICBwcmludGsoIlVuYWJsZSB0byBjb3B5IGluaXRyZCB0byBndWVzdFxuIik7Ci0gICAgICAgICAg ICByZXR1cm4gcmM7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2QucGFkZHIgPSBsYXN0X2FkZHI7 Ci0gICAgICAgIG1vZC5zaXplID0gaW5pdHJkLT5tb2RfZW5kOwotICAgICAgICBsYXN0X2FkZHIg Kz0gUk9VTkRVUChpbml0cmQtPm1vZF9lbmQsIFBBR0VfU0laRSk7Ci0gICAgfQotCi0gICAgLyog RnJlZSB0ZW1wb3JhcnkgYnVmZmVycy4gKi8KLSAgICBkaXNjYXJkX2luaXRpYWxfaW1hZ2VzKCk7 Ci0KLSAgICBpZiAoIGNtZGxpbmUgIT0gTlVMTCApCi0gICAgewotICAgICAgICByYyA9IGh2bV9j b3B5X3RvX2d1ZXN0X3BoeXMobGFzdF9hZGRyLCBjbWRsaW5lLCBzdHJsZW4oY21kbGluZSkgKyAx LCB2KTsKLSAgICAgICAgaWYgKCByYyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50aygi VW5hYmxlIHRvIGNvcHkgZ3Vlc3QgY29tbWFuZCBsaW5lXG4iKTsKLSAgICAgICAgICAgIHJldHVy biByYzsKLSAgICAgICAgfQotICAgICAgICBzdGFydF9pbmZvLmNtZGxpbmVfcGFkZHIgPSBsYXN0 X2FkZHI7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFJvdW5kIHVwIHRvIDMyLzY0IGJpdHMgKGRl cGVuZGluZyBvbiB0aGUgZ3Vlc3Qga2VybmVsIGJpdG5lc3MpIHNvCi0gICAgICAgICAqIHRoZSBt b2RsaXN0L3N0YXJ0X2luZm8gaXMgYWxpZ25lZC4KLSAgICAgICAgICovCi0gICAgICAgIGxhc3Rf YWRkciArPSBST1VORFVQKHN0cmxlbihjbWRsaW5lKSArIDEsIGVsZl82NGJpdCgmZWxmKSA/IDgg OiA0KTsKLSAgICB9Ci0gICAgaWYgKCBpbml0cmQgIT0gTlVMTCApCi0gICAgewotICAgICAgICBy YyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMobGFzdF9hZGRyLCAmbW9kLCBzaXplb2YobW9kKSwg dik7Ci0gICAgICAgIGlmICggcmMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIlVu YWJsZSB0byBjb3B5IGd1ZXN0IG1vZHVsZXNcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJjOwot ICAgICAgICB9Ci0gICAgICAgIHN0YXJ0X2luZm8ubW9kbGlzdF9wYWRkciA9IGxhc3RfYWRkcjsK LSAgICAgICAgc3RhcnRfaW5mby5ucl9tb2R1bGVzID0gMTsKLSAgICAgICAgbGFzdF9hZGRyICs9 IHNpemVvZihtb2QpOwotICAgIH0KLQotICAgIHN0YXJ0X2luZm8ubWFnaWMgPSBYRU5fSFZNX1NU QVJUX01BR0lDX1ZBTFVFOwotICAgIHN0YXJ0X2luZm8uZmxhZ3MgPSBTSUZfUFJJVklMRUdFRCB8 IFNJRl9JTklURE9NQUlOOwotICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhsYXN0X2Fk ZHIsICZzdGFydF9pbmZvLCBzaXplb2Yoc3RhcnRfaW5mbyksIHYpOwotICAgIGlmICggcmMgKQot ICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gY29weSBzdGFydCBpbmZvIHRvIGd1ZXN0 XG4iKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgICplbnRyeSA9IHBhcm1zLnBo eXNfZW50cnk7Ci0gICAgKnN0YXJ0X2luZm9fYWRkciA9IGxhc3RfYWRkcjsKLQotICAgIHJldHVy biAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBfY3B1cyhzdHJ1Y3QgZG9tYWlu ICpkLCBwYWRkcl90IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFk ZHJfdCBzdGFydF9pbmZvKQotewotICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAg ICB1bnNpZ25lZCBpbnQgY3B1LCBpOwotICAgIGludCByYzsKLSAgICAvKiAKLSAgICAgKiBUaGlz IHNldHMgdGhlIHZDUFUgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBkZXNjcmliZWQgaW4K LSAgICAgKiBkb2NzL21pc2MvaHZtbGl0ZS5tYXJrZG93bi4KLSAgICAgKi8KLSAgICB2Y3B1X2h2 bV9jb250ZXh0X3QgY3B1X2N0eCA9IHsKLSAgICAgICAgLm1vZGUgPSBWQ1BVX0hWTV9NT0RFXzMy QiwKLSAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5lYnggPSBzdGFydF9pbmZvLAotICAgICAgICAu Y3B1X3JlZ3MueDg2XzMyLmVpcCA9IGVudHJ5LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmNy MCA9IFg4Nl9DUjBfUEUgfCBYODZfQ1IwX0VULAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmNz X2xpbWl0ID0gfjB1LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmRzX2xpbWl0ID0gfjB1LAot ICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLnNzX2xpbWl0ID0gfjB1LAotICAgICAgICAuY3B1X3Jl Z3MueDg2XzMyLnRyX2xpbWl0ID0gMHg2NywKLSAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5jc19h ciA9IDB4YzliLAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmRzX2FyID0gMHhjOTMsCi0gICAg ICAgIC5jcHVfcmVncy54ODZfMzIuc3NfYXIgPSAweGM5MywKLSAgICAgICAgLmNwdV9yZWdzLng4 Nl8zMi50cl9hciA9IDB4OGIsCi0gICAgfTsKLQotICAgIGNwdSA9IHYtPnByb2Nlc3NvcjsKLSAg ICBmb3IgKCBpID0gMTsgaSA8IGQtPm1heF92Y3B1czsgaSsrICkKLSAgICB7Ci0gICAgICAgIGNw dSA9IGNwdW1hc2tfY3ljbGUoY3B1LCAmZG9tMF9jcHVzKTsKLSAgICAgICAgZG9tMF9zZXR1cF92 Y3B1KGQsIGksIGNwdSk7Ci0gICAgfQotCi0gICAgcmMgPSBhcmNoX3NldF9pbmZvX2h2bV9ndWVz dCh2LCAmY3B1X2N0eCk7Ci0gICAgaWYgKCByYyApCi0gICAgewotICAgICAgICBwcmludGsoIlVu YWJsZSB0byBzZXR1cCBEb20wIEJTUCBjb250ZXh0OiAlZFxuIiwgcmMpOwotICAgICAgICByZXR1 cm4gcmM7Ci0gICAgfQotCi0gICAgcmMgPSBkb20wX3NldHVwX3Blcm1pc3Npb25zKGQpOwotICAg IGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcGFuaWMoIlVuYWJsZSB0byBzZXR1cCBEb20wIHBl cm1pc3Npb25zOiAlZFxuIiwgcmMpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAg dXBkYXRlX2RvbWFpbl93YWxsY2xvY2tfdGltZShkKTsKLQotICAgIGNsZWFyX2JpdChfVlBGX2Rv d24sICZ2LT5wYXVzZV9mbGFncyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBf X2luaXQgYWNwaV9jb3VudF9pbnRyX292cihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhl YWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25l ZCBsb25nIGVuZCkKLXsKLQotICAgIGFjcGlfaW50cl9vdmVycmlkZXMrKzsKLSAgICByZXR1cm4g MDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9zZXRfaW50cl9vdnIoc3RydWN0IGFjcGlf c3VidGFibGVfaGVhZGVyICpoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLSAgICBjb25zdCBzdHJ1Y3QgYWNwaV9t YWR0X2ludGVycnVwdF9vdmVycmlkZSAqaW50ciA9Ci0gICAgICAgIGNvbnRhaW5lcl9vZihoZWFk ZXIsIHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlLCBoZWFkZXIpOwotCi0gICAg KmludHNyY292ciA9ICppbnRyOwotICAgIGludHNyY292cisrOwotCi0gICAgcmV0dXJuIDA7Ci19 Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfY291bnRfbm1pX3NyYyhzdHJ1Y3QgYWNwaV9zdWJ0 YWJsZV9oZWFkZXIgKmhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQotICAgIGFjcGlfbm1pX3NvdXJjZXMrKzsK LSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9zZXRfbm1pX3NyYyhz dHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0gICAgY29uc3Qgc3Ry dWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICpzcmMgPQotICAgICAgICBjb250YWluZXJfb2YoaGVh ZGVyLCBzdHJ1Y3QgYWNwaV9tYWR0X25taV9zb3VyY2UsIGhlYWRlcik7Ci0KLSAgICAqbm1pc3Jj ID0gKnNyYzsKLSAgICBubWlzcmMrKzsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50 IF9faW5pdCBwdmhfc2V0dXBfYWNwaV9tYWR0KHN0cnVjdCBkb21haW4gKmQsIHBhZGRyX3QgKmFk ZHIpCi17Ci0gICAgc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqbWFkdDsKLSAgICBzdHJ1Y3QgYWNw aV90YWJsZV9oZWFkZXIgKnRhYmxlOwotICAgIHN0cnVjdCBhY3BpX21hZHRfaW9fYXBpYyAqaW9f YXBpYzsKLSAgICBzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3gyYXBpYyAqeDJhcGljOwotICAgIGFj cGlfc3RhdHVzIHN0YXR1czsKLSAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gICAgdW5zaWduZWQg aW50IGksIG1heF92Y3B1czsKLSAgICBpbnQgcmM7Ci0KLSAgICAvKiBDb3VudCBudW1iZXIgb2Yg aW50ZXJydXB0IG92ZXJyaWRlcyBpbiB0aGUgTUFEVC4gKi8KLSAgICBhY3BpX3RhYmxlX3BhcnNl X21hZHQoQUNQSV9NQURUX1RZUEVfSU5URVJSVVBUX09WRVJSSURFLAotICAgICAgICAgICAgICAg ICAgICAgICAgICBhY3BpX2NvdW50X2ludHJfb3ZyLCBVSU5UX01BWCk7Ci0KLSAgICAvKiBDb3Vu dCBudW1iZXIgb2YgTk1JIHNvdXJjZXMgaW4gdGhlIE1BRFQuICovCi0gICAgYWNwaV90YWJsZV9w YXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX05NSV9TT1VSQ0UsIGFjcGlfY291bnRfbm1pX3NyYywK LSAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9NQVgpOwotCi0gICAgbWF4X3ZjcHVzID0g ZG9tMF9tYXhfdmNwdXMoKTsKLSAgICAvKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGNyYWZ0 ZWQgTUFEVC4gKi8KLSAgICBzaXplID0gc2l6ZW9mKCptYWR0KTsKLSAgICAvKgotICAgICAqIEZJ WE1FOiB0aGUgY3VycmVudCB2SU8tQVBJQyBjb2RlIGp1c3Qgc3VwcG9ydHMgb25lIElPLUFQSUMg aW5zdGFuY2UKLSAgICAgKiBwZXIgZG9tYWluLiBUaGlzIG11c3QgYmUgZml4ZWQgaW4gb3JkZXIg dG8gcHJvdmlkZSB0aGUgc2FtZSBhbW91bnQgb2YKLSAgICAgKiBJTyBBUElDcyBhcyBhdmFpbGFi bGUgb24gYmFyZSBtZXRhbC4KLSAgICAgKi8KLSAgICBzaXplICs9IHNpemVvZigqaW9fYXBpYyk7 Ci0gICAgc2l6ZSArPSBzaXplb2YoKmludHNyY292cikgKiBhY3BpX2ludHJfb3ZlcnJpZGVzOwot ICAgIHNpemUgKz0gc2l6ZW9mKCpubWlzcmMpICogYWNwaV9ubWlfc291cmNlczsKLSAgICBzaXpl ICs9IHNpemVvZigqeDJhcGljKSAqIG1heF92Y3B1czsKLQotICAgIG1hZHQgPSB4emFsbG9jX2J5 dGVzKHNpemUpOwotICAgIGlmICggIW1hZHQgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFi bGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBNQURUIHRhYmxlXG4iKTsKLSAgICAgICAgcmMgPSAt RU5PTUVNOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHRoZSBuYXRp dmUgTUFEVCB0YWJsZSBoZWFkZXIuICovCi0gICAgc3RhdHVzID0gYWNwaV9nZXRfdGFibGUoQUNQ SV9TSUdfTUFEVCwgMCwgJnRhYmxlKTsKLSAgICBpZiAoICFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAp Ci0gICAgewotICAgICAgICBwcmludGsoIkZhaWxlZCB0byBnZXQgTUFEVCBBQ1BJIHRhYmxlLCBh Ym9ydGluZy5cbiIpOwotICAgICAgICByYyA9IC1FSU5WQUw7Ci0gICAgICAgIGdvdG8gb3V0Owot ICAgIH0KLSAgICBtYWR0LT5oZWFkZXIgPSAqdGFibGU7Ci0gICAgbWFkdC0+YWRkcmVzcyA9IEFQ SUNfREVGQVVMVF9QSFlTX0JBU0U7Ci0gICAgLyoKLSAgICAgKiBOQjogdGhpcyBpcyBjdXJyZW50 bHkgc2V0IHRvIDQsIHdoaWNoIGlzIHRoZSByZXZpc2lvbiBpbiB0aGUgQUNQSQotICAgICAqIHNw ZWMgNi4xLiBTYWRseSBBQ1BJQ0EgZG9lc24ndCBwcm92aWRlIHJldmlzaW9uIG51bWJlcnMgZm9y IHRoZQotICAgICAqIHRhYmxlcyBkZXNjcmliZWQgaW4gdGhlIGhlYWRlcnMuCi0gICAgICovCi0g ICAgbWFkdC0+aGVhZGVyLnJldmlzaW9uID0gbWluX3QodW5zaWduZWQgY2hhciwgdGFibGUtPnJl dmlzaW9uLCA0KTsKLQotICAgIC8qCi0gICAgICogU2V0dXAgdGhlIElPIEFQSUMgZW50cnkuCi0g ICAgICogRklYTUU6IHRoZSBjdXJyZW50IHZJTy1BUElDIGNvZGUganVzdCBzdXBwb3J0cyBvbmUg SU8tQVBJQyBpbnN0YW5jZQotICAgICAqIHBlciBkb21haW4uIFRoaXMgbXVzdCBiZSBmaXhlZCBp biBvcmRlciB0byBwcm92aWRlIHRoZSBzYW1lIGFtb3VudCBvZgotICAgICAqIElPIEFQSUNzIGFz IGF2YWlsYWJsZSBvbiBiYXJlIG1ldGFsLCBhbmQgd2l0aCB0aGUgc2FtZSBJRHMgYXMgZm91bmQg aW4KLSAgICAgKiB0aGUgbmF0aXZlIElPIEFQSUMgTUFEVCBlbnRyaWVzLgotICAgICAqLwotICAg IGlmICggbnJfaW9hcGljcyA+IDEgKQotICAgICAgICBwcmludGsoIldBUk5JTkc6IGZvdW5kICVk IElPIEFQSUNzLCBEb20wIHdpbGwgb25seSBoYXZlIGFjY2VzcyB0byAxIGVtdWxhdGVkIElPIEFQ SUNcbiIsCi0gICAgICAgICAgICAgICBucl9pb2FwaWNzKTsKLSAgICBpb19hcGljID0gKHZvaWQg KikobWFkdCArIDEpOwotICAgIGlvX2FwaWMtPmhlYWRlci50eXBlID0gQUNQSV9NQURUX1RZUEVf SU9fQVBJQzsKLSAgICBpb19hcGljLT5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKCppb19hcGljKTsK LSAgICBpb19hcGljLT5pZCA9IGRvbWFpbl92aW9hcGljKGQpLT5pZDsKLSAgICBpb19hcGljLT5h ZGRyZXNzID0gVklPQVBJQ19ERUZBVUxUX0JBU0VfQUREUkVTUzsKLQotICAgIHgyYXBpYyA9ICh2 b2lkICopKGlvX2FwaWMgKyAxKTsKLSAgICBmb3IgKCBpID0gMDsgaSA8IG1heF92Y3B1czsgaSsr ICkKLSAgICB7Ci0gICAgICAgIHgyYXBpYy0+aGVhZGVyLnR5cGUgPSBBQ1BJX01BRFRfVFlQRV9M T0NBTF9YMkFQSUM7Ci0gICAgICAgIHgyYXBpYy0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZigqeDJh cGljKTsKLSAgICAgICAgeDJhcGljLT51aWQgPSBpOwotICAgICAgICB4MmFwaWMtPmxvY2FsX2Fw aWNfaWQgPSBpICogMjsKLSAgICAgICAgeDJhcGljLT5sYXBpY19mbGFncyA9IEFDUElfTUFEVF9F TkFCTEVEOwotICAgICAgICB4MmFwaWMrKzsKLSAgICB9Ci0KLSAgICAvKiBTZXR1cCBpbnRlcnJ1 cHQgb3ZlcnJpZGVzLiAqLwotICAgIGludHNyY292ciA9ICh2b2lkICopeDJhcGljOwotICAgIGFj cGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfT1ZFUlJJREUsIGFj cGlfc2V0X2ludHJfb3ZyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2ludHJfb3Zl cnJpZGVzKTsKLQotICAgIC8qIFNldHVwIE5NSSBzb3VyY2VzLiAqLwotICAgIG5taXNyYyA9ICh2 b2lkICopaW50c3Jjb3ZyOwotICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQ RV9OTUlfU09VUkNFLCBhY3BpX3NldF9ubWlfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAg ICBhY3BpX25taV9zb3VyY2VzKTsKLQotICAgIEFTU0VSVCgoKHZvaWQgKilubWlzcmMgLSAodm9p ZCAqKW1hZHQpID09IHNpemUpOwotICAgIG1hZHQtPmhlYWRlci5sZW5ndGggPSBzaXplOwotICAg IC8qCi0gICAgICogQ2FsbGluZyBhY3BpX3RiX2NoZWNrc3VtIGhlcmUgaXMgYSBsYXllcmluZyB2 aW9sYXRpb24sIGJ1dAotICAgICAqIGludHJvZHVjaW5nIGEgd3JhcHBlciBmb3Igc3VjaCBzaW1w bGUgdXNhZ2Ugc2VlbXMgb3ZlcmtpbGwuCi0gICAgICovCi0gICAgbWFkdC0+aGVhZGVyLmNoZWNr c3VtIC09IGFjcGlfdGJfY2hlY2tzdW0oQUNQSV9DQVNUX1BUUih1OCwgbWFkdCksIHNpemUpOwot Ci0gICAgLyogUGxhY2UgdGhlIG5ldyBNQURUIGluIGd1ZXN0IG1lbW9yeSBzcGFjZS4gKi8KLSAg ICBpZiAoIHB2aF9zdGVhbF9yYW0oZCwgc2l6ZSwgMCwgR0IoNCksIGFkZHIpICkKLSAgICB7Ci0g ICAgICAgIHByaW50aygiVW5hYmxlIHRvIGZpbmQgYWxsb2NhdGUgZ3Vlc3QgUkFNIGZvciBNQURU XG4iKTsKLSAgICAgICAgcmMgPSAtRU5PTUVNOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0K LSAgICAvKiBNYXJrIHRoaXMgcmVnaW9uIGFzIEU4MjBfQUNQSS4gKi8KLSAgICBpZiAoIHB2aF9h ZGRfbWVtX3JhbmdlKGQsICphZGRyLCAqYWRkciArIHNpemUsIEU4MjBfQUNQSSkgKQotICAgICAg ICBwcmludGsoIlVuYWJsZSB0byBhZGQgTUFEVCByZWdpb24gdG8gbWVtb3J5IG1hcFxuIik7Ci0K LSAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMoKmFkZHIsIG1hZHQsIHNpemUsIGQtPnZj cHVbMF0pOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8g Y29weSBNQURUIGludG8gZ3Vlc3QgbWVtb3J5XG4iKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAg fQotCi0gICAgcmMgPSAwOwotCi0gb3V0OgotICAgIHhmcmVlKG1hZHQpOwotCi0gICAgcmV0dXJu IHJjOwotfQotCi1zdGF0aWMgYm9vbCBfX2luaXQgYWNwaV9tZW1vcnlfYmFubmVkKHVuc2lnbmVk IGxvbmcgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgbG9uZyBzaXplKQotewotICAgIHVuc2lnbmVkIGxvbmcgbWZuLCBucl9wYWdlcywgaTsK LQotICAgIG1mbiA9IFBGTl9ET1dOKGFkZHJlc3MpOwotICAgIG5yX3BhZ2VzID0gUEZOX1VQKChh ZGRyZXNzICYgflBBR0VfTUFTSykgKyBzaXplKTsKLSAgICBmb3IgKCBpID0gMCA7IGkgPCBucl9w YWdlczsgaSsrICkKLSAgICAgICAgaWYgKCAhcGFnZV9pc19yYW1fdHlwZShtZm4gKyBpLCBSQU1f VFlQRV9SRVNFUlZFRCkgJiYKLSAgICAgICAgICAgICAhcGFnZV9pc19yYW1fdHlwZShtZm4gKyBp LCBSQU1fVFlQRV9BQ1BJKSApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVy biBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgX19pbml0IHB2aF9hY3BpX3RhYmxlX2FsbG93ZWQo Y29uc3QgY2hhciAqc2lnKQotewotICAgIHN0YXRpYyBjb25zdCBjaGFyIF9faW5pdGNvbnN0IGJh bm5lZF90YWJsZXNbXVtBQ1BJX05BTUVfU0laRV0gPSB7Ci0gICAgICAgIEFDUElfU0lHX0hQRVQs IEFDUElfU0lHX1NMSVQsIEFDUElfU0lHX1NSQVQsIEFDUElfU0lHX01QU1QsCi0gICAgICAgIEFD UElfU0lHX1BNVFQsIEFDUElfU0lHX01BRFQsIEFDUElfU0lHX0RNQVJ9OwotICAgIHVuc2lnbmVk IGludCBpOwotCi0gICAgZm9yICggaSA9IDAgOyBpIDwgQVJSQVlfU0laRShiYW5uZWRfdGFibGVz KTsgaSsrICkKLSAgICAgICAgaWYgKCBzdHJuY21wKHNpZywgYmFubmVkX3RhYmxlc1tpXSwgQUNQ SV9OQU1FX1NJWkUpID09IDAgKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLyog TWFrZSBzdXJlIHRhYmxlIGRvZXNuJ3QgcmVzaWRlIGluIGEgUkFNIHJlZ2lvbi4gKi8KLSAgICBp ZiAoIGFjcGlfbWVtb3J5X2Jhbm5lZChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ld LmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfcm9vdF90YWJs ZV9saXN0LnRhYmxlc1tpXS5sZW5ndGgpICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiU2tpcHBp bmcgdGFibGUgJS40cyBiZWNhdXNlIHJlc2lkZXMgaW4gYSBub24tQUNQSSwgbm9uLXJlc2VydmVk IHJlZ2lvblxuIiwKLSAgICAgICAgICAgICAgIHNpZyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK LSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHZoX3Nl dHVwX2FjcGlfeHNkdChzdHJ1Y3QgZG9tYWluICpkLCBwYWRkcl90IG1hZHRfYWRkciwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCAqYWRkcikKLXsKLSAgICBz dHJ1Y3QgYWNwaV90YWJsZV94c2R0ICp4c2R0OwotICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRl ciAqdGFibGU7Ci0gICAgc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcDsKLSAgICB1bnNpZ25l ZCBsb25nIHNpemUgPSBzaXplb2YoKnhzZHQpOwotICAgIHVuc2lnbmVkIGludCBpLCBqLCBudW1f dGFibGVzID0gMDsKLSAgICBwYWRkcl90IHhzZHRfcGFkZHI7Ci0gICAgaW50IHJjOwotCi0gICAg LyoKLSAgICAgKiBSZXN0b3JlIG9yaWdpbmFsIERNQVIgdGFibGUgc2lnbmF0dXJlLCB3ZSBhcmUg Z29pbmcgdG8gZmlsdGVyIGl0IGZyb20KLSAgICAgKiB0aGUgbmV3IFhTRFQgdGhhdCBpcyBwcmVz ZW50ZWQgdG8gdGhlIGd1ZXN0LCBzbyBpdCBpcyBubyBsb25nZXIKLSAgICAgKiBuZWNlc3Nhcnkg dG8gaGF2ZSBpdCdzIHNpZ25hdHVyZSB6YXBwZWQuCi0gICAgICovCi0gICAgYWNwaV9kbWFyX3Jl aW5zdGF0ZSgpOwotCi0gICAgLyogQ291bnQgdGhlIG51bWJlciBvZiB0YWJsZXMgdGhhdCB3aWxs IGJlIGFkZGVkIHRvIHRoZSBYU0RULiAqLwotICAgIGZvciggaSA9IDA7IGkgPCBhY3BpX2dibF9y b290X3RhYmxlX2xpc3QuY291bnQ7IGkrKyApCi0gICAgewotICAgICAgICBjb25zdCBjaGFyICpz aWcgPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZS5hc2NpaTsK LQotICAgICAgICBpZiAoIHB2aF9hY3BpX3RhYmxlX2FsbG93ZWQoc2lnKSApCi0gICAgICAgICAg ICBudW1fdGFibGVzKys7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBObyBuZWVkIHRvIGFkZCBv ciBzdWJ0cmFjdCBhbnl0aGluZyBiZWNhdXNlIHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQKLSAgICAg KiBpbmNsdWRlcyBvbmUgYXJyYXkgc2xvdCBhbHJlYWR5LCBhbmQgd2UgaGF2ZSBmaWx0ZXJlZCBv dXQgdGhlIG9yaWdpbmFsCi0gICAgICogTUFEVCBhbmQgd2UgYXJlIGdvaW5nIHRvIGFkZCBhIGN1 c3RvbSBidWlsdCBNQURULgotICAgICAqLwotICAgIHNpemUgKz0gbnVtX3RhYmxlcyAqIHNpemVv Zih4c2R0LT50YWJsZV9vZmZzZXRfZW50cnlbMF0pOwotCi0gICAgeHNkdCA9IHh6YWxsb2NfYnl0 ZXMoc2l6ZSk7Ci0gICAgaWYgKCAheHNkdCApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJs ZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFhTRFQgdGFibGVcbiIpOwotICAgICAgICByYyA9IC1F Tk9NRU07Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIC8qIENvcHkgdGhlIG5hdGl2 ZSBYU0RUIHRhYmxlIGhlYWRlci4gKi8KLSAgICByc2RwID0gYWNwaV9vc19tYXBfbWVtb3J5KGFj cGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcigpLCBzaXplb2YoKnJzZHApKTsKLSAgICBpZiAoICFyc2Rw ICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIG1hcCBSU0RQXG4iKTsKLSAgICAg ICAgcmMgPSAtRUlOVkFMOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgeHNkdF9wYWRk ciA9IHJzZHAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzczsKLSAgICBhY3BpX29zX3VubWFwX21lbW9y eShyc2RwLCBzaXplb2YoKnJzZHApKTsKLSAgICB0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeSh4 c2R0X3BhZGRyLCBzaXplb2YoKnRhYmxlKSk7Ci0gICAgaWYgKCAhdGFibGUgKQotICAgIHsKLSAg ICAgICAgcHJpbnRrKCJVbmFibGUgdG8gbWFwIFhTRFRcbiIpOwotICAgICAgICByYyA9IC1FSU5W QUw7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICB4c2R0LT5oZWFkZXIgPSAqdGFibGU7 Ci0gICAgYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIHNpemVvZigqdGFibGUpKTsKLQotICAg IC8qIEFkZCB0aGUgY3VzdG9tIE1BRFQuICovCi0gICAgeHNkdC0+dGFibGVfb2Zmc2V0X2VudHJ5 WzBdID0gbWFkdF9hZGRyOwotCi0gICAgLyogQ29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSByZXN0 IG9mIHRoZSBhbGxvd2VkIHRhYmxlcy4gKi8KLSAgICBmb3IoIGkgPSAwLCBqID0gMTsgaSA8IGFj cGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICAgIGNvbnN0 IGNoYXIgKnNpZyA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJl LmFzY2lpOwotCi0gICAgICAgIGlmICggcHZoX2FjcGlfdGFibGVfYWxsb3dlZChzaWcpICkKLSAg ICAgICAgICAgIHhzZHQtPnRhYmxlX29mZnNldF9lbnRyeVtqKytdID0KLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5hZGRy ZXNzOwotICAgIH0KLQotICAgIHhzZHQtPmhlYWRlci5yZXZpc2lvbiA9IDE7Ci0gICAgeHNkdC0+ aGVhZGVyLmxlbmd0aCA9IHNpemU7Ci0gICAgLyoKLSAgICAgKiBDYWxsaW5nIGFjcGlfdGJfY2hl Y2tzdW0gaGVyZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbiwgYnV0Ci0gICAgICogaW50cm9kdWNp bmcgYSB3cmFwcGVyIGZvciBzdWNoIHNpbXBsZSB1c2FnZSBzZWVtcyBvdmVya2lsbC4KLSAgICAg Ki8KLSAgICB4c2R0LT5oZWFkZXIuY2hlY2tzdW0gLT0gYWNwaV90Yl9jaGVja3N1bShBQ1BJX0NB U1RfUFRSKHU4LCB4c2R0KSwgc2l6ZSk7Ci0KLSAgICAvKiBQbGFjZSB0aGUgbmV3IFhTRFQgaW4g Z3Vlc3QgbWVtb3J5IHNwYWNlLiAqLwotICAgIGlmICggcHZoX3N0ZWFsX3JhbShkLCBzaXplLCAw LCBHQig0KSwgYWRkcikgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gZmluZCBn dWVzdCBSQU0gZm9yIFhTRFRcbiIpOwotICAgICAgICByYyA9IC1FTk9NRU07Ci0gICAgICAgIGdv dG8gb3V0OwotICAgIH0KLQotICAgIC8qIE1hcmsgdGhpcyByZWdpb24gYXMgRTgyMF9BQ1BJLiAq LwotICAgIGlmICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgKmFkZHIsICphZGRyICsgc2l6ZSwgRTgy MF9BQ1BJKSApCi0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBYU0RUIHJlZ2lvbiB0byBt ZW1vcnkgbWFwXG4iKTsKLQotICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cygqYWRkciwg eHNkdCwgc2l6ZSwgZC0+dmNwdVswXSk7Ci0gICAgaWYgKCByYyApCi0gICAgewotICAgICAgICBw cmludGsoIlVuYWJsZSB0byBjb3B5IFhTRFQgaW50byBndWVzdCBtZW1vcnlcbiIpOwotICAgICAg ICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICByYyA9IDA7Ci0KLSBvdXQ6Ci0gICAgeGZyZWUoeHNk dCk7Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHB2aF9zZXR1cF9h Y3BpKHN0cnVjdCBkb21haW4gKmQsIHBhZGRyX3Qgc3RhcnRfaW5mbykKLXsKLSAgICB1bnNpZ25l ZCBsb25nIHBmbiwgbnJfcGFnZXM7Ci0gICAgcGFkZHJfdCBtYWR0X3BhZGRyLCB4c2R0X3BhZGRy LCByc2RwX3BhZGRyOwotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGludCByYzsKLSAgICBzdHJ1 Y3QgYWNwaV90YWJsZV9yc2RwICpuYXRpdmVfcnNkcCwgcnNkcCA9IHsKLSAgICAgICAgLnNpZ25h dHVyZSA9IEFDUElfU0lHX1JTRFAsCi0gICAgICAgIC5yZXZpc2lvbiA9IDIsCi0gICAgICAgIC5s ZW5ndGggPSBzaXplb2YocnNkcCksCi0gICAgfTsKLQotCi0gICAgLyogU2NhbiB0b3AtbGV2ZWwg dGFibGVzIGFuZCBhZGQgdGhlaXIgcmVnaW9ucyB0byB0aGUgZ3Vlc3QgbWVtb3J5IG1hcC4gKi8K LSAgICBmb3IoIGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyBpKysg KQotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqc2lnID0gYWNwaV9nYmxfcm9vdF90YWJsZV9s aXN0LnRhYmxlc1tpXS5zaWduYXR1cmUuYXNjaWk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWRk ciA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uYWRkcmVzczsKLSAgICAgICAg dW5zaWduZWQgbG9uZyBzaXplID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5s ZW5ndGg7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTWFrZSBzdXJlIHRoZSBvcmlnaW5hbCBN QURUIGlzIGFsc28gbWFwcGVkLCBzbyB0aGF0IERvbTAgY2FuCi0gICAgICAgICAqIHByb3Blcmx5 IGFjY2VzcyB0aGUgZGF0YSByZXR1cm5lZCBieSBfTUFUIG1ldGhvZHMgaW4gY2FzZSBpdCdzCi0g ICAgICAgICAqIHJlLXVzaW5nIE1BRFQgbWVtb3J5LgotICAgICAgICAgKi8KLSAgICAgICAgaWYg KCBzdHJuY21wKHNpZywgQUNQSV9TSUdfTUFEVCwgQUNQSV9OQU1FX1NJWkUpCi0gICAgICAgICAg ICAgPyBwdmhfYWNwaV90YWJsZV9hbGxvd2VkKHNpZykKLSAgICAgICAgICAgICA6ICFhY3BpX21l bW9yeV9iYW5uZWQoYWRkciwgc2l6ZSkgKQotICAgICAgICAgICAgIHB2aF9hZGRfbWVtX3Jhbmdl KGQsIGFkZHIsIGFkZHIgKyBzaXplLCBFODIwX0FDUEkpOwotICAgIH0KLQotICAgIC8qIElkZW50 aXR5IG1hcCBBQ1BJIGU4MjAgcmVnaW9ucy4gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IGQtPmFy Y2gubnJfZTgyMDsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmICggZC0+YXJjaC5lODIwW2ldLnR5 cGUgIT0gRTgyMF9BQ1BJICYmCi0gICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnR5cGUgIT0g RTgyMF9OVlMgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgcGZuID0gUEZOX0RP V04oZC0+YXJjaC5lODIwW2ldLmFkZHIpOwotICAgICAgICBucl9wYWdlcyA9IFBGTl9VUCgoZC0+ YXJjaC5lODIwW2ldLmFkZHIgJiB+UEFHRV9NQVNLKSArCi0gICAgICAgICAgICAgICAgICAgICAg ICAgIGQtPmFyY2guZTgyMFtpXS5zaXplKTsKLQotICAgICAgICByYyA9IG1vZGlmeV9pZGVudGl0 eV9tbWlvKGQsIHBmbiwgbnJfcGFnZXMsIHRydWUpOwotICAgICAgICBpZiAoIHJjICkKLSAgICAg ICAgewotICAgICAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gbWFwIEFDUEkgcmVnaW9uIFslI2x4 LCAlI2x4KSBpbnRvIERvbTAgbWVtb3J5IG1hcFxuIiwKLSAgICAgICAgICAgICAgICAgICBwZm4s IHBmbiArIG5yX3BhZ2VzKTsKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgfQotICAg IH0KLQotICAgIHJjID0gcHZoX3NldHVwX2FjcGlfbWFkdChkLCAmbWFkdF9wYWRkcik7Ci0gICAg aWYgKCByYyApCi0gICAgICAgIHJldHVybiByYzsKLQotICAgIHJjID0gcHZoX3NldHVwX2FjcGlf eHNkdChkLCBtYWR0X3BhZGRyLCAmeHNkdF9wYWRkcik7Ci0gICAgaWYgKCByYyApCi0gICAgICAg IHJldHVybiByYzsKLQotICAgIC8qIENyYWZ0IGEgY3VzdG9tIFJTRFAuICovCi0gICAgbmF0aXZl X3JzZHAgPSBhY3BpX29zX21hcF9tZW1vcnkoYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKCksIHNp emVvZihyc2RwKSk7Ci0gICAgaWYgKCAhbmF0aXZlX3JzZHAgKQotICAgIHsKLSAgICAgICAgcHJp bnRrKCJGYWlsZWQgdG8gbWFwIG5hdGl2ZSBSU0RQXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FTk9N RU07Ci0gICAgfQotICAgIG1lbWNweShyc2RwLm9lbV9pZCwgbmF0aXZlX3JzZHAtPm9lbV9pZCwg c2l6ZW9mKHJzZHAub2VtX2lkKSk7Ci0gICAgYWNwaV9vc191bm1hcF9tZW1vcnkobmF0aXZlX3Jz ZHAsIHNpemVvZihyc2RwKSk7Ci0gICAgcnNkcC54c2R0X3BoeXNpY2FsX2FkZHJlc3MgPSB4c2R0 X3BhZGRyOwotICAgIC8qCi0gICAgICogQ2FsbGluZyBhY3BpX3RiX2NoZWNrc3VtIGhlcmUgaXMg YSBsYXllcmluZyB2aW9sYXRpb24sIGJ1dAotICAgICAqIGludHJvZHVjaW5nIGEgd3JhcHBlciBm b3Igc3VjaCBzaW1wbGUgdXNhZ2Ugc2VlbXMgb3ZlcmtpbGwuCi0gICAgICovCi0gICAgcnNkcC5j aGVja3N1bSAtPSBhY3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FTVF9QVFIodTgsICZyc2RwKSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9SU0RQX1JFVjBfU0laRSk7 Ci0gICAgcnNkcC5leHRlbmRlZF9jaGVja3N1bSAtPSBhY3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FT VF9QVFIodTgsICZyc2RwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2l6ZW9mKHJzZHApKTsKLQotICAgIC8qCi0gICAgICogUGxhY2UgdGhlIG5ldyBS U0RQIGluIGd1ZXN0IG1lbW9yeSBzcGFjZS4KLSAgICAgKgotICAgICAqIE5COiB0aGlzIFJTRFAg aXMgbm90IGdvaW5nIHRvIHJlcGxhY2UgdGhlIG9yaWdpbmFsIFJTRFAsIHdoaWNoIHNob3VsZAot ICAgICAqIHN0aWxsIGJlIGFjY2Vzc2libGUgdG8gdGhlIGd1ZXN0LiBIb3dldmVyIHRoYXQgUlNE UCBpcyBnb2luZyB0byBwb2ludCB0bwotICAgICAqIHRoZSBuYXRpdmUgUlNEVCwgYW5kIHNob3Vs ZCBub3QgYmUgdXNlZCBmb3IgdGhlIERvbTAga2VybmVsJ3MgYm9vdAotICAgICAqIHB1cnBvc2Vz ICh3ZSBrZWVwIGl0IHZpc2libGUgZm9yIHBvc3QgYm9vdCBhY2Nlc3MpLgotICAgICAqLwotICAg IGlmICggcHZoX3N0ZWFsX3JhbShkLCBzaXplb2YocnNkcCksIDAsIEdCKDQpLCAmcnNkcF9wYWRk cikgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgZ3Vlc3QgUkFN IGZvciBSU0RQXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotCi0gICAgLyog TWFyayB0aGlzIHJlZ2lvbiBhcyBFODIwX0FDUEkuICovCi0gICAgaWYgKCBwdmhfYWRkX21lbV9y YW5nZShkLCByc2RwX3BhZGRyLCByc2RwX3BhZGRyICsgc2l6ZW9mKHJzZHApLAotICAgICAgICAg ICAgICAgICAgICAgICAgICAgRTgyMF9BQ1BJKSApCi0gICAgICAgIHByaW50aygiVW5hYmxlIHRv IGFkZCBSU0RQIHJlZ2lvbiB0byBtZW1vcnkgbWFwXG4iKTsKLQotICAgIC8qIENvcHkgUlNEUCBp bnRvIGd1ZXN0IG1lbW9yeS4gKi8KLSAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMocnNk cF9wYWRkciwgJnJzZHAsIHNpemVvZihyc2RwKSwgZC0+dmNwdVswXSk7Ci0gICAgaWYgKCByYyAp Ci0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IFJTRFAgaW50byBndWVzdCBt ZW1vcnlcbiIpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgLyogQ29weSBSU0RQ IGFkZHJlc3MgdG8gc3RhcnRfaW5mby4gKi8KLSAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3Bo eXMoc3RhcnRfaW5mbyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9m KHN0cnVjdCBodm1fc3RhcnRfaW5mbywgcnNkcF9wYWRkciksCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICZyc2RwX3BhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzaXplb2YoKChzdHJ1Y3QgaHZtX3N0YXJ0X2luZm8gKikKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAwKS0+cnNkcF9wYWRkciksCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGQtPnZjcHVbMF0pOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAg cHJpbnRrKCJVbmFibGUgdG8gY29weSBSU0RQIGludG8gZ3Vlc3QgbWVtb3J5XG4iKTsKLSAgICAg ICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9f aW5pdCBjb25zdHJ1Y3RfZG9tMF9wdmgoc3RydWN0IGRvbWFpbiAqZCwgY29uc3QgbW9kdWxlX3Qg KmltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxv bmcgaW1hZ2VfaGVhZHJvb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bW9kdWxlX3QgKmluaXRyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2 b2lkICooKmJvb3RzdHJhcF9tYXApKGNvbnN0IG1vZHVsZV90ICopLAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNtZGxpbmUpCi17Ci0gICAgcGFkZHJfdCBlbnRy eSwgc3RhcnRfaW5mbzsKLSAgICBpbnQgcmM7Ci0KLSAgICBwcmludGsoIioqIEJ1aWxkaW5nIGEg UFZIIERvbTAgKipcbiIpOwotCi0gICAgaW9tbXVfaHdkb21faW5pdChkKTsKLQotICAgIHJjID0g cHZoX3NldHVwX3AybShkKTsKLSAgICBpZiAoIHJjICkKLSAgICB7Ci0gICAgICAgIHByaW50aygi RmFpbGVkIHRvIHNldHVwIERvbTAgcGh5c2ljYWwgbWVtb3J5IG1hcFxuIik7Ci0gICAgICAgIHJl dHVybiByYzsKLSAgICB9Ci0KLSAgICByYyA9IHB2aF9sb2FkX2tlcm5lbChkLCBpbWFnZSwgaW1h Z2VfaGVhZHJvb20sIGluaXRyZCwgYm9vdHN0cmFwX21hcChpbWFnZSksCi0gICAgICAgICAgICAg ICAgICAgICAgICAgY21kbGluZSwgJmVudHJ5LCAmc3RhcnRfaW5mbyk7Ci0gICAgaWYgKCByYyAp Ci0gICAgewotICAgICAgICBwcmludGsoIkZhaWxlZCB0byBsb2FkIERvbTAga2VybmVsXG4iKTsK LSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJjID0gcHZoX3NldHVwX2NwdXMoZCwg ZW50cnksIHN0YXJ0X2luZm8pOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJpbnRr KCJGYWlsZWQgdG8gc2V0dXAgRG9tMCBDUFVzOiAlZFxuIiwgcmMpOwotICAgICAgICByZXR1cm4g cmM7Ci0gICAgfQotCi0gICAgcmMgPSBwdmhfc2V0dXBfYWNwaShkLCBzdGFydF9pbmZvKTsKLSAg ICBpZiAoIHJjICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiRmFpbGVkIHRvIHNldHVwIERvbTAg QUNQSSB0YWJsZXM6ICVkXG4iLCByYyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAg ICBwYW5pYygiQnVpbGRpbmcgYSBQVkh2MiBEb20wIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOwot ICAgIHJldHVybiAwOwotfQotCiBpbnQgX19pbml0IGNvbnN0cnVjdF9kb20wKHN0cnVjdCBkb21h aW4gKmQsIGNvbnN0IG1vZHVsZV90ICppbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgbG9uZyBpbWFnZV9oZWFkcm9vbSwgbW9kdWxlX3QgKmluaXRyZCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgdm9pZCAqKCpib290c3RyYXBfbWFwKShjb25zdCBtb2R1bGVfdCAq KSwKQEAgLTE1NDYsNyArNDgzLDcgQEAgaW50IF9faW5pdCBjb25zdHJ1Y3RfZG9tMChzdHJ1Y3Qg ZG9tYWluICpkLCBjb25zdCBtb2R1bGVfdCAqaW1hZ2UsCiAKICAgICBwcm9jZXNzX3BlbmRpbmdf c29mdGlycXMoKTsKIAotICAgIHJldHVybiAoaXNfaHZtX2RvbWFpbihkKSA/IGNvbnN0cnVjdF9k b20wX3B2aCA6IGRvbTBfY29uc3RydWN0X3B2KQorICAgIHJldHVybiAoaXNfaHZtX2RvbWFpbihk KSA/IGRvbTBfY29uc3RydWN0X3B2aCA6IGRvbTBfY29uc3RydWN0X3B2KQogICAgICAgICAgICAo ZCwgaW1hZ2UsIGltYWdlX2hlYWRyb29tLCBpbml0cmQsYm9vdHN0cmFwX21hcCwgY21kbGluZSk7 CiB9CiAKZGlmZiAtLWdpdCBhL3hlbi9hcmNoL3g4Ni9odm0vTWFrZWZpbGUgYi94ZW4vYXJjaC94 ODYvaHZtL01ha2VmaWxlCmluZGV4IGVjMGRhYWUwZWEuLjBhM2QwZjRmN2UgMTAwNjQ0Ci0tLSBh L3hlbi9hcmNoL3g4Ni9odm0vTWFrZWZpbGUKKysrIGIveGVuL2FyY2gveDg2L2h2bS9NYWtlZmls ZQpAQCAtMyw2ICszLDcgQEAgc3ViZGlyLXkgKz0gdm14CiAKIG9iai15ICs9IGFzaWQubwogb2Jq LXkgKz0gZG0ubworb2JqLWJpbi15ICs9IGRvbTBfYnVpbGQuaW5pdC5vCiBvYmoteSArPSBlbXVs YXRlLm8KIG9iai15ICs9IGhwZXQubwogb2JqLXkgKz0gaHZtLm8KZGlmZiAtLWdpdCBhL3hlbi9h cmNoL3g4Ni9odm0vZG9tMF9idWlsZC5jIGIveGVuL2FyY2gveDg2L2h2bS9kb20wX2J1aWxkLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uMDI1NjA1NGU1NAotLS0gL2Rl di9udWxsCisrKyBiL3hlbi9hcmNoL3g4Ni9odm0vZG9tMF9idWlsZC5jCkBAIC0wLDAgKzEsMTEx MiBAQAorLyoKKyAqIGh2bS9kb20wX2J1aWxkLmMKKyAqCisgKiBEb20wIGJ1aWxkZXIgZm9yIFBW SCBndWVzdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ2l0cml4IFN5c3RlbXMgUiZECisg KgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzIHB1Ymxp c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBu b3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUg PHhlbi9hY3BpLmg+CisjaW5jbHVkZSA8eGVuL2luaXQuaD4KKyNpbmNsdWRlIDx4ZW4vbGliZWxm Lmg+CisjaW5jbHVkZSA8eGVuL211bHRpYm9vdC5oPgorI2luY2x1ZGUgPHhlbi9zb2Z0aXJxLmg+ CisKKyNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYnppbWFnZS5o PgorI2luY2x1ZGUgPGFzbS9kb20wX2J1aWxkLmg+CisjaW5jbHVkZSA8YXNtL2h2bS9zdXBwb3J0 Lmg+CisjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vcDJtLmg+CisjaW5j bHVkZSA8YXNtL3BhZ2luZy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8 cHVibGljL2FyY2gteDg2L2h2bS9zdGFydF9pbmZvLmg+CisjaW5jbHVkZSA8cHVibGljL2h2bS9o dm1faW5mb190YWJsZS5oPgorI2luY2x1ZGUgPHB1YmxpYy9odm0vaHZtX3ZjcHUuaD4KKworLyoK KyAqIEhhdmUgdGhlIFRTUyBjb3ZlciB0aGUgSVNBIHBvcnQgcmFuZ2UsIHdoaWNoIG1ha2VzIGl0 CisgKiAtIDEwNCBieXRlcyBiYXNlIHN0cnVjdHVyZQorICogLSAzMiBieXRlcyBpbnRlcnJ1cHQg cmVkaXJlY3Rpb24gYml0bWFwCisgKiAtIDEyOCBieXRlcyBJL08gYml0bWFwCisgKiAtIG9uZSB0 cmFpbGluZyBieXRlCisgKiBvciBhIHRvdGFsIG9mIDI2NSBieXRlcy4KKyAqCisgKiBOQjogYXMg UFZIdjIgRG9tMCBkb2Vzbid0IGhhdmUgbGVnYWN5IGRldmljZXMgKElTQSksIGl0IHNob3VsZG4n dCBoYXZlIGFueQorICogYnVzaW5lc3MgaW4gYWNjZXNzaW5nIHRoZSBJU0EgcG9ydCByYW5nZSwg bXVjaCBsZXNzIGluIHJlYWwgbW9kZSwgYW5kIGR1ZSB0bworICogdGhlIGxhY2sgb2YgZmlybXdh cmUgaXQgc2hvdWxkbid0IGFsc28gZXhlY3V0ZSBhbnkgSU5UIGluc3RydWN0aW9uLiBUaGlzIGlz CisgKiBkb25lIGp1c3QgZm9yIGNvbnNpc3RlbmN5IHdpdGggd2hhdCBodm1sb2FkZXIgZG9lcy4K KyAqLworI2RlZmluZSBIVk1fVk04Nl9UU1NfU0laRSAyNjUKKworc3RhdGljIHVuc2lnbmVkIGlu dCBfX2luaXRkYXRhIGFjcGlfaW50cl9vdmVycmlkZXM7CitzdGF0aWMgc3RydWN0IGFjcGlfbWFk dF9pbnRlcnJ1cHRfb3ZlcnJpZGUgX19pbml0ZGF0YSAqaW50c3Jjb3ZyOworCitzdGF0aWMgdW5z aWduZWQgaW50IF9faW5pdGRhdGEgYWNwaV9ubWlfc291cmNlczsKK3N0YXRpYyBzdHJ1Y3QgYWNw aV9tYWR0X25taV9zb3VyY2UgX19pbml0ZGF0YSAqbm1pc3JjOworCitzdGF0aWMgaW50IF9faW5p dCBtb2RpZnlfaWRlbnRpdHlfbW1pbyhzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIHBm biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcg bnJfcGFnZXMsIGNvbnN0IGJvb2wgbWFwKQoreworICAgIGludCByYzsKKworICAgIGZvciAoIDsg OyApCisgICAgeworICAgICAgICByYyA9IChtYXAgPyBtYXBfbW1pb19yZWdpb25zIDogdW5tYXBf bW1pb19yZWdpb25zKQorICAgICAgICAgICAgIChkLCBfZ2ZuKHBmbiksIG5yX3BhZ2VzLCBfbWZu KHBmbikpOworICAgICAgICBpZiAoIHJjID09IDAgKQorICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgIGlmICggcmMgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKFhFTkxPR19X QVJOSU5HCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpZGVudGl0eSAlc21hcCBbJSNs eCwlI2x4KSBmb3IgZCVkOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBtYXAgPyAiIiA6ICJ1 biIsIHBmbiwgcGZuICsgbnJfcGFnZXMsIGQtPmRvbWFpbl9pZCwgcmMpOworICAgICAgICAgICAg YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbnJfcGFnZXMgLT0gcmM7CisgICAgICAgIHBmbiAr PSByYzsKKyAgICAgICAgcHJvY2Vzc19wZW5kaW5nX3NvZnRpcnFzKCk7CisgICAgfQorCisgICAg cmV0dXJuIHJjOworfQorCisvKiBQb3B1bGF0ZSBhIEhWTSBtZW1vcnkgcmFuZ2UgdXNpbmcgdGhl IGJpZ2dlc3QgcG9zc2libGUgb3JkZXIuICovCitzdGF0aWMgaW50IF9faW5pdCBwdmhfcG9wdWxh dGVfbWVtb3J5X3JhbmdlKHN0cnVjdCBkb21haW4gKmQsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCit7 CisgICAgdW5zaWduZWQgaW50IG9yZGVyLCBpID0gMDsKKyAgICBzdHJ1Y3QgcGFnZV9pbmZvICpw YWdlOworICAgIGludCByYzsKKyNkZWZpbmUgTUFQX01BWF9JVEVSIDY0CisKKyAgICBvcmRlciA9 IE1BWF9PUkRFUjsKKyAgICB3aGlsZSAoIG5yX3BhZ2VzICE9IDAgKQorICAgIHsKKyAgICAgICAg dW5zaWduZWQgaW50IHJhbmdlX29yZGVyID0gZ2V0X29yZGVyX2Zyb21fcGFnZXMobnJfcGFnZXMg KyAxKTsKKworICAgICAgICBvcmRlciA9IG1pbihyYW5nZV9vcmRlciA/IHJhbmdlX29yZGVyIC0g MSA6IDAsIG9yZGVyKTsKKyAgICAgICAgcGFnZSA9IGFsbG9jX2RvbWhlYXBfcGFnZXMoZCwgb3Jk ZXIsIGRvbTBfbWVtZmxhZ3MpOworICAgICAgICBpZiAoIHBhZ2UgPT0gTlVMTCApCisgICAgICAg IHsKKyAgICAgICAgICAgIGlmICggb3JkZXIgPT0gMCAmJiBkb20wX21lbWZsYWdzICkKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUcnkgYWdhaW4gd2l0aG91dCBhbnkgZG9tMF9t ZW1mbGFncy4gKi8KKyAgICAgICAgICAgICAgICBkb20wX21lbWZsYWdzID0gMDsKKyAgICAgICAg ICAgICAgICBvcmRlciA9IE1BWF9PUkRFUjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg ICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggb3JkZXIgPT0gMCApCisgICAgICAgICAgICB7 CisgICAgICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IHdpdGgg b3JkZXIgMCFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAg ICAgfQorICAgICAgICAgICAgb3JkZXItLTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg ICB9CisKKyAgICAgICAgcmMgPSBndWVzdF9waHlzbWFwX2FkZF9wYWdlKGQsIF9nZm4oc3RhcnQp LCBfbWZuKHBhZ2VfdG9fbWZuKHBhZ2UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG9yZGVyKTsKKyAgICAgICAgaWYgKCByYyAhPSAwICkKKyAgICAgICAgeworICAgICAg ICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gcG9wdWxhdGUgbWVtb3J5OiBbJSNseCwlbHgpOiAlZFxu IiwKKyAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RhcnQgKyAoMVVMIDw8IG9yZGVyKSwgcmMp OworICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQg Kz0gMVVMIDw8IG9yZGVyOworICAgICAgICBucl9wYWdlcyAtPSAxVUwgPDwgb3JkZXI7CisgICAg ICAgIGlmICggKCsraSAlIE1BUF9NQVhfSVRFUikgPT0gMCApCisgICAgICAgICAgICBwcm9jZXNz X3BlbmRpbmdfc29mdGlycXMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyN1bmRlZiBNQVBf TUFYX0lURVIKK30KKworLyogU3RlYWwgUkFNIGZyb20gdGhlIGVuZCBvZiBhIG1lbW9yeSByZWdp b24uICovCitzdGF0aWMgaW50IF9faW5pdCBwdmhfc3RlYWxfcmFtKHN0cnVjdCBkb21haW4gKmQs IHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgbG9uZyBhbGlnbiwgcGFkZHJfdCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGFkZHJfdCAqYWRkcikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSA9IGQtPmFyY2gu bnJfZTgyMDsKKworICAgIC8qCisgICAgICogQWxpZ25tZW50IDAgc2hvdWxkIGJlIHNldCB0byAx LCBzbyBpdCBkb2Vzbid0IHdyYXAgYXJvdW5kIGluIHRoZQorICAgICAqIGNhbGN1bGF0aW9ucyBi ZWxvdy4KKyAgICAgKi8KKyAgICBhbGlnbiA9IGFsaWduID8gOiAxOworICAgIHdoaWxlICggaS0t ICkKKyAgICB7CisgICAgICAgIHN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmQtPmFyY2guZTgy MFtpXTsKKworICAgICAgICBpZiAoIGVudHJ5LT50eXBlICE9IEU4MjBfUkFNIHx8IGVudHJ5LT5h ZGRyICsgZW50cnktPnNpemUgPiBsaW1pdCB8fAorICAgICAgICAgICAgIGVudHJ5LT5hZGRyIDwg TUIoMSkgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgKmFkZHIgPSAoZW50cnkt PmFkZHIgKyBlbnRyeS0+c2l6ZSAtIHNpemUpICYgfihhbGlnbiAtIDEpOworICAgICAgICBpZiAo ICphZGRyIDwgZW50cnktPmFkZHIgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg ZW50cnktPnNpemUgPSAqYWRkciAtIGVudHJ5LT5hZGRyOworICAgICAgICByZXR1cm4gMDsKKyAg ICB9CisKKyAgICByZXR1cm4gLUVOT01FTTsKK30KKworLyogTkI6IG1lbW9yeSBtYXAgbXVzdCBi ZSBzb3J0ZWQgYXQgYWxsIHRpbWVzIGZvciB0aGlzIHRvIHdvcmsgY29ycmVjdGx5LiAqLworc3Rh dGljIGludCBfX2luaXQgcHZoX2FkZF9tZW1fcmFuZ2Uoc3RydWN0IGRvbWFpbiAqZCwgdWludDY0 X3QgcywgdWludDY0X3QgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCB0eXBlKQoreworICAgIHN0cnVjdCBlODIwZW50cnkgKm1hcDsKKyAgICB1bnNp Z25lZCBpbnQgaTsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgZC0+YXJjaC5ucl9lODIwOyBpKysg KQorICAgIHsKKyAgICAgICAgdWludDY0X3QgcnMgPSBkLT5hcmNoLmU4MjBbaV0uYWRkcjsKKyAg ICAgICAgdWludDY0X3QgcmUgPSBycyArIGQtPmFyY2guZTgyMFtpXS5zaXplOworCisgICAgICAg IGlmICggcnMgPT0gZSAmJiBkLT5hcmNoLmU4MjBbaV0udHlwZSA9PSB0eXBlICkKKyAgICAgICAg eworICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLmFkZHIgPSBzOworICAgICAgICAgICAgcmV0 dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJlID09IHMgJiYgZC0+YXJjaC5lODIw W2ldLnR5cGUgPT0gdHlwZSAmJgorICAgICAgICAgICAgIChpICsgMSA9PSBkLT5hcmNoLm5yX2U4 MjAgfHwgZC0+YXJjaC5lODIwW2kgKyAxXS5hZGRyID49IGUpICkKKyAgICAgICAgeworICAgICAg ICAgICAgZC0+YXJjaC5lODIwW2ldLnNpemUgKz0gZSAtIHM7CisgICAgICAgICAgICByZXR1cm4g MDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcnMgPj0gZSApCisgICAgICAgICAgICBicmVh azsKKworICAgICAgICBpZiAoIHJlID4gcyApCisgICAgICAgICAgICByZXR1cm4gLUVFWElTVDsK KyAgICB9CisKKyAgICBtYXAgPSB4emFsbG9jX2FycmF5KHN0cnVjdCBlODIwZW50cnksIGQtPmFy Y2gubnJfZTgyMCArIDEpOworICAgIGlmICggIW1hcCApCisgICAgeworICAgICAgICBwcmludGso WEVOTE9HX1dBUk5JTkcgIkU4MjA6IG91dCBvZiBtZW1vcnkgdG8gYWRkIHJlZ2lvblxuIik7Cisg ICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIG1lbWNweShtYXAsIGQtPmFyY2gu ZTgyMCwgaSAqIHNpemVvZigqZC0+YXJjaC5lODIwKSk7CisgICAgbWVtY3B5KG1hcCArIGkgKyAx LCBkLT5hcmNoLmU4MjAgKyBpLAorICAgICAgICAgICAoZC0+YXJjaC5ucl9lODIwIC0gaSkgKiBz aXplb2YoKmQtPmFyY2guZTgyMCkpOworICAgIG1hcFtpXS5hZGRyID0gczsKKyAgICBtYXBbaV0u c2l6ZSA9IGUgLSBzOworICAgIG1hcFtpXS50eXBlID0gdHlwZTsKKyAgICB4ZnJlZShkLT5hcmNo LmU4MjApOworICAgIGQtPmFyY2guZTgyMCA9IG1hcDsKKyAgICBkLT5hcmNoLm5yX2U4MjArKzsK KworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBfdm14X3Jl YWxtb2RlX2hlbHBlcnMoc3RydWN0IGRvbWFpbiAqZCkKK3sKKyAgICBwMm1fdHlwZV90IHAybXQ7 CisgICAgdWludDMyX3QgcmMsICppZGVudF9wdDsKKyAgICBtZm5fdCBtZm47CisgICAgcGFkZHJf dCBnYWRkcjsKKyAgICBzdHJ1Y3QgdmNwdSAqdiA9IGQtPnZjcHVbMF07CisKKyAgICAvKgorICAg ICAqIFN0ZWFsIHNvbWUgc3BhY2UgZnJvbSB0aGUgbGFzdCBSQU0gcmVnaW9uIGJlbG93IDRHQiBh bmQgdXNlIGl0IHRvCisgICAgICogc3RvcmUgdGhlIHJlYWwtbW9kZSBUU1MuIEl0IG5lZWRzIHRv IGJlIGFsaWduZWQgdG8gMTI4IHNvIHRoYXQgdGhlCisgICAgICogVFNTIHN0cnVjdHVyZSAod2hp Y2ggYWNjb3VudHMgZm9yIHRoZSBmaXJzdCAxMDRiKSBkb2Vzbid0IGNyb3NzCisgICAgICogYSBw YWdlIGJvdW5kYXJ5LgorICAgICAqLworICAgIGlmICggIXB2aF9zdGVhbF9yYW0oZCwgSFZNX1ZN ODZfVFNTX1NJWkUsIDEyOCwgR0IoNCksICZnYWRkcikgKQorICAgIHsKKyAgICAgICAgaWYgKCBo dm1fY29weV90b19ndWVzdF9waHlzKGdhZGRyLCBOVUxMLCBIVk1fVk04Nl9UU1NfU0laRSwgdikg IT0KKyAgICAgICAgICAgICBIVk1DT1BZX29rYXkgKQorICAgICAgICAgICAgcHJpbnRrKCJVbmFi bGUgdG8gemVybyBWTTg2IFRTUyBhcmVhXG4iKTsKKyAgICAgICAgZC0+YXJjaC5odm1fZG9tYWlu LnBhcmFtc1tIVk1fUEFSQU1fVk04Nl9UU1NfU0laRURdID0KKyAgICAgICAgICAgIFZNODZfVFNT X1VQREFURUQgfCAoKHVpbnQ2NF90KUhWTV9WTTg2X1RTU19TSVpFIDw8IDMyKSB8IGdhZGRyOwor ICAgICAgICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQsIGdhZGRyLCBnYWRkciArIEhWTV9WTTg2 X1RTU19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEU4MjBfUkVTRVJWRUQp ICkKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIHNldCBWTTg2IFRTUyBhcyByZXNlcnZl ZCBpbiB0aGUgbWVtb3J5IG1hcFxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJpbnRr KCJVbmFibGUgdG8gYWxsb2NhdGUgVk04NiBUU1MgYXJlYVxuIik7CisKKyAgICAvKiBTdGVhbCBz b21lIG1vcmUgUkFNIGZvciB0aGUgaWRlbnRpdHkgcGFnZSB0YWJsZXMuICovCisgICAgaWYgKCBw dmhfc3RlYWxfcmFtKGQsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBHQig0KSwgJmdhZGRyKSApCisg ICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBmaW5kIG1lbW9yeSB0byBzdGFzaCB0aGUg aWRlbnRpdHkgcGFnZSB0YWJsZXNcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9 CisKKyAgICAvKgorICAgICAqIElkZW50aXR5LW1hcCBwYWdlIHRhYmxlIGlzIHJlcXVpcmVkIGZv ciBydW5uaW5nIHdpdGggQ1IwLlBHPTAKKyAgICAgKiB3aGVuIHVzaW5nIEludGVsIEVQVC4gQ3Jl YXRlIGEgMzItYml0IG5vbi1QQUUgcGFnZSBkaXJlY3Rvcnkgb2YKKyAgICAgKiBzdXBlcnBhZ2Vz LgorICAgICAqLworICAgIGlkZW50X3B0ID0gbWFwX2RvbWFpbl9nZm4ocDJtX2dldF9ob3N0cDJt KGQpLCBfZ2ZuKFBGTl9ET1dOKGdhZGRyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAmbWZuLCAmcDJtdCwgMCwgJnJjKTsKKyAgICBpZiAoIGlkZW50X3B0ID09IE5VTEwgKQorICAg IHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gbWFwIGlkZW50aXR5IHBhZ2UgdGFibGVzXG4i KTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorICAgIHdyaXRlXzMyYml0X3BzZV9p ZGVudG1hcChpZGVudF9wdCk7CisgICAgdW5tYXBfZG9tYWluX3BhZ2UoaWRlbnRfcHQpOworICAg IHB1dF9wYWdlKG1mbl90b19wYWdlKG1mbl94KG1mbikpKTsKKyAgICBkLT5hcmNoLmh2bV9kb21h aW4ucGFyYW1zW0hWTV9QQVJBTV9JREVOVF9QVF0gPSBnYWRkcjsKKyAgICBpZiAoIHB2aF9hZGRf bWVtX3JhbmdlKGQsIGdhZGRyLCBnYWRkciArIFBBR0VfU0laRSwgRTgyMF9SRVNFUlZFRCkgKQor ICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gc2V0IGlkZW50aXR5IHBhZ2UgdGFibGVzIGFz IHJlc2VydmVkIGluIHRoZSBtZW1vcnkgbWFwXG4iKTsKKworICAgIHJldHVybiAwOworfQorCisv KiBBc3NpZ24gdGhlIGxvdyAxTUIgdG8gRG9tMC4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwdmhf c3RlYWxfbG93X3JhbShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMp Cit7CisgICAgdW5zaWduZWQgbG9uZyBtZm47CisKKyAgICBBU1NFUlQoc3RhcnQgKyBucl9wYWdl cyA8PSBQRk5fRE9XTihNQigxKSkpOworCisgICAgZm9yICggbWZuID0gc3RhcnQ7IG1mbiA8IHN0 YXJ0ICsgbnJfcGFnZXM7IG1mbisrICkKKyAgICB7CisgICAgICAgIHN0cnVjdCBwYWdlX2luZm8g KnBnID0gbWZuX3RvX3BhZ2UobWZuKTsKKyAgICAgICAgaW50IHJjOworCisgICAgICAgIHJjID0g dW5zaGFyZV94ZW5fcGFnZV93aXRoX2d1ZXN0KHBnLCBkb21faW8pOworICAgICAgICBpZiAoIHJj ICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gdW5zaGFyZSBYZW4g bWZuICUjbHg6ICVkXG4iLCBtZm4sIHJjKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg ICB9CisKKyAgICAgICAgc2hhcmVfeGVuX3BhZ2Vfd2l0aF9ndWVzdChwZywgZCwgWEVOU0hBUkVf d3JpdGFibGUpOworICAgICAgICByYyA9IGd1ZXN0X3BoeXNtYXBfYWRkX2VudHJ5KGQsIF9nZm4o bWZuKSwgX21mbihtZm4pLCAwLCBwMm1fcmFtX3J3KTsKKyAgICAgICAgaWYgKCByYyApCisgICAg ICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhZGQgbWZuICUjbHggdG8gcDJtOiAlZFxuIiwgbWZu LCByYyk7CisgICAgfQorfQorCitzdGF0aWMgX19pbml0IHZvaWQgcHZoX3NldHVwX2U4MjAoc3Ry dWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKK3sKKyAgICBzdHJ1Y3QgZTgy MGVudHJ5ICplbnRyeSwgKmVudHJ5X2d1ZXN0OworICAgIHVuc2lnbmVkIGludCBpOworICAgIHVu c2lnbmVkIGxvbmcgcGFnZXMsIGN1cl9wYWdlcyA9IDA7CisgICAgdWludDY0X3Qgc3RhcnQsIGVu ZDsKKworICAgIC8qCisgICAgICogQ3JhZnQgdGhlIGU4MjAgbWVtb3J5IG1hcCBmb3IgRG9tMCBi YXNlZCBvbiB0aGUgaGFyZHdhcmUgZTgyMCBtYXAuCisgICAgICovCisgICAgZC0+YXJjaC5lODIw ID0geHphbGxvY19hcnJheShzdHJ1Y3QgZTgyMGVudHJ5LCBlODIwLm5yX21hcCk7CisgICAgaWYg KCAhZC0+YXJjaC5lODIwICkKKyAgICAgICAgcGFuaWMoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1v cnkgZm9yIERvbTAgZTgyMCBtYXAiKTsKKyAgICBlbnRyeV9ndWVzdCA9IGQtPmFyY2guZTgyMDsK KworICAgIC8qIENsYW1wIGU4MjAgbWVtb3J5IG1hcCB0byBtYXRjaCB0aGUgbWVtb3J5IGFzc2ln bmVkIHRvIERvbTAgKi8KKyAgICBmb3IgKCBpID0gMCwgZW50cnkgPSBlODIwLm1hcDsgaSA8IGU4 MjAubnJfbWFwOyBpKyssIGVudHJ5KysgKQorICAgIHsKKyAgICAgICAgaWYgKCBlbnRyeS0+dHlw ZSAhPSBFODIwX1JBTSApCisgICAgICAgIHsKKyAgICAgICAgICAgICplbnRyeV9ndWVzdCA9ICpl bnRyeTsKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgg bnJfcGFnZXMgPT0gY3VyX3BhZ2VzICkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAg ICAgICAgICAqIFdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGFzc2lnbmVkIG1lbW9yeSwKKyAgICAg ICAgICAgICAqIHNraXAgdGhpcyBlbnRyeQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBj b250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2Ugc3VyZSB0 aGUgc3RhcnQgYW5kIGxlbmd0aCBhcmUgYWxpZ25lZCB0byBQQUdFX1NJWkUsIGJlY2F1c2UKKyAg ICAgICAgICogdGhhdCdzIHRoZSBtaW5pbXVtIGdyYW51bGFyaXR5IG9mIHRoZSAybmQgc3RhZ2Ug dHJhbnNsYXRpb24uIFNpbmNlCisgICAgICAgICAqIHRoZSBwMm0gY29kZSB1c2VzIFBBR0VfT1JE RVJfNEsgaW50ZXJuYWxseSwgYWxzbyB1c2UgaXQgaGVyZSBpbgorICAgICAgICAgKiBvcmRlciB0 byBwcmV2ZW50IHRoaXMgY29kZSBmcm9tIGdldHRpbmcgb3V0IG9mIHN5bmMuCisgICAgICAgICAq LworICAgICAgICBzdGFydCA9IFJPVU5EVVAoZW50cnktPmFkZHIsIFBBR0VfU0laRSA8PCBQQUdF X09SREVSXzRLKTsKKyAgICAgICAgZW5kID0gKGVudHJ5LT5hZGRyICsgZW50cnktPnNpemUpICYK KyAgICAgICAgICAgICAgfigoUEFHRV9TSVpFIDw8IFBBR0VfT1JERVJfNEspIC0gMSk7CisgICAg ICAgIGlmICggc3RhcnQgPj0gZW5kICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg IGVudHJ5X2d1ZXN0LT50eXBlID0gRTgyMF9SQU07CisgICAgICAgIGVudHJ5X2d1ZXN0LT5hZGRy ID0gc3RhcnQ7CisgICAgICAgIGVudHJ5X2d1ZXN0LT5zaXplID0gZW5kIC0gc3RhcnQ7CisgICAg ICAgIHBhZ2VzID0gUEZOX0RPV04oZW50cnlfZ3Vlc3QtPnNpemUpOworICAgICAgICBpZiAoIChj dXJfcGFnZXMgKyBwYWdlcykgPiBucl9wYWdlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8q IFRydW5jYXRlIHJlZ2lvbiAqLworICAgICAgICAgICAgZW50cnlfZ3Vlc3QtPnNpemUgPSAobnJf cGFnZXMgLSBjdXJfcGFnZXMpIDw8IFBBR0VfU0hJRlQ7CisgICAgICAgICAgICBjdXJfcGFnZXMg PSBucl9wYWdlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAg ICAgIGN1cl9wYWdlcyArPSBwYWdlczsKKyAgICAgICAgfQorIG5leHQ6CisgICAgICAgIGQtPmFy Y2gubnJfZTgyMCsrOworICAgICAgICBlbnRyeV9ndWVzdCsrOworICAgIH0KKyAgICBBU1NFUlQo Y3VyX3BhZ2VzID09IG5yX3BhZ2VzKTsKKyAgICBBU1NFUlQoZC0+YXJjaC5ucl9lODIwIDw9IGU4 MjAubnJfbWFwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHZoX3NldHVwX3AybShzdHJ1Y3Qg ZG9tYWluICpkKQoreworICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKKyAgICB1bnNp Z25lZCBsb25nIG5yX3BhZ2VzOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGludCByYzsKKyAg ICBib29sIHByZWVtcHRlZDsKKyNkZWZpbmUgTUIxX1BBR0VTIFBGTl9ET1dOKE1CKDEpKQorCisg ICAgbnJfcGFnZXMgPSBkb20wX2NvbXB1dGVfbnJfcGFnZXMoZCwgTlVMTCwgMCk7CisKKyAgICBw dmhfc2V0dXBfZTgyMChkLCBucl9wYWdlcyk7CisgICAgZG8geworICAgICAgICBwcmVlbXB0ZWQg PSBmYWxzZTsKKyAgICAgICAgcGFnaW5nX3NldF9hbGxvY2F0aW9uKGQsIGRvbTBfcGFnaW5nX3Bh Z2VzKGQsIG5yX3BhZ2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVlbXB0 ZWQpOworICAgICAgICBwcm9jZXNzX3BlbmRpbmdfc29mdGlycXMoKTsKKyAgICB9IHdoaWxlICgg cHJlZW1wdGVkICk7CisKKyAgICAvKgorICAgICAqIE1lbW9yeSBiZWxvdyAxTUIgaXMgaWRlbnRp dHkgbWFwcGVkLgorICAgICAqIE5COiB0aGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBib290ZWQg ZnJvbSBsZWdhY3kgQklPUy4KKyAgICAgKi8KKyAgICByYyA9IG1vZGlmeV9pZGVudGl0eV9tbWlv KGQsIDAsIE1CMV9QQUdFUywgdHJ1ZSk7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBw cmludGsoIkZhaWxlZCB0byBpZGVudGl0eSBtYXAgbG93IDFNQjogJWRcbiIsIHJjKTsKKyAgICAg ICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIFBvcHVsYXRlIG1lbW9yeSBtYXAuICovCisg ICAgZm9yICggaSA9IDA7IGkgPCBkLT5hcmNoLm5yX2U4MjA7IGkrKyApCisgICAgeworICAgICAg ICB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemU7CisKKyAgICAgICAgaWYgKCBkLT5hcmNoLmU4MjBb aV0udHlwZSAhPSBFODIwX1JBTSApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBh ZGRyID0gUEZOX0RPV04oZC0+YXJjaC5lODIwW2ldLmFkZHIpOworICAgICAgICBzaXplID0gUEZO X0RPV04oZC0+YXJjaC5lODIwW2ldLnNpemUpOworCisgICAgICAgIGlmICggYWRkciA+PSBNQjFf UEFHRVMgKQorICAgICAgICAgICAgcmMgPSBwdmhfcG9wdWxhdGVfbWVtb3J5X3JhbmdlKGQsIGFk ZHIsIHNpemUpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChh ZGRyICsgc2l6ZSA8IE1CMV9QQUdFUyk7CisgICAgICAgICAgICBwdmhfc3RlYWxfbG93X3JhbShk LCBhZGRyLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmMgKQorICAgICAgICAg ICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICggY3B1X2hhc192bXggJiYgcGFnaW5nX21v ZGVfaGFwKGQpICYmICF2bXhfdW5yZXN0cmljdGVkX2d1ZXN0KHYpICkKKyAgICB7CisgICAgICAg IC8qCisgICAgICAgICAqIFNpbmNlIERvbTAgY2Fubm90IGJlIG1pZ3JhdGVkLCB3ZSB3aWxsIG9u bHkgc2V0dXAgdGhlCisgICAgICAgICAqIHVucmVzdHJpY3RlZCBndWVzdCBoZWxwZXJzIGlmIHRo ZXkgYXJlIG5lZWRlZCBieSB0aGUgY3VycmVudAorICAgICAgICAgKiBoYXJkd2FyZSB3ZSBhcmUg cnVubmluZyBvbi4KKyAgICAgICAgICovCisgICAgICAgIHJjID0gcHZoX3NldHVwX3ZteF9yZWFs bW9kZV9oZWxwZXJzKGQpOworICAgICAgICBpZiAoIHJjICkKKyAgICAgICAgICAgIHJldHVybiBy YzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyN1bmRlZiBNQjFfUEFHRVMKK30KKworc3RhdGlj IGludCBfX2luaXQgcHZoX2xvYWRfa2VybmVsKHN0cnVjdCBkb21haW4gKmQsIGNvbnN0IG1vZHVs ZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBs b25nIGltYWdlX2hlYWRyb29tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1v ZHVsZV90ICppbml0cmQsIHZvaWQgKmltYWdlX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY2hhciAqY21kbGluZSwgcGFkZHJfdCAqZW50cnksCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCAqc3RhcnRfaW5mb19hZGRyKQoreworICAgIHZv aWQgKmltYWdlX3N0YXJ0ID0gaW1hZ2VfYmFzZSArIGltYWdlX2hlYWRyb29tOworICAgIHVuc2ln bmVkIGxvbmcgaW1hZ2VfbGVuID0gaW1hZ2UtPm1vZF9lbmQ7CisgICAgc3RydWN0IGVsZl9iaW5h cnkgZWxmOworICAgIHN0cnVjdCBlbGZfZG9tX3Bhcm1zIHBhcm1zOworICAgIHBhZGRyX3QgbGFz dF9hZGRyOworICAgIHN0cnVjdCBodm1fc3RhcnRfaW5mbyBzdGFydF9pbmZvID0geyAwIH07Cisg ICAgc3RydWN0IGh2bV9tb2RsaXN0X2VudHJ5IG1vZCA9IHsgMCB9OworICAgIHN0cnVjdCB2Y3B1 ICp2ID0gZC0+dmNwdVswXTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIChyYyA9IGJ6aW1hZ2Vf cGFyc2UoaW1hZ2VfYmFzZSwgJmltYWdlX3N0YXJ0LCAmaW1hZ2VfbGVuKSkgIT0gMCApCisgICAg eworICAgICAgICBwcmludGsoIkVycm9yIHRyeWluZyB0byBkZXRlY3QgYnogY29tcHJlc3NlZCBr ZXJuZWxcbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKCAocmMgPSBl bGZfaW5pdCgmZWxmLCBpbWFnZV9zdGFydCwgaW1hZ2VfbGVuKSkgIT0gMCApCisgICAgeworICAg ICAgICBwcmludGsoIlVuYWJsZSB0byBpbml0IEVMRlxuIik7CisgICAgICAgIHJldHVybiByYzsK KyAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgIGVsZl9zZXRfdmVyYm9zZSgmZWxmKTsKKyNlbmRp ZgorICAgIGVsZl9wYXJzZV9iaW5hcnkoJmVsZik7CisgICAgaWYgKCAocmMgPSBlbGZfeGVuX3Bh cnNlKCZlbGYsICZwYXJtcykpICE9IDAgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUg dG8gcGFyc2Uga2VybmVsIGZvciBFTEZOT1RFU1xuIik7CisgICAgICAgIHJldHVybiByYzsKKyAg ICB9CisKKyAgICBpZiAoIHBhcm1zLnBoeXNfZW50cnkgPT0gVU5TRVRfQUREUjMyICkKKyAgICB7 CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGZpbmQgWEVOX0VMRk5PVEVfUEhZUzMyX0VOVFJZ IGFkZHJlc3NcbiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwcmlu dGsoIk9TOiAlcyB2ZXJzaW9uOiAlcyBsb2FkZXI6ICVzIGJpdG5lc3M6ICVzXG4iLCBwYXJtcy5n dWVzdF9vcywKKyAgICAgICAgICAgcGFybXMuZ3Vlc3RfdmVyLCBwYXJtcy5sb2FkZXIsCisgICAg ICAgICAgIGVsZl82NGJpdCgmZWxmKSA/ICI2NC1iaXQiIDogIjMyLWJpdCIpOworCisgICAgLyog Q29weSB0aGUgT1MgaW1hZ2UgYW5kIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KKyAgICBlbGYu ZGVzdF9iYXNlID0gKHZvaWQgKikocGFybXMudmlydF9rc3RhcnQgLSBwYXJtcy52aXJ0X2Jhc2Up OworICAgIGVsZi5kZXN0X3NpemUgPSBwYXJtcy52aXJ0X2tlbmQgLSBwYXJtcy52aXJ0X2tzdGFy dDsKKworICAgIGVsZl9zZXRfdmNwdSgmZWxmLCB2KTsKKyAgICByYyA9IGVsZl9sb2FkX2JpbmFy eSgmZWxmKTsKKyAgICBpZiAoIHJjIDwgMCApCisgICAgeworICAgICAgICBwcmludGsoIkZhaWxl ZCB0byBsb2FkIGtlcm5lbDogJWRcbiIsIHJjKTsKKyAgICAgICAgcHJpbnRrKCJYZW4gZG9tMCBr ZXJuZWwgYnJva2VuIEVMRjogJXNcbiIsIGVsZl9jaGVja19icm9rZW4oJmVsZikpOworICAgICAg ICByZXR1cm4gcmM7CisgICAgfQorCisgICAgbGFzdF9hZGRyID0gUk9VTkRVUChwYXJtcy52aXJ0 X2tlbmQgLSBwYXJtcy52aXJ0X2Jhc2UsIFBBR0VfU0laRSk7CisKKyAgICBpZiAoIGluaXRyZCAh PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhsYXN0 X2FkZHIsIG1mbl90b192aXJ0KGluaXRyZC0+bW9kX3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGluaXRyZC0+bW9kX2VuZCwgdik7CisgICAgICAgIGlmICggcmMg KQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IGluaXRyZCB0 byBndWVzdFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAg ICBtb2QucGFkZHIgPSBsYXN0X2FkZHI7CisgICAgICAgIG1vZC5zaXplID0gaW5pdHJkLT5tb2Rf ZW5kOworICAgICAgICBsYXN0X2FkZHIgKz0gUk9VTkRVUChpbml0cmQtPm1vZF9lbmQsIFBBR0Vf U0laRSk7CisgICAgfQorCisgICAgLyogRnJlZSB0ZW1wb3JhcnkgYnVmZmVycy4gKi8KKyAgICBk aXNjYXJkX2luaXRpYWxfaW1hZ2VzKCk7CisKKyAgICBpZiAoIGNtZGxpbmUgIT0gTlVMTCApCisg ICAgeworICAgICAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMobGFzdF9hZGRyLCBjbWRs aW5lLCBzdHJsZW4oY21kbGluZSkgKyAxLCB2KTsKKyAgICAgICAgaWYgKCByYyApCisgICAgICAg IHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgZ3Vlc3QgY29tbWFuZCBsaW5l XG4iKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgICAgICBzdGFydF9p bmZvLmNtZGxpbmVfcGFkZHIgPSBsYXN0X2FkZHI7CisgICAgICAgIC8qCisgICAgICAgICAqIFJv dW5kIHVwIHRvIDMyLzY0IGJpdHMgKGRlcGVuZGluZyBvbiB0aGUgZ3Vlc3Qga2VybmVsIGJpdG5l c3MpIHNvCisgICAgICAgICAqIHRoZSBtb2RsaXN0L3N0YXJ0X2luZm8gaXMgYWxpZ25lZC4KKyAg ICAgICAgICovCisgICAgICAgIGxhc3RfYWRkciArPSBST1VORFVQKHN0cmxlbihjbWRsaW5lKSAr IDEsIGVsZl82NGJpdCgmZWxmKSA/IDggOiA0KTsKKyAgICB9CisgICAgaWYgKCBpbml0cmQgIT0g TlVMTCApCisgICAgeworICAgICAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMobGFzdF9h ZGRyLCAmbW9kLCBzaXplb2YobW9kKSwgdik7CisgICAgICAgIGlmICggcmMgKQorICAgICAgICB7 CisgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IGd1ZXN0IG1vZHVsZXNcbiIpOwor ICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIHN0YXJ0X2luZm8ubW9k bGlzdF9wYWRkciA9IGxhc3RfYWRkcjsKKyAgICAgICAgc3RhcnRfaW5mby5ucl9tb2R1bGVzID0g MTsKKyAgICAgICAgbGFzdF9hZGRyICs9IHNpemVvZihtb2QpOworICAgIH0KKworICAgIHN0YXJ0 X2luZm8ubWFnaWMgPSBYRU5fSFZNX1NUQVJUX01BR0lDX1ZBTFVFOworICAgIHN0YXJ0X2luZm8u ZmxhZ3MgPSBTSUZfUFJJVklMRUdFRCB8IFNJRl9JTklURE9NQUlOOworICAgIHJjID0gaHZtX2Nv cHlfdG9fZ3Vlc3RfcGh5cyhsYXN0X2FkZHIsICZzdGFydF9pbmZvLCBzaXplb2Yoc3RhcnRfaW5m byksIHYpOworICAgIGlmICggcmMgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8g Y29weSBzdGFydCBpbmZvIHRvIGd1ZXN0XG4iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0K KworICAgICplbnRyeSA9IHBhcm1zLnBoeXNfZW50cnk7CisgICAgKnN0YXJ0X2luZm9fYWRkciA9 IGxhc3RfYWRkcjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwdmhf c2V0dXBfY3B1cyhzdHJ1Y3QgZG9tYWluICpkLCBwYWRkcl90IGVudHJ5LAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCBzdGFydF9pbmZvKQoreworICAgIHN0cnVjdCB2 Y3B1ICp2ID0gZC0+dmNwdVswXTsKKyAgICB1bnNpZ25lZCBpbnQgY3B1LCBpOworICAgIGludCBy YzsKKyAgICAvKgorICAgICAqIFRoaXMgc2V0cyB0aGUgdkNQVSBzdGF0ZSBhY2NvcmRpbmcgdG8g dGhlIHN0YXRlIGRlc2NyaWJlZCBpbgorICAgICAqIGRvY3MvbWlzYy9odm1saXRlLm1hcmtkb3du LgorICAgICAqLworICAgIHZjcHVfaHZtX2NvbnRleHRfdCBjcHVfY3R4ID0geworICAgICAgICAu bW9kZSA9IFZDUFVfSFZNX01PREVfMzJCLAorICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmVieCA9 IHN0YXJ0X2luZm8sCisgICAgICAgIC5jcHVfcmVncy54ODZfMzIuZWlwID0gZW50cnksCisgICAg ICAgIC5jcHVfcmVncy54ODZfMzIuY3IwID0gWDg2X0NSMF9QRSB8IFg4Nl9DUjBfRVQsCisgICAg ICAgIC5jcHVfcmVncy54ODZfMzIuY3NfbGltaXQgPSB+MHUsCisgICAgICAgIC5jcHVfcmVncy54 ODZfMzIuZHNfbGltaXQgPSB+MHUsCisgICAgICAgIC5jcHVfcmVncy54ODZfMzIuc3NfbGltaXQg PSB+MHUsCisgICAgICAgIC5jcHVfcmVncy54ODZfMzIudHJfbGltaXQgPSAweDY3LAorICAgICAg ICAuY3B1X3JlZ3MueDg2XzMyLmNzX2FyID0gMHhjOWIsCisgICAgICAgIC5jcHVfcmVncy54ODZf MzIuZHNfYXIgPSAweGM5MywKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5zc19hciA9IDB4Yzkz LAorICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLnRyX2FyID0gMHg4YiwKKyAgICB9OworCisgICAg Y3B1ID0gdi0+cHJvY2Vzc29yOworICAgIGZvciAoIGkgPSAxOyBpIDwgZC0+bWF4X3ZjcHVzOyBp KysgKQorICAgIHsKKyAgICAgICAgY3B1ID0gY3B1bWFza19jeWNsZShjcHUsICZkb20wX2NwdXMp OworICAgICAgICBkb20wX3NldHVwX3ZjcHUoZCwgaSwgY3B1KTsKKyAgICB9CisKKyAgICByYyA9 IGFyY2hfc2V0X2luZm9faHZtX2d1ZXN0KHYsICZjcHVfY3R4KTsKKyAgICBpZiAoIHJjICkKKyAg ICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIHNldHVwIERvbTAgQlNQIGNvbnRleHQ6ICVk XG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IGRvbTBfc2V0 dXBfcGVybWlzc2lvbnMoZCk7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBwYW5pYygi VW5hYmxlIHRvIHNldHVwIERvbTAgcGVybWlzc2lvbnM6ICVkXG4iLCByYyk7CisgICAgICAgIHJl dHVybiByYzsKKyAgICB9CisKKyAgICB1cGRhdGVfZG9tYWluX3dhbGxjbG9ja190aW1lKGQpOwor CisgICAgY2xlYXJfYml0KF9WUEZfZG93biwgJnYtPnBhdXNlX2ZsYWdzKTsKKworICAgIHJldHVy biAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2NvdW50X2ludHJfb3ZyKHN0cnVjdCBh Y3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCisgICAgYWNwaV9pbnRyX292 ZXJyaWRlcysrOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3Nl dF9pbnRyX292cihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorewor ICAgIGNvbnN0IHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlICppbnRyID0KKyAg ICAgICAgY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3Zl cnJpZGUsIGhlYWRlcik7CisKKyAgICAqaW50c3Jjb3ZyID0gKmludHI7CisgICAgaW50c3Jjb3Zy Kys7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNwaV9jb3VudF9u bWlfc3JjKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCisg ICAgYWNwaV9ubWlfc291cmNlcysrOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9f aW5pdCBhY3BpX3NldF9ubWlfc3JjKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVy LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25n IGVuZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYWNwaV9tYWR0X25taV9zb3VyY2UgKnNyYyA9Cisg ICAgICAgIGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCBhY3BpX21hZHRfbm1pX3NvdXJjZSwg aGVhZGVyKTsKKworICAgICpubWlzcmMgPSAqc3JjOworICAgIG5taXNyYysrOworCisgICAgcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHB2aF9zZXR1cF9hY3BpX21hZHQoc3RydWN0 IGRvbWFpbiAqZCwgcGFkZHJfdCAqYWRkcikKK3sKKyAgICBzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0 ICptYWR0OworICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisgICAgc3RydWN0 IGFjcGlfbWFkdF9pb19hcGljICppb19hcGljOworICAgIHN0cnVjdCBhY3BpX21hZHRfbG9jYWxf eDJhcGljICp4MmFwaWM7CisgICAgYWNwaV9zdGF0dXMgc3RhdHVzOworICAgIHVuc2lnbmVkIGxv bmcgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgaSwgbWF4X3ZjcHVzOworICAgIGludCByYzsKKwor ICAgIC8qIENvdW50IG51bWJlciBvZiBpbnRlcnJ1cHQgb3ZlcnJpZGVzIGluIHRoZSBNQURULiAq LworICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfT1ZF UlJJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfY291bnRfaW50cl9vdnIsIFVJ TlRfTUFYKTsKKworICAgIC8qIENvdW50IG51bWJlciBvZiBOTUkgc291cmNlcyBpbiB0aGUgTUFE VC4gKi8KKyAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfTk1JX1NPVVJD RSwgYWNwaV9jb3VudF9ubWlfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX01B WCk7CisKKyAgICBtYXhfdmNwdXMgPSBkb20wX21heF92Y3B1cygpOworICAgIC8qIENhbGN1bGF0 ZSB0aGUgc2l6ZSBvZiB0aGUgY3JhZnRlZCBNQURULiAqLworICAgIHNpemUgPSBzaXplb2YoKm1h ZHQpOworICAgIC8qCisgICAgICogRklYTUU6IHRoZSBjdXJyZW50IHZJTy1BUElDIGNvZGUganVz dCBzdXBwb3J0cyBvbmUgSU8tQVBJQyBpbnN0YW5jZQorICAgICAqIHBlciBkb21haW4uIFRoaXMg bXVzdCBiZSBmaXhlZCBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBzYW1lIGFtb3VudCBvZgorICAg ICAqIElPIEFQSUNzIGFzIGF2YWlsYWJsZSBvbiBiYXJlIG1ldGFsLgorICAgICAqLworICAgIHNp emUgKz0gc2l6ZW9mKCppb19hcGljKTsKKyAgICBzaXplICs9IHNpemVvZigqaW50c3Jjb3ZyKSAq IGFjcGlfaW50cl9vdmVycmlkZXM7CisgICAgc2l6ZSArPSBzaXplb2YoKm5taXNyYykgKiBhY3Bp X25taV9zb3VyY2VzOworICAgIHNpemUgKz0gc2l6ZW9mKCp4MmFwaWMpICogbWF4X3ZjcHVzOwor CisgICAgbWFkdCA9IHh6YWxsb2NfYnl0ZXMoc2l6ZSk7CisgICAgaWYgKCAhbWFkdCApCisgICAg eworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1BRFQgdGFi bGVcbiIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gb3V0OworICAgIH0K KworICAgIC8qIENvcHkgdGhlIG5hdGl2ZSBNQURUIHRhYmxlIGhlYWRlci4gKi8KKyAgICBzdGF0 dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19NQURULCAwLCAmdGFibGUpOworICAgIGlmICgg IUFDUElfU1VDQ0VTUyhzdGF0dXMpICkKKyAgICB7CisgICAgICAgIHByaW50aygiRmFpbGVkIHRv IGdldCBNQURUIEFDUEkgdGFibGUsIGFib3J0aW5nLlxuIik7CisgICAgICAgIHJjID0gLUVJTlZB TDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIG1hZHQtPmhlYWRlciA9ICp0YWJsZTsK KyAgICBtYWR0LT5hZGRyZXNzID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKyAgICAvKgorICAg ICAqIE5COiB0aGlzIGlzIGN1cnJlbnRseSBzZXQgdG8gNCwgd2hpY2ggaXMgdGhlIHJldmlzaW9u IGluIHRoZSBBQ1BJCisgICAgICogc3BlYyA2LjEuIFNhZGx5IEFDUElDQSBkb2Vzbid0IHByb3Zp ZGUgcmV2aXNpb24gbnVtYmVycyBmb3IgdGhlCisgICAgICogdGFibGVzIGRlc2NyaWJlZCBpbiB0 aGUgaGVhZGVycy4KKyAgICAgKi8KKyAgICBtYWR0LT5oZWFkZXIucmV2aXNpb24gPSBtaW5fdCh1 bnNpZ25lZCBjaGFyLCB0YWJsZS0+cmV2aXNpb24sIDQpOworCisgICAgLyoKKyAgICAgKiBTZXR1 cCB0aGUgSU8gQVBJQyBlbnRyeS4KKyAgICAgKiBGSVhNRTogdGhlIGN1cnJlbnQgdklPLUFQSUMg Y29kZSBqdXN0IHN1cHBvcnRzIG9uZSBJTy1BUElDIGluc3RhbmNlCisgICAgICogcGVyIGRvbWFp bi4gVGhpcyBtdXN0IGJlIGZpeGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHNhbWUgYW1vdW50 IG9mCisgICAgICogSU8gQVBJQ3MgYXMgYXZhaWxhYmxlIG9uIGJhcmUgbWV0YWwsIGFuZCB3aXRo IHRoZSBzYW1lIElEcyBhcyBmb3VuZCBpbgorICAgICAqIHRoZSBuYXRpdmUgSU8gQVBJQyBNQURU IGVudHJpZXMuCisgICAgICovCisgICAgaWYgKCBucl9pb2FwaWNzID4gMSApCisgICAgICAgIHBy aW50aygiV0FSTklORzogZm91bmQgJWQgSU8gQVBJQ3MsIERvbTAgd2lsbCBvbmx5IGhhdmUgYWNj ZXNzIHRvIDEgZW11bGF0ZWQgSU8gQVBJQ1xuIiwKKyAgICAgICAgICAgICAgIG5yX2lvYXBpY3Mp OworICAgIGlvX2FwaWMgPSAodm9pZCAqKShtYWR0ICsgMSk7CisgICAgaW9fYXBpYy0+aGVhZGVy LnR5cGUgPSBBQ1BJX01BRFRfVFlQRV9JT19BUElDOworICAgIGlvX2FwaWMtPmhlYWRlci5sZW5n dGggPSBzaXplb2YoKmlvX2FwaWMpOworICAgIGlvX2FwaWMtPmlkID0gZG9tYWluX3Zpb2FwaWMo ZCktPmlkOworICAgIGlvX2FwaWMtPmFkZHJlc3MgPSBWSU9BUElDX0RFRkFVTFRfQkFTRV9BRERS RVNTOworCisgICAgeDJhcGljID0gKHZvaWQgKikoaW9fYXBpYyArIDEpOworICAgIGZvciAoIGkg PSAwOyBpIDwgbWF4X3ZjcHVzOyBpKysgKQorICAgIHsKKyAgICAgICAgeDJhcGljLT5oZWFkZXIu dHlwZSA9IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1gyQVBJQzsKKyAgICAgICAgeDJhcGljLT5oZWFk ZXIubGVuZ3RoID0gc2l6ZW9mKCp4MmFwaWMpOworICAgICAgICB4MmFwaWMtPnVpZCA9IGk7Cisg ICAgICAgIHgyYXBpYy0+bG9jYWxfYXBpY19pZCA9IGkgKiAyOworICAgICAgICB4MmFwaWMtPmxh cGljX2ZsYWdzID0gQUNQSV9NQURUX0VOQUJMRUQ7CisgICAgICAgIHgyYXBpYysrOworICAgIH0K KworICAgIC8qIFNldHVwIGludGVycnVwdCBvdmVycmlkZXMuICovCisgICAgaW50c3Jjb3ZyID0g KHZvaWQgKil4MmFwaWM7CisgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBF X0lOVEVSUlVQVF9PVkVSUklERSwgYWNwaV9zZXRfaW50cl9vdnIsCisgICAgICAgICAgICAgICAg ICAgICAgICAgIGFjcGlfaW50cl9vdmVycmlkZXMpOworCisgICAgLyogU2V0dXAgTk1JIHNvdXJj ZXMuICovCisgICAgbm1pc3JjID0gKHZvaWQgKilpbnRzcmNvdnI7CisgICAgYWNwaV90YWJsZV9w YXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX05NSV9TT1VSQ0UsIGFjcGlfc2V0X25taV9zcmMsCisg ICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbm1pX3NvdXJjZXMpOworCisgICAgQVNTRVJU KCgodm9pZCAqKW5taXNyYyAtICh2b2lkICopbWFkdCkgPT0gc2l6ZSk7CisgICAgbWFkdC0+aGVh ZGVyLmxlbmd0aCA9IHNpemU7CisgICAgLyoKKyAgICAgKiBDYWxsaW5nIGFjcGlfdGJfY2hlY2tz dW0gaGVyZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbiwgYnV0CisgICAgICogaW50cm9kdWNpbmcg YSB3cmFwcGVyIGZvciBzdWNoIHNpbXBsZSB1c2FnZSBzZWVtcyBvdmVya2lsbC4KKyAgICAgKi8K KyAgICBtYWR0LT5oZWFkZXIuY2hlY2tzdW0gLT0gYWNwaV90Yl9jaGVja3N1bShBQ1BJX0NBU1Rf UFRSKHU4LCBtYWR0KSwgc2l6ZSk7CisKKyAgICAvKiBQbGFjZSB0aGUgbmV3IE1BRFQgaW4gZ3Vl c3QgbWVtb3J5IHNwYWNlLiAqLworICAgIGlmICggcHZoX3N0ZWFsX3JhbShkLCBzaXplLCAwLCBH Qig0KSwgYWRkcikgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gZmluZCBhbGxv Y2F0ZSBndWVzdCBSQU0gZm9yIE1BRFRcbiIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAg ICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIE1hcmsgdGhpcyByZWdpb24gYXMgRTgyMF9B Q1BJLiAqLworICAgIGlmICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgKmFkZHIsICphZGRyICsgc2l6 ZSwgRTgyMF9BQ1BJKSApCisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBNQURUIHJlZ2lv biB0byBtZW1vcnkgbWFwXG4iKTsKKworICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cygq YWRkciwgbWFkdCwgc2l6ZSwgZC0+dmNwdVswXSk7CisgICAgaWYgKCByYyApCisgICAgeworICAg ICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IE1BRFQgaW50byBndWVzdCBtZW1vcnlcbiIpOwor ICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByYyA9IDA7CisKKyBvdXQ6CisgICAgeGZy ZWUobWFkdCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIF9faW5pdCBhY3Bp X21lbW9yeV9iYW5uZWQodW5zaWduZWQgbG9uZyBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgdW5zaWduZWQg bG9uZyBtZm4sIG5yX3BhZ2VzLCBpOworCisgICAgbWZuID0gUEZOX0RPV04oYWRkcmVzcyk7Cisg ICAgbnJfcGFnZXMgPSBQRk5fVVAoKGFkZHJlc3MgJiB+UEFHRV9NQVNLKSArIHNpemUpOworICAg IGZvciAoIGkgPSAwIDsgaSA8IG5yX3BhZ2VzOyBpKysgKQorICAgICAgICBpZiAoICFwYWdlX2lz X3JhbV90eXBlKG1mbiArIGksIFJBTV9UWVBFX1JFU0VSVkVEKSAmJgorICAgICAgICAgICAgICFw YWdlX2lzX3JhbV90eXBlKG1mbiArIGksIFJBTV9UWVBFX0FDUEkpICkKKyAgICAgICAgICAgIHJl dHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBfX2luaXQg cHZoX2FjcGlfdGFibGVfYWxsb3dlZChjb25zdCBjaGFyICpzaWcpCit7CisgICAgc3RhdGljIGNv bnN0IGNoYXIgX19pbml0Y29uc3QgYmFubmVkX3RhYmxlc1tdW0FDUElfTkFNRV9TSVpFXSA9IHsK KyAgICAgICAgQUNQSV9TSUdfSFBFVCwgQUNQSV9TSUdfU0xJVCwgQUNQSV9TSUdfU1JBVCwgQUNQ SV9TSUdfTVBTVCwKKyAgICAgICAgQUNQSV9TSUdfUE1UVCwgQUNQSV9TSUdfTUFEVCwgQUNQSV9T SUdfRE1BUn07CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKCBpID0gMCA7IGkgPCBB UlJBWV9TSVpFKGJhbm5lZF90YWJsZXMpOyBpKysgKQorICAgICAgICBpZiAoIHN0cm5jbXAoc2ln LCBiYW5uZWRfdGFibGVzW2ldLCBBQ1BJX05BTUVfU0laRSkgPT0gMCApCisgICAgICAgICAgICBy ZXR1cm4gZmFsc2U7CisKKyAgICAvKiBNYWtlIHN1cmUgdGFibGUgZG9lc24ndCByZXNpZGUgaW4g YSBSQU0gcmVnaW9uLiAqLworICAgIGlmICggYWNwaV9tZW1vcnlfYmFubmVkKGFjcGlfZ2JsX3Jv b3RfdGFibGVfbGlzdC50YWJsZXNbaV0uYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLmxlbmd0aCkgKQorICAgIHsK KyAgICAgICAgcHJpbnRrKCJTa2lwcGluZyB0YWJsZSAlLjRzIGJlY2F1c2UgcmVzaWRlcyBpbiBh IG5vbi1BQ1BJLCBub24tcmVzZXJ2ZWQgcmVnaW9uXG4iLAorICAgICAgICAgICAgICAgc2lnKTsK KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitz dGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBfYWNwaV94c2R0KHN0cnVjdCBkb21haW4gKmQsIHBh ZGRyX3QgbWFkdF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw YWRkcl90ICphZGRyKQoreworICAgIHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQgKnhzZHQ7CisgICAg c3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKyAgICBzdHJ1Y3QgYWNwaV90YWJsZV9y c2RwICpyc2RwOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHNpemVvZigqeHNkdCk7CisgICAg dW5zaWduZWQgaW50IGksIGosIG51bV90YWJsZXMgPSAwOworICAgIHBhZGRyX3QgeHNkdF9wYWRk cjsKKyAgICBpbnQgcmM7CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgb3JpZ2luYWwgRE1BUiB0 YWJsZSBzaWduYXR1cmUsIHdlIGFyZSBnb2luZyB0byBmaWx0ZXIgaXQgZnJvbQorICAgICAqIHRo ZSBuZXcgWFNEVCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgZ3Vlc3QsIHNvIGl0IGlzIG5vIGxv bmdlcgorICAgICAqIG5lY2Vzc2FyeSB0byBoYXZlIGl0J3Mgc2lnbmF0dXJlIHphcHBlZC4KKyAg ICAgKi8KKyAgICBhY3BpX2RtYXJfcmVpbnN0YXRlKCk7CisKKyAgICAvKiBDb3VudCB0aGUgbnVt YmVyIG9mIHRhYmxlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIFhTRFQuICovCisgICAgZm9y KCBpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrICkKKyAgICB7 CisgICAgICAgIGNvbnN0IGNoYXIgKnNpZyA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJs ZXNbaV0uc2lnbmF0dXJlLmFzY2lpOworCisgICAgICAgIGlmICggcHZoX2FjcGlfdGFibGVfYWxs b3dlZChzaWcpICkKKyAgICAgICAgICAgIG51bV90YWJsZXMrKzsKKyAgICB9CisKKyAgICAvKgor ICAgICAqIE5vIG5lZWQgdG8gYWRkIG9yIHN1YnRyYWN0IGFueXRoaW5nIGJlY2F1c2Ugc3RydWN0 IGFjcGlfdGFibGVfeHNkdAorICAgICAqIGluY2x1ZGVzIG9uZSBhcnJheSBzbG90IGFscmVhZHks IGFuZCB3ZSBoYXZlIGZpbHRlcmVkIG91dCB0aGUgb3JpZ2luYWwKKyAgICAgKiBNQURUIGFuZCB3 ZSBhcmUgZ29pbmcgdG8gYWRkIGEgY3VzdG9tIGJ1aWx0IE1BRFQuCisgICAgICovCisgICAgc2l6 ZSArPSBudW1fdGFibGVzICogc2l6ZW9mKHhzZHQtPnRhYmxlX29mZnNldF9lbnRyeVswXSk7CisK KyAgICB4c2R0ID0geHphbGxvY19ieXRlcyhzaXplKTsKKyAgICBpZiAoICF4c2R0ICkKKyAgICB7 CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgWFNEVCB0YWJs ZVxuIik7CisgICAgICAgIHJjID0gLUVOT01FTTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQor CisgICAgLyogQ29weSB0aGUgbmF0aXZlIFhTRFQgdGFibGUgaGVhZGVyLiAqLworICAgIHJzZHAg PSBhY3BpX29zX21hcF9tZW1vcnkoYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKCksIHNpemVvZigq cnNkcCkpOworICAgIGlmICggIXJzZHAgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUg dG8gbWFwIFJTRFBcbiIpOworICAgICAgICByYyA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gb3V0 OworICAgIH0KKyAgICB4c2R0X3BhZGRyID0gcnNkcC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOwor ICAgIGFjcGlfb3NfdW5tYXBfbWVtb3J5KHJzZHAsIHNpemVvZigqcnNkcCkpOworICAgIHRhYmxl ID0gYWNwaV9vc19tYXBfbWVtb3J5KHhzZHRfcGFkZHIsIHNpemVvZigqdGFibGUpKTsKKyAgICBp ZiAoICF0YWJsZSApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBtYXAgWFNEVFxu Iik7CisgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAg IHhzZHQtPmhlYWRlciA9ICp0YWJsZTsKKyAgICBhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwg c2l6ZW9mKCp0YWJsZSkpOworCisgICAgLyogQWRkIHRoZSBjdXN0b20gTUFEVC4gKi8KKyAgICB4 c2R0LT50YWJsZV9vZmZzZXRfZW50cnlbMF0gPSBtYWR0X2FkZHI7CisKKyAgICAvKiBDb3B5IHRo ZSBhZGRyZXNzZXMgb2YgdGhlIHJlc3Qgb2YgdGhlIGFsbG93ZWQgdGFibGVzLiAqLworICAgIGZv ciggaSA9IDAsIGogPSAxOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyBpKysg KQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqc2lnID0gYWNwaV9nYmxfcm9vdF90YWJsZV9s aXN0LnRhYmxlc1tpXS5zaWduYXR1cmUuYXNjaWk7CisKKyAgICAgICAgaWYgKCBwdmhfYWNwaV90 YWJsZV9hbGxvd2VkKHNpZykgKQorICAgICAgICAgICAgeHNkdC0+dGFibGVfb2Zmc2V0X2VudHJ5 W2orK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9yb290X3Rh YmxlX2xpc3QudGFibGVzW2ldLmFkZHJlc3M7CisgICAgfQorCisgICAgeHNkdC0+aGVhZGVyLnJl dmlzaW9uID0gMTsKKyAgICB4c2R0LT5oZWFkZXIubGVuZ3RoID0gc2l6ZTsKKyAgICAvKgorICAg ICAqIENhbGxpbmcgYWNwaV90Yl9jaGVja3N1bSBoZXJlIGlzIGEgbGF5ZXJpbmcgdmlvbGF0aW9u LCBidXQKKyAgICAgKiBpbnRyb2R1Y2luZyBhIHdyYXBwZXIgZm9yIHN1Y2ggc2ltcGxlIHVzYWdl IHNlZW1zIG92ZXJraWxsLgorICAgICAqLworICAgIHhzZHQtPmhlYWRlci5jaGVja3N1bSAtPSBh Y3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FTVF9QVFIodTgsIHhzZHQpLCBzaXplKTsKKworICAgIC8q IFBsYWNlIHRoZSBuZXcgWFNEVCBpbiBndWVzdCBtZW1vcnkgc3BhY2UuICovCisgICAgaWYgKCBw dmhfc3RlYWxfcmFtKGQsIHNpemUsIDAsIEdCKDQpLCBhZGRyKSApCisgICAgeworICAgICAgICBw cmludGsoIlVuYWJsZSB0byBmaW5kIGd1ZXN0IFJBTSBmb3IgWFNEVFxuIik7CisgICAgICAgIHJj ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogTWFyayB0aGlz IHJlZ2lvbiBhcyBFODIwX0FDUEkuICovCisgICAgaWYgKCBwdmhfYWRkX21lbV9yYW5nZShkLCAq YWRkciwgKmFkZHIgKyBzaXplLCBFODIwX0FDUEkpICkKKyAgICAgICAgcHJpbnRrKCJVbmFibGUg dG8gYWRkIFhTRFQgcmVnaW9uIHRvIG1lbW9yeSBtYXBcbiIpOworCisgICAgcmMgPSBodm1fY29w eV90b19ndWVzdF9waHlzKCphZGRyLCB4c2R0LCBzaXplLCBkLT52Y3B1WzBdKTsKKyAgICBpZiAo IHJjICkKKyAgICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgWFNEVCBpbnRvIGd1 ZXN0IG1lbW9yeVxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJjID0gMDsK KworIG91dDoKKyAgICB4ZnJlZSh4c2R0KTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGlj IGludCBfX2luaXQgcHZoX3NldHVwX2FjcGkoc3RydWN0IGRvbWFpbiAqZCwgcGFkZHJfdCBzdGFy dF9pbmZvKQoreworICAgIHVuc2lnbmVkIGxvbmcgcGZuLCBucl9wYWdlczsKKyAgICBwYWRkcl90 IG1hZHRfcGFkZHIsIHhzZHRfcGFkZHIsIHJzZHBfcGFkZHI7CisgICAgdW5zaWduZWQgaW50IGk7 CisgICAgaW50IHJjOworICAgIHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAgKm5hdGl2ZV9yc2RwLCBy c2RwID0geworICAgICAgICAuc2lnbmF0dXJlID0gQUNQSV9TSUdfUlNEUCwKKyAgICAgICAgLnJl dmlzaW9uID0gMiwKKyAgICAgICAgLmxlbmd0aCA9IHNpemVvZihyc2RwKSwKKyAgICB9OworCisK KyAgICAvKiBTY2FuIHRvcC1sZXZlbCB0YWJsZXMgYW5kIGFkZCB0aGVpciByZWdpb25zIHRvIHRo ZSBndWVzdCBtZW1vcnkgbWFwLiAqLworICAgIGZvciggaSA9IDA7IGkgPCBhY3BpX2dibF9yb290 X3RhYmxlX2xpc3QuY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpzaWcg PSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZS5hc2NpaTsKKyAg ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxl c1tpXS5hZGRyZXNzOworICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUgPSBhY3BpX2dibF9yb290 X3RhYmxlX2xpc3QudGFibGVzW2ldLmxlbmd0aDsKKworICAgICAgICAvKgorICAgICAgICAgKiBN YWtlIHN1cmUgdGhlIG9yaWdpbmFsIE1BRFQgaXMgYWxzbyBtYXBwZWQsIHNvIHRoYXQgRG9tMCBj YW4KKyAgICAgICAgICogcHJvcGVybHkgYWNjZXNzIHRoZSBkYXRhIHJldHVybmVkIGJ5IF9NQVQg bWV0aG9kcyBpbiBjYXNlIGl0J3MKKyAgICAgICAgICogcmUtdXNpbmcgTUFEVCBtZW1vcnkuCisg ICAgICAgICAqLworICAgICAgICBpZiAoIHN0cm5jbXAoc2lnLCBBQ1BJX1NJR19NQURULCBBQ1BJ X05BTUVfU0laRSkKKyAgICAgICAgICAgICA/IHB2aF9hY3BpX3RhYmxlX2FsbG93ZWQoc2lnKQor ICAgICAgICAgICAgIDogIWFjcGlfbWVtb3J5X2Jhbm5lZChhZGRyLCBzaXplKSApCisgICAgICAg ICAgICAgcHZoX2FkZF9tZW1fcmFuZ2UoZCwgYWRkciwgYWRkciArIHNpemUsIEU4MjBfQUNQSSk7 CisgICAgfQorCisgICAgLyogSWRlbnRpdHkgbWFwIEFDUEkgZTgyMCByZWdpb25zLiAqLworICAg IGZvciAoIGkgPSAwOyBpIDwgZC0+YXJjaC5ucl9lODIwOyBpKysgKQorICAgIHsKKyAgICAgICAg aWYgKCBkLT5hcmNoLmU4MjBbaV0udHlwZSAhPSBFODIwX0FDUEkgJiYKKyAgICAgICAgICAgICBk LT5hcmNoLmU4MjBbaV0udHlwZSAhPSBFODIwX05WUyApCisgICAgICAgICAgICBjb250aW51ZTsK KworICAgICAgICBwZm4gPSBQRk5fRE9XTihkLT5hcmNoLmU4MjBbaV0uYWRkcik7CisgICAgICAg IG5yX3BhZ2VzID0gUEZOX1VQKChkLT5hcmNoLmU4MjBbaV0uYWRkciAmIH5QQUdFX01BU0spICsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnNpemUpOworCisgICAg ICAgIHJjID0gbW9kaWZ5X2lkZW50aXR5X21taW8oZCwgcGZuLCBucl9wYWdlcywgdHJ1ZSk7Cisg ICAgICAgIGlmICggcmMgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWxlZCB0 byBtYXAgQUNQSSByZWdpb24gWyUjbHgsICUjbHgpIGludG8gRG9tMCBtZW1vcnkgbWFwXG4iLAor ICAgICAgICAgICAgICAgICAgIHBmbiwgcGZuICsgbnJfcGFnZXMpOworICAgICAgICAgICAgcmV0 dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmMgPSBwdmhfc2V0dXBfYWNwaV9tYWR0 KGQsICZtYWR0X3BhZGRyKTsKKyAgICBpZiAoIHJjICkKKyAgICAgICAgcmV0dXJuIHJjOworCisg ICAgcmMgPSBwdmhfc2V0dXBfYWNwaV94c2R0KGQsIG1hZHRfcGFkZHIsICZ4c2R0X3BhZGRyKTsK KyAgICBpZiAoIHJjICkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgLyogQ3JhZnQgYSBjdXN0 b20gUlNEUC4gKi8KKyAgICBuYXRpdmVfcnNkcCA9IGFjcGlfb3NfbWFwX21lbW9yeShhY3BpX29z X2dldF9yb290X3BvaW50ZXIoKSwgc2l6ZW9mKHJzZHApKTsKKyAgICBpZiAoICFuYXRpdmVfcnNk cCApCisgICAgeworICAgICAgICBwcmludGsoIkZhaWxlZCB0byBtYXAgbmF0aXZlIFJTRFBcbiIp OworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisgICAgbWVtY3B5KHJzZHAub2VtX2lk LCBuYXRpdmVfcnNkcC0+b2VtX2lkLCBzaXplb2YocnNkcC5vZW1faWQpKTsKKyAgICBhY3BpX29z X3VubWFwX21lbW9yeShuYXRpdmVfcnNkcCwgc2l6ZW9mKHJzZHApKTsKKyAgICByc2RwLnhzZHRf cGh5c2ljYWxfYWRkcmVzcyA9IHhzZHRfcGFkZHI7CisgICAgLyoKKyAgICAgKiBDYWxsaW5nIGFj cGlfdGJfY2hlY2tzdW0gaGVyZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbiwgYnV0CisgICAgICog aW50cm9kdWNpbmcgYSB3cmFwcGVyIGZvciBzdWNoIHNpbXBsZSB1c2FnZSBzZWVtcyBvdmVya2ls bC4KKyAgICAgKi8KKyAgICByc2RwLmNoZWNrc3VtIC09IGFjcGlfdGJfY2hlY2tzdW0oQUNQSV9D QVNUX1BUUih1OCwgJnJzZHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBBQ1BJX1JTRFBfUkVWMF9TSVpFKTsKKyAgICByc2RwLmV4dGVuZGVkX2NoZWNrc3VtIC09IGFj cGlfdGJfY2hlY2tzdW0oQUNQSV9DQVNUX1BUUih1OCwgJnJzZHApLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnNkcCkpOworCisgICAgLyoK KyAgICAgKiBQbGFjZSB0aGUgbmV3IFJTRFAgaW4gZ3Vlc3QgbWVtb3J5IHNwYWNlLgorICAgICAq CisgICAgICogTkI6IHRoaXMgUlNEUCBpcyBub3QgZ29pbmcgdG8gcmVwbGFjZSB0aGUgb3JpZ2lu YWwgUlNEUCwgd2hpY2ggc2hvdWxkCisgICAgICogc3RpbGwgYmUgYWNjZXNzaWJsZSB0byB0aGUg Z3Vlc3QuIEhvd2V2ZXIgdGhhdCBSU0RQIGlzIGdvaW5nIHRvIHBvaW50IHRvCisgICAgICogdGhl IG5hdGl2ZSBSU0RULCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciB0aGUgRG9tMCBrZXJuZWwn cyBib290CisgICAgICogcHVycG9zZXMgKHdlIGtlZXAgaXQgdmlzaWJsZSBmb3IgcG9zdCBib290 IGFjY2VzcykuCisgICAgICovCisgICAgaWYgKCBwdmhfc3RlYWxfcmFtKGQsIHNpemVvZihyc2Rw KSwgMCwgR0IoNCksICZyc2RwX3BhZGRyKSApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJs ZSB0byBhbGxvY2F0ZSBndWVzdCBSQU0gZm9yIFJTRFBcbiIpOworICAgICAgICByZXR1cm4gLUVO T01FTTsKKyAgICB9CisKKyAgICAvKiBNYXJrIHRoaXMgcmVnaW9uIGFzIEU4MjBfQUNQSS4gKi8K KyAgICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQsIHJzZHBfcGFkZHIsIHJzZHBfcGFkZHIgKyBz aXplb2YocnNkcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFODIwX0FDUEkpICkKKyAg ICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWRkIFJTRFAgcmVnaW9uIHRvIG1lbW9yeSBtYXBcbiIp OworCisgICAgLyogQ29weSBSU0RQIGludG8gZ3Vlc3QgbWVtb3J5LiAqLworICAgIHJjID0gaHZt X2NvcHlfdG9fZ3Vlc3RfcGh5cyhyc2RwX3BhZGRyLCAmcnNkcCwgc2l6ZW9mKHJzZHApLCBkLT52 Y3B1WzBdKTsKKyAgICBpZiAoIHJjICkKKyAgICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRv IGNvcHkgUlNEUCBpbnRvIGd1ZXN0IG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAg ICB9CisKKyAgICAvKiBDb3B5IFJTRFAgYWRkcmVzcyB0byBzdGFydF9pbmZvLiAqLworICAgIHJj ID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhzdGFydF9pbmZvICsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGh2bV9zdGFydF9pbmZvLCByc2RwX3BhZGRy KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJzZHBfcGFkZHIsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigoKHN0cnVjdCBodm1fc3RhcnRfaW5mbyAq KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLT5yc2RwX3BhZGRy KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+dmNwdVswXSk7CisgICAgaWYg KCByYyApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IFJTRFAgaW50byBn dWVzdCBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJu IDA7Cit9CisKK2ludCBfX2luaXQgZG9tMF9jb25zdHJ1Y3RfcHZoKHN0cnVjdCBkb21haW4gKmQs IGNvbnN0IG1vZHVsZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGxvbmcgaW1hZ2VfaGVhZHJvb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBtb2R1bGVfdCAqaW5pdHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAq KCpib290c3RyYXBfbWFwKShjb25zdCBtb2R1bGVfdCAqKSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNoYXIgKmNtZGxpbmUpCit7CisgICAgcGFkZHJfdCBlbnRyeSwgc3RhcnRfaW5m bzsKKyAgICBpbnQgcmM7CisKKyAgICBwcmludGsoIioqIEJ1aWxkaW5nIGEgUFZIIERvbTAgKipc biIpOworCisgICAgaW9tbXVfaHdkb21faW5pdChkKTsKKworICAgIHJjID0gcHZoX3NldHVwX3Ay bShkKTsKKyAgICBpZiAoIHJjICkKKyAgICB7CisgICAgICAgIHByaW50aygiRmFpbGVkIHRvIHNl dHVwIERvbTAgcGh5c2ljYWwgbWVtb3J5IG1hcFxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAg ICB9CisKKyAgICByYyA9IHB2aF9sb2FkX2tlcm5lbChkLCBpbWFnZSwgaW1hZ2VfaGVhZHJvb20s IGluaXRyZCwgYm9vdHN0cmFwX21hcChpbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAg Y21kbGluZSwgJmVudHJ5LCAmc3RhcnRfaW5mbyk7CisgICAgaWYgKCByYyApCisgICAgeworICAg ICAgICBwcmludGsoIkZhaWxlZCB0byBsb2FkIERvbTAga2VybmVsXG4iKTsKKyAgICAgICAgcmV0 dXJuIHJjOworICAgIH0KKworICAgIHJjID0gcHZoX3NldHVwX2NwdXMoZCwgZW50cnksIHN0YXJ0 X2luZm8pOworICAgIGlmICggcmMgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8g c2V0dXAgRG9tMCBDUFVzOiAlZFxuIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQor CisgICAgcmMgPSBwdmhfc2V0dXBfYWNwaShkLCBzdGFydF9pbmZvKTsKKyAgICBpZiAoIHJjICkK KyAgICB7CisgICAgICAgIHByaW50aygiRmFpbGVkIHRvIHNldHVwIERvbTAgQUNQSSB0YWJsZXM6 ICVkXG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBwYW5pYygiQnVp bGRpbmcgYSBQVkh2MiBEb20wIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOworICAgIHJldHVybiAw OworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogbW9kZTogQworICogYy1maWxlLXN0 eWxlOiAiQlNEIgorICogYy1iYXNpYy1vZmZzZXQ6IDQKKyAqIHRhYi13aWR0aDogNAorICogaW5k ZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3hlbi9pbmNsdWRl L2FzbS14ODYvZG9tMF9idWlsZC5oIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9kb20wX2J1aWxkLmgK aW5kZXggMmJhMzQ5ZTQ0NS4uMDljZDhjYjI0MCAxMDA2NDQKLS0tIGEveGVuL2luY2x1ZGUvYXNt LXg4Ni9kb20wX2J1aWxkLmgKKysrIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9kb20wX2J1aWxkLmgK QEAgLTE5LDYgKzE5LDE1IEBAIGludCBkb20wX2NvbnN0cnVjdF9wdigKICAgICB2b2lkICooKmJv b3RzdHJhcF9tYXApKGNvbnN0IG1vZHVsZV90ICopLAogICAgIGNoYXIgKmNtZGxpbmUpOwogCitp bnQgZG9tMF9jb25zdHJ1Y3RfcHZoKHN0cnVjdCBkb21haW4gKmQsIGNvbnN0IG1vZHVsZV90ICpp bWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbWFnZV9oZWFkcm9v bSwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX3QgKmluaXRyZCwKKyAgICAgICAgICAg ICAgICAgICAgICAgdm9pZCAqKCpib290c3RyYXBfbWFwKShjb25zdCBtb2R1bGVfdCAqKSwKKyAg ICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21kbGluZSk7CisKK3Vuc2lnbmVkIGxvbmcgZG9t MF9wYWdpbmdfcGFnZXMoY29uc3Qgc3RydWN0IGRvbWFpbiAqZCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CisKICNlbmRpZgkvKiBfRE9N MF9CVUlMRF9IXyAqLwogCiAvKgotLSAKMi4xMS4wCgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxA bGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==