<?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>51312</bug_id>
          
          <creation_ts>2010-12-19 16:04:29 -0800</creation_ts>
          <short_desc>Make ContextShadow code cross-platform</short_desc>
          <delta_ts>2011-01-30 16:45:08 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>51567</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Simon Fraser (smfr)">simon.fraser</assigned_to>
          <cc>alex</cc>
    
    <cc>ariya.hidayat</cc>
    
    <cc>gustavo</cc>
    
    <cc>helder</cc>
    
    <cc>krit</cc>
    
    <cc>morrita</cc>
    
    <cc>mrobinson</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>324236</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-12-19 16:04:29 -0800</bug_when>
    <thetext>It would be nice if ContextShadow::drawRectShadow() were cross-platform. ImageBuffer could be used here, but we&apos;d need direct pixel access to avoid having to copy to do blurring (see bug 51297).

Also somewhat related, bug 51309 talks about sharing blurring code between ContextShadow and FEGaussianBlur.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>324297</commentid>
    <comment_count>1</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-12-19 22:59:53 -0800</bug_when>
    <thetext>Hm, Qt and Cairo already use ContextShadow, why would CG and Skia need ContextShadow? Both have an own implementation? Is the quality not good enough?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>324399</commentid>
    <comment_count>2</comment_count>
    <who name="Ariya Hidayat">ariya.hidayat</who>
    <bug_when>2010-12-20 08:09:22 -0800</bug_when>
    <thetext>Qt does not use ContextShadow::drawRectShadow(), though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>324422</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-12-20 08:49:32 -0800</bug_when>
    <thetext>I want to use ContextShadow for CG, because CG&apos;s shadows are slow, and have an incorrect radius.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325325</commentid>
    <comment_count>4</comment_count>
    <who name="Hajime Morrita">morrita</who>
    <bug_when>2010-12-21 18:55:06 -0800</bug_when>
    <thetext>Just for curiosity, will this fix Bug 51386 ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325834</commentid>
    <comment_count>5</comment_count>
    <who name="Ariya Hidayat">ariya.hidayat</who>
    <bug_when>2010-12-22 18:41:31 -0800</bug_when>
    <thetext>&gt; Just for curiosity, will this fix Bug 51386 ?

Likely not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329465</commentid>
    <comment_count>6</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-01-05 00:27:58 -0800</bug_when>
    <thetext>(In reply to comment #0)
&gt; It would be nice if ContextShadow::drawRectShadow() were cross-platform. ImageBuffer could be used here, but we&apos;d need direct pixel access to avoid having to copy to do blurring (see bug 51297).
&gt; 
&gt; Also somewhat related, bug 51309 talks about sharing blurring code between ContextShadow and FEGaussianBlur.

At least for drawRectShadow() I don&apos;t believe that direct pixel access makes a big difference. I bet (you may have checked for your self), that the general case will be 100x100 pixel for the temporary ImageBuffer for blurring operations. The copy operations carry no weight for such a small image. I don&apos;t want to prevent you to add direct pixel access, but the first implementation doesn&apos;t need to have it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329578</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-01-05 08:34:49 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #0)
&gt; &gt; It would be nice if ContextShadow::drawRectShadow() were cross-platform. ImageBuffer could be used here, but we&apos;d need direct pixel access to avoid having to copy to do blurring (see bug 51297).
&gt; &gt; 
&gt; &gt; Also somewhat related, bug 51309 talks about sharing blurring code between ContextShadow and FEGaussianBlur.
&gt; 
&gt; At least for drawRectShadow() I don&apos;t believe that direct pixel access makes a big difference. I bet (you may have checked for your self), that the general case will be 100x100 pixel for the temporary ImageBuffer for blurring operations. The copy operations carry no weight for such a small image. I don&apos;t want to prevent you to add direct pixel access, but the first implementation doesn&apos;t need to have it.

I agree that in my measurements the blur cost was much higher than the copy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335084</commentid>
    <comment_count>8</comment_count>
      <attachid>79112</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-01-16 14:14:13 -0800</bug_when>
    <thetext>Created attachment 79112
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335196</commentid>
    <comment_count>9</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-01-17 00:52:15 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; Created an attachment (id=79112) [details]
&gt; Patch

The patch just adds ContextShadow to all build systems (including Mac). Added support for horizontal and vertical blurring with different blur radii as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335336</commentid>
    <comment_count>10</comment_count>
      <attachid>79112</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-01-17 08:09:00 -0800</bug_when>
    <thetext>Comment on attachment 79112
Patch

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

I&apos;m tempted to r+ this, though the public variables in ContextShadow lead to a r-. Who allowed this to be landed? :-)

&gt; Source/WebCore/platform/graphics/ContextShadow.h:82
&gt; +    ContextShadowType m_type;
&gt;  
&gt;      Color m_color;
&gt; -    int m_blurDistance;
&gt; +    IntSize m_blurDistance;
&gt;      FloatSize m_offset;

public variables?
This needs to be hidden....</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335369</commentid>
    <comment_count>11</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-01-17 09:58:07 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 79112 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=79112&amp;action=review
&gt; 
&gt; I&apos;m tempted to r+ this, though the public variables in ContextShadow lead to a r-. Who allowed this to be landed? :-)
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/ContextShadow.h:82
&gt; &gt; +    ContextShadowType m_type;
&gt; &gt;  
&gt; &gt;      Color m_color;
&gt; &gt; -    int m_blurDistance;
&gt; &gt; +    IntSize m_blurDistance;
&gt; &gt;      FloatSize m_offset;
&gt; 
&gt; public variables?
&gt; This needs to be hidden....

I thought the same :-) But Simon already opened another bug for cleaning up ContextShadow. It was not my intention to clean up ContextShadow in the first place.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335376</commentid>
    <comment_count>12</comment_count>
    <who name="Ariya Hidayat">ariya.hidayat</who>
    <bug_when>2011-01-17 10:17:35 -0800</bug_when>
    <thetext>&gt; I&apos;m tempted to r+ this, though the public variables in ContextShadow lead to a r-. Who allowed this to be landed? :-)
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/ContextShadow.h:82
&gt; &gt; +    ContextShadowType m_type;
&gt; &gt;  
&gt; &gt;      Color m_color;
&gt; &gt; -    int m_blurDistance;
&gt; &gt; +    IntSize m_blurDistance;
&gt; &gt;      FloatSize m_offset;
&gt; 
&gt; public variables?
&gt; This needs to be hidden....

Because it was a private, lightweight helper struct for Qt port only. Then it got adopted by everyone.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335379</commentid>
    <comment_count>13</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-01-17 10:20:34 -0800</bug_when>
    <thetext>Yeah, I think ContextShadow should be properly class-ified, and maybe given a better name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>335601</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-17 17:39:11 -0800</bug_when>
    <thetext>Attachment 79112 did not build on gtk:
Build output: http://queues.webkit.org/results/7545184</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342340</commentid>
    <comment_count>15</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-01-30 10:43:12 -0800</bug_when>
    <thetext>I&apos;m going to make a new class that platforms can migrate to over time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342389</commentid>
    <comment_count>16</comment_count>
      <attachid>80605</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-01-30 15:55:04 -0800</bug_when>
    <thetext>Created attachment 80605
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342390</commentid>
    <comment_count>17</comment_count>
      <attachid>80605</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2011-01-30 16:12:04 -0800</bug_when>
    <thetext>Comment on attachment 80605
Patch

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

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:47
&gt; +static inline int roundUpToMultipleOf32(int d)
&gt; +{
&gt; +    return (1 + (d &gt;&gt; 5)) &lt;&lt; 5;
&gt; +}

Maybe this should go in MathExtras.h

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:77
&gt; +        const double scratchBufferPurgeInterval = 2;

This should probably be a static const.

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:112
&gt; +    // See comments in http://webkit.org/b/40793, it seems sensible
&gt; +    // to follow Skia&apos;s limit of 128 pixels of blur radius

I think putting the reason would be more helpful than putting the link.

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:127
&gt; +    } else {
&gt; +        m_type = SolidShadow;
&gt; +    }

The braces are not needed in this clause.

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:132
&gt; +static const int BlurSumShift = 15;
&gt; +static const float GaussianKernelFactor = 3 / 4.f * sqrtf(2 * piFloat);

We don&apos;t traditionally capitalize constant names.  I am also not sure if calling sqrtf() for a static const will work in all environments.

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:148
&gt; +    int d;

d is really not the most descriptive name. How about diameter (if that is what it is)?

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:158
&gt; +    int dmax = d &gt;&gt; 1;
&gt; +    int dmin = dmax - 1 + (d &amp; 1);
&gt; +    if (dmin &lt; 0)
&gt; +        dmin = 0;
&gt; +

Again, not great names.

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:166
&gt; +        unsigned char* pixels = imageData;
&gt; +        int stride = (!k) ? 4 : rowStride;
&gt; +        int delta = (!k) ? rowStride : 4;
&gt; +        int jfinal = (!k) ? size.height() : size.width();
&gt; +        int dim = (!k) ? size.width() : size.height();

The parens around !k are not necessary. jfinal should probably be jFinal.

&gt; Source/WebCore/platform/graphics/ShadowBlur.cpp:298
&gt; +    const int frameSize = inflation * 2;
&gt; +    m_sourceRect = IntRect(0, 0, shadowedRect.width() + frameSize, shadowedRect.height() + frameSize);
&gt; +    m_layerOrigin = FloatPoint(layerFloatRect.x(), layerFloatRect.y());
&gt; +    m_layerSize = layerFloatRect.size();
&gt; +
&gt; +    const FloatPoint m_unclippedLayerOrigin = FloatPoint(unclippedLayerRect.x(), unclippedLayerRect.y());
&gt; +    const FloatSize clippedOut = m_unclippedLayerOrigin - m_layerOrigin;
&gt; +
&gt; +    // Set the origin as the top left corner of the scratch image, or, in case there&apos;s a clipped
&gt; +    // out region, set the origin accordingly to the full bounding rect&apos;s top-left corner.
&gt; +    const float translationX = -shadowedRect.x() + inflation - fabsf(clippedOut.width());
&gt; +    const float translationY = -shadowedRect.y() + inflation - fabsf(clippedOut.height());
&gt; +    m_layerContextTranslation = FloatSize(translationX, translationY);

I don&apos;t know if the use of const here is adding anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342398</commentid>
    <comment_count>18</comment_count>
      <attachid>80606</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-01-30 16:37:00 -0800</bug_when>
    <thetext>Created attachment 80606
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342399</commentid>
    <comment_count>19</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-01-30 16:45:08 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/77097</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79112</attachid>
            <date>2011-01-16 14:14:13 -0800</date>
            <delta_ts>2011-01-30 15:54:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51312-20110116231410.patch</filename>
            <type>text/plain</type>
            <size>36001</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc1ODk0KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTEgQEAKKzIwMTEtMDEtMTYgIERpcmsgU2No
dWx6ZSAgPGtyaXRAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBNYWtlIENvbnRleHRTaGFkb3cgY29kZSBjcm9zcy1wbGF0Zm9ybQor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTEzMTIKKwor
ICAgICAgICAqIFRoaXMgYWRkcyBDb250ZXh0U2hhZG93IHRvIGFsbCBidWlsZCBzeXN0ZW1zLgor
CisgICAgICAgICogUHJlcGFyZSBDb250ZXh0U2hhZG93IHRvIGRpZmZlciBiZXR3ZWVuIGhvcml6
b250YWwgYW5kIHZlcnRpY2FsIGJsdXIgcmFkaXVzLiBUaGlzCisgICAgICAgIG1ha2VzIGl0IHBv
c3NpYmxlIHRvIHVzZSBDb250ZXh0U2hhZG93IGZvcjoKKyAgICAgICAgRkVHYXVzc2lhbkJsdXIg
KGF0IGxlYXN0IGZvciBibHVycmluZyBvZiBhbHBoYSBpbWFnZXMpLCBzZWUgYnVnIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MTMwOQorICAgICAgICBhbmQgRkVEcm9w
U2hhZG93LCBzZWUgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01
MjUxMy4KKworICAgICAgICAqIENyZWF0ZWQgbmV3IGVudW0gZm9yIENvbnRleHRTaGFkb3dUeXBl
LgorCisgICAgICAgIFRoaXMgZG9lc24ndCBjaGFuZ2UgZXhpc3RpbmcgZnVuY3Rpb25hbGl0eS4g
VGVzdHMgZm9yIHZldGljYWwgYmx1ciByYWRpdXMgd2lsbCBiZSBpbnRyb2R1Y2VkLCBvciBhbHJl
YWR5IGV4aXN0CisgICAgICAgIHdpdGggRkVEcm9wU2hhZG93IGFuZCBGRUdhdXNzaWFuQmx1ciwg
b25jZSB0aGV5IHVzZSBDb250ZXh0U2hhZG93IGFzIGZhciBhcyBwb3NzaWJsZS4gCisKKyAgICAg
ICAgKiBBbmRyb2lkLm1rOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvQ29udGV4dFNoYWRvdy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0U2hhZG93OjpD
b250ZXh0U2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRTaGFkb3c6OmNsZWFyKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRTaGFkb3c6Om11c3RVc2VDb250ZXh0U2hhZG93KToK
KyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRTaGFkb3c6OmJsdXJMYXllckltYWdlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbnRleHRTaGFkb3c6OmFkanVzdEJsdXJEaXN0YW5jZSk6CisgICAgICAg
IChXZWJDb3JlOjpDb250ZXh0U2hhZG93OjpjYWxjdWxhdGVMYXllckJvdW5kaW5nUmVjdCk6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29udGV4dFNoYWRvdy5oOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL2NhaXJvL0NvbnRleHRTaGFkb3dDYWlyby5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0U2hhZG93OjpkcmF3UmVjdFNoYWRvdyk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2Fpcm8vRm9udENhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdH
bHlwaHNTaGFkb3cpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNz
Q29udGV4dENhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdQYXRoU2hhZG93KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaGFkb3cpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQ2Fpcm8uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXcpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3F0L0ZvbnRRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpkcmF3VGV4dENvbW1vbik6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NDb250ZXh0UXQuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyk6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpC
aXRtYXBJbWFnZTo6ZHJhdyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU3RpbGxJ
bWFnZVF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0aWxsSW1hZ2U6OmRyYXcpOgorCiAyMDEx
LTAxLTE2ICBSb2JlcnQgSG9nYW4gIDxyb2JlcnRAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBBbmRyZWFzIEtsaW5nLgpJbmRleDogU291cmNlL1dlYkNvcmUvQW5kcm9pZC5tawo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9BbmRyb2lkLm1rCShyZXZpc2lvbiA3NTg3NSkK
KysrIFNvdXJjZS9XZWJDb3JlL0FuZHJvaWQubWsJKHdvcmtpbmcgY29weSkKQEAgLTUzOCw2ICs1
MzgsNyBAQCBMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9TUkNfRklMRVMpIFwKIAogaWZlcSAo
JChFTkFCTEVfU1ZHKSwgdHJ1ZSkKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX1NSQ19GSUxF
UykgXAorCXBsYXRmb3JtL2dyYXBoaWNzL0NvbnRleHRTaGFkb3cuY3BwIFwKIAlwbGF0Zm9ybS9n
cmFwaGljcy9maWx0ZXJzL0ZFQmxlbmQuY3BwIFwKIAlwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJz
L0ZFQ29sb3JNYXRyaXguY3BwIFwKIAlwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFQ29tcG9u
ZW50VHJhbnNmZXIuY3BwIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDc1ODc1KQor
KysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0yODcyLDYg
KzI4NzIsOCBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL0JpdG1hcEltYWdlLmgn
LAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmNwcCcsCiAgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3Jh
cGhpY3MvQ29udGV4dFNoYWRvdy5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L0NvbnRleHRTaGFkb3cuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvRGFzaEFy
cmF5LmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL0V4dGVuc2lvbnMzRC5oJywK
ICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9GbG9hdFBvaW50LmNwcCcsCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShy
ZXZpc2lvbiA3NTg3NSkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtOTM3LDYgKzkzNyw4IEBACiAJCTQxRjFEMjFG
MEVGMzVDMkEwMERBODc1MyAvKiBTY3JpcHRDYWNoZWRGcmFtZURhdGEuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQxRjFEMjFEMEVGMzVDMkEwMERBODc1
MyAvKiBTY3JpcHRDYWNoZWRGcmFtZURhdGEuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
IChQcml2YXRlLCApOyB9OyB9OwogCQk0MUYxRDIyMDBFRjM1QzJBMDBEQTg3NTMgLyogU2NyaXB0
Q2FjaGVkRnJhbWVEYXRhLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDQxRjFEMjFFMEVGMzVDMkEwMERBODc1MyAvKiBTY3JpcHRDYWNoZWRGcmFtZURh
dGEuY3BwICovOyB9OwogCQk0MUY1ODRDNzEwNDY1MkNCMDA5Q0FBNjQgLyogSlNNZXNzYWdlUG9y
dEN1c3RvbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
NDFGNTg0QzYxMDQ2NTJDQjAwOUNBQTY0IC8qIEpTTWVzc2FnZVBvcnRDdXN0b20uaCAqLzsgfTsK
KwkJNDM1RTkyREUxMkUzOUQ0NTAwNjBDRTU5IC8qIENvbnRleHRTaGFkb3cuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDM1RTkyREMxMkUzOUQ0NTAw
NjBDRTU5IC8qIENvbnRleHRTaGFkb3cuY3BwICovOyB9OworCQk0MzVFOTJERjEyRTM5RDQ1MDA2
MENFNTkgLyogQ29udGV4dFNoYWRvdy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNDM1RTkyREQxMkUzOUQ0NTAwNjBDRTU5IC8qIENvbnRleHRTaGFkb3cu
aCAqLzsgfTsKIAkJNDM2NzA4QzAxMkQ5Q0E0QjAwMDQ0MjM0IC8qIFJlbmRlclNWR0Jsb2NrLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQzNjcwODgx
MTJEOUNBNEEwMDA0NDIzNCAvKiBSZW5kZXJTVkdCbG9jay5jcHAgKi87IH07CiAJCTQzNjcwOEMx
MTJEOUNBNEIwMDA0NDIzNCAvKiBSZW5kZXJTVkdCbG9jay5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDM2NzA4ODIxMkQ5Q0E0QTAwMDQ0MjM0IC8qIFJl
bmRlclNWR0Jsb2NrLmggKi87IH07CiAJCTQzNjcwOEMyMTJEOUNBNEIwMDA0NDIzNCAvKiBSZW5k
ZXJTVkdDb250YWluZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gNDM2NzA4ODMxMkQ5Q0E0QTAwMDQ0MjM0IC8qIFJlbmRlclNWR0NvbnRhaW5lci5j
cHAgKi87IH07CkBAIC03Mjc3LDYgKzcyNzksOCBAQAogCQk0MUYxRDIxRDBFRjM1QzJBMDBEQTg3
NTMgLyogU2NyaXB0Q2FjaGVkRnJhbWVEYXRhLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFNjcmlwdENhY2hlZEZyYW1lRGF0YS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk0MUYxRDIxRTBFRjM1QzJBMDBEQTg3NTMgLyogU2NyaXB0Q2FjaGVkRnJhbWVEYXRhLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFNjcmlwdENhY2hlZEZyYW1l
RGF0YS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQxRjU4NEM2MTA0NjUyQ0Iw
MDlDQUE2NCAvKiBKU01lc3NhZ2VQb3J0Q3VzdG9tLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEpTTWVzc2FnZVBvcnRDdXN0b20uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJNDM1RTkyREMxMkUzOUQ0NTAwNjBDRTU5IC8qIENvbnRleHRTaGFkb3cuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ29udGV4dFNoYWRvdy5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQzNUU5MkREMTJFMzlENDUwMDYwQ0U1OSAvKiBDb250
ZXh0U2hhZG93LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvbnRleHRTaGFk
b3cuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDM2NzA4ODExMkQ5Q0E0QTAwMDQ0
MjM0IC8qIFJlbmRlclNWR0Jsb2NrLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IFJlbmRlclNWR0Jsb2NrLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
NDM2NzA4ODIxMkQ5Q0E0QTAwMDQ0MjM0IC8qIFJlbmRlclNWR0Jsb2NrLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlclNWR0Jsb2NrLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTQzNjcwODgzMTJEOUNBNEEwMDA0NDIzNCAvKiBSZW5kZXJTVkdDb250YWlu
ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyU1ZHQ29u
dGFpbmVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE3Mzc5LDYgKzE3Mzgz
LDggQEAKIAkJCQlCMjc1MzUzODBCMDUzODE0MDAyQ0U2NEYgLyogQ29sb3IuY3BwICovLAogCQkJ
CUIyNzUzNTM5MEIwNTM4MTQwMDJDRTY0RiAvKiBDb2xvci5oICovLAogCQkJCTkzODJERjU3MTBB
OEQ1QzkwMDkyNTY1MiAvKiBDb2xvclNwYWNlLmggKi8sCisJCQkJNDM1RTkyREMxMkUzOUQ0NTAw
NjBDRTU5IC8qIENvbnRleHRTaGFkb3cuY3BwICovLAorCQkJCTQzNUU5MkREMTJFMzlENDUwMDYw
Q0U1OSAvKiBDb250ZXh0U2hhZG93LmggKi8sCiAJCQkJQThDQjQxMDIwRTg1QjhBNTAwMzJDNEYw
IC8qIERhc2hBcnJheS5oICovLAogCQkJCTZFNjdEMkE4MTI4MEU4QkQwMDg3NThGNyAvKiBFeHRl
bnNpb25zM0QuaCAqLywKIAkJCQlCMjc1MzUzQTBCMDUzODE0MDAyQ0U2NEYgLyogRmxvYXRQb2lu
dC5jcHAgKi8sCkBAIC0yMjM0Miw2ICsyMjM0OCw3IEBACiAJCQkJMkUzN0UwMDYxMkRCQzVBNDAw
QTZCMjMzIC8qIEpTRE9NVVJMLmggaW4gSGVhZGVycyAqLywKIAkJCQk3QTU2NDBDMDEyREY5RTVF
MDBGNDUzNkQgLyogSW5zcGVjdG9yU2V0dGluZ3MuaCBpbiBIZWFkZXJzICovLAogCQkJCUYzRDRD
NDc5MTJFMDc2NjMwMDNEQTE1MCAvKiBJbnNwZWN0b3JCcm93c2VyRGVidWdnZXJBZ2VudC5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJNDM1RTkyREYxMkUzOUQ0NTAwNjBDRTU5IC8qIENvbnRleHRTaGFk
b3cuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHBy
b2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjUwMzAsNiArMjUwMzcsNyBAQAogCQkJCTJFMzdFMDA1
MTJEQkM1QTQwMEE2QjIzMyAvKiBKU0RPTVVSTC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3QTU2
NDBCRjEyREY5RTVFMDBGNDUzNkQgLyogSW5zcGVjdG9yU2V0dGluZ3MuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJRjNENEM0NzgxMkUwNzY2MzAwM0RBMTUwIC8qIEluc3BlY3RvckJyb3dzZXJEZWJ1
Z2dlckFnZW50LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTQzNUU5MkRFMTJFMzlENDUwMDYwQ0U1
OSAvKiBDb250ZXh0U2hhZG93LmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlG
b3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29udGV4dFNoYWRvdy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29udGV4dFNoYWRvdy5jcHAJKHJldmlzaW9u
IDc1ODc1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29udGV4dFNoYWRv
dy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChD
KSAyMDEwIFNlbmNoYSwgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisg
KiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgKgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0zMSw2ICsz
Miw3IEBACiAKICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJGbG9hdFF1
YWQuaCIKKyNpbmNsdWRlICJJbnRTaXplLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KQEAgLTQzLDI4
ICs0NSwyNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIENvbnRleHRTaGFkb3c6OkNvbnRleHRT
aGFkb3coKQogICAgIDogbV90eXBlKE5vU2hhZG93KQotICAgICwgbV9ibHVyRGlzdGFuY2UoMCkK
ICAgICAsIG1fbGF5ZXJDb250ZXh0KDApCiAgICAgLCBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1z
KGZhbHNlKQogewogfQogCi1Db250ZXh0U2hhZG93OjpDb250ZXh0U2hhZG93KGNvbnN0IENvbG9y
JiBjb2xvciwgZmxvYXQgcmFkaXVzLCBjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKK0NvbnRleHRT
aGFkb3c6OkNvbnRleHRTaGFkb3coY29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBGbG9hdFNpemUm
IHJhZGl1cywgY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCiAgICAgOiBtX2NvbG9yKGNvbG9yKQot
ICAgICwgbV9ibHVyRGlzdGFuY2Uocm91bmQocmFkaXVzKSkKKyAgICAsIG1fYmx1ckRpc3RhbmNl
KHJvdW5kZWRJbnRTaXplKHJhZGl1cykpCiAgICAgLCBtX29mZnNldChvZmZzZXQpCiAgICAgLCBt
X2xheWVyQ29udGV4dCgwKQogICAgICwgbV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcyhmYWxzZSkK
IHsKICAgICAvLyBTZWUgY29tbWVudHMgaW4gaHR0cDovL3dlYmtpdC5vcmcvYi80MDc5MywgaXQg
c2VlbXMgc2Vuc2libGUKICAgICAvLyB0byBmb2xsb3cgU2tpYSdzIGxpbWl0IG9mIDEyOCBwaXhl
bHMgb2YgYmx1ciByYWRpdXMKLSAgICBtX2JsdXJEaXN0YW5jZSA9IG1pbihtX2JsdXJEaXN0YW5j
ZSwgMTI4KTsKKyAgICBtX2JsdXJEaXN0YW5jZSA9IG1fYmx1ckRpc3RhbmNlLnNocnVua1RvKElu
dFNpemUoMTI4LCAxMjgpKTsKIAogICAgIC8vIFRoZSB0eXBlIG9mIHNoYWRvdyBpcyBkZWNpZGVk
IGJ5IHRoZSBibHVyIHJhZGl1cywgc2hhZG93IG9mZnNldCwgYW5kIHNoYWRvdyBjb2xvci4KICAg
ICBpZiAoIW1fY29sb3IuaXNWYWxpZCgpIHx8ICFjb2xvci5hbHBoYSgpKSB7CiAgICAgICAgIC8v
IENhbid0IHBhaW50IHRoZSBzaGFkb3cgd2l0aCBpbnZhbGlkIG9yIGludmlzaWJsZSBjb2xvci4K
ICAgICAgICAgbV90eXBlID0gTm9TaGFkb3c7Ci0gICAgfSBlbHNlIGlmIChyYWRpdXMgPiAwKSB7
CisgICAgfSBlbHNlIGlmIChyYWRpdXMud2lkdGgoKSA+IDAgfHwgcmFkaXVzLmhlaWdodCgpID4g
MCkgewogICAgICAgICAvLyBTaGFkb3cgaXMgYWx3YXlzIGJsdXJyZWQsIGV2ZW4gdGhlIG9mZnNl
dCBpcyB6ZXJvLgogICAgICAgICBtX3R5cGUgPSBCbHVyU2hhZG93OwogICAgIH0gZWxzZSBpZiAo
IW1fb2Zmc2V0LndpZHRoKCkgJiYgIW1fb2Zmc2V0LmhlaWdodCgpKSB7CkBAIC03OSwxNCArODAs
MTQgQEAgdm9pZCBDb250ZXh0U2hhZG93OjpjbGVhcigpCiB7CiAgICAgbV90eXBlID0gTm9TaGFk
b3c7CiAgICAgbV9jb2xvciA9IENvbG9yKCk7Ci0gICAgbV9ibHVyRGlzdGFuY2UgPSAwOworICAg
IG1fYmx1ckRpc3RhbmNlID0gSW50U2l6ZSgpOwogICAgIG1fb2Zmc2V0ID0gRmxvYXRTaXplKCk7
CiB9CiAKIGJvb2wgQ29udGV4dFNoYWRvdzo6bXVzdFVzZUNvbnRleHRTaGFkb3coR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0KQogewogICAgIC8vIFdlIGNhbid0IGF2b2lkIENvbnRleHRTaGFkb3cs
IHNpbmNlIHRoZSBzaGFkb3cgaGFzIGJsdXIuCi0gICAgaWYgKG1fdHlwZSA9PSBDb250ZXh0U2hh
ZG93OjpCbHVyU2hhZG93KQorICAgIGlmIChtX3R5cGUgPT0gQmx1clNoYWRvdykKICAgICAgICAg
cmV0dXJuIHRydWU7CiAgICAgLy8gV2UgY2FuIGF2b2lkIENvbnRleHRTaGFkb3cgYW5kIG9wdGlt
aXplLCBzaW5jZSB3ZSdyZSBub3QgZHJhd2luZyBvbiBhCiAgICAgLy8gY2FudmFzIGFuZCBib3gg
c2hhZG93cyBhcmUgYWZmZWN0ZWQgYnkgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KQEAgLTEx
NiwxNCArMTE3LDEzIEBAIHZvaWQgQ29udGV4dFNoYWRvdzo6Ymx1ckxheWVySW1hZ2UodW5zaWcK
ICAgICBpbnQgY2hhbm5lbHNbNF0gPSB7IDMsIDAsIDEsIDMgfTsKICNlbmRpZgogCi0gICAgaW50
IGQgPSBtYXgoMiwgc3RhdGljX2Nhc3Q8aW50PihmbG9vcmYoKDIgLyAzLmYpICogbV9ibHVyRGlz
dGFuY2UpKSk7Ci0gICAgaW50IGRtYXggPSBkID4+IDE7Ci0gICAgaW50IGRtaW4gPSBkbWF4IC0g
MSArIChkICYgMSk7Ci0gICAgaWYgKGRtaW4gPCAwKQotICAgICAgICBkbWluID0gMDsKLQogICAg
IC8vIFR3byBzdGFnZXM6IGhvcml6b250YWwgYW5kIHZlcnRpY2FsCiAgICAgZm9yIChpbnQgayA9
IDA7IGsgPCAyOyArK2spIHsKKyAgICAgICAgaW50IGQgPSBtYXgoMiwgc3RhdGljX2Nhc3Q8aW50
PihmbG9vcmYoKDIgLyAzLmYpICogKCghaykgPyBtX2JsdXJEaXN0YW5jZS53aWR0aCgpIDogbV9i
bHVyRGlzdGFuY2UuaGVpZ2h0KCkpKSkpOworICAgICAgICBpbnQgZG1heCA9IGQgPj4gMTsKKyAg
ICAgICAgaW50IGRtaW4gPSBkbWF4IC0gMSArIChkICYgMSk7CisgICAgICAgIGlmIChkbWluIDwg
MCkKKyAgICAgICAgICAgIGRtaW4gPSAwOwogCiAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVs
cyA9IGltYWdlRGF0YTsKICAgICAgICAgaW50IHN0cmlkZSA9ICghaykgPyA0IDogcm93U3RyaWRl
OwpAQCAtMTM4LDcgKzEzOCw2IEBAIHZvaWQgQ29udGV4dFNoYWRvdzo6Ymx1ckxheWVySW1hZ2Uo
dW5zaWcKICAgICAgICAgICAgIC8vIFdlIHVzZSBzbGlkaW5nIHdpbmRvdyBhbGdvcml0aG0gdG8g
YWNjdW11bGF0ZSB0aGUgYWxwaGEgdmFsdWVzLgogICAgICAgICAgICAgLy8gVGhpcyBpcyBtdWNo
IG1vcmUgZWZmaWNpZW50IHRoYW4gY29tcHV0aW5nIHRoZSBzdW0gb2YgZWFjaCBwaXhlbHMKICAg
ICAgICAgICAgIC8vIGNvdmVyZWQgYnkgdGhlIGJveCBrZXJuZWwgc2l6ZSBmb3IgZWFjaCB4Lgot
CiAgICAgICAgICAgICBmb3IgKGludCBzdGVwID0gMDsgc3RlcCA8IDM7ICsrc3RlcCkgewogICAg
ICAgICAgICAgICAgIGludCBzaWRlMSA9ICghc3RlcCkgPyBkbWluIDogZG1heDsKICAgICAgICAg
ICAgICAgICBpbnQgc2lkZTIgPSAoc3RlcCA9PSAxKSA/IGRtaW4gOiBkbWF4OwpAQCAtMjAxLDE2
ICsyMDAsMTYgQEAgdm9pZCBDb250ZXh0U2hhZG93OjphZGp1c3RCbHVyRGlzdGFuY2UoRwogICAg
IGNvbnN0IGZsb2F0IHlBeGlzU2NhbGUgPSBzcXJ0Zih5VW5pdENoYW5nZS53aWR0aCgpICogeVVu
aXRDaGFuZ2Uud2lkdGgoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHlV
bml0Q2hhbmdlLmhlaWdodCgpICogeVVuaXRDaGFuZ2UuaGVpZ2h0KCkpOwogCi0gICAgLy8gYmx1
ckxheWVySW1hZ2UoKSBkb2VzIG5vdCBzdXBwb3J0IHBlci1heGlzIGJsdXJyaW5nLCBzbyBjYWxj
dWxhdGUgYSBiYWxhbmNlZCBzY2FsaW5nLgotICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gc3FydGYo
eEF4aXNTY2FsZSAqIHlBeGlzU2NhbGUpOwotICAgIG1fYmx1ckRpc3RhbmNlID0gcm91bmRmKHN0
YXRpY19jYXN0PGZsb2F0PihtX2JsdXJEaXN0YW5jZSkgLyBzY2FsZSk7CisgICAgLy8gU2NhbGUg
Ymx1ciBkaXN0YW5jZS4KKyAgICBtX2JsdXJEaXN0YW5jZS5zZXRXaWR0aChyb3VuZGYoc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KG1fYmx1ckRpc3RhbmNlLndpZHRoKCkpIC8geEF4aXNTY2FsZSkpOworICAg
IG1fYmx1ckRpc3RhbmNlLnNldEhlaWdodChyb3VuZGYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fYmx1
ckRpc3RhbmNlLmhlaWdodCgpKSAvIHlBeGlzU2NhbGUpKTsKIH0KIAogSW50UmVjdCBDb250ZXh0
U2hhZG93OjpjYWxjdWxhdGVMYXllckJvdW5kaW5nUmVjdChHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIGNvbnN0IEZsb2F0UmVjdCYgbGF5ZXJBcmVhLCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkK
IHsKICAgICAvLyBDYWxjdWxhdGUgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBibHVycmVkIGFuZC9v
ciB0cmFuc2Zvcm1lZCBsYXllci4KICAgICBGbG9hdFJlY3QgbGF5ZXJGbG9hdFJlY3Q7Ci0gICAg
ZmxvYXQgaW5mbGF0aW9uID0gMDsKKyAgICBGbG9hdFNpemUgaW5mbGF0aW9uOwogCiAgICAgY29u
c3QgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IGNvbnRleHQtPmdldENUTSgpOwogICAgIGlm
IChtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zICYmICF0cmFuc2Zvcm0uaXNJZGVudGl0eSgpKSB7
CkBAIC0yMjQsNyArMjIzLDggQEAgSW50UmVjdCBDb250ZXh0U2hhZG93OjpjYWxjdWxhdGVMYXll
ckJvdQogCiAgICAgLy8gV2UgZXhwYW5kIHRoZSBhcmVhIGJ5IHRoZSBibHVyIHJhZGl1cyB0byBn
aXZlIGV4dHJhIHNwYWNlIGZvciB0aGUgYmx1ciB0cmFuc2l0aW9uLgogICAgIGlmIChtX3R5cGUg
PT0gQmx1clNoYWRvdykgewotICAgICAgICBsYXllckZsb2F0UmVjdC5pbmZsYXRlKG1fYmx1ckRp
c3RhbmNlKTsKKyAgICAgICAgbGF5ZXJGbG9hdFJlY3QuaW5mbGF0ZVgobV9ibHVyRGlzdGFuY2Uu
d2lkdGgoKSk7CisgICAgICAgIGxheWVyRmxvYXRSZWN0LmluZmxhdGVZKG1fYmx1ckRpc3RhbmNl
LmhlaWdodCgpKTsKICAgICAgICAgaW5mbGF0aW9uICs9IG1fYmx1ckRpc3RhbmNlOwogICAgIH0K
IApAQCAtMjQxLDE0ICsyNDEsMTcgQEAgSW50UmVjdCBDb250ZXh0U2hhZG93OjpjYWxjdWxhdGVM
YXllckJvdQogICAgICAgICAvLyBXZSBhZGp1c3QgYWdhaW4gYmVjYXVzZSB0aGUgcGl4ZWxzIGF0
IHRoZSBib3JkZXJzIGFyZSBzdGlsbAogICAgICAgICAvLyBwb3RlbnRpYWxseSBhZmZlY3RlZCBi
eSB0aGUgcGl4ZWxzIG91dHNpZGUgdGhlIGJ1ZmZlci4KICAgICAgICAgaWYgKG1fdHlwZSA9PSBC
bHVyU2hhZG93KSB7Ci0gICAgICAgICAgICBsYXllckZsb2F0UmVjdC5pbmZsYXRlKG1fYmx1ckRp
c3RhbmNlKTsKLSAgICAgICAgICAgIHVuY2xpcHBlZExheWVyUmVjdC5pbmZsYXRlKG1fYmx1ckRp
c3RhbmNlKTsKKyAgICAgICAgICAgIGxheWVyRmxvYXRSZWN0LmluZmxhdGVYKG1fYmx1ckRpc3Rh
bmNlLndpZHRoKCkpOworICAgICAgICAgICAgbGF5ZXJGbG9hdFJlY3QuaW5mbGF0ZVkobV9ibHVy
RGlzdGFuY2UuaGVpZ2h0KCkpOworICAgICAgICAgICAgdW5jbGlwcGVkTGF5ZXJSZWN0LmluZmxh
dGVYKG1fYmx1ckRpc3RhbmNlLndpZHRoKCkpOworICAgICAgICAgICAgdW5jbGlwcGVkTGF5ZXJS
ZWN0LmluZmxhdGVZKG1fYmx1ckRpc3RhbmNlLmhlaWdodCgpKTsKICAgICAgICAgICAgIGluZmxh
dGlvbiArPSBtX2JsdXJEaXN0YW5jZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGNvbnN0IGlu
dCBmcmFtZVNpemUgPSBpbmZsYXRpb24gKiAyOwotICAgIG1fc291cmNlUmVjdCA9IEludFJlY3Qo
MCwgMCwgbGF5ZXJBcmVhLndpZHRoKCkgKyBmcmFtZVNpemUsIGxheWVyQXJlYS5oZWlnaHQoKSAr
IGZyYW1lU2l6ZSk7CisgICAgSW50U2l6ZSBmcmFtZVNpemUocm91bmRlZEludFNpemUoaW5mbGF0
aW9uKSk7CisgICAgZnJhbWVTaXplLnNjYWxlKDIpOworICAgIG1fc291cmNlUmVjdCA9IEludFJl
Y3QoMCwgMCwgbGF5ZXJBcmVhLndpZHRoKCkgKyBmcmFtZVNpemUud2lkdGgoKSwgbGF5ZXJBcmVh
LmhlaWdodCgpICsgZnJhbWVTaXplLmhlaWdodCgpKTsKICAgICBtX2xheWVyT3JpZ2luID0gRmxv
YXRQb2ludChsYXllckZsb2F0UmVjdC54KCksIGxheWVyRmxvYXRSZWN0LnkoKSk7CiAKICAgICBj
b25zdCBGbG9hdFBvaW50IG1fdW5jbGlwcGVkTGF5ZXJPcmlnaW4gPSBGbG9hdFBvaW50KHVuY2xp
cHBlZExheWVyUmVjdC54KCksIHVuY2xpcHBlZExheWVyUmVjdC55KCkpOwpAQCAtMjU2LDggKzI1
OSw4IEBAIEludFJlY3QgQ29udGV4dFNoYWRvdzo6Y2FsY3VsYXRlTGF5ZXJCb3UKIAogICAgIC8v
IFNldCB0aGUgb3JpZ2luIGFzIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHNjcmF0Y2ggaW1h
Z2UsIG9yLCBpbiBjYXNlIHRoZXJlJ3MgYSBjbGlwcGVkCiAgICAgLy8gb3V0IHJlZ2lvbiwgc2V0
IHRoZSBvcmlnaW4gYWNjb3JkaW5nbHkgdG8gdGhlIGZ1bGwgYm91bmRpbmcgcmVjdCdzIHRvcC1s
ZWZ0IGNvcm5lci4KLSAgICBjb25zdCBmbG9hdCB0cmFuc2xhdGlvblggPSAtbGF5ZXJBcmVhLngo
KSArIGluZmxhdGlvbiAtIGZhYnNmKGNsaXBwZWRPdXQud2lkdGgoKSk7Ci0gICAgY29uc3QgZmxv
YXQgdHJhbnNsYXRpb25ZID0gLWxheWVyQXJlYS55KCkgKyBpbmZsYXRpb24gLSBmYWJzZihjbGlw
cGVkT3V0LmhlaWdodCgpKTsKKyAgICBjb25zdCBmbG9hdCB0cmFuc2xhdGlvblggPSAtbGF5ZXJB
cmVhLngoKSArIGluZmxhdGlvbi53aWR0aCgpIC0gZmFic2YoY2xpcHBlZE91dC53aWR0aCgpKTsK
KyAgICBjb25zdCBmbG9hdCB0cmFuc2xhdGlvblkgPSAtbGF5ZXJBcmVhLnkoKSArIGluZmxhdGlv
bi5oZWlnaHQoKSAtIGZhYnNmKGNsaXBwZWRPdXQuaGVpZ2h0KCkpOwogICAgIG1fbGF5ZXJDb250
ZXh0VHJhbnNsYXRpb24gPSBGbG9hdFBvaW50KHRyYW5zbGF0aW9uWCwgdHJhbnNsYXRpb25ZKTsK
IAogICAgIHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KGxheWVyRmxvYXRSZWN0KTsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbnRleHRTaGFkb3cuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db250ZXh0U2hhZG93LmgJKHJl
dmlzaW9uIDc1ODc1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29udGV4
dFNoYWRvdy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSAiQ29s
b3IuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5j
bHVkZSAiUmVmQ291bnRlZC5oIgogCiAjaWYgUExBVEZPUk0oQ0FJUk8pCiB0eXBlZGVmIHN0cnVj
dCBfY2Fpcm8gY2Fpcm9fdDsKQEAgLTY4LDIzICs2NywyNyBAQCB0eXBlZGVmIHZvaWQqIFBsYXRm
b3JtQ29udGV4dDsKIC8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGNvcHlhYmxlIHNpbmNlIEdyYXBo
aWNzQ29udGV4dFF0IGtlZXBzIGEgc3RhY2sgb2YKIC8vIHRoZSBzaGFkb3cgc3RhdGUgZm9yIHNh
dmVQbGF0Zm9ybVN0YXRlIGFuZCByZXN0b3JlUGxhdGZvcm1TdGF0ZS4KIAorZW51bSBDb250ZXh0
U2hhZG93VHlwZSB7CisgICAgTm9TaGFkb3csCisgICAgU29saWRTaGFkb3csCisgICAgQmx1clNo
YWRvdworfTsKKwogY2xhc3MgQ29udGV4dFNoYWRvdyB7CiBwdWJsaWM6Ci0gICAgZW51bSB7Ci0g
ICAgICAgIE5vU2hhZG93LAotICAgICAgICBTb2xpZFNoYWRvdywKLSAgICAgICAgQmx1clNoYWRv
dwotICAgIH0gbV90eXBlOworICAgIENvbnRleHRTaGFkb3dUeXBlIG1fdHlwZTsKIAogICAgIENv
bG9yIG1fY29sb3I7Ci0gICAgaW50IG1fYmx1ckRpc3RhbmNlOworICAgIEludFNpemUgbV9ibHVy
RGlzdGFuY2U7CiAgICAgRmxvYXRTaXplIG1fb2Zmc2V0OwogCiAgICAgQ29udGV4dFNoYWRvdygp
OwotICAgIENvbnRleHRTaGFkb3coY29uc3QgQ29sb3ImLCBmbG9hdCByYWRpdXMsIGNvbnN0IEZs
b2F0U2l6ZSYgb2Zmc2V0KTsKKyAgICBDb250ZXh0U2hhZG93KGNvbnN0IENvbG9yJiwgY29uc3Qg
RmxvYXRTaXplJiByYWRpdXMsIGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KTsKIAogICAgIGJvb2wg
bXVzdFVzZUNvbnRleHRTaGFkb3coR3JhcGhpY3NDb250ZXh0Kik7CiAgICAgdm9pZCBjbGVhcigp
OworICAgIAorICAgIHZvaWQgYmx1ckxheWVySW1hZ2UodW5zaWduZWQgY2hhciosIGNvbnN0IElu
dFNpemUmIGltYWdlU2l6ZSwgaW50IHN0cmlkZSk7CiAKICAgICAvLyBUaGUgcGFpciBiZWdpblNo
YWRvd0xheWVyIGFuZCBlbmRTaGFkb3dMYXllciBjcmVhdGVzIGEgdGVtcG9yYXJ5IGltYWdlCiAg
ICAgLy8gd2hlcmUgdGhlIGNhbGxlciBjYW4gZHJhdyBvbnRvLCB1c2luZyB0aGUgcmV0dXJuZWQg
Y29udGV4dC4gVGhpcyBjb250ZXh0CkBAIC0xMzAsNyArMTMzLDYgQEAgcHJpdmF0ZToKICAgICBi
b29sIG1fc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7CiAKICAgICB2b2lkIGFkanVzdEJsdXJEaXN0
YW5jZShHcmFwaGljc0NvbnRleHQqKTsKLSAgICB2b2lkIGJsdXJMYXllckltYWdlKHVuc2lnbmVk
IGNoYXIqLCBjb25zdCBJbnRTaXplJiBpbWFnZVNpemUsIGludCBzdHJpZGUpOwogICAgIEludFJl
Y3QgY2FsY3VsYXRlTGF5ZXJCb3VuZGluZ1JlY3QoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxv
YXRSZWN0JiBsYXllckFyZWEsIGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KTsKIAogI2lmIFBMQVRG
T1JNKENBSVJPKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8v
Q29udGV4dFNoYWRvd0NhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jYWlyby9Db250ZXh0U2hhZG93Q2Fpcm8uY3BwCShyZXZpc2lvbiA3NTg3
NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0NvbnRleHRTaGFk
b3dDYWlyby5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDEwIFNlbmNoYSwgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBT
LkwuCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0x
OTAsMTIgKzE5MSwxMyBAQCBzdGF0aWMgaW5saW5lIEZsb2F0UG9pbnQgZ2V0UGhhc2UoY29uc3Qg
CiB2b2lkIENvbnRleHRTaGFkb3c6OmRyYXdSZWN0U2hhZG93KEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW50U2l6ZSYgdG9wTGVmdFJhZGl1cywg
Y29uc3QgSW50U2l6ZSYgdG9wUmlnaHRSYWRpdXMsIGNvbnN0IEludFNpemUmIGJvdHRvbUxlZnRS
YWRpdXMsIGNvbnN0IEludFNpemUmIGJvdHRvbVJpZ2h0UmFkaXVzKQogewogCi0gICAgZmxvYXQg
cmFkaXVzVHdpY2UgPSBtX2JsdXJEaXN0YW5jZSAqIDI7CisgICAgSW50U2l6ZSByYWRpdXNUd2lj
ZShtX2JsdXJEaXN0YW5jZSkKKyAgICByYWRpdXNUd2ljZS5zY2FsZSgyKTsKIAogICAgIC8vIEZp
bmQgdGhlIHNwYWNlIHRoZSBjb3JuZXJzIG5lZWQgaW5zaWRlIHRoZSByZWN0IGZvciBpdHMgc2hh
ZG93cy4KLSAgICBpbnQgaW50ZXJuYWxTaGFkb3dXaWR0aCA9IHJhZGl1c1R3aWNlICsgbWF4KHRv
cExlZnRSYWRpdXMud2lkdGgoKSwgYm90dG9tTGVmdFJhZGl1cy53aWR0aCgpKSArCisgICAgaW50
IGludGVybmFsU2hhZG93V2lkdGggPSByYWRpdXNUd2ljZS53aWR0aCgpICsgbWF4KHRvcExlZnRS
YWRpdXMud2lkdGgoKSwgYm90dG9tTGVmdFJhZGl1cy53aWR0aCgpKSArCiAgICAgICAgIG1heCh0
b3BSaWdodFJhZGl1cy53aWR0aCgpLCBib3R0b21SaWdodFJhZGl1cy53aWR0aCgpKTsKLSAgICBp
bnQgaW50ZXJuYWxTaGFkb3dIZWlnaHQgPSByYWRpdXNUd2ljZSArIG1heCh0b3BMZWZ0UmFkaXVz
LmhlaWdodCgpLCB0b3BSaWdodFJhZGl1cy5oZWlnaHQoKSkgKworICAgIGludCBpbnRlcm5hbFNo
YWRvd0hlaWdodCA9IHJhZGl1c1R3aWNlLmhlaWdodCgpICsgbWF4KHRvcExlZnRSYWRpdXMuaGVp
Z2h0KCksIHRvcFJpZ2h0UmFkaXVzLmhlaWdodCgpKSArCiAgICAgICAgIG1heChib3R0b21MZWZ0
UmFkaXVzLmhlaWdodCgpLCBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQoKSk7CiAKICAgICBjYWly
b190KiBjciA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwpAQCAtMjA5LDE5ICsyMTEsMTkg
QEAgdm9pZCBDb250ZXh0U2hhZG93OjpkcmF3UmVjdFNoYWRvdyhHcmFwaAogICAgIH0KIAogICAg
IC8vIENhbGN1bGF0ZSBzaXplIG9mIHRoZSB0ZW1wbGF0ZSBzaGFkb3cgYnVmZmVyLgotICAgIElu
dFNpemUgc2hhZG93QnVmZmVyU2l6ZSA9IEludFNpemUocmVjdC53aWR0aCgpICsgcmFkaXVzVHdp
Y2UsIHJlY3QuaGVpZ2h0KCkgKyByYWRpdXNUd2ljZSk7CisgICAgSW50U2l6ZSBzaGFkb3dCdWZm
ZXJTaXplID0gcmVjdC5zaXplKCkgKyByYWRpdXNUd2ljZTsKIAogICAgIC8vIERldGVybWluZSBk
aW1lbnNpb25zIG9mIHNoYWRvdyByZWN0LgogICAgIEZsb2F0UmVjdCBzaGFkb3dSZWN0ID0gRmxv
YXRSZWN0KHJlY3QubG9jYXRpb24oKSwgc2hhZG93QnVmZmVyU2l6ZSk7Ci0gICAgc2hhZG93UmVj
dC5tb3ZlKC0gbV9ibHVyRGlzdGFuY2UsIC0gbV9ibHVyRGlzdGFuY2UpOworICAgIHNoYWRvd1Jl
Y3QubW92ZSgtIG1fYmx1ckRpc3RhbmNlLndpZHRoKCksIC0gbV9ibHVyRGlzdGFuY2UuaGVpZ2h0
KCkpOwogCiAgICAgLy8gU2l6ZSBvZiB0aGUgdGlsaW5nIHNpZGUuCiAgICAgaW50IHNpZGVUaWxl
V2lkdGggPSAxOwogCiAgICAgLy8gVGhlIGxlbmd0aCBvZiBhIHNpZGUgb2YgdGhlIGJ1ZmZlciBp
cyB0aGUgZW5vdWdoIHNwYWNlIGZvciBmb3VyIGJsdXIgcmFkaWksCiAgICAgLy8gdGhlIHJhZGlp
IG9mIHRoZSBjb3JuZXJzLCBhbmQgdGhlbiAxIHBpeGVsIHRvIGRyYXcgdGhlIHNpZGUgdGlsZXMu
Ci0gICAgSW50U2l6ZSBzaGFkb3dUZW1wbGF0ZVNpemUgPSBJbnRTaXplKHNpZGVUaWxlV2lkdGgg
KyByYWRpdXNUd2ljZSArIGludGVybmFsU2hhZG93V2lkdGgsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNpZGVUaWxlV2lkdGggKyByYWRpdXNUd2ljZSArIGludGVy
bmFsU2hhZG93SGVpZ2h0KTsKKyAgICBJbnRTaXplIHNoYWRvd1RlbXBsYXRlU2l6ZSA9IEludFNp
emUoc2lkZVRpbGVXaWR0aCArIHJhZGl1c1R3aWNlLndpZHRoKCkgKyBpbnRlcm5hbFNoYWRvd1dp
ZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlVGlsZVdp
ZHRoICsgcmFkaXVzVHdpY2UuaGVpZ2h0KCkgKyBpbnRlcm5hbFNoYWRvd0hlaWdodCk7CiAKICAg
ICAvLyBSZWR1Y2UgdGhlIHNpemUgb2Ygd2hhdCB3ZSBoYXZlIHRvIGRyYXcgd2l0aCB0aGUgY2xp
cCBhcmVhLgogICAgIGRvdWJsZSB4MSwgeDIsIHkxLCB5MjsKQEAgLTI0Niw3ICsyNDgsNyBAQCB2
b2lkIENvbnRleHRTaGFkb3c6OmRyYXdSZWN0U2hhZG93KEdyYXBoCiAgICAgY2Fpcm9fc2V0X29w
ZXJhdG9yKG1fbGF5ZXJDb250ZXh0LCBDQUlST19PUEVSQVRPUl9PVkVSKTsKIAogICAgIC8vIERy
YXcgdGhlIHJlY3RhbmdsZS4KLSAgICBJbnRSZWN0IHRlbXBsYXRlUmVjdCA9IEludFJlY3QobV9i
bHVyRGlzdGFuY2UsIG1fYmx1ckRpc3RhbmNlLCBzaGFkb3dUZW1wbGF0ZVNpemUud2lkdGgoKSAt
IHJhZGl1c1R3aWNlLCBzaGFkb3dUZW1wbGF0ZVNpemUuaGVpZ2h0KCkgLSByYWRpdXNUd2ljZSk7
CisgICAgSW50UmVjdCB0ZW1wbGF0ZVJlY3QgPSBJbnRSZWN0KG1fYmx1ckRpc3RhbmNlLndpZHRo
KCksIG1fYmx1ckRpc3RhbmNlLmhlaWdodCgpLCBzaGFkb3dUZW1wbGF0ZVNpemUud2lkdGgoKSAt
IHJhZGl1c1R3aWNlLndpZHRoKCksIHNoYWRvd1RlbXBsYXRlU2l6ZS5oZWlnaHQoKSAtIHJhZGl1
c1R3aWNlLmhlaWdodCgpKTsKICAgICBQYXRoIHBhdGg7CiAgICAgcGF0aC5hZGRSb3VuZGVkUmVj
dCh0ZW1wbGF0ZVJlY3QsIHRvcExlZnRSYWRpdXMsIHRvcFJpZ2h0UmFkaXVzLCBib3R0b21MZWZ0
UmFkaXVzLCBib3R0b21SaWdodFJhZGl1cyk7CiAgICAgYXBwZW5kV2ViQ29yZVBhdGhUb0NhaXJv
Q29udGV4dChtX2xheWVyQ29udGV4dCwgcGF0aCk7CkBAIC0yNjgsNyArMjcwLDggQEAgdm9pZCBD
b250ZXh0U2hhZG93OjpkcmF3UmVjdFNoYWRvdyhHcmFwaAogICAgIG1fbGF5ZXJDb250ZXh0ID0g
MDsKIAogICAgIC8vIEZpbGwgdGhlIGludGVybmFsIHBhcnQgb2YgdGhlIHNoYWRvdy4KLSAgICBz
aGFkb3dSZWN0LmluZmxhdGUoLXJhZGl1c1R3aWNlKTsKKyAgICBzaGFkb3dSZWN0LmluZmxhdGVY
KC1yYWRpdXNUd2ljZS53aWR0aCgpKTsKKyAgICBzaGFkb3dSZWN0LmluZmxhdGVZKC1yYWRpdXNU
d2ljZS5oZWlnaHQoKSk7CiAgICAgaWYgKCFzaGFkb3dSZWN0LmlzRW1wdHkoKSkgewogICAgICAg
ICBjYWlyb19zYXZlKGNyKTsKICAgICAgICAgcGF0aC5jbGVhcigpOwpAQCAtMjc4LDcyICsyODEs
NzMgQEAgdm9pZCBDb250ZXh0U2hhZG93OjpkcmF3UmVjdFNoYWRvdyhHcmFwaAogICAgICAgICBj
YWlyb19maWxsKGNyKTsKICAgICAgICAgY2Fpcm9fcmVzdG9yZShjcik7CiAgICAgfQotICAgIHNo
YWRvd1JlY3QuaW5mbGF0ZShyYWRpdXNUd2ljZSk7CisgICAgc2hhZG93UmVjdC5pbmZsYXRlWChy
YWRpdXNUd2ljZS53aWR0aCgpKTsKKyAgICBzaGFkb3dSZWN0LmluZmxhdGVZKHJhZGl1c1R3aWNl
LmhlaWdodCgpKTsKIAogICAgIC8vIERyYXcgdG9wIHNpZGUuCi0gICAgRmxvYXRSZWN0IHRpbGVS
ZWN0ID0gRmxvYXRSZWN0KHJhZGl1c1R3aWNlICsgdG9wTGVmdFJhZGl1cy53aWR0aCgpLCAwLCBz
aWRlVGlsZVdpZHRoLCByYWRpdXNUd2ljZSk7CisgICAgRmxvYXRSZWN0IHRpbGVSZWN0ID0gRmxv
YXRSZWN0KHJhZGl1c1R3aWNlLndpZHRoKCkgKyB0b3BMZWZ0UmFkaXVzLndpZHRoKCksIDAsIHNp
ZGVUaWxlV2lkdGgsIHJhZGl1c1R3aWNlLmhlaWdodCgpKTsKICAgICBGbG9hdFJlY3QgZGVzdFJl
Y3QgPSB0aWxlUmVjdDsKICAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dS
ZWN0LnkoKSk7Ci0gICAgZGVzdFJlY3Quc2V0V2lkdGgoc2hhZG93UmVjdC53aWR0aCgpIC0gdG9w
TGVmdFJhZGl1cy53aWR0aCgpIC0gdG9wUmlnaHRSYWRpdXMud2lkdGgoKSAtIG1fYmx1ckRpc3Rh
bmNlICogNCk7CisgICAgZGVzdFJlY3Quc2V0V2lkdGgoc2hhZG93UmVjdC53aWR0aCgpIC0gdG9w
TGVmdFJhZGl1cy53aWR0aCgpIC0gdG9wUmlnaHRSYWRpdXMud2lkdGgoKSAtIG1fYmx1ckRpc3Rh
bmNlLndpZHRoKCkgKiA0KTsKICAgICBGbG9hdFBvaW50IHBoYXNlID0gZ2V0UGhhc2UoZGVzdFJl
Y3QsIHRpbGVSZWN0KTsKICAgICBBZmZpbmVUcmFuc2Zvcm0gcGF0dGVyblRyYW5zZm9ybTsKICAg
ICBwYXR0ZXJuVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOwogICAgIGRyYXdQYXR0ZXJuVG9DYWly
b0NvbnRleHQoY3IsIG1fbGF5ZXJJbWFnZSwgc2hhZG93VGVtcGxhdGVTaXplLCB0aWxlUmVjdCwg
cGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIENBSVJPX09QRVJBVE9SX09WRVIsIGRlc3RSZWN0KTsK
IAogICAgIC8vIERyYXcgdGhlIGJvdHRvbSBzaWRlLgotICAgIHRpbGVSZWN0ID0gRmxvYXRSZWN0
KHJhZGl1c1R3aWNlICsgYm90dG9tTGVmdFJhZGl1cy53aWR0aCgpLCBzaGFkb3dUZW1wbGF0ZVNp
emUuaGVpZ2h0KCkgLSByYWRpdXNUd2ljZSwgc2lkZVRpbGVXaWR0aCwgcmFkaXVzVHdpY2UpOwor
ICAgIHRpbGVSZWN0ID0gRmxvYXRSZWN0KHJhZGl1c1R3aWNlLndpZHRoKCkgKyBib3R0b21MZWZ0
UmFkaXVzLndpZHRoKCksIHNoYWRvd1RlbXBsYXRlU2l6ZS5oZWlnaHQoKSAtIHJhZGl1c1R3aWNl
LmhlaWdodCgpLCBzaWRlVGlsZVdpZHRoLCByYWRpdXNUd2ljZS5oZWlnaHQoKSk7CiAgICAgZGVz
dFJlY3QgPSB0aWxlUmVjdDsKICAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFk
b3dSZWN0LnkoKSArIHJhZGl1c1R3aWNlICsgcmVjdC5oZWlnaHQoKSAtIHNoYWRvd1RlbXBsYXRl
U2l6ZS5oZWlnaHQoKSk7Ci0gICAgZGVzdFJlY3Quc2V0V2lkdGgoc2hhZG93UmVjdC53aWR0aCgp
IC0gYm90dG9tTGVmdFJhZGl1cy53aWR0aCgpIC0gYm90dG9tUmlnaHRSYWRpdXMud2lkdGgoKSAt
IG1fYmx1ckRpc3RhbmNlICogNCk7CisgICAgZGVzdFJlY3Quc2V0V2lkdGgoc2hhZG93UmVjdC53
aWR0aCgpIC0gYm90dG9tTGVmdFJhZGl1cy53aWR0aCgpIC0gYm90dG9tUmlnaHRSYWRpdXMud2lk
dGgoKSAtIG1fYmx1ckRpc3RhbmNlLndpZHRoKCkgKiA0KTsKICAgICBwaGFzZSA9IGdldFBoYXNl
KGRlc3RSZWN0LCB0aWxlUmVjdCk7CiAgICAgZHJhd1BhdHRlcm5Ub0NhaXJvQ29udGV4dChjciwg
bV9sYXllckltYWdlLCBzaGFkb3dUZW1wbGF0ZVNpemUsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNm
b3JtLCBwaGFzZSwgQ0FJUk9fT1BFUkFUT1JfT1ZFUiwgZGVzdFJlY3QpOwogCiAgICAgLy8gRHJh
dyB0aGUgcmlnaHQgc2lkZS4KLSAgICB0aWxlUmVjdCA9IEZsb2F0UmVjdChzaGFkb3dUZW1wbGF0
ZVNpemUud2lkdGgoKSAtIHJhZGl1c1R3aWNlLCByYWRpdXNUd2ljZSArIHRvcFJpZ2h0UmFkaXVz
LmhlaWdodCgpLCByYWRpdXNUd2ljZSwgc2lkZVRpbGVXaWR0aCk7CisgICAgdGlsZVJlY3QgPSBG
bG9hdFJlY3Qoc2hhZG93VGVtcGxhdGVTaXplLndpZHRoKCkgLSByYWRpdXNUd2ljZS53aWR0aCgp
LCByYWRpdXNUd2ljZS5oZWlnaHQoKSArIHRvcFJpZ2h0UmFkaXVzLmhlaWdodCgpLCByYWRpdXNU
d2ljZS53aWR0aCgpLCBzaWRlVGlsZVdpZHRoKTsKICAgICBkZXN0UmVjdCA9IHRpbGVSZWN0Owot
ICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93UmVjdC54KCkgKyByYWRpdXNUd2ljZSArIHJlY3Qud2lk
dGgoKSAtIHNoYWRvd1RlbXBsYXRlU2l6ZS53aWR0aCgpLCBzaGFkb3dSZWN0LnkoKSk7Ci0gICAg
ZGVzdFJlY3Quc2V0SGVpZ2h0KHNoYWRvd1JlY3QuaGVpZ2h0KCkgLSB0b3BSaWdodFJhZGl1cy5o
ZWlnaHQoKSAtIGJvdHRvbVJpZ2h0UmFkaXVzLmhlaWdodCgpIC0gbV9ibHVyRGlzdGFuY2UgKiA0
KTsKKyAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpICsgcmFkaXVzVHdpY2Uud2lkdGgo
KSArIHJlY3Qud2lkdGgoKSAtIHNoYWRvd1RlbXBsYXRlU2l6ZS53aWR0aCgpLCBzaGFkb3dSZWN0
LnkoKSk7CisgICAgZGVzdFJlY3Quc2V0SGVpZ2h0KHNoYWRvd1JlY3QuaGVpZ2h0KCkgLSB0b3BS
aWdodFJhZGl1cy5oZWlnaHQoKSAtIGJvdHRvbVJpZ2h0UmFkaXVzLmhlaWdodCgpIC0gbV9ibHVy
RGlzdGFuY2UuaGVpZ2h0KCkgKiA0KTsKICAgICBwaGFzZSA9IGdldFBoYXNlKGRlc3RSZWN0LCB0
aWxlUmVjdCk7CiAgICAgZHJhd1BhdHRlcm5Ub0NhaXJvQ29udGV4dChjciwgbV9sYXllckltYWdl
LCBzaGFkb3dUZW1wbGF0ZVNpemUsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwg
Q0FJUk9fT1BFUkFUT1JfT1ZFUiwgZGVzdFJlY3QpOwogCiAgICAgLy8gRHJhdyB0aGUgbGVmdCBz
aWRlLgotICAgIHRpbGVSZWN0ID0gRmxvYXRSZWN0KDAsIHJhZGl1c1R3aWNlICsgdG9wTGVmdFJh
ZGl1cy5oZWlnaHQoKSwgcmFkaXVzVHdpY2UsIHNpZGVUaWxlV2lkdGgpOworICAgIHRpbGVSZWN0
ID0gRmxvYXRSZWN0KDAsIHJhZGl1c1R3aWNlLmhlaWdodCgpICsgdG9wTGVmdFJhZGl1cy5oZWln
aHQoKSwgcmFkaXVzVHdpY2Uud2lkdGgoKSwgc2lkZVRpbGVXaWR0aCk7CiAgICAgZGVzdFJlY3Qg
PSB0aWxlUmVjdDsKICAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dSZWN0
LnkoKSk7Ci0gICAgZGVzdFJlY3Quc2V0SGVpZ2h0KHNoYWRvd1JlY3QuaGVpZ2h0KCkgLSB0b3BM
ZWZ0UmFkaXVzLmhlaWdodCgpIC0gYm90dG9tTGVmdFJhZGl1cy5oZWlnaHQoKSAtIG1fYmx1ckRp
c3RhbmNlICogNCk7CisgICAgZGVzdFJlY3Quc2V0SGVpZ2h0KHNoYWRvd1JlY3QuaGVpZ2h0KCkg
LSB0b3BMZWZ0UmFkaXVzLmhlaWdodCgpIC0gYm90dG9tTGVmdFJhZGl1cy5oZWlnaHQoKSAtIG1f
Ymx1ckRpc3RhbmNlLmhlaWdodCgpICogNCk7CiAgICAgcGhhc2UgPSBGbG9hdFBvaW50KGRlc3RS
ZWN0LngoKSAtIHRpbGVSZWN0LngoKSwgZGVzdFJlY3QueSgpIC0gdGlsZVJlY3QueSgpKTsKICAg
ICBkcmF3UGF0dGVyblRvQ2Fpcm9Db250ZXh0KGNyLCBtX2xheWVySW1hZ2UsIHNoYWRvd1RlbXBs
YXRlU2l6ZSwgdGlsZVJlY3QsIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBDQUlST19PUEVSQVRP
Ul9PVkVSLCBkZXN0UmVjdCk7CiAKICAgICAvLyBEcmF3IHRoZSB0b3AgbGVmdCBjb3JuZXIuCi0g
ICAgdGlsZVJlY3QgPSBGbG9hdFJlY3QoMCwgMCwgcmFkaXVzVHdpY2UgKyB0b3BMZWZ0UmFkaXVz
LndpZHRoKCksIHJhZGl1c1R3aWNlICsgdG9wTGVmdFJhZGl1cy5oZWlnaHQoKSk7CisgICAgdGls
ZVJlY3QgPSBGbG9hdFJlY3QoMCwgMCwgcmFkaXVzVHdpY2Uud2lkdGgoKSArIHRvcExlZnRSYWRp
dXMud2lkdGgoKSwgcmFkaXVzVHdpY2UuaGVpZ2h0KCkgKyB0b3BMZWZ0UmFkaXVzLmhlaWdodCgp
KTsKICAgICBkZXN0UmVjdCA9IHRpbGVSZWN0OwogICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93UmVj
dC54KCksIHNoYWRvd1JlY3QueSgpKTsKICAgICBwaGFzZSA9IGdldFBoYXNlKGRlc3RSZWN0LCB0
aWxlUmVjdCk7CiAgICAgZHJhd1BhdHRlcm5Ub0NhaXJvQ29udGV4dChjciwgbV9sYXllckltYWdl
LCBzaGFkb3dUZW1wbGF0ZVNpemUsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwg
Q0FJUk9fT1BFUkFUT1JfT1ZFUiwgZGVzdFJlY3QpOwogCiAgICAgLy8gRHJhdyB0aGUgdG9wIHJp
Z2h0IGNvcm5lci4KLSAgICB0aWxlUmVjdCA9IEZsb2F0UmVjdChzaGFkb3dUZW1wbGF0ZVNpemUu
d2lkdGgoKSAtIHJhZGl1c1R3aWNlIC0gdG9wUmlnaHRSYWRpdXMud2lkdGgoKSwgMCwgcmFkaXVz
VHdpY2UgKyB0b3BSaWdodFJhZGl1cy53aWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAg
IHJhZGl1c1R3aWNlICsgdG9wUmlnaHRSYWRpdXMuaGVpZ2h0KCkpOworICAgIHRpbGVSZWN0ID0g
RmxvYXRSZWN0KHNoYWRvd1RlbXBsYXRlU2l6ZS53aWR0aCgpIC0gcmFkaXVzVHdpY2Uud2lkdGgo
KSAtIHRvcFJpZ2h0UmFkaXVzLndpZHRoKCksIDAsIHJhZGl1c1R3aWNlLndpZHRoKCkgKyB0b3BS
aWdodFJhZGl1cy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1c1R3aWNl
LmhlaWdodCgpICsgdG9wUmlnaHRSYWRpdXMuaGVpZ2h0KCkpOwogICAgIGRlc3RSZWN0ID0gdGls
ZVJlY3Q7Ci0gICAgZGVzdFJlY3QubW92ZShzaGFkb3dSZWN0LngoKSArIHJlY3Qud2lkdGgoKSAt
IHNoYWRvd1RlbXBsYXRlU2l6ZS53aWR0aCgpICsgcmFkaXVzVHdpY2UsIHNoYWRvd1JlY3QueSgp
KTsKKyAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gc2hh
ZG93VGVtcGxhdGVTaXplLndpZHRoKCkgKyByYWRpdXNUd2ljZS53aWR0aCgpLCBzaGFkb3dSZWN0
LnkoKSk7CiAgICAgcGhhc2UgPSBnZXRQaGFzZShkZXN0UmVjdCwgdGlsZVJlY3QpOwogICAgIGRy
YXdQYXR0ZXJuVG9DYWlyb0NvbnRleHQoY3IsIG1fbGF5ZXJJbWFnZSwgc2hhZG93VGVtcGxhdGVT
aXplLCB0aWxlUmVjdCwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIENBSVJPX09QRVJBVE9SX09W
RVIsIGRlc3RSZWN0KTsKIAogICAgIC8vIERyYXcgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuCi0g
ICAgdGlsZVJlY3QgPSBGbG9hdFJlY3Qoc2hhZG93VGVtcGxhdGVTaXplLndpZHRoKCkgLSByYWRp
dXNUd2ljZSAtIGJvdHRvbVJpZ2h0UmFkaXVzLndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgc2hhZG93VGVtcGxhdGVTaXplLmhlaWdodCgpIC0gcmFkaXVzVHdpY2UgLSBib3R0b21S
aWdodFJhZGl1cy5oZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXNUd2lj
ZSArIGJvdHRvbVJpZ2h0UmFkaXVzLndpZHRoKCksIHJhZGl1c1R3aWNlICsgYm90dG9tUmlnaHRS
YWRpdXMuaGVpZ2h0KCkpOworICAgIHRpbGVSZWN0ID0gRmxvYXRSZWN0KHNoYWRvd1RlbXBsYXRl
U2l6ZS53aWR0aCgpIC0gcmFkaXVzVHdpY2Uud2lkdGgoKSAtIGJvdHRvbVJpZ2h0UmFkaXVzLndp
ZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93VGVtcGxhdGVTaXplLmhlaWdo
dCgpIC0gcmFkaXVzVHdpY2UuaGVpZ2h0KCkgLSBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXNUd2ljZS53aWR0aCgpICsgYm90dG9tUmln
aHRSYWRpdXMud2lkdGgoKSwgcmFkaXVzVHdpY2UuaGVpZ2h0KCkgKyBib3R0b21SaWdodFJhZGl1
cy5oZWlnaHQoKSk7CiAgICAgZGVzdFJlY3QgPSB0aWxlUmVjdDsKLSAgICBkZXN0UmVjdC5tb3Zl
KHNoYWRvd1JlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gc2hhZG93VGVtcGxhdGVTaXplLndpZHRo
KCkgKyByYWRpdXNUd2ljZSwKLSAgICAgICAgICAgICAgICAgIHNoYWRvd1JlY3QueSgpICsgcmVj
dC5oZWlnaHQoKSAtIHNoYWRvd1RlbXBsYXRlU2l6ZS5oZWlnaHQoKSArIHJhZGl1c1R3aWNlKTsK
KyAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpICsgcmVjdC53aWR0aCgpIC0gc2hhZG93
VGVtcGxhdGVTaXplLndpZHRoKCkgKyByYWRpdXNUd2ljZS53aWR0aCgpLAorICAgICAgICAgICAg
ICAgICAgc2hhZG93UmVjdC55KCkgKyByZWN0LmhlaWdodCgpIC0gc2hhZG93VGVtcGxhdGVTaXpl
LmhlaWdodCgpICsgcmFkaXVzVHdpY2UuaGVpZ2h0KCkpOwogICAgIHBoYXNlID0gZ2V0UGhhc2Uo
ZGVzdFJlY3QsIHRpbGVSZWN0KTsKICAgICBkcmF3UGF0dGVyblRvQ2Fpcm9Db250ZXh0KGNyLCBt
X2xheWVySW1hZ2UsIHNoYWRvd1RlbXBsYXRlU2l6ZSwgdGlsZVJlY3QsIHBhdHRlcm5UcmFuc2Zv
cm0sIHBoYXNlLCBDQUlST19PUEVSQVRPUl9PVkVSLCBkZXN0UmVjdCk7CiAKICAgICAvLyBEcmF3
IHRoZSBib3R0b20gbGVmdCBjb3JuZXIuCi0gICAgdGlsZVJlY3QgPSBGbG9hdFJlY3QoMCwgc2hh
ZG93VGVtcGxhdGVTaXplLmhlaWdodCgpIC0gcmFkaXVzVHdpY2UgLSBib3R0b21MZWZ0UmFkaXVz
LmhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1c1R3aWNlICsgYm90dG9t
TGVmdFJhZGl1cy53aWR0aCgpLCByYWRpdXNUd2ljZSArIGJvdHRvbUxlZnRSYWRpdXMuaGVpZ2h0
KCkpOworICAgIHRpbGVSZWN0ID0gRmxvYXRSZWN0KDAsIHNoYWRvd1RlbXBsYXRlU2l6ZS5oZWln
aHQoKSAtIHJhZGl1c1R3aWNlLmhlaWdodCgpIC0gYm90dG9tTGVmdFJhZGl1cy5oZWlnaHQoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXNUd2ljZS53aWR0aCgpICsgYm90dG9tTGVm
dFJhZGl1cy53aWR0aCgpLCByYWRpdXNUd2ljZSArIGJvdHRvbUxlZnRSYWRpdXMuaGVpZ2h0KCkp
OwogICAgIGRlc3RSZWN0ID0gdGlsZVJlY3Q7Ci0gICAgZGVzdFJlY3QubW92ZShzaGFkb3dSZWN0
LngoKSwgc2hhZG93UmVjdC55KCkgKyByZWN0LmhlaWdodCgpIC0gc2hhZG93VGVtcGxhdGVTaXpl
LmhlaWdodCgpICsgcmFkaXVzVHdpY2UpOworICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93UmVjdC54
KCksIHNoYWRvd1JlY3QueSgpICsgcmVjdC5oZWlnaHQoKSAtIHNoYWRvd1RlbXBsYXRlU2l6ZS5o
ZWlnaHQoKSArIHJhZGl1c1R3aWNlLmhlaWdodCgpKTsKICAgICBwaGFzZSA9IGdldFBoYXNlKGRl
c3RSZWN0LCB0aWxlUmVjdCk7CiAgICAgZHJhd1BhdHRlcm5Ub0NhaXJvQ29udGV4dChjciwgbV9s
YXllckltYWdlLCBzaGFkb3dUZW1wbGF0ZVNpemUsIHRpbGVSZWN0LCBwYXR0ZXJuVHJhbnNmb3Jt
LCBwaGFzZSwgQ0FJUk9fT1BFUkFUT1JfT1ZFUiwgZGVzdFJlY3QpOwogCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9Gb250Q2Fpcm8uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ZvbnRDYWlyby5jcHAJ
KHJldmlzaW9uIDc1ODc1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vRm9udENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjksNyArNjksNyBAQCBzdGF0aWMg
dm9pZCBkcmF3R2x5cGhzU2hhZG93KEdyYXBoaWNzQ29uCiAgICAgQ29udGV4dFNoYWRvdyogc2hh
ZG93ID0gZ3JhcGhpY3NDb250ZXh0LT5jb250ZXh0U2hhZG93KCk7CiAgICAgQVNTRVJUKHNoYWRv
dyk7CiAKLSAgICBpZiAoIShncmFwaGljc0NvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4
dE1vZGVGaWxsKSB8fCBzaGFkb3ctPm1fdHlwZSA9PSBDb250ZXh0U2hhZG93OjpOb1NoYWRvdykK
KyAgICBpZiAoIShncmFwaGljc0NvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVG
aWxsKSB8fCBzaGFkb3ctPm1fdHlwZSA9PSBOb1NoYWRvdykKICAgICAgICAgcmV0dXJuOwogCiAg
ICAgaWYgKCFzaGFkb3ctPm11c3RVc2VDb250ZXh0U2hhZG93KGdyYXBoaWNzQ29udGV4dCkpIHsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29u
dGV4dENhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRDYWlyby5jcHAJKHJldmlzaW9uIDc1ODc1KQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fp
cm8uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDMsNyArMTQzLDcgQEAgc3RhdGljIGlubGluZSB2
b2lkIGRyYXdQYXRoU2hhZG93KEdyYXBoaQogewogICAgIENvbnRleHRTaGFkb3cqIHNoYWRvdyA9
IGNvbnRleHQtPmNvbnRleHRTaGFkb3coKTsKICAgICBBU1NFUlQoc2hhZG93KTsKLSAgICBpZiAo
c2hhZG93LT5tX3R5cGUgPT0gQ29udGV4dFNoYWRvdzo6Tm9TaGFkb3cpCisgICAgaWYgKHNoYWRv
dy0+bV90eXBlID09IE5vU2hhZG93KQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBDYWxjdWxh
dGUgdGhlIGV4dGVudHMgb2YgdGhlIHJlbmRlcmVkIHNvbGlkIHBhdGhzLgpAQCAtODY4LDkgKzg2
OCw5IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdygKICAgICAgICAg
Ly8gTWVhbmluZyB0aGF0IHRoaXMgZ3JhcGhpY3MgY29udGV4dCBpcyBhc3NvY2lhdGVkIHdpdGgg
YSBDYW52YXNSZW5kZXJpbmdDb250ZXh0CiAgICAgICAgIC8vIFdlIGZsaXAgdGhlIGhlaWdodCBz
aW5jZSBDRyBhbmQgSFRNTDUgQ2FudmFzIGhhdmUgb3Bwb3NpdGUgWSBheGlzCiAgICAgICAgIG1f
c3RhdGUuc2hhZG93T2Zmc2V0ID0gRmxvYXRTaXplKHNpemUud2lkdGgoKSwgLXNpemUuaGVpZ2h0
KCkpOwotICAgICAgICBtX2RhdGEtPnNoYWRvdyA9IENvbnRleHRTaGFkb3coY29sb3IsIGJsdXIs
IEZsb2F0U2l6ZShzaXplLndpZHRoKCksIC1zaXplLmhlaWdodCgpKSk7CisgICAgICAgIG1fZGF0
YS0+c2hhZG93ID0gQ29udGV4dFNoYWRvdyhjb2xvciwgRmxvYXRTaXplKGJsdXIsIGJsdXIpLCBG
bG9hdFNpemUoc2l6ZS53aWR0aCgpLCAtc2l6ZS5oZWlnaHQoKSkpOwogICAgIH0gZWxzZQotICAg
ICAgICBtX2RhdGEtPnNoYWRvdyA9IENvbnRleHRTaGFkb3coY29sb3IsIGJsdXIsIEZsb2F0U2l6
ZShzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpKTsKKyAgICAgICAgbV9kYXRhLT5zaGFkb3cg
PSBDb250ZXh0U2hhZG93KGNvbG9yLCBGbG9hdFNpemUoYmx1ciwgYmx1ciksIEZsb2F0U2l6ZShz
aXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpKTsKIAogICAgIG1fZGF0YS0+c2hhZG93LnNldFNo
YWRvd3NJZ25vcmVUcmFuc2Zvcm1zKG1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMpOwog
fQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VDYWly
by5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vSW1hZ2VDYWlyby5jcHAJKHJldmlzaW9uIDc1ODc1KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2Fpcm8vSW1hZ2VDYWlyby5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEz
Nyw3ICsxMzcsNyBAQCB2b2lkIEJpdG1hcEltYWdlOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogCiAK
ICAgICBDb250ZXh0U2hhZG93KiBzaGFkb3cgPSBjb250ZXh0LT5jb250ZXh0U2hhZG93KCk7CiAg
ICAgQVNTRVJUKHNoYWRvdyk7Ci0gICAgaWYgKHNoYWRvdy0+bV90eXBlICE9IENvbnRleHRTaGFk
b3c6Ok5vU2hhZG93KSB7CisgICAgaWYgKHNoYWRvdy0+bV90eXBlICE9IE5vU2hhZG93KSB7CiAg
ICAgICAgIGNhaXJvX3QqIHNoYWRvd0NvbnRleHQgPSBzaGFkb3ctPmJlZ2luU2hhZG93TGF5ZXIo
Y29udGV4dCwgZHN0UmVjdCk7CiAgICAgICAgIGlmIChzaGFkb3dDb250ZXh0KSB7CiAgICAgICAg
ICAgICBjYWlyb190cmFuc2xhdGUoc2hhZG93Q29udGV4dCwgZHN0UmVjdC54KCksIGRzdFJlY3Qu
eSgpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9u
dFF0LmNwcAkocmV2aXNpb24gNzU4NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9Gb250UXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjYsNyArMTI2LDcgQEAgc3Rh
dGljIHZvaWQgZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250ZQogCiAgICAgICAgICAgICBDb250
ZXh0U2hhZG93KiBjdHhTaGFkb3cgPSBjdHgtPmNvbnRleHRTaGFkb3coKTsKIAotICAgICAgICAg
ICAgaWYgKGN0eFNoYWRvdy0+bV90eXBlICE9IENvbnRleHRTaGFkb3c6Ok5vU2hhZG93KSB7Cisg
ICAgICAgICAgICBpZiAoY3R4U2hhZG93LT5tX3R5cGUgIT0gTm9TaGFkb3cpIHsKICAgICAgICAg
ICAgICAgICBxcmVhbCBkeDEgPSAwLCBkeDIgPSAwLCBkeTEgPSAwLCBkeTIgPSAwOwogICAgICAg
ICAgICAgICAgIGlmIChjdHhTaGFkb3ctPm9mZnNldCgpLngoKSA+IDApCiAgICAgICAgICAgICAg
ICAgICAgIGR4MiA9IGN0eFNoYWRvdy0+b2Zmc2V0KCkueCgpOwpAQCAtMTM4LDEzICsxMzgsMTQg
QEAgc3RhdGljIHZvaWQgZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250ZQogICAgICAgICAgICAg
ICAgICAgICBkeTEgPSAtY3R4U2hhZG93LT5vZmZzZXQoKS55KCk7CiAgICAgICAgICAgICAgICAg
Ly8gZXhwYW5kIHRoZSBjbGlwIHJlY3QgdG8gaW5jbHVkZSB0aGUgdGV4dCBzaGFkb3cgYXMgd2Vs
bAogICAgICAgICAgICAgICAgIGNsaXAuYWRqdXN0KGR4MSwgZHgyLCBkeTEsIGR5Mik7Ci0gICAg
ICAgICAgICAgICAgY2xpcC5hZGp1c3QoLWN0eFNoYWRvdy0+bV9ibHVyRGlzdGFuY2UsIC1jdHhT
aGFkb3ctPm1fYmx1ckRpc3RhbmNlLCBjdHhTaGFkb3ctPm1fYmx1ckRpc3RhbmNlLCBjdHhTaGFk
b3ctPm1fYmx1ckRpc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBJbnRTaXplIGJsdXJEaXN0YW5j
ZShjdHhTaGFkb3ctPm1fYmx1ckRpc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBjbGlwLmFkanVz
dCgtYmx1ckRpc3RhbmNlLndpZHRoKCksIC1ibHVyRGlzdGFuY2UuaGVpZ2h0KCksIGJsdXJEaXN0
YW5jZS53aWR0aCgpLCBibHVyRGlzdGFuY2UuaGVpZ2h0KCkpOwogICAgICAgICAgICAgfQogICAg
ICAgICAgICAgcC0+c2F2ZSgpOwogICAgICAgICAgICAgcC0+c2V0Q2xpcFJlY3QoY2xpcC50b1Jl
Y3QoKSwgUXQ6OkludGVyc2VjdENsaXApOwogICAgICAgICAgICAgcHQuc2V0WShwdC55KCkgLSBh
c2NlbnQpOwogCi0gICAgICAgICAgICBpZiAoY3R4U2hhZG93LT5tX3R5cGUgIT0gQ29udGV4dFNo
YWRvdzo6Tm9TaGFkb3cpIHsKKyAgICAgICAgICAgIGlmIChjdHhTaGFkb3ctPm1fdHlwZSAhPSBO
b1NoYWRvdykgewogICAgICAgICAgICAgICAgIENvbnRleHRTaGFkb3cqIGN0eFNoYWRvdyA9IGN0
eC0+Y29udGV4dFNoYWRvdygpOwogICAgICAgICAgICAgICAgIGlmICghY3R4U2hhZG93LT5tdXN0
VXNlQ29udGV4dFNoYWRvdyhjdHgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHAtPnNhdmUoKTsK
QEAgLTE4OSw5ICsxOTAsOSBAQCBzdGF0aWMgdm9pZCBkcmF3VGV4dENvbW1vbihHcmFwaGljc0Nv
bnRlCiAgICAgICAgIHRleHRTdHJva2VQYXRoLmFkZFRleHQocHQsIGZvbnQsIHN0cmluZyk7CiAK
ICAgICBDb250ZXh0U2hhZG93KiBjdHhTaGFkb3cgPSBjdHgtPmNvbnRleHRTaGFkb3coKTsKLSAg
ICBpZiAoY3R4U2hhZG93LT5tX3R5cGUgIT0gQ29udGV4dFNoYWRvdzo6Tm9TaGFkb3cpIHsKKyAg
ICBpZiAoY3R4U2hhZG93LT5tX3R5cGUgIT0gTm9TaGFkb3cpIHsKICAgICAgICAgaWYgKGN0eC0+
dGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZUZpbGwpIHsKLSAgICAgICAgICAgIGlmIChjdHhT
aGFkb3ctPm1fdHlwZSAhPSBDb250ZXh0U2hhZG93OjpCbHVyU2hhZG93KSB7CisgICAgICAgICAg
ICBpZiAoY3R4U2hhZG93LT5tX3R5cGUgIT0gQmx1clNoYWRvdykgewogICAgICAgICAgICAgICAg
IHAtPnNhdmUoKTsKICAgICAgICAgICAgICAgICBwLT5zZXRQZW4oY3R4U2hhZG93LT5tX2NvbG9y
KTsKICAgICAgICAgICAgICAgICBwLT50cmFuc2xhdGUoY3R4U2hhZG93LT5vZmZzZXQoKSk7CkBA
IC0yMTQsNyArMjE1LDcgQEAgc3RhdGljIHZvaWQgZHJhd1RleHRDb21tb24oR3JhcGhpY3NDb250
ZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChj
dHgtPnRleHREcmF3aW5nTW9kZSgpICYgVGV4dE1vZGVTdHJva2UpIHsKLSAgICAgICAgICAgIGlm
IChjdHhTaGFkb3ctPm1fdHlwZSAhPSBDb250ZXh0U2hhZG93OjpCbHVyU2hhZG93KSB7CisgICAg
ICAgICAgICBpZiAoY3R4U2hhZG93LT5tX3R5cGUgIT0gQmx1clNoYWRvdykgewogICAgICAgICAg
ICAgICAgIHAtPnRyYW5zbGF0ZShjdHhTaGFkb3ctPm9mZnNldCgpKTsKICAgICAgICAgICAgICAg
ICBwLT5zdHJva2VQYXRoKHRleHRTdHJva2VQYXRoLCBRUGVuKGN0eFNoYWRvdy0+bV9jb2xvcikp
OwogICAgICAgICAgICAgICAgIHAtPnRyYW5zbGF0ZSgtY3R4U2hhZG93LT5vZmZzZXQoKSk7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRR
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
R3JhcGhpY3NDb250ZXh0UXQuY3BwCShyZXZpc2lvbiA3NTg3NSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzQ29udGV4dFF0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtOTAxLDkgKzkwMSw5IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNo
YWRvdygKICAgICAgICAgLy8gTWVhbmluZyB0aGF0IHRoaXMgZ3JhcGhpY3MgY29udGV4dCBpcyBh
c3NvY2lhdGVkIHdpdGggYSBDYW52YXNSZW5kZXJpbmdDb250ZXh0CiAgICAgICAgIC8vIFdlIGZs
aXAgdGhlIGhlaWdodCBzaW5jZSBDRyBhbmQgSFRNTDUgQ2FudmFzIGhhdmUgb3Bwb3NpdGUgWSBh
eGlzCiAgICAgICAgIG1fc3RhdGUuc2hhZG93T2Zmc2V0ID0gRmxvYXRTaXplKHNpemUud2lkdGgo
KSwgLXNpemUuaGVpZ2h0KCkpOwotICAgICAgICBtX2RhdGEtPnNoYWRvdyA9IENvbnRleHRTaGFk
b3coY29sb3IsIGJsdXIsIEZsb2F0U2l6ZShzaXplLndpZHRoKCksIC1zaXplLmhlaWdodCgpKSk7
CisgICAgICAgIG1fZGF0YS0+c2hhZG93ID0gQ29udGV4dFNoYWRvdyhjb2xvciwgRmxvYXRTaXpl
KGJsdXIsIGJsdXIpLCBGbG9hdFNpemUoc2l6ZS53aWR0aCgpLCAtc2l6ZS5oZWlnaHQoKSkpOwog
ICAgIH0gZWxzZQotICAgICAgICBtX2RhdGEtPnNoYWRvdyA9IENvbnRleHRTaGFkb3coY29sb3Is
IGJsdXIsIEZsb2F0U2l6ZShzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpKTsKKyAgICAgICAg
bV9kYXRhLT5zaGFkb3cgPSBDb250ZXh0U2hhZG93KGNvbG9yLCBGbG9hdFNpemUoYmx1ciwgYmx1
ciksIEZsb2F0U2l6ZShzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpKTsKIAogICAgIG1fZGF0
YS0+c2hhZG93LnNldFNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKG1fc3RhdGUuc2hhZG93c0lnbm9y
ZVRyYW5zZm9ybXMpOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
cXQvSW1hZ2VRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvcXQvSW1hZ2VRdC5jcHAJKHJldmlzaW9uIDc1ODc1KQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvSW1hZ2VRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxMiw3
ICsyMTIsNyBAQCB2b2lkIEJpdG1hcEltYWdlOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogCiAgICAg
cGFpbnRlci0+c2V0Q29tcG9zaXRpb25Nb2RlKGNvbXBvc2l0aW9uTW9kZSk7CiAKICAgICBDb250
ZXh0U2hhZG93KiBzaGFkb3cgPSBjdHh0LT5jb250ZXh0U2hhZG93KCk7Ci0gICAgaWYgKHNoYWRv
dy0+bV90eXBlICE9IENvbnRleHRTaGFkb3c6Ok5vU2hhZG93KSB7CisgICAgaWYgKHNoYWRvdy0+
bV90eXBlICE9IE5vU2hhZG93KSB7CiAgICAgICAgIFFQYWludGVyKiBzaGFkb3dQYWludGVyID0g
c2hhZG93LT5iZWdpblNoYWRvd0xheWVyKGN0eHQsIG5vcm1hbGl6ZWREc3QpOwogICAgICAgICBp
ZiAoc2hhZG93UGFpbnRlcikgewogICAgICAgICAgICAgc2hhZG93UGFpbnRlci0+c2V0T3BhY2l0
eShzdGF0aWNfY2FzdDxxcmVhbD4oc2hhZG93LT5tX2NvbG9yLmFscGhhKCkpIC8gMjU1KTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L1N0aWxsSW1hZ2VRdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU3RpbGxJ
bWFnZVF0LmNwcAkocmV2aXNpb24gNzU4NzUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9xdC9TdGlsbEltYWdlUXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03NSw3ICs3NSw3
IEBAIHZvaWQgU3RpbGxJbWFnZTo6ZHJhdyhHcmFwaGljc0NvbnRleHQqIGMKICAgICBjdHh0LT5z
ZXRDb21wb3NpdGVPcGVyYXRpb24ob3ApOwogCiAgICAgQ29udGV4dFNoYWRvdyogc2hhZG93ID0g
Y3R4dC0+Y29udGV4dFNoYWRvdygpOwotICAgIGlmIChzaGFkb3ctPm1fdHlwZSAhPSBDb250ZXh0
U2hhZG93OjpOb1NoYWRvdykgeworICAgIGlmIChzaGFkb3ctPm1fdHlwZSAhPSBOb1NoYWRvdykg
ewogICAgICAgICBRUGFpbnRlciogc2hhZG93UGFpbnRlciA9IHNoYWRvdy0+YmVnaW5TaGFkb3dM
YXllcihjdHh0LCBub3JtYWxpemVkRHN0KTsKICAgICAgICAgaWYgKHNoYWRvd1BhaW50ZXIpIHsK
ICAgICAgICAgICAgIHNoYWRvd1BhaW50ZXItPnNldE9wYWNpdHkoc3RhdGljX2Nhc3Q8cXJlYWw+
KHNoYWRvdy0+bV9jb2xvci5hbHBoYSgpKSAvIDI1NSk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80605</attachid>
            <date>2011-01-30 15:55:04 -0800</date>
            <delta_ts>2011-01-30 16:36:55 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51312-20110130155502.patch</filename>
            <type>text/plain</type>
            <size>38502</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA3N2ZjMmEwMjI3YjNjZjhmNWRmNDU1OTU1MWY4ZGNmOTc0MmMzMmQxLi45
YzlkNWM2NWI1Y2FhY2JhYzIzODVkYTY4OWU2MDhlNGZmYmY1NzIzIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsNDYgQEAKKzIwMTEtMDEtMzAgIFNpbW9uIEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBs
ZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
TWFrZSBDb250ZXh0U2hhZG93IGNvZGUgY3Jvc3MtcGxhdGZvcm0KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMzEyCisKKyAgICAgICAgQWRkIGEgbmV3
IGNsYXNzLCBTaGFkb3dCbHVyLCB0aGF0IGNvbnRhaW5zIG1vc3Qgb2YgdGhlCisgICAgICAgIGNv
ZGUgZnJvbSBDb250ZXh0U2hhZG93LCBidXQgaXMgZnVsbHkgY3Jvc3MtcGxhdGZvcm0uCisgICAg
ICAgIEl0IGRlcGVuZHMgb24gb25lIG5ldyBtZXRob2QsIEdyYXBoaWNzQ29udGV4dDo6Y2xpcEJv
dW5kcygpLAorICAgICAgICB3aGljaCBwbGF0Zm9ybXMgd2lsbCBoYXZlIHRvIGltcGxlbWVudC4K
KyAgICAgICAgCisgICAgICAgIEFkZCBTaGFkb3dCbHVyIHRvIHRoZSBNYWMgWGNvZGUgcHJvamVj
dCwgYnV0IGRvbid0IHVzZSBpdAorICAgICAgICBhbnl3aGVyZSB5ZXQuCisKKyAgICAgICAgKiBX
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDo6Y2xpcEJvdW5kcyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3ND
b250ZXh0Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvU2hhZG93Qmx1ci5jcHA6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6cm91bmRVcFRvTXVsdGlwbGVPZjMyKToKKyAgICAgICAg
KFdlYkNvcmU6OlNjcmF0Y2hCdWZmZXI6OlNjcmF0Y2hCdWZmZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6U2NyYXRjaEJ1ZmZlcjo6Z2V0U2NyYXRjaEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpT
Y3JhdGNoQnVmZmVyOjpzY2hlZHVsZVNjcmF0Y2hCdWZmZXJQdXJnZSk6CisgICAgICAgIChXZWJD
b3JlOjpTY3JhdGNoQnVmZmVyOjp0aW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcmF0
Y2hCdWZmZXI6OmNsZWFyU2NyYXRjaEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpTY3JhdGNo
QnVmZmVyOjpzaGFyZWQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93Qmx1cjo6U2hhZG93Qmx1
cik6CisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpibHVyTGF5ZXJJbWFnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjphZGp1c3RCbHVyRGlzdGFuY2UpOgorICAgICAgICAo
V2ViQ29yZTo6U2hhZG93Qmx1cjo6Y2FsY3VsYXRlTGF5ZXJCb3VuZGluZ1JlY3QpOgorICAgICAg
ICAoV2ViQ29yZTo6U2hhZG93Qmx1cjo6YmVnaW5TaGFkb3dMYXllcik6CisgICAgICAgIChXZWJD
b3JlOjpTaGFkb3dCbHVyOjplbmRTaGFkb3dMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpTaGFk
b3dCbHVyOjpkcmF3UmVjdFNoYWRvdyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpk
cmF3UmVjdFNoYWRvd1dpdGhvdXRUaWxpbmcpOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93Qmx1
cjo6ZHJhd1JlY3RTaGFkb3dXaXRoVGlsaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYWRvd0Js
dXI6OmNsaXBCb3VuZHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1NoYWRvd0JsdXIu
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpzZXRTaGFkb3dzSWdub3Jl
VHJhbnNmb3Jtcyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpzaGFkb3dzSWdub3Jl
VHJhbnNmb3Jtcyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250
ZXh0Q0cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwQm91bmRz
KToKKwogMjAxMS0wMS0yOSAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4K
IAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDJkZjE5M2EzOWFhMjk2
ZDNjYTA1YWQ0ZmM4NTE4ZTk1ZDg4YTE0N2IuLjk4YWE0Yzc1NzUwZjdlZTgzNTE3YTg4NzdlMGU1
NmI2ZTJhOTMwMjQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKQEAgLTI1NCw2ICsyNTQsOCBAQAogCQkwQzQ1MzQyODEwQ0RCQkZBMDA4
NjkxNTcgLyogSlNXZWJHTFVuaWZvcm1Mb2NhdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM0NTM0MjYxMENEQkJGQTAwODY5MTU3IC8qIEpTV2Vi
R0xVbmlmb3JtTG9jYXRpb24uaCAqLzsgfTsKIAkJMEYxMUE1NEYwRjM5MjMzMTAwQzM3ODg0IC8q
IFJlbmRlclNlbGVjdGlvbkluZm8uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGMTFBNTRFMEYzOTIzMzEwMEMzNzg4NCAvKiBSZW5kZXJTZWxlY3Rpb25J
bmZvLmggKi87IH07CiAJCTBGMTVEQThBMEYzQUFFRTcwMDAwQ0U0NyAvKiBBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMEYxNURBODkwRjNBQUVFNzAwMDBDRTQ3IC8qIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2
YXRlLmggKi87IH07CisJCTBGM0RENDRGMTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVyLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGM0RENDRE
MTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVyLmNwcCAqLzsgfTsKKwkJMEYzREQ0NTAxMkY1
RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDBGM0RENDRFMTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVy
LmggKi87IH07CiAJCTBGNTAwQUFGMEY1NERCMUIwMEVFRjkyOCAvKiBUcmFuc2Zvcm1TdGF0ZS5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1MDBBQUUw
RjU0REIxQjAwRUVGOTI4IC8qIFRyYW5zZm9ybVN0YXRlLmggKi87IH07CiAJCTBGNTAwQUIxMEY1
NERCMzEwMEVFRjkyOCAvKiBUcmFuc2Zvcm1TdGF0ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjUwMEFCMDBGNTREQjMxMDBFRUY5MjggLyogVHJh
bnNmb3JtU3RhdGUuY3BwICovOyB9OwogCQkwRjU2MDI4RjBFNEI3NjU4MDA2NUIwMzggLyogUmVu
ZGVyTWFycXVlZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY1NjAyOEQwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuaCAqLzsgfTsKQEAg
LTY1NjgsNiArNjU3MCw4IEBACiAJCTBDNDUzNDI2MTBDREJCRkEwMDg2OTE1NyAvKiBKU1dlYkdM
VW5pZm9ybUxvY2F0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTV2Vi
R0xVbmlmb3JtTG9jYXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEYxMUE1
NEUwRjM5MjMzMTAwQzM3ODg0IC8qIFJlbmRlclNlbGVjdGlvbkluZm8uaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyU2VsZWN0aW9uSW5mby5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQkwRjE1REE4OTBGM0FBRUU3MDAwMENFNDcgLyogQW5pbWF0aW9uQ29u
dHJvbGxlclByaXZhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQW5pbWF0
aW9uQ29udHJvbGxlclByaXZhdGUuaDsgcGF0aCA9IGFuaW1hdGlvbi9BbmltYXRpb25Db250cm9s
bGVyUHJpdmF0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjNERDQ0RDEyRjVF
QTFCMDAwRDkxOTAgLyogU2hhZG93Qmx1ci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBTaGFkb3dCbHVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MEYzREQ0NEUxMkY1RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gU2hhZG93Qmx1ci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkwRjUwMEFBRTBGNTREQjFCMDBFRUY5MjggLyogVHJhbnNmb3JtU3RhdGUuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHJhbnNmb3JtU3RhdGUuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJMEY1MDBBQjAwRjU0REIzMTAwRUVGOTI4IC8qIFRyYW5zZm9ybVN0
YXRlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFRyYW5zZm9ybVN0
YXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY1NjAyOEQwRTRCNzY1ODAw
NjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gUmVuZGVyTWFycXVlZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTc1Mzcs
NiArMTc1NDEsOCBAQAogCQkJCUE3M0Y5NUZEMTJDOTdCRkUwMDMxQUFGOSAvKiBSb3VuZGVkSW50
UmVjdC5oICovLAogCQkJCTM3MUY0RkZCMEQyNUU3RjMwMEVDRTBENSAvKiBTZWdtZW50ZWRGb250
RGF0YS5jcHAgKi8sCiAJCQkJMzcxRjRGRkEwRDI1RTdGMzAwRUNFMEQ1IC8qIFNlZ21lbnRlZEZv
bnREYXRhLmggKi8sCisJCQkJMEYzREQ0NEQxMkY1RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIu
Y3BwICovLAorCQkJCTBGM0RENDRFMTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVyLmggKi8s
CiAJCQkJQjJDM0RBNTMwRDAwNkNENjAwRUY2RjI2IC8qIFNpbXBsZUZvbnREYXRhLmNwcCAqLywK
IAkJCQlCMkMzREE1NDBEMDA2Q0Q2MDBFRjZGMjYgLyogU2ltcGxlRm9udERhdGEuaCAqLywKIAkJ
CQlCMjM1NDBGMDBEMDA3ODJFMDAyMzgyRkEgLyogU3RyaW5nVHJ1bmNhdG9yLmNwcCAqLywKQEAg
LTIyNDUxLDYgKzIyNDU3LDcgQEAKIAkJCQlFMTM0RjVBQjEyRUUzNDNGMDA0RUM1OEQgLyogSW50
UmVjdEhhc2guaCBpbiBIZWFkZXJzICovLAogCQkJCTk3N0UyRENFMTJGMEUyODMwMEMxMzM3OSAv
KiBIVE1MU291cmNlVHJhY2tlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTc3RTJFMEYxMkYwRkM5
QzAwQzEzMzc5IC8qIFhTU0ZpbHRlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMEYzREQ0NTAxMkY1
RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1
bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjUxNDgsNiAr
MjUxNTUsNyBAQAogCQkJCTRGMkQyMDU1MTJFQUU3QjMwMDVDMjg3NCAvKiBJbnNwZWN0b3JBZ2Vu
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzdFMkRDRDEyRjBFMjgzMDBDMTMzNzkgLyogSFRN
TFNvdXJjZVRyYWNrZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTc3RTJFMEUxMkYwRkM5QzAw
QzEzMzc5IC8qIFhTU0ZpbHRlci5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwRjNERDQ0RjEyRjVF
QTFCMDAwRDkxOTAgLyogU2hhZG93Qmx1ci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQly
dW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCmluZGV4
IGUwNWE1NzgxNWY3YTE1N2RiMjIwYzhkM2U5ZDNiOWZkOGY3YjE0NDguLjViMDBlMjUwNDY2YTAz
NGU0N2Q3YTA3ZTMwZDJmOTUxNTJiNjUxY2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcApAQCAtNTY1LDYgKzU2NSwxNCBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFRvSW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXIqIGJ1
ZmZlciwgY29uc3QgRmxvYXRSZWN0JiByZQogICAgIGJ1ZmZlci0+Y2xpcCh0aGlzLCByZWN0KTsK
IH0KIAorI2lmICFQTEFURk9STShDRykKK0ludFJlY3QgR3JhcGhpY3NDb250ZXh0OjpjbGlwQm91
bmRzKCkgY29uc3QKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gSW50
UmVjdCgpOworfQorI2VuZGlmCisKIFRleHREcmF3aW5nTW9kZUZsYWdzIEdyYXBoaWNzQ29udGV4
dDo6dGV4dERyYXdpbmdNb2RlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9zdGF0ZS50ZXh0RHJh
d2luZ01vZGU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzQ29udGV4dC5oCmluZGV4IDZjOWEyZjY0YjA1MDUwM2ZmMTNhMzZlZTIxZTkwMjk1YTA1MjIw
OGYuLmMwMThkNjdiZTYyODE4OWQzOGEwZWU4ZDU5MGEwYjJhODhlN2FkZWUgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCkBAIC0z
MjAsNiArMzIwLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2b2lkIGNsaXBQYXRo
KGNvbnN0IFBhdGgmLCBXaW5kUnVsZSk7CiAgICAgICAgIHZvaWQgY2xpcENvbnZleFBvbHlnb24o
c2l6ZV90IG51bVBvaW50cywgY29uc3QgRmxvYXRQb2ludCosIGJvb2wgYW50aWFsaWFzID0gdHJ1
ZSk7CiAgICAgICAgIHZvaWQgY2xpcFRvSW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXIqLCBjb25zdCBG
bG9hdFJlY3QmKTsKKyAgICAgICAgCisgICAgICAgIEludFJlY3QgY2xpcEJvdW5kcygpIGNvbnN0
OwogCiAgICAgICAgIFRleHREcmF3aW5nTW9kZUZsYWdzIHRleHREcmF3aW5nTW9kZSgpIGNvbnN0
OwogICAgICAgICB2b2lkIHNldFRleHREcmF3aW5nTW9kZShUZXh0RHJhd2luZ01vZGVGbGFncyk7
CkBAIC0zNzMsNyArMzc1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgICAgICAgIC8vIFRo
aXMgY2xpcCBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgYnkgPGNhbnZhcz4gY29kZS4gSXQgYWxsb3dz
CiAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyB0byBoYW5kbGUgY2xpcHBpbmcgb24gdGhlIGNh
bnZhcyBkaWZmZXJlbnRseSBzaW5jZQotICAgICAgICAvLyB0aGUgZGlzaXBsaW5lIGlzIGRpZmZl
cmVudC4KKyAgICAgICAgLy8gdGhlIGRpc2NpcGxpbmUgaXMgZGlmZmVyZW50LgogICAgICAgICB2
b2lkIGNhbnZhc0NsaXAoY29uc3QgUGF0aCYpOwogICAgICAgICB2b2lkIGNsaXBPdXQoY29uc3Qg
UGF0aCYpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9T
aGFkb3dCbHVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NoYWRvd0Js
dXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjljZjlhZmNlMDQzODJhOWJjMmMyYmFiYTNkYjRjMDA5MTY4YTFh
OGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9T
aGFkb3dCbHVyLmNwcApAQCAtMCwwICsxLDU3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MSBBcHBsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2VuY2hhLCBJbmMuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYWRvd0JsdXIuaCIKKworI2luY2x1ZGUgIkFmZmlu
ZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkZsb2F0UXVhZC5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCisjaW5jbHVkZSAiVGltZXIuaCIK
KyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5o
PgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyBpbmxpbmUgaW50IHJvdW5kVXBUb011bHRpcGxlT2YzMihpbnQgZCkKK3sKKyAgICByZXR1cm4g
KDEgKyAoZCA+PiA1KSkgPDwgNTsKK30KKworLy8gU2hhZG93Qmx1ciBuZWVkcyBhIHNjcmF0Y2gg
aW1hZ2UgYXMgdGhlIGJ1ZmZlciBmb3IgdGhlIGJsdXIgZmlsdGVyLgorLy8gSW5zdGVhZCBvZiBj
cmVhdGluZyBhbmQgZGVzdHJveWluZyB0aGUgYnVmZmVyIGZvciBldmVyeSBvcGVyYXRpb24sCisv
LyB3ZSBjcmVhdGUgYSBidWZmZXIgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHB1cmdlZCB2
aWEgYSB0aW1lci4KK2NsYXNzIFNjcmF0Y2hCdWZmZXIgeworcHVibGljOgorICAgIFNjcmF0Y2hC
dWZmZXIoKQorICAgICAgICA6IG1fcHVyZ2VUaW1lcih0aGlzLCAmU2NyYXRjaEJ1ZmZlcjo6dGlt
ZXJGaXJlZCkKKyAgICB7CisgICAgfQorICAgIAorICAgIEltYWdlQnVmZmVyKiBnZXRTY3JhdGNo
QnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUpCisgICAgeworICAgICAgICAvLyBXZSBkbyBub3Qg
bmVlZCB0byByZWNyZWF0ZSB0aGUgYnVmZmVyIGlmIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBsYXJn
ZSBlbm91Z2guCisgICAgICAgIGlmIChtX2ltYWdlQnVmZmVyICYmIG1faW1hZ2VCdWZmZXItPndp
ZHRoKCkgPj0gc2l6ZS53aWR0aCgpICYmIG1faW1hZ2VCdWZmZXItPmhlaWdodCgpID49IHNpemUu
aGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1cm4gbV9pbWFnZUJ1ZmZlci5nZXQoKTsKKworICAg
ICAgICAvLyBSb3VuZCB0byB0aGUgbmVhcmVzdCAzMiBwaXhlbHMgc28gd2UgZG8gbm90IGdyb3cg
dGhlIGJ1ZmZlciBmb3Igc2ltaWxhciBzaXplZCByZXF1ZXN0cy4KKyAgICAgICAgSW50U2l6ZSBy
b3VuZGVkU2l6ZShyb3VuZFVwVG9NdWx0aXBsZU9mMzIoc2l6ZS53aWR0aCgpKSwgcm91bmRVcFRv
TXVsdGlwbGVPZjMyKHNpemUuaGVpZ2h0KCkpKTsKKworICAgICAgICBtX2ltYWdlQnVmZmVyID0g
SW1hZ2VCdWZmZXI6OmNyZWF0ZShyb3VuZGVkU2l6ZSk7CisgICAgICAgIHJldHVybiBtX2ltYWdl
QnVmZmVyLmdldCgpOworICAgIH0KKworICAgIHZvaWQgc2NoZWR1bGVTY3JhdGNoQnVmZmVyUHVy
Z2UoKQorICAgIHsKKyAgICAgICAgaWYgKG1fcHVyZ2VUaW1lci5pc0FjdGl2ZSgpKQorICAgICAg
ICAgICAgbV9wdXJnZVRpbWVyLnN0b3AoKTsKKworICAgICAgICBjb25zdCBkb3VibGUgc2NyYXRj
aEJ1ZmZlclB1cmdlSW50ZXJ2YWwgPSAyOworICAgICAgICBtX3B1cmdlVGltZXIuc3RhcnRPbmVT
aG90KHNjcmF0Y2hCdWZmZXJQdXJnZUludGVydmFsKTsKKyAgICB9CisgICAgCisgICAgc3RhdGlj
IFNjcmF0Y2hCdWZmZXImIHNoYXJlZCgpOworCitwcml2YXRlOgorICAgIHZvaWQgdGltZXJGaXJl
ZChUaW1lcjxTY3JhdGNoQnVmZmVyPiopCisgICAgeworICAgICAgICBjbGVhclNjcmF0Y2hCdWZm
ZXIoKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBjbGVhclNjcmF0Y2hCdWZmZXIoKQorICAgIHsK
KyAgICAgICAgbV9pbWFnZUJ1ZmZlciA9IDA7CisgICAgfQorCisgICAgT3duUHRyPEltYWdlQnVm
ZmVyPiBtX2ltYWdlQnVmZmVyOworICAgIFRpbWVyPFNjcmF0Y2hCdWZmZXI+IG1fcHVyZ2VUaW1l
cjsKK307CisKK1NjcmF0Y2hCdWZmZXImIFNjcmF0Y2hCdWZmZXI6OnNoYXJlZCgpCit7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChTY3JhdGNoQnVmZmVyLCBzY3JhdGNoQnVmZmVyLCAoKSk7Cisg
ICAgcmV0dXJuIHNjcmF0Y2hCdWZmZXI7Cit9CisKK1NoYWRvd0JsdXI6OlNoYWRvd0JsdXIoZmxv
YXQgcmFkaXVzLCBjb25zdCBGbG9hdFNpemUmIG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yLCBD
b2xvclNwYWNlIGNvbG9yU3BhY2UpCisgICAgOiBtX2NvbG9yKGNvbG9yKQorICAgICwgbV9jb2xv
clNwYWNlKGNvbG9yU3BhY2UpCisgICAgLCBtX2JsdXJSYWRpdXMocmFkaXVzKQorICAgICwgbV9v
ZmZzZXQob2Zmc2V0KQorICAgICwgbV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcyhmYWxzZSkKK3sK
KyAgICAvLyBTZWUgY29tbWVudHMgaW4gaHR0cDovL3dlYmtpdC5vcmcvYi80MDc5MywgaXQgc2Vl
bXMgc2Vuc2libGUKKyAgICAvLyB0byBmb2xsb3cgU2tpYSdzIGxpbWl0IG9mIDEyOCBwaXhlbHMg
b2YgYmx1ciByYWRpdXMKKyAgICBtX2JsdXJSYWRpdXMgPSBtaW48ZmxvYXQ+KG1fYmx1clJhZGl1
cywgMTI4KTsKKworICAgIC8vIFRoZSB0eXBlIG9mIHNoYWRvdyBpcyBkZWNpZGVkIGJ5IHRoZSBi
bHVyIHJhZGl1cywgc2hhZG93IG9mZnNldCwgYW5kIHNoYWRvdyBjb2xvci4KKyAgICBpZiAoIW1f
Y29sb3IuaXNWYWxpZCgpIHx8ICFjb2xvci5hbHBoYSgpKSB7CisgICAgICAgIC8vIENhbid0IHBh
aW50IHRoZSBzaGFkb3cgd2l0aCBpbnZhbGlkIG9yIGludmlzaWJsZSBjb2xvci4KKyAgICAgICAg
bV90eXBlID0gTm9TaGFkb3c7CisgICAgfSBlbHNlIGlmIChyYWRpdXMgPiAwKSB7CisgICAgICAg
IC8vIFNoYWRvdyBpcyBhbHdheXMgYmx1cnJlZCwgZXZlbiB0aGUgb2Zmc2V0IGlzIHplcm8uCisg
ICAgICAgIG1fdHlwZSA9IEJsdXJTaGFkb3c7CisgICAgfSBlbHNlIGlmICghbV9vZmZzZXQud2lk
dGgoKSAmJiAhbV9vZmZzZXQuaGVpZ2h0KCkpIHsKKyAgICAgICAgLy8gV2l0aG91dCBibHVyIGFu
ZCB6ZXJvIG9mZnNldCBtZWFucyB0aGUgc2hhZG93IGlzIGZ1bGx5IGhpZGRlbi4KKyAgICAgICAg
bV90eXBlID0gTm9TaGFkb3c7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV90eXBlID0gU29saWRT
aGFkb3c7CisgICAgfQorfQorCisvLyBJbnN0ZWFkIG9mIGludGVnZXIgZGl2aXNpb24sIHdlIHVz
ZSAxNy4xNSBmb3IgZml4ZWQtcG9pbnQgZGl2aXNpb24uCitzdGF0aWMgY29uc3QgaW50IEJsdXJT
dW1TaGlmdCA9IDE1Oworc3RhdGljIGNvbnN0IGZsb2F0IEdhdXNzaWFuS2VybmVsRmFjdG9yID0g
MyAvIDQuZiAqIHNxcnRmKDIgKiBwaUZsb2F0KTsKKworLy8gQ2hlY2sgaHR0cDovL3d3dy53My5v
cmcvVFIvU1ZHL2ZpbHRlcnMuaHRtbCNmZUdhdXNzaWFuQmx1ci4KKy8vIEFzIG5vdGVkIGluIHRo
ZSBTVkcgZmlsdGVyIHNwZWNpZmljYXRpb24sIHJ1bm5pbmcgYm94IGJsdXIgM3gKKy8vIGFwcHJv
eGltYXRlcyBhIHJlYWwgZ2F1c3NpYW4gYmx1ciBuaWNlbHkuCisKK3ZvaWQgU2hhZG93Qmx1cjo6
Ymx1ckxheWVySW1hZ2UodW5zaWduZWQgY2hhciogaW1hZ2VEYXRhLCBjb25zdCBJbnRTaXplJiBz
aXplLCBpbnQgcm93U3RyaWRlKQoreworI2lmIENQVShCSUdfRU5ESUFOKQorICAgIGNvbnN0IGlu
dCBjaGFubmVsc1s0XSA9IHsgMCwgMywgMiwgMCB9OworI2VsaWYgQ1BVKE1JRERMRV9FTkRJQU4p
CisgICAgY29uc3QgaW50IGNoYW5uZWxzWzRdID0geyAxLCAyLCAzLCAxIH07CisjZWxzZQorICAg
IGNvbnN0IGludCBjaGFubmVsc1s0XSA9IHsgMywgMCwgMSwgMyB9OworI2VuZGlmCisKKyAgICBp
bnQgZDsKKyAgICBpZiAobV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcykKKyAgICAgICAgZCA9IG1h
eCgyLCBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZigoMiAvIDMuZikgKiBtX2JsdXJSYWRpdXMpKSk7
IC8vIENhbnZhcyBzaGFkb3cuIEZJWE1FOiB3ZSBzaG91bGQgYWRqdXN0IHRoZSBibHVyIHJhZGl1
cyBoaWdoZXIgdXAuCisgICAgZWxzZQorICAgICAgICBkID0gbWF4KDIsIHN0YXRpY19jYXN0PGlu
dD4oZmxvb3JmKG1fYmx1clJhZGl1cyAvIDIgKiBHYXVzc2lhbktlcm5lbEZhY3RvciArIDAuNWYp
KSk7IC8vIENTUworCisgICAgaW50IGRtYXggPSBkID4+IDE7CisgICAgaW50IGRtaW4gPSBkbWF4
IC0gMSArIChkICYgMSk7CisgICAgaWYgKGRtaW4gPCAwKQorICAgICAgICBkbWluID0gMDsKKwor
ICAgIC8vIFR3byBzdGFnZXM6IGhvcml6b250YWwgYW5kIHZlcnRpY2FsCisgICAgZm9yIChpbnQg
ayA9IDA7IGsgPCAyOyArK2spIHsKKworICAgICAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbHMgPSBp
bWFnZURhdGE7CisgICAgICAgIGludCBzdHJpZGUgPSAoIWspID8gNCA6IHJvd1N0cmlkZTsKKyAg
ICAgICAgaW50IGRlbHRhID0gKCFrKSA/IHJvd1N0cmlkZSA6IDQ7CisgICAgICAgIGludCBqZmlu
YWwgPSAoIWspID8gc2l6ZS5oZWlnaHQoKSA6IHNpemUud2lkdGgoKTsKKyAgICAgICAgaW50IGRp
bSA9ICghaykgPyBzaXplLndpZHRoKCkgOiBzaXplLmhlaWdodCgpOworCisgICAgICAgIGZvciAo
aW50IGogPSAwOyBqIDwgamZpbmFsOyArK2osIHBpeGVscyArPSBkZWx0YSkgeworCisgICAgICAg
ICAgICAvLyBGb3IgZWFjaCBzdGVwLCB3ZSBibHVyIHRoZSBhbHBoYSBpbiBhIGNoYW5uZWwgYW5k
IHN0b3JlIHRoZSByZXN1bHQKKyAgICAgICAgICAgIC8vIGluIGFub3RoZXIgY2hhbm5lbCBmb3Ig
dGhlIHN1YnNlcXVlbnQgc3RlcC4KKyAgICAgICAgICAgIC8vIFdlIHVzZSBzbGlkaW5nIHdpbmRv
dyBhbGdvcml0aG0gdG8gYWNjdW11bGF0ZSB0aGUgYWxwaGEgdmFsdWVzLgorICAgICAgICAgICAg
Ly8gVGhpcyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gY29tcHV0aW5nIHRoZSBzdW0gb2Yg
ZWFjaCBwaXhlbHMKKyAgICAgICAgICAgIC8vIGNvdmVyZWQgYnkgdGhlIGJveCBrZXJuZWwgc2l6
ZSBmb3IgZWFjaCB4LgorCisgICAgICAgICAgICBmb3IgKGludCBzdGVwID0gMDsgc3RlcCA8IDM7
ICsrc3RlcCkgeworICAgICAgICAgICAgICAgIGludCBzaWRlMSA9ICghc3RlcCkgPyBkbWluIDog
ZG1heDsKKyAgICAgICAgICAgICAgICBpbnQgc2lkZTIgPSAoc3RlcCA9PSAxKSA/IGRtaW4gOiBk
bWF4OworICAgICAgICAgICAgICAgIGludCBwaXhlbENvdW50ID0gc2lkZTEgKyAxICsgc2lkZTI7
CisgICAgICAgICAgICAgICAgaW50IGludkNvdW50ID0gKCgxIDw8IEJsdXJTdW1TaGlmdCkgKyBw
aXhlbENvdW50IC0gMSkgLyBwaXhlbENvdW50OworICAgICAgICAgICAgICAgIGludCBvZnMgPSAx
ICsgc2lkZTI7CisgICAgICAgICAgICAgICAgaW50IGFscGhhMSA9IHBpeGVsc1tjaGFubmVsc1tz
dGVwXV07CisgICAgICAgICAgICAgICAgaW50IGFscGhhMiA9IHBpeGVsc1soZGltIC0gMSkgKiBz
dHJpZGUgKyBjaGFubmVsc1tzdGVwXV07CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciog
cHRyID0gcGl4ZWxzICsgY2hhbm5lbHNbc3RlcCArIDFdOworICAgICAgICAgICAgICAgIHVuc2ln
bmVkIGNoYXIqIHByZXYgPSBwaXhlbHMgKyBzdHJpZGUgKyBjaGFubmVsc1tzdGVwXTsKKyAgICAg
ICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBuZXh0ID0gcGl4ZWxzICsgb2ZzICogc3RyaWRlICsg
Y2hhbm5lbHNbc3RlcF07CisKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAg
ICBpbnQgc3VtID0gc2lkZTEgKiBhbHBoYTEgKyBhbHBoYTE7CisgICAgICAgICAgICAgICAgaW50
IGxpbWl0ID0gKGRpbSA8IHNpZGUyICsgMSkgPyBkaW0gOiBzaWRlMiArIDE7CisgICAgICAgICAg
ICAgICAgZm9yIChpID0gMTsgaSA8IGxpbWl0OyArK2ksIHByZXYgKz0gc3RyaWRlKQorICAgICAg
ICAgICAgICAgICAgICBzdW0gKz0gKnByZXY7CisgICAgICAgICAgICAgICAgaWYgKGxpbWl0IDw9
IHNpZGUyKQorICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKHNpZGUyIC0gbGltaXQgKyAxKSAq
IGFscGhhMjsKKworICAgICAgICAgICAgICAgIGxpbWl0ID0gKHNpZGUxIDwgZGltKSA/IHNpZGUx
IDogZGltOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgcHRyICs9IHN0
cmlkZSwgbmV4dCArPSBzdHJpZGUsICsraSwgKytvZnMpIHsKKyAgICAgICAgICAgICAgICAgICAg
KnB0ciA9IChzdW0gKiBpbnZDb3VudCkgPj4gQmx1clN1bVNoaWZ0OworICAgICAgICAgICAgICAg
ICAgICBzdW0gKz0gKChvZnMgPCBkaW0pID8gKm5leHQgOiBhbHBoYTIpIC0gYWxwaGExOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2ID0gcGl4ZWxzICsgY2hhbm5lbHNb
c3RlcF07CisgICAgICAgICAgICAgICAgZm9yICg7IG9mcyA8IGRpbTsgcHRyICs9IHN0cmlkZSwg
cHJldiArPSBzdHJpZGUsIG5leHQgKz0gc3RyaWRlLCArK2ksICsrb2ZzKSB7CisgICAgICAgICAg
ICAgICAgICAgICpwdHIgPSAoc3VtICogaW52Q291bnQpID4+IEJsdXJTdW1TaGlmdDsKKyAgICAg
ICAgICAgICAgICAgICAgc3VtICs9ICgqbmV4dCkgLSAoKnByZXYpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGRpbTsgcHRyICs9IHN0cmlkZSwgcHJldiAr
PSBzdHJpZGUsICsraSkgeworICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHN1bSAqIGludkNv
dW50KSA+PiBCbHVyU3VtU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBhbHBoYTIg
LSAoKnByZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBTaGFkb3dCbHVyOjphZGp1c3RCbHVyRGlzdGFuY2UoR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0KQoreworICAgIGlmICghbV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcykK
KyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9
IGNvbnRleHQtPmdldENUTSgpOworCisgICAgLy8gQWRqdXN0IGJsdXIgaWYgd2UncmUgc2NhbGlu
Zywgc2luY2UgdGhlIHJhZGl1cyBtdXN0IG5vdCBiZSBhZmZlY3RlZCBieSB0cmFuc2Zvcm1hdGlv
bnMuCisgICAgLy8gRklYTUU6IHVzZSBBZmZpbmVUcmFuc2Zvcm06OmlzSWRlbnRpdHlPclRyYW5z
bGF0aW9uT3JGbGlwcGVkKCk/CisgICAgaWYgKHRyYW5zZm9ybS5pc0lkZW50aXR5KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIENhbGN1bGF0ZSB0cmFuc2Zvcm1lZCB1bml0IHZlY3RvcnMu
CisgICAgY29uc3QgRmxvYXRRdWFkIHVuaXRRdWFkKEZsb2F0UG9pbnQoMCwgMCksIEZsb2F0UG9p
bnQoMSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0UG9pbnQoMCwgMSks
IEZsb2F0UG9pbnQoMSwgMSkpOworICAgIGNvbnN0IEZsb2F0UXVhZCB0cmFuc2Zvcm1lZFVuaXRR
dWFkID0gdHJhbnNmb3JtLm1hcFF1YWQodW5pdFF1YWQpOworCisgICAgLy8gQ2FsY3VsYXRlIFgg
YXhpcyBzY2FsZSBmYWN0b3IuCisgICAgY29uc3QgRmxvYXRTaXplIHhVbml0Q2hhbmdlID0gdHJh
bnNmb3JtZWRVbml0UXVhZC5wMigpIC0gdHJhbnNmb3JtZWRVbml0UXVhZC5wMSgpOworICAgIGNv
bnN0IGZsb2F0IHhBeGlzU2NhbGUgPSBzcXJ0Zih4VW5pdENoYW5nZS53aWR0aCgpICogeFVuaXRD
aGFuZ2Uud2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHhVbml0
Q2hhbmdlLmhlaWdodCgpICogeFVuaXRDaGFuZ2UuaGVpZ2h0KCkpOworCisgICAgLy8gQ2FsY3Vs
YXRlIFkgYXhpcyBzY2FsZSBmYWN0b3IuCisgICAgY29uc3QgRmxvYXRTaXplIHlVbml0Q2hhbmdl
ID0gdHJhbnNmb3JtZWRVbml0UXVhZC5wMygpIC0gdHJhbnNmb3JtZWRVbml0UXVhZC5wMSgpOwor
ICAgIGNvbnN0IGZsb2F0IHlBeGlzU2NhbGUgPSBzcXJ0Zih5VW5pdENoYW5nZS53aWR0aCgpICog
eVVuaXRDaGFuZ2Uud2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAr
IHlVbml0Q2hhbmdlLmhlaWdodCgpICogeVVuaXRDaGFuZ2UuaGVpZ2h0KCkpOworCisgICAgLy8g
Ymx1ckxheWVySW1hZ2UoKSBkb2VzIG5vdCBzdXBwb3J0IHBlci1heGlzIGJsdXJyaW5nLCBzbyBj
YWxjdWxhdGUgYSBiYWxhbmNlZCBzY2FsaW5nLgorICAgIC8vIEZJWE1FOiBkb2VzIEFmZmluZVRy
YW5zZm9ybS54U2NhbGUoKS95U2NhbGUoKSBoZWxwPworICAgIGNvbnN0IGZsb2F0IHNjYWxlID0g
c3FydGYoeEF4aXNTY2FsZSAqIHlBeGlzU2NhbGUpOworICAgIG1fYmx1clJhZGl1cyA9IHJvdW5k
ZihtX2JsdXJSYWRpdXMgLyBzY2FsZSk7Cit9CisKK0ludFJlY3QgU2hhZG93Qmx1cjo6Y2FsY3Vs
YXRlTGF5ZXJCb3VuZGluZ1JlY3QoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBGbG9h
dFJlY3QmIHNoYWRvd2VkUmVjdCwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCit7CisgICAgLy8g
Q2FsY3VsYXRlIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYmx1cnJlZCBhbmQvb3IgdHJhbnNmb3Jt
ZWQgbGF5ZXIuCisgICAgRmxvYXRSZWN0IGxheWVyRmxvYXRSZWN0OworICAgIGZsb2F0IGluZmxh
dGlvbiA9IDA7CisKKyAgICBjb25zdCBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gY29udGV4
dC0+Z2V0Q1RNKCk7CisgICAgaWYgKG1fc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMgJiYgIXRyYW5z
Zm9ybS5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgRmxvYXRRdWFkIHRyYW5zZm9ybWVkUG9seWdv
biA9IHRyYW5zZm9ybS5tYXBRdWFkKEZsb2F0UXVhZChzaGFkb3dlZFJlY3QpKTsKKyAgICAgICAg
dHJhbnNmb3JtZWRQb2x5Z29uLm1vdmUobV9vZmZzZXQpOworICAgICAgICBsYXllckZsb2F0UmVj
dCA9IHRyYW5zZm9ybS5pbnZlcnNlKCkubWFwUXVhZCh0cmFuc2Zvcm1lZFBvbHlnb24pLmJvdW5k
aW5nQm94KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGF5ZXJGbG9hdFJlY3QgPSBzaGFkb3dl
ZFJlY3Q7CisgICAgICAgIGxheWVyRmxvYXRSZWN0Lm1vdmUobV9vZmZzZXQpOworICAgIH0KKwor
ICAgIC8vIFdlIGV4cGFuZCB0aGUgYXJlYSBieSB0aGUgYmx1ciByYWRpdXMgdG8gZ2l2ZSBleHRy
YSBzcGFjZSBmb3IgdGhlIGJsdXIgdHJhbnNpdGlvbi4KKyAgICBpZiAobV90eXBlID09IEJsdXJT
aGFkb3cpIHsKKyAgICAgICAgbGF5ZXJGbG9hdFJlY3QuaW5mbGF0ZShtX2JsdXJSYWRpdXMpOwor
ICAgICAgICBpbmZsYXRpb24gKz0gbV9ibHVyUmFkaXVzOworICAgIH0KKworICAgIEZsb2F0UmVj
dCB1bmNsaXBwZWRMYXllclJlY3QgPSBsYXllckZsb2F0UmVjdDsKKworICAgIGlmICghY2xpcFJl
Y3QuY29udGFpbnMoZW5jbG9zaW5nSW50UmVjdChsYXllckZsb2F0UmVjdCkpKSB7CisgICAgICAg
IC8vIElmIHdlIGFyZSB0b3RhbGx5IG91dHNpZGUgdGhlIGNsaXAgcmVnaW9uLCB3ZSBhcmVuJ3Qg
cGFpbnRpbmcgYXQgYWxsLgorICAgICAgICBpZiAoaW50ZXJzZWN0aW9uKGxheWVyRmxvYXRSZWN0
LCBjbGlwUmVjdCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKKwor
ICAgICAgICBJbnRSZWN0IGluZmxhdGVkQ2xpcCA9IGNsaXBSZWN0OworICAgICAgICAvLyBQaXhl
bHMgYXQgdGhlIGVkZ2VzIGNhbiBiZSBhZmZlY3RlZCBieSBwaXhlbHMgb3V0c2lkZSB0aGUgYnVm
ZmVyLAorICAgICAgICAvLyBzbyBpbnRlcnNlY3Qgd2l0aCB0aGUgY2xpcCBpbmZsYXRlZCBieSB0
aGUgYmx1ci4KKyAgICAgICAgaWYgKG1fdHlwZSA9PSBCbHVyU2hhZG93KQorICAgICAgICAgICAg
aW5mbGF0ZWRDbGlwLmluZmxhdGUobV9ibHVyUmFkaXVzKTsKKyAgICAgICAgCisgICAgICAgIGxh
eWVyRmxvYXRSZWN0LmludGVyc2VjdChpbmZsYXRlZENsaXApOworICAgIH0KKworICAgIGNvbnN0
IGludCBmcmFtZVNpemUgPSBpbmZsYXRpb24gKiAyOworICAgIG1fc291cmNlUmVjdCA9IEludFJl
Y3QoMCwgMCwgc2hhZG93ZWRSZWN0LndpZHRoKCkgKyBmcmFtZVNpemUsIHNoYWRvd2VkUmVjdC5o
ZWlnaHQoKSArIGZyYW1lU2l6ZSk7CisgICAgbV9sYXllck9yaWdpbiA9IEZsb2F0UG9pbnQobGF5
ZXJGbG9hdFJlY3QueCgpLCBsYXllckZsb2F0UmVjdC55KCkpOworICAgIG1fbGF5ZXJTaXplID0g
bGF5ZXJGbG9hdFJlY3Quc2l6ZSgpOworCisgICAgY29uc3QgRmxvYXRQb2ludCBtX3VuY2xpcHBl
ZExheWVyT3JpZ2luID0gRmxvYXRQb2ludCh1bmNsaXBwZWRMYXllclJlY3QueCgpLCB1bmNsaXBw
ZWRMYXllclJlY3QueSgpKTsKKyAgICBjb25zdCBGbG9hdFNpemUgY2xpcHBlZE91dCA9IG1fdW5j
bGlwcGVkTGF5ZXJPcmlnaW4gLSBtX2xheWVyT3JpZ2luOworCisgICAgLy8gU2V0IHRoZSBvcmln
aW4gYXMgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgc2NyYXRjaCBpbWFnZSwgb3IsIGluIGNh
c2UgdGhlcmUncyBhIGNsaXBwZWQKKyAgICAvLyBvdXQgcmVnaW9uLCBzZXQgdGhlIG9yaWdpbiBh
Y2NvcmRpbmdseSB0byB0aGUgZnVsbCBib3VuZGluZyByZWN0J3MgdG9wLWxlZnQgY29ybmVyLgor
ICAgIGNvbnN0IGZsb2F0IHRyYW5zbGF0aW9uWCA9IC1zaGFkb3dlZFJlY3QueCgpICsgaW5mbGF0
aW9uIC0gZmFic2YoY2xpcHBlZE91dC53aWR0aCgpKTsKKyAgICBjb25zdCBmbG9hdCB0cmFuc2xh
dGlvblkgPSAtc2hhZG93ZWRSZWN0LnkoKSArIGluZmxhdGlvbiAtIGZhYnNmKGNsaXBwZWRPdXQu
aGVpZ2h0KCkpOworICAgIG1fbGF5ZXJDb250ZXh0VHJhbnNsYXRpb24gPSBGbG9hdFNpemUodHJh
bnNsYXRpb25YLCB0cmFuc2xhdGlvblkpOworCisgICAgcmV0dXJuIGVuY2xvc2luZ0ludFJlY3Qo
bGF5ZXJGbG9hdFJlY3QpOworfQorCitHcmFwaGljc0NvbnRleHQqIFNoYWRvd0JsdXI6OmJlZ2lu
U2hhZG93TGF5ZXIoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEZsb2F0
UmVjdCYgc2hhZG93ZWRSZWN0KQoreworICAgIGFkanVzdEJsdXJEaXN0YW5jZShncmFwaGljc0Nv
bnRleHQpOworCisgICAgSW50UmVjdCBsYXllclJlY3QgPSBjYWxjdWxhdGVMYXllckJvdW5kaW5n
UmVjdChncmFwaGljc0NvbnRleHQsIHNoYWRvd2VkUmVjdCwgZ3JhcGhpY3NDb250ZXh0LT5jbGlw
Qm91bmRzKCkpOworICAgIC8vIERvbid0IHBhaW50IGlmIHdlIGFyZSB0b3RhbGx5IG91dHNpZGUg
dGhlIGNsaXAgcmVnaW9uLgorICAgIGlmIChsYXllclJlY3QuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIG1fbGF5ZXJJbWFnZSA9IFNjcmF0Y2hCdWZmZXI6OnNoYXJlZCgpLmdl
dFNjcmF0Y2hCdWZmZXIobGF5ZXJSZWN0LnNpemUoKSk7CisgICAgR3JhcGhpY3NDb250ZXh0KiBs
YXllckNvbnRleHQgPSBtX2xheWVySW1hZ2UtPmNvbnRleHQoKTsKKworICAgIGxheWVyQ29udGV4
dC0+c2F2ZSgpOyAvLyBCYWxhbmNlZCBieSByZXN0b3JlKCkgaW4gZW5kU2hhZG93TGF5ZXIoKS4K
KworICAgIC8vIEFsd2F5cyBjbGVhciB0aGUgc3VyZmFjZSBmaXJzdC4gRklYTUU6IHdlIGNvdWxk
IGF2b2lkIHRoZSBjbGVhciBvbiBmaXJzdCBhbGxvY2F0aW9uLgorICAgIC8vIEFkZCBhIHBpeGVs
IHRvIGF2b2lkIGxhdGVyIGVkZ2UgYWxpYXNpbmcgd2hlbiByb3RhdGVkLgorICAgIGxheWVyQ29u
dGV4dC0+Y2xlYXJSZWN0KEZsb2F0UmVjdCgwLCAwLCBtX2xheWVyU2l6ZS53aWR0aCgpICsgMSwg
bV9sYXllclNpemUuaGVpZ2h0KCkgKyAxKSk7CisgICAgbGF5ZXJDb250ZXh0LT50cmFuc2xhdGUo
bV9sYXllckNvbnRleHRUcmFuc2xhdGlvbik7CisKKyAgICByZXR1cm4gbGF5ZXJDb250ZXh0Owor
fQorCit2b2lkIFNoYWRvd0JsdXI6OmVuZFNoYWRvd0xheWVyKEdyYXBoaWNzQ29udGV4dCogZ3Jh
cGhpY3NDb250ZXh0KQoreworICAgIGlmICghbV9sYXllckltYWdlKQorICAgICAgICByZXR1cm47
CisgICAgICAgIAorICAgIG1fbGF5ZXJJbWFnZS0+Y29udGV4dCgpLT5yZXN0b3JlKCk7CisKKyAg
ICBpZiAobV90eXBlID09IEJsdXJTaGFkb3cpIHsKKyAgICAgICAgSW50UmVjdCBibHVyUmVjdCA9
IGVuY2xvc2luZ0ludFJlY3QoRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgbV9sYXllclNpemUpKTsK
KyAgICAgICAgUmVmUHRyPEJ5dGVBcnJheT4gbGF5ZXJEYXRhID0gbV9sYXllckltYWdlLT5nZXRV
bm11bHRpcGxpZWRJbWFnZURhdGEoYmx1clJlY3QpOworICAgICAgICBibHVyTGF5ZXJJbWFnZShs
YXllckRhdGEtPmRhdGEoKSwgYmx1clJlY3Quc2l6ZSgpLCBibHVyUmVjdC53aWR0aCgpICogNCk7
CisgICAgICAgIG1fbGF5ZXJJbWFnZS0+cHV0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKGxheWVyRGF0
YS5nZXQoKSwgYmx1clJlY3Quc2l6ZSgpLCBibHVyUmVjdCwgSW50UG9pbnQoKSk7CisgICAgfQor
CisgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7CisKKyAgICBncmFwaGljc0NvbnRleHQtPmNs
aXBUb0ltYWdlQnVmZmVyKG1fbGF5ZXJJbWFnZSwgRmxvYXRSZWN0KG1fbGF5ZXJPcmlnaW4sIG1f
bGF5ZXJJbWFnZS0+c2l6ZSgpKSk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRGaWxsQ29sb3Io
bV9jb2xvciwgbV9jb2xvclNwYWNlKTsKKworICAgIGdyYXBoaWNzQ29udGV4dC0+Y2xlYXJTaGFk
b3coKTsKKyAgICBncmFwaGljc0NvbnRleHQtPmZpbGxSZWN0KEZsb2F0UmVjdChtX2xheWVyT3Jp
Z2luLCBtX3NvdXJjZVJlY3Quc2l6ZSgpKSk7CisgICAgCisgICAgZ3JhcGhpY3NDb250ZXh0LT5y
ZXN0b3JlKCk7CisKKyAgICBtX2xheWVySW1hZ2UgPSAwOworCisgICAgLy8gU2NoZWR1bGUgYSBw
dXJnZSBvZiB0aGUgc2NyYXRjaCBidWZmZXIuIFdlIGRvIG5vdCBuZWVkIHRvIGRlc3Ryb3kgdGhl
IHN1cmZhY2UuCisgICAgU2NyYXRjaEJ1ZmZlcjo6c2hhcmVkKCkuc2NoZWR1bGVTY3JhdGNoQnVm
ZmVyUHVyZ2UoKTsKK30KKwordm9pZCBTaGFkb3dCbHVyOjpkcmF3UmVjdFNoYWRvdyhHcmFwaGlj
c0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBzaGFkb3dlZFJlY3Qs
IGNvbnN0IFJvdW5kZWRJbnRSZWN0OjpSYWRpaSYgcmFkaWkpCit7CisgICAgLy8gZHJhd1NoYWRv
d2VkUmVjdCBkb2VzIG5vdCB3b3JrIHdpdGggcm90YXRpb25zLgorICAgIC8vIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTA0MgorICAgIGlmICghZ3JhcGhpY3NDb250
ZXh0LT5nZXRDVE0oKS5pc0lkZW50aXR5T3JUcmFuc2xhdGlvbk9yRmxpcHBlZCgpIHx8IG1fdHlw
ZSAhPSBCbHVyU2hhZG93KSB7CisgICAgICAgIGRyYXdSZWN0U2hhZG93V2l0aG91dFRpbGluZyhn
cmFwaGljc0NvbnRleHQsIHNoYWRvd2VkUmVjdCwgcmFkaWksIDEpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgaW50IHRlbXBsYXRlU2lkZUxlbmd0aCA9IDE7CisgICAgZmxvYXQgdHdp
Y2VSYWRpdXMgPSBtX2JsdXJSYWRpdXMgKiAyOworICAgIAorICAgIC8vIEZpbmQgdGhlIGV4dHJh
IHNwYWNlIG5lZWRlZCBmcm9tIHRoZSBjdXJ2ZSBvZiB0aGUgY29ybmVycy4KKyAgICBpbnQgZXh0
cmFXaWR0aEZyb21Db3JuZXJSYWRpaSA9IHR3aWNlUmFkaXVzICsgbWF4KHJhZGlpLnRvcExlZnQo
KS53aWR0aCgpLCByYWRpaS5ib3R0b21MZWZ0KCkud2lkdGgoKSkgKyB0d2ljZVJhZGl1cyArIG1h
eChyYWRpaS50b3BSaWdodCgpLndpZHRoKCksIHJhZGlpLmJvdHRvbVJpZ2h0KCkud2lkdGgoKSk7
CisgICAgaW50IGV4dHJhSGVpZ2h0RnJvbUNvcm5lclJhZGlpID0gdHdpY2VSYWRpdXMgKyBtYXgo
cmFkaWkudG9wTGVmdCgpLmhlaWdodCgpLCByYWRpaS50b3BSaWdodCgpLmhlaWdodCgpKSArIHR3
aWNlUmFkaXVzICsgbWF4KHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSwgcmFkaWkuYm90dG9t
UmlnaHQoKS5oZWlnaHQoKSk7CisKKyAgICAvLyBUaGUgbGVuZ3RoIG9mIGEgc2lkZSBvZiB0aGUg
YnVmZmVyIGlzIHRoZSBlbm91Z2ggc3BhY2UgZm9yIGZvdXIgYmx1ciByYWRpaSwKKyAgICAvLyB0
aGUgcmFkaWkgb2YgdGhlIGNvcm5lcnMsIGFuZCB0aGVuIDEgcGl4ZWwgdG8gZHJhdyB0aGUgc2lk
ZSB0aWxlcy4KKyAgICBJbnRTaXplIHNoYWRvd1RlbXBsYXRlU2l6ZSA9IEludFNpemUodGVtcGxh
dGVTaWRlTGVuZ3RoICsgZXh0cmFXaWR0aEZyb21Db3JuZXJSYWRpaSwgdGVtcGxhdGVTaWRlTGVu
Z3RoICsgZXh0cmFIZWlnaHRGcm9tQ29ybmVyUmFkaWkpOworCisgICAgaWYgKHNoYWRvd1RlbXBs
YXRlU2l6ZS53aWR0aCgpID4gc2hhZG93ZWRSZWN0LndpZHRoKCkgfHwgc2hhZG93VGVtcGxhdGVT
aXplLmhlaWdodCgpID4gc2hhZG93ZWRSZWN0LmhlaWdodCgpKSB7CisgICAgICAgIGRyYXdSZWN0
U2hhZG93V2l0aG91dFRpbGluZyhncmFwaGljc0NvbnRleHQsIHNoYWRvd2VkUmVjdCwgcmFkaWks
IDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGRpbWVuc2lv
bnMgb2Ygc2hhZG93IHJlY3QuCisgICAgRmxvYXRSZWN0IHNoYWRvd1JlY3QgPSBzaGFkb3dlZFJl
Y3Q7CisgICAgc2hhZG93UmVjdC5pbmZsYXRlKG1fYmx1clJhZGl1cyk7IC8vIEZJWE1FOiBkdXBs
aWNhdGluZyBjb2RlIHdpdGggY2FsY3VsYXRlTGF5ZXJCb3VuZGluZ1JlY3QuCisKKyAgICAvLyBS
ZWR1Y2UgdGhlIHNpemUgb2Ygd2hhdCB3ZSBoYXZlIHRvIGRyYXcgd2l0aCB0aGUgY2xpcCBhcmVh
LgorICAgIGNhbGN1bGF0ZUxheWVyQm91bmRpbmdSZWN0KGdyYXBoaWNzQ29udGV4dCwgc2hhZG93
ZWRSZWN0LCBncmFwaGljc0NvbnRleHQtPmNsaXBCb3VuZHMoKSk7CisKKyAgICAvLyBJZiB0aGUg
dGVtcGxhdGUgYXJlYSBlbmRzIHVwIGJlaW5nIGxhcmdlciB0aGFuIHRoZSBhcmVhIHRvIGJlIGJs
dXJyZWQsIHVzZSB0aGUgc2ltcGxlIGNhc2UuCisgICAgLy8gRklYTUU6IHdoZW4gZG9lcyB0aGlz
IGhhcHBlbj8KKyAgICBpZiAoKHNoYWRvd1RlbXBsYXRlU2l6ZS53aWR0aCgpICogc2hhZG93VGVt
cGxhdGVTaXplLmhlaWdodCgpID4gbV9zb3VyY2VSZWN0LndpZHRoKCkgKiBtX3NvdXJjZVJlY3Qu
aGVpZ2h0KCkpKSB7CisgICAgICAgIGRyYXdSZWN0U2hhZG93V2l0aG91dFRpbGluZyhncmFwaGlj
c0NvbnRleHQsIHNoYWRvd2VkUmVjdCwgcmFkaWksIDEpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIAorICAgIGRyYXdSZWN0U2hhZG93V2l0aFRpbGluZyhncmFwaGljc0NvbnRleHQsIHNo
YWRvd2VkUmVjdCwgcmFkaWksIDEsIHNoYWRvd1RlbXBsYXRlU2l6ZSk7Cit9CisKK3ZvaWQgU2hh
ZG93Qmx1cjo6ZHJhd1JlY3RTaGFkb3dXaXRob3V0VGlsaW5nKEdyYXBoaWNzQ29udGV4dCogZ3Jh
cGhpY3NDb250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHNoYWRvd2VkUmVjdCwgY29uc3QgUm91bmRl
ZEludFJlY3Q6OlJhZGlpJiByYWRpaSwgZmxvYXQgYWxwaGEpCit7CisgICAgR3JhcGhpY3NDb250
ZXh0KiBzaGFkb3dDb250ZXh0ID0gYmVnaW5TaGFkb3dMYXllcihncmFwaGljc0NvbnRleHQsIHNo
YWRvd2VkUmVjdCk7CisgICAgaWYgKCFzaGFkb3dDb250ZXh0KQorICAgICAgICByZXR1cm47CisK
KyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChzaGFkb3dlZFJlY3QsIHJh
ZGlpLnRvcExlZnQoKSwgcmFkaWkudG9wUmlnaHQoKSwgcmFkaWkuYm90dG9tTGVmdCgpLCByYWRp
aS5ib3R0b21SaWdodCgpKTsKKworICAgIHNoYWRvd0NvbnRleHQtPnNldEZpbGxDb2xvcihDb2xv
ciguMGYsIC4wZiwgLjBmLCBhbHBoYSksIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIHNoYWRv
d0NvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgZW5kU2hhZG93TGF5ZXIoZ3JhcGhpY3ND
b250ZXh0KTsKK30KKworLyoKKyAgVGhpcyBmdW5jdGlvbiB1c2VzIHRpbGluZyB0byBpbXByb3Zl
IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgc2hhZG93CisgIGRyYXdpbmcgb2Ygcm91bmRlZCByZWN0
YW5nbGVzLiBUaGUgY29kZSBiYXNpY2FsbHkgZG9lcyB0aGUgZm9sbG93aW5nCisgIHN0ZXBzOgor
CisgICAgIDEuIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc2hhZG93IHRlbXBsYXRlLCBhIHJl
Y3RhbmdsZSB0aGF0CisgICAgIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5IHRpbGVzIHRvIGRy
YXcgdGhlIGNvbXBsZXRlIHNoYWRvdy4KKworICAgICAyLiBJZiB0aGF0IHNpemUgaXMgc21hbGxl
ciB0aGFuIHRoZSByZWFsIHJlY3RhbmdsZSByZW5kZXIgdGhlIG5ldworICAgICB0ZW1wbGF0ZSBy
ZWN0YW5nbGUgYW5kIGl0cyBzaGFkb3cgaW4gYSBuZXcgc3VyZmFjZSwgaW4gb3RoZXIgY2FzZQor
ICAgICByZW5kZXIgdGhlIHNoYWRvdyBvZiB0aGUgcmVhbCByZWN0YW5nbGUgaW4gdGhlIGRlc3Rp
bmF0aW9uCisgICAgIHN1cmZhY2UuCisKKyAgICAgMy4gQ2FsY3VsYXRlIHRoZSBzaXplcyBhbmQg
cG9zaXRpb25zIG9mIHRoZSB0aWxlcyBhbmQgdGhlaXIKKyAgICAgZGVzdGluYXRpb25zIGFuZCB1
c2UgZHJhd1BhdHRlcm4gdG8gcmVuZGVyIHRoZSBmaW5hbCBzaGFkb3cuIFRoZQorICAgICBjb2Rl
IGRpdmlkZXMgdGhlIHJlbmRlcmluZyBpbiA4IHRpbGVzOgorCisgICAgICAgIDEgfCAyIHwgMwor
ICAgICAgIC0tLS0tLS0tLS0tCisgICAgICAgIDQgfCAgIHwgNQorICAgICAgIC0tLS0tLS0tLS0t
CisgICAgICAgIDYgfCA3IHwgOAorCisgICAgIFRoZSBjb3JuZXJzIGFyZSBkaXJlY3RseSBjb3Bp
ZWQgZnJvbSB0aGUgdGVtcGxhdGUgcmVjdGFuZ2xlIHRvIHRoZQorICAgICByZWFsIG9uZSBhbmQg
dGhlIHNpZGUgdGlsZXMgYXJlIDEgcGl4ZWwgd2lkdGgsIHdlIHVzZSB0aGVtIGFzCisKKyAgICAg
dGlsZXMgdG8gY292ZXIgdGhlIGRlc3RpbmF0aW9uIHNpZGUuIFRoZSBjb3JuZXIgdGlsZXMgYXJl
IGJpZ2dlcgorICAgICB0aGFuIGp1c3QgdGhlIHNpZGUgb2YgdGhlIHJvdW5kZWQgY29ybmVyLCB3
ZSBuZWVkIHRvIGluY3JlYXNlIGl0CisgICAgIGJlY2F1c2UgdGhlIG1vZGlmaWNhdGlvbnMgY2F1
c2VkIGJ5IHRoZSBjb3JuZXIgb3ZlciB0aGUgYmx1cgorICAgICBlZmZlY3QuIFdlIGZpbGwgdGhl
IGNlbnRyYWwgcGFydCB3aXRoIHNvbGlkIGNvbG9yIHRvIGNvbXBsZXRlIHRoZQorICAgICBzaGFk
b3cuCisgKi8KKwordm9pZCBTaGFkb3dCbHVyOjpkcmF3UmVjdFNoYWRvd1dpdGhUaWxpbmcoR3Jh
cGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgc2hhZG93ZWRS
ZWN0LCBjb25zdCBSb3VuZGVkSW50UmVjdDo6UmFkaWkmIHJhZGlpLCBmbG9hdCBhbHBoYSwgY29u
c3QgSW50U2l6ZSYgc2hhZG93VGVtcGxhdGVTaXplKQoreworICAgIGZsb2F0IHR3aWNlUmFkaXVz
ID0gbV9ibHVyUmFkaXVzICogMjsKKworICAgIC8vIFNpemUgb2YgdGhlIHRpbGluZyBzaWRlLgor
ICAgIGludCB0ZW1wbGF0ZVNpZGVMZW5ndGggPSAxOworCisgICAgRmxvYXRSZWN0IHNoYWRvd1Jl
Y3QgPSBzaGFkb3dlZFJlY3Q7CisgICAgc2hhZG93UmVjdC5pbmZsYXRlKG1fYmx1clJhZGl1cyk7
IC8vIEZJWE1FOiBkdXBsaWNhdGluZyBjb2RlIHdpdGggY2FsY3VsYXRlTGF5ZXJCb3VuZGluZ1Jl
Y3QuCisKKyAgICBzaGFkb3dSZWN0Lm1vdmUobV9vZmZzZXQud2lkdGgoKSwgbV9vZmZzZXQuaGVp
Z2h0KCkpOworCisgICAgbV9sYXllckltYWdlID0gU2NyYXRjaEJ1ZmZlcjo6c2hhcmVkKCkuZ2V0
U2NyYXRjaEJ1ZmZlcihzaGFkb3dUZW1wbGF0ZVNpemUpOworCisgICAgLy8gRHJhdyBzaGFkb3cg
aW50byBhIG5ldyBJbWFnZUJ1ZmZlci4KKyAgICBHcmFwaGljc0NvbnRleHQqIHNoYWRvd0NvbnRl
eHQgPSBtX2xheWVySW1hZ2UtPmNvbnRleHQoKTsKKyAgICBzaGFkb3dDb250ZXh0LT5zYXZlKCk7
CisgICAgCisgICAgc2hhZG93Q29udGV4dC0+Y2xlYXJSZWN0KEZsb2F0UmVjdCgwLCAwLCBzaGFk
b3dUZW1wbGF0ZVNpemUud2lkdGgoKSwgc2hhZG93VGVtcGxhdGVTaXplLmhlaWdodCgpKSk7CisK
KyAgICAvLyBEcmF3IHRoZSByZWN0YW5nbGUuCisgICAgSW50UmVjdCB0ZW1wbGF0ZVJlY3QgPSBJ
bnRSZWN0KG1fYmx1clJhZGl1cywgbV9ibHVyUmFkaXVzLCBzaGFkb3dUZW1wbGF0ZVNpemUud2lk
dGgoKSAtIHR3aWNlUmFkaXVzLCBzaGFkb3dUZW1wbGF0ZVNpemUuaGVpZ2h0KCkgLSB0d2ljZVJh
ZGl1cyk7CisgICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkUm91bmRlZFJlY3QodGVtcGxhdGVS
ZWN0LCByYWRpaS50b3BMZWZ0KCksIHJhZGlpLnRvcFJpZ2h0KCksIHJhZGlpLmJvdHRvbUxlZnQo
KSwgcmFkaWkuYm90dG9tUmlnaHQoKSk7CisKKyAgICBzaGFkb3dDb250ZXh0LT5zZXRGaWxsQ29s
b3IoQ29sb3IoLjBmLCAuMGYsIC4wZiwgYWxwaGEpLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAg
ICBzaGFkb3dDb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKworICAgIC8vIEJsdXIgdGhlIGltYWdl
LgorICAgIHsKKyAgICAgICAgSW50UmVjdCBibHVyUmVjdChJbnRQb2ludCgpLCBzaGFkb3dUZW1w
bGF0ZVNpemUpOworICAgICAgICBSZWZQdHI8Qnl0ZUFycmF5PiBsYXllckRhdGEgPSBtX2xheWVy
SW1hZ2UtPmdldFVubXVsdGlwbGllZEltYWdlRGF0YShibHVyUmVjdCk7CisgICAgICAgIGJsdXJM
YXllckltYWdlKGxheWVyRGF0YS0+ZGF0YSgpLCBibHVyUmVjdC5zaXplKCksIGJsdXJSZWN0Lndp
ZHRoKCkgKiA0KTsKKyAgICAgICAgbV9sYXllckltYWdlLT5wdXRVbm11bHRpcGxpZWRJbWFnZURh
dGEobGF5ZXJEYXRhLmdldCgpLCBibHVyUmVjdC5zaXplKCksIGJsdXJSZWN0LCBJbnRQb2ludCgp
KTsKKyAgICB9CisKKyAgICAvLyBNYXNrIHRoZSBpbWFnZSB3aXRoIHRoZSBzaGFkb3cgY29sb3Iu
CisgICAgc2hhZG93Q29udGV4dC0+c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZVNvdXJj
ZUluKTsKKyAgICBzaGFkb3dDb250ZXh0LT5zZXRGaWxsQ29sb3IobV9jb2xvciwgbV9jb2xvclNw
YWNlKTsKKyAgICBzaGFkb3dDb250ZXh0LT5maWxsUmVjdChGbG9hdFJlY3QoMCwgMCwgc2hhZG93
VGVtcGxhdGVTaXplLndpZHRoKCksIHNoYWRvd1RlbXBsYXRlU2l6ZS5oZWlnaHQoKSkpOworICAg
IAorICAgIHNoYWRvd0NvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIC8vIEZpbGwgdGhlIGludGVy
bmFsIHBhcnQgb2YgdGhlIHNoYWRvdy4KKyAgICBzaGFkb3dSZWN0LmluZmxhdGUoLXR3aWNlUmFk
aXVzKTsKKyAgICBpZiAoIXNoYWRvd1JlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgIGdyYXBoaWNz
Q29udGV4dC0+c2F2ZSgpOworICAgICAgICAKKyAgICAgICAgcGF0aC5jbGVhcigpOworICAgICAg
ICBwYXRoLmFkZFJvdW5kZWRSZWN0KHNoYWRvd1JlY3QsIHJhZGlpLnRvcExlZnQoKSwgcmFkaWku
dG9wUmlnaHQoKSwgcmFkaWkuYm90dG9tTGVmdCgpLCByYWRpaS5ib3R0b21SaWdodCgpKTsKKwor
ICAgICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihtX2NvbG9yLCBtX2NvbG9yU3Bh
Y2UpOworICAgICAgICBncmFwaGljc0NvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworICAgICAgICAK
KyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZXN0b3JlKCk7CisgICAgfQorICAgIHNoYWRvd1Jl
Y3QuaW5mbGF0ZSh0d2ljZVJhZGl1cyk7CisKKyAgICAvLyBOb3RlIHRoYXQgZHJhd2luZyB0aGUg
SW1hZ2VCdWZmZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBJbWFnZSBhbmQgZHJhd2luZyB0
aGF0LAorICAgIC8vIGJlY2F1c2UgSW1hZ2VCdWZmZXI6OmRyYXcoKSBrbm93cyB0aGF0IGl0IGRv
ZXNuJ3QgaGF2ZSB0byBjb3B5IHRoZSBpbWFnZSBiaXRzLgorICAgICAgICAKKyAgICAvLyBEcmF3
IHRvcCBzaWRlLgorICAgIEZsb2F0UmVjdCB0aWxlUmVjdCA9IEZsb2F0UmVjdCh0d2ljZVJhZGl1
cyArIHJhZGlpLnRvcExlZnQoKS53aWR0aCgpLCAwLCB0ZW1wbGF0ZVNpZGVMZW5ndGgsIHR3aWNl
UmFkaXVzKTsKKyAgICBGbG9hdFJlY3QgZGVzdFJlY3QgPSB0aWxlUmVjdDsKKyAgICBkZXN0UmVj
dC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dSZWN0LnkoKSk7CisgICAgZGVzdFJlY3Quc2V0
V2lkdGgoc2hhZG93UmVjdC53aWR0aCgpIC0gcmFkaWkudG9wTGVmdCgpLndpZHRoKCkgLSByYWRp
aS50b3BSaWdodCgpLndpZHRoKCkgLSBtX2JsdXJSYWRpdXMgKiA0KTsKKyAgICBncmFwaGljc0Nv
bnRleHQtPmRyYXdJbWFnZUJ1ZmZlcihtX2xheWVySW1hZ2UsIENvbG9yU3BhY2VEZXZpY2VSR0Is
IGRlc3RSZWN0LCB0aWxlUmVjdCk7CisKKyAgICAvLyBEcmF3IHRoZSBib3R0b20gc2lkZS4KKyAg
ICB0aWxlUmVjdCA9IEZsb2F0UmVjdCh0d2ljZVJhZGl1cyArIHJhZGlpLmJvdHRvbUxlZnQoKS53
aWR0aCgpLCBzaGFkb3dUZW1wbGF0ZVNpemUuaGVpZ2h0KCkgLSB0d2ljZVJhZGl1cywgdGVtcGxh
dGVTaWRlTGVuZ3RoLCB0d2ljZVJhZGl1cyk7CisgICAgZGVzdFJlY3QgPSB0aWxlUmVjdDsKKyAg
ICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dSZWN0LnkoKSArIHR3aWNlUmFk
aXVzICsgc2hhZG93ZWRSZWN0LmhlaWdodCgpIC0gc2hhZG93VGVtcGxhdGVTaXplLmhlaWdodCgp
KTsKKyAgICBkZXN0UmVjdC5zZXRXaWR0aChzaGFkb3dSZWN0LndpZHRoKCkgLSByYWRpaS5ib3R0
b21MZWZ0KCkud2lkdGgoKSAtIHJhZGlpLmJvdHRvbVJpZ2h0KCkud2lkdGgoKSAtIG1fYmx1clJh
ZGl1cyAqIDQpOworICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKG1fbGF5ZXJJ
bWFnZSwgQ29sb3JTcGFjZURldmljZVJHQiwgZGVzdFJlY3QsIHRpbGVSZWN0KTsKKworICAgIC8v
IERyYXcgdGhlIHJpZ2h0IHNpZGUuCisgICAgdGlsZVJlY3QgPSBGbG9hdFJlY3Qoc2hhZG93VGVt
cGxhdGVTaXplLndpZHRoKCkgLSB0d2ljZVJhZGl1cywgdHdpY2VSYWRpdXMgKyByYWRpaS50b3BS
aWdodCgpLmhlaWdodCgpLCB0d2ljZVJhZGl1cywgdGVtcGxhdGVTaWRlTGVuZ3RoKTsKKyAgICBk
ZXN0UmVjdCA9IHRpbGVSZWN0OworICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93UmVjdC54KCkgKyB0
d2ljZVJhZGl1cyArIHNoYWRvd2VkUmVjdC53aWR0aCgpIC0gc2hhZG93VGVtcGxhdGVTaXplLndp
ZHRoKCksIHNoYWRvd1JlY3QueSgpKTsKKyAgICBkZXN0UmVjdC5zZXRIZWlnaHQoc2hhZG93UmVj
dC5oZWlnaHQoKSAtIHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkgLSByYWRpaS5ib3R0b21SaWdo
dCgpLmhlaWdodCgpIC0gbV9ibHVyUmFkaXVzICogNCk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5k
cmF3SW1hZ2VCdWZmZXIobV9sYXllckltYWdlLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBkZXN0UmVj
dCwgdGlsZVJlY3QpOworCisgICAgLy8gRHJhdyB0aGUgbGVmdCBzaWRlLgorICAgIHRpbGVSZWN0
ID0gRmxvYXRSZWN0KDAsIHR3aWNlUmFkaXVzICsgcmFkaWkudG9wTGVmdCgpLmhlaWdodCgpLCB0
d2ljZVJhZGl1cywgdGVtcGxhdGVTaWRlTGVuZ3RoKTsKKyAgICBkZXN0UmVjdCA9IHRpbGVSZWN0
OworICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93UmVjdC54KCksIHNoYWRvd1JlY3QueSgpKTsKKyAg
ICBkZXN0UmVjdC5zZXRIZWlnaHQoc2hhZG93UmVjdC5oZWlnaHQoKSAtIHJhZGlpLnRvcExlZnQo
KS5oZWlnaHQoKSAtIHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSAtIG1fYmx1clJhZGl1cyAq
IDQpOworICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKG1fbGF5ZXJJbWFnZSwg
Q29sb3JTcGFjZURldmljZVJHQiwgZGVzdFJlY3QsIHRpbGVSZWN0KTsKKworICAgIC8vIERyYXcg
dGhlIHRvcCBsZWZ0IGNvcm5lci4KKyAgICB0aWxlUmVjdCA9IEZsb2F0UmVjdCgwLCAwLCB0d2lj
ZVJhZGl1cyArIHJhZGlpLnRvcExlZnQoKS53aWR0aCgpLCB0d2ljZVJhZGl1cyArIHJhZGlpLnRv
cExlZnQoKS5oZWlnaHQoKSk7CisgICAgZGVzdFJlY3QgPSB0aWxlUmVjdDsKKyAgICBkZXN0UmVj
dC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dSZWN0LnkoKSk7CisgICAgZ3JhcGhpY3NDb250
ZXh0LT5kcmF3SW1hZ2VCdWZmZXIobV9sYXllckltYWdlLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBk
ZXN0UmVjdCwgdGlsZVJlY3QpOworCisgICAgLy8gRHJhdyB0aGUgdG9wIHJpZ2h0IGNvcm5lci4K
KyAgICB0aWxlUmVjdCA9IEZsb2F0UmVjdChzaGFkb3dUZW1wbGF0ZVNpemUud2lkdGgoKSAtIHR3
aWNlUmFkaXVzIC0gcmFkaWkudG9wUmlnaHQoKS53aWR0aCgpLCAwLCB0d2ljZVJhZGl1cyArIHJh
ZGlpLnRvcFJpZ2h0KCkud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0d2ljZVJh
ZGl1cyArIHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkpOworICAgIGRlc3RSZWN0ID0gdGlsZVJl
Y3Q7CisgICAgZGVzdFJlY3QubW92ZShzaGFkb3dSZWN0LngoKSArIHNoYWRvd2VkUmVjdC53aWR0
aCgpIC0gc2hhZG93VGVtcGxhdGVTaXplLndpZHRoKCkgKyB0d2ljZVJhZGl1cywgc2hhZG93UmVj
dC55KCkpOworICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKG1fbGF5ZXJJbWFn
ZSwgQ29sb3JTcGFjZURldmljZVJHQiwgZGVzdFJlY3QsIHRpbGVSZWN0KTsKKworICAgIC8vIERy
YXcgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuCisgICAgdGlsZVJlY3QgPSBGbG9hdFJlY3Qoc2hh
ZG93VGVtcGxhdGVTaXplLndpZHRoKCkgLSB0d2ljZVJhZGl1cyAtIHJhZGlpLmJvdHRvbVJpZ2h0
KCkud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dUZW1wbGF0ZVNpemUu
aGVpZ2h0KCkgLSB0d2ljZVJhZGl1cyAtIHJhZGlpLmJvdHRvbVJpZ2h0KCkuaGVpZ2h0KCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgdHdpY2VSYWRpdXMgKyByYWRpaS5ib3R0b21SaWdodCgp
LndpZHRoKCksIHR3aWNlUmFkaXVzICsgcmFkaWkuYm90dG9tUmlnaHQoKS5oZWlnaHQoKSk7Cisg
ICAgZGVzdFJlY3QgPSB0aWxlUmVjdDsKKyAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgp
ICsgc2hhZG93ZWRSZWN0LndpZHRoKCkgLSBzaGFkb3dUZW1wbGF0ZVNpemUud2lkdGgoKSArIHR3
aWNlUmFkaXVzLAorICAgICAgICAgICAgICAgICAgc2hhZG93UmVjdC55KCkgKyBzaGFkb3dlZFJl
Y3QuaGVpZ2h0KCkgLSBzaGFkb3dUZW1wbGF0ZVNpemUuaGVpZ2h0KCkgKyB0d2ljZVJhZGl1cyk7
CisgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VCdWZmZXIobV9sYXllckltYWdlLCBDb2xv
clNwYWNlRGV2aWNlUkdCLCBkZXN0UmVjdCwgdGlsZVJlY3QpOworCisgICAgLy8gRHJhdyB0aGUg
Ym90dG9tIGxlZnQgY29ybmVyLgorICAgIHRpbGVSZWN0ID0gRmxvYXRSZWN0KDAsIHNoYWRvd1Rl
bXBsYXRlU2l6ZS5oZWlnaHQoKSAtIHR3aWNlUmFkaXVzIC0gcmFkaWkuYm90dG9tTGVmdCgpLmhl
aWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR3aWNlUmFkaXVzICsgcmFkaWkuYm90
dG9tTGVmdCgpLndpZHRoKCksIHR3aWNlUmFkaXVzICsgcmFkaWkuYm90dG9tTGVmdCgpLmhlaWdo
dCgpKTsKKyAgICBkZXN0UmVjdCA9IHRpbGVSZWN0OworICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93
UmVjdC54KCksIHNoYWRvd1JlY3QueSgpICsgc2hhZG93ZWRSZWN0LmhlaWdodCgpIC0gc2hhZG93
VGVtcGxhdGVTaXplLmhlaWdodCgpICsgdHdpY2VSYWRpdXMpOworICAgIGdyYXBoaWNzQ29udGV4
dC0+ZHJhd0ltYWdlQnVmZmVyKG1fbGF5ZXJJbWFnZSwgQ29sb3JTcGFjZURldmljZVJHQiwgZGVz
dFJlY3QsIHRpbGVSZWN0KTsKKworICAgIG1fbGF5ZXJJbWFnZSA9IDA7CisgICAgLy8gU2NoZWR1
bGUgYSBwdXJnZSBvZiB0aGUgc2NyYXRjaCBidWZmZXIuCisgICAgU2NyYXRjaEJ1ZmZlcjo6c2hh
cmVkKCkuc2NoZWR1bGVTY3JhdGNoQnVmZmVyUHVyZ2UoKTsKK30KKworI2lmICFQTEFURk9STShD
RykKK0ludFJlY3QgU2hhZG93Qmx1cjo6Y2xpcEJvdW5kcyhHcmFwaGljc0NvbnRleHQqKQorewor
ICAgIC8vIEZJWE1FOiBhZGQgY2xpcEJvdW5kcygpIHRvIEdyYXBoaWNzQ29udGV4dC4KKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gSW50UmVjdCgpOworfQorI2VuZGlmCisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1NoYWRvd0JsdXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL1NoYWRvd0JsdXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hOTNlYjRkODZmNjFlZDk5ODI1MzZlODYzNWRh
ZWQ0OTRjNzM1OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvU2hhZG93Qmx1ci5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEgQXBwbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlbmNoYSwgSW5jLgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgU2hhZG93Qmx1cl9oCisjZGVmaW5lIFNoYWRvd0JsdXJfaAorCisjaW5jbHVkZSAi
Q29sb3IuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJSb3VuZGVkSW50UmVj
dC5oIgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIEFmZmluZVRyYW5zZm9ybTsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNz
IEltYWdlQnVmZmVyOworCitjbGFzcyBTaGFkb3dCbHVyIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShTaGFkb3dCbHVyKTsKK3B1YmxpYzoKKyAgICBTaGFkb3dCbHVyKGZsb2F0IHJhZGl1cywg
Y29uc3QgRmxvYXRTaXplJiBvZmZzZXQsIGNvbnN0IENvbG9yJiwgQ29sb3JTcGFjZSk7CisKKyAg
ICB2b2lkIHNldFNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKGJvb2wgaWdub3JlVHJhbnNmb3Jtcykg
eyBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zID0gaWdub3JlVHJhbnNmb3JtczsgfQorICAgIGJv
b2wgc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMoKSBjb25zdCB7IHJldHVybiBtX3NoYWRvd3NJZ25v
cmVUcmFuc2Zvcm1zOyB9CisKKyAgICB2b2lkIGRyYXdSZWN0U2hhZG93KEdyYXBoaWNzQ29udGV4
dCosIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IFJvdW5kZWRJbnRSZWN0OjpSYWRpaSYpOworCitw
cml2YXRlOgorICAgIEdyYXBoaWNzQ29udGV4dCogYmVnaW5TaGFkb3dMYXllcihHcmFwaGljc0Nv
bnRleHQqLCBjb25zdCBGbG9hdFJlY3QmIGxheWVyQXJlYSk7CisgICAgdm9pZCBlbmRTaGFkb3dM
YXllcihHcmFwaGljc0NvbnRleHQqKTsKKworICAgIHZvaWQgYWRqdXN0Qmx1ckRpc3RhbmNlKEdy
YXBoaWNzQ29udGV4dCopOworICAgIHZvaWQgYmx1ckxheWVySW1hZ2UodW5zaWduZWQgY2hhcios
IGNvbnN0IEludFNpemUmLCBpbnQgc3RyaWRlKTsKKyAgICBJbnRSZWN0IGNhbGN1bGF0ZUxheWVy
Qm91bmRpbmdSZWN0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYgbGF5ZXJBcmVh
LCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCk7CisKKyAgICB2b2lkIGRyYXdSZWN0U2hhZG93V2l0
aG91dFRpbGluZyhHcmFwaGljc0NvbnRleHQqLCBjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBSb3Vu
ZGVkSW50UmVjdDo6UmFkaWkmLCBmbG9hdCBhbHBoYSk7CisgICAgdm9pZCBkcmF3UmVjdFNoYWRv
d1dpdGhUaWxpbmcoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgUm91
bmRlZEludFJlY3Q6OlJhZGlpJiwgZmxvYXQgYWxwaGEsIGNvbnN0IEludFNpemUmIHNoYWRvd1Rl
bXBsYXRlU2l6ZSk7CisgICAgCisgICAgZW51bSBTaGFkb3dUeXBlIHsKKyAgICAgICAgTm9TaGFk
b3csCisgICAgICAgIFNvbGlkU2hhZG93LAorICAgICAgICBCbHVyU2hhZG93CisgICAgfTsKKyAg
ICAKKyAgICBTaGFkb3dUeXBlIG1fdHlwZTsKKworICAgIENvbG9yIG1fY29sb3I7CisgICAgQ29s
b3JTcGFjZSBtX2NvbG9yU3BhY2U7CisgICAgZmxvYXQgbV9ibHVyUmFkaXVzOworICAgIEZsb2F0
U2l6ZSBtX29mZnNldDsKKworICAgIEltYWdlQnVmZmVyKiBtX2xheWVySW1hZ2U7IC8vIEJ1ZmZl
ciB0byB3aGVyZSB0aGUgdGVtcG9yYXJ5IHNoYWRvdyB3aWxsIGJlIGRyYXduIHRvLgorCisgICAg
RmxvYXRSZWN0IG1fc291cmNlUmVjdDsgLy8gU3ViLXJlY3Qgb2YgbV9sYXllckltYWdlIHRoYXQg
Y29udGFpbnMgdGhlIHNoYWRvdyBwaXhlbHMuCisgICAgRmxvYXRQb2ludCBtX2xheWVyT3JpZ2lu
OyAvLyBUb3AtbGVmdCBjb3JuZXIgb2YgdGhlIChwb3NzaWJseSBjbGlwcGVkKSBib3VuZGluZyBy
ZWN0IHRvIGRyYXcgdGhlIHNoYWRvdyB0by4KKyAgICBGbG9hdFNpemUgbV9sYXllclNpemU7IC8v
IFNpemUgb2YgbV9sYXllckltYWdlIHBpeGVscyB0aGF0IG5lZWQgYmx1cnJpbmcuCisgICAgRmxv
YXRTaXplIG1fbGF5ZXJDb250ZXh0VHJhbnNsYXRpb247IC8vIFRyYW5zbGF0aW9uIHRvIGFwcGx5
IHRvIG1fbGF5ZXJDb250ZXh0IGZvciB0aGUgc2hhZG93IHRvIGJlIGNvcnJlY3RseSBjbGlwcGVk
LgorCisgICAgYm9vbCBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU2hhZG93Qmx1cl9oCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHAK
aW5kZXggNjE0MjU2OThlNTU3OTg4ODUzZWQzZTI5OGRkZTc4NmUxZDQ1NjQ0Zi4uNjAzNTZiNmY1
ODM2ZDM3M2ZiYTJkMTZhZmY0MTc0OTY3YTJiZmFkZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0Q0cuY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dENHLmNwcApAQCAt
NzI3LDYgKzcyNywxMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBhdGgoY29uc3QgUGF0
aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1bGUpCiAgICAgICAgIENHQ29udGV4dENsaXAoY29udGV4
dCk7CiB9CiAKK0ludFJlY3QgR3JhcGhpY3NDb250ZXh0OjpjbGlwQm91bmRzKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChDR0NvbnRleHRHZXRDbGlwQm91bmRpbmdCb3go
cGxhdGZvcm1Db250ZXh0KCkpKTsKK30KKwogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZElubmVy
Um91bmRlZFJlY3RDbGlwKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCB0aGlja25lc3MpCiB7CiAg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80606</attachid>
            <date>2011-01-30 16:37:00 -0800</date>
            <delta_ts>2011-01-30 16:38:51 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51312-20110130163658.patch</filename>
            <type>text/plain</type>
            <size>39192</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA3N2ZjMmEwMjI3YjNjZjhmNWRmNDU1OTU1MWY4ZGNmOTc0MmMzMmQxLi45
YzlkNWM2NWI1Y2FhY2JhYzIzODVkYTY4OWU2MDhlNGZmYmY1NzIzIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsNDYgQEAKKzIwMTEtMDEtMzAgIFNpbW9uIEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBs
ZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
TWFrZSBDb250ZXh0U2hhZG93IGNvZGUgY3Jvc3MtcGxhdGZvcm0KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUxMzEyCisKKyAgICAgICAgQWRkIGEgbmV3
IGNsYXNzLCBTaGFkb3dCbHVyLCB0aGF0IGNvbnRhaW5zIG1vc3Qgb2YgdGhlCisgICAgICAgIGNv
ZGUgZnJvbSBDb250ZXh0U2hhZG93LCBidXQgaXMgZnVsbHkgY3Jvc3MtcGxhdGZvcm0uCisgICAg
ICAgIEl0IGRlcGVuZHMgb24gb25lIG5ldyBtZXRob2QsIEdyYXBoaWNzQ29udGV4dDo6Y2xpcEJv
dW5kcygpLAorICAgICAgICB3aGljaCBwbGF0Zm9ybXMgd2lsbCBoYXZlIHRvIGltcGxlbWVudC4K
KyAgICAgICAgCisgICAgICAgIEFkZCBTaGFkb3dCbHVyIHRvIHRoZSBNYWMgWGNvZGUgcHJvamVj
dCwgYnV0IGRvbid0IHVzZSBpdAorICAgICAgICBhbnl3aGVyZSB5ZXQuCisKKyAgICAgICAgKiBX
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDo6Y2xpcEJvdW5kcyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3ND
b250ZXh0Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvU2hhZG93Qmx1ci5jcHA6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6cm91bmRVcFRvTXVsdGlwbGVPZjMyKToKKyAgICAgICAg
KFdlYkNvcmU6OlNjcmF0Y2hCdWZmZXI6OlNjcmF0Y2hCdWZmZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6U2NyYXRjaEJ1ZmZlcjo6Z2V0U2NyYXRjaEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpT
Y3JhdGNoQnVmZmVyOjpzY2hlZHVsZVNjcmF0Y2hCdWZmZXJQdXJnZSk6CisgICAgICAgIChXZWJD
b3JlOjpTY3JhdGNoQnVmZmVyOjp0aW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcmF0
Y2hCdWZmZXI6OmNsZWFyU2NyYXRjaEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpTY3JhdGNo
QnVmZmVyOjpzaGFyZWQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93Qmx1cjo6U2hhZG93Qmx1
cik6CisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpibHVyTGF5ZXJJbWFnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjphZGp1c3RCbHVyRGlzdGFuY2UpOgorICAgICAgICAo
V2ViQ29yZTo6U2hhZG93Qmx1cjo6Y2FsY3VsYXRlTGF5ZXJCb3VuZGluZ1JlY3QpOgorICAgICAg
ICAoV2ViQ29yZTo6U2hhZG93Qmx1cjo6YmVnaW5TaGFkb3dMYXllcik6CisgICAgICAgIChXZWJD
b3JlOjpTaGFkb3dCbHVyOjplbmRTaGFkb3dMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpTaGFk
b3dCbHVyOjpkcmF3UmVjdFNoYWRvdyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpk
cmF3UmVjdFNoYWRvd1dpdGhvdXRUaWxpbmcpOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93Qmx1
cjo6ZHJhd1JlY3RTaGFkb3dXaXRoVGlsaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYWRvd0Js
dXI6OmNsaXBCb3VuZHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1NoYWRvd0JsdXIu
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpzZXRTaGFkb3dzSWdub3Jl
VHJhbnNmb3Jtcyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFkb3dCbHVyOjpzaGFkb3dzSWdub3Jl
VHJhbnNmb3Jtcyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250
ZXh0Q0cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwQm91bmRz
KToKKwogMjAxMS0wMS0yOSAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4K
IAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDJkZjE5M2EzOWFhMjk2
ZDNjYTA1YWQ0ZmM4NTE4ZTk1ZDg4YTE0N2IuLjk4YWE0Yzc1NzUwZjdlZTgzNTE3YTg4NzdlMGU1
NmI2ZTJhOTMwMjQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKQEAgLTI1NCw2ICsyNTQsOCBAQAogCQkwQzQ1MzQyODEwQ0RCQkZBMDA4
NjkxNTcgLyogSlNXZWJHTFVuaWZvcm1Mb2NhdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEM0NTM0MjYxMENEQkJGQTAwODY5MTU3IC8qIEpTV2Vi
R0xVbmlmb3JtTG9jYXRpb24uaCAqLzsgfTsKIAkJMEYxMUE1NEYwRjM5MjMzMTAwQzM3ODg0IC8q
IFJlbmRlclNlbGVjdGlvbkluZm8uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGMTFBNTRFMEYzOTIzMzEwMEMzNzg4NCAvKiBSZW5kZXJTZWxlY3Rpb25J
bmZvLmggKi87IH07CiAJCTBGMTVEQThBMEYzQUFFRTcwMDAwQ0U0NyAvKiBBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMEYxNURBODkwRjNBQUVFNzAwMDBDRTQ3IC8qIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2
YXRlLmggKi87IH07CisJCTBGM0RENDRGMTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVyLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGM0RENDRE
MTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVyLmNwcCAqLzsgfTsKKwkJMEYzREQ0NTAxMkY1
RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDBGM0RENDRFMTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVy
LmggKi87IH07CiAJCTBGNTAwQUFGMEY1NERCMUIwMEVFRjkyOCAvKiBUcmFuc2Zvcm1TdGF0ZS5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1MDBBQUUw
RjU0REIxQjAwRUVGOTI4IC8qIFRyYW5zZm9ybVN0YXRlLmggKi87IH07CiAJCTBGNTAwQUIxMEY1
NERCMzEwMEVFRjkyOCAvKiBUcmFuc2Zvcm1TdGF0ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjUwMEFCMDBGNTREQjMxMDBFRUY5MjggLyogVHJh
bnNmb3JtU3RhdGUuY3BwICovOyB9OwogCQkwRjU2MDI4RjBFNEI3NjU4MDA2NUIwMzggLyogUmVu
ZGVyTWFycXVlZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY1NjAyOEQwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuaCAqLzsgfTsKQEAg
LTY1NjgsNiArNjU3MCw4IEBACiAJCTBDNDUzNDI2MTBDREJCRkEwMDg2OTE1NyAvKiBKU1dlYkdM
VW5pZm9ybUxvY2F0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTV2Vi
R0xVbmlmb3JtTG9jYXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEYxMUE1
NEUwRjM5MjMzMTAwQzM3ODg0IC8qIFJlbmRlclNlbGVjdGlvbkluZm8uaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyU2VsZWN0aW9uSW5mby5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQkwRjE1REE4OTBGM0FBRUU3MDAwMENFNDcgLyogQW5pbWF0aW9uQ29u
dHJvbGxlclByaXZhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQW5pbWF0
aW9uQ29udHJvbGxlclByaXZhdGUuaDsgcGF0aCA9IGFuaW1hdGlvbi9BbmltYXRpb25Db250cm9s
bGVyUHJpdmF0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjNERDQ0RDEyRjVF
QTFCMDAwRDkxOTAgLyogU2hhZG93Qmx1ci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBTaGFkb3dCbHVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MEYzREQ0NEUxMkY1RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gU2hhZG93Qmx1ci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkwRjUwMEFBRTBGNTREQjFCMDBFRUY5MjggLyogVHJhbnNmb3JtU3RhdGUuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHJhbnNmb3JtU3RhdGUuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJMEY1MDBBQjAwRjU0REIzMTAwRUVGOTI4IC8qIFRyYW5zZm9ybVN0
YXRlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFRyYW5zZm9ybVN0
YXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY1NjAyOEQwRTRCNzY1ODAw
NjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gUmVuZGVyTWFycXVlZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTc1Mzcs
NiArMTc1NDEsOCBAQAogCQkJCUE3M0Y5NUZEMTJDOTdCRkUwMDMxQUFGOSAvKiBSb3VuZGVkSW50
UmVjdC5oICovLAogCQkJCTM3MUY0RkZCMEQyNUU3RjMwMEVDRTBENSAvKiBTZWdtZW50ZWRGb250
RGF0YS5jcHAgKi8sCiAJCQkJMzcxRjRGRkEwRDI1RTdGMzAwRUNFMEQ1IC8qIFNlZ21lbnRlZEZv
bnREYXRhLmggKi8sCisJCQkJMEYzREQ0NEQxMkY1RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIu
Y3BwICovLAorCQkJCTBGM0RENDRFMTJGNUVBMUIwMDBEOTE5MCAvKiBTaGFkb3dCbHVyLmggKi8s
CiAJCQkJQjJDM0RBNTMwRDAwNkNENjAwRUY2RjI2IC8qIFNpbXBsZUZvbnREYXRhLmNwcCAqLywK
IAkJCQlCMkMzREE1NDBEMDA2Q0Q2MDBFRjZGMjYgLyogU2ltcGxlRm9udERhdGEuaCAqLywKIAkJ
CQlCMjM1NDBGMDBEMDA3ODJFMDAyMzgyRkEgLyogU3RyaW5nVHJ1bmNhdG9yLmNwcCAqLywKQEAg
LTIyNDUxLDYgKzIyNDU3LDcgQEAKIAkJCQlFMTM0RjVBQjEyRUUzNDNGMDA0RUM1OEQgLyogSW50
UmVjdEhhc2guaCBpbiBIZWFkZXJzICovLAogCQkJCTk3N0UyRENFMTJGMEUyODMwMEMxMzM3OSAv
KiBIVE1MU291cmNlVHJhY2tlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTc3RTJFMEYxMkYwRkM5
QzAwQzEzMzc5IC8qIFhTU0ZpbHRlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMEYzREQ0NTAxMkY1
RUExQjAwMEQ5MTkwIC8qIFNoYWRvd0JsdXIuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1
bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjUxNDgsNiAr
MjUxNTUsNyBAQAogCQkJCTRGMkQyMDU1MTJFQUU3QjMwMDVDMjg3NCAvKiBJbnNwZWN0b3JBZ2Vu
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzdFMkRDRDEyRjBFMjgzMDBDMTMzNzkgLyogSFRN
TFNvdXJjZVRyYWNrZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTc3RTJFMEUxMkYwRkM5QzAw
QzEzMzc5IC8qIFhTU0ZpbHRlci5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwRjNERDQ0RjEyRjVF
QTFCMDAwRDkxOTAgLyogU2hhZG93Qmx1ci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQly
dW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbnRleHRTaGFkb3cuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbnRleHRTaGFkb3cuaAppbmRleCBhMWZiYTVj
ODJhMTQzNjBhYTU2YTQ0NzJjMTk3YjMxYzIxZjhiNDY3Li5jMDU3MWYwZmQyMjY5MmNlZGRkNzY5
NmVmN2NjMTI0ZjZkMzMyMzk3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Db250ZXh0U2hhZG93LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvQ29udGV4dFNoYWRvdy5oCkBAIC02OCw2ICs2OCw4IEBAIHR5cGVkZWYgdm9pZCogUGxh
dGZvcm1Db250ZXh0OwogLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgY29weWFibGUgc2luY2UgR3Jh
cGhpY3NDb250ZXh0UXQga2VlcHMgYSBzdGFjayBvZgogLy8gdGhlIHNoYWRvdyBzdGF0ZSBmb3Ig
c2F2ZVBsYXRmb3JtU3RhdGUgYW5kIHJlc3RvcmVQbGF0Zm9ybVN0YXRlLgogCisvLyBUaGlzIGNs
YXNzIGlzIERlcHJlY2F0ZWQuIFBsYXRmb3JtcyBzaG91bGQgbWlncmF0ZSB0byBTaGFkb3dCbHVy
LgorCiBjbGFzcyBDb250ZXh0U2hhZG93IHsKIHB1YmxpYzoKICAgICBlbnVtIHsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCmlu
ZGV4IGUwNWE1NzgxNWY3YTE1N2RiMjIwYzhkM2U5ZDNiOWZkOGY3YjE0NDguLjViMDBlMjUwNDY2
YTAzNGU0N2Q3YTA3ZTMwZDJmOTUxNTJiNjUxY2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcApAQCAtNTY1LDYgKzU2NSwx
NCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFRvSW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXIq
IGJ1ZmZlciwgY29uc3QgRmxvYXRSZWN0JiByZQogICAgIGJ1ZmZlci0+Y2xpcCh0aGlzLCByZWN0
KTsKIH0KIAorI2lmICFQTEFURk9STShDRykKK0ludFJlY3QgR3JhcGhpY3NDb250ZXh0OjpjbGlw
Qm91bmRzKCkgY29uc3QKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4g
SW50UmVjdCgpOworfQorI2VuZGlmCisKIFRleHREcmF3aW5nTW9kZUZsYWdzIEdyYXBoaWNzQ29u
dGV4dDo6dGV4dERyYXdpbmdNb2RlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9zdGF0ZS50ZXh0
RHJhd2luZ01vZGU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dC5oCmluZGV4IDZjOWEyZjY0YjA1MDUwM2ZmMTNhMzZlZTIxZTkwMjk1YTA1
MjIwOGYuLmMwMThkNjdiZTYyODE4OWQzOGEwZWU4ZDU5MGEwYjJhODhlN2FkZWUgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCkBA
IC0zMjAsNiArMzIwLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2b2lkIGNsaXBQ
YXRoKGNvbnN0IFBhdGgmLCBXaW5kUnVsZSk7CiAgICAgICAgIHZvaWQgY2xpcENvbnZleFBvbHln
b24oc2l6ZV90IG51bVBvaW50cywgY29uc3QgRmxvYXRQb2ludCosIGJvb2wgYW50aWFsaWFzID0g
dHJ1ZSk7CiAgICAgICAgIHZvaWQgY2xpcFRvSW1hZ2VCdWZmZXIoSW1hZ2VCdWZmZXIqLCBjb25z
dCBGbG9hdFJlY3QmKTsKKyAgICAgICAgCisgICAgICAgIEludFJlY3QgY2xpcEJvdW5kcygpIGNv
bnN0OwogCiAgICAgICAgIFRleHREcmF3aW5nTW9kZUZsYWdzIHRleHREcmF3aW5nTW9kZSgpIGNv
bnN0OwogICAgICAgICB2b2lkIHNldFRleHREcmF3aW5nTW9kZShUZXh0RHJhd2luZ01vZGVGbGFn
cyk7CkBAIC0zNzMsNyArMzc1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgICAgICAgIC8v
IFRoaXMgY2xpcCBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgYnkgPGNhbnZhcz4gY29kZS4gSXQgYWxs
b3dzCiAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyB0byBoYW5kbGUgY2xpcHBpbmcgb24gdGhl
IGNhbnZhcyBkaWZmZXJlbnRseSBzaW5jZQotICAgICAgICAvLyB0aGUgZGlzaXBsaW5lIGlzIGRp
ZmZlcmVudC4KKyAgICAgICAgLy8gdGhlIGRpc2NpcGxpbmUgaXMgZGlmZmVyZW50LgogICAgICAg
ICB2b2lkIGNhbnZhc0NsaXAoY29uc3QgUGF0aCYpOwogICAgICAgICB2b2lkIGNsaXBPdXQoY29u
c3QgUGF0aCYpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9TaGFkb3dCbHVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NoYWRv
d0JsdXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIzOGQ3NzQ4MTQxMmQ5ZDc1MzViZjg5MjZkZTdhNTU3MjJl
NGRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9TaGFkb3dCbHVyLmNwcApAQCAtMCwwICsxLDU4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMSBBcHBsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2VuY2hhLCBJbmMuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYWRvd0JsdXIuaCIKKworI2luY2x1ZGUgIkFm
ZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkZsb2F0UXVhZC5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCisjaW5jbHVkZSAiVGltZXIu
aCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJs
ZS5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
YXRpYyBpbmxpbmUgaW50IHJvdW5kVXBUb011bHRpcGxlT2YzMihpbnQgZCkKK3sKKyAgICByZXR1
cm4gKDEgKyAoZCA+PiA1KSkgPDwgNTsKK30KKworLy8gU2hhZG93Qmx1ciBuZWVkcyBhIHNjcmF0
Y2ggaW1hZ2UgYXMgdGhlIGJ1ZmZlciBmb3IgdGhlIGJsdXIgZmlsdGVyLgorLy8gSW5zdGVhZCBv
ZiBjcmVhdGluZyBhbmQgZGVzdHJveWluZyB0aGUgYnVmZmVyIGZvciBldmVyeSBvcGVyYXRpb24s
CisvLyB3ZSBjcmVhdGUgYSBidWZmZXIgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHB1cmdl
ZCB2aWEgYSB0aW1lci4KK2NsYXNzIFNjcmF0Y2hCdWZmZXIgeworcHVibGljOgorICAgIFNjcmF0
Y2hCdWZmZXIoKQorICAgICAgICA6IG1fcHVyZ2VUaW1lcih0aGlzLCAmU2NyYXRjaEJ1ZmZlcjo6
dGltZXJGaXJlZCkKKyAgICB7CisgICAgfQorICAgIAorICAgIEltYWdlQnVmZmVyKiBnZXRTY3Jh
dGNoQnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUpCisgICAgeworICAgICAgICAvLyBXZSBkbyBu
b3QgbmVlZCB0byByZWNyZWF0ZSB0aGUgYnVmZmVyIGlmIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBs
YXJnZSBlbm91Z2guCisgICAgICAgIGlmIChtX2ltYWdlQnVmZmVyICYmIG1faW1hZ2VCdWZmZXIt
PndpZHRoKCkgPj0gc2l6ZS53aWR0aCgpICYmIG1faW1hZ2VCdWZmZXItPmhlaWdodCgpID49IHNp
emUuaGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1cm4gbV9pbWFnZUJ1ZmZlci5nZXQoKTsKKwor
ICAgICAgICAvLyBSb3VuZCB0byB0aGUgbmVhcmVzdCAzMiBwaXhlbHMgc28gd2UgZG8gbm90IGdy
b3cgdGhlIGJ1ZmZlciBmb3Igc2ltaWxhciBzaXplZCByZXF1ZXN0cy4KKyAgICAgICAgSW50U2l6
ZSByb3VuZGVkU2l6ZShyb3VuZFVwVG9NdWx0aXBsZU9mMzIoc2l6ZS53aWR0aCgpKSwgcm91bmRV
cFRvTXVsdGlwbGVPZjMyKHNpemUuaGVpZ2h0KCkpKTsKKworICAgICAgICBtX2ltYWdlQnVmZmVy
ID0gSW1hZ2VCdWZmZXI6OmNyZWF0ZShyb3VuZGVkU2l6ZSk7CisgICAgICAgIHJldHVybiBtX2lt
YWdlQnVmZmVyLmdldCgpOworICAgIH0KKworICAgIHZvaWQgc2NoZWR1bGVTY3JhdGNoQnVmZmVy
UHVyZ2UoKQorICAgIHsKKyAgICAgICAgaWYgKG1fcHVyZ2VUaW1lci5pc0FjdGl2ZSgpKQorICAg
ICAgICAgICAgbV9wdXJnZVRpbWVyLnN0b3AoKTsKKworICAgICAgICBjb25zdCBkb3VibGUgc2Ny
YXRjaEJ1ZmZlclB1cmdlSW50ZXJ2YWwgPSAyOworICAgICAgICBtX3B1cmdlVGltZXIuc3RhcnRP
bmVTaG90KHNjcmF0Y2hCdWZmZXJQdXJnZUludGVydmFsKTsKKyAgICB9CisgICAgCisgICAgc3Rh
dGljIFNjcmF0Y2hCdWZmZXImIHNoYXJlZCgpOworCitwcml2YXRlOgorICAgIHZvaWQgdGltZXJG
aXJlZChUaW1lcjxTY3JhdGNoQnVmZmVyPiopCisgICAgeworICAgICAgICBjbGVhclNjcmF0Y2hC
dWZmZXIoKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBjbGVhclNjcmF0Y2hCdWZmZXIoKQorICAg
IHsKKyAgICAgICAgbV9pbWFnZUJ1ZmZlciA9IDA7CisgICAgfQorCisgICAgT3duUHRyPEltYWdl
QnVmZmVyPiBtX2ltYWdlQnVmZmVyOworICAgIFRpbWVyPFNjcmF0Y2hCdWZmZXI+IG1fcHVyZ2VU
aW1lcjsKK307CisKK1NjcmF0Y2hCdWZmZXImIFNjcmF0Y2hCdWZmZXI6OnNoYXJlZCgpCit7Cisg
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChTY3JhdGNoQnVmZmVyLCBzY3JhdGNoQnVmZmVyLCAoKSk7
CisgICAgcmV0dXJuIHNjcmF0Y2hCdWZmZXI7Cit9CisKK1NoYWRvd0JsdXI6OlNoYWRvd0JsdXIo
ZmxvYXQgcmFkaXVzLCBjb25zdCBGbG9hdFNpemUmIG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9y
LCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCisgICAgOiBtX2NvbG9yKGNvbG9yKQorICAgICwgbV9j
b2xvclNwYWNlKGNvbG9yU3BhY2UpCisgICAgLCBtX2JsdXJSYWRpdXMocmFkaXVzKQorICAgICwg
bV9vZmZzZXQob2Zmc2V0KQorICAgICwgbV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcyhmYWxzZSkK
K3sKKyAgICAvLyBMaW1pdCBibHVyIHJhZGl1cyB0byAxMjggdG8gYXZvaWQgbG90cyBvZiB2ZXJ5
IGV4cGVuc2l2ZSBibHVycmluZy4KKyAgICBtX2JsdXJSYWRpdXMgPSBtaW48ZmxvYXQ+KG1fYmx1
clJhZGl1cywgMTI4KTsKKworICAgIC8vIFRoZSB0eXBlIG9mIHNoYWRvdyBpcyBkZWNpZGVkIGJ5
IHRoZSBibHVyIHJhZGl1cywgc2hhZG93IG9mZnNldCwgYW5kIHNoYWRvdyBjb2xvci4KKyAgICBp
ZiAoIW1fY29sb3IuaXNWYWxpZCgpIHx8ICFjb2xvci5hbHBoYSgpKSB7CisgICAgICAgIC8vIENh
bid0IHBhaW50IHRoZSBzaGFkb3cgd2l0aCBpbnZhbGlkIG9yIGludmlzaWJsZSBjb2xvci4KKyAg
ICAgICAgbV90eXBlID0gTm9TaGFkb3c7CisgICAgfSBlbHNlIGlmIChyYWRpdXMgPiAwKSB7Cisg
ICAgICAgIC8vIFNoYWRvdyBpcyBhbHdheXMgYmx1cnJlZCwgZXZlbiB0aGUgb2Zmc2V0IGlzIHpl
cm8uCisgICAgICAgIG1fdHlwZSA9IEJsdXJTaGFkb3c7CisgICAgfSBlbHNlIGlmICghbV9vZmZz
ZXQud2lkdGgoKSAmJiAhbV9vZmZzZXQuaGVpZ2h0KCkpIHsKKyAgICAgICAgLy8gV2l0aG91dCBi
bHVyIGFuZCB6ZXJvIG9mZnNldCBtZWFucyB0aGUgc2hhZG93IGlzIGZ1bGx5IGhpZGRlbi4KKyAg
ICAgICAgbV90eXBlID0gTm9TaGFkb3c7CisgICAgfSBlbHNlCisgICAgICAgIG1fdHlwZSA9IFNv
bGlkU2hhZG93OworfQorCisvLyBJbnN0ZWFkIG9mIGludGVnZXIgZGl2aXNpb24sIHdlIHVzZSAx
Ny4xNSBmb3IgZml4ZWQtcG9pbnQgZGl2aXNpb24uCitzdGF0aWMgY29uc3QgaW50IGJsdXJTdW1T
aGlmdCA9IDE1Oworc3RhdGljIGNvbnN0IGZsb2F0IGdhdXNzaWFuS2VybmVsRmFjdG9yID0gMyAv
IDQuZiAqIHNxcnRmKDIgKiBwaUZsb2F0KTsKKworLy8gQ2hlY2sgaHR0cDovL3d3dy53My5vcmcv
VFIvU1ZHL2ZpbHRlcnMuaHRtbCNmZUdhdXNzaWFuQmx1ci4KKy8vIEFzIG5vdGVkIGluIHRoZSBT
VkcgZmlsdGVyIHNwZWNpZmljYXRpb24sIHJ1bm5pbmcgYm94IGJsdXIgM3gKKy8vIGFwcHJveGlt
YXRlcyBhIHJlYWwgZ2F1c3NpYW4gYmx1ciBuaWNlbHkuCisKK3ZvaWQgU2hhZG93Qmx1cjo6Ymx1
ckxheWVySW1hZ2UodW5zaWduZWQgY2hhciogaW1hZ2VEYXRhLCBjb25zdCBJbnRTaXplJiBzaXpl
LCBpbnQgcm93U3RyaWRlKQoreworICAgIGNvbnN0IGludCBjaGFubmVsc1s0XSA9CisjaWYgQ1BV
KEJJR19FTkRJQU4pCisgICAgICAgIHsgMCwgMywgMiwgMCB9OworI2VsaWYgQ1BVKE1JRERMRV9F
TkRJQU4pCisgICAgICAgIHsgMSwgMiwgMywgMSB9OworI2Vsc2UKKyAgICAgICAgeyAzLCAwLCAx
LCAzIH07CisjZW5kaWYKKworICAgIGludCBkaWFtZXRlcjsKKyAgICBpZiAobV9zaGFkb3dzSWdu
b3JlVHJhbnNmb3JtcykKKyAgICAgICAgZGlhbWV0ZXIgPSBtYXgoMiwgc3RhdGljX2Nhc3Q8aW50
PihmbG9vcmYoKDIgLyAzLmYpICogbV9ibHVyUmFkaXVzKSkpOyAvLyBDYW52YXMgc2hhZG93LiBG
SVhNRTogd2Ugc2hvdWxkIGFkanVzdCB0aGUgYmx1ciByYWRpdXMgaGlnaGVyIHVwLgorICAgIGVs
c2UKKyAgICAgICAgZGlhbWV0ZXIgPSBtYXgoMiwgc3RhdGljX2Nhc3Q8aW50PihmbG9vcmYobV9i
bHVyUmFkaXVzIC8gMiAqIGdhdXNzaWFuS2VybmVsRmFjdG9yICsgMC41ZikpKTsgLy8gQ1NTCisK
KyAgICBpbnQgZE1heCA9IGRpYW1ldGVyID4+IDE7CisgICAgaW50IGRNaW4gPSBkTWF4IC0gMSAr
IChkaWFtZXRlciAmIDEpOworICAgIGlmIChkTWluIDwgMCkKKyAgICAgICAgZE1pbiA9IDA7CisK
KyAgICAvLyBGaXJzdCBwYXNzIGlzIGhvcml6b250YWwuCisgICAgaW50IHN0cmlkZSA9IDQ7Cisg
ICAgaW50IGRlbHRhID0gcm93U3RyaWRlOworICAgIGludCBmaW5hbCA9IHNpemUuaGVpZ2h0KCk7
CisgICAgaW50IGRpbSA9IHNpemUud2lkdGgoKTsKKworICAgIC8vIFR3byBzdGFnZXM6IGhvcml6
b250YWwgYW5kIHZlcnRpY2FsCisgICAgZm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCAyOyArK3Bh
c3MpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciogcGl4ZWxzID0gaW1hZ2VEYXRhOworCisgICAg
ICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmluYWw7ICsraiwgcGl4ZWxzICs9IGRlbHRhKSB7Cisg
ICAgICAgICAgICAvLyBGb3IgZWFjaCBzdGVwLCB3ZSBibHVyIHRoZSBhbHBoYSBpbiBhIGNoYW5u
ZWwgYW5kIHN0b3JlIHRoZSByZXN1bHQKKyAgICAgICAgICAgIC8vIGluIGFub3RoZXIgY2hhbm5l
bCBmb3IgdGhlIHN1YnNlcXVlbnQgc3RlcC4KKyAgICAgICAgICAgIC8vIFdlIHVzZSBzbGlkaW5n
IHdpbmRvdyBhbGdvcml0aG0gdG8gYWNjdW11bGF0ZSB0aGUgYWxwaGEgdmFsdWVzLgorICAgICAg
ICAgICAgLy8gVGhpcyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gY29tcHV0aW5nIHRoZSBz
dW0gb2YgZWFjaCBwaXhlbHMKKyAgICAgICAgICAgIC8vIGNvdmVyZWQgYnkgdGhlIGJveCBrZXJu
ZWwgc2l6ZSBmb3IgZWFjaCB4LgorICAgICAgICAgICAgZm9yIChpbnQgc3RlcCA9IDA7IHN0ZXAg
PCAzOyArK3N0ZXApIHsKKyAgICAgICAgICAgICAgICBpbnQgc2lkZTEgPSAoIXN0ZXApID8gZE1p
biA6IGRNYXg7CisgICAgICAgICAgICAgICAgaW50IHNpZGUyID0gKHN0ZXAgPT0gMSkgPyBkTWlu
IDogZE1heDsKKyAgICAgICAgICAgICAgICBpbnQgcGl4ZWxDb3VudCA9IHNpZGUxICsgMSArIHNp
ZGUyOworICAgICAgICAgICAgICAgIGludCBpbnZDb3VudCA9ICgoMSA8PCBibHVyU3VtU2hpZnQp
ICsgcGl4ZWxDb3VudCAtIDEpIC8gcGl4ZWxDb3VudDsKKyAgICAgICAgICAgICAgICBpbnQgb2Zz
ID0gMSArIHNpZGUyOworICAgICAgICAgICAgICAgIGludCBhbHBoYTEgPSBwaXhlbHNbY2hhbm5l
bHNbc3RlcF1dOworICAgICAgICAgICAgICAgIGludCBhbHBoYTIgPSBwaXhlbHNbKGRpbSAtIDEp
ICogc3RyaWRlICsgY2hhbm5lbHNbc3RlcF1dOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQg
Y2hhciogcHRyID0gcGl4ZWxzICsgY2hhbm5lbHNbc3RlcCArIDFdOworICAgICAgICAgICAgICAg
IHVuc2lnbmVkIGNoYXIqIHByZXYgPSBwaXhlbHMgKyBzdHJpZGUgKyBjaGFubmVsc1tzdGVwXTsK
KyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBuZXh0ID0gcGl4ZWxzICsgb2ZzICogc3Ry
aWRlICsgY2hhbm5lbHNbc3RlcF07CisKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAg
ICAgICAgICBpbnQgc3VtID0gc2lkZTEgKiBhbHBoYTEgKyBhbHBoYTE7CisgICAgICAgICAgICAg
ICAgaW50IGxpbWl0ID0gKGRpbSA8IHNpZGUyICsgMSkgPyBkaW0gOiBzaWRlMiArIDE7CisKKyAg
ICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbGltaXQ7ICsraSwgcHJldiArPSBzdHJpZGUp
CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSAqcHJldjsKKworICAgICAgICAgICAgICAgIGlm
IChsaW1pdCA8PSBzaWRlMikKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IChzaWRlMiAtIGxp
bWl0ICsgMSkgKiBhbHBoYTI7CisKKyAgICAgICAgICAgICAgICBsaW1pdCA9IChzaWRlMSA8IGRp
bSkgPyBzaWRlMSA6IGRpbTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7
IHB0ciArPSBzdHJpZGUsIG5leHQgKz0gc3RyaWRlLCArK2ksICsrb2ZzKSB7CisgICAgICAgICAg
ICAgICAgICAgICpwdHIgPSAoc3VtICogaW52Q291bnQpID4+IGJsdXJTdW1TaGlmdDsKKyAgICAg
ICAgICAgICAgICAgICAgc3VtICs9ICgob2ZzIDwgZGltKSA/ICpuZXh0IDogYWxwaGEyKSAtIGFs
cGhhMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgcHJldiA9IHBpeGVscyArIGNoYW5uZWxzW3N0ZXBdOworICAgICAgICAgICAgICAgIGZvciAo
OyBvZnMgPCBkaW07IHB0ciArPSBzdHJpZGUsIHByZXYgKz0gc3RyaWRlLCBuZXh0ICs9IHN0cmlk
ZSwgKytpLCArK29mcykgeworICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHN1bSAqIGludkNv
dW50KSA+PiBibHVyU3VtU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSAoKm5leHQp
IC0gKCpwcmV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgZm9yICg7IGkgPCBkaW07IHB0ciArPSBzdHJpZGUsIHByZXYgKz0gc3RyaWRlLCAr
K2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKnB0ciA9IChzdW0gKiBpbnZDb3VudCkgPj4gYmx1
clN1bVNoaWZ0OworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYWxwaGEyIC0gKCpwcmV2KTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAv
LyBMYXN0IHBhc3MgaXMgdmVydGljYWwuCisgICAgICAgIHN0cmlkZSA9IHJvd1N0cmlkZTsKKyAg
ICAgICAgZGVsdGEgPSA0OworICAgICAgICBmaW5hbCA9IHNpemUud2lkdGgoKTsKKyAgICAgICAg
ZGltID0gc2l6ZS5oZWlnaHQoKTsKKyAgICB9Cit9CisKK3ZvaWQgU2hhZG93Qmx1cjo6YWRqdXN0
Qmx1ckRpc3RhbmNlKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBpZiAoIW1fc2hh
ZG93c0lnbm9yZVRyYW5zZm9ybXMpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBjb250ZXh0LT5nZXRDVE0oKTsKKworICAgIC8vIEFkanVz
dCBibHVyIGlmIHdlJ3JlIHNjYWxpbmcsIHNpbmNlIHRoZSByYWRpdXMgbXVzdCBub3QgYmUgYWZm
ZWN0ZWQgYnkgdHJhbnNmb3JtYXRpb25zLgorICAgIC8vIEZJWE1FOiB1c2UgQWZmaW5lVHJhbnNm
b3JtOjppc0lkZW50aXR5T3JUcmFuc2xhdGlvbk9yRmxpcHBlZCgpPworICAgIGlmICh0cmFuc2Zv
cm0uaXNJZGVudGl0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDYWxjdWxhdGUgdHJh
bnNmb3JtZWQgdW5pdCB2ZWN0b3JzLgorICAgIGNvbnN0IEZsb2F0UXVhZCB1bml0UXVhZChGbG9h
dFBvaW50KDAsIDApLCBGbG9hdFBvaW50KDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBGbG9hdFBvaW50KDAsIDEpLCBGbG9hdFBvaW50KDEsIDEpKTsKKyAgICBjb25zdCBGbG9h
dFF1YWQgdHJhbnNmb3JtZWRVbml0UXVhZCA9IHRyYW5zZm9ybS5tYXBRdWFkKHVuaXRRdWFkKTsK
KworICAgIC8vIENhbGN1bGF0ZSBYIGF4aXMgc2NhbGUgZmFjdG9yLgorICAgIGNvbnN0IEZsb2F0
U2l6ZSB4VW5pdENoYW5nZSA9IHRyYW5zZm9ybWVkVW5pdFF1YWQucDIoKSAtIHRyYW5zZm9ybWVk
VW5pdFF1YWQucDEoKTsKKyAgICBjb25zdCBmbG9hdCB4QXhpc1NjYWxlID0gc3FydGYoeFVuaXRD
aGFuZ2Uud2lkdGgoKSAqIHhVbml0Q2hhbmdlLndpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKyB4VW5pdENoYW5nZS5oZWlnaHQoKSAqIHhVbml0Q2hhbmdlLmhlaWdo
dCgpKTsKKworICAgIC8vIENhbGN1bGF0ZSBZIGF4aXMgc2NhbGUgZmFjdG9yLgorICAgIGNvbnN0
IEZsb2F0U2l6ZSB5VW5pdENoYW5nZSA9IHRyYW5zZm9ybWVkVW5pdFF1YWQucDMoKSAtIHRyYW5z
Zm9ybWVkVW5pdFF1YWQucDEoKTsKKyAgICBjb25zdCBmbG9hdCB5QXhpc1NjYWxlID0gc3FydGYo
eVVuaXRDaGFuZ2Uud2lkdGgoKSAqIHlVbml0Q2hhbmdlLndpZHRoKCkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKyB5VW5pdENoYW5nZS5oZWlnaHQoKSAqIHlVbml0Q2hhbmdl
LmhlaWdodCgpKTsKKworICAgIC8vIGJsdXJMYXllckltYWdlKCkgZG9lcyBub3Qgc3VwcG9ydCBw
ZXItYXhpcyBibHVycmluZywgc28gY2FsY3VsYXRlIGEgYmFsYW5jZWQgc2NhbGluZy4KKyAgICAv
LyBGSVhNRTogZG9lcyBBZmZpbmVUcmFuc2Zvcm0ueFNjYWxlKCkveVNjYWxlKCkgaGVscD8KKyAg
ICBjb25zdCBmbG9hdCBzY2FsZSA9IHNxcnRmKHhBeGlzU2NhbGUgKiB5QXhpc1NjYWxlKTsKKyAg
ICBtX2JsdXJSYWRpdXMgPSByb3VuZGYobV9ibHVyUmFkaXVzIC8gc2NhbGUpOworfQorCitJbnRS
ZWN0IFNoYWRvd0JsdXI6OmNhbGN1bGF0ZUxheWVyQm91bmRpbmdSZWN0KEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBzaGFkb3dlZFJlY3QsIGNvbnN0IEludFJlY3Qm
IGNsaXBSZWN0KQoreworICAgIC8vIENhbGN1bGF0ZSB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGJs
dXJyZWQgYW5kL29yIHRyYW5zZm9ybWVkIGxheWVyLgorICAgIEZsb2F0UmVjdCBsYXllckZsb2F0
UmVjdDsKKyAgICBmbG9hdCBpbmZsYXRpb24gPSAwOworCisgICAgY29uc3QgQWZmaW5lVHJhbnNm
b3JtIHRyYW5zZm9ybSA9IGNvbnRleHQtPmdldENUTSgpOworICAgIGlmIChtX3NoYWRvd3NJZ25v
cmVUcmFuc2Zvcm1zICYmICF0cmFuc2Zvcm0uaXNJZGVudGl0eSgpKSB7CisgICAgICAgIEZsb2F0
UXVhZCB0cmFuc2Zvcm1lZFBvbHlnb24gPSB0cmFuc2Zvcm0ubWFwUXVhZChGbG9hdFF1YWQoc2hh
ZG93ZWRSZWN0KSk7CisgICAgICAgIHRyYW5zZm9ybWVkUG9seWdvbi5tb3ZlKG1fb2Zmc2V0KTsK
KyAgICAgICAgbGF5ZXJGbG9hdFJlY3QgPSB0cmFuc2Zvcm0uaW52ZXJzZSgpLm1hcFF1YWQodHJh
bnNmb3JtZWRQb2x5Z29uKS5ib3VuZGluZ0JveCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxh
eWVyRmxvYXRSZWN0ID0gc2hhZG93ZWRSZWN0OworICAgICAgICBsYXllckZsb2F0UmVjdC5tb3Zl
KG1fb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLyBXZSBleHBhbmQgdGhlIGFyZWEgYnkgdGhlIGJs
dXIgcmFkaXVzIHRvIGdpdmUgZXh0cmEgc3BhY2UgZm9yIHRoZSBibHVyIHRyYW5zaXRpb24uCisg
ICAgaWYgKG1fdHlwZSA9PSBCbHVyU2hhZG93KSB7CisgICAgICAgIGxheWVyRmxvYXRSZWN0Lmlu
ZmxhdGUobV9ibHVyUmFkaXVzKTsKKyAgICAgICAgaW5mbGF0aW9uICs9IG1fYmx1clJhZGl1czsK
KyAgICB9CisKKyAgICBGbG9hdFJlY3QgdW5jbGlwcGVkTGF5ZXJSZWN0ID0gbGF5ZXJGbG9hdFJl
Y3Q7CisKKyAgICBpZiAoIWNsaXBSZWN0LmNvbnRhaW5zKGVuY2xvc2luZ0ludFJlY3QobGF5ZXJG
bG9hdFJlY3QpKSkgeworICAgICAgICAvLyBJZiB3ZSBhcmUgdG90YWxseSBvdXRzaWRlIHRoZSBj
bGlwIHJlZ2lvbiwgd2UgYXJlbid0IHBhaW50aW5nIGF0IGFsbC4KKyAgICAgICAgaWYgKGludGVy
c2VjdGlvbihsYXllckZsb2F0UmVjdCwgY2xpcFJlY3QpLmlzRW1wdHkoKSkKKyAgICAgICAgICAg
IHJldHVybiBJbnRSZWN0KCk7CisKKyAgICAgICAgSW50UmVjdCBpbmZsYXRlZENsaXAgPSBjbGlw
UmVjdDsKKyAgICAgICAgLy8gUGl4ZWxzIGF0IHRoZSBlZGdlcyBjYW4gYmUgYWZmZWN0ZWQgYnkg
cGl4ZWxzIG91dHNpZGUgdGhlIGJ1ZmZlciwKKyAgICAgICAgLy8gc28gaW50ZXJzZWN0IHdpdGgg
dGhlIGNsaXAgaW5mbGF0ZWQgYnkgdGhlIGJsdXIuCisgICAgICAgIGlmIChtX3R5cGUgPT0gQmx1
clNoYWRvdykKKyAgICAgICAgICAgIGluZmxhdGVkQ2xpcC5pbmZsYXRlKG1fYmx1clJhZGl1cyk7
CisgICAgICAgIAorICAgICAgICBsYXllckZsb2F0UmVjdC5pbnRlcnNlY3QoaW5mbGF0ZWRDbGlw
KTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgZnJhbWVTaXplID0gaW5mbGF0aW9uICogMjsKKyAg
ICBtX3NvdXJjZVJlY3QgPSBJbnRSZWN0KDAsIDAsIHNoYWRvd2VkUmVjdC53aWR0aCgpICsgZnJh
bWVTaXplLCBzaGFkb3dlZFJlY3QuaGVpZ2h0KCkgKyBmcmFtZVNpemUpOworICAgIG1fbGF5ZXJP
cmlnaW4gPSBGbG9hdFBvaW50KGxheWVyRmxvYXRSZWN0LngoKSwgbGF5ZXJGbG9hdFJlY3QueSgp
KTsKKyAgICBtX2xheWVyU2l6ZSA9IGxheWVyRmxvYXRSZWN0LnNpemUoKTsKKworICAgIGNvbnN0
IEZsb2F0UG9pbnQgdW5jbGlwcGVkTGF5ZXJPcmlnaW4gPSBGbG9hdFBvaW50KHVuY2xpcHBlZExh
eWVyUmVjdC54KCksIHVuY2xpcHBlZExheWVyUmVjdC55KCkpOworICAgIGNvbnN0IEZsb2F0U2l6
ZSBjbGlwcGVkT3V0ID0gdW5jbGlwcGVkTGF5ZXJPcmlnaW4gLSBtX2xheWVyT3JpZ2luOworCisg
ICAgLy8gU2V0IHRoZSBvcmlnaW4gYXMgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgc2NyYXRj
aCBpbWFnZSwgb3IsIGluIGNhc2UgdGhlcmUncyBhIGNsaXBwZWQKKyAgICAvLyBvdXQgcmVnaW9u
LCBzZXQgdGhlIG9yaWdpbiBhY2NvcmRpbmdseSB0byB0aGUgZnVsbCBib3VuZGluZyByZWN0J3Mg
dG9wLWxlZnQgY29ybmVyLgorICAgIGZsb2F0IHRyYW5zbGF0aW9uWCA9IC1zaGFkb3dlZFJlY3Qu
eCgpICsgaW5mbGF0aW9uIC0gZmFic2YoY2xpcHBlZE91dC53aWR0aCgpKTsKKyAgICBmbG9hdCB0
cmFuc2xhdGlvblkgPSAtc2hhZG93ZWRSZWN0LnkoKSArIGluZmxhdGlvbiAtIGZhYnNmKGNsaXBw
ZWRPdXQuaGVpZ2h0KCkpOworICAgIG1fbGF5ZXJDb250ZXh0VHJhbnNsYXRpb24gPSBGbG9hdFNp
emUodHJhbnNsYXRpb25YLCB0cmFuc2xhdGlvblkpOworCisgICAgcmV0dXJuIGVuY2xvc2luZ0lu
dFJlY3QobGF5ZXJGbG9hdFJlY3QpOworfQorCitHcmFwaGljc0NvbnRleHQqIFNoYWRvd0JsdXI6
OmJlZ2luU2hhZG93TGF5ZXIoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0
IEZsb2F0UmVjdCYgc2hhZG93ZWRSZWN0KQoreworICAgIGFkanVzdEJsdXJEaXN0YW5jZShncmFw
aGljc0NvbnRleHQpOworCisgICAgSW50UmVjdCBsYXllclJlY3QgPSBjYWxjdWxhdGVMYXllckJv
dW5kaW5nUmVjdChncmFwaGljc0NvbnRleHQsIHNoYWRvd2VkUmVjdCwgZ3JhcGhpY3NDb250ZXh0
LT5jbGlwQm91bmRzKCkpOworICAgIC8vIERvbid0IHBhaW50IGlmIHdlIGFyZSB0b3RhbGx5IG91
dHNpZGUgdGhlIGNsaXAgcmVnaW9uLgorICAgIGlmIChsYXllclJlY3QuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIG1fbGF5ZXJJbWFnZSA9IFNjcmF0Y2hCdWZmZXI6OnNoYXJl
ZCgpLmdldFNjcmF0Y2hCdWZmZXIobGF5ZXJSZWN0LnNpemUoKSk7CisgICAgR3JhcGhpY3NDb250
ZXh0KiBsYXllckNvbnRleHQgPSBtX2xheWVySW1hZ2UtPmNvbnRleHQoKTsKKworICAgIGxheWVy
Q29udGV4dC0+c2F2ZSgpOyAvLyBCYWxhbmNlZCBieSByZXN0b3JlKCkgaW4gZW5kU2hhZG93TGF5
ZXIoKS4KKworICAgIC8vIEFsd2F5cyBjbGVhciB0aGUgc3VyZmFjZSBmaXJzdC4gRklYTUU6IHdl
IGNvdWxkIGF2b2lkIHRoZSBjbGVhciBvbiBmaXJzdCBhbGxvY2F0aW9uLgorICAgIC8vIEFkZCBh
IHBpeGVsIHRvIGF2b2lkIGxhdGVyIGVkZ2UgYWxpYXNpbmcgd2hlbiByb3RhdGVkLgorICAgIGxh
eWVyQ29udGV4dC0+Y2xlYXJSZWN0KEZsb2F0UmVjdCgwLCAwLCBtX2xheWVyU2l6ZS53aWR0aCgp
ICsgMSwgbV9sYXllclNpemUuaGVpZ2h0KCkgKyAxKSk7CisgICAgbGF5ZXJDb250ZXh0LT50cmFu
c2xhdGUobV9sYXllckNvbnRleHRUcmFuc2xhdGlvbik7CisKKyAgICByZXR1cm4gbGF5ZXJDb250
ZXh0OworfQorCit2b2lkIFNoYWRvd0JsdXI6OmVuZFNoYWRvd0xheWVyKEdyYXBoaWNzQ29udGV4
dCogZ3JhcGhpY3NDb250ZXh0KQoreworICAgIGlmICghbV9sYXllckltYWdlKQorICAgICAgICBy
ZXR1cm47CisgICAgICAgIAorICAgIG1fbGF5ZXJJbWFnZS0+Y29udGV4dCgpLT5yZXN0b3JlKCk7
CisKKyAgICBpZiAobV90eXBlID09IEJsdXJTaGFkb3cpIHsKKyAgICAgICAgSW50UmVjdCBibHVy
UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgbV9sYXllclNp
emUpKTsKKyAgICAgICAgUmVmUHRyPEJ5dGVBcnJheT4gbGF5ZXJEYXRhID0gbV9sYXllckltYWdl
LT5nZXRVbm11bHRpcGxpZWRJbWFnZURhdGEoYmx1clJlY3QpOworICAgICAgICBibHVyTGF5ZXJJ
bWFnZShsYXllckRhdGEtPmRhdGEoKSwgYmx1clJlY3Quc2l6ZSgpLCBibHVyUmVjdC53aWR0aCgp
ICogNCk7CisgICAgICAgIG1fbGF5ZXJJbWFnZS0+cHV0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKGxh
eWVyRGF0YS5nZXQoKSwgYmx1clJlY3Quc2l6ZSgpLCBibHVyUmVjdCwgSW50UG9pbnQoKSk7Cisg
ICAgfQorCisgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7CisKKyAgICBncmFwaGljc0NvbnRl
eHQtPmNsaXBUb0ltYWdlQnVmZmVyKG1fbGF5ZXJJbWFnZSwgRmxvYXRSZWN0KG1fbGF5ZXJPcmln
aW4sIG1fbGF5ZXJJbWFnZS0+c2l6ZSgpKSk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRGaWxs
Q29sb3IobV9jb2xvciwgbV9jb2xvclNwYWNlKTsKKworICAgIGdyYXBoaWNzQ29udGV4dC0+Y2xl
YXJTaGFkb3coKTsKKyAgICBncmFwaGljc0NvbnRleHQtPmZpbGxSZWN0KEZsb2F0UmVjdChtX2xh
eWVyT3JpZ2luLCBtX3NvdXJjZVJlY3Quc2l6ZSgpKSk7CisgICAgCisgICAgZ3JhcGhpY3NDb250
ZXh0LT5yZXN0b3JlKCk7CisKKyAgICBtX2xheWVySW1hZ2UgPSAwOworCisgICAgLy8gU2NoZWR1
bGUgYSBwdXJnZSBvZiB0aGUgc2NyYXRjaCBidWZmZXIuIFdlIGRvIG5vdCBuZWVkIHRvIGRlc3Ry
b3kgdGhlIHN1cmZhY2UuCisgICAgU2NyYXRjaEJ1ZmZlcjo6c2hhcmVkKCkuc2NoZWR1bGVTY3Jh
dGNoQnVmZmVyUHVyZ2UoKTsKK30KKwordm9pZCBTaGFkb3dCbHVyOjpkcmF3UmVjdFNoYWRvdyhH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiBzaGFkb3dl
ZFJlY3QsIGNvbnN0IFJvdW5kZWRJbnRSZWN0OjpSYWRpaSYgcmFkaWkpCit7CisgICAgLy8gZHJh
d1NoYWRvd2VkUmVjdCBkb2VzIG5vdCB3b3JrIHdpdGggcm90YXRpb25zLgorICAgIC8vIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTA0MgorICAgIGlmICghZ3JhcGhp
Y3NDb250ZXh0LT5nZXRDVE0oKS5pc0lkZW50aXR5T3JUcmFuc2xhdGlvbk9yRmxpcHBlZCgpIHx8
IG1fdHlwZSAhPSBCbHVyU2hhZG93KSB7CisgICAgICAgIGRyYXdSZWN0U2hhZG93V2l0aG91dFRp
bGluZyhncmFwaGljc0NvbnRleHQsIHNoYWRvd2VkUmVjdCwgcmFkaWksIDEpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaW50IHRlbXBsYXRlU2lkZUxlbmd0aCA9IDE7CisgICAgZmxv
YXQgdHdpY2VSYWRpdXMgPSBtX2JsdXJSYWRpdXMgKiAyOworICAgIAorICAgIC8vIEZpbmQgdGhl
IGV4dHJhIHNwYWNlIG5lZWRlZCBmcm9tIHRoZSBjdXJ2ZSBvZiB0aGUgY29ybmVycy4KKyAgICBp
bnQgZXh0cmFXaWR0aEZyb21Db3JuZXJSYWRpaSA9IHR3aWNlUmFkaXVzICsgbWF4KHJhZGlpLnRv
cExlZnQoKS53aWR0aCgpLCByYWRpaS5ib3R0b21MZWZ0KCkud2lkdGgoKSkgKyB0d2ljZVJhZGl1
cyArIG1heChyYWRpaS50b3BSaWdodCgpLndpZHRoKCksIHJhZGlpLmJvdHRvbVJpZ2h0KCkud2lk
dGgoKSk7CisgICAgaW50IGV4dHJhSGVpZ2h0RnJvbUNvcm5lclJhZGlpID0gdHdpY2VSYWRpdXMg
KyBtYXgocmFkaWkudG9wTGVmdCgpLmhlaWdodCgpLCByYWRpaS50b3BSaWdodCgpLmhlaWdodCgp
KSArIHR3aWNlUmFkaXVzICsgbWF4KHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSwgcmFkaWku
Ym90dG9tUmlnaHQoKS5oZWlnaHQoKSk7CisKKyAgICAvLyBUaGUgbGVuZ3RoIG9mIGEgc2lkZSBv
ZiB0aGUgYnVmZmVyIGlzIHRoZSBlbm91Z2ggc3BhY2UgZm9yIGZvdXIgYmx1ciByYWRpaSwKKyAg
ICAvLyB0aGUgcmFkaWkgb2YgdGhlIGNvcm5lcnMsIGFuZCB0aGVuIDEgcGl4ZWwgdG8gZHJhdyB0
aGUgc2lkZSB0aWxlcy4KKyAgICBJbnRTaXplIHNoYWRvd1RlbXBsYXRlU2l6ZSA9IEludFNpemUo
dGVtcGxhdGVTaWRlTGVuZ3RoICsgZXh0cmFXaWR0aEZyb21Db3JuZXJSYWRpaSwgdGVtcGxhdGVT
aWRlTGVuZ3RoICsgZXh0cmFIZWlnaHRGcm9tQ29ybmVyUmFkaWkpOworCisgICAgaWYgKHNoYWRv
d1RlbXBsYXRlU2l6ZS53aWR0aCgpID4gc2hhZG93ZWRSZWN0LndpZHRoKCkgfHwgc2hhZG93VGVt
cGxhdGVTaXplLmhlaWdodCgpID4gc2hhZG93ZWRSZWN0LmhlaWdodCgpKSB7CisgICAgICAgIGRy
YXdSZWN0U2hhZG93V2l0aG91dFRpbGluZyhncmFwaGljc0NvbnRleHQsIHNoYWRvd2VkUmVjdCwg
cmFkaWksIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGRp
bWVuc2lvbnMgb2Ygc2hhZG93IHJlY3QuCisgICAgRmxvYXRSZWN0IHNoYWRvd1JlY3QgPSBzaGFk
b3dlZFJlY3Q7CisgICAgc2hhZG93UmVjdC5pbmZsYXRlKG1fYmx1clJhZGl1cyk7IC8vIEZJWE1F
OiBkdXBsaWNhdGluZyBjb2RlIHdpdGggY2FsY3VsYXRlTGF5ZXJCb3VuZGluZ1JlY3QuCisKKyAg
ICAvLyBSZWR1Y2UgdGhlIHNpemUgb2Ygd2hhdCB3ZSBoYXZlIHRvIGRyYXcgd2l0aCB0aGUgY2xp
cCBhcmVhLgorICAgIGNhbGN1bGF0ZUxheWVyQm91bmRpbmdSZWN0KGdyYXBoaWNzQ29udGV4dCwg
c2hhZG93ZWRSZWN0LCBncmFwaGljc0NvbnRleHQtPmNsaXBCb3VuZHMoKSk7CisKKyAgICAvLyBJ
ZiB0aGUgdGVtcGxhdGUgYXJlYSBlbmRzIHVwIGJlaW5nIGxhcmdlciB0aGFuIHRoZSBhcmVhIHRv
IGJlIGJsdXJyZWQsIHVzZSB0aGUgc2ltcGxlIGNhc2UuCisgICAgLy8gRklYTUU6IHdoZW4gZG9l
cyB0aGlzIGhhcHBlbj8KKyAgICBpZiAoKHNoYWRvd1RlbXBsYXRlU2l6ZS53aWR0aCgpICogc2hh
ZG93VGVtcGxhdGVTaXplLmhlaWdodCgpID4gbV9zb3VyY2VSZWN0LndpZHRoKCkgKiBtX3NvdXJj
ZVJlY3QuaGVpZ2h0KCkpKSB7CisgICAgICAgIGRyYXdSZWN0U2hhZG93V2l0aG91dFRpbGluZyhn
cmFwaGljc0NvbnRleHQsIHNoYWRvd2VkUmVjdCwgcmFkaWksIDEpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIAorICAgIGRyYXdSZWN0U2hhZG93V2l0aFRpbGluZyhncmFwaGljc0NvbnRl
eHQsIHNoYWRvd2VkUmVjdCwgcmFkaWksIDEsIHNoYWRvd1RlbXBsYXRlU2l6ZSk7Cit9CisKK3Zv
aWQgU2hhZG93Qmx1cjo6ZHJhd1JlY3RTaGFkb3dXaXRob3V0VGlsaW5nKEdyYXBoaWNzQ29udGV4
dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHNoYWRvd2VkUmVjdCwgY29uc3Qg
Um91bmRlZEludFJlY3Q6OlJhZGlpJiByYWRpaSwgZmxvYXQgYWxwaGEpCit7CisgICAgR3JhcGhp
Y3NDb250ZXh0KiBzaGFkb3dDb250ZXh0ID0gYmVnaW5TaGFkb3dMYXllcihncmFwaGljc0NvbnRl
eHQsIHNoYWRvd2VkUmVjdCk7CisgICAgaWYgKCFzaGFkb3dDb250ZXh0KQorICAgICAgICByZXR1
cm47CisKKyAgICBQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRSb3VuZGVkUmVjdChzaGFkb3dlZFJl
Y3QsIHJhZGlpLnRvcExlZnQoKSwgcmFkaWkudG9wUmlnaHQoKSwgcmFkaWkuYm90dG9tTGVmdCgp
LCByYWRpaS5ib3R0b21SaWdodCgpKTsKKworICAgIHNoYWRvd0NvbnRleHQtPnNldEZpbGxDb2xv
cihDb2xvciguMGYsIC4wZiwgLjBmLCBhbHBoYSksIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAg
IHNoYWRvd0NvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworCisgICAgZW5kU2hhZG93TGF5ZXIoZ3Jh
cGhpY3NDb250ZXh0KTsKK30KKworLyoKKyAgVGhpcyBmdW5jdGlvbiB1c2VzIHRpbGluZyB0byBp
bXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgc2hhZG93CisgIGRyYXdpbmcgb2Ygcm91bmRl
ZCByZWN0YW5nbGVzLiBUaGUgY29kZSBiYXNpY2FsbHkgZG9lcyB0aGUgZm9sbG93aW5nCisgIHN0
ZXBzOgorCisgICAgIDEuIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc2hhZG93IHRlbXBsYXRl
LCBhIHJlY3RhbmdsZSB0aGF0CisgICAgIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5IHRpbGVz
IHRvIGRyYXcgdGhlIGNvbXBsZXRlIHNoYWRvdy4KKworICAgICAyLiBJZiB0aGF0IHNpemUgaXMg
c21hbGxlciB0aGFuIHRoZSByZWFsIHJlY3RhbmdsZSByZW5kZXIgdGhlIG5ldworICAgICB0ZW1w
bGF0ZSByZWN0YW5nbGUgYW5kIGl0cyBzaGFkb3cgaW4gYSBuZXcgc3VyZmFjZSwgaW4gb3RoZXIg
Y2FzZQorICAgICByZW5kZXIgdGhlIHNoYWRvdyBvZiB0aGUgcmVhbCByZWN0YW5nbGUgaW4gdGhl
IGRlc3RpbmF0aW9uCisgICAgIHN1cmZhY2UuCisKKyAgICAgMy4gQ2FsY3VsYXRlIHRoZSBzaXpl
cyBhbmQgcG9zaXRpb25zIG9mIHRoZSB0aWxlcyBhbmQgdGhlaXIKKyAgICAgZGVzdGluYXRpb25z
IGFuZCB1c2UgZHJhd1BhdHRlcm4gdG8gcmVuZGVyIHRoZSBmaW5hbCBzaGFkb3cuIFRoZQorICAg
ICBjb2RlIGRpdmlkZXMgdGhlIHJlbmRlcmluZyBpbiA4IHRpbGVzOgorCisgICAgICAgIDEgfCAy
IHwgMworICAgICAgIC0tLS0tLS0tLS0tCisgICAgICAgIDQgfCAgIHwgNQorICAgICAgIC0tLS0t
LS0tLS0tCisgICAgICAgIDYgfCA3IHwgOAorCisgICAgIFRoZSBjb3JuZXJzIGFyZSBkaXJlY3Rs
eSBjb3BpZWQgZnJvbSB0aGUgdGVtcGxhdGUgcmVjdGFuZ2xlIHRvIHRoZQorICAgICByZWFsIG9u
ZSBhbmQgdGhlIHNpZGUgdGlsZXMgYXJlIDEgcGl4ZWwgd2lkdGgsIHdlIHVzZSB0aGVtIGFzCisK
KyAgICAgdGlsZXMgdG8gY292ZXIgdGhlIGRlc3RpbmF0aW9uIHNpZGUuIFRoZSBjb3JuZXIgdGls
ZXMgYXJlIGJpZ2dlcgorICAgICB0aGFuIGp1c3QgdGhlIHNpZGUgb2YgdGhlIHJvdW5kZWQgY29y
bmVyLCB3ZSBuZWVkIHRvIGluY3JlYXNlIGl0CisgICAgIGJlY2F1c2UgdGhlIG1vZGlmaWNhdGlv
bnMgY2F1c2VkIGJ5IHRoZSBjb3JuZXIgb3ZlciB0aGUgYmx1cgorICAgICBlZmZlY3QuIFdlIGZp
bGwgdGhlIGNlbnRyYWwgcGFydCB3aXRoIHNvbGlkIGNvbG9yIHRvIGNvbXBsZXRlIHRoZQorICAg
ICBzaGFkb3cuCisgKi8KKwordm9pZCBTaGFkb3dCbHVyOjpkcmF3UmVjdFNoYWRvd1dpdGhUaWxp
bmcoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgc2hh
ZG93ZWRSZWN0LCBjb25zdCBSb3VuZGVkSW50UmVjdDo6UmFkaWkmIHJhZGlpLCBmbG9hdCBhbHBo
YSwgY29uc3QgSW50U2l6ZSYgc2hhZG93VGVtcGxhdGVTaXplKQoreworICAgIGZsb2F0IHR3aWNl
UmFkaXVzID0gbV9ibHVyUmFkaXVzICogMjsKKworICAgIC8vIFNpemUgb2YgdGhlIHRpbGluZyBz
aWRlLgorICAgIGludCB0ZW1wbGF0ZVNpZGVMZW5ndGggPSAxOworCisgICAgRmxvYXRSZWN0IHNo
YWRvd1JlY3QgPSBzaGFkb3dlZFJlY3Q7CisgICAgc2hhZG93UmVjdC5pbmZsYXRlKG1fYmx1clJh
ZGl1cyk7IC8vIEZJWE1FOiBkdXBsaWNhdGluZyBjb2RlIHdpdGggY2FsY3VsYXRlTGF5ZXJCb3Vu
ZGluZ1JlY3QuCisKKyAgICBzaGFkb3dSZWN0Lm1vdmUobV9vZmZzZXQud2lkdGgoKSwgbV9vZmZz
ZXQuaGVpZ2h0KCkpOworCisgICAgbV9sYXllckltYWdlID0gU2NyYXRjaEJ1ZmZlcjo6c2hhcmVk
KCkuZ2V0U2NyYXRjaEJ1ZmZlcihzaGFkb3dUZW1wbGF0ZVNpemUpOworCisgICAgLy8gRHJhdyBz
aGFkb3cgaW50byBhIG5ldyBJbWFnZUJ1ZmZlci4KKyAgICBHcmFwaGljc0NvbnRleHQqIHNoYWRv
d0NvbnRleHQgPSBtX2xheWVySW1hZ2UtPmNvbnRleHQoKTsKKyAgICBzaGFkb3dDb250ZXh0LT5z
YXZlKCk7CisgICAgCisgICAgc2hhZG93Q29udGV4dC0+Y2xlYXJSZWN0KEZsb2F0UmVjdCgwLCAw
LCBzaGFkb3dUZW1wbGF0ZVNpemUud2lkdGgoKSwgc2hhZG93VGVtcGxhdGVTaXplLmhlaWdodCgp
KSk7CisKKyAgICAvLyBEcmF3IHRoZSByZWN0YW5nbGUuCisgICAgSW50UmVjdCB0ZW1wbGF0ZVJl
Y3QgPSBJbnRSZWN0KG1fYmx1clJhZGl1cywgbV9ibHVyUmFkaXVzLCBzaGFkb3dUZW1wbGF0ZVNp
emUud2lkdGgoKSAtIHR3aWNlUmFkaXVzLCBzaGFkb3dUZW1wbGF0ZVNpemUuaGVpZ2h0KCkgLSB0
d2ljZVJhZGl1cyk7CisgICAgUGF0aCBwYXRoOworICAgIHBhdGguYWRkUm91bmRlZFJlY3QodGVt
cGxhdGVSZWN0LCByYWRpaS50b3BMZWZ0KCksIHJhZGlpLnRvcFJpZ2h0KCksIHJhZGlpLmJvdHRv
bUxlZnQoKSwgcmFkaWkuYm90dG9tUmlnaHQoKSk7CisKKyAgICBzaGFkb3dDb250ZXh0LT5zZXRG
aWxsQ29sb3IoQ29sb3IoLjBmLCAuMGYsIC4wZiwgYWxwaGEpLCBDb2xvclNwYWNlRGV2aWNlUkdC
KTsKKyAgICBzaGFkb3dDb250ZXh0LT5maWxsUGF0aChwYXRoKTsKKworICAgIC8vIEJsdXIgdGhl
IGltYWdlLgorICAgIHsKKyAgICAgICAgSW50UmVjdCBibHVyUmVjdChJbnRQb2ludCgpLCBzaGFk
b3dUZW1wbGF0ZVNpemUpOworICAgICAgICBSZWZQdHI8Qnl0ZUFycmF5PiBsYXllckRhdGEgPSBt
X2xheWVySW1hZ2UtPmdldFVubXVsdGlwbGllZEltYWdlRGF0YShibHVyUmVjdCk7CisgICAgICAg
IGJsdXJMYXllckltYWdlKGxheWVyRGF0YS0+ZGF0YSgpLCBibHVyUmVjdC5zaXplKCksIGJsdXJS
ZWN0LndpZHRoKCkgKiA0KTsKKyAgICAgICAgbV9sYXllckltYWdlLT5wdXRVbm11bHRpcGxpZWRJ
bWFnZURhdGEobGF5ZXJEYXRhLmdldCgpLCBibHVyUmVjdC5zaXplKCksIGJsdXJSZWN0LCBJbnRQ
b2ludCgpKTsKKyAgICB9CisKKyAgICAvLyBNYXNrIHRoZSBpbWFnZSB3aXRoIHRoZSBzaGFkb3cg
Y29sb3IuCisgICAgc2hhZG93Q29udGV4dC0+c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0
ZVNvdXJjZUluKTsKKyAgICBzaGFkb3dDb250ZXh0LT5zZXRGaWxsQ29sb3IobV9jb2xvciwgbV9j
b2xvclNwYWNlKTsKKyAgICBzaGFkb3dDb250ZXh0LT5maWxsUmVjdChGbG9hdFJlY3QoMCwgMCwg
c2hhZG93VGVtcGxhdGVTaXplLndpZHRoKCksIHNoYWRvd1RlbXBsYXRlU2l6ZS5oZWlnaHQoKSkp
OworICAgIAorICAgIHNoYWRvd0NvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIC8vIEZpbGwgdGhl
IGludGVybmFsIHBhcnQgb2YgdGhlIHNoYWRvdy4KKyAgICBzaGFkb3dSZWN0LmluZmxhdGUoLXR3
aWNlUmFkaXVzKTsKKyAgICBpZiAoIXNoYWRvd1JlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgIGdy
YXBoaWNzQ29udGV4dC0+c2F2ZSgpOworICAgICAgICAKKyAgICAgICAgcGF0aC5jbGVhcigpOwor
ICAgICAgICBwYXRoLmFkZFJvdW5kZWRSZWN0KHNoYWRvd1JlY3QsIHJhZGlpLnRvcExlZnQoKSwg
cmFkaWkudG9wUmlnaHQoKSwgcmFkaWkuYm90dG9tTGVmdCgpLCByYWRpaS5ib3R0b21SaWdodCgp
KTsKKworICAgICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihtX2NvbG9yLCBtX2Nv
bG9yU3BhY2UpOworICAgICAgICBncmFwaGljc0NvbnRleHQtPmZpbGxQYXRoKHBhdGgpOworICAg
ICAgICAKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZXN0b3JlKCk7CisgICAgfQorICAgIHNo
YWRvd1JlY3QuaW5mbGF0ZSh0d2ljZVJhZGl1cyk7CisKKyAgICAvLyBOb3RlIHRoYXQgZHJhd2lu
ZyB0aGUgSW1hZ2VCdWZmZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBJbWFnZSBhbmQgZHJh
d2luZyB0aGF0LAorICAgIC8vIGJlY2F1c2UgSW1hZ2VCdWZmZXI6OmRyYXcoKSBrbm93cyB0aGF0
IGl0IGRvZXNuJ3QgaGF2ZSB0byBjb3B5IHRoZSBpbWFnZSBiaXRzLgorICAgICAgICAKKyAgICAv
LyBEcmF3IHRvcCBzaWRlLgorICAgIEZsb2F0UmVjdCB0aWxlUmVjdCA9IEZsb2F0UmVjdCh0d2lj
ZVJhZGl1cyArIHJhZGlpLnRvcExlZnQoKS53aWR0aCgpLCAwLCB0ZW1wbGF0ZVNpZGVMZW5ndGgs
IHR3aWNlUmFkaXVzKTsKKyAgICBGbG9hdFJlY3QgZGVzdFJlY3QgPSB0aWxlUmVjdDsKKyAgICBk
ZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dSZWN0LnkoKSk7CisgICAgZGVzdFJl
Y3Quc2V0V2lkdGgoc2hhZG93UmVjdC53aWR0aCgpIC0gcmFkaWkudG9wTGVmdCgpLndpZHRoKCkg
LSByYWRpaS50b3BSaWdodCgpLndpZHRoKCkgLSBtX2JsdXJSYWRpdXMgKiA0KTsKKyAgICBncmFw
aGljc0NvbnRleHQtPmRyYXdJbWFnZUJ1ZmZlcihtX2xheWVySW1hZ2UsIENvbG9yU3BhY2VEZXZp
Y2VSR0IsIGRlc3RSZWN0LCB0aWxlUmVjdCk7CisKKyAgICAvLyBEcmF3IHRoZSBib3R0b20gc2lk
ZS4KKyAgICB0aWxlUmVjdCA9IEZsb2F0UmVjdCh0d2ljZVJhZGl1cyArIHJhZGlpLmJvdHRvbUxl
ZnQoKS53aWR0aCgpLCBzaGFkb3dUZW1wbGF0ZVNpemUuaGVpZ2h0KCkgLSB0d2ljZVJhZGl1cywg
dGVtcGxhdGVTaWRlTGVuZ3RoLCB0d2ljZVJhZGl1cyk7CisgICAgZGVzdFJlY3QgPSB0aWxlUmVj
dDsKKyAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dSZWN0LnkoKSArIHR3
aWNlUmFkaXVzICsgc2hhZG93ZWRSZWN0LmhlaWdodCgpIC0gc2hhZG93VGVtcGxhdGVTaXplLmhl
aWdodCgpKTsKKyAgICBkZXN0UmVjdC5zZXRXaWR0aChzaGFkb3dSZWN0LndpZHRoKCkgLSByYWRp
aS5ib3R0b21MZWZ0KCkud2lkdGgoKSAtIHJhZGlpLmJvdHRvbVJpZ2h0KCkud2lkdGgoKSAtIG1f
Ymx1clJhZGl1cyAqIDQpOworICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKG1f
bGF5ZXJJbWFnZSwgQ29sb3JTcGFjZURldmljZVJHQiwgZGVzdFJlY3QsIHRpbGVSZWN0KTsKKwor
ICAgIC8vIERyYXcgdGhlIHJpZ2h0IHNpZGUuCisgICAgdGlsZVJlY3QgPSBGbG9hdFJlY3Qoc2hh
ZG93VGVtcGxhdGVTaXplLndpZHRoKCkgLSB0d2ljZVJhZGl1cywgdHdpY2VSYWRpdXMgKyByYWRp
aS50b3BSaWdodCgpLmhlaWdodCgpLCB0d2ljZVJhZGl1cywgdGVtcGxhdGVTaWRlTGVuZ3RoKTsK
KyAgICBkZXN0UmVjdCA9IHRpbGVSZWN0OworICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93UmVjdC54
KCkgKyB0d2ljZVJhZGl1cyArIHNoYWRvd2VkUmVjdC53aWR0aCgpIC0gc2hhZG93VGVtcGxhdGVT
aXplLndpZHRoKCksIHNoYWRvd1JlY3QueSgpKTsKKyAgICBkZXN0UmVjdC5zZXRIZWlnaHQoc2hh
ZG93UmVjdC5oZWlnaHQoKSAtIHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkgLSByYWRpaS5ib3R0
b21SaWdodCgpLmhlaWdodCgpIC0gbV9ibHVyUmFkaXVzICogNCk7CisgICAgZ3JhcGhpY3NDb250
ZXh0LT5kcmF3SW1hZ2VCdWZmZXIobV9sYXllckltYWdlLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBk
ZXN0UmVjdCwgdGlsZVJlY3QpOworCisgICAgLy8gRHJhdyB0aGUgbGVmdCBzaWRlLgorICAgIHRp
bGVSZWN0ID0gRmxvYXRSZWN0KDAsIHR3aWNlUmFkaXVzICsgcmFkaWkudG9wTGVmdCgpLmhlaWdo
dCgpLCB0d2ljZVJhZGl1cywgdGVtcGxhdGVTaWRlTGVuZ3RoKTsKKyAgICBkZXN0UmVjdCA9IHRp
bGVSZWN0OworICAgIGRlc3RSZWN0Lm1vdmUoc2hhZG93UmVjdC54KCksIHNoYWRvd1JlY3QueSgp
KTsKKyAgICBkZXN0UmVjdC5zZXRIZWlnaHQoc2hhZG93UmVjdC5oZWlnaHQoKSAtIHJhZGlpLnRv
cExlZnQoKS5oZWlnaHQoKSAtIHJhZGlpLmJvdHRvbUxlZnQoKS5oZWlnaHQoKSAtIG1fYmx1clJh
ZGl1cyAqIDQpOworICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKG1fbGF5ZXJJ
bWFnZSwgQ29sb3JTcGFjZURldmljZVJHQiwgZGVzdFJlY3QsIHRpbGVSZWN0KTsKKworICAgIC8v
IERyYXcgdGhlIHRvcCBsZWZ0IGNvcm5lci4KKyAgICB0aWxlUmVjdCA9IEZsb2F0UmVjdCgwLCAw
LCB0d2ljZVJhZGl1cyArIHJhZGlpLnRvcExlZnQoKS53aWR0aCgpLCB0d2ljZVJhZGl1cyArIHJh
ZGlpLnRvcExlZnQoKS5oZWlnaHQoKSk7CisgICAgZGVzdFJlY3QgPSB0aWxlUmVjdDsKKyAgICBk
ZXN0UmVjdC5tb3ZlKHNoYWRvd1JlY3QueCgpLCBzaGFkb3dSZWN0LnkoKSk7CisgICAgZ3JhcGhp
Y3NDb250ZXh0LT5kcmF3SW1hZ2VCdWZmZXIobV9sYXllckltYWdlLCBDb2xvclNwYWNlRGV2aWNl
UkdCLCBkZXN0UmVjdCwgdGlsZVJlY3QpOworCisgICAgLy8gRHJhdyB0aGUgdG9wIHJpZ2h0IGNv
cm5lci4KKyAgICB0aWxlUmVjdCA9IEZsb2F0UmVjdChzaGFkb3dUZW1wbGF0ZVNpemUud2lkdGgo
KSAtIHR3aWNlUmFkaXVzIC0gcmFkaWkudG9wUmlnaHQoKS53aWR0aCgpLCAwLCB0d2ljZVJhZGl1
cyArIHJhZGlpLnRvcFJpZ2h0KCkud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0
d2ljZVJhZGl1cyArIHJhZGlpLnRvcFJpZ2h0KCkuaGVpZ2h0KCkpOworICAgIGRlc3RSZWN0ID0g
dGlsZVJlY3Q7CisgICAgZGVzdFJlY3QubW92ZShzaGFkb3dSZWN0LngoKSArIHNoYWRvd2VkUmVj
dC53aWR0aCgpIC0gc2hhZG93VGVtcGxhdGVTaXplLndpZHRoKCkgKyB0d2ljZVJhZGl1cywgc2hh
ZG93UmVjdC55KCkpOworICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKG1fbGF5
ZXJJbWFnZSwgQ29sb3JTcGFjZURldmljZVJHQiwgZGVzdFJlY3QsIHRpbGVSZWN0KTsKKworICAg
IC8vIERyYXcgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuCisgICAgdGlsZVJlY3QgPSBGbG9hdFJl
Y3Qoc2hhZG93VGVtcGxhdGVTaXplLndpZHRoKCkgLSB0d2ljZVJhZGl1cyAtIHJhZGlpLmJvdHRv
bVJpZ2h0KCkud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dUZW1wbGF0
ZVNpemUuaGVpZ2h0KCkgLSB0d2ljZVJhZGl1cyAtIHJhZGlpLmJvdHRvbVJpZ2h0KCkuaGVpZ2h0
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHdpY2VSYWRpdXMgKyByYWRpaS5ib3R0b21S
aWdodCgpLndpZHRoKCksIHR3aWNlUmFkaXVzICsgcmFkaWkuYm90dG9tUmlnaHQoKS5oZWlnaHQo
KSk7CisgICAgZGVzdFJlY3QgPSB0aWxlUmVjdDsKKyAgICBkZXN0UmVjdC5tb3ZlKHNoYWRvd1Jl
Y3QueCgpICsgc2hhZG93ZWRSZWN0LndpZHRoKCkgLSBzaGFkb3dUZW1wbGF0ZVNpemUud2lkdGgo
KSArIHR3aWNlUmFkaXVzLAorICAgICAgICAgICAgICAgICAgc2hhZG93UmVjdC55KCkgKyBzaGFk
b3dlZFJlY3QuaGVpZ2h0KCkgLSBzaGFkb3dUZW1wbGF0ZVNpemUuaGVpZ2h0KCkgKyB0d2ljZVJh
ZGl1cyk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VCdWZmZXIobV9sYXllckltYWdl
LCBDb2xvclNwYWNlRGV2aWNlUkdCLCBkZXN0UmVjdCwgdGlsZVJlY3QpOworCisgICAgLy8gRHJh
dyB0aGUgYm90dG9tIGxlZnQgY29ybmVyLgorICAgIHRpbGVSZWN0ID0gRmxvYXRSZWN0KDAsIHNo
YWRvd1RlbXBsYXRlU2l6ZS5oZWlnaHQoKSAtIHR3aWNlUmFkaXVzIC0gcmFkaWkuYm90dG9tTGVm
dCgpLmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR3aWNlUmFkaXVzICsgcmFk
aWkuYm90dG9tTGVmdCgpLndpZHRoKCksIHR3aWNlUmFkaXVzICsgcmFkaWkuYm90dG9tTGVmdCgp
LmhlaWdodCgpKTsKKyAgICBkZXN0UmVjdCA9IHRpbGVSZWN0OworICAgIGRlc3RSZWN0Lm1vdmUo
c2hhZG93UmVjdC54KCksIHNoYWRvd1JlY3QueSgpICsgc2hhZG93ZWRSZWN0LmhlaWdodCgpIC0g
c2hhZG93VGVtcGxhdGVTaXplLmhlaWdodCgpICsgdHdpY2VSYWRpdXMpOworICAgIGdyYXBoaWNz
Q29udGV4dC0+ZHJhd0ltYWdlQnVmZmVyKG1fbGF5ZXJJbWFnZSwgQ29sb3JTcGFjZURldmljZVJH
QiwgZGVzdFJlY3QsIHRpbGVSZWN0KTsKKworICAgIG1fbGF5ZXJJbWFnZSA9IDA7CisgICAgLy8g
U2NoZWR1bGUgYSBwdXJnZSBvZiB0aGUgc2NyYXRjaCBidWZmZXIuCisgICAgU2NyYXRjaEJ1ZmZl
cjo6c2hhcmVkKCkuc2NoZWR1bGVTY3JhdGNoQnVmZmVyUHVyZ2UoKTsKK30KKworI2lmICFQTEFU
Rk9STShDRykKK0ludFJlY3QgU2hhZG93Qmx1cjo6Y2xpcEJvdW5kcyhHcmFwaGljc0NvbnRleHQq
KQoreworICAgIC8vIEZJWE1FOiBhZGQgY2xpcEJvdW5kcygpIHRvIEdyYXBoaWNzQ29udGV4dC4K
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gSW50UmVjdCgpOworfQorI2Vu
ZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL1NoYWRvd0JsdXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL1NoYWRvd0JsdXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hOTNlYjRkODZmNjFlZDk5ODI1MzZl
ODYzNWRhZWQ0OTRjNzM1OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvU2hhZG93Qmx1ci5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTEgQXBwbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlbmNoYSwg
SW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpZm5kZWYgU2hhZG93Qmx1cl9oCisjZGVmaW5lIFNoYWRvd0JsdXJfaAorCisjaW5j
bHVkZSAiQ29sb3IuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJSb3VuZGVk
SW50UmVjdC5oIgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIEFmZmluZVRyYW5zZm9ybTsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsK
K2NsYXNzIEltYWdlQnVmZmVyOworCitjbGFzcyBTaGFkb3dCbHVyIHsKKyAgICBXVEZfTUFLRV9O
T05DT1BZQUJMRShTaGFkb3dCbHVyKTsKK3B1YmxpYzoKKyAgICBTaGFkb3dCbHVyKGZsb2F0IHJh
ZGl1cywgY29uc3QgRmxvYXRTaXplJiBvZmZzZXQsIGNvbnN0IENvbG9yJiwgQ29sb3JTcGFjZSk7
CisKKyAgICB2b2lkIHNldFNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKGJvb2wgaWdub3JlVHJhbnNm
b3JtcykgeyBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zID0gaWdub3JlVHJhbnNmb3JtczsgfQor
ICAgIGJvb2wgc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMoKSBjb25zdCB7IHJldHVybiBtX3NoYWRv
d3NJZ25vcmVUcmFuc2Zvcm1zOyB9CisKKyAgICB2b2lkIGRyYXdSZWN0U2hhZG93KEdyYXBoaWNz
Q29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IFJvdW5kZWRJbnRSZWN0OjpSYWRpaSYp
OworCitwcml2YXRlOgorICAgIEdyYXBoaWNzQ29udGV4dCogYmVnaW5TaGFkb3dMYXllcihHcmFw
aGljc0NvbnRleHQqLCBjb25zdCBGbG9hdFJlY3QmIGxheWVyQXJlYSk7CisgICAgdm9pZCBlbmRT
aGFkb3dMYXllcihHcmFwaGljc0NvbnRleHQqKTsKKworICAgIHZvaWQgYWRqdXN0Qmx1ckRpc3Rh
bmNlKEdyYXBoaWNzQ29udGV4dCopOworICAgIHZvaWQgYmx1ckxheWVySW1hZ2UodW5zaWduZWQg
Y2hhciosIGNvbnN0IEludFNpemUmLCBpbnQgc3RyaWRlKTsKKyAgICBJbnRSZWN0IGNhbGN1bGF0
ZUxheWVyQm91bmRpbmdSZWN0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYgbGF5
ZXJBcmVhLCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCk7CisKKyAgICB2b2lkIGRyYXdSZWN0U2hh
ZG93V2l0aG91dFRpbGluZyhHcmFwaGljc0NvbnRleHQqLCBjb25zdCBGbG9hdFJlY3QmLCBjb25z
dCBSb3VuZGVkSW50UmVjdDo6UmFkaWkmLCBmbG9hdCBhbHBoYSk7CisgICAgdm9pZCBkcmF3UmVj
dFNoYWRvd1dpdGhUaWxpbmcoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiwgY29u
c3QgUm91bmRlZEludFJlY3Q6OlJhZGlpJiwgZmxvYXQgYWxwaGEsIGNvbnN0IEludFNpemUmIHNo
YWRvd1RlbXBsYXRlU2l6ZSk7CisgICAgCisgICAgZW51bSBTaGFkb3dUeXBlIHsKKyAgICAgICAg
Tm9TaGFkb3csCisgICAgICAgIFNvbGlkU2hhZG93LAorICAgICAgICBCbHVyU2hhZG93CisgICAg
fTsKKyAgICAKKyAgICBTaGFkb3dUeXBlIG1fdHlwZTsKKworICAgIENvbG9yIG1fY29sb3I7Cisg
ICAgQ29sb3JTcGFjZSBtX2NvbG9yU3BhY2U7CisgICAgZmxvYXQgbV9ibHVyUmFkaXVzOworICAg
IEZsb2F0U2l6ZSBtX29mZnNldDsKKworICAgIEltYWdlQnVmZmVyKiBtX2xheWVySW1hZ2U7IC8v
IEJ1ZmZlciB0byB3aGVyZSB0aGUgdGVtcG9yYXJ5IHNoYWRvdyB3aWxsIGJlIGRyYXduIHRvLgor
CisgICAgRmxvYXRSZWN0IG1fc291cmNlUmVjdDsgLy8gU3ViLXJlY3Qgb2YgbV9sYXllckltYWdl
IHRoYXQgY29udGFpbnMgdGhlIHNoYWRvdyBwaXhlbHMuCisgICAgRmxvYXRQb2ludCBtX2xheWVy
T3JpZ2luOyAvLyBUb3AtbGVmdCBjb3JuZXIgb2YgdGhlIChwb3NzaWJseSBjbGlwcGVkKSBib3Vu
ZGluZyByZWN0IHRvIGRyYXcgdGhlIHNoYWRvdyB0by4KKyAgICBGbG9hdFNpemUgbV9sYXllclNp
emU7IC8vIFNpemUgb2YgbV9sYXllckltYWdlIHBpeGVscyB0aGF0IG5lZWQgYmx1cnJpbmcuCisg
ICAgRmxvYXRTaXplIG1fbGF5ZXJDb250ZXh0VHJhbnNsYXRpb247IC8vIFRyYW5zbGF0aW9uIHRv
IGFwcGx5IHRvIG1fbGF5ZXJDb250ZXh0IGZvciB0aGUgc2hhZG93IHRvIGJlIGNvcnJlY3RseSBj
bGlwcGVkLgorCisgICAgYm9vbCBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU2hhZG93Qmx1cl9oCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRD
Ry5jcHAKaW5kZXggNjE0MjU2OThlNTU3OTg4ODUzZWQzZTI5OGRkZTc4NmUxZDQ1NjQ0Zi4uNjAz
NTZiNmY1ODM2ZDM3M2ZiYTJkMTZhZmY0MTc0OTY3YTJiZmFkZCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0Q0cuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dENHLmNw
cApAQCAtNzI3LDYgKzcyNywxMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBhdGgoY29u
c3QgUGF0aCYgcGF0aCwgV2luZFJ1bGUgY2xpcFJ1bGUpCiAgICAgICAgIENHQ29udGV4dENsaXAo
Y29udGV4dCk7CiB9CiAKK0ludFJlY3QgR3JhcGhpY3NDb250ZXh0OjpjbGlwQm91bmRzKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChDR0NvbnRleHRHZXRDbGlwQm91bmRp
bmdCb3gocGxhdGZvcm1Db250ZXh0KCkpKTsKK30KKwogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFk
ZElubmVyUm91bmRlZFJlY3RDbGlwKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCB0aGlja25lc3Mp
CiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
</data>
<flag name="review"
          id="72102"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
      

    </bug>

</bugzilla>