Return-Path: X-Original-To: apmail-corinthia-dev-archive@minotaur.apache.org Delivered-To: apmail-corinthia-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3D0AA180D6 for ; Tue, 2 Jun 2015 13:28:19 +0000 (UTC) Received: (qmail 64729 invoked by uid 500); 2 Jun 2015 13:28:19 -0000 Delivered-To: apmail-corinthia-dev-archive@corinthia.apache.org Received: (qmail 64697 invoked by uid 500); 2 Jun 2015 13:28:19 -0000 Mailing-List: contact dev-help@corinthia.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@corinthia.incubator.apache.org Delivered-To: mailing list dev@corinthia.incubator.apache.org Received: (qmail 64685 invoked by uid 99); 2 Jun 2015 13:28:18 -0000 Received: from Unknown (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jun 2015 13:28:18 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 23C151A4268 for ; Tue, 2 Jun 2015 13:28:18 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 3.001 X-Spam-Level: *** X-Spam-Status: No, score=3.001 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.001, HTML_MESSAGE=3, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=disabled Authentication-Results: spamd2-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com Received: from mx1-us-east.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id TgvSM0-V_Qln for ; Tue, 2 Jun 2015 13:28:09 +0000 (UTC) Received: from mail-vn0-f51.google.com (mail-vn0-f51.google.com [209.85.216.51]) by mx1-us-east.apache.org (ASF Mail Server at mx1-us-east.apache.org) with ESMTPS id 49032428ED for ; Tue, 2 Jun 2015 13:28:09 +0000 (UTC) Received: by vnbf7 with SMTP id f7so20459536vnb.13 for ; Tue, 02 Jun 2015 06:27:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:content-type; bh=Zf2SkKbK4L6Q0fxLL+YkIFZqrUYGoJGHhX6W/fsapvc=; b=mHb5Om2aWKDSRcGYegE0uNZC+HmpI+pULnTpSPDt2EgPiGASHXPkOgTDsRFZWCPmfj WFViZCoRm92SZ1rEizINaP2sIW80/kAY1TimSUzXoRQ9qg5pljGKGTguL3p4eyQZGbxp 19IbPmGi1XENVJjlKYcme5HXcD3ZVxHv3W5WwdaVf4xU3j/RaQWPGwqpYNQ7Q2WszZ6P DR9HvI4EIm3jwkTe674WBOZ2WGJ24MtxGxzoTcgVQBpZHc8/6Z8b1TgVBfhMCzJ5Zrwv RgD4BiOpVEn0iCVsW4Rpg+VSmmhsuS5dMuEQjI6w8FQJsrVIywPBMGaaCwBxBQBQU38i JfpA== MIME-Version: 1.0 X-Received: by 10.53.5.170 with SMTP id cn10mr38520210vdd.76.1433251637029; Tue, 02 Jun 2015 06:27:17 -0700 (PDT) Sender: hammyau@gmail.com Received: by 10.52.138.67 with HTTP; Tue, 2 Jun 2015 06:27:16 -0700 (PDT) In-Reply-To: <0AEDA1A1-E3CB-4173-ABF1-511D030F99B3@apache.org> References: <0AEDA1A1-E3CB-4173-ABF1-511D030F99B3@apache.org> Date: Tue, 2 Jun 2015 21:27:16 +0800 X-Google-Sender-Auth: gYNJHKOfH0xPGZs9-uA0beVZYpM Message-ID: Subject: Re: ODF to HTML From: Ian C To: dev Content-Type: multipart/mixed; boundary=001a1133fdaeb356d3051788e6d4 --001a1133fdaeb356d3051788e6d4 Content-Type: multipart/alternative; boundary=001a1133fdaeb356cf051788e6d2 --001a1133fdaeb356cf051788e6d2 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi attached is a patch which generates and uses hn.class selectors. Generated from the filter/odf/ directory via git diff On Tue, Jun 2, 2015 at 12:43 AM, Peter Kelly wrote: > (apologies if this is a duplicate - I sent from the wrong email address > before) > > > On 31 May 2015, at 7:09 pm, Ian C = > > wrote: > > > > We also need to take into account the style hierarchy. I see from some > of the CSS documentation that there are mechanisms in place to manage tha= t > but have not looked in detail. Any advice Peter? > > First, some general comments - what I recommend is to first build up a > custom data structure representing all the styles which can later be > queried when needed, e.g. when you encounter an element in content.xml th= at > has a particular style associated with it. > > In the Word filter, there are two classes used for this purpose: WordShee= t > and WordStyle (the former being a collection of the latter). These are > defined in WordSheet.h and WordSheet.c. Early in the conversion process, > the filter goes through the XML document containing the styles and builds > up this data structure. This results in the code being able to deal with > the styles at a higher-level of abstraction than examining the DOM tree o= f > styles.xml directly. > > A while ago I made a start on the same thing for ODF - there=E2=80=99s OD= FSheet > and ODFStyle classes defined for the same purpose. So a good next step fo= r > tackling styles would be to traverse the DOM tree of styles.xml and > populate this data structure, creating a new ODFStyle object for each sty= le > in the document, and adding them to the (single) ODFSheet object for the > document. This data structure could then be used to generate the CSS text= , > as is done in the Word filter. > > > I just generated to div tags do we want that? Mapping to h1... hn could > be a better way but not sure how to really map the correct heading styles > to the hn. > > In the case of ODF, the information about what header to map to is > (usually) available more directly than in OOXML. Both specs refer to it a= s > the =E2=80=9Coutline level=E2=80=9D. In an ODF document, heading outline = levels start from > 1 (just like HTML), but you also have the distinction between an= d > elements, so you can know whether something is a heading or a > regular paragraph. > > When encountering a element, you can determine the outline level > from the attribute, e.g.: > > Headlin= e > One > > So here the value =E2=80=981=E2=80=99 is sufficient information to indica= te that you need > to create a h1 element. The style-name attribute is Heading_20_1, so the > corresponding CSS would need to be: > > h1.Heading_20_1 { > } > > and similarly for other levels, e.g. > > h2.Heading_20_2 { > } > > Note that, as with your existing code, this would be generated separately > from the content itself, solely based on the information in styles.xml, f= or > the non-automatic styles. > > So I suggest separating buildCSS_Styles into two separate functions: One > which populates the CSSSheet object associated with the package (that is, > package->sheet, which I think is already created), and another which > examines the ODFSheet object and populates the CSSSheet object. > > =E2=80=94 > Dr Peter M. Kelly > pmkelly@apache.org > > PGP key: http://www.kellypmk.net/pgp-key > (fingerprint 5435 6718 59F0 DD1F BFA0 5E46 2523 BAA1 44AE 2966) > > --=20 Cheers, Ian C --001a1133fdaeb356cf051788e6d2 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi

attached is a patch which genera= tes and uses hn.class selectors.

Ge= nerated from the filter/odf/ directory via git diff


=

On Tue, Jun 2, 20= 15 at 12:43 AM, Peter Kelly <pmkelly@apache.org> wrote:
=
(apologies if this is a duplicate - I sent f= rom the wrong email address before)

> On 31 May 2015, at 7:09 pm, Ian C <ian@amham.net <mailto:ian@amham.ne= t>> wrote:
>
> We also need to take into account the style hierarchy. I see from some= of the CSS documentation that there are mechanisms in place to manage that= but have not looked in detail. Any advice Peter?

First, some general comments - what I recommend is = to first build up a custom data structure representing all the styles which= can later be queried when needed, e.g. when you encounter an element in co= ntent.xml that has a particular style associated with it.

In the Word filter, there are two classes used for this purpose: WordSheet = and WordStyle (the former being a collection of the latter). These are defi= ned in WordSheet.h and WordSheet.c. Early in the conversion process, the fi= lter goes through the XML document containing the styles and builds up this= data structure. This results in the code being able to deal with the style= s at a higher-level of abstraction than examining the DOM tree of styles.xm= l directly.

A while ago I made a start on the same thing for ODF - there=E2=80=99s ODFS= heet and ODFStyle classes defined for the same purpose. So a good next step= for tackling styles would be to traverse the DOM tree of styles.xml and po= pulate this data structure, creating a new ODFStyle object for each style i= n the document, and adding them to the (single) ODFSheet object for the doc= ument. This data structure could then be used to generate the CSS text, as = is done in the Word filter.

> I just generated to div tags do we want that? = Mapping to h1... hn could be a better way but not sure how to really map th= e correct heading styles to the hn.

In the case of ODF, the information about what head= er to map to is (usually) available more directly than in OOXML. Both specs= refer to it as the =E2=80=9Coutline level=E2=80=9D. In an ODF document, he= ading outline levels start from 1 (just like HTML), but you also have the d= istinction between <text:h> and <text:p> elements, so you can k= now whether something is a heading or a regular paragraph.

When encountering a <text:h> element, you can determine the outline l= evel from the attribute, e.g.:

<text:h text:style-name=3D"Heading_20_1" text:outline-level=3D= "1">Headline One</text:h>

So here the value =E2=80=981=E2=80=99 is sufficient information to indicate= that you need to create a h1 element. The style-name attribute is Heading_= 20_1, so the corresponding CSS would need to be:

h1.Heading_20_1 {
}

and similarly for other levels, e.g.

h2.Heading_20_2 {
}

Note that, as with your existing code, this would be generated separately f= rom the content itself, solely based on the information in styles.xml, for = the non-automatic styles.

So I suggest separating buildCSS_Styles into two separate functions: One wh= ich populates the CSSSheet object associated with the package (that is, pac= kage->sheet, which I think is already created), and another which examin= es the ODFSheet object and populates the CSSSheet object.

=E2=80=94
Dr Peter M. Kelly
pmkelly@apache.org

PGP key: http= ://www.kellypmk.net/pgp-key <http://www.kellypmk.net/pgp-key>
(fingerprint 5435 6718 59F0 DD1F BFA0 5E46 2523 BAA1 44AE 2966)




--
Cheers,

Ian C
--001a1133fdaeb356cf051788e6d2-- --001a1133fdaeb356d3051788e6d4 Content-Type: text/plain; charset=US-ASCII; name="patch.txt" Content-Disposition: attachment; filename="patch.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iafcxwsq0 ZGlmZiAtLWdpdCBhL0RvY0Zvcm1hdHMvZmlsdGVycy9vZGYvc3JjL3RleHQvT0RGVGV4dC5jIGIv RG9jRm9ybWF0cy9maWx0ZXJzL29kZi9zcmMvdGV4dC9PREZUZXh0LmMKaW5kZXggNGVmMDA2OC4u N2UzZTNkYyAxMDA2NDQKLS0tIGEvRG9jRm9ybWF0cy9maWx0ZXJzL29kZi9zcmMvdGV4dC9PREZU ZXh0LmMKKysrIGIvRG9jRm9ybWF0cy9maWx0ZXJzL29kZi9zcmMvdGV4dC9PREZUZXh0LmMKQEAg LTIxLDYgKzIxLDkgQEAKICNpbmNsdWRlICJPREZQYWNrYWdlLmgiCiAjaW5jbHVkZSAiT0RGVGV4 dENvbnZlcnRlci5oIgogI2luY2x1ZGUgIkRGRE9NLmgiCisjaW5jbHVkZSAiREZIVE1MLmgiCisj aW5jbHVkZSAiREZIVE1MTm9ybWFsaXphdGlvbi5oIgorI2luY2x1ZGUgIkNTUy5oIgogI2luY2x1 ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBA IC00Miw3ICs0NSw3IEBAIHN0YXRpYyB2b2lkIHRyYXZlcnNlQ29udGVudChPREZUZXh0Q29udmVy dGVyICpjb252LCBERk5vZGUgKm9kZk5vZGUsIERGTm9kZSAqaHRtCiAKICAgICAgICAgaWYgKG9k ZkNoaWxkLT50YWcgPT0gRE9NX1RFWFQpIHsgLy8gd2UgaGF2ZSBzb21lIHRleHQgb3IgYSB0ZXh0 IG1vZGZpZXIgaGVyZS4KICAgICAgICAgICAgIC8vIERGTm9kZSAqY2hlY2sgPSAKLSAgICAgICAg ICAgIERGQ3JlYXRlQ2hpbGRUZXh0Tm9kZShodG1sTm9kZSwgb2RmQ2hpbGQtPnZhbHVlKTsKKy8v ICAgICAgICAgICAgREZDcmVhdGVDaGlsZFRleHROb2RlKGh0bWxOb2RlLCBvZGZDaGlsZC0+dmFs dWUpOwogICAgICAgICAgICAgcHJpbnRmKFlFTExPVyAiRE9NX1RFWFQ6ICVzIFxuIiBSRVNFVCwK ICAgICAgICAgICAgICAgICAgICBvZGZDaGlsZC0+dmFsdWUKICAgICAgICAgICAgICAgICAgICAp OwpAQCAtNzAsOCArNzMsMzMgQEAgc3RhdGljIHZvaWQgdHJhdmVyc2VDb250ZW50KE9ERlRleHRD b252ZXJ0ZXIgKmNvbnYsIERGTm9kZSAqb2RmTm9kZSwgREZOb2RlICpodG0KICAgICAgICAgICAg ICAgICAvLyBERk5vZGUgKm5ld0NoaWxkID0gIERGQ3JlYXRlQ2hpbGRFbGVtZW50KGh0bWxOb2Rl LCBuZXdUYWcpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg ICAgICAgREZDcmVhdGVDaGlsZEVsZW1lbnQoaHRtbE5vZGUsIG5ld1RhZyk7Ci0gICAgICAgICAg ICB9CisJCS8vd2hhdCBkbyB3ZSBoYXZlIGhlcmUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg ICAgICAgICBERk5vZGUgKm5vZGUgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIg KiBzdHlsZU5hbWUgPSBERkdldEF0dHJpYnV0ZShvZGZDaGlsZCxURVhUX1NUWUxFX05BTUUpOwor ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBvdXRsZXZlbCA9IERGR2V0QXR0cmlidXRlKG9k ZkNoaWxkLFRFWFRfT1VUTElORV9MRVZFTCk7CisgICAgICAgICAgICAgICAgaWYob3V0bGV2ZWwg IT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc192YWwgPSBhdG9pKCZvdXRsZXZl bFtzdHJsZW4ob3V0bGV2ZWwpLTFdKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKHNf dmFsID49IDAgJiYgc192YWwgPCA2KSB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgSFRNTF9I MSArIHNfdmFsOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAg bm9kZSA9IERGQ3JlYXRlQ2hpbGRFbGVtZW50KGh0bWxOb2RlLCBIVE1MX0gxICsgc192YWwpOwor ICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBERkNy ZWF0ZUNoaWxkRWxlbWVudChodG1sTm9kZSwgSFRNTF9QKTsKKyAgICAgICAgICAgICAgICB9Cisg ICAgICAgICAgICAgICAgcHJpbnRmKCJGb3VuZCBzdHlsZSBuYW1lICVzXG4iLCBzdHlsZU5hbWUp OworCQlERlNldEF0dHJpYnV0ZShub2RlLCBIVE1MX0NMQVNTLCBzdHlsZU5hbWUpOyAvL0RGR2V0 QXR0cmlidXRlKG9kZk5vZGUsVEVYVF9TVFlMRV9OQU1FKSk7CisJCWZvciAoREZOb2RlICpkb21D aGlsZCA9IG9kZkNoaWxkLT5maXJzdDsgZG9tQ2hpbGQgIT0gTlVMTDsgZG9tQ2hpbGQgPSBkb21D aGlsZC0+bmV4dCkgCisJCXsKKwkJICBpZiAoZG9tQ2hpbGQtPnRhZyA9PSBET01fVEVYVCkgeyAv LyB3ZSBoYXZlIHNvbWUgdGV4dCBvciBhIHRleHQgbW9kZmllciBoZXJlLgorCQkgICAgLy8gREZO b2RlICpjaGVjayA9IAorCQkgICAgREZDcmVhdGVDaGlsZFRleHROb2RlKG5vZGUsIGRvbUNoaWxk LT52YWx1ZSk7CisJCSAgICBwcmludGYoWUVMTE9XICJET01fVEVYVDogJXMgXG4iIFJFU0VULAor CQkgICAgZG9tQ2hpbGQtPnZhbHVlCisJCSAgICApOworCQkgIH0KKwkJfQorICAgICAgICAgICB9 CiAgICAgICAgIH0KICAgICAgICAgdHJhdmVyc2VDb250ZW50KGNvbnYsb2RmQ2hpbGQsaHRtbE5v ZGUpOwogICAgIH0KQEAgLTk1LDI2ICsxMjMsNTMgQEAgREZEb2N1bWVudCAqT0RGVGV4dEdldChE RlN0b3JhZ2UgKmNvbmNyZXRlU3RvcmFnZSwgREZTdG9yYWdlICphYnN0cmFjdFN0b3JhZ2UsIGMK IAogICAgIGh0bWwgPSBERkRvY3VtZW50TmV3V2l0aFJvb3QoSFRNTF9IVE1MKTsKICAgICBib2R5 ID0gREZDcmVhdGVDaGlsZEVsZW1lbnQoaHRtbC0+cm9vdCwgSFRNTF9CT0RZKTsKKyAgICBERk5v ZGUgKmhlYWQgPSBERkNoaWxkV2l0aFRhZyhodG1sLT5yb290LEhUTUxfSEVBRCk7CisgICAgaWYg KGhlYWQgPT0gTlVMTCkgeworICAgICAgICBoZWFkID0gREZDcmVhdGVFbGVtZW50KGh0bWwsSFRN TF9IRUFEKTsKKyAgICAgICAgREZOb2RlICpib2R5ID0gREZDaGlsZFdpdGhUYWcoaHRtbC0+cm9v dCxIVE1MX0JPRFkpOworICAgICAgICBERkluc2VydEJlZm9yZShodG1sLT5yb290LGhlYWQsYm9k eSk7CisgICAgfQogICAgIGNvbnYgPSBPREZUZXh0Q29udmVydGVyTmV3KGh0bWwsIGFic3RyYWN0 U3RvcmFnZSwgcGFja2FnZSwgaWRQcmVmaXgpOwogCi0gICAgcHJpbnRmKFlFTExPVworICAgIHBy aW50ZihSRUQKICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgotICAgICAgICAgICAiU2hvd2luZyBPREYgbm9k ZXMgcHJpb3IgdG8gdGhlIHRyYXZlcnNlQ29udGVudCBmdW5jdGlvblxuIgorICAgICAgICAgICAi UHJvY2VzcyBPREYgc3R5bGUgbm9kZXMgcHJpb3IgdG8gdGhlIHRyYXZlcnNlQ29udGVudCBmdW5j dGlvblxuIgogICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgICAgIFJFU0VUKTsKIAotICAgIHNo b3dfbm9kZXMocGFja2FnZS0+Y29udGVudERvYy0+cm9vdCk7CisgICAgcHJpbnRmKEdSRUVOICJO dW1iZXIgb2Ygc3R5bGUgbm9kZXM6ICVsdVxuIiBSRVNFVCwgKHVuc2lnbmVkIGxvbmcpcGFja2Fn ZS0+c3R5bGVzRG9jLT5ub2Rlc0NvdW50KTsKKyAgICBzaG93X25vZGVzKHBhY2thZ2UtPnN0eWxl c0RvYy0+cm9vdCwgMCk7CisgICAgLy93ZSB3YW50IHRvIGJ1aWxkIHVwIHRoZSBDU1MgU3R5bGVz aGVldAorICAgIENTU1NoZWV0ICogY3NzU2hlZXQgPSBDU1NTaGVldE5ldygpOworICAgIGJ1aWxk Q1NTX1N0eWxlcyhjc3NTaGVldCwgcGFja2FnZS0+c3R5bGVzRG9jLT5yb290KTsKKyAgICAKKyAg ICBwcmludGYoR1JFRU4gIkNTUzogJXNcbiIgUkVTRVQsIENTU1NoZWV0Q29weUNTU1RleHQoY3Nz U2hlZXQpKTsKKwogICAgIAogICAgIHByaW50X2xpbmUoMik7CiAgICAgcHJpbnRfbGluZSgyKTsK ICAgICBwcmludF9saW5lKDIpOwogCisgICAgcHJpbnRmKFlFTExPVworICAgICAgICAgICAiPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 XG4iCisgICAgICAgICAgICJTaG93aW5nIE9ERiBjb250ZW50IG5vZGVzIHByaW9yIHRvIHRoZSB0 cmF2ZXJzZUNvbnRlbnQgZnVuY3Rpb25cbiIKKyAgICAgICAgICAgIj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorICAgICAgICAg ICBSRVNFVCk7CisKKyAgICBzaG93X25vZGVzKHBhY2thZ2UtPmNvbnRlbnREb2MtPnJvb3QsIDAp OworICAgIHByaW50X2xpbmUoMik7CisgICAgcHJpbnRfbGluZSgyKTsKKyAgICBwcmludF9saW5l KDIpOworICAgIAorCiAgICAgLy8gVE9ETzogVHJhdmVyc2UgdGhlIERPTSB0cmVlIG9mIHBhY2th Z2UtPmNvbnRlbnREb2MsIGFkZGluZyBlbGVtZW50cyB0byB0aGUgSFRNTCBkb2N1bWVudC4KICAg ICAvLyBjb250ZW50RG9jIGlzIGxvYWRlZCBmcm9tIGNvbnRlbnQueG1sLCBhbmQgcmVwcmVzZW50 cyB0aGUgbW9zdCBpbXBvcnRhbnQgaW5mb3JtYXRpb24gaW4KICAgICAvLyB0aGUgZG9jdW1lbnQs IGkuZS4gdGhlIHRleHQsIHRhYmxlcywgbGlzdHMsIGV0Yy4KIAogICAgIHRyYXZlcnNlQ29udGVu dChjb252LCBwYWNrYWdlLT5jb250ZW50RG9jLT5yb290LCBib2R5KTsKLQorICAgIGNoYXIgKmNz c1RleHQgPSBDU1NTaGVldENvcHlDU1NUZXh0KGNzc1NoZWV0KTsKKyAgICBIVE1MQWRkSW50ZXJu YWxTdHlsZVNoZWV0KGNvbnYtPmh0bWwsIGNzc1RleHQpOworICAgIEhUTUxfc2FmZUluZGVudChj b252LT5odG1sLT5kb2NOb2RlLDApOwogICAgIC8vIHVuY29tbWVudCB0byBzZWUgdGhlIHJlc3Vs dC4gKHNwYW1teSEpCiAgICAgcHJpbnRmKEdSRUVOCiAgICAgICAgICAgICI9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKQEAgLTEy Miw3ICsxNzcsNyBAQCBERkRvY3VtZW50ICpPREZUZXh0R2V0KERGU3RvcmFnZSAqY29uY3JldGVT dG9yYWdlLCBERlN0b3JhZ2UgKmFic3RyYWN0U3RvcmFnZSwgYwogICAgICAgICAgICAiPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4i CiAgICAgICAgICAgIFJFU0VUKTsKIAotICAgIHNob3dfbm9kZXMoYm9keSk7CisgICAgc2hvd19u b2Rlcyhib2R5LCAwKTsKIAogCiAgICAgLy8gVE9ETzogT25jZSB0aGlzIGJhc2ljIHRyYXZlcnNh bCBpcyBpbXBsZW1lbnRlZCBhbmQgaXMgY2FwYWJsZSBvZiBwcm9kdWNpbmcgcGFyYWdyYXBocywK ZGlmZiAtLWdpdCBhL0RvY0Zvcm1hdHMvZmlsdGVycy9vZGYvc3JjL3RleHQvZ2JnX3Rlc3QuYyBi L0RvY0Zvcm1hdHMvZmlsdGVycy9vZGYvc3JjL3RleHQvZ2JnX3Rlc3QuYwppbmRleCBmYWU2YzQy Li43OWFmZGU4IDEwMDY0NAotLS0gYS9Eb2NGb3JtYXRzL2ZpbHRlcnMvb2RmL3NyYy90ZXh0L2di Z190ZXN0LmMKKysrIGIvRG9jRm9ybWF0cy9maWx0ZXJzL29kZi9zcmMvdGV4dC9nYmdfdGVzdC5j CkBAIC0zLDYgKzMsOSBAQAogI2luY2x1ZGUgIk9ERlBhY2thZ2UuaCIKICNpbmNsdWRlICJPREZU ZXh0Q29udmVydGVyLmgiCiAjaW5jbHVkZSAiREZET00uaCIKKworI2luY2x1ZGUgIkNTUy5oIgor I2luY2x1ZGUgIkNTU1NoZWV0LmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJp bmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTE4OSwxMSArMTkyLDE0NCBAQCBUYWcgZmlu ZF9IVE1MKERGTm9kZSAqb2RmTm9kZSwgREZOb2RlICpodG1sTm9kZSkKIC8qKgogICogRGV2IHRv b2w6IExpc3QgYWxsIHRoZSBub2RlcyBmb2xsb3dpbmcgdGhlIGdpdmVuIG9uZS4gIAogICovCi12 b2lkIHNob3dfbm9kZXMoREZOb2RlICpvZGZOb2RlKQordm9pZCBzaG93X25vZGVzKERGTm9kZSAq b2RmTm9kZSwgaW50IGxldmVsKQoreworICAgIHByaW50ZigiTGV2ZWw6ICVkXG4iLGxldmVsKTsK KyAgICBsZXZlbCsrOworICAgIHByaW50X25vZGVfaW5mbyhvZGZOb2RlKTsKKyAgICBmb3IgKERG Tm9kZSAqb2RmQ2hpbGQgPSBvZGZOb2RlLT5maXJzdDsgb2RmQ2hpbGQgIT0gTlVMTDsgb2RmQ2hp bGQgPSBvZGZDaGlsZC0+bmV4dCkgeworCXdhbGtDaGlsZHJlbihvZGZDaGlsZCwgbGV2ZWwpOwor ICAgIH0KK30KKworLyoqCisgKiBEZXYgdG9vbDogTGlzdCBhbGwgdGhlIG5vZGVzIGZvbGxvd2lu ZyB0aGUgZ2l2ZW4gb25lLiAgCisgKi8KK3ZvaWQgd2Fsa0NoaWxkcmVuKERGTm9kZSAqb2RmTm9k ZSwgaW50IGxldmVsKQogeworICAgIHByaW50ZigiTGV2ZWw6ICVkXG4iLGxldmVsKTsKKyAgICBs ZXZlbCsrOworICAgIHByaW50X25vZGVfaW5mbyhvZGZOb2RlKTsKICAgICBmb3IgKERGTm9kZSAq b2RmQ2hpbGQgPSBvZGZOb2RlLT5maXJzdDsgb2RmQ2hpbGQgIT0gTlVMTDsgb2RmQ2hpbGQgPSBv ZGZDaGlsZC0+bmV4dCkgewotICAgICAgICBwcmludF9ub2RlX2luZm8ob2RmQ2hpbGQpOwotICAg ICAgICBwcmludF9saW5lKDApOworICAgICAgICB3YWxrQ2hpbGRyZW4ob2RmQ2hpbGQsIGxldmVs KTsKKyAgICB9Cit9CisKKy8qKgorICogRGV2IHRvb2w6IExpc3QgYWxsIHRoZSBub2RlcyBiZWxv dyB0aGUgZ2l2ZW4gb25lLiAgCisgKi8KKy8qdm9pZCBzaG93X25vZGVzKERGTm9kZSAqb2RmTm9k ZSwgaW50IGxldmVsKQoreworICAgIERGTm9kZSAqbmV4dE5vZGUgPSBvZGZOb2RlOworICAgIGRv IHsKKyAgICAgICAgcHJpbnRfbm9kZV9pbmZvKG5leHROb2RlKTsKKyAgICAgICAgbmV4dE5vZGUg PSBERk5leHROb2RlKG5leHROb2RlKTsKKyAgICB9d2hpbGUobmV4dE5vZGUgIT0gTlVMTCk7Cit9 Ki8KKworLy9naXZlIG1lIHRoZSBzdHlsZXMgZG9jdW1lbnQKK3ZvaWQgYnVpbGRDU1NfU3R5bGVz KENTU1NoZWV0ICogY3NzU2hlZXQsIERGTm9kZSAqb2RmTm9kZSkgCit7CisgIC8vd2FsayB0aHJv dWdoIHRoZSBub2RlcworICAvLyBnbyB0byB0aGUgb2ZmaWNlOnN0eWxlcyBjYW4gd2UgZmluZCBp dD8KKyAgLy9pdGVyYXRlIGVhY2ggc3R5bGU6c3R5bGUKKyAgLy8gbWFrZSBhIGNzcyAKKyAgLy8g ZGlwIGRvd24gdG8gZ2V0IGl0cyBhdHRyaWJ1dGVzCisgICAgcHJpbnRmKCJidWlsZENTU19TdHls ZXNcbiIpOworICAgIHByaW50ZigibmFtZSA9ICVzXG4iLCB0cmFuc2xhdGVYTUxFbnVtTmFtZVtv ZGZOb2RlLT50YWddKTsKKyAgICAKKyAgICAvL21hbnVhbGx5IHBsYXkgd2l0aCB0aGUgZnVuY3Rp b25zIGZpcnN0CisgICAgCisgICAgCisvKiAgICBDU1NTdHlsZSogY3NzU3R5bGUgPSBDU1NTaGVl dExvb2t1cEVsZW1lbnQoY3NzU2hlZXQsIAorCQkJCQkJICJlbGVtZW50TmFtZSIsCisJCQkJCQkg ImNsYXNzTmFtZSIsCisJCQkJCQkxLAorCQkJCQkJMCk7CisgICAgQ1NTUHJvcGVydGllcyAqIGxv Y2FscHJvcGVydGllcyA9IENTU1N0eWxlUnVsZShjc3NTdHlsZSk7CisgICAgQ1NTUHV0KGxvY2Fs cHJvcGVydGllcywiZm9udC13ZWlnaHQiLCJib2xkIik7Ki8KKworICAgIAorICAgIAorICAgIGZv ciAoREZOb2RlICpvZGZDaGlsZCA9IG9kZk5vZGUtPmZpcnN0OyBvZGZDaGlsZCAhPSBOVUxMOyBv ZGZDaGlsZCA9IG9kZkNoaWxkLT5uZXh0KSAKKyAgICB7CisgICAgICAgIGlmKG9kZkNoaWxkLT50 YWcgPT0gT0ZGSUNFX1NUWUxFUykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJQcm9j ZXNzaW5nIG9mZmljZSBzdHlsZXNcbiIpOworICAgICAgICAgICAgZm9yIChERk5vZGUgKnN0eWxl Tm9kZSA9IG9kZkNoaWxkLT5maXJzdDsgc3R5bGVOb2RlICE9IE5VTEw7IHN0eWxlTm9kZSA9IHN0 eWxlTm9kZS0+bmV4dCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoc3R5bGVO b2RlLT50YWcgPT0gU1RZTEVfU1RZTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0eWxlTm9kZS0+YXR0cnNDb3Vu dDsgaSsrKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAg VGFnIHQgPSBzdHlsZU5vZGUtPmF0dHJzW2ldLnRhZzsKKyAgICAgICAgICAgICAgICAgICAgICAg IGlmKHQgPT0gU1RZTEVfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNyZWF0ZSBDU1MgUHJvcGVydGllcyBmb3IgJXNc biIsIHN0eWxlTm9kZS0+YXR0cnNbaV0udmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhpcyBpcyBhIGhlYWRpbmcg bG9vayBmb3IgdGhlIFRFWFRfT1VUTElORV9MRVZFTAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgYXR0cmJ1dGUgZmV0 Y2ggdGhpbmcuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdXRs ZXZlbCA9IERGR2V0QXR0cmlidXRlKHN0eWxlTm9kZSwgU1RZTEVfREVGQVVMVF9PVVRMSU5FX0xF VkVMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1NTdHlsZSogY3NzU3R5bGUgPSBO VUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG91dGxldmVsICE9IE5VTEwpIHsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBobGV2ZWxbNF0gPSAiaCI7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZXZlbFsxXSA9IG91dGxldmVsWzBdOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobGV2ZWxbMl0gPSAwOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y3NzU3R5bGUgPSBDU1NTaGVldExvb2t1cEVsZW1lbnQoY3NzU2hlZXQsIAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVOb2RlLT5hdHRyc1tpXS52YWx1 ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjc3NTdHlsZSA9IENTU1NoZWV0TG9va3VwRWxlbWVudChjc3NTaGVldCwgCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGl2 IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0eWxlTm9kZS0+YXR0cnNbaV0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAo REZOb2RlICpzdHlsZUluZm8gPSBzdHlsZU5vZGUtPmZpcnN0OyBzdHlsZUluZm8gIT0gTlVMTDsg c3R5bGVJbmZvID0gc3R5bGVJbmZvLT5uZXh0KSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0eWxlSW5mby0+dGFnID09 IFNUWUxFX1RFWFRfUFJPUEVSVElFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9qdXN0IGxvb2tpbmcgZm9y IGJvbGRzIGFzIGEgZmlyc3QgY3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0eWxlSW5mby0+YXR0cnNDb3VudDsgaSsr KSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBUYWcgdCA9IHN0eWxlSW5mby0+YXR0cnNbaV0udGFn OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0KQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGT19GT05UX1dFSUdIVDoKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJvcGVydGllcyAqIGxvY2FscHJvcGVy dGllcyA9IENTU1N0eWxlUnVsZShjc3NTdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBDU1NQdXQobG9jYWxwcm9wZXJ0aWVzLCJmb250LXdlaWdo dCIsc3R5bGVJbmZvLT5hdHRyc1tpXS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjYXNlIEZPX0ZPTlRfU0laRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgQ1NTUHJvcGVydGllcyAqIGxvY2FscHJvcGVydGllcyA9IENTU1N0eWxlUnVsZShj c3NTdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBDU1NQdXQobG9jYWxwcm9wZXJ0aWVzLCJmb250LXNpemUiLHN0eWxlSW5mby0+YXR0cnNbaV0u dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVFlMRV9GT05U X05BTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTU1Byb3BlcnRp ZXMgKiBsb2NhbHByb3BlcnRpZXMgPSBDU1NTdHlsZVJ1bGUoY3NzU3R5bGUpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHV0KGxvY2FscHJvcGVy dGllcywiZm9udC1mYW1pbHkiLHN0eWxlSW5mby0+YXR0cnNbaV0udmFsdWUpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoc3R5bGVJbmZvLT50YWcgPT0gU1RZTEVfUEFSQUdS QVBIX1BST1BFUlRJRVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UQkQKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvRG9jRm9ybWF0 cy9maWx0ZXJzL29kZi9zcmMvdGV4dC9nYmdfdGVzdC5oIGIvRG9jRm9ybWF0cy9maWx0ZXJzL29k Zi9zcmMvdGV4dC9nYmdfdGVzdC5oCmluZGV4IDYzNjE2NWYuLjM2NDVjOGUgMTAwNjQ0Ci0tLSBh L0RvY0Zvcm1hdHMvZmlsdGVycy9vZGYvc3JjL3RleHQvZ2JnX3Rlc3QuaAorKysgYi9Eb2NGb3Jt YXRzL2ZpbHRlcnMvb2RmL3NyYy90ZXh0L2diZ190ZXN0LmgKQEAgLTMsMTAgKzMsMTQgQEAKIAog I2RlZmluZSBUQUdfTk9UX0ZPVU5EIDQwNDA0MDQKICNkZWZpbmUgVEFHX05PVF9NQVRDSEVEIDc3 Nzc3NworI2luY2x1ZGUgIkNTUy5oIgorI2luY2x1ZGUgIkNTU1NoZWV0LmgiCiAKIFRhZyAgZmlu ZF9IVE1MKERGTm9kZSAqb2RmTm9kZSwgREZOb2RlICpodG1sTm9kZSk7ICAKIHZvaWQgcHJpbnRf bm9kZV9pbmZvKERGTm9kZSAqbm9kZSk7ICAKLXZvaWQgc2hvd19ub2RlcyhERk5vZGUgKm5vZGUp OyAKK3ZvaWQgc2hvd19ub2RlcyhERk5vZGUgKm5vZGUsIGludCBsZXZlbCk7IAordm9pZCB3YWxr Q2hpbGRyZW4oREZOb2RlICpvZGZOb2RlLCBpbnQgbGV2ZWwpOwordm9pZCBidWlsZENTU19TdHls ZXMoQ1NTU2hlZXQgKiBjc3NTaGVldCwgREZOb2RlICpvZGZOb2RlKTsKIGNoYXIgKm5vZGVfaWRf aW5mbyhERk5vZGUgKm5vZGUpOyAgCiBjaGFyICptaXNzaW5nX3RhZ19pbmZvKERGTm9kZSAqbm9k ZSk7CiB2b2lkIHByaW50X2xpbmUoaW50IHN0eWxlKTsK --001a1133fdaeb356d3051788e6d4 Content-Type: text/x-csrc; charset=US-ASCII; name="ODFText.c" Content-Disposition: attachment; filename="ODFText.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iafd03111 Ci8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRl ciBvbmUKLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhl IE5PVElDRSBmaWxlCi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFs IGluZm9ybWF0aW9uCi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBs aWNlbnNlcyB0aGlzIGZpbGUKLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVy c2lvbiAyLjAgKHRoZQovLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4 Y2VwdCBpbiBjb21wbGlhbmNlCi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBh IGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj ZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3 IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAovLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0 aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgovLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VU IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mg b3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi8vIHNwZWNpZmljIGxhbmd1YWdl IGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLy8gdW5kZXIgdGhlIExpY2Vu c2UuCgojaW5jbHVkZSAiREZQbGF0Zm9ybS5oIgojaW5jbHVkZSAiT0RGVGV4dC5oIgojaW5jbHVk ZSAiT0RGUGFja2FnZS5oIgojaW5jbHVkZSAiT0RGVGV4dENvbnZlcnRlci5oIgojaW5jbHVkZSAi REZET00uaCIKI2luY2x1ZGUgIkRGSFRNTC5oIgojaW5jbHVkZSAiREZIVE1MTm9ybWFsaXphdGlv bi5oIgojaW5jbHVkZSAiQ1NTLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5n Lmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgIkRGWE1MTmFtZXMuaCIKI2luY2x1ZGUg ImdiZ190ZXN0LmgiCiNpbmNsdWRlICJjb2xvci5oIgoKdHlwZWRlZiBzdHJ1Y3QgewogICAgT0RG VGV4dENvbnZlcnRlciAqY29udjsKICAgIERGRG9jdW1lbnQgKmNvbnRlbnREb2M7CiAgICBERkhh c2hUYWJsZSAqbnVtSWRCeUh0bWxJZDsKICAgIERGSGFzaFRhYmxlICpodG1sSWRCeU51bUlkOwp9 IE9ERlB1dERhdGE7CgovLyBJJ20gbm90IHN1cmUgd2hhdCBPREZUZXh0Q29udmVydGVyIGlzZSB1 c2VkIGhlcmUgZm9yLiAgCnN0YXRpYyB2b2lkIHRyYXZlcnNlQ29udGVudChPREZUZXh0Q29udmVy dGVyICpjb252LCBERk5vZGUgKm9kZk5vZGUsIERGTm9kZSAqaHRtbE5vZGUpCnsKICAgIGZvciAo REZOb2RlICpvZGZDaGlsZCA9IG9kZk5vZGUtPmZpcnN0OyBvZGZDaGlsZCAhPSBOVUxMOyBvZGZD aGlsZCA9IG9kZkNoaWxkLT5uZXh0KSB7CgogICAgICAgIGlmIChvZGZDaGlsZC0+dGFnID09IERP TV9URVhUKSB7IC8vIHdlIGhhdmUgc29tZSB0ZXh0IG9yIGEgdGV4dCBtb2RmaWVyIGhlcmUuCiAg ICAgICAgICAgIC8vIERGTm9kZSAqY2hlY2sgPSAKLy8gICAgICAgICAgICBERkNyZWF0ZUNoaWxk VGV4dE5vZGUoaHRtbE5vZGUsIG9kZkNoaWxkLT52YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZihZ RUxMT1cgIkRPTV9URVhUOiAlcyBcbiIgUkVTRVQsCiAgICAgICAgICAgICAgICAgICBvZGZDaGls ZC0+dmFsdWUKICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAvLyBwcmludF9ub2Rl X2luZm8oY2hlY2spOwogICAgICAgICAgICAvLyBwcmludF9saW5lKDEpOyAgICAgICAgICAKICAg ICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFRhZyBuZXdUYWcgPSBmaW5kX0hUTUwo b2RmQ2hpbGQsIGh0bWxOb2RlKTsKICAgICAgICAgICAgaWYgKG5ld1RhZyA9PSBUQUdfTk9UX0ZP VU5EKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG5ldyB0YWcgdGhhdCB3ZSBuZWVk IHRvIGFkZCB0bwogICAgICAgICAgICAgICAgLy8gZmluZF9IVE1MKCksIHdoaWNoIHJlcG9ydHMg dGhpcyB0byBzdGRvdXQKICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseS4KICAgICAgICAgICAg ICAgIDsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobmV3VGFnID09IFRBR19O T1RfTUFUQ0hFRCkgeyAgCiAgICAgICAgICAgICAgICAvLyB3ZSBmaW5kIHRhZyB0aGF0IHdlIGhh dmUgbm90IG1hbmFnZWQgdG8gbWF0Y2gsIGJ1dAogICAgICAgICAgICAgICAgLy8gdGhhdCBpcyBp biBmaW5kX0hUTUwoKSBhbHJlYWR5LgoKICAgICAgICAgICAgICAgIERGQ3JlYXRlQ2hpbGRUZXh0 Tm9kZShodG1sTm9kZSwgbWlzc2luZ190YWdfaW5mbyhvZGZDaGlsZCkpOwogICAgICAgICAgICAg ICAgOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFuZXdUYWcpIHsKICAgICAg ICAgICAgICAgIDsgIC8vIHdlIGFkZGVkIGFuIGF0dHJpYnV0ZSBub2RlIGFscmVhZHkgaW4gZmlu ZF9IVE1MIChmb3Igbm93KQogICAgICAgICAgICAgICAgLy8gREZOb2RlICpuZXdDaGlsZCA9ICBE RkNyZWF0ZUNoaWxkRWxlbWVudChodG1sTm9kZSwgbmV3VGFnKTsKICAgICAgICAgICAgfQogICAg ICAgICAgICBlbHNlIHsKCQkvL3doYXQgZG8gd2UgaGF2ZSBoZXJlCiAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgIERGTm9kZSAqbm9kZSA9IE5VTEw7CiAgICAgICAgICAgICAgICBjb25z dCBjaGFyICogc3R5bGVOYW1lID0gREZHZXRBdHRyaWJ1dGUob2RmQ2hpbGQsVEVYVF9TVFlMRV9O QU1FKTsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBvdXRsZXZlbCA9IERGR2V0QXR0cmli dXRlKG9kZkNoaWxkLFRFWFRfT1VUTElORV9MRVZFTCk7CiAgICAgICAgICAgICAgICBpZihvdXRs ZXZlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IHNfdmFsID0gYXRvaSgmb3V0 bGV2ZWxbc3RybGVuKG91dGxldmVsKS0xXSkgLSAxOwogICAgICAgICAgICAgICAgICAgIC8vaWYg KHNfdmFsID49IDAgJiYgc192YWwgPCA2KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gICBIVE1M X0gxICsgc192YWw7CiAgICAgICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICAgICAgICAg bm9kZSA9IERGQ3JlYXRlQ2hpbGRFbGVtZW50KGh0bWxOb2RlLCBIVE1MX0gxICsgc192YWwpOwog ICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBub2RlID0gREZDcmVh dGVDaGlsZEVsZW1lbnQoaHRtbE5vZGUsIEhUTUxfUCk7CiAgICAgICAgICAgICAgICB9CiAgICAg ICAgICAgICAgICBwcmludGYoIkZvdW5kIHN0eWxlIG5hbWUgJXNcbiIsIHN0eWxlTmFtZSk7CgkJ REZTZXRBdHRyaWJ1dGUobm9kZSwgSFRNTF9DTEFTUywgc3R5bGVOYW1lKTsgLy9ERkdldEF0dHJp YnV0ZShvZGZOb2RlLFRFWFRfU1RZTEVfTkFNRSkpOwoJCWZvciAoREZOb2RlICpkb21DaGlsZCA9 IG9kZkNoaWxkLT5maXJzdDsgZG9tQ2hpbGQgIT0gTlVMTDsgZG9tQ2hpbGQgPSBkb21DaGlsZC0+ bmV4dCkgCgkJewoJCSAgaWYgKGRvbUNoaWxkLT50YWcgPT0gRE9NX1RFWFQpIHsgLy8gd2UgaGF2 ZSBzb21lIHRleHQgb3IgYSB0ZXh0IG1vZGZpZXIgaGVyZS4KCQkgICAgLy8gREZOb2RlICpjaGVj ayA9IAoJCSAgICBERkNyZWF0ZUNoaWxkVGV4dE5vZGUobm9kZSwgZG9tQ2hpbGQtPnZhbHVlKTsK CQkgICAgcHJpbnRmKFlFTExPVyAiRE9NX1RFWFQ6ICVzIFxuIiBSRVNFVCwKCQkgICAgZG9tQ2hp bGQtPnZhbHVlCgkJICAgICk7CgkJICB9CgkJfQogICAgICAgICAgIH0KICAgICAgICB9CiAgICAg ICAgdHJhdmVyc2VDb250ZW50KGNvbnYsb2RmQ2hpbGQsaHRtbE5vZGUpOwogICAgfQogICAgLy8g VE9ETzogQWRkIGEgc3dpdGNoIHN0YXRlbWVudCBoZXJlIHRvIGNoZWNrIHRoZSB0eXBlIG9mIE9E RiBlbGVtZW50LCBhbmQgdXNlCiAgICAvLyBERkNyZWF0ZUNoaWxkRWxlbWVudCB0byBjcmVhdGUg YSBuZXcgZWxlbWVudCBpbiB0aGUgSFRNTCBkb2N1bWVudCBhcyBhIGNoaWxkIG9mIGh0bWxOb2Rl CiAgICAvLyBiYXNlZCBvbiB0aGUgdHlwZS4gQXMgdGhpcyBmdW5jdGlvbiBnZXRzIG1vcmUgY29t cGxpY2F0ZWQsIGl0IHdpbGwgbGlrZWx5IGJlIHVzZWZ1bCB0bwogICAgLy8gc3BsaXQgaXQgdXAg aW50byBzZXZlcmFsIGZ1bmN0aW9ucwp9CgpERkRvY3VtZW50ICpPREZUZXh0R2V0KERGU3RvcmFn ZSAqY29uY3JldGVTdG9yYWdlLCBERlN0b3JhZ2UgKmFic3RyYWN0U3RvcmFnZSwgY29uc3QgY2hh ciAqaWRQcmVmaXgsIERGRXJyb3IgKiplcnJvcikKewogICAgaW50IG9rID0gMDsKICAgIERGRG9j dW1lbnQgKmh0bWwgPSBOVUxMOwogICAgT0RGUGFja2FnZSAqcGFja2FnZSA9IE5VTEw7CiAgICBP REZUZXh0Q29udmVydGVyICpjb252ID0gTlVMTDsKICAgIERGTm9kZSAqYm9keSA9IE5VTEw7Cgog ICAgcGFja2FnZSA9IE9ERlBhY2thZ2VPcGVuRnJvbShjb25jcmV0ZVN0b3JhZ2UsIGVycm9yKTsK ICAgIGlmIChwYWNrYWdlID09IE5VTEwpCiAgICAgICAgZ290byBlbmQ7CgogICAgaHRtbCA9IERG RG9jdW1lbnROZXdXaXRoUm9vdChIVE1MX0hUTUwpOwogICAgYm9keSA9IERGQ3JlYXRlQ2hpbGRF bGVtZW50KGh0bWwtPnJvb3QsIEhUTUxfQk9EWSk7CiAgICBERk5vZGUgKmhlYWQgPSBERkNoaWxk V2l0aFRhZyhodG1sLT5yb290LEhUTUxfSEVBRCk7CiAgICBpZiAoaGVhZCA9PSBOVUxMKSB7CiAg ICAgICAgaGVhZCA9IERGQ3JlYXRlRWxlbWVudChodG1sLEhUTUxfSEVBRCk7CiAgICAgICAgREZO b2RlICpib2R5ID0gREZDaGlsZFdpdGhUYWcoaHRtbC0+cm9vdCxIVE1MX0JPRFkpOwogICAgICAg IERGSW5zZXJ0QmVmb3JlKGh0bWwtPnJvb3QsaGVhZCxib2R5KTsKICAgIH0KICAgIGNvbnYgPSBP REZUZXh0Q29udmVydGVyTmV3KGh0bWwsIGFic3RyYWN0U3RvcmFnZSwgcGFja2FnZSwgaWRQcmVm aXgpOwoKICAgIHByaW50ZihSRUQKICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgICAgIlByb2Nl c3MgT0RGIHN0eWxlIG5vZGVzIHByaW9yIHRvIHRoZSB0cmF2ZXJzZUNvbnRlbnQgZnVuY3Rpb25c biIKICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAgICAgUkVTRVQpOwoKICAgIHByaW50ZihHUkVF TiAiTnVtYmVyIG9mIHN0eWxlIG5vZGVzOiAlbHVcbiIgUkVTRVQsICh1bnNpZ25lZCBsb25nKXBh Y2thZ2UtPnN0eWxlc0RvYy0+bm9kZXNDb3VudCk7CiAgICBzaG93X25vZGVzKHBhY2thZ2UtPnN0 eWxlc0RvYy0+cm9vdCwgMCk7CiAgICAvL3dlIHdhbnQgdG8gYnVpbGQgdXAgdGhlIENTUyBTdHls ZXNoZWV0CiAgICBDU1NTaGVldCAqIGNzc1NoZWV0ID0gQ1NTU2hlZXROZXcoKTsKICAgIGJ1aWxk Q1NTX1N0eWxlcyhjc3NTaGVldCwgcGFja2FnZS0+c3R5bGVzRG9jLT5yb290KTsKICAgIAogICAg cHJpbnRmKEdSRUVOICJDU1M6ICVzXG4iIFJFU0VULCBDU1NTaGVldENvcHlDU1NUZXh0KGNzc1No ZWV0KSk7CgogICAgCiAgICBwcmludF9saW5lKDIpOwogICAgcHJpbnRfbGluZSgyKTsKICAgIHBy aW50X2xpbmUoMik7CgogICAgcHJpbnRmKFlFTExPVwogICAgICAgICAgICI9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAg ICAgICAiU2hvd2luZyBPREYgY29udGVudCBub2RlcyBwcmlvciB0byB0aGUgdHJhdmVyc2VDb250 ZW50IGZ1bmN0aW9uXG4iCiAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgIFJFU0VUKTsKCiAg ICBzaG93X25vZGVzKHBhY2thZ2UtPmNvbnRlbnREb2MtPnJvb3QsIDApOwogICAgcHJpbnRfbGlu ZSgyKTsKICAgIHByaW50X2xpbmUoMik7CiAgICBwcmludF9saW5lKDIpOwogICAgCgogICAgLy8g VE9ETzogVHJhdmVyc2UgdGhlIERPTSB0cmVlIG9mIHBhY2thZ2UtPmNvbnRlbnREb2MsIGFkZGlu ZyBlbGVtZW50cyB0byB0aGUgSFRNTCBkb2N1bWVudC4KICAgIC8vIGNvbnRlbnREb2MgaXMgbG9h ZGVkIGZyb20gY29udGVudC54bWwsIGFuZCByZXByZXNlbnRzIHRoZSBtb3N0IGltcG9ydGFudCBp bmZvcm1hdGlvbiBpbgogICAgLy8gdGhlIGRvY3VtZW50LCBpLmUuIHRoZSB0ZXh0LCB0YWJsZXMs IGxpc3RzLCBldGMuCgogICAgdHJhdmVyc2VDb250ZW50KGNvbnYsIHBhY2thZ2UtPmNvbnRlbnRE b2MtPnJvb3QsIGJvZHkpOwogICAgY2hhciAqY3NzVGV4dCA9IENTU1NoZWV0Q29weUNTU1RleHQo Y3NzU2hlZXQpOwogICAgSFRNTEFkZEludGVybmFsU3R5bGVTaGVldChjb252LT5odG1sLCBjc3NU ZXh0KTsKICAgIEhUTUxfc2FmZUluZGVudChjb252LT5odG1sLT5kb2NOb2RlLDApOwogICAgLy8g dW5jb21tZW50IHRvIHNlZSB0aGUgcmVzdWx0LiAoc3BhbW15ISkKICAgIHByaW50ZihHUkVFTgog ICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAiU2hvd2luZyBIVE1MIG5vZGVzIGFmdGVyIHRo ZSB0cmF2ZXJzZUNvbnRlbnQgZnVuY3Rpb25cbiIKICAgICAgICAgICAiPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCiAgICAgICAg ICAgUkVTRVQpOwoKICAgIHNob3dfbm9kZXMoYm9keSwgMCk7CgoKICAgIC8vIFRPRE86IE9uY2Ug dGhpcyBiYXNpYyB0cmF2ZXJzYWwgaXMgaW1wbGVtZW50ZWQgYW5kIGlzIGNhcGFibGUgb2YgcHJv ZHVjaW5nIHBhcmFncmFwaHMsCiAgICAvLyB0YWJsZXMsIGxpc3RzLCBhbmQgc3BhbnMsIGFkZCBp ZHMgdG8gdGhlIEhUTUwgZWxlbWVudHMgYXMgdGhleSBhcmUgY3JlYXRlZC4gVGhhdCBpcywgc2V0 CiAgICAvLyB0aGUgaWQgYXR0cmlidXRlIG9mIGVhY2ggbmV3IEhUTUwgZWxlbWVudCB0byBhIHN0 cmluZyBjb250YWluaW5nIHRoZSBpZFByZWZpeCBmb2xsb3dlZCBieQogICAgLy8gdGhlIHNlcU5v IGZpZWxkIG9mIHRoZSBub2RlIGluIGNvbnRlbnREb2MgZnJvbSB3aGljaCB0aGUgSFRNTCBlbGVt ZW50IHdhcyBnZW5lcmF0ZWQuCiAgICAvLwogICAgLy8gVGhlc2UgaWQgYXR0cmlidXRlcyBjYW4g dGhlbiBsYXRlciBiZSB1c2VkIGluIE9ERlRleHRQdXQgdG8gZmlndXJlIG91dCB3aGljaCBlbGVt ZW50cyBpbiBhbgogICAgLy8gdXBkYXRlZCBIVE1MIGZpbGUgY29ycmVzcG9uZCB0byBleGlzdGlu ZyBlbGVtZW50cyBpbiB0aGUgT0RGIGNvbnRlbnQgZG9jdW1lbnQsIHdoaWNoIGxldHMgdXMKICAg IC8vIHJldGFpbiBpbmZvcm1hdGlvbiBpbiB0aGUgT0RGIGZpbGUgdGhhdCBjb3VsZCBub3QgYmUg dHJhbnNsYXRlZCB0byBIVE1MIGR1cmluZyB0aGUgZ2V0LgogICAgLy8KICAgIC8vIFNlZSBXb3Jk Q29udmVydGVyQ3JlYXRlQWJzdHJhY3QgYW5kIFdvcmRDb252ZXJ0ZXJHZXRDb25jcmV0ZSBmb3Ig aG93IHRoaXMgaXMgZG9uZSBpbiB0aGUKICAgIC8vIFdvcmQgZmlsdGVyLgoKICAgIG9rID0gMTsK CiBlbmQ6CiAgICBPREZQYWNrYWdlUmVsZWFzZShwYWNrYWdlKTsKICAgIE9ERlRleHRDb252ZXJ0 ZXJSZWxlYXNlKGNvbnYpOwogICAgaWYgKCFvaykgewogICAgICAgIERGRG9jdW1lbnRSZWxlYXNl KGh0bWwpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIGh0bWw7Cn0KCmlu dCBPREZUZXh0UHV0KERGU3RvcmFnZSAqY29uY3JldGVTdG9yYWdlLCBERlN0b3JhZ2UgKmFic3Ry YWN0U3RvcmFnZSwgREZEb2N1bWVudCAqaHRtbERvYywgY29uc3QgY2hhciAqaWRQcmVmaXgsIERG RXJyb3IgKiplcnJvcikKewogICAgREZFcnJvckZvcm1hdChlcnJvciwiT0RGVGV4dFB1dDogTm90 IHlldCBpbXBsZW1lbnRlZCIpOwogICAgcmV0dXJuIDA7Cn0KCmludCBPREZUZXh0Q3JlYXRlKERG U3RvcmFnZSAqY29uY3JldGVTdG9yYWdlLCBERlN0b3JhZ2UgKmFic3RyYWN0U3RvcmFnZSwgREZE b2N1bWVudCAqaHRtbERvYywgREZFcnJvciAqKmVycm9yKQp7CiAgICBERkVycm9yRm9ybWF0KGVy cm9yLCJPREZUZXh0Q3JlYXRlOiBOb3QgeWV0IGltcGxlbWVudGVkIik7CiAgICByZXR1cm4gMDsK fQoKCg== --001a1133fdaeb356d3051788e6d4 Content-Type: text/x-csrc; charset=UTF-8; name="gbg_test.c" Content-Disposition: attachment; filename="gbg_test.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iafd031b2 I2luY2x1ZGUgIkRGUGxhdGZvcm0uaCIKI2luY2x1ZGUgIk9ERlRleHQuaCIKI2luY2x1ZGUgIk9E RlBhY2thZ2UuaCIKI2luY2x1ZGUgIk9ERlRleHRDb252ZXJ0ZXIuaCIKI2luY2x1ZGUgIkRGRE9N LmgiCgojaW5jbHVkZSAiQ1NTLmgiCiNpbmNsdWRlICJDU1NTaGVldC5oIgojaW5jbHVkZSA8c3Rk aW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJE RlhNTE5hbWVzLmgiCiNpbmNsdWRlICJERk5hbWVNYXAuaCIKI2luY2x1ZGUgImNvbG9yLmgiCiNp bmNsdWRlICJnYmdfdGVzdC5oIgoKLyoKICBHOiBBZHZpY2UgSSBoYXZlIHN0aWxsIHRvIGNvdmVy OgogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIHByaW50Tm9kZToKCiAgVGhl IGF0dHJzIGZpZWxkIG9mIHRoZSBERk5vZGUgc3RydWN0IGlzIGFuIGFycmF5LCBub3QgYSBzaW5n bGUKICBvYmplY3QuIEl0IGNvbnRhaW5zIGF0dHJzQ291bnQgZWxlbWVudHMuIEFjY2Vzc2luZyBp dCBpbiB0aGUgd2F5IHRoYXQKICBwcmludE5vZGUgZG9lcyBpcyBpbmNvcnJlY3QgZm9yIHR3byBy ZWFzb25zOgoKICAxKSBUaGUgZmFjdCB0aGF0IGF0dHJzIGlzIG5vbi1OVUxMIGRvZXNu4oCZdCBu ZWNlc3NhcmlseSBtZWFuIHRoYXQgdGhlCiAgbm9kZSBoYXMgYXR0cmlidXRlcy4gSXTigJlzIHBv c3NpYmxlIHRoYXQgaXQgZGlkIGF0IG9uZSBwb2ludCBoYXZlCiAgYXR0cmlidXRlcywgYnV0IHRo b3NlIHdlcmUgYWxsIHJlbW92ZWQuIEluIHN1Y2ggYSBjYXNlLCBhdHRyc0NvdW50CiAgd2lsbCBi ZSB6ZXJvLCBidXQgYXR0cnMgd2lsbCBzdGlsbCBiZSBub24tTlVMTC4gSGF2ZSBhIGxvb2sgYXQg dGhlCiAgaW1wbGVtZW50YXRpb24gb2YgREZHZXRBdHRyaWJ1dGUsIERGU2V0QXR0cmlidXRlLCBE RlJlbW92ZUF0dHJpYnV0ZSBpbgogIERGRE9NLmMgdG8gc2VlIGhvdyBhdHRycywgYXR0cnNDb3Vu dCwgYW5kIGF0dHJzQWxsb2MgYXJlIHVzZWQuCgogIDIpIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBh dHRyaWJ1dGVzLCB0aGlzIHdpbGwgb25seSBwcmludCB0aGUgZmlyc3QuCgogIFRvIGdvIHRocm91 Z2ggYWxsIHRoZSBhdHRyaWJ1dGVzIGFuZCBwcmludCBvdXQgdGhlaXIgdGFncyAmIHZhbHVlcywK ICB5b3Ugd291bGQgdXNlIGEgbG9vcDoKCgogIFlvdSBjYW4gYWxzbyB1c2UgREZHZXRBdHRyaWJ1 dGUgaWYgeW91IHdhbnQgdG8gYWxyZWFkeSBrbm93IHRoZSB0YWcKICB5b3UgYXJlIGxvb2tpbmcg Zm9yIChlLmcuIFRFWFRfT1VUTElORV9MRVZFTCkuIFRoaXMgZnVuY3Rpb24gd2lsbAogIHJldHVy biBOVUxMIGlmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3QsIG9yIHRoZSBhdHRyaWJ1dGUg dmFsdWUgaWYKICBpdCBkb2VzLgoKCiAgPiBUYWcgdGV4dF9oKERGTm9kZSAqbm9kZSkKICA+IHsK ICA+ICAgIGNoYXIgKnMgPSBub2RlLT5hdHRycy0+dmFsdWU7CgpSZWZlcmVuY2luZyBub2RlLT5h dHRycy0+dmFsdWUgaXMgaW5jb3JyZWN0LCBhcyB5b3UgZG9u4oCZdCBrbm93CndoZXRoZXIgdGhl IG5vZGUgd2lsbCBoYXZlIGFueSBhdHRyaWJ1dGVzLCBhbmQgaXQgaWYgZG9lcywgd2hldGhlciB0 aGUKc3R5bGUgbmFtZSAod2hpY2ggaXMgd2hhdCBJIGFzc3VtZSB5b3XigJlyZSBsb29raW5nIGZv ciBoZXJlKSB3aWxsCmhhcHBlbiB0byBiZSB0aGUgZmlyc3Qgb25lLiBERkdldEF0dHJpYnV0ZShu b2RlLFRFWFRfU1RZTEVfTkFNRSkgaXMKaG93IHlvdSB3b3VsZCBnZXQgdGhpcyByZWxpYWJseS4K Ckc6IERvZXMgbm90IGFsd2F5cyBoYXBwZW4gc28gOiggc2VlIFRFWFRfSCBlbnRyeSBmb3IgYSBm YWlsdXJlCihwcm9iYWJseSBvbiBteSBwYXJ0IDotKQoKICAgIC8vIFRPRE86IE9uY2UgdGhpcyBi YXNpYyB0cmF2ZXJzYWwgaXMgaW1wbGVtZW50ZWQgYW5kIGlzIGNhcGFibGUgb2YgcHJvZHVjaW5n IHBhcmFncmFwaHMsCiAgICAvLyB0YWJsZXMsIGxpc3RzLCBhbmQgc3BhbnMsIGFkZCBpZHMgdG8g dGhlIEhUTUwgZWxlbWVudHMgYXMgdGhleSBhcmUgY3JlYXRlZC4gVGhhdCBpcywgc2V0CiAgICAv LyB0aGUgaWQgYXR0cmlidXRlIG9mIGVhY2ggbmV3IEhUTUwgZWxlbWVudCB0byBhIHN0cmluZyBj b250YWluaW5nIHRoZSBpZFByZWZpeCBmb2xsb3dlZCBieQoKUTogd2hhdCBpcyB0aGF0IGlkUHJl Zml4IHRoaW5nIGFuZCBob3cgZG8gSSBmaW5kL2dlbmVyYXRlIHRoaXM/CgogICAgLy8gdGhlIHNl cU5vIGZpZWxkIG9mIHRoZSBub2RlIGluIGNvbnRlbnREb2MgZnJvbSB3aGljaCB0aGUgSFRNTCBl bGVtZW50IHdhcyBnZW5lcmF0ZWQuCgpROiBBcyBpbjogYWRqdXN0IHRoZSBhdXRvbWF0aWMgY291 bnRlciB0aGF0IHdvcmtzIGN1cnJlbnRseT8gIE9rLCBidXQKaXQnbGwgbGVhdmUgaG9sZXMgaW4g dGhlIGNvdW50IDooCgpOb3RlOiBJIHN0aWxsIGZvdW5kIHRoZSB0cmFuc2xhdGVYTUxFbnVtTmFt ZSBhcnJheSBpbmZvcm1hdGl2ZSwgc28gSQpwdXQgaXQgYmFjayBhZ2FpbiBhcyBhIGRldiBhaWQu CgoqLwoKLyoqCiAqIFRlbXAgZnVuY3Rpb246IENvbGxlY3QgYWxsIHRoZSBwb3NzaWJsZSB0cmFu c2xhdGlvbnMgZnJvbSBPREYgdG8KICogSFRNTC4gIFdpbGwgcHJvYmFibHkgc3RpbGwgY2hhbmdl IHNoYXBlIGEgbG90LgogKgogKiBJbnB1dDogICAgREZOb2RlIGZyb20gT0RGIGRvY3VtZW50IHRo YXQgaXMgY3VycmVudGx5IGJlaW5nIGV4YW1pbmVkLgogKgogKiBSZXR1cm5zOiBUYWcgd2l0aCBI VE1sIHZhbHVlIG9yIFRBR19OT1RfTUFUQ0hFRCwgb3IsIHdyaXRlcyBjb2RlIHRvCiAqIHNjcmVl biB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc3dpdGNoIGZ1bmN0aW9uLiAgKHNlZSBkZWZhdWx0 OiApCiAqLwpUYWcgZmluZF9IVE1MKERGTm9kZSAqb2RmTm9kZSwgREZOb2RlICpodG1sTm9kZSkK ewogICAgLy8gSSBhZGRlZCBhIGNvdXBsZSBvZiAjZGVmaW5lcyBmb3IgZGV2IHB1cnBvc2VzLiAg CiAgICAvLwogICAgLy8gVEFHX05PVF9NQVRDSEVEIHNob3dzIG1lIHN0dWZmIEkga25vdyBhYm91 dCBidXQgaGF2ZW4ndCBtYW5hZ2VkCiAgICAvLyB0byBtYXRjaCB1cC4KICAgIC8vCiAgICAvLyBk ZWZhdWx0IHNlbmRzIGJhY2sgVEFHX05PVF9GT1VORCBhbmQgc28gY2F0Y2hlcyBuZXcgdGFncyBh bmQKICAgIC8vIGhlbHBmdWxseSBwcmludHMgb3V0IGNvZGUgZm9yIGFkZGluZyB0byB0aGUgc3dp dGNoIHN0YXRlbWVudAogICAgLy8gOy0pCiAgICAvLwogICAgLy8gZm9yIHNvbWUgd2VpcmQgcmVh c29uLCBjLW1vZGUgaW4gZW1hY3MgZ2l2ZXMgbWUgYSBmdW5reQogICAgLy8gaW5kZW50YXRpb24g aW4gc3dpdGNoIGZ1bmN0aW9ucy4gIEknbGwgZml4IGl0IG9uY2UgdGhpcwogICAgLy8gZnVuY3Rp b24gc2V0dGxlZC4KCiAgICBwcmludGYoTUFHRU5UQSAiZmluZF9IVE1MKCk6IFRBRyBOQU1FOiAl cyAgVmFsdWU6ICVkIFxuIiBSRVNFVCwKICAgICAgICAgICB0cmFuc2xhdGVYTUxFbnVtTmFtZVtv ZGZOb2RlLT50YWddLAogICAgICAgICAgIG9kZk5vZGUtPnRhZwogICAgICAgICAgICk7CgogICAg c3dpdGNoKG9kZk5vZGUtPnRhZykgewoKICAgIGNhc2UgVEVYVF9IIDogeyAvL2hlYWRlcnMgaDEg LSBoNiwgaDcrIHJldHVybnMgYXMgcAogICAgICAgIAogICAgICAgIGNvbnN0IGNoYXIqIHMgPSBE RkdldEF0dHJpYnV0ZShvZGZOb2RlLFRFWFRfU1RZTEVfTkFNRSk7CgogICAgICAgIC8vIEdyYWIg dGhlIHZlcnkgbGFzdCBkaWdpdC4gIElmIGl0J3MgYSAwLTUgd2UgaGF2ZSBhIHByb3BlcgogICAg ICAgIC8vIGhlYWRlciwgb3RoZXJ3aXNlLCB3ZSBoYXZlIGhlYWRpbmcgNi0xMC4KICAgICAgICBp bnQgc192YWwgPSBhdG9pKCZzW3N0cmxlbihzKS0xXSkgLSAxOwogICAgICAgIGlmIChzX3ZhbCA+ PSAwICYmIHNfdmFsIDwgNikKICAgICAgICAgICAgcmV0dXJuIEhUTUxfSDEgKyBzX3ZhbDsKICAg ICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBIVE1MX1A7CiAgICB9CiAgICAgICAgLy8gcGFy YWdyYXBoCiAgICBjYXNlIFRFWFRfUCA6IHsgcmV0dXJuIEhUTUxfUDsgfQoKICAgICAgICAvLyBs aXN0cwogICAgY2FzZSBURVhUX0xJU1QgOiAgICAgIHsgcmV0dXJuIEhUTUxfTElTVDsgfQogICAg Y2FzZSBURVhUX0xJU1RfSVRFTSA6IHsgcmV0dXJuIEhUTUxfTEk7IH0KCiAgICAgICAgLy8gdGFi bGVzCiAgICBjYXNlIFRBQkxFX1RBQkxFIDogICAgICAgIHsgcmV0dXJuIEhUTUxfVEFCTEU7IH0K ICAgIGNhc2UgVEFCTEVfVEFCTEVfQ09MVU1OIDogeyByZXR1cm4gSFRNTF9DT0w7IH0KICAgIGNh c2UgVEFCTEVfVEFCTEVfUk9XIDogICAgeyByZXR1cm4gSFRNTF9ST1dTOyB9CgogICAgY2FzZSAg VEFCTEVfVEFCTEVfQ0VMTCA6ICAgICAgICAgICAgICB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7 IH0KICAgIGNhc2UgIFNUWUxFX1RBQkxFX0NFTExfUFJPUEVSVElFUyA6ICAgeyByZXR1cm4gVEFH X05PVF9NQVRDSEVEOyB9CiAgICBjYXNlICBTVFlMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFUyA6 IHsgcmV0dXJuIFRBR19OT1RfTUFUQ0hFRDsgfQogICAgY2FzZSAgU1RZTEVfVEFCTEVfUFJPUEVS VElFUyA6ICAgICAgICB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7IH0KCiAgICBjYXNlICBTVFlM RV9URVhUX1BST1BFUlRJRVMgOiB7CgogICAgICAgIC8vIG5vIG91dHB1dDoKICAgICAgICAvLyBj b25zdCBjaGFyKiBzID0gREZHZXRBdHRyaWJ1dGUob2RmTm9kZSxTVFlMRV9URVhUX1BST1BFUlRJ RVMpOwogICAgICAgIGNvbnN0IGNoYXIqIHMgPSBERkdldEF0dHJpYnV0ZShvZGZOb2RlLERPTV9U RVhUKTsKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9kZk5vZGUtPmF0dHJz Q291bnQ7IGkrKykgewoKICAgICAgICAgICAgaWYgKG9kZk5vZGUtPmF0dHJzW2ldLnRhZyA9PSBG T19GT05UX1dFSUdIVCAKICAgICAgICAgICAgICAgICYmICFzdHJjbXAoImJvbGQiLG9kZk5vZGUt PmF0dHJzW2ldLnZhbHVlKSkgeyAgICAgICAgICAKICAgICAgICAgICAgICAgIERGQ3JlYXRlQ2hp bGRFbGVtZW50KGh0bWxOb2RlLCBIVE1MX0IpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAg ICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvZGZOb2RlLT5hdHRyc1tpXS50YWcgPT0gRk9f Rk9OVF9TVFlMRSAKICAgICAgICAgICAgICAgICYmICFzdHJjbXAoIml0YWxpYyIsb2RmTm9kZS0+ YXR0cnNbaV0udmFsdWUpKSB7CiAgICAgICAgICAgICAgICBERkNyZWF0ZUNoaWxkRWxlbWVudCho dG1sTm9kZSwgSFRNTF9JKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOyAKICAgICAgICAgICAg fQoKICAgICAgICAgICAgaWYgKG9kZk5vZGUtPmF0dHJzW2ldLnRhZyA9PSBTVFlMRV9URVhUX1VO REVSTElORV9TVFlMRSkgewogICAgICAgICAgICAgICAgREZDcmVhdGVDaGlsZEVsZW1lbnQoaHRt bE5vZGUsIEhUTUxfVSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsgCiAgICAgICAgICAgIH0K CiAgICAgICAgICAgIHByaW50ZihSRUQgIkZhaWx1cmU6ICIgUkVTRVQKICAgICAgICAgICAgICAg ICAgICJ0YWcgJXUgdGFnIG5hbWUgJXMgdmFsdWUgJXNcbiIsCiAgICAgICAgICAgICAgICAgICBv ZGZOb2RlLT5hdHRyc1tpXS50YWcsCiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVYTUxFbnVt TmFtZVtvZGZOb2RlLT5hdHRyc1tpXS50YWddLAogICAgICAgICAgICAgICAgICAgb2RmTm9kZS0+ YXR0cnNbaV0udmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFRBR19OT1RfTUFUQ0hF RDsKICAgIH0KICAgICAgICAvLyBkb2N1bWVudAogICAgY2FzZSAgT0ZGSUNFX0FVVE9NQVRJQ19T VFlMRVMgOiB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7IH0KICAgIGNhc2UgIE9GRklDRV9CT0RZ IDogICAgICAgICAgICAgeyByZXR1cm4gVEFHX05PVF9NQVRDSEVEOyB9CiAgICBjYXNlICBPRkZJ Q0VfRk9OVF9GQUNFX0RFQ0xTIDogIHsgcmV0dXJuIFRBR19OT1RfTUFUQ0hFRDsgfQogICAgY2Fz ZSAgT0ZGSUNFX1NDUklQVFMgOiAgICAgICAgICB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7IH0K ICAgIGNhc2UgIE9GRklDRV9URVhUIDogICAgICAgICAgICAgeyByZXR1cm4gVEFHX05PVF9NQVRD SEVEOyB9CiAgICAgICAgCiAgICAgICAgLy8gZm9udHMsIHN0eWxlcyduJ3RoaW5ncy4KICAgIGNh c2UgIFNUWUxFX0ZPTlRfRkFDRSA6ICAgICB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7IH0KICAg IGNhc2UgIFNUWUxFX1NUWUxFIDogICAgICAgICB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7IH0K ICAgIGNhc2UgIFRFWFRfU0VRVUVOQ0VfREVDTCA6ICB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7 IH0KICAgIGNhc2UgIFRFWFRfU0VRVUVOQ0VfREVDTFMgOiB7IHJldHVybiBUQUdfTk9UX01BVENI RUQ7IH0KICAgIAogICAgZGVmYXVsdDogewogICAgICAgIC8vIHJtIGZvby5odG1sOyBtYWtlIDsg Li9iaW4vZGZjb252ZXJ0IGdldCBiaW4vbGlzdHMub2R0IGZvby5odG1sIHwgc29ydCAtdQogICAg ICAgIC8vIC4uLiBiZWNhdXNlIHdlIGFyZSB0b28gbGF6eSB0byB0eXBlLgogICAgICAgIHByaW50 ZigiY2FzZSAgJXMgOiB7IHJldHVybiBUQUdfTk9UX01BVENIRUQ7IH1cbiIsCiAgICAgICAgICAg ICAgIHRyYW5zbGF0ZVhNTEVudW1OYW1lW29kZk5vZGUtPnRhZ10pOyAgICAgCiAgICAgICAgcmV0 dXJuIFRBR19OT1RfRk9VTkQ7CiAgICB9CiAgICB9Cn0KCi8qKgogKiBEZXYgdG9vbDogTGlzdCBh bGwgdGhlIG5vZGVzIGZvbGxvd2luZyB0aGUgZ2l2ZW4gb25lLiAgCiAqLwp2b2lkIHNob3dfbm9k ZXMoREZOb2RlICpvZGZOb2RlLCBpbnQgbGV2ZWwpCnsKICAgIHByaW50ZigiTGV2ZWw6ICVkXG4i LGxldmVsKTsKICAgIGxldmVsKys7CiAgICBwcmludF9ub2RlX2luZm8ob2RmTm9kZSk7CiAgICBm b3IgKERGTm9kZSAqb2RmQ2hpbGQgPSBvZGZOb2RlLT5maXJzdDsgb2RmQ2hpbGQgIT0gTlVMTDsg b2RmQ2hpbGQgPSBvZGZDaGlsZC0+bmV4dCkgewoJd2Fsa0NoaWxkcmVuKG9kZkNoaWxkLCBsZXZl bCk7CiAgICB9Cn0KCi8qKgogKiBEZXYgdG9vbDogTGlzdCBhbGwgdGhlIG5vZGVzIGZvbGxvd2lu ZyB0aGUgZ2l2ZW4gb25lLiAgCiAqLwp2b2lkIHdhbGtDaGlsZHJlbihERk5vZGUgKm9kZk5vZGUs IGludCBsZXZlbCkKewogICAgcHJpbnRmKCJMZXZlbDogJWRcbiIsbGV2ZWwpOwogICAgbGV2ZWwr KzsKICAgIHByaW50X25vZGVfaW5mbyhvZGZOb2RlKTsKICAgIGZvciAoREZOb2RlICpvZGZDaGls ZCA9IG9kZk5vZGUtPmZpcnN0OyBvZGZDaGlsZCAhPSBOVUxMOyBvZGZDaGlsZCA9IG9kZkNoaWxk LT5uZXh0KSB7CiAgICAgICAgd2Fsa0NoaWxkcmVuKG9kZkNoaWxkLCBsZXZlbCk7CiAgICB9Cn0K Ci8qKgogKiBEZXYgdG9vbDogTGlzdCBhbGwgdGhlIG5vZGVzIGJlbG93IHRoZSBnaXZlbiBvbmUu ICAKICovCi8qdm9pZCBzaG93X25vZGVzKERGTm9kZSAqb2RmTm9kZSwgaW50IGxldmVsKQp7CiAg ICBERk5vZGUgKm5leHROb2RlID0gb2RmTm9kZTsKICAgIGRvIHsKICAgICAgICBwcmludF9ub2Rl X2luZm8obmV4dE5vZGUpOwogICAgICAgIG5leHROb2RlID0gREZOZXh0Tm9kZShuZXh0Tm9kZSk7 CiAgICB9d2hpbGUobmV4dE5vZGUgIT0gTlVMTCk7Cn0qLwoKLy9naXZlIG1lIHRoZSBzdHlsZXMg ZG9jdW1lbnQKdm9pZCBidWlsZENTU19TdHlsZXMoQ1NTU2hlZXQgKiBjc3NTaGVldCwgREZOb2Rl ICpvZGZOb2RlKSAKewogIC8vd2FsayB0aHJvdWdoIHRoZSBub2RlcwogIC8vIGdvIHRvIHRoZSBv ZmZpY2U6c3R5bGVzIGNhbiB3ZSBmaW5kIGl0PwogIC8vaXRlcmF0ZSBlYWNoIHN0eWxlOnN0eWxl CiAgLy8gbWFrZSBhIGNzcyAKICAvLyBkaXAgZG93biB0byBnZXQgaXRzIGF0dHJpYnV0ZXMKICAg IHByaW50ZigiYnVpbGRDU1NfU3R5bGVzXG4iKTsKICAgIHByaW50ZigibmFtZSA9ICVzXG4iLCB0 cmFuc2xhdGVYTUxFbnVtTmFtZVtvZGZOb2RlLT50YWddKTsKICAgIAogICAgLy9tYW51YWxseSBw bGF5IHdpdGggdGhlIGZ1bmN0aW9ucyBmaXJzdAogICAgCiAgICAKLyogICAgQ1NTU3R5bGUqIGNz c1N0eWxlID0gQ1NTU2hlZXRMb29rdXBFbGVtZW50KGNzc1NoZWV0LCAKCQkJCQkJICJlbGVtZW50 TmFtZSIsCgkJCQkJCSAiY2xhc3NOYW1lIiwKCQkJCQkJMSwKCQkJCQkJMCk7CiAgICBDU1NQcm9w ZXJ0aWVzICogbG9jYWxwcm9wZXJ0aWVzID0gQ1NTU3R5bGVSdWxlKGNzc1N0eWxlKTsKICAgIENT U1B1dChsb2NhbHByb3BlcnRpZXMsImZvbnQtd2VpZ2h0IiwiYm9sZCIpOyovCgogICAgCiAgICAK ICAgIGZvciAoREZOb2RlICpvZGZDaGlsZCA9IG9kZk5vZGUtPmZpcnN0OyBvZGZDaGlsZCAhPSBO VUxMOyBvZGZDaGlsZCA9IG9kZkNoaWxkLT5uZXh0KSAKICAgIHsKICAgICAgICBpZihvZGZDaGls ZC0+dGFnID09IE9GRklDRV9TVFlMRVMpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlBy b2Nlc3Npbmcgb2ZmaWNlIHN0eWxlc1xuIik7CiAgICAgICAgICAgIGZvciAoREZOb2RlICpzdHls ZU5vZGUgPSBvZGZDaGlsZC0+Zmlyc3Q7IHN0eWxlTm9kZSAhPSBOVUxMOyBzdHlsZU5vZGUgPSBz dHlsZU5vZGUtPm5leHQpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihzdHlsZU5v ZGUtPnRhZyA9PSBTVFlMRV9TVFlMRSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0eWxlTm9kZS0+YXR0cnNDb3VudDsg aSsrKSAKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRhZyB0 ID0gc3R5bGVOb2RlLT5hdHRyc1tpXS50YWc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHQg PT0gU1RZTEVfTkFNRSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgICAgICAgICAgcHJpbnRmKCJDcmVhdGUgQ1NTIFByb3BlcnRpZXMgZm9yICVzXG4iLCBzdHls ZU5vZGUtPmF0dHJzW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGlzIGlzIGEgaGVhZGluZyBsb29rIGZvciB0 aGUgVEVYVF9PVVRMSU5FX0xFVkVMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgYXR0cmJ1dGUgZmV0Y2ggdGhpbmcuLi4K ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG91dGxldmVsID0gREZHZXRB dHRyaWJ1dGUoc3R5bGVOb2RlLCBTVFlMRV9ERUZBVUxUX09VVExJTkVfTEVWRUwpOwogICAgICAg ICAgICAgICAgICAgICAgICAgICAgQ1NTU3R5bGUqIGNzc1N0eWxlID0gTlVMTDsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGlmKG91dGxldmVsICE9IE5VTEwpIHsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjaGFyIGhsZXZlbFs0XSA9ICJoIjsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBobGV2ZWxbMV0gPSBvdXRsZXZlbFswXTsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBobGV2ZWxbMl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlID0gQ1NTU2hlZXRM b29rdXBFbGVtZW50KGNzc1NoZWV0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxldmVsLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHlsZU5vZGUtPmF0dHJzW2ldLnZhbHVlLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAx LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxz ZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGUgPSBDU1NTaGVldExv b2t1cEVsZW1lbnQoY3NzU2hlZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVOb2RlLT5hdHRyc1tpXS52 YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBmb3IgKERGTm9kZSAqc3R5bGVJbmZvID0gc3R5bGVOb2RlLT5m aXJzdDsgc3R5bGVJbmZvICE9IE5VTEw7IHN0eWxlSW5mbyA9IHN0eWxlSW5mby0+bmV4dCkgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaWYoc3R5bGVJbmZvLT50YWcgPT0gU1RZTEVfVEVYVF9QUk9QRVJUSUVTKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLy9qdXN0IGxvb2tpbmcgZm9yIGJvbGRzIGFzIGEgZmlyc3QgY3V0CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc3R5bGVJ bmZvLT5hdHRyc0NvdW50OyBpKyspIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWcgdCA9IHN0eWxl SW5mby0+YXR0cnNbaV0udGFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3dpdGNoKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGT19GT05UX1dF SUdIVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTU1Byb3BlcnRpZXMg KiBsb2NhbHByb3BlcnRpZXMgPSBDU1NTdHlsZVJ1bGUoY3NzU3R5bGUpOwogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1NQdXQobG9jYWxwcm9wZXJ0aWVz LCJmb250LXdlaWdodCIsc3R5bGVJbmZvLT5hdHRyc1tpXS52YWx1ZSk7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjYXNlIEZPX0ZPTlRfU0laRToKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIENTU1Byb3BlcnRpZXMgKiBsb2NhbHByb3BlcnRpZXMgPSBDU1NTdHls ZVJ1bGUoY3NzU3R5bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBDU1NQdXQobG9jYWxwcm9wZXJ0aWVzLCJmb250LXNpemUiLHN0eWxlSW5mby0+YXR0 cnNbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVFlMRV9G T05UX05BTUU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcm9wZXJ0 aWVzICogbG9jYWxwcm9wZXJ0aWVzID0gQ1NTU3R5bGVSdWxlKGNzc1N0eWxlKTsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHV0KGxvY2FscHJvcGVy dGllcywiZm9udC1mYW1pbHkiLHN0eWxlSW5mby0+YXR0cnNbaV0udmFsdWUpOwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGVsc2UgaWYoc3R5bGVJbmZvLT50YWcgPT0gU1RZTEVfUEFSQUdSQVBIX1BS T1BFUlRJRVMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC8vVEJECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAg ICAgICAgfQogICAgfQp9CgovKioKICogRGV2IHRvb2w6IExpc3QgZXZlcnl0aGluZyBhYm91dCBh IE5vZGUgdGhhdCdzIGZpdCB0byBwcmludC4uICAKICovCnZvaWQgcHJpbnRfbm9kZV9pbmZvKERG Tm9kZSAqbikKewogICAgaWYgKG4gPT0gTlVMTCkgcmV0dXJuOwoKICAgIGlmIChuLT50YWcpIHBy aW50ZigiVGFnIHRhZzogJXp1IG5hbWUgPSAlc1xuIixuLT50YWcsIHRyYW5zbGF0ZVhNTEVudW1O YW1lW24tPnRhZ10pOwogICAgcHJpbnRmKCJ1bnNpZ25lZCBpbnQgc2VxTm86ICVkXG4iLG4tPnNl cU5vKTsKICAgIC8vIHByaW50Zigic3RydWN0IERGRG9jdW1lbnQgKmRvYzogJXBcbiIsbi0+ZG9j KTsKICAgIGlmIChuLT5qcykgICAgICBwcmludGYoInZvaWQgKmpzOiAlcFxuIixuLT5qcyk7CiAg ICBpZiAobi0+Y2hhbmdlZCkgcHJpbnRmKCJpbnQgY2hhbmdlZDogJWRcbiIsbi0+Y2hhbmdlZCk7 CiAgICBpZiAobi0+Y2hpbGRyZW5DaGFuZ2VkKSBwcmludGYoImludCBjaGlsZHJlbkNoYW5nZWQg JWRcbiIsbi0+Y2hpbGRyZW5DaGFuZ2VkKTsKICAgIGlmIChuLT5zZXFOb0hhc2hOZXh0KSBwcmlu dGYoIkRGTm9kZSAqc2VxTm9IYXNoTmV4dCAlcFxuIiwgbi0+c2VxTm9IYXNoTmV4dCk7CgogICAg REZOYW1lTWFwICptYXAgPSBuLT5kb2MtPm1hcDsgCiAgICBjb25zdCBUYWdEZWNsICp0ZCA9IERG TmFtZU1hcE5hbWVGb3JUYWcobWFwLG4tPnRhZyk7CiAgICBjb25zdCBOYW1lc3BhY2VEZWNsICpu cyA9IERGTmFtZU1hcE5hbWVzcGFjZUZvcklEKG1hcCx0ZC0+bmFtZXNwYWNlSUQpOwoKICAgIC8v IEF0dHJpYnV0ZXMKICAgIGlmIChuLT50YWcgPj0gTUlOX0VMRU1FTlRfVEFHKSB7CiAgICAgICAg Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuLT5hdHRyc0NvdW50OyBpKyspIHsKICAgICAg ICAgICAgVGFnIHQgPSBuLT5hdHRyc1tpXS50YWc7CiAgICAgICAgICAgIGNvbnN0IFRhZ0RlY2wg KmF0dHJEZWNsID0gREZOYW1lTWFwTmFtZUZvclRhZyhtYXAsdCk7CiAgICAgICAgICAgIHByaW50 ZigiaXRlcmF0aW9uICVkID09PSB0YWc6ICVkICBuYW1lOiAlcyBuYW1lc3BhY2VJRCA9ICVkIGxv Y2FsTmFtZSA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgaSwgdCwgdHJhbnNsYXRlWE1MRW51 bU5hbWVbdF0sIAogICAgICAgICAgICAgICAgICAgdGQtPm5hbWVzcGFjZUlELCAKICAgICAgICAg ICAgICAgICAgIHRkLT5sb2NhbE5hbWUpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChucy0+bmFt ZXNwYWNlVVJJKSBwcmludGYoIm5hbWVzcGFjZSBVUkkgPSAlc1xuIixucy0+bmFtZXNwYWNlVVJJ KTsKICAgIGlmICh0ZC0+bG9jYWxOYW1lKSBwcmludGYoImxvY2FsIG5hbWUgPSAlc1xuIix0ZC0+ bG9jYWxOYW1lKTsKICAgIGlmIChuLT5hdHRyc0NvdW50KSBwcmludGYoUkVEICJ1bnNpZ25lZCBp bnQgYXR0cnNDb3VudDogJWQgIFxuIiBSRVNFVCxuLT5hdHRyc0NvdW50KTsKICAgIGlmIChuLT5h dHRycykgewogICAgICAgIC8vIHByaW50ZigiREZBdHRyaWJ1dGUgKmF0dHJzOiAlcCAiLG4tPmF0 dHJzKTsKICAgICAgICBpZiAobi0+YXR0cnMtPnRhZykgcHJpbnRmKCIsIFRhZyB0YWdzOiAlenUg IixuLT5hdHRycy0+dGFnKTsKICAgICAgICBpZiAobi0+YXR0cnMtPnZhbHVlKSBwcmludGYoIiwg Y2hhciAqdmFsdWU6ICVzICIsbi0+YXR0cnMtPnZhbHVlKTsKICAgICAgICBwcmludGYoIiBUYWcg TmFtZSA9ICVzXG4iLCB0cmFuc2xhdGVYTUxFbnVtTmFtZVtuLT5hdHRycy0+dGFnXSk7CiAgICB9 CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuLT5hdHRyc0NvdW50OyBpKyspIHsKICAgICAgICBw cmludGYoQkxVRSAiYXR0cnNDb3VudCAlZCB0YWcgJXUgdmFsdWUgJXNcbiIgUkVTRVQsCiAgICAg ICAgICAgICAgIGksIG4tPmF0dHJzW2ldLnRhZyxuLT5hdHRyc1tpXS52YWx1ZSk7CiAgICB9Cgog ICAgaWYgKG4tPmF0dHJzQWxsb2MpIHByaW50ZigidW5zaWduZWQgaW50IGF0dHJzQWxsb2M6ICVk XG4iLCBuLT5hdHRyc0FsbG9jKTsKICAgIGlmIChuLT50YXJnZXQpIHByaW50ZigiY2hhciAqdGFy Z2V0OiAlc1xuIiwgbi0+dGFyZ2V0KTsKICAgIGlmIChuLT52YWx1ZSkgcHJpbnRmKCJjaGFyICp2 YWx1ZTogJXNcbiIsIG4tPnZhbHVlKTsKfQoKLyoqCiAqIERldiB0b29sOiBMaXN0IGxlc3MgaW5m byBhYm91dCBhIG5vZGUgdGhhbiBwcmludF9ub2RlX2luZm8oKS4KICovCmNoYXIgKm5vZGVfaWRf aW5mbyhERk5vZGUgKm5vZGUpCnsKICAgIGNvbnN0IGNoYXIgKmxvY2FsX25hbWUgPSBERk5vZGVO YW1lKG5vZGUpOwogICAgLy9jb25zdCBjaGFyICpuYW1lc3BhY2VfVVJJID0gREZOb2RlVVJJKG5v ZGUpOwogICAgY29uc3QgY2hhciAqZW51bV9uYW1lID0gdHJhbnNsYXRlWE1MRW51bU5hbWVbbm9k ZS0+dGFnXTsKICAgIGludCBsZW4gPSBzdHJsZW4gKGxvY2FsX25hbWUpICsgc3RybGVuKGVudW1f bmFtZSkgKyAzMDsgLy9zdHJsZW4oIG5hbWVzcGFjZV9VUkkpKzMwOwogICAgY2hhciAqciA9IG1h bGxvYyhsZW4pOwogICAgc25wcmludGYociwgbGVuLCAiVGFnIG5hbWUgPSAlcyBERk5vZGVOYW1l OiAlcyIsCiAgICAgICAgICAgICAvLyAiIERGTm9kZVVSSTogJXMiLCAKICAgICAgICAgICAgIGVu dW1fbmFtZSwKICAgICAgICAgICAgIGxvY2FsX25hbWUKICAgICAgICAgICAgIC8vbmFtZXNwYWNl X1VSSQogICAgICAgICAgICAgKTsKICAgIHJldHVybiByOwp9CgovKioKICogRGV2IHRvb2w6IExp c3Qgc29tZSBpbmZvIGFib3V0IGEgbWlzc2luZyB0YWcsIGFsb25lIHdpdGggc29tZSBoaWdoCiAq IGxpZ2h0aW5nIGZvciBlYXN5IHZpZXdpbmcgc3BvdHRpbmcuCiAqLwpjaGFyICptaXNzaW5nX3Rh Z19pbmZvKERGTm9kZSAqbm9kZSkKewogICAgY2hhciAqaW5mb3JtID0gcmVkKCJUYWcgbm90IG1h dGNoZWQ6ICIpOwogICAgY2hhciAqZmFjdHMgID0gbm9kZV9pZF9pbmZvKG5vZGUpOwogICAgaW50 IGxlbiA9IHN0cmxlbihpbmZvcm0pK3N0cmxlbihmYWN0cykrMjsKICAgIGNoYXIgKnIgPSBtYWxs b2MobGVuKTsKICAgIHNucHJpbnRmKHIsIGxlbiwgIiVzJXMiLCBpbmZvcm0sIGZhY3RzKTsKICAg IHJldHVybiByOwp9CgovKioKICogRGV2IHRvb2w6IEEgc2VsZWN0aW9uIG9mIHNuYXp6eSBsaW5l cyBiZWNhdXNlIEkgd2F0Y2hlZCB0b28gbWFueSBzZXJnZXIgdmlkcy4KICovCnZvaWQgcHJpbnRf bGluZShpbnQgc3R5bGUpCnsgCiAgICBpZiAoIXN0eWxlKQogICAgICAgIHByaW50ZigiPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxu Iik7CiAgICBlbHNlIGlmIChzdHlsZSA9PSAxKQogICAgICAgIHByaW50ZigiPS09LT0tPS09LT0t PS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPVxuIik7CiAg ICBlbHNlIGlmIChzdHlsZSA9PSAyKQogICAgICAgIHByaW50ZigiPSs9Kz0rPSs9Kz0rPSs9Kz0r PSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPVxuIik7Cn0KCg== --001a1133fdaeb356d3051788e6d4--