<?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>83045</bug_id>
          
          <creation_ts>2012-04-03 10:26:14 -0700</creation_ts>
          <short_desc>Improve line breaking performance for complex text</short_desc>
          <delta_ts>2013-12-19 10:23:52 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Text</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>Unspecified</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ned Holbrook">ned</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>adele</cc>
    
    <cc>d-r</cc>
    
    <cc>enrica</cc>
    
    <cc>eric</cc>
    
    <cc>gustavo</cc>
    
    <cc>hyatt</cc>
    
    <cc>jchaffraix</cc>
    
    <cc>leviw</cc>
    
    <cc>mitz</cc>
    
    <cc>mmaxfield</cc>
    
    <cc>pnormand</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>594606</commentid>
    <comment_count>0</comment_count>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-04-03 10:26:14 -0700</bug_when>
    <thetext>Profiling on Mac and iOS has shown that measuring complex text by creating a ComplexTextController for each word is suboptimal. This patch addresses this for RenderBlock::LineBreaker::nextLineBreak by creating and reusing a ComplexTextController per RenderText. Benchmarks using a simple test app show a 35% improvement when laying out a paragraph of English text with optimizeLegibility.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594620</commentid>
    <comment_count>1</comment_count>
      <attachid>135359</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-04-03 10:34:09 -0700</bug_when>
    <thetext>Created attachment 135359
Proposed changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594644</commentid>
    <comment_count>2</comment_count>
      <attachid>135359</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-04-03 10:57:10 -0700</bug_when>
    <thetext>Comment on attachment 135359
Proposed changes.

Attachment 135359 did not pass win-ews (win):
Output: http://queues.webkit.org/results/12323213</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594649</commentid>
    <comment_count>3</comment_count>
      <attachid>135359</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2012-04-03 11:03:55 -0700</bug_when>
    <thetext>Comment on attachment 135359
Proposed changes.

Attachment 135359 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/12322256</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594650</commentid>
    <comment_count>4</comment_count>
      <attachid>135366</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-04-03 11:05:38 -0700</bug_when>
    <thetext>Created attachment 135366
Fix EWS failures.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594656</commentid>
    <comment_count>5</comment_count>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-04-03 11:13:21 -0700</bug_when>
    <thetext>Sorry, that&apos;s probably going to need a nullptr...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594659</commentid>
    <comment_count>6</comment_count>
      <attachid>135369</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-04-03 11:15:08 -0700</bug_when>
    <thetext>Created attachment 135369
Fix EWS failures, again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>620753</commentid>
    <comment_count>7</comment_count>
      <attachid>141204</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-05-10 11:22:17 -0700</bug_when>
    <thetext>Created attachment 141204
Rebased patch.

Rebased and retested (on Lion). I made one change relative to the previous patch by not taking the new path when positional effects (tabs) are enabled; although there were no test failures due to the previous patch, tabs could have had unwanted side effects.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>647209</commentid>
    <comment_count>8</comment_count>
      <attachid>141204</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-06-12 13:12:33 -0700</bug_when>
    <thetext>Comment on attachment 141204
Rebased patch.

View in context: https://bugs.webkit.org/attachment.cgi?id=141204&amp;action=review

This generally looks good to me. There are some stylistic issues that should be fixed before landing. I’m going to say r=me but I’d also like the patch to state what performance results we achieved with this change.

Someone even more expert with this part of WebKit might have some other more substantive comments.

&gt; Source/WebCore/ChangeLog:24
&gt; +        (WTF): Define deleteOwnedPtr for TextLayout as calling through destroyLayout; relying on operator delete is not workable as the class does not exist on all platforms.

Normally what we’d do is put a platform #if around the line of code that defines the data member of type OwnPtr&lt;TextLayout&gt;.

&gt; Source/WebCore/ChangeLog:26
&gt; +        (WebCore): Implement no-op TextLayout wrappers for non-Mac platforms.

I’m not sure this is the right approach.

&gt; Source/WebCore/platform/graphics/Font.cpp:33
&gt; +#if !PLATFORM(MAC)
&gt; +#include &quot;NotImplemented.h&quot;
&gt; +#endif

Conditional includes normally go in a separate paragraph after the main includes.

Alternatively, I think it’s OK to include this unconditionally.

&gt; Source/WebCore/platform/graphics/Font.cpp:47
&gt; +template &lt;&gt; void deleteOwnedPtr&lt;WebCore::TextLayout&gt;(WebCore::TextLayout* ptr)

Might be useful to put ac moment here explaining why we did this. I think the answer is that it allows use to compile the destruction of OwnPtr&lt;TextLayout&gt; in source files that don’t have access to the TextLayout class definition.

I’m not sure it’s worth it -- we haven’t done this for any other classes in WebCore -- but it’s probably OK.

&gt; Source/WebCore/platform/graphics/Font.h:316
&gt; +template &lt;&gt; void deleteOwnedPtr&lt;WebCore::TextLayout&gt;(WebCore::TextLayout* ptr);

Should omit the argument name here to match usual WebKit coding style.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:53
&gt; +        TextRun run = RenderBlock::constructTextRun(text, font, text-&gt;characters(), text-&gt;textLength(), text-&gt;style());
&gt; +        Font::CodePath codePathToUse = font.codePath(run);
&gt; +        return codePathToUse == Font::Complex;

Might be more readable to eliminate the two local variables. Or you could at least omit the second one.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:57
&gt; +        : m_font(font)

I suggest adding a helper function that returns a font with word spacing set to 0 so we can initialize this.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:58
&gt; +        , m_run(0, 0)

Then we can initialize this properly as well. I suggest making a helper function to do that so we don’t have to first initialize it to (0, 0) just to overwrite it a moment later.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:68
&gt; +        m_controller = new ComplexTextController(&amp;m_font, m_run, true);

Then this could be done with initialization too. This should use an OwnPtr and adoptPtr.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:73
&gt; +    ~TextLayout()
&gt; +    {
&gt; +        delete m_controller;
&gt; +    }

This function wouldn’t be necessary if we used OwnPtr.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:86
&gt; +    TextRun m_run;

Do we need to keep the TextRun around after making the ComplexTextController? I think I can see why we might need to keep m_font around, but not clear on why we have to keep m_run around.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:106
&gt; +void Font::destroyLayout(TextLayout* layout)
&gt; +{
&gt; +    delete layout;
&gt; +}

On further reflection, I think we should just put the TextLayout class in a header so we don’t need this function.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:111
&gt; +float Font::width(TextLayout&amp; layout, unsigned from, unsigned to)
&gt; +{
&gt; +    return layout.width(from, to);
&gt; +}

Or this function.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:485
&gt; +            const ComplexTextRun&amp; complexTextRun = *m_complexTextRuns[r];
&gt; +            leftmostGlyph += complexTextRun.glyphCount();

I don’t think you need the local variable here.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:493
&gt; +            unsigned r = m_runIndices.last();

I don’t think this local variable helps readability.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:494
&gt; +            const ComplexTextRun&amp; currentTextRun = *m_complexTextRuns[r];

I suggest naming this local variable just &quot;run&quot; rather than &quot;currentTextRun&quot;.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:495
&gt; +            offset = currentTextRun.stringLocation() + currentTextRun.indexEnd();

If there was a helper function that did this addition, either a member function or a free function, then we would not need the local variable.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:498
&gt; +        for (unsigned q = 0; q &lt; runCount; ++q) {

We normally name these loop variables i in WebKit.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:499
&gt; +            const ComplexTextRun&amp; complexTextRun = *m_complexTextRuns[q];

More of the same.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:500
&gt; +            if (offset == complexTextRun.stringLocation() + complexTextRun.indexBegin()) {

More of the same.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:507
&gt; +    unsigned r = m_runIndices[m_currentRun];

We typically use words rather than letters for variable names in WebKit, with only one or two customary exceptions.

Maybe this could be named currentRunIndex?

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:508
&gt; +    for (unsigned q = 0; q &lt; r; ++q) {

We normally name these loop variables i in WebKit.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:510
&gt; +        const ComplexTextRun&amp; complexTextRun = *m_complexTextRuns[q];
&gt; +        leftmostGlyph += complexTextRun.glyphCount();

More of the same.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:519
&gt; +        const ComplexTextRun&amp; currentTextRun = *m_complexTextRuns[m_currentRun++];
&gt; +        leftmostGlyph += currentTextRun.glyphCount();

Again, I think this would read better without the local variable.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:546
&gt; +    unsigned r = indexOfCurrentRun(leftmostGlyph);

Should be named leftmostGlyphIndex.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:552
&gt;          unsigned g = ltr ? m_glyphInCurrentRun : glyphCount - 1 - m_glyphInCurrentRun;
&gt; +        unsigned k = leftmostGlyph + g;

Sad to see the existing code used &quot;g&quot; and &quot;k&quot; for these. I don’t recommend changing that at this time, though.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.h:171
&gt; +    Vector&lt;unsigned, 16&gt; m_runIndices;

Where did the number 16 come from? I guess the vectors above all say 64 with no comment saying where that came from.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670125</commentid>
    <comment_count>9</comment_count>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-07-15 23:50:43 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; On further reflection, I think we should just put the TextLayout class in a header so we don’t need this function.

Unless I&apos;m missing something, this is actually the cleanest approach without simply moving the problem elsewhere. Part of the problem stems from the class definition needing to be visible at the point of OwnPtr declaration: this means that any header TextLayout is in also needs to include ComplexTextController.h but of course that is meant to be a private implementation detail too.
 
&gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.h:171
&gt; &gt; +    Vector&lt;unsigned, 16&gt; m_runIndices;
&gt; 
&gt; Where did the number 16 come from? I guess the vectors above all say 64 with no comment saying where that came from.

It was just a seat of the pants number. Since it&apos;s meant to correlate to reasonable number of bidi runs in a layout anyway I&apos;ve decreased it to 8 since in my tests it doesn&apos;t seem to make much difference.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670127</commentid>
    <comment_count>10</comment_count>
      <attachid>152485</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-07-15 23:52:36 -0700</bug_when>
    <thetext>Created attachment 152485
Changes per review.

Made the changes per Darin&apos;s review (minus moving TextLayout, since I haven&apos;t figured how to do so cleanly).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>673160</commentid>
    <comment_count>11</comment_count>
      <attachid>152485</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-07-18 22:02:35 -0700</bug_when>
    <thetext>Comment on attachment 152485
Changes per review.

Additional testing revealed a bug, setting r- and cq- until I have a fix ready.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>676098</commentid>
    <comment_count>12</comment_count>
      <attachid>153881</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-07-23 15:43:00 -0700</bug_when>
    <thetext>Created attachment 153881
Fixed and rebased patch.

The issue I was seeing was due a bug in my handling of the missing glyphs run constructor and has been fixed. I also rebased the patch since Mitz was kind enough to obsolete the ATSUI path.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>676158</commentid>
    <comment_count>13</comment_count>
      <attachid>153881</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-07-23 16:38:24 -0700</bug_when>
    <thetext>Comment on attachment 153881
Fixed and rebased patch.

View in context: https://bugs.webkit.org/attachment.cgi?id=153881&amp;action=review

&gt; Source/WebCore/ChangeLog:11
&gt; +        Currently RenderBlock::LineBreaker::nextLineBreak assumes that measuring individual words is as cheap
&gt; +        as free. This is not the case when dealing with complex text, which benefits from laying out as much
&gt; +        text as possible and by reusing that layout when feasible: by doing so this patch improves line
&gt; +        breaking by 35% as measured with a simple test app.

Do we have data that indicates no additional cost when not using the complex text case?

&gt; Source/WebCore/platform/graphics/Font.cpp:213
&gt; +PassOwnPtr&lt;TextLayout&gt; Font::createLayout(RenderText*, float xPos, bool collapseWhiteSpace) const

Normally we’d leave out all the argument names here to avoid unused argument warnings.

&gt; Source/WebCore/platform/graphics/Font.cpp:222
&gt; +float Font::width(TextLayout&amp;, unsigned from, unsigned to)

Here too. Leave out the argument names.

&gt; Source/WebCore/platform/graphics/Font.cpp:224
&gt; +    notImplemented();

I think we want ASSERT_NOT_REACHED() here rather than just notImplemented().

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:50
&gt; +    static Font fontWithNoWordSpacing(const Font&amp; originalFont)

Seems this could be private. Or a non-member helper function outside the class.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:57
&gt; +    static TextRun constructTextRun(RenderText* text, const Font&amp; font, float xPos)

This could/should be private.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:70
&gt; +        , m_controller(adoptPtr(new ComplexTextController(&amp;m_font, m_run, true)))

The use of a boolean here leads to not-all-that-readable code. What does true mean? In WebKit we normally avoid this, or used named enums for them, to prevent that problem.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:76
&gt; +        m_controller-&gt;advance(from, 0, true);

Same problem here with the boolean argument.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:78
&gt; +        m_controller-&gt;advance(from + len, 0, true);

And here.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:94
&gt; +    if (collapseWhiteSpace &amp;&amp; TextLayout::isNeeded(text, *this))
&gt; +        return adoptPtr(new TextLayout(text, *this, xPos));
&gt; +    return nullptr;

It’s idiomatic in WebKit to use “early return”, which means we’d have the if statement reversed. Or use two separate if statements. The case where we actually create a TextLayout would be the one not indented.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:100
&gt; +void Font::destroyLayout(TextLayout* layout)
&gt; +{
&gt; +    delete layout;
&gt; +}

I’d have called this deleteLayout, for reasons that may be obvious here.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.h:97
&gt; +        bool ltr() const { return m_ltr; }

Normally we’d name this isLTR() rather than ltr().

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.h:119
&gt; +        bool m_ltr;

Normally we’d name this m_isLTR rather than m_ltr.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.h:133
&gt; +    Vector&lt;unsigned, 8&gt; m_runIndices;

We typically put a “why” comment near constants like this 8, to indicate where the number came from.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.h:137
&gt; +    bool m_ltrOnly;

Normally we’d name this m_isLTROnly rather than m_ltrOnly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>676172</commentid>
    <comment_count>14</comment_count>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-07-23 16:48:29 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; (From update of attachment 153881 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=153881&amp;action=review
&gt; 
&gt; Do we have data that indicates no additional cost when not using the complex text case?

Said simple test app has options to test both paths and I observed no regression when not using the complex text case.

&gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:70
&gt; &gt; +        , m_controller(adoptPtr(new ComplexTextController(&amp;m_font, m_run, true)))
&gt; 
&gt; The use of a boolean here leads to not-all-that-readable code. What does true mean? In WebKit we normally avoid this, or used named enums for them, to prevent that problem.

Agreed, although this boolean argument predates this patch.

&gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:76
&gt; &gt; +        m_controller-&gt;advance(from, 0, true);
&gt; 
&gt; Same problem here with the boolean argument.

This one is my fault, I&apos;ll fix it.

&gt; &gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:78
&gt; &gt; +        m_controller-&gt;advance(from + len, 0, true);
&gt; 
&gt; And here.

Ditto.

As for the rest of the comments, I&apos;ll make the suggested changes. Thanks, Darin.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>676424</commentid>
    <comment_count>15</comment_count>
      <attachid>153968</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-07-23 23:27:00 -0700</bug_when>
    <thetext>Created attachment 153968
More changes per review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>680243</commentid>
    <comment_count>16</comment_count>
      <attachid>141204</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-07-27 01:09:50 -0700</bug_when>
    <thetext>Comment on attachment 141204
Rebased patch.

Cleared Darin Adler&apos;s review+ from obsolete attachment 141204 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>680245</commentid>
    <comment_count>17</comment_count>
      <attachid>153881</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-07-27 01:09:54 -0700</bug_when>
    <thetext>Comment on attachment 153881
Fixed and rebased patch.

Cleared Darin Adler&apos;s review+ from obsolete attachment 153881 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>695158</commentid>
    <comment_count>18</comment_count>
      <attachid>153968</attachid>
    <who name="">mitz</who>
    <bug_when>2012-08-14 11:00:52 -0700</bug_when>
    <thetext>Comment on attachment 153968
More changes per review.

View in context: https://bugs.webkit.org/attachment.cgi?id=153968&amp;action=review

&gt; Source/WebCore/rendering/RenderBlockLineLayout.cpp:2368
&gt; +            if (textLayoutInfo.first != t) {
&gt; +                textLayoutInfo.first = t;
&gt; +                textLayoutInfo.second = f.createLayout(t, width.currentWidth(), collapseWhiteSpace);
&gt; +            }
&gt; +            TextLayout* textLayout = textLayoutInfo.second.get();

This is very similar to the treatment of lineBreakIteratorInfo further down, so I want to understand the two differences:
1) It’s not checking for a change to t-&gt;characters() (which, I believe, can occur with counters, see r107733
2) It’s outside the loop that iterates over positions in the text. I think this is actually fine, and the lineBreakIteratorInfo check can also be moved outside the loop, but I am not sure

If there’s no good reason for the textLayoutInfo treatment to differ from the lineBreakIteratorInfo treatment, then can they be united?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>695159</commentid>
    <comment_count>19</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-08-14 11:02:10 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; If there’s no good reason for the textLayoutInfo treatment to differ from the lineBreakIteratorInfo treatment, then can they be united?

I mean, can a single struct be used to hold both the line break iterator and the text layout for the current RenderText.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>695259</commentid>
    <comment_count>20</comment_count>
      <attachid>153968</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-08-14 12:38:49 -0700</bug_when>
    <thetext>Comment on attachment 153968
More changes per review.

View in context: https://bugs.webkit.org/attachment.cgi?id=153968&amp;action=review

Once you answer Dan’s comment mentioning lineBreakIteratorInfo then I’d say review+.

&gt; Source/WebCore/platform/graphics/mac/ComplexTextController.cpp:84
&gt; +    // ComplexTextController has only references to its Font and TextRun so they must be kept alive here

Need a period at the end of this sentence-style comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>702459</commentid>
    <comment_count>21</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-08-22 15:41:04 -0700</bug_when>
    <thetext>Looks like this (very cool) patch got forgotten.  Ned?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>703500</commentid>
    <comment_count>22</comment_count>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-08-23 16:04:35 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; Looks like this (very cool) patch got forgotten.  Ned?

I made a change to hopefully address Dan&apos;s question and am rebasing it now. I plan to make the new patch available by tomorrow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>703840</commentid>
    <comment_count>23</comment_count>
      <attachid>160348</attachid>
    <who name="Ned Holbrook">ned</who>
    <bug_when>2012-08-24 00:13:26 -0700</bug_when>
    <thetext>Created attachment 160348
Consolidate TextLayout and LazyLineBreakIterator into new RenderTextInfo struct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>705280</commentid>
    <comment_count>24</comment_count>
      <attachid>160348</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-27 08:11:34 -0700</bug_when>
    <thetext>Comment on attachment 160348
Consolidate TextLayout and LazyLineBreakIterator into new RenderTextInfo struct.

Rejecting attachment 160348 from commit-queue.

Failed to run &quot;[&apos;/mnt/git/webkit-commit-queue/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=queues.webkit.org&apos;, &apos;-...&quot; exit_code: 2

Last 500 characters of output:

Hunk #7 succeeded at 2433 (offset 47 lines).
Hunk #8 succeeded at 2461 (offset 47 lines).
Hunk #9 succeeded at 2487 (offset 47 lines).
Hunk #10 succeeded at 2506 (offset 47 lines).
Hunk #11 succeeded at 2632 (offset 47 lines).
1 out of 11 hunks FAILED -- saving rejects to file Source/WebCore/rendering/RenderBlockLineLayout.cpp.rej

Failed to run &quot;[u&apos;/mnt/git/webkit-commit-queue/Tools/Scripts/svn-apply&apos;, u&apos;--force&apos;, u&apos;--reviewer&apos;, u&apos;Dan Bernst...&quot; exit_code: 1 cwd: /mnt/git/webkit-commit-queue/

Full output: http://queues.webkit.org/results/13623051</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>705283</commentid>
    <comment_count>25</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-08-27 08:14:11 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; 1 out of 11 hunks FAILED -- saving rejects to file Source/WebCore/rendering/RenderBlockLineLayout.cpp.rej

I’ll land the patch myself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>705291</commentid>
    <comment_count>26</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-08-27 08:31:58 -0700</bug_when>
    <thetext>Committed as &lt;http://trac.webkit.org/r126763&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>705322</commentid>
    <comment_count>27</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2012-08-27 09:28:23 -0700</bug_when>
    <thetext>Fixed the Chromium Mac build in http://trac.webkit.org/changeset/126770</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>721630</commentid>
    <comment_count>28</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-09-16 13:47:31 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; Committed as &lt;http://trac.webkit.org/r126763&gt;.

This caused bug 96890.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>725070</commentid>
    <comment_count>29</comment_count>
    <who name="">mitz</who>
    <bug_when>2012-09-20 18:49:01 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; Committed as &lt;http://trac.webkit.org/r126763&gt;.

This caused bug 97280.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>961338</commentid>
    <comment_count>30</comment_count>
    <who name="Dominik Röttsches (drott)">d-r</who>
    <bug_when>2013-12-19 03:31:14 -0800</bug_when>
    <thetext>(In reply to comment #0)
&gt; Profiling on Mac and iOS has shown that measuring complex text by creating a ComplexTextController for each word is suboptimal. This patch addresses this for RenderBlock::LineBreaker::nextLineBreak by creating and reusing a ComplexTextController per RenderText. Benchmarks using a simple test app show a 35% improvement when laying out a paragraph of English text with optimizeLegibility.

Ned, could you publish that test app or give some details on how you measured? Was it a web page based benchmark? Or a native app that links against some of the line layout code and tested that with some demo strings?

I am looking at this code in Blink now and it looks like the optimization is not as effective any more - when setting the TextLayout to nullptr and running the old path is actually now faster for example for Arabic line layout - but I&apos;d like to get better data.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135359</attachid>
            <date>2012-04-03 10:34:09 -0700</date>
            <delta_ts>2012-04-03 11:05:38 -0700</delta_ts>
            <desc>Proposed changes.</desc>
            <filename>TextLayout.txt</filename>
            <type>text/plain</type>
            <size>30915</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjk2OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcxIEBACisyMDEyLTA0LTAyICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBidWxrIG9mIHRoaXMgY2hhbmdlIGlzIG1vZGlm
eWluZyBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UsIHdoaWNoIHByZXZpb3VzbHkgcmVx
dWlyZWQgdGhlIHRleHQgb2Zmc2V0CisgICAgICAgIHRvIGJlIHN0cmljdGx5IGluY3JlYXNpbmcg
YW5kIGFzc3VtZWQgdW5pZGlyZWN0aW9uYWwgdGV4dDsgbm93IGl0IHN1cHBvcnRzIHJhbmRvbSBz
ZWVraW5nIGluIGEgbmFpdmUgZmFzaGlvbgorICAgICAgICAoYnkgcmVzdGFydGluZyB0byB0aGUg
YmVnaW5uaW5nKSBhbmQgdHJhdmVyc2VzIGdseXBocyBpbiBsb2dpY2FsIG9yZGVyLiBJbiB0aGUg
bGF0dGVyIGNhc2UsIHRoZSBwcmVzZW5jZSBvZiBhbnkKKyAgICAgICAgbm9uLUxUUiBydW5zIHRy
aWdnZXJzIHRoZSBwb3B1bGF0aW9uIG9mIGEgbWFwcGluZyBmcm9tIGxvZ2ljYWwgdG8gdmlzdWFs
IHJ1biBpbmRpY2VzLiBGaW5hbGx5LCBhIG5ldyBmbGFnIGhhcworICAgICAgICBiZWVuIGFkZGVk
IHdoaWNoIGluaGliaXRzIGdseXBoIGFkdmFuY2VzIGZyb20gYmVpbmcgc3BsaXQgYWNyb3NzIGxp
Z2F0dXJlcyAodGh1cyBjYXVzaW5nIHNwdXJpb3VzIGxpbmUgYnJlYWtzKS4KKworICAgICAgICBB
IENvbXBsZXhUZXh0Q29udHJvbGxlciBhbmQgaXRzIGFzc29jaWF0ZWQgVGV4dFJ1biBhbmQgRm9u
dCBhcmUgZW5jYXBzdWxhdGVkIGluIGEgVGV4dExheW91dCBvYmplY3QsIHdoaWNoIGlzCisgICAg
ICAgIGluc3RhbnRpYXRlZCBhcyBhbiBvcGFxdWUgb2JqZWN0IHZpYSBmdW5jdGlvbnMgdGhhdCBh
cmUgbm8tb3BzIHVubGVzcyBidWlsZGluZyBmb3IgTWFjLiBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rp
b24KKyAgICAgICAgKGlzTmVlZGVkKSBjaGVja3MgdG8gc2VlIHdoZXRoZXIgYSBUZXh0UnVuIGlz
IGNvbXBsZXgsIGluIG9yZGVyIHRvIGF2b2lkIG5lZWRsZXNzIGluc3RhbnRpYXRpb24uIEFsdGhv
dWdoIHRoZQorICAgICAgICBBVFNVSSBDb21wbGV4VGV4dENvbnRyb2xsZXIgaW1wbGVtZW50YXRp
b24gaGFzIGJlZW4gdXBkYXRlZCB0byBhY2NvdW50IGZvciBuZXdseS1hZGRlZCBtZW1iZXIgdmFy
aWFibGVzLCB0aGlzCisgICAgICAgIG5ldyBwYXRoIGlzIG9ubHkgZW5hYmxlZCBmb3IgQ29yZSBU
ZXh0LgorCisgICAgICAgIE5vIGJlaGF2aW9yYWwgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgZHVlIHRv
IHRoaXMgY2hhbmdlLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9Gb250LmNwcDoKKyAgICAgICAgKFdURik6IERlZmluZSBkZWxldGVPd25lZFB0ciBmb3Ig
VGV4dExheW91dCBhcyBjYWxsaW5nIHRocm91Z2ggZGVzdHJveUxheW91dDsgcmVseWluZyBvbiBv
cGVyYXRvciBkZWxldGUgaXMgbm90IHdvcmthYmxlIGFzIHRoZSBjbGFzcyBkb2VzIG5vdCBleGlz
dCBvbiBhbGwgcGxhdGZvcm1zLgorICAgICAgICAoV1RGOjpXZWJDb3JlOjpUZXh0TGF5b3V0KToK
KyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgbm8tb3AgVGV4dExheW91dCB3cmFwcGVycyBm
b3Igbm9uLU1hYyBwbGF0Zm9ybXMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlv
dXQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVzdHJveUxheW91dCk6CisgICAgICAgIChX
ZWJDb3JlOjpGb250Ojp3aWR0aCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5o
OgorICAgICAgICAoV2ViQ29yZSk6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgUmVuZGVy
VGV4dCBhbmQgVGV4dExheW91dC4KKyAgICAgICAgKEZvbnQpOiBBZGQgZnVuY3Rpb25zIGZvciBk
ZWFsaW5nIHdpdGggcG9pbnRlciB0byBUZXh0TGF5b3V0IGltcGxlbWVudGF0aW9uLgorICAgICAg
ICAoV1RGKTogRGVjbGFyZSBkZWxldGVPd25lZFB0ciBmb3IgVGV4dExheW91dC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcDoKKyAgICAg
ICAgKFRleHRMYXlvdXQpOiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRv
IGEgQ29tcGxleFRleHRDb250cm9sbGVyIGZvciBhIHBhcnRpY3VsYXIgVGV4dFJ1bi4KKyAgICAg
ICAgKFdlYkNvcmU6OlRleHRMYXlvdXQ6OmlzTmVlZGVkKTogVXNlZCBieSB3cmFwcGVyIHRvIGF2
b2lkIGluc3RhbnRpYXRpb24gd2hlbiBjb21wbGV4IGxheW91dCBpcyBub3QgcmVxdWlyZWQuCisg
ICAgICAgIChXZWJDb3JlOjpUZXh0TGF5b3V0OjpUZXh0TGF5b3V0KToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRMYXlvdXQ6On5UZXh0TGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRMYXlv
dXQ6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgcmVhbCBUZXh0TGF5b3V0
IHdyYXBwZXJzIGZvciBNYWMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlvdXQp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVzdHJveUxheW91dCk6CisgICAgICAgIChXZWJD
b3JlOjpGb250Ojp3aWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xs
ZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcik6IEluaXRpYWxpemUgbV9sdHJPbmx5LgorICAgICAg
ICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29tcGxl
eFRleHRSdW4pOiBJbml0aWFsaXplIG1faW5kZXhCZWdpbiBhbmQgbV9sdHIuCisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmluZGV4T2ZDdXJyZW50UnVuKTogUmV0dXJu
ICh2aXN1YWwpIG1fY29tcGxleFRleHRSdW5zIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gKGxvZ2lj
YWwpIG1fY3VycmVudFJ1biwgbGF6aWx5IGNvbnN0cnVjdGluZyBtX3J1bkluZGljZXMgaWYgbmVl
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppbmNyZW1lbnRD
dXJyZW50UnVuKTogUmV0dXJuIG5leHQgbV9jb21wbGV4VGV4dFJ1bnMgaW5kZXggaW4gbG9naWNh
bCBvcmRlci4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5j
ZSk6IEFsbG93IHJlc3RhcnRpbmcsIHN1cHBvcnQgZm9yIGJpZGkgcmVvcmRlcmluZywgYW5kIG9w
dGlvbiB0byBtZWFzdXJlIG9ubHkgd2hvbGUgZ2x5cGhzIHJhdGhlciB0aGFuIGRpdmlkaW5nIGFk
dmFuY2VzLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphZGp1c3RH
bHlwaHNBbmRBZHZhbmNlcyk6IENsZWFyIG1fbHRyT25seSBvbiBkZXRlY3RpbmcgYSBSVEwgcnVu
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIu
aDoKKyAgICAgICAgKENvbXBsZXhUZXh0Q29udHJvbGxlcik6IEFkZCBtX2x0ck9ubHkgaW5kaWNh
dGluZyBubyBiaWRpIHJlb3JkZXJpbmcsIGFuZCBtX3J1bkluZGljZXMgbWFwcGluZyBmcm9tIHJ1
bnMgKGxvZ2ljYWwgb3JkZXIpIHRvIG1fY29tcGxleFRleHRSdW5zICh2aXN1YWwgb3JkZXIpLgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6
aW5kZXhCZWdpbik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNv
bXBsZXhUZXh0UnVuOjpsdHIpOgorICAgICAgICAoQ29tcGxleFRleHRSdW4pOiBBZGQgbV9pbmRl
eEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxl
eFRleHRDb250cm9sbGVyQVRTVUkuY3BwOiBJbml0aWFsaXplIG1faW5kZXhCZWdpbiBhbmQgbV9s
dHIsIGV2ZW4gdGhvdWdoIFRleHRMYXlvdXQgaXMgbm90IGVuYWJsZWQgZm9yIEFUU1VJLgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29t
cGxleFRleHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpD
b21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUFUU1VJKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQubW06
IEluaXRpYWxpemUgbV9pbmRleEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKFdlYkNvcmU6OkNv
bXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkNvbXBsZXhUZXh0UnVuKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNy
ZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmg6IEFkZCBUZXh0TGF5b3V0SW5mbywgbWFwcGluZyBmcm9tIFJlbmRlclRleHQg
dG8gKHBvc3NpYmx5IG51bGwpIFRleHRMYXlvdXQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKFJlbmRlckJsb2NrKToKKyAgICAgICAgKExpbmVCcmVha2VyKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZSk6IEFsbG93IFRleHRMYXlvdXQgaW5z
dGFuY2UgdG8gYmUgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBuZXh0TGluZUJyZWFrLgorICAgICAg
ICAoV2ViQ29yZTo6dGV4dFdpZHRoKTogVXNlIFRleHRMYXlvdXQgd2hlbiBzdXBwbGllZCBmb3Ig
bWVhc3VyaW5nLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpu
ZXh0TGluZUJyZWFrKTogCisKIDIwMTItMDQtMDIgIFRvbnkgQ2hhbmcgIDx0b255QGNocm9taXVt
Lm9yZz4KIAogICAgICAgICBhZGQgY3NzIHBhcnNpbmcgb2YgLXdlYmtpdC1mbGV4CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAkocmV2aXNpb24gMTEyODkx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQyLDYgKzQyLDE1IEBACiB1c2luZyBuYW1lc3BhY2UgV1RGOwogdXNpbmcgbmFt
ZXNwYWNlIFVuaWNvZGU7CiAKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZSA8PiB2b2lkIGRl
bGV0ZU93bmVkUHRyPFdlYkNvcmU6OlRleHRMYXlvdXQ+KFdlYkNvcmU6OlRleHRMYXlvdXQqIHB0
cikKK3sKKyAgICBXZWJDb3JlOjpGb250OjpkZXN0cm95TGF5b3V0KHB0cik7Cit9CisKK30KKwog
bmFtZXNwYWNlIFdlYkNvcmUgewogCiBjb25zdCB1aW50OF90IEZvbnQ6OnNfcm91bmRpbmdIYWNr
Q2hhcmFjdGVyVGFibGVbMjU2XSA9IHsKQEAgLTIwNSw2ICsyMTQsMjUgQEAgZmxvYXQgRm9udDo6
d2lkdGgoY29uc3QgVGV4dFJ1biYgcnVuLCBpbgogICAgIHJldHVybiBmbG9hdFdpZHRoRm9yQ29t
cGxleFRleHQocnVuKTsKIH0KIAorI2lmICFQTEFURk9STShNQUMpCisKK1RleHRMYXlvdXQqIEZv
bnQ6OmNyZWF0ZUxheW91dChSZW5kZXJUZXh0KiB0ZXh0KSBjb25zdAoreworICAgIHJldHVybiAw
OworfQorCit2b2lkIEZvbnQ6OmRlc3Ryb3lMYXlvdXQoVGV4dExheW91dCopCit7Cit9CisKK2Zs
b2F0IEZvbnQ6OndpZHRoKFRleHRMYXlvdXQmLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKKwog
RmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwg
Y29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAog
ewogICAgIHRvID0gKHRvID09IC0xID8gcnVuLmxlbmd0aCgpIDogdG8pOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAkocmV2aXNpb24gMTEyODkxKQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCSh3b3JraW5nIGNvcHkpCkBAIC01
MCw2ICs1MCw4IEBAIGNsYXNzIEZvbnRTZWxlY3RvcjsKIGNsYXNzIEdseXBoQnVmZmVyOwogY2xh
c3MgR2x5cGhQYWdlVHJlZU5vZGU7CiBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBSZW5k
ZXJUZXh0OworY2xhc3MgVGV4dExheW91dDsKIGNsYXNzIFRleHRSdW47CiAKIHN0cnVjdCBHbHlw
aERhdGE7CkBAIC05OSw2ICsxMDEsMTAgQEAgcHVibGljOgogICAgIGZsb2F0IHdpZHRoKGNvbnN0
IFRleHRSdW4mLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMg
PSAwLCBHbHlwaE92ZXJmbG93KiA9IDApIGNvbnN0OwogICAgIGZsb2F0IHdpZHRoKGNvbnN0IFRl
eHRSdW4mLCBpbnQmIGNoYXJzQ29uc3VtZWQsIFN0cmluZyYgZ2x5cGhOYW1lKSBjb25zdDsKIAor
ICAgIFBhc3NPd25QdHI8VGV4dExheW91dD4gY3JlYXRlTGF5b3V0KFJlbmRlclRleHQqLCBmbG9h
dCB4UG9zLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSkgY29uc3Q7CisgICAgc3RhdGljIHZvaWQg
ZGVzdHJveUxheW91dChUZXh0TGF5b3V0Kik7CisgICAgc3RhdGljIGZsb2F0IHdpZHRoKFRleHRM
YXlvdXQmLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CisKICAgICBpbnQgb2Zmc2V0Rm9y
UG9zaXRpb24oY29uc3QgVGV4dFJ1biYsIGZsb2F0IHBvc2l0aW9uLCBib29sIGluY2x1ZGVQYXJ0
aWFsR2x5cGhzKSBjb25zdDsKICAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVjdEZvclRleHQoY29u
c3QgVGV4dFJ1biYsIGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgaCwgaW50IGZyb20gPSAwLCBpbnQg
dG8gPSAtMSkgY29uc3Q7CiAKQEAgLTI5MSw0ICsyOTcsMTAgQEAgaW5saW5lIEZvbnRTZWxlY3Rv
ciogRm9udDo6Zm9udFNlbGVjdG9yKAogCiB9CiAKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0
ZSA8PiB2b2lkIGRlbGV0ZU93bmVkUHRyPFdlYkNvcmU6OlRleHRMYXlvdXQ+KFdlYkNvcmU6OlRl
eHRMYXlvdXQqIHB0cik7CisKK30KKwogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9s
bGVyLmNwcAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3
LDYgKzI3LDggQEAKIAogI2luY2x1ZGUgIkZsb2F0U2l6ZS5oIgogI2luY2x1ZGUgIkZvbnQuaCIK
KyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNs
dWRlICJUZXh0QnJlYWtJdGVyYXRvci5oIgogI2luY2x1ZGUgIlRleHRSdW4uaCIKICNpbmNsdWRl
IDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KQEAgLTQyLDYgKzQ0
LDczIEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xh
c3MgVGV4dExheW91dCB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgaXNOZWVkZWQoUmVuZGVy
VGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCkKKyAgICB7CisgICAgICAgIFRleHRSdW4gcnVu
ID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFj
dGVycygpLCB0ZXh0LT50ZXh0TGVuZ3RoKCksIHRleHQtPnN0eWxlKCkpOworICAgICAgICBGb250
OjpDb2RlUGF0aCBjb2RlUGF0aFRvVXNlID0gZm9udC5jb2RlUGF0aChydW4pOworICAgICAgICBy
ZXR1cm4gY29kZVBhdGhUb1VzZSA9PSBGb250OjpDb21wbGV4OworICAgIH0KKworICAgIFRleHRM
YXlvdXQoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9v
bCBjb2xsYXBzZVdoaXRlU3BhY2UpCisgICAgICAgIDogbV9mb250KGZvbnQpCisgICAgICAgICwg
bV9ydW4oMCwgMCkKKyAgICB7CisgICAgICAgIG1fZm9udC5zZXRXb3JkU3BhY2luZygwKTsKKwor
ICAgICAgICBtX3J1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIG1fZm9u
dCwgdGV4dC0+Y2hhcmFjdGVycygpLCB0ZXh0LT50ZXh0TGVuZ3RoKCksIHRleHQtPnN0eWxlKCkp
OworICAgICAgICBtX3J1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSk7
CisgICAgICAgIEFTU0VSVChtX3J1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkgPj0gbV9ydW4ubGVuZ3Ro
KCkpOworCisgICAgICAgIG1fcnVuLnNldEFsbG93VGFicyghY29sbGFwc2VXaGl0ZVNwYWNlKTsK
KyAgICAgICAgbV9ydW4uc2V0WFBvcyh4UG9zKTsKKworICAgICAgICBtX2NvbnRyb2xsZXIgPSBu
ZXcgQ29tcGxleFRleHRDb250cm9sbGVyKCZtX2ZvbnQsIG1fcnVuLCB0cnVlKTsKKyAgICB9Cisg
ICAgflRleHRMYXlvdXQoKQorICAgIHsKKyAgICAgICAgZGVsZXRlIG1fY29udHJvbGxlcjsKKyAg
ICB9CisKKyAgICBmbG9hdCB3aWR0aCh1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4pCisgICAg
eworICAgICAgICBtX2NvbnRyb2xsZXItPmFkdmFuY2UoZnJvbSwgMCwgdHJ1ZSk7CisgICAgICAg
IGZsb2F0IGJlZm9yZVdpZHRoID0gbV9jb250cm9sbGVyLT5ydW5XaWR0aFNvRmFyKCk7CisgICAg
ICAgIG1fY29udHJvbGxlci0+YWR2YW5jZShmcm9tICsgbGVuLCAwLCB0cnVlKTsKKyAgICAgICAg
ZmxvYXQgYWZ0ZXJXaWR0aCA9IG1fY29udHJvbGxlci0+cnVuV2lkdGhTb0ZhcigpOworICAgICAg
ICByZXR1cm4gYWZ0ZXJXaWR0aCAtIGJlZm9yZVdpZHRoOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBGb250IG1fZm9udDsKKyAgICBUZXh0UnVuIG1fcnVuOworICAgIENvbXBsZXhUZXh0Q29udHJv
bGxlciogbV9jb250cm9sbGVyOworfTsKKworUGFzc093blB0cjxUZXh0TGF5b3V0PiBGb250Ojpj
cmVhdGVMYXlvdXQoUmVuZGVyVGV4dCogdGV4dCwgZmxvYXQgeFBvcywgYm9vbCBjb2xsYXBzZVdo
aXRlU3BhY2UpIGNvbnN0Cit7CisjaWYgVVNFKENPUkVfVEVYVCkKKyNpZiBVU0UoQVRTVUkpCisg
ICAgaWYgKHNob3VsZFVzZUFUU1VJQVBJKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworI2Vu
ZGlmCisgICAgaWYgKFRleHRMYXlvdXQ6OmlzTmVlZGVkKHRleHQsICp0aGlzKSkKKyAgICAgICAg
cmV0dXJuIGFkb3B0UHRyKG5ldyBUZXh0TGF5b3V0KHRleHQsICp0aGlzLCB4UG9zLCBjb2xsYXBz
ZVdoaXRlU3BhY2UpKTsKKyNlbmRpZgorICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIEZv
bnQ6OmRlc3Ryb3lMYXlvdXQoVGV4dExheW91dCogbGF5b3V0KQoreworICAgIGRlbGV0ZSBsYXlv
dXQ7Cit9CisKK2Zsb2F0IEZvbnQ6OndpZHRoKFRleHRMYXlvdXQmIGxheW91dCwgdW5zaWduZWQg
ZnJvbSwgdW5zaWduZWQgdG8pCit7CisgICAgcmV0dXJuIGxheW91dC53aWR0aChmcm9tLCB0byk7
Cit9CisKIHN0YXRpYyBpbmxpbmUgQ0dGbG9hdCByb3VuZENHRmxvYXQoQ0dGbG9hdCBmKQogewog
ICAgIGlmIChzaXplb2YoQ0dGbG9hdCkgPT0gc2l6ZW9mKGZsb2F0KSkKQEAgLTU5LDYgKzEyOCw3
IEBAIHN0YXRpYyBpbmxpbmUgQ0dGbG9hdCBjZWlsQ0dGbG9hdChDR0Zsb2EKIENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6Q29tcGxleFRleHRDb250cm9sbGVyKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0
IFRleHRSdW4mIHJ1biwgYm9vbCBtYXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbiwgSGFzaFNl
dDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBib29sIGZvclRleHRFbXBo
YXNpcykKICAgICA6IG1fZm9udCgqZm9udCkKICAgICAsIG1fcnVuKHJ1bikKKyAgICAsIG1fbHRy
T25seSh0cnVlKQogICAgICwgbV9tYXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbihtYXlVc2VO
YXR1cmFsV3JpdGluZ0RpcmVjdGlvbikKICAgICAsIG1fZm9yVGV4dEVtcGhhc2lzKGZvclRleHRF
bXBoYXNpcykKICAgICAsIG1fY3VycmVudENoYXJhY3RlcigwKQpAQCAtMzY0LDE1ICs0MzQsMTcg
QEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFy
YWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9u
KQogICAgICwgbV9zdHJpbmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2lu
KHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9pbmRleEVuZChzdHJpbmdMZW5ndGgpCisgICAgLCBt
X2x0cihsdHIpCiAgICAgLCBtX2lzTW9ub3RvbmljKHRydWUpCiB7CiAjaWYgVVNFKENPUkVfVEVY
VCkgJiYgVVNFKEFUU1VJKQotICAgIHNob3VsZFVzZUFUU1VJQVBJKCkgPyBjcmVhdGVUZXh0UnVu
RnJvbUZvbnREYXRhQVRTVUkobHRyKSA6IGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4
dChsdHIpOworICAgIHNob3VsZFVzZUFUU1VJQVBJKCkgPyBjcmVhdGVUZXh0UnVuRnJvbUZvbnRE
YXRhQVRTVUkoKSA6IGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dCgpOwogI2VsaWYg
VVNFKEFUU1VJKQotICAgIGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSShsdHIpOworICAg
IGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSSgpOwogI2VsaWYgVVNFKENPUkVfVEVYVCkK
LSAgICBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQobHRyKTsKKyAgICBjcmVhdGVU
ZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQoKTsKICNlbmRpZgogfQogCkBAIC00MDAsMjUgKzQ3
Miw4NiBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSCiAgICAgfQog
fQogCi12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSh1bnNpZ25lZCBvZmZzZXQs
IEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlcikKK3Vuc2lnbmVkIENvbXBsZXhUZXh0Q29udHJvbGxl
cjo6aW5kZXhPZkN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgpCit7CisgICAgbGVm
dG1vc3RHbHlwaCA9IDA7CisgICAgCisgICAgc2l6ZV90IHJ1bkNvdW50ID0gbV9jb21wbGV4VGV4
dFJ1bnMuc2l6ZSgpOworICAgIGlmIChtX2N1cnJlbnRSdW4gPj0gcnVuQ291bnQpCisgICAgICAg
IHJldHVybiBydW5Db3VudDsKKworICAgIGlmIChtX2x0ck9ubHkpIHsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCByID0gMDsgciA8IG1fY3VycmVudFJ1bjsgKytyKSB7CisgICAgICAgICAgICBjb25z
dCBDb21wbGV4VGV4dFJ1biYgY29tcGxleFRleHRSdW4gPSAqbV9jb21wbGV4VGV4dFJ1bnNbcl07
CisgICAgICAgICAgICBsZWZ0bW9zdEdseXBoICs9IGNvbXBsZXhUZXh0UnVuLmdseXBoQ291bnQo
KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbV9jdXJyZW50UnVuOworICAgIH0KKworICAg
IHdoaWxlIChtX3J1bkluZGljZXMuc2l6ZSgpIDw9IG1fY3VycmVudFJ1bikgeworICAgICAgICB1
bnNpZ25lZCBvZmZzZXQgPSAwOworICAgICAgICBpZiAoIW1fcnVuSW5kaWNlcy5pc0VtcHR5KCkp
IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHIgPSBtX3J1bkluZGljZXMubGFzdCgpOworICAgICAg
ICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGN1cnJlbnRUZXh0UnVuID0gKm1fY29tcGxleFRl
eHRSdW5zW3JdOworICAgICAgICAgICAgb2Zmc2V0ID0gY3VycmVudFRleHRSdW4uc3RyaW5nTG9j
YXRpb24oKSArIGN1cnJlbnRUZXh0UnVuLmluZGV4RW5kKCk7CisgICAgICAgIH0KKworICAgICAg
ICBmb3IgKHVuc2lnbmVkIHEgPSAwOyBxIDwgcnVuQ291bnQ7ICsrcSkgeworICAgICAgICAgICAg
Y29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhUZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5z
W3FdOworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBjb21wbGV4VGV4dFJ1bi5zdHJpbmdMb2Nh
dGlvbigpICsgY29tcGxleFRleHRSdW4uaW5kZXhCZWdpbigpKSB7CisgICAgICAgICAgICAgICAg
bV9ydW5JbmRpY2VzLmFwcGVuZChxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIHIgPSBtX3J1bkluZGljZXNb
bV9jdXJyZW50UnVuXTsKKyAgICBmb3IgKHVuc2lnbmVkIHEgPSAwOyBxIDwgcjsgKytxKSB7Cisg
ICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBjb21wbGV4VGV4dFJ1biA9ICptX2NvbXBsZXhU
ZXh0UnVuc1txXTsKKyAgICAgICAgbGVmdG1vc3RHbHlwaCArPSBjb21wbGV4VGV4dFJ1bi5nbHlw
aENvdW50KCk7CisgICAgfQorICAgIHJldHVybiByOworfQorCit1bnNpZ25lZCBDb21wbGV4VGV4
dENvbnRyb2xsZXI6OmluY3JlbWVudEN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgp
Cit7CisgICAgaWYgKG1fbHRyT25seSkgeworICAgICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYg
Y3VycmVudFRleHRSdW4gPSAqbV9jb21wbGV4VGV4dFJ1bnNbbV9jdXJyZW50UnVuKytdOworICAg
ICAgICBsZWZ0bW9zdEdseXBoICs9IGN1cnJlbnRUZXh0UnVuLmdseXBoQ291bnQoKTsKKyAgICAg
ICAgcmV0dXJuIG1fY3VycmVudFJ1bjsKKyAgICB9CisKKyAgICBtX2N1cnJlbnRSdW4rKzsKKyAg
ICBsZWZ0bW9zdEdseXBoID0gMDsKKyAgICByZXR1cm4gaW5kZXhPZkN1cnJlbnRSdW4obGVmdG1v
c3RHbHlwaCk7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2ln
bmVkIG9mZnNldCwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyLCBib29sIGJ5V2hvbGVHbHlwaHMp
CiB7CiAgICAgaWYgKHN0YXRpY19jYXN0PGludD4ob2Zmc2V0KSA+IG1fZW5kKQogICAgICAgICBv
ZmZzZXQgPSBtX2VuZDsKIAotICAgIGlmIChvZmZzZXQgPD0gbV9jdXJyZW50Q2hhcmFjdGVyKQot
ICAgICAgICByZXR1cm47CisgICAgaWYgKG9mZnNldCA8PSBtX2N1cnJlbnRDaGFyYWN0ZXIpIHsK
KyAgICAgICAgbV9ydW5XaWR0aFNvRmFyID0gbV9sZWFkaW5nRXhwYW5zaW9uOworICAgICAgICBt
X251bUdseXBoc1NvRmFyID0gMDsKKyAgICAgICAgbV9jdXJyZW50UnVuID0gMDsKKyAgICAgICAg
bV9nbHlwaEluQ3VycmVudFJ1biA9IDA7CisgICAgICAgIG1fY2hhcmFjdGVySW5DdXJyZW50R2x5
cGggPSAwOworICAgIH0KIAogICAgIG1fY3VycmVudENoYXJhY3RlciA9IG9mZnNldDsKIAogICAg
IHNpemVfdCBydW5Db3VudCA9IG1fY29tcGxleFRleHRSdW5zLnNpemUoKTsKIAotICAgIGJvb2wg
bHRyID0gbV9ydW4ubHRyKCk7Ci0KLSAgICB1bnNpZ25lZCBrID0gbHRyID8gbV9udW1HbHlwaHNT
b0ZhciA6IG1fYWRqdXN0ZWRHbHlwaHMuc2l6ZSgpIC0gMSAtIG1fbnVtR2x5cGhzU29GYXI7Cisg
ICAgdW5zaWduZWQgbGVmdG1vc3RHbHlwaCA9IDA7CisgICAgdW5zaWduZWQgciA9IGluZGV4T2ZD
dXJyZW50UnVuKGxlZnRtb3N0R2x5cGgpOwogICAgIHdoaWxlIChtX2N1cnJlbnRSdW4gPCBydW5D
b3VudCkgewotICAgICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY29tcGxleFRleHRSdW4gPSAq
bV9jb21wbGV4VGV4dFJ1bnNbbHRyID8gbV9jdXJyZW50UnVuIDogcnVuQ291bnQgLSAxIC0gbV9j
dXJyZW50UnVuXTsKKyAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhUZXh0UnVu
ID0gKm1fY29tcGxleFRleHRSdW5zW3JdOworICAgICAgICBib29sIGx0ciA9IGNvbXBsZXhUZXh0
UnVuLmx0cigpOwogICAgICAgICBzaXplX3QgZ2x5cGhDb3VudCA9IGNvbXBsZXhUZXh0UnVuLmds
eXBoQ291bnQoKTsKICAgICAgICAgdW5zaWduZWQgZyA9IGx0ciA/IG1fZ2x5cGhJbkN1cnJlbnRS
dW4gOiBnbHlwaENvdW50IC0gMSAtIG1fZ2x5cGhJbkN1cnJlbnRSdW47CisgICAgICAgIHVuc2ln
bmVkIGsgPSBsZWZ0bW9zdEdseXBoICsgZzsKKwogICAgICAgICB3aGlsZSAobV9nbHlwaEluQ3Vy
cmVudFJ1biA8IGdseXBoQ291bnQpIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGdseXBoU3RhcnRP
ZmZzZXQgPSBjb21wbGV4VGV4dFJ1bi5pbmRleEF0KGcpOwogICAgICAgICAgICAgdW5zaWduZWQg
Z2x5cGhFbmRPZmZzZXQ7CkBAIC00NDcsNiArNTgwLDkgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRy
b2xsZXI6OmFkdmFuY2UodW5zaQogICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUgYXJlIG11
bHRpcGxlIGdseXBocyBwZXIgY2hhcmFjdGVyIHdlIG5lZWQgdG8gYWR2YW5jZSBieSB0aGUgZnVs
bCB3aWR0aCBvZiB0aGUgZ2x5cGguCiAgICAgICAgICAgICAgICAgQVNTRVJUKG1fY2hhcmFjdGVy
SW5DdXJyZW50R2x5cGggPT0gb2xkQ2hhcmFjdGVySW5DdXJyZW50R2x5cGgpOwogICAgICAgICAg
ICAgICAgIG1fcnVuV2lkdGhTb0ZhciArPSBhZGp1c3RlZEFkdmFuY2Uud2lkdGg7CisgICAgICAg
ICAgICB9IGVsc2UgaWYgKGJ5V2hvbGVHbHlwaHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW9s
ZENoYXJhY3RlckluQ3VycmVudEdseXBoKQorICAgICAgICAgICAgICAgICAgICBtX3J1bldpZHRo
U29GYXIgKz0gYWRqdXN0ZWRBZHZhbmNlLndpZHRoOwogICAgICAgICAgICAgfSBlbHNlCiAgICAg
ICAgICAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IGFkanVzdGVkQWR2YW5jZS53aWR0aCAqICht
X2NoYXJhY3RlckluQ3VycmVudEdseXBoIC0gb2xkQ2hhcmFjdGVySW5DdXJyZW50R2x5cGgpIC8g
KGdseXBoRW5kT2Zmc2V0IC0gZ2x5cGhTdGFydE9mZnNldCk7CiAKQEAgLTQ2NCwxMCArNjAwLDEw
IEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2kKICAgICAgICAgICAg
ICAgICBrLS07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbV9jdXJyZW50UnVu
Kys7CisgICAgICAgIHIgPSBpbmNyZW1lbnRDdXJyZW50UnVuKGxlZnRtb3N0R2x5cGgpOwogICAg
ICAgICBtX2dseXBoSW5DdXJyZW50UnVuID0gMDsKICAgICB9Ci0gICAgaWYgKCFsdHIgJiYgbV9u
dW1HbHlwaHNTb0ZhciA9PSBtX2FkanVzdGVkQWR2YW5jZXMuc2l6ZSgpKQorICAgIGlmICghbV9y
dW4ubHRyKCkgJiYgbV9udW1HbHlwaHNTb0ZhciA9PSBtX2FkanVzdGVkQWR2YW5jZXMuc2l6ZSgp
KQogICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0gbV9maW5hbFJvdW5kaW5nV2lkdGg7CiB9CiAK
QEAgLTQ4MSw2ICs2MTcsOSBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWRqdXN0R2x5
cGhzCiAgICAgICAgIHVuc2lnbmVkIGdseXBoQ291bnQgPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENv
dW50KCk7CiAgICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGNvbXBsZXhU
ZXh0UnVuLmZvbnREYXRhKCk7CiAKKyAgICAgICAgaWYgKCFjb21wbGV4VGV4dFJ1bi5sdHIoKSkK
KyAgICAgICAgICAgIG1fbHRyT25seSA9IGZhbHNlOworCiAgICAgICAgIGNvbnN0IENHR2x5cGgq
IGdseXBocyA9IGNvbXBsZXhUZXh0UnVuLmdseXBocygpOwogICAgICAgICBjb25zdCBDR1NpemUq
IGFkdmFuY2VzID0gY29tcGxleFRleHRSdW4uYWR2YW5jZXMoKTsKIApJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4
dENvbnRyb2xsZXIuaAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5oCSh3b3JraW5nIGNvcHkpCkBA
IC02Miw3ICs2Miw3IEBAIHB1YmxpYzoKICAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3Qg
Rm9udCosIGNvbnN0IFRleHRSdW4mLCBib29sIG1heVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9u
ID0gZmFsc2UsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9
IDAsIGJvb2wgZm9yVGV4dEVtcGhhc2lzID0gZmFsc2UpOwogCiAgICAgLy8gQWR2YW5jZSBhbmQg
ZW1pdCBnbHlwaHMgdXAgdG8gdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCi0gICAgdm9pZCBhZHZh
bmNlKHVuc2lnbmVkIHRvLCBHbHlwaEJ1ZmZlciogPSAwKTsKKyAgICB2b2lkIGFkdmFuY2UodW5z
aWduZWQgdG8sIEdseXBoQnVmZmVyKiA9IDAsIGJvb2wgYnlXaG9sZUdseXBocyA9IGZhbHNlKTsK
IAogICAgIC8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBvZmZzZXQgZm9yIGEgZ2l2ZW4geCBjb29y
ZGluYXRlLgogICAgIGludCBvZmZzZXRGb3JQb3NpdGlvbihmbG9hdCB4LCBib29sIGluY2x1ZGVQ
YXJ0aWFsR2x5cGhzKTsKQEAgLTEwNywyMSArMTA3LDIzIEBAIHByaXZhdGU6CiAgICAgICAgIHVu
c2lnbmVkIHN0cmluZ0xvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdMb2NhdGlvbjsg
fQogICAgICAgICBzaXplX3Qgc3RyaW5nTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdM
ZW5ndGg7IH0KICAgICAgICAgQUxXQVlTX0lOTElORSBDRkluZGV4IGluZGV4QXQoc2l6ZV90IGkp
IGNvbnN0OworICAgICAgICBDRkluZGV4IGluZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2lu
ZGV4QmVnaW47IH0KICAgICAgICAgQ0ZJbmRleCBpbmRleEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXhFbmQ7IH0KICAgICAgICAgQ0ZJbmRleCBlbmRPZmZzZXRBdChzaXplX3QgaSkgY29uc3Qg
eyBBU1NFUlQoIW1faXNNb25vdG9uaWMpOyByZXR1cm4gbV9nbHlwaEVuZE9mZnNldHNbaV07IH0K
ICAgICAgICAgY29uc3QgQ0dHbHlwaCogZ2x5cGhzKCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHM7
IH0KICAgICAgICAgY29uc3QgQ0dTaXplKiBhZHZhbmNlcygpIGNvbnN0IHsgcmV0dXJuIG1fYWR2
YW5jZXM7IH0KKyAgICAgICAgYm9vbCBsdHIoKSBjb25zdCB7IHJldHVybiBtX2x0cjsgfQogICAg
ICAgICBib29sIGlzTW9ub3RvbmljKCkgY29uc3QgeyByZXR1cm4gbV9pc01vbm90b25pYzsgfQog
ICAgICAgICB2b2lkIHNldElzTm9uTW9ub3RvbmljKCk7CiAKICAgICBwcml2YXRlOgogI2lmIFVT
RShDT1JFX1RFWFQpCiAgICAgICAgIENvbXBsZXhUZXh0UnVuKENUUnVuUmVmLCBjb25zdCBTaW1w
bGVGb250RGF0YSosIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBzdHJpbmdMb2Nh
dGlvbiwgc2l6ZV90IHN0cmluZ0xlbmd0aCwgQ0ZSYW5nZSBydW5SYW5nZSk7Ci0gICAgICAgIHZv
aWQgY3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUNvcmVUZXh0KGJvb2wgbHRyKTsKKyAgICAgICAg
dm9pZCBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQoKTsKICNlbmRpZgogI2lmIFVT
RShBVFNVSSkKICAgICAgICAgQ29tcGxleFRleHRSdW4oQVRTVVRleHRMYXlvdXQsIGNvbnN0IFNp
bXBsZUZvbnREYXRhKiwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHN0cmluZ0xv
Y2F0aW9uLCBzaXplX3Qgc3RyaW5nTGVuZ3RoLCBib29sIGx0ciwgYm9vbCBkaXJlY3Rpb25hbE92
ZXJyaWRlKTsKLSAgICAgICAgdm9pZCBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoYm9v
bCBsdHIpOworICAgICAgICB2b2lkIGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSSgpOwog
I2VuZGlmCiAgICAgICAgIENvbXBsZXhUZXh0UnVuKGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29u
c3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBzaXplX3Qgc3Ry
aW5nTGVuZ3RoLCBib29sIGx0cik7CiAKQEAgLTE0MSwxMiArMTQzLDE0IEBAIHByaXZhdGU6CiAj
aWYgVVNFKEFUU1VJKQogICAgICAgICBWZWN0b3I8Q0ZJbmRleCwgNjQ+IG1fYXRzdWlJbmRpY2Vz
OwogI2VuZGlmCisgICAgICAgIENGSW5kZXggbV9pbmRleEJlZ2luOwogICAgICAgICBDRkluZGV4
IG1faW5kZXhFbmQ7CiAgICAgICAgIFZlY3RvcjxDRkluZGV4LCA2ND4gbV9nbHlwaEVuZE9mZnNl
dHM7CiAgICAgICAgIFZlY3RvcjxDR0dseXBoLCA2ND4gbV9nbHlwaHNWZWN0b3I7CiAgICAgICAg
IGNvbnN0IENHR2x5cGgqIG1fZ2x5cGhzOwogICAgICAgICBWZWN0b3I8Q0dTaXplLCA2ND4gbV9h
ZHZhbmNlc1ZlY3RvcjsKICAgICAgICAgY29uc3QgQ0dTaXplKiBtX2FkdmFuY2VzOworICAgICAg
ICBib29sIG1fbHRyOwogI2lmIFVTRShBVFNVSSkKICAgICAgICAgYm9vbCBtX2RpcmVjdGlvbmFs
T3ZlcnJpZGU7CiAjZW5kaWYKQEAgLTE2Miw4ICsxNjYsMTMgQEAgcHJpdmF0ZToKICAgICB2b2lk
IGNvbGxlY3RDb21wbGV4VGV4dFJ1bnNGb3JDaGFyYWN0ZXJzQ29yZVRleHQoY29uc3QgVUNoYXIq
LCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBjb25zdCBTaW1wbGVG
b250RGF0YSopOwogICAgIHZvaWQgYWRqdXN0R2x5cGhzQW5kQWR2YW5jZXMoKTsKIAorICAgIHVu
c2lnbmVkIGluZGV4T2ZDdXJyZW50UnVuKHVuc2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICB1
bnNpZ25lZCBpbmNyZW1lbnRDdXJyZW50UnVuKHVuc2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAg
ICBWZWN0b3I8dW5zaWduZWQsIDE2PiBtX3J1bkluZGljZXM7CisKICAgICBjb25zdCBGb250JiBt
X2ZvbnQ7CiAgICAgY29uc3QgVGV4dFJ1biYgbV9ydW47CisgICAgYm9vbCBtX2x0ck9ubHk7CiAg
ICAgYm9vbCBtX21heVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9uOwogICAgIGJvb2wgbV9mb3JU
ZXh0RW1waGFzaXM7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21h
Yy9Db21wbGV4VGV4dENvbnRyb2xsZXJBVFNVSS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckFUU1VJLmNw
cAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckFUU1VJLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ3
LDggKzE0NywxMCBAQCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDCiAg
ICAgLCBtX2NoYXJhY3RlcnMoY2hhcmFjdGVycykKICAgICAsIG1fc3RyaW5nTG9jYXRpb24oc3Ry
aW5nTG9jYXRpb24pCiAgICAgLCBtX3N0cmluZ0xlbmd0aChzdHJpbmdMZW5ndGgpCisgICAgLCBt
X2luZGV4QmVnaW4oMCkKICAgICAsIG1faW5kZXhFbmQoc3RyaW5nTGVuZ3RoKQogICAgICwgbV9k
aXJlY3Rpb25hbE92ZXJyaWRlKGRpcmVjdGlvbmFsT3ZlcnJpZGUpCisgICAgLCBtX2x0cihsdHIp
CiAgICAgLCBtX2lzTW9ub3RvbmljKHRydWUpCiB7CiAgICAgT1NTdGF0dXMgc3RhdHVzOwpAQCAt
MjIyLDcgKzIyNCw3IEBAIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMK
ICAgICBzdGF0dXMgPSBBVFNVRGlzcG9zZVRleHRMYXlvdXQoYXRzdVRleHRMYXlvdXQpOwogfQog
Ci12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNyZWF0ZVRleHRS
dW5Gcm9tRm9udERhdGFBVFNVSShib29sIGx0cikKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVy
OjpDb21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUFUU1VJKCkKIHsKICAg
ICBtX2F0c3VpSW5kaWNlcy5yZXNlcnZlQ2FwYWNpdHkobV9zdHJpbmdMZW5ndGgpOwogICAgIHVu
c2lnbmVkIHIgPSAwOwpAQCAtMjM3LDcgKzIzOSw3IEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9s
bGVyOjpDb21wbGV4VGV4dFIKICAgICAgICAgICAgIHIrKzsKICAgICB9CiAgICAgbV9nbHlwaENv
dW50ID0gbV9hdHN1aUluZGljZXMuc2l6ZSgpOwotICAgIGlmICghbHRyKSB7CisgICAgaWYgKCFt
X2x0cikgewogICAgICAgICBmb3IgKHVuc2lnbmVkIHIgPSAwLCBlbmQgPSBtX2dseXBoQ291bnQg
LSAxOyByIDwgbV9nbHlwaENvdW50IC8gMjsgKytyLCAtLWVuZCkKICAgICAgICAgICAgIHN0ZDo6
c3dhcChtX2F0c3VpSW5kaWNlc1tyXSwgbV9hdHN1aUluZGljZXNbZW5kXSk7CiAgICAgfQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJv
bGxlckNvcmVUZXh0Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5tbQkocmV2aXNpb24gMTEy
ODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0
Q29udHJvbGxlckNvcmVUZXh0Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMDcsNyArMTA3LDkgQEAg
Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0
ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQog
ICAgICwgbV9zdHJpbmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKHJ1
blJhbmdlLmxvY2F0aW9uKQogICAgICwgbV9pbmRleEVuZChydW5SYW5nZS5sb2NhdGlvbiArIHJ1
blJhbmdlLmxlbmd0aCkKKyAgICAsIG1fbHRyKCEoQ1RSdW5HZXRTdGF0dXMoY3RSdW4pICYga0NU
UnVuU3RhdHVzUmlnaHRUb0xlZnQpKQogICAgICwgbV9pc01vbm90b25pYyh0cnVlKQogewogICAg
IG1fZ2x5cGhDb3VudCA9IENUUnVuR2V0R2x5cGhDb3VudChjdFJ1bik7CkBAIC0xMzUsNyArMTM3
LDcgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogCiAvLyBNaXNz
aW5nIGdseXBocyBydW4gY29uc3RydWN0b3IuIENvcmUgVGV4dCB3aWxsIG5vdCBnZW5lcmF0ZSBh
IHJ1biBvZiBtaXNzaW5nIGdseXBocywgaW5zdGVhZCBmYWxsaW5nIGJhY2sgb24KIC8vIGdseXBo
cyBmcm9tIExhc3RSZXNvcnQuIFdlIHdhbnQgdG8gdXNlIHRoZSBwcmltYXJ5IGZvbnQncyBtaXNz
aW5nIGdseXBoIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBmYXN0IHRleHQgY29kZSBwYXRoLgotdm9p
ZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpjcmVhdGVUZXh0UnVuRnJv
bUZvbnREYXRhQ29yZVRleHQoYm9vbCBsdHIpCit2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6
Q29tcGxleFRleHRSdW46OmNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dCgpCiB7CiAg
ICAgbV9jb3JlVGV4dEluZGljZXNWZWN0b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX3N0cmlu
Z0xlbmd0aCk7CiAgICAgdW5zaWduZWQgciA9IDA7CkBAIC0xNTAsNyArMTUyLDcgQEAgdm9pZCBD
b21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UgogICAgICAgICAgICAgcisrOwogICAg
IH0KICAgICBtX2dseXBoQ291bnQgPSBtX2NvcmVUZXh0SW5kaWNlc1ZlY3Rvci5zaXplKCk7Ci0g
ICAgaWYgKCFsdHIpIHsKKyAgICBpZiAoIW1fbHRyKSB7CiAgICAgICAgIGZvciAodW5zaWduZWQg
ciA9IDAsIGVuZCA9IG1fZ2x5cGhDb3VudCAtIDE7IHIgPCBtX2dseXBoQ291bnQgLyAyOyArK3Is
IC0tZW5kKQogICAgICAgICAgICAgc3RkOjpzd2FwKG1fY29yZVRleHRJbmRpY2VzVmVjdG9yW3Jd
LCBtX2NvcmVUZXh0SW5kaWNlc1ZlY3RvcltlbmRdKTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4
LDcgQEAgc3RydWN0IEJpZGlSdW47CiBzdHJ1Y3QgUGFpbnRJbmZvOwogY2xhc3MgTGluZUluZm87
CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOworY2xhc3MgVGV4dExheW91dDsKIAogdGVtcGxhdGUgPGNs
YXNzIEl0ZXJhdG9yLCBjbGFzcyBSdW4+IGNsYXNzIEJpZGlSZXNvbHZlcjsKIHRlbXBsYXRlIDxj
bGFzcyBSdW4+IGNsYXNzIEJpZGlSdW5MaXN0OwpAQCAtNzAzLDYgKzcwNCw3IEBAIHByaXZhdGU6
CiAKICAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBp
biBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgogICAgIHR5cGVkZWYgc3RkOjpwYWlyPFJlbmRl
clRleHQqLCBMYXp5TGluZUJyZWFrSXRlcmF0b3I+IExpbmVCcmVha0l0ZXJhdG9ySW5mbzsKKyAg
ICB0eXBlZGVmIHN0ZDo6cGFpcjxSZW5kZXJUZXh0KiwgT3duUHRyPFRleHRMYXlvdXQ+ID4gVGV4
dExheW91dEluZm87CiAgICAgY2xhc3MgTGluZUJyZWFrZXIgewogICAgIHB1YmxpYzoKICAgICAg
ICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2sqIGJsb2NrKQpAQCAtNzExLDcgKzcxMyw3IEBAIHBy
aXZhdGU6CiAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICB9CiAKLSAgICAgICAgSW5saW5l
SXRlcmF0b3IgbmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIExp
bmVCcmVha0l0ZXJhdG9ySW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIElu
bGluZUl0ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8m
LCBMaW5lQnJlYWtJdGVyYXRvckluZm8mLCBUZXh0TGF5b3V0SW5mbyYsIEZsb2F0aW5nT2JqZWN0
KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0
ZWRMaW5lcyk7CiAKICAgICAgICAgYm9vbCBsaW5lV2FzSHlwaGVuYXRlZCgpIHsgcmV0dXJuIG1f
aHlwaGVuYXRlZDsgfQogICAgICAgICBjb25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9u
ZWRPYmplY3RzKCkgeyByZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsgfQpJbmRleDogU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJl
dmlzaW9uIDExMjg5MSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xp
bmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjI3LDYgKzEyMjcsNyBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SCiAgICAgSW5saW5lSXRlcmF0b3IgZW5k
ID0gcmVzb2x2ZXIucG9zaXRpb24oKTsKICAgICBib29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0g
bGF5b3V0U3RhdGUuZW5kTGluZSgpOwogICAgIExpbmVCcmVha0l0ZXJhdG9ySW5mbyBsaW5lQnJl
YWtJdGVyYXRvckluZm87CisgICAgVGV4dExheW91dEluZm8gdGV4dExheW91dEluZm87CiAgICAg
VmVydGljYWxQb3NpdGlvbkNhY2hlIHZlcnRpY2FsUG9zaXRpb25DYWNoZTsKIAogICAgIExpbmVC
cmVha2VyIGxpbmVCcmVha2VyKHRoaXMpOwpAQCAtMTI0OSw3ICsxMjUwLDcgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUgogICAgICAgICBjb25zdCBJbmxpbmVJdGVy
YXRvciBvbGRFbmQgPSBlbmQ7CiAgICAgICAgIGJvb2wgaXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlv
dXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpOwogICAgICAgICBG
bG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSA9IChtX2Zsb2F0aW5nT2Jq
ZWN0cyAmJiAhbV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmlzRW1wdHkoKSkgPyBtX2Zsb2F0aW5n
T2JqZWN0cy0+c2V0KCkubGFzdCgpIDogMDsKLSAgICAgICAgZW5kID0gbGluZUJyZWFrZXIubmV4
dExpbmVCcmVhayhyZXNvbHZlciwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwgbGluZUJyZWFrSXRl
cmF0b3JJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0
ZWRMaW5lcyk7CisgICAgICAgIGVuZCA9IGxpbmVCcmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2
ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIGxpbmVCcmVha0l0ZXJhdG9ySW5mbywgdGV4dExh
eW91dEluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzKTsKICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAg
ICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBjcmVhdGluZyBhbnkgcnVucyBpbiBu
ZXh0TGluZUJyZWFrIHRvIGJlZ2luIHdpdGghCiAgICAgICAgICAgICAvLyBPbmNlIEJpZGlSdW5M
aXN0IGlzIHNlcGFyYXRlZCBmcm9tIEJpZGlSZXNvbHZlciB0aGlzIHdpbGwgbm90IGJlIG5lZWRl
ZC4KQEAgLTE5MzgsMTEgKzE5MzksMTQgQEAgc3RhdGljIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3Bh
Y2VBZnRlclN0YQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGlubGluZSBmbG9hdCB0
ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBj
b25zdCBGb250JiBmb250LCBmbG9hdCB4UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xs
YXBzZVdoaXRlU3BhY2UpCitzdGF0aWMgaW5saW5lIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0
KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZs
b2F0IHhQb3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgVGV4
dExheW91dCogbGF5b3V0ID0gMCkKIHsKICAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAm
JiBsZW4gPT0gdGV4dC0+dGV4dExlbmd0aCgpKSB8fCB0ZXh0LT5zdHlsZSgpLT5oYXNUZXh0Q29t
YmluZSgpKQogICAgICAgICByZXR1cm4gdGV4dC0+d2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9z
KTsKIAorICAgIGlmIChsYXlvdXQpCisgICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0
LCBmcm9tLCBsZW4pOworCiAgICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0
VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBmcm9tLCBsZW4sIHRleHQt
PnN0eWxlKCkpOwogICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgo
KSAtIGZyb20pOwogICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5n
dGgoKSk7CkBAIC0yMTA0LDcgKzIxMDgsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtl
cjo6cmVzZXQoKQogfQogCiBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6
Om5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxp
bmVJbmZvLAotICAgIExpbmVCcmVha0l0ZXJhdG9ySW5mbyYgbGluZUJyZWFrSXRlcmF0b3JJbmZv
LCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29u
c2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCisgICAgTGluZUJyZWFrSXRlcmF0b3JJbmZvJiBsaW5l
QnJlYWtJdGVyYXRvckluZm8sIFRleHRMYXlvdXRJbmZvJiB0ZXh0TGF5b3V0SW5mbywgRmxvYXRp
bmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZl
SHlwaGVuYXRlZExpbmVzKQogewogICAgIHJlc2V0KCk7CiAKQEAgLTIzNDMsNiArMjM0NywxMiBA
QCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAgICAgICAgICAgICAg
ICAgQVNTRVJUKGN1cnJlbnQubV9wb3MgPT0gdC0+dGV4dExlbmd0aCgpKTsKICAgICAgICAgICAg
IH0KIAorICAgICAgICAgICAgaWYgKHRleHRMYXlvdXRJbmZvLmZpcnN0ICE9IHQpIHsKKyAgICAg
ICAgICAgICAgICB0ZXh0TGF5b3V0SW5mby5maXJzdCA9IHQ7CisgICAgICAgICAgICAgICAgdGV4
dExheW91dEluZm8uc2Vjb25kID0gZi5jcmVhdGVMYXlvdXQodCwgd2lkdGguY3VycmVudFdpZHRo
KCksIGNvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0
TGF5b3V0KiB0ZXh0TGF5b3V0ID0gdGV4dExheW91dEluZm8uc2Vjb25kLmdldCgpOworCiAgICAg
ICAgICAgICBmb3IgKDsgY3VycmVudC5tX3BvcyA8IHQtPnRleHRMZW5ndGgoKTsgY3VycmVudC5m
YXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7CiAgICAgICAgICAgICAgICAgYm9vbCBwcmV2aW91
c0NoYXJhY3RlcklzU3BhY2UgPSBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKICAgICAgICAgICAg
ICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNXUyA9IGN1cnJlbnRDaGFyYWN0ZXJJc1dTOwpA
QCAtMjM2NCw3ICsyMzc0LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVh
a2VyOgogICAgICAgICAgICAgICAgIGlmICgoYnJlYWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1p
ZFdvcmRCcmVhaykgewogICAgICAgICAgICAgICAgICAgICB3cmFwVyArPSBjaGFyV2lkdGg7CiAg
ICAgICAgICAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWly
ID0gVTE2X0lTX0xFQUQoYykgJiYgY3VycmVudC5tX3BvcyArIDEgPCB0LT50ZXh0TGVuZ3RoKCkg
JiYgVTE2X0lTX1RSQUlMKHQtPmNoYXJhY3RlcnMoKVtjdXJyZW50Lm1fcG9zICsgMV0pOwotICAg
ICAgICAgICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3Bvcywg
bWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1p
dHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpOwor
ICAgICAgICAgICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3Bv
cywgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNv
bW1pdHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2Us
IHRleHRMYXlvdXQpOwogICAgICAgICAgICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSB3aWR0aC5j
b21taXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFyV2lkdGggPiB3aWR0aC5hdmFpbGFibGVXaWR0
aCgpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjM5NSw5ICsyNDA1LDkgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogCiAgICAgICAgICAgICAgICAgICAgIGZs
b2F0IGFkZGl0aW9uYWxUbXBXOwogICAgICAgICAgICAgICAgICAgICBpZiAod29yZFRyYWlsaW5n
U3BhY2VXaWR0aCAmJiBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGFkZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5t
X3BvcyArIDEgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0
Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICsgbGFzdFNw
YWNlV29yZFNwYWNpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9
IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNwYWNlLCBm
LCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2Us
IHRleHRMYXlvdXQpIC0gd29yZFRyYWlsaW5nU3BhY2VXaWR0aCArIGxhc3RTcGFjZVdvcmRTcGFj
aW5nOwogICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBh
ZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBs
YXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNl
V2hpdGVTcGFjZSkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGFkZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3Bv
cyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29s
bGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAg
ICAgICAgICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBX
KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcHBsaWVkU3RhcnRXaWR0aCkgewogICAgICAg
ICAgICAgICAgICAgICAgICAgd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2Fs
V2lkdGgoY3VycmVudC5tX29iaiwgdHJ1ZSwgZmFsc2UpKTsKQEAgLTI0MTQsNyArMjQyNCw3IEBA
IElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIGFzIGNhbmRpZGF0ZSB3aWR0aCBmb3IgdGhpcyBsaW5lLgogICAgICAgICAg
ICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9IGZhbHNlOwogICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHdpZHRoLmZpdHNPbkxpbmUoKSAmJiBjdXJyZW50Q2hhcmFjdGVySXNX
UyAmJiBjdXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3Jk
QnJlYWspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0
ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgMSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlz
Rml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIChhcHBseVdvcmRTcGFjaW5nID8gd29y
ZFNwYWNpbmcgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lk
dGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgMSwgZiwgd2lkdGguY3VycmVudFdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIChhcHBs
eVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0IHRoZSBleHRyYSBz
cGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxp
bmUuIElmIGl0IGlzIG5vdCwgZG8gbm90aGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEgd2hpdGVzcGFjZSB0byBiZSB0b28gbG9u
ZywKQEAgLTI1NDAsNyArMjU1MCw3IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5l
QnJlYWtlcjoKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSU1QT1JUQU5UOiBjdXJy
ZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFs
VG1wVyA9IGlnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJl
bnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0
Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAg
ICAgIGZsb2F0IGFkZGl0aW9uYWxUbXBXID0gaWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRo
KHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVu
dFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSAr
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgd2lkdGguYWRkVW5jb21taXR0ZWRX
aWR0aChhZGRpdGlvbmFsVG1wVyArIGlubGluZUxvZ2ljYWxXaWR0aChjdXJyZW50Lm1fb2JqLCAh
YXBwbGllZFN0YXJ0V2lkdGgsIGluY2x1ZGVFbmRXaWR0aCkpOwogICAgICAgICAgICAgaW5jbHVk
ZUVuZFdpZHRoID0gZmFsc2U7CiAK
</data>
<flag name="commit-queue"
          id="139842"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135366</attachid>
            <date>2012-04-03 11:05:38 -0700</date>
            <delta_ts>2012-04-03 11:15:08 -0700</delta_ts>
            <desc>Fix EWS failures.</desc>
            <filename>TextLayout-win.txt</filename>
            <type>text/plain</type>
            <size>31170</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjk2OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcxIEBACisyMDEyLTA0LTAyICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBidWxrIG9mIHRoaXMgY2hhbmdlIGlzIG1vZGlm
eWluZyBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UsIHdoaWNoIHByZXZpb3VzbHkgcmVx
dWlyZWQgdGhlIHRleHQgb2Zmc2V0CisgICAgICAgIHRvIGJlIHN0cmljdGx5IGluY3JlYXNpbmcg
YW5kIGFzc3VtZWQgdW5pZGlyZWN0aW9uYWwgdGV4dDsgbm93IGl0IHN1cHBvcnRzIHJhbmRvbSBz
ZWVraW5nIGluIGEgbmFpdmUgZmFzaGlvbgorICAgICAgICAoYnkgcmVzdGFydGluZyB0byB0aGUg
YmVnaW5uaW5nKSBhbmQgdHJhdmVyc2VzIGdseXBocyBpbiBsb2dpY2FsIG9yZGVyLiBJbiB0aGUg
bGF0dGVyIGNhc2UsIHRoZSBwcmVzZW5jZSBvZiBhbnkKKyAgICAgICAgbm9uLUxUUiBydW5zIHRy
aWdnZXJzIHRoZSBwb3B1bGF0aW9uIG9mIGEgbWFwcGluZyBmcm9tIGxvZ2ljYWwgdG8gdmlzdWFs
IHJ1biBpbmRpY2VzLiBGaW5hbGx5LCBhIG5ldyBmbGFnIGhhcworICAgICAgICBiZWVuIGFkZGVk
IHdoaWNoIGluaGliaXRzIGdseXBoIGFkdmFuY2VzIGZyb20gYmVpbmcgc3BsaXQgYWNyb3NzIGxp
Z2F0dXJlcyAodGh1cyBjYXVzaW5nIHNwdXJpb3VzIGxpbmUgYnJlYWtzKS4KKworICAgICAgICBB
IENvbXBsZXhUZXh0Q29udHJvbGxlciBhbmQgaXRzIGFzc29jaWF0ZWQgVGV4dFJ1biBhbmQgRm9u
dCBhcmUgZW5jYXBzdWxhdGVkIGluIGEgVGV4dExheW91dCBvYmplY3QsIHdoaWNoIGlzCisgICAg
ICAgIGluc3RhbnRpYXRlZCBhcyBhbiBvcGFxdWUgb2JqZWN0IHZpYSBmdW5jdGlvbnMgdGhhdCBh
cmUgbm8tb3BzIHVubGVzcyBidWlsZGluZyBmb3IgTWFjLiBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rp
b24KKyAgICAgICAgKGlzTmVlZGVkKSBjaGVja3MgdG8gc2VlIHdoZXRoZXIgYSBUZXh0UnVuIGlz
IGNvbXBsZXgsIGluIG9yZGVyIHRvIGF2b2lkIG5lZWRsZXNzIGluc3RhbnRpYXRpb24uIEFsdGhv
dWdoIHRoZQorICAgICAgICBBVFNVSSBDb21wbGV4VGV4dENvbnRyb2xsZXIgaW1wbGVtZW50YXRp
b24gaGFzIGJlZW4gdXBkYXRlZCB0byBhY2NvdW50IGZvciBuZXdseS1hZGRlZCBtZW1iZXIgdmFy
aWFibGVzLCB0aGlzCisgICAgICAgIG5ldyBwYXRoIGlzIG9ubHkgZW5hYmxlZCBmb3IgQ29yZSBU
ZXh0LgorCisgICAgICAgIE5vIGJlaGF2aW9yYWwgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgZHVlIHRv
IHRoaXMgY2hhbmdlLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9Gb250LmNwcDoKKyAgICAgICAgKFdURik6IERlZmluZSBkZWxldGVPd25lZFB0ciBmb3Ig
VGV4dExheW91dCBhcyBjYWxsaW5nIHRocm91Z2ggZGVzdHJveUxheW91dDsgcmVseWluZyBvbiBv
cGVyYXRvciBkZWxldGUgaXMgbm90IHdvcmthYmxlIGFzIHRoZSBjbGFzcyBkb2VzIG5vdCBleGlz
dCBvbiBhbGwgcGxhdGZvcm1zLgorICAgICAgICAoV1RGOjpXZWJDb3JlOjpUZXh0TGF5b3V0KToK
KyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgbm8tb3AgVGV4dExheW91dCB3cmFwcGVycyBm
b3Igbm9uLU1hYyBwbGF0Zm9ybXMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlv
dXQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVzdHJveUxheW91dCk6CisgICAgICAgIChX
ZWJDb3JlOjpGb250Ojp3aWR0aCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5o
OgorICAgICAgICAoV2ViQ29yZSk6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgUmVuZGVy
VGV4dCBhbmQgVGV4dExheW91dC4KKyAgICAgICAgKEZvbnQpOiBBZGQgZnVuY3Rpb25zIGZvciBk
ZWFsaW5nIHdpdGggcG9pbnRlciB0byBUZXh0TGF5b3V0IGltcGxlbWVudGF0aW9uLgorICAgICAg
ICAoV1RGKTogRGVjbGFyZSBkZWxldGVPd25lZFB0ciBmb3IgVGV4dExheW91dC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcDoKKyAgICAg
ICAgKFRleHRMYXlvdXQpOiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRv
IGEgQ29tcGxleFRleHRDb250cm9sbGVyIGZvciBhIHBhcnRpY3VsYXIgVGV4dFJ1bi4KKyAgICAg
ICAgKFdlYkNvcmU6OlRleHRMYXlvdXQ6OmlzTmVlZGVkKTogVXNlZCBieSB3cmFwcGVyIHRvIGF2
b2lkIGluc3RhbnRpYXRpb24gd2hlbiBjb21wbGV4IGxheW91dCBpcyBub3QgcmVxdWlyZWQuCisg
ICAgICAgIChXZWJDb3JlOjpUZXh0TGF5b3V0OjpUZXh0TGF5b3V0KToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRMYXlvdXQ6On5UZXh0TGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRMYXlv
dXQ6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgcmVhbCBUZXh0TGF5b3V0
IHdyYXBwZXJzIGZvciBNYWMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlvdXQp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVzdHJveUxheW91dCk6CisgICAgICAgIChXZWJD
b3JlOjpGb250Ojp3aWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xs
ZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcik6IEluaXRpYWxpemUgbV9sdHJPbmx5LgorICAgICAg
ICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29tcGxl
eFRleHRSdW4pOiBJbml0aWFsaXplIG1faW5kZXhCZWdpbiBhbmQgbV9sdHIuCisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmluZGV4T2ZDdXJyZW50UnVuKTogUmV0dXJu
ICh2aXN1YWwpIG1fY29tcGxleFRleHRSdW5zIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gKGxvZ2lj
YWwpIG1fY3VycmVudFJ1biwgbGF6aWx5IGNvbnN0cnVjdGluZyBtX3J1bkluZGljZXMgaWYgbmVl
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppbmNyZW1lbnRD
dXJyZW50UnVuKTogUmV0dXJuIG5leHQgbV9jb21wbGV4VGV4dFJ1bnMgaW5kZXggaW4gbG9naWNh
bCBvcmRlci4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5j
ZSk6IEFsbG93IHJlc3RhcnRpbmcsIHN1cHBvcnQgZm9yIGJpZGkgcmVvcmRlcmluZywgYW5kIG9w
dGlvbiB0byBtZWFzdXJlIG9ubHkgd2hvbGUgZ2x5cGhzIHJhdGhlciB0aGFuIGRpdmlkaW5nIGFk
dmFuY2VzLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphZGp1c3RH
bHlwaHNBbmRBZHZhbmNlcyk6IENsZWFyIG1fbHRyT25seSBvbiBkZXRlY3RpbmcgYSBSVEwgcnVu
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIu
aDoKKyAgICAgICAgKENvbXBsZXhUZXh0Q29udHJvbGxlcik6IEFkZCBtX2x0ck9ubHkgaW5kaWNh
dGluZyBubyBiaWRpIHJlb3JkZXJpbmcsIGFuZCBtX3J1bkluZGljZXMgbWFwcGluZyBmcm9tIHJ1
bnMgKGxvZ2ljYWwgb3JkZXIpIHRvIG1fY29tcGxleFRleHRSdW5zICh2aXN1YWwgb3JkZXIpLgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6
aW5kZXhCZWdpbik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNv
bXBsZXhUZXh0UnVuOjpsdHIpOgorICAgICAgICAoQ29tcGxleFRleHRSdW4pOiBBZGQgbV9pbmRl
eEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxl
eFRleHRDb250cm9sbGVyQVRTVUkuY3BwOiBJbml0aWFsaXplIG1faW5kZXhCZWdpbiBhbmQgbV9s
dHIsIGV2ZW4gdGhvdWdoIFRleHRMYXlvdXQgaXMgbm90IGVuYWJsZWQgZm9yIEFUU1VJLgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29t
cGxleFRleHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpD
b21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUFUU1VJKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQubW06
IEluaXRpYWxpemUgbV9pbmRleEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKFdlYkNvcmU6OkNv
bXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkNvbXBsZXhUZXh0UnVuKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNy
ZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmg6IEFkZCBUZXh0TGF5b3V0SW5mbywgbWFwcGluZyBmcm9tIFJlbmRlclRleHQg
dG8gKHBvc3NpYmx5IG51bGwpIFRleHRMYXlvdXQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKFJlbmRlckJsb2NrKToKKyAgICAgICAgKExpbmVCcmVha2VyKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZSk6IEFsbG93IFRleHRMYXlvdXQgaW5z
dGFuY2UgdG8gYmUgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBuZXh0TGluZUJyZWFrLgorICAgICAg
ICAoV2ViQ29yZTo6dGV4dFdpZHRoKTogVXNlIFRleHRMYXlvdXQgd2hlbiBzdXBwbGllZCBmb3Ig
bWVhc3VyaW5nLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpu
ZXh0TGluZUJyZWFrKTogCisKIDIwMTItMDQtMDIgIFRvbnkgQ2hhbmcgIDx0b255QGNocm9taXVt
Lm9yZz4KIAogICAgICAgICBhZGQgY3NzIHBhcnNpbmcgb2YgLXdlYmtpdC1mbGV4CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAkocmV2aXNpb24gMTEyODkx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMxLDYgKzMxLDkgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNl
bmRpZgogI2luY2x1ZGUgIkludFBvaW50LmgiCisjaWYgIVBMQVRGT1JNKE1BQykKKyNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgorI2VuZGlmCiAjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKICNp
bmNsdWRlICJUZXh0UnVuLmgiCiAjaW5jbHVkZSAiV2lkdGhJdGVyYXRvci5oIgpAQCAtNDIsNiAr
NDUsMTUgQEAKIHVzaW5nIG5hbWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsK
IAorbmFtZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlIDw+IHZvaWQgZGVsZXRlT3duZWRQdHI8V2Vi
Q29yZTo6VGV4dExheW91dD4oV2ViQ29yZTo6VGV4dExheW91dCogcHRyKQoreworICAgIFdlYkNv
cmU6OkZvbnQ6OmRlc3Ryb3lMYXlvdXQocHRyKTsKK30KKworfQorCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIGNvbnN0IHVpbnQ4X3QgRm9udDo6c19yb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsy
NTZdID0gewpAQCAtMjA1LDYgKzIxNywyNSBAQCBmbG9hdCBGb250Ojp3aWR0aChjb25zdCBUZXh0
UnVuJiBydW4sIGluCiAgICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChydW4pOwog
fQogCisjaWYgIVBMQVRGT1JNKE1BQykKKworUGFzc093blB0cjxUZXh0TGF5b3V0PiBGb250Ojpj
cmVhdGVMYXlvdXQoUmVuZGVyVGV4dCosIGZsb2F0IHhQb3MsIGJvb2wgY29sbGFwc2VXaGl0ZVNw
YWNlKSBjb25zdAoreworICAgIHJldHVybiAwOworfQorCit2b2lkIEZvbnQ6OmRlc3Ryb3lMYXlv
dXQoVGV4dExheW91dCopCit7Cit9CisKK2Zsb2F0IEZvbnQ6OndpZHRoKFRleHRMYXlvdXQmLCB1
bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAg
IHJldHVybiAwOworfQorCisjZW5kaWYKKwogRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RG
b3JUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBo
LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewogICAgIHRvID0gKHRvID09IC0xID8gcnVuLmxl
bmd0aCgpIDogdG8pOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9u
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQu
aAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Rm9udC5oCSh3b3JraW5nIGNvcHkpCkBAIC01MCw2ICs1MCw4IEBAIGNsYXNzIEZvbnRTZWxlY3Rv
cjsKIGNsYXNzIEdseXBoQnVmZmVyOwogY2xhc3MgR2x5cGhQYWdlVHJlZU5vZGU7CiBjbGFzcyBH
cmFwaGljc0NvbnRleHQ7CitjbGFzcyBSZW5kZXJUZXh0OworY2xhc3MgVGV4dExheW91dDsKIGNs
YXNzIFRleHRSdW47CiAKIHN0cnVjdCBHbHlwaERhdGE7CkBAIC05OSw2ICsxMDEsMTAgQEAgcHVi
bGljOgogICAgIGZsb2F0IHdpZHRoKGNvbnN0IFRleHRSdW4mLCBIYXNoU2V0PGNvbnN0IFNpbXBs
ZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMgPSAwLCBHbHlwaE92ZXJmbG93KiA9IDApIGNvbnN0
OwogICAgIGZsb2F0IHdpZHRoKGNvbnN0IFRleHRSdW4mLCBpbnQmIGNoYXJzQ29uc3VtZWQsIFN0
cmluZyYgZ2x5cGhOYW1lKSBjb25zdDsKIAorICAgIFBhc3NPd25QdHI8VGV4dExheW91dD4gY3Jl
YXRlTGF5b3V0KFJlbmRlclRleHQqLCBmbG9hdCB4UG9zLCBib29sIGNvbGxhcHNlV2hpdGVTcGFj
ZSkgY29uc3Q7CisgICAgc3RhdGljIHZvaWQgZGVzdHJveUxheW91dChUZXh0TGF5b3V0Kik7Cisg
ICAgc3RhdGljIGZsb2F0IHdpZHRoKFRleHRMYXlvdXQmLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25l
ZCB0byk7CisKICAgICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb24oY29uc3QgVGV4dFJ1biYsIGZsb2F0
IHBvc2l0aW9uLCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdDsKICAgICBGbG9hdFJl
Y3Qgc2VsZWN0aW9uUmVjdEZvclRleHQoY29uc3QgVGV4dFJ1biYsIGNvbnN0IEZsb2F0UG9pbnQm
LCBpbnQgaCwgaW50IGZyb20gPSAwLCBpbnQgdG8gPSAtMSkgY29uc3Q7CiAKQEAgLTI5MSw0ICsy
OTcsMTAgQEAgaW5saW5lIEZvbnRTZWxlY3RvciogRm9udDo6Zm9udFNlbGVjdG9yKAogCiB9CiAK
K25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZSA8PiB2b2lkIGRlbGV0ZU93bmVkUHRyPFdlYkNv
cmU6OlRleHRMYXlvdXQ+KFdlYkNvcmU6OlRleHRMYXlvdXQqIHB0cik7CisKK30KKwogI2VuZGlm
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRD
b250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAkocmV2aXNpb24gMTEyODkxKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDggQEAKIAogI2luY2x1ZGUgIkZsb2F0
U2l6ZS5oIgogI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgorI2lu
Y2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlICJUZXh0QnJlYWtJdGVyYXRvci5oIgogI2lu
Y2x1ZGUgIlRleHRSdW4uaCIKICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0
aW9uU2VydmljZXMuaD4KQEAgLTQyLDYgKzQ0LDczIEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgVGV4dExheW91dCB7CitwdWJsaWM6CisgICAg
c3RhdGljIGJvb2wgaXNOZWVkZWQoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCkK
KyAgICB7CisgICAgICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRS
dW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpLCB0ZXh0LT50ZXh0TGVuZ3RoKCksIHRl
eHQtPnN0eWxlKCkpOworICAgICAgICBGb250OjpDb2RlUGF0aCBjb2RlUGF0aFRvVXNlID0gZm9u
dC5jb2RlUGF0aChydW4pOworICAgICAgICByZXR1cm4gY29kZVBhdGhUb1VzZSA9PSBGb250OjpD
b21wbGV4OworICAgIH0KKworICAgIFRleHRMYXlvdXQoUmVuZGVyVGV4dCogdGV4dCwgY29uc3Qg
Rm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpCisgICAgICAg
IDogbV9mb250KGZvbnQpCisgICAgICAgICwgbV9ydW4oMCwgMCkKKyAgICB7CisgICAgICAgIG1f
Zm9udC5zZXRXb3JkU3BhY2luZygwKTsKKworICAgICAgICBtX3J1biA9IFJlbmRlckJsb2NrOjpj
b25zdHJ1Y3RUZXh0UnVuKHRleHQsIG1fZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpLCB0ZXh0LT50
ZXh0TGVuZ3RoKCksIHRleHQtPnN0eWxlKCkpOworICAgICAgICBtX3J1bi5zZXRDaGFyYWN0ZXJz
TGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSk7CisgICAgICAgIEFTU0VSVChtX3J1bi5jaGFyYWN0
ZXJzTGVuZ3RoKCkgPj0gbV9ydW4ubGVuZ3RoKCkpOworCisgICAgICAgIG1fcnVuLnNldEFsbG93
VGFicyghY29sbGFwc2VXaGl0ZVNwYWNlKTsKKyAgICAgICAgbV9ydW4uc2V0WFBvcyh4UG9zKTsK
KworICAgICAgICBtX2NvbnRyb2xsZXIgPSBuZXcgQ29tcGxleFRleHRDb250cm9sbGVyKCZtX2Zv
bnQsIG1fcnVuLCB0cnVlKTsKKyAgICB9CisgICAgflRleHRMYXlvdXQoKQorICAgIHsKKyAgICAg
ICAgZGVsZXRlIG1fY29udHJvbGxlcjsKKyAgICB9CisKKyAgICBmbG9hdCB3aWR0aCh1bnNpZ25l
ZCBmcm9tLCB1bnNpZ25lZCBsZW4pCisgICAgeworICAgICAgICBtX2NvbnRyb2xsZXItPmFkdmFu
Y2UoZnJvbSwgMCwgdHJ1ZSk7CisgICAgICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gbV9jb250cm9s
bGVyLT5ydW5XaWR0aFNvRmFyKCk7CisgICAgICAgIG1fY29udHJvbGxlci0+YWR2YW5jZShmcm9t
ICsgbGVuLCAwLCB0cnVlKTsKKyAgICAgICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IG1fY29udHJvbGxl
ci0+cnVuV2lkdGhTb0ZhcigpOworICAgICAgICByZXR1cm4gYWZ0ZXJXaWR0aCAtIGJlZm9yZVdp
ZHRoOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGb250IG1fZm9udDsKKyAgICBUZXh0UnVuIG1f
cnVuOworICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciogbV9jb250cm9sbGVyOworfTsKKworUGFz
c093blB0cjxUZXh0TGF5b3V0PiBGb250OjpjcmVhdGVMYXlvdXQoUmVuZGVyVGV4dCogdGV4dCwg
ZmxvYXQgeFBvcywgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpIGNvbnN0Cit7CisjaWYgVVNFKENP
UkVfVEVYVCkKKyNpZiBVU0UoQVRTVUkpCisgICAgaWYgKHNob3VsZFVzZUFUU1VJQVBJKCkpCisg
ICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgaWYgKFRleHRMYXlvdXQ6OmlzTmVl
ZGVkKHRleHQsICp0aGlzKSkKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUZXh0TGF5b3V0
KHRleHQsICp0aGlzLCB4UG9zLCBjb2xsYXBzZVdoaXRlU3BhY2UpKTsKKyNlbmRpZgorICAgIHJl
dHVybiBudWxscHRyOworfQorCit2b2lkIEZvbnQ6OmRlc3Ryb3lMYXlvdXQoVGV4dExheW91dCog
bGF5b3V0KQoreworICAgIGRlbGV0ZSBsYXlvdXQ7Cit9CisKK2Zsb2F0IEZvbnQ6OndpZHRoKFRl
eHRMYXlvdXQmIGxheW91dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisgICAgcmV0
dXJuIGxheW91dC53aWR0aChmcm9tLCB0byk7Cit9CisKIHN0YXRpYyBpbmxpbmUgQ0dGbG9hdCBy
b3VuZENHRmxvYXQoQ0dGbG9hdCBmKQogewogICAgIGlmIChzaXplb2YoQ0dGbG9hdCkgPT0gc2l6
ZW9mKGZsb2F0KSkKQEAgLTU5LDYgKzEyOCw3IEBAIHN0YXRpYyBpbmxpbmUgQ0dGbG9hdCBjZWls
Q0dGbG9hdChDR0Zsb2EKIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRDb250cm9s
bGVyKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1biwgYm9vbCBtYXlVc2VOYXR1
cmFsV3JpdGluZ0RpcmVjdGlvbiwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxs
YmFja0ZvbnRzLCBib29sIGZvclRleHRFbXBoYXNpcykKICAgICA6IG1fZm9udCgqZm9udCkKICAg
ICAsIG1fcnVuKHJ1bikKKyAgICAsIG1fbHRyT25seSh0cnVlKQogICAgICwgbV9tYXlVc2VOYXR1
cmFsV3JpdGluZ0RpcmVjdGlvbihtYXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbikKICAgICAs
IG1fZm9yVGV4dEVtcGhhc2lzKGZvclRleHRFbXBoYXNpcykKICAgICAsIG1fY3VycmVudENoYXJh
Y3RlcigwKQpAQCAtMzY0LDE1ICs0MzQsMTcgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21w
bGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBtX3N0
cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9zdHJpbmdMZW5ndGgoc3RyaW5n
TGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9pbmRl
eEVuZChzdHJpbmdMZW5ndGgpCisgICAgLCBtX2x0cihsdHIpCiAgICAgLCBtX2lzTW9ub3Rvbmlj
KHRydWUpCiB7CiAjaWYgVVNFKENPUkVfVEVYVCkgJiYgVVNFKEFUU1VJKQotICAgIHNob3VsZFVz
ZUFUU1VJQVBJKCkgPyBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkobHRyKSA6IGNyZWF0
ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dChsdHIpOworICAgIHNob3VsZFVzZUFUU1VJQVBJ
KCkgPyBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoKSA6IGNyZWF0ZVRleHRSdW5Gcm9t
Rm9udERhdGFDb3JlVGV4dCgpOwogI2VsaWYgVVNFKEFUU1VJKQotICAgIGNyZWF0ZVRleHRSdW5G
cm9tRm9udERhdGFBVFNVSShsdHIpOworICAgIGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNV
SSgpOwogI2VsaWYgVVNFKENPUkVfVEVYVCkKLSAgICBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRh
Q29yZVRleHQobHRyKTsKKyAgICBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQoKTsK
ICNlbmRpZgogfQogCkBAIC00MDAsMjUgKzQ3Miw4NiBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJv
bGxlcjo6Q29tcGxleFRleHRSCiAgICAgfQogfQogCi12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxl
cjo6YWR2YW5jZSh1bnNpZ25lZCBvZmZzZXQsIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlcikKK3Vu
c2lnbmVkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6aW5kZXhPZkN1cnJlbnRSdW4odW5zaWduZWQm
IGxlZnRtb3N0R2x5cGgpCit7CisgICAgbGVmdG1vc3RHbHlwaCA9IDA7CisgICAgCisgICAgc2l6
ZV90IHJ1bkNvdW50ID0gbV9jb21wbGV4VGV4dFJ1bnMuc2l6ZSgpOworICAgIGlmIChtX2N1cnJl
bnRSdW4gPj0gcnVuQ291bnQpCisgICAgICAgIHJldHVybiBydW5Db3VudDsKKworICAgIGlmICht
X2x0ck9ubHkpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCByID0gMDsgciA8IG1fY3VycmVudFJ1
bjsgKytyKSB7CisgICAgICAgICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY29tcGxleFRleHRS
dW4gPSAqbV9jb21wbGV4VGV4dFJ1bnNbcl07CisgICAgICAgICAgICBsZWZ0bW9zdEdseXBoICs9
IGNvbXBsZXhUZXh0UnVuLmdseXBoQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
bV9jdXJyZW50UnVuOworICAgIH0KKworICAgIHdoaWxlIChtX3J1bkluZGljZXMuc2l6ZSgpIDw9
IG1fY3VycmVudFJ1bikgeworICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSAwOworICAgICAgICBp
ZiAoIW1fcnVuSW5kaWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHIgPSBt
X3J1bkluZGljZXMubGFzdCgpOworICAgICAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGN1
cnJlbnRUZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW3JdOworICAgICAgICAgICAgb2Zmc2V0
ID0gY3VycmVudFRleHRSdW4uc3RyaW5nTG9jYXRpb24oKSArIGN1cnJlbnRUZXh0UnVuLmluZGV4
RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVuc2lnbmVkIHEgPSAwOyBxIDwgcnVu
Q291bnQ7ICsrcSkgeworICAgICAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhU
ZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW3FdOworICAgICAgICAgICAgaWYgKG9mZnNldCA9
PSBjb21wbGV4VGV4dFJ1bi5zdHJpbmdMb2NhdGlvbigpICsgY29tcGxleFRleHRSdW4uaW5kZXhC
ZWdpbigpKSB7CisgICAgICAgICAgICAgICAgbV9ydW5JbmRpY2VzLmFwcGVuZChxKTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAg
IHVuc2lnbmVkIHIgPSBtX3J1bkluZGljZXNbbV9jdXJyZW50UnVuXTsKKyAgICBmb3IgKHVuc2ln
bmVkIHEgPSAwOyBxIDwgcjsgKytxKSB7CisgICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBj
b21wbGV4VGV4dFJ1biA9ICptX2NvbXBsZXhUZXh0UnVuc1txXTsKKyAgICAgICAgbGVmdG1vc3RH
bHlwaCArPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENvdW50KCk7CisgICAgfQorICAgIHJldHVybiBy
OworfQorCit1bnNpZ25lZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmluY3JlbWVudEN1cnJlbnRS
dW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgpCit7CisgICAgaWYgKG1fbHRyT25seSkgeworICAg
ICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY3VycmVudFRleHRSdW4gPSAqbV9jb21wbGV4VGV4
dFJ1bnNbbV9jdXJyZW50UnVuKytdOworICAgICAgICBsZWZ0bW9zdEdseXBoICs9IGN1cnJlbnRU
ZXh0UnVuLmdseXBoQ291bnQoKTsKKyAgICAgICAgcmV0dXJuIG1fY3VycmVudFJ1bjsKKyAgICB9
CisKKyAgICBtX2N1cnJlbnRSdW4rKzsKKyAgICBsZWZ0bW9zdEdseXBoID0gMDsKKyAgICByZXR1
cm4gaW5kZXhPZkN1cnJlbnRSdW4obGVmdG1vc3RHbHlwaCk7Cit9CisKK3ZvaWQgQ29tcGxleFRl
eHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2lnbmVkIG9mZnNldCwgR2x5cGhCdWZmZXIqIGdseXBo
QnVmZmVyLCBib29sIGJ5V2hvbGVHbHlwaHMpCiB7CiAgICAgaWYgKHN0YXRpY19jYXN0PGludD4o
b2Zmc2V0KSA+IG1fZW5kKQogICAgICAgICBvZmZzZXQgPSBtX2VuZDsKIAotICAgIGlmIChvZmZz
ZXQgPD0gbV9jdXJyZW50Q2hhcmFjdGVyKQotICAgICAgICByZXR1cm47CisgICAgaWYgKG9mZnNl
dCA8PSBtX2N1cnJlbnRDaGFyYWN0ZXIpIHsKKyAgICAgICAgbV9ydW5XaWR0aFNvRmFyID0gbV9s
ZWFkaW5nRXhwYW5zaW9uOworICAgICAgICBtX251bUdseXBoc1NvRmFyID0gMDsKKyAgICAgICAg
bV9jdXJyZW50UnVuID0gMDsKKyAgICAgICAgbV9nbHlwaEluQ3VycmVudFJ1biA9IDA7CisgICAg
ICAgIG1fY2hhcmFjdGVySW5DdXJyZW50R2x5cGggPSAwOworICAgIH0KIAogICAgIG1fY3VycmVu
dENoYXJhY3RlciA9IG9mZnNldDsKIAogICAgIHNpemVfdCBydW5Db3VudCA9IG1fY29tcGxleFRl
eHRSdW5zLnNpemUoKTsKIAotICAgIGJvb2wgbHRyID0gbV9ydW4ubHRyKCk7Ci0KLSAgICB1bnNp
Z25lZCBrID0gbHRyID8gbV9udW1HbHlwaHNTb0ZhciA6IG1fYWRqdXN0ZWRHbHlwaHMuc2l6ZSgp
IC0gMSAtIG1fbnVtR2x5cGhzU29GYXI7CisgICAgdW5zaWduZWQgbGVmdG1vc3RHbHlwaCA9IDA7
CisgICAgdW5zaWduZWQgciA9IGluZGV4T2ZDdXJyZW50UnVuKGxlZnRtb3N0R2x5cGgpOwogICAg
IHdoaWxlIChtX2N1cnJlbnRSdW4gPCBydW5Db3VudCkgewotICAgICAgICBjb25zdCBDb21wbGV4
VGV4dFJ1biYgY29tcGxleFRleHRSdW4gPSAqbV9jb21wbGV4VGV4dFJ1bnNbbHRyID8gbV9jdXJy
ZW50UnVuIDogcnVuQ291bnQgLSAxIC0gbV9jdXJyZW50UnVuXTsKKyAgICAgICAgY29uc3QgQ29t
cGxleFRleHRSdW4mIGNvbXBsZXhUZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW3JdOworICAg
ICAgICBib29sIGx0ciA9IGNvbXBsZXhUZXh0UnVuLmx0cigpOwogICAgICAgICBzaXplX3QgZ2x5
cGhDb3VudCA9IGNvbXBsZXhUZXh0UnVuLmdseXBoQ291bnQoKTsKICAgICAgICAgdW5zaWduZWQg
ZyA9IGx0ciA/IG1fZ2x5cGhJbkN1cnJlbnRSdW4gOiBnbHlwaENvdW50IC0gMSAtIG1fZ2x5cGhJ
bkN1cnJlbnRSdW47CisgICAgICAgIHVuc2lnbmVkIGsgPSBsZWZ0bW9zdEdseXBoICsgZzsKKwog
ICAgICAgICB3aGlsZSAobV9nbHlwaEluQ3VycmVudFJ1biA8IGdseXBoQ291bnQpIHsKICAgICAg
ICAgICAgIHVuc2lnbmVkIGdseXBoU3RhcnRPZmZzZXQgPSBjb21wbGV4VGV4dFJ1bi5pbmRleEF0
KGcpOwogICAgICAgICAgICAgdW5zaWduZWQgZ2x5cGhFbmRPZmZzZXQ7CkBAIC00NDcsNiArNTgw
LDkgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UodW5zaQogICAgICAgICAg
ICAgICAgIC8vIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGdseXBocyBwZXIgY2hhcmFjdGVyIHdl
IG5lZWQgdG8gYWR2YW5jZSBieSB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgZ2x5cGguCiAgICAgICAg
ICAgICAgICAgQVNTRVJUKG1fY2hhcmFjdGVySW5DdXJyZW50R2x5cGggPT0gb2xkQ2hhcmFjdGVy
SW5DdXJyZW50R2x5cGgpOwogICAgICAgICAgICAgICAgIG1fcnVuV2lkdGhTb0ZhciArPSBhZGp1
c3RlZEFkdmFuY2Uud2lkdGg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5V2hvbGVHbHlwaHMp
IHsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZENoYXJhY3RlckluQ3VycmVudEdseXBoKQorICAg
ICAgICAgICAgICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0gYWRqdXN0ZWRBZHZhbmNlLndpZHRo
OwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9
IGFkanVzdGVkQWR2YW5jZS53aWR0aCAqIChtX2NoYXJhY3RlckluQ3VycmVudEdseXBoIC0gb2xk
Q2hhcmFjdGVySW5DdXJyZW50R2x5cGgpIC8gKGdseXBoRW5kT2Zmc2V0IC0gZ2x5cGhTdGFydE9m
ZnNldCk7CiAKQEAgLTQ2NCwxMCArNjAwLDEwIEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVy
OjphZHZhbmNlKHVuc2kKICAgICAgICAgICAgICAgICBrLS07CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KLSAgICAgICAgbV9jdXJyZW50UnVuKys7CisgICAgICAgIHIgPSBpbmNyZW1lbnRDdXJy
ZW50UnVuKGxlZnRtb3N0R2x5cGgpOwogICAgICAgICBtX2dseXBoSW5DdXJyZW50UnVuID0gMDsK
ICAgICB9Ci0gICAgaWYgKCFsdHIgJiYgbV9udW1HbHlwaHNTb0ZhciA9PSBtX2FkanVzdGVkQWR2
YW5jZXMuc2l6ZSgpKQorICAgIGlmICghbV9ydW4ubHRyKCkgJiYgbV9udW1HbHlwaHNTb0ZhciA9
PSBtX2FkanVzdGVkQWR2YW5jZXMuc2l6ZSgpKQogICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0g
bV9maW5hbFJvdW5kaW5nV2lkdGg7CiB9CiAKQEAgLTQ4MSw2ICs2MTcsOSBAQCB2b2lkIENvbXBs
ZXhUZXh0Q29udHJvbGxlcjo6YWRqdXN0R2x5cGhzCiAgICAgICAgIHVuc2lnbmVkIGdseXBoQ291
bnQgPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENvdW50KCk7CiAgICAgICAgIGNvbnN0IFNpbXBsZUZv
bnREYXRhKiBmb250RGF0YSA9IGNvbXBsZXhUZXh0UnVuLmZvbnREYXRhKCk7CiAKKyAgICAgICAg
aWYgKCFjb21wbGV4VGV4dFJ1bi5sdHIoKSkKKyAgICAgICAgICAgIG1fbHRyT25seSA9IGZhbHNl
OworCiAgICAgICAgIGNvbnN0IENHR2x5cGgqIGdseXBocyA9IGNvbXBsZXhUZXh0UnVuLmdseXBo
cygpOwogICAgICAgICBjb25zdCBDR1NpemUqIGFkdmFuY2VzID0gY29tcGxleFRleHRSdW4uYWR2
YW5jZXMoKTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0Nv
bXBsZXhUZXh0Q29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuaAkocmV2aXNpb24gMTEyODkx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29u
dHJvbGxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYzoKICAgICBD
b21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3QgRm9udCosIGNvbnN0IFRleHRSdW4mLCBib29sIG1h
eVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9uID0gZmFsc2UsIEhhc2hTZXQ8Y29uc3QgU2ltcGxl
Rm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDAsIGJvb2wgZm9yVGV4dEVtcGhhc2lzID0gZmFs
c2UpOwogCiAgICAgLy8gQWR2YW5jZSBhbmQgZW1pdCBnbHlwaHMgdXAgdG8gdGhlIHNwZWNpZmll
ZCBjaGFyYWN0ZXIuCi0gICAgdm9pZCBhZHZhbmNlKHVuc2lnbmVkIHRvLCBHbHlwaEJ1ZmZlciog
PSAwKTsKKyAgICB2b2lkIGFkdmFuY2UodW5zaWduZWQgdG8sIEdseXBoQnVmZmVyKiA9IDAsIGJv
b2wgYnlXaG9sZUdseXBocyA9IGZhbHNlKTsKIAogICAgIC8vIENvbXB1dGUgdGhlIGNoYXJhY3Rl
ciBvZmZzZXQgZm9yIGEgZ2l2ZW4geCBjb29yZGluYXRlLgogICAgIGludCBvZmZzZXRGb3JQb3Np
dGlvbihmbG9hdCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKQEAgLTEwNywyMSArMTA3
LDIzIEBAIHByaXZhdGU6CiAgICAgICAgIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uKCkgY29uc3Qg
eyByZXR1cm4gbV9zdHJpbmdMb2NhdGlvbjsgfQogICAgICAgICBzaXplX3Qgc3RyaW5nTGVuZ3Ro
KCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdMZW5ndGg7IH0KICAgICAgICAgQUxXQVlTX0lOTElO
RSBDRkluZGV4IGluZGV4QXQoc2l6ZV90IGkpIGNvbnN0OworICAgICAgICBDRkluZGV4IGluZGV4
QmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2luZGV4QmVnaW47IH0KICAgICAgICAgQ0ZJbmRleCBp
bmRleEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXhFbmQ7IH0KICAgICAgICAgQ0ZJbmRleCBl
bmRPZmZzZXRBdChzaXplX3QgaSkgY29uc3QgeyBBU1NFUlQoIW1faXNNb25vdG9uaWMpOyByZXR1
cm4gbV9nbHlwaEVuZE9mZnNldHNbaV07IH0KICAgICAgICAgY29uc3QgQ0dHbHlwaCogZ2x5cGhz
KCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHM7IH0KICAgICAgICAgY29uc3QgQ0dTaXplKiBhZHZh
bmNlcygpIGNvbnN0IHsgcmV0dXJuIG1fYWR2YW5jZXM7IH0KKyAgICAgICAgYm9vbCBsdHIoKSBj
b25zdCB7IHJldHVybiBtX2x0cjsgfQogICAgICAgICBib29sIGlzTW9ub3RvbmljKCkgY29uc3Qg
eyByZXR1cm4gbV9pc01vbm90b25pYzsgfQogICAgICAgICB2b2lkIHNldElzTm9uTW9ub3Rvbmlj
KCk7CiAKICAgICBwcml2YXRlOgogI2lmIFVTRShDT1JFX1RFWFQpCiAgICAgICAgIENvbXBsZXhU
ZXh0UnVuKENUUnVuUmVmLCBjb25zdCBTaW1wbGVGb250RGF0YSosIGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbiwgc2l6ZV90IHN0cmluZ0xlbmd0aCwgQ0ZS
YW5nZSBydW5SYW5nZSk7Ci0gICAgICAgIHZvaWQgY3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUNv
cmVUZXh0KGJvb2wgbHRyKTsKKyAgICAgICAgdm9pZCBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRh
Q29yZVRleHQoKTsKICNlbmRpZgogI2lmIFVTRShBVFNVSSkKICAgICAgICAgQ29tcGxleFRleHRS
dW4oQVRTVVRleHRMYXlvdXQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29uc3QgVUNoYXIqIGNo
YXJhY3RlcnMsIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBzaXplX3Qgc3RyaW5nTGVuZ3RoLCBi
b29sIGx0ciwgYm9vbCBkaXJlY3Rpb25hbE92ZXJyaWRlKTsKLSAgICAgICAgdm9pZCBjcmVhdGVU
ZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoYm9vbCBsdHIpOworICAgICAgICB2b2lkIGNyZWF0ZVRl
eHRSdW5Gcm9tRm9udERhdGFBVFNVSSgpOwogI2VuZGlmCiAgICAgICAgIENvbXBsZXhUZXh0UnVu
KGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVk
IHN0cmluZ0xvY2F0aW9uLCBzaXplX3Qgc3RyaW5nTGVuZ3RoLCBib29sIGx0cik7CiAKQEAgLTE0
MSwxMiArMTQzLDE0IEBAIHByaXZhdGU6CiAjaWYgVVNFKEFUU1VJKQogICAgICAgICBWZWN0b3I8
Q0ZJbmRleCwgNjQ+IG1fYXRzdWlJbmRpY2VzOwogI2VuZGlmCisgICAgICAgIENGSW5kZXggbV9p
bmRleEJlZ2luOwogICAgICAgICBDRkluZGV4IG1faW5kZXhFbmQ7CiAgICAgICAgIFZlY3RvcjxD
RkluZGV4LCA2ND4gbV9nbHlwaEVuZE9mZnNldHM7CiAgICAgICAgIFZlY3RvcjxDR0dseXBoLCA2
ND4gbV9nbHlwaHNWZWN0b3I7CiAgICAgICAgIGNvbnN0IENHR2x5cGgqIG1fZ2x5cGhzOwogICAg
ICAgICBWZWN0b3I8Q0dTaXplLCA2ND4gbV9hZHZhbmNlc1ZlY3RvcjsKICAgICAgICAgY29uc3Qg
Q0dTaXplKiBtX2FkdmFuY2VzOworICAgICAgICBib29sIG1fbHRyOwogI2lmIFVTRShBVFNVSSkK
ICAgICAgICAgYm9vbCBtX2RpcmVjdGlvbmFsT3ZlcnJpZGU7CiAjZW5kaWYKQEAgLTE2Miw4ICsx
NjYsMTMgQEAgcHJpdmF0ZToKICAgICB2b2lkIGNvbGxlY3RDb21wbGV4VGV4dFJ1bnNGb3JDaGFy
YWN0ZXJzQ29yZVRleHQoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0
cmluZ0xvY2F0aW9uLCBjb25zdCBTaW1wbGVGb250RGF0YSopOwogICAgIHZvaWQgYWRqdXN0R2x5
cGhzQW5kQWR2YW5jZXMoKTsKIAorICAgIHVuc2lnbmVkIGluZGV4T2ZDdXJyZW50UnVuKHVuc2ln
bmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICB1bnNpZ25lZCBpbmNyZW1lbnRDdXJyZW50UnVuKHVu
c2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiBtX3J1bklu
ZGljZXM7CisKICAgICBjb25zdCBGb250JiBtX2ZvbnQ7CiAgICAgY29uc3QgVGV4dFJ1biYgbV9y
dW47CisgICAgYm9vbCBtX2x0ck9ubHk7CiAgICAgYm9vbCBtX21heVVzZU5hdHVyYWxXcml0aW5n
RGlyZWN0aW9uOwogICAgIGJvb2wgbV9mb3JUZXh0RW1waGFzaXM7CiAKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJBVFNVSS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0Nv
bXBsZXhUZXh0Q29udHJvbGxlckFUU1VJLmNwcAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckFUU1VJ
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ3LDggKzE0NywxMCBAQCBDb21wbGV4VGV4dENvbnRy
b2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDCiAgICAgLCBtX2NoYXJhY3RlcnMoY2hhcmFjdGVycykK
ICAgICAsIG1fc3RyaW5nTG9jYXRpb24oc3RyaW5nTG9jYXRpb24pCiAgICAgLCBtX3N0cmluZ0xl
bmd0aChzdHJpbmdMZW5ndGgpCisgICAgLCBtX2luZGV4QmVnaW4oMCkKICAgICAsIG1faW5kZXhF
bmQoc3RyaW5nTGVuZ3RoKQogICAgICwgbV9kaXJlY3Rpb25hbE92ZXJyaWRlKGRpcmVjdGlvbmFs
T3ZlcnJpZGUpCisgICAgLCBtX2x0cihsdHIpCiAgICAgLCBtX2lzTW9ub3RvbmljKHRydWUpCiB7
CiAgICAgT1NTdGF0dXMgc3RhdHVzOwpAQCAtMjIyLDcgKzIyNCw3IEBAIENvbXBsZXhUZXh0Q29u
dHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMKICAgICBzdGF0dXMgPSBBVFNVRGlzcG9zZVRleHRM
YXlvdXQoYXRzdVRleHRMYXlvdXQpOwogfQogCi12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6
Q29tcGxleFRleHRSdW46OmNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSShib29sIGx0cikK
K3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4dFJ1
bkZyb21Gb250RGF0YUFUU1VJKCkKIHsKICAgICBtX2F0c3VpSW5kaWNlcy5yZXNlcnZlQ2FwYWNp
dHkobV9zdHJpbmdMZW5ndGgpOwogICAgIHVuc2lnbmVkIHIgPSAwOwpAQCAtMjM3LDcgKzIzOSw3
IEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFIKICAgICAgICAgICAg
IHIrKzsKICAgICB9CiAgICAgbV9nbHlwaENvdW50ID0gbV9hdHN1aUluZGljZXMuc2l6ZSgpOwot
ICAgIGlmICghbHRyKSB7CisgICAgaWYgKCFtX2x0cikgewogICAgICAgICBmb3IgKHVuc2lnbmVk
IHIgPSAwLCBlbmQgPSBtX2dseXBoQ291bnQgLSAxOyByIDwgbV9nbHlwaENvdW50IC8gMjsgKyty
LCAtLWVuZCkKICAgICAgICAgICAgIHN0ZDo6c3dhcChtX2F0c3VpSW5kaWNlc1tyXSwgbV9hdHN1
aUluZGljZXNbZW5kXSk7CiAgICAgfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0Lm1tCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xs
ZXJDb3JlVGV4dC5tbQkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0Lm1tCSh3b3JraW5n
IGNvcHkpCkBAIC0xMDcsNyArMTA3LDkgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4
VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBtX3N0cmlu
Z0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9zdHJpbmdMZW5ndGgoc3RyaW5nTGVu
Z3RoKQorICAgICwgbV9pbmRleEJlZ2luKHJ1blJhbmdlLmxvY2F0aW9uKQogICAgICwgbV9pbmRl
eEVuZChydW5SYW5nZS5sb2NhdGlvbiArIHJ1blJhbmdlLmxlbmd0aCkKKyAgICAsIG1fbHRyKCEo
Q1RSdW5HZXRTdGF0dXMoY3RSdW4pICYga0NUUnVuU3RhdHVzUmlnaHRUb0xlZnQpKQogICAgICwg
bV9pc01vbm90b25pYyh0cnVlKQogewogICAgIG1fZ2x5cGhDb3VudCA9IENUUnVuR2V0R2x5cGhD
b3VudChjdFJ1bik7CkBAIC0xMzUsNyArMTM3LDcgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpD
b21wbGV4VGV4dFJ1bjo6QwogCiAvLyBNaXNzaW5nIGdseXBocyBydW4gY29uc3RydWN0b3IuIENv
cmUgVGV4dCB3aWxsIG5vdCBnZW5lcmF0ZSBhIHJ1biBvZiBtaXNzaW5nIGdseXBocywgaW5zdGVh
ZCBmYWxsaW5nIGJhY2sgb24KIC8vIGdseXBocyBmcm9tIExhc3RSZXNvcnQuIFdlIHdhbnQgdG8g
dXNlIHRoZSBwcmltYXJ5IGZvbnQncyBtaXNzaW5nIGdseXBoIGluIG9yZGVyIHRvIG1hdGNoIHRo
ZSBmYXN0IHRleHQgY29kZSBwYXRoLgotdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBs
ZXhUZXh0UnVuOjpjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQoYm9vbCBsdHIpCit2
b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNyZWF0ZVRleHRSdW5G
cm9tRm9udERhdGFDb3JlVGV4dCgpCiB7CiAgICAgbV9jb3JlVGV4dEluZGljZXNWZWN0b3IucmVz
ZXJ2ZUluaXRpYWxDYXBhY2l0eShtX3N0cmluZ0xlbmd0aCk7CiAgICAgdW5zaWduZWQgciA9IDA7
CkBAIC0xNTAsNyArMTUyLDcgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhU
ZXh0UgogICAgICAgICAgICAgcisrOwogICAgIH0KICAgICBtX2dseXBoQ291bnQgPSBtX2NvcmVU
ZXh0SW5kaWNlc1ZlY3Rvci5zaXplKCk7Ci0gICAgaWYgKCFsdHIpIHsKKyAgICBpZiAoIW1fbHRy
KSB7CiAgICAgICAgIGZvciAodW5zaWduZWQgciA9IDAsIGVuZCA9IG1fZ2x5cGhDb3VudCAtIDE7
IHIgPCBtX2dseXBoQ291bnQgLyAyOyArK3IsIC0tZW5kKQogICAgICAgICAgICAgc3RkOjpzd2Fw
KG1fY29yZVRleHRJbmRpY2VzVmVjdG9yW3JdLCBtX2NvcmVUZXh0SW5kaWNlc1ZlY3RvcltlbmRd
KTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2
aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4LDcgQEAgc3RydWN0IEJpZGlSdW47CiBzdHJ1Y3Qg
UGFpbnRJbmZvOwogY2xhc3MgTGluZUluZm87CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOworY2xhc3Mg
VGV4dExheW91dDsKIAogdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBSdW4+IGNsYXNz
IEJpZGlSZXNvbHZlcjsKIHRlbXBsYXRlIDxjbGFzcyBSdW4+IGNsYXNzIEJpZGlSdW5MaXN0OwpA
QCAtNzAzLDYgKzcwNCw3IEBAIHByaXZhdGU6CiAKICAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0
aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgog
ICAgIHR5cGVkZWYgc3RkOjpwYWlyPFJlbmRlclRleHQqLCBMYXp5TGluZUJyZWFrSXRlcmF0b3I+
IExpbmVCcmVha0l0ZXJhdG9ySW5mbzsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxSZW5kZXJUZXh0
KiwgT3duUHRyPFRleHRMYXlvdXQ+ID4gVGV4dExheW91dEluZm87CiAgICAgY2xhc3MgTGluZUJy
ZWFrZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2sqIGJs
b2NrKQpAQCAtNzExLDcgKzcxMyw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICByZXNldCgpOwog
ICAgICAgICB9CiAKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgbmV4dExpbmVCcmVhayhJbmxpbmVC
aWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIExpbmVCcmVha0l0ZXJhdG9ySW5mbyYsIEZsb2F0aW5n
T2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIElubGluZUl0ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5s
aW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBMaW5lQnJlYWtJdGVyYXRvckluZm8mLCBUZXh0
TGF5b3V0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1
bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CiAKICAgICAgICAgYm9vbCBsaW5l
V2FzSHlwaGVuYXRlZCgpIHsgcmV0dXJuIG1faHlwaGVuYXRlZDsgfQogICAgICAgICBjb25zdCBW
ZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKCkgeyByZXR1cm4gbV9wb3NpdGlv
bmVkT2JqZWN0czsgfQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2Nr
TGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDExMjg5MSkKKysrIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xMjI3LDYgKzEyMjcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRz
SW5SCiAgICAgSW5saW5lSXRlcmF0b3IgZW5kID0gcmVzb2x2ZXIucG9zaXRpb24oKTsKICAgICBi
b29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOwogICAgIExp
bmVCcmVha0l0ZXJhdG9ySW5mbyBsaW5lQnJlYWtJdGVyYXRvckluZm87CisgICAgVGV4dExheW91
dEluZm8gdGV4dExheW91dEluZm87CiAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlIHZlcnRpY2Fs
UG9zaXRpb25DYWNoZTsKIAogICAgIExpbmVCcmVha2VyIGxpbmVCcmVha2VyKHRoaXMpOwpAQCAt
MTI0OSw3ICsxMjUwLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0lu
UgogICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciBvbGRFbmQgPSBlbmQ7CiAgICAgICAgIGJv
b2wgaXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSgpOwogICAgICAgICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSA9IChtX2Zsb2F0aW5nT2JqZWN0cyAmJiAhbV9mbG9hdGluZ09iamVjdHMtPnNl
dCgpLmlzRW1wdHkoKSkgPyBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpIDogMDsKLSAg
ICAgICAgZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZlciwgbGF5b3V0U3Rh
dGUubGluZUluZm8oKSwgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIGVuZCA9IGxpbmVC
cmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIGxp
bmVCcmVha0l0ZXJhdG9ySW5mbywgdGV4dExheW91dEluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKICAgICAgICAgaWYgKHJlc29sdmVy
LnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4n
dCBiZSBjcmVhdGluZyBhbnkgcnVucyBpbiBuZXh0TGluZUJyZWFrIHRvIGJlZ2luIHdpdGghCiAg
ICAgICAgICAgICAvLyBPbmNlIEJpZGlSdW5MaXN0IGlzIHNlcGFyYXRlZCBmcm9tIEJpZGlSZXNv
bHZlciB0aGlzIHdpbGwgbm90IGJlIG5lZWRlZC4KQEAgLTE5MzgsMTEgKzE5MzksMTQgQEAgc3Rh
dGljIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YQogICAgIHJldHVybiBmYWxzZTsK
IH0KIAotc3RhdGljIGlubGluZSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4dCwgdW5z
aWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250JiBmb250LCBmbG9hdCB4UG9zLCBi
b29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpCitzdGF0aWMgaW5saW5l
IGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25l
ZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBi
b29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgVGV4dExheW91dCogbGF5b3V0ID0gMCkKIHsKICAgICBp
ZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0gdGV4dC0+dGV4dExlbmd0aCgpKSB8
fCB0ZXh0LT5zdHlsZSgpLT5oYXNUZXh0Q29tYmluZSgpKQogICAgICAgICByZXR1cm4gdGV4dC0+
d2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9zKTsKIAorICAgIGlmIChsYXlvdXQpCisgICAgICAg
IHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4pOworCiAgICAgVGV4dFJ1biBy
dW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LT5jaGFy
YWN0ZXJzKCkgKyBmcm9tLCBsZW4sIHRleHQtPnN0eWxlKCkpOwogICAgIHJ1bi5zZXRDaGFyYWN0
ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSAtIGZyb20pOwogICAgIEFTU0VSVChydW4uY2hh
cmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CkBAIC0yMTA0LDcgKzIxMDgsNyBAQCB2
b2lkIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6cmVzZXQoKQogfQogCiBJbmxpbmVJdGVyYXRv
ciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6Om5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29s
dmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLAotICAgIExpbmVCcmVha0l0ZXJhdG9y
SW5mbyYgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJv
bVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCisgICAg
TGluZUJyZWFrSXRlcmF0b3JJbmZvJiBsaW5lQnJlYWtJdGVyYXRvckluZm8sIFRleHRMYXlvdXRJ
bmZvJiB0ZXh0TGF5b3V0SW5mbywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKQogewogICAgIHJlc2V0
KCk7CiAKQEAgLTIzNDMsNiArMjM0NywxMiBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6
TGluZUJyZWFrZXI6CiAgICAgICAgICAgICAgICAgQVNTRVJUKGN1cnJlbnQubV9wb3MgPT0gdC0+
dGV4dExlbmd0aCgpKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHRleHRMYXlv
dXRJbmZvLmZpcnN0ICE9IHQpIHsKKyAgICAgICAgICAgICAgICB0ZXh0TGF5b3V0SW5mby5maXJz
dCA9IHQ7CisgICAgICAgICAgICAgICAgdGV4dExheW91dEluZm8uc2Vjb25kID0gZi5jcmVhdGVM
YXlvdXQodCwgd2lkdGguY3VycmVudFdpZHRoKCksIGNvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gdGV4dExheW91
dEluZm8uc2Vjb25kLmdldCgpOworCiAgICAgICAgICAgICBmb3IgKDsgY3VycmVudC5tX3BvcyA8
IHQtPnRleHRMZW5ndGgoKTsgY3VycmVudC5mYXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7CiAg
ICAgICAgICAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgPSBjdXJyZW50Q2hh
cmFjdGVySXNTcGFjZTsKICAgICAgICAgICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNX
UyA9IGN1cnJlbnRDaGFyYWN0ZXJJc1dTOwpAQCAtMjM2NCw3ICsyMzc0LDcgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgICAgIGlmICgoYnJl
YWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhaykgewogICAgICAgICAgICAgICAg
ICAgICB3cmFwVyArPSBjaGFyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWlkV29y
ZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID0gVTE2X0lTX0xFQUQoYykgJiYgY3VycmVudC5t
X3BvcyArIDEgPCB0LT50ZXh0TGVuZ3RoKCkgJiYgVTE2X0lTX1RSQUlMKHQtPmNoYXJhY3RlcnMo
KVtjdXJyZW50Lm1fcG9zICsgMV0pOwotICAgICAgICAgICAgICAgICAgICBjaGFyV2lkdGggPSB0
ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQ
YWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBp
dGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpOworICAgICAgICAgICAgICAgICAgICBjaGFyV2lkdGgg
PSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dh
dGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhl
ZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpOwogICAgICAgICAgICAgICAg
ICAgICBtaWRXb3JkQnJlYWsgPSB3aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFy
V2lkdGggPiB3aWR0aC5hdmFpbGFibGVXaWR0aCgpOwogICAgICAgICAgICAgICAgIH0KIApAQCAt
MjM5NSw5ICsyNDA1LDkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2Vy
OgogCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUbXBXOwogICAgICAgICAg
ICAgICAgICAgICBpZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBjdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0gdGV4dFdp
ZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGYsIHdpZHRo
LmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgLSB3b3Jk
VHJhaWxpbmdTcGFjZVdpZHRoICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7CisgICAgICAgICAgICAg
ICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJl
bnQubV9wb3MgKyAxIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhl
ZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpIC0gd29yZFRyYWlsaW5nU3Bh
Y2VXaWR0aCArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0LCBs
YXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0
aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgKyBsYXN0U3BhY2VXb3JkU3Bh
Y2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRo
KHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVu
dFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSAr
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgICAgICAgICB3aWR0aC5hZGRVbmNv
bW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBXKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFh
cHBsaWVkU3RhcnRXaWR0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGguYWRkVW5j
b21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgoY3VycmVudC5tX29iaiwgdHJ1ZSwgZmFs
c2UpKTsKQEAgLTI0MTQsNyArMjQyNCw3IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpM
aW5lQnJlYWtlcjoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGNhbmRpZGF0ZSB3aWR0
aCBmb3IgdGhpcyBsaW5lLgogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9v
V2lkZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoLmZpdHNPbkxp
bmUoKSAmJiBjdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBjdXJyZW50U3R5bGUtPmJyZWFrT25seUFm
dGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgMSwg
Ziwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNl
KSArIChhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3Bv
cywgMSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0
ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAw
KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBi
aWcgZXZlbiB3aXRob3V0IHRoZSBleHRyYSBzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuIElmIGl0IGlzIG5vdCwgZG8gbm90aGluZy4K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0
cmEgd2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywKQEAgLTI1NDAsNyArMjU1MCw3IEBAIElubGlu
ZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgIH0KIAogICAg
ICAgICAgICAgLy8gSU1QT1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0g
ICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVG1wVyA9IGlnbm9yaW5nU3BhY2VzID8gMCA6IHRl
eHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRo
LmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgKyBsYXN0
U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUbXBXID0gaWdu
b3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAt
IGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFw
c2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAg
ICAgICAgd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVG1wVyArIGlubGluZUxv
Z2ljYWxXaWR0aChjdXJyZW50Lm1fb2JqLCAhYXBwbGllZFN0YXJ0V2lkdGgsIGluY2x1ZGVFbmRX
aWR0aCkpOwogICAgICAgICAgICAgaW5jbHVkZUVuZFdpZHRoID0gZmFsc2U7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135369</attachid>
            <date>2012-04-03 11:15:08 -0700</date>
            <delta_ts>2012-05-10 11:22:17 -0700</delta_ts>
            <desc>Fix EWS failures, again.</desc>
            <filename>TextLayout-nullptr.txt</filename>
            <type>text/plain</type>
            <size>31176</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjk2OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcxIEBACisyMDEyLTA0LTAyICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBidWxrIG9mIHRoaXMgY2hhbmdlIGlzIG1vZGlm
eWluZyBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UsIHdoaWNoIHByZXZpb3VzbHkgcmVx
dWlyZWQgdGhlIHRleHQgb2Zmc2V0CisgICAgICAgIHRvIGJlIHN0cmljdGx5IGluY3JlYXNpbmcg
YW5kIGFzc3VtZWQgdW5pZGlyZWN0aW9uYWwgdGV4dDsgbm93IGl0IHN1cHBvcnRzIHJhbmRvbSBz
ZWVraW5nIGluIGEgbmFpdmUgZmFzaGlvbgorICAgICAgICAoYnkgcmVzdGFydGluZyB0byB0aGUg
YmVnaW5uaW5nKSBhbmQgdHJhdmVyc2VzIGdseXBocyBpbiBsb2dpY2FsIG9yZGVyLiBJbiB0aGUg
bGF0dGVyIGNhc2UsIHRoZSBwcmVzZW5jZSBvZiBhbnkKKyAgICAgICAgbm9uLUxUUiBydW5zIHRy
aWdnZXJzIHRoZSBwb3B1bGF0aW9uIG9mIGEgbWFwcGluZyBmcm9tIGxvZ2ljYWwgdG8gdmlzdWFs
IHJ1biBpbmRpY2VzLiBGaW5hbGx5LCBhIG5ldyBmbGFnIGhhcworICAgICAgICBiZWVuIGFkZGVk
IHdoaWNoIGluaGliaXRzIGdseXBoIGFkdmFuY2VzIGZyb20gYmVpbmcgc3BsaXQgYWNyb3NzIGxp
Z2F0dXJlcyAodGh1cyBjYXVzaW5nIHNwdXJpb3VzIGxpbmUgYnJlYWtzKS4KKworICAgICAgICBB
IENvbXBsZXhUZXh0Q29udHJvbGxlciBhbmQgaXRzIGFzc29jaWF0ZWQgVGV4dFJ1biBhbmQgRm9u
dCBhcmUgZW5jYXBzdWxhdGVkIGluIGEgVGV4dExheW91dCBvYmplY3QsIHdoaWNoIGlzCisgICAg
ICAgIGluc3RhbnRpYXRlZCBhcyBhbiBvcGFxdWUgb2JqZWN0IHZpYSBmdW5jdGlvbnMgdGhhdCBh
cmUgbm8tb3BzIHVubGVzcyBidWlsZGluZyBmb3IgTWFjLiBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rp
b24KKyAgICAgICAgKGlzTmVlZGVkKSBjaGVja3MgdG8gc2VlIHdoZXRoZXIgYSBUZXh0UnVuIGlz
IGNvbXBsZXgsIGluIG9yZGVyIHRvIGF2b2lkIG5lZWRsZXNzIGluc3RhbnRpYXRpb24uIEFsdGhv
dWdoIHRoZQorICAgICAgICBBVFNVSSBDb21wbGV4VGV4dENvbnRyb2xsZXIgaW1wbGVtZW50YXRp
b24gaGFzIGJlZW4gdXBkYXRlZCB0byBhY2NvdW50IGZvciBuZXdseS1hZGRlZCBtZW1iZXIgdmFy
aWFibGVzLCB0aGlzCisgICAgICAgIG5ldyBwYXRoIGlzIG9ubHkgZW5hYmxlZCBmb3IgQ29yZSBU
ZXh0LgorCisgICAgICAgIE5vIGJlaGF2aW9yYWwgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgZHVlIHRv
IHRoaXMgY2hhbmdlLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9Gb250LmNwcDoKKyAgICAgICAgKFdURik6IERlZmluZSBkZWxldGVPd25lZFB0ciBmb3Ig
VGV4dExheW91dCBhcyBjYWxsaW5nIHRocm91Z2ggZGVzdHJveUxheW91dDsgcmVseWluZyBvbiBv
cGVyYXRvciBkZWxldGUgaXMgbm90IHdvcmthYmxlIGFzIHRoZSBjbGFzcyBkb2VzIG5vdCBleGlz
dCBvbiBhbGwgcGxhdGZvcm1zLgorICAgICAgICAoV1RGOjpXZWJDb3JlOjpUZXh0TGF5b3V0KToK
KyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgbm8tb3AgVGV4dExheW91dCB3cmFwcGVycyBm
b3Igbm9uLU1hYyBwbGF0Zm9ybXMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlv
dXQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVzdHJveUxheW91dCk6CisgICAgICAgIChX
ZWJDb3JlOjpGb250Ojp3aWR0aCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5o
OgorICAgICAgICAoV2ViQ29yZSk6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgUmVuZGVy
VGV4dCBhbmQgVGV4dExheW91dC4KKyAgICAgICAgKEZvbnQpOiBBZGQgZnVuY3Rpb25zIGZvciBk
ZWFsaW5nIHdpdGggcG9pbnRlciB0byBUZXh0TGF5b3V0IGltcGxlbWVudGF0aW9uLgorICAgICAg
ICAoV1RGKTogRGVjbGFyZSBkZWxldGVPd25lZFB0ciBmb3IgVGV4dExheW91dC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcDoKKyAgICAg
ICAgKFRleHRMYXlvdXQpOiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRv
IGEgQ29tcGxleFRleHRDb250cm9sbGVyIGZvciBhIHBhcnRpY3VsYXIgVGV4dFJ1bi4KKyAgICAg
ICAgKFdlYkNvcmU6OlRleHRMYXlvdXQ6OmlzTmVlZGVkKTogVXNlZCBieSB3cmFwcGVyIHRvIGF2
b2lkIGluc3RhbnRpYXRpb24gd2hlbiBjb21wbGV4IGxheW91dCBpcyBub3QgcmVxdWlyZWQuCisg
ICAgICAgIChXZWJDb3JlOjpUZXh0TGF5b3V0OjpUZXh0TGF5b3V0KToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRMYXlvdXQ6On5UZXh0TGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRMYXlv
dXQ6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgcmVhbCBUZXh0TGF5b3V0
IHdyYXBwZXJzIGZvciBNYWMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlvdXQp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVzdHJveUxheW91dCk6CisgICAgICAgIChXZWJD
b3JlOjpGb250Ojp3aWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xs
ZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcik6IEluaXRpYWxpemUgbV9sdHJPbmx5LgorICAgICAg
ICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29tcGxl
eFRleHRSdW4pOiBJbml0aWFsaXplIG1faW5kZXhCZWdpbiBhbmQgbV9sdHIuCisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmluZGV4T2ZDdXJyZW50UnVuKTogUmV0dXJu
ICh2aXN1YWwpIG1fY29tcGxleFRleHRSdW5zIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gKGxvZ2lj
YWwpIG1fY3VycmVudFJ1biwgbGF6aWx5IGNvbnN0cnVjdGluZyBtX3J1bkluZGljZXMgaWYgbmVl
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppbmNyZW1lbnRD
dXJyZW50UnVuKTogUmV0dXJuIG5leHQgbV9jb21wbGV4VGV4dFJ1bnMgaW5kZXggaW4gbG9naWNh
bCBvcmRlci4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5j
ZSk6IEFsbG93IHJlc3RhcnRpbmcsIHN1cHBvcnQgZm9yIGJpZGkgcmVvcmRlcmluZywgYW5kIG9w
dGlvbiB0byBtZWFzdXJlIG9ubHkgd2hvbGUgZ2x5cGhzIHJhdGhlciB0aGFuIGRpdmlkaW5nIGFk
dmFuY2VzLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphZGp1c3RH
bHlwaHNBbmRBZHZhbmNlcyk6IENsZWFyIG1fbHRyT25seSBvbiBkZXRlY3RpbmcgYSBSVEwgcnVu
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIu
aDoKKyAgICAgICAgKENvbXBsZXhUZXh0Q29udHJvbGxlcik6IEFkZCBtX2x0ck9ubHkgaW5kaWNh
dGluZyBubyBiaWRpIHJlb3JkZXJpbmcsIGFuZCBtX3J1bkluZGljZXMgbWFwcGluZyBmcm9tIHJ1
bnMgKGxvZ2ljYWwgb3JkZXIpIHRvIG1fY29tcGxleFRleHRSdW5zICh2aXN1YWwgb3JkZXIpLgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6
aW5kZXhCZWdpbik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNv
bXBsZXhUZXh0UnVuOjpsdHIpOgorICAgICAgICAoQ29tcGxleFRleHRSdW4pOiBBZGQgbV9pbmRl
eEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxl
eFRleHRDb250cm9sbGVyQVRTVUkuY3BwOiBJbml0aWFsaXplIG1faW5kZXhCZWdpbiBhbmQgbV9s
dHIsIGV2ZW4gdGhvdWdoIFRleHRMYXlvdXQgaXMgbm90IGVuYWJsZWQgZm9yIEFUU1VJLgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29t
cGxleFRleHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpD
b21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUFUU1VJKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQubW06
IEluaXRpYWxpemUgbV9pbmRleEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKFdlYkNvcmU6OkNv
bXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkNvbXBsZXhUZXh0UnVuKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNy
ZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmg6IEFkZCBUZXh0TGF5b3V0SW5mbywgbWFwcGluZyBmcm9tIFJlbmRlclRleHQg
dG8gKHBvc3NpYmx5IG51bGwpIFRleHRMYXlvdXQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKFJlbmRlckJsb2NrKToKKyAgICAgICAgKExpbmVCcmVha2VyKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZSk6IEFsbG93IFRleHRMYXlvdXQgaW5z
dGFuY2UgdG8gYmUgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBuZXh0TGluZUJyZWFrLgorICAgICAg
ICAoV2ViQ29yZTo6dGV4dFdpZHRoKTogVXNlIFRleHRMYXlvdXQgd2hlbiBzdXBwbGllZCBmb3Ig
bWVhc3VyaW5nLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpu
ZXh0TGluZUJyZWFrKTogCisKIDIwMTItMDQtMDIgIFRvbnkgQ2hhbmcgIDx0b255QGNocm9taXVt
Lm9yZz4KIAogICAgICAgICBhZGQgY3NzIHBhcnNpbmcgb2YgLXdlYmtpdC1mbGV4CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAkocmV2aXNpb24gMTEyODkx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMxLDYgKzMxLDkgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNl
bmRpZgogI2luY2x1ZGUgIkludFBvaW50LmgiCisjaWYgIVBMQVRGT1JNKE1BQykKKyNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgorI2VuZGlmCiAjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKICNp
bmNsdWRlICJUZXh0UnVuLmgiCiAjaW5jbHVkZSAiV2lkdGhJdGVyYXRvci5oIgpAQCAtNDIsNiAr
NDUsMTUgQEAKIHVzaW5nIG5hbWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsK
IAorbmFtZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlIDw+IHZvaWQgZGVsZXRlT3duZWRQdHI8V2Vi
Q29yZTo6VGV4dExheW91dD4oV2ViQ29yZTo6VGV4dExheW91dCogcHRyKQoreworICAgIFdlYkNv
cmU6OkZvbnQ6OmRlc3Ryb3lMYXlvdXQocHRyKTsKK30KKworfQorCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIGNvbnN0IHVpbnQ4X3QgRm9udDo6c19yb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsy
NTZdID0gewpAQCAtMjA1LDYgKzIxNywyNSBAQCBmbG9hdCBGb250Ojp3aWR0aChjb25zdCBUZXh0
UnVuJiBydW4sIGluCiAgICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChydW4pOwog
fQogCisjaWYgIVBMQVRGT1JNKE1BQykKKworUGFzc093blB0cjxUZXh0TGF5b3V0PiBGb250Ojpj
cmVhdGVMYXlvdXQoUmVuZGVyVGV4dCosIGZsb2F0IHhQb3MsIGJvb2wgY29sbGFwc2VXaGl0ZVNw
YWNlKSBjb25zdAoreworICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIEZvbnQ6OmRlc3Ry
b3lMYXlvdXQoVGV4dExheW91dCopCit7Cit9CisKK2Zsb2F0IEZvbnQ6OndpZHRoKFRleHRMYXlv
dXQmLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKKwogRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlv
blJlY3RGb3JUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQs
IGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewogICAgIHRvID0gKHRvID09IC0xID8g
cnVuLmxlbmd0aCgpIDogdG8pOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvRm9udC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0ZvbnQuaAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udC5oCSh3b3JraW5nIGNvcHkpCkBAIC01MCw2ICs1MCw4IEBAIGNsYXNzIEZvbnRT
ZWxlY3RvcjsKIGNsYXNzIEdseXBoQnVmZmVyOwogY2xhc3MgR2x5cGhQYWdlVHJlZU5vZGU7CiBj
bGFzcyBHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBSZW5kZXJUZXh0OworY2xhc3MgVGV4dExheW91
dDsKIGNsYXNzIFRleHRSdW47CiAKIHN0cnVjdCBHbHlwaERhdGE7CkBAIC05OSw2ICsxMDEsMTAg
QEAgcHVibGljOgogICAgIGZsb2F0IHdpZHRoKGNvbnN0IFRleHRSdW4mLCBIYXNoU2V0PGNvbnN0
IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMgPSAwLCBHbHlwaE92ZXJmbG93KiA9IDAp
IGNvbnN0OwogICAgIGZsb2F0IHdpZHRoKGNvbnN0IFRleHRSdW4mLCBpbnQmIGNoYXJzQ29uc3Vt
ZWQsIFN0cmluZyYgZ2x5cGhOYW1lKSBjb25zdDsKIAorICAgIFBhc3NPd25QdHI8VGV4dExheW91
dD4gY3JlYXRlTGF5b3V0KFJlbmRlclRleHQqLCBmbG9hdCB4UG9zLCBib29sIGNvbGxhcHNlV2hp
dGVTcGFjZSkgY29uc3Q7CisgICAgc3RhdGljIHZvaWQgZGVzdHJveUxheW91dChUZXh0TGF5b3V0
Kik7CisgICAgc3RhdGljIGZsb2F0IHdpZHRoKFRleHRMYXlvdXQmLCB1bnNpZ25lZCBmcm9tLCB1
bnNpZ25lZCB0byk7CisKICAgICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb24oY29uc3QgVGV4dFJ1biYs
IGZsb2F0IHBvc2l0aW9uLCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdDsKICAgICBG
bG9hdFJlY3Qgc2VsZWN0aW9uUmVjdEZvclRleHQoY29uc3QgVGV4dFJ1biYsIGNvbnN0IEZsb2F0
UG9pbnQmLCBpbnQgaCwgaW50IGZyb20gPSAwLCBpbnQgdG8gPSAtMSkgY29uc3Q7CiAKQEAgLTI5
MSw0ICsyOTcsMTAgQEAgaW5saW5lIEZvbnRTZWxlY3RvciogRm9udDo6Zm9udFNlbGVjdG9yKAog
CiB9CiAKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZSA8PiB2b2lkIGRlbGV0ZU93bmVkUHRy
PFdlYkNvcmU6OlRleHRMYXlvdXQ+KFdlYkNvcmU6OlRleHRMYXlvdXQqIHB0cik7CisKK30KKwog
I2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxl
eFRleHRDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAkocmV2aXNpb24gMTEyODkx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29u
dHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDggQEAKIAogI2luY2x1ZGUg
IkZsb2F0U2l6ZS5oIgogI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5o
IgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlICJUZXh0QnJlYWtJdGVyYXRvci5o
IgogI2luY2x1ZGUgIlRleHRSdW4uaCIKICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0Fw
cGxpY2F0aW9uU2VydmljZXMuaD4KQEAgLTQyLDYgKzQ0LDczIEBAIHVzaW5nIG5hbWVzcGFjZSBz
dGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgVGV4dExheW91dCB7CitwdWJsaWM6
CisgICAgc3RhdGljIGJvb2wgaXNOZWVkZWQoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYg
Zm9udCkKKyAgICB7CisgICAgICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVj
dFRleHRSdW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpLCB0ZXh0LT50ZXh0TGVuZ3Ro
KCksIHRleHQtPnN0eWxlKCkpOworICAgICAgICBGb250OjpDb2RlUGF0aCBjb2RlUGF0aFRvVXNl
ID0gZm9udC5jb2RlUGF0aChydW4pOworICAgICAgICByZXR1cm4gY29kZVBhdGhUb1VzZSA9PSBG
b250OjpDb21wbGV4OworICAgIH0KKworICAgIFRleHRMYXlvdXQoUmVuZGVyVGV4dCogdGV4dCwg
Y29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpCisg
ICAgICAgIDogbV9mb250KGZvbnQpCisgICAgICAgICwgbV9ydW4oMCwgMCkKKyAgICB7CisgICAg
ICAgIG1fZm9udC5zZXRXb3JkU3BhY2luZygwKTsKKworICAgICAgICBtX3J1biA9IFJlbmRlckJs
b2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIG1fZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpLCB0
ZXh0LT50ZXh0TGVuZ3RoKCksIHRleHQtPnN0eWxlKCkpOworICAgICAgICBtX3J1bi5zZXRDaGFy
YWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSk7CisgICAgICAgIEFTU0VSVChtX3J1bi5j
aGFyYWN0ZXJzTGVuZ3RoKCkgPj0gbV9ydW4ubGVuZ3RoKCkpOworCisgICAgICAgIG1fcnVuLnNl
dEFsbG93VGFicyghY29sbGFwc2VXaGl0ZVNwYWNlKTsKKyAgICAgICAgbV9ydW4uc2V0WFBvcyh4
UG9zKTsKKworICAgICAgICBtX2NvbnRyb2xsZXIgPSBuZXcgQ29tcGxleFRleHRDb250cm9sbGVy
KCZtX2ZvbnQsIG1fcnVuLCB0cnVlKTsKKyAgICB9CisgICAgflRleHRMYXlvdXQoKQorICAgIHsK
KyAgICAgICAgZGVsZXRlIG1fY29udHJvbGxlcjsKKyAgICB9CisKKyAgICBmbG9hdCB3aWR0aCh1
bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4pCisgICAgeworICAgICAgICBtX2NvbnRyb2xsZXIt
PmFkdmFuY2UoZnJvbSwgMCwgdHJ1ZSk7CisgICAgICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gbV9j
b250cm9sbGVyLT5ydW5XaWR0aFNvRmFyKCk7CisgICAgICAgIG1fY29udHJvbGxlci0+YWR2YW5j
ZShmcm9tICsgbGVuLCAwLCB0cnVlKTsKKyAgICAgICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IG1fY29u
dHJvbGxlci0+cnVuV2lkdGhTb0ZhcigpOworICAgICAgICByZXR1cm4gYWZ0ZXJXaWR0aCAtIGJl
Zm9yZVdpZHRoOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGb250IG1fZm9udDsKKyAgICBUZXh0
UnVuIG1fcnVuOworICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciogbV9jb250cm9sbGVyOworfTsK
KworUGFzc093blB0cjxUZXh0TGF5b3V0PiBGb250OjpjcmVhdGVMYXlvdXQoUmVuZGVyVGV4dCog
dGV4dCwgZmxvYXQgeFBvcywgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpIGNvbnN0Cit7CisjaWYg
VVNFKENPUkVfVEVYVCkKKyNpZiBVU0UoQVRTVUkpCisgICAgaWYgKHNob3VsZFVzZUFUU1VJQVBJ
KCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgaWYgKFRleHRMYXlvdXQ6
OmlzTmVlZGVkKHRleHQsICp0aGlzKSkKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUZXh0
TGF5b3V0KHRleHQsICp0aGlzLCB4UG9zLCBjb2xsYXBzZVdoaXRlU3BhY2UpKTsKKyNlbmRpZgor
ICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIEZvbnQ6OmRlc3Ryb3lMYXlvdXQoVGV4dExh
eW91dCogbGF5b3V0KQoreworICAgIGRlbGV0ZSBsYXlvdXQ7Cit9CisKK2Zsb2F0IEZvbnQ6Ondp
ZHRoKFRleHRMYXlvdXQmIGxheW91dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7Cisg
ICAgcmV0dXJuIGxheW91dC53aWR0aChmcm9tLCB0byk7Cit9CisKIHN0YXRpYyBpbmxpbmUgQ0dG
bG9hdCByb3VuZENHRmxvYXQoQ0dGbG9hdCBmKQogewogICAgIGlmIChzaXplb2YoQ0dGbG9hdCkg
PT0gc2l6ZW9mKGZsb2F0KSkKQEAgLTU5LDYgKzEyOCw3IEBAIHN0YXRpYyBpbmxpbmUgQ0dGbG9h
dCBjZWlsQ0dGbG9hdChDR0Zsb2EKIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRD
b250cm9sbGVyKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1biwgYm9vbCBtYXlV
c2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbiwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+
KiBmYWxsYmFja0ZvbnRzLCBib29sIGZvclRleHRFbXBoYXNpcykKICAgICA6IG1fZm9udCgqZm9u
dCkKICAgICAsIG1fcnVuKHJ1bikKKyAgICAsIG1fbHRyT25seSh0cnVlKQogICAgICwgbV9tYXlV
c2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbihtYXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbikK
ICAgICAsIG1fZm9yVGV4dEVtcGhhc2lzKGZvclRleHRFbXBoYXNpcykKICAgICAsIG1fY3VycmVu
dENoYXJhY3RlcigwKQpAQCAtMzY0LDE1ICs0MzQsMTcgQEAgQ29tcGxleFRleHRDb250cm9sbGVy
OjpDb21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAg
LCBtX3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9zdHJpbmdMZW5ndGgo
c3RyaW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKHN0cmluZ0xvY2F0aW9uKQogICAgICwg
bV9pbmRleEVuZChzdHJpbmdMZW5ndGgpCisgICAgLCBtX2x0cihsdHIpCiAgICAgLCBtX2lzTW9u
b3RvbmljKHRydWUpCiB7CiAjaWYgVVNFKENPUkVfVEVYVCkgJiYgVVNFKEFUU1VJKQotICAgIHNo
b3VsZFVzZUFUU1VJQVBJKCkgPyBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkobHRyKSA6
IGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dChsdHIpOworICAgIHNob3VsZFVzZUFU
U1VJQVBJKCkgPyBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoKSA6IGNyZWF0ZVRleHRS
dW5Gcm9tRm9udERhdGFDb3JlVGV4dCgpOwogI2VsaWYgVVNFKEFUU1VJKQotICAgIGNyZWF0ZVRl
eHRSdW5Gcm9tRm9udERhdGFBVFNVSShsdHIpOworICAgIGNyZWF0ZVRleHRSdW5Gcm9tRm9udERh
dGFBVFNVSSgpOwogI2VsaWYgVVNFKENPUkVfVEVYVCkKLSAgICBjcmVhdGVUZXh0UnVuRnJvbUZv
bnREYXRhQ29yZVRleHQobHRyKTsKKyAgICBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRl
eHQoKTsKICNlbmRpZgogfQogCkBAIC00MDAsMjUgKzQ3Miw4NiBAQCB2b2lkIENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6Q29tcGxleFRleHRSCiAgICAgfQogfQogCi12b2lkIENvbXBsZXhUZXh0Q29u
dHJvbGxlcjo6YWR2YW5jZSh1bnNpZ25lZCBvZmZzZXQsIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZl
cikKK3Vuc2lnbmVkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6aW5kZXhPZkN1cnJlbnRSdW4odW5z
aWduZWQmIGxlZnRtb3N0R2x5cGgpCit7CisgICAgbGVmdG1vc3RHbHlwaCA9IDA7CisgICAgCisg
ICAgc2l6ZV90IHJ1bkNvdW50ID0gbV9jb21wbGV4VGV4dFJ1bnMuc2l6ZSgpOworICAgIGlmICht
X2N1cnJlbnRSdW4gPj0gcnVuQ291bnQpCisgICAgICAgIHJldHVybiBydW5Db3VudDsKKworICAg
IGlmIChtX2x0ck9ubHkpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCByID0gMDsgciA8IG1fY3Vy
cmVudFJ1bjsgKytyKSB7CisgICAgICAgICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY29tcGxl
eFRleHRSdW4gPSAqbV9jb21wbGV4VGV4dFJ1bnNbcl07CisgICAgICAgICAgICBsZWZ0bW9zdEds
eXBoICs9IGNvbXBsZXhUZXh0UnVuLmdseXBoQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gbV9jdXJyZW50UnVuOworICAgIH0KKworICAgIHdoaWxlIChtX3J1bkluZGljZXMuc2l6
ZSgpIDw9IG1fY3VycmVudFJ1bikgeworICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSAwOworICAg
ICAgICBpZiAoIW1fcnVuSW5kaWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVk
IHIgPSBtX3J1bkluZGljZXMubGFzdCgpOworICAgICAgICAgICAgY29uc3QgQ29tcGxleFRleHRS
dW4mIGN1cnJlbnRUZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW3JdOworICAgICAgICAgICAg
b2Zmc2V0ID0gY3VycmVudFRleHRSdW4uc3RyaW5nTG9jYXRpb24oKSArIGN1cnJlbnRUZXh0UnVu
LmluZGV4RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVuc2lnbmVkIHEgPSAwOyBx
IDwgcnVuQ291bnQ7ICsrcSkgeworICAgICAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNv
bXBsZXhUZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW3FdOworICAgICAgICAgICAgaWYgKG9m
ZnNldCA9PSBjb21wbGV4VGV4dFJ1bi5zdHJpbmdMb2NhdGlvbigpICsgY29tcGxleFRleHRSdW4u
aW5kZXhCZWdpbigpKSB7CisgICAgICAgICAgICAgICAgbV9ydW5JbmRpY2VzLmFwcGVuZChxKTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0K
KworICAgIHVuc2lnbmVkIHIgPSBtX3J1bkluZGljZXNbbV9jdXJyZW50UnVuXTsKKyAgICBmb3Ig
KHVuc2lnbmVkIHEgPSAwOyBxIDwgcjsgKytxKSB7CisgICAgICAgIGNvbnN0IENvbXBsZXhUZXh0
UnVuJiBjb21wbGV4VGV4dFJ1biA9ICptX2NvbXBsZXhUZXh0UnVuc1txXTsKKyAgICAgICAgbGVm
dG1vc3RHbHlwaCArPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENvdW50KCk7CisgICAgfQorICAgIHJl
dHVybiByOworfQorCit1bnNpZ25lZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmluY3JlbWVudEN1
cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgpCit7CisgICAgaWYgKG1fbHRyT25seSkg
eworICAgICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY3VycmVudFRleHRSdW4gPSAqbV9jb21w
bGV4VGV4dFJ1bnNbbV9jdXJyZW50UnVuKytdOworICAgICAgICBsZWZ0bW9zdEdseXBoICs9IGN1
cnJlbnRUZXh0UnVuLmdseXBoQ291bnQoKTsKKyAgICAgICAgcmV0dXJuIG1fY3VycmVudFJ1bjsK
KyAgICB9CisKKyAgICBtX2N1cnJlbnRSdW4rKzsKKyAgICBsZWZ0bW9zdEdseXBoID0gMDsKKyAg
ICByZXR1cm4gaW5kZXhPZkN1cnJlbnRSdW4obGVmdG1vc3RHbHlwaCk7Cit9CisKK3ZvaWQgQ29t
cGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2lnbmVkIG9mZnNldCwgR2x5cGhCdWZmZXIq
IGdseXBoQnVmZmVyLCBib29sIGJ5V2hvbGVHbHlwaHMpCiB7CiAgICAgaWYgKHN0YXRpY19jYXN0
PGludD4ob2Zmc2V0KSA+IG1fZW5kKQogICAgICAgICBvZmZzZXQgPSBtX2VuZDsKIAotICAgIGlm
IChvZmZzZXQgPD0gbV9jdXJyZW50Q2hhcmFjdGVyKQotICAgICAgICByZXR1cm47CisgICAgaWYg
KG9mZnNldCA8PSBtX2N1cnJlbnRDaGFyYWN0ZXIpIHsKKyAgICAgICAgbV9ydW5XaWR0aFNvRmFy
ID0gbV9sZWFkaW5nRXhwYW5zaW9uOworICAgICAgICBtX251bUdseXBoc1NvRmFyID0gMDsKKyAg
ICAgICAgbV9jdXJyZW50UnVuID0gMDsKKyAgICAgICAgbV9nbHlwaEluQ3VycmVudFJ1biA9IDA7
CisgICAgICAgIG1fY2hhcmFjdGVySW5DdXJyZW50R2x5cGggPSAwOworICAgIH0KIAogICAgIG1f
Y3VycmVudENoYXJhY3RlciA9IG9mZnNldDsKIAogICAgIHNpemVfdCBydW5Db3VudCA9IG1fY29t
cGxleFRleHRSdW5zLnNpemUoKTsKIAotICAgIGJvb2wgbHRyID0gbV9ydW4ubHRyKCk7Ci0KLSAg
ICB1bnNpZ25lZCBrID0gbHRyID8gbV9udW1HbHlwaHNTb0ZhciA6IG1fYWRqdXN0ZWRHbHlwaHMu
c2l6ZSgpIC0gMSAtIG1fbnVtR2x5cGhzU29GYXI7CisgICAgdW5zaWduZWQgbGVmdG1vc3RHbHlw
aCA9IDA7CisgICAgdW5zaWduZWQgciA9IGluZGV4T2ZDdXJyZW50UnVuKGxlZnRtb3N0R2x5cGgp
OwogICAgIHdoaWxlIChtX2N1cnJlbnRSdW4gPCBydW5Db3VudCkgewotICAgICAgICBjb25zdCBD
b21wbGV4VGV4dFJ1biYgY29tcGxleFRleHRSdW4gPSAqbV9jb21wbGV4VGV4dFJ1bnNbbHRyID8g
bV9jdXJyZW50UnVuIDogcnVuQ291bnQgLSAxIC0gbV9jdXJyZW50UnVuXTsKKyAgICAgICAgY29u
c3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhUZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW3Jd
OworICAgICAgICBib29sIGx0ciA9IGNvbXBsZXhUZXh0UnVuLmx0cigpOwogICAgICAgICBzaXpl
X3QgZ2x5cGhDb3VudCA9IGNvbXBsZXhUZXh0UnVuLmdseXBoQ291bnQoKTsKICAgICAgICAgdW5z
aWduZWQgZyA9IGx0ciA/IG1fZ2x5cGhJbkN1cnJlbnRSdW4gOiBnbHlwaENvdW50IC0gMSAtIG1f
Z2x5cGhJbkN1cnJlbnRSdW47CisgICAgICAgIHVuc2lnbmVkIGsgPSBsZWZ0bW9zdEdseXBoICsg
ZzsKKwogICAgICAgICB3aGlsZSAobV9nbHlwaEluQ3VycmVudFJ1biA8IGdseXBoQ291bnQpIHsK
ICAgICAgICAgICAgIHVuc2lnbmVkIGdseXBoU3RhcnRPZmZzZXQgPSBjb21wbGV4VGV4dFJ1bi5p
bmRleEF0KGcpOwogICAgICAgICAgICAgdW5zaWduZWQgZ2x5cGhFbmRPZmZzZXQ7CkBAIC00NDcs
NiArNTgwLDkgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UodW5zaQogICAg
ICAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGdseXBocyBwZXIgY2hhcmFj
dGVyIHdlIG5lZWQgdG8gYWR2YW5jZSBieSB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgZ2x5cGguCiAg
ICAgICAgICAgICAgICAgQVNTRVJUKG1fY2hhcmFjdGVySW5DdXJyZW50R2x5cGggPT0gb2xkQ2hh
cmFjdGVySW5DdXJyZW50R2x5cGgpOwogICAgICAgICAgICAgICAgIG1fcnVuV2lkdGhTb0ZhciAr
PSBhZGp1c3RlZEFkdmFuY2Uud2lkdGg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5V2hvbGVH
bHlwaHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZENoYXJhY3RlckluQ3VycmVudEdseXBo
KQorICAgICAgICAgICAgICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0gYWRqdXN0ZWRBZHZhbmNl
LndpZHRoOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgbV9ydW5XaWR0aFNv
RmFyICs9IGFkanVzdGVkQWR2YW5jZS53aWR0aCAqIChtX2NoYXJhY3RlckluQ3VycmVudEdseXBo
IC0gb2xkQ2hhcmFjdGVySW5DdXJyZW50R2x5cGgpIC8gKGdseXBoRW5kT2Zmc2V0IC0gZ2x5cGhT
dGFydE9mZnNldCk7CiAKQEAgLTQ2NCwxMCArNjAwLDEwIEBAIHZvaWQgQ29tcGxleFRleHRDb250
cm9sbGVyOjphZHZhbmNlKHVuc2kKICAgICAgICAgICAgICAgICBrLS07CiAgICAgICAgICAgICB9
CiAgICAgICAgIH0KLSAgICAgICAgbV9jdXJyZW50UnVuKys7CisgICAgICAgIHIgPSBpbmNyZW1l
bnRDdXJyZW50UnVuKGxlZnRtb3N0R2x5cGgpOwogICAgICAgICBtX2dseXBoSW5DdXJyZW50UnVu
ID0gMDsKICAgICB9Ci0gICAgaWYgKCFsdHIgJiYgbV9udW1HbHlwaHNTb0ZhciA9PSBtX2FkanVz
dGVkQWR2YW5jZXMuc2l6ZSgpKQorICAgIGlmICghbV9ydW4ubHRyKCkgJiYgbV9udW1HbHlwaHNT
b0ZhciA9PSBtX2FkanVzdGVkQWR2YW5jZXMuc2l6ZSgpKQogICAgICAgICBtX3J1bldpZHRoU29G
YXIgKz0gbV9maW5hbFJvdW5kaW5nV2lkdGg7CiB9CiAKQEAgLTQ4MSw2ICs2MTcsOSBAQCB2b2lk
IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWRqdXN0R2x5cGhzCiAgICAgICAgIHVuc2lnbmVkIGds
eXBoQ291bnQgPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENvdW50KCk7CiAgICAgICAgIGNvbnN0IFNp
bXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGNvbXBsZXhUZXh0UnVuLmZvbnREYXRhKCk7CiAKKyAg
ICAgICAgaWYgKCFjb21wbGV4VGV4dFJ1bi5sdHIoKSkKKyAgICAgICAgICAgIG1fbHRyT25seSA9
IGZhbHNlOworCiAgICAgICAgIGNvbnN0IENHR2x5cGgqIGdseXBocyA9IGNvbXBsZXhUZXh0UnVu
LmdseXBocygpOwogICAgICAgICBjb25zdCBDR1NpemUqIGFkdmFuY2VzID0gY29tcGxleFRleHRS
dW4uYWR2YW5jZXMoKTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuaAkocmV2aXNpb24g
MTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhU
ZXh0Q29udHJvbGxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYzoK
ICAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3QgRm9udCosIGNvbnN0IFRleHRSdW4mLCBi
b29sIG1heVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9uID0gZmFsc2UsIEhhc2hTZXQ8Y29uc3Qg
U2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDAsIGJvb2wgZm9yVGV4dEVtcGhhc2lz
ID0gZmFsc2UpOwogCiAgICAgLy8gQWR2YW5jZSBhbmQgZW1pdCBnbHlwaHMgdXAgdG8gdGhlIHNw
ZWNpZmllZCBjaGFyYWN0ZXIuCi0gICAgdm9pZCBhZHZhbmNlKHVuc2lnbmVkIHRvLCBHbHlwaEJ1
ZmZlciogPSAwKTsKKyAgICB2b2lkIGFkdmFuY2UodW5zaWduZWQgdG8sIEdseXBoQnVmZmVyKiA9
IDAsIGJvb2wgYnlXaG9sZUdseXBocyA9IGZhbHNlKTsKIAogICAgIC8vIENvbXB1dGUgdGhlIGNo
YXJhY3RlciBvZmZzZXQgZm9yIGEgZ2l2ZW4geCBjb29yZGluYXRlLgogICAgIGludCBvZmZzZXRG
b3JQb3NpdGlvbihmbG9hdCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKQEAgLTEwNywy
MSArMTA3LDIzIEBAIHByaXZhdGU6CiAgICAgICAgIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uKCkg
Y29uc3QgeyByZXR1cm4gbV9zdHJpbmdMb2NhdGlvbjsgfQogICAgICAgICBzaXplX3Qgc3RyaW5n
TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdMZW5ndGg7IH0KICAgICAgICAgQUxXQVlT
X0lOTElORSBDRkluZGV4IGluZGV4QXQoc2l6ZV90IGkpIGNvbnN0OworICAgICAgICBDRkluZGV4
IGluZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2luZGV4QmVnaW47IH0KICAgICAgICAgQ0ZJ
bmRleCBpbmRleEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXhFbmQ7IH0KICAgICAgICAgQ0ZJ
bmRleCBlbmRPZmZzZXRBdChzaXplX3QgaSkgY29uc3QgeyBBU1NFUlQoIW1faXNNb25vdG9uaWMp
OyByZXR1cm4gbV9nbHlwaEVuZE9mZnNldHNbaV07IH0KICAgICAgICAgY29uc3QgQ0dHbHlwaCog
Z2x5cGhzKCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHM7IH0KICAgICAgICAgY29uc3QgQ0dTaXpl
KiBhZHZhbmNlcygpIGNvbnN0IHsgcmV0dXJuIG1fYWR2YW5jZXM7IH0KKyAgICAgICAgYm9vbCBs
dHIoKSBjb25zdCB7IHJldHVybiBtX2x0cjsgfQogICAgICAgICBib29sIGlzTW9ub3RvbmljKCkg
Y29uc3QgeyByZXR1cm4gbV9pc01vbm90b25pYzsgfQogICAgICAgICB2b2lkIHNldElzTm9uTW9u
b3RvbmljKCk7CiAKICAgICBwcml2YXRlOgogI2lmIFVTRShDT1JFX1RFWFQpCiAgICAgICAgIENv
bXBsZXhUZXh0UnVuKENUUnVuUmVmLCBjb25zdCBTaW1wbGVGb250RGF0YSosIGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbiwgc2l6ZV90IHN0cmluZ0xlbmd0
aCwgQ0ZSYW5nZSBydW5SYW5nZSk7Ci0gICAgICAgIHZvaWQgY3JlYXRlVGV4dFJ1bkZyb21Gb250
RGF0YUNvcmVUZXh0KGJvb2wgbHRyKTsKKyAgICAgICAgdm9pZCBjcmVhdGVUZXh0UnVuRnJvbUZv
bnREYXRhQ29yZVRleHQoKTsKICNlbmRpZgogI2lmIFVTRShBVFNVSSkKICAgICAgICAgQ29tcGxl
eFRleHRSdW4oQVRTVVRleHRMYXlvdXQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29uc3QgVUNo
YXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBzaXplX3Qgc3RyaW5nTGVu
Z3RoLCBib29sIGx0ciwgYm9vbCBkaXJlY3Rpb25hbE92ZXJyaWRlKTsKLSAgICAgICAgdm9pZCBj
cmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoYm9vbCBsdHIpOworICAgICAgICB2b2lkIGNy
ZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSSgpOwogI2VuZGlmCiAgICAgICAgIENvbXBsZXhU
ZXh0UnVuKGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVu
c2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBzaXplX3Qgc3RyaW5nTGVuZ3RoLCBib29sIGx0cik7CiAK
QEAgLTE0MSwxMiArMTQzLDE0IEBAIHByaXZhdGU6CiAjaWYgVVNFKEFUU1VJKQogICAgICAgICBW
ZWN0b3I8Q0ZJbmRleCwgNjQ+IG1fYXRzdWlJbmRpY2VzOwogI2VuZGlmCisgICAgICAgIENGSW5k
ZXggbV9pbmRleEJlZ2luOwogICAgICAgICBDRkluZGV4IG1faW5kZXhFbmQ7CiAgICAgICAgIFZl
Y3RvcjxDRkluZGV4LCA2ND4gbV9nbHlwaEVuZE9mZnNldHM7CiAgICAgICAgIFZlY3RvcjxDR0ds
eXBoLCA2ND4gbV9nbHlwaHNWZWN0b3I7CiAgICAgICAgIGNvbnN0IENHR2x5cGgqIG1fZ2x5cGhz
OwogICAgICAgICBWZWN0b3I8Q0dTaXplLCA2ND4gbV9hZHZhbmNlc1ZlY3RvcjsKICAgICAgICAg
Y29uc3QgQ0dTaXplKiBtX2FkdmFuY2VzOworICAgICAgICBib29sIG1fbHRyOwogI2lmIFVTRShB
VFNVSSkKICAgICAgICAgYm9vbCBtX2RpcmVjdGlvbmFsT3ZlcnJpZGU7CiAjZW5kaWYKQEAgLTE2
Miw4ICsxNjYsMTMgQEAgcHJpdmF0ZToKICAgICB2b2lkIGNvbGxlY3RDb21wbGV4VGV4dFJ1bnNG
b3JDaGFyYWN0ZXJzQ29yZVRleHQoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2ln
bmVkIHN0cmluZ0xvY2F0aW9uLCBjb25zdCBTaW1wbGVGb250RGF0YSopOwogICAgIHZvaWQgYWRq
dXN0R2x5cGhzQW5kQWR2YW5jZXMoKTsKIAorICAgIHVuc2lnbmVkIGluZGV4T2ZDdXJyZW50UnVu
KHVuc2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICB1bnNpZ25lZCBpbmNyZW1lbnRDdXJyZW50
UnVuKHVuc2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiBt
X3J1bkluZGljZXM7CisKICAgICBjb25zdCBGb250JiBtX2ZvbnQ7CiAgICAgY29uc3QgVGV4dFJ1
biYgbV9ydW47CisgICAgYm9vbCBtX2x0ck9ubHk7CiAgICAgYm9vbCBtX21heVVzZU5hdHVyYWxX
cml0aW5nRGlyZWN0aW9uOwogICAgIGJvb2wgbV9mb3JUZXh0RW1waGFzaXM7CiAKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJB
VFNVSS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckFUU1VJLmNwcAkocmV2aXNpb24gMTEyODkxKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxl
ckFUU1VJLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ3LDggKzE0NywxMCBAQCBDb21wbGV4VGV4
dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDCiAgICAgLCBtX2NoYXJhY3RlcnMoY2hhcmFj
dGVycykKICAgICAsIG1fc3RyaW5nTG9jYXRpb24oc3RyaW5nTG9jYXRpb24pCiAgICAgLCBtX3N0
cmluZ0xlbmd0aChzdHJpbmdMZW5ndGgpCisgICAgLCBtX2luZGV4QmVnaW4oMCkKICAgICAsIG1f
aW5kZXhFbmQoc3RyaW5nTGVuZ3RoKQogICAgICwgbV9kaXJlY3Rpb25hbE92ZXJyaWRlKGRpcmVj
dGlvbmFsT3ZlcnJpZGUpCisgICAgLCBtX2x0cihsdHIpCiAgICAgLCBtX2lzTW9ub3RvbmljKHRy
dWUpCiB7CiAgICAgT1NTdGF0dXMgc3RhdHVzOwpAQCAtMjIyLDcgKzIyNCw3IEBAIENvbXBsZXhU
ZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMKICAgICBzdGF0dXMgPSBBVFNVRGlzcG9z
ZVRleHRMYXlvdXQoYXRzdVRleHRMYXlvdXQpOwogfQogCi12b2lkIENvbXBsZXhUZXh0Q29udHJv
bGxlcjo6Q29tcGxleFRleHRSdW46OmNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSShib29s
IGx0cikKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Y3JlYXRl
VGV4dFJ1bkZyb21Gb250RGF0YUFUU1VJKCkKIHsKICAgICBtX2F0c3VpSW5kaWNlcy5yZXNlcnZl
Q2FwYWNpdHkobV9zdHJpbmdMZW5ndGgpOwogICAgIHVuc2lnbmVkIHIgPSAwOwpAQCAtMjM3LDcg
KzIzOSw3IEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFIKICAgICAg
ICAgICAgIHIrKzsKICAgICB9CiAgICAgbV9nbHlwaENvdW50ID0gbV9hdHN1aUluZGljZXMuc2l6
ZSgpOwotICAgIGlmICghbHRyKSB7CisgICAgaWYgKCFtX2x0cikgewogICAgICAgICBmb3IgKHVu
c2lnbmVkIHIgPSAwLCBlbmQgPSBtX2dseXBoQ291bnQgLSAxOyByIDwgbV9nbHlwaENvdW50IC8g
MjsgKytyLCAtLWVuZCkKICAgICAgICAgICAgIHN0ZDo6c3dhcChtX2F0c3VpSW5kaWNlc1tyXSwg
bV9hdHN1aUluZGljZXNbZW5kXSk7CiAgICAgfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0Lm1tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENv
bnRyb2xsZXJDb3JlVGV4dC5tbQkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0Lm1tCSh3
b3JraW5nIGNvcHkpCkBAIC0xMDcsNyArMTA3LDkgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpD
b21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBt
X3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9zdHJpbmdMZW5ndGgoc3Ry
aW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKHJ1blJhbmdlLmxvY2F0aW9uKQogICAgICwg
bV9pbmRleEVuZChydW5SYW5nZS5sb2NhdGlvbiArIHJ1blJhbmdlLmxlbmd0aCkKKyAgICAsIG1f
bHRyKCEoQ1RSdW5HZXRTdGF0dXMoY3RSdW4pICYga0NUUnVuU3RhdHVzUmlnaHRUb0xlZnQpKQog
ICAgICwgbV9pc01vbm90b25pYyh0cnVlKQogewogICAgIG1fZ2x5cGhDb3VudCA9IENUUnVuR2V0
R2x5cGhDb3VudChjdFJ1bik7CkBAIC0xMzUsNyArMTM3LDcgQEAgQ29tcGxleFRleHRDb250cm9s
bGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogCiAvLyBNaXNzaW5nIGdseXBocyBydW4gY29uc3RydWN0
b3IuIENvcmUgVGV4dCB3aWxsIG5vdCBnZW5lcmF0ZSBhIHJ1biBvZiBtaXNzaW5nIGdseXBocywg
aW5zdGVhZCBmYWxsaW5nIGJhY2sgb24KIC8vIGdseXBocyBmcm9tIExhc3RSZXNvcnQuIFdlIHdh
bnQgdG8gdXNlIHRoZSBwcmltYXJ5IGZvbnQncyBtaXNzaW5nIGdseXBoIGluIG9yZGVyIHRvIG1h
dGNoIHRoZSBmYXN0IHRleHQgY29kZSBwYXRoLgotdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6
OkNvbXBsZXhUZXh0UnVuOjpjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQoYm9vbCBs
dHIpCit2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNyZWF0ZVRl
eHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dCgpCiB7CiAgICAgbV9jb3JlVGV4dEluZGljZXNWZWN0
b3IucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX3N0cmluZ0xlbmd0aCk7CiAgICAgdW5zaWduZWQg
ciA9IDA7CkBAIC0xNTAsNyArMTUyLDcgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNv
bXBsZXhUZXh0UgogICAgICAgICAgICAgcisrOwogICAgIH0KICAgICBtX2dseXBoQ291bnQgPSBt
X2NvcmVUZXh0SW5kaWNlc1ZlY3Rvci5zaXplKCk7Ci0gICAgaWYgKCFsdHIpIHsKKyAgICBpZiAo
IW1fbHRyKSB7CiAgICAgICAgIGZvciAodW5zaWduZWQgciA9IDAsIGVuZCA9IG1fZ2x5cGhDb3Vu
dCAtIDE7IHIgPCBtX2dseXBoQ291bnQgLyAyOyArK3IsIC0tZW5kKQogICAgICAgICAgICAgc3Rk
Ojpzd2FwKG1fY29yZVRleHRJbmRpY2VzVmVjdG9yW3JdLCBtX2NvcmVUZXh0SW5kaWNlc1ZlY3Rv
cltlbmRdKTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxv
Y2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2su
aAkocmV2aXNpb24gMTEyODkxKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJs
b2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4LDcgQEAgc3RydWN0IEJpZGlSdW47CiBz
dHJ1Y3QgUGFpbnRJbmZvOwogY2xhc3MgTGluZUluZm87CiBjbGFzcyBSZW5kZXJSdWJ5UnVuOwor
Y2xhc3MgVGV4dExheW91dDsKIAogdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yLCBjbGFzcyBSdW4+
IGNsYXNzIEJpZGlSZXNvbHZlcjsKIHRlbXBsYXRlIDxjbGFzcyBSdW4+IGNsYXNzIEJpZGlSdW5M
aXN0OwpAQCAtNzAzLDYgKzcwNCw3IEBAIHByaXZhdGU6CiAKICAgICAvLyBUaGUgZm9sbG93aW5n
IGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQu
Y3BwLgogICAgIHR5cGVkZWYgc3RkOjpwYWlyPFJlbmRlclRleHQqLCBMYXp5TGluZUJyZWFrSXRl
cmF0b3I+IExpbmVCcmVha0l0ZXJhdG9ySW5mbzsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxSZW5k
ZXJUZXh0KiwgT3duUHRyPFRleHRMYXlvdXQ+ID4gVGV4dExheW91dEluZm87CiAgICAgY2xhc3Mg
TGluZUJyZWFrZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgTGluZUJyZWFrZXIoUmVuZGVyQmxv
Y2sqIGJsb2NrKQpAQCAtNzExLDcgKzcxMyw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICByZXNl
dCgpOwogICAgICAgICB9CiAKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgbmV4dExpbmVCcmVhayhJ
bmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIExpbmVCcmVha0l0ZXJhdG9ySW5mbyYsIEZs
b2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1
dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIElubGluZUl0ZXJhdG9yIG5leHRMaW5lQnJl
YWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBMaW5lQnJlYWtJdGVyYXRvckluZm8m
LCBUZXh0TGF5b3V0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNM
aW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CiAKICAgICAgICAgYm9v
bCBsaW5lV2FzSHlwaGVuYXRlZCgpIHsgcmV0dXJuIG1faHlwaGVuYXRlZDsgfQogICAgICAgICBj
b25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKCkgeyByZXR1cm4gbV9w
b3NpdGlvbmVkT2JqZWN0czsgfQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDExMjg5MSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMjI3LDYgKzEyMjcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5k
RmxvYXRzSW5SCiAgICAgSW5saW5lSXRlcmF0b3IgZW5kID0gcmVzb2x2ZXIucG9zaXRpb24oKTsK
ICAgICBib29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOwog
ICAgIExpbmVCcmVha0l0ZXJhdG9ySW5mbyBsaW5lQnJlYWtJdGVyYXRvckluZm87CisgICAgVGV4
dExheW91dEluZm8gdGV4dExheW91dEluZm87CiAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlIHZl
cnRpY2FsUG9zaXRpb25DYWNoZTsKIAogICAgIExpbmVCcmVha2VyIGxpbmVCcmVha2VyKHRoaXMp
OwpAQCAtMTI0OSw3ICsxMjUwLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZs
b2F0c0luUgogICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciBvbGRFbmQgPSBlbmQ7CiAgICAg
ICAgIGJvb2wgaXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSgpOwogICAgICAgICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSA9IChtX2Zsb2F0aW5nT2JqZWN0cyAmJiAhbV9mbG9hdGluZ09iamVj
dHMtPnNldCgpLmlzRW1wdHkoKSkgPyBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpIDog
MDsKLSAgICAgICAgZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZlciwgbGF5
b3V0U3RhdGUubGluZUluZm8oKSwgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCBsYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIGVuZCA9
IGxpbmVCcmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZv
KCksIGxpbmVCcmVha0l0ZXJhdG9ySW5mbywgdGV4dExheW91dEluZm8sIGxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKICAgICAgICAgaWYgKHJl
c29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNo
b3VsZG4ndCBiZSBjcmVhdGluZyBhbnkgcnVucyBpbiBuZXh0TGluZUJyZWFrIHRvIGJlZ2luIHdp
dGghCiAgICAgICAgICAgICAvLyBPbmNlIEJpZGlSdW5MaXN0IGlzIHNlcGFyYXRlZCBmcm9tIEJp
ZGlSZXNvbHZlciB0aGlzIHdpbGwgbm90IGJlIG5lZWRlZC4KQEAgLTE5MzgsMTEgKzE5MzksMTQg
QEAgc3RhdGljIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YQogICAgIHJldHVybiBm
YWxzZTsKIH0KIAotc3RhdGljIGlubGluZSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4
dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250JiBmb250LCBmbG9hdCB4
UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpCitzdGF0aWMg
aW5saW5lIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1
bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MsIGJvb2wgaXNGaXhlZFBp
dGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgVGV4dExheW91dCogbGF5b3V0ID0gMCkKIHsK
ICAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0gdGV4dC0+dGV4dExlbmd0
aCgpKSB8fCB0ZXh0LT5zdHlsZSgpLT5oYXNUZXh0Q29tYmluZSgpKQogICAgICAgICByZXR1cm4g
dGV4dC0+d2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9zKTsKIAorICAgIGlmIChsYXlvdXQpCisg
ICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4pOworCiAgICAgVGV4
dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0
LT5jaGFyYWN0ZXJzKCkgKyBmcm9tLCBsZW4sIHRleHQtPnN0eWxlKCkpOwogICAgIHJ1bi5zZXRD
aGFyYWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSAtIGZyb20pOwogICAgIEFTU0VSVChy
dW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CkBAIC0yMTA0LDcgKzIxMDgs
NyBAQCB2b2lkIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6cmVzZXQoKQogfQogCiBJbmxpbmVJ
dGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6Om5leHRMaW5lQnJlYWsoSW5saW5lQmlk
aVJlc29sdmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLAotICAgIExpbmVCcmVha0l0
ZXJhdG9ySW5mbyYgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCBGbG9hdGluZ09iamVjdCogbGFzdEZs
b2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMp
CisgICAgTGluZUJyZWFrSXRlcmF0b3JJbmZvJiBsaW5lQnJlYWtJdGVyYXRvckluZm8sIFRleHRM
YXlvdXRJbmZvJiB0ZXh0TGF5b3V0SW5mbywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKQogewogICAg
IHJlc2V0KCk7CiAKQEAgLTIzNDMsNiArMjM0NywxMiBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJC
bG9jazo6TGluZUJyZWFrZXI6CiAgICAgICAgICAgICAgICAgQVNTRVJUKGN1cnJlbnQubV9wb3Mg
PT0gdC0+dGV4dExlbmd0aCgpKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHRl
eHRMYXlvdXRJbmZvLmZpcnN0ICE9IHQpIHsKKyAgICAgICAgICAgICAgICB0ZXh0TGF5b3V0SW5m
by5maXJzdCA9IHQ7CisgICAgICAgICAgICAgICAgdGV4dExheW91dEluZm8uc2Vjb25kID0gZi5j
cmVhdGVMYXlvdXQodCwgd2lkdGguY3VycmVudFdpZHRoKCksIGNvbGxhcHNlV2hpdGVTcGFjZSk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gdGV4
dExheW91dEluZm8uc2Vjb25kLmdldCgpOworCiAgICAgICAgICAgICBmb3IgKDsgY3VycmVudC5t
X3BvcyA8IHQtPnRleHRMZW5ndGgoKTsgY3VycmVudC5mYXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgp
KSB7CiAgICAgICAgICAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgPSBjdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZTsKICAgICAgICAgICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFj
dGVySXNXUyA9IGN1cnJlbnRDaGFyYWN0ZXJJc1dTOwpAQCAtMjM2NCw3ICsyMzc0LDcgQEAgSW5s
aW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgICAgIGlm
ICgoYnJlYWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhaykgewogICAgICAgICAg
ICAgICAgICAgICB3cmFwVyArPSBjaGFyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wg
bWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID0gVTE2X0lTX0xFQUQoYykgJiYgY3Vy
cmVudC5tX3BvcyArIDEgPCB0LT50ZXh0TGVuZ3RoKCkgJiYgVTE2X0lTX1RSQUlMKHQtPmNoYXJh
Y3RlcnMoKVtjdXJyZW50Lm1fcG9zICsgMV0pOwotICAgICAgICAgICAgICAgICAgICBjaGFyV2lk
dGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJy
b2dhdGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywgaXNG
aXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpOworICAgICAgICAgICAgICAgICAgICBjaGFy
V2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgbWlkV29yZEJyZWFrSXNCZWZvcmVT
dXJyb2dhdGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywg
aXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpOwogICAgICAgICAg
ICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSB3aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcg
KyBjaGFyV2lkdGggPiB3aWR0aC5hdmFpbGFibGVXaWR0aCgpOwogICAgICAgICAgICAgICAgIH0K
IApAQCAtMjM5NSw5ICsyNDA1LDkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVC
cmVha2VyOgogCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUbXBXOwogICAg
ICAgICAgICAgICAgICAgICBpZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBjdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0g
dGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGYs
IHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkg
LSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7CisgICAgICAg
ICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2Us
IGN1cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwg
aXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpIC0gd29yZFRyYWls
aW5nU3BhY2VXaWR0aCArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0
aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJl
bnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgKyBsYXN0U3BhY2VX
b3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0gdGV4
dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGgu
Y3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5
b3V0KSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgICAgICAgICB3aWR0aC5h
ZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBXKTsKICAgICAgICAgICAgICAgICAgICAg
aWYgKCFhcHBsaWVkU3RhcnRXaWR0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgu
YWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgoY3VycmVudC5tX29iaiwgdHJ1
ZSwgZmFsc2UpKTsKQEAgLTI0MTQsNyArMjQyNCw3IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJs
b2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGNhbmRpZGF0
ZSB3aWR0aCBmb3IgdGhpcyBsaW5lLgogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaW5l
V2FzVG9vV2lkZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoLmZp
dHNPbkxpbmUoKSAmJiBjdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBjdXJyZW50U3R5bGUtPmJyZWFr
T25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3Bv
cywgMSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0
ZVNwYWNlKSArIChhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVu
dC5tX3BvcywgMSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFw
c2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNp
bmcgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBsaW5lIGlz
IHRvbyBiaWcgZXZlbiB3aXRob3V0IHRoZSBleHRyYSBzcGFjZQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuIElmIGl0IGlzIG5vdCwgZG8gbm90
aGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0
aGUgZXh0cmEgd2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywKQEAgLTI1NDAsNyArMjU1MCw3IEBA
IElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgIH0K
IAogICAgICAgICAgICAgLy8gSU1QT1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhl
cmUhCi0gICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVG1wVyA9IGlnbm9yaW5nU3BhY2VzID8g
MCA6IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGYs
IHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkg
KyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUbXBX
ID0gaWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5t
X3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwg
Y29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwog
ICAgICAgICAgICAgd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVG1wVyArIGlu
bGluZUxvZ2ljYWxXaWR0aChjdXJyZW50Lm1fb2JqLCAhYXBwbGllZFN0YXJ0V2lkdGgsIGluY2x1
ZGVFbmRXaWR0aCkpOwogICAgICAgICAgICAgaW5jbHVkZUVuZFdpZHRoID0gZmFsc2U7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>141204</attachid>
            <date>2012-05-10 11:22:17 -0700</date>
            <delta_ts>2012-07-27 01:09:50 -0700</delta_ts>
            <desc>Rebased patch.</desc>
            <filename>rebased.txt</filename>
            <type>text/plain</type>
            <size>31264</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExNjU3MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcyIEBACisyMDEyLTA1LTA5ICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBidWxrIG9mIHRoaXMgY2hhbmdlIGlzIG1vZGlm
eWluZyBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UsIHdoaWNoIHByZXZpb3VzbHkgcmVx
dWlyZWQgdGhlIHRleHQgb2Zmc2V0CisgICAgICAgIHRvIGJlIHN0cmljdGx5IGluY3JlYXNpbmcg
YW5kIGFzc3VtZWQgdW5pZGlyZWN0aW9uYWwgdGV4dDsgbm93IGl0IHN1cHBvcnRzIHJhbmRvbSBz
ZWVraW5nIGluIGEgbmFpdmUgZmFzaGlvbgorICAgICAgICAoYnkgcmVzdGFydGluZyB0byB0aGUg
YmVnaW5uaW5nKSBhbmQgdHJhdmVyc2VzIGdseXBocyBpbiBsb2dpY2FsIG9yZGVyLiBJbiB0aGUg
bGF0dGVyIGNhc2UsIHRoZSBwcmVzZW5jZSBvZiBhbnkKKyAgICAgICAgbm9uLUxUUiBydW5zIHRy
aWdnZXJzIHRoZSBwb3B1bGF0aW9uIG9mIGEgbWFwcGluZyBmcm9tIGxvZ2ljYWwgdG8gdmlzdWFs
IHJ1biBpbmRpY2VzLiBGaW5hbGx5LCBhIG5ldyBmbGFnIGhhcworICAgICAgICBiZWVuIGFkZGVk
IHdoaWNoIGluaGliaXRzIGdseXBoIGFkdmFuY2VzIGZyb20gYmVpbmcgc3BsaXQgYWNyb3NzIGxp
Z2F0dXJlcyAodGh1cyBjYXVzaW5nIHNwdXJpb3VzIGxpbmUgYnJlYWtzKS4KKworICAgICAgICBB
IENvbXBsZXhUZXh0Q29udHJvbGxlciBhbmQgaXRzIGFzc29jaWF0ZWQgVGV4dFJ1biBhbmQgRm9u
dCBhcmUgZW5jYXBzdWxhdGVkIGluIGEgVGV4dExheW91dCBvYmplY3QsIHdoaWNoIGlzCisgICAg
ICAgIGluc3RhbnRpYXRlZCBhcyBhbiBvcGFxdWUgb2JqZWN0IHZpYSBmdW5jdGlvbnMgdGhhdCBh
cmUgbm8tb3BzIHVubGVzcyBidWlsZGluZyBmb3IgTWFjLiBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rp
b24KKyAgICAgICAgKGlzTmVlZGVkKSBjaGVja3MgdG8gc2VlIHdoZXRoZXIgYSBUZXh0UnVuIGlz
IGNvbXBsZXgsIGluIG9yZGVyIHRvIGF2b2lkIG5lZWRsZXNzIGluc3RhbnRpYXRpb24uIEl0IGFs
c28gYmFpbHMKKyAgICAgICAgaWYgdGFicyB3b3VsZCBiZSBlbmFibGVkLCBzaW5jZSBwb3NpdGlv
bmFsIGVmZmVjdHMgYXJlIG5vdCBjdXJyZW50bHkgcmVzcGVjdGVkIGluIHRoaXMgbW9kZS4gQWx0
aG91Z2ggdGhlIEFUU1VJCisgICAgICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciBpbXBsZW1lbnRh
dGlvbiBoYXMgYmVlbiB1cGRhdGVkIHRvIGFjY291bnQgZm9yIG5ld2x5LWFkZGVkIG1lbWJlciB2
YXJpYWJsZXMsIHRoaXMgbmV3IHBhdGgKKyAgICAgICAgaXMgb25seSBlbmFibGVkIGZvciBDb3Jl
IFRleHQuCisKKyAgICAgICAgTm8gYmVoYXZpb3JhbCBjaGFuZ2VzIGFyZSBleHBlY3RlZCBkdWUg
dG8gdGhpcyBjaGFuZ2UsIHNvIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL0ZvbnQuY3BwOgorICAgICAgICAoV1RGKTogRGVmaW5lIGRlbGV0ZU93bmVkUHRyIGZv
ciBUZXh0TGF5b3V0IGFzIGNhbGxpbmcgdGhyb3VnaCBkZXN0cm95TGF5b3V0OyByZWx5aW5nIG9u
IG9wZXJhdG9yIGRlbGV0ZSBpcyBub3Qgd29ya2FibGUgYXMgdGhlIGNsYXNzIGRvZXMgbm90IGV4
aXN0IG9uIGFsbCBwbGF0Zm9ybXMuCisgICAgICAgIChXVEY6OldlYkNvcmU6OlRleHRMYXlvdXQp
OgorICAgICAgICAoV2ViQ29yZSk6IEltcGxlbWVudCBuby1vcCBUZXh0TGF5b3V0IHdyYXBwZXJz
IGZvciBub24tTWFjIHBsYXRmb3Jtcy4KKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmNyZWF0ZUxh
eW91dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkZXN0cm95TGF5b3V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkZvbnQ6OndpZHRoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250
Lmg6CisgICAgICAgIChXZWJDb3JlKTogQWRkIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBSZW5k
ZXJUZXh0IGFuZCBUZXh0TGF5b3V0LgorICAgICAgICAoRm9udCk6IEFkZCBmdW5jdGlvbnMgZm9y
IGRlYWxpbmcgd2l0aCBwb2ludGVyIHRvIFRleHRMYXlvdXQgaW1wbGVtZW50YXRpb24uCisgICAg
ICAgIChXVEYpOiBEZWNsYXJlIGRlbGV0ZU93bmVkUHRyIGZvciBUZXh0TGF5b3V0LgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuY3BwOgorICAg
ICAgICAoVGV4dExheW91dCk6IEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY29ycmVzcG9uZHMg
dG8gYSBDb21wbGV4VGV4dENvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciBUZXh0UnVuLgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dExheW91dDo6aXNOZWVkZWQpOiBVc2VkIGJ5IHdyYXBwZXIgdG8g
YXZvaWQgaW5zdGFudGlhdGlvbiB3aGVuIGNvbXBsZXggbGF5b3V0IGlzIG5vdCByZXF1aXJlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlRleHRMYXlvdXQ6OlRleHRMYXlvdXQpOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dExheW91dDo6flRleHRMYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dExh
eW91dDo6d2lkdGgpOgorICAgICAgICAoV2ViQ29yZSk6IEltcGxlbWVudCByZWFsIFRleHRMYXlv
dXQgd3JhcHBlcnMgZm9yIE1hYy4KKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmNyZWF0ZUxheW91
dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkZXN0cm95TGF5b3V0KToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJv
bGxlcjo6Q29tcGxleFRleHRDb250cm9sbGVyKTogSW5pdGlhbGl6ZSBtX2x0ck9ubHkuCisgICAg
ICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDb21w
bGV4VGV4dFJ1bik6IEluaXRpYWxpemUgbV9pbmRleEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6aW5kZXhPZkN1cnJlbnRSdW4pOiBSZXR1
cm4gKHZpc3VhbCkgbV9jb21wbGV4VGV4dFJ1bnMgaW5kZXggY29ycmVzcG9uZGluZyB0byAobG9n
aWNhbCkgbV9jdXJyZW50UnVuLCBsYXppbHkgY29uc3RydWN0aW5nIG1fcnVuSW5kaWNlcyBpZiBu
ZWVkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmluY3JlbWVu
dEN1cnJlbnRSdW4pOiBSZXR1cm4gbmV4dCBtX2NvbXBsZXhUZXh0UnVucyBpbmRleCBpbiBsb2dp
Y2FsIG9yZGVyLgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphZHZh
bmNlKTogQWxsb3cgcmVzdGFydGluZywgc3VwcG9ydCBmb3IgYmlkaSByZW9yZGVyaW5nLCBhbmQg
b3B0aW9uIHRvIG1lYXN1cmUgb25seSB3aG9sZSBnbHlwaHMgcmF0aGVyIHRoYW4gZGl2aWRpbmcg
YWR2YW5jZXMuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkanVz
dEdseXBoc0FuZEFkdmFuY2VzKTogQ2xlYXIgbV9sdHJPbmx5IG9uIGRldGVjdGluZyBhIFJUTCBy
dW4uCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxl
ci5oOgorICAgICAgICAoQ29tcGxleFRleHRDb250cm9sbGVyKTogQWRkIG1fbHRyT25seSBpbmRp
Y2F0aW5nIG5vIGJpZGkgcmVvcmRlcmluZywgYW5kIG1fcnVuSW5kaWNlcyBtYXBwaW5nIGZyb20g
cnVucyAobG9naWNhbCBvcmRlcikgdG8gbV9jb21wbGV4VGV4dFJ1bnMgKHZpc3VhbCBvcmRlciku
CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVu
OjppbmRleEJlZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
Q29tcGxleFRleHRSdW46Omx0cik6CisgICAgICAgIChDb21wbGV4VGV4dFJ1bik6IEFkZCBtX2lu
ZGV4QmVnaW4gYW5kIG1fbHRyLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21w
bGV4VGV4dENvbnRyb2xsZXJBVFNVSS5jcHA6IEluaXRpYWxpemUgbV9pbmRleEJlZ2luIGFuZCBt
X2x0ciwgZXZlbiB0aG91Z2ggVGV4dExheW91dCBpcyBub3QgZW5hYmxlZCBmb3IgQVRTVUkuCisg
ICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpD
b21wbGV4VGV4dFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6
OkNvbXBsZXhUZXh0UnVuOjpjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5t
bTogSW5pdGlhbGl6ZSBtX2luZGV4QmVnaW4gYW5kIG1fbHRyLgorICAgICAgICAoV2ViQ29yZTo6
Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29tcGxleFRleHRSdW4pOgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6
Y3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUNvcmVUZXh0KToKKyAgICAgICAgKiByZW5kZXJpbmcv
UmVuZGVyQmxvY2suaDogQWRkIFRleHRMYXlvdXRJbmZvLCBtYXBwaW5nIGZyb20gUmVuZGVyVGV4
dCB0byAocG9zc2libHkgbnVsbCkgVGV4dExheW91dC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAg
ICAgICAoUmVuZGVyQmxvY2spOgorICAgICAgICAoTGluZUJyZWFrZXIpOgorICAgICAgICAqIHJl
bmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKTogQWxsb3cgVGV4dExheW91dCBp
bnN0YW5jZSB0byBiZSByZXVzZWQgYWNyb3NzIGNhbGxzIHRvIG5leHRMaW5lQnJlYWsuCisgICAg
ICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOiBVc2UgVGV4dExheW91dCB3aGVuIHN1cHBsaWVkIGZv
ciBtZWFzdXJpbmcuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6
Om5leHRMaW5lQnJlYWspOiAKKwogMjAxMi0wNS0wOSAgSHVnbyBQYXJlbnRlIExpbWEgIDxodWdv
LmxpbWFAb3BlbmJvc3NhLm9yZz4KIAogICAgICAgICBVc2Ugc3VpdGFibGUgdmlld3BvcnQgdmFs
dWVzIG9uIFhIVE1MLU1QIHBhZ2VzLgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udC5jcHAJKHJldmlzaW9uIDExNjU3MikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw5IEBACiAj
aW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiRm9udFRyYW5zY29kZXIuaCIKICNpbmNs
dWRlICJJbnRQb2ludC5oIgorI2lmICFQTEFURk9STShNQUMpCisjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKyNlbmRpZgogI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCiAjaW5jbHVkZSAiVGV4
dFJ1bi5oIgogI2luY2x1ZGUgIldpZHRoSXRlcmF0b3IuaCIKQEAgLTM5LDYgKzQyLDE1IEBACiB1
c2luZyBuYW1lc3BhY2UgV1RGOwogdXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7CiAKK25hbWVzcGFj
ZSBXVEYgeworCit0ZW1wbGF0ZSA8PiB2b2lkIGRlbGV0ZU93bmVkUHRyPFdlYkNvcmU6OlRleHRM
YXlvdXQ+KFdlYkNvcmU6OlRleHRMYXlvdXQqIHB0cikKK3sKKyAgICBXZWJDb3JlOjpGb250Ojpk
ZXN0cm95TGF5b3V0KHB0cik7Cit9CisKK30KKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjb25z
dCB1aW50OF90IEZvbnQ6OnNfcm91bmRpbmdIYWNrQ2hhcmFjdGVyVGFibGVbMjU2XSA9IHsKQEAg
LTE5Nyw2ICsyMDksMjUgQEAgZmxvYXQgRm9udDo6d2lkdGgoY29uc3QgVGV4dFJ1biYgcnVuLCBp
bgogICAgIHJldHVybiBmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQocnVuKTsKIH0KIAorI2lmICFQ
TEFURk9STShNQUMpCisKK1Bhc3NPd25QdHI8VGV4dExheW91dD4gRm9udDo6Y3JlYXRlTGF5b3V0
KFJlbmRlclRleHQqLCBmbG9hdCB4UG9zLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSkgY29uc3QK
K3sKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBGb250OjpkZXN0cm95TGF5b3V0KFRl
eHRMYXlvdXQqKQoreworfQorCitmbG9hdCBGb250Ojp3aWR0aChUZXh0TGF5b3V0JiwgdW5zaWdu
ZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1
cm4gMDsKK30KKworI2VuZGlmCisKIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yVGV4
dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgaCwgaW50
IGZyb20sIGludCB0bykgY29uc3QKIHsKICAgICB0byA9ICh0byA9PSAtMSA/IHJ1bi5sZW5ndGgo
KSA6IHRvKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmgJKHJl
dmlzaW9uIDExNjU3MikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQu
aAkod29ya2luZyBjb3B5KQpAQCAtNTUsNiArNTUsOCBAQCBjbGFzcyBGb250U2VsZWN0b3I7CiBj
bGFzcyBHbHlwaEJ1ZmZlcjsKIGNsYXNzIEdseXBoUGFnZVRyZWVOb2RlOwogY2xhc3MgR3JhcGhp
Y3NDb250ZXh0OworY2xhc3MgUmVuZGVyVGV4dDsKK2NsYXNzIFRleHRMYXlvdXQ7CiBjbGFzcyBU
ZXh0UnVuOwogCiBzdHJ1Y3QgR2x5cGhEYXRhOwpAQCAtMTA0LDYgKzEwNiwxMCBAQCBwdWJsaWM6
CiAgICAgZmxvYXQgd2lkdGgoY29uc3QgVGV4dFJ1biYsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9u
dERhdGEqPiogZmFsbGJhY2tGb250cyA9IDAsIEdseXBoT3ZlcmZsb3cqID0gMCkgY29uc3Q7CiAg
ICAgZmxvYXQgd2lkdGgoY29uc3QgVGV4dFJ1biYsIGludCYgY2hhcnNDb25zdW1lZCwgU3RyaW5n
JiBnbHlwaE5hbWUpIGNvbnN0OwogCisgICAgUGFzc093blB0cjxUZXh0TGF5b3V0PiBjcmVhdGVM
YXlvdXQoUmVuZGVyVGV4dCosIGZsb2F0IHhQb3MsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlKSBj
b25zdDsKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TGF5b3V0KFRleHRMYXlvdXQqKTsKKyAgICBz
dGF0aWMgZmxvYXQgd2lkdGgoVGV4dExheW91dCYsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRv
KTsKKwogICAgIGludCBvZmZzZXRGb3JQb3NpdGlvbihjb25zdCBUZXh0UnVuJiwgZmxvYXQgcG9z
aXRpb24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0OwogICAgIEZsb2F0UmVjdCBz
ZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdCBUZXh0UnVuJiwgY29uc3QgRmxvYXRQb2ludCYsIGlu
dCBoLCBpbnQgZnJvbSA9IDAsIGludCB0byA9IC0xKSBjb25zdDsKIApAQCAtMzA1LDQgKzMxMSwx
MCBAQCBpbmxpbmUgRm9udFNlbGVjdG9yKiBGb250Ojpmb250U2VsZWN0b3IoCiAKIH0KIAorbmFt
ZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlIDw+IHZvaWQgZGVsZXRlT3duZWRQdHI8V2ViQ29yZTo6
VGV4dExheW91dD4oV2ViQ29yZTo6VGV4dExheW91dCogcHRyKTsKKworfQorCiAjZW5kaWYKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRy
b2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiAxMTY1NzIpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsOCBAQAogCiAjaW5jbHVkZSAiRmxvYXRTaXpl
LmgiCiAjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVk
ZSAiUmVuZGVyVGV4dC5oIgogI2luY2x1ZGUgIlRleHRCcmVha0l0ZXJhdG9yLmgiCiAjaW5jbHVk
ZSAiVGV4dFJ1bi5oIgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25T
ZXJ2aWNlcy5oPgpAQCAtNDIsNiArNDQsNzIgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCitjbGFzcyBUZXh0TGF5b3V0IHsKK3B1YmxpYzoKKyAgICBzdGF0
aWMgYm9vbCBpc05lZWRlZChSZW5kZXJUZXh0KiB0ZXh0LCBjb25zdCBGb250JiBmb250KQorICAg
IHsKKyAgICAgICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0
ZXh0LCBmb250LCB0ZXh0LT5jaGFyYWN0ZXJzKCksIHRleHQtPnRleHRMZW5ndGgoKSwgdGV4dC0+
c3R5bGUoKSk7CisgICAgICAgIEZvbnQ6OkNvZGVQYXRoIGNvZGVQYXRoVG9Vc2UgPSBmb250LmNv
ZGVQYXRoKHJ1bik7CisgICAgICAgIHJldHVybiBjb2RlUGF0aFRvVXNlID09IEZvbnQ6OkNvbXBs
ZXg7CisgICAgfQorCisgICAgVGV4dExheW91dChSZW5kZXJUZXh0KiB0ZXh0LCBjb25zdCBGb250
JiBmb250LCBmbG9hdCB4UG9zKQorICAgICAgICA6IG1fZm9udChmb250KQorICAgICAgICAsIG1f
cnVuKDAsIDApCisgICAgeworICAgICAgICBtX2ZvbnQuc2V0V29yZFNwYWNpbmcoMCk7CisKKyAg
ICAgICAgbV9ydW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBtX2ZvbnQs
IHRleHQtPmNoYXJhY3RlcnMoKSwgdGV4dC0+dGV4dExlbmd0aCgpLCB0ZXh0LT5zdHlsZSgpKTsK
KyAgICAgICAgbV9ydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkpOwor
ICAgICAgICBBU1NFUlQobV9ydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IG1fcnVuLmxlbmd0aCgp
KTsKKworICAgICAgICBtX3J1bi5zZXRYUG9zKHhQb3MpOworCisgICAgICAgIG1fY29udHJvbGxl
ciA9IG5ldyBDb21wbGV4VGV4dENvbnRyb2xsZXIoJm1fZm9udCwgbV9ydW4sIHRydWUpOworICAg
IH0KKyAgICB+VGV4dExheW91dCgpCisgICAgeworICAgICAgICBkZWxldGUgbV9jb250cm9sbGVy
OworICAgIH0KKworICAgIGZsb2F0IHdpZHRoKHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbikK
KyAgICB7CisgICAgICAgIG1fY29udHJvbGxlci0+YWR2YW5jZShmcm9tLCAwLCB0cnVlKTsKKyAg
ICAgICAgZmxvYXQgYmVmb3JlV2lkdGggPSBtX2NvbnRyb2xsZXItPnJ1bldpZHRoU29GYXIoKTsK
KyAgICAgICAgbV9jb250cm9sbGVyLT5hZHZhbmNlKGZyb20gKyBsZW4sIDAsIHRydWUpOworICAg
ICAgICBmbG9hdCBhZnRlcldpZHRoID0gbV9jb250cm9sbGVyLT5ydW5XaWR0aFNvRmFyKCk7Cisg
ICAgICAgIHJldHVybiBhZnRlcldpZHRoIC0gYmVmb3JlV2lkdGg7CisgICAgfQorCitwcml2YXRl
OgorICAgIEZvbnQgbV9mb250OworICAgIFRleHRSdW4gbV9ydW47CisgICAgQ29tcGxleFRleHRD
b250cm9sbGVyKiBtX2NvbnRyb2xsZXI7Cit9OworCitQYXNzT3duUHRyPFRleHRMYXlvdXQ+IEZv
bnQ6OmNyZWF0ZUxheW91dChSZW5kZXJUZXh0KiB0ZXh0LCBmbG9hdCB4UG9zLCBib29sIGNvbGxh
cHNlV2hpdGVTcGFjZSkgY29uc3QKK3sKKyNpZiBVU0UoQ09SRV9URVhUKQorI2lmIFVTRShBVFNV
SSkKKyAgICBpZiAoc2hvdWxkVXNlQVRTVUlBUEkoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7
CisjZW5kaWYKKyAgICBpZiAoY29sbGFwc2VXaGl0ZVNwYWNlICYmIFRleHRMYXlvdXQ6OmlzTmVl
ZGVkKHRleHQsICp0aGlzKSkKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUZXh0TGF5b3V0
KHRleHQsICp0aGlzLCB4UG9zKSk7CisjZW5kaWYKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwor
dm9pZCBGb250OjpkZXN0cm95TGF5b3V0KFRleHRMYXlvdXQqIGxheW91dCkKK3sKKyAgICBkZWxl
dGUgbGF5b3V0OworfQorCitmbG9hdCBGb250Ojp3aWR0aChUZXh0TGF5b3V0JiBsYXlvdXQsIHVu
c2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworICAgIHJldHVybiBsYXlvdXQud2lkdGgoZnJv
bSwgdG8pOworfQorCiBzdGF0aWMgaW5saW5lIENHRmxvYXQgcm91bmRDR0Zsb2F0KENHRmxvYXQg
ZikKIHsKICAgICBpZiAoc2l6ZW9mKENHRmxvYXQpID09IHNpemVvZihmbG9hdCkpCkBAIC01OSw2
ICsxMjcsNyBAQCBzdGF0aWMgaW5saW5lIENHRmxvYXQgY2VpbENHRmxvYXQoQ0dGbG9hCiBDb21w
bGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcihjb25zdCBGb250KiBmb250
LCBjb25zdCBUZXh0UnVuJiBydW4sIGJvb2wgbWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24s
IEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cywgYm9vbCBmb3JU
ZXh0RW1waGFzaXMpCiAgICAgOiBtX2ZvbnQoKmZvbnQpCiAgICAgLCBtX3J1bihydW4pCisgICAg
LCBtX2x0ck9ubHkodHJ1ZSkKICAgICAsIG1fbWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24o
bWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24pCiAgICAgLCBtX2ZvclRleHRFbXBoYXNpcyhm
b3JUZXh0RW1waGFzaXMpCiAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXIoMCkKQEAgLTM2NCwxNSAr
NDMzLDE3IEBAIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMKICAgICAs
IG1fY2hhcmFjdGVycyhjaGFyYWN0ZXJzKQogICAgICwgbV9zdHJpbmdMb2NhdGlvbihzdHJpbmdM
b2NhdGlvbikKICAgICAsIG1fc3RyaW5nTGVuZ3RoKHN0cmluZ0xlbmd0aCkKKyAgICAsIG1faW5k
ZXhCZWdpbihzdHJpbmdMb2NhdGlvbikKICAgICAsIG1faW5kZXhFbmQoc3RyaW5nTGVuZ3RoKQor
ICAgICwgbV9sdHIobHRyKQogICAgICwgbV9pc01vbm90b25pYyh0cnVlKQogewogI2lmIFVTRShD
T1JFX1RFWFQpICYmIFVTRShBVFNVSSkKLSAgICBzaG91bGRVc2VBVFNVSUFQSSgpID8gY3JlYXRl
VGV4dFJ1bkZyb21Gb250RGF0YUFUU1VJKGx0cikgOiBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRh
Q29yZVRleHQobHRyKTsKKyAgICBzaG91bGRVc2VBVFNVSUFQSSgpID8gY3JlYXRlVGV4dFJ1bkZy
b21Gb250RGF0YUFUU1VJKCkgOiBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQoKTsK
ICNlbGlmIFVTRShBVFNVSSkKLSAgICBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkobHRy
KTsKKyAgICBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoKTsKICNlbGlmIFVTRShDT1JF
X1RFWFQpCi0gICAgY3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUNvcmVUZXh0KGx0cik7CisgICAg
Y3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUNvcmVUZXh0KCk7CiAjZW5kaWYKIH0KIApAQCAtNDAw
LDI1ICs0NzEsODYgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0Ugog
ICAgIH0KIH0KIAotdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UodW5zaWduZWQg
b2Zmc2V0LCBHbHlwaEJ1ZmZlciogZ2x5cGhCdWZmZXIpCit1bnNpZ25lZCBDb21wbGV4VGV4dENv
bnRyb2xsZXI6OmluZGV4T2ZDdXJyZW50UnVuKHVuc2lnbmVkJiBsZWZ0bW9zdEdseXBoKQorewor
ICAgIGxlZnRtb3N0R2x5cGggPSAwOworICAgIAorICAgIHNpemVfdCBydW5Db3VudCA9IG1fY29t
cGxleFRleHRSdW5zLnNpemUoKTsKKyAgICBpZiAobV9jdXJyZW50UnVuID49IHJ1bkNvdW50KQor
ICAgICAgICByZXR1cm4gcnVuQ291bnQ7CisKKyAgICBpZiAobV9sdHJPbmx5KSB7CisgICAgICAg
IGZvciAodW5zaWduZWQgciA9IDA7IHIgPCBtX2N1cnJlbnRSdW47ICsrcikgeworICAgICAgICAg
ICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhUZXh0UnVuID0gKm1fY29tcGxleFRleHRS
dW5zW3JdOworICAgICAgICAgICAgbGVmdG1vc3RHbHlwaCArPSBjb21wbGV4VGV4dFJ1bi5nbHlw
aENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1fY3VycmVudFJ1bjsKKyAgICB9
CisKKyAgICB3aGlsZSAobV9ydW5JbmRpY2VzLnNpemUoKSA8PSBtX2N1cnJlbnRSdW4pIHsKKyAg
ICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKCFtX3J1bkluZGljZXMuaXNF
bXB0eSgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCByID0gbV9ydW5JbmRpY2VzLmxhc3QoKTsK
KyAgICAgICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBjdXJyZW50VGV4dFJ1biA9ICptX2Nv
bXBsZXhUZXh0UnVuc1tyXTsKKyAgICAgICAgICAgIG9mZnNldCA9IGN1cnJlbnRUZXh0UnVuLnN0
cmluZ0xvY2F0aW9uKCkgKyBjdXJyZW50VGV4dFJ1bi5pbmRleEVuZCgpOworICAgICAgICB9CisK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBxID0gMDsgcSA8IHJ1bkNvdW50OyArK3EpIHsKKyAgICAg
ICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBjb21wbGV4VGV4dFJ1biA9ICptX2NvbXBsZXhU
ZXh0UnVuc1txXTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gY29tcGxleFRleHRSdW4uc3Ry
aW5nTG9jYXRpb24oKSArIGNvbXBsZXhUZXh0UnVuLmluZGV4QmVnaW4oKSkgeworICAgICAgICAg
ICAgICAgIG1fcnVuSW5kaWNlcy5hcHBlbmQocSk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCByID0gbV9ydW5J
bmRpY2VzW21fY3VycmVudFJ1bl07CisgICAgZm9yICh1bnNpZ25lZCBxID0gMDsgcSA8IHI7ICsr
cSkgeworICAgICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY29tcGxleFRleHRSdW4gPSAqbV9j
b21wbGV4VGV4dFJ1bnNbcV07CisgICAgICAgIGxlZnRtb3N0R2x5cGggKz0gY29tcGxleFRleHRS
dW4uZ2x5cGhDb3VudCgpOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKwordW5zaWduZWQgQ29t
cGxleFRleHRDb250cm9sbGVyOjppbmNyZW1lbnRDdXJyZW50UnVuKHVuc2lnbmVkJiBsZWZ0bW9z
dEdseXBoKQoreworICAgIGlmIChtX2x0ck9ubHkpIHsKKyAgICAgICAgY29uc3QgQ29tcGxleFRl
eHRSdW4mIGN1cnJlbnRUZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW21fY3VycmVudFJ1bisr
XTsKKyAgICAgICAgbGVmdG1vc3RHbHlwaCArPSBjdXJyZW50VGV4dFJ1bi5nbHlwaENvdW50KCk7
CisgICAgICAgIHJldHVybiBtX2N1cnJlbnRSdW47CisgICAgfQorCisgICAgbV9jdXJyZW50UnVu
Kys7CisgICAgbGVmdG1vc3RHbHlwaCA9IDA7CisgICAgcmV0dXJuIGluZGV4T2ZDdXJyZW50UnVu
KGxlZnRtb3N0R2x5cGgpOworfQorCit2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5j
ZSh1bnNpZ25lZCBvZmZzZXQsIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgYm9vbCBieVdob2xl
R2x5cGhzKQogewogICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KG9mZnNldCkgPiBtX2VuZCkKICAg
ICAgICAgb2Zmc2V0ID0gbV9lbmQ7CiAKLSAgICBpZiAob2Zmc2V0IDw9IG1fY3VycmVudENoYXJh
Y3RlcikKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChvZmZzZXQgPD0gbV9jdXJyZW50Q2hhcmFj
dGVyKSB7CisgICAgICAgIG1fcnVuV2lkdGhTb0ZhciA9IG1fbGVhZGluZ0V4cGFuc2lvbjsKKyAg
ICAgICAgbV9udW1HbHlwaHNTb0ZhciA9IDA7CisgICAgICAgIG1fY3VycmVudFJ1biA9IDA7Cisg
ICAgICAgIG1fZ2x5cGhJbkN1cnJlbnRSdW4gPSAwOworICAgICAgICBtX2NoYXJhY3RlckluQ3Vy
cmVudEdseXBoID0gMDsKKyAgICB9CiAKICAgICBtX2N1cnJlbnRDaGFyYWN0ZXIgPSBvZmZzZXQ7
CiAKICAgICBzaXplX3QgcnVuQ291bnQgPSBtX2NvbXBsZXhUZXh0UnVucy5zaXplKCk7CiAKLSAg
ICBib29sIGx0ciA9IG1fcnVuLmx0cigpOwotCi0gICAgdW5zaWduZWQgayA9IGx0ciA/IG1fbnVt
R2x5cGhzU29GYXIgOiBtX2FkanVzdGVkR2x5cGhzLnNpemUoKSAtIDEgLSBtX251bUdseXBoc1Nv
RmFyOworICAgIHVuc2lnbmVkIGxlZnRtb3N0R2x5cGggPSAwOworICAgIHVuc2lnbmVkIHIgPSBp
bmRleE9mQ3VycmVudFJ1bihsZWZ0bW9zdEdseXBoKTsKICAgICB3aGlsZSAobV9jdXJyZW50UnVu
IDwgcnVuQ291bnQpIHsKLSAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhUZXh0
UnVuID0gKm1fY29tcGxleFRleHRSdW5zW2x0ciA/IG1fY3VycmVudFJ1biA6IHJ1bkNvdW50IC0g
MSAtIG1fY3VycmVudFJ1bl07CisgICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBjb21wbGV4
VGV4dFJ1biA9ICptX2NvbXBsZXhUZXh0UnVuc1tyXTsKKyAgICAgICAgYm9vbCBsdHIgPSBjb21w
bGV4VGV4dFJ1bi5sdHIoKTsKICAgICAgICAgc2l6ZV90IGdseXBoQ291bnQgPSBjb21wbGV4VGV4
dFJ1bi5nbHlwaENvdW50KCk7CiAgICAgICAgIHVuc2lnbmVkIGcgPSBsdHIgPyBtX2dseXBoSW5D
dXJyZW50UnVuIDogZ2x5cGhDb3VudCAtIDEgLSBtX2dseXBoSW5DdXJyZW50UnVuOworICAgICAg
ICB1bnNpZ25lZCBrID0gbGVmdG1vc3RHbHlwaCArIGc7CisKICAgICAgICAgd2hpbGUgKG1fZ2x5
cGhJbkN1cnJlbnRSdW4gPCBnbHlwaENvdW50KSB7CiAgICAgICAgICAgICB1bnNpZ25lZCBnbHlw
aFN0YXJ0T2Zmc2V0ID0gY29tcGxleFRleHRSdW4uaW5kZXhBdChnKTsKICAgICAgICAgICAgIHVu
c2lnbmVkIGdseXBoRW5kT2Zmc2V0OwpAQCAtNDQ3LDYgKzU3OSw5IEBAIHZvaWQgQ29tcGxleFRl
eHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2kKICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZXJl
IGFyZSBtdWx0aXBsZSBnbHlwaHMgcGVyIGNoYXJhY3RlciB3ZSBuZWVkIHRvIGFkdmFuY2UgYnkg
dGhlIGZ1bGwgd2lkdGggb2YgdGhlIGdseXBoLgogICAgICAgICAgICAgICAgIEFTU0VSVChtX2No
YXJhY3RlckluQ3VycmVudEdseXBoID09IG9sZENoYXJhY3RlckluQ3VycmVudEdseXBoKTsKICAg
ICAgICAgICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0gYWRqdXN0ZWRBZHZhbmNlLndpZHRoOwor
ICAgICAgICAgICAgfSBlbHNlIGlmIChieVdob2xlR2x5cGhzKSB7CisgICAgICAgICAgICAgICAg
aWYgKCFvbGRDaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCkKKyAgICAgICAgICAgICAgICAgICAgbV9y
dW5XaWR0aFNvRmFyICs9IGFkanVzdGVkQWR2YW5jZS53aWR0aDsKICAgICAgICAgICAgIH0gZWxz
ZQogICAgICAgICAgICAgICAgIG1fcnVuV2lkdGhTb0ZhciArPSBhZGp1c3RlZEFkdmFuY2Uud2lk
dGggKiAobV9jaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCAtIG9sZENoYXJhY3RlckluQ3VycmVudEds
eXBoKSAvIChnbHlwaEVuZE9mZnNldCAtIGdseXBoU3RhcnRPZmZzZXQpOwogCkBAIC00NjQsMTAg
KzU5OSwxMCBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSh1bnNpCiAgICAg
ICAgICAgICAgICAgay0tOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1fY3Vy
cmVudFJ1bisrOworICAgICAgICByID0gaW5jcmVtZW50Q3VycmVudFJ1bihsZWZ0bW9zdEdseXBo
KTsKICAgICAgICAgbV9nbHlwaEluQ3VycmVudFJ1biA9IDA7CiAgICAgfQotICAgIGlmICghbHRy
ICYmIG1fbnVtR2x5cGhzU29GYXIgPT0gbV9hZGp1c3RlZEFkdmFuY2VzLnNpemUoKSkKKyAgICBp
ZiAoIW1fcnVuLmx0cigpICYmIG1fbnVtR2x5cGhzU29GYXIgPT0gbV9hZGp1c3RlZEFkdmFuY2Vz
LnNpemUoKSkKICAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IG1fZmluYWxSb3VuZGluZ1dpZHRo
OwogfQogCkBAIC00ODEsNiArNjE2LDkgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFk
anVzdEdseXBocwogICAgICAgICB1bnNpZ25lZCBnbHlwaENvdW50ID0gY29tcGxleFRleHRSdW4u
Z2x5cGhDb3VudCgpOwogICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBj
b21wbGV4VGV4dFJ1bi5mb250RGF0YSgpOwogCisgICAgICAgIGlmICghY29tcGxleFRleHRSdW4u
bHRyKCkpCisgICAgICAgICAgICBtX2x0ck9ubHkgPSBmYWxzZTsKKwogICAgICAgICBjb25zdCBD
R0dseXBoKiBnbHlwaHMgPSBjb21wbGV4VGV4dFJ1bi5nbHlwaHMoKTsKICAgICAgICAgY29uc3Qg
Q0dTaXplKiBhZHZhbmNlcyA9IGNvbXBsZXhUZXh0UnVuLmFkdmFuY2VzKCk7CiAKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29t
cGxleFRleHRDb250cm9sbGVyLmgJKHJldmlzaW9uIDExNjU3MikKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtNjIsNyArNjIsNyBAQCBwdWJsaWM6CiAgICAgQ29tcGxleFRleHRDb250cm9sbGVy
KGNvbnN0IEZvbnQqLCBjb25zdCBUZXh0UnVuJiwgYm9vbCBtYXlVc2VOYXR1cmFsV3JpdGluZ0Rp
cmVjdGlvbiA9IGZhbHNlLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNr
Rm9udHMgPSAwLCBib29sIGZvclRleHRFbXBoYXNpcyA9IGZhbHNlKTsKIAogICAgIC8vIEFkdmFu
Y2UgYW5kIGVtaXQgZ2x5cGhzIHVwIHRvIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyLgotICAgIHZv
aWQgYWR2YW5jZSh1bnNpZ25lZCB0bywgR2x5cGhCdWZmZXIqID0gMCk7CisgICAgdm9pZCBhZHZh
bmNlKHVuc2lnbmVkIHRvLCBHbHlwaEJ1ZmZlciogPSAwLCBib29sIGJ5V2hvbGVHbHlwaHMgPSBm
YWxzZSk7CiAKICAgICAvLyBDb21wdXRlIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGZvciBhIGdpdmVu
IHggY29vcmRpbmF0ZS4KICAgICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb24oZmxvYXQgeCwgYm9vbCBp
bmNsdWRlUGFydGlhbEdseXBocyk7CkBAIC0xMDcsMjEgKzEwNywyMyBAQCBwcml2YXRlOgogICAg
ICAgICB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nTG9j
YXRpb247IH0KICAgICAgICAgc2l6ZV90IHN0cmluZ0xlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1f
c3RyaW5nTGVuZ3RoOyB9CiAgICAgICAgIEFMV0FZU19JTkxJTkUgQ0ZJbmRleCBpbmRleEF0KHNp
emVfdCBpKSBjb25zdDsKKyAgICAgICAgQ0ZJbmRleCBpbmRleEJlZ2luKCkgY29uc3QgeyByZXR1
cm4gbV9pbmRleEJlZ2luOyB9CiAgICAgICAgIENGSW5kZXggaW5kZXhFbmQoKSBjb25zdCB7IHJl
dHVybiBtX2luZGV4RW5kOyB9CiAgICAgICAgIENGSW5kZXggZW5kT2Zmc2V0QXQoc2l6ZV90IGkp
IGNvbnN0IHsgQVNTRVJUKCFtX2lzTW9ub3RvbmljKTsgcmV0dXJuIG1fZ2x5cGhFbmRPZmZzZXRz
W2ldOyB9CiAgICAgICAgIGNvbnN0IENHR2x5cGgqIGdseXBocygpIGNvbnN0IHsgcmV0dXJuIG1f
Z2x5cGhzOyB9CiAgICAgICAgIGNvbnN0IENHU2l6ZSogYWR2YW5jZXMoKSBjb25zdCB7IHJldHVy
biBtX2FkdmFuY2VzOyB9CisgICAgICAgIGJvb2wgbHRyKCkgY29uc3QgeyByZXR1cm4gbV9sdHI7
IH0KICAgICAgICAgYm9vbCBpc01vbm90b25pYygpIGNvbnN0IHsgcmV0dXJuIG1faXNNb25vdG9u
aWM7IH0KICAgICAgICAgdm9pZCBzZXRJc05vbk1vbm90b25pYygpOwogCiAgICAgcHJpdmF0ZToK
ICNpZiBVU0UoQ09SRV9URVhUKQogICAgICAgICBDb21wbGV4VGV4dFJ1bihDVFJ1blJlZiwgY29u
c3QgU2ltcGxlRm9udERhdGEqLCBjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgc3Ry
aW5nTG9jYXRpb24sIHNpemVfdCBzdHJpbmdMZW5ndGgsIENGUmFuZ2UgcnVuUmFuZ2UpOwotICAg
ICAgICB2b2lkIGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dChib29sIGx0cik7Cisg
ICAgICAgIHZvaWQgY3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUNvcmVUZXh0KCk7CiAjZW5kaWYK
ICNpZiBVU0UoQVRTVUkpCiAgICAgICAgIENvbXBsZXhUZXh0UnVuKEFUU1VUZXh0TGF5b3V0LCBj
b25zdCBTaW1wbGVGb250RGF0YSosIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBz
dHJpbmdMb2NhdGlvbiwgc2l6ZV90IHN0cmluZ0xlbmd0aCwgYm9vbCBsdHIsIGJvb2wgZGlyZWN0
aW9uYWxPdmVycmlkZSk7Ci0gICAgICAgIHZvaWQgY3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUFU
U1VJKGJvb2wgbHRyKTsKKyAgICAgICAgdm9pZCBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRT
VUkoKTsKICNlbmRpZgogICAgICAgICBDb21wbGV4VGV4dFJ1bihjb25zdCBTaW1wbGVGb250RGF0
YSosIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbiwgc2l6
ZV90IHN0cmluZ0xlbmd0aCwgYm9vbCBsdHIpOwogCkBAIC0xNDEsMTIgKzE0MywxNCBAQCBwcml2
YXRlOgogI2lmIFVTRShBVFNVSSkKICAgICAgICAgVmVjdG9yPENGSW5kZXgsIDY0PiBtX2F0c3Vp
SW5kaWNlczsKICNlbmRpZgorICAgICAgICBDRkluZGV4IG1faW5kZXhCZWdpbjsKICAgICAgICAg
Q0ZJbmRleCBtX2luZGV4RW5kOwogICAgICAgICBWZWN0b3I8Q0ZJbmRleCwgNjQ+IG1fZ2x5cGhF
bmRPZmZzZXRzOwogICAgICAgICBWZWN0b3I8Q0dHbHlwaCwgNjQ+IG1fZ2x5cGhzVmVjdG9yOwog
ICAgICAgICBjb25zdCBDR0dseXBoKiBtX2dseXBoczsKICAgICAgICAgVmVjdG9yPENHU2l6ZSwg
NjQ+IG1fYWR2YW5jZXNWZWN0b3I7CiAgICAgICAgIGNvbnN0IENHU2l6ZSogbV9hZHZhbmNlczsK
KyAgICAgICAgYm9vbCBtX2x0cjsKICNpZiBVU0UoQVRTVUkpCiAgICAgICAgIGJvb2wgbV9kaXJl
Y3Rpb25hbE92ZXJyaWRlOwogI2VuZGlmCkBAIC0xNjIsOCArMTY2LDEzIEBAIHByaXZhdGU6CiAg
ICAgdm9pZCBjb2xsZWN0Q29tcGxleFRleHRSdW5zRm9yQ2hhcmFjdGVyc0NvcmVUZXh0KGNvbnN0
IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbiwgY29uc3Qg
U2ltcGxlRm9udERhdGEqKTsKICAgICB2b2lkIGFkanVzdEdseXBoc0FuZEFkdmFuY2VzKCk7CiAK
KyAgICB1bnNpZ25lZCBpbmRleE9mQ3VycmVudFJ1bih1bnNpZ25lZCYgbGVmdG1vc3RHbHlwaCk7
CisgICAgdW5zaWduZWQgaW5jcmVtZW50Q3VycmVudFJ1bih1bnNpZ25lZCYgbGVmdG1vc3RHbHlw
aCk7CisgICAgVmVjdG9yPHVuc2lnbmVkLCAxNj4gbV9ydW5JbmRpY2VzOworCiAgICAgY29uc3Qg
Rm9udCYgbV9mb250OwogICAgIGNvbnN0IFRleHRSdW4mIG1fcnVuOworICAgIGJvb2wgbV9sdHJP
bmx5OwogICAgIGJvb2wgbV9tYXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbjsKICAgICBib29s
IG1fZm9yVGV4dEVtcGhhc2lzOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQVRTVUkuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJB
VFNVSS5jcHAJKHJldmlzaW9uIDExNjU3MikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJBVFNVSS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTE0Nyw4ICsxNDcsMTAgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1
bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0
aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9zdHJpbmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQor
ICAgICwgbV9pbmRleEJlZ2luKDApCiAgICAgLCBtX2luZGV4RW5kKHN0cmluZ0xlbmd0aCkKICAg
ICAsIG1fZGlyZWN0aW9uYWxPdmVycmlkZShkaXJlY3Rpb25hbE92ZXJyaWRlKQorICAgICwgbV9s
dHIobHRyKQogICAgICwgbV9pc01vbm90b25pYyh0cnVlKQogewogICAgIE9TU3RhdHVzIHN0YXR1
czsKQEAgLTIyMiw3ICsyMjQsNyBAQCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0
UnVuOjpDCiAgICAgc3RhdHVzID0gQVRTVURpc3Bvc2VUZXh0TGF5b3V0KGF0c3VUZXh0TGF5b3V0
KTsKIH0KIAotdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpjcmVh
dGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoYm9vbCBsdHIpCit2b2lkIENvbXBsZXhUZXh0Q29u
dHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSSgp
CiB7CiAgICAgbV9hdHN1aUluZGljZXMucmVzZXJ2ZUNhcGFjaXR5KG1fc3RyaW5nTGVuZ3RoKTsK
ICAgICB1bnNpZ25lZCByID0gMDsKQEAgLTIzNyw3ICsyMzksNyBAQCB2b2lkIENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6Q29tcGxleFRleHRSCiAgICAgICAgICAgICByKys7CiAgICAgfQogICAgIG1f
Z2x5cGhDb3VudCA9IG1fYXRzdWlJbmRpY2VzLnNpemUoKTsKLSAgICBpZiAoIWx0cikgeworICAg
IGlmICghbV9sdHIpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCByID0gMCwgZW5kID0gbV9nbHlw
aENvdW50IC0gMTsgciA8IG1fZ2x5cGhDb3VudCAvIDI7ICsrciwgLS1lbmQpCiAgICAgICAgICAg
ICBzdGQ6OnN3YXAobV9hdHN1aUluZGljZXNbcl0sIG1fYXRzdWlJbmRpY2VzW2VuZF0pOwogICAg
IH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4
dENvbnRyb2xsZXJDb3JlVGV4dC5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQubW0JKHJldmlz
aW9uIDExNjU3MikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21w
bGV4VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5tbQkod29ya2luZyBjb3B5KQpAQCAtMTA3LDcgKzEw
Nyw5IEBAIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMKICAgICAsIG1f
Y2hhcmFjdGVycyhjaGFyYWN0ZXJzKQogICAgICwgbV9zdHJpbmdMb2NhdGlvbihzdHJpbmdMb2Nh
dGlvbikKICAgICAsIG1fc3RyaW5nTGVuZ3RoKHN0cmluZ0xlbmd0aCkKKyAgICAsIG1faW5kZXhC
ZWdpbihydW5SYW5nZS5sb2NhdGlvbikKICAgICAsIG1faW5kZXhFbmQocnVuUmFuZ2UubG9jYXRp
b24gKyBydW5SYW5nZS5sZW5ndGgpCisgICAgLCBtX2x0cighKENUUnVuR2V0U3RhdHVzKGN0UnVu
KSAmIGtDVFJ1blN0YXR1c1JpZ2h0VG9MZWZ0KSkKICAgICAsIG1faXNNb25vdG9uaWModHJ1ZSkK
IHsKICAgICBtX2dseXBoQ291bnQgPSBDVFJ1bkdldEdseXBoQ291bnQoY3RSdW4pOwpAQCAtMTM1
LDcgKzEzNyw3IEBAIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMKIAog
Ly8gTWlzc2luZyBnbHlwaHMgcnVuIGNvbnN0cnVjdG9yLiBDb3JlIFRleHQgd2lsbCBub3QgZ2Vu
ZXJhdGUgYSBydW4gb2YgbWlzc2luZyBnbHlwaHMsIGluc3RlYWQgZmFsbGluZyBiYWNrIG9uCiAv
LyBnbHlwaHMgZnJvbSBMYXN0UmVzb3J0LiBXZSB3YW50IHRvIHVzZSB0aGUgcHJpbWFyeSBmb250
J3MgbWlzc2luZyBnbHlwaCBpbiBvcmRlciB0byBtYXRjaCB0aGUgZmFzdCB0ZXh0IGNvZGUgcGF0
aC4KLXZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4
dFJ1bkZyb21Gb250RGF0YUNvcmVUZXh0KGJvb2wgbHRyKQordm9pZCBDb21wbGV4VGV4dENvbnRy
b2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQo
KQogewogICAgIG1fY29yZVRleHRJbmRpY2VzVmVjdG9yLnJlc2VydmVJbml0aWFsQ2FwYWNpdHko
bV9zdHJpbmdMZW5ndGgpOwogICAgIHVuc2lnbmVkIHIgPSAwOwpAQCAtMTUwLDcgKzE1Miw3IEBA
IHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFIKICAgICAgICAgICAgIHIr
KzsKICAgICB9CiAgICAgbV9nbHlwaENvdW50ID0gbV9jb3JlVGV4dEluZGljZXNWZWN0b3Iuc2l6
ZSgpOwotICAgIGlmICghbHRyKSB7CisgICAgaWYgKCFtX2x0cikgewogICAgICAgICBmb3IgKHVu
c2lnbmVkIHIgPSAwLCBlbmQgPSBtX2dseXBoQ291bnQgLSAxOyByIDwgbV9nbHlwaENvdW50IC8g
MjsgKytyLCAtLWVuZCkKICAgICAgICAgICAgIHN0ZDo6c3dhcChtX2NvcmVUZXh0SW5kaWNlc1Zl
Y3RvcltyXSwgbV9jb3JlVGV4dEluZGljZXNWZWN0b3JbZW5kXSk7CiAgICAgfQpJbmRleDogU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHJldmlzaW9uIDExNjU3MikKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC00
OCw2ICs0OCw3IEBAIHN0cnVjdCBCaWRpUnVuOwogc3RydWN0IFBhaW50SW5mbzsKIGNsYXNzIExp
bmVJbmZvOwogY2xhc3MgUmVuZGVyUnVieVJ1bjsKK2NsYXNzIFRleHRMYXlvdXQ7CiAKIHRlbXBs
YXRlIDxjbGFzcyBJdGVyYXRvciwgY2xhc3MgUnVuPiBjbGFzcyBCaWRpUmVzb2x2ZXI7CiB0ZW1w
bGF0ZSA8Y2xhc3MgUnVuPiBjbGFzcyBCaWRpUnVuTGlzdDsKQEAgLTY3Nyw2ICs2NzgsNyBAQCBw
cml2YXRlOgogCiAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxlbWVudGF0aW9u
cyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KICAgICB0eXBlZGVmIHN0ZDo6cGFp
cjxSZW5kZXJUZXh0KiwgTGF6eUxpbmVCcmVha0l0ZXJhdG9yPiBMaW5lQnJlYWtJdGVyYXRvcklu
Zm87CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8UmVuZGVyVGV4dCosIE93blB0cjxUZXh0TGF5b3V0
PiA+IFRleHRMYXlvdXRJbmZvOwogICAgIGNsYXNzIExpbmVCcmVha2VyIHsKICAgICBwdWJsaWM6
CiAgICAgICAgIExpbmVCcmVha2VyKFJlbmRlckJsb2NrKiBibG9jaykKQEAgLTY4NSw3ICs2ODcs
NyBAQCBwcml2YXRlOgogICAgICAgICAgICAgcmVzZXQoKTsKICAgICAgICAgfQogCi0gICAgICAg
IElubGluZUl0ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUlu
Zm8mLCBMaW5lQnJlYWtJdGVyYXRvckluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJv
bVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpOworICAg
ICAgICBJbmxpbmVJdGVyYXRvciBuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExp
bmVJbmZvJiwgTGluZUJyZWFrSXRlcmF0b3JJbmZvJiwgVGV4dExheW91dEluZm8mLCBGbG9hdGlu
Z09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMpOwogCiAgICAgICAgIGJvb2wgbGluZVdhc0h5cGhlbmF0ZWQoKSB7IHJl
dHVybiBtX2h5cGhlbmF0ZWQ7IH0KICAgICAgICAgY29uc3QgVmVjdG9yPFJlbmRlckJveCo+JiBw
b3NpdGlvbmVkT2JqZWN0cygpIHsgcmV0dXJuIG1fcG9zaXRpb25lZE9iamVjdHM7IH0KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQu
Y3BwCShyZXZpc2lvbiAxMTY1NzIpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2tMaW5lTGF5b3V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTIyNyw2ICsxMjI3LDcgQEAg
dm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUgogICAgIElubGluZUl0ZXJh
dG9yIGVuZCA9IHJlc29sdmVyLnBvc2l0aW9uKCk7CiAgICAgYm9vbCBjaGVja0ZvckVuZExpbmVN
YXRjaCA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsKICAgICBMaW5lQnJlYWtJdGVyYXRvckluZm8g
bGluZUJyZWFrSXRlcmF0b3JJbmZvOworICAgIFRleHRMYXlvdXRJbmZvIHRleHRMYXlvdXRJbmZv
OwogICAgIFZlcnRpY2FsUG9zaXRpb25DYWNoZSB2ZXJ0aWNhbFBvc2l0aW9uQ2FjaGU7CiAKICAg
ICBMaW5lQnJlYWtlciBsaW5lQnJlYWtlcih0aGlzKTsKQEAgLTEyNDksNyArMTI1MCw3IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblIKICAgICAgICAgY29uc3QgSW5s
aW5lSXRlcmF0b3Igb2xkRW5kID0gZW5kOwogICAgICAgICBib29sIGlzTmV3VUJBUGFyYWdyYXBo
ID0gbGF5b3V0U3RhdGUubGluZUluZm8oKS5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKTsKICAg
ICAgICAgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUgPSAobV9mbG9h
dGluZ09iamVjdHMgJiYgIW1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKS5pc0VtcHR5KCkpID8gbV9m
bG9hdGluZ09iamVjdHMtPnNldCgpLmxhc3QoKSA6IDA7Ci0gICAgICAgIGVuZCA9IGxpbmVCcmVh
a2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIGxpbmVC
cmVha0l0ZXJhdG9ySW5mbywgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMpOworICAgICAgICBlbmQgPSBsaW5lQnJlYWtlci5uZXh0TGluZUJyZWFr
KHJlc29sdmVyLCBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLCBsaW5lQnJlYWtJdGVyYXRvckluZm8s
IHRleHRMYXlvdXRJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcyk7CiAgICAgICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkp
IHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgY3JlYXRpbmcgYW55IHJ1
bnMgaW4gbmV4dExpbmVCcmVhayB0byBiZWdpbiB3aXRoIQogICAgICAgICAgICAgLy8gT25jZSBC
aWRpUnVuTGlzdCBpcyBzZXBhcmF0ZWQgZnJvbSBCaWRpUmVzb2x2ZXIgdGhpcyB3aWxsIG5vdCBi
ZSBuZWVkZWQuCkBAIC0xOTM4LDExICsxOTM5LDE0IEBAIHN0YXRpYyBib29sIHNob3VsZFNraXBX
aGl0ZXNwYWNlQWZ0ZXJTdGEKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUg
ZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQqIHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVk
IGxlbiwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJv
b2wgY29sbGFwc2VXaGl0ZVNwYWNlKQorc3RhdGljIGlubGluZSBmbG9hdCB0ZXh0V2lkdGgoUmVu
ZGVyVGV4dCogdGV4dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250JiBm
b250LCBmbG9hdCB4UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3Bh
Y2UsIFRleHRMYXlvdXQqIGxheW91dCA9IDApCiB7CiAgICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAo
IWZyb20gJiYgbGVuID09IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgdGV4dC0+c3R5bGUoKS0+aGFz
VGV4dENvbWJpbmUoKSkKICAgICAgICAgcmV0dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9u
dCwgeFBvcyk7CiAKKyAgICBpZiAobGF5b3V0KQorICAgICAgICByZXR1cm4gRm9udDo6d2lkdGgo
KmxheW91dCwgZnJvbSwgbGVuKTsKKwogICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNv
bnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpICsgZnJvbSwgbGVu
LCB0ZXh0LT5zdHlsZSgpKTsKICAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0
TGVuZ3RoKCkgLSBmcm9tKTsKICAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+PSBy
dW4ubGVuZ3RoKCkpOwpAQCAtMjEwNSw3ICsyMTA5LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6TGlu
ZUJyZWFrZXI6OnJlc2V0KCkKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVC
cmVha2VyOjpuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJ
bmZvJiBsaW5lSW5mbywKLSAgICBMaW5lQnJlYWtJdGVyYXRvckluZm8mIGxpbmVCcmVha0l0ZXJh
dG9ySW5mbywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2ln
bmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKQorICAgIExpbmVCcmVha0l0ZXJhdG9ySW5m
byYgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCBUZXh0TGF5b3V0SW5mbyYgdGV4dExheW91dEluZm8s
IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKIHsKICAgICByZXNldCgpOwogCkBAIC0yMzQ0LDYgKzIz
NDgsMTIgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAg
ICAgICAgICAgIEFTU0VSVChjdXJyZW50Lm1fcG9zID09IHQtPnRleHRMZW5ndGgoKSk7CiAgICAg
ICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICh0ZXh0TGF5b3V0SW5mby5maXJzdCAhPSB0KSB7
CisgICAgICAgICAgICAgICAgdGV4dExheW91dEluZm8uZmlyc3QgPSB0OworICAgICAgICAgICAg
ICAgIHRleHRMYXlvdXRJbmZvLnNlY29uZCA9IGYuY3JlYXRlTGF5b3V0KHQsIHdpZHRoLmN1cnJl
bnRXaWR0aCgpLCBjb2xsYXBzZVdoaXRlU3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgVGV4dExheW91dCogdGV4dExheW91dCA9IHRleHRMYXlvdXRJbmZvLnNlY29uZC5nZXQoKTsK
KwogICAgICAgICAgICAgZm9yICg7IGN1cnJlbnQubV9wb3MgPCB0LT50ZXh0TGVuZ3RoKCk7IGN1
cnJlbnQuZmFzdEluY3JlbWVudEluVGV4dE5vZGUoKSkgewogICAgICAgICAgICAgICAgIGJvb2wg
cHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlID0gY3VycmVudENoYXJhY3RlcklzU3BhY2U7CiAgICAg
ICAgICAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzV1MgPSBjdXJyZW50Q2hhcmFjdGVy
SXNXUzsKQEAgLTIzNjUsNyArMjM3NSw3IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpM
aW5lQnJlYWtlcjoKICAgICAgICAgICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29yZHMp
ICYmICFtaWRXb3JkQnJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgd3JhcFcgKz0gY2hhcldp
ZHRoOwogICAgICAgICAgICAgICAgICAgICBib29sIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9n
YXRlUGFpciA9IFUxNl9JU19MRUFEKGMpICYmIGN1cnJlbnQubV9wb3MgKyAxIDwgdC0+dGV4dExl
bmd0aCgpICYmIFUxNl9JU19UUkFJTCh0LT5jaGFyYWN0ZXJzKClbY3VycmVudC5tX3BvcyArIDFd
KTsKLSAgICAgICAgICAgICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQu
bV9wb3MsIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmLCB3aWR0
aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNw
YWNlKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJl
bnQubV9wb3MsIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmLCB3
aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0
ZVNwYWNlLCB0ZXh0TGF5b3V0KTsKICAgICAgICAgICAgICAgICAgICAgbWlkV29yZEJyZWFrID0g
d2lkdGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBXICsgY2hhcldpZHRoID4gd2lkdGguYXZhaWxh
YmxlV2lkdGgoKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTIzOTYsOSArMjQwNiw5IEBAIElu
bGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKIAogICAgICAgICAgICAgICAg
ICAgICBmbG9hdCBhZGRpdGlvbmFsVG1wVzsKICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRU
cmFpbGluZ1NwYWNlV2lkdGggJiYgY3VycmVudENoYXJhY3RlcklzU3BhY2UpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1
cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNG
aXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpIC0gd29yZFRyYWlsaW5nU3BhY2VXaWR0aCAr
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25h
bFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1fcG9zICsgMSAtIGxhc3RT
cGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0
ZVNwYWNlLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggKyBsYXN0U3BhY2VX
b3JkU3BhY2luZzsKICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAg
ICAgICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1f
cG9zIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBj
b2xsYXBzZVdoaXRlU3BhY2UpICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7CisgICAgICAgICAgICAg
ICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJl
bnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0
Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgdGV4dExheW91dCkgKyBsYXN0U3BhY2VXb3JkU3BhY2lu
ZzsKICAgICAgICAgICAgICAgICAgICAgd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlv
bmFsVG1wVyk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghYXBwbGllZFN0YXJ0V2lkdGgpIHsK
ICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5l
TG9naWNhbFdpZHRoKGN1cnJlbnQubV9vYmosIHRydWUsIGZhbHNlKSk7CkBAIC0yNDE1LDcgKzI0
MjUsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4KICAg
ICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBmYWxzZTsKICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aC5maXRzT25MaW5lKCkgJiYgY3VycmVudENoYXJh
Y3RlcklzV1MgJiYgY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSAmJiAh
bWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2hhcldp
ZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3MsIDEsIGYsIHdpZHRoLmN1cnJlbnRXaWR0
aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgKyAoYXBwbHlXb3JkU3BhY2lu
ZyA/IHdvcmRTcGFjaW5nIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQg
Y2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3MsIDEsIGYsIHdpZHRoLmN1cnJl
bnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgdGV4dExheW91dCkg
KyAoYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMCk7CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGluZSBpcyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUg
ZXh0cmEgc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9m
IHRoZSBsaW5lLiBJZiBpdCBpcyBub3QsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gSWYgdGhlIGxpbmUgbmVlZHMgdGhlIGV4dHJhIHdoaXRlc3BhY2UgdG8gYmUg
dG9vIGxvbmcsCkBAIC0yNTQxLDcgKzI1NTEsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9j
azo6TGluZUJyZWFrZXI6CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIElNUE9SVEFO
VDogY3VycmVudC5tX3BvcyBpcyA+IGxlbmd0aCBoZXJlIQotICAgICAgICAgICAgZmxvYXQgYWRk
aXRpb25hbFRtcFcgPSBpZ25vcmluZ1NwYWNlcyA/IDAgOiB0ZXh0V2lkdGgodCwgbGFzdFNwYWNl
LCBjdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNG
aXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7Cisg
ICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVG1wVyA9IGlnbm9yaW5nU3BhY2VzID8gMCA6IHRl
eHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRo
LmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgdGV4dExh
eW91dCkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKICAgICAgICAgICAgIHdpZHRoLmFkZFVuY29t
bWl0dGVkV2lkdGgoYWRkaXRpb25hbFRtcFcgKyBpbmxpbmVMb2dpY2FsV2lkdGgoY3VycmVudC5t
X29iaiwgIWFwcGxpZWRTdGFydFdpZHRoLCBpbmNsdWRlRW5kV2lkdGgpKTsKICAgICAgICAgICAg
IGluY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>152485</attachid>
            <date>2012-07-15 23:52:36 -0700</date>
            <delta_ts>2012-07-23 15:43:00 -0700</delta_ts>
            <desc>Changes per review.</desc>
            <filename>83045-Darin.txt</filename>
            <type>text/plain</type>
            <size>32111</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyMjM3NikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc3IEBACisyMDEyLTA3LTEyICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEN1cnJlbnRseSBSZW5kZXJCbG9jazo6TGluZUJyZWFr
ZXI6Om5leHRMaW5lQnJlYWsgYXNzdW1lcyB0aGF0IG1lYXN1cmluZyBpbmRpdmlkdWFsIHdvcmRz
IGlzIGFzIGNoZWFwIGFzIGZyZWUuCisgICAgICAgIFRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4g
ZGVhbGluZyB3aXRoIGNvbXBsZXggdGV4dCwgd2hpY2ggYmVuZWZpdHMgZnJvbSBsYXlpbmcgb3V0
IGFzIG11Y2ggdGV4dCBhcyBwb3NzaWJsZQorICAgICAgICBhbmQgYnkgcmV1c2luZyB0aGF0IGxh
eW91dCB3aGVuIGZlYXNpYmxlOiBieSBkb2luZyBzbyB0aGlzIHBhdGNoIGltcHJvdmVzIGxpbmUg
YnJlYWtpbmcgYnkgMzUlIGFzIG1lYXN1cmVkIHdpdGgKKyAgICAgICAgYSBzaW1wbGUgdGVzdCBh
cHAuCisKKyAgICAgICAgVGhlIGJ1bGsgb2YgdGhpcyBjaGFuZ2UgaXMgbW9kaWZ5aW5nIENvbXBs
ZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSwgd2hpY2ggcHJldmlvdXNseSByZXF1aXJlZCB0aGUg
dGV4dCBvZmZzZXQKKyAgICAgICAgdG8gYmUgc3RyaWN0bHkgaW5jcmVhc2luZyBhbmQgYXNzdW1l
ZCB1bmlkaXJlY3Rpb25hbCB0ZXh0OyBub3cgaXQgc3VwcG9ydHMgcmFuZG9tIHNlZWtpbmcgaW4g
YSBuYWl2ZSBmYXNoaW9uCisgICAgICAgIChieSByZXN0YXJ0aW5nIHRvIHRoZSBiZWdpbm5pbmcp
IGFuZCB0cmF2ZXJzZXMgZ2x5cGhzIGluIGxvZ2ljYWwgb3JkZXIuIEluIHRoZSBsYXR0ZXIgY2Fz
ZSwgdGhlIHByZXNlbmNlIG9mIGFueQorICAgICAgICBub24tTFRSIHJ1bnMgdHJpZ2dlcnMgdGhl
IHBvcHVsYXRpb24gb2YgYSBtYXBwaW5nIGZyb20gbG9naWNhbCB0byB2aXN1YWwgcnVuIGluZGlj
ZXMuIEZpbmFsbHksIGEgbmV3IGZsYWcgaGFzCisgICAgICAgIGJlZW4gYWRkZWQgd2hpY2ggaW5o
aWJpdHMgZ2x5cGggYWR2YW5jZXMgZnJvbSBiZWluZyBzcGxpdCBhY3Jvc3MgbGlnYXR1cmVzICh0
aHVzIGNhdXNpbmcgc3B1cmlvdXMgbGluZSBicmVha3MpLgorCisgICAgICAgIEEgQ29tcGxleFRl
eHRDb250cm9sbGVyIGFuZCBpdHMgYXNzb2NpYXRlZCBUZXh0UnVuIGFuZCBGb250IGFyZSBlbmNh
cHN1bGF0ZWQgaW4gYSBUZXh0TGF5b3V0IG9iamVjdCwgd2hpY2ggaXMKKyAgICAgICAgaW5zdGFu
dGlhdGVkIGFzIGFuIG9wYXF1ZSBvYmplY3QgdmlhIGZ1bmN0aW9ucyB0aGF0IGFyZSBuby1vcHMg
dW5sZXNzIGJ1aWxkaW5nIGZvciBNYWMuIEEgc3RhdGljIG1lbWJlciBmdW5jdGlvbgorICAgICAg
ICAoaXNOZWVkZWQpIGNoZWNrcyB0byBzZWUgd2hldGhlciBhIFRleHRSdW4gaXMgY29tcGxleCwg
aW4gb3JkZXIgdG8gYXZvaWQgbmVlZGxlc3MgaW5zdGFudGlhdGlvbi4gSXQgYWxzbyBiYWlscwor
ICAgICAgICBpZiB0YWJzIHdvdWxkIGJlIGVuYWJsZWQsIHNpbmNlIHBvc2l0aW9uYWwgZWZmZWN0
cyBhcmUgbm90IGN1cnJlbnRseSByZXNwZWN0ZWQgaW4gdGhpcyBtb2RlLiBBbHRob3VnaCB0aGUg
QVRTVUkKKyAgICAgICAgQ29tcGxleFRleHRDb250cm9sbGVyIGltcGxlbWVudGF0aW9uIGhhcyBi
ZWVuIHVwZGF0ZWQgdG8gYWNjb3VudCBmb3IgbmV3bHktYWRkZWQgbWVtYmVyIHZhcmlhYmxlcywg
dGhpcyBuZXcgcGF0aAorICAgICAgICBpcyBvbmx5IGVuYWJsZWQgZm9yIENvcmUgVGV4dC4KKwor
ICAgICAgICBObyBiZWhhdmlvcmFsIGNoYW5nZXMgYXJlIGV4cGVjdGVkIGR1ZSB0byB0aGlzIGNo
YW5nZSwgc28gbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9u
dC5jcHA6CisgICAgICAgIChXVEYpOiBEZWZpbmUgZGVsZXRlT3duZWRQdHIgZm9yIFRleHRMYXlv
dXQgYXMgY2FsbGluZyB0aHJvdWdoIGRlc3Ryb3lMYXlvdXQ7IHJlbHlpbmcgb24gb3BlcmF0b3Ig
ZGVsZXRlIGlzIG5vdCB3b3JrYWJsZSBhcyB0aGUgY2xhc3MgZG9lcyBub3QgZXhpc3Qgb24gYWxs
IHBsYXRmb3Jtcy4KKyAgICAgICAgKFdURjo6V2ViQ29yZTo6VGV4dExheW91dCk6CisgICAgICAg
IChXZWJDb3JlKTogSW1wbGVtZW50IG5vLW9wIFRleHRMYXlvdXQgd3JhcHBlcnMgZm9yIG5vbi1N
YWMgcGxhdGZvcm1zLgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6Y3JlYXRlTGF5b3V0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRlc3Ryb3lMYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6
Rm9udDo6d2lkdGgpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaDoKKyAgICAg
ICAgKFdlYkNvcmUpOiBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIFJlbmRlclRleHQgYW5k
IFRleHRMYXlvdXQuCisgICAgICAgIChGb250KTogQWRkIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3
aXRoIHBvaW50ZXIgdG8gVGV4dExheW91dCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKFdURik6
IERlY2xhcmUgZGVsZXRlT3duZWRQdHIgZm9yIFRleHRMYXlvdXQuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHA6CisgICAgICAgIChUZXh0
TGF5b3V0KTogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjb3JyZXNwb25kcyB0byBhIENvbXBs
ZXhUZXh0Q29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIFRleHRSdW4uCisgICAgICAgIChXZWJD
b3JlOjpUZXh0TGF5b3V0Ojppc05lZWRlZCk6IFVzZWQgYnkgd3JhcHBlciB0byBhdm9pZCBpbnN0
YW50aWF0aW9uIHdoZW4gY29tcGxleCBsYXlvdXQgaXMgbm90IHJlcXVpcmVkLgorICAgICAgICAo
V2ViQ29yZTo6VGV4dExheW91dDo6VGV4dExheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
TGF5b3V0Ojp+VGV4dExheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0TGF5b3V0Ojp3aWR0
aCk6CisgICAgICAgIChXZWJDb3JlKTogSW1wbGVtZW50IHJlYWwgVGV4dExheW91dCB3cmFwcGVy
cyBmb3IgTWFjLgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6Y3JlYXRlTGF5b3V0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkZvbnQ6OmRlc3Ryb3lMYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9u
dDo6d2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21w
bGV4VGV4dENvbnRyb2xsZXIpOiBJbml0aWFsaXplIG1fbHRyT25seS4KKyAgICAgICAgKFdlYkNv
cmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkNvbXBsZXhUZXh0UnVu
KTogSW5pdGlhbGl6ZSBtX2luZGV4QmVnaW4gYW5kIG1fbHRyLgorICAgICAgICAoV2ViQ29yZTo6
Q29tcGxleFRleHRDb250cm9sbGVyOjppbmRleE9mQ3VycmVudFJ1bik6IFJldHVybiAodmlzdWFs
KSBtX2NvbXBsZXhUZXh0UnVucyBpbmRleCBjb3JyZXNwb25kaW5nIHRvIChsb2dpY2FsKSBtX2N1
cnJlbnRSdW4sIGxhemlseSBjb25zdHJ1Y3RpbmcgbV9ydW5JbmRpY2VzIGlmIG5lZWRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6aW5jcmVtZW50Q3VycmVudFJ1
bik6IFJldHVybiBuZXh0IG1fY29tcGxleFRleHRSdW5zIGluZGV4IGluIGxvZ2ljYWwgb3JkZXIu
CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UpOiBBbGxv
dyByZXN0YXJ0aW5nLCBzdXBwb3J0IGZvciBiaWRpIHJlb3JkZXJpbmcsIGFuZCBvcHRpb24gdG8g
bWVhc3VyZSBvbmx5IHdob2xlIGdseXBocyByYXRoZXIgdGhhbiBkaXZpZGluZyBhZHZhbmNlcy4K
KyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWRqdXN0R2x5cGhzQW5k
QWR2YW5jZXMpOiBDbGVhciBtX2x0ck9ubHkgb24gZGV0ZWN0aW5nIGEgUlRMIHJ1bi4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmg6CisgICAg
ICAgIChDb21wbGV4VGV4dENvbnRyb2xsZXIpOiBBZGQgbV9sdHJPbmx5IGluZGljYXRpbmcgbm8g
YmlkaSByZW9yZGVyaW5nLCBhbmQgbV9ydW5JbmRpY2VzIG1hcHBpbmcgZnJvbSBydW5zIChsb2dp
Y2FsIG9yZGVyKSB0byBtX2NvbXBsZXhUZXh0UnVucyAodmlzdWFsIG9yZGVyKS4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmluZGV4QmVn
aW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4
dFJ1bjo6bHRyKToKKyAgICAgICAgKENvbXBsZXhUZXh0UnVuKTogQWRkIG1faW5kZXhCZWdpbiBh
bmQgbV9sdHIuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29u
dHJvbGxlckFUU1VJLmNwcDogSW5pdGlhbGl6ZSBtX2luZGV4QmVnaW4gYW5kIG1fbHRyLCBldmVu
IHRob3VnaCBUZXh0TGF5b3V0IGlzIG5vdCBlbmFibGVkIGZvciBBVFNVSS4KKyAgICAgICAgKFdl
YkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkNvbXBsZXhUZXh0
UnVuKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRl
eHRSdW46OmNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSSk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0Lm1tOiBJbml0aWFs
aXplIG1faW5kZXhCZWdpbiBhbmQgbV9sdHIuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4
dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDb21wbGV4VGV4dFJ1bik6CisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpjcmVhdGVUZXh0
UnVuRnJvbUZvbnREYXRhQ29yZVRleHQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9j
ay5oOiBBZGQgVGV4dExheW91dEluZm8sIG1hcHBpbmcgZnJvbSBSZW5kZXJUZXh0IHRvIChwb3Nz
aWJseSBudWxsKSBUZXh0TGF5b3V0LgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChSZW5k
ZXJCbG9jayk6CisgICAgICAgIChMaW5lQnJlYWtlcik6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlckJsb2NrTGluZUxheW91dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6
bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UpOiBBbGxvdyBUZXh0TGF5b3V0IGluc3RhbmNlIHRv
IGJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gbmV4dExpbmVCcmVhay4KKyAgICAgICAgKFdlYkNv
cmU6OnRleHRXaWR0aCk6IFVzZSBUZXh0TGF5b3V0IHdoZW4gc3VwcGxpZWQgZm9yIG1lYXN1cmlu
Zy4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6bmV4dExpbmVC
cmVhayk6IAorCiAyMDEyLTA3LTEwICBTaW1vbiBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBwbGUu
Y29tPgogCiAgICAgICAgIEFzc2VydGlvbiBBU1NFUlRJT04gRkFJTEVEOiBlbmNsb3NpbmdJbnRS
ZWN0KHJlbmRlcmVyTWFwcGVkUmVzdWx0KSA9PSBlbmNsb3NpbmdJbnRSZWN0KEZsb2F0UXVhZChy
ZXN1bHQpLmJvdW5kaW5nQm94KCkpIHdoZW4gY29tcG9zaXRpbmcgaW4gcGFnaW5hdGVkIG1vZGUK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCShyZXZpc2lv
biAxMjIzNzYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjcsOCArMjcsOSBAQAogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgog
I2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZvbnRUcmFuc2NvZGVyLmgiCi0jaW5j
bHVkZSAiSW50UG9pbnQuaCIKICNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIklu
dFBvaW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJUZXh0UnVu
LmgiCiAjaW5jbHVkZSAiV2lkdGhJdGVyYXRvci5oIgogI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFk
Lmg+CkBAIC0zOSw2ICs0MCwxNiBAQAogdXNpbmcgbmFtZXNwYWNlIFdURjsKIHVzaW5nIG5hbWVz
cGFjZSBVbmljb2RlOwogCituYW1lc3BhY2UgV1RGIHsKKworLy8gYWxsb3cgY29tcGlsYXRpb24g
b2YgT3duUHRyPFRleHRMYXlvdXQ+IGluIHNvdXJjZSBmaWxlcyB0aGF0IGRvbid0IGhhdmUgYWNj
ZXNzIHRvIHRoZSBUZXh0TGF5b3V0IGNsYXNzIGRlZmluaXRpb24KK3RlbXBsYXRlIDw+IHZvaWQg
ZGVsZXRlT3duZWRQdHI8V2ViQ29yZTo6VGV4dExheW91dD4oV2ViQ29yZTo6VGV4dExheW91dCog
cHRyKQoreworICAgIFdlYkNvcmU6OkZvbnQ6OmRlc3Ryb3lMYXlvdXQocHRyKTsKK30KKworfQor
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNvbnN0IHVpbnQ4X3QgRm9udDo6c19yb3VuZGluZ0hh
Y2tDaGFyYWN0ZXJUYWJsZVsyNTZdID0gewpAQCAtMTk3LDYgKzIwOCwyNSBAQCBmbG9hdCBGb250
Ojp3aWR0aChjb25zdCBUZXh0UnVuJiBydW4sIGluCiAgICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JD
b21wbGV4VGV4dChydW4pOwogfQogCisjaWYgIVBMQVRGT1JNKE1BQykKKworUGFzc093blB0cjxU
ZXh0TGF5b3V0PiBGb250OjpjcmVhdGVMYXlvdXQoUmVuZGVyVGV4dCosIGZsb2F0IHhQb3MsIGJv
b2wgY29sbGFwc2VXaGl0ZVNwYWNlKSBjb25zdAoreworICAgIHJldHVybiBudWxscHRyOworfQor
Cit2b2lkIEZvbnQ6OmRlc3Ryb3lMYXlvdXQoVGV4dExheW91dCopCit7Cit9CisKK2Zsb2F0IEZv
bnQ6OndpZHRoKFRleHRMYXlvdXQmLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKKwogRmxvYXRS
ZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewogICAg
IHRvID0gKHRvID09IC0xID8gcnVuLmxlbmd0aCgpIDogdG8pOwpJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAkocmV2aXNpb24gMTIyMzc2KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCSh3b3JraW5nIGNvcHkpCkBAIC01NSw2ICs1
NSw4IEBAIGNsYXNzIEZvbnRTZWxlY3RvcjsKIGNsYXNzIEdseXBoQnVmZmVyOwogY2xhc3MgR2x5
cGhQYWdlVHJlZU5vZGU7CiBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBSZW5kZXJUZXh0
OworY2xhc3MgVGV4dExheW91dDsKIGNsYXNzIFRleHRSdW47CiAKIHN0cnVjdCBHbHlwaERhdGE7
CkBAIC0xMDQsNiArMTA2LDEwIEBAIHB1YmxpYzoKICAgICBmbG9hdCB3aWR0aChjb25zdCBUZXh0
UnVuJiwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCwg
R2x5cGhPdmVyZmxvdyogPSAwKSBjb25zdDsKICAgICBmbG9hdCB3aWR0aChjb25zdCBUZXh0UnVu
JiwgaW50JiBjaGFyc0NvbnN1bWVkLCBTdHJpbmcmIGdseXBoTmFtZSkgY29uc3Q7CiAKKyAgICBQ
YXNzT3duUHRyPFRleHRMYXlvdXQ+IGNyZWF0ZUxheW91dChSZW5kZXJUZXh0KiwgZmxvYXQgeFBv
cywgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpIGNvbnN0OworICAgIHN0YXRpYyB2b2lkIGRlc3Ry
b3lMYXlvdXQoVGV4dExheW91dCopOworICAgIHN0YXRpYyBmbG9hdCB3aWR0aChUZXh0TGF5b3V0
JiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworCiAgICAgaW50IG9mZnNldEZvclBvc2l0
aW9uKGNvbnN0IFRleHRSdW4mLCBmbG9hdCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEds
eXBocykgY29uc3Q7CiAgICAgRmxvYXRSZWN0IHNlbGVjdGlvblJlY3RGb3JUZXh0KGNvbnN0IFRl
eHRSdW4mLCBjb25zdCBGbG9hdFBvaW50JiwgaW50IGgsIGludCBmcm9tID0gMCwgaW50IHRvID0g
LTEpIGNvbnN0OwogCkBAIC0zMTUsNCArMzIxLDEwIEBAIGlubGluZSBmbG9hdCBGb250Ojp0YWJX
aWR0aChjb25zdCBTaW1wbGUKIAogfQogCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGUgPD4g
dm9pZCBkZWxldGVPd25lZFB0cjxXZWJDb3JlOjpUZXh0TGF5b3V0PihXZWJDb3JlOjpUZXh0TGF5
b3V0Kik7CisKK30KKwogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAko
cmV2aXNpb24gMTIyMzc2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFj
L0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDgg
QEAKIAogI2luY2x1ZGUgIkZsb2F0U2l6ZS5oIgogI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRl
ICJSZW5kZXJCbG9jay5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlICJUZXh0
QnJlYWtJdGVyYXRvci5oIgogI2luY2x1ZGUgIlRleHRSdW4uaCIKICNpbmNsdWRlIDxBcHBsaWNh
dGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KQEAgLTQyLDYgKzQ0LDc3IEBAIHVz
aW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgVGV4dExh
eW91dCB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgaXNOZWVkZWQoUmVuZGVyVGV4dCogdGV4
dCwgY29uc3QgRm9udCYgZm9udCkKKyAgICB7CisgICAgICAgIFRleHRSdW4gcnVuID0gUmVuZGVy
QmxvY2s6OmNvbnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpLCB0
ZXh0LT50ZXh0TGVuZ3RoKCksIHRleHQtPnN0eWxlKCkpOworICAgICAgICByZXR1cm4gZm9udC5j
b2RlUGF0aChydW4pID09IEZvbnQ6OkNvbXBsZXg7CisgICAgfQorCisgICAgc3RhdGljIEZvbnQg
Zm9udFdpdGhOb1dvcmRTcGFjaW5nKGNvbnN0IEZvbnQmIG9yaWdpbmFsRm9udCkKKyAgICB7Cisg
ICAgICAgIEZvbnQgZm9udChvcmlnaW5hbEZvbnQpOworICAgICAgICBmb250LnNldFdvcmRTcGFj
aW5nKDApOworICAgICAgICByZXR1cm4gZm9udDsKKyAgICB9CisKKyAgICBzdGF0aWMgVGV4dFJ1
biBjb25zdHJ1Y3RUZXh0UnVuKFJlbmRlclRleHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGZs
b2F0IHhQb3MpCisgICAgeworICAgICAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25z
dHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQtPmNoYXJhY3RlcnMoKSwgdGV4dC0+dGV4dExl
bmd0aCgpLCB0ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgo
dGV4dC0+dGV4dExlbmd0aCgpKTsKKyAgICAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3Ro
KCkgPj0gcnVuLmxlbmd0aCgpKTsKKworICAgICAgICBydW4uc2V0WFBvcyh4UG9zKTsKKyAgICAg
ICAgcmV0dXJuIHJ1bjsKKyAgICB9CisKKyAgICBUZXh0TGF5b3V0KFJlbmRlclRleHQqIHRleHQs
IGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MpCisgICAgICAgIDogbV9mb250KGZvbnRXaXRo
Tm9Xb3JkU3BhY2luZyhmb250KSkKKyAgICAgICAgLCBtX3J1bihjb25zdHJ1Y3RUZXh0UnVuKHRl
eHQsIGZvbnQsIHhQb3MpKQorICAgICAgICAsIG1fY29udHJvbGxlcihhZG9wdFB0cihuZXcgQ29t
cGxleFRleHRDb250cm9sbGVyKCZtX2ZvbnQsIG1fcnVuLCB0cnVlKSkpCisgICAgeworICAgIH0K
KworICAgIGZsb2F0IHdpZHRoKHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbikKKyAgICB7Cisg
ICAgICAgIG1fY29udHJvbGxlci0+YWR2YW5jZShmcm9tLCAwLCB0cnVlKTsKKyAgICAgICAgZmxv
YXQgYmVmb3JlV2lkdGggPSBtX2NvbnRyb2xsZXItPnJ1bldpZHRoU29GYXIoKTsKKyAgICAgICAg
bV9jb250cm9sbGVyLT5hZHZhbmNlKGZyb20gKyBsZW4sIDAsIHRydWUpOworICAgICAgICBmbG9h
dCBhZnRlcldpZHRoID0gbV9jb250cm9sbGVyLT5ydW5XaWR0aFNvRmFyKCk7CisgICAgICAgIHJl
dHVybiBhZnRlcldpZHRoIC0gYmVmb3JlV2lkdGg7CisgICAgfQorCitwcml2YXRlOgorICAgIC8v
IENvbXBsZXhUZXh0Q29udHJvbGxlciBoYXMgb25seSByZWZlcmVuY2VzIHRvIGl0cyBGb250IGFu
ZCBUZXh0UnVuIHNvIHRoZXkgbXVzdCBiZSBrZXB0IGFsaXZlIGhlcmUKKyAgICBGb250IG1fZm9u
dDsKKyAgICBUZXh0UnVuIG1fcnVuOworICAgIE93blB0cjxDb21wbGV4VGV4dENvbnRyb2xsZXI+
IG1fY29udHJvbGxlcjsKK307CisKK1Bhc3NPd25QdHI8VGV4dExheW91dD4gRm9udDo6Y3JlYXRl
TGF5b3V0KFJlbmRlclRleHQqIHRleHQsIGZsb2F0IHhQb3MsIGJvb2wgY29sbGFwc2VXaGl0ZVNw
YWNlKSBjb25zdAoreworI2lmIFVTRShDT1JFX1RFWFQpCisjaWYgVVNFKEFUU1VJKQorICAgIGlm
IChzaG91bGRVc2VBVFNVSUFQSSgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyNlbmRpZgor
ICAgIGlmIChjb2xsYXBzZVdoaXRlU3BhY2UgJiYgVGV4dExheW91dDo6aXNOZWVkZWQodGV4dCwg
KnRoaXMpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFRleHRMYXlvdXQodGV4dCwgKnRo
aXMsIHhQb3MpKTsKKyNlbmRpZgorICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIEZvbnQ6
OmRlc3Ryb3lMYXlvdXQoVGV4dExheW91dCogbGF5b3V0KQoreworICAgIGRlbGV0ZSBsYXlvdXQ7
Cit9CisKK2Zsb2F0IEZvbnQ6OndpZHRoKFRleHRMYXlvdXQmIGxheW91dCwgdW5zaWduZWQgZnJv
bSwgdW5zaWduZWQgdG8pCit7CisgICAgcmV0dXJuIGxheW91dC53aWR0aChmcm9tLCB0byk7Cit9
CisKIHN0YXRpYyBpbmxpbmUgQ0dGbG9hdCByb3VuZENHRmxvYXQoQ0dGbG9hdCBmKQogewogICAg
IGlmIChzaXplb2YoQ0dGbG9hdCkgPT0gc2l6ZW9mKGZsb2F0KSkKQEAgLTU5LDYgKzEzMiw3IEBA
IHN0YXRpYyBpbmxpbmUgQ0dGbG9hdCBjZWlsQ0dGbG9hdChDR0Zsb2EKIENvbXBsZXhUZXh0Q29u
dHJvbGxlcjo6Q29tcGxleFRleHRDb250cm9sbGVyKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRl
eHRSdW4mIHJ1biwgYm9vbCBtYXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbiwgSGFzaFNldDxj
b25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBib29sIGZvclRleHRFbXBoYXNp
cykKICAgICA6IG1fZm9udCgqZm9udCkKICAgICAsIG1fcnVuKHJ1bikKKyAgICAsIG1fbHRyT25s
eSh0cnVlKQogICAgICwgbV9tYXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbihtYXlVc2VOYXR1
cmFsV3JpdGluZ0RpcmVjdGlvbikKICAgICAsIG1fZm9yVGV4dEVtcGhhc2lzKGZvclRleHRFbXBo
YXNpcykKICAgICAsIG1fY3VycmVudENoYXJhY3RlcigwKQpAQCAtMzY4LDE1ICs0NDIsMTcgQEAg
Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0
ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQog
ICAgICwgbV9zdHJpbmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKHN0
cmluZ0xvY2F0aW9uKQogICAgICwgbV9pbmRleEVuZChzdHJpbmdMZW5ndGgpCisgICAgLCBtX2x0
cihsdHIpCiAgICAgLCBtX2lzTW9ub3RvbmljKHRydWUpCiB7CiAjaWYgVVNFKENPUkVfVEVYVCkg
JiYgVVNFKEFUU1VJKQotICAgIHNob3VsZFVzZUFUU1VJQVBJKCkgPyBjcmVhdGVUZXh0UnVuRnJv
bUZvbnREYXRhQVRTVUkobHRyKSA6IGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dChs
dHIpOworICAgIHNob3VsZFVzZUFUU1VJQVBJKCkgPyBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRh
QVRTVUkoKSA6IGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFDb3JlVGV4dCgpOwogI2VsaWYgVVNF
KEFUU1VJKQotICAgIGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSShsdHIpOworICAgIGNy
ZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSSgpOwogI2VsaWYgVVNFKENPUkVfVEVYVCkKLSAg
ICBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQ29yZVRleHQobHRyKTsKKyAgICBjcmVhdGVUZXh0
UnVuRnJvbUZvbnREYXRhQ29yZVRleHQoKTsKICNlbmRpZgogfQogCkBAIC00MDQsMjUgKzQ4MCw3
NSBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSCiAgICAgfQogfQog
Ci12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSh1bnNpZ25lZCBvZmZzZXQsIEds
eXBoQnVmZmVyKiBnbHlwaEJ1ZmZlcikKK3Vuc2lnbmVkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6
aW5kZXhPZkN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgpCit7CisgICAgbGVmdG1v
c3RHbHlwaCA9IDA7CisgICAgCisgICAgc2l6ZV90IHJ1bkNvdW50ID0gbV9jb21wbGV4VGV4dFJ1
bnMuc2l6ZSgpOworICAgIGlmIChtX2N1cnJlbnRSdW4gPj0gcnVuQ291bnQpCisgICAgICAgIHJl
dHVybiBydW5Db3VudDsKKworICAgIGlmIChtX2x0ck9ubHkpIHsKKyAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IG1fY3VycmVudFJ1bjsgKytpKQorICAgICAgICAgICAgbGVmdG1vc3RH
bHlwaCArPSBtX2NvbXBsZXhUZXh0UnVuc1tpXS0+Z2x5cGhDb3VudCgpOworICAgICAgICByZXR1
cm4gbV9jdXJyZW50UnVuOworICAgIH0KKworICAgIHdoaWxlIChtX3J1bkluZGljZXMuc2l6ZSgp
IDw9IG1fY3VycmVudFJ1bikgeworICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSBtX3J1bkluZGlj
ZXMuaXNFbXB0eSgpID8gMCA6IHN0cmluZ0VuZCgqbV9jb21wbGV4VGV4dFJ1bnNbbV9ydW5JbmRp
Y2VzLmxhc3QoKV0pOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydW5Db3Vu
dDsgKytpKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHN0cmluZ0JlZ2luKCptX2NvbXBs
ZXhUZXh0UnVuc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBtX3J1bkluZGljZXMuYXBwZW5kKGkp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorCisgICAgdW5zaWduZWQgY3VycmVudFJ1bkluZGV4ID0gbV9ydW5JbmRpY2VzW21fY3VycmVu
dFJ1bl07CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGN1cnJlbnRSdW5JbmRleDsgKytp
KQorICAgICAgICBsZWZ0bW9zdEdseXBoICs9IG1fY29tcGxleFRleHRSdW5zW2ldLT5nbHlwaENv
dW50KCk7CisgICAgcmV0dXJuIGN1cnJlbnRSdW5JbmRleDsKK30KKwordW5zaWduZWQgQ29tcGxl
eFRleHRDb250cm9sbGVyOjppbmNyZW1lbnRDdXJyZW50UnVuKHVuc2lnbmVkJiBsZWZ0bW9zdEds
eXBoKQoreworICAgIGlmIChtX2x0ck9ubHkpIHsKKyAgICAgICAgbGVmdG1vc3RHbHlwaCArPSBt
X2NvbXBsZXhUZXh0UnVuc1ttX2N1cnJlbnRSdW4rK10tPmdseXBoQ291bnQoKTsKKyAgICAgICAg
cmV0dXJuIG1fY3VycmVudFJ1bjsKKyAgICB9CisKKyAgICBtX2N1cnJlbnRSdW4rKzsKKyAgICBs
ZWZ0bW9zdEdseXBoID0gMDsKKyAgICByZXR1cm4gaW5kZXhPZkN1cnJlbnRSdW4obGVmdG1vc3RH
bHlwaCk7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2lnbmVk
IG9mZnNldCwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyLCBib29sIGJ5V2hvbGVHbHlwaHMpCiB7
CiAgICAgaWYgKHN0YXRpY19jYXN0PGludD4ob2Zmc2V0KSA+IG1fZW5kKQogICAgICAgICBvZmZz
ZXQgPSBtX2VuZDsKIAotICAgIGlmIChvZmZzZXQgPD0gbV9jdXJyZW50Q2hhcmFjdGVyKQotICAg
ICAgICByZXR1cm47CisgICAgaWYgKG9mZnNldCA8PSBtX2N1cnJlbnRDaGFyYWN0ZXIpIHsKKyAg
ICAgICAgbV9ydW5XaWR0aFNvRmFyID0gbV9sZWFkaW5nRXhwYW5zaW9uOworICAgICAgICBtX251
bUdseXBoc1NvRmFyID0gMDsKKyAgICAgICAgbV9jdXJyZW50UnVuID0gMDsKKyAgICAgICAgbV9n
bHlwaEluQ3VycmVudFJ1biA9IDA7CisgICAgICAgIG1fY2hhcmFjdGVySW5DdXJyZW50R2x5cGgg
PSAwOworICAgIH0KIAogICAgIG1fY3VycmVudENoYXJhY3RlciA9IG9mZnNldDsKIAogICAgIHNp
emVfdCBydW5Db3VudCA9IG1fY29tcGxleFRleHRSdW5zLnNpemUoKTsKIAotICAgIGJvb2wgbHRy
ID0gbV9ydW4ubHRyKCk7Ci0KLSAgICB1bnNpZ25lZCBrID0gbHRyID8gbV9udW1HbHlwaHNTb0Zh
ciA6IG1fYWRqdXN0ZWRHbHlwaHMuc2l6ZSgpIC0gMSAtIG1fbnVtR2x5cGhzU29GYXI7CisgICAg
dW5zaWduZWQgbGVmdG1vc3RHbHlwaCA9IDA7CisgICAgdW5zaWduZWQgY3VycmVudFJ1bkluZGV4
ID0gaW5kZXhPZkN1cnJlbnRSdW4obGVmdG1vc3RHbHlwaCk7CiAgICAgd2hpbGUgKG1fY3VycmVu
dFJ1biA8IHJ1bkNvdW50KSB7Ci0gICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBjb21wbGV4
VGV4dFJ1biA9ICptX2NvbXBsZXhUZXh0UnVuc1tsdHIgPyBtX2N1cnJlbnRSdW4gOiBydW5Db3Vu
dCAtIDEgLSBtX2N1cnJlbnRSdW5dOworICAgICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY29t
cGxleFRleHRSdW4gPSAqbV9jb21wbGV4VGV4dFJ1bnNbY3VycmVudFJ1bkluZGV4XTsKKyAgICAg
ICAgYm9vbCBsdHIgPSBjb21wbGV4VGV4dFJ1bi5sdHIoKTsKICAgICAgICAgc2l6ZV90IGdseXBo
Q291bnQgPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENvdW50KCk7CiAgICAgICAgIHVuc2lnbmVkIGcg
PSBsdHIgPyBtX2dseXBoSW5DdXJyZW50UnVuIDogZ2x5cGhDb3VudCAtIDEgLSBtX2dseXBoSW5D
dXJyZW50UnVuOworICAgICAgICB1bnNpZ25lZCBrID0gbGVmdG1vc3RHbHlwaCArIGc7CisKICAg
ICAgICAgd2hpbGUgKG1fZ2x5cGhJbkN1cnJlbnRSdW4gPCBnbHlwaENvdW50KSB7CiAgICAgICAg
ICAgICB1bnNpZ25lZCBnbHlwaFN0YXJ0T2Zmc2V0ID0gY29tcGxleFRleHRSdW4uaW5kZXhBdChn
KTsKICAgICAgICAgICAgIHVuc2lnbmVkIGdseXBoRW5kT2Zmc2V0OwpAQCAtNDUxLDYgKzU3Nyw5
IEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2kKICAgICAgICAgICAg
ICAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBnbHlwaHMgcGVyIGNoYXJhY3RlciB3ZSBu
ZWVkIHRvIGFkdmFuY2UgYnkgdGhlIGZ1bGwgd2lkdGggb2YgdGhlIGdseXBoLgogICAgICAgICAg
ICAgICAgIEFTU0VSVChtX2NoYXJhY3RlckluQ3VycmVudEdseXBoID09IG9sZENoYXJhY3Rlcklu
Q3VycmVudEdseXBoKTsKICAgICAgICAgICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0gYWRqdXN0
ZWRBZHZhbmNlLndpZHRoOworICAgICAgICAgICAgfSBlbHNlIGlmIChieVdob2xlR2x5cGhzKSB7
CisgICAgICAgICAgICAgICAgaWYgKCFvbGRDaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCkKKyAgICAg
ICAgICAgICAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IGFkanVzdGVkQWR2YW5jZS53aWR0aDsK
ICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIG1fcnVuV2lkdGhTb0ZhciArPSBh
ZGp1c3RlZEFkdmFuY2Uud2lkdGggKiAobV9jaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCAtIG9sZENo
YXJhY3RlckluQ3VycmVudEdseXBoKSAvIChnbHlwaEVuZE9mZnNldCAtIGdseXBoU3RhcnRPZmZz
ZXQpOwogCkBAIC00NjgsMTAgKzU5NywxMCBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6
YWR2YW5jZSh1bnNpCiAgICAgICAgICAgICAgICAgay0tOwogICAgICAgICAgICAgfQogICAgICAg
ICB9Ci0gICAgICAgIG1fY3VycmVudFJ1bisrOworICAgICAgICBjdXJyZW50UnVuSW5kZXggPSBp
bmNyZW1lbnRDdXJyZW50UnVuKGxlZnRtb3N0R2x5cGgpOwogICAgICAgICBtX2dseXBoSW5DdXJy
ZW50UnVuID0gMDsKICAgICB9Ci0gICAgaWYgKCFsdHIgJiYgbV9udW1HbHlwaHNTb0ZhciA9PSBt
X2FkanVzdGVkQWR2YW5jZXMuc2l6ZSgpKQorICAgIGlmICghbV9ydW4ubHRyKCkgJiYgbV9udW1H
bHlwaHNTb0ZhciA9PSBtX2FkanVzdGVkQWR2YW5jZXMuc2l6ZSgpKQogICAgICAgICBtX3J1bldp
ZHRoU29GYXIgKz0gbV9maW5hbFJvdW5kaW5nV2lkdGg7CiB9CiAKQEAgLTQ4NSw2ICs2MTQsOSBA
QCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWRqdXN0R2x5cGhzCiAgICAgICAgIHVuc2ln
bmVkIGdseXBoQ291bnQgPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENvdW50KCk7CiAgICAgICAgIGNv
bnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGNvbXBsZXhUZXh0UnVuLmZvbnREYXRhKCk7
CiAKKyAgICAgICAgaWYgKCFjb21wbGV4VGV4dFJ1bi5sdHIoKSkKKyAgICAgICAgICAgIG1fbHRy
T25seSA9IGZhbHNlOworCiAgICAgICAgIGNvbnN0IENHR2x5cGgqIGdseXBocyA9IGNvbXBsZXhU
ZXh0UnVuLmdseXBocygpOwogICAgICAgICBjb25zdCBDR1NpemUqIGFkdmFuY2VzID0gY29tcGxl
eFRleHRSdW4uYWR2YW5jZXMoKTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuaAkocmV2
aXNpb24gMTIyMzc2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0Nv
bXBsZXhUZXh0Q29udHJvbGxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC02Miw3ICs2Miw3IEBAIHB1
YmxpYzoKICAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3QgRm9udCosIGNvbnN0IFRleHRS
dW4mLCBib29sIG1heVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9uID0gZmFsc2UsIEhhc2hTZXQ8
Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDAsIGJvb2wgZm9yVGV4dEVt
cGhhc2lzID0gZmFsc2UpOwogCiAgICAgLy8gQWR2YW5jZSBhbmQgZW1pdCBnbHlwaHMgdXAgdG8g
dGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCi0gICAgdm9pZCBhZHZhbmNlKHVuc2lnbmVkIHRvLCBH
bHlwaEJ1ZmZlciogPSAwKTsKKyAgICB2b2lkIGFkdmFuY2UodW5zaWduZWQgdG8sIEdseXBoQnVm
ZmVyKiA9IDAsIGJvb2wgYnlXaG9sZUdseXBocyA9IGZhbHNlKTsKIAogICAgIC8vIENvbXB1dGUg
dGhlIGNoYXJhY3RlciBvZmZzZXQgZm9yIGEgZ2l2ZW4geCBjb29yZGluYXRlLgogICAgIGludCBv
ZmZzZXRGb3JQb3NpdGlvbihmbG9hdCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKQEAg
LTEwNywyMSArMTA3LDIzIEBAIHByaXZhdGU6CiAgICAgICAgIHVuc2lnbmVkIHN0cmluZ0xvY2F0
aW9uKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdMb2NhdGlvbjsgfQogICAgICAgICBzaXplX3Qg
c3RyaW5nTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdMZW5ndGg7IH0KICAgICAgICAg
QUxXQVlTX0lOTElORSBDRkluZGV4IGluZGV4QXQoc2l6ZV90IGkpIGNvbnN0OworICAgICAgICBD
RkluZGV4IGluZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2luZGV4QmVnaW47IH0KICAgICAg
ICAgQ0ZJbmRleCBpbmRleEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXhFbmQ7IH0KICAgICAg
ICAgQ0ZJbmRleCBlbmRPZmZzZXRBdChzaXplX3QgaSkgY29uc3QgeyBBU1NFUlQoIW1faXNNb25v
dG9uaWMpOyByZXR1cm4gbV9nbHlwaEVuZE9mZnNldHNbaV07IH0KICAgICAgICAgY29uc3QgQ0dH
bHlwaCogZ2x5cGhzKCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHM7IH0KICAgICAgICAgY29uc3Qg
Q0dTaXplKiBhZHZhbmNlcygpIGNvbnN0IHsgcmV0dXJuIG1fYWR2YW5jZXM7IH0KKyAgICAgICAg
Ym9vbCBsdHIoKSBjb25zdCB7IHJldHVybiBtX2x0cjsgfQogICAgICAgICBib29sIGlzTW9ub3Rv
bmljKCkgY29uc3QgeyByZXR1cm4gbV9pc01vbm90b25pYzsgfQogICAgICAgICB2b2lkIHNldElz
Tm9uTW9ub3RvbmljKCk7CiAKICAgICBwcml2YXRlOgogI2lmIFVTRShDT1JFX1RFWFQpCiAgICAg
ICAgIENvbXBsZXhUZXh0UnVuKENUUnVuUmVmLCBjb25zdCBTaW1wbGVGb250RGF0YSosIGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbiwgc2l6ZV90IHN0cmlu
Z0xlbmd0aCwgQ0ZSYW5nZSBydW5SYW5nZSk7Ci0gICAgICAgIHZvaWQgY3JlYXRlVGV4dFJ1bkZy
b21Gb250RGF0YUNvcmVUZXh0KGJvb2wgbHRyKTsKKyAgICAgICAgdm9pZCBjcmVhdGVUZXh0UnVu
RnJvbUZvbnREYXRhQ29yZVRleHQoKTsKICNlbmRpZgogI2lmIFVTRShBVFNVSSkKICAgICAgICAg
Q29tcGxleFRleHRSdW4oQVRTVVRleHRMYXlvdXQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29u
c3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBzaXplX3Qgc3Ry
aW5nTGVuZ3RoLCBib29sIGx0ciwgYm9vbCBkaXJlY3Rpb25hbE92ZXJyaWRlKTsKLSAgICAgICAg
dm9pZCBjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoYm9vbCBsdHIpOworICAgICAgICB2
b2lkIGNyZWF0ZVRleHRSdW5Gcm9tRm9udERhdGFBVFNVSSgpOwogI2VuZGlmCiAgICAgICAgIENv
bXBsZXhUZXh0UnVuKGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29uc3QgVUNoYXIqIGNoYXJhY3Rl
cnMsIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBzaXplX3Qgc3RyaW5nTGVuZ3RoLCBib29sIGx0
cik7CiAKQEAgLTE0MSwxNyArMTQzLDIyIEBAIHByaXZhdGU6CiAjaWYgVVNFKEFUU1VJKQogICAg
ICAgICBWZWN0b3I8Q0ZJbmRleCwgNjQ+IG1fYXRzdWlJbmRpY2VzOwogI2VuZGlmCisgICAgICAg
IENGSW5kZXggbV9pbmRleEJlZ2luOwogICAgICAgICBDRkluZGV4IG1faW5kZXhFbmQ7CiAgICAg
ICAgIFZlY3RvcjxDRkluZGV4LCA2ND4gbV9nbHlwaEVuZE9mZnNldHM7CiAgICAgICAgIFZlY3Rv
cjxDR0dseXBoLCA2ND4gbV9nbHlwaHNWZWN0b3I7CiAgICAgICAgIGNvbnN0IENHR2x5cGgqIG1f
Z2x5cGhzOwogICAgICAgICBWZWN0b3I8Q0dTaXplLCA2ND4gbV9hZHZhbmNlc1ZlY3RvcjsKICAg
ICAgICAgY29uc3QgQ0dTaXplKiBtX2FkdmFuY2VzOworICAgICAgICBib29sIG1fbHRyOwogI2lm
IFVTRShBVFNVSSkKICAgICAgICAgYm9vbCBtX2RpcmVjdGlvbmFsT3ZlcnJpZGU7CiAjZW5kaWYK
ICAgICAgICAgYm9vbCBtX2lzTW9ub3RvbmljOwogICAgIH07CisgICAgCisgICAgc3RhdGljIHVu
c2lnbmVkIHN0cmluZ0JlZ2luKGNvbnN0IENvbXBsZXhUZXh0UnVuJiBydW4pIHsgcmV0dXJuIHJ1
bi5zdHJpbmdMb2NhdGlvbigpICsgcnVuLmluZGV4QmVnaW4oKTsgfQorICAgIHN0YXRpYyB1bnNp
Z25lZCBzdHJpbmdFbmQoY29uc3QgQ29tcGxleFRleHRSdW4mIHJ1bikgeyByZXR1cm4gcnVuLnN0
cmluZ0xvY2F0aW9uKCkgKyBydW4uaW5kZXhFbmQoKTsgfQogCiAgICAgdm9pZCBjb2xsZWN0Q29t
cGxleFRleHRSdW5zKCk7CiAKQEAgLTE2Miw4ICsxNjksMTMgQEAgcHJpdmF0ZToKICAgICB2b2lk
IGNvbGxlY3RDb21wbGV4VGV4dFJ1bnNGb3JDaGFyYWN0ZXJzQ29yZVRleHQoY29uc3QgVUNoYXIq
LCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9uLCBjb25zdCBTaW1wbGVG
b250RGF0YSopOwogICAgIHZvaWQgYWRqdXN0R2x5cGhzQW5kQWR2YW5jZXMoKTsKIAorICAgIHVu
c2lnbmVkIGluZGV4T2ZDdXJyZW50UnVuKHVuc2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICB1
bnNpZ25lZCBpbmNyZW1lbnRDdXJyZW50UnVuKHVuc2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAg
ICBWZWN0b3I8dW5zaWduZWQsIDg+IG1fcnVuSW5kaWNlczsKKwogICAgIGNvbnN0IEZvbnQmIG1f
Zm9udDsKICAgICBjb25zdCBUZXh0UnVuJiBtX3J1bjsKKyAgICBib29sIG1fbHRyT25seTsKICAg
ICBib29sIG1fbWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb247CiAgICAgYm9vbCBtX2ZvclRl
eHRFbXBoYXNpczsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFj
L0NvbXBsZXhUZXh0Q29udHJvbGxlckFUU1VJLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQVRTVUkuY3Bw
CShyZXZpc2lvbiAxMjIzNzYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvQ29tcGxleFRleHRDb250cm9sbGVyQVRTVUkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDcs
OCArMTQ3LDEwIEBAIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMKICAg
ICAsIG1fY2hhcmFjdGVycyhjaGFyYWN0ZXJzKQogICAgICwgbV9zdHJpbmdMb2NhdGlvbihzdHJp
bmdMb2NhdGlvbikKICAgICAsIG1fc3RyaW5nTGVuZ3RoKHN0cmluZ0xlbmd0aCkKKyAgICAsIG1f
aW5kZXhCZWdpbigwKQogICAgICwgbV9pbmRleEVuZChzdHJpbmdMZW5ndGgpCiAgICAgLCBtX2Rp
cmVjdGlvbmFsT3ZlcnJpZGUoZGlyZWN0aW9uYWxPdmVycmlkZSkKKyAgICAsIG1fbHRyKGx0cikK
ICAgICAsIG1faXNNb25vdG9uaWModHJ1ZSkKIHsKICAgICBPU1N0YXR1cyBzdGF0dXM7CkBAIC0y
MjIsNyArMjI0LDcgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Qwog
ICAgIHN0YXR1cyA9IEFUU1VEaXNwb3NlVGV4dExheW91dChhdHN1VGV4dExheW91dCk7CiB9CiAK
LXZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4dFJ1
bkZyb21Gb250RGF0YUFUU1VJKGJvb2wgbHRyKQordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6
OkNvbXBsZXhUZXh0UnVuOjpjcmVhdGVUZXh0UnVuRnJvbUZvbnREYXRhQVRTVUkoKQogewogICAg
IG1fYXRzdWlJbmRpY2VzLnJlc2VydmVDYXBhY2l0eShtX3N0cmluZ0xlbmd0aCk7CiAgICAgdW5z
aWduZWQgciA9IDA7CkBAIC0yMzcsNyArMjM5LDcgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xs
ZXI6OkNvbXBsZXhUZXh0UgogICAgICAgICAgICAgcisrOwogICAgIH0KICAgICBtX2dseXBoQ291
bnQgPSBtX2F0c3VpSW5kaWNlcy5zaXplKCk7Ci0gICAgaWYgKCFsdHIpIHsKKyAgICBpZiAoIW1f
bHRyKSB7CiAgICAgICAgIGZvciAodW5zaWduZWQgciA9IDAsIGVuZCA9IG1fZ2x5cGhDb3VudCAt
IDE7IHIgPCBtX2dseXBoQ291bnQgLyAyOyArK3IsIC0tZW5kKQogICAgICAgICAgICAgc3RkOjpz
d2FwKG1fYXRzdWlJbmRpY2VzW3JdLCBtX2F0c3VpSW5kaWNlc1tlbmRdKTsKICAgICB9CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9s
bGVyQ29yZVRleHQubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0Lm1tCShyZXZpc2lvbiAxMjIz
NzYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRD
b250cm9sbGVyQ29yZVRleHQubW0JKHdvcmtpbmcgY29weSkKQEAgLTEwNyw3ICsxMDcsOSBAQCBD
b21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDCiAgICAgLCBtX2NoYXJhY3Rl
cnMoY2hhcmFjdGVycykKICAgICAsIG1fc3RyaW5nTG9jYXRpb24oc3RyaW5nTG9jYXRpb24pCiAg
ICAgLCBtX3N0cmluZ0xlbmd0aChzdHJpbmdMZW5ndGgpCisgICAgLCBtX2luZGV4QmVnaW4ocnVu
UmFuZ2UubG9jYXRpb24pCiAgICAgLCBtX2luZGV4RW5kKHJ1blJhbmdlLmxvY2F0aW9uICsgcnVu
UmFuZ2UubGVuZ3RoKQorICAgICwgbV9sdHIoIShDVFJ1bkdldFN0YXR1cyhjdFJ1bikgJiBrQ1RS
dW5TdGF0dXNSaWdodFRvTGVmdCkpCiAgICAgLCBtX2lzTW9ub3RvbmljKHRydWUpCiB7CiAgICAg
bV9nbHlwaENvdW50ID0gQ1RSdW5HZXRHbHlwaENvdW50KGN0UnVuKTsKQEAgLTEzNSw3ICsxMzcs
NyBAQCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDCiAKIC8vIE1pc3Np
bmcgZ2x5cGhzIHJ1biBjb25zdHJ1Y3Rvci4gQ29yZSBUZXh0IHdpbGwgbm90IGdlbmVyYXRlIGEg
cnVuIG9mIG1pc3NpbmcgZ2x5cGhzLCBpbnN0ZWFkIGZhbGxpbmcgYmFjayBvbgogLy8gZ2x5cGhz
IGZyb20gTGFzdFJlc29ydC4gV2Ugd2FudCB0byB1c2UgdGhlIHByaW1hcnkgZm9udCdzIG1pc3Np
bmcgZ2x5cGggaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGZhc3QgdGV4dCBjb2RlIHBhdGguCi12b2lk
IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmNyZWF0ZVRleHRSdW5Gcm9t
Rm9udERhdGFDb3JlVGV4dChib29sIGx0cikKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpD
b21wbGV4VGV4dFJ1bjo6Y3JlYXRlVGV4dFJ1bkZyb21Gb250RGF0YUNvcmVUZXh0KCkKIHsKICAg
ICBtX2NvcmVUZXh0SW5kaWNlc1ZlY3Rvci5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG1fc3RyaW5n
TGVuZ3RoKTsKICAgICB1bnNpZ25lZCByID0gMDsKQEAgLTE1MCw3ICsxNTIsNyBAQCB2b2lkIENv
bXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSCiAgICAgICAgICAgICByKys7CiAgICAg
fQogICAgIG1fZ2x5cGhDb3VudCA9IG1fY29yZVRleHRJbmRpY2VzVmVjdG9yLnNpemUoKTsKLSAg
ICBpZiAoIWx0cikgeworICAgIGlmICghbV9sdHIpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBy
ID0gMCwgZW5kID0gbV9nbHlwaENvdW50IC0gMTsgciA8IG1fZ2x5cGhDb3VudCAvIDI7ICsrciwg
LS1lbmQpCiAgICAgICAgICAgICBzdGQ6OnN3YXAobV9jb3JlVGV4dEluZGljZXNWZWN0b3Jbcl0s
IG1fY29yZVRleHRJbmRpY2VzVmVjdG9yW2VuZF0pOwogICAgIH0KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxMjIzNzYpCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgs
NyBAQCBzdHJ1Y3QgQmlkaVJ1bjsKIHN0cnVjdCBQYWludEluZm87CiBjbGFzcyBMaW5lSW5mbzsK
IGNsYXNzIFJlbmRlclJ1YnlSdW47CitjbGFzcyBUZXh0TGF5b3V0OwogCiB0ZW1wbGF0ZSA8Y2xh
c3MgSXRlcmF0b3IsIGNsYXNzIFJ1bj4gY2xhc3MgQmlkaVJlc29sdmVyOwogdGVtcGxhdGUgPGNs
YXNzIFJ1bj4gY2xhc3MgQmlkaVJ1bkxpc3Q7CkBAIC02ODAsNiArNjgxLDcgQEAgcHJpdmF0ZToK
IAogICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zJyBpbXBsZW1lbnRhdGlvbnMgYXJlIGlu
IFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAuCiAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8UmVuZGVy
VGV4dCosIExhenlMaW5lQnJlYWtJdGVyYXRvcj4gTGluZUJyZWFrSXRlcmF0b3JJbmZvOworICAg
IHR5cGVkZWYgc3RkOjpwYWlyPFJlbmRlclRleHQqLCBPd25QdHI8VGV4dExheW91dD4gPiBUZXh0
TGF5b3V0SW5mbzsKICAgICBjbGFzcyBMaW5lQnJlYWtlciB7CiAgICAgcHVibGljOgogICAgICAg
ICBMaW5lQnJlYWtlcihSZW5kZXJCbG9jayogYmxvY2spCkBAIC02ODgsNyArNjkwLDcgQEAgcHJp
dmF0ZToKICAgICAgICAgICAgIHJlc2V0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBJbmxpbmVJ
dGVyYXRvciBuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgTGlu
ZUJyZWFrSXRlcmF0b3JJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKKyAgICAgICAgSW5s
aW5lSXRlcmF0b3IgbmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYs
IExpbmVCcmVha0l0ZXJhdG9ySW5mbyYsIFRleHRMYXlvdXRJbmZvJiwgRmxvYXRpbmdPYmplY3Qq
IGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzKTsKIAogICAgICAgICBib29sIGxpbmVXYXNIeXBoZW5hdGVkKCkgeyByZXR1cm4gbV9o
eXBoZW5hdGVkOyB9CiAgICAgICAgIGNvbnN0IFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25l
ZE9iamVjdHMoKSB7IHJldHVybiBtX3Bvc2l0aW9uZWRPYmplY3RzOyB9CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2
aXNpb24gMTIyMzc2KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGlu
ZUxheW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyNDAsNiArMTI0MCw3IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblIKICAgICBJbmxpbmVJdGVyYXRvciBlbmQg
PSByZXNvbHZlci5wb3NpdGlvbigpOwogICAgIGJvb2wgY2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBs
YXlvdXRTdGF0ZS5lbmRMaW5lKCk7CiAgICAgTGluZUJyZWFrSXRlcmF0b3JJbmZvIGxpbmVCcmVh
a0l0ZXJhdG9ySW5mbzsKKyAgICBUZXh0TGF5b3V0SW5mbyB0ZXh0TGF5b3V0SW5mbzsKICAgICBW
ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUgdmVydGljYWxQb3NpdGlvbkNhY2hlOwogCiAgICAgTGluZUJy
ZWFrZXIgbGluZUJyZWFrZXIodGhpcyk7CkBAIC0xMjYyLDcgKzEyNjMsNyBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SCiAgICAgICAgIGNvbnN0IElubGluZUl0ZXJh
dG9yIG9sZEVuZCA9IGVuZDsKICAgICAgICAgYm9vbCBpc05ld1VCQVBhcmFncmFwaCA9IGxheW91
dFN0YXRlLmxpbmVJbmZvKCkucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCk7CiAgICAgICAgIEZs
b2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lID0gKG1fZmxvYXRpbmdPYmpl
Y3RzICYmICFtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuaXNFbXB0eSgpKSA/IG1fZmxvYXRpbmdP
YmplY3RzLT5zZXQoKS5sYXN0KCkgOiAwOwotICAgICAgICBlbmQgPSBsaW5lQnJlYWtlci5uZXh0
TGluZUJyZWFrKHJlc29sdmVyLCBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLCBsaW5lQnJlYWtJdGVy
YXRvckluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzKTsKKyAgICAgICAgZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZl
ciwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCB0ZXh0TGF5
b3V0SW5mbywgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc2VjdXRpdmVIeXBoZW5hdGVk
TGluZXMpOwogICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CiAgICAg
ICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGNyZWF0aW5nIGFueSBydW5zIGluIG5l
eHRMaW5lQnJlYWsgdG8gYmVnaW4gd2l0aCEKICAgICAgICAgICAgIC8vIE9uY2UgQmlkaVJ1bkxp
c3QgaXMgc2VwYXJhdGVkIGZyb20gQmlkaVJlc29sdmVyIHRoaXMgd2lsbCBub3QgYmUgbmVlZGVk
LgpAQCAtMTk1MCwxMSArMTk1MSwxNCBAQCBzdGF0aWMgYm9vbCBzaG91bGRTa2lwV2hpdGVzcGFj
ZUFmdGVyU3RhCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGZsb2F0IHRl
eHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNv
bnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxh
cHNlV2hpdGVTcGFjZSkKK3N0YXRpYyBpbmxpbmUgZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQq
IHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udCYgZm9udCwgZmxv
YXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBUZXh0
TGF5b3V0KiBsYXlvdXQgPSAwKQogewogICAgIGlmIChpc0ZpeGVkUGl0Y2ggfHwgKCFmcm9tICYm
IGxlbiA9PSB0ZXh0LT50ZXh0TGVuZ3RoKCkpIHx8IHRleHQtPnN0eWxlKCktPmhhc1RleHRDb21i
aW5lKCkpCiAgICAgICAgIHJldHVybiB0ZXh0LT53aWR0aChmcm9tLCBsZW4sIGZvbnQsIHhQb3Mp
OwogCisgICAgaWYgKGxheW91dCkKKyAgICAgICAgcmV0dXJuIEZvbnQ6OndpZHRoKCpsYXlvdXQs
IGZyb20sIGxlbik7CisKICAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RU
ZXh0UnVuKHRleHQsIGZvbnQsIHRleHQtPmNoYXJhY3RlcnMoKSArIGZyb20sIGxlbiwgdGV4dC0+
c3R5bGUoKSk7CiAgICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4dC0+dGV4dExlbmd0aCgp
IC0gZnJvbSk7CiAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxlbmd0
aCgpKTsKQEAgLTIxMTcsNyArMjEyMSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2Vy
OjpyZXNldCgpCiB9CiAKIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6
bmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgbGlu
ZUluZm8sCi0gICAgTGluZUJyZWFrSXRlcmF0b3JJbmZvJiBsaW5lQnJlYWtJdGVyYXRvckluZm8s
IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKKyAgICBMaW5lQnJlYWtJdGVyYXRvckluZm8mIGxpbmVC
cmVha0l0ZXJhdG9ySW5mbywgVGV4dExheW91dEluZm8mIHRleHRMYXlvdXRJbmZvLCBGbG9hdGlu
Z09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMpCiB7CiAgICAgcmVzZXQoKTsKIApAQCAtMjM1Nyw2ICsyMzYxLDEyIEBA
IElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgICAg
ICBBU1NFUlQoY3VycmVudC5tX3BvcyA9PSB0LT50ZXh0TGVuZ3RoKCkpOwogICAgICAgICAgICAg
fQogCisgICAgICAgICAgICBpZiAodGV4dExheW91dEluZm8uZmlyc3QgIT0gdCkgeworICAgICAg
ICAgICAgICAgIHRleHRMYXlvdXRJbmZvLmZpcnN0ID0gdDsKKyAgICAgICAgICAgICAgICB0ZXh0
TGF5b3V0SW5mby5zZWNvbmQgPSBmLmNyZWF0ZUxheW91dCh0LCB3aWR0aC5jdXJyZW50V2lkdGgo
KSwgY29sbGFwc2VXaGl0ZVNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRM
YXlvdXQqIHRleHRMYXlvdXQgPSB0ZXh0TGF5b3V0SW5mby5zZWNvbmQuZ2V0KCk7CisKICAgICAg
ICAgICAgIGZvciAoOyBjdXJyZW50Lm1fcG9zIDwgdC0+dGV4dExlbmd0aCgpOyBjdXJyZW50LmZh
c3RJbmNyZW1lbnRJblRleHROb2RlKCkpIHsKICAgICAgICAgICAgICAgICBib29sIHByZXZpb3Vz
Q2hhcmFjdGVySXNTcGFjZSA9IGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOwogICAgICAgICAgICAg
ICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0ZXJJc1dTID0gY3VycmVudENoYXJhY3RlcklzV1M7CkBA
IC0yMzc4LDcgKzIzODgsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFr
ZXI6CiAgICAgICAgICAgICAgICAgaWYgKChicmVha0FsbCB8fCBicmVha1dvcmRzKSAmJiAhbWlk
V29yZEJyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0aDsKICAg
ICAgICAgICAgICAgICAgICAgYm9vbCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIg
PSBVMTZfSVNfTEVBRChjKSAmJiBjdXJyZW50Lm1fcG9zICsgMSA8IHQtPnRleHRMZW5ndGgoKSAm
JiBVMTZfSVNfVFJBSUwodC0+Y2hhcmFjdGVycygpW2N1cnJlbnQubV9wb3MgKyAxXSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCBt
aWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZiwgd2lkdGguY29tbWl0
dGVkV2lkdGgoKSArIHdyYXBXLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSk7Cisg
ICAgICAgICAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9z
LCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZiwgd2lkdGguY29t
bWl0dGVkV2lkdGgoKSArIHdyYXBXLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwg
dGV4dExheW91dCk7CiAgICAgICAgICAgICAgICAgICAgIG1pZFdvcmRCcmVhayA9IHdpZHRoLmNv
bW1pdHRlZFdpZHRoKCkgKyB3cmFwVyArIGNoYXJXaWR0aCA+IHdpZHRoLmF2YWlsYWJsZVdpZHRo
KCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNDA5LDkgKzI0MTksOSBAQCBJbmxpbmVJdGVy
YXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAKICAgICAgICAgICAgICAgICAgICAgZmxv
YXQgYWRkaXRpb25hbFRtcFc7CiAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkVHJhaWxpbmdT
cGFjZVdpZHRoICYmIGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAgICAgICAgICAgICAg
ICAgICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1f
cG9zICsgMSAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRj
aCwgY29sbGFwc2VXaGl0ZVNwYWNlKSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggKyBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0g
dGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGYs
IHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwg
dGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICsgbGFzdFNwYWNlV29yZFNwYWNp
bmc7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGFk
ZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxh
c3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VX
aGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAgICAgICAgICAgICAgICAg
ICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1fcG9z
IC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xs
YXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7CiAgICAg
ICAgICAgICAgICAgICAgIHdpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRtcFcp
OwogICAgICAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWRTdGFydFdpZHRoKSB7CiAgICAgICAg
ICAgICAgICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxX
aWR0aChjdXJyZW50Lm1fb2JqLCB0cnVlLCBmYWxzZSkpOwpAQCAtMjQyOCw3ICsyNDM4LDcgQEAg
SW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRoIGZvciB0aGlzIGxpbmUuCiAgICAgICAgICAg
ICAgICAgICAgICAgICBib29sIGxpbmVXYXNUb29XaWRlID0gZmFsc2U7CiAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAod2lkdGguZml0c09uTGluZSgpICYmIGN1cnJlbnRDaGFyYWN0ZXJJc1dT
ICYmIGN1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkgJiYgIW1pZFdvcmRC
cmVhaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0aCA9IHRl
eHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCAxLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNG
aXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3Jk
U3BhY2luZyA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0
aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCAxLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgo
KSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpICsgKGFwcGx5
V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIENoZWNrIGlmIGxpbmUgaXMgdG9vIGJpZyBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIHNw
YWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGlu
ZS4gSWYgaXQgaXMgbm90LCBkbyBub3RoaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIElmIHRoZSBsaW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25n
LApAQCAtMjU1NCw3ICsyNTY0LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVC
cmVha2VyOgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJTVBPUlRBTlQ6IGN1cnJl
bnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEKLSAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxU
bXBXID0gaWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVu
dC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRj
aCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAgICAg
ICAgZmxvYXQgYWRkaXRpb25hbFRtcFcgPSBpZ25vcmluZ1NwYWNlcyA/IDAgOiB0ZXh0V2lkdGgo
dCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50
V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpICsg
bGFzdFNwYWNlV29yZFNwYWNpbmc7CiAgICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdp
ZHRoKGFkZGl0aW9uYWxUbXBXICsgaW5saW5lTG9naWNhbFdpZHRoKGN1cnJlbnQubV9vYmosICFh
cHBsaWVkU3RhcnRXaWR0aCwgaW5jbHVkZUVuZFdpZHRoKSk7CiAgICAgICAgICAgICBpbmNsdWRl
RW5kV2lkdGggPSBmYWxzZTsKIAo=
</data>
<flag name="review"
          id="161184"
          type_id="1"
          status="-"
          setter="ned"
    />
    <flag name="commit-queue"
          id="161185"
          type_id="3"
          status="-"
          setter="ned"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>153881</attachid>
            <date>2012-07-23 15:43:00 -0700</date>
            <delta_ts>2012-07-27 01:09:54 -0700</delta_ts>
            <desc>Fixed and rebased patch.</desc>
            <filename>post-ATSUI.txt</filename>
            <type>text/plain</type>
            <size>28634</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyMzM4NikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc2IEBACisyMDEyLTA3LTIzICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEN1cnJlbnRseSBSZW5kZXJCbG9jazo6TGluZUJyZWFr
ZXI6Om5leHRMaW5lQnJlYWsgYXNzdW1lcyB0aGF0IG1lYXN1cmluZyBpbmRpdmlkdWFsIHdvcmRz
IGlzIGFzIGNoZWFwCisgICAgICAgIGFzIGZyZWUuIFRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4g
ZGVhbGluZyB3aXRoIGNvbXBsZXggdGV4dCwgd2hpY2ggYmVuZWZpdHMgZnJvbSBsYXlpbmcgb3V0
IGFzIG11Y2gKKyAgICAgICAgdGV4dCBhcyBwb3NzaWJsZSBhbmQgYnkgcmV1c2luZyB0aGF0IGxh
eW91dCB3aGVuIGZlYXNpYmxlOiBieSBkb2luZyBzbyB0aGlzIHBhdGNoIGltcHJvdmVzIGxpbmUK
KyAgICAgICAgYnJlYWtpbmcgYnkgMzUlIGFzIG1lYXN1cmVkIHdpdGggYSBzaW1wbGUgdGVzdCBh
cHAuCisKKyAgICAgICAgVGhlIGJ1bGsgb2YgdGhpcyBjaGFuZ2UgaXMgbW9kaWZ5aW5nIENvbXBs
ZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSwgd2hpY2ggcHJldmlvdXNseSByZXF1aXJlZCB0aGUK
KyAgICAgICAgdGV4dCBvZmZzZXQgdG8gYmUgc3RyaWN0bHkgaW5jcmVhc2luZyBhbmQgYXNzdW1l
ZCB1bmlkaXJlY3Rpb25hbCB0ZXh0OyBub3cgaXQgc3VwcG9ydHMgcmFuZG9tIHNlZWtpbmcKKyAg
ICAgICAgaW4gYSBuYWl2ZSBmYXNoaW9uIChieSByZXN0YXJ0aW5nIHRvIHRoZSBiZWdpbm5pbmcp
IGFuZCB0cmF2ZXJzZXMgZ2x5cGhzIGluIGxvZ2ljYWwgb3JkZXIuIEluIHRoZQorICAgICAgICBs
YXR0ZXIgY2FzZSwgdGhlIHByZXNlbmNlIG9mIGFueSBub24tTFRSIHJ1bnMgdHJpZ2dlcnMgdGhl
IHBvcHVsYXRpb24gb2YgYSBtYXBwaW5nIGZyb20gbG9naWNhbCB0bworICAgICAgICB2aXN1YWwg
cnVuIGluZGljZXMuIEZpbmFsbHksIGEgbmV3IGZsYWcgaGFzIGJlZW4gYWRkZWQgd2hpY2ggaW5o
aWJpdHMgZ2x5cGggYWR2YW5jZXMgZnJvbSBiZWluZyBzcGxpdAorICAgICAgICBhY3Jvc3MgbGln
YXR1cmVzICh0aHVzIGNhdXNpbmcgc3B1cmlvdXMgbGluZSBicmVha3MpLgorCisgICAgICAgIEEg
Q29tcGxleFRleHRDb250cm9sbGVyIGFuZCBpdHMgYXNzb2NpYXRlZCBUZXh0UnVuIGFuZCBGb250
IGFyZSBlbmNhcHN1bGF0ZWQgaW4gYSBUZXh0TGF5b3V0IG9iamVjdCwKKyAgICAgICAgd2hpY2gg
aXMgaW5zdGFudGlhdGVkIGFzIGFuIG9wYXF1ZSBvYmplY3QgdmlhIGZ1bmN0aW9ucyB0aGF0IGFy
ZSBuby1vcHMgdW5sZXNzIGJ1aWxkaW5nIGZvciBNYWMuIEEKKyAgICAgICAgc3RhdGljIG1lbWJl
ciBmdW5jdGlvbiAoaXNOZWVkZWQpIGNoZWNrcyB0byBzZWUgd2hldGhlciBhIFRleHRSdW4gaXMg
Y29tcGxleCwgaW4gb3JkZXIgdG8gYXZvaWQKKyAgICAgICAgbmVlZGxlc3MgaW5zdGFudGlhdGlv
bi4gSXQgYWxzbyBiYWlscyBpZiB0YWJzIHdvdWxkIGJlIGVuYWJsZWQgc2luY2UgcG9zaXRpb25h
bCBlZmZlY3RzIGFyZSBub3QgeWV0CisgICAgICAgIGhhbmRsZWQgaW4gdGhpcyBtb2RlLgorCisg
ICAgICAgIE5vIGJlaGF2aW9yYWwgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgZHVlIHRvIHRoaXMgY2hh
bmdlLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250
LmNwcDoKKyAgICAgICAgKFdURik6IERlZmluZSBkZWxldGVPd25lZFB0ciBmb3IgVGV4dExheW91
dCBhcyBjYWxsaW5nIHRocm91Z2ggZGVzdHJveUxheW91dDsgcmVseWluZyBvbiBvcGVyYXRvciBk
ZWxldGUgaXMgbm90IHdvcmthYmxlIGFzIHRoZSBjbGFzcyBkb2VzIG5vdCBleGlzdCBvbiBhbGwg
cGxhdGZvcm1zLgorICAgICAgICAoV1RGOjpXZWJDb3JlOjpUZXh0TGF5b3V0KToKKyAgICAgICAg
KFdlYkNvcmUpOiBJbXBsZW1lbnQgbm8tb3AgVGV4dExheW91dCB3cmFwcGVycyBmb3Igbm9uLU1h
YyBwbGF0Zm9ybXMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlvdXQpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVzdHJveUxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpG
b250Ojp3aWR0aCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oOgorICAgICAg
ICAoV2ViQ29yZSk6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgUmVuZGVyVGV4dCBhbmQg
VGV4dExheW91dC4KKyAgICAgICAgKEZvbnQpOiBBZGQgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdp
dGggcG9pbnRlciB0byBUZXh0TGF5b3V0IGltcGxlbWVudGF0aW9uLgorICAgICAgICAoV1RGKTog
RGVjbGFyZSBkZWxldGVPd25lZFB0ciBmb3IgVGV4dExheW91dC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcDoKKyAgICAgICAgKFRleHRM
YXlvdXQpOiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRvIGEgQ29tcGxl
eFRleHRDb250cm9sbGVyIGZvciBhIHBhcnRpY3VsYXIgVGV4dFJ1bi4KKyAgICAgICAgKFdlYkNv
cmU6OlRleHRMYXlvdXQ6OmlzTmVlZGVkKTogVXNlZCBieSB3cmFwcGVyIHRvIGF2b2lkIGluc3Rh
bnRpYXRpb24gd2hlbiBjb21wbGV4IGxheW91dCBpcyBub3QgcmVxdWlyZWQuCisgICAgICAgIChX
ZWJDb3JlOjpUZXh0TGF5b3V0Ojpmb250V2l0aE5vV29yZFNwYWNpbmcpOiBIZWxwZXIgZnVuY3Rp
b24gdG8gYWxsb3cgaW5pdGlhbGl6YXRpb24gb2YgbWVtYmVyIHZhcmlhYmxlLgorICAgICAgICAo
V2ViQ29yZTo6VGV4dExheW91dDo6Y29uc3RydWN0VGV4dFJ1bik6IERpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6VGV4dExheW91dDo6VGV4dExheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
TGF5b3V0Ojp3aWR0aCk6CisgICAgICAgIChXZWJDb3JlKTogSW1wbGVtZW50IHJlYWwgVGV4dExh
eW91dCB3cmFwcGVycyBmb3IgTWFjLgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6Y3JlYXRlTGF5
b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRlc3Ryb3lMYXlvdXQpOgorICAgICAgICAo
V2ViQ29yZTo6Rm9udDo6d2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250
cm9sbGVyOjpDb21wbGV4VGV4dENvbnRyb2xsZXIpOiBJbml0aWFsaXplIG1fbHRyT25seS4KKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkNv
bXBsZXhUZXh0UnVuKTogSW5pdGlhbGl6ZSBtX2luZGV4QmVnaW4gYW5kIG1fbHRyLgorICAgICAg
ICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppbmRleE9mQ3VycmVudFJ1bik6IFJl
dHVybiAodmlzdWFsKSBtX2NvbXBsZXhUZXh0UnVucyBpbmRleCBjb3JyZXNwb25kaW5nIHRvIChs
b2dpY2FsKSBtX2N1cnJlbnRSdW4sIGxhemlseSBjb25zdHJ1Y3RpbmcgbV9ydW5JbmRpY2VzIGlm
IG5lZWRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6aW5jcmVt
ZW50Q3VycmVudFJ1bik6IFJldHVybiBuZXh0IG1fY29tcGxleFRleHRSdW5zIGluZGV4IGluIGxv
Z2ljYWwgb3JkZXIuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFk
dmFuY2UpOiBBbGxvdyByZXN0YXJ0aW5nLCBzdXBwb3J0IGZvciBiaWRpIHJlb3JkZXJpbmcsIGFu
ZCBvcHRpb24gdG8gbWVhc3VyZSBvbmx5IHdob2xlIGdseXBocyByYXRoZXIgdGhhbiBkaXZpZGlu
ZyBhZHZhbmNlcy4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWRq
dXN0R2x5cGhzQW5kQWR2YW5jZXMpOiBDbGVhciBtX2x0ck9ubHkgb24gZGV0ZWN0aW5nIGEgUlRM
IHJ1bi4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9s
bGVyLmg6CisgICAgICAgIChDb21wbGV4VGV4dENvbnRyb2xsZXIpOiBBZGQgbV9sdHJPbmx5IGlu
ZGljYXRpbmcgbm8gYmlkaSByZW9yZGVyaW5nLCBhbmQgbV9ydW5JbmRpY2VzIG1hcHBpbmcgZnJv
bSBydW5zIChsb2dpY2FsIG9yZGVyKSB0byBtX2NvbXBsZXhUZXh0UnVucyAodmlzdWFsIG9yZGVy
KS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRS
dW46OmluZGV4QmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVy
OjpDb21wbGV4VGV4dFJ1bjo6bHRyKToKKyAgICAgICAgKENvbXBsZXhUZXh0UnVuKTogQWRkIGhl
bHBlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZhbHVlcyBwZXJ0aW5lbnQgdG8gaW5kaXZpZHVhbCBy
dW5zIGFzIG9wcG9zZWQgdG8gdGhlIGVudGlyZSBjb250YWluaW5nIGxpbmUuCisgICAgICAgIChX
ZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OnN0cmluZ0JlZ2luKTogUmV0dXJuIGZpcnN0
IHN0cmluZyBpbmRleC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
c3RyaW5nRW5kKTogUmV0dXJuIG9uZSBwYXN0IGxhc3Qgc3RyaW5nIGluZGV4LgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5tbTog
SW5pdGlhbGl6ZSBtX2luZGV4QmVnaW4gYW5kIG1fbHRyLgorICAgICAgICAoV2ViQ29yZTo6Q29t
cGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29tcGxleFRleHRSdW4pOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOiBBZGQgVGV4dExheW91dEluZm8sIG1hcHBp
bmcgZnJvbSBSZW5kZXJUZXh0IHRvIChwb3NzaWJseSBudWxsKSBUZXh0TGF5b3V0LgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgIChSZW5kZXJCbG9jayk6CisgICAgICAgIChMaW5lQnJlYWtl
cik6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UpOiBB
bGxvdyBUZXh0TGF5b3V0IGluc3RhbmNlIHRvIGJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gbmV4
dExpbmVCcmVhay4KKyAgICAgICAgKFdlYkNvcmU6OnRleHRXaWR0aCk6IFVzZSBUZXh0TGF5b3V0
IHdoZW4gc3VwcGxpZWQgZm9yIG1lYXN1cmluZy4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrOjpMaW5lQnJlYWtlcjo6bmV4dExpbmVCcmVhayk6CisKIDIwMTItMDYtMTIgIEplciBOb2Js
ZSAgPGplci5ub2JsZUBhcHBsZS5jb20+CiAKICAgICAgICAgTWVkaWFDb250cm9sbGVyLmN1cnJl
bnRUaW1lIHNob3VsZCBiZSBrZXB0IHN0YWJsZSBkdXJpbmcgc2NyaXB0IGV4ZWN1dGlvbi4KSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCShyZXZpc2lvbiAx
MjMzNTgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjcsOCArMjcsOSBAQAogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2lu
Y2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZvbnRUcmFuc2NvZGVyLmgiCi0jaW5jbHVk
ZSAiSW50UG9pbnQuaCIKICNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkludFBv
aW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJUZXh0UnVuLmgi
CiAjaW5jbHVkZSAiV2lkdGhJdGVyYXRvci5oIgogI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+
CkBAIC0zOSw2ICs0MCwxNiBAQAogdXNpbmcgbmFtZXNwYWNlIFdURjsKIHVzaW5nIG5hbWVzcGFj
ZSBVbmljb2RlOwogCituYW1lc3BhY2UgV1RGIHsKKworLy8gYWxsb3cgY29tcGlsYXRpb24gb2Yg
T3duUHRyPFRleHRMYXlvdXQ+IGluIHNvdXJjZSBmaWxlcyB0aGF0IGRvbid0IGhhdmUgYWNjZXNz
IHRvIHRoZSBUZXh0TGF5b3V0IGNsYXNzIGRlZmluaXRpb24KK3RlbXBsYXRlIDw+IHZvaWQgZGVs
ZXRlT3duZWRQdHI8V2ViQ29yZTo6VGV4dExheW91dD4oV2ViQ29yZTo6VGV4dExheW91dCogcHRy
KQoreworICAgIFdlYkNvcmU6OkZvbnQ6OmRlc3Ryb3lMYXlvdXQocHRyKTsKK30KKworfQorCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNvbnN0IHVpbnQ4X3QgRm9udDo6c19yb3VuZGluZ0hhY2tD
aGFyYWN0ZXJUYWJsZVsyNTZdID0gewpAQCAtMTk3LDYgKzIwOCwyNSBAQCBmbG9hdCBGb250Ojp3
aWR0aChjb25zdCBUZXh0UnVuJiBydW4sIGluCiAgICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JDb21w
bGV4VGV4dChydW4pOwogfQogCisjaWYgIVBMQVRGT1JNKE1BQykKKworUGFzc093blB0cjxUZXh0
TGF5b3V0PiBGb250OjpjcmVhdGVMYXlvdXQoUmVuZGVyVGV4dCosIGZsb2F0IHhQb3MsIGJvb2wg
Y29sbGFwc2VXaGl0ZVNwYWNlKSBjb25zdAoreworICAgIHJldHVybiBudWxscHRyOworfQorCit2
b2lkIEZvbnQ6OmRlc3Ryb3lMYXlvdXQoVGV4dExheW91dCopCit7Cit9CisKK2Zsb2F0IEZvbnQ6
OndpZHRoKFRleHRMYXlvdXQmLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYKKwogRmxvYXRSZWN0
IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewogICAgIHRv
ID0gKHRvID09IC0xID8gcnVuLmxlbmd0aCgpIDogdG8pOwpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAkocmV2aXNpb24gMTIzMzU4KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCSh3b3JraW5nIGNvcHkpCkBAIC01NSw2ICs1NSw4
IEBAIGNsYXNzIEZvbnRTZWxlY3RvcjsKIGNsYXNzIEdseXBoQnVmZmVyOwogY2xhc3MgR2x5cGhQ
YWdlVHJlZU5vZGU7CiBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBSZW5kZXJUZXh0Owor
Y2xhc3MgVGV4dExheW91dDsKIGNsYXNzIFRleHRSdW47CiAKIHN0cnVjdCBHbHlwaERhdGE7CkBA
IC0xMDQsNiArMTA2LDEwIEBAIHB1YmxpYzoKICAgICBmbG9hdCB3aWR0aChjb25zdCBUZXh0UnVu
JiwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCwgR2x5
cGhPdmVyZmxvdyogPSAwKSBjb25zdDsKICAgICBmbG9hdCB3aWR0aChjb25zdCBUZXh0UnVuJiwg
aW50JiBjaGFyc0NvbnN1bWVkLCBTdHJpbmcmIGdseXBoTmFtZSkgY29uc3Q7CiAKKyAgICBQYXNz
T3duUHRyPFRleHRMYXlvdXQ+IGNyZWF0ZUxheW91dChSZW5kZXJUZXh0KiwgZmxvYXQgeFBvcywg
Ym9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpIGNvbnN0OworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lM
YXlvdXQoVGV4dExheW91dCopOworICAgIHN0YXRpYyBmbG9hdCB3aWR0aChUZXh0TGF5b3V0Jiwg
dW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworCiAgICAgaW50IG9mZnNldEZvclBvc2l0aW9u
KGNvbnN0IFRleHRSdW4mLCBmbG9hdCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBo
cykgY29uc3Q7CiAgICAgRmxvYXRSZWN0IHNlbGVjdGlvblJlY3RGb3JUZXh0KGNvbnN0IFRleHRS
dW4mLCBjb25zdCBGbG9hdFBvaW50JiwgaW50IGgsIGludCBmcm9tID0gMCwgaW50IHRvID0gLTEp
IGNvbnN0OwogCkBAIC0zMTUsNCArMzIxLDEwIEBAIGlubGluZSBmbG9hdCBGb250Ojp0YWJXaWR0
aChjb25zdCBTaW1wbGUKIAogfQogCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGUgPD4gdm9p
ZCBkZWxldGVPd25lZFB0cjxXZWJDb3JlOjpUZXh0TGF5b3V0PihXZWJDb3JlOjpUZXh0TGF5b3V0
Kik7CisKK30KKwogI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAkocmV2
aXNpb24gMTIzMzU4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0Nv
bXBsZXhUZXh0Q29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDggQEAK
IAogI2luY2x1ZGUgIkZsb2F0U2l6ZS5oIgogI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJCbG9jay5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlICJUZXh0QnJl
YWtJdGVyYXRvci5oIgogI2luY2x1ZGUgIlRleHRSdW4uaCIKICNpbmNsdWRlIDxBcHBsaWNhdGlv
blNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KQEAgLTM3LDYgKzM5LDcxIEBAIHVzaW5n
IG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgVGV4dExheW91
dCB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgaXNOZWVkZWQoUmVuZGVyVGV4dCogdGV4dCwg
Y29uc3QgRm9udCYgZm9udCkKKyAgICB7CisgICAgICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxv
Y2s6OmNvbnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpLCB0ZXh0
LT50ZXh0TGVuZ3RoKCksIHRleHQtPnN0eWxlKCkpOworICAgICAgICByZXR1cm4gZm9udC5jb2Rl
UGF0aChydW4pID09IEZvbnQ6OkNvbXBsZXg7CisgICAgfQorCisgICAgc3RhdGljIEZvbnQgZm9u
dFdpdGhOb1dvcmRTcGFjaW5nKGNvbnN0IEZvbnQmIG9yaWdpbmFsRm9udCkKKyAgICB7CisgICAg
ICAgIEZvbnQgZm9udChvcmlnaW5hbEZvbnQpOworICAgICAgICBmb250LnNldFdvcmRTcGFjaW5n
KDApOworICAgICAgICByZXR1cm4gZm9udDsKKyAgICB9CisKKyAgICBzdGF0aWMgVGV4dFJ1biBj
b25zdHJ1Y3RUZXh0UnVuKFJlbmRlclRleHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0
IHhQb3MpCisgICAgeworICAgICAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1
Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQtPmNoYXJhY3RlcnMoKSwgdGV4dC0+dGV4dExlbmd0
aCgpLCB0ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4
dC0+dGV4dExlbmd0aCgpKTsKKyAgICAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkg
Pj0gcnVuLmxlbmd0aCgpKTsKKworICAgICAgICBydW4uc2V0WFBvcyh4UG9zKTsKKyAgICAgICAg
cmV0dXJuIHJ1bjsKKyAgICB9CisKKyAgICBUZXh0TGF5b3V0KFJlbmRlclRleHQqIHRleHQsIGNv
bnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MpCisgICAgICAgIDogbV9mb250KGZvbnRXaXRoTm9X
b3JkU3BhY2luZyhmb250KSkKKyAgICAgICAgLCBtX3J1bihjb25zdHJ1Y3RUZXh0UnVuKHRleHQs
IGZvbnQsIHhQb3MpKQorICAgICAgICAsIG1fY29udHJvbGxlcihhZG9wdFB0cihuZXcgQ29tcGxl
eFRleHRDb250cm9sbGVyKCZtX2ZvbnQsIG1fcnVuLCB0cnVlKSkpCisgICAgeworICAgIH0KKwor
ICAgIGZsb2F0IHdpZHRoKHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbikKKyAgICB7CisgICAg
ICAgIG1fY29udHJvbGxlci0+YWR2YW5jZShmcm9tLCAwLCB0cnVlKTsKKyAgICAgICAgZmxvYXQg
YmVmb3JlV2lkdGggPSBtX2NvbnRyb2xsZXItPnJ1bldpZHRoU29GYXIoKTsKKyAgICAgICAgbV9j
b250cm9sbGVyLT5hZHZhbmNlKGZyb20gKyBsZW4sIDAsIHRydWUpOworICAgICAgICBmbG9hdCBh
ZnRlcldpZHRoID0gbV9jb250cm9sbGVyLT5ydW5XaWR0aFNvRmFyKCk7CisgICAgICAgIHJldHVy
biBhZnRlcldpZHRoIC0gYmVmb3JlV2lkdGg7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENv
bXBsZXhUZXh0Q29udHJvbGxlciBoYXMgb25seSByZWZlcmVuY2VzIHRvIGl0cyBGb250IGFuZCBU
ZXh0UnVuIHNvIHRoZXkgbXVzdCBiZSBrZXB0IGFsaXZlIGhlcmUKKyAgICBGb250IG1fZm9udDsK
KyAgICBUZXh0UnVuIG1fcnVuOworICAgIE93blB0cjxDb21wbGV4VGV4dENvbnRyb2xsZXI+IG1f
Y29udHJvbGxlcjsKK307CisKK1Bhc3NPd25QdHI8VGV4dExheW91dD4gRm9udDo6Y3JlYXRlTGF5
b3V0KFJlbmRlclRleHQqIHRleHQsIGZsb2F0IHhQb3MsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNl
KSBjb25zdAoreworICAgIGlmIChjb2xsYXBzZVdoaXRlU3BhY2UgJiYgVGV4dExheW91dDo6aXNO
ZWVkZWQodGV4dCwgKnRoaXMpKQorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFRleHRMYXlv
dXQodGV4dCwgKnRoaXMsIHhQb3MpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBG
b250OjpkZXN0cm95TGF5b3V0KFRleHRMYXlvdXQqIGxheW91dCkKK3sKKyAgICBkZWxldGUgbGF5
b3V0OworfQorCitmbG9hdCBGb250Ojp3aWR0aChUZXh0TGF5b3V0JiBsYXlvdXQsIHVuc2lnbmVk
IGZyb20sIHVuc2lnbmVkIHRvKQoreworICAgIHJldHVybiBsYXlvdXQud2lkdGgoZnJvbSwgdG8p
OworfQorCiBzdGF0aWMgaW5saW5lIENHRmxvYXQgcm91bmRDR0Zsb2F0KENHRmxvYXQgZikKIHsK
ICAgICBpZiAoc2l6ZW9mKENHRmxvYXQpID09IHNpemVvZihmbG9hdCkpCkBAIC01NCw2ICsxMjEs
NyBAQCBzdGF0aWMgaW5saW5lIENHRmxvYXQgY2VpbENHRmxvYXQoQ0dGbG9hCiBDb21wbGV4VGV4
dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcihjb25zdCBGb250KiBmb250LCBjb25z
dCBUZXh0UnVuJiBydW4sIGJvb2wgbWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24sIEhhc2hT
ZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cywgYm9vbCBmb3JUZXh0RW1w
aGFzaXMpCiAgICAgOiBtX2ZvbnQoKmZvbnQpCiAgICAgLCBtX3J1bihydW4pCisgICAgLCBtX2x0
ck9ubHkodHJ1ZSkKICAgICAsIG1fbWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24obWF5VXNl
TmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24pCiAgICAgLCBtX2ZvclRleHRFbXBoYXNpcyhmb3JUZXh0
RW1waGFzaXMpCiAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXIoMCkKQEAgLTM0MCwyNSArNDA4LDc1
IEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFIKICAgICB9CiB9CiAK
LXZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2lnbmVkIG9mZnNldCwgR2x5
cGhCdWZmZXIqIGdseXBoQnVmZmVyKQordW5zaWduZWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpp
bmRleE9mQ3VycmVudFJ1bih1bnNpZ25lZCYgbGVmdG1vc3RHbHlwaCkKK3sKKyAgICBsZWZ0bW9z
dEdseXBoID0gMDsKKyAgICAKKyAgICBzaXplX3QgcnVuQ291bnQgPSBtX2NvbXBsZXhUZXh0UnVu
cy5zaXplKCk7CisgICAgaWYgKG1fY3VycmVudFJ1biA+PSBydW5Db3VudCkKKyAgICAgICAgcmV0
dXJuIHJ1bkNvdW50OworCisgICAgaWYgKG1fbHRyT25seSkgeworICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbV9jdXJyZW50UnVuOyArK2kpCisgICAgICAgICAgICBsZWZ0bW9zdEds
eXBoICs9IG1fY29tcGxleFRleHRSdW5zW2ldLT5nbHlwaENvdW50KCk7CisgICAgICAgIHJldHVy
biBtX2N1cnJlbnRSdW47CisgICAgfQorCisgICAgd2hpbGUgKG1fcnVuSW5kaWNlcy5zaXplKCkg
PD0gbV9jdXJyZW50UnVuKSB7CisgICAgICAgIHVuc2lnbmVkIG9mZnNldCA9IG1fcnVuSW5kaWNl
cy5pc0VtcHR5KCkgPyAwIDogc3RyaW5nRW5kKCptX2NvbXBsZXhUZXh0UnVuc1ttX3J1bkluZGlj
ZXMubGFzdCgpXSk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bkNvdW50
OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RyaW5nQmVnaW4oKm1fY29tcGxl
eFRleHRSdW5zW2ldKSkgeworICAgICAgICAgICAgICAgIG1fcnVuSW5kaWNlcy5hcHBlbmQoaSk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKKyAgICB1bnNpZ25lZCBjdXJyZW50UnVuSW5kZXggPSBtX3J1bkluZGljZXNbbV9jdXJyZW50
UnVuXTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY3VycmVudFJ1bkluZGV4OyArK2kp
CisgICAgICAgIGxlZnRtb3N0R2x5cGggKz0gbV9jb21wbGV4VGV4dFJ1bnNbaV0tPmdseXBoQ291
bnQoKTsKKyAgICByZXR1cm4gY3VycmVudFJ1bkluZGV4OworfQorCit1bnNpZ25lZCBDb21wbGV4
VGV4dENvbnRyb2xsZXI6OmluY3JlbWVudEN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5
cGgpCit7CisgICAgaWYgKG1fbHRyT25seSkgeworICAgICAgICBsZWZ0bW9zdEdseXBoICs9IG1f
Y29tcGxleFRleHRSdW5zW21fY3VycmVudFJ1bisrXS0+Z2x5cGhDb3VudCgpOworICAgICAgICBy
ZXR1cm4gbV9jdXJyZW50UnVuOworICAgIH0KKworICAgIG1fY3VycmVudFJ1bisrOworICAgIGxl
ZnRtb3N0R2x5cGggPSAwOworICAgIHJldHVybiBpbmRleE9mQ3VycmVudFJ1bihsZWZ0bW9zdEds
eXBoKTsKK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UodW5zaWduZWQg
b2Zmc2V0LCBHbHlwaEJ1ZmZlciogZ2x5cGhCdWZmZXIsIGJvb2wgYnlXaG9sZUdseXBocykKIHsK
ICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihvZmZzZXQpID4gbV9lbmQpCiAgICAgICAgIG9mZnNl
dCA9IG1fZW5kOwogCi0gICAgaWYgKG9mZnNldCA8PSBtX2N1cnJlbnRDaGFyYWN0ZXIpCi0gICAg
ICAgIHJldHVybjsKKyAgICBpZiAob2Zmc2V0IDw9IG1fY3VycmVudENoYXJhY3RlcikgeworICAg
ICAgICBtX3J1bldpZHRoU29GYXIgPSBtX2xlYWRpbmdFeHBhbnNpb247CisgICAgICAgIG1fbnVt
R2x5cGhzU29GYXIgPSAwOworICAgICAgICBtX2N1cnJlbnRSdW4gPSAwOworICAgICAgICBtX2ds
eXBoSW5DdXJyZW50UnVuID0gMDsKKyAgICAgICAgbV9jaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCA9
IDA7CisgICAgfQogCiAgICAgbV9jdXJyZW50Q2hhcmFjdGVyID0gb2Zmc2V0OwogCiAgICAgc2l6
ZV90IHJ1bkNvdW50ID0gbV9jb21wbGV4VGV4dFJ1bnMuc2l6ZSgpOwogCi0gICAgYm9vbCBsdHIg
PSBtX3J1bi5sdHIoKTsKLQotICAgIHVuc2lnbmVkIGsgPSBsdHIgPyBtX251bUdseXBoc1NvRmFy
IDogbV9hZGp1c3RlZEdseXBocy5zaXplKCkgLSAxIC0gbV9udW1HbHlwaHNTb0ZhcjsKKyAgICB1
bnNpZ25lZCBsZWZ0bW9zdEdseXBoID0gMDsKKyAgICB1bnNpZ25lZCBjdXJyZW50UnVuSW5kZXgg
PSBpbmRleE9mQ3VycmVudFJ1bihsZWZ0bW9zdEdseXBoKTsKICAgICB3aGlsZSAobV9jdXJyZW50
UnVuIDwgcnVuQ291bnQpIHsKLSAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhU
ZXh0UnVuID0gKm1fY29tcGxleFRleHRSdW5zW2x0ciA/IG1fY3VycmVudFJ1biA6IHJ1bkNvdW50
IC0gMSAtIG1fY3VycmVudFJ1bl07CisgICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBjb21w
bGV4VGV4dFJ1biA9ICptX2NvbXBsZXhUZXh0UnVuc1tjdXJyZW50UnVuSW5kZXhdOworICAgICAg
ICBib29sIGx0ciA9IGNvbXBsZXhUZXh0UnVuLmx0cigpOwogICAgICAgICBzaXplX3QgZ2x5cGhD
b3VudCA9IGNvbXBsZXhUZXh0UnVuLmdseXBoQ291bnQoKTsKICAgICAgICAgdW5zaWduZWQgZyA9
IGx0ciA/IG1fZ2x5cGhJbkN1cnJlbnRSdW4gOiBnbHlwaENvdW50IC0gMSAtIG1fZ2x5cGhJbkN1
cnJlbnRSdW47CisgICAgICAgIHVuc2lnbmVkIGsgPSBsZWZ0bW9zdEdseXBoICsgZzsKKwogICAg
ICAgICB3aGlsZSAobV9nbHlwaEluQ3VycmVudFJ1biA8IGdseXBoQ291bnQpIHsKICAgICAgICAg
ICAgIHVuc2lnbmVkIGdseXBoU3RhcnRPZmZzZXQgPSBjb21wbGV4VGV4dFJ1bi5pbmRleEF0KGcp
OwogICAgICAgICAgICAgdW5zaWduZWQgZ2x5cGhFbmRPZmZzZXQ7CkBAIC0zODcsNiArNTA1LDkg
QEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UodW5zaQogICAgICAgICAgICAg
ICAgIC8vIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGdseXBocyBwZXIgY2hhcmFjdGVyIHdlIG5l
ZWQgdG8gYWR2YW5jZSBieSB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgZ2x5cGguCiAgICAgICAgICAg
ICAgICAgQVNTRVJUKG1fY2hhcmFjdGVySW5DdXJyZW50R2x5cGggPT0gb2xkQ2hhcmFjdGVySW5D
dXJyZW50R2x5cGgpOwogICAgICAgICAgICAgICAgIG1fcnVuV2lkdGhTb0ZhciArPSBhZGp1c3Rl
ZEFkdmFuY2Uud2lkdGg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5V2hvbGVHbHlwaHMpIHsK
KyAgICAgICAgICAgICAgICBpZiAoIW9sZENoYXJhY3RlckluQ3VycmVudEdseXBoKQorICAgICAg
ICAgICAgICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0gYWRqdXN0ZWRBZHZhbmNlLndpZHRoOwog
ICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IGFk
anVzdGVkQWR2YW5jZS53aWR0aCAqIChtX2NoYXJhY3RlckluQ3VycmVudEdseXBoIC0gb2xkQ2hh
cmFjdGVySW5DdXJyZW50R2x5cGgpIC8gKGdseXBoRW5kT2Zmc2V0IC0gZ2x5cGhTdGFydE9mZnNl
dCk7CiAKQEAgLTQwNCwxMCArNTI1LDEwIEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjph
ZHZhbmNlKHVuc2kKICAgICAgICAgICAgICAgICBrLS07CiAgICAgICAgICAgICB9CiAgICAgICAg
IH0KLSAgICAgICAgbV9jdXJyZW50UnVuKys7CisgICAgICAgIGN1cnJlbnRSdW5JbmRleCA9IGlu
Y3JlbWVudEN1cnJlbnRSdW4obGVmdG1vc3RHbHlwaCk7CiAgICAgICAgIG1fZ2x5cGhJbkN1cnJl
bnRSdW4gPSAwOwogICAgIH0KLSAgICBpZiAoIWx0ciAmJiBtX251bUdseXBoc1NvRmFyID09IG1f
YWRqdXN0ZWRBZHZhbmNlcy5zaXplKCkpCisgICAgaWYgKCFtX3J1bi5sdHIoKSAmJiBtX251bUds
eXBoc1NvRmFyID09IG1fYWRqdXN0ZWRBZHZhbmNlcy5zaXplKCkpCiAgICAgICAgIG1fcnVuV2lk
dGhTb0ZhciArPSBtX2ZpbmFsUm91bmRpbmdXaWR0aDsKIH0KIApAQCAtNDIxLDYgKzU0Miw5IEBA
IHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZGp1c3RHbHlwaHMKICAgICAgICAgdW5zaWdu
ZWQgZ2x5cGhDb3VudCA9IGNvbXBsZXhUZXh0UnVuLmdseXBoQ291bnQoKTsKICAgICAgICAgY29u
c3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gY29tcGxleFRleHRSdW4uZm9udERhdGEoKTsK
IAorICAgICAgICBpZiAoIWNvbXBsZXhUZXh0UnVuLmx0cigpKQorICAgICAgICAgICAgbV9sdHJP
bmx5ID0gZmFsc2U7CisKICAgICAgICAgY29uc3QgQ0dHbHlwaCogZ2x5cGhzID0gY29tcGxleFRl
eHRSdW4uZ2x5cGhzKCk7CiAgICAgICAgIGNvbnN0IENHU2l6ZSogYWR2YW5jZXMgPSBjb21wbGV4
VGV4dFJ1bi5hZHZhbmNlcygpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5oCShyZXZp
c2lvbiAxMjMzNTgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29t
cGxleFRleHRDb250cm9sbGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTUxLDcgKzUxLDcgQEAgcHVi
bGljOgogICAgIENvbXBsZXhUZXh0Q29udHJvbGxlcihjb25zdCBGb250KiwgY29uc3QgVGV4dFJ1
biYsIGJvb2wgbWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24gPSBmYWxzZSwgSGFzaFNldDxj
b25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCwgYm9vbCBmb3JUZXh0RW1w
aGFzaXMgPSBmYWxzZSk7CiAKICAgICAvLyBBZHZhbmNlIGFuZCBlbWl0IGdseXBocyB1cCB0byB0
aGUgc3BlY2lmaWVkIGNoYXJhY3Rlci4KLSAgICB2b2lkIGFkdmFuY2UodW5zaWduZWQgdG8sIEds
eXBoQnVmZmVyKiA9IDApOworICAgIHZvaWQgYWR2YW5jZSh1bnNpZ25lZCB0bywgR2x5cGhCdWZm
ZXIqID0gMCwgYm9vbCBieVdob2xlR2x5cGhzID0gZmFsc2UpOwogCiAgICAgLy8gQ29tcHV0ZSB0
aGUgY2hhcmFjdGVyIG9mZnNldCBmb3IgYSBnaXZlbiB4IGNvb3JkaW5hdGUuCiAgICAgaW50IG9m
ZnNldEZvclBvc2l0aW9uKGZsb2F0IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOwpAQCAt
ODksMTAgKzg5LDEyIEBAIHByaXZhdGU6CiAgICAgICAgIHVuc2lnbmVkIHN0cmluZ0xvY2F0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdMb2NhdGlvbjsgfQogICAgICAgICBzaXplX3Qgc3Ry
aW5nTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmdMZW5ndGg7IH0KICAgICAgICAgQUxX
QVlTX0lOTElORSBDRkluZGV4IGluZGV4QXQoc2l6ZV90IGkpIGNvbnN0OworICAgICAgICBDRklu
ZGV4IGluZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiBtX2luZGV4QmVnaW47IH0KICAgICAgICAg
Q0ZJbmRleCBpbmRleEVuZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXhFbmQ7IH0KICAgICAgICAg
Q0ZJbmRleCBlbmRPZmZzZXRBdChzaXplX3QgaSkgY29uc3QgeyBBU1NFUlQoIW1faXNNb25vdG9u
aWMpOyByZXR1cm4gbV9nbHlwaEVuZE9mZnNldHNbaV07IH0KICAgICAgICAgY29uc3QgQ0dHbHlw
aCogZ2x5cGhzKCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHM7IH0KICAgICAgICAgY29uc3QgQ0dT
aXplKiBhZHZhbmNlcygpIGNvbnN0IHsgcmV0dXJuIG1fYWR2YW5jZXM7IH0KKyAgICAgICAgYm9v
bCBsdHIoKSBjb25zdCB7IHJldHVybiBtX2x0cjsgfQogICAgICAgICBib29sIGlzTW9ub3Rvbmlj
KCkgY29uc3QgeyByZXR1cm4gbV9pc01vbm90b25pYzsgfQogICAgICAgICB2b2lkIHNldElzTm9u
TW9ub3RvbmljKCk7CiAKQEAgLTEwNywyMiArMTA5LDMyIEBAIHByaXZhdGU6CiAgICAgICAgIHNp
emVfdCBtX3N0cmluZ0xlbmd0aDsKICAgICAgICAgVmVjdG9yPENGSW5kZXgsIDY0PiBtX2NvcmVU
ZXh0SW5kaWNlc1ZlY3RvcjsKICAgICAgICAgY29uc3QgQ0ZJbmRleCogbV9jb3JlVGV4dEluZGlj
ZXM7CisgICAgICAgIENGSW5kZXggbV9pbmRleEJlZ2luOwogICAgICAgICBDRkluZGV4IG1faW5k
ZXhFbmQ7CiAgICAgICAgIFZlY3RvcjxDRkluZGV4LCA2ND4gbV9nbHlwaEVuZE9mZnNldHM7CiAg
ICAgICAgIFZlY3RvcjxDR0dseXBoLCA2ND4gbV9nbHlwaHNWZWN0b3I7CiAgICAgICAgIGNvbnN0
IENHR2x5cGgqIG1fZ2x5cGhzOwogICAgICAgICBWZWN0b3I8Q0dTaXplLCA2ND4gbV9hZHZhbmNl
c1ZlY3RvcjsKICAgICAgICAgY29uc3QgQ0dTaXplKiBtX2FkdmFuY2VzOworICAgICAgICBib29s
IG1fbHRyOwogICAgICAgICBib29sIG1faXNNb25vdG9uaWM7CiAgICAgfTsKKyAgICAKKyAgICBz
dGF0aWMgdW5zaWduZWQgc3RyaW5nQmVnaW4oY29uc3QgQ29tcGxleFRleHRSdW4mIHJ1bikgeyBy
ZXR1cm4gcnVuLnN0cmluZ0xvY2F0aW9uKCkgKyBydW4uaW5kZXhCZWdpbigpOyB9CisgICAgc3Rh
dGljIHVuc2lnbmVkIHN0cmluZ0VuZChjb25zdCBDb21wbGV4VGV4dFJ1biYgcnVuKSB7IHJldHVy
biBydW4uc3RyaW5nTG9jYXRpb24oKSArIHJ1bi5pbmRleEVuZCgpOyB9CiAKICAgICB2b2lkIGNv
bGxlY3RDb21wbGV4VGV4dFJ1bnMoKTsKIAogICAgIHZvaWQgY29sbGVjdENvbXBsZXhUZXh0UnVu
c0ZvckNoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIHN0
cmluZ0xvY2F0aW9uLCBjb25zdCBTaW1wbGVGb250RGF0YSopOwogICAgIHZvaWQgYWRqdXN0R2x5
cGhzQW5kQWR2YW5jZXMoKTsKIAorICAgIHVuc2lnbmVkIGluZGV4T2ZDdXJyZW50UnVuKHVuc2ln
bmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICB1bnNpZ25lZCBpbmNyZW1lbnRDdXJyZW50UnVuKHVu
c2lnbmVkJiBsZWZ0bW9zdEdseXBoKTsKKyAgICBWZWN0b3I8dW5zaWduZWQsIDg+IG1fcnVuSW5k
aWNlczsKKwogICAgIGNvbnN0IEZvbnQmIG1fZm9udDsKICAgICBjb25zdCBUZXh0UnVuJiBtX3J1
bjsKKyAgICBib29sIG1fbHRyT25seTsKICAgICBib29sIG1fbWF5VXNlTmF0dXJhbFdyaXRpbmdE
aXJlY3Rpb247CiAgICAgYm9vbCBtX2ZvclRleHRFbXBoYXNpczsKIApJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0
Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9D
b21wbGV4VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5tbQkocmV2aXNpb24gMTIzMzU4KQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNv
cmVUZXh0Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNyArMTA1LDkgQEAgQ29tcGxleFRleHRD
b250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3Rl
cnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9zdHJp
bmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKHJ1blJhbmdlLmxvY2F0
aW9uKQogICAgICwgbV9pbmRleEVuZChydW5SYW5nZS5sb2NhdGlvbiArIHJ1blJhbmdlLmxlbmd0
aCkKKyAgICAsIG1fbHRyKCEoQ1RSdW5HZXRTdGF0dXMoY3RSdW4pICYga0NUUnVuU3RhdHVzUmln
aHRUb0xlZnQpKQogICAgICwgbV9pc01vbm90b25pYyh0cnVlKQogewogICAgIG1fZ2x5cGhDb3Vu
dCA9IENUUnVuR2V0R2x5cGhDb3VudChjdFJ1bik7CkBAIC0xMzgsNyArMTQwLDkgQEAgQ29tcGxl
eFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNo
YXJhY3RlcnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwg
bV9zdHJpbmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKDApCiAgICAg
LCBtX2luZGV4RW5kKHN0cmluZ0xlbmd0aCkKKyAgICAsIG1fbHRyKGx0cikKICAgICAsIG1faXNN
b25vdG9uaWModHJ1ZSkKIHsKICAgICBtX2NvcmVUZXh0SW5kaWNlc1ZlY3Rvci5yZXNlcnZlSW5p
dGlhbENhcGFjaXR5KG1fc3RyaW5nTGVuZ3RoKTsKQEAgLTE1NCw3ICsxNTgsNyBAQCBDb21wbGV4
VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDCiAgICAgICAgICAgICByKys7CiAgICAg
fQogICAgIG1fZ2x5cGhDb3VudCA9IG1fY29yZVRleHRJbmRpY2VzVmVjdG9yLnNpemUoKTsKLSAg
ICBpZiAoIWx0cikgeworICAgIGlmICghbV9sdHIpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBy
ID0gMCwgZW5kID0gbV9nbHlwaENvdW50IC0gMTsgciA8IG1fZ2x5cGhDb3VudCAvIDI7ICsrciwg
LS1lbmQpCiAgICAgICAgICAgICBzdGQ6OnN3YXAobV9jb3JlVGV4dEluZGljZXNWZWN0b3Jbcl0s
IG1fY29yZVRleHRJbmRpY2VzVmVjdG9yW2VuZF0pOwogICAgIH0KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxMjMzNTgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgs
NyBAQCBzdHJ1Y3QgQmlkaVJ1bjsKIHN0cnVjdCBQYWludEluZm87CiBjbGFzcyBMaW5lSW5mbzsK
IGNsYXNzIFJlbmRlclJ1YnlSdW47CitjbGFzcyBUZXh0TGF5b3V0OwogCiB0ZW1wbGF0ZSA8Y2xh
c3MgSXRlcmF0b3IsIGNsYXNzIFJ1bj4gY2xhc3MgQmlkaVJlc29sdmVyOwogdGVtcGxhdGUgPGNs
YXNzIFJ1bj4gY2xhc3MgQmlkaVJ1bkxpc3Q7CkBAIC02ODAsNiArNjgxLDcgQEAgcHJpdmF0ZToK
IAogICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zJyBpbXBsZW1lbnRhdGlvbnMgYXJlIGlu
IFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAuCiAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8UmVuZGVy
VGV4dCosIExhenlMaW5lQnJlYWtJdGVyYXRvcj4gTGluZUJyZWFrSXRlcmF0b3JJbmZvOworICAg
IHR5cGVkZWYgc3RkOjpwYWlyPFJlbmRlclRleHQqLCBPd25QdHI8VGV4dExheW91dD4gPiBUZXh0
TGF5b3V0SW5mbzsKICAgICBjbGFzcyBMaW5lQnJlYWtlciB7CiAgICAgcHVibGljOgogICAgICAg
ICBMaW5lQnJlYWtlcihSZW5kZXJCbG9jayogYmxvY2spCkBAIC02ODgsNyArNjkwLDcgQEAgcHJp
dmF0ZToKICAgICAgICAgICAgIHJlc2V0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBJbmxpbmVJ
dGVyYXRvciBuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgTGlu
ZUJyZWFrSXRlcmF0b3JJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKKyAgICAgICAgSW5s
aW5lSXRlcmF0b3IgbmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYs
IExpbmVCcmVha0l0ZXJhdG9ySW5mbyYsIFRleHRMYXlvdXRJbmZvJiwgRmxvYXRpbmdPYmplY3Qq
IGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzKTsKIAogICAgICAgICBib29sIGxpbmVXYXNIeXBoZW5hdGVkKCkgeyByZXR1cm4gbV9o
eXBoZW5hdGVkOyB9CiAgICAgICAgIGNvbnN0IFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25l
ZE9iamVjdHMoKSB7IHJldHVybiBtX3Bvc2l0aW9uZWRPYmplY3RzOyB9CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2
aXNpb24gMTIzMzU4KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGlu
ZUxheW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyNDAsNiArMTI0MCw3IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblIKICAgICBJbmxpbmVJdGVyYXRvciBlbmQg
PSByZXNvbHZlci5wb3NpdGlvbigpOwogICAgIGJvb2wgY2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBs
YXlvdXRTdGF0ZS5lbmRMaW5lKCk7CiAgICAgTGluZUJyZWFrSXRlcmF0b3JJbmZvIGxpbmVCcmVh
a0l0ZXJhdG9ySW5mbzsKKyAgICBUZXh0TGF5b3V0SW5mbyB0ZXh0TGF5b3V0SW5mbzsKICAgICBW
ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUgdmVydGljYWxQb3NpdGlvbkNhY2hlOwogCiAgICAgTGluZUJy
ZWFrZXIgbGluZUJyZWFrZXIodGhpcyk7CkBAIC0xMjYyLDcgKzEyNjMsNyBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SCiAgICAgICAgIGNvbnN0IElubGluZUl0ZXJh
dG9yIG9sZEVuZCA9IGVuZDsKICAgICAgICAgYm9vbCBpc05ld1VCQVBhcmFncmFwaCA9IGxheW91
dFN0YXRlLmxpbmVJbmZvKCkucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCk7CiAgICAgICAgIEZs
b2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lID0gKG1fZmxvYXRpbmdPYmpl
Y3RzICYmICFtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkuaXNFbXB0eSgpKSA/IG1fZmxvYXRpbmdP
YmplY3RzLT5zZXQoKS5sYXN0KCkgOiAwOwotICAgICAgICBlbmQgPSBsaW5lQnJlYWtlci5uZXh0
TGluZUJyZWFrKHJlc29sdmVyLCBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLCBsaW5lQnJlYWtJdGVy
YXRvckluZm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzKTsKKyAgICAgICAgZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZl
ciwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCB0ZXh0TGF5
b3V0SW5mbywgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc2VjdXRpdmVIeXBoZW5hdGVk
TGluZXMpOwogICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CiAgICAg
ICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGNyZWF0aW5nIGFueSBydW5zIGluIG5l
eHRMaW5lQnJlYWsgdG8gYmVnaW4gd2l0aCEKICAgICAgICAgICAgIC8vIE9uY2UgQmlkaVJ1bkxp
c3QgaXMgc2VwYXJhdGVkIGZyb20gQmlkaVJlc29sdmVyIHRoaXMgd2lsbCBub3QgYmUgbmVlZGVk
LgpAQCAtMTk1MCwxMSArMTk1MSwxNCBAQCBzdGF0aWMgYm9vbCBzaG91bGRTa2lwV2hpdGVzcGFj
ZUFmdGVyU3RhCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGZsb2F0IHRl
eHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNv
bnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxh
cHNlV2hpdGVTcGFjZSkKK3N0YXRpYyBpbmxpbmUgZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQq
IHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udCYgZm9udCwgZmxv
YXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBUZXh0
TGF5b3V0KiBsYXlvdXQgPSAwKQogewogICAgIGlmIChpc0ZpeGVkUGl0Y2ggfHwgKCFmcm9tICYm
IGxlbiA9PSB0ZXh0LT50ZXh0TGVuZ3RoKCkpIHx8IHRleHQtPnN0eWxlKCktPmhhc1RleHRDb21i
aW5lKCkpCiAgICAgICAgIHJldHVybiB0ZXh0LT53aWR0aChmcm9tLCBsZW4sIGZvbnQsIHhQb3Mp
OwogCisgICAgaWYgKGxheW91dCkKKyAgICAgICAgcmV0dXJuIEZvbnQ6OndpZHRoKCpsYXlvdXQs
IGZyb20sIGxlbik7CisKICAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RU
ZXh0UnVuKHRleHQsIGZvbnQsIHRleHQtPmNoYXJhY3RlcnMoKSArIGZyb20sIGxlbiwgdGV4dC0+
c3R5bGUoKSk7CiAgICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4dC0+dGV4dExlbmd0aCgp
IC0gZnJvbSk7CiAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxlbmd0
aCgpKTsKQEAgLTIxMTcsNyArMjEyMSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2Vy
OjpyZXNldCgpCiB9CiAKIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6
bmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgbGlu
ZUluZm8sCi0gICAgTGluZUJyZWFrSXRlcmF0b3JJbmZvJiBsaW5lQnJlYWtJdGVyYXRvckluZm8s
IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKKyAgICBMaW5lQnJlYWtJdGVyYXRvckluZm8mIGxpbmVC
cmVha0l0ZXJhdG9ySW5mbywgVGV4dExheW91dEluZm8mIHRleHRMYXlvdXRJbmZvLCBGbG9hdGlu
Z09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMpCiB7CiAgICAgcmVzZXQoKTsKIApAQCAtMjM1Nyw2ICsyMzYxLDEyIEBA
IElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgICAg
ICBBU1NFUlQoY3VycmVudC5tX3BvcyA9PSB0LT50ZXh0TGVuZ3RoKCkpOwogICAgICAgICAgICAg
fQogCisgICAgICAgICAgICBpZiAodGV4dExheW91dEluZm8uZmlyc3QgIT0gdCkgeworICAgICAg
ICAgICAgICAgIHRleHRMYXlvdXRJbmZvLmZpcnN0ID0gdDsKKyAgICAgICAgICAgICAgICB0ZXh0
TGF5b3V0SW5mby5zZWNvbmQgPSBmLmNyZWF0ZUxheW91dCh0LCB3aWR0aC5jdXJyZW50V2lkdGgo
KSwgY29sbGFwc2VXaGl0ZVNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRM
YXlvdXQqIHRleHRMYXlvdXQgPSB0ZXh0TGF5b3V0SW5mby5zZWNvbmQuZ2V0KCk7CisKICAgICAg
ICAgICAgIGZvciAoOyBjdXJyZW50Lm1fcG9zIDwgdC0+dGV4dExlbmd0aCgpOyBjdXJyZW50LmZh
c3RJbmNyZW1lbnRJblRleHROb2RlKCkpIHsKICAgICAgICAgICAgICAgICBib29sIHByZXZpb3Vz
Q2hhcmFjdGVySXNTcGFjZSA9IGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOwogICAgICAgICAgICAg
ICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0ZXJJc1dTID0gY3VycmVudENoYXJhY3RlcklzV1M7CkBA
IC0yMzc4LDcgKzIzODgsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFr
ZXI6CiAgICAgICAgICAgICAgICAgaWYgKChicmVha0FsbCB8fCBicmVha1dvcmRzKSAmJiAhbWlk
V29yZEJyZWFrKSB7CiAgICAgICAgICAgICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0aDsKICAg
ICAgICAgICAgICAgICAgICAgYm9vbCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIg
PSBVMTZfSVNfTEVBRChjKSAmJiBjdXJyZW50Lm1fcG9zICsgMSA8IHQtPnRleHRMZW5ndGgoKSAm
JiBVMTZfSVNfVFJBSUwodC0+Y2hhcmFjdGVycygpW2N1cnJlbnQubV9wb3MgKyAxXSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCBt
aWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZiwgd2lkdGguY29tbWl0
dGVkV2lkdGgoKSArIHdyYXBXLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSk7Cisg
ICAgICAgICAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9z
LCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZiwgd2lkdGguY29t
bWl0dGVkV2lkdGgoKSArIHdyYXBXLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwg
dGV4dExheW91dCk7CiAgICAgICAgICAgICAgICAgICAgIG1pZFdvcmRCcmVhayA9IHdpZHRoLmNv
bW1pdHRlZFdpZHRoKCkgKyB3cmFwVyArIGNoYXJXaWR0aCA+IHdpZHRoLmF2YWlsYWJsZVdpZHRo
KCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNDA5LDkgKzI0MTksOSBAQCBJbmxpbmVJdGVy
YXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAKICAgICAgICAgICAgICAgICAgICAgZmxv
YXQgYWRkaXRpb25hbFRtcFc7CiAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkVHJhaWxpbmdT
cGFjZVdpZHRoICYmIGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAgICAgICAgICAgICAg
ICAgICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1f
cG9zICsgMSAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRj
aCwgY29sbGFwc2VXaGl0ZVNwYWNlKSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggKyBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0g
dGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGYs
IHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwg
dGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICsgbGFzdFNwYWNlV29yZFNwYWNp
bmc7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGFk
ZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxh
c3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VX
aGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAgICAgICAgICAgICAgICAg
ICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1fcG9z
IC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xs
YXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7CiAgICAg
ICAgICAgICAgICAgICAgIHdpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRtcFcp
OwogICAgICAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWRTdGFydFdpZHRoKSB7CiAgICAgICAg
ICAgICAgICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxX
aWR0aChjdXJyZW50Lm1fb2JqLCB0cnVlLCBmYWxzZSkpOwpAQCAtMjQyOCw3ICsyNDM4LDcgQEAg
SW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRoIGZvciB0aGlzIGxpbmUuCiAgICAgICAgICAg
ICAgICAgICAgICAgICBib29sIGxpbmVXYXNUb29XaWRlID0gZmFsc2U7CiAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAod2lkdGguZml0c09uTGluZSgpICYmIGN1cnJlbnRDaGFyYWN0ZXJJc1dT
ICYmIGN1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkgJiYgIW1pZFdvcmRC
cmVhaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0aCA9IHRl
eHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCAxLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNG
aXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3Jk
U3BhY2luZyA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0
aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCAxLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgo
KSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpICsgKGFwcGx5
V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIENoZWNrIGlmIGxpbmUgaXMgdG9vIGJpZyBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIHNw
YWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGlu
ZS4gSWYgaXQgaXMgbm90LCBkbyBub3RoaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIElmIHRoZSBsaW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25n
LApAQCAtMjU1NCw3ICsyNTY0LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVC
cmVha2VyOgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJTVBPUlRBTlQ6IGN1cnJl
bnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEKLSAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxU
bXBXID0gaWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVu
dC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRj
aCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAgICAg
ICAgZmxvYXQgYWRkaXRpb25hbFRtcFcgPSBpZ25vcmluZ1NwYWNlcyA/IDAgOiB0ZXh0V2lkdGgo
dCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50
V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpICsg
bGFzdFNwYWNlV29yZFNwYWNpbmc7CiAgICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdp
ZHRoKGFkZGl0aW9uYWxUbXBXICsgaW5saW5lTG9naWNhbFdpZHRoKGN1cnJlbnQubV9vYmosICFh
cHBsaWVkU3RhcnRXaWR0aCwgaW5jbHVkZUVuZFdpZHRoKSk7CiAgICAgICAgICAgICBpbmNsdWRl
RW5kV2lkdGggPSBmYWxzZTsKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>153968</attachid>
            <date>2012-07-23 23:27:00 -0700</date>
            <delta_ts>2012-08-24 00:13:26 -0700</delta_ts>
            <desc>More changes per review.</desc>
            <filename>83045-latest.txt</filename>
            <type>text/plain</type>
            <size>28857</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyMzQyMikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc2IEBACisyMDEyLTA3LTIzICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEN1cnJlbnRseSBSZW5kZXJCbG9jazo6TGluZUJyZWFr
ZXI6Om5leHRMaW5lQnJlYWsgYXNzdW1lcyB0aGF0IG1lYXN1cmluZyBpbmRpdmlkdWFsIHdvcmRz
IGlzIGFzIGNoZWFwCisgICAgICAgIGFzIGZyZWUuIFRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4g
ZGVhbGluZyB3aXRoIGNvbXBsZXggdGV4dCwgd2hpY2ggYmVuZWZpdHMgZnJvbSBsYXlpbmcgb3V0
IGFzIG11Y2gKKyAgICAgICAgdGV4dCBhcyBwb3NzaWJsZSBhbmQgYnkgcmV1c2luZyB0aGF0IGxh
eW91dCB3aGVuIGZlYXNpYmxlOiBieSBkb2luZyBzbyB0aGlzIHBhdGNoIGltcHJvdmVzIGxpbmUK
KyAgICAgICAgYnJlYWtpbmcgYnkgMzUlIGFzIG1lYXN1cmVkIHdpdGggYSBzaW1wbGUgdGVzdCBh
cHAuCisKKyAgICAgICAgVGhlIGJ1bGsgb2YgdGhpcyBjaGFuZ2UgaXMgbW9kaWZ5aW5nIENvbXBs
ZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSwgd2hpY2ggcHJldmlvdXNseSByZXF1aXJlZCB0aGUK
KyAgICAgICAgdGV4dCBvZmZzZXQgdG8gYmUgc3RyaWN0bHkgaW5jcmVhc2luZyBhbmQgYXNzdW1l
ZCB1bmlkaXJlY3Rpb25hbCB0ZXh0OyBub3cgaXQgc3VwcG9ydHMgcmFuZG9tIHNlZWtpbmcKKyAg
ICAgICAgaW4gYSBuYWl2ZSBmYXNoaW9uIChieSByZXN0YXJ0aW5nIHRvIHRoZSBiZWdpbm5pbmcp
IGFuZCB0cmF2ZXJzZXMgZ2x5cGhzIGluIGxvZ2ljYWwgb3JkZXIuIEluIHRoZQorICAgICAgICBs
YXR0ZXIgY2FzZSwgdGhlIHByZXNlbmNlIG9mIGFueSBub24tTFRSIHJ1bnMgdHJpZ2dlcnMgdGhl
IHBvcHVsYXRpb24gb2YgYSBtYXBwaW5nIGZyb20gbG9naWNhbCB0bworICAgICAgICB2aXN1YWwg
cnVuIGluZGljZXMuIEZpbmFsbHksIGEgbmV3IGZsYWcgaGFzIGJlZW4gYWRkZWQgd2hpY2ggaW5o
aWJpdHMgZ2x5cGggYWR2YW5jZXMgZnJvbSBiZWluZyBzcGxpdAorICAgICAgICBhY3Jvc3MgbGln
YXR1cmVzICh0aHVzIGNhdXNpbmcgc3B1cmlvdXMgbGluZSBicmVha3MpLgorCisgICAgICAgIEEg
Q29tcGxleFRleHRDb250cm9sbGVyIGFuZCBpdHMgYXNzb2NpYXRlZCBUZXh0UnVuIGFuZCBGb250
IGFyZSBlbmNhcHN1bGF0ZWQgaW4gYSBUZXh0TGF5b3V0IG9iamVjdCwKKyAgICAgICAgd2hpY2gg
aXMgaW5zdGFudGlhdGVkIGFzIGFuIG9wYXF1ZSBvYmplY3QgdmlhIGZ1bmN0aW9ucyB0aGF0IGFy
ZSBuby1vcHMgdW5sZXNzIGJ1aWxkaW5nIGZvciBNYWMuIEEKKyAgICAgICAgc3RhdGljIG1lbWJl
ciBmdW5jdGlvbiAoaXNOZWVkZWQpIGNoZWNrcyB0byBzZWUgd2hldGhlciBhIFRleHRSdW4gaXMg
Y29tcGxleCwgaW4gb3JkZXIgdG8gYXZvaWQKKyAgICAgICAgbmVlZGxlc3MgaW5zdGFudGlhdGlv
bi4gSXQgYWxzbyBiYWlscyBpZiB0YWJzIHdvdWxkIGJlIGVuYWJsZWQgc2luY2UgcG9zaXRpb25h
bCBlZmZlY3RzIGFyZSBub3QgeWV0CisgICAgICAgIGhhbmRsZWQgaW4gdGhpcyBtb2RlLgorCisg
ICAgICAgIE5vIGJlaGF2aW9yYWwgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgZHVlIHRvIHRoaXMgY2hh
bmdlLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250
LmNwcDoKKyAgICAgICAgKFdURik6IERlZmluZSBkZWxldGVPd25lZFB0ciBmb3IgVGV4dExheW91
dCBhcyBjYWxsaW5nIHRocm91Z2ggZGVzdHJveUxheW91dDsgcmVseWluZyBvbiBvcGVyYXRvciBk
ZWxldGUgaXMgbm90IHdvcmthYmxlIGFzIHRoZSBjbGFzcyBkb2VzIG5vdCBleGlzdCBvbiBhbGwg
cGxhdGZvcm1zLgorICAgICAgICAoV1RGOjpXZWJDb3JlOjpUZXh0TGF5b3V0KToKKyAgICAgICAg
KFdlYkNvcmUpOiBJbXBsZW1lbnQgbm8tb3AgVGV4dExheW91dCB3cmFwcGVycyBmb3Igbm9uLU1h
YyBwbGF0Zm9ybXMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlvdXQpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVsZXRlTGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnQ6OndpZHRoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Lmg6CisgICAgICAg
IChXZWJDb3JlKTogQWRkIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBSZW5kZXJUZXh0IGFuZCBU
ZXh0TGF5b3V0LgorICAgICAgICAoRm9udCk6IEFkZCBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0
aCBwb2ludGVyIHRvIFRleHRMYXlvdXQgaW1wbGVtZW50YXRpb24uCisgICAgICAgIChXVEYpOiBE
ZWNsYXJlIGRlbGV0ZU93bmVkUHRyIGZvciBUZXh0TGF5b3V0LgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuY3BwOgorICAgICAgICAoVGV4dExh
eW91dCk6IEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBDb21wbGV4
VGV4dENvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciBUZXh0UnVuLgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dExheW91dDo6aXNOZWVkZWQpOiBVc2VkIGJ5IHdyYXBwZXIgdG8gYXZvaWQgaW5zdGFu
dGlhdGlvbiB3aGVuIGNvbXBsZXggbGF5b3V0IGlzIG5vdCByZXF1aXJlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlRleHRMYXlvdXQ6OlRleHRMYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dExh
eW91dDo6d2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dExheW91dDo6Zm9udFdpdGhOb1dv
cmRTcGFjaW5nKTogSGVscGVyIGZ1bmN0aW9uIHRvIGFsbG93IGluaXRpYWxpemF0aW9uIG9mIG1l
bWJlciB2YXJpYWJsZS4KKyAgICAgICAgKFdlYkNvcmU6OlRleHRMYXlvdXQ6OmNvbnN0cnVjdFRl
eHRSdW4pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgcmVhbCBUZXh0TGF5
b3V0IHdyYXBwZXJzIGZvciBNYWMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlv
dXQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVsZXRlTGF5b3V0KToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJv
bGxlcjo6Q29tcGxleFRleHRDb250cm9sbGVyKTogSW5pdGlhbGl6ZSBtX2x0ck9ubHkgYW5kIHJl
c2VydmUgaW5pdGlhbCBjYXBhY2l0eSBmb3IgbV9ydW5JbmRpY2VzLgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6Q29tcGxleFRleHRSdW4p
OiBJbml0aWFsaXplIG1faW5kZXhCZWdpbiBhbmQgbV9sdHIuCisgICAgICAgIChXZWJDb3JlOjpD
b21wbGV4VGV4dENvbnRyb2xsZXI6OmluZGV4T2ZDdXJyZW50UnVuKTogUmV0dXJuICh2aXN1YWwp
IG1fY29tcGxleFRleHRSdW5zIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gKGxvZ2ljYWwpIG1fY3Vy
cmVudFJ1biwgbGF6aWx5IGNvbnN0cnVjdGluZyBtX3J1bkluZGljZXMgaWYgbmVlZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppbmNyZW1lbnRDdXJyZW50UnVu
KTogUmV0dXJuIG5leHQgbV9jb21wbGV4VGV4dFJ1bnMgaW5kZXggaW4gbG9naWNhbCBvcmRlci4K
KyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSk6IEFsbG93
IHJlc3RhcnRpbmcsIHN1cHBvcnQgZm9yIGJpZGkgcmVvcmRlcmluZywgYW5kIG9wdGlvbiB0byBt
ZWFzdXJlIG9ubHkgd2hvbGUgZ2x5cGhzIHJhdGhlciB0aGFuIGRpdmlkaW5nIGFkdmFuY2VzLgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphZGp1c3RHbHlwaHNBbmRB
ZHZhbmNlcyk6IENsZWFyIG1fbHRyT25seSBvbiBkZXRlY3RpbmcgYSBSVEwgcnVuLgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuaDoKKyAgICAg
ICAgKENvbXBsZXhUZXh0Q29udHJvbGxlcik6IEFkZCBtX2x0ck9ubHkgaW5kaWNhdGluZyBubyBi
aWRpIHJlb3JkZXJpbmcsIGFuZCBtX3J1bkluZGljZXMgbWFwcGluZyBmcm9tIHJ1bnMgKGxvZ2lj
YWwgb3JkZXIpIHRvIG1fY29tcGxleFRleHRSdW5zICh2aXN1YWwgb3JkZXIpLgorICAgICAgICAo
V2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6aW5kZXhCZWdp
bik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0
UnVuOjppc0xUUik6CisgICAgICAgIChDb21wbGV4VGV4dFJ1bik6IEFkZCBoZWxwZXIgZnVuY3Rp
b25zIHJldHVybmluZyB2YWx1ZXMgcGVydGluZW50IHRvIGluZGl2aWR1YWwgcnVucyBhcyBvcHBv
c2VkIHRvIHRoZSBlbnRpcmUgY29udGFpbmluZyBsaW5lLgorICAgICAgICAoV2ViQ29yZTo6Q29t
cGxleFRleHRDb250cm9sbGVyOjpzdHJpbmdCZWdpbik6IFJldHVybiBmaXJzdCBzdHJpbmcgaW5k
ZXguCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OnN0cmluZ0VuZCk6
IFJldHVybiBvbmUgcGFzdCBsYXN0IHN0cmluZyBpbmRleC4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQubW06IEluaXRpYWxpemUg
bV9pbmRleEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29u
dHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkNvbXBsZXhUZXh0UnVuKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyQmxvY2suaDogQWRkIFRleHRMYXlvdXRJbmZvLCBtYXBwaW5nIGZyb20gUmVu
ZGVyVGV4dCB0byAocG9zc2libHkgbnVsbCkgVGV4dExheW91dC4KKyAgICAgICAgKFdlYkNvcmUp
OgorICAgICAgICAoUmVuZGVyQmxvY2spOgorICAgICAgICAoTGluZUJyZWFrZXIpOgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKTogQWxsb3cgVGV4dExh
eW91dCBpbnN0YW5jZSB0byBiZSByZXVzZWQgYWNyb3NzIGNhbGxzIHRvIG5leHRMaW5lQnJlYWsu
CisgICAgICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOiBVc2UgVGV4dExheW91dCB3aGVuIHN1cHBs
aWVkIGZvciBtZWFzdXJpbmcuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6TGluZUJy
ZWFrZXI6Om5leHRMaW5lQnJlYWspOgorCiAyMDEyLTA3LTIzICBEYXZlIFR1ICA8ZHR1QGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBbY2hyb21pdW1dIEFkZCBkcm9wcGVkRnJhbWVDb3VudCB0byBy
ZW5kZXJpbmdTdGF0cy4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zv
bnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zv
bnQuY3BwCShyZXZpc2lvbiAxMjMzNTgpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksMTYgQEAKIHVzaW5nIG5h
bWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKIAorbmFtZXNwYWNlIFdURiB7
CisKKy8vIGFsbG93IGNvbXBpbGF0aW9uIG9mIE93blB0cjxUZXh0TGF5b3V0PiBpbiBzb3VyY2Ug
ZmlsZXMgdGhhdCBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgVGV4dExheW91dCBjbGFzcyBkZWZp
bml0aW9uCit0ZW1wbGF0ZSA8PiB2b2lkIGRlbGV0ZU93bmVkUHRyPFdlYkNvcmU6OlRleHRMYXlv
dXQ+KFdlYkNvcmU6OlRleHRMYXlvdXQqIHB0cikKK3sKKyAgICBXZWJDb3JlOjpGb250OjpkZWxl
dGVMYXlvdXQocHRyKTsKK30KKworfQorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNvbnN0IHVp
bnQ4X3QgRm9udDo6c19yb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsyNTZdID0gewpAQCAtMTk3
LDYgKzIwNywyNSBAQCBmbG9hdCBGb250Ojp3aWR0aChjb25zdCBUZXh0UnVuJiBydW4sIGluCiAg
ICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChydW4pOwogfQogCisjaWYgIVBMQVRG
T1JNKE1BQykKKworUGFzc093blB0cjxUZXh0TGF5b3V0PiBGb250OjpjcmVhdGVMYXlvdXQoUmVu
ZGVyVGV4dCosIGZsb2F0LCBib29sKSBjb25zdAoreworICAgIHJldHVybiBudWxscHRyOworfQor
Cit2b2lkIEZvbnQ6OmRlbGV0ZUxheW91dChUZXh0TGF5b3V0KikKK3sKK30KKworZmxvYXQgRm9u
dDo6d2lkdGgoVGV4dExheW91dCYsIHVuc2lnbmVkLCB1bnNpZ25lZCkKK3sKKyAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKIEZsb2F0UmVjdCBG
b250OjpzZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0
UG9pbnQmIHBvaW50LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICAgICB0byA9
ICh0byA9PSAtMSA/IHJ1bi5sZW5ndGgoKSA6IHRvKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9Gb250LmgJKHJldmlzaW9uIDEyMzM1OCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNTUsNiArNTUsOCBA
QCBjbGFzcyBGb250U2VsZWN0b3I7CiBjbGFzcyBHbHlwaEJ1ZmZlcjsKIGNsYXNzIEdseXBoUGFn
ZVRyZWVOb2RlOwogY2xhc3MgR3JhcGhpY3NDb250ZXh0OworY2xhc3MgUmVuZGVyVGV4dDsKK2Ns
YXNzIFRleHRMYXlvdXQ7CiBjbGFzcyBUZXh0UnVuOwogCiBzdHJ1Y3QgR2x5cGhEYXRhOwpAQCAt
MTA0LDYgKzEwNiwxMCBAQCBwdWJsaWM6CiAgICAgZmxvYXQgd2lkdGgoY29uc3QgVGV4dFJ1biYs
IEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDAsIEdseXBo
T3ZlcmZsb3cqID0gMCkgY29uc3Q7CiAgICAgZmxvYXQgd2lkdGgoY29uc3QgVGV4dFJ1biYsIGlu
dCYgY2hhcnNDb25zdW1lZCwgU3RyaW5nJiBnbHlwaE5hbWUpIGNvbnN0OwogCisgICAgUGFzc093
blB0cjxUZXh0TGF5b3V0PiBjcmVhdGVMYXlvdXQoUmVuZGVyVGV4dCosIGZsb2F0IHhQb3MsIGJv
b2wgY29sbGFwc2VXaGl0ZVNwYWNlKSBjb25zdDsKKyAgICBzdGF0aWMgdm9pZCBkZWxldGVMYXlv
dXQoVGV4dExheW91dCopOworICAgIHN0YXRpYyBmbG9hdCB3aWR0aChUZXh0TGF5b3V0JiwgdW5z
aWduZWQgZnJvbSwgdW5zaWduZWQgbGVuKTsKKwogICAgIGludCBvZmZzZXRGb3JQb3NpdGlvbihj
b25zdCBUZXh0UnVuJiwgZmxvYXQgcG9zaXRpb24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMp
IGNvbnN0OwogICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdCBUZXh0UnVu
JiwgY29uc3QgRmxvYXRQb2ludCYsIGludCBoLCBpbnQgZnJvbSA9IDAsIGludCB0byA9IC0xKSBj
b25zdDsKIApAQCAtMzE1LDQgKzMyMSwxMCBAQCBpbmxpbmUgZmxvYXQgRm9udDo6dGFiV2lkdGgo
Y29uc3QgU2ltcGxlCiAKIH0KIAorbmFtZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlIDw+IHZvaWQg
ZGVsZXRlT3duZWRQdHI8V2ViQ29yZTo6VGV4dExheW91dD4oV2ViQ29yZTo6VGV4dExheW91dCop
OworCit9CisKICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAJKHJldmlz
aW9uIDEyMzM1OCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21w
bGV4VGV4dENvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw4IEBACiAK
ICNpbmNsdWRlICJGbG9hdFNpemUuaCIKICNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiUmVu
ZGVyQmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCiAjaW5jbHVkZSAiVGV4dEJyZWFr
SXRlcmF0b3IuaCIKICNpbmNsdWRlICJUZXh0UnVuLmgiCiAjaW5jbHVkZSA8QXBwbGljYXRpb25T
ZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CkBAIC0zNyw2ICszOSw3MSBAQCB1c2luZyBu
YW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIFRleHRMYXlvdXQg
eworcHVibGljOgorICAgIHN0YXRpYyBib29sIGlzTmVlZGVkKFJlbmRlclRleHQqIHRleHQsIGNv
bnN0IEZvbnQmIGZvbnQpCisgICAgeworICAgICAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2Nr
Ojpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQtPmNoYXJhY3RlcnMoKSwgdGV4dC0+
dGV4dExlbmd0aCgpLCB0ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgcmV0dXJuIGZvbnQuY29kZVBh
dGgocnVuKSA9PSBGb250OjpDb21wbGV4OworICAgIH0KKworICAgIFRleHRMYXlvdXQoUmVuZGVy
VGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcykKKyAgICAgICAgOiBtX2Zv
bnQoZm9udFdpdGhOb1dvcmRTcGFjaW5nKGZvbnQpKQorICAgICAgICAsIG1fcnVuKGNvbnN0cnVj
dFRleHRSdW4odGV4dCwgZm9udCwgeFBvcykpCisgICAgICAgICwgbV9jb250cm9sbGVyKGFkb3B0
UHRyKG5ldyBDb21wbGV4VGV4dENvbnRyb2xsZXIoJm1fZm9udCwgbV9ydW4sIHRydWUpKSkKKyAg
ICB7CisgICAgfQorCisgICAgZmxvYXQgd2lkdGgodW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVu
KQorICAgIHsKKyAgICAgICAgbV9jb250cm9sbGVyLT5hZHZhbmNlKGZyb20sIDAsIEJ5V2hvbGVH
bHlwaHMpOworICAgICAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IG1fY29udHJvbGxlci0+cnVuV2lk
dGhTb0ZhcigpOworICAgICAgICBtX2NvbnRyb2xsZXItPmFkdmFuY2UoZnJvbSArIGxlbiwgMCwg
QnlXaG9sZUdseXBocyk7CisgICAgICAgIGZsb2F0IGFmdGVyV2lkdGggPSBtX2NvbnRyb2xsZXIt
PnJ1bldpZHRoU29GYXIoKTsKKyAgICAgICAgcmV0dXJuIGFmdGVyV2lkdGggLSBiZWZvcmVXaWR0
aDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIEZvbnQgZm9udFdpdGhOb1dvcmRTcGFj
aW5nKGNvbnN0IEZvbnQmIG9yaWdpbmFsRm9udCkKKyAgICB7CisgICAgICAgIEZvbnQgZm9udChv
cmlnaW5hbEZvbnQpOworICAgICAgICBmb250LnNldFdvcmRTcGFjaW5nKDApOworICAgICAgICBy
ZXR1cm4gZm9udDsKKyAgICB9CisKKyAgICBzdGF0aWMgVGV4dFJ1biBjb25zdHJ1Y3RUZXh0UnVu
KFJlbmRlclRleHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQb3MpCisgICAgewor
ICAgICAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQs
IGZvbnQsIHRleHQtPmNoYXJhY3RlcnMoKSwgdGV4dC0+dGV4dExlbmd0aCgpLCB0ZXh0LT5zdHls
ZSgpKTsKKyAgICAgICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4dC0+dGV4dExlbmd0aCgp
KTsKKyAgICAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgp
KTsKKworICAgICAgICBydW4uc2V0WFBvcyh4UG9zKTsKKyAgICAgICAgcmV0dXJuIHJ1bjsKKyAg
ICB9CisKKyAgICAvLyBDb21wbGV4VGV4dENvbnRyb2xsZXIgaGFzIG9ubHkgcmVmZXJlbmNlcyB0
byBpdHMgRm9udCBhbmQgVGV4dFJ1biBzbyB0aGV5IG11c3QgYmUga2VwdCBhbGl2ZSBoZXJlCisg
ICAgRm9udCBtX2ZvbnQ7CisgICAgVGV4dFJ1biBtX3J1bjsKKyAgICBPd25QdHI8Q29tcGxleFRl
eHRDb250cm9sbGVyPiBtX2NvbnRyb2xsZXI7Cit9OworCitQYXNzT3duUHRyPFRleHRMYXlvdXQ+
IEZvbnQ6OmNyZWF0ZUxheW91dChSZW5kZXJUZXh0KiB0ZXh0LCBmbG9hdCB4UG9zLCBib29sIGNv
bGxhcHNlV2hpdGVTcGFjZSkgY29uc3QKK3sKKyAgICBpZiAoIWNvbGxhcHNlV2hpdGVTcGFjZSB8
fCAhVGV4dExheW91dDo6aXNOZWVkZWQodGV4dCwgKnRoaXMpKQorICAgICAgICByZXR1cm4gbnVs
bHB0cjsKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFRleHRMYXlvdXQodGV4dCwgKnRoaXMsIHhQ
b3MpKTsKK30KKwordm9pZCBGb250OjpkZWxldGVMYXlvdXQoVGV4dExheW91dCogbGF5b3V0KQor
eworICAgIGRlbGV0ZSBsYXlvdXQ7Cit9CisKK2Zsb2F0IEZvbnQ6OndpZHRoKFRleHRMYXlvdXQm
IGxheW91dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuKQoreworICAgIHJldHVybiBsYXlv
dXQud2lkdGgoZnJvbSwgbGVuKTsKK30KKwogc3RhdGljIGlubGluZSBDR0Zsb2F0IHJvdW5kQ0dG
bG9hdChDR0Zsb2F0IGYpCiB7CiAgICAgaWYgKHNpemVvZihDR0Zsb2F0KSA9PSBzaXplb2YoZmxv
YXQpKQpAQCAtNTQsNiArMTIxLDcgQEAgc3RhdGljIGlubGluZSBDR0Zsb2F0IGNlaWxDR0Zsb2F0
KENHRmxvYQogQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dENvbnRyb2xsZXIoY29u
c3QgRm9udCogZm9udCwgY29uc3QgVGV4dFJ1biYgcnVuLCBib29sIG1heVVzZU5hdHVyYWxXcml0
aW5nRGlyZWN0aW9uLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9u
dHMsIGJvb2wgZm9yVGV4dEVtcGhhc2lzKQogICAgIDogbV9mb250KCpmb250KQogICAgICwgbV9y
dW4ocnVuKQorICAgICwgbV9pc0xUUk9ubHkodHJ1ZSkKICAgICAsIG1fbWF5VXNlTmF0dXJhbFdy
aXRpbmdEaXJlY3Rpb24obWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24pCiAgICAgLCBtX2Zv
clRleHRFbXBoYXNpcyhmb3JUZXh0RW1waGFzaXMpCiAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXIo
MCkKQEAgLTkyLDYgKzE2MCw5IEBAIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRD
b250cm8KICAgICBjb2xsZWN0Q29tcGxleFRleHRSdW5zKCk7CiAgICAgYWRqdXN0R2x5cGhzQW5k
QWR2YW5jZXMoKTsKIAorICAgIGlmICghbV9pc0xUUk9ubHkpCisgICAgICAgIG1fcnVuSW5kaWNl
cy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KG1fY29tcGxleFRleHRSdW5zLnNpemUoKSk7CisKICAg
ICBtX3J1bldpZHRoU29GYXIgPSBtX2xlYWRpbmdFeHBhbnNpb247CiB9CiAKQEAgLTM0MCwyNSAr
NDExLDc1IEBAIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFIKICAgICB9
CiB9CiAKLXZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjphZHZhbmNlKHVuc2lnbmVkIG9mZnNl
dCwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyKQordW5zaWduZWQgQ29tcGxleFRleHRDb250cm9s
bGVyOjppbmRleE9mQ3VycmVudFJ1bih1bnNpZ25lZCYgbGVmdG1vc3RHbHlwaCkKK3sKKyAgICBs
ZWZ0bW9zdEdseXBoID0gMDsKKyAgICAKKyAgICBzaXplX3QgcnVuQ291bnQgPSBtX2NvbXBsZXhU
ZXh0UnVucy5zaXplKCk7CisgICAgaWYgKG1fY3VycmVudFJ1biA+PSBydW5Db3VudCkKKyAgICAg
ICAgcmV0dXJuIHJ1bkNvdW50OworCisgICAgaWYgKG1faXNMVFJPbmx5KSB7CisgICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2N1cnJlbnRSdW47ICsraSkKKyAgICAgICAgICAgIGxl
ZnRtb3N0R2x5cGggKz0gbV9jb21wbGV4VGV4dFJ1bnNbaV0tPmdseXBoQ291bnQoKTsKKyAgICAg
ICAgcmV0dXJuIG1fY3VycmVudFJ1bjsKKyAgICB9CisKKyAgICB3aGlsZSAobV9ydW5JbmRpY2Vz
LnNpemUoKSA8PSBtX2N1cnJlbnRSdW4pIHsKKyAgICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gbV9y
dW5JbmRpY2VzLmlzRW1wdHkoKSA/IDAgOiBzdHJpbmdFbmQoKm1fY29tcGxleFRleHRSdW5zW21f
cnVuSW5kaWNlcy5sYXN0KCldKTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
cnVuQ291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBzdHJpbmdCZWdpbigq
bV9jb21wbGV4VGV4dFJ1bnNbaV0pKSB7CisgICAgICAgICAgICAgICAgbV9ydW5JbmRpY2VzLnVu
Y2hlY2tlZEFwcGVuZChpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIGN1cnJlbnRSdW5JbmRleCA9IG1fcnVu
SW5kaWNlc1ttX2N1cnJlbnRSdW5dOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjdXJy
ZW50UnVuSW5kZXg7ICsraSkKKyAgICAgICAgbGVmdG1vc3RHbHlwaCArPSBtX2NvbXBsZXhUZXh0
UnVuc1tpXS0+Z2x5cGhDb3VudCgpOworICAgIHJldHVybiBjdXJyZW50UnVuSW5kZXg7Cit9CisK
K3Vuc2lnbmVkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6aW5jcmVtZW50Q3VycmVudFJ1bih1bnNp
Z25lZCYgbGVmdG1vc3RHbHlwaCkKK3sKKyAgICBpZiAobV9pc0xUUk9ubHkpIHsKKyAgICAgICAg
bGVmdG1vc3RHbHlwaCArPSBtX2NvbXBsZXhUZXh0UnVuc1ttX2N1cnJlbnRSdW4rK10tPmdseXBo
Q291bnQoKTsKKyAgICAgICAgcmV0dXJuIG1fY3VycmVudFJ1bjsKKyAgICB9CisKKyAgICBtX2N1
cnJlbnRSdW4rKzsKKyAgICBsZWZ0bW9zdEdseXBoID0gMDsKKyAgICByZXR1cm4gaW5kZXhPZkN1
cnJlbnRSdW4obGVmdG1vc3RHbHlwaCk7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVy
OjphZHZhbmNlKHVuc2lnbmVkIG9mZnNldCwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyLCBHbHlw
aEl0ZXJhdGlvblN0eWxlIGl0ZXJhdGlvblN0eWxlKQogewogICAgIGlmIChzdGF0aWNfY2FzdDxp
bnQ+KG9mZnNldCkgPiBtX2VuZCkKICAgICAgICAgb2Zmc2V0ID0gbV9lbmQ7CiAKLSAgICBpZiAo
b2Zmc2V0IDw9IG1fY3VycmVudENoYXJhY3RlcikKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChv
ZmZzZXQgPD0gbV9jdXJyZW50Q2hhcmFjdGVyKSB7CisgICAgICAgIG1fcnVuV2lkdGhTb0ZhciA9
IG1fbGVhZGluZ0V4cGFuc2lvbjsKKyAgICAgICAgbV9udW1HbHlwaHNTb0ZhciA9IDA7CisgICAg
ICAgIG1fY3VycmVudFJ1biA9IDA7CisgICAgICAgIG1fZ2x5cGhJbkN1cnJlbnRSdW4gPSAwOwor
ICAgICAgICBtX2NoYXJhY3RlckluQ3VycmVudEdseXBoID0gMDsKKyAgICB9CiAKICAgICBtX2N1
cnJlbnRDaGFyYWN0ZXIgPSBvZmZzZXQ7CiAKICAgICBzaXplX3QgcnVuQ291bnQgPSBtX2NvbXBs
ZXhUZXh0UnVucy5zaXplKCk7CiAKLSAgICBib29sIGx0ciA9IG1fcnVuLmx0cigpOwotCi0gICAg
dW5zaWduZWQgayA9IGx0ciA/IG1fbnVtR2x5cGhzU29GYXIgOiBtX2FkanVzdGVkR2x5cGhzLnNp
emUoKSAtIDEgLSBtX251bUdseXBoc1NvRmFyOworICAgIHVuc2lnbmVkIGxlZnRtb3N0R2x5cGgg
PSAwOworICAgIHVuc2lnbmVkIGN1cnJlbnRSdW5JbmRleCA9IGluZGV4T2ZDdXJyZW50UnVuKGxl
ZnRtb3N0R2x5cGgpOwogICAgIHdoaWxlIChtX2N1cnJlbnRSdW4gPCBydW5Db3VudCkgewotICAg
ICAgICBjb25zdCBDb21wbGV4VGV4dFJ1biYgY29tcGxleFRleHRSdW4gPSAqbV9jb21wbGV4VGV4
dFJ1bnNbbHRyID8gbV9jdXJyZW50UnVuIDogcnVuQ291bnQgLSAxIC0gbV9jdXJyZW50UnVuXTsK
KyAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhUZXh0UnVuID0gKm1fY29tcGxl
eFRleHRSdW5zW2N1cnJlbnRSdW5JbmRleF07CisgICAgICAgIGJvb2wgbHRyID0gY29tcGxleFRl
eHRSdW4uaXNMVFIoKTsKICAgICAgICAgc2l6ZV90IGdseXBoQ291bnQgPSBjb21wbGV4VGV4dFJ1
bi5nbHlwaENvdW50KCk7CiAgICAgICAgIHVuc2lnbmVkIGcgPSBsdHIgPyBtX2dseXBoSW5DdXJy
ZW50UnVuIDogZ2x5cGhDb3VudCAtIDEgLSBtX2dseXBoSW5DdXJyZW50UnVuOworICAgICAgICB1
bnNpZ25lZCBrID0gbGVmdG1vc3RHbHlwaCArIGc7CisKICAgICAgICAgd2hpbGUgKG1fZ2x5cGhJ
bkN1cnJlbnRSdW4gPCBnbHlwaENvdW50KSB7CiAgICAgICAgICAgICB1bnNpZ25lZCBnbHlwaFN0
YXJ0T2Zmc2V0ID0gY29tcGxleFRleHRSdW4uaW5kZXhBdChnKTsKICAgICAgICAgICAgIHVuc2ln
bmVkIGdseXBoRW5kT2Zmc2V0OwpAQCAtMzg3LDYgKzUwOCw5IEBAIHZvaWQgQ29tcGxleFRleHRD
b250cm9sbGVyOjphZHZhbmNlKHVuc2kKICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGFy
ZSBtdWx0aXBsZSBnbHlwaHMgcGVyIGNoYXJhY3RlciB3ZSBuZWVkIHRvIGFkdmFuY2UgYnkgdGhl
IGZ1bGwgd2lkdGggb2YgdGhlIGdseXBoLgogICAgICAgICAgICAgICAgIEFTU0VSVChtX2NoYXJh
Y3RlckluQ3VycmVudEdseXBoID09IG9sZENoYXJhY3RlckluQ3VycmVudEdseXBoKTsKICAgICAg
ICAgICAgICAgICBtX3J1bldpZHRoU29GYXIgKz0gYWRqdXN0ZWRBZHZhbmNlLndpZHRoOworICAg
ICAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRpb25TdHlsZSA9PSBCeVdob2xlR2x5cGhzKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKCFvbGRDaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCkKKyAgICAgICAg
ICAgICAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IGFkanVzdGVkQWR2YW5jZS53aWR0aDsKICAg
ICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIG1fcnVuV2lkdGhTb0ZhciArPSBhZGp1
c3RlZEFkdmFuY2Uud2lkdGggKiAobV9jaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCAtIG9sZENoYXJh
Y3RlckluQ3VycmVudEdseXBoKSAvIChnbHlwaEVuZE9mZnNldCAtIGdseXBoU3RhcnRPZmZzZXQp
OwogCkBAIC00MDQsMTAgKzUyOCwxMCBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2
YW5jZSh1bnNpCiAgICAgICAgICAgICAgICAgay0tOwogICAgICAgICAgICAgfQogICAgICAgICB9
Ci0gICAgICAgIG1fY3VycmVudFJ1bisrOworICAgICAgICBjdXJyZW50UnVuSW5kZXggPSBpbmNy
ZW1lbnRDdXJyZW50UnVuKGxlZnRtb3N0R2x5cGgpOwogICAgICAgICBtX2dseXBoSW5DdXJyZW50
UnVuID0gMDsKICAgICB9Ci0gICAgaWYgKCFsdHIgJiYgbV9udW1HbHlwaHNTb0ZhciA9PSBtX2Fk
anVzdGVkQWR2YW5jZXMuc2l6ZSgpKQorICAgIGlmICghbV9ydW4ubHRyKCkgJiYgbV9udW1HbHlw
aHNTb0ZhciA9PSBtX2FkanVzdGVkQWR2YW5jZXMuc2l6ZSgpKQogICAgICAgICBtX3J1bldpZHRo
U29GYXIgKz0gbV9maW5hbFJvdW5kaW5nV2lkdGg7CiB9CiAKQEAgLTQyMSw2ICs1NDUsOSBAQCB2
b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWRqdXN0R2x5cGhzCiAgICAgICAgIHVuc2lnbmVk
IGdseXBoQ291bnQgPSBjb21wbGV4VGV4dFJ1bi5nbHlwaENvdW50KCk7CiAgICAgICAgIGNvbnN0
IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGNvbXBsZXhUZXh0UnVuLmZvbnREYXRhKCk7CiAK
KyAgICAgICAgaWYgKCFjb21wbGV4VGV4dFJ1bi5pc0xUUigpKQorICAgICAgICAgICAgbV9pc0xU
Uk9ubHkgPSBmYWxzZTsKKwogICAgICAgICBjb25zdCBDR0dseXBoKiBnbHlwaHMgPSBjb21wbGV4
VGV4dFJ1bi5nbHlwaHMoKTsKICAgICAgICAgY29uc3QgQ0dTaXplKiBhZHZhbmNlcyA9IGNvbXBs
ZXhUZXh0UnVuLmFkdmFuY2VzKCk7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmgJKHJl
dmlzaW9uIDEyMzM1OCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9D
b21wbGV4VGV4dENvbnRyb2xsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsOCBAQCBj
bGFzcyBGb250OwogY2xhc3MgU2ltcGxlRm9udERhdGE7CiBjbGFzcyBUZXh0UnVuOwogCitlbnVt
IEdseXBoSXRlcmF0aW9uU3R5bGUgeyBJbmNsdWRlUGFydGlhbEdseXBocywgQnlXaG9sZUdseXBo
cyB9OworCiAvLyBDb21wbGV4VGV4dENvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbmRl
cmluZyBhbmQgbWVhc3VyaW5nIGdseXBocyBmb3IKIC8vIGNvbXBsZXggc2NyaXB0cyBvbiBPUyBY
LgogY2xhc3MgQ29tcGxleFRleHRDb250cm9sbGVyIHsKQEAgLTUxLDcgKzUzLDcgQEAgcHVibGlj
OgogICAgIENvbXBsZXhUZXh0Q29udHJvbGxlcihjb25zdCBGb250KiwgY29uc3QgVGV4dFJ1biYs
IGJvb2wgbWF5VXNlTmF0dXJhbFdyaXRpbmdEaXJlY3Rpb24gPSBmYWxzZSwgSGFzaFNldDxjb25z
dCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCwgYm9vbCBmb3JUZXh0RW1waGFz
aXMgPSBmYWxzZSk7CiAKICAgICAvLyBBZHZhbmNlIGFuZCBlbWl0IGdseXBocyB1cCB0byB0aGUg
c3BlY2lmaWVkIGNoYXJhY3Rlci4KLSAgICB2b2lkIGFkdmFuY2UodW5zaWduZWQgdG8sIEdseXBo
QnVmZmVyKiA9IDApOworICAgIHZvaWQgYWR2YW5jZSh1bnNpZ25lZCB0bywgR2x5cGhCdWZmZXIq
ID0gMCwgR2x5cGhJdGVyYXRpb25TdHlsZSA9IEluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKIAogICAg
IC8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBvZmZzZXQgZm9yIGEgZ2l2ZW4geCBjb29yZGluYXRl
LgogICAgIGludCBvZmZzZXRGb3JQb3NpdGlvbihmbG9hdCB4LCBib29sIGluY2x1ZGVQYXJ0aWFs
R2x5cGhzKTsKQEAgLTg5LDEwICs5MSwxMiBAQCBwcml2YXRlOgogICAgICAgICB1bnNpZ25lZCBz
dHJpbmdMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nTG9jYXRpb247IH0KICAgICAg
ICAgc2l6ZV90IHN0cmluZ0xlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RyaW5nTGVuZ3RoOyB9
CiAgICAgICAgIEFMV0FZU19JTkxJTkUgQ0ZJbmRleCBpbmRleEF0KHNpemVfdCBpKSBjb25zdDsK
KyAgICAgICAgQ0ZJbmRleCBpbmRleEJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV9pbmRleEJlZ2lu
OyB9CiAgICAgICAgIENGSW5kZXggaW5kZXhFbmQoKSBjb25zdCB7IHJldHVybiBtX2luZGV4RW5k
OyB9CiAgICAgICAgIENGSW5kZXggZW5kT2Zmc2V0QXQoc2l6ZV90IGkpIGNvbnN0IHsgQVNTRVJU
KCFtX2lzTW9ub3RvbmljKTsgcmV0dXJuIG1fZ2x5cGhFbmRPZmZzZXRzW2ldOyB9CiAgICAgICAg
IGNvbnN0IENHR2x5cGgqIGdseXBocygpIGNvbnN0IHsgcmV0dXJuIG1fZ2x5cGhzOyB9CiAgICAg
ICAgIGNvbnN0IENHU2l6ZSogYWR2YW5jZXMoKSBjb25zdCB7IHJldHVybiBtX2FkdmFuY2VzOyB9
CisgICAgICAgIGJvb2wgaXNMVFIoKSBjb25zdCB7IHJldHVybiBtX2lzTFRSOyB9CiAgICAgICAg
IGJvb2wgaXNNb25vdG9uaWMoKSBjb25zdCB7IHJldHVybiBtX2lzTW9ub3RvbmljOyB9CiAgICAg
ICAgIHZvaWQgc2V0SXNOb25Nb25vdG9uaWMoKTsKIApAQCAtMTA3LDIyICsxMTEsMzUgQEAgcHJp
dmF0ZToKICAgICAgICAgc2l6ZV90IG1fc3RyaW5nTGVuZ3RoOwogICAgICAgICBWZWN0b3I8Q0ZJ
bmRleCwgNjQ+IG1fY29yZVRleHRJbmRpY2VzVmVjdG9yOwogICAgICAgICBjb25zdCBDRkluZGV4
KiBtX2NvcmVUZXh0SW5kaWNlczsKKyAgICAgICAgQ0ZJbmRleCBtX2luZGV4QmVnaW47CiAgICAg
ICAgIENGSW5kZXggbV9pbmRleEVuZDsKICAgICAgICAgVmVjdG9yPENGSW5kZXgsIDY0PiBtX2ds
eXBoRW5kT2Zmc2V0czsKICAgICAgICAgVmVjdG9yPENHR2x5cGgsIDY0PiBtX2dseXBoc1ZlY3Rv
cjsKICAgICAgICAgY29uc3QgQ0dHbHlwaCogbV9nbHlwaHM7CiAgICAgICAgIFZlY3RvcjxDR1Np
emUsIDY0PiBtX2FkdmFuY2VzVmVjdG9yOwogICAgICAgICBjb25zdCBDR1NpemUqIG1fYWR2YW5j
ZXM7CisgICAgICAgIGJvb2wgbV9pc0xUUjsKICAgICAgICAgYm9vbCBtX2lzTW9ub3RvbmljOwog
ICAgIH07CisgICAgCisgICAgc3RhdGljIHVuc2lnbmVkIHN0cmluZ0JlZ2luKGNvbnN0IENvbXBs
ZXhUZXh0UnVuJiBydW4pIHsgcmV0dXJuIHJ1bi5zdHJpbmdMb2NhdGlvbigpICsgcnVuLmluZGV4
QmVnaW4oKTsgfQorICAgIHN0YXRpYyB1bnNpZ25lZCBzdHJpbmdFbmQoY29uc3QgQ29tcGxleFRl
eHRSdW4mIHJ1bikgeyByZXR1cm4gcnVuLnN0cmluZ0xvY2F0aW9uKCkgKyBydW4uaW5kZXhFbmQo
KTsgfQogCiAgICAgdm9pZCBjb2xsZWN0Q29tcGxleFRleHRSdW5zKCk7CiAKICAgICB2b2lkIGNv
bGxlY3RDb21wbGV4VGV4dFJ1bnNGb3JDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQg
bGVuZ3RoLCB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbiwgY29uc3QgU2ltcGxlRm9udERhdGEqKTsK
ICAgICB2b2lkIGFkanVzdEdseXBoc0FuZEFkdmFuY2VzKCk7CiAKKyAgICB1bnNpZ25lZCBpbmRl
eE9mQ3VycmVudFJ1bih1bnNpZ25lZCYgbGVmdG1vc3RHbHlwaCk7CisgICAgdW5zaWduZWQgaW5j
cmVtZW50Q3VycmVudFJ1bih1bnNpZ25lZCYgbGVmdG1vc3RHbHlwaCk7CisKKyAgICAvLyBUaGUg
ZGVmYXVsdCBzaXplIG9mIHRoaXMgdmVjdG9yIHdhcyBzZWxlY3RlZCBhcyBiZWluZyB0aGUgc21h
bGxlc3QgcG93ZXIgb2YgdHdvIGdyZWF0ZXIgdGhhbgorICAgIC8vIHRoZSBhdmVyYWdlICgzLjUp
IHBsdXMgb25lIHN0YW5kYXJkIGRldmlhdGlvbiAoNy41KSBvZiBub256ZXJvIHNpemVzIHVzZWQg
b24gQXJhYmljIFdpa2lwZWRpYS4KKyAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiBtX3J1bkluZGlj
ZXM7CisKICAgICBjb25zdCBGb250JiBtX2ZvbnQ7CiAgICAgY29uc3QgVGV4dFJ1biYgbV9ydW47
CisgICAgYm9vbCBtX2lzTFRST25seTsKICAgICBib29sIG1fbWF5VXNlTmF0dXJhbFdyaXRpbmdE
aXJlY3Rpb247CiAgICAgYm9vbCBtX2ZvclRleHRFbXBoYXNpczsKIApJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0
Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9D
b21wbGV4VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5tbQkocmV2aXNpb24gMTIzMzU4KQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNv
cmVUZXh0Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMDUsNyArMTA1LDkgQEAgQ29tcGxleFRleHRD
b250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogICAgICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3Rl
cnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0aW9uKHN0cmluZ0xvY2F0aW9uKQogICAgICwgbV9zdHJp
bmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9pbmRleEJlZ2luKHJ1blJhbmdlLmxvY2F0
aW9uKQogICAgICwgbV9pbmRleEVuZChydW5SYW5nZS5sb2NhdGlvbiArIHJ1blJhbmdlLmxlbmd0
aCkKKyAgICAsIG1faXNMVFIoIShDVFJ1bkdldFN0YXR1cyhjdFJ1bikgJiBrQ1RSdW5TdGF0dXNS
aWdodFRvTGVmdCkpCiAgICAgLCBtX2lzTW9ub3RvbmljKHRydWUpCiB7CiAgICAgbV9nbHlwaENv
dW50ID0gQ1RSdW5HZXRHbHlwaENvdW50KGN0UnVuKTsKQEAgLTEzOCw3ICsxNDAsOSBAQCBDb21w
bGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDCiAgICAgLCBtX2NoYXJhY3RlcnMo
Y2hhcmFjdGVycykKICAgICAsIG1fc3RyaW5nTG9jYXRpb24oc3RyaW5nTG9jYXRpb24pCiAgICAg
LCBtX3N0cmluZ0xlbmd0aChzdHJpbmdMZW5ndGgpCisgICAgLCBtX2luZGV4QmVnaW4oMCkKICAg
ICAsIG1faW5kZXhFbmQoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9pc0xUUihsdHIpCiAgICAgLCBt
X2lzTW9ub3RvbmljKHRydWUpCiB7CiAgICAgbV9jb3JlVGV4dEluZGljZXNWZWN0b3IucmVzZXJ2
ZUluaXRpYWxDYXBhY2l0eShtX3N0cmluZ0xlbmd0aCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2aXNpb24gMTIzMzU4KQorKysgU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4LDcgQEAg
c3RydWN0IEJpZGlSdW47CiBzdHJ1Y3QgUGFpbnRJbmZvOwogY2xhc3MgTGluZUluZm87CiBjbGFz
cyBSZW5kZXJSdWJ5UnVuOworY2xhc3MgVGV4dExheW91dDsKIAogdGVtcGxhdGUgPGNsYXNzIEl0
ZXJhdG9yLCBjbGFzcyBSdW4+IGNsYXNzIEJpZGlSZXNvbHZlcjsKIHRlbXBsYXRlIDxjbGFzcyBS
dW4+IGNsYXNzIEJpZGlSdW5MaXN0OwpAQCAtNjgwLDYgKzY4MSw3IEBAIHByaXZhdGU6CiAKICAg
ICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5k
ZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgogICAgIHR5cGVkZWYgc3RkOjpwYWlyPFJlbmRlclRleHQq
LCBMYXp5TGluZUJyZWFrSXRlcmF0b3I+IExpbmVCcmVha0l0ZXJhdG9ySW5mbzsKKyAgICB0eXBl
ZGVmIHN0ZDo6cGFpcjxSZW5kZXJUZXh0KiwgT3duUHRyPFRleHRMYXlvdXQ+ID4gVGV4dExheW91
dEluZm87CiAgICAgY2xhc3MgTGluZUJyZWFrZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgTGlu
ZUJyZWFrZXIoUmVuZGVyQmxvY2sqIGJsb2NrKQpAQCAtNjg4LDcgKzY5MCw3IEBAIHByaXZhdGU6
CiAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICB9CiAKLSAgICAgICAgSW5saW5lSXRlcmF0
b3IgbmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIExpbmVCcmVh
a0l0ZXJhdG9ySW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
LCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIElubGluZUl0
ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBMaW5l
QnJlYWtJdGVyYXRvckluZm8mLCBUZXh0TGF5b3V0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0
RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5l
cyk7CiAKICAgICAgICAgYm9vbCBsaW5lV2FzSHlwaGVuYXRlZCgpIHsgcmV0dXJuIG1faHlwaGVu
YXRlZDsgfQogICAgICAgICBjb25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmpl
Y3RzKCkgeyByZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsgfQpJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9u
IDEyMzM1OCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlv
dXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjQwLDYgKzEyNDAsNyBAQCB2b2lkIFJlbmRlckJs
b2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SCiAgICAgSW5saW5lSXRlcmF0b3IgZW5kID0gcmVz
b2x2ZXIucG9zaXRpb24oKTsKICAgICBib29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gbGF5b3V0
U3RhdGUuZW5kTGluZSgpOwogICAgIExpbmVCcmVha0l0ZXJhdG9ySW5mbyBsaW5lQnJlYWtJdGVy
YXRvckluZm87CisgICAgVGV4dExheW91dEluZm8gdGV4dExheW91dEluZm87CiAgICAgVmVydGlj
YWxQb3NpdGlvbkNhY2hlIHZlcnRpY2FsUG9zaXRpb25DYWNoZTsKIAogICAgIExpbmVCcmVha2Vy
IGxpbmVCcmVha2VyKHRoaXMpOwpAQCAtMTI2Miw3ICsxMjYzLDcgQEAgdm9pZCBSZW5kZXJCbG9j
azo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUgogICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciBv
bGRFbmQgPSBlbmQ7CiAgICAgICAgIGJvb2wgaXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlvdXRTdGF0
ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpOwogICAgICAgICBGbG9hdGlu
Z09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSA9IChtX2Zsb2F0aW5nT2JqZWN0cyAm
JiAhbV9mbG9hdGluZ09iamVjdHMtPnNldCgpLmlzRW1wdHkoKSkgPyBtX2Zsb2F0aW5nT2JqZWN0
cy0+c2V0KCkubGFzdCgpIDogMDsKLSAgICAgICAgZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVC
cmVhayhyZXNvbHZlciwgbGF5b3V0U3RhdGUubGluZUluZm8oKSwgbGluZUJyZWFrSXRlcmF0b3JJ
bmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5l
cyk7CisgICAgICAgIGVuZCA9IGxpbmVCcmVha2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxh
eW91dFN0YXRlLmxpbmVJbmZvKCksIGxpbmVCcmVha0l0ZXJhdG9ySW5mbywgdGV4dExheW91dElu
Zm8sIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVz
KTsKICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAg
ICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBjcmVhdGluZyBhbnkgcnVucyBpbiBuZXh0TGlu
ZUJyZWFrIHRvIGJlZ2luIHdpdGghCiAgICAgICAgICAgICAvLyBPbmNlIEJpZGlSdW5MaXN0IGlz
IHNlcGFyYXRlZCBmcm9tIEJpZGlSZXNvbHZlciB0aGlzIHdpbGwgbm90IGJlIG5lZWRlZC4KQEAg
LTE5NTAsMTEgKzE5NTEsMTQgQEAgc3RhdGljIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRl
clN0YQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGlubGluZSBmbG9hdCB0ZXh0V2lk
dGgoUmVuZGVyVGV4dCogdGV4dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBG
b250JiBmb250LCBmbG9hdCB4UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdo
aXRlU3BhY2UpCitzdGF0aWMgaW5saW5lIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0
LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQ
b3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgVGV4dExheW91
dCogbGF5b3V0ID0gMCkKIHsKICAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4g
PT0gdGV4dC0+dGV4dExlbmd0aCgpKSB8fCB0ZXh0LT5zdHlsZSgpLT5oYXNUZXh0Q29tYmluZSgp
KQogICAgICAgICByZXR1cm4gdGV4dC0+d2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9zKTsKIAor
ICAgIGlmIChsYXlvdXQpCisgICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9t
LCBsZW4pOworCiAgICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1
bih0ZXh0LCBmb250LCB0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBmcm9tLCBsZW4sIHRleHQtPnN0eWxl
KCkpOwogICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSAtIGZy
b20pOwogICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7
CkBAIC0yMTE3LDcgKzIxMjEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6cmVz
ZXQoKQogfQogCiBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6Om5leHRM
aW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZv
LAotICAgIExpbmVCcmVha0l0ZXJhdG9ySW5mbyYgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCBGbG9h
dGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRp
dmVIeXBoZW5hdGVkTGluZXMpCisgICAgTGluZUJyZWFrSXRlcmF0b3JJbmZvJiBsaW5lQnJlYWtJ
dGVyYXRvckluZm8sIFRleHRMYXlvdXRJbmZvJiB0ZXh0TGF5b3V0SW5mbywgRmxvYXRpbmdPYmpl
Y3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVu
YXRlZExpbmVzKQogewogICAgIHJlc2V0KCk7CiAKQEAgLTIzNTcsNiArMjM2MSwxMiBAQCBJbmxp
bmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAgICAgICAgICAgICAgICAgQVNT
RVJUKGN1cnJlbnQubV9wb3MgPT0gdC0+dGV4dExlbmd0aCgpKTsKICAgICAgICAgICAgIH0KIAor
ICAgICAgICAgICAgaWYgKHRleHRMYXlvdXRJbmZvLmZpcnN0ICE9IHQpIHsKKyAgICAgICAgICAg
ICAgICB0ZXh0TGF5b3V0SW5mby5maXJzdCA9IHQ7CisgICAgICAgICAgICAgICAgdGV4dExheW91
dEluZm8uc2Vjb25kID0gZi5jcmVhdGVMYXlvdXQodCwgd2lkdGguY3VycmVudFdpZHRoKCksIGNv
bGxhcHNlV2hpdGVTcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0TGF5b3V0
KiB0ZXh0TGF5b3V0ID0gdGV4dExheW91dEluZm8uc2Vjb25kLmdldCgpOworCiAgICAgICAgICAg
ICBmb3IgKDsgY3VycmVudC5tX3BvcyA8IHQtPnRleHRMZW5ndGgoKTsgY3VycmVudC5mYXN0SW5j
cmVtZW50SW5UZXh0Tm9kZSgpKSB7CiAgICAgICAgICAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJh
Y3RlcklzU3BhY2UgPSBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKICAgICAgICAgICAgICAgICBi
b29sIHByZXZpb3VzQ2hhcmFjdGVySXNXUyA9IGN1cnJlbnRDaGFyYWN0ZXJJc1dTOwpAQCAtMjM3
OCw3ICsyMzg4LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgog
ICAgICAgICAgICAgICAgIGlmICgoYnJlYWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRC
cmVhaykgewogICAgICAgICAgICAgICAgICAgICB3cmFwVyArPSBjaGFyV2lkdGg7CiAgICAgICAg
ICAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID0gVTE2
X0lTX0xFQUQoYykgJiYgY3VycmVudC5tX3BvcyArIDEgPCB0LT50ZXh0TGVuZ3RoKCkgJiYgVTE2
X0lTX1RSQUlMKHQtPmNoYXJhY3RlcnMoKVtjdXJyZW50Lm1fcG9zICsgMV0pOwotICAgICAgICAg
ICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgbWlkV29y
ZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRlZFdp
ZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpOworICAgICAg
ICAgICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgbWlk
V29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8gMiA6IDEsIGYsIHdpZHRoLmNvbW1pdHRl
ZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRM
YXlvdXQpOwogICAgICAgICAgICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSB3aWR0aC5jb21taXR0
ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFyV2lkdGggPiB3aWR0aC5hdmFpbGFibGVXaWR0aCgpOwog
ICAgICAgICAgICAgICAgIH0KIApAQCAtMjQwOSw5ICsyNDE5LDkgQEAgSW5saW5lSXRlcmF0b3Ig
UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFk
ZGl0aW9uYWxUbXBXOwogICAgICAgICAgICAgICAgICAgICBpZiAod29yZFRyYWlsaW5nU3BhY2VX
aWR0aCAmJiBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IGFkZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAr
IDEgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNv
bGxhcHNlV2hpdGVTcGFjZSkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICsgbGFzdFNwYWNlV29y
ZFNwYWNpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVG1wVyA9IHRleHRX
aWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNwYWNlLCBmLCB3aWR0
aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRM
YXlvdXQpIC0gd29yZFRyYWlsaW5nU3BhY2VXaWR0aCArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwog
ICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlv
bmFsVG1wVyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9wb3MgLSBsYXN0U3Bh
Y2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVT
cGFjZSkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFk
ZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxh
c3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VX
aGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAg
ICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBXKTsKICAg
ICAgICAgICAgICAgICAgICAgaWYgKCFhcHBsaWVkU3RhcnRXaWR0aCkgewogICAgICAgICAgICAg
ICAgICAgICAgICAgd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgo
Y3VycmVudC5tX29iaiwgdHJ1ZSwgZmFsc2UpKTsKQEAgLTI0MjgsNyArMjQzOCw3IEBAIElubGlu
ZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIGFzIGNhbmRpZGF0ZSB3aWR0aCBmb3IgdGhpcyBsaW5lLgogICAgICAgICAgICAgICAg
ICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKHdpZHRoLmZpdHNPbkxpbmUoKSAmJiBjdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBj
dXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWsp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0V2lk
dGgodCwgY3VycmVudC5tX3BvcywgMSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQ
aXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIChhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNp
bmcgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0
ZXh0V2lkdGgodCwgY3VycmVudC5tX3BvcywgMSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlz
Rml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRT
cGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0IHRoZSBleHRyYSBzcGFjZQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuIElm
IGl0IGlzIG5vdCwgZG8gbm90aGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJ
ZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEgd2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywKQEAg
LTI1NTQsNyArMjU2NCw3IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtl
cjoKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSU1QT1JUQU5UOiBjdXJyZW50Lm1f
cG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVG1wVyA9
IGlnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIGN1cnJlbnQubV9w
b3MgLSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNv
bGxhcHNlV2hpdGVTcGFjZSkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgIGZs
b2F0IGFkZGl0aW9uYWxUbXBXID0gaWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHQsIGxh
c3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KSArIGxhc3RT
cGFjZVdvcmRTcGFjaW5nOwogICAgICAgICAgICAgd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChh
ZGRpdGlvbmFsVG1wVyArIGlubGluZUxvZ2ljYWxXaWR0aChjdXJyZW50Lm1fb2JqLCAhYXBwbGll
ZFN0YXJ0V2lkdGgsIGluY2x1ZGVFbmRXaWR0aCkpOwogICAgICAgICAgICAgaW5jbHVkZUVuZFdp
ZHRoID0gZmFsc2U7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>160348</attachid>
            <date>2012-08-24 00:13:26 -0700</date>
            <delta_ts>2012-08-27 08:11:34 -0700</delta_ts>
            <desc>Consolidate TextLayout and LazyLineBreakIterator into new RenderTextInfo struct.</desc>
            <filename>83045-RenderTextInfo.txt</filename>
            <type>text/plain</type>
            <size>31670</size>
            <attacher name="Ned Holbrook">ned</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyNjU0OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc1IEBACisyMDEyLTA4LTI0ICBOZWQgSG9s
YnJvb2sgIDxuaG9sYnJvb2tAYXBwbGUuY29tPgorCisgICAgICAgIEltcHJvdmUgbGluZSBicmVh
a2luZyBwZXJmb3JtYW5jZSBmb3IgY29tcGxleCB0ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzA0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEN1cnJlbnRseSBSZW5kZXJCbG9jazo6TGluZUJyZWFr
ZXI6Om5leHRMaW5lQnJlYWsgYXNzdW1lcyB0aGF0IG1lYXN1cmluZyBpbmRpdmlkdWFsIHdvcmRz
IGlzIGFzIGNoZWFwCisgICAgICAgIGFzIGZyZWUuIFRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4g
ZGVhbGluZyB3aXRoIGNvbXBsZXggdGV4dCwgd2hpY2ggYmVuZWZpdHMgZnJvbSBsYXlpbmcgb3V0
IGFzIG11Y2gKKyAgICAgICAgdGV4dCBhcyBwb3NzaWJsZSBhbmQgYnkgcmV1c2luZyB0aGF0IGxh
eW91dCB3aGVuIGZlYXNpYmxlOiBieSBkb2luZyBzbyB0aGlzIHBhdGNoIGltcHJvdmVzIGxpbmUK
KyAgICAgICAgYnJlYWtpbmcgYnkgMjUlIGFzIG1lYXN1cmVkIHdpdGggYSBzaW1wbGUgdGVzdCBh
cHAuCisKKyAgICAgICAgVGhlIGJ1bGsgb2YgdGhpcyBjaGFuZ2UgaXMgbW9kaWZ5aW5nIENvbXBs
ZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSwgd2hpY2ggcHJldmlvdXNseSByZXF1aXJlZCB0aGUK
KyAgICAgICAgdGV4dCBvZmZzZXQgdG8gYmUgc3RyaWN0bHkgaW5jcmVhc2luZyBhbmQgYXNzdW1l
ZCB1bmlkaXJlY3Rpb25hbCB0ZXh0OyBub3cgaXQgc3VwcG9ydHMgcmFuZG9tIHNlZWtpbmcKKyAg
ICAgICAgaW4gYSBuYWl2ZSBmYXNoaW9uIChieSByZXN0YXJ0aW5nIHRvIHRoZSBiZWdpbm5pbmcp
IGFuZCB0cmF2ZXJzZXMgZ2x5cGhzIGluIGxvZ2ljYWwgb3JkZXIuIEluIHRoZQorICAgICAgICBs
YXR0ZXIgY2FzZSwgdGhlIHByZXNlbmNlIG9mIGFueSBub24tTFRSIHJ1bnMgdHJpZ2dlcnMgdGhl
IHBvcHVsYXRpb24gb2YgYSBtYXBwaW5nIGZyb20gbG9naWNhbCB0bworICAgICAgICB2aXN1YWwg
cnVuIGluZGljZXMuIEZpbmFsbHksIGEgbmV3IGZsYWcgaGFzIGJlZW4gYWRkZWQgd2hpY2ggaW5o
aWJpdHMgZ2x5cGggYWR2YW5jZXMgZnJvbSBiZWluZyBzcGxpdAorICAgICAgICBhY3Jvc3MgbGln
YXR1cmVzICh0aHVzIGNhdXNpbmcgc3B1cmlvdXMgbGluZSBicmVha3MpLgorCisgICAgICAgIEEg
Q29tcGxleFRleHRDb250cm9sbGVyIGFuZCBpdHMgYXNzb2NpYXRlZCBUZXh0UnVuIGFuZCBGb250
IGFyZSBlbmNhcHN1bGF0ZWQgaW4gYSBUZXh0TGF5b3V0IG9iamVjdCwKKyAgICAgICAgd2hpY2gg
aXMgaW5zdGFudGlhdGVkIGFzIGFuIG9wYXF1ZSBvYmplY3QgdmlhIGZ1bmN0aW9ucyB0aGF0IGFy
ZSBuby1vcHMgdW5sZXNzIGJ1aWxkaW5nIGZvciBNYWMuIEEKKyAgICAgICAgc3RhdGljIG1lbWJl
ciBmdW5jdGlvbiAoaXNOZWVkZWQpIGNoZWNrcyB0byBzZWUgd2hldGhlciBhIFRleHRSdW4gaXMg
Y29tcGxleCwgaW4gb3JkZXIgdG8gYXZvaWQKKyAgICAgICAgbmVlZGxlc3MgaW5zdGFudGlhdGlv
bi4gSXQgYWxzbyBiYWlscyBpZiB0YWJzIHdvdWxkIGJlIGVuYWJsZWQgc2luY2UgcG9zaXRpb25h
bCBlZmZlY3RzIGFyZSBub3QgeWV0CisgICAgICAgIGhhbmRsZWQgaW4gdGhpcyBtb2RlLgorCisg
ICAgICAgIE5vIGJlaGF2aW9yYWwgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgZHVlIHRvIHRoaXMgY2hh
bmdlLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250
LmNwcDoKKyAgICAgICAgKFdURik6IERlZmluZSBkZWxldGVPd25lZFB0ciBmb3IgVGV4dExheW91
dCBhcyBjYWxsaW5nIHRocm91Z2ggZGVzdHJveUxheW91dDsgcmVseWluZyBvbiBvcGVyYXRvciBk
ZWxldGUgaXMgbm90IHdvcmthYmxlIGFzIHRoZSBjbGFzcyBkb2VzIG5vdCBleGlzdCBvbiBhbGwg
cGxhdGZvcm1zLgorICAgICAgICAoV1RGOjpXZWJDb3JlOjpUZXh0TGF5b3V0KToKKyAgICAgICAg
KFdlYkNvcmUpOiBJbXBsZW1lbnQgbm8tb3AgVGV4dExheW91dCB3cmFwcGVycyBmb3Igbm9uLU1h
YyBwbGF0Zm9ybXMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlvdXQpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVsZXRlTGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnQ6OndpZHRoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Lmg6CisgICAgICAg
IChXZWJDb3JlKTogQWRkIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBSZW5kZXJUZXh0IGFuZCBU
ZXh0TGF5b3V0LgorICAgICAgICAoRm9udCk6IEFkZCBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0
aCBwb2ludGVyIHRvIFRleHRMYXlvdXQgaW1wbGVtZW50YXRpb24uCisgICAgICAgIChXVEYpOiBE
ZWNsYXJlIGRlbGV0ZU93bmVkUHRyIGZvciBUZXh0TGF5b3V0LgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuY3BwOgorICAgICAgICAoVGV4dExh
eW91dCk6IEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBDb21wbGV4
VGV4dENvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciBUZXh0UnVuLgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dExheW91dDo6aXNOZWVkZWQpOiBVc2VkIGJ5IHdyYXBwZXIgdG8gYXZvaWQgaW5zdGFu
dGlhdGlvbiB3aGVuIGNvbXBsZXggbGF5b3V0IGlzIG5vdCByZXF1aXJlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlRleHRMYXlvdXQ6OlRleHRMYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dExh
eW91dDo6d2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dExheW91dDo6Zm9udFdpdGhOb1dv
cmRTcGFjaW5nKTogSGVscGVyIGZ1bmN0aW9uIHRvIGFsbG93IGluaXRpYWxpemF0aW9uIG9mIG1l
bWJlciB2YXJpYWJsZS4KKyAgICAgICAgKFdlYkNvcmU6OlRleHRMYXlvdXQ6OmNvbnN0cnVjdFRl
eHRSdW4pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmUpOiBJbXBsZW1lbnQgcmVhbCBUZXh0TGF5
b3V0IHdyYXBwZXJzIGZvciBNYWMuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpjcmVhdGVMYXlv
dXQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZGVsZXRlTGF5b3V0KToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJv
bGxlcjo6Q29tcGxleFRleHRDb250cm9sbGVyKTogSW5pdGlhbGl6ZSBtX2x0ck9ubHkgYW5kIHJl
c2VydmUgaW5pdGlhbCBjYXBhY2l0eSBmb3IgbV9ydW5JbmRpY2VzLgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppbmRleE9mQ3VycmVudFJ1bik6IFJldHVybiAodmlz
dWFsKSBtX2NvbXBsZXhUZXh0UnVucyBpbmRleCBjb3JyZXNwb25kaW5nIHRvIChsb2dpY2FsKSBt
X2N1cnJlbnRSdW4sIGxhemlseSBjb25zdHJ1Y3RpbmcgbV9ydW5JbmRpY2VzIGlmIG5lZWRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6aW5jcmVtZW50Q3VycmVu
dFJ1bik6IFJldHVybiBuZXh0IG1fY29tcGxleFRleHRSdW5zIGluZGV4IGluIGxvZ2ljYWwgb3Jk
ZXIuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkdmFuY2UpOiBB
bGxvdyByZXN0YXJ0aW5nLCBzdXBwb3J0IGZvciBiaWRpIHJlb3JkZXJpbmcsIGFuZCBvcHRpb24g
dG8gbWVhc3VyZSBvbmx5IHdob2xlIGdseXBocyByYXRoZXIgdGhhbiBkaXZpZGluZyBhZHZhbmNl
cy4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWRqdXN0R2x5cGhz
QW5kQWR2YW5jZXMpOiBDbGVhciBtX2x0ck9ubHkgb24gZGV0ZWN0aW5nIGEgUlRMIHJ1bi4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmg6Cisg
ICAgICAgIChDb21wbGV4VGV4dENvbnRyb2xsZXIpOiBBZGQgbV9sdHJPbmx5IGluZGljYXRpbmcg
bm8gYmlkaSByZW9yZGVyaW5nLCBhbmQgbV9ydW5JbmRpY2VzIG1hcHBpbmcgZnJvbSBydW5zIChs
b2dpY2FsIG9yZGVyKSB0byBtX2NvbXBsZXhUZXh0UnVucyAodmlzdWFsIG9yZGVyKS4KKyAgICAg
ICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OmluZGV4
QmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4
VGV4dFJ1bjo6aXNMVFIpOgorICAgICAgICAoQ29tcGxleFRleHRSdW4pOiBBZGQgaGVscGVyIGZ1
bmN0aW9ucyByZXR1cm5pbmcgdmFsdWVzIHBlcnRpbmVudCB0byBpbmRpdmlkdWFsIHJ1bnMgYXMg
b3Bwb3NlZCB0byB0aGUgZW50aXJlIGNvbnRhaW5pbmcgbGluZS4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6c3RyaW5nQmVnaW4pOiBSZXR1cm4gZmlyc3Qgc3RyaW5n
IGluZGV4LgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzdHJpbmdF
bmQpOiBSZXR1cm4gb25lIHBhc3QgbGFzdCBzdHJpbmcgaW5kZXguCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0Lm1tOiBJbml0aWFs
aXplIG1faW5kZXhCZWdpbiBhbmQgbV9sdHIuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4
dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0UnVuOjpDb21wbGV4VGV4dFJ1bik6IEluaXRpYWxpemUg
bV9pbmRleEJlZ2luIGFuZCBtX2x0ci4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2su
aDoKKyAgICAgICAgKFJlbmRlclRleHRJbmZvKTogQWRkIHNpbmdsZSBtYXBwaW5nIGZyb20gUmVu
ZGVyVGV4dCB0byBMYXp5TGluZUJyZWFrSXRlcmF0b3IgYW5kIChwb3NzaWJseSBudWxsKSBUZXh0
TGF5b3V0IHNpbmNlIHRoZXkgYXJlIHJlY3JlYXRlZCB1bmRlciB0aGUgc2FtZSBjaXJjdW1zdGFu
Y2VzLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OlJlbmRlclRleHRJbmZvOjpSZW5kZXJUZXh0SW5m
byk6IE1ha2Ugbm9uLWlubGluZSB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJCbG9jazo6UmVuZGVyVGV4dEluZm86On5SZW5kZXJUZXh0SW5mbyk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9h
dHNJblJhbmdlKTogQWxsb3cgUmVuZGVyVGV4dEluZm8gdG8gYmUgcmV1c2VkIGFjcm9zcyBjYWxs
cyB0byBuZXh0TGluZUJyZWFrLgorICAgICAgICAoV2ViQ29yZTo6dGV4dFdpZHRoKTogVXNlIFRl
eHRMYXlvdXQgd2hlbiBzdXBwbGllZCBmb3IgbWVhc3VyaW5nLgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKToKKwogMjAxMi0wOC0yMyAg
U2hlcmlmZiBCb3QgIDx3ZWJraXQucmV2aWV3LmJvdEBnbWFpbC5jb20+CiAKICAgICAgICAgVW5y
ZXZpZXdlZCwgcm9sbGluZyBvdXQgcjEyNjU0Mi4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnQuY3BwCShyZXZpc2lvbiAxMjY0OTUpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzks
MTYgQEAKIHVzaW5nIG5hbWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKIAor
bmFtZXNwYWNlIFdURiB7CisKKy8vIGFsbG93IGNvbXBpbGF0aW9uIG9mIE93blB0cjxUZXh0TGF5
b3V0PiBpbiBzb3VyY2UgZmlsZXMgdGhhdCBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgVGV4dExh
eW91dCBjbGFzcyBkZWZpbml0aW9uCit0ZW1wbGF0ZSA8PiB2b2lkIGRlbGV0ZU93bmVkUHRyPFdl
YkNvcmU6OlRleHRMYXlvdXQ+KFdlYkNvcmU6OlRleHRMYXlvdXQqIHB0cikKK3sKKyAgICBXZWJD
b3JlOjpGb250OjpkZWxldGVMYXlvdXQocHRyKTsKK30KKworfQorCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIGNvbnN0IHVpbnQ4X3QgRm9udDo6c19yb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsy
NTZdID0gewpAQCAtMTk3LDYgKzIwNywyNSBAQCBmbG9hdCBGb250Ojp3aWR0aChjb25zdCBUZXh0
UnVuJiBydW4sIGluCiAgICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChydW4pOwog
fQogCisjaWYgIVBMQVRGT1JNKE1BQykKKworUGFzc093blB0cjxUZXh0TGF5b3V0PiBGb250Ojpj
cmVhdGVMYXlvdXQoUmVuZGVyVGV4dCosIGZsb2F0LCBib29sKSBjb25zdAoreworICAgIHJldHVy
biBudWxscHRyOworfQorCit2b2lkIEZvbnQ6OmRlbGV0ZUxheW91dChUZXh0TGF5b3V0KikKK3sK
K30KKworZmxvYXQgRm9udDo6d2lkdGgoVGV4dExheW91dCYsIHVuc2lnbmVkLCB1bnNpZ25lZCkK
K3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlm
CisKIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdCBUZXh0UnVuJiBy
dW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29u
c3QKIHsKICAgICB0byA9ICh0byA9PSAtMSA/IHJ1bi5sZW5ndGgoKSA6IHRvKTsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmgJKHJldmlzaW9uIDEyNjQ5NSkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaAkod29ya2luZyBjb3B5KQpA
QCAtNTMsNiArNTMsOCBAQCBjbGFzcyBGb250U2VsZWN0b3I7CiBjbGFzcyBHbHlwaEJ1ZmZlcjsK
IGNsYXNzIEdseXBoUGFnZVRyZWVOb2RlOwogY2xhc3MgR3JhcGhpY3NDb250ZXh0OworY2xhc3Mg
UmVuZGVyVGV4dDsKK2NsYXNzIFRleHRMYXlvdXQ7CiBjbGFzcyBUZXh0UnVuOwogCiBzdHJ1Y3Qg
R2x5cGhEYXRhOwpAQCAtMTAyLDYgKzEwNCwxMCBAQCBwdWJsaWM6CiAgICAgZmxvYXQgd2lkdGgo
Y29uc3QgVGV4dFJ1biYsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tG
b250cyA9IDAsIEdseXBoT3ZlcmZsb3cqID0gMCkgY29uc3Q7CiAgICAgZmxvYXQgd2lkdGgoY29u
c3QgVGV4dFJ1biYsIGludCYgY2hhcnNDb25zdW1lZCwgU3RyaW5nJiBnbHlwaE5hbWUpIGNvbnN0
OwogCisgICAgUGFzc093blB0cjxUZXh0TGF5b3V0PiBjcmVhdGVMYXlvdXQoUmVuZGVyVGV4dCos
IGZsb2F0IHhQb3MsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlKSBjb25zdDsKKyAgICBzdGF0aWMg
dm9pZCBkZWxldGVMYXlvdXQoVGV4dExheW91dCopOworICAgIHN0YXRpYyBmbG9hdCB3aWR0aChU
ZXh0TGF5b3V0JiwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuKTsKKwogICAgIGludCBvZmZz
ZXRGb3JQb3NpdGlvbihjb25zdCBUZXh0UnVuJiwgZmxvYXQgcG9zaXRpb24sIGJvb2wgaW5jbHVk
ZVBhcnRpYWxHbHlwaHMpIGNvbnN0OwogICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0Rm9yVGV4
dChjb25zdCBUZXh0UnVuJiwgY29uc3QgRmxvYXRQb2ludCYsIGludCBoLCBpbnQgZnJvbSA9IDAs
IGludCB0byA9IC0xKSBjb25zdDsKIApAQCAtMzEwLDQgKzMxNiwxMCBAQCBpbmxpbmUgZmxvYXQg
Rm9udDo6dGFiV2lkdGgoY29uc3QgU2ltcGxlCiAKIH0KIAorbmFtZXNwYWNlIFdURiB7CisKK3Rl
bXBsYXRlIDw+IHZvaWQgZGVsZXRlT3duZWRQdHI8V2ViQ29yZTo6VGV4dExheW91dD4oV2ViQ29y
ZTo6VGV4dExheW91dCopOworCit9CisKICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29udHJv
bGxlci5jcHAJKHJldmlzaW9uIDEyNjQ5NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Nyw2ICsyNyw4IEBACiAKICNpbmNsdWRlICJGbG9hdFNpemUuaCIKICNpbmNsdWRlICJGb250Lmgi
CisjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCiAjaW5j
bHVkZSAiVGV4dEJyZWFrSXRlcmF0b3IuaCIKICNpbmNsdWRlICJUZXh0UnVuLmgiCiAjaW5jbHVk
ZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CkBAIC0zNyw2ICsz
OSw3MSBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2Ns
YXNzIFRleHRMYXlvdXQgeworcHVibGljOgorICAgIHN0YXRpYyBib29sIGlzTmVlZGVkKFJlbmRl
clRleHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQpCisgICAgeworICAgICAgICBUZXh0UnVuIHJ1
biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQtPmNoYXJh
Y3RlcnMoKSwgdGV4dC0+dGV4dExlbmd0aCgpLCB0ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgcmV0
dXJuIGZvbnQuY29kZVBhdGgocnVuKSA9PSBGb250OjpDb21wbGV4OworICAgIH0KKworICAgIFRl
eHRMYXlvdXQoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcykK
KyAgICAgICAgOiBtX2ZvbnQoZm9udFdpdGhOb1dvcmRTcGFjaW5nKGZvbnQpKQorICAgICAgICAs
IG1fcnVuKGNvbnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgeFBvcykpCisgICAgICAgICwgbV9j
b250cm9sbGVyKGFkb3B0UHRyKG5ldyBDb21wbGV4VGV4dENvbnRyb2xsZXIoJm1fZm9udCwgbV9y
dW4sIHRydWUpKSkKKyAgICB7CisgICAgfQorCisgICAgZmxvYXQgd2lkdGgodW5zaWduZWQgZnJv
bSwgdW5zaWduZWQgbGVuKQorICAgIHsKKyAgICAgICAgbV9jb250cm9sbGVyLT5hZHZhbmNlKGZy
b20sIDAsIEJ5V2hvbGVHbHlwaHMpOworICAgICAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IG1fY29u
dHJvbGxlci0+cnVuV2lkdGhTb0ZhcigpOworICAgICAgICBtX2NvbnRyb2xsZXItPmFkdmFuY2Uo
ZnJvbSArIGxlbiwgMCwgQnlXaG9sZUdseXBocyk7CisgICAgICAgIGZsb2F0IGFmdGVyV2lkdGgg
PSBtX2NvbnRyb2xsZXItPnJ1bldpZHRoU29GYXIoKTsKKyAgICAgICAgcmV0dXJuIGFmdGVyV2lk
dGggLSBiZWZvcmVXaWR0aDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIEZvbnQgZm9u
dFdpdGhOb1dvcmRTcGFjaW5nKGNvbnN0IEZvbnQmIG9yaWdpbmFsRm9udCkKKyAgICB7CisgICAg
ICAgIEZvbnQgZm9udChvcmlnaW5hbEZvbnQpOworICAgICAgICBmb250LnNldFdvcmRTcGFjaW5n
KDApOworICAgICAgICByZXR1cm4gZm9udDsKKyAgICB9CisKKyAgICBzdGF0aWMgVGV4dFJ1biBj
b25zdHJ1Y3RUZXh0UnVuKFJlbmRlclRleHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0
IHhQb3MpCisgICAgeworICAgICAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1
Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQtPmNoYXJhY3RlcnMoKSwgdGV4dC0+dGV4dExlbmd0
aCgpLCB0ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4
dC0+dGV4dExlbmd0aCgpKTsKKyAgICAgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkg
Pj0gcnVuLmxlbmd0aCgpKTsKKworICAgICAgICBydW4uc2V0WFBvcyh4UG9zKTsKKyAgICAgICAg
cmV0dXJuIHJ1bjsKKyAgICB9CisKKyAgICAvLyBDb21wbGV4VGV4dENvbnRyb2xsZXIgaGFzIG9u
bHkgcmVmZXJlbmNlcyB0byBpdHMgRm9udCBhbmQgVGV4dFJ1biBzbyB0aGV5IG11c3QgYmUga2Vw
dCBhbGl2ZSBoZXJlLgorICAgIEZvbnQgbV9mb250OworICAgIFRleHRSdW4gbV9ydW47CisgICAg
T3duUHRyPENvbXBsZXhUZXh0Q29udHJvbGxlcj4gbV9jb250cm9sbGVyOworfTsKKworUGFzc093
blB0cjxUZXh0TGF5b3V0PiBGb250OjpjcmVhdGVMYXlvdXQoUmVuZGVyVGV4dCogdGV4dCwgZmxv
YXQgeFBvcywgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UpIGNvbnN0Cit7CisgICAgaWYgKCFjb2xs
YXBzZVdoaXRlU3BhY2UgfHwgIVRleHRMYXlvdXQ6OmlzTmVlZGVkKHRleHQsICp0aGlzKSkKKyAg
ICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUZXh0TGF5b3V0
KHRleHQsICp0aGlzLCB4UG9zKSk7Cit9CisKK3ZvaWQgRm9udDo6ZGVsZXRlTGF5b3V0KFRleHRM
YXlvdXQqIGxheW91dCkKK3sKKyAgICBkZWxldGUgbGF5b3V0OworfQorCitmbG9hdCBGb250Ojp3
aWR0aChUZXh0TGF5b3V0JiBsYXlvdXQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbikKK3sK
KyAgICByZXR1cm4gbGF5b3V0LndpZHRoKGZyb20sIGxlbik7Cit9CisKIHN0YXRpYyBpbmxpbmUg
Q0dGbG9hdCByb3VuZENHRmxvYXQoQ0dGbG9hdCBmKQogewogICAgIGlmIChzaXplb2YoQ0dGbG9h
dCkgPT0gc2l6ZW9mKGZsb2F0KSkKQEAgLTU0LDYgKzEyMSw3IEBAIHN0YXRpYyBpbmxpbmUgQ0dG
bG9hdCBjZWlsQ0dGbG9hdChDR0Zsb2EKIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRl
eHRDb250cm9sbGVyKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1biwgYm9vbCBt
YXlVc2VOYXR1cmFsV3JpdGluZ0RpcmVjdGlvbiwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0
YSo+KiBmYWxsYmFja0ZvbnRzLCBib29sIGZvclRleHRFbXBoYXNpcykKICAgICA6IG1fZm9udCgq
Zm9udCkKICAgICAsIG1fcnVuKHJ1bikKKyAgICAsIG1faXNMVFJPbmx5KHRydWUpCiAgICAgLCBt
X21heVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9uKG1heVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0
aW9uKQogICAgICwgbV9mb3JUZXh0RW1waGFzaXMoZm9yVGV4dEVtcGhhc2lzKQogICAgICwgbV9j
dXJyZW50Q2hhcmFjdGVyKDApCkBAIC05Miw2ICsxNjAsOSBAQCBDb21wbGV4VGV4dENvbnRyb2xs
ZXI6OkNvbXBsZXhUZXh0Q29udHJvCiAgICAgY29sbGVjdENvbXBsZXhUZXh0UnVucygpOwogICAg
IGFkanVzdEdseXBoc0FuZEFkdmFuY2VzKCk7CiAKKyAgICBpZiAoIW1faXNMVFJPbmx5KQorICAg
ICAgICBtX3J1bkluZGljZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShtX2NvbXBsZXhUZXh0UnVu
cy5zaXplKCkpOworCiAgICAgbV9ydW5XaWR0aFNvRmFyID0gbV9sZWFkaW5nRXhwYW5zaW9uOwog
fQogCkBAIC0zNDAsMjUgKzQxMSw3NSBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29t
cGxleFRleHRSCiAgICAgfQogfQogCi12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5j
ZSh1bnNpZ25lZCBvZmZzZXQsIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlcikKK3Vuc2lnbmVkIENv
bXBsZXhUZXh0Q29udHJvbGxlcjo6aW5kZXhPZkN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0
R2x5cGgpCit7CisgICAgbGVmdG1vc3RHbHlwaCA9IDA7CisgICAgCisgICAgc2l6ZV90IHJ1bkNv
dW50ID0gbV9jb21wbGV4VGV4dFJ1bnMuc2l6ZSgpOworICAgIGlmIChtX2N1cnJlbnRSdW4gPj0g
cnVuQ291bnQpCisgICAgICAgIHJldHVybiBydW5Db3VudDsKKworICAgIGlmIChtX2lzTFRST25s
eSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jdXJyZW50UnVuOyArK2kp
CisgICAgICAgICAgICBsZWZ0bW9zdEdseXBoICs9IG1fY29tcGxleFRleHRSdW5zW2ldLT5nbHlw
aENvdW50KCk7CisgICAgICAgIHJldHVybiBtX2N1cnJlbnRSdW47CisgICAgfQorCisgICAgd2hp
bGUgKG1fcnVuSW5kaWNlcy5zaXplKCkgPD0gbV9jdXJyZW50UnVuKSB7CisgICAgICAgIHVuc2ln
bmVkIG9mZnNldCA9IG1fcnVuSW5kaWNlcy5pc0VtcHR5KCkgPyAwIDogc3RyaW5nRW5kKCptX2Nv
bXBsZXhUZXh0UnVuc1ttX3J1bkluZGljZXMubGFzdCgpXSk7CisKKyAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHJ1bkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQg
PT0gc3RyaW5nQmVnaW4oKm1fY29tcGxleFRleHRSdW5zW2ldKSkgeworICAgICAgICAgICAgICAg
IG1fcnVuSW5kaWNlcy51bmNoZWNrZWRBcHBlbmQoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCBjdXJyZW50
UnVuSW5kZXggPSBtX3J1bkluZGljZXNbbV9jdXJyZW50UnVuXTsKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgY3VycmVudFJ1bkluZGV4OyArK2kpCisgICAgICAgIGxlZnRtb3N0R2x5cGgg
Kz0gbV9jb21wbGV4VGV4dFJ1bnNbaV0tPmdseXBoQ291bnQoKTsKKyAgICByZXR1cm4gY3VycmVu
dFJ1bkluZGV4OworfQorCit1bnNpZ25lZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmluY3JlbWVu
dEN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgpCit7CisgICAgaWYgKG1faXNMVFJP
bmx5KSB7CisgICAgICAgIGxlZnRtb3N0R2x5cGggKz0gbV9jb21wbGV4VGV4dFJ1bnNbbV9jdXJy
ZW50UnVuKytdLT5nbHlwaENvdW50KCk7CisgICAgICAgIHJldHVybiBtX2N1cnJlbnRSdW47Cisg
ICAgfQorCisgICAgbV9jdXJyZW50UnVuKys7CisgICAgbGVmdG1vc3RHbHlwaCA9IDA7CisgICAg
cmV0dXJuIGluZGV4T2ZDdXJyZW50UnVuKGxlZnRtb3N0R2x5cGgpOworfQorCit2b2lkIENvbXBs
ZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSh1bnNpZ25lZCBvZmZzZXQsIEdseXBoQnVmZmVyKiBn
bHlwaEJ1ZmZlciwgR2x5cGhJdGVyYXRpb25TdHlsZSBpdGVyYXRpb25TdHlsZSkKIHsKICAgICBp
ZiAoc3RhdGljX2Nhc3Q8aW50PihvZmZzZXQpID4gbV9lbmQpCiAgICAgICAgIG9mZnNldCA9IG1f
ZW5kOwogCi0gICAgaWYgKG9mZnNldCA8PSBtX2N1cnJlbnRDaGFyYWN0ZXIpCi0gICAgICAgIHJl
dHVybjsKKyAgICBpZiAob2Zmc2V0IDw9IG1fY3VycmVudENoYXJhY3RlcikgeworICAgICAgICBt
X3J1bldpZHRoU29GYXIgPSBtX2xlYWRpbmdFeHBhbnNpb247CisgICAgICAgIG1fbnVtR2x5cGhz
U29GYXIgPSAwOworICAgICAgICBtX2N1cnJlbnRSdW4gPSAwOworICAgICAgICBtX2dseXBoSW5D
dXJyZW50UnVuID0gMDsKKyAgICAgICAgbV9jaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCA9IDA7Cisg
ICAgfQogCiAgICAgbV9jdXJyZW50Q2hhcmFjdGVyID0gb2Zmc2V0OwogCiAgICAgc2l6ZV90IHJ1
bkNvdW50ID0gbV9jb21wbGV4VGV4dFJ1bnMuc2l6ZSgpOwogCi0gICAgYm9vbCBsdHIgPSBtX3J1
bi5sdHIoKTsKLQotICAgIHVuc2lnbmVkIGsgPSBsdHIgPyBtX251bUdseXBoc1NvRmFyIDogbV9h
ZGp1c3RlZEdseXBocy5zaXplKCkgLSAxIC0gbV9udW1HbHlwaHNTb0ZhcjsKKyAgICB1bnNpZ25l
ZCBsZWZ0bW9zdEdseXBoID0gMDsKKyAgICB1bnNpZ25lZCBjdXJyZW50UnVuSW5kZXggPSBpbmRl
eE9mQ3VycmVudFJ1bihsZWZ0bW9zdEdseXBoKTsKICAgICB3aGlsZSAobV9jdXJyZW50UnVuIDwg
cnVuQ291bnQpIHsKLSAgICAgICAgY29uc3QgQ29tcGxleFRleHRSdW4mIGNvbXBsZXhUZXh0UnVu
ID0gKm1fY29tcGxleFRleHRSdW5zW2x0ciA/IG1fY3VycmVudFJ1biA6IHJ1bkNvdW50IC0gMSAt
IG1fY3VycmVudFJ1bl07CisgICAgICAgIGNvbnN0IENvbXBsZXhUZXh0UnVuJiBjb21wbGV4VGV4
dFJ1biA9ICptX2NvbXBsZXhUZXh0UnVuc1tjdXJyZW50UnVuSW5kZXhdOworICAgICAgICBib29s
IGx0ciA9IGNvbXBsZXhUZXh0UnVuLmlzTFRSKCk7CiAgICAgICAgIHNpemVfdCBnbHlwaENvdW50
ID0gY29tcGxleFRleHRSdW4uZ2x5cGhDb3VudCgpOwogICAgICAgICB1bnNpZ25lZCBnID0gbHRy
ID8gbV9nbHlwaEluQ3VycmVudFJ1biA6IGdseXBoQ291bnQgLSAxIC0gbV9nbHlwaEluQ3VycmVu
dFJ1bjsKKyAgICAgICAgdW5zaWduZWQgayA9IGxlZnRtb3N0R2x5cGggKyBnOworCiAgICAgICAg
IHdoaWxlIChtX2dseXBoSW5DdXJyZW50UnVuIDwgZ2x5cGhDb3VudCkgewogICAgICAgICAgICAg
dW5zaWduZWQgZ2x5cGhTdGFydE9mZnNldCA9IGNvbXBsZXhUZXh0UnVuLmluZGV4QXQoZyk7CiAg
ICAgICAgICAgICB1bnNpZ25lZCBnbHlwaEVuZE9mZnNldDsKQEAgLTM4Nyw2ICs1MDgsOSBAQCB2
b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWR2YW5jZSh1bnNpCiAgICAgICAgICAgICAgICAg
Ly8gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZ2x5cGhzIHBlciBjaGFyYWN0ZXIgd2UgbmVlZCB0
byBhZHZhbmNlIGJ5IHRoZSBmdWxsIHdpZHRoIG9mIHRoZSBnbHlwaC4KICAgICAgICAgICAgICAg
ICBBU1NFUlQobV9jaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCA9PSBvbGRDaGFyYWN0ZXJJbkN1cnJl
bnRHbHlwaCk7CiAgICAgICAgICAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IGFkanVzdGVkQWR2
YW5jZS53aWR0aDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlcmF0aW9uU3R5bGUgPT0gQnlX
aG9sZUdseXBocykgeworICAgICAgICAgICAgICAgIGlmICghb2xkQ2hhcmFjdGVySW5DdXJyZW50
R2x5cGgpCisgICAgICAgICAgICAgICAgICAgIG1fcnVuV2lkdGhTb0ZhciArPSBhZGp1c3RlZEFk
dmFuY2Uud2lkdGg7CiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICBtX3J1bldp
ZHRoU29GYXIgKz0gYWRqdXN0ZWRBZHZhbmNlLndpZHRoICogKG1fY2hhcmFjdGVySW5DdXJyZW50
R2x5cGggLSBvbGRDaGFyYWN0ZXJJbkN1cnJlbnRHbHlwaCkgLyAoZ2x5cGhFbmRPZmZzZXQgLSBn
bHlwaFN0YXJ0T2Zmc2V0KTsKIApAQCAtNDA0LDEwICs1MjgsMTAgQEAgdm9pZCBDb21wbGV4VGV4
dENvbnRyb2xsZXI6OmFkdmFuY2UodW5zaQogICAgICAgICAgICAgICAgIGstLTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQotICAgICAgICBtX2N1cnJlbnRSdW4rKzsKKyAgICAgICAgY3VycmVu
dFJ1bkluZGV4ID0gaW5jcmVtZW50Q3VycmVudFJ1bihsZWZ0bW9zdEdseXBoKTsKICAgICAgICAg
bV9nbHlwaEluQ3VycmVudFJ1biA9IDA7CiAgICAgfQotICAgIGlmICghbHRyICYmIG1fbnVtR2x5
cGhzU29GYXIgPT0gbV9hZGp1c3RlZEFkdmFuY2VzLnNpemUoKSkKKyAgICBpZiAoIW1fcnVuLmx0
cigpICYmIG1fbnVtR2x5cGhzU29GYXIgPT0gbV9hZGp1c3RlZEFkdmFuY2VzLnNpemUoKSkKICAg
ICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IG1fZmluYWxSb3VuZGluZ1dpZHRoOwogfQogCkBAIC00
MjEsNiArNTQ1LDkgQEAgdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFkanVzdEdseXBocwog
ICAgICAgICB1bnNpZ25lZCBnbHlwaENvdW50ID0gY29tcGxleFRleHRSdW4uZ2x5cGhDb3VudCgp
OwogICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBjb21wbGV4VGV4dFJ1
bi5mb250RGF0YSgpOwogCisgICAgICAgIGlmICghY29tcGxleFRleHRSdW4uaXNMVFIoKSkKKyAg
ICAgICAgICAgIG1faXNMVFJPbmx5ID0gZmFsc2U7CisKICAgICAgICAgY29uc3QgQ0dHbHlwaCog
Z2x5cGhzID0gY29tcGxleFRleHRSdW4uZ2x5cGhzKCk7CiAgICAgICAgIGNvbnN0IENHU2l6ZSog
YWR2YW5jZXMgPSBjb21wbGV4VGV4dFJ1bi5hZHZhbmNlcygpOwogCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0
Q29udHJvbGxlci5oCShyZXZpc2lvbiAxMjY0OTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTQ0LDYgKzQ0LDggQEAgY2xhc3MgRm9udDsKIGNsYXNzIFNpbXBsZUZvbnREYXRhOwogY2xhc3Mg
VGV4dFJ1bjsKIAorZW51bSBHbHlwaEl0ZXJhdGlvblN0eWxlIHsgSW5jbHVkZVBhcnRpYWxHbHlw
aHMsIEJ5V2hvbGVHbHlwaHMgfTsKKwogLy8gQ29tcGxleFRleHRDb250cm9sbGVyIGlzIHJlc3Bv
bnNpYmxlIGZvciByZW5kZXJpbmcgYW5kIG1lYXN1cmluZyBnbHlwaHMgZm9yCiAvLyBjb21wbGV4
IHNjcmlwdHMgb24gT1MgWC4KIGNsYXNzIENvbXBsZXhUZXh0Q29udHJvbGxlciB7CkBAIC01MSw3
ICs1Myw3IEBAIHB1YmxpYzoKICAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3QgRm9udCos
IGNvbnN0IFRleHRSdW4mLCBib29sIG1heVVzZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9uID0gZmFs
c2UsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDAsIGJv
b2wgZm9yVGV4dEVtcGhhc2lzID0gZmFsc2UpOwogCiAgICAgLy8gQWR2YW5jZSBhbmQgZW1pdCBn
bHlwaHMgdXAgdG8gdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCi0gICAgdm9pZCBhZHZhbmNlKHVu
c2lnbmVkIHRvLCBHbHlwaEJ1ZmZlciogPSAwKTsKKyAgICB2b2lkIGFkdmFuY2UodW5zaWduZWQg
dG8sIEdseXBoQnVmZmVyKiA9IDAsIEdseXBoSXRlcmF0aW9uU3R5bGUgPSBJbmNsdWRlUGFydGlh
bEdseXBocyk7CiAKICAgICAvLyBDb21wdXRlIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGZvciBhIGdp
dmVuIHggY29vcmRpbmF0ZS4KICAgICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb24oZmxvYXQgeCwgYm9v
bCBpbmNsdWRlUGFydGlhbEdseXBocyk7CkBAIC04OSwxMCArOTEsMTIgQEAgcHJpdmF0ZToKICAg
ICAgICAgdW5zaWduZWQgc3RyaW5nTG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBtX3N0cmluZ0xv
Y2F0aW9uOyB9CiAgICAgICAgIHNpemVfdCBzdHJpbmdMZW5ndGgoKSBjb25zdCB7IHJldHVybiBt
X3N0cmluZ0xlbmd0aDsgfQogICAgICAgICBBTFdBWVNfSU5MSU5FIENGSW5kZXggaW5kZXhBdChz
aXplX3QgaSkgY29uc3Q7CisgICAgICAgIENGSW5kZXggaW5kZXhCZWdpbigpIGNvbnN0IHsgcmV0
dXJuIG1faW5kZXhCZWdpbjsgfQogICAgICAgICBDRkluZGV4IGluZGV4RW5kKCkgY29uc3QgeyBy
ZXR1cm4gbV9pbmRleEVuZDsgfQogICAgICAgICBDRkluZGV4IGVuZE9mZnNldEF0KHNpemVfdCBp
KSBjb25zdCB7IEFTU0VSVCghbV9pc01vbm90b25pYyk7IHJldHVybiBtX2dseXBoRW5kT2Zmc2V0
c1tpXTsgfQogICAgICAgICBjb25zdCBDR0dseXBoKiBnbHlwaHMoKSBjb25zdCB7IHJldHVybiBt
X2dseXBoczsgfQogICAgICAgICBjb25zdCBDR1NpemUqIGFkdmFuY2VzKCkgY29uc3QgeyByZXR1
cm4gbV9hZHZhbmNlczsgfQorICAgICAgICBib29sIGlzTFRSKCkgY29uc3QgeyByZXR1cm4gbV9p
c0xUUjsgfQogICAgICAgICBib29sIGlzTW9ub3RvbmljKCkgY29uc3QgeyByZXR1cm4gbV9pc01v
bm90b25pYzsgfQogICAgICAgICB2b2lkIHNldElzTm9uTW9ub3RvbmljKCk7CiAKQEAgLTEwNywy
MiArMTExLDM1IEBAIHByaXZhdGU6CiAgICAgICAgIHNpemVfdCBtX3N0cmluZ0xlbmd0aDsKICAg
ICAgICAgVmVjdG9yPENGSW5kZXgsIDY0PiBtX2NvcmVUZXh0SW5kaWNlc1ZlY3RvcjsKICAgICAg
ICAgY29uc3QgQ0ZJbmRleCogbV9jb3JlVGV4dEluZGljZXM7CisgICAgICAgIENGSW5kZXggbV9p
bmRleEJlZ2luOwogICAgICAgICBDRkluZGV4IG1faW5kZXhFbmQ7CiAgICAgICAgIFZlY3RvcjxD
RkluZGV4LCA2ND4gbV9nbHlwaEVuZE9mZnNldHM7CiAgICAgICAgIFZlY3RvcjxDR0dseXBoLCA2
ND4gbV9nbHlwaHNWZWN0b3I7CiAgICAgICAgIGNvbnN0IENHR2x5cGgqIG1fZ2x5cGhzOwogICAg
ICAgICBWZWN0b3I8Q0dTaXplLCA2ND4gbV9hZHZhbmNlc1ZlY3RvcjsKICAgICAgICAgY29uc3Qg
Q0dTaXplKiBtX2FkdmFuY2VzOworICAgICAgICBib29sIG1faXNMVFI7CiAgICAgICAgIGJvb2wg
bV9pc01vbm90b25pYzsKICAgICB9OworICAgIAorICAgIHN0YXRpYyB1bnNpZ25lZCBzdHJpbmdC
ZWdpbihjb25zdCBDb21wbGV4VGV4dFJ1biYgcnVuKSB7IHJldHVybiBydW4uc3RyaW5nTG9jYXRp
b24oKSArIHJ1bi5pbmRleEJlZ2luKCk7IH0KKyAgICBzdGF0aWMgdW5zaWduZWQgc3RyaW5nRW5k
KGNvbnN0IENvbXBsZXhUZXh0UnVuJiBydW4pIHsgcmV0dXJuIHJ1bi5zdHJpbmdMb2NhdGlvbigp
ICsgcnVuLmluZGV4RW5kKCk7IH0KIAogICAgIHZvaWQgY29sbGVjdENvbXBsZXhUZXh0UnVucygp
OwogCiAgICAgdm9pZCBjb2xsZWN0Q29tcGxleFRleHRSdW5zRm9yQ2hhcmFjdGVycyhjb25zdCBV
Q2hhciosIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgc3RyaW5nTG9jYXRpb24sIGNvbnN0IFNp
bXBsZUZvbnREYXRhKik7CiAgICAgdm9pZCBhZGp1c3RHbHlwaHNBbmRBZHZhbmNlcygpOwogCisg
ICAgdW5zaWduZWQgaW5kZXhPZkN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgpOwor
ICAgIHVuc2lnbmVkIGluY3JlbWVudEN1cnJlbnRSdW4odW5zaWduZWQmIGxlZnRtb3N0R2x5cGgp
OworCisgICAgLy8gVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGlzIHZlY3RvciB3YXMgc2VsZWN0ZWQg
YXMgYmVpbmcgdGhlIHNtYWxsZXN0IHBvd2VyIG9mIHR3byBncmVhdGVyIHRoYW4KKyAgICAvLyB0
aGUgYXZlcmFnZSAoMy41KSBwbHVzIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gKDcuNSkgb2Ygbm9u
emVybyBzaXplcyB1c2VkIG9uIEFyYWJpYyBXaWtpcGVkaWEuCisgICAgVmVjdG9yPHVuc2lnbmVk
LCAxNj4gbV9ydW5JbmRpY2VzOworCiAgICAgY29uc3QgRm9udCYgbV9mb250OwogICAgIGNvbnN0
IFRleHRSdW4mIG1fcnVuOworICAgIGJvb2wgbV9pc0xUUk9ubHk7CiAgICAgYm9vbCBtX21heVVz
ZU5hdHVyYWxXcml0aW5nRGlyZWN0aW9uOwogICAgIGJvb2wgbV9mb3JUZXh0RW1waGFzaXM7CiAK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4VGV4dENv
bnRyb2xsZXJDb3JlVGV4dC5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQubW0JKHJldmlzaW9u
IDEyNjQ5NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Db21wbGV4
VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5tbQkod29ya2luZyBjb3B5KQpAQCAtMTA1LDcgKzEwNSw5
IEBAIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRSdW46OkMKICAgICAsIG1fY2hh
cmFjdGVycyhjaGFyYWN0ZXJzKQogICAgICwgbV9zdHJpbmdMb2NhdGlvbihzdHJpbmdMb2NhdGlv
bikKICAgICAsIG1fc3RyaW5nTGVuZ3RoKHN0cmluZ0xlbmd0aCkKKyAgICAsIG1faW5kZXhCZWdp
bihydW5SYW5nZS5sb2NhdGlvbikKICAgICAsIG1faW5kZXhFbmQocnVuUmFuZ2UubG9jYXRpb24g
KyBydW5SYW5nZS5sZW5ndGgpCisgICAgLCBtX2lzTFRSKCEoQ1RSdW5HZXRTdGF0dXMoY3RSdW4p
ICYga0NUUnVuU3RhdHVzUmlnaHRUb0xlZnQpKQogICAgICwgbV9pc01vbm90b25pYyh0cnVlKQog
ewogICAgIG1fZ2x5cGhDb3VudCA9IENUUnVuR2V0R2x5cGhDb3VudChjdFJ1bik7CkBAIC0xMzgs
NyArMTQwLDkgQEAgQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dFJ1bjo6QwogICAg
ICwgbV9jaGFyYWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAgLCBtX3N0cmluZ0xvY2F0aW9uKHN0cmlu
Z0xvY2F0aW9uKQogICAgICwgbV9zdHJpbmdMZW5ndGgoc3RyaW5nTGVuZ3RoKQorICAgICwgbV9p
bmRleEJlZ2luKDApCiAgICAgLCBtX2luZGV4RW5kKHN0cmluZ0xlbmd0aCkKKyAgICAsIG1faXNM
VFIobHRyKQogICAgICwgbV9pc01vbm90b25pYyh0cnVlKQogewogICAgIG1fY29yZVRleHRJbmRp
Y2VzVmVjdG9yLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobV9zdHJpbmdMZW5ndGgpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHJldmlzaW9uIDEyNjQ5NSkKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBA
IC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiUmVuZGVyQm94LmgiCiAjaW5jbHVkZSAiUmVuZGVy
TGluZUJveExpc3QuaCIKICNpbmNsdWRlICJSb290SW5saW5lQm94LmgiCisjaW5jbHVkZSAiVGV4
dEJyZWFrSXRlcmF0b3IuaCIKICNpbmNsdWRlICJUZXh0UnVuLmgiCiAjaW5jbHVkZSA8d3RmL093
blB0ci5oPgogI2luY2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgpAQCAtMzgsNyArMzksNiBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBCaWRpQ29udGV4dDsKIGNsYXNzIElubGluZUl0ZXJh
dG9yOwogY2xhc3MgTGF5b3V0U3RhdGVNYWludGFpbmVyOwotY2xhc3MgTGF6eUxpbmVCcmVha0l0
ZXJhdG9yOwogY2xhc3MgTGluZUxheW91dFN0YXRlOwogY2xhc3MgTGluZVdpZHRoOwogY2xhc3Mg
UmVuZGVySW5saW5lOwpAQCAtNDgsNiArNDgsNyBAQCBzdHJ1Y3QgQmlkaVJ1bjsKIHN0cnVjdCBQ
YWludEluZm87CiBjbGFzcyBMaW5lSW5mbzsKIGNsYXNzIFJlbmRlclJ1YnlSdW47CitjbGFzcyBU
ZXh0TGF5b3V0OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIFJ1bj4gY2xhc3Mg
QmlkaVJlc29sdmVyOwogdGVtcGxhdGUgPGNsYXNzIFJ1bj4gY2xhc3MgQmlkaVJ1bkxpc3Q7CkBA
IC02OTIsNyArNjkzLDE2IEBAIHByaXZhdGU6CiAgICAgTGF5b3V0UG9pbnQgY29tcHV0ZUxvZ2lj
YWxMb2NhdGlvbkZvckZsb2F0KGNvbnN0IEZsb2F0aW5nT2JqZWN0KiwgTGF5b3V0VW5pdCBsb2dp
Y2FsVG9wT2Zmc2V0KSBjb25zdDsKIAogICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zJyBp
bXBsZW1lbnRhdGlvbnMgYXJlIGluIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAuCi0gICAgdHlw
ZWRlZiBzdGQ6OnBhaXI8UmVuZGVyVGV4dCosIExhenlMaW5lQnJlYWtJdGVyYXRvcj4gTGluZUJy
ZWFrSXRlcmF0b3JJbmZvOworICAgIHN0cnVjdCBSZW5kZXJUZXh0SW5mbyB7CisgICAgICAgIC8v
IERlc3RydWN0aW9uIG9mIG1fbGF5b3V0IHJlcXVpcmVzIFRleHRMYXlvdXQgdG8gYmUgYSBjb21w
bGV0ZSB0eXBlLCBzbyB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgYXJlIG1hZGUgbm9u
LWlubGluZSB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgICAgIFJlbmRlclRleHRJ
bmZvKCk7CisgICAgICAgIH5SZW5kZXJUZXh0SW5mbygpOworCisgICAgICAgIFJlbmRlclRleHQq
IG1fdGV4dDsKKyAgICAgICAgT3duUHRyPFRleHRMYXlvdXQ+IG1fbGF5b3V0OworICAgICAgICBM
YXp5TGluZUJyZWFrSXRlcmF0b3IgbV9saW5lQnJlYWtJdGVyYXRvcjsKKyAgICB9OworCiAgICAg
Y2xhc3MgTGluZUJyZWFrZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgTGluZUJyZWFrZXIoUmVu
ZGVyQmxvY2sqIGJsb2NrKQpAQCAtNzAxLDcgKzcxMSw3IEBAIHByaXZhdGU6CiAgICAgICAgICAg
ICByZXNldCgpOwogICAgICAgICB9CiAKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgbmV4dExpbmVC
cmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIExpbmVCcmVha0l0ZXJhdG9ySW5m
byYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBj
b25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIElubGluZUl0ZXJhdG9yIG5leHRM
aW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBSZW5kZXJUZXh0SW5mbyYs
IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CiAKICAgICAgICAgYm9vbCBsaW5lV2FzSHlwaGVuYXRl
ZCgpIHsgcmV0dXJuIG1faHlwaGVuYXRlZDsgfQogICAgICAgICBjb25zdCBWZWN0b3I8UmVuZGVy
Qm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKCkgeyByZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsg
fQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGlu
ZUxheW91dC5jcHAJKHJldmlzaW9uIDEyNjQ5NSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICszNiw2
IEBACiAjaW5jbHVkZSAiUmVuZGVyUnVieVJ1bi5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIK
ICNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1ZGUgIlRleHRCcmVha0l0ZXJhdG9yLmgiCiAj
aW5jbHVkZSAiVHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94LmgiCiAjaW5jbHVkZSAiVmVydGlj
YWxQb3NpdGlvbkNhY2hlLmgiCiAjaW5jbHVkZSAiYnJlYWtfbGluZXMuaCIKQEAgLTEyNDAsNiAr
MTIzOSwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzKExpCiAgICAg
cmVwYWludERpcnR5RmxvYXRzKGxheW91dFN0YXRlLmZsb2F0cygpKTsKIH0KIAorUmVuZGVyQmxv
Y2s6OlJlbmRlclRleHRJbmZvOjpSZW5kZXJUZXh0SW5mbygpCisgICAgOiBtX3RleHQoMCkKK3sK
K30KKworUmVuZGVyQmxvY2s6OlJlbmRlclRleHRJbmZvOjp+UmVuZGVyVGV4dEluZm8oKQorewor
fQorCiB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRSdW5zQW5kRmxvYXRzSW5SYW5nZShMaW5lTGF5
b3V0U3RhdGUmIGxheW91dFN0YXRlLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBjb25z
dCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGNsZWFu
TGluZUJpZGlTdGF0dXMsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKQogewog
ICAgIFJlbmRlclN0eWxlKiBzdHlsZVRvVXNlID0gc3R5bGUoKTsKQEAgLTEyNDcsNyArMTI1NSw3
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dFJ1bnNBbmRGbG9hdHNJblIKICAgICBMaW5lTWlk
cG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUgPSByZXNvbHZlci5taWRwb2ludFN0YXRlKCk7
CiAgICAgSW5saW5lSXRlcmF0b3IgZW5kID0gcmVzb2x2ZXIucG9zaXRpb24oKTsKICAgICBib29s
IGNoZWNrRm9yRW5kTGluZU1hdGNoID0gbGF5b3V0U3RhdGUuZW5kTGluZSgpOwotICAgIExpbmVC
cmVha0l0ZXJhdG9ySW5mbyBsaW5lQnJlYWtJdGVyYXRvckluZm87CisgICAgUmVuZGVyVGV4dElu
Zm8gcmVuZGVyVGV4dEluZm87CiAgICAgVmVydGljYWxQb3NpdGlvbkNhY2hlIHZlcnRpY2FsUG9z
aXRpb25DYWNoZTsKIAogICAgIExpbmVCcmVha2VyIGxpbmVCcmVha2VyKHRoaXMpOwpAQCAtMTI3
MCw3ICsxMjc4LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0UnVuc0FuZEZsb2F0c0luUgog
ICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciBvbGRFbmQgPSBlbmQ7CiAgICAgICAgIGJvb2wg
aXNOZXdVQkFQYXJhZ3JhcGggPSBsYXlvdXRTdGF0ZS5saW5lSW5mbygpLnByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSgpOwogICAgICAgICBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSA9IChtX2Zsb2F0aW5nT2JqZWN0cyAmJiAhbV9mbG9hdGluZ09iamVjdHMtPnNldCgp
LmlzRW1wdHkoKSkgPyBtX2Zsb2F0aW5nT2JqZWN0cy0+c2V0KCkubGFzdCgpIDogMDsKLSAgICAg
ICAgZW5kID0gbGluZUJyZWFrZXIubmV4dExpbmVCcmVhayhyZXNvbHZlciwgbGF5b3V0U3RhdGUu
bGluZUluZm8oKSwgbGluZUJyZWFrSXRlcmF0b3JJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNM
aW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgICAgIGVuZCA9IGxpbmVCcmVh
a2VyLm5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIHJlbmRl
clRleHRJbmZvLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25zZWN1dGl2ZUh5cGhlbmF0
ZWRMaW5lcyk7CiAgICAgICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkpIHsKICAg
ICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgY3JlYXRpbmcgYW55IHJ1bnMgaW4g
bmV4dExpbmVCcmVhayB0byBiZWdpbiB3aXRoIQogICAgICAgICAgICAgLy8gT25jZSBCaWRpUnVu
TGlzdCBpcyBzZXBhcmF0ZWQgZnJvbSBCaWRpUmVzb2x2ZXIgdGhpcyB3aWxsIG5vdCBiZSBuZWVk
ZWQuCkBAIC0xOTcwLDExICsxOTc4LDE0IEBAIHN0YXRpYyBib29sIHNob3VsZFNraXBXaGl0ZXNw
YWNlQWZ0ZXJTdGEKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgZmxvYXQg
dGV4dFdpZHRoKFJlbmRlclRleHQqIHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwg
Y29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29s
bGFwc2VXaGl0ZVNwYWNlKQorc3RhdGljIGlubGluZSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4
dCogdGV4dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250JiBmb250LCBm
bG9hdCB4UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIFRl
eHRMYXlvdXQqIGxheW91dCA9IDApCiB7CiAgICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20g
JiYgbGVuID09IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgdGV4dC0+c3R5bGUoKS0+aGFzVGV4dENv
bWJpbmUoKSkKICAgICAgICAgcmV0dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBv
cyk7CiAKKyAgICBpZiAobGF5b3V0KQorICAgICAgICByZXR1cm4gRm9udDo6d2lkdGgoKmxheW91
dCwgZnJvbSwgbGVuKTsKKwogICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVj
dFRleHRSdW4odGV4dCwgZm9udCwgdGV4dC0+Y2hhcmFjdGVycygpICsgZnJvbSwgbGVuLCB0ZXh0
LT5zdHlsZSgpKTsKICAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3Ro
KCkgLSBmcm9tKTsKICAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVu
Z3RoKCkpOwpAQCAtMjEzNiw4ICsyMTQ3LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6TGluZUJyZWFr
ZXI6OnJlc2V0KCkKICAgICBtX2NsZWFyID0gQ05PTkU7CiB9CiAKLUlubGluZUl0ZXJhdG9yIFJl
bmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6bmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXIm
IHJlc29sdmVyLCBMaW5lSW5mbyYgbGluZUluZm8sCi0gICAgTGluZUJyZWFrSXRlcmF0b3JJbmZv
JiBsaW5lQnJlYWtJdGVyYXRvckluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKK0lubGluZUl0
ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjo6bmV4dExpbmVCcmVhayhJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgbGluZUluZm8sIFJlbmRlclRleHRJbmZvJiBy
ZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUs
IHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKQogewogICAgIHJlc2V0KCk7CiAK
QEAgLTIzNzYsNiArMjM4NiwxMyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJy
ZWFrZXI6CiAgICAgICAgICAgICAgICAgQVNTRVJUKGN1cnJlbnQubV9wb3MgPT0gdC0+dGV4dExl
bmd0aCgpKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHJlbmRlclRleHRJbmZv
Lm1fdGV4dCAhPSB0IHx8IHJlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iuc3RyaW5n
KCkgIT0gdC0+Y2hhcmFjdGVycygpKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyVGV4dEluZm8u
bV90ZXh0ID0gdDsKKyAgICAgICAgICAgICAgICByZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGYu
Y3JlYXRlTGF5b3V0KHQsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBjb2xsYXBzZVdoaXRlU3BhY2Up
OworICAgICAgICAgICAgICAgIHJlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IucmVz
ZXQodC0+Y2hhcmFjdGVycygpLCB0LT50ZXh0TGVuZ3RoKCksIHN0eWxlLT5sb2NhbGUoKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gcmVuZGVy
VGV4dEluZm8ubV9sYXlvdXQuZ2V0KCk7CisKICAgICAgICAgICAgIGZvciAoOyBjdXJyZW50Lm1f
cG9zIDwgdC0+dGV4dExlbmd0aCgpOyBjdXJyZW50LmZhc3RJbmNyZW1lbnRJblRleHROb2RlKCkp
IHsKICAgICAgICAgICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSA9IGN1cnJl
bnRDaGFyYWN0ZXJJc1NwYWNlOwogICAgICAgICAgICAgICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0
ZXJJc1dTID0gY3VycmVudENoYXJhY3RlcklzV1M7CkBAIC0yMzk3LDE2ICsyNDE0LDExIEBAIElu
bGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpMaW5lQnJlYWtlcjoKICAgICAgICAgICAgICAgICBp
ZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29yZHMpICYmICFtaWRXb3JkQnJlYWspIHsKICAgICAgICAg
ICAgICAgICAgICAgd3JhcFcgKz0gY2hhcldpZHRoOwogICAgICAgICAgICAgICAgICAgICBib29s
IG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA9IFUxNl9JU19MRUFEKGMpICYmIGN1
cnJlbnQubV9wb3MgKyAxIDwgdC0+dGV4dExlbmd0aCgpICYmIFUxNl9JU19UUkFJTCh0LT5jaGFy
YWN0ZXJzKClbY3VycmVudC5tX3BvcyArIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhcldp
ZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3MsIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vy
cm9nYXRlUGFpciA/IDIgOiAxLCBmLCB3aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlz
Rml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgY2hh
cldpZHRoID0gdGV4dFdpZHRoKHQsIGN1cnJlbnQubV9wb3MsIG1pZFdvcmRCcmVha0lzQmVmb3Jl
U3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmLCB3aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcs
IGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCB0ZXh0TGF5b3V0KTsKICAgICAgICAg
ICAgICAgICAgICAgbWlkV29yZEJyZWFrID0gd2lkdGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBX
ICsgY2hhcldpZHRoID4gd2lkdGguYXZhaWxhYmxlV2lkdGgoKTsKICAgICAgICAgICAgICAgICB9
CiAKLSAgICAgICAgICAgICAgICBpZiAoKGxpbmVCcmVha0l0ZXJhdG9ySW5mby5maXJzdCAhPSB0
KSB8fCAobGluZUJyZWFrSXRlcmF0b3JJbmZvLnNlY29uZC5zdHJpbmcoKSAhPSB0LT5jaGFyYWN0
ZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVCcmVha0l0ZXJhdG9ySW5mby5maXJz
dCA9IHQ7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVCcmVha0l0ZXJhdG9ySW5mby5zZWNvbmQu
cmVzZXQodC0+Y2hhcmFjdGVycygpLCB0LT50ZXh0TGVuZ3RoKCksIHN0eWxlLT5sb2NhbGUoKSk7
Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbCBiZXR3ZWVuV29yZHMg
PSBjID09ICdcbicgfHwgKGN1cnJXUyAhPSBQUkUgJiYgIWF0U3RhcnQgJiYgaXNCcmVha2FibGUo
bGluZUJyZWFrSXRlcmF0b3JJbmZvLnNlY29uZCwgY3VycmVudC5tX3BvcywgY3VycmVudC5tX25l
eHRCcmVha2FibGVQb3NpdGlvbiwgYnJlYWtOQlNQKQorICAgICAgICAgICAgICAgIGJvb2wgYmV0
d2VlbldvcmRzID0gYyA9PSAnXG4nIHx8IChjdXJyV1MgIT0gUFJFICYmICFhdFN0YXJ0ICYmIGlz
QnJlYWthYmxlKHJlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IsIGN1cnJlbnQubV9w
b3MsIGN1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24sIGJyZWFrTkJTUCkKICAgICAgICAg
ICAgICAgICAgICAgJiYgKHN0eWxlLT5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUgfHwgKGN1cnJl
bnQucHJldmlvdXNJblNhbWVOb2RlKCkgIT0gc29mdEh5cGhlbikpKTsKIAogICAgICAgICAgICAg
ICAgIGlmIChiZXR3ZWVuV29yZHMgfHwgbWlkV29yZEJyZWFrKSB7CkBAIC0yNDI4LDkgKzI0NDAs
OSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6TGluZUJyZWFrZXI6CiAKICAgICAgICAg
ICAgICAgICAgICAgZmxvYXQgYWRkaXRpb25hbFRtcFc7CiAgICAgICAgICAgICAgICAgICAgIGlm
ICh3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICYmIGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAg
ICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNw
YWNlLCBjdXJyZW50Lm1fcG9zICsgMSAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKSAtIHdvcmRUcmFpbGluZ1NwYWNl
V2lkdGggKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFk
ZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3VycmVudC5tX3BvcyArIDEg
LSBsYXN0U3BhY2UsIGYsIHdpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIGNvbGxh
cHNlV2hpdGVTcGFjZSwgdGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICsgbGFz
dFNwYWNlV29yZFNwYWNpbmc7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGFkZGl0aW9uYWxUbXBXID0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgY3Vy
cmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQ
aXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAg
ICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRtcFcgPSB0ZXh0V2lkdGgodCwgbGFzdFNwYWNl
LCBjdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmLCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNG
aXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRMYXlvdXQpICsgbGFzdFNwYWNlV29y
ZFNwYWNpbmc7CiAgICAgICAgICAgICAgICAgICAgIHdpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgo
YWRkaXRpb25hbFRtcFcpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWRTdGFydFdp
ZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRo
KGlubGluZUxvZ2ljYWxXaWR0aChjdXJyZW50Lm1fb2JqLCB0cnVlLCBmYWxzZSkpOwpAQCAtMjQ0
Nyw3ICsyNDU5LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OkxpbmVCcmVha2VyOgog
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRoIGZvciB0aGlzIGxp
bmUuCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpbmVXYXNUb29XaWRlID0gZmFsc2U7
CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGguZml0c09uTGluZSgpICYmIGN1cnJl
bnRDaGFyYWN0ZXJJc1dTICYmIGN1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNl
KCkgJiYgIW1pZFdvcmRCcmVhaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0
IGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCAxLCBmLCB3aWR0aC5jdXJy
ZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpICsgKGFwcGx5V29y
ZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZsb2F0IGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBjdXJyZW50Lm1fcG9zLCAxLCBmLCB3aWR0
aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIHRleHRM
YXlvdXQpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOwogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpbmUgaXMgdG9vIGJpZyBldmVuIHdpdGhv
dXQgdGhlIGV4dHJhIHNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhl
IGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90LCBkbyBub3RoaW5nLgogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNl
IHRvIGJlIHRvbyBsb25nLApAQCAtMjU3Myw3ICsyNTg1LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVu
ZGVyQmxvY2s6OkxpbmVCcmVha2VyOgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJ
TVBPUlRBTlQ6IGN1cnJlbnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEKLSAgICAgICAgICAgIGZs
b2F0IGFkZGl0aW9uYWxUbXBXID0gaWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHQsIGxh
c3RTcGFjZSwgY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZiwgd2lkdGguY3VycmVudFdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFj
aW5nOworICAgICAgICAgICAgZmxvYXQgYWRkaXRpb25hbFRtcFcgPSBpZ25vcmluZ1NwYWNlcyA/
IDAgOiB0ZXh0V2lkdGgodCwgbGFzdFNwYWNlLCBjdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBm
LCB3aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2Us
IHRleHRMYXlvdXQpICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7CiAgICAgICAgICAgICB3aWR0aC5h
ZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUbXBXICsgaW5saW5lTG9naWNhbFdpZHRoKGN1
cnJlbnQubV9vYmosICFhcHBsaWVkU3RhcnRXaWR0aCwgaW5jbHVkZUVuZFdpZHRoKSk7CiAgICAg
ICAgICAgICBpbmNsdWRlRW5kV2lkdGggPSBmYWxzZTsKIAo=
</data>
<flag name="review"
          id="170903"
          type_id="1"
          status="+"
          setter="mitz"
    />
    <flag name="commit-queue"
          id="170904"
          type_id="3"
          status="-"
          setter="webkit.review.bot"
    />
          </attachment>
      

    </bug>

</bugzilla>