<?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>178080</bug_id>
          
          <creation_ts>2017-10-09 05:20:57 -0700</creation_ts>
          <short_desc>[GTK][WPE] Fix review comments on WEBPImageDecoder</short_desc>
          <delta_ts>2017-10-20 04:08:17 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Miguel Gomez">magomez</reporter>
          <assigned_to name="Miguel Gomez">magomez</assigned_to>
          <cc>bugs-noreply</cc>
    
    <cc>commit-queue</cc>
    
    <cc>sabouhallawa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1358219</commentid>
    <comment_count>0</comment_count>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-09 05:20:57 -0700</bug_when>
    <thetext>This bug is to address review comments made by Said to the WEBPImageDecoder implementation, in https://bugs.webkit.org/show_bug.cgi?id=113124#c24</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1358223</commentid>
    <comment_count>1</comment_count>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-09 05:27:51 -0700</bug_when>
    <thetext>Said, I was fixing your comments and I found something weird when replacing the usage of DecodingStatus::Partial. My idea was to set the buffer status to DecodingStatus::Decoding at the end of initFrameBuffer(), and then, set it to DecodingStatus::Complete if everything goes fine, or set it to DecodingStatus::Partial if there isn&apos;t enough data to decode the frame, but I found this inside ImageFrame.cpp:

void ImageFrame::setDecodingStatus(DecodingStatus decodingStatus)
{
    ASSERT(decodingStatus != DecodingStatus::Decoding);
    m_decodingStatus = decodingStatus;
}

DecodingStatus ImageFrame::decodingStatus() const
{
    ASSERT(m_decodingStatus != DecodingStatus::Decoding);
    return m_decodingStatus;
}

The asserts seem to imply that DecodingStatus::Decoding should not be used for some reason, but I don&apos;t get why. Is there any reason for this? Or are those asserts legacy code that could be removed? That code seems to be only used for the image decoders in Source/WebCore/platform/image-decoders/.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1360739</commentid>
    <comment_count>2</comment_count>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-16 04:59:23 -0700</bug_when>
    <thetext>(In reply to Miguel Gomez from comment #1)
&gt; Said, I was fixing your comments and I found something weird when replacing
&gt; the usage of DecodingStatus::Partial. My idea was to set the buffer status
&gt; to DecodingStatus::Decoding at the end of initFrameBuffer(), and then, set
&gt; it to DecodingStatus::Complete if everything goes fine, or set it to
&gt; DecodingStatus::Partial if there isn&apos;t enough data to decode the frame, but
&gt; I found this inside ImageFrame.cpp:
&gt; 
&gt; void ImageFrame::setDecodingStatus(DecodingStatus decodingStatus)
&gt; {
&gt;     ASSERT(decodingStatus != DecodingStatus::Decoding);
&gt;     m_decodingStatus = decodingStatus;
&gt; }
&gt; 
&gt; DecodingStatus ImageFrame::decodingStatus() const
&gt; {
&gt;     ASSERT(m_decodingStatus != DecodingStatus::Decoding);
&gt;     return m_decodingStatus;
&gt; }
&gt; 
&gt; The asserts seem to imply that DecodingStatus::Decoding should not be used
&gt; for some reason, but I don&apos;t get why. Is there any reason for this? Or are
&gt; those asserts legacy code that could be removed? That code seems to be only
&gt; used for the image decoders in Source/WebCore/platform/image-decoders/.

Said, please, could you give a look to this? Thanks in advance!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1360852</commentid>
    <comment_count>3</comment_count>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2017-10-16 11:34:24 -0700</bug_when>
    <thetext>(In reply to Miguel Gomez from comment #2)
&gt; (In reply to Miguel Gomez from comment #1)
&gt; &gt; Said, I was fixing your comments and I found something weird when replacing
&gt; &gt; the usage of DecodingStatus::Partial. My idea was to set the buffer status
&gt; &gt; to DecodingStatus::Decoding at the end of initFrameBuffer(), and then, set
&gt; &gt; it to DecodingStatus::Complete if everything goes fine, or set it to
&gt; &gt; DecodingStatus::Partial if there isn&apos;t enough data to decode the frame, but
&gt; &gt; I found this inside ImageFrame.cpp:
&gt; &gt; 
&gt; &gt; void ImageFrame::setDecodingStatus(DecodingStatus decodingStatus)
&gt; &gt; {
&gt; &gt;     ASSERT(decodingStatus != DecodingStatus::Decoding);
&gt; &gt;     m_decodingStatus = decodingStatus;
&gt; &gt; }
&gt; &gt; 
&gt; &gt; DecodingStatus ImageFrame::decodingStatus() const
&gt; &gt; {
&gt; &gt;     ASSERT(m_decodingStatus != DecodingStatus::Decoding);
&gt; &gt;     return m_decodingStatus;
&gt; &gt; }
&gt; &gt; 
&gt; &gt; The asserts seem to imply that DecodingStatus::Decoding should not be used
&gt; &gt; for some reason, but I don&apos;t get why. Is there any reason for this? Or are
&gt; &gt; those asserts legacy code that could be removed? That code seems to be only
&gt; &gt; used for the image decoders in Source/WebCore/platform/image-decoders/.
&gt; 
&gt; Said, please, could you give a look to this? Thanks in advance!

Miguel, sorry for the delay. 

The ImageFrame which is cached by the ImageFrameCache should have its m_decodingStatus be one of the following values: { Invalid, Partial, Complete } depending on the how much data was decoded inside this ImageFrame::m_nativeImage.
-- If nothing is decoded, then m_decodingStatus should be Invalid.
-- If there is not enough data to decode the frame, then m_decodingStatus is Partial.
-- If all the data is available to decode the frame then m_decodingStatus is Complete.

The DecodingStatus::Decoding is used outside the ImageFrame and it is always used for the status of the current frame: BitmapImage::m_currentFrameDecodingStatus whose value is one of the following { Invalid, Partial, Complete, Decoding }

The reason for this distinction is we cache the ImageFrame in the ImageFrameCache::m_frames only when the decoding finishes. So there is no case where the ImageFrameCache caches an ImageFrame with ImageFrame:: m_decodingStatus equals to DecodingStatus::Decoding.

If you want to still use the DecodingStatus::Decoding when the GTK decoder creates its internal ImageFrames, you can can change the above assertions to be like this:

ASSERT_IMPLIES(!hasBackingStore(), decodingStatus != DecodingStatus::Decoding);

And you can expose ImageFrame::hasBackingStore() for all platforms where it is going to return false for CG platforms always:

#if !USE(CG)
    ImageBackingStore* backingStore() const { return m_backingStore ? m_backingStore.get() : nullptr; }
    bool hasBackingStore() const { return backingStore(); }
else
    bool hasBackingStore() const { return false; }
#endif


Thanks,
Said</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1361170</commentid>
    <comment_count>4</comment_count>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-17 01:30:40 -0700</bug_when>
    <thetext>&gt; The ImageFrame which is cached by the ImageFrameCache should have its
&gt; m_decodingStatus be one of the following values: { Invalid, Partial,
&gt; Complete } depending on the how much data was decoded inside this
&gt; ImageFrame::m_nativeImage.
&gt; -- If nothing is decoded, then m_decodingStatus should be Invalid.
&gt; -- If there is not enough data to decode the frame, then m_decodingStatus is
&gt; Partial.
&gt; -- If all the data is available to decode the frame then m_decodingStatus is
&gt; Complete.
&gt; 
&gt; The DecodingStatus::Decoding is used outside the ImageFrame and it is always
&gt; used for the status of the current frame:
&gt; BitmapImage::m_currentFrameDecodingStatus whose value is one of the
&gt; following { Invalid, Partial, Complete, Decoding }
&gt; 
&gt; The reason for this distinction is we cache the ImageFrame in the
&gt; ImageFrameCache::m_frames only when the decoding finishes. So there is no
&gt; case where the ImageFrameCache caches an ImageFrame with ImageFrame::
&gt; m_decodingStatus equals to DecodingStatus::Decoding.
&gt; 
&gt; If you want to still use the DecodingStatus::Decoding when the GTK decoder
&gt; creates its internal ImageFrames, you can can change the above assertions to
&gt; be like this:
&gt; 
&gt; ASSERT_IMPLIES(!hasBackingStore(), decodingStatus !=
&gt; DecodingStatus::Decoding);
&gt; 
&gt; And you can expose ImageFrame::hasBackingStore() for all platforms where it
&gt; is going to return false for CG platforms always:
&gt; 
&gt; #if !USE(CG)
&gt;     ImageBackingStore* backingStore() const { return m_backingStore ?
&gt; m_backingStore.get() : nullptr; }
&gt;     bool hasBackingStore() const { return backingStore(); }
&gt; else
&gt;     bool hasBackingStore() const { return false; }
&gt; #endif

Thanks for the explanation Said!!
Ok, for this patch I&apos;m going to use only Invalid, Partial and Complete with the meanings you mention. If we decide to use Decoding in the end, I&apos;ll create a new bug to change that to all the decoders and not only the WebP one.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1361184</commentid>
    <comment_count>5</comment_count>
      <attachid>324005</attachid>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-17 02:38:39 -0700</bug_when>
    <thetext>Created attachment 324005
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362241</commentid>
    <comment_count>6</comment_count>
      <attachid>324005</attachid>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2017-10-19 12:08:23 -0700</bug_when>
    <thetext>Comment on attachment 324005
Patch

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

&gt; Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp:38
&gt; +    return WebPDemuxGetFrame(demuxer, index + 1, webpFrame);

Maybe it is worthy adding a comment that this wrapper was added because WebPDemuxGetFrame is 1-based function.

&gt; Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp:123
&gt;          }

I think this loop is a little bit confusing. The problem is you have two different things you want to check in the same loop. I would suggest splitting the complete test from the alpha and the disposal method test:

size_t firstIncompleteFrame = frameIndex;
for (; firstIncompleteFrame; --firstIncompleteFrame) {
    if (m_frameBufferCache[firstIncompleteFrame - 1].isComplete())
        break;
}

for (size_t firstIndependentFrame = frameIndex; firstIndependentFrame &gt; firstIncompleteFrame ; --firstIndependentFrame) {
    WebPIterator webpFrame;
    if (!webpFrameAtIndex(demuxer, firstIndependentFrame, &amp;webpFrame))
        continue;

    IntRect frameRect(webpFrame.x_offset, webpFrame.y_offset, webpFrame.width, webpFrame.height);
    if (!frameRect.contains({ { }, size() }))
        continue;

    if (!webpFrame.has_alpha)
        return firstIndependentFrame;

    if (firstIndependentFrame &lt; frameIndex &amp;&amp; m_frameBufferCache[firstIndependentFrame].disposalMethod() == ImageFrame::DisposalMethod::RestoreToBackground)
        return firstIndependentFrame + 1;  
}

return firstIncompleteFrame;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362613</commentid>
    <comment_count>7</comment_count>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-20 01:30:19 -0700</bug_when>
    <thetext>(In reply to Said Abou-Hallawa from comment #6)
&gt; Comment on attachment 324005 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=324005&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp:38
&gt; &gt; +    return WebPDemuxGetFrame(demuxer, index + 1, webpFrame);
&gt; 
&gt; Maybe it is worthy adding a comment that this wrapper was added because
&gt; WebPDemuxGetFrame is 1-based function.

Sure!

&gt; &gt; Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp:123
&gt; &gt;          }
&gt; 
&gt; I think this loop is a little bit confusing. The problem is you have two
&gt; different things you want to check in the same loop. I would suggest
&gt; splitting the complete test from the alpha and the disposal method test:
&gt; 
&gt; size_t firstIncompleteFrame = frameIndex;
&gt; for (; firstIncompleteFrame; --firstIncompleteFrame) {
&gt;     if (m_frameBufferCache[firstIncompleteFrame - 1].isComplete())
&gt;         break;
&gt; }
&gt; 
&gt; for (size_t firstIndependentFrame = frameIndex; firstIndependentFrame &gt;
&gt; firstIncompleteFrame ; --firstIndependentFrame) {
&gt;     WebPIterator webpFrame;
&gt;     if (!webpFrameAtIndex(demuxer, firstIndependentFrame, &amp;webpFrame))
&gt;         continue;
&gt; 
&gt;     IntRect frameRect(webpFrame.x_offset, webpFrame.y_offset,
&gt; webpFrame.width, webpFrame.height);
&gt;     if (!frameRect.contains({ { }, size() }))
&gt;         continue;
&gt; 
&gt;     if (!webpFrame.has_alpha)
&gt;         return firstIndependentFrame;
&gt; 
&gt;     if (firstIndependentFrame &lt; frameIndex &amp;&amp;
&gt; m_frameBufferCache[firstIndependentFrame].disposalMethod() ==
&gt; ImageFrame::DisposalMethod::RestoreToBackground)
&gt;         return firstIndependentFrame + 1;  
&gt; }
&gt; 
&gt; return firstIncompleteFrame;

Yes, the loop is a bit complex cause I&apos;m trying to find the first frame that fulfills one of the three conditions. But your approach looks good. I&apos;ll change it.
Thanks for the feedback Said! :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362627</commentid>
    <comment_count>8</comment_count>
      <attachid>324378</attachid>
    <who name="Miguel Gomez">magomez</who>
    <bug_when>2017-10-20 02:08:04 -0700</bug_when>
    <thetext>Created attachment 324378
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362644</commentid>
    <comment_count>9</comment_count>
      <attachid>324378</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-20 04:08:15 -0700</bug_when>
    <thetext>Comment on attachment 324378
Patch

Clearing flags on attachment: 324378

Committed r223754: &lt;https://trac.webkit.org/changeset/223754&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362645</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-20 04:08:17 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>324005</attachid>
            <date>2017-10-17 02:38:39 -0700</date>
            <delta_ts>2017-10-20 02:08:00 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-178080-20171017113838.patch</filename>
            <type>text/plain</type>
            <size>10899</size>
            <attacher name="Miguel Gomez">magomez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIzNDc3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNDY3YmQzMmFkMGVmYzY5
NWYyZGJhMmZhOGRiZGI2NGY1ZjI3NjA5MC4uMjQ5NDdiMGM4Y2U0MGMxOTY3NWRiNzAwYmRhYjIz
NzExNDQ2NTI4MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDE3LTEwLTE3ICBNaWd1
ZWwgR29tZXogIDxtYWdvbWV6QGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS11bV1BFXSBGaXgg
cmV2aWV3IGNvbW1lbnRzIG9uIFdFQlBJbWFnZURlY29kZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3ODA4MAorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFByb3Blcmx5IGZyZWUgdGhlIGRlbXV4ZXIgaW4g
Y2FzZSBvZiBlcnJvciwgaW1wcm92ZSB0aGUgY29kZSB0byBkZXRlY3QgdGhlIGZpcnN0CisgICAg
ICAgIHJlcXVpcmVkIGZyYW1lIHRvIGRlY29kZSwgZml4IHRoZSB1c2FnZSBvZiB0aGUgRGVjb2Rp
bmdTdGF0dXMgYW5kIHNvbWUgc3R5bGluZworICAgICAgICBjaGFuZ2VzLgorCisgICAgICAgIENv
dmVyZWQgYnkgZXhpc3RlbnQgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1kZWNv
ZGVycy93ZWJwL1dFQlBJbWFnZURlY29kZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6d2VicEZy
YW1lQXRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpXRUJQSW1hZ2VEZWNvZGVyOjpmaW5kRmly
c3RSZXF1aXJlZEZyYW1lVG9EZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6V0VCUEltYWdlRGVj
b2Rlcjo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OldFQlBJbWFnZURlY29kZXI6OmRlY29k
ZUZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OldFQlBJbWFnZURlY29kZXI6OmluaXRGcmFtZUJ1
ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpXRUJQSW1hZ2VEZWNvZGVyOjpjbGVhckZyYW1lQnVm
ZmVyQ2FjaGUpOgorCiAyMDE3LTEwLTE3ICBLZWl0aCBNaWxsZXIgIDxrZWl0aF9taWxsZXJAYXBw
bGUuY29tPgogCiAgICAgICAgIENoYW5nZSBXZWJDb3JlIHNvdXJjZXMgdG8gd29yayB3aXRoIHVu
aWZpZWQgc291cmNlIGJ1aWxkcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
aW1hZ2UtZGVjb2RlcnMvd2VicC9XRUJQSW1hZ2VEZWNvZGVyLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3dlYnAvV0VCUEltYWdlRGVjb2Rlci5jcHAKaW5kZXgg
NDdhMzRhNmE5ZTAxMzQ4MDU5OWVkZWJhYjAwNTMyODI4OWUxN2E0YS4uY2ZmN2VhM2JhMTMyOWU0
NmI2ZDg4ODBhNjg0YjE4NTlkNWZlNzhlOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvd2VicC9XRUJQSW1hZ2VEZWNvZGVyLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy93ZWJwL1dFQlBJbWFnZURlY29kZXIu
Y3BwCkBAIC0zMyw2ICszMywxMSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2Jvb2wgd2Vi
cEZyYW1lQXRJbmRleChXZWJQRGVtdXhlciogZGVtdXhlciwgc2l6ZV90IGluZGV4LCBXZWJQSXRl
cmF0b3IqIHdlYnBGcmFtZSkKK3sKKyAgICByZXR1cm4gV2ViUERlbXV4R2V0RnJhbWUoZGVtdXhl
ciwgaW5kZXggKyAxLCB3ZWJwRnJhbWUpOworfQorCiBXRUJQSW1hZ2VEZWNvZGVyOjpXRUJQSW1h
Z2VEZWNvZGVyKEFscGhhT3B0aW9uIGFscGhhT3B0aW9uLCBHYW1tYUFuZENvbG9yUHJvZmlsZU9w
dGlvbiBnYW1tYUFuZENvbG9yUHJvZmlsZU9wdGlvbikKICAgICA6IFNjYWxhYmxlSW1hZ2VEZWNv
ZGVyKGFscGhhT3B0aW9uLCBnYW1tYUFuZENvbG9yUHJvZmlsZU9wdGlvbikKIHsKQEAgLTg3LDM4
ICs5MiwzNCBAQCBzaXplX3QgV0VCUEltYWdlRGVjb2Rlcjo6ZmluZEZpcnN0UmVxdWlyZWRGcmFt
ZVRvRGVjb2RlKHNpemVfdCBmcmFtZUluZGV4LCBXZWJQRAogICAgIGlmICghZnJhbWVJbmRleCkK
ICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAvLyBDaGVjayB0aGUgbW9zdCBwcm9iYWJsZSBzY2Vu
YXJpbyBmaXJzdDogdGhlIHByZXZpb3VzIGZyYW1lIGlzIGNvbXBsZXRlLCBzbyB3ZSBjYW4gZGVj
b2RlIHRoZSByZXF1ZXN0ZWQgb25lLgotICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGVbZnJhbWVJ
bmRleCAtIDFdLmlzQ29tcGxldGUoKSkKLSAgICAgICAgcmV0dXJuIGZyYW1lSW5kZXg7Ci0KLSAg
ICAvLyBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIGZyYW1lIGNhbiBiZSByZW5kZXJlZCB3aXRob3V0
IGRlcGVuZGVuY2llcy4gVGhpcyBoYXBwZW5zIGlmIHRoZSBmcmFtZQotICAgIC8vIGZpbGxzIHRo
ZSB3aG9sZSBhcmVhIGFuZCBkb2Vzbid0IGhhdmUgYWxwaGEuCi0gICAgV2ViUEl0ZXJhdG9yIHdl
YnBGcmFtZTsKLSAgICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoZGVtdXhlciwgZnJhbWVJbmRleCAr
IDEsICZ3ZWJwRnJhbWUpKSB7Ci0gICAgICAgIEludFJlY3QgZnJhbWVSZWN0KHdlYnBGcmFtZS54
X29mZnNldCwgd2VicEZyYW1lLnlfb2Zmc2V0LCB3ZWJwRnJhbWUud2lkdGgsIHdlYnBGcmFtZS5o
ZWlnaHQpOwotICAgICAgICBpZiAoZnJhbWVSZWN0LmNvbnRhaW5zKEludFJlY3QoSW50UG9pbnQo
KSwgc2l6ZSgpKSkgJiYgIXdlYnBGcmFtZS5oYXNfYWxwaGEpCi0gICAgICAgICAgICByZXR1cm4g
ZnJhbWVJbmRleDsKLSAgICB9Ci0KICAgICAvLyBHbyBiYWNrd2FyZHMgaW4gdGhlIGxpc3Qgb2Yg
ZnJhbWVzLCB1bnRpbCB3ZSBmaW5kIHRoZSBmaXJzdCBjb21wbGV0ZSBmcmFtZSBvciBhIGZyYW1l
IHRoYXQKICAgICAvLyBkb2Vzbid0IGRlcGVuZCBvbiBwcmV2aW91cyBmcmFtZXMuCi0gICAgZm9y
IChzaXplX3QgaSA9IGZyYW1lSW5kZXggLSAxOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIC8vIFRo
aXMgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGNhbiBzdGFydCB0aGUgZGVjb2RpbmcgZnJvbSB0
aGUgbmV4dCBvbmUuCi0gICAgICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGVbaV0uaXNDb21wbGV0
ZSgpKQorICAgIGZvciAoaW50IGkgPSBmcmFtZUluZGV4OyBpID49IDA7IC0taSkgeworICAgICAg
ICBJbWFnZUZyYW1lJiBmcmFtZSA9IG1fZnJhbWVCdWZmZXJDYWNoZVtpXTsKKworICAgICAgICAv
LyBJZiB0aGlzIGZyYW1lIGlzIGNvbXBsZXRlLCB3ZSBjYW4gZGVjb2RlIHRoZSBuZXh0IG9uZS4g
VGhlIGZyYW1lIGF0IGZyYW1lSW5kZXggaXMgbmV2ZXIKKyAgICAgICAgLy8gY29tcGxldGUsIHNv
IHdlIHdpbGwgbmV2ZXIgcmV0dXJuIGZyYW1lSW5kZXggKyAxLgorICAgICAgICBpZiAoZnJhbWUu
aXNDb21wbGV0ZSgpKSB7CisgICAgICAgICAgICBBU1NFUlQoKHNpemVfdClpIDwgZnJhbWVJbmRl
eCk7CiAgICAgICAgICAgICByZXR1cm4gaSArIDE7CisgICAgICAgIH0KIAotICAgICAgICBpZiAo
V2ViUERlbXV4R2V0RnJhbWUoZGVtdXhlciwgaSArIDEsICZ3ZWJwRnJhbWUpKSB7CisgICAgICAg
IFdlYlBJdGVyYXRvciB3ZWJwRnJhbWU7CisgICAgICAgIGlmICh3ZWJwRnJhbWVBdEluZGV4KGRl
bXV4ZXIsIGksICZ3ZWJwRnJhbWUpKSB7CiAgICAgICAgICAgICBJbnRSZWN0IGZyYW1lUmVjdCh3
ZWJwRnJhbWUueF9vZmZzZXQsIHdlYnBGcmFtZS55X29mZnNldCwgd2VicEZyYW1lLndpZHRoLCB3
ZWJwRnJhbWUuaGVpZ2h0KTsKLSAgICAgICAgICAgIC8vIFRoaXMgZnJhbWUgaXMgbm90IGNvbXBs
ZXRlLCBidXQgaXQgZmlsbHMgdGhlIHdob2xlIHNpemUgYW5kIGl0cyBkaXNwb3NhbCBtZXRob2Qg
aXMKLSAgICAgICAgICAgIC8vIFJlc3RvcmVUb0JhY2tncm91bmQuIFRoaXMgbWVhbnMgdGhhdCB3
ZSB3aWxsIGRyYXcgdGhlIG5leHQgZnJhbWUgb24gYW4gaW5pdGlhbGx5IHRyYW5zcGFyZW50Ci0g
ICAgICAgICAgICAvLyBidWZmZXIsIHNvIHRoZXJlJ3Mgbm8gZGVwZW5kZW5jeS4gV2UgY2FuIHN0
YXJ0IGRlY29kaW5nIGZyb20gdGhlIG5leHQgZnJhbWUuCi0gICAgICAgICAgICBpZiAoZnJhbWVS
ZWN0LmNvbnRhaW5zKEludFJlY3QoSW50UG9pbnQoKSwgc2l6ZSgpKSkgJiYgKG1fZnJhbWVCdWZm
ZXJDYWNoZVtpXS5kaXNwb3NhbE1ldGhvZCgpID09IEltYWdlRnJhbWU6OkRpc3Bvc2FsTWV0aG9k
OjpSZXN0b3JlVG9CYWNrZ3JvdW5kKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7Ci0K
LSAgICAgICAgICAgIC8vIFRoaXMgZnJhbWUgaXMgbm90IGNvbXBsZXRlLCBidXQgaXQgZmlsbHMg
dGhlIHdob2xlIHNpemUgYW5kIGRvZXNuJ3QgaGF2ZSBhbHBoYSwKLSAgICAgICAgICAgIC8vIHNv
IGl0IGRvZXNuJ3QgZGVwZW5kIG9uIGZvcm1lciBmcmFtZXMuIFdlIGNhbiBzdGFydCBkZWNvZGlu
ZyBmcm9tIGhlcmUuCi0gICAgICAgICAgICBpZiAoZnJhbWVSZWN0LmNvbnRhaW5zKEludFJlY3Qo
SW50UG9pbnQoKSwgc2l6ZSgpKSkgJiYgIXdlYnBGcmFtZS5oYXNfYWxwaGEpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZnJhbWUgY292ZXJz
IHRoZSB3aG9sZSBhcmVhLgorICAgICAgICAgICAgaWYgKGZyYW1lUmVjdC5jb250YWlucyh7IHsg
fSwgc2l6ZSgpIH0pKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBmcmFtZSBjb3ZlcnMgdGhl
IHdob2xlIGFyZWEgYW5kIGRvZXNuJ3QgaGF2ZSBhbHBoYSwgc28gaXQgY2FuIGJlIHJlbmRlcmVk
IHdpdGhvdXQKKyAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAg
ICAgaWYgKCF3ZWJwRnJhbWUuaGFzX2FscGhhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
aTsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgZnJhbWUgY292ZXJzIHRoZSB3aG9sZSBhcmVh
IGFuZCBpdHMgZGlzcG9zYWxNZXRob2QgaXMgUmVzdG9yZVRvQmFja2dyb3VuZCwgd2hpY2ggbWVh
bnMKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBuZXh0IGZyYW1lIHdpbGwgYmUgcmVuZGVy
ZWQgb24gdG9wIG9mIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCwgYW5kIGNhbiBiZSBkZWNvZGVk
CisgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBkZXBlbmRlbmNpZXMuIFRoaXMgY2FuIG9ubHkg
YmUgY2hlY2tlZCBmb3IgZnJhbWVzIHByaW9yIHRvIGZyYW1lSW5kZXguCisgICAgICAgICAgICAg
ICAgaWYgKGZyYW1lLmRpc3Bvc2FsTWV0aG9kKCkgPT0gSW1hZ2VGcmFtZTo6RGlzcG9zYWxNZXRo
b2Q6OlJlc3RvcmVUb0JhY2tncm91bmQgJiYgKChzaXplX3QpaSA8IGZyYW1lSW5kZXgpKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0K
ICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0xNDUsMTIgKzE0NiwxMiBAQCB2b2lkIFdFQlBJbWFn
ZURlY29kZXI6OmRlY29kZShzaXplX3QgZnJhbWVJbmRleCwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQp
CiAKICAgICAvLyBJdCBpcyBhIGZhdGFsIGVycm9yIGlmIGFsbCBkYXRhIGlzIHJlY2VpdmVkIGFu
ZCB3ZSBoYXZlIGRlY29kZWQgYWxsIGZyYW1lcyBhdmFpbGFibGUgYnV0IHRoZSBmaWxlIGlzIHRy
dW5jYXRlZC4KICAgICBpZiAoZnJhbWVJbmRleCA+PSBtX2ZyYW1lQnVmZmVyQ2FjaGUuc2l6ZSgp
IC0gMSAmJiBhbGxEYXRhUmVjZWl2ZWQgJiYgZGVtdXhlciAmJiBkZW11eGVyU3RhdGUgIT0gV0VC
UF9ERU1VWF9ET05FKSB7CisgICAgICAgIFdlYlBEZW11eERlbGV0ZShkZW11eGVyKTsKICAgICAg
ICAgc2V0RmFpbGVkKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzaXplX3Qgc3Rh
cnRGcmFtZSA9IGZpbmRGaXJzdFJlcXVpcmVkRnJhbWVUb0RlY29kZShmcmFtZUluZGV4LCBkZW11
eGVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gc3RhcnRGcmFtZTsgaSA8PSBmcmFtZUluZGV4OyBp
KyspCisgICAgZm9yIChzaXplX3QgaSA9IGZpbmRGaXJzdFJlcXVpcmVkRnJhbWVUb0RlY29kZShm
cmFtZUluZGV4LCBkZW11eGVyKTsgaSA8PSBmcmFtZUluZGV4OyBpKyspCiAgICAgICAgIGRlY29k
ZUZyYW1lKGksIGRlbXV4ZXIpOwogCiAgICAgV2ViUERlbXV4RGVsZXRlKGRlbXV4ZXIpOwpAQCAt
MTYyLDcgKzE2Myw3IEBAIHZvaWQgV0VCUEltYWdlRGVjb2Rlcjo6ZGVjb2RlRnJhbWUoc2l6ZV90
IGZyYW1lSW5kZXgsIFdlYlBEZW11eGVyKiBkZW11eGVyKQogICAgICAgICByZXR1cm47CiAKICAg
ICBXZWJQSXRlcmF0b3Igd2VicEZyYW1lOwotICAgIGlmICghV2ViUERlbXV4R2V0RnJhbWUoZGVt
dXhlciwgZnJhbWVJbmRleCArIDEsICZ3ZWJwRnJhbWUpKQorICAgIGlmICghd2VicEZyYW1lQXRJ
bmRleChkZW11eGVyLCBmcmFtZUluZGV4LCAmd2VicEZyYW1lKSkKICAgICAgICAgcmV0dXJuOwog
CiAgICAgY29uc3QgdWludDhfdCogZGF0YUJ5dGVzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50OF90Kj4od2VicEZyYW1lLmZyYWdtZW50LmJ5dGVzKTsKQEAgLTE4Niw3ICsxODcsOCBAQCB2
b2lkIFdFQlBJbWFnZURlY29kZXI6OmRlY29kZUZyYW1lKHNpemVfdCBmcmFtZUluZGV4LCBXZWJQ
RGVtdXhlciogZGVtdXhlcikKICAgICBkZWNvZGVyQnVmZmVyLnUuUkdCQS5zdHJpZGUgPSB3ZWJw
RnJhbWUud2lkdGggKiBzaXplb2YoUkdCQTMyKTsKICAgICBkZWNvZGVyQnVmZmVyLnUuUkdCQS5z
aXplID0gZGVjb2RlckJ1ZmZlci51LlJHQkEuc3RyaWRlICogd2VicEZyYW1lLmhlaWdodDsKICAg
ICBkZWNvZGVyQnVmZmVyLmlzX2V4dGVybmFsX21lbW9yeSA9IDE7Ci0gICAgZGVjb2RlckJ1ZmZl
ci51LlJHQkEucmdiYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGZhc3RNYWxsb2MoZGVj
b2RlckJ1ZmZlci51LlJHQkEuc2l6ZSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBj
aGFyW10+IHAobmV3IHVpbnQ4X3RbZGVjb2RlckJ1ZmZlci51LlJHQkEuc2l6ZV0oKSk7CisgICAg
ZGVjb2RlckJ1ZmZlci51LlJHQkEucmdiYSA9IHAuZ2V0KCk7CiAgICAgaWYgKCFkZWNvZGVyQnVm
ZmVyLnUuUkdCQS5yZ2JhKSB7CiAgICAgICAgIHNldEZhaWxlZCgpOwogICAgICAgICByZXR1cm47
CkBAIC0xOTQsNyArMTk2LDYgQEAgdm9pZCBXRUJQSW1hZ2VEZWNvZGVyOjpkZWNvZGVGcmFtZShz
aXplX3QgZnJhbWVJbmRleCwgV2ViUERlbXV4ZXIqIGRlbXV4ZXIpCiAKICAgICBXZWJQSURlY29k
ZXIqIGRlY29kZXIgPSBXZWJQSU5ld0RlY29kZXIoJmRlY29kZXJCdWZmZXIpOwogICAgIGlmICgh
ZGVjb2RlcikgewotICAgICAgICBmYXN0RnJlZShkZWNvZGVyQnVmZmVyLnUuUkdCQS5yZ2JhKTsK
ICAgICAgICAgc2V0RmFpbGVkKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMDcsNiAr
MjA4LDcgQEAgdm9pZCBXRUJQSW1hZ2VEZWNvZGVyOjpkZWNvZGVGcmFtZShzaXplX3QgZnJhbWVJ
bmRleCwgV2ViUERlbXV4ZXIqIGRlbXV4ZXIpCiAgICAgY2FzZSBWUDhfU1RBVFVTX1NVU1BFTkRF
RDoKICAgICAgICAgaWYgKCFpc0FsbERhdGFSZWNlaXZlZCgpKSB7CiAgICAgICAgICAgICBhcHBs
eVBvc3RQcm9jZXNzaW5nKGZyYW1lSW5kZXgsIGRlY29kZXIsIGRlY29kZXJCdWZmZXIsIGJsZW5k
KTsKKyAgICAgICAgICAgIGJ1ZmZlci5zZXREZWNvZGluZ1N0YXR1cyhEZWNvZGluZ1N0YXR1czo6
UGFydGlhbCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICAvLyBGYWxs
dGhyb3VnaC4KQEAgLTIxNSw3ICsyMTcsNiBAQCB2b2lkIFdFQlBJbWFnZURlY29kZXI6OmRlY29k
ZUZyYW1lKHNpemVfdCBmcmFtZUluZGV4LCBXZWJQRGVtdXhlciogZGVtdXhlcikKICAgICB9CiAK
ICAgICBXZWJQSURlbGV0ZShkZWNvZGVyKTsKLSAgICBmYXN0RnJlZShkZWNvZGVyQnVmZmVyLnUu
UkdCQS5yZ2JhKTsKIH0KIAogYm9vbCBXRUJQSW1hZ2VEZWNvZGVyOjppbml0RnJhbWVCdWZmZXIo
c2l6ZV90IGZyYW1lSW5kZXgsIGNvbnN0IFdlYlBJdGVyYXRvciogd2VicEZyYW1lKQpAQCAtMjI5
LDEwICsyMzAsNyBAQCBib29sIFdFQlBJbWFnZURlY29kZXI6OmluaXRGcmFtZUJ1ZmZlcihzaXpl
X3QgZnJhbWVJbmRleCwgY29uc3QgV2ViUEl0ZXJhdG9yKiB3ZQogICAgIEludFJlY3QgZnJhbWVS
ZWN0KHdlYnBGcmFtZS0+eF9vZmZzZXQsIHdlYnBGcmFtZS0+eV9vZmZzZXQsIHdlYnBGcmFtZS0+
d2lkdGgsIHdlYnBGcmFtZS0+aGVpZ2h0KTsKIAogICAgIC8vIE1ha2Ugc3VyZSB0aGUgZnJhbWVS
ZWN0IGRvZXNuJ3QgZXh0ZW5kIG91dHNpZGUgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZnJhbWVSZWN0
Lm1heFgoKSA+IHNpemUoKS53aWR0aCgpKQotICAgICAgICBmcmFtZVJlY3Quc2V0V2lkdGgoc2l6
ZSgpLndpZHRoKCkgLSB3ZWJwRnJhbWUtPnhfb2Zmc2V0KTsKLSAgICBpZiAoZnJhbWVSZWN0Lm1h
eFkoKSA+IHNpemUoKS5oZWlnaHQoKSkKLSAgICAgICAgZnJhbWVSZWN0LnNldEhlaWdodChzaXpl
KCkuaGVpZ2h0KCkgLSB3ZWJwRnJhbWUtPnlfb2Zmc2V0KTsKKyAgICBmcmFtZVJlY3QuaW50ZXJz
ZWN0KHsgeyB9LCBzaXplKCkgfSk7CiAKICAgICBpZiAoIWZyYW1lSW5kZXggfHwgIW1fZnJhbWVC
dWZmZXJDYWNoZVtmcmFtZUluZGV4IC0gMV0uYmFja2luZ1N0b3JlKCkpIHsKICAgICAgICAgLy8g
VGhpcyBmcmFtZSBkb2Vzbid0IHJlbHkgb24gYW55IHByZXZpb3VzIGRhdGEuCkBAIC0yNTYsNyAr
MjU0LDYgQEAgYm9vbCBXRUJQSW1hZ2VEZWNvZGVyOjppbml0RnJhbWVCdWZmZXIoc2l6ZV90IGZy
YW1lSW5kZXgsIGNvbnN0IFdlYlBJdGVyYXRvciogd2UKIAogICAgIGJ1ZmZlci5zZXRIYXNBbHBo
YSh3ZWJwRnJhbWUtPmhhc19hbHBoYSk7CiAgICAgYnVmZmVyLmJhY2tpbmdTdG9yZSgpLT5zZXRG
cmFtZVJlY3QoZnJhbWVSZWN0KTsKLSAgICBidWZmZXIuc2V0RGVjb2RpbmdTdGF0dXMoRGVjb2Rp
bmdTdGF0dXM6OlBhcnRpYWwpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0zNTQsMTEgKzM1
MSwxMCBAQCB2b2lkIFdFQlBJbWFnZURlY29kZXI6OmNsZWFyRnJhbWVCdWZmZXJDYWNoZShzaXpl
X3QgY2xlYXJCZWZvcmVGcmFtZSkKICAgICAvLyAgICogV2UgZG9uJ3QgY2xlYXIgYW55IGZyYW1l
IGZyb20gd2hpY2ggYSBmdXR1cmUgaW5pdEZyYW1lQnVmZmVyKCkgY2FsbCB3aWxsIGNvcHkgYml0
bWFwIGRhdGEuCiAgICAgLy8KICAgICAvLyBJbiBXRUJQIGV2ZXJ5IGZyYW1lIGRlcGVuZHMgb24g
dGhlIHByZXZpb3VzIG9uZSBvciBub25lLiBUaGF0IG1lYW5zIHRoYXQgZnJhbWVzIGFmdGVyIGNs
ZWFyQmVmb3JlRnJhbWUKLSAgICAvLyB3b24ndCBuZWVkIGFueSBmcmFtZSBiZWZvcmUgdGhlbSB0
byByZW5kZXIsIHNvIHdlIGNhbiBjbGVhciB0aGVtIGFsbC4gSWYgd2UgZmluZCBhIGJ1ZmZlciB0
aGF0IGlzIHBhcnRpYWwsCi0gICAgLy8gZG9uJ3QgZGVsZXRlIGl0IGFzIGl0J3MgYmVpbmcgZGVj
b2RlZC4KKyAgICAvLyB3b24ndCBuZWVkIGFueSBmcmFtZSBiZWZvcmUgdGhlbSB0byByZW5kZXIs
IHNvIHdlIGNhbiBjbGVhciB0aGVtIGFsbC4KICAgICBmb3IgKGludCBpID0gY2xlYXJCZWZvcmVG
cmFtZSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgIEltYWdlRnJhbWUmIGJ1ZmZlciA9IG1f
ZnJhbWVCdWZmZXJDYWNoZVtpXTsKLSAgICAgICAgaWYgKGJ1ZmZlci5pc0NvbXBsZXRlKCkgfHwg
YnVmZmVyLmlzSW52YWxpZCgpKQorICAgICAgICBpZiAoIWJ1ZmZlci5pc0ludmFsaWQoKSkKICAg
ICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL0xheW91dFRl
c3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCA0ZWIwMzIyNGY1ZTA5
MDQwZThmYjE3YTdjOTQ3NGE3ZWZjZWNmYTI5Li41YTNkZDNmOTE1NzJhYmJjODZiMDM0Yjc0ZjA1
ZDI5NDliNmRmMDRhIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTctMTAtMTcgIE1pZ3VlbCBH
b21leiAgPG1hZ29tZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXVtXUEVdIEZpeCByZXZp
ZXcgY29tbWVudHMgb24gV0VCUEltYWdlRGVjb2RlcgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDgwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgQWRqdXN0ZWQgdGVzdCBkdXJhdGlvbi4KKworICAgICAg
ICAqIGZhc3QvaW1hZ2VzL2FuaW1hdGVkLXdlYnAuaHRtbDoKKwogMjAxNy0xMC0xNyAgQWxpY2lh
IEJveWEgR2FyY8OtYSAgPGFib3lhQGlnYWxpYS5jb20+CiAKICAgICAgICAgW0dTdHJlYW1lcl1b
TVNFXSBVbnJldmlld2VkIG1pY3JvZ2FyZGVuaW5nCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9m
YXN0L2ltYWdlcy9hbmltYXRlZC13ZWJwLmh0bWwgYi9MYXlvdXRUZXN0cy9mYXN0L2ltYWdlcy9h
bmltYXRlZC13ZWJwLmh0bWwKaW5kZXggY2NhODFiOTJmZWM3YTdiMWMyOWQ2YWMxMDZhMzA2Y2Vh
NjJhMjFmNi4uNDdhZjcwZTdkM2YyODRjMzM1YTUzYjdlMzAzNGIxYTBjNGUzMzc2OSAxMDA2NDQK
LS0tIGEvTGF5b3V0VGVzdHMvZmFzdC9pbWFnZXMvYW5pbWF0ZWQtd2VicC5odG1sCisrKyBiL0xh
eW91dFRlc3RzL2Zhc3QvaW1hZ2VzL2FuaW1hdGVkLXdlYnAuaHRtbApAQCAtMTIsNyArMTIsNyBA
QAogICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgIGlm
ICh3aW5kb3cudGVzdFJ1bm5lcikKICAgICAgICAgICAgICAgICB0ZXN0UnVubmVyLm5vdGlmeURv
bmUoKTsKLSAgICAgICAgfSwgNTAwKTsKKyAgICAgICAgfSwgMzAwKTsKICAgICB9CiA8L3Njcmlw
dD4KIDxzdHlsZT4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>324378</attachid>
            <date>2017-10-20 02:08:04 -0700</date>
            <delta_ts>2017-10-20 04:08:15 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-178080-20171020110802.patch</filename>
            <type>text/plain</type>
            <size>11287</size>
            <attacher name="Miguel Gomez">magomez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIzNzQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNWFhY2VlOWZlYTIwY2Rm
ZWFiOWExMGRkZTFiYmRhMzQyMTAyZDJhYy4uNGI3YWUxMjUzNDEyOGNjYjM4OTFhNGJlYjhkYTQ3
ZDdmMzVkNGY1ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDE3LTEwLTIwICBNaWd1
ZWwgR29tZXogIDxtYWdvbWV6QGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS11bV1BFXSBGaXgg
cmV2aWV3IGNvbW1lbnRzIG9uIFdFQlBJbWFnZURlY29kZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3ODA4MAorCisgICAgICAgIFJldmlld2VkIGJ5
IFNhaWQgQWJvdS1IYWxsYXdhLgorCisgICAgICAgIFByb3Blcmx5IGZyZWUgdGhlIGRlbXV4ZXIg
aW4gY2FzZSBvZiBlcnJvciwgaW1wcm92ZSB0aGUgY29kZSB0byBkZXRlY3QgdGhlIGZpcnN0Cisg
ICAgICAgIHJlcXVpcmVkIGZyYW1lIHRvIGRlY29kZSwgZml4IHRoZSB1c2FnZSBvZiB0aGUgRGVj
b2RpbmdTdGF0dXMgYW5kIHNvbWUgc3R5bGluZworICAgICAgICBjaGFuZ2VzLgorCisgICAgICAg
IENvdmVyZWQgYnkgZXhpc3RlbnQgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1k
ZWNvZGVycy93ZWJwL1dFQlBJbWFnZURlY29kZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6d2Vi
cEZyYW1lQXRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpXRUJQSW1hZ2VEZWNvZGVyOjpmaW5k
Rmlyc3RSZXF1aXJlZEZyYW1lVG9EZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6V0VCUEltYWdl
RGVjb2Rlcjo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OldFQlBJbWFnZURlY29kZXI6OmRl
Y29kZUZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OldFQlBJbWFnZURlY29kZXI6OmluaXRGcmFt
ZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpXRUJQSW1hZ2VEZWNvZGVyOjpjbGVhckZyYW1l
QnVmZmVyQ2FjaGUpOgorCiAyMDE3LTEwLTIwICBGcmVkZXJpYyBXYW5nICA8ZndhbmdAaWdhbGlh
LmNvbT4KIAogICAgICAgICBSZW5kZXJMYXllckNvbXBvc2l0b3I6IE1vdmUgaW1wbGVtZW50YXRp
b24gb2Ygc2ltcGxlIG1ldGhvZHMgaW50byB0aGUgaGVhZGVyIGZpbGUuCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy93ZWJwL1dFQlBJbWFnZURlY29k
ZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvd2VicC9XRUJQ
SW1hZ2VEZWNvZGVyLmNwcAppbmRleCBkMTZmNmMyYWE0MzMyYWZmNTAwMzZkNTg5NGQzZGRhNGZi
ODk3MzNkLi5mZTgyOTBlOTU3NTZiZDE0MjVhYTlmMDhiOTE1MmNiZjY3MTU5ZTdmIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy93ZWJwL1dFQlBJbWFn
ZURlY29kZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJz
L3dlYnAvV0VCUEltYWdlRGVjb2Rlci5jcHAKQEAgLTMzLDYgKzMzLDEyIEBACiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAorLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gaW1wcm92ZSBjb2RlIHJl
YWRhYmlsaXR5LCBhcyBXZWJQRGVtdXhHZXRGcmFtZSBpcyArMSBiYXNlZC4KK2Jvb2wgd2VicEZy
YW1lQXRJbmRleChXZWJQRGVtdXhlciogZGVtdXhlciwgc2l6ZV90IGluZGV4LCBXZWJQSXRlcmF0
b3IqIHdlYnBGcmFtZSkKK3sKKyAgICByZXR1cm4gV2ViUERlbXV4R2V0RnJhbWUoZGVtdXhlciwg
aW5kZXggKyAxLCB3ZWJwRnJhbWUpOworfQorCiBXRUJQSW1hZ2VEZWNvZGVyOjpXRUJQSW1hZ2VE
ZWNvZGVyKEFscGhhT3B0aW9uIGFscGhhT3B0aW9uLCBHYW1tYUFuZENvbG9yUHJvZmlsZU9wdGlv
biBnYW1tYUFuZENvbG9yUHJvZmlsZU9wdGlvbikKICAgICA6IFNjYWxhYmxlSW1hZ2VEZWNvZGVy
KGFscGhhT3B0aW9uLCBnYW1tYUFuZENvbG9yUHJvZmlsZU9wdGlvbikKIHsKQEAgLTg1LDQxICs5
MSwzNiBAQCBzaXplX3QgV0VCUEltYWdlRGVjb2Rlcjo6ZmluZEZpcnN0UmVxdWlyZWRGcmFtZVRv
RGVjb2RlKHNpemVfdCBmcmFtZUluZGV4LCBXZWJQRAogICAgIGlmICghZnJhbWVJbmRleCkKICAg
ICAgICAgcmV0dXJuIDA7CiAKLSAgICAvLyBDaGVjayB0aGUgbW9zdCBwcm9iYWJsZSBzY2VuYXJp
byBmaXJzdDogdGhlIHByZXZpb3VzIGZyYW1lIGlzIGNvbXBsZXRlLCBzbyB3ZSBjYW4gZGVjb2Rl
IHRoZSByZXF1ZXN0ZWQgb25lLgotICAgIGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGVbZnJhbWVJbmRl
eCAtIDFdLmlzQ29tcGxldGUoKSkKLSAgICAgICAgcmV0dXJuIGZyYW1lSW5kZXg7CisgICAgLy8g
R28gYmFja3dhcmRzIGFuZCBmaW5kIHRoZSBmaXJzdCBjb21wbGV0ZSBmcmFtZS4KKyAgICBzaXpl
X3QgZmlyc3RJbmNvbXBsZXRlRnJhbWUgPSBmcmFtZUluZGV4OworICAgIGZvciAoOyBmaXJzdElu
Y29tcGxldGVGcmFtZTsgLS1maXJzdEluY29tcGxldGVGcmFtZSkgeworICAgICAgICBpZiAobV9m
cmFtZUJ1ZmZlckNhY2hlW2ZpcnN0SW5jb21wbGV0ZUZyYW1lIC0gMV0uaXNDb21wbGV0ZSgpKQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFu
eSBpbmRlcGVuZGVudCBmcmFtZXMgYmV0d2VlbiBmaXJzdEluY29tcGxldGVGcmFtZSBhbmQgZnJh
bWVJbmRleC4KKyAgICBmb3IgKHNpemVfdCBmaXJzdEluZGVwZW5kZW50RnJhbWUgPSBmcmFtZUlu
ZGV4OyBmaXJzdEluZGVwZW5kZW50RnJhbWUgPiBmaXJzdEluY29tcGxldGVGcmFtZSA7IC0tZmly
c3RJbmRlcGVuZGVudEZyYW1lKSB7CisgICAgICAgIFdlYlBJdGVyYXRvciB3ZWJwRnJhbWU7Cisg
ICAgICAgIGlmICghd2VicEZyYW1lQXRJbmRleChkZW11eGVyLCBmaXJzdEluZGVwZW5kZW50RnJh
bWUsICZ3ZWJwRnJhbWUpKQorICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAvLyBDaGVjayBp
ZiB0aGUgcmVxdWVzdGVkIGZyYW1lIGNhbiBiZSByZW5kZXJlZCB3aXRob3V0IGRlcGVuZGVuY2ll
cy4gVGhpcyBoYXBwZW5zIGlmIHRoZSBmcmFtZQotICAgIC8vIGZpbGxzIHRoZSB3aG9sZSBhcmVh
IGFuZCBkb2Vzbid0IGhhdmUgYWxwaGEuCi0gICAgV2ViUEl0ZXJhdG9yIHdlYnBGcmFtZTsKLSAg
ICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoZGVtdXhlciwgZnJhbWVJbmRleCArIDEsICZ3ZWJwRnJh
bWUpKSB7CiAgICAgICAgIEludFJlY3QgZnJhbWVSZWN0KHdlYnBGcmFtZS54X29mZnNldCwgd2Vi
cEZyYW1lLnlfb2Zmc2V0LCB3ZWJwRnJhbWUud2lkdGgsIHdlYnBGcmFtZS5oZWlnaHQpOwotICAg
ICAgICBpZiAoZnJhbWVSZWN0LmNvbnRhaW5zKEludFJlY3QoSW50UG9pbnQoKSwgc2l6ZSgpKSkg
JiYgIXdlYnBGcmFtZS5oYXNfYWxwaGEpCi0gICAgICAgICAgICByZXR1cm4gZnJhbWVJbmRleDsK
KyAgICAgICAgaWYgKCFmcmFtZVJlY3QuY29udGFpbnMoeyB7IH0sIHNpemUoKSB9KSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFRoaXMgZnJhbWUgY292ZXJzIHRoZSB3aG9s
ZSBhcmVhIGFuZCBkb2Vzbid0IGhhdmUgYWxwaGEsIHNvIGl0IGNhbiBiZSByZW5kZXJlZCB3aXRo
b3V0CisgICAgICAgIC8vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgaWYgKCF3ZWJwRnJhbWUuaGFz
X2FscGhhKQorICAgICAgICAgICAgcmV0dXJuIGZpcnN0SW5kZXBlbmRlbnRGcmFtZTsKKworICAg
ICAgICAvLyBUaGlzIGZyYW1lIGNvdmVycyB0aGUgd2hvbGUgYXJlYSBhbmQgaXRzIGRpc3Bvc2Fs
TWV0aG9kIGlzIFJlc3RvcmVUb0JhY2tncm91bmQsIHdoaWNoIG1lYW5zCisgICAgICAgIC8vIHRo
YXQgdGhlIG5leHQgZnJhbWUgd2lsbCBiZSByZW5kZXJlZCBvbiB0b3Agb2YgYSB0cmFuc3BhcmVu
dCBiYWNrZ3JvdW5kLCBhbmQgY2FuIGJlIGRlY29kZWQKKyAgICAgICAgLy8gd2l0aG91dCBkZXBl
bmRlbmNpZXMuIFRoaXMgY2FuIG9ubHkgYmUgY2hlY2tlZCBmb3IgZnJhbWVzIHByaW9yIHRvIGZy
YW1lSW5kZXguCisgICAgICAgIGlmIChmaXJzdEluZGVwZW5kZW50RnJhbWUgPCBmcmFtZUluZGV4
ICYmIG1fZnJhbWVCdWZmZXJDYWNoZVtmaXJzdEluZGVwZW5kZW50RnJhbWVdLmRpc3Bvc2FsTWV0
aG9kKCkgPT0gSW1hZ2VGcmFtZTo6RGlzcG9zYWxNZXRob2Q6OlJlc3RvcmVUb0JhY2tncm91bmQp
CisgICAgICAgICAgICByZXR1cm4gZmlyc3RJbmRlcGVuZGVudEZyYW1lICsgMTsKICAgICB9CiAK
LSAgICAvLyBHbyBiYWNrd2FyZHMgaW4gdGhlIGxpc3Qgb2YgZnJhbWVzLCB1bnRpbCB3ZSBmaW5k
IHRoZSBmaXJzdCBjb21wbGV0ZSBmcmFtZSBvciBhIGZyYW1lIHRoYXQKLSAgICAvLyBkb2Vzbid0
IGRlcGVuZCBvbiBwcmV2aW91cyBmcmFtZXMuCi0gICAgZm9yIChzaXplX3QgaSA9IGZyYW1lSW5k
ZXggLSAxOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIC8vIFRoaXMgZnJhbWUgaXMgY29tcGxldGUs
IHNvIHdlIGNhbiBzdGFydCB0aGUgZGVjb2RpbmcgZnJvbSB0aGUgbmV4dCBvbmUuCi0gICAgICAg
IGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGVbaV0uaXNDb21wbGV0ZSgpKQotICAgICAgICAgICAgcmV0
dXJuIGkgKyAxOwotCi0gICAgICAgIGlmIChXZWJQRGVtdXhHZXRGcmFtZShkZW11eGVyLCBpICsg
MSwgJndlYnBGcmFtZSkpIHsKLSAgICAgICAgICAgIEludFJlY3QgZnJhbWVSZWN0KHdlYnBGcmFt
ZS54X29mZnNldCwgd2VicEZyYW1lLnlfb2Zmc2V0LCB3ZWJwRnJhbWUud2lkdGgsIHdlYnBGcmFt
ZS5oZWlnaHQpOwotICAgICAgICAgICAgLy8gVGhpcyBmcmFtZSBpcyBub3QgY29tcGxldGUsIGJ1
dCBpdCBmaWxscyB0aGUgd2hvbGUgc2l6ZSBhbmQgaXRzIGRpc3Bvc2FsIG1ldGhvZCBpcwotICAg
ICAgICAgICAgLy8gUmVzdG9yZVRvQmFja2dyb3VuZC4gVGhpcyBtZWFucyB0aGF0IHdlIHdpbGwg
ZHJhdyB0aGUgbmV4dCBmcmFtZSBvbiBhbiBpbml0aWFsbHkgdHJhbnNwYXJlbnQKLSAgICAgICAg
ICAgIC8vIGJ1ZmZlciwgc28gdGhlcmUncyBubyBkZXBlbmRlbmN5LiBXZSBjYW4gc3RhcnQgZGVj
b2RpbmcgZnJvbSB0aGUgbmV4dCBmcmFtZS4KLSAgICAgICAgICAgIGlmIChmcmFtZVJlY3QuY29u
dGFpbnMoSW50UmVjdChJbnRQb2ludCgpLCBzaXplKCkpKSAmJiAobV9mcmFtZUJ1ZmZlckNhY2hl
W2ldLmRpc3Bvc2FsTWV0aG9kKCkgPT0gSW1hZ2VGcmFtZTo6RGlzcG9zYWxNZXRob2Q6OlJlc3Rv
cmVUb0JhY2tncm91bmQpKQotICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTsKLQotICAgICAg
ICAgICAgLy8gVGhpcyBmcmFtZSBpcyBub3QgY29tcGxldGUsIGJ1dCBpdCBmaWxscyB0aGUgd2hv
bGUgc2l6ZSBhbmQgZG9lc24ndCBoYXZlIGFscGhhLAotICAgICAgICAgICAgLy8gc28gaXQgZG9l
c24ndCBkZXBlbmQgb24gZm9ybWVyIGZyYW1lcy4gV2UgY2FuIHN0YXJ0IGRlY29kaW5nIGZyb20g
aGVyZS4KLSAgICAgICAgICAgIGlmIChmcmFtZVJlY3QuY29udGFpbnMoSW50UmVjdChJbnRQb2lu
dCgpLCBzaXplKCkpKSAmJiAhd2VicEZyYW1lLmhhc19hbHBoYSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZmly
c3RJbmNvbXBsZXRlRnJhbWU7CiB9CiAKIHZvaWQgV0VCUEltYWdlRGVjb2Rlcjo6ZGVjb2RlKHNp
emVfdCBmcmFtZUluZGV4LCBib29sIGFsbERhdGFSZWNlaXZlZCkKQEAgLTE0MywxMiArMTQ0LDEy
IEBAIHZvaWQgV0VCUEltYWdlRGVjb2Rlcjo6ZGVjb2RlKHNpemVfdCBmcmFtZUluZGV4LCBib29s
IGFsbERhdGFSZWNlaXZlZCkKIAogICAgIC8vIEl0IGlzIGEgZmF0YWwgZXJyb3IgaWYgYWxsIGRh
dGEgaXMgcmVjZWl2ZWQgYW5kIHdlIGhhdmUgZGVjb2RlZCBhbGwgZnJhbWVzIGF2YWlsYWJsZSBi
dXQgdGhlIGZpbGUgaXMgdHJ1bmNhdGVkLgogICAgIGlmIChmcmFtZUluZGV4ID49IG1fZnJhbWVC
dWZmZXJDYWNoZS5zaXplKCkgLSAxICYmIGFsbERhdGFSZWNlaXZlZCAmJiBkZW11eGVyICYmIGRl
bXV4ZXJTdGF0ZSAhPSBXRUJQX0RFTVVYX0RPTkUpIHsKKyAgICAgICAgV2ViUERlbXV4RGVsZXRl
KGRlbXV4ZXIpOwogICAgICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAotICAgIHNpemVfdCBzdGFydEZyYW1lID0gZmluZEZpcnN0UmVxdWlyZWRGcmFtZVRvRGVjb2Rl
KGZyYW1lSW5kZXgsIGRlbXV4ZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSBzdGFydEZyYW1lOyBp
IDw9IGZyYW1lSW5kZXg7IGkrKykKKyAgICBmb3IgKHNpemVfdCBpID0gZmluZEZpcnN0UmVxdWly
ZWRGcmFtZVRvRGVjb2RlKGZyYW1lSW5kZXgsIGRlbXV4ZXIpOyBpIDw9IGZyYW1lSW5kZXg7IGkr
KykKICAgICAgICAgZGVjb2RlRnJhbWUoaSwgZGVtdXhlcik7CiAKICAgICBXZWJQRGVtdXhEZWxl
dGUoZGVtdXhlcik7CkBAIC0xNjAsNyArMTYxLDcgQEAgdm9pZCBXRUJQSW1hZ2VEZWNvZGVyOjpk
ZWNvZGVGcmFtZShzaXplX3QgZnJhbWVJbmRleCwgV2ViUERlbXV4ZXIqIGRlbXV4ZXIpCiAgICAg
ICAgIHJldHVybjsKIAogICAgIFdlYlBJdGVyYXRvciB3ZWJwRnJhbWU7Ci0gICAgaWYgKCFXZWJQ
RGVtdXhHZXRGcmFtZShkZW11eGVyLCBmcmFtZUluZGV4ICsgMSwgJndlYnBGcmFtZSkpCisgICAg
aWYgKCF3ZWJwRnJhbWVBdEluZGV4KGRlbXV4ZXIsIGZyYW1lSW5kZXgsICZ3ZWJwRnJhbWUpKQog
ICAgICAgICByZXR1cm47CiAKICAgICBjb25zdCB1aW50OF90KiBkYXRhQnl0ZXMgPSByZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih3ZWJwRnJhbWUuZnJhZ21lbnQuYnl0ZXMpOwpAQCAt
MTg0LDcgKzE4NSw4IEBAIHZvaWQgV0VCUEltYWdlRGVjb2Rlcjo6ZGVjb2RlRnJhbWUoc2l6ZV90
IGZyYW1lSW5kZXgsIFdlYlBEZW11eGVyKiBkZW11eGVyKQogICAgIGRlY29kZXJCdWZmZXIudS5S
R0JBLnN0cmlkZSA9IHdlYnBGcmFtZS53aWR0aCAqIHNpemVvZihSR0JBMzIpOwogICAgIGRlY29k
ZXJCdWZmZXIudS5SR0JBLnNpemUgPSBkZWNvZGVyQnVmZmVyLnUuUkdCQS5zdHJpZGUgKiB3ZWJw
RnJhbWUuaGVpZ2h0OwogICAgIGRlY29kZXJCdWZmZXIuaXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsK
LSAgICBkZWNvZGVyQnVmZmVyLnUuUkdCQS5yZ2JhID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90
Kj4oZmFzdE1hbGxvYyhkZWNvZGVyQnVmZmVyLnUuUkdCQS5zaXplKSk7CisgICAgc3RkOjp1bmlx
dWVfcHRyPHVuc2lnbmVkIGNoYXJbXT4gcChuZXcgdWludDhfdFtkZWNvZGVyQnVmZmVyLnUuUkdC
QS5zaXplXSgpKTsKKyAgICBkZWNvZGVyQnVmZmVyLnUuUkdCQS5yZ2JhID0gcC5nZXQoKTsKICAg
ICBpZiAoIWRlY29kZXJCdWZmZXIudS5SR0JBLnJnYmEpIHsKICAgICAgICAgc2V0RmFpbGVkKCk7
CiAgICAgICAgIHJldHVybjsKQEAgLTE5Miw3ICsxOTQsNiBAQCB2b2lkIFdFQlBJbWFnZURlY29k
ZXI6OmRlY29kZUZyYW1lKHNpemVfdCBmcmFtZUluZGV4LCBXZWJQRGVtdXhlciogZGVtdXhlcikK
IAogICAgIFdlYlBJRGVjb2RlciogZGVjb2RlciA9IFdlYlBJTmV3RGVjb2RlcigmZGVjb2RlckJ1
ZmZlcik7CiAgICAgaWYgKCFkZWNvZGVyKSB7Ci0gICAgICAgIGZhc3RGcmVlKGRlY29kZXJCdWZm
ZXIudS5SR0JBLnJnYmEpOwogICAgICAgICBzZXRGYWlsZWQoKTsKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KQEAgLTIwNSw2ICsyMDYsNyBAQCB2b2lkIFdFQlBJbWFnZURlY29kZXI6OmRlY29kZUZy
YW1lKHNpemVfdCBmcmFtZUluZGV4LCBXZWJQRGVtdXhlciogZGVtdXhlcikKICAgICBjYXNlIFZQ
OF9TVEFUVVNfU1VTUEVOREVEOgogICAgICAgICBpZiAoIWlzQWxsRGF0YVJlY2VpdmVkKCkpIHsK
ICAgICAgICAgICAgIGFwcGx5UG9zdFByb2Nlc3NpbmcoZnJhbWVJbmRleCwgZGVjb2RlciwgZGVj
b2RlckJ1ZmZlciwgYmxlbmQpOworICAgICAgICAgICAgYnVmZmVyLnNldERlY29kaW5nU3RhdHVz
KERlY29kaW5nU3RhdHVzOjpQYXJ0aWFsKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9
CiAgICAgICAgIC8vIEZhbGx0aHJvdWdoLgpAQCAtMjEzLDcgKzIxNSw2IEBAIHZvaWQgV0VCUElt
YWdlRGVjb2Rlcjo6ZGVjb2RlRnJhbWUoc2l6ZV90IGZyYW1lSW5kZXgsIFdlYlBEZW11eGVyKiBk
ZW11eGVyKQogICAgIH0KIAogICAgIFdlYlBJRGVsZXRlKGRlY29kZXIpOwotICAgIGZhc3RGcmVl
KGRlY29kZXJCdWZmZXIudS5SR0JBLnJnYmEpOwogfQogCiBib29sIFdFQlBJbWFnZURlY29kZXI6
OmluaXRGcmFtZUJ1ZmZlcihzaXplX3QgZnJhbWVJbmRleCwgY29uc3QgV2ViUEl0ZXJhdG9yKiB3
ZWJwRnJhbWUpCkBAIC0yMjcsMTAgKzIyOCw3IEBAIGJvb2wgV0VCUEltYWdlRGVjb2Rlcjo6aW5p
dEZyYW1lQnVmZmVyKHNpemVfdCBmcmFtZUluZGV4LCBjb25zdCBXZWJQSXRlcmF0b3IqIHdlCiAg
ICAgSW50UmVjdCBmcmFtZVJlY3Qod2VicEZyYW1lLT54X29mZnNldCwgd2VicEZyYW1lLT55X29m
ZnNldCwgd2VicEZyYW1lLT53aWR0aCwgd2VicEZyYW1lLT5oZWlnaHQpOwogCiAgICAgLy8gTWFr
ZSBzdXJlIHRoZSBmcmFtZVJlY3QgZG9lc24ndCBleHRlbmQgb3V0c2lkZSB0aGUgYnVmZmVyLgot
ICAgIGlmIChmcmFtZVJlY3QubWF4WCgpID4gc2l6ZSgpLndpZHRoKCkpCi0gICAgICAgIGZyYW1l
UmVjdC5zZXRXaWR0aChzaXplKCkud2lkdGgoKSAtIHdlYnBGcmFtZS0+eF9vZmZzZXQpOwotICAg
IGlmIChmcmFtZVJlY3QubWF4WSgpID4gc2l6ZSgpLmhlaWdodCgpKQotICAgICAgICBmcmFtZVJl
Y3Quc2V0SGVpZ2h0KHNpemUoKS5oZWlnaHQoKSAtIHdlYnBGcmFtZS0+eV9vZmZzZXQpOworICAg
IGZyYW1lUmVjdC5pbnRlcnNlY3QoeyB7IH0sIHNpemUoKSB9KTsKIAogICAgIGlmICghZnJhbWVJ
bmRleCB8fCAhbV9mcmFtZUJ1ZmZlckNhY2hlW2ZyYW1lSW5kZXggLSAxXS5iYWNraW5nU3RvcmUo
KSkgewogICAgICAgICAvLyBUaGlzIGZyYW1lIGRvZXNuJ3QgcmVseSBvbiBhbnkgcHJldmlvdXMg
ZGF0YS4KQEAgLTI1NCw3ICsyNTIsNiBAQCBib29sIFdFQlBJbWFnZURlY29kZXI6OmluaXRGcmFt
ZUJ1ZmZlcihzaXplX3QgZnJhbWVJbmRleCwgY29uc3QgV2ViUEl0ZXJhdG9yKiB3ZQogCiAgICAg
YnVmZmVyLnNldEhhc0FscGhhKHdlYnBGcmFtZS0+aGFzX2FscGhhKTsKICAgICBidWZmZXIuYmFj
a2luZ1N0b3JlKCktPnNldEZyYW1lUmVjdChmcmFtZVJlY3QpOwotICAgIGJ1ZmZlci5zZXREZWNv
ZGluZ1N0YXR1cyhEZWNvZGluZ1N0YXR1czo6UGFydGlhbCk7CiAKICAgICByZXR1cm4gdHJ1ZTsK
IH0KQEAgLTM1MiwxMSArMzQ5LDEwIEBAIHZvaWQgV0VCUEltYWdlRGVjb2Rlcjo6Y2xlYXJGcmFt
ZUJ1ZmZlckNhY2hlKHNpemVfdCBjbGVhckJlZm9yZUZyYW1lKQogICAgIC8vICAgKiBXZSBkb24n
dCBjbGVhciBhbnkgZnJhbWUgZnJvbSB3aGljaCBhIGZ1dHVyZSBpbml0RnJhbWVCdWZmZXIoKSBj
YWxsIHdpbGwgY29weSBiaXRtYXAgZGF0YS4KICAgICAvLwogICAgIC8vIEluIFdFQlAgZXZlcnkg
ZnJhbWUgZGVwZW5kcyBvbiB0aGUgcHJldmlvdXMgb25lIG9yIG5vbmUuIFRoYXQgbWVhbnMgdGhh
dCBmcmFtZXMgYWZ0ZXIgY2xlYXJCZWZvcmVGcmFtZQotICAgIC8vIHdvbid0IG5lZWQgYW55IGZy
YW1lIGJlZm9yZSB0aGVtIHRvIHJlbmRlciwgc28gd2UgY2FuIGNsZWFyIHRoZW0gYWxsLiBJZiB3
ZSBmaW5kIGEgYnVmZmVyIHRoYXQgaXMgcGFydGlhbCwKLSAgICAvLyBkb24ndCBkZWxldGUgaXQg
YXMgaXQncyBiZWluZyBkZWNvZGVkLgorICAgIC8vIHdvbid0IG5lZWQgYW55IGZyYW1lIGJlZm9y
ZSB0aGVtIHRvIHJlbmRlciwgc28gd2UgY2FuIGNsZWFyIHRoZW0gYWxsLgogICAgIGZvciAoaW50
IGkgPSBjbGVhckJlZm9yZUZyYW1lIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgSW1hZ2VG
cmFtZSYgYnVmZmVyID0gbV9mcmFtZUJ1ZmZlckNhY2hlW2ldOwotICAgICAgICBpZiAoYnVmZmVy
LmlzQ29tcGxldGUoKSB8fCBidWZmZXIuaXNJbnZhbGlkKCkpCisgICAgICAgIGlmICghYnVmZmVy
LmlzSW52YWxpZCgpKQogICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CiAgICAgfQogfQpkaWZm
IC0tZ2l0IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmlu
ZGV4IDlhYTY1OTRkYjE4ZmJjMDg4NmI5ZDZmMTAxYjAxOWYwZmU2YmQ5NDQuLmVjZGU2NjU2MzA1
ZDVkNTU2ZTM2YjU3OTFmMGQ1MDUzMzY0YTZhNzggMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL0No
YW5nZUxvZworKysgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAx
Ny0xMC0yMCAgTWlndWVsIEdvbWV6ICA8bWFnb21lekBpZ2FsaWEuY29tPgorCisgICAgICAgIFtH
VEtdW1dQRV0gRml4IHJldmlldyBjb21tZW50cyBvbiBXRUJQSW1hZ2VEZWNvZGVyCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzgwODAKKworICAgICAg
ICBSZXZpZXdlZCBieSBTYWlkIEFib3UtSGFsbGF3YS4KKworICAgICAgICBBZGp1c3RlZCB0ZXN0
IGR1cmF0aW9uLgorCisgICAgICAgICogZmFzdC9pbWFnZXMvYW5pbWF0ZWQtd2VicC5odG1sOgor
CiAyMDE3LTEwLTE5ICBBbnR0aSBLb2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KIAogICAgICAg
ICBTdXBwb3J0IDo6YmVmb3JlLzo6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzIG9uIGVsZW1lbnRzIHdp
dGggZGlzcGxheTpjb250ZW50cwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC9pbWFnZXMv
YW5pbWF0ZWQtd2VicC5odG1sIGIvTGF5b3V0VGVzdHMvZmFzdC9pbWFnZXMvYW5pbWF0ZWQtd2Vi
cC5odG1sCmluZGV4IGNjYTgxYjkyZmVjN2E3YjFjMjlkNmFjMTA2YTMwNmNlYTYyYTIxZjYuLjQ3
YWY3MGU3ZDNmMjg0YzMzNWE1M2I3ZTMwMzRiMWEwYzRlMzM3NjkgMTAwNjQ0Ci0tLSBhL0xheW91
dFRlc3RzL2Zhc3QvaW1hZ2VzL2FuaW1hdGVkLXdlYnAuaHRtbAorKysgYi9MYXlvdXRUZXN0cy9m
YXN0L2ltYWdlcy9hbmltYXRlZC13ZWJwLmh0bWwKQEAgLTEyLDcgKzEyLDcgQEAKICAgICAgICAg
d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICBpZiAod2luZG93LnRl
c3RSdW5uZXIpCiAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7Ci0gICAg
ICAgIH0sIDUwMCk7CisgICAgICAgIH0sIDMwMCk7CiAgICAgfQogPC9zY3JpcHQ+CiA8c3R5bGU+
Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>