<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>25068</bug_id>
          
          <creation_ts>2009-04-06 18:12:12 -0700</creation_ts>
          <short_desc>[Chromium] Complex text support for Chromium Linux</short_desc>
          <delta_ts>2009-06-30 12:16:08 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Langley">agl</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>jshin</cc>
    
    <cc>playmobil</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>116703</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-04-06 18:12:12 -0700</bug_when>
    <thetext>This patch enables complex text support using the Harfbuzz library and Skia.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116704</commentid>
    <comment_count>1</comment_count>
      <attachid>29298</attachid>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-04-06 18:12:57 -0700</bug_when>
    <thetext>Created attachment 29298
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121437</commentid>
    <comment_count>2</comment_count>
      <attachid>29298</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-14 22:12:30 -0700</bug_when>
    <thetext>Comment on attachment 29298
patch

Various style issues.

1.  &quot;helper&quot; is not a very discriptive name. :)  Maybe TextRunWalkerHarfbuzz  TexRunWalker TextRunIterator?  Since the comment seems to imply its job is to walk text runs. :)

Lots of foo_bar style violations.  fooBar in WK

It seems HarfbuzzHelper (renamed?) could have its own header (and cpp?) file.  It&apos;s big enough.

Sad that HB_ShaperItem can&apos;t use OwnPtr. :(

Style:
 264     bool NextRTLScriptRun()

 307     ssize_t m_iter;  // indexes the next word in |m_run|
We generally try to use full words like m_indexOfNextWord?

 310     unsigned m_width;  // width (in px) of the current script run
m_widthInPx;  m_pixelWidth;

It seems all these things which pertain to m_run should be grouped with it, no? (and least in ordering, if not also in structure)

I assume this is in no way temporary?
 321     const FontPlatformData&amp; font = fontDataForCharacters(run.characters(), run.length())-&gt;fontDataForCharacter(&apos; &apos;)-&gt;platformData();

You probably want to grab off gc-&gt;platformContext() since you use it so much:
 323     SkCanvas* canvas = gc-&gt;platformContext()-&gt;canvas();

I&apos;ve not seen other parts of the WebCore code use &quot;const&quot; for local variables:
 325     const bool fill = textMode &amp; cTextFill;

Really?
377     // (Mac code ignores includePartialGlyphs, and they don&apos;t know what it&apos;s
 378     // supposed to do, so we just ignore it as well.)
ignored arguments generally cause warnings in the compiler, no?

What is &quot;i&quot; here?
 424             int i;
 425             if (harfbuzz.rtl()) {
Needs a better name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121438</commentid>
    <comment_count>3</comment_count>
      <attachid>29298</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-14 22:14:55 -0700</bug_when>
    <thetext>Comment on attachment 29298
patch

Bah,  I hit submit early.

All the places you use &quot;harfbuzz&quot; probably should hav ea differnet name.  We don&apos;t care that we&apos;re using &quot;harfbuzz&quot; more that we&apos;re iterating over the text runs or?

What is iter doing here?
 393         ssize_t iter = 0;
 394         while (iter &lt; run.length()) {

Seems that too needs a better name.

r- for all the nits above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126257</commentid>
    <comment_count>4</comment_count>
      <attachid>31363</attachid>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-06-16 12:16:15 -0700</bug_when>
    <thetext>Created attachment 31363
patch

Points not addressed in code:

&gt; Really?
&gt; 377     // (Mac code ignores includePartialGlyphs, and they don&apos;t know what
it&apos;s
&gt; 378     // supposed to do, so we just ignore it as well.)
&gt; ignored arguments generally cause warnings in the compiler, no?

This comment was taken from the Windows code. The ignored argument doesn&apos;t trigger a warning for us in either place.

&gt; I assume this is in no way temporary?
&gt;  321     const FontPlatformData&amp; font = fontDataForCharacters(run.characters(), run.length())-&gt;fontDataForCharacter(&apos; &apos;)-&gt;platformData();

It seems to be the way to get what I need.


Cheers

AGL</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126258</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-16 12:18:44 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; I assume this is in no way temporary?
&gt; &gt;  321     const FontPlatformData&amp; font = fontDataForCharacters(run.characters(), run.length())-&gt;fontDataForCharacter(&apos; &apos;)-&gt;platformData();
&gt; 
&gt; It seems to be the way to get what I need.

I meant that the value was not a temporary value.  You&apos;re grabbing a reference to something that is likely owned by one of those objects earlier in the line.  Why do we know it&apos;s still alive a couple lines later?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126279</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-06-16 13:52:16 -0700</bug_when>
    <thetext>To be perfectly honest, there&apos;s some amount of hope, copying other ports and &quot;look, valgrind says it&apos;s ok&quot;. On a less hand-wavy note, the root of that font data is the Font object, and a reference to it never leaves a member function of the Font object.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126533</commentid>
    <comment_count>7</comment_count>
      <attachid>31430</attachid>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-06-17 14:11:48 -0700</bug_when>
    <thetext>Created attachment 31430
/tmp/patch

Changes:

* Add createGlyphArrays and deleteGlyphArrays to remove some code duplication.
* Removed some enum cases where they weren&apos;t needed.
* BUG (typo): stroked complex text would crash.
* BUG (typo): LTR complex text could hit an assertion.
* BUG: highlighting an LTR complex text run wouldn&apos;t highlight the last character.&apos;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127768</commentid>
    <comment_count>8</comment_count>
      <attachid>31430</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-23 17:47:01 -0700</bug_when>
    <thetext>Comment on attachment 31430
/tmp/patch

Many of my comments are style related and I&apos;m doing an r- because there are quite a few to fix up.


Even though I have tried to verify the logic, it would be great if you got someone on the chromium team more familiar with text handling to look over the code.  Perhaps jshin or playmobil would be good choices.



&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog

&gt; +2009-06-16  Adam Langley  &lt;agl@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Chromium: Add complex text support on Linux.

Add link to bug here.

&gt; +        (WebCore::GetGlyphMetrics):
&gt; +        (WebCore::GetFontMetric):
&gt; +        (WebCore::):
This appears to be a prepare-Changelog goof, so just delete it (or fix it if you figure out what function this should have been).


&gt; diff --git a/WebCore/platform/graphics/chromium/FontLinux.cpp b/WebCore/platform/graphics/chromium/FontLinux.cpp

&gt; +extern HB_Error harfbuzzSkiaGetTable(void* voidface, const HB_Tag tag, HB_Byte* buffer, HB_UInt* len);

I&apos;d omit the param name &quot;tag&quot; since it doesn&apos;t appear to add any info.


&gt; +class TextRunWalker {
&gt; +public:
&gt; +    TextRunWalker(const TextRun&amp; run, SkPaint* paint, unsigned startingX, const FontPlatformData* font)
&gt; +        : m_run(run)
&gt; +        , m_paint(paint)

Why does this store m_paint and then never use it?



&gt; +        m_item.face = HB_NewFace(const_cast&lt;FontPlatformData*&gt;(font), harfbuzzSkiaGetTable);
&gt; +        m_item.font = (HB_FontRec*) fastMalloc(sizeof(HB_FontRec));

Use c++ style casts instead of c style casts.  This place and several others.



&gt; +
&gt; +    void setBackwardsIteration(bool is_backwards)
is_backwards 
useCasingLikeThis :)
.


&gt; +        return m_item.glyphs
&gt; +            &amp;&amp; m_item.attributes
&gt; +            &amp;&amp; m_item.advances
&gt; +            &amp;&amp; m_item.offsets
&gt; +            &amp;&amp; m_glyphs16
&gt; +            &amp;&amp; m_xpos;

This looks rather narrow to me. (You can got beyond 80 columns if desired but if you find this more readable for this item leave it as is.)


&gt;
&gt; +
&gt; +            // We overflowed our arrays. Resize and retry.
&gt; +            if (!expandGlyphArrays())
&gt; +                return false;
&gt; +        }
&gt; +
&gt; +        HB_Fixed adv_sum = 0;
Two problems with &quot;adv_sum&quot;
1. abbrvtn
2. theCasing


&gt; +        for (unsigned i = 0; i &lt; m_item.num_glyphs; ++i) {
&gt; +            m_glyphs16[i] = m_item.glyphs[i];
&gt; +            adv_sum += m_item.advances[i] &gt;&gt; 6;
&gt; +        }

6 is scattered through this code.  (dividing by 64.)  I&apos;m not sure why.
It would be good to create a static const int/unsigned for this which will help explain what this is by its name and get rid of the 6&apos;s all over the place.



&gt; +    uint16_t* m_glyphs16;  // a vector of 16-bit glyph ids
One space before end of line comments.
Also use sentences (or at least a sentence like format). Start with capital and end with period.

&gt; +    SkScalar* m_xpos;  // a vector of x positions for each glyph
&gt; +    SkPaint* const m_paint;
&gt; +    ssize_t m_indexOfNextScriptRun;  // indexes the script run in |m_run|
&gt; +    const unsigned m_startingX;
&gt; +    unsigned m_offsetX;
&gt; +    unsigned m_pixelWidth;  // width (in px) of the current script run
&gt; +    unsigned m_numCodePoints;  // code points in current script run
&gt; +    unsigned m_maxGlyphs;
&gt; +    bool m_iterateBackwards;
&gt; +};
&gt; +
&gt; +void Font::drawComplexText(GraphicsContext* gc, const TextRun&amp; run,
&gt;                             const FloatPoint&amp; point, int from, int to) const
&gt;  {
&gt; -    notImplemented();
&gt; +    if (run.length() == 0)
Use
    if (run.length())

(avoid comparisons to 0)

&gt; +      return;
&gt; +
&gt; +    const FontPlatformData&amp; font = fontDataForCharacters(run.characters(), run.length())-&gt;fontDataForCharacter(&apos; &apos;)-&gt;platformData();
&gt; +    PlatformGraphicsContext* pgc = gc-&gt;platformContext();

Avoid abbreviations &quot;pgc&quot;. 
Maybe graphicsContext instead?



&gt; +    bool stroke = (textMode &amp; cTextStroke)
&gt; +               &amp;&amp; pgc-&gt;getStrokeStyle() != NoStroke
&gt; +               &amp;&amp; pgc-&gt;getStrokeThickness() &gt; 0;
Why not put this all on one line?
(If you leave it like this, then the continuation lines should only be indented 4 spaces.)



&gt; +
&gt; +    TextRunWalker walker(run, stroke ? &amp;strokePaint : &amp;fillPaint, point.x(), &amp;font);

It looks like fill and stroke may both be true?  Why is only one passed into to this class? 
(Actually I would just get rid of that parameter from TextRunWalker.)




&gt; +                    return basePosition + j;
&gt; +            }
&gt; +
&gt; +            ASSERT(false);
s/ ASSERT(false);/ASSERT_NOT_REACHED();/



&gt;  
&gt; +// Return the rectangle for selecting the given range of code-points in the
&gt; +// TextRun.

This is an odd line break.  In WebKit code, you are certainly not limited to 80 columns

&gt;  FloatRect Font::selectionRectForComplexText(const TextRun&amp; run,
&gt;                                              const IntPoint&amp; point, int h,
&quot;h&quot; use unabbreviated names.


&gt;
&gt; +    // the position in question might be just after the text
Use sentence formatting.



&gt; +++ b/WebCore/platform/graphics/chromium/HarfbuzzSkia.cpp

&gt; + * Copyright (c) 2009, Google Inc. All rights reserved.

Change like this: &quot;Copyright (C) 2009 Google Inc. All rights reserved.&quot;



&gt; +#include &lt;harfbuzz-shaper.h&gt;

Previously you did #include &quot;harfbuzz-shaper.h&quot;

&gt; +
&gt; +static HB_Fixed SkiaScalarToHarfbuzzFixed(SkScalar v)

What does &quot;v&quot; represent?  (Please change the variable name to something better.)


&gt; +static HB_Bool StringToGlyphs(HB_Font hbFont, const HB_UChar16* chars, hb_uint32 len, HB_Glyph* glyphs, hb_uint32* glyphsSize, HB_Bool isRTL)

Avoid abbreviations.  Change variable names to something like:
character
length


&gt; +        memcpy(&amp;value, reinterpret_cast&lt;uint8_t*&gt;(glyphs) + sizeof(uint16_t) * i, sizeof(uint16_t));

reinterpret_cast&lt;uint8_t*&gt;(glyphs) + sizeof(uint16_t) * i

This looks wrong, but I get it. What do you think about this instead?

reinterpret_cast&lt;uint16_t*&gt;(glyphs) + i



&gt; +static void GlyphsToAdvances(HB_Font hbFont, const HB_Glyph* glyphs, hb_uint32 numGlyphs, HB_Fixed* advances, int flags)

flags appears unused.  Is that a bug?


&gt; +        // We use a memcpy to avoid breaking strict aliasing rules.
&gt; +        memcpy(&amp;value, reinterpret_cast&lt;uint8_t*&gt;(advances) + sizeof(float) * i, sizeof(float));

Same comment about &quot;reinterpret_cast&lt;uint8_t*&gt;(advances) + sizeof(float) * i&quot; as before.




&gt; +    font-&gt;setupPaint(&amp;paint);
&gt; +    paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
&gt; +
&gt; +    uint16_t* glyphs16 = (uint16_t*) fastMalloc(sizeof(uint16_t) * len);

Why the use of fastMalloc vs plain old new?
And if you switch to new, it would be good to adopt OwnPtr (from wtf/OwnPtr.h). You can think of this like a scoped_ptr.



&gt; +    for (int i = 0; i &lt; numGlyphs; ++i) {
&gt; +        if (glyphs16[i] == 0) {

Avoid comparisons to 0.

&gt; +            canRender = false;

&gt; +
&gt; +static HB_Error GetOutlinePoint(HB_Font hbFont, HB_Glyph glyph, int flags, hb_uint32 point, HB_Fixed* xpos, HB_Fixed* ypos, hb_uint32* nPoints)

s/xpos/xPos/
s/ypos/yPos/


What is nPoints?  It looks like an abbreviation.


&gt; +    SkPath path;
&gt; +    paint.getTextPath(&amp;glyph16, sizeof(glyph16), 0, 0, &amp;path);
&gt; +    int numPoints = path.getPoints(NULL, 0);

Use 0 instead of NULL.


&gt; +static HB_Fixed GetFontMetric(HB_Font hbFont, HB_FontMetric metric)
&gt; +{
...
&gt; +    switch (metric) {
&gt; +    case HB_FontAscent:
&gt; +        return SkiaScalarToHarfbuzzFixed(-skiaMetrics.fAscent);
&gt; +    default:
&gt; +        return 0;
&gt; +    }

This looks odd to me.  Why a switch instead of an &quot;if&quot;? (since there is only one case statement)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127998</commentid>
    <comment_count>9</comment_count>
      <attachid>31811</attachid>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-06-24 14:13:19 -0700</bug_when>
    <thetext>Created attachment 31811
patch

On Tue, Jun 23, 2009 at 5:47 PM, &lt;bugzilla-daemon@webkit.org&gt; wrote:
&gt; Even though I have tried to verify the logic, it would be great if you got
&gt; someone on the chromium team more familiar with text handling to look over the
&gt; code.  Perhaps jshin or playmobil would be good choices.

jshin declined to review it. At this point, having something is better than nothing. We&apos;re have security bugs which rely on our non-painting of complex text.

&gt; Why does this store m_paint and then never use it?

It does use it, but the code got moved to the constructor. I&apos;ve removed the member variable.

&gt; 6 is scattered through this code.  (dividing by 64.)  I&apos;m not sure why.
&gt; It would be good to create a static const int/unsigned for this which will help
&gt; explain what this is by its name and get rid of the 6&apos;s all over the place.

Have added a static function. I hope it doesn&apos;t introduce any signness bugs.

&gt; Avoid abbreviations &quot;pgc&quot;.
&gt; Maybe graphicsContext instead?

I only did this because Eric asked. Changing it back then.

&gt; (If you leave it like this, then the continuation lines should only be indented
&gt; 4 spaces.)

The style guide has the operators lining up on the left hand side.

&gt; reinterpret_cast&lt;uint8_t*&gt;(glyphs) + sizeof(uint16_t) * i
&gt;
&gt; This looks wrong, but I get it. What do you think about this instead?

Sorry, it is wrong. It should a char*, I thought that unsigned char* was special cased in the strict alias rules but, now that I check, it doesn&apos;t appear so.

&gt;&gt; +static void GlyphsToAdvances(HB_Font hbFont, const HB_Glyph* glyphs, hb_uint32 numGlyphs, HB_Fixed* advances, int flags)
&gt;
&gt; flags appears unused.  Is that a bug?

It&apos;s not used in the Harfbuzz reference code either.

&gt; Why the use of fastMalloc vs plain old new?
&gt; And if you switch to new, it would be good to adopt OwnPtr (from wtf/OwnPtr.h).
&gt; You can think of this like a scoped_ptr.

I think I can use OwnArrayPtr.

&gt;&gt; +    SkPath path;
&gt;&gt; +    paint.getTextPath(&amp;glyph16, sizeof(glyph16), 0, 0, &amp;path);
&gt;&gt; +    int numPoints = path.getPoints(NULL, 0);
&gt;
&gt; Use 0 instead of NULL.

I know that style guide says this, but this is so manifestly wrong in this case that I&apos;m going to leave it.

&gt;&gt; +    switch (metric) {
&gt;&gt; +    case HB_FontAscent:
&gt;&gt; +        return SkiaScalarToHarfbuzzFixed(-skiaMetrics.fAscent);
&gt;&gt; +    default:
&gt;&gt; +        return 0;
&gt;&gt; +    }
&gt;
&gt; This looks odd to me.  Why a switch instead of an &quot;if&quot;? (since there is only
&gt; one case statement)

I&apos;m going to leave it as a switch statement because it makes it clearer that we may need to support other values in the future.


AGL</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128240</commentid>
    <comment_count>10</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-25 12:45:54 -0700</bug_when>
    <thetext>I pinged jshin@chromium.org and he agreed to look this over.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128241</commentid>
    <comment_count>11</comment_count>
    <who name="Jungshik Shin">jshin</who>
    <bug_when>2009-06-25 12:47:51 -0700</bug_when>
    <thetext>David alerted me about this I didn&apos;t know about before (unless my memory is really faulty :-)). I&apos;ll take a look. 
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128246</commentid>
    <comment_count>12</comment_count>
    <who name="Adam Langley">agl</who>
    <bug_when>2009-06-25 13:12:53 -0700</bug_when>
    <thetext>jshik: I did email you ages ago. I think you even responded :) But thanks for taking a look. To be clear, there are known bugs in this code which will need to some work to fix, but this patch has been outstanding for months and I just want to land it at this point. Some complex text support is better than none at the moment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128889</commentid>
    <comment_count>13</comment_count>
      <attachid>31811</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-29 14:17:24 -0700</bug_when>
    <thetext>Comment on attachment 31811
patch

God I hate C.

Style:
 322     bool NextRTLScriptRun()
 352     bool NextLTRScriptRun()

Why copy/paste here?

 571         if (fromX == -1 &amp;&amp; from &lt; walker.numCodePoints()) {
 572             // |from| is within this script run. So we index the clusters log to
 573             // find which glyph this code-point contributed to and find its x
 574             // position.
 575             int glyph = walker.logClusters()[from];
 576             fromX = base + walker.xPositions()[glyph];
 577             fromAdvance = walker.advances()[glyph];
 578         } else
 579             from -= walker.numCodePoints();
 580 
 581         if (toX == -1 &amp;&amp; to &lt; walker.numCodePoints()) {
 582             int glyph = walker.logClusters()[to];
 583             toX = base + walker.xPositions()[glyph];
 584             toAdvance = walker.advances()[glyph];
 585         } else
 586             to -= walker.numCodePoints();

Again:

 593     // The position in question might be just after the text.
 594     const int rightEdge = base;
 595     if (fromX == -1 &amp;&amp; !from)
 596         fromX = leftEdge;
 597     else if (walker.rtl())
 598        fromX += truncateFixedPointToInteger(fromAdvance);
 599 
 600     if (toX == -1 &amp;&amp; !to)
 601         toX = rightEdge;
 602     else if (!walker.rtl())
 603         toX += truncateFixedPointToInteger(toAdvance);

Style:
 51 static HB_Fixed SkiaScalarToHarfbuzzFixed(SkScalar value)
 57 static HB_Bool StringToGlyphs(HB_Font hbFont, const HB_UChar16* characters, hb_uint32 length, HB_Glyph* glyphs, hb_uint32* glyphsSize, HB_Bool isRTL)
 79 static void GlyphsToAdvances(HB_Font hbFont, const HB_Glyph* glyphs, hb_uint32 numGlyphs, HB_Fixed* advances, int flags)
 105 static HB_Bool CanRender(HB_Font hbFont, const HB_UChar16* characters, hb_uint32 length)


Style:
197 HB_FontClass harfbuzzSkiaClass = {
 198   StringToGlyphs,
 199   GlyphsToAdvances,
 200   CanRender,
 201   GetOutlinePoint,
 202   GetGlyphMetrics,
 203   GetFontMetric,
 204 };

This would probably have been easier in smaller pieces?  This code is pretty ugly.  Mostly because it&apos;s C... and hard enough to stomach in small chunks.  Silly manual memory management.

I still don&apos;t really know what this all is.  But at some level it doesn&apos;t matter.  This is your port, and I don&apos;t need to be a gate keeper.  Please post a new patch with fixed style though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128909</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-29 16:03:57 -0700</bug_when>
    <thetext>I reviewed this with Adam in person.  Adam will land the reviewed version soon.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29298</attachid>
            <date>2009-04-06 18:12:57 -0700</date>
            <delta_ts>2009-06-16 12:16:15 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>18588</size>
            <attacher name="Adam Langley">agl</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YTA4NjhhOS4uZWE3NGU4NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzOSBAQAorMjAwOS0wNC0wNiAgQWRhbSBMYW5nbGV5
ICA8YWdsQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQ2hyb21pdW0gTGludXg6IEFkZCBjb21wbGV4IHRleHQgc3VwcG9ydC4KKwor
ICAgICAgICBUaGlzIHBhdGNoIGVuYWJsZXMgY29tcGxleCB0ZXh0IHN1cHBvcnQgdXNpbmcgdGhl
IEhhcmZidXp6IGxpYnJhcnkgYW5kCisgICAgICAgIFNraWEuCisKKyAgICAgICAgTGF5b3V0IHRl
c3QgY2hhbmdlcyB3aWxsIGJlIGluIHRoZSBDaHJvbWl1bSByZXBvLgorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlTGludXguY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMpOiBwYXJzZSBhcyBVVEYt
MTYgcmF0aGVyCisgICAgICAgICAgICB0aGFuIFVDUy0yCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhhcmZidXp6
SGVscGVyOjpIYXJmYnV6ekhlbHBlcik6CisgICAgICAgIChXZWJDb3JlOjpIYXJmYnV6ekhlbHBl
cjo6fkhhcmZidXp6SGVscGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhhcmZidXp6SGVscGVyOjpy
ZXNldCk6CisgICAgICAgIChXZWJDb3JlOjpIYXJmYnV6ekhlbHBlcjo6c2V0WE9mZnNldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpIYXJmYnV6ekhlbHBlcjo6cnRsKToKKyAgICAgICAgKFdlYkNvcmU6
OkhhcmZidXp6SGVscGVyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24pOgorICAgICAgICAoV2ViQ29y
ZTo6SGFyZmJ1enpIZWxwZXI6Om5leHRTY3JpcHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6SGFy
ZmJ1enpIZWxwZXI6OmdseXBocyk6CisgICAgICAgIChXZWJDb3JlOjpIYXJmYnV6ekhlbHBlcjo6
bGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkhhcmZidXp6SGVscGVyOjp4UG9zaXRpb25zKToK
KyAgICAgICAgKFdlYkNvcmU6OkhhcmZidXp6SGVscGVyOjphZHZhbmNlcyk6CisgICAgICAgIChX
ZWJDb3JlOjpIYXJmYnV6ekhlbHBlcjo6d2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6SGFyZmJ1
enpIZWxwZXI6OmxvZ0NsdXN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkhhcmZidXp6SGVscGVy
OjpudW1Db2RlUG9pbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkhhcmZidXp6SGVscGVyOjpOZXh0
UlRMU2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OkhhcmZidXp6SGVscGVyOjpOZXh0TFRS
U2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdDb21wbGV4VGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQpOgorCiAyMDA5
LTA0LTA2ICBTYW0gV2VpbmlnICA8c2FtQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgTWFyayBSb3dlLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9Gb250Q2FjaGVMaW51eC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0ZvbnRDYWNoZUxpbnV4LmNwcAppbmRleCA1MmUyYzVhLi5jZjA4YzU0IDEwMDY0NAotLS0g
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUxpbnV4LmNwcAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUxpbnV4LmNw
cApAQCAtNDYsNiArNDYsMTAgQEAKICNpbmNsdWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAi
U2tVdGlscy5oIgogCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJoYXJmYnV6ei11bmljb2RlLmgi
Cit9CisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdm9pZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5p
dCgpCkBAIC01Nyw4ICs2MSwxMyBAQCBjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpn
ZXRGb250RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKQog
ewogICAgIEZjQ2hhclNldCogY3NldCA9IEZjQ2hhclNldENyZWF0ZSgpOwotICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCi0gICAgICAgIEZjQ2hhclNldEFkZENoYXIoY3NldCwg
Y2hhcmFjdGVyc1tpXSk7CisgICAgc3NpemVfdCBpdGVyID0gMDsKKyAgICB3aGlsZSAoaXRlciA8
IGxlbmd0aCkgeworICAgICAgICB1aW50MzJfdCBjcCA9IHV0ZjE2X3RvX2NvZGVfcG9pbnQoY2hh
cmFjdGVycywgbGVuZ3RoLCAmaXRlcik7CisgICAgICAgIGlmIChjcCA9PSBIQl9JbnZhbGlkQ29k
ZVBvaW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIEZjQ2hhclNldEFkZENoYXIoY3Nl
dCwgY3ApOworICAgIH0KIAogICAgIEZjUGF0dGVybiogcGF0dGVybiA9IEZjUGF0dGVybkNyZWF0
ZSgpOwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0Zv
bnRMaW51eC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51
eC5jcHAKaW5kZXggMmI3YzU2Mi4uODhkMDk3NiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcApAQCAtNDQsNiArNDQsMTEgQEAKICNpbmNs
dWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAiU2tVdGlscy5oIgogCitleHRlcm4gIkMiIHsK
KyNpbmNsdWRlICJoYXJmYnV6ei1zaGFwZXIuaCIKKyNpbmNsdWRlICJoYXJmYnV6ei11bmljb2Rl
LmgiCit9CisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdm9pZCBGb250OjpkcmF3R2x5cGhzKEdy
YXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LApAQCAtMTA1LDMx
ICsxMTAsNDIzIEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdjLCBj
b25zdCBTaW1wbGVGb250RGF0YSogZm9udCwKICAgICB9CiB9CiAKLXZvaWQgRm9udDo6ZHJhd0Nv
bXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLAor
Ly8gSGFyZmJ1enpIZWxwZXIgd2Fsa3MgYSBUZXh0UnVuIGFuZCBwcmVzZW50cyBlYWNoIHNjcmlw
dCBydW4gaW4gc2VxdWVuY2UuIEEKKy8vIFRleHRSdW4gaXMgYSBzZXF1ZW5jZSBvZiBjb2RlLXBv
aW50cyB3aXRoIHRoZSBzYW1lIGVtYmVkZGluZyBsZXZlbCAoaS5lLiB0aGV5CisvLyBhcmUgYWxs
IGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkuIEEgc2NyaXB0IHJ1biBpcyBhIHN1YnNl
cXVlbmNlIHdoZXJlCisvLyBhbGwgdGhlIGNoYXJhY3RlcnMgaGF2ZSB0aGUgc2FtZSBzY3JpcHQg
KGUuZy4gQXJhYmljLCBUaGFpIGV0YykuIFNoYXBpbmcgaXMKKy8vIG9ubHkgZXZlciBkb25lIHdp
dGggc2NyaXB0IHJ1bnMgc2luY2UgdGhlIHNoYXBlcnMgb25seSBrbm93IGhvdyB0byBkZWFsIHdp
dGgKKy8vIGEgc2luZ2xlIHNjcmlwdC4KKy8vCisvLyBBZnRlciBjcmVhdGluZyBpdCwgdGhlIHNj
cmlwdCBydW5zIGFyZSBlaXRoZXIgaXRlcmF0ZWQgYmFja3dhcmRzIG9yIGZvcndhcmRzLgorLy8g
SXQgZGVmYXVsdHMgdG8gYmFja3dhcmRzIGZvciBSVEwgYW5kIGZvcndhcmRzIG90aGVyd2lzZSAo
d2hpY2ggbWF0Y2hlcyB0aGUKKy8vIHByZXNlbnRhdGlvbiBvcmRlciksIGhvd2V2ZXIgeW91IGNh
biBzZXQgaXQgd2l0aCB8c2V0QmFja3dhcmRzSXRlcmF0aW9ufC4KKy8vCisvLyBPbmNlIHlvdSBo
YXZlIHNldHVwIHRoZSBvYmplY3QsIGNhbGwgfG5leHRTY3JpcHRSdW58IHRvIGdldCB0aGUgZmly
c3Qgc2NyaXB0CisvLyBydW4uIFRoaXMgd2lsbCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaXRlcmF0
aW9uIGlzIGNvbXBsZXRlLiBBdCBhbnkgdGltZSB5b3UKKy8vIGNhbiBjYWxsIHxyZXNldHwgdG8g
c3RhcnQgb3ZlciBhZ2Fpbi4KK2NsYXNzIEhhcmZidXp6SGVscGVyIHsKK3B1YmxpYzoKKyAgICBI
YXJmYnV6ekhlbHBlcihjb25zdCBUZXh0UnVuJiBydW4sIFNrUGFpbnQqIHBhaW50LCB1bnNpZ25l
ZCBzdGFydGluZ1gpCisgICAgICAgIDogbV9ydW4ocnVuKQorICAgICAgICAsIG1fZ2x5cGhzXzE2
KG5ldyB1aW50MTZfdFtydW4ubGVuZ3RoKCkgKiAyXSkKKyAgICAgICAgLCBtX3hwb3MobmV3IFNr
U2NhbGFyW3J1bi5sZW5ndGgoKSAqIDJdKQorICAgICAgICAsIG1fcGFpbnQocGFpbnQpCisgICAg
ICAgICwgbV9zdGFydGluZ1goc3RhcnRpbmdYKQorICAgICAgICAsIG1fb2Zmc2V0WChtX3N0YXJ0
aW5nWCkKKyAgICAgICAgLCBtX2l0ZXJhdGVfYmFja3dhcmRzKHJ1bi5ydGwoKSkKKyAgICB7Cisg
ICAgICAgIG1lbXNldCgmbV9pdGVtLCAwLCBzaXplb2YobV9pdGVtKSk7CisgICAgICAgIG1faXRl
bS5nbHlwaHMgPSBuZXcgSEJfR2x5cGhbcnVuLmxlbmd0aCgpICogMl07CisgICAgICAgIG1faXRl
bS5hdHRyaWJ1dGVzID0gbmV3IEhCX0dseXBoQXR0cmlidXRlc1tydW4ubGVuZ3RoKCkgKiAyXTsK
KyAgICAgICAgbV9pdGVtLmFkdmFuY2VzID0gbmV3IEhCX0ZpeGVkW3J1bi5sZW5ndGgoKSAqIDJd
OworICAgICAgICBtX2l0ZW0ub2Zmc2V0cyA9IG5ldyBIQl9GaXhlZFBvaW50W3J1bi5sZW5ndGgo
KSAqIDJdOworICAgICAgICBtX2l0ZW0ubG9nX2NsdXN0ZXJzID0gbmV3IHVuc2lnbmVkIHNob3J0
W3J1bi5sZW5ndGgoKV07CisKKyAgICAgICAgcGFpbnQtPnNldHVwU2hhcGVyKCZtX2l0ZW0pOwor
ICAgICAgICBwYWludC0+c2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNv
ZGluZyk7CisKKyAgICAgICAgbV9pdGVtLnN0cmluZyA9IHJ1bi5jaGFyYWN0ZXJzKCk7CisgICAg
ICAgIG1faXRlbS5zdHJpbmdMZW5ndGggPSBydW4ubGVuZ3RoKCk7CisgICAgICAgIG1faXRlbS5p
dGVtLmJpZGlMZXZlbCA9IHJ1bi5ydGwoKTsKKworICAgICAgICByZXNldCgpOworICAgIH0KKwor
ICAgIH5IYXJmYnV6ekhlbHBlcigpCisgICAgeworICAgICAgICBkZWxldGVbXSBtX2l0ZW0uZ2x5
cGhzOworICAgICAgICBkZWxldGVbXSBtX2l0ZW0uYXR0cmlidXRlczsKKyAgICAgICAgZGVsZXRl
W10gbV9pdGVtLmFkdmFuY2VzOworICAgICAgICBkZWxldGVbXSBtX2l0ZW0ub2Zmc2V0czsKKyAg
ICAgICAgZGVsZXRlW10gbV9pdGVtLmxvZ19jbHVzdGVyczsKKyAgICAgICAgZGVsZXRlW10gbV9n
bHlwaHNfMTY7CisgICAgICAgIGRlbGV0ZVtdIG1feHBvczsKKyAgICB9CisKKyAgICB2b2lkIHJl
c2V0KCkKKyAgICB7CisgICAgICAgIGlmIChtX2l0ZXJhdGVfYmFja3dhcmRzKQorICAgICAgICAg
ICAgbV9pdGVyID0gbV9ydW4ubGVuZ3RoKCkgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBtX2l0ZXIgPSAwOworICAgICAgICBtX29mZnNldFggPSBtX3N0YXJ0aW5nWDsKKyAgICB9CisK
KyAgICAvLyBTZXQgdGhlIHggb2Zmc2V0IGZvciB0aGUgbmV4dCBzY3JpcHQgcnVuLiBUaGlzIGFm
ZmVjdHMgdGhlIHZhbHVlcyBpbgorICAgIC8vIHx4UG9zaXRpb25zfAorICAgIHZvaWQgc2V0WE9m
ZnNldChpbnQgeCkKKyAgICB7CisgICAgICAgIG1fb2Zmc2V0WCA9IHg7CisgICAgfQorCisgICAg
Ym9vbCBydGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcnVuLnJ0bCgpOworICAgIH0KKwor
ICAgIHZvaWQgc2V0QmFja3dhcmRzSXRlcmF0aW9uKGJvb2wgaXNfYmFja3dhcmRzKQorICAgIHsK
KyAgICAgICAgbV9pdGVyYXRlX2JhY2t3YXJkcyA9IGlzX2JhY2t3YXJkczsKKyAgICAgICAgcmVz
ZXQoKTsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHNjcmlwdCBydW4sIHJl
dHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2YgdGhlCisgICAgLy8gVGV4dFJ1biBoYXMgYmVl
biByZWFjaGVkLgorICAgIGJvb2wgbmV4dFNjcmlwdFJ1bigpCisgICAgeworICAgICAgICBpZiAo
bV9pdGVyYXRlX2JhY2t3YXJkcykgeworICAgICAgICAgICAgLy8gSW4gcmlnaHQtdG8tbGVmdCBt
b2RlIHdlIG5lZWQgdG8gcmVuZGVyIHRoZSBzaGFwZWQgZ2x5cGggYmFja3dhcmRzIGFuZAorICAg
ICAgICAgICAgLy8gYWxzbyByZW5kZXIgdGhlIHNjcmlwdCBydW5zIHRoZW1zZWx2ZXMgYmFja3dh
cmRzLiBTbyBnaXZlbiBhIFRleHRSdW46CisgICAgICAgICAgICAvLyAgICBBQUFBQUFBQ1RUVFRU
VFQgICAoQSA9IEFyYWJpYywgQyA9IENvbW1vbiwgVCA9IFRoYWkpCisgICAgICAgICAgICAvLyB3
ZSByZW5kZXI6CisgICAgICAgICAgICAvLyAgICBUVFRUVFRDQUFBQUFBQQorICAgICAgICAgICAg
Ly8gKGFuZCB0aGUgZ2x5cGhzIGluIGVhY2ggQSwgQyBhbmQgVCBzZWN0aW9uIGFyZSBiYWNrd2Fy
ZHMgdG9vKQorICAgICAgICAgICAgaWYgKCFoYl91dGYxNl9zY3JpcHRfcnVuX3ByZXYoJm1fbnVt
Q29kZVBvaW50cywgJm1faXRlbS5pdGVtLCBtX3J1bi5jaGFyYWN0ZXJzKCksIG1fcnVuLmxlbmd0
aCgpLCAmbV9pdGVyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCgmbV9udW1D
b2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3Ro
KCksICZtX2l0ZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChydGwoKSkKKyAgICAgICAgICAgIHJldHVybiBOZXh0UlRMU2NyaXB0UnVu
KCk7CisgICAgICAgIHJldHVybiBOZXh0TFRSU2NyaXB0UnVuKCk7CisgICAgfQorCisgICAgY29u
c3QgdWludDE2X3QqIGdseXBocygpCisgICAgeworICAgICAgICByZXR1cm4gbV9nbHlwaHNfMTY7
CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHJldHVybmVk
IGJ5IHxnbHlwaHN8CisgICAgY29uc3QgdW5zaWduZWQgbGVuZ3RoKCkKKyAgICB7CisgICAgICAg
IHJldHVybiBtX2l0ZW0ubnVtX2dseXBoczsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIHgg
b2Zmc2V0IGZvciBlYWNoIG9mIHRoZSBnbHlwaHMuIE5vdGUgdGhhdCB0aGlzIGlzIHRyYW5zbGF0
ZWQKKyAgICAvLyBieSB0aGUgY3VycmVudCB4IG9mZnNldCBhbmQgdGhhdCB0aGUgeCBvZmZzZXQg
aXMgdXBkYXRlZCBmb3IgZWFjaCBzY3JpcHQKKyAgICAvLyBydW4uCisgICAgY29uc3QgU2tTY2Fs
YXIqIHhQb3NpdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1feHBvczsKKyAgICB9CisK
KyAgICAvLyBHZXQgdGhlIGFkdmFuY2VzICh3aWR0aHMpIGZvciBlYWNoIGdseXBoLgorICAgIGNv
bnN0IEhCX0ZpeGVkKiBhZHZhbmNlcygpCisgICAgeworICAgICAgICByZXR1cm4gbV9pdGVtLmFk
dmFuY2VzOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgd2lkdGggKGluIHB4KSBvZiB0aGUg
Y3VycmVudCBzY3JpcHQgcnVuLgorICAgIGNvbnN0IHVuc2lnbmVkIHdpZHRoKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX3dpZHRoOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgY2x1c3Rl
ciBsb2cgZm9yIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uIEZvciBleGFtcGxlOgorICAgIC8vICAg
c2NyaXB0IHJ1bjogZiBpIGEgbiBjIMOpICAoZmkgZ2V0cyBsaWdhdHVyZWQpCisgICAgLy8gICBs
b2cgY2x1dHJzOiAwIDAgMSAyIDMgNAorICAgIC8vIFNvLCBmb3IgZWFjaCBpbnB1dCBjb2RlIHBv
aW50LCB0aGUgbG9nIHRlbGxzIHlvdSB3aGljaCBvdXRwdXQgZ2x5cGggd2FzCisgICAgLy8gZ2Vu
ZXJhdGVkIGZvciBpdC4KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogbG9nQ2x1c3RlcnMoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG1faXRlbS5sb2dfY2x1c3RlcnM7CisgICAgfQorCisgICAg
Ly8gcmV0dXJuIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gdGhlIGN1cnJlbnQgc2NyaXB0
IHJ1bgorICAgIGNvbnN0IHVuc2lnbmVkIG51bUNvZGVQb2ludHMoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1fbnVtQ29kZVBvaW50czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBOZXh0
UlRMU2NyaXB0UnVuKCkKKyAgICB7CisgICAgICAgIG1faXRlbS5udW1fZ2x5cGhzID0gbV9ydW4u
bGVuZ3RoKCkgKiAyOworICAgICAgICBIQl9TaGFwZUl0ZW0oJm1faXRlbSk7CisKKyAgICAgICAg
SEJfRml4ZWQgYWR2X3N1bSA9IDA7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBt
X2l0ZW0ubnVtX2dseXBoczsgKytpKSB7CisgICAgICAgICAgICBtX2dseXBoc18xNltpXSA9IG1f
aXRlbS5nbHlwaHNbaV07CisgICAgICAgICAgICBhZHZfc3VtICs9IG1faXRlbS5hZHZhbmNlc1tp
XSA+PiA2OworICAgICAgICB9CisgICAgICAgIG1fd2lkdGggPSBhZHZfc3VtOworICAgICAgICBh
ZHZfc3VtICs9IG1fb2Zmc2V0WDsKKyAgICAgICAgbV9vZmZzZXRYICs9IG1fd2lkdGg7CisKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1faXRlbS5udW1fZ2x5cGhzOyArK2kpIHsK
KyAgICAgICAgICAgIGFkdl9zdW0gLT0gbV9pdGVtLmFkdmFuY2VzW2ldID4+IDY7CisgICAgICAg
ICAgICBtX3hwb3NbaV0gPSBhZHZfc3VtOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgYm9vbCBOZXh0TFRSU2NyaXB0UnVuKCkKKyAgICB7CisgICAgICAg
IG1faXRlbS5udW1fZ2x5cGhzID0gbV9ydW4ubGVuZ3RoKCkgKiAyOworICAgICAgICBIQl9TaGFw
ZUl0ZW0oJm1faXRlbSk7CisKKyAgICAgICAgbV93aWR0aCA9IDA7CisgICAgICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBtX2l0ZW0ubnVtX2dseXBoczsgKytpKSB7CisgICAgICAgICAgICBt
X2dseXBoc18xNltpXSA9IG1faXRlbS5nbHlwaHNbaV07CisgICAgICAgICAgICBtX3hwb3NbaV0g
PSBtX29mZnNldFg7CisgICAgICAgICAgICBtX29mZnNldFggKz0gbV9pdGVtLmFkdmFuY2VzW2ld
ID4+IDY7CisgICAgICAgICAgICBtX3dpZHRoICs9IG1faXRlbS5hZHZhbmNlc1tpXSA+PiA2Owor
ICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgVGV4
dFJ1biYgbV9ydW47CisgICAgSEJfU2hhcGVySXRlbSBtX2l0ZW07CisgICAgdWludDE2X3QqIGNv
bnN0IG1fZ2x5cGhzXzE2OyAgLy8gYSB2ZWN0b3Igb2YgMTYtYml0IGdseXBoIGlkcworICAgIFNr
U2NhbGFyKiBjb25zdCBtX3hwb3M7ICAvLyBhIHZlY3RvciBvZiB4IHBvc2l0aW9ucyBmb3IgZWFj
aCBnbHlwaAorICAgIFNrUGFpbnQqIGNvbnN0IG1fcGFpbnQ7CisgICAgc3NpemVfdCBtX2l0ZXI7
ICAvLyBpbmRleGVzIHRoZSBuZXh0IHdvcmQgaW4gfG1fcnVufAorICAgIGNvbnN0IHVuc2lnbmVk
IG1fc3RhcnRpbmdYOworICAgIHVuc2lnbmVkIG1fb2Zmc2V0WDsKKyAgICB1bnNpZ25lZCBtX3dp
ZHRoOyAgLy8gd2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBzY3JpcHQgcnVuCisgICAgdW5z
aWduZWQgbV9udW1Db2RlUG9pbnRzOyAgLy8gY29kZSBwb2ludHMgaW4gY3VycmVudCBzY3JpcHQg
cnVuCisgICAgYm9vbCBtX2l0ZXJhdGVfYmFja3dhcmRzOworfTsKKwordm9pZCBGb250OjpkcmF3
Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgVGV4dFJ1biYgcnVuLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9t
LCBpbnQgdG8pIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBpZiAocnVuLmxl
bmd0aCgpID09IDApCisgICAgICByZXR1cm47CisKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRh
JiBmb250ID0gZm9udERhdGFGb3JDaGFyYWN0ZXJzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5n
dGgoKSktPmZvbnREYXRhRm9yQ2hhcmFjdGVyKCcgJyktPnBsYXRmb3JtRGF0YSgpOworCisgICAg
U2tDYW52YXMqIGNhbnZhcyA9IGdjLT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCk7CisgICAg
Y29uc3QgaW50IHRleHRNb2RlID0gZ2MtPnBsYXRmb3JtQ29udGV4dCgpLT5nZXRUZXh0RHJhd2lu
Z01vZGUoKTsKKyAgICBjb25zdCBib29sIGZpbGwgPSB0ZXh0TW9kZSAmIGNUZXh0RmlsbDsKKyAg
ICBjb25zdCBib29sIHN0cm9rZSA9ICh0ZXh0TW9kZSAmIGNUZXh0U3Ryb2tlKQorICAgICAgICAg
ICAgICAgICAgICAgICAgJiYgZ2MtPnBsYXRmb3JtQ29udGV4dCgpLT5nZXRTdHJva2VTdHlsZSgp
ICE9IE5vU3Ryb2tlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBnYy0+cGxhdGZvcm1Db250
ZXh0KCktPmdldFN0cm9rZVRoaWNrbmVzcygpID4gMDsKKworICAgIGlmICghZmlsbCAmJiAhc3Ry
b2tlKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHN0cm9rZV9wYWludCwgZmlsbF9w
YWludDsKKyAgICBpZiAoZmlsbCkgeworICAgICAgICBnYy0+cGxhdGZvcm1Db250ZXh0KCktPnNl
dHVwUGFpbnRGb3JGaWxsaW5nKCZmaWxsX3BhaW50KTsKKyAgICAgICAgZm9udC5zZXR1cFBhaW50
KCZmaWxsX3BhaW50KTsKKyAgICAgICAgZmlsbF9wYWludC5zZXRUZXh0RW5jb2RpbmcoU2tQYWlu
dDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKKyAgICAgICAgZmlsbF9wYWludC5zZXRDb2xvcihn
Yy0+ZmlsbENvbG9yKCkucmdiKCkpOworICAgIH0KKyAgICBpZiAoc3Ryb2tlKSB7CisgICAgICAg
IGdjLT5wbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvclN0cm9raW5nKCZzdHJva2VfcGFp
bnQsIDAsIDApOworICAgICAgICBmb250LnNldHVwUGFpbnQoJmZpbGxfcGFpbnQpOworICAgICAg
ICBzdHJva2VfcGFpbnQuc2V0RmxhZ3MoU2tQYWludDo6a0FudGlBbGlhc19GbGFnKTsKKyAgICAg
ICAgc3Ryb2tlX3BhaW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5j
b2RpbmcpOworICAgICAgICBzdHJva2VfcGFpbnQuc2V0Q29sb3IoZ2MtPnN0cm9rZUNvbG9yKCku
cmdiKCkpOworICAgIH0KKworICAgIEhhcmZidXp6SGVscGVyIGhhcmZidXp6KHJ1biwgc3Ryb2tl
ID8gJnN0cm9rZV9wYWludCA6ICZmaWxsX3BhaW50LCBwb2ludC54KCkpOworCisgICAgd2hpbGUg
KGhhcmZidXp6Lm5leHRTY3JpcHRSdW4oKSkgeworICAgICAgICBpZiAoZmlsbCkKKyAgICAgICAg
ICAgIGNhbnZhcy0+ZHJhd1Bvc1RleHRIKGhhcmZidXp6LmdseXBocygpLCBoYXJmYnV6ei5sZW5n
dGgoKSA8PCAxLCBoYXJmYnV6ei54UG9zaXRpb25zKCksIHBvaW50LnkoKSwgZmlsbF9wYWludCk7
CisgICAgICAgIGlmIChzdHJva2UpCisgICAgICAgICAgICBjYW52YXMtPmRyYXdQb3NUZXh0SCho
YXJmYnV6ei5nbHlwaHMoKSwgaGFyZmJ1enoubGVuZ3RoKCkgPDwgMSwgaGFyZmJ1enoueFBvc2l0
aW9ucygpLCBwb2ludC55KCksIHN0cm9rZV9wYWludCk7CisgICAgfQogfQogCiBmbG9hdCBGb250
OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAogewot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgU2tQYWludCBwYWludDsK
KyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBmb250ID0gZm9udERhdGFGb3JDaGFyYWN0ZXJz
KHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSktPmZvbnREYXRhRm9yQ2hhcmFjdGVyKCcg
JyktPnBsYXRmb3JtRGF0YSgpOworICAgIGZvbnQuc2V0dXBQYWludCgmcGFpbnQpOworCisgICAg
SGFyZmJ1enpIZWxwZXIgaGFyZmJ1enoocnVuLCAmcGFpbnQsIDApOworCisgICAgZmxvYXQgd2lk
dGggPSAwOworICAgIHdoaWxlIChoYXJmYnV6ei5uZXh0U2NyaXB0UnVuKCkpCisgICAgICAgIHdp
ZHRoICs9IGhhcmZidXp6LndpZHRoKCk7CisKKyAgICByZXR1cm4gd2lkdGg7CiB9CiAKKy8vIFJl
dHVybiB0aGUgY29kZSBwb2ludCBpbmRleCBmb3IgdGhlIGdpdmVuIHx4fCBvZmZzZXQgaW50byB0
aGUgdGV4dCBydW4uCiBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChj
b25zdCBUZXh0UnVuJiBydW4sIGludCB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKIHsKLSAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIC8vIChNYWMgY29kZSBpZ25vcmVzIGluY2x1ZGVQYXJ0aWFsR2x5
cGhzLCBhbmQgdGhleSBkb24ndCBrbm93IHdoYXQgaXQncworICAgIC8vIHN1cHBvc2VkIHRvIGRv
LCBzbyB3ZSBqdXN0IGlnbm9yZSBpdCBhcyB3ZWxsLikKKyAgICBTa1BhaW50IHBhaW50OworICAg
IGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIGZvbnQgPSBmb250RGF0YUZvckNoYXJhY3RlcnMocnVu
LmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAnKS0+
cGxhdGZvcm1EYXRhKCk7CisgICAgZm9udC5zZXR1cFBhaW50KCZwYWludCk7CisKKyAgICBIYXJm
YnV6ekhlbHBlciBoYXJmYnV6eihydW4sICZwYWludCwgMCk7CisKKyAgICAvLyBJZiB0aGlzIGlz
IFJUTCB0ZXh0LCB0aGUgZmlyc3QgZ2x5cGggZnJvbSB0aGUgbGVmdCBpcyBhY3R1YWxseSB0aGUg
bGFzdAorICAgIC8vIGNvZGUgcG9pbnQuIFNvIHdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBjb2Rl
IHBvaW50cyB0aGVyZSBhcmUgdG90YWwgaW4KKyAgICAvLyBvcmRlciB0byBzdWJ0cmFjdC4gVGhp
cyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBUZXh0UnVuCisgICAgLy8gYmVj
YXVzZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzIGFyZSBhIHNpbmdsZSBjb2RlIHBvaW50LCBidXQg
MzItYml0cyBsb25nLgorICAgIC8vIEluIExUUiB3ZSBsZWF2ZSB0aGlzIGFzIDAgc28gdGhhdCB3
ZSBnZXQgdGhlIGNvcnJlY3QgdmFsdWUgZm9yCisgICAgLy8gfGJhc2VfcG9zaXRpb258LCBiZWxv
dy4KKyAgICB1bnNpZ25lZCB0b3RhbF9jb2RlX3BvaW50cyA9IDA7CisgICAgaWYgKGhhcmZidXp6
LnJ0bCgpKSB7CisgICAgICAgIHNzaXplX3QgaXRlciA9IDA7CisgICAgICAgIHdoaWxlIChpdGVy
IDwgcnVuLmxlbmd0aCgpKSB7CisgICAgICAgICAgICB1dGYxNl90b19jb2RlX3BvaW50KHJ1bi5j
aGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSwgJml0ZXIpOworICAgICAgICAgICAgdG90YWxfY29k
ZV9wb2ludHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIGJhc2VfcG9zaXRp
b24gPSB0b3RhbF9jb2RlX3BvaW50czsKKworICAgIC8vIEZvciBSVEw6CisgICAgLy8gICBjb2Rl
LXBvaW50IG9yZGVyOiAgYWJjZCBlZmcgaGlqa2wKKyAgICAvLyAgIG9uIHNjcmVlbjogICAgICAg
ICBsa2ppaCBnZmUgZGNiYQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBe
ICAgXgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICAgIC8v
ICAgICAgICAgICAgICAgICAgYmFzZV9wb3NpdGlvbi18ICAgfAorICAgIC8vICAgICAgICAgICAg
ICAgICB0b3RhbF9jb2RlX3BvaW50cy0tfAorICAgIC8vIFNpbmNlIGJhc2VfcG9zaXRpb24gaXMg
Y3VycmVudGx5IHRoZSB0b3RhbCBudW1iZXIgb2YgY29kZS1wb2ludHMsIHRoZQorICAgIC8vIGZp
cnN0IHRoaW5nIHdlIGRvIGlzIGRlY3JlbWVudCBpdCBzbyB0aGF0IGl0J3MgcG9pbnRpbmcgdG8g
dGhlIHN0YXJ0IG9mCisgICAgLy8gdGhlIGN1cnJlbnQgc2NyaXB0LXJ1bi4KKyAgICAvLworICAg
IC8vIEZvciBMVFIsIGJhc2VfcG9zaXRpb24gaXMgemVybyBzbyBpdCBhbHJlYWR5IHBvaW50cyB0
byB0aGUgc3RhcnQgb2YgdGhlCisgICAgLy8gZmlyc3Qgc2NyaXB0IHJ1bi4KKyAgICB3aGlsZSAo
aGFyZmJ1enoubmV4dFNjcmlwdFJ1bigpKSB7CisgICAgICAgIGlmIChoYXJmYnV6ei5ydGwoKSkK
KyAgICAgICAgICAgIGJhc2VfcG9zaXRpb24gLT0gaGFyZmJ1enoubnVtQ29kZVBvaW50cygpOwor
CisgICAgICAgIGlmICh4IDwgaGFyZmJ1enoud2lkdGgoKSkgeworICAgICAgICAgICAgLy8gVGhl
IHggdmFsdWUgaW4gcXVlc3Rpb24gaXMgd2l0aGluIHRoaXMgc2NyaXB0IHJ1bi4gV2UgY29uc2lk
ZXIKKyAgICAgICAgICAgIC8vIGVhY2ggZ2x5cGggaW4gcHJlc2VudGF0aW9uIG9yZGVyIGFuZCBz
dG9wIHdoZW4gd2UgZmluZCB0aGUgb25lCisgICAgICAgICAgICAvLyBjb3ZlcmluZyB0aGlzIHBv
c2l0aW9uLgorICAgICAgICAgICAgY29uc3QgSEJfRml4ZWQqIGFkdmFuY2VzID0gaGFyZmJ1enou
YWR2YW5jZXMoKTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaWYgKGhhcmZidXp6
LnJ0bCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gaGFyZmJ1enoubGVuZ3RoKCkgLSAx
OyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IGFkdmFuY2VzW2ld
ID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgeCAtPSBhZHZhbmNlc1tpXSA+PiA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhcmZidXp6Lmxlbmd0
aCgpOyAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCBhZHZhbmNlc1tpXSA+PiA2
KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHgg
LT0gYWR2YW5jZXNbaV0gPj4gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBnbHlwaCBpbmRleCwgd2UgaGF2ZSB0
byB0dXJuIHRoYXQgaW50byBhCisgICAgICAgICAgICAvLyBjb2RlLXBvaW50IGluZGV4LiBCZWNh
dXNlIG9mIGxpZ2F0dXJlcywgc2V2ZXJhbCBjb2RlLXBvaW50cyBtYXkKKyAgICAgICAgICAgIC8v
IGhhdmUgZ29uZSBpbnRvIGEgc2luZ2xlIGdseXBoLiBXZSBpdGVyYXRlIG92ZXIgdGhlIGNsdXN0
ZXJzIGxvZworICAgICAgICAgICAgLy8gYW5kIGZpbmQgdGhlIGZpcnN0IGNvZGUtcG9pbnQgd2hp
Y2ggY29udHJpYnV0ZWQgdG8gdGhlIGdseXBoLgorICAgICAgICAgICAgY29uc3QgdW5zaWduZWQg
c2hvcnQqIGxvZyA9IGhhcmZidXp6LmxvZ0NsdXN0ZXJzKCk7CisgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGogPSAwOyBqIDwgaGFyZmJ1enoubnVtQ29kZVBvaW50cygpOyArK2opIHsKKyAgICAg
ICAgICAgICAgICBpZiAobG9nW2pdID09IGkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBi
YXNlX3Bvc2l0aW9uICsgajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQVNTRVJUKGZh
bHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHggLT0gaGFyZmJ1enoud2lkdGgoKTsKKworICAg
ICAgICBpZiAoIWhhcmZidXp6LnJ0bCgpKQorICAgICAgICAgICAgYmFzZV9wb3NpdGlvbiArPSBo
YXJmYnV6ei5udW1Db2RlUG9pbnRzKCk7CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKKy8v
IFJldHVybiB0aGUgcmVjdGFuZ2xlIGZvciBzZWxlY3RpbmcgdGhlIGdpdmVuIHJhbmdlIG9mIGNv
ZGUtcG9pbnRzIGluIHRoZQorLy8gVGV4dFJ1bi4KIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25S
ZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50
IHRvKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIEZsb2F0UmVj
dCgpOworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgZm9u
dCA9IGZvbnREYXRhRm9yQ2hhcmFjdGVycyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkp
LT5mb250RGF0YUZvckNoYXJhY3RlcignICcpLT5wbGF0Zm9ybURhdGEoKTsKKyAgICBmb250LnNl
dHVwUGFpbnQoJnBhaW50KTsKKworICAgIGludCBmcm9tX3ggPSAtMSwgdG9feCA9IC0xOworCisg
ICAgLy8gRm9yIFJUTCB3ZSdsbCBuZWVkIHRvIGtub3cgdGhlIHdpZHRoIG9mIHRoZSBmdWxsIFRl
eHRSdW4uCisgICAgSGFyZmJ1enpIZWxwZXIgaGFyZmJ1enoocnVuLCAmcGFpbnQsIDApOworICAg
IGZsb2F0IHdpZHRoID0gMDsKKyAgICBpZiAoaGFyZmJ1enoucnRsKCkpIHsKKyAgICAgICAgd2hp
bGUgKGhhcmZidXp6Lm5leHRTY3JpcHRSdW4oKSkKKyAgICAgICAgICAgIHdpZHRoICs9IGhhcmZi
dXp6LndpZHRoKCk7CisgICAgfQorCisgICAgLy8gV2Ugd2FudCB0byBlbnVtZXJhdGUgdGhlIHNj
cmlwdCBydW5zIGluIGNvZGUgcG9pbnQgb3JkZXIgaW4gdGhlIGZvbGxvd2luZworICAgIC8vIGNv
ZGUuIFRoaXMgY2FsbCBhbHNvIHJlc2V0cyB8aGFyZmJ1enp8LgorICAgIGhhcmZidXp6LnNldEJh
Y2t3YXJkc0l0ZXJhdGlvbihmYWxzZSk7CisgICAgLy8gSGFyZmJ1enpIZWxwZXIgd2lsbCBoZWxw
ZnVsbHkgYWNjdWx1bGF0ZSB0aGUgeCBvZmZzZXRzIGZvciBkaWZmZXJlbnQKKyAgICAvLyBzY3Jp
cHQgcnVucyBmb3IgdXMuIEZvciB0aGlzIGNvZGUsIGhvd2V2ZXIsIHdlIGFsd2F5cyB3YW50IHRo
ZSB4IG9mZnNldHMKKyAgICAvLyB0byBzdGFydCBmcm9tIHplcm8gc28gd2UgY2FsbCB0aGlzIGJl
Zm9yZSBlYWNoIHNjcmlwdCBydW4uCisgICAgaGFyZmJ1enouc2V0WE9mZnNldCgwKTsKKworICAg
IC8vIEJhc2Ugd2lsbCBwb2ludCB0byB0aGUgeCBvZmZzZXQgZm9yIHRoZSBjdXJyZW50IHNjcmlw
dCBydW4uIE5vdGUgdGhhdCwgaW4KKyAgICAvLyB0aGUgTFRSIGNhc2UsIHdpZHRoIHdpbGwgYmUg
MC4KKyAgICBpbnQgYmFzZSA9IHdpZHRoOworCisgICAgd2hpbGUgKGhhcmZidXp6Lm5leHRTY3Jp
cHRSdW4oKSAmJiAoZnJvbV94ID09IC0xIHx8IHRvX3ggPT0gLTEpKSB7CisgICAgICAgIGlmICho
YXJmYnV6ei5ydGwoKSkKKyAgICAgICAgICAgIGJhc2UgLT0gaGFyZmJ1enoud2lkdGgoKTsKKwor
ICAgICAgICBpZiAoZnJvbV94ID09IC0xICYmIGZyb20gPCBoYXJmYnV6ei5udW1Db2RlUG9pbnRz
KCkpIHsKKyAgICAgICAgICAgIC8vIHxmcm9tfCBpcyB3aXRoaW4gdGhpcyBzY3JpcHQgcnVuLiBT
byB3ZSBpbmRleCB0aGUgY2x1c3RlcnMgbG9nIHRvCisgICAgICAgICAgICAvLyBmaW5kIHdoaWNo
IGdseXBoIHRoaXMgY29kZS1wb2ludCBjb250cmlidXRlZCB0byBhbmQgZmluZCBpdCdzIHgKKyAg
ICAgICAgICAgIC8vIHBvc2l0aW9uLgorICAgICAgICAgICAgaW50IGdseXBoID0gaGFyZmJ1enou
bG9nQ2x1c3RlcnMoKVtmcm9tXTsKKyAgICAgICAgICAgIGZyb21feCA9IGJhc2UgKyBoYXJmYnV6
ei54UG9zaXRpb25zKClbZ2x5cGhdOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGZyb20g
LT0gaGFyZmJ1enoubnVtQ29kZVBvaW50cygpOworCisgICAgICAgIGlmICh0b194ID09IC0xICYm
IHRvIDwgaGFyZmJ1enoubnVtQ29kZVBvaW50cygpKSB7CisgICAgICAgICAgICBpbnQgZ2x5cGgg
PSBoYXJmYnV6ei5sb2dDbHVzdGVycygpW3RvXTsKKyAgICAgICAgICAgIHRvX3ggPSBiYXNlICsg
aGFyZmJ1enoueFBvc2l0aW9ucygpW2dseXBoXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICB0byAtPSBoYXJmYnV6ei5udW1Db2RlUG9pbnRzKCk7CisKKyAgICAgICAgaWYgKCFoYXJmYnV6
ei5ydGwoKSkKKyAgICAgICAgICAgIGJhc2UgKz0gaGFyZmJ1enoud2lkdGgoKTsKKyAgICAgICAg
aGFyZmJ1enouc2V0WE9mZnNldCgwKTsKKyAgICB9CisKKyAgICAvLyB0aGUgcG9zaXRpb24gaW4g
cXVlc3Rpb24gbWlnaHQgYmUganVzdCBhZnRlciB0aGUgdGV4dAorICAgIGNvbnN0IGludCByaWdo
dF9lZGdlID0gaGFyZmJ1enoucnRsKCkgPyB3aWR0aCA6IGJhc2U7CisgICAgaWYgKGZyb21feCA9
PSAtMSAmJiAhZnJvbSkKKyAgICAgICAgZnJvbV94ID0gcmlnaHRfZWRnZTsKKyAgICBpZiAodG9f
eCA9PSAtMSAmJiAhdG8pCisgICAgICAgIHRvX3ggPSByaWdodF9lZGdlOworCisgICAgQVNTRVJU
KGZyb21feCAhPSAtMSAmJiB0b194ICE9IC0xKTsKKworICAgIGlmIChmcm9tX3ggPCB0b194KQor
ICAgICAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZyb21feCwgcG9pbnQueSgpLCB0
b194IC0gZnJvbV94LCBoKTsKKworICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgdG9f
eCwgcG9pbnQueSgpLCBmcm9tX3ggLSB0b194LCBoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIFdl
YkNvcmUK
</data>
<flag name="review"
          id="14554"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31363</attachid>
            <date>2009-06-16 12:16:15 -0700</date>
            <delta_ts>2009-06-17 14:11:48 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>29194</size>
            <attacher name="Adam Langley">agl</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OTU1YjhlMy4uZGQ4MjA4MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1MyBAQAorMjAwOS0wNi0xNiAgQWRhbSBMYW5nbGV5
ICA8YWdsQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQ2hyb21pdW06IEFkZCBjb21wbGV4IHRleHQgc3VwcG9ydCBvbiBMaW51eC4K
KworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgY29tcGxleCB0ZXh0IHN1cHBvcnQgb24gTGludXgg
dXNpbmcgSGFyZmJ1enouIEl0J3Mgbm90CisgICAgICAgIHRoZSBmYXN0ZXN0IGNvZGUgcG9zc2li
bGU6IHNvbWUgY2FjaGluZyBvZiBmb250IHRhYmxlcyB3aWxsIGNlcnRhaW5seQorICAgICAgICBi
ZSByZXF1aXJlZC4gSG93ZXZlciwgaXQncyBwcm9iYWJseSB0aGUgc2ltcGxlc3QgY29kZSB0aGF0
IHdvcmtzLgorCisgICAgICAgIE5vdGUgdGhhdCBzdXBwb3J0IGZvciBtYW55IHNjcmlwdHMgaXMg
Y3VycmVudGx5IGhhbXBlcmVkIGJ5IHRoZSBsYWNrCisgICAgICAgIG9mIGdvb2QgZm9udCBmYWxs
YmFjayBpbiB0aGUgY2FzZSBvZiB1bnN1cHBvcnRlZCBjb2RlIHBvaW50cy4gVGhpcworICAgICAg
ICBpc3N1ZSB3aWxsIGJlIGFkZHJlc3NlZCBpbiBhIGZ1dHVyZSBwYXRjaC4KKworICAgICAgICBU
aGlzIHdpbGwgcmVxdWlyZSBjaGVja2luZyBpbiBuZXcgYmFzZWxpbmVzIGluIHRoZSBDaHJvbWl1
bSB0cmVlIGZvcgorICAgICAgICB0aG9zZSBsYXlvdXQgdGVzdHMgd2hpY2ggbm93IHBhc3MuCisK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChX
ZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjp+VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0UnVuV2Fsa2VyOjpyZXNldCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2Vy
OjpzZXRYT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnJ0bCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6bmV4dFNjcmlwdFJ1bik6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpnbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFJ1bldhbGtlcjo6bGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnhQ
b3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6YWR2YW5jZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6d2lkdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dFJ1bldhbGtlcjo6bG9nQ2x1c3RlcnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1
bldhbGtlcjo6bnVtQ29kZVBvaW50cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2Vy
OjpleHBhbmRHbHlwaEFycmF5cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpO
ZXh0UlRMU2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6Ok5leHRM
VFJTY3JpcHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0NvbXBsZXhUZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFyZmJ1enpTa2lhLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKToKKyAgICAgICAg
KFdlYkNvcmU6OlN0cmluZ1RvR2x5cGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoc1RvQWR2
YW5jZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q2FuUmVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdldE91dGxpbmVQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpHZXRHbHlwaE1ldHJpY3MpOgor
ICAgICAgICAoV2ViQ29yZTo6R2V0Rm9udE1ldHJpYyk6CisgICAgICAgIChXZWJDb3JlOjopOgor
ICAgICAgICAoV2ViQ29yZTo6aGFyZmJ1enpTa2lhR2V0VGFibGUpOgorCiAyMDA5LTA2LTE2ICBQ
aWVycmUgZCdIZXJiZW1vbnQgIDxwZGhlcmJlbW9udEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgSm9obiBTdWxsaXZhbgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9Gb250TGludXguY3BwCmluZGV4IGE5NTI2ODUuLjhhMjEwZWEgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHAKQEAgLTQ0LDYg
KzQ0LDExIEBACiAjaW5jbHVkZSAiU2tUeXBlZmFjZS5oIgogI2luY2x1ZGUgIlNrVXRpbHMuaCIK
IAorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiaGFyZmJ1enotc2hhcGVyLmgiCisjaW5jbHVkZSAi
aGFyZmJ1enotdW5pY29kZS5oIgorfQorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGJvb2wgRm9u
dDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCkKQEAgLTExMCwzMSArMTE1
LDQ4OCBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3Qg
U2ltcGxlRm9udERhdGEqIGZvbnQsCiAgICAgfQogfQogCi12b2lkIEZvbnQ6OmRyYXdDb21wbGV4
VGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwKK2V4dGVy
biBjb25zdCBIQl9Gb250Q2xhc3MgaGFyZmJ1enpTa2lhQ2xhc3M7CitleHRlcm4gSEJfRXJyb3Ig
aGFyZmJ1enpTa2lhR2V0VGFibGUodm9pZCogdm9pZGZhY2UsIGNvbnN0IEhCX1RhZyB0YWcsIEhC
X0J5dGUqIGJ1ZmZlciwgSEJfVUludCogbGVuKTsKKworLy8gVGV4dFJ1bldhbGtlciB3YWxrcyBh
IFRleHRSdW4gYW5kIHByZXNlbnRzIGVhY2ggc2NyaXB0IHJ1biBpbiBzZXF1ZW5jZS4gQQorLy8g
VGV4dFJ1biBpcyBhIHNlcXVlbmNlIG9mIGNvZGUtcG9pbnRzIHdpdGggdGhlIHNhbWUgZW1iZWRk
aW5nIGxldmVsIChpLmUuIHRoZXkKKy8vIGFyZSBhbGwgbGVmdC10by1yaWdodCBvciByaWdodC10
by1sZWZ0KS4gQSBzY3JpcHQgcnVuIGlzIGEgc3Vic2VxdWVuY2Ugd2hlcmUKKy8vIGFsbCB0aGUg
Y2hhcmFjdGVycyBoYXZlIHRoZSBzYW1lIHNjcmlwdCAoZS5nLiBBcmFiaWMsIFRoYWkgZXRjKS4g
U2hhcGluZyBpcworLy8gb25seSBldmVyIGRvbmUgd2l0aCBzY3JpcHQgcnVucyBzaW5jZSB0aGUg
c2hhcGVycyBvbmx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAorLy8gYSBzaW5nbGUgc2NyaXB0Lgor
Ly8KKy8vIEFmdGVyIGNyZWF0aW5nIGl0LCB0aGUgc2NyaXB0IHJ1bnMgYXJlIGVpdGhlciBpdGVy
YXRlZCBiYWNrd2FyZHMgb3IgZm9yd2FyZHMuCisvLyBJdCBkZWZhdWx0cyB0byBiYWNrd2FyZHMg
Zm9yIFJUTCBhbmQgZm9yd2FyZHMgb3RoZXJ3aXNlICh3aGljaCBtYXRjaGVzIHRoZQorLy8gcHJl
c2VudGF0aW9uIG9yZGVyKSwgaG93ZXZlciB5b3UgY2FuIHNldCBpdCB3aXRoIHxzZXRCYWNrd2Fy
ZHNJdGVyYXRpb258LgorLy8KKy8vIE9uY2UgeW91IGhhdmUgc2V0dXAgdGhlIG9iamVjdCwgY2Fs
bCB8bmV4dFNjcmlwdFJ1bnwgdG8gZ2V0IHRoZSBmaXJzdCBzY3JpcHQKKy8vIHJ1bi4gVGhpcyB3
aWxsIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpdGVyYXRpb24gaXMgY29tcGxldGUuIEF0IGFueSB0
aW1lIHlvdQorLy8gY2FuIGNhbGwgfHJlc2V0fCB0byBzdGFydCBvdmVyIGFnYWluLgorY2xhc3Mg
VGV4dFJ1bldhbGtlciB7CitwdWJsaWM6CisgICAgVGV4dFJ1bldhbGtlcihjb25zdCBUZXh0UnVu
JiBydW4sIFNrUGFpbnQqIHBhaW50LCB1bnNpZ25lZCBzdGFydGluZ1gsIGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEqIGZvbnQpCisgICAgICAgIDogbV9ydW4ocnVuKQorICAgICAgICAsIG1fcGFpbnQo
cGFpbnQpCisgICAgICAgICwgbV9zdGFydGluZ1goc3RhcnRpbmdYKQorICAgICAgICAsIG1fb2Zm
c2V0WChtX3N0YXJ0aW5nWCkKKyAgICAgICAgLCBtX2l0ZXJhdGVCYWNrd2FyZHMocnVuLnJ0bCgp
KQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZtX2l0ZW0sIDAsIHNpemVvZihtX2l0ZW0pKTsKKyAg
ICAgICAgLy8gV2UgY2Fubm90IGtub3csIGFoZWFkIG9mIHRpbWUsIGhvdyBtYW55IGdseXBocyBh
IGdpdmVuIHNjcmlwdCBydW4KKyAgICAgICAgLy8gd2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vl
c3MgdGhhdCBzY3JpcHQgcnVucyB3aWxsIG5vdCBwcm9kdWNlIG1vcmUKKyAgICAgICAgLy8gdGhh
biB0d2ljZSBhcyBtYW55IGdseXBocyBhcyB0aGVyZSBhcmUgY29kZSBwb2ludHMgYW5kIGZhbGxi
YWNrIGlmCisgICAgICAgIC8vIHdlIGZpbmQgdGhhdCB3ZSBhcmUgd3JvbmcuCisgICAgICAgIG1f
bWF4R2x5cGhzID0gcnVuLmxlbmd0aCgpICogMjsKKyAgICAgICAgbV9pdGVtLmdseXBocyA9IG5l
dyBIQl9HbHlwaFttX21heEdseXBoc107CisgICAgICAgIG1faXRlbS5hdHRyaWJ1dGVzID0gbmV3
IEhCX0dseXBoQXR0cmlidXRlc1ttX21heEdseXBoc107CisgICAgICAgIG1faXRlbS5hZHZhbmNl
cyA9IG5ldyBIQl9GaXhlZFttX21heEdseXBoc107CisgICAgICAgIG1faXRlbS5vZmZzZXRzID0g
bmV3IEhCX0ZpeGVkUG9pbnRbbV9tYXhHbHlwaHNdOworICAgICAgICBtX2dseXBoczE2ID0gbmV3
IHVpbnQxNl90W21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV94cG9zID0gbmV3IFNrU2NhbGFyW21f
bWF4R2x5cGhzXTsKKworICAgICAgICBtX2l0ZW0ubG9nX2NsdXN0ZXJzID0gbmV3IHVuc2lnbmVk
IHNob3J0W3J1bi5sZW5ndGgoKV07CisKKyAgICAgICAgbV9pdGVtLmZhY2UgPSBIQl9OZXdGYWNl
KGNvbnN0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGZvbnQpLCBoYXJmYnV6elNraWFHZXRUYWJs
ZSk7CisgICAgICAgIG1faXRlbS5mb250ID0gKEhCX0ZvbnRSZWMqKSBmYXN0TWFsbG9jKHNpemVv
ZihIQl9Gb250UmVjKSk7CisgICAgICAgIG1lbXNldChtX2l0ZW0uZm9udCwgMCwgc2l6ZW9mKEhC
X0ZvbnRSZWMpKTsKKyAgICAgICAgbV9pdGVtLmZvbnQtPmtsYXNzID0gJmhhcmZidXp6U2tpYUNs
YXNzOworICAgICAgICBtX2l0ZW0uZm9udC0+dXNlckRhdGEgPSBjb25zdF9jYXN0PEZvbnRQbGF0
Zm9ybURhdGEqPihmb250KTsKKyAgICAgICAgLy8gVGhlIHZhbHVlcyB3aGljaCBoYXJmYnV6elNr
aWFDbGFzcyByZXR1cm5zIGFyZSBhbHJlYWR5IHNjYWxlZCB0bworICAgICAgICAvLyBwaXhlbCB1
bml0cywgc28gd2UganVzdCBzZXQgYWxsIHRoZXNlIHRvIG9uZSB0byBkaXNhYmxlIGZ1cnRoZXIK
KyAgICAgICAgLy8gc2NhbGluZy4KKyAgICAgICAgbV9pdGVtLmZvbnQtPnhfcHBlbSA9IDE7Cisg
ICAgICAgIG1faXRlbS5mb250LT55X3BwZW0gPSAxOworICAgICAgICBtX2l0ZW0uZm9udC0+eF9z
Y2FsZSA9IDE7CisgICAgICAgIG1faXRlbS5mb250LT55X3NjYWxlID0gMTsKKyAgICAgICAgcGFp
bnQtPnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2RpbmcpOworCisg
ICAgICAgIG1faXRlbS5zdHJpbmcgPSBydW4uY2hhcmFjdGVycygpOworICAgICAgICBtX2l0ZW0u
c3RyaW5nTGVuZ3RoID0gcnVuLmxlbmd0aCgpOworICAgICAgICBtX2l0ZW0uaXRlbS5iaWRpTGV2
ZWwgPSBydW4ucnRsKCk7CisKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICB+VGV4dFJ1
bldhbGtlcigpCisgICAgeworICAgICAgICBmYXN0RnJlZShtX2l0ZW0uZm9udCk7CisgICAgICAg
IGRlbGV0ZVtdIG1faXRlbS5nbHlwaHM7CisgICAgICAgIGRlbGV0ZVtdIG1faXRlbS5hdHRyaWJ1
dGVzOworICAgICAgICBkZWxldGVbXSBtX2l0ZW0uYWR2YW5jZXM7CisgICAgICAgIGRlbGV0ZVtd
IG1faXRlbS5vZmZzZXRzOworICAgICAgICBkZWxldGVbXSBtX2l0ZW0ubG9nX2NsdXN0ZXJzOwor
ICAgICAgICBkZWxldGVbXSBtX2dseXBoczE2OworICAgICAgICBkZWxldGVbXSBtX3hwb3M7Cisg
ICAgICAgIEhCX0ZyZWVGYWNlKG1faXRlbS5mYWNlKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0
KCkKKyAgICB7CisgICAgICAgIGlmIChtX2l0ZXJhdGVCYWNrd2FyZHMpCisgICAgICAgICAgICBt
X2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gbV9ydW4ubGVuZ3RoKCkgLSAxOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gMDsKKyAgICAgICAgbV9vZmZz
ZXRYID0gbV9zdGFydGluZ1g7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSB4IG9mZnNldCBmb3Ig
dGhlIG5leHQgc2NyaXB0IHJ1bi4gVGhpcyBhZmZlY3RzIHRoZSB2YWx1ZXMgaW4KKyAgICAvLyB8
eFBvc2l0aW9uc3wKKyAgICB2b2lkIHNldFhPZmZzZXQoaW50IHgpCisgICAgeworICAgICAgICBt
X29mZnNldFggPSB4OworICAgIH0KKworICAgIGJvb2wgcnRsKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX3J1bi5ydGwoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEJhY2t3YXJkc0l0
ZXJhdGlvbihib29sIGlzX2JhY2t3YXJkcykKKyAgICB7CisgICAgICAgIG1faXRlcmF0ZUJhY2t3
YXJkcyA9IGlzX2JhY2t3YXJkczsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBB
ZHZhbmNlIHRvIHRoZSBuZXh0IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBl
bmQgb2YgdGhlCisgICAgLy8gVGV4dFJ1biBoYXMgYmVlbiByZWFjaGVkLgorICAgIGJvb2wgbmV4
dFNjcmlwdFJ1bigpCisgICAgeworICAgICAgICBpZiAobV9pdGVyYXRlQmFja3dhcmRzKSB7Cisg
ICAgICAgICAgICAvLyBJbiByaWdodC10by1sZWZ0IG1vZGUgd2UgbmVlZCB0byByZW5kZXIgdGhl
IHNoYXBlZCBnbHlwaCBiYWNrd2FyZHMgYW5kCisgICAgICAgICAgICAvLyBhbHNvIHJlbmRlciB0
aGUgc2NyaXB0IHJ1bnMgdGhlbXNlbHZlcyBiYWNrd2FyZHMuIFNvIGdpdmVuIGEgVGV4dFJ1bjoK
KyAgICAgICAgICAgIC8vICAgIEFBQUFBQUFDVFRUVFRUVCAgIChBID0gQXJhYmljLCBDID0gQ29t
bW9uLCBUID0gVGhhaSkKKyAgICAgICAgICAgIC8vIHdlIHJlbmRlcjoKKyAgICAgICAgICAgIC8v
ICAgIFRUVFRUVENBQUFBQUFBCisgICAgICAgICAgICAvLyAoYW5kIHRoZSBnbHlwaHMgaW4gZWFj
aCBBLCBDIGFuZCBUIHNlY3Rpb24gYXJlIGJhY2t3YXJkcyB0b28pCisgICAgICAgICAgICBpZiAo
IWhiX3V0ZjE2X3NjcmlwdF9ydW5fcHJldigmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0s
IG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2NyaXB0
UnVuKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCgmbV9udW1Db2RlUG9pbnRz
LCAmbV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2lu
ZGV4T2ZOZXh0U2NyaXB0UnVuKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAocnRsKCkpCisgICAgICAgICAgICByZXR1cm4gTmV4dFJUTFNj
cmlwdFJ1bigpOworICAgICAgICByZXR1cm4gTmV4dExUUlNjcmlwdFJ1bigpOworICAgIH0KKwor
ICAgIGNvbnN0IHVpbnQxNl90KiBnbHlwaHMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fZ2x5cGhzMTY7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFy
cmF5IHJldHVybmVkIGJ5IHxnbHlwaHN8CisgICAgY29uc3QgdW5zaWduZWQgbGVuZ3RoKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2l0ZW0ubnVtX2dseXBoczsKKyAgICB9CisKKyAg
ICAvLyBSZXR1cm4gdGhlIHggb2Zmc2V0IGZvciBlYWNoIG9mIHRoZSBnbHlwaHMuIE5vdGUgdGhh
dCB0aGlzIGlzIHRyYW5zbGF0ZWQKKyAgICAvLyBieSB0aGUgY3VycmVudCB4IG9mZnNldCBhbmQg
dGhhdCB0aGUgeCBvZmZzZXQgaXMgdXBkYXRlZCBmb3IgZWFjaCBzY3JpcHQKKyAgICAvLyBydW4u
CisgICAgY29uc3QgU2tTY2FsYXIqIHhQb3NpdGlvbnMoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1feHBvczsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGFkdmFuY2VzICh3aWR0aHMp
IGZvciBlYWNoIGdseXBoLgorICAgIGNvbnN0IEhCX0ZpeGVkKiBhZHZhbmNlcygpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gbV9pdGVtLmFkdmFuY2VzOworICAgIH0KKworICAgIC8vIFJl
dHVybiB0aGUgd2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBzY3JpcHQgcnVuLgorICAgIGNv
bnN0IHVuc2lnbmVkIHdpZHRoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3BpeGVs
V2lkdGg7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBjbHVzdGVyIGxvZyBmb3IgdGhlIGN1
cnJlbnQgc2NyaXB0IHJ1bi4gRm9yIGV4YW1wbGU6CisgICAgLy8gICBzY3JpcHQgcnVuOiBmIGkg
YSBuIGMgw6kgIChmaSBnZXRzIGxpZ2F0dXJlZCkKKyAgICAvLyAgIGxvZyBjbHV0cnM6IDAgMCAx
IDIgMyA0CisgICAgLy8gU28sIGZvciBlYWNoIGlucHV0IGNvZGUgcG9pbnQsIHRoZSBsb2cgdGVs
bHMgeW91IHdoaWNoIG91dHB1dCBnbHlwaCB3YXMKKyAgICAvLyBnZW5lcmF0ZWQgZm9yIGl0Lgor
ICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBsb2dDbHVzdGVycygpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gbV9pdGVtLmxvZ19jbHVzdGVyczsKKyAgICB9CisKKyAgICAvLyByZXR1cm4g
dGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiB0aGUgY3VycmVudCBzY3JpcHQgcnVuCisgICAg
Y29uc3QgdW5zaWduZWQgbnVtQ29kZVBvaW50cygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gbV9udW1Db2RlUG9pbnRzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIGV4cGFuZEds
eXBoQXJyYXlzKCkgeworICAgICAgICBkZWxldGVbXSBtX2l0ZW0uZ2x5cGhzOworICAgICAgICBk
ZWxldGVbXSBtX2l0ZW0uYXR0cmlidXRlczsKKyAgICAgICAgZGVsZXRlW10gbV9pdGVtLmFkdmFu
Y2VzOworICAgICAgICBkZWxldGVbXSBtX2l0ZW0ub2Zmc2V0czsKKyAgICAgICAgZGVsZXRlW10g
bV9nbHlwaHMxNjsKKyAgICAgICAgZGVsZXRlW10gbV94cG9zOworCisgICAgICAgIG1fbWF4R2x5
cGhzIDw8PSAxOworCisgICAgICAgIG1faXRlbS5nbHlwaHMgPSBuZXcgSEJfR2x5cGhbbV9tYXhH
bHlwaHNdOworICAgICAgICBtX2l0ZW0uYXR0cmlidXRlcyA9IG5ldyBIQl9HbHlwaEF0dHJpYnV0
ZXNbbV9tYXhHbHlwaHNdOworICAgICAgICBtX2l0ZW0uYWR2YW5jZXMgPSBuZXcgSEJfRml4ZWRb
bV9tYXhHbHlwaHNdOworICAgICAgICBtX2l0ZW0ub2Zmc2V0cyA9IG5ldyBIQl9GaXhlZFBvaW50
W21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV9nbHlwaHMxNiA9IG5ldyB1aW50MTZfdFttX21heEds
eXBoc107CisgICAgICAgIG1feHBvcyA9IG5ldyBTa1NjYWxhclttX21heEdseXBoc107CisKKyAg
ICAgICAgcmV0dXJuIG1faXRlbS5nbHlwaHMgIT0gTlVMTAorICAgICAgICAgICAgJiYgbV9pdGVt
LmF0dHJpYnV0ZXMgIT0gTlVMTAorICAgICAgICAgICAgJiYgbV9pdGVtLmFkdmFuY2VzICE9IE5V
TEwKKyAgICAgICAgICAgICYmIG1faXRlbS5vZmZzZXRzICE9IE5VTEwKKyAgICAgICAgICAgICYm
IG1fZ2x5cGhzMTYgIT0gTlVMTAorICAgICAgICAgICAgJiYgbV94cG9zICE9IE5VTEw7CisgICAg
fQorCisgICAgYm9vbCBOZXh0UlRMU2NyaXB0UnVuKCkKKyAgICB7CisgICAgICAgIGZvciAoOzsp
IHsKKyAgICAgICAgICAgIG1faXRlbS5udW1fZ2x5cGhzID0gbV9tYXhHbHlwaHM7CisgICAgICAg
ICAgICBIQl9TaGFwZUl0ZW0oJm1faXRlbSk7CisgICAgICAgICAgICBpZiAobV9pdGVtLm51bV9n
bHlwaHMgPCBtX21heEdseXBocykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgLy8gV2Ugb3ZlcmZsb3dlZCBvdXIgYXJyYXlzLiBSZXNpemUgYW5kIHJldHJ5LgorICAgICAg
ICAgICAgaWYgKCFleHBhbmRHbHlwaEFycmF5cygpKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEhCX0ZpeGVkIGFkdl9zdW0gPSAwOworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9pdGVtLm51bV9nbHlwaHM7ICsraSkgeworICAg
ICAgICAgICAgbV9nbHlwaHMxNltpXSA9IG1faXRlbS5nbHlwaHNbaV07CisgICAgICAgICAgICBh
ZHZfc3VtICs9IG1faXRlbS5hZHZhbmNlc1tpXSA+PiA2OworICAgICAgICB9CisgICAgICAgIG1f
cGl4ZWxXaWR0aCA9IGFkdl9zdW07CisgICAgICAgIGFkdl9zdW0gKz0gbV9vZmZzZXRYOworICAg
ICAgICBtX29mZnNldFggKz0gbV9waXhlbFdpZHRoOworCisgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBtX2l0ZW0ubnVtX2dseXBoczsgKytpKSB7CisgICAgICAgICAgICBhZHZfc3Vt
IC09IG1faXRlbS5hZHZhbmNlc1tpXSA+PiA2OworICAgICAgICAgICAgbV94cG9zW2ldID0gYWR2
X3N1bTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJv
b2wgTmV4dExUUlNjcmlwdFJ1bigpCisgICAgeworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAg
ICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IG1fbWF4R2x5cGhzOworICAgICAgICAgICAgSEJfU2hh
cGVJdGVtKCZtX2l0ZW0pOworICAgICAgICAgICAgaWYgKG1faXRlbS5udW1fZ2x5cGhzIDwgbV9t
YXhHbHlwaHMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFdlIG92
ZXJmbG93ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KKyAgICAgICAgICAgIGlmICgh
ZXhwYW5kR2x5cGhBcnJheXMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKworICAgICAgICBtX3BpeGVsV2lkdGggPSAwOworICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbV9pdGVtLm51bV9nbHlwaHM7ICsraSkgeworICAgICAgICAgICAgbV9nbHlw
aHMxNltpXSA9IG1faXRlbS5nbHlwaHNbaV07CisgICAgICAgICAgICBtX3hwb3NbaV0gPSBtX29m
ZnNldFg7CisgICAgICAgICAgICBtX29mZnNldFggKz0gbV9pdGVtLmFkdmFuY2VzW2ldID4+IDY7
CisgICAgICAgICAgICBtX3BpeGVsV2lkdGggKz0gbV9pdGVtLmFkdmFuY2VzW2ldID4+IDY7Cisg
ICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBUZXh0
UnVuJiBtX3J1bjsKKyAgICBIQl9TaGFwZXJJdGVtIG1faXRlbTsKKyAgICB1aW50MTZfdCogbV9n
bHlwaHMxNjsgIC8vIGEgdmVjdG9yIG9mIDE2LWJpdCBnbHlwaCBpZHMKKyAgICBTa1NjYWxhciog
bV94cG9zOyAgLy8gYSB2ZWN0b3Igb2YgeCBwb3NpdGlvbnMgZm9yIGVhY2ggZ2x5cGgKKyAgICBT
a1BhaW50KiBjb25zdCBtX3BhaW50OworICAgIHNzaXplX3QgbV9pbmRleE9mTmV4dFNjcmlwdFJ1
bjsgIC8vIGluZGV4ZXMgdGhlIHNjcmlwdCBydW4gaW4gfG1fcnVufAorICAgIGNvbnN0IHVuc2ln
bmVkIG1fc3RhcnRpbmdYOworICAgIHVuc2lnbmVkIG1fb2Zmc2V0WDsKKyAgICB1bnNpZ25lZCBt
X3BpeGVsV2lkdGg7ICAvLyB3aWR0aCAoaW4gcHgpIG9mIHRoZSBjdXJyZW50IHNjcmlwdCBydW4K
KyAgICB1bnNpZ25lZCBtX251bUNvZGVQb2ludHM7ICAvLyBjb2RlIHBvaW50cyBpbiBjdXJyZW50
IHNjcmlwdCBydW4KKyAgICB1bnNpZ25lZCBtX21heEdseXBoczsKKyAgICBib29sIG1faXRlcmF0
ZUJhY2t3YXJkczsKK307CisKK3ZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29u
dGV4dCogZ2MsIGNvbnN0IFRleHRSdW4mIHJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewotICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgaWYgKHJ1bi5sZW5ndGgoKSA9PSAwKQorICAgICAgcmV0
dXJuOworCisgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgZm9udCA9IGZvbnREYXRhRm9yQ2hh
cmFjdGVycyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpLT5mb250RGF0YUZvckNoYXJh
Y3RlcignICcpLT5wbGF0Zm9ybURhdGEoKTsKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCog
cGdjID0gZ2MtPnBsYXRmb3JtQ29udGV4dCgpOworCisgICAgU2tDYW52YXMqIGNhbnZhcyA9IHBn
Yy0+Y2FudmFzKCk7CisgICAgaW50IHRleHRNb2RlID0gcGdjLT5nZXRUZXh0RHJhd2luZ01vZGUo
KTsKKyAgICBib29sIGZpbGwgPSB0ZXh0TW9kZSAmIGNUZXh0RmlsbDsKKyAgICBib29sIHN0cm9r
ZSA9ICh0ZXh0TW9kZSAmIGNUZXh0U3Ryb2tlKQorICAgICAgICAgICAgICAgJiYgcGdjLT5nZXRT
dHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlCisgICAgICAgICAgICAgICAmJiBwZ2MtPmdldFN0cm9r
ZVRoaWNrbmVzcygpID4gMDsKKworICAgIGlmICghZmlsbCAmJiAhc3Ryb2tlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTa1BhaW50IHN0cm9rZVBhaW50LCBmaWxsUGFpbnQ7CisgICAgaWYgKGZp
bGwpIHsKKyAgICAgICAgcGdjLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmZmlsbFBhaW50KTsKKyAg
ICAgICAgZm9udC5zZXR1cFBhaW50KCZmaWxsUGFpbnQpOworICAgICAgICBmaWxsUGFpbnQuc2V0
VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGluZyk7CisgICAgICAgIGZp
bGxQYWludC5zZXRDb2xvcihnYy0+ZmlsbENvbG9yKCkucmdiKCkpOworICAgIH0KKyAgICBpZiAo
c3Ryb2tlKSB7CisgICAgICAgIHBnYy0+c2V0dXBQYWludEZvclN0cm9raW5nKCZzdHJva2VQYWlu
dCwgMCwgMCk7CisgICAgICAgIGZvbnQuc2V0dXBQYWludCgmZmlsbFBhaW50KTsKKyAgICAgICAg
c3Ryb2tlUGFpbnQuc2V0RmxhZ3MoU2tQYWludDo6a0FudGlBbGlhc19GbGFnKTsKKyAgICAgICAg
c3Ryb2tlUGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGlu
Zyk7CisgICAgICAgIHN0cm9rZVBhaW50LnNldENvbG9yKGdjLT5zdHJva2VDb2xvcigpLnJnYigp
KTsKKyAgICB9CisKKyAgICBUZXh0UnVuV2Fsa2VyIHdhbGtlcihydW4sIHN0cm9rZSA/ICZzdHJv
a2VQYWludCA6ICZmaWxsUGFpbnQsIHBvaW50LngoKSwgJmZvbnQpOworCisgICAgd2hpbGUgKHdh
bGtlci5uZXh0U2NyaXB0UnVuKCkpIHsKKyAgICAgICAgaWYgKGZpbGwpCisgICAgICAgICAgICBj
YW52YXMtPmRyYXdQb3NUZXh0SCh3YWxrZXIuZ2x5cGhzKCksIHdhbGtlci5sZW5ndGgoKSA8PCAx
LCB3YWxrZXIueFBvc2l0aW9ucygpLCBwb2ludC55KCksIGZpbGxQYWludCk7CisgICAgICAgIGlm
IChzdHJva2UpCisgICAgICAgICAgICBjYW52YXMtPmRyYXdQb3NUZXh0SCh3YWxrZXIuZ2x5cGhz
KCksIHdhbGtlci5sZW5ndGgoKSA8PCAxLCB3YWxrZXIueFBvc2l0aW9ucygpLCBwb2ludC55KCks
IHN0cm9rZVBhaW50KTsKKyAgICB9CiB9CiAKIGZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21w
bGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEq
PiogLyogZmFsbGJhY2tGb250cyAqLykgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwot
ICAgIHJldHVybiAwOworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgY29uc3QgRm9udFBsYXRmb3Jt
RGF0YSYgZm9udCA9IGZvbnREYXRhRm9yQ2hhcmFjdGVycyhydW4uY2hhcmFjdGVycygpLCBydW4u
bGVuZ3RoKCkpLT5mb250RGF0YUZvckNoYXJhY3RlcignICcpLT5wbGF0Zm9ybURhdGEoKTsKKyAg
ICBmb250LnNldHVwUGFpbnQoJnBhaW50KTsKKworICAgIFRleHRSdW5XYWxrZXIgd2Fsa2VyKHJ1
biwgJnBhaW50LCAwLCAmZm9udCk7CisKKyAgICBmbG9hdCB3aWR0aCA9IDA7CisgICAgd2hpbGUg
KHdhbGtlci5uZXh0U2NyaXB0UnVuKCkpCisgICAgICAgIHdpZHRoICs9IHdhbGtlci53aWR0aCgp
OworCisgICAgcmV0dXJuIHdpZHRoOwogfQogCisvLyBSZXR1cm4gdGhlIGNvZGUgcG9pbnQgaW5k
ZXggZm9yIHRoZSBnaXZlbiB8eHwgb2Zmc2V0IGludG8gdGhlIHRleHQgcnVuLgogaW50IEZvbnQ6
Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQg
eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVk
ZVBhcnRpYWxHbHlwaHMpIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAvLyAo
TWFjIGNvZGUgaWdub3JlcyBpbmNsdWRlUGFydGlhbEdseXBocywgYW5kIHRoZXkgZG9uJ3Qga25v
dyB3aGF0IGl0J3MKKyAgICAvLyBzdXBwb3NlZCB0byBkbywgc28gd2UganVzdCBpZ25vcmUgaXQg
YXMgd2VsbC4pCisgICAgU2tQYWludCBwYWludDsKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRh
JiBmb250ID0gZm9udERhdGFGb3JDaGFyYWN0ZXJzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5n
dGgoKSktPmZvbnREYXRhRm9yQ2hhcmFjdGVyKCcgJyktPnBsYXRmb3JtRGF0YSgpOworICAgIGZv
bnQuc2V0dXBQYWludCgmcGFpbnQpOworCisgICAgVGV4dFJ1bldhbGtlciB3YWxrZXIocnVuLCAm
cGFpbnQsIDAsICZmb250KTsKKworICAgIC8vIElmIHRoaXMgaXMgUlRMIHRleHQsIHRoZSBmaXJz
dCBnbHlwaCBmcm9tIHRoZSBsZWZ0IGlzIGFjdHVhbGx5IHRoZSBsYXN0CisgICAgLy8gY29kZSBw
b2ludC4gU28gd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGNvZGUgcG9pbnRzIHRoZXJlIGFyZSB0
b3RhbCBpbgorICAgIC8vIG9yZGVyIHRvIHN1YnRyYWN0LiBUaGlzIGlzIGRpZmZlcmVudCBmcm9t
IHRoZSBsZW5ndGggb2YgdGhlIFRleHRSdW4KKyAgICAvLyBiZWNhdXNlIFVURi0xNiBzdXJyb2dh
dGUgcGFpcnMgYXJlIGEgc2luZ2xlIGNvZGUgcG9pbnQsIGJ1dCAzMi1iaXRzIGxvbmcuCisgICAg
Ly8gSW4gTFRSIHdlIGxlYXZlIHRoaXMgYXMgMCBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCB2
YWx1ZSBmb3IKKyAgICAvLyB8YmFzZVBvc2l0aW9ufCwgYmVsb3cuCisgICAgdW5zaWduZWQgdG90
YWxDb2RlUG9pbnRzID0gMDsKKyAgICBpZiAod2Fsa2VyLnJ0bCgpKSB7CisgICAgICAgIHNzaXpl
X3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IHJ1bi5sZW5ndGgoKSkgewor
ICAgICAgICAgICAgdXRmMTZfdG9fY29kZV9wb2ludChydW4uY2hhcmFjdGVycygpLCBydW4ubGVu
Z3RoKCksICZvZmZzZXQpOworICAgICAgICAgICAgdG90YWxDb2RlUG9pbnRzKys7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCBiYXNlUG9zaXRpb24gPSB0b3RhbENvZGVQb2ludHM7
CisKKyAgICAvLyBGb3IgUlRMOgorICAgIC8vICAgY29kZS1wb2ludCBvcmRlcjogIGFiY2QgZWZn
IGhpamtsCisgICAgLy8gICBvbiBzY3JlZW46ICAgICAgICAgbGtqaWggZ2ZlIGRjYmEKKyAgICAv
LyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgIF4KKyAgICAvLyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgICAvLyAgICAgICAgICAgICAgICAgIGJhc2VQ
b3NpdGlvbi0tfCAgIHwKKyAgICAvLyAgICAgICAgICAgICAgICAgdG90YWxDb2RlUG9pbnRzLS0t
LXwKKyAgICAvLyBTaW5jZSBiYXNlUG9zaXRpb24gaXMgY3VycmVudGx5IHRoZSB0b3RhbCBudW1i
ZXIgb2YgY29kZS1wb2ludHMsIHRoZQorICAgIC8vIGZpcnN0IHRoaW5nIHdlIGRvIGlzIGRlY3Jl
bWVudCBpdCBzbyB0aGF0IGl0J3MgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mCisgICAgLy8gdGhl
IGN1cnJlbnQgc2NyaXB0LXJ1bi4KKyAgICAvLworICAgIC8vIEZvciBMVFIsIGJhc2VQb3NpdGlv
biBpcyB6ZXJvIHNvIGl0IGFscmVhZHkgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAgICAv
LyBmaXJzdCBzY3JpcHQgcnVuLgorICAgIHdoaWxlICh3YWxrZXIubmV4dFNjcmlwdFJ1bigpKSB7
CisgICAgICAgIGlmICh3YWxrZXIucnRsKCkpCisgICAgICAgICAgICBiYXNlUG9zaXRpb24gLT0g
d2Fsa2VyLm51bUNvZGVQb2ludHMoKTsKKworICAgICAgICBpZiAoeCA8IHdhbGtlci53aWR0aCgp
KSB7CisgICAgICAgICAgICAvLyBUaGUgeCB2YWx1ZSBpbiBxdWVzdGlvbiBpcyB3aXRoaW4gdGhp
cyBzY3JpcHQgcnVuLiBXZSBjb25zaWRlcgorICAgICAgICAgICAgLy8gZWFjaCBnbHlwaCBpbiBw
cmVzZW50YXRpb24gb3JkZXIgYW5kIHN0b3Agd2hlbiB3ZSBmaW5kIHRoZSBvbmUKKyAgICAgICAg
ICAgIC8vIGNvdmVyaW5nIHRoaXMgcG9zaXRpb24uCisgICAgICAgICAgICBjb25zdCBIQl9GaXhl
ZCogYWR2YW5jZXMgPSB3YWxrZXIuYWR2YW5jZXMoKTsKKyAgICAgICAgICAgIGludCBnbHlwaElu
ZGV4OworICAgICAgICAgICAgaWYgKHdhbGtlci5ydGwoKSkgeworICAgICAgICAgICAgICAgIGZv
ciAoZ2x5cGhJbmRleCA9IHdhbGtlci5sZW5ndGgoKSAtIDE7IGdseXBoSW5kZXggPj0gMDsgLS1n
bHlwaEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh4IDwgYWR2YW5jZXNbZ2x5cGhJ
bmRleF0gPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgICAgICB4IC09IGFkdmFuY2VzW2dseXBoSW5kZXhdID4+IDY7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGdseXBoSW5kZXgg
PSAwOyBnbHlwaEluZGV4IDwgd2Fsa2VyLmxlbmd0aCgpOyAtLWdseXBoSW5kZXgpIHsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKHggPCBhZHZhbmNlc1tnbHlwaEluZGV4XSA+PiA2KQorICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHggLT0gYWR2YW5j
ZXNbZ2x5cGhJbmRleF0gPj4gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBnbHlwaCBpbmRleCwgd2UgaGF2ZSB0
byB0dXJuIHRoYXQgaW50byBhCisgICAgICAgICAgICAvLyBjb2RlLXBvaW50IGluZGV4LiBCZWNh
dXNlIG9mIGxpZ2F0dXJlcywgc2V2ZXJhbCBjb2RlLXBvaW50cyBtYXkKKyAgICAgICAgICAgIC8v
IGhhdmUgZ29uZSBpbnRvIGEgc2luZ2xlIGdseXBoLiBXZSBpdGVyYXRlIG92ZXIgdGhlIGNsdXN0
ZXJzIGxvZworICAgICAgICAgICAgLy8gYW5kIGZpbmQgdGhlIGZpcnN0IGNvZGUtcG9pbnQgd2hp
Y2ggY29udHJpYnV0ZWQgdG8gdGhlIGdseXBoLgorICAgICAgICAgICAgY29uc3QgdW5zaWduZWQg
c2hvcnQqIGxvZyA9IHdhbGtlci5sb2dDbHVzdGVycygpOworICAgICAgICAgICAgZm9yICh1bnNp
Z25lZCBqID0gMDsgaiA8IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7ICsraikgeworICAgICAgICAg
ICAgICAgIGlmIChsb2dbal0gPT0gZ2x5cGhJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGJhc2VQb3NpdGlvbiArIGo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFTU0VS
VChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICB4IC09IHdhbGtlci53aWR0aCgpOworCisg
ICAgICAgIGlmICghd2Fsa2VyLnJ0bCgpKQorICAgICAgICAgICAgYmFzZVBvc2l0aW9uICs9IHdh
bGtlci5udW1Db2RlUG9pbnRzKCk7CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKKy8vIFJl
dHVybiB0aGUgcmVjdGFuZ2xlIGZvciBzZWxlY3RpbmcgdGhlIGdpdmVuIHJhbmdlIG9mIGNvZGUt
cG9pbnRzIGluIHRoZQorLy8gVGV4dFJ1bi4KIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0
Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRv
KSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIEZsb2F0UmVjdCgp
OworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgZm9udCA9
IGZvbnREYXRhRm9yQ2hhcmFjdGVycyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpLT5m
b250RGF0YUZvckNoYXJhY3RlcignICcpLT5wbGF0Zm9ybURhdGEoKTsKKyAgICBmb250LnNldHVw
UGFpbnQoJnBhaW50KTsKKworICAgIGludCBmcm9tWCA9IC0xLCB0b1ggPSAtMTsKKworICAgIC8v
IEZvciBSVEwgd2UnbGwgbmVlZCB0byBrbm93IHRoZSB3aWR0aCBvZiB0aGUgZnVsbCBUZXh0UnVu
LgorICAgIFRleHRSdW5XYWxrZXIgd2Fsa2VyKHJ1biwgJnBhaW50LCAwLCAmZm9udCk7CisgICAg
ZmxvYXQgd2lkdGggPSAwOworICAgIGlmICh3YWxrZXIucnRsKCkpIHsKKyAgICAgICAgd2hpbGUg
KHdhbGtlci5uZXh0U2NyaXB0UnVuKCkpCisgICAgICAgICAgICB3aWR0aCArPSB3YWxrZXIud2lk
dGgoKTsKKyAgICB9CisKKyAgICAvLyBXZSB3YW50IHRvIGVudW1lcmF0ZSB0aGUgc2NyaXB0IHJ1
bnMgaW4gY29kZSBwb2ludCBvcmRlciBpbiB0aGUgZm9sbG93aW5nCisgICAgLy8gY29kZS4gVGhp
cyBjYWxsIGFsc28gcmVzZXRzIHx3YWxrZXJ8LgorICAgIHdhbGtlci5zZXRCYWNrd2FyZHNJdGVy
YXRpb24oZmFsc2UpOworICAgIC8vIFRleHRSdW5XYWxrZXIgd2lsbCBoZWxwZnVsbHkgYWNjdWx1
bGF0ZSB0aGUgeCBvZmZzZXRzIGZvciBkaWZmZXJlbnQKKyAgICAvLyBzY3JpcHQgcnVucyBmb3Ig
dXMuIEZvciB0aGlzIGNvZGUsIGhvd2V2ZXIsIHdlIGFsd2F5cyB3YW50IHRoZSB4IG9mZnNldHMK
KyAgICAvLyB0byBzdGFydCBmcm9tIHplcm8gc28gd2UgY2FsbCB0aGlzIGJlZm9yZSBlYWNoIHNj
cmlwdCBydW4uCisgICAgd2Fsa2VyLnNldFhPZmZzZXQoMCk7CisKKyAgICAvLyBCYXNlIHdpbGwg
cG9pbnQgdG8gdGhlIHggb2Zmc2V0IGZvciB0aGUgY3VycmVudCBzY3JpcHQgcnVuLiBOb3RlIHRo
YXQsIGluCisgICAgLy8gdGhlIExUUiBjYXNlLCB3aWR0aCB3aWxsIGJlIDAuCisgICAgaW50IGJh
c2UgPSB3aWR0aDsKKworICAgIHdoaWxlICh3YWxrZXIubmV4dFNjcmlwdFJ1bigpICYmIChmcm9t
WCA9PSAtMSB8fCB0b1ggPT0gLTEpKSB7CisgICAgICAgIGlmICh3YWxrZXIucnRsKCkpCisgICAg
ICAgICAgICBiYXNlIC09IHdhbGtlci53aWR0aCgpOworCisgICAgICAgIGlmIChmcm9tWCA9PSAt
MSAmJiBmcm9tIDwgd2Fsa2VyLm51bUNvZGVQb2ludHMoKSkgeworICAgICAgICAgICAgLy8gfGZy
b218IGlzIHdpdGhpbiB0aGlzIHNjcmlwdCBydW4uIFNvIHdlIGluZGV4IHRoZSBjbHVzdGVycyBs
b2cgdG8KKyAgICAgICAgICAgIC8vIGZpbmQgd2hpY2ggZ2x5cGggdGhpcyBjb2RlLXBvaW50IGNv
bnRyaWJ1dGVkIHRvIGFuZCBmaW5kIGl0J3MgeAorICAgICAgICAgICAgLy8gcG9zaXRpb24uCisg
ICAgICAgICAgICBpbnQgZ2x5cGggPSB3YWxrZXIubG9nQ2x1c3RlcnMoKVtmcm9tXTsKKyAgICAg
ICAgICAgIGZyb21YID0gYmFzZSArIHdhbGtlci54UG9zaXRpb25zKClbZ2x5cGhdOworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIGZyb20gLT0gd2Fsa2VyLm51bUNvZGVQb2ludHMoKTsKKwor
ICAgICAgICBpZiAodG9YID09IC0xICYmIHRvIDwgd2Fsa2VyLm51bUNvZGVQb2ludHMoKSkgewor
ICAgICAgICAgICAgaW50IGdseXBoID0gd2Fsa2VyLmxvZ0NsdXN0ZXJzKClbdG9dOworICAgICAg
ICAgICAgdG9YID0gYmFzZSArIHdhbGtlci54UG9zaXRpb25zKClbZ2x5cGhdOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIHRvIC09IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7CisKKyAgICAg
ICAgaWYgKCF3YWxrZXIucnRsKCkpCisgICAgICAgICAgICBiYXNlICs9IHdhbGtlci53aWR0aCgp
OworICAgICAgICB3YWxrZXIuc2V0WE9mZnNldCgwKTsKKyAgICB9CisKKyAgICAvLyB0aGUgcG9z
aXRpb24gaW4gcXVlc3Rpb24gbWlnaHQgYmUganVzdCBhZnRlciB0aGUgdGV4dAorICAgIGNvbnN0
IGludCByaWdodF9lZGdlID0gd2Fsa2VyLnJ0bCgpID8gd2lkdGggOiBiYXNlOworICAgIGlmIChm
cm9tWCA9PSAtMSAmJiAhZnJvbSkKKyAgICAgICAgZnJvbVggPSByaWdodF9lZGdlOworICAgIGlm
ICh0b1ggPT0gLTEgJiYgIXRvKQorICAgICAgICB0b1ggPSByaWdodF9lZGdlOworCisgICAgQVNT
RVJUKGZyb21YICE9IC0xICYmIHRvWCAhPSAtMSk7CisKKyAgICBpZiAoZnJvbVggPCB0b1gpCisg
ICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZnJvbVgsIHBvaW50LnkoKSwgdG9Y
IC0gZnJvbVgsIGgpOworCisgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyB0b1gsIHBv
aW50LnkoKSwgZnJvbVggLSB0b1gsIGgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNr
aWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTRmNjUKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0hhcmZidXp6U2tp
YS5jcHAKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAi
Rm9udFBsYXRmb3JtRGF0YS5oIgorCisjaW5jbHVkZSAiU2tGb250SG9zdC5oIgorI2luY2x1ZGUg
IlNrUGFpbnQuaCIKKyNpbmNsdWRlICJTa1BhdGguaCIKKyNpbmNsdWRlICJTa1BvaW50LmgiCisj
aW5jbHVkZSAiU2tSZWN0LmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPGhhcmZidXp6LXNo
YXBlci5oPgorfQorCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgY2FsbGJhY2tzIHdoaWNo
IEhhcmZidXp6IHJlcXVpcmVzIGJ5IHVzaW5nIFNraWEKKy8vIGNhbGxzLiBTZWUgdGhlIEhhcmZi
dXp6IHNvdXJjZSBmb3IgcmVmZXJlbmNlcyBhYm91dCB3aGF0IHRoZXNlIGNhbGxiYWNrcyBkby4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgSEJfRml4ZWQgU2tpYVNjYWxhclRvSGFy
ZmJ1enpGaXhlZChTa1NjYWxhciB2KQoreworICAgIC8vIEhCX0ZpeGVkIGlzIGEgMjYuNiBmaXhl
ZCBwb2ludCBmb3JtYXQuCisgICAgcmV0dXJuIHYgKiA2NDsKK30KKworc3RhdGljIEhCX0Jvb2wg
U3RyaW5nVG9HbHlwaHMoSEJfRm9udCBoYkZvbnQsIGNvbnN0IEhCX1VDaGFyMTYqIGNoYXJzLCBo
Yl91aW50MzIgbGVuLCBIQl9HbHlwaCogZ2x5cGhzLCBoYl91aW50MzIqIGdseXBoc1NpemUsIEhC
X0Jvb2wgaXNSVEwpCit7CisgICAgRm9udFBsYXRmb3JtRGF0YSogZm9udCA9IChGb250UGxhdGZv
cm1EYXRhKikgaGJGb250LT51c2VyRGF0YTsKKyAgICBTa1BhaW50IHBhaW50OworCisgICAgZm9u
dC0+c2V0dXBQYWludCgmcGFpbnQpOworICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50
OjprVVRGMTZfVGV4dEVuY29kaW5nKTsKKyAgICBpbnQgbnVtR2x5cGhzID0gcGFpbnQudGV4dFRv
R2x5cGhzKGNoYXJzLCBsZW4gKiBzaXplb2YodWludDE2X3QpLCByZWludGVycHJldF9jYXN0PHVp
bnQxNl90Kj4oZ2x5cGhzKSk7CisKKyAgICAvLyBIQl9HbHlwaCBpcyAzMi1iaXQsIGJ1dCBTa2lh
IG91dHB1dHMgb25seSAxNi1iaXQgbnVtYmVycy4gU28gb3VyCisgICAgLy8gfGdseXBoc3wgYXJy
YXkgbmVlZHMgdG8gYmUgY29udmVydGVkLgorICAgIGZvciAoaW50IGkgPSBudW1HbHlwaHMgLSAx
OyBpID49IDA7IC0taSkgeworICAgICAgICB1aW50MTZfdCB2YWx1ZTsKKyAgICAgICAgLy8gV2Ug
dXNlIGEgbWVtY3B5IHRvIGF2b2lkIGJyZWFraW5nIHN0cmljdCBhbGlhc2luZyBydWxlcy4KKyAg
ICAgICAgbWVtY3B5KCZ2YWx1ZSwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZ2x5cGhzKSAr
IHNpemVvZih1aW50MTZfdCkgKiBpLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgZ2x5cGhz
W2ldID0gdmFsdWU7CisgICAgfQorCisgICAgKmdseXBoc1NpemUgPSBudW1HbHlwaHM7CisgICAg
cmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIEdseXBoc1RvQWR2YW5jZXMoSEJfRm9udCBoYkZv
bnQsIGNvbnN0IEhCX0dseXBoKiBnbHlwaHMsIGhiX3VpbnQzMiBudW1HbHlwaHMsIEhCX0ZpeGVk
KiBhZHZhbmNlcywgaW50IGZsYWdzKQoreworICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSAo
Rm9udFBsYXRmb3JtRGF0YSopIGhiRm9udC0+dXNlckRhdGE7CisgICAgU2tQYWludCBwYWludDsK
KworICAgIGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsKKyAgICBwYWludC5zZXRUZXh0RW5jb2Rp
bmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKKworICAgIHVpbnQxNl90KiBnbHlw
aHMxNiA9ICh1aW50MTZfdCopIGZhc3RNYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIG51bUdseXBo
cyk7CisgICAgaWYgKCFnbHlwaHMxNikKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkKKyAgICAgICAgZ2x5cGhzMTZbaV0gPSBnbHlw
aHNbaV07CisgICAgcGFpbnQuZ2V0VGV4dFdpZHRocyhnbHlwaHMxNiwgbnVtR2x5cGhzICogc2l6
ZW9mKHVpbnQxNl90KSwgcmVpbnRlcnByZXRfY2FzdDxTa1NjYWxhcio+KGFkdmFuY2VzKSk7Cisg
ICAgZmFzdEZyZWUoZ2x5cGhzMTYpOworCisgICAgLy8gVGhlIHxhZHZhbmNlc3wgdmFsdWVzIHdo
aWNoIFNraWEgb3V0cHV0cyBhcmUgU2tTY2FsYXJzLCB3aGljaCBhcmUgZmxvYXRzCisgICAgLy8g
aW4gQ2hyb21pdW0uIEhvd2V2ZXIsIEhhcmZidXp6IHdhbnRzIHRoZW0gaW4gMjYuNiBmaXhlZCBw
b2ludCBmb3JtYXQuCisgICAgLy8gVGhlc2UgdHdvIGZvcm1hdHMgYXJlIGJvdGggMzItYml0cyBs
b25nLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAg
ICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgLy8gV2UgdXNlIGEgbWVtY3B5IHRvIGF2b2lkIGJy
ZWFraW5nIHN0cmljdCBhbGlhc2luZyBydWxlcy4KKyAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgcmVp
bnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYWR2YW5jZXMpICsgc2l6ZW9mKGZsb2F0KSAqIGksIHNp
emVvZihmbG9hdCkpOworICAgICAgICBhZHZhbmNlc1tpXSA9IFNraWFTY2FsYXJUb0hhcmZidXp6
Rml4ZWQodmFsdWUpOworICAgIH0KK30KKworc3RhdGljIEhCX0Jvb2wgQ2FuUmVuZGVyKEhCX0Zv
bnQgaGJGb250LCBjb25zdCBIQl9VQ2hhcjE2KiBjaGFycywgaGJfdWludDMyIGxlbikKK3sKKyAg
ICBGb250UGxhdGZvcm1EYXRhKiBmb250ID0gKEZvbnRQbGF0Zm9ybURhdGEqKSBoYkZvbnQtPnVz
ZXJEYXRhOworICAgIFNrUGFpbnQgcGFpbnQ7CisKKyAgICBmb250LT5zZXR1cFBhaW50KCZwYWlu
dCk7CisgICAgcGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtVVEYxNl9UZXh0RW5jb2Rp
bmcpOworCisgICAgdWludDE2X3QqIGdseXBoczE2ID0gKHVpbnQxNl90KikgZmFzdE1hbGxvYyhz
aXplb2YodWludDE2X3QpICogbGVuKTsKKyAgICBpZiAoIWdseXBoczE2KQorICAgICAgICByZXR1
cm4gMDsKKyAgICBpbnQgbnVtR2x5cGhzID0gcGFpbnQudGV4dFRvR2x5cGhzKGNoYXJzLCBsZW4g
KiBzaXplb2YodWludDE2X3QpLCBnbHlwaHMxNik7CisKKyAgICBib29sIGNhblJlbmRlciA9IHRy
dWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICBp
ZiAoZ2x5cGhzMTZbaV0gPT0gMCkgeworICAgICAgICAgICAgY2FuUmVuZGVyID0gZmFsc2U7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZhc3RGcmVlKGdseXBo
czE2KTsKKyAgICByZXR1cm4gY2FuUmVuZGVyOworfQorCitzdGF0aWMgSEJfRXJyb3IgR2V0T3V0
bGluZVBvaW50KEhCX0ZvbnQgaGJGb250LCBIQl9HbHlwaCBnbHlwaCwgaW50IGZsYWdzLCBoYl91
aW50MzIgcG9pbnQsIEhCX0ZpeGVkKiB4cG9zLCBIQl9GaXhlZCogeXBvcywgaGJfdWludDMyKiBu
UG9pbnRzKQoreworICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSAoRm9udFBsYXRmb3JtRGF0
YSopIGhiRm9udC0+dXNlckRhdGE7CisgICAgU2tQYWludCBwYWludDsKKworICAgIGlmIChmbGFn
cyAmIEhCX1NoYXBlckZsYWdfVXNlRGVzaWduTWV0cmljcykKKyAgICAgICAgcmV0dXJuIChIQl9F
cnJvcikgSEJfRXJyX0ludmFsaWRfQXJndW1lbnQ7ICAvLyBUaGlzIGlzIHJlcXVlc3RpbmcgcHJl
LWhpbnRlZCBwb3NpdGlvbnMuIFdlIGNhbid0IHN1cHBvcnQgdGhpcy4KKworICAgIGZvbnQtPnNl
dHVwUGFpbnQoJnBhaW50KTsKKyAgICBwYWludC5zZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a0ds
eXBoSURfVGV4dEVuY29kaW5nKTsKKyAgICB1aW50MTZfdCBnbHlwaDE2ID0gZ2x5cGg7CisgICAg
U2tQYXRoIHBhdGg7CisgICAgcGFpbnQuZ2V0VGV4dFBhdGgoJmdseXBoMTYsIHNpemVvZihnbHlw
aDE2KSwgMCwgMCwgJnBhdGgpOworICAgIGludCBudW1Qb2ludHMgPSBwYXRoLmdldFBvaW50cyhO
VUxMLCAwKTsKKyAgICBpZiAocG9pbnQgPj0gbnVtUG9pbnRzKQorICAgICAgICByZXR1cm4gKEhC
X0Vycm9yKSBIQl9FcnJfSW52YWxpZF9TdWJUYWJsZTsKKyAgICBTa1BvaW50KiBwb2ludHMgPSAo
U2tQb2ludCopIGZhc3RNYWxsb2Moc2l6ZW9mKFNrUG9pbnQpICogKHBvaW50ICsgMSkpOworICAg
IGlmICghcG9pbnRzKQorICAgICAgICByZXR1cm4gKEhCX0Vycm9yKSBIQl9FcnJfSW52YWxpZF9T
dWJUYWJsZTsKKyAgICBwYXRoLmdldFBvaW50cyhwb2ludHMsIHBvaW50ICsgMSk7CisgICAgKnhw
b3MgPSBTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKHBvaW50c1twb2ludF0uZlgpOworICAgICp5
cG9zID0gU2tpYVNjYWxhclRvSGFyZmJ1enpGaXhlZChwb2ludHNbcG9pbnRdLmZZKTsKKyAgICAq
blBvaW50cyA9IG51bVBvaW50czsKKyAgICBmYXN0RnJlZShwb2ludHMpOworCisgICAgcmV0dXJu
IEhCX0Vycl9PazsKK30KKworc3RhdGljIHZvaWQgR2V0R2x5cGhNZXRyaWNzKEhCX0ZvbnQgaGJG
b250LCBIQl9HbHlwaCBnbHlwaCwgSEJfR2x5cGhNZXRyaWNzKiBtZXRyaWNzKQoreworICAgIEZv
bnRQbGF0Zm9ybURhdGEqIGZvbnQgPSAoRm9udFBsYXRmb3JtRGF0YSopIGhiRm9udC0+dXNlckRh
dGE7CisgICAgU2tQYWludCBwYWludDsKKworICAgIGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsK
KyAgICBwYWludC5zZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5n
KTsKKyAgICB1aW50MTZfdCBnbHlwaDE2ID0gZ2x5cGg7CisgICAgU2tTY2FsYXIgd2lkdGg7Cisg
ICAgU2tSZWN0IGJvdW5kczsKKyAgICBwYWludC5nZXRUZXh0V2lkdGhzKCZnbHlwaDE2LCBzaXpl
b2YoZ2x5cGgxNiksICZ3aWR0aCwgJmJvdW5kcyk7CisKKyAgICBtZXRyaWNzLT54ID0gU2tpYVNj
YWxhclRvSGFyZmJ1enpGaXhlZCh3aWR0aCk7CisgICAgLy8gV2UgY2FuJ3QgYWN0dWFsbHkgZ2V0
IHRoZSB8eXwgY29ycmVjdCBiZWNhdXNlIFNraWEgZG9lc24ndCBleHBvcnQKKyAgICAvLyB0aGUg
dmVydGljYWwgYWR2YW5jZS4gSG93ZXZlciwgbm9yIHdlIGRvIGV2ZXIgcmVuZGVyIHZlcnRpY2Fs
IHRleHQgYXQKKyAgICAvLyB0aGUgbW9tZW50IHNvIGl0J3MgdW5pbXBvcnRhbnQuCisgICAgbWV0
cmljcy0+eSA9IDA7CisgICAgbWV0cmljcy0+d2lkdGggPSBTa2lhU2NhbGFyVG9IYXJmYnV6ekZp
eGVkKGJvdW5kcy53aWR0aCgpKTsKKyAgICBtZXRyaWNzLT5oZWlnaHQgPSBTa2lhU2NhbGFyVG9I
YXJmYnV6ekZpeGVkKGJvdW5kcy5oZWlnaHQoKSk7CisgICAgbWV0cmljcy0+eE9mZnNldCA9IFNr
aWFTY2FsYXJUb0hhcmZidXp6Rml4ZWQoYm91bmRzLmZMZWZ0KTsKKyAgICBtZXRyaWNzLT54T2Zm
c2V0ID0gU2tpYVNjYWxhclRvSGFyZmJ1enpGaXhlZChib3VuZHMuZlRvcCk7Cit9CisKK3N0YXRp
YyBIQl9GaXhlZCBHZXRGb250TWV0cmljKEhCX0ZvbnQgaGJGb250LCBIQl9Gb250TWV0cmljIG1l
dHJpYykKK3sKKyAgICBGb250UGxhdGZvcm1EYXRhKiBmb250ID0gKEZvbnRQbGF0Zm9ybURhdGEq
KSBoYkZvbnQtPnVzZXJEYXRhOworICAgIFNrUGFpbnQgcGFpbnQ7CisKKyAgICBmb250LT5zZXR1
cFBhaW50KCZwYWludCk7CisgICAgU2tQYWludDo6Rm9udE1ldHJpY3Mgc2tpYU1ldHJpY3M7Cisg
ICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3MoJnNraWFNZXRyaWNzKTsKKworICAgIHN3aXRjaCAobWV0
cmljKSB7CisgICAgY2FzZSBIQl9Gb250QXNjZW50OgorICAgICAgICByZXR1cm4gU2tpYVNjYWxh
clRvSGFyZmJ1enpGaXhlZCgtc2tpYU1ldHJpY3MuZkFzY2VudCk7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitIQl9Gb250Q2xhc3MgaGFyZmJ1enpTa2lhQ2xh
c3MgPSB7CisgIFN0cmluZ1RvR2x5cGhzLAorICBHbHlwaHNUb0FkdmFuY2VzLAorICBDYW5SZW5k
ZXIsCisgIEdldE91dGxpbmVQb2ludCwKKyAgR2V0R2x5cGhNZXRyaWNzLAorICBHZXRGb250TWV0
cmljLAorfTsKKworSEJfRXJyb3IgaGFyZmJ1enpTa2lhR2V0VGFibGUodm9pZCogdm9pZGZhY2Us
IGNvbnN0IEhCX1RhZyB0YWcsIEhCX0J5dGUqIGJ1ZmZlciwgSEJfVUludCogbGVuKQoreworICAg
IEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSAoRm9udFBsYXRmb3JtRGF0YSopIHZvaWRmYWNlOwor
CisgICAgY29uc3Qgc2l6ZV90IHRhYmxlU2l6ZSA9IFNrRm9udEhvc3Q6OkdldFRhYmxlU2l6ZShm
b250LT51bmlxdWVJRCgpLCB0YWcpOworICAgIGlmICghdGFibGVTaXplKQorICAgICAgICByZXR1
cm4gKEhCX0Vycm9yKSBIQl9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgICBpZiAoIWJ1ZmZlcikg
eworICAgICAgICAqbGVuID0gdGFibGVTaXplOworICAgICAgICByZXR1cm4gKEhCX0Vycm9yKSBI
Ql9FcnJfT2s7CisgICAgfQorCisgICAgaWYgKCpsZW4gPCB0YWJsZVNpemUpCisgICAgICAgIHJl
dHVybiAoSEJfRXJyb3IpIEhCX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworICAgIFNrRm9udEhvc3Q6
OkdldFRhYmxlRGF0YShmb250LT51bmlxdWVJRCgpLCB0YWcsIDAsIHRhYmxlU2l6ZSwgYnVmZmVy
KTsKKyAgICByZXR1cm4gKEhCX0Vycm9yKSBIQl9FcnJfT2s7Cit9CisKK30gIC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31430</attachid>
            <date>2009-06-17 14:11:48 -0700</date>
            <delta_ts>2009-06-24 14:13:19 -0700</delta_ts>
            <desc>/tmp/patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>28798</size>
            <attacher name="Adam Langley">agl</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OTU1YjhlMy4uZGQ4MjA4MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1MyBAQAorMjAwOS0wNi0xNiAgQWRhbSBMYW5nbGV5
ICA8YWdsQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQ2hyb21pdW06IEFkZCBjb21wbGV4IHRleHQgc3VwcG9ydCBvbiBMaW51eC4K
KworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgY29tcGxleCB0ZXh0IHN1cHBvcnQgb24gTGludXgg
dXNpbmcgSGFyZmJ1enouIEl0J3Mgbm90CisgICAgICAgIHRoZSBmYXN0ZXN0IGNvZGUgcG9zc2li
bGU6IHNvbWUgY2FjaGluZyBvZiBmb250IHRhYmxlcyB3aWxsIGNlcnRhaW5seQorICAgICAgICBi
ZSByZXF1aXJlZC4gSG93ZXZlciwgaXQncyBwcm9iYWJseSB0aGUgc2ltcGxlc3QgY29kZSB0aGF0
IHdvcmtzLgorCisgICAgICAgIE5vdGUgdGhhdCBzdXBwb3J0IGZvciBtYW55IHNjcmlwdHMgaXMg
Y3VycmVudGx5IGhhbXBlcmVkIGJ5IHRoZSBsYWNrCisgICAgICAgIG9mIGdvb2QgZm9udCBmYWxs
YmFjayBpbiB0aGUgY2FzZSBvZiB1bnN1cHBvcnRlZCBjb2RlIHBvaW50cy4gVGhpcworICAgICAg
ICBpc3N1ZSB3aWxsIGJlIGFkZHJlc3NlZCBpbiBhIGZ1dHVyZSBwYXRjaC4KKworICAgICAgICBU
aGlzIHdpbGwgcmVxdWlyZSBjaGVja2luZyBpbiBuZXcgYmFzZWxpbmVzIGluIHRoZSBDaHJvbWl1
bSB0cmVlIGZvcgorICAgICAgICB0aG9zZSBsYXlvdXQgdGVzdHMgd2hpY2ggbm93IHBhc3MuCisK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChX
ZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjp+VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0UnVuV2Fsa2VyOjpyZXNldCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2Vy
OjpzZXRYT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnJ0bCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6bmV4dFNjcmlwdFJ1bik6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpnbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFJ1bldhbGtlcjo6bGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnhQ
b3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6YWR2YW5jZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6d2lkdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dFJ1bldhbGtlcjo6bG9nQ2x1c3RlcnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1
bldhbGtlcjo6bnVtQ29kZVBvaW50cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2Vy
OjpleHBhbmRHbHlwaEFycmF5cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpO
ZXh0UlRMU2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6Ok5leHRM
VFJTY3JpcHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0NvbXBsZXhUZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFyZmJ1enpTa2lhLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKToKKyAgICAgICAg
KFdlYkNvcmU6OlN0cmluZ1RvR2x5cGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoc1RvQWR2
YW5jZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q2FuUmVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdldE91dGxpbmVQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpHZXRHbHlwaE1ldHJpY3MpOgor
ICAgICAgICAoV2ViQ29yZTo6R2V0Rm9udE1ldHJpYyk6CisgICAgICAgIChXZWJDb3JlOjopOgor
ICAgICAgICAoV2ViQ29yZTo6aGFyZmJ1enpTa2lhR2V0VGFibGUpOgorCiAyMDA5LTA2LTE2ICBQ
aWVycmUgZCdIZXJiZW1vbnQgIDxwZGhlcmJlbW9udEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgSm9obiBTdWxsaXZhbgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9Gb250TGludXguY3BwCmluZGV4IGE5NTI2ODUuLjI0ODdjM2YgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHAKQEAgLTQ0LDYg
KzQ0LDExIEBACiAjaW5jbHVkZSAiU2tUeXBlZmFjZS5oIgogI2luY2x1ZGUgIlNrVXRpbHMuaCIK
IAorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiaGFyZmJ1enotc2hhcGVyLmgiCisjaW5jbHVkZSAi
aGFyZmJ1enotdW5pY29kZS5oIgorfQorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGJvb2wgRm9u
dDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCkKQEAgLTExMCwzMSArMTE1
LDQ4NyBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3Qg
U2ltcGxlRm9udERhdGEqIGZvbnQsCiAgICAgfQogfQogCi12b2lkIEZvbnQ6OmRyYXdDb21wbGV4
VGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwKK2V4dGVy
biBjb25zdCBIQl9Gb250Q2xhc3MgaGFyZmJ1enpTa2lhQ2xhc3M7CitleHRlcm4gSEJfRXJyb3Ig
aGFyZmJ1enpTa2lhR2V0VGFibGUodm9pZCogdm9pZGZhY2UsIGNvbnN0IEhCX1RhZyB0YWcsIEhC
X0J5dGUqIGJ1ZmZlciwgSEJfVUludCogbGVuKTsKKworLy8gVGV4dFJ1bldhbGtlciB3YWxrcyBh
IFRleHRSdW4gYW5kIHByZXNlbnRzIGVhY2ggc2NyaXB0IHJ1biBpbiBzZXF1ZW5jZS4gQQorLy8g
VGV4dFJ1biBpcyBhIHNlcXVlbmNlIG9mIGNvZGUtcG9pbnRzIHdpdGggdGhlIHNhbWUgZW1iZWRk
aW5nIGxldmVsIChpLmUuIHRoZXkKKy8vIGFyZSBhbGwgbGVmdC10by1yaWdodCBvciByaWdodC10
by1sZWZ0KS4gQSBzY3JpcHQgcnVuIGlzIGEgc3Vic2VxdWVuY2Ugd2hlcmUKKy8vIGFsbCB0aGUg
Y2hhcmFjdGVycyBoYXZlIHRoZSBzYW1lIHNjcmlwdCAoZS5nLiBBcmFiaWMsIFRoYWkgZXRjKS4g
U2hhcGluZyBpcworLy8gb25seSBldmVyIGRvbmUgd2l0aCBzY3JpcHQgcnVucyBzaW5jZSB0aGUg
c2hhcGVycyBvbmx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAorLy8gYSBzaW5nbGUgc2NyaXB0Lgor
Ly8KKy8vIEFmdGVyIGNyZWF0aW5nIGl0LCB0aGUgc2NyaXB0IHJ1bnMgYXJlIGVpdGhlciBpdGVy
YXRlZCBiYWNrd2FyZHMgb3IgZm9yd2FyZHMuCisvLyBJdCBkZWZhdWx0cyB0byBiYWNrd2FyZHMg
Zm9yIFJUTCBhbmQgZm9yd2FyZHMgb3RoZXJ3aXNlICh3aGljaCBtYXRjaGVzIHRoZQorLy8gcHJl
c2VudGF0aW9uIG9yZGVyKSwgaG93ZXZlciB5b3UgY2FuIHNldCBpdCB3aXRoIHxzZXRCYWNrd2Fy
ZHNJdGVyYXRpb258LgorLy8KKy8vIE9uY2UgeW91IGhhdmUgc2V0dXAgdGhlIG9iamVjdCwgY2Fs
bCB8bmV4dFNjcmlwdFJ1bnwgdG8gZ2V0IHRoZSBmaXJzdCBzY3JpcHQKKy8vIHJ1bi4gVGhpcyB3
aWxsIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpdGVyYXRpb24gaXMgY29tcGxldGUuIEF0IGFueSB0
aW1lIHlvdQorLy8gY2FuIGNhbGwgfHJlc2V0fCB0byBzdGFydCBvdmVyIGFnYWluLgorY2xhc3Mg
VGV4dFJ1bldhbGtlciB7CitwdWJsaWM6CisgICAgVGV4dFJ1bldhbGtlcihjb25zdCBUZXh0UnVu
JiBydW4sIFNrUGFpbnQqIHBhaW50LCB1bnNpZ25lZCBzdGFydGluZ1gsIGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEqIGZvbnQpCisgICAgICAgIDogbV9ydW4ocnVuKQorICAgICAgICAsIG1fcGFpbnQo
cGFpbnQpCisgICAgICAgICwgbV9zdGFydGluZ1goc3RhcnRpbmdYKQorICAgICAgICAsIG1fb2Zm
c2V0WChtX3N0YXJ0aW5nWCkKKyAgICAgICAgLCBtX2l0ZXJhdGVCYWNrd2FyZHMocnVuLnJ0bCgp
KQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZtX2l0ZW0sIDAsIHNpemVvZihtX2l0ZW0pKTsKKyAg
ICAgICAgLy8gV2UgY2Fubm90IGtub3csIGFoZWFkIG9mIHRpbWUsIGhvdyBtYW55IGdseXBocyBh
IGdpdmVuIHNjcmlwdCBydW4KKyAgICAgICAgLy8gd2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vl
c3MgdGhhdCBzY3JpcHQgcnVucyB3aWxsIG5vdCBwcm9kdWNlIG1vcmUKKyAgICAgICAgLy8gdGhh
biB0d2ljZSBhcyBtYW55IGdseXBocyBhcyB0aGVyZSBhcmUgY29kZSBwb2ludHMgYW5kIGZhbGxi
YWNrIGlmCisgICAgICAgIC8vIHdlIGZpbmQgdGhhdCB3ZSBhcmUgd3JvbmcuCisgICAgICAgIG1f
bWF4R2x5cGhzID0gcnVuLmxlbmd0aCgpICogMjsKKyAgICAgICAgY3JlYXRlR2x5cGhBcnJheXMo
KTsKKworICAgICAgICBtX2l0ZW0ubG9nX2NsdXN0ZXJzID0gbmV3IHVuc2lnbmVkIHNob3J0W3J1
bi5sZW5ndGgoKV07CisKKyAgICAgICAgbV9pdGVtLmZhY2UgPSBIQl9OZXdGYWNlKGNvbnN0X2Nh
c3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGZvbnQpLCBoYXJmYnV6elNraWFHZXRUYWJsZSk7CisgICAg
ICAgIG1faXRlbS5mb250ID0gKEhCX0ZvbnRSZWMqKSBmYXN0TWFsbG9jKHNpemVvZihIQl9Gb250
UmVjKSk7CisgICAgICAgIG1lbXNldChtX2l0ZW0uZm9udCwgMCwgc2l6ZW9mKEhCX0ZvbnRSZWMp
KTsKKyAgICAgICAgbV9pdGVtLmZvbnQtPmtsYXNzID0gJmhhcmZidXp6U2tpYUNsYXNzOworICAg
ICAgICBtX2l0ZW0uZm9udC0+dXNlckRhdGEgPSBjb25zdF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEq
Pihmb250KTsKKyAgICAgICAgLy8gVGhlIHZhbHVlcyB3aGljaCBoYXJmYnV6elNraWFDbGFzcyBy
ZXR1cm5zIGFyZSBhbHJlYWR5IHNjYWxlZCB0bworICAgICAgICAvLyBwaXhlbCB1bml0cywgc28g
d2UganVzdCBzZXQgYWxsIHRoZXNlIHRvIG9uZSB0byBkaXNhYmxlIGZ1cnRoZXIKKyAgICAgICAg
Ly8gc2NhbGluZy4KKyAgICAgICAgbV9pdGVtLmZvbnQtPnhfcHBlbSA9IDE7CisgICAgICAgIG1f
aXRlbS5mb250LT55X3BwZW0gPSAxOworICAgICAgICBtX2l0ZW0uZm9udC0+eF9zY2FsZSA9IDE7
CisgICAgICAgIG1faXRlbS5mb250LT55X3NjYWxlID0gMTsKKyAgICAgICAgcGFpbnQtPnNldFRl
eHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2RpbmcpOworCisgICAgICAgIG1f
aXRlbS5zdHJpbmcgPSBydW4uY2hhcmFjdGVycygpOworICAgICAgICBtX2l0ZW0uc3RyaW5nTGVu
Z3RoID0gcnVuLmxlbmd0aCgpOworICAgICAgICBtX2l0ZW0uaXRlbS5iaWRpTGV2ZWwgPSBydW4u
cnRsKCk7CisKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICB+VGV4dFJ1bldhbGtlcigp
CisgICAgeworICAgICAgICBmYXN0RnJlZShtX2l0ZW0uZm9udCk7CisgICAgICAgIGRlbGV0ZUds
eXBoQXJyYXlzKCk7CisgICAgICAgIGRlbGV0ZVtdIG1faXRlbS5sb2dfY2x1c3RlcnM7CisgICAg
ICAgIEhCX0ZyZWVGYWNlKG1faXRlbS5mYWNlKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkK
KyAgICB7CisgICAgICAgIGlmIChtX2l0ZXJhdGVCYWNrd2FyZHMpCisgICAgICAgICAgICBtX2lu
ZGV4T2ZOZXh0U2NyaXB0UnVuID0gbV9ydW4ubGVuZ3RoKCkgLSAxOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gMDsKKyAgICAgICAgbV9vZmZzZXRY
ID0gbV9zdGFydGluZ1g7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSB4IG9mZnNldCBmb3IgdGhl
IG5leHQgc2NyaXB0IHJ1bi4gVGhpcyBhZmZlY3RzIHRoZSB2YWx1ZXMgaW4KKyAgICAvLyB8eFBv
c2l0aW9uc3wKKyAgICB2b2lkIHNldFhPZmZzZXQoaW50IHgpCisgICAgeworICAgICAgICBtX29m
ZnNldFggPSB4OworICAgIH0KKworICAgIGJvb2wgcnRsKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBtX3J1bi5ydGwoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEJhY2t3YXJkc0l0ZXJh
dGlvbihib29sIGlzX2JhY2t3YXJkcykKKyAgICB7CisgICAgICAgIG1faXRlcmF0ZUJhY2t3YXJk
cyA9IGlzX2JhY2t3YXJkczsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBBZHZh
bmNlIHRvIHRoZSBuZXh0IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQg
b2YgdGhlCisgICAgLy8gVGV4dFJ1biBoYXMgYmVlbiByZWFjaGVkLgorICAgIGJvb2wgbmV4dFNj
cmlwdFJ1bigpCisgICAgeworICAgICAgICBpZiAobV9pdGVyYXRlQmFja3dhcmRzKSB7CisgICAg
ICAgICAgICAvLyBJbiByaWdodC10by1sZWZ0IG1vZGUgd2UgbmVlZCB0byByZW5kZXIgdGhlIHNo
YXBlZCBnbHlwaCBiYWNrd2FyZHMgYW5kCisgICAgICAgICAgICAvLyBhbHNvIHJlbmRlciB0aGUg
c2NyaXB0IHJ1bnMgdGhlbXNlbHZlcyBiYWNrd2FyZHMuIFNvIGdpdmVuIGEgVGV4dFJ1bjoKKyAg
ICAgICAgICAgIC8vICAgIEFBQUFBQUFDVFRUVFRUVCAgIChBID0gQXJhYmljLCBDID0gQ29tbW9u
LCBUID0gVGhhaSkKKyAgICAgICAgICAgIC8vIHdlIHJlbmRlcjoKKyAgICAgICAgICAgIC8vICAg
IFRUVFRUVENBQUFBQUFBCisgICAgICAgICAgICAvLyAoYW5kIHRoZSBnbHlwaHMgaW4gZWFjaCBB
LCBDIGFuZCBUIHNlY3Rpb24gYXJlIGJhY2t3YXJkcyB0b28pCisgICAgICAgICAgICBpZiAoIWhi
X3V0ZjE2X3NjcmlwdF9ydW5fcHJldigmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0sIG1f
cnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2NyaXB0UnVu
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCgmbV9udW1Db2RlUG9pbnRzLCAm
bV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2luZGV4
T2ZOZXh0U2NyaXB0UnVuKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKworICAgICAgICBpZiAocnRsKCkpCisgICAgICAgICAgICByZXR1cm4gTmV4dFJUTFNjcmlw
dFJ1bigpOworICAgICAgICByZXR1cm4gTmV4dExUUlNjcmlwdFJ1bigpOworICAgIH0KKworICAg
IGNvbnN0IHVpbnQxNl90KiBnbHlwaHMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
Z2x5cGhzMTY7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5
IHJldHVybmVkIGJ5IHxnbHlwaHN8CisgICAgY29uc3QgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2l0ZW0ubnVtX2dseXBoczsKKyAgICB9CisKKyAgICAv
LyBSZXR1cm4gdGhlIHggb2Zmc2V0IGZvciBlYWNoIG9mIHRoZSBnbHlwaHMuIE5vdGUgdGhhdCB0
aGlzIGlzIHRyYW5zbGF0ZWQKKyAgICAvLyBieSB0aGUgY3VycmVudCB4IG9mZnNldCBhbmQgdGhh
dCB0aGUgeCBvZmZzZXQgaXMgdXBkYXRlZCBmb3IgZWFjaCBzY3JpcHQKKyAgICAvLyBydW4uCisg
ICAgY29uc3QgU2tTY2FsYXIqIHhQb3NpdGlvbnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIG1feHBvczsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGFkdmFuY2VzICh3aWR0aHMpIGZv
ciBlYWNoIGdseXBoLgorICAgIGNvbnN0IEhCX0ZpeGVkKiBhZHZhbmNlcygpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gbV9pdGVtLmFkdmFuY2VzOworICAgIH0KKworICAgIC8vIFJldHVy
biB0aGUgd2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBzY3JpcHQgcnVuLgorICAgIGNvbnN0
IHVuc2lnbmVkIHdpZHRoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3BpeGVsV2lk
dGg7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBjbHVzdGVyIGxvZyBmb3IgdGhlIGN1cnJl
bnQgc2NyaXB0IHJ1bi4gRm9yIGV4YW1wbGU6CisgICAgLy8gICBzY3JpcHQgcnVuOiBmIGkgYSBu
IGMgw6kgIChmaSBnZXRzIGxpZ2F0dXJlZCkKKyAgICAvLyAgIGxvZyBjbHV0cnM6IDAgMCAxIDIg
MyA0CisgICAgLy8gU28sIGZvciBlYWNoIGlucHV0IGNvZGUgcG9pbnQsIHRoZSBsb2cgdGVsbHMg
eW91IHdoaWNoIG91dHB1dCBnbHlwaCB3YXMKKyAgICAvLyBnZW5lcmF0ZWQgZm9yIGl0LgorICAg
IGNvbnN0IHVuc2lnbmVkIHNob3J0KiBsb2dDbHVzdGVycygpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gbV9pdGVtLmxvZ19jbHVzdGVyczsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gdGhl
IG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiB0aGUgY3VycmVudCBzY3JpcHQgcnVuCisgICAgY29u
c3QgdW5zaWduZWQgbnVtQ29kZVBvaW50cygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
bV9udW1Db2RlUG9pbnRzOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGRlbGV0ZUdseXBo
QXJyYXlzKCkKKyAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1faXRlbS5nbHlwaHM7CisgICAgICAg
IGRlbGV0ZVtdIG1faXRlbS5hdHRyaWJ1dGVzOworICAgICAgICBkZWxldGVbXSBtX2l0ZW0uYWR2
YW5jZXM7CisgICAgICAgIGRlbGV0ZVtdIG1faXRlbS5vZmZzZXRzOworICAgICAgICBkZWxldGVb
XSBtX2dseXBoczE2OworICAgICAgICBkZWxldGVbXSBtX3hwb3M7CisgICAgfQorCisgICAgYm9v
bCBjcmVhdGVHbHlwaEFycmF5cygpCisgICAgeworICAgICAgICBtX2l0ZW0uZ2x5cGhzID0gbmV3
IEhCX0dseXBoW21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV9pdGVtLmF0dHJpYnV0ZXMgPSBuZXcg
SEJfR2x5cGhBdHRyaWJ1dGVzW21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV9pdGVtLmFkdmFuY2Vz
ID0gbmV3IEhCX0ZpeGVkW21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV9pdGVtLm9mZnNldHMgPSBu
ZXcgSEJfRml4ZWRQb2ludFttX21heEdseXBoc107CisgICAgICAgIG1fZ2x5cGhzMTYgPSBuZXcg
dWludDE2X3RbbV9tYXhHbHlwaHNdOworICAgICAgICBtX3hwb3MgPSBuZXcgU2tTY2FsYXJbbV9t
YXhHbHlwaHNdOworCisgICAgICAgIHJldHVybiBtX2l0ZW0uZ2x5cGhzCisgICAgICAgICAgICAm
JiBtX2l0ZW0uYXR0cmlidXRlcworICAgICAgICAgICAgJiYgbV9pdGVtLmFkdmFuY2VzCisgICAg
ICAgICAgICAmJiBtX2l0ZW0ub2Zmc2V0cworICAgICAgICAgICAgJiYgbV9nbHlwaHMxNgorICAg
ICAgICAgICAgJiYgbV94cG9zOworICAgIH0KKworICAgIGJvb2wgZXhwYW5kR2x5cGhBcnJheXMo
KQorICAgIHsKKyAgICAgICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKKyAgICAgICAgbV9tYXhHbHlw
aHMgPDw9IDE7CisgICAgICAgIHJldHVybiBjcmVhdGVHbHlwaEFycmF5cygpOworICAgIH0KKwor
ICAgIGJvb2wgTmV4dFJUTFNjcmlwdFJ1bigpCisgICAgeworICAgICAgICBmb3IgKDs7KSB7Cisg
ICAgICAgICAgICBtX2l0ZW0ubnVtX2dseXBocyA9IG1fbWF4R2x5cGhzOworICAgICAgICAgICAg
SEJfU2hhcGVJdGVtKCZtX2l0ZW0pOworICAgICAgICAgICAgaWYgKG1faXRlbS5udW1fZ2x5cGhz
IDwgbV9tYXhHbHlwaHMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8v
IFdlIG92ZXJmbG93ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KKyAgICAgICAgICAg
IGlmICghZXhwYW5kR2x5cGhBcnJheXMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKworICAgICAgICBIQl9GaXhlZCBhZHZfc3VtID0gMDsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG1faXRlbS5udW1fZ2x5cGhzOyArK2kpIHsKKyAgICAgICAg
ICAgIG1fZ2x5cGhzMTZbaV0gPSBtX2l0ZW0uZ2x5cGhzW2ldOworICAgICAgICAgICAgYWR2X3N1
bSArPSBtX2l0ZW0uYWR2YW5jZXNbaV0gPj4gNjsKKyAgICAgICAgfQorICAgICAgICBtX3BpeGVs
V2lkdGggPSBhZHZfc3VtOworICAgICAgICBhZHZfc3VtICs9IG1fb2Zmc2V0WDsKKyAgICAgICAg
bV9vZmZzZXRYICs9IG1fcGl4ZWxXaWR0aDsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbV9pdGVtLm51bV9nbHlwaHM7ICsraSkgeworICAgICAgICAgICAgYWR2X3N1bSAtPSBt
X2l0ZW0uYWR2YW5jZXNbaV0gPj4gNjsKKyAgICAgICAgICAgIG1feHBvc1tpXSA9IGFkdl9zdW07
CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIE5l
eHRMVFJTY3JpcHRSdW4oKQorICAgIHsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAg
bV9pdGVtLm51bV9nbHlwaHMgPSBtX21heEdseXBoczsKKyAgICAgICAgICAgIEhCX1NoYXBlSXRl
bSgmbV9pdGVtKTsKKyAgICAgICAgICAgIGlmIChtX2l0ZW0ubnVtX2dseXBocyA8IG1fbWF4R2x5
cGhzKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBXZSBvdmVyZmxv
d2VkIG91ciBhcnJheXMuIFJlc2l6ZSBhbmQgcmV0cnkuCisgICAgICAgICAgICBpZiAoIWV4cGFu
ZEdseXBoQXJyYXlzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisKKyAgICAgICAgbV9waXhlbFdpZHRoID0gMDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG1faXRlbS5udW1fZ2x5cGhzOyArK2kpIHsKKyAgICAgICAgICAgIG1fZ2x5cGhzMTZb
aV0gPSBtX2l0ZW0uZ2x5cGhzW2ldOworICAgICAgICAgICAgbV94cG9zW2ldID0gbV9vZmZzZXRY
OworICAgICAgICAgICAgbV9vZmZzZXRYICs9IG1faXRlbS5hZHZhbmNlc1tpXSA+PiA2OworICAg
ICAgICAgICAgbV9waXhlbFdpZHRoICs9IG1faXRlbS5hZHZhbmNlc1tpXSA+PiA2OworICAgICAg
ICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgVGV4dFJ1biYg
bV9ydW47CisgICAgSEJfU2hhcGVySXRlbSBtX2l0ZW07CisgICAgdWludDE2X3QqIG1fZ2x5cGhz
MTY7ICAvLyBhIHZlY3RvciBvZiAxNi1iaXQgZ2x5cGggaWRzCisgICAgU2tTY2FsYXIqIG1feHBv
czsgIC8vIGEgdmVjdG9yIG9mIHggcG9zaXRpb25zIGZvciBlYWNoIGdseXBoCisgICAgU2tQYWlu
dCogY29uc3QgbV9wYWludDsKKyAgICBzc2l6ZV90IG1faW5kZXhPZk5leHRTY3JpcHRSdW47ICAv
LyBpbmRleGVzIHRoZSBzY3JpcHQgcnVuIGluIHxtX3J1bnwKKyAgICBjb25zdCB1bnNpZ25lZCBt
X3N0YXJ0aW5nWDsKKyAgICB1bnNpZ25lZCBtX29mZnNldFg7CisgICAgdW5zaWduZWQgbV9waXhl
bFdpZHRoOyAgLy8gd2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBzY3JpcHQgcnVuCisgICAg
dW5zaWduZWQgbV9udW1Db2RlUG9pbnRzOyAgLy8gY29kZSBwb2ludHMgaW4gY3VycmVudCBzY3Jp
cHQgcnVuCisgICAgdW5zaWduZWQgbV9tYXhHbHlwaHM7CisgICAgYm9vbCBtX2l0ZXJhdGVCYWNr
d2FyZHM7Cit9OworCit2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQq
IGdjLCBjb25zdCBUZXh0UnVuJiBydW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKLSAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIGlmIChydW4ubGVuZ3RoKCkgPT0gMCkKKyAgICAgIHJldHVybjsK
KworICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIGZvbnQgPSBmb250RGF0YUZvckNoYXJhY3Rl
cnMocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIo
JyAnKS0+cGxhdGZvcm1EYXRhKCk7CisgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIHBnYyA9
IGdjLT5wbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIFNrQ2FudmFzKiBjYW52YXMgPSBwZ2MtPmNh
bnZhcygpOworICAgIGludCB0ZXh0TW9kZSA9IHBnYy0+Z2V0VGV4dERyYXdpbmdNb2RlKCk7Cisg
ICAgYm9vbCBmaWxsID0gdGV4dE1vZGUgJiBjVGV4dEZpbGw7CisgICAgYm9vbCBzdHJva2UgPSAo
dGV4dE1vZGUgJiBjVGV4dFN0cm9rZSkKKyAgICAgICAgICAgICAgICYmIHBnYy0+Z2V0U3Ryb2tl
U3R5bGUoKSAhPSBOb1N0cm9rZQorICAgICAgICAgICAgICAgJiYgcGdjLT5nZXRTdHJva2VUaGlj
a25lc3MoKSA+IDA7CisKKyAgICBpZiAoIWZpbGwgJiYgIXN0cm9rZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgU2tQYWludCBzdHJva2VQYWludCwgZmlsbFBhaW50OworICAgIGlmIChmaWxsKSB7
CisgICAgICAgIHBnYy0+c2V0dXBQYWludEZvckZpbGxpbmcoJmZpbGxQYWludCk7CisgICAgICAg
IGZvbnQuc2V0dXBQYWludCgmZmlsbFBhaW50KTsKKyAgICAgICAgZmlsbFBhaW50LnNldFRleHRF
bmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2RpbmcpOworICAgICAgICBmaWxsUGFp
bnQuc2V0Q29sb3IoZ2MtPmZpbGxDb2xvcigpLnJnYigpKTsKKyAgICB9CisgICAgaWYgKHN0cm9r
ZSkgeworICAgICAgICBwZ2MtPnNldHVwUGFpbnRGb3JTdHJva2luZygmc3Ryb2tlUGFpbnQsIDAs
IDApOworICAgICAgICBmb250LnNldHVwUGFpbnQoJnN0cm9rZVBhaW50KTsKKyAgICAgICAgc3Ry
b2tlUGFpbnQuc2V0RmxhZ3MoU2tQYWludDo6a0FudGlBbGlhc19GbGFnKTsKKyAgICAgICAgc3Ry
b2tlUGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGluZyk7
CisgICAgICAgIHN0cm9rZVBhaW50LnNldENvbG9yKGdjLT5zdHJva2VDb2xvcigpLnJnYigpKTsK
KyAgICB9CisKKyAgICBUZXh0UnVuV2Fsa2VyIHdhbGtlcihydW4sIHN0cm9rZSA/ICZzdHJva2VQ
YWludCA6ICZmaWxsUGFpbnQsIHBvaW50LngoKSwgJmZvbnQpOworCisgICAgd2hpbGUgKHdhbGtl
ci5uZXh0U2NyaXB0UnVuKCkpIHsKKyAgICAgICAgaWYgKGZpbGwpCisgICAgICAgICAgICBjYW52
YXMtPmRyYXdQb3NUZXh0SCh3YWxrZXIuZ2x5cGhzKCksIHdhbGtlci5sZW5ndGgoKSA8PCAxLCB3
YWxrZXIueFBvc2l0aW9ucygpLCBwb2ludC55KCksIGZpbGxQYWludCk7CisgICAgICAgIGlmIChz
dHJva2UpCisgICAgICAgICAgICBjYW52YXMtPmRyYXdQb3NUZXh0SCh3YWxrZXIuZ2x5cGhzKCks
IHdhbGtlci5sZW5ndGgoKSA8PCAxLCB3YWxrZXIueFBvc2l0aW9ucygpLCBwb2ludC55KCksIHN0
cm9rZVBhaW50KTsKKyAgICB9CiB9CiAKIGZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4
VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiog
LyogZmFsbGJhY2tGb250cyAqLykgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAg
IHJldHVybiAwOworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0
YSYgZm9udCA9IGZvbnREYXRhRm9yQ2hhcmFjdGVycyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVu
Z3RoKCkpLT5mb250RGF0YUZvckNoYXJhY3RlcignICcpLT5wbGF0Zm9ybURhdGEoKTsKKyAgICBm
b250LnNldHVwUGFpbnQoJnBhaW50KTsKKworICAgIFRleHRSdW5XYWxrZXIgd2Fsa2VyKHJ1biwg
JnBhaW50LCAwLCAmZm9udCk7CisKKyAgICBmbG9hdCB3aWR0aCA9IDA7CisgICAgd2hpbGUgKHdh
bGtlci5uZXh0U2NyaXB0UnVuKCkpCisgICAgICAgIHdpZHRoICs9IHdhbGtlci53aWR0aCgpOwor
CisgICAgcmV0dXJuIHdpZHRoOwogfQogCisvLyBSZXR1cm4gdGhlIGNvZGUgcG9pbnQgaW5kZXgg
Zm9yIHRoZSBnaXZlbiB8eHwgb2Zmc2V0IGludG8gdGhlIHRleHQgcnVuLgogaW50IEZvbnQ6Om9m
ZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZVBh
cnRpYWxHbHlwaHMpIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4g
MDsKKyAgICAvLyAoTWFjIGNvZGUgaWdub3JlcyBpbmNsdWRlUGFydGlhbEdseXBocywgYW5kIHRo
ZXkgZG9uJ3Qga25vdyB3aGF0IGl0J3MKKyAgICAvLyBzdXBwb3NlZCB0byBkbywgc28gd2UganVz
dCBpZ25vcmUgaXQgYXMgd2VsbC4pCisgICAgU2tQYWludCBwYWludDsKKyAgICBjb25zdCBGb250
UGxhdGZvcm1EYXRhJiBmb250ID0gZm9udERhdGFGb3JDaGFyYWN0ZXJzKHJ1bi5jaGFyYWN0ZXJz
KCksIHJ1bi5sZW5ndGgoKSktPmZvbnREYXRhRm9yQ2hhcmFjdGVyKCcgJyktPnBsYXRmb3JtRGF0
YSgpOworICAgIGZvbnQuc2V0dXBQYWludCgmcGFpbnQpOworCisgICAgVGV4dFJ1bldhbGtlciB3
YWxrZXIocnVuLCAmcGFpbnQsIDAsICZmb250KTsKKworICAgIC8vIElmIHRoaXMgaXMgUlRMIHRl
eHQsIHRoZSBmaXJzdCBnbHlwaCBmcm9tIHRoZSBsZWZ0IGlzIGFjdHVhbGx5IHRoZSBsYXN0Cisg
ICAgLy8gY29kZSBwb2ludC4gU28gd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGNvZGUgcG9pbnRz
IHRoZXJlIGFyZSB0b3RhbCBpbgorICAgIC8vIG9yZGVyIHRvIHN1YnRyYWN0LiBUaGlzIGlzIGRp
ZmZlcmVudCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIFRleHRSdW4KKyAgICAvLyBiZWNhdXNlIFVU
Ri0xNiBzdXJyb2dhdGUgcGFpcnMgYXJlIGEgc2luZ2xlIGNvZGUgcG9pbnQsIGJ1dCAzMi1iaXRz
IGxvbmcuCisgICAgLy8gSW4gTFRSIHdlIGxlYXZlIHRoaXMgYXMgMCBzbyB0aGF0IHdlIGdldCB0
aGUgY29ycmVjdCB2YWx1ZSBmb3IKKyAgICAvLyB8YmFzZVBvc2l0aW9ufCwgYmVsb3cuCisgICAg
dW5zaWduZWQgdG90YWxDb2RlUG9pbnRzID0gMDsKKyAgICBpZiAod2Fsa2VyLnJ0bCgpKSB7Cisg
ICAgICAgIHNzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IHJ1bi5s
ZW5ndGgoKSkgeworICAgICAgICAgICAgdXRmMTZfdG9fY29kZV9wb2ludChydW4uY2hhcmFjdGVy
cygpLCBydW4ubGVuZ3RoKCksICZvZmZzZXQpOworICAgICAgICAgICAgdG90YWxDb2RlUG9pbnRz
Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCBiYXNlUG9zaXRpb24gPSB0b3Rh
bENvZGVQb2ludHM7CisKKyAgICAvLyBGb3IgUlRMOgorICAgIC8vICAgY29kZS1wb2ludCBvcmRl
cjogIGFiY2QgZWZnIGhpamtsCisgICAgLy8gICBvbiBzY3JlZW46ICAgICAgICAgbGtqaWggZ2Zl
IGRjYmEKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgIF4KKyAgICAv
LyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgICAvLyAgICAgICAgICAg
ICAgICAgIGJhc2VQb3NpdGlvbi0tfCAgIHwKKyAgICAvLyAgICAgICAgICAgICAgICAgdG90YWxD
b2RlUG9pbnRzLS0tLXwKKyAgICAvLyBTaW5jZSBiYXNlUG9zaXRpb24gaXMgY3VycmVudGx5IHRo
ZSB0b3RhbCBudW1iZXIgb2YgY29kZS1wb2ludHMsIHRoZQorICAgIC8vIGZpcnN0IHRoaW5nIHdl
IGRvIGlzIGRlY3JlbWVudCBpdCBzbyB0aGF0IGl0J3MgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9m
CisgICAgLy8gdGhlIGN1cnJlbnQgc2NyaXB0LXJ1bi4KKyAgICAvLworICAgIC8vIEZvciBMVFIs
IGJhc2VQb3NpdGlvbiBpcyB6ZXJvIHNvIGl0IGFscmVhZHkgcG9pbnRzIHRvIHRoZSBzdGFydCBv
ZiB0aGUKKyAgICAvLyBmaXJzdCBzY3JpcHQgcnVuLgorICAgIHdoaWxlICh3YWxrZXIubmV4dFNj
cmlwdFJ1bigpKSB7CisgICAgICAgIGlmICh3YWxrZXIucnRsKCkpCisgICAgICAgICAgICBiYXNl
UG9zaXRpb24gLT0gd2Fsa2VyLm51bUNvZGVQb2ludHMoKTsKKworICAgICAgICBpZiAoeCA8IHdh
bGtlci53aWR0aCgpKSB7CisgICAgICAgICAgICAvLyBUaGUgeCB2YWx1ZSBpbiBxdWVzdGlvbiBp
cyB3aXRoaW4gdGhpcyBzY3JpcHQgcnVuLiBXZSBjb25zaWRlcgorICAgICAgICAgICAgLy8gZWFj
aCBnbHlwaCBpbiBwcmVzZW50YXRpb24gb3JkZXIgYW5kIHN0b3Agd2hlbiB3ZSBmaW5kIHRoZSBv
bmUKKyAgICAgICAgICAgIC8vIGNvdmVyaW5nIHRoaXMgcG9zaXRpb24uCisgICAgICAgICAgICBj
b25zdCBIQl9GaXhlZCogYWR2YW5jZXMgPSB3YWxrZXIuYWR2YW5jZXMoKTsKKyAgICAgICAgICAg
IGludCBnbHlwaEluZGV4OworICAgICAgICAgICAgaWYgKHdhbGtlci5ydGwoKSkgeworICAgICAg
ICAgICAgICAgIGZvciAoZ2x5cGhJbmRleCA9IHdhbGtlci5sZW5ndGgoKSAtIDE7IGdseXBoSW5k
ZXggPj0gMDsgLS1nbHlwaEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh4IDwgYWR2
YW5jZXNbZ2x5cGhJbmRleF0gPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgICAgICB4IC09IGFkdmFuY2VzW2dseXBoSW5kZXhdID4+IDY7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3Ig
KGdseXBoSW5kZXggPSAwOyBnbHlwaEluZGV4IDwgd2Fsa2VyLmxlbmd0aCgpOyArK2dseXBoSW5k
ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCBhZHZhbmNlc1tnbHlwaEluZGV4XSA+
PiA2KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAg
IHggLT0gYWR2YW5jZXNbZ2x5cGhJbmRleF0gPj4gNjsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBnbHlwaCBpbmRl
eCwgd2UgaGF2ZSB0byB0dXJuIHRoYXQgaW50byBhCisgICAgICAgICAgICAvLyBjb2RlLXBvaW50
IGluZGV4LiBCZWNhdXNlIG9mIGxpZ2F0dXJlcywgc2V2ZXJhbCBjb2RlLXBvaW50cyBtYXkKKyAg
ICAgICAgICAgIC8vIGhhdmUgZ29uZSBpbnRvIGEgc2luZ2xlIGdseXBoLiBXZSBpdGVyYXRlIG92
ZXIgdGhlIGNsdXN0ZXJzIGxvZworICAgICAgICAgICAgLy8gYW5kIGZpbmQgdGhlIGZpcnN0IGNv
ZGUtcG9pbnQgd2hpY2ggY29udHJpYnV0ZWQgdG8gdGhlIGdseXBoLgorICAgICAgICAgICAgY29u
c3QgdW5zaWduZWQgc2hvcnQqIGxvZyA9IHdhbGtlci5sb2dDbHVzdGVycygpOworICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7ICsraikg
eworICAgICAgICAgICAgICAgIGlmIChsb2dbal0gPT0gZ2x5cGhJbmRleCkKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGJhc2VQb3NpdGlvbiArIGo7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICB4IC09IHdhbGtlci53
aWR0aCgpOworCisgICAgICAgIGlmICghd2Fsa2VyLnJ0bCgpKQorICAgICAgICAgICAgYmFzZVBv
c2l0aW9uICs9IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7CisgICAgfQorCisgICAgcmV0dXJuIGJh
c2VQb3NpdGlvbjsKIH0KIAorLy8gUmV0dXJuIHRoZSByZWN0YW5nbGUgZm9yIHNlbGVjdGluZyB0
aGUgZ2l2ZW4gcmFuZ2Ugb2YgY29kZS1wb2ludHMgaW4gdGhlCisvLyBUZXh0UnVuLgogRmxvYXRS
ZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4s
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFBv
aW50JiBwb2ludCwgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsK
LSAgICByZXR1cm4gRmxvYXRSZWN0KCk7CisgICAgU2tQYWludCBwYWludDsKKyAgICBjb25zdCBG
b250UGxhdGZvcm1EYXRhJiBmb250ID0gZm9udERhdGFGb3JDaGFyYWN0ZXJzKHJ1bi5jaGFyYWN0
ZXJzKCksIHJ1bi5sZW5ndGgoKSktPmZvbnREYXRhRm9yQ2hhcmFjdGVyKCcgJyktPnBsYXRmb3Jt
RGF0YSgpOworICAgIGZvbnQuc2V0dXBQYWludCgmcGFpbnQpOworCisgICAgaW50IGZyb21YID0g
LTEsIHRvWCA9IC0xOworCisgICAgLy8gRm9yIFJUTCB3ZSdsbCBuZWVkIHRvIGtub3cgdGhlIHdp
ZHRoIG9mIHRoZSBmdWxsIFRleHRSdW4uCisgICAgVGV4dFJ1bldhbGtlciB3YWxrZXIocnVuLCAm
cGFpbnQsIDAsICZmb250KTsKKyAgICBmbG9hdCB3aWR0aCA9IDA7CisgICAgaWYgKHdhbGtlci5y
dGwoKSkgeworICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHRTY3JpcHRSdW4oKSkKKyAgICAgICAg
ICAgIHdpZHRoICs9IHdhbGtlci53aWR0aCgpOworICAgIH0KKworICAgIC8vIFdlIHdhbnQgdG8g
ZW51bWVyYXRlIHRoZSBzY3JpcHQgcnVucyBpbiBjb2RlIHBvaW50IG9yZGVyIGluIHRoZSBmb2xs
b3dpbmcKKyAgICAvLyBjb2RlLiBUaGlzIGNhbGwgYWxzbyByZXNldHMgfHdhbGtlcnwuCisgICAg
d2Fsa2VyLnNldEJhY2t3YXJkc0l0ZXJhdGlvbihmYWxzZSk7CisgICAgLy8gVGV4dFJ1bldhbGtl
ciB3aWxsIGhlbHBmdWxseSBhY2N1bHVsYXRlIHRoZSB4IG9mZnNldHMgZm9yIGRpZmZlcmVudAor
ICAgIC8vIHNjcmlwdCBydW5zIGZvciB1cy4gRm9yIHRoaXMgY29kZSwgaG93ZXZlciwgd2UgYWx3
YXlzIHdhbnQgdGhlIHggb2Zmc2V0cworICAgIC8vIHRvIHN0YXJ0IGZyb20gemVybyBzbyB3ZSBj
YWxsIHRoaXMgYmVmb3JlIGVhY2ggc2NyaXB0IHJ1bi4KKyAgICB3YWxrZXIuc2V0WE9mZnNldCgw
KTsKKworICAgIC8vIEJhc2Ugd2lsbCBwb2ludCB0byB0aGUgeCBvZmZzZXQgZm9yIHRoZSBjdXJy
ZW50IHNjcmlwdCBydW4uIE5vdGUgdGhhdCwgaW4KKyAgICAvLyB0aGUgTFRSIGNhc2UsIHdpZHRo
IHdpbGwgYmUgMC4KKyAgICBpbnQgYmFzZSA9IHdpZHRoOworCisgICAgd2hpbGUgKHdhbGtlci5u
ZXh0U2NyaXB0UnVuKCkgJiYgKGZyb21YID09IC0xIHx8IHRvWCA9PSAtMSkpIHsKKyAgICAgICAg
aWYgKHdhbGtlci5ydGwoKSkKKyAgICAgICAgICAgIGJhc2UgLT0gd2Fsa2VyLndpZHRoKCk7CisK
KyAgICAgICAgaWYgKGZyb21YID09IC0xICYmIGZyb20gPCB3YWxrZXIubnVtQ29kZVBvaW50cygp
KSB7CisgICAgICAgICAgICAvLyB8ZnJvbXwgaXMgd2l0aGluIHRoaXMgc2NyaXB0IHJ1bi4gU28g
d2UgaW5kZXggdGhlIGNsdXN0ZXJzIGxvZyB0bworICAgICAgICAgICAgLy8gZmluZCB3aGljaCBn
bHlwaCB0aGlzIGNvZGUtcG9pbnQgY29udHJpYnV0ZWQgdG8gYW5kIGZpbmQgaXQncyB4CisgICAg
ICAgICAgICAvLyBwb3NpdGlvbi4KKyAgICAgICAgICAgIGludCBnbHlwaCA9IHdhbGtlci5sb2dD
bHVzdGVycygpW2Zyb21dOworICAgICAgICAgICAgZnJvbVggPSBiYXNlICsgd2Fsa2VyLnhQb3Np
dGlvbnMoKVtnbHlwaF07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZnJvbSAtPSB3YWxr
ZXIubnVtQ29kZVBvaW50cygpOworCisgICAgICAgIGlmICh0b1ggPT0gLTEgJiYgdG8gPCB3YWxr
ZXIubnVtQ29kZVBvaW50cygpKSB7CisgICAgICAgICAgICBpbnQgZ2x5cGggPSB3YWxrZXIubG9n
Q2x1c3RlcnMoKVt0b107CisgICAgICAgICAgICB0b1ggPSBiYXNlICsgd2Fsa2VyLnhQb3NpdGlv
bnMoKVtnbHlwaF07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdG8gLT0gd2Fsa2VyLm51
bUNvZGVQb2ludHMoKTsKKworICAgICAgICBpZiAoIXdhbGtlci5ydGwoKSkKKyAgICAgICAgICAg
IGJhc2UgKz0gd2Fsa2VyLndpZHRoKCk7CisgICAgICAgIHdhbGtlci5zZXRYT2Zmc2V0KDApOwor
ICAgIH0KKworICAgIC8vIHRoZSBwb3NpdGlvbiBpbiBxdWVzdGlvbiBtaWdodCBiZSBqdXN0IGFm
dGVyIHRoZSB0ZXh0CisgICAgY29uc3QgaW50IHJpZ2h0X2VkZ2UgPSB3YWxrZXIucnRsKCkgPyB3
aWR0aCA6IGJhc2U7CisgICAgaWYgKGZyb21YID09IC0xICYmICFmcm9tKQorICAgICAgICBmcm9t
WCA9IHJpZ2h0X2VkZ2U7CisgICAgaWYgKHRvWCA9PSAtMSAmJiAhdG8pCisgICAgICAgIHRvWCA9
IHJpZ2h0X2VkZ2U7CisKKyAgICBBU1NFUlQoZnJvbVggIT0gLTEgJiYgdG9YICE9IC0xKTsKKwor
ICAgIGlmIChmcm9tWCA8IHRvWCkKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkg
KyBmcm9tWCwgcG9pbnQueSgpLCB0b1ggLSBmcm9tWCwgaCk7CisKKyAgICByZXR1cm4gRmxvYXRS
ZWN0KHBvaW50LngoKSArIHRvWCwgcG9pbnQueSgpLCBmcm9tWCAtIHRvWCwgaCk7CiB9CiAKIH0g
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0hhcmZidXp6U2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0hhcmZidXp6U2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uMzY2NWNmYwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vSGFyZmJ1enpTa2lhLmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENv
cHlyaWdodCAoYykgMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisKKyNpbmNsdWRlICJGb250UGxhdGZvcm1EYXRhLmgiCisKKyNpbmNsdWRlICJT
a0ZvbnRIb3N0LmgiCisjaW5jbHVkZSAiU2tQYWludC5oIgorI2luY2x1ZGUgIlNrUGF0aC5oIgor
I2luY2x1ZGUgIlNrUG9pbnQuaCIKKyNpbmNsdWRlICJTa1JlY3QuaCIKKworZXh0ZXJuICJDIiB7
CisjaW5jbHVkZSA8aGFyZmJ1enotc2hhcGVyLmg+Cit9CisKKy8vIFRoaXMgZmlsZSBpbXBsZW1l
bnRzIHRoZSBjYWxsYmFja3Mgd2hpY2ggSGFyZmJ1enogcmVxdWlyZXMgYnkgdXNpbmcgU2tpYQor
Ly8gY2FsbHMuIFNlZSB0aGUgSGFyZmJ1enogc291cmNlIGZvciByZWZlcmVuY2VzIGFib3V0IHdo
YXQgdGhlc2UgY2FsbGJhY2tzIGRvLgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBI
Ql9GaXhlZCBTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKFNrU2NhbGFyIHYpCit7CisgICAgLy8g
SEJfRml4ZWQgaXMgYSAyNi42IGZpeGVkIHBvaW50IGZvcm1hdC4KKyAgICByZXR1cm4gdiAqIDY0
OworfQorCitzdGF0aWMgSEJfQm9vbCBTdHJpbmdUb0dseXBocyhIQl9Gb250IGhiRm9udCwgY29u
c3QgSEJfVUNoYXIxNiogY2hhcnMsIGhiX3VpbnQzMiBsZW4sIEhCX0dseXBoKiBnbHlwaHMsIGhi
X3VpbnQzMiogZ2x5cGhzU2l6ZSwgSEJfQm9vbCBpc1JUTCkKK3sKKyAgICBGb250UGxhdGZvcm1E
YXRhKiBmb250ID0gKEZvbnRQbGF0Zm9ybURhdGEqKSBoYkZvbnQtPnVzZXJEYXRhOworICAgIFNr
UGFpbnQgcGFpbnQ7CisKKyAgICBmb250LT5zZXR1cFBhaW50KCZwYWludCk7CisgICAgcGFpbnQu
c2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtVVEYxNl9UZXh0RW5jb2RpbmcpOworICAgIGludCBu
dW1HbHlwaHMgPSBwYWludC50ZXh0VG9HbHlwaHMoY2hhcnMsIGxlbiAqIHNpemVvZih1aW50MTZf
dCksIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihnbHlwaHMpKTsKKworICAgIC8vIEhCX0ds
eXBoIGlzIDMyLWJpdCwgYnV0IFNraWEgb3V0cHV0cyBvbmx5IDE2LWJpdCBudW1iZXJzLiBTbyBv
dXIKKyAgICAvLyB8Z2x5cGhzfCBhcnJheSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQuCisgICAgZm9y
IChpbnQgaSA9IG51bUdseXBocyAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIHVpbnQxNl90
IHZhbHVlOworICAgICAgICAvLyBXZSB1c2UgYSBtZW1jcHkgdG8gYXZvaWQgYnJlYWtpbmcgc3Ry
aWN0IGFsaWFzaW5nIHJ1bGVzLgorICAgICAgICBtZW1jcHkoJnZhbHVlLCByZWludGVycHJldF9j
YXN0PHVpbnQ4X3QqPihnbHlwaHMpICsgc2l6ZW9mKHVpbnQxNl90KSAqIGksIHNpemVvZih1aW50
MTZfdCkpOworICAgICAgICBnbHlwaHNbaV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICAqZ2x5cGhz
U2l6ZSA9IG51bUdseXBoczsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgR2x5cGhz
VG9BZHZhbmNlcyhIQl9Gb250IGhiRm9udCwgY29uc3QgSEJfR2x5cGgqIGdseXBocywgaGJfdWlu
dDMyIG51bUdseXBocywgSEJfRml4ZWQqIGFkdmFuY2VzLCBpbnQgZmxhZ3MpCit7CisgICAgRm9u
dFBsYXRmb3JtRGF0YSogZm9udCA9IChGb250UGxhdGZvcm1EYXRhKikgaGJGb250LT51c2VyRGF0
YTsKKyAgICBTa1BhaW50IHBhaW50OworCisgICAgZm9udC0+c2V0dXBQYWludCgmcGFpbnQpOwor
ICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2Rpbmcp
OworCisgICAgdWludDE2X3QqIGdseXBoczE2ID0gKHVpbnQxNl90KikgZmFzdE1hbGxvYyhzaXpl
b2YodWludDE2X3QpICogbnVtR2x5cGhzKTsKKyAgICBpZiAoIWdseXBoczE2KQorICAgICAgICBy
ZXR1cm47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUdseXBoczsgKytpKQorICAg
ICAgICBnbHlwaHMxNltpXSA9IGdseXBoc1tpXTsKKyAgICBwYWludC5nZXRUZXh0V2lkdGhzKGds
eXBoczE2LCBudW1HbHlwaHMgKiBzaXplb2YodWludDE2X3QpLCByZWludGVycHJldF9jYXN0PFNr
U2NhbGFyKj4oYWR2YW5jZXMpKTsKKyAgICBmYXN0RnJlZShnbHlwaHMxNik7CisKKyAgICAvLyBU
aGUgfGFkdmFuY2VzfCB2YWx1ZXMgd2hpY2ggU2tpYSBvdXRwdXRzIGFyZSBTa1NjYWxhcnMsIHdo
aWNoIGFyZSBmbG9hdHMKKyAgICAvLyBpbiBDaHJvbWl1bS4gSG93ZXZlciwgSGFyZmJ1enogd2Fu
dHMgdGhlbSBpbiAyNi42IGZpeGVkIHBvaW50IGZvcm1hdC4KKyAgICAvLyBUaGVzZSB0d28gZm9y
bWF0cyBhcmUgYm90aCAzMi1iaXRzIGxvbmcuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG51bUdseXBoczsgKytpKSB7CisgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICAvLyBXZSB1
c2UgYSBtZW1jcHkgdG8gYXZvaWQgYnJlYWtpbmcgc3RyaWN0IGFsaWFzaW5nIHJ1bGVzLgorICAg
ICAgICBtZW1jcHkoJnZhbHVlLCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihhZHZhbmNlcykg
KyBzaXplb2YoZmxvYXQpICogaSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGFkdmFuY2VzW2ld
ID0gU2tpYVNjYWxhclRvSGFyZmJ1enpGaXhlZCh2YWx1ZSk7CisgICAgfQorfQorCitzdGF0aWMg
SEJfQm9vbCBDYW5SZW5kZXIoSEJfRm9udCBoYkZvbnQsIGNvbnN0IEhCX1VDaGFyMTYqIGNoYXJz
LCBoYl91aW50MzIgbGVuKQoreworICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSAoRm9udFBs
YXRmb3JtRGF0YSopIGhiRm9udC0+dXNlckRhdGE7CisgICAgU2tQYWludCBwYWludDsKKworICAg
IGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsKKyAgICBwYWludC5zZXRUZXh0RW5jb2RpbmcoU2tQ
YWludDo6a1VURjE2X1RleHRFbmNvZGluZyk7CisKKyAgICB1aW50MTZfdCogZ2x5cGhzMTYgPSAo
dWludDE2X3QqKSBmYXN0TWFsbG9jKHNpemVvZih1aW50MTZfdCkgKiBsZW4pOworICAgIGlmICgh
Z2x5cGhzMTYpCisgICAgICAgIHJldHVybiAwOworICAgIGludCBudW1HbHlwaHMgPSBwYWludC50
ZXh0VG9HbHlwaHMoY2hhcnMsIGxlbiAqIHNpemVvZih1aW50MTZfdCksIGdseXBoczE2KTsKKwor
ICAgIGJvb2wgY2FuUmVuZGVyID0gdHJ1ZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUds
eXBoczsgKytpKSB7CisgICAgICAgIGlmIChnbHlwaHMxNltpXSA9PSAwKSB7CisgICAgICAgICAg
ICBjYW5SZW5kZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
fQorCisgICAgZmFzdEZyZWUoZ2x5cGhzMTYpOworICAgIHJldHVybiBjYW5SZW5kZXI7Cit9CisK
K3N0YXRpYyBIQl9FcnJvciBHZXRPdXRsaW5lUG9pbnQoSEJfRm9udCBoYkZvbnQsIEhCX0dseXBo
IGdseXBoLCBpbnQgZmxhZ3MsIGhiX3VpbnQzMiBwb2ludCwgSEJfRml4ZWQqIHhwb3MsIEhCX0Zp
eGVkKiB5cG9zLCBoYl91aW50MzIqIG5Qb2ludHMpCit7CisgICAgRm9udFBsYXRmb3JtRGF0YSog
Zm9udCA9IChGb250UGxhdGZvcm1EYXRhKikgaGJGb250LT51c2VyRGF0YTsKKyAgICBTa1BhaW50
IHBhaW50OworCisgICAgaWYgKGZsYWdzICYgSEJfU2hhcGVyRmxhZ19Vc2VEZXNpZ25NZXRyaWNz
KQorICAgICAgICByZXR1cm4gSEJfRXJyX0ludmFsaWRfQXJndW1lbnQ7ICAvLyBUaGlzIGlzIHJl
cXVlc3RpbmcgcHJlLWhpbnRlZCBwb3NpdGlvbnMuIFdlIGNhbid0IHN1cHBvcnQgdGhpcy4KKwor
ICAgIGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsKKyAgICBwYWludC5zZXRUZXh0RW5jb2Rpbmco
U2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKKyAgICB1aW50MTZfdCBnbHlwaDE2ID0g
Z2x5cGg7CisgICAgU2tQYXRoIHBhdGg7CisgICAgcGFpbnQuZ2V0VGV4dFBhdGgoJmdseXBoMTYs
IHNpemVvZihnbHlwaDE2KSwgMCwgMCwgJnBhdGgpOworICAgIGludCBudW1Qb2ludHMgPSBwYXRo
LmdldFBvaW50cyhOVUxMLCAwKTsKKyAgICBpZiAocG9pbnQgPj0gbnVtUG9pbnRzKQorICAgICAg
ICByZXR1cm4gSEJfRXJyX0ludmFsaWRfU3ViVGFibGU7CisgICAgU2tQb2ludCogcG9pbnRzID0g
KFNrUG9pbnQqKSBmYXN0TWFsbG9jKHNpemVvZihTa1BvaW50KSAqIChwb2ludCArIDEpKTsKKyAg
ICBpZiAoIXBvaW50cykKKyAgICAgICAgcmV0dXJuIEhCX0Vycl9JbnZhbGlkX1N1YlRhYmxlOwor
ICAgIHBhdGguZ2V0UG9pbnRzKHBvaW50cywgcG9pbnQgKyAxKTsKKyAgICAqeHBvcyA9IFNraWFT
Y2FsYXJUb0hhcmZidXp6Rml4ZWQocG9pbnRzW3BvaW50XS5mWCk7CisgICAgKnlwb3MgPSBTa2lh
U2NhbGFyVG9IYXJmYnV6ekZpeGVkKHBvaW50c1twb2ludF0uZlkpOworICAgICpuUG9pbnRzID0g
bnVtUG9pbnRzOworICAgIGZhc3RGcmVlKHBvaW50cyk7CisKKyAgICByZXR1cm4gSEJfRXJyX09r
OworfQorCitzdGF0aWMgdm9pZCBHZXRHbHlwaE1ldHJpY3MoSEJfRm9udCBoYkZvbnQsIEhCX0ds
eXBoIGdseXBoLCBIQl9HbHlwaE1ldHJpY3MqIG1ldHJpY3MpCit7CisgICAgRm9udFBsYXRmb3Jt
RGF0YSogZm9udCA9IChGb250UGxhdGZvcm1EYXRhKikgaGJGb250LT51c2VyRGF0YTsKKyAgICBT
a1BhaW50IHBhaW50OworCisgICAgZm9udC0+c2V0dXBQYWludCgmcGFpbnQpOworICAgIHBhaW50
LnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2RpbmcpOworICAgIHVp
bnQxNl90IGdseXBoMTYgPSBnbHlwaDsKKyAgICBTa1NjYWxhciB3aWR0aDsKKyAgICBTa1JlY3Qg
Ym91bmRzOworICAgIHBhaW50LmdldFRleHRXaWR0aHMoJmdseXBoMTYsIHNpemVvZihnbHlwaDE2
KSwgJndpZHRoLCAmYm91bmRzKTsKKworICAgIG1ldHJpY3MtPnggPSBTa2lhU2NhbGFyVG9IYXJm
YnV6ekZpeGVkKHdpZHRoKTsKKyAgICAvLyBXZSBjYW4ndCBhY3R1YWxseSBnZXQgdGhlIHx5fCBj
b3JyZWN0IGJlY2F1c2UgU2tpYSBkb2Vzbid0IGV4cG9ydAorICAgIC8vIHRoZSB2ZXJ0aWNhbCBh
ZHZhbmNlLiBIb3dldmVyLCBub3Igd2UgZG8gZXZlciByZW5kZXIgdmVydGljYWwgdGV4dCBhdAor
ICAgIC8vIHRoZSBtb21lbnQgc28gaXQncyB1bmltcG9ydGFudC4KKyAgICBtZXRyaWNzLT55ID0g
MDsKKyAgICBtZXRyaWNzLT53aWR0aCA9IFNraWFTY2FsYXJUb0hhcmZidXp6Rml4ZWQoYm91bmRz
LndpZHRoKCkpOworICAgIG1ldHJpY3MtPmhlaWdodCA9IFNraWFTY2FsYXJUb0hhcmZidXp6Rml4
ZWQoYm91bmRzLmhlaWdodCgpKTsKKyAgICBtZXRyaWNzLT54T2Zmc2V0ID0gU2tpYVNjYWxhclRv
SGFyZmJ1enpGaXhlZChib3VuZHMuZkxlZnQpOworICAgIG1ldHJpY3MtPnhPZmZzZXQgPSBTa2lh
U2NhbGFyVG9IYXJmYnV6ekZpeGVkKGJvdW5kcy5mVG9wKTsKK30KKworc3RhdGljIEhCX0ZpeGVk
IEdldEZvbnRNZXRyaWMoSEJfRm9udCBoYkZvbnQsIEhCX0ZvbnRNZXRyaWMgbWV0cmljKQorewor
ICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSAoRm9udFBsYXRmb3JtRGF0YSopIGhiRm9udC0+
dXNlckRhdGE7CisgICAgU2tQYWludCBwYWludDsKKworICAgIGZvbnQtPnNldHVwUGFpbnQoJnBh
aW50KTsKKyAgICBTa1BhaW50OjpGb250TWV0cmljcyBza2lhTWV0cmljczsKKyAgICBwYWludC5n
ZXRGb250TWV0cmljcygmc2tpYU1ldHJpY3MpOworCisgICAgc3dpdGNoIChtZXRyaWMpIHsKKyAg
ICBjYXNlIEhCX0ZvbnRBc2NlbnQ6CisgICAgICAgIHJldHVybiBTa2lhU2NhbGFyVG9IYXJmYnV6
ekZpeGVkKC1za2lhTWV0cmljcy5mQXNjZW50KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1
cm4gMDsKKyAgICB9Cit9CisKK0hCX0ZvbnRDbGFzcyBoYXJmYnV6elNraWFDbGFzcyA9IHsKKyAg
U3RyaW5nVG9HbHlwaHMsCisgIEdseXBoc1RvQWR2YW5jZXMsCisgIENhblJlbmRlciwKKyAgR2V0
T3V0bGluZVBvaW50LAorICBHZXRHbHlwaE1ldHJpY3MsCisgIEdldEZvbnRNZXRyaWMsCit9Owor
CitIQl9FcnJvciBoYXJmYnV6elNraWFHZXRUYWJsZSh2b2lkKiB2b2lkZmFjZSwgY29uc3QgSEJf
VGFnIHRhZywgSEJfQnl0ZSogYnVmZmVyLCBIQl9VSW50KiBsZW4pCit7CisgICAgRm9udFBsYXRm
b3JtRGF0YSogZm9udCA9IChGb250UGxhdGZvcm1EYXRhKikgdm9pZGZhY2U7CisKKyAgICBjb25z
dCBzaXplX3QgdGFibGVTaXplID0gU2tGb250SG9zdDo6R2V0VGFibGVTaXplKGZvbnQtPnVuaXF1
ZUlEKCksIHRhZyk7CisgICAgaWYgKCF0YWJsZVNpemUpCisgICAgICAgIHJldHVybiBIQl9FcnJf
SW52YWxpZF9Bcmd1bWVudDsKKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAqbGVuID0gdGFi
bGVTaXplOworICAgICAgICByZXR1cm4gSEJfRXJyX09rOworICAgIH0KKworICAgIGlmICgqbGVu
IDwgdGFibGVTaXplKQorICAgICAgICByZXR1cm4gSEJfRXJyX0ludmFsaWRfQXJndW1lbnQ7Cisg
ICAgU2tGb250SG9zdDo6R2V0VGFibGVEYXRhKGZvbnQtPnVuaXF1ZUlEKCksIHRhZywgMCwgdGFi
bGVTaXplLCBidWZmZXIpOworICAgIHJldHVybiBIQl9FcnJfT2s7Cit9CisKK30gIC8vIG5hbWVz
cGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="16087"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31811</attachid>
            <date>2009-06-24 14:13:19 -0700</date>
            <delta_ts>2009-06-29 14:17:24 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>30440</size>
            <attacher name="Adam Langley">agl</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZGVhZDY2MC4uMmE1ZjFjYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1NCBAQAorMjAwOS0wNi0yMyAgQWRhbSBMYW5nbGV5
ICA8YWdsQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1MDY4
CisKKyAgICAgICAgQ2hyb21pdW06IEFkZCBjb21wbGV4IHRleHQgc3VwcG9ydCBvbiBMaW51eC4K
KworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgY29tcGxleCB0ZXh0IHN1cHBvcnQgb24gTGludXgg
dXNpbmcgSGFyZmJ1enouIEl0J3Mgbm90CisgICAgICAgIHRoZSBmYXN0ZXN0IGNvZGUgcG9zc2li
bGU6IHNvbWUgY2FjaGluZyBvZiBmb250IHRhYmxlcyB3aWxsIGNlcnRhaW5seQorICAgICAgICBi
ZSByZXF1aXJlZC4gSG93ZXZlciwgaXQncyBwcm9iYWJseSB0aGUgc2ltcGxlc3QgY29kZSB0aGF0
IHdvcmtzLgorCisgICAgICAgIE5vdGUgdGhhdCBzdXBwb3J0IGZvciBtYW55IHNjcmlwdHMgaXMg
Y3VycmVudGx5IGhhbXBlcmVkIGJ5IHRoZSBsYWNrCisgICAgICAgIG9mIGdvb2QgZm9udCBmYWxs
YmFjayBpbiB0aGUgY2FzZSBvZiB1bnN1cHBvcnRlZCBjb2RlIHBvaW50cy4gVGhpcworICAgICAg
ICBpc3N1ZSB3aWxsIGJlIGFkZHJlc3NlZCBpbiBhIGZ1dHVyZSBwYXRjaC4KKworICAgICAgICBU
aGlzIHdpbGwgcmVxdWlyZSBjaGVja2luZyBpbiBuZXcgYmFzZWxpbmVzIGluIHRoZSBDaHJvbWl1
bSB0cmVlIGZvcgorICAgICAgICB0aG9zZSBsYXlvdXQgdGVzdHMgd2hpY2ggbm93IHBhc3MuCisK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChX
ZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjp+VGV4dFJ1bldhbGtlcik6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0UnVuV2Fsa2VyOjpyZXNldCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2Vy
OjpzZXRYT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnJ0bCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6bmV4dFNjcmlwdFJ1bik6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpnbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFJ1bldhbGtlcjo6bGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6OnhQ
b3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6YWR2YW5jZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1bldhbGtlcjo6d2lkdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dFJ1bldhbGtlcjo6bG9nQ2x1c3RlcnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFJ1
bldhbGtlcjo6bnVtQ29kZVBvaW50cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2Vy
OjpleHBhbmRHbHlwaEFycmF5cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0UnVuV2Fsa2VyOjpO
ZXh0UlRMU2NyaXB0UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRSdW5XYWxrZXI6Ok5leHRM
VFJTY3JpcHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0NvbXBsZXhUZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFyZmJ1enpTa2lhLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKToKKyAgICAgICAg
KFdlYkNvcmU6OlN0cmluZ1RvR2x5cGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoc1RvQWR2
YW5jZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q2FuUmVuZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdldE91dGxpbmVQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpHZXRHbHlwaE1ldHJpY3MpOgor
ICAgICAgICAoV2ViQ29yZTo6R2V0Rm9udE1ldHJpYyk6CisgICAgICAgIChXZWJDb3JlOjpoYXJm
YnV6elNraWFHZXRUYWJsZSk6CisKIDIwMDktMDYtMjMgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25A
YXBwbGUuY29tPgogCiAgICAgICAgIFBhdGNoIGJ5IEFudHRpIEtvaXZpc3RvLgpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwCmluZGV4IGE5NTI2
ODUuLmIwYzg3ZWIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vRm9udExpbnV4LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0ZvbnRMaW51eC5jcHAKQEAgLTQ0LDYgKzQ0LDExIEBACiAjaW5jbHVkZSAiU2tUeXBlZmFjZS5o
IgogI2luY2x1ZGUgIlNrVXRpbHMuaCIKIAorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiaGFyZmJ1
enotc2hhcGVyLmgiCisjaW5jbHVkZSAiaGFyZmJ1enotdW5pY29kZS5oIgorfQorCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIGJvb2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBs
ZXhUZXh0KCkKQEAgLTU0LDcgKzU5LDcgQEAgYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFja0Zv
bnRzRm9yQ29tcGxleFRleHQoKQogdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4
dCogZ2MsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LAogICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhz
LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdCB7
Ci0gICAgU2tBU1NFUlQoc2l6ZW9mKEdseXBoQnVmZmVyR2x5cGgpID09IHNpemVvZih1aW50MTZf
dCkpOyAgLy8gY29tcGlsZS10aW1lIGFzc2VydAorICAgIFNrQVNTRVJUKHNpemVvZihHbHlwaEJ1
ZmZlckdseXBoKSA9PSBzaXplb2YodWludDE2X3QpKTsgLy8gY29tcGlsZS10aW1lIGFzc2VydAog
CiAgICAgY29uc3QgR2x5cGhCdWZmZXJHbHlwaCogZ2x5cGhzID0gZ2x5cGhCdWZmZXIuZ2x5cGhz
KGZyb20pOwogICAgIFNrU2NhbGFyIHggPSBTa0Zsb2F0VG9TY2FsYXIocG9pbnQueCgpKTsKQEAg
LTExMCwzMSArMTE1LDQ5OSBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0
KiBnYywgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsCiAgICAgfQogfQogCi12b2lkIEZvbnQ6
OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4m
IHJ1biwKK2V4dGVybiBjb25zdCBIQl9Gb250Q2xhc3MgaGFyZmJ1enpTa2lhQ2xhc3M7CitleHRl
cm4gSEJfRXJyb3IgaGFyZmJ1enpTa2lhR2V0VGFibGUodm9pZCogdm9pZGZhY2UsIGNvbnN0IEhC
X1RhZywgSEJfQnl0ZSogYnVmZmVyLCBIQl9VSW50KiBsZW4pOworCisvLyBIYXJmYnV6eiB1c2Vz
IDI2LjYgZml4ZWQgcG9pbnQgdmFsdWVzIGZvciBwaXhlbCBvZmZzZXRzLiBIb3dldmVyLCB3ZSBk
b24ndAorLy8gaGFuZGxlIHN1YnBpeGVsIHBvc2l0aW9uaW5nIHNvIHRoaXMgZnVuY3Rpb24gaXMg
dXNlZCB0byB0cnVuY2F0ZSBIYXJmYnV6egorLy8gdmFsdWVzIHRvIGEgbnVtYmVyIG9mIHBpeGVs
cy4KK3N0YXRpYyBpbnQgdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKEhCX0ZpeGVkIHZhbHVl
KQoreworICAgIHJldHVybiB2YWx1ZSA+PiA2OworfQorCisvLyBUZXh0UnVuV2Fsa2VyIHdhbGtz
IGEgVGV4dFJ1biBhbmQgcHJlc2VudHMgZWFjaCBzY3JpcHQgcnVuIGluIHNlcXVlbmNlLiBBCisv
LyBUZXh0UnVuIGlzIGEgc2VxdWVuY2Ugb2YgY29kZS1wb2ludHMgd2l0aCB0aGUgc2FtZSBlbWJl
ZGRpbmcgbGV2ZWwgKGkuZS4gdGhleQorLy8gYXJlIGFsbCBsZWZ0LXRvLXJpZ2h0IG9yIHJpZ2h0
LXRvLWxlZnQpLiBBIHNjcmlwdCBydW4gaXMgYSBzdWJzZXF1ZW5jZSB3aGVyZQorLy8gYWxsIHRo
ZSBjaGFyYWN0ZXJzIGhhdmUgdGhlIHNhbWUgc2NyaXB0IChlLmcuIEFyYWJpYywgVGhhaSBldGMp
LiBTaGFwaW5nIGlzCisvLyBvbmx5IGV2ZXIgZG9uZSB3aXRoIHNjcmlwdCBydW5zIHNpbmNlIHRo
ZSBzaGFwZXJzIG9ubHkga25vdyBob3cgdG8gZGVhbCB3aXRoCisvLyBhIHNpbmdsZSBzY3JpcHQu
CisvLworLy8gQWZ0ZXIgY3JlYXRpbmcgaXQsIHRoZSBzY3JpcHQgcnVucyBhcmUgZWl0aGVyIGl0
ZXJhdGVkIGJhY2t3YXJkcyBvciBmb3J3YXJkcy4KKy8vIEl0IGRlZmF1bHRzIHRvIGJhY2t3YXJk
cyBmb3IgUlRMIGFuZCBmb3J3YXJkcyBvdGhlcndpc2UgKHdoaWNoIG1hdGNoZXMgdGhlCisvLyBw
cmVzZW50YXRpb24gb3JkZXIpLCBob3dldmVyIHlvdSBjYW4gc2V0IGl0IHdpdGggfHNldEJhY2t3
YXJkc0l0ZXJhdGlvbnwuCisvLworLy8gT25jZSB5b3UgaGF2ZSBzZXR1cCB0aGUgb2JqZWN0LCBj
YWxsIHxuZXh0U2NyaXB0UnVufCB0byBnZXQgdGhlIGZpcnN0IHNjcmlwdAorLy8gcnVuLiBUaGlz
IHdpbGwgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZS4gQXQgYW55
IHRpbWUgeW91CisvLyBjYW4gY2FsbCB8cmVzZXR8IHRvIHN0YXJ0IG92ZXIgYWdhaW4uCitjbGFz
cyBUZXh0UnVuV2Fsa2VyIHsKK3B1YmxpYzoKKyAgICBUZXh0UnVuV2Fsa2VyKGNvbnN0IFRleHRS
dW4mIHJ1biwgU2tQYWludCogcGFpbnQsIHVuc2lnbmVkIHN0YXJ0aW5nWCwgY29uc3QgRm9udFBs
YXRmb3JtRGF0YSogZm9udCkKKyAgICAgICAgOiBtX3J1bihydW4pCisgICAgICAgICwgbV9zdGFy
dGluZ1goc3RhcnRpbmdYKQorICAgICAgICAsIG1fb2Zmc2V0WChtX3N0YXJ0aW5nWCkKKyAgICAg
ICAgLCBtX2l0ZXJhdGVCYWNrd2FyZHMocnVuLnJ0bCgpKQorICAgIHsKKyAgICAgICAgbWVtc2V0
KCZtX2l0ZW0sIDAsIHNpemVvZihtX2l0ZW0pKTsKKyAgICAgICAgLy8gV2UgY2Fubm90IGtub3cs
IGFoZWFkIG9mIHRpbWUsIGhvdyBtYW55IGdseXBocyBhIGdpdmVuIHNjcmlwdCBydW4KKyAgICAg
ICAgLy8gd2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vlc3MgdGhhdCBzY3JpcHQgcnVucyB3aWxs
IG5vdCBwcm9kdWNlIG1vcmUKKyAgICAgICAgLy8gdGhhbiB0d2ljZSBhcyBtYW55IGdseXBocyBh
cyB0aGVyZSBhcmUgY29kZSBwb2ludHMgYW5kIGZhbGxiYWNrIGlmCisgICAgICAgIC8vIHdlIGZp
bmQgdGhhdCB3ZSBhcmUgd3JvbmcuCisgICAgICAgIG1fbWF4R2x5cGhzID0gcnVuLmxlbmd0aCgp
ICogMjsKKyAgICAgICAgY3JlYXRlR2x5cGhBcnJheXMoKTsKKworICAgICAgICBtX2l0ZW0ubG9n
X2NsdXN0ZXJzID0gbmV3IHVuc2lnbmVkIHNob3J0W3J1bi5sZW5ndGgoKV07CisKKyAgICAgICAg
bV9pdGVtLmZhY2UgPSBIQl9OZXdGYWNlKGNvbnN0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGZv
bnQpLCBoYXJmYnV6elNraWFHZXRUYWJsZSk7CisgICAgICAgIG1faXRlbS5mb250ID0gcmVpbnRl
cnByZXRfY2FzdDxIQl9Gb250UmVjKj4oZmFzdE1hbGxvYyhzaXplb2YoSEJfRm9udFJlYykpKTsK
KyAgICAgICAgbWVtc2V0KG1faXRlbS5mb250LCAwLCBzaXplb2YoSEJfRm9udFJlYykpOworICAg
ICAgICBtX2l0ZW0uZm9udC0+a2xhc3MgPSAmaGFyZmJ1enpTa2lhQ2xhc3M7CisgICAgICAgIG1f
aXRlbS5mb250LT51c2VyRGF0YSA9IGNvbnN0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGZvbnQp
OworICAgICAgICAvLyBUaGUgdmFsdWVzIHdoaWNoIGhhcmZidXp6U2tpYUNsYXNzIHJldHVybnMg
YXJlIGFscmVhZHkgc2NhbGVkIHRvCisgICAgICAgIC8vIHBpeGVsIHVuaXRzLCBzbyB3ZSBqdXN0
IHNldCBhbGwgdGhlc2UgdG8gb25lIHRvIGRpc2FibGUgZnVydGhlcgorICAgICAgICAvLyBzY2Fs
aW5nLgorICAgICAgICBtX2l0ZW0uZm9udC0+eF9wcGVtID0gMTsKKyAgICAgICAgbV9pdGVtLmZv
bnQtPnlfcHBlbSA9IDE7CisgICAgICAgIG1faXRlbS5mb250LT54X3NjYWxlID0gMTsKKyAgICAg
ICAgbV9pdGVtLmZvbnQtPnlfc2NhbGUgPSAxOworICAgICAgICBwYWludC0+c2V0VGV4dEVuY29k
aW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGluZyk7CisKKyAgICAgICAgbV9pdGVtLnN0
cmluZyA9IHJ1bi5jaGFyYWN0ZXJzKCk7CisgICAgICAgIG1faXRlbS5zdHJpbmdMZW5ndGggPSBy
dW4ubGVuZ3RoKCk7CisgICAgICAgIG1faXRlbS5pdGVtLmJpZGlMZXZlbCA9IHJ1bi5ydGwoKTsK
KworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIH5UZXh0UnVuV2Fsa2VyKCkKKyAgICB7
CisgICAgICAgIGZhc3RGcmVlKG1faXRlbS5mb250KTsKKyAgICAgICAgZGVsZXRlR2x5cGhBcnJh
eXMoKTsKKyAgICAgICAgZGVsZXRlW10gbV9pdGVtLmxvZ19jbHVzdGVyczsKKyAgICAgICAgSEJf
RnJlZUZhY2UobV9pdGVtLmZhY2UpOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKQorICAgIHsK
KyAgICAgICAgaWYgKG1faXRlcmF0ZUJhY2t3YXJkcykKKyAgICAgICAgICAgIG1faW5kZXhPZk5l
eHRTY3JpcHRSdW4gPSBtX3J1bi5sZW5ndGgoKSAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIG1faW5kZXhPZk5leHRTY3JpcHRSdW4gPSAwOworICAgICAgICBtX29mZnNldFggPSBtX3N0
YXJ0aW5nWDsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIHggb2Zmc2V0IGZvciB0aGUgbmV4dCBz
Y3JpcHQgcnVuLiBUaGlzIGFmZmVjdHMgdGhlIHZhbHVlcyBpbgorICAgIC8vIHx4UG9zaXRpb25z
fAorICAgIHZvaWQgc2V0WE9mZnNldChpbnQgeCkKKyAgICB7CisgICAgICAgIG1fb2Zmc2V0WCA9
IHg7CisgICAgfQorCisgICAgYm9vbCBydGwoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fcnVuLnJ0bCgpOworICAgIH0KKworICAgIHZvaWQgc2V0QmFja3dhcmRzSXRlcmF0aW9uKGJv
b2wgaXNCYWNrd2FyZHMpCisgICAgeworICAgICAgICBtX2l0ZXJhdGVCYWNrd2FyZHMgPSBpc0Jh
Y2t3YXJkczsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHRvIHRo
ZSBuZXh0IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2YgdGhlCisg
ICAgLy8gVGV4dFJ1biBoYXMgYmVlbiByZWFjaGVkLgorICAgIGJvb2wgbmV4dFNjcmlwdFJ1bigp
CisgICAgeworICAgICAgICBpZiAobV9pdGVyYXRlQmFja3dhcmRzKSB7CisgICAgICAgICAgICAv
LyBJbiByaWdodC10by1sZWZ0IG1vZGUgd2UgbmVlZCB0byByZW5kZXIgdGhlIHNoYXBlZCBnbHlw
aCBiYWNrd2FyZHMgYW5kCisgICAgICAgICAgICAvLyBhbHNvIHJlbmRlciB0aGUgc2NyaXB0IHJ1
bnMgdGhlbXNlbHZlcyBiYWNrd2FyZHMuIFNvIGdpdmVuIGEgVGV4dFJ1bjoKKyAgICAgICAgICAg
IC8vICAgIEFBQUFBQUFDVFRUVFRUVCAgIChBID0gQXJhYmljLCBDID0gQ29tbW9uLCBUID0gVGhh
aSkKKyAgICAgICAgICAgIC8vIHdlIHJlbmRlcjoKKyAgICAgICAgICAgIC8vICAgIFRUVFRUVENB
QUFBQUFBCisgICAgICAgICAgICAvLyAoYW5kIHRoZSBnbHlwaHMgaW4gZWFjaCBBLCBDIGFuZCBU
IHNlY3Rpb24gYXJlIGJhY2t3YXJkcyB0b28pCisgICAgICAgICAgICBpZiAoIWhiX3V0ZjE2X3Nj
cmlwdF9ydW5fcHJldigmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJh
Y3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2NyaXB0UnVuKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBp
ZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCgmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0
ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2Ny
aXB0UnVuKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAocnRsKCkpCisgICAgICAgICAgICByZXR1cm4gTmV4dFJUTFNjcmlwdFJ1bigpOwor
ICAgICAgICByZXR1cm4gTmV4dExUUlNjcmlwdFJ1bigpOworICAgIH0KKworICAgIGNvbnN0IHVp
bnQxNl90KiBnbHlwaHMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZ2x5cGhzMTY7
CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHJldHVybmVk
IGJ5IHxnbHlwaHN8CisgICAgY29uc3QgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX2l0ZW0ubnVtX2dseXBoczsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4g
dGhlIHggb2Zmc2V0IGZvciBlYWNoIG9mIHRoZSBnbHlwaHMuIE5vdGUgdGhhdCB0aGlzIGlzIHRy
YW5zbGF0ZWQKKyAgICAvLyBieSB0aGUgY3VycmVudCB4IG9mZnNldCBhbmQgdGhhdCB0aGUgeCBv
ZmZzZXQgaXMgdXBkYXRlZCBmb3IgZWFjaCBzY3JpcHQKKyAgICAvLyBydW4uCisgICAgY29uc3Qg
U2tTY2FsYXIqIHhQb3NpdGlvbnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1feHBv
czsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGFkdmFuY2VzICh3aWR0aHMpIGZvciBlYWNoIGds
eXBoLgorICAgIGNvbnN0IEhCX0ZpeGVkKiBhZHZhbmNlcygpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gbV9pdGVtLmFkdmFuY2VzOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgd2lk
dGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBzY3JpcHQgcnVuLgorICAgIGNvbnN0IHVuc2lnbmVk
IHdpZHRoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3BpeGVsV2lkdGg7CisgICAg
fQorCisgICAgLy8gUmV0dXJuIHRoZSBjbHVzdGVyIGxvZyBmb3IgdGhlIGN1cnJlbnQgc2NyaXB0
IHJ1bi4gRm9yIGV4YW1wbGU6CisgICAgLy8gICBzY3JpcHQgcnVuOiBmIGkgYSBuIGMgw6kgIChm
aSBnZXRzIGxpZ2F0dXJlZCkKKyAgICAvLyAgIGxvZyBjbHV0cnM6IDAgMCAxIDIgMyA0CisgICAg
Ly8gU28sIGZvciBlYWNoIGlucHV0IGNvZGUgcG9pbnQsIHRoZSBsb2cgdGVsbHMgeW91IHdoaWNo
IG91dHB1dCBnbHlwaCB3YXMKKyAgICAvLyBnZW5lcmF0ZWQgZm9yIGl0LgorICAgIGNvbnN0IHVu
c2lnbmVkIHNob3J0KiBsb2dDbHVzdGVycygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
bV9pdGVtLmxvZ19jbHVzdGVyczsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gdGhlIG51bWJlciBv
ZiBjb2RlIHBvaW50cyBpbiB0aGUgY3VycmVudCBzY3JpcHQgcnVuCisgICAgY29uc3QgdW5zaWdu
ZWQgbnVtQ29kZVBvaW50cygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9udW1Db2Rl
UG9pbnRzOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGRlbGV0ZUdseXBoQXJyYXlzKCkK
KyAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1faXRlbS5nbHlwaHM7CisgICAgICAgIGRlbGV0ZVtd
IG1faXRlbS5hdHRyaWJ1dGVzOworICAgICAgICBkZWxldGVbXSBtX2l0ZW0uYWR2YW5jZXM7Cisg
ICAgICAgIGRlbGV0ZVtdIG1faXRlbS5vZmZzZXRzOworICAgICAgICBkZWxldGVbXSBtX2dseXBo
czE2OworICAgICAgICBkZWxldGVbXSBtX3hwb3M7CisgICAgfQorCisgICAgYm9vbCBjcmVhdGVH
bHlwaEFycmF5cygpCisgICAgeworICAgICAgICBtX2l0ZW0uZ2x5cGhzID0gbmV3IEhCX0dseXBo
W21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV9pdGVtLmF0dHJpYnV0ZXMgPSBuZXcgSEJfR2x5cGhB
dHRyaWJ1dGVzW21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV9pdGVtLmFkdmFuY2VzID0gbmV3IEhC
X0ZpeGVkW21fbWF4R2x5cGhzXTsKKyAgICAgICAgbV9pdGVtLm9mZnNldHMgPSBuZXcgSEJfRml4
ZWRQb2ludFttX21heEdseXBoc107CisgICAgICAgIG1fZ2x5cGhzMTYgPSBuZXcgdWludDE2X3Rb
bV9tYXhHbHlwaHNdOworICAgICAgICBtX3hwb3MgPSBuZXcgU2tTY2FsYXJbbV9tYXhHbHlwaHNd
OworCisgICAgICAgIHJldHVybiBtX2l0ZW0uZ2x5cGhzCisgICAgICAgICAgICAmJiBtX2l0ZW0u
YXR0cmlidXRlcworICAgICAgICAgICAgJiYgbV9pdGVtLmFkdmFuY2VzCisgICAgICAgICAgICAm
JiBtX2l0ZW0ub2Zmc2V0cworICAgICAgICAgICAgJiYgbV9nbHlwaHMxNgorICAgICAgICAgICAg
JiYgbV94cG9zOworICAgIH0KKworICAgIGJvb2wgZXhwYW5kR2x5cGhBcnJheXMoKQorICAgIHsK
KyAgICAgICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKKyAgICAgICAgbV9tYXhHbHlwaHMgPDw9IDE7
CisgICAgICAgIHJldHVybiBjcmVhdGVHbHlwaEFycmF5cygpOworICAgIH0KKworICAgIGJvb2wg
TmV4dFJUTFNjcmlwdFJ1bigpCisgICAgeworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAg
ICBtX2l0ZW0ubnVtX2dseXBocyA9IG1fbWF4R2x5cGhzOworICAgICAgICAgICAgSEJfU2hhcGVJ
dGVtKCZtX2l0ZW0pOworICAgICAgICAgICAgaWYgKG1faXRlbS5udW1fZ2x5cGhzIDwgbV9tYXhH
bHlwaHMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFdlIG92ZXJm
bG93ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KKyAgICAgICAgICAgIGlmICghZXhw
YW5kR2x5cGhBcnJheXMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKworICAgICAgICBpbnQgYWR2YW5jZVN1bSA9IDA7CisgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBtX2l0ZW0ubnVtX2dseXBoczsgKytpKSB7CisgICAgICAgICAgICBtX2dseXBo
czE2W2ldID0gbV9pdGVtLmdseXBoc1tpXTsKKyAgICAgICAgICAgIGFkdmFuY2VTdW0gKz0gdHJ1
bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5hZHZhbmNlc1tpXSk7CisgICAgICAgIH0K
KyAgICAgICAgbV9waXhlbFdpZHRoID0gYWR2YW5jZVN1bTsKKyAgICAgICAgYWR2YW5jZVN1bSAr
PSBtX29mZnNldFg7CisgICAgICAgIG1fb2Zmc2V0WCArPSBtX3BpeGVsV2lkdGg7CisKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1faXRlbS5udW1fZ2x5cGhzOyArK2kpIHsKKyAg
ICAgICAgICAgIGFkdmFuY2VTdW0gLT0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRl
bS5hZHZhbmNlc1tpXSk7CisgICAgICAgICAgICBtX3hwb3NbaV0gPSBhZHZhbmNlU3VtOworICAg
ICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBOZXh0TFRS
U2NyaXB0UnVuKCkKKyAgICB7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIG1faXRl
bS5udW1fZ2x5cGhzID0gbV9tYXhHbHlwaHM7CisgICAgICAgICAgICBIQl9TaGFwZUl0ZW0oJm1f
aXRlbSk7CisgICAgICAgICAgICBpZiAobV9pdGVtLm51bV9nbHlwaHMgPCBtX21heEdseXBocykK
KyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gV2Ugb3ZlcmZsb3dlZCBv
dXIgYXJyYXlzLiBSZXNpemUgYW5kIHJldHJ5LgorICAgICAgICAgICAgaWYgKCFleHBhbmRHbHlw
aEFycmF5cygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisg
ICAgICAgIG1fcGl4ZWxXaWR0aCA9IDA7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtX2l0ZW0ubnVtX2dseXBoczsgKytpKSB7CisgICAgICAgICAgICBtX2dseXBoczE2W2ldID0g
bV9pdGVtLmdseXBoc1tpXTsKKyAgICAgICAgICAgIG1feHBvc1tpXSA9IG1fb2Zmc2V0WDsKKyAg
ICAgICAgICAgIG1fb2Zmc2V0WCArPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVt
LmFkdmFuY2VzW2ldKTsKKyAgICAgICAgICAgIG1fcGl4ZWxXaWR0aCArPSB0cnVuY2F0ZUZpeGVk
UG9pbnRUb0ludGVnZXIobV9pdGVtLmFkdmFuY2VzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IFRleHRSdW4mIG1fcnVuOworICAgIEhC
X1NoYXBlckl0ZW0gbV9pdGVtOworICAgIHVpbnQxNl90KiBtX2dseXBoczE2OyAvLyBBIHZlY3Rv
ciBvZiAxNi1iaXQgZ2x5cGggaWRzLgorICAgIFNrU2NhbGFyKiBtX3hwb3M7IC8vIEEgdmVjdG9y
IG9mIHggcG9zaXRpb25zIGZvciBlYWNoIGdseXBoLgorICAgIHNzaXplX3QgbV9pbmRleE9mTmV4
dFNjcmlwdFJ1bjsgLy8gSW5kZXhlcyB0aGUgc2NyaXB0IHJ1biBpbiB8bV9ydW58LgorICAgIGNv
bnN0IHVuc2lnbmVkIG1fc3RhcnRpbmdYOworICAgIHVuc2lnbmVkIG1fb2Zmc2V0WDsKKyAgICB1
bnNpZ25lZCBtX3BpeGVsV2lkdGg7IC8vIFdpZHRoIChpbiBweCkgb2YgdGhlIGN1cnJlbnQgc2Ny
aXB0IHJ1bi4KKyAgICB1bnNpZ25lZCBtX251bUNvZGVQb2ludHM7IC8vIENvZGUgcG9pbnRzIGlu
IGN1cnJlbnQgc2NyaXB0IHJ1bi4KKyAgICB1bnNpZ25lZCBtX21heEdseXBoczsKKyAgICBib29s
IG1faXRlcmF0ZUJhY2t3YXJkczsKK307CisKK3ZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdy
YXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IFRleHRSdW4mIHJ1biwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgaWYgKCFydW4ubGVuZ3RoKCkpCisgICAg
ICByZXR1cm47CisKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBmb250ID0gZm9udERhdGFG
b3JDaGFyYWN0ZXJzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSktPmZvbnREYXRhRm9y
Q2hhcmFjdGVyKCcgJyktPnBsYXRmb3JtRGF0YSgpOworCisgICAgU2tDYW52YXMqIGNhbnZhcyA9
IGdjLT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCk7CisgICAgaW50IHRleHRNb2RlID0gZ2Mt
PnBsYXRmb3JtQ29udGV4dCgpLT5nZXRUZXh0RHJhd2luZ01vZGUoKTsKKyAgICBib29sIGZpbGwg
PSB0ZXh0TW9kZSAmIGNUZXh0RmlsbDsKKyAgICBib29sIHN0cm9rZSA9ICh0ZXh0TW9kZSAmIGNU
ZXh0U3Ryb2tlKQorICAgICAgICAgICAgICAgJiYgZ2MtPnBsYXRmb3JtQ29udGV4dCgpLT5nZXRT
dHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlCisgICAgICAgICAgICAgICAmJiBnYy0+cGxhdGZvcm1D
b250ZXh0KCktPmdldFN0cm9rZVRoaWNrbmVzcygpID4gMDsKKworICAgIGlmICghZmlsbCAmJiAh
c3Ryb2tlKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHN0cm9rZVBhaW50LCBmaWxs
UGFpbnQ7CisgICAgaWYgKGZpbGwpIHsKKyAgICAgICAgZ2MtPnBsYXRmb3JtQ29udGV4dCgpLT5z
ZXR1cFBhaW50Rm9yRmlsbGluZygmZmlsbFBhaW50KTsKKyAgICAgICAgZm9udC5zZXR1cFBhaW50
KCZmaWxsUGFpbnQpOworICAgICAgICBmaWxsUGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6
OmtHbHlwaElEX1RleHRFbmNvZGluZyk7CisgICAgICAgIGZpbGxQYWludC5zZXRDb2xvcihnYy0+
ZmlsbENvbG9yKCkucmdiKCkpOworICAgIH0KKyAgICBpZiAoc3Ryb2tlKSB7CisgICAgICAgIGdj
LT5wbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvclN0cm9raW5nKCZzdHJva2VQYWludCwg
MCwgMCk7CisgICAgICAgIGZvbnQuc2V0dXBQYWludCgmc3Ryb2tlUGFpbnQpOworICAgICAgICBz
dHJva2VQYWludC5zZXRGbGFncyhTa1BhaW50OjprQW50aUFsaWFzX0ZsYWcpOworICAgICAgICBz
dHJva2VQYWludC5zZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5n
KTsKKyAgICAgICAgc3Ryb2tlUGFpbnQuc2V0Q29sb3IoZ2MtPnN0cm9rZUNvbG9yKCkucmdiKCkp
OworICAgIH0KKworICAgIFRleHRSdW5XYWxrZXIgd2Fsa2VyKHJ1biwgc3Ryb2tlID8gJnN0cm9r
ZVBhaW50IDogJmZpbGxQYWludCwgcG9pbnQueCgpLCAmZm9udCk7CisKKyAgICB3aGlsZSAod2Fs
a2VyLm5leHRTY3JpcHRSdW4oKSkgeworICAgICAgICBpZiAoZmlsbCkKKyAgICAgICAgICAgIGNh
bnZhcy0+ZHJhd1Bvc1RleHRIKHdhbGtlci5nbHlwaHMoKSwgd2Fsa2VyLmxlbmd0aCgpIDw8IDEs
IHdhbGtlci54UG9zaXRpb25zKCksIHBvaW50LnkoKSwgZmlsbFBhaW50KTsKKyAgICAgICAgaWYg
KHN0cm9rZSkKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1Bvc1RleHRIKHdhbGtlci5nbHlwaHMo
KSwgd2Fsa2VyLmxlbmd0aCgpIDw8IDEsIHdhbGtlci54UG9zaXRpb25zKCksIHBvaW50LnkoKSwg
c3Ryb2tlUGFpbnQpOworICAgIH0KIH0KIAogZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBs
ZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+
KiAvKiBmYWxsYmFja0ZvbnRzICovKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0g
ICAgcmV0dXJuIDA7CisgICAgU2tQYWludCBwYWludDsKKyAgICBjb25zdCBGb250UGxhdGZvcm1E
YXRhJiBmb250ID0gZm9udERhdGFGb3JDaGFyYWN0ZXJzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5s
ZW5ndGgoKSktPmZvbnREYXRhRm9yQ2hhcmFjdGVyKCcgJyktPnBsYXRmb3JtRGF0YSgpOworICAg
IGZvbnQuc2V0dXBQYWludCgmcGFpbnQpOworCisgICAgVGV4dFJ1bldhbGtlciB3YWxrZXIocnVu
LCAmcGFpbnQsIDAsICZmb250KTsKKworICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICB3aGlsZSAo
d2Fsa2VyLm5leHRTY3JpcHRSdW4oKSkKKyAgICAgICAgd2lkdGggKz0gd2Fsa2VyLndpZHRoKCk7
CisKKyAgICByZXR1cm4gd2lkdGg7CiB9CiAKKy8vIFJldHVybiB0aGUgY29kZSBwb2ludCBpbmRl
eCBmb3IgdGhlIGdpdmVuIHx4fCBvZmZzZXQgaW50byB0aGUgdGV4dCBydW4uCiBpbnQgRm9udDo6
b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGludCB4
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRl
UGFydGlhbEdseXBocykgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVy
biAwOworICAgIC8vIChNYWMgY29kZSBpZ25vcmVzIGluY2x1ZGVQYXJ0aWFsR2x5cGhzLCBhbmQg
dGhleSBkb24ndCBrbm93IHdoYXQgaXQncworICAgIC8vIHN1cHBvc2VkIHRvIGRvLCBzbyB3ZSBq
dXN0IGlnbm9yZSBpdCBhcyB3ZWxsLikKKyAgICBTa1BhaW50IHBhaW50OworICAgIGNvbnN0IEZv
bnRQbGF0Zm9ybURhdGEmIGZvbnQgPSBmb250RGF0YUZvckNoYXJhY3RlcnMocnVuLmNoYXJhY3Rl
cnMoKSwgcnVuLmxlbmd0aCgpKS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAnKS0+cGxhdGZvcm1E
YXRhKCk7CisgICAgZm9udC5zZXR1cFBhaW50KCZwYWludCk7CisKKyAgICBUZXh0UnVuV2Fsa2Vy
IHdhbGtlcihydW4sICZwYWludCwgMCwgJmZvbnQpOworCisgICAgLy8gSWYgdGhpcyBpcyBSVEwg
dGV4dCwgdGhlIGZpcnN0IGdseXBoIGZyb20gdGhlIGxlZnQgaXMgYWN0dWFsbHkgdGhlIGxhc3QK
KyAgICAvLyBjb2RlIHBvaW50LiBTbyB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgY29kZSBwb2lu
dHMgdGhlcmUgYXJlIHRvdGFsIGluCisgICAgLy8gb3JkZXIgdG8gc3VidHJhY3QuIFRoaXMgaXMg
ZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgVGV4dFJ1bgorICAgIC8vIGJlY2F1c2Ug
VVRGLTE2IHN1cnJvZ2F0ZSBwYWlycyBhcmUgYSBzaW5nbGUgY29kZSBwb2ludCwgYnV0IDMyLWJp
dHMgbG9uZy4KKyAgICAvLyBJbiBMVFIgd2UgbGVhdmUgdGhpcyBhcyAwIHNvIHRoYXQgd2UgZ2V0
IHRoZSBjb3JyZWN0IHZhbHVlIGZvcgorICAgIC8vIHxiYXNlUG9zaXRpb258LCBiZWxvdy4KKyAg
ICB1bnNpZ25lZCB0b3RhbENvZGVQb2ludHMgPSAwOworICAgIGlmICh3YWxrZXIucnRsKCkpIHsK
KyAgICAgICAgc3NpemVfdCBvZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgcnVu
Lmxlbmd0aCgpKSB7CisgICAgICAgICAgICB1dGYxNl90b19jb2RlX3BvaW50KHJ1bi5jaGFyYWN0
ZXJzKCksIHJ1bi5sZW5ndGgoKSwgJm9mZnNldCk7CisgICAgICAgICAgICB0b3RhbENvZGVQb2lu
dHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIGJhc2VQb3NpdGlvbiA9IHRv
dGFsQ29kZVBvaW50czsKKworICAgIC8vIEZvciBSVEw6CisgICAgLy8gICBjb2RlLXBvaW50IG9y
ZGVyOiAgYWJjZCBlZmcgaGlqa2wKKyAgICAvLyAgIG9uIHNjcmVlbjogICAgICAgICBsa2ppaCBn
ZmUgZGNiYQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgXgorICAg
IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICAgIC8vICAgICAgICAg
ICAgICAgICAgYmFzZVBvc2l0aW9uLS18ICAgfAorICAgIC8vICAgICAgICAgICAgICAgICB0b3Rh
bENvZGVQb2ludHMtLS0tfAorICAgIC8vIFNpbmNlIGJhc2VQb3NpdGlvbiBpcyBjdXJyZW50bHkg
dGhlIHRvdGFsIG51bWJlciBvZiBjb2RlLXBvaW50cywgdGhlCisgICAgLy8gZmlyc3QgdGhpbmcg
d2UgZG8gaXMgZGVjcmVtZW50IGl0IHNvIHRoYXQgaXQncyBwb2ludGluZyB0byB0aGUgc3RhcnQg
b2YKKyAgICAvLyB0aGUgY3VycmVudCBzY3JpcHQtcnVuLgorICAgIC8vCisgICAgLy8gRm9yIExU
UiwgYmFzZVBvc2l0aW9uIGlzIHplcm8gc28gaXQgYWxyZWFkeSBwb2ludHMgdG8gdGhlIHN0YXJ0
IG9mIHRoZQorICAgIC8vIGZpcnN0IHNjcmlwdCBydW4uCisgICAgd2hpbGUgKHdhbGtlci5uZXh0
U2NyaXB0UnVuKCkpIHsKKyAgICAgICAgaWYgKHdhbGtlci5ydGwoKSkKKyAgICAgICAgICAgIGJh
c2VQb3NpdGlvbiAtPSB3YWxrZXIubnVtQ29kZVBvaW50cygpOworCisgICAgICAgIGlmICh4IDwg
d2Fsa2VyLndpZHRoKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSB4IHZhbHVlIGluIHF1ZXN0aW9u
IGlzIHdpdGhpbiB0aGlzIHNjcmlwdCBydW4uIFdlIGNvbnNpZGVyCisgICAgICAgICAgICAvLyBl
YWNoIGdseXBoIGluIHByZXNlbnRhdGlvbiBvcmRlciBhbmQgc3RvcCB3aGVuIHdlIGZpbmQgdGhl
IG9uZQorICAgICAgICAgICAgLy8gY292ZXJpbmcgdGhpcyBwb3NpdGlvbi4KKyAgICAgICAgICAg
IGNvbnN0IEhCX0ZpeGVkKiBhZHZhbmNlcyA9IHdhbGtlci5hZHZhbmNlcygpOworICAgICAgICAg
ICAgaW50IGdseXBoSW5kZXg7CisgICAgICAgICAgICBpZiAod2Fsa2VyLnJ0bCgpKSB7CisgICAg
ICAgICAgICAgICAgZm9yIChnbHlwaEluZGV4ID0gd2Fsa2VyLmxlbmd0aCgpIC0gMTsgZ2x5cGhJ
bmRleCA+PSAwOyAtLWdseXBoSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPCB0
cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIoYWR2YW5jZXNbZ2x5cGhJbmRleF0pKQorICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHggLT0gdHJ1bmNh
dGVGaXhlZFBvaW50VG9JbnRlZ2VyKGFkdmFuY2VzW2dseXBoSW5kZXhdKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoZ2x5cGhJ
bmRleCA9IDA7IGdseXBoSW5kZXggPCB3YWxrZXIubGVuZ3RoKCk7ICsrZ2x5cGhJbmRleCkgewor
ICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihh
ZHZhbmNlc1tnbHlwaEluZGV4XSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgeCAtPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIoYWR2YW5j
ZXNbZ2x5cGhJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGdseXBoIGluZGV4LCB3ZSBoYXZlIHRvIHR1
cm4gdGhhdCBpbnRvIGEKKyAgICAgICAgICAgIC8vIGNvZGUtcG9pbnQgaW5kZXguIEJlY2F1c2Ug
b2YgbGlnYXR1cmVzLCBzZXZlcmFsIGNvZGUtcG9pbnRzIG1heQorICAgICAgICAgICAgLy8gaGF2
ZSBnb25lIGludG8gYSBzaW5nbGUgZ2x5cGguIFdlIGl0ZXJhdGUgb3ZlciB0aGUgY2x1c3RlcnMg
bG9nCisgICAgICAgICAgICAvLyBhbmQgZmluZCB0aGUgZmlyc3QgY29kZS1wb2ludCB3aGljaCBj
b250cmlidXRlZCB0byB0aGUgZ2x5cGguCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9y
dCogbG9nID0gd2Fsa2VyLmxvZ0NsdXN0ZXJzKCk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGogPSAwOyBqIDwgd2Fsa2VyLm51bUNvZGVQb2ludHMoKTsgKytqKSB7CisgICAgICAgICAgICAg
ICAgaWYgKGxvZ1tqXSA9PSBnbHlwaEluZGV4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
YmFzZVBvc2l0aW9uICsgajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgIH0KKworICAgICAgICB4IC09IHdhbGtlci53aWR0aCgpOwor
CisgICAgICAgIGlmICghd2Fsa2VyLnJ0bCgpKQorICAgICAgICAgICAgYmFzZVBvc2l0aW9uICs9
IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7CisgICAgfQorCisgICAgcmV0dXJuIGJhc2VQb3NpdGlv
bjsKIH0KIAorLy8gUmV0dXJuIHRoZSByZWN0YW5nbGUgZm9yIHNlbGVjdGluZyB0aGUgZ2l2ZW4g
cmFuZ2Ugb2YgY29kZS1wb2ludHMgaW4gdGhlIFRleHRSdW4uCiBGbG9hdFJlY3QgRm9udDo6c2Vs
ZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50UG9pbnQmIHBvaW50LCBp
bnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
SW50UG9pbnQmIHBvaW50LCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewotICAgIG5vdEltcGxl
bWVudGVkKCk7Ci0gICAgcmV0dXJuIEZsb2F0UmVjdCgpOworICAgIFNrUGFpbnQgcGFpbnQ7Cisg
ICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgZm9udCA9IGZvbnREYXRhRm9yQ2hhcmFjdGVycyhy
dW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpLT5mb250RGF0YUZvckNoYXJhY3RlcignICcp
LT5wbGF0Zm9ybURhdGEoKTsKKyAgICBmb250LnNldHVwUGFpbnQoJnBhaW50KTsKKworICAgIGlu
dCBmcm9tWCA9IC0xLCB0b1ggPSAtMSwgZnJvbUFkdmFuY2UgPSAtMSwgdG9BZHZhbmNlID0gLTE7
CisKKyAgICAvLyBGb3IgUlRMIHdlJ2xsIG5lZWQgdG8ga25vdyB0aGUgd2lkdGggb2YgdGhlIGZ1
bGwgVGV4dFJ1bi4KKyAgICBUZXh0UnVuV2Fsa2VyIHdhbGtlcihydW4sICZwYWludCwgMCwgJmZv
bnQpOworICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICBpZiAod2Fsa2VyLnJ0bCgpKSB7CisgICAg
ICAgIHdoaWxlICh3YWxrZXIubmV4dFNjcmlwdFJ1bigpKQorICAgICAgICAgICAgd2lkdGggKz0g
d2Fsa2VyLndpZHRoKCk7CisgICAgfQorCisgICAgLy8gV2Ugd2FudCB0byBlbnVtZXJhdGUgdGhl
IHNjcmlwdCBydW5zIGluIGNvZGUgcG9pbnQgb3JkZXIgaW4gdGhlIGZvbGxvd2luZworICAgIC8v
IGNvZGUuIFRoaXMgY2FsbCBhbHNvIHJlc2V0cyB8d2Fsa2VyfC4KKyAgICB3YWxrZXIuc2V0QmFj
a3dhcmRzSXRlcmF0aW9uKGZhbHNlKTsKKyAgICAvLyBUZXh0UnVuV2Fsa2VyIHdpbGwgaGVscGZ1
bGx5IGFjY3VsdWxhdGUgdGhlIHggb2Zmc2V0cyBmb3IgZGlmZmVyZW50CisgICAgLy8gc2NyaXB0
IHJ1bnMgZm9yIHVzLiBGb3IgdGhpcyBjb2RlLCBob3dldmVyLCB3ZSBhbHdheXMgd2FudCB0aGUg
eCBvZmZzZXRzCisgICAgLy8gdG8gc3RhcnQgZnJvbSB6ZXJvIHNvIHdlIGNhbGwgdGhpcyBiZWZv
cmUgZWFjaCBzY3JpcHQgcnVuLgorICAgIHdhbGtlci5zZXRYT2Zmc2V0KDApOworCisgICAgLy8g
QmFzZSB3aWxsIHBvaW50IHRvIHRoZSB4IG9mZnNldCBmb3IgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1
bi4gTm90ZSB0aGF0LCBpbgorICAgIC8vIHRoZSBMVFIgY2FzZSwgd2lkdGggd2lsbCBiZSAwLgor
ICAgIGludCBiYXNlID0gd2lkdGg7CisgICAgY29uc3QgaW50IGxlZnRFZGdlID0gYmFzZTsKKwor
ICAgIHdoaWxlICh3YWxrZXIubmV4dFNjcmlwdFJ1bigpICYmIChmcm9tWCA9PSAtMSB8fCB0b1gg
PT0gLTEpKSB7CisgICAgICAgIGlmICh3YWxrZXIucnRsKCkpCisgICAgICAgICAgICBiYXNlIC09
IHdhbGtlci53aWR0aCgpOworCisgICAgICAgIGlmIChmcm9tWCA9PSAtMSAmJiBmcm9tIDwgd2Fs
a2VyLm51bUNvZGVQb2ludHMoKSkgeworICAgICAgICAgICAgLy8gfGZyb218IGlzIHdpdGhpbiB0
aGlzIHNjcmlwdCBydW4uIFNvIHdlIGluZGV4IHRoZSBjbHVzdGVycyBsb2cgdG8KKyAgICAgICAg
ICAgIC8vIGZpbmQgd2hpY2ggZ2x5cGggdGhpcyBjb2RlLXBvaW50IGNvbnRyaWJ1dGVkIHRvIGFu
ZCBmaW5kIGl0cyB4CisgICAgICAgICAgICAvLyBwb3NpdGlvbi4KKyAgICAgICAgICAgIGludCBn
bHlwaCA9IHdhbGtlci5sb2dDbHVzdGVycygpW2Zyb21dOworICAgICAgICAgICAgZnJvbVggPSBi
YXNlICsgd2Fsa2VyLnhQb3NpdGlvbnMoKVtnbHlwaF07CisgICAgICAgICAgICBmcm9tQWR2YW5j
ZSA9IHdhbGtlci5hZHZhbmNlcygpW2dseXBoXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICBmcm9tIC09IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7CisKKyAgICAgICAgaWYgKHRvWCA9PSAt
MSAmJiB0byA8IHdhbGtlci5udW1Db2RlUG9pbnRzKCkpIHsKKyAgICAgICAgICAgIGludCBnbHlw
aCA9IHdhbGtlci5sb2dDbHVzdGVycygpW3RvXTsKKyAgICAgICAgICAgIHRvWCA9IGJhc2UgKyB3
YWxrZXIueFBvc2l0aW9ucygpW2dseXBoXTsKKyAgICAgICAgICAgIHRvQWR2YW5jZSA9IHdhbGtl
ci5hZHZhbmNlcygpW2dseXBoXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0byAtPSB3
YWxrZXIubnVtQ29kZVBvaW50cygpOworCisgICAgICAgIGlmICghd2Fsa2VyLnJ0bCgpKQorICAg
ICAgICAgICAgYmFzZSArPSB3YWxrZXIud2lkdGgoKTsKKyAgICAgICAgd2Fsa2VyLnNldFhPZmZz
ZXQoMCk7CisgICAgfQorCisgICAgLy8gVGhlIHBvc2l0aW9uIGluIHF1ZXN0aW9uIG1pZ2h0IGJl
IGp1c3QgYWZ0ZXIgdGhlIHRleHQuCisgICAgY29uc3QgaW50IHJpZ2h0RWRnZSA9IGJhc2U7Cisg
ICAgaWYgKGZyb21YID09IC0xICYmICFmcm9tKQorICAgICAgICBmcm9tWCA9IGxlZnRFZGdlOwor
ICAgIGVsc2UgaWYgKHdhbGtlci5ydGwoKSkKKyAgICAgICBmcm9tWCArPSB0cnVuY2F0ZUZpeGVk
UG9pbnRUb0ludGVnZXIoZnJvbUFkdmFuY2UpOworCisgICAgaWYgKHRvWCA9PSAtMSAmJiAhdG8p
CisgICAgICAgIHRvWCA9IHJpZ2h0RWRnZTsKKyAgICBlbHNlIGlmICghd2Fsa2VyLnJ0bCgpKQor
ICAgICAgICB0b1ggKz0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKHRvQWR2YW5jZSk7CisK
KyAgICBBU1NFUlQoZnJvbVggIT0gLTEgJiYgdG9YICE9IC0xKTsKKworICAgIGlmIChmcm9tWCA8
IHRvWCkKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmcm9tWCwgcG9pbnQu
eSgpLCB0b1ggLSBmcm9tWCwgaGVpZ2h0KTsKKworICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQu
eCgpICsgdG9YLCBwb2ludC55KCksIGZyb21YIC0gdG9YLCBoZWlnaHQpOwogfQogCi19ICAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEuY3BwIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjk3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0hhcmZidXp6U2tpYS5jcHAKQEAgLTAsMCAr
MSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJGb250UGxhdGZvcm1EYXRh
LmgiCisjaW5jbHVkZSAid3RmL093bkFycmF5UHRyLmgiCisKKyNpbmNsdWRlICJTa0ZvbnRIb3N0
LmgiCisjaW5jbHVkZSAiU2tQYWludC5oIgorI2luY2x1ZGUgIlNrUGF0aC5oIgorI2luY2x1ZGUg
IlNrUG9pbnQuaCIKKyNpbmNsdWRlICJTa1JlY3QuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVk
ZSAiaGFyZmJ1enotc2hhcGVyLmgiCit9CisKKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBj
YWxsYmFja3Mgd2hpY2ggSGFyZmJ1enogcmVxdWlyZXMgYnkgdXNpbmcgU2tpYQorLy8gY2FsbHMu
IFNlZSB0aGUgSGFyZmJ1enogc291cmNlIGZvciByZWZlcmVuY2VzIGFib3V0IHdoYXQgdGhlc2Ug
Y2FsbGJhY2tzIGRvLgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBIQl9GaXhlZCBT
a2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKFNrU2NhbGFyIHZhbHVlKQoreworICAgIC8vIEhCX0Zp
eGVkIGlzIGEgMjYuNiBmaXhlZCBwb2ludCBmb3JtYXQuCisgICAgcmV0dXJuIHZhbHVlICogNjQ7
Cit9CisKK3N0YXRpYyBIQl9Cb29sIFN0cmluZ1RvR2x5cGhzKEhCX0ZvbnQgaGJGb250LCBjb25z
dCBIQl9VQ2hhcjE2KiBjaGFyYWN0ZXJzLCBoYl91aW50MzIgbGVuZ3RoLCBIQl9HbHlwaCogZ2x5
cGhzLCBoYl91aW50MzIqIGdseXBoc1NpemUsIEhCX0Jvb2wgaXNSVEwpCit7CisgICAgRm9udFBs
YXRmb3JtRGF0YSogZm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGhi
Rm9udC0+dXNlckRhdGEpOworICAgIFNrUGFpbnQgcGFpbnQ7CisKKyAgICBmb250LT5zZXR1cFBh
aW50KCZwYWludCk7CisgICAgcGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtVVEYxNl9U
ZXh0RW5jb2RpbmcpOworICAgIGludCBudW1HbHlwaHMgPSBwYWludC50ZXh0VG9HbHlwaHMoY2hh
cmFjdGVycywgbGVuZ3RoICogc2l6ZW9mKHVpbnQxNl90KSwgcmVpbnRlcnByZXRfY2FzdDx1aW50
MTZfdCo+KGdseXBocykpOworCisgICAgLy8gSEJfR2x5cGggaXMgMzItYml0LCBidXQgU2tpYSBv
dXRwdXRzIG9ubHkgMTYtYml0IG51bWJlcnMuIFNvIG91cgorICAgIC8vIHxnbHlwaHN8IGFycmF5
IG5lZWRzIHRvIGJlIGNvbnZlcnRlZC4KKyAgICBmb3IgKGludCBpID0gbnVtR2x5cGhzIC0gMTsg
aSA+PSAwOyAtLWkpIHsKKyAgICAgICAgdWludDE2X3QgdmFsdWU7CisgICAgICAgIC8vIFdlIHVz
ZSBhIG1lbWNweSB0byBhdm9pZCBicmVha2luZyBzdHJpY3QgYWxpYXNpbmcgcnVsZXMuCisgICAg
ICAgIG1lbWNweSgmdmFsdWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGdseXBocykgKyBzaXpl
b2YodWludDE2X3QpICogaSwgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgIGdseXBoc1tpXSA9
IHZhbHVlOworICAgIH0KKworICAgICpnbHlwaHNTaXplID0gbnVtR2x5cGhzOworICAgIHJldHVy
biAxOworfQorCitzdGF0aWMgdm9pZCBHbHlwaHNUb0FkdmFuY2VzKEhCX0ZvbnQgaGJGb250LCBj
b25zdCBIQl9HbHlwaCogZ2x5cGhzLCBoYl91aW50MzIgbnVtR2x5cGhzLCBIQl9GaXhlZCogYWR2
YW5jZXMsIGludCBmbGFncykKK3sKKyAgICBGb250UGxhdGZvcm1EYXRhKiBmb250ID0gcmVpbnRl
cnByZXRfY2FzdDxGb250UGxhdGZvcm1EYXRhKj4oaGJGb250LT51c2VyRGF0YSk7CisgICAgU2tQ
YWludCBwYWludDsKKworICAgIGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsKKyAgICBwYWludC5z
ZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKKworICAgIE93
bkFycmF5UHRyPHVpbnQxNl90PiBnbHlwaHMxNihuZXcgdWludDE2X3RbbnVtR2x5cGhzXSk7Cisg
ICAgaWYgKCFnbHlwaHMxNi5nZXQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkKKyAgICAgICAgZ2x5cGhzMTZbaV0gPSBnbHlw
aHNbaV07CisgICAgcGFpbnQuZ2V0VGV4dFdpZHRocyhnbHlwaHMxNi5nZXQoKSwgbnVtR2x5cGhz
ICogc2l6ZW9mKHVpbnQxNl90KSwgcmVpbnRlcnByZXRfY2FzdDxTa1NjYWxhcio+KGFkdmFuY2Vz
KSk7CisKKyAgICAvLyBUaGUgfGFkdmFuY2VzfCB2YWx1ZXMgd2hpY2ggU2tpYSBvdXRwdXRzIGFy
ZSBTa1NjYWxhcnMsIHdoaWNoIGFyZSBmbG9hdHMKKyAgICAvLyBpbiBDaHJvbWl1bS4gSG93ZXZl
ciwgSGFyZmJ1enogd2FudHMgdGhlbSBpbiAyNi42IGZpeGVkIHBvaW50IGZvcm1hdC4KKyAgICAv
LyBUaGVzZSB0d28gZm9ybWF0cyBhcmUgYm90aCAzMi1iaXRzIGxvbmcuCisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CisgICAgICAgIGZsb2F0IHZhbHVlOwor
ICAgICAgICAvLyBXZSB1c2UgYSBtZW1jcHkgdG8gYXZvaWQgYnJlYWtpbmcgc3RyaWN0IGFsaWFz
aW5nIHJ1bGVzLgorICAgICAgICBtZW1jcHkoJnZhbHVlLCByZWludGVycHJldF9jYXN0PGNoYXIq
PihhZHZhbmNlcykgKyBzaXplb2YoZmxvYXQpICogaSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAg
IGFkdmFuY2VzW2ldID0gU2tpYVNjYWxhclRvSGFyZmJ1enpGaXhlZCh2YWx1ZSk7CisgICAgfQor
fQorCitzdGF0aWMgSEJfQm9vbCBDYW5SZW5kZXIoSEJfRm9udCBoYkZvbnQsIGNvbnN0IEhCX1VD
aGFyMTYqIGNoYXJhY3RlcnMsIGhiX3VpbnQzMiBsZW5ndGgpCit7CisgICAgRm9udFBsYXRmb3Jt
RGF0YSogZm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGhiRm9udC0+
dXNlckRhdGEpOworICAgIFNrUGFpbnQgcGFpbnQ7CisKKyAgICBmb250LT5zZXR1cFBhaW50KCZw
YWludCk7CisgICAgcGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtVVEYxNl9UZXh0RW5j
b2RpbmcpOworCisgICAgT3duQXJyYXlQdHI8dWludDE2X3Q+IGdseXBoczE2KG5ldyB1aW50MTZf
dFtsZW5ndGhdKTsKKyAgICBpZiAoIWdseXBoczE2LmdldCgpKQorICAgICAgICByZXR1cm4gMDsK
KyAgICBpbnQgbnVtR2x5cGhzID0gcGFpbnQudGV4dFRvR2x5cGhzKGNoYXJhY3RlcnMsIGxlbmd0
aCAqIHNpemVvZih1aW50MTZfdCksIGdseXBoczE2LmdldCgpKTsKKworICAgIGJvb2wgY2FuUmVu
ZGVyID0gdHJ1ZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7Cisg
ICAgICAgIGlmICghZ2x5cGhzMTZbaV0pIHsKKyAgICAgICAgICAgIGNhblJlbmRlciA9IGZhbHNl
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2Fu
UmVuZGVyOworfQorCitzdGF0aWMgSEJfRXJyb3IgR2V0T3V0bGluZVBvaW50KEhCX0ZvbnQgaGJG
b250LCBIQl9HbHlwaCBnbHlwaCwgaW50IGZsYWdzLCBoYl91aW50MzIgcG9pbnQsIEhCX0ZpeGVk
KiB4UG9zLCBIQl9GaXhlZCogeVBvcywgaGJfdWludDMyKiByZXN1bHRpbmdOdW1Qb2ludHMpCit7
CisgICAgRm9udFBsYXRmb3JtRGF0YSogZm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRm
b3JtRGF0YSo+KGhiRm9udC0+dXNlckRhdGEpOworICAgIFNrUGFpbnQgcGFpbnQ7CisKKyAgICBp
ZiAoZmxhZ3MgJiBIQl9TaGFwZXJGbGFnX1VzZURlc2lnbk1ldHJpY3MpCisgICAgICAgIHJldHVy
biBIQl9FcnJfSW52YWxpZF9Bcmd1bWVudDsgIC8vIFRoaXMgaXMgcmVxdWVzdGluZyBwcmUtaGlu
dGVkIHBvc2l0aW9ucy4gV2UgY2FuJ3Qgc3VwcG9ydCB0aGlzLgorCisgICAgZm9udC0+c2V0dXBQ
YWludCgmcGFpbnQpOworICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJ
RF9UZXh0RW5jb2RpbmcpOworICAgIHVpbnQxNl90IGdseXBoMTYgPSBnbHlwaDsKKyAgICBTa1Bh
dGggcGF0aDsKKyAgICBwYWludC5nZXRUZXh0UGF0aCgmZ2x5cGgxNiwgc2l6ZW9mKGdseXBoMTYp
LCAwLCAwLCAmcGF0aCk7CisgICAgaW50IG51bVBvaW50cyA9IHBhdGguZ2V0UG9pbnRzKE5VTEws
IDApOworICAgIGlmIChwb2ludCA+PSBudW1Qb2ludHMpCisgICAgICAgIHJldHVybiBIQl9FcnJf
SW52YWxpZF9TdWJUYWJsZTsKKyAgICBTa1BvaW50KiBwb2ludHMgPSAoU2tQb2ludCopIGZhc3RN
YWxsb2Moc2l6ZW9mKFNrUG9pbnQpICogKHBvaW50ICsgMSkpOworICAgIGlmICghcG9pbnRzKQor
ICAgICAgICByZXR1cm4gSEJfRXJyX0ludmFsaWRfU3ViVGFibGU7CisgICAgcGF0aC5nZXRQb2lu
dHMocG9pbnRzLCBwb2ludCArIDEpOworICAgICp4UG9zID0gU2tpYVNjYWxhclRvSGFyZmJ1enpG
aXhlZChwb2ludHNbcG9pbnRdLmZYKTsKKyAgICAqeVBvcyA9IFNraWFTY2FsYXJUb0hhcmZidXp6
Rml4ZWQocG9pbnRzW3BvaW50XS5mWSk7CisgICAgKnJlc3VsdGluZ051bVBvaW50cyA9IG51bVBv
aW50czsKKyAgICBmYXN0RnJlZShwb2ludHMpOworCisgICAgcmV0dXJuIEhCX0Vycl9PazsKK30K
Kworc3RhdGljIHZvaWQgR2V0R2x5cGhNZXRyaWNzKEhCX0ZvbnQgaGJGb250LCBIQl9HbHlwaCBn
bHlwaCwgSEJfR2x5cGhNZXRyaWNzKiBtZXRyaWNzKQoreworICAgIEZvbnRQbGF0Zm9ybURhdGEq
IGZvbnQgPSByZWludGVycHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihoYkZvbnQtPnVzZXJE
YXRhKTsKKyAgICBTa1BhaW50IHBhaW50OworCisgICAgZm9udC0+c2V0dXBQYWludCgmcGFpbnQp
OworICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2Rp
bmcpOworICAgIHVpbnQxNl90IGdseXBoMTYgPSBnbHlwaDsKKyAgICBTa1NjYWxhciB3aWR0aDsK
KyAgICBTa1JlY3QgYm91bmRzOworICAgIHBhaW50LmdldFRleHRXaWR0aHMoJmdseXBoMTYsIHNp
emVvZihnbHlwaDE2KSwgJndpZHRoLCAmYm91bmRzKTsKKworICAgIG1ldHJpY3MtPnggPSBTa2lh
U2NhbGFyVG9IYXJmYnV6ekZpeGVkKHdpZHRoKTsKKyAgICAvLyBXZSBjYW4ndCBhY3R1YWxseSBn
ZXQgdGhlIHx5fCBjb3JyZWN0IGJlY2F1c2UgU2tpYSBkb2Vzbid0IGV4cG9ydAorICAgIC8vIHRo
ZSB2ZXJ0aWNhbCBhZHZhbmNlLiBIb3dldmVyLCBub3Igd2UgZG8gZXZlciByZW5kZXIgdmVydGlj
YWwgdGV4dCBhdAorICAgIC8vIHRoZSBtb21lbnQgc28gaXQncyB1bmltcG9ydGFudC4KKyAgICBt
ZXRyaWNzLT55ID0gMDsKKyAgICBtZXRyaWNzLT53aWR0aCA9IFNraWFTY2FsYXJUb0hhcmZidXp6
Rml4ZWQoYm91bmRzLndpZHRoKCkpOworICAgIG1ldHJpY3MtPmhlaWdodCA9IFNraWFTY2FsYXJU
b0hhcmZidXp6Rml4ZWQoYm91bmRzLmhlaWdodCgpKTsKKyAgICBtZXRyaWNzLT54T2Zmc2V0ID0g
U2tpYVNjYWxhclRvSGFyZmJ1enpGaXhlZChib3VuZHMuZkxlZnQpOworICAgIG1ldHJpY3MtPnhP
ZmZzZXQgPSBTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKGJvdW5kcy5mVG9wKTsKK30KKworc3Rh
dGljIEhCX0ZpeGVkIEdldEZvbnRNZXRyaWMoSEJfRm9udCBoYkZvbnQsIEhCX0ZvbnRNZXRyaWMg
bWV0cmljKQoreworICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSByZWludGVycHJldF9jYXN0
PEZvbnRQbGF0Zm9ybURhdGEqPihoYkZvbnQtPnVzZXJEYXRhKTsKKyAgICBTa1BhaW50IHBhaW50
OworCisgICAgZm9udC0+c2V0dXBQYWludCgmcGFpbnQpOworICAgIFNrUGFpbnQ6OkZvbnRNZXRy
aWNzIHNraWFNZXRyaWNzOworICAgIHBhaW50LmdldEZvbnRNZXRyaWNzKCZza2lhTWV0cmljcyk7
CisKKyAgICBzd2l0Y2ggKG1ldHJpYykgeworICAgIGNhc2UgSEJfRm9udEFzY2VudDoKKyAgICAg
ICAgcmV0dXJuIFNraWFTY2FsYXJUb0hhcmZidXp6Rml4ZWQoLXNraWFNZXRyaWNzLmZBc2NlbnQp
OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworSEJfRm9udENs
YXNzIGhhcmZidXp6U2tpYUNsYXNzID0geworICBTdHJpbmdUb0dseXBocywKKyAgR2x5cGhzVG9B
ZHZhbmNlcywKKyAgQ2FuUmVuZGVyLAorICBHZXRPdXRsaW5lUG9pbnQsCisgIEdldEdseXBoTWV0
cmljcywKKyAgR2V0Rm9udE1ldHJpYywKK307CisKK0hCX0Vycm9yIGhhcmZidXp6U2tpYUdldFRh
YmxlKHZvaWQqIHZvaWRmYWNlLCBjb25zdCBIQl9UYWcgdGFnLCBIQl9CeXRlKiBidWZmZXIsIEhC
X1VJbnQqIGxlbikKK3sKKyAgICBGb250UGxhdGZvcm1EYXRhKiBmb250ID0gcmVpbnRlcnByZXRf
Y2FzdDxGb250UGxhdGZvcm1EYXRhKj4odm9pZGZhY2UpOworCisgICAgY29uc3Qgc2l6ZV90IHRh
YmxlU2l6ZSA9IFNrRm9udEhvc3Q6OkdldFRhYmxlU2l6ZShmb250LT51bmlxdWVJRCgpLCB0YWcp
OworICAgIGlmICghdGFibGVTaXplKQorICAgICAgICByZXR1cm4gSEJfRXJyX0ludmFsaWRfQXJn
dW1lbnQ7CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgKmxlbiA9IHRhYmxlU2l6ZTsKKyAg
ICAgICAgcmV0dXJuIEhCX0Vycl9PazsKKyAgICB9CisKKyAgICBpZiAoKmxlbiA8IHRhYmxlU2l6
ZSkKKyAgICAgICAgcmV0dXJuIEhCX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworICAgIFNrRm9udEhv
c3Q6OkdldFRhYmxlRGF0YShmb250LT51bmlxdWVJRCgpLCB0YWcsIDAsIHRhYmxlU2l6ZSwgYnVm
ZmVyKTsKKyAgICByZXR1cm4gSEJfRXJyX09rOworfQorCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQo=
</data>
<flag name="review"
          id="16425"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>