From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 78F573858D20 for ; Tue, 22 Nov 2022 13:40:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 78F573858D20 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1669124420; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=i53Gs8hm12YLllaK21JMJYjdpZTIbcPXRBAtbga6t4A=; b=Hw9Aew/Ifr/nHhiPj68WDmpAiHHEllc2CeHhrKK+MAe5+lt4NE88KXM4VXZxbgckYRiHy1 AT2q7HYupisWpfNbx2HkKaA+IlMtb2o50/WjWu4MVlhd4MkNpH84GREXLNzjR1/k9d/SY1 c5RowBr0CVeC8rkexHNgLgbktM8/kN4= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-635-w3YwEYOTODSrXcSic4GPtA-1; Tue, 22 Nov 2022 08:40:17 -0500 X-MC-Unique: w3YwEYOTODSrXcSic4GPtA-1 Received: by mail-wr1-f72.google.com with SMTP id g14-20020adfa48e000000b00241bfca9693so3274648wrb.8 for ; Tue, 22 Nov 2022 05:40:17 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=9Rb9jniTj1eNzqDwEzvd3MjxGNK0WlX3sO4oT+1JPOA=; b=l+wLmH9N/TPRikzUVF9x2pD0X/pEK/xNO3ONp3rkl/nBF8ZJOwGE0zYbR0OEZF66Qs ibUVU4AW7SPa8LTx2Gr9lhVKRAQe7KSTF4s9qtzFxvLa0ll1D9FxNoCFjr68oZbYxwuT I90SM1UYFK2e//qd+3T5FXIkEVTHe4PpHK3/vbsQKjnimmKEEYQ6KwrtnW/fvcvR0JFX VuLs87tdxFvZjlxIlYtqDS99b2qql9i84JxRrjZ3Ca/F2qwR70M7hrZxroZXT13Ty33w JMSjxFE0EkHDLDWEHQNsWNji2+Hm7cbek9wlQJMGAXSHVxkINemj3FaZqa/Rf/VH8ObQ 6qqw== X-Gm-Message-State: ANoB5pn/+OEEy1shz8dx07alfgedLgNCKHdNoPAltyOBwisz4JrF7rjF M8kif1MEEm5B7A4l/ngwQLMFEuZjCkCYHGQ4Dv0JPgx1v1vAzV2vV19KC7PInamI77DyXpfmIrp ZhTuf0HnEH/Wz4n1WmA== X-Received: by 2002:a05:6000:105:b0:236:64e6:8c04 with SMTP id o5-20020a056000010500b0023664e68c04mr14037660wrx.579.1669124416446; Tue, 22 Nov 2022 05:40:16 -0800 (PST) X-Google-Smtp-Source: AA0mqf6CdjEnvTh0fXnq8eYfYsno/DaYdGuoMebZ7lx6VKnsPhUYTPHLpG0PwaYp3sdl/KCD2uY9Kw== X-Received: by 2002:a05:6000:105:b0:236:64e6:8c04 with SMTP id o5-20020a056000010500b0023664e68c04mr14037637wrx.579.1669124415840; Tue, 22 Nov 2022 05:40:15 -0800 (PST) Received: from [192.168.1.2] ([139.47.35.255]) by smtp.gmail.com with ESMTPSA id t11-20020adff60b000000b0022e035a4e93sm14252364wrp.87.2022.11.22.05.40.13 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 22 Nov 2022 05:40:14 -0800 (PST) Message-ID: <84f3725f-7635-2ff1-22d7-1dcdb544cdfd@redhat.com> Date: Tue, 22 Nov 2022 14:40:13 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH] Remove legacy VRP (maybe?) To: Richard Biener Cc: Jeff Law , Jakub Jelinek , "MacLeod, Andrew" , gcc-patches References: <2eb36356-ffbf-6c8b-2824-08e204280d52@gmail.com> From: Aldy Hernandez In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="------------G9xgfjfWgeHMYxFMQM0OoNGB" Content-Language: en-US X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_ASCII_DIVIDERS,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------G9xgfjfWgeHMYxFMQM0OoNGB Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 11/22/22 10:22, Richard Biener wrote: > On Tue, Nov 22, 2022 at 10:04 AM Aldy Hernandez wrote: >> >> >> >> On 11/22/22 09:25, Richard Biener wrote: >>> On Tue, Nov 22, 2022 at 9:24 AM Richard Biener >>> wrote: >>>> >>>> On Mon, Nov 21, 2022 at 5:49 PM Jeff Law wrote: >>>>> >>>>> >>>>> On 11/21/22 09:35, Aldy Hernandez via Gcc-patches wrote: >>>>>> I've been playing around with removing the legacy VRP code for the >>>>>> next release. It's a layered onion to get this right, but the first >>>>>> bit is pretty straightforward and may be useful for this release. >>>>>> Basically, it entails removing the old VRP pass itself, along with >>>>>> value_range_equiv which have no producers left. The current users of >>>>>> value_range_equiv don't put anything in the equivalence bitmaps, so >>>>>> they're basically behaving like plain value_range. >>>>>> >>>>>> I removed as much as possible without having to change any behavior, >>>>>> and this is what I came up with. Is this something that would be >>>>>> useful for this release? Would it help release managers have less >>>>>> unused cruft in the tree? >>>>>> >>>>>> Neither Andrew nor I have any strong feelings here. We don't foresee >>>>>> the legacy code changing at all in the offseason, so we can just >>>>>> accumulate these patches in local trees. >>>>> >>>>> I'd lean towards removal after gcc-13 releases. >>>> >>>> I think removing the ability to switch to the old implementation easens >>>> maintainance so I'd prefer to have this before the gcc-13 release. >>>> >>>> So please go ahead. >>> >>> Btw, ASSERT_EXPR should also go away with this, no? >> >> Ah yes, for everything except ipa-*.* which uses it internally (and sets >> it in its internal structures): >> >> - ASSERT_EXPR means that only the value in operand is allowed to >> pass >> through (without any change), for all other values the result is >> unknown. > > Ick. But yeah, I can see how 'ASSERT_EXPR' looked nice to use here > (but it's only a distinct value, so TARGET_OPTION_NODE would have > worked here as well) > >> I can remove all other uses, including any externally visible documentation. > > Works for me. Documented and added change log entries. Retested on x86-64 Linux. There are three follow-up patches removing ASSERT_EXPR which I'll post shortly. OK for trunk? Aldy --------------G9xgfjfWgeHMYxFMQM0OoNGB Content-Type: text/x-patch; charset=UTF-8; name="0001-Remove-unused-legacy-VRP-code.patch" Content-Disposition: attachment; filename="0001-Remove-unused-legacy-VRP-code.patch" Content-Transfer-Encoding: base64 RnJvbSA2NWFiNmVhNjc1Y2JlYWNiNjBiOWY1ZjBlMWEzZGI2M2I5MDgwZjJjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogU2F0LCAxOSBOb3YgMjAyMiAxMToxMToyNSArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92 ZSB1bnVzZWQgbGVnYWN5IFZSUCBjb2RlLgoKUmVtb3ZlcyB1bnVzZWQgbGVnYWN5IFZSUCBjb2Rl LiAgVGhlIGxlZ2FjeSBtb2RlIGluIHZhbHVlX3JhbmdlJ3MgaXMKc3RpbGwgYXJvdW5kLCBhcyBp dCBjYW4ndCBiZSB0cml2aWFsbHkgZGVsZXRlZC4KCmlyYW5nZTo6c3ltYm9saWNfcCgpIGhhcyBh bHNvIGJlZW4gZGVsZXRlZCwgYXMgdGhlcmUgYXJlIG5vIHByb2R1Y2VycwpvZiBzeW1ib2xpY3Mg bGVmdC4gIFdlbGwsIHRlY2huaWNhbGx5IGdldF92cl9mb3JfY29tcGFyaXNvbiBpbgpzaW1wbGlm eV91c2luZ19yYW5nZXMgc3RpbGwgY3JlYXRlcyBhIHN5bWJvbGljIHdpdGggYW4gU1NBIG5hbWU6 CgogIC8qIElmIG5hbWUgTl9pIGRvZXMgbm90IGhhdmUgYSB2YWxpZCByYW5nZSwgdXNlIE5faSBh cyBpdHMgb3duCiAgICAgcmFuZ2UuICBUaGlzIGFsbG93cyB1cyB0byBjb21wYXJlIGFnYWluc3Qg bmFtZXMgdGhhdCBtYXkKICAgICBoYXZlIE5faSBpbiB0aGVpciByYW5nZXMuICAqLwogIGlmICh2 ci0+dmFyeWluZ19wICgpIHx8IHZyLT51bmRlZmluZWRfcCAoKSkKICAgIHsKICAgICAgdGVtLT5z ZXQgKHNzYV9uYW1lIChpKSk7CiAgICAgIHJldHVybiB0ZW07CiAgICB9CgpCdXQgdGhpcyBpcyBv bmx5IGJlaW5nIGNhbGxlZCBmcm9tCnZycF9ldmFsdWF0ZV9jb25kaXRpb25hbF93YXJudl93aXRo X29wcygpIG9uIHRoZSBub24gb3ZlcmZsb3cgcGF0aCwKd2hpY2ggbmV2ZXIgZ2V0cyBleGVjdXRl ZC4gIEkgaGF2ZSB2ZXJpZmllZCBzbyB3aXRoIGEgY2FyZWZ1bGx5CmNvbnN0cnVjdGVkIGFzc2Vy dCBpbiB0ZXN0aW5nLiAgSSdsbCByZW1vdmUgdGhlIG5vbi1vdmVyZmxvdyBwYXRoIG5leHQKcmVs ZWFzZS4KCldpdGggdGhpcyBwYXRjaCB2ci12YWx1ZXMuY2MgbWVsdHMgYXdheSB0byBzaW1wbGlm eV91c2luZ19yYW5nZXMsIGJ1dApJIGhhdmUgYXZvaWRlZCBhbnkgcmVuYW1pbmcgb2YgYWN0dWFs IGZpbGVzLCBzaW5jZSB3ZSBoYXZlIHBsYW5zIGZvcgpjb25zb2xpZGF0aW9uIG9mIG90aGVyIGZv bGRpbmcgd2l0aCByYW5nZXMgZm9yIHRoZSBuZXh0IHJlbGVhc2UuCgpnY2MvQ2hhbmdlTG9nOgoK CSogZG9jL2ludm9rZS50ZXhpOiBSZW1vdmUgZG9jcyBmb3IgbWF4LXZycC1zd2l0Y2gtYXNzZXJ0 aW9ucywKCXZycDEtbW9kZSwgYW5kIHZycDItbW9kZS4KCSogcGFyYW1zLm9wdDogU2FtZS4KCSog cmFuZ2Utb3AuY2MgKG1hc2tlZF9pbmNyZW1lbnQpOiBNb3ZlIGZyb20gdHJlZS12cnAuY2MuCgkq IHRyZWUtdnJwLmNjIChjbGFzcyBsaXZlX25hbWVzKTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6Omlu aXRfYml0bWFwX2lmX25lZWRlZCk6IFJlbW92ZS4KCShsaXZlX25hbWVzOjpibG9ja19oYXNfbGl2 ZV9uYW1lc19wKTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6OmNsZWFyX2Jsb2NrKTogUmVtb3ZlLgoJ KGxpdmVfbmFtZXM6Om1lcmdlKTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6OnNldCk6IFJlbW92ZS4K CShsaXZlX25hbWVzOjpjbGVhcik6IFJlbW92ZS4KCShsaXZlX25hbWVzOjpsaXZlX25hbWVzKTog UmVtb3ZlLgoJKGxpdmVfbmFtZXM6On5saXZlX25hbWVzKTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6 OmxpdmVfb25fYmxvY2tfcCk6IFJlbW92ZS4KCShsaXZlX25hbWVzOjpsaXZlX29uX2VkZ2VfcCk6 IFJlbW92ZS4KCShnZXRfc2luZ2xlX3N5bWJvbCk6IE1ha2Ugc3RhdGljLgoJKGJ1aWxkX3N5bWJv bGljX2V4cHIpOiBSZW1vdmUuCgkoYWRqdXN0X3N5bWJvbGljX2JvdW5kKTogUmVtb3ZlLgoJKGNv bWJpbmVfYm91bmQpOiBSZW1vdmUuCgkoc2V0X3ZhbHVlX3JhbmdlX3dpdGhfb3ZlcmZsb3cpOiBS ZW1vdmUuCgkoZXh0cmFjdF9yYW5nZV9mcm9tX3BvaW50ZXJfcGx1c19leHByKTogUmVtb3ZlLgoJ KGV4dHJhY3RfcmFuZ2VfZnJvbV9wbHVzX21pbnVzX2V4cHIpOiBSZW1vdmUuCgkoZHJvcF91bmRl ZmluZXNfdG9fdmFyeWluZyk6IFJlbW92ZS4KCShyYW5nZV9mb2xkX2JpbmFyeV9zeW1ib2xpY3Nf cCk6IFJlbW92ZS4KCShyYW5nZV9mb2xkX3VuYXJ5X3N5bWJvbGljc19wKTogUmVtb3ZlLgoJKHJh bmdlX2ZvbGRfYmluYXJ5X2V4cHIpOiBSZW1vdmUuCgkoaW5mZXJfdmFsdWVfcmFuZ2UpOiBSZW1v dmUuCgkoZHVtcF9hc3NlcnRfaW5mbyk6IFJlbW92ZS4KCShkdW1wX2Fzc2VydHNfaW5mbyk6IFJl bW92ZS4KCShhZGRfYXNzZXJ0X2luZm8pOiBSZW1vdmUuCgkoZXh0cmFjdF9jb2RlX2FuZF92YWxf ZnJvbV9jb25kX3dpdGhfb3BzKTogUmVtb3ZlLgoJKG1hc2tlZF9pbmNyZW1lbnQpOiBNb3ZlIHRv IHJhbmdlLW9wLmNjLgoJKHJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8yKTogUmVtb3ZlLgoJKGZp bmRfY2FzZV9sYWJlbF9pbmRleCk6IFJlbW92ZS4KCShmaW5kX2Nhc2VfbGFiZWxfcmFuZ2UpOiBS ZW1vdmUuCgkocmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzEpOiBSZW1vdmUuCgkoaXNfbWFza2Vk X3JhbmdlX3Rlc3QpOiBSZW1vdmUuCgkocmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yKTogUmVtb3Zl LgoJKHN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCk6IFJlbW92ZS4KCShzdHJ1Y3QgY2FzZV9pbmZv KTogUmVtb3ZlLgoJKHN0cnVjdCBhc3NlcnRfbG9jdXMpOiBSZW1vdmUuCgkoY2xhc3MgdnJwX2Fz c2VydHMpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OmJ1aWxkX2Fzc2VydF9leHByX2Zvcik6IFJl bW92ZS4KCSh2cnBfYXNzZXJ0czo6ZHVtcCk6IFJlbW92ZS4KCSh2cnBfYXNzZXJ0czo6cmVnaXN0 ZXJfbmV3X2Fzc2VydF9mb3IpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OmZpbmlzaF9yZWdpc3Rl cl9lZGdlX2Fzc2VydF9mb3IpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OmZpbmRfY29uZGl0aW9u YWxfYXNzZXJ0cyk6IFJlbW92ZS4KCSh2cnBfYXNzZXJ0czo6Y29tcGFyZV9jYXNlX2xhYmVscyk6 IFJlbW92ZS4KCSh2cnBfYXNzZXJ0czo6ZmluZF9zd2l0Y2hfYXNzZXJ0cyk6IFJlbW92ZS4KCSh2 cnBfYXNzZXJ0czo6ZmluZF9hc3NlcnRfbG9jYXRpb25zX2luX2JiKTogUmVtb3ZlLgoJKHZycF9h c3NlcnRzOjpmaW5kX2Fzc2VydF9sb2NhdGlvbnMpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OnBy b2Nlc3NfYXNzZXJ0X2luc2VydGlvbnNfZm9yKTogUmVtb3ZlLgoJKHZycF9hc3NlcnRzOjpjb21w YXJlX2Fzc2VydF9sb2MpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OnByb2Nlc3NfYXNzZXJ0X2lu c2VydGlvbnMpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6Omluc2VydF9yYW5nZV9hc3NlcnRpb25z KTogUmVtb3ZlLgoJKHZycF9hc3NlcnRzOjphbGxfaW1tX3VzZXNfaW5fc3RtdF9vcl9mZWVkX2Nv bmQpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OnJlbW92ZV9yYW5nZV9hc3NlcnRpb25zKTogUmVt b3ZlLgoJKGNsYXNzIHZycF9wcm9wKTogUmVtb3ZlLgoJKHZycF9wcm9wOjppbml0aWFsaXplKTog UmVtb3ZlLgoJKGVudW0gc3NhX3Byb3BfcmVzdWx0KTogUmVtb3ZlLgoJKHZycF9wcm9wOjp2aXNp dF9zdG10KTogUmVtb3ZlLgoJKHZycF9wcm9wOjp2aXNpdF9waGkpOiBSZW1vdmUuCgkodnJwX3By b3A6OmZpbmFsaXplKTogUmVtb3ZlLgoJKGNsYXNzIHZycF9mb2xkZXIpOiBSZW1vdmUuCgkodnJw X2ZvbGRlcjo6Zm9sZF9wcmVkaWNhdGVfaW4pOiBSZW1vdmUuCgkodnJwX2ZvbGRlcjo6Zm9sZF9z dG10KTogUmVtb3ZlLgoJKHZycF9mb2xkZXI6OnNpbXBsaWZ5X2Nhc3RlZF9jb25kcyk6IFJlbW92 ZS4KCShleGVjdXRlX3ZycCk6IFJlbW92ZS4KCSogdHJlZS12cnAuaCAoc3RydWN0IGFzc2VydF9p bmZvKTogUmVtb3ZlLgoJKHJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcik6IFJlbW92ZS4KCShzdG10 X2ludGVyZXN0aW5nX2Zvcl92cnApOiBSZW1vdmUuCgkoaW5mZXJfdmFsdWVfcmFuZ2UpOiBSZW1v dmUuCgkoZ2V0X3NpbmdsZV9zeW1ib2wpOiBSZW1vdmUuCgkobWFza2VkX2luY3JlbWVudCk6IFJl bW92ZS4KCShleGVjdXRlX3Jhbmdlcl92cnApOiBSZW1vdmUuCgkqIHZhbHVlLXJhbmdlLmNjIChp cmFuZ2U6OmxlZ2FjeV9sb3dlcl9ib3VuZCk6IFJlbW92ZSBjYWxsIHRvIHN5bWJvbGljX3AuCgko aXJhbmdlOjpsZWdhY3lfdXBwZXJfYm91bmQpOiBTYW1lLgoJKGlyYW5nZTo6c3ltYm9saWNfcCk6 IFJlbW92ZS4KCShpcmFuZ2U6OmNvbnRhaW5zX3ApOiBSZW1vdmUgY2FsbCB0byBzeW1ib2xpY19w LgoJKiB2YWx1ZS1yYW5nZS5oIChpcmFuZ2U6OnN5bWJvbGljX3ApOiBSZW1vdmUuCgkqIHZyLXZh bHVlcy5jYyAoc2V0X3ZhbHVlX3JhbmdlX3RvX25vbm5lZ2F0aXZlKTogUmVtb3ZlLgoJKHNldF92 YWx1ZV9yYW5nZV90b190cnV0aHZhbHVlKTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6Z2V0X2xhdHRp Y2VfZW50cnkpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpnZXRfdmFsdWVfcmFuZ2UpOiBSZW1vdmUu CgkodnJfdmFsdWVzOjpyYW5nZV9vZl9leHByKTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6dmFsdWVf b2ZfZXhwcik6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OnZhbHVlX29uX2VkZ2UpOiBSZW1vdmUuCgko dnJfdmFsdWVzOjp2YWx1ZV9vZl9zdG10KTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6c2V0X2RlZl90 b192YXJ5aW5nKTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6c2V0X2RlZnNfdG9fdmFyeWluZyk6IFJl bW92ZS4KCSh2cl92YWx1ZXM6OnVwZGF0ZV92YWx1ZV9yYW5nZSk6IFJlbW92ZS4KCShzeW1ib2xp Y19yYW5nZV9iYXNlZF9vbl9wKTogUmVtb3ZlLgoJKGdpbXBsZV9hc3NpZ25fbm9uemVyb19wKTog UmVtb3ZlLgoJKGdpbXBsZV9zdG10X25vbnplcm9fcCk6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OnZy cF9zdG10X2NvbXB1dGVzX25vbnplcm8pOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpvcF93aXRoX2Nv bnN0YW50X3NpbmdsZXRvbl92YWx1ZV9yYW5nZSk6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OmV4dHJh Y3RfcmFuZ2VfZm9yX3Zhcl9mcm9tX2NvbXBhcmlzb25fZXhwcik6IFJlbW92ZS4KCSh2cl92YWx1 ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9hc3NlcnQpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpleHRy YWN0X3JhbmdlX2Zyb21fc3NhX25hbWUpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpleHRyYWN0X3Jh bmdlX2Zyb21fYmluYXJ5X2V4cHIpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpleHRyYWN0X3Jhbmdl X2Zyb21fdW5hcnlfZXhwcik6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJv bV9jb25kX2V4cHIpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fY29t cGFyaXNvbik6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV91YnNhbl9i dWlsdGluKTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9iYXNpYyk6IFJlbW92 ZS4KCSh2cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9hc3NpZ25tZW50KTogUmVtb3ZlLgoJ KHZyX3ZhbHVlczo6YWRqdXN0X3JhbmdlX3dpdGhfc2Nldik6IFJlbW92ZS4KCSh2cl92YWx1ZXM6 OmR1bXApOiBSZW1vdmUuCgkodnJfdmFsdWVzOjp2cl92YWx1ZXMpOiBSZW1vdmUuCgkodnJfdmFs dWVzOjp+dnJfdmFsdWVzKTogUmVtb3ZlLgoJKHZycF92YWx1ZWl6ZSk6IFJlbW92ZS4KCSh2cnBf dmFsdWVpemVfMSk6IFJlbW92ZS4KCShnZXRfb3V0cHV0X2Zvcl92cnApOiBSZW1vdmUuCgkodnJf dmFsdWVzOjp2cnBfdmlzaXRfYXNzaWdubWVudF9vcl9jYWxsKTogUmVtb3ZlLgoJKHNpbXBsaWZ5 X3VzaW5nX3Jhbmdlczo6dnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsKTogUmVtb3ZlLgoJKHZyX3Zh bHVlczo6dnJwX3Zpc2l0X3N3aXRjaF9zdG10KTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6ZXh0cmFj dF9yYW5nZV9mcm9tX3N0bXQpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zy b21fcGhpX25vZGUpOiBSZW1vdmUuCgkoc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjpmb2xkX2NvbmQp OiBBZGQgRklYTUUgbm90ZS4KCShzaW1wbGlmeV91c2luZ19yYW5nZXM6OnNpbXBsaWZ5X3N3aXRj aF91c2luZ19yYW5nZXMpOiBSZW1vdmUgY2FsbAoJdG8gc3ltYm9saWNfcC4KCSh2cl92YWx1ZXM6 OnNldF92cl92YWx1ZSk6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OnN3YXBfdnJfdmFsdWUpOiBSZW1v dmUuCgkqIHZyLXZhbHVlcy5oIChjbGFzcyB2cl92YWx1ZXMpOiBSZW1vdmUuCgkoZ2V0X291dHB1 dF9mb3JfdnJwKTogUmVtb3ZlLgotLS0KIGdjYy9kb2MvaW52b2tlLnRleGkgfCAgIDEwIC0KIGdj Yy9wYXJhbXMub3B0ICAgICAgfCAgIDIxIC0KIGdjYy9yYW5nZS1vcC5jYyAgICAgfCAgIDI4ICsK IGdjYy90cmVlLXZycC5jYyAgICAgfCAzODM4ICsrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KIGdjYy90cmVlLXZycC5oICAgICAgfCAgIDI1IC0KIGdjYy92YWx1ZS1y YW5nZS5jYyAgfCAgIDI4IC0KIGdjYy92YWx1ZS1yYW5nZS5oICAgfCAgICAxIC0KIGdjYy92ci12 YWx1ZXMuY2MgICAgfCAxODcxICstLS0tLS0tLS0tLS0tLS0tLS0tLQogZ2NjL3ZyLXZhbHVlcy5o ICAgICB8ICAxMDAgKy0KIDkgZmlsZXMgY2hhbmdlZCwgMjUzIGluc2VydGlvbnMoKyksIDU2Njkg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9pbnZva2UudGV4aSBiL2djYy9kb2Mv aW52b2tlLnRleGkKaW5kZXggMzMwZGE2ZWI1ZDQuLmUyOTc1MjVkZjMxIDEwMDY0NAotLS0gYS9n Y2MvZG9jL2ludm9rZS50ZXhpCisrKyBiL2djYy9kb2MvaW52b2tlLnRleGkKQEAgLTE1NzgxLDE5 ICsxNTc4MSw5IEBAIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtYXktZGVmcyB3ZSBhbmFseXplIHdo ZW4gbG9va2luZyBmb3IgYSBtdXN0LWRlZgogc3BlY2lmeWluZyB0aGUgZHluYW1pYyB0eXBlIG9m IGFuIG9iamVjdCB0aGF0IGludm9rZXMgYSB2aXJ0dWFsIGNhbGwKIHdlIG1heSBiZSBhYmxlIHRv IGRldmlydHVhbGl6ZSBzcGVjdWxhdGl2ZWx5LgogCi1AaXRlbSBtYXgtdnJwLXN3aXRjaC1hc3Nl cnRpb25zCi1UaGUgbWF4aW11bSBudW1iZXIgb2YgYXNzZXJ0aW9ucyB0byBhZGQgYWxvbmcgdGhl IGRlZmF1bHQgZWRnZSBvZiBhIHN3aXRjaAotc3RhdGVtZW50IGR1cmluZyBWUlAuCi0KIEBpdGVt IGV2cnAtc3BhcnNlLXRocmVzaG9sZAogTWF4aW11bSBudW1iZXIgb2YgYmFzaWMgYmxvY2tzIGJl Zm9yZSBFVlJQIHVzZXMgYSBzcGFyc2UgY2FjaGUuCiAKLUBpdGVtIHZycDEtbW9kZQotU3BlY2lm aWVzIHRoZSBtb2RlIFZSUCBwYXNzIDEgc2hvdWxkIG9wZXJhdGUgaW4uCi0KLUBpdGVtIHZycDIt bW9kZQotU3BlY2lmaWVzIHRoZSBtb2RlIFZSUCBwYXNzIDIgc2hvdWxkIG9wZXJhdGUgaW4uCi0K IEBpdGVtIHJhbmdlci1kZWJ1ZwogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRlYnVnIG91dHB1dCB0 byBiZSBpc3N1ZWQgZm9yIHJhbmdlcy4KIApkaWZmIC0tZ2l0IGEvZ2NjL3BhcmFtcy5vcHQgYi9n Y2MvcGFyYW1zLm9wdAppbmRleCBhMzRmZWUxOTNmYy4uYzFkY2I3ZWE0ODcgMTAwNjQ0Ci0tLSBh L2djYy9wYXJhbXMub3B0CisrKyBiL2djYy9wYXJhbXMub3B0CkBAIC03NDYsMTAgKzc0Niw2IEBA IE1heC4gc2l6ZSBvZiB2YXIgdHJhY2tpbmcgaGFzaCB0YWJsZXMuCiBDb21tb24gSm9pbmVkIFVJ bnRlZ2VyIFZhcihwYXJhbV9tYXhfZmluZF9iYXNlX3Rlcm1fdmFsdWVzKSBJbml0KDIwMCkgUGFy YW0gT3B0aW1pemF0aW9uCiBNYXhpbXVtIG51bWJlciBvZiBWQUxVRXMgaGFuZGxlZCBkdXJpbmcg YSBzaW5nbGUgZmluZF9iYXNlX3Rlcm0gY2FsbC4KIAotLXBhcmFtPW1heC12cnAtc3dpdGNoLWFz c2VydGlvbnM9Ci1Db21tb24gSm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV9tYXhfdnJwX3N3aXRj aF9hc3NlcnRpb25zKSBJbml0KDEwKSBQYXJhbSBPcHRpbWl6YXRpb24KLU1heGltdW0gbnVtYmVy IG9mIGFzc2VydGlvbnMgdG8gYWRkIGFsb25nIHRoZSBkZWZhdWx0IGVkZ2Ugb2YgYSBzd2l0Y2gg c3RhdGVtZW50IGR1cmluZyBWUlAuCi0KIC1wYXJhbT1taW4tY3Jvc3NqdW1wLWluc25zPQogQ29t bW9uIEpvaW5lZCBVSW50ZWdlciBWYXIocGFyYW1fbWluX2Nyb3NzanVtcF9pbnNucykgSW5pdCg1 KSBJbnRlZ2VyUmFuZ2UoMSwgNjU1MzYpIFBhcmFtIE9wdGltaXphdGlvbgogVGhlIG1pbmltdW0g bnVtYmVyIG9mIG1hdGNoaW5nIGluc3RydWN0aW9ucyB0byBjb25zaWRlciBmb3IgY3Jvc3NqdW1w aW5nLgpAQCAtMTE2NSwyMSArMTE2MSw0IEBAIFRoZSBtYXhpbXVtIGZhY3RvciB3aGljaCB0aGUg bG9vcCB2ZWN0b3JpemVyIGFwcGxpZXMgdG8gdGhlIGNvc3Qgb2Ygc3RhdGVtZW50cyBpCiBDb21t b24gSm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV92ZWN0X2luZHVjdGlvbl9mbG9hdCkgSW5pdCgx KSBJbnRlZ2VyUmFnZSgwLCAxKSBQYXJhbSBPcHRpbWl6YXRpb24KIEVuYWJsZSBsb29wIHZlY3Rv cml6YXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgaW5kdWN0aW9ucy4KIAotLXBhcmFtPXZycDEtbW9k ZT0KLUNvbW1vbiBKb2luZWQgVmFyKHBhcmFtX3ZycDFfbW9kZSkgRW51bSh2cnBfbW9kZSkgSW5p dChWUlBfTU9ERV9SQU5HRVIpIFBhcmFtIE9wdGltaXphdGlvbgotLS1wYXJhbT12cnAxLW1vZGU9 W3ZycHxyYW5nZXJdIFNwZWNpZmllcyB0aGUgbW9kZSBWUlAxIHNob3VsZCBvcGVyYXRlIGluLgot Ci0tcGFyYW09dnJwMi1tb2RlPQotQ29tbW9uIEpvaW5lZCBWYXIocGFyYW1fdnJwMl9tb2RlKSBF bnVtKHZycF9tb2RlKSBJbml0KFZSUF9NT0RFX1JBTkdFUikgUGFyYW0gT3B0aW1pemF0aW9uCi0t LXBhcmFtPXZycDItbW9kZT1bdnJwfHJhbmdlcl0gU3BlY2lmaWVzIHRoZSBtb2RlIFZSUDIgc2hv dWxkIG9wZXJhdGUgaW4uCi0KLUVudW0KLU5hbWUodnJwX21vZGUpIFR5cGUoZW51bSB2cnBfbW9k ZSkgVW5rbm93bkVycm9yKHVua25vd24gdnJwIG1vZGUgJXFzKQotCi1FbnVtVmFsdWUKLUVudW0o dnJwX21vZGUpIFN0cmluZyh2cnApIFZhbHVlKFZSUF9NT0RFX1ZSUCkKLQotRW51bVZhbHVlCi1F bnVtKHZycF9tb2RlKSBTdHJpbmcocmFuZ2VyKSBWYWx1ZShWUlBfTU9ERV9SQU5HRVIpCi0KIDsg VGhpcyBjb21tZW50IGlzIHRvIGVuc3VyZSB3ZSByZXRhaW4gdGhlIGJsYW5rIGxpbmUgYWJvdmUu CmRpZmYgLS1naXQgYS9nY2MvcmFuZ2Utb3AuY2MgYi9nY2MvcmFuZ2Utb3AuY2MKaW5kZXggNmZh M2IxNTE1OTYuLmNhMWMzOGM5MzA3IDEwMDY0NAotLS0gYS9nY2MvcmFuZ2Utb3AuY2MKKysrIGIv Z2NjL3JhbmdlLW9wLmNjCkBAIC0zMDgyLDYgKzMwODIsMzQgQEAgc2V0X25vbnplcm9fcmFuZ2Vf ZnJvbV9tYXNrIChpcmFuZ2UgJnIsIHRyZWUgdHlwZSwgY29uc3QgaXJhbmdlICZsaHMpCiAgICAg ci5zZXRfdmFyeWluZyAodHlwZSk7CiB9CiAKKy8qIEZpbmQgb3V0IHNtYWxsZXN0IFJFUyB3aGVy ZSBSRVMgPiBWQUwgJiYgKFJFUyAmIE1BU0spID09IFJFUywgaWYgYW55CisgICAob3RoZXJ3aXNl IHJldHVybiBWQUwpLiAgVkFMIGFuZCBNQVNLIG11c3QgYmUgemVyby1leHRlbmRlZCBmb3IKKyAg IHByZWNpc2lvbiBQUkVDLiAgSWYgU0dOQklUIGlzIG5vbi16ZXJvLCBmaXJzdCB4b3IgVkFMIHdp dGggU0dOQklUCisgICAodG8gdHJhbnNmb3JtIHNpZ25lZCB2YWx1ZXMgaW50byB1bnNpZ25lZCkg YW5kIGF0IHRoZSBlbmQgeG9yCisgICBTR05CSVQgYmFjay4gICovCisKK3dpZGVfaW50CittYXNr ZWRfaW5jcmVtZW50IChjb25zdCB3aWRlX2ludCAmdmFsX2luLCBjb25zdCB3aWRlX2ludCAmbWFz aywKKwkJICBjb25zdCB3aWRlX2ludCAmc2duYml0LCB1bnNpZ25lZCBpbnQgcHJlYykKK3sKKyAg d2lkZV9pbnQgYml0ID0gd2k6Om9uZSAocHJlYyksIHJlczsKKyAgdW5zaWduZWQgaW50IGk7CisK KyAgd2lkZV9pbnQgdmFsID0gdmFsX2luIF4gc2duYml0OworICBmb3IgKGkgPSAwOyBpIDwgcHJl YzsgaSsrLCBiaXQgKz0gYml0KQorICAgIHsKKyAgICAgIHJlcyA9IG1hc2s7CisgICAgICBpZiAo KHJlcyAmIGJpdCkgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIHJlcyA9IGJpdCAtIDE7CisgICAg ICByZXMgPSB3aTo6Yml0X2FuZF9ub3QgKHZhbCArIGJpdCwgcmVzKTsKKyAgICAgIHJlcyAmPSBt YXNrOworICAgICAgaWYgKHdpOjpndHVfcCAocmVzLCB2YWwpKQorCXJldHVybiByZXMgXiBzZ25i aXQ7CisgICAgfQorICByZXR1cm4gdmFsIF4gc2duYml0OworfQorCiAvLyBUaGlzIHdhcyBzaGFt ZWxlc3NseSBzdG9sZW4gZnJvbSByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiBhbmQKIC8vIGFk anVzdGVkIHRvIHdvcmsgd2l0aCBpcmFuZ2VzLgogCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12cnAu Y2MgYi9nY2MvdHJlZS12cnAuY2MKaW5kZXggYTQ3NGQ5ZDExZTUuLjg2OTc4MDg2Y2ZiIDEwMDY0 NAotLS0gYS9nY2MvdHJlZS12cnAuY2MKKysrIGIvZ2NjL3RyZWUtdnJwLmNjCkBAIC0yMjksMTA5 ICsyMjksNiBAQCByZW1vdmVfdW5yZWFjaGFibGU6OnJlbW92ZV9hbmRfdXBkYXRlX2dsb2JhbHMg KGJvb2wgZmluYWxfcCkKICAgcmV0dXJuIGNoYW5nZTsKIH0KIAotLyogU2V0IG9mIFNTQSBuYW1l cyBmb3VuZCBsaXZlIGR1cmluZyB0aGUgUlBPIHRyYXZlcnNhbCBvZiB0aGUgZnVuY3Rpb24KLSAg IGZvciBzdGlsbCBhY3RpdmUgYmFzaWMtYmxvY2tzLiAgKi8KLWNsYXNzIGxpdmVfbmFtZXMKLXsK LXB1YmxpYzoKLSAgbGl2ZV9uYW1lcyAoKTsKLSAgfmxpdmVfbmFtZXMgKCk7Ci0gIHZvaWQgc2V0 ICh0cmVlLCBiYXNpY19ibG9jayk7Ci0gIHZvaWQgY2xlYXIgKHRyZWUsIGJhc2ljX2Jsb2NrKTsK LSAgdm9pZCBtZXJnZSAoYmFzaWNfYmxvY2sgZGVzdCwgYmFzaWNfYmxvY2sgc3JjKTsKLSAgYm9v bCBsaXZlX29uX2Jsb2NrX3AgKHRyZWUsIGJhc2ljX2Jsb2NrKTsKLSAgYm9vbCBsaXZlX29uX2Vk Z2VfcCAodHJlZSwgZWRnZSk7Ci0gIGJvb2wgYmxvY2tfaGFzX2xpdmVfbmFtZXNfcCAoYmFzaWNf YmxvY2spOwotICB2b2lkIGNsZWFyX2Jsb2NrIChiYXNpY19ibG9jayk7Ci0KLXByaXZhdGU6Ci0g IHNiaXRtYXAgKmxpdmU7Ci0gIHVuc2lnbmVkIG51bV9ibG9ja3M7Ci0gIHZvaWQgaW5pdF9iaXRt YXBfaWZfbmVlZGVkIChiYXNpY19ibG9jayk7Ci19OwotCi12b2lkCi1saXZlX25hbWVzOjppbml0 X2JpdG1hcF9pZl9uZWVkZWQgKGJhc2ljX2Jsb2NrIGJiKQotewotICB1bnNpZ25lZCBpID0gYmIt PmluZGV4OwotICBpZiAoIWxpdmVbaV0pCi0gICAgewotICAgICAgbGl2ZVtpXSA9IHNiaXRtYXBf YWxsb2MgKG51bV9zc2FfbmFtZXMpOwotICAgICAgYml0bWFwX2NsZWFyIChsaXZlW2ldKTsKLSAg ICB9Ci19Ci0KLWJvb2wKLWxpdmVfbmFtZXM6OmJsb2NrX2hhc19saXZlX25hbWVzX3AgKGJhc2lj X2Jsb2NrIGJiKQotewotICB1bnNpZ25lZCBpID0gYmItPmluZGV4OwotICByZXR1cm4gbGl2ZVtp XSAmJiBiaXRtYXBfZW1wdHlfcCAobGl2ZVtpXSk7Ci19Ci0KLXZvaWQKLWxpdmVfbmFtZXM6OmNs ZWFyX2Jsb2NrIChiYXNpY19ibG9jayBiYikKLXsKLSAgdW5zaWduZWQgaSA9IGJiLT5pbmRleDsK LSAgaWYgKGxpdmVbaV0pCi0gICAgewotICAgICAgc2JpdG1hcF9mcmVlIChsaXZlW2ldKTsKLSAg ICAgIGxpdmVbaV0gPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZAotbGl2ZV9uYW1lczo6bWVyZ2Ug KGJhc2ljX2Jsb2NrIGRlc3QsIGJhc2ljX2Jsb2NrIHNyYykKLXsKLSAgaW5pdF9iaXRtYXBfaWZf bmVlZGVkIChkZXN0KTsKLSAgaW5pdF9iaXRtYXBfaWZfbmVlZGVkIChzcmMpOwotICBiaXRtYXBf aW9yIChsaXZlW2Rlc3QtPmluZGV4XSwgbGl2ZVtkZXN0LT5pbmRleF0sIGxpdmVbc3JjLT5pbmRl eF0pOwotfQotCi12b2lkCi1saXZlX25hbWVzOjpzZXQgKHRyZWUgbmFtZSwgYmFzaWNfYmxvY2sg YmIpCi17Ci0gIGluaXRfYml0bWFwX2lmX25lZWRlZCAoYmIpOwotICBiaXRtYXBfc2V0X2JpdCAo bGl2ZVtiYi0+aW5kZXhdLCBTU0FfTkFNRV9WRVJTSU9OIChuYW1lKSk7Ci19Ci0KLXZvaWQKLWxp dmVfbmFtZXM6OmNsZWFyICh0cmVlIG5hbWUsIGJhc2ljX2Jsb2NrIGJiKQotewotICB1bnNpZ25l ZCBpID0gYmItPmluZGV4OwotICBpZiAobGl2ZVtpXSkKLSAgICBiaXRtYXBfY2xlYXJfYml0IChs aXZlW2ldLCBTU0FfTkFNRV9WRVJTSU9OIChuYW1lKSk7Ci19Ci0KLWxpdmVfbmFtZXM6OmxpdmVf bmFtZXMgKCkKLXsKLSAgbnVtX2Jsb2NrcyA9IGxhc3RfYmFzaWNfYmxvY2tfZm9yX2ZuIChjZnVu KTsKLSAgbGl2ZSA9IFhDTkVXVkVDIChzYml0bWFwLCBudW1fYmxvY2tzKTsKLX0KLQotbGl2ZV9u YW1lczo6fmxpdmVfbmFtZXMgKCkKLXsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9i bG9ja3M7ICsraSkKLSAgICBpZiAobGl2ZVtpXSkKLSAgICAgIHNiaXRtYXBfZnJlZSAobGl2ZVtp XSk7Ci0gIFhERUxFVEVWRUMgKGxpdmUpOwotfQotCi1ib29sCi1saXZlX25hbWVzOjpsaXZlX29u X2Jsb2NrX3AgKHRyZWUgbmFtZSwgYmFzaWNfYmxvY2sgYmIpCi17Ci0gIHJldHVybiAobGl2ZVti Yi0+aW5kZXhdCi0JICAmJiBiaXRtYXBfYml0X3AgKGxpdmVbYmItPmluZGV4XSwgU1NBX05BTUVf VkVSU0lPTiAobmFtZSkpKTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIFNTQSBuYW1lIE5B TUUgaXMgbGl2ZSBvbiB0aGUgZWRnZSBFLiAgKi8KLQotYm9vbAotbGl2ZV9uYW1lczo6bGl2ZV9v bl9lZGdlX3AgKHRyZWUgbmFtZSwgZWRnZSBlKQotewotICByZXR1cm4gbGl2ZV9vbl9ibG9ja19w IChuYW1lLCBlLT5kZXN0KTsKLX0KLQotCiAvKiBWUl9UWVBFIGRlc2NyaWJlcyBhIHJhbmdlIHdp dGggbWluaW51bSB2YWx1ZSAqTUlOIGFuZCBtYXhpbXVtCiAgICB2YWx1ZSAqTUFYLiAgUmVzdHJp Y3QgdGhlIHJhbmdlIHRvIHRoZSBzZXQgb2YgdmFsdWVzIHRoYXQgaGF2ZQogICAgbm8gYml0cyBz ZXQgb3V0c2lkZSBOT05aRVJPX0JJVFMuICBVcGRhdGUgKk1JTiBhbmQgKk1BWCBhbmQKQEAgLTQx Nyw3ICszMTQsNyBAQCByYW5nZV9pbnRfY3N0X3AgKGNvbnN0IHZhbHVlX3JhbmdlICp2cikKICAg IG90aGVyd2lzZS4gIFdlIG9ubHkgaGFuZGxlIGFkZGl0aXZlIG9wZXJhdGlvbnMgYW5kIHNldCBO RUcgdG8gdHJ1ZSBpZiB0aGUKICAgIHN5bWJvbCBpcyBuZWdhdGVkIGFuZCBJTlYgdG8gdGhlIGlu dmFyaWFudCBwYXJ0LCBpZiBhbnkuICAqLwogCi10cmVlCitzdGF0aWMgdHJlZQogZ2V0X3Npbmds ZV9zeW1ib2wgKHRyZWUgdCwgYm9vbCAqbmVnLCB0cmVlICppbnYpCiB7CiAgIGJvb2wgbmVnXzsK QEAgLTQ2OCwyNCArMzY1LDYgQEAgZ2V0X3NpbmdsZV9zeW1ib2wgKHRyZWUgdCwgYm9vbCAqbmVn LCB0cmVlICppbnYpCiAgIHJldHVybiB0OwogfQogCi0vKiBUaGUgcmV2ZXJzZSBvcGVyYXRpb246 IGJ1aWxkIGEgc3ltYm9saWMgZXhwcmVzc2lvbiB3aXRoIFRZUEUKLSAgIGZyb20gc3ltYm9sIFNZ TSwgbmVnYXRlZCBhY2NvcmRpbmcgdG8gTkVHLCBhbmQgaW52YXJpYW50IElOVi4gICovCi0KLXN0 YXRpYyB0cmVlCi1idWlsZF9zeW1ib2xpY19leHByICh0cmVlIHR5cGUsIHRyZWUgc3ltLCBib29s IG5lZywgdHJlZSBpbnYpCi17Ci0gIGNvbnN0IGJvb2wgcG9pbnRlcl9wID0gUE9JTlRFUl9UWVBF X1AgKHR5cGUpOwotICB0cmVlIHQgPSBzeW07Ci0KLSAgaWYgKG5lZykKLSAgICB0ID0gYnVpbGQx IChORUdBVEVfRVhQUiwgdHlwZSwgdCk7Ci0KLSAgaWYgKGludGVnZXJfemVyb3AgKGludikpCi0g ICAgcmV0dXJuIHQ7Ci0KLSAgcmV0dXJuIGJ1aWxkMiAocG9pbnRlcl9wID8gUE9JTlRFUl9QTFVT X0VYUFIgOiBQTFVTX0VYUFIsIHR5cGUsIHQsIGludik7Ci19Ci0KIC8qIFJldHVybgogICAgMSBp ZiBWQUwgPCBWQUwyCiAgICAwIGlmICEoVkFMIDwgVkFMMikKQEAgLTY5Nyw0MTEgKzU3Niw2IEBA IGNvbXBhcmVfdmFsdWVzICh0cmVlIHZhbDEsIHRyZWUgdmFsMikKICAgcmV0dXJuIGNvbXBhcmVf dmFsdWVzX3dhcm52ICh2YWwxLCB2YWwyLCAmc29wKTsKIH0KIAotLyogSWYgQk9VTkQgd2lsbCBp bmNsdWRlIGEgc3ltYm9saWMgYm91bmQsIGFkanVzdCBpdCBhY2NvcmRpbmdseSwKLSAgIG90aGVy d2lzZSBsZWF2ZSBpdCBhcyBpcy4KLQotICAgQ09ERSBpcyB0aGUgb3JpZ2luYWwgb3BlcmF0aW9u IHRoYXQgY29tYmluZWQgdGhlIGJvdW5kcyAoUExVU19FWFBSCi0gICBvciBNSU5VU19FWFBSKS4K LQotICAgVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uLgotCi0gICBT WU1fT1BuIGlzIHRoZSBzeW1ib2xpYyBmb3IgT1BuIGlmIGl0IGhhcyBhIHN5bWJvbGljLgotCi0g ICBORUdfT1BuIGlzIFRSVUUgaWYgdGhlIE9QbiB3YXMgbmVnYXRlZC4gICovCi0KLXN0YXRpYyB2 b2lkCi1hZGp1c3Rfc3ltYm9saWNfYm91bmQgKHRyZWUgJmJvdW5kLCBlbnVtIHRyZWVfY29kZSBj b2RlLCB0cmVlIHR5cGUsCi0JCSAgICAgICB0cmVlIHN5bV9vcDAsIHRyZWUgc3ltX29wMSwKLQkJ ICAgICAgIGJvb2wgbmVnX29wMCwgYm9vbCBuZWdfb3AxKQotewotICBib29sIG1pbnVzX3AgPSAo Y29kZSA9PSBNSU5VU19FWFBSKTsKLSAgLyogSWYgdGhlIHJlc3VsdCBib3VuZCBpcyBjb25zdGFu dCwgd2UncmUgZG9uZTsgb3RoZXJ3aXNlLCBidWlsZCB0aGUKLSAgICAgc3ltYm9saWMgbG93ZXIg Ym91bmQuICAqLwotICBpZiAoc3ltX29wMCA9PSBzeW1fb3AxKQotICAgIDsKLSAgZWxzZSBpZiAo c3ltX29wMCkKLSAgICBib3VuZCA9IGJ1aWxkX3N5bWJvbGljX2V4cHIgKHR5cGUsIHN5bV9vcDAs Ci0JCQkJIG5lZ19vcDAsIGJvdW5kKTsKLSAgZWxzZSBpZiAoc3ltX29wMSkKLSAgICB7Ci0gICAg ICAvKiBXZSBtYXkgbm90IG5lZ2F0ZSBpZiB0aGF0IG1pZ2h0IGludHJvZHVjZQotCSB1bmRlZmlu ZWQgb3ZlcmZsb3cuICAqLwotICAgICAgaWYgKCFtaW51c19wCi0JICB8fCBuZWdfb3AxCi0JICB8 fCBUWVBFX09WRVJGTE9XX1dSQVBTICh0eXBlKSkKLQlib3VuZCA9IGJ1aWxkX3N5bWJvbGljX2V4 cHIgKHR5cGUsIHN5bV9vcDEsCi0JCQkJICAgICBuZWdfb3AxIF4gbWludXNfcCwgYm91bmQpOwot ICAgICAgZWxzZQotCWJvdW5kID0gTlVMTF9UUkVFOwotICAgIH0KLX0KLQotLyogQ29tYmluZSBP UDEgYW5kIE9QMSwgd2hpY2ggYXJlIHR3byBwYXJ0cyBvZiBhIGJvdW5kLCBpbnRvIG9uZSB3aWRl Ci0gICBpbnQgYm91bmQgYWNjb3JkaW5nIHRvIENPREUuICBDT0RFIGlzIHRoZSBvcGVyYXRpb24g Y29tYmluaW5nIHRoZQotICAgYm91bmQgKGVpdGhlciBhIFBMVVNfRVhQUiBvciBhIE1JTlVTX0VY UFIpLgotCi0gICBUWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBjb21iaW5lIG9wZXJhdGlvbi4KLQot ICAgV0kgaXMgdGhlIHdpZGUgaW50IHRvIHN0b3JlIHRoZSByZXN1bHQuCi0KLSAgIE9WRiBpcyAt MSBpZiBhbiB1bmRlcmZsb3cgb2NjdXJyZWQsICsxIGlmIGFuIG92ZXJmbG93IG9jY3VycmVkIG9y IDAKLSAgIGlmIG92ZXIvdW5kZXJmbG93IG9jY3VycmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWNv bWJpbmVfYm91bmQgKGVudW0gdHJlZV9jb2RlIGNvZGUsIHdpZGVfaW50ICZ3aSwgd2k6Om92ZXJm bG93X3R5cGUgJm92ZiwKLQkgICAgICAgdHJlZSB0eXBlLCB0cmVlIG9wMCwgdHJlZSBvcDEpCi17 Ci0gIGJvb2wgbWludXNfcCA9IChjb2RlID09IE1JTlVTX0VYUFIpOwotICBjb25zdCBzaWdub3Ag c2duID0gVFlQRV9TSUdOICh0eXBlKTsKLSAgY29uc3QgdW5zaWduZWQgaW50IHByZWMgPSBUWVBF X1BSRUNJU0lPTiAodHlwZSk7Ci0KLSAgLyogQ29tYmluZSB0aGUgYm91bmRzLCBpZiBhbnkuICAq LwotICBpZiAob3AwICYmIG9wMSkKLSAgICB7Ci0gICAgICBpZiAobWludXNfcCkKLQl3aSA9IHdp OjpzdWIgKHdpOjp0b193aWRlIChvcDApLCB3aTo6dG9fd2lkZSAob3AxKSwgc2duLCAmb3ZmKTsK LSAgICAgIGVsc2UKLQl3aSA9IHdpOjphZGQgKHdpOjp0b193aWRlIChvcDApLCB3aTo6dG9fd2lk ZSAob3AxKSwgc2duLCAmb3ZmKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wMCkKLSAgICB3aSA9IHdp Ojp0b193aWRlIChvcDApOwotICBlbHNlIGlmIChvcDEpCi0gICAgewotICAgICAgaWYgKG1pbnVz X3ApCi0Jd2kgPSB3aTo6bmVnICh3aTo6dG9fd2lkZSAob3AxKSwgJm92Zik7Ci0gICAgICBlbHNl Ci0Jd2kgPSB3aTo6dG9fd2lkZSAob3AxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB3aSA9IHdpOjpz aHdpICgwLCBwcmVjKTsKLX0KLQotLyogR2l2ZW4gYSByYW5nZSBpbiBbV01JTiwgV01BWF0sIGFk anVzdCBpdCBmb3IgcG9zc2libGUgb3ZlcmZsb3cgYW5kCi0gICBwdXQgdGhlIHJlc3VsdCBpbiBW Ui4KLQotICAgVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgcmFuZ2UuCi0KLSAgIE1JTl9PVkYgYW5k IE1BWF9PVkYgaW5kaWNhdGUgd2hhdCB0eXBlIG9mIG92ZXJmbG93LCBpZiBhbnksCi0gICBvY2N1 cnJlZCB3aGlsZSBvcmlnaW5hbGx5IGNhbGN1bGF0aW5nIFdNSU4gb3IgV01BWC4gIC0xIGluZGlj YXRlcwotICAgdW5kZXJmbG93LiAgKzEgaW5kaWNhdGVzIG92ZXJmbG93LiAgMCBpbmRpY2F0ZXMg bmVpdGhlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfdmFsdWVfcmFuZ2Vfd2l0aF9vdmVyZmxv dyAodmFsdWVfcmFuZ2Vfa2luZCAma2luZCwgdHJlZSAmbWluLCB0cmVlICZtYXgsCi0JCQkgICAg ICAgdHJlZSB0eXBlLAotCQkJICAgICAgIGNvbnN0IHdpZGVfaW50ICZ3bWluLCBjb25zdCB3aWRl X2ludCAmd21heCwKLQkJCSAgICAgICB3aTo6b3ZlcmZsb3dfdHlwZSBtaW5fb3ZmLAotCQkJICAg ICAgIHdpOjpvdmVyZmxvd190eXBlIG1heF9vdmYpCi17Ci0gIGNvbnN0IHNpZ25vcCBzZ24gPSBU WVBFX1NJR04gKHR5cGUpOwotICBjb25zdCB1bnNpZ25lZCBpbnQgcHJlYyA9IFRZUEVfUFJFQ0lT SU9OICh0eXBlKTsKLQotICAvKiBGb3Igb25lIGJpdCBwcmVjaXNpb24gaWYgbWF4IDwgbWluLCB0 aGVuIHRoZSBzd2FwcGVkCi0gICAgIHJhbmdlIGNvdmVycyBhbGwgdmFsdWVzLiAgKi8KLSAgaWYg KHByZWMgPT0gMSAmJiB3aTo6bHRfcCAod21heCwgd21pbiwgc2duKSkKLSAgICB7Ci0gICAgICBr aW5kID0gVlJfVkFSWUlORzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFRZUEVfT1ZF UkZMT1dfV1JBUFMgKHR5cGUpKQotICAgIHsKLSAgICAgIC8qIElmIG92ZXJmbG93IHdyYXBzLCB0 cnVuY2F0ZSB0aGUgdmFsdWVzIGFuZCBhZGp1c3QgdGhlCi0JIHJhbmdlIGtpbmQgYW5kIGJvdW5k cyBhcHByb3ByaWF0ZWx5LiAgKi8KLSAgICAgIHdpZGVfaW50IHRtaW4gPSB3aWRlX2ludDo6ZnJv bSAod21pbiwgcHJlYywgc2duKTsKLSAgICAgIHdpZGVfaW50IHRtYXggPSB3aWRlX2ludDo6ZnJv bSAod21heCwgcHJlYywgc2duKTsKLSAgICAgIGlmICgobWluX292ZiAhPSB3aTo6T1ZGX05PTkUp ID09IChtYXhfb3ZmICE9IHdpOjpPVkZfTk9ORSkpCi0JewotCSAgLyogSWYgdGhlIGxpbWl0cyBh cmUgc3dhcHBlZCwgd2Ugd3JhcHBlZCBhcm91bmQgYW5kIGNvdmVyCi0JICAgICB0aGUgZW50aXJl IHJhbmdlLiAgKi8KLQkgIGlmICh3aTo6Z3RfcCAodG1pbiwgdG1heCwgc2duKSkKLQkgICAga2lu ZCA9IFZSX1ZBUllJTkc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBraW5kID0gVlJfUkFOR0U7 Ci0JICAgICAgLyogTm8gb3ZlcmZsb3cgb3IgYm90aCBvdmVyZmxvdyBvciB1bmRlcmZsb3cuICBU aGUKLQkJIHJhbmdlIGtpbmQgc3RheXMgVlJfUkFOR0UuICAqLwotCSAgICAgIG1pbiA9IHdpZGVf aW50X3RvX3RyZWUgKHR5cGUsIHRtaW4pOwotCSAgICAgIG1heCA9IHdpZGVfaW50X3RvX3RyZWUg KHR5cGUsIHRtYXgpOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoKG1p bl9vdmYgPT0gd2k6Ok9WRl9VTkRFUkZMT1cgJiYgbWF4X292ZiA9PSB3aTo6T1ZGX05PTkUpCi0J ICAgICAgIHx8IChtYXhfb3ZmID09IHdpOjpPVkZfT1ZFUkZMT1cgJiYgbWluX292ZiA9PSB3aTo6 T1ZGX05PTkUpKQotCXsKLQkgIC8qIE1pbiB1bmRlcmZsb3cgb3IgbWF4IG92ZXJmbG93LiAgVGhl IHJhbmdlIGtpbmQKLQkgICAgIGNoYW5nZXMgdG8gVlJfQU5USV9SQU5HRS4gICovCi0JICBib29s IGNvdmVycyA9IGZhbHNlOwotCSAgd2lkZV9pbnQgdGVtID0gdG1pbjsKLQkgIHRtaW4gPSB0bWF4 ICsgMTsKLQkgIGlmICh3aTo6Y21wICh0bWluLCB0bWF4LCBzZ24pIDwgMCkKLQkgICAgY292ZXJz ID0gdHJ1ZTsKLQkgIHRtYXggPSB0ZW0gLSAxOwotCSAgaWYgKHdpOjpjbXAgKHRtYXgsIHRlbSwg c2duKSA+IDApCi0JICAgIGNvdmVycyA9IHRydWU7Ci0JICAvKiBJZiB0aGUgYW50aS1yYW5nZSB3 b3VsZCBjb3ZlciBub3RoaW5nLCBkcm9wIHRvIHZhcnlpbmcuCi0JICAgICBMaWtld2lzZSBpZiB0 aGUgYW50aS1yYW5nZSBib3VuZHMgYXJlIG91dHNpZGUgb2YgdGhlCi0JICAgICB0eXBlcyB2YWx1 ZXMuICAqLwotCSAgaWYgKGNvdmVycyB8fCB3aTo6Y21wICh0bWluLCB0bWF4LCBzZ24pID4gMCkK LQkgICAgewotCSAgICAgIGtpbmQgPSBWUl9WQVJZSU5HOwotCSAgICAgIHJldHVybjsKLQkgICAg fQotCSAga2luZCA9IFZSX0FOVElfUkFOR0U7Ci0JICBtaW4gPSB3aWRlX2ludF90b190cmVlICh0 eXBlLCB0bWluKTsKLQkgIG1heCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHRtYXgpOwotCSAg cmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBPdGhlciB1bmRlcmZsb3cgYW5kL29y IG92ZXJmbG93LCBkcm9wIHRvIFZSX1ZBUllJTkcuICAqLwotCSAga2luZCA9IFZSX1ZBUllJTkc7 Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIG92ZXJm bG93IGRvZXMgbm90IHdyYXAsIHNhdHVyYXRlIHRvIHRoZSB0eXBlcyBtaW4vbWF4Ci0JIHZhbHVl LiAgKi8KLSAgICAgIHdpZGVfaW50IHR5cGVfbWluID0gd2k6Om1pbl92YWx1ZSAocHJlYywgc2du KTsKLSAgICAgIHdpZGVfaW50IHR5cGVfbWF4ID0gd2k6Om1heF92YWx1ZSAocHJlYywgc2duKTsK LSAgICAgIGtpbmQgPSBWUl9SQU5HRTsKLSAgICAgIGlmIChtaW5fb3ZmID09IHdpOjpPVkZfVU5E RVJGTE9XKQotCW1pbiA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHR5cGVfbWluKTsKLSAgICAg IGVsc2UgaWYgKG1pbl9vdmYgPT0gd2k6Ok9WRl9PVkVSRkxPVykKLQltaW4gPSB3aWRlX2ludF90 b190cmVlICh0eXBlLCB0eXBlX21heCk7Ci0gICAgICBlbHNlCi0JbWluID0gd2lkZV9pbnRfdG9f dHJlZSAodHlwZSwgd21pbik7Ci0KLSAgICAgIGlmIChtYXhfb3ZmID09IHdpOjpPVkZfVU5ERVJG TE9XKQotCW1heCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHR5cGVfbWluKTsKLSAgICAgIGVs c2UgaWYgKG1heF9vdmYgPT0gd2k6Ok9WRl9PVkVSRkxPVykKLQltYXggPSB3aWRlX2ludF90b190 cmVlICh0eXBlLCB0eXBlX21heCk7Ci0gICAgICBlbHNlCi0JbWF4ID0gd2lkZV9pbnRfdG9fdHJl ZSAodHlwZSwgd21heCk7Ci0gICAgfQotfQotCi0vKiBGb2xkIHR3byB2YWx1ZSByYW5nZSdzIG9m IGEgUE9JTlRFUl9QTFVTX0VYUFIgaW50byBWUi4gICovCi0KLXN0YXRpYyB2b2lkCi1leHRyYWN0 X3JhbmdlX2Zyb21fcG9pbnRlcl9wbHVzX2V4cHIgKHZhbHVlX3JhbmdlICp2ciwKLQkJCQkgICAg ICBlbnVtIHRyZWVfY29kZSBjb2RlLAotCQkJCSAgICAgIHRyZWUgZXhwcl90eXBlLAotCQkJCSAg ICAgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjAsCi0JCQkJICAgICAgY29uc3QgdmFsdWVfcmFuZ2Ug KnZyMSkKLXsKLSAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoUE9JTlRFUl9UWVBFX1AgKGV4cHJfdHlw ZSkKLQkJICAgICAgICYmIGNvZGUgPT0gUE9JTlRFUl9QTFVTX0VYUFIpOwotICAvKiBGb3IgcG9p bnRlciB0eXBlcywgd2UgYXJlIHJlYWxseSBvbmx5IGludGVyZXN0ZWQgaW4gYXNzZXJ0aW5nCi0g ICAgIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIG5vbi1OVUxMLgotICAgICBX aXRoIC1mbm8tZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3Mgd2UgbmVlZCB0byBiZSBtb3JlCi0g ICAgIGNvbnNlcnZhdGl2ZS4gIEFzIHNvbWUgb2JqZWN0IG1pZ2h0IHJlc2lkZSBhdCBhZGRyZXNz IDAsCi0gICAgIHRoZW4gc29tZSBvZmZzZXQgY291bGQgYmUgYWRkZWQgdG8gaXQgYW5kIHRoZSBz YW1lIG9mZnNldAotICAgICBzdWJ0cmFjdGVkIGFnYWluIGFuZCB0aGUgcmVzdWx0IHdvdWxkIGJl IE5VTEwuCi0gICAgIEUuZy4KLSAgICAgc3RhdGljIGludCBhWzEyXTsgd2hlcmUgJmFbMF0gaXMg TlVMTCBhbmQKLSAgICAgcHRyID0gJmFbNl07Ci0gICAgIHB0ciAtPSA2OwotICAgICBwdHIgd2ls bCBiZSBOVUxMIGhlcmUsIGV2ZW4gd2hlbiB0aGVyZSBpcyBQT0lOVEVSX1BMVVNfRVhQUgotICAg ICB3aGVyZSB0aGUgZmlyc3QgcmFuZ2UgZG9lc24ndCBpbmNsdWRlIHplcm8gYW5kIHRoZSBzZWNv bmQgb25lCi0gICAgIGRvZXNuJ3QgZWl0aGVyLiAgQXMgdGhlIHNlY29uZCBvcGVyYW5kIGlzIHNp emV0eXBlICh1bnNpZ25lZCksCi0gICAgIGNvbnNpZGVyIGFsbCByYW5nZXMgd2hlcmUgdGhlIE1T QiBjb3VsZCBiZSBzZXQgYXMgcG9zc2libGUKLSAgICAgc3VidHJhY3Rpb25zIHdoZXJlIHRoZSBy ZXN1bHQgbWlnaHQgYmUgTlVMTC4gICovCi0gIGlmICgoIXJhbmdlX2luY2x1ZGVzX3plcm9fcCAo dnIwKQotICAgICAgIHx8ICFyYW5nZV9pbmNsdWRlc196ZXJvX3AgKHZyMSkpCi0gICAgICAmJiAh VFlQRV9PVkVSRkxPV19XUkFQUyAoZXhwcl90eXBlKQotICAgICAgJiYgKGZsYWdfZGVsZXRlX251 bGxfcG9pbnRlcl9jaGVja3MKLQkgIHx8IChyYW5nZV9pbnRfY3N0X3AgKHZyMSkKLQkgICAgICAm JiAhdHJlZV9pbnRfY3N0X3NpZ25fYml0ICh2cjEtPm1heCAoKSkpKSkKLSAgICB2ci0+c2V0X25v bnplcm8gKGV4cHJfdHlwZSk7Ci0gIGVsc2UgaWYgKHZyMC0+emVyb19wICgpICYmIHZyMS0+emVy b19wICgpKQotICAgIHZyLT5zZXRfemVybyAoZXhwcl90eXBlKTsKLSAgZWxzZQotICAgIHZyLT5z ZXRfdmFyeWluZyAoZXhwcl90eXBlKTsKLX0KLQotLyogRXh0cmFjdCByYW5nZSBpbmZvcm1hdGlv biBmcm9tIGEgUExVUy9NSU5VU19FWFBSIGFuZCBzdG9yZSB0aGUKLSAgIHJlc3VsdCBpbiAqVlIu ICAqLwotCi1zdGF0aWMgdm9pZAotZXh0cmFjdF9yYW5nZV9mcm9tX3BsdXNfbWludXNfZXhwciAo dmFsdWVfcmFuZ2UgKnZyLAotCQkJCSAgICBlbnVtIHRyZWVfY29kZSBjb2RlLAotCQkJCSAgICB0 cmVlIGV4cHJfdHlwZSwKLQkJCQkgICAgY29uc3QgdmFsdWVfcmFuZ2UgKnZyMF8sCi0JCQkJICAg IGNvbnN0IHZhbHVlX3JhbmdlICp2cjFfKQotewotICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChjb2Rl ID09IFBMVVNfRVhQUiB8fCBjb2RlID09IE1JTlVTX0VYUFIpOwotCi0gIHZhbHVlX3JhbmdlIHZy MCA9ICp2cjBfLCB2cjEgPSAqdnIxXzsKLSAgdmFsdWVfcmFuZ2UgdnJ0ZW0wLCB2cnRlbTE7Ci0K LSAgLyogTm93IGNhbm9uaWNhbGl6ZSBhbnRpLXJhbmdlcyB0byByYW5nZXMgd2hlbiB0aGV5IGFy ZSBub3Qgc3ltYm9saWMKLSAgICAgYW5kIGV4cHJlc3MgfltdIG9wIFggYXMgKFtdJyBvcCBYKSBV IChbXScnIG9wIFgpLiAgKi8KLSAgaWYgKHZyMC5raW5kICgpID09IFZSX0FOVElfUkFOR0UKLSAg ICAgICYmIHJhbmdlc19mcm9tX2FudGlfcmFuZ2UgKCZ2cjAsICZ2cnRlbTAsICZ2cnRlbTEpKQot ICAgIHsKLSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9wbHVzX21pbnVzX2V4cHIgKHZyLCBjb2Rl LCBleHByX3R5cGUsICZ2cnRlbTAsIHZyMV8pOwotICAgICAgaWYgKCF2cnRlbTEudW5kZWZpbmVk X3AgKCkpCi0JewotCSAgdmFsdWVfcmFuZ2UgdnJyZXM7Ci0JICBleHRyYWN0X3JhbmdlX2Zyb21f cGx1c19taW51c19leHByICgmdnJyZXMsIGNvZGUsIGV4cHJfdHlwZSwKLQkJCQkJICAgICAgJnZy dGVtMSwgdnIxXyk7Ci0JICB2ci0+dW5pb25fICh2cnJlcyk7Ci0JfQotICAgICAgcmV0dXJuOwot ICAgIH0KLSAgLyogTGlrZXdpc2UgZm9yIFggb3AgfltdLiAgKi8KLSAgaWYgKHZyMS5raW5kICgp ID09IFZSX0FOVElfUkFOR0UKLSAgICAgICYmIHJhbmdlc19mcm9tX2FudGlfcmFuZ2UgKCZ2cjEs ICZ2cnRlbTAsICZ2cnRlbTEpKQotICAgIHsKLSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9wbHVz X21pbnVzX2V4cHIgKHZyLCBjb2RlLCBleHByX3R5cGUsIHZyMF8sICZ2cnRlbTApOwotICAgICAg aWYgKCF2cnRlbTEudW5kZWZpbmVkX3AgKCkpCi0JewotCSAgdmFsdWVfcmFuZ2UgdnJyZXM7Ci0J ICBleHRyYWN0X3JhbmdlX2Zyb21fcGx1c19taW51c19leHByICgmdnJyZXMsIGNvZGUsIGV4cHJf dHlwZSwKLQkJCQkJICAgICAgdnIwXywgJnZydGVtMSk7Ci0JICB2ci0+dW5pb25fICh2cnJlcyk7 Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YWx1ZV9yYW5nZV9raW5kIGtpbmQ7Ci0g IHZhbHVlX3JhbmdlX2tpbmQgdnIwX2tpbmQgPSB2cjAua2luZCAoKSwgdnIxX2tpbmQgPSB2cjEu a2luZCAoKTsKLSAgdHJlZSB2cjBfbWluID0gdnIwLm1pbiAoKSwgdnIwX21heCA9IHZyMC5tYXgg KCk7Ci0gIHRyZWUgdnIxX21pbiA9IHZyMS5taW4gKCksIHZyMV9tYXggPSB2cjEubWF4ICgpOwot ICB0cmVlIG1pbiA9IE5VTExfVFJFRSwgbWF4ID0gTlVMTF9UUkVFOwotCi0gIC8qIFRoaXMgd2ls bCBub3JtYWxpemUgdGhpbmdzIHN1Y2ggdGhhdCBjYWxjdWxhdGluZwotICAgICBbMCwwXSAtIFZS X1ZBUllJTkcgaXMgbm90IGRyb3BwZWQgdG8gdmFyeWluZywgYnV0IGlzCi0gICAgIGNhbGN1bGF0 ZWQgYXMgW01JTisxLCBNQVhdLiAgKi8KLSAgaWYgKHZyMC52YXJ5aW5nX3AgKCkpCi0gICAgewot ICAgICAgdnIwX2tpbmQgPSBWUl9SQU5HRTsKLSAgICAgIHZyMF9taW4gPSB2cnBfdmFsX21pbiAo ZXhwcl90eXBlKTsKLSAgICAgIHZyMF9tYXggPSB2cnBfdmFsX21heCAoZXhwcl90eXBlKTsKLSAg ICB9Ci0gIGlmICh2cjEudmFyeWluZ19wICgpKQotICAgIHsKLSAgICAgIHZyMV9raW5kID0gVlJf UkFOR0U7Ci0gICAgICB2cjFfbWluID0gdnJwX3ZhbF9taW4gKGV4cHJfdHlwZSk7Ci0gICAgICB2 cjFfbWF4ID0gdnJwX3ZhbF9tYXggKGV4cHJfdHlwZSk7Ci0gICAgfQotCi0gIGNvbnN0IGJvb2wg bWludXNfcCA9IChjb2RlID09IE1JTlVTX0VYUFIpOwotICB0cmVlIG1pbl9vcDAgPSB2cjBfbWlu OwotICB0cmVlIG1pbl9vcDEgPSBtaW51c19wID8gdnIxX21heCA6IHZyMV9taW47Ci0gIHRyZWUg bWF4X29wMCA9IHZyMF9tYXg7Ci0gIHRyZWUgbWF4X29wMSA9IG1pbnVzX3AgPyB2cjFfbWluIDog dnIxX21heDsKLSAgdHJlZSBzeW1fbWluX29wMCA9IE5VTExfVFJFRTsKLSAgdHJlZSBzeW1fbWlu X29wMSA9IE5VTExfVFJFRTsKLSAgdHJlZSBzeW1fbWF4X29wMCA9IE5VTExfVFJFRTsKLSAgdHJl ZSBzeW1fbWF4X29wMSA9IE5VTExfVFJFRTsKLSAgYm9vbCBuZWdfbWluX29wMCwgbmVnX21pbl9v cDEsIG5lZ19tYXhfb3AwLCBuZWdfbWF4X29wMTsKLQotICBuZWdfbWluX29wMCA9IG5lZ19taW5f b3AxID0gbmVnX21heF9vcDAgPSBuZWdfbWF4X29wMSA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGhh dmUgYSBQTFVTIG9yIE1JTlVTIHdpdGggdHdvIFZSX1JBTkdFcywgZWl0aGVyIGNvbnN0YW50IG9y Ci0gICAgIHNpbmdsZS1zeW1ib2xpYyByYW5nZXMsIHRyeSB0byBjb21wdXRlIHRoZSBwcmVjaXNl IHJlc3VsdGluZyByYW5nZSwKLSAgICAgYnV0IG9ubHkgaWYgd2Uga25vdyB0aGF0IHRoaXMgcmVz dWx0aW5nIHJhbmdlIHdpbGwgYWxzbyBiZSBjb25zdGFudAotICAgICBvciBzaW5nbGUtc3ltYm9s aWMuICAqLwotICBpZiAodnIwX2tpbmQgPT0gVlJfUkFOR0UgJiYgdnIxX2tpbmQgPT0gVlJfUkFO R0UKLSAgICAgICYmIChUUkVFX0NPREUgKG1pbl9vcDApID09IElOVEVHRVJfQ1NUCi0JICB8fCAo c3ltX21pbl9vcDAKLQkgICAgICA9IGdldF9zaW5nbGVfc3ltYm9sIChtaW5fb3AwLCAmbmVnX21p bl9vcDAsICZtaW5fb3AwKSkpCi0gICAgICAmJiAoVFJFRV9DT0RFIChtaW5fb3AxKSA9PSBJTlRF R0VSX0NTVAotCSAgfHwgKHN5bV9taW5fb3AxCi0JICAgICAgPSBnZXRfc2luZ2xlX3N5bWJvbCAo bWluX29wMSwgJm5lZ19taW5fb3AxLCAmbWluX29wMSkpKQotICAgICAgJiYgKCEoc3ltX21pbl9v cDAgJiYgc3ltX21pbl9vcDEpCi0JICB8fCAoc3ltX21pbl9vcDAgPT0gc3ltX21pbl9vcDEKLQkg ICAgICAmJiBuZWdfbWluX29wMCA9PSAobWludXNfcCA/IG5lZ19taW5fb3AxIDogIW5lZ19taW5f b3AxKSkpCi0gICAgICAmJiAoVFJFRV9DT0RFIChtYXhfb3AwKSA9PSBJTlRFR0VSX0NTVAotCSAg fHwgKHN5bV9tYXhfb3AwCi0JICAgICAgPSBnZXRfc2luZ2xlX3N5bWJvbCAobWF4X29wMCwgJm5l Z19tYXhfb3AwLCAmbWF4X29wMCkpKQotICAgICAgJiYgKFRSRUVfQ09ERSAobWF4X29wMSkgPT0g SU5URUdFUl9DU1QKLQkgIHx8IChzeW1fbWF4X29wMQotCSAgICAgID0gZ2V0X3NpbmdsZV9zeW1i b2wgKG1heF9vcDEsICZuZWdfbWF4X29wMSwgJm1heF9vcDEpKSkKLSAgICAgICYmICghKHN5bV9t YXhfb3AwICYmIHN5bV9tYXhfb3AxKQotCSAgfHwgKHN5bV9tYXhfb3AwID09IHN5bV9tYXhfb3Ax Ci0JICAgICAgJiYgbmVnX21heF9vcDAgPT0gKG1pbnVzX3AgPyBuZWdfbWF4X29wMSA6ICFuZWdf bWF4X29wMSkpKSkKLSAgICB7Ci0gICAgICB3aWRlX2ludCB3bWluLCB3bWF4OwotICAgICAgd2k6 Om92ZXJmbG93X3R5cGUgbWluX292ZiA9IHdpOjpPVkZfTk9ORTsKLSAgICAgIHdpOjpvdmVyZmxv d190eXBlIG1heF9vdmYgPSB3aTo6T1ZGX05PTkU7Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBib3Vu ZHMuICAqLwotICAgICAgY29tYmluZV9ib3VuZCAoY29kZSwgd21pbiwgbWluX292ZiwgZXhwcl90 eXBlLCBtaW5fb3AwLCBtaW5fb3AxKTsKLSAgICAgIGNvbWJpbmVfYm91bmQgKGNvZGUsIHdtYXgs IG1heF9vdmYsIGV4cHJfdHlwZSwgbWF4X29wMCwgbWF4X29wMSk7Ci0KLSAgICAgIC8qIElmIHRo ZSByZXN1bHRpbmcgcmFuZ2Ugd2lsbCBiZSBzeW1ib2xpYywgd2UgbmVlZCB0byBlbGltaW5hdGUg YW55Ci0JIGV4cGxpY2l0IG9yIGltcGxpY2l0IG92ZXJmbG93IGludHJvZHVjZWQgaW4gdGhlIGFi b3ZlIGNvbXB1dGF0aW9uCi0JIGJlY2F1c2UgY29tcGFyZV92YWx1ZXMgY291bGQgbWFrZSBhbiBp bmNvcnJlY3QgdXNlIG9mIGl0LiAgVGhhdCdzCi0JIHdoeSB3ZSByZXF1aXJlIG9uZSBvZiB0aGUg cmFuZ2VzIHRvIGJlIGEgc2luZ2xldG9uLiAgKi8KLSAgICAgIGlmICgoc3ltX21pbl9vcDAgIT0g c3ltX21pbl9vcDEgfHwgc3ltX21heF9vcDAgIT0gc3ltX21heF9vcDEpCi0JICAmJiAoKGJvb2wp bWluX292ZiB8fCAoYm9vbCltYXhfb3ZmCi0JICAgICAgfHwgKG1pbl9vcDAgIT0gbWF4X29wMCAm JiBtaW5fb3AxICE9IG1heF9vcDEpKSkKLQl7Ci0JICB2ci0+c2V0X3ZhcnlpbmcgKGV4cHJfdHlw ZSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBBZGp1c3QgdGhlIHJhbmdlIGZvciBwb3Nz aWJsZSBvdmVyZmxvdy4gICovCi0gICAgICBzZXRfdmFsdWVfcmFuZ2Vfd2l0aF9vdmVyZmxvdyAo a2luZCwgbWluLCBtYXgsIGV4cHJfdHlwZSwKLQkJCQkgICAgIHdtaW4sIHdtYXgsIG1pbl9vdmYs IG1heF9vdmYpOwotICAgICAgaWYgKGtpbmQgPT0gVlJfVkFSWUlORykKLQl7Ci0JICB2ci0+c2V0 X3ZhcnlpbmcgKGV4cHJfdHlwZSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBCdWlsZCB0 aGUgc3ltYm9saWMgYm91bmRzIGlmIG5lZWRlZC4gICovCi0gICAgICBhZGp1c3Rfc3ltYm9saWNf Ym91bmQgKG1pbiwgY29kZSwgZXhwcl90eXBlLAotCQkJICAgICBzeW1fbWluX29wMCwgc3ltX21p bl9vcDEsCi0JCQkgICAgIG5lZ19taW5fb3AwLCBuZWdfbWluX29wMSk7Ci0gICAgICBhZGp1c3Rf c3ltYm9saWNfYm91bmQgKG1heCwgY29kZSwgZXhwcl90eXBlLAotCQkJICAgICBzeW1fbWF4X29w MCwgc3ltX21heF9vcDEsCi0JCQkgICAgIG5lZ19tYXhfb3AwLCBuZWdfbWF4X29wMSk7Ci0gICAg fQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIG90aGVyIGNhc2VzLCBmb3IgZXhhbXBsZSBp ZiB3ZSBoYXZlIGEgUExVU19FWFBSIHdpdGggdHdvCi0JIFZSX0FOVElfUkFOR0VzLCBkcm9wIHRv IFZSX1ZBUllJTkcuICBJdCB3b3VsZCB0YWtlIG1vcmUgZWZmb3J0Ci0JIHRvIGNvbXB1dGUgYSBw cmVjaXNlIHJhbmdlIGZvciBzdWNoIGEgY2FzZS4KLQkgPz8/ICBHZW5lcmFsIGV2ZW4gbWl4ZWQg cmFuZ2Uga2luZCBvcGVyYXRpb25zIGNhbiBiZSBleHByZXNzZWQKLQkgYnkgZm9yIGV4YW1wbGUg dHJhbnNmb3JtaW5nIH5bMywgNV0gKyBbMSwgMl0gdG8gcmFuZ2Utb25seQotCSBvcGVyYXRpb25z IGFuZCBhIHVuaW9uIHByaW1pdGl2ZToKLQkgWy1JTkYsIDJdICsgWzEsIDJdICBVICBbNSwgK0lO Rl0gKyBbMSwgMl0KLQkgWy1JTkYrMSwgNF0gICAgIFUgICAgWzYsICtJTkYoT1ZGKV0KLQkgdGhv dWdoIHVzdWFsbHkgdGhlIHVuaW9uIGlzIG5vdCBleGFjdGx5IHJlcHJlc2VudGFibGUgd2l0aAot CSBhIHNpbmdsZSByYW5nZSBvciBhbnRpLXJhbmdlIGFzIHRoZSBhYm92ZSBpcwotCSBbLUlORisx LCArSU5GKE9WRildIGludGVyc2VjdGVkIHdpdGggfls1LCA1XQotCSBidXQgb25lIGNvdWxkIHVz ZSBhIHNjaGVtZSBzaW1pbGFyIHRvIGVxdWl2YWxlbmNlcyBmb3IgdGhpcy4gKi8KLSAgICAgIHZy LT5zZXRfdmFyeWluZyAoZXhwcl90eXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyog SWYgZWl0aGVyIE1JTiBvciBNQVggb3ZlcmZsb3dlZCwgdGhlbiBzZXQgdGhlIHJlc3VsdGluZyBy YW5nZSB0bwotICAgICBWQVJZSU5HLiAgKi8KLSAgaWYgKG1pbiA9PSBOVUxMX1RSRUUKLSAgICAg IHx8IFRSRUVfT1ZFUkZMT1dfUCAobWluKQotICAgICAgfHwgbWF4ID09IE5VTExfVFJFRQotICAg ICAgfHwgVFJFRV9PVkVSRkxPV19QIChtYXgpKQotICAgIHsKLSAgICAgIHZyLT5zZXRfdmFyeWlu ZyAoZXhwcl90eXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW50IGNtcCA9IGNvbXBh cmVfdmFsdWVzIChtaW4sIG1heCk7Ci0gIGlmIChjbXAgPT0gLTIgfHwgY21wID09IDEpCi0gICAg ewotICAgICAgLyogSWYgdGhlIG5ldyByYW5nZSBoYXMgaXRzIGxpbWl0cyBzd2FwcGVkIGFyb3Vu ZCAoTUlOID4gTUFYKSwKLQkgdGhlbiB0aGUgb3BlcmF0aW9uIGNhdXNlZCBvbmUgb2YgdGhlbSB0 byB3cmFwIGFyb3VuZCwgbWFyawotCSB0aGUgbmV3IHJhbmdlIFZBUllJTkcuICAqLwotICAgICAg dnItPnNldF92YXJ5aW5nIChleHByX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAgIHZyLT5zZXQg KG1pbiwgbWF4LCBraW5kKTsKLX0KLQogLyogSWYgdGhlIHR5cGVzIHBhc3NlZCBhcmUgc3VwcG9y dGVkLCByZXR1cm4gVFJVRSwgb3RoZXJ3aXNlIHNldCBWUiB0bwogICAgVkFSWUlORyBhbmQgcmV0 dXJuIEZBTFNFLiAgKi8KIApAQCAtMTEzNCw4OSArNjA4LDYgQEAgZGVmaW5lZF9yYW5nZXNfcCAo dmFsdWVfcmFuZ2UgKnZyLAogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZhbHVlX3Jhbmdl Ci1kcm9wX3VuZGVmaW5lc190b192YXJ5aW5nIChjb25zdCB2YWx1ZV9yYW5nZSAqdnIsIHRyZWUg ZXhwcl90eXBlKQotewotICBpZiAodnItPnVuZGVmaW5lZF9wICgpKQotICAgIHJldHVybiB2YWx1 ZV9yYW5nZSAoZXhwcl90eXBlKTsKLSAgZWxzZQotICAgIHJldHVybiAqdnI7Ci19Ci0KLS8qIElm IGFueSBvcGVyYW5kIGlzIHN5bWJvbGljLCBwZXJmb3JtIGEgYmluYXJ5IG9wZXJhdGlvbiBvbiB0 aGVtIGFuZAotICAgcmV0dXJuIFRSVUUsIG90aGVyd2lzZSByZXR1cm4gRkFMU0UuICAqLwotCi1z dGF0aWMgYm9vbAotcmFuZ2VfZm9sZF9iaW5hcnlfc3ltYm9saWNzX3AgKHZhbHVlX3JhbmdlICp2 ciwKLQkJCSAgICAgICB0cmVlX2NvZGUgY29kZSwKLQkJCSAgICAgICB0cmVlIGV4cHJfdHlwZSwK LQkJCSAgICAgICBjb25zdCB2YWx1ZV9yYW5nZSAqdnIwXywKLQkJCSAgICAgICBjb25zdCB2YWx1 ZV9yYW5nZSAqdnIxXykKLXsKLSAgaWYgKHZyMF8tPnN5bWJvbGljX3AgKCkgfHwgdnIxXy0+c3lt Ym9saWNfcCAoKSkKLSAgICB7Ci0gICAgICB2YWx1ZV9yYW5nZSB2cjAgPSBkcm9wX3VuZGVmaW5l c190b192YXJ5aW5nICh2cjBfLCBleHByX3R5cGUpOwotICAgICAgdmFsdWVfcmFuZ2UgdnIxID0g ZHJvcF91bmRlZmluZXNfdG9fdmFyeWluZyAodnIxXywgZXhwcl90eXBlKTsKLSAgICAgIGlmICgo Y29kZSA9PSBQTFVTX0VYUFIgfHwgY29kZSA9PSBNSU5VU19FWFBSKSkKLQl7Ci0JICBleHRyYWN0 X3JhbmdlX2Zyb21fcGx1c19taW51c19leHByICh2ciwgY29kZSwgZXhwcl90eXBlLAotCQkJCQkg ICAgICAmdnIwLCAmdnIxKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGlmIChQT0lOVEVS X1RZUEVfUCAoZXhwcl90eXBlKSAmJiBjb2RlID09IFBPSU5URVJfUExVU19FWFBSKQotCXsKLQkg IGV4dHJhY3RfcmFuZ2VfZnJvbV9wb2ludGVyX3BsdXNfZXhwciAodnIsIGNvZGUsIGV4cHJfdHlw ZSwKLQkJCQkJCSZ2cjAsICZ2cjEpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgcmFuZ2Vf b3BfaGFuZGxlciBvcCAoY29kZSwgZXhwcl90eXBlKTsKLSAgICAgIGlmICghb3ApCi0JdnItPnNl dF92YXJ5aW5nIChleHByX3R5cGUpOwotICAgICAgdnIwLm5vcm1hbGl6ZV9zeW1ib2xpY3MgKCk7 Ci0gICAgICB2cjEubm9ybWFsaXplX3N5bWJvbGljcyAoKTsKLSAgICAgIHJldHVybiBvcC5mb2xk X3JhbmdlICgqdnIsIGV4cHJfdHlwZSwgdnIwLCB2cjEpOwotICAgIH0KLSAgcmV0dXJuIGZhbHNl OwotfQotCi0vKiBJZiBvcGVyYW5kIGlzIHN5bWJvbGljLCBwZXJmb3JtIGEgdW5hcnkgb3BlcmF0 aW9uIG9uIGl0IGFuZCByZXR1cm4KLSAgIFRSVUUsIG90aGVyd2lzZSByZXR1cm4gRkFMU0UuICAq LwotCi1zdGF0aWMgYm9vbAotcmFuZ2VfZm9sZF91bmFyeV9zeW1ib2xpY3NfcCAodmFsdWVfcmFu Z2UgKnZyLAotCQkJICAgICAgdHJlZV9jb2RlIGNvZGUsCi0JCQkgICAgICB0cmVlIGV4cHJfdHlw ZSwKLQkJCSAgICAgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjApCi17Ci0gIGlmICh2cjAtPnN5bWJv bGljX3AgKCkpCi0gICAgewotICAgICAgaWYgKGNvZGUgPT0gTkVHQVRFX0VYUFIpCi0JewotCSAg LyogLVggaXMgc2ltcGx5IDAgLSBYLiAgKi8KLQkgIHZhbHVlX3JhbmdlIHplcm87Ci0JICB6ZXJv LnNldF96ZXJvICh2cjAtPnR5cGUgKCkpOwotCSAgcmFuZ2VfZm9sZF9iaW5hcnlfZXhwciAodnIs IE1JTlVTX0VYUFIsIGV4cHJfdHlwZSwgJnplcm8sIHZyMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9 Ci0gICAgICBpZiAoY29kZSA9PSBCSVRfTk9UX0VYUFIpCi0JewotCSAgLyogflggaXMgc2ltcGx5 IC0xIC0gWC4gICovCi0JICB2YWx1ZV9yYW5nZSBtaW51c29uZTsKLQkgIHRyZWUgdCA9IGJ1aWxk X2ludF9jc3QgKHZyMC0+dHlwZSAoKSwgLTEpOwotCSAgbWludXNvbmUuc2V0ICh0LCB0KTsKLQkg IHJhbmdlX2ZvbGRfYmluYXJ5X2V4cHIgKHZyLCBNSU5VU19FWFBSLCBleHByX3R5cGUsICZtaW51 c29uZSwgdnIwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIHJhbmdlX29wX2hhbmRsZXIg b3AgKGNvZGUsIGV4cHJfdHlwZSk7Ci0gICAgICBpZiAoIW9wKQotCXZyLT5zZXRfdmFyeWluZyAo ZXhwcl90eXBlKTsKLSAgICAgIHZhbHVlX3JhbmdlIHZyMF9jc3QgKCp2cjApOwotICAgICAgdnIw X2NzdC5ub3JtYWxpemVfc3ltYm9saWNzICgpOwotICAgICAgcmV0dXJuIG9wLmZvbGRfcmFuZ2Ug KCp2ciwgZXhwcl90eXBlLCB2cjBfY3N0LCB2YWx1ZV9yYW5nZSAoZXhwcl90eXBlKSk7Ci0gICAg fQotICByZXR1cm4gZmFsc2U7Ci19Ci0KIC8qIFBlcmZvcm0gYSBiaW5hcnkgb3BlcmF0aW9uIG9u IGEgcGFpciBvZiByYW5nZXMuICAqLwogCiB2b2lkCkBAIC0xMjM2LDkgKzYyNyw2IEBAIHJhbmdl X2ZvbGRfYmluYXJ5X2V4cHIgKHZhbHVlX3JhbmdlICp2ciwKICAgICAgIHJldHVybjsKICAgICB9 CiAKLSAgaWYgKHJhbmdlX2ZvbGRfYmluYXJ5X3N5bWJvbGljc19wICh2ciwgY29kZSwgZXhwcl90 eXBlLCB2cjBfLCB2cjFfKSkKLSAgICByZXR1cm47Ci0KICAgdmFsdWVfcmFuZ2UgdnIwICgqdnIw Xyk7CiAgIHZhbHVlX3JhbmdlIHZyMSAoKnZyMV8pOwogICBpZiAodnIwLnVuZGVmaW5lZF9wICgp KQpAQCAtMTI2OSwyNDUgKzY1Nyw0MiBAQCByYW5nZV9mb2xkX3VuYXJ5X2V4cHIgKHZhbHVlX3Jh bmdlICp2ciwKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgaWYgKHJhbmdlX2ZvbGRfdW5hcnlf c3ltYm9saWNzX3AgKHZyLCBjb2RlLCBleHByX3R5cGUsIHZyMCkpCi0gICAgcmV0dXJuOwotCiAg IHZhbHVlX3JhbmdlIHZyMF9jc3QgKCp2cjApOwogICB2cjBfY3N0Lm5vcm1hbGl6ZV9hZGRyZXNz ZXMgKCk7CiAgIGlmICghb3AuZm9sZF9yYW5nZSAoKnZyLCBleHByX3R5cGUsIHZyMF9jc3QsIHZh bHVlX3JhbmdlIChleHByX3R5cGUpKSkKICAgICB2ci0+c2V0X3ZhcnlpbmcgKGV4cHJfdHlwZSk7 CiB9CiAKLS8qIElmIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGFrZW4gYnkgT1AgY2FuIGJlIGluZmVy cmVkIGFmdGVyIFNUTVQgZXhlY3V0ZXMsCi0gICByZXR1cm4gdGhlIGNvbXBhcmlzb24gY29kZSAo Q09NUF9DT0RFX1ApIGFuZCB2YWx1ZSAoVkFMX1ApIHRoYXQKLSAgIGRlc2NyaWJlcyB0aGUgaW5m ZXJyZWQgcmFuZ2UuICBSZXR1cm4gdHJ1ZSBpZiBhIHJhbmdlIGNvdWxkIGJlCi0gICBpbmZlcnJl ZC4gICovCi0KLWJvb2wKLWluZmVyX3ZhbHVlX3JhbmdlIChnaW1wbGUgKnN0bXQsIHRyZWUgb3As IHRyZWVfY29kZSAqY29tcF9jb2RlX3AsIHRyZWUgKnZhbF9wKQotewotICAqdmFsX3AgPSBOVUxM X1RSRUU7Ci0gICpjb21wX2NvZGVfcCA9IEVSUk9SX01BUks7Ci0KLSAgLyogRG8gbm90IGF0dGVt cHQgdG8gaW5mZXIgYW55dGhpbmcgaW4gbmFtZXMgdGhhdCBmbG93IHRocm91Z2gKLSAgICAgYWJu b3JtYWwgZWRnZXMuICAqLwotICBpZiAoU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAo b3ApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiBTVE1UIGlzIHRoZSBsYXN0IHN0YXRl bWVudCBvZiBhIGJhc2ljIGJsb2NrIHdpdGggbm8gbm9ybWFsCi0gICAgIHN1Y2Nlc3NvcnMsIHRo ZXJlIGlzIG5vIHBvaW50IGluZmVycmluZyBhbnl0aGluZyBhYm91dCBhbnkgb2YgaXRzCi0gICAg IG9wZXJhbmRzLiAgV2Ugd291bGQgbm90IGJlIGFibGUgdG8gZmluZCBhIHByb3BlciBpbnNlcnRp b24gcG9pbnQKLSAgICAgZm9yIHRoZSBhc3NlcnRpb24sIGFueXdheS4gICovCi0gIGlmIChzdG10 X2VuZHNfYmJfcCAoc3RtdCkpCi0gICAgewotICAgICAgZWRnZV9pdGVyYXRvciBlaTsKLSAgICAg IGVkZ2UgZTsKLQotICAgICAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGdpbXBsZV9iYiAoc3RtdCkt PnN1Y2NzKQotCWlmICghKGUtPmZsYWdzICYgKEVER0VfQUJOT1JNQUx8RURHRV9FSCkpKQotCSAg YnJlYWs7Ci0gICAgICBpZiAoZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAg aWYgKGluZmVyX25vbm51bGxfcmFuZ2UgKHN0bXQsIG9wKSkKLSAgICB7Ci0gICAgICAqdmFsX3Ag PSBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKG9wKSwgMCk7Ci0gICAgICAqY29tcF9jb2RlX3Ag PSBORV9FWFBSOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQorLyogSGVscGVyIGZvciBvdmVy Zmxvd19jb21wYXJpc29uX3AKIAotICByZXR1cm4gZmFsc2U7Ci19CisgICBPUDAgQ09ERSBPUDEg aXMgYSBjb21wYXJpc29uLiAgRXhhbWluZSB0aGUgY29tcGFyaXNvbiBhbmQgcG90ZW50aWFsbHkK KyAgIE9QMSdzIGRlZmluaW5nIHN0YXRlbWVudCB0byBzZWUgaWYgaXQgdWx0aW1hdGVseSBoYXMg dGhlIGZvcm0KKyAgIE9QMCBDT0RFIChPUDAgUExVUyBJTlRFR0VSX0NTVCkKIAotLyogRHVtcCBh c3NlcnRfaW5mbyBzdHJ1Y3R1cmUuICAqLworICAgSWYgc28sIHJldHVybiBUUlVFIGluZGljYXRp bmcgdGhpcyBpcyBhbiBvdmVyZmxvdyB0ZXN0IGFuZCBzdG9yZSBpbnRvCisgICAqTkVXX0NTVCBh biB1cGRhdGVkIGNvbnN0YW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBuYXJyb3dlZCByYW5nZSB0 ZXN0LgogCi12b2lkCi1kdW1wX2Fzc2VydF9pbmZvIChGSUxFICpmaWxlLCBjb25zdCBhc3NlcnRf aW5mbyAmYXNzZXJ0KQotewotICBmcHJpbnRmIChmaWxlLCAiQXNzZXJ0IGZvcjogIik7Ci0gIHBy aW50X2dlbmVyaWNfZXhwciAoZmlsZSwgYXNzZXJ0Lm5hbWUpOwotICBmcHJpbnRmIChmaWxlLCAi XG5cdFBSRURJQ0FURTogZXhwcj1bIik7Ci0gIHByaW50X2dlbmVyaWNfZXhwciAoZmlsZSwgYXNz ZXJ0LmV4cHIpOwotICBmcHJpbnRmIChmaWxlLCAiXSAlcyAiLCBnZXRfdHJlZV9jb2RlX25hbWUg KGFzc2VydC5jb21wX2NvZGUpKTsKLSAgZnByaW50ZiAoZmlsZSwgInZhbD1bIik7Ci0gIHByaW50 X2dlbmVyaWNfZXhwciAoZmlsZSwgYXNzZXJ0LnZhbCk7Ci0gIGZwcmludGYgKGZpbGUsICJdXG5c biIpOwotfQorICAgUkVWRVJTRUQgaW5kaWNhdGVzIGlmIHRoZSBjb21wYXJpc29uIHdhcyBvcmln aW5hbGx5OgogCi1ERUJVR19GVU5DVElPTiB2b2lkCi1kZWJ1ZyAoY29uc3QgYXNzZXJ0X2luZm8g JmFzc2VydCkKLXsKLSAgZHVtcF9hc3NlcnRfaW5mbyAoc3RkZXJyLCBhc3NlcnQpOwotfQorICAg T1AxIENPREUnIE9QMC4KIAotLyogRHVtcCBhIHZlY3RvciBvZiBhc3NlcnRfaW5mbydzLiAgKi8K KyAgIFRoaXMgYWZmZWN0cyBob3cgd2UgYnVpbGQgdGhlIHVwZGF0ZWQgY29uc3RhbnQuICAqLwog Ci12b2lkCi1kdW1wX2Fzc2VydHNfaW5mbyAoRklMRSAqZmlsZSwgY29uc3QgdmVjPGFzc2VydF9p bmZvPiAmYXNzZXJ0cykKK3N0YXRpYyBib29sCitvdmVyZmxvd19jb21wYXJpc29uX3BfMSAoZW51 bSB0cmVlX2NvZGUgY29kZSwgdHJlZSBvcDAsIHRyZWUgb3AxLAorCQkJIGJvb2wgZm9sbG93X2Fz c2VydF9leHBycywgYm9vbCByZXZlcnNlZCwgdHJlZSAqbmV3X2NzdCkKIHsKLSAgZm9yICh1bnNp Z25lZCBpID0gMDsgaSA8IGFzc2VydHMubGVuZ3RoICgpOyArK2kpCisgIC8qIFNlZSBpZiB0aGlz IGlzIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gYmV0d2VlbiB0d28gU1NBX05BTUVTIHdpdGgKKyAg ICAgdW5zaWduZWQsIG92ZXJmbG93IHdyYXBwaW5nIHZhbHVlcy4gIElmIHNvLCBjaGVjayBpdCBt b3JlIGRlZXBseS4gICovCisgIGlmICgoY29kZSA9PSBMVF9FWFBSIHx8IGNvZGUgPT0gTEVfRVhQ UgorICAgICAgIHx8IGNvZGUgPT0gR0VfRVhQUiB8fCBjb2RlID09IEdUX0VYUFIpCisgICAgICAm JiBUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUKKyAgICAgICYmIFRSRUVfQ09ERSAob3AxKSA9 PSBTU0FfTkFNRQorICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG9wMCkpCisg ICAgICAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG9wMCkpCisgICAgICAmJiBUWVBFX09W RVJGTE9XX1dSQVBTIChUUkVFX1RZUEUgKG9wMCkpKQogICAgIHsKLSAgICAgIGR1bXBfYXNzZXJ0 X2luZm8gKGZpbGUsIGFzc2VydHNbaV0pOwotICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0g ICAgfQotfQotCi1ERUJVR19GVU5DVElPTiB2b2lkCi1kZWJ1ZyAoY29uc3QgdmVjPGFzc2VydF9p bmZvPiAmYXNzZXJ0cykKLXsKLSAgZHVtcF9hc3NlcnRzX2luZm8gKHN0ZGVyciwgYXNzZXJ0cyk7 Ci19Ci0KLS8qIFB1c2ggdGhlIGFzc2VydCBpbmZvIGZvciBOQU1FLCBFWFBSLCBDT01QX0NPREUg YW5kIFZBTCB0byBBU1NFUlRTLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9hc3NlcnRfaW5mbyAo dmVjPGFzc2VydF9pbmZvPiAmYXNzZXJ0cywKLQkJIHRyZWUgbmFtZSwgdHJlZSBleHByLCBlbnVt IHRyZWVfY29kZSBjb21wX2NvZGUsIHRyZWUgdmFsKQotewotICBhc3NlcnRfaW5mbyBpbmZvOwot ICBpbmZvLmNvbXBfY29kZSA9IGNvbXBfY29kZTsKLSAgaW5mby5uYW1lID0gbmFtZTsKLSAgaWYg KFRSRUVfT1ZFUkZMT1dfUCAodmFsKSkKLSAgICB2YWwgPSBkcm9wX3RyZWVfb3ZlcmZsb3cgKHZh bCk7Ci0gIGluZm8udmFsID0gdmFsOwotICBpbmZvLmV4cHIgPSBleHByOwotICBhc3NlcnRzLnNh ZmVfcHVzaCAoaW5mbyk7Ci0gIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKLSAgICBkdW1wX3ByaW50 ZiAoTVNHX05PVEUgfCBNU0dfUFJJT1JJVFlfSU5URVJOQUxTLAotCQkgIkFkZGluZyBhc3NlcnQg Zm9yICVUIGZyb20gJVQgJXMgJVRcbiIsCi0JCSBuYW1lLCBleHByLCBvcF9zeW1ib2xfY29kZSAo Y29tcF9jb2RlKSwgdmFsKTsKLX0KLQotLyogKENPTkRfT1AwIENPTkRfQ09ERSBDT05EX09QMSkg aXMgYSBwcmVkaWNhdGUgd2hpY2ggdXNlcyBOQU1FLgotICAgRXh0cmFjdCBhIHN1aXRhYmxlIHRl c3QgY29kZSBhbmQgdmFsdWUgYW5kIHN0b3JlIHRoZW0gaW50byAqQ09ERV9QIGFuZAotICAgKlZB TF9QIHNvIHRoZSBwcmVkaWNhdGUgaXMgbm9ybWFsaXplZCB0byBOQU1FICpDT0RFX1AgKlZBTF9Q LgotCi0gICBJZiBubyBleHRyYWN0aW9uIHdhcyBwb3NzaWJsZSwgcmV0dXJuIEZBTFNFLCBvdGhl cndpc2UgcmV0dXJuIFRSVUUuCi0KLSAgIElmIElOVkVSVCBpcyB0cnVlLCB0aGVuIHdlIGludmVy dCB0aGUgcmVzdWx0IHN0b3JlZCBpbnRvICpDT0RFX1AuICAqLwotCi1zdGF0aWMgYm9vbAotZXh0 cmFjdF9jb2RlX2FuZF92YWxfZnJvbV9jb25kX3dpdGhfb3BzICh0cmVlIG5hbWUsIGVudW0gdHJl ZV9jb2RlIGNvbmRfY29kZSwKLQkJCQkJIHRyZWUgY29uZF9vcDAsIHRyZWUgY29uZF9vcDEsCi0J CQkJCSBib29sIGludmVydCwgZW51bSB0cmVlX2NvZGUgKmNvZGVfcCwKLQkJCQkJIHRyZWUgKnZh bF9wKQotewotICBlbnVtIHRyZWVfY29kZSBjb21wX2NvZGU7Ci0gIHRyZWUgdmFsOwotCi0gIC8q IE90aGVyd2lzZSwgd2UgaGF2ZSBhIGNvbXBhcmlzb24gb2YgdGhlIGZvcm0gTkFNRSBDT01QIFZB TAotICAgICBvciBWQUwgQ09NUCBOQU1FLiAgKi8KLSAgaWYgKG5hbWUgPT0gY29uZF9vcDEpCi0g ICAgewotICAgICAgLyogSWYgdGhlIHByZWRpY2F0ZSBpcyBvZiB0aGUgZm9ybSBWQUwgQ09NUCBO QU1FLCBmbGlwCi0JIENPTVAgYXJvdW5kIGJlY2F1c2Ugd2UgbmVlZCB0byByZWdpc3RlciBOQU1F IGFzIHRoZQotCSBmaXJzdCBvcGVyYW5kIGluIHRoZSBwcmVkaWNhdGUuICAqLwotICAgICAgY29t cF9jb2RlID0gc3dhcF90cmVlX2NvbXBhcmlzb24gKGNvbmRfY29kZSk7Ci0gICAgICB2YWwgPSBj b25kX29wMDsKLSAgICB9Ci0gIGVsc2UgaWYgKG5hbWUgPT0gY29uZF9vcDApCi0gICAgewotICAg ICAgLyogVGhlIGNvbXBhcmlzb24gaXMgb2YgdGhlIGZvcm0gTkFNRSBDT01QIFZBTCwgc28gdGhl Ci0JIGNvbXBhcmlzb24gY29kZSByZW1haW5zIHVuY2hhbmdlZC4gICovCi0gICAgICBjb21wX2Nv ZGUgPSBjb25kX2NvZGU7Ci0gICAgICB2YWwgPSBjb25kX29wMTsKLSAgICB9Ci0gIGVsc2UKLSAg ICBnY2NfdW5yZWFjaGFibGUgKCk7Ci0KLSAgLyogSW52ZXJ0IHRoZSBjb21wYXJpc29uIGNvZGUg YXMgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGludmVydCkKLSAgICBjb21wX2NvZGUgPSBpbnZlcnRf dHJlZV9jb21wYXJpc29uIChjb21wX2NvZGUsIDApOwotCi0gIC8qIFZSUCBvbmx5IGhhbmRsZXMg aW50ZWdyYWwgYW5kIHBvaW50ZXIgdHlwZXMuICAqLwotICBpZiAoISBJTlRFR1JBTF9UWVBFX1Ag KFRSRUVfVFlQRSAodmFsKSkKLSAgICAgICYmICEgUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAo dmFsKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERvIG5vdCByZWdpc3RlciBhbHdheXMt ZmFsc2UgcHJlZGljYXRlcy4KLSAgICAgRklYTUU6ICB0aGlzIHdvcmtzIGFyb3VuZCBhIGxpbWl0 YXRpb24gaW4gZm9sZCgpIHdoZW4gZGVhbGluZyB3aXRoCi0gICAgIGVudW1lcmF0aW9ucy4gIEdp dmVuICdlbnVtIHsgTjEsIE4yIH0geDsnLCBmb2xkIHdpbGwgbm90Ci0gICAgIGZvbGQgJ2lmICh4 ID4gTjIpJyB0byAnaWYgKDApJy4gICovCi0gIGlmICgoY29tcF9jb2RlID09IEdUX0VYUFIgfHwg Y29tcF9jb2RlID09IExUX0VYUFIpCi0gICAgICAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQ RSAodmFsKSkpCi0gICAgewotICAgICAgdHJlZSBtaW4gPSBUWVBFX01JTl9WQUxVRSAoVFJFRV9U WVBFICh2YWwpKTsKLSAgICAgIHRyZWUgbWF4ID0gVFlQRV9NQVhfVkFMVUUgKFRSRUVfVFlQRSAo dmFsKSk7Ci0KLSAgICAgIGlmIChjb21wX2NvZGUgPT0gR1RfRVhQUgotCSAgJiYgKCFtYXgKLQkg ICAgICB8fCBjb21wYXJlX3ZhbHVlcyAodmFsLCBtYXgpID09IDApKQotCXJldHVybiBmYWxzZTsK LQotICAgICAgaWYgKGNvbXBfY29kZSA9PSBMVF9FWFBSCi0JICAmJiAoIW1pbgotCSAgICAgIHx8 IGNvbXBhcmVfdmFsdWVzICh2YWwsIG1pbikgPT0gMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0K LSAgKmNvZGVfcCA9IGNvbXBfY29kZTsKLSAgKnZhbF9wID0gdmFsOwotICByZXR1cm4gdHJ1ZTsK LX0KLQotLyogRmluZCBvdXQgc21hbGxlc3QgUkVTIHdoZXJlIFJFUyA+IFZBTCAmJiAoUkVTICYg TUFTSykgPT0gUkVTLCBpZiBhbnkKLSAgIChvdGhlcndpc2UgcmV0dXJuIFZBTCkuICBWQUwgYW5k IE1BU0sgbXVzdCBiZSB6ZXJvLWV4dGVuZGVkIGZvcgotICAgcHJlY2lzaW9uIFBSRUMuICBJZiBT R05CSVQgaXMgbm9uLXplcm8sIGZpcnN0IHhvciBWQUwgd2l0aCBTR05CSVQKLSAgICh0byB0cmFu c2Zvcm0gc2lnbmVkIHZhbHVlcyBpbnRvIHVuc2lnbmVkKSBhbmQgYXQgdGhlIGVuZCB4b3IKLSAg IFNHTkJJVCBiYWNrLiAgKi8KLQotd2lkZV9pbnQKLW1hc2tlZF9pbmNyZW1lbnQgKGNvbnN0IHdp ZGVfaW50ICZ2YWxfaW4sIGNvbnN0IHdpZGVfaW50ICZtYXNrLAotCQkgIGNvbnN0IHdpZGVfaW50 ICZzZ25iaXQsIHVuc2lnbmVkIGludCBwcmVjKQotewotICB3aWRlX2ludCBiaXQgPSB3aTo6b25l IChwcmVjKSwgcmVzOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICB3aWRlX2ludCB2YWwgPSB2YWxf aW4gXiBzZ25iaXQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyssIGJpdCArPSBiaXQpCi0g ICAgewotICAgICAgcmVzID0gbWFzazsKLSAgICAgIGlmICgocmVzICYgYml0KSA9PSAwKQotCWNv bnRpbnVlOwotICAgICAgcmVzID0gYml0IC0gMTsKLSAgICAgIHJlcyA9IHdpOjpiaXRfYW5kX25v dCAodmFsICsgYml0LCByZXMpOwotICAgICAgcmVzICY9IG1hc2s7Ci0gICAgICBpZiAod2k6Omd0 dV9wIChyZXMsIHZhbCkpCi0JcmV0dXJuIHJlcyBeIHNnbmJpdDsKLSAgICB9Ci0gIHJldHVybiB2 YWwgXiBzZ25iaXQ7Ci19Ci0KLS8qIEhlbHBlciBmb3Igb3ZlcmZsb3dfY29tcGFyaXNvbl9wCi0K LSAgIE9QMCBDT0RFIE9QMSBpcyBhIGNvbXBhcmlzb24uICBFeGFtaW5lIHRoZSBjb21wYXJpc29u IGFuZCBwb3RlbnRpYWxseQotICAgT1AxJ3MgZGVmaW5pbmcgc3RhdGVtZW50IHRvIHNlZSBpZiBp dCB1bHRpbWF0ZWx5IGhhcyB0aGUgZm9ybQotICAgT1AwIENPREUgKE9QMCBQTFVTIElOVEVHRVJf Q1NUKQotCi0gICBJZiBzbywgcmV0dXJuIFRSVUUgaW5kaWNhdGluZyB0aGlzIGlzIGFuIG92ZXJm bG93IHRlc3QgYW5kIHN0b3JlIGludG8KLSAgICpORVdfQ1NUIGFuIHVwZGF0ZWQgY29uc3RhbnQg dGhhdCBjYW4gYmUgdXNlZCBpbiBhIG5hcnJvd2VkIHJhbmdlIHRlc3QuCi0KLSAgIFJFVkVSU0VE IGluZGljYXRlcyBpZiB0aGUgY29tcGFyaXNvbiB3YXMgb3JpZ2luYWxseToKLQotICAgT1AxIENP REUnIE9QMC4KLQotICAgVGhpcyBhZmZlY3RzIGhvdyB3ZSBidWlsZCB0aGUgdXBkYXRlZCBjb25z dGFudC4gICovCi0KLXN0YXRpYyBib29sCi1vdmVyZmxvd19jb21wYXJpc29uX3BfMSAoZW51bSB0 cmVlX2NvZGUgY29kZSwgdHJlZSBvcDAsIHRyZWUgb3AxLAotCQkgICAgICAgICBib29sIGZvbGxv d19hc3NlcnRfZXhwcnMsIGJvb2wgcmV2ZXJzZWQsIHRyZWUgKm5ld19jc3QpCi17Ci0gIC8qIFNl ZSBpZiB0aGlzIGlzIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gYmV0d2VlbiB0d28gU1NBX05BTUVT IHdpdGgKLSAgICAgdW5zaWduZWQsIG92ZXJmbG93IHdyYXBwaW5nIHZhbHVlcy4gIElmIHNvLCBj aGVjayBpdCBtb3JlIGRlZXBseS4gICovCi0gIGlmICgoY29kZSA9PSBMVF9FWFBSIHx8IGNvZGUg PT0gTEVfRVhQUgotICAgICAgIHx8IGNvZGUgPT0gR0VfRVhQUiB8fCBjb2RlID09IEdUX0VYUFIp Ci0gICAgICAmJiBUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUKLSAgICAgICYmIFRSRUVfQ09E RSAob3AxKSA9PSBTU0FfTkFNRQotICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUg KG9wMCkpCi0gICAgICAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG9wMCkpCi0gICAgICAm JiBUWVBFX09WRVJGTE9XX1dSQVBTIChUUkVFX1RZUEUgKG9wMCkpKQotICAgIHsKLSAgICAgIGdp bXBsZSAqb3AxX2RlZiA9IFNTQV9OQU1FX0RFRl9TVE1UIChvcDEpOworICAgICAgZ2ltcGxlICpv cDFfZGVmID0gU1NBX05BTUVfREVGX1NUTVQgKG9wMSk7CiAKICAgICAgIC8qIElmIHJlcXVlc3Rl ZCwgZm9sbG93IGFueSBBU1NFUlRfRVhQUnMgYmFja3dhcmRzIGZvciBPUDEuICAqLwogICAgICAg aWYgKGZvbGxvd19hc3NlcnRfZXhwcnMpCkBAIC0xNTg5LDI4NDQgKzc3NCwyMzYgQEAgb3ZlcmZs b3dfY29tcGFyaXNvbl9wICh0cmVlX2NvZGUgY29kZSwgdHJlZSBuYW1lLCB0cmVlIHZhbCwKIAkJ CQkgIHVzZV9lcXVpdl9wLCB0cnVlLCBuZXdfY3N0KTsKIH0KIAorLyogSGFuZGxlCisgICBfNCA9 IHhfMyAmIDMxOworICAgaWYgKF80ICE9IDApCisgICAgIGdvdG8gPGJiIDY+OworICAgZWxzZQor ICAgICBnb3RvIDxiYiA3PjsKKyAgIDxiYiA2PjoKKyAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSAo KTsKKyAgIDxiYiA3PjoKKyAgIHhfNSA9IEFTU0VSVF9FWFBSIDx4XzMsIC4uLj47CisgICBJZiB4 XzMgaGFzIG5vIG90aGVyIGltbWVkaWF0ZSB1c2VzIChjaGVja2VkIGJ5IGNhbGxlciksCisgICB2 YXIgaXMgdGhlIHhfMyB2YXIgZnJvbSBBU1NFUlRfRVhQUiwgd2UgY2FuIGNsZWFyIGxvdyA1IGJp dHMKKyAgIGZyb20gdGhlIG5vbi16ZXJvIGJpdG1hc2suICAqLwogCi0vKiBUcnkgdG8gcmVnaXN0 ZXIgYW4gZWRnZSBhc3NlcnRpb24gZm9yIFNTQSBuYW1lIE5BTUUgb24gZWRnZSBFIGZvcgotICAg dGhlIGNvbmRpdGlvbiBDT05EIGNvbnRyaWJ1dGluZyB0byB0aGUgY29uZGl0aW9uYWwganVtcCBw b2ludGVkIHRvIGJ5IEJTSS4KLSAgIEludmVydCB0aGUgY29uZGl0aW9uIENPTkQgaWYgSU5WRVJU IGlzIHRydWUuICAqLwotCi1zdGF0aWMgdm9pZAotcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzIg KHRyZWUgbmFtZSwgZWRnZSBlLAotCQkJICAgIGVudW0gdHJlZV9jb2RlIGNvbmRfY29kZSwKLQkJ CSAgICB0cmVlIGNvbmRfb3AwLCB0cmVlIGNvbmRfb3AxLCBib29sIGludmVydCwKLQkJCSAgICB2 ZWM8YXNzZXJ0X2luZm8+ICZhc3NlcnRzKQordm9pZAorbWF5YmVfc2V0X25vbnplcm9fYml0cyAo ZWRnZSBlLCB0cmVlIHZhcikKIHsKLSAgdHJlZSB2YWw7Ci0gIGVudW0gdHJlZV9jb2RlIGNvbXBf Y29kZTsKKyAgYmFzaWNfYmxvY2sgY29uZF9iYiA9IGUtPnNyYzsKKyAgZ2ltcGxlICpzdG10ID0g bGFzdF9zdG10IChjb25kX2JiKTsKKyAgdHJlZSBjc3Q7CiAKLSAgaWYgKCFleHRyYWN0X2NvZGVf YW5kX3ZhbF9mcm9tX2NvbmRfd2l0aF9vcHMgKG5hbWUsIGNvbmRfY29kZSwKLQkJCQkJCWNvbmRf b3AwLAotCQkJCQkJY29uZF9vcDEsCi0JCQkJCQlpbnZlcnQsICZjb21wX2NvZGUsICZ2YWwpKQor ICBpZiAoc3RtdCA9PSBOVUxMCisgICAgICB8fCBnaW1wbGVfY29kZSAoc3RtdCkgIT0gR0lNUExF X0NPTkQKKyAgICAgIHx8IGdpbXBsZV9jb25kX2NvZGUgKHN0bXQpICE9ICgoZS0+ZmxhZ3MgJiBF REdFX1RSVUVfVkFMVUUpCisJCQkJICAgICA/IEVRX0VYUFIgOiBORV9FWFBSKQorICAgICAgfHwg VFJFRV9DT0RFIChnaW1wbGVfY29uZF9saHMgKHN0bXQpKSAhPSBTU0FfTkFNRQorICAgICAgfHwg IWludGVnZXJfemVyb3AgKGdpbXBsZV9jb25kX3JocyAoc3RtdCkpKQogICAgIHJldHVybjsKIAot ICAvKiBRdWV1ZSB0aGUgYXNzZXJ0LiAgKi8KLSAgdHJlZSB4OwotICBpZiAob3ZlcmZsb3dfY29t cGFyaXNvbl9wIChjb21wX2NvZGUsIG5hbWUsIHZhbCwgZmFsc2UsICZ4KSkKLSAgICB7Ci0gICAg ICBlbnVtIHRyZWVfY29kZSBuZXdfY29kZSA9ICgoY29tcF9jb2RlID09IEdUX0VYUFIgfHwgY29t cF9jb2RlID09IEdFX0VYUFIpCi0JCQkJID8gR1RfRVhQUiA6IExFX0VYUFIpOwotICAgICAgYWRk X2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lLCBuYW1lLCBuZXdfY29kZSwgeCk7Ci0gICAgfQot ICBhZGRfYXNzZXJ0X2luZm8gKGFzc2VydHMsIG5hbWUsIG5hbWUsIGNvbXBfY29kZSwgdmFsKTsK LQotICAvKiBJbiB0aGUgY2FzZSBvZiBOQU1FIDw9IENTVCBhbmQgTkFNRSBiZWluZyBkZWZpbmVk IGFzCi0gICAgIE5BTUUgPSAodW5zaWduZWQpIE5BTUUyICsgQ1NUMiB3ZSBjYW4gYXNzZXJ0IE5B TUUyID49IC1DU1QyCi0gICAgIGFuZCBOQU1FMiA8PSBDU1QgLSBDU1QyLiAgV2UgY2FuIGRvIHRo ZSBzYW1lIGZvciBOQU1FID4gQ1NULgotICAgICBUaGlzIGNhdGNoZXMgcmFuZ2UgYW5kIGFudGkt cmFuZ2UgdGVzdHMuICAqLwotICBpZiAoKGNvbXBfY29kZSA9PSBMRV9FWFBSCi0gICAgICAgfHwg Y29tcF9jb2RlID09IEdUX0VYUFIpCi0gICAgICAmJiBUUkVFX0NPREUgKHZhbCkgPT0gSU5URUdF Ul9DU1QKLSAgICAgICYmIFRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAodmFsKSkpCisgIHN0bXQg PSBTU0FfTkFNRV9ERUZfU1RNVCAoZ2ltcGxlX2NvbmRfbGhzIChzdG10KSk7CisgIGlmICghaXNf Z2ltcGxlX2Fzc2lnbiAoc3RtdCkKKyAgICAgIHx8IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0 bXQpICE9IEJJVF9BTkRfRVhQUgorICAgICAgfHwgVFJFRV9DT0RFIChnaW1wbGVfYXNzaWduX3Jo czIgKHN0bXQpKSAhPSBJTlRFR0VSX0NTVCkKKyAgICByZXR1cm47CisgIGlmIChnaW1wbGVfYXNz aWduX3JoczEgKHN0bXQpICE9IHZhcikKICAgICB7Ci0gICAgICBnaW1wbGUgKmRlZl9zdG10ID0g U1NBX05BTUVfREVGX1NUTVQgKG5hbWUpOwotICAgICAgdHJlZSBjc3QyID0gTlVMTF9UUkVFLCBu YW1lMiA9IE5VTExfVFJFRSwgbmFtZTMgPSBOVUxMX1RSRUU7CisgICAgICBnaW1wbGUgKnN0bXQy OwogCi0gICAgICAvKiBFeHRyYWN0IENTVDIgZnJvbSB0aGUgKG9wdGlvbmFsKSBhZGRpdGlvbi4g ICovCi0gICAgICBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAmJiBnaW1wbGVf YXNzaWduX3Joc19jb2RlIChkZWZfc3RtdCkgPT0gUExVU19FWFBSKQotCXsKLQkgIG5hbWUyID0g Z2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JICBjc3QyID0gZ2ltcGxlX2Fzc2lnbl9y aHMyIChkZWZfc3RtdCk7Ci0JICBpZiAoVFJFRV9DT0RFIChuYW1lMikgPT0gU1NBX05BTUUKLQkg ICAgICAmJiBUUkVFX0NPREUgKGNzdDIpID09IElOVEVHRVJfQ1NUKQotCSAgICBkZWZfc3RtdCA9 IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lMik7Ci0JfQorICAgICAgaWYgKFRSRUVfQ09ERSAoZ2lt cGxlX2Fzc2lnbl9yaHMxIChzdG10KSkgIT0gU1NBX05BTUUpCisJcmV0dXJuOworICAgICAgc3Rt dDIgPSBTU0FfTkFNRV9ERUZfU1RNVCAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KSk7CisgICAg ICBpZiAoIWdpbXBsZV9hc3NpZ25fY2FzdF9wIChzdG10MikKKwkgIHx8IGdpbXBsZV9hc3NpZ25f cmhzMSAoc3RtdDIpICE9IHZhcgorCSAgfHwgIUNPTlZFUlRfRVhQUl9DT0RFX1AgKGdpbXBsZV9h c3NpZ25fcmhzX2NvZGUgKHN0bXQyKSkKKwkgIHx8IChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBF IChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpKSkKKwkJCSAgICAgICE9IFRZUEVfUFJFQ0lTSU9O IChUUkVFX1RZUEUgKHZhcikpKSkKKwlyZXR1cm47CisgICAgfQorICBjc3QgPSBnaW1wbGVfYXNz aWduX3JoczIgKHN0bXQpOworICBzZXRfbm9uemVyb19iaXRzICh2YXIsIHdpOjpiaXRfYW5kX25v dCAoZ2V0X25vbnplcm9fYml0cyAodmFyKSwKKwkJCQkJICB3aTo6dG9fd2lkZSAoY3N0KSkpOwor fQogCi0gICAgICAvKiBFeHRyYWN0IE5BTUUyIGZyb20gdGhlIChvcHRpb25hbCkgc2lnbi1jaGFu Z2luZyBjYXN0LiAgKi8KLSAgICAgIGlmIChnYXNzaWduICphc3MgPSBkeW5fY2FzdCA8Z2Fzc2ln biAqPiAoZGVmX3N0bXQpKQotCXsKLQkgIGlmIChDT05WRVJUX0VYUFJfQ09ERV9QIChnaW1wbGVf YXNzaWduX3Joc19jb2RlIChhc3MpKQotCSAgICAgICYmICEgVFlQRV9VTlNJR05FRCAoVFJFRV9U WVBFIChnaW1wbGVfYXNzaWduX3JoczEgKGFzcykpKQotCSAgICAgICYmIChUWVBFX1BSRUNJU0lP TiAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoYXNzKSkpCi0JCSAgPT0gVFlQRV9QUkVD SVNJT04gKFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChhc3MpKSkpKQotCSAgICBuYW1l MyA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoYXNzKTsKLQl9CisvKiBTZWFyY2hlcyB0aGUgY2FzZSBs YWJlbCB2ZWN0b3IgVkVDIGZvciB0aGUgaW5kZXggKklEWCBvZiB0aGUgQ0FTRV9MQUJFTAorICAg dGhhdCBpbmNsdWRlcyB0aGUgdmFsdWUgVkFMLiAgVGhlIHNlYXJjaCBpcyByZXN0cmljdGVkIHRv IHRoZSByYW5nZQorICAgW1NUQVJUX0lEWCwgbiAtIDFdIHdoZXJlIG4gaXMgdGhlIHNpemUgb2Yg VkVDLgogCi0gICAgICAvKiBJZiBuYW1lMyBpcyB1c2VkIGxhdGVyLCBjcmVhdGUgYW4gQVNTRVJU X0VYUFIgZm9yIGl0LiAgKi8KLSAgICAgIGlmIChuYW1lMyAhPSBOVUxMX1RSRUUKLSAgICAgIAkg ICYmIFRSRUVfQ09ERSAobmFtZTMpID09IFNTQV9OQU1FCi0JICAmJiAoY3N0MiA9PSBOVUxMX1RS RUUKLQkgICAgICB8fCBUUkVFX0NPREUgKGNzdDIpID09IElOVEVHRVJfQ1NUKQotCSAgJiYgSU5U RUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG5hbWUzKSkpCi0JewotCSAgdHJlZSB0bXA7CisgICBJ ZiB0aGVyZSBpcyBhIENBU0VfTEFCRUwgZm9yIFZBTCwgaXRzIGluZGV4IGlzIHBsYWNlZCBpbiBJ RFggYW5kIHRydWUgaXMKKyAgIHJldHVybmVkLgogCi0JICAvKiBCdWlsZCBhbiBleHByZXNzaW9u IGZvciB0aGUgcmFuZ2UgdGVzdC4gICovCi0JICB0bXAgPSBidWlsZDEgKE5PUF9FWFBSLCBUUkVF X1RZUEUgKG5hbWUpLCBuYW1lMyk7Ci0JICBpZiAoY3N0MiAhPSBOVUxMX1RSRUUpCi0JICAgIHRt cCA9IGJ1aWxkMiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG5hbWUpLCB0bXAsIGNzdDIpOwotCSAg YWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lMywgdG1wLCBjb21wX2NvZGUsIHZhbCk7Ci0J fQorICAgSWYgdGhlcmUgaXMgbm8gQ0FTRV9MQUJFTCBmb3IgVkFMIGFuZCB0aGVyZSBpcyBvbmUg dGhhdCBpcyBsYXJnZXIgdGhhbiBWQUwsCisgICBpdCBpcyBwbGFjZWQgaW4gSURYIGFuZCBmYWxz ZSBpcyByZXR1cm5lZC4KIAotICAgICAgLyogSWYgbmFtZTIgaXMgdXNlZCBsYXRlciwgY3JlYXRl IGFuIEFTU0VSVF9FWFBSIGZvciBpdC4gICovCi0gICAgICBpZiAobmFtZTIgIT0gTlVMTF9UUkVF Ci0gICAgICAJICAmJiBUUkVFX0NPREUgKG5hbWUyKSA9PSBTU0FfTkFNRQotCSAgJiYgVFJFRV9D T0RFIChjc3QyKSA9PSBJTlRFR0VSX0NTVAotCSAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZ UEUgKG5hbWUyKSkpCi0JewotCSAgdHJlZSB0bXA7Ci0KLQkgIC8qIEJ1aWxkIGFuIGV4cHJlc3Np b24gZm9yIHRoZSByYW5nZSB0ZXN0LiAgKi8KLQkgIHRtcCA9IG5hbWUyOwotCSAgaWYgKFRSRUVf VFlQRSAobmFtZSkgIT0gVFJFRV9UWVBFIChuYW1lMikpCi0JICAgIHRtcCA9IGJ1aWxkMSAoTk9Q X0VYUFIsIFRSRUVfVFlQRSAobmFtZSksIHRtcCk7Ci0JICBpZiAoY3N0MiAhPSBOVUxMX1RSRUUp Ci0JICAgIHRtcCA9IGJ1aWxkMiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG5hbWUpLCB0bXAsIGNz dDIpOwotCSAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBjb21wX2NvZGUs IHZhbCk7Ci0JfQotICAgIH0KKyAgIElmIFZBTCBpcyBsYXJnZXIgdGhhbiBhbnkgQ0FTRV9MQUJF TCwgbiBpcyBwbGFjZWQgb24gSURYIGFuZCBmYWxzZSBpcworICAgcmV0dXJuZWQuICovCiAKLSAg LyogSW4gdGhlIGNhc2Ugb2YgcG9zdC1pbi9kZWNyZW1lbnQgdGVzdHMgbGlrZSBpZiAoaSsrKSAu Li4gYW5kIHVzZXMKLSAgICAgb2YgdGhlIGluL2RlY3JlbWVudGVkIHZhbHVlIG9uIHRoZSBlZGdl IHRoZSBleHRyYSBuYW1lIHdlIHdhbnQgdG8KLSAgICAgYXNzZXJ0IGZvciBpcyBub3Qgb24gdGhl IGRlZiBjaGFpbiBvZiB0aGUgbmFtZSBjb21wYXJlZC4gIEluc3RlYWQKLSAgICAgaXQgaXMgaW4g dGhlIHNldCBvZiB1c2Ugc3RtdHMuCi0gICAgIFNpbWlsYXIgY2FzZXMgaGFwcGVuIGZvciBjb252 ZXJzaW9ucyB0aGF0IHdlcmUgc2ltcGxpZmllZCB0aHJvdWdoCi0gICAgIGZvbGRfe3NpZ25fY2hh bmdlZCx3aWRlbmVkfV9jb21wYXJpc29uLiAgKi8KLSAgaWYgKChjb21wX2NvZGUgPT0gTkVfRVhQ UgotICAgICAgIHx8IGNvbXBfY29kZSA9PSBFUV9FWFBSKQotICAgICAgJiYgVFJFRV9DT0RFICh2 YWwpID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAgICAgIGltbV91c2VfaXRlcmF0b3IgdWk7Ci0g ICAgICBnaW1wbGUgKnVzZV9zdG10OwotICAgICAgRk9SX0VBQ0hfSU1NX1VTRV9TVE1UICh1c2Vf c3RtdCwgdWksIG5hbWUpCi0JewotCSAgaWYgKCFpc19naW1wbGVfYXNzaWduICh1c2Vfc3RtdCkp Ci0JICAgIGNvbnRpbnVlOworYm9vbAorZmluZF9jYXNlX2xhYmVsX2luZGV4IChnc3dpdGNoICpz dG10LCBzaXplX3Qgc3RhcnRfaWR4LCB0cmVlIHZhbCwgc2l6ZV90ICppZHgpCit7CisgIHNpemVf dCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzdG10KTsKKyAgc2l6ZV90IGxvdywgaGln aDsKIAotCSAgLyogQ3V0IG9mZiB0byB1c2Utc3RtdHMgdGhhdCBhcmUgZG9taW5hdGluZyB0aGUg cHJlZGVjZXNzb3IuICAqLwotCSAgaWYgKCFkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlOQVRPUlMs IGUtPnNyYywgZ2ltcGxlX2JiICh1c2Vfc3RtdCkpKQotCSAgICBjb250aW51ZTsKKyAgLyogRmlu ZCBjYXNlIGxhYmVsIGZvciBtaW5pbXVtIG9mIHRoZSB2YWx1ZSByYW5nZSBvciB0aGUgbmV4dCBv bmUuCisgICAgIEF0IGVhY2ggaXRlcmF0aW9uIHdlIGFyZSBzZWFyY2hpbmcgaW4gW2xvdywgaGln aCAtIDFdLiAqLwogCi0JICB0cmVlIG5hbWUyID0gZ2ltcGxlX2Fzc2lnbl9saHMgKHVzZV9zdG10 KTsKLQkgIGlmIChUUkVFX0NPREUgKG5hbWUyKSAhPSBTU0FfTkFNRSkKLQkgICAgY29udGludWU7 CisgIGZvciAobG93ID0gc3RhcnRfaWR4LCBoaWdoID0gbjsgaGlnaCAhPSBsb3c7ICkKKyAgICB7 CisgICAgICB0cmVlIHQ7CisgICAgICBpbnQgY21wOworICAgICAgLyogTm90ZSB0aGF0IGkgIT0g aGlnaCwgc28gd2UgbmV2ZXIgYXNrIGZvciBuLiAqLworICAgICAgc2l6ZV90IGkgPSAoaGlnaCAr IGxvdykgLyAyOworICAgICAgdCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpOwogCi0J ICBlbnVtIHRyZWVfY29kZSBjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAodXNlX3N0bXQp OwotCSAgdHJlZSBjc3Q7Ci0JICBpZiAoY29kZSA9PSBQTFVTX0VYUFIKLQkgICAgICB8fCBjb2Rl ID09IE1JTlVTX0VYUFIpCi0JICAgIHsKLQkgICAgICBjc3QgPSBnaW1wbGVfYXNzaWduX3JoczIg KHVzZV9zdG10KTsKLQkgICAgICBpZiAoVFJFRV9DT0RFIChjc3QpICE9IElOVEVHRVJfQ1NUKQot CQljb250aW51ZTsKLQkgICAgICBjc3QgPSBpbnRfY29uc3RfYmlub3AgKGNvZGUsIHZhbCwgY3N0 KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAoY29kZSkpCi0JICAg IHsKLQkgICAgICAvKiBGb3IgdHJ1bmNhdGluZyBjb252ZXJzaW9ucyB3ZSBjYW5ub3QgcmVjb3Jk Ci0JCSBhbiBpbmVxdWFsaXR5LiAgKi8KLQkgICAgICBpZiAoY29tcF9jb2RlID09IE5FX0VYUFIK LQkJICAmJiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZTIpKQotCQkgICAgICA8IFRZ UEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKG5hbWUpKSkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGNz dCA9IGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChuYW1lMiksIHZhbCk7Ci0JICAgIH0KLQkgIGVs c2UKLQkgICAgY29udGludWU7CisgICAgICAvKiBDYWNoZSB0aGUgcmVzdWx0IG9mIGNvbXBhcmlu ZyBDQVNFX0xPVyBhbmQgdmFsLiAgKi8KKyAgICAgIGNtcCA9IHRyZWVfaW50X2NzdF9jb21wYXJl IChDQVNFX0xPVyAodCksIHZhbCk7CiAKLQkgIGlmIChUUkVFX09WRVJGTE9XX1AgKGNzdCkpCi0J ICAgIGNzdCA9IGRyb3BfdHJlZV9vdmVyZmxvdyAoY3N0KTsKLQkgIGFkZF9hc3NlcnRfaW5mbyAo YXNzZXJ0cywgbmFtZTIsIG5hbWUyLCBjb21wX2NvZGUsIGNzdCk7Ci0JfQotICAgIH0KLSAKLSAg aWYgKFRSRUVfQ09ERV9DTEFTUyAoY29tcF9jb2RlKSA9PSB0Y2NfY29tcGFyaXNvbgotICAgICAg JiYgVFJFRV9DT0RFICh2YWwpID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAgICAgIGdpbXBsZSAq ZGVmX3N0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAobmFtZSk7Ci0gICAgICB0cmVlIG5hbWUyID0g TlVMTF9UUkVFLCBuYW1lc1syXSwgY3N0MiA9IE5VTExfVFJFRTsKLSAgICAgIHRyZWUgdmFsMiA9 IE5VTExfVFJFRTsKLSAgICAgIHVuc2lnbmVkIGludCBwcmVjID0gVFlQRV9QUkVDSVNJT04gKFRS RUVfVFlQRSAodmFsKSk7Ci0gICAgICB3aWRlX2ludCBtYXNrID0gd2k6Onplcm8gKHByZWMpOwot ICAgICAgdW5zaWduZWQgaW50IG5wcmVjID0gcHJlYzsKLSAgICAgIGVudW0gdHJlZV9jb2RlIHJo c19jb2RlID0gRVJST1JfTUFSSzsKLQotICAgICAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKGRlZl9z dG10KSkKLQlyaHNfY29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9zdG10KTsKLQot ICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgTkFNRSAhPSBDU1QxIHdoZXJlIE5BTUUgPSBBICstIENT VDIgd2UgY2FuCi0gICAgICAgICBhc3NlcnQgdGhhdCBBICE9IENTVDEgLSsgQ1NUMi4gICovCi0g ICAgICBpZiAoKGNvbXBfY29kZSA9PSBFUV9FWFBSIHx8IGNvbXBfY29kZSA9PSBORV9FWFBSKQot CSAgJiYgKHJoc19jb2RlID09IFBMVVNfRVhQUiB8fCByaHNfY29kZSA9PSBNSU5VU19FWFBSKSkK KyAgICAgIGlmIChjbXAgPT0gMCkKIAl7Ci0JICB0cmVlIG9wMCA9IGdpbXBsZV9hc3NpZ25fcmhz MSAoZGVmX3N0bXQpOwotCSAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10 KTsKLQkgIGlmIChUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUKLQkgICAgICAmJiBUUkVFX0NP REUgKG9wMSkgPT0gSU5URUdFUl9DU1QpCi0JICAgIHsKLQkgICAgICBlbnVtIHRyZWVfY29kZSBy ZXZlcnNlX29wID0gKHJoc19jb2RlID09IFBMVVNfRVhQUgotCQkJCQkgICA/IE1JTlVTX0VYUFIg OiBQTFVTX0VYUFIpOwotCSAgICAgIG9wMSA9IGludF9jb25zdF9iaW5vcCAocmV2ZXJzZV9vcCwg dmFsLCBvcDEpOwotCSAgICAgIGlmIChUUkVFX09WRVJGTE9XIChvcDEpKQotCQlvcDEgPSBkcm9w X3RyZWVfb3ZlcmZsb3cgKG9wMSk7Ci0JICAgICAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBv cDAsIG9wMCwgY29tcF9jb2RlLCBvcDEpOwotCSAgICB9CisJICAvKiBSYW5nZXMgY2Fubm90IGJl IGVtcHR5LiAqLworCSAgKmlkeCA9IGk7CisJICByZXR1cm4gdHJ1ZTsKIAl9Ci0KLSAgICAgIC8q IEFkZCBhc3NlcnRzIGZvciBOQU1FIGNtcCBDU1QgYW5kIE5BTUUgYmVpbmcgZGVmaW5lZAotCSBh cyBOQU1FID0gKGludCkgTkFNRTIuICAqLwotICAgICAgaWYgKCFUWVBFX1VOU0lHTkVEIChUUkVF X1RZUEUgKHZhbCkpCi0JICAmJiAoY29tcF9jb2RlID09IExFX0VYUFIgfHwgY29tcF9jb2RlID09 IExUX0VYUFIKLQkgICAgICB8fCBjb21wX2NvZGUgPT0gR1RfRVhQUiB8fCBjb21wX2NvZGUgPT0g R0VfRVhQUikKLQkgICYmIGdpbXBsZV9hc3NpZ25fY2FzdF9wIChkZWZfc3RtdCkpCisgICAgICBl bHNlIGlmIChjbXAgPiAwKQorCWhpZ2ggPSBpOworICAgICAgZWxzZQogCXsKLQkgIG5hbWUyID0g Z2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JICBpZiAoQ09OVkVSVF9FWFBSX0NPREVf UCAocmhzX2NvZGUpCi0JICAgICAgJiYgVFJFRV9DT0RFIChuYW1lMikgPT0gU1NBX05BTUUKLQkg ICAgICAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAobmFtZTIpKQotCSAgICAgICYmIFRZ UEVfVU5TSUdORUQgKFRSRUVfVFlQRSAobmFtZTIpKQotCSAgICAgICYmIHByZWMgPT0gVFlQRV9Q UkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZTIpKQotCSAgICAgICYmIChjb21wX2NvZGUgPT0gTEVf RVhQUiB8fCBjb21wX2NvZGUgPT0gR1RfRVhQUgotCQkgIHx8ICF0cmVlX2ludF9jc3RfZXF1YWwg KHZhbCwKLQkJCQkJICBUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh2YWwpKSkpKQorCSAgbG93 ID0gaSArIDE7CisJICBpZiAoQ0FTRV9ISUdIICh0KSAhPSBOVUxMCisJICAgICAgJiYgdHJlZV9p bnRfY3N0X2NvbXBhcmUgKENBU0VfSElHSCAodCksIHZhbCkgPj0gMCkKIAkgICAgewotCSAgICAg IHRyZWUgdG1wLCBjc3Q7Ci0JICAgICAgZW51bSB0cmVlX2NvZGUgbmV3X2NvbXBfY29kZSA9IGNv bXBfY29kZTsKLQotCSAgICAgIGNzdCA9IGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChuYW1lMiks Ci0JCQkJICBUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh2YWwpKSk7Ci0JICAgICAgLyogQnVp bGQgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHJhbmdlIHRlc3QuICAqLwotCSAgICAgIHRtcCA9IGJ1 aWxkMiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG5hbWUyKSwgbmFtZTIsIGNzdCk7Ci0JICAgICAg Y3N0ID0gZm9sZF9idWlsZDIgKFBMVVNfRVhQUiwgVFJFRV9UWVBFIChuYW1lMiksIGNzdCwKLQkJ CQkgZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKG5hbWUyKSwgdmFsKSk7Ci0JICAgICAgaWYgKGNv bXBfY29kZSA9PSBMVF9FWFBSIHx8IGNvbXBfY29kZSA9PSBHRV9FWFBSKQotCQl7Ci0JCSAgbmV3 X2NvbXBfY29kZSA9IGNvbXBfY29kZSA9PSBMVF9FWFBSID8gTEVfRVhQUiA6IEdUX0VYUFI7Ci0J CSAgY3N0ID0gZm9sZF9idWlsZDIgKE1JTlVTX0VYUFIsIFRSRUVfVFlQRSAobmFtZTIpLCBjc3Qs Ci0JCQkJICAgICBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKG5hbWUyKSwgMSkpOwotCQl9Ci0J ICAgICAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBuZXdfY29tcF9jb2Rl LCBjc3QpOworCSAgICAgICppZHggPSBpOworCSAgICAgIHJldHVybiB0cnVlOwogCSAgICB9CiAJ fQorICAgIH0KIAotICAgICAgLyogQWRkIGFzc2VydHMgZm9yIE5BTUUgY21wIENTVCBhbmQgTkFN RSBiZWluZyBkZWZpbmVkIGFzCi0JIE5BTUUgPSBOQU1FMiA+PiBDU1QyLgorICAqaWR4ID0gaGln aDsKKyAgcmV0dXJuIGZhbHNlOworfQogCi0JIEV4dHJhY3QgQ1NUMiBmcm9tIHRoZSByaWdodCBz aGlmdC4gICovCi0gICAgICBpZiAocmhzX2NvZGUgPT0gUlNISUZUX0VYUFIpCi0JewotCSAgbmFt ZTIgPSBnaW1wbGVfYXNzaWduX3JoczEgKGRlZl9zdG10KTsKLQkgIGNzdDIgPSBnaW1wbGVfYXNz aWduX3JoczIgKGRlZl9zdG10KTsKLQkgIGlmIChUUkVFX0NPREUgKG5hbWUyKSA9PSBTU0FfTkFN RQotCSAgICAgICYmIHRyZWVfZml0c191aHdpX3AgKGNzdDIpCi0JICAgICAgJiYgSU5URUdSQUxf VFlQRV9QIChUUkVFX1RZUEUgKG5hbWUyKSkKLQkgICAgICAmJiBJTl9SQU5HRSAodHJlZV90b191 aHdpIChjc3QyKSwgMSwgcHJlYyAtIDEpCi0JICAgICAgJiYgdHlwZV9oYXNfbW9kZV9wcmVjaXNp b25fcCAoVFJFRV9UWVBFICh2YWwpKSkKLQkgICAgewotCSAgICAgIG1hc2sgPSB3aTo6bWFzayAo dHJlZV90b191aHdpIChjc3QyKSwgZmFsc2UsIHByZWMpOwotCSAgICAgIHZhbDIgPSBmb2xkX2Jp bmFyeSAoTFNISUZUX0VYUFIsIFRSRUVfVFlQRSAodmFsKSwgdmFsLCBjc3QyKTsKLQkgICAgfQot CX0KLSAgICAgIGlmICh2YWwyICE9IE5VTExfVFJFRQotCSAgJiYgVFJFRV9DT0RFICh2YWwyKSA9 PSBJTlRFR0VSX0NTVAotCSAgJiYgc2ltcGxlX2NzdF9lcXVhbCAoZm9sZF9idWlsZDIgKFJTSElG VF9FWFBSLAotCQkJCQkgICAgVFJFRV9UWVBFICh2YWwpLAotCQkJCQkgICAgdmFsMiwgY3N0Miks IHZhbCkpCi0JewotCSAgZW51bSB0cmVlX2NvZGUgbmV3X2NvbXBfY29kZSA9IGNvbXBfY29kZTsK LQkgIHRyZWUgdG1wLCBuZXdfdmFsOworLyogU2VhcmNoZXMgdGhlIGNhc2UgbGFiZWwgdmVjdG9y IFZFQyBmb3IgdGhlIHJhbmdlIG9mIENBU0VfTEFCRUxzIHRoYXQgaXMgdXNlZAorICAgZm9yIHZh bHVlcyBiZXR3ZWVuIE1JTiBhbmQgTUFYLiBUaGUgZmlyc3QgaW5kZXggaXMgcGxhY2VkIGluIE1J Tl9JRFguIFRoZQorICAgbGFzdCBpbmRleCBpcyBwbGFjZWQgaW4gTUFYX0lEWC4gSWYgdGhlIHJh bmdlIG9mIENBU0VfTEFCRUxzIGlzIGVtcHR5CisgICB0aGVuIE1BWF9JRFggPCBNSU5fSURYLgor ICAgUmV0dXJucyB0cnVlIGlmIHRoZSBkZWZhdWx0IGxhYmVsIGlzIG5vdCBuZWVkZWQuICovCiAK LQkgIHRtcCA9IG5hbWUyOwotCSAgaWYgKGNvbXBfY29kZSA9PSBFUV9FWFBSIHx8IGNvbXBfY29k ZSA9PSBORV9FWFBSKQotCSAgICB7Ci0JICAgICAgaWYgKCFUWVBFX1VOU0lHTkVEIChUUkVFX1RZ UEUgKHZhbCkpKQotCQl7Ci0JCSAgdHJlZSB0eXBlID0gYnVpbGRfbm9uc3RhbmRhcmRfaW50ZWdl cl90eXBlIChwcmVjLCAxKTsKLQkJICB0bXAgPSBidWlsZDEgKE5PUF9FWFBSLCB0eXBlLCBuYW1l Mik7Ci0JCSAgdmFsMiA9IGZvbGRfY29udmVydCAodHlwZSwgdmFsMik7Ci0JCX0KLQkgICAgICB0 bXAgPSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQUiwgVFJFRV9UWVBFICh0bXApLCB0bXAsIHZhbDIp OwotCSAgICAgIG5ld192YWwgPSB3aWRlX2ludF90b190cmVlIChUUkVFX1RZUEUgKHRtcCksIG1h c2spOwotCSAgICAgIG5ld19jb21wX2NvZGUgPSBjb21wX2NvZGUgPT0gRVFfRVhQUiA/IExFX0VY UFIgOiBHVF9FWFBSOwotCSAgICB9Ci0JICBlbHNlIGlmIChjb21wX2NvZGUgPT0gTFRfRVhQUiB8 fCBjb21wX2NvZGUgPT0gR0VfRVhQUikKLQkgICAgewotCSAgICAgIHdpZGVfaW50IG1pbnZhbAot CQk9IHdpOjptaW5fdmFsdWUgKHByZWMsIFRZUEVfU0lHTiAoVFJFRV9UWVBFICh2YWwpKSk7Ci0J ICAgICAgbmV3X3ZhbCA9IHZhbDI7Ci0JICAgICAgaWYgKG1pbnZhbCA9PSB3aTo6dG9fd2lkZSAo bmV3X3ZhbCkpCi0JCW5ld192YWwgPSBOVUxMX1RSRUU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAg ewotCSAgICAgIHdpZGVfaW50IG1heHZhbAotCQk9IHdpOjptYXhfdmFsdWUgKHByZWMsIFRZUEVf U0lHTiAoVFJFRV9UWVBFICh2YWwpKSk7Ci0JICAgICAgbWFzayB8PSB3aTo6dG9fd2lkZSAodmFs Mik7Ci0JICAgICAgaWYgKHdpOjplcV9wIChtYXNrLCBtYXh2YWwpKQotCQluZXdfdmFsID0gTlVM TF9UUkVFOwotCSAgICAgIGVsc2UKLQkJbmV3X3ZhbCA9IHdpZGVfaW50X3RvX3RyZWUgKFRSRUVf VFlQRSAodmFsMiksIG1hc2spOwotCSAgICB9Citib29sCitmaW5kX2Nhc2VfbGFiZWxfcmFuZ2Ug KGdzd2l0Y2ggKnN0bXQsIHRyZWUgbWluLCB0cmVlIG1heCwgc2l6ZV90ICptaW5faWR4LAorCQkg ICAgICAgc2l6ZV90ICptYXhfaWR4KQoreworICBzaXplX3QgaSwgajsKKyAgYm9vbCBtaW5fdGFr ZV9kZWZhdWx0ID0gIWZpbmRfY2FzZV9sYWJlbF9pbmRleCAoc3RtdCwgMSwgbWluLCAmaSk7Cisg IGJvb2wgbWF4X3Rha2VfZGVmYXVsdCA9ICFmaW5kX2Nhc2VfbGFiZWxfaW5kZXggKHN0bXQsIGks IG1heCwgJmopOwogCi0JICBpZiAobmV3X3ZhbCkKLQkgICAgYWRkX2Fzc2VydF9pbmZvIChhc3Nl cnRzLCBuYW1lMiwgdG1wLCBuZXdfY29tcF9jb2RlLCBuZXdfdmFsKTsKLQl9CisgIGlmIChpID09 IGoKKyAgICAgICYmIG1pbl90YWtlX2RlZmF1bHQKKyAgICAgICYmIG1heF90YWtlX2RlZmF1bHQp CisgICAgeworICAgICAgLyogT25seSB0aGUgZGVmYXVsdCBjYXNlIGxhYmVsIHJlYWNoZWQuCisg ICAgICAgICBSZXR1cm4gYW4gZW1wdHkgcmFuZ2UuICovCisgICAgICAqbWluX2lkeCA9IDE7Cisg ICAgICAqbWF4X2lkeCA9IDA7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisg ICAgeworICAgICAgYm9vbCB0YWtlX2RlZmF1bHQgPSBtaW5fdGFrZV9kZWZhdWx0IHx8IG1heF90 YWtlX2RlZmF1bHQ7CisgICAgICB0cmVlIGxvdywgaGlnaDsKKyAgICAgIHNpemVfdCBrOwogCi0g ICAgICAvKiBJZiB3ZSBoYXZlIGEgY29udmVyc2lvbiB0aGF0IGRvZXNuJ3QgY2hhbmdlIHRoZSB2 YWx1ZSBvZiB0aGUgc291cmNlCi0gICAgICAgICBzaW1wbHkgcmVnaXN0ZXIgdGhlIHNhbWUgYXNz ZXJ0IGZvciBpdC4gICovCi0gICAgICBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAocmhzX2NvZGUp KQotCXsKLQkgIHZhbHVlX3JhbmdlIHZyOwotCSAgdHJlZSByaHMxID0gZ2ltcGxlX2Fzc2lnbl9y aHMxIChkZWZfc3RtdCk7Ci0JICBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKHJoczEp KQotCSAgICAgICYmIFRSRUVfQ09ERSAocmhzMSkgPT0gU1NBX05BTUUKLQkgICAgICAvKiBNYWtl IHN1cmUgdGhlIHJlbGF0aW9uIHByZXNlcnZlcyB0aGUgdXBwZXIvbG93ZXIgYm91bmRhcnkgb2YK LQkgICAgICAgICB0aGUgcmFuZ2UgY29uc2VydmF0aXZlbHkuICAqLwotCSAgICAgICYmIChjb21w X2NvZGUgPT0gTkVfRVhQUgotCQkgIHx8IGNvbXBfY29kZSA9PSBFUV9FWFBSCi0JCSAgfHwgKFRZ UEVfU0lHTiAoVFJFRV9UWVBFIChuYW1lKSkKLQkJICAgICAgPT0gVFlQRV9TSUdOIChUUkVFX1RZ UEUgKHJoczEpKSkKLQkJICB8fCAoKGNvbXBfY29kZSA9PSBMRV9FWFBSCi0JCSAgICAgICB8fCBj b21wX2NvZGUgPT0gTFRfRVhQUikKLQkJICAgICAgJiYgIVRZUEVfVU5TSUdORUQgKFRSRUVfVFlQ RSAocmhzMSkpKQotCQkgIHx8ICgoY29tcF9jb2RlID09IEdFX0VYUFIKLQkJICAgICAgIHx8IGNv bXBfY29kZSA9PSBHVF9FWFBSKQotCQkgICAgICAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUg KHJoczEpKSkpCi0JICAgICAgLyogQW5kIHRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGFsdGVyIHRo ZSB2YWx1ZSB3ZSBjb21wYXJlCi0JICAgICAgICAgYWdhaW5zdCBhbmQgYWxsIHZhbHVlcyBpbiBy aHMxIGNhbiBiZSByZXByZXNlbnRlZCBpbgotCQkgdGhlIGNvbnZlcnRlZCB0byB0eXBlLiAgKi8K LQkgICAgICAmJiBpbnRfZml0c190eXBlX3AgKHZhbCwgVFJFRV9UWVBFIChyaHMxKSkKLQkgICAg ICAmJiAoKFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKG5hbWUpKQotCQkgICA+IFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKHJoczEpKSkKLQkJICB8fCAoKGdldF9yYW5nZV9xdWVyeSAoY2Z1 biktPnJhbmdlX29mX2V4cHIgKHZyLCByaHMxKQotCQkgICAgICAgJiYgdnIua2luZCAoKSA9PSBW Ul9SQU5HRSkKLQkJICAgICAgJiYgd2k6OmZpdHNfdG9fdHJlZV9wCi0JCQkgICAod2lkZXN0X2lu dDo6ZnJvbSAodnIubG93ZXJfYm91bmQgKCksCi0JCQkJCSAgICAgIFRZUEVfU0lHTiAoVFJFRV9U WVBFIChyaHMxKSkpLAotCQkJICAgIFRSRUVfVFlQRSAobmFtZSkpCi0JCSAgICAgICYmIHdpOjpm aXRzX3RvX3RyZWVfcAotCQkJICAgKHdpZGVzdF9pbnQ6OmZyb20gKHZyLnVwcGVyX2JvdW5kICgp LAotCQkJCQkgICAgICBUWVBFX1NJR04gKFRSRUVfVFlQRSAocmhzMSkpKSwKLQkJCSAgICBUUkVF X1RZUEUgKG5hbWUpKSkpKQotCSAgICBhZGRfYXNzZXJ0X2luZm8gKGFzc2VydHMsIHJoczEsIHJo czEsCi0JCSAJICAgICBjb21wX2NvZGUsIGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChyaHMxKSwg dmFsKSk7Ci0JfQorICAgICAgaWYgKG1heF90YWtlX2RlZmF1bHQpCisJai0tOwogCi0gICAgICAv KiBBZGQgYXNzZXJ0cyBmb3IgTkFNRSBjbXAgQ1NUIGFuZCBOQU1FIGJlaW5nIGRlZmluZWQgYXMK LQkgTkFNRSA9IE5BTUUyICYgQ1NUMi4KLQotCSBFeHRyYWN0IENTVDIgZnJvbSB0aGUgYW5kLgot Ci0JIEFsc28gaGFuZGxlCi0JIE5BTUUgPSAodW5zaWduZWQpIE5BTUUyOwotCSBjYXN0cyB3aGVy ZSBOQU1FJ3MgdHlwZSBpcyB1bnNpZ25lZCBhbmQgaGFzIHNtYWxsZXIgcHJlY2lzaW9uCi0JIHRo YW4gTkFNRTIncyB0eXBlIGFzIGlmIGl0IHdhcyBOQU1FID0gTkFNRTIgJiBNQVNLLiAgKi8KLSAg ICAgIG5hbWVzWzBdID0gTlVMTF9UUkVFOwotICAgICAgbmFtZXNbMV0gPSBOVUxMX1RSRUU7Ci0g ICAgICBjc3QyID0gTlVMTF9UUkVFOwotICAgICAgaWYgKHJoc19jb2RlID09IEJJVF9BTkRfRVhQ UgotCSAgfHwgKENPTlZFUlRfRVhQUl9DT0RFX1AgKHJoc19jb2RlKQotCSAgICAgICYmIElOVEVH UkFMX1RZUEVfUCAoVFJFRV9UWVBFICh2YWwpKQotCSAgICAgICYmIFRZUEVfVU5TSUdORUQgKFRS RUVfVFlQRSAodmFsKSkKLQkgICAgICAmJiBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChnaW1w bGVfYXNzaWduX3JoczEgKGRlZl9zdG10KSkpCi0JCSA+IHByZWMpKQorICAgICAgLyogSWYgdGhl IGNhc2UgbGFiZWwgcmFuZ2UgaXMgY29udGludW91cywgd2UgZG8gbm90IG5lZWQKKwkgdGhlIGRl ZmF1bHQgY2FzZSBsYWJlbC4gIFZlcmlmeSB0aGF0LiAgKi8KKyAgICAgIGhpZ2ggPSBDQVNFX0xP VyAoZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSkpOworICAgICAgaWYgKENBU0VfSElHSCAo Z2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSkpKQorCWhpZ2ggPSBDQVNFX0hJR0ggKGdpbXBs ZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpKTsKKyAgICAgIGZvciAoayA9IGkgKyAxOyBrIDw9IGo7 ICsraykKIAl7Ci0JICBuYW1lMiA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQpOwotCSAg aWYgKHJoc19jb2RlID09IEJJVF9BTkRfRVhQUikKLQkgICAgY3N0MiA9IGdpbXBsZV9hc3NpZ25f cmhzMiAoZGVmX3N0bXQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY3N0MiA9IFRZUEVfTUFY X1ZBTFVFIChUUkVFX1RZUEUgKHZhbCkpOwotCSAgICAgIG5wcmVjID0gVFlQRV9QUkVDSVNJT04g KFRSRUVfVFlQRSAobmFtZTIpKTsKLQkgICAgfQotCSAgaWYgKFRSRUVfQ09ERSAobmFtZTIpID09 IFNTQV9OQU1FCi0JICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG5hbWUyKSkK LQkgICAgICAmJiBUUkVFX0NPREUgKGNzdDIpID09IElOVEVHRVJfQ1NUCi0JICAgICAgJiYgIWlu dGVnZXJfemVyb3AgKGNzdDIpCi0JICAgICAgJiYgKG5wcmVjID4gMQotCQkgIHx8IFRZUEVfVU5T SUdORUQgKFRSRUVfVFlQRSAodmFsKSkpKQorCSAgbG93ID0gQ0FTRV9MT1cgKGdpbXBsZV9zd2l0 Y2hfbGFiZWwgKHN0bXQsIGspKTsKKwkgIGlmICghaW50ZWdlcl9vbmVwIChpbnRfY29uc3RfYmlu b3AgKE1JTlVTX0VYUFIsIGxvdywgaGlnaCkpKQogCSAgICB7Ci0JICAgICAgZ2ltcGxlICpkZWZf c3RtdDIgPSBTU0FfTkFNRV9ERUZfU1RNVCAobmFtZTIpOwotCSAgICAgIGlmIChnaW1wbGVfYXNz aWduX2Nhc3RfcCAoZGVmX3N0bXQyKSkKLQkJewotCQkgIG5hbWVzWzFdID0gZ2ltcGxlX2Fzc2ln bl9yaHMxIChkZWZfc3RtdDIpOwotCQkgIGlmICghQ09OVkVSVF9FWFBSX0NPREVfUCAoZ2ltcGxl X2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQyKSkKLQkJICAgICAgfHwgVFJFRV9DT0RFIChuYW1l c1sxXSkgIT0gU1NBX05BTUUKLQkJICAgICAgfHwgIUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBF IChuYW1lc1sxXSkpCi0JCSAgICAgIHx8IChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChuYW1l MikpCi0JCQkgICE9IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKG5hbWVzWzFdKSkpKQotCQkg ICAgbmFtZXNbMV0gPSBOVUxMX1RSRUU7Ci0JCX0KLQkgICAgICBuYW1lc1swXSA9IG5hbWUyOwor CSAgICAgIHRha2VfZGVmYXVsdCA9IHRydWU7CisJICAgICAgYnJlYWs7CiAJICAgIH0KKwkgIGhp Z2ggPSBsb3c7CisJICBpZiAoQ0FTRV9ISUdIIChnaW1wbGVfc3dpdGNoX2xhYmVsIChzdG10LCBr KSkpCisJICAgIGhpZ2ggPSBDQVNFX0hJR0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGsp KTsKIAl9Ci0gICAgICBpZiAobmFtZXNbMF0gfHwgbmFtZXNbMV0pCi0JewotCSAgd2lkZV9pbnQg bWludiwgbWF4diwgdmFsdiwgY3N0MnY7Ci0JICB3aWRlX2ludCB0ZW0sIHNnbmJpdDsKLQkgIGJv b2wgdmFsaWRfcCA9IGZhbHNlLCB2YWxuLCBjc3QybjsKLQkgIGVudW0gdHJlZV9jb2RlIGNjb2Rl ID0gY29tcF9jb2RlOwotCi0JICB2YWx2ID0gd2lkZV9pbnQ6OmZyb20gKHdpOjp0b193aWRlICh2 YWwpLCBucHJlYywgVU5TSUdORUQpOwotCSAgY3N0MnYgPSB3aWRlX2ludDo6ZnJvbSAod2k6OnRv X3dpZGUgKGNzdDIpLCBucHJlYywgVU5TSUdORUQpOwotCSAgdmFsbiA9IHdpOjpuZWdfcCAodmFs diwgVFlQRV9TSUdOIChUUkVFX1RZUEUgKHZhbCkpKTsKLQkgIGNzdDJuID0gd2k6Om5lZ19wIChj c3QydiwgVFlQRV9TSUdOIChUUkVFX1RZUEUgKHZhbCkpKTsKLQkgIC8qIElmIENTVDIgZG9lc24n dCBoYXZlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCwKLQkgICAgIGJ1dCBWQUwgaXMgbmVnYXRp dmUsIHdlIGhhdmUgY29tcGFyaXNvbiBsaWtlCi0JICAgICBpZiAoKHggJiAweDEyMykgPiAtNCkg KGFsd2F5cyB0cnVlKS4gIEp1c3QgZ2l2ZSB1cC4gICovCi0JICBpZiAoIWNzdDJuICYmIHZhbG4p Ci0JICAgIGNjb2RlID0gRVJST1JfTUFSSzsKLQkgIGlmIChjc3QybikKLQkgICAgc2duYml0ID0g d2k6OnNldF9iaXRfaW5femVybyAobnByZWMgLSAxLCBucHJlYyk7Ci0JICBlbHNlCi0JICAgIHNn bmJpdCA9IHdpOjp6ZXJvIChucHJlYyk7Ci0JICBtaW52ID0gdmFsdiAmIGNzdDJ2OwotCSAgc3dp dGNoIChjY29kZSkKLQkgICAgewotCSAgICBjYXNlIEVRX0VYUFI6Ci0JICAgICAgLyogTWluaW11 bSB1bnNpZ25lZCB2YWx1ZSBmb3IgZXF1YWxpdHkgaXMgVkFMICYgQ1NUMgotCQkgKHNob3VsZCBi ZSBlcXVhbCB0byBWQUwsIG90aGVyd2lzZSB3ZSBwcm9iYWJseSBzaG91bGQKLQkJIGhhdmUgZm9s ZGVkIHRoZSBjb21wYXJpc29uIGludG8gZmFsc2UpIGFuZAotCQkgbWF4aW11bSB1bnNpZ25lZCB2 YWx1ZSBpcyBWQUwgfCB+Q1NUMi4gICovCi0JICAgICAgbWF4diA9IHZhbHYgfCB+Y3N0MnY7Ci0J ICAgICAgdmFsaWRfcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7CiAKLQkgICAgY2FzZSBORV9FWFBS OgotCSAgICAgIHRlbSA9IHZhbHYgfCB+Y3N0MnY7Ci0JICAgICAgLyogSWYgVkFMIGlzIDAsIGhh bmRsZSAoWCAmIENTVDIpICE9IDAgYXMgKFggJiBDU1QyKSA+IDBVLiAgKi8KLQkgICAgICBpZiAo dmFsdiA9PSAwKQotCQl7Ci0JCSAgY3N0Mm4gPSBmYWxzZTsKLQkJICBzZ25iaXQgPSB3aTo6emVy byAobnByZWMpOwotCQkgIGdvdG8gZ3RfZXhwcjsKLQkJfQotCSAgICAgIC8qIElmIChWQUwgfCB+ Q1NUMikgaXMgYWxsIG9uZXMsIGhhbmRsZSBpdCBhcwotCQkgKFggJiBDU1QyKSA8IFZBTC4gICov Ci0JICAgICAgaWYgKHRlbSA9PSAtMSkKLQkJewotCQkgIGNzdDJuID0gZmFsc2U7Ci0JCSAgdmFs biA9IGZhbHNlOwotCQkgIHNnbmJpdCA9IHdpOjp6ZXJvIChucHJlYyk7Ci0JCSAgZ290byBsdF9l eHByOwotCQl9Ci0JICAgICAgaWYgKCFjc3QybiAmJiB3aTo6bmVnX3AgKGNzdDJ2KSkKLQkJc2du Yml0ID0gd2k6OnNldF9iaXRfaW5femVybyAobnByZWMgLSAxLCBucHJlYyk7Ci0JICAgICAgaWYg KHNnbmJpdCAhPSAwKQotCQl7Ci0JCSAgaWYgKHZhbHYgPT0gc2duYml0KQotCQkgICAgewotCQkg ICAgICBjc3QybiA9IHRydWU7Ci0JCSAgICAgIHZhbG4gPSB0cnVlOwotCQkgICAgICBnb3RvIGd0 X2V4cHI7Ci0JCSAgICB9Ci0JCSAgaWYgKHRlbSA9PSB3aTo6bWFzayAobnByZWMgLSAxLCBmYWxz ZSwgbnByZWMpKQotCQkgICAgewotCQkgICAgICBjc3QybiA9IHRydWU7Ci0JCSAgICAgIGdvdG8g bHRfZXhwcjsKLQkJICAgIH0KLQkJICBpZiAoIWNzdDJuKQotCQkgICAgc2duYml0ID0gd2k6Onpl cm8gKG5wcmVjKTsKLQkJfQotCSAgICAgIGJyZWFrOworICAgICAgKm1pbl9pZHggPSBpOworICAg ICAgKm1heF9pZHggPSBqOworICAgICAgcmV0dXJuICF0YWtlX2RlZmF1bHQ7CisgICAgfQorfQog Ci0JICAgIGNhc2UgR0VfRVhQUjoKLQkgICAgICAvKiBNaW5pbXVtIHVuc2lnbmVkIHZhbHVlIGZv ciA+PSBpZiAoVkFMICYgQ1NUMikgPT0gVkFMCi0JCSBpcyBWQUwgYW5kIG1heGltdW0gdW5zaWdu ZWQgdmFsdWUgaXMgfjAuICBGb3Igc2lnbmVkCi0JCSBjb21wYXJpc29uLCBpZiBDU1QyIGRvZXNu J3QgaGF2ZSBtb3N0IHNpZ25pZmljYW50IGJpdAotCQkgc2V0LCBoYW5kbGUgaXQgc2ltaWxhcmx5 LiAgSWYgQ1NUMiBoYXMgTVNCIHNldCwKLQkJIHRoZSBtaW5pbXVtIGlzIHRoZSBzYW1lLCBhbmQg bWF4aW11bSBpcyB+MFUvMi4gICovCi0JICAgICAgaWYgKG1pbnYgIT0gdmFsdikKLQkJewotCQkg IC8qIElmIChWQUwgJiBDU1QyKSAhPSBWQUwsIFggJiBDU1QyIGNhbid0IGJlIGVxdWFsIHRvCi0J CSAgICAgVkFMLiAgKi8KLQkJICBtaW52ID0gbWFza2VkX2luY3JlbWVudCAodmFsdiwgY3N0MnYs IHNnbmJpdCwgbnByZWMpOwotCQkgIGlmIChtaW52ID09IHZhbHYpCi0JCSAgICBicmVhazsKLQkJ fQotCSAgICAgIG1heHYgPSB3aTo6bWFzayAobnByZWMgLSAoY3N0Mm4gPyAxIDogMCksIGZhbHNl LCBucHJlYyk7Ci0JICAgICAgdmFsaWRfcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAg Y2FzZSBHVF9FWFBSOgotCSAgICBndF9leHByOgotCSAgICAgIC8qIEZpbmQgb3V0IHNtYWxsZXN0 IE1JTlYgd2hlcmUgTUlOViA+IFZBTAotCQkgJiYgKE1JTlYgJiBDU1QyKSA9PSBNSU5WLCBpZiBh bnkuICBJZiBWQUwgaXMgc2lnbmVkIGFuZAotCQkgQ1NUMiBoYXMgTVNCIHNldCwgY29tcHV0ZSBp dCBiaWFzZWQgYnkgMSA8PCAobnByZWMgLSAxKS4gICovCi0JICAgICAgbWludiA9IG1hc2tlZF9p bmNyZW1lbnQgKHZhbHYsIGNzdDJ2LCBzZ25iaXQsIG5wcmVjKTsKLQkgICAgICBpZiAobWludiA9 PSB2YWx2KQotCQlicmVhazsKLQkgICAgICBtYXh2ID0gd2k6Om1hc2sgKG5wcmVjIC0gKGNzdDJu ID8gMSA6IDApLCBmYWxzZSwgbnByZWMpOwotCSAgICAgIHZhbGlkX3AgPSB0cnVlOwotCSAgICAg IGJyZWFrOwotCi0JICAgIGNhc2UgTEVfRVhQUjoKLQkgICAgICAvKiBNaW5pbXVtIHVuc2lnbmVk IHZhbHVlIGZvciA8PSBpcyAwIGFuZCBtYXhpbXVtCi0JCSB1bnNpZ25lZCB2YWx1ZSBpcyBWQUwg fCB+Q1NUMiBpZiAoVkFMICYgQ1NUMikgPT0gVkFMLgotCQkgT3RoZXJ3aXNlLCBmaW5kIHNtYWxs ZXN0IFZBTDIgd2hlcmUgVkFMMiA+IFZBTAotCQkgJiYgKFZBTDIgJiBDU1QyKSA9PSBWQUwyIGFu ZCB1c2UgKFZBTDIgLSAxKSB8IH5DU1QyCi0JCSBhcyBtYXhpbXVtLgotCQkgRm9yIHNpZ25lZCBj b21wYXJpc29uLCBpZiBDU1QyIGRvZXNuJ3QgaGF2ZSBtb3N0Ci0JCSBzaWduaWZpY2FudCBiaXQg c2V0LCBoYW5kbGUgaXQgc2ltaWxhcmx5LiAgSWYgQ1NUMiBoYXMKLQkJIE1TQiBzZXQsIHRoZSBt YXhpbXVtIGlzIHRoZSBzYW1lIGFuZCBtaW5pbXVtIGlzIElOVF9NSU4uICAqLwotCSAgICAgIGlm IChtaW52ID09IHZhbHYpCi0JCW1heHYgPSB2YWx2OwotCSAgICAgIGVsc2UKLQkJewotCQkgIG1h eHYgPSBtYXNrZWRfaW5jcmVtZW50ICh2YWx2LCBjc3Qydiwgc2duYml0LCBucHJlYyk7Ci0JCSAg aWYgKG1heHYgPT0gdmFsdikKLQkJICAgIGJyZWFrOwotCQkgIG1heHYgLT0gMTsKLQkJfQotCSAg ICAgIG1heHYgfD0gfmNzdDJ2OwotCSAgICAgIG1pbnYgPSBzZ25iaXQ7Ci0JICAgICAgdmFsaWRf cCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBMVF9FWFBSOgotCSAgICBsdF9l eHByOgotCSAgICAgIC8qIE1pbmltdW0gdW5zaWduZWQgdmFsdWUgZm9yIDwgaXMgMCBhbmQgbWF4 aW11bQotCQkgdW5zaWduZWQgdmFsdWUgaXMgKFZBTC0xKSB8IH5DU1QyIGlmIChWQUwgJiBDU1Qy KSA9PSBWQUwuCi0JCSBPdGhlcndpc2UsIGZpbmQgc21hbGxlc3QgVkFMMiB3aGVyZSBWQUwyID4g VkFMCi0JCSAmJiAoVkFMMiAmIENTVDIpID09IFZBTDIgYW5kIHVzZSAoVkFMMiAtIDEpIHwgfkNT VDIKLQkJIGFzIG1heGltdW0uCi0JCSBGb3Igc2lnbmVkIGNvbXBhcmlzb24sIGlmIENTVDIgZG9l c24ndCBoYXZlIG1vc3QKLQkJIHNpZ25pZmljYW50IGJpdCBzZXQsIGhhbmRsZSBpdCBzaW1pbGFy bHkuICBJZiBDU1QyIGhhcwotCQkgTVNCIHNldCwgdGhlIG1heGltdW0gaXMgdGhlIHNhbWUgYW5k IG1pbmltdW0gaXMgSU5UX01JTi4gICovCi0JICAgICAgaWYgKG1pbnYgPT0gdmFsdikKLQkJewot CQkgIGlmICh2YWx2ID09IHNnbmJpdCkKLQkJICAgIGJyZWFrOwotCQkgIG1heHYgPSB2YWx2Owot CQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWF4diA9IG1hc2tlZF9pbmNyZW1lbnQgKHZhbHYs IGNzdDJ2LCBzZ25iaXQsIG5wcmVjKTsKLQkJICBpZiAobWF4diA9PSB2YWx2KQotCQkgICAgYnJl YWs7Ci0JCX0KLQkgICAgICBtYXh2IC09IDE7Ci0JICAgICAgbWF4diB8PSB+Y3N0MnY7Ci0JICAg ICAgbWludiA9IHNnbmJpdDsKLQkgICAgICB2YWxpZF9wID0gdHJ1ZTsKLQkgICAgICBicmVhazsK LQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAodmFsaWRfcAot CSAgICAgICYmIChtYXh2IC0gbWludikgIT0gLTEpCi0JICAgIHsKLQkgICAgICB0cmVlIHRtcCwg bmV3X3ZhbCwgdHlwZTsKLQkgICAgICBpbnQgaTsKLQotCSAgICAgIGZvciAoaSA9IDA7IGkgPCAy OyBpKyspCi0JCWlmIChuYW1lc1tpXSkKLQkJICB7Ci0JCSAgICB3aWRlX2ludCBtYXh2MiA9IG1h eHY7Ci0JCSAgICB0bXAgPSBuYW1lc1tpXTsKLQkJICAgIHR5cGUgPSBUUkVFX1RZUEUgKG5hbWVz W2ldKTsKLQkJICAgIGlmICghVFlQRV9VTlNJR05FRCAodHlwZSkpCi0JCSAgICAgIHsKLQkJCXR5 cGUgPSBidWlsZF9ub25zdGFuZGFyZF9pbnRlZ2VyX3R5cGUgKG5wcmVjLCAxKTsKLQkJCXRtcCA9 IGJ1aWxkMSAoTk9QX0VYUFIsIHR5cGUsIG5hbWVzW2ldKTsKLQkJICAgICAgfQotCQkgICAgaWYg KG1pbnYgIT0gMCkKLQkJICAgICAgewotCQkJdG1wID0gYnVpbGQyIChQTFVTX0VYUFIsIHR5cGUs IHRtcCwKLQkJCQkgICAgICB3aWRlX2ludF90b190cmVlICh0eXBlLCAtbWludikpOwotCQkJbWF4 djIgPSBtYXh2IC0gbWludjsKLQkJICAgICAgfQotCQkgICAgbmV3X3ZhbCA9IHdpZGVfaW50X3Rv X3RyZWUgKHR5cGUsIG1heHYyKTsKLQkJICAgIGFkZF9hc3NlcnRfaW5mbyAoYXNzZXJ0cywgbmFt ZXNbaV0sIHRtcCwgTEVfRVhQUiwgbmV3X3ZhbCk7Ci0JCSAgfQotCSAgICB9Ci0JfQotICAgIH0K LX0KLQotLyogT1AgaXMgYW4gb3BlcmFuZCBvZiBhIHRydXRoIHZhbHVlIGV4cHJlc3Npb24gd2hp Y2ggaXMga25vd24gdG8gaGF2ZQotICAgYSBwYXJ0aWN1bGFyIHZhbHVlLiAgUmVnaXN0ZXIgYW55 IGFzc2VydHMgZm9yIE9QIGFuZCBmb3IgYW55Ci0gICBvcGVyYW5kcyBpbiBPUCdzIGRlZmluaW5n IHN0YXRlbWVudC4KLQotICAgSWYgQ09ERSBpcyBFUV9FWFBSLCB0aGVuIHdlIHdhbnQgdG8gcmVn aXN0ZXIgT1AgaXMgemVybyAoZmFsc2UpLAotICAgaWYgQ09ERSBpcyBORV9FWFBSLCB0aGVuIHdl IHdhbnQgdG8gcmVnaXN0ZXIgT1AgaXMgbm9uemVybyAodHJ1ZSkuICAgKi8KLQotc3RhdGljIHZv aWQKLXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8xICh0cmVlIG9wLCBlbnVtIHRyZWVfY29kZSBj b2RlLAotCQkJICAgIGVkZ2UgZSwgdmVjPGFzc2VydF9pbmZvPiAmYXNzZXJ0cykKLXsKLSAgZ2lt cGxlICpvcF9kZWY7Ci0gIHRyZWUgdmFsOwotICBlbnVtIHRyZWVfY29kZSByaHNfY29kZTsKLQot ICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgU1NBX05BTUVzLiAgKi8KLSAgaWYgKFRSRUVfQ09ERSAo b3ApICE9IFNTQV9OQU1FKQotICAgIHJldHVybjsKLQotICAvKiBXZSBrbm93IHRoYXQgT1Agd2ls bCBoYXZlIGEgemVybyBvciBub256ZXJvIHZhbHVlLiAgKi8KLSAgdmFsID0gYnVpbGRfaW50X2Nz dCAoVFJFRV9UWVBFIChvcCksIDApOwotICBhZGRfYXNzZXJ0X2luZm8gKGFzc2VydHMsIG9wLCBv cCwgY29kZSwgdmFsKTsKLQotICAvKiBOb3cgbG9vayBhdCBob3cgT1AgaXMgc2V0LiAgSWYgaXQn cyBzZXQgZnJvbSBhIGNvbXBhcmlzb24sCi0gICAgIGEgdHJ1dGggb3BlcmF0aW9uIG9yIHNvbWUg Yml0IG9wZXJhdGlvbnMsIHRoZW4gd2UgbWF5IGJlIGFibGUKLSAgICAgdG8gcmVnaXN0ZXIgaW5m b3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmRzIG9mIHRoYXQgYXNzaWdubWVudC4gICovCi0gIG9w X2RlZiA9IFNTQV9OQU1FX0RFRl9TVE1UIChvcCk7Ci0gIGlmIChnaW1wbGVfY29kZSAob3BfZGVm KSAhPSBHSU1QTEVfQVNTSUdOKQotICAgIHJldHVybjsKLQotICByaHNfY29kZSA9IGdpbXBsZV9h c3NpZ25fcmhzX2NvZGUgKG9wX2RlZik7Ci0KLSAgaWYgKFRSRUVfQ09ERV9DTEFTUyAocmhzX2Nv ZGUpID09IHRjY19jb21wYXJpc29uKQotICAgIHsKLSAgICAgIGJvb2wgaW52ZXJ0ID0gKGNvZGUg PT0gRVFfRVhQUiA/IHRydWUgOiBmYWxzZSk7Ci0gICAgICB0cmVlIG9wMCA9IGdpbXBsZV9hc3Np Z25fcmhzMSAob3BfZGVmKTsKLSAgICAgIHRyZWUgb3AxID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChv cF9kZWYpOwotCi0gICAgICBpZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FKQotICAgICAg ICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiAob3AwLCBlLCByaHNfY29kZSwgb3AwLCBvcDEs IGludmVydCwgYXNzZXJ0cyk7Ci0gICAgICBpZiAoVFJFRV9DT0RFIChvcDEpID09IFNTQV9OQU1F KQotICAgICAgICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiAob3AxLCBlLCByaHNfY29kZSwg b3AwLCBvcDEsIGludmVydCwgYXNzZXJ0cyk7Ci0gICAgfQotICBlbHNlIGlmICgoY29kZSA9PSBO RV9FWFBSCi0JICAgICYmIGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKG9wX2RlZikgPT0gQklUX0FO RF9FWFBSKQotCSAgIHx8IChjb2RlID09IEVRX0VYUFIKLQkgICAgICAgJiYgZ2ltcGxlX2Fzc2ln bl9yaHNfY29kZSAob3BfZGVmKSA9PSBCSVRfSU9SX0VYUFIpKQotICAgIHsKLSAgICAgIC8qIFJl Y3Vyc2Ugb24gZWFjaCBvcGVyYW5kLiAgKi8KLSAgICAgIHRyZWUgb3AwID0gZ2ltcGxlX2Fzc2ln bl9yaHMxIChvcF9kZWYpOwotICAgICAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKG9w X2RlZik7Ci0gICAgICBpZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FCi0JICAmJiBoYXNf c2luZ2xlX3VzZSAob3AwKSkKLQlyZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAob3AwLCBjb2Rl LCBlLCBhc3NlcnRzKTsKLSAgICAgIGlmIChUUkVFX0NPREUgKG9wMSkgPT0gU1NBX05BTUUKLQkg ICYmIGhhc19zaW5nbGVfdXNlIChvcDEpKQotCXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8xIChv cDEsIGNvZGUsIGUsIGFzc2VydHMpOwotICAgIH0KLSAgZWxzZSBpZiAoZ2ltcGxlX2Fzc2lnbl9y aHNfY29kZSAob3BfZGVmKSA9PSBCSVRfTk9UX0VYUFIKLQkgICAmJiBUWVBFX1BSRUNJU0lPTiAo VFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAob3BfZGVmKSkpID09IDEpCi0gICAgewotICAg ICAgLyogUmVjdXJzZSwgZmxpcHBpbmcgQ09ERS4gICovCi0gICAgICBjb2RlID0gaW52ZXJ0X3Ry ZWVfY29tcGFyaXNvbiAoY29kZSwgZmFsc2UpOwotICAgICAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRf Zm9yXzEgKGdpbXBsZV9hc3NpZ25fcmhzMSAob3BfZGVmKSwgY29kZSwgZSwgYXNzZXJ0cyk7Ci0g ICAgfQotICBlbHNlIGlmIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChvcF9kZWYpID09IFNTQV9O QU1FKQotICAgIHsKLSAgICAgIC8qIFJlY3Vyc2UgdGhyb3VnaCB0aGUgY29weS4gICovCi0gICAg ICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChvcF9kZWYp LCBjb2RlLCBlLCBhc3NlcnRzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKENPTlZFUlRfRVhQUl9DT0RF X1AgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKG9wX2RlZikpKQotICAgIHsKLSAgICAgIC8qIFJl Y3Vyc2UgdGhyb3VnaCB0aGUgdHlwZSBjb252ZXJzaW9uLCB1bmxlc3MgaXQgaXMgYSBuYXJyb3dp bmcKLQkgY29udmVyc2lvbiBvciBjb252ZXJzaW9uIGZyb20gbm9uLWludGVncmFsIHR5cGUuICAq LwotICAgICAgdHJlZSByaHMgPSBnaW1wbGVfYXNzaWduX3JoczEgKG9wX2RlZik7Ci0gICAgICBp ZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKHJocykpCi0JICAmJiAoVFlQRV9QUkVDSVNJ T04gKFRSRUVfVFlQRSAocmhzKSkKLQkgICAgICA8PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBF IChvcCkpKSkKLQlyZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAocmhzLCBjb2RlLCBlLCBhc3Nl cnRzKTsKLSAgICB9Ci19Ci0KLS8qIENoZWNrIGlmIGNvbXBhcmlzb24KLSAgICAgTkFNRSBDT05E X09QIElOVEVHRVJfQ1NUCi0gICBoYXMgYSBmb3JtIG9mCi0gICAgIChYICYgMTEuLi4xMDAuLjAp IENPTkRfT1AgWFguLi5YMDAuLi4wCi0gICBTdWNoIGNvbXBhcmlzb24gY2FuIHlpZWxkIGFzc2Vy dGlvbnMgbGlrZQotICAgICBYID49IFhYLi4uWDAwLi4uMAotICAgICBYIDw9IFhYLi4uWDExLi4u MQotICAgaW4gY2FzZSBvZiBDT05EX09QIGJlaW5nIEVRX0VYUFIgb3IKLSAgICAgWCA8IFhYLi4u WDAwLi4uMAotICAgICBYID4gWFguLi5YMTEuLi4xCi0gICBpbiBjYXNlIG9mIE5FX0VYUFIuICAq LwotCi1zdGF0aWMgYm9vbAotaXNfbWFza2VkX3JhbmdlX3Rlc3QgKHRyZWUgbmFtZSwgdHJlZSB2 YWx0LCBlbnVtIHRyZWVfY29kZSBjb25kX2NvZGUsCi0JCSAgICAgIHRyZWUgKm5ld19uYW1lLCB0 cmVlICpsb3csIGVudW0gdHJlZV9jb2RlICpsb3dfY29kZSwKLQkJICAgICAgdHJlZSAqaGlnaCwg ZW51bSB0cmVlX2NvZGUgKmhpZ2hfY29kZSkKLXsKLSAgZ2ltcGxlICpkZWZfc3RtdCA9IFNTQV9O QU1FX0RFRl9TVE1UIChuYW1lKTsKLQotICBpZiAoIWlzX2dpbXBsZV9hc3NpZ24gKGRlZl9zdG10 KQotICAgICAgfHwgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQpICE9IEJJVF9BTkRf RVhQUikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdHJlZSB0ID0gZ2ltcGxlX2Fzc2lnbl9yaHMx IChkZWZfc3RtdCk7Ci0gIHRyZWUgbWFza3QgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10 KTsKLSAgaWYgKFRSRUVfQ09ERSAodCkgIT0gU1NBX05BTUUgfHwgVFJFRV9DT0RFIChtYXNrdCkg IT0gSU5URUdFUl9DU1QpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdpOjp0cmVlX3RvX3dpZGVf cmVmIG1hc2sgPSB3aTo6dG9fd2lkZSAobWFza3QpOwotICB3aWRlX2ludCBpbnZfbWFzayA9IH5t YXNrOwotICAvKiBNdXN0IGhhdmUgYmVlbiByZW1vdmVkIGJ5IG5vdyBzbyBkb24ndCBib3RoZXIg b3B0aW1pemluZy4gICovCi0gIGlmIChtYXNrID09IDAgfHwgaW52X21hc2sgPT0gMCkKLSAgICBy ZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXNzdW1lIFZBTFQgaXMgSU5URUdFUl9DU1QuICAqLwotICB3 aTo6dHJlZV90b193aWRlX3JlZiB2YWwgPSB3aTo6dG9fd2lkZSAodmFsdCk7Ci0KLSAgaWYgKChp bnZfbWFzayAmIChpbnZfbWFzayArIDEpKSAhPSAwCi0gICAgICB8fCAodmFsICYgbWFzaykgIT0g dmFsKQotICAgIHJldHVybiBmYWxzZTsKLQotICBib29sIGlzX3JhbmdlID0gY29uZF9jb2RlID09 IEVRX0VYUFI7Ci0KLSAgdHJlZSB0eXBlID0gVFJFRV9UWVBFICh0KTsKLSAgd2lkZV9pbnQgbWlu ID0gd2k6Om1pbl92YWx1ZSAodHlwZSksCi0gICAgbWF4ID0gd2k6Om1heF92YWx1ZSAodHlwZSk7 Ci0KLSAgaWYgKGlzX3JhbmdlKQotICAgIHsKLSAgICAgICpsb3dfY29kZSA9IHZhbCA9PSBtaW4g PyBFUlJPUl9NQVJLIDogR0VfRVhQUjsKLSAgICAgICpoaWdoX2NvZGUgPSB2YWwgPT0gbWF4ID8g RVJST1JfTUFSSyA6IExFX0VYUFI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2Ug Y2FuIHN0aWxsIGdlbmVyYXRlIGFzc2VydGlvbiBpZiBvbmUgb2YgYWx0ZXJuYXRpdmVzCi0JIGlz IGtub3duIHRvIGFsd2F5cyBiZSBmYWxzZS4gICovCi0gICAgICBpZiAodmFsID09IG1pbikKLQl7 Ci0JICAqbG93X2NvZGUgPSAoZW51bSB0cmVlX2NvZGUpIDA7Ci0JICAqaGlnaF9jb2RlID0gR1Rf RVhQUjsKLQl9Ci0gICAgICBlbHNlIGlmICgodmFsIHwgaW52X21hc2spID09IG1heCkKLQl7Ci0J ICAqbG93X2NvZGUgPSBMVF9FWFBSOwotCSAgKmhpZ2hfY29kZSA9IChlbnVtIHRyZWVfY29kZSkg MDsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqbmV3X25hbWUg PSB0OwotICAqbG93ID0gd2lkZV9pbnRfdG9fdHJlZSAodHlwZSwgdmFsKTsKLSAgKmhpZ2ggPSB3 aWRlX2ludF90b190cmVlICh0eXBlLCB2YWwgfCBpbnZfbWFzayk7Ci0KLSAgcmV0dXJuIHRydWU7 Ci19Ci0KLS8qIFRyeSB0byByZWdpc3RlciBhbiBlZGdlIGFzc2VydGlvbiBmb3IgU1NBIG5hbWUg TkFNRSBvbiBlZGdlIEUgZm9yCi0gICB0aGUgY29uZGl0aW9uIENPTkQgY29udHJpYnV0aW5nIHRv IHRoZSBjb25kaXRpb25hbCBqdW1wIHBvaW50ZWQgdG8gYnkKLSAgIFNJLiAgKi8KLQotdm9pZAot cmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yICh0cmVlIG5hbWUsIGVkZ2UgZSwKLQkJCSAgZW51bSB0 cmVlX2NvZGUgY29uZF9jb2RlLCB0cmVlIGNvbmRfb3AwLAotCQkJICB0cmVlIGNvbmRfb3AxLCB2 ZWM8YXNzZXJ0X2luZm8+ICZhc3NlcnRzKQotewotICB0cmVlIHZhbDsKLSAgZW51bSB0cmVlX2Nv ZGUgY29tcF9jb2RlOwotICBib29sIGlzX2Vsc2VfZWRnZSA9IChlLT5mbGFncyAmIEVER0VfRkFM U0VfVkFMVUUpICE9IDA7Ci0KLSAgLyogRG8gbm90IGF0dGVtcHQgdG8gaW5mZXIgYW55dGhpbmcg aW4gbmFtZXMgdGhhdCBmbG93IHRocm91Z2gKLSAgICAgYWJub3JtYWwgZWRnZXMuICAqLwotICBp ZiAoU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAobmFtZSkpCi0gICAgcmV0dXJuOwot Ci0gIGlmICghZXh0cmFjdF9jb2RlX2FuZF92YWxfZnJvbV9jb25kX3dpdGhfb3BzIChuYW1lLCBj b25kX2NvZGUsCi0JCQkJCQljb25kX29wMCwgY29uZF9vcDEsCi0JCQkJCQlpc19lbHNlX2VkZ2Us Ci0JCQkJCQkmY29tcF9jb2RlLCAmdmFsKSkKLSAgICByZXR1cm47Ci0KLSAgLyogUmVnaXN0ZXIg QVNTRVJUX0VYUFJzIGZvciBuYW1lLiAgKi8KLSAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzIg KG5hbWUsIGUsIGNvbmRfY29kZSwgY29uZF9vcDAsCi0JCQkgICAgICBjb25kX29wMSwgaXNfZWxz ZV9lZGdlLCBhc3NlcnRzKTsKLQotCi0gIC8qIElmIENPTkQgaXMgZWZmZWN0aXZlbHkgYW4gZXF1 YWxpdHkgdGVzdCBvZiBhbiBTU0FfTkFNRSBhZ2FpbnN0Ci0gICAgIHRoZSB2YWx1ZSB6ZXJvIG9y IG9uZSwgdGhlbiB3ZSBtYXkgYmUgYWJsZSB0byBhc3NlcnQgdmFsdWVzCi0gICAgIGZvciBTU0Ff TkFNRXMgd2hpY2ggZmxvdyBpbnRvIENPTkQuICAqLwotCi0gIC8qIEluIHRoZSBjYXNlIG9mIE5B TUUgPT0gMSBvciBOQU1FICE9IDAsIGZvciBCSVRfQU5EX0VYUFIgZGVmaW5pbmcKLSAgICAgc3Rh dGVtZW50IG9mIE5BTUUgd2UgY2FuIGFzc2VydCBib3RoIG9wZXJhbmRzIG9mIHRoZSBCSVRfQU5E X0VYUFIKLSAgICAgaGF2ZSBub256ZXJvIHZhbHVlLiAgKi8KLSAgaWYgKChjb21wX2NvZGUgPT0g RVFfRVhQUiAmJiBpbnRlZ2VyX29uZXAgKHZhbCkpCi0gICAgICB8fCAoY29tcF9jb2RlID09IE5F X0VYUFIgJiYgaW50ZWdlcl96ZXJvcCAodmFsKSkpCi0gICAgewotICAgICAgZ2ltcGxlICpkZWZf c3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKTsKLQotICAgICAgaWYgKGlzX2dpbXBsZV9h c3NpZ24gKGRlZl9zdG10KQotCSAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQp ID09IEJJVF9BTkRfRVhQUikKLQl7Ci0JICB0cmVlIG9wMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAo ZGVmX3N0bXQpOwotCSAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10KTsK LQkgIHJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8xIChvcDAsIE5FX0VYUFIsIGUsIGFzc2VydHMp OwotCSAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzEgKG9wMSwgTkVfRVhQUiwgZSwgYXNzZXJ0 cyk7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAg ICAgICYmIChUUkVFX0NPREVfQ0xBU1MgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9zdG10 KSkKLQkJICAgPT0gdGNjX2NvbXBhcmlzb24pKQotCXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8x IChuYW1lLCBORV9FWFBSLCBlLCBhc3NlcnRzKTsKLSAgICB9Ci0KLSAgLyogSW4gdGhlIGNhc2Ug b2YgTkFNRSA9PSAwIG9yIE5BTUUgIT0gMSwgZm9yIEJJVF9JT1JfRVhQUiBkZWZpbmluZwotICAg ICBzdGF0ZW1lbnQgb2YgTkFNRSB3ZSBjYW4gYXNzZXJ0IGJvdGggb3BlcmFuZHMgb2YgdGhlIEJJ VF9JT1JfRVhQUgotICAgICBoYXZlIHplcm8gdmFsdWUuICAqLwotICBpZiAoKGNvbXBfY29kZSA9 PSBFUV9FWFBSICYmIGludGVnZXJfemVyb3AgKHZhbCkpCi0gICAgICB8fCAoY29tcF9jb2RlID09 IE5FX0VYUFIKLQkgICYmIGludGVnZXJfb25lcCAodmFsKQotCSAgJiYgVFlQRV9QUkVDSVNJT04g KFRSRUVfVFlQRSAobmFtZSkpID09IDEpKQotICAgIHsKLSAgICAgIGdpbXBsZSAqZGVmX3N0bXQg PSBTU0FfTkFNRV9ERUZfU1RNVCAobmFtZSk7Ci0KLSAgICAgIC8qIEZvciBCSVRfSU9SX0VYUFIg b25seSBpZiBOQU1FID09IDAgYm90aCBvcGVyYW5kcyBoYXZlCi0JIG5lY2Vzc2FyaWx5IHplcm8g dmFsdWUsIG9yIGlmIHR5cGUtcHJlY2lzaW9uIGlzIG9uZS4gICovCi0gICAgICBpZiAoaXNfZ2lt cGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAmJiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChkZWZf c3RtdCkgPT0gQklUX0lPUl9FWFBSKQotCXsKLQkgIHRyZWUgb3AwID0gZ2ltcGxlX2Fzc2lnbl9y aHMxIChkZWZfc3RtdCk7Ci0JICB0cmVlIG9wMSA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoZGVmX3N0 bXQpOwotCSAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzEgKG9wMCwgRVFfRVhQUiwgZSwgYXNz ZXJ0cyk7Ci0JICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAob3AxLCBFUV9FWFBSLCBlLCBh c3NlcnRzKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19naW1wbGVfYXNzaWduIChkZWZfc3RtdCkK LQkgICAgICAgJiYgKFRSRUVfQ09ERV9DTEFTUyAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVm X3N0bXQpKQotCQkgICA9PSB0Y2NfY29tcGFyaXNvbikpCi0JcmVnaXN0ZXJfZWRnZV9hc3NlcnRf Zm9yXzEgKG5hbWUsIEVRX0VYUFIsIGUsIGFzc2VydHMpOwotICAgIH0KLQotICAvKiBTb21ldGlt ZXMgd2UgY2FuIGluZmVyIHJhbmdlcyBmcm9tIChOQU1FICYgTUFTSykgPT0gVkFMVUUuICAqLwot ICBpZiAoKGNvbXBfY29kZSA9PSBFUV9FWFBSIHx8IGNvbXBfY29kZSA9PSBORV9FWFBSKQotICAg ICAgJiYgVFJFRV9DT0RFICh2YWwpID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAgICAgIGVudW0g dHJlZV9jb2RlIGxvd19jb2RlLCBoaWdoX2NvZGU7Ci0gICAgICB0cmVlIGxvdywgaGlnaDsKLSAg ICAgIGlmIChpc19tYXNrZWRfcmFuZ2VfdGVzdCAobmFtZSwgdmFsLCBjb21wX2NvZGUsICZuYW1l LCAmbG93LAotCQkJCSZsb3dfY29kZSwgJmhpZ2gsICZoaWdoX2NvZGUpKQotCXsKLQkgIGlmIChs b3dfY29kZSAhPSBFUlJPUl9NQVJLKQotCSAgICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiAo bmFtZSwgZSwgbG93X2NvZGUsIG5hbWUsCi0JCQkJCWxvdywgLyppbnZlcnQqL2ZhbHNlLCBhc3Nl cnRzKTsKLQkgIGlmIChoaWdoX2NvZGUgIT0gRVJST1JfTUFSSykKLQkgICAgcmVnaXN0ZXJfZWRn ZV9hc3NlcnRfZm9yXzIgKG5hbWUsIGUsIGhpZ2hfY29kZSwgbmFtZSwKLQkJCQkJaGlnaCwgLypp bnZlcnQqL2ZhbHNlLCBhc3NlcnRzKTsKLQl9Ci0gICAgfQotfQotCi0vKiBIYW5kbGUKLSAgIF80 ID0geF8zICYgMzE7Ci0gICBpZiAoXzQgIT0gMCkKLSAgICAgZ290byA8YmIgNj47Ci0gICBlbHNl Ci0gICAgIGdvdG8gPGJiIDc+OwotICAgPGJiIDY+OgotICAgX19idWlsdGluX3VucmVhY2hhYmxl ICgpOwotICAgPGJiIDc+OgotICAgeF81ID0gQVNTRVJUX0VYUFIgPHhfMywgLi4uPjsKLSAgIElm IHhfMyBoYXMgbm8gb3RoZXIgaW1tZWRpYXRlIHVzZXMgKGNoZWNrZWQgYnkgY2FsbGVyKSwKLSAg IHZhciBpcyB0aGUgeF8zIHZhciBmcm9tIEFTU0VSVF9FWFBSLCB3ZSBjYW4gY2xlYXIgbG93IDUg Yml0cwotICAgZnJvbSB0aGUgbm9uLXplcm8gYml0bWFzay4gICovCi0KLXZvaWQKLW1heWJlX3Nl dF9ub256ZXJvX2JpdHMgKGVkZ2UgZSwgdHJlZSB2YXIpCi17Ci0gIGJhc2ljX2Jsb2NrIGNvbmRf YmIgPSBlLT5zcmM7Ci0gIGdpbXBsZSAqc3RtdCA9IGxhc3Rfc3RtdCAoY29uZF9iYik7Ci0gIHRy ZWUgY3N0OwotCi0gIGlmIChzdG10ID09IE5VTEwKLSAgICAgIHx8IGdpbXBsZV9jb2RlIChzdG10 KSAhPSBHSU1QTEVfQ09ORAotICAgICAgfHwgZ2ltcGxlX2NvbmRfY29kZSAoc3RtdCkgIT0gKChl LT5mbGFncyAmIEVER0VfVFJVRV9WQUxVRSkKLQkJCQkgICAgID8gRVFfRVhQUiA6IE5FX0VYUFIp Ci0gICAgICB8fCBUUkVFX0NPREUgKGdpbXBsZV9jb25kX2xocyAoc3RtdCkpICE9IFNTQV9OQU1F Ci0gICAgICB8fCAhaW50ZWdlcl96ZXJvcCAoZ2ltcGxlX2NvbmRfcmhzIChzdG10KSkpCi0gICAg cmV0dXJuOwotCi0gIHN0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAoZ2ltcGxlX2NvbmRfbGhzIChz dG10KSk7Ci0gIGlmICghaXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkKLSAgICAgIHx8IGdpbXBsZV9h c3NpZ25fcmhzX2NvZGUgKHN0bXQpICE9IEJJVF9BTkRfRVhQUgotICAgICAgfHwgVFJFRV9DT0RF IChnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpKSAhPSBJTlRFR0VSX0NTVCkKLSAgICByZXR1cm47 Ci0gIGlmIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpICE9IHZhcikKLSAgICB7Ci0gICAgICBn aW1wbGUgKnN0bXQyOwotCi0gICAgICBpZiAoVFJFRV9DT0RFIChnaW1wbGVfYXNzaWduX3JoczEg KHN0bXQpKSAhPSBTU0FfTkFNRSkKLQlyZXR1cm47Ci0gICAgICBzdG10MiA9IFNTQV9OQU1FX0RF Rl9TVE1UIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpKTsKLSAgICAgIGlmICghZ2ltcGxlX2Fz c2lnbl9jYXN0X3AgKHN0bXQyKQotCSAgfHwgZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10MikgIT0g dmFyCi0JICB8fCAhQ09OVkVSVF9FWFBSX0NPREVfUCAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo c3RtdDIpKQotCSAgfHwgKFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25f cmhzMSAoc3RtdCkpKQotCQkJICAgICAgIT0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAodmFy KSkpKQotCXJldHVybjsKLSAgICB9Ci0gIGNzdCA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCk7 Ci0gIHNldF9ub256ZXJvX2JpdHMgKHZhciwgd2k6OmJpdF9hbmRfbm90IChnZXRfbm9uemVyb19i aXRzICh2YXIpLAotCQkJCQkgIHdpOjp0b193aWRlIChjc3QpKSk7Ci19Ci0KLS8qIFJldHVybiB0 cnVlIGlmIFNUTVQgaXMgaW50ZXJlc3RpbmcgZm9yIFZSUC4gICovCi0KLWJvb2wKLXN0bXRfaW50 ZXJlc3RpbmdfZm9yX3ZycCAoZ2ltcGxlICpzdG10KQotewotICBpZiAoZ2ltcGxlX2NvZGUgKHN0 bXQpID09IEdJTVBMRV9QSEkpCi0gICAgewotICAgICAgdHJlZSByZXMgPSBnaW1wbGVfcGhpX3Jl c3VsdCAoc3RtdCk7Ci0gICAgICByZXR1cm4gKCF2aXJ0dWFsX29wZXJhbmRfcCAocmVzKQotCSAg ICAgICYmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAocmVzKSkKLQkJICB8fCBQT0lOVEVS X1RZUEVfUCAoVFJFRV9UWVBFIChyZXMpKSkpOwotICAgIH0KLSAgZWxzZSBpZiAoaXNfZ2ltcGxl X2Fzc2lnbiAoc3RtdCkgfHwgaXNfZ2ltcGxlX2NhbGwgKHN0bXQpKQotICAgIHsKLSAgICAgIHRy ZWUgbGhzID0gZ2ltcGxlX2dldF9saHMgKHN0bXQpOwotCi0gICAgICAvKiBJbiBnZW5lcmFsLCBh c3NpZ25tZW50cyB3aXRoIHZpcnR1YWwgb3BlcmFuZHMgYXJlIG5vdCB1c2VmdWwKLQkgZm9yIGRl cml2aW5nIHJhbmdlcywgd2l0aCB0aGUgb2J2aW91cyBleGNlcHRpb24gb2YgY2FsbHMgdG8KLQkg YnVpbHRpbiBmdW5jdGlvbnMuICAqLwotICAgICAgaWYgKGxocyAmJiBUUkVFX0NPREUgKGxocykg PT0gU1NBX05BTUUKLQkgICYmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAobGhzKSkKLQkg ICAgICB8fCBQT0lOVEVSX1RZUEVfUCAoVFJFRV9UWVBFIChsaHMpKSkKLQkgICYmIChpc19naW1w bGVfY2FsbCAoc3RtdCkKLQkgICAgICB8fCAhZ2ltcGxlX3Z1c2UgKHN0bXQpKSkKLQlyZXR1cm4g dHJ1ZTsKLSAgICAgIGVsc2UgaWYgKGlzX2dpbXBsZV9jYWxsIChzdG10KSAmJiBnaW1wbGVfY2Fs bF9pbnRlcm5hbF9wIChzdG10KSkKLQlzd2l0Y2ggKGdpbXBsZV9jYWxsX2ludGVybmFsX2ZuIChz dG10KSkKLQkgIHsKLQkgIGNhc2UgSUZOX0FERF9PVkVSRkxPVzoKLQkgIGNhc2UgSUZOX1NVQl9P VkVSRkxPVzoKLQkgIGNhc2UgSUZOX01VTF9PVkVSRkxPVzoKLQkgIGNhc2UgSUZOX0FUT01JQ19D T01QQVJFX0VYQ0hBTkdFOgotCSAgICAvKiBUaGVzZSBpbnRlcm5hbCBjYWxscyByZXR1cm4gX0Nv bXBsZXggaW50ZWdlciB0eXBlLAotCSAgICAgICBidXQgYXJlIGludGVyZXN0aW5nIHRvIFZSUCBu ZXZlcnRoZWxlc3MuICAqLwotCSAgICBpZiAobGhzICYmIFRSRUVfQ09ERSAobGhzKSA9PSBTU0Ff TkFNRSkKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAg ICBicmVhazsKLQkgIH0KLSAgICB9Ci0gIGVsc2UgaWYgKGdpbXBsZV9jb2RlIChzdG10KSA9PSBH SU1QTEVfQ09ORAotCSAgIHx8IGdpbXBsZV9jb2RlIChzdG10KSA9PSBHSU1QTEVfU1dJVENIKQot ICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VhcmNoZXMgdGhl IGNhc2UgbGFiZWwgdmVjdG9yIFZFQyBmb3IgdGhlIGluZGV4ICpJRFggb2YgdGhlIENBU0VfTEFC RUwKLSAgIHRoYXQgaW5jbHVkZXMgdGhlIHZhbHVlIFZBTC4gIFRoZSBzZWFyY2ggaXMgcmVzdHJp Y3RlZCB0byB0aGUgcmFuZ2UKLSAgIFtTVEFSVF9JRFgsIG4gLSAxXSB3aGVyZSBuIGlzIHRoZSBz aXplIG9mIFZFQy4KLQotICAgSWYgdGhlcmUgaXMgYSBDQVNFX0xBQkVMIGZvciBWQUwsIGl0cyBp bmRleCBpcyBwbGFjZWQgaW4gSURYIGFuZCB0cnVlIGlzCi0gICByZXR1cm5lZC4KLQotICAgSWYg dGhlcmUgaXMgbm8gQ0FTRV9MQUJFTCBmb3IgVkFMIGFuZCB0aGVyZSBpcyBvbmUgdGhhdCBpcyBs YXJnZXIgdGhhbiBWQUwsCi0gICBpdCBpcyBwbGFjZWQgaW4gSURYIGFuZCBmYWxzZSBpcyByZXR1 cm5lZC4KLQotICAgSWYgVkFMIGlzIGxhcmdlciB0aGFuIGFueSBDQVNFX0xBQkVMLCBuIGlzIHBs YWNlZCBvbiBJRFggYW5kIGZhbHNlIGlzCi0gICByZXR1cm5lZC4gKi8KLQotYm9vbAotZmluZF9j YXNlX2xhYmVsX2luZGV4IChnc3dpdGNoICpzdG10LCBzaXplX3Qgc3RhcnRfaWR4LCB0cmVlIHZh bCwgc2l6ZV90ICppZHgpCi17Ci0gIHNpemVfdCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxz IChzdG10KTsKLSAgc2l6ZV90IGxvdywgaGlnaDsKLQotICAvKiBGaW5kIGNhc2UgbGFiZWwgZm9y IG1pbmltdW0gb2YgdGhlIHZhbHVlIHJhbmdlIG9yIHRoZSBuZXh0IG9uZS4KLSAgICAgQXQgZWFj aCBpdGVyYXRpb24gd2UgYXJlIHNlYXJjaGluZyBpbiBbbG93LCBoaWdoIC0gMV0uICovCi0KLSAg Zm9yIChsb3cgPSBzdGFydF9pZHgsIGhpZ2ggPSBuOyBoaWdoICE9IGxvdzsgKQotICAgIHsKLSAg ICAgIHRyZWUgdDsKLSAgICAgIGludCBjbXA7Ci0gICAgICAvKiBOb3RlIHRoYXQgaSAhPSBoaWdo LCBzbyB3ZSBuZXZlciBhc2sgZm9yIG4uICovCi0gICAgICBzaXplX3QgaSA9IChoaWdoICsgbG93 KSAvIDI7Ci0gICAgICB0ID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSk7Ci0KLSAgICAg IC8qIENhY2hlIHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIENBU0VfTE9XIGFuZCB2YWwuICAqLwot ICAgICAgY21wID0gdHJlZV9pbnRfY3N0X2NvbXBhcmUgKENBU0VfTE9XICh0KSwgdmFsKTsKLQot ICAgICAgaWYgKGNtcCA9PSAwKQotCXsKLQkgIC8qIFJhbmdlcyBjYW5ub3QgYmUgZW1wdHkuICov Ci0JICAqaWR4ID0gaTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGNtcCA+ IDApCi0gICAgICAgIGhpZ2ggPSBpOwotICAgICAgZWxzZQotCXsKLQkgIGxvdyA9IGkgKyAxOwot CSAgaWYgKENBU0VfSElHSCAodCkgIT0gTlVMTAotCSAgICAgICYmIHRyZWVfaW50X2NzdF9jb21w YXJlIChDQVNFX0hJR0ggKHQpLCB2YWwpID49IDApCi0JICAgIHsKLQkgICAgICAqaWR4ID0gaTsK LQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICppZHgg PSBoaWdoOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlYXJjaGVzIHRoZSBjYXNlIGxhYmVs IHZlY3RvciBWRUMgZm9yIHRoZSByYW5nZSBvZiBDQVNFX0xBQkVMcyB0aGF0IGlzIHVzZWQKLSAg IGZvciB2YWx1ZXMgYmV0d2VlbiBNSU4gYW5kIE1BWC4gVGhlIGZpcnN0IGluZGV4IGlzIHBsYWNl ZCBpbiBNSU5fSURYLiBUaGUKLSAgIGxhc3QgaW5kZXggaXMgcGxhY2VkIGluIE1BWF9JRFguIElm IHRoZSByYW5nZSBvZiBDQVNFX0xBQkVMcyBpcyBlbXB0eQotICAgdGhlbiBNQVhfSURYIDwgTUlO X0lEWC4KLSAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVmYXVsdCBsYWJlbCBpcyBub3QgbmVlZGVk LiAqLwotCi1ib29sCi1maW5kX2Nhc2VfbGFiZWxfcmFuZ2UgKGdzd2l0Y2ggKnN0bXQsIHRyZWUg bWluLCB0cmVlIG1heCwgc2l6ZV90ICptaW5faWR4LAotCQkgICAgICAgc2l6ZV90ICptYXhfaWR4 KQotewotICBzaXplX3QgaSwgajsKLSAgYm9vbCBtaW5fdGFrZV9kZWZhdWx0ID0gIWZpbmRfY2Fz ZV9sYWJlbF9pbmRleCAoc3RtdCwgMSwgbWluLCAmaSk7Ci0gIGJvb2wgbWF4X3Rha2VfZGVmYXVs dCA9ICFmaW5kX2Nhc2VfbGFiZWxfaW5kZXggKHN0bXQsIGksIG1heCwgJmopOwotCi0gIGlmIChp ID09IGoKLSAgICAgICYmIG1pbl90YWtlX2RlZmF1bHQKLSAgICAgICYmIG1heF90YWtlX2RlZmF1 bHQpCi0gICAgewotICAgICAgLyogT25seSB0aGUgZGVmYXVsdCBjYXNlIGxhYmVsIHJlYWNoZWQu Ci0gICAgICAgICBSZXR1cm4gYW4gZW1wdHkgcmFuZ2UuICovCi0gICAgICAqbWluX2lkeCA9IDE7 Ci0gICAgICAqbWF4X2lkeCA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNl Ci0gICAgewotICAgICAgYm9vbCB0YWtlX2RlZmF1bHQgPSBtaW5fdGFrZV9kZWZhdWx0IHx8IG1h eF90YWtlX2RlZmF1bHQ7Ci0gICAgICB0cmVlIGxvdywgaGlnaDsKLSAgICAgIHNpemVfdCBrOwot Ci0gICAgICBpZiAobWF4X3Rha2VfZGVmYXVsdCkKLQlqLS07Ci0KLSAgICAgIC8qIElmIHRoZSBj YXNlIGxhYmVsIHJhbmdlIGlzIGNvbnRpbnVvdXMsIHdlIGRvIG5vdCBuZWVkCi0JIHRoZSBkZWZh dWx0IGNhc2UgbGFiZWwuICBWZXJpZnkgdGhhdC4gICovCi0gICAgICBoaWdoID0gQ0FTRV9MT1cg KGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpKTsKLSAgICAgIGlmIChDQVNFX0hJR0ggKGdp bXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpKSkKLQloaWdoID0gQ0FTRV9ISUdIIChnaW1wbGVf c3dpdGNoX2xhYmVsIChzdG10LCBpKSk7Ci0gICAgICBmb3IgKGsgPSBpICsgMTsgayA8PSBqOyAr K2spCi0JewotCSAgbG93ID0gQ0FTRV9MT1cgKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGsp KTsKLQkgIGlmICghaW50ZWdlcl9vbmVwIChpbnRfY29uc3RfYmlub3AgKE1JTlVTX0VYUFIsIGxv dywgaGlnaCkpKQotCSAgICB7Ci0JICAgICAgdGFrZV9kZWZhdWx0ID0gdHJ1ZTsKLQkgICAgICBi cmVhazsKLQkgICAgfQotCSAgaGlnaCA9IGxvdzsKLQkgIGlmIChDQVNFX0hJR0ggKGdpbXBsZV9z d2l0Y2hfbGFiZWwgKHN0bXQsIGspKSkKLQkgICAgaGlnaCA9IENBU0VfSElHSCAoZ2ltcGxlX3N3 aXRjaF9sYWJlbCAoc3RtdCwgaykpOwotCX0KLQotICAgICAgKm1pbl9pZHggPSBpOwotICAgICAg Km1heF9pZHggPSBqOwotICAgICAgcmV0dXJuICF0YWtlX2RlZmF1bHQ7Ci0gICAgfQotfQotCi0v KiBHaXZlbiBhIFNXSVRDSF9TVE1ULCByZXR1cm4gdGhlIGNhc2UgbGFiZWwgdGhhdCBlbmNvbXBh c3NlcyB0aGUKLSAgIGtub3duIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHN3aXRjaCBvcGVyYW5k LiAgUkFOR0VfT0ZfT1AgaXMgYQotICAgcmFuZ2UgZm9yIHRoZSBrbm93biB2YWx1ZXMgb2YgdGhl IHN3aXRjaCBvcGVyYW5kLiAgKi8KLQotdHJlZQotZmluZF9jYXNlX2xhYmVsX3JhbmdlIChnc3dp dGNoICpzd2l0Y2hfc3RtdCwgY29uc3QgaXJhbmdlICpyYW5nZV9vZl9vcCkKLXsKLSAgaWYgKHJh bmdlX29mX29wLT51bmRlZmluZWRfcCAoKQotICAgICAgfHwgcmFuZ2Vfb2Zfb3AtPnZhcnlpbmdf cCAoKQotICAgICAgfHwgcmFuZ2Vfb2Zfb3AtPnN5bWJvbGljX3AgKCkpCi0gICAgcmV0dXJuIE5V TExfVFJFRTsKLQotICBzaXplX3QgaSwgajsKLSAgdHJlZSBvcCA9IGdpbXBsZV9zd2l0Y2hfaW5k ZXggKHN3aXRjaF9zdG10KTsKLSAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChvcCk7Ci0gIHRyZWUg dG1pbiA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHJhbmdlX29mX29wLT5sb3dlcl9ib3VuZCAo KSk7Ci0gIHRyZWUgdG1heCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHJhbmdlX29mX29wLT51 cHBlcl9ib3VuZCAoKSk7Ci0gIGZpbmRfY2FzZV9sYWJlbF9yYW5nZSAoc3dpdGNoX3N0bXQsIHRt aW4sIHRtYXgsICZpLCAmaik7Ci0gIGlmIChpID09IGopCi0gICAgewotICAgICAgLyogTG9vayBm b3IgZXhhY3RseSBvbmUgbGFiZWwgdGhhdCBlbmNvbXBhc3NlcyB0aGUgcmFuZ2Ugb2YKLQkgdGhl IG9wZXJhbmQuICAqLwotICAgICAgdHJlZSBsYWJlbCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN3 aXRjaF9zdG10LCBpKTsKLSAgICAgIHRyZWUgY2FzZV9oaWdoCi0JPSBDQVNFX0hJR0ggKGxhYmVs KSA/IENBU0VfSElHSCAobGFiZWwpIDogQ0FTRV9MT1cgKGxhYmVsKTsKLSAgICAgIGludF9yYW5n ZV9tYXggbGFiZWxfcmFuZ2UgKENBU0VfTE9XIChsYWJlbCksIGNhc2VfaGlnaCk7Ci0gICAgICBp ZiAoIXR5cGVzX2NvbXBhdGlibGVfcCAobGFiZWxfcmFuZ2UudHlwZSAoKSwgcmFuZ2Vfb2Zfb3At PnR5cGUgKCkpKQotCXJhbmdlX2Nhc3QgKGxhYmVsX3JhbmdlLCByYW5nZV9vZl9vcC0+dHlwZSAo KSk7Ci0gICAgICBsYWJlbF9yYW5nZS5pbnRlcnNlY3QgKCpyYW5nZV9vZl9vcCk7Ci0gICAgICBp ZiAobGFiZWxfcmFuZ2UgPT0gKnJhbmdlX29mX29wKQotCXJldHVybiBsYWJlbDsKLSAgICB9Ci0g IGVsc2UgaWYgKGkgPiBqKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBsYWJlbHMg YXQgYWxsLCB0YWtlIHRoZSBkZWZhdWx0LiAgKi8KLSAgICAgIHJldHVybiBnaW1wbGVfc3dpdGNo X2xhYmVsIChzd2l0Y2hfc3RtdCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyog T3RoZXJ3aXNlLCB0aGVyZSBhcmUgdmFyaW91cyBsYWJlbHMgdGhhdCBjYW4gZW5jb21wYXNzCi0J IHRoZSByYW5nZSBvZiBvcGVyYW5kLiAgSW4gd2hpY2ggY2FzZSwgc2VlIGlmIHRoZSByYW5nZSBv ZgotCSB0aGUgb3BlcmFuZCBpcyBlbnRpcmVseSAqb3V0c2lkZSogdGhlIGJvdW5kcyBvZiBhbGwg dGhlCi0JIChub24tZGVmYXVsdCkgY2FzZSBsYWJlbHMuICBJZiBzbywgdGFrZSB0aGUgZGVmYXVs dC4gICovCi0gICAgICB1bnNpZ25lZCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzd2l0 Y2hfc3RtdCk7Ci0gICAgICB0cmVlIG1pbl9sYWJlbCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN3 aXRjaF9zdG10LCAxKTsKLSAgICAgIHRyZWUgbWF4X2xhYmVsID0gZ2ltcGxlX3N3aXRjaF9sYWJl bCAoc3dpdGNoX3N0bXQsIG4gLSAxKTsKLSAgICAgIHRyZWUgY2FzZV9oaWdoID0gQ0FTRV9ISUdI IChtYXhfbGFiZWwpOwotICAgICAgaWYgKCFjYXNlX2hpZ2gpCi0JY2FzZV9oaWdoID0gQ0FTRV9M T1cgKG1heF9sYWJlbCk7Ci0gICAgICBpbnRfcmFuZ2VfbWF4IGxhYmVsX3JhbmdlIChDQVNFX0xP VyAobWluX2xhYmVsKSwgY2FzZV9oaWdoKTsKLSAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9w IChsYWJlbF9yYW5nZS50eXBlICgpLCByYW5nZV9vZl9vcC0+dHlwZSAoKSkpCi0JcmFuZ2VfY2Fz dCAobGFiZWxfcmFuZ2UsIHJhbmdlX29mX29wLT50eXBlICgpKTsKLSAgICAgIGxhYmVsX3Jhbmdl LmludGVyc2VjdCAoKnJhbmdlX29mX29wKTsKLSAgICAgIGlmIChsYWJlbF9yYW5nZS51bmRlZmlu ZWRfcCAoKSkKLQlyZXR1cm4gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwot ICAgIH0KLSAgcmV0dXJuIE5VTExfVFJFRTsKLX0KLQotc3RydWN0IGNhc2VfaW5mbwotewotICB0 cmVlIGV4cHI7Ci0gIGJhc2ljX2Jsb2NrIGJiOwotfTsKLQotLyogTG9jYXRpb24gaW5mb3JtYXRp b24gZm9yIEFTU0VSVF9FWFBScy4gIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcwotICAgc3RydWN0dXJl IGRlc2NyaWJlcyBhbiBBU1NFUlRfRVhQUiBmb3IgYW4gU1NBIG5hbWUuICBTaW5jZSBhIHNpbmds ZQotICAgU1NBIG5hbWUgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NlcnRpb24gYXNzb2NpYXRl ZCB3aXRoIGl0LCB0aGVzZQotICAgbG9jYXRpb25zIGFyZSBrZXB0IGluIGEgbGlua2VkIGxpc3Qg YXR0YWNoZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIFNTQSBuYW1lLiAgKi8KLXN0cnVjdCBh c3NlcnRfbG9jdXMKLXsKLSAgLyogQmFzaWMgYmxvY2sgd2hlcmUgdGhlIGFzc2VydGlvbiB3b3Vs ZCBiZSBpbnNlcnRlZC4gICovCi0gIGJhc2ljX2Jsb2NrIGJiOwotCi0gIC8qIFNvbWUgYXNzZXJ0 aW9ucyBuZWVkIHRvIGJlIGluc2VydGVkIG9uIGFuIGVkZ2UgKGUuZy4sIGFzc2VydGlvbnMKLSAg ICAgZ2VuZXJhdGVkIGJ5IENPTkRfRVhQUnMpLiAgSW4gdGhvc2UgY2FzZXMsIEJCIHdpbGwgYmUg TlVMTC4gICovCi0gIGVkZ2UgZTsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBzdGF0ZW1lbnQgdGhh dCBnZW5lcmF0ZWQgdGhpcyBhc3NlcnRpb24uICAqLwotICBnaW1wbGVfc3RtdF9pdGVyYXRvciBz aTsKLQotICAvKiBQcmVkaWNhdGUgY29kZSBmb3IgdGhlIEFTU0VSVF9FWFBSLiAgTXVzdCBiZSBD T01QQVJJU09OX0NMQVNTX1AuICAqLwotICBlbnVtIHRyZWVfY29kZSBjb21wX2NvZGU7Ci0KLSAg LyogVmFsdWUgYmVpbmcgY29tcGFyZWQgYWdhaW5zdC4gICovCi0gIHRyZWUgdmFsOwotCi0gIC8q IEV4cHJlc3Npb24gdG8gY29tcGFyZS4gICovCi0gIHRyZWUgZXhwcjsKLQotICAvKiBOZXh0IG5v ZGUgaW4gdGhlIGxpbmtlZCBsaXN0LiAgKi8KLSAgYXNzZXJ0X2xvY3VzICpuZXh0OwotfTsKLQot LyogQ2xhc3MgdG8gdHJhdmVyc2UgdGhlIGZsb3dncmFwaCBsb29raW5nIGZvciBjb25kaXRpb25h bCBqdW1wcyB0bwotICAgaW5zZXJ0IEFTU0VSVF9FWFBSIHJhbmdlIGV4cHJlc3Npb25zLiAgVGhl c2UgcmFuZ2UgZXhwcmVzc2lvbnMgYXJlCi0gICBtZWFudCB0byBwcm92aWRlIGluZm9ybWF0aW9u IHRvIG9wdGltaXphdGlvbnMgdGhhdCBuZWVkIHRvIHJlYXNvbgotICAgaW4gdGVybXMgb2YgdmFs dWUgcmFuZ2VzLiAgVGhleSB3aWxsIG5vdCBiZSBleHBhbmRlZCBpbnRvIFJUTC4gICovCi0KLWNs YXNzIHZycF9hc3NlcnRzCi17Ci1wdWJsaWM6Ci0gIHZycF9hc3NlcnRzIChzdHJ1Y3QgZnVuY3Rp b24gKmZuKSA6IGZ1biAoZm4pIHsgfQotCi0gIHZvaWQgaW5zZXJ0X3JhbmdlX2Fzc2VydGlvbnMg KCk7Ci0KLSAgLyogQ29udmVydCByYW5nZSBhc3NlcnRpb24gZXhwcmVzc2lvbnMgaW50byB0aGUg aW1wbGllZCBjb3BpZXMgYW5kCi0gICAgIGNvcHkgcHJvcGFnYXRlIGF3YXkgdGhlIGNvcGllcy4g ICovCi0gIHZvaWQgcmVtb3ZlX3JhbmdlX2Fzc2VydGlvbnMgKCk7Ci0KLSAgLyogRHVtcCBhbGwg dGhlIHJlZ2lzdGVyZWQgYXNzZXJ0aW9ucyBmb3IgYWxsIHRoZSBuYW1lcyB0byBGSUxFLiAgKi8K LSAgdm9pZCBkdW1wIChGSUxFICopOwotCi0gIC8qIER1bXAgYWxsIHRoZSByZWdpc3RlcmVkIGFz c2VydGlvbnMgZm9yIE5BTUUgdG8gRklMRS4gICovCi0gIHZvaWQgZHVtcCAoRklMRSAqZmlsZSwg dHJlZSBuYW1lKTsKLQotICAvKiBEdW1wIGFsbCB0aGUgcmVnaXN0ZXJlZCBhc3NlcnRpb25zIGZv ciBOQU1FIHRvIHN0ZGVyci4gICovCi0gIHZvaWQgZGVidWcgKHRyZWUgbmFtZSkKLSAgewotICAg IGR1bXAgKHN0ZGVyciwgbmFtZSk7Ci0gIH0KLQotICAvKiBEdW1wIGFsbCB0aGUgcmVnaXN0ZXJl ZCBhc3NlcnRpb25zIGZvciBhbGwgdGhlIG5hbWVzIHRvIHN0ZGVyci4gICovCi0gIHZvaWQgZGVi dWcgKCkKLSAgewotICAgIGR1bXAgKHN0ZGVycik7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLyogU2V0 IG9mIFNTQSBuYW1lcyBmb3VuZCBsaXZlIGR1cmluZyB0aGUgUlBPIHRyYXZlcnNhbCBvZiB0aGUg ZnVuY3Rpb24KLSAgICAgZm9yIHN0aWxsIGFjdGl2ZSBiYXNpYy1ibG9ja3MuICAqLwotICBsaXZl X25hbWVzIGxpdmU7Ci0KLSAgLyogRnVuY3Rpb24gdG8gd29yayBvbi4gICovCi0gIHN0cnVjdCBm dW5jdGlvbiAqZnVuOwotCi0gIC8qIElmIGJpdCBJIGlzIHByZXNlbnQsIGl0IG1lYW5zIHRoYXQg U1NBIG5hbWUgTl9pIGhhcyBhIGxpc3Qgb2YKLSAgICAgYXNzZXJ0aW9ucyB0aGF0IHNob3VsZCBi ZSBpbnNlcnRlZCBpbiB0aGUgSUwuICAqLwotICBiaXRtYXAgbmVlZF9hc3NlcnRfZm9yOwotCi0g IC8qIEFycmF5IG9mIGxvY2F0aW9ucyBsaXN0cyB3aGVyZSB0byBpbnNlcnQgYXNzZXJ0aW9ucy4g IEFTU0VSVFNfRk9SW0ldCi0gICAgIGhvbGRzIGEgbGlzdCBvZiBBU1NFUlRfTE9DVVNfVCBub2Rl cyB0aGF0IGRlc2NyaWJlIHdoZXJlCi0gICAgIEFTU0VSVF9FWFBScyBmb3IgU1NBIG5hbWUgTl9J IHNob3VsZCBiZSBpbnNlcnRlZC4gICovCi0gIGFzc2VydF9sb2N1cyAqKmFzc2VydHNfZm9yOwot Ci0gIC8qIEZpbmlzaCBmb3VuZCBBU1NFUlRTIGZvciBFIGFuZCByZWdpc3RlciB0aGVtIGF0IEdT SS4gICovCi0gIHZvaWQgZmluaXNoX3JlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2ZvciAoZWRnZSBlLCBn aW1wbGVfc3RtdF9pdGVyYXRvciBnc2ksCi0JCQkJCXZlYzxhc3NlcnRfaW5mbz4gJmFzc2VydHMp OwotCi0gIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBvdXRnb2luZyBlZGdlcyBvZiBCQiBzaG91 bGQgcmVjZWl2ZSBhbgotICAgICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMg b2YgQkIncyBMQVNUIHN0YXRlbWVudC4gIFRoZQotICAgICBsYXN0IHN0YXRlbWVudCBvZiBCQiBt dXN0IGJlIGEgU1dJVENIX0VYUFIuCi0KLSAgICAgSWYgYW55IG9mIHRoZSBzdWItZ3JhcGhzIHJv b3RlZCBhdCBCQiBoYXZlIGFuIGludGVyZXN0aW5nIHVzZSBvZgotICAgICB0aGUgcHJlZGljYXRl IG9wZXJhbmRzLCBhbiBhc3NlcnQgbG9jYXRpb24gbm9kZSBpcyBhZGRlZCB0byB0aGUKLSAgICAg bGlzdCBvZiBhc3NlcnRpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5kcy4gICovCi0g IHZvaWQgZmluZF9zd2l0Y2hfYXNzZXJ0cyAoYmFzaWNfYmxvY2sgYmIsIGdzd2l0Y2ggKmxhc3Qp OwotCi0gIC8qIERvIGFuIFJQTyB3YWxrIG92ZXIgdGhlIGZ1bmN0aW9uIGNvbXB1dGluZyBTU0Eg bmFtZSBsaXZlbmVzcwotICAgICBvbi10aGUtZmx5IGFuZCBkZWNpZGluZyBvbiBhc3NlcnQgZXhw cmVzc2lvbnMgdG8gaW5zZXJ0LiAgKi8KLSAgdm9pZCBmaW5kX2Fzc2VydF9sb2NhdGlvbnMgKCk7 Ci0KLSAgLyogVHJhdmVyc2UgYWxsIHRoZSBzdGF0ZW1lbnRzIGluIGJsb2NrIEJCIGxvb2tpbmcg Zm9yIHN0YXRlbWVudHMgdGhhdAotICAgICBtYXkgZ2VuZXJhdGUgdXNlZnVsIGFzc2VydGlvbnMg Zm9yIHRoZSBTU0EgbmFtZXMgaW4gdGhlaXIgb3BlcmFuZC4KLSAgICAgU2VlIG1ldGhvZCBpbXBs ZW1lbnRhdGlvbiBjb21lbnRhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAqLwotICB2b2lkIGZp bmRfYXNzZXJ0X2xvY2F0aW9uc19pbl9iYiAoYmFzaWNfYmxvY2sgYmIpOwotCi0gIC8qIERldGVy bWluZSB3aGV0aGVyIHRoZSBvdXRnb2luZyBlZGdlcyBvZiBCQiBzaG91bGQgcmVjZWl2ZSBhbgot ICAgICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIncyBMQVNUIHN0 YXRlbWVudC4KLSAgICAgVGhlIGxhc3Qgc3RhdGVtZW50IG9mIEJCIG11c3QgYmUgYSBDT05EX0VY UFIuCi0KLSAgICAgSWYgYW55IG9mIHRoZSBzdWItZ3JhcGhzIHJvb3RlZCBhdCBCQiBoYXZlIGFu IGludGVyZXN0aW5nIHVzZSBvZgotICAgICB0aGUgcHJlZGljYXRlIG9wZXJhbmRzLCBhbiBhc3Nl cnQgbG9jYXRpb24gbm9kZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgbGlzdCBvZiBhc3NlcnRpb25z IGZvciB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5kcy4gICovCi0gIHZvaWQgZmluZF9jb25kaXRp b25hbF9hc3NlcnRzIChiYXNpY19ibG9jayBiYiwgZ2NvbmQgKmxhc3QpOwotCi0gIC8qIFByb2Nl c3MgYWxsIHRoZSBpbnNlcnRpb25zIHJlZ2lzdGVyZWQgZm9yIGV2ZXJ5IG5hbWUgTl9pIHJlZ2lz dGVyZWQKLSAgICAgaW4gTkVFRF9BU1NFUlRfRk9SLiAgVGhlIGxpc3Qgb2YgYXNzZXJ0aW9ucyB0 byBiZSBpbnNlcnRlZCBhcmUKLSAgICAgZm91bmQgaW4gQVNTRVJUU19GT1JbaV0uICAqLwotICB2 b2lkIHByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnMgKCk7Ci0KLSAgLyogSWYgTkFNRSBkb2Vzbid0 IGhhdmUgYW4gQVNTRVJUX0VYUFIgcmVnaXN0ZXJlZCBmb3IgYXNzZXJ0aW5nCi0gICAgICdFWFBS IENPTVBfQ09ERSBWQUwnIGF0IGEgbG9jYXRpb24gdGhhdCBkb21pbmF0ZXMgYmxvY2sgQkIgb3IK LSAgICAgRS0+REVTVCwgdGhlbiByZWdpc3RlciB0aGlzIGxvY2F0aW9uIGFzIGEgcG9zc2libGUg aW5zZXJ0aW9uIHBvaW50Ci0gICAgIGZvciBBU1NFUlRfRVhQUiA8TkFNRSwgRVhQUiBDT01QX0NP REUgVkFMPi4KLQotICAgICBCQiwgRSBhbmQgU0kgcHJvdmlkZSB0aGUgZXhhY3QgaW5zZXJ0aW9u IHBvaW50IGZvciB0aGUgbmV3Ci0gICAgIEFTU0VSVF9FWFBSLiAgSWYgQkIgaXMgTlVMTCwgdGhl biB0aGUgQVNTRVJUX0VYUFIgaXMgdG8gYmUgaW5zZXJ0ZWQKLSAgICAgb24gZWRnZSBFLiAgT3Ro ZXJ3aXNlLCBpZiBFIGlzIE5VTEwsIHRoZSBBU1NFUlRfRVhQUiBpcyBpbnNlcnRlZCBvbgotICAg ICBCQi4gIElmIFNJIHBvaW50cyB0byBhIENPTkRfRVhQUiBvciBhIFNXSVRDSF9FWFBSIHN0YXRl bWVudCwgdGhlbiBFCi0gICAgIG11c3Qgbm90IGJlIE5VTEwuICAqLwotICB2b2lkIHJlZ2lzdGVy X25ld19hc3NlcnRfZm9yICh0cmVlIG5hbWUsIHRyZWUgZXhwciwKLQkJCQllbnVtIHRyZWVfY29k ZSBjb21wX2NvZGUsCi0JCQkJdHJlZSB2YWwsIGJhc2ljX2Jsb2NrIGJiLAotCQkJCWVkZ2UgZSwg Z2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kpOwotCi0gIC8qIEdpdmVuIGEgQ09ORF9FWFBSIENPTkQg b2YgdGhlIGZvcm0gJ1YgT1AgVycsIGFuZCBhbiBTU0EgbmFtZSBWLAotICAgICBjcmVhdGUgYSBu ZXcgU1NBIG5hbWUgTiBhbmQgcmV0dXJuIHRoZSBhc3NlcnRpb24gYXNzaWdubWVudAotICAgICAn TiA9IEFTU0VSVF9FWFBSIDxWLCBWIE9QIFc+Jy4gICovCi0gIGdpbXBsZSAqYnVpbGRfYXNzZXJ0 X2V4cHJfZm9yICh0cmVlIGNvbmQsIHRyZWUgdik7Ci0KLSAgLyogQ3JlYXRlIGFuIEFTU0VSVF9F WFBSIGZvciBOQU1FIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGxvY2F0aW9uCi0gICAgIGluZGljYXRl ZCBieSBMT0MuICBSZXR1cm4gdHJ1ZSBpZiB3ZSBtYWRlIGFueSBlZGdlIGluc2VydGlvbnMuICAq LwotICBib29sIHByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnNfZm9yICh0cmVlIG5hbWUsIGFzc2Vy dF9sb2N1cyAqbG9jKTsKLQotICAvKiBRc29ydCBjYWxsYmFjayBmb3Igc29ydGluZyBhc3NlcnQg bG9jYXRpb25zLiAgKi8KLSAgdGVtcGxhdGUgPGJvb2wgc3RhYmxlPiBzdGF0aWMgaW50IGNvbXBh cmVfYXNzZXJ0X2xvYyAoY29uc3Qgdm9pZCAqLAotCQkJCQkJCWNvbnN0IHZvaWQgKik7Ci0KLSAg LyogUmV0dXJuIGZhbHNlIGlmIEVYUFIgaXMgYSBwcmVkaWNhdGUgZXhwcmVzc2lvbiBpbnZvbHZp bmcgZmxvYXRpbmcKLSAgICAgcG9pbnQgdmFsdWVzLiAgKi8KLSAgYm9vbCBmcF9wcmVkaWNhdGUg KGdpbXBsZSAqc3RtdCkKLSAgewotICAgIEdJTVBMRV9DSEVDSyAoc3RtdCwgR0lNUExFX0NPTkQp OwotICAgIHJldHVybiBGTE9BVF9UWVBFX1AgKFRSRUVfVFlQRSAoZ2ltcGxlX2NvbmRfbGhzIChz dG10KSkpOwotICB9Ci0KLSAgYm9vbCBhbGxfaW1tX3VzZXNfaW5fc3RtdF9vcl9mZWVkX2NvbmQg KHRyZWUgdmFyLCBnaW1wbGUgKnN0bXQsCi0JCQkJCSAgYmFzaWNfYmxvY2sgY29uZF9iYik7Ci0K LSAgc3RhdGljIGludCBjb21wYXJlX2Nhc2VfbGFiZWxzIChjb25zdCB2b2lkICosIGNvbnN0IHZv aWQgKik7Ci19OwotCi0vKiBHaXZlbiBhIENPTkRfRVhQUiBDT05EIG9mIHRoZSBmb3JtICdWIE9Q IFcnLCBhbmQgYW4gU1NBIG5hbWUgViwKLSAgIGNyZWF0ZSBhIG5ldyBTU0EgbmFtZSBOIGFuZCBy ZXR1cm4gdGhlIGFzc2VydGlvbiBhc3NpZ25tZW50Ci0gICAnTiA9IEFTU0VSVF9FWFBSIDxWLCBW IE9QIFc+Jy4gICovCi0KLWdpbXBsZSAqCi12cnBfYXNzZXJ0czo6YnVpbGRfYXNzZXJ0X2V4cHJf Zm9yICh0cmVlIGNvbmQsIHRyZWUgdikKLXsKLSAgdHJlZSBhOwotICBnYXNzaWduICphc3NlcnRp b247Ci0KLSAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFICh2KSA9PSBTU0FfTkFNRQotCSAgICAgICYm IENPTVBBUklTT05fQ0xBU1NfUCAoY29uZCkpOwotCi0gIGEgPSBidWlsZDIgKEFTU0VSVF9FWFBS LCBUUkVFX1RZUEUgKHYpLCB2LCBjb25kKTsKLSAgYXNzZXJ0aW9uID0gZ2ltcGxlX2J1aWxkX2Fz c2lnbiAoTlVMTF9UUkVFLCBhKTsKLQotICAvKiBUaGUgbmV3IEFTU0VSVF9FWFBSLCBjcmVhdGVz IGEgbmV3IFNTQSBuYW1lIHRoYXQgcmVwbGFjZXMgdGhlCi0gICAgIG9wZXJhbmQgb2YgdGhlIEFT U0VSVF9FWFBSLiAgQ3JlYXRlIGl0IHNvIHRoZSBuZXcgbmFtZSBhbmQgdGhlIG9sZCBvbmUKLSAg ICAgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIHJlcGxhY2VtZW50IHRhYmxlIHNvIHRoYXQgd2UgY2Fu IGZpeCB0aGUgU1NBIHdlYgotICAgICBhZnRlciBhZGRpbmcgYWxsIHRoZSBBU1NFUlRfRVhQUnMu ICAqLwotICB0cmVlIG5ld19kZWYgPSBjcmVhdGVfbmV3X2RlZl9mb3IgKHYsIGFzc2VydGlvbiwg TlVMTCk7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBwcmVzZXJ2ZSBhYm5vcm1hbG5lc3MgdGhyb3VnaG91 dCBhbiBBU1NFUlRfRVhQUiBjaGFpbgotICAgICBnaXZlbiB3ZSBoYXZlIHRvIGJlIGFibGUgdG8g ZnVsbHkgcHJvcGFnYXRlIHRob3NlIG91dCB0byByZS1jcmVhdGUKLSAgICAgdmFsaWQgU1NBIHdo ZW4gcmVtb3ZpbmcgdGhlIGFzc2VydHMuICAqLwotICBpZiAoU1NBX05BTUVfT0NDVVJTX0lOX0FC Tk9STUFMX1BISSAodikpCi0gICAgU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAobmV3 X2RlZikgPSAxOwotCi0gIHJldHVybiBhc3NlcnRpb247Ci19Ci0KLS8qIER1bXAgYWxsIHRoZSBy ZWdpc3RlcmVkIGFzc2VydGlvbnMgZm9yIE5BTUUgdG8gRklMRS4gICovCi0KLXZvaWQKLXZycF9h c3NlcnRzOjpkdW1wIChGSUxFICpmaWxlLCB0cmVlIG5hbWUpCi17Ci0gIGFzc2VydF9sb2N1cyAq bG9jOwotCi0gIGZwcmludGYgKGZpbGUsICJBc3NlcnRpb25zIHRvIGJlIGluc2VydGVkIGZvciAi KTsKLSAgcHJpbnRfZ2VuZXJpY19leHByIChmaWxlLCBuYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwg IlxuIik7Ci0KLSAgbG9jID0gYXNzZXJ0c19mb3JbU1NBX05BTUVfVkVSU0lPTiAobmFtZSldOwot ICB3aGlsZSAobG9jKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcdCIpOwotICAgICAg cHJpbnRfZ2ltcGxlX3N0bXQgKGZpbGUsIGdzaV9zdG10IChsb2MtPnNpKSwgMCk7Ci0gICAgICBm cHJpbnRmIChmaWxlLCAiXG5cdEJCICMlZCIsIGxvYy0+YmItPmluZGV4KTsKLSAgICAgIGlmIChs b2MtPmUpCi0JewotCSAgZnByaW50ZiAoZmlsZSwgIlxuXHRFREdFICVkLT4lZCIsIGxvYy0+ZS0+ c3JjLT5pbmRleCwKLQkgICAgICAgICAgIGxvYy0+ZS0+ZGVzdC0+aW5kZXgpOwotCSAgZHVtcF9l ZGdlX2luZm8gKGZpbGUsIGxvYy0+ZSwgZHVtcF9mbGFncywgMCk7Ci0JfQotICAgICAgZnByaW50 ZiAoZmlsZSwgIlxuXHRQUkVESUNBVEU6ICIpOwotICAgICAgcHJpbnRfZ2VuZXJpY19leHByIChm aWxlLCBsb2MtPmV4cHIpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlcyAiLCBnZXRfdHJlZV9j b2RlX25hbWUgKGxvYy0+Y29tcF9jb2RlKSk7Ci0gICAgICBwcmludF9nZW5lcmljX2V4cHIgKGZp bGUsIGxvYy0+dmFsKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcblxuIik7Ci0gICAgICBsb2Mg PSBsb2MtPm5leHQ7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotfQotCi0vKiBE dW1wIGFsbCB0aGUgcmVnaXN0ZXJlZCBhc3NlcnRpb25zIGZvciBhbGwgdGhlIG5hbWVzIHRvIEZJ TEUuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6ZHVtcCAoRklMRSAqZmlsZSkKLXsKLSAgdW5z aWduZWQgaTsKLSAgYml0bWFwX2l0ZXJhdG9yIGJpOwotCi0gIGZwcmludGYgKGZpbGUsICJcbkFT U0VSVF9FWFBScyB0byBiZSBpbnNlcnRlZFxuXG4iKTsKLSAgRVhFQ1VURV9JRl9TRVRfSU5fQklU TUFQIChuZWVkX2Fzc2VydF9mb3IsIDAsIGksIGJpKQotICAgIGR1bXAgKGZpbGUsIHNzYV9uYW1l IChpKSk7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotfQotCi0vKiBJZiBOQU1FIGRvZXNuJ3Qg aGF2ZSBhbiBBU1NFUlRfRVhQUiByZWdpc3RlcmVkIGZvciBhc3NlcnRpbmcKLSAgICdFWFBSIENP TVBfQ09ERSBWQUwnIGF0IGEgbG9jYXRpb24gdGhhdCBkb21pbmF0ZXMgYmxvY2sgQkIgb3IKLSAg IEUtPkRFU1QsIHRoZW4gcmVnaXN0ZXIgdGhpcyBsb2NhdGlvbiBhcyBhIHBvc3NpYmxlIGluc2Vy dGlvbiBwb2ludAotICAgZm9yIEFTU0VSVF9FWFBSIDxOQU1FLCBFWFBSIENPTVBfQ09ERSBWQUw+ LgotCi0gICBCQiwgRSBhbmQgU0kgcHJvdmlkZSB0aGUgZXhhY3QgaW5zZXJ0aW9uIHBvaW50IGZv ciB0aGUgbmV3Ci0gICBBU1NFUlRfRVhQUi4gIElmIEJCIGlzIE5VTEwsIHRoZW4gdGhlIEFTU0VS VF9FWFBSIGlzIHRvIGJlIGluc2VydGVkCi0gICBvbiBlZGdlIEUuICBPdGhlcndpc2UsIGlmIEUg aXMgTlVMTCwgdGhlIEFTU0VSVF9FWFBSIGlzIGluc2VydGVkIG9uCi0gICBCQi4gIElmIFNJIHBv aW50cyB0byBhIENPTkRfRVhQUiBvciBhIFNXSVRDSF9FWFBSIHN0YXRlbWVudCwgdGhlbiBFCi0g ICBtdXN0IG5vdCBiZSBOVUxMLiAgKi8KLQotdm9pZAotdnJwX2Fzc2VydHM6OnJlZ2lzdGVyX25l d19hc3NlcnRfZm9yICh0cmVlIG5hbWUsIHRyZWUgZXhwciwKLQkJCQkgICAgICBlbnVtIHRyZWVf Y29kZSBjb21wX2NvZGUsCi0JCQkJICAgICAgdHJlZSB2YWwsCi0JCQkJICAgICAgYmFzaWNfYmxv Y2sgYmIsCi0JCQkJICAgICAgZWRnZSBlLAotCQkJCSAgICAgIGdpbXBsZV9zdG10X2l0ZXJhdG9y IHNpKQotewotICBhc3NlcnRfbG9jdXMgKm4sICpsb2MsICpsYXN0X2xvYzsKLSAgYmFzaWNfYmxv Y2sgZGVzdF9iYjsKLQotICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChiYiA9PSBOVUxMIHx8IGUgPT0g TlVMTCk7Ci0KLSAgaWYgKGUgPT0gTlVMTCkKLSAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChnaW1w bGVfY29kZSAoZ3NpX3N0bXQgKHNpKSkgIT0gR0lNUExFX0NPTkQKLQkJCSAmJiBnaW1wbGVfY29k ZSAoZ3NpX3N0bXQgKHNpKSkgIT0gR0lNUExFX1NXSVRDSCk7Ci0KLSAgLyogTmV2ZXIgYnVpbGQg YW4gYXNzZXJ0IGNvbXBhcmluZyBhZ2FpbnN0IGFuIGludGVnZXIgY29uc3RhbnQgd2l0aAotICAg ICBUUkVFX09WRVJGTE9XIHNldC4gIFRoaXMgY29uZnVzZXMgb3VyIHVuZGVmaW5lZCBvdmVyZmxv dyB3YXJuaW5nCi0gICAgIG1hY2hpbmVyeS4gICovCi0gIGlmIChUUkVFX09WRVJGTE9XX1AgKHZh bCkpCi0gICAgdmFsID0gZHJvcF90cmVlX292ZXJmbG93ICh2YWwpOwotCi0gIC8qIFRoZSBuZXcg YXNzZXJ0aW9uIEEgd2lsbCBiZSBpbnNlcnRlZCBhdCBCQiBvciBFLiAgV2UgbmVlZCB0bwotICAg ICBkZXRlcm1pbmUgaWYgdGhlIG5ldyBsb2NhdGlvbiBpcyBkb21pbmF0ZWQgYnkgYSBwcmV2aW91 c2x5Ci0gICAgIHJlZ2lzdGVyZWQgbG9jYXRpb24gZm9yIEEuICBJZiB3ZSBhcmUgZG9pbmcgYW4g ZWRnZSBpbnNlcnRpb24sCi0gICAgIGFzc3VtZSB0aGF0IEEgd2lsbCBiZSBpbnNlcnRlZCBhdCBF LT5ERVNULiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90Ci0gICAgIG5lY2Vzc2FyaWx5IHRydWUuCi0K LSAgICAgSWYgRSBpcyBhIGNyaXRpY2FsIGVkZ2UsIGl0IHdpbGwgYmUgc3BsaXQuICBCdXQgZXZl biBpZiBFIGlzCi0gICAgIHNwbGl0LCB0aGUgbmV3IGJsb2NrIHdpbGwgZG9taW5hdGUgdGhlIHNh bWUgc2V0IG9mIGJsb2NrcyB0aGF0Ci0gICAgIEUtPkRFU1QgZG9taW5hdGVzLgotCi0gICAgIFRo ZSByZXZlcnNlLCBob3dldmVyLCBpcyBub3QgdHJ1ZSwgYmxvY2tzIGRvbWluYXRlZCBieSBFLT5E RVNUCi0gICAgIHdpbGwgbm90IGJlIGRvbWluYXRlZCBieSB0aGUgbmV3IGJsb2NrIGNyZWF0ZWQg dG8gc3BsaXQgRS4gIFNvLAotICAgICBpZiB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9uIGlzIG9uIGEg Y3JpdGljYWwgZWRnZSwgd2Ugd2lsbCBub3QgdXNlCi0gICAgIHRoZSBuZXcgbG9jYXRpb24gdG8g bW92ZSBhbm90aGVyIGFzc2VydGlvbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKLSAgICAgYXQgYSBi bG9jayBkb21pbmF0ZWQgYnkgRS0+REVTVC4gICovCi0gIGRlc3RfYmIgPSAoYmIpID8gYmIgOiBl LT5kZXN0OwotCi0gIC8qIElmIE5BTUUgYWxyZWFkeSBoYXMgYW4gQVNTRVJUX0VYUFIgcmVnaXN0 ZXJlZCBmb3IgQ09NUF9DT0RFIGFuZAotICAgICBWQUwgYXQgYSBibG9jayBkb21pbmF0aW5nIERF U1RfQkIsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBpbnNlcnQgYSBuZXcKLSAgICAgb25lLiAgU2lt aWxhcmx5LCBpZiB0aGUgc2FtZSBhc3NlcnRpb24gYWxyZWFkeSBleGlzdHMgYXQgYSBibG9jawot ICAgICBkb21pbmF0ZWQgYnkgREVTVF9CQiBhbmQgdGhlIG5ldyBsb2NhdGlvbiBpcyBub3Qgb24g YSBjcml0aWNhbAotICAgICBlZGdlLCB0aGVuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgbG9jYXRpb24g Zm9yIHRoZSBhc3NlcnRpb24gKGkuZS4sCi0gICAgIG1vdmUgdGhlIGFzc2VydGlvbiB1cCBpbiB0 aGUgZG9taW5hbmNlIHRyZWUpLgotCi0gICAgIE5vdGUsIHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMg YSBzaW1wbGUgbGlua2VkIGxpc3QgYmVjYXVzZSB0aGVyZQotICAgICBzaG91bGQgbm90IGJlIG1v cmUgdGhhbiBhIGhhbmRmdWwgb2YgYXNzZXJ0aW9ucyByZWdpc3RlcmVkIHBlcgotICAgICBuYW1l LiAgSWYgdGhpcyBiZWNvbWVzIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSwgYSB0YWJsZSBoYXNoZWQg YnkKLSAgICAgQ09NUF9DT0RFIGFuZCBWQUwgY291bGQgYmUgaW1wbGVtZW50ZWQuICAqLwotICBs b2MgPSBhc3NlcnRzX2ZvcltTU0FfTkFNRV9WRVJTSU9OIChuYW1lKV07Ci0gIGxhc3RfbG9jID0g bG9jOwotICB3aGlsZSAobG9jKQotICAgIHsKLSAgICAgIGlmIChsb2MtPmNvbXBfY29kZSA9PSBj b21wX2NvZGUKLQkgICYmIChsb2MtPnZhbCA9PSB2YWwKLQkgICAgICB8fCBvcGVyYW5kX2VxdWFs X3AgKGxvYy0+dmFsLCB2YWwsIDApKQotCSAgJiYgKGxvYy0+ZXhwciA9PSBleHByCi0JICAgICAg fHwgb3BlcmFuZF9lcXVhbF9wIChsb2MtPmV4cHIsIGV4cHIsIDApKSkKLQl7Ci0JICAvKiBJZiBF IGlzIG5vdCBhIGNyaXRpY2FsIGVkZ2UgYW5kIERFU1RfQkIKLQkgICAgIGRvbWluYXRlcyB0aGUg ZXhpc3RpbmcgbG9jYXRpb24gZm9yIHRoZSBhc3NlcnRpb24sIG1vdmUKLQkgICAgIHRoZSBhc3Nl cnRpb24gdXAgaW4gdGhlIGRvbWluYW5jZSB0cmVlIGJ5IHVwZGF0aW5nIGl0cwotCSAgICAgbG9j YXRpb24gaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKChlID09IE5VTEwgfHwgIUVER0VfQ1JJVElD QUxfUCAoZSkpCi0JICAgICAgJiYgZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFUT1JTLCBsb2Mt PmJiLCBkZXN0X2JiKSkKLQkgICAgewotCSAgICAgIGxvYy0+YmIgPSBkZXN0X2JiOwotCSAgICAg IGxvYy0+ZSA9IGU7Ci0JICAgICAgbG9jLT5zaSA9IHNpOwotCSAgICAgIHJldHVybjsKLQkgICAg fQotCX0KLQotICAgICAgLyogVXBkYXRlIHRoZSBsYXN0IG5vZGUgb2YgdGhlIGxpc3QgYW5kIG1v dmUgdG8gdGhlIG5leHQgb25lLiAgKi8KLSAgICAgIGxhc3RfbG9jID0gbG9jOwotICAgICAgbG9j ID0gbG9jLT5uZXh0OwotICAgIH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhbiBhc3NlcnRp b24gYWxyZWFkeSByZWdpc3RlcmVkIGZvcgotICAgICBOQU1FIENPTVBfQ09ERSBWQUwsIGFkZCBh IG5ldyBvbmUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgotICAgICBhc3NlcnRpb25zIGFzc29j aWF0ZWQgd2l0aCBOQU1FLiAgKi8KLSAgbiA9IFhORVcgKHN0cnVjdCBhc3NlcnRfbG9jdXMpOwot ICBuLT5iYiA9IGRlc3RfYmI7Ci0gIG4tPmUgPSBlOwotICBuLT5zaSA9IHNpOwotICBuLT5jb21w X2NvZGUgPSBjb21wX2NvZGU7Ci0gIG4tPnZhbCA9IHZhbDsKLSAgbi0+ZXhwciA9IGV4cHI7Ci0g IG4tPm5leHQgPSBOVUxMOwotCi0gIGlmIChsYXN0X2xvYykKLSAgICBsYXN0X2xvYy0+bmV4dCA9 IG47Ci0gIGVsc2UKLSAgICBhc3NlcnRzX2ZvcltTU0FfTkFNRV9WRVJTSU9OIChuYW1lKV0gPSBu OwotCi0gIGJpdG1hcF9zZXRfYml0IChuZWVkX2Fzc2VydF9mb3IsIFNTQV9OQU1FX1ZFUlNJT04g KG5hbWUpKTsKLX0KLQotLyogRmluaXNoIGZvdW5kIEFTU0VSVFMgZm9yIEUgYW5kIHJlZ2lzdGVy IHRoZW0gYXQgR1NJLiAgKi8KLQotdm9pZAotdnJwX2Fzc2VydHM6OmZpbmlzaF9yZWdpc3Rlcl9l ZGdlX2Fzc2VydF9mb3IgKGVkZ2UgZSwKLQkJCQkJICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3Ig Z3NpLAotCQkJCQkgICAgICB2ZWM8YXNzZXJ0X2luZm8+ICZhc3NlcnRzKQotewotICBmb3IgKHVu c2lnbmVkIGkgPSAwOyBpIDwgYXNzZXJ0cy5sZW5ndGggKCk7ICsraSkKLSAgICAvKiBPbmx5IHJl Z2lzdGVyIGFuIEFTU0VSVF9FWFBSIGlmIE5BTUUgd2FzIGZvdW5kIGluIHRoZSBzdWItZ3JhcGgK LSAgICAgICByZWFjaGFibGUgZnJvbSBFLiAgKi8KLSAgICBpZiAobGl2ZS5saXZlX29uX2VkZ2Vf cCAoYXNzZXJ0c1tpXS5uYW1lLCBlKSkKLSAgICAgIHJlZ2lzdGVyX25ld19hc3NlcnRfZm9yIChh c3NlcnRzW2ldLm5hbWUsIGFzc2VydHNbaV0uZXhwciwKLQkJCSAgICAgICBhc3NlcnRzW2ldLmNv bXBfY29kZSwgYXNzZXJ0c1tpXS52YWwsCi0JCQkgICAgICAgTlVMTCwgZSwgZ3NpKTsKLX0KLQot LyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG91dGdvaW5nIGVkZ2VzIG9mIEJCIHNob3VsZCByZWNl aXZlIGFuCi0gICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIncyBM QVNUIHN0YXRlbWVudC4KLSAgIFRoZSBsYXN0IHN0YXRlbWVudCBvZiBCQiBtdXN0IGJlIGEgQ09O RF9FWFBSLgotCi0gICBJZiBhbnkgb2YgdGhlIHN1Yi1ncmFwaHMgcm9vdGVkIGF0IEJCIGhhdmUg YW4gaW50ZXJlc3RpbmcgdXNlIG9mCi0gICB0aGUgcHJlZGljYXRlIG9wZXJhbmRzLCBhbiBhc3Nl cnQgbG9jYXRpb24gbm9kZSBpcyBhZGRlZCB0byB0aGUKLSAgIGxpc3Qgb2YgYXNzZXJ0aW9ucyBm b3IgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmFuZHMuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6 ZmluZF9jb25kaXRpb25hbF9hc3NlcnRzIChiYXNpY19ibG9jayBiYiwgZ2NvbmQgKmxhc3QpCi17 Ci0gIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGJzaTsKLSAgdHJlZSBvcDsKLSAgZWRnZV9pdGVyYXRv ciBlaTsKLSAgZWRnZSBlOwotICBzc2Ffb3BfaXRlciBpdGVyOwotCi0gIGJzaSA9IGdzaV9mb3Jf c3RtdCAobGFzdCk7Ci0KLSAgLyogTG9vayBmb3IgdXNlcyBvZiB0aGUgb3BlcmFuZHMgaW4gZWFj aCBvZiB0aGUgc3ViLWdyYXBocwotICAgICByb290ZWQgYXQgQkIuICBXZSBuZWVkIHRvIGNoZWNr IGVhY2ggb2YgdGhlIG91dGdvaW5nIGVkZ2VzCi0gICAgIHNlcGFyYXRlbHksIHNvIHRoYXQgd2Ug a25vdyB3aGF0IGtpbmQgb2YgQVNTRVJUX0VYUFIgdG8KLSAgICAgaW5zZXJ0LiAgKi8KLSAgRk9S X0VBQ0hfRURHRSAoZSwgZWksIGJiLT5zdWNjcykKLSAgICB7Ci0gICAgICBpZiAoZS0+ZGVzdCA9 PSBiYikKLQljb250aW51ZTsKLQotICAgICAgLyogUmVnaXN0ZXIgdGhlIG5lY2Vzc2FyeSBhc3Nl cnRpb25zIGZvciBlYWNoIG9wZXJhbmQgaW4gdGhlCi0JIGNvbmRpdGlvbmFsIHByZWRpY2F0ZS4g ICovCi0gICAgICBhdXRvX3ZlYzxhc3NlcnRfaW5mbywgOD4gYXNzZXJ0czsKLSAgICAgIEZPUl9F QUNIX1NTQV9UUkVFX09QRVJBTkQgKG9wLCBsYXN0LCBpdGVyLCBTU0FfT1BfVVNFKQotCXJlZ2lz dGVyX2VkZ2VfYXNzZXJ0X2ZvciAob3AsIGUsCi0JCQkJICBnaW1wbGVfY29uZF9jb2RlIChsYXN0 KSwKLQkJCQkgIGdpbXBsZV9jb25kX2xocyAobGFzdCksCi0JCQkJICBnaW1wbGVfY29uZF9yaHMg KGxhc3QpLCBhc3NlcnRzKTsKLSAgICAgIGZpbmlzaF9yZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3Ig KGUsIGJzaSwgYXNzZXJ0cyk7Ci0gICAgfQotfQotCi0vKiBDb21wYXJlIHR3byBjYXNlIGxhYmVs cyBzb3J0aW5nIGZpcnN0IGJ5IHRoZSBkZXN0aW5hdGlvbiBiYiBpbmRleAotICAgYW5kIHRoZW4g YnkgdGhlIGNhc2UgdmFsdWUuICAqLwotCi1pbnQKLXZycF9hc3NlcnRzOjpjb21wYXJlX2Nhc2Vf bGFiZWxzIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gIGNvbnN0IHN0cnVj dCBjYXNlX2luZm8gKmNpMSA9IChjb25zdCBzdHJ1Y3QgY2FzZV9pbmZvICopIHAxOwotICBjb25z dCBzdHJ1Y3QgY2FzZV9pbmZvICpjaTIgPSAoY29uc3Qgc3RydWN0IGNhc2VfaW5mbyAqKSBwMjsK LSAgaW50IGlkeDEgPSBjaTEtPmJiLT5pbmRleDsKLSAgaW50IGlkeDIgPSBjaTItPmJiLT5pbmRl eDsKLQotICBpZiAoaWR4MSA8IGlkeDIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChpZHgx ID09IGlkeDIpCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZSBkZWZhdWx0IGxhYmVsIGlz IGZpcnN0IGluIGEgZ3JvdXAuICAqLwotICAgICAgaWYgKCFDQVNFX0xPVyAoY2kxLT5leHByKSkK LQlyZXR1cm4gLTE7Ci0gICAgICBlbHNlIGlmICghQ0FTRV9MT1cgKGNpMi0+ZXhwcikpCi0JcmV0 dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHRyZWVfaW50X2NzdF9jb21wYXJlIChDQVNFX0xP VyAoY2kxLT5leHByKSwKLQkJCQkgICAgIENBU0VfTE9XIChjaTItPmV4cHIpKTsKLSAgICB9Ci0g IGVsc2UKLSAgICByZXR1cm4gMTsKLX0KLQotLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG91dGdv aW5nIGVkZ2VzIG9mIEJCIHNob3VsZCByZWNlaXZlIGFuCi0gICBBU1NFUlRfRVhQUiBmb3IgZWFj aCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIncyBMQVNUIHN0YXRlbWVudC4KLSAgIFRoZSBsYXN0IHN0 YXRlbWVudCBvZiBCQiBtdXN0IGJlIGEgU1dJVENIX0VYUFIuCi0KLSAgIElmIGFueSBvZiB0aGUg c3ViLWdyYXBocyByb290ZWQgYXQgQkIgaGF2ZSBhbiBpbnRlcmVzdGluZyB1c2Ugb2YKLSAgIHRo ZSBwcmVkaWNhdGUgb3BlcmFuZHMsIGFuIGFzc2VydCBsb2NhdGlvbiBub2RlIGlzIGFkZGVkIHRv IHRoZQotICAgbGlzdCBvZiBhc3NlcnRpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5k cy4gICovCi0KLXZvaWQKLXZycF9hc3NlcnRzOjpmaW5kX3N3aXRjaF9hc3NlcnRzIChiYXNpY19i bG9jayBiYiwgZ3N3aXRjaCAqbGFzdCkKLXsKLSAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgYnNpOwot ICB0cmVlIG9wOwotICBlZGdlIGU7Ci0gIHN0cnVjdCBjYXNlX2luZm8gKmNpOwotICBzaXplX3Qg biA9IGdpbXBsZV9zd2l0Y2hfbnVtX2xhYmVscyAobGFzdCk7Ci0jaWYgR0NDX1ZFUlNJT04gPj0g NDAwMAotICB1bnNpZ25lZCBpbnQgaWR4OwotI2Vsc2UKLSAgLyogV29yayBhcm91bmQgR0NDIDMu NCBidWcgKFBSIDM3MDg2KS4gICovCi0gIHZvbGF0aWxlIHVuc2lnbmVkIGludCBpZHg7Ci0jZW5k aWYKLQotICBic2kgPSBnc2lfZm9yX3N0bXQgKGxhc3QpOwotICBvcCA9IGdpbXBsZV9zd2l0Y2hf aW5kZXggKGxhc3QpOwotICBpZiAoVFJFRV9DT0RFIChvcCkgIT0gU1NBX05BTUUpCi0gICAgcmV0 dXJuOwotCi0gIC8qIEJ1aWxkIGEgdmVjdG9yIG9mIGNhc2UgbGFiZWxzIHNvcnRlZCBieSBkZXN0 aW5hdGlvbiBsYWJlbC4gICovCi0gIGNpID0gWE5FV1ZFQyAoc3RydWN0IGNhc2VfaW5mbywgbik7 Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgbjsgKytpZHgpCi0gICAgewotICAgICAgY2lbaWR4XS5l eHByID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAobGFzdCwgaWR4KTsKLSAgICAgIGNpW2lkeF0uYmIg PSBsYWJlbF90b19ibG9jayAoZnVuLCBDQVNFX0xBQkVMIChjaVtpZHhdLmV4cHIpKTsKLSAgICB9 Ci0gIGVkZ2UgZGVmYXVsdF9lZGdlID0gZmluZF9lZGdlIChiYiwgY2lbMF0uYmIpOwotICBxc29y dCAoY2ksIG4sIHNpemVvZiAoc3RydWN0IGNhc2VfaW5mbyksIGNvbXBhcmVfY2FzZV9sYWJlbHMp OwotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgbjsgKytpZHgpCi0gICAgewotICAgICAgdHJlZSBt aW4sIG1heDsKLSAgICAgIHRyZWUgY2wgPSBjaVtpZHhdLmV4cHI7Ci0gICAgICBiYXNpY19ibG9j ayBjYmIgPSBjaVtpZHhdLmJiOwotCi0gICAgICBtaW4gPSBDQVNFX0xPVyAoY2wpOwotICAgICAg bWF4ID0gQ0FTRV9ISUdIIChjbCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBj YXNlIGxhYmVscyB3aXRoIHRoZSBzYW1lIGRlc3RpbmF0aW9uCi0JIHdlIG5lZWQgdG8gY29tYmlu ZSB0aGVtIHRvIGEgc2luZ2xlIHZhbHVlIHJhbmdlIGZvciB0aGUgZWRnZS4gICovCi0gICAgICBp ZiAoaWR4ICsgMSA8IG4gJiYgY2JiID09IGNpW2lkeCArIDFdLmJiKQotCXsKLQkgIC8qIFNraXAg bGFiZWxzIHVudGlsIHRoZSBsYXN0IG9mIHRoZSBncm91cC4gICovCi0JICBkbyB7Ci0JICAgICsr aWR4OwotCSAgfSB3aGlsZSAoaWR4IDwgbiAmJiBjYmIgPT0gY2lbaWR4XS5iYik7Ci0JICAtLWlk eDsKLQotCSAgLyogUGljayB1cCB0aGUgbWF4aW11bSBvZiB0aGUgY2FzZSBsYWJlbCByYW5nZS4g ICovCi0JICBpZiAoQ0FTRV9ISUdIIChjaVtpZHhdLmV4cHIpKQotCSAgICBtYXggPSBDQVNFX0hJ R0ggKGNpW2lkeF0uZXhwcik7Ci0JICBlbHNlCi0JICAgIG1heCA9IENBU0VfTE9XIChjaVtpZHhd LmV4cHIpOwotCX0KLQotICAgICAgLyogQ2FuJ3QgZXh0cmFjdCBhIHVzZWZ1bCBhc3NlcnRpb24g b3V0IG9mIGEgcmFuZ2UgdGhhdCBpbmNsdWRlcyB0aGUKLQkgZGVmYXVsdCBsYWJlbC4gICovCi0g ICAgICBpZiAobWluID09IE5VTExfVFJFRSkKLQljb250aW51ZTsKLQotICAgICAgLyogRmluZCB0 aGUgZWRnZSB0byByZWdpc3RlciB0aGUgYXNzZXJ0IGV4cHIgb24uICAqLwotICAgICAgZSA9IGZp bmRfZWRnZSAoYmIsIGNiYik7Ci0KLSAgICAgIC8qIFJlZ2lzdGVyIHRoZSBuZWNlc3NhcnkgYXNz ZXJ0aW9ucyBmb3IgdGhlIG9wZXJhbmQgaW4gdGhlCi0JIFNXSVRDSF9FWFBSLiAgKi8KLSAgICAg IGF1dG9fdmVjPGFzc2VydF9pbmZvLCA4PiBhc3NlcnRzOwotICAgICAgcmVnaXN0ZXJfZWRnZV9h c3NlcnRfZm9yIChvcCwgZSwKLQkJCQltYXggPyBHRV9FWFBSIDogRVFfRVhQUiwKLQkJCQlvcCwg Zm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKG9wKSwgbWluKSwKLQkJCQlhc3NlcnRzKTsKLSAgICAg IGlmIChtYXgpCi0JcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChvcCwgZSwgTEVfRVhQUiwgb3As Ci0JCQkJICBmb2xkX2NvbnZlcnQgKFRSRUVfVFlQRSAob3ApLCBtYXgpLAotCQkJCSAgYXNzZXJ0 cyk7Ci0gICAgICBmaW5pc2hfcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChlLCBic2ksIGFzc2Vy dHMpOwotICAgIH0KLQotICBYREVMRVRFVkVDIChjaSk7Ci0KLSAgaWYgKCFsaXZlLmxpdmVfb25f ZWRnZV9wIChvcCwgZGVmYXVsdF9lZGdlKSkKLSAgICByZXR1cm47Ci0KLSAgLyogTm93IHJlZ2lz dGVyIGFsb25nIHRoZSBkZWZhdWx0IGxhYmVsIGFzc2VydGlvbnMgdGhhdCBjb3JyZXNwb25kIHRv IHRoZQotICAgICBhbnRpLXJhbmdlIG9mIGVhY2ggbGFiZWwuICAqLwotICBpbnQgaW5zZXJ0aW9u X2xpbWl0ID0gcGFyYW1fbWF4X3ZycF9zd2l0Y2hfYXNzZXJ0aW9uczsKLSAgaWYgKGluc2VydGlv bl9saW1pdCA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBXZSBjYW4ndCBkbyB0aGlzIGlmIHRo ZSBkZWZhdWx0IGNhc2Ugc2hhcmVzIGEgbGFiZWwgd2l0aCBhbm90aGVyIGNhc2UuICAqLwotICB0 cmVlIGRlZmF1bHRfY2wgPSBnaW1wbGVfc3dpdGNoX2RlZmF1bHRfbGFiZWwgKGxhc3QpOwotICBm b3IgKGlkeCA9IDE7IGlkeCA8IG47IGlkeCsrKQotICAgIHsKLSAgICAgIHRyZWUgbWluLCBtYXg7 Ci0gICAgICB0cmVlIGNsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAobGFzdCwgaWR4KTsKLSAgICAg IGlmIChDQVNFX0xBQkVMIChjbCkgPT0gQ0FTRV9MQUJFTCAoZGVmYXVsdF9jbCkpCi0JY29udGlu dWU7Ci0KLSAgICAgIG1pbiA9IENBU0VfTE9XIChjbCk7Ci0gICAgICBtYXggPSBDQVNFX0hJR0gg KGNsKTsKLQotICAgICAgLyogQ29tYmluZSBjb250aWd1b3VzIGNhc2UgcmFuZ2VzIHRvIHJlZHVj ZSB0aGUgbnVtYmVyIG9mIGFzc2VydGlvbnMKLQkgdG8gaW5zZXJ0LiAgKi8KLSAgICAgIGZvciAo aWR4ID0gaWR4ICsgMTsgaWR4IDwgbjsgaWR4KyspCi0JewotCSAgdHJlZSBuZXh0X21pbiwgbmV4 dF9tYXg7Ci0JICB0cmVlIG5leHRfY2wgPSBnaW1wbGVfc3dpdGNoX2xhYmVsIChsYXN0LCBpZHgp OwotCSAgaWYgKENBU0VfTEFCRUwgKG5leHRfY2wpID09IENBU0VfTEFCRUwgKGRlZmF1bHRfY2wp KQotCSAgICBicmVhazsKLQotCSAgbmV4dF9taW4gPSBDQVNFX0xPVyAobmV4dF9jbCk7Ci0JICBu ZXh0X21heCA9IENBU0VfSElHSCAobmV4dF9jbCk7Ci0KLQkgIHdpZGVfaW50IGRpZmZlcmVuY2Ug PSAod2k6OnRvX3dpZGUgKG5leHRfbWluKQotCQkJCSAtIHdpOjp0b193aWRlIChtYXggPyBtYXgg OiBtaW4pKTsKLQkgIGlmICh3aTo6ZXFfcCAoZGlmZmVyZW5jZSwgMSkpCi0JICAgIG1heCA9IG5l eHRfbWF4ID8gbmV4dF9tYXggOiBuZXh0X21pbjsKLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0JfQot ICAgICAgaWR4LS07Ci0KLSAgICAgIGlmIChtYXggPT0gTlVMTF9UUkVFKQotCXsKLQkgIC8qIFJl Z2lzdGVyIHRoZSBhc3NlcnRpb24gT1AgIT0gTUlOLiAgKi8KLQkgIGF1dG9fdmVjPGFzc2VydF9p bmZvLCA4PiBhc3NlcnRzOwotCSAgbWluID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKG9wKSwg bWluKTsKLQkgIHJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2ZvciAob3AsIGRlZmF1bHRfZWRnZSwgTkVf RVhQUiwgb3AsIG1pbiwKLQkJCQkgICAgYXNzZXJ0cyk7Ci0JICBmaW5pc2hfcmVnaXN0ZXJfZWRn ZV9hc3NlcnRfZm9yIChkZWZhdWx0X2VkZ2UsIGJzaSwgYXNzZXJ0cyk7Ci0JfQotICAgICAgZWxz ZQotCXsKLQkgIC8qIFJlZ2lzdGVyIHRoZSBhc3NlcnRpb24gKHVuc2lnbmVkKU9QIC0gTUlOID4g KE1BWCAtIE1JTiksCi0JICAgICB3aGljaCB3aWxsIGdpdmUgT1AgdGhlIGFudGktcmFuZ2UgfltN SU4sTUFYXS4gICovCi0JICB0cmVlIHVvcCA9IGZvbGRfY29udmVydCAodW5zaWduZWRfdHlwZV9m b3IgKFRSRUVfVFlQRSAob3ApKSwgb3ApOwotCSAgbWluID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZ UEUgKHVvcCksIG1pbik7Ci0JICBtYXggPSBmb2xkX2NvbnZlcnQgKFRSRUVfVFlQRSAodW9wKSwg bWF4KTsKLQotCSAgdHJlZSBsaHMgPSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQUiwgVFJFRV9UWVBF ICh1b3ApLCB1b3AsIG1pbik7Ci0JICB0cmVlIHJocyA9IGludF9jb25zdF9iaW5vcCAoTUlOVVNf RVhQUiwgbWF4LCBtaW4pOwotCSAgcmVnaXN0ZXJfbmV3X2Fzc2VydF9mb3IgKG9wLCBsaHMsIEdU X0VYUFIsIHJocywKLQkJCQkgICBOVUxMLCBkZWZhdWx0X2VkZ2UsIGJzaSk7Ci0JfQotCi0gICAg ICBpZiAoLS1pbnNlcnRpb25fbGltaXQgPT0gMCkKLQlicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRy YXZlcnNlIGFsbCB0aGUgc3RhdGVtZW50cyBpbiBibG9jayBCQiBsb29raW5nIGZvciBzdGF0ZW1l bnRzIHRoYXQKLSAgIG1heSBnZW5lcmF0ZSB1c2VmdWwgYXNzZXJ0aW9ucyBmb3IgdGhlIFNTQSBu YW1lcyBpbiB0aGVpciBvcGVyYW5kLgotICAgSWYgYSBzdGF0ZW1lbnQgcHJvZHVjZXMgYSB1c2Vm dWwgYXNzZXJ0aW9uIEEgZm9yIG5hbWUgTl9pLCB0aGVuIHRoZQotICAgbGlzdCBvZiBhc3NlcnRp b25zIGFscmVhZHkgZ2VuZXJhdGVkIGZvciBOX2kgaXMgc2Nhbm5lZCB0bwotICAgZGV0ZXJtaW5l IGlmIEEgaXMgYWN0dWFsbHkgbmVlZGVkLgotCi0gICBJZiBOX2kgYWxyZWFkeSBoYWQgdGhlIGFz c2VydGlvbiBBIGF0IGEgbG9jYXRpb24gZG9taW5hdGluZyB0aGUKLSAgIGN1cnJlbnQgbG9jYXRp b24sIHRoZW4gbm90aGluZyBuZWVkcyB0byBiZSBkb25lLiAgT3RoZXJ3aXNlLCB0aGUKLSAgIG5l dyBsb2NhdGlvbiBmb3IgQSBpcyByZWNvcmRlZCBpbnN0ZWFkLgotCi0gICAxLSBGb3IgZXZlcnkg c3RhdGVtZW50IFMgaW4gQkIsIGFsbCB0aGUgdmFyaWFibGVzIHVzZWQgYnkgUyBhcmUKLSAgICAg IGFkZGVkIHRvIGJpdG1hcCBGT1VORF9JTl9TVUJHUkFQSC4KLQotICAgMi0gSWYgc3RhdGVtZW50 IFMgdXNlcyBhbiBvcGVyYW5kIE4gaW4gYSB3YXkgdGhhdCBleHBvc2VzIGEga25vd24KLSAgICAg IHZhbHVlIHJhbmdlIGZvciBOLCB0aGVuIGlmIE4gd2FzIG5vdCBhbHJlYWR5IGdlbmVyYXRlZCBi eSBhbgotICAgICAgQVNTRVJUX0VYUFIsIGNyZWF0ZSBhIG5ldyBhc3NlcnQgbG9jYXRpb24gZm9y IE4uICBGb3IgaW5zdGFuY2UsCi0gICAgICBpZiBOIGlzIGEgcG9pbnRlciBhbmQgdGhlIHN0YXRl bWVudCBkZXJlZmVyZW5jZXMgaXQsIHdlIGNhbgotICAgICAgYXNzdW1lIHRoYXQgTiBpcyBub3Qg TlVMTC4KLQotICAgMy0gQ09ORF9FWFBScyBhcmUgYSBzcGVjaWFsIGNhc2Ugb2YgIzIuICBXZSBj YW4gZGVyaXZlIHJhbmdlCi0gICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwcmVkaWNhdGUgYnV0 IG5lZWQgdG8gaW5zZXJ0IGRpZmZlcmVudAotICAgICAgQVNTRVJUX0VYUFJzIGZvciBlYWNoIG9m IHRoZSBzdWItZ3JhcGhzIHJvb3RlZCBhdCB0aGUKLSAgICAgIGNvbmRpdGlvbmFsIGJsb2NrLiAg SWYgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIEJCIGlzIGEgY29uZGl0aW9uYWwKLSAgICAgIGV4cHJl c3Npb24gb2YgdGhlIGZvcm0gJ1ggb3AgWScsIHRoZW4KLQotICAgICAgYSkgUmVtb3ZlIFggYW5k IFkgZnJvbSB0aGUgc2V0IEZPVU5EX0lOX1NVQkdSQVBILgotCi0gICAgICBiKSBJZiB0aGUgY29u ZGl0aW9uYWwgaXMgdGhlIG9ubHkgZW50cnkgcG9pbnQgdG8gdGhlIHN1Yi1ncmFwaAotCSBjb3Jy ZXNwb25kaW5nIHRvIHRoZSBUSEVOX0NMQVVTRSwgcmVjdXJzZSBpbnRvIGl0LiAgT24KLQkgcmV0 dXJuLCBpZiBYIGFuZC9vciBZIGFyZSBtYXJrZWQgaW4gRk9VTkRfSU5fU1VCR1JBUEgsIHRoZW4K LQkgYW4gQVNTRVJUX0VYUFIgaXMgYWRkZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxl LgotCi0gICAgICBjKSBSZXBlYXQgc3RlcCAoYikgb24gdGhlIEVMU0VfQ0xBVVNFLgotCi0gICAg ICBkKSBNYXJrIFggYW5kIFkgaW4gRk9VTkRfSU5fU1VCR1JBUEguCi0KLSAgICAgIEZvciBpbnN0 YW5jZSwKLQotCSAgICBpZiAoYSA9PSA5KQotCSAgICAgIGIgPSBhOwotCSAgICBlbHNlCi0JICAg ICAgYiA9IGMgKyAxOwotCi0gICAgICBJbiB0aGlzIGNhc2UsIGFuIGFzc2VydGlvbiBvbiB0aGUg VEhFTiBjbGF1c2UgaXMgdXNlZnVsIHRvCi0gICAgICBkZXRlcm1pbmUgdGhhdCAnYScgaXMgYWx3 YXlzIDkgb24gdGhhdCBlZGdlLiAgSG93ZXZlciwgYW4gYXNzZXJ0aW9uCi0gICAgICBvbiB0aGUg RUxTRSBjbGF1c2Ugd291bGQgYmUgdW5uZWNlc3NhcnkuCi0KLSAgIDQtIElmIEJCIGRvZXMgbm90 IGVuZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24sIHRoZW4gd2UgcmVjdXJzZQotICAgICAg aW50byBCQidzIGRvbWluYXRvciBjaGlsZHJlbi4KLQotICAgQXQgdGhlIGVuZCBvZiB0aGUgcmVj dXJzaXZlIHRyYXZlcnNhbCwgZXZlcnkgU1NBIG5hbWUgd2lsbCBoYXZlIGEKLSAgIGxpc3Qgb2Yg bG9jYXRpb25zIHdoZXJlIEFTU0VSVF9FWFBScyBzaG91bGQgYmUgYWRkZWQuICBXaGVuIGEgbmV3 Ci0gICBsb2NhdGlvbiBmb3IgbmFtZSBOIGlzIGZvdW5kLCBpdCBpcyByZWdpc3RlcmVkIGJ5IGNh bGxpbmcKLSAgIHJlZ2lzdGVyX25ld19hc3NlcnRfZm9yLiAgVGhhdCBmdW5jdGlvbiBrZWVwcyB0 cmFjayBvZiBhbGwgdGhlCi0gICByZWdpc3RlcmVkIGFzc2VydGlvbnMgdG8gcHJldmVudCBhZGRp bmcgdW5uZWNlc3NhcnkgYXNzZXJ0aW9ucy4KLSAgIEZvciBpbnN0YW5jZSwgaWYgYSBwb2ludGVy IFBfNCBpcyBkZXJlZmVyZW5jZWQgbW9yZSB0aGFuIG9uY2UgaW4gYQotICAgZG9taW5hdG9yIHRy ZWUsIG9ubHkgdGhlIGxvY2F0aW9uIGRvbWluYXRpbmcgYWxsIHRoZSBkZXJlZmVyZW5jZSBvZgot ICAgUF80IHdpbGwgcmVjZWl2ZSBhbiBBU1NFUlRfRVhQUi4gICovCi0KLXZvaWQKLXZycF9hc3Nl cnRzOjpmaW5kX2Fzc2VydF9sb2NhdGlvbnNfaW5fYmIgKGJhc2ljX2Jsb2NrIGJiKQotewotICBn aW1wbGUgKmxhc3Q7Ci0KLSAgbGFzdCA9IGxhc3Rfc3RtdCAoYmIpOwotCi0gIC8qIElmIEJCJ3Mg bGFzdCBzdGF0ZW1lbnQgaXMgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgaW52b2x2aW5nIGludGVn ZXIKLSAgICAgb3BlcmFuZHMsIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGFkZCBBU1NFUlRfRVhQ UnMuICAqLwotICBpZiAobGFzdAotICAgICAgJiYgZ2ltcGxlX2NvZGUgKGxhc3QpID09IEdJTVBM RV9DT05ECi0gICAgICAmJiAhZnBfcHJlZGljYXRlIChsYXN0KQotICAgICAgJiYgIVpFUk9fU1NB X09QRVJBTkRTIChsYXN0LCBTU0FfT1BfVVNFKSkKLSAgICBmaW5kX2NvbmRpdGlvbmFsX2Fzc2Vy dHMgKGJiLCBhc19hIDxnY29uZCAqPiAobGFzdCkpOwotCi0gIC8qIElmIEJCJ3MgbGFzdCBzdGF0 ZW1lbnQgaXMgYSBzd2l0Y2ggc3RhdGVtZW50IGludm9sdmluZyBpbnRlZ2VyCi0gICAgIG9wZXJh bmRzLCBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBhZGQgQVNTRVJUX0VYUFJzLiAgKi8KLSAgaWYg KGxhc3QKLSAgICAgICYmIGdpbXBsZV9jb2RlIChsYXN0KSA9PSBHSU1QTEVfU1dJVENICi0gICAg ICAmJiAhWkVST19TU0FfT1BFUkFORFMgKGxhc3QsIFNTQV9PUF9VU0UpKQotICAgIGZpbmRfc3dp dGNoX2Fzc2VydHMgKGJiLCBhc19hIDxnc3dpdGNoICo+IChsYXN0KSk7Ci0KLSAgLyogVHJhdmVy c2UgYWxsIHRoZSBzdGF0ZW1lbnRzIGluIEJCIG1hcmtpbmcgdXNlZCBuYW1lcyBhbmQgbG9va2lu ZwotICAgICBmb3Igc3RhdGVtZW50cyB0aGF0IG1heSBpbmZlciBhc3NlcnRpb25zIGZvciB0aGVp ciB1c2VkIG9wZXJhbmRzLiAgKi8KLSAgZm9yIChnaW1wbGVfc3RtdF9pdGVyYXRvciBzaSA9IGdz aV9sYXN0X2JiIChiYik7ICFnc2lfZW5kX3AgKHNpKTsKLSAgICAgICBnc2lfcHJldiAoJnNpKSkK LSAgICB7Ci0gICAgICBnaW1wbGUgKnN0bXQ7Ci0gICAgICB0cmVlIG9wOwotICAgICAgc3NhX29w X2l0ZXIgaTsKLQotICAgICAgc3RtdCA9IGdzaV9zdG10IChzaSk7Ci0KLSAgICAgIGlmIChpc19n aW1wbGVfZGVidWcgKHN0bXQpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgd2UgY2Fu IGRlcml2ZSBhbiBhc3NlcnRpb24gZm9yIGFueSBvZiBTVE1UJ3Mgb3BlcmFuZHMuICAqLwotICAg ICAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAob3AsIHN0bXQsIGksIFNTQV9PUF9VU0UpCi0J ewotCSAgdHJlZSB2YWx1ZTsKLQkgIGVudW0gdHJlZV9jb2RlIGNvbXBfY29kZTsKLQotCSAgLyog SWYgb3AgaXMgbm90IGxpdmUgYmV5b25kIHRoaXMgc3RtdCwgZG8gbm90IGJvdGhlciB0byBpbnNl cnQKLQkgICAgIGFzc2VydHMgZm9yIGl0LiAgKi8KLQkgIGlmICghbGl2ZS5saXZlX29uX2Jsb2Nr X3AgKG9wLCBiYikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiBPUCBpcyB1c2VkIGluIHN1 Y2ggYSB3YXkgdGhhdCB3ZSBjYW4gaW5mZXIgYSB2YWx1ZQotCSAgICAgcmFuZ2UgZm9yIGl0LCBh bmQgd2UgZG9uJ3QgZmluZCBhIHByZXZpb3VzIGFzc2VydGlvbiBmb3IKLQkgICAgIGl0LCBjcmVh dGUgYSBuZXcgYXNzZXJ0aW9uIGxvY2F0aW9uIG5vZGUgZm9yIE9QLiAgKi8KLQkgIGlmIChpbmZl cl92YWx1ZV9yYW5nZSAoc3RtdCwgb3AsICZjb21wX2NvZGUsICZ2YWx1ZSkpCi0JICAgIHsKLQkg ICAgICAvKiBJZiB3ZSBhcmUgYWJsZSB0byBpbmZlciBhIG5vbnplcm8gdmFsdWUgcmFuZ2UgZm9y IE9QLAotCQkgdGhlbiB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB1c2UtZGVmIGNoYWluIHRv IHNlZSBpZiBPUAotCQkgd2FzIHNldCB2aWEgYSB0eXBlY2FzdC4KLQotCQkgSWYgc28sIHRoZW4g d2UgY2FuIGFsc28gaW5mZXIgYSBub256ZXJvIHZhbHVlIHJhbmdlCi0JCSBmb3IgdGhlIG9wZXJh bmQgb2YgdGhlIE5PUF9FWFBSLiAgKi8KLQkgICAgICBpZiAoY29tcF9jb2RlID09IE5FX0VYUFIg JiYgaW50ZWdlcl96ZXJvcCAodmFsdWUpKQotCQl7Ci0JCSAgdHJlZSB0ID0gb3A7Ci0JCSAgZ2lt cGxlICpkZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UICh0KTsKLQotCQkgIHdoaWxlIChpc19n aW1wbGVfYXNzaWduIChkZWZfc3RtdCkKLQkJCSAmJiBDT05WRVJUX0VYUFJfQ09ERV9QCi0JCQkg ICAgIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChkZWZfc3RtdCkpCi0JCQkgJiYgVFJFRV9DT0RF Ci0JCQkgICAgIChnaW1wbGVfYXNzaWduX3JoczEgKGRlZl9zdG10KSkgPT0gU1NBX05BTUUKLQkJ CSAmJiBQT0lOVEVSX1RZUEVfUAotCQkJICAgICAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX3Jo czEgKGRlZl9zdG10KSkpKQotCQkgICAgewotCQkgICAgICB0ID0gZ2ltcGxlX2Fzc2lnbl9yaHMx IChkZWZfc3RtdCk7Ci0JCSAgICAgIGRlZl9zdG10ID0gU1NBX05BTUVfREVGX1NUTVQgKHQpOwot Ci0JCSAgICAgIC8qIE5vdGUgd2Ugd2FudCB0byByZWdpc3RlciB0aGUgYXNzZXJ0IGZvciB0aGUK LQkJCSBvcGVyYW5kIG9mIHRoZSBOT1BfRVhQUiBhZnRlciBTSSwgbm90IGFmdGVyIHRoZQotCQkJ IGNvbnZlcnNpb24uICAqLwotCQkgICAgICBpZiAobGl2ZS5saXZlX29uX2Jsb2NrX3AgKHQsIGJi KSkKLQkJCXJlZ2lzdGVyX25ld19hc3NlcnRfZm9yICh0LCB0LCBjb21wX2NvZGUsIHZhbHVlLAot CQkJCQkJIGJiLCBOVUxMLCBzaSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHJlZ2lzdGVyX25l d19hc3NlcnRfZm9yIChvcCwgb3AsIGNvbXBfY29kZSwgdmFsdWUsIGJiLCBOVUxMLCBzaSk7Ci0J ICAgIH0KLQl9Ci0KLSAgICAgIC8qIFVwZGF0ZSBsaXZlLiAgKi8KLSAgICAgIEZPUl9FQUNIX1NT QV9UUkVFX09QRVJBTkQgKG9wLCBzdG10LCBpLCBTU0FfT1BfVVNFKQotCWxpdmUuc2V0IChvcCwg YmIpOwotICAgICAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAob3AsIHN0bXQsIGksIFNTQV9P UF9ERUYpCi0JbGl2ZS5jbGVhciAob3AsIGJiKTsKLSAgICB9Ci0KLSAgLyogVHJhdmVyc2UgYWxs IFBISSBub2RlcyBpbiBCQiwgdXBkYXRpbmcgbGl2ZS4gICovCi0gIGZvciAoZ3BoaV9pdGVyYXRv ciBzaSA9IGdzaV9zdGFydF9waGlzIChiYik7ICFnc2lfZW5kX3AgKHNpKTsKLSAgICAgICBnc2lf bmV4dCAoJnNpKSkKLSAgICB7Ci0gICAgICB1c2Vfb3BlcmFuZF9wIGFyZ19wOwotICAgICAgc3Nh X29wX2l0ZXIgaTsKLSAgICAgIGdwaGkgKnBoaSA9IHNpLnBoaSAoKTsKLSAgICAgIHRyZWUgcmVz ID0gZ2ltcGxlX3BoaV9yZXN1bHQgKHBoaSk7Ci0KLSAgICAgIGlmICh2aXJ0dWFsX29wZXJhbmRf cCAocmVzKSkKLQljb250aW51ZTsKLQotICAgICAgRk9SX0VBQ0hfUEhJX0FSRyAoYXJnX3AsIHBo aSwgaSwgU1NBX09QX1VTRSkKLQl7Ci0JICB0cmVlIGFyZyA9IFVTRV9GUk9NX1BUUiAoYXJnX3Ap OwotCSAgaWYgKFRSRUVfQ09ERSAoYXJnKSA9PSBTU0FfTkFNRSkKLQkgICAgbGl2ZS5zZXQgKGFy ZywgYmIpOwotCX0KLQotICAgICAgbGl2ZS5jbGVhciAocmVzLCBiYik7Ci0gICAgfQotfQotCi0v KiBEbyBhbiBSUE8gd2FsayBvdmVyIHRoZSBmdW5jdGlvbiBjb21wdXRpbmcgU1NBIG5hbWUgbGl2 ZW5lc3MKLSAgIG9uLXRoZS1mbHkgYW5kIGRlY2lkaW5nIG9uIGFzc2VydCBleHByZXNzaW9ucyB0 byBpbnNlcnQuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6ZmluZF9hc3NlcnRfbG9jYXRpb25z ICh2b2lkKQotewotICBpbnQgKnJwbyA9IFhORVdWRUMgKGludCwgbGFzdF9iYXNpY19ibG9ja19m b3JfZm4gKGZ1bikpOwotICBpbnQgKmJiX3JwbyA9IFhORVdWRUMgKGludCwgbGFzdF9iYXNpY19i bG9ja19mb3JfZm4gKGZ1bikpOwotICBpbnQgKmxhc3RfcnBvID0gWENORVdWRUMgKGludCwgbGFz dF9iYXNpY19ibG9ja19mb3JfZm4gKGZ1bikpOwotICBpbnQgcnBvX2NudCwgaTsKLQotICBycG9f Y250ID0gcHJlX2FuZF9yZXZfcG9zdF9vcmRlcl9jb21wdXRlIChOVUxMLCBycG8sIGZhbHNlKTsK LSAgZm9yIChpID0gMDsgaSA8IHJwb19jbnQ7ICsraSkKLSAgICBiYl9ycG9bcnBvW2ldXSA9IGk7 Ci0KLSAgLyogUHJlLXNlZWQgbG9vcCBsYXRjaCBsaXZlbmVzcyBmcm9tIGxvb3AgaGVhZGVyIFBI SSBub2Rlcy4gIER1ZSB0bwotICAgICB0aGUgb3JkZXIgd2UgY29tcHV0ZSBsaXZlbmVzcyBhbmQg aW5zZXJ0IGFzc2VydHMgd2Ugb3RoZXJ3aXNlCi0gICAgIGZhaWwgdG8gaW5zZXJ0IGFzc2VydHMg aW50byB0aGUgbG9vcCBsYXRjaC4gICovCi0gIGZvciAoYXV0byBsb29wIDogbG9vcHNfbGlzdCAo Y2Z1biwgMCkpCi0gICAgewotICAgICAgaSA9IGxvb3AtPmxhdGNoLT5pbmRleDsKLSAgICAgIHVu c2lnbmVkIGludCBqID0gc2luZ2xlX3N1Y2NfZWRnZSAobG9vcC0+bGF0Y2gpLT5kZXN0X2lkeDsK LSAgICAgIGZvciAoZ3BoaV9pdGVyYXRvciBnc2kgPSBnc2lfc3RhcnRfcGhpcyAobG9vcC0+aGVh ZGVyKTsKLQkgICAhZ3NpX2VuZF9wIChnc2kpOyBnc2lfbmV4dCAoJmdzaSkpCi0JewotCSAgZ3Bo aSAqcGhpID0gZ3NpLnBoaSAoKTsKLQkgIGlmICh2aXJ0dWFsX29wZXJhbmRfcCAoZ2ltcGxlX3Bo aV9yZXN1bHQgKHBoaSkpKQotCSAgICBjb250aW51ZTsKLQkgIHRyZWUgYXJnID0gZ2ltcGxlX3Bo aV9hcmdfZGVmIChwaGksIGopOwotCSAgaWYgKFRSRUVfQ09ERSAoYXJnKSA9PSBTU0FfTkFNRSkK LQkgICAgbGl2ZS5zZXQgKGFyZywgbG9vcC0+bGF0Y2gpOwotCX0KLSAgICB9Ci0KLSAgZm9yIChp ID0gcnBvX2NudCAtIDE7IGkgPj0gMDsgLS1pKQotICAgIHsKLSAgICAgIGJhc2ljX2Jsb2NrIGJi ID0gQkFTSUNfQkxPQ0tfRk9SX0ZOIChmdW4sIHJwb1tpXSk7Ci0gICAgICBlZGdlIGU7Ci0gICAg ICBlZGdlX2l0ZXJhdG9yIGVpOwotCi0gICAgICAvKiBQcm9jZXNzIEJCIGFuZCB1cGRhdGUgdGhl IGxpdmUgaW5mb3JtYXRpb24gd2l0aCB1c2VzIGluCi0gICAgICAgICB0aGlzIGJsb2NrLiAgKi8K LSAgICAgIGZpbmRfYXNzZXJ0X2xvY2F0aW9uc19pbl9iYiAoYmIpOwotCi0gICAgICAvKiBNZXJn ZSBsaXZlbmVzcyBpbnRvIHRoZSBwcmVkZWNlc3NvciBibG9ja3MgYW5kIGZyZWUgaXQuICAqLwot ICAgICAgaWYgKCFsaXZlLmJsb2NrX2hhc19saXZlX25hbWVzX3AgKGJiKSkKLQl7Ci0JICBpbnQg cHJlZF9ycG8gPSBpOwotCSAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGJiLT5wcmVkcykKLQkgICAg ewotCSAgICAgIGludCBwcmVkID0gZS0+c3JjLT5pbmRleDsKLQkgICAgICBpZiAoKGUtPmZsYWdz ICYgRURHRV9ERlNfQkFDSykgfHwgcHJlZCA9PSBFTlRSWV9CTE9DSykKLQkJY29udGludWU7Ci0K LQkgICAgICBsaXZlLm1lcmdlIChlLT5zcmMsIGJiKTsKLQotCSAgICAgIGlmIChiYl9ycG9bcHJl ZF0gPCBwcmVkX3JwbykKLQkJcHJlZF9ycG8gPSBiYl9ycG9bcHJlZF07Ci0JICAgIH0KLQotCSAg LyogUmVjb3JkIHRoZSBSUE8gbnVtYmVyIG9mIHRoZSBsYXN0IHZpc2l0ZWQgYmxvY2sgdGhhdCBu ZWVkcwotCSAgICAgbGl2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgYmxvY2suICAqLwotCSAgbGFz dF9ycG9bcnBvW2ldXSA9IHByZWRfcnBvOwotCX0KLSAgICAgIGVsc2UKLQlsaXZlLmNsZWFyX2Js b2NrIChiYik7Ci0KLSAgICAgIC8qIFdlIGNhbiBmcmVlIGFsbCBzdWNjZXNzb3JzIGxpdmUgYml0 bWFwcyBpZiBhbGwgdGhlaXIKLSAgICAgICAgIHByZWRlY2Vzc29ycyBoYXZlIGJlZW4gdmlzaXRl ZCBhbHJlYWR5LiAgKi8KLSAgICAgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBiYi0+c3VjY3MpCi0J aWYgKGxhc3RfcnBvW2UtPmRlc3QtPmluZGV4XSA9PSBpKQotCSAgbGl2ZS5jbGVhcl9ibG9jayAo ZS0+ZGVzdCk7Ci0gICAgfQotCi0gIFhERUxFVEVWRUMgKHJwbyk7Ci0gIFhERUxFVEVWRUMgKGJi X3Jwbyk7Ci0gIFhERUxFVEVWRUMgKGxhc3RfcnBvKTsKLX0KLQotLyogQ3JlYXRlIGFuIEFTU0VS VF9FWFBSIGZvciBOQU1FIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGxvY2F0aW9uCi0gICBpbmRpY2F0 ZWQgYnkgTE9DLiAgUmV0dXJuIHRydWUgaWYgd2UgbWFkZSBhbnkgZWRnZSBpbnNlcnRpb25zLiAg Ki8KLQotYm9vbAotdnJwX2Fzc2VydHM6OnByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnNfZm9yICh0 cmVlIG5hbWUsIGFzc2VydF9sb2N1cyAqbG9jKQotewotICAvKiBCdWlsZCB0aGUgY29tcGFyaXNv biBleHByZXNzaW9uIE5BTUVfaSBDT01QX0NPREUgVkFMLiAgKi8KLSAgZ2ltcGxlICpzdG10Owot ICB0cmVlIGNvbmQ7Ci0gIGdpbXBsZSAqYXNzZXJ0X3N0bXQ7Ci0gIGVkZ2VfaXRlcmF0b3IgZWk7 Ci0gIGVkZ2UgZTsKLQotICAvKiBJZiB3ZSBoYXZlIFggPD0+IFggZG8gbm90IGluc2VydCBhbiBh c3NlcnQgZXhwciBmb3IgdGhhdC4gICovCi0gIGlmIChsb2MtPmV4cHIgPT0gbG9jLT52YWwpCi0g ICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbmQgPSBidWlsZDIgKGxvYy0+Y29tcF9jb2RlLCBib29s ZWFuX3R5cGVfbm9kZSwgbG9jLT5leHByLCBsb2MtPnZhbCk7Ci0gIGFzc2VydF9zdG10ID0gYnVp bGRfYXNzZXJ0X2V4cHJfZm9yIChjb25kLCBuYW1lKTsKLSAgaWYgKGxvYy0+ZSkKLSAgICB7Ci0g ICAgICAvKiBXZSBoYXZlIGJlZW4gYXNrZWQgdG8gaW5zZXJ0IHRoZSBhc3NlcnRpb24gb24gYW4g ZWRnZS4gIFRoaXMKLQkgaXMgdXNlZCBvbmx5IGJ5IENPTkRfRVhQUiBhbmQgU1dJVENIX0VYUFIg YXNzZXJ0aW9ucy4gICovCi0gICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChnaW1wbGVfY29kZSAo Z3NpX3N0bXQgKGxvYy0+c2kpKSA9PSBHSU1QTEVfQ09ORAotCQkJICAgfHwgKGdpbXBsZV9jb2Rl IChnc2lfc3RtdCAobG9jLT5zaSkpCi0JCQkgICAgICAgPT0gR0lNUExFX1NXSVRDSCkpOwotCi0g ICAgICBnc2lfaW5zZXJ0X29uX2VkZ2UgKGxvYy0+ZSwgYXNzZXJ0X3N0bXQpOwotICAgICAgcmV0 dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBzdG10IGl0ZXJhdG9yIHBvaW50cyBhdCB0 aGUgZW5kIHRoZW4gdGhpcyBpcyBhbiBpbnNlcnRpb24KLSAgICAgYXQgdGhlIGJlZ2lubmluZyBv ZiBhIGJsb2NrLiAgKi8KLSAgaWYgKGdzaV9lbmRfcCAobG9jLT5zaSkpCi0gICAgewotICAgICAg Z2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kgPSBnc2lfYWZ0ZXJfbGFiZWxzIChsb2MtPmJiKTsKLSAg ICAgIGdzaV9pbnNlcnRfYmVmb3JlICgmc2ksIGFzc2VydF9zdG10LCBHU0lfU0FNRV9TVE1UKTsK LSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLSAgLyogT3RoZXJ3aXNlLCB3ZSBjYW4gaW5z ZXJ0IHJpZ2h0IGFmdGVyIExPQy0+U0kgaWZmIHRoZQotICAgICBzdGF0ZW1lbnQgbXVzdCBub3Qg YmUgdGhlIGxhc3Qgc3RhdGVtZW50IGluIHRoZSBibG9jay4gICovCi0gIHN0bXQgPSBnc2lfc3Rt dCAobG9jLT5zaSk7Ci0gIGlmICghc3RtdF9lbmRzX2JiX3AgKHN0bXQpKQotICAgIHsKLSAgICAg IGdzaV9pbnNlcnRfYWZ0ZXIgKCZsb2MtPnNpLCBhc3NlcnRfc3RtdCwgR1NJX1NBTUVfU1RNVCk7 Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIFNUTVQgbXVzdCBiZSB0aGUg bGFzdCBzdGF0ZW1lbnQgaW4gQkIsIHdlIGNhbiBvbmx5IGluc2VydCBuZXcKLSAgICAgYXNzZXJ0 aW9ucyBvbiB0aGUgbm9uLWFibm9ybWFsIGVkZ2Ugb3V0IG9mIEJCLiAgTm90ZSB0aGF0IHNpbmNl Ci0gICAgIFNUTVQgaXMgbm90IGNvbnRyb2wgZmxvdywgdGhlcmUgbWF5IG9ubHkgYmUgb25lIG5v bi1hYm5vcm1hbC9laCBlZGdlCi0gICAgIG91dCBvZiBCQi4gICovCi0gIEZPUl9FQUNIX0VER0Ug KGUsIGVpLCBsb2MtPmJiLT5zdWNjcykKLSAgICBpZiAoIShlLT5mbGFncyAmIChFREdFX0FCTk9S TUFMfEVER0VfRUgpKSkKLSAgICAgIHsKLQlnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIGFzc2VydF9z dG10KTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICBnY2NfdW5yZWFjaGFibGUgKCk7Ci19 Ci0KLS8qIFFzb3J0IGhlbHBlciBmb3Igc29ydGluZyBhc3NlcnQgbG9jYXRpb25zLiAgSWYgc3Rh YmxlIGlzIHRydWUsIGRvbid0Ci0gICB1c2UgaXRlcmF0aXZlX2hhc2hfZXhwciBiZWNhdXNlIGl0 IGNhbiBiZSB1bnN0YWJsZSBmb3IgLWZjb21wYXJlLWRlYnVnLAotICAgb24gdGhlIG90aGVyIHNp ZGUgc29tZSBwb2ludGVycyBtaWdodCBiZSBOVUxMLiAgKi8KLQotdGVtcGxhdGUgPGJvb2wgc3Rh YmxlPgotaW50Ci12cnBfYXNzZXJ0czo6Y29tcGFyZV9hc3NlcnRfbG9jIChjb25zdCB2b2lkICpw YSwgY29uc3Qgdm9pZCAqcGIpCi17Ci0gIGFzc2VydF9sb2N1cyAqIGNvbnN0IGEgPSAqKGFzc2Vy dF9sb2N1cyAqIGNvbnN0ICopcGE7Ci0gIGFzc2VydF9sb2N1cyAqIGNvbnN0IGIgPSAqKGFzc2Vy dF9sb2N1cyAqIGNvbnN0ICopcGI7Ci0KLSAgLyogSWYgc3RhYmxlLCBzb21lIGFzc2VydHMgbWln aHQgYmUgb3B0aW1pemVkIGF3YXkgYWxyZWFkeSwgc29ydAotICAgICB0aGVtIGxhc3QuICAqLwot ICBpZiAoc3RhYmxlKQotICAgIHsKLSAgICAgIGlmIChhID09IE5VTEwpCi0JcmV0dXJuIGIgIT0g TlVMTDsKLSAgICAgIGVsc2UgaWYgKGIgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0g IGlmIChhLT5lID09IE5VTEwgJiYgYi0+ZSAhPSBOVUxMKQotICAgIHJldHVybiAxOwotICBlbHNl IGlmIChhLT5lICE9IE5VTEwgJiYgYi0+ZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAv KiBBZnRlciB0aGUgYWJvdmUgY2hlY2tzLCB3ZSBrbm93IHRoYXQgKGEtPmUgPT0gTlVMTCkgPT0g KGItPmUgPT0gTlVMTCksCi0gICAgIG5vIG5lZWQgdG8gdGVzdCBib3RoIGEtPmUgYW5kIGItPmUu ICAqLwotCi0gIC8qIFNvcnQgYWZ0ZXIgZGVzdGluYXRpb24gaW5kZXguICAqLwotICBpZiAoYS0+ ZSA9PSBOVUxMKQotICAgIDsKLSAgZWxzZSBpZiAoYS0+ZS0+ZGVzdC0+aW5kZXggPiBiLT5lLT5k ZXN0LT5pbmRleCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYS0+ZS0+ZGVzdC0+aW5kZXgg PCBiLT5lLT5kZXN0LT5pbmRleCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogU29ydCBhZnRlciBj b21wX2NvZGUuICAqLwotICBpZiAoYS0+Y29tcF9jb2RlID4gYi0+Y29tcF9jb2RlKQotICAgIHJl dHVybiAxOwotICBlbHNlIGlmIChhLT5jb21wX2NvZGUgPCBiLT5jb21wX2NvZGUpCi0gICAgcmV0 dXJuIC0xOwotCi0gIGhhc2h2YWxfdCBoYSwgaGI7Ci0KLSAgLyogRS5nLiBpZiBhLT52YWwgaXMg QUREUl9FWFBSIG9mIGEgVkFSX0RFQ0wsIGl0ZXJhdGl2ZV9oYXNoX2V4cHIKLSAgICAgdXNlcyBE RUNMX1VJRCBvZiB0aGUgVkFSX0RFQ0wsIHNvIHNvcnRpbmcgbWlnaHQgZGlmZmVyIGJldHdlZW4K LSAgICAgLWcgYW5kIC1nMC4gIFdoZW4gZG9pbmcgdGhlIHJlbW92YWwgb2YgcmVkdW5kYW50IGFz c2VydCBleHBycwotICAgICBhbmQgY29tbW9uaXphdGlvbiB0byBzdWNjZXNzb3JzLCB0aGlzIGRv ZXMgbm90IG1hdHRlciwgYnV0IGZvcgotICAgICB0aGUgZmluYWwgc29ydCBuZWVkcyB0byBiZSBz dGFibGUuICAqLwotICBpZiAoc3RhYmxlKQotICAgIHsKLSAgICAgIGhhID0gMDsKLSAgICAgIGhi ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYSA9IGl0ZXJhdGl2ZV9oYXNoX2V4 cHIgKGEtPmV4cHIsIGl0ZXJhdGl2ZV9oYXNoX2V4cHIgKGEtPnZhbCwgMCkpOwotICAgICAgaGIg PSBpdGVyYXRpdmVfaGFzaF9leHByIChiLT5leHByLCBpdGVyYXRpdmVfaGFzaF9leHByIChiLT52 YWwsIDApKTsKLSAgICB9Ci0KLSAgLyogQnJlYWsgdGhlIHRpZSB1c2luZyBoYXNoaW5nIGFuZCBz b3VyY2UvYmIgaW5kZXguICAqLwotICBpZiAoaGEgPT0gaGIpCi0gICAgcmV0dXJuIChhLT5lICE9 IE5VTEwKLQkgICAgPyBhLT5lLT5zcmMtPmluZGV4IC0gYi0+ZS0+c3JjLT5pbmRleAotCSAgICA6 IGEtPmJiLT5pbmRleCAtIGItPmJiLT5pbmRleCk7Ci0gIHJldHVybiBoYSA+IGhiID8gMSA6IC0x OwotfQotCi0vKiBQcm9jZXNzIGFsbCB0aGUgaW5zZXJ0aW9ucyByZWdpc3RlcmVkIGZvciBldmVy eSBuYW1lIE5faSByZWdpc3RlcmVkCi0gICBpbiBORUVEX0FTU0VSVF9GT1IuICBUaGUgbGlzdCBv ZiBhc3NlcnRpb25zIHRvIGJlIGluc2VydGVkIGFyZQotICAgZm91bmQgaW4gQVNTRVJUU19GT1Jb aV0uICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6cHJvY2Vzc19hc3NlcnRfaW5zZXJ0aW9ucyAo KQotewotICB1bnNpZ25lZCBpOwotICBiaXRtYXBfaXRlcmF0b3IgYmk7Ci0gIGJvb2wgdXBkYXRl X2VkZ2VzX3AgPSBmYWxzZTsKLSAgaW50IG51bV9hc3NlcnRzID0gMDsKLQotICBpZiAoZHVtcF9m aWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIGR1bXAgKGR1bXBfZmlsZSk7 Ci0KLSAgRVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChuZWVkX2Fzc2VydF9mb3IsIDAsIGksIGJp KQotICAgIHsKLSAgICAgIGFzc2VydF9sb2N1cyAqbG9jID0gYXNzZXJ0c19mb3JbaV07Ci0gICAg ICBnY2NfYXNzZXJ0IChsb2MpOwotCi0gICAgICBhdXRvX3ZlYzxhc3NlcnRfbG9jdXMgKiwgMTY+ IGFzc2VydHM7Ci0gICAgICBmb3IgKDsgbG9jOyBsb2MgPSBsb2MtPm5leHQpCi0JYXNzZXJ0cy5z YWZlX3B1c2ggKGxvYyk7Ci0gICAgICBhc3NlcnRzLnFzb3J0IChjb21wYXJlX2Fzc2VydF9sb2M8 ZmFsc2U+KTsKLQotICAgICAgLyogUHVzaCBkb3duIGNvbW1vbiBhc3NlcnRzIHRvIHN1Y2Nlc3Nv cnMgYW5kIHJlbW92ZSByZWR1bmRhbnQgb25lcy4gICovCi0gICAgICB1bnNpZ25lZCBlY250ID0g MDsKLSAgICAgIGFzc2VydF9sb2N1cyAqY29tbW9uID0gTlVMTDsKLSAgICAgIHVuc2lnbmVkIGNv bW1vbmogPSAwOwotICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGFzc2VydHMubGVuZ3Ro ICgpOyArK2opCi0JewotCSAgbG9jID0gYXNzZXJ0c1tqXTsKLQkgIGlmICghIGxvYy0+ZSkKLQkg ICAgY29tbW9uID0gTlVMTDsKLQkgIGVsc2UgaWYgKCEgY29tbW9uCi0JCSAgIHx8IGxvYy0+ZS0+ ZGVzdCAhPSBjb21tb24tPmUtPmRlc3QKLQkJICAgfHwgbG9jLT5jb21wX2NvZGUgIT0gY29tbW9u LT5jb21wX2NvZGUKLQkJICAgfHwgISBvcGVyYW5kX2VxdWFsX3AgKGxvYy0+dmFsLCBjb21tb24t PnZhbCwgMCkKLQkJICAgfHwgISBvcGVyYW5kX2VxdWFsX3AgKGxvYy0+ZXhwciwgY29tbW9uLT5l eHByLCAwKSkKLQkgICAgewotCSAgICAgIGNvbW1vbmogPSBqOwotCSAgICAgIGNvbW1vbiA9IGxv YzsKLQkgICAgICBlY250ID0gMTsKLQkgICAgfQotCSAgZWxzZSBpZiAobG9jLT5lID09IGFzc2Vy dHNbai0xXS0+ZSkKLQkgICAgewotCSAgICAgIC8qIFJlbW92ZSBkdXBsaWNhdGUgYXNzZXJ0cy4g ICovCi0JICAgICAgaWYgKGNvbW1vbmogPT0gaiAtIDEpCi0JCXsKLQkJICBjb21tb25qID0gajsK LQkJICBjb21tb24gPSBsb2M7Ci0JCX0KLQkgICAgICBmcmVlIChhc3NlcnRzW2otMV0pOwotCSAg ICAgIGFzc2VydHNbai0xXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAg IGVjbnQrKzsKLQkgICAgICBpZiAoRURHRV9DT1VOVCAoY29tbW9uLT5lLT5kZXN0LT5wcmVkcykg PT0gZWNudCkKLQkJewotCQkgIC8qIFdlIGhhdmUgdGhlIHNhbWUgYXNzZXJ0aW9uIG9uIGFsbCBp bmNvbWluZyBlZGdlcyBvZiBhIEJCLgotCQkgICAgIEluc2VydCBpdCBhdCB0aGUgYmVnaW5uaW5n IG9mIHRoYXQgYmxvY2suICAqLwotCQkgIGxvYy0+YmIgPSBsb2MtPmUtPmRlc3Q7Ci0JCSAgbG9j LT5lID0gTlVMTDsKLQkJICBsb2MtPnNpID0gZ3NpX25vbmUgKCk7Ci0JCSAgY29tbW9uID0gTlVM TDsKLQkJICAvKiBDbGVhciBhc3NlcnRzIGNvbW1vbmVkLiAgKi8KLQkJICBmb3IgKDsgY29tbW9u aiAhPSBqOyArK2NvbW1vbmopCi0JCSAgICBpZiAoYXNzZXJ0c1tjb21tb25qXSkKLQkJICAgICAg ewotCQkJZnJlZSAoYXNzZXJ0c1tjb21tb25qXSk7Ci0JCQlhc3NlcnRzW2NvbW1vbmpdID0gTlVM TDsKLQkJICAgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSBhc3NlcnRzIHZl Y3RvciBzb3J0aW5nIGFib3ZlIG1pZ2h0IGJlIHVuc3RhYmxlIGZvcgotCSAtZmNvbXBhcmUtZGVi dWcsIHNvcnQgYWdhaW4gdG8gZW5zdXJlIGEgc3RhYmxlIHNvcnQuICAqLwotICAgICAgYXNzZXJ0 cy5xc29ydCAoY29tcGFyZV9hc3NlcnRfbG9jPHRydWU+KTsKLSAgICAgIGZvciAodW5zaWduZWQg aiA9IDA7IGogPCBhc3NlcnRzLmxlbmd0aCAoKTsgKytqKQotCXsKLQkgIGxvYyA9IGFzc2VydHNb al07Ci0JICBpZiAoISBsb2MpCi0JICAgIGJyZWFrOwotCSAgdXBkYXRlX2VkZ2VzX3AgfD0gcHJv Y2Vzc19hc3NlcnRfaW5zZXJ0aW9uc19mb3IgKHNzYV9uYW1lIChpKSwgbG9jKTsKLQkgIG51bV9h c3NlcnRzKys7Ci0JICBmcmVlIChsb2MpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHVwZGF0ZV9lZGdl c19wKQotICAgIGdzaV9jb21taXRfZWRnZV9pbnNlcnRzICgpOwotCi0gIHN0YXRpc3RpY3NfY291 bnRlcl9ldmVudCAoZnVuLCAiTnVtYmVyIG9mIEFTU0VSVF9FWFBSIGV4cHJlc3Npb25zIGluc2Vy dGVkIiwKLQkJCSAgICBudW1fYXNzZXJ0cyk7Ci19Ci0KLS8qIFRyYXZlcnNlIHRoZSBmbG93Z3Jh cGggbG9va2luZyBmb3IgY29uZGl0aW9uYWwganVtcHMgdG8gaW5zZXJ0IHJhbmdlCi0gICBleHBy ZXNzaW9ucy4gIFRoZXNlIHJhbmdlIGV4cHJlc3Npb25zIGFyZSBtZWFudCB0byBwcm92aWRlIGlu Zm9ybWF0aW9uCi0gICB0byBvcHRpbWl6YXRpb25zIHRoYXQgbmVlZCB0byByZWFzb24gaW4gdGVy bXMgb2YgdmFsdWUgcmFuZ2VzLiAgVGhleQotICAgd2lsbCBub3QgYmUgZXhwYW5kZWQgaW50byBS VEwuICBGb3IgaW5zdGFuY2UsIGdpdmVuOgotCi0gICB4ID0gLi4uCi0gICB5ID0gLi4uCi0gICBp ZiAoeCA8IHkpCi0gICAgIHkgPSB4IC0gMjsKLSAgIGVsc2UKLSAgICAgeCA9IHkgKyAzOwotCi0g ICB0aGlzIHBhc3Mgd2lsbCB0cmFuc2Zvcm0gdGhlIGNvZGUgaW50bzoKLQotICAgeCA9IC4uLgot ICAgeSA9IC4uLgotICAgaWYgKHggPCB5KQotICAgIHsKLSAgICAgIHggPSBBU1NFUlRfRVhQUiA8 eCwgeCA8IHk+Ci0gICAgICB5ID0geCAtIDIKLSAgICB9Ci0gICBlbHNlCi0gICAgewotICAgICAg eSA9IEFTU0VSVF9FWFBSIDx5LCB4ID49IHk+Ci0gICAgICB4ID0geSArIDMKLSAgICB9Ci0KLSAg IFRoZSBpZGVhIGlzIHRoYXQgb25jZSBjb3B5IGFuZCBjb25zdGFudCBwcm9wYWdhdGlvbiBoYXZl IHJ1biwgb3RoZXIKLSAgIG9wdGltaXphdGlvbnMgd2lsbCBiZSBhYmxlIHRvIGRldGVybWluZSB3 aGF0IHJhbmdlcyBvZiB2YWx1ZXMgY2FuICd4JwotICAgdGFrZSBpbiBkaWZmZXJlbnQgcGF0aHMg b2YgdGhlIGNvZGUsIHNpbXBseSBieSBjaGVja2luZyB0aGUgcmVhY2hpbmcKLSAgIGRlZmluaXRp b24gb2YgJ3gnLiAgKi8KLQotdm9pZAotdnJwX2Fzc2VydHM6Omluc2VydF9yYW5nZV9hc3NlcnRp b25zICh2b2lkKQotewotICBuZWVkX2Fzc2VydF9mb3IgPSBCSVRNQVBfQUxMT0MgKE5VTEwpOwot ICBhc3NlcnRzX2ZvciA9IFhDTkVXVkVDIChhc3NlcnRfbG9jdXMgKiwgbnVtX3NzYV9uYW1lcyk7 Ci0KLSAgY2FsY3VsYXRlX2RvbWluYW5jZV9pbmZvIChDRElfRE9NSU5BVE9SUyk7Ci0KLSAgZmlu ZF9hc3NlcnRfbG9jYXRpb25zICgpOwotICBpZiAoIWJpdG1hcF9lbXB0eV9wIChuZWVkX2Fzc2Vy dF9mb3IpKQotICAgIHsKLSAgICAgIHByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnMgKCk7Ci0gICAg ICB1cGRhdGVfc3NhIChUT0RPX3VwZGF0ZV9zc2Ffbm9fcGhpKTsKLSAgICB9Ci0KLSAgaWYgKGR1 bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLSAgICB7Ci0gICAgICBmcHJp bnRmIChkdW1wX2ZpbGUsICJcblNTQSBmb3JtIGFmdGVyIGluc2VydGluZyBBU1NFUlRfRVhQUnNc biIpOwotICAgICAgZHVtcF9mdW5jdGlvbl90b19maWxlIChjdXJyZW50X2Z1bmN0aW9uX2RlY2ws IGR1bXBfZmlsZSwgZHVtcF9mbGFncyk7Ci0gICAgfQotCi0gIGZyZWUgKGFzc2VydHNfZm9yKTsK LSAgQklUTUFQX0ZSRUUgKG5lZWRfYXNzZXJ0X2Zvcik7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlm IGFsbCBpbW0gdXNlcyBvZiBWQVIgYXJlIGVpdGhlciBpbiBTVE1ULCBvcgotICAgZmVlZCAob3B0 aW9uYWxseSB0aHJvdWdoIGEgY2hhaW4gb2Ygc2luZ2xlIGltbSB1c2VzKSBHSU1QTEVfQ09ORAot ICAgaW4gYmFzaWMgYmxvY2sgQ09ORF9CQi4gICovCi0KLWJvb2wKLXZycF9hc3NlcnRzOjphbGxf aW1tX3VzZXNfaW5fc3RtdF9vcl9mZWVkX2NvbmQgKHRyZWUgdmFyLAotCQkJCQkJZ2ltcGxlICpz dG10LAotCQkJCQkJYmFzaWNfYmxvY2sgY29uZF9iYikKLXsKLSAgdXNlX29wZXJhbmRfcCB1c2Vf cCwgdXNlMl9wOwotICBpbW1fdXNlX2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgRk9SX0VBQ0hfSU1NX1VT RV9GQVNUICh1c2VfcCwgaXRlciwgdmFyKQotICAgIGlmIChVU0VfU1RNVCAodXNlX3ApICE9IHN0 bXQpCi0gICAgICB7Ci0JZ2ltcGxlICp1c2Vfc3RtdCA9IFVTRV9TVE1UICh1c2VfcCksICp1c2Vf c3RtdDI7Ci0JaWYgKGlzX2dpbXBsZV9kZWJ1ZyAodXNlX3N0bXQpKQotCSAgY29udGludWU7Ci0J d2hpbGUgKGlzX2dpbXBsZV9hc3NpZ24gKHVzZV9zdG10KQotCSAgICAgICAmJiBUUkVFX0NPREUg KGdpbXBsZV9hc3NpZ25fbGhzICh1c2Vfc3RtdCkpID09IFNTQV9OQU1FCi0JICAgICAgICYmIHNp bmdsZV9pbW1fdXNlIChnaW1wbGVfYXNzaWduX2xocyAodXNlX3N0bXQpLAotCQkJCSAgJnVzZTJf cCwgJnVzZV9zdG10MikpCi0JICB1c2Vfc3RtdCA9IHVzZV9zdG10MjsKLQlpZiAoZ2ltcGxlX2Nv ZGUgKHVzZV9zdG10KSAhPSBHSU1QTEVfQ09ORAotCSAgICB8fCBnaW1wbGVfYmIgKHVzZV9zdG10 KSAhPSBjb25kX2JiKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICByZXR1cm4gdHJ1ZTsK LX0KLQotLyogQ29udmVydCByYW5nZSBhc3NlcnRpb24gZXhwcmVzc2lvbnMgaW50byB0aGUgaW1w bGllZCBjb3BpZXMgYW5kCi0gICBjb3B5IHByb3BhZ2F0ZSBhd2F5IHRoZSBjb3BpZXMuICBEb2lu ZyB0aGUgdHJpdmlhbCBjb3B5IHByb3BhZ2F0aW9uCi0gICBoZXJlIGF2b2lkcyB0aGUgbmVlZCB0 byBydW4gdGhlIGZ1bGwgY29weSBwcm9wYWdhdGlvbiBwYXNzIGFmdGVyCi0gICBWUlAuCi0KLSAg IEZJWE1FLCB0aGlzIHdpbGwgZXZlbnR1YWxseSBsZWFkIHRvIGNvcHkgcHJvcGFnYXRpb24gcmVt b3ZpbmcgdGhlCi0gICBuYW1lcyB0aGF0IGhhZCB1c2VmdWwgcmFuZ2UgaW5mb3JtYXRpb24gYXR0 YWNoZWQgdG8gdGhlbS4gIEZvcgotICAgaW5zdGFuY2UsIGlmIHdlIGhhZCB0aGUgYXNzZXJ0aW9u IE5faSA9IEFTU0VSVF9FWFBSIDxOX2osIE5faiA+IDM+LAotICAgdGhlbiBOX2kgd2lsbCBoYXZl IHRoZSByYW5nZSBbMywgK0lORl0uCi0KLSAgIEhvd2V2ZXIsIGJ5IGNvbnZlcnRpbmcgdGhlIGFz c2VydGlvbiBpbnRvIHRoZSBpbXBsaWVkIGNvcHkKLSAgIG9wZXJhdGlvbiBOX2kgPSBOX2osIHdl IHdpbGwgdGhlbiBjb3B5LXByb3BhZ2F0ZSBOX2ogaW50byB0aGUgdXNlcwotICAgb2YgTl9pIGFu ZCBsb3NlIHRoZSByYW5nZSBpbmZvcm1hdGlvbi4KLQotICAgVGhlIHByb2JsZW0gd2l0aCBrZWVw aW5nIEFTU0VSVF9FWFBScyBhcm91bmQgaXMgdGhhdCBwYXNzZXMgYWZ0ZXIKLSAgIFZSUCBuZWVk IHRvIGhhbmRsZSB0aGVtIGFwcHJvcHJpYXRlbHkuCi0KLSAgIEFub3RoZXIgYXBwcm9hY2ggd291 bGQgYmUgdG8gbWFrZSB0aGUgcmFuZ2UgaW5mb3JtYXRpb24gYSBmaXJzdAotICAgY2xhc3MgcHJv cGVydHkgb2YgdGhlIFNTQV9OQU1FIHNvIHRoYXQgaXQgY2FuIGJlIHF1ZXJpZWQgZnJvbQotICAg YW55IHBhc3MuICBUaGlzIGlzIG1hZGUgc29tZXdoYXQgbW9yZSBjb21wbGV4IGJ5IHRoZSBuZWVk IGZvcgotICAgbXVsdGlwbGUgcmFuZ2VzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgU1NBX05B TUUuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6cmVtb3ZlX3JhbmdlX2Fzc2VydGlvbnMgKCkK LXsKLSAgYmFzaWNfYmxvY2sgYmI7Ci0gIGdpbXBsZV9zdG10X2l0ZXJhdG9yIHNpOwotICAvKiAx IGlmIGxvb2tpbmcgYXQgQVNTRVJUX0VYUFJzIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcg b2YKLSAgICAgYSBiYXNpYyBibG9jayBwcmVjZWVkZWQgYnkgR0lNUExFX0NPTkQgYnJhbmNoaW5n IHRvIGl0IGFuZAotICAgICBfX2J1aWx0aW5fdHJhcCwgLTEgaWYgbm90IHlldCBjaGVja2VkLCAw IG90aGVyd2lzZS4gICovCi0gIGludCBpc191bnJlYWNoYWJsZTsKLQotICAvKiBOb3RlIHRoYXQg dGhlIEJTSSBpdGVyYXRvciBidW1wIGhhcHBlbnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUKLSAgICAg bG9vcCBhbmQgbm8gYnVtcCBpcyBuZWNlc3NhcnkgaWYgd2UncmUgcmVtb3ZpbmcgdGhlIHN0YXRl bWVudAotICAgICByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IEJTSS4gICovCi0gIEZPUl9FQUNI X0JCX0ZOIChiYiwgZnVuKQotICAgIGZvciAoc2kgPSBnc2lfYWZ0ZXJfbGFiZWxzIChiYiksIGlz X3VucmVhY2hhYmxlID0gLTE7ICFnc2lfZW5kX3AgKHNpKTspCi0gICAgICB7Ci0JZ2ltcGxlICpz dG10ID0gZ3NpX3N0bXQgKHNpKTsKLQotCWlmIChpc19naW1wbGVfYXNzaWduIChzdG10KQotCSAg ICAmJiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSA9PSBBU1NFUlRfRVhQUikKLQkgIHsK LQkgICAgdHJlZSBsaHMgPSBnaW1wbGVfYXNzaWduX2xocyAoc3RtdCk7Ci0JICAgIHRyZWUgcmhz ID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKLQkgICAgdHJlZSB2YXI7Ci0KLQkgICAgdmFy ID0gQVNTRVJUX0VYUFJfVkFSIChyaHMpOwotCi0JICAgIGlmIChUUkVFX0NPREUgKHZhcikgPT0g U1NBX05BTUUKLQkJJiYgIVBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxocykpCi0JCSYmIFNT QV9OQU1FX1JBTkdFX0lORk8gKGxocykpCi0JICAgICAgewotCQlpZiAoaXNfdW5yZWFjaGFibGUg PT0gLTEpCi0JCSAgewotCQkgICAgaXNfdW5yZWFjaGFibGUgPSAwOwotCQkgICAgaWYgKHNpbmds ZV9wcmVkX3AgKGJiKQotCQkJJiYgYXNzZXJ0X3VucmVhY2hhYmxlX2ZhbGx0aHJ1X2VkZ2VfcAot CQkJCQkJICAgIChzaW5nbGVfcHJlZF9lZGdlIChiYikpKQotCQkgICAgICBpc191bnJlYWNoYWJs ZSA9IDE7Ci0JCSAgfQotCQkvKiBIYW5kbGUKLQkJICAgaWYgKHhfNyA+PSAxMCAmJiB4XzcgPCAy MCkKLQkJICAgICBfX2J1aWx0aW5fdW5yZWFjaGFibGUgKCk7Ci0JCSAgIHhfOCA9IEFTU0VSVF9F WFBSIDx4XzcsIC4uLj47Ci0JCSAgIGlmIHRoZSBvbmx5IHVzZXMgb2YgeF83IGFyZSBpbiB0aGUg QVNTRVJUX0VYUFIgYW5kCi0JCSAgIGluIHRoZSBjb25kaXRpb24uICBJbiB0aGF0IGNhc2UsIHdl IGNhbiBjb3B5IHRoZQotCQkgICByYW5nZSBpbmZvIGZyb20geF84IGNvbXB1dGVkIGluIHRoaXMg cGFzcyBhbHNvCi0JCSAgIGZvciB4XzcuICAqLwotCQlpZiAoaXNfdW5yZWFjaGFibGUKLQkJICAg ICYmIGFsbF9pbW1fdXNlc19pbl9zdG10X29yX2ZlZWRfY29uZCAodmFyLCBzdG10LAotCQkJCQkJ CSAgc2luZ2xlX3ByZWQgKGJiKSkpCi0JCSAgewotCQkgICAgaWYgKFNTQV9OQU1FX1JBTkdFX0lO Rk8gKHZhcikpCi0JCSAgICAgIHsKLQkJCS8qID8/IFRoaXMgaXMgYSBtaW5vciB3YXJ0IGV4cG9z aW5nIHRoZQotCQkJICAgaW50ZXJuYWxzIG9mIFNTQV9OQU1FX1JBTkdFX0lORk8gaW4gb3JkZXIK LQkJCSAgIHRvIG1haW50YWluIGV4aXN0aW5nIGJlaGF2aW9yLiAgVGhpcyBpcwotCQkJICAgYmVj YXVzZSBkdXBsaWNhdGVfc3NhX25hbWVfcmFuZ2VfaW5mbyBiZWxvdwotCQkJICAgbmVlZHMgYSBO VUxMIGRlc3RpbmF0aW9uIHJhbmdlLiAgVGhpcyBpcwotCQkJICAgYWxsIHNsYXRlZCBmb3IgcmVt b3ZhbC4uLiAgKi8KLQkJCWdnY19mcmVlIChTU0FfTkFNRV9SQU5HRV9JTkZPICh2YXIpKTsKLQkJ CVNTQV9OQU1FX1JBTkdFX0lORk8gKHZhcikgPSBOVUxMOwotCQkgICAgICB9Ci0JCSAgICBkdXBs aWNhdGVfc3NhX25hbWVfcmFuZ2VfaW5mbyAodmFyLCBsaHMpOwotCQkgICAgbWF5YmVfc2V0X25v bnplcm9fYml0cyAoc2luZ2xlX3ByZWRfZWRnZSAoYmIpLCB2YXIpOwotCQkgIH0KLQkgICAgICB9 Ci0KLQkgICAgLyogUHJvcGFnYXRlIHRoZSBSSFMgaW50byBldmVyeSB1c2Ugb2YgdGhlIExIUy4g IEZvciBTU0EgbmFtZXMKLQkgICAgICAgYWxzbyBwcm9wYWdhdGUgYWJub3JtYWxzIGFzIGl0IG1l cmVseSByZXN0b3JlcyB0aGUgb3JpZ2luYWwKLQkgICAgICAgSUwgaW4gdGhpcyBjYXNlIChhbiBy ZXBsYWNlX3VzZXNfYnkgd291bGQgYXNzZXJ0KS4gICovCi0JICAgIGlmIChUUkVFX0NPREUgKHZh cikgPT0gU1NBX05BTUUpCi0JICAgICAgewotCQlpbW1fdXNlX2l0ZXJhdG9yIGl0ZXI7Ci0JCXVz ZV9vcGVyYW5kX3AgdXNlX3A7Ci0JCWdpbXBsZSAqdXNlX3N0bXQ7Ci0JCUZPUl9FQUNIX0lNTV9V U0VfU1RNVCAodXNlX3N0bXQsIGl0ZXIsIGxocykKLQkJICBGT1JfRUFDSF9JTU1fVVNFX09OX1NU TVQgKHVzZV9wLCBpdGVyKQotCQkgICAgU0VUX1VTRSAodXNlX3AsIHZhcik7Ci0JICAgICAgfQot CSAgICBlbHNlCi0JICAgICAgcmVwbGFjZV91c2VzX2J5IChsaHMsIHZhcik7Ci0KLQkgICAgLyog QW5kIGZpbmFsbHksIHJlbW92ZSB0aGUgY29weSwgaXQgaXMgbm90IG5lZWRlZC4gICovCi0JICAg IGdzaV9yZW1vdmUgKCZzaSwgdHJ1ZSk7Ci0JICAgIHJlbGVhc2VfZGVmcyAoc3RtdCk7Ci0JICB9 Ci0JZWxzZQotCSAgewotCSAgICBpZiAoIWlzX2dpbXBsZV9kZWJ1ZyAoZ3NpX3N0bXQgKHNpKSkp Ci0JICAgICAgaXNfdW5yZWFjaGFibGUgPSAwOwotCSAgICBnc2lfbmV4dCAoJnNpKTsKLQkgIH0K LSAgICAgIH0KLX0KLQotY2xhc3MgdnJwX3Byb3AgOiBwdWJsaWMgc3NhX3Byb3BhZ2F0aW9uX2Vu Z2luZQotewotcHVibGljOgotICB2cnBfcHJvcCAodnJfdmFsdWVzICp2KQotICAgIDogc3NhX3By b3BhZ2F0aW9uX2VuZ2luZSAoKSwKLSAgICAgIG1fdnJfdmFsdWVzICh2KSB7IH0KLQotICB2b2lk IGluaXRpYWxpemUgKHN0cnVjdCBmdW5jdGlvbiAqKTsKLSAgdm9pZCBmaW5hbGl6ZSAoKTsKLQot cHJpdmF0ZToKLSAgZW51bSBzc2FfcHJvcF9yZXN1bHQgdmlzaXRfc3RtdCAoZ2ltcGxlICosIGVk Z2UgKiwgdHJlZSAqKSBmaW5hbCBvdmVycmlkZTsKLSAgZW51bSBzc2FfcHJvcF9yZXN1bHQgdmlz aXRfcGhpIChncGhpICopIGZpbmFsIG92ZXJyaWRlOwotCi0gIHN0cnVjdCBmdW5jdGlvbiAqZnVu OwotICB2cl92YWx1ZXMgKm1fdnJfdmFsdWVzOwotfTsKLQotLyogSW5pdGlhbGl6YXRpb24gcmVx dWlyZWQgYnkgc3NhX3Byb3BhZ2F0ZSBlbmdpbmUuICAqLwotCi12b2lkCi12cnBfcHJvcDo6aW5p dGlhbGl6ZSAoc3RydWN0IGZ1bmN0aW9uICpmbikKLXsKLSAgYmFzaWNfYmxvY2sgYmI7Ci0gIGZ1 biA9IGZuOwotCi0gIEZPUl9FQUNIX0JCX0ZOIChiYiwgZnVuKQotICAgIHsKLSAgICAgIGZvciAo Z3BoaV9pdGVyYXRvciBzaSA9IGdzaV9zdGFydF9waGlzIChiYik7ICFnc2lfZW5kX3AgKHNpKTsK LQkgICBnc2lfbmV4dCAoJnNpKSkKLQl7Ci0JICBncGhpICpwaGkgPSBzaS5waGkgKCk7Ci0JICBp ZiAoIXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAocGhpKSkKLQkgICAgewotCSAgICAgIHRyZWUg bGhzID0gUEhJX1JFU1VMVCAocGhpKTsKLQkgICAgICBtX3ZyX3ZhbHVlcy0+c2V0X2RlZl90b192 YXJ5aW5nIChsaHMpOwotCSAgICAgIHByb3Bfc2V0X3NpbXVsYXRlX2FnYWluIChwaGksIGZhbHNl KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcm9wX3NldF9zaW11bGF0ZV9hZ2FpbiAocGhpLCB0 cnVlKTsKLQl9Ci0KLSAgICAgIGZvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kgPSBnc2lfc3Rh cnRfYmIgKGJiKTsgIWdzaV9lbmRfcCAoc2kpOwotCSAgIGdzaV9uZXh0ICgmc2kpKQotICAgICAg ICB7Ci0JICBnaW1wbGUgKnN0bXQgPSBnc2lfc3RtdCAoc2kpOwotCi0gCSAgLyogSWYgdGhlIHN0 YXRlbWVudCBpcyBhIGNvbnRyb2wgaW5zbiwgdGhlbiB3ZSBkbyBub3QKLSAJICAgICB3YW50IHRv IGF2b2lkIHNpbXVsYXRpbmcgdGhlIHN0YXRlbWVudCBvbmNlLiAgRmFpbHVyZQotIAkgICAgIHRv IGRvIHNvIG1lYW5zIHRoYXQgdGhvc2UgZWRnZXMgd2lsbCBuZXZlciBnZXQgYWRkZWQuICAqLwot CSAgaWYgKHN0bXRfZW5kc19iYl9wIChzdG10KSkKLQkgICAgcHJvcF9zZXRfc2ltdWxhdGVfYWdh aW4gKHN0bXQsIHRydWUpOwotCSAgZWxzZSBpZiAoIXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAo c3RtdCkpCi0JICAgIHsKLQkgICAgICBtX3ZyX3ZhbHVlcy0+c2V0X2RlZnNfdG9fdmFyeWluZyAo c3RtdCk7Ci0JICAgICAgcHJvcF9zZXRfc2ltdWxhdGVfYWdhaW4gKHN0bXQsIGZhbHNlKTsKLQkg ICAgfQotCSAgZWxzZQotCSAgICBwcm9wX3NldF9zaW11bGF0ZV9hZ2FpbiAoc3RtdCwgdHJ1ZSk7 Ci0JfQotICAgIH0KLX0KLQotLyogRXZhbHVhdGUgc3RhdGVtZW50IFNUTVQuICBJZiB0aGUgc3Rh dGVtZW50IHByb2R1Y2VzIGEgdXNlZnVsIHJhbmdlLAotICAgcmV0dXJuIFNTQV9QUk9QX0lOVEVS RVNUSU5HIGFuZCByZWNvcmQgdGhlIFNTQSBuYW1lIHdpdGggdGhlCi0gICBpbnRlcmVzdGluZyBy YW5nZSBpbnRvICpPVVRQVVRfUC4KLQotICAgSWYgU1RNVCBpcyBhIGNvbmRpdGlvbmFsIGJyYW5j aCBhbmQgd2UgY2FuIGRldGVybWluZSBpdHMgdHJ1dGgKLSAgIHZhbHVlLCB0aGUgdGFrZW4gZWRn ZSBpcyByZWNvcmRlZCBpbiAqVEFLRU5fRURHRV9QLgotCi0gICBJZiBTVE1UIHByb2R1Y2VzIGEg dmFyeWluZyB2YWx1ZSwgcmV0dXJuIFNTQV9QUk9QX1ZBUllJTkcuICAqLwotCi1lbnVtIHNzYV9w cm9wX3Jlc3VsdAotdnJwX3Byb3A6OnZpc2l0X3N0bXQgKGdpbXBsZSAqc3RtdCwgZWRnZSAqdGFr ZW5fZWRnZV9wLCB0cmVlICpvdXRwdXRfcCkKLXsKLSAgdHJlZSBsaHMgPSBnaW1wbGVfZ2V0X2xo cyAoc3RtdCk7Ci0gIHZhbHVlX3JhbmdlX2VxdWl2IHZyOwotICBtX3ZyX3ZhbHVlcy0+ZXh0cmFj dF9yYW5nZV9mcm9tX3N0bXQgKHN0bXQsIHRha2VuX2VkZ2VfcCwgb3V0cHV0X3AsICZ2cik7Ci0K LSAgaWYgKCpvdXRwdXRfcCkKLSAgICB7Ci0gICAgICBpZiAobV92cl92YWx1ZXMtPnVwZGF0ZV92 YWx1ZV9yYW5nZSAoKm91dHB1dF9wLCAmdnIpKQotCXsKLQkgIGlmIChkdW1wX2ZpbGUgJiYgKGR1 bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChkdW1wX2Zp bGUsICJGb3VuZCBuZXcgcmFuZ2UgZm9yICIpOwotCSAgICAgIHByaW50X2dlbmVyaWNfZXhwciAo ZHVtcF9maWxlLCAqb3V0cHV0X3ApOwotCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIjogIik7 Ci0JICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVtcF9maWxlLCAmdnIpOwotCSAgICAgIGZwcmlu dGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0JICAgIH0KLQotCSAgaWYgKHZyLnZhcnlpbmdfcCAoKSkK LQkgICAgcmV0dXJuIFNTQV9QUk9QX1ZBUllJTkc7Ci0KLQkgIHJldHVybiBTU0FfUFJPUF9JTlRF UkVTVElORzsKLQl9Ci0gICAgICByZXR1cm4gU1NBX1BST1BfTk9UX0lOVEVSRVNUSU5HOwotICAg IH0KLQotICBpZiAoaXNfZ2ltcGxlX2NhbGwgKHN0bXQpICYmIGdpbXBsZV9jYWxsX2ludGVybmFs X3AgKHN0bXQpKQotICAgIHN3aXRjaCAoZ2ltcGxlX2NhbGxfaW50ZXJuYWxfZm4gKHN0bXQpKQot ICAgICAgewotICAgICAgY2FzZSBJRk5fQUREX09WRVJGTE9XOgotICAgICAgY2FzZSBJRk5fU1VC X09WRVJGTE9XOgotICAgICAgY2FzZSBJRk5fTVVMX09WRVJGTE9XOgotICAgICAgY2FzZSBJRk5f QVRPTUlDX0NPTVBBUkVfRVhDSEFOR0U6Ci0JLyogVGhlc2UgaW50ZXJuYWwgY2FsbHMgcmV0dXJu IF9Db21wbGV4IGludGVnZXIgdHlwZSwKLQkgICB3aGljaCBWUlAgZG9lcyBub3QgdHJhY2ssIGJ1 dCB0aGUgaW1tZWRpYXRlIHVzZXMKLQkgICB0aGVyZW9mIG1pZ2h0IGJlIGludGVyZXN0aW5nLiAg Ki8KLQlpZiAobGhzICYmIFRSRUVfQ09ERSAobGhzKSA9PSBTU0FfTkFNRSkKLQkgIHsKLQkgICAg aW1tX3VzZV9pdGVyYXRvciBpdGVyOwotCSAgICB1c2Vfb3BlcmFuZF9wIHVzZV9wOwotCSAgICBl bnVtIHNzYV9wcm9wX3Jlc3VsdCByZXMgPSBTU0FfUFJPUF9WQVJZSU5HOwotCi0JICAgIG1fdnJf dmFsdWVzLT5zZXRfZGVmX3RvX3ZhcnlpbmcgKGxocyk7Ci0KLQkgICAgRk9SX0VBQ0hfSU1NX1VT RV9GQVNUICh1c2VfcCwgaXRlciwgbGhzKQotCSAgICAgIHsKLQkJZ2ltcGxlICp1c2Vfc3RtdCA9 IFVTRV9TVE1UICh1c2VfcCk7Ci0JCWlmICghaXNfZ2ltcGxlX2Fzc2lnbiAodXNlX3N0bXQpKQot CQkgIGNvbnRpbnVlOwotCQllbnVtIHRyZWVfY29kZSByaHNfY29kZSA9IGdpbXBsZV9hc3NpZ25f cmhzX2NvZGUgKHVzZV9zdG10KTsKLQkJaWYgKHJoc19jb2RlICE9IFJFQUxQQVJUX0VYUFIgJiYg cmhzX2NvZGUgIT0gSU1BR1BBUlRfRVhQUikKLQkJICBjb250aW51ZTsKLQkJdHJlZSByaHMxID0g Z2ltcGxlX2Fzc2lnbl9yaHMxICh1c2Vfc3RtdCk7Ci0JCXRyZWUgdXNlX2xocyA9IGdpbXBsZV9h c3NpZ25fbGhzICh1c2Vfc3RtdCk7Ci0JCWlmIChUUkVFX0NPREUgKHJoczEpICE9IHJoc19jb2Rl Ci0JCSAgICB8fCBUUkVFX09QRVJBTkQgKHJoczEsIDApICE9IGxocwotCQkgICAgfHwgVFJFRV9D T0RFICh1c2VfbGhzKSAhPSBTU0FfTkFNRQotCQkgICAgfHwgIXN0bXRfaW50ZXJlc3RpbmdfZm9y X3ZycCAodXNlX3N0bXQpCi0JCSAgICB8fCAoIUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFICh1 c2VfbGhzKSkKLQkJCXx8ICFUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh1c2VfbGhzKSkKLQkJ CXx8ICFUWVBFX01BWF9WQUxVRSAoVFJFRV9UWVBFICh1c2VfbGhzKSkpKQotCQkgIGNvbnRpbnVl OwotCi0JCS8qIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSByYW5nZSBmb3IgYW55 IG9mIHRoZQotCQkgICBSRUFMUEFSVF9FWFBSL0lNQUdQQVJUX0VYUFIgaW1tZWRpYXRlIHVzZXMs IHJldHVybgotCQkgICBTU0FfUFJPUF9JTlRFUkVTVElORy4gIElmIHRoZXJlIGFyZSBhbnkgUkVB TFBBUlRfRVhQUgotCQkgICBvciBJTUFHUEFSVF9FWFBSIGltbWVkaWF0ZSB1c2VzLCBidXQgbm9u ZSBvZiB0aGVtIGhhdmUKLQkJICAgYSBjaGFuZ2UgaW4gdGhlaXIgdmFsdWUgcmFuZ2VzLCByZXR1 cm4KLQkJICAgU1NBX1BST1BfTk9UX0lOVEVSRVNUSU5HLiAgSWYgdGhlcmUgYXJlIG5vCi0JCSAg IHtSRUFMLElNQUd9UEFSVF9FWFBSIHVzZXMgYXQgYWxsLAotCQkgICByZXR1cm4gU1NBX1BST1Bf VkFSWUlORy4gICovCi0JCXZhbHVlX3JhbmdlX2VxdWl2IG5ld192cjsKLQkJbV92cl92YWx1ZXMt PmV4dHJhY3RfcmFuZ2VfYmFzaWMgKCZuZXdfdnIsIHVzZV9zdG10KTsKLQkJY29uc3QgdmFsdWVf cmFuZ2VfZXF1aXYgKm9sZF92cgotCQkgID0gbV92cl92YWx1ZXMtPmdldF92YWx1ZV9yYW5nZSAo dXNlX2xocyk7Ci0JCWlmICghb2xkX3ZyLT5lcXVhbF9wIChuZXdfdnIsIC8qaWdub3JlX2VxdWl2 cz0qL2ZhbHNlKSkKLQkJICByZXMgPSBTU0FfUFJPUF9JTlRFUkVTVElORzsKLQkJZWxzZQotCQkg IHJlcyA9IFNTQV9QUk9QX05PVF9JTlRFUkVTVElORzsKLQkJbmV3X3ZyLmVxdWl2X2NsZWFyICgp OwotCQlpZiAocmVzID09IFNTQV9QUk9QX0lOVEVSRVNUSU5HKQotCQkgIHsKLQkJICAgICpvdXRw dXRfcCA9IGxoczsKLQkJICAgIHJldHVybiByZXM7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBy ZXR1cm4gcmVzOwotCSAgfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAg IH0KLQotICAvKiBBbGwgb3RoZXIgc3RhdGVtZW50cyBwcm9kdWNlIG5vdGhpbmcgb2YgaW50ZXJl c3QgZm9yIFZSUCwgc28gbWFyawotICAgICB0aGVpciBvdXRwdXRzIHZhcnlpbmcgYW5kIHByZXZl bnQgZnVydGhlciBzaW11bGF0aW9uLiAgKi8KLSAgbV92cl92YWx1ZXMtPnNldF9kZWZzX3RvX3Zh cnlpbmcgKHN0bXQpOwotCi0gIHJldHVybiAoKnRha2VuX2VkZ2VfcCkgPyBTU0FfUFJPUF9JTlRF UkVTVElORyA6IFNTQV9QUk9QX1ZBUllJTkc7Ci19Ci0KLS8qIFZpc2l0IGFsbCBhcmd1bWVudHMg Zm9yIFBISSBub2RlIFBISSB0aGF0IGZsb3cgdGhyb3VnaCBleGVjdXRhYmxlCi0gICBlZGdlcy4g IElmIGEgdmFsaWQgdmFsdWUgcmFuZ2UgY2FuIGJlIGRlcml2ZWQgZnJvbSBhbGwgdGhlIGluY29t aW5nCi0gICB2YWx1ZSByYW5nZXMsIHNldCBhIG5ldyByYW5nZSBmb3IgdGhlIExIUyBvZiBQSEku ICAqLwotCi1lbnVtIHNzYV9wcm9wX3Jlc3VsdAotdnJwX3Byb3A6OnZpc2l0X3BoaSAoZ3BoaSAq cGhpKQotewotICB0cmVlIGxocyA9IFBISV9SRVNVTFQgKHBoaSk7Ci0gIHZhbHVlX3JhbmdlX2Vx dWl2IHZyX3Jlc3VsdDsKLSAgbV92cl92YWx1ZXMtPmV4dHJhY3RfcmFuZ2VfZnJvbV9waGlfbm9k ZSAocGhpLCAmdnJfcmVzdWx0KTsKLSAgaWYgKG1fdnJfdmFsdWVzLT51cGRhdGVfdmFsdWVfcmFu Z2UgKGxocywgJnZyX3Jlc3VsdCkpCi0gICAgewotICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVt cF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLQl7Ci0JICBmcHJpbnRmIChkdW1wX2ZpbGUsICJGb3Vu ZCBuZXcgcmFuZ2UgZm9yICIpOwotCSAgcHJpbnRfZ2VuZXJpY19leHByIChkdW1wX2ZpbGUsIGxo cyk7Ci0JICBmcHJpbnRmIChkdW1wX2ZpbGUsICI6ICIpOwotCSAgZHVtcF92YWx1ZV9yYW5nZSAo ZHVtcF9maWxlLCAmdnJfcmVzdWx0KTsKLQkgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0J fQotCi0gICAgICBpZiAodnJfcmVzdWx0LnZhcnlpbmdfcCAoKSkKLQlyZXR1cm4gU1NBX1BST1Bf VkFSWUlORzsKLQotICAgICAgcmV0dXJuIFNTQV9QUk9QX0lOVEVSRVNUSU5HOwotICAgIH0KLQot ICAvKiBOb3RoaW5nIGNoYW5nZWQsIGRvbid0IGFkZCBvdXRnb2luZyBlZGdlcy4gICovCi0gIHJl dHVybiBTU0FfUFJPUF9OT1RfSU5URVJFU1RJTkc7Ci19Ci0KLS8qIFRyYXZlcnNlIGFsbCB0aGUg YmxvY2tzIGZvbGRpbmcgY29uZGl0aW9uYWxzIHdpdGgga25vd24gcmFuZ2VzLiAgKi8KLQotdm9p ZAotdnJwX3Byb3A6OmZpbmFsaXplICgpCi17Ci0gIHNpemVfdCBpOwotCi0gIC8qIFdlIGhhdmUg Y29tcGxldGVkIHByb3BhZ2F0aW5nIHRocm91Z2ggdGhlIGxhdHRpY2UuICAqLwotICBtX3ZyX3Zh bHVlcy0+c2V0X2xhdHRpY2VfcHJvcGFnYXRpb25fY29tcGxldGUgKCk7Ci0KLSAgaWYgKGR1bXBf ZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcblZhbHVlIHJhbmdlcyBh ZnRlciBWUlA6XG5cbiIpOwotICAgICAgbV92cl92YWx1ZXMtPmR1bXAgKGR1bXBfZmlsZSk7Ci0g ICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwotICAgIH0KLQotICAvKiBTZXQgdmFsdWUg cmFuZ2UgdG8gbm9uIHBvaW50ZXIgU1NBX05BTUVzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51 bV9zc2FfbmFtZXM7IGkrKykKLSAgICB7Ci0gICAgICB0cmVlIG5hbWUgPSBzc2FfbmFtZSAoaSk7 Ci0gICAgICBpZiAoIW5hbWUpCi0JY29udGludWU7Ci0KLSAgICAgIGNvbnN0IHZhbHVlX3Jhbmdl X2VxdWl2ICp2ciA9IG1fdnJfdmFsdWVzLT5nZXRfdmFsdWVfcmFuZ2UgKG5hbWUpOwotICAgICAg aWYgKCFuYW1lIHx8IHZyLT52YXJ5aW5nX3AgKCkgfHwgIXZyLT5jb25zdGFudF9wICgpKQotCWNv bnRpbnVlOwotCi0gICAgICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAobmFtZSkpCi0J ICAmJiByYW5nZV9pbmNsdWRlc196ZXJvX3AgKHZyKSA9PSAwKQotCXNldF9wdHJfbm9ubnVsbCAo bmFtZSk7Ci0gICAgICBlbHNlIGlmICghUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAobmFtZSkp KQotCXNldF9yYW5nZV9pbmZvIChuYW1lLCAqdnIpOwotICAgIH0KLX0KKy8qIEdpdmVuIGEgU1dJ VENIX1NUTVQsIHJldHVybiB0aGUgY2FzZSBsYWJlbCB0aGF0IGVuY29tcGFzc2VzIHRoZQorICAg a25vd24gcG9zc2libGUgdmFsdWVzIGZvciB0aGUgc3dpdGNoIG9wZXJhbmQuICBSQU5HRV9PRl9P UCBpcyBhCisgICByYW5nZSBmb3IgdGhlIGtub3duIHZhbHVlcyBvZiB0aGUgc3dpdGNoIG9wZXJh bmQuICAqLwogCi1jbGFzcyB2cnBfZm9sZGVyIDogcHVibGljIHN1YnN0aXR1dGVfYW5kX2ZvbGRf ZW5naW5lCit0cmVlCitmaW5kX2Nhc2VfbGFiZWxfcmFuZ2UgKGdzd2l0Y2ggKnN3aXRjaF9zdG10 LCBjb25zdCBpcmFuZ2UgKnJhbmdlX29mX29wKQogewotIHB1YmxpYzoKLSAgdnJwX2ZvbGRlciAo dnJfdmFsdWVzICp2KQotICAgIDogc3Vic3RpdHV0ZV9hbmRfZm9sZF9lbmdpbmUgKC8qIEZvbGQg YWxsIHN0bXRzLiAgKi8gdHJ1ZSksCi0gICAgICBtX3ZyX3ZhbHVlcyAodiksIHNpbXBsaWZpZXIg KHYpCi0gICAgeyAgfQotICB2b2lkIHNpbXBsaWZ5X2Nhc3RlZF9jb25kcyAoZnVuY3Rpb24gKmZ1 bik7CisgIGlmIChyYW5nZV9vZl9vcC0+dW5kZWZpbmVkX3AgKCkKKyAgICAgIHx8IHJhbmdlX29m X29wLT52YXJ5aW5nX3AgKCkpCisgICAgcmV0dXJuIE5VTExfVFJFRTsKIAotcHJpdmF0ZToKLSAg dHJlZSB2YWx1ZV9vZl9leHByICh0cmVlIG5hbWUsIGdpbXBsZSAqc3RtdCkgb3ZlcnJpZGUKKyAg c2l6ZV90IGksIGo7CisgIHRyZWUgb3AgPSBnaW1wbGVfc3dpdGNoX2luZGV4IChzd2l0Y2hfc3Rt dCk7CisgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAob3ApOworICB0cmVlIHRtaW4gPSB3aWRlX2lu dF90b190cmVlICh0eXBlLCByYW5nZV9vZl9vcC0+bG93ZXJfYm91bmQgKCkpOworICB0cmVlIHRt YXggPSB3aWRlX2ludF90b190cmVlICh0eXBlLCByYW5nZV9vZl9vcC0+dXBwZXJfYm91bmQgKCkp OworICBmaW5kX2Nhc2VfbGFiZWxfcmFuZ2UgKHN3aXRjaF9zdG10LCB0bWluLCB0bWF4LCAmaSwg JmopOworICBpZiAoaSA9PSBqKQogICAgIHsKLSAgICAgIHJldHVybiBtX3ZyX3ZhbHVlcy0+dmFs dWVfb2ZfZXhwciAobmFtZSwgc3RtdCk7CisgICAgICAvKiBMb29rIGZvciBleGFjdGx5IG9uZSBs YWJlbCB0aGF0IGVuY29tcGFzc2VzIHRoZSByYW5nZSBvZgorCSB0aGUgb3BlcmFuZC4gICovCisg ICAgICB0cmVlIGxhYmVsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIGkpOwor ICAgICAgdHJlZSBjYXNlX2hpZ2gKKwk9IENBU0VfSElHSCAobGFiZWwpID8gQ0FTRV9ISUdIIChs YWJlbCkgOiBDQVNFX0xPVyAobGFiZWwpOworICAgICAgaW50X3JhbmdlX21heCBsYWJlbF9yYW5n ZSAoQ0FTRV9MT1cgKGxhYmVsKSwgY2FzZV9oaWdoKTsKKyAgICAgIGlmICghdHlwZXNfY29tcGF0 aWJsZV9wIChsYWJlbF9yYW5nZS50eXBlICgpLCByYW5nZV9vZl9vcC0+dHlwZSAoKSkpCisJcmFu Z2VfY2FzdCAobGFiZWxfcmFuZ2UsIHJhbmdlX29mX29wLT50eXBlICgpKTsKKyAgICAgIGxhYmVs X3JhbmdlLmludGVyc2VjdCAoKnJhbmdlX29mX29wKTsKKyAgICAgIGlmIChsYWJlbF9yYW5nZSA9 PSAqcmFuZ2Vfb2Zfb3ApCisJcmV0dXJuIGxhYmVsOwogICAgIH0KLSAgYm9vbCBmb2xkX3N0bXQg KGdpbXBsZV9zdG10X2l0ZXJhdG9yICopIGZpbmFsIG92ZXJyaWRlOwotICBib29sIGZvbGRfcHJl ZGljYXRlX2luIChnaW1wbGVfc3RtdF9pdGVyYXRvciAqKTsKLQotICB2cl92YWx1ZXMgKm1fdnJf dmFsdWVzOwotICBzaW1wbGlmeV91c2luZ19yYW5nZXMgc2ltcGxpZmllcjsKLX07Ci0KLS8qIElm IHRoZSBzdGF0ZW1lbnQgcG9pbnRlZCBieSBTSSBoYXMgYSBwcmVkaWNhdGUgd2hvc2UgdmFsdWUg Y2FuIGJlCi0gICBjb21wdXRlZCB1c2luZyB0aGUgdmFsdWUgcmFuZ2UgaW5mb3JtYXRpb24gY29t cHV0ZWQgYnkgVlJQLCBjb21wdXRlCi0gICBpdHMgdmFsdWUgYW5kIHJldHVybiB0cnVlLiAgT3Ro ZXJ3aXNlLCByZXR1cm4gZmFsc2UuICAqLwotCi1ib29sCi12cnBfZm9sZGVyOjpmb2xkX3ByZWRp Y2F0ZV9pbiAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKnNpKQotewotICBib29sIGFzc2lnbm1lbnRf cCA9IGZhbHNlOwotICB0cmVlIHZhbDsKLSAgZ2ltcGxlICpzdG10ID0gZ3NpX3N0bXQgKCpzaSk7 Ci0KLSAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0bXQpCi0gICAgICAmJiBUUkVFX0NPREVfQ0xB U1MgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpKSA9PSB0Y2NfY29tcGFyaXNvbikKKyAg ZWxzZSBpZiAoaSA+IGopCiAgICAgewotICAgICAgYXNzaWdubWVudF9wID0gdHJ1ZTsKLSAgICAg IHZhbCA9IHNpbXBsaWZpZXIudnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsIChnaW1wbGVfYXNzaWdu X3Joc19jb2RlIChzdG10KSwKLQkJCQkJCSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpLAotCQkJ CQkJIGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCksCi0JCQkJCQkgc3RtdCk7CisgICAgICAvKiBJ ZiB0aGVyZSBhcmUgbm8gbGFiZWxzIGF0IGFsbCwgdGFrZSB0aGUgZGVmYXVsdC4gICovCisgICAg ICByZXR1cm4gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwogICAgIH0KLSAg ZWxzZSBpZiAoZ2NvbmQgKmNvbmRfc3RtdCA9IGR5bl9jYXN0IDxnY29uZCAqPiAoc3RtdCkpCi0g ICAgdmFsID0gc2ltcGxpZmllci52cnBfZXZhbHVhdGVfY29uZGl0aW9uYWwgKGdpbXBsZV9jb25k X2NvZGUgKGNvbmRfc3RtdCksCi0JCQkJCSAgICAgICBnaW1wbGVfY29uZF9saHMgKGNvbmRfc3Rt dCksCi0JCQkJCSAgICAgICBnaW1wbGVfY29uZF9yaHMgKGNvbmRfc3RtdCksCi0JCQkJCSAgICAg ICBzdG10KTsKICAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFsKQogICAgIHsK LSAgICAgIGlmIChhc3NpZ25tZW50X3ApCi0JdmFsID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUg KGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KSksIHZhbCk7Ci0KLSAgICAgIGlmIChkdW1wX2ZpbGUp Ci0JewotCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiRm9sZGluZyBwcmVkaWNhdGUgIik7Ci0JICBw cmludF9naW1wbGVfZXhwciAoZHVtcF9maWxlLCBzdG10LCAwKTsKLQkgIGZwcmludGYgKGR1bXBf ZmlsZSwgIiB0byAiKTsKLQkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCB2YWwpOwot CSAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChpc19naW1wbGVf YXNzaWduIChzdG10KSkKLQlnaW1wbGVfYXNzaWduX3NldF9yaHNfZnJvbV90cmVlIChzaSwgdmFs KTsKLSAgICAgIGVsc2UKLQl7Ci0JICBnY2NfYXNzZXJ0IChnaW1wbGVfY29kZSAoc3RtdCkgPT0g R0lNUExFX0NPTkQpOwotCSAgZ2NvbmQgKmNvbmRfc3RtdCA9IGFzX2EgPGdjb25kICo+IChzdG10 KTsKLQkgIGlmIChpbnRlZ2VyX3plcm9wICh2YWwpKQotCSAgICBnaW1wbGVfY29uZF9tYWtlX2Zh bHNlIChjb25kX3N0bXQpOwotCSAgZWxzZSBpZiAoaW50ZWdlcl9vbmVwICh2YWwpKQotCSAgICBn aW1wbGVfY29uZF9tYWtlX3RydWUgKGNvbmRfc3RtdCk7Ci0JICBlbHNlCi0JICAgIGdjY191bnJl YWNoYWJsZSAoKTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOworICAgICAgLyogT3RoZXJ3aXNl LCB0aGVyZSBhcmUgdmFyaW91cyBsYWJlbHMgdGhhdCBjYW4gZW5jb21wYXNzCisJIHRoZSByYW5n ZSBvZiBvcGVyYW5kLiAgSW4gd2hpY2ggY2FzZSwgc2VlIGlmIHRoZSByYW5nZSBvZgorCSB0aGUg b3BlcmFuZCBpcyBlbnRpcmVseSAqb3V0c2lkZSogdGhlIGJvdW5kcyBvZiBhbGwgdGhlCisJIChu b24tZGVmYXVsdCkgY2FzZSBsYWJlbHMuICBJZiBzbywgdGFrZSB0aGUgZGVmYXVsdC4gICovCisg ICAgICB1bnNpZ25lZCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzd2l0Y2hfc3RtdCk7 CisgICAgICB0cmVlIG1pbl9sYWJlbCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN3aXRjaF9zdG10 LCAxKTsKKyAgICAgIHRyZWUgbWF4X2xhYmVsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNo X3N0bXQsIG4gLSAxKTsKKyAgICAgIHRyZWUgY2FzZV9oaWdoID0gQ0FTRV9ISUdIIChtYXhfbGFi ZWwpOworICAgICAgaWYgKCFjYXNlX2hpZ2gpCisJY2FzZV9oaWdoID0gQ0FTRV9MT1cgKG1heF9s YWJlbCk7CisgICAgICBpbnRfcmFuZ2VfbWF4IGxhYmVsX3JhbmdlIChDQVNFX0xPVyAobWluX2xh YmVsKSwgY2FzZV9oaWdoKTsKKyAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9wIChsYWJlbF9y YW5nZS50eXBlICgpLCByYW5nZV9vZl9vcC0+dHlwZSAoKSkpCisJcmFuZ2VfY2FzdCAobGFiZWxf cmFuZ2UsIHJhbmdlX29mX29wLT50eXBlICgpKTsKKyAgICAgIGxhYmVsX3JhbmdlLmludGVyc2Vj dCAoKnJhbmdlX29mX29wKTsKKyAgICAgIGlmIChsYWJlbF9yYW5nZS51bmRlZmluZWRfcCAoKSkK KwlyZXR1cm4gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwogICAgIH0KLQot ICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENhbGxiYWNrIGZvciBzdWJzdGl0dXRlX2FuZF9mb2xk IGZvbGRpbmcgdGhlIHN0bXQgYXQgKlNJLiAgKi8KLQotYm9vbAotdnJwX2ZvbGRlcjo6Zm9sZF9z dG10IChnaW1wbGVfc3RtdF9pdGVyYXRvciAqc2kpCi17Ci0gIGlmIChmb2xkX3ByZWRpY2F0ZV9p biAoc2kpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBzaW1wbGlmaWVyLnNpbXBsaWZ5 IChzaSk7CisgIHJldHVybiBOVUxMX1RSRUU7CiB9CiAKLS8qIEEgY29tcGFyaXNvbiBvZiBhbiBT U0FfTkFNRSBhZ2FpbnN0IGEgY29uc3RhbnQgd2hlcmUgdGhlIFNTQV9OQU1FCi0gICB3YXMgc2V0 IGJ5IGEgdHlwZSBjb252ZXJzaW9uIGNhbiBvZnRlbiBiZSByZXdyaXR0ZW4gdG8gdXNlIHRoZSBS SFMKLSAgIG9mIHRoZSB0eXBlIGNvbnZlcnNpb24uICBEbyB0aGlzIG9wdGltaXphdGlvbiBmb3Ig YWxsIGNvbmRpdGlvbmFscwotICAgaW4gRlVOLiAgKi8KLQotdm9pZAotdnJwX2ZvbGRlcjo6c2lt cGxpZnlfY2FzdGVkX2NvbmRzIChmdW5jdGlvbiAqZnVuKQorc3RydWN0IGNhc2VfaW5mbwogewor ICB0cmVlIGV4cHI7CiAgIGJhc2ljX2Jsb2NrIGJiOwotICBGT1JfRUFDSF9CQl9GTiAoYmIsIGZ1 bikKLSAgICB7Ci0gICAgICBnaW1wbGUgKmxhc3QgPSBsYXN0X3N0bXQgKGJiKTsKLSAgICAgIGlm IChsYXN0ICYmIGdpbXBsZV9jb2RlIChsYXN0KSA9PSBHSU1QTEVfQ09ORCkKLQl7Ci0JICBpZiAo c2ltcGxpZmllci5zaW1wbGlmeV9jYXN0ZWRfY29uZCAoYXNfYSA8Z2NvbmQgKj4gKGxhc3QpKSkK LQkgICAgewotCSAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCi0JCXsKLQkJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJGb2xkZWQgaW50bzogIik7Ci0JCSAg cHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmlsZSwgbGFzdCwgMCwgVERGX1NMSU0pOwotCQkgIGZw cmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8q IE1haW4gZW50cnkgcG9pbnQgdG8gVlJQIChWYWx1ZSBSYW5nZSBQcm9wYWdhdGlvbikuICBUaGlz IHBhc3MgaXMKLSAgIGxvb3NlbHkgYmFzZWQgb24gSi4gUi4gQy4gUGF0dGVyc29uLCBgYEFjY3Vy YXRlIFN0YXRpYyBCcmFuY2gKLSAgIFByZWRpY3Rpb24gYnkgVmFsdWUgUmFuZ2UgUHJvcGFnYXRp b24sJycgaW4gU0lHUExBTiBDb25mZXJlbmNlIG9uCi0gICBQcm9ncmFtbWluZyBMYW5ndWFnZSBE ZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uLCBwcC4gNjctNzgsIDE5OTUuCi0gICBBbHNvIGF2YWls YWJsZSBhdCBodHRwOi8vY2l0ZXNlZXIuaXN0LnBzdS5lZHUvcGF0dGVyc29uOTVhY2N1cmF0ZS5o dG1sCi0KLSAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYW4gU1NBLUNDUCBwYXNzIG1vZGlmaWVkIHRv IGRlYWwgd2l0aCByYW5nZXMKLSAgIGluc3RlYWQgb2YgY29uc3RhbnRzLgotCi0gICBXaGlsZSBw cm9wYWdhdGluZyByYW5nZXMsIHdlIG1heSBmaW5kIHRoYXQgdHdvIG9yIG1vcmUgU1NBIG5hbWUK LSAgIGhhdmUgZXF1aXZhbGVudCwgdGhvdWdoIGRpc3RpbmN0IHJhbmdlcy4gIEZvciBpbnN0YW5j ZSwKLQotICAgICAxCXhfOSA9IHBfMy0+YTsKLSAgICAgMglwXzQgPSBBU1NFUlRfRVhQUiA8cF8z LCBwXzMgIT0gMD4KLSAgICAgMwlpZiAocF80ID09IHFfMikKLSAgICAgNAkgIHBfNSA9IEFTU0VS VF9FWFBSIDxwXzQsIHBfNCA9PSBxXzI+OwotICAgICA1CWVuZGlmCi0gICAgIDYJaWYgKHFfMikK LQotICAgSW4gdGhlIGNvZGUgYWJvdmUsIHBvaW50ZXIgcF81IGhhcyByYW5nZSBbcV8yLCBxXzJd LCBidXQgZnJvbSB0aGUKLSAgIGNvZGUgd2UgY2FuIGFsc28gZGV0ZXJtaW5lIHRoYXQgcF81IGNh bm5vdCBiZSBOVUxMIGFuZCwgaWYgcV8yIGhhZAotICAgYSBub24tdmFyeWluZyByYW5nZSwgcF81 J3MgcmFuZ2Ugc2hvdWxkIGFsc28gYmUgY29tcGF0aWJsZSB3aXRoIGl0LgotCi0gICBUaGVzZSBl cXVpdmFsZW5jZXMgYXJlIGNyZWF0ZWQgYnkgdHdvIGV4cHJlc3Npb25zOiBBU1NFUlRfRVhQUiBh bmQKLSAgIGNvcHkgb3BlcmF0aW9ucy4gIFNpbmNlIHBfNSBpcyBhbiBhc3NlcnRpb24gb24gcF80 LCBhbmQgcF80IHdhcyB0aGUKLSAgIHJlc3VsdCBvZiBhbm90aGVyIGFzc2VydGlvbiwgdGhlbiB3 ZSBjYW4gdXNlIHRoZSBmYWN0IHRoYXQgcF81IGFuZAotICAgcF80IGFyZSBlcXVpdmFsZW50IHdo ZW4gZXZhbHVhdGluZyBwXzUncyByYW5nZS4KLQotICAgVG9nZXRoZXIgd2l0aCB2YWx1ZSByYW5n ZXMsIHdlIGFsc28gcHJvcGFnYXRlIHRoZXNlIGVxdWl2YWxlbmNlcwotICAgYmV0d2VlbiBuYW1l cyBzbyB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBpbmZvcm1hdGlvbiBmcm9tCi0gICBt dWx0aXBsZSByYW5nZXMgd2hlbiBkb2luZyBmaW5hbCByZXBsYWNlbWVudC4gIE5vdGUgdGhhdCB0 aGlzCi0gICBlcXVpdmFsZW5jeSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlIGJ1dCBub3Qgc3ltbWV0 cmljLgotCi0gICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgcF81IGlzIGVxdWl2YWxlbnQgdG8gcF80 LCBxXzIgYW5kIHBfMywgYnV0IHdlCi0gICBjYW5ub3QgYXNzZXJ0IHRoYXQgcV8yIGlzIGVxdWl2 YWxlbnQgdG8gcF81IGJlY2F1c2UgcV8yIG1heSBiZSB1c2VkCi0gICBpbiBjb250ZXh0cyB3aGVy ZSB0aGF0IGFzc2VydGlvbiBkb2VzIG5vdCBob2xkIChlLmcuLCBpbiBsaW5lIDYpLgotCi0gICBU T0RPLCB0aGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBwYXNzIGFuZCBQYXR0ZXJzb24n cyBpcyB0aGF0Ci0gICB3ZSBkbyBub3QgcHJvcGFnYXRlIGVkZ2UgcHJvYmFiaWxpdGllcy4gIFdl IG9ubHkgY29tcHV0ZSB3aGV0aGVyCi0gICBlZGdlcyBjYW4gYmUgdGFrZW4gb3Igbm90LiAgVGhh dCBpcywgaW5zdGVhZCBvZiBoYXZpbmcgYSBzcGVjdHJ1bQotICAgb2YganVtcCBwcm9iYWJpbGl0 aWVzIGJldHdlZW4gMCBhbmQgMSwgd2Ugb25seSBkZWFsIHdpdGggMCwgMSBhbmQKLSAgIERPTidU IEtOT1cuICBJbiB0aGUgZnV0dXJlLCBpdCBtYXkgYmUgd29ydGh3aGlsZSB0byBwcm9wYWdhdGUK LSAgIHByb2JhYmlsaXRpZXMgdG8gYWlkIGJyYW5jaCBwcmVkaWN0aW9uLiAgKi8KLQotc3RhdGlj IHVuc2lnbmVkIGludAotZXhlY3V0ZV92cnAgKHN0cnVjdCBmdW5jdGlvbiAqZnVuLCBib29sIHdh cm5fYXJyYXlfYm91bmRzX3ApCi17Ci0gIGxvb3Bfb3B0aW1pemVyX2luaXQgKExPT1BTX05PUk1B TCB8IExPT1BTX0hBVkVfUkVDT1JERURfRVhJVFMpOwotICByZXdyaXRlX2ludG9fbG9vcF9jbG9z ZWRfc3NhIChOVUxMLCBUT0RPX3VwZGF0ZV9zc2EpOwotICBzY2V2X2luaXRpYWxpemUgKCk7Ci0K LSAgLyogPz8/ICBUaGlzIGVuZHMgdXAgdXNpbmcgc3RhbGUgRURHRV9ERlNfQkFDSyBmb3IgbGl2 ZW5lc3MgY29tcHV0YXRpb24uCi0gICAgIEluc2VydGluZyBhc3NlcnRpb25zIG1heSBzcGxpdCBl ZGdlcyB3aGljaCB3aWxsIGludmFsaWRhdGUKLSAgICAgRURHRV9ERlNfQkFDSy4gICovCi0gIHZy cF9hc3NlcnRzIGFzc2VydF9lbmdpbmUgKGZ1bik7Ci0gIGFzc2VydF9lbmdpbmUuaW5zZXJ0X3Jh bmdlX2Fzc2VydGlvbnMgKCk7Ci0KLSAgLyogRm9yIHZpc2l0aW5nIFBISSBub2RlcyB3ZSBuZWVk IEVER0VfREZTX0JBQ0sgY29tcHV0ZWQuICAqLwotICBtYXJrX2Rmc19iYWNrX2VkZ2VzICgpOwot Ci0gIHZyX3ZhbHVlcyB2cnBfdnJfdmFsdWVzOwotCi0gIGNsYXNzIHZycF9wcm9wIHZycF9wcm9w ICgmdnJwX3ZyX3ZhbHVlcyk7Ci0gIHZycF9wcm9wLmluaXRpYWxpemUgKGZ1bik7Ci0gIHZycF9w cm9wLnNzYV9wcm9wYWdhdGUgKCk7Ci0KLSAgLyogSW5zdGFudGlhdGUgdGhlIGZvbGRlciBoZXJl LCBzbyB0aGF0IGVkZ2UgY2xlYW51cHMgaGFwcGVuIGF0IHRoZQotICAgICBlbmQgb2YgdGhpcyBm dW5jdGlvbi4gICovCi0gIHZycF9mb2xkZXIgZm9sZGVyICgmdnJwX3ZyX3ZhbHVlcyk7Ci0gIHZy cF9wcm9wLmZpbmFsaXplICgpOwotCi0gIC8qIElmIHdlJ3JlIGNoZWNraW5nIGFycmF5IHJlZnMs IHdlIHdhbnQgdG8gbWVyZ2UgaW5mb3JtYXRpb24gb24KLSAgICAgdGhlIGV4ZWN1dGFiaWxpdHkg b2YgZWFjaCBlZGdlIGJldHdlZW4gdnJwX2ZvbGRlciBhbmQgdGhlCi0gICAgIGNoZWNrX2FycmF5 X2JvdW5kc19kb21fd2Fsa2VyOiBlYWNoIGNhbiBjbGVhciB0aGUKLSAgICAgRURHRV9FWEVDVVRB QkxFIGZsYWcgb24gZWRnZXMsIGluIGRpZmZlcmVudCB3YXlzLgotCi0gICAgIEhlbmNlLCBpZiB3 ZSdyZSBnb2luZyB0byBjYWxsIGNoZWNrX2FsbF9hcnJheV9yZWZzLCBzZXQKLSAgICAgdGhlIGZs YWcgb24gZXZlcnkgZWRnZSBub3csIHJhdGhlciB0aGFuIGluCi0gICAgIGNoZWNrX2FycmF5X2Jv dW5kc19kb21fd2Fsa2VyJ3MgY3RvcjsgdnJwX2ZvbGRlciBtYXkgY2xlYXIKLSAgICAgaXQgZnJv bSBzb21lIGVkZ2VzLiAgKi8KLSAgaWYgKHdhcm5fYXJyYXlfYm91bmRzICYmIHdhcm5fYXJyYXlf Ym91bmRzX3ApCi0gICAgc2V0X2FsbF9lZGdlc19hc19leGVjdXRhYmxlIChmdW4pOwotCi0gIGZv bGRlci5zdWJzdGl0dXRlX2FuZF9mb2xkICgpOwotCi0gIGlmICh3YXJuX2FycmF5X2JvdW5kcyAm JiB3YXJuX2FycmF5X2JvdW5kc19wKQotICAgIHsKLSAgICAgIGFycmF5X2JvdW5kc19jaGVja2Vy IGFycmF5X2NoZWNrZXIgKGZ1biwgJnZycF92cl92YWx1ZXMpOwotICAgICAgYXJyYXlfY2hlY2tl ci5jaGVjayAoKTsKLSAgICB9Ci0KLSAgZm9sZGVyLnNpbXBsaWZ5X2Nhc3RlZF9jb25kcyAoZnVu KTsKLQotICBmcmVlX251bWJlcnNfb2ZfaXRlcmF0aW9uc19lc3RpbWF0ZXMgKGZ1bik7Ci0KLSAg YXNzZXJ0X2VuZ2luZS5yZW1vdmVfcmFuZ2VfYXNzZXJ0aW9ucyAoKTsKLQotICBzY2V2X2ZpbmFs aXplICgpOwotICBsb29wX29wdGltaXplcl9maW5hbGl6ZSAoKTsKLSAgcmV0dXJuIDA7Ci19Cit9 OwogCiAvLyBUaGlzIGlzIGEgcmFuZ2VyIGJhc2VkIGZvbGRlciB3aGljaCBjb250aW51ZXMgdG8g dXNlIHRoZSBkb21pbmF0b3IKIC8vIHdhbGsgdG8gYWNjZXNzIHRoZSBzdWJzdGl0dXRlIGFuZCBm b2xkIG1hY2hpbmVyeS4gIFJhbmdlcyBhcmUgY2FsY3VsYXRlZApAQCAtNDYyMSwxMCArMTE5OCw3 IEBAIHB1YmxpYzoKICAgICAgIGlmIChteV9wYXNzID09IDApCiAJcmV0dXJuIGV4ZWN1dGVfcmFu Z2VyX3ZycCAoZnVuLCAvKndhcm5fYXJyYXlfYm91bmRzX3A9Ki9mYWxzZSwgZmFsc2UpOwogCi0g ICAgICBpZiAoKG15X3Bhc3MgPT0gMSAmJiBwYXJhbV92cnAxX21vZGUgPT0gVlJQX01PREVfUkFO R0VSKQotCSAgfHwgKG15X3Bhc3MgPT0gMiAmJiBwYXJhbV92cnAyX21vZGUgPT0gVlJQX01PREVf UkFOR0VSKSkKLQlyZXR1cm4gZXhlY3V0ZV9yYW5nZXJfdnJwIChmdW4sIHdhcm5fYXJyYXlfYm91 bmRzX3AsIG15X3Bhc3MgPT0gMik7Ci0gICAgICByZXR1cm4gZXhlY3V0ZV92cnAgKGZ1biwgd2Fy bl9hcnJheV9ib3VuZHNfcCk7CisgICAgICByZXR1cm4gZXhlY3V0ZV9yYW5nZXJfdnJwIChmdW4s IHdhcm5fYXJyYXlfYm91bmRzX3AsIG15X3Bhc3MgPT0gMik7CiAgICAgfQogCiAgcHJpdmF0ZToK ZGlmZiAtLWdpdCBhL2djYy90cmVlLXZycC5oIGIvZ2NjL3RyZWUtdnJwLmgKaW5kZXggYjg2NDRl OWQwYTcuLjA3NjMwYjViMWNhIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12cnAuaAorKysgYi9nY2Mv dHJlZS12cnAuaApAQCAtMjIsMjYgKzIyLDYgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmls ZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKIAogI2luY2x1ZGUgInZhbHVlLXJhbmdlLmgiCiAKLXN0 cnVjdCBhc3NlcnRfaW5mbwotewotICAvKiBQcmVkaWNhdGUgY29kZSBmb3IgdGhlIEFTU0VSVF9F WFBSLiAgTXVzdCBiZSBDT01QQVJJU09OX0NMQVNTX1AuICAqLwotICBlbnVtIHRyZWVfY29kZSBj b21wX2NvZGU7Ci0KLSAgLyogTmFtZSB0byByZWdpc3RlciB0aGUgYXNzZXJ0IGZvci4gICovCi0g IHRyZWUgbmFtZTsKLQotICAvKiBWYWx1ZSBiZWluZyBjb21wYXJlZCBhZ2FpbnN0LiAgKi8KLSAg dHJlZSB2YWw7Ci0KLSAgLyogRXhwcmVzc2lvbiB0byBjb21wYXJlLiAgKi8KLSAgdHJlZSBleHBy OwotfTsKLQotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yICh0cmVlLCBlZGdl LCBlbnVtIHRyZWVfY29kZSwKLQkJCQkgICAgICB0cmVlLCB0cmVlLCB2ZWM8YXNzZXJ0X2luZm8+ ICYpOwotZXh0ZXJuIGJvb2wgc3RtdF9pbnRlcmVzdGluZ19mb3JfdnJwIChnaW1wbGUgKik7Ci1l eHRlcm4gYm9vbCBpbmZlcl92YWx1ZV9yYW5nZSAoZ2ltcGxlICosIHRyZWUsIHRyZWVfY29kZSAq LCB0cmVlICopOwotCiBleHRlcm4gYm9vbCByYW5nZV9pbnRfY3N0X3AgKGNvbnN0IHZhbHVlX3Jh bmdlICopOwogCiBleHRlcm4gaW50IGNvbXBhcmVfdmFsdWVzICh0cmVlLCB0cmVlKTsKQEAgLTYw LDExICs0MCw2IEBAIGV4dGVybiBib29sIGZpbmRfY2FzZV9sYWJlbF9yYW5nZSAoZ3N3aXRjaCAq LCB0cmVlLCB0cmVlLCBzaXplX3QgKiwgc2l6ZV90ICopOwogZXh0ZXJuIHRyZWUgZmluZF9jYXNl X2xhYmVsX3JhbmdlIChnc3dpdGNoICosIGNvbnN0IGlyYW5nZSAqdnIpOwogZXh0ZXJuIGJvb2wg ZmluZF9jYXNlX2xhYmVsX2luZGV4IChnc3dpdGNoICosIHNpemVfdCwgdHJlZSwgc2l6ZV90ICop OwogZXh0ZXJuIGJvb2wgb3ZlcmZsb3dfY29tcGFyaXNvbl9wICh0cmVlX2NvZGUsIHRyZWUsIHRy ZWUsIGJvb2wsIHRyZWUgKik7Ci1leHRlcm4gdHJlZSBnZXRfc2luZ2xlX3N5bWJvbCAodHJlZSwg Ym9vbCAqLCB0cmVlICopOwogZXh0ZXJuIHZvaWQgbWF5YmVfc2V0X25vbnplcm9fYml0cyAoZWRn ZSwgdHJlZSk7Ci1leHRlcm4gd2lkZV9pbnQgbWFza2VkX2luY3JlbWVudCAoY29uc3Qgd2lkZV9p bnQgJnZhbF9pbiwgY29uc3Qgd2lkZV9pbnQgJm1hc2ssCi0JCQkJICBjb25zdCB3aWRlX2ludCAm c2duYml0LCB1bnNpZ25lZCBpbnQgcHJlYyk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgZXhlY3V0 ZV9yYW5nZXJfdnJwIChzdHJ1Y3QgZnVuY3Rpb24gKmZ1biwKLQkJCQkJYm9vbCB3YXJuX2FycmF5 X2JvdW5kc19wID0gZmFsc2UpOwogI2VuZGlmIC8qIEdDQ19UUkVFX1ZSUF9IICovCmRpZmYgLS1n aXQgYS9nY2MvdmFsdWUtcmFuZ2UuY2MgYi9nY2MvdmFsdWUtcmFuZ2UuY2MKaW5kZXggMzRmYWM2 MzZjYWQuLjNiZTAyMTgzOThiIDEwMDY0NAotLS0gYS9nY2MvdmFsdWUtcmFuZ2UuY2MKKysrIGIv Z2NjL3ZhbHVlLXJhbmdlLmNjCkBAIC0xMTk3LDEyICsxMTk3LDYgQEAgd2lkZV9pbnQKIGlyYW5n ZTo6bGVnYWN5X2xvd2VyX2JvdW5kICh1bnNpZ25lZCBwYWlyKSBjb25zdAogewogICBnY2NfY2hl Y2tpbmdfYXNzZXJ0IChsZWdhY3lfbW9kZV9wICgpKTsKLSAgaWYgKHN5bWJvbGljX3AgKCkpCi0g ICAgewotICAgICAgdmFsdWVfcmFuZ2UgbnVtZXJpY19yYW5nZSAoKnRoaXMpOwotICAgICAgbnVt ZXJpY19yYW5nZS5ub3JtYWxpemVfc3ltYm9saWNzICgpOwotICAgICAgcmV0dXJuIG51bWVyaWNf cmFuZ2UubGVnYWN5X2xvd2VyX2JvdW5kIChwYWlyKTsKLSAgICB9CiAgIGdjY19jaGVja2luZ19h c3NlcnQgKG1fbnVtX3JhbmdlcyA+IDApOwogICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChwYWlyICsg MSA8PSBudW1fcGFpcnMgKCkpOwogICBpZiAobV9raW5kID09IFZSX0FOVElfUkFOR0UpCkBAIC0x MjI0LDEyICsxMjE4LDYgQEAgd2lkZV9pbnQKIGlyYW5nZTo6bGVnYWN5X3VwcGVyX2JvdW5kICh1 bnNpZ25lZCBwYWlyKSBjb25zdAogewogICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChsZWdhY3lfbW9k ZV9wICgpKTsKLSAgaWYgKHN5bWJvbGljX3AgKCkpCi0gICAgewotICAgICAgdmFsdWVfcmFuZ2Ug bnVtZXJpY19yYW5nZSAoKnRoaXMpOwotICAgICAgbnVtZXJpY19yYW5nZS5ub3JtYWxpemVfc3lt Ym9saWNzICgpOwotICAgICAgcmV0dXJuIG51bWVyaWNfcmFuZ2UubGVnYWN5X3VwcGVyX2JvdW5k IChwYWlyKTsKLSAgICB9CiAgIGdjY19jaGVja2luZ19hc3NlcnQgKG1fbnVtX3JhbmdlcyA+IDAp OwogICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChwYWlyICsgMSA8PSBudW1fcGFpcnMgKCkpOwogICBp ZiAobV9raW5kID09IFZSX0FOVElfUkFOR0UpCkBAIC0xMjk3LDE2ICsxMjg1LDYgQEAgaXJhbmdl OjpvcGVyYXRvcj09IChjb25zdCBpcmFuZ2UgJm90aGVyKSBjb25zdAogICByZXR1cm4gZ2V0X25v bnplcm9fYml0cyAoKSA9PSBvdGhlci5nZXRfbm9uemVyb19iaXRzICgpOwogfQogCi0vKiBSZXR1 cm4gVFJVRSBpZiB0aGlzIGlzIGEgc3ltYm9saWMgcmFuZ2UuICAqLwotCi1ib29sCi1pcmFuZ2U6 OnN5bWJvbGljX3AgKCkgY29uc3QKLXsKLSAgcmV0dXJuIChtX251bV9yYW5nZXMgPiAwCi0JICAm JiAoIWlzX2dpbXBsZV9taW5faW52YXJpYW50IChtaW4gKCkpCi0JICAgICAgfHwgIWlzX2dpbXBs ZV9taW5faW52YXJpYW50IChtYXggKCkpKSk7Ci19Ci0KIC8qIFJldHVybiBUUlVFIGlmIHRoaXMg aXMgYSBjb25zdGFudCByYW5nZS4gICovCiAKIGJvb2wKQEAgLTE0MjYsMTIgKzE0MDQsNiBAQCBp cmFuZ2U6OmNvbnRhaW5zX3AgKHRyZWUgY3N0KSBjb25zdAogICBpZiAobGVnYWN5X21vZGVfcCAo KSkKICAgICB7CiAgICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChUUkVFX0NPREUgKGNzdCkgPT0g SU5URUdFUl9DU1QpOwotICAgICAgaWYgKHN5bWJvbGljX3AgKCkpCi0JewotCSAgdmFsdWVfcmFu Z2UgbnVtZXJpY19yYW5nZSAoKnRoaXMpOwotCSAgbnVtZXJpY19yYW5nZS5ub3JtYWxpemVfc3lt Ym9saWNzICgpOwotCSAgcmV0dXJuIG51bWVyaWNfcmFuZ2UuY29udGFpbnNfcCAoY3N0KTsKLQl9 CiAgICAgICByZXR1cm4gdmFsdWVfaW5zaWRlX3JhbmdlIChjc3QpID09IDE7CiAgICAgfQogCmRp ZmYgLS1naXQgYS9nY2MvdmFsdWUtcmFuZ2UuaCBiL2djYy92YWx1ZS1yYW5nZS5oCmluZGV4IGM4 NzczNGRkOGNkLi4wZTM5NTE4OTcwOCAxMDA2NDQKLS0tIGEvZ2NjL3ZhbHVlLXJhbmdlLmgKKysr IGIvZ2NjL3ZhbHVlLXJhbmdlLmgKQEAgLTE2Myw3ICsxNjMsNiBAQCBwdWJsaWM6CiAgIC8vIERl cHJlY2F0ZWQgbGVnYWN5IHB1YmxpYyBtZXRob2RzLgogICB0cmVlIG1pbiAoKSBjb25zdDsJCQkJ Ly8gREVQUkVDQVRFRAogICB0cmVlIG1heCAoKSBjb25zdDsJCQkJLy8gREVQUkVDQVRFRAotICBi b29sIHN5bWJvbGljX3AgKCkgY29uc3Q7CQkJLy8gREVQUkVDQVRFRAogICBib29sIGNvbnN0YW50 X3AgKCkgY29uc3Q7CQkJLy8gREVQUkVDQVRFRAogICB2b2lkIG5vcm1hbGl6ZV9zeW1ib2xpY3Mg KCk7CQkJLy8gREVQUkVDQVRFRAogICB2b2lkIG5vcm1hbGl6ZV9hZGRyZXNzZXMgKCk7CQkJLy8g REVQUkVDQVRFRApkaWZmIC0tZ2l0IGEvZ2NjL3ZyLXZhbHVlcy5jYyBiL2djYy92ci12YWx1ZXMu Y2MKaW5kZXggNzFmZWQxZTZhN2UuLmExMDNjMDhiYTM1IDEwMDY0NAotLS0gYS9nY2MvdnItdmFs dWVzLmNjCisrKyBiL2djYy92ci12YWx1ZXMuY2MKQEAgLTUyLDQxNSArNTIsNiBAQCBhbG9uZyB3 aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgInJh bmdlLW9wLmgiCiAjaW5jbHVkZSAiZ2ltcGxlLXJhbmdlLmgiCiAKLS8qIFNldCB2YWx1ZSByYW5n ZSBWUiB0byBhIG5vbi1uZWdhdGl2ZSByYW5nZSBvZiB0eXBlIFRZUEUuICAqLwotCi1zdGF0aWMg aW5saW5lIHZvaWQKLXNldF92YWx1ZV9yYW5nZV90b19ub25uZWdhdGl2ZSAodmFsdWVfcmFuZ2Vf ZXF1aXYgKnZyLCB0cmVlIHR5cGUpCi17Ci0gIHRyZWUgemVybyA9IGJ1aWxkX2ludF9jc3QgKHR5 cGUsIDApOwotICB2ci0+dXBkYXRlICh6ZXJvLCB2cnBfdmFsX21heCAodHlwZSkpOwotfQotCi0v KiBTZXQgdmFsdWUgcmFuZ2UgVlIgdG8gYSByYW5nZSBvZiBhIHRydXRodmFsdWUgb2YgdHlwZSBU WVBFLiAgKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfdmFsdWVfcmFuZ2VfdG9fdHJ1dGh2 YWx1ZSAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLCB0cmVlIHR5cGUpCi17Ci0gIGlmIChUWVBFX1BS RUNJU0lPTiAodHlwZSkgPT0gMSkKLSAgICB2ci0+c2V0X3ZhcnlpbmcgKHR5cGUpOwotICBlbHNl Ci0gICAgdnItPnVwZGF0ZSAoYnVpbGRfaW50X2NzdCAodHlwZSwgMCksIGJ1aWxkX2ludF9jc3Qg KHR5cGUsIDEpKTsKLX0KLQotLyogUmV0dXJuIHRoZSBsYXR0aWNlIGVudHJ5IGZvciBWQVIgb3Ig TlVMTCBpZiBpdCBkb2Vzbid0IGV4aXN0IG9yIGNhbm5vdAotICAgYmUgaW5pdGlhbGl6ZWQuICAq LwotCi12YWx1ZV9yYW5nZV9lcXVpdiAqCi12cl92YWx1ZXM6OmdldF9sYXR0aWNlX2VudHJ5IChj b25zdF90cmVlIHZhcikKLXsKLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyOwotICB0cmVlIHN5bTsK LSAgdW5zaWduZWQgdmVyID0gU1NBX05BTUVfVkVSU0lPTiAodmFyKTsKLQotICAvKiBJZiB3ZSBx dWVyeSB0aGUgZW50cnkgZm9yIGEgbmV3IFNTQSBuYW1lIGF2b2lkIHJlYWxsb2NhdGluZyB0aGUg bGF0dGljZQotICAgICBzaW5jZSB3ZSBzaG91bGQgZ2V0IGhlcmUgYXQgbW9zdCBmcm9tIHRoZSBz dWJzdGl0dXRlLWFuZC1mb2xkIHN0YWdlIHdoaWNoCi0gICAgIHdpbGwgbmV2ZXIgdHJ5IHRvIGNo YW5nZSB2YWx1ZXMuICAqLwotICBpZiAodmVyID49IG51bV92cl92YWx1ZXMpCi0gICAgcmV0dXJu IE5VTEw7Ci0KLSAgdnIgPSB2cl92YWx1ZVt2ZXJdOwotICBpZiAodnIpCi0gICAgcmV0dXJuIHZy OwotCi0gIC8qIENyZWF0ZSBhIGRlZmF1bHQgdmFsdWUgcmFuZ2UuICAqLwotICB2ciA9IGFsbG9j YXRlX3ZhbHVlX3JhbmdlX2VxdWl2ICgpOwotICB2cl92YWx1ZVt2ZXJdID0gdnI7Ci0KLSAgLyog QWZ0ZXIgcHJvcGFnYXRpb24gZmluaXNoZWQgcmV0dXJuIHZhcnlpbmcuICAqLwotICBpZiAodmFs dWVzX3Byb3BhZ2F0ZWQpCi0gICAgewotICAgICAgdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUg KHZhcikpOwotICAgICAgcmV0dXJuIHZyOwotICAgIH0KLQotICB2ci0+c2V0X3VuZGVmaW5lZCAo KTsKLQotICAvKiBJZiBWQVIgaXMgYSBkZWZhdWx0IGRlZmluaXRpb24gb2YgYSBwYXJhbWV0ZXIs IHRoZSB2YXJpYWJsZSBjYW4KLSAgICAgdGFrZSBhbnkgdmFsdWUgaW4gVkFSJ3MgdHlwZS4gICov Ci0gIGlmIChTU0FfTkFNRV9JU19ERUZBVUxUX0RFRiAodmFyKSkKLSAgICB7Ci0gICAgICBzeW0g PSBTU0FfTkFNRV9WQVIgKHZhcik7Ci0gICAgICBpZiAoVFJFRV9DT0RFIChzeW0pID09IFBBUk1f REVDTCkKLQl7Ci0JICAvKiBUcnkgdG8gdXNlIHRoZSAibm9ubnVsbCIgYXR0cmlidXRlIHRvIGNy ZWF0ZSB+WzAsIDBdCi0JICAgICBhbnRpLXJhbmdlcyBmb3IgcG9pbnRlcnMuICBOb3RlIHRoYXQg dGhpcyBpcyBvbmx5IHZhbGlkIHdpdGgKLQkgICAgIGRlZmF1bHQgZGVmaW5pdGlvbnMgb2YgUEFS TV9ERUNMcy4gICovCi0JICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAoc3ltKSkKLQkg ICAgICAmJiAobm9ubnVsbF9hcmdfcCAoc3ltKQotCQkgIHx8IChnZXRfZ2xvYmFsX3JhbmdlX3F1 ZXJ5ICgpLT5yYW5nZV9vZl9leHByICgqdnIsCi0JCQkJCQljb25zdF9jYXN0IDx0cmVlPiAodmFy KSkKLQkJICAgICAgJiYgdnItPm5vbnplcm9fcCAoKSkpKQotCSAgICB7Ci0JICAgICAgdnItPnNl dF9ub256ZXJvIChUUkVFX1RZUEUgKHN5bSkpOwotCSAgICAgIHZyLT5lcXVpdl9jbGVhciAoKTsK LQkgICAgfQotCSAgZWxzZSBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKHN5bSkpKQot CSAgICB7Ci0JICAgICAgZ2V0X2dsb2JhbF9yYW5nZV9xdWVyeSAoKS0+cmFuZ2Vfb2ZfZXhwciAo KnZyLCBjb25zdF9jYXN0IDx0cmVlPiAodmFyKSk7Ci0JICAgICAgaWYgKHZyLT51bmRlZmluZWRf cCAoKSkKLQkJdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKHN5bSkpOwotCSAgICB9Ci0JICBl bHNlCi0JICAgIHZyLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChzeW0pKTsKLQl9Ci0gICAgICBl bHNlIGlmIChUUkVFX0NPREUgKHN5bSkgPT0gUkVTVUxUX0RFQ0wKLQkgICAgICAgJiYgREVDTF9C WV9SRUZFUkVOQ0UgKHN5bSkpCi0JewotCSAgdnItPnNldF9ub256ZXJvIChUUkVFX1RZUEUgKHN5 bSkpOwotCSAgdnItPmVxdWl2X2NsZWFyICgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHZyOwot fQotCi0vKiBSZXR1cm4gdmFsdWUgcmFuZ2UgaW5mb3JtYXRpb24gZm9yIFZBUi4KLQotICAgSWYg d2UgaGF2ZSBubyB2YWx1ZXMgcmFuZ2VzIHJlY29yZGVkIChpZSwgVlJQIGlzIG5vdCBydW5uaW5n KSwgdGhlbgotICAgcmV0dXJuIE5VTEwuICBPdGhlcndpc2UgY3JlYXRlIGFuIGVtcHR5IHJhbmdl IGlmIG5vbmUgZXhpc3RlZCBmb3IgVkFSLiAgKi8KLQotY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYg KgotdnJfdmFsdWVzOjpnZXRfdmFsdWVfcmFuZ2UgKGNvbnN0X3RyZWUgdmFyLAotCQkJICAgIGdp bXBsZSAqc3RtdCBBVFRSSUJVVEVfVU5VU0VEKQotewotICAvKiBJZiB3ZSBoYXZlIG5vIHJlY29y ZGVkIHJhbmdlcywgdGhlbiByZXR1cm4gTlVMTC4gICovCi0gIGlmICghdnJfdmFsdWUpCi0gICAg cmV0dXJuIE5VTEw7Ci0KLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyID0gZ2V0X2xhdHRpY2VfZW50 cnkgKHZhcik7Ci0KLSAgLyogUmVhbGxvY2F0ZSB0aGUgbGF0dGljZSBpZiBuZWVkZWQuICAqLwot ICBpZiAoIXZyKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBvbGRfc3ogPSBudW1fdnJfdmFs dWVzOwotICAgICAgbnVtX3ZyX3ZhbHVlcyA9IG51bV9zc2FfbmFtZXMgKyBudW1fc3NhX25hbWVz IC8gMTA7Ci0gICAgICB2cl92YWx1ZSA9IFhSRVNJWkVWRUMgKHZhbHVlX3JhbmdlX2VxdWl2ICos IHZyX3ZhbHVlLCBudW1fdnJfdmFsdWVzKTsKLSAgICAgIGZvciAoIDsgb2xkX3N6IDwgbnVtX3Zy X3ZhbHVlczsgb2xkX3N6KyspCi0gICAgICAgIHZyX3ZhbHVlIFtvbGRfc3pdID0gTlVMTDsKLQot ICAgICAgLyogTm93IHRoYXQgdGhlIGxhdHRpY2UgaGFzIGJlZW4gcmVzaXplZCwgd2Ugc2hvdWxk IG5ldmVyIGZhaWwuICAqLwotICAgICAgdnIgPSBnZXRfbGF0dGljZV9lbnRyeSAodmFyKTsKLSAg ICAgIGdjY19hc3NlcnQgKHZyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHZyOwotfQotCi1ib29sCi12 cl92YWx1ZXM6OnJhbmdlX29mX2V4cHIgKHZyYW5nZSAmciwgdHJlZSBleHByLCBnaW1wbGUgKnN0 bXQpCi17Ci0gIGlmICghZ2ltcGxlX3JhbmdlX3NzYV9wIChleHByKSkKLSAgICByZXR1cm4gZ2V0 X3RyZWVfcmFuZ2UgKHIsIGV4cHIsIHN0bXQpOwotCi0gIGlmIChjb25zdCB2YWx1ZV9yYW5nZSAq dnIgPSBnZXRfdmFsdWVfcmFuZ2UgKGV4cHIsIHN0bXQpKQotICAgIHsKLSAgICAgIGlmICghdnIt PnN1cHBvcnRzX3R5cGVfcCAoVFJFRV9UWVBFIChleHByKSkpCi0JewotCSAgLy8gdnJfdmFsdWVz OjpleHRyYWN0X3JhbmdlX2Jhc2ljKCkgdXNlIG9mIHJhbmdlcidzCi0JICAvLyBmb2xkX3Jhbmdl KCkgY2FuIGNyZWF0ZSBhIHNpdHVhdGlvbiB3aGVyZSB3ZSBhcmUgYXNrZWQKLQkgIC8vIGZvciB0 aGUgcmFuZ2Ugb2YgYW4gdW5zdXBwb3J0ZWQgbGVnYWN5IHR5cGUuICBTaW5jZQotCSAgLy8gZ2V0 X3ZhbHVlX3JhbmdlKCkgYWJvdmUgd2lsbCByZXR1cm4gdmFyeWluZyBvciB1bmRlZmluZWQKLQkg IC8vIGZvciBzdWNoIHR5cGVzLCBhdm9pZCBjb3B5aW5nIGluY29tcGF0aWJsZSByYW5nZSB0eXBl cy4KLQkgIGlmICh2ci0+dW5kZWZpbmVkX3AgKCkpCi0JICAgIHIuc2V0X3VuZGVmaW5lZCAoKTsK LQkgIGVsc2UKLQkgICAgci5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChleHByKSk7Ci0JICByZXR1 cm4gdHJ1ZTsKLQl9Ci0gICAgICBpZiAodnItPnVuZGVmaW5lZF9wICgpIHx8IHZyLT5jb25zdGFu dF9wICgpKQotCXIgPSAqdnI7Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWVfcmFuZ2UgdG1wID0g KnZyOwotCSAgdG1wLm5vcm1hbGl6ZV9zeW1ib2xpY3MgKCk7Ci0JICByID0gdG1wOwotCX0KLSAg ICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi10cmVlCi12cl92 YWx1ZXM6OnZhbHVlX29mX2V4cHIgKHRyZWUgb3AsIGdpbXBsZSAqKQotewotICByZXR1cm4gb3Bf d2l0aF9jb25zdGFudF9zaW5nbGV0b25fdmFsdWVfcmFuZ2UgKG9wKTsKLX0KLQotdHJlZQotdnJf dmFsdWVzOjp2YWx1ZV9vbl9lZGdlIChlZGdlLCB0cmVlIG9wKQotewotICByZXR1cm4gb3Bfd2l0 aF9jb25zdGFudF9zaW5nbGV0b25fdmFsdWVfcmFuZ2UgKG9wKTsKLX0KLQotdHJlZQotdnJfdmFs dWVzOjp2YWx1ZV9vZl9zdG10IChnaW1wbGUgKnN0bXQsIHRyZWUgb3ApCi17Ci0gIGlmICghb3Ap Ci0gICAgb3AgPSBnaW1wbGVfZ2V0X2xocyAoc3RtdCk7Ci0KLSAgZ2NjX2NoZWNraW5nX2Fzc2Vy dCAoIW9wfHwgb3AgPT0gZ2ltcGxlX2dldF9saHMgKHN0bXQpKTsKLQotICBpZiAob3ApCi0gICAg cmV0dXJuIG9wX3dpdGhfY29uc3RhbnRfc2luZ2xldG9uX3ZhbHVlX3JhbmdlIChvcCk7Ci0gIHJl dHVybiBOVUxMX1RSRUU7Ci19Ci0KLS8qIFNldCB0aGUgbGF0dGljZSBlbnRyeSBmb3IgREVGIHRv IFZBUllJTkcuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OnNldF9kZWZfdG9fdmFyeWluZyAoY29u c3RfdHJlZSBkZWYpCi17Ci0gIHZhbHVlX3JhbmdlX2VxdWl2ICp2ciA9IGdldF9sYXR0aWNlX2Vu dHJ5IChkZWYpOwotICBpZiAodnIpCi0gICAgdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKGRl ZikpOwotfQotCi0vKiBTZXQgdmFsdWUtcmFuZ2VzIG9mIGFsbCBTU0EgbmFtZXMgZGVmaW5lZCBi eSBTVE1UIHRvIHZhcnlpbmcuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OnNldF9kZWZzX3RvX3Zh cnlpbmcgKGdpbXBsZSAqc3RtdCkKLXsKLSAgc3NhX29wX2l0ZXIgaTsKLSAgdHJlZSBkZWY7Ci0g IEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKGRlZiwgc3RtdCwgaSwgU1NBX09QX0RFRikKLSAg ICBzZXRfZGVmX3RvX3ZhcnlpbmcgKGRlZik7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgdmFsdWUgcmFu Z2UgYW5kIGVxdWl2YWxlbmNlIHNldCBmb3IgdmFyaWFibGUgVkFSIHRvCi0gICBORVdfVlIuICBS ZXR1cm4gdHJ1ZSBpZiBORVdfVlIgaXMgZGlmZmVyZW50IGZyb20gVkFSJ3MgcHJldmlvdXMKLSAg IHZhbHVlLgotCi0gICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBORVdfVlIgaXMg YSB0ZW1wb3JhcnkgdmFsdWUgcmFuZ2UKLSAgIG9iamVjdCBjcmVhdGVkIGZvciB0aGUgc29sZSBw dXJwb3NlIG9mIHVwZGF0aW5nIFZBUidzIHJhbmdlLiAgVGhlCi0gICBzdG9yYWdlIHVzZWQgYnkg dGhlIGVxdWl2YWxlbmNlIHNldCBmcm9tIE5FV19WUiB3aWxsIGJlIGZyZWVkIGJ5Ci0gICB0aGlz IGZ1bmN0aW9uLiAgRG8gbm90IGNhbGwgdXBkYXRlX3ZhbHVlX3JhbmdlIHdoZW4gTkVXX1ZSCi0g ICBpcyB0aGUgcmFuZ2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIFNTQSBuYW1lLiAg Ki8KLQotYm9vbAotdnJfdmFsdWVzOjp1cGRhdGVfdmFsdWVfcmFuZ2UgKGNvbnN0X3RyZWUgdmFy LCB2YWx1ZV9yYW5nZV9lcXVpdiAqbmV3X3ZyKQotewotICB2YWx1ZV9yYW5nZV9lcXVpdiAqb2xk X3ZyOwotICBib29sIGlzX25ldzsKLQotICAvKiBJZiB0aGVyZSBpcyBhIHZhbHVlLXJhbmdlIG9u IHRoZSBTU0EgbmFtZSBmcm9tIGVhcmxpZXIgYW5hbHlzaXMKLSAgICAgZmFjdG9yIHRoYXQgaW4u ICAqLwotICBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKHZhcikpKQotICAgIHsKLSAg ICAgIHZhbHVlX3JhbmdlX2VxdWl2IG5yOwotICAgICAgZ2V0X2dsb2JhbF9yYW5nZV9xdWVyeSAo KS0+cmFuZ2Vfb2ZfZXhwciAobnIsIGNvbnN0X2Nhc3QgPHRyZWU+ICh2YXIpKTsKLSAgICAgIGlm ICghbnIudW5kZWZpbmVkX3AgKCkpCi0JbmV3X3ZyLT5sZWdhY3lfdmVyYm9zZV9pbnRlcnNlY3Qg KCZucik7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgdmFsdWUgcmFuZ2UsIGlmIG5lY2Vzc2Fy eS4gIElmIHdlIGNhbm5vdCBhbGxvY2F0ZSBhIGxhdHRpY2UKLSAgICAgZW50cnkgZm9yIFZBUiBr ZWVwIGl0IGF0IFZBUllJTkcuICBUaGlzIGhhcHBlbnMgd2hlbiBET00gZmVlZHMgdXMgc3RtdHMK LSAgICAgd2l0aCBTU0EgbmFtZXMgYWxsb2NhdGVkIGFmdGVyIHNldHRpbmcgdXAgdGhlIGxhdHRp Y2UuICAqLwotICBvbGRfdnIgPSBnZXRfbGF0dGljZV9lbnRyeSAodmFyKTsKLSAgaWYgKCFvbGRf dnIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpc19uZXcgPSAhb2xkX3ZyLT5lcXVhbF9wICgqbmV3 X3ZyLCAvKmlnbm9yZV9lcXVpdnM9Ki9mYWxzZSk7Ci0KLSAgaWYgKGlzX25ldykKLSAgICB7Ci0g ICAgICAvKiBEbyBub3QgYWxsb3cgdHJhbnNpdGlvbnMgdXAgdGhlIGxhdHRpY2UuICBUaGUgZm9s bG93aW5nCi0JIGlzIHNsaWdodGx5IG1vcmUgYXdrd2FyZCB0aGFuIGp1c3QgbmV3X3ZyLT50eXBl IDwgb2xkX3ZyLT50eXBlCi0JIGJlY2F1c2UgVlJfUkFOR0UgYW5kIFZSX0FOVElfUkFOR0UgbmVl ZCB0byBiZSBjb25zaWRlcmVkCi0JIHRoZSBzYW1lLiAgV2UgbWF5IG5vdCBoYXZlIGlzX25ldyB3 aGVuIHRyYW5zaXRpb25pbmcgdG8KLQkgVU5ERUZJTkVELiAgSWYgb2xkX3ZyLT50eXBlIGlzIFZB UllJTkcsIHdlIHNob3VsZG4ndCBiZQotCSBjYWxsZWQsIGlmIHdlIGFyZSBhbnl3YXksIGtlZXAg aXQgVkFSWUlORy4gICovCi0gICAgICBpZiAob2xkX3ZyLT52YXJ5aW5nX3AgKCkpCi0JewotCSAg bmV3X3ZyLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFICh2YXIpKTsKLQkgIGlzX25ldyA9IGZhbHNl OwotCX0KLSAgICAgIGVsc2UgaWYgKG5ld192ci0+dW5kZWZpbmVkX3AgKCkpCi0JewotCSAgb2xk X3ZyLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFICh2YXIpKTsKLQkgIG5ld192ci0+c2V0X3Zhcnlp bmcgKFRSRUVfVFlQRSAodmFyKSk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0J b2xkX3ZyLT5zZXQgKG5ld192ci0+bWluICgpLCBuZXdfdnItPm1heCAoKSwgbmV3X3ZyLT5lcXVp diAoKSwKLQkJICAgICBuZXdfdnItPmtpbmQgKCkpOwotICAgIH0KLQotICBuZXdfdnItPmVxdWl2 X2NsZWFyICgpOwotCi0gIHJldHVybiBpc19uZXc7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHZh bHVlIHJhbmdlIFZSIGludm9sdmVzIGV4YWN0bHkgb25lIHN5bWJvbCBTWU0uICAqLwotCi1zdGF0 aWMgYm9vbAotc3ltYm9saWNfcmFuZ2VfYmFzZWRfb25fcCAodmFsdWVfcmFuZ2UgKnZyLCBjb25z dF90cmVlIHN5bSkKLXsKLSAgYm9vbCBuZWcsIG1pbl9oYXNfc3ltYm9sLCBtYXhfaGFzX3N5bWJv bDsKLSAgdHJlZSBpbnY7Ci0KLSAgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50ICh2ci0+bWlu ICgpKSkKLSAgICBtaW5faGFzX3N5bWJvbCA9IGZhbHNlOwotICBlbHNlIGlmIChnZXRfc2luZ2xl X3N5bWJvbCAodnItPm1pbiAoKSwgJm5lZywgJmludikgPT0gc3ltKQotICAgIG1pbl9oYXNfc3lt Ym9sID0gdHJ1ZTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaXNfZ2ltcGxl X21pbl9pbnZhcmlhbnQgKHZyLT5tYXggKCkpKQotICAgIG1heF9oYXNfc3ltYm9sID0gZmFsc2U7 Ci0gIGVsc2UgaWYgKGdldF9zaW5nbGVfc3ltYm9sICh2ci0+bWF4ICgpLCAmbmVnLCAmaW52KSA9 PSBzeW0pCi0gICAgbWF4X2hhc19zeW1ib2wgPSB0cnVlOwotICBlbHNlCi0gICAgcmV0dXJuIGZh bHNlOwotCi0gIHJldHVybiAobWluX2hhc19zeW1ib2wgfHwgbWF4X2hhc19zeW1ib2wpOwotfQot Ci0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IG9mIGFzc2lnbm1lbnQgU1RNVCBpcyBrbm93 IHRvIGJlIG5vbi16ZXJvLiAgKi8KLQotc3RhdGljIGJvb2wKLWdpbXBsZV9hc3NpZ25fbm9uemVy b19wIChnaW1wbGUgKnN0bXQpCi17Ci0gIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBnaW1wbGVfYXNz aWduX3Joc19jb2RlIChzdG10KTsKLSAgYm9vbCBzdHJpY3Rfb3ZlcmZsb3dfcDsKLSAgdHJlZSB0 eXBlID0gVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoc3RtdCkpOwotICBzd2l0Y2ggKGdl dF9naW1wbGVfcmhzX2NsYXNzIChjb2RlKSkKLSAgICB7Ci0gICAgY2FzZSBHSU1QTEVfVU5BUllf UkhTOgotICAgICAgcmV0dXJuIHRyZWVfdW5hcnlfbm9uemVyb193YXJudl9wIChnaW1wbGVfYXNz aWduX3Joc19jb2RlIChzdG10KSwKLQkJCQkJIHR5cGUsCi0JCQkJCSBnaW1wbGVfYXNzaWduX3Jo czEgKHN0bXQpLAotCQkJCQkgJnN0cmljdF9vdmVyZmxvd19wKTsKLSAgICBjYXNlIEdJTVBMRV9C SU5BUllfUkhTOgotICAgICAgcmV0dXJuIHRyZWVfYmluYXJ5X25vbnplcm9fd2FybnZfcCAoZ2lt cGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCksCi0JCQkJCSAgdHlwZSwKLQkJCQkJICBnaW1wbGVf YXNzaWduX3JoczEgKHN0bXQpLAotCQkJCQkgIGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCksCi0J CQkJCSAgJnN0cmljdF9vdmVyZmxvd19wKTsKLSAgICBjYXNlIEdJTVBMRV9URVJOQVJZX1JIUzoK LSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEdJTVBMRV9TSU5HTEVfUkhTOgotICAgICAg cmV0dXJuIHRyZWVfc2luZ2xlX25vbnplcm9fd2FybnZfcCAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChz dG10KSwKLQkJCQkJICAmc3RyaWN0X292ZXJmbG93X3ApOwotICAgIGNhc2UgR0lNUExFX0lOVkFM SURfUkhTOgotICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBn Y2NfdW5yZWFjaGFibGUgKCk7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBTVE1UIGlz IGtub3duIHRvIGNvbXB1dGUgYSBub24temVybyB2YWx1ZS4gICovCi0KLXN0YXRpYyBib29sCi1n aW1wbGVfc3RtdF9ub256ZXJvX3AgKGdpbXBsZSAqc3RtdCkKLXsKLSAgc3dpdGNoIChnaW1wbGVf Y29kZSAoc3RtdCkpCi0gICAgewotICAgIGNhc2UgR0lNUExFX0FTU0lHTjoKLSAgICAgIHJldHVy biBnaW1wbGVfYXNzaWduX25vbnplcm9fcCAoc3RtdCk7Ci0gICAgY2FzZSBHSU1QTEVfQ0FMTDoK LSAgICAgIHsKLSAgICAgICAgZ2NhbGwgKmNhbGxfc3RtdCA9IGFzX2E8Z2NhbGwgKj4gKHN0bXQp OwotCXJldHVybiAoZ2ltcGxlX2NhbGxfbm9ubnVsbF9yZXN1bHRfcCAoY2FsbF9zdG10KQotCQl8 fCBnaW1wbGVfY2FsbF9ub25udWxsX2FyZyAoY2FsbF9zdG10KSk7Ci0gICAgICB9Ci0gICAgZGVm YXVsdDoKLSAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsKLSAgICB9Ci19Ci0vKiBMaWtlIHRyZWVf ZXhwcl9ub256ZXJvX3AsIGJ1dCB0aGlzIGZ1bmN0aW9uIHVzZXMgdmFsdWUgcmFuZ2VzCi0gICBv YnRhaW5lZCBzbyBmYXIuICAqLwotCi1ib29sCi12cl92YWx1ZXM6OnZycF9zdG10X2NvbXB1dGVz X25vbnplcm8gKGdpbXBsZSAqc3RtdCkKLXsKLSAgaWYgKGdpbXBsZV9zdG10X25vbnplcm9fcCAo c3RtdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbiBleHByZXNzaW9u IG9mIHRoZSBmb3JtICZYLT5hLCB0aGVuIHRoZSBleHByZXNzaW9uCi0gICAgIGlzIG5vbm51bGwg aWYgWCBpcyBub25udWxsLiAgKi8KLSAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0bXQpCi0gICAg ICAmJiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSA9PSBBRERSX0VYUFIpCi0gICAgewot ICAgICAgdHJlZSBleHByID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKLSAgICAgIHBvbHlf aW50NjQgYml0c2l6ZSwgYml0cG9zOwotICAgICAgdHJlZSBvZmZzZXQ7Ci0gICAgICBtYWNoaW5l X21vZGUgbW9kZTsKLSAgICAgIGludCB1bnNpZ25lZHAsIHJldmVyc2VwLCB2b2xhdGlsZXA7Ci0g ICAgICB0cmVlIGJhc2UgPSBnZXRfaW5uZXJfcmVmZXJlbmNlIChUUkVFX09QRVJBTkQgKGV4cHIs IDApLCAmYml0c2l6ZSwKLQkJCQkgICAgICAgJmJpdHBvcywgJm9mZnNldCwgJm1vZGUsICZ1bnNp Z25lZHAsCi0JCQkJICAgICAgICZyZXZlcnNlcCwgJnZvbGF0aWxlcCk7Ci0KLSAgICAgIGlmIChi YXNlICE9IE5VTExfVFJFRQotCSAgJiYgVFJFRV9DT0RFIChiYXNlKSA9PSBNRU1fUkVGCi0JICAm JiBUUkVFX0NPREUgKFRSRUVfT1BFUkFORCAoYmFzZSwgMCkpID09IFNTQV9OQU1FKQotCXsKLQkg IHBvbHlfb2Zmc2V0X2ludCBvZmYgPSAwOwotCSAgYm9vbCBvZmZfY3N0ID0gZmFsc2U7Ci0JICBp ZiAob2Zmc2V0ID09IE5VTExfVFJFRSB8fCBUUkVFX0NPREUgKG9mZnNldCkgPT0gSU5URUdFUl9D U1QpCi0JICAgIHsKLQkgICAgICBvZmYgPSBtZW1fcmVmX29mZnNldCAoYmFzZSk7Ci0JICAgICAg aWYgKG9mZnNldCkKLQkJb2ZmICs9IHBvbHlfb2Zmc2V0X2ludDo6ZnJvbSAod2k6OnRvX3BvbHlf d2lkZSAob2Zmc2V0KSwKLQkJCQkJICAgICAgU0lHTkVEKTsKLQkgICAgICBvZmYgPDw9IExPRzJf QklUU19QRVJfVU5JVDsKLQkgICAgICBvZmYgKz0gYml0cG9zOwotCSAgICAgIG9mZl9jc3QgPSB0 cnVlOwotCSAgICB9Ci0JICAvKiBJZiAmWC0+YSBpcyBlcXVhbCB0byBYIGFuZCBYIGlzIH5bMCwg MF0sIHRoZSByZXN1bHQgaXMgdG9vLgotCSAgICAgRm9yIC1mZGVsZXRlLW51bGwtcG9pbnRlci1j aGVja3MgLWZuby13cmFwdi1wb2ludGVyIHdlIGRvbid0Ci0JICAgICBhbGxvdyBnb2luZyBmcm9t IG5vbi1OVUxMIHBvaW50ZXIgdG8gTlVMTC4gICovCi0JICBpZiAoKG9mZl9jc3QgJiYga25vd25f ZXEgKG9mZiwgMCkpCi0JICAgICAgfHwgKGZsYWdfZGVsZXRlX251bGxfcG9pbnRlcl9jaGVja3MK LQkJICAmJiAhVFlQRV9PVkVSRkxPV19XUkFQUyAoVFJFRV9UWVBFIChleHByKSkpKQotCSAgICB7 Ci0JICAgICAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyCi0JCT0gZ2V0X3ZhbHVlX3Jhbmdl IChUUkVFX09QRVJBTkQgKGJhc2UsIDApLCBzdG10KTsKLQkgICAgICBpZiAoIXJhbmdlX2luY2x1 ZGVzX3plcm9fcCAodnIpKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgLyogSWYgTUVNX1JF RiBoYXMgYSAicG9zaXRpdmUiIG9mZnNldCwgY29uc2lkZXIgaXQgbm9uLU5VTEwKLQkgICAgIGFs d2F5cywgZm9yIC1mZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3MgYWxzbyAibmVnYXRpdmUiCi0J ICAgICBvbmVzLiAgUHVudCBmb3IgdW5rbm93biBvZmZzZXRzIChlLmcuIHZhcmlhYmxlIG9uZXMp LiAgKi8KLQkgIGlmICghVFlQRV9PVkVSRkxPV19XUkFQUyAoVFJFRV9UWVBFIChleHByKSkKLQkg ICAgICAmJiBvZmZfY3N0Ci0JICAgICAgJiYga25vd25fbmUgKG9mZiwgMCkKLQkgICAgICAmJiAo ZmxhZ19kZWxldGVfbnVsbF9wb2ludGVyX2NoZWNrcyB8fCBrbm93bl9ndCAob2ZmLCAwKSkpCi0J ICAgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCiAvKiBS ZXR1cm5zIHRydWUgaWYgRVhQUiBpcyBhIHZhbGlkIHZhbHVlIChhcyBleHBlY3RlZCBieSBjb21w YXJlX3ZhbHVlcykgLS0KICAgIGEgZ2ltcGxlIGludmFyaWFudCwgb3IgU1NBX05BTUUgKy0gQ1NU LiAgKi8KIApAQCAtNDc4LDI1ICs2OSw2IEBAIHZhbGlkX3ZhbHVlX3AgKHRyZWUgZXhwcikKICAg cmV0dXJuIGlzX2dpbXBsZV9taW5faW52YXJpYW50IChleHByKTsKIH0KIAotLyogSWYgT1AgaGFz IGEgdmFsdWUgcmFuZ2Ugd2l0aCBhIHNpbmdsZSBjb25zdGFudCB2YWx1ZSByZXR1cm4gdGhhdCwK LSAgIG90aGVyd2lzZSByZXR1cm4gTlVMTF9UUkVFLiAgVGhpcyByZXR1cm5zIE9QIGl0c2VsZiBp ZiBPUCBpcyBhCi0gICBjb25zdGFudC4gICovCi0KLXRyZWUKLXZyX3ZhbHVlczo6b3Bfd2l0aF9j b25zdGFudF9zaW5nbGV0b25fdmFsdWVfcmFuZ2UgKHRyZWUgb3ApCi17Ci0gIGlmIChpc19naW1w bGVfbWluX2ludmFyaWFudCAob3ApKQotICAgIHJldHVybiBvcDsKLQotICBpZiAoVFJFRV9DT0RF IChvcCkgIT0gU1NBX05BTUUpCi0gICAgcmV0dXJuIE5VTExfVFJFRTsKLQotICB0cmVlIHQ7Ci0g IGlmIChnZXRfdmFsdWVfcmFuZ2UgKG9wKS0+c2luZ2xldG9uX3AgKCZ0KSkKLSAgICByZXR1cm4g dDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KIC8qIFJldHVybiB0cnVlIGlmIG9wIGlzIGluIGEgYm9v bGVhbiBbMCwgMV0gdmFsdWUtcmFuZ2UuICAqLwogCiBib29sCkBAIC01MTksNTQ5ICs5MSw2IEBA IHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6b3Bfd2l0aF9ib29sZWFuX3ZhbHVlX3JhbmdlX3AgKHRy ZWUgb3AsIGdpbXBsZSAqcykKIAkJCSAgICAgYnVpbGRfb25lX2NzdCAoVFJFRV9UWVBFIChvcCkp KTsKIH0KIAotLyogRXh0cmFjdCB2YWx1ZSByYW5nZSBpbmZvcm1hdGlvbiBmb3IgVkFSIHdoZW4g KE9QIENPTkRfQ09ERSBMSU1JVCkgaXMKLSAgIHRydWUgYW5kIHN0b3JlIGl0IGluICpWUl9QLiAg Ki8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zvcl92YXJfZnJvbV9jb21wYXJp c29uX2V4cHIgKHRyZWUgdmFyLAotCQkJCQkJICAgICAgIGVudW0gdHJlZV9jb2RlIGNvbmRfY29k ZSwKLQkJCQkJCSAgICAgICB0cmVlIG9wLCB0cmVlIGxpbWl0LAotCQkJCQkJICAgICAgIHZhbHVl X3JhbmdlX2VxdWl2ICp2cl9wKQotewotICB0cmVlICBtaW4sIG1heCwgdHlwZTsKLSAgY29uc3Qg dmFsdWVfcmFuZ2VfZXF1aXYgKmxpbWl0X3ZyOwotICB0eXBlID0gVFJFRV9UWVBFICh2YXIpOwot Ci0gIC8qIEZvciBwb2ludGVyIGFyaXRobWV0aWMsIHdlIG9ubHkga2VlcCB0cmFjayBvZiBwb2lu dGVyIGVxdWFsaXR5Ci0gICAgIGFuZCBpbmVxdWFsaXR5LiAgSWYgd2UgYXJyaXZlIGhlcmUgd2l0 aCB1bmZvbGRlZCBjb25kaXRpb25zIGxpa2UKLSAgICAgXzEgPiBfMSBkbyBub3QgZGVyaXZlIGFu eXRoaW5nLiAgKi8KLSAgaWYgKChQT0lOVEVSX1RZUEVfUCAodHlwZSkgJiYgY29uZF9jb2RlICE9 IE5FX0VYUFIgJiYgY29uZF9jb2RlICE9IEVRX0VYUFIpCi0gICAgICB8fCBsaW1pdCA9PSB2YXIp Ci0gICAgewotICAgICAgdnJfcC0+c2V0X3ZhcnlpbmcgKHR5cGUpOwotICAgICAgcmV0dXJuOwot ICAgIH0KLQotICAvKiBJZiBMSU1JVCBpcyBhbm90aGVyIFNTQSBuYW1lIGFuZCBMSU1JVCBoYXMg YSByYW5nZSBvZiBpdHMgb3duLAotICAgICB0cnkgdG8gdXNlIExJTUlUJ3MgcmFuZ2UgdG8gYXZv aWQgY3JlYXRpbmcgc3ltYm9saWMgcmFuZ2VzCi0gICAgIHVubmVjZXNzYXJpbHkuICovCi0gIGxp bWl0X3ZyID0gKFRSRUVfQ09ERSAobGltaXQpID09IFNTQV9OQU1FKSA/IGdldF92YWx1ZV9yYW5n ZSAobGltaXQpIDogTlVMTDsKLQotICAvKiBMSU1JVCdzIHJhbmdlIGlzIG9ubHkgaW50ZXJlc3Rp bmcgaWYgaXQgaGFzIGFueSB1c2VmdWwgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBsaW1pdF92 cgotICAgICAgfHwgbGltaXRfdnItPnVuZGVmaW5lZF9wICgpCi0gICAgICB8fCBsaW1pdF92ci0+ dmFyeWluZ19wICgpCi0gICAgICB8fCAobGltaXRfdnItPnN5bWJvbGljX3AgKCkKLQkgICYmICEg KGxpbWl0X3ZyLT5raW5kICgpID09IFZSX1JBTkdFCi0JCSYmIChsaW1pdF92ci0+bWluICgpID09 IGxpbWl0X3ZyLT5tYXggKCkKLQkJICAgIHx8IG9wZXJhbmRfZXF1YWxfcCAobGltaXRfdnItPm1p biAoKSwKLQkJCQkJbGltaXRfdnItPm1heCAoKSwgMCkpKSkpCi0gICAgbGltaXRfdnIgPSBOVUxM OwotCi0gIC8qIEluaXRpYWxseSwgdGhlIG5ldyByYW5nZSBoYXMgdGhlIHNhbWUgc2V0IG9mIGVx dWl2YWxlbmNlcyBvZgotICAgICBWQVIncyByYW5nZS4gIFRoaXMgd2lsbCBiZSByZXZpc2VkIGJl Zm9yZSByZXR1cm5pbmcgdGhlIGZpbmFsCi0gICAgIHZhbHVlLiAgU2luY2UgYXNzZXJ0aW9ucyBt YXkgYmUgY2hhaW5lZCB2aWEgbXV0dWFsbHkgZXhjbHVzaXZlCi0gICAgIHByZWRpY2F0ZXMsIHdl IHdpbGwgbmVlZCB0byB0cmltIHRoZSBzZXQgb2YgZXF1aXZhbGVuY2VzIGJlZm9yZQotICAgICB3 ZSBhcmUgZG9uZS4gICovCi0gIGdjY19hc3NlcnQgKHZyX3AtPmVxdWl2ICgpID09IE5VTEwpOwot ICB2cl9wLT5lcXVpdl9hZGQgKHZhciwgZ2V0X3ZhbHVlX3JhbmdlICh2YXIpLCAmdnJwX2VxdWl2 X29ic3RhY2spOwotCi0gIC8qIEV4dHJhY3QgYSBuZXcgcmFuZ2UgYmFzZWQgb24gdGhlIGFzc2Vy dGVkIGNvbXBhcmlzb24gZm9yIFZBUiBhbmQKLSAgICAgTElNSVQncyB2YWx1ZSByYW5nZS4gIE5v dGljZSB0aGF0IGlmIExJTUlUIGhhcyBhbiBhbnRpLXJhbmdlLCB3ZQotICAgICB3aWxsIG9ubHkg dXNlIGl0IGZvciBlcXVhbGl0eSBjb21wYXJpc29ucyAoRVFfRVhQUikuICBGb3IgYW55Ci0gICAg IG90aGVyIGtpbmQgb2YgYXNzZXJ0aW9uLCB3ZSBjYW5ub3QgZGVyaXZlIGEgcmFuZ2UgZnJvbSBM SU1JVCdzCi0gICAgIGFudGktcmFuZ2UgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXNjcmliZSB0aGUg bmV3IHJhbmdlLiAgRm9yCi0gICAgIGluc3RhbmNlLCBBU1NFUlRfRVhQUiA8eF8yLCB4XzIgPD0g Yl80Pi4gIElmIGJfNCBpcyB+WzIsIDEwXSwKLSAgICAgdGhlbiBiXzQgdGFrZXMgb24gdGhlIHJh bmdlcyBbLUlORiwgMV0gYW5kIFsxMSwgK0lORl0uICBUaGVyZSBpcwotICAgICBubyBzaW5nbGUg cmFuZ2UgZm9yIHhfMiB0aGF0IGNvdWxkIGRlc2NyaWJlIExFX0VYUFIsIHNvIHdlIG1pZ2h0Ci0g ICAgIGFzIHdlbGwgYnVpbGQgdGhlIHJhbmdlIFtiXzQsICtJTkZdIGZvciBpdC4KLSAgICAgT25l IHNwZWNpYWwgY2FzZSB3ZSBoYW5kbGUgaXMgZXh0cmFjdGluZyBhIHJhbmdlIGZyb20gYQotICAg ICByYW5nZSB0ZXN0IGVuY29kZWQgYXMgKHVuc2lnbmVkKXZhciArIENTVCA8PSBsaW1pdC4gICov Ci0gIGlmIChUUkVFX0NPREUgKG9wKSA9PSBOT1BfRVhQUgotICAgICAgfHwgVFJFRV9DT0RFIChv cCkgPT0gUExVU19FWFBSKQotICAgIHsKLSAgICAgIGlmIChUUkVFX0NPREUgKG9wKSA9PSBQTFVT X0VYUFIpCi0gICAgICAgIHsKLQkgIG1pbiA9IGZvbGRfYnVpbGQxIChORUdBVEVfRVhQUiwgVFJF RV9UWVBFIChUUkVFX09QRVJBTkQgKG9wLCAxKSksCi0JCQkgICAgIFRSRUVfT1BFUkFORCAob3As IDEpKTsKLSAgICAgICAgICBtYXggPSBpbnRfY29uc3RfYmlub3AgKFBMVVNfRVhQUiwgbGltaXQs IG1pbik7Ci0JICBvcCA9IFRSRUVfT1BFUkFORCAob3AsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7 Ci0JICBtaW4gPSBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUgKHZhciksIDApOwotCSAgbWF4ID0g bGltaXQ7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdG8gbm90IHNldCBUUkVFX09WRVJGTE9X IG9uIHRoZSBmaW5hbCB0eXBlCi0JIGNvbnZlcnNpb24uICBXZSBhcmUgd2lsbGluZ2x5IGludGVy cHJldGluZyBsYXJnZSBwb3NpdGl2ZQotCSB1bnNpZ25lZCB2YWx1ZXMgYXMgbmVnYXRpdmUgc2ln bmVkIHZhbHVlcyBoZXJlLiAgKi8KLSAgICAgIG1pbiA9IGZvcmNlX2ZpdF90eXBlIChUUkVFX1RZ UEUgKHZhciksIHdpOjp0b193aWRlc3QgKG1pbiksIDAsIGZhbHNlKTsKLSAgICAgIG1heCA9IGZv cmNlX2ZpdF90eXBlIChUUkVFX1RZUEUgKHZhciksIHdpOjp0b193aWRlc3QgKG1heCksIDAsIGZh bHNlKTsKLQotICAgICAgLyogV2UgY2FuIHRyYW5zZm9ybSBhIG1heCwgbWluIHJhbmdlIHRvIGFu IGFudGktcmFuZ2Ugb3IKLSAgICAgICAgIHZpY2UtdmVyc2EuICBVc2Ugc2V0X2FuZF9jYW5vbmlj YWxpemUgd2hpY2ggZG9lcyB0aGlzIGZvcgotICAgICAgICAgdXMuICAqLwotICAgICAgaWYgKGNv bmRfY29kZSA9PSBMRV9FWFBSKQotCXZyX3AtPnNldCAobWluLCBtYXgsIHZyX3AtPmVxdWl2ICgp KTsKLSAgICAgIGVsc2UgaWYgKGNvbmRfY29kZSA9PSBHVF9FWFBSKQotCXZyX3AtPnNldCAobWlu LCBtYXgsIHZyX3AtPmVxdWl2ICgpLCBWUl9BTlRJX1JBTkdFKTsKLSAgICAgIGVsc2UKLQlnY2Nf dW5yZWFjaGFibGUgKCk7Ci0gICAgfQotICBlbHNlIGlmIChjb25kX2NvZGUgPT0gRVFfRVhQUikK LSAgICB7Ci0gICAgICBlbnVtIHZhbHVlX3JhbmdlX2tpbmQgcmFuZ2Vfa2luZDsKLQotICAgICAg aWYgKGxpbWl0X3ZyKQotCXsKLQkgIHJhbmdlX2tpbmQgPSBsaW1pdF92ci0+a2luZCAoKTsKLQkg IG1pbiA9IGxpbWl0X3ZyLT5taW4gKCk7Ci0JICBtYXggPSBsaW1pdF92ci0+bWF4ICgpOwotCX0K LSAgICAgIGVsc2UKLQl7Ci0JICByYW5nZV9raW5kID0gVlJfUkFOR0U7Ci0JICBtaW4gPSBsaW1p dDsKLQkgIG1heCA9IGxpbWl0OwotCX0KLQotICAgICAgdnJfcC0+dXBkYXRlIChtaW4sIG1heCwg cmFuZ2Vfa2luZCk7Ci0KLSAgICAgIC8qIFdoZW4gYXNzZXJ0aW5nIHRoZSBlcXVhbGl0eSBWQVIg PT0gTElNSVQgYW5kIExJTUlUIGlzIGFub3RoZXIKLQkgU1NBIG5hbWUsIHRoZSBuZXcgcmFuZ2Ug d2lsbCBhbHNvIGluaGVyaXQgdGhlIGVxdWl2YWxlbmNlIHNldAotCSBmcm9tIExJTUlULiAgKi8K LSAgICAgIGlmIChUUkVFX0NPREUgKGxpbWl0KSA9PSBTU0FfTkFNRSkKLQl2cl9wLT5lcXVpdl9h ZGQgKGxpbWl0LCBnZXRfdmFsdWVfcmFuZ2UgKGxpbWl0KSwgJnZycF9lcXVpdl9vYnN0YWNrKTsK LSAgICB9Ci0gIGVsc2UgaWYgKGNvbmRfY29kZSA9PSBORV9FWFBSKQotICAgIHsKLSAgICAgIC8q IEFzIGRlc2NyaWJlZCBhYm92ZSwgd2hlbiBMSU1JVCdzIHJhbmdlIGlzIGFuIGFudGktcmFuZ2Ug YW5kCi0JIHRoaXMgYXNzZXJ0aW9uIGlzIGFuIGluZXF1YWxpdHkgKE5FX0VYUFIpLCB0aGVuIHdl IGNhbm5vdAotCSBkZXJpdmUgYW55dGhpbmcgZnJvbSB0aGUgYW50aS1yYW5nZS4gIEZvciBpbnN0 YW5jZSwgaWYKLQkgTElNSVQncyByYW5nZSB3YXMgflswLCAwXSwgdGhlIGFzc2VydGlvbiAnVkFS ICE9IExJTUlUJyBkb2VzCi0JIG5vdCBpbXBseSB0aGF0IFZBUidzIHJhbmdlIGlzIFswLCAwXS4g IFNvLCBpbiB0aGUgY2FzZSBvZgotCSBhbnRpLXJhbmdlcywgd2UganVzdCBhc3NlcnQgdGhlIGlu ZXF1YWxpdHkgdXNpbmcgTElNSVQgYW5kCi0JIG5vdCBpdHMgYW50aS1yYW5nZS4KLQotCSBJZiBM SU1JVF9WUiBpcyBhIHJhbmdlLCB3ZSBjYW4gb25seSB1c2UgaXQgdG8gYnVpbGQgYSBuZXcKLQkg YW50aS1yYW5nZSBpZiBMSU1JVF9WUiBpcyBhIHNpbmdsZS12YWx1ZWQgcmFuZ2UuICBGb3IKLQkg aW5zdGFuY2UsIGlmIExJTUlUX1ZSIGlzIFswLCAxXSwgdGhlIHByZWRpY2F0ZQotCSBWQVIgIT0g WzAsIDFdIGRvZXMgbm90IG1lYW4gdGhhdCBWQVIncyByYW5nZSBpcyB+WzAsIDFdLgotCSBSYXRo ZXIsIGl0IG1lYW5zIHRoYXQgZm9yIHZhbHVlIDAgVkFSIHNob3VsZCBiZSB+WzAsIDBdCi0JIGFu ZCBmb3IgdmFsdWUgMSwgVkFSIHNob3VsZCBiZSB+WzEsIDFdLiAgV2UgY2Fubm90Ci0JIHJlcHJl c2VudCB0aGVzZSByYW5nZXMuCi0KLQkgVGhlIG9ubHkgc2l0dWF0aW9uIGluIHdoaWNoIHdlIGNh biBidWlsZCBhIHZhbGlkCi0JIGFudGktcmFuZ2UgaXMgd2hlbiBMSU1JVF9WUiBpcyBhIHNpbmds ZS12YWx1ZWQgcmFuZ2UKLQkgKGkuZS4sIExJTUlUX1ZSLT5NSU4gPT0gTElNSVRfVlItPk1BWCku ICBJbiB0aGF0IGNhc2UsCi0JIGJ1aWxkIHRoZSBhbnRpLXJhbmdlIH5bTElNSVRfVlItPk1JTiwg TElNSVRfVlItPk1BWF0uICAqLwotICAgICAgaWYgKGxpbWl0X3ZyCi0JICAmJiBsaW1pdF92ci0+ a2luZCAoKSA9PSBWUl9SQU5HRQotCSAgJiYgY29tcGFyZV92YWx1ZXMgKGxpbWl0X3ZyLT5taW4g KCksIGxpbWl0X3ZyLT5tYXggKCkpID09IDApCi0JewotCSAgbWluID0gbGltaXRfdnItPm1pbiAo KTsKLQkgIG1heCA9IGxpbWl0X3ZyLT5tYXggKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8q IEluIGFueSBvdGhlciBjYXNlLCB3ZSBjYW5ub3QgdXNlIExJTUlUJ3MgcmFuZ2UgdG8gYnVpbGQg YQotCSAgICAgdmFsaWQgYW50aS1yYW5nZS4gICovCi0JICBtaW4gPSBtYXggPSBsaW1pdDsKLQl9 Ci0KLSAgICAgIC8qIElmIE1JTiBhbmQgTUFYIGNvdmVyIHRoZSB3aG9sZSByYW5nZSBmb3IgdGhl aXIgdHlwZSwgdGhlbgotCSBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgTElNSVQuICAqLwotICAgICAg aWYgKElOVEVHUkFMX1RZUEVfUCAodHlwZSkKLQkgICYmIHZycF92YWxfaXNfbWluIChtaW4pCi0J ICAmJiB2cnBfdmFsX2lzX21heCAobWF4KSkKLQltaW4gPSBtYXggPSBsaW1pdDsKLQotICAgICAg dnJfcC0+c2V0IChtaW4sIG1heCwgdnJfcC0+ZXF1aXYgKCksIFZSX0FOVElfUkFOR0UpOwotICAg IH0KLSAgZWxzZSBpZiAoY29uZF9jb2RlID09IExFX0VYUFIgfHwgY29uZF9jb2RlID09IExUX0VY UFIpCi0gICAgewotICAgICAgbWluID0gVFlQRV9NSU5fVkFMVUUgKHR5cGUpOwotCi0gICAgICBp ZiAobGltaXRfdnIgPT0gTlVMTCB8fCBsaW1pdF92ci0+a2luZCAoKSA9PSBWUl9BTlRJX1JBTkdF KQotCW1heCA9IGxpbWl0OwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIExJTUlUX1ZSIGlzIG9m IHRoZSBmb3JtIFtOMSwgTjJdLCB3ZSBuZWVkIHRvIGJ1aWxkIHRoZQotCSAgICAgcmFuZ2UgW01J TiwgTjJdIGZvciBMRV9FWFBSIGFuZCBbTUlOLCBOMiAtIDFdIGZvcgotCSAgICAgTFRfRVhQUi4g ICovCi0JICBtYXggPSBsaW1pdF92ci0+bWF4ICgpOwotCX0KLQotICAgICAgLyogSWYgdGhlIG1h eGltdW0gdmFsdWUgZm9yY2VzIHVzIHRvIGJlIG91dCBvZiBib3VuZHMsIHNpbXBseSBwdW50Lgot CSBJdCB3b3VsZCBiZSBwb2ludGxlc3MgdG8gdHJ5IGFuZCBkbyBhbnl0aGluZyBtb3JlIHNpbmNl IHRoaXMKLQkgYWxsIHNob3VsZCBiZSBvcHRpbWl6ZWQgYXdheSBhYm92ZSB1cy4gICovCi0gICAg ICBpZiAoY29uZF9jb2RlID09IExUX0VYUFIKLQkgICYmIGNvbXBhcmVfdmFsdWVzIChtYXgsIG1p bikgPT0gMCkKLQl2cl9wLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChtaW4pKTsKLSAgICAgIGVs c2UKLQl7Ci0JICAvKiBGb3IgTFRfRVhQUiwgd2UgY3JlYXRlIHRoZSByYW5nZSBbTUlOLCBNQVgg LSAxXS4gICovCi0JICBpZiAoY29uZF9jb2RlID09IExUX0VYUFIpCi0JICAgIHsKLQkgICAgICBp ZiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobWF4KSkgPT0gMQotCQkgICYmICFUWVBFX1VO U0lHTkVEIChUUkVFX1RZUEUgKG1heCkpKQotCQltYXggPSBmb2xkX2J1aWxkMiAoUExVU19FWFBS LCBUUkVFX1RZUEUgKG1heCksIG1heCwKLQkJCQkgICBidWlsZF9pbnRfY3N0IChUUkVFX1RZUEUg KG1heCksIC0xKSk7Ci0JICAgICAgZWxzZQotCQltYXggPSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQ UiwgVFJFRV9UWVBFIChtYXgpLCBtYXgsCi0JCQkJICAgYnVpbGRfaW50X2NzdCAoVFJFRV9UWVBF IChtYXgpLCAxKSk7Ci0JICAgICAgLyogU2lnbmFsIHRvIGNvbXBhcmVfdmFsdWVzX3dhcm52IHRo aXMgZXhwciBkb2Vzbid0IG92ZXJmbG93LiAgKi8KLQkgICAgICBpZiAoRVhQUl9QIChtYXgpKQot CQlzdXBwcmVzc193YXJuaW5nIChtYXgsIE9QVF9Xb3ZlcmZsb3cpOwotCSAgICB9Ci0KLQkgIHZy X3AtPnVwZGF0ZSAobWluLCBtYXgpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGNvbmRfY29kZSA9 PSBHRV9FWFBSIHx8IGNvbmRfY29kZSA9PSBHVF9FWFBSKQotICAgIHsKLSAgICAgIG1heCA9IFRZ UEVfTUFYX1ZBTFVFICh0eXBlKTsKLQotICAgICAgaWYgKGxpbWl0X3ZyID09IE5VTEwgfHwgbGlt aXRfdnItPmtpbmQgKCkgPT0gVlJfQU5USV9SQU5HRSkKLQltaW4gPSBsaW1pdDsKLSAgICAgIGVs c2UKLQl7Ci0JICAvKiBJZiBMSU1JVF9WUiBpcyBvZiB0aGUgZm9ybSBbTjEsIE4yXSwgd2UgbmVl ZCB0byBidWlsZCB0aGUKLQkgICAgIHJhbmdlIFtOMSwgTUFYXSBmb3IgR0VfRVhQUiBhbmQgW04x ICsgMSwgTUFYXSBmb3IKLQkgICAgIEdUX0VYUFIuICAqLwotCSAgbWluID0gbGltaXRfdnItPm1p biAoKTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBtaW5pbXVtIHZhbHVlIGZvcmNlcyB1cyB0byBi ZSBvdXQgb2YgYm91bmRzLCBzaW1wbHkgcHVudC4KLQkgSXQgd291bGQgYmUgcG9pbnRsZXNzIHRv IHRyeSBhbmQgZG8gYW55dGhpbmcgbW9yZSBzaW5jZSB0aGlzCi0JIGFsbCBzaG91bGQgYmUgb3B0 aW1pemVkIGF3YXkgYWJvdmUgdXMuICAqLwotICAgICAgaWYgKGNvbmRfY29kZSA9PSBHVF9FWFBS Ci0JICAmJiBjb21wYXJlX3ZhbHVlcyAobWluLCBtYXgpID09IDApCi0JdnJfcC0+c2V0X3Zhcnlp bmcgKFRSRUVfVFlQRSAobWluKSk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogRm9yIEdUX0VYUFIs IHdlIGNyZWF0ZSB0aGUgcmFuZ2UgW01JTiArIDEsIE1BWF0uICAqLwotCSAgaWYgKGNvbmRfY29k ZSA9PSBHVF9FWFBSKQotCSAgICB7Ci0JICAgICAgaWYgKFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZ UEUgKG1pbikpID09IDEKLQkJICAmJiAhVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChtaW4pKSkK LQkJbWluID0gZm9sZF9idWlsZDIgKE1JTlVTX0VYUFIsIFRSRUVfVFlQRSAobWluKSwgbWluLAot CQkJCSAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAobWluKSwgLTEpKTsKLQkgICAgICBlbHNl Ci0JCW1pbiA9IGZvbGRfYnVpbGQyIChQTFVTX0VYUFIsIFRSRUVfVFlQRSAobWluKSwgbWluLAot CQkJCSAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAobWluKSwgMSkpOwotCSAgICAgIC8qIFNp Z25hbCB0byBjb21wYXJlX3ZhbHVlc193YXJudiB0aGlzIGV4cHIgZG9lc24ndCBvdmVyZmxvdy4g ICovCi0JICAgICAgaWYgKEVYUFJfUCAobWluKSkKLQkJc3VwcHJlc3Nfd2FybmluZyAobWluLCBP UFRfV292ZXJmbG93KTsKLQkgICAgfQotCi0JICB2cl9wLT51cGRhdGUgKG1pbiwgbWF4KTsKLQl9 Ci0gICAgfQotICBlbHNlCi0gICAgZ2NjX3VucmVhY2hhYmxlICgpOwotCi0gIC8qIEZpbmFsbHkg aW50ZXJzZWN0IHRoZSBuZXcgcmFuZ2Ugd2l0aCB3aGF0IHdlIGFscmVhZHkga25vdyBhYm91dCB2 YXIuICAqLwotICB2cl9wLT5sZWdhY3lfdmVyYm9zZV9pbnRlcnNlY3QgKGdldF92YWx1ZV9yYW5n ZSAodmFyKSk7Ci19Ci0KLS8qIEV4dHJhY3QgdmFsdWUgcmFuZ2UgaW5mb3JtYXRpb24gZnJvbSBh biBBU1NFUlRfRVhQUiBFWFBSIGFuZCBzdG9yZQotICAgaXQgaW4gKlZSX1AuICAqLwotCi12b2lk Ci12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9hc3NlcnQgKHZhbHVlX3JhbmdlX2VxdWl2 ICp2cl9wLCB0cmVlIGV4cHIpCi17Ci0gIHRyZWUgdmFyID0gQVNTRVJUX0VYUFJfVkFSIChleHBy KTsKLSAgdHJlZSBjb25kID0gQVNTRVJUX0VYUFJfQ09ORCAoZXhwcik7Ci0gIHRyZWUgbGltaXQs IG9wOwotICBlbnVtIHRyZWVfY29kZSBjb25kX2NvZGU7Ci0gIGdjY19hc3NlcnQgKENPTVBBUklT T05fQ0xBU1NfUCAoY29uZCkpOwotCi0gIC8qIEZpbmQgVkFSIGluIHRoZSBBU1NFUlRfRVhQUiBj b25kaXRpb25hbC4gICovCi0gIGlmICh2YXIgPT0gVFJFRV9PUEVSQU5EIChjb25kLCAwKQotICAg ICAgfHwgVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKGNvbmQsIDApKSA9PSBQTFVTX0VYUFIKLSAg ICAgIHx8IFRSRUVfQ09ERSAoVFJFRV9PUEVSQU5EIChjb25kLCAwKSkgPT0gTk9QX0VYUFIpCi0g ICAgewotICAgICAgLyogSWYgdGhlIHByZWRpY2F0ZSBpcyBvZiB0aGUgZm9ybSBWQVIgQ09NUCBM SU1JVCwgdGhlbiB3ZSBqdXN0Ci0JIHRha2UgTElNSVQgZnJvbSB0aGUgUkhTIGFuZCB1c2UgdGhl IHNhbWUgY29tcGFyaXNvbiBjb2RlLiAgKi8KLSAgICAgIGNvbmRfY29kZSA9IFRSRUVfQ09ERSAo Y29uZCk7Ci0gICAgICBsaW1pdCA9IFRSRUVfT1BFUkFORCAoY29uZCwgMSk7Ci0gICAgICBvcCA9 IFRSRUVfT1BFUkFORCAoY29uZCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyog SWYgdGhlIHByZWRpY2F0ZSBpcyBvZiB0aGUgZm9ybSBMSU1JVCBDT01QIFZBUiwgdGhlbiB3ZSBu ZWVkCi0JIHRvIGZsaXAgYXJvdW5kIHRoZSBjb21wYXJpc29uIGNvZGUgdG8gY3JlYXRlIHRoZSBw cm9wZXIgcmFuZ2UKLQkgZm9yIFZBUi4gICovCi0gICAgICBjb25kX2NvZGUgPSBzd2FwX3RyZWVf Y29tcGFyaXNvbiAoVFJFRV9DT0RFIChjb25kKSk7Ci0gICAgICBsaW1pdCA9IFRSRUVfT1BFUkFO RCAoY29uZCwgMCk7Ci0gICAgICBvcCA9IFRSRUVfT1BFUkFORCAoY29uZCwgMSk7Ci0gICAgfQot ICBleHRyYWN0X3JhbmdlX2Zvcl92YXJfZnJvbV9jb21wYXJpc29uX2V4cHIgKHZhciwgY29uZF9j b2RlLCBvcCwKLQkJCQkJICAgICAgbGltaXQsIHZyX3ApOwotfQotCi0vKiBFeHRyYWN0IHJhbmdl IGluZm9ybWF0aW9uIGZyb20gU1NBIG5hbWUgVkFSIGFuZCBzdG9yZSBpdCBpbiBWUi4gIElmCi0g ICBWQVIgaGFzIGFuIGludGVyZXN0aW5nIHJhbmdlLCB1c2UgaXQuICBPdGhlcndpc2UsIGNyZWF0 ZSB0aGUKLSAgIHJhbmdlIFtWQVIsIFZBUl0gYW5kIHJldHVybiBpdC4gIFRoaXMgaXMgdXNlZnVs IGluIHNpdHVhdGlvbnMgd2hlcmUKLSAgIHdlIG1heSBoYXZlIGNvbmRpdGlvbmFscyB0ZXN0aW5n IHZhbHVlcyBvZiBWQVJZSU5HIG5hbWVzLiAgRm9yCi0gICBpbnN0YW5jZSwKLQotICAgCXhfMyA9 IHlfNTsKLQlpZiAoeF8zID4geV81KQotCSAgLi4uCi0KLSAgICBFdmVuIGlmIHlfNSBpcyBkZWVt ZWQgVkFSWUlORywgd2UgY2FuIGRldGVybWluZSB0aGF0IHhfMyA+IHlfNSBpcwotICAgIGFsd2F5 cyBmYWxzZS4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9mcm9tX3NzYV9u YW1lICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIsIHRyZWUgdmFyKQotewotICBjb25zdCB2YWx1ZV9y YW5nZV9lcXVpdiAqdmFyX3ZyID0gZ2V0X3ZhbHVlX3JhbmdlICh2YXIpOwotCi0gIGlmICghdmFy X3ZyLT52YXJ5aW5nX3AgKCkpCi0gICAgdnItPmRlZXBfY29weSAodmFyX3ZyKTsKLSAgZWxzZQot ICAgIHZyLT5zZXQgKHZhcik7Ci0KLSAgaWYgKCF2ci0+dW5kZWZpbmVkX3AgKCkpCi0gICAgdnIt PmVxdWl2X2FkZCAodmFyLCBnZXRfdmFsdWVfcmFuZ2UgKHZhciksICZ2cnBfZXF1aXZfb2JzdGFj ayk7Ci19Ci0KLS8qIEV4dHJhY3QgcmFuZ2UgaW5mb3JtYXRpb24gZnJvbSBhIGJpbmFyeSBleHBy ZXNzaW9uIE9QMCBDT0RFIE9QMSBiYXNlZCBvbgotICAgdGhlIHJhbmdlcyBvZiBlYWNoIG9mIGl0 cyBvcGVyYW5kcyB3aXRoIHJlc3VsdGluZyB0eXBlIEVYUFJfVFlQRS4KLSAgIFRoZSByZXN1bHRp bmcgcmFuZ2UgaXMgc3RvcmVkIGluICpWUi4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFj dF9yYW5nZV9mcm9tX2JpbmFyeV9leHByICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIsCi0JCQkJCSAg IGVudW0gdHJlZV9jb2RlIGNvZGUsCi0JCQkJCSAgIHRyZWUgZXhwcl90eXBlLCB0cmVlIG9wMCwg dHJlZSBvcDEpCi17Ci0gIC8qIEdldCB2YWx1ZSByYW5nZXMgZm9yIGVhY2ggb3BlcmFuZC4gIEZv ciBjb25zdGFudCBvcGVyYW5kcywgY3JlYXRlCi0gICAgIGEgbmV3IHZhbHVlIHJhbmdlIHdpdGgg dGhlIG9wZXJhbmQgdG8gc2ltcGxpZnkgcHJvY2Vzc2luZy4gICovCi0gIHZhbHVlX3JhbmdlIHZy MCwgdnIxOwotICBpZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FKQotICAgIHZyMCA9ICoo Z2V0X3ZhbHVlX3JhbmdlIChvcDApKTsKLSAgZWxzZSBpZiAoaXNfZ2ltcGxlX21pbl9pbnZhcmlh bnQgKG9wMCkpCi0gICAgdnIwLnNldCAob3AwLCBvcDApOwotICBlbHNlCi0gICAgdnIwLnNldF92 YXJ5aW5nIChUUkVFX1RZUEUgKG9wMCkpOwotCi0gIGlmIChUUkVFX0NPREUgKG9wMSkgPT0gU1NB X05BTUUpCi0gICAgdnIxID0gKihnZXRfdmFsdWVfcmFuZ2UgKG9wMSkpOwotICBlbHNlIGlmIChp c19naW1wbGVfbWluX2ludmFyaWFudCAob3AxKSkKLSAgICB2cjEuc2V0IChvcDEsIG9wMSk7Ci0g IGVsc2UKLSAgICB2cjEuc2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAob3AxKSk7Ci0KLSAgLyogSWYg b25lIGFyZ3VtZW50IGlzIHZhcnlpbmcsIHdlIGNhbiBzb21ldGltZXMgc3RpbGwgZGVkdWNlIGEK LSAgICAgcmFuZ2UgZm9yIHRoZSBvdXRwdXQ6IGFueSArIFszLCArSU5GXSBpcyBpbiBbTUlOKzMs ICtJTkZdLiAgKi8KLSAgaWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChvcDApKQotICAg ICAgJiYgVFlQRV9PVkVSRkxPV19VTkRFRklORUQgKFRSRUVfVFlQRSAob3AwKSkpCi0gICAgewot ICAgICAgaWYgKHZyMC52YXJ5aW5nX3AgKCkgJiYgIXZyMS52YXJ5aW5nX3AgKCkpCi0JdnIwID0g dmFsdWVfcmFuZ2UgKHZycF92YWxfbWluIChleHByX3R5cGUpLCB2cnBfdmFsX21heCAoZXhwcl90 eXBlKSk7Ci0gICAgICBlbHNlIGlmICh2cjEudmFyeWluZ19wICgpICYmICF2cjAudmFyeWluZ19w ICgpKQotCXZyMSA9IHZhbHVlX3JhbmdlICh2cnBfdmFsX21pbiAoZXhwcl90eXBlKSwgdnJwX3Zh bF9tYXggKGV4cHJfdHlwZSkpOwotICAgIH0KLQotICByYW5nZV9mb2xkX2JpbmFyeV9leHByICh2 ciwgY29kZSwgZXhwcl90eXBlLCAmdnIwLCAmdnIxKTsKLQotICAvKiBTZXQgdmFsdWVfcmFuZ2Ug Zm9yIG4gaW4gZm9sbG93aW5nIHNlcXVlbmNlOgotICAgICBkZWYgPSBfX2J1aWx0aW5fbWVtY2hy IChhcmcsIDAsIHN6KQotICAgICBuID0gZGVmIC0gYXJnCi0gICAgIEhlcmUgdGhlIHJhbmdlIGZv ciBuIGNhbiBiZSBzZXQgdG8gWzAsIFBUUkRJRkZfTUFYIC0gMV0uICovCi0KLSAgaWYgKHZyLT52 YXJ5aW5nX3AgKCkKLSAgICAgICYmIGNvZGUgPT0gUE9JTlRFUl9ESUZGX0VYUFIKLSAgICAgICYm IFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRQotICAgICAgJiYgVFJFRV9DT0RFIChvcDEpID09 IFNTQV9OQU1FKQotICAgIHsKLSAgICAgIHRyZWUgb3AwX3B0eXBlID0gVFJFRV9UWVBFIChUUkVF X1RZUEUgKG9wMCkpOwotICAgICAgdHJlZSBvcDFfcHR5cGUgPSBUUkVFX1RZUEUgKFRSRUVfVFlQ RSAob3AxKSk7Ci0gICAgICBnY2FsbCAqY2FsbF9zdG10ID0gTlVMTDsKLQotICAgICAgaWYgKFRZ UEVfTU9ERSAob3AwX3B0eXBlKSA9PSBUWVBFX01PREUgKGNoYXJfdHlwZV9ub2RlKQotCSAgJiYg VFlQRV9QUkVDSVNJT04gKG9wMF9wdHlwZSkgPT0gVFlQRV9QUkVDSVNJT04gKGNoYXJfdHlwZV9u b2RlKQotCSAgJiYgVFlQRV9NT0RFIChvcDFfcHR5cGUpID09IFRZUEVfTU9ERSAoY2hhcl90eXBl X25vZGUpCi0JICAmJiBUWVBFX1BSRUNJU0lPTiAob3AxX3B0eXBlKSA9PSBUWVBFX1BSRUNJU0lP TiAoY2hhcl90eXBlX25vZGUpCi0JICAmJiAoY2FsbF9zdG10ID0gZHluX2Nhc3Q8Z2NhbGwgKj4o U1NBX05BTUVfREVGX1NUTVQgKG9wMCkpKQotCSAgJiYgZ2ltcGxlX2NhbGxfYnVpbHRpbl9wIChj YWxsX3N0bXQsIEJVSUxUX0lOX01FTUNIUikKLQkgICYmIG9wZXJhbmRfZXF1YWxfcCAob3AwLCBn aW1wbGVfY2FsbF9saHMgKGNhbGxfc3RtdCksIDApCi0JICAmJiBvcGVyYW5kX2VxdWFsX3AgKG9w MSwgZ2ltcGxlX2NhbGxfYXJnIChjYWxsX3N0bXQsIDApLCAwKQotCSAgJiYgaW50ZWdlcl96ZXJv cCAoZ2ltcGxlX2NhbGxfYXJnIChjYWxsX3N0bXQsIDEpKSkKLQkgICAgewotCSAgICAgIHRyZWUg bWF4ID0gdnJwX3ZhbF9tYXggKHB0cmRpZmZfdHlwZV9ub2RlKTsKLQkgICAgICB3aWRlX2ludCB3 bWF4ID0gd2k6OnRvX3dpZGUgKG1heCwgVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobWF4KSkp OwotCSAgICAgIHRyZWUgcmFuZ2VfbWluID0gYnVpbGRfemVyb19jc3QgKGV4cHJfdHlwZSk7Ci0J ICAgICAgdHJlZSByYW5nZV9tYXggPSB3aWRlX2ludF90b190cmVlIChleHByX3R5cGUsIHdtYXgg LSAxKTsKLQkgICAgICB2ci0+c2V0IChyYW5nZV9taW4sIHJhbmdlX21heCwgTlVMTCk7Ci0JICAg ICAgcmV0dXJuOwotCSAgICB9Ci0gICAgIH0KLQotICAvKiBUcnkgaGFyZGVyIGZvciBQTFVTIGFu ZCBNSU5VUyBpZiB0aGUgcmFuZ2Ugb2Ygb25lIG9wZXJhbmQgaXMgc3ltYm9saWMKLSAgICAgYW5k IGJhc2VkIG9uIHRoZSBvdGhlciBvcGVyYW5kLCBmb3IgZXhhbXBsZSBpZiBpdCB3YXMgZGVkdWNl ZCBmcm9tIGEKLSAgICAgc3ltYm9saWMgY29tcGFyaXNvbi4gIFdoZW4gYSBib3VuZCBvZiB0aGUg cmFuZ2Ugb2YgdGhlIGZpcnN0IG9wZXJhbmQKLSAgICAgaXMgaW52YXJpYW50LCB3ZSBzZXQgdGhl IGNvcnJlc3BvbmRpbmcgYm91bmQgb2YgdGhlIG5ldyByYW5nZSB0byBJTkYKLSAgICAgaW4gb3Jk ZXIgdG8gYXZvaWQgcmVjdXJzaW5nIG9uIHRoZSByYW5nZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmQu ICAqLwotICBpZiAodnItPnZhcnlpbmdfcCAoKQotICAgICAgJiYgKGNvZGUgPT0gUExVU19FWFBS IHx8IGNvZGUgPT0gTUlOVVNfRVhQUikKLSAgICAgICYmIFRSRUVfQ09ERSAob3AxKSA9PSBTU0Ff TkFNRQotICAgICAgJiYgdnIwLmtpbmQgKCkgPT0gVlJfUkFOR0UKLSAgICAgICYmIHN5bWJvbGlj X3JhbmdlX2Jhc2VkX29uX3AgKCZ2cjAsIG9wMSkpCi0gICAgewotICAgICAgY29uc3QgYm9vbCBt aW51c19wID0gKGNvZGUgPT0gTUlOVVNfRVhQUik7Ci0gICAgICB2YWx1ZV9yYW5nZSBuX3ZyMTsK LQotICAgICAgLyogVHJ5IHdpdGggVlIwIGFuZCBbLUlORiwgT1AxXS4gICovCi0gICAgICBpZiAo aXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKG1pbnVzX3AgPyB2cjAubWF4ICgpIDogdnIwLm1pbiAo KSkpCi0Jbl92cjEuc2V0ICh2cnBfdmFsX21pbiAoZXhwcl90eXBlKSwgb3AxKTsKLQotICAgICAg LyogVHJ5IHdpdGggVlIwIGFuZCBbT1AxLCArSU5GXS4gICovCi0gICAgICBlbHNlIGlmIChpc19n aW1wbGVfbWluX2ludmFyaWFudCAobWludXNfcCA/IHZyMC5taW4gKCkgOiB2cjAubWF4ICgpKSkK LQluX3ZyMS5zZXQgKG9wMSwgdnJwX3ZhbF9tYXggKGV4cHJfdHlwZSkpOwotCi0gICAgICAvKiBU cnkgd2l0aCBWUjAgYW5kIFtPUDEsIE9QMV0uICAqLwotICAgICAgZWxzZQotCW5fdnIxLnNldCAo b3AxLCBvcDEpOwotCi0gICAgICByYW5nZV9mb2xkX2JpbmFyeV9leHByICh2ciwgY29kZSwgZXhw cl90eXBlLCAmdnIwLCAmbl92cjEpOwotICAgIH0KLQotICBpZiAodnItPnZhcnlpbmdfcCAoKQot ICAgICAgJiYgKGNvZGUgPT0gUExVU19FWFBSIHx8IGNvZGUgPT0gTUlOVVNfRVhQUikKLSAgICAg ICYmIFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRQotICAgICAgJiYgdnIxLmtpbmQgKCkgPT0g VlJfUkFOR0UKLSAgICAgICYmIHN5bWJvbGljX3JhbmdlX2Jhc2VkX29uX3AgKCZ2cjEsIG9wMCkp Ci0gICAgewotICAgICAgY29uc3QgYm9vbCBtaW51c19wID0gKGNvZGUgPT0gTUlOVVNfRVhQUik7 Ci0gICAgICB2YWx1ZV9yYW5nZSBuX3ZyMDsKLQotICAgICAgLyogVHJ5IHdpdGggWy1JTkYsIE9Q MF0gYW5kIFZSMS4gICovCi0gICAgICBpZiAoaXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKG1pbnVz X3AgPyB2cjEubWF4ICgpIDogdnIxLm1pbiAoKSkpCi0Jbl92cjAuc2V0ICh2cnBfdmFsX21pbiAo ZXhwcl90eXBlKSwgb3AwKTsKLQotICAgICAgLyogVHJ5IHdpdGggW09QMCwgK0lORl0gYW5kIFZS MS4gICovCi0gICAgICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAobWludXNfcCA/ IHZyMS5taW4gKCk6IHZyMS5tYXggKCkpKQotCW5fdnIwLnNldCAob3AwLCB2cnBfdmFsX21heCAo ZXhwcl90eXBlKSk7Ci0KLSAgICAgIC8qIFRyeSB3aXRoIFtPUDAsIE9QMF0gYW5kIFZSMS4gICov Ci0gICAgICBlbHNlCi0Jbl92cjAuc2V0IChvcDAsIG9wMCk7Ci0KLSAgICAgIHJhbmdlX2ZvbGRf YmluYXJ5X2V4cHIgKHZyLCBjb2RlLCBleHByX3R5cGUsICZuX3ZyMCwgJnZyMSk7Ci0gICAgfQot Ci0gIC8qIElmIHdlIGRpZG4ndCBkZXJpdmUgYSByYW5nZSBmb3IgTUlOVVNfRVhQUiwgYW5kCi0g ICAgIG9wMSdzIHJhbmdlIGlzIH5bb3AwLG9wMF0gb3IgdmljZS12ZXJzYSwgdGhlbiB3ZQotICAg ICBjYW4gZGVyaXZlIGEgbm9uLW51bGwgcmFuZ2UuICBUaGlzIGhhcHBlbnMgb2Z0ZW4gZm9yCi0g ICAgIHBvaW50ZXIgc3VidHJhY3Rpb24uICAqLwotICBpZiAodnItPnZhcnlpbmdfcCAoKQotICAg ICAgJiYgKGNvZGUgPT0gTUlOVVNfRVhQUiB8fCBjb2RlID09IFBPSU5URVJfRElGRl9FWFBSKQot ICAgICAgJiYgVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FCi0gICAgICAmJiAoKHZyMC5raW5k ICgpID09IFZSX0FOVElfUkFOR0UKLQkgICAmJiB2cjAubWluICgpID09IG9wMQotCSAgICYmIHZy MC5taW4gKCkgPT0gdnIwLm1heCAoKSkKLQkgIHx8ICh2cjEua2luZCAoKSA9PSBWUl9BTlRJX1JB TkdFCi0JICAgICAgJiYgdnIxLm1pbiAoKSA9PSBvcDAKLQkgICAgICAmJiB2cjEubWluICgpID09 IHZyMS5tYXggKCkpKSkKLSAgICB7Ci0gICAgICB2ci0+c2V0X25vbnplcm8gKGV4cHJfdHlwZSk7 Ci0gICAgICB2ci0+ZXF1aXZfY2xlYXIgKCk7Ci0gICAgfQotfQotCi0vKiBFeHRyYWN0IHJhbmdl IGluZm9ybWF0aW9uIGZyb20gYSB1bmFyeSBleHByZXNzaW9uIENPREUgT1AwIGJhc2VkIG9uCi0g ICB0aGUgcmFuZ2Ugb2YgaXRzIG9wZXJhbmQgd2l0aCByZXN1bHRpbmcgdHlwZSBUWVBFLgotICAg VGhlIHJlc3VsdGluZyByYW5nZSBpcyBzdG9yZWQgaW4gKlZSLiAgKi8KLQotdm9pZAotdnJfdmFs dWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhwciAodmFsdWVfcmFuZ2VfZXF1aXYgKnZy LAotCQkJCQkgIGVudW0gdHJlZV9jb2RlIGNvZGUsCi0JCQkJCSAgdHJlZSB0eXBlLCB0cmVlIG9w MCkKLXsKLSAgdmFsdWVfcmFuZ2UgdnIwOwotCi0gIC8qIEdldCB2YWx1ZSByYW5nZXMgZm9yIHRo ZSBvcGVyYW5kLiAgRm9yIGNvbnN0YW50IG9wZXJhbmRzLCBjcmVhdGUKLSAgICAgYSBuZXcgdmFs dWUgcmFuZ2Ugd2l0aCB0aGUgb3BlcmFuZCB0byBzaW1wbGlmeSBwcm9jZXNzaW5nLiAgKi8KLSAg aWYgKFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRSkKLSAgICB2cjAgPSAqKGdldF92YWx1ZV9y YW5nZSAob3AwKSk7Ci0gIGVsc2UgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50IChvcDApKQot ICAgIHZyMC5zZXQgKG9wMCwgb3AwKTsKLSAgZWxzZQotICAgIHZyMC5zZXRfdmFyeWluZyAodHlw ZSk7Ci0KLSAgcmFuZ2VfZm9sZF91bmFyeV9leHByICh2ciwgY29kZSwgdHlwZSwgJnZyMCwgVFJF RV9UWVBFIChvcDApKTsKLX0KLQotCi0vKiBFeHRyYWN0IHJhbmdlIGluZm9ybWF0aW9uIGZyb20g YSBjb25kaXRpb25hbCBleHByZXNzaW9uIFNUTVQgYmFzZWQgb24KLSAgIHRoZSByYW5nZXMgb2Yg ZWFjaCBvZiBpdHMgb3BlcmFuZHMgYW5kIHRoZSBleHByZXNzaW9uIGNvZGUuICAqLwotCi12b2lk Ci12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9jb25kX2V4cHIgKHZhbHVlX3JhbmdlX2Vx dWl2ICp2ciwgZ2Fzc2lnbiAqc3RtdCkKLXsKLSAgLyogR2V0IHZhbHVlIHJhbmdlcyBmb3IgZWFj aCBvcGVyYW5kLiAgRm9yIGNvbnN0YW50IG9wZXJhbmRzLCBjcmVhdGUKLSAgICAgYSBuZXcgdmFs dWUgcmFuZ2Ugd2l0aCB0aGUgb3BlcmFuZCB0byBzaW1wbGlmeSBwcm9jZXNzaW5nLiAgKi8KLSAg dHJlZSBvcDAgPSBnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpOwotICB2YWx1ZV9yYW5nZV9lcXVp diB0ZW0wOwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIwID0gJnRlbTA7Ci0gIGlmIChU UkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUpCi0gICAgdnIwID0gZ2V0X3ZhbHVlX3JhbmdlIChv cDApOwotICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAob3AwKSkKLSAgICB0ZW0w LnNldCAob3AwKTsKLSAgZWxzZQotICAgIHRlbTAuc2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAob3Aw KSk7Ci0KLSAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczMgKHN0bXQpOwotICB2YWx1ZV9y YW5nZV9lcXVpdiB0ZW0xOwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIxID0gJnRlbTE7 Ci0gIGlmIChUUkVFX0NPREUgKG9wMSkgPT0gU1NBX05BTUUpCi0gICAgdnIxID0gZ2V0X3ZhbHVl X3JhbmdlIChvcDEpOwotICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAob3AxKSkK LSAgICB0ZW0xLnNldCAob3AxKTsKLSAgZWxzZQotICAgIHRlbTEuc2V0X3ZhcnlpbmcgKFRSRUVf VFlQRSAob3AxKSk7Ci0KLSAgLyogVGhlIHJlc3VsdGluZyB2YWx1ZSByYW5nZSBpcyB0aGUgdW5p b24gb2YgdGhlIG9wZXJhbmQgcmFuZ2VzICovCi0gIHZyLT5kZWVwX2NvcHkgKHZyMCk7Ci0gIHZy LT5sZWdhY3lfdmVyYm9zZV91bmlvbl8gKHZyMSk7Ci19Ci0KLQotLyogRXh0cmFjdCByYW5nZSBp bmZvcm1hdGlvbiBmcm9tIGEgY29tcGFyaXNvbiBleHByZXNzaW9uIEVYUFIgYmFzZWQKLSAgIG9u IHRoZSByYW5nZSBvZiBpdHMgb3BlcmFuZCBhbmQgdGhlIGV4cHJlc3Npb24gY29kZS4gICovCi0K LXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9mcm9tX2NvbXBhcmlzb24gKHZhbHVlX3Jh bmdlX2VxdWl2ICp2ciwKLQkJCQkJICBnaW1wbGUgKnN0bXQpCi17Ci0gIGVudW0gdHJlZV9jb2Rl IGNvZGUgPSBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KTsKLSAgdHJlZSB0eXBlID0gVFJF RV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoc3RtdCkpOwotICB0cmVlIG9wMCA9IGdpbXBsZV9h c3NpZ25fcmhzMSAoc3RtdCk7Ci0gIHRyZWUgb3AxID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChzdG10 KTsKLSAgYm9vbCBzb3A7Ci0gIHRyZWUgdmFsCi0gICAgPSBzaW1wbGlmaWVyLnZycF9ldmFsdWF0 ZV9jb25kaXRpb25hbF93YXJudl93aXRoX29wcyAoc3RtdCwgY29kZSwgb3AwLCBvcDEsCi0JCQkJ CQkJICBmYWxzZSwgJnNvcCwgTlVMTCk7Ci0gIGlmICh2YWwpCi0gICAgewotICAgICAgLyogU2lu Y2UgdGhpcyBleHByZXNzaW9uIHdhcyBmb3VuZCBvbiB0aGUgUkhTIG9mIGFuIGFzc2lnbm1lbnQs Ci0JIGl0cyB0eXBlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBfQm9vbC4gIENvbnZlcnQgVkFMIHRv IEVYUFIncwotCSB0eXBlLiAgKi8KLSAgICAgIHZhbCA9IGZvbGRfY29udmVydCAodHlwZSwgdmFs KTsKLSAgICAgIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAodmFsKSkKLQl2ci0+c2V0ICh2 YWwpOwotICAgICAgZWxzZQotCXZyLT51cGRhdGUgKHZhbCwgdmFsKTsKLSAgICB9Ci0gIGVsc2UK LSAgICAvKiBUaGUgcmVzdWx0IG9mIGEgY29tcGFyaXNvbiBpcyBhbHdheXMgdHJ1ZSBvciBmYWxz ZS4gICovCi0gICAgc2V0X3ZhbHVlX3JhbmdlX3RvX3RydXRodmFsdWUgKHZyLCB0eXBlKTsKLX0K LQogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBzaW1wbGlmeV9pbnRlcm5hbF9jYWxsX3VzaW5nX3Jh bmdlcyBhbmQKICAgIGV4dHJhY3RfcmFuZ2VfYmFzaWMuICBSZXR1cm4gdHJ1ZSBpZiBPUDAgU1VC Q09ERSBPUDEgZm9yCiAgICBTVUJDT0RFIHtQTFVTLE1JTlVTLE1VTFR9X0VYUFIgaXMga25vd24g dG8gbmV2ZXIgb3ZlcmZsb3cgb3IKQEAgLTExNTAsMjQ3ICsxNzksMjUgQEAgY2hlY2tfZm9yX2Jp bmFyeV9vcF9vdmVyZmxvdyAocmFuZ2VfcXVlcnkgKnF1ZXJ5LAogCSAgICB7CiAJICAgICAgd21p biA9IHd0OwogCSAgICAgIHdtYXggPSB3dDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAg ICAgd21pbiA9IHdpOjpzbWluICh3bWluLCB3dCk7Ci0JICAgICAgd21heCA9IHdpOjpzbWF4ICh3 bWF4LCB3dCk7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBUaGUgcmVzdWx0IG9mIG9wMCBDT0RFIG9w MSBpcyBrbm93biB0byBiZSBpbiByYW5nZQotCSBbd21pbiwgd21heF0uICAqLwotICAgICAgd2lk ZXN0X2ludCB3dG1pbiA9IHdpOjp0b193aWRlc3QgKHZycF92YWxfbWluICh0eXBlKSk7Ci0gICAg ICB3aWRlc3RfaW50IHd0bWF4ID0gd2k6OnRvX3dpZGVzdCAodnJwX3ZhbF9tYXggKHR5cGUpKTsK LSAgICAgIC8qIElmIGFsbCB2YWx1ZXMgaW4gW3dtaW4sIHdtYXhdIGFyZSBzbWFsbGVyIHRoYW4K LQkgW3d0bWluLCB3dG1heF0gb3IgYWxsIGFyZSBsYXJnZXIgdGhhbiBbd3RtaW4sIHd0bWF4XSwK LQkgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIG92ZXJmbG93LiAgKi8KLSAg ICAgIGlmICh3bWF4IDwgd3RtaW4gfHwgd21pbiA+IHd0bWF4KQotCXJldHVybiB0cnVlOwotICAg ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlcml2ZSBh IHJhbmdlIGZyb20gYSBidWlsdGluLiAgU2V0IHJhbmdlIGluIFZSIGFuZCByZXR1cm4gVFJVRSBp ZgotICAgc3VjY2Vzc2Z1bC4gICovCi0KLWJvb2wKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9m cm9tX3Vic2FuX2J1aWx0aW4gKHZhbHVlX3JhbmdlX2VxdWl2ICp2ciwgZ2ltcGxlICpzdG10KQot ewotICBnY2NfYXNzZXJ0IChpc19naW1wbGVfY2FsbCAoc3RtdCkpOwotICBlbnVtIHRyZWVfY29k ZSBzdWJjb2RlID0gRVJST1JfTUFSSzsKLSAgY29tYmluZWRfZm4gY2ZuID0gZ2ltcGxlX2NhbGxf Y29tYmluZWRfZm4gKHN0bXQpOwotICBzY2FsYXJfaW50X21vZGUgbW9kZTsKLQotICBzd2l0Y2gg KGNmbikKLSAgICB7Ci0gICAgY2FzZSBDRk5fVUJTQU5fQ0hFQ0tfQUREOgotICAgICAgc3ViY29k ZSA9IFBMVVNfRVhQUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0ZOX1VCU0FOX0NIRUNLX1NV QjoKLSAgICAgIHN1YmNvZGUgPSBNSU5VU19FWFBSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBD Rk5fVUJTQU5fQ0hFQ0tfTVVMOgotICAgICAgc3ViY29kZSA9IE1VTFRfRVhQUjsKLSAgICAgIGJy ZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlmIChzdWJjb2RlICE9 IEVSUk9SX01BUkspCi0gICAgewotICAgICAgYm9vbCBzYXZlZF9mbGFnX3dyYXB2ID0gZmxhZ193 cmFwdjsKLSAgICAgIC8qIFByZXRlbmQgdGhlIGFyaXRobWV0aWNzIGlzIHdyYXBwaW5nLiAgSWYg dGhlcmUgaXMKLQkgYW55IG92ZXJmbG93LCB3ZSdsbCBjb21wbGFpbiwgYnV0IHdpbGwgYWN0dWFs bHkgZG8KLQkgd3JhcHBpbmcgb3BlcmF0aW9uLiAgKi8KLSAgICAgIGZsYWdfd3JhcHYgPSAxOwot ICAgICAgZXh0cmFjdF9yYW5nZV9mcm9tX2JpbmFyeV9leHByICh2ciwgc3ViY29kZSwKLQkJCQkg ICAgICBUUkVFX1RZUEUgKGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwgMCkpLAotCQkJCSAgICAgIGdp bXBsZV9jYWxsX2FyZyAoc3RtdCwgMCksCi0JCQkJICAgICAgZ2ltcGxlX2NhbGxfYXJnIChzdG10 LCAxKSk7Ci0gICAgICBmbGFnX3dyYXB2ID0gc2F2ZWRfZmxhZ193cmFwdjsKLQotICAgICAgLyog SWYgZm9yIGJvdGggYXJndW1lbnRzIHZycF92YWx1ZWl6ZSByZXR1cm5lZCBub24tTlVMTCwKLQkg dGhpcyBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgZm9sZGVkIGFuZCBpZiBub3QsIGl0Ci0JIHdh c24ndCBmb2xkZWQgYmVjYXVzZSBvZiBvdmVyZmxvdy4gIEF2b2lkIHJlbW92aW5nIHRoZQotCSBV QlNBTl9DSEVDS18qIGNhbGxzIGluIHRoYXQgY2FzZS4gICovCi0gICAgICBpZiAodnItPmtpbmQg KCkgPT0gVlJfUkFOR0UKLQkgICYmICh2ci0+bWluICgpID09IHZyLT5tYXggKCkKLQkgICAgICB8 fCBvcGVyYW5kX2VxdWFsX3AgKHZyLT5taW4gKCksIHZyLT5tYXggKCksIDApKSkKLQl2ci0+c2V0 X3ZhcnlpbmcgKHZyLT50eXBlICgpKTsKLQotICAgICAgcmV0dXJuICF2ci0+dmFyeWluZ19wICgp OwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gZGVyaXZlIGEgbm9ubmVn YXRpdmUgb3Igbm9uemVybyByYW5nZSBvdXQgb2YgU1RNVCByZWx5aW5nCi0gICBwcmltYXJpbHkg b24gZ2VuZXJpYyByb3V0aW5lcyBpbiBmb2xkIGluIGNvbmp1bmN0aW9uIHdpdGggcmFuZ2UgZGF0 YS4KLSAgIFN0b3JlIHRoZSByZXN1bHQgaW4gKlZSICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0 cmFjdF9yYW5nZV9iYXNpYyAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLCBnaW1wbGUgKnN0bXQpCi17 Ci0gIGJvb2wgc29wOwotCi0gIGlmIChpc19naW1wbGVfY2FsbCAoc3RtdCkpCi0gICAgewotICAg ICAgY29tYmluZWRfZm4gY2ZuID0gZ2ltcGxlX2NhbGxfY29tYmluZWRfZm4gKHN0bXQpOwotICAg ICAgc3dpdGNoIChjZm4pCi0JewotCWNhc2UgQ0ZOX1VCU0FOX0NIRUNLX0FERDoKLQljYXNlIENG Tl9VQlNBTl9DSEVDS19TVUI6Ci0JY2FzZSBDRk5fVUJTQU5fQ0hFQ0tfTVVMOgotCSAgaWYgKGV4 dHJhY3RfcmFuZ2VfZnJvbV91YnNhbl9idWlsdGluICh2ciwgc3RtdCkpCi0JICAgIHJldHVybjsK LQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAoZm9sZF9yYW5nZSAoKnZyLCBzdG10LCB0aGlz KSkKLQkgICAgewotCSAgICAgIC8qIFRoZSBvcmlnaW5hbCBjb2RlIG51a2VkIGVxdWl2YWxlbmNl cyBldmVyeSB0aW1lIGEKLQkJIHJhbmdlIHdhcyBmb3VuZCwgc28gZG8gdGhlIHNhbWUgaGVyZS4g ICovCi0JICAgICAgdnItPmVxdWl2X2NsZWFyICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQot CSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgLyogSGFuZGxlIGV4dHJhY3Rpb24gb2YgdGhlIHR3byBy ZXN1bHRzIChyZXN1bHQgb2YgYXJpdGhtZXRpY3MgYW5kCi0gICAgIGEgZmxhZyB3aGV0aGVyIGFy aXRobWV0aWNzIG92ZXJmbG93ZWQpIGZyb20ge0FERCxTVUIsTVVMfV9PVkVSRkxPVwotICAgICBp bnRlcm5hbCBmdW5jdGlvbi4gIFNpbWlsYXJseSBmcm9tIEFUT01JQ19DT01QQVJFX0VYQ0hBTkdF LiAgKi8KLSAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0bXQpCi0gICAgICAmJiAoZ2ltcGxlX2Fz c2lnbl9yaHNfY29kZSAoc3RtdCkgPT0gUkVBTFBBUlRfRVhQUgotCSAgfHwgZ2ltcGxlX2Fzc2ln bl9yaHNfY29kZSAoc3RtdCkgPT0gSU1BR1BBUlRfRVhQUikKLSAgICAgICYmIElOVEVHUkFMX1RZ UEVfUCAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoc3RtdCkpKSkKLSAgICB7Ci0gICAg ICBlbnVtIHRyZWVfY29kZSBjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCk7Ci0g ICAgICB0cmVlIG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKLSAgICAgIHRyZWUgdHlw ZSA9IFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpKTsKLSAgICAgIGlmIChUUkVF X0NPREUgKG9wKSA9PSBjb2RlICYmIFRSRUVfQ09ERSAoVFJFRV9PUEVSQU5EIChvcCwgMCkpID09 IFNTQV9OQU1FKQotCXsKLQkgIGdpbXBsZSAqZyA9IFNTQV9OQU1FX0RFRl9TVE1UIChUUkVFX09Q RVJBTkQgKG9wLCAwKSk7Ci0JICBpZiAoaXNfZ2ltcGxlX2NhbGwgKGcpICYmIGdpbXBsZV9jYWxs X2ludGVybmFsX3AgKGcpKQorCSAgICB9CisJICBlbHNlCiAJICAgIHsKLQkgICAgICBlbnVtIHRy ZWVfY29kZSBzdWJjb2RlID0gRVJST1JfTUFSSzsKLQkgICAgICBzd2l0Y2ggKGdpbXBsZV9jYWxs X2ludGVybmFsX2ZuIChnKSkKLQkJewotCQljYXNlIElGTl9BRERfT1ZFUkZMT1c6Ci0JCSAgc3Vi Y29kZSA9IFBMVVNfRVhQUjsKLQkJICBicmVhazsKLQkJY2FzZSBJRk5fU1VCX09WRVJGTE9XOgot CQkgIHN1YmNvZGUgPSBNSU5VU19FWFBSOwotCQkgIGJyZWFrOwotCQljYXNlIElGTl9NVUxfT1ZF UkZMT1c6Ci0JCSAgc3ViY29kZSA9IE1VTFRfRVhQUjsKLQkJICBicmVhazsKLQkJY2FzZSBJRk5f QVRPTUlDX0NPTVBBUkVfRVhDSEFOR0U6Ci0JCSAgaWYgKGNvZGUgPT0gSU1BR1BBUlRfRVhQUikK LQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyB0aGUgYm9vbGVhbiByZXR1cm4gdmFsdWUgd2hl dGhlciBjb21wYXJlIGFuZAotCQkJIGV4Y2hhbmdlIGNoYW5nZWQgYW55dGhpbmcgb3Igbm90LiAg Ki8KLQkJICAgICAgdnItPnNldCAoYnVpbGRfaW50X2NzdCAodHlwZSwgMCksCi0JCQkgICAgICAg YnVpbGRfaW50X2NzdCAodHlwZSwgMSksIE5VTEwpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9 Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBpZiAoc3Vi Y29kZSAhPSBFUlJPUl9NQVJLKQotCQl7Ci0JCSAgdHJlZSBvcDAgPSBnaW1wbGVfY2FsbF9hcmcg KGcsIDApOwotCQkgIHRyZWUgb3AxID0gZ2ltcGxlX2NhbGxfYXJnIChnLCAxKTsKLQkJICBpZiAo Y29kZSA9PSBJTUFHUEFSVF9FWFBSKQotCQkgICAgewotCQkgICAgICBib29sIG92ZiA9IGZhbHNl OwotCQkgICAgICBpZiAoY2hlY2tfZm9yX2JpbmFyeV9vcF9vdmVyZmxvdyAodGhpcywgc3ViY29k ZSwgdHlwZSwKLQkJCQkJCQlvcDAsIG9wMSwgJm92ZikpCi0JCQl2ci0+c2V0IChidWlsZF9pbnRf Y3N0ICh0eXBlLCBvdmYpKTsKLQkJICAgICAgZWxzZSBpZiAoVFlQRV9QUkVDSVNJT04gKHR5cGUp ID09IDEKLQkJCSAgICAgICAmJiAhVFlQRV9VTlNJR05FRCAodHlwZSkpCi0JCQl2ci0+c2V0X3Zh cnlpbmcgKHR5cGUpOwotCQkgICAgICBlbHNlCi0JCQl2ci0+c2V0IChidWlsZF9pbnRfY3N0ICh0 eXBlLCAwKSwKLQkJCQkgYnVpbGRfaW50X2NzdCAodHlwZSwgMSksIE5VTEwpOwotCQkgICAgfQot CQkgIGVsc2UgaWYgKHR5cGVzX2NvbXBhdGlibGVfcCAodHlwZSwgVFJFRV9UWVBFIChvcDApKQot CQkJICAgJiYgdHlwZXNfY29tcGF0aWJsZV9wICh0eXBlLCBUUkVFX1RZUEUgKG9wMSkpKQotCQkg ICAgewotCQkgICAgICBib29sIHNhdmVkX2ZsYWdfd3JhcHYgPSBmbGFnX3dyYXB2OwotCQkgICAg ICAvKiBQcmV0ZW5kIHRoZSBhcml0aG1ldGljcyBpcyB3cmFwcGluZy4gIElmIHRoZXJlIGlzCi0J CQkgYW55IG92ZXJmbG93LCBJTUFHUEFSVF9FWFBSIHdpbGwgYmUgc2V0LiAgKi8KLQkJICAgICAg ZmxhZ193cmFwdiA9IDE7Ci0JCSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9iaW5hcnlfZXhwciAo dnIsIHN1YmNvZGUsIHR5cGUsCi0JCQkJCQkgICAgICBvcDAsIG9wMSk7Ci0JCSAgICAgIGZsYWdf d3JhcHYgPSBzYXZlZF9mbGFnX3dyYXB2OwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJ ICAgICAgdmFsdWVfcmFuZ2VfZXF1aXYgdnIwLCB2cjE7Ci0JCSAgICAgIGJvb2wgc2F2ZWRfZmxh Z193cmFwdiA9IGZsYWdfd3JhcHY7Ci0JCSAgICAgIC8qIFByZXRlbmQgdGhlIGFyaXRobWV0aWNz IGlzIHdyYXBwaW5nLiAgSWYgdGhlcmUgaXMKLQkJCSBhbnkgb3ZlcmZsb3csIElNQUdQQVJUX0VY UFIgd2lsbCBiZSBzZXQuICAqLwotCQkgICAgICBmbGFnX3dyYXB2ID0gMTsKLQkJICAgICAgZXh0 cmFjdF9yYW5nZV9mcm9tX3VuYXJ5X2V4cHIgKCZ2cjAsIE5PUF9FWFBSLAotCQkJCQkJICAgICB0 eXBlLCBvcDApOwotCQkgICAgICBleHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhwciAoJnZyMSwg Tk9QX0VYUFIsCi0JCQkJCQkgICAgIHR5cGUsIG9wMSk7Ci0JCSAgICAgIHJhbmdlX2ZvbGRfYmlu YXJ5X2V4cHIgKHZyLCBzdWJjb2RlLCB0eXBlLCAmdnIwLCAmdnIxKTsKLQkJICAgICAgZmxhZ193 cmFwdiA9IHNhdmVkX2ZsYWdfd3JhcHY7Ci0JCSAgICB9Ci0JCSAgcmV0dXJuOwotCQl9CisJICAg ICAgd21pbiA9IHdpOjpzbWluICh3bWluLCB3dCk7CisJICAgICAgd21heCA9IHdpOjpzbWF4ICh3 bWF4LCB3dCk7CiAJICAgIH0KIAl9CisgICAgICAvKiBUaGUgcmVzdWx0IG9mIG9wMCBDT0RFIG9w MSBpcyBrbm93biB0byBiZSBpbiByYW5nZQorCSBbd21pbiwgd21heF0uICAqLworICAgICAgd2lk ZXN0X2ludCB3dG1pbiA9IHdpOjp0b193aWRlc3QgKHZycF92YWxfbWluICh0eXBlKSk7CisgICAg ICB3aWRlc3RfaW50IHd0bWF4ID0gd2k6OnRvX3dpZGVzdCAodnJwX3ZhbF9tYXggKHR5cGUpKTsK KyAgICAgIC8qIElmIGFsbCB2YWx1ZXMgaW4gW3dtaW4sIHdtYXhdIGFyZSBzbWFsbGVyIHRoYW4K KwkgW3d0bWluLCB3dG1heF0gb3IgYWxsIGFyZSBsYXJnZXIgdGhhbiBbd3RtaW4sIHd0bWF4XSwK KwkgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIG92ZXJmbG93LiAgKi8KKyAg ICAgIGlmICh3bWF4IDwgd3RtaW4gfHwgd21pbiA+IHd0bWF4KQorCXJldHVybiB0cnVlOworICAg ICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgLyogTm9uZSBvZiB0aGUgYmVsb3cgc2hvdWxkIG5l ZWQgYSAndHlwZScsIGJ1dCB3ZSBhcmUgb25seSBjYWxsZWQKLSAgICAgZm9yIGFzc2lnbm1lbnRz IGFuZCBjYWxscyB3aXRoIGEgTEhTLiAgKi8KLSAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChnaW1w bGVfZ2V0X2xocyAoc3RtdCkpOwotICBpZiAoSU5URUdSQUxfVFlQRV9QICh0eXBlKQotICAgICAg JiYgZ2ltcGxlX3N0bXRfbm9ubmVnYXRpdmVfd2FybnZfcCAoc3RtdCwgJnNvcCkpCi0gICAgc2V0 X3ZhbHVlX3JhbmdlX3RvX25vbm5lZ2F0aXZlICh2ciwgdHlwZSk7Ci0gIGVsc2UgaWYgKHZycF9z dG10X2NvbXB1dGVzX25vbnplcm8gKHN0bXQpKQotICAgIHsKLSAgICAgIHZyLT5zZXRfbm9uemVy byAodHlwZSk7Ci0gICAgICB2ci0+ZXF1aXZfY2xlYXIgKCk7Ci0gICAgfQotICBlbHNlCi0gICAg dnItPnNldF92YXJ5aW5nICh0eXBlKTsKLX0KLQotCi0vKiBUcnkgdG8gY29tcHV0ZSBhIHVzZWZ1 bCByYW5nZSBvdXQgb2YgYXNzaWdubWVudCBTVE1UIGFuZCBzdG9yZSBpdAotICAgaW4gKlZSLiAg Ki8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fYXNzaWdubWVudCAodmFs dWVfcmFuZ2VfZXF1aXYgKnZyLCBnYXNzaWduICpzdG10KQotewotICBlbnVtIHRyZWVfY29kZSBj b2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCk7Ci0KLSAgaWYgKGNvZGUgPT0gQVNT RVJUX0VYUFIpCi0gICAgZXh0cmFjdF9yYW5nZV9mcm9tX2Fzc2VydCAodnIsIGdpbXBsZV9hc3Np Z25fcmhzMSAoc3RtdCkpOwotICBlbHNlIGlmIChjb2RlID09IFNTQV9OQU1FKQotICAgIGV4dHJh Y3RfcmFuZ2VfZnJvbV9zc2FfbmFtZSAodnIsIGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkpOwot ICBlbHNlIGlmIChUUkVFX0NPREVfQ0xBU1MgKGNvZGUpID09IHRjY19iaW5hcnkpCi0gICAgZXh0 cmFjdF9yYW5nZV9mcm9tX2JpbmFyeV9leHByICh2ciwgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo c3RtdCksCi0JCQkJICAgIFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpKSwKLQkJ CQkgICAgZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KSwKLQkJCQkgICAgZ2ltcGxlX2Fzc2lnbl9y aHMyIChzdG10KSk7Ci0gIGVsc2UgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29kZSkgPT0gdGNjX3Vu YXJ5KQotICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV91bmFyeV9leHByICh2ciwgZ2ltcGxlX2Fzc2ln bl9yaHNfY29kZSAoc3RtdCksCi0JCQkJICAgVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAo c3RtdCkpLAotCQkJCSAgIGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkpOwotICBlbHNlIGlmIChj b2RlID09IENPTkRfRVhQUikKLSAgICBleHRyYWN0X3JhbmdlX2Zyb21fY29uZF9leHByICh2ciwg c3RtdCk7Ci0gIGVsc2UgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29kZSkgPT0gdGNjX2NvbXBhcmlz b24pCi0gICAgZXh0cmFjdF9yYW5nZV9mcm9tX2NvbXBhcmlzb24gKHZyLCBzdG10KTsKLSAgZWxz ZSBpZiAoZ2V0X2dpbXBsZV9yaHNfY2xhc3MgKGNvZGUpID09IEdJTVBMRV9TSU5HTEVfUkhTCi0J ICAgJiYgaXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkp KQotICAgIHZyLT5zZXQgKGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkpOwotICBlbHNlCi0gICAg dnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KSkpOwot Ci0gIGlmICh2ci0+dmFyeWluZ19wICgpKQotICAgIGV4dHJhY3RfcmFuZ2VfYmFzaWMgKHZyLCBz dG10KTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIC8qIEdpdmVuIHR3byBudW1lcmljIHZhbHVlIHJh bmdlcyBWUjAsIFZSMSBhbmQgYSBjb21wYXJpc29uIGNvZGUgQ09NUDoKQEAgLTE4MDgsMjAyICs2 MTUsNiBAQCBib3VuZHNfb2ZfdmFyX2luX2xvb3AgKHRyZWUgKm1pbiwgdHJlZSAqbWF4LCByYW5n ZV9xdWVyeSAqcXVlcnksCiAgIHJldHVybiB0cnVlOwogfQogCi0vKiBHaXZlbiBhIHJhbmdlIFZS LCBhIExPT1AgYW5kIGEgdmFyaWFibGUgVkFSLCBkZXRlcm1pbmUgd2hldGhlciBpdAotICAgd291 bGQgYmUgcHJvZml0YWJsZSB0byBhZGp1c3QgVlIgdXNpbmcgc2NhbGFyIGV2b2x1dGlvbiBpbmZv cm1hdGlvbgotICAgZm9yIFZBUi4gIElmIHNvLCB1cGRhdGUgVlIgd2l0aCB0aGUgbmV3IGxpbWl0 cy4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6YWRqdXN0X3JhbmdlX3dpdGhfc2NldiAodmFsdWVf cmFuZ2VfZXF1aXYgKnZyLCBjbGFzcyBsb29wICpsb29wLAotCQkJCSAgIGdpbXBsZSAqc3RtdCwg dHJlZSB2YXIpCi17Ci0gIHRyZWUgbWluLCBtYXg7Ci0gIGlmIChib3VuZHNfb2ZfdmFyX2luX2xv b3AgKCZtaW4sICZtYXgsIHRoaXMsIGxvb3AsIHN0bXQsIHZhcikpCi0gICAgewotICAgICAgaWYg KHZyLT51bmRlZmluZWRfcCAoKSB8fCB2ci0+dmFyeWluZ19wICgpKQotCXsKLQkgIC8qIEZvciBW QVJZSU5HIG9yIFVOREVGSU5FRCByYW5nZXMsIGp1c3QgYWJvdXQgYW55dGhpbmcgd2UgZ2V0Ci0J ICAgICBmcm9tIHNjYWxhciBldm9sdXRpb25zIHNob3VsZCBiZSBiZXR0ZXIuICAqLwotCSAgdnIt PnVwZGF0ZSAobWluLCBtYXgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHZyLT5raW5kICgpID09IFZS X1JBTkdFKQotCXsKLQkgIC8qIFN0YXJ0IHdpdGggdGhlIGlucHV0IHJhbmdlLi4uICovCi0JICB0 cmVlIHZybWluID0gdnItPm1pbiAoKTsKLQkgIHRyZWUgdnJtYXggPSB2ci0+bWF4ICgpOwotCi0J ICAvKiAuLi5hbmQgbmFycm93IGl0IGRvd24gd2l0aCB3aGF0IHdlIGdvdCBmcm9tIFNDRVYuICAq LwotCSAgaWYgKGNvbXBhcmVfdmFsdWVzIChtaW4sIHZybWluKSA9PSAxKQotCSAgICB2cm1pbiA9 IG1pbjsKLQkgIGlmIChjb21wYXJlX3ZhbHVlcyAobWF4LCB2cm1heCkgPT0gLTEpCi0JICAgIHZy bWF4ID0gbWF4OwotCi0JICB2ci0+dXBkYXRlICh2cm1pbiwgdnJtYXgpOwotCX0KLSAgICAgIGVs c2UgaWYgKHZyLT5raW5kICgpID09IFZSX0FOVElfUkFOR0UpCi0JewotCSAgLyogPz8gQXMgYW4g ZW5oYW5jZW1lbnQsIGlmIFZSLCBNSU4sIGFuZCBNQVggYXJlIGNvbnN0YW50cywgb25lCi0JICAg ICBjb3VsZCBqdXN0IGludGVyc2VjdCBWUiB3aXRoIGEgcmFuZ2Ugb2YgW01JTixNQVhdLiAgKi8K LQl9Ci0gICAgfQotfQotCi0vKiBEdW1wIHZhbHVlIHJhbmdlcyBvZiBhbGwgU1NBX05BTUVzIHRv IEZJTEUuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OmR1bXAgKEZJTEUgKmZpbGUpCi17Ci0gIHNp emVfdCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fdnJfdmFsdWVzOyBpKyspCi0gICAgewot ICAgICAgaWYgKHZyX3ZhbHVlW2ldICYmIHNzYV9uYW1lIChpKSkKLQl7Ci0JICBwcmludF9nZW5l cmljX2V4cHIgKGZpbGUsIHNzYV9uYW1lIChpKSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiOiAiKTsK LQkgIGR1bXBfdmFsdWVfcmFuZ2UgKGZpbGUsIHZyX3ZhbHVlW2ldKTsKLQkgIGZwcmludGYgKGZp bGUsICJcbiIpOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci19Ci0KLS8q IEluaXRpYWxpemUgVlJQIGxhdHRpY2UuICAqLwotCi12cl92YWx1ZXM6OnZyX3ZhbHVlcyAoKSA6 IHNpbXBsaWZpZXIgKHRoaXMpCi17Ci0gIHZhbHVlc19wcm9wYWdhdGVkID0gZmFsc2U7Ci0gIG51 bV92cl92YWx1ZXMgPSBudW1fc3NhX25hbWVzICogMjsKLSAgdnJfdmFsdWUgPSBYQ05FV1ZFQyAo dmFsdWVfcmFuZ2VfZXF1aXYgKiwgbnVtX3ZyX3ZhbHVlcyk7Ci0gIHZyX3BoaV9lZGdlX2NvdW50 cyA9IFhDTkVXVkVDIChpbnQsIG51bV9zc2FfbmFtZXMpOwotICBiaXRtYXBfb2JzdGFja19pbml0 aWFsaXplICgmdnJwX2VxdWl2X29ic3RhY2spOwotfQotCi0vKiBGcmVlIFZSUCBsYXR0aWNlLiAg Ki8KLQotdnJfdmFsdWVzOjp+dnJfdmFsdWVzICgpCi17Ci0gIC8qIEZyZWUgYWxsb2NhdGVkIG1l bW9yeS4gICovCi0gIGZyZWUgKHZyX3ZhbHVlKTsKLSAgZnJlZSAodnJfcGhpX2VkZ2VfY291bnRz KTsKLSAgYml0bWFwX29ic3RhY2tfcmVsZWFzZSAoJnZycF9lcXVpdl9vYnN0YWNrKTsKLQotICAv KiBTbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIFZSUCBkYXRhIGJlaW5nIGF2YWls YWJsZQotICAgICBhbmQgbm90IGF2YWlsYWJsZS4gICovCi0gIHZyX3ZhbHVlID0gTlVMTDsKLSAg dnJfcGhpX2VkZ2VfY291bnRzID0gTlVMTDsKLX0KLQotCi0vKiBBIGhhY2suICAqLwotc3RhdGlj IGNsYXNzIHZyX3ZhbHVlcyAqeF92cl92YWx1ZXM7Ci0KLS8qIFJldHVybiB0aGUgc2luZ2xldG9u IHZhbHVlLXJhbmdlIGZvciBOQU1FIG9yIE5BTUUuICAqLwotCi1zdGF0aWMgaW5saW5lIHRyZWUK LXZycF92YWx1ZWl6ZSAodHJlZSBuYW1lKQotewotICBpZiAoVFJFRV9DT0RFIChuYW1lKSA9PSBT U0FfTkFNRSkKLSAgICB7Ci0gICAgICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIgPSB4X3Zy X3ZhbHVlcy0+Z2V0X3ZhbHVlX3JhbmdlIChuYW1lKTsKLSAgICAgIGlmICh2ci0+a2luZCAoKSA9 PSBWUl9SQU5HRQotCSAgJiYgKFRSRUVfQ09ERSAodnItPm1pbiAoKSkgPT0gU1NBX05BTUUKLQkg ICAgICB8fCBpc19naW1wbGVfbWluX2ludmFyaWFudCAodnItPm1pbiAoKSkpCi0JICAmJiB2cnBf b3BlcmFuZF9lcXVhbF9wICh2ci0+bWluICgpLCB2ci0+bWF4ICgpKSkKLQlyZXR1cm4gdnItPm1p biAoKTsKLSAgICB9Ci0gIHJldHVybiBuYW1lOwotfQotCi0vKiBSZXR1cm4gdGhlIHNpbmdsZXRv biB2YWx1ZS1yYW5nZSBmb3IgTkFNRSBpZiB0aGF0IGlzIGEgY29uc3RhbnQKLSAgIGJ1dCBzaWdu YWwgdG8gbm90IGZvbGxvdyBTU0EgZWRnZXMuICAqLwotCi1zdGF0aWMgaW5saW5lIHRyZWUKLXZy cF92YWx1ZWl6ZV8xICh0cmVlIG5hbWUpCi17Ci0gIGlmIChUUkVFX0NPREUgKG5hbWUpID09IFNT QV9OQU1FKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBkZWZpbml0aW9uIG1heSBiZSBzaW11bGF0 ZWQgYWdhaW4gd2UgY2Fubm90IGZvbGxvdwotICAgICAgICAgdGhpcyBTU0EgZWRnZSBhcyB0aGUg U1NBIHByb3BhZ2F0b3IgZG9lcyBub3QgbmVjZXNzYXJpbHkKLQkgcmUtdmlzaXQgdGhlIHVzZS4g ICovCi0gICAgICBnaW1wbGUgKmRlZl9zdG10ID0gU1NBX05BTUVfREVGX1NUTVQgKG5hbWUpOwot ICAgICAgaWYgKCFnaW1wbGVfbm9wX3AgKGRlZl9zdG10KQotCSAgJiYgcHJvcF9zaW11bGF0ZV9h Z2Fpbl9wIChkZWZfc3RtdCkpCi0JcmV0dXJuIE5VTExfVFJFRTsKLSAgICAgIGNvbnN0IHZhbHVl X3JhbmdlX2VxdWl2ICp2ciA9IHhfdnJfdmFsdWVzLT5nZXRfdmFsdWVfcmFuZ2UgKG5hbWUpOwot ICAgICAgdHJlZSBzaW5nbGV0b247Ci0gICAgICBpZiAodnItPnNpbmdsZXRvbl9wICgmc2luZ2xl dG9uKSkKLQlyZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8q IEdpdmVuIFNUTVQsIGFuIGFzc2lnbm1lbnQgb3IgY2FsbCwgcmV0dXJuIGl0cyBMSFMgaWYgdGhl IHR5cGUKLSAgIG9mIHRoZSBMSFMgaXMgc3VpdGFibGUgZm9yIFZSUCBhbmFseXNpcywgZWxzZSBy ZXR1cm4gTlVMTF9UUkVFLiAgKi8KLQotdHJlZQotZ2V0X291dHB1dF9mb3JfdnJwIChnaW1wbGUg KnN0bXQpCi17Ci0gIGlmICghaXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkgJiYgIWlzX2dpbXBsZV9j YWxsIChzdG10KSkKLSAgICByZXR1cm4gTlVMTF9UUkVFOwotCi0gIC8qIFdlIG9ubHkga2VlcCB0 cmFjayBvZiByYW5nZXMgaW4gaW50ZWdyYWwgYW5kIHBvaW50ZXIgdHlwZXMuICAqLwotICB0cmVl IGxocyA9IGdpbXBsZV9nZXRfbGhzIChzdG10KTsKLSAgaWYgKFRSRUVfQ09ERSAobGhzKSA9PSBT U0FfTkFNRQotICAgICAgJiYgKChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAobGhzKSkKLQkg ICAvKiBJdCBpcyB2YWxpZCB0byBoYXZlIE5VTEwgTUlOL01BWCB2YWx1ZXMgb24gYSB0eXBlLiAg U2VlCi0JICAgICAgYnVpbGRfcmFuZ2VfdHlwZS4gICovCi0JICAgJiYgVFlQRV9NSU5fVkFMVUUg KFRSRUVfVFlQRSAobGhzKSkKLQkgICAmJiBUWVBFX01BWF9WQUxVRSAoVFJFRV9UWVBFIChsaHMp KSkKLQkgIHx8IFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxocykpKSkKLSAgICByZXR1cm4g bGhzOwotCi0gIHJldHVybiBOVUxMX1RSRUU7Ci19Ci0KLS8qIFZpc2l0IGFzc2lnbm1lbnQgU1RN VC4gIElmIGl0IHByb2R1Y2VzIGFuIGludGVyZXN0aW5nIHJhbmdlLCByZWNvcmQKLSAgIHRoZSBy YW5nZSBpbiBWUiBhbmQgc2V0IExIUyB0byBPVVRQVVRfUC4gICovCi0KLXZvaWQKLXZyX3ZhbHVl czo6dnJwX3Zpc2l0X2Fzc2lnbm1lbnRfb3JfY2FsbCAoZ2ltcGxlICpzdG10LCB0cmVlICpvdXRw dXRfcCwKLQkJCQkJIHZhbHVlX3JhbmdlX2VxdWl2ICp2cikKLXsKLSAgdHJlZSBsaHMgPSBnZXRf b3V0cHV0X2Zvcl92cnAgKHN0bXQpOwotICAqb3V0cHV0X3AgPSBsaHM7Ci0KLSAgLyogV2Ugb25s eSBrZWVwIHRyYWNrIG9mIHJhbmdlcyBpbiBpbnRlZ3JhbCBhbmQgcG9pbnRlciB0eXBlcy4gICov Ci0gIGlmIChsaHMpCi0gICAgewotICAgICAgZW51bSBnaW1wbGVfY29kZSBjb2RlID0gZ2ltcGxl X2NvZGUgKHN0bXQpOwotCi0gICAgICAvKiBUcnkgZm9sZGluZyB0aGUgc3RhdGVtZW50IHRvIGEg Y29uc3RhbnQgZmlyc3QuICAqLwotICAgICAgeF92cl92YWx1ZXMgPSB0aGlzOwotICAgICAgdHJl ZSB0ZW0gPSBnaW1wbGVfZm9sZF9zdG10X3RvX2NvbnN0YW50XzEgKHN0bXQsIHZycF92YWx1ZWl6 ZSwKLQkJCQkJCSB2cnBfdmFsdWVpemVfMSk7Ci0gICAgICB4X3ZyX3ZhbHVlcyA9IE5VTEw7Ci0g ICAgICBpZiAodGVtKQotCXsKLQkgIGlmIChUUkVFX0NPREUgKHRlbSkgPT0gU1NBX05BTUUKLQkg ICAgICAmJiAoU1NBX05BTUVfSVNfREVGQVVMVF9ERUYgKHRlbSkKLQkJICB8fCAhIHByb3Bfc2lt dWxhdGVfYWdhaW5fcCAoU1NBX05BTUVfREVGX1NUTVQgKHRlbSkpKSkKLQkgICAgewotCSAgICAg IGV4dHJhY3RfcmFuZ2VfZnJvbV9zc2FfbmFtZSAodnIsIHRlbSk7Ci0JICAgICAgcmV0dXJuOwot CSAgICB9Ci0JICBlbHNlIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAodGVtKSkKLQkgICAg ewotCSAgICAgIHZyLT5zZXQgKHRlbSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAg ICAgLyogVGhlbiBkaXNwYXRjaCB0byB2YWx1ZS1yYW5nZSBleHRyYWN0aW5nIGZ1bmN0aW9ucy4g ICovCi0gICAgICBpZiAoY29kZSA9PSBHSU1QTEVfQ0FMTCkKLQlleHRyYWN0X3JhbmdlX2Jhc2lj ICh2ciwgc3RtdCk7Ci0gICAgICBlbHNlCi0JZXh0cmFjdF9yYW5nZV9mcm9tX2Fzc2lnbm1lbnQg KHZyLCBhc19hIDxnYXNzaWduICo+IChzdG10KSk7Ci0gICAgfQotfQotCiAvKiBIZWxwZXIgdGhh dCBnZXRzIHRoZSB2YWx1ZSByYW5nZSBvZiB0aGUgU1NBX05BTUUgd2l0aCB2ZXJzaW9uIEkKICAg IG9yIGEgc3ltYm9saWMgcmFuZ2UgY29udGFpbmluZyB0aGUgU1NBX05BTUUgb25seSBpZiB0aGUg dmFsdWUgcmFuZ2UKICAgIGlzIHZhcnlpbmcgb3IgdW5kZWZpbmVkLiAgVXNlcyBURU0gYXMgc3Rv cmFnZSBmb3IgdGhlIGFsdGVybmF0ZSByYW5nZS4gICovCkBAIC0yMzUyLDEwMCArOTYzLDYgQEAg c2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjp2cnBfZXZhbHVhdGVfY29uZGl0aW9uYWxfd2FybnZfd2l0 aF9vcHMKICAgcmV0dXJuIE5VTExfVFJFRTsKIH0KIAotLyogR2l2ZW4gKENPREUgT1AwIE9QMSkg d2l0aGluIFNUTVQsIHRyeSB0byBzaW1wbGlmeSBpdCBiYXNlZCBvbiB2YWx1ZSByYW5nZQotICAg aW5mb3JtYXRpb24uICBSZXR1cm4gTlVMTCBpZiB0aGUgY29uZGl0aW9uYWwgY2Fubm90IGJlIGV2 YWx1YXRlZC4KLSAgIFRoZSByYW5nZXMgb2YgYWxsIHRoZSBuYW1lcyBlcXVpdmFsZW50IHdpdGgg dGhlIG9wZXJhbmRzIGluIENPTkQKLSAgIHdpbGwgYmUgdXNlZCB3aGVuIHRyeWluZyB0byBjb21w dXRlIHRoZSB2YWx1ZS4gIElmIHRoZSByZXN1bHQgaXMKLSAgIGJhc2VkIG9uIHVuZGVmaW5lZCBz aWduZWQgb3ZlcmZsb3csIGlzc3VlIGEgd2FybmluZyBpZgotICAgYXBwcm9wcmlhdGUuICAqLwot Ci10cmVlCi1zaW1wbGlmeV91c2luZ19yYW5nZXM6OnZycF9ldmFsdWF0ZV9jb25kaXRpb25hbCAo dHJlZV9jb2RlIGNvZGUsIHRyZWUgb3AwLAotCQkJCQkJIHRyZWUgb3AxLCBnaW1wbGUgKnN0bXQp Ci17Ci0gIGJvb2wgc29wOwotICB0cmVlIHJldDsKLSAgYm9vbCBvbmx5X3JhbmdlczsKLQotICAv KiBTb21lIHBhc3NlcyBhbmQgZm9sZGluZ3MgbGVhayBjb25zdGFudHMgd2l0aCBvdmVyZmxvdyBm bGFnIHNldAotICAgICBpbnRvIHRoZSBJTC4gIEF2b2lkIGRvaW5nIHdyb25nIHRoaW5ncyB3aXRo IHRoZXNlIGFuZCBiYWlsIG91dC4gICovCi0gIGlmICgoVFJFRV9DT0RFIChvcDApID09IElOVEVH RVJfQ1NUCi0gICAgICAgJiYgVFJFRV9PVkVSRkxPVyAob3AwKSkKLSAgICAgIHx8IChUUkVFX0NP REUgKG9wMSkgPT0gSU5URUdFUl9DU1QKLQkgICYmIFRSRUVfT1ZFUkZMT1cgKG9wMSkpKQotICAg IHJldHVybiBOVUxMX1RSRUU7Ci0KLSAgc29wID0gZmFsc2U7Ci0gIHJldCA9IHZycF9ldmFsdWF0 ZV9jb25kaXRpb25hbF93YXJudl93aXRoX29wcyAoc3RtdCwgY29kZSwgb3AwLCBvcDEsIHRydWUs Ci0JCQkJCQkgJnNvcCwgJm9ubHlfcmFuZ2VzKTsKLQotICBpZiAocmV0ICYmIHNvcCkKLSAgICB7 Ci0gICAgICBlbnVtIHdhcm5fc3RyaWN0X292ZXJmbG93X2NvZGUgd2M7Ci0gICAgICBjb25zdCBj aGFyKiB3YXJubXNnOwotCi0gICAgICBpZiAoaXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKHJldCkp Ci0JewotCSAgd2MgPSBXQVJOX1NUUklDVF9PVkVSRkxPV19DT05ESVRJT05BTDsKLQkgIHdhcm5t c2cgPSBHXygiYXNzdW1pbmcgc2lnbmVkIG92ZXJmbG93IGRvZXMgbm90IG9jY3VyIHdoZW4gIgot CQkgICAgICAgInNpbXBsaWZ5aW5nIGNvbmRpdGlvbmFsIHRvIGNvbnN0YW50Iik7Ci0JfQotICAg ICAgZWxzZQotCXsKLQkgIHdjID0gV0FSTl9TVFJJQ1RfT1ZFUkZMT1dfQ09NUEFSSVNPTjsKLQkg IHdhcm5tc2cgPSBHXygiYXNzdW1pbmcgc2lnbmVkIG92ZXJmbG93IGRvZXMgbm90IG9jY3VyIHdo ZW4gIgotCQkgICAgICAgInNpbXBsaWZ5aW5nIGNvbmRpdGlvbmFsIik7Ci0JfQotCi0gICAgICBp ZiAoaXNzdWVfc3RyaWN0X292ZXJmbG93X3dhcm5pbmcgKHdjKSkKLQl7Ci0JICBsb2NhdGlvbl90 IGxvY2F0aW9uOwotCi0JICBpZiAoIWdpbXBsZV9oYXNfbG9jYXRpb24gKHN0bXQpKQotCSAgICBs b2NhdGlvbiA9IGlucHV0X2xvY2F0aW9uOwotCSAgZWxzZQotCSAgICBsb2NhdGlvbiA9IGdpbXBs ZV9sb2NhdGlvbiAoc3RtdCk7Ci0JICB3YXJuaW5nX2F0IChsb2NhdGlvbiwgT1BUX1dzdHJpY3Rf b3ZlcmZsb3csICIlcyIsIHdhcm5tc2cpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHdhcm5fdHlwZV9s aW1pdHMKLSAgICAgICYmIHJldCAmJiBvbmx5X3JhbmdlcwotICAgICAgJiYgVFJFRV9DT0RFX0NM QVNTIChjb2RlKSA9PSB0Y2NfY29tcGFyaXNvbgotICAgICAgJiYgVFJFRV9DT0RFIChvcDApID09 IFNTQV9OQU1FKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBjb21wYXJpc29uIGlzIGJlaW5nIGZv bGRlZCBhbmQgdGhlIG9wZXJhbmQgb24gdGhlIExIUwotCSBpcyBiZWluZyBjb21wYXJlZCBhZ2Fp bnN0IGEgY29uc3RhbnQgdmFsdWUgdGhhdCBpcyBvdXRzaWRlIG9mCi0JIHRoZSBuYXR1cmFsIHJh bmdlIG9mIE9QMCdzIHR5cGUsIHRoZW4gdGhlIHByZWRpY2F0ZSB3aWxsCi0JIGFsd2F5cyBmb2xk IHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIE9QMC4gIElmIC1XdHlwZS1saW1pdHMKLQkgd2Fz IHNwZWNpZmllZCwgZW1pdCBhIHdhcm5pbmcuICAqLwotICAgICAgdHJlZSB0eXBlID0gVFJFRV9U WVBFIChvcDApOwotICAgICAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyMCA9IHF1ZXJ5LT5n ZXRfdmFsdWVfcmFuZ2UgKG9wMCwgc3RtdCk7Ci0KLSAgICAgIGlmICh2cjAtPnZhcnlpbmdfcCAo KQotCSAgJiYgSU5URUdSQUxfVFlQRV9QICh0eXBlKQotCSAgJiYgaXNfZ2ltcGxlX21pbl9pbnZh cmlhbnQgKG9wMSkpCi0JewotCSAgbG9jYXRpb25fdCBsb2NhdGlvbjsKLQotCSAgaWYgKCFnaW1w bGVfaGFzX2xvY2F0aW9uIChzdG10KSkKLQkgICAgbG9jYXRpb24gPSBpbnB1dF9sb2NhdGlvbjsK LQkgIGVsc2UKLQkgICAgbG9jYXRpb24gPSBnaW1wbGVfbG9jYXRpb24gKHN0bXQpOwotCi0JICB3 YXJuaW5nX2F0IChsb2NhdGlvbiwgT1BUX1d0eXBlX2xpbWl0cywKLQkJICAgICAgaW50ZWdlcl96 ZXJvcCAocmV0KQotCQkgICAgICA/IEdfKCJjb21wYXJpc29uIGFsd2F5cyBmYWxzZSAiCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAiZHVlIHRvIGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBl IikKLQkJICAgICAgOiBHXygiY29tcGFyaXNvbiBhbHdheXMgdHJ1ZSAiCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAiZHVlIHRvIGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIikpOwotCX0K LSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotCiAvKiBWaXNpdCBjb25kaXRpb25hbCBzdGF0 ZW1lbnQgU1RNVC4gIElmIHdlIGNhbiBkZXRlcm1pbmUgd2hpY2ggZWRnZQogICAgd2lsbCBiZSB0 YWtlbiBvdXQgb2YgU1RNVCdzIGJhc2ljIGJsb2NrLCByZWNvcmQgaXQgaW4KICAgICpUQUtFTl9F REdFX1AuICBPdGhlcndpc2UsIHNldCAqVEFLRU5fRURHRV9QIHRvIE5VTEwuICAqLwpAQCAtMjYx OSwzMzYgKzExMzYsNiBAQCBmaW5kX2Nhc2VfbGFiZWxfcmFuZ2VzIChnc3dpdGNoICpzdG10LCBj b25zdCB2YWx1ZV9yYW5nZSAqdnIsCiAgIHJldHVybiBmYWxzZTsKIH0KIAotLyogVmlzaXQgc3dp dGNoIHN0YXRlbWVudCBTVE1ULiAgSWYgd2UgY2FuIGRldGVybWluZSB3aGljaCBlZGdlCi0gICB3 aWxsIGJlIHRha2VuIG91dCBvZiBTVE1UJ3MgYmFzaWMgYmxvY2ssIHJlY29yZCBpdCBpbgotICAg KlRBS0VOX0VER0VfUC4gIE90aGVyd2lzZSwgKlRBS0VOX0VER0VfUCBzZXQgdG8gTlVMTC4gICov Ci0KLXZvaWQKLXZyX3ZhbHVlczo6dnJwX3Zpc2l0X3N3aXRjaF9zdG10IChnc3dpdGNoICpzdG10 LCBlZGdlICp0YWtlbl9lZGdlX3ApCi17Ci0gIHRyZWUgb3AsIHZhbDsKLSAgY29uc3QgdmFsdWVf cmFuZ2VfZXF1aXYgKnZyOwotICBzaXplX3QgaSA9IDAsIGogPSAwLCBrLCBsOwotICBib29sIHRh a2VfZGVmYXVsdDsKLQotICAqdGFrZW5fZWRnZV9wID0gTlVMTDsKLSAgb3AgPSBnaW1wbGVfc3dp dGNoX2luZGV4IChzdG10KTsKLSAgaWYgKFRSRUVfQ09ERSAob3ApICE9IFNTQV9OQU1FKQotICAg IHJldHVybjsKLQotICB2ciA9IGdldF92YWx1ZV9yYW5nZSAob3ApOwotICBpZiAoZHVtcF9maWxl ICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKGR1 bXBfZmlsZSwgIlxuVmlzaXRpbmcgc3dpdGNoIGV4cHJlc3Npb24gd2l0aCBvcGVyYW5kICIpOwot ICAgICAgcHJpbnRfZ2VuZXJpY19leHByIChkdW1wX2ZpbGUsIG9wKTsKLSAgICAgIGZwcmludGYg KGR1bXBfZmlsZSwgIiB3aXRoIGtub3duIHJhbmdlICIpOwotICAgICAgZHVtcF92YWx1ZV9yYW5n ZSAoZHVtcF9maWxlLCB2cik7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwotICAg IH0KLQotICBpZiAodnItPnVuZGVmaW5lZF9wICgpCi0gICAgICB8fCB2ci0+dmFyeWluZ19wICgp Ci0gICAgICB8fCB2ci0+c3ltYm9saWNfcCAoKSkKLSAgICByZXR1cm47Ci0KLSAgLyogRmluZCB0 aGUgc2luZ2xlIGVkZ2UgdGhhdCBpcyB0YWtlbiBmcm9tIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbi4g ICovCi0gIHRha2VfZGVmYXVsdCA9ICFmaW5kX2Nhc2VfbGFiZWxfcmFuZ2VzIChzdG10LCB2ciwg JmksICZqLCAmaywgJmwpOwotCi0gIC8qIENoZWNrIGlmIHRoZSByYW5nZSBzcGFucyBubyBDQVNF X0xBQkVMLiBJZiBzbywgd2Ugb25seSByZWFjaCB0aGUgZGVmYXVsdAotICAgICBsYWJlbCAqLwot ICBpZiAoaiA8IGkpCi0gICAgewotICAgICAgZ2NjX2Fzc2VydCAodGFrZV9kZWZhdWx0KTsKLSAg ICAgIHZhbCA9IGdpbXBsZV9zd2l0Y2hfZGVmYXVsdF9sYWJlbCAoc3RtdCk7Ci0gICAgfQotICBl bHNlCi0gICAgewotICAgICAgLyogQ2hlY2sgaWYgbGFiZWxzIHdpdGggaW5kZXggaSB0byBqIGFu ZCBtYXliZSB0aGUgZGVmYXVsdCBsYWJlbAotCSBhcmUgYWxsIHJlYWNoaW5nIHRoZSBzYW1lIGxh YmVsLiAgKi8KLQotICAgICAgdmFsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSk7Ci0g ICAgICBpZiAodGFrZV9kZWZhdWx0Ci0JICAmJiBDQVNFX0xBQkVMIChnaW1wbGVfc3dpdGNoX2Rl ZmF1bHRfbGFiZWwgKHN0bXQpKQotCSAgIT0gQ0FTRV9MQUJFTCAodmFsKSkKLQl7Ci0JICBpZiAo ZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCSAgICBmcHJpbnRmIChk dW1wX2ZpbGUsICIgIG5vdCBhIHNpbmdsZSBkZXN0aW5hdGlvbiBmb3IgdGhpcyAiCi0JCSAgICAg InJhbmdlXG4iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBmb3IgKCsraTsgaSA8PSBqOyArK2kp Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiAoQ0FTRV9MQUJFTCAoZ2ltcGxlX3N3aXRjaF9sYWJl bCAoc3RtdCwgaSkpICE9IENBU0VfTEFCRUwgKHZhbCkpCi0JICAgIHsKLQkgICAgICBpZiAoZHVt cF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCQlmcHJpbnRmIChkdW1wX2Zp bGUsICIgIG5vdCBhIHNpbmdsZSBkZXN0aW5hdGlvbiBmb3IgdGhpcyAiCi0JCQkgInJhbmdlXG4i KTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLSAgICAgICAgfQotICAgICAgZm9yICg7IGsgPD0g bDsgKytrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKENBU0VfTEFCRUwgKGdpbXBsZV9zd2l0 Y2hfbGFiZWwgKHN0bXQsIGspKSAhPSBDQVNFX0xBQkVMICh2YWwpKQotCSAgICB7Ci0JICAgICAg aWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLQkJZnByaW50ZiAo ZHVtcF9maWxlLCAiICBub3QgYSBzaW5nbGUgZGVzdGluYXRpb24gZm9yIHRoaXMgIgotCQkJICJy YW5nZVxuIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg KnRha2VuX2VkZ2VfcCA9IGZpbmRfZWRnZSAoZ2ltcGxlX2JiIChzdG10KSwKLQkJCSAgICAgbGFi ZWxfdG9fYmxvY2sgKGNmdW4sIENBU0VfTEFCRUwgKHZhbCkpKTsKLQotICBpZiAoZHVtcF9maWxl ICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKGR1 bXBfZmlsZSwgIiAgd2lsbCB0YWtlIGVkZ2UgdG8gIik7Ci0gICAgICBwcmludF9nZW5lcmljX3N0 bXQgKGR1bXBfZmlsZSwgQ0FTRV9MQUJFTCAodmFsKSk7Ci0gICAgfQotfQotCi0KLS8qIEV2YWx1 YXRlIHN0YXRlbWVudCBTVE1ULiAgSWYgdGhlIHN0YXRlbWVudCBwcm9kdWNlcyBhIHVzZWZ1bCBy YW5nZSwKLSAgIHNldCBWUiBhbmQgY29yZXBzcG9uZGluZyBPVVRQVVRfUC4KLQotICAgSWYgU1RN VCBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBhbmQgd2UgY2FuIGRldGVybWluZSBpdHMgdHJ1dGgK LSAgIHZhbHVlLCB0aGUgdGFrZW4gZWRnZSBpcyByZWNvcmRlZCBpbiAqVEFLRU5fRURHRV9QLiAg Ki8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fc3RtdCAoZ2ltcGxlICpz dG10LCBlZGdlICp0YWtlbl9lZGdlX3AsCi0JCQkJICAgIHRyZWUgKm91dHB1dF9wLCB2YWx1ZV9y YW5nZV9lcXVpdiAqdnIpCi17Ci0KLSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRE Rl9ERVRBSUxTKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbmV4dHJhY3Rf cmFuZ2VfZnJvbV9zdG10IHZpc2l0aW5nOlxuIik7Ci0gICAgICBwcmludF9naW1wbGVfc3RtdCAo ZHVtcF9maWxlLCBzdG10LCAwLCBkdW1wX2ZsYWdzKTsKLSAgICB9Ci0KLSAgaWYgKCFzdG10X2lu dGVyZXN0aW5nX2Zvcl92cnAgKHN0bXQpKQotICAgIGdjY19hc3NlcnQgKHN0bXRfZW5kc19iYl9w IChzdG10KSk7Ci0gIGVsc2UgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKHN0bXQpIHx8IGlzX2dpbXBs ZV9jYWxsIChzdG10KSkKLSAgICB2cnBfdmlzaXRfYXNzaWdubWVudF9vcl9jYWxsIChzdG10LCBv dXRwdXRfcCwgdnIpOwotICBlbHNlIGlmIChnaW1wbGVfY29kZSAoc3RtdCkgPT0gR0lNUExFX0NP TkQpCi0gICAgc2ltcGxpZmllci52cnBfdmlzaXRfY29uZF9zdG10IChhc19hIDxnY29uZCAqPiAo c3RtdCksIHRha2VuX2VkZ2VfcCk7Ci0gIGVsc2UgaWYgKGdpbXBsZV9jb2RlIChzdG10KSA9PSBH SU1QTEVfU1dJVENIKQotICAgIHZycF92aXNpdF9zd2l0Y2hfc3RtdCAoYXNfYSA8Z3N3aXRjaCAq PiAoc3RtdCksIHRha2VuX2VkZ2VfcCk7Ci19Ci0KLS8qIFZpc2l0IGFsbCBhcmd1bWVudHMgZm9y IFBISSBub2RlIFBISSB0aGF0IGZsb3cgdGhyb3VnaCBleGVjdXRhYmxlCi0gICBlZGdlcy4gIElm IGEgdmFsaWQgdmFsdWUgcmFuZ2UgY2FuIGJlIGRlcml2ZWQgZnJvbSBhbGwgdGhlIGluY29taW5n Ci0gICB2YWx1ZSByYW5nZXMsIHNldCBhIG5ldyByYW5nZSBpbiBWUl9SRVNVTFQuICAqLwotCi12 b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9waGlfbm9kZSAoZ3BoaSAqcGhpLAot CQkJCQl2YWx1ZV9yYW5nZV9lcXVpdiAqdnJfcmVzdWx0KQotewotICB0cmVlIGxocyA9IFBISV9S RVNVTFQgKHBoaSk7Ci0gIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICpsaHNfdnIgPSBnZXRfdmFs dWVfcmFuZ2UgKGxocyk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBpbnQgb2xkX2VkZ2VzOwot ICBjbGFzcyBsb29wICpsOwotCi0gIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZf REVUQUlMUykpCi0gICAgewotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG5WaXNpdGluZyBQ SEkgbm9kZTogIik7Ci0gICAgICBwcmludF9naW1wbGVfc3RtdCAoZHVtcF9maWxlLCBwaGksIDAs IGR1bXBfZmxhZ3MpOwotICAgIH0KLQotICBib29sIG1heV9zaW11bGF0ZV9iYWNrZWRnZV9hZ2Fp biA9IGZhbHNlOwotICBpbnQgZWRnZXMgPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdp bXBsZV9waGlfbnVtX2FyZ3MgKHBoaSk7IGkrKykKLSAgICB7Ci0gICAgICBlZGdlIGUgPSBnaW1w bGVfcGhpX2FyZ19lZGdlIChwaGksIGkpOwotCi0gICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1w X2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCXsKLQkgIGZwcmludGYgKGR1bXBfZmlsZSwKLQkgICAg ICAiICAgIEFyZ3VtZW50ICMlZCAoJWQgLT4gJWQgJXNleGVjdXRhYmxlKVxuIiwKLQkgICAgICAo aW50KSBpLCBlLT5zcmMtPmluZGV4LCBlLT5kZXN0LT5pbmRleCwKLQkgICAgICAoZS0+ZmxhZ3Mg JiBFREdFX0VYRUNVVEFCTEUpID8gIiIgOiAibm90ICIpOwotCX0KLQotICAgICAgaWYgKGUtPmZs YWdzICYgRURHRV9FWEVDVVRBQkxFKQotCXsKLQkgIHZhbHVlX3JhbmdlX2VxdWl2IHZyX2FyZ190 ZW07Ci0JICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnJfYXJnID0gJnZyX2FyZ190ZW07Ci0K LQkgICsrZWRnZXM7Ci0KLQkgIHRyZWUgYXJnID0gUEhJX0FSR19ERUYgKHBoaSwgaSk7Ci0JICBp ZiAoVFJFRV9DT0RFIChhcmcpID09IFNTQV9OQU1FKQotCSAgICB7Ci0JICAgICAgLyogU2VlIGlm IHdlIGFyZSBldmVudHVhbGx5IGdvaW5nIHRvIGNoYW5nZSBvbmUgb2YgdGhlIGFyZ3MuICAqLwot CSAgICAgIGdpbXBsZSAqZGVmX3N0bXQgPSBTU0FfTkFNRV9ERUZfU1RNVCAoYXJnKTsKLQkgICAg ICBpZiAoISBnaW1wbGVfbm9wX3AgKGRlZl9zdG10KQotCQkgICYmIHByb3Bfc2ltdWxhdGVfYWdh aW5fcCAoZGVmX3N0bXQpCi0JCSAgJiYgZS0+ZmxhZ3MgJiBFREdFX0RGU19CQUNLKQotCQltYXlf c2ltdWxhdGVfYmFja2VkZ2VfYWdhaW4gPSB0cnVlOwotCi0JICAgICAgY29uc3QgdmFsdWVfcmFu Z2VfZXF1aXYgKnZyX2FyZ18gPSBnZXRfdmFsdWVfcmFuZ2UgKGFyZyk7Ci0JICAgICAgLyogRG8g bm90IGFsbG93IGVxdWl2YWxlbmNlcyBvciBzeW1ib2xpYyByYW5nZXMgdG8gbGVhayBpbiBmcm9t Ci0JCSBiYWNrZWRnZXMuICBUaGF0IGNyZWF0ZXMgaW52YWxpZCBlcXVpdmFsZW5jaWVzLgotCQkg U2VlIFBSNTM0NjUgYW5kIFBSNTQ3NjcuICAqLwotCSAgICAgIGlmIChlLT5mbGFncyAmIEVER0Vf REZTX0JBQ0spCi0JCXsKLQkJICBpZiAoIXZyX2FyZ18tPnZhcnlpbmdfcCAoKSAmJiAhdnJfYXJn Xy0+dW5kZWZpbmVkX3AgKCkpCi0JCSAgICB7Ci0JCSAgICAgIHZyX2FyZ190ZW0uc2V0ICh2cl9h cmdfLT5taW4gKCksIHZyX2FyZ18tPm1heCAoKSwgTlVMTCwKLQkJCQkgICAgICB2cl9hcmdfLT5r aW5kICgpKTsKLQkJICAgICAgaWYgKHZyX2FyZ190ZW0uc3ltYm9saWNfcCAoKSkKLQkJCXZyX2Fy Z190ZW0uc2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAoYXJnKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQot CQkgICAgdnJfYXJnID0gdnJfYXJnXzsKLQkJfQotCSAgICAgIC8qIElmIHRoZSBub24tYmFja2Vk Z2UgYXJndW1lbnRzIHJhbmdlIGlzIFZSX1ZBUllJTkcgdGhlbgotCQkgd2UgY2FuIHN0aWxsIHRy eSByZWNvcmRpbmcgYSBzaW1wbGUgZXF1aXZhbGVuY2UuICAqLwotCSAgICAgIGVsc2UgaWYgKHZy X2FyZ18tPnZhcnlpbmdfcCAoKSkKLQkJdnJfYXJnX3RlbS5zZXQgKGFyZyk7Ci0JICAgICAgZWxz ZQotCQl2cl9hcmcgPSB2cl9hcmdfOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBp ZiAoVFJFRV9PVkVSRkxPV19QIChhcmcpKQotCQlhcmcgPSBkcm9wX3RyZWVfb3ZlcmZsb3cgKGFy Zyk7Ci0KLQkgICAgICB2cl9hcmdfdGVtLnNldCAoYXJnKTsKLQkgICAgfQotCi0JICBpZiAoZHVt cF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotCSAgICB7Ci0JICAgICAgZnBy aW50ZiAoZHVtcF9maWxlLCAiXHQiKTsKLQkgICAgICBwcmludF9nZW5lcmljX2V4cHIgKGR1bXBf ZmlsZSwgYXJnLCBkdW1wX2ZsYWdzKTsKLQkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI6ICIp OwotCSAgICAgIGR1bXBfdmFsdWVfcmFuZ2UgKGR1bXBfZmlsZSwgdnJfYXJnKTsKLQkgICAgICBm cHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwotCSAgICB9Ci0KLQkgIGlmIChmaXJzdCkKLQkgICAg dnJfcmVzdWx0LT5kZWVwX2NvcHkgKHZyX2FyZyk7Ci0JICBlbHNlCi0JICAgIHZyX3Jlc3VsdC0+ bGVnYWN5X3ZlcmJvc2VfdW5pb25fICh2cl9hcmcpOwotCSAgZmlyc3QgPSBmYWxzZTsKLQotCSAg aWYgKHZyX3Jlc3VsdC0+dmFyeWluZ19wICgpKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0g IGlmICh2cl9yZXN1bHQtPnZhcnlpbmdfcCAoKSkKLSAgICBnb3RvIHZhcnlpbmc7Ci0gIGVsc2Ug aWYgKHZyX3Jlc3VsdC0+dW5kZWZpbmVkX3AgKCkpCi0gICAgZ290byB1cGRhdGVfcmFuZ2U7Ci0K LSAgb2xkX2VkZ2VzID0gdnJfcGhpX2VkZ2VfY291bnRzW1NTQV9OQU1FX1ZFUlNJT04gKGxocyld OwotICB2cl9waGlfZWRnZV9jb3VudHNbU1NBX05BTUVfVkVSU0lPTiAobGhzKV0gPSBlZGdlczsK LQotICAvKiBUbyBwcmV2ZW50IGluZmluaXRlIGl0ZXJhdGlvbnMgaW4gdGhlIGFsZ29yaXRobSwg ZGVyaXZlIHJhbmdlcwotICAgICB3aGVuIHRoZSBuZXcgdmFsdWUgaXMgc2xpZ2h0bHkgYmlnZ2Vy IG9yIHNtYWxsZXIgdGhhbiB0aGUKLSAgICAgcHJldmlvdXMgb25lLiAgV2UgZG9uJ3QgZG8gdGhp cyBpZiB3ZSBoYXZlIHNlZW4gYSBuZXcgZXhlY3V0YWJsZQotICAgICBlZGdlOyB0aGlzIGhlbHBz IHVzIGF2b2lkIGFuIGluZmluaXR5IGZvciBjb25kaXRpb25hbHMKLSAgICAgd2hpY2ggYXJlIG5v dCBpbiBhIGxvb3AuICBJZiB0aGUgb2xkIHZhbHVlLXJhbmdlIHdhcyBWUl9VTkRFRklORUQKLSAg ICAgdXNlIHRoZSB1cGRhdGVkIHJhbmdlIGFuZCBpdGVyYXRlIG9uZSBtb3JlIHRpbWUuICBJZiB3 ZSB3aWxsIG5vdAotICAgICBzaW11bGF0ZSB0aGlzIFBISSBhZ2FpbiB2aWEgdGhlIGJhY2tlZGdl IGFsbG93IHVzIHRvIGl0ZXJhdGUuICAqLwotICBpZiAoZWRnZXMgPiAwCi0gICAgICAmJiBnaW1w bGVfcGhpX251bV9hcmdzIChwaGkpID4gMQotICAgICAgJiYgZWRnZXMgPT0gb2xkX2VkZ2VzCi0g ICAgICAmJiAhbGhzX3ZyLT51bmRlZmluZWRfcCAoKQotICAgICAgJiYgbWF5X3NpbXVsYXRlX2Jh Y2tlZGdlX2FnYWluKQotICAgIHsKLSAgICAgIC8qIENvbXBhcmUgb2xkIGFuZCBuZXcgcmFuZ2Vz LCBmYWxsIGJhY2sgdG8gdmFyeWluZyBpZiB0aGUKLSAgICAgICAgIHZhbHVlcyBhcmUgbm90IGNv bXBhcmFibGUuICAqLwotICAgICAgaW50IGNtcF9taW4gPSBjb21wYXJlX3ZhbHVlcyAobGhzX3Zy LT5taW4gKCksIHZyX3Jlc3VsdC0+bWluICgpKTsKLSAgICAgIGlmIChjbXBfbWluID09IC0yKQot CWdvdG8gdmFyeWluZzsKLSAgICAgIGludCBjbXBfbWF4ID0gY29tcGFyZV92YWx1ZXMgKGxoc192 ci0+bWF4ICgpLCB2cl9yZXN1bHQtPm1heCAoKSk7Ci0gICAgICBpZiAoY21wX21heCA9PSAtMikK LQlnb3RvIHZhcnlpbmc7Ci0KLSAgICAgIC8qIEZvciBub24gVlJfUkFOR0Ugb3IgZm9yIHBvaW50 ZXJzIGZhbGwgYmFjayB0byB2YXJ5aW5nIGlmCi0JIHRoZSByYW5nZSBjaGFuZ2VkLiAgKi8KLSAg ICAgIGlmICgobGhzX3ZyLT5raW5kICgpICE9IFZSX1JBTkdFIHx8IHZyX3Jlc3VsdC0+a2luZCAo KSAhPSBWUl9SQU5HRQotCSAgIHx8IFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxocykpKQot CSAgJiYgKGNtcF9taW4gIT0gMCB8fCBjbXBfbWF4ICE9IDApKQotCWdvdG8gdmFyeWluZzsKLQot ICAgICAgLyogSWYgdGhlIG5ldyBtaW5pbXVtIGlzIGxhcmdlciB0aGFuIHRoZSBwcmV2aW91cyBv bmUKLQkgcmV0YWluIHRoZSBvbGQgdmFsdWUuICBJZiB0aGUgbmV3IG1pbmltdW0gdmFsdWUgaXMg c21hbGxlcgotCSB0aGFuIHRoZSBwcmV2aW91cyBvbmUgYW5kIG5vdCAtSU5GIGdvIGFsbCB0aGUg d2F5IHRvIC1JTkYgKyAxLgotCSBJbiB0aGUgZmlyc3QgY2FzZSwgdG8gYXZvaWQgaW5maW5pdGUg Ym91bmNpbmcgYmV0d2VlbiBkaWZmZXJlbnQKLQkgbWluaW11bXMsIGFuZCBpbiB0aGUgb3RoZXIg Y2FzZSB0byBhdm9pZCBpdGVyYXRpbmcgbWlsbGlvbnMgb2YKLQkgdGltZXMgdG8gcmVhY2ggLUlO Ri4gIEdvaW5nIHRvIC1JTkYgKyAxIGFsc28gbGV0cyB0aGUgZm9sbG93aW5nCi0JIGl0ZXJhdGlv biBjb21wdXRlIHdoZXRoZXIgdGhlcmUgd2lsbCBiZSBhbnkgb3ZlcmZsb3csIGF0IHRoZQotCSBl eHBlbnNlIG9mIG9uZSBhZGRpdGlvbmFsIGl0ZXJhdGlvbi4gICovCi0gICAgICB0cmVlIG5ld19t aW4gPSB2cl9yZXN1bHQtPm1pbiAoKTsKLSAgICAgIHRyZWUgbmV3X21heCA9IHZyX3Jlc3VsdC0+ bWF4ICgpOwotICAgICAgaWYgKGNtcF9taW4gPCAwKQotCW5ld19taW4gPSBsaHNfdnItPm1pbiAo KTsKLSAgICAgIGVsc2UgaWYgKGNtcF9taW4gPiAwCi0JICAgICAgICYmIChUUkVFX0NPREUgKHZy X3Jlc3VsdC0+bWluICgpKSAhPSBJTlRFR0VSX0NTVAotCQkgICB8fCB0cmVlX2ludF9jc3RfbHQg KHZycF92YWxfbWluICh2cl9yZXN1bHQtPnR5cGUgKCkpLAotCQkJCSAgICAgICB2cl9yZXN1bHQt Pm1pbiAoKSkpKQotCW5ld19taW4gPSBpbnRfY29uc3RfYmlub3AgKFBMVVNfRVhQUiwKLQkJCQkg ICB2cnBfdmFsX21pbiAodnJfcmVzdWx0LT50eXBlICgpKSwKLQkJCQkgICBidWlsZF9pbnRfY3N0 ICh2cl9yZXN1bHQtPnR5cGUgKCksIDEpKTsKLQotICAgICAgLyogU2ltaWxhcmx5IGZvciB0aGUg bWF4aW11bSB2YWx1ZS4gICovCi0gICAgICBpZiAoY21wX21heCA+IDApCi0JbmV3X21heCA9IGxo c192ci0+bWF4ICgpOwotICAgICAgZWxzZSBpZiAoY21wX21heCA8IDAKLQkgICAgICAgJiYgKFRS RUVfQ09ERSAodnJfcmVzdWx0LT5tYXggKCkpICE9IElOVEVHRVJfQ1NUCi0JCSAgIHx8IHRyZWVf aW50X2NzdF9sdCAodnJfcmVzdWx0LT5tYXggKCksCi0JCQkJICAgICAgIHZycF92YWxfbWF4ICh2 cl9yZXN1bHQtPnR5cGUgKCkpKSkpCi0JbmV3X21heCA9IGludF9jb25zdF9iaW5vcCAoTUlOVVNf RVhQUiwKLQkJCQkgICB2cnBfdmFsX21heCAodnJfcmVzdWx0LT50eXBlICgpKSwKLQkJCQkgICBi dWlsZF9pbnRfY3N0ICh2cl9yZXN1bHQtPnR5cGUgKCksIDEpKTsKLQotICAgICAgdnJfcmVzdWx0 LT51cGRhdGUgKG5ld19taW4sIG5ld19tYXgsIHZyX3Jlc3VsdC0+a2luZCAoKSk7Ci0KLSAgICAg IC8qIElmIHdlIGRyb3BwZWQgZWl0aGVyIGJvdW5kIHRvICstSU5GIHRoZW4gaWYgdGhpcyBpcyBh IGxvb3AKLQkgUEhJIG5vZGUgU0NFViBtYXkga25vd24gbW9yZSBhYm91dCBpdHMgdmFsdWUtcmFu Z2UuICAqLwotICAgICAgaWYgKGNtcF9taW4gPiAwIHx8IGNtcF9taW4gPCAwCi0JICAgfHwgY21w X21heCA8IDAgfHwgY21wX21heCA+IDApCi0JZ290byBzY2V2X2NoZWNrOwotCi0gICAgICBnb3Rv IGluZmluaXRlX2NoZWNrOwotICAgIH0KLQotICBnb3RvIHVwZGF0ZV9yYW5nZTsKLQotdmFyeWlu ZzoKLSAgdnJfcmVzdWx0LT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChsaHMpKTsKLQotc2Nldl9j aGVjazoKLSAgLyogSWYgdGhpcyBpcyBhIGxvb3AgUEhJIG5vZGUgU0NFViBtYXkga25vd24gbW9y ZSBhYm91dCBpdHMgdmFsdWUtcmFuZ2UuCi0gICAgIHNjZXZfY2hlY2sgY2FuIGJlIHJlYWNoZWQg ZnJvbSB0d28gcGF0aHMsIG9uZSBpcyBhIGZhbGwgdGhyb3VnaCBmcm9tIGFib3ZlCi0gICAgICJ2 YXJ5aW5nIiBsYWJlbCwgdGhlIG90aGVyIGlzIGRpcmVjdCBnb3RvIGZyb20gY29kZSBibG9jayB3 aGljaCB0cmllcyB0bwotICAgICBhdm9pZCBpbmZpbml0ZSBzaW11bGF0aW9uLiAgKi8KLSAgaWYg KHNjZXZfaW5pdGlhbGl6ZWRfcCAoKQotICAgICAgJiYgKGwgPSBsb29wX2NvbnRhaW5pbmdfc3Rt dCAocGhpKSkKLSAgICAgICYmIGwtPmhlYWRlciA9PSBnaW1wbGVfYmIgKHBoaSkpCi0gICAgYWRq dXN0X3JhbmdlX3dpdGhfc2NldiAodnJfcmVzdWx0LCBsLCBwaGksIGxocyk7Ci0KLWluZmluaXRl X2NoZWNrOgotICAvKiBJZiB3ZSB3aWxsIGVuZCB1cCB3aXRoIGEgKC1JTkYsICtJTkYpIHJhbmdl LCBzZXQgaXQgdG8KLSAgICAgVkFSWUlORy4gIFNhbWUgaWYgdGhlIHByZXZpb3VzIG1heCB2YWx1 ZSB3YXMgaW52YWxpZCBmb3IKLSAgICAgdGhlIHR5cGUgYW5kIHdlIGVuZCB1cCB3aXRoIHZyX3Jl c3VsdC5taW4gPiB2cl9yZXN1bHQubWF4LiAgKi8KLSAgaWYgKCghdnJfcmVzdWx0LT52YXJ5aW5n X3AgKCkgJiYgIXZyX3Jlc3VsdC0+dW5kZWZpbmVkX3AgKCkpCi0gICAgICAmJiAhKCh2cnBfdmFs X2lzX21heCAodnJfcmVzdWx0LT5tYXggKCkpICYmIHZycF92YWxfaXNfbWluICh2cl9yZXN1bHQt Pm1pbiAoKSkpCi0JICAgfHwgY29tcGFyZV92YWx1ZXMgKHZyX3Jlc3VsdC0+bWluICgpLCB2cl9y ZXN1bHQtPm1heCAoKSkgPiAwKSkKLSAgICA7Ci0gIGVsc2UKLSAgICB2cl9yZXN1bHQtPnNldF92 YXJ5aW5nIChUUkVFX1RZUEUgKGxocykpOwotCi0gIC8qIElmIHRoZSBuZXcgcmFuZ2UgaXMgZGlm ZmVyZW50IHRoYW4gdGhlIHByZXZpb3VzIHZhbHVlLCBrZWVwCi0gICAgIGl0ZXJhdGluZy4gICov Ci11cGRhdGVfcmFuZ2U6Ci0gIHJldHVybjsKLX0KLQogLyogU2ltcGxpZnkgYm9vbGVhbiBvcGVy YXRpb25zIGlmIHRoZSBzb3VyY2UgaXMga25vd24KICAgIHRvIGJlIGFscmVhZHkgYSBib29sZWFu LiAgKi8KIGJvb2wKQEAgLTM1NTcsOCArMTc0NCw3IEBAIHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6 Zm9sZF9jb25kIChnY29uZCAqY29uZCkKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAv KiA/PyB2cnBfZm9sZGVyOjpmb2xkX3ByZWRpY2F0ZV9pbigpIGlzIGEgc3VwZXJzZXQgb2YgdGhp cy4gIEF0Ci0gICAgIHNvbWUgcG9pbnQgd2Ugc2hvdWxkIG1lcmdlIGFsbCB2YXJpYW50cyBvZiB0 aGlzIGNvZGUuICAqLworICAvLyBGSVhNRTogQXVkaXQgdGhlIGNvZGUgYmVsb3cgYW5kIG1ha2Ug c3VyZSBpdCBuZXZlciBmaW5kcyBhbnl0aGluZy4KICAgZWRnZSB0YWtlbl9lZGdlOwogICB2cnBf dmlzaXRfY29uZF9zdG10IChjb25kLCAmdGFrZW5fZWRnZSk7CiAKQEAgLTM3NTksOSArMTk0NSw3 IEBAIHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6c2ltcGxpZnlfc3dpdGNoX3VzaW5nX3JhbmdlcyAo Z3N3aXRjaCAqc3RtdCkKICAgICAgIHZyID0gcXVlcnktPmdldF92YWx1ZV9yYW5nZSAob3AsIHN0 bXQpOwogCiAgICAgICAvKiBXZSBjYW4gb25seSBoYW5kbGUgaW50ZWdlciByYW5nZXMuICAqLwot ICAgICAgaWYgKHZyLT52YXJ5aW5nX3AgKCkKLQkgIHx8IHZyLT51bmRlZmluZWRfcCAoKQotCSAg fHwgdnItPnN5bWJvbGljX3AgKCkpCisgICAgICBpZiAodnItPnZhcnlpbmdfcCAoKSB8fCB2ci0+ dW5kZWZpbmVkX3AgKCkpCiAJcmV0dXJuIGZhbHNlOwogCiAgICAgICAvKiBGaW5kIGNhc2UgbGFi ZWwgZm9yIG1pbi9tYXggb2YgdGhlIHZhbHVlIHJhbmdlLiAgKi8KQEAgLTQ0MjgsMjQgKzI2MTIs MyBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OnNpbXBsaWZ5IChnaW1wbGVfc3RtdF9pdGVyYXRv ciAqZ3NpKQogCiAgIHJldHVybiBmYWxzZTsKIH0KLQotLyogU2V0IHRoZSBsYXR0aWNlIGVudHJ5 IGZvciBWQVIgdG8gVlIuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OnNldF92cl92YWx1ZSAodHJl ZSB2YXIsIHZhbHVlX3JhbmdlX2VxdWl2ICp2cikKLXsKLSAgaWYgKFNTQV9OQU1FX1ZFUlNJT04g KHZhcikgPj0gbnVtX3ZyX3ZhbHVlcykKLSAgICByZXR1cm47Ci0gIHZyX3ZhbHVlW1NTQV9OQU1F X1ZFUlNJT04gKHZhcildID0gdnI7Ci19Ci0KLS8qIFN3YXAgdGhlIGxhdHRpY2UgZW50cnkgZm9y IFZBUiB3aXRoIFZSIGFuZCByZXR1cm4gdGhlIG9sZCBlbnRyeS4gICovCi0KLXZhbHVlX3Jhbmdl X2VxdWl2ICoKLXZyX3ZhbHVlczo6c3dhcF92cl92YWx1ZSAodHJlZSB2YXIsIHZhbHVlX3Jhbmdl X2VxdWl2ICp2cikKLXsKLSAgaWYgKFNTQV9OQU1FX1ZFUlNJT04gKHZhcikgPj0gbnVtX3ZyX3Zh bHVlcykKLSAgICByZXR1cm4gTlVMTDsKLSAgc3RkOjpzd2FwICh2cl92YWx1ZVtTU0FfTkFNRV9W RVJTSU9OICh2YXIpXSwgdnIpOwotICByZXR1cm4gdnI7Ci19CmRpZmYgLS1naXQgYS9nY2MvdnIt dmFsdWVzLmggYi9nY2MvdnItdmFsdWVzLmgKaW5kZXggOGM4ZjAzMTcxNDcuLjhlZThjYzEyZjhi IDEwMDY0NAotLS0gYS9nY2MvdnItdmFsdWVzLmgKKysrIGIvZ2NjL3ZyLXZhbHVlcy5oCkBAIC0z MywyMSArMzMsMTQgQEAgcHVibGljOgogICBzaW1wbGlmeV91c2luZ19yYW5nZXMgKHJhbmdlX3F1 ZXJ5ICpxdWVyeSA9IE5VTEwsCiAJCQkgaW50IG5vdF9leGVjdXRhYmxlX2ZsYWcgPSAwKTsKICAg fnNpbXBsaWZ5X3VzaW5nX3JhbmdlcyAoKTsKLSAgdm9pZCBzZXRfcmFuZ2VfcXVlcnkgKGNsYXNz IHJhbmdlX3F1ZXJ5ICpxLCBpbnQgbm90X2V4ZWN1dGFibGVfZmxhZyA9IDApCi0gICAgICB7IHF1 ZXJ5ID0gcTsgbV9ub3RfZXhlY3V0YWJsZV9mbGFnID0gbm90X2V4ZWN1dGFibGVfZmxhZzsgfQot CiAgIGJvb2wgc2ltcGxpZnkgKGdpbXBsZV9zdG10X2l0ZXJhdG9yICopOwotCi0gIC8vID8/IFRo ZXNlIHNob3VsZCBiZSBjbGVhbmVkLCBtZXJnZWQsIGFuZCBtYWRlIHByaXZhdGUuCi0gIHRyZWUg dnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsICh0cmVlX2NvZGUsIHRyZWUsIHRyZWUsIGdpbXBsZSAq KTsKLSAgdm9pZCB2cnBfdmlzaXRfY29uZF9zdG10IChnY29uZCAqLCBlZGdlICopOwogICBib29s IGZvbGRfY29uZCAoZ2NvbmQgKik7Citwcml2YXRlOgorICB2b2lkIHZycF92aXNpdF9jb25kX3N0 bXQgKGdjb25kICosIGVkZ2UgKik7CiAgIHRyZWUgdnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsX3dh cm52X3dpdGhfb3BzIChnaW1wbGUgKnN0bXQsIGVudW0gdHJlZV9jb2RlLAogCQkJCQkJdHJlZSwg dHJlZSwgYm9vbCwKIAkJCQkJCWJvb2wgKiwgYm9vbCAqKTsKICAgYm9vbCBzaW1wbGlmeV9jYXN0 ZWRfY29uZCAoZ2NvbmQgKik7Ci0KLXByaXZhdGU6CiAgIGJvb2wgc2ltcGxpZnlfdHJ1dGhfb3Bz X3VzaW5nX3JhbmdlcyAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKiwgZ2ltcGxlICopOwogICBib29s IHNpbXBsaWZ5X2Rpdl9vcl9tb2RfdXNpbmdfcmFuZ2VzIChnaW1wbGVfc3RtdF9pdGVyYXRvciAq LCBnaW1wbGUgKik7CiAgIGJvb2wgc2ltcGxpZnlfYWJzX3VzaW5nX3JhbmdlcyAoZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgKiwgZ2ltcGxlICopOwpAQCAtODksOTUgKzgyLDYgQEAgcHJpdmF0ZToKICAg dmVjPGVkZ2U+IG1fZmxhZ19zZXRfZWRnZXM7ICAvLyBMaXN0IG9mIGVkZ2VzIHdpdGggZmxhZyB0 byBiZSBjbGVhcmVkLgogfTsKIAotLyogVGhlIFZSX1ZBTFVFUyBjbGFzcyBob2xkcyB0aGUgY3Vy cmVudCB2aWV3IG9mIHJhbmdlIGluZm9ybWF0aW9uCi0gICBmb3IgYWxsIHRoZSBTU0FfTkFNRXMg aW4gdGhlIElMLgotCi0gICBJdCBjYW4gYmUgdXNlZCB0byBob2xkIGNvbnRleHQgc2Vuc2l0aXZl IHJhbmdlIGluZm9ybWF0aW9uIGR1cmluZwotICAgYSBkb21pbmF0b3Igd2FsayBvciBpdCBtYXkg YmUgdXNlZCB0byBob2xkIHJhbmdlIGluZm9ybWF0aW9uIGluIHRoZQotICAgc3RhbmRhcmQgVlJQ IHBhc3MgYXMgcmFuZ2VzIGFyZSBwcm9wYWdhdGVkIHRocm91Z2ggdGhlIGxhdHRpY2UgdG8gYQot ICAgc3RlYWR5IHN0YXRlLgotCi0gICBUaGlzIGluZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50IG9m IHRoZSByYW5nZSBpbmZvcm1hdGlvbiB0aGF0IGdldHMKLSAgIGF0dGFjaGVkIHRvIFNTQV9OQU1F cy4gIEEgcGFzcyBzdWNoIGFzIFZSUCBtYXkgY2hvb3NlIHRvIHRyYW5zZmVyCi0gICB0aGUgZ2xv YmFsIGluZm9ybWF0aW9uIGl0IHByb2R1Y2VzIGludG8gZ2xvYmFsIHJhbmdlIGluZm9ybWF0aW9u IHRoYXQKLSAgIGdldHMgYXR0YWNoZWQgdG8gYW4gU1NBX05BTUUuICBJdCdzIHVuY2xlYXIgaG93 IHVzZWZ1bCB0aGF0IGdsb2JhbAotICAgaW5mb3JtYXRpb24gd2lsbCBiZSBpbiBhIHdvcmxkIHdo ZXJlIHdlIGNhbiBjb21wdXRlIGNvbnRleHQgc2Vuc2l0aXZlCi0gICByYW5nZSBpbmZvcm1hdGlv biBmYXN0IG9yIHBlcmZvcm0gb24tZGVtYW5kIHF1ZXJpZXMuICAqLwotY2xhc3MgdnJfdmFsdWVz IDogcHVibGljIHJhbmdlX3F1ZXJ5Ci17Ci0gcHVibGljOgotICB2cl92YWx1ZXMgKHZvaWQpOwot ICB+dnJfdmFsdWVzICh2b2lkKTsKLQotICB2aXJ0dWFsIGJvb2wgcmFuZ2Vfb2ZfZXhwciAodnJh bmdlICZyLCB0cmVlIGV4cHIsIGdpbXBsZSAqc3RtdCkgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgdHJl ZSB2YWx1ZV9vZl9leHByICh0cmVlLCBnaW1wbGUgKiA9IE5VTEwpIG92ZXJyaWRlOwotICB2aXJ0 dWFsIHRyZWUgdmFsdWVfb25fZWRnZSAoZWRnZSwgdHJlZSkgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwg dHJlZSB2YWx1ZV9vZl9zdG10IChnaW1wbGUgKiwgdHJlZSA9IE5VTExfVFJFRSkgb3ZlcnJpZGU7 Ci0gIHZpcnR1YWwgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKmdldF92YWx1ZV9yYW5nZSAoY29u c3RfdHJlZSwKLQkJCQkJCSAgICBnaW1wbGUgKiA9IE5VTEwpIG92ZXJyaWRlOwotICB2b2lkIHNl dF92cl92YWx1ZSAodHJlZSwgdmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0gIHZhbHVlX3JhbmdlX2Vx dWl2ICpzd2FwX3ZyX3ZhbHVlICh0cmVlLCB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsKLQotICB2b2lk IHNldF9kZWZfdG9fdmFyeWluZyAoY29uc3RfdHJlZSk7Ci0gIHZvaWQgc2V0X2RlZnNfdG9fdmFy eWluZyAoZ2ltcGxlICopOwotICBib29sIHVwZGF0ZV92YWx1ZV9yYW5nZSAoY29uc3RfdHJlZSwg dmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0gIHRyZWUgb3Bfd2l0aF9jb25zdGFudF9zaW5nbGV0b25f dmFsdWVfcmFuZ2UgKHRyZWUpOwotICB2b2lkIGFkanVzdF9yYW5nZV93aXRoX3NjZXYgKHZhbHVl X3JhbmdlX2VxdWl2ICosIGNsYXNzIGxvb3AgKiwKLQkJCSAgICAgICBnaW1wbGUgKiwgdHJlZSk7 Ci0gIHZpcnR1YWwgdm9pZCBkdW1wIChGSUxFICopIG92ZXJyaWRlOwotCi0gIHZvaWQgZXh0cmFj dF9yYW5nZV9mb3JfdmFyX2Zyb21fY29tcGFyaXNvbl9leHByICh0cmVlLCBlbnVtIHRyZWVfY29k ZSwKLQkJCQkJCSAgIHRyZWUsIHRyZWUsCi0JCQkJCQkgICB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsK LSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fcGhpX25vZGUgKGdwaGkgKiwgdmFsdWVfcmFuZ2Vf ZXF1aXYgKik7Ci0gIHZvaWQgZXh0cmFjdF9yYW5nZV9iYXNpYyAodmFsdWVfcmFuZ2VfZXF1aXYg KiwgZ2ltcGxlICopOwotICB2b2lkIGV4dHJhY3RfcmFuZ2VfZnJvbV9zdG10IChnaW1wbGUgKiwg ZWRnZSAqLCB0cmVlICosIHZhbHVlX3JhbmdlX2VxdWl2ICopOwotCi0gIC8qIEluZGljYXRlIHRo YXQgcHJvcGFnYXRpb24gdGhyb3VnaCB0aGUgbGF0dGljZSBpcyBjb21wbGV0ZS4gICovCi0gIHZv aWQgc2V0X2xhdHRpY2VfcHJvcGFnYXRpb25fY29tcGxldGUgKHZvaWQpIHsgdmFsdWVzX3Byb3Bh Z2F0ZWQgPSB0cnVlOyB9Ci0KLSAgLyogQWxsb2NhdGUgYSBuZXcgdmFsdWVfcmFuZ2Ugb2JqZWN0 LiAgKi8KLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKmFsbG9jYXRlX3ZhbHVlX3JhbmdlX2VxdWl2ICh2 b2lkKQotICAgIHsgcmV0dXJuIHJhbmdlX3F1ZXJ5OjphbGxvY2F0ZV92YWx1ZV9yYW5nZV9lcXVp diAoKTsgfQotICB2b2lkIGZyZWVfdmFsdWVfcmFuZ2UgKHZhbHVlX3JhbmdlX2VxdWl2ICp2cikK LSAgICB7IGZyZWVfdmFsdWVfcmFuZ2VfZXF1aXYgKHZyKTsgfQotCi0gcHJpdmF0ZToKLSAgdmFs dWVfcmFuZ2VfZXF1aXYgKmdldF9sYXR0aWNlX2VudHJ5IChjb25zdF90cmVlKTsKLSAgYm9vbCB2 cnBfc3RtdF9jb21wdXRlc19ub256ZXJvIChnaW1wbGUgKik7Ci0gIHZvaWQgZXh0cmFjdF9yYW5n ZV9mcm9tX2Fzc2lnbm1lbnQgKHZhbHVlX3JhbmdlX2VxdWl2ICosIGdhc3NpZ24gKik7Ci0gIHZv aWQgZXh0cmFjdF9yYW5nZV9mcm9tX2Fzc2VydCAodmFsdWVfcmFuZ2VfZXF1aXYgKiwgdHJlZSk7 Ci0gIHZvaWQgZXh0cmFjdF9yYW5nZV9mcm9tX3NzYV9uYW1lICh2YWx1ZV9yYW5nZV9lcXVpdiAq LCB0cmVlKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fYmluYXJ5X2V4cHIgKHZhbHVlX3Jh bmdlX2VxdWl2ICosIGVudW0gdHJlZV9jb2RlLAotCQkJCSAgICAgICB0cmVlLCB0cmVlLCB0cmVl KTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhwciAodmFsdWVfcmFuZ2VfZXF1 aXYgKiwgZW51bSB0cmVlX2NvZGUsCi0JCQkJICAgICAgdHJlZSwgdHJlZSk7Ci0gIHZvaWQgZXh0 cmFjdF9yYW5nZV9mcm9tX2NvbmRfZXhwciAodmFsdWVfcmFuZ2VfZXF1aXYgKiwgZ2Fzc2lnbiAq KTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fY29tcGFyaXNvbiAodmFsdWVfcmFuZ2VfZXF1 aXYgKiwgZ2ltcGxlICopOwotICB2b2lkIHZycF92aXNpdF9hc3NpZ25tZW50X29yX2NhbGwgKGdp bXBsZSosIHRyZWUgKiwgdmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0gIHZvaWQgdnJwX3Zpc2l0X3N3 aXRjaF9zdG10IChnc3dpdGNoICosIGVkZ2UgKik7Ci0gIGJvb2wgZXh0cmFjdF9yYW5nZV9mcm9t X3Vic2FuX2J1aWx0aW4gKHZhbHVlX3JhbmdlX2VxdWl2ICosIGdpbXBsZSAqKTsKLQotICAvKiBU aGlzIHByb2JhYmx5IGJlbG9uZ3MgaW4gdGhlIGxhdHRpY2UgcmF0aGVyIHRoYW4gaW4gaGVyZS4g ICovCi0gIGJvb2wgdmFsdWVzX3Byb3BhZ2F0ZWQ7Ci0KLSAgLyogQWxsb2NhdGlvbnMgZm9yIGVx dWl2YWxlbmNlcyBhbGwgY29tZSBmcm9tIHRoaXMgb2JzdGFjay4gICovCi0gIGJpdG1hcF9vYnN0 YWNrIHZycF9lcXVpdl9vYnN0YWNrOwotCi0gIC8qIFZhbHVlIHJhbmdlIGFycmF5LiAgQWZ0ZXIg cHJvcGFnYXRpb24sIFZSX1ZBTFVFW0ldIGhvbGRzIHRoZSByYW5nZQotICAgICBvZiB2YWx1ZXMg dGhhdCBTU0EgbmFtZSBOX0kgbWF5IHRha2UuICAqLwotICB1bnNpZ25lZCBpbnQgbnVtX3ZyX3Zh bHVlczsKLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKip2cl92YWx1ZTsKLQotICAvKiBGb3IgYSBQSEkg bm9kZSB3aGljaCBzZXRzIFNTQSBuYW1lIE5fSSwgVlJfQ09VTlRTW0ldIGhvbGRzIHRoZQotICAg ICBudW1iZXIgb2YgZXhlY3V0YWJsZSBlZGdlcyB3ZSBzYXcgdGhlIGxhc3QgdGltZSB3ZSB2aXNp dGVkIHRoZQotICAgICBub2RlLiAgKi8KLSAgaW50ICp2cl9waGlfZWRnZV9jb3VudHM7Ci0gIHNp bXBsaWZ5X3VzaW5nX3JhbmdlcyBzaW1wbGlmaWVyOwotfTsKLQotZXh0ZXJuIHRyZWUgZ2V0X291 dHB1dF9mb3JfdnJwIChnaW1wbGUgKik7Ci0KIGV4dGVybiBib29sIHJhbmdlX2ZpdHNfdHlwZV9w IChjb25zdCB2YWx1ZV9yYW5nZSAqdnIsCiAJCQkgICAgICAgdW5zaWduZWQgZGVzdF9wcmVjaXNp b24sIHNpZ25vcCBkZXN0X3Nnbik7CiBleHRlcm4gYm9vbCBib3VuZHNfb2ZfdmFyX2luX2xvb3Ag KHRyZWUgKm1pbiwgdHJlZSAqbWF4LCByYW5nZV9xdWVyeSAqLAotLSAKMi4zOC4xCgo= --------------G9xgfjfWgeHMYxFMQM0OoNGB Content-Type: text/x-patch; charset=UTF-8; name="0002-Remove-value_range_equiv.patch" Content-Disposition: attachment; filename="0002-Remove-value_range_equiv.patch" Content-Transfer-Encoding: base64 RnJvbSA1ZDNkYjRlMzU4NTUyM2U4YjhhNWFjNWE0YzFhOGNjZjg3YTdhY2QzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogU2F0LCAxOSBOb3YgMjAyMiAxNzo0NDowMiArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92 ZSB2YWx1ZV9yYW5nZV9lcXVpdi4KCldpdGggbGVnYWN5IFZSUCBnb25lLCB2YWx1ZV9yYW5nZV9l cXVpdiBzZXJ2ZXMgbm8gcHVycG9zZSBhbmQgYW55IHVzZXMKb2YgaXQgY2FuIGp1c3QgYmUgcmVw bGFjZWQgd2l0aCB2YWx1ZV9yYW5nZS4KCmdjYy9DaGFuZ2VMb2c6CgoJKiBNYWtlZmlsZS5pbjog UmVtb3ZlIHZhbHVlLXJhbmdlLWVxdWl2Lm8KCSogZ2ltcGxlLWFycmF5LWJvdW5kcy5jYwoJKGFy cmF5X2JvdW5kc19jaGVja2VyOjphcnJheV9ib3VuZHNfY2hlY2tlcik6IFJlbW92ZSBjb21tZW50 LgoJKiB0cmVlLXZycC5jYyAoc3VwcG9ydGVkX3R5cGVzX3ApOiBSZW1vdmUgdXNlIG9mIHZhbHVl X3JhbmdlX2VxdWl2LgoJKiB2YWx1ZS1xdWVyeS5jYyAoY2xhc3MgZXF1aXZfYWxsb2NhdG9yKTog U2FtZS4KCShyYW5nZV9xdWVyeTo6YWxsb2NhdGVfdmFsdWVfcmFuZ2VfZXF1aXYpOiBSZW1vdmUu CgkocmFuZ2VfcXVlcnk6OmZyZWVfdmFsdWVfcmFuZ2VfZXF1aXYpOiBSZW1vdmUuCgkocmFuZ2Vf cXVlcnk6OmdldF92YWx1ZV9yYW5nZSk6IFJlbW92ZS4KCSogdmFsdWUtcXVlcnkuaCAoY2xhc3Mg cmFuZ2VfcXVlcnkpOiBSZW1vdmUgZ2V0X3ZhbHVlX3JhbmdlLgoJUmVtb3ZlIGFsbG9jYXRlX3Zh bHVlX3JhbmdlX2VxdWl2LgoJUmVtb3ZlIGZyZWVfdmFsdWVfcmFuZ2VfZXF1aXYuCgkqIHZyLXZh bHVlcy5jYyAoY29tcGFyZV9yYW5nZXMpOiBSZXBsYWNlIHZhbHVlX3JhbmdlX2VxdWl2IHdpdGgK CXZhbHVlX3JhbmdlLgoJKHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6Z2V0X3ZyX2Zvcl9jb21wYXJp c29uKTogU2FtZS4KCShzaW1wbGlmeV91c2luZ19yYW5nZXM6OmNvbXBhcmVfbmFtZXMpOiBTYW1l LgoJKiB2ci12YWx1ZXMuaDogUmVtb3ZlIHZhbHVlX3JhbmdlX2VxdWl2IHJlZmVyZW5jZXMuCgkq IHZhbHVlLXJhbmdlLWVxdWl2LmNjOiBSZW1vdmVkLgoJKiB2YWx1ZS1yYW5nZS1lcXVpdi5oOiBS ZW1vdmVkLgotLS0KIGdjYy9NYWtlZmlsZS5pbiAgICAgICAgICAgIHwgICAxIC0KIGdjYy9naW1w bGUtYXJyYXktYm91bmRzLmNjIHwgICAzIC0KIGdjYy90cmVlLXZycC5jYyAgICAgICAgICAgIHwg ICA1ICstCiBnY2MvdmFsdWUtcXVlcnkuY2MgICAgICAgICB8ICAyNSArLS0KIGdjYy92YWx1ZS1x dWVyeS5oICAgICAgICAgIHwgICA1ICstCiBnY2MvdmFsdWUtcmFuZ2UtZXF1aXYuY2MgICB8IDMz MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBnY2MvdmFsdWUtcmFuZ2Ut ZXF1aXYuaCAgICB8ICA5MCAtLS0tLS0tLS0tCiBnY2MvdnItdmFsdWVzLmNjICAgICAgICAgICB8 ICA5OCArKystLS0tLS0tLQogZ2NjL3ZyLXZhbHVlcy5oICAgICAgICAgICAgfCAgIDcgKy0KIDkg ZmlsZXMgY2hhbmdlZCwgMzQgaW5zZXJ0aW9ucygrKSwgNTMwIGRlbGV0aW9ucygtKQogZGVsZXRl IG1vZGUgMTAwNjQ0IGdjYy92YWx1ZS1yYW5nZS1lcXVpdi5jYwogZGVsZXRlIG1vZGUgMTAwNjQ0 IGdjYy92YWx1ZS1yYW5nZS1lcXVpdi5oCgpkaWZmIC0tZ2l0IGEvZ2NjL01ha2VmaWxlLmluIGIv Z2NjL01ha2VmaWxlLmluCmluZGV4IDVhZDYzOGY1OWQ4Li44NmUzMWViMTVmNyAxMDA2NDQKLS0t IGEvZ2NjL01ha2VmaWxlLmluCisrKyBiL2djYy9NYWtlZmlsZS5pbgpAQCAtMTcxNiw3ICsxNzE2 LDYgQEAgT0JKUyA9IFwKIAl2YWx1ZS1wb2ludGVyLWVxdWl2Lm8gXAogCXZhbHVlLXF1ZXJ5Lm8g XAogCXZhbHVlLXJhbmdlLm8gXAotCXZhbHVlLXJhbmdlLWVxdWl2Lm8gXAogCXZhbHVlLXJhbmdl LXByZXR0eS1wcmludC5vIFwKIAl2YWx1ZS1yYW5nZS1zdG9yYWdlLm8gXAogCXZhbHVlLXJlbGF0 aW9uLm8gXApkaWZmIC0tZ2l0IGEvZ2NjL2dpbXBsZS1hcnJheS1ib3VuZHMuY2MgYi9nY2MvZ2lt cGxlLWFycmF5LWJvdW5kcy5jYwppbmRleCBmYmY0NDhlMDQ1ZC4uMWVhZmQzZmQzZTEgMTAwNjQ0 Ci0tLSBhL2djYy9naW1wbGUtYXJyYXktYm91bmRzLmNjCisrKyBiL2djYy9naW1wbGUtYXJyYXkt Ym91bmRzLmNjCkBAIC00Niw5ICs0Niw2IEBAIGFycmF5X2JvdW5kc19jaGVja2VyOjphcnJheV9i b3VuZHNfY2hlY2tlciAoc3RydWN0IGZ1bmN0aW9uICpmdW5jLAogICAvKiBOby1vcC4gICovCiB9 CiAKLS8vIFRoaXMgcHVycG9zZWx5IHJldHVybnMgYSB2YWx1ZV9yYW5nZSwgbm90IGEgdmFsdWVf cmFuZ2VfZXF1aXYsIHRvCi0vLyBicmVhayB0aGUgZGVwZW5kZW5jeSBvbiBlcXVpdmFsZW5jZXMg Zm9yIHRoaXMgcGFzcy4KLQogY29uc3QgdmFsdWVfcmFuZ2UgKgogYXJyYXlfYm91bmRzX2NoZWNr ZXI6OmdldF92YWx1ZV9yYW5nZSAoY29uc3RfdHJlZSBvcCwgZ2ltcGxlICpzdG10KQogewpkaWZm IC0tZ2l0IGEvZ2NjL3RyZWUtdnJwLmNjIGIvZ2NjL3RyZWUtdnJwLmNjCmluZGV4IDg2OTc4MDg2 Y2ZiLi5kZjJmMWVhZTIwMyAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdnJwLmNjCisrKyBiL2djYy90 cmVlLXZycC5jYwpAQCAtNTgyLDEwICs1ODIsOSBAQCBjb21wYXJlX3ZhbHVlcyAodHJlZSB2YWwx LCB0cmVlIHZhbDIpCiBzdGF0aWMgYm9vbAogc3VwcG9ydGVkX3R5cGVzX3AgKHZhbHVlX3Jhbmdl ICp2ciwKIAkJICAgdHJlZSB0eXBlMCwKLQkJICAgdHJlZSB0eXBlMSA9IE5VTEwpCisJCSAgIHRy ZWUgPSBOVUxMKQogewotICBpZiAoIXZhbHVlX3JhbmdlX2VxdWl2OjpzdXBwb3J0c19wICh0eXBl MCkKLSAgICAgIHx8ICh0eXBlMSAmJiAhdmFsdWVfcmFuZ2VfZXF1aXY6OnN1cHBvcnRzX3AgKHR5 cGUxKSkpCisgIGlmICghdmFsdWVfcmFuZ2U6OnN1cHBvcnRzX3AgKHR5cGUwKSkKICAgICB7CiAg ICAgICB2ci0+c2V0X3ZhcnlpbmcgKHR5cGUwKTsKICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAt LWdpdCBhL2djYy92YWx1ZS1xdWVyeS5jYyBiL2djYy92YWx1ZS1xdWVyeS5jYwppbmRleCBlODk4 OGVkNjdlMC4uZjg5MjI1ZDc0OGEgMTAwNjQ0Ci0tLSBhL2djYy92YWx1ZS1xdWVyeS5jYworKysg Yi9nY2MvdmFsdWUtcXVlcnkuY2MKQEAgLTI4LDcgKzI4LDYgQEAgYWxvbmcgd2l0aCBHQ0M7IHNl ZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICNpbmNsdWRlICJzc2EuaCIKICNpbmNs dWRlICJ0cmVlLXByZXR0eS1wcmludC5oIgogI2luY2x1ZGUgImZvbGQtY29uc3QuaCIKLSNpbmNs dWRlICJ2YWx1ZS1yYW5nZS1lcXVpdi5oIgogI2luY2x1ZGUgInZhbHVlLXF1ZXJ5LmgiCiAjaW5j bHVkZSAiYWxsb2MtcG9vbC5oIgogI2luY2x1ZGUgImdpbXBsZS1yYW5nZS5oIgpAQCAtMTQzLDM0 ICsxNDIsMjIgQEAgcmFuZ2VfcXVlcnk6OmR1bXAgKEZJTEUgKikKIHsKIH0KIAotLy8gdmFsdWF0 aW9uX3F1ZXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHZhbHVlX3JhbmdlX2VxdWl2J3MuCisvLyB2 YWx1YXRpb25fcXVlcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdmFsdWVfcmFuZ2Uncy4KIAotY2xh c3MgZXF1aXZfYWxsb2NhdG9yIDogcHVibGljIG9iamVjdF9hbGxvY2F0b3I8dmFsdWVfcmFuZ2Vf ZXF1aXY+CitjbGFzcyBlcXVpdl9hbGxvY2F0b3IgOiBwdWJsaWMgb2JqZWN0X2FsbG9jYXRvcjx2 YWx1ZV9yYW5nZT4KIHsKIHB1YmxpYzoKICAgZXF1aXZfYWxsb2NhdG9yICgpCi0gICAgOiBvYmpl Y3RfYWxsb2NhdG9yPHZhbHVlX3JhbmdlX2VxdWl2PiAoImVxdWl2X2FsbG9jYXRvciBwb29sIikg eyB9CisgICAgOiBvYmplY3RfYWxsb2NhdG9yPHZhbHVlX3JhbmdlPiAoImVxdWl2X2FsbG9jYXRv ciBwb29sIikgeyB9CiB9OwogCi12YWx1ZV9yYW5nZV9lcXVpdiAqCi1yYW5nZV9xdWVyeTo6YWxs b2NhdGVfdmFsdWVfcmFuZ2VfZXF1aXYgKCkKLXsKLSAgcmV0dXJuIG5ldyAoZXF1aXZfYWxsb2Mt PmFsbG9jYXRlICgpKSB2YWx1ZV9yYW5nZV9lcXVpdjsKLX0KLQotdm9pZAotcmFuZ2VfcXVlcnk6 OmZyZWVfdmFsdWVfcmFuZ2VfZXF1aXYgKHZhbHVlX3JhbmdlX2VxdWl2ICp2KQotewotICBlcXVp dl9hbGxvYy0+cmVtb3ZlICh2KTsKLX0KLQotY29uc3QgY2xhc3MgdmFsdWVfcmFuZ2VfZXF1aXYg KgorY29uc3QgdmFsdWVfcmFuZ2UgKgogcmFuZ2VfcXVlcnk6OmdldF92YWx1ZV9yYW5nZSAoY29u c3RfdHJlZSBleHByLCBnaW1wbGUgKnN0bXQpCiB7CiAgIGludF9yYW5nZV9tYXggcjsKICAgaWYg KHJhbmdlX29mX2V4cHIgKHIsIGNvbnN0X2Nhc3Q8dHJlZT4gKGV4cHIpLCBzdG10KSkKLSAgICBy ZXR1cm4gbmV3IChlcXVpdl9hbGxvYy0+YWxsb2NhdGUgKCkpIHZhbHVlX3JhbmdlX2VxdWl2IChy KTsKLSAgcmV0dXJuIG5ldyAoZXF1aXZfYWxsb2MtPmFsbG9jYXRlICgpKSB2YWx1ZV9yYW5nZV9l cXVpdiAoVFJFRV9UWVBFIChleHByKSk7CisgICAgcmV0dXJuIG5ldyAoZXF1aXZfYWxsb2MtPmFs bG9jYXRlICgpKSB2YWx1ZV9yYW5nZSAocik7CisgIHJldHVybiBuZXcgKGVxdWl2X2FsbG9jLT5h bGxvY2F0ZSAoKSkgdmFsdWVfcmFuZ2UgKFRSRUVfVFlQRSAoZXhwcikpOwogfQogCiByYW5nZV9x dWVyeTo6cmFuZ2VfcXVlcnkgKCkKZGlmZiAtLWdpdCBhL2djYy92YWx1ZS1xdWVyeS5oIGIvZ2Nj L3ZhbHVlLXF1ZXJ5LmgKaW5kZXggYjhlNmZlZGZiMjguLmI4NjBkNjZkZjIwIDEwMDY0NAotLS0g YS9nY2MvdmFsdWUtcXVlcnkuaAorKysgYi9nY2MvdmFsdWUtcXVlcnkuaApAQCAtMTA2LDEzICsx MDYsMTAgQEAgcHVibGljOgogCiAgIC8vIERFUFJFQ0FURUQ6IFRoaXMgbWV0aG9kIGlzIHVzZWQg ZnJvbSB2ci12YWx1ZXMuICBUaGUgcGxhbiBpcyB0bwogICAvLyByZXdyaXRlIGFsbCB1c2VzIG9m IGl0IHRvIHRoZSBhYm92ZSBBUEkuCi0gIHZpcnR1YWwgY29uc3QgY2xhc3MgdmFsdWVfcmFuZ2Vf ZXF1aXYgKmdldF92YWx1ZV9yYW5nZSAoY29uc3RfdHJlZSwKLQkJCQkJCQkgIGdpbXBsZSAqID0g TlVMTCk7CisgIHZpcnR1YWwgY29uc3QgdmFsdWVfcmFuZ2UgKmdldF92YWx1ZV9yYW5nZSAoY29u c3RfdHJlZSwgZ2ltcGxlICogPSBOVUxMKTsKICAgdmlydHVhbCB2b2lkIGR1bXAgKEZJTEUgKik7 CiAKIHByb3RlY3RlZDoKLSAgY2xhc3MgdmFsdWVfcmFuZ2VfZXF1aXYgKmFsbG9jYXRlX3ZhbHVl X3JhbmdlX2VxdWl2ICgpOwotICB2b2lkIGZyZWVfdmFsdWVfcmFuZ2VfZXF1aXYgKGNsYXNzIHZh bHVlX3JhbmdlX2VxdWl2ICopOwogICBib29sIGdldF90cmVlX3JhbmdlICh2cmFuZ2UgJnYsIHRy ZWUgZXhwciwgZ2ltcGxlICpzdG10KTsKICAgYm9vbCBnZXRfYXJpdGhfZXhwcl9yYW5nZSAodnJh bmdlICZyLCB0cmVlIGV4cHIsIGdpbXBsZSAqc3RtdCk7CiAgIHJlbGF0aW9uX29yYWNsZSAqbV9v cmFjbGU7CmRpZmYgLS1naXQgYS9nY2MvdmFsdWUtcmFuZ2UtZXF1aXYuY2MgYi9nY2MvdmFsdWUt cmFuZ2UtZXF1aXYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNThlNWE5MGJj Li4wMDAwMDAwMDAwMAotLS0gYS9nY2MvdmFsdWUtcmFuZ2UtZXF1aXYuY2MKKysrIC9kZXYvbnVs bApAQCAtMSwzMzAgKzAsMCBAQAotLyogU3VwcG9ydCByb3V0aW5lcyBmb3IgdmFsdWUgcmFuZ2Vz IHdpdGggZXF1aXZhbGVuY2VzLgotICAgQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KLQotR0ND IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK LWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0NDIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVS Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKLWFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCi08 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi Ci0jaW5jbHVkZSAic3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZXR5cGVzLmgiCi0jaW5jbHVkZSAi YmFja2VuZC5oIgotI2luY2x1ZGUgInRyZWUuaCIKLSNpbmNsdWRlICJnaW1wbGUuaCIKLSNpbmNs dWRlICJzc2EuaCIKLSNpbmNsdWRlICJ0cmVlLXByZXR0eS1wcmludC5oIgotI2luY2x1ZGUgInZh bHVlLXJhbmdlLWVxdWl2LmgiCi0KLXZhbHVlX3JhbmdlX2VxdWl2Ojp2YWx1ZV9yYW5nZV9lcXVp diAodHJlZSBtaW4sIHRyZWUgbWF4LCBiaXRtYXAgZXF1aXYsCi0JCQkJICAgICAgdmFsdWVfcmFu Z2Vfa2luZCBraW5kKQotewotICBtX2VxdWl2ID0gTlVMTDsKLSAgc2V0IChtaW4sIG1heCwgZXF1 aXYsIGtpbmQpOwotfQotCi12YWx1ZV9yYW5nZV9lcXVpdjo6dmFsdWVfcmFuZ2VfZXF1aXYgKGNv bnN0IHZhbHVlX3JhbmdlICZvdGhlcikKLXsKLSAgbV9lcXVpdiA9IE5VTEw7Ci0gIHNldCAob3Ro ZXIubWluKCksIG90aGVyLm1heCAoKSwgTlVMTCwgb3RoZXIua2luZCAoKSk7Ci19Ci0KLXZvaWQK LXZhbHVlX3JhbmdlX2VxdWl2OjpzZXQgKHRyZWUgbWluLCB0cmVlIG1heCwgYml0bWFwIGVxdWl2 LAotCQkJdmFsdWVfcmFuZ2Vfa2luZCBraW5kKQotewotICB2YWx1ZV9yYW5nZTo6c2V0IChtaW4s IG1heCwga2luZCk7Ci0gIHNldF9lcXVpdiAoZXF1aXYpOwotICBpZiAoZmxhZ19jaGVja2luZykK LSAgICBjaGVjayAoKTsKLX0KLQotdm9pZAotdmFsdWVfcmFuZ2VfZXF1aXY6OnNldCAodHJlZSBt aW4sIHRyZWUgbWF4LCB2YWx1ZV9yYW5nZV9raW5kIGtpbmQpCi17Ci0gIHNldCAobWluLCBtYXgs IG1fZXF1aXYsIGtpbmQpOwotfQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVpdjo6c2V0ICh0cmVl IHZhbCkKLXsKLSAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFICh2YWwpID09IFNTQV9OQU1FIHx8IGlz X2dpbXBsZV9taW5faW52YXJpYW50ICh2YWwpKTsKLSAgaWYgKFRSRUVfT1ZFUkZMT1dfUCAodmFs KSkKLSAgICB2YWwgPSBkcm9wX3RyZWVfb3ZlcmZsb3cgKHZhbCk7Ci0gIHNldCAodmFsLCB2YWwp OwotfQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVpdjo6c2V0X3VuZGVmaW5lZCAoKQotewotICBz ZXQgKE5VTEwsIE5VTEwsIE5VTEwsIFZSX1VOREVGSU5FRCk7Ci19Ci0KLXZvaWQKLXZhbHVlX3Jh bmdlX2VxdWl2OjpzZXRfdmFyeWluZyAodHJlZSB0eXBlKQotewotICB2YWx1ZV9yYW5nZTo6c2V0 X3ZhcnlpbmcgKHR5cGUpOwotICBlcXVpdl9jbGVhciAoKTsKLX0KLQotLyogTGlrZSBzZXQsIGJ1 dCBrZWVwIHRoZSBlcXVpdmFsZW5jZXMgaW4gcGxhY2UuICAqLwotCi12b2lkCi12YWx1ZV9yYW5n ZV9lcXVpdjo6dXBkYXRlICh0cmVlIG1pbiwgdHJlZSBtYXgsIHZhbHVlX3JhbmdlX2tpbmQga2lu ZCkKLXsKLSAgc2V0IChtaW4sIG1heCwKLSAgICAgICAoa2luZCAhPSBWUl9VTkRFRklORUQgJiYg a2luZCAhPSBWUl9WQVJZSU5HKSA/IG1fZXF1aXYgOiBOVUxMLCBraW5kKTsKLX0KLQotLyogQ29w eSB2YWx1ZV9yYW5nZSBpbiBGUk9NIGludG8gVEhJUyB3aGlsZSBhdm9pZGluZyBiaXRtYXAgc2hh cmluZy4KLQotICAgTm90ZTogVGhlIGNvZGUgdGhhdCBhdm9pZHMgdGhlIGJpdG1hcCBzaGFyaW5n IGxvb2tzIGF0IHRoZSBleGlzdGluZwotICAgdGhpcy0+bV9lcXVpdiwgc28gdGhpcyBmdW5jdGlv biBjYW5ub3QgYmUgdXNlZCB0byBpbml0YWxpemUgYW4KLSAgIG9iamVjdC4gIFVzZSB0aGUgY29u c3RydWN0b3JzIGZvciBpbml0aWFsaXphdGlvbi4gICovCi0KLXZvaWQKLXZhbHVlX3JhbmdlX2Vx dWl2OjpkZWVwX2NvcHkgKGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICpmcm9tKQotewotICBzZXQg KGZyb20tPm1pbiAoKSwgZnJvbS0+bWF4ICgpLCBmcm9tLT5tX2VxdWl2LCBmcm9tLT5raW5kICgp KTsKLX0KLQotdm9pZAotdmFsdWVfcmFuZ2VfZXF1aXY6Om1vdmUgKHZhbHVlX3JhbmdlX2VxdWl2 ICpmcm9tKQotewotICBzZXQgKGZyb20tPm1pbiAoKSwgZnJvbS0+bWF4ICgpLCBOVUxMLCBmcm9t LT5raW5kICgpKTsKLSAgbV9lcXVpdiA9IGZyb20tPm1fZXF1aXY7Ci0gIGZyb20tPm1fZXF1aXYg PSBOVUxMOwotfQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVpdjo6c2V0X2VxdWl2IChiaXRtYXAg ZXF1aXYpCi17Ci0gIGlmICh1bmRlZmluZWRfcCAoKSB8fCB2YXJ5aW5nX3AgKCkpCi0gICAgZXF1 aXYgPSBOVUxMOwotICAvKiBTaW5jZSB1cGRhdGluZyB0aGUgZXF1aXZhbGVuY2Ugc2V0IGludm9s dmVzIGRlZXAgY29weWluZyB0aGUKLSAgICAgYml0bWFwcywgb25seSBkbyBpdCBpZiBhYnNvbHV0 ZWx5IG5lY2Vzc2FyeS4KLQotICAgICBBbGwgZXF1aXZhbGVuY2UgYml0bWFwcyBhcmUgYWxsb2Nh dGVkIGZyb20gdGhlIHNhbWUgb2JzdGFjay4gIFNvCi0gICAgIHdlIGNhbiB1c2UgdGhlIG9ic3Rh Y2sgYXNzb2NpYXRlZCB3aXRoIEVRVUlWIHRvIGFsbG9jYXRlIHZyLT5lcXVpdi4gICovCi0gIGlm IChtX2VxdWl2ID09IE5VTEwKLSAgICAgICYmIGVxdWl2ICE9IE5VTEwpCi0gICAgbV9lcXVpdiA9 IEJJVE1BUF9BTExPQyAoZXF1aXYtPm9ic3RhY2spOwotCi0gIGlmIChlcXVpdiAhPSBtX2VxdWl2 KQotICAgIHsKLSAgICAgIGlmIChlcXVpdiAmJiAhYml0bWFwX2VtcHR5X3AgKGVxdWl2KSkKLQli aXRtYXBfY29weSAobV9lcXVpdiwgZXF1aXYpOwotICAgICAgZWxzZQotCWJpdG1hcF9jbGVhciAo bV9lcXVpdik7Ci0gICAgfQotfQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVpdjo6Y2hlY2sgKCkK LXsKLSAgdmFsdWVfcmFuZ2U6OnZlcmlmeV9yYW5nZSAoKTsKLSAgc3dpdGNoIChraW5kICgpKQot ICAgIHsKLSAgICBjYXNlIFZSX1VOREVGSU5FRDoKLSAgICBjYXNlIFZSX1ZBUllJTkc6Ci0gICAg ICBnY2NfYXNzZXJ0ICghbV9lcXVpdiB8fCBiaXRtYXBfZW1wdHlfcCAobV9lcXVpdikpOwotICAg IGRlZmF1bHQ6OwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGJpdG1hcHMgQjEg YW5kIEIyIGFyZSBlcXVhbC4gICovCi0KLXN0YXRpYyBib29sCi12cl9iaXRtYXBfZXF1YWxfcCAo Y29uc3RfYml0bWFwIGIxLCBjb25zdF9iaXRtYXAgYjIpCi17Ci0gIHJldHVybiAoYjEgPT0gYjIK LQkgIHx8ICgoIWIxIHx8IGJpdG1hcF9lbXB0eV9wIChiMSkpCi0JICAgICAgJiYgKCFiMiB8fCBi aXRtYXBfZW1wdHlfcCAoYjIpKSkKLQkgIHx8IChiMSAmJiBiMgotCSAgICAgICYmIGJpdG1hcF9l cXVhbF9wIChiMSwgYjIpKSk7Ci19Ci0KLS8qIFJldHVybnMgVFJVRSBpZiBUSElTID09IE9USEVS LiAgSWdub3JlcyB0aGUgZXF1aXZhbGVuY2UgYml0bWFwIGlmCi0gICBJR05PUkVfRVFVSVZTIGlz IFRSVUUuICAqLwotCi1ib29sCi12YWx1ZV9yYW5nZV9lcXVpdjo6ZXF1YWxfcCAoY29uc3QgdmFs dWVfcmFuZ2VfZXF1aXYgJm90aGVyLAotCQkJICAgIGJvb2wgaWdub3JlX2VxdWl2cykgY29uc3QK LXsKLSAgcmV0dXJuICh2YWx1ZV9yYW5nZTo6b3BlcmF0b3I9PSAob3RoZXIpCi0JICAmJiAoaWdu b3JlX2VxdWl2cyB8fCB2cl9iaXRtYXBfZXF1YWxfcCAobV9lcXVpdiwgb3RoZXIubV9lcXVpdikp KTsKLX0KLQotdm9pZAotdmFsdWVfcmFuZ2VfZXF1aXY6OmVxdWl2X2NsZWFyICgpCi17Ci0gIGlm IChtX2VxdWl2KQotICAgIGJpdG1hcF9jbGVhciAobV9lcXVpdik7Ci19Ci0KLS8qIEFkZCBWQVIg YW5kIFZBUidzIGVxdWl2YWxlbmNlIHNldCAoVkFSX1ZSKSB0byB0aGUgZXF1aXZhbGVuY2UKLSAg IGJpdG1hcC4gIElmIG5vIGVxdWl2YWxlbmNlIHRhYmxlIGhhcyBiZWVuIGNyZWF0ZWQsIE9CU1RB Q0sgaXMgdGhlCi0gICBvYnN0YWNrIHRvIHVzZSAoTlVMTCBmb3IgdGhlIGRlZmF1bHQgb2JzdGFj aykuCi0KLSAgIFRoaXMgaXMgdGhlIGNlbnRyYWwgcG9pbnQgd2hlcmUgZXF1aXZhbGVuY2UgcHJv Y2Vzc2luZyBjYW4gYmUKLSAgIHR1cm5lZCBvbi9vZmYuICAqLwotCi12b2lkCi12YWx1ZV9yYW5n ZV9lcXVpdjo6ZXF1aXZfYWRkIChjb25zdF90cmVlIHZhciwKLQkJCSAgICAgIGNvbnN0IHZhbHVl X3JhbmdlX2VxdWl2ICp2YXJfdnIsCi0JCQkgICAgICBiaXRtYXBfb2JzdGFjayAqb2JzdGFjaykK LXsKLSAgaWYgKCFtX2VxdWl2KQotICAgIG1fZXF1aXYgPSBCSVRNQVBfQUxMT0MgKG9ic3RhY2sp OwotICB1bnNpZ25lZCB2ZXIgPSBTU0FfTkFNRV9WRVJTSU9OICh2YXIpOwotICBiaXRtYXBfc2V0 X2JpdCAobV9lcXVpdiwgdmVyKTsKLSAgaWYgKHZhcl92ciAmJiB2YXJfdnItPm1fZXF1aXYpCi0g ICAgYml0bWFwX2lvcl9pbnRvIChtX2VxdWl2LCB2YXJfdnItPm1fZXF1aXYpOwotfQotCi12b2lk Ci12YWx1ZV9yYW5nZV9lcXVpdjo6bGVnYWN5X3ZlcmJvc2VfaW50ZXJzZWN0IChjb25zdCB2YWx1 ZV9yYW5nZV9lcXVpdiAqb3RoZXIpCi17Ci0gIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3Mg JiBUREZfREVUQUlMUykpCi0gICAgewotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiSW50ZXJz ZWN0aW5nXG4gICIpOwotICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVtcF9maWxlLCB0aGlzKTsK LSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuYW5kXG4gICIpOwotICAgICAgZHVtcF92YWx1 ZV9yYW5nZSAoZHVtcF9maWxlLCBvdGhlcik7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJc biIpOwotICAgIH0KLQotICAvKiBJZiBUSElTIGlzIHZhcnlpbmcgd2Ugd2FudCB0byBwaWNrIHVw IGVxdWl2YWxlbmNlcyBmcm9tIE9USEVSLgotICAgICBKdXN0IHNwZWNpYWwtY2FzZSB0aGlzIGhl cmUgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZpeHVwIGFmdGVyIHRoZQotICAgICBmYWN0LiAgKi8K LSAgaWYgKHRoaXMtPnZhcnlpbmdfcCAoKSkKLSAgICB0aGlzLT5kZWVwX2NvcHkgKG90aGVyKTsK LSAgZWxzZQotICAgIHsKLSAgICAgIGxlZ2FjeV9pbnRlcnNlY3QgKHRoaXMsIG90aGVyKTsKLSAg ICAgIGlmICh2YXJ5aW5nX3AgKCkgfHwgdW5kZWZpbmVkX3AgKCkpCi0JZXF1aXZfY2xlYXIgKCk7 Ci0KLSAgICAgIC8qIElmIHRoZSByZXN1bHQgaXMgVlJfVU5ERUZJTkVEIHRoZXJlIGlzIG5vIG5l ZWQgdG8gbWVzcyB3aXRoCi0JIGVxdWl2YWxlbmNpZXMuICAqLwotICAgICAgaWYgKCF1bmRlZmlu ZWRfcCAoKSkKLQl7Ci0JICAvKiBUaGUgcmVzdWx0aW5nIHNldCBvZiBlcXVpdmFsZW5jZXMgZm9y IHJhbmdlIGludGVyc2VjdGlvbgotCSAgICAgaXMgdGhlIHVuaW9uIG9mIHRoZSB0d28gc2V0cy4g ICovCi0JICBpZiAobV9lcXVpdiAmJiBvdGhlci0+bV9lcXVpdiAmJiBtX2VxdWl2ICE9IG90aGVy LT5tX2VxdWl2KQotCSAgICBiaXRtYXBfaW9yX2ludG8gKG1fZXF1aXYsIG90aGVyLT5tX2VxdWl2 KTsKLQkgIGVsc2UgaWYgKG90aGVyLT5tX2VxdWl2ICYmICFtX2VxdWl2KQotCSAgICB7Ci0JICAg ICAgLyogQWxsIGVxdWl2YWxlbmNlIGJpdG1hcHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzYW1l Ci0JCSBvYnN0YWNrLiAgU28gd2UgY2FuIHVzZSB0aGUgb2JzdGFjayBhc3NvY2lhdGVkIHdpdGgK LQkJIFZSIHRvIGFsbG9jYXRlIHRoaXMtPm1fZXF1aXYuICAqLwotCSAgICAgIG1fZXF1aXYgPSBC SVRNQVBfQUxMT0MgKG90aGVyLT5tX2VxdWl2LT5vYnN0YWNrKTsKLQkgICAgICBiaXRtYXBfY29w eSAobV9lcXVpdiwgb3RoZXItPm1fZXF1aXYpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAo ZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIHsKLSAgICAgIGZw cmludGYgKGR1bXBfZmlsZSwgInRvXG4gICIpOwotICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVt cF9maWxlLCB0aGlzKTsKLSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0gICAgfQot fQotCi12b2lkCi12YWx1ZV9yYW5nZV9lcXVpdjo6bGVnYWN5X3ZlcmJvc2VfdW5pb25fIChjb25z dCB2YWx1ZV9yYW5nZV9lcXVpdiAqb3RoZXIpCi17Ci0gIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBf ZmxhZ3MgJiBUREZfREVUQUlMUykpCi0gICAgewotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAi TWVldGluZ1xuICAiKTsKLSAgICAgIGR1bXBfdmFsdWVfcmFuZ2UgKGR1bXBfZmlsZSwgdGhpcyk7 Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbmFuZFxuICAiKTsKLSAgICAgIGR1bXBfdmFs dWVfcmFuZ2UgKGR1bXBfZmlsZSwgb3RoZXIpOwotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAi XG4iKTsKLSAgICB9Ci0KLSAgLyogSWYgVEhJUyBpcyB1bmRlZmluZWQgd2Ugd2FudCB0byBwaWNr IHVwIGVxdWl2YWxlbmNlcyBmcm9tIE9USEVSLgotICAgICBKdXN0IHNwZWNpYWwtY2FzZSB0aGlz IGhlcmUgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZpeHVwIGFmdGVyIHRoZSBmYWN0LiAgKi8KLSAg aWYgKHRoaXMtPnVuZGVmaW5lZF9wICgpKQotICAgIHRoaXMtPmRlZXBfY29weSAob3RoZXIpOwot ICBlbHNlCi0gICAgewotICAgICAgbGVnYWN5X3VuaW9uICh0aGlzLCBvdGhlcik7Ci0gICAgICBp ZiAodmFyeWluZ19wICgpIHx8IHVuZGVmaW5lZF9wICgpKQotCWVxdWl2X2NsZWFyICgpOwotCi0g ICAgICAvKiBUaGUgcmVzdWx0aW5nIHNldCBvZiBlcXVpdmFsZW5jZXMgaXMgYWx3YXlzIHRoZSBp bnRlcnNlY3Rpb24gb2YKLQkgdGhlIHR3byBzZXRzLiAgKi8KLSAgICAgIGlmICh0aGlzLT5tX2Vx dWl2ICYmIG90aGVyLT5tX2VxdWl2ICYmIHRoaXMtPm1fZXF1aXYgIT0gb3RoZXItPm1fZXF1aXYp Ci0JYml0bWFwX2FuZF9pbnRvICh0aGlzLT5tX2VxdWl2LCBvdGhlci0+bV9lcXVpdik7Ci0gICAg ICBlbHNlIGlmICh0aGlzLT5tX2VxdWl2ICYmICFvdGhlci0+bV9lcXVpdikKLQliaXRtYXBfY2xl YXIgKHRoaXMtPm1fZXF1aXYpOwotICAgIH0KLQotICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2Zs YWdzICYgVERGX0RFVEFJTFMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgInRv XG4gICIpOwotICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVtcF9maWxlLCB0aGlzKTsKLSAgICAg IGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0gICAgfQotfQotCi12b2lkCi12YWx1ZV9yYW5n ZV9lcXVpdjo6ZHVtcCAoRklMRSAqZmlsZSkgY29uc3QKLXsKLSAgdmFsdWVfcmFuZ2U6OmR1bXAg KGZpbGUpOwotICBpZiAoKGtpbmQgKCkgPT0gVlJfUkFOR0UgfHwga2luZCAoKSA9PSBWUl9BTlRJ X1JBTkdFKQotICAgICAgJiYgbV9lcXVpdikKLSAgICB7Ci0gICAgICBiaXRtYXBfaXRlcmF0b3Ig Ymk7Ci0gICAgICB1bnNpZ25lZCBpLCBjID0gMDsKLQotICAgICAgZnByaW50ZiAoZmlsZSwgIiAg RVFVSVZBTEVOQ0VTOiB7ICIpOwotICAgICAgRVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChtX2Vx dWl2LCAwLCBpLCBiaSkKLQl7Ci0JICBwcmludF9nZW5lcmljX2V4cHIgKGZpbGUsIHNzYV9uYW1l IChpKSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICIpOwotCSAgYysrOwotCX0KLSAgICAgIGZwcmlu dGYgKGZpbGUsICJ9ICgldSBlbGVtZW50cykiLCBjKTsKLSAgICB9Ci19Ci0KLXZvaWQKLXZhbHVl X3JhbmdlX2VxdWl2OjpkdW1wICgpIGNvbnN0Ci17Ci0gIGR1bXAgKHN0ZGVycik7Ci19Ci0KLXZv aWQKLWR1bXBfdmFsdWVfcmFuZ2UgKEZJTEUgKmZpbGUsIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2 ICp2cikKLXsKLSAgaWYgKCF2cikKLSAgICBmcHJpbnRmIChmaWxlLCAiW10iKTsKLSAgZWxzZQot ICAgIHZyLT5kdW1wIChmaWxlKTsKLX0KLQotREVCVUdfRlVOQ1RJT04gdm9pZAotZGVidWcgKGNv bnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2cikKLXsKLSAgZHVtcF92YWx1ZV9yYW5nZSAoc3RkZXJy LCB2cik7Ci19Ci0KLURFQlVHX0ZVTkNUSU9OIHZvaWQKLWRlYnVnIChjb25zdCB2YWx1ZV9yYW5n ZV9lcXVpdiAmdnIpCi17Ci0gIGR1bXBfdmFsdWVfcmFuZ2UgKHN0ZGVyciwgJnZyKTsKLX0KZGlm ZiAtLWdpdCBhL2djYy92YWx1ZS1yYW5nZS1lcXVpdi5oIGIvZ2NjL3ZhbHVlLXJhbmdlLWVxdWl2 LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODAxNGRmODM0Li4wMDAwMDAwMDAw MAotLS0gYS9nY2MvdmFsdWUtcmFuZ2UtZXF1aXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICsw LDAgQEAKLS8qIFN1cHBvcnQgcm91dGluZXMgZm9yIHZhbHVlIHJhbmdlcyB3aXRoIGVxdWl2YWxl bmNlcy4KLSAgIENvcHlyaWdodCAoQykgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCi0KLUdDQyBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQot dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlv dXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdDQyBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRo IEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQotPGh0dHA6Ly93d3cuZ251 Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBHQ0NfVkFMVUVfUkFOR0VfRVFVSVZfSAot I2RlZmluZSBHQ0NfVkFMVUVfUkFOR0VfRVFVSVZfSAotCi0jaW5jbHVkZSAidmFsdWUtcmFuZ2Uu aCIKLQotLyogTm90ZSB2YWx1ZV9yYW5nZV9lcXVpdiBjYW5ub3QgY3VycmVudGx5IGJlIHVzZWQg d2l0aCBHQyBtZW1vcnksCi0gICBvbmx5IHZhbHVlX3JhbmdlIGlzIGZ1bGx5IHNldCB1cCBmb3Ig dGhpcy4gICovCi1jbGFzcyBHVFkoKHVzZXIpKSB2YWx1ZV9yYW5nZV9lcXVpdiA6IHB1YmxpYyB2 YWx1ZV9yYW5nZQotewotIHB1YmxpYzoKLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKCkgOiB2YWx1ZV9y YW5nZSAoKSB7IG1fZXF1aXYgPSBOVUxMOyB9Ci0gIHZhbHVlX3JhbmdlX2VxdWl2IChjb25zdCB2 YWx1ZV9yYW5nZSAmKTsKLSAgLyogRGVlcC1jb3BpZXMgZXF1aXYgYml0bWFwIGFyZ3VtZW50LiAg Ki8KLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKHRyZWUsIHRyZWUsIGJpdG1hcCA9IE5VTEwsIHZhbHVl X3JhbmdlX2tpbmQgPSBWUl9SQU5HRSk7Ci0KLSAgLyogU2hhbGxvdy1jb3BpZXMgZXF1aXYgYml0 bWFwLiAgKi8KLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICYp IC8qID0gZGVsZXRlICovOwotICAvKiBTaGFsbG93LWNvcGllcyBlcXVpdiBiaXRtYXAuICAqLwot ICB2YWx1ZV9yYW5nZV9lcXVpdiYgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICYp IC8qID0gZGVsZXRlICovOwotCi0gIC8qIFZpcnR1YWwgZGVzdHJ1Y3Rvci4gICovCi0gIHZpcnR1 YWwgfnZhbHVlX3JhbmdlX2VxdWl2ICgpID0gZGVmYXVsdDsKLQotICAvKiBNb3ZlIGVxdWl2IGJp dG1hcCBmcm9tIHNvdXJjZSByYW5nZS4gICovCi0gIHZvaWQgbW92ZSAodmFsdWVfcmFuZ2VfZXF1 aXYgKik7Ci0KLSAgLyogTGVhdmVzIGVxdWl2IGJpdG1hcCBhbG9uZS4gICovCi0gIHZpcnR1YWwg dm9pZCBzZXQgKHRyZWUsIHRyZWUsIHZhbHVlX3JhbmdlX2tpbmQgPSBWUl9SQU5HRSkgb3ZlcnJp ZGU7Ci0gIHZvaWQgdXBkYXRlICh0cmVlLCB0cmVlLCB2YWx1ZV9yYW5nZV9raW5kID0gVlJfUkFO R0UpOwotICAvKiBEZWVwLWNvcGllcyBlcXVpdiBiaXRtYXAgYXJndW1lbnQuICAqLwotICB2b2lk IHNldCAodHJlZSwgdHJlZSwgYml0bWFwLCB2YWx1ZV9yYW5nZV9raW5kID0gVlJfUkFOR0UpOwot ICB2b2lkIHNldCAodHJlZSk7Ci0KLSAgYm9vbCBvcGVyYXRvcj09IChjb25zdCB2YWx1ZV9yYW5n ZV9lcXVpdiAmKSBjb25zdCAvKiA9IGRlbGV0ZSAqLzsKLSAgYm9vbCBvcGVyYXRvciE9IChjb25z dCB2YWx1ZV9yYW5nZV9lcXVpdiAmKSBjb25zdCAvKiA9IGRlbGV0ZSAqLzsKLSAgdm9pZCBsZWdh Y3lfdmVyYm9zZV9pbnRlcnNlY3QgKGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICopOwotICB2b2lk IGxlZ2FjeV92ZXJib3NlX3VuaW9uXyAoY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0gIGJv b2wgZXF1YWxfcCAoY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgJiwgYm9vbCBpZ25vcmVfZXF1aXZz KSBjb25zdDsKLQotICAvKiBUeXBlcyBvZiB2YWx1ZSByYW5nZXMuICAqLwotICB2b2lkIHNldF91 bmRlZmluZWQgKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgc2V0X3ZhcnlpbmcgKHRyZWUpIG92ZXJyaWRl OwotCi0gIC8qIEVxdWl2YWxlbmNlIGJpdG1hcCBtZXRob2RzLiAgKi8KLSAgYml0bWFwIGVxdWl2 ICgpIGNvbnN0IHsgcmV0dXJuIG1fZXF1aXY7IH0KLSAgdm9pZCBlcXVpdl9jbGVhciAoKTsKLSAg dm9pZCBlcXVpdl9hZGQgKGNvbnN0X3RyZWUsIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICosCi0J CSAgYml0bWFwX29ic3RhY2sgKiA9IE5VTEwpOwotCi0gIC8qIE1pc2MgbWV0aG9kcy4gICovCi0g IHZvaWQgZGVlcF9jb3B5IChjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsKLSAgdm9pZCBkdW1w IChGSUxFICopIGNvbnN0OwotICB2b2lkIGR1bXAgKCkgY29uc3Q7Ci0gIHN0YXRpYyBib29sIHN1 cHBvcnRzX3AgKHRyZWUgdHlwZSkKLSAgewotICAgIHJldHVybiBJTlRFR1JBTF9UWVBFX1AgKHR5 cGUpIHx8IFBPSU5URVJfVFlQRV9QICh0eXBlKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLyogRGVl cC1jb3BpZXMgYml0bWFwIGFyZ3VtZW50LiAgKi8KLSAgdm9pZCBzZXRfZXF1aXYgKGJpdG1hcCk7 Ci0gIHZvaWQgY2hlY2sgKCk7Ci0KLSAgLyogU2V0IG9mIFNTQSBuYW1lcyB3aG9zZSB2YWx1ZSBy YW5nZXMgYXJlIGVxdWl2YWxlbnQgdG8gdGhpcyBvbmUuCi0gICAgIFRoaXMgc2V0IGlzIG9ubHkg dmFsaWQgd2hlbiBUWVBFIGlzIFZSX1JBTkdFIG9yIFZSX0FOVElfUkFOR0UuICAqLwotICBiaXRt YXAgbV9lcXVpdjsKLX07Ci0KLWV4dGVybiB2b2lkIGR1bXBfdmFsdWVfcmFuZ2UgKEZJTEUgKiwg Y29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKik7Ci0KLSNlbmRpZiAvLyBHQ0NfVkFMVUVfUkFOR0Vf RVFVSVZfSApkaWZmIC0tZ2l0IGEvZ2NjL3ZyLXZhbHVlcy5jYyBiL2djYy92ci12YWx1ZXMuY2MK aW5kZXggYTEwM2MwOGJhMzUuLjc5OGJmZGM5MDRhIDEwMDY0NAotLS0gYS9nY2MvdnItdmFsdWVz LmNjCisrKyBiL2djYy92ci12YWx1ZXMuY2MKQEAgLTIxNSw4ICsyMTUsOCBAQCBjaGVja19mb3Jf YmluYXJ5X29wX292ZXJmbG93IChyYW5nZV9xdWVyeSAqcXVlcnksCiAKIAogc3RhdGljIHRyZWUK LWNvbXBhcmVfcmFuZ2VzIChlbnVtIHRyZWVfY29kZSBjb21wLCBjb25zdCB2YWx1ZV9yYW5nZV9l cXVpdiAqdnIwLAotCQljb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIxLCBib29sICpzdHJpY3Rf b3ZlcmZsb3dfcCkKK2NvbXBhcmVfcmFuZ2VzIChlbnVtIHRyZWVfY29kZSBjb21wLCBjb25zdCB2 YWx1ZV9yYW5nZSAqdnIwLAorCQljb25zdCB2YWx1ZV9yYW5nZSAqdnIxLCBib29sICpzdHJpY3Rf b3ZlcmZsb3dfcCkKIHsKICAgLyogVkFSWUlORyBvciBVTkRFRklORUQgcmFuZ2VzIGNhbm5vdCBi ZSBjb21wYXJlZC4gICovCiAgIGlmICh2cjAtPnZhcnlpbmdfcCAoKQpAQCAtNjE5LDE5ICs2MTks MjAgQEAgYm91bmRzX29mX3Zhcl9pbl9sb29wICh0cmVlICptaW4sIHRyZWUgKm1heCwgcmFuZ2Vf cXVlcnkgKnF1ZXJ5LAogICAgb3IgYSBzeW1ib2xpYyByYW5nZSBjb250YWluaW5nIHRoZSBTU0Ff TkFNRSBvbmx5IGlmIHRoZSB2YWx1ZSByYW5nZQogICAgaXMgdmFyeWluZyBvciB1bmRlZmluZWQu ICBVc2VzIFRFTSBhcyBzdG9yYWdlIGZvciB0aGUgYWx0ZXJuYXRlIHJhbmdlLiAgKi8KIAotY29u c3QgdmFsdWVfcmFuZ2VfZXF1aXYgKgotc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjpnZXRfdnJfZm9y X2NvbXBhcmlzb24gKGludCBpLCB2YWx1ZV9yYW5nZV9lcXVpdiAqdGVtLAorY29uc3QgdmFsdWVf cmFuZ2UgKgorc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjpnZXRfdnJfZm9yX2NvbXBhcmlzb24gKGlu dCBpLCB2YWx1ZV9yYW5nZSAqdGVtLAogCQkJCQkgICAgICBnaW1wbGUgKnMpCiB7CiAgIC8qIFNo YWxsb3ctY29weSBlcXVpdiBiaXRtYXAuICAqLwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAq dnIgPSBxdWVyeS0+Z2V0X3ZhbHVlX3JhbmdlIChzc2FfbmFtZSAoaSksIHMpOworICBjb25zdCB2 YWx1ZV9yYW5nZSAqdnIgPSBxdWVyeS0+Z2V0X3ZhbHVlX3JhbmdlIChzc2FfbmFtZSAoaSksIHMp OwogCiAgIC8qIElmIG5hbWUgTl9pIGRvZXMgbm90IGhhdmUgYSB2YWxpZCByYW5nZSwgdXNlIE5f aSBhcyBpdHMgb3duCiAgICAgIHJhbmdlLiAgVGhpcyBhbGxvd3MgdXMgdG8gY29tcGFyZSBhZ2Fp bnN0IG5hbWVzIHRoYXQgbWF5CiAgICAgIGhhdmUgTl9pIGluIHRoZWlyIHJhbmdlcy4gICovCiAg IGlmICh2ci0+dmFyeWluZ19wICgpIHx8IHZyLT51bmRlZmluZWRfcCAoKSkKICAgICB7Ci0gICAg ICB0ZW0tPnNldCAoc3NhX25hbWUgKGkpKTsKKyAgICAgIHRyZWUgc3NhID0gc3NhX25hbWUgKGkp OworICAgICAgdGVtLT5zZXQgKHNzYSwgc3NhKTsKICAgICAgIHJldHVybiB0ZW07CiAgICAgfQog CkBAIC02NDYsNzcgKzY0NywyNiBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OmdldF92cl9mb3Jf Y29tcGFyaXNvbiAoaW50IGksIHZhbHVlX3JhbmdlX2VxdWl2ICp0ZW0sCiB0cmVlCiBzaW1wbGlm eV91c2luZ19yYW5nZXM6OmNvbXBhcmVfbmFtZV93aXRoX3ZhbHVlCiAJCQkJKGVudW0gdHJlZV9j b2RlIGNvbXAsIHRyZWUgdmFyLCB0cmVlIHZhbCwKLQkJCQkgYm9vbCAqc3RyaWN0X292ZXJmbG93 X3AsIGJvb2wgdXNlX2VxdWl2X3AsCi0JCQkJIGdpbXBsZSAqcykKKwkJCQkgYm9vbCAqc3RyaWN0 X292ZXJmbG93X3AsIGdpbXBsZSAqcykKIHsKLSAgLyogR2V0IHRoZSBzZXQgb2YgZXF1aXZhbGVu Y2VzIGZvciBWQVIuICAqLwotICBiaXRtYXAgZSA9IHF1ZXJ5LT5nZXRfdmFsdWVfcmFuZ2UgKHZh ciwgcyktPmVxdWl2ICgpOwotCiAgIC8qIFN0YXJ0IGF0IC0xLiAgU2V0IGl0IHRvIDAgaWYgd2Ug ZG8gYSBjb21wYXJpc29uIHdpdGhvdXQgcmVseWluZwogICAgICBvbiBvdmVyZmxvdywgb3IgMSBp ZiBhbGwgY29tcGFyaXNvbnMgcmVseSBvbiBvdmVyZmxvdy4gICovCiAgIGludCB1c2VkX3N0cmlj dF9vdmVyZmxvdyA9IC0xOwogCiAgIC8qIENvbXBhcmUgdmFycycgdmFsdWUgcmFuZ2Ugd2l0aCB2 YWwuICAqLwotICB2YWx1ZV9yYW5nZV9lcXVpdiB0ZW1fdnI7Ci0gIGNvbnN0IHZhbHVlX3Jhbmdl X2VxdWl2ICplcXVpdl92cgorICB2YWx1ZV9yYW5nZSB0ZW1fdnI7CisgIGNvbnN0IHZhbHVlX3Jh bmdlICplcXVpdl92cgogICAgID0gZ2V0X3ZyX2Zvcl9jb21wYXJpc29uIChTU0FfTkFNRV9WRVJT SU9OICh2YXIpLCAmdGVtX3ZyLCBzKTsKICAgYm9vbCBzb3AgPSBmYWxzZTsKICAgdHJlZSByZXR2 YWwgPSBjb21wYXJlX3JhbmdlX3dpdGhfdmFsdWUgKGNvbXAsIGVxdWl2X3ZyLCB2YWwsICZzb3Ap OwogICBpZiAocmV0dmFsKQogICAgIHVzZWRfc3RyaWN0X292ZXJmbG93ID0gc29wID8gMSA6IDA7 CiAKLSAgLyogSWYgdGhlIGVxdWl2IHNldCBpcyBlbXB0eSB3ZSBoYXZlIGRvbmUgYWxsIHdvcmsg d2UgbmVlZCB0byBkby4gICovCi0gIGlmIChlID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHJl dHZhbCAmJiB1c2VkX3N0cmljdF9vdmVyZmxvdyA+IDApCi0JKnN0cmljdF9vdmVyZmxvd19wID0g dHJ1ZTsKLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gIHVuc2lnbmVkIGk7Ci0gIGJp dG1hcF9pdGVyYXRvciBiaTsKLSAgRVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChlLCAwLCBpLCBi aSkKLSAgICB7Ci0gICAgICB0cmVlIG5hbWUgPSBzc2FfbmFtZSAoaSk7Ci0gICAgICBpZiAoIW5h bWUpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICghdXNlX2VxdWl2X3AKLQkgICYmICFTU0FfTkFN RV9JU19ERUZBVUxUX0RFRiAobmFtZSkKLQkgICYmIHByb3Bfc2ltdWxhdGVfYWdhaW5fcCAoU1NB X05BTUVfREVGX1NUTVQgKG5hbWUpKSkKLQljb250aW51ZTsKLQotICAgICAgZXF1aXZfdnIgPSBn ZXRfdnJfZm9yX2NvbXBhcmlzb24gKGksICZ0ZW1fdnIsIHMpOwotICAgICAgc29wID0gZmFsc2U7 Ci0gICAgICB0cmVlIHQgPSBjb21wYXJlX3JhbmdlX3dpdGhfdmFsdWUgKGNvbXAsIGVxdWl2X3Zy LCB2YWwsICZzb3ApOwotICAgICAgaWYgKHQpCi0JewotCSAgLyogSWYgd2UgZ2V0IGRpZmZlcmVu dCBhbnN3ZXJzIGZyb20gZGlmZmVyZW50IG1lbWJlcnMKLQkgICAgIG9mIHRoZSBlcXVpdmFsZW5j ZSBzZXQgdGhpcyBjaGVjayBtdXN0IGJlIGluIGEgZGVhZAotCSAgICAgY29kZSByZWdpb24uICBG b2xkaW5nIGl0IHRvIGEgdHJhcCByZXByZXNlbnRhdGlvbgotCSAgICAgd291bGQgYmUgY29ycmVj dCBoZXJlLiAgRm9yIG5vdyBqdXN0IHJldHVybiBkb24ndC1rbm93LiAgKi8KLQkgIGlmIChyZXR2 YWwgIT0gTlVMTAotCSAgICAgICYmIHQgIT0gcmV0dmFsKQotCSAgICB7Ci0JICAgICAgcmV0dmFs ID0gTlVMTF9UUkVFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByZXR2YWwgPSB0OwotCi0J ICBpZiAoIXNvcCkKLQkgICAgdXNlZF9zdHJpY3Rfb3ZlcmZsb3cgPSAwOwotCSAgZWxzZSBpZiAo dXNlZF9zdHJpY3Rfb3ZlcmZsb3cgPCAwKQotCSAgICB1c2VkX3N0cmljdF9vdmVyZmxvdyA9IDE7 Ci0JfQotICAgIH0KLQogICBpZiAocmV0dmFsICYmIHVzZWRfc3RyaWN0X292ZXJmbG93ID4gMCkK ICAgICAqc3RyaWN0X292ZXJmbG93X3AgPSB0cnVlOwotCiAgIHJldHVybiByZXR2YWw7CiB9CiAK LQogLyogR2l2ZW4gYSBjb21wYXJpc29uIGNvZGUgQ09NUCBhbmQgbmFtZXMgTjEgYW5kIE4yLCBj b21wYXJlIGFsbCB0aGUKICAgIHJhbmdlcyBlcXVpdmFsZW50IHRvIE4xIGFnYWluc3QgYWxsIHRo ZSByYW5nZXMgZXF1aXZhbGVudCB0byBOMgogICAgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiBO MSBDT01QIE4yLiAgUmV0dXJuIHRoZSBzYW1lIHZhbHVlCkBAIC03MjgsMTAgKzY3OCwxMCBAQCB0 cmVlCiBzaW1wbGlmeV91c2luZ19yYW5nZXM6OmNvbXBhcmVfbmFtZXMgKGVudW0gdHJlZV9jb2Rl IGNvbXAsIHRyZWUgbjEsIHRyZWUgbjIsCiAJCQkJICAgICAgYm9vbCAqc3RyaWN0X292ZXJmbG93 X3AsIGdpbXBsZSAqcykKIHsKLSAgLyogQ29tcGFyZSB0aGUgcmFuZ2VzIG9mIGV2ZXJ5IG5hbWUg ZXF1aXZhbGVudCB0byBOMSBhZ2FpbnN0IHRoZQotICAgICByYW5nZXMgb2YgZXZlcnkgbmFtZSBl cXVpdmFsZW50IHRvIE4yLiAgKi8KLSAgYml0bWFwIGUxID0gcXVlcnktPmdldF92YWx1ZV9yYW5n ZSAobjEsIHMpLT5lcXVpdiAoKTsKLSAgYml0bWFwIGUyID0gcXVlcnktPmdldF92YWx1ZV9yYW5n ZSAobjIsIHMpLT5lcXVpdiAoKTsKKyAgLyogPz8gVGhlc2UgYml0bWFwcyBhcmUgTlVMTCBhcyB0 aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBlcXVpdmFsZW5jZXMKKyAgICAgYXZhaWxhYmxlIGluIHRo ZSB2YWx1ZV9yYW5nZSouICAqLworICBiaXRtYXAgZTEgPSBOVUxMOworICBiaXRtYXAgZTIgPSBO VUxMOwogCiAgIC8qIFVzZSB0aGUgZmFrZSBiaXRtYXBzIGlmIGUxIG9yIGUyIGFyZSBub3QgYXZh aWxhYmxlLiAgKi8KICAgc3RhdGljIGJpdG1hcCBzX2UxID0gTlVMTCwgc19lMiA9IE5VTEw7CkBA IC03ODAsOCArNzMwLDggQEAgc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjpjb21wYXJlX25hbWVzIChl bnVtIHRyZWVfY29kZSBjb21wLCB0cmVlIG4xLCB0cmVlIG4yLAogICAgICAgaWYgKCFzc2FfbmFt ZSAoaTEpKQogCWNvbnRpbnVlOwogCi0gICAgICB2YWx1ZV9yYW5nZV9lcXVpdiB0ZW1fdnIxOwot ICAgICAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyMSA9IGdldF92cl9mb3JfY29tcGFyaXNv biAoaTEsICZ0ZW1fdnIxLCBzKTsKKyAgICAgIHZhbHVlX3JhbmdlIHRlbV92cjE7CisgICAgICBj b25zdCB2YWx1ZV9yYW5nZSAqdnIxID0gZ2V0X3ZyX2Zvcl9jb21wYXJpc29uIChpMSwgJnRlbV92 cjEsIHMpOwogCiAgICAgICB0cmVlIHQgPSBOVUxMX1RSRUUsIHJldHZhbCA9IE5VTExfVFJFRTsK ICAgICAgIGJpdG1hcF9pdGVyYXRvciBiaTI7CkBAIC03OTMsOSArNzQzLDggQEAgc2ltcGxpZnlf dXNpbmdfcmFuZ2VzOjpjb21wYXJlX25hbWVzIChlbnVtIHRyZWVfY29kZSBjb21wLCB0cmVlIG4x LCB0cmVlIG4yLAogCiAJICBib29sIHNvcCA9IGZhbHNlOwogCi0JICB2YWx1ZV9yYW5nZV9lcXVp diB0ZW1fdnIyOwotCSAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyMiA9IGdldF92cl9mb3Jf Y29tcGFyaXNvbiAoaTIsICZ0ZW1fdnIyLAotCQkJCQkJCQlzKTsKKwkgIHZhbHVlX3JhbmdlIHRl bV92cjI7CisJICBjb25zdCB2YWx1ZV9yYW5nZSAqdnIyID0gZ2V0X3ZyX2Zvcl9jb21wYXJpc29u IChpMiwgJnRlbV92cjIsIHMpOwogCiAJICB0ID0gY29tcGFyZV9yYW5nZXMgKGNvbXAsIHZyMSwg dnIyLCAmc29wKTsKIAkgIGlmICh0KQpAQCAtODQ0LDcgKzc5Myw3IEBAIHNpbXBsaWZ5X3VzaW5n X3Jhbmdlczo6dnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsX3dhcm52X3dpdGhfb3BzX3VzaW5nX3Jh bmdlcwogICAgIChlbnVtIHRyZWVfY29kZSBjb2RlLCB0cmVlIG9wMCwgdHJlZSBvcDEsIGJvb2wg KiBzdHJpY3Rfb3ZlcmZsb3dfcCwKICAgICAgZ2ltcGxlICpzKQogewotICBjb25zdCB2YWx1ZV9y YW5nZV9lcXVpdiAqdnIwLCAqdnIxOworICBjb25zdCB2YWx1ZV9yYW5nZSAqdnIwLCAqdnIxOwog ICB2cjAgPSAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FKSA/IHF1ZXJ5LT5nZXRfdmFsdWVf cmFuZ2UgKG9wMCwgcykgOiBOVUxMOwogICB2cjEgPSAoVFJFRV9DT0RFIChvcDEpID09IFNTQV9O QU1FKSA/IHF1ZXJ5LT5nZXRfdmFsdWVfcmFuZ2UgKG9wMSwgcykgOiBOVUxMOwogCkBAIC05MjUs NyArODc0LDcgQEAgc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjp2cnBfZXZhbHVhdGVfY29uZGl0aW9u YWxfd2FybnZfd2l0aF9vcHMKIAkgICAgfQogCSAgZWxzZQogCSAgICBnY2NfdW5yZWFjaGFibGUg KCk7Ci0JICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIwID0gcXVlcnktPmdldF92YWx1ZV9y YW5nZSAob3AwLCBzdG10KTsKKwkgIGNvbnN0IHZhbHVlX3JhbmdlICp2cjAgPSBxdWVyeS0+Z2V0 X3ZhbHVlX3JhbmdlIChvcDAsIHN0bXQpOwogCSAgLyogSWYgdnJvLCB0aGUgcmFuZ2UgZm9yIE9Q MCB0byBwYXNzIHRoZSBvdmVyZmxvdyB0ZXN0LCBoYXMKIAkgICAgIG5vIGludGVyc2VjdGlvbiB3 aXRoICp2cjAsIE9QMCdzIGtub3duIHJhbmdlLCB0aGVuIHRoZQogCSAgICAgb3ZlcmZsb3cgdGVz dCBjYW4ndCBwYXNzLCBzbyByZXR1cm4gdGhlIG5vZGUgZm9yIGZhbHNlLgpAQCAtOTU1LDExICs5 MDQsMTAgQEAgc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjp2cnBfZXZhbHVhdGVfY29uZGl0aW9uYWxf d2FybnZfd2l0aF9vcHMKICAgICAgICYmIHVzZV9lcXVpdl9wKQogICAgIHJldHVybiBjb21wYXJl X25hbWVzIChjb2RlLCBvcDAsIG9wMSwgc3RyaWN0X292ZXJmbG93X3AsIHN0bXQpOwogICBlbHNl IGlmIChUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUpCi0gICAgcmV0dXJuIGNvbXBhcmVfbmFt ZV93aXRoX3ZhbHVlIChjb2RlLCBvcDAsIG9wMSwKLQkJCQkgICAgc3RyaWN0X292ZXJmbG93X3As IHVzZV9lcXVpdl9wLCBzdG10KTsKKyAgICByZXR1cm4gY29tcGFyZV9uYW1lX3dpdGhfdmFsdWUg KGNvZGUsIG9wMCwgb3AxLCBzdHJpY3Rfb3ZlcmZsb3dfcCwgc3RtdCk7CiAgIGVsc2UgaWYgKFRS RUVfQ09ERSAob3AxKSA9PSBTU0FfTkFNRSkKICAgICByZXR1cm4gY29tcGFyZV9uYW1lX3dpdGhf dmFsdWUgKHN3YXBfdHJlZV9jb21wYXJpc29uIChjb2RlKSwgb3AxLCBvcDAsCi0JCQkJICAgIHN0 cmljdF9vdmVyZmxvd19wLCB1c2VfZXF1aXZfcCwgc3RtdCk7CisJCQkJICAgIHN0cmljdF9vdmVy Zmxvd19wLCBzdG10KTsKICAgcmV0dXJuIE5VTExfVFJFRTsKIH0KIApAQCAtMTI1MCw3ICsxMTk4 LDcgQEAgc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjpzaW1wbGlmeV9kaXZfb3JfbW9kX3VzaW5nX3Jh bmdlcwogICBpZiAocmhzX2NvZGUgPT0gVFJVTkNfTU9EX0VYUFIKICAgICAgICYmIFRSRUVfQ09E RSAob3AxKSA9PSBTU0FfTkFNRSkKICAgICB7Ci0gICAgICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVp diAqdnIxID0gcXVlcnktPmdldF92YWx1ZV9yYW5nZSAob3AxLCBzdG10KTsKKyAgICAgIGNvbnN0 IHZhbHVlX3JhbmdlICp2cjEgPSBxdWVyeS0+Z2V0X3ZhbHVlX3JhbmdlIChvcDEsIHN0bXQpOwog ICAgICAgaWYgKHJhbmdlX2ludF9jc3RfcCAodnIxKSkKIAlvcDFtaW4gPSB2cjEtPm1pbiAoKTsK ICAgICB9CmRpZmYgLS1naXQgYS9nY2MvdnItdmFsdWVzLmggYi9nY2MvdnItdmFsdWVzLmgKaW5k ZXggOGVlOGNjMTJmOGIuLjk4MDRhYWY4M2QxIDEwMDY0NAotLS0gYS9nY2MvdnItdmFsdWVzLmgK KysrIGIvZ2NjL3ZyLXZhbHVlcy5oCkBAIC0yMCw3ICsyMCw2IEBAIGFsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaWZuZGVmIEdDQ19WUl9WQUxVRVNf SAogI2RlZmluZSBHQ0NfVlJfVkFMVUVTX0gKIAotI2luY2x1ZGUgInZhbHVlLXJhbmdlLWVxdWl2 LmgiCiAjaW5jbHVkZSAidmFsdWUtcXVlcnkuaCIKIAogLy8gQWJzdHJhY3QgY2xhc3MgdG8gcmV0 dXJuIGEgcmFuZ2UgZm9yIGEgZ2l2ZW4gU1NBLgpAQCAtNTQsMTEgKzUzLDkgQEAgcHJpdmF0ZToK IAogICBib29sIHR3b192YWx1ZWRfdmFsX3JhbmdlX3AgKHRyZWUsIHRyZWUgKiwgdHJlZSAqLCBn aW1wbGUgKik7CiAgIGJvb2wgb3Bfd2l0aF9ib29sZWFuX3ZhbHVlX3JhbmdlX3AgKHRyZWUsIGdp bXBsZSAqKTsKLSAgdHJlZSBjb21wYXJlX25hbWVfd2l0aF92YWx1ZSAoZW51bSB0cmVlX2NvZGUs IHRyZWUsIHRyZWUsIGJvb2wgKiwgYm9vbCwKLQkJCQlnaW1wbGUgKik7CisgIHRyZWUgY29tcGFy ZV9uYW1lX3dpdGhfdmFsdWUgKGVudW0gdHJlZV9jb2RlLCB0cmVlLCB0cmVlLCBib29sICosIGdp bXBsZSAqKTsKICAgdHJlZSBjb21wYXJlX25hbWVzIChlbnVtIHRyZWVfY29kZSwgdHJlZSwgdHJl ZSwgYm9vbCAqLCBnaW1wbGUgKnMpOwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqZ2V0X3Zy X2Zvcl9jb21wYXJpc29uIChpbnQsIHZhbHVlX3JhbmdlX2VxdWl2ICosCi0JCQkJCQkgIGdpbXBs ZSAqcyk7CisgIGNvbnN0IHZhbHVlX3JhbmdlICpnZXRfdnJfZm9yX2NvbXBhcmlzb24gKGludCwg dmFsdWVfcmFuZ2UgKiwgZ2ltcGxlICpzKTsKICAgdHJlZSB2cnBfZXZhbHVhdGVfY29uZGl0aW9u YWxfd2FybnZfd2l0aF9vcHNfdXNpbmdfcmFuZ2VzIChlbnVtIHRyZWVfY29kZSwKIAkJCQkJCQkg ICAgIHRyZWUsIHRyZWUsCiAJCQkJCQkJICAgICBib29sICosIGdpbXBsZSAqcyk7Ci0tIAoyLjM4 LjEKCg== --------------G9xgfjfWgeHMYxFMQM0OoNGB--