From owner-freebsd-wireless@FreeBSD.ORG Tue Aug 13 12:22:00 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 610E4D8C; Tue, 13 Aug 2013 12:22:00 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vc0-x22c.google.com (mail-vc0-x22c.google.com [IPv6:2607:f8b0:400c:c03::22c]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id DD029225F; Tue, 13 Aug 2013 12:21:59 +0000 (UTC) Received: by mail-vc0-f172.google.com with SMTP id m17so3781085vca.31 for ; Tue, 13 Aug 2013 05:21:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=ss8gwLvKf9c3h7/q64coqYFff52XhxmVMz49l2fVIBw=; b=obarRv6DMvH1TTM7rxmqoVrcbZameaz3IXXWMs64tL3FNqyGP72e1VIk0KmrGXLDnb OHnd9Pgaszvcce5ZrsH9afycGgXGaQ3RRGBfn7VpLbilnQYnl4DRzGpC4wj9INA6D5IQ TatD9qZR3yfhCabGLhCvDB7MqemRCZy7K/o0Mh5wdH6CQ2adAhs9KH4HWA7ZMGEu+aLE PcDO+z2YeCjnaD3HYh1e0XmpRoPdb5ol4cKQJ6SFk2eBKqQpq9c2/Sc2begnXSQU9JhW q4++XRZi30KHZfKJn6i/x7vd/88GNcjRpDImAgEyYVjtjdPxJQ2Rb9m9uKOVGsXnOMll xSLQ== MIME-Version: 1.0 X-Received: by 10.220.238.81 with SMTP id kr17mr68276vcb.61.1376396518988; Tue, 13 Aug 2013 05:21:58 -0700 (PDT) Received: by 10.220.57.142 with HTTP; Tue, 13 Aug 2013 05:21:58 -0700 (PDT) In-Reply-To: References: Date: Tue, 13 Aug 2013 20:21:58 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: multipart/mixed; boundary=047d7b3434b695a01504e3d34963 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: freebsd-wireless@freebsd.org X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 13 Aug 2013 12:22:00 -0000 --047d7b3434b695a01504e3d34963 Content-Type: text/plain; charset=ISO-8859-1 Hi! Here is an update of work these days. I've added a new struct called ieee80211_rc_info to the ratectl API. It contains tx completing information, i.e. txcnt, retrycnt, finaltsi, etc, which can be provided to ratectl algo during the __complete__ period. ir_rates, ieee80211_ratectl_rates and ieee80211_ratectl_complete_rcflags are adapted to accept the ieee80211_rc_info pointer through which framelen and shortpreamble can also be reached. Then I added __complete__ stuff and ir_rates to ieee80211_rc_sample. Thanks! Chenchong On Tue, Aug 6, 2013 at 12:03 AM, Adrian Chadd wrote: > Hi! > > Great! > > So what's the problem with complete? Linux just provides all the > information that the NIC supplies - how many attempts were made, how > many attempts failed, which rate suceeded, etc. It looks a lot like it > was designed around the requirements for the atheros driver (that has > the most interesting information available) and other NICs just have > to fake it somehow. > > > > -adrian > > On 5 August 2013 08:58, Chenchong Qin wrote: > > Hi! > > > > Here is my work done these days on porting ath_rate_sample to net80211. > It > > has not been finished yet. _complete_ and _update_ are to be added. > > > > _complete_ is really a tricky thing. We have to provide rc algos with rc > > information > > during the frame completion period. Different rc algos may need > different rc > > information. What makes things more thornier is that different drivers > > provide > > different rc information in different ways. So, it seems we need a > unified > > way to > > provide the rc information during completion of a frame. > > > > I'm browsing mac80211 these days to see what Linux do about _complete_. > And, > > looking forward to your commets! > > > > Thanks! > > > > Chenchong > > > > > > On Sat, Aug 3, 2013 at 1:30 AM, Adrian Chadd wrote: > >> > >> Well just remember you can always ask me/us questions! > >> > >> What's your latest diff against -HEAD? Maybe I can start looking at > >> including parts of it in the tree. > >> > >> > >> > >> > >> -adrian > >> > >> On 2 August 2013 09:17, Chenchong Qin wrote: > >> > Hi! > >> > > >> > These days, I'm taking a further look at what Linux done for the > >> > _completion_ of a > >> > frame. Some updates will be posted here later. > >> > > >> > And, with ir_rates, we can return/fill an rc array rather than just > >> > returning the rix. > >> > > >> > Thanks! > >> > > >> > Chenchong > >> > > >> > > >> > > >> > > >> > > >> > On Thu, Aug 1, 2013 at 12:21 AM, Adrian Chadd > >> > wrote: > >> >> > >> >> Boo! > >> >> > >> >> Do you have another update? > >> >> > >> >> > >> >> > >> >> -adrian > >> >> > >> >> On 24 July 2013 06:44, Adrian Chadd wrote: > >> >> > On 24 July 2013 06:38, Chenchong Qin > wrote: > >> >> >> > >> >> >> My pleasure! > >> >> >> > >> >> >> It's also against HEAD. > >> >> >> > >> >> >> Thanks! > >> >> > > >> >> > Ok. This is looking great! > >> >> > > >> >> > Next - we need to update the rate control API to now populate an rc > >> >> > array rather than just returning the rix. > >> >> > > >> >> > This is the tricky part - as we're going to have to modify all the > >> >> > drivers that use the rate control API to use this. > >> >> > Which is fine, as there's only a handful. It's just annoying. > >> >> > > >> >> > Then we have to provide the rate control information during frame > >> >> > _completion_, so the rate control code knows which transmission > rates > >> >> > succeeded or failed. I'm still not sure what to do about it here. > >> >> > Maybe do something like Linux and attach TX rate control and > >> >> > completion information as an mbuf tag? > >> >> > > >> >> > _Then_ we can start doing interesting thing with it. :) > >> >> > > >> >> > > >> >> > > >> >> > -adrian > >> > > >> > > > > > > --047d7b3434b695a01504e3d34963 Content-Type: application/octet-stream; name="20130812-net80211-ratectl.diff" Content-Disposition: attachment; filename="20130812-net80211-ratectl.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hkb2x1090 SW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g c3lzL25ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuYwkocmV2aXNpb24gMCkKKysrIHN5cy9u ZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDI1NTg3MikKQEAgLTAsMCAr MSwxMTYyIEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUv c2FtcGxlLmMgMjQ4NTczIDIwMTMtMDItMjcgMDQ6MzM6MDZaIGFkcmlhbiAkKi8KKworLyotCisg KiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+Cisg KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg UFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJ TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q TElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwg VEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURF TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV RElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8 c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlICJvcHRfd2xhbi5oIgorCisjaW5jbHVkZSA8c3lzL3Bh cmFtLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4K KyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorCisjaW5j bHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CisKKyNpZmRlZiBJTkVU CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4K KyNlbmRpZgorCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgorI2luY2x1ZGUg PG5ldDgwMjExL2llZWU4MDIxMV9odC5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9y YXRlY3RsLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZS5oPgorI2lu Y2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oPgorCitzdGF0aWMg dm9pZAlzYW1wbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOworc3RhdGljIHZvaWQJc2Ft cGxlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOworc3RhdGljIHZvaWQJc2FtcGxlX25v ZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfbm9k ZV9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOworc3RhdGljIGludAlzYW1wbGVfcmF0 ZShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdm9p ZAlzYW1wbGVfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAorICAgIAkJ CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsIAorCQkJdm9pZCAqLCB2b2lkICop Oworc3RhdGljIHZvaWQJc2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAsCisJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAqLCB2b2lkICos IHZvaWQgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGll ZWU4MDIxMXZhcCAqLCBpbnQpOworCisvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyBmcm9tIG5ldDgw MjExIGxheWVyICovCitzdGF0aWMJaW50IG5yZWZzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfcmF0ZWN0bCBzYW1wbGUgPSB7CisJLmlyX25hbWUJPSAic2FtcGxlIiwKKwku aXJfYXR0YWNoCT0gTlVMTCwKKwkuaXJfZGV0YWNoCT0gTlVMTCwKKwkuaXJfaW5pdAk9IHNhbXBs ZV9pbml0LAorCS5pcl9kZWluaXQJPSBzYW1wbGVfZGVpbml0LAorCS5pcl9ub2RlX2luaXQJPSBz YW1wbGVfbm9kZV9pbml0LAorCS5pcl9ub2RlX2RlaW5pdAk9IHNhbXBsZV9ub2RlX2RlaW5pdCwK KwkuaXJfcmF0ZQk9IHNhbXBsZV9yYXRlLAorCS5pcl9yYXRlcwk9IHNhbXBsZV9yYXRlcywKKwku aXJfdHhfY29tcGxldGUJPSBzYW1wbGVfdHhfY29tcGxldGUsCisJLmlyX3R4X3VwZGF0ZQk9IHNh bXBsZV90eF91cGRhdGUsCisJLmlyX3NldGludGVydmFsCT0gc2FtcGxlX3NldGludGVydmFsLAor fTsKK0lFRUU4MDIxMV9SQVRFQ1RMX01PRFVMRShzYW1wbGUsIDEpOworSUVFRTgwMjExX1JBVEVD VExfQUxHKHNhbXBsZSwgSUVFRTgwMjExX1JBVEVDVExfU0FNUExFLCBzYW1wbGUpOworCitzdGF0 aWMgdm9pZAorc2FtcGxlX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoreworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGU7CisKKwlLQVNTRVJUKHZhcC0+aXZfcnMgPT0gTlVM TCwgKCIlcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMiLCBfX2Z1bmNfXykpOworCisJc2FtcGxlID0g dmFwLT5pdl9ycyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zYW1wbGUpLAorCSAg ICBNXzgwMjExX1JBVEVDVEwsIE1fTk9XQUlUfE1fWkVSTyk7CisJaWYgKHNhbXBsZSA9PSBOVUxM KSB7CisJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHJhdGVjdGwgc3Ry dWN0dXJlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0 ZSA9IDc1OwkJLyogZXdtYSBwZXJjZW50YWdlIChbMC4uOTldKSAqLworCXNhbXBsZS0+c2FtcGxl X3Ntb290aGluZ19taW5wYWNrZXRzID0gMTAwIC8gKDEwMCAtIHNhbXBsZS0+c2FtcGxlX3Ntb290 aGluZ19yYXRlKTsKKwlzYW1wbGUtPnNhbXBsZV9yYXRlID0gMTA7CQkJLyogJXRpbWUgdG8gdHJ5 IGRpZmYgdHggcmF0ZXMgKi8KKwlzYW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9mYWlsdXJl cyA9IDM7CS8qIHRocmVzaG9sZCBmb3IgcmF0ZSBzYW1wbGluZyovCisJc2FtcGxlLT5zYW1wbGVf c3RhbGVfZmFpbHVyZV90aW1lb3V0ID0gMTAgKiBoejsJLyogMTAgc2Vjb25kcyAqLworCXNhbXBs ZS0+c2FtcGxlX21pbl9zd2l0Y2ggPSBoejsJCQkvKiAxIHNlY29uZCAqLworCXNhbXBsZV9zZXRp bnRlcnZhbCh2YXAsIDUwMCAvKiBtcyAqLyk7IAkvKiBhY3R1YWxseSBkbyBub3RoaW5nICovCisJ c2FtcGxlX3N5c2N0bGF0dGFjaCh2YXAsIHZhcC0+aXZfc3lzY3RsLCB2YXAtPml2X29pZCk7Cit9 CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCkK K3sKKwlmcmVlKHZhcC0+aXZfcnMsIE1fODAyMTFfUkFURUNUTCk7Cit9CisKKy8vIFhYWCBzaG91 bGQgYmUgc2hhcmVkIGJ5IHJhdGVjdGwgYWxnb3MKK3N0YXRpYyBpbnQKK3NhbXBsZV9ub2RlX2lz XzExbihzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCisJaWYgKG5pLT5uaV9jaGFuID09 IE5VTEwpCisJCXJldHVybiAoMCk7CisJaWYgKG5pLT5uaV9jaGFuID09IElFRUU4MDIxMV9DSEFO X0FOWUMpCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChJRUVFODAyMTFfSVNfQ0hBTl9IVChuaS0+ bmlfY2hhbikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgKm1ycl9zY2hl ZHVsZXNbSUVFRTgwMjExX01PREVfTUFYKzJdID0geworCU5VTEwsCQkvKiBJRUVFODAyMTFfTU9E RV9BVVRPICovCisJc2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfMTFBICovCisJc2VyaWVz XzExZywJLyogSUVFRTgwMjExX01PREVfMTFCICovCisJc2VyaWVzXzExZywJLyogSUVFRTgwMjEx X01PREVfMTFHICovCisJTlVMTCwJCS8qIElFRUU4MDIxMV9NT0RFX0ZIICovCisJc2VyaWVzXzEx YSwJLyogSUVFRTgwMjExX01PREVfVFVSQk9fQSAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIx MV9NT0RFX1RVUkJPX0cgKi8KKwlzZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9ERV9TVFVSQk9f QSAqLworCXNlcmllc18xMW5hLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5BICovCisJc2VyaWVzXzEx bmcsCS8qIElFRUU4MDIxMV9NT0RFXzExTkcgKi8KKwlzZXJpZXNfaGFsZiwJLyogSUVFRTgwMjEx X01PREVfSEFMRiAqLworCXNlcmllc19xdWFydGVyLAkvKiBJRUVFODAyMTFfTU9ERV9RVUFSVEVS ICovCit9OworCitzdGF0aWMgdm9pZAorc2FtcGxlX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjEx X25vZGUgKm5pKQoreworI2RlZmluZQlSQVRFKF9peCkJKG5pLT5uaV9yYXRlcy5yc19yYXRlc1so X2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCURPVDExUkFURShfaXgpCShydC0+ aW5mb1soX2l4KV0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1Mo X2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNbX2l4XSB8IElFRUU4MDIxMV9SQVRFX01DUykK KwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAy MTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxl X25vZGUgKnNhbiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy dCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCWVu dW0gaWVlZTgwMjExX3BoeW1vZGUgY3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5p dl9pYy0+aWNfY3VyY2hhbik7CisJaW50IHgsIHksIHJpeDsKKworCWlmIChuaS0+bmlfcmN0bHMg PT0gTlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBzYW4gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBp ZWVlODAyMTFfc2FtcGxlX25vZGUpLAorCQkgICAgTV84MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxN X1pFUk8pOworCQlpZiAoc2FuID09IE5VTEwpIHsKKwkJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwg ImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwgIgorCQkJICAgICJzdHJ1Y3R1cmVcbiIp OworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXNhbiA9IG5pLT5uaV9yY3RsczsKKwlzYW4t PnNhbl9zYW1wbGUgPSBzYW1wbGU7CisKKwlLQVNTRVJUKHJ0ICE9IE5VTEwsICgibm8gcmF0ZSB0 YWJsZSwgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c2NoZWQgPSBtcnJfc2NoZWR1bGVz W2N1cm1vZGVdOworCUtBU1NFUlQoc2FuLT5zY2hlZCAhPSBOVUxMLCAoIm5vIG1yciBzY2hlZHVs ZSBmb3IgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCXNhbi0+c3RhdGljX3JpeCA9IC0xOworCXNh bXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwkvKgorCSAqIENvbnN0cnVjdCBhIGJpdG1h c2sgb2YgdXNhYmxlIHJhdGVzLiAgVGhpcyBoYXMgYWxsCisJICogbmVnb3RpYXRlZCByYXRlcyBt aW51cyB0aG9zZSBtYXJrZWQgYnkgdGhlIGhhbCBhcworCSAqIHRvIGJlIGlnbm9yZWQgZm9yIGRv aW5nIHJhdGUgY29udHJvbC4KKwkgKi8KKwlzYW4tPnJhdGVtYXNrID0gMDsKKworCS8qIE1DUyBy YXRlcyAqLworCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgeworCQlmb3Ig KHggPSAwOyB4IDwgbmktPm5pX2h0cmF0ZXMucnNfbnJhdGVzOyB4KyspIHsKKwkJCXJpeCA9IHJ0 LT5yYXRlQ29kZVRvSW5kZXhbTUNTKHgpXTsKKwkJCWlmIChyaXggPT0gMHhmZikKKwkJCQljb250 aW51ZTsKKwkJCS8qIHNraXAgcmF0ZXMgbWFya2VkIGJyb2tlbiBieSBoYWwgKi8KKwkJCWlmICgh cnQtPmluZm9bcml4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCUtBU1NFUlQocml4IDwgU0FN UExFX01BWFJBVEVTLAorCQkJICAgICgibWNzICV1IGhhcyByaXggJWQiLCBNQ1MoeCksIHJpeCkp OworCQkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3QpIDE8PHJpeDsKKwkJfQorCX0KKworCS8q IExlZ2FjeSByYXRlcyAqLworCWZvciAoeCA9IDA7IHggPCBuaS0+bmlfcmF0ZXMucnNfbnJhdGVz OyB4KyspIHsKKwkJcml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFtSQVRFKHgpXTsKKwkJaWYgKHJp eCA9PSAweGZmKQorCQkJY29udGludWU7CisJCS8qIHNraXAgcmF0ZXMgbWFya2VkIGJyb2tlbiBi eSBoYWwgKi8KKwkJaWYgKCFydC0+aW5mb1tyaXhdLnZhbGlkKQorCQkJY29udGludWU7CisJCUtB U1NFUlQocml4IDwgU0FNUExFX01BWFJBVEVTLAorCQkgICAgKCJyYXRlICV1IGhhcyByaXggJWQi LCBSQVRFKHgpLCByaXgpKTsKKwkJc2FuLT5yYXRlbWFzayB8PSAodWludDY0X3QpIDE8PHJpeDsK Kwl9CisKKwlmb3IgKHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlp bnQgc2l6ZSA9IGJpbl90b19zaXplKHkpOworCQl1aW50NjRfdCBtYXNrOworCisJCXNhbi0+cGFj a2V0c19zZW50W3ldID0gMDsKKwkJc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0gPSAtMTsKKwkJ c2FuLT5sYXN0X3NhbXBsZV9yaXhbeV0gPSAwOworCQkvKiBYWFggc3RhcnQgd2l0aCBmaXJzdCB2 YWxpZCByYXRlICovCisJCXNhbi0+Y3VycmVudF9yaXhbeV0gPSBmZnMoc2FuLT5yYXRlbWFzaykt MTsKKwkJCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgYnVja2V0czsgdGhl c2UgYXJlCisJCSAqIGluZGV4ZWQgYnkgdGhlIHJhdGUgY29kZSBpbmRleC4KKwkJICovCisJCWZv ciAocml4ID0gMCwgbWFzayA9IHNhbi0+cmF0ZW1hc2s7IG1hc2sgIT0gMDsgcml4KyssIG1hc2sg Pj49IDEpIHsKKwkJCWlmICgobWFzayAmIDEpID09IDApCQkvKiBub3QgYSB2YWxpZCByYXRlICov CisJCQkJY29udGludWU7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJl cyA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMgPSAwOworCQkJc2FuLT5zdGF0c1t5 XVtyaXhdLnRvdGFsX3BhY2tldHMgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnBhY2tldHNf YWNrZWQgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLmxhc3RfdHggPSAwOworCQkJc2FuLT5z dGF0c1t5XVtyaXhdLmV3bWFfcGN0ID0gMDsKKwkJCQorCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnBl cmZlY3RfdHhfdGltZSA9CisJCQkgICAgY2FsY191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNp emUsIHJpeCwgMCwgMCwKKwkJCSAgICAobmktPm5pX2NodyA9PSA0MCkpOworCQkJc2FuLT5zdGF0 c1t5XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZSA9CisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLnBl cmZlY3RfdHhfdGltZTsKKwkJfQorCX0KKworCS8qIHNldCB0aGUgdmlzaWJsZSBiaXQtcmF0ZSAq LworCWlmIChzYW4tPnN0YXRpY19yaXggIT0gLTEpCisJCW5pLT5uaV90eHJhdGUgPSBET1QxMVJB VEUoc2FuLT5zdGF0aWNfcml4KTsKKwllbHNlCisJCW5pLT5uaV90eHJhdGUgPSBSQVRFKDApOwor I3VuZGVmIFJBVEUKKyN1bmRlZiBET1QxMVJBVEUKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIHZv aWQKK3NhbXBsZV9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWZy ZWUobmktPm5pX3JjdGxzLCBNXzgwMjExX1JBVEVDVEwpOworfQorCitzdGF0aWMgaW50Citkb3Qx MXJhdGUoY29uc3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LCBpbnQgcml4KQoreworCWlmIChy aXggPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4 MDIxMV9UX0hUID8KKwkgICAgcnQtPmluZm9bcml4XS5kb3QxMVJhdGUgOiAocnQtPmluZm9bcml4 XS5kb3QxMVJhdGUgJiBJRUVFODAyMTFfUkFURV9WQUwpIC8gMjsKK30KKworc3RhdGljIGNvbnN0 IGNoYXIgKgorZG90MTFyYXRlX2xhYmVsKGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwg aW50IHJpeCkKK3sKKwlpZiAocml4IDwgMCkKKwkJcmV0dXJuICIiOworCXJldHVybiBydC0+aW5m b1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCA/ICJNQ1MiIDogIk1iICI7Cit9CisKKy8qCisg KiBSZXR1cm4gdGhlIHJpeCB3aXRoIHRoZSBsb3dlc3QgYXZlcmFnZV90eF90aW1lLAorICogb3Ig LTEgaWYgYWxsIHRoZSBhdmVyYWdlX3R4X3RpbWVzIGFyZSAwLgorICovCitzdGF0aWMgX19pbmxp bmUgaW50CitwaWNrX2Jlc3RfcmF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBj b25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LAorICAgIGludCBzaXplX2Jpbiwg aW50IHJlcXVpcmVfYWNrZWRfYmVmb3JlKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25v ZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKyAgICBpbnQgYmVzdF9yYXRlX3JpeCwgYmVzdF9yYXRl X3R0LCBiZXN0X3JhdGVfcGN0OworCXVpbnQ2NF90IG1hc2s7CisJaW50IHJpeCwgdHQsIHBjdDsK KworICAgIGJlc3RfcmF0ZV9yaXggPSAwOworICAgIGJlc3RfcmF0ZV90dCA9IDA7CisJYmVzdF9y YXRlX3BjdCA9IDA7CisKKwlmb3IgKG1hc2sgPSBzYW4tPnJhdGVtYXNrLCByaXggPSAwOyBtYXNr ICE9IDA7IG1hc2sgPj49IDEsIHJpeCsrKSB7CisJCWlmICgobWFzayAmIDEpID09IDApCQkvKiBu b3QgYSBzdXBwb3J0ZWQgcmF0ZSAqLworCQkJY29udGludWU7CisKKwkJLyogRG9uJ3QgcGljayBh IG5vbi1IVCByYXRlIGZvciBhIEhUIG5vZGUgKi8KKwkJaWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVF ODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChydC0+aW5mb1tyaXhdLnBoeSAhPSBJRUVFODAyMTFf VF9IVCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdHQgPSBzYW4tPnN0YXRzW3NpemVfYmlu XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZTsKKwkJaWYgKHR0IDw9IDAgfHwKKwkJICAgIChyZXF1aXJl X2Fja2VkX2JlZm9yZSAmJgorCQkgICAgICFzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLnBhY2tl dHNfYWNrZWQpKQorCQkJY29udGludWU7CisKKwkJLyogQ2FsY3VsYXRlIHBlcmNlbnRhZ2UgaWYg cG9zc2libGUgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0udG90YWxfcGFja2V0 cyA+IDApIHsKKwkJCXBjdCA9IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uZXdtYV9wY3Q7CisJ CX0gZWxzZSB7CisJCQkvKiBYWFggZm9yIG5vdywgYXNzdW1lIDk1JSBvayAqLworCQkJcGN0ID0g OTU7CisJCX0KKworCQkvKiBkb24ndCB1c2UgYSBiaXQtcmF0ZSB0aGF0IGhhcyBiZWVuIGZhaWxp bmcgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJl cyA+IDMpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBGb3IgSFQsIERvbid0IHVzZSBhIGJp dCByYXRlIHRoYXQgaXMgbXVjaCBtb3JlCisJCSAqIGxvc3N5IHRoYW4gdGhlIGJlc3QuCisJCSAq CisJCSAqIFhYWCB0aGlzIGlzbid0IG9wdGltYWw7IGl0J3MganVzdCBkZXNpZ25lZCB0bworCQkg KiBlbGltaW5hdGUgcmF0ZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgb2J2aW91c2x5CisJCSAqIHdv cnNlLgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSB7CisJ CQlpZiAoYmVzdF9yYXRlX3BjdCA+IChwY3QgKyA1MCkpCisJCQkJY29udGludWU7CisJCX0KKwor CQkvKgorCQkgKiBGb3Igbm9uLU1DUyByYXRlcywgdXNlIHRoZSBjdXJyZW50IGF2ZXJhZ2UgdHh0 aW1lIGZvcgorCQkgKiBjb21wYXJpc29uLgorCQkgKi8KKwkJaWYgKCEgKG5pLT5uaV9mbGFncyAm IElFRUU4MDIxMV9OT0RFX0hUKSkgeworCQkJaWYgKGJlc3RfcmF0ZV90dCA9PSAwIHx8IHR0IDw9 IGJlc3RfcmF0ZV90dCkgeworCQkJCWJlc3RfcmF0ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9y aXggPSByaXg7CisJCQkJYmVzdF9yYXRlX3BjdCA9IHBjdDsKKwkJCX0KKwkJfQorCisJCS8qCisJ CSAqIFNpbmNlIDIgc3RyZWFtIHJhdGVzIGhhdmUgc2xpZ2h0bHkgaGlnaGVyIFRYIHRpbWVzLAor CQkgKiBhbGxvdyBhIGxpdHRsZSBiaXQgb2YgbGVld2F5LiBUaGlzIHNob3VsZCBsYXRlcgorCQkg KiBiZSBhYnN0cmFjdGVkIG91dCBhbmQgcHJvcGVybHkgaGFuZGxlZC4KKwkJICovCisJCWlmIChu aS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgeworCQkJaWYgKGJlc3RfcmF0ZV90dCA9 PSAwIHx8ICh0dCAqIDggPD0gYmVzdF9yYXRlX3R0ICogMTApKSB7CisJCQkJYmVzdF9yYXRlX3R0 ID0gdHQ7CisJCQkJYmVzdF9yYXRlX3JpeCA9IHJpeDsKKwkJCQliZXN0X3JhdGVfcGN0ID0gcGN0 OworCQkJfQorCQl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiZXN0X3JhdGVfdHQgPyBi ZXN0X3JhdGVfcml4IDogLTEpOworfQorCisvKgorICogUGljayBhIGdvb2QgInJhbmRvbSIgYml0 LXJhdGUgdG8gc2FtcGxlIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lLgorICovCitzdGF0aWMg X19pbmxpbmUgaW50CitwaWNrX3NhbXBsZV9yYXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqbmksIGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwgCisJaW50IHNpemVfYmluKQor eworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0uZG90MTFSYXRlICYgSUVFRTgw MjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSB8 IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4g PSBuaS0+bmlfcmN0bHM7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHNhbi0+ c2FuX3NhbXBsZTsKKwlpbnQgY3VycmVudF9yaXgsIHJpeDsKKwl1bnNpZ25lZCBjdXJyZW50X3R0 OworCXVpbnQ2NF90IG1hc2s7CisJCisJY3VycmVudF9yaXggPSBzYW4tPmN1cnJlbnRfcml4W3Np emVfYmluXTsKKwlpZiAoY3VycmVudF9yaXggPCAwKSB7CisJCS8qIG5vIHN1Y2Nlc3NlcyB5ZXQs IHNlbmQgYXQgdGhlIGxvd2VzdCBiaXQtcmF0ZSAqLworCQkvKiBYWFggc2hvdWxkIHJldHVybiBN Q1MwIGlmIEhUICovCisJCXJldHVybiAwOworCX0KKworCWN1cnJlbnRfdHQgPSBzYW4tPnN0YXRz W3NpemVfYmluXVtjdXJyZW50X3JpeF0uYXZlcmFnZV90eF90aW1lOworCisJcml4ID0gc2FuLT5s YXN0X3NhbXBsZV9yaXhbc2l6ZV9iaW5dKzE7CS8qIG5leHQgc2FtcGxlIHJhdGUgKi8KKwltYXNr ID0gc2FuLT5yYXRlbWFzayAmfiAoKHVpbnQ2NF90KSAxPDxjdXJyZW50X3JpeCk7LyogZG9uJ3Qg c2FtcGxlIGN1cnJlbnQgcmF0ZSAqLworCXdoaWxlIChtYXNrICE9IDApIHsKKwkJaWYgKChtYXNr ICYgKCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkgewkvKiBub3QgYSBzdXBwb3J0ZWQgcmF0ZSAq LworCW5leHRyYXRlOgorCQkJaWYgKCsrcml4ID49IHJ0LT5yYXRlQ291bnQpCisJCQkJcml4ID0g MDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlIGZvbGxvd2luZyBjb2RlIHN0 b3BzIHRyeWluZyB0byBzYW1wbGUKKwkJICogbm9uLU1DUyByYXRlcyB3aGVuIHNwZWFraW5nIHRv IGFuIE1DUyBub2RlLgorCQkgKiBIb3dldmVyLCBhdCBsZWFzdCBmb3IgQ0NLIHJhdGVzIGluIDIu NEdIeiBtb2RlLAorCQkgKiB0aGUgbm9uLU1DUyByYXRlcyBNQVkgYWN0dWFsbHkgcHJvdmlkZSBi ZXR0ZXIKKwkJICogUEVSIGF0IHRoZSB2ZXJ5IGZhciBlZGdlIG9mIHJlY2VwdGlvbi4KKwkJICoK KwkJICogSG93ZXZlciEgVW50aWwgYXRoX3JhdGVfZm9ybV9hZ2dyKCkgZ3Jvd3MKKwkJICogc29t ZSBsb2dpYyB0byBub3QgZm9ybSBhZ2dyZWdhdGVzIGlmIHRoZQorCQkgKiBzZWxlY3RlZCByYXRl IGlzIG5vbi1NQ1MsIHRoaXMgd29uJ3Qgd29yay4KKwkJICoKKwkJICogU28gZG9uJ3QgZGlzYWJs ZSB0aGlzIGNvZGUgdW50aWwgeW91J3ZlIHRhdWdodAorCQkgKiBhdGhfcmF0ZV9mb3JtX2FnZ3Io KSB0byBkcm9wIG91dCBpZiBhbnkgb2YKKwkJICogdGhlIHNlbGVjdGVkIHJhdGVzIGFyZSBub24t TUNTLgorCQkgKi8KKyNpZiAxCisJCS8qIGlmIHRoZSBub2RlIGlzIEhUIGFuZCB0aGUgcmF0ZSBp c24ndCBIVCwgZG9uJ3QgYm90aGVyIHNhbXBsZSAqLworCQlpZiAoKG5pLT5uaV9mbGFncyAmIElF RUU4MDIxMV9OT0RFX0hUKSAmJgorCQkgICAgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9IElFRUU4MDIx MV9UX0hUKSkgeworCQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCWdvdG8gbmV4 dHJhdGU7CisJCX0KKyNlbmRpZgorCisJCS8qIHRoaXMgYml0LXJhdGUgaXMgYWx3YXlzIHdvcnNl IHRoYW4gdGhlIGN1cnJlbnQgb25lICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhd LnBlcmZlY3RfdHhfdGltZSA+IGN1cnJlbnRfdHQpIHsKKwkJCW1hc2sgJj0gfigodWludDY0X3Qp IDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisKKwkJLyogcmFyZWx5IHNhbXBsZSBi aXQtcmF0ZXMgdGhhdCBmYWlsIGEgbG90ICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPiBzYW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9m YWlsdXJlcyAmJgorCQkgICAgdGlja3MgLSBzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLmxhc3Rf dHggPCBzYW1wbGUtPnNhbXBsZV9zdGFsZV9mYWlsdXJlX3RpbWVvdXQpIHsKKwkJCW1hc2sgJj0g figodWludDY0X3QpIDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisKKwkJLyoKKwkJ ICogRm9yIEhULCBvbmx5IHNhbXBsZSBhIGZldyByYXRlcyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUK KwkJICogY3VycmVudCByaXg7IHRoZXJlJ3MgcXVpdGUgbGlrZWx5IGEgbG90IG9mIHRoZW0uCisJ CSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsKKwkJCWlmIChy aXggPCAoY3VycmVudF9yaXggLSAzKSB8fAorCQkJICAgIHJpeCA+IChjdXJyZW50X3JpeCArIDMp KSB7CisJCQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCQlnb3RvIG5leHRyYXRl OworCQkJfQorCQl9CisKKwkJLyogRG9uJ3Qgc2FtcGxlIG1vcmUgdGhhbiAyIHJhdGVzIGhpZ2hl ciBmb3IgcmF0ZXMgPiAxMU0gZm9yIG5vbi1IVCByYXRlcyAqLworCQlpZiAoISAobmktPm5pX2Zs YWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlpZiAoRE9UMTFSQVRFKHJpeCkgPiAyKjEx ICYmIHJpeCA+IGN1cnJlbnRfcml4ICsgMikgeworCQkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8 PHJpeCk7CisJCQkJZ290byBuZXh0cmF0ZTsKKwkJCX0KKwkJfQorCisJCXNhbi0+bGFzdF9zYW1w bGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJcmV0dXJuIHJpeDsKKwl9CisJcmV0dXJuIGN1cnJl bnRfcml4OworI3VuZGVmIERPVDExUkFURQorI3VuZGVmIE1DUworfQorCitzdGF0aWMgaW50Citz YW1wbGVfZ2V0X3N0YXRpY19yaXgoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sK KyNkZWZpbmUJUkFURShfaXgpCShuaS0+bmlfcmF0ZXMucnNfcmF0ZXNbKF9peCldICYgSUVFRTgw MjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoX2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNb X2l4XSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBu aS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVl ODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwljb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX3R4cGFyYW0gKnRwID0gbmktPm5pX3R4cGFybXM7CisJaW50IHNyYXRlOwor CisJLyogQ2hlY2sgTUNTIHJhdGVzICovCisJZm9yIChzcmF0ZSA9IG5pLT5uaV9odHJhdGVzLnJz X25yYXRlcyAtIDE7IHNyYXRlID49IDA7IHNyYXRlLS0pIHsKKwkJaWYgKE1DUyhzcmF0ZSkgPT0g dHAtPnVjYXN0cmF0ZSkKKwkJCXJldHVybiBydC0+cmF0ZUNvZGVUb0luZGV4W3RwLT51Y2FzdHJh dGVdOworCX0KKworCS8qIENoZWNrIGxlZ2FjeSByYXRlcyAqLworCWZvciAoc3JhdGUgPSBuaS0+ bmlfcmF0ZXMucnNfbnJhdGVzIC0gMTsgc3JhdGUgPj0gMDsgc3JhdGUtLSkgeworCQlpZiAoUkFU RShzcmF0ZSkgPT0gdHAtPnVjYXN0cmF0ZSkKKwkJCXJldHVybiBydC0+cmF0ZUNvZGVUb0luZGV4 W3RwLT51Y2FzdHJhdGVdOworCX0KKwlyZXR1cm4gLTE7CisjdW5kZWYJUkFURQorI3VuZGVmCU1D UworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3VwZGF0ZV9zdGF0aWNfcml4KHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqbmkpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0g bmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhwYXJhbSAqdHAgPSBuaS0+ bmlfdHhwYXJtczsKKworCWlmICh0cCAhPSBOVUxMICYmIHRwLT51Y2FzdHJhdGUgIT0gSUVFRTgw MjExX0ZJWEVEX1JBVEVfTk9ORSkgeworCQkvKgorCQkgKiBBIGZpeGVkIHJhdGUgaXMgdG8gYmUg dXNlZDsgdWNhc3RyYXRlIGlzIHRoZSBJRUVFIGNvZGUKKwkJICogZm9yIHRoaXMgcmF0ZSAoc2Fu cyBiYXNpYyBiaXQpLiAgQ2hlY2sgdGhpcyBhZ2FpbnN0IHRoZQorCQkgKiBuZWdvdGlhdGVkIHJh dGUgc2V0IGZvciB0aGUgbm9kZS4gIE5vdGUgdGhlIGZpeGVkIHJhdGUKKwkJICogbWF5IG5vdCBi ZSBhdmFpbGFibGUgZm9yIHZhcmlvdXMgcmVhc29ucyBzbyB3ZSBvbmx5CisJCSAqIHNldHVwIHRo ZSBzdGF0aWMgcmF0ZSBpbmRleCBpZiB0aGUgbG9va3VwIGlzIHN1Y2Nlc3NmdWwuCisJCSAqLwor CQlzYW4tPnN0YXRpY19yaXggPSBzYW1wbGVfZ2V0X3N0YXRpY19yaXgobmkpOworCX0gZWxzZSB7 CisJCXNhbi0+c3RhdGljX3JpeCA9IC0xOworCX0KK30KKworLyoKKyAqIFBpY2sgYSBub24tSFQg cmF0ZSB0byBiZWdpbiB1c2luZy4KKyAqLworc3RhdGljIGludAorc2FtcGxlX3BpY2tfc2VlZF9y YXRlX2xlZ2FjeShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgZnJhbWVMZW4p Cit7CisjZGVmaW5lCURPVDExUkFURShpeCkJKHJ0LT5pbmZvW2l4XS5kb3QxMVJhdGUgJiBJRUVF ODAyMTFfUkFURV9WQUwpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsK KwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29u c3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRh YmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWNvbnN0IGludCBzaXplX2JpbiA9IHNp emVfdG9fYmluKGZyYW1lTGVuKTsKKwlpbnQgcml4ID0gLTE7CisKKwkvKiBubyBwYWNrZXQgaGFz IGJlZW4gc2VudCBzdWNjZXNzZnVsbHkgeWV0ICovCisJZm9yIChyaXggPSBydC0+cmF0ZUNvdW50 LTE7IHJpeCA+IDA7IHJpeC0tKSB7CisJCWlmICgoc2FuLT5yYXRlbWFzayAmICgodWludDY0X3Qp IDE8PHJpeCkpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIEhUIHJhdGVzICovCisJ CWlmIChydC0+aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCkKKwkJCWNvbnRpbnVlOwor CisJCS8qCisJCSAqIFBpY2sgdGhlIGhpZ2hlc3QgcmF0ZSA8PSAzNiBNYnBzCisJCSAqIHRoYXQg aGFzbid0IGZhaWxlZC4KKwkJICovCisJCWlmIChET1QxMVJBVEUocml4KSA8PSA3MiAmJgorCQkg ICAgc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID09IDApIHsK KwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCit9CisK Ky8qCisgKiBQaWNrIGEgSFQgcmF0ZSB0byBiZWdpbiB1c2luZy4KKyAqCisgKiBEb24ndCB1c2Ug YW55IG5vbi1IVCByYXRlczsgb25seSBjb25zaWRlciBIVCByYXRlcy4KKyAqLworc3RhdGljIGlu dAorc2FtcGxlX3BpY2tfc2VlZF9yYXRlX2h0KGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq bmksIGludCBmcmFtZUxlbikKK3sKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0LT5pbmZvW2l4XS5kb3Qx MVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0g bmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlf cmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIx MV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWNvbnN0IGludCBz aXplX2JpbiA9IHNpemVfdG9fYmluKGZyYW1lTGVuKTsKKwlpbnQgcml4ID0gLTEsIGh0X3JpeCA9 IC0xOworCisJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAqLwor CWZvciAocml4ID0gcnQtPnJhdGVDb3VudC0xOyByaXggPiAwOyByaXgtLSkgeworCQkvKiBTa2lw IHJhdGVzIHdlIGNhbid0IHVzZSAqLworCQlpZiAoKHNhbi0+cmF0ZW1hc2sgJiAoKHVpbnQ2NF90 KSAxPDxyaXgpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogS2VlcCBhIGNvcHkgb2YgdGhl IGxhc3Qgc2VlbiBIVCByYXRlIGluZGV4ICovCisJCWlmIChydC0+aW5mb1tyaXhdLnBoeSA9PSBJ RUVFODAyMTFfVF9IVCkKKwkJCWh0X3JpeCA9IHJpeDsKKworCQkvKiBTa2lwIG5vbi1IVCByYXRl cyAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkgIT0gSUVFRTgwMjExX1RfSFQpCisJCQljb250 aW51ZTsKKworCQkvKgorCQkgKiBQaWNrIGEgbWVkaXVtLXNwZWVkIHJhdGUgcmVnYXJkbGVzcyBv ZiBzdHJlYW0gY291bnQKKwkJICogd2hpY2ggaGFzIG5vdCBzZWVuIGFueSBmYWlsdXJlcy4gSGln aGVyIHJhdGVzIG1heSBmYWlsOworCQkgKiB3ZSdsbCB0cnkgdGhlbSBsYXRlci4KKwkJICovCisJ CWlmICgoKE1DUyhyaXgpICYgMHg3KSA8PSA0KSAmJgorCQkgICAgc2FuLT5zdGF0c1tzaXplX2Jp bl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQor CisJLyoKKwkgKiBJZiBhbGwgdGhlIE1DUyByYXRlcyBoYXZlIHN1Y2Nlc3NpdmUgZmFpbHVyZXMs IHJpeCBzaG91bGQgYmUKKwkgKiA+IDA7IG90aGVyd2lzZSB1c2UgdGhlIGxvd2VzdCBNQ1Mgcml4 IChob3BlZnVsbHkgTUNTIDAuKQorCSAqLworCXJldHVybiBNQVgocml4LCBodF9yaXgpOworI3Vu ZGVmIE1DUworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICoKK3Nh bXBsZV9nZXRfcmF0ZXNldChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWNv bnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqcnMgPSBOVUxMOworCS8qIDExbiBvciBub3Q/ IFBpY2sgdGhlIHJpZ2h0IHJhdGVzZXQgKi8KKwlpZiAoc2FtcGxlX25vZGVfaXNfMTFuKG5pKSkg eworCQkvKiBYWFggZXcgKi8KKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjEx X01TR19SQVRFQ1RMLCBuaSwKKwkJICAgICIlczogMTFuIG5vZGUiLCBfX2Z1bmNfXyk7CisJCXJz ID0gKHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqKSAmbmktPm5pX2h0cmF0ZXM7CisJfSBlbHNl IHsKKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RMLCBu aSwKKwkJICAgICIlczogbm9uLTExbiBub2RlIiwgX19mdW5jX18pOworCQlycyA9ICZuaS0+bmlf cmF0ZXM7CisJfQorCXJldHVybiByczsKK30KKworc3RhdGljIGludAorc2FtcGxlX3JhdGUoc3Ry dWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdm9pZCAqYXJnIF9fdW51c2VkLCB1aW50MzJfdCBpYXJn IF9fdW51c2VkKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0uZG90MTFS YXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmluZm9baXhd LmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKyNkZWZpbmUJUkFURShpeCkJKERPVDEx UkFURShpeCkgLyAyKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJ c3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJY29uc3Qgc3Ry dWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZh cC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWludCByaXgsIG1yciwgYmVzdF9yaXgsIGNoYW5n ZV9yYXRlczsKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJCisJc2l6ZV90IGZyYW1lTGVu ID0gKHNpemVfdClpYXJnOworCWNvbnN0IGludCBzaXplX2JpbiA9IHNpemVfdG9fYmluKGZyYW1l TGVuKTsKKworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwlpZiAoc2FuLT5zdGF0 aWNfcml4ICE9IC0xKSB7CisJCXJpeCA9IHNhbi0+c3RhdGljX3JpeDsKKwkJZ290byBkb25lOwor CX0KKworCWlmICh2YXAtPml2X3JhdGUtPmlyX2NhcGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRF Q1RMX0NBUF9NUlIpCisJCW1yciA9IDE7CisJaWYgKCEodmFwLT5pdl9yYXRlLT5pcl9jYXBhYmls aXRpZXMgJiBJRUVFODAyMTFfUkFURUNUTF9DQVBfTVJSUFJPVCkpCisJCW1yciA9IDA7CisKKwli ZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFtcnIpOworCWlmIChi ZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3RhdHNbc2l6ZV9iaW5d W2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZlcmFnZV90eF90aW1l ID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmluZyB0aGUgcGVyZm9y bWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUgb2YgdGhlIHRvdGFs IHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90dFtzaXplX2Jpbl0g PCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0g KgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlja19zYW1wbGVfcmF0 ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJRUVFODAyMTFfTVNH X1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBzaXplICV1IHNhbXBs ZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZlcmFnZV90eF90aW1l LAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBiaW5fdG9fc2l6ZShz aXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAgIGRvdDExcmF0ZV9s YWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9yaXhbc2l6 ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVudF9yaXhbc2l6 ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pIHsKKwkJ CXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJfSBlbHNlIHsKKwkJ CXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9CisJCXNhbi0+cGFj a2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2UgeworCQljaGFuZ2VfcmF0 ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8fCBiZXN0X3JpeCA9 PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAq LworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFf Tk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChuaSwgZnJh bWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tfc2VlZF9yYXRlX2xl Z2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0c19zZW50W3NpemVf YmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBxdWlja2x5IGR1cmlu ZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCSAg ICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3aXRjaGluZyBxdWlj a2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9IGVsc2UgaWYgKHRp Y2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nfc2luY2Vfc3dpdGNo W3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUgZ29uZSBieSAqLwor CQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgJm5p LAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3aXRjaCAlZC4uIiwK KwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5fc3dpdGNoLCBzYW4t PnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJ fSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSAmJgorCQkg ICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJyZW50 X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRoZSBjdXJyZW50IGJp dC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJCQlJRUVFODAyMTFf Tk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkgICAgIiVz OiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9fZnVuY19fLAorCQkJ ICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVu dF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdlX3JhdGVzID0gMTsK KwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlp bnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJaW50IGN1cl9hdHQg PSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCQkvKgor CQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1DUyByYXRlIGlzCisJ CQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGluIDIwJSBvZgorCQkJ ICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJCQkgKgorCQkJICog VGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJCQlwcmludGYoImN1 ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkgICAgTUNTKGN1cl9y aXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUpOworI2VuZGlmCisJ CQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkgICAgKGF2ZXJhZ2Vf dHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgwMjExX05PVEUodmFw LAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkgICAgIiVzOiBIVDog YmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1lICVkLCBjdXJfYXR0 ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3JpeCksIE1DUyhjdXJf cml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2VfcmF0ZXMgPSAxOwor CQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0rKzsKKwkJ CisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBzYW4tPmN1cnJlbnRf cml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCQkgICAgSUVFRTgw MjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQgc3dpdGNoIHJhdGUg JWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJyICVkIiwKKwkJCQkg ICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwKKwkJCQkgICAgUkFU RShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9i aW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUsCisJCQkJICAg IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5wZXJmZWN0 X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBzYW4tPnN0YXRzW3Np emVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBzYW4tPnN0YXRzW3Np emVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBzYW4tPnBhY2tldHNf c2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0KKwkJCXNhbi0+cGFj a2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3VycmVudF9yaXhbc2l6 ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0g PSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0ZSBmb3IgdGhpcyBu b2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0LCBiZXN0X3JpeCk7 CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJCXNhbi0+cGFja2V0 c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0gbXJyID8gc2FuLT5z Y2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJICogVGhpcyBidWcg dG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICogRm9yIG5vdyB0aG91 Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3VyZQorCSAqIG91dCBo b3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwgMCB8fCByaXggPj0g cnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVkIG91dCBvZiBib3Vu ZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAgIHJpeCwKKwkJICAg IHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3QgZGVmYXVsdCBmb3Ig bm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJhdGVDb3VudCwgKCJy aXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0eHJhdGUgPSBydC0+ aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBydC0+aW5mb1tyaXhd LnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXplX2Jpbl0rKzsKKwor CXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisjdW5kZWYgUkFURQor fQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmks IHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjEx X3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCByaXgwID0gc2FtcGxl X3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZCA9ICZz YW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVzICpyYyA9IHJjX2lu Zm8tPnJpX3JjOworCisJS0FTU0VSVChyaXgwID09IHNjaGVkLT5yMCwgKCJyaXgwICgleCkgIT0g c2NoZWQtPnIwICgleCkhXG4iLAorCSAgICByaXgwLCBzY2hlZC0+cjApKTsKKwkvKiBYWFggKi8K KwlyY1swXS5mbGFncyA9IHJjWzFdLmZsYWdzID0gcmNbMl0uZmxhZ3MgPSByY1szXS5mbGFncyA9 IDA7CisKKwlyY1swXS5yaXggPSBzY2hlZC0+cjA7CisJcmNbMV0ucml4ID0gc2NoZWQtPnIxOwor CXJjWzJdLnJpeCA9IHNjaGVkLT5yMjsKKwlyY1szXS5yaXggPSBzY2hlZC0+cjM7CisKKwlyY1sw XS50cmllcyA9IHNjaGVkLT50MDsKKwlyY1sxXS50cmllcyA9IHNjaGVkLT50MTsKKwlyY1syXS50 cmllcyA9IHNjaGVkLT50MjsKKwlyY1szXS50cmllcyA9IHNjaGVkLT50MzsKK30KKworc3RhdGlj IHZvaWQKK3VwZGF0ZV9zdGF0cyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAg CSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJICBpbnQgZnJhbWVfc2l6ZSwK KwkJICBpbnQgcml4MCwgaW50IHRyaWVzMCwKKwkJICBpbnQgcml4MSwgaW50IHRyaWVzMSwKKwkJ ICBpbnQgcml4MiwgaW50IHRyaWVzMiwKKwkJICBpbnQgcml4MywgaW50IHRyaWVzMywKKwkJICBp bnQgc2hvcnRfdHJpZXMsIGludCB0cmllcywKKwkJICBpbnQgbmZyYW1lcywgaW50IG5iYWQpCit7 CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0 cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisKKwljb25z dCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZV9zaXplKTsKKwljb25zdCBpbnQgc2l6 ZSA9IGJpbl90b19zaXplKHNpemVfYmluKTsKKworCWludCBpc19odDQwID0gaWVlZTgwMjExX3Jh dGVjdGxfaGFzY2FwX2N3NDAodmFwLCBuaSk7CisJaW50IHR0LCB0cmllc19zb19mYXI7CisJaW50 IHBjdDsKKworCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MCkpCisJCXJldHVybjsKKwl0 dCA9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgwLCBzaG9ydF90cmll cywKKwkJTUlOKHRyaWVzMCwgdHJpZXMpIC0gMSwgaXNfaHQ0MCk7CisJdHJpZXNfc29fZmFyID0g dHJpZXMwOworCisJaWYgKHRyaWVzMSAmJiB0cmllc19zb19mYXIgPCB0cmllcykgeworCQlpZiAo IUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDEpKQorCQkJcmV0dXJuOworCQl0dCArPSBjYWxjX3Vz ZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MSwgc2hvcnRfdHJpZXMsCisJCQlNSU4o dHJpZXMxICsgdHJpZXNfc29fZmFyLCB0cmllcykgLSB0cmllc19zb19mYXIgLSAxLCBpc19odDQw KTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVzMTsKKwl9CisKKwlpZiAodHJpZXMyICYmIHRyaWVz X3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MikpCisJ CQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCBy aXgyLCBzaG9ydF90cmllcywKKwkJCU1JTih0cmllczIgKyB0cmllc19zb19mYXIsIHRyaWVzKSAt IHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDApOworCQl0cmllc19zb19mYXIgKz0gdHJpZXMyOwor CX0KKworCWlmICh0cmllczMgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsKKwkJaWYgKCFJU19S QVRFX0RFRklORUQoc2FuLCByaXgzKSkKKwkJCXJldHVybjsKKwkJdHQgKz0gY2FsY191c2Vjc191 bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDMsIHNob3J0X3RyaWVzLAorCQkJTUlOKHRyaWVz MyArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwgaXNfaHQ0MCk7CisJ fQorCisJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3BhY2tldHMgPCBzYW1w bGUtPnNhbnBsZV9zbW9vdGhpbmdfbWlucGFja2V0cykgeworCQkvKiBqdXN0IGF2ZXJhZ2UgdGhl IGZpcnN0IGZldyBwYWNrZXRzICovCisJCWludCBhdmdfdHggPSBzYW4tPnN0YXRzW3NpemVfYmlu XVtyaXgwXS5hdmVyYWdlX3R4X3RpbWU7CisJCWludCBwYWNrZXRzID0gc2FuLT5zdGF0c1tzaXpl X2Jpbl1bcml4MF0udG90YWxfcGFja2V0czsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0u YXZlcmFnZV90eF90aW1lID0gKHR0KyhhdmdfdHgqcGFja2V0cykpLyhwYWNrZXRzK25mcmFtZXMp OworCX0gZWxzZSB7CisJCS8qIHVzZSBhIGV3bWEgKi8KKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b cml4MF0uYXZlcmFnZV90eF90aW1lID0gCisJCQkoKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBd LmF2ZXJhZ2VfdHhfdGltZSAqIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19yYXRlKSArIAorCQkJ ICh0dCAqICgxMDAgLSBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkpKSAvIDEwMDsKKwl9 CisJCisJLyoKKwkgKiBYWFggRG9uJ3QgbWFyayB0aGUgaGlnaGVyIGJpdCByYXRlcyBhcyBhbHNv IGhhdmluZyBmYWlsZWQ7IGFzIHRoaXMKKwkgKiB1bmZvcnR1bmF0ZWx5IHN0b3BzIHRob3NlIHJh dGVzIGZyb20gYmVpbmcgdGFzdGVkIHdoZW4gdHJ5aW5nIHRvCisJICogVFguIFRoaXMgaGFwcGVu cyB3aXRoIDExbiBhZ2dyZWdhdGlvbi4KKwkgKi8KKwlpZiAobmZyYW1lcyA9PSBuYmFkKSB7CisJ CXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgKz0gbmJhZDsK KworCX0gZWxzZSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnBhY2tldHNfYWNrZWQg Kz0gKG5mcmFtZXMgLSBuYmFkKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uc3VjY2Vz c2l2ZV9mYWlsdXJlcyA9IDA7CisJfQorCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRyaWVz ICs9IHRyaWVzOworCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmxhc3RfdHggPSB0aWNrczsK KwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzICs9IG5mcmFtZXM7CisK KwkvKiB1cGRhdGUgRVdNQSBmb3IgdGhpcyByaXggKi8KKworCS8qIENhbGN1bGF0ZSBwZXJjZW50 YWdlIGJhc2VkIG9uIGN1cnJlbnQgcmF0ZSAqLworCWlmIChuZnJhbWVzID09IDApCisJCW5mcmFt ZXMgPSBuYmFkID0gMTsKKwlwY3QgPSAoKG5mcmFtZXMgLSBuYmFkKSAqIDEwMDApIC8gbmZyYW1l czsKKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzIDwKKwkg ICAgc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJLyoganVzdCBhdmVy YWdlIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYV9wY3QgPSAoc2FuLT5zdGF0c1tz aXplX2Jpbl1bcml4MF0ucGFja2V0c19hY2tlZCAqIDEwMDApIC8KKwkJICAgIChzYW4tPnN0YXRz W3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b cml4MF0uZXdtYV9wY3QgPSBhX3BjdDsKKwl9IGVsc2UgeworCQkvKiB1c2UgYSBld21hICovCisJ CXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ID0KKwkJCSgoc2FuLT5zdGF0c1tz aXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgKiBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkg KworCQkJIChwY3QgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX3JhdGUpKSkgLyAx MDA7CisJfQorCisJaWYgKHJpeDAgPT0gc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbc2l6ZV9iaW5d KSB7CisJCXNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSA9IHR0OworCQlzYW4tPmN1cnJlbnRfc2Ft cGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfdHhf Y29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorICAgIGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBvaywKKyAgICB2b2lkICphcmcxLCB2b2lkICphcmcy KQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsK Kwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9y YXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisKKwkvKiBYWFggbmVlZCB0byBjaGFu Z2UgYXJnMiB0byBwb2ludGVyIG9mIGllZWU4MDIxMV9yY19pbmZvICovCisJc3RydWN0IGllZWU4 MDIxMV9yY19pbmZvICpyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyopYXJnMjsK KworCWludCBmaW5hbF9yaXgsIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzOworCWludCBuZnJhbWVz LCBuYmFkOworCWludCBmcmFtZV9zaXplLCBtcnI7CisKKwlmaW5hbF9yaXggPSBydC0+cmF0ZUNv ZGVUb0luZGV4W3JjX2luZm8tPnJpX3R4cmF0ZV07CisJc2hvcnRfdHJpZXMgPSByY19pbmZvLT5y aV9zaG9ydHJldHJ5OworCS8qIFhYWCB3aHkgcGx1cyAxIGhlcmU/ICovCisJbG9uZ190cmllcyA9 IHJjX2luZm8tPnJpX2xvbmdyZXRyeSArIDE7CisKKwluZnJhbWVzID0gcmNfaW5mby0+cmlfdHhj bnQ7CisJbmJhZCA9IHJjX2luZm8tPnJpX2ZhaWxjbnQ7CisKKwlmcmFtZV9zaXplID0gcmNfaW5m by0+cmlfZnJhbWVsZW47CisJbXJyID0gMDsKKworCWlmIChuZnJhbWVzID09IDApIHsKKwkJcmV0 dXJuOworCX0KKworCWlmIChmcmFtZV9zaXplID09IDApCQkgICAgLyogTkI6IHNob3VsZCBub3Qg aGFwcGVuICovCisJCWZyYW1lX3NpemUgPSAxNTAwOworCisJaWYgKHNhbi0+cmF0ZW1hc2sgPT0g MCkgeworCQlyZXR1cm47CisJfQorCQorCWlmICh2YXAtPml2X3JhdGUtPmlyX2NhcGFiaWxpdGll cyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlIpCisJCW1yciA9IDE7CisJLyogWFhYIGNoZWNr IEhUIHByb3Rtb2RlIHRvbyAqLworCWlmIChtcnIgJiYgISh2YXAtPml2X3JhdGUtPmlyX2NhcGFi aWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9UKSkKKwkJbXJyID0gMDsKKwor CWlmICghbXJyIHx8IHJjX2luZm8tPnJpX2ZpbmFsdHNpID09IDApIHsKKwkJaWYgKCFJU19SQVRF X0RFRklORUQoc2FuLCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICog T25seSBvbmUgcmF0ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4KKwkJICovCisJCXVwZGF0ZV9z dGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmluYWxfcml4LCBsb25nX3RyaWVz LAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICBz aG9ydF90cmllcywgbG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisKKwl9IGVs c2UgeworCQlpbnQgZmluYWxUU0lkeCA9IHJjX2luZm8tPnJpX2ZpbmFsdHNpOworCQlpbnQgaTsK KworCQkvKgorCQkgKiBOQjogc2VyaWVzID4gMCBhcmUgbm90IHBlbmFsaXplZCBmb3IgZmFpbHVy ZQorCQkgKiBiYXNlZCBvbiB0aGUgdHJ5IGNvdW50cyB1bmRlciB0aGUgYXNzdW1wdGlvbgorCQkg KiB0aGF0IGxvc3NlcyBhcmUgb2Z0ZW4gYnVyc3R5IGFuZCBzaW5jZSB3ZQorCQkgKiBzYW1wbGUg aGlnaGVyIHJhdGVzIDEgdHJ5IGF0IGEgdGltZSBkb2luZyBzbworCQkgKiBtYXkgdW5mYWlybHkg cGVuYWxpemUgdGhlbS4KKwkJICovCisJCWlmIChyY1swXS50cmllcykgeworCQkJdXBkYXRlX3N0 YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1swXS5yaXgsIHJjWzBdLnRyaWVz LAorCQkJCSAgICAgcmNbMV0ucml4LCByY1sxXS50cmllcywKKwkJCQkgICAgIHJjWzJdLnJpeCwg cmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNdLnRyaWVzLAorCQkJCSAgICAg c2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJhbWVzLCBuYmFkKTsKKwkJCWxv bmdfdHJpZXMgLT0gcmNbMF0udHJpZXM7CisJCX0KKwkJCisJCWlmIChyY1sxXS50cmllcyAmJiBm aW5hbFRTSWR4ID4gMCkgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJ CQkJICAgICByY1sxXS5yaXgsIHJjWzFdLnRyaWVzLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1sy XS50cmllcywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAw LAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJhbWVzLCBu YmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMV0udHJpZXM7CisJCX0KKworCQlpZiAocmNbMl0u dHJpZXMgJiYgZmluYWxUU0lkeCA+IDEpIHsKKwkJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFt ZV9zaXplLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1syXS50cmllcywKKwkJCQkgICAgIHJjWzNd LnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAgICAgMCwgMCwKKwkJCQkg ICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisJ CQlsb25nX3RyaWVzIC09IHJjWzJdLnRyaWVzOworCQl9CisKKwkJaWYgKHJjWzNdLnRyaWVzICYm IGZpbmFsVFNJZHggPiAyKSB7CisJCQl1cGRhdGVfc3RhdHModmFwLCBuaSwgZnJhbWVfc2l6ZSwK KwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAg ICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9ydF90cmllcywgbG9uZ190cmll cywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAor c2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIGNvbnN0IHN0 cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisgICAgdm9pZCAqYXJnMSwgdm9pZCAqYXJnMiwgdm9p ZCAqYXJnMykKK3sKKwkvKiBub3RoaW5nIGhlcmUuICovCit9CisKK3N0YXRpYyB2b2lkCitzYW1w bGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCBpbnQgbXNlY3Mp Cit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJaW50 IHQ7CisKKwlpZiAobXNlY3MgPCAxMDApCisJCW1zZWNzID0gMTAwOworCXQgPSBtc2Vjc190b190 aWNrcyhtc2Vjcyk7CisJLyogaWVlZTgwMjExX3NhbXBsZSBkb2Vzbid0IGhhdmUgdGhlIHNhbXBs ZV9pbnRlcnZhbCBmaWVsZCBieSBub3cgKi8KKwkvLyBzYW1wbGUtPnNhbXBsZV9pbnRlcnZhbCA9 ICh0IDwgMSkgPyAxIDogdDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9zdGF0cyh2b2lkICph cmcsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJc3RydWN0IGllZWU4MDIxMXZhcCAq dmFwID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBu aS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGll ZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCXVpbnQ2NF90 IG1hc2s7CisJaW50IHJpeCwgeTsKKworCXByaW50ZigiXG5bJXNdIHJlZmNudCAlZCBzdGF0aWNf cml4ICglZCAlcykgcmF0ZW1hc2sgMHglanhcbiIsCisJICAgIGV0aGVyX3NwcmludGYobmktPm5p X21hY2FkZHIpLCBpZWVlODAyMTFfbm9kZV9yZWZjbnQobmkpLAorCSAgICBkb3QxMXJhdGUocnQs IHNhbi0+c3RhdGljX3JpeCksCisJICAgIGRvdDExcmF0ZV9sYWJlbChydCwgc2FuLT5zdGF0aWNf cml4KSwKKwkgICAgKHVpbnRtYXhfdClzYW4tPnJhdGVtYXNrKTsKKwlmb3IgKHkgPSAwOyB5IDwg TlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlwcmludGYoIlslNHVdIGN1ciByaXggJWQg KCVkICVzKSBzaW5jZSBzd2l0Y2g6IHBhY2tldHMgJWQgdGlja3MgJXVcbiIsCisJCSAgICBiaW5f dG9fc2l6ZSh5KSwgc2FuLT5jdXJyZW50X3JpeFt5XSwKKwkJICAgIGRvdDExcmF0ZShydCwgc2Fu LT5jdXJyZW50X3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVu dF9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NpbmNlX3N3aXRjaFt5XSwgc2FuLT50aWNr c19zaW5jZV9zd2l0Y2hbeV0pOworCQlwcmludGYoIlslNHVdIGxhc3Qgc2FtcGxlICglZCAlcykg Y3VyIHNhbXBsZSAoJWQgJXMpIHBhY2tldHMgc2VudCAlZFxuIiwKKwkJICAgIGJpbl90b19zaXpl KHkpLAorCQkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSksCisJCSAg ICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+bGFzdF9zYW1wbGVfcml4W3ldKSwKKwkJICAgIGRv dDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgZG90MTFyYXRl X2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5XSksCisJCSAgICBzYW4tPnBhY2tl dHNfc2VudFt5XSk7CisJCXByaW50ZigiWyU0dV0gcGFja2V0cyBzaW5jZSBzYW1wbGUgJWQgc2Ft cGxlIHR0ICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNhbi0+cGFja2V0c19zaW5jZV9z YW1wbGVbeV0sCisJCSAgICBzYW4tPnNhbXBsZV90dFt5XSk7CisJfQorCWZvciAobWFzayA9IHNh bi0+cmF0ZW1hc2ssIHJpeCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSwgcml4KyspIHsKKwkJ aWYgKChtYXNrICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJZm9yICh5ID0gMDsgeSA8IE5V TV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJCWlmIChzYW4tPnN0YXRzW3ldW3JpeF0udG90 YWxfcGFja2V0cyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJbJTJ1ICVzOiU0dV0g JThqdTolLThqdSAoJTNkJSUpIChFV01BICUzZC4lMWQlJSkgVCAlOGp1IEYgJTRkIGF2ZyAlNXUg bGFzdCAldVxuIiwKKwkJCSAgICBkb3QxMXJhdGUocnQsIHJpeCksIGRvdDExcmF0ZV9sYWJlbChy dCwgcml4KSwKKwkJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJCSAgICAodWludG1heF90KSBzYW4t PnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cywKKwkJCSAgICAodWludG1heF90KSBzYW4tPnN0 YXRzW3ldW3JpeF0ucGFja2V0c19hY2tlZCwKKwkJCSAgICAoaW50KSAoKHNhbi0+c3RhdHNbeV1b cml4XS5wYWNrZXRzX2Fja2VkICogMTAwVUxMKSAvCisJCQkgICAgIHNhbi0+c3RhdHNbeV1bcml4 XS50b3RhbF9wYWNrZXRzKSwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgLyAx MCwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgJSAxMCwKKwkJCSAgICAodWlu dG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMsCisJCQkgICAgc2FuLT5zdGF0c1t5XVty aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMsCisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLmF2ZXJh Z2VfdHhfdGltZSwKKwkJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNbeV1bcml4XS5sYXN0X3R4KTsK KwkJfQorCX0KK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0bF9zdGF0cyhTWVNDVExfSEFO RExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGFyZzE7CisJc3RydWN0 IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2lmcC0+aWZfbDJjb207CisJaW50IGVycm9yLCB2 OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2ludChvaWRwLCAmdiwgMCwgcmVx KTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWVlZTgw MjExX2l0ZXJhdGVfbm9kZXMoJmljLT5pY19zdGEsIHNhbXBsZV9zdGF0cywgTlVMTCk7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxfc21vb3RoaW5nX3JhdGUoU1lT Q1RMX0hBTkRMRVJfQVJHUykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBhcmcxOwor CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCWludCByYXRl LCBlcnJvcjsKKworCXJhdGUgPSBzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0ZTsKKwllcnJv ciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCByZXEpOworCWlmIChlcnJvciB8 fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoISgwIDw9IHJhdGUgJiYgcmF0 ZSA8IDEwMCkpCisJCXJldHVybiBFSU5WQUw7CisJc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3Jh dGUgPSByYXRlOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19taW5wYWNrZXRzID0gMTAwIC8g KDEwMCAtIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzYW1wbGVfc3lzY3Rs X3NhbXBsZV9yYXRlKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJc3RydWN0IGllZWU4MDIxMXZh cCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gdmFwLT5p dl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwlyYXRlID0gc2FtcGxlLT5zYW1wbGVfcmF0ZTsK KwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCByZXEpOworCWlmIChl cnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoISgyIDw9IHJhdGUg JiYgcmF0ZSA8PSAxMDApKQorCQlyZXR1cm4gRUlOVkFMOworCXNhbXBsZS0+c2FtcGxlX3JhdGUg PSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3N5c2N0bGF0dGFj aChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgc3RydWN0IHN5c2N0bF9jdHhfbGlzdCAq Y3R4LCBzdHJ1Y3Qgc3lzY3RsX29pZCAqdHJlZSkKK3sKKwlTWVNDVExfQUREX1BST0MoY3R4LCBT WVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3Ntb290aGluZ19y YXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAsIDAsCisJICAgIHNhbXBsZV9zeXNj dGxfc21vb3RoaW5nX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTogc21vb3RoaW5nIHJhdGUgZm9y IGF2ZyB0eCB0aW1lICglJSkiKTsKKwlTWVNDVExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERS RU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3JhdGUiLCBDVExUWVBFX0lOVCB8IENU TEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9zYW1wbGVfcmF0ZSwgIkkiLAor CSAgICAic2FtcGxlOiBwZXJjZW50IGFpciB0aW1lIGRldm90ZWQgdG8gc2FtcGxpbmcgbmV3IHJh dGVzICglJSkiKTsKKwkvKiBYWFggbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMsIHN0YWxlX2ZhaWx1 cmVfdGltZW91dCwgbWluX3N3aXRjaCAqLworCVNZU0NUTF9BRERfUFJPQyhjdHgsIFNZU0NUTF9D SElMRFJFTih0cmVlKSwgT0lEX0FVVE8sCisJICAgICJzYW1wbGVfc3RhdHMiLCBDVExUWVBFX0lO VCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9zdGF0cywgIkkiLCAi c2FtcGxlOiBwcmludCBzdGF0aXN0aWNzIik7Cit9CkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX3JjX3NhbXBsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNf c2FtcGxlLmgJKHJldmlzaW9uIDApCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs ZS5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0wLDAgKzEsMjgzIEBACisvKiAkRnJlZUJTRDogaGVh ZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxlLmggMjQwMzgyIDIwMTItMDgtMTUg MDc6MTA6MTBaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz Y2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRp b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVy CisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cgKCJE aXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRp b25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkKKyAqICAgIHNpbWlsYXIgRGlzY2xh aW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAz LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJz IG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0 d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBB bHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUg dGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNp b24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisg KgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVY UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OSU5GUklOR0VNRU5ULCBNRVJDSEFO VElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBD T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksCisgKiBPUiBDT05T RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF TUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQ09OVFJB Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U SEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB TUFHRVMuCisgKi8KKworI2lmbmRlZiBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfU0FNUExF X0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVfSF8KKworLyoK KyAqIGZvciBub3csIHdlIHRyYWNrIHBlcmZvcm1hbmNlIGZvciB0aHJlZSBkaWZmZXJlbnQgcGFj a2V0CisgKiBzaXplIGJ1Y2tldHMKKyAqLworI2RlZmluZSBOVU1fUEFDS0VUX1NJWkVfQklOUyAy CisjZGVmaW5lCVNBTVBMRV9NQVhSQVRFUwk2NAkJLyogTkI6IGNvcnJlc3BvbmRzIHRvIGhhbCBp bmZvWzMyXSAqLworCisvKgorICogUmF0ZSBjb250cm9sIHNldHRpbmdzLgorICovCitzdHJ1Y3Qg aWVlZTgwMjExX3NhbXBsZSB7CisJaW50CXNhbXBsZV9zbW9vdGhpbmdfcmF0ZTsJCQkvKiBld21h IHBlcmNlbnRhZ2UgWzAuLjk5XSAqLworCWludAlzYW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHM7 CisJaW50CXNhbXBsZV9yYXRlOwkJCS8qICV0aW1lIHRvIHRyeSBkaWZmZXJlbnQgdHggcmF0ZXMg Ki8KKwlpbnQJc2FtcGxlX21heF9zdWNjZXNzaXZlX2ZhaWx1cmVzOworCWludAlzYW1wbGVfc3Rh bGVfZmFpbHVyZV90aW1lb3V0OwkvKiBob3cgbG9uZyB0byBob25vciBtYXhfc3VjY2Vzc2l2ZV9m YWlsdXJlcyAqLworCWludAlzYW1wbGVfbWluX3N3aXRjaDsJCS8qIG1pbiB0aW1lIGJldHdlZW4g cmF0ZSBjaGFuZ2VzICovCisJaW50CXNhbXBsZV9taW5fZ29vZF9wY3Q7CS8qIG1pbiBnb29kIHBl cmNlbnRhZ2UgZm9yIGEgcmF0ZSB0byBiZSBjb25zaWRlcmVkICovCit9OworCitzdHJ1Y3QgcmF0 ZV9zdGF0cyB7CQorCXVuc2lnbmVkIGF2ZXJhZ2VfdHhfdGltZTsKKwlpbnQgc3VjY2Vzc2l2ZV9m YWlsdXJlczsKKwl1aW50NjRfdCB0cmllczsKKwl1aW50NjRfdCB0b3RhbF9wYWNrZXRzOwkvKiBw a3RzIHRvdGFsIHNpbmNlIGFzc29jICovCisJdWludDY0X3QgcGFja2V0c19hY2tlZDsJLyogcGt0 cyBhY2tlZCBzaW5jZSBhc3NvYyAqLworCWludCBld21hX3BjdDsJLyogRVdNQSBwZXJjZW50YWdl ICovCisJdW5zaWduZWQgcGVyZmVjdF90eF90aW1lOyAvKiB0cmFuc21pdCB0aW1lIGZvciAwIHJl dHJpZXMgKi8KKwlpbnQgbGFzdF90eDsKK307CisKK3N0cnVjdCB0eHNjaGVkdWxlIHsKKwl1aW50 OF90CXQwLCByMDsJCS8qIHNlcmllcyAwOiB0cmllcywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0 MSwgcjE7CQkvKiBzZXJpZXMgMTogdHJpZXMsIHJhdGUgY29kZSAqLworCXVpbnQ4X3QJdDIsIHIy OwkJLyogc2VyaWVzIDI6IHRyaWVzLCByYXRlIGNvZGUgKi8KKwl1aW50OF90CXQzLCByMzsJCS8q IHNlcmllcyAzOiB0cmllcywgcmF0ZSBjb2RlICovCit9OworCisvKgorICogUmF0ZSBjb250cm9s IHN0YXRlIGZvciBhIGdpdmVuIG5vZGUuCisgKi8KKy8qIFhYWCBjaGFuZ2UgbmFtaW5nIGNvbnZl cnNpb24/ICovCitzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlIHsKKwlzdHJ1Y3QgaWVlZTgw MjExX3NhbXBsZSAqc2FuX3NhbXBsZTsvKiBiYWNrcG9pbnRlciAqLworCWludCBzdGF0aWNfcml4 OwkJCS8qIHJhdGUgaW5kZXggb2YgZml4ZWQgdHggcmF0ZSAqLworCXVpbnQ2NF90IHJhdGVtYXNr OwkJLyogYml0IG1hc2sgb2YgdmFsaWQgcmF0ZSBpbmRpY2VzICovCisJY29uc3Qgc3RydWN0IHR4 c2NoZWR1bGUgKnNjaGVkOwkvKiB0eCBzY2hlZHVsZSB0YWJsZSAqLworCisJc3RydWN0IHJhdGVf c3RhdHMgc3RhdHNbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdW1NBTVBMRV9NQVhSQVRFU107CisJaW50 IGxhc3Rfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgY3VycmVudF9z YW1wbGVfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsgICAgICAgCisJaW50IHBhY2tldHNfc2Vu dFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgY3VycmVudF9yaXhbTlVNX1BBQ0tFVF9T SVpFX0JJTlNdOworCWludCBwYWNrZXRzX3NpbmNlX3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklO U107CisJdW5zaWduZWQgdGlja3Nfc2luY2Vfc3dpdGNoW05VTV9QQUNLRVRfU0laRV9CSU5TXTsK KworCWludCBwYWNrZXRzX3NpbmNlX3NhbXBsZVtOVU1fUEFDS0VUX1NJWkVfQklOU107CisJdW5z aWduZWQgc2FtcGxlX3R0W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKK307CisKKyNkZWZpbmUJSVNf UkFURV9ERUZJTkVEKHNhbiwgcml4KQkoKChzYW4pLT5yYXRlbWFzayAmICgxPDwocml4KSkpICE9 IDApCisKKyNpZm5kZWYgTUlOCisjZGVmaW5lCU1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAo YikpCisjZW5kaWYKKyNpZm5kZWYgTUFYCisjZGVmaW5lCU1BWChhLGIpCSgoYSkgPiAoYikgPyAo YSkgOiAoYikpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBwYWNrZXRfc2l6ZV9iaW5zW05V TV9QQUNLRVRfU0laRV9CSU5TXSAgPSB7IDI1MCwgMTYwMCB9OworCitzdGF0aWMgaW5saW5lIGlu dAorYmluX3RvX3NpemUoaW50IGluZGV4KQoreworCXJldHVybiBwYWNrZXRfc2l6ZV9iaW5zW2lu ZGV4XTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NpemVfdG9fYmluKGludCBzaXplKSAKK3sK KyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+IDEKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6ZV9i aW5zWzBdKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5TID4g MgorCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMV0pCisJCXJldHVybiAxOworI2VuZGlm CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiAzCisJaWYgKHNpemUgPD0gcGFja2V0X3NpemVf Ymluc1syXSkKKwkJcmV0dXJuIDI7CisjZW5kaWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+ IDQKKyNlcnJvciAiYWRkIHN1cHBvcnQgZm9yIG1vcmUgcGFja2V0IHNpemVzIgorI2VuZGlmCisJ cmV0dXJuIE5VTV9QQUNLRVRfU0laRV9CSU5TLTE7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzYW1w bGVfcGt0X3R4dGltZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LAorCXVp bnQzMl90IGZyYW1lTGVuLCB1aW50MTZfdCByYXRlaXgsIGludCBpc2h0NDAsIGludCBpc1Nob3J0 UHJlYW1ibGUpCit7CisJdWludDhfdCByYzsKKyAgICBpbnQgbnVtU3RyZWFtczsKKworICAgIHJj ID0gcnQtPmluZm9bcmF0ZWl4XS5yYXRlQ29kZTsKKworICAgIC8qIExlZ2FjeSByYXRlPyBSZXR1 cm4gdGhlIG9sZCB3YXkgKi8KKyAgICBpZiAoISBJU19IVF9SQVRFKHJjKSkKKyAgICAJcmV0dXJu IGllZWU4MDIxMV9jb21wdXRlX2R1cmF0aW9uKHJ0LCBmcmFtZUxlbiwgcmF0ZWl4LCBpc1Nob3J0 UHJlYW1ibGUpOworCisgICAgLyogMTFuIGZyYW1lIC0gZXh0cmFjdCBvdXQgdGhlIG51bWJlciBv ZiBzcGF0aWFsIHN0cmVhbXMgKi8KKyAgICBudW1TdHJlYW1zID0gSFRfUkNfMl9TVFJFQU1TKHJj KTsKKyAgICBLQVNTRVJUKG51bVN0cmVhbXMgPiAwICYmIG51bVN0cmVhbXMgPD0gNCwKKyAgICAg ICAgKCJudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zIG5lZWRzIHRvIGJlIDEuLjM6IE1DUyByYXRl IDB4JXghIiwKKyAgICAgICAgcmF0ZWl4KSk7CisKKyAgICByZXR1cm4gaWVlZTgwMjExX2NvbXB1 dGVfZHVyYXRpb25faHQoZnJhbWVMZW4sIHJjLCBudW1TdHJlYW1zLCBpc2h0NDAsIGlzU2hvcnRQ cmVhbWJsZSk7Cit9CisKKyNkZWZpbmUgV0lGSV9DV19NSU4gMzEKKyNkZWZpbmUgV0lGSV9DV19N QVggMTAyMworCisvKgorICogQ2FsY3VsYXRlIHRoZSB0cmFuc21pdCBkdXJhdGlvbiBvZiBhIGZy YW1lLgorICovCitzdGF0aWMgdW5zaWduZWQgY2FsY191c2Vjc191bmljYXN0X3BhY2tldChjb25z dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCQkJaW50IGxlbmd0aCwKKwkJCQlpbnQgcml4 LCBpbnQgc2hvcnRfcmV0cmllcywKKwkJCQlpbnQgbG9uZ19yZXRyaWVzLCBpbnQgaXNfaHQ0MCkK K3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dl dF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJc3RydWN0IGllZWU4MDIxMWNv bSAqaWMgPSB2YXAtPml2X2ljOworCWludCBjdXJtb2RlID0gaWVlZTgwMjExX2NoYW4ybW9kZSh2 YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwl1bnNpZ25lZCB0X3Nsb3QsIHRfZGlmcywgdF9z aWZzOyAKKwlpbnQgcnRzLCBjdHM7CisJaW50IHR0LCB4LCBjdywgY2l4OworCisJaW50IHR0ID0g MDsKKwlpbnQgeCA9IDA7CisJaW50IGN3ID0gV0lGSV9DV19NSU47CisKKwlLQVNTRVJUKHJ0ICE9 IE5VTEwsICgibm8gcmF0ZSB0YWJsZSwgbW9kZSAldSIsIGN1cm1vZGUpKTsKKworCWlmIChyaXgg Pj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoImJvZ3VzIHJpeCAlZCwgbWF4ICV1LCBtb2Rl ICV1XG4iLAorCQkgICAgICAgcml4LCBydC0+cmF0ZUNvdW50LCBjdXJtb2RlKTsKKwkJcmV0dXJu IDA7CisJfQorCWNpeCA9IHJ0LT5pbmZvW3JpeF0uY29udHJvbFJhdGU7CisJLyogCisJICogWFhY IGdldHRpbmcgbWFjL3BoeSBsZXZlbCB0aW1pbmdzIHNob3VsZCBiZSBmaXhlZCBmb3IgdHVyYm8K KwkgKiByYXRlcywgYW5kIHRoZXJlIGlzIHByb2JhYmx5IGEgd2F5IHRvIGdldCB0aGlzIGZyb20g dGhlCisJICogaGFsLi4uCisJICovCisJc3dpdGNoIChydC0+aW5mb1tyaXhdLnBoeSkgeworCWNh c2UgSUVFRTgwMjExX1RfT0ZETToKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZzID0gMTY7CisJCXRf ZGlmcyA9IDI4OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIElFRUU4MDIxMV9UX1RVUkJP OgorCQl0X3Nsb3QgPSA5OworCQl0X3NpZnMgPSA4OworCQl0X2RpZnMgPSAyODsKKwkJYnJlYWs7 CisJY2FzZSBJRUVFODAyMTFfVF9IVDoKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZzID0gODsKKwkJ dF9kaWZzID0gMjg7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1RfRFM6CisJCS8qIGZhbGwg dGhyb3VnaCB0byBkZWZhdWx0ICovCisJZGVmYXVsdDoKKwkJLyogcGcgMjA1IGllZWUuODAyLjEx LnBkZiAqLworCQl0X3Nsb3QgPSAyMDsKKwkJdF9kaWZzID0gNTA7CisJCXRfc2lmcyA9IDEwOwor CX0KKworCXJ0cyA9IGN0cyA9IDA7CisKKwlpZiAoKGljLT5pY19mbGFncyAmIElFRUU4MDIxMV9G X1VTRVBST1QpICYmCisJICAgIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4MDIxMV9UX09GRE0p IHsKKwkJaWYgKGljLT5pY19wcm90bW9kZSA9PSBJRUVFODAyMTFfUFJPVF9SVFNDVFMpCisJCQly dHMgPSAxOworCQllbHNlIGlmIChpYy0+aWNfcHJvdG1vZGUgPT0gSUVFRTgwMjExX1BST1RfQ1RT T05MWSkKKwkJCWN0cyA9IDE7CisKKwkJaW50IHByb3RyaXg7CisgICAgCWlmIChjdXJtb2RlID09 IElFRUU4MDIxMV9NT0RFXzExRykKKyAgICAJICAgIHByb3RyaXggPSBydC0+cmF0ZUNvZGVUb0lu ZGV4WzIqMl07CisgICAgCWVsc2UgCisgICAgCSAgICBwcm90cml4ID0gcnQtPnJhdGVDb2RlVG9J bmRleFsyKjFdOworICAgIAlpZiAoMHhmZiA9PSBwcm90cml4KQorICAgIAkJcHJvdHJpeCA9IDA7 CisKKwkJY2l4ID0gcnQtPmluZm9bcHJvdHJpeF0uY29udHJvbFJhdGU7CisJfQorCisJaWYgKDAg LypsZW5ndGggPiBpYy0+aWNfcnRzdGhyZXNob2xkICovKSB7CisJCXJ0cyA9IDE7CisJfQorCisJ aWYgKHJ0cyB8fCBjdHMpIHsKKwkJaW50IGN0c3JhdGU7CisJCWludCBjdHNkdXJhdGlvbiA9IDA7 CisKKwkJLyogTkI6IHRoaXMgaXMgaW50ZW50aW9uYWxseSBub3QgYSBydW50aW1lIGNoZWNrICov CisJCUtBU1NFUlQoY2l4IDwgcnQtPnJhdGVDb3VudCwKKwkJICAgICgiYm9ndXMgY2l4ICVkLCBt YXggJXUsIG1vZGUgJXVcbiIsIGNpeCwgcnQtPnJhdGVDb3VudCwKKwkJICAgICBjdXJtb2RlKSk7 CisKKwkJY3RzcmF0ZSA9IHJ0LT5pbmZvW2NpeF0ucmF0ZUNvZGUgfCBydC0+aW5mb1tjaXhdLnNo b3J0UHJlYW1ibGU7CisJCWlmIChydHMpCQkvKiBTSUZTICsgQ1RTICovCisJCQljdHNkdXJhdGlv biArPSBydC0+aW5mb1tjaXhdLnNwQWNrRHVyYXRpb247CisKKwkJLyogWFhYIGFzc3VtZXMgc2hv cnQgcHJlYW1ibGUgKi8KKwkJY3RzZHVyYXRpb24gKz0gc2FtcGxlX3BrdF90eHRpbWUocnQsIGxl bmd0aCwgcml4LCBpc19odDQwLCAwKTsKKworCQlpZiAoY3RzKQkvKiBTSUZTICsgQUNLICovCisJ CQljdHNkdXJhdGlvbiArPSBydC0+aW5mb1tjaXhdLnNwQWNrRHVyYXRpb247CisKKwkJdHQgKz0g KHNob3J0X3JldHJpZXMgKyAxKSAqIGN0c2R1cmF0aW9uOworCX0KKwl0dCArPSB0X2RpZnM7CisK KwkvKiBYWFggYXNzdW1lcyBzaG9ydCBwcmVhbWJsZSAqLworCXR0ICs9IChsb25nX3JldHJpZXMr MSkqc2FtcGxlX3BrdF90eHRpbWUocnQsIGxlbmd0aCwgcml4LCBpc19odDQwLCAwKTsKKworCXR0 ICs9IChsb25nX3JldHJpZXMrMSkqKHRfc2lmcyArIHJ0LT5pbmZvW3JpeF0uc3BBY2tEdXJhdGlv bik7CisKKwlmb3IgKHggPSAwOyB4IDw9IHNob3J0X3JldHJpZXMgKyBsb25nX3JldHJpZXM7IHgr KykgeworCQljdyA9IE1JTihXSUZJX0NXX01BWCwgKGN3ICsgMSkgKiAyKTsKKwkJdHQgKz0gKHRf c2xvdCAqIGN3LzIpOworCX0KKwlyZXR1cm4gdHQ7Cit9CisKKyNlbmRpZiAvKiBfTkVUODAyMTFf SUVFRTgwMjExX1JBVEVDVExfU0FNUExFX0hfICovCkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX3JjX3NhbXBsZV90eHNjaGVkLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4 MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAwKQorKysgc3lzL25ldDgwMjExL2ll ZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0wLDAgKzEs MjQxIEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvdHhf c2NoZWR1bGVzLmggMjQwMzg0IDIwMTItMDgtMTUgMDc6NTA6NDJaIGFkcmlhbiAkKi8KKworLyot CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAx MyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv d2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRp c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRp c2NsYWltZXIKKyAqICAgIHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBi ZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQgYW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJl IGNvbmRpdGlvbmVkIHVwb24gaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxh ciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlv bi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0 IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUg dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0 aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor ICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BM IikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRh dGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFO RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQs IE1FUkNIQU5USUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xE RVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAq IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJ TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G IFNVQ0ggREFNQUdFUy4KKyAqCisgKi8KKyNpZm5kZWYJX19BVEhfUkFURV9TQU1QTEVfVFhTQ0hF RFVMRVNfSF9fCisjZGVmaW5lCV9fQVRIX1JBVEVfU0FNUExFX1RYU0NIRURVTEVTX0hfXworCisj aW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNkZWZpbmUgQShfcikgXAorICAgICgoKF9yKSA9PSA2 KSAgID8gMCA6ICgoKF9yKSA9PSA5KSAgID8gMSA6ICgoKF9yKSA9PSAxMikgID8gMiA6IFwKKyAg ICAoKChfcikgPT0gMTgpICA/IDMgOiAoKChfcikgPT0gMjQpICA/IDQgOiAoKChfcikgPT0gMzYp ICA/IDUgOiBcCisgICAgKCgoX3IpID09IDQ4KSAgPyA2IDogKCgoX3IpID09IDU0KSAgPyA3IDog MCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExYVtdID0g eworCXsgMyxBKCA2KSwgMyxBKCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sCS8qICAgNk1iL3Mg Ki8KKwl7IDQsQSggOSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LAkvKiAgIDlNYi9z ICovCisJeyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwJLyogIDEyTWIv cyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sCS8qICAxOE1i L3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2KSB9LAkvKiAgMjRN Yi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCksIDIsQSggNikgfSwJLyogIDM2 TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQsQSggMjQpLCAyLEEoMTIpIH0sCS8qICA0 OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSggNDgpLCA0LEEoIDM2KSwgMixBKDI0KSB9CS8qICA1 NE1iL3MgKi8KK307CisKKyNkZWZpbmUgTkExKF9yKSBcCisJKCgoX3IpID09IDYuNSkgID8gOCA6 ICgoKF9yKSA9PSAxMykgID8gIDkgOiAoKChfcikgPT0gMTkuNSk/IDEwIDogXAorCSgoKF9yKSA9 PSAyNikgID8gMTEgOiAoKChfcikgPT0gMzkpICA/IDEyIDogKCgoX3IpID09IDUyKSAgPyAxMyA6 IFwKKwkoKChfcikgPT0gNTguNSk/IDE0IDogKCgoX3IpID09IDY1KSAgPyAxNSA6IDApKSkpKSkp KQorI2RlZmluZSBOQTIoX3IpIFwKKwkoKChfcikgPT0gMTMpID8gMTYgOiAoKChfcikgPT0gMjYp ID8gMTcgOiAoKChfcikgPT0gMzkpID8gMTggOiBcCisJKCgoX3IpID09IDUyKSA/IDE5IDogKCgo X3IpID09IDc4KSA/IDIwIDogKCgoX3IpID09IDEwNCk/IDIxIDogXAorCSgoKF9yKSA9PSAxMTcp PyAyMiA6ICgoKF9yKSA9PSAxMzApPyAyMyA6IDApKSkpKSkpKQorI2RlZmluZSBOQTMoX3IpIFwK KwkoKChfcikgPT0gMTkuNSkgID8gMjQgOiAoKChfcikgPT0gMzkpID8gMjUgOiAoKChfcikgPT0g NTguNSkgID8gMjYgOiBcCisJKCgoX3IpID09IDc4KSAgPyAyNyA6ICgoKF9yKSA9PSAxMTcpID8g MjggOiAoKChfcikgPT0gMTU2KSA/IDI5IDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzMCA6ICgo KF9yKSA9PSAxOTUpPyAzMSA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVk dWxlIHNlcmllc18xMW5hW10gPSB7CisJeyAzLEEoIDYpLCAzLEEoICA2KSwgMCxBKCAgNiksIDAs QSggNikgfSwgICAgICAgLyogICA2TWIvcyAqLworCXsgNCxBKCA5KSwgMyxBKCAgNiksIDQsQSgg IDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgOU1iL3MgKi8KKwl7IDQsQSgxMiksIDMsQSggIDYp LCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgMTJNYi9zICovCisJeyA0LEEoMTgpLCAz LEEoIDEyKSwgNCxBKCAgNiksIDIsQSggNikgfSwgICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxB KDI0KSwgMyxBKCAxOCksIDQsQSggMTIpLCAyLEEoIDYpIH0sICAgICAgIC8qICAyNE1iL3MgKi8K Kwl7IDQsQSgzNiksIDMsQSggMjQpLCA0LEEoIDE4KSwgMixBKCA2KSB9LCAgICAgICAvKiAgMzZN Yi9zICovCisJeyA0LEEoNDgpLCAzLEEoIDM2KSwgNCxBKCAyNCksIDIsQSgxMikgfSwgICAgICAg LyogIDQ4TWIvcyAqLworCXsgNCxBKDU0KSwgMyxBKCA0OCksIDQsQSggMzYpLCAyLEEoMjQpIH0s ICAgICAgIC8qICA1NE1iL3MgKi8KKworCS8qIDEgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkEx KCA2LjUpLCAzLE5BMSggNi41KSwgMCxOQTEoIDYuNSksIDAsTkExKDYuNSkgfSwgIC8qIDYuNU1i L3MgKi8KKwl7IDQsTkExKCAgMTMpLCAzLE5BMSggNi41KSwgNCxOQTEoIDYuNSksIDAsTkExKDYu NSkgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkExKDE5LjUpLCAzLE5BMSggNi41KSwgNCxOQTEo IDYuNSksIDAsTkExKDYuNSkgfSwgIC8qMTkuNU1iL3MgKi8KKwl7IDQsTkExKCAgMjYpLCAzLE5B MSgxOS41KSwgNCxOQTEoIDYuNSksIDIsTkExKDYuNSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQs TkExKCAgMzkpLCAzLE5BMSggIDI2KSwgNCxOQTEoMTkuNSksIDIsTkExKDYuNSkgfSwgIC8qICAz OU1iL3MgKi8KKwl7IDQsTkExKCAgNTIpLCAzLE5BMSggIDM5KSwgNCxOQTEoICAyNiksIDIsTkEx KDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQsTkExKDU4LjUpLCAzLE5BMSggIDUyKSwgNCxO QTEoICAzOSksIDIsTkExKCAxMykgfSwgIC8qNTguNU1iL3MgKi8KKwl7IDQsTkExKCAgNjUpLCAz LE5BMSg1OC41KSwgNCxOQTEoICA1MiksIDIsTkExKCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKwor CS8qIDIgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkEyKCAgMTMpLCAzLE5BMiggIDEzKSwgMCxO QTIoICAxMyksIDAsTkEyKCAxMykgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkEyKCAgMjYpLCAz LE5BMiggIDEzKSwgNCxOQTIoICAxMyksIDAsTkEyKCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7 IDQsTkEyKCAgMzkpLCAzLE5BMiggIDI2KSwgNCxOQTIoICAxMyksIDIsTkEyKCAxMykgfSwgIC8q ICAzOU1iL3MgKi8KKwl7IDQsTkEyKCAgNTIpLCAzLE5BMiggIDM5KSwgNCxOQTIoICAyNiksIDIs TkEyKCAxMykgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQsTkEyKCAgNzgpLCAzLE5BMiggIDUyKSwg NCxOQTIoICAzOSksIDIsTkEyKCAxMykgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDQsTkEyKCAxMDQp LCAzLE5BMiggIDc4KSwgNCxOQTIoICA1MiksIDIsTkEyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8K Kwl7IDQsTkEyKCAxMTcpLCAzLE5BMiggMTA0KSwgNCxOQTIoICA3OCksIDIsTkEyKCAyNikgfSwg IC8qIDExN01iL3MgKi8KKwl7IDQsTkEyKCAxMzApLCAzLE5BMiggMTE3KSwgNCxOQTIoIDEwNCks IDIsTkEyKCAyNikgfSwgICAvKiAxMzBNYi9zICovCisKKwkvKiAzIHN0cmVhbSByYXRlcyAqLwor CisJeyAzLE5BMygxOS41KSwgMyxOQTMoMTkuNSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9 LCAgLyogIDE5TWIvcyAqLworCXsgMyxOQTMoICAzOSksIDMsTkEzKDE5LjUpLCAwLE5BMygxOS41 KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDMsTkEzKDU4LjUpLCAzLE5BMygg IDM5KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgNThNYi9zICovCisJeyAzLE5B MyggIDc4KSwgMyxOQTMoNTguNSksIDAsTkEzKCAgMzkpLCAwLE5BMygxOS41KSB9LCAgLyogIDc4 TWIvcyAqLworCXsgMyxOQTMoIDExNyksIDMsTkEzKCAgNzgpLCAwLE5BMyg1OC41KSwgMCxOQTMo MTkuNSkgfSwgIC8qIDExN01iL3MgKi8KKwl7IDMsTkEzKCAxNTYpLCAzLE5BMyggMTE3KSwgMCxO QTMoICA3OCksIDAsTkEzKDE5LjUpIH0sICAvKiAgMTU2TWIvcyAqLworCXsgMyxOQTMoMTc1LjUp LCAzLE5BMyggMTU2KSwgMCxOQTMoIDExNyksIDAsTkEzKCAgMzkpIH0sICAvKiAgMTc1TWIvcyAq LworCXsgMyxOQTMoIDE5NSksIDMsTkEzKCAxOTUpLCAwLE5BMyggMTU2KSwgMCxOQTMoNTguNSkg fSwgIC8qIDE5NU1iL3MgKi8KK307CisjdW5kZWYgQQorI3VuZGVmIE5BMworI3VuZGVmIE5BMgor I3VuZGVmIE5BMQorCisjZGVmaW5lIEcoX3IpIFwKKyAgICAoKChfcikgPT0gMSkgICA/IDAgOiAo KChfcikgPT0gMikgICA/IDEgOiAoKChfcikgPT0gNS41KSA/IDIgOiBcCisgICAgKCgoX3IpID09 IDExKSAgPyAzIDogKCgoX3IpID09IDYpICAgPyA0IDogKCgoX3IpID09IDkpICAgPyA1IDogXAor ICAgICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxOCkgID8gNyA6ICgoKF9yKSA9PSAy NCkgID8gOCA6IFwKKyAgICAoKChfcikgPT0gMzYpICA/IDkgOiAoKChfcikgPT0gNDgpICA/IDEw IDogKCgoX3IpID09IDU0KSAgPyAxMSA6IDApKSkpKSkpKSkpKSkKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFnW10gPSB7CisJeyAzLEcoIDEpLCAzLEcoICAxKSwgMCxH KCAgMSksIDAsRyggMSkgfSwJLyogICAxTWIvcyAqLworCXsgNCxHKCAyKSwgMyxHKCAgMSksIDQs RyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMk1iL3MgKi8KKwl7IDQsRyg1LjUpLDMsRyggIDIpLCA0 LEcoICAxKSwgMixHKCAxKSB9LAkvKiA1LjVNYi9zICovCisJeyA0LEcoMTEpLCAzLEcoNS41KSwg NCxHKCAgMiksIDIsRyggMSkgfSwJLyogIDExTWIvcyAqLworCXsgNCxHKCA2KSwgMyxHKDUuNSks IDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsRyggOSksIDMsRyggIDYp LCA0LEcoNS41KSwgMixHKCAxKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEcoMTIpLCAzLEcoIDEx KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogIDEyTWIvcyAqLworCXsgNCxHKDE4KSwgMyxHKCAx MiksIDQsRyggMTEpLCAyLEcoIDEpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsRygyNCksIDMsRygg MTgpLCA0LEcoIDEyKSwgMixHKCAxKSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEcoMzYpLCAzLEco IDI0KSwgNCxHKCAxOCksIDIsRyggMSkgfSwJLyogIDM2TWIvcyAqLworCXsgNCxHKDQ4KSwgMyxH KCAzNiksIDQsRyggMjQpLCAyLEcoIDEpIH0sCS8qICA0OE1iL3MgKi8KKwl7IDQsRyg1NCksIDMs RyggNDgpLCA0LEcoIDM2KSwgMixHKCAxKSB9CS8qICA1NE1iL3MgKi8KK307CisKKyNkZWZpbmUg TkcxKF9yKSBcCisJKCgoX3IpID09IDYuNSkgPyAxMiA6ICgoKF9yKSA9PSAxMykgPyAxMyA6ICgo KF9yKSA9PSAxOS41KT8gMTQgOiBcCisJKCgoX3IpID09IDI2KSAgPyAxNSA6ICgoKF9yKSA9PSAz OSkgPyAxNiA6ICgoKF9yKSA9PSA1MikgID8gMTcgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxOCA6 ICgoKF9yKSA9PSA2NSkgPyAxOSA6IDApKSkpKSkpKQorI2RlZmluZSBORzIoX3IpIFwKKwkoKChf cikgPT0gMTMpICA/IDIwIDogKCgoX3IpID09IDI2KSA/IDIxIDogKCgoX3IpID09IDM5KSAgPyAy MiA6IFwKKwkoKChfcikgPT0gNTIpICA/IDIzIDogKCgoX3IpID09IDc4KSA/IDI0IDogKCgoX3Ip ID09IDEwNCkgPyAyNSA6IFwKKwkoKChfcikgPT0gMTE3KSA/IDI2IDogKCgoX3IpID09IDEzMCk/ IDI3IDogMCkpKSkpKSkpCisjZGVmaW5lIE5HMyhfcikgXAorCSgoKF9yKSA9PSAxOS41KSAgPyAy OCA6ICgoKF9yKSA9PSAzOSkgPyAyOSA6ICgoKF9yKSA9PSA1OC41KSAgPyAzMCA6IFwKKwkoKChf cikgPT0gNzgpICA/IDMxIDogKCgoX3IpID09IDExNykgPyAzMiA6ICgoKF9yKSA9PSAxNTYpID8g MzMgOiBcCisJKCgoX3IpID09IDE3NS41KSA/IDM0IDogKCgoX3IpID09IDE5NSk/IDM1IDogMCkp KSkpKSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuZ1tdID0g eworCXsgMyxHKCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sICAgICAgIC8qICAg MU1iL3MgKi8KKwl7IDQsRyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LCAgICAg ICAvKiAgIDJNYi9zICovCisJeyA0LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkg fSwgICAgICAgLyogNS41TWIvcyAqLworCXsgNCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAy LEcoIDEpIH0sICAgICAgIC8qICAxMU1iL3MgKi8KKwl7IDQsRyggNiksIDMsRyg1LjUpLCA0LEco ICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgIDZNYi9zICovCisJeyA0LEcoIDkpLCAzLEcoICA2 KSwgNCxHKDUuNSksIDIsRyggMSkgfSwgICAgICAgLyogICA5TWIvcyAqLworCXsgNCxHKDEyKSwg MyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8qICAxMk1iL3MgKi8KKwl7IDQs RygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMThNYi9zICov CisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwgICAgICAgLyogIDI0 TWIvcyAqLworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sICAgICAg IC8qICAzNk1iL3MgKi8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9 LCAgICAgICAvKiAgNDhNYi9zICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIs RyggMSkgfSwgICAgICAgLyogIDU0TWIvcyAqLworCisJLyogMSBzdHJlYW0gcmF0ZXMgKi8KKwor CXsgMyxORzEoIDYuNSksIDMsTkcxKCA2LjUpLCAwLE5HMSggNi41KSwgMCxORzEoNi41KSB9LCAg LyogNi41TWIvcyAqLworCXsgNCxORzEoICAxMyksIDMsTkcxKCA2LjUpLCA0LE5HMSggNi41KSwg MCxORzEoNi41KSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxORzEoMTkuNSksIDMsTkcxKCA2LjUp LCA0LE5HMSggNi41KSwgMCxORzEoNi41KSB9LCAgLyoxOS41TWIvcyAqLworCXsgNCxORzEoICAy NiksIDMsTkcxKDE5LjUpLCA0LE5HMSggNi41KSwgMixORzEoNi41KSB9LCAgLyogIDI2TWIvcyAq LworCXsgNCxORzEoICAzOSksIDMsTkcxKCAgMjYpLCA0LE5HMSgxOS41KSwgMixORzEoNi41KSB9 LCAgLyogIDM5TWIvcyAqLworCXsgNCxORzEoICA1MiksIDMsTkcxKCAgMzkpLCA0LE5HMSggIDI2 KSwgMixORzEoNi41KSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxORzEoNTguNSksIDMsTkcxKCAg NTIpLCA0LE5HMSggIDM5KSwgMixORzEoIDEzKSB9LCAgLyo1OC41TWIvcyAqLworCXsgNCxORzEo ICA2NSksIDMsTkcxKDU4LjUpLCA0LE5HMSggIDUyKSwgMixORzEoIDEzKSB9LCAgLyogIDY1TWIv cyAqLworCisJLyogMiBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxORzIoICAxMyksIDMsTkcyKCAg MTMpLCAwLE5HMiggIDEzKSwgMCxORzIoIDEzKSB9LCAgLyogIDEzTWIvcyAqLworCXsgNCxORzIo ICAyNiksIDMsTkcyKCAgMTMpLCA0LE5HMiggIDEzKSwgMCxORzIoIDEzKSB9LCAgLyogIDI2TWIv cyAqLworCXsgNCxORzIoICAzOSksIDMsTkcyKCAgMjYpLCA0LE5HMiggIDEzKSwgMixORzIoIDEz KSB9LCAgLyogIDM5TWIvcyAqLworCXsgNCxORzIoICA1MiksIDMsTkcyKCAgMzkpLCA0LE5HMigg IDI2KSwgMixORzIoIDEzKSB9LCAgLyogIDUyTWIvcyAqLworCXsgNCxORzIoICA3OCksIDMsTkcy KCAgNTIpLCA0LE5HMiggIDM5KSwgMixORzIoIDEzKSB9LCAgLyogIDc4TWIvcyAqLworCXsgNCxO RzIoIDEwNCksIDMsTkcyKCAgNzgpLCA0LE5HMiggIDUyKSwgMixORzIoIDEzKSB9LCAgLyogMTA0 TWIvcyAqLworCXsgNCxORzIoIDExNyksIDMsTkcyKCAxMDQpLCA0LE5HMiggIDc4KSwgMixORzIo IDI2KSB9LCAgLyogMTE3TWIvcyAqLworCXsgNCxORzIoIDEzMCksIDMsTkcyKCAxMTcpLCA0LE5H MiggMTA0KSwgMixORzIoIDI2KSB9LCAgLyogMTMwTWIvcyAqLworCisJLyogMyBzdHJlYW0gcmF0 ZXMgKi8KKworCXsgMyxORzMoMTkuNSksIDMsTkczKDE5LjUpLCAwLE5HMygxOS41KSwgMCxORzMo MTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkczKCAgMzkpLCAzLE5HMygxOS41KSwgMCxO RzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyAzLE5HMyg1OC41KSwg MyxORzMoICAzOSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDU4TWIvcyAqLwor CXsgMyxORzMoICA3OCksIDMsTkczKDU4LjUpLCAwLE5HMyggIDM5KSwgMCxORzMoMTkuNSkgfSwg IC8qICA3OE1iL3MgKi8KKwl7IDMsTkczKCAxMTcpLCAzLE5HMyggIDc4KSwgMCxORzMoNTguNSks IDAsTkczKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5HMyggMTU2KSwgMyxORzMoIDEx NyksIDAsTkczKCAgNzgpLCAwLE5HMygxOS41KSB9LCAgLyogIDE1Nk1iL3MgKi8KKwl7IDMsTkcz KDE3NS41KSwgMyxORzMoIDE1NiksIDAsTkczKCAxMTcpLCAwLE5HMyggIDM5KSB9LCAgLyogIDE3 NU1iL3MgKi8KKwl7IDMsTkczKCAxOTUpLCAzLE5HMyggMTk1KSwgMCxORzMoIDE1NiksIDAsTkcz KDU4LjUpIH0sICAvKiAxOTVNYi9zICovCisKK307CisjdW5kZWYgRworI3VuZGVmIE5HMworI3Vu ZGVmIE5HMgorI3VuZGVmIE5HMQorCisjZGVmaW5lIEgoX3IpIFwKKyAgICAoKChfcikgPT0gMykg ICA/IDAgOiAoKChfcikgPT0gNC41KSA/IDEgOiAoKChfcikgPT0gNikgID8gMiA6IFwKKyAgICAo KChfcikgPT0gOSkgICA/IDMgOiAoKChfcikgPT0gMTIpICA/IDQgOiAoKChfcikgPT0gMTgpID8g NSA6IFwKKyAgICAoKChfcikgPT0gMjQpICA/IDYgOiAoKChfcikgPT0gMjcpICA/IDcgOiAwKSkp KSkpKSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfaGFsZltdID0gewor CXsgMyxIKCAzKSwgMyxIKCAgMyksIDAsSCggIDMpLCAwLEgoIDMpIH0sCS8qICAgM01iL3MgKi8K Kwl7IDQsSCg0LjUpLDMsSCggIDMpLCA0LEgoICAzKSwgMCxIKCAzKSB9LAkvKiA0LjVNYi9zICov CisJeyA0LEgoIDYpLCAzLEgoICAzKSwgNCxIKCAgMyksIDAsSCggMykgfSwJLyogICA2TWIvcyAq LworCXsgNCxIKCA5KSwgMyxIKCAgNiksIDQsSCggIDMpLCAyLEgoIDMpIH0sCS8qICAgOU1iL3Mg Ki8KKwl7IDQsSCgxMiksIDMsSCggIDkpLCA0LEgoICA2KSwgMixIKCAzKSB9LAkvKiAgMTJNYi9z ICovCisJeyA0LEgoMTgpLCAzLEgoIDEyKSwgNCxIKCAgOSksIDIsSCggMykgfSwJLyogIDE4TWIv cyAqLworCXsgNCxIKDI0KSwgMyxIKCAxOCksIDQsSCggMTIpLCAyLEgoIDYpIH0sCS8qICAyNE1i L3MgKi8KKwl7IDQsSCgyNyksIDMsSCggMjQpLCA0LEgoIDE4KSwgMixIKDEyKSB9CS8qICAyN01i L3MgKi8KK307CisjdW5kZWYgSAorCisjaWZkZWYgUQorI3VuZGVmIFEKKyNlbmRpZgorI2RlZmlu ZSBRKF9yKSBcCisgICAgKCgoX3IpID09IDEuNSkgPyAwIDogKCgoX3IpID09Mi4yNSkgPyAxIDog KCgoX3IpID09IDMpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDQuNSkgPyAzIDogKCgoX3IpID09 ICA2KSAgPyA0IDogKCgoX3IpID09IDkpICA/IDUgOiBcCisgICAgKCgoX3IpID09IDEyKSAgPyA2 IDogKCgoX3IpID09IDEzLjUpPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4 c2NoZWR1bGUgc2VyaWVzX3F1YXJ0ZXJbXSA9IHsKKwl7IDMsUSggMS41KSwzLFEoMS41KSwgMCxR KDEuNSksIDAsUSgxLjUpIH0sCS8qIDEuNU1iL3MgKi8KKwl7IDQsUSgyLjI1KSwzLFEoMS41KSwg NCxRKDEuNSksIDAsUSgxLjUpIH0sCS8qMi4yNU1iL3MgKi8KKwl7IDQsUSggICAzKSwzLFEoMS41 KSwgNCxRKDEuNSksIDAsUSgxLjUpIH0sCS8qICAgM01iL3MgKi8KKwl7IDQsUSggNC41KSwzLFEo ICAzKSwgNCxRKDEuNSksIDIsUSgxLjUpIH0sCS8qIDQuNU1iL3MgKi8KKwl7IDQsUSggICA2KSwz LFEoNC41KSwgNCxRKCAgMyksIDIsUSgxLjUpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsUSggICA5 KSwzLFEoICA2KSwgNCxRKDQuNSksIDIsUSgxLjUpIH0sCS8qICAgOU1iL3MgKi8KKwl7IDQsUSgg IDEyKSwzLFEoICA5KSwgNCxRKCAgNiksIDIsUSggIDMpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQs USgxMy41KSwzLFEoIDEyKSwgNCxRKCAgOSksIDIsUSggIDYpIH0JLyoxMy41TWIvcyAqLworfTsK KyN1bmRlZiBRCisKKyNlbmRpZgpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlz aW9uIDI1NDgyNikKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCShyZXZpc2lv biAyNTU4NzIpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVp IFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dApAQCAtNDksNiArNTAsMzMgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjEx X1JBVEVDVEwsICI4MDIxMXJhdGVjdGwiLCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitpbnQg bWF4XzRtc19mcmFtZWxlbls0XVszMl0gPSB7CisJW01DU19IVDIwXSA9IHsKKwkJMzIxMiwgIDY0 MzIsICA5NjQ4LCAgMTI4NjQsICAxOTMwMCwgIDI1NzM2LCAgMjg5NTIsICAzMjE3MiwKKwkJNjQy NCwgIDEyODUyLCAxOTI4MCwgMjU3MDgsICAzODU2OCwgIDUxNDI0LCAgNTc4NTIsICA2NDI4MCwK KwkJOTYyOCwgIDE5MjYwLCAyODg5NiwgMzg1MjgsICA1Nzc5MiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwkJMTI4MjgsIDI1NjU2LCAzODQ4OCwgNTEzMjAsICA2NTUzMiwgIDY1NTMyLCAgNjU1 MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQyMF9TR0ldID0geworCQkzNTcyLCAgNzE0NCwgIDEw NzIwLCAgMTQyOTYsICAyMTQ0NCwgIDI4NTk2LCAgMzIxNzIsICAzNTc0NCwKKwkJNzE0MCwgIDE0 Mjg0LCAyMTQyOCwgIDI4NTY4LCAgNDI4NTYsICA1NzE0NCwgIDY0Mjg4LCAgNjU1MzIsCisJCTEw NzAwLCAyMTQwOCwgMzIxMTIsICA0MjgxNiwgIDY0MjI4LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMy LAorCQkxNDI1NiwgMjg1MTYsIDQyNzgwLCAgNTcwNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs ICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF0gPSB7CisJCTY2ODAsICAxMzM2MCwgIDIwMDQ0LCAg MjY3MjQsICA0MDA5MiwgIDUzNDU2LCAgNjAxNDAsICA2NTUzMiwKKwkJMTMzNDgsIDI2NzAwLCAg NDAwNTIsICA1MzQwMCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyMDAwNCwg NDAwMDgsICA2MDAxNiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ CTI2NjQ0LCA1MzI5MiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2 NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF9TR0ldID0geworCQk3NDIwLCAgMTQ4NDQsICAyMjI3Miwg IDI5Njk2LCAgNDQ1NDQsICA1OTM5NiwgIDY1NTMyLCAgNjU1MzIsCisJCTE0ODMyLCAyOTY2OCwg IDQ0NTA0LCAgNTkzNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjIyMzIs IDQ0NDY0LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAor CQkyOTYxNiwgNTkyMzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAg NjU1MzIsCisJfQorfTsKKwogdm9pZAogaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50IHR5 cGUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqcmF0ZWN0bCkKIHsKQEAgLTY2LDEw ICs5NCwxMSBAQAogfQogCiB2b2lkCi1pZWVlODAyMTFfcmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVl ODAyMTF2YXAgKnZhcCkKK2llZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZh cCAqdmFwLCB1aW50MzJfdCBjYXBhYmlsaXRpZXMpCiB7CiAJaWYgKHZhcC0+aXZfcmF0ZSA9PSBy YXRlY3Rsc1tJRUVFODAyMTFfUkFURUNUTF9OT05FXSkKIAkJaWVlZTgwMjExX3JhdGVjdGxfc2V0 KHZhcCwgSUVFRTgwMjExX1JBVEVDVExfQU1SUik7CisJdmFwLT5pdl9yYXRlLmlyX2NhcGFiaWxp dGllcyA9IGNhcGFiaWxpdGllczsKIAl2YXAtPml2X3JhdGUtPmlyX2luaXQodmFwKTsKIH0KIApA QCAtOTAsMyArMTE5LDk3IEBACiAJfQogCXZhcC0+aXZfcmF0ZSA9IHJhdGVjdGxzW3R5cGVdOwog fQorCit2b2lkCitpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfbm9kZSAqbmksCisJCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5m bykKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKKwljb25z dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0gaWMtPmljX3J0OworCXN0cnVjdCBpZWVlODAyMTFf cmNfc2VyaWVzICpyYyA9IHJjX2luZm8tPnJpX3JjOworCWludCBzaG9ydFByZWFtYmxlID0gcmNf aW5mby0+cmlfc2hvcnRQcmVhbWJsZTsKKwl1aW50OF90IHJhdGU7CisJaW50IGk7CisKKwkvKiBN YWtlIHN1cmUgdGhhdCByYXRlIGNvbnRyb2wgY29kZSBkb2Vzbid0IG1lc3MgaXQgdXAuCisJICog SWYgZW5hYmxlIHJ0cy9jdHMgYW5kIGlzIHByZS04MDIuMTFuLCBibGFuayB0cmllcyAxLCAyLCAz IAorCSAqLworCisJaWYgKCEgKHZhcC0+aXZfcmF0ZS0+aXJfY2FwYWJpbGl0aWVzICYgSUVFRTgw MjExX1JBVEVDVExfQ0FQX01SUlBST1QpKQorCXsKKwkJZm9yIChpID0gMTsgaSA8IElFRUU4MDIx MV9SQVRFQ1RMX05VTTsgaSsrKQorCQl7CisJCQlpZiAocmNbMF0uZmxhZ3MgJiBJRUVFODAyMTFf UkFURUNUTF9SVFNDVFNfRkxBRykKKwkJCQlyY1tpXS50cmllcyA9IDA7CisJCQlyY1tpXS5mbGFn cyAmPSB+SUVFRTgwMjExX1JBVEVDVExfUlRTQ1RTX0ZMQUc7IAorCQl9CisJfQorCisJZm9yIChp ID0gMDsgaSA8IElFRUU4MDIxMV9SQVRFQ1RMX05VTTsgaSsrKSB7CisJCQorCQlpZiAocmNbaV0u dHJpZXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJhdGUgPSBydC0+aW5mb1tyY1tpXS5yaXhd LnJhdGVDb2RlOworCisJCS8qCisJCSAqIE9ubHkgZW5hYmxlIHNob3J0IHByZWFtYmxlIGZvciBs ZWdhY3kgcmF0ZXMKKwkJICovCisJCWlmICgoISBJU19IVF9SQVRFKHJhdGUpKSAmJiBzaG9ydFBy ZWFtYmxlKQorCQkJcmF0ZSB8PSBydC0+aW5mb1tyY1tpXS5yaXhdLnNob3J0UHJlYW1ibGU7CisK KwkJLyoKKwkJICogU2F2ZSB0aGlzLCB1c2VkIGJ5IHRoZSBUWCBhbmQgY29tcGxldGlvbiBjb2Rl CisJCSAqLworCQlyY1tpXS5yYXRlY29kZSA9IHJhdGU7CisKKwkJLyogT25seSBlbmFibGUgc2hv cnRnaSwgMjA0MCwgZHVhbC1zdHJlYW0gaWYgSFQgaXMgc2V0ICovCisJCWlmIChJU19IVF9SQVRF KHJhdGUpKSB7CisJCQlyY1tpXS5mbGFncyB8PSBJRUVFODAyMTFfUkFURUNUTF9IVF9GTEFHOwor CisJCQkvKgorCQkJICogWFhYIFRPRE86IExEUEMKKwkJCSAqLworCisJCQkvKgorCQkJICogRHVh bCAvIFRyaXBsZSBzdHJlYW0gcmF0ZT8KKwkJCSAqLworCQkJaWYgKEhUX1JDXzJfU1RSRUFNUyhy YXRlKSA9PSAyKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0RTX0ZMQUc7 CisJCQllbHNlIGlmIChIVF9SQ18yX1NUUkVBTVMocmF0ZSkgPT0gMykKKwkJCQlyY1tpXS5mbGFn cyB8PSBJRUVFODAyMTFfUkFURUNUTF9UU19GTEFHOworCQl9CisKKwkJLyoKKwkJICogQ2FsY3Vs YXRlIHRoZSBtYXhpbXVtIFRYIHBvd2VyIGNhcCBmb3IgdGhlIGN1cnJlbnQKKwkJICogbm9kZS4g CisJCSAqIFJhdGUgY29udHJvbCBhbGdvIGNhbid0IGNvbnRyb2wgVFggcG93ZXIgYnkgbm93Lgor CQkgKi8KKwkJcmNbaV0udHhfcG93ZXJfY2FwID0gaWVlZTgwMjExX2dldF9ub2RlX3R4cG93ZXIo bmkpOworCQkKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIDRtcyBmcmFtZSBsZW5n dGggYmFzZWQKKwkJICogb24gdGhlIE1DUyByYXRlLCBTR0kgYW5kIGNoYW5uZWwgd2lkdGggZmxh Z3MuCisJCSAqLworCQlpZiAoKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfSFRfRkxB RykgJiYKKwkJICAgIChIVF9SQ18yX01DUyhyYXRlKSA8IDMyKSkgeworCQkJaW50IGo7CisJCQlp ZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9DVzQwX0ZMQUcpIHsKKwkJCQlpZiAo cmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9TR0lfRkxBRykKKwkJCQkJaiA9IE1DU19I VDQwX1NHSTsKKwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQ0MDsKKwkJCX0gZWxzZSB7CisJCQkJ aWYgKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfU0dJX0ZMQUcpCisJCQkJCWogPSBN Q1NfSFQyMF9TR0k7CisJCQkJZWxzZQorCQkJCQlqID0gTUNTX0hUMjA7CisJCQl9CisJCQlyY1tp XS5tYXg0bXNmcmFtZWxlbiA9CisJCQkgICAgbWF4XzRtc19mcmFtZWxlbltqXVtIVF9SQ18yX01D UyhyYXRlKV07CisJCX0gZWxzZQorCQkJcmNbaV0ubWF4NG1zZnJhbWVsZW4gPSAwOworCX0KK30K KwpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g c3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5 cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCShyZXZpc2lvbiAyNTU4NzIpCkBAIC0xLDUg KzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJl ZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJl ZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAt MjQsNiArMjUsOCBAQAogICoKICAqICRGcmVlQlNEJAogICovCisjaWZuZGVmIF9ORVQ4MDIxMV9J RUVFODAyMTFfUkFURUNUTF9IXworI2RlZmluZSBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExf SF8KIAogZW51bSBpZWVlODAyMTFfcmF0ZWFsZ3MgewogCUlFRUU4MDIxMV9SQVRFQ1RMX0FNUlIJ CT0gMCwKQEAgLTM0LDExICszNyw3NCBAQAogCUlFRUU4MDIxMV9SQVRFQ1RMX01BWAogfTsKIAor ZW51bSB7CisJTUNTX0hUMjAsCisJTUNTX0hUMjBfU0dJLAorCU1DU19IVDQwLAorCU1DU19IVDQw X1NHSSwKK307CisKICNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFhfU1VDQ0VTUwkxCiAjZGVm aW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RYX0ZBSUxVUkUJMAogCisjZGVmaW5lCUlFRUU4MDIxMV9S QVRFQ1RMX1RSVUUJCTEKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkFMU0UJCTAKKworI2Rl ZmluZQlJRUVFODAyMTFfUkFURUNUTF9OVU0JCTQKKworI2RlZmluZQlJRUVFODAyMTFfUkFURUNU TF9EU19GTEFHCQkweDAxCS8qIGR1YWwtc3RyZWFtIHJhdGUgKi8KKyNkZWZpbmUJSUVFRTgwMjEx X1JBVEVDVExfQ1c0MF9GTEFHCQkweDAyCS8qIHVzZSBIVDQwICovCisjZGVmaW5lCUlFRUU4MDIx MV9SQVRFQ1RMX1NHSV9GTEFHCQkweDA0CS8qIHVzZSBzaG9ydC1HSSAqLworI2RlZmluZQlJRUVF ODAyMTFfUkFURUNUTF9IVF9GTEFHCQkweDA4CS8qIHVzZSBIVCAqLworI2RlZmluZQlJRUVFODAy MTFfUkFURUNUTF9SVFNDVFNfRkxBRwkweDEwCS8qIGVuYWJsZSBSVFMvQ1RTIHByb3RlY3Rpb24g Ki8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfU1RCQ19GTEFHCQkweDIwCS8qIGVuYWJsZSBT VEJDICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RTX0ZMQUcJCTB4NDAJLyogdHJpcGxl LXN0cmVhbSByYXRlICovCisKKy8qIEhhcmR3YXJlIENBUHMgY2hpcCBvZmZlcmVkIHRvIHJhdGUg Y29udHJvbCBjb2RlICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlIJCQkweDAx CS8qIHN1cHBvcnQgTVJSICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9U CQkweDAyCS8qIHN1cHBvcnQgTVJSICsgcHJvdGVjdCAqLworI2RlZmluZQlJRUVFODAyMTFfUkFU RUNUTF9DQVBfTVVMVFhDSEFJTgkweDA0CS8qIGhhcyBtb3JlIHRoYW4gMSB0eGNoYWluICovCisK KyNkZWZpbmUgSVNfVkFQX0hUKHZhcCkJKCh2YXApLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRD X0hUKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0ZSkgJiAweDgwKQorI2Rl ZmluZSBIVF9SQ18yX01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisjZGVmaW5lIEhUX1JDXzJf U1RSRUFNUyhfcmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorCisKK2V4dGVybiBp bnQgbWF4XzRtc19mcmFtZWxlbls0XVszMl07CisKK3N0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVz IHsKKwl1aW50OF90IHJpeDsJCS8qIHJhdGV0YWJsZSBpbmRleCwgbm90IHJhdGUgY29kZSAqLwor CXVpbnQ4X3QgcmF0ZWNvZGU7CS8qIGhhcmR3YXJlIHJhdGUgY29kZSAqLworCXVpbnQ4X3QgdHJp ZXM7CisJdWludDhfdCB0eF9wb3dlcl9jYXA7CisJdWludDE2X3QgZmxhZ3M7CisJdWludDE2X3Qg bWF4NG1zZnJhbWVsZW47Cit9OworCisvKiAgKi8KK3N0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyB7 CisJc3RydWN0IGllZWU4MDIxMV9yY19zZXJpZXMgcmlfcmNbSUVFRTgwMjExX1JBVEVDVExfTlVN XTsKKwlpbnQgcmlfZnJhbWVsZW47CisJaW50IHJpX3Nob3J0UHJlYW1ibGU7CisKKwkvKiBUWCBp bmZvICovCisJaW50IHJpX3N1Y2Nlc3M7CQkvKiBUWCBzdWNjZXNzIG9yIG5vdCAqLworCWludCBy aV9va2NudDsJCS8qIFRYIG9rIHdpdGggb3Igd2l0aG91dCByZXRyeSAqLworCWludCByaV9mYWls Y250OwkJLyogVFggcmV0cnktZmFpbCBjb3VudCAqLworCWludCByaV90eGNudDsJCS8qIFRYIGNv dW50ICovCisJaW50IHJpX3JldHJ5Y250OwkvKiBUWCByZXRyeSBjb3VudCAqLworCWludCByaV9z aG9ydHJldHJ5OworCWludCByaV9sb25ncmV0cnk7CisJaW50IHJpX2ZpbmFsdHNpOworCWludCBy aV90eHJhdGU7CQkvKiBodyB0eCByYXRlICovCit9OworCiBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVj dGwgewogCWNvbnN0IGNoYXIgKmlyX25hbWU7CisJdWludDMyX3QgaXJfY2FwYWJpbGl0aWVzOwkJ LyogaGFyZHdhcmUgY2FwYWJpbGl0aWVzIG9mZmVyZWQgdG8gcmMgKi8KKwogCWludAkoKmlyX2F0 dGFjaCkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIAl2b2lkCSgqaXJfZGV0YWNoKShj b25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwogCXZvaWQJKCppcl9pbml0KShzdHJ1Y3QgaWVl ZTgwMjExdmFwICopOwpAQCAtNDYsNiArMTEyLDcgQEAKIAl2b2lkCSgqaXJfbm9kZV9pbml0KShz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CiAJdm9pZAkoKmlyX25vZGVfZGVpbml0KShzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKik7CiAJaW50CSgqaXJfcmF0ZSkoc3RydWN0IGllZWU4MDIxMV9ub2Rl ICosIHZvaWQgKiwgdWludDMyX3QpOworCXZvaWQJKCppcl9yYXRlcykoc3RydWN0IGllZWU4MDIx MV9ub2RlICosIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqKTsKIAl2b2lkCSgqaXJfdHhfY29t cGxldGUpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKiwKIAkgICAgCQkJICBjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX25vZGUgKiwgaW50LAogCSAgICAJCQkgIHZvaWQgKiwgdm9pZCAqKTsKQEAg LTU3LDggKzEyNCwxMCBAQAogCiB2b2lkCWllZWU4MDIxMV9yYXRlY3RsX3JlZ2lzdGVyKGludCwg Y29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsICopOwogdm9pZAlpZWVlODAyMTFfcmF0ZWN0 bF91bnJlZ2lzdGVyKGludCk7Ci12b2lkCWllZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGll ZWU4MDIxMXZhcCAqKTsKK3ZvaWQJaWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgw MjExdmFwICosIHVpbnQzMl90KTsKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfc2V0KHN0cnVjdCBp ZWVlODAyMTF2YXAgKiwgaW50KTsKK3ZvaWQJaWVlZTgwMjExX3JhdGVjdGxfY29tcGxldGVfcmNm bGFncyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgCisJCXN0cnVjdCBpZWVlODAyMTFf cmNfaW5mbyopCiAKIE1BTExPQ19ERUNMQVJFKE1fODAyMTFfUkFURUNUTCk7CiAKQEAgLTkzLDYg KzE2MiwxNSBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxf cmF0ZXMoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZv ICpyY19pbmZvKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92 YXA7CisKKwl2YXAtPml2X3JhdGUtPmlyX3JhdGVzKG5pLCByY19pbmZvKTsKKwlpZWVlODAyMTFf cmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKG5pLCByY19pbmZvKTsKK30KKworc3RhdGljIHZvaWQg X19pbmxpbmUKIGllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVl ODAyMTF2YXAgKnZhcCwKICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQg c3RhdHVzLCB2b2lkICphcmcxLCB2b2lkICphcmcyKQogewpAQCAtMTE1LDMgKzE5Myw0MCBAQAog CQlyZXR1cm47CiAJdmFwLT5pdl9yYXRlLT5pcl9zZXRpbnRlcnZhbCh2YXAsIG1zZWNzKTsKIH0K Kworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAoY29u c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25v ZGUgKm5pKQoreworCXJldHVybiBJU19WQVBfSFQodmFwKSAmJiAobmktPm5pX2NodyA9PSA0MCk7 Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3RsX2hhc2NhcF9zaG9y dGdpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJY29uc3Qgc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAoISBJU19WQVBfSFQodmFwKSkKKwkJcmV0dXJuIElFRUU4 MDIxMV9SQVRFQ1RMX0ZBTFNFOworCisJaWYgKG5pLT5uaV9jaHcgPT0gNDAgJiYKKwkJCXZhcC0+ aXZfaHRjYXBzICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCAmJgorCQkJbmktPm5pX2h0Y2Fw ICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCkKKwkJcmV0dXJuIElFRUU4MDIxMV9SQVRFQ1RM X1RSVUU7CisKKwlpZiAobmktPm5pX2NodyA9PSAyMCAmJgorCQkJdmFwLT5pdl9odGNhcHMgJiBJ RUVFODAyMTFfSFRDQVBfU0hPUlRHSTIwICYmCisJCQluaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFf SFRDQVBfU0hPUlRHSTIwKQorCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKK30KKwor CitzdGF0aWMgaW50IF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfc3RiYyhjb25z dCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9k ZSAqbmkpCit7CisgICByZXR1cm4gSVNfVkFQX0hUKHZhcCkgJiYgKHZhcC0+aXZfaHRjYXBzICYg SUVFRTgwMjExX0hUQ0FQX1RYU1RCQykgJiYKKwkJCSAgICAobmktPm5pX2h0Y2FwICYgSUVFRTgw MjExX0hUQ0FQX1JYU1RCQ18xU1RSRUFNKSAmJgorCQkJICAgICh2YXAtPml2X3JhdGUtPmlyX2Nh cGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOKTsKK30KKworI2Vu ZGlmCg== --047d7b3434b695a01504e3d34963--