<?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>51106</bug_id>
          
          <creation_ts>2010-12-15 06:33:31 -0800</creation_ts>
          <short_desc>[Qt] Implement the fast font path for Qt</short_desc>
          <delta_ts>2011-05-10 04:39:24 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Text</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Performance, Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>60544</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andreas Kling">kling</reporter>
          <assigned_to name="Andreas Kling">kling</assigned_to>
          <cc>ariya.hidayat</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>eric</cc>
    
    <cc>gsimmons</cc>
    
    <cc>gzjjgod</cc>
    
    <cc>hausmann</cc>
    
    <cc>kenneth</cc>
    
    <cc>koansin.tan</cc>
    
    <cc>ossy</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit-ews</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>322587</commentid>
    <comment_count>0</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-12-15 06:33:31 -0800</bug_when>
    <thetext>We should implement WebKit&apos;s fast font path using the new QGlyphs API in Qt 4.8.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322603</commentid>
    <comment_count>1</comment_count>
      <attachid>76646</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-12-15 08:02:17 -0800</bug_when>
    <thetext>Created attachment 76646
Patch (work in progress)

Uploading my current WIP for feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322637</commentid>
    <comment_count>2</comment_count>
      <attachid>76646</attachid>
    <who name="Ariya Hidayat">ariya.hidayat</who>
    <bug_when>2010-12-15 09:41:06 -0800</bug_when>
    <thetext>Comment on attachment 76646
Patch (work in progress)

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

&gt; WebCore/WebCore.pro:3399
&gt; +greaterThan(QT_MAJOR_VERSION,3):greaterThan(QT_MINOR_VERSION, 7):HAVE_QGLYPHS=1

Hmm, Qt &gt; 3.7 ?

&gt; WebCore/platform/graphics/qt/FontQt.cpp:119
&gt; +	textFillPen = fillPenForContext(ctx);

Tab?

&gt; WebCore/platform/graphics/qt/FontQt.cpp:314
&gt; +    float x1 = line.cursorToX(from);
&gt; +    float x2 = line.cursorToX(to);
&gt; +    if (x2 &lt; x1)
&gt; +        qSwap(x1, x2);

Why not taking the min and max?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>323105</commentid>
    <comment_count>3</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-12-16 04:30:16 -0800</bug_when>
    <thetext>&gt; &gt; WebCore/WebCore.pro:3399
&gt; &gt; +greaterThan(QT_MAJOR_VERSION,3):greaterThan(QT_MINOR_VERSION, 7):HAVE_QGLYPHS=1
&gt; 
&gt; Hmm, Qt &gt; 3.7 ?

&gt;= 4.8 actually. Don&apos;t get me started on qmake syntax...

&gt; Tab?

grmbl.. oops :)

&gt; &gt; WebCore/platform/graphics/qt/FontQt.cpp:314
&gt; &gt; +    float x1 = line.cursorToX(from);
&gt; &gt; +    float x2 = line.cursorToX(to);
&gt; &gt; +    if (x2 &lt; x1)
&gt; &gt; +        qSwap(x1, x2);
&gt; 
&gt; Why not taking the min and max?

This code was just moved in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325440</commentid>
    <comment_count>4</comment_count>
      <attachid>76646</attachid>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2010-12-22 04:00:37 -0800</bug_when>
    <thetext>Comment on attachment 76646
Patch (work in progress)

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

&gt;&gt; WebCore/WebCore.pro:3399
&gt;&gt; +greaterThan(QT_MAJOR_VERSION,3):greaterThan(QT_MINOR_VERSION, 7):HAVE_QGLYPHS=1
&gt; 
&gt; Hmm, Qt &gt; 3.7 ?

a more readable version check: !lessThan(QT_MAJOR_VERSION,4):!lessThan(QT_MINOR_VERSION, 8):HAVE_QGLYPHS=1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>330135</commentid>
    <comment_count>5</comment_count>
      <attachid>78118</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-01-06 07:31:32 -0800</bug_when>
    <thetext>Created attachment 78118
Patch (work in progress)

Rebased patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>369886</commentid>
    <comment_count>6</comment_count>
      <attachid>86212</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-03-18 14:24:38 -0700</bug_when>
    <thetext>Created attachment 86212
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>369890</commentid>
    <comment_count>7</comment_count>
      <attachid>86213</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-03-18 14:27:20 -0700</bug_when>
    <thetext>Created attachment 86213
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>369891</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-03-18 14:30:14 -0700</bug_when>
    <thetext>Attachment 86213 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/platform/graphics/qt/FontQt.cpp:329:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Source/WebCore/platform/graphics/qt/FontQt.cpp:331:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 2 in 12 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>369907</commentid>
    <comment_count>9</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-03-18 14:46:12 -0700</bug_when>
    <thetext>Attachment 86213 did not build on qt:
Build output: http://queues.webkit.org/results/8203370</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>369922</commentid>
    <comment_count>10</comment_count>
      <attachid>86213</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-03-18 14:56:27 -0700</bug_when>
    <thetext>Comment on attachment 86213
Proposed patch

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

Would be nice if this compiled on Qt 4.7 as well, which is what I suppose the buildbots are running?

&gt; Source/WebCore/WebCore.pro:3086
&gt; +!lessThan(QT_MAJOR_VERSION,4):!lessThan(QT_MINOR_VERSION, 8):HAVE_QGLYPHS=1

why no space before 4?

&gt; Source/WebCore/platform/graphics/Font.cpp:151
&gt; +#if PLATFORM(QT) &amp;&amp; HAVE(QGLYPHS)
&gt; +    if (context-&gt;textDrawingMode() &amp; TextModeStroke || context-&gt;contextShadow()-&gt;m_type != ContextShadow::NoShadow)
&gt; +        codePathToUse = Complex;
&gt; +#endif

Why is this not in the codePath method? any particular reason?

&gt; Source/WebCore/platform/graphics/qt/FontQt.cpp:353
&gt; +    // Shadowed text should always take the complex path.

Text with shadow? Shadowed sounds a bit strange to me

&gt; Source/WebCore/platform/graphics/qt/FontQt.cpp:359
&gt; +    QVector&lt;quint32&gt; glyphIndexes;

Indices?

&gt; Source/WebCore/platform/graphics/qt/GlyphPageTreeNodeQt.cpp:54
&gt; +\

What is this for?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>370138</commentid>
    <comment_count>11</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-03-19 09:54:24 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Would be nice if this compiled on Qt 4.7 as well, which is what I suppose the buildbots are running?

That&apos;s a must-have obviously.

&gt; &gt; Source/WebCore/WebCore.pro:3086
&gt; &gt; +!lessThan(QT_MAJOR_VERSION,4):!lessThan(QT_MINOR_VERSION, 8):HAVE_QGLYPHS=1
&gt; 
&gt; why no space before 4?

Will fix. Though now that I think of it, we could just use QT_VERSION_CHECK and check for 4.8 instead of using a HAVE(QGLYPHS) macro..

&gt; &gt; Source/WebCore/platform/graphics/Font.cpp:151
&gt; &gt; +#if PLATFORM(QT) &amp;&amp; HAVE(QGLYPHS)
&gt; &gt; +    if (context-&gt;textDrawingMode() &amp; TextModeStroke || context-&gt;contextShadow()-&gt;m_type != ContextShadow::NoShadow)
&gt; &gt; +        codePathToUse = Complex;
&gt; &gt; +#endif
&gt; 
&gt; Why is this not in the codePath method? any particular reason?

The codePath method doesn&apos;t have access to a GraphicsContext.

&gt; &gt; Source/WebCore/platform/graphics/qt/FontQt.cpp:353
&gt; &gt; +    // Shadowed text should always take the complex path.
&gt; 
&gt; Text with shadow? Shadowed sounds a bit strange to me

Agree, will change.

&gt; &gt; Source/WebCore/platform/graphics/qt/FontQt.cpp:359
&gt; &gt; +    QVector&lt;quint32&gt; glyphIndexes;
&gt; 
&gt; Indices?

Both are valid words, I would normally call it Indices myself, but in this case the Qt API calls them glyphIndexes so I used the same name for the variable.

&gt; &gt; Source/WebCore/platform/graphics/qt/GlyphPageTreeNodeQt.cpp:54
&gt; &gt; +\
&gt; 
&gt; What is this for?

It improves performance about 200%. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>370139</commentid>
    <comment_count>12</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-03-19 09:58:21 -0700</bug_when>
    <thetext>
&gt; &gt; &gt; +\
&gt; &gt; 
&gt; &gt; What is this for?
&gt; 
&gt; It improves performance about 200%. :)

Then let&apos;s add some more of those \ in the code :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>370407</commentid>
    <comment_count>13</comment_count>
      <attachid>86213</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2011-03-21 09:09:51 -0700</bug_when>
    <thetext>Comment on attachment 86213
Proposed patch

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

&gt; Source/WebCore/platform/graphics/qt/GlyphPageTreeNodeQt.cpp:67
&gt; +    for (unsigned i = 0; i &lt; length; ++i) {
&gt; +        Glyph glyph = getGlyphForCharacterAndFont(qstring.at(i), font);

Wouldn&apos;t it be nice to get the glyphs for the page in one shot, instead of creating a QTextLayout (that&apos;ll heap alloc in the impl) for each character? :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>374117</commentid>
    <comment_count>14</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-03-27 06:40:56 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; (From update of attachment 86213 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=86213&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/qt/GlyphPageTreeNodeQt.cpp:67
&gt; &gt; +    for (unsigned i = 0; i &lt; length; ++i) {
&gt; &gt; +        Glyph glyph = getGlyphForCharacterAndFont(qstring.at(i), font);
&gt; 
&gt; Wouldn&apos;t it be nice to get the glyphs for the page in one shot, instead of creating a QTextLayout (that&apos;ll heap alloc in the impl) for each character? :)

Most definitely.

For anyone passing by, this bug is currently pending new API in Qt before deciding how to continue. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>396410</commentid>
    <comment_count>15</comment_count>
      <attachid>91928</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-02 09:29:42 -0700</bug_when>
    <thetext>Created attachment 91928
Proposed patch v2

This patch uses the new QRawFont APIs in the fire-team branch of Qt 4.8.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>396415</commentid>
    <comment_count>16</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-05-02 09:42:34 -0700</bug_when>
    <thetext>Attachment 91928 did not build on qt:
Build output: http://queues.webkit.org/results/8534073</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>396423</commentid>
    <comment_count>17</comment_count>
      <attachid>91933</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-02 09:53:08 -0700</bug_when>
    <thetext>Created attachment 91933
Proposed patch v3

Let&apos;s try to make that build on Qt 4.7..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>396435</commentid>
    <comment_count>18</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-05-02 10:11:26 -0700</bug_when>
    <thetext>Attachment 91933 did not build on qt:
Build output: http://queues.webkit.org/results/8531707</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>396439</commentid>
    <comment_count>19</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-02 10:13:41 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; Attachment 91933 [details] did not build on qt:
&gt; Build output: http://queues.webkit.org/results/8531707

Sigh. I&apos;ll leave this here for Simon to look at, since it will likely need multiple iterations anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397855</commentid>
    <comment_count>20</comment_count>
      <attachid>92225</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-04 06:06:43 -0700</bug_when>
    <thetext>Created attachment 92225
Proposed patch v4

Updated patch after IRL review with Simon.
Renamed HAVE(QGLYPHS) to HAVE(QRAWFONT) for inexplicable aesthetic reasons.
The GlyphPage::fill() friend hack is removed in favor of implementing SimpleFontData::platformWidthForGlyph().
As a side-effect, advances for zero-size fonts are now 0 (as they should be.)
I have requested an API to disable unneeded caching in Qt&apos;s font engines, but this is not yet available, and will be used in a follow-up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397860</commentid>
    <comment_count>21</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-04 06:08:11 -0700</bug_when>
    <thetext>Attachment 92225 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/platform/graphics/qt/FontCacheQt.cpp:101:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 1 in 12 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397865</commentid>
    <comment_count>22</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-04 06:11:51 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; Attachment 92225 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
&gt; 
&gt; Source/WebCore/platform/graphics/qt/FontCacheQt.cpp:101:  Should have a space between // and comment  [whitespace/comments] [4]

Whoops, that&apos;s my bad. Would not land with this, obviously. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398714</commentid>
    <comment_count>23</comment_count>
      <attachid>92225</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2011-05-05 07:46:56 -0700</bug_when>
    <thetext>Comment on attachment 92225
Proposed patch v4

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

r=me

Follow-up stuff:

    1) Implement stroking and shadowing for drawGlyphs (maybe in Qt)
    2) Extend QRawFont APIs so that we can pass const QChar* str, int len and get glyphs/advances in out-arrays, so that we can use QVarLengthArray on the WebKit side
    3) Other stuff I forgot ;)

&gt;&gt; Source/WebCore/platform/graphics/qt/FontCacheQt.cpp:101
&gt;&gt; +    //return getCachedFontData(fontDescription, fallbackFamily);
&gt; 
&gt; Should have a space between // and comment  [whitespace/comments] [4]

Remove this before landing :)

&gt; Source/WebCore/platform/graphics/qt/FontQt.cpp:337
&gt; +    QVector&lt;quint32&gt; glyphIndexes;
&gt; +    QVector&lt;QPointF&gt; positions;

These should be QVarLengthArrays. Fix before landing I&apos;d say.

&gt; Source/WebCore/platform/graphics/qt/FontQt.cpp:441
&gt; +bool Font::primaryFontHasGlyphForCharacter(UChar32) const
&gt; +{
&gt; +    notImplemented();
&gt; +    return true;
&gt; +}

This should be pretty easy to implement now, no?

&gt; Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:138
&gt; +    QVector&lt;quint32&gt; indexes = rawFont.glyphIndexesForString(QLatin1String(&quot; &quot;));

Urgh, I think we really need QRawFont::glyphIndexForCharacter, or better: an overload that takes a const QChar* and int len.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398715</commentid>
    <comment_count>24</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2011-05-05 07:47:36 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; &gt; Source/WebCore/platform/graphics/qt/FontQt.cpp:441
&gt; &gt; +bool Font::primaryFontHasGlyphForCharacter(UChar32) const
&gt; &gt; +{
&gt; &gt; +    notImplemented();
&gt; &gt; +    return true;
&gt; &gt; +}
&gt; 
&gt; This should be pretty easy to implement now, no?

Forget this comment please :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398721</commentid>
    <comment_count>25</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-05 08:20:23 -0700</bug_when>
    <thetext>Committed r85853: &lt;http://trac.webkit.org/changeset/85853&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398756</commentid>
    <comment_count>26</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2011-05-05 09:03:59 -0700</bug_when>
    <thetext>With the latest Qt 4.8 I got this fail:

../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp: In member function ‘void WebCore::SimpleFontData::platformInit()’:
../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:135: error: ‘class QRawFont’ has no member named ‘xHeight’
../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:136: error: ‘class QRawFont’ has no member named ‘leading’
../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp: In member function ‘void WebCore::SimpleFontData::platformCharWidthInit()’:
../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:178: error: ‘class QRawFont’ has no member named ‘averageCharWidth’
../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:179: error: ‘class QRawFont’ has no member named ‘maxCharWidth’


What kind of Qt do you use? :o Is it a hyper secret internal version or what?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398765</commentid>
    <comment_count>27</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-05 09:09:29 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; With the latest Qt 4.8 I got this fail:
&gt; 
&gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp: In member function ‘void WebCore::SimpleFontData::platformInit()’:
&gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:135: error: ‘class QRawFont’ has no member named ‘xHeight’
&gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:136: error: ‘class QRawFont’ has no member named ‘leading’
&gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp: In member function ‘void WebCore::SimpleFontData::platformCharWidthInit()’:
&gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:178: error: ‘class QRawFont’ has no member named ‘averageCharWidth’
&gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:179: error: ‘class QRawFont’ has no member named ‘maxCharWidth’
&gt; 
&gt; 
&gt; What kind of Qt do you use? :o Is it a hyper secret internal version or what?

I&apos;m using the fire-team pre-integration repository, not sure when it will be merged into mainline Qt. Jiang?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398770</commentid>
    <comment_count>28</comment_count>
    <who name="Jiang Jiang">gzjjgod</who>
    <bug_when>2011-05-05 09:17:21 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; (In reply to comment #26)
&gt; &gt; With the latest Qt 4.8 I got this fail:
&gt; &gt; 
&gt; &gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp: In member function ‘void WebCore::SimpleFontData::platformInit()’:
&gt; &gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:135: error: ‘class QRawFont’ has no member named ‘xHeight’
&gt; &gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:136: error: ‘class QRawFont’ has no member named ‘leading’
&gt; &gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp: In member function ‘void WebCore::SimpleFontData::platformCharWidthInit()’:
&gt; &gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:178: error: ‘class QRawFont’ has no member named ‘averageCharWidth’
&gt; &gt; ../../../Source/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp:179: error: ‘class QRawFont’ has no member named ‘maxCharWidth’
&gt; &gt; 
&gt; &gt; 
&gt; &gt; What kind of Qt do you use? :o Is it a hyper secret internal version or what?
&gt; 
&gt; I&apos;m using the fire-team pre-integration repository, not sure when it will be merged into mainline Qt. Jiang?

It seems that last integration attempt was blocked by some configuration problem of our internal CI server, my guess is that it will be integrated to mainline Qt in the next round, which means a couple of days or so.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398790</commentid>
    <comment_count>29</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2011-05-05 09:52:26 -0700</bug_when>
    <thetext>I absolutely confused ... Is there a policy somewhere for what can be landed in WebKit trunk or not? I thought Qt 4.8 means 4.8 branch on gitorious. But now we
can&apos;t get regressions on trunk until QRawFont changes goes to the 4.8 branch and I rebuild Qt and install it to the bot.

It would be better for buildbot if we require that WebKit trunk 
should be build with Qt 4.8 weekly build from 4.8 branch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398815</commentid>
    <comment_count>30</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-05-05 10:36:17 -0700</bug_when>
    <thetext>kling++! woot!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76646</attachid>
            <date>2010-12-15 08:02:17 -0800</date>
            <delta_ts>2011-01-06 07:31:32 -0800</delta_ts>
            <desc>Patch (work in progress)</desc>
            <filename>fastpath-wip.diff</filename>
            <type>text/plain</type>
            <size>20945</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dlYkNvcmUucHJvCmlu
ZGV4IDExYmY1MTQuLmNlYzIzOWMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5wcm8KKysr
IGIvV2ViQ29yZS9XZWJDb3JlLnBybwpAQCAtMzM5Niw2ICszMzk2LDIwIEBAIGNvbnRhaW5zKERF
RklORVMsIEVOQUJMRV9RVF9CRUFSRVI9MSkgewogICAgIH0KIH0KIAorZ3JlYXRlclRoYW4oUVRf
TUFKT1JfVkVSU0lPTiwzKTpncmVhdGVyVGhhbihRVF9NSU5PUl9WRVJTSU9OLCA3KTpIQVZFX1FH
TFlQSFM9MQorCishaXNFbXB0eShIQVZFX1FHTFlQSFMpIHsKKyAgICBERUZJTkVTICs9IEhBVkVf
UUdMWVBIUz0xCisKKyAgICBTT1VSQ0VTICs9IFwKKyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mv
Rm9udEZhc3RQYXRoLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZVRy
ZWVOb2RlLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL1dpZHRoSXRlcmF0b3IuY3Bw
CisKKyAgICBIRUFERVJTICs9IFwKKyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJdGVy
YXRvci5oCit9CisKIGNvbnRhaW5zKERFRklORVMsIEVOQUJMRV9HRU9MT0NBVElPTj0xKSB7CiAg
ICAgREVGSU5FUyArPSBXVEZfVVNFX1BSRUVNUFRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTgogICAg
IEhFQURFUlMgKz0gXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250
LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKaW5kZXggMDliMDBmMC4u
ZDA1NDUyNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCkBAIC0yNyw2ICsyNywxMCBA
QAogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1
ZGUgIkZvbnRUcmFuc2NvZGVyLmgiCisjaWYgUExBVEZPUk0oUVQpICYmIEhBVkUoUUdMWVBIUykK
KyNpbmNsdWRlICJDb250ZXh0U2hhZG93LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjZW5kaWYKICNpbmNsdWRlICJJbnRQb2ludC5oIgogI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgi
CiAjaW5jbHVkZSAiV2lkdGhJdGVyYXRvci5oIgpAQCAtMTUwLDcgKzE1NCwxNCBAQCB2b2lkIEZv
bnQ6OmRyYXdUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVu
LCBjb25zdCBGbG9hdFBvaQogICAgIH0KICNlbmRpZgogCi0gICAgaWYgKGNvZGVQYXRoKHJ1bikg
IT0gQ29tcGxleCkKKyAgICBDb2RlUGF0aCBjb2RlUGF0aFRvVXNlID0gY29kZVBhdGgocnVuKTs7
CisKKyNpZiBQTEFURk9STShRVCkgJiYgSEFWRShRR0xZUEhTKQorICAgIGlmIChjb250ZXh0LT50
ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tlIHx8IGNvbnRleHQtPmNvbnRleHRTaGFk
b3coKS0+bV90eXBlICE9IENvbnRleHRTaGFkb3c6Ok5vU2hhZG93KQorICAgICAgICBjb2RlUGF0
aFRvVXNlID0gQ29tcGxleDsKKyNlbmRpZgorCisgICAgaWYgKGNvZGVQYXRoVG9Vc2UgIT0gQ29t
cGxleCkKICAgICAgICAgcmV0dXJuIGRyYXdTaW1wbGVUZXh0KGNvbnRleHQsIHJ1biwgcG9pbnQs
IGZyb20sIHRvKTsKIAogICAgIHJldHVybiBkcmF3Q29tcGxleFRleHQoY29udGV4dCwgcnVuLCBw
b2ludCwgZnJvbSwgdG8pOwpAQCAtMjcyLDcgKzI4Myw3IEBAIEZvbnQ6OkNvZGVQYXRoIEZvbnQ6
OmNvZGVQYXRoKGNvbnN0IFRleHRSdW4mIHJ1bikgY29uc3QKICAgICBpZiAoc19jb2RlUGF0aCAh
PSBBdXRvKQogICAgICAgICByZXR1cm4gc19jb2RlUGF0aDsKIAotI2lmIFBMQVRGT1JNKFFUKQor
I2lmIFBMQVRGT1JNKFFUKSAmJiAhSEFWRShRR0xZUEhTKQogICAgIGlmIChydW4ucGFkZGluZygp
IHx8IHJ1bi5ydGwoKSB8fCBpc1NtYWxsQ2FwcygpIHx8IHdvcmRTcGFjaW5nKCkgfHwgbGV0dGVy
U3BhY2luZygpKQogICAgICAgICByZXR1cm4gQ29tcGxleDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCmluZGV4IDZkMzIxNjEuLmM1MzMy
MzEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0
LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAK
QEAgLTMzNCw3ICszMzQsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ltYWdlKEltYWdl
KiBpbWFnZSwgQ29sb3JTcGFjZSBzdHlsZUNvbG9yU3BhY2UsIGNvbnN0CiAgICAgZHJhd0ltYWdl
KGltYWdlLCBzdHlsZUNvbG9yU3BhY2UsIEZsb2F0UmVjdChkZXN0KSwgc3JjUmVjdCwgb3AsIHVz
ZUxvd1F1YWxpdHlTY2FsZSk7CiB9CiAKLSNpZiAhT1MoV0lOQ0UpIHx8IFBMQVRGT1JNKFFUKQor
I2lmICFPUyhXSU5DRSkgfHwgKFBMQVRGT1JNKFFUKSAmJiAhSEFWRShRR0xZUEhTKSkKIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpkcmF3VGV4dChjb25zdCBGb250JiBmb250LCBjb25zdCBUZXh0UnVu
JiBydW4sIGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykKIHsKICAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9TaW1wbGVGb250RGF0YS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBs
ZUZvbnREYXRhLmNwcAppbmRleCAzOTE4NzNhLi40MmUwZTBhIDEwMDY0NAotLS0gYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcApAQCAtMTE0LDcgKzExNCw3IEBAIFNpbXBs
ZUZvbnREYXRhOjpTaW1wbGVGb250RGF0YShQYXNzT3duUHRyPFNWR0ZvbnREYXRhPiBzdmdGb250
RGF0YSwgaW50IHNpemUsIGJvCiB9CiAjZW5kaWYKIAotI2lmICFQTEFURk9STShRVCkKKyNpZiAh
KFBMQVRGT1JNKFFUKSAmJiAhSEFWRShRR0xZUEhTKSkKIC8vIEVzdGltYXRlcyBvZiBhdmdDaGFy
V2lkdGggYW5kIG1heENoYXJXaWR0aCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBh
Y2Nlc3NpbmcgdGhlc2UgdmFsdWVzIGZyb20gdGhlIGZvbnQuCiB2b2lkIFNpbXBsZUZvbnREYXRh
Ojppbml0Q2hhcldpZHRocygpCiB7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL1NpbXBsZUZvbnREYXRhLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZv
bnREYXRhLmgKaW5kZXggZWEwNTNjZC4uYmM4YWE1ZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvU2ltcGxlRm9udERhdGEuaApAQCAtMTc0LDYgKzE3NCwxMSBAQCBwdWJsaWM6CiAgICAg
Rm9udE9yaWVudGF0aW9uIG9yaWVudGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9vcmllbnRhdGlv
bjsgfQogCiBwcml2YXRlOgorI2lmIFBMQVRGT1JNKFFUKSAmJiBIQVZFKFFHTFlQSFMpCisgICAg
Ly8gR2x5cGhQYWdlOjpmaWxsKCkgZmlsbHMgaW4gbV9nbHlwaFRvV2lkdGhNYXAgb24gUXQuCisg
ICAgZnJpZW5kIGNsYXNzIEdseXBoUGFnZTsKKyNlbmRpZgorCiAgICAgdm9pZCBwbGF0Zm9ybUlu
aXQoKTsKICAgICB2b2lkIHBsYXRmb3JtR2x5cGhJbml0KCk7CiAgICAgdm9pZCBwbGF0Zm9ybUNo
YXJXaWR0aEluaXQoKTsKQEAgLTI2Myw5ICsyNjgsOCBAQCBwcml2YXRlOgogI2VuZGlmCiAjZW5k
aWYKIH07Ci0gICAgCi0gICAgCi0jaWYgIVBMQVRGT1JNKFFUKQorCisjaWYgIShQTEFURk9STShR
VCkgJiYgIUhBVkUoUUdMWVBIUykpCiBBTFdBWVNfSU5MSU5FIEZsb2F0UmVjdCBTaW1wbGVGb250
RGF0YTo6Ym91bmRzRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0CiB7CiAgICAgaWYgKGlzWmVy
b1dpZHRoU3BhY2VHbHlwaChnbHlwaCkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
cXQvRm9udFBsYXRmb3JtRGF0YS5oCmluZGV4IDFjNTdlMjkuLmZkZjVlY2EgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YS5oCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YS5oCkBAIC0xNjcsNiAr
MTY3LDkgQEAgcHVibGljOgogICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGNvbnN0OwogI2VuZGlm
CiBwcml2YXRlOgorI2lmIEhBVkUoUUdMWVBIUykKKyAgICBmcmllbmQgY2xhc3MgR2x5cGhQYWdl
OworI2VuZGlmCiAgICAgRm9udFBsYXRmb3JtRGF0YVByaXZhdGUqIG1fZGF0YTsKIH07CiAKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcAppbmRleCBjMjgxMGRlLi45NzRjYjdi
IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwCkBAIC0yNyw2ICsyNyw5
IEBACiAjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCiAjaW5jbHVkZSAiRm9udEZhbGxiYWNr
TGlzdC5oIgogI2luY2x1ZGUgIkZvbnRTZWxlY3Rvci5oIgorI2lmIEhBVkUoUUdMWVBIUykKKyNp
bmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2VuZGlmCiAjaW5jbHVkZSAiR3JhZGllbnQuaCIKICNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJQYXR0ZXJuLmgiCkBAIC03MSw2
ICs3NCwzOSBAQCBzdGF0aWMgUVRleHRMaW5lIHNldHVwTGF5b3V0KFFUZXh0TGF5b3V0KiBsYXlv
dXQsIGNvbnN0IFRleHRSdW4mIHN0eWxlKQogICAgIHJldHVybiBsaW5lOwogfQogCitzdGF0aWMg
UVBlbiBmaWxsUGVuRm9yQ29udGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCkKK3sKKyAgICBpZiAo
Y3R4LT5maWxsR3JhZGllbnQoKSkgeworICAgICAgICBRQnJ1c2ggYnJ1c2goKmN0eC0+ZmlsbEdy
YWRpZW50KCktPnBsYXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGJydXNoLnNldFRyYW5zZm9y
bShjdHgtPmZpbGxHcmFkaWVudCgpLT5ncmFkaWVudFNwYWNlVHJhbnNmb3JtKCkpOworICAgICAg
ICByZXR1cm4gUVBlbihicnVzaCwgMCk7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZmlsbFBhdHRl
cm4oKSkgeworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOworICAgICAgICByZXR1cm4g
UVBlbihRQnJ1c2goY3R4LT5maWxsUGF0dGVybigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZm
aW5lKSksIDApOworICAgIH0KKworICAgIHJldHVybiBRUGVuKFFDb2xvcihjdHgtPmZpbGxDb2xv
cigpKSk7Cit9CisKK3N0YXRpYyBRUGVuIHN0cm9rZVBlbkZvckNvbnRleHQoR3JhcGhpY3NDb250
ZXh0KiBjdHgpCit7CisgICAgaWYgKGN0eC0+c3Ryb2tlR3JhZGllbnQoKSkgeworICAgICAgICBR
QnJ1c2ggYnJ1c2goKmN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+cGxhdGZvcm1HcmFkaWVudCgpKTsK
KyAgICAgICAgYnJ1c2guc2V0VHJhbnNmb3JtKGN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+Z3JhZGll
bnRTcGFjZVRyYW5zZm9ybSgpKTsKKyAgICAgICAgcmV0dXJuIFFQZW4oYnJ1c2gsIGN0eC0+c3Ry
b2tlVGhpY2tuZXNzKCkpOworICAgIH0KKworICAgIGlmIChjdHgtPnN0cm9rZVBhdHRlcm4oKSkg
eworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOworICAgICAgICBRQnJ1c2ggYnJ1c2go
Y3R4LT5zdHJva2VQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUpKTsKKyAg
ICAgICAgcmV0dXJuIFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOworICAgIH0K
KworICAgIHJldHVybiBRUGVuKFFDb2xvcihjdHgtPnN0cm9rZUNvbG9yKCkpLCBjdHgtPnN0cm9r
ZVRoaWNrbmVzcygpKTsKK30KKwogc3RhdGljIHZvaWQgZHJhd1RleHRDb21tb24oR3JhcGhpY3ND
b250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQs
IGludCBmcm9tLCBpbnQgdG8sIGNvbnN0IFFGb250JiBmb250LCBib29sIGlzQ29tcGxleFRleHQp
CiB7CiAgICAgaWYgKHRvIDwgMCkKQEAgLTc5LDMxICsxMTUsMTIgQEAgc3RhdGljIHZvaWQgZHJh
d1RleHRDb21tb24oR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29u
c3QgRmxvYXQKICAgICBRUGFpbnRlciAqcCA9IGN0eC0+cGxhdGZvcm1Db250ZXh0KCk7CiAKICAg
ICBRUGVuIHRleHRGaWxsUGVuOwotICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4
dE1vZGVGaWxsKSB7Ci0gICAgICAgIGlmIChjdHgtPmZpbGxHcmFkaWVudCgpKSB7Ci0gICAgICAg
ICAgICBRQnJ1c2ggYnJ1c2goKmN0eC0+ZmlsbEdyYWRpZW50KCktPnBsYXRmb3JtR3JhZGllbnQo
KSk7Ci0gICAgICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5maWxsR3JhZGllbnQoKS0+
Z3JhZGllbnRTcGFjZVRyYW5zZm9ybSgpKTsKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBl
bihicnVzaCwgMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3R4LT5maWxsUGF0dGVybigpKSB7Ci0g
ICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOwotICAgICAgICAgICAgdGV4dEZpbGxQ
ZW4gPSBRUGVuKFFCcnVzaChjdHgtPmZpbGxQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVy
bihhZmZpbmUpKSwgMCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgdGV4dEZpbGxQZW4g
PSBRUGVuKFFDb2xvcihjdHgtPmZpbGxDb2xvcigpKSk7Ci0gICAgfQorICAgIGlmIChjdHgtPnRl
eHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVGaWxsKQorCXRleHRGaWxsUGVuID0gZmlsbFBlbkZv
ckNvbnRleHQoY3R4KTsKIAogICAgIFFQZW4gdGV4dFN0cm9rZVBlbjsKLSAgICBpZiAoY3R4LT50
ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tlKSB7Ci0gICAgICAgIGlmIChjdHgtPnN0
cm9rZUdyYWRpZW50KCkpIHsKLSAgICAgICAgICAgIFFCcnVzaCBicnVzaCgqY3R4LT5zdHJva2VH
cmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkpOwotICAgICAgICAgICAgYnJ1c2guc2V0VHJh
bnNmb3JtKGN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+Z3JhZGllbnRTcGFjZVRyYW5zZm9ybSgpKTsK
LSAgICAgICAgICAgIHRleHRTdHJva2VQZW4gPSBRUGVuKGJydXNoLCBjdHgtPnN0cm9rZVRoaWNr
bmVzcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjdHgtPnN0cm9rZVBhdHRlcm4oKSkgewotICAg
ICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFmZmluZTsKLSAgICAgICAgICAgIFFCcnVzaCBicnVz
aChjdHgtPnN0cm9rZVBhdHRlcm4oKS0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkpOwot
ICAgICAgICAgICAgdGV4dFN0cm9rZVBlbiA9IFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tu
ZXNzKCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHRleHRTdHJva2VQZW4gPSBRUGVu
KFFDb2xvcihjdHgtPnN0cm9rZUNvbG9yKCkpLCBjdHgtPnN0cm9rZVRoaWNrbmVzcygpKTsKLSAg
ICB9CisgICAgaWYgKGN0eC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZVN0cm9rZSkKKyAg
ICAgICAgdGV4dFN0cm9rZVBlbiA9IHN0cm9rZVBlbkZvckNvbnRleHQoY3R4KTsKIAogICAgIFN0
cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5jaGFyYWN0
ZXJzKCksIHJ1bi5sZW5ndGgoKSkpOwogICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFX
aXRob3V0UmVmKHNhbml0aXplZCk7CkBAIC0yNDYsNjUgKzI2MywxMjggQEAgc3RhdGljIHZvaWQg
ZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwg
Y29uc3QgRmxvYXQKICAgICB9CiB9CiAKLXZvaWQgRm9udDo6ZHJhd1NpbXBsZVRleHQoR3JhcGhp
Y3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9p
bnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJT
SU9OX0NIRUNLKDQsIDcsIDApCi0gICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4sIHBvaW50LCBm
cm9tLCB0bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0gKi9mYWxzZSk7Ci0jZWxzZQotICAg
IFFfQVNTRVJUKGZhbHNlKTsKLSNlbmRpZgotfQotCiB2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4
dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBv
aW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICAgICBkcmF3VGV4dENvbW1v
bihjdHgsIHJ1biwgcG9pbnQsIGZyb20sIHRvLCBmb250KCksIC8qIGlzQ29tcGxleFRleHQgPSAq
L3RydWUpOwogfQogCi1mbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBU
ZXh0UnVuJiBydW4sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgSGFzaFNldDxjb25zdCBTaW1w
bGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93
KSBjb25zdAorZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRS
dW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiwgR2x5cGhPdmVyZmxvdyop
IGNvbnN0CiB7CiAgICAgaWYgKCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5zaXplKCkp
CiAgICAgICAgIHJldHVybiAwOwogCi0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNL
KDQsIDcsIDApCiAgICAgaWYgKCFydW4ubGVuZ3RoKCkpCiAgICAgICAgIHJldHVybiAwOwogCisg
ICAgaWYgKHJ1bi5sZW5ndGgoKSA9PSAxICYmIHRyZWF0QXNTcGFjZShydW5bMF0pKQorICAgICAg
ICByZXR1cm4gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3BhY2UpICsgcnVuLnBhZGRpbmco
KTsKKwogICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5n
KHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSkpOwogICAgIFFTdHJpbmcgc3RyaW5nID0g
ZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CiAKLSAgICBpbnQgdyA9IFFGb250TWV0
cmljcyhmb250KCkpLndpZHRoKHN0cmluZywgLTEsIFF0OjpUZXh0QnlwYXNzU2hhcGluZyk7Ci0K
KyAgICBpbnQgdyA9IFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHN0cmluZyk7CiAgICAgLy8g
V2ViS2l0IGV4cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQgc3BhY2luZyBvbiB0aGUgZmlyc3QgY2hh
cmFjdGVyIChhcyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9lcykKICAgICBpZiAodHJlYXRBc1NwYWNl
KHJ1blswXSkpCiAgICAgICAgIHcgLT0gbV93b3JkU3BhY2luZzsKIAogICAgIHJldHVybiB3ICsg
cnVuLnBhZGRpbmcoKTsKLSNlbHNlCi0gICAgUV9BU1NFUlQoZmFsc2UpOwotICAgIHJldHVybiAw
OwotI2VuZGlmCiB9CiAKLWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25z
dCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiosIEdseXBoT3Zl
cmZsb3cqKSBjb25zdAoraW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQo
Y29uc3QgVGV4dFJ1biYgcnVuLCBmbG9hdCBwb3NpdGlvbiwgYm9vbCkgY29uc3QKIHsKLSAgICBp
ZiAoIXByaW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLnNpemUoKSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBpZiAoIXJ1bi5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgU3Ry
aW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhTdHJpbmcocnVuLmNoYXJhY3Rl
cnMoKSwgcnVuLmxlbmd0aCgpKSk7CisgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdp
dGhvdXRSZWYoc2FuaXRpemVkKTsKIAotICAgIGlmIChydW4ubGVuZ3RoKCkgPT0gMSAmJiB0cmVh
dEFzU3BhY2UocnVuWzBdKSkKLSAgICAgICAgcmV0dXJuIFFGb250TWV0cmljcyhmb250KCkpLndp
ZHRoKHNwYWNlKSArIHJ1bi5wYWRkaW5nKCk7CisgICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0cmlu
ZywgZm9udCgpKTsKKyAgICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlvdXQsIHJ1
bik7CisgICAgcmV0dXJuIGxpbmUueFRvQ3Vyc29yKHBvc2l0aW9uKTsKK30KIAorRmxvYXRSZWN0
IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNv
bnN0IEZsb2F0UG9pbnQmIHB0LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKICAg
ICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhydW4uY2hh
cmFjdGVycygpLCBydW4ubGVuZ3RoKCkpKTsKICAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdE
YXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOwogCi0gICAgaW50IHcgPSBRRm9udE1ldHJpY3MoZm9u
dCgpKS53aWR0aChzdHJpbmcpOwotICAgIC8vIFdlYktpdCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3
b3JkIHNwYWNpbmcgb24gdGhlIGZpcnN0IGNoYXJhY3RlciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0
IGRvZXMpCi0gICAgaWYgKHRyZWF0QXNTcGFjZShydW5bMF0pKQotICAgICAgICB3IC09IG1fd29y
ZFNwYWNpbmc7CisgICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9udCgpKTsKKyAgICBR
VGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlvdXQsIHJ1bik7CiAKLSAgICByZXR1cm4g
dyArIHJ1bi5wYWRkaW5nKCk7CisgICAgZmxvYXQgeDEgPSBsaW5lLmN1cnNvclRvWChmcm9tKTsK
KyAgICBmbG9hdCB4MiA9IGxpbmUuY3Vyc29yVG9YKHRvKTsKKyAgICBpZiAoeDIgPCB4MSkKKyAg
ICAgICAgcVN3YXAoeDEsIHgyKTsKKworICAgIHJldHVybiBGbG9hdFJlY3QocHQueCgpICsgeDEs
IHB0LnkoKSwgeDIgLSB4MSwgaCk7Cit9CisKK2Jvb2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tG
b250c0ZvckNvbXBsZXhUZXh0KCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1FGb250IEZv
bnQ6OmZvbnQoKSBjb25zdAoreworICAgIFFGb250IGYgPSBwcmltYXJ5Rm9udCgpLT5nZXRRdEZv
bnQoKTsKKyAgICBpZiAobV9sZXR0ZXJTcGFjaW5nICE9IDApCisgICAgICAgIGYuc2V0TGV0dGVy
U3BhY2luZyhRRm9udDo6QWJzb2x1dGVTcGFjaW5nLCBtX2xldHRlclNwYWNpbmcpOworICAgIGlm
IChtX3dvcmRTcGFjaW5nICE9IDApCisgICAgICAgIGYuc2V0V29yZFNwYWNpbmcobV93b3JkU3Bh
Y2luZyk7CisgICAgcmV0dXJuIGY7Cit9CisKKyNpZiBIQVZFKFFHTFlQSFMpCit2b2lkIEZvbnQ6
OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0
YSogZm9udERhdGEsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgaW50IGZyb20sIGlu
dCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIGlmIChj
b250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wg
c2hvdWxkRmlsbCA9IGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVGaWxsOwor
ICAgIGJvb2wgc2hvdWxkU3Ryb2tlID0gY29udGV4dC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0
TW9kZVN0cm9rZTsKKworICAgIC8vIFN0cm9raW5nIHRleHQgc2hvdWxkIGFsd2F5cyB0YWtlIHRo
ZSBjb21wbGV4IHBhdGguCisgICAgQVNTRVJUKCFzaG91bGRTdHJva2UpOworCisgICAgLy8gU2hh
ZG93ZWQgdGV4dCBzaG91bGQgYWx3YXlzIHRha2UgdGhlIGNvbXBsZXggcGF0aC4KKyAgICBBU1NF
UlQoY29udGV4dC0+Y29udGV4dFNoYWRvdygpLT5tX3R5cGUgPT0gQ29udGV4dFNoYWRvdzo6Tm9T
aGFkb3cpOworCisgICAgaWYgKCFzaG91bGRGaWxsICYmICFzaG91bGRTdHJva2UpCisgICAgICAg
IHJldHVybjsKKworICAgIFFWZWN0b3I8cXVpbnQzMj4gZ2x5cGhJbmRleGVzOworICAgIFFWZWN0
b3I8UVBvaW50Rj4gcG9zaXRpb25zOworICAgIGZsb2F0IHggPSAwOworCisgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICBHbHlwaCBnbHlwaCA9IGdseXBo
QnVmZmVyLmdseXBoQXQoZnJvbSArIGkpOworICAgICAgICBmbG9hdCBhZHZhbmNlID0gZ2x5cGhC
dWZmZXIuYWR2YW5jZUF0KGZyb20gKyBpKTsKKyAgICAgICAgaWYgKCFnbHlwaCkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBnbHlwaEluZGV4ZXMuYXBwZW5kKGdseXBoKTsKKyAgICAg
ICAgcG9zaXRpb25zLmFwcGVuZChRUG9pbnRGKHgsIDApKTsKKyAgICAgICAgeCArPSBhZHZhbmNl
OworICAgIH0KKworICAgIFFHbHlwaHMgcXRHbHlwaHM7CisgICAgcXRHbHlwaHMuc2V0R2x5cGhJ
bmRleGVzKGdseXBoSW5kZXhlcyk7CisgICAgcXRHbHlwaHMuc2V0UG9zaXRpb25zKHBvc2l0aW9u
cyk7CisgICAgcXRHbHlwaHMuc2V0Rm9udChmb250RGF0YS0+Z2V0UXRGb250KCkpOworCisgICAg
UVBhaW50ZXIqIHBhaW50ZXIgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIFFQ
ZW4gcHJldmlvdXNQZW4gPSBwYWludGVyLT5wZW4oKTsKKyAgICBwYWludGVyLT5zZXRQZW4oZmls
bFBlbkZvckNvbnRleHQoY29udGV4dCkpOworICAgIHBhaW50ZXItPmRyYXdHbHlwaHMocG9pbnQs
IHF0R2x5cGhzKTsKKyAgICBwYWludGVyLT5zZXRQZW4ocHJldmlvdXNQZW4pOworfQorCisjZWxz
ZSAvLyAhSEFWRShRR0xZUEhTKQorCit2b2lkIEZvbnQ6OmRyYXdTaW1wbGVUZXh0KEdyYXBoaWNz
Q29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAoreworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lP
Tl9DSEVDSyg0LCA3LCAwKQorICAgIGRyYXdUZXh0Q29tbW9uKGN0eCwgcnVuLCBwb2ludCwgZnJv
bSwgdG8sIGZvbnQoKSwgLyogaXNDb21wbGV4VGV4dCA9ICovZmFsc2UpOworI2Vsc2UKKyAgICBR
X0FTU0VSVChmYWxzZSk7CisjZW5kaWYKIH0KIAogaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9u
Rm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0aW9uLCBib29sIGlu
Y2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdApAQCAtMzM1LDE2ICs0MTUsMzMgQEAgaW50IEZvbnQ6
Om9mZnNldEZvclBvc2l0aW9uRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0
IHBvc2l0aW9uLCBib28KICNlbmRpZgogfQogCi1pbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25G
b3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0aW9uLCBib29sKSBj
b25zdAorCitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVu
JiBydW4sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250
RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25z
dAogeworICAgIGlmICghcHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpKQorICAg
ICAgICByZXR1cm4gMDsKKworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3
LCAwKQorICAgIGlmICghcnVuLmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gMDsKKwogICAgIFN0
cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5jaGFyYWN0
ZXJzKCksIHJ1bi5sZW5ndGgoKSkpOwogICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFX
aXRob3V0UmVmKHNhbml0aXplZCk7CiAKLSAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBm
b250KCkpOwotICAgIFFUZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsK
LSAgICByZXR1cm4gbGluZS54VG9DdXJzb3IocG9zaXRpb24pOworICAgIGludCB3ID0gUUZvbnRN
ZXRyaWNzKGZvbnQoKSkud2lkdGgoc3RyaW5nLCAtMSwgUXQ6OlRleHRCeXBhc3NTaGFwaW5nKTsK
KworICAgIC8vIFdlYktpdCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3b3JkIHNwYWNpbmcgb24gdGhl
IGZpcnN0IGNoYXJhY3RlciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0IGRvZXMpCisgICAgaWYgKHRy
ZWF0QXNTcGFjZShydW5bMF0pKQorICAgICAgICB3IC09IG1fd29yZFNwYWNpbmc7CisKKyAgICBy
ZXR1cm4gdyArIHJ1bi5wYWRkaW5nKCk7CisjZWxzZQorICAgIFFfQVNTRVJUKGZhbHNlKTsKKyAg
ICByZXR1cm4gMDsKKyNlbmRpZgogfQogCisKIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0
Rm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHB0LCBp
bnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICNpZiBRVF9WRVJTSU9OID49IFFUX1ZF
UlNJT05fQ0hFQ0soNCwgNywgMCkKQEAgLTM2MiwyMiArNDU5LDYgQEAgRmxvYXRSZWN0IEZvbnQ6
OnNlbGVjdGlvblJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxv
YXRQb2ludCYKICNlbmRpZgogfQogCi1GbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNv
bXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcHQsIGludCBo
LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250
Ojpub3JtYWxpemVTcGFjZXMoU3RyaW5nKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSkp
OwotICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7
Ci0KLSAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBmb250KCkpOwotICAgIFFUZXh0TGlu
ZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsKLQotICAgIGZsb2F0IHgxID0gbGlu
ZS5jdXJzb3JUb1goZnJvbSk7Ci0gICAgZmxvYXQgeDIgPSBsaW5lLmN1cnNvclRvWCh0byk7Ci0g
ICAgaWYgKHgyIDwgeDEpCi0gICAgICAgIHFTd2FwKHgxLCB4Mik7Ci0KLSAgICByZXR1cm4gRmxv
YXRSZWN0KHB0LngoKSArIHgxLCBwdC55KCksIHgyIC0geDEsIGgpOwotfQotCiBib29sIEZvbnQ6
OmNhblJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCgpCiB7CiAgICAgcmV0dXJuIGZh
bHNlOwpAQCAtMzkzLDUgKzQ3NCw3IEBAIFFGb250IEZvbnQ6OmZvbnQoKSBjb25zdAogICAgIHJl
dHVybiBmOwogfQogCisjZW5kaWYgLy8gSEFWRShRR0xZUEhTKQorCiB9CiAKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwCmluZGV4
IDIxMjEyMDYuLjVjNWFlMmEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
cXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9HbHlwaFBhZ2VUcmVlTm9kZVF0LmNwcApAQCAtMjMsOCArMjMsNzEgQEAKICNpbmNsdWRl
ICJjb25maWcuaCIKICNpbmNsdWRlICJHbHlwaFBhZ2VUcmVlTm9kZS5oIgogCisjaWYgSEFWRShR
R0xZUEhTKQorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisjaW5jbHVkZSA8UUZvbnRNZXRy
aWNzRj4KKyNpbmNsdWRlIDxRVGV4dExheW91dD4KKyNlbmRpZgorCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKKyNpZiBIQVZFKFFHTFlQSFMpCisKK3N0YXRpYyB2b2lkIGdldERhdGFGb3JDaGFyYWN0
ZXJBbmRGb250KGNvbnN0IFFDaGFyJiBjaGFyYWN0ZXIsIGNvbnN0IFFGb250JiBmb250LCBHbHlw
aCYgZ2x5cGgsIGZsb2F0JiBhZHZhbmNlLCBRRm9udCYgY29tcHV0ZWRGb250KQoreworICAgIFFT
dHJpbmcgc3RyaW5nID0gY2hhcmFjdGVyOworICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcs
IGZvbnQpOworICAgIGxheW91dC5iZWdpbkxheW91dCgpOworICAgIFFUZXh0TGluZSBsaW5lID0g
bGF5b3V0LmNyZWF0ZUxpbmUoKTsKKyAgICBsYXlvdXQuZW5kTGF5b3V0KCk7CisKKyAgICBRTGlz
dDxRR2x5cGhzPiBnbHlwaExpc3QgPSBsYXlvdXQuZ2x5cGhzKCk7CisgICAgQVNTRVJUKGdseXBo
TGlzdC5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBRR2x5cGhzJiBnbHlwaHMoZ2x5cGhMaXN0
LmF0KDApKTsKKyAgICBRVmVjdG9yPHF1aW50MzI+IGdseXBoSW5kZXhlcyA9IGdseXBocy5nbHlw
aEluZGV4ZXMoKTsKKworICAgIGlmIChnbHlwaEluZGV4ZXMuaXNFbXB0eSgpKSB7CisgICAgICAg
IGdseXBoID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChnbHlwaElu
ZGV4ZXMuc2l6ZSgpID09IDEpOworCisgICAgY29tcHV0ZWRGb250ID0gZ2x5cGhzLmZvbnQoKTsK
KyAgICBnbHlwaCA9IGdseXBoSW5kZXhlcy5hdCgwKTsKKworICAgIFFGb250TWV0cmljc0YgZm0o
Zm9udCk7CisgICAgYWR2YW5jZSA9IGZtLndpZHRoKGNoYXJhY3Rlcik7Cit9CitcCitib29sIEds
eXBoUGFnZTo6ZmlsbCh1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIqIGJ1
ZmZlciwgdW5zaWduZWQgYnVmZmVyTGVuZ3RoLCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERh
dGEpCit7CisgICAgUVN0cmluZyBxc3RyaW5nID0gUVN0cmluZzo6ZnJvbVV0ZjE2KHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdXNob3J0Kj4oYnVmZmVyKSwgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJM
ZW5ndGgpKTsKKyAgICBRRm9udCBmb250ID0gZm9udERhdGEtPmdldFF0Rm9udCgpOworCisgICAg
Ym9vbCBoYXZlR2x5cGhzID0gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgR2x5cGggZ2x5cGg7CisgICAgICAgIGZsb2F0IGFkdmFu
Y2U7CisgICAgICAgIFFGb250IGNvbXB1dGVkRm9udDsKKyAgICAgICAgZ2V0RGF0YUZvckNoYXJh
Y3RlckFuZEZvbnQocXN0cmluZy5hdChpKSwgZm9udCwgZ2x5cGgsIGFkdmFuY2UsIGNvbXB1dGVk
Rm9udCk7CisgICAgICAgIGlmICghZ2x5cGgpCisgICAgICAgICAgICBzZXRHbHlwaERhdGFGb3JJ
bmRleChvZmZzZXQgKyBpLCAwLCAwKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAo
IWhhdmVHbHlwaHMpCisgICAgICAgICAgICAgICAgZm9udERhdGEtPm1fcGxhdGZvcm1EYXRhLm1f
ZGF0YS0+Zm9udCA9IGNvbXB1dGVkRm9udDsKKyAgICAgICAgICAgIGZvbnREYXRhLT5tX2dseXBo
VG9XaWR0aE1hcC5zZXRNZXRyaWNzRm9yR2x5cGgoZ2x5cGgsIGFkdmFuY2UpOworICAgICAgICAg
ICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgZ2x5cGgsIGZvbnREYXRhKTsKKyAg
ICAgICAgICAgIGhhdmVHbHlwaHMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVy
biB0cnVlOworfQorCisjZWxzZQorCiB2b2lkIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVD
dXN0b21Gb250RGF0YShjb25zdCBGb250RGF0YSopCiB7CiB9CkBAIC0zMiw1ICs5NSw2IEBAIHZv
aWQgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUN1c3RvbUZvbnREYXRhKGNvbnN0IEZvbnRE
YXRhKikKIHZvaWQgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUZvbnREYXRhKGNvbnN0IFdl
YkNvcmU6OlNpbXBsZUZvbnREYXRhKikKIHsKIH0KKyNlbmRpZiAvLyBIQVZFKFFHTFlQSFMpCiAK
IH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU2ltcGxlRm9udERh
dGFRdC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L1NpbXBsZUZvbnREYXRhUXQu
Y3BwCmluZGV4IDQ3ZGRmMDIuLmIyNTNhNTIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcXQvU2ltcGxlRm9udERhdGFRdC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcApAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1
ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCiAKKyNpZiBIQVZFKFFH
TFlQSFMpCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNlbmRpZgogI2luY2x1ZGUgPFFG
b250TWV0cmljcz4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMzMsMTEgKzM2LDYwIEBAIHZv
aWQgU2ltcGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkKICAgICBtX3RyZWF0QXNGaXhlZFBp
dGNoID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpLmZpeGVkUGl0Y2goKTsKIH0KIAorI2lmIEhBVkUo
UUdMWVBIUykKK2Jvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hhcmFjdGVycyhjb25zdCBV
Q2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCkgY29uc3QKK3sKKyAgICBRRm9udE1ldHJpY3NG
IGZtKG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxl
bmd0aDsgKytpKSB7CisgICAgICAgIGlmICghZm0uaW5Gb250KHN0YXRpY19jYXN0PFFDaGFyPihj
aGFyYWN0ZXJzW2ldKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9y
R2x5cGgoR2x5cGgpIGNvbnN0Cit7CisgICAgLy8gVGhlIGdseXBoLXRvLXdpZHRoIG1hcCBpcyBw
b3B1bGF0ZWQgYnkgR2x5cGhQYWdlOjpmaWxsKCkKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICByZXR1cm4gMDsKK30KKworU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFs
bENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29u
c3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBzRm9udERhdGEpIHsKKyAgICAgICAgRm9udERlc2Ny
aXB0aW9uIGRlc2MgPSBGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAg
ZGVzYy5zZXRTcGVjaWZpZWRTaXplKDAuNzBmICogZm9udERlc2NyaXB0aW9uLmNvbXB1dGVkU2l6
ZSgpKTsKKyAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBwbGF0Zm9ybURhdGEoZGVzYywgZGVzYy5m
YW1pbHkoKS5mYW1pbHkoKSk7CisgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2lt
cGxlRm9udERhdGEocGxhdGZvcm1EYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIG1fc21hbGxDYXBz
Rm9udERhdGE7Cit9CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNG
b3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAg
IHJldHVybiBGbG9hdFJlY3QoKTsKK30KKyNlbHNlCiBib29sIFNpbXBsZUZvbnREYXRhOjpjb250
YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCBpbnQpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHRy
dWU7CiB9CiAKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtR2x5cGhJbml0KCkKK3sKKyAg
ICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fc3Bh
Y2VHbHlwaCA9IDA7CisgICAgbV9hZGp1c3RlZFNwYWNlV2lkdGggPSBtX3NwYWNlV2lkdGg7Cisg
ICAgZGV0ZXJtaW5lUGl0Y2goKTsKKyAgICBtX21pc3NpbmdHbHlwaERhdGEuZm9udERhdGEgPSB0
aGlzOworICAgIG1fbWlzc2luZ0dseXBoRGF0YS5nbHlwaCA9IDA7Cit9CisjZW5kaWYKKwogdm9p
ZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKIHsKICAgICBpZiAoIW1fcGxhdGZvcm1E
YXRhLnNpemUoKSkgewpAQCAtNTIsNyArMTA0LDcgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6cGxh
dGZvcm1Jbml0KCkKICAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBRRm9udE1ldHJpY3Mg
Zm0obV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICBRRm9udE1ldHJpY3NGIGZtKG1fcGxhdGZv
cm1EYXRhLmZvbnQoKSk7CiAKICAgICBtX2FzY2VudCA9IGZtLmFzY2VudCgpOwogICAgIG1fZGVz
Y2VudCA9IGZtLmRlc2NlbnQoKTsKQEAgLTYyLDIyICsxMTQsMTEgQEAgdm9pZCBTaW1wbGVGb250
RGF0YTo6cGxhdGZvcm1Jbml0KCkKICAgICBtX2xpbmVHYXAgPSBmbS5sZWFkaW5nKCk7CiB9CiAK
LXZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtR2x5cGhJbml0KCkKLXsKLSAgICBpZiAoIW1f
cGxhdGZvcm1EYXRhLnNpemUoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fc3BhY2VHbHlwaCA9
IDA7Ci0gICAgbV9hZGp1c3RlZFNwYWNlV2lkdGggPSBtX3NwYWNlV2lkdGg7Ci0gICAgZGV0ZXJt
aW5lUGl0Y2goKTsKLSAgICBtX21pc3NpbmdHbHlwaERhdGEuZm9udERhdGEgPSB0aGlzOwotICAg
IG1fbWlzc2luZ0dseXBoRGF0YS5nbHlwaCA9IDA7Ci19Ci0KIHZvaWQgU2ltcGxlRm9udERhdGE6
OnBsYXRmb3JtQ2hhcldpZHRoSW5pdCgpCiB7CiAgICAgaWYgKCFtX3BsYXRmb3JtRGF0YS5zaXpl
KCkpCiAgICAgICAgIHJldHVybjsKLSAgICBRRm9udE1ldHJpY3MgZm0obV9wbGF0Zm9ybURhdGEu
Zm9udCgpKTsKKyAgICBRRm9udE1ldHJpY3NGIGZtKG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CiAg
ICAgbV9hdmdDaGFyV2lkdGggPSBmbS5hdmVyYWdlQ2hhcldpZHRoKCk7CiAgICAgbV9tYXhDaGFy
V2lkdGggPSBmbS5tYXhXaWR0aCgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78118</attachid>
            <date>2011-01-06 07:31:32 -0800</date>
            <delta_ts>2011-03-18 14:24:38 -0700</delta_ts>
            <desc>Patch (work in progress)</desc>
            <filename>bug-51106-wip2.diff</filename>
            <type>text/plain</type>
            <size>23251</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dlYkNvcmUucHJvCmlu
ZGV4IDY2ZTk0ZTQuLmQ4MGY1MmIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5wcm8KKysr
IGIvV2ViQ29yZS9XZWJDb3JlLnBybwpAQCAtMzQxOCw2ICszNDE4LDIwIEBAIGNvbnRhaW5zKERF
RklORVMsIEVOQUJMRV9RVF9CRUFSRVI9MSkgewogICAgIH0KIH0KIAorIWxlc3NUaGFuKFFUX01B
Sk9SX1ZFUlNJT04sNCk6IWxlc3NUaGFuKFFUX01JTk9SX1ZFUlNJT04sIDgpOkhBVkVfUUdMWVBI
Uz0xCisKKyFpc0VtcHR5KEhBVkVfUUdMWVBIUykgeworICAgIERFRklORVMgKz0gSEFWRV9RR0xZ
UEhTPTEKKworICAgIFNPVVJDRVMgKz0gXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9Gb250
RmFzdFBhdGguY3BwIFwKKyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5v
ZGUuY3BwIFwKKyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5jcHAKKwor
ICAgIEhFQURFUlMgKz0gXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJhdG9y
LmgKK30KKwogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX0dFT0xPQ0FUSU9OPTEpIHsKICAgICBE
RUZJTkVTICs9IFdURl9VU0VfUFJFRU1QVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OCiAgICAgSEVB
REVSUyArPSBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcAppbmRleCA4ODdlMjFkLi4xNmVh
YzM1IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKQEAgLTI3LDYgKzI3LDEwIEBACiAj
aW5jbHVkZSAiRmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAi
Rm9udFRyYW5zY29kZXIuaCIKKyNpZiBQTEFURk9STShRVCkgJiYgSEFWRShRR0xZUEhTKQorI2lu
Y2x1ZGUgIkNvbnRleHRTaGFkb3cuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNl
bmRpZgogI2luY2x1ZGUgIkludFBvaW50LmgiCiAjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKICNp
bmNsdWRlICJXaWR0aEl0ZXJhdG9yLmgiCkBAIC0xNDksNyArMTUzLDE0IEBAIHZvaWQgRm9udDo6
ZHJhd1RleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNv
bnN0IEZsb2F0UG9pCiAgICAgfQogI2VuZGlmCiAKLSAgICBpZiAoY29kZVBhdGgocnVuKSAhPSBD
b21wbGV4KQorICAgIENvZGVQYXRoIGNvZGVQYXRoVG9Vc2UgPSBjb2RlUGF0aChydW4pOzsKKwor
I2lmIFBMQVRGT1JNKFFUKSAmJiBIQVZFKFFHTFlQSFMpCisgICAgaWYgKGNvbnRleHQtPnRleHRE
cmF3aW5nTW9kZSgpICYgVGV4dE1vZGVTdHJva2UgfHwgY29udGV4dC0+Y29udGV4dFNoYWRvdygp
LT5tX3R5cGUgIT0gQ29udGV4dFNoYWRvdzo6Tm9TaGFkb3cpCisgICAgICAgIGNvZGVQYXRoVG9V
c2UgPSBDb21wbGV4OworI2VuZGlmCisKKyAgICBpZiAoY29kZVBhdGhUb1VzZSAhPSBDb21wbGV4
KQogICAgICAgICByZXR1cm4gZHJhd1NpbXBsZVRleHQoY29udGV4dCwgcnVuLCBwb2ludCwgZnJv
bSwgdG8pOwogCiAgICAgcmV0dXJuIGRyYXdDb21wbGV4VGV4dChjb250ZXh0LCBydW4sIHBvaW50
LCBmcm9tLCB0byk7CkBAIC0yOTEsNyArMzAyLDcgQEAgRm9udDo6Q29kZVBhdGggRm9udDo6Y29k
ZVBhdGgoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAogICAgIGlmIChzX2NvZGVQYXRoICE9IEF1
dG8pCiAgICAgICAgIHJldHVybiBzX2NvZGVQYXRoOwogCi0jaWYgUExBVEZPUk0oUVQpCisjaWYg
UExBVEZPUk0oUVQpICYmICFIQVZFKFFHTFlQSFMpCiAgICAgaWYgKHJ1bi5wYWRkaW5nKCkgfHwg
cnVuLnJ0bCgpIHx8IGlzU21hbGxDYXBzKCkgfHwgd29yZFNwYWNpbmcoKSB8fCBsZXR0ZXJTcGFj
aW5nKCkpCiAgICAgICAgIHJldHVybiBDb21wbGV4OwogI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKaW5kZXggNDM0ZDM1Yi4uMjQ1ZTEwMCAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3Bw
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcApAQCAt
MzU5LDcgKzM1OSw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3SW1hZ2UoSW1hZ2UqIGlt
YWdlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgY29uc3QKICAgICBkcmF3SW1hZ2UoaW1h
Z2UsIHN0eWxlQ29sb3JTcGFjZSwgRmxvYXRSZWN0KGRlc3QpLCBzcmNSZWN0LCBvcCwgdXNlTG93
UXVhbGl0eVNjYWxlKTsKIH0KIAotI2lmICFPUyhXSU5DRSkgfHwgUExBVEZPUk0oUVQpCisjaWYg
IU9TKFdJTkNFKSB8fCAoUExBVEZPUk0oUVQpICYmICFIQVZFKFFHTFlQSFMpKQogdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmRyYXdUZXh0KGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1
biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKQogewogICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L1NpbXBsZUZvbnREYXRhLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9u
dERhdGEuY3BwCmluZGV4IGU3NzM4ODAuLjhhYzJkZmQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3BwCkBAIC0xMTAsNyArMTEwLDcgQEAgU2ltcGxlRm9u
dERhdGE6OlNpbXBsZUZvbnREYXRhKFBhc3NPd25QdHI8U1ZHRm9udERhdGE+IHN2Z0ZvbnREYXRh
LCBpbnQgc2l6ZSwgYm8KIH0KICNlbmRpZgogCi0jaWYgIVBMQVRGT1JNKFFUKQorI2lmICEoUExB
VEZPUk0oUVQpICYmICFIQVZFKFFHTFlQSFMpKQogLy8gRXN0aW1hdGVzIG9mIGF2Z0NoYXJXaWR0
aCBhbmQgbWF4Q2hhcldpZHRoIGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IGFjY2Vz
c2luZyB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgZm9udC4KIHZvaWQgU2ltcGxlRm9udERhdGE6Omlu
aXRDaGFyV2lkdGhzKCkKIHsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
U2ltcGxlRm9udERhdGEuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERh
dGEuaAppbmRleCA5MDcxM2FmLi5mNzNjZjk1IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9TaW1wbGVGb250RGF0YS5oCkBAIC0xOTIsNiArMTkyLDExIEBAIHB1YmxpYzoKICAgICBGb250
T3JpZW50YXRpb24gb3JpZW50YXRpb24oKSBjb25zdCB7IHJldHVybiBtX29yaWVudGF0aW9uOyB9
CiAKIHByaXZhdGU6CisjaWYgUExBVEZPUk0oUVQpICYmIEhBVkUoUUdMWVBIUykKKyAgICAvLyBH
bHlwaFBhZ2U6OmZpbGwoKSBmaWxscyBpbiBtX2dseXBoVG9XaWR0aE1hcCBvbiBRdC4KKyAgICBm
cmllbmQgY2xhc3MgR2x5cGhQYWdlOworI2VuZGlmCisKICAgICB2b2lkIHBsYXRmb3JtSW5pdCgp
OwogICAgIHZvaWQgcGxhdGZvcm1HbHlwaEluaXQoKTsKICAgICB2b2lkIHBsYXRmb3JtQ2hhcldp
ZHRoSW5pdCgpOwpAQCAtMjk3LDkgKzMwMiw4IEBAIHByaXZhdGU6CiAjZW5kaWYKICNlbmRpZgog
fTsKLSAgICAKLSAgICAKLSNpZiAhUExBVEZPUk0oUVQpCisKKyNpZiAhKFBMQVRGT1JNKFFUKSAm
JiAhSEFWRShRR0xZUEhTKSkKIEFMV0FZU19JTkxJTkUgRmxvYXRSZWN0IFNpbXBsZUZvbnREYXRh
Ojpib3VuZHNGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBpZiAoaXNaZXJvV2lk
dGhTcGFjZUdseXBoKGdseXBoKSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvRm9udFBsYXRmb3JtRGF0YS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9G
b250UGxhdGZvcm1EYXRhLmgKaW5kZXggMWM1N2UyOS4uZmRmNWVjYSAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhLmgKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhLmgKQEAgLTE2Nyw2ICsxNjcs
OSBAQCBwdWJsaWM6CiAgICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgY29uc3Q7CiAjZW5kaWYKIHBy
aXZhdGU6CisjaWYgSEFWRShRR0xZUEhTKQorICAgIGZyaWVuZCBjbGFzcyBHbHlwaFBhZ2U7Cisj
ZW5kaWYKICAgICBGb250UGxhdGZvcm1EYXRhUHJpdmF0ZSogbV9kYXRhOwogfTsKIApkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwCmluZGV4IGYxY2VkMmIuLjIwMzlkNDEgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAKQEAgLTI3LDYgKzI3LDkgQEAK
ICNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKICNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0
LmgiCiAjaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCisjaWYgSEFWRShRR0xZUEhTKQorI2luY2x1
ZGUgIkdseXBoQnVmZmVyLmgiCisjZW5kaWYKICNpbmNsdWRlICJHcmFkaWVudC5oIgogI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCkBAIC03
Miw2ICs3NSwzOSBAQCBzdGF0aWMgUVRleHRMaW5lIHNldHVwTGF5b3V0KFFUZXh0TGF5b3V0KiBs
YXlvdXQsIGNvbnN0IFRleHRSdW4mIHN0eWxlKQogICAgIHJldHVybiBsaW5lOwogfQogCitzdGF0
aWMgUVBlbiBmaWxsUGVuRm9yQ29udGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCkKK3sKKyAgICBp
ZiAoY3R4LT5maWxsR3JhZGllbnQoKSkgeworICAgICAgICBRQnJ1c2ggYnJ1c2goKmN0eC0+Zmls
bEdyYWRpZW50KCktPnBsYXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGJydXNoLnNldFRyYW5z
Zm9ybShjdHgtPmZpbGxHcmFkaWVudCgpLT5ncmFkaWVudFNwYWNlVHJhbnNmb3JtKCkpOworICAg
ICAgICByZXR1cm4gUVBlbihicnVzaCwgMCk7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZmlsbFBh
dHRlcm4oKSkgeworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOworICAgICAgICByZXR1
cm4gUVBlbihRQnJ1c2goY3R4LT5maWxsUGF0dGVybigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4o
YWZmaW5lKSksIDApOworICAgIH0KKworICAgIHJldHVybiBRUGVuKFFDb2xvcihjdHgtPmZpbGxD
b2xvcigpKSk7Cit9CisKK3N0YXRpYyBRUGVuIHN0cm9rZVBlbkZvckNvbnRleHQoR3JhcGhpY3ND
b250ZXh0KiBjdHgpCit7CisgICAgaWYgKGN0eC0+c3Ryb2tlR3JhZGllbnQoKSkgeworICAgICAg
ICBRQnJ1c2ggYnJ1c2goKmN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+cGxhdGZvcm1HcmFkaWVudCgp
KTsKKyAgICAgICAgYnJ1c2guc2V0VHJhbnNmb3JtKGN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+Z3Jh
ZGllbnRTcGFjZVRyYW5zZm9ybSgpKTsKKyAgICAgICAgcmV0dXJuIFFQZW4oYnJ1c2gsIGN0eC0+
c3Ryb2tlVGhpY2tuZXNzKCkpOworICAgIH0KKworICAgIGlmIChjdHgtPnN0cm9rZVBhdHRlcm4o
KSkgeworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOworICAgICAgICBRQnJ1c2ggYnJ1
c2goY3R4LT5zdHJva2VQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUpKTsK
KyAgICAgICAgcmV0dXJuIFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOworICAg
IH0KKworICAgIHJldHVybiBRUGVuKFFDb2xvcihjdHgtPnN0cm9rZUNvbG9yKCkpLCBjdHgtPnN0
cm9rZVRoaWNrbmVzcygpKTsKK30KKwogc3RhdGljIHZvaWQgZHJhd1RleHRDb21tb24oR3JhcGhp
Y3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9p
bnQsIGludCBmcm9tLCBpbnQgdG8sIGNvbnN0IFFGb250JiBmb250LCBib29sIGlzQ29tcGxleFRl
eHQpCiB7CiAgICAgaWYgKHRvIDwgMCkKQEAgLTgwLDMxICsxMTYsMTIgQEAgc3RhdGljIHZvaWQg
ZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwg
Y29uc3QgRmxvYXQKICAgICBRUGFpbnRlciAqcCA9IGN0eC0+cGxhdGZvcm1Db250ZXh0KCk7CiAK
ICAgICBRUGVuIHRleHRGaWxsUGVuOwotICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9kZSgpICYg
VGV4dE1vZGVGaWxsKSB7Ci0gICAgICAgIGlmIChjdHgtPmZpbGxHcmFkaWVudCgpKSB7Ci0gICAg
ICAgICAgICBRQnJ1c2ggYnJ1c2goKmN0eC0+ZmlsbEdyYWRpZW50KCktPnBsYXRmb3JtR3JhZGll
bnQoKSk7Ci0gICAgICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5maWxsR3JhZGllbnQo
KS0+Z3JhZGllbnRTcGFjZVRyYW5zZm9ybSgpKTsKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0g
UVBlbihicnVzaCwgMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3R4LT5maWxsUGF0dGVybigpKSB7
Ci0gICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOwotICAgICAgICAgICAgdGV4dEZp
bGxQZW4gPSBRUGVuKFFCcnVzaChjdHgtPmZpbGxQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0
dGVybihhZmZpbmUpKSwgMCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgdGV4dEZpbGxQ
ZW4gPSBRUGVuKFFDb2xvcihjdHgtPmZpbGxDb2xvcigpKSk7Ci0gICAgfQorICAgIGlmIChjdHgt
PnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVGaWxsKQorICAgICAgICB0ZXh0RmlsbFBlbiA9
IGZpbGxQZW5Gb3JDb250ZXh0KGN0eCk7CiAKICAgICBRUGVuIHRleHRTdHJva2VQZW47Ci0gICAg
aWYgKGN0eC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZVN0cm9rZSkgewotICAgICAgICBp
ZiAoY3R4LT5zdHJva2VHcmFkaWVudCgpKSB7Ci0gICAgICAgICAgICBRQnJ1c2ggYnJ1c2goKmN0
eC0+c3Ryb2tlR3JhZGllbnQoKS0+cGxhdGZvcm1HcmFkaWVudCgpKTsKLSAgICAgICAgICAgIGJy
dXNoLnNldFRyYW5zZm9ybShjdHgtPnN0cm9rZUdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFu
c2Zvcm0oKSk7Ci0gICAgICAgICAgICB0ZXh0U3Ryb2tlUGVuID0gUVBlbihicnVzaCwgY3R4LT5z
dHJva2VUaGlja25lc3MoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3R4LT5zdHJva2VQYXR0ZXJu
KCkpIHsKLSAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSBhZmZpbmU7Ci0gICAgICAgICAgICBR
QnJ1c2ggYnJ1c2goY3R4LT5zdHJva2VQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihh
ZmZpbmUpKTsKLSAgICAgICAgICAgIHRleHRTdHJva2VQZW4gPSBRUGVuKGJydXNoLCBjdHgtPnN0
cm9rZVRoaWNrbmVzcygpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0ZXh0U3Ryb2tl
UGVuID0gUVBlbihRQ29sb3IoY3R4LT5zdHJva2VDb2xvcigpKSwgY3R4LT5zdHJva2VUaGlja25l
c3MoKSk7Ci0gICAgfQorICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVT
dHJva2UpCisgICAgICAgIHRleHRTdHJva2VQZW4gPSBzdHJva2VQZW5Gb3JDb250ZXh0KGN0eCk7
CiAKICAgICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhy
dW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpKTsKICAgICBRU3RyaW5nIHN0cmluZyA9IGZy
b21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOwpAQCAtMjQ3LDQxICsyNjQsNzIgQEAgc3Rh
dGljIHZvaWQgZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRS
dW4mIHJ1biwgY29uc3QgRmxvYXQKICAgICB9CiB9CiAKLXZvaWQgRm9udDo6ZHJhd1NpbXBsZVRl
eHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit2b2lkIEZvbnQ6OmRyYXdDb21w
bGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBG
bG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKLSNpZiBRVF9WRVJT
SU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNywgMCkKLSAgICBkcmF3VGV4dENvbW1vbihjdHgs
IHJ1biwgcG9pbnQsIGZyb20sIHRvLCBmb250KCksIC8qIGlzQ29tcGxleFRleHQgPSAqL2ZhbHNl
KTsKLSNlbHNlCi0gICAgUV9BU1NFUlQoZmFsc2UpOwotI2VuZGlmCisgICAgZHJhd1RleHRDb21t
b24oY3R4LCBydW4sIHBvaW50LCBmcm9tLCB0bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0g
Ki90cnVlKTsKIH0KIAotdm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0
KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBm
cm9tLCBpbnQgdG8pIGNvbnN0CitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQo
Y29uc3QgVGV4dFJ1biYgcnVuLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qLCBHbHlw
aE92ZXJmbG93KikgY29uc3QKIHsKLSAgICBkcmF3VGV4dENvbW1vbihjdHgsIHJ1biwgcG9pbnQs
IGZyb20sIHRvLCBmb250KCksIC8qIGlzQ29tcGxleFRleHQgPSAqL3RydWUpOworICAgIGlmICgh
cHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIGlmICghcnVuLmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChy
dW4ubGVuZ3RoKCkgPT0gMSAmJiB0cmVhdEFzU3BhY2UocnVuWzBdKSkKKyAgICAgICAgcmV0dXJu
IFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHNwYWNlKSArIHJ1bi5wYWRkaW5nKCk7CisKKyAg
ICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhydW4uY2hh
cmFjdGVycygpLCBydW4ubGVuZ3RoKCkpKTsKKyAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdE
YXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOworCisgICAgaW50IHcgPSBRRm9udE1ldHJpY3MoZm9u
dCgpKS53aWR0aChzdHJpbmcpOworICAgIC8vIFdlYktpdCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3
b3JkIHNwYWNpbmcgb24gdGhlIGZpcnN0IGNoYXJhY3RlciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0
IGRvZXMpCisgICAgaWYgKHRyZWF0QXNTcGFjZShydW5bMF0pKQorICAgICAgICB3IC09IG1fd29y
ZFNwYWNpbmc7CisKKyAgICByZXR1cm4gdyArIHJ1bi5wYWRkaW5nKCk7CiB9CiAKLWludCBGb250
OjplbXBoYXNpc01hcmtBc2NlbnQoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3QKK2ludCBGb250
OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxv
YXQgcG9zaXRpb24sIGJvb2wpIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICBy
ZXR1cm4gMDsKKyAgICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0
cmluZyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpKTsKKyAgICBRU3RyaW5nIHN0cmlu
ZyA9IGZyb21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOworCisgICAgUVRleHRMYXlvdXQg
bGF5b3V0KHN0cmluZywgZm9udCgpKTsKKyAgICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0
KCZsYXlvdXQsIHJ1bik7CisgICAgcmV0dXJuIGxpbmUueFRvQ3Vyc29yKHBvc2l0aW9uKTsKIH0K
IAotaW50IEZvbnQ6OmVtcGhhc2lzTWFya0Rlc2NlbnQoY29uc3QgQXRvbWljU3RyaW5nJikgY29u
c3QKK0Zsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4
dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwdCwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8p
IGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBTdHJp
bmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhydW4uY2hhcmFjdGVy
cygpLCBydW4ubGVuZ3RoKCkpKTsKKyAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdEYXRhV2l0
aG91dFJlZihzYW5pdGl6ZWQpOworCisgICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9u
dCgpKTsKKyAgICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlvdXQsIHJ1bik7CisK
KyAgICBmbG9hdCB4MSA9IGxpbmUuY3Vyc29yVG9YKGZyb20pOworICAgIGZsb2F0IHgyID0gbGlu
ZS5jdXJzb3JUb1godG8pOworICAgIGlmICh4MiA8IHgxKQorICAgICAgICBxU3dhcCh4MSwgeDIp
OworCisgICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4MSwgcHQueSgpLCB4MiAtIHgxLCBo
KTsKIH0KIAotaW50IEZvbnQ6OmVtcGhhc2lzTWFya0hlaWdodChjb25zdCBBdG9taWNTdHJpbmcm
KSBjb25zdAorYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcGxleFRleHQo
KQogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGZh
bHNlOwogfQogCi12b2lkIEZvbnQ6OmRyYXdFbXBoYXNpc01hcmtzRm9yU2ltcGxlVGV4dChHcmFw
aGljc0NvbnRleHQqIC8qIGNvbnRleHQgKi8sIGNvbnN0IFRleHRSdW4mIC8qIHJ1biAqLywgY29u
c3QgQXRvbWljU3RyaW5nJiAvKiBtYXJrICovLCBjb25zdCBGbG9hdFBvaW50JiAvKiBwb2ludCAq
LywgaW50IC8qIGZyb20gKi8sIGludCAvKiB0byAqLykgY29uc3QKK1FGb250IEZvbnQ6OmZvbnQo
KSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgUUZvbnQgZiA9IHByaW1hcnlG
b250KCktPmdldFF0Rm9udCgpOworICAgIGlmIChtX2xldHRlclNwYWNpbmcgIT0gMCkKKyAgICAg
ICAgZi5zZXRMZXR0ZXJTcGFjaW5nKFFGb250OjpBYnNvbHV0ZVNwYWNpbmcsIG1fbGV0dGVyU3Bh
Y2luZyk7CisgICAgaWYgKG1fd29yZFNwYWNpbmcgIT0gMCkKKyAgICAgICAgZi5zZXRXb3JkU3Bh
Y2luZyhtX3dvcmRTcGFjaW5nKTsKKyAgICByZXR1cm4gZjsKIH0KIAogdm9pZCBGb250OjpkcmF3
RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogLyogY29udGV4dCAq
LywgY29uc3QgVGV4dFJ1biYgLyogcnVuICovLCBjb25zdCBBdG9taWNTdHJpbmcmIC8qIG1hcmsg
Ki8sIGNvbnN0IEZsb2F0UG9pbnQmIC8qIHBvaW50ICovLCBpbnQgLyogZnJvbSAqLywgaW50IC8q
IHRvICovKSBjb25zdApAQCAtMjg5LDUxICszMzcsNjAgQEAgdm9pZCBGb250OjpkcmF3RW1waGFz
aXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogLyogY29udGV4dCAqLywgY29u
c3QKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi1mbG9hdCBGb250OjpmbG9hdFdpZHRoRm9y
U2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwg
SGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJm
bG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAorI2lmIEhBVkUoUUdMWVBIUykKK3ZvaWQgRm9udDo6
ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBmb250RGF0YSwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBpbnQgZnJvbSwgaW50
IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0CiB7Ci0gICAgaWYgKCFw
cmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5zaXplKCkpCi0gICAgICAgIHJldHVybiAwOwor
ICAgIGlmIChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKIAot
I2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAwKQotICAgIGlmICghcnVu
Lmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBib29sIHNob3VsZEZpbGwgPSBjb250
ZXh0LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlRmlsbDsKKyAgICBib29sIHNob3VsZFN0
cm9rZSA9IGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVTdHJva2U7CiAKLSAg
ICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKFN0cmluZyhydW4uY2hh
cmFjdGVycygpLCBydW4ubGVuZ3RoKCkpKTsKLSAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdE
YXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOworICAgIC8vIFN0cm9raW5nIHRleHQgc2hvdWxkIGFs
d2F5cyB0YWtlIHRoZSBjb21wbGV4IHBhdGguCisgICAgQVNTRVJUKCFzaG91bGRTdHJva2UpOwog
Ci0gICAgaW50IHcgPSBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0aChzdHJpbmcsIC0xLCBRdDo6
VGV4dEJ5cGFzc1NoYXBpbmcpOworICAgIC8vIFNoYWRvd2VkIHRleHQgc2hvdWxkIGFsd2F5cyB0
YWtlIHRoZSBjb21wbGV4IHBhdGguCisgICAgQVNTRVJUKGNvbnRleHQtPmNvbnRleHRTaGFkb3co
KS0+bV90eXBlID09IENvbnRleHRTaGFkb3c6Ok5vU2hhZG93KTsKIAotICAgIC8vIFdlYktpdCBl
eHBlY3RzIHVzIHRvIGlnbm9yZSB3b3JkIHNwYWNpbmcgb24gdGhlIGZpcnN0IGNoYXJhY3RlciAo
YXMgb3Bwb3NlZCB0byB3aGF0IFF0IGRvZXMpCi0gICAgaWYgKHRyZWF0QXNTcGFjZShydW5bMF0p
KQotICAgICAgICB3IC09IG1fd29yZFNwYWNpbmc7CisgICAgaWYgKCFzaG91bGRGaWxsICYmICFz
aG91bGRTdHJva2UpCisgICAgICAgIHJldHVybjsKIAotICAgIHJldHVybiB3ICsgcnVuLnBhZGRp
bmcoKTsKLSNlbHNlCi0gICAgUV9BU1NFUlQoZmFsc2UpOwotICAgIHJldHVybiAwOwotI2VuZGlm
Ci19CisgICAgUVZlY3RvcjxxdWludDMyPiBnbHlwaEluZGV4ZXM7CisgICAgUVZlY3RvcjxRUG9p
bnRGPiBwb3NpdGlvbnM7CisgICAgZmxvYXQgeCA9IDA7CiAKLWZsb2F0IEZvbnQ6OmZsb2F0V2lk
dGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxl
Rm9udERhdGEqPiosIEdseXBoT3ZlcmZsb3cqKSBjb25zdAotewotICAgIGlmICghcHJpbWFyeUZv
bnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBmb3Ig
KGludCBpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CisgICAgICAgIEdseXBoIGdseXBoID0g
Z2x5cGhCdWZmZXIuZ2x5cGhBdChmcm9tICsgaSk7CisgICAgICAgIGZsb2F0IGFkdmFuY2UgPSBn
bHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpOworICAgICAgICBpZiAoIWdseXBoKQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIGdseXBoSW5kZXhlcy5hcHBlbmQoZ2x5cGgpOwor
ICAgICAgICBwb3NpdGlvbnMuYXBwZW5kKFFQb2ludEYoeCwgMCkpOworICAgICAgICB4ICs9IGFk
dmFuY2U7CisgICAgfQogCi0gICAgaWYgKCFydW4ubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiAw
OworICAgIFFHbHlwaHMgcXRHbHlwaHM7CisgICAgcXRHbHlwaHMuc2V0R2x5cGhJbmRleGVzKGds
eXBoSW5kZXhlcyk7CisgICAgcXRHbHlwaHMuc2V0UG9zaXRpb25zKHBvc2l0aW9ucyk7CisgICAg
cXRHbHlwaHMuc2V0Rm9udChmb250RGF0YS0+Z2V0UXRGb250KCkpOwogCi0gICAgaWYgKHJ1bi5s
ZW5ndGgoKSA9PSAxICYmIHRyZWF0QXNTcGFjZShydW5bMF0pKQotICAgICAgICByZXR1cm4gUUZv
bnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3BhY2UpICsgcnVuLnBhZGRpbmcoKTsKKyAgICBRUGFp
bnRlciogcGFpbnRlciA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwogCi0gICAgU3RyaW5n
IHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhTdHJpbmcocnVuLmNoYXJhY3RlcnMo
KSwgcnVuLmxlbmd0aCgpKSk7Ci0gICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhv
dXRSZWYoc2FuaXRpemVkKTsKKyAgICBRUGVuIHByZXZpb3VzUGVuID0gcGFpbnRlci0+cGVuKCk7
CisgICAgcGFpbnRlci0+c2V0UGVuKGZpbGxQZW5Gb3JDb250ZXh0KGNvbnRleHQpKTsKKyAgICBw
YWludGVyLT5kcmF3R2x5cGhzKHBvaW50LCBxdEdseXBocyk7CisgICAgcGFpbnRlci0+c2V0UGVu
KHByZXZpb3VzUGVuKTsKK30KIAotICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lk
dGgoc3RyaW5nKTsKLSAgICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFj
aW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQot
ICAgIGlmICh0cmVhdEFzU3BhY2UocnVuWzBdKSkKLSAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5n
OworI2Vsc2UgLy8gIUhBVkUoUUdMWVBIUykKIAotICAgIHJldHVybiB3ICsgcnVuLnBhZGRpbmco
KTsKK3ZvaWQgRm9udDo6ZHJhd1NpbXBsZVRleHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0
IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8p
IGNvbnN0Cit7CisjaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDcsIDApCisg
ICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4sIHBvaW50LCBmcm9tLCB0bywgZm9udCgpLCAvKiBp
c0NvbXBsZXhUZXh0ID0gKi9mYWxzZSk7CisjZWxzZQorICAgIFFfQVNTRVJUKGZhbHNlKTsKKyNl
bmRpZgogfQogCiBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRpb24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMp
IGNvbnN0CkBAIC0zNjQsMTYgKzQyMSwzMyBAQCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25G
b3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRpb24sIGJvbwogI2Vu
ZGlmCiB9CiAKLWludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRpb24sIGJvb2wpIGNvbnN0CisKK2Zsb2F0IEZvbnQ6
OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgR2x5cGhCdWZmZXIq
IGdseXBoQnVmZmVyLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9u
dHMsIEdseXBoT3ZlcmZsb3cqIGdseXBoT3ZlcmZsb3cpIGNvbnN0CiB7CisgICAgaWYgKCFwcmlt
YXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworCisj
aWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDcsIDApCisgICAgaWYgKCFydW4u
bGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAwOworCiAgICAgU3RyaW5nIHNhbml0aXplZCA9IEZv
bnQ6Om5vcm1hbGl6ZVNwYWNlcyhTdHJpbmcocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgp
KSk7CiAgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVk
KTsKIAotICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7Ci0gICAgUVRleHRM
aW5lIGxpbmUgPSBzZXR1cExheW91dCgmbGF5b3V0LCBydW4pOwotICAgIHJldHVybiBsaW5lLnhU
b0N1cnNvcihwb3NpdGlvbik7CisgICAgaW50IHcgPSBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0
aChzdHJpbmcsIC0xLCBRdDo6VGV4dEJ5cGFzc1NoYXBpbmcpOworCisgICAgLy8gV2ViS2l0IGV4
cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQgc3BhY2luZyBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIChh
cyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9lcykKKyAgICBpZiAodHJlYXRBc1NwYWNlKHJ1blswXSkp
CisgICAgICAgIHcgLT0gbV93b3JkU3BhY2luZzsKKworICAgIHJldHVybiB3ICsgcnVuLnBhZGRp
bmcoKTsKKyNlbHNlCisgICAgUV9BU1NFUlQoZmFsc2UpOworICAgIHJldHVybiAwOworI2VuZGlm
CiB9CiAKKwogRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcHQsIGludCBoLCBpbnQgZnJvbSwgaW50
IHRvKSBjb25zdAogewogI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAw
KQpAQCAtMzkxLDIyICs0NjUsNiBAQCBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvclNp
bXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JgogI2VuZGlmCiB9
CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4
dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwdCwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8p
IGNvbnN0Ci17Ci0gICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhT
dHJpbmcocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKSk7Ci0gICAgUVN0cmluZyBzdHJp
bmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsKLQotICAgIFFUZXh0TGF5b3V0
IGxheW91dChzdHJpbmcsIGZvbnQoKSk7Ci0gICAgUVRleHRMaW5lIGxpbmUgPSBzZXR1cExheW91
dCgmbGF5b3V0LCBydW4pOwotCi0gICAgZmxvYXQgeDEgPSBsaW5lLmN1cnNvclRvWChmcm9tKTsK
LSAgICBmbG9hdCB4MiA9IGxpbmUuY3Vyc29yVG9YKHRvKTsKLSAgICBpZiAoeDIgPCB4MSkKLSAg
ICAgICAgcVN3YXAoeDEsIHgyKTsKLQotICAgIHJldHVybiBGbG9hdFJlY3QocHQueCgpICsgeDEs
IHB0LnkoKSwgeDIgLSB4MSwgaCk7Ci19Ci0KIGJvb2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tG
b250c0ZvckNvbXBsZXhUZXh0KCkKIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC00MjgsNSArNDg2
LDcgQEAgUUZvbnQgRm9udDo6Zm9udCgpIGNvbnN0CiAgICAgcmV0dXJuIGY7CiB9CiAKKyNlbmRp
ZiAvLyBIQVZFKFFHTFlQSFMpCisKIH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9xdC9HbHlwaFBhZ2VUcmVlTm9kZVF0LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAKaW5kZXggMjEyMTIwNi4uNWM1YWUyYSAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HbHlwaFBhZ2VUcmVlTm9k
ZVF0LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVO
b2RlUXQuY3BwCkBAIC0yMyw4ICsyMyw3MSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1
ZGUgIkdseXBoUGFnZVRyZWVOb2RlLmgiCiAKKyNpZiBIQVZFKFFHTFlQSFMpCisjaW5jbHVkZSAi
U2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRlIDxRRm9udE1ldHJpY3NGPgorI2luY2x1ZGUgPFFU
ZXh0TGF5b3V0PgorI2VuZGlmCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lmIEhBVkUoUUdM
WVBIUykKKworc3RhdGljIHZvaWQgZ2V0RGF0YUZvckNoYXJhY3RlckFuZEZvbnQoY29uc3QgUUNo
YXImIGNoYXJhY3RlciwgY29uc3QgUUZvbnQmIGZvbnQsIEdseXBoJiBnbHlwaCwgZmxvYXQmIGFk
dmFuY2UsIFFGb250JiBjb21wdXRlZEZvbnQpCit7CisgICAgUVN0cmluZyBzdHJpbmcgPSBjaGFy
YWN0ZXI7CisgICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9udCk7CisgICAgbGF5b3V0
LmJlZ2luTGF5b3V0KCk7CisgICAgUVRleHRMaW5lIGxpbmUgPSBsYXlvdXQuY3JlYXRlTGluZSgp
OworICAgIGxheW91dC5lbmRMYXlvdXQoKTsKKworICAgIFFMaXN0PFFHbHlwaHM+IGdseXBoTGlz
dCA9IGxheW91dC5nbHlwaHMoKTsKKyAgICBBU1NFUlQoZ2x5cGhMaXN0LnNpemUoKSA9PSAxKTsK
KworICAgIGNvbnN0IFFHbHlwaHMmIGdseXBocyhnbHlwaExpc3QuYXQoMCkpOworICAgIFFWZWN0
b3I8cXVpbnQzMj4gZ2x5cGhJbmRleGVzID0gZ2x5cGhzLmdseXBoSW5kZXhlcygpOworCisgICAg
aWYgKGdseXBoSW5kZXhlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZ2x5cGggPSAwOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgQVNTRVJUKGdseXBoSW5kZXhlcy5zaXplKCkgPT0gMSk7
CisKKyAgICBjb21wdXRlZEZvbnQgPSBnbHlwaHMuZm9udCgpOworICAgIGdseXBoID0gZ2x5cGhJ
bmRleGVzLmF0KDApOworCisgICAgUUZvbnRNZXRyaWNzRiBmbShmb250KTsKKyAgICBhZHZhbmNl
ID0gZm0ud2lkdGgoY2hhcmFjdGVyKTsKK30KK1wKK2Jvb2wgR2x5cGhQYWdlOjpmaWxsKHVuc2ln
bmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoLCBVQ2hhciogYnVmZmVyLCB1bnNpZ25lZCBidWZm
ZXJMZW5ndGgsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSkKK3sKKyAgICBRU3RyaW5n
IHFzdHJpbmcgPSBRU3RyaW5nOjpmcm9tVXRmMTYocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1c2hv
cnQqPihidWZmZXIpLCBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlckxlbmd0aCkpOworICAgIFFGb250
IGZvbnQgPSBmb250RGF0YS0+Z2V0UXRGb250KCk7CisKKyAgICBib29sIGhhdmVHbHlwaHMgPSBm
YWxzZTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAg
ICAgICBHbHlwaCBnbHlwaDsKKyAgICAgICAgZmxvYXQgYWR2YW5jZTsKKyAgICAgICAgUUZvbnQg
Y29tcHV0ZWRGb250OworICAgICAgICBnZXREYXRhRm9yQ2hhcmFjdGVyQW5kRm9udChxc3RyaW5n
LmF0KGkpLCBmb250LCBnbHlwaCwgYWR2YW5jZSwgY29tcHV0ZWRGb250KTsKKyAgICAgICAgaWYg
KCFnbHlwaCkKKyAgICAgICAgICAgIHNldEdseXBoRGF0YUZvckluZGV4KG9mZnNldCArIGksIDAs
IDApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghaGF2ZUdseXBocykKKyAgICAg
ICAgICAgICAgICBmb250RGF0YS0+bV9wbGF0Zm9ybURhdGEubV9kYXRhLT5mb250ID0gY29tcHV0
ZWRGb250OworICAgICAgICAgICAgZm9udERhdGEtPm1fZ2x5cGhUb1dpZHRoTWFwLnNldE1ldHJp
Y3NGb3JHbHlwaChnbHlwaCwgYWR2YW5jZSk7CisgICAgICAgICAgICBzZXRHbHlwaERhdGFGb3JJ
bmRleChvZmZzZXQgKyBpLCBnbHlwaCwgZm9udERhdGEpOworICAgICAgICAgICAgaGF2ZUdseXBo
cyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNlbHNl
CisKIHZvaWQgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUN1c3RvbUZvbnREYXRhKGNvbnN0
IEZvbnREYXRhKikKIHsKIH0KQEAgLTMyLDUgKzk1LDYgQEAgdm9pZCBHbHlwaFBhZ2VUcmVlTm9k
ZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEoY29uc3QgRm9udERhdGEqKQogdm9pZCBHbHlwaFBh
Z2VUcmVlTm9kZTo6cHJ1bmVUcmVlRm9udERhdGEoY29uc3QgV2ViQ29yZTo6U2ltcGxlRm9udERh
dGEqKQogewogfQorI2VuZGlmIC8vIEhBVkUoUUdMWVBIUykKIAogfQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvU2ltcGxlRm9udERhdGFRdC5jcHAKaW5kZXggNDdkZGYwMi4u
NTBjZjFkNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVG
b250RGF0YVF0LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L1NpbXBsZUZv
bnREYXRhUXQuY3BwCkBAIC0yNCw2ICsyNCw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j
bHVkZSAiU2ltcGxlRm9udERhdGEuaCIKIAorI2lmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgorI2VuZGlmCiAjaW5jbHVkZSA8UUZvbnRNZXRyaWNzPgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CkBAIC0zMywxMSArMzYsNzcgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6
ZGV0ZXJtaW5lUGl0Y2goKQogICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSBtX3BsYXRmb3JtRGF0
YS5mb250KCkuZml4ZWRQaXRjaCgpOwogfQogCisjaWYgSEFWRShRR0xZUEhTKQorYm9vbCBTaW1w
bGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBp
bnQgbGVuZ3RoKSBjb25zdAoreworICAgIFFGb250TWV0cmljc0YgZm0obV9wbGF0Zm9ybURhdGEu
Zm9udCgpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAg
ICAgaWYgKCFmbS5pbkZvbnQoc3RhdGljX2Nhc3Q8UUNoYXI+KGNoYXJhY3RlcnNbaV0pKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
ZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlwaCkgY29uc3QK
K3sKKyAgICAvLyBUaGUgZ2x5cGgtdG8td2lkdGggbWFwIGlzIHBvcHVsYXRlZCBieSBHbHlwaFBh
Z2U6OmZpbGwoKQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQor
CitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNjYWxlZEZvbnREYXRhKGNvbnN0IEZv
bnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBmbG9hdCBzY2FsZUZhY3RvcikgY29uc3QK
K3sKKyAgICBGb250RGVzY3JpcHRpb24gZGVzYyA9IEZvbnREZXNjcmlwdGlvbihmb250RGVzY3Jp
cHRpb24pOworICAgIGRlc2Muc2V0U3BlY2lmaWVkU2l6ZShzY2FsZUZhY3RvciAqIGZvbnREZXNj
cmlwdGlvbi5jb21wdXRlZFNpemUoKSk7CisgICAgRm9udFBsYXRmb3JtRGF0YSBwbGF0Zm9ybURh
dGEoZGVzYywgZGVzYy5mYW1pbHkoKS5mYW1pbHkoKSk7CisgICAgcmV0dXJuIG5ldyBTaW1wbGVG
b250RGF0YShwbGF0Zm9ybURhdGEpOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERh
dGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0
aW9uKSBjb25zdAoreworICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEpCisgICAgICAgIG1fZGVy
aXZlZEZvbnREYXRhID0gRGVyaXZlZEZvbnREYXRhOjpjcmVhdGUoaXNDdXN0b21Gb250KCkpOwor
ICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEtPnNtYWxsQ2FwcykKKyAgICAgICAgbV9kZXJpdmVk
Rm9udERhdGEtPnNtYWxsQ2FwcyA9IHNjYWxlZEZvbnREYXRhKGZvbnREZXNjcmlwdGlvbiwgLjcp
OworCisgICAgcmV0dXJuIG1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMuZ2V0KCk7Cit9CisK
K1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6ZW1waGFzaXNNYXJrRm9udERhdGEoY29u
c3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgaWYgKCFt
X2Rlcml2ZWRGb250RGF0YSkKKyAgICAgICAgbV9kZXJpdmVkRm9udERhdGEgPSBEZXJpdmVkRm9u
dERhdGE6OmNyZWF0ZShpc0N1c3RvbUZvbnQoKSk7CisgICAgaWYgKCFtX2Rlcml2ZWRGb250RGF0
YS0+ZW1waGFzaXNNYXJrKQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YS0+ZW1waGFzaXNNYXJr
ID0gc2NhbGVkRm9udERhdGEoZm9udERlc2NyaXB0aW9uLCAuNSk7CisKKyAgICByZXR1cm4gbV9k
ZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFyay5nZXQoKTsKK30KKworRmxvYXRSZWN0IFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybUJvdW5kc0ZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworfQorI2Vsc2UK
IGJvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hhcmFjdGVycyhjb25zdCBVQ2hhciosIGlu
dCkgY29uc3QKIHsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1HbHlwaEluaXQoKQoreworICAgIGlmICghbV9wbGF0Zm9ybURhdGEuc2l6ZSgpKQor
ICAgICAgICByZXR1cm47CisgICAgbV9zcGFjZUdseXBoID0gMDsKKyAgICBtX2FkanVzdGVkU3Bh
Y2VXaWR0aCA9IG1fc3BhY2VXaWR0aDsKKyAgICBkZXRlcm1pbmVQaXRjaCgpOworICAgIG1fbWlz
c2luZ0dseXBoRGF0YS5mb250RGF0YSA9IHRoaXM7CisgICAgbV9taXNzaW5nR2x5cGhEYXRhLmds
eXBoID0gMDsKK30KKyNlbmRpZgorCiB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQo
KQogewogICAgIGlmICghbV9wbGF0Zm9ybURhdGEuc2l6ZSgpKSB7CkBAIC01Miw3ICsxMjEsNyBA
QCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAgICAgICAgcmV0dXJuOwog
ICAgIH0KIAotICAgIFFGb250TWV0cmljcyBmbShtX3BsYXRmb3JtRGF0YS5mb250KCkpOworICAg
IFFGb250TWV0cmljc0YgZm0obV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKIAogICAgIG1fYXNjZW50
ID0gZm0uYXNjZW50KCk7CiAgICAgbV9kZXNjZW50ID0gZm0uZGVzY2VudCgpOwpAQCAtNjIsMjIg
KzEzMSwxMSBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAgIG1fbGlu
ZUdhcCA9IGZtLmxlYWRpbmcoKTsKIH0KIAotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1H
bHlwaEluaXQoKQotewotICAgIGlmICghbV9wbGF0Zm9ybURhdGEuc2l6ZSgpKQotICAgICAgICBy
ZXR1cm47Ci0gICAgbV9zcGFjZUdseXBoID0gMDsKLSAgICBtX2FkanVzdGVkU3BhY2VXaWR0aCA9
IG1fc3BhY2VXaWR0aDsKLSAgICBkZXRlcm1pbmVQaXRjaCgpOwotICAgIG1fbWlzc2luZ0dseXBo
RGF0YS5mb250RGF0YSA9IHRoaXM7Ci0gICAgbV9taXNzaW5nR2x5cGhEYXRhLmdseXBoID0gMDsK
LX0KLQogdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1DaGFyV2lkdGhJbml0KCkKIHsKICAg
ICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkKICAgICAgICAgcmV0dXJuOwotICAgIFFGb250
TWV0cmljcyBmbShtX3BsYXRmb3JtRGF0YS5mb250KCkpOworICAgIFFGb250TWV0cmljc0YgZm0o
bV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKICAgICBtX2F2Z0NoYXJXaWR0aCA9IGZtLmF2ZXJhZ2VD
aGFyV2lkdGgoKTsKICAgICBtX21heENoYXJXaWR0aCA9IGZtLm1heFdpZHRoKCk7CiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>86212</attachid>
            <date>2011-03-18 14:24:38 -0700</date>
            <delta_ts>2011-03-18 14:24:55 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-51106.diff</filename>
            <type>text/plain</type>
            <size>26937</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUucHJvIGIvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5wcm8KaW5kZXggNTRjMDA5OS4uY2M2OTc5MCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS5wcm8KKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KQEAgLTE5
MDUsNiArMTkwNSw3IEBAIEhFQURFUlMgKz0gXAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRN
ZXRyaWNzLmggXAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuaCBcCiAgICAgcGxhdGZvcm0v
Z3JhcGhpY3MvR2VuZXJhdGVkSW1hZ2UuaCBcCisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQ
YWdlVHJlZU5vZGUuaCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhZGllbnQuaCBcCiAgICAg
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmggXAogICAgIHBsYXRmb3JtL2dyYXBo
aWNzL0dyYXBoaWNzTGF5ZXIuaCBcCkBAIC0zMDgyLDYgKzMwODMsMjAgQEAgY29udGFpbnMoREVG
SU5FUywgRU5BQkxFX1FUX0JFQVJFUj0xKSB7CiAgICAgICAgIHBsYXRmb3JtL25ldHdvcmsvcXQv
TmV0d29ya1N0YXRlTm90aWZpZXJRdC5jcHAKIH0KIAorIWxlc3NUaGFuKFFUX01BSk9SX1ZFUlNJ
T04sNCk6IWxlc3NUaGFuKFFUX01JTk9SX1ZFUlNJT04sIDgpOkhBVkVfUUdMWVBIUz0xCisKKyFp
c0VtcHR5KEhBVkVfUUdMWVBIUykgeworICAgIERFRklORVMgKz0gSEFWRV9RR0xZUEhTPTEKKwor
ICAgIFNPVVJDRVMgKz0gXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGgu
Y3BwIFwKKyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuY3BwIFwK
KyAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5jcHAKKworICAgIEhFQURF
UlMgKz0gXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJhdG9yLmgKK30KKwog
Y29udGFpbnMoREVGSU5FUywgRU5BQkxFX0dFT0xPQ0FUSU9OPTEpIHsKICAgICB2OCB7CiAgICAg
ICAgIFNPVVJDRVMgKz0gXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNw
cAppbmRleCBlZTg1ZTQ1Li5lZDBlN2RmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9Gb250LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250LmNwcApAQCAtMjcsNiArMjcsMTAgQEAKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIK
ICNpbmNsdWRlICJGb250Q2FjaGUuaCIKICNpbmNsdWRlICJGb250VHJhbnNjb2Rlci5oIgorI2lm
IFBMQVRGT1JNKFFUKSAmJiBIQVZFKFFHTFlQSFMpCisjaW5jbHVkZSAiQ29udGV4dFNoYWRvdy5o
IgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2VuZGlmCiAjaW5jbHVkZSAiSW50UG9p
bnQuaCIKICNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgogI2luY2x1ZGUgIlRleHRSdW4uaCIKQEAg
LTEzOSw3ICsxNDMsMTQgQEAgdm9pZCBGb250OjpkcmF3VGV4dChHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2kKICAgICB9CiAjZW5kaWYK
IAotICAgIGlmIChjb2RlUGF0aChydW4pICE9IENvbXBsZXgpCisgICAgQ29kZVBhdGggY29kZVBh
dGhUb1VzZSA9IGNvZGVQYXRoKHJ1bik7CisKKyNpZiBQTEFURk9STShRVCkgJiYgSEFWRShRR0xZ
UEhTKQorICAgIGlmIChjb250ZXh0LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tl
IHx8IGNvbnRleHQtPmNvbnRleHRTaGFkb3coKS0+bV90eXBlICE9IENvbnRleHRTaGFkb3c6Ok5v
U2hhZG93KQorICAgICAgICBjb2RlUGF0aFRvVXNlID0gQ29tcGxleDsKKyNlbmRpZgorCisgICAg
aWYgKGNvZGVQYXRoVG9Vc2UgIT0gQ29tcGxleCkKICAgICAgICAgcmV0dXJuIGRyYXdTaW1wbGVU
ZXh0KGNvbnRleHQsIHJ1biwgcG9pbnQsIGZyb20sIHRvKTsKIAogICAgIHJldHVybiBkcmF3Q29t
cGxleFRleHQoY29udGV4dCwgcnVuLCBwb2ludCwgZnJvbSwgdG8pOwpAQCAtMjc1LDcgKzI4Niw3
IEBAIEZvbnQ6OkNvZGVQYXRoIEZvbnQ6OmNvZGVQYXRoKGNvbnN0IFRleHRSdW4mIHJ1bikgY29u
c3QKICAgICBpZiAoc19jb2RlUGF0aCAhPSBBdXRvKQogICAgICAgICByZXR1cm4gc19jb2RlUGF0
aDsKIAotI2lmIFBMQVRGT1JNKFFUKQorI2lmIFBMQVRGT1JNKFFUKSAmJiAhSEFWRShRR0xZUEhT
KQogICAgIGlmIChydW4uZXhwYW5zaW9uKCkgfHwgcnVuLnJ0bCgpIHx8IGlzU21hbGxDYXBzKCkg
fHwgd29yZFNwYWNpbmcoKSB8fCBsZXR0ZXJTcGFjaW5nKCkpCiAgICAgICAgIHJldHVybiBDb21w
bGV4OwogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
R3JhcGhpY3NDb250ZXh0LmNwcAppbmRleCBkNzUzODI4Li44OTU4N2U5IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKQEAg
LTM3NCw3ICszNzQsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ltYWdlKEltYWdlKiBp
bWFnZSwgQ29sb3JTcGFjZSBzdHlsZUNvbG9yU3BhY2UsIGNvbnN0CiAgICAgZHJhd0ltYWdlKGlt
YWdlLCBzdHlsZUNvbG9yU3BhY2UsIEZsb2F0UmVjdChkZXN0KSwgc3JjUmVjdCwgb3AsIHVzZUxv
d1F1YWxpdHlTY2FsZSk7CiB9CiAKLSNpZiAhT1MoV0lOQ0UpIHx8IFBMQVRGT1JNKFFUKQorI2lm
ICFPUyhXSU5DRSkgfHwgKFBMQVRGT1JNKFFUKSAmJiAhSEFWRShRR0xZUEhTKSkKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3VGV4dChjb25zdCBGb250JiBmb250LCBjb25zdCBUZXh0UnVuJiBy
dW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKQogewogICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9TaW1wbGVGb250RGF0YS5jcHAKaW5kZXggODJmNzcwZC4uMTIwMTlmYiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNw
cApAQCAtMTIyLDcgKzEyMiw3IEBAIFNpbXBsZUZvbnREYXRhOjpTaW1wbGVGb250RGF0YShQYXNz
T3duUHRyPFNWR0ZvbnREYXRhPiBzdmdGb250RGF0YSwgaW50IHNpemUsIGJvCiB9CiAjZW5kaWYK
IAotI2lmICFQTEFURk9STShRVCkKKyNpZiAhKFBMQVRGT1JNKFFUKSAmJiAhSEFWRShRR0xZUEhT
KSkKIC8vIEVzdGltYXRlcyBvZiBhdmdDaGFyV2lkdGggYW5kIG1heENoYXJXaWR0aCBmb3IgcGxh
dGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBhY2Nlc3NpbmcgdGhlc2UgdmFsdWVzIGZyb20gdGhl
IGZvbnQuCiB2b2lkIFNpbXBsZUZvbnREYXRhOjppbml0Q2hhcldpZHRocygpCiB7CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAppbmRleCBk
ZmI0YmUzLi5kNDk5NjcwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9TaW1wbGVGb250RGF0YS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL1NpbXBsZUZvbnREYXRhLmgKQEAgLTE4NCw2ICsxODQsMTEgQEAgcHVibGljOgogI2VuZGlm
CiAKIHByaXZhdGU6CisjaWYgUExBVEZPUk0oUVQpICYmIEhBVkUoUUdMWVBIUykKKyAgICAvLyBH
bHlwaFBhZ2U6OmZpbGwoKSBmaWxscyBpbiBtX2dseXBoVG9XaWR0aE1hcCBvbiBRdC4KKyAgICBm
cmllbmQgY2xhc3MgR2x5cGhQYWdlOworI2VuZGlmCisKICAgICB2b2lkIHBsYXRmb3JtSW5pdCgp
OwogICAgIHZvaWQgcGxhdGZvcm1HbHlwaEluaXQoKTsKICAgICB2b2lkIHBsYXRmb3JtQ2hhcldp
ZHRoSW5pdCgpOwpAQCAtMjg1LDkgKzI5MCw4IEBAIHByaXZhdGU6CiAjZW5kaWYKICNlbmRpZgog
fTsKLSAgICAKLSAgICAKLSNpZiAhUExBVEZPUk0oUVQpCisKKyNpZiAhKFBMQVRGT1JNKFFUKSAm
JiAhSEFWRShRR0xZUEhTKSkKIEFMV0FZU19JTkxJTkUgRmxvYXRSZWN0IFNpbXBsZUZvbnREYXRh
Ojpib3VuZHNGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBpZiAoaXNaZXJvV2lk
dGhTcGFjZUdseXBoKGdseXBoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcAppbmRleCBjNTljNTIzLi4zNmRkMzAyIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3Bw
CkBAIC0zMiw5ICszMiwxMSBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8d3RmL0xp
c3RIYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0
Zi90ZXh0L0NTdHJpbmcuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAKICNp
bmNsdWRlIDxRRm9udD4KKyNpbmNsdWRlIDxRVGV4dExheW91dD4KIAogdXNpbmcgbmFtZXNwYWNl
IFdURjsKIApAQCAtNDQsOSArNDYsMzggQEAgdm9pZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5pdCgp
CiB7CiB9CiAKLWNvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9y
Q2hhcmFjdGVycyhjb25zdCBGb250JiwgY29uc3QgVUNoYXIqLCBpbnQpCitzdGF0aWMgYm9vbCBn
ZXRBbHRlcm5hdGVGb250Rm9yQ2hhcmFjdGVycyhjb25zdCBRU3RyaW5nJiBzdHJpbmcsIGNvbnN0
IFFGb250JiByZXF1ZXN0ZWRGb250LCBRRm9udCYgYWx0ZXJuYXRlRm9udCkKIHsKLSAgICByZXR1
cm4gMDsKKyAgICBRRm9udCBmb250KHJlcXVlc3RlZEZvbnQpOworICAgIGZvbnQuc2V0U3R5bGVT
dHJhdGVneShRRm9udDo6Tm9Gb250TWVyZ2luZyk7CisKKyAgICBRVGV4dExheW91dCBsYXlvdXQo
c3RyaW5nLCBmb250KTsKKyAgICBsYXlvdXQuYmVnaW5MYXlvdXQoKTsKKyAgICBsYXlvdXQuY3Jl
YXRlTGluZSgpOworICAgIGxheW91dC5lbmRMYXlvdXQoKTsKKworICAgIFFMaXN0PFFHbHlwaHM+
IGdseXBoTGlzdCA9IGxheW91dC5nbHlwaHMoKTsKKworICAgIEFTU0VSVChnbHlwaExpc3Quc2l6
ZSgpID09IDEpOworCisgICAgY29uc3QgUUdseXBocyYgZ2x5cGhzKGdseXBoTGlzdC5hdCgwKSk7
CisgICAgUVZlY3RvcjxxdWludDMyPiBnbHlwaEluZGV4ZXMgPSBnbHlwaHMuZ2x5cGhJbmRleGVz
KCk7CisKKyAgICBpZiAoZ2x5cGhJbmRleGVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgYWx0ZXJuYXRlRm9udCA9IGdseXBocy5mb250KCk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2NvbnN0IFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9y
Q2hhcmFjdGVycyhjb25zdCBGb250JiBmb250LCBjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50
IGxlbmd0aCkKK3sKKyAgICBRU3RyaW5nIHFzdHJpbmcgPSBRU3RyaW5nOjpmcm9tUmF3RGF0YShy
ZWludGVycHJldF9jYXN0PGNvbnN0IFFDaGFyKj4oY2hhcmFjdGVycyksIGxlbmd0aCk7CisgICAg
UUZvbnQgY29tcHV0ZWRGb250OworICAgIGlmICghZ2V0QWx0ZXJuYXRlRm9udEZvckNoYXJhY3Rl
cnMocXN0cmluZywgZm9udC5mb250KCksIGNvbXB1dGVkRm9udCkpCisgICAgICAgIHJldHVybiAw
OworICAgIEZvbnRQbGF0Zm9ybURhdGEgYWx0ZXJuYXRlRm9udChjb21wdXRlZEZvbnQpOworICAg
IHJldHVybiBnZXRDYWNoZWRGb250RGF0YSgmYWx0ZXJuYXRlRm9udCk7CiB9CiAKIFNpbXBsZUZv
bnREYXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQm
IGZvbnQpCkBAIC01Nyw3ICs4OCw3IEBAIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldFNp
bWlsYXJGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQmIGZvbnQpCiBTaW1wbGVGb250RGF0YSog
Rm9udENhY2hlOjpnZXRMYXN0UmVzb3J0RmFsbGJhY2tGb250KGNvbnN0IEZvbnREZXNjcmlwdGlv
biYgZm9udERlc2NyaXB0aW9uKQogewogICAgIGNvbnN0IEF0b21pY1N0cmluZyBmYWxsYmFja0Zh
bWlseSA9IFFGb250KGZvbnREZXNjcmlwdGlvbi5mYW1pbHkoKS5mYW1pbHkoKSkubGFzdFJlc29y
dEZhbWlseSgpOwotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShuZXcgRm9udFBsYXRmb3Jt
RGF0YShmb250RGVzY3JpcHRpb24sIGZhbGxiYWNrRmFtaWx5KSk7CisgICAgcmV0dXJuIGdldENh
Y2hlZEZvbnREYXRhKGZvbnREZXNjcmlwdGlvbiwgZmFsbGJhY2tGYW1pbHkpOwogfQogCiB2b2lk
IEZvbnRDYWNoZTo6Z2V0VHJhaXRzSW5GYW1pbHkoY29uc3QgQXRvbWljU3RyaW5nJiwgVmVjdG9y
PHVuc2lnbmVkPiYpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9Gb250UGxhdGZvcm1EYXRhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9Gb250UGxhdGZvcm1EYXRhLmgKaW5kZXggNGE5MmFjZi4uZTEzNWM5ZCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YS5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURh
dGEuaApAQCAtNzEsNiArNzEsNyBAQCBjbGFzcyBGb250UGxhdGZvcm1EYXRhIHsKIHB1YmxpYzoK
ICAgICBGb250UGxhdGZvcm1EYXRhKGZsb2F0IHNpemUsIGJvb2wgYm9sZCwgYm9vbCBvYmxpcXVl
KTsKICAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYsIGNvbnN0IEF0
b21pY1N0cmluZyYgZmFtaWx5TmFtZSwgaW50IHdvcmRTcGFjaW5nID0gMCwgaW50IGxldHRlclNw
YWNpbmcgPSAwKTsKKyAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEm
LCBmbG9hdCBzaXplKTsKICAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IFFGb250JiBmb250KQog
ICAgICAgICA6IG1fZGF0YShhZG9wdFJlZihuZXcgRm9udFBsYXRmb3JtRGF0YVByaXZhdGUoZm9u
dCkpKQogICAgIHsgfQpAQCAtMTQ5LDYgKzE1MCw5IEBAIHB1YmxpYzoKICAgICBTdHJpbmcgZGVz
Y3JpcHRpb24oKSBjb25zdDsKICNlbmRpZgogcHJpdmF0ZToKKyNpZiBIQVZFKFFHTFlQSFMpCisg
ICAgZnJpZW5kIGNsYXNzIEdseXBoUGFnZTsKKyNlbmRpZgogICAgIFJlZlB0cjxGb250UGxhdGZv
cm1EYXRhUHJpdmF0ZT4gbV9kYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YVF0LmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAKaW5kZXggMTg1
YWU4NS4uNWEzMDMxZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvRm9udFBsYXRmb3JtRGF0YVF0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhUXQuY3BwCkBAIC04NCw2ICs4NCwxNiBAQCBG
b250UGxhdGZvcm1EYXRhOjpGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYg
ZGVzY3JpcHRpb24sIGNvbnN0IEF0bwogICAgIG1fZGF0YS0+c2l6ZSA9ICghcmVxdWVzdGVkU2l6
ZSkgPyByZXF1ZXN0ZWRTaXplIDogZm9udC5waXhlbFNpemUoKTsKIH0KIAorRm9udFBsYXRmb3Jt
RGF0YTo6Rm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBvdGhlciwgZmxv
YXQgc2l6ZSkKKyAgICA6IG1fZGF0YShhZG9wdFJlZihuZXcgRm9udFBsYXRmb3JtRGF0YVByaXZh
dGUoKSkpCit7CisgICAgbV9kYXRhLT5mb250ID0gb3RoZXIubV9kYXRhLT5mb250OworICAgIG1f
ZGF0YS0+Ym9sZCA9IG90aGVyLm1fZGF0YS0+Ym9sZDsKKyAgICBtX2RhdGEtPm9ibGlxdWUgPSBv
dGhlci5tX2RhdGEtPm9ibGlxdWU7CisgICAgbV9kYXRhLT5mb250LnNldFBpeGVsU2l6ZShzaXpl
KTsKKyAgICBtX2RhdGEtPnNpemUgPSBzaXplID8gbV9kYXRhLT5mb250LnBpeGVsU2l6ZSgpIDog
MDsKK30KKwogYm9vbCBGb250UGxhdGZvcm1EYXRhOjpvcGVyYXRvcj09KGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEmIG90aGVyKSBjb25zdAogewogICAgIGlmIChtX2RhdGEgPT0gb3RoZXIubV9kYXRh
KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAKaW5k
ZXggNjQ2Y2QwZS4uNzY3Njg4NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcXQvRm9udFF0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9Gb250UXQuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSAiRm9udERlc2Ny
aXB0aW9uLmgiCiAjaW5jbHVkZSAiRm9udEZhbGxiYWNrTGlzdC5oIgogI2luY2x1ZGUgIkZvbnRT
ZWxlY3Rvci5oIgorI2lmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgor
I2VuZGlmCiAjaW5jbHVkZSAiR3JhZGllbnQuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgpAQCAtNzMsNiArNzYsMzkgQEAgc3RhdGlj
IFFUZXh0TGluZSBzZXR1cExheW91dChRVGV4dExheW91dCogbGF5b3V0LCBjb25zdCBUZXh0UnVu
JiBzdHlsZSkKICAgICByZXR1cm4gbGluZTsKIH0KIAorc3RhdGljIFFQZW4gZmlsbFBlbkZvckNv
bnRleHQoR3JhcGhpY3NDb250ZXh0KiBjdHgpCit7CisgICAgaWYgKGN0eC0+ZmlsbEdyYWRpZW50
KCkpIHsKKyAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPmZpbGxHcmFkaWVudCgpLT5wbGF0Zm9y
bUdyYWRpZW50KCkpOworICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5maWxsR3JhZGll
bnQoKS0+Z3JhZGllbnRTcGFjZVRyYW5zZm9ybSgpKTsKKyAgICAgICAgcmV0dXJuIFFQZW4oYnJ1
c2gsIDApOworICAgIH0KKworICAgIGlmIChjdHgtPmZpbGxQYXR0ZXJuKCkpIHsKKyAgICAgICAg
QWZmaW5lVHJhbnNmb3JtIGFmZmluZTsKKyAgICAgICAgcmV0dXJuIFFQZW4oUUJydXNoKGN0eC0+
ZmlsbFBhdHRlcm4oKS0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkpLCAwKTsKKyAgICB9
CisKKyAgICByZXR1cm4gUVBlbihRQ29sb3IoY3R4LT5maWxsQ29sb3IoKSkpOworfQorCitzdGF0
aWMgUVBlbiBzdHJva2VQZW5Gb3JDb250ZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4KQoreworICAg
IGlmIChjdHgtPnN0cm9rZUdyYWRpZW50KCkpIHsKKyAgICAgICAgUUJydXNoIGJydXNoKCpjdHgt
PnN0cm9rZUdyYWRpZW50KCktPnBsYXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGJydXNoLnNl
dFRyYW5zZm9ybShjdHgtPnN0cm9rZUdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0o
KSk7CisgICAgICAgIHJldHVybiBRUGVuKGJydXNoLCBjdHgtPnN0cm9rZVRoaWNrbmVzcygpKTsK
KyAgICB9CisKKyAgICBpZiAoY3R4LT5zdHJva2VQYXR0ZXJuKCkpIHsKKyAgICAgICAgQWZmaW5l
VHJhbnNmb3JtIGFmZmluZTsKKyAgICAgICAgUUJydXNoIGJydXNoKGN0eC0+c3Ryb2tlUGF0dGVy
bigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSk7CisgICAgICAgIHJldHVybiBRUGVu
KGJydXNoLCBjdHgtPnN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gUVBl
bihRQ29sb3IoY3R4LT5zdHJva2VDb2xvcigpKSwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7Cit9
CisKIHN0YXRpYyB2b2lkIGRyYXdUZXh0Q29tbW9uKEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25z
dCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRv
LCBjb25zdCBRRm9udCYgZm9udCwgYm9vbCBpc0NvbXBsZXhUZXh0KQogewogICAgIGlmICh0byA8
IDApCkBAIC04MSwzMSArMTE3LDEyIEBAIHN0YXRpYyB2b2lkIGRyYXdUZXh0Q29tbW9uKEdyYXBo
aWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0CiAgICAgUVBh
aW50ZXIgKnAgPSBjdHgtPnBsYXRmb3JtQ29udGV4dCgpOwogCiAgICAgUVBlbiB0ZXh0RmlsbFBl
bjsKLSAgICBpZiAoY3R4LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlRmlsbCkgewotICAg
ICAgICBpZiAoY3R4LT5maWxsR3JhZGllbnQoKSkgewotICAgICAgICAgICAgUUJydXNoIGJydXNo
KCpjdHgtPmZpbGxHcmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkpOwotICAgICAgICAgICAg
YnJ1c2guc2V0VHJhbnNmb3JtKGN0eC0+ZmlsbEdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFu
c2Zvcm0oKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsbFBlbiA9IFFQZW4oYnJ1c2gsIDApOwotICAg
ICAgICB9IGVsc2UgaWYgKGN0eC0+ZmlsbFBhdHRlcm4oKSkgewotICAgICAgICAgICAgQWZmaW5l
VHJhbnNmb3JtIGFmZmluZTsKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBlbihRQnJ1c2go
Y3R4LT5maWxsUGF0dGVybigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSksIDApOwot
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBlbihRQ29sb3IoY3R4
LT5maWxsQ29sb3IoKSkpOwotICAgIH0KKyAgICBpZiAoY3R4LT50ZXh0RHJhd2luZ01vZGUoKSAm
IFRleHRNb2RlRmlsbCkKKyAgICAgICAgdGV4dEZpbGxQZW4gPSBmaWxsUGVuRm9yQ29udGV4dChj
dHgpOwogCiAgICAgUVBlbiB0ZXh0U3Ryb2tlUGVuOwotICAgIGlmIChjdHgtPnRleHREcmF3aW5n
TW9kZSgpICYgVGV4dE1vZGVTdHJva2UpIHsKLSAgICAgICAgaWYgKGN0eC0+c3Ryb2tlR3JhZGll
bnQoKSkgewotICAgICAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPnN0cm9rZUdyYWRpZW50KCkt
PnBsYXRmb3JtR3JhZGllbnQoKSk7Ci0gICAgICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4
LT5zdHJva2VHcmFkaWVudCgpLT5ncmFkaWVudFNwYWNlVHJhbnNmb3JtKCkpOwotICAgICAgICAg
ICAgdGV4dFN0cm9rZVBlbiA9IFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOwot
ICAgICAgICB9IGVsc2UgaWYgKGN0eC0+c3Ryb2tlUGF0dGVybigpKSB7Ci0gICAgICAgICAgICBB
ZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOwotICAgICAgICAgICAgUUJydXNoIGJydXNoKGN0eC0+c3Ry
b2tlUGF0dGVybigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSk7Ci0gICAgICAgICAg
ICB0ZXh0U3Ryb2tlUGVuID0gUVBlbihicnVzaCwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7Ci0g
ICAgICAgIH0gZWxzZQotICAgICAgICAgICAgdGV4dFN0cm9rZVBlbiA9IFFQZW4oUUNvbG9yKGN0
eC0+c3Ryb2tlQ29sb3IoKSksIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgIH0KKyAgICBp
ZiAoY3R4LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tlKQorICAgICAgICB0ZXh0
U3Ryb2tlUGVuID0gc3Ryb2tlUGVuRm9yQ29udGV4dChjdHgpOwogCiAgICAgU3RyaW5nIHNhbml0
aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3Ro
KCkpOwogICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXpl
ZCk7CkBAIC0yNDgsNDEgKzI2NSw3MiBAQCBzdGF0aWMgdm9pZCBkcmF3VGV4dENvbW1vbihHcmFw
aGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdAogICAgIH0K
IH0KIAotdm9pZCBGb250OjpkcmF3U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0
bykgY29uc3QKK3ZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4
LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwg
aW50IHRvKSBjb25zdAogewotI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3
LCAwKQotICAgIGRyYXdUZXh0Q29tbW9uKGN0eCwgcnVuLCBwb2ludCwgZnJvbSwgdG8sIGZvbnQo
KSwgLyogaXNDb21wbGV4VGV4dCA9ICovZmFsc2UpOwotI2Vsc2UKLSAgICBRX0FTU0VSVChmYWxz
ZSk7Ci0jZW5kaWYKKyAgICBkcmF3VGV4dENvbW1vbihjdHgsIHJ1biwgcG9pbnQsIGZyb20sIHRv
LCBmb250KCksIC8qIGlzQ29tcGxleFRleHQgPSAqL3RydWUpOwogfQogCi12b2lkIEZvbnQ6OmRy
YXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBj
b25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK2Zsb2F0IEZv
bnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8
Y29uc3QgU2ltcGxlRm9udERhdGEqPiosIEdseXBoT3ZlcmZsb3cqKSBjb25zdAogewotICAgIGRy
YXdUZXh0Q29tbW9uKGN0eCwgcnVuLCBwb2ludCwgZnJvbSwgdG8sIGZvbnQoKSwgLyogaXNDb21w
bGV4VGV4dCA9ICovdHJ1ZSk7CisgICAgaWYgKCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEo
KS5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFydW4ubGVuZ3RoKCkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHJ1bi5sZW5ndGgoKSA9PSAxICYmIHRyZWF0QXNT
cGFjZShydW5bMF0pKQorICAgICAgICByZXR1cm4gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgo
c3BhY2UpICsgcnVuLmV4cGFuc2lvbigpOworCisgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6
Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOworICAgIFFT
dHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisKKyAgICBp
bnQgdyA9IFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHN0cmluZyk7CisgICAgLy8gV2ViS2l0
IGV4cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQgc3BhY2luZyBvbiB0aGUgZmlyc3QgY2hhcmFjdGVy
IChhcyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9lcykKKyAgICBpZiAodHJlYXRBc1NwYWNlKHJ1blsw
XSkpCisgICAgICAgIHcgLT0gbV93b3JkU3BhY2luZzsKKworICAgIHJldHVybiB3ICsgcnVuLmV4
cGFuc2lvbigpOwogfQogCi1pbnQgRm9udDo6ZW1waGFzaXNNYXJrQXNjZW50KGNvbnN0IEF0b21p
Y1N0cmluZyYpIGNvbnN0CitpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4
dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0aW9uLCBib29sKSBjb25zdAogewotICAg
IG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgU3RyaW5nIHNhbml0aXplZCA9
IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwor
ICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisK
KyAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBmb250KCkpOworICAgIFFUZXh0TGluZSBs
aW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsKKyAgICByZXR1cm4gbGluZS54VG9DdXJz
b3IocG9zaXRpb24pOwogfQogCi1pbnQgRm9udDo6ZW1waGFzaXNNYXJrRGVzY2VudChjb25zdCBB
dG9taWNTdHJpbmcmKSBjb25zdAorRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21w
bGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHB0LCBpbnQgaCwg
aW50IGZyb20sIGludCB0bykgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJl
dHVybiAwOworICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMocnVu
LmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKTsKKyAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21S
YXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOworCisgICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0
cmluZywgZm9udCgpKTsKKyAgICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlvdXQs
IHJ1bik7CisKKyAgICBmbG9hdCB4MSA9IGxpbmUuY3Vyc29yVG9YKGZyb20pOworICAgIGZsb2F0
IHgyID0gbGluZS5jdXJzb3JUb1godG8pOworICAgIGlmICh4MiA8IHgxKQorICAgICAgICBxU3dh
cCh4MSwgeDIpOworCisgICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4MSwgcHQueSgpLCB4
MiAtIHgxLCBoKTsKIH0KIAotaW50IEZvbnQ6OmVtcGhhc2lzTWFya0hlaWdodChjb25zdCBBdG9t
aWNTdHJpbmcmKSBjb25zdAorYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29t
cGxleFRleHQoKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEZvbnQ6OmRyYXdFbXBoYXNpc01hcmtzRm9yU2ltcGxl
VGV4dChHcmFwaGljc0NvbnRleHQqIC8qIGNvbnRleHQgKi8sIGNvbnN0IFRleHRSdW4mIC8qIHJ1
biAqLywgY29uc3QgQXRvbWljU3RyaW5nJiAvKiBtYXJrICovLCBjb25zdCBGbG9hdFBvaW50JiAv
KiBwb2ludCAqLywgaW50IC8qIGZyb20gKi8sIGludCAvKiB0byAqLykgY29uc3QKK1FGb250IEZv
bnQ6OmZvbnQoKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgUUZvbnQgZiA9
IHByaW1hcnlGb250KCktPmdldFF0Rm9udCgpOworICAgIGlmIChtX2xldHRlclNwYWNpbmcgIT0g
MCkKKyAgICAgICAgZi5zZXRMZXR0ZXJTcGFjaW5nKFFGb250OjpBYnNvbHV0ZVNwYWNpbmcsIG1f
bGV0dGVyU3BhY2luZyk7CisgICAgaWYgKG1fd29yZFNwYWNpbmcgIT0gMCkKKyAgICAgICAgZi5z
ZXRXb3JkU3BhY2luZyhtX3dvcmRTcGFjaW5nKTsKKyAgICByZXR1cm4gZjsKIH0KIAogdm9pZCBG
b250OjpkcmF3RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogLyog
Y29udGV4dCAqLywgY29uc3QgVGV4dFJ1biYgLyogcnVuICovLCBjb25zdCBBdG9taWNTdHJpbmcm
IC8qIG1hcmsgKi8sIGNvbnN0IEZsb2F0UG9pbnQmIC8qIHBvaW50ICovLCBpbnQgLyogZnJvbSAq
LywgaW50IC8qIHRvICovKSBjb25zdApAQCAtMjkwLDUxICszMzgsNjUgQEAgdm9pZCBGb250Ojpk
cmF3RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogLyogY29udGV4
dCAqLywgY29uc3QKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi1mbG9hdCBGb250OjpmbG9h
dFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEdseXBoQnVmZmVyKiBnbHlw
aEJ1ZmZlciwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBH
bHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAorI2lmIEhBVkUoUUdMWVBIUykKK3Zv
aWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFNpbXBs
ZUZvbnREYXRhKiBmb250RGF0YSwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBpbnQg
ZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0CiB7Ci0g
ICAgaWYgKCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5zaXplKCkpCi0gICAgICAgIHJl
dHVybiAwOworICAgIGlmIChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKIAotI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAwKQotICAg
IGlmICghcnVuLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBib29sIHNob3VsZEZp
bGwgPSBjb250ZXh0LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlRmlsbDsKKyAgICBib29s
IHNob3VsZFN0cm9rZSA9IGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVTdHJv
a2U7CiAKLSAgICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5j
aGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7Ci0gICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3
RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsKKyAgICAvLyBTdHJva2luZyB0ZXh0IHNob3VsZCBh
bHdheXMgdGFrZSB0aGUgY29tcGxleCBwYXRoLgorICAgIEFTU0VSVCghc2hvdWxkU3Ryb2tlKTsK
IAotICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3RyaW5nLCAtMSwgUXQ6
OlRleHRCeXBhc3NTaGFwaW5nKTsKKyAgICAvLyBTaGFkb3dlZCB0ZXh0IHNob3VsZCBhbHdheXMg
dGFrZSB0aGUgY29tcGxleCBwYXRoLgorICAgIEFTU0VSVChjb250ZXh0LT5jb250ZXh0U2hhZG93
KCktPm1fdHlwZSA9PSBDb250ZXh0U2hhZG93OjpOb1NoYWRvdyk7CiAKLSAgICAvLyBXZWJLaXQg
ZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFjaW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIg
KGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQotICAgIGlmICh0cmVhdEFzU3BhY2UocnVuWzBd
KSkKLSAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5nOworICAgIGlmICghc2hvdWxkRmlsbCAmJiAh
c2hvdWxkU3Ryb2tlKQorICAgICAgICByZXR1cm47CiAKLSAgICByZXR1cm4gdyArIHJ1bi5leHBh
bnNpb24oKTsKLSNlbHNlCi0gICAgUV9BU1NFUlQoZmFsc2UpOwotICAgIHJldHVybiAwOwotI2Vu
ZGlmCi19CisgICAgUVZlY3RvcjxxdWludDMyPiBnbHlwaEluZGV4ZXM7CisgICAgUVZlY3RvcjxR
UG9pbnRGPiBwb3NpdGlvbnM7CisgICAgZmxvYXQgeCA9IDA7CiAKLWZsb2F0IEZvbnQ6OmZsb2F0
V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2lt
cGxlRm9udERhdGEqPiosIEdseXBoT3ZlcmZsb3cqKSBjb25zdAotewotICAgIGlmICghcHJpbWFy
eUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBm
b3IgKGludCBpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CisgICAgICAgIEdseXBoIGdseXBo
ID0gZ2x5cGhCdWZmZXIuZ2x5cGhBdChmcm9tICsgaSk7CisgICAgICAgIGZsb2F0IGFkdmFuY2Ug
PSBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpOworICAgICAgICBpZiAoIWdseXBoKQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGdseXBoSW5kZXhlcy5hcHBlbmQoZ2x5cGgp
OworICAgICAgICBwb3NpdGlvbnMuYXBwZW5kKFFQb2ludEYoeCwgMCkpOworICAgICAgICB4ICs9
IGFkdmFuY2U7CisgICAgfQogCi0gICAgaWYgKCFydW4ubGVuZ3RoKCkpCi0gICAgICAgIHJldHVy
biAwOworICAgIFFHbHlwaHMgcXRHbHlwaHM7CisgICAgcXRHbHlwaHMuc2V0R2x5cGhJbmRleGVz
KGdseXBoSW5kZXhlcyk7CisgICAgcXRHbHlwaHMuc2V0UG9zaXRpb25zKHBvc2l0aW9ucyk7Cisg
ICAgcXRHbHlwaHMuc2V0Rm9udChmb250RGF0YS0+Z2V0UXRGb250KCkpOwogCi0gICAgaWYgKHJ1
bi5sZW5ndGgoKSA9PSAxICYmIHRyZWF0QXNTcGFjZShydW5bMF0pKQotICAgICAgICByZXR1cm4g
UUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3BhY2UpICsgcnVuLmV4cGFuc2lvbigpOworICAg
IFFQYWludGVyKiBwYWludGVyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CiAKLSAgICBT
dHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCks
IHJ1bi5sZW5ndGgoKSk7Ci0gICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRS
ZWYoc2FuaXRpemVkKTsKKyAgICBRUGVuIHByZXZpb3VzUGVuID0gcGFpbnRlci0+cGVuKCk7Cisg
ICAgcGFpbnRlci0+c2V0UGVuKGZpbGxQZW5Gb3JDb250ZXh0KGNvbnRleHQpKTsKKyAgICBwYWlu
dGVyLT5kcmF3R2x5cGhzKHBvaW50LCBxdEdseXBocyk7CisgICAgcGFpbnRlci0+c2V0UGVuKHBy
ZXZpb3VzUGVuKTsKK30KIAotICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgo
c3RyaW5nKTsKLSAgICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFjaW5n
IG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQotICAg
IGlmICh0cmVhdEFzU3BhY2UocnVuWzBdKSkKLSAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5nOwor
Ym9vbCBGb250OjpjYW5FeHBhbmRBcm91bmRJZGVvZ3JhcGhzSW5Db21wbGV4VGV4dCgpCit7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQogCi0gICAgcmV0dXJuIHcgKyBydW4uZXhwYW5zaW9uKCk7Cisj
ZWxzZSAvLyAhSEFWRShRR0xZUEhTKQorCit2b2lkIEZvbnQ6OmRyYXdTaW1wbGVUZXh0KEdyYXBo
aWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAoreworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVS
U0lPTl9DSEVDSyg0LCA3LCAwKQorICAgIGRyYXdUZXh0Q29tbW9uKGN0eCwgcnVuLCBwb2ludCwg
ZnJvbSwgdG8sIGZvbnQoKSwgLyogaXNDb21wbGV4VGV4dCA9ICovZmFsc2UpOworI2Vsc2UKKyAg
ICBRX0FTU0VSVChmYWxzZSk7CisjZW5kaWYKIH0KIAogaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0
aW9uRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0aW9uLCBib29s
IGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdApAQCAtMzY1LDE2ICs0MjcsMzMgQEAgaW50IEZv
bnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZs
b2F0IHBvc2l0aW9uLCBib28KICNlbmRpZgogfQogCi1pbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRp
b25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0aW9uLCBib29s
KSBjb25zdAorCitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0
UnVuJiBydW4sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgSGFzaFNldDxjb25zdCBTaW1wbGVG
b250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBj
b25zdAogeworICAgIGlmICghcHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpKQor
ICAgICAgICByZXR1cm4gMDsKKworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0
LCA3LCAwKQorICAgIGlmICghcnVuLmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gMDsKKwogICAg
IFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMocnVuLmNoYXJhY3RlcnMo
KSwgcnVuLmxlbmd0aCgpKTsKICAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdEYXRhV2l0aG91
dFJlZihzYW5pdGl6ZWQpOwogCi0gICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9udCgp
KTsKLSAgICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlvdXQsIHJ1bik7Ci0gICAg
cmV0dXJuIGxpbmUueFRvQ3Vyc29yKHBvc2l0aW9uKTsKKyAgICBpbnQgdyA9IFFGb250TWV0cmlj
cyhmb250KCkpLndpZHRoKHN0cmluZywgLTEsIFF0OjpUZXh0QnlwYXNzU2hhcGluZyk7CisKKyAg
ICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFjaW5nIG9uIHRoZSBmaXJz
dCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQorICAgIGlmICh0cmVhdEFz
U3BhY2UocnVuWzBdKSkKKyAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5nOworCisgICAgcmV0dXJu
IHcgKyBydW4uZXhwYW5zaW9uKCk7CisjZWxzZQorICAgIFFfQVNTRVJUKGZhbHNlKTsKKyAgICBy
ZXR1cm4gMDsKKyNlbmRpZgogfQogCisKIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9y
U2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHB0LCBpbnQg
aCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJ
T05fQ0hFQ0soNCwgNywgMCkKQEAgLTM5MiwyMiArNDcxLDYgQEAgRmxvYXRSZWN0IEZvbnQ6OnNl
bGVjdGlvblJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQ
b2ludCYKICNlbmRpZgogfQogCi1GbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBs
ZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcHQsIGludCBoLCBp
bnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpu
b3JtYWxpemVTcGFjZXMocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKTsKLSAgICBRU3Ry
aW5nIHN0cmluZyA9IGZyb21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOwotCi0gICAgUVRl
eHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9udCgpKTsKLSAgICBRVGV4dExpbmUgbGluZSA9IHNl
dHVwTGF5b3V0KCZsYXlvdXQsIHJ1bik7Ci0KLSAgICBmbG9hdCB4MSA9IGxpbmUuY3Vyc29yVG9Y
KGZyb20pOwotICAgIGZsb2F0IHgyID0gbGluZS5jdXJzb3JUb1godG8pOwotICAgIGlmICh4MiA8
IHgxKQotICAgICAgICBxU3dhcCh4MSwgeDIpOwotCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwdC54
KCkgKyB4MSwgcHQueSgpLCB4MiAtIHgxLCBoKTsKLX0KLQogYm9vbCBGb250OjpjYW5SZXR1cm5G
YWxsYmFja0ZvbnRzRm9yQ29tcGxleFRleHQoKQogewogICAgIHJldHVybiBmYWxzZTsKQEAgLTQz
NCw1ICs0OTcsNyBAQCBRRm9udCBGb250Ojpmb250KCkgY29uc3QKICAgICByZXR1cm4gZjsKIH0K
IAorI2VuZGlmIC8vIEhBVkUoUUdMWVBIUykKKwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HbHlwaFBhZ2VUcmVlTm9kZVF0LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwCmlu
ZGV4IDIxMjEyMDYuLjY3NDE5NTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwCkBAIC0yMyw4ICsy
Myw2MSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkdseXBoUGFnZVRyZWVOb2Rl
LmgiCiAKKyNpZiBIQVZFKFFHTFlQSFMpCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNp
bmNsdWRlIDxRRm9udE1ldHJpY3NGPgorI2luY2x1ZGUgPFFUZXh0TGF5b3V0PgorI2VuZGlmCisK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lmIEhBVkUoUUdMWVBIUykKKworc3RhdGljIEdseXBo
IGdldEdseXBoRm9yQ2hhcmFjdGVyQW5kRm9udChRQ2hhciBjaGFyYWN0ZXIsIGNvbnN0IFFGb250
JiBmb250KQoreworICAgIFFUZXh0TGF5b3V0IGxheW91dChjaGFyYWN0ZXIsIGZvbnQpOworICAg
IGxheW91dC5iZWdpbkxheW91dCgpOworICAgIGxheW91dC5jcmVhdGVMaW5lKCk7CisgICAgbGF5
b3V0LmVuZExheW91dCgpOworCisgICAgUUxpc3Q8UUdseXBocz4gZ2x5cGhMaXN0ID0gbGF5b3V0
LmdseXBocygpOworICAgIEFTU0VSVChnbHlwaExpc3Quc2l6ZSgpID09IDEpOworCisgICAgY29u
c3QgUUdseXBocyYgZ2x5cGhzKGdseXBoTGlzdC5hdCgwKSk7CisgICAgUVZlY3RvcjxxdWludDMy
PiBnbHlwaEluZGV4ZXMgPSBnbHlwaHMuZ2x5cGhJbmRleGVzKCk7CisKKyAgICBpZiAoZ2x5cGhJ
bmRleGVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZ2x5cGhJ
bmRleGVzLmF0KDApOworfQorXAorYm9vbCBHbHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0
LCB1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiBidWZmZXIsIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCwg
Y29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhKQoreworICAgIFFGb250IGZvbnQgPSBmb250
RGF0YS0+Z2V0UXRGb250KCk7CisgICAgZm9udC5zZXRTdHlsZVN0cmF0ZWd5KFFGb250OjpOb0Zv
bnRNZXJnaW5nKTsKKworICAgIFFGb250TWV0cmljcyBmb250TWV0cmljcyhmb250KTsKKworICAg
IFFTdHJpbmcgcXN0cmluZyA9IFFTdHJpbmc6OmZyb21SYXdEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgUUNoYXIqPihidWZmZXIpLCBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlckxlbmd0aCkpOwor
CisgICAgYm9vbCBoYXZlR2x5cGhzID0gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgR2x5cGggZ2x5cGggPSBnZXRHbHlwaEZvckNo
YXJhY3RlckFuZEZvbnQocXN0cmluZy5hdChpKSwgZm9udCk7CisgICAgICAgIGlmICghZ2x5cGgp
CisgICAgICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZzZXQgKyBpLCAwLCAwKTsKKyAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICBoYXZlR2x5cGhzID0gdHJ1ZTsKKyAgICAgICAgICAg
IGZvbnREYXRhLT5tX2dseXBoVG9XaWR0aE1hcC5zZXRNZXRyaWNzRm9yR2x5cGgoZ2x5cGgsIGZv
bnRNZXRyaWNzLndpZHRoKHFzdHJpbmcuYXQoaSkpKTsKKyAgICAgICAgICAgIHNldEdseXBoRGF0
YUZvckluZGV4KG9mZnNldCArIGksIGdseXBoLCBmb250RGF0YSk7CisgICAgICAgIH0KKyAgICB9
CisgICAgcmV0dXJuIGhhdmVHbHlwaHM7Cit9CisKKyNlbHNlCisKIHZvaWQgR2x5cGhQYWdlVHJl
ZU5vZGU6OnBydW5lVHJlZUN1c3RvbUZvbnREYXRhKGNvbnN0IEZvbnREYXRhKikKIHsKIH0KQEAg
LTMyLDUgKzg1LDYgQEAgdm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9u
dERhdGEoY29uc3QgRm9udERhdGEqKQogdm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVl
Rm9udERhdGEoY29uc3QgV2ViQ29yZTo6U2ltcGxlRm9udERhdGEqKQogewogfQorI2VuZGlmIC8v
IEhBVkUoUUdMWVBIUykKIAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcXQvU2ltcGxlRm9udERhdGFRdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcAppbmRleCA1ZDBiMzAyLi4wY2UyYWYx
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVG
b250RGF0YVF0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9T
aW1wbGVGb250RGF0YVF0LmNwcApAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCiAKKyNpZiBIQVZFKFFHTFlQSFMpCisjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNlbmRpZgogI2luY2x1ZGUgPFFGb250TWV0cmljc0Y+
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTMzLDExICszNiw3OSBAQCB2b2lkIFNpbXBsZUZv
bnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCiAgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IG1fcGxh
dGZvcm1EYXRhLmZvbnQoKS5maXhlZFBpdGNoKCk7CiB9CiAKKyNpZiBIQVZFKFFHTFlQSFMpCisK
K3N0YXRpYyBjb25zdCBmbG9hdCBzbWFsbENhcHNGcmFjdGlvbiA9IDAuNzsKK3N0YXRpYyBjb25z
dCBmbG9hdCBlbXBoYXNpc01hcmtGcmFjdGlvbiA9IDAuNTsKKworYm9vbCBTaW1wbGVGb250RGF0
YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3Ro
KSBjb25zdAoreworICAgIFFGb250TWV0cmljc0YgZm0obV9wbGF0Zm9ybURhdGEuZm9udCgpKTsK
KworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaWYgKCFm
bS5pbkZvbnQoc3RhdGljX2Nhc3Q8UUNoYXI+KGNoYXJhY3RlcnNbaV0pKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZmxvYXQgU2lt
cGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlwaCkgY29uc3QKK3sKKyAgICAv
LyBUaGUgZ2x5cGgtdG8td2lkdGggbWFwIGlzIHBvcHVsYXRlZCBieSBHbHlwaFBhZ2U6OmZpbGwo
KQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitTaW1wbGVG
b250RGF0YSogU2ltcGxlRm9udERhdGE6OnNjYWxlZEZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlw
dGlvbiYgZm9udERlc2NyaXB0aW9uLCBmbG9hdCBzY2FsZUZhY3RvcikgY29uc3QKK3sKKyAgICBj
b25zdCBmbG9hdCBzY2FsZWRTaXplID0gbHJvdW5kZihmb250RGVzY3JpcHRpb24uY29tcHV0ZWRT
aXplKCkgKiBzY2FsZUZhY3Rvcik7CisgICAgcmV0dXJuIG5ldyBTaW1wbGVGb250RGF0YShGb250
UGxhdGZvcm1EYXRhKG1fcGxhdGZvcm1EYXRhLCBzY2FsZWRTaXplKSwgaXNDdXN0b21Gb250KCks
IGZhbHNlKTsKK30KKworU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNG
b250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sK
KyAgICBpZiAoIW1fZGVyaXZlZEZvbnREYXRhKQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YSA9
IERlcml2ZWRGb250RGF0YTo6Y3JlYXRlKGlzQ3VzdG9tRm9udCgpKTsKKyAgICBpZiAoIW1fZGVy
aXZlZEZvbnREYXRhLT5zbWFsbENhcHMpCisgICAgICAgIG1fZGVyaXZlZEZvbnREYXRhLT5zbWFs
bENhcHMgPSBzY2FsZWRGb250RGF0YShmb250RGVzY3JpcHRpb24sIHNtYWxsQ2Fwc0ZyYWN0aW9u
KTsKKworICAgIHJldHVybiBtX2Rlcml2ZWRGb250RGF0YS0+c21hbGxDYXBzLmdldCgpOworfQor
CitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OmVtcGhhc2lzTWFya0ZvbnREYXRhKGNv
bnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAoreworICAgIGlmICgh
bV9kZXJpdmVkRm9udERhdGEpCisgICAgICAgIG1fZGVyaXZlZEZvbnREYXRhID0gRGVyaXZlZEZv
bnREYXRhOjpjcmVhdGUoaXNDdXN0b21Gb250KCkpOworICAgIGlmICghbV9kZXJpdmVkRm9udERh
dGEtPmVtcGhhc2lzTWFyaykKKyAgICAgICAgbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFy
ayA9IHNjYWxlZEZvbnREYXRhKGZvbnREZXNjcmlwdGlvbiwgZW1waGFzaXNNYXJrRnJhY3Rpb24p
OworCisgICAgcmV0dXJuIG1fZGVyaXZlZEZvbnREYXRhLT5lbXBoYXNpc01hcmsuZ2V0KCk7Cit9
CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlw
aCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBGbG9hdFJlY3Qo
KTsKK30KKyNlbHNlCiBib29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29u
c3QgVUNoYXIqLCBpbnQpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgU2lt
cGxlRm9udERhdGE6OnBsYXRmb3JtR2x5cGhJbml0KCkKK3sKKyAgICBpZiAoIW1fcGxhdGZvcm1E
YXRhLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fc3BhY2VHbHlwaCA9IDA7CisgICAg
bV9hZGp1c3RlZFNwYWNlV2lkdGggPSBtX3NwYWNlV2lkdGg7CisgICAgZGV0ZXJtaW5lUGl0Y2go
KTsKKyAgICBtX21pc3NpbmdHbHlwaERhdGEuZm9udERhdGEgPSB0aGlzOworICAgIG1fbWlzc2lu
Z0dseXBoRGF0YS5nbHlwaCA9IDA7Cit9CisjZW5kaWYKKwogdm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1Jbml0KCkKIHsKICAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkgewpAQCAt
NTYsMjEgKzEyNywxMSBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAg
IG1fc3BhY2VXaWR0aCA9IGZtLndpZHRoKFFMYXRpbjFDaGFyKCcgJykpOwogfQogCi12b2lkIFNp
bXBsZUZvbnREYXRhOjpwbGF0Zm9ybUdseXBoSW5pdCgpCi17Ci0gICAgaWYgKCFtX3BsYXRmb3Jt
RGF0YS5zaXplKCkpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3NwYWNlR2x5cGggPSAwOwotICAg
IGRldGVybWluZVBpdGNoKCk7Ci0gICAgbV9taXNzaW5nR2x5cGhEYXRhLmZvbnREYXRhID0gdGhp
czsKLSAgICBtX21pc3NpbmdHbHlwaERhdGEuZ2x5cGggPSAwOwotfQotCiB2b2lkIFNpbXBsZUZv
bnREYXRhOjpwbGF0Zm9ybUNoYXJXaWR0aEluaXQoKQogewogICAgIGlmICghbV9wbGF0Zm9ybURh
dGEuc2l6ZSgpKQogICAgICAgICByZXR1cm47Ci0gICAgUUZvbnRNZXRyaWNzIGZtKG1fcGxhdGZv
cm1EYXRhLmZvbnQoKSk7CisgICAgUUZvbnRNZXRyaWNzRiBmbShtX3BsYXRmb3JtRGF0YS5mb250
KCkpOwogICAgIG1fYXZnQ2hhcldpZHRoID0gZm0uYXZlcmFnZUNoYXJXaWR0aCgpOwogICAgIG1f
bWF4Q2hhcldpZHRoID0gZm0ubWF4V2lkdGgoKTsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>86213</attachid>
            <date>2011-03-18 14:27:20 -0700</date>
            <delta_ts>2011-03-21 09:09:51 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-51106.diff</filename>
            <type>text/plain</type>
            <size>29567</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAzZjIyOWMyLi5lYTZmYmRmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNTYg
QEAKIDIwMTEtMDMtMTggIEFuZHJlYXMgS2xpbmcgIDxrbGluZ0B3ZWJraXQub3JnPgogCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gSW1wbGVtZW50
IHRoZSBmYXN0IGZvbnQgcGF0aCBmb3IgUXQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTUxMTA2CisKKyAgICAgICAgVXNlIHRoZSBuZXcgUUdseXBocyBB
UElzIGluIFF0IDQuOCB0byBpbXBsZW1lbnQgdGhlIGZhc3QgcGF0aHMgZm9yCisgICAgICAgIHJl
bmRlcmluZyBhbmQgbWVhc3VyZW1lbnQgb2Ygc2ltcGxlIHRleHQuCisKKyAgICAgICAgKiBXZWJD
b3JlLnBybzoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkZvbnQ6OmRyYXdUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmNvZGVQ
YXRoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmdldEFsdGVy
bmF0ZUZvbnRGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0
Rm9udERhdGFGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0
TGFzdFJlc29ydEZhbGxiYWNrRm9udCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
Rm9udFBsYXRmb3JtRGF0YS5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQ
bGF0Zm9ybURhdGFRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250UGxhdGZvcm1EYXRhOjpG
b250UGxhdGZvcm1EYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6ZmlsbFBlbkZvckNvbnRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6c3Ryb2tlUGVuRm9yQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpkcmF3VGV4dENv
bW1vbik6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3Q29tcGxleFRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQpOgorICAgICAgICAo
V2ViQ29yZTo6Rm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OmNhblJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250Ojpmb250KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdH
bHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6Y2FuRXhwYW5kQXJvdW5kSWRlb2dyYXBo
c0luQ29tcGxleFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd1NpbXBsZVRleHQp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZmxvYXRXaWR0aEZvclNpbXBsZVRleHQpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6Z2V0R2x5cGhGb3JDaGFyYWN0ZXJBbmRGb250KToKKyAgICAgICAgKFdl
YkNvcmU6OkdseXBoUGFnZTo6ZmlsbCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
U2ltcGxlRm9udERhdGFRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6
Y29udGFpbnNDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6
OnNjYWxlZEZvbnREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzbWFs
bENhcHNGb250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6ZW1waGFz
aXNNYXJrRm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRm
b3JtQm91bmRzRm9yR2x5cGgpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtR2x5cGhJbml0KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybUNoYXJXaWR0aEluaXQpOgorCisyMDExLTAzLTE4ICBBbmRyZWFzIEtsaW5nICA8a2xpbmdA
d2Via2l0Lm9yZz4KKwogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KIAogICAgICAg
ICBSZW1vdmUgdW51c2VkIG1ldGhvZCBGb250RmFsbGJhY2tMaXN0Ojpmb250RGF0YUZvckNoYXJh
Y3RlcnMoKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9Tb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnBybwppbmRleCA1NGMwMDk5Li5jYzY5NzkwIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnBybworKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnBy
bwpAQCAtMTkwNSw2ICsxOTA1LDcgQEAgSEVBREVSUyArPSBcCiAgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvRm9udE1ldHJpY3MuaCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oIFwKICAgICBw
bGF0Zm9ybS9ncmFwaGljcy9HZW5lcmF0ZWRJbWFnZS5oIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGlj
cy9HbHlwaFBhZ2VUcmVlTm9kZS5oIFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFkaWVudC5o
IFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaCBcCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oIFwKQEAgLTMwODIsNiArMzA4MywyMCBAQCBjb250
YWlucyhERUZJTkVTLCBFTkFCTEVfUVRfQkVBUkVSPTEpIHsKICAgICAgICAgcGxhdGZvcm0vbmV0
d29yay9xdC9OZXR3b3JrU3RhdGVOb3RpZmllclF0LmNwcAogfQogCishbGVzc1RoYW4oUVRfTUFK
T1JfVkVSU0lPTiw0KTohbGVzc1RoYW4oUVRfTUlOT1JfVkVSU0lPTiwgOCk6SEFWRV9RR0xZUEhT
PTEKKworIWlzRW1wdHkoSEFWRV9RR0xZUEhTKSB7CisgICAgREVGSU5FUyArPSBIQVZFX1FHTFlQ
SFM9MQorCisgICAgU09VUkNFUyArPSBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRG
YXN0UGF0aC5jcHAgXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVlTm9k
ZS5jcHAgXAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJhdG9yLmNwcAorCisg
ICAgSEVBREVSUyArPSBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL1dpZHRoSXRlcmF0b3Iu
aAorfQorCiBjb250YWlucyhERUZJTkVTLCBFTkFCTEVfR0VPTE9DQVRJT049MSkgewogICAgIHY4
IHsKICAgICAgICAgU09VUkNFUyArPSBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9Gb250LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0ZvbnQuY3BwCmluZGV4IGVlODVlNDUuLmVkMGU3ZGYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnQuY3BwCkBAIC0yNyw2ICsyNywxMCBAQAogI2luY2x1ZGUgIkZsb2F0
UmVjdC5oIgogI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZvbnRUcmFuc2NvZGVy
LmgiCisjaWYgUExBVEZPUk0oUVQpICYmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJDb250ZXh0
U2hhZG93LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjZW5kaWYKICNpbmNsdWRl
ICJJbnRQb2ludC5oIgogI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCiAjaW5jbHVkZSAiVGV4dFJ1
bi5oIgpAQCAtMTM5LDcgKzE0MywxNCBAQCB2b2lkIEZvbnQ6OmRyYXdUZXh0KEdyYXBoaWNzQ29u
dGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaQogICAgIH0K
ICNlbmRpZgogCi0gICAgaWYgKGNvZGVQYXRoKHJ1bikgIT0gQ29tcGxleCkKKyAgICBDb2RlUGF0
aCBjb2RlUGF0aFRvVXNlID0gY29kZVBhdGgocnVuKTsKKworI2lmIFBMQVRGT1JNKFFUKSAmJiBI
QVZFKFFHTFlQSFMpCisgICAgaWYgKGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1v
ZGVTdHJva2UgfHwgY29udGV4dC0+Y29udGV4dFNoYWRvdygpLT5tX3R5cGUgIT0gQ29udGV4dFNo
YWRvdzo6Tm9TaGFkb3cpCisgICAgICAgIGNvZGVQYXRoVG9Vc2UgPSBDb21wbGV4OworI2VuZGlm
CisKKyAgICBpZiAoY29kZVBhdGhUb1VzZSAhPSBDb21wbGV4KQogICAgICAgICByZXR1cm4gZHJh
d1NpbXBsZVRleHQoY29udGV4dCwgcnVuLCBwb2ludCwgZnJvbSwgdG8pOwogCiAgICAgcmV0dXJu
IGRyYXdDb21wbGV4VGV4dChjb250ZXh0LCBydW4sIHBvaW50LCBmcm9tLCB0byk7CkBAIC0yNzUs
NyArMjg2LDcgQEAgRm9udDo6Q29kZVBhdGggRm9udDo6Y29kZVBhdGgoY29uc3QgVGV4dFJ1biYg
cnVuKSBjb25zdAogICAgIGlmIChzX2NvZGVQYXRoICE9IEF1dG8pCiAgICAgICAgIHJldHVybiBz
X2NvZGVQYXRoOwogCi0jaWYgUExBVEZPUk0oUVQpCisjaWYgUExBVEZPUk0oUVQpICYmICFIQVZF
KFFHTFlQSFMpCiAgICAgaWYgKHJ1bi5leHBhbnNpb24oKSB8fCBydW4ucnRsKCkgfHwgaXNTbWFs
bENhcHMoKSB8fCB3b3JkU3BhY2luZygpIHx8IGxldHRlclNwYWNpbmcoKSkKICAgICAgICAgcmV0
dXJuIENvbXBsZXg7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCmluZGV4IGQ3NTM4MjguLjg5NTg3ZTkgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0
LmNwcApAQCAtMzc0LDcgKzM3NCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3SW1hZ2Uo
SW1hZ2UqIGltYWdlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgY29uc3QKICAgICBkcmF3
SW1hZ2UoaW1hZ2UsIHN0eWxlQ29sb3JTcGFjZSwgRmxvYXRSZWN0KGRlc3QpLCBzcmNSZWN0LCBv
cCwgdXNlTG93UXVhbGl0eVNjYWxlKTsKIH0KIAotI2lmICFPUyhXSU5DRSkgfHwgUExBVEZPUk0o
UVQpCisjaWYgIU9TKFdJTkNFKSB8fCAoUExBVEZPUk0oUVQpICYmICFIQVZFKFFHTFlQSFMpKQog
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdUZXh0KGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFRl
eHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pCiB7
CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcAppbmRleCA4MmY3NzBkLi4xMjAxOWZi
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250
RGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9u
dERhdGEuY3BwCkBAIC0xMjIsNyArMTIyLDcgQEAgU2ltcGxlRm9udERhdGE6OlNpbXBsZUZvbnRE
YXRhKFBhc3NPd25QdHI8U1ZHRm9udERhdGE+IHN2Z0ZvbnREYXRhLCBpbnQgc2l6ZSwgYm8KIH0K
ICNlbmRpZgogCi0jaWYgIVBMQVRGT1JNKFFUKQorI2lmICEoUExBVEZPUk0oUVQpICYmICFIQVZF
KFFHTFlQSFMpKQogLy8gRXN0aW1hdGVzIG9mIGF2Z0NoYXJXaWR0aCBhbmQgbWF4Q2hhcldpZHRo
IGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IGFjY2Vzc2luZyB0aGVzZSB2YWx1ZXMg
ZnJvbSB0aGUgZm9udC4KIHZvaWQgU2ltcGxlRm9udERhdGE6OmluaXRDaGFyV2lkdGhzKCkKIHsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnRE
YXRhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5o
CmluZGV4IGRmYjRiZTMuLmQ0OTk2NzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaApAQCAtMTg0LDYgKzE4NCwxMSBAQCBwdWJsaWM6
CiAjZW5kaWYKIAogcHJpdmF0ZToKKyNpZiBQTEFURk9STShRVCkgJiYgSEFWRShRR0xZUEhTKQor
ICAgIC8vIEdseXBoUGFnZTo6ZmlsbCgpIGZpbGxzIGluIG1fZ2x5cGhUb1dpZHRoTWFwIG9uIFF0
LgorICAgIGZyaWVuZCBjbGFzcyBHbHlwaFBhZ2U7CisjZW5kaWYKKwogICAgIHZvaWQgcGxhdGZv
cm1Jbml0KCk7CiAgICAgdm9pZCBwbGF0Zm9ybUdseXBoSW5pdCgpOwogICAgIHZvaWQgcGxhdGZv
cm1DaGFyV2lkdGhJbml0KCk7CkBAIC0yODUsOSArMjkwLDggQEAgcHJpdmF0ZToKICNlbmRpZgog
I2VuZGlmCiB9OwotICAgIAotICAgIAotI2lmICFQTEFURk9STShRVCkKKworI2lmICEoUExBVEZP
Uk0oUVQpICYmICFIQVZFKFFHTFlQSFMpKQogQUxXQVlTX0lOTElORSBGbG9hdFJlY3QgU2ltcGxl
Rm9udERhdGE6OmJvdW5kc0ZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAogewogICAgIGlmIChp
c1plcm9XaWR0aFNwYWNlR2x5cGgoZ2x5cGgpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwCmluZGV4IGM1OWM1MjMuLjM2ZGQzMDIg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNo
ZVF0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2Fj
aGVRdC5jcHAKQEAgLTMyLDkgKzMyLDExIEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRl
IDx3dGYvTGlzdEhhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2gu
aD4KIAogI2luY2x1ZGUgPFFGb250PgorI2luY2x1ZGUgPFFUZXh0TGF5b3V0PgogCiB1c2luZyBu
YW1lc3BhY2UgV1RGOwogCkBAIC00NCw5ICs0NiwzOCBAQCB2b2lkIEZvbnRDYWNoZTo6cGxhdGZv
cm1Jbml0KCkKIHsKIH0KIAotY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmLCBjb25zdCBVQ2hhciosIGludCkKK3N0YXRp
YyBib29sIGdldEFsdGVybmF0ZUZvbnRGb3JDaGFyYWN0ZXJzKGNvbnN0IFFTdHJpbmcmIHN0cmlu
ZywgY29uc3QgUUZvbnQmIHJlcXVlc3RlZEZvbnQsIFFGb250JiBhbHRlcm5hdGVGb250KQogewot
ICAgIHJldHVybiAwOworICAgIFFGb250IGZvbnQocmVxdWVzdGVkRm9udCk7CisgICAgZm9udC5z
ZXRTdHlsZVN0cmF0ZWd5KFFGb250OjpOb0ZvbnRNZXJnaW5nKTsKKworICAgIFFUZXh0TGF5b3V0
IGxheW91dChzdHJpbmcsIGZvbnQpOworICAgIGxheW91dC5iZWdpbkxheW91dCgpOworICAgIGxh
eW91dC5jcmVhdGVMaW5lKCk7CisgICAgbGF5b3V0LmVuZExheW91dCgpOworCisgICAgUUxpc3Q8
UUdseXBocz4gZ2x5cGhMaXN0ID0gbGF5b3V0LmdseXBocygpOworCisgICAgQVNTRVJUKGdseXBo
TGlzdC5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBRR2x5cGhzJiBnbHlwaHMoZ2x5cGhMaXN0
LmF0KDApKTsKKyAgICBRVmVjdG9yPHF1aW50MzI+IGdseXBoSW5kZXhlcyA9IGdseXBocy5nbHlw
aEluZGV4ZXMoKTsKKworICAgIGlmIChnbHlwaEluZGV4ZXMuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBhbHRlcm5hdGVGb250ID0gZ2x5cGhzLmZvbnQoKTsKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzLCBpbnQgbGVuZ3RoKQoreworICAgIFFTdHJpbmcgcXN0cmluZyA9IFFTdHJpbmc6OmZyb21S
YXdEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUUNoYXIqPihjaGFyYWN0ZXJzKSwgbGVuZ3Ro
KTsKKyAgICBRRm9udCBjb21wdXRlZEZvbnQ7CisgICAgaWYgKCFnZXRBbHRlcm5hdGVGb250Rm9y
Q2hhcmFjdGVycyhxc3RyaW5nLCBmb250LmZvbnQoKSwgY29tcHV0ZWRGb250KSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgRm9udFBsYXRmb3JtRGF0YSBhbHRlcm5hdGVGb250KGNvbXB1dGVkRm9u
dCk7CisgICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKCZhbHRlcm5hdGVGb250KTsKIH0KIAog
U2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29u
c3QgRm9udCYgZm9udCkKQEAgLTU3LDcgKzg4LDcgQEAgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKIFNpbXBsZUZv
bnREYXRhKiBGb250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERl
c2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pCiB7CiAgICAgY29uc3QgQXRvbWljU3RyaW5nIGZh
bGxiYWNrRmFtaWx5ID0gUUZvbnQoZm9udERlc2NyaXB0aW9uLmZhbWlseSgpLmZhbWlseSgpKS5s
YXN0UmVzb3J0RmFtaWx5KCk7Ci0gICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKG5ldyBGb250
UGxhdGZvcm1EYXRhKGZvbnREZXNjcmlwdGlvbiwgZmFsbGJhY2tGYW1pbHkpKTsKKyAgICByZXR1
cm4gZ2V0Q2FjaGVkRm9udERhdGEoZm9udERlc2NyaXB0aW9uLCBmYWxsYmFja0ZhbWlseSk7CiB9
CiAKIHZvaWQgRm9udENhY2hlOjpnZXRUcmFpdHNJbkZhbWlseShjb25zdCBBdG9taWNTdHJpbmcm
LCBWZWN0b3I8dW5zaWduZWQ+JikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaAppbmRleCA0YTkyYWNmLi5lMTM1YzlkIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UGxhdGZv
cm1EYXRhLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBs
YXRmb3JtRGF0YS5oCkBAIC03MSw2ICs3MSw3IEBAIGNsYXNzIEZvbnRQbGF0Zm9ybURhdGEgewog
cHVibGljOgogICAgIEZvbnRQbGF0Zm9ybURhdGEoZmxvYXQgc2l6ZSwgYm9vbCBib2xkLCBib29s
IG9ibGlxdWUpOwogICAgIEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiwg
Y29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHlOYW1lLCBpbnQgd29yZFNwYWNpbmcgPSAwLCBpbnQg
bGV0dGVyU3BhY2luZyA9IDApOworICAgIEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udFBsYXRm
b3JtRGF0YSYsIGZsb2F0IHNpemUpOwogICAgIEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgUUZvbnQm
IGZvbnQpCiAgICAgICAgIDogbV9kYXRhKGFkb3B0UmVmKG5ldyBGb250UGxhdGZvcm1EYXRhUHJp
dmF0ZShmb250KSkpCiAgICAgeyB9CkBAIC0xNDksNiArMTUwLDkgQEAgcHVibGljOgogICAgIFN0
cmluZyBkZXNjcmlwdGlvbigpIGNvbnN0OwogI2VuZGlmCiBwcml2YXRlOgorI2lmIEhBVkUoUUdM
WVBIUykKKyAgICBmcmllbmQgY2xhc3MgR2x5cGhQYWdlOworI2VuZGlmCiAgICAgUmVmUHRyPEZv
bnRQbGF0Zm9ybURhdGFQcml2YXRlPiBtX2RhdGE7CiB9OwogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhUXQuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YVF0LmNwcApp
bmRleCAxODVhZTg1Li41YTMwMzFkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhUXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAKQEAgLTg0LDYgKzg0
LDE2IEBAIEZvbnRQbGF0Zm9ybURhdGE6OkZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2Ny
aXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgQXRvCiAgICAgbV9kYXRhLT5zaXplID0gKCFyZXF1
ZXN0ZWRTaXplKSA/IHJlcXVlc3RlZFNpemUgOiBmb250LnBpeGVsU2l6ZSgpOwogfQogCitGb250
UGxhdGZvcm1EYXRhOjpGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIG90
aGVyLCBmbG9hdCBzaXplKQorICAgIDogbV9kYXRhKGFkb3B0UmVmKG5ldyBGb250UGxhdGZvcm1E
YXRhUHJpdmF0ZSgpKSkKK3sKKyAgICBtX2RhdGEtPmZvbnQgPSBvdGhlci5tX2RhdGEtPmZvbnQ7
CisgICAgbV9kYXRhLT5ib2xkID0gb3RoZXIubV9kYXRhLT5ib2xkOworICAgIG1fZGF0YS0+b2Js
aXF1ZSA9IG90aGVyLm1fZGF0YS0+b2JsaXF1ZTsKKyAgICBtX2RhdGEtPmZvbnQuc2V0UGl4ZWxT
aXplKHNpemUpOworICAgIG1fZGF0YS0+c2l6ZSA9IHNpemUgPyBtX2RhdGEtPmZvbnQucGl4ZWxT
aXplKCkgOiAwOworfQorCiBib29sIEZvbnRQbGF0Zm9ybURhdGE6Om9wZXJhdG9yPT0oY29uc3Qg
Rm9udFBsYXRmb3JtRGF0YSYgb3RoZXIpIGNvbnN0CiB7CiAgICAgaWYgKG1fZGF0YSA9PSBvdGhl
ci5tX2RhdGEpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9x
dC9Gb250UXQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0
LmNwcAppbmRleCA2NDZjZDBlLi43Njc2ODg3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlICJG
b250RGVzY3JpcHRpb24uaCIKICNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCiAjaW5jbHVk
ZSAiRm9udFNlbGVjdG9yLmgiCisjaWYgSEFWRShRR0xZUEhTKQorI2luY2x1ZGUgIkdseXBoQnVm
ZmVyLmgiCisjZW5kaWYKICNpbmNsdWRlICJHcmFkaWVudC5oIgogI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCkBAIC03Myw2ICs3NiwzOSBA
QCBzdGF0aWMgUVRleHRMaW5lIHNldHVwTGF5b3V0KFFUZXh0TGF5b3V0KiBsYXlvdXQsIGNvbnN0
IFRleHRSdW4mIHN0eWxlKQogICAgIHJldHVybiBsaW5lOwogfQogCitzdGF0aWMgUVBlbiBmaWxs
UGVuRm9yQ29udGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCkKK3sKKyAgICBpZiAoY3R4LT5maWxs
R3JhZGllbnQoKSkgeworICAgICAgICBRQnJ1c2ggYnJ1c2goKmN0eC0+ZmlsbEdyYWRpZW50KCkt
PnBsYXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGJydXNoLnNldFRyYW5zZm9ybShjdHgtPmZp
bGxHcmFkaWVudCgpLT5ncmFkaWVudFNwYWNlVHJhbnNmb3JtKCkpOworICAgICAgICByZXR1cm4g
UVBlbihicnVzaCwgMCk7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZmlsbFBhdHRlcm4oKSkgewor
ICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOworICAgICAgICByZXR1cm4gUVBlbihRQnJ1
c2goY3R4LT5maWxsUGF0dGVybigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSksIDAp
OworICAgIH0KKworICAgIHJldHVybiBRUGVuKFFDb2xvcihjdHgtPmZpbGxDb2xvcigpKSk7Cit9
CisKK3N0YXRpYyBRUGVuIHN0cm9rZVBlbkZvckNvbnRleHQoR3JhcGhpY3NDb250ZXh0KiBjdHgp
Cit7CisgICAgaWYgKGN0eC0+c3Ryb2tlR3JhZGllbnQoKSkgeworICAgICAgICBRQnJ1c2ggYnJ1
c2goKmN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+cGxhdGZvcm1HcmFkaWVudCgpKTsKKyAgICAgICAg
YnJ1c2guc2V0VHJhbnNmb3JtKGN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+Z3JhZGllbnRTcGFjZVRy
YW5zZm9ybSgpKTsKKyAgICAgICAgcmV0dXJuIFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tu
ZXNzKCkpOworICAgIH0KKworICAgIGlmIChjdHgtPnN0cm9rZVBhdHRlcm4oKSkgeworICAgICAg
ICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOworICAgICAgICBRQnJ1c2ggYnJ1c2goY3R4LT5zdHJv
a2VQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUpKTsKKyAgICAgICAgcmV0
dXJuIFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOworICAgIH0KKworICAgIHJl
dHVybiBRUGVuKFFDb2xvcihjdHgtPnN0cm9rZUNvbG9yKCkpLCBjdHgtPnN0cm9rZVRoaWNrbmVz
cygpKTsKK30KKwogc3RhdGljIHZvaWQgZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250ZXh0KiBj
dHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9t
LCBpbnQgdG8sIGNvbnN0IFFGb250JiBmb250LCBib29sIGlzQ29tcGxleFRleHQpCiB7CiAgICAg
aWYgKHRvIDwgMCkKQEAgLTgxLDMxICsxMTcsMTIgQEAgc3RhdGljIHZvaWQgZHJhd1RleHRDb21t
b24oR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXQK
ICAgICBRUGFpbnRlciAqcCA9IGN0eC0+cGxhdGZvcm1Db250ZXh0KCk7CiAKICAgICBRUGVuIHRl
eHRGaWxsUGVuOwotICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVGaWxs
KSB7Ci0gICAgICAgIGlmIChjdHgtPmZpbGxHcmFkaWVudCgpKSB7Ci0gICAgICAgICAgICBRQnJ1
c2ggYnJ1c2goKmN0eC0+ZmlsbEdyYWRpZW50KCktPnBsYXRmb3JtR3JhZGllbnQoKSk7Ci0gICAg
ICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5maWxsR3JhZGllbnQoKS0+Z3JhZGllbnRT
cGFjZVRyYW5zZm9ybSgpKTsKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBlbihicnVzaCwg
MCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3R4LT5maWxsUGF0dGVybigpKSB7Ci0gICAgICAgICAg
ICBBZmZpbmVUcmFuc2Zvcm0gYWZmaW5lOwotICAgICAgICAgICAgdGV4dEZpbGxQZW4gPSBRUGVu
KFFCcnVzaChjdHgtPmZpbGxQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUp
KSwgMCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgdGV4dEZpbGxQZW4gPSBRUGVuKFFD
b2xvcihjdHgtPmZpbGxDb2xvcigpKSk7Ci0gICAgfQorICAgIGlmIChjdHgtPnRleHREcmF3aW5n
TW9kZSgpICYgVGV4dE1vZGVGaWxsKQorICAgICAgICB0ZXh0RmlsbFBlbiA9IGZpbGxQZW5Gb3JD
b250ZXh0KGN0eCk7CiAKICAgICBRUGVuIHRleHRTdHJva2VQZW47Ci0gICAgaWYgKGN0eC0+dGV4
dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZVN0cm9rZSkgewotICAgICAgICBpZiAoY3R4LT5zdHJv
a2VHcmFkaWVudCgpKSB7Ci0gICAgICAgICAgICBRQnJ1c2ggYnJ1c2goKmN0eC0+c3Ryb2tlR3Jh
ZGllbnQoKS0+cGxhdGZvcm1HcmFkaWVudCgpKTsKLSAgICAgICAgICAgIGJydXNoLnNldFRyYW5z
Zm9ybShjdHgtPnN0cm9rZUdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0oKSk7Ci0g
ICAgICAgICAgICB0ZXh0U3Ryb2tlUGVuID0gUVBlbihicnVzaCwgY3R4LT5zdHJva2VUaGlja25l
c3MoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3R4LT5zdHJva2VQYXR0ZXJuKCkpIHsKLSAgICAg
ICAgICAgIEFmZmluZVRyYW5zZm9ybSBhZmZpbmU7Ci0gICAgICAgICAgICBRQnJ1c2ggYnJ1c2go
Y3R4LT5zdHJva2VQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUpKTsKLSAg
ICAgICAgICAgIHRleHRTdHJva2VQZW4gPSBRUGVuKGJydXNoLCBjdHgtPnN0cm9rZVRoaWNrbmVz
cygpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0ZXh0U3Ryb2tlUGVuID0gUVBlbihR
Q29sb3IoY3R4LT5zdHJva2VDb2xvcigpKSwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7Ci0gICAg
fQorICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVTdHJva2UpCisgICAg
ICAgIHRleHRTdHJva2VQZW4gPSBzdHJva2VQZW5Gb3JDb250ZXh0KGN0eCk7CiAKICAgICBTdHJp
bmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1
bi5sZW5ndGgoKSk7CiAgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYo
c2FuaXRpemVkKTsKQEAgLTI0OCw0MSArMjY1LDcyIEBAIHN0YXRpYyB2b2lkIGRyYXdUZXh0Q29t
bW9uKEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0
CiAgICAgfQogfQogCi12b2lkIEZvbnQ6OmRyYXdTaW1wbGVUZXh0KEdyYXBoaWNzQ29udGV4dCog
Y3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJv
bSwgaW50IHRvKSBjb25zdAordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250
ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7Ci0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NI
RUNLKDQsIDcsIDApCi0gICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4sIHBvaW50LCBmcm9tLCB0
bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0gKi9mYWxzZSk7Ci0jZWxzZQotICAgIFFfQVNT
RVJUKGZhbHNlKTsKLSNlbmRpZgorICAgIGRyYXdUZXh0Q29tbW9uKGN0eCwgcnVuLCBwb2ludCwg
ZnJvbSwgdG8sIGZvbnQoKSwgLyogaXNDb21wbGV4VGV4dCA9ICovdHJ1ZSk7CiB9CiAKLXZvaWQg
Rm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVu
JiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAor
ZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwg
SGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiwgR2x5cGhPdmVyZmxvdyopIGNvbnN0CiB7
Ci0gICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4sIHBvaW50LCBmcm9tLCB0bywgZm9udCgpLCAv
KiBpc0NvbXBsZXhUZXh0ID0gKi90cnVlKTsKKyAgICBpZiAoIXByaW1hcnlGb250KCktPnBsYXRm
b3JtRGF0YSgpLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXJ1bi5sZW5n
dGgoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocnVuLmxlbmd0aCgpID09IDEgJiYg
dHJlYXRBc1NwYWNlKHJ1blswXSkpCisgICAgICAgIHJldHVybiBRRm9udE1ldHJpY3MoZm9udCgp
KS53aWR0aChzcGFjZSkgKyBydW4uZXhwYW5zaW9uKCk7CisKKyAgICBTdHJpbmcgc2FuaXRpemVk
ID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7
CisgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsK
KworICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3RyaW5nKTsKKyAgICAv
LyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFjaW5nIG9uIHRoZSBmaXJzdCBj
aGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQorICAgIGlmICh0cmVhdEFzU3Bh
Y2UocnVuWzBdKSkKKyAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5nOworCisgICAgcmV0dXJuIHcg
KyBydW4uZXhwYW5zaW9uKCk7CiB9CiAKLWludCBGb250OjplbXBoYXNpc01hcmtBc2NlbnQoY29u
c3QgQXRvbWljU3RyaW5nJikgY29uc3QKK2ludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNv
bXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRpb24sIGJvb2wpIGNvbnN0
CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBTdHJpbmcgc2Fu
aXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5n
dGgoKSk7CisgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRp
emVkKTsKKworICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7CisgICAgUVRl
eHRMaW5lIGxpbmUgPSBzZXR1cExheW91dCgmbGF5b3V0LCBydW4pOworICAgIHJldHVybiBsaW5l
LnhUb0N1cnNvcihwb3NpdGlvbik7CiB9CiAKLWludCBGb250OjplbXBoYXNpc01hcmtEZXNjZW50
KGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0CitGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVj
dEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcHQs
IGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7
Ci0gICAgcmV0dXJuIDA7CisgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNw
YWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOworICAgIFFTdHJpbmcgc3RyaW5n
ID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisKKyAgICBRVGV4dExheW91dCBs
YXlvdXQoc3RyaW5nLCBmb250KCkpOworICAgIFFUZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQo
JmxheW91dCwgcnVuKTsKKworICAgIGZsb2F0IHgxID0gbGluZS5jdXJzb3JUb1goZnJvbSk7Cisg
ICAgZmxvYXQgeDIgPSBsaW5lLmN1cnNvclRvWCh0byk7CisgICAgaWYgKHgyIDwgeDEpCisgICAg
ICAgIHFTd2FwKHgxLCB4Mik7CisKKyAgICByZXR1cm4gRmxvYXRSZWN0KHB0LngoKSArIHgxLCBw
dC55KCksIHgyIC0geDEsIGgpOwogfQogCi1pbnQgRm9udDo6ZW1waGFzaXNNYXJrSGVpZ2h0KGNv
bnN0IEF0b21pY1N0cmluZyYpIGNvbnN0Citib29sIEZvbnQ6OmNhblJldHVybkZhbGxiYWNrRm9u
dHNGb3JDb21wbGV4VGV4dCgpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4g
MDsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgRm9udDo6ZHJhd0VtcGhhc2lzTWFya3NG
b3JTaW1wbGVUZXh0KEdyYXBoaWNzQ29udGV4dCogLyogY29udGV4dCAqLywgY29uc3QgVGV4dFJ1
biYgLyogcnVuICovLCBjb25zdCBBdG9taWNTdHJpbmcmIC8qIG1hcmsgKi8sIGNvbnN0IEZsb2F0
UG9pbnQmIC8qIHBvaW50ICovLCBpbnQgLyogZnJvbSAqLywgaW50IC8qIHRvICovKSBjb25zdAor
UUZvbnQgRm9udDo6Zm9udCgpIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBR
Rm9udCBmID0gcHJpbWFyeUZvbnQoKS0+Z2V0UXRGb250KCk7CisgICAgaWYgKG1fbGV0dGVyU3Bh
Y2luZyAhPSAwKQorICAgICAgICBmLnNldExldHRlclNwYWNpbmcoUUZvbnQ6OkFic29sdXRlU3Bh
Y2luZywgbV9sZXR0ZXJTcGFjaW5nKTsKKyAgICBpZiAobV93b3JkU3BhY2luZyAhPSAwKQorICAg
ICAgICBmLnNldFdvcmRTcGFjaW5nKG1fd29yZFNwYWNpbmcpOworICAgIHJldHVybiBmOwogfQog
CiB2b2lkIEZvbnQ6OmRyYXdFbXBoYXNpc01hcmtzRm9yQ29tcGxleFRleHQoR3JhcGhpY3NDb250
ZXh0KiAvKiBjb250ZXh0ICovLCBjb25zdCBUZXh0UnVuJiAvKiBydW4gKi8sIGNvbnN0IEF0b21p
Y1N0cmluZyYgLyogbWFyayAqLywgY29uc3QgRmxvYXRQb2ludCYgLyogcG9pbnQgKi8sIGludCAv
KiBmcm9tICovLCBpbnQgLyogdG8gKi8pIGNvbnN0CkBAIC0yOTAsNTEgKzMzOCw2NSBAQCB2b2lk
IEZvbnQ6OmRyYXdFbXBoYXNpc01hcmtzRm9yQ29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiAv
KiBjb250ZXh0ICovLCBjb25zdAogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLWZsb2F0IEZv
bnQ6OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgR2x5cGhCdWZm
ZXIqIGdseXBoQnVmZmVyLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNr
Rm9udHMsIEdseXBoT3ZlcmZsb3cqIGdseXBoT3ZlcmZsb3cpIGNvbnN0CisjaWYgSEFWRShRR0xZ
UEhTKQordm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29u
c3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhLCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZm
ZXIsIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29u
c3QKIHsKLSAgICBpZiAoIXByaW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLnNpemUoKSkKLSAg
ICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuOwogCi0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDcs
IDApCi0gICAgaWYgKCFydW4ubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiAwOworICAgIGJvb2wg
c2hvdWxkRmlsbCA9IGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVGaWxsOwor
ICAgIGJvb2wgc2hvdWxkU3Ryb2tlID0gY29udGV4dC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0
TW9kZVN0cm9rZTsKIAotICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFj
ZXMocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKTsKLSAgICBRU3RyaW5nIHN0cmluZyA9
IGZyb21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOworICAgIC8vIFN0cm9raW5nIHRleHQg
c2hvdWxkIGFsd2F5cyB0YWtlIHRoZSBjb21wbGV4IHBhdGguCisgICAgQVNTRVJUKCFzaG91bGRT
dHJva2UpOwogCi0gICAgaW50IHcgPSBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0aChzdHJpbmcs
IC0xLCBRdDo6VGV4dEJ5cGFzc1NoYXBpbmcpOworICAgIC8vIFNoYWRvd2VkIHRleHQgc2hvdWxk
IGFsd2F5cyB0YWtlIHRoZSBjb21wbGV4IHBhdGguCisgICAgQVNTRVJUKGNvbnRleHQtPmNvbnRl
eHRTaGFkb3coKS0+bV90eXBlID09IENvbnRleHRTaGFkb3c6Ok5vU2hhZG93KTsKIAotICAgIC8v
IFdlYktpdCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3b3JkIHNwYWNpbmcgb24gdGhlIGZpcnN0IGNo
YXJhY3RlciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0IGRvZXMpCi0gICAgaWYgKHRyZWF0QXNTcGFj
ZShydW5bMF0pKQotICAgICAgICB3IC09IG1fd29yZFNwYWNpbmc7CisgICAgaWYgKCFzaG91bGRG
aWxsICYmICFzaG91bGRTdHJva2UpCisgICAgICAgIHJldHVybjsKIAotICAgIHJldHVybiB3ICsg
cnVuLmV4cGFuc2lvbigpOwotI2Vsc2UKLSAgICBRX0FTU0VSVChmYWxzZSk7Ci0gICAgcmV0dXJu
IDA7Ci0jZW5kaWYKLX0KKyAgICBRVmVjdG9yPHF1aW50MzI+IGdseXBoSW5kZXhlczsKKyAgICBR
VmVjdG9yPFFQb2ludEY+IHBvc2l0aW9uczsKKyAgICBmbG9hdCB4ID0gMDsKIAotZmxvYXQgRm9u
dDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxj
b25zdCBTaW1wbGVGb250RGF0YSo+KiwgR2x5cGhPdmVyZmxvdyopIGNvbnN0Ci17Ci0gICAgaWYg
KCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5zaXplKCkpCi0gICAgICAgIHJldHVybiAw
OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKKyAgICAgICAgR2x5
cGggZ2x5cGggPSBnbHlwaEJ1ZmZlci5nbHlwaEF0KGZyb20gKyBpKTsKKyAgICAgICAgZmxvYXQg
YWR2YW5jZSA9IGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSk7CisgICAgICAgIGlmICgh
Z2x5cGgpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZ2x5cGhJbmRleGVzLmFwcGVu
ZChnbHlwaCk7CisgICAgICAgIHBvc2l0aW9ucy5hcHBlbmQoUVBvaW50Rih4LCAwKSk7CisgICAg
ICAgIHggKz0gYWR2YW5jZTsKKyAgICB9CiAKLSAgICBpZiAoIXJ1bi5sZW5ndGgoKSkKLSAgICAg
ICAgcmV0dXJuIDA7CisgICAgUUdseXBocyBxdEdseXBoczsKKyAgICBxdEdseXBocy5zZXRHbHlw
aEluZGV4ZXMoZ2x5cGhJbmRleGVzKTsKKyAgICBxdEdseXBocy5zZXRQb3NpdGlvbnMocG9zaXRp
b25zKTsKKyAgICBxdEdseXBocy5zZXRGb250KGZvbnREYXRhLT5nZXRRdEZvbnQoKSk7CiAKLSAg
ICBpZiAocnVuLmxlbmd0aCgpID09IDEgJiYgdHJlYXRBc1NwYWNlKHJ1blswXSkpCi0gICAgICAg
IHJldHVybiBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0aChzcGFjZSkgKyBydW4uZXhwYW5zaW9u
KCk7CisgICAgUVBhaW50ZXIqIHBhaW50ZXIgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsK
IAotICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMocnVuLmNoYXJh
Y3RlcnMoKSwgcnVuLmxlbmd0aCgpKTsKLSAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdEYXRh
V2l0aG91dFJlZihzYW5pdGl6ZWQpOworICAgIFFQZW4gcHJldmlvdXNQZW4gPSBwYWludGVyLT5w
ZW4oKTsKKyAgICBwYWludGVyLT5zZXRQZW4oZmlsbFBlbkZvckNvbnRleHQoY29udGV4dCkpOwor
ICAgIHBhaW50ZXItPmRyYXdHbHlwaHMocG9pbnQsIHF0R2x5cGhzKTsKKyAgICBwYWludGVyLT5z
ZXRQZW4ocHJldmlvdXNQZW4pOworfQogCi0gICAgaW50IHcgPSBRRm9udE1ldHJpY3MoZm9udCgp
KS53aWR0aChzdHJpbmcpOwotICAgIC8vIFdlYktpdCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3b3Jk
IHNwYWNpbmcgb24gdGhlIGZpcnN0IGNoYXJhY3RlciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0IGRv
ZXMpCi0gICAgaWYgKHRyZWF0QXNTcGFjZShydW5bMF0pKQotICAgICAgICB3IC09IG1fd29yZFNw
YWNpbmc7Citib29sIEZvbnQ6OmNhbkV4cGFuZEFyb3VuZElkZW9ncmFwaHNJbkNvbXBsZXhUZXh0
KCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKLSAgICByZXR1cm4gdyArIHJ1bi5leHBhbnNp
b24oKTsKKyNlbHNlIC8vICFIQVZFKFFHTFlQSFMpCisKK3ZvaWQgRm9udDo6ZHJhd1NpbXBsZVRl
eHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisjaWYgUVRfVkVSU0lPTiA+
PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDcsIDApCisgICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4s
IHBvaW50LCBmcm9tLCB0bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0gKi9mYWxzZSk7Cisj
ZWxzZQorICAgIFFfQVNTRVJUKGZhbHNlKTsKKyNlbmRpZgogfQogCiBpbnQgRm9udDo6b2Zmc2V0
Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRp
b24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0CkBAIC0zNjUsMTYgKzQyNywzMyBA
QCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4m
IHJ1biwgZmxvYXQgcG9zaXRpb24sIGJvbwogI2VuZGlmCiB9CiAKLWludCBGb250OjpvZmZzZXRG
b3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRp
b24sIGJvb2wpIGNvbnN0CisKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KGNv
bnN0IFRleHRSdW4mIHJ1biwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyLCBIYXNoU2V0PGNvbnN0
IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMsIEdseXBoT3ZlcmZsb3cqIGdseXBoT3Zl
cmZsb3cpIGNvbnN0CiB7CisgICAgaWYgKCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5z
aXplKCkpCisgICAgICAgIHJldHVybiAwOworCisjaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9O
X0NIRUNLKDQsIDcsIDApCisgICAgaWYgKCFydW4ubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAw
OworCiAgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hh
cmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwogICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0Rh
dGFXaXRob3V0UmVmKHNhbml0aXplZCk7CiAKLSAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5n
LCBmb250KCkpOwotICAgIFFUZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVu
KTsKLSAgICByZXR1cm4gbGluZS54VG9DdXJzb3IocG9zaXRpb24pOworICAgIGludCB3ID0gUUZv
bnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3RyaW5nLCAtMSwgUXQ6OlRleHRCeXBhc3NTaGFwaW5n
KTsKKworICAgIC8vIFdlYktpdCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3b3JkIHNwYWNpbmcgb24g
dGhlIGZpcnN0IGNoYXJhY3RlciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0IGRvZXMpCisgICAgaWYg
KHRyZWF0QXNTcGFjZShydW5bMF0pKQorICAgICAgICB3IC09IG1fd29yZFNwYWNpbmc7CisKKyAg
ICByZXR1cm4gdyArIHJ1bi5leHBhbnNpb24oKTsKKyNlbHNlCisgICAgUV9BU1NFUlQoZmFsc2Up
OworICAgIHJldHVybiAwOworI2VuZGlmCiB9CiAKKwogRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlv
blJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYg
cHQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewogI2lmIFFUX1ZFUlNJT04gPj0g
UVRfVkVSU0lPTl9DSEVDSyg0LCA3LCAwKQpAQCAtMzkyLDIyICs0NzEsNiBAQCBGbG9hdFJlY3Qg
Rm9udDo6c2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25z
dCBGbG9hdFBvaW50JgogI2VuZGlmCiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0
Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwdCwg
aW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHNhbml0aXplZCA9
IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwot
ICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7Ci0K
LSAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBmb250KCkpOwotICAgIFFUZXh0TGluZSBs
aW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsKLQotICAgIGZsb2F0IHgxID0gbGluZS5j
dXJzb3JUb1goZnJvbSk7Ci0gICAgZmxvYXQgeDIgPSBsaW5lLmN1cnNvclRvWCh0byk7Ci0gICAg
aWYgKHgyIDwgeDEpCi0gICAgICAgIHFTd2FwKHgxLCB4Mik7Ci0KLSAgICByZXR1cm4gRmxvYXRS
ZWN0KHB0LngoKSArIHgxLCBwdC55KCksIHgyIC0geDEsIGgpOwotfQotCiBib29sIEZvbnQ6OmNh
blJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCgpCiB7CiAgICAgcmV0dXJuIGZhbHNl
OwpAQCAtNDM0LDUgKzQ5Nyw3IEBAIFFGb250IEZvbnQ6OmZvbnQoKSBjb25zdAogICAgIHJldHVy
biBmOwogfQogCisjZW5kaWYgLy8gSEFWRShRR0xZUEhTKQorCiB9CiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVR
dC5jcHAKaW5kZXggMjEyMTIwNi4uNjc0MTk1OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAKQEAg
LTIzLDggKzIzLDYxIEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiR2x5cGhQYWdl
VHJlZU5vZGUuaCIKIAorI2lmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0
YS5oIgorI2luY2x1ZGUgPFFGb250TWV0cmljc0Y+CisjaW5jbHVkZSA8UVRleHRMYXlvdXQ+Cisj
ZW5kaWYKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCisjaWYgSEFWRShRR0xZUEhTKQorCitzdGF0
aWMgR2x5cGggZ2V0R2x5cGhGb3JDaGFyYWN0ZXJBbmRGb250KFFDaGFyIGNoYXJhY3RlciwgY29u
c3QgUUZvbnQmIGZvbnQpCit7CisgICAgUVRleHRMYXlvdXQgbGF5b3V0KGNoYXJhY3RlciwgZm9u
dCk7CisgICAgbGF5b3V0LmJlZ2luTGF5b3V0KCk7CisgICAgbGF5b3V0LmNyZWF0ZUxpbmUoKTsK
KyAgICBsYXlvdXQuZW5kTGF5b3V0KCk7CisKKyAgICBRTGlzdDxRR2x5cGhzPiBnbHlwaExpc3Qg
PSBsYXlvdXQuZ2x5cGhzKCk7CisgICAgQVNTRVJUKGdseXBoTGlzdC5zaXplKCkgPT0gMSk7CisK
KyAgICBjb25zdCBRR2x5cGhzJiBnbHlwaHMoZ2x5cGhMaXN0LmF0KDApKTsKKyAgICBRVmVjdG9y
PHF1aW50MzI+IGdseXBoSW5kZXhlcyA9IGdseXBocy5nbHlwaEluZGV4ZXMoKTsKKworICAgIGlm
IChnbHlwaEluZGV4ZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVy
biBnbHlwaEluZGV4ZXMuYXQoMCk7Cit9CitcCitib29sIEdseXBoUGFnZTo6ZmlsbCh1bnNpZ25l
ZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgYnVmZmVy
TGVuZ3RoLCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEpCit7CisgICAgUUZvbnQgZm9u
dCA9IGZvbnREYXRhLT5nZXRRdEZvbnQoKTsKKyAgICBmb250LnNldFN0eWxlU3RyYXRlZ3koUUZv
bnQ6Ok5vRm9udE1lcmdpbmcpOworCisgICAgUUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzKGZvbnQp
OworCisgICAgUVN0cmluZyBxc3RyaW5nID0gUVN0cmluZzo6ZnJvbVJhd0RhdGEocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBRQ2hhcio+KGJ1ZmZlciksIHN0YXRpY19jYXN0PGludD4oYnVmZmVyTGVu
Z3RoKSk7CisKKyAgICBib29sIGhhdmVHbHlwaHMgPSBmYWxzZTsKKworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBHbHlwaCBnbHlwaCA9IGdldEds
eXBoRm9yQ2hhcmFjdGVyQW5kRm9udChxc3RyaW5nLmF0KGkpLCBmb250KTsKKyAgICAgICAgaWYg
KCFnbHlwaCkKKyAgICAgICAgICAgIHNldEdseXBoRGF0YUZvckluZGV4KG9mZnNldCArIGksIDAs
IDApOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhhdmVHbHlwaHMgPSB0cnVlOworICAg
ICAgICAgICAgZm9udERhdGEtPm1fZ2x5cGhUb1dpZHRoTWFwLnNldE1ldHJpY3NGb3JHbHlwaChn
bHlwaCwgZm9udE1ldHJpY3Mud2lkdGgocXN0cmluZy5hdChpKSkpOworICAgICAgICAgICAgc2V0
R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgZ2x5cGgsIGZvbnREYXRhKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICByZXR1cm4gaGF2ZUdseXBoczsKK30KKworI2Vsc2UKKwogdm9pZCBHbHlw
aFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEoY29uc3QgRm9udERhdGEqKQog
ewogfQpAQCAtMzIsNSArODUsNiBAQCB2b2lkIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVD
dXN0b21Gb250RGF0YShjb25zdCBGb250RGF0YSopCiB2b2lkIEdseXBoUGFnZVRyZWVOb2RlOjpw
cnVuZVRyZWVGb250RGF0YShjb25zdCBXZWJDb3JlOjpTaW1wbGVGb250RGF0YSopCiB7CiB9Cisj
ZW5kaWYgLy8gSEFWRShRR0xZUEhTKQogCiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L1NpbXBsZUZvbnREYXRhUXQuY3BwCmluZGV4IDVkMGIzMDIu
LjBjZTJhZjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0
L1NpbXBsZUZvbnREYXRhUXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3F0L1NpbXBsZUZvbnREYXRhUXQuY3BwCkBAIC0yNCw2ICsyNCw5IEBACiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKIAorI2lmIEhBVkUoUUdMWVBI
UykKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2VuZGlmCiAjaW5jbHVkZSA8UUZvbnRN
ZXRyaWNzRj4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMzMsMTEgKzM2LDc5IEBAIHZvaWQg
U2ltcGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkKICAgICBtX3RyZWF0QXNGaXhlZFBpdGNo
ID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpLmZpeGVkUGl0Y2goKTsKIH0KIAorI2lmIEhBVkUoUUdM
WVBIUykKKworc3RhdGljIGNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZyYWN0aW9uID0gMC43Oworc3Rh
dGljIGNvbnN0IGZsb2F0IGVtcGhhc2lzTWFya0ZyYWN0aW9uID0gMC41OworCitib29sIFNpbXBs
ZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGlu
dCBsZW5ndGgpIGNvbnN0Cit7CisgICAgUUZvbnRNZXRyaWNzRiBmbShtX3BsYXRmb3JtRGF0YS5m
b250KCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAg
ICBpZiAoIWZtLmluRm9udChzdGF0aWNfY2FzdDxRQ2hhcj4oY2hhcmFjdGVyc1tpXSkpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitm
bG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoKSBjb25zdAor
eworICAgIC8vIFRoZSBnbHlwaC10by13aWR0aCBtYXAgaXMgcG9wdWxhdGVkIGJ5IEdseXBoUGFn
ZTo6ZmlsbCgpCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisK
K1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6c2NhbGVkRm9udERhdGEoY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGZsb2F0IHNjYWxlRmFjdG9yKSBjb25zdAor
eworICAgIGNvbnN0IGZsb2F0IHNjYWxlZFNpemUgPSBscm91bmRmKGZvbnREZXNjcmlwdGlvbi5j
b21wdXRlZFNpemUoKSAqIHNjYWxlRmFjdG9yKTsKKyAgICByZXR1cm4gbmV3IFNpbXBsZUZvbnRE
YXRhKEZvbnRQbGF0Zm9ybURhdGEobV9wbGF0Zm9ybURhdGEsIHNjYWxlZFNpemUpLCBpc0N1c3Rv
bUZvbnQoKSwgZmFsc2UpOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNt
YWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBj
b25zdAoreworICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEpCisgICAgICAgIG1fZGVyaXZlZEZv
bnREYXRhID0gRGVyaXZlZEZvbnREYXRhOjpjcmVhdGUoaXNDdXN0b21Gb250KCkpOworICAgIGlm
ICghbV9kZXJpdmVkRm9udERhdGEtPnNtYWxsQ2FwcykKKyAgICAgICAgbV9kZXJpdmVkRm9udERh
dGEtPnNtYWxsQ2FwcyA9IHNjYWxlZEZvbnREYXRhKGZvbnREZXNjcmlwdGlvbiwgc21hbGxDYXBz
RnJhY3Rpb24pOworCisgICAgcmV0dXJuIG1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMuZ2V0
KCk7Cit9CisKK1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6ZW1waGFzaXNNYXJrRm9u
dERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX2Rlcml2ZWRGb250RGF0YSkKKyAgICAgICAgbV9kZXJpdmVkRm9udERhdGEgPSBE
ZXJpdmVkRm9udERhdGE6OmNyZWF0ZShpc0N1c3RvbUZvbnQoKSk7CisgICAgaWYgKCFtX2Rlcml2
ZWRGb250RGF0YS0+ZW1waGFzaXNNYXJrKQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YS0+ZW1w
aGFzaXNNYXJrID0gc2NhbGVkRm9udERhdGEoZm9udERlc2NyaXB0aW9uLCBlbXBoYXNpc01hcmtG
cmFjdGlvbik7CisKKyAgICByZXR1cm4gbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFyay5n
ZXQoKTsKK30KKworRmxvYXRSZWN0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUJvdW5kc0Zvckds
eXBoKEdseXBoKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEZs
b2F0UmVjdCgpOworfQorI2Vsc2UKIGJvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hhcmFj
dGVycyhjb25zdCBVQ2hhciosIGludCkgY29uc3QKIHsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAor
dm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1HbHlwaEluaXQoKQoreworICAgIGlmICghbV9w
bGF0Zm9ybURhdGEuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisgICAgbV9zcGFjZUdseXBoID0g
MDsKKyAgICBtX2FkanVzdGVkU3BhY2VXaWR0aCA9IG1fc3BhY2VXaWR0aDsKKyAgICBkZXRlcm1p
bmVQaXRjaCgpOworICAgIG1fbWlzc2luZ0dseXBoRGF0YS5mb250RGF0YSA9IHRoaXM7CisgICAg
bV9taXNzaW5nR2x5cGhEYXRhLmdseXBoID0gMDsKK30KKyNlbmRpZgorCiB2b2lkIFNpbXBsZUZv
bnREYXRhOjpwbGF0Zm9ybUluaXQoKQogewogICAgIGlmICghbV9wbGF0Zm9ybURhdGEuc2l6ZSgp
KSB7CkBAIC01NiwyMSArMTI3LDExIEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5p
dCgpCiAgICAgbV9zcGFjZVdpZHRoID0gZm0ud2lkdGgoUUxhdGluMUNoYXIoJyAnKSk7CiB9CiAK
LXZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtR2x5cGhJbml0KCkKLXsKLSAgICBpZiAoIW1f
cGxhdGZvcm1EYXRhLnNpemUoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fc3BhY2VHbHlwaCA9
IDA7Ci0gICAgZGV0ZXJtaW5lUGl0Y2goKTsKLSAgICBtX21pc3NpbmdHbHlwaERhdGEuZm9udERh
dGEgPSB0aGlzOwotICAgIG1fbWlzc2luZ0dseXBoRGF0YS5nbHlwaCA9IDA7Ci19Ci0KIHZvaWQg
U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtQ2hhcldpZHRoSW5pdCgpCiB7CiAgICAgaWYgKCFtX3Bs
YXRmb3JtRGF0YS5zaXplKCkpCiAgICAgICAgIHJldHVybjsKLSAgICBRRm9udE1ldHJpY3MgZm0o
bV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICBRRm9udE1ldHJpY3NGIGZtKG1fcGxhdGZvcm1E
YXRhLmZvbnQoKSk7CiAgICAgbV9hdmdDaGFyV2lkdGggPSBmbS5hdmVyYWdlQ2hhcldpZHRoKCk7
CiAgICAgbV9tYXhDaGFyV2lkdGggPSBmbS5tYXhXaWR0aCgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>91928</attachid>
            <date>2011-05-02 09:29:42 -0700</date>
            <delta_ts>2011-05-02 09:53:08 -0700</delta_ts>
            <desc>Proposed patch v2</desc>
            <filename>bug-51106-v2.diff</filename>
            <type>text/plain</type>
            <size>32399</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxMDU2NzcwLi4wMzJhNDRhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTkg
QEAKKzIwMTEtMDUtMDIgIEFuZHJlYXMgS2xpbmcgIDxrbGluZ0B3ZWJraXQub3JnPgorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gSW1wbGVtZW50
IHRoZSBmYXN0IGZvbnQgcGF0aCBmb3IgUXQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTUxMTA2CisKKyAgICAgICAgVXNlIHRoZSBuZXcgUVJhd0ZvbnQg
YW5kIFFHbHlwaHMgQVBJcyBpbiBRdCA0LjggdG8gaW1wbGVtZW50IHRoZSBmYXN0IHBhdGhzIGZv
cgorICAgICAgICByZW5kZXJpbmcgYW5kIG1lYXN1cmVtZW50IG9mIHNpbXBsZSB0ZXh0LgorCisg
ICAgICAgIFNpbmNlIHRoaXMgaXMgc3RpbGwgdW5yZWxlYXNlZCBBUEksIGl0J3MgZ3VhcmRlZCBi
eSBIQVZFKFFHTFlQSFMpIHVudGlsIHRoZSBuZXcKKyAgICAgICAgQVBJcyBhcmUgZnVsbHkgaW50
ZWdyYXRlZCBpbnRvIHRoZSA0LjggcmVsZWFzZSBicmFuY2guCisKKyAgICAgICAgKiBXZWJDb3Jl
LnBybzoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OmRyYXdUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmNvZGVQYXRo
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmdldEFsdGVybmF0
ZUZvbnRGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0TGFz
dFJlc29ydEZhbGxiYWNrRm9udCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9u
dFBsYXRmb3JtRGF0YS5oOgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YVByaXZh
dGU6OkZvbnRQbGF0Zm9ybURhdGFQcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0
Zm9ybURhdGE6OkZvbnRQbGF0Zm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRm
b3JtRGF0YTo6cmF3Rm9udCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBs
YXRmb3JtRGF0YVF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGE6OkZv
bnRQbGF0Zm9ybURhdGEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpmaWxsUGVuRm9yQ29udGV4dCk6CisgICAgICAgIChXZWJD
b3JlOjpzdHJva2VQZW5Gb3JDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdUZXh0Q29t
bW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcGxl
eFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgIChX
ZWJDb3JlOjpGb250OjpjYW5FeHBhbmRBcm91bmRJZGVvZ3JhcGhzSW5Db21wbGV4VGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3U2ltcGxlVGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHbHlw
aFBhZ2U6OmZpbGwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L1NpbXBsZUZvbnRE
YXRhUXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OmRldGVybWluZVBp
dGNoKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3Rl
cnMpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JH
bHlwaCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6c2NhbGVkRm9udERhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjplbXBoYXNpc01hcmtGb250RGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlw
aCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1HbHlwaEluaXQp
OgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCk6CisgICAg
ICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1DaGFyV2lkdGhJbml0KToKKwog
MjAxMS0wNS0wMSAgQWJoaXNoZWsgQXJ5YSAgPGluZmVybm9AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IEVyaWMgQ2FybHNvbi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUucHJvIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KaW5kZXggNjE1YzNmZS4u
ODEwNjFjZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KKysrIGIvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KQEAgLTE5MzUsNiArMTkzNSw3IEBAIEhFQURFUlMgKz0g
XAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRNZXRyaWNzLmggXAogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL0ZvbnQuaCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR2VuZXJhdGVkSW1hZ2UuaCBc
CisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuaCBcCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhZGllbnQuaCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3ND
b250ZXh0LmggXAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaCBcCkBAIC0z
MDU2LDYgKzMwNTcsMjAgQEAgY29udGFpbnMoREVGSU5FUywgV1RGX1VTRV9RVF9CRUFSRVI9MSkg
ewogICAgICAgICBwbGF0Zm9ybS9uZXR3b3JrL3F0L05ldHdvcmtTdGF0ZU5vdGlmaWVyUXQuY3Bw
CiB9CiAKKyFsZXNzVGhhbihRVF9NQUpPUl9WRVJTSU9OLDQpOiFsZXNzVGhhbihRVF9NSU5PUl9W
RVJTSU9OLCA4KTpIQVZFX1FHTFlQSFM9MQorCishaXNFbXB0eShIQVZFX1FHTFlQSFMpIHsKKyAg
ICBERUZJTkVTICs9IEhBVkVfUUdMWVBIUz0xCisKKyAgICBTT1VSQ0VTICs9IFwKKyAgICAgICAg
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dy
YXBoaWNzL0dseXBoUGFnZVRyZWVOb2RlLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNz
L1dpZHRoSXRlcmF0b3IuY3BwCisKKyAgICBIRUFERVJTICs9IFwKKyAgICAgICAgcGxhdGZvcm0v
Z3JhcGhpY3MvV2lkdGhJdGVyYXRvci5oCit9CisKIGNvbnRhaW5zKERFRklORVMsIEVOQUJMRV9H
RU9MT0NBVElPTj0xKSB7CiAgICAgdjggewogICAgICAgICBTT1VSQ0VTICs9IFwKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKaW5kZXggYmJjMzliOC4uNjVlZjZiOCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKQEAgLTI3LDYgKzI3
LDEwIEBACiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAj
aW5jbHVkZSAiRm9udFRyYW5zY29kZXIuaCIKKyNpZiBQTEFURk9STShRVCkgJiYgSEFWRShRR0xZ
UEhTKQorI2luY2x1ZGUgIkNvbnRleHRTaGFkb3cuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNlbmRpZgogI2luY2x1ZGUgIkludFBvaW50LmgiCiAjaW5jbHVkZSAiR2x5cGhCdWZm
ZXIuaCIKICNpbmNsdWRlICJUZXh0UnVuLmgiCkBAIC0xMzksNyArMTQzLDE0IEBAIHZvaWQgRm9u
dDo6ZHJhd1RleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4s
IGNvbnN0IEZsb2F0UG9pCiAgICAgfQogI2VuZGlmCiAKLSAgICBpZiAoY29kZVBhdGgocnVuKSAh
PSBDb21wbGV4KQorICAgIENvZGVQYXRoIGNvZGVQYXRoVG9Vc2UgPSBjb2RlUGF0aChydW4pOwor
CisjaWYgUExBVEZPUk0oUVQpICYmIEhBVkUoUUdMWVBIUykKKyAgICBpZiAoY29udGV4dC0+dGV4
dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZVN0cm9rZSB8fCBjb250ZXh0LT5jb250ZXh0U2hhZG93
KCktPm1fdHlwZSAhPSBDb250ZXh0U2hhZG93OjpOb1NoYWRvdykKKyAgICAgICAgY29kZVBhdGhU
b1VzZSA9IENvbXBsZXg7CisjZW5kaWYKKworICAgIGlmIChjb2RlUGF0aFRvVXNlICE9IENvbXBs
ZXgpCiAgICAgICAgIHJldHVybiBkcmF3U2ltcGxlVGV4dChjb250ZXh0LCBydW4sIHBvaW50LCBm
cm9tLCB0byk7CiAKICAgICByZXR1cm4gZHJhd0NvbXBsZXhUZXh0KGNvbnRleHQsIHJ1biwgcG9p
bnQsIGZyb20sIHRvKTsKQEAgLTI3NSw3ICsyODYsNyBAQCBGb250OjpDb2RlUGF0aCBGb250Ojpj
b2RlUGF0aChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0CiAgICAgaWYgKHNfY29kZVBhdGggIT0g
QXV0bykKICAgICAgICAgcmV0dXJuIHNfY29kZVBhdGg7CiAKLSNpZiBQTEFURk9STShRVCkKKyNp
ZiBQTEFURk9STShRVCkgJiYgIUhBVkUoUUdMWVBIUykKICAgICBpZiAocnVuLmV4cGFuc2lvbigp
IHx8IHJ1bi5ydGwoKSB8fCBpc1NtYWxsQ2FwcygpIHx8IHdvcmRTcGFjaW5nKCkgfHwgbGV0dGVy
U3BhY2luZygpKQogICAgICAgICByZXR1cm4gQ29tcGxleDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKaW5kZXgg
YWY5OTllYS4uMjQwODU0MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCkBAIC0zNzUsNyArMzc1LDcgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmRyYXdJbWFnZShJbWFnZSogaW1hZ2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xv
clNwYWNlLCBjb25zdAogICAgIGRyYXdJbWFnZShpbWFnZSwgc3R5bGVDb2xvclNwYWNlLCBGbG9h
dFJlY3QoZGVzdCksIHNyY1JlY3QsIG9wLCB1c2VMb3dRdWFsaXR5U2NhbGUpOwogfQogCi0jaWYg
IU9TKFdJTkNFKSB8fCBQTEFURk9STShRVCkKKyNpZiAhT1MoV0lOQ0UpIHx8IChQTEFURk9STShR
VCkgJiYgIUhBVkUoUUdMWVBIUykpCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1RleHQoY29u
c3QgRm9udCYgZm9udCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCwgaW50IGZyb20sIGludCB0bykKIHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEu
Y3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3Bw
CmluZGV4IGYyYTA2ZjQuLjMzZjlhZTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5jcHAKQEAgLTEyMiw3ICsxMjIsNyBAQCBTaW1w
bGVGb250RGF0YTo6U2ltcGxlRm9udERhdGEoUGFzc093blB0cjxTVkdGb250RGF0YT4gc3ZnRm9u
dERhdGEsIGludCBzaXplLCBibwogfQogI2VuZGlmCiAKLSNpZiAhUExBVEZPUk0oUVQpCisjaWYg
IShQTEFURk9STShRVCkgJiYgIUhBVkUoUUdMWVBIUykpCiAvLyBFc3RpbWF0ZXMgb2YgYXZnQ2hh
cldpZHRoIGFuZCBtYXhDaGFyV2lkdGggZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQg
YWNjZXNzaW5nIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBmb250Lgogdm9pZCBTaW1wbGVGb250RGF0
YTo6aW5pdENoYXJXaWR0aHMoKQogewpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKaW5kZXggMGZjYzY3Yi4uODhmMGZkMSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCkBAIC0x
ODQsNiArMTg0LDExIEBAIHB1YmxpYzoKICNlbmRpZgogCiBwcml2YXRlOgorI2lmIFBMQVRGT1JN
KFFUKSAmJiBIQVZFKFFHTFlQSFMpCisgICAgLy8gR2x5cGhQYWdlOjpmaWxsKCkgZmlsbHMgaW4g
bV9nbHlwaFRvV2lkdGhNYXAgb24gUXQuCisgICAgZnJpZW5kIGNsYXNzIEdseXBoUGFnZTsKKyNl
bmRpZgorCiAgICAgdm9pZCBwbGF0Zm9ybUluaXQoKTsKICAgICB2b2lkIHBsYXRmb3JtR2x5cGhJ
bml0KCk7CiAgICAgdm9pZCBwbGF0Zm9ybUNoYXJXaWR0aEluaXQoKTsKQEAgLTI3OSw5ICsyODQs
OCBAQCBwcml2YXRlOgogI2VuZGlmCiAjZW5kaWYKIH07Ci0gICAgCi0gICAgCi0jaWYgIVBMQVRG
T1JNKFFUKQorCisjaWYgIShQTEFURk9STShRVCkgJiYgIUhBVkUoUUdMWVBIUykpCiBBTFdBWVNf
SU5MSU5FIEZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6Ym91bmRzRm9yR2x5cGgoR2x5cGggZ2x5
cGgpIGNvbnN0CiB7CiAgICAgaWYgKGlzWmVyb1dpZHRoU3BhY2VHbHlwaChnbHlwaCkpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5jcHAK
aW5kZXggYzU5YzUyMy4uNzkyYjkxNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcApAQCAtMzUsNiArMzUsOSBAQAogI2luY2x1
ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KIAogI2luY2x1ZGUgPFFGb250PgorI2lmIEhBVkUo
UUdMWVBIUykKKyNpbmNsdWRlIDxRVGV4dExheW91dD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3Bh
Y2UgV1RGOwogCkBAIC00NCw5ICs0Nyw0NyBAQCB2b2lkIEZvbnRDYWNoZTo6cGxhdGZvcm1Jbml0
KCkKIHsKIH0KIAotY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFG
b3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmLCBjb25zdCBVQ2hhciosIGludCkKKyNpZiBIQVZFKFFH
TFlQSFMpCitzdGF0aWMgYm9vbCBnZXRBbHRlcm5hdGVGb250Rm9yQ2hhcmFjdGVycyhjb25zdCBR
U3RyaW5nJiBzdHJpbmcsIGNvbnN0IFFGb250JiByZXF1ZXN0ZWRGb250LCBRUmF3Rm9udCYgYWx0
ZXJuYXRlRm9udCkKIHsKKyAgICBRRm9udCBmb250KHJlcXVlc3RlZEZvbnQpOworICAgIGZvbnQu
c2V0U3R5bGVTdHJhdGVneShRRm9udDo6Tm9Gb250TWVyZ2luZyk7CisKKyAgICBRVGV4dExheW91
dCBsYXlvdXQoc3RyaW5nLCBmb250KTsKKyAgICBsYXlvdXQuYmVnaW5MYXlvdXQoKTsKKyAgICBs
YXlvdXQuY3JlYXRlTGluZSgpOworICAgIGxheW91dC5lbmRMYXlvdXQoKTsKKworICAgIFFMaXN0
PFFHbHlwaHM+IGdseXBoTGlzdCA9IGxheW91dC5nbHlwaHMoKTsKKworICAgIEFTU0VSVChnbHlw
aExpc3Quc2l6ZSgpID09IDEpOworCisgICAgY29uc3QgUUdseXBocyYgZ2x5cGhzKGdseXBoTGlz
dC5hdCgwKSk7CisgICAgUVZlY3RvcjxxdWludDMyPiBnbHlwaEluZGV4ZXMgPSBnbHlwaHMuZ2x5
cGhJbmRleGVzKCk7CisKKyAgICBpZiAoZ2x5cGhJbmRleGVzLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgYWx0ZXJuYXRlRm9udCA9IGdseXBocy5mb250KCk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKQoreworI2lmIEhBVkUoUUdMWVBIUykKKyAgICBRU3Ry
aW5nIHFzdHJpbmcgPSBRU3RyaW5nOjpmcm9tUmF3RGF0YShyZWludGVycHJldF9jYXN0PGNvbnN0
IFFDaGFyKj4oY2hhcmFjdGVycyksIGxlbmd0aCk7CisgICAgUVJhd0ZvbnQgY29tcHV0ZWRGb250
OworICAgIGlmICghZ2V0QWx0ZXJuYXRlRm9udEZvckNoYXJhY3RlcnMocXN0cmluZywgZm9udC5m
b250KCksIGNvbXB1dGVkRm9udCkpCisgICAgICAgIHJldHVybiAwOworICAgIEZvbnRQbGF0Zm9y
bURhdGEgYWx0ZXJuYXRlRm9udChjb21wdXRlZEZvbnQpOworICAgIHJldHVybiBnZXRDYWNoZWRG
b250RGF0YSgmYWx0ZXJuYXRlRm9udCk7CisjZWxzZQorICAgIFFfVU5VU0VEKGZvbnQpOworICAg
IFFfVU5VU0VEKGNoYXJhY3RlcnMpOworICAgIFFfVU5VU0VEKGxlbmd0aCk7CiAgICAgcmV0dXJu
IDA7CisjZW5kaWYKIH0KIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZv
bnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKQEAgLTU3LDcgKzk4LDcgQEAgU2ltcGxl
Rm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9u
dCYgZm9udCkKIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFj
a0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pCiB7CiAgICAgY29u
c3QgQXRvbWljU3RyaW5nIGZhbGxiYWNrRmFtaWx5ID0gUUZvbnQoZm9udERlc2NyaXB0aW9uLmZh
bWlseSgpLmZhbWlseSgpKS5sYXN0UmVzb3J0RmFtaWx5KCk7Ci0gICAgcmV0dXJuIGdldENhY2hl
ZEZvbnREYXRhKG5ldyBGb250UGxhdGZvcm1EYXRhKGZvbnREZXNjcmlwdGlvbiwgZmFsbGJhY2tG
YW1pbHkpKTsKKyAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoZm9udERlc2NyaXB0aW9uLCBm
YWxsYmFja0ZhbWlseSk7CiB9CiAKIHZvaWQgRm9udENhY2hlOjpnZXRUcmFpdHNJbkZhbWlseShj
b25zdCBBdG9taWNTdHJpbmcmLCBWZWN0b3I8dW5zaWduZWQ+JikKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaAppbmRleCA0
YTkyYWNmLi44ZTU3ZTU5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9Gb250UGxhdGZvcm1EYXRhLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YS5oCkBAIC0yOCw2ICsyOCw5IEBACiAjaW5jbHVk
ZSAiRm9udE9yaWVudGF0aW9uLmgiCiAjaW5jbHVkZSA8UUZvbnQ+CiAjaW5jbHVkZSA8UUhhc2g+
CisjaWYgSEFWRShRR0xZUEhTKQorI2luY2x1ZGUgPFFSYXdGb250PgorI2VuZGlmCiAjaW5jbHVk
ZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgogCkBAIC01MCwx
NiArNTMsMzIgQEAgcHVibGljOgogICAgIHsgfQogICAgIEZvbnRQbGF0Zm9ybURhdGFQcml2YXRl
KGNvbnN0IFFGb250JiBmb250KQogICAgICAgICA6IGZvbnQoZm9udCkKKyNpZiBIQVZFKFFHTFlQ
SFMpCisgICAgICAgICwgcmF3Rm9udChRUmF3Rm9udDo6ZnJvbUZvbnQoZm9udCwgUUZvbnREYXRh
YmFzZTo6QW55KSkKKyNlbmRpZgogICAgICAgICAsIHNpemUoZm9udC5waXhlbFNpemUoKSkKICAg
ICAgICAgLCBib2xkKGZvbnQuYm9sZCgpKQogICAgICAgICAsIG9ibGlxdWUoZmFsc2UpCiAgICAg
ICAgICwgaXNEZWxldGVkVmFsdWUoZmFsc2UpCiAgICAgeyB9CisjaWYgSEFWRShRR0xZUEhTKQor
ICAgIEZvbnRQbGF0Zm9ybURhdGFQcml2YXRlKGNvbnN0IFFSYXdGb250JiByYXdGb250KQorICAg
ICAgICA6IGZvbnQoKQorICAgICAgICAsIHJhd0ZvbnQocmF3Rm9udCkKKyAgICAgICAgLCBzaXpl
KHJhd0ZvbnQucGl4ZWxTaXplKCkpCisgICAgICAgICwgYm9sZChyYXdGb250LndlaWdodCgpID49
IFFGb250OjpCb2xkKQorICAgICAgICAsIG9ibGlxdWUoZmFsc2UpCisgICAgICAgICwgaXNEZWxl
dGVkVmFsdWUoZmFsc2UpCisgICAgeyB9CisjZW5kaWYKICAgICBGb250UGxhdGZvcm1EYXRhUHJp
dmF0ZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCiAgICAgICAgIDogaXNEZWxldGVk
VmFsdWUodHJ1ZSkKICAgICB7IH0KIAogICAgIFFGb250IGZvbnQ7CisjaWYgSEFWRShRR0xZUEhT
KQorICAgIFFSYXdGb250IHJhd0ZvbnQ7CisjZW5kaWYKICAgICBmbG9hdCBzaXplOwogICAgIGJv
b2wgYm9sZCA6IDE7CiAgICAgYm9vbCBvYmxpcXVlIDogMTsKQEAgLTc0LDYgKzkzLDEyIEBAIHB1
YmxpYzoKICAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IFFGb250JiBmb250KQogICAgICAgICA6
IG1fZGF0YShhZG9wdFJlZihuZXcgRm9udFBsYXRmb3JtRGF0YVByaXZhdGUoZm9udCkpKQogICAg
IHsgfQorI2lmIEhBVkUoUUdMWVBIUykKKyAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmLCBmbG9hdCBzaXplKTsKKyAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IFFS
YXdGb250JiByYXdGb250KQorICAgICAgICA6IG1fZGF0YShhZG9wdFJlZihuZXcgRm9udFBsYXRm
b3JtRGF0YVByaXZhdGUocmF3Rm9udCkpKQorICAgIHsgfQorI2VuZGlmCiAgICAgRm9udFBsYXRm
b3JtRGF0YShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCiAgICAgICAgIDogbV9kYXRh
KGFkb3B0UmVmKG5ldyBGb250UGxhdGZvcm1EYXRhUHJpdmF0ZSgpKSkKICAgICB7CkBAIC05NCw2
ICsxMTksMTUgQEAgcHVibGljOgogICAgICAgICAgICAgcmV0dXJuIFFGb250KCk7CiAgICAgICAg
IHJldHVybiBtX2RhdGEtPmZvbnQ7CiAgICAgfQorI2lmIEhBVkUoUUdMWVBIUykKKyAgICBRUmF3
Rm9udCByYXdGb250KCkgY29uc3QKKyAgICB7CisgICAgICAgIFFfQVNTRVJUKCFpc0hhc2hUYWJs
ZURlbGV0ZWRWYWx1ZSgpKTsKKyAgICAgICAgaWYgKCFtX2RhdGEpCisgICAgICAgICAgICByZXR1
cm4gUVJhd0ZvbnQoKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YS0+cmF3Rm9udDsKKyAgICB9Cisj
ZW5kaWYKICAgICBmbG9hdCBzaXplKCkgY29uc3QKICAgICB7CiAgICAgICAgIFFfQVNTRVJUKCFp
c0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpKTsKQEAgLTE0OSw2ICsxODMsOSBAQCBwdWJsaWM6CiAg
ICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgY29uc3Q7CiAjZW5kaWYKIHByaXZhdGU6CisjaWYgSEFW
RShRR0xZUEhTKQorICAgIGZyaWVuZCBjbGFzcyBHbHlwaFBhZ2U7CisjZW5kaWYKICAgICBSZWZQ
dHI8Rm9udFBsYXRmb3JtRGF0YVByaXZhdGU+IG1fZGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhUXQu
Y3BwCmluZGV4IDk1ZGFiZDUuLmZkYjI1ZTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YVF0LmNwcApAQCAtODAs
NyArODAsMjIgQEAgRm9udFBsYXRmb3JtRGF0YTo6Rm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250
RGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBBdG8KICAgICAvLyBtX2RhdGEtPnNpemUg
aWYgYSBmb250IHNpemUgb2YgemVybyBpcyByZXF1ZXN0ZWQgYW5kIHBpeGVsU2l6ZSgpCiAgICAg
Ly8gb3RoZXJ3aXNlLgogICAgIG1fZGF0YS0+c2l6ZSA9ICghcmVxdWVzdGVkU2l6ZSkgPyByZXF1
ZXN0ZWRTaXplIDogZm9udC5waXhlbFNpemUoKTsKKworICAgIG1fZGF0YS0+cmF3Rm9udCA9IFFS
YXdGb250Ojpmcm9tRm9udChmb250LCBRRm9udERhdGFiYXNlOjpBbnkpOworfQorCisjaWYgSEFW
RShRR0xZUEhTKQorRm9udFBsYXRmb3JtRGF0YTo6Rm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250
UGxhdGZvcm1EYXRhJiBvdGhlciwgZmxvYXQgc2l6ZSkKKyAgICA6IG1fZGF0YShhZG9wdFJlZihu
ZXcgRm9udFBsYXRmb3JtRGF0YVByaXZhdGUoKSkpCit7CisgICAgbV9kYXRhLT5mb250ID0gb3Ro
ZXIubV9kYXRhLT5mb250OworICAgIG1fZGF0YS0+cmF3Rm9udCA9IG90aGVyLm1fZGF0YS0+cmF3
Rm9udDsKKyAgICBtX2RhdGEtPmJvbGQgPSBvdGhlci5tX2RhdGEtPmJvbGQ7CisgICAgbV9kYXRh
LT5vYmxpcXVlID0gb3RoZXIubV9kYXRhLT5vYmxpcXVlOworICAgIG1fZGF0YS0+Zm9udC5zZXRQ
aXhlbFNpemUoc2l6ZSk7CisgICAgbV9kYXRhLT5zaXplID0gc2l6ZSA/IG1fZGF0YS0+Zm9udC5w
aXhlbFNpemUoKSA6IDA7CiB9CisjZW5kaWYKIAogYm9vbCBGb250UGxhdGZvcm1EYXRhOjpvcGVy
YXRvcj09KGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIG90aGVyKSBjb25zdAogewpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAKaW5kZXggM2ZlOTBhNC4u
YjE0YzhiYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
Rm9udFF0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250
UXQuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCiAj
aW5jbHVkZSAiRm9udEZhbGxiYWNrTGlzdC5oIgogI2luY2x1ZGUgIkZvbnRTZWxlY3Rvci5oIgor
I2lmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2VuZGlmCiAjaW5j
bHVkZSAiR3JhZGllbnQuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgpAQCAtNzMsNiArNzYsMzkgQEAgc3RhdGljIFFUZXh0TGluZSBz
ZXR1cExheW91dChRVGV4dExheW91dCogbGF5b3V0LCBjb25zdCBUZXh0UnVuJiBzdHlsZSkKICAg
ICByZXR1cm4gbGluZTsKIH0KIAorc3RhdGljIFFQZW4gZmlsbFBlbkZvckNvbnRleHQoR3JhcGhp
Y3NDb250ZXh0KiBjdHgpCit7CisgICAgaWYgKGN0eC0+ZmlsbEdyYWRpZW50KCkpIHsKKyAgICAg
ICAgUUJydXNoIGJydXNoKCpjdHgtPmZpbGxHcmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkp
OworICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5maWxsR3JhZGllbnQoKS0+Z3JhZGll
bnRTcGFjZVRyYW5zZm9ybSgpKTsKKyAgICAgICAgcmV0dXJuIFFQZW4oYnJ1c2gsIDApOworICAg
IH0KKworICAgIGlmIChjdHgtPmZpbGxQYXR0ZXJuKCkpIHsKKyAgICAgICAgQWZmaW5lVHJhbnNm
b3JtIGFmZmluZTsKKyAgICAgICAgcmV0dXJuIFFQZW4oUUJydXNoKGN0eC0+ZmlsbFBhdHRlcm4o
KS0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkpLCAwKTsKKyAgICB9CisKKyAgICByZXR1
cm4gUVBlbihRQ29sb3IoY3R4LT5maWxsQ29sb3IoKSkpOworfQorCitzdGF0aWMgUVBlbiBzdHJv
a2VQZW5Gb3JDb250ZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4KQoreworICAgIGlmIChjdHgtPnN0
cm9rZUdyYWRpZW50KCkpIHsKKyAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPnN0cm9rZUdyYWRp
ZW50KCktPnBsYXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGJydXNoLnNldFRyYW5zZm9ybShj
dHgtPnN0cm9rZUdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0oKSk7CisgICAgICAg
IHJldHVybiBRUGVuKGJydXNoLCBjdHgtPnN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICB9CisKKyAg
ICBpZiAoY3R4LT5zdHJva2VQYXR0ZXJuKCkpIHsKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFm
ZmluZTsKKyAgICAgICAgUUJydXNoIGJydXNoKGN0eC0+c3Ryb2tlUGF0dGVybigpLT5jcmVhdGVQ
bGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSk7CisgICAgICAgIHJldHVybiBRUGVuKGJydXNoLCBjdHgt
PnN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gUVBlbihRQ29sb3IoY3R4
LT5zdHJva2VDb2xvcigpKSwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7Cit9CisKIHN0YXRpYyB2
b2lkIGRyYXdUZXh0Q29tbW9uKEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBy
dW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvLCBjb25zdCBRRm9u
dCYgZm9udCwgYm9vbCBpc0NvbXBsZXhUZXh0KQogewogICAgIGlmICh0byA8IDApCkBAIC04MSwz
MSArMTE3LDEyIEBAIHN0YXRpYyB2b2lkIGRyYXdUZXh0Q29tbW9uKEdyYXBoaWNzQ29udGV4dCog
Y3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0CiAgICAgUVBhaW50ZXIgKnAgPSBj
dHgtPnBsYXRmb3JtQ29udGV4dCgpOwogCiAgICAgUVBlbiB0ZXh0RmlsbFBlbjsKLSAgICBpZiAo
Y3R4LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlRmlsbCkgewotICAgICAgICBpZiAoY3R4
LT5maWxsR3JhZGllbnQoKSkgewotICAgICAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPmZpbGxH
cmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkpOwotICAgICAgICAgICAgYnJ1c2guc2V0VHJh
bnNmb3JtKGN0eC0+ZmlsbEdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0oKSk7Ci0g
ICAgICAgICAgICB0ZXh0RmlsbFBlbiA9IFFQZW4oYnJ1c2gsIDApOwotICAgICAgICB9IGVsc2Ug
aWYgKGN0eC0+ZmlsbFBhdHRlcm4oKSkgewotICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFm
ZmluZTsKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBlbihRQnJ1c2goY3R4LT5maWxsUGF0
dGVybigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSksIDApOwotICAgICAgICB9IGVs
c2UKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBlbihRQ29sb3IoY3R4LT5maWxsQ29sb3Io
KSkpOwotICAgIH0KKyAgICBpZiAoY3R4LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlRmls
bCkKKyAgICAgICAgdGV4dEZpbGxQZW4gPSBmaWxsUGVuRm9yQ29udGV4dChjdHgpOwogCiAgICAg
UVBlbiB0ZXh0U3Ryb2tlUGVuOwotICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4
dE1vZGVTdHJva2UpIHsKLSAgICAgICAgaWYgKGN0eC0+c3Ryb2tlR3JhZGllbnQoKSkgewotICAg
ICAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPnN0cm9rZUdyYWRpZW50KCktPnBsYXRmb3JtR3Jh
ZGllbnQoKSk7Ci0gICAgICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5zdHJva2VHcmFk
aWVudCgpLT5ncmFkaWVudFNwYWNlVHJhbnNmb3JtKCkpOwotICAgICAgICAgICAgdGV4dFN0cm9r
ZVBlbiA9IFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgICAgICB9IGVs
c2UgaWYgKGN0eC0+c3Ryb2tlUGF0dGVybigpKSB7Ci0gICAgICAgICAgICBBZmZpbmVUcmFuc2Zv
cm0gYWZmaW5lOwotICAgICAgICAgICAgUUJydXNoIGJydXNoKGN0eC0+c3Ryb2tlUGF0dGVybigp
LT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSk7Ci0gICAgICAgICAgICB0ZXh0U3Ryb2tl
UGVuID0gUVBlbihicnVzaCwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgdGV4dFN0cm9rZVBlbiA9IFFQZW4oUUNvbG9yKGN0eC0+c3Ryb2tlQ29s
b3IoKSksIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgIH0KKyAgICBpZiAoY3R4LT50ZXh0
RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tlKQorICAgICAgICB0ZXh0U3Ryb2tlUGVuID0g
c3Ryb2tlUGVuRm9yQ29udGV4dChjdHgpOwogCiAgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6
Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwogICAgIFFT
dHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CkBAIC0yMzUs
MzcgKzI1Miw2MiBAQCBzdGF0aWMgdm9pZCBkcmF3VGV4dENvbW1vbihHcmFwaGljc0NvbnRleHQq
IGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdAogICAgIH0KIH0KIAotdm9pZCBG
b250OjpkcmF3U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKLXsK
LSAgICBkcmF3VGV4dENvbW1vbihjdHgsIHJ1biwgcG9pbnQsIGZyb20sIHRvLCBmb250KCksIC8q
IGlzQ29tcGxleFRleHQgPSAqL2ZhbHNlKTsKLX0KLQogdm9pZCBGb250OjpkcmF3Q29tcGxleFRl
eHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CiAgICAgZHJhd1RleHRDb21t
b24oY3R4LCBydW4sIHBvaW50LCBmcm9tLCB0bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0g
Ki90cnVlKTsKIH0KIAotaW50IEZvbnQ6OmVtcGhhc2lzTWFya0FzY2VudChjb25zdCBBdG9taWNT
dHJpbmcmKSBjb25zdAorZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiwgR2x5cGhPdmVy
ZmxvdyopIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAg
ICBpZiAoIXByaW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLnNpemUoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBpZiAoIXJ1bi5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBpZiAocnVuLmxlbmd0aCgpID09IDEgJiYgdHJlYXRBc1NwYWNlKHJ1blswXSkpCisgICAgICAg
IHJldHVybiBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0aChzcGFjZSkgKyBydW4uZXhwYW5zaW9u
KCk7CisKKyAgICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5j
aGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7CisgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3
RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsKKworICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZv
bnQoKSkud2lkdGgoc3RyaW5nKTsKKyAgICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUg
d29yZCBzcGFjaW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBR
dCBkb2VzKQorICAgIGlmICh0cmVhdEFzU3BhY2UocnVuWzBdKSkKKyAgICAgICAgdyAtPSBtX3dv
cmRTcGFjaW5nOworCisgICAgcmV0dXJuIHcgKyBydW4uZXhwYW5zaW9uKCk7CiB9CiAKLWludCBG
b250OjplbXBoYXNpc01hcmtEZXNjZW50KGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0CitpbnQg
Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IGZsb2F0IHBvc2l0aW9uLCBib29sKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0g
ICAgcmV0dXJuIDA7CisgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNl
cyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOworICAgIFFTdHJpbmcgc3RyaW5nID0g
ZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisKKyAgICBRVGV4dExheW91dCBsYXlv
dXQoc3RyaW5nLCBmb250KCkpOworICAgIFFUZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxh
eW91dCwgcnVuKTsKKyAgICByZXR1cm4gbGluZS54VG9DdXJzb3IocG9zaXRpb24pOwogfQogCi1p
bnQgRm9udDo6ZW1waGFzaXNNYXJrSGVpZ2h0KGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0CitG
bG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4m
IHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcHQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgU3RyaW5nIHNh
bml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVu
Z3RoKCkpOworICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0
aXplZCk7CisKKyAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBmb250KCkpOworICAgIFFU
ZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsKKworICAgIGZsb2F0IHgx
ID0gbGluZS5jdXJzb3JUb1goZnJvbSk7CisgICAgZmxvYXQgeDIgPSBsaW5lLmN1cnNvclRvWCh0
byk7CisgICAgaWYgKHgyIDwgeDEpCisgICAgICAgIHFTd2FwKHgxLCB4Mik7CisKKyAgICByZXR1
cm4gRmxvYXRSZWN0KHB0LngoKSArIHgxLCBwdC55KCksIHgyIC0geDEsIGgpOwogfQogCi12b2lk
IEZvbnQ6OmRyYXdFbXBoYXNpc01hcmtzRm9yU2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIC8q
IGNvbnRleHQgKi8sIGNvbnN0IFRleHRSdW4mIC8qIHJ1biAqLywgY29uc3QgQXRvbWljU3RyaW5n
JiAvKiBtYXJrICovLCBjb25zdCBGbG9hdFBvaW50JiAvKiBwb2ludCAqLywgaW50IC8qIGZyb20g
Ki8sIGludCAvKiB0byAqLykgY29uc3QKK2Jvb2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250
c0ZvckNvbXBsZXhUZXh0KCkKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBm
YWxzZTsKIH0KIAogdm9pZCBGb250OjpkcmF3RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdy
YXBoaWNzQ29udGV4dCogLyogY29udGV4dCAqLywgY29uc3QgVGV4dFJ1biYgLyogcnVuICovLCBj
b25zdCBBdG9taWNTdHJpbmcmIC8qIG1hcmsgKi8sIGNvbnN0IEZsb2F0UG9pbnQmIC8qIHBvaW50
ICovLCBpbnQgLyogZnJvbSAqLywgaW50IC8qIHRvICovKSBjb25zdApAQCAtMjczLDQ2ICszMTUs
NjEgQEAgdm9pZCBGb250OjpkcmF3RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdyYXBoaWNz
Q29udGV4dCogLyogY29udGV4dCAqLywgY29uc3QKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQog
Ci1mbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+
KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAorI2lm
IEhBVkUoUUdMWVBIUykKK3ZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSwgY29uc3QgR2x5cGhCdWZmZXIm
IGdseXBoQnVmZmVyLCBpbnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQpIGNvbnN0CiB7Ci0gICAgaWYgKCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5z
aXplKCkpCi0gICAgICAgIHJldHVybiAwOworICAgIGlmIChjb250ZXh0LT5wYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKIAotICAgIGlmICghcnVuLmxlbmd0aCgpKQotICAgICAg
ICByZXR1cm4gMDsKKyAgICBib29sIHNob3VsZEZpbGwgPSBjb250ZXh0LT50ZXh0RHJhd2luZ01v
ZGUoKSAmIFRleHRNb2RlRmlsbDsKKyAgICBib29sIHNob3VsZFN0cm9rZSA9IGNvbnRleHQtPnRl
eHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVTdHJva2U7CiAKLSAgICBTdHJpbmcgc2FuaXRpemVk
ID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7
Ci0gICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsK
KyAgICAvLyBTdHJva2luZyB0ZXh0IHNob3VsZCBhbHdheXMgdGFrZSB0aGUgY29tcGxleCBwYXRo
LgorICAgIEFTU0VSVCghc2hvdWxkU3Ryb2tlKTsKIAotICAgIGludCB3ID0gUUZvbnRNZXRyaWNz
KGZvbnQoKSkud2lkdGgoc3RyaW5nLCAtMSwgUXQ6OlRleHRCeXBhc3NTaGFwaW5nKTsKKyAgICAv
LyBTaGFkb3dlZCB0ZXh0IHNob3VsZCBhbHdheXMgdGFrZSB0aGUgY29tcGxleCBwYXRoLgorICAg
IEFTU0VSVChjb250ZXh0LT5jb250ZXh0U2hhZG93KCktPm1fdHlwZSA9PSBDb250ZXh0U2hhZG93
OjpOb1NoYWRvdyk7CiAKLSAgICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBz
cGFjaW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2Vz
KQotICAgIGlmICh0cmVhdEFzU3BhY2UocnVuWzBdKSkKLSAgICAgICAgdyAtPSBtX3dvcmRTcGFj
aW5nOworICAgIGlmICghc2hvdWxkRmlsbCAmJiAhc2hvdWxkU3Ryb2tlKQorICAgICAgICByZXR1
cm47CiAKLSAgICByZXR1cm4gdyArIHJ1bi5leHBhbnNpb24oKTsKLX0KKyAgICBRVmVjdG9yPHF1
aW50MzI+IGdseXBoSW5kZXhlczsKKyAgICBRVmVjdG9yPFFQb2ludEY+IHBvc2l0aW9uczsKKyAg
ICBmbG9hdCB4ID0gMDsKIAotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNv
bnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiwgR2x5cGhP
dmVyZmxvdyopIGNvbnN0Ci17Ci0gICAgaWYgKCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEo
KS5zaXplKCkpCi0gICAgICAgIHJldHVybiAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVt
R2x5cGhzOyArK2kpIHsKKyAgICAgICAgR2x5cGggZ2x5cGggPSBnbHlwaEJ1ZmZlci5nbHlwaEF0
KGZyb20gKyBpKTsKKyAgICAgICAgZmxvYXQgYWR2YW5jZSA9IGdseXBoQnVmZmVyLmFkdmFuY2VB
dChmcm9tICsgaSk7CisgICAgICAgIGlmICghZ2x5cGgpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgZ2x5cGhJbmRleGVzLmFwcGVuZChnbHlwaCk7CisgICAgICAgIHBvc2l0aW9ucy5h
cHBlbmQoUVBvaW50Rih4LCAwKSk7CisgICAgICAgIHggKz0gYWR2YW5jZTsKKyAgICB9CiAKLSAg
ICBpZiAoIXJ1bi5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgUUdseXBocyBxdEds
eXBoczsKKyAgICBxdEdseXBocy5zZXRHbHlwaEluZGV4ZXMoZ2x5cGhJbmRleGVzKTsKKyAgICBx
dEdseXBocy5zZXRQb3NpdGlvbnMocG9zaXRpb25zKTsKKyAgICBxdEdseXBocy5zZXRGb250KGZv
bnREYXRhLT5wbGF0Zm9ybURhdGEoKS5yYXdGb250KCkpOwogCi0gICAgaWYgKHJ1bi5sZW5ndGgo
KSA9PSAxICYmIHRyZWF0QXNTcGFjZShydW5bMF0pKQotICAgICAgICByZXR1cm4gUUZvbnRNZXRy
aWNzKGZvbnQoKSkud2lkdGgoc3BhY2UpICsgcnVuLmV4cGFuc2lvbigpOworICAgIFFQYWludGVy
KiBwYWludGVyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CiAKLSAgICBTdHJpbmcgc2Fu
aXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5n
dGgoKSk7Ci0gICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2FuaXRp
emVkKTsKKyAgICBRUGVuIHByZXZpb3VzUGVuID0gcGFpbnRlci0+cGVuKCk7CisgICAgcGFpbnRl
ci0+c2V0UGVuKGZpbGxQZW5Gb3JDb250ZXh0KGNvbnRleHQpKTsKKyAgICBwYWludGVyLT5kcmF3
R2x5cGhzKHBvaW50LCBxdEdseXBocyk7CisgICAgcGFpbnRlci0+c2V0UGVuKHByZXZpb3VzUGVu
KTsKK30KIAotICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lkdGgoc3RyaW5nKTsK
LSAgICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFjaW5nIG9uIHRoZSBm
aXJzdCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQotICAgIGlmICh0cmVh
dEFzU3BhY2UocnVuWzBdKSkKLSAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5nOworYm9vbCBGb250
OjpjYW5FeHBhbmRBcm91bmRJZGVvZ3JhcGhzSW5Db21wbGV4VGV4dCgpCit7CisgICAgcmV0dXJu
IGZhbHNlOworfQogCi0gICAgcmV0dXJuIHcgKyBydW4uZXhwYW5zaW9uKCk7CisjZWxzZSAvLyAh
SEFWRShRR0xZUEhTKQorCit2b2lkIEZvbnQ6OmRyYXdTaW1wbGVUZXh0KEdyYXBoaWNzQ29udGV4
dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQg
ZnJvbSwgaW50IHRvKSBjb25zdAoreworICAgIGRyYXdUZXh0Q29tbW9uKGN0eCwgcnVuLCBwb2lu
dCwgZnJvbSwgdG8sIGZvbnQoKSwgLyogaXNDb21wbGV4VGV4dCA9ICovZmFsc2UpOwogfQogCiBp
bnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1
biwgZmxvYXQgcG9zaXRpb24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0CkBAIC0z
MzgsMTYgKzM5NSwyOCBAQCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0
KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRpb24sIGJvbwogICAgIHJldHVybiBjdXJQ
b3M7CiB9CiAKLWludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgZmxvYXQgcG9zaXRpb24sIGJvb2wpIGNvbnN0CisKK2Zsb2F0IEZvbnQ6
OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgR2x5cGhCdWZmZXIq
IGdseXBoQnVmZmVyLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9u
dHMsIEdseXBoT3ZlcmZsb3cqIGdseXBoT3ZlcmZsb3cpIGNvbnN0CiB7CisgICAgaWYgKCFwcmlt
YXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgaWYgKCFydW4ubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAwOworCiAgICAgU3RyaW5nIHNh
bml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVu
Z3RoKCkpOwogICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0
aXplZCk7CiAKLSAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBmb250KCkpOwotICAgIFFU
ZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsKLSAgICByZXR1cm4gbGlu
ZS54VG9DdXJzb3IocG9zaXRpb24pOworICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZvbnQoKSku
d2lkdGgoc3RyaW5nLCAtMSwgUXQ6OlRleHRCeXBhc3NTaGFwaW5nKTsKKworICAgIC8vIFdlYktp
dCBleHBlY3RzIHVzIHRvIGlnbm9yZSB3b3JkIHNwYWNpbmcgb24gdGhlIGZpcnN0IGNoYXJhY3Rl
ciAoYXMgb3Bwb3NlZCB0byB3aGF0IFF0IGRvZXMpCisgICAgaWYgKHRyZWF0QXNTcGFjZShydW5b
MF0pKQorICAgICAgICB3IC09IG1fd29yZFNwYWNpbmc7CisKKyAgICByZXR1cm4gdyArIHJ1bi5l
eHBhbnNpb24oKTsKIH0KIAorCiBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvclNpbXBs
ZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwdCwgaW50IGgsIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CiAgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5v
cm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwpAQCAtMzYwLDIy
ICs0MjksNiBAQCBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JgogICAgIHJldHVybiBGbG9hdFJlY3Qo
cHQueCgpICsgc3RhcnRYLCBwdC55KCksIHdpZHRoLCBoKTsKIH0KIAotRmxvYXRSZWN0IEZvbnQ6
OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZs
b2F0UG9pbnQmIHB0LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKLXsKLSAgICBTdHJp
bmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1
bi5sZW5ndGgoKSk7Ci0gICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYo
c2FuaXRpemVkKTsKLQotICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7Ci0g
ICAgUVRleHRMaW5lIGxpbmUgPSBzZXR1cExheW91dCgmbGF5b3V0LCBydW4pOwotCi0gICAgZmxv
YXQgeDEgPSBsaW5lLmN1cnNvclRvWChmcm9tKTsKLSAgICBmbG9hdCB4MiA9IGxpbmUuY3Vyc29y
VG9YKHRvKTsKLSAgICBpZiAoeDIgPCB4MSkKLSAgICAgICAgcVN3YXAoeDEsIHgyKTsKLQotICAg
IHJldHVybiBGbG9hdFJlY3QocHQueCgpICsgeDEsIHB0LnkoKSwgeDIgLSB4MSwgaCk7Ci19Ci0K
IGJvb2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCkKIHsKICAg
ICByZXR1cm4gZmFsc2U7CkBAIC0zOTIsNiArNDQ1LDggQEAgYm9vbCBGb250OjpwcmltYXJ5Rm9u
dEhhc0dseXBoRm9yQ2hhcmFjdGVyKFVDaGFyMzIpIGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9
CiAKKyNlbmRpZiAvLyBIQVZFKFFHTFlQSFMpCisKIFFGb250IEZvbnQ6OmZvbnQoKSBjb25zdAog
ewogICAgIFFGb250IGYgPSBwcmltYXJ5Rm9udCgpLT5nZXRRdEZvbnQoKTsKQEAgLTQwMiw1ICs0
NTcsNiBAQCBRRm9udCBGb250Ojpmb250KCkgY29uc3QKICAgICByZXR1cm4gZjsKIH0KIAorCiB9
CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBo
UGFnZVRyZWVOb2RlUXQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
R2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAKaW5kZXggMjEyMTIwNi4uYThmYzVjOSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVR
dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdl
VHJlZU5vZGVRdC5jcHAKQEAgLTIzLDggKzIzLDM4IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAj
aW5jbHVkZSAiR2x5cGhQYWdlVHJlZU5vZGUuaCIKIAorI2lmIEhBVkUoUUdMWVBIUykKKyNpbmNs
dWRlICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgPFFGb250TWV0cmljc0Y+CisjaW5jbHVk
ZSA8UVRleHRMYXlvdXQ+CisjZW5kaWYKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCisjaWYgSEFW
RShRR0xZUEhTKQorYm9vbCBHbHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25l
ZCBsZW5ndGgsIFVDaGFyKiBidWZmZXIsIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCwgY29uc3QgU2lt
cGxlRm9udERhdGEqIGZvbnREYXRhKQoreworICAgIFFSYXdGb250IHJhd0ZvbnQgPSBmb250RGF0
YS0+cGxhdGZvcm1EYXRhKCkucmF3Rm9udCgpOworICAgIFFTdHJpbmcgcXN0cmluZyA9IFFTdHJp
bmc6OmZyb21SYXdEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUUNoYXIqPihidWZmZXIpLCBz
dGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlckxlbmd0aCkpOworICAgIFFWZWN0b3I8cXVpbnQzMj4gaW5k
ZXhlcyA9IHJhd0ZvbnQuZ2x5cGhJbmRleGVzRm9yU3RyaW5nKHFzdHJpbmcpOworICAgIFFWZWN0
b3I8UVBvaW50Rj4gYWR2YW5jZXMgPSByYXdGb250LmFkdmFuY2VzRm9yR2x5cGhJbmRleGVzKGlu
ZGV4ZXMpOworCisgICAgYm9vbCBoYXZlR2x5cGhzID0gZmFsc2U7CisKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgR2x5cGggZ2x5cGggPSAoaSA8
IGluZGV4ZXMuc2l6ZSgpKSA/IGluZGV4ZXMuYXQoaSkgOiAwOworICAgICAgICBpZiAoIWdseXBo
KQorICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgMCwgMCk7Cisg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgaGF2ZUdseXBocyA9IHRydWU7CisgICAgICAgICAg
ICBmb250RGF0YS0+bV9nbHlwaFRvV2lkdGhNYXAuc2V0TWV0cmljc0ZvckdseXBoKGdseXBoLCBh
ZHZhbmNlcy5hdChpKS54KCkpOworICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zm
c2V0ICsgaSwgZ2x5cGgsIGZvbnREYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4g
aGF2ZUdseXBoczsKK30KKyNlbHNlCisKIHZvaWQgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJl
ZUN1c3RvbUZvbnREYXRhKGNvbnN0IEZvbnREYXRhKikKIHsKIH0KQEAgLTMyLDUgKzYyLDYgQEAg
dm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEoY29uc3QgRm9u
dERhdGEqKQogdm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlRm9udERhdGEoY29uc3Qg
V2ViQ29yZTo6U2ltcGxlRm9udERhdGEqKQogewogfQorI2VuZGlmIC8vIEhBVkUoUUdMWVBIUykK
IAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU2lt
cGxlRm9udERhdGFRdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9T
aW1wbGVGb250RGF0YVF0LmNwcAppbmRleCA5YmYxMDMwLi45YmQ5ZGJlIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0
LmNwcApAQCAtMjQsMjAgKzI0LDk3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAi
U2ltcGxlRm9udERhdGEuaCIKIAorI2lmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgorI2Vsc2UKICNpbmNsdWRlIDxRRm9udE1ldHJpY3NGPgorI2VuZGlmCiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAogdm9pZCBTaW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2go
KQogeworI2lmIEhBVkUoUUdMWVBIUykKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIG1fdHJl
YXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKKyNlbHNlCiAgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9
IG1fcGxhdGZvcm1EYXRhLmZvbnQoKS5maXhlZFBpdGNoKCk7CisjZW5kaWYKIH0KIAorI2lmIEhB
VkUoUUdMWVBIUykKKworc3RhdGljIGNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZyYWN0aW9uID0gMC43
Oworc3RhdGljIGNvbnN0IGZsb2F0IGVtcGhhc2lzTWFya0ZyYWN0aW9uID0gMC41OworCitib29s
IFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJhY3Rl
cnMsIGludCBsZW5ndGgpIGNvbnN0Cit7CisgICAgUVJhd0ZvbnQgcmF3Rm9udChtX3BsYXRmb3Jt
RGF0YS5yYXdGb250KCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkg
eworICAgICAgICBpZiAoIXJhd0ZvbnQuc3VwcG9ydHNDaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8UUNo
YXI+KGNoYXJhY3RlcnNbaV0pKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lk
dGhGb3JHbHlwaChHbHlwaCkgY29uc3QKK3sKKyAgICAvLyBUaGUgZ2x5cGgtdG8td2lkdGggbWFw
IGlzIHBvcHVsYXRlZCBieSBHbHlwaFBhZ2U6OmZpbGwoKQorICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiAwOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6
OnNjYWxlZEZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBm
bG9hdCBzY2FsZUZhY3RvcikgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCBzY2FsZWRTaXplID0g
bHJvdW5kZihmb250RGVzY3JpcHRpb24uY29tcHV0ZWRTaXplKCkgKiBzY2FsZUZhY3Rvcik7Cisg
ICAgcmV0dXJuIG5ldyBTaW1wbGVGb250RGF0YShGb250UGxhdGZvcm1EYXRhKG1fcGxhdGZvcm1E
YXRhLCBzY2FsZWRTaXplKSwgaXNDdXN0b21Gb250KCksIGZhbHNlKTsKK30KKworU2ltcGxlRm9u
dERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3Jp
cHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fZGVyaXZlZEZvbnRE
YXRhKQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YSA9IERlcml2ZWRGb250RGF0YTo6Y3JlYXRl
KGlzQ3VzdG9tRm9udCgpKTsKKyAgICBpZiAoIW1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMp
CisgICAgICAgIG1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMgPSBzY2FsZWRGb250RGF0YShm
b250RGVzY3JpcHRpb24sIHNtYWxsQ2Fwc0ZyYWN0aW9uKTsKKworICAgIHJldHVybiBtX2Rlcml2
ZWRGb250RGF0YS0+c21hbGxDYXBzLmdldCgpOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxl
Rm9udERhdGE6OmVtcGhhc2lzTWFya0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9u
dERlc2NyaXB0aW9uKSBjb25zdAoreworICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEpCisgICAg
ICAgIG1fZGVyaXZlZEZvbnREYXRhID0gRGVyaXZlZEZvbnREYXRhOjpjcmVhdGUoaXNDdXN0b21G
b250KCkpOworICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFyaykKKyAgICAg
ICAgbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFyayA9IHNjYWxlZEZvbnREYXRhKGZvbnRE
ZXNjcmlwdGlvbiwgZW1waGFzaXNNYXJrRnJhY3Rpb24pOworCisgICAgcmV0dXJuIG1fZGVyaXZl
ZEZvbnREYXRhLT5lbXBoYXNpc01hcmsuZ2V0KCk7Cit9CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250
RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlwaCkgY29uc3QKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworICAgIHJldHVybiBGbG9hdFJlY3QoKTsKK30KKyNlbHNlCiBib29sIFNpbXBs
ZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCBpbnQpIGNvbnN0CiB7
CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtR2x5
cGhJbml0KCkKK3sKKyAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIG1fc3BhY2VHbHlwaCA9IDA7CisgICAgbV9hZGp1c3RlZFNwYWNlV2lkdGggPSBt
X3NwYWNlV2lkdGg7CisgICAgZGV0ZXJtaW5lUGl0Y2goKTsKKyAgICBtX21pc3NpbmdHbHlwaERh
dGEuZm9udERhdGEgPSB0aGlzOworICAgIG1fbWlzc2luZ0dseXBoRGF0YS5nbHlwaCA9IDA7Cit9
CisjZW5kaWYKKwogdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKIHsKICAgICBp
ZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkgewpAQCAtNDcsMTQgKzEyNCwyOCBAQCB2b2lkIFNp
bXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAgICAgICAgcmV0dXJuOwogICAgIH0KIAor
I2lmIEhBVkUoUUdMWVBIUykKKyAgICBRUmF3Rm9udCByYXdGb250KG1fcGxhdGZvcm1EYXRhLnJh
d0ZvbnQoKSk7CisgICAgZmxvYXQgZGVzY2VudCA9IHJhd0ZvbnQuZGVzY2VudCgpOworICAgIGZs
b2F0IGFzY2VudCA9IHJhd0ZvbnQuYXNjZW50KCk7CisgICAgZmxvYXQgeEhlaWdodCA9IHJhd0Zv
bnQueEhlaWdodCgpOworICAgIGZsb2F0IGxpbmVTcGFjaW5nID0gYXNjZW50ICsgZGVzY2VudCAr
IHJhd0ZvbnQubGVhZGluZygpICsgMTsKKworICAgIFFWZWN0b3I8cXVpbnQzMj4gaW5kZXhlcyA9
IHJhd0ZvbnQuZ2x5cGhJbmRleGVzRm9yU3RyaW5nKFFMYXRpbjFTdHJpbmcoIiAiKSk7CisgICAg
UVZlY3RvcjxRUG9pbnRGPiBhZHZhbmNlcyA9IHJhd0ZvbnQuYWR2YW5jZXNGb3JHbHlwaEluZGV4
ZXMoaW5kZXhlcyk7CisgICAgZmxvYXQgc3BhY2VXaWR0aCA9IGFkdmFuY2VzLmF0KDApLngoKTsK
KyNlbHNlCiAgICAgUUZvbnRNZXRyaWNzRiBmbShtX3BsYXRmb3JtRGF0YS5mb250KCkpOworICAg
IGZsb2F0IGRlc2NlbnQgPSBmbS5kZXNjZW50KCk7CisgICAgZmxvYXQgYXNjZW50ID0gZm0uYXNj
ZW50KCk7CisgICAgZmxvYXQgeEhlaWdodCA9IGZtLnhIZWlnaHQoKTsKKyAgICBmbG9hdCBsaW5l
U3BhY2luZyA9IGZtLmxpbmVTcGFjaW5nKCk7CisgICAgZmxvYXQgc3BhY2VXaWR0aCA9IGZtLndp
ZHRoKFFMYXRpbjFDaGFyKCcgJykpOworI2VuZGlmCiAKICAgICAvLyBRdCBzdWJ0cmFjdHMgMSBm
cm9tIHRoZSBkZXNjZW50IHRvIGFjY291bnQgZm9yIHRoZSBiYXNlbGluZSwKICAgICAvLyB3ZSBh
ZGQgaXQgYmFjayBoZXJlIHRvIGdldCBjb3JyZWN0IG1ldHJpY3MgZm9yIFdlYktpdC4KLSAgICBm
bG9hdCBkZXNjZW50ID0gZm0uZGVzY2VudCgpICsgMTsKLSAgICBmbG9hdCBhc2NlbnQgPSBmbS5h
c2NlbnQoKTsKLQotICAgIGZsb2F0IGxpbmVTcGFjaW5nID0gZm0ubGluZVNwYWNpbmcoKTsKKyAg
ICBkZXNjZW50ICs9IDE7CiAKICAgICAvLyBUaGUgbGluZSBzcGFjaW5nIHNob3VsZCBhbHdheXMg
YmUgPj0gKGFzY2VudCArIGRlc2NlbnQpLCBidXQgdGhpcwogICAgIC8vIG1heSBiZSBmYWxzZSBp
biBzb21lIGNhc2VzIGR1ZSB0byBtaXNiZWhhdmluZyBwbGF0Zm9ybSBsaWJyYXJpZXMuCkBAIC02
OSwyOCArMTYwLDI0IEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCiAgICAg
bV9mb250TWV0cmljcy5zZXRBc2NlbnQoYXNjZW50KTsKICAgICBtX2ZvbnRNZXRyaWNzLnNldERl
c2NlbnQoZGVzY2VudCk7CiAgICAgbV9mb250TWV0cmljcy5zZXRMaW5lU3BhY2luZyhsaW5lU3Bh
Y2luZyk7Ci0gICAgbV9mb250TWV0cmljcy5zZXRYSGVpZ2h0KGZtLnhIZWlnaHQoKSk7CisgICAg
bV9mb250TWV0cmljcy5zZXRYSGVpZ2h0KHhIZWlnaHQpOwogICAgIG1fZm9udE1ldHJpY3Muc2V0
TGluZUdhcChsaW5lR2FwKTsKLSAgICBtX3NwYWNlV2lkdGggPSBmbS53aWR0aChRTGF0aW4xQ2hh
cignICcpKTsKLX0KLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1HbHlwaEluaXQoKQot
ewotICAgIGlmICghbV9wbGF0Zm9ybURhdGEuc2l6ZSgpKQotICAgICAgICByZXR1cm47Ci0gICAg
bV9zcGFjZUdseXBoID0gMDsKLSAgICBkZXRlcm1pbmVQaXRjaCgpOwotICAgIG1fbWlzc2luZ0ds
eXBoRGF0YS5mb250RGF0YSA9IHRoaXM7Ci0gICAgbV9taXNzaW5nR2x5cGhEYXRhLmdseXBoID0g
MDsKKyAgICBtX3NwYWNlV2lkdGggPSBzcGFjZVdpZHRoOwogfQogCiB2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUNoYXJXaWR0aEluaXQoKQogewogICAgIGlmICghbV9wbGF0Zm9ybURhdGEu
c2l6ZSgpKQogICAgICAgICByZXR1cm47Ci0gICAgUUZvbnRNZXRyaWNzIGZtKG1fcGxhdGZvcm1E
YXRhLmZvbnQoKSk7CisjaWYgSEFWRShRR0xZUEhTKQorICAgIFFSYXdGb250IHJhd0ZvbnQobV9w
bGF0Zm9ybURhdGEucmF3Rm9udCgpKTsKKyAgICBtX2F2Z0NoYXJXaWR0aCA9IHJhd0ZvbnQuYXZl
cmFnZUNoYXJXaWR0aCgpOworICAgIG1fbWF4Q2hhcldpZHRoID0gcmF3Rm9udC5tYXhDaGFyV2lk
dGgoKTsKKyNlbHNlCisgICAgUUZvbnRNZXRyaWNzRiBmbShtX3BsYXRmb3JtRGF0YS5mb250KCkp
OwogICAgIG1fYXZnQ2hhcldpZHRoID0gZm0uYXZlcmFnZUNoYXJXaWR0aCgpOwogICAgIG1fbWF4
Q2hhcldpZHRoID0gZm0ubWF4V2lkdGgoKTsKKyNlbmRpZgogfQogCiB2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybURlc3Ryb3koKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>91933</attachid>
            <date>2011-05-02 09:53:08 -0700</date>
            <delta_ts>2011-05-04 06:06:43 -0700</delta_ts>
            <desc>Proposed patch v3</desc>
            <filename>bug-51106-v3.diff</filename>
            <type>text/plain</type>
            <size>32462</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxMDU2NzcwLi4wMzJhNDRhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNTkg
QEAKKzIwMTEtMDUtMDIgIEFuZHJlYXMgS2xpbmcgIDxrbGluZ0B3ZWJraXQub3JnPgorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gSW1wbGVtZW50
IHRoZSBmYXN0IGZvbnQgcGF0aCBmb3IgUXQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTUxMTA2CisKKyAgICAgICAgVXNlIHRoZSBuZXcgUVJhd0ZvbnQg
YW5kIFFHbHlwaHMgQVBJcyBpbiBRdCA0LjggdG8gaW1wbGVtZW50IHRoZSBmYXN0IHBhdGhzIGZv
cgorICAgICAgICByZW5kZXJpbmcgYW5kIG1lYXN1cmVtZW50IG9mIHNpbXBsZSB0ZXh0LgorCisg
ICAgICAgIFNpbmNlIHRoaXMgaXMgc3RpbGwgdW5yZWxlYXNlZCBBUEksIGl0J3MgZ3VhcmRlZCBi
eSBIQVZFKFFHTFlQSFMpIHVudGlsIHRoZSBuZXcKKyAgICAgICAgQVBJcyBhcmUgZnVsbHkgaW50
ZWdyYXRlZCBpbnRvIHRoZSA0LjggcmVsZWFzZSBicmFuY2guCisKKyAgICAgICAgKiBXZWJDb3Jl
LnBybzoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OmRyYXdUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmNvZGVQYXRo
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmdldEFsdGVybmF0
ZUZvbnRGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0Rm9u
dERhdGFGb3JDaGFyYWN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Z2V0TGFz
dFJlc29ydEZhbGxiYWNrRm9udCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9u
dFBsYXRmb3JtRGF0YS5oOgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YVByaXZh
dGU6OkZvbnRQbGF0Zm9ybURhdGFQcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0
Zm9ybURhdGE6OkZvbnRQbGF0Zm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRm
b3JtRGF0YTo6cmF3Rm9udCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBs
YXRmb3JtRGF0YVF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGE6OkZv
bnRQbGF0Zm9ybURhdGEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpmaWxsUGVuRm9yQ29udGV4dCk6CisgICAgICAgIChXZWJD
b3JlOjpzdHJva2VQZW5Gb3JDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdUZXh0Q29t
bW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcGxl
eFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgIChX
ZWJDb3JlOjpGb250OjpjYW5FeHBhbmRBcm91bmRJZGVvZ3JhcGhzSW5Db21wbGV4VGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3U2ltcGxlVGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHbHlw
aFBhZ2U6OmZpbGwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L1NpbXBsZUZvbnRE
YXRhUXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OmRldGVybWluZVBp
dGNoKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3Rl
cnMpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JH
bHlwaCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6c2NhbGVkRm9udERhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjplbXBoYXNpc01hcmtGb250RGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlw
aCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1HbHlwaEluaXQp
OgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCk6CisgICAg
ICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1DaGFyV2lkdGhJbml0KToKKwog
MjAxMS0wNS0wMSAgQWJoaXNoZWsgQXJ5YSAgPGluZmVybm9AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IEVyaWMgQ2FybHNvbi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUucHJvIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KaW5kZXggNjE1YzNmZS4u
ODEwNjFjZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KKysrIGIvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5wcm8KQEAgLTE5MzUsNiArMTkzNSw3IEBAIEhFQURFUlMgKz0g
XAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRNZXRyaWNzLmggXAogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL0ZvbnQuaCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR2VuZXJhdGVkSW1hZ2UuaCBc
CisgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhQYWdlVHJlZU5vZGUuaCBcCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhZGllbnQuaCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3ND
b250ZXh0LmggXAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaCBcCkBAIC0z
MDU2LDYgKzMwNTcsMjAgQEAgY29udGFpbnMoREVGSU5FUywgV1RGX1VTRV9RVF9CRUFSRVI9MSkg
ewogICAgICAgICBwbGF0Zm9ybS9uZXR3b3JrL3F0L05ldHdvcmtTdGF0ZU5vdGlmaWVyUXQuY3Bw
CiB9CiAKKyFsZXNzVGhhbihRVF9NQUpPUl9WRVJTSU9OLDQpOiFsZXNzVGhhbihRVF9NSU5PUl9W
RVJTSU9OLCA4KTpIQVZFX1FHTFlQSFM9MQorCishaXNFbXB0eShIQVZFX1FHTFlQSFMpIHsKKyAg
ICBERUZJTkVTICs9IEhBVkVfUUdMWVBIUz0xCisKKyAgICBTT1VSQ0VTICs9IFwKKyAgICAgICAg
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dy
YXBoaWNzL0dseXBoUGFnZVRyZWVOb2RlLmNwcCBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNz
L1dpZHRoSXRlcmF0b3IuY3BwCisKKyAgICBIRUFERVJTICs9IFwKKyAgICAgICAgcGxhdGZvcm0v
Z3JhcGhpY3MvV2lkdGhJdGVyYXRvci5oCit9CisKIGNvbnRhaW5zKERFRklORVMsIEVOQUJMRV9H
RU9MT0NBVElPTj0xKSB7CiAgICAgdjggewogICAgICAgICBTT1VSQ0VTICs9IFwKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKaW5kZXggYmJjMzliOC4uNjVlZjZiOCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKQEAgLTI3LDYgKzI3
LDEwIEBACiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAj
aW5jbHVkZSAiRm9udFRyYW5zY29kZXIuaCIKKyNpZiBQTEFURk9STShRVCkgJiYgSEFWRShRR0xZ
UEhTKQorI2luY2x1ZGUgIkNvbnRleHRTaGFkb3cuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNlbmRpZgogI2luY2x1ZGUgIkludFBvaW50LmgiCiAjaW5jbHVkZSAiR2x5cGhCdWZm
ZXIuaCIKICNpbmNsdWRlICJUZXh0UnVuLmgiCkBAIC0xMzksNyArMTQzLDE0IEBAIHZvaWQgRm9u
dDo6ZHJhd1RleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4s
IGNvbnN0IEZsb2F0UG9pCiAgICAgfQogI2VuZGlmCiAKLSAgICBpZiAoY29kZVBhdGgocnVuKSAh
PSBDb21wbGV4KQorICAgIENvZGVQYXRoIGNvZGVQYXRoVG9Vc2UgPSBjb2RlUGF0aChydW4pOwor
CisjaWYgUExBVEZPUk0oUVQpICYmIEhBVkUoUUdMWVBIUykKKyAgICBpZiAoY29udGV4dC0+dGV4
dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZVN0cm9rZSB8fCBjb250ZXh0LT5jb250ZXh0U2hhZG93
KCktPm1fdHlwZSAhPSBDb250ZXh0U2hhZG93OjpOb1NoYWRvdykKKyAgICAgICAgY29kZVBhdGhU
b1VzZSA9IENvbXBsZXg7CisjZW5kaWYKKworICAgIGlmIChjb2RlUGF0aFRvVXNlICE9IENvbXBs
ZXgpCiAgICAgICAgIHJldHVybiBkcmF3U2ltcGxlVGV4dChjb250ZXh0LCBydW4sIHBvaW50LCBm
cm9tLCB0byk7CiAKICAgICByZXR1cm4gZHJhd0NvbXBsZXhUZXh0KGNvbnRleHQsIHJ1biwgcG9p
bnQsIGZyb20sIHRvKTsKQEAgLTI3NSw3ICsyODYsNyBAQCBGb250OjpDb2RlUGF0aCBGb250Ojpj
b2RlUGF0aChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0CiAgICAgaWYgKHNfY29kZVBhdGggIT0g
QXV0bykKICAgICAgICAgcmV0dXJuIHNfY29kZVBhdGg7CiAKLSNpZiBQTEFURk9STShRVCkKKyNp
ZiBQTEFURk9STShRVCkgJiYgIUhBVkUoUUdMWVBIUykKICAgICBpZiAocnVuLmV4cGFuc2lvbigp
IHx8IHJ1bi5ydGwoKSB8fCBpc1NtYWxsQ2FwcygpIHx8IHdvcmRTcGFjaW5nKCkgfHwgbGV0dGVy
U3BhY2luZygpKQogICAgICAgICByZXR1cm4gQ29tcGxleDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKaW5kZXgg
YWY5OTllYS4uMjQwODU0MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCkBAIC0zNzUsNyArMzc1LDcgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmRyYXdJbWFnZShJbWFnZSogaW1hZ2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xv
clNwYWNlLCBjb25zdAogICAgIGRyYXdJbWFnZShpbWFnZSwgc3R5bGVDb2xvclNwYWNlLCBGbG9h
dFJlY3QoZGVzdCksIHNyY1JlY3QsIG9wLCB1c2VMb3dRdWFsaXR5U2NhbGUpOwogfQogCi0jaWYg
IU9TKFdJTkNFKSB8fCBQTEFURk9STShRVCkKKyNpZiAhT1MoV0lOQ0UpIHx8IChQTEFURk9STShR
VCkgJiYgIUhBVkUoUUdMWVBIUykpCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1RleHQoY29u
c3QgRm9udCYgZm9udCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCwgaW50IGZyb20sIGludCB0bykKIHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEu
Y3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3Bw
CmluZGV4IGYyYTA2ZjQuLjMzZjlhZTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5jcHAKQEAgLTEyMiw3ICsxMjIsNyBAQCBTaW1w
bGVGb250RGF0YTo6U2ltcGxlRm9udERhdGEoUGFzc093blB0cjxTVkdGb250RGF0YT4gc3ZnRm9u
dERhdGEsIGludCBzaXplLCBibwogfQogI2VuZGlmCiAKLSNpZiAhUExBVEZPUk0oUVQpCisjaWYg
IShQTEFURk9STShRVCkgJiYgIUhBVkUoUUdMWVBIUykpCiAvLyBFc3RpbWF0ZXMgb2YgYXZnQ2hh
cldpZHRoIGFuZCBtYXhDaGFyV2lkdGggZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQg
YWNjZXNzaW5nIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBmb250Lgogdm9pZCBTaW1wbGVGb250RGF0
YTo6aW5pdENoYXJXaWR0aHMoKQogewpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKaW5kZXggMGZjYzY3Yi4uODhmMGZkMSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCkBAIC0x
ODQsNiArMTg0LDExIEBAIHB1YmxpYzoKICNlbmRpZgogCiBwcml2YXRlOgorI2lmIFBMQVRGT1JN
KFFUKSAmJiBIQVZFKFFHTFlQSFMpCisgICAgLy8gR2x5cGhQYWdlOjpmaWxsKCkgZmlsbHMgaW4g
bV9nbHlwaFRvV2lkdGhNYXAgb24gUXQuCisgICAgZnJpZW5kIGNsYXNzIEdseXBoUGFnZTsKKyNl
bmRpZgorCiAgICAgdm9pZCBwbGF0Zm9ybUluaXQoKTsKICAgICB2b2lkIHBsYXRmb3JtR2x5cGhJ
bml0KCk7CiAgICAgdm9pZCBwbGF0Zm9ybUNoYXJXaWR0aEluaXQoKTsKQEAgLTI3OSw5ICsyODQs
OCBAQCBwcml2YXRlOgogI2VuZGlmCiAjZW5kaWYKIH07Ci0gICAgCi0gICAgCi0jaWYgIVBMQVRG
T1JNKFFUKQorCisjaWYgIShQTEFURk9STShRVCkgJiYgIUhBVkUoUUdMWVBIUykpCiBBTFdBWVNf
SU5MSU5FIEZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6Ym91bmRzRm9yR2x5cGgoR2x5cGggZ2x5
cGgpIGNvbnN0CiB7CiAgICAgaWYgKGlzWmVyb1dpZHRoU3BhY2VHbHlwaChnbHlwaCkpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q2FjaGVRdC5jcHAK
aW5kZXggYzU5YzUyMy4uNzkyYjkxNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcApAQCAtMzUsNiArMzUsOSBAQAogI2luY2x1
ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KIAogI2luY2x1ZGUgPFFGb250PgorI2lmIEhBVkUo
UUdMWVBIUykKKyNpbmNsdWRlIDxRVGV4dExheW91dD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3Bh
Y2UgV1RGOwogCkBAIC00NCw5ICs0Nyw0NyBAQCB2b2lkIEZvbnRDYWNoZTo6cGxhdGZvcm1Jbml0
KCkKIHsKIH0KIAotY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFG
b3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmLCBjb25zdCBVQ2hhciosIGludCkKKyNpZiBIQVZFKFFH
TFlQSFMpCitzdGF0aWMgYm9vbCBnZXRBbHRlcm5hdGVGb250Rm9yQ2hhcmFjdGVycyhjb25zdCBR
U3RyaW5nJiBzdHJpbmcsIGNvbnN0IFFGb250JiByZXF1ZXN0ZWRGb250LCBRUmF3Rm9udCYgYWx0
ZXJuYXRlRm9udCkKIHsKKyAgICBRRm9udCBmb250KHJlcXVlc3RlZEZvbnQpOworICAgIGZvbnQu
c2V0U3R5bGVTdHJhdGVneShRRm9udDo6Tm9Gb250TWVyZ2luZyk7CisKKyAgICBRVGV4dExheW91
dCBsYXlvdXQoc3RyaW5nLCBmb250KTsKKyAgICBsYXlvdXQuYmVnaW5MYXlvdXQoKTsKKyAgICBs
YXlvdXQuY3JlYXRlTGluZSgpOworICAgIGxheW91dC5lbmRMYXlvdXQoKTsKKworICAgIFFMaXN0
PFFHbHlwaHM+IGdseXBoTGlzdCA9IGxheW91dC5nbHlwaHMoKTsKKworICAgIEFTU0VSVChnbHlw
aExpc3Quc2l6ZSgpID09IDEpOworCisgICAgY29uc3QgUUdseXBocyYgZ2x5cGhzKGdseXBoTGlz
dC5hdCgwKSk7CisgICAgUVZlY3RvcjxxdWludDMyPiBnbHlwaEluZGV4ZXMgPSBnbHlwaHMuZ2x5
cGhJbmRleGVzKCk7CisKKyAgICBpZiAoZ2x5cGhJbmRleGVzLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgYWx0ZXJuYXRlRm9udCA9IGdseXBocy5mb250KCk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNo
ZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFVDaGFy
KiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKQoreworI2lmIEhBVkUoUUdMWVBIUykKKyAgICBRU3Ry
aW5nIHFzdHJpbmcgPSBRU3RyaW5nOjpmcm9tUmF3RGF0YShyZWludGVycHJldF9jYXN0PGNvbnN0
IFFDaGFyKj4oY2hhcmFjdGVycyksIGxlbmd0aCk7CisgICAgUVJhd0ZvbnQgY29tcHV0ZWRGb250
OworICAgIGlmICghZ2V0QWx0ZXJuYXRlRm9udEZvckNoYXJhY3RlcnMocXN0cmluZywgZm9udC5m
b250KCksIGNvbXB1dGVkRm9udCkpCisgICAgICAgIHJldHVybiAwOworICAgIEZvbnRQbGF0Zm9y
bURhdGEgYWx0ZXJuYXRlRm9udChjb21wdXRlZEZvbnQpOworICAgIHJldHVybiBnZXRDYWNoZWRG
b250RGF0YSgmYWx0ZXJuYXRlRm9udCk7CisjZWxzZQorICAgIFFfVU5VU0VEKGZvbnQpOworICAg
IFFfVU5VU0VEKGNoYXJhY3RlcnMpOworICAgIFFfVU5VU0VEKGxlbmd0aCk7CiAgICAgcmV0dXJu
IDA7CisjZW5kaWYKIH0KIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZv
bnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKQEAgLTU3LDcgKzk4LDcgQEAgU2ltcGxl
Rm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9u
dCYgZm9udCkKIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFj
a0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pCiB7CiAgICAgY29u
c3QgQXRvbWljU3RyaW5nIGZhbGxiYWNrRmFtaWx5ID0gUUZvbnQoZm9udERlc2NyaXB0aW9uLmZh
bWlseSgpLmZhbWlseSgpKS5sYXN0UmVzb3J0RmFtaWx5KCk7Ci0gICAgcmV0dXJuIGdldENhY2hl
ZEZvbnREYXRhKG5ldyBGb250UGxhdGZvcm1EYXRhKGZvbnREZXNjcmlwdGlvbiwgZmFsbGJhY2tG
YW1pbHkpKTsKKyAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoZm9udERlc2NyaXB0aW9uLCBm
YWxsYmFja0ZhbWlseSk7CiB9CiAKIHZvaWQgRm9udENhY2hlOjpnZXRUcmFpdHNJbkZhbWlseShj
b25zdCBBdG9taWNTdHJpbmcmLCBWZWN0b3I8dW5zaWduZWQ+JikKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaAppbmRleCA0
YTkyYWNmLi44ZTU3ZTU5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9Gb250UGxhdGZvcm1EYXRhLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YS5oCkBAIC0yOCw2ICsyOCw5IEBACiAjaW5jbHVk
ZSAiRm9udE9yaWVudGF0aW9uLmgiCiAjaW5jbHVkZSA8UUZvbnQ+CiAjaW5jbHVkZSA8UUhhc2g+
CisjaWYgSEFWRShRR0xZUEhTKQorI2luY2x1ZGUgPFFSYXdGb250PgorI2VuZGlmCiAjaW5jbHVk
ZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgogCkBAIC01MCwx
NiArNTMsMzIgQEAgcHVibGljOgogICAgIHsgfQogICAgIEZvbnRQbGF0Zm9ybURhdGFQcml2YXRl
KGNvbnN0IFFGb250JiBmb250KQogICAgICAgICA6IGZvbnQoZm9udCkKKyNpZiBIQVZFKFFHTFlQ
SFMpCisgICAgICAgICwgcmF3Rm9udChRUmF3Rm9udDo6ZnJvbUZvbnQoZm9udCwgUUZvbnREYXRh
YmFzZTo6QW55KSkKKyNlbmRpZgogICAgICAgICAsIHNpemUoZm9udC5waXhlbFNpemUoKSkKICAg
ICAgICAgLCBib2xkKGZvbnQuYm9sZCgpKQogICAgICAgICAsIG9ibGlxdWUoZmFsc2UpCiAgICAg
ICAgICwgaXNEZWxldGVkVmFsdWUoZmFsc2UpCiAgICAgeyB9CisjaWYgSEFWRShRR0xZUEhTKQor
ICAgIEZvbnRQbGF0Zm9ybURhdGFQcml2YXRlKGNvbnN0IFFSYXdGb250JiByYXdGb250KQorICAg
ICAgICA6IGZvbnQoKQorICAgICAgICAsIHJhd0ZvbnQocmF3Rm9udCkKKyAgICAgICAgLCBzaXpl
KHJhd0ZvbnQucGl4ZWxTaXplKCkpCisgICAgICAgICwgYm9sZChyYXdGb250LndlaWdodCgpID49
IFFGb250OjpCb2xkKQorICAgICAgICAsIG9ibGlxdWUoZmFsc2UpCisgICAgICAgICwgaXNEZWxl
dGVkVmFsdWUoZmFsc2UpCisgICAgeyB9CisjZW5kaWYKICAgICBGb250UGxhdGZvcm1EYXRhUHJp
dmF0ZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCiAgICAgICAgIDogaXNEZWxldGVk
VmFsdWUodHJ1ZSkKICAgICB7IH0KIAogICAgIFFGb250IGZvbnQ7CisjaWYgSEFWRShRR0xZUEhT
KQorICAgIFFSYXdGb250IHJhd0ZvbnQ7CisjZW5kaWYKICAgICBmbG9hdCBzaXplOwogICAgIGJv
b2wgYm9sZCA6IDE7CiAgICAgYm9vbCBvYmxpcXVlIDogMTsKQEAgLTc0LDYgKzkzLDEyIEBAIHB1
YmxpYzoKICAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IFFGb250JiBmb250KQogICAgICAgICA6
IG1fZGF0YShhZG9wdFJlZihuZXcgRm9udFBsYXRmb3JtRGF0YVByaXZhdGUoZm9udCkpKQogICAg
IHsgfQorI2lmIEhBVkUoUUdMWVBIUykKKyAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmLCBmbG9hdCBzaXplKTsKKyAgICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IFFS
YXdGb250JiByYXdGb250KQorICAgICAgICA6IG1fZGF0YShhZG9wdFJlZihuZXcgRm9udFBsYXRm
b3JtRGF0YVByaXZhdGUocmF3Rm9udCkpKQorICAgIHsgfQorI2VuZGlmCiAgICAgRm9udFBsYXRm
b3JtRGF0YShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCiAgICAgICAgIDogbV9kYXRh
KGFkb3B0UmVmKG5ldyBGb250UGxhdGZvcm1EYXRhUHJpdmF0ZSgpKSkKICAgICB7CkBAIC05NCw2
ICsxMTksMTUgQEAgcHVibGljOgogICAgICAgICAgICAgcmV0dXJuIFFGb250KCk7CiAgICAgICAg
IHJldHVybiBtX2RhdGEtPmZvbnQ7CiAgICAgfQorI2lmIEhBVkUoUUdMWVBIUykKKyAgICBRUmF3
Rm9udCByYXdGb250KCkgY29uc3QKKyAgICB7CisgICAgICAgIFFfQVNTRVJUKCFpc0hhc2hUYWJs
ZURlbGV0ZWRWYWx1ZSgpKTsKKyAgICAgICAgaWYgKCFtX2RhdGEpCisgICAgICAgICAgICByZXR1
cm4gUVJhd0ZvbnQoKTsKKyAgICAgICAgcmV0dXJuIG1fZGF0YS0+cmF3Rm9udDsKKyAgICB9Cisj
ZW5kaWYKICAgICBmbG9hdCBzaXplKCkgY29uc3QKICAgICB7CiAgICAgICAgIFFfQVNTRVJUKCFp
c0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpKTsKQEAgLTE0OSw2ICsxODMsOSBAQCBwdWJsaWM6CiAg
ICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgY29uc3Q7CiAjZW5kaWYKIHByaXZhdGU6CisjaWYgSEFW
RShRR0xZUEhTKQorICAgIGZyaWVuZCBjbGFzcyBHbHlwaFBhZ2U7CisjZW5kaWYKICAgICBSZWZQ
dHI8Rm9udFBsYXRmb3JtRGF0YVByaXZhdGU+IG1fZGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhUXQu
Y3BwCmluZGV4IDk1ZGFiZDUuLjYxNDc0MjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YVF0LmNwcApAQCAtODAs
NyArODAsMjMgQEAgRm9udFBsYXRmb3JtRGF0YTo6Rm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250
RGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBBdG8KICAgICAvLyBtX2RhdGEtPnNpemUg
aWYgYSBmb250IHNpemUgb2YgemVybyBpcyByZXF1ZXN0ZWQgYW5kIHBpeGVsU2l6ZSgpCiAgICAg
Ly8gb3RoZXJ3aXNlLgogICAgIG1fZGF0YS0+c2l6ZSA9ICghcmVxdWVzdGVkU2l6ZSkgPyByZXF1
ZXN0ZWRTaXplIDogZm9udC5waXhlbFNpemUoKTsKKyNpZiBIQVZFKFFHTFlQSFMpCisgICAgbV9k
YXRhLT5yYXdGb250ID0gUVJhd0ZvbnQ6OmZyb21Gb250KGZvbnQsIFFGb250RGF0YWJhc2U6OkFu
eSk7CisjZW5kaWYKK30KKworI2lmIEhBVkUoUUdMWVBIUykKK0ZvbnRQbGF0Zm9ybURhdGE6OkZv
bnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgb3RoZXIsIGZsb2F0IHNpemUp
CisgICAgOiBtX2RhdGEoYWRvcHRSZWYobmV3IEZvbnRQbGF0Zm9ybURhdGFQcml2YXRlKCkpKQor
eworICAgIG1fZGF0YS0+Zm9udCA9IG90aGVyLm1fZGF0YS0+Zm9udDsKKyAgICBtX2RhdGEtPnJh
d0ZvbnQgPSBvdGhlci5tX2RhdGEtPnJhd0ZvbnQ7CisgICAgbV9kYXRhLT5ib2xkID0gb3RoZXIu
bV9kYXRhLT5ib2xkOworICAgIG1fZGF0YS0+b2JsaXF1ZSA9IG90aGVyLm1fZGF0YS0+b2JsaXF1
ZTsKKyAgICBtX2RhdGEtPmZvbnQuc2V0UGl4ZWxTaXplKHNpemUpOworICAgIG1fZGF0YS0+c2l6
ZSA9IHNpemUgPyBtX2RhdGEtPmZvbnQucGl4ZWxTaXplKCkgOiAwOwogfQorI2VuZGlmCiAKIGJv
b2wgRm9udFBsYXRmb3JtRGF0YTo6b3BlcmF0b3I9PShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBv
dGhlcikgY29uc3QKIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3F0L0ZvbnRRdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9G
b250UXQuY3BwCmluZGV4IDNmZTkwYTQuLjA2MmUxMTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcApAQCAtMjcsNiArMjcsOSBAQAogI2luY2x1
ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKICNp
bmNsdWRlICJGb250U2VsZWN0b3IuaCIKKyNpZiBIQVZFKFFHTFlQSFMpCisjaW5jbHVkZSAiR2x5
cGhCdWZmZXIuaCIKKyNlbmRpZgogI2luY2x1ZGUgIkdyYWRpZW50LmgiCiAjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKQEAgLTczLDYgKzc2
LDM5IEBAIHN0YXRpYyBRVGV4dExpbmUgc2V0dXBMYXlvdXQoUVRleHRMYXlvdXQqIGxheW91dCwg
Y29uc3QgVGV4dFJ1biYgc3R5bGUpCiAgICAgcmV0dXJuIGxpbmU7CiB9CiAKK3N0YXRpYyBRUGVu
IGZpbGxQZW5Gb3JDb250ZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4KQoreworICAgIGlmIChjdHgt
PmZpbGxHcmFkaWVudCgpKSB7CisgICAgICAgIFFCcnVzaCBicnVzaCgqY3R4LT5maWxsR3JhZGll
bnQoKS0+cGxhdGZvcm1HcmFkaWVudCgpKTsKKyAgICAgICAgYnJ1c2guc2V0VHJhbnNmb3JtKGN0
eC0+ZmlsbEdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0oKSk7CisgICAgICAgIHJl
dHVybiBRUGVuKGJydXNoLCAwKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5maWxsUGF0dGVybigp
KSB7CisgICAgICAgIEFmZmluZVRyYW5zZm9ybSBhZmZpbmU7CisgICAgICAgIHJldHVybiBRUGVu
KFFCcnVzaChjdHgtPmZpbGxQYXR0ZXJuKCktPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUp
KSwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIFFQZW4oUUNvbG9yKGN0eC0+ZmlsbENvbG9yKCkp
KTsKK30KKworc3RhdGljIFFQZW4gc3Ryb2tlUGVuRm9yQ29udGV4dChHcmFwaGljc0NvbnRleHQq
IGN0eCkKK3sKKyAgICBpZiAoY3R4LT5zdHJva2VHcmFkaWVudCgpKSB7CisgICAgICAgIFFCcnVz
aCBicnVzaCgqY3R4LT5zdHJva2VHcmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkpOworICAg
ICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5zdHJva2VHcmFkaWVudCgpLT5ncmFkaWVudFNw
YWNlVHJhbnNmb3JtKCkpOworICAgICAgICByZXR1cm4gUVBlbihicnVzaCwgY3R4LT5zdHJva2VU
aGlja25lc3MoKSk7CisgICAgfQorCisgICAgaWYgKGN0eC0+c3Ryb2tlUGF0dGVybigpKSB7Cisg
ICAgICAgIEFmZmluZVRyYW5zZm9ybSBhZmZpbmU7CisgICAgICAgIFFCcnVzaCBicnVzaChjdHgt
PnN0cm9rZVBhdHRlcm4oKS0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkpOworICAgICAg
ICByZXR1cm4gUVBlbihicnVzaCwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7CisgICAgfQorCisg
ICAgcmV0dXJuIFFQZW4oUUNvbG9yKGN0eC0+c3Ryb2tlQ29sb3IoKSksIGN0eC0+c3Ryb2tlVGhp
Y2tuZXNzKCkpOworfQorCiBzdGF0aWMgdm9pZCBkcmF3VGV4dENvbW1vbihHcmFwaGljc0NvbnRl
eHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50
IGZyb20sIGludCB0bywgY29uc3QgUUZvbnQmIGZvbnQsIGJvb2wgaXNDb21wbGV4VGV4dCkKIHsK
ICAgICBpZiAodG8gPCAwKQpAQCAtODEsMzEgKzExNywxMiBAQCBzdGF0aWMgdm9pZCBkcmF3VGV4
dENvbW1vbihHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBG
bG9hdAogICAgIFFQYWludGVyICpwID0gY3R4LT5wbGF0Zm9ybUNvbnRleHQoKTsKIAogICAgIFFQ
ZW4gdGV4dEZpbGxQZW47Ci0gICAgaWYgKGN0eC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9k
ZUZpbGwpIHsKLSAgICAgICAgaWYgKGN0eC0+ZmlsbEdyYWRpZW50KCkpIHsKLSAgICAgICAgICAg
IFFCcnVzaCBicnVzaCgqY3R4LT5maWxsR3JhZGllbnQoKS0+cGxhdGZvcm1HcmFkaWVudCgpKTsK
LSAgICAgICAgICAgIGJydXNoLnNldFRyYW5zZm9ybShjdHgtPmZpbGxHcmFkaWVudCgpLT5ncmFk
aWVudFNwYWNlVHJhbnNmb3JtKCkpOwotICAgICAgICAgICAgdGV4dEZpbGxQZW4gPSBRUGVuKGJy
dXNoLCAwKTsKLSAgICAgICAgfSBlbHNlIGlmIChjdHgtPmZpbGxQYXR0ZXJuKCkpIHsKLSAgICAg
ICAgICAgIEFmZmluZVRyYW5zZm9ybSBhZmZpbmU7Ci0gICAgICAgICAgICB0ZXh0RmlsbFBlbiA9
IFFQZW4oUUJydXNoKGN0eC0+ZmlsbFBhdHRlcm4oKS0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFm
ZmluZSkpLCAwKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB0ZXh0RmlsbFBlbiA9IFFQ
ZW4oUUNvbG9yKGN0eC0+ZmlsbENvbG9yKCkpKTsKLSAgICB9CisgICAgaWYgKGN0eC0+dGV4dERy
YXdpbmdNb2RlKCkgJiBUZXh0TW9kZUZpbGwpCisgICAgICAgIHRleHRGaWxsUGVuID0gZmlsbFBl
bkZvckNvbnRleHQoY3R4KTsKIAogICAgIFFQZW4gdGV4dFN0cm9rZVBlbjsKLSAgICBpZiAoY3R4
LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tlKSB7Ci0gICAgICAgIGlmIChjdHgt
PnN0cm9rZUdyYWRpZW50KCkpIHsKLSAgICAgICAgICAgIFFCcnVzaCBicnVzaCgqY3R4LT5zdHJv
a2VHcmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkpOwotICAgICAgICAgICAgYnJ1c2guc2V0
VHJhbnNmb3JtKGN0eC0+c3Ryb2tlR3JhZGllbnQoKS0+Z3JhZGllbnRTcGFjZVRyYW5zZm9ybSgp
KTsKLSAgICAgICAgICAgIHRleHRTdHJva2VQZW4gPSBRUGVuKGJydXNoLCBjdHgtPnN0cm9rZVRo
aWNrbmVzcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjdHgtPnN0cm9rZVBhdHRlcm4oKSkgewot
ICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFmZmluZTsKLSAgICAgICAgICAgIFFCcnVzaCBi
cnVzaChjdHgtPnN0cm9rZVBhdHRlcm4oKS0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkp
OwotICAgICAgICAgICAgdGV4dFN0cm9rZVBlbiA9IFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhp
Y2tuZXNzKCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHRleHRTdHJva2VQZW4gPSBR
UGVuKFFDb2xvcihjdHgtPnN0cm9rZUNvbG9yKCkpLCBjdHgtPnN0cm9rZVRoaWNrbmVzcygpKTsK
LSAgICB9CisgICAgaWYgKGN0eC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZVN0cm9rZSkK
KyAgICAgICAgdGV4dFN0cm9rZVBlbiA9IHN0cm9rZVBlbkZvckNvbnRleHQoY3R4KTsKIAogICAg
IFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMocnVuLmNoYXJhY3RlcnMo
KSwgcnVuLmxlbmd0aCgpKTsKICAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdEYXRhV2l0aG91
dFJlZihzYW5pdGl6ZWQpOwpAQCAtMjM1LDM3ICsyNTIsNjIgQEAgc3RhdGljIHZvaWQgZHJhd1Rl
eHRDb21tb24oR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
RmxvYXQKICAgICB9CiB9CiAKLXZvaWQgRm9udDo6ZHJhd1NpbXBsZVRleHQoR3JhcGhpY3NDb250
ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4sIHBv
aW50LCBmcm9tLCB0bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0gKi9mYWxzZSk7Ci19Ci0K
IHZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBU
ZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBj
b25zdAogewogICAgIGRyYXdUZXh0Q29tbW9uKGN0eCwgcnVuLCBwb2ludCwgZnJvbSwgdG8sIGZv
bnQoKSwgLyogaXNDb21wbGV4VGV4dCA9ICovdHJ1ZSk7CiB9CiAKLWludCBGb250OjplbXBoYXNp
c01hcmtBc2NlbnQoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3QKK2Zsb2F0IEZvbnQ6OmZsb2F0
V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2lt
cGxlRm9udERhdGEqPiosIEdseXBoT3ZlcmZsb3cqKSBjb25zdAogewotICAgIG5vdEltcGxlbWVu
dGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgaWYgKCFwcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURh
dGEoKS5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFydW4ubGVuZ3RoKCkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHJ1bi5sZW5ndGgoKSA9PSAxICYmIHRyZWF0
QXNTcGFjZShydW5bMF0pKQorICAgICAgICByZXR1cm4gUUZvbnRNZXRyaWNzKGZvbnQoKSkud2lk
dGgoc3BhY2UpICsgcnVuLmV4cGFuc2lvbigpOworCisgICAgU3RyaW5nIHNhbml0aXplZCA9IEZv
bnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOworICAg
IFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisKKyAg
ICBpbnQgdyA9IFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHN0cmluZyk7CisgICAgLy8gV2Vi
S2l0IGV4cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQgc3BhY2luZyBvbiB0aGUgZmlyc3QgY2hhcmFj
dGVyIChhcyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9lcykKKyAgICBpZiAodHJlYXRBc1NwYWNlKHJ1
blswXSkpCisgICAgICAgIHcgLT0gbV93b3JkU3BhY2luZzsKKworICAgIHJldHVybiB3ICsgcnVu
LmV4cGFuc2lvbigpOwogfQogCi1pbnQgRm9udDo6ZW1waGFzaXNNYXJrRGVzY2VudChjb25zdCBB
dG9taWNTdHJpbmcmKSBjb25zdAoraW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxl
eFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBmbG9hdCBwb3NpdGlvbiwgYm9vbCkgY29uc3QKIHsK
LSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOworICAgIFN0cmluZyBzYW5pdGl6
ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgp
KTsKKyAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQp
OworCisgICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9udCgpKTsKKyAgICBRVGV4dExp
bmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlvdXQsIHJ1bik7CisgICAgcmV0dXJuIGxpbmUueFRv
Q3Vyc29yKHBvc2l0aW9uKTsKIH0KIAotaW50IEZvbnQ6OmVtcGhhc2lzTWFya0hlaWdodChjb25z
dCBBdG9taWNTdHJpbmcmKSBjb25zdAorRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JD
b21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHB0LCBpbnQg
aCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAg
IHJldHVybiAwOworICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMo
cnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKTsKKyAgICBRU3RyaW5nIHN0cmluZyA9IGZy
b21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOworCisgICAgUVRleHRMYXlvdXQgbGF5b3V0
KHN0cmluZywgZm9udCgpKTsKKyAgICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlv
dXQsIHJ1bik7CisKKyAgICBmbG9hdCB4MSA9IGxpbmUuY3Vyc29yVG9YKGZyb20pOworICAgIGZs
b2F0IHgyID0gbGluZS5jdXJzb3JUb1godG8pOworICAgIGlmICh4MiA8IHgxKQorICAgICAgICBx
U3dhcCh4MSwgeDIpOworCisgICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4MSwgcHQueSgp
LCB4MiAtIHgxLCBoKTsKIH0KIAotdm9pZCBGb250OjpkcmF3RW1waGFzaXNNYXJrc0ZvclNpbXBs
ZVRleHQoR3JhcGhpY3NDb250ZXh0KiAvKiBjb250ZXh0ICovLCBjb25zdCBUZXh0UnVuJiAvKiBy
dW4gKi8sIGNvbnN0IEF0b21pY1N0cmluZyYgLyogbWFyayAqLywgY29uc3QgRmxvYXRQb2ludCYg
LyogcG9pbnQgKi8sIGludCAvKiBmcm9tICovLCBpbnQgLyogdG8gKi8pIGNvbnN0Citib29sIEZv
bnQ6OmNhblJldHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCgpCiB7Ci0gICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRm9udDo6ZHJhd0VtcGhh
c2lzTWFya3NGb3JDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIC8qIGNvbnRleHQgKi8sIGNv
bnN0IFRleHRSdW4mIC8qIHJ1biAqLywgY29uc3QgQXRvbWljU3RyaW5nJiAvKiBtYXJrICovLCBj
b25zdCBGbG9hdFBvaW50JiAvKiBwb2ludCAqLywgaW50IC8qIGZyb20gKi8sIGludCAvKiB0byAq
LykgY29uc3QKQEAgLTI3Myw0NiArMzE1LDYxIEBAIHZvaWQgRm9udDo6ZHJhd0VtcGhhc2lzTWFy
a3NGb3JDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIC8qIGNvbnRleHQgKi8sIGNvbnN0CiAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvclNpbXBs
ZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBHbHlwaEJ1ZmZlciogZ2x5cGhCdWZmZXIsIEhhc2hT
ZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cywgR2x5cGhPdmVyZmxvdyog
Z2x5cGhPdmVyZmxvdykgY29uc3QKKyNpZiBIQVZFKFFHTFlQSFMpCit2b2lkIEZvbnQ6OmRyYXdH
bHlwaHMoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9u
dERhdGEsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgaW50IGZyb20sIGludCBudW1H
bHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAogewotICAgIGlmICghcHJpbWFy
eUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBp
ZiAoY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CiAKLSAgICBp
ZiAoIXJ1bi5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgYm9vbCBzaG91bGRGaWxs
ID0gY29udGV4dC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZUZpbGw7CisgICAgYm9vbCBz
aG91bGRTdHJva2UgPSBjb250ZXh0LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tl
OwogCi0gICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hh
cmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwotICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0Rh
dGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisgICAgLy8gU3Ryb2tpbmcgdGV4dCBzaG91bGQgYWx3
YXlzIHRha2UgdGhlIGNvbXBsZXggcGF0aC4KKyAgICBBU1NFUlQoIXNob3VsZFN0cm9rZSk7CiAK
LSAgICBpbnQgdyA9IFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHN0cmluZywgLTEsIFF0OjpU
ZXh0QnlwYXNzU2hhcGluZyk7CisgICAgLy8gU2hhZG93ZWQgdGV4dCBzaG91bGQgYWx3YXlzIHRh
a2UgdGhlIGNvbXBsZXggcGF0aC4KKyAgICBBU1NFUlQoY29udGV4dC0+Y29udGV4dFNoYWRvdygp
LT5tX3R5cGUgPT0gQ29udGV4dFNoYWRvdzo6Tm9TaGFkb3cpOwogCi0gICAgLy8gV2ViS2l0IGV4
cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQgc3BhY2luZyBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIChh
cyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9lcykKLSAgICBpZiAodHJlYXRBc1NwYWNlKHJ1blswXSkp
Ci0gICAgICAgIHcgLT0gbV93b3JkU3BhY2luZzsKKyAgICBpZiAoIXNob3VsZEZpbGwgJiYgIXNo
b3VsZFN0cm9rZSkKKyAgICAgICAgcmV0dXJuOwogCi0gICAgcmV0dXJuIHcgKyBydW4uZXhwYW5z
aW9uKCk7Ci19CisgICAgUVZlY3RvcjxxdWludDMyPiBnbHlwaEluZGV4ZXM7CisgICAgUVZlY3Rv
cjxRUG9pbnRGPiBwb3NpdGlvbnM7CisgICAgZmxvYXQgeCA9IDA7CiAKLWZsb2F0IEZvbnQ6OmZs
b2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3Qg
U2ltcGxlRm9udERhdGEqPiosIEdseXBoT3ZlcmZsb3cqKSBjb25zdAotewotICAgIGlmICghcHJp
bWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpKQotICAgICAgICByZXR1cm4gMDsKKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CisgICAgICAgIEdseXBoIGds
eXBoID0gZ2x5cGhCdWZmZXIuZ2x5cGhBdChmcm9tICsgaSk7CisgICAgICAgIGZsb2F0IGFkdmFu
Y2UgPSBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpOworICAgICAgICBpZiAoIWdseXBo
KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGdseXBoSW5kZXhlcy5hcHBlbmQoZ2x5
cGgpOworICAgICAgICBwb3NpdGlvbnMuYXBwZW5kKFFQb2ludEYoeCwgMCkpOworICAgICAgICB4
ICs9IGFkdmFuY2U7CisgICAgfQogCi0gICAgaWYgKCFydW4ubGVuZ3RoKCkpCi0gICAgICAgIHJl
dHVybiAwOworICAgIFFHbHlwaHMgcXRHbHlwaHM7CisgICAgcXRHbHlwaHMuc2V0R2x5cGhJbmRl
eGVzKGdseXBoSW5kZXhlcyk7CisgICAgcXRHbHlwaHMuc2V0UG9zaXRpb25zKHBvc2l0aW9ucyk7
CisgICAgcXRHbHlwaHMuc2V0Rm9udChmb250RGF0YS0+cGxhdGZvcm1EYXRhKCkucmF3Rm9udCgp
KTsKIAotICAgIGlmIChydW4ubGVuZ3RoKCkgPT0gMSAmJiB0cmVhdEFzU3BhY2UocnVuWzBdKSkK
LSAgICAgICAgcmV0dXJuIFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHNwYWNlKSArIHJ1bi5l
eHBhbnNpb24oKTsKKyAgICBRUGFpbnRlciogcGFpbnRlciA9IGNvbnRleHQtPnBsYXRmb3JtQ29u
dGV4dCgpOwogCi0gICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhy
dW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwotICAgIFFTdHJpbmcgc3RyaW5nID0gZnJv
bVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisgICAgUVBlbiBwcmV2aW91c1BlbiA9IHBh
aW50ZXItPnBlbigpOworICAgIHBhaW50ZXItPnNldFBlbihmaWxsUGVuRm9yQ29udGV4dChjb250
ZXh0KSk7CisgICAgcGFpbnRlci0+ZHJhd0dseXBocyhwb2ludCwgcXRHbHlwaHMpOworICAgIHBh
aW50ZXItPnNldFBlbihwcmV2aW91c1Blbik7Cit9CiAKLSAgICBpbnQgdyA9IFFGb250TWV0cmlj
cyhmb250KCkpLndpZHRoKHN0cmluZyk7Ci0gICAgLy8gV2ViS2l0IGV4cGVjdHMgdXMgdG8gaWdu
b3JlIHdvcmQgc3BhY2luZyBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIChhcyBvcHBvc2VkIHRvIHdo
YXQgUXQgZG9lcykKLSAgICBpZiAodHJlYXRBc1NwYWNlKHJ1blswXSkpCi0gICAgICAgIHcgLT0g
bV93b3JkU3BhY2luZzsKK2Jvb2wgRm9udDo6Y2FuRXhwYW5kQXJvdW5kSWRlb2dyYXBoc0luQ29t
cGxleFRleHQoKQoreworICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHJldHVybiB3ICsgcnVu
LmV4cGFuc2lvbigpOworI2Vsc2UgLy8gIUhBVkUoUUdMWVBIUykKKwordm9pZCBGb250OjpkcmF3
U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25z
dCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBkcmF3
VGV4dENvbW1vbihjdHgsIHJ1biwgcG9pbnQsIGZyb20sIHRvLCBmb250KCksIC8qIGlzQ29tcGxl
eFRleHQgPSAqL2ZhbHNlKTsKIH0KIAogaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yU2lt
cGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0aW9uLCBib29sIGluY2x1ZGVQ
YXJ0aWFsR2x5cGhzKSBjb25zdApAQCAtMzM4LDE2ICszOTUsMjggQEAgaW50IEZvbnQ6Om9mZnNl
dEZvclBvc2l0aW9uRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0
aW9uLCBib28KICAgICByZXR1cm4gY3VyUG9zOwogfQogCi1pbnQgRm9udDo6b2Zmc2V0Rm9yUG9z
aXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHBvc2l0aW9uLCBi
b29sKSBjb25zdAorCitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBU
ZXh0UnVuJiBydW4sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgSGFzaFNldDxjb25zdCBTaW1w
bGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93
KSBjb25zdAogeworICAgIGlmICghcHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghcnVuLmxlbmd0aCgpKQorICAgICAgICBy
ZXR1cm4gMDsKKwogICAgIFN0cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMo
cnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpKTsKICAgICBRU3RyaW5nIHN0cmluZyA9IGZy
b21SYXdEYXRhV2l0aG91dFJlZihzYW5pdGl6ZWQpOwogCi0gICAgUVRleHRMYXlvdXQgbGF5b3V0
KHN0cmluZywgZm9udCgpKTsKLSAgICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlv
dXQsIHJ1bik7Ci0gICAgcmV0dXJuIGxpbmUueFRvQ3Vyc29yKHBvc2l0aW9uKTsKKyAgICBpbnQg
dyA9IFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHN0cmluZywgLTEsIFF0OjpUZXh0QnlwYXNz
U2hhcGluZyk7CisKKyAgICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUgd29yZCBzcGFj
aW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBRdCBkb2VzKQor
ICAgIGlmICh0cmVhdEFzU3BhY2UocnVuWzBdKSkKKyAgICAgICAgdyAtPSBtX3dvcmRTcGFjaW5n
OworCisgICAgcmV0dXJuIHcgKyBydW4uZXhwYW5zaW9uKCk7CiB9CiAKKwogRmxvYXRSZWN0IEZv
bnQ6OnNlbGVjdGlvblJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
RmxvYXRQb2ludCYgcHQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewogICAgIFN0
cmluZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMocnVuLmNoYXJhY3RlcnMoKSwg
cnVuLmxlbmd0aCgpKTsKQEAgLTM2MCwyNyArNDI5LDYgQEAgRmxvYXRSZWN0IEZvbnQ6OnNlbGVj
dGlvblJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2lu
dCYKICAgICByZXR1cm4gRmxvYXRSZWN0KHB0LngoKSArIHN0YXJ0WCwgcHQueSgpLCB3aWR0aCwg
aCk7CiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwdCwgaW50IGgsIGludCBmcm9tLCBp
bnQgdG8pIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNw
YWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwotICAgIFFTdHJpbmcgc3RyaW5n
ID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7Ci0KLSAgICBRVGV4dExheW91dCBs
YXlvdXQoc3RyaW5nLCBmb250KCkpOwotICAgIFFUZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQo
JmxheW91dCwgcnVuKTsKLQotICAgIGZsb2F0IHgxID0gbGluZS5jdXJzb3JUb1goZnJvbSk7Ci0g
ICAgZmxvYXQgeDIgPSBsaW5lLmN1cnNvclRvWCh0byk7Ci0gICAgaWYgKHgyIDwgeDEpCi0gICAg
ICAgIHFTd2FwKHgxLCB4Mik7Ci0KLSAgICByZXR1cm4gRmxvYXRSZWN0KHB0LngoKSArIHgxLCBw
dC55KCksIHgyIC0geDEsIGgpOwotfQotCi1ib29sIEZvbnQ6OmNhblJldHVybkZhbGxiYWNrRm9u
dHNGb3JDb21wbGV4VGV4dCgpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBib29sIEZvbnQ6
OmNhbkV4cGFuZEFyb3VuZElkZW9ncmFwaHNJbkNvbXBsZXhUZXh0KCkKIHsKICAgICByZXR1cm4g
ZmFsc2U7CkBAIC0zOTIsNiArNDQwLDggQEAgYm9vbCBGb250OjpwcmltYXJ5Rm9udEhhc0dseXBo
Rm9yQ2hhcmFjdGVyKFVDaGFyMzIpIGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKyNlbmRp
ZiAvLyBIQVZFKFFHTFlQSFMpCisKIFFGb250IEZvbnQ6OmZvbnQoKSBjb25zdAogewogICAgIFFG
b250IGYgPSBwcmltYXJ5Rm9udCgpLT5nZXRRdEZvbnQoKTsKQEAgLTQwMiw1ICs0NTIsNiBAQCBR
Rm9udCBGb250Ojpmb250KCkgY29uc3QKICAgICByZXR1cm4gZjsKIH0KIAorCiB9CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVO
b2RlUXQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdl
VHJlZU5vZGVRdC5jcHAKaW5kZXggMjEyMTIwNi4uYThmYzVjOSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVR
dC5jcHAKQEAgLTIzLDggKzIzLDM4IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAi
R2x5cGhQYWdlVHJlZU5vZGUuaCIKIAorI2lmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJTaW1w
bGVGb250RGF0YS5oIgorI2luY2x1ZGUgPFFGb250TWV0cmljc0Y+CisjaW5jbHVkZSA8UVRleHRM
YXlvdXQ+CisjZW5kaWYKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCisjaWYgSEFWRShRR0xZUEhT
KQorYm9vbCBHbHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgs
IFVDaGFyKiBidWZmZXIsIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCwgY29uc3QgU2ltcGxlRm9udERh
dGEqIGZvbnREYXRhKQoreworICAgIFFSYXdGb250IHJhd0ZvbnQgPSBmb250RGF0YS0+cGxhdGZv
cm1EYXRhKCkucmF3Rm9udCgpOworICAgIFFTdHJpbmcgcXN0cmluZyA9IFFTdHJpbmc6OmZyb21S
YXdEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUUNoYXIqPihidWZmZXIpLCBzdGF0aWNfY2Fz
dDxpbnQ+KGJ1ZmZlckxlbmd0aCkpOworICAgIFFWZWN0b3I8cXVpbnQzMj4gaW5kZXhlcyA9IHJh
d0ZvbnQuZ2x5cGhJbmRleGVzRm9yU3RyaW5nKHFzdHJpbmcpOworICAgIFFWZWN0b3I8UVBvaW50
Rj4gYWR2YW5jZXMgPSByYXdGb250LmFkdmFuY2VzRm9yR2x5cGhJbmRleGVzKGluZGV4ZXMpOwor
CisgICAgYm9vbCBoYXZlR2x5cGhzID0gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgR2x5cGggZ2x5cGggPSAoaSA8IGluZGV4ZXMu
c2l6ZSgpKSA/IGluZGV4ZXMuYXQoaSkgOiAwOworICAgICAgICBpZiAoIWdseXBoKQorICAgICAg
ICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgMCwgMCk7CisgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgaGF2ZUdseXBocyA9IHRydWU7CisgICAgICAgICAgICBmb250RGF0
YS0+bV9nbHlwaFRvV2lkdGhNYXAuc2V0TWV0cmljc0ZvckdseXBoKGdseXBoLCBhZHZhbmNlcy5h
dChpKS54KCkpOworICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwg
Z2x5cGgsIGZvbnREYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGF2ZUdseXBo
czsKK30KKyNlbHNlCisKIHZvaWQgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUN1c3RvbUZv
bnREYXRhKGNvbnN0IEZvbnREYXRhKikKIHsKIH0KQEAgLTMyLDUgKzYyLDYgQEAgdm9pZCBHbHlw
aFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEoY29uc3QgRm9udERhdGEqKQog
dm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlRm9udERhdGEoY29uc3QgV2ViQ29yZTo6
U2ltcGxlRm9udERhdGEqKQogewogfQorI2VuZGlmIC8vIEhBVkUoUUdMWVBIUykKIAogfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU2ltcGxlRm9udERh
dGFRdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250
RGF0YVF0LmNwcAppbmRleCA5YmYxMDMwLi40NzQxOWNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcApAQCAt
MjQsMjAgKzI0LDk2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiU2ltcGxlRm9u
dERhdGEuaCIKIAorI2lmIEhBVkUoUUdMWVBIUykKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5o
IgorI2Vsc2UKICNpbmNsdWRlIDxRRm9udE1ldHJpY3NGPgorI2VuZGlmCiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogdm9pZCBTaW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2goKQogeworI2lm
IEhBVkUoUUdMWVBIUykKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIG1fdHJlYXRBc0ZpeGVk
UGl0Y2ggPSBmYWxzZTsKKyNlbHNlCiAgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IG1fcGxhdGZv
cm1EYXRhLmZvbnQoKS5maXhlZFBpdGNoKCk7CisjZW5kaWYKIH0KIAorI2lmIEhBVkUoUUdMWVBI
UykKKworc3RhdGljIGNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZyYWN0aW9uID0gMC43Oworc3RhdGlj
IGNvbnN0IGZsb2F0IGVtcGhhc2lzTWFya0ZyYWN0aW9uID0gMC41OworCitib29sIFNpbXBsZUZv
bnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBs
ZW5ndGgpIGNvbnN0Cit7CisgICAgUVJhd0ZvbnQgcmF3Rm9udChtX3BsYXRmb3JtRGF0YS5yYXdG
b250KCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAg
ICBpZiAoIXJhd0ZvbnQuc3VwcG9ydHNDaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8UUNoYXI+KGNoYXJh
Y3RlcnNbaV0pKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlw
aChHbHlwaCkgY29uc3QKK3sKKyAgICAvLyBUaGUgZ2x5cGgtdG8td2lkdGggbWFwIGlzIHBvcHVs
YXRlZCBieSBHbHlwaFBhZ2U6OmZpbGwoKQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
IHJldHVybiAwOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNjYWxlZEZv
bnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBmbG9hdCBzY2Fs
ZUZhY3RvcikgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCBzY2FsZWRTaXplID0gbHJvdW5kZihm
b250RGVzY3JpcHRpb24uY29tcHV0ZWRTaXplKCkgKiBzY2FsZUZhY3Rvcik7CisgICAgcmV0dXJu
IG5ldyBTaW1wbGVGb250RGF0YShGb250UGxhdGZvcm1EYXRhKG1fcGxhdGZvcm1EYXRhLCBzY2Fs
ZWRTaXplKSwgaXNDdXN0b21Gb250KCksIGZhbHNlKTsKK30KKworU2ltcGxlRm9udERhdGEqIFNp
bXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZv
bnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fZGVyaXZlZEZvbnREYXRhKQorICAg
ICAgICBtX2Rlcml2ZWRGb250RGF0YSA9IERlcml2ZWRGb250RGF0YTo6Y3JlYXRlKGlzQ3VzdG9t
Rm9udCgpKTsKKyAgICBpZiAoIW1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMpCisgICAgICAg
IG1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMgPSBzY2FsZWRGb250RGF0YShmb250RGVzY3Jp
cHRpb24sIHNtYWxsQ2Fwc0ZyYWN0aW9uKTsKKworICAgIHJldHVybiBtX2Rlcml2ZWRGb250RGF0
YS0+c21hbGxDYXBzLmdldCgpOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6
OmVtcGhhc2lzTWFya0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0
aW9uKSBjb25zdAoreworICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEpCisgICAgICAgIG1fZGVy
aXZlZEZvbnREYXRhID0gRGVyaXZlZEZvbnREYXRhOjpjcmVhdGUoaXNDdXN0b21Gb250KCkpOwor
ICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFyaykKKyAgICAgICAgbV9kZXJp
dmVkRm9udERhdGEtPmVtcGhhc2lzTWFyayA9IHNjYWxlZEZvbnREYXRhKGZvbnREZXNjcmlwdGlv
biwgZW1waGFzaXNNYXJrRnJhY3Rpb24pOworCisgICAgcmV0dXJuIG1fZGVyaXZlZEZvbnREYXRh
LT5lbXBoYXNpc01hcmsuZ2V0KCk7Cit9CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxh
dGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlwaCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiBGbG9hdFJlY3QoKTsKK30KKyNlbHNlCiBib29sIFNpbXBsZUZvbnREYXRh
Ojpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCBpbnQpIGNvbnN0CiB7CiAgICAgcmV0
dXJuIHRydWU7CiB9CiAKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtR2x5cGhJbml0KCkK
K3sKKyAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworICAg
IG1fc3BhY2VHbHlwaCA9IDA7CisgICAgZGV0ZXJtaW5lUGl0Y2goKTsKKyAgICBtX21pc3NpbmdH
bHlwaERhdGEuZm9udERhdGEgPSB0aGlzOworICAgIG1fbWlzc2luZ0dseXBoRGF0YS5nbHlwaCA9
IDA7Cit9CisjZW5kaWYKKwogdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKIHsK
ICAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkgewpAQCAtNDcsMTQgKzEyMywyOCBAQCB2
b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAgICAgICAgcmV0dXJuOwogICAg
IH0KIAorI2lmIEhBVkUoUUdMWVBIUykKKyAgICBRUmF3Rm9udCByYXdGb250KG1fcGxhdGZvcm1E
YXRhLnJhd0ZvbnQoKSk7CisgICAgZmxvYXQgZGVzY2VudCA9IHJhd0ZvbnQuZGVzY2VudCgpOwor
ICAgIGZsb2F0IGFzY2VudCA9IHJhd0ZvbnQuYXNjZW50KCk7CisgICAgZmxvYXQgeEhlaWdodCA9
IHJhd0ZvbnQueEhlaWdodCgpOworICAgIGZsb2F0IGxpbmVTcGFjaW5nID0gYXNjZW50ICsgZGVz
Y2VudCArIHJhd0ZvbnQubGVhZGluZygpICsgMTsKKworICAgIFFWZWN0b3I8cXVpbnQzMj4gaW5k
ZXhlcyA9IHJhd0ZvbnQuZ2x5cGhJbmRleGVzRm9yU3RyaW5nKFFMYXRpbjFTdHJpbmcoIiAiKSk7
CisgICAgUVZlY3RvcjxRUG9pbnRGPiBhZHZhbmNlcyA9IHJhd0ZvbnQuYWR2YW5jZXNGb3JHbHlw
aEluZGV4ZXMoaW5kZXhlcyk7CisgICAgZmxvYXQgc3BhY2VXaWR0aCA9IGFkdmFuY2VzLmF0KDAp
LngoKTsKKyNlbHNlCiAgICAgUUZvbnRNZXRyaWNzRiBmbShtX3BsYXRmb3JtRGF0YS5mb250KCkp
OworICAgIGZsb2F0IGRlc2NlbnQgPSBmbS5kZXNjZW50KCk7CisgICAgZmxvYXQgYXNjZW50ID0g
Zm0uYXNjZW50KCk7CisgICAgZmxvYXQgeEhlaWdodCA9IGZtLnhIZWlnaHQoKTsKKyAgICBmbG9h
dCBsaW5lU3BhY2luZyA9IGZtLmxpbmVTcGFjaW5nKCk7CisgICAgZmxvYXQgc3BhY2VXaWR0aCA9
IGZtLndpZHRoKFFMYXRpbjFDaGFyKCcgJykpOworI2VuZGlmCiAKICAgICAvLyBRdCBzdWJ0cmFj
dHMgMSBmcm9tIHRoZSBkZXNjZW50IHRvIGFjY291bnQgZm9yIHRoZSBiYXNlbGluZSwKICAgICAv
LyB3ZSBhZGQgaXQgYmFjayBoZXJlIHRvIGdldCBjb3JyZWN0IG1ldHJpY3MgZm9yIFdlYktpdC4K
LSAgICBmbG9hdCBkZXNjZW50ID0gZm0uZGVzY2VudCgpICsgMTsKLSAgICBmbG9hdCBhc2NlbnQg
PSBmbS5hc2NlbnQoKTsKLQotICAgIGZsb2F0IGxpbmVTcGFjaW5nID0gZm0ubGluZVNwYWNpbmco
KTsKKyAgICBkZXNjZW50ICs9IDE7CiAKICAgICAvLyBUaGUgbGluZSBzcGFjaW5nIHNob3VsZCBh
bHdheXMgYmUgPj0gKGFzY2VudCArIGRlc2NlbnQpLCBidXQgdGhpcwogICAgIC8vIG1heSBiZSBm
YWxzZSBpbiBzb21lIGNhc2VzIGR1ZSB0byBtaXNiZWhhdmluZyBwbGF0Zm9ybSBsaWJyYXJpZXMu
CkBAIC02OSwyOCArMTU5LDI0IEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgp
CiAgICAgbV9mb250TWV0cmljcy5zZXRBc2NlbnQoYXNjZW50KTsKICAgICBtX2ZvbnRNZXRyaWNz
LnNldERlc2NlbnQoZGVzY2VudCk7CiAgICAgbV9mb250TWV0cmljcy5zZXRMaW5lU3BhY2luZyhs
aW5lU3BhY2luZyk7Ci0gICAgbV9mb250TWV0cmljcy5zZXRYSGVpZ2h0KGZtLnhIZWlnaHQoKSk7
CisgICAgbV9mb250TWV0cmljcy5zZXRYSGVpZ2h0KHhIZWlnaHQpOwogICAgIG1fZm9udE1ldHJp
Y3Muc2V0TGluZUdhcChsaW5lR2FwKTsKLSAgICBtX3NwYWNlV2lkdGggPSBmbS53aWR0aChRTGF0
aW4xQ2hhcignICcpKTsKLX0KLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1HbHlwaElu
aXQoKQotewotICAgIGlmICghbV9wbGF0Zm9ybURhdGEuc2l6ZSgpKQotICAgICAgICByZXR1cm47
Ci0gICAgbV9zcGFjZUdseXBoID0gMDsKLSAgICBkZXRlcm1pbmVQaXRjaCgpOwotICAgIG1fbWlz
c2luZ0dseXBoRGF0YS5mb250RGF0YSA9IHRoaXM7Ci0gICAgbV9taXNzaW5nR2x5cGhEYXRhLmds
eXBoID0gMDsKKyAgICBtX3NwYWNlV2lkdGggPSBzcGFjZVdpZHRoOwogfQogCiB2b2lkIFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJXaWR0aEluaXQoKQogewogICAgIGlmICghbV9wbGF0Zm9y
bURhdGEuc2l6ZSgpKQogICAgICAgICByZXR1cm47Ci0gICAgUUZvbnRNZXRyaWNzIGZtKG1fcGxh
dGZvcm1EYXRhLmZvbnQoKSk7CisjaWYgSEFWRShRR0xZUEhTKQorICAgIFFSYXdGb250IHJhd0Zv
bnQobV9wbGF0Zm9ybURhdGEucmF3Rm9udCgpKTsKKyAgICBtX2F2Z0NoYXJXaWR0aCA9IHJhd0Zv
bnQuYXZlcmFnZUNoYXJXaWR0aCgpOworICAgIG1fbWF4Q2hhcldpZHRoID0gcmF3Rm9udC5tYXhD
aGFyV2lkdGgoKTsKKyNlbHNlCisgICAgUUZvbnRNZXRyaWNzRiBmbShtX3BsYXRmb3JtRGF0YS5m
b250KCkpOwogICAgIG1fYXZnQ2hhcldpZHRoID0gZm0uYXZlcmFnZUNoYXJXaWR0aCgpOwogICAg
IG1fbWF4Q2hhcldpZHRoID0gZm0ubWF4V2lkdGgoKTsKKyNlbmRpZgogfQogCiB2b2lkIFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92225</attachid>
            <date>2011-05-04 06:06:43 -0700</date>
            <delta_ts>2011-05-05 07:46:56 -0700</delta_ts>
            <desc>Proposed patch v4</desc>
            <filename>bug-51106-v4.diff</filename>
            <type>text/plain</type>
            <size>33166</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA2ZDY1MzgxLi4wZTNjMzRkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNjAg
QEAKIDIwMTEtMDUtMDQgIEFuZHJlYXMgS2xpbmcgIDxhbmRyZWFzLmtsaW5nQG5va2lhLmNvbT4K
IAorICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbUXRdIElt
cGxlbWVudCB0aGUgZmFzdCBmb250IHBhdGggZm9yIFF0LgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTExMDYKKworICAgICAgICBVc2UgdGhlIG5ldyBR
UmF3Rm9udCBhbmQgUUdseXBocyBBUElzIGluIFF0IDQuOCB0byBpbXBsZW1lbnQgdGhlIGZhc3Qg
cGF0aHMgZm9yCisgICAgICAgIHJlbmRlcmluZyBhbmQgbWVhc3VyZW1lbnQgb2Ygc2ltcGxlIHRl
eHQuCisKKyAgICAgICAgU2luY2UgdGhpcyBpcyBzdGlsbCB1bnJlbGVhc2VkIEFQSSwgaXQncyBn
dWFyZGVkIGJ5IEhBVkUoUVJBV0ZPTlQpIHVudGlsIHRoZSBuZXcKKyAgICAgICAgY2xhc3NlcyBh
cmUgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBRdCA0LjggcmVsZWFzZSBicmFuY2guCisKKyAg
ICAgICAgKiBXZWJDb3JlLnBybzogQWRkIEhBVkVfUVJBV0ZPTlQgZGVmaW5lIChmb3IgUXQgPj0g
NC44KSBhbmQgbmV3IGZpbGVzIHRvIGJ1aWxkLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvRm9udC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3VGV4dCk6IERpc2FibGUg
ZmFzdCBmb250IHBhdGggZm9yIHN0cm9rZWQgdGV4dCwgYW5kIHdoZW4KKyAgICAgICAgcGFpbnRp
bmcgdGV4dCB3aXRoIGEgc2hhZG93LiAoUXQtb25seSkKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6
OmNvZGVQYXRoKTogVHJ5IHRvIHVzZSBmYXN0IGZvbnQgcGF0aCBpbiBtb3JlIGNhc2VzLgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udENhY2hlUXQuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6cmF3Rm9udEZvckNoYXJhY3RlcnMpOiBIZWxwZXIgZnVuY3Rpb24sIHJldHVybnMg
YSBzdWl0YWJsZSBRUmF3Rm9udAorICAgICAgICB0byB1c2UgZm9yIHJlbmRlcmluZyBhIGdpdmVu
IHN0cmluZy4gR29lcyB0aHJvdWdoIFFUZXh0TGF5b3V0IHRvIGZpbmQgdGhlIGJlc3QKKyAgICAg
ICAgZm9udCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgUUZvbnQgcXVlcnkuCisgICAgICAgIChXZWJD
b3JlOjpGb250Q2FjaGU6OmdldEZvbnREYXRhRm9yQ2hhcmFjdGVycyk6IEltcGxlbWVudGVkIHVz
aW5nIGhlbHBlciBhYm92ZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQ
bGF0Zm9ybURhdGEuaDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGFQcml2YXRl
OjpGb250UGxhdGZvcm1EYXRhUHJpdmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250UGxhdGZv
cm1EYXRhOjpGb250UGxhdGZvcm1EYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9y
bURhdGE6OnJhd0ZvbnQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0
Zm9ybURhdGFRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250UGxhdGZvcm1EYXRhOjpGb250
UGxhdGZvcm1EYXRhKTogQWRkIGEgUVJhd0ZvbnQgbWVtYmVyIHRvIEZvbnRQbGF0Zm9ybURhdGEu
CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6ZmlsbFBlbkZvckNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6c3Ryb2tlUGVu
Rm9yQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpkcmF3VGV4dENvbW1vbik6IEZhY3RvcmVk
IFFQZW4gY3JlYXRpb24gb3V0IG9mIGRyYXdUZXh0Q29tbW9uCisgICAgICAgIHRvIHNoYXJlIGNv
ZGUgYmV0d2VlbiBjb21wbGV4IGFuZCBzaW1wbGUgZm9udCByZW5kZXJpbmcgcGF0aHMuCisgICAg
ICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5cGhzKTogSW1wbGVtZW50ZWQgdXNpbmcgUVBhaW50
ZXI6OmRyYXdHbHlwaHMoKS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBo
UGFnZVRyZWVOb2RlUXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhQYWdlOjpmaWxsKTog
SW1wbGVtZW50ZWQgdXNpbmcgUVJhd0ZvbnQ6OmdseXBoSW5kZXhlc0ZvclN0cmluZygpLgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU2ltcGxlRm9udERhdGFRdC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2gpOiBSZXR1cm4gZmFs
c2Ugd2hlbiB1c2luZyBRUmF3Rm9udCBzaW5jZSB3ZQorICAgICAgICBoYXZlIG5vIHdheSBvZiBr
bm93aW5nIHRoZSBwaXRjaC4KKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpjb250
YWluc0NoYXJhY3RlcnMpOiBJbXBsZW1lbnRlZCB1c2luZyBRUmF3Rm9udDo6c3VwcG9ydHNDaGFy
YWN0ZXIoKS4KKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRo
Rm9yR2x5cGgpOiBJbXBsZW1lbnRlZCB1c2luZyBRUmF3Rm9udDo6YWR2YW5jZXNGb3JHbHlwaElu
ZGV4ZXMoKS4KKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzY2FsZWRGb250RGF0
YSk6IEFkZGVkLCBiYXNlZCBvbiBvdGhlciBwb3J0cy4KKyAgICAgICAgKFdlYkNvcmU6OlNpbXBs
ZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
U2ltcGxlRm9udERhdGE6OmVtcGhhc2lzTWFya0ZvbnREYXRhKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaCk6IFN0dWIuCisg
ICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KTogVXNlIFFSYXdG
b250IEFQSXMgdG8gcmV0cmlldmUgZm9udCBtZXRyaWNzLgorICAgICAgICAoV2ViQ29yZTo6U2lt
cGxlRm9udERhdGE6OnBsYXRmb3JtQ2hhcldpZHRoSW5pdCk6IERpdHRvLgorCisyMDExLTA1LTA0
ICBBbmRyZWFzIEtsaW5nICA8YW5kcmVhcy5rbGluZ0Bub2tpYS5jb20+CisKICAgICAgICAgUmV2
aWV3ZWQgYnkgS2VubmV0aCBSb2hkZSBDaHJpc3RpYW5zZW4uCiAKICAgICAgICAgW1F0XSBSZW1v
dmUgdW51c2VkIGZ1bmN0aW9uIEZvbnRQbGF0Zm9ybURhdGE6OnBpeGVsU2l6ZSgpCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnBybyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
cHJvCmluZGV4IDBkMDNkMDEuLjhkMTA0MWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dl
YkNvcmUucHJvCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUucHJvCkBAIC0xOTM1LDYgKzE5
MzUsNyBAQCBIRUFERVJTICs9IFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9Gb250TWV0cmljcy5o
IFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9Gb250LmggXAogICAgIHBsYXRmb3JtL2dyYXBoaWNz
L0dlbmVyYXRlZEltYWdlLmggXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dseXBoUGFnZVRyZWVO
b2RlLmggXAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dyYWRpZW50LmggXAogICAgIHBsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oIFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0xheWVyLmggXApAQCAtMzA2MCw2ICszMDYxLDIwIEBAIGNvbnRhaW5zKERFRklORVMsIFdU
Rl9VU0VfUVRfQkVBUkVSPTEpIHsKICAgICAgICAgcGxhdGZvcm0vbmV0d29yay9xdC9OZXR3b3Jr
U3RhdGVOb3RpZmllclF0LmNwcAogfQogCishbGVzc1RoYW4oUVRfTUFKT1JfVkVSU0lPTiw0KToh
bGVzc1RoYW4oUVRfTUlOT1JfVkVSU0lPTiwgOCk6SEFWRV9RUkFXRk9OVD0xCisKKyFpc0VtcHR5
KEhBVkVfUVJBV0ZPTlQpIHsKKyAgICBERUZJTkVTICs9IEhBVkVfUVJBV0ZPTlQ9MQorCisgICAg
U09VUkNFUyArPSBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAg
XAorICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaFBhZ2VUcmVlTm9kZS5jcHAgXAorICAg
ICAgICBwbGF0Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJhdG9yLmNwcAorCisgICAgSEVBREVSUyAr
PSBcCisgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL1dpZHRoSXRlcmF0b3IuaAorfQorCiBjb250
YWlucyhERUZJTkVTLCBFTkFCTEVfR0VPTE9DQVRJT049MSkgewogICAgIHY4IHsKICAgICAgICAg
U09VUkNFUyArPSBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9Gb250LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCmlu
ZGV4IGJiYzM5YjguLjQ1ZDRjZTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0ZvbnQuY3BwCkBAIC0yNyw2ICsyNywxMCBAQAogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2lu
Y2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZvbnRUcmFuc2NvZGVyLmgiCisjaWYgUExB
VEZPUk0oUVQpICYmIEhBVkUoUVJBV0ZPTlQpCisjaW5jbHVkZSAiQ29udGV4dFNoYWRvdy5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2VuZGlmCiAjaW5jbHVkZSAiSW50UG9pbnQu
aCIKICNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgogI2luY2x1ZGUgIlRleHRSdW4uaCIKQEAgLTEz
OSw3ICsxNDMsMTQgQEAgdm9pZCBGb250OjpkcmF3VGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2kKICAgICB9CiAjZW5kaWYKIAot
ICAgIGlmIChjb2RlUGF0aChydW4pICE9IENvbXBsZXgpCisgICAgQ29kZVBhdGggY29kZVBhdGhU
b1VzZSA9IGNvZGVQYXRoKHJ1bik7CisKKyNpZiBQTEFURk9STShRVCkgJiYgSEFWRShRUkFXRk9O
VCkKKyAgICBpZiAoY29udGV4dC0+dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZVN0cm9rZSB8
fCBjb250ZXh0LT5jb250ZXh0U2hhZG93KCktPm1fdHlwZSAhPSBDb250ZXh0U2hhZG93OjpOb1No
YWRvdykKKyAgICAgICAgY29kZVBhdGhUb1VzZSA9IENvbXBsZXg7CisjZW5kaWYKKworICAgIGlm
IChjb2RlUGF0aFRvVXNlICE9IENvbXBsZXgpCiAgICAgICAgIHJldHVybiBkcmF3U2ltcGxlVGV4
dChjb250ZXh0LCBydW4sIHBvaW50LCBmcm9tLCB0byk7CiAKICAgICByZXR1cm4gZHJhd0NvbXBs
ZXhUZXh0KGNvbnRleHQsIHJ1biwgcG9pbnQsIGZyb20sIHRvKTsKQEAgLTI3NSw3ICsyODYsNyBA
QCBGb250OjpDb2RlUGF0aCBGb250Ojpjb2RlUGF0aChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0
CiAgICAgaWYgKHNfY29kZVBhdGggIT0gQXV0bykKICAgICAgICAgcmV0dXJuIHNfY29kZVBhdGg7
CiAKLSNpZiBQTEFURk9STShRVCkKKyNpZiBQTEFURk9STShRVCkgJiYgIUhBVkUoUVJBV0ZPTlQp
CiAgICAgaWYgKHJ1bi5leHBhbnNpb24oKSB8fCBydW4ucnRsKCkgfHwgaXNTbWFsbENhcHMoKSB8
fCB3b3JkU3BhY2luZygpIHx8IGxldHRlclNwYWNpbmcoKSkKICAgICAgICAgcmV0dXJuIENvbXBs
ZXg7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0NvbnRleHQuY3BwCmluZGV4IGFmOTk5ZWEuLjFjMDg3YTIgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcApAQCAt
Mzc1LDcgKzM3NSw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3SW1hZ2UoSW1hZ2UqIGlt
YWdlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgY29uc3QKICAgICBkcmF3SW1hZ2UoaW1h
Z2UsIHN0eWxlQ29sb3JTcGFjZSwgRmxvYXRSZWN0KGRlc3QpLCBzcmNSZWN0LCBvcCwgdXNlTG93
UXVhbGl0eVNjYWxlKTsKIH0KIAotI2lmICFPUyhXSU5DRSkgfHwgUExBVEZPUk0oUVQpCisjaWYg
IU9TKFdJTkNFKSB8fCAoUExBVEZPUk0oUVQpICYmICFIQVZFKFFSQVdGT05UKSkKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3VGV4dChjb25zdCBGb250JiBmb250LCBjb25zdCBUZXh0UnVuJiBy
dW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKQogewogICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9TaW1wbGVGb250RGF0YS5jcHAKaW5kZXggZjJhMDZmNC4uZjc3MmU0YSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNw
cApAQCAtMTIyLDcgKzEyMiw3IEBAIFNpbXBsZUZvbnREYXRhOjpTaW1wbGVGb250RGF0YShQYXNz
T3duUHRyPFNWR0ZvbnREYXRhPiBzdmdGb250RGF0YSwgaW50IHNpemUsIGJvCiB9CiAjZW5kaWYK
IAotI2lmICFQTEFURk9STShRVCkKKyNpZiAhKFBMQVRGT1JNKFFUKSAmJiAhSEFWRShRUkFXRk9O
VCkpCiAvLyBFc3RpbWF0ZXMgb2YgYXZnQ2hhcldpZHRoIGFuZCBtYXhDaGFyV2lkdGggZm9yIHBs
YXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgYWNjZXNzaW5nIHRoZXNlIHZhbHVlcyBmcm9tIHRo
ZSBmb250Lgogdm9pZCBTaW1wbGVGb250RGF0YTo6aW5pdENoYXJXaWR0aHMoKQogewpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKaW5kZXgg
MGZjYzY3Yi4uYjg3Nzg1OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvU2ltcGxlRm9udERhdGEuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9TaW1wbGVGb250RGF0YS5oCkBAIC0yNzksOSArMjc5LDggQEAgcHJpdmF0ZToKICNlbmRp
ZgogI2VuZGlmCiB9OwotICAgIAotICAgIAotI2lmICFQTEFURk9STShRVCkKKworI2lmICEoUExB
VEZPUk0oUVQpICYmICFIQVZFKFFSQVdGT05UKSkKIEFMV0FZU19JTkxJTkUgRmxvYXRSZWN0IFNp
bXBsZUZvbnREYXRhOjpib3VuZHNGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBp
ZiAoaXNaZXJvV2lkdGhTcGFjZUdseXBoKGdseXBoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcAppbmRleCBjNTljNTIzLi41YWE3
MDI3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250
Q2FjaGVRdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9u
dENhY2hlUXQuY3BwCkBAIC0zNSw2ICszNSw5IEBACiAjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5n
SGFzaC5oPgogCiAjaW5jbHVkZSA8UUZvbnQ+CisjaWYgSEFWRShRUkFXRk9OVCkKKyNpbmNsdWRl
IDxRVGV4dExheW91dD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgV1RGOwogCkBAIC00NCw5
ICs0Nyw0NiBAQCB2b2lkIEZvbnRDYWNoZTo6cGxhdGZvcm1Jbml0KCkKIHsKIH0KIAotY29uc3Qg
U2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0
IEZvbnQmLCBjb25zdCBVQ2hhciosIGludCkKKyNpZiBIQVZFKFFSQVdGT05UKQorc3RhdGljIFFS
YXdGb250IHJhd0ZvbnRGb3JDaGFyYWN0ZXJzKGNvbnN0IFFTdHJpbmcmIHN0cmluZywgY29uc3Qg
UUZvbnQmIHJlcXVlc3RlZEZvbnQpCiB7CisgICAgUUZvbnQgZm9udChyZXF1ZXN0ZWRGb250KTsK
KyAgICBmb250LnNldFN0eWxlU3RyYXRlZ3koUUZvbnQ6Ok5vRm9udE1lcmdpbmcpOworCisgICAg
UVRleHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9udCk7CisgICAgbGF5b3V0LmJlZ2luTGF5b3V0
KCk7CisgICAgbGF5b3V0LmNyZWF0ZUxpbmUoKTsKKyAgICBsYXlvdXQuZW5kTGF5b3V0KCk7CisK
KyAgICBRTGlzdDxRR2x5cGhzPiBnbHlwaExpc3QgPSBsYXlvdXQuZ2x5cGhzKCk7CisKKyAgICBB
U1NFUlQoZ2x5cGhMaXN0LnNpemUoKSA9PSAxKTsKKworICAgIGNvbnN0IFFHbHlwaHMmIGdseXBo
cyhnbHlwaExpc3QuYXQoMCkpOworICAgIFFWZWN0b3I8cXVpbnQzMj4gZ2x5cGhJbmRleGVzID0g
Z2x5cGhzLmdseXBoSW5kZXhlcygpOworCisgICAgaWYgKGdseXBoSW5kZXhlcy5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybiBRUmF3Rm9udCgpOworCisgICAgcmV0dXJuIGdseXBocy5mb250KCk7
Cit9CisjZW5kaWYKKworY29uc3QgU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0Rm9udERh
dGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJz
LCBpbnQgbGVuZ3RoKQoreworI2lmIEhBVkUoUVJBV0ZPTlQpCisgICAgUVN0cmluZyBxc3RyaW5n
ID0gUVN0cmluZzo6ZnJvbVJhd0RhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCBRQ2hhcio+KGNo
YXJhY3RlcnMpLCBsZW5ndGgpOworICAgIFFSYXdGb250IGNvbXB1dGVkRm9udCA9IHJhd0ZvbnRG
b3JDaGFyYWN0ZXJzKHFzdHJpbmcsIGZvbnQuZm9udCgpKTsKKyAgICBpZiAoIWNvbXB1dGVkRm9u
dC5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiAwOworICAgIEZvbnRQbGF0Zm9ybURhdGEgYWx0
ZXJuYXRlRm9udChjb21wdXRlZEZvbnQpOworICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YSgm
YWx0ZXJuYXRlRm9udCk7CisjZWxzZQorICAgIFFfVU5VU0VEKGZvbnQpOworICAgIFFfVU5VU0VE
KGNoYXJhY3RlcnMpOworICAgIFFfVU5VU0VEKGxlbmd0aCk7CiAgICAgcmV0dXJuIDA7CisjZW5k
aWYKIH0KIAogU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0Zm9y
bURhdGEoY29uc3QgRm9udCYgZm9udCkKQEAgLTU4LDYgKzk4LDcgQEAgU2ltcGxlRm9udERhdGEq
IEZvbnRDYWNoZTo6Z2V0TGFzdFJlc29ydEZhbGxiYWNrRm9udChjb25zdCBGb250RGVzY3JpcHRp
b24mIGZvbnQKIHsKICAgICBjb25zdCBBdG9taWNTdHJpbmcgZmFsbGJhY2tGYW1pbHkgPSBRRm9u
dChmb250RGVzY3JpcHRpb24uZmFtaWx5KCkuZmFtaWx5KCkpLmxhc3RSZXNvcnRGYW1pbHkoKTsK
ICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEobmV3IEZvbnRQbGF0Zm9ybURhdGEoZm9udERl
c2NyaXB0aW9uLCBmYWxsYmFja0ZhbWlseSkpOworICAgIC8vcmV0dXJuIGdldENhY2hlZEZvbnRE
YXRhKGZvbnREZXNjcmlwdGlvbiwgZmFsbGJhY2tGYW1pbHkpOwogfQogCiB2b2lkIEZvbnRDYWNo
ZTo6Z2V0VHJhaXRzSW5GYW1pbHkoY29uc3QgQXRvbWljU3RyaW5nJiwgVmVjdG9yPHVuc2lnbmVk
PiYpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250
UGxhdGZvcm1EYXRhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250
UGxhdGZvcm1EYXRhLmgKaW5kZXggNTQ4MWUzNS4uODJiNjQyYyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YS5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaApAQCAt
MjgsNiArMjgsOSBAQAogI2luY2x1ZGUgIkZvbnRPcmllbnRhdGlvbi5oIgogI2luY2x1ZGUgPFFG
b250PgogI2luY2x1ZGUgPFFIYXNoPgorI2lmIEhBVkUoUVJBV0ZPTlQpCisjaW5jbHVkZSA8UVJh
d0ZvbnQ+CisjZW5kaWYKICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgogI2luY2x1ZGUgPHd0Zi9S
ZWZDb3VudGVkLmg+CiAKQEAgLTUwLDE2ICs1MywzMiBAQCBwdWJsaWM6CiAgICAgeyB9CiAgICAg
Rm9udFBsYXRmb3JtRGF0YVByaXZhdGUoY29uc3QgUUZvbnQmIGZvbnQpCiAgICAgICAgIDogZm9u
dChmb250KQorI2lmIEhBVkUoUVJBV0ZPTlQpCisgICAgICAgICwgcmF3Rm9udChRUmF3Rm9udDo6
ZnJvbUZvbnQoZm9udCwgUUZvbnREYXRhYmFzZTo6QW55KSkKKyNlbmRpZgogICAgICAgICAsIHNp
emUoZm9udC5waXhlbFNpemUoKSkKICAgICAgICAgLCBib2xkKGZvbnQuYm9sZCgpKQogICAgICAg
ICAsIG9ibGlxdWUoZmFsc2UpCiAgICAgICAgICwgaXNEZWxldGVkVmFsdWUoZmFsc2UpCiAgICAg
eyB9CisjaWYgSEFWRShRUkFXRk9OVCkKKyAgICBGb250UGxhdGZvcm1EYXRhUHJpdmF0ZShjb25z
dCBRUmF3Rm9udCYgcmF3Rm9udCkKKyAgICAgICAgOiBmb250KCkKKyAgICAgICAgLCByYXdGb250
KHJhd0ZvbnQpCisgICAgICAgICwgc2l6ZShyYXdGb250LnBpeGVsU2l6ZSgpKQorICAgICAgICAs
IGJvbGQocmF3Rm9udC53ZWlnaHQoKSA+PSBRRm9udDo6Qm9sZCkKKyAgICAgICAgLCBvYmxpcXVl
KGZhbHNlKQorICAgICAgICAsIGlzRGVsZXRlZFZhbHVlKGZhbHNlKQorICAgIHsgfQorI2VuZGlm
CiAgICAgRm9udFBsYXRmb3JtRGF0YVByaXZhdGUoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWVU
eXBlKQogICAgICAgICA6IGlzRGVsZXRlZFZhbHVlKHRydWUpCiAgICAgeyB9CiAKICAgICBRRm9u
dCBmb250OworI2lmIEhBVkUoUVJBV0ZPTlQpCisgICAgUVJhd0ZvbnQgcmF3Rm9udDsKKyNlbmRp
ZgogICAgIGZsb2F0IHNpemU7CiAgICAgYm9vbCBib2xkIDogMTsKICAgICBib29sIG9ibGlxdWUg
OiAxOwpAQCAtNzQsNiArOTMsMTIgQEAgcHVibGljOgogICAgIEZvbnRQbGF0Zm9ybURhdGEoY29u
c3QgUUZvbnQmIGZvbnQpCiAgICAgICAgIDogbV9kYXRhKGFkb3B0UmVmKG5ldyBGb250UGxhdGZv
cm1EYXRhUHJpdmF0ZShmb250KSkpCiAgICAgeyB9CisjaWYgSEFWRShRUkFXRk9OVCkKKyAgICBG
b250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmLCBmbG9hdCBzaXplKTsKKyAg
ICBGb250UGxhdGZvcm1EYXRhKGNvbnN0IFFSYXdGb250JiByYXdGb250KQorICAgICAgICA6IG1f
ZGF0YShhZG9wdFJlZihuZXcgRm9udFBsYXRmb3JtRGF0YVByaXZhdGUocmF3Rm9udCkpKQorICAg
IHsgfQorI2VuZGlmCiAgICAgRm9udFBsYXRmb3JtRGF0YShXVEY6Okhhc2hUYWJsZURlbGV0ZWRW
YWx1ZVR5cGUpCiAgICAgICAgIDogbV9kYXRhKGFkb3B0UmVmKG5ldyBGb250UGxhdGZvcm1EYXRh
UHJpdmF0ZSgpKSkKICAgICB7CkBAIC05NCw2ICsxMTksMTUgQEAgcHVibGljOgogICAgICAgICAg
ICAgcmV0dXJuIFFGb250KCk7CiAgICAgICAgIHJldHVybiBtX2RhdGEtPmZvbnQ7CiAgICAgfQor
I2lmIEhBVkUoUVJBV0ZPTlQpCisgICAgUVJhd0ZvbnQgcmF3Rm9udCgpIGNvbnN0CisgICAgewor
ICAgICAgICBRX0FTU0VSVCghaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSk7CisgICAgICAgIGlm
ICghbV9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIFFSYXdGb250KCk7CisgICAgICAgIHJldHVy
biBtX2RhdGEtPnJhd0ZvbnQ7CisgICAgfQorI2VuZGlmCiAgICAgZmxvYXQgc2l6ZSgpIGNvbnN0
CiAgICAgewogICAgICAgICBRX0FTU0VSVCghaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSk7CkBA
IC0xMzksNiArMTczLDkgQEAgcHVibGljOgogICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGNvbnN0
OwogI2VuZGlmCiBwcml2YXRlOgorI2lmIEhBVkUoUVJBV0ZPTlQpCisgICAgZnJpZW5kIGNsYXNz
IEdseXBoUGFnZTsKKyNlbmRpZgogICAgIFJlZlB0cjxGb250UGxhdGZvcm1EYXRhUHJpdmF0ZT4g
bV9kYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvRm9udFBsYXRmb3JtRGF0YVF0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAKaW5kZXggOTVkYWJkNS4uYmViNzIwOCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRm
b3JtRGF0YVF0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9G
b250UGxhdGZvcm1EYXRhUXQuY3BwCkBAIC04MCw3ICs4MCwyMyBAQCBGb250UGxhdGZvcm1EYXRh
OjpGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNv
bnN0IEF0bwogICAgIC8vIG1fZGF0YS0+c2l6ZSBpZiBhIGZvbnQgc2l6ZSBvZiB6ZXJvIGlzIHJl
cXVlc3RlZCBhbmQgcGl4ZWxTaXplKCkKICAgICAvLyBvdGhlcndpc2UuCiAgICAgbV9kYXRhLT5z
aXplID0gKCFyZXF1ZXN0ZWRTaXplKSA/IHJlcXVlc3RlZFNpemUgOiBmb250LnBpeGVsU2l6ZSgp
OworI2lmIEhBVkUoUVJBV0ZPTlQpCisgICAgbV9kYXRhLT5yYXdGb250ID0gUVJhd0ZvbnQ6OmZy
b21Gb250KGZvbnQsIFFGb250RGF0YWJhc2U6OkFueSk7CisjZW5kaWYKK30KKworI2lmIEhBVkUo
UVJBV0ZPTlQpCitGb250UGxhdGZvcm1EYXRhOjpGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmIG90aGVyLCBmbG9hdCBzaXplKQorICAgIDogbV9kYXRhKGFkb3B0UmVmKG5l
dyBGb250UGxhdGZvcm1EYXRhUHJpdmF0ZSgpKSkKK3sKKyAgICBtX2RhdGEtPmZvbnQgPSBvdGhl
ci5tX2RhdGEtPmZvbnQ7CisgICAgbV9kYXRhLT5yYXdGb250ID0gb3RoZXIubV9kYXRhLT5yYXdG
b250OworICAgIG1fZGF0YS0+Ym9sZCA9IG90aGVyLm1fZGF0YS0+Ym9sZDsKKyAgICBtX2RhdGEt
Pm9ibGlxdWUgPSBvdGhlci5tX2RhdGEtPm9ibGlxdWU7CisgICAgbV9kYXRhLT5mb250LnNldFBp
eGVsU2l6ZShzaXplKTsKKyAgICBtX2RhdGEtPnNpemUgPSBzaXplID8gbV9kYXRhLT5mb250LnBp
eGVsU2l6ZSgpIDogMDsKIH0KKyNlbmRpZgogCiBib29sIEZvbnRQbGF0Zm9ybURhdGE6Om9wZXJh
dG9yPT0oY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgb3RoZXIpIGNvbnN0CiB7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcAppbmRleCAzZmU5MGE0Li5h
YjU4ZDQwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9G
b250UXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRR
dC5jcHAKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKICNp
bmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCiAjaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCisj
aWYgSEFWRShRUkFXRk9OVCkKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2VuZGlmCiAjaW5j
bHVkZSAiR3JhZGllbnQuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgpAQCAtNzMsNiArNzYsMzkgQEAgc3RhdGljIFFUZXh0TGluZSBz
ZXR1cExheW91dChRVGV4dExheW91dCogbGF5b3V0LCBjb25zdCBUZXh0UnVuJiBzdHlsZSkKICAg
ICByZXR1cm4gbGluZTsKIH0KIAorc3RhdGljIFFQZW4gZmlsbFBlbkZvckNvbnRleHQoR3JhcGhp
Y3NDb250ZXh0KiBjdHgpCit7CisgICAgaWYgKGN0eC0+ZmlsbEdyYWRpZW50KCkpIHsKKyAgICAg
ICAgUUJydXNoIGJydXNoKCpjdHgtPmZpbGxHcmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkp
OworICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5maWxsR3JhZGllbnQoKS0+Z3JhZGll
bnRTcGFjZVRyYW5zZm9ybSgpKTsKKyAgICAgICAgcmV0dXJuIFFQZW4oYnJ1c2gsIDApOworICAg
IH0KKworICAgIGlmIChjdHgtPmZpbGxQYXR0ZXJuKCkpIHsKKyAgICAgICAgQWZmaW5lVHJhbnNm
b3JtIGFmZmluZTsKKyAgICAgICAgcmV0dXJuIFFQZW4oUUJydXNoKGN0eC0+ZmlsbFBhdHRlcm4o
KS0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkpLCAwKTsKKyAgICB9CisKKyAgICByZXR1
cm4gUVBlbihRQ29sb3IoY3R4LT5maWxsQ29sb3IoKSkpOworfQorCitzdGF0aWMgUVBlbiBzdHJv
a2VQZW5Gb3JDb250ZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4KQoreworICAgIGlmIChjdHgtPnN0
cm9rZUdyYWRpZW50KCkpIHsKKyAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPnN0cm9rZUdyYWRp
ZW50KCktPnBsYXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGJydXNoLnNldFRyYW5zZm9ybShj
dHgtPnN0cm9rZUdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0oKSk7CisgICAgICAg
IHJldHVybiBRUGVuKGJydXNoLCBjdHgtPnN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICB9CisKKyAg
ICBpZiAoY3R4LT5zdHJva2VQYXR0ZXJuKCkpIHsKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFm
ZmluZTsKKyAgICAgICAgUUJydXNoIGJydXNoKGN0eC0+c3Ryb2tlUGF0dGVybigpLT5jcmVhdGVQ
bGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSk7CisgICAgICAgIHJldHVybiBRUGVuKGJydXNoLCBjdHgt
PnN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gUVBlbihRQ29sb3IoY3R4
LT5zdHJva2VDb2xvcigpKSwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7Cit9CisKIHN0YXRpYyB2
b2lkIGRyYXdUZXh0Q29tbW9uKEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBy
dW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvLCBjb25zdCBRRm9u
dCYgZm9udCwgYm9vbCBpc0NvbXBsZXhUZXh0KQogewogICAgIGlmICh0byA8IDApCkBAIC04MSwz
MSArMTE3LDEyIEBAIHN0YXRpYyB2b2lkIGRyYXdUZXh0Q29tbW9uKEdyYXBoaWNzQ29udGV4dCog
Y3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0CiAgICAgUVBhaW50ZXIgKnAgPSBj
dHgtPnBsYXRmb3JtQ29udGV4dCgpOwogCiAgICAgUVBlbiB0ZXh0RmlsbFBlbjsKLSAgICBpZiAo
Y3R4LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlRmlsbCkgewotICAgICAgICBpZiAoY3R4
LT5maWxsR3JhZGllbnQoKSkgewotICAgICAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPmZpbGxH
cmFkaWVudCgpLT5wbGF0Zm9ybUdyYWRpZW50KCkpOwotICAgICAgICAgICAgYnJ1c2guc2V0VHJh
bnNmb3JtKGN0eC0+ZmlsbEdyYWRpZW50KCktPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0oKSk7Ci0g
ICAgICAgICAgICB0ZXh0RmlsbFBlbiA9IFFQZW4oYnJ1c2gsIDApOwotICAgICAgICB9IGVsc2Ug
aWYgKGN0eC0+ZmlsbFBhdHRlcm4oKSkgewotICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFm
ZmluZTsKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBlbihRQnJ1c2goY3R4LT5maWxsUGF0
dGVybigpLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSksIDApOwotICAgICAgICB9IGVs
c2UKLSAgICAgICAgICAgIHRleHRGaWxsUGVuID0gUVBlbihRQ29sb3IoY3R4LT5maWxsQ29sb3Io
KSkpOwotICAgIH0KKyAgICBpZiAoY3R4LT50ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlRmls
bCkKKyAgICAgICAgdGV4dEZpbGxQZW4gPSBmaWxsUGVuRm9yQ29udGV4dChjdHgpOwogCiAgICAg
UVBlbiB0ZXh0U3Ryb2tlUGVuOwotICAgIGlmIChjdHgtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4
dE1vZGVTdHJva2UpIHsKLSAgICAgICAgaWYgKGN0eC0+c3Ryb2tlR3JhZGllbnQoKSkgewotICAg
ICAgICAgICAgUUJydXNoIGJydXNoKCpjdHgtPnN0cm9rZUdyYWRpZW50KCktPnBsYXRmb3JtR3Jh
ZGllbnQoKSk7Ci0gICAgICAgICAgICBicnVzaC5zZXRUcmFuc2Zvcm0oY3R4LT5zdHJva2VHcmFk
aWVudCgpLT5ncmFkaWVudFNwYWNlVHJhbnNmb3JtKCkpOwotICAgICAgICAgICAgdGV4dFN0cm9r
ZVBlbiA9IFFQZW4oYnJ1c2gsIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgICAgICB9IGVs
c2UgaWYgKGN0eC0+c3Ryb2tlUGF0dGVybigpKSB7Ci0gICAgICAgICAgICBBZmZpbmVUcmFuc2Zv
cm0gYWZmaW5lOwotICAgICAgICAgICAgUUJydXNoIGJydXNoKGN0eC0+c3Ryb2tlUGF0dGVybigp
LT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSk7Ci0gICAgICAgICAgICB0ZXh0U3Ryb2tl
UGVuID0gUVBlbihicnVzaCwgY3R4LT5zdHJva2VUaGlja25lc3MoKSk7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgdGV4dFN0cm9rZVBlbiA9IFFQZW4oUUNvbG9yKGN0eC0+c3Ryb2tlQ29s
b3IoKSksIGN0eC0+c3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgIH0KKyAgICBpZiAoY3R4LT50ZXh0
RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tlKQorICAgICAgICB0ZXh0U3Ryb2tlUGVuID0g
c3Ryb2tlUGVuRm9yQ29udGV4dChjdHgpOwogCiAgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6
Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOwogICAgIFFT
dHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CkBAIC0yMzUs
MzcgKzI1Miw2MiBAQCBzdGF0aWMgdm9pZCBkcmF3VGV4dENvbW1vbihHcmFwaGljc0NvbnRleHQq
IGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdAogICAgIH0KIH0KIAotdm9pZCBG
b250OjpkcmF3U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKLXsK
LSAgICBkcmF3VGV4dENvbW1vbihjdHgsIHJ1biwgcG9pbnQsIGZyb20sIHRvLCBmb250KCksIC8q
IGlzQ29tcGxleFRleHQgPSAqL2ZhbHNlKTsKLX0KLQogdm9pZCBGb250OjpkcmF3Q29tcGxleFRl
eHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CiAgICAgZHJhd1RleHRDb21t
b24oY3R4LCBydW4sIHBvaW50LCBmcm9tLCB0bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0g
Ki90cnVlKTsKIH0KIAotaW50IEZvbnQ6OmVtcGhhc2lzTWFya0FzY2VudChjb25zdCBBdG9taWNT
dHJpbmcmKSBjb25zdAorZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiwgR2x5cGhPdmVy
ZmxvdyopIGNvbnN0CiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAg
ICBpZiAoIXByaW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLnNpemUoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBpZiAoIXJ1bi5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBpZiAocnVuLmxlbmd0aCgpID09IDEgJiYgdHJlYXRBc1NwYWNlKHJ1blswXSkpCisgICAgICAg
IHJldHVybiBRRm9udE1ldHJpY3MoZm9udCgpKS53aWR0aChzcGFjZSkgKyBydW4uZXhwYW5zaW9u
KCk7CisKKyAgICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5j
aGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7CisgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3
RGF0YVdpdGhvdXRSZWYoc2FuaXRpemVkKTsKKworICAgIGludCB3ID0gUUZvbnRNZXRyaWNzKGZv
bnQoKSkud2lkdGgoc3RyaW5nKTsKKyAgICAvLyBXZWJLaXQgZXhwZWN0cyB1cyB0byBpZ25vcmUg
d29yZCBzcGFjaW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGFzIG9wcG9zZWQgdG8gd2hhdCBR
dCBkb2VzKQorICAgIGlmICh0cmVhdEFzU3BhY2UocnVuWzBdKSkKKyAgICAgICAgdyAtPSBtX3dv
cmRTcGFjaW5nOworCisgICAgcmV0dXJuIHcgKyBydW4uZXhwYW5zaW9uKCk7CiB9CiAKLWludCBG
b250OjplbXBoYXNpc01hcmtEZXNjZW50KGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0CitpbnQg
Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IGZsb2F0IHBvc2l0aW9uLCBib29sKSBjb25zdAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0g
ICAgcmV0dXJuIDA7CisgICAgU3RyaW5nIHNhbml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNl
cyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkpOworICAgIFFTdHJpbmcgc3RyaW5nID0g
ZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7CisKKyAgICBRVGV4dExheW91dCBsYXlv
dXQoc3RyaW5nLCBmb250KCkpOworICAgIFFUZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxh
eW91dCwgcnVuKTsKKyAgICByZXR1cm4gbGluZS54VG9DdXJzb3IocG9zaXRpb24pOwogfQogCi1p
bnQgRm9udDo6ZW1waGFzaXNNYXJrSGVpZ2h0KGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0CitG
bG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4m
IHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcHQsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgU3RyaW5nIHNh
bml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVu
Z3RoKCkpOworICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0
aXplZCk7CisKKyAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBmb250KCkpOworICAgIFFU
ZXh0TGluZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsKKworICAgIGZsb2F0IHgx
ID0gbGluZS5jdXJzb3JUb1goZnJvbSk7CisgICAgZmxvYXQgeDIgPSBsaW5lLmN1cnNvclRvWCh0
byk7CisgICAgaWYgKHgyIDwgeDEpCisgICAgICAgIHFTd2FwKHgxLCB4Mik7CisKKyAgICByZXR1
cm4gRmxvYXRSZWN0KHB0LngoKSArIHgxLCBwdC55KCksIHgyIC0geDEsIGgpOwogfQogCi12b2lk
IEZvbnQ6OmRyYXdFbXBoYXNpc01hcmtzRm9yU2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIC8q
IGNvbnRleHQgKi8sIGNvbnN0IFRleHRSdW4mIC8qIHJ1biAqLywgY29uc3QgQXRvbWljU3RyaW5n
JiAvKiBtYXJrICovLCBjb25zdCBGbG9hdFBvaW50JiAvKiBwb2ludCAqLywgaW50IC8qIGZyb20g
Ki8sIGludCAvKiB0byAqLykgY29uc3QKK2Jvb2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250
c0ZvckNvbXBsZXhUZXh0KCkKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBm
YWxzZTsKIH0KIAogdm9pZCBGb250OjpkcmF3RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdy
YXBoaWNzQ29udGV4dCogLyogY29udGV4dCAqLywgY29uc3QgVGV4dFJ1biYgLyogcnVuICovLCBj
b25zdCBBdG9taWNTdHJpbmcmIC8qIG1hcmsgKi8sIGNvbnN0IEZsb2F0UG9pbnQmIC8qIHBvaW50
ICovLCBpbnQgLyogZnJvbSAqLywgaW50IC8qIHRvICovKSBjb25zdApAQCAtMjczLDQ2ICszMTUs
NjEgQEAgdm9pZCBGb250OjpkcmF3RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdyYXBoaWNz
Q29udGV4dCogLyogY29udGV4dCAqLywgY29uc3QKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQog
Ci1mbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+
KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAorI2lm
IEhBVkUoUVJBV0ZPTlQpCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEsIGNvbnN0IEdseXBoQnVmZmVy
JiBnbHlwaEJ1ZmZlciwgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KSBjb25zdAogewotICAgIGlmICghcHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCku
c2l6ZSgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoY29udGV4dC0+cGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoIXJ1bi5sZW5ndGgoKSkKLSAgICAg
ICAgcmV0dXJuIDA7CisgICAgYm9vbCBzaG91bGRGaWxsID0gY29udGV4dC0+dGV4dERyYXdpbmdN
b2RlKCkgJiBUZXh0TW9kZUZpbGw7CisgICAgYm9vbCBzaG91bGRTdHJva2UgPSBjb250ZXh0LT50
ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlU3Ryb2tlOwogCi0gICAgU3RyaW5nIHNhbml0aXpl
ZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCkp
OwotICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0aXplZCk7
CisgICAgLy8gU3Ryb2tpbmcgdGV4dCBzaG91bGQgYWx3YXlzIHRha2UgdGhlIGNvbXBsZXggcGF0
aC4KKyAgICBBU1NFUlQoIXNob3VsZFN0cm9rZSk7CiAKLSAgICBpbnQgdyA9IFFGb250TWV0cmlj
cyhmb250KCkpLndpZHRoKHN0cmluZywgLTEsIFF0OjpUZXh0QnlwYXNzU2hhcGluZyk7CisgICAg
Ly8gU2hhZG93ZWQgdGV4dCBzaG91bGQgYWx3YXlzIHRha2UgdGhlIGNvbXBsZXggcGF0aC4KKyAg
ICBBU1NFUlQoY29udGV4dC0+Y29udGV4dFNoYWRvdygpLT5tX3R5cGUgPT0gQ29udGV4dFNoYWRv
dzo6Tm9TaGFkb3cpOwogCi0gICAgLy8gV2ViS2l0IGV4cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQg
c3BhY2luZyBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIChhcyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9l
cykKLSAgICBpZiAodHJlYXRBc1NwYWNlKHJ1blswXSkpCi0gICAgICAgIHcgLT0gbV93b3JkU3Bh
Y2luZzsKKyAgICBpZiAoIXNob3VsZEZpbGwgJiYgIXNob3VsZFN0cm9rZSkKKyAgICAgICAgcmV0
dXJuOwogCi0gICAgcmV0dXJuIHcgKyBydW4uZXhwYW5zaW9uKCk7Ci19CisgICAgUVZlY3Rvcjxx
dWludDMyPiBnbHlwaEluZGV4ZXM7CisgICAgUVZlY3RvcjxRUG9pbnRGPiBwb3NpdGlvbnM7Cisg
ICAgZmxvYXQgeCA9IDA7CiAKLWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChj
b25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiosIEdseXBo
T3ZlcmZsb3cqKSBjb25zdAotewotICAgIGlmICghcHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRh
KCkuc2l6ZSgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51
bUdseXBoczsgKytpKSB7CisgICAgICAgIEdseXBoIGdseXBoID0gZ2x5cGhCdWZmZXIuZ2x5cGhB
dChmcm9tICsgaSk7CisgICAgICAgIGZsb2F0IGFkdmFuY2UgPSBnbHlwaEJ1ZmZlci5hZHZhbmNl
QXQoZnJvbSArIGkpOworICAgICAgICBpZiAoIWdseXBoKQorICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIGdseXBoSW5kZXhlcy5hcHBlbmQoZ2x5cGgpOworICAgICAgICBwb3NpdGlvbnMu
YXBwZW5kKFFQb2ludEYoeCwgMCkpOworICAgICAgICB4ICs9IGFkdmFuY2U7CisgICAgfQogCi0g
ICAgaWYgKCFydW4ubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiAwOworICAgIFFHbHlwaHMgcXRH
bHlwaHM7CisgICAgcXRHbHlwaHMuc2V0R2x5cGhJbmRleGVzKGdseXBoSW5kZXhlcyk7CisgICAg
cXRHbHlwaHMuc2V0UG9zaXRpb25zKHBvc2l0aW9ucyk7CisgICAgcXRHbHlwaHMuc2V0Rm9udChm
b250RGF0YS0+cGxhdGZvcm1EYXRhKCkucmF3Rm9udCgpKTsKIAotICAgIGlmIChydW4ubGVuZ3Ro
KCkgPT0gMSAmJiB0cmVhdEFzU3BhY2UocnVuWzBdKSkKLSAgICAgICAgcmV0dXJuIFFGb250TWV0
cmljcyhmb250KCkpLndpZHRoKHNwYWNlKSArIHJ1bi5leHBhbnNpb24oKTsKKyAgICBRUGFpbnRl
ciogcGFpbnRlciA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwogCi0gICAgU3RyaW5nIHNh
bml0aXplZCA9IEZvbnQ6Om5vcm1hbGl6ZVNwYWNlcyhydW4uY2hhcmFjdGVycygpLCBydW4ubGVu
Z3RoKCkpOwotICAgIFFTdHJpbmcgc3RyaW5nID0gZnJvbVJhd0RhdGFXaXRob3V0UmVmKHNhbml0
aXplZCk7CisgICAgUVBlbiBwcmV2aW91c1BlbiA9IHBhaW50ZXItPnBlbigpOworICAgIHBhaW50
ZXItPnNldFBlbihmaWxsUGVuRm9yQ29udGV4dChjb250ZXh0KSk7CisgICAgcGFpbnRlci0+ZHJh
d0dseXBocyhwb2ludCwgcXRHbHlwaHMpOworICAgIHBhaW50ZXItPnNldFBlbihwcmV2aW91c1Bl
bik7Cit9CiAKLSAgICBpbnQgdyA9IFFGb250TWV0cmljcyhmb250KCkpLndpZHRoKHN0cmluZyk7
Ci0gICAgLy8gV2ViS2l0IGV4cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQgc3BhY2luZyBvbiB0aGUg
Zmlyc3QgY2hhcmFjdGVyIChhcyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9lcykKLSAgICBpZiAodHJl
YXRBc1NwYWNlKHJ1blswXSkpCi0gICAgICAgIHcgLT0gbV93b3JkU3BhY2luZzsKK2Jvb2wgRm9u
dDo6Y2FuRXhwYW5kQXJvdW5kSWRlb2dyYXBoc0luQ29tcGxleFRleHQoKQoreworICAgIHJldHVy
biBmYWxzZTsKK30KIAotICAgIHJldHVybiB3ICsgcnVuLmV4cGFuc2lvbigpOworI2Vsc2UgLy8g
IUhBVkUoUVJBV0ZPTlQpCisKK3ZvaWQgRm9udDo6ZHJhd1NpbXBsZVRleHQoR3JhcGhpY3NDb250
ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgZHJhd1RleHRDb21tb24oY3R4LCBydW4sIHBv
aW50LCBmcm9tLCB0bywgZm9udCgpLCAvKiBpc0NvbXBsZXhUZXh0ID0gKi9mYWxzZSk7CiB9CiAK
IGludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYg
cnVuLCBmbG9hdCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKQEAg
LTMzOCwxNiArMzk1LDI4IEBAIGludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRl
eHQoY29uc3QgVGV4dFJ1biYgcnVuLCBmbG9hdCBwb3NpdGlvbiwgYm9vCiAgICAgcmV0dXJuIGN1
clBvczsKIH0KIAotaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBmbG9hdCBwb3NpdGlvbiwgYm9vbCkgY29uc3QKKworZmxvYXQgRm9u
dDo6ZmxvYXRXaWR0aEZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBHbHlwaEJ1ZmZl
ciogZ2x5cGhCdWZmZXIsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tG
b250cywgR2x5cGhPdmVyZmxvdyogZ2x5cGhPdmVyZmxvdykgY29uc3QKIHsKKyAgICBpZiAoIXBy
aW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBpZiAoIXJ1bi5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICBTdHJpbmcg
c2FuaXRpemVkID0gRm9udDo6bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5s
ZW5ndGgoKSk7CiAgICAgUVN0cmluZyBzdHJpbmcgPSBmcm9tUmF3RGF0YVdpdGhvdXRSZWYoc2Fu
aXRpemVkKTsKIAotICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7Ci0gICAg
UVRleHRMaW5lIGxpbmUgPSBzZXR1cExheW91dCgmbGF5b3V0LCBydW4pOwotICAgIHJldHVybiBs
aW5lLnhUb0N1cnNvcihwb3NpdGlvbik7CisgICAgaW50IHcgPSBRRm9udE1ldHJpY3MoZm9udCgp
KS53aWR0aChzdHJpbmcsIC0xLCBRdDo6VGV4dEJ5cGFzc1NoYXBpbmcpOworCisgICAgLy8gV2Vi
S2l0IGV4cGVjdHMgdXMgdG8gaWdub3JlIHdvcmQgc3BhY2luZyBvbiB0aGUgZmlyc3QgY2hhcmFj
dGVyIChhcyBvcHBvc2VkIHRvIHdoYXQgUXQgZG9lcykKKyAgICBpZiAodHJlYXRBc1NwYWNlKHJ1
blswXSkpCisgICAgICAgIHcgLT0gbV93b3JkU3BhY2luZzsKKworICAgIHJldHVybiB3ICsgcnVu
LmV4cGFuc2lvbigpOwogfQogCisKIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yU2lt
cGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHB0LCBpbnQgaCwg
aW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICAgICBTdHJpbmcgc2FuaXRpemVkID0gRm9udDo6
bm9ybWFsaXplU3BhY2VzKHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7CkBAIC0zNjAs
MzcgKzQyOSw0MCBAQCBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQo
Y29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JgogICAgIHJldHVybiBGbG9hdFJl
Y3QocHQueCgpICsgc3RhcnRYLCBwdC55KCksIHdpZHRoLCBoKTsKIH0KIAotRmxvYXRSZWN0IEZv
bnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0
IEZsb2F0UG9pbnQmIHB0LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK2Jvb2wgRm9u
dDo6Y2FuRXhwYW5kQXJvdW5kSWRlb2dyYXBoc0luQ29tcGxleFRleHQoKQogewotICAgIFN0cmlu
ZyBzYW5pdGl6ZWQgPSBGb250Ojpub3JtYWxpemVTcGFjZXMocnVuLmNoYXJhY3RlcnMoKSwgcnVu
Lmxlbmd0aCgpKTsKLSAgICBRU3RyaW5nIHN0cmluZyA9IGZyb21SYXdEYXRhV2l0aG91dFJlZihz
YW5pdGl6ZWQpOwotCi0gICAgUVRleHRMYXlvdXQgbGF5b3V0KHN0cmluZywgZm9udCgpKTsKLSAg
ICBRVGV4dExpbmUgbGluZSA9IHNldHVwTGF5b3V0KCZsYXlvdXQsIHJ1bik7CisgICAgcmV0dXJu
IGZhbHNlOworfQogCi0gICAgZmxvYXQgeDEgPSBsaW5lLmN1cnNvclRvWChmcm9tKTsKLSAgICBm
bG9hdCB4MiA9IGxpbmUuY3Vyc29yVG9YKHRvKTsKLSAgICBpZiAoeDIgPCB4MSkKLSAgICAgICAg
cVN3YXAoeDEsIHgyKTsKK2Jvb2wgRm9udDo6cHJpbWFyeUZvbnRIYXNHbHlwaEZvckNoYXJhY3Rl
cihVQ2hhcjMyKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CiAKLSAgICByZXR1cm4gRmxvYXRSZWN0KHB0LngoKSArIHgxLCBwdC55KCksIHgyIC0g
eDEsIGgpOworaW50IEZvbnQ6OmVtcGhhc2lzTWFya0FzY2VudChjb25zdCBBdG9taWNTdHJpbmcm
KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKLWJv
b2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCkKK2ludCBGb250
OjplbXBoYXNpc01hcmtEZXNjZW50KGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0CiB7Ci0gICAg
cmV0dXJuIGZhbHNlOworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7CiB9CiAK
LWJvb2wgRm9udDo6Y2FuRXhwYW5kQXJvdW5kSWRlb2dyYXBoc0luQ29tcGxleFRleHQoKQoraW50
IEZvbnQ6OmVtcGhhc2lzTWFya0hlaWdodChjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdAogewot
ICAgIHJldHVybiBmYWxzZTsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOwog
fQogCi1ib29sIEZvbnQ6OnByaW1hcnlGb250SGFzR2x5cGhGb3JDaGFyYWN0ZXIoVUNoYXIzMikg
Y29uc3QKK3ZvaWQgRm9udDo6ZHJhd0VtcGhhc2lzTWFya3NGb3JTaW1wbGVUZXh0KEdyYXBoaWNz
Q29udGV4dCogLyogY29udGV4dCAqLywgY29uc3QgVGV4dFJ1biYgLyogcnVuICovLCBjb25zdCBB
dG9taWNTdHJpbmcmIC8qIG1hcmsgKi8sIGNvbnN0IEZsb2F0UG9pbnQmIC8qIHBvaW50ICovLCBp
bnQgLyogZnJvbSAqLywgaW50IC8qIHRvICovKSBjb25zdAogewogICAgIG5vdEltcGxlbWVudGVk
KCk7Ci0gICAgcmV0dXJuIHRydWU7CiB9CisjZW5kaWYgLy8gSEFWRShRUkFXRk9OVCkKIAogUUZv
bnQgRm9udDo6Zm9udCgpIGNvbnN0CiB7CkBAIC00MDIsNSArNDc0LDYgQEAgUUZvbnQgRm9udDo6
Zm9udCgpIGNvbnN0CiAgICAgcmV0dXJuIGY7CiB9CiAKKwogfQogCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HbHlwaFBhZ2VUcmVlTm9kZVF0LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQu
Y3BwCmluZGV4IDIxMjEyMDYuLjdiNzY4MDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwCkBAIC0y
Myw4ICsyMywzNiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkdseXBoUGFnZVRy
ZWVOb2RlLmgiCiAKKyNpZiBIQVZFKFFSQVdGT05UKQorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRh
LmgiCisjaW5jbHVkZSA8UUZvbnRNZXRyaWNzRj4KKyNpbmNsdWRlIDxRVGV4dExheW91dD4KKyNl
bmRpZgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKyNpZiBIQVZFKFFSQVdGT05UKQorYm9vbCBH
bHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiBi
dWZmZXIsIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnRE
YXRhKQoreworICAgIFFSYXdGb250IHJhd0ZvbnQgPSBmb250RGF0YS0+cGxhdGZvcm1EYXRhKCku
cmF3Rm9udCgpOworICAgIFFTdHJpbmcgcXN0cmluZyA9IFFTdHJpbmc6OmZyb21SYXdEYXRhKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUUNoYXIqPihidWZmZXIpLCBzdGF0aWNfY2FzdDxpbnQ+KGJ1
ZmZlckxlbmd0aCkpOworICAgIFFWZWN0b3I8cXVpbnQzMj4gaW5kZXhlcyA9IHJhd0ZvbnQuZ2x5
cGhJbmRleGVzRm9yU3RyaW5nKHFzdHJpbmcpOworCisgICAgYm9vbCBoYXZlR2x5cGhzID0gZmFs
c2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAg
ICAgR2x5cGggZ2x5cGggPSAoaSA8IGluZGV4ZXMuc2l6ZSgpKSA/IGluZGV4ZXMuYXQoaSkgOiAw
OworICAgICAgICBpZiAoIWdseXBoKQorICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgo
b2Zmc2V0ICsgaSwgMCwgMCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaGF2ZUdseXBo
cyA9IHRydWU7CisgICAgICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZzZXQgKyBpLCBn
bHlwaCwgZm9udERhdGEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBoYXZlR2x5cGhz
OworfQorI2Vsc2UKKwogdm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9u
dERhdGEoY29uc3QgRm9udERhdGEqKQogewogfQpAQCAtMzIsNSArNjAsNiBAQCB2b2lkIEdseXBo
UGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVDdXN0b21Gb250RGF0YShjb25zdCBGb250RGF0YSopCiB2
b2lkIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVuZVRyZWVGb250RGF0YShjb25zdCBXZWJDb3JlOjpT
aW1wbGVGb250RGF0YSopCiB7CiB9CisjZW5kaWYgLy8gSEFWRShRUkFXRk9OVCkKIAogfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU2ltcGxlRm9udERh
dGFRdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250
RGF0YVF0LmNwcAppbmRleCA5YmYxMDMwLi4wMzEyMDkyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcApAQCAt
MjQsMjAgKzI0LDEwMSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlNpbXBsZUZv
bnREYXRhLmgiCiAKKyNpZiBIQVZFKFFSQVdGT05UKQorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVk
LmgiCisjZWxzZQogI2luY2x1ZGUgPFFGb250TWV0cmljc0Y+CisjZW5kaWYKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCiB2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCiB7Cisj
aWYgSEFWRShRUkFXRk9OVCkKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIG1fdHJlYXRBc0Zp
eGVkUGl0Y2ggPSBmYWxzZTsKKyNlbHNlCiAgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IG1fcGxh
dGZvcm1EYXRhLmZvbnQoKS5maXhlZFBpdGNoKCk7CisjZW5kaWYKIH0KIAorI2lmIEhBVkUoUVJB
V0ZPTlQpCisKK3N0YXRpYyBjb25zdCBmbG9hdCBzbWFsbENhcHNGcmFjdGlvbiA9IDAuNzsKK3N0
YXRpYyBjb25zdCBmbG9hdCBlbXBoYXNpc01hcmtGcmFjdGlvbiA9IDAuNTsKKworYm9vbCBTaW1w
bGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBp
bnQgbGVuZ3RoKSBjb25zdAoreworICAgIFFSYXdGb250IHJhd0ZvbnQobV9wbGF0Zm9ybURhdGEu
cmF3Rm9udCgpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAg
ICAgICAgaWYgKCFyYXdGb250LnN1cHBvcnRzQ2hhcmFjdGVyKHN0YXRpY19jYXN0PFFDaGFyPihj
aGFyYWN0ZXJzW2ldKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9y
R2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKCFwbGF0Zm9ybURhdGEoKS5zaXpl
KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgUVZlY3RvcjxxdWludDMyPiBnbHlwaEluZGV4
ZXM7CisgICAgZ2x5cGhJbmRleGVzLmFwcGVuZChnbHlwaCk7CisgICAgUVZlY3RvcjxRUG9pbnRG
PiBhZHZhbmNlcyA9IHBsYXRmb3JtRGF0YSgpLnJhd0ZvbnQoKS5hZHZhbmNlc0ZvckdseXBoSW5k
ZXhlcyhnbHlwaEluZGV4ZXMpOworICAgIEFTU0VSVCghYWR2YW5jZXMuaXNFbXB0eSgpKTsKKyAg
ICByZXR1cm4gYWR2YW5jZXMuYXQoMCkueCgpOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxl
Rm9udERhdGE6OnNjYWxlZEZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2Ny
aXB0aW9uLCBmbG9hdCBzY2FsZUZhY3RvcikgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCBzY2Fs
ZWRTaXplID0gbHJvdW5kZihmb250RGVzY3JpcHRpb24uY29tcHV0ZWRTaXplKCkgKiBzY2FsZUZh
Y3Rvcik7CisgICAgcmV0dXJuIG5ldyBTaW1wbGVGb250RGF0YShGb250UGxhdGZvcm1EYXRhKG1f
cGxhdGZvcm1EYXRhLCBzY2FsZWRTaXplKSwgaXNDdXN0b21Gb250KCksIGZhbHNlKTsKK30KKwor
U2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBG
b250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fZGVy
aXZlZEZvbnREYXRhKQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YSA9IERlcml2ZWRGb250RGF0
YTo6Y3JlYXRlKGlzQ3VzdG9tRm9udCgpKTsKKyAgICBpZiAoIW1fZGVyaXZlZEZvbnREYXRhLT5z
bWFsbENhcHMpCisgICAgICAgIG1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMgPSBzY2FsZWRG
b250RGF0YShmb250RGVzY3JpcHRpb24sIHNtYWxsQ2Fwc0ZyYWN0aW9uKTsKKworICAgIHJldHVy
biBtX2Rlcml2ZWRGb250RGF0YS0+c21hbGxDYXBzLmdldCgpOworfQorCitTaW1wbGVGb250RGF0
YSogU2ltcGxlRm9udERhdGE6OmVtcGhhc2lzTWFya0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlw
dGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAoreworICAgIGlmICghbV9kZXJpdmVkRm9udERh
dGEpCisgICAgICAgIG1fZGVyaXZlZEZvbnREYXRhID0gRGVyaXZlZEZvbnREYXRhOjpjcmVhdGUo
aXNDdXN0b21Gb250KCkpOworICAgIGlmICghbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFy
aykKKyAgICAgICAgbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFyayA9IHNjYWxlZEZvbnRE
YXRhKGZvbnREZXNjcmlwdGlvbiwgZW1waGFzaXNNYXJrRnJhY3Rpb24pOworCisgICAgcmV0dXJu
IG1fZGVyaXZlZEZvbnREYXRhLT5lbXBoYXNpc01hcmsuZ2V0KCk7Cit9CisKK0Zsb2F0UmVjdCBT
aW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlwaCkgY29uc3QKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBGbG9hdFJlY3QoKTsKK30KKyNlbHNlCiBi
b29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCBpbnQp
IGNvbnN0CiB7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtR2x5cGhJbml0KCkKK3sKKyAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkKKyAg
ICAgICAgcmV0dXJuOworICAgIG1fc3BhY2VHbHlwaCA9IDA7CisgICAgZGV0ZXJtaW5lUGl0Y2go
KTsKKyAgICBtX21pc3NpbmdHbHlwaERhdGEuZm9udERhdGEgPSB0aGlzOworICAgIG1fbWlzc2lu
Z0dseXBoRGF0YS5nbHlwaCA9IDA7Cit9CisjZW5kaWYKKwogdm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1Jbml0KCkKIHsKICAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkgewpAQCAt
NDcsMTQgKzEyOCwyOCBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAg
ICAgICAgcmV0dXJuOwogICAgIH0KIAorI2lmIEhBVkUoUVJBV0ZPTlQpCisgICAgUVJhd0ZvbnQg
cmF3Rm9udChtX3BsYXRmb3JtRGF0YS5yYXdGb250KCkpOworICAgIGZsb2F0IGRlc2NlbnQgPSBy
YXdGb250LmRlc2NlbnQoKTsKKyAgICBmbG9hdCBhc2NlbnQgPSByYXdGb250LmFzY2VudCgpOwor
ICAgIGZsb2F0IHhIZWlnaHQgPSByYXdGb250LnhIZWlnaHQoKTsKKyAgICBmbG9hdCBsaW5lU3Bh
Y2luZyA9IGFzY2VudCArIGRlc2NlbnQgKyByYXdGb250LmxlYWRpbmcoKSArIDE7CisKKyAgICBR
VmVjdG9yPHF1aW50MzI+IGluZGV4ZXMgPSByYXdGb250LmdseXBoSW5kZXhlc0ZvclN0cmluZyhR
TGF0aW4xU3RyaW5nKCIgIikpOworICAgIFFWZWN0b3I8UVBvaW50Rj4gYWR2YW5jZXMgPSByYXdG
b250LmFkdmFuY2VzRm9yR2x5cGhJbmRleGVzKGluZGV4ZXMpOworICAgIGZsb2F0IHNwYWNlV2lk
dGggPSBhZHZhbmNlcy5hdCgwKS54KCk7CisjZWxzZQogICAgIFFGb250TWV0cmljc0YgZm0obV9w
bGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICBmbG9hdCBkZXNjZW50ID0gZm0uZGVzY2VudCgpOwor
ICAgIGZsb2F0IGFzY2VudCA9IGZtLmFzY2VudCgpOworICAgIGZsb2F0IHhIZWlnaHQgPSBmbS54
SGVpZ2h0KCk7CisgICAgZmxvYXQgbGluZVNwYWNpbmcgPSBmbS5saW5lU3BhY2luZygpOworICAg
IGZsb2F0IHNwYWNlV2lkdGggPSBmbS53aWR0aChRTGF0aW4xQ2hhcignICcpKTsKKyNlbmRpZgog
CiAgICAgLy8gUXQgc3VidHJhY3RzIDEgZnJvbSB0aGUgZGVzY2VudCB0byBhY2NvdW50IGZvciB0
aGUgYmFzZWxpbmUsCiAgICAgLy8gd2UgYWRkIGl0IGJhY2sgaGVyZSB0byBnZXQgY29ycmVjdCBt
ZXRyaWNzIGZvciBXZWJLaXQuCi0gICAgZmxvYXQgZGVzY2VudCA9IGZtLmRlc2NlbnQoKSArIDE7
Ci0gICAgZmxvYXQgYXNjZW50ID0gZm0uYXNjZW50KCk7Ci0KLSAgICBmbG9hdCBsaW5lU3BhY2lu
ZyA9IGZtLmxpbmVTcGFjaW5nKCk7CisgICAgZGVzY2VudCArPSAxOwogCiAgICAgLy8gVGhlIGxp
bmUgc3BhY2luZyBzaG91bGQgYWx3YXlzIGJlID49IChhc2NlbnQgKyBkZXNjZW50KSwgYnV0IHRo
aXMKICAgICAvLyBtYXkgYmUgZmFsc2UgaW4gc29tZSBjYXNlcyBkdWUgdG8gbWlzYmVoYXZpbmcg
cGxhdGZvcm0gbGlicmFyaWVzLgpAQCAtNjksMjggKzE2NCwyNCBAQCB2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUluaXQoKQogICAgIG1fZm9udE1ldHJpY3Muc2V0QXNjZW50KGFzY2VudCk7
CiAgICAgbV9mb250TWV0cmljcy5zZXREZXNjZW50KGRlc2NlbnQpOwogICAgIG1fZm9udE1ldHJp
Y3Muc2V0TGluZVNwYWNpbmcobGluZVNwYWNpbmcpOwotICAgIG1fZm9udE1ldHJpY3Muc2V0WEhl
aWdodChmbS54SGVpZ2h0KCkpOworICAgIG1fZm9udE1ldHJpY3Muc2V0WEhlaWdodCh4SGVpZ2h0
KTsKICAgICBtX2ZvbnRNZXRyaWNzLnNldExpbmVHYXAobGluZUdhcCk7Ci0gICAgbV9zcGFjZVdp
ZHRoID0gZm0ud2lkdGgoUUxhdGluMUNoYXIoJyAnKSk7Ci19Ci0KLXZvaWQgU2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtR2x5cGhJbml0KCkKLXsKLSAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUo
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fc3BhY2VHbHlwaCA9IDA7Ci0gICAgZGV0ZXJtaW5l
UGl0Y2goKTsKLSAgICBtX21pc3NpbmdHbHlwaERhdGEuZm9udERhdGEgPSB0aGlzOwotICAgIG1f
bWlzc2luZ0dseXBoRGF0YS5nbHlwaCA9IDA7CisgICAgbV9zcGFjZVdpZHRoID0gc3BhY2VXaWR0
aDsKIH0KIAogdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1DaGFyV2lkdGhJbml0KCkKIHsK
ICAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLnNpemUoKSkKICAgICAgICAgcmV0dXJuOwotICAgIFFG
b250TWV0cmljcyBmbShtX3BsYXRmb3JtRGF0YS5mb250KCkpOworI2lmIEhBVkUoUVJBV0ZPTlQp
CisgICAgUVJhd0ZvbnQgcmF3Rm9udChtX3BsYXRmb3JtRGF0YS5yYXdGb250KCkpOworICAgIG1f
YXZnQ2hhcldpZHRoID0gcmF3Rm9udC5hdmVyYWdlQ2hhcldpZHRoKCk7CisgICAgbV9tYXhDaGFy
V2lkdGggPSByYXdGb250Lm1heENoYXJXaWR0aCgpOworI2Vsc2UKKyAgICBRRm9udE1ldHJpY3NG
IGZtKG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CiAgICAgbV9hdmdDaGFyV2lkdGggPSBmbS5hdmVy
YWdlQ2hhcldpZHRoKCk7CiAgICAgbV9tYXhDaGFyV2lkdGggPSBmbS5tYXhXaWR0aCgpOworI2Vu
ZGlmCiB9CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCg==
</data>
<flag name="review"
          id="85172"
          type_id="1"
          status="+"
          setter="hausmann"
    />
          </attachment>
      

    </bug>

</bugzilla>