<?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>117735</bug_id>
          
          <creation_ts>2013-06-18 05:32:38 -0700</creation_ts>
          <short_desc>[curl] Improve multipart response handling</short_desc>
          <delta_ts>2013-09-12 11:25:23 -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>WebCore Misc.</component>
          <version>528+ (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>
          
          <blocked>117300</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Peter Gal">galpeter</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>peavo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>901366</commentid>
    <comment_count>0</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-06-18 05:32:38 -0700</bug_when>
    <thetext>The curl backend does not know anything about multipart responses so all of the returned data from the server will be displayed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>903766</commentid>
    <comment_count>1</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-06-26 09:36:37 -0700</bug_when>
    <thetext>Patch should arrive in this week or so.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908830</commentid>
    <comment_count>2</comment_count>
      <attachid>206765</attachid>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-07-16 04:55:42 -0700</bug_when>
    <thetext>Created attachment 206765
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908884</commentid>
    <comment_count>3</comment_count>
    <who name="">peavo</who>
    <bug_when>2013-07-16 07:51:55 -0700</bug_when>
    <thetext>Good stuff, this patch builds just fine on WinCairo.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>908886</commentid>
    <comment_count>4</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-07-16 07:53:32 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Good stuff, this patch builds just fine on WinCairo.

Cool thanks for testing!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>911004</commentid>
    <comment_count>5</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-07-23 05:40:27 -0700</bug_when>
    <thetext>ping?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>911076</commentid>
    <comment_count>6</comment_count>
      <attachid>206765</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2013-07-23 10:18:40 -0700</bug_when>
    <thetext>Comment on attachment 206765
patch

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

Overall this looks good.  There are a few minor style problems that need to be corrected.  I&apos;m also not sure about the meaning of &apos;strict&apos; header parsing.  It would be helpful to know if there are documented rules for when something should be parsed strictly or not.

&gt; Source/WebCore/platform/network/HTTPParsers.cpp:608
&gt; +size_t parseHTTPHeader(const char* start, size_t length, String&amp; failureReason, AtomicString&amp; nameStr, String&amp; valueStr, bool strict)

Who governs whether we are parsing in &apos;strict&apos; mode or not?  Is this documented by an RFC?

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:37
&gt; +bool MultipartHandle::extractBoundary(const String &amp;contentType, String &amp;boundary)

We write this as &quot;const String&amp; contentType&quot; and &quot;String&amp; boundary&quot;.  The reference is part of the type, not the argument name.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:77
&gt; +bool MultipartHandle::matchForBoundary(const char *data, size_t pos, size_t &amp;matched)

We write this as &quot;const char* data&quot; and &quot;size_t&amp; matched&quot;.  The pointer (and reference) token is part of the type, not the argument name.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:81
&gt; +    for (size_t i = 0; i &lt; m_boundaryLength; ++i)

When the contents of a for statement spans multiple lines, I prefer to see them wrapped in brackets to aid readability:

for (size_t i = 0; i &lt; m_boundaryLength; ++i) {

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:85
&gt; +        }

... and close here.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:91
&gt; +bool MultipartHandle::checkForBoundary(size_t &amp;boundaryStart, size_t &amp;lastPartialMatch)

Argument names...

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:94
&gt; +    const char *content = m_buffer.data();

const char* content...

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:116
&gt; +    const char *content = m_buffer.data();

const char* content ...

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:119
&gt; +        return false; // Not enough data, skipping for now.

This comment isn&apos;t helpful; go ahead and remove it.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:136
&gt; +    for (; p &lt; end; p++) {

It&apos;s good to be in the habit of using prefix operator ++/--, since there is a performance benefit to using them for iterators.

for (; p &lt; end; ++p) {

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:156
&gt; +void MultipartHandle::contentReceived(const char *data, size_t length)

const char* data

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:182
&gt; +*/

Nice comment!

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:293
&gt; +    return true; // There is still things to process, so go for it.

This *is* still *a* thing, or There *are* still things.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:322
&gt; +        const char *data = m_buffer.data();

const char* data

&gt; Source/WebCore/platform/network/curl/MultipartHandle.h:40
&gt; +    static bool extractBoundary(const String &amp;contentType, String &amp;boundary);

&amp;&apos;s should be connected to the type declarations, not the argument names.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.h:42
&gt; +    MultipartHandle(ResourceHandle* handle, const String &amp;boundary)

Ditto.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.h:68
&gt; +    bool matchForBoundary(const char *data, size_t pos, size_t &amp;matched);

&amp;&apos;s (and *&apos;s) should be connected to the type declarations, not the argument names.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.h:69
&gt; +    inline bool checkForBoundary(size_t &amp;boundaryStart, size_t &amp;lastPartialMatch);

&amp;&apos;s should be connected to the type declarations, not the argument names.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.h:73
&gt; +    ResourceHandle *m_resourceHandle;

* should be part of the type.

Since ResourceHandle is not &apos;owned&apos; by this object, and the MultipartHandle cannot exist without a resource handle, I wonder if this should be a reference?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>911617</commentid>
    <comment_count>7</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-07-25 08:04:19 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 206765 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=206765&amp;action=review
&gt; 
&gt; Overall this looks good.  There are a few minor style problems that need to be corrected.  I&apos;m also not sure about the meaning of &apos;strict&apos; header parsing.  It would be helpful to know if there are documented rules for when something should be parsed strictly or not.
&gt; 
&gt; &gt; Source/WebCore/platform/network/HTTPParsers.cpp:608
&gt; &gt; +size_t parseHTTPHeader(const char* start, size_t length, String&amp; failureReason, AtomicString&amp; nameStr, String&amp; valueStr, bool strict)
&gt; 
&gt; Who governs whether we are parsing in &apos;strict&apos; mode or not?  Is this documented by an RFC?
&gt; 

In this case if the strict is true it&apos;ll mean that we strictly enforce the HTTP headers to end with \r\n. If it is false we&apos;ll allow headers which are only separated by a \n. The RFC states that the headers should be separated by a \r\n but there are servers and testcases that doesn&apos;t follow this rule (sadly).

Actually I&apos;m not sure if we should allow such headers, but in there are other places in the curl backend where it is allowed, and also I think the other network backends (libsoup for example) allows such headers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>916653</commentid>
    <comment_count>8</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-08-13 04:37:57 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 206765 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=206765&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/MultipartHandle.h:73
&gt; &gt; +    ResourceHandle *m_resourceHandle;
&gt; 
&gt; * should be part of the type.
&gt; 
&gt; Since ResourceHandle is not &apos;owned&apos; by this object, and the MultipartHandle cannot exist without a resource handle, I wonder if this should be a reference?

In case of the FormDataStream the ResourceHandle is also a simple pointer (http://trac.webkit.org/browser/trunk/Source/WebCore/platform/network/curl/FormDataStreamCurl.h#L54) that&apos;s why I did the same here. Also note that in the headerCallback method the ResourceHandle (&apos;job&apos; variable) is pointer and for the &apos;client()-&gt;didReceive*&apos; calls a pointer is required. Still I could change this to be a reference if you think that&apos;ll be better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>917053</commentid>
    <comment_count>9</comment_count>
      <attachid>208710</attachid>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-08-14 03:01:18 -0700</bug_when>
    <thetext>Created attachment 208710
patch v2

updated patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>917075</commentid>
    <comment_count>10</comment_count>
      <attachid>208710</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2013-08-14 04:28:11 -0700</bug_when>
    <thetext>Comment on attachment 208710
patch v2

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

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:63
&gt; +        boundaryEnd = contentType.find(&quot;;&quot;, boundaryStart);

&apos;;&apos;

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:77
&gt; +bool MultipartHandle::matchForBoundary(const char* data, size_t pos, size_t&amp; matchedLength)

We don&apos;t use abbreviations in WebKit: pos -&gt; position

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:82
&gt; +        if (data[pos + i] != m_boundary[i]) {

how do we know data[pos + i] does not go out of bounds?

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:92
&gt; +bool MultipartHandle::checkForBoundary(size_t&amp; boundaryStartPos, size_t&amp; lastPartialMatchPos)

&quot;Pos&quot; -&gt; &quot;Position&apos;

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:99
&gt; +    lastPartialMatchPos = contentLength;

Ditto.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:117
&gt; +    const char* content = m_buffer.data();

This can be moved after the if check for contentLength.

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:135
&gt; +    char* end = const_cast&lt;char*&gt;(content) + contentLength;

Cannot this one be const?

&gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:249
&gt; +        if (!m_buffer.size())

m_buffer.isEmpty()

&gt; Source/WebCore/platform/network/curl/MultipartHandle.h:77
&gt; +    Vector&lt;char&gt; m_buffer;

Considering the operations you are doing (append and remove from beginning), a Vector may not be the best data structure. You might want to take a look at StreamBuffer (or Deque)

&gt; Source/WebCore/platform/network/curl/ResourceHandleManager.cpp:406
&gt; +                d-&gt;m_multipartHandle = adoptPtr(new MultipartHandle(job, boundary));

We usually use static factory functions such as PassOwnPtr&lt;MultipartHandle&gt; MultipartHandle::create() for such cases so that we never deal with raw pointers externally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>924319</commentid>
    <comment_count>11</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-09-04 01:31:16 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 208710 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=208710&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:82
&gt; &gt; +        if (data[pos + i] != m_boundary[i]) {
&gt; 
&gt; how do we know data[pos + i] does not go out of bounds?

Ahh yeah, didn&apos;t checked for that. I&apos;ll fix that.

&gt; &gt; Source/WebCore/platform/network/curl/MultipartHandle.cpp:135
&gt; &gt; +    char* end = const_cast&lt;char*&gt;(content) + contentLength;
&gt; 
&gt; Cannot this one be const?
&gt; 

It can be, and will be :)

&gt; &gt; Source/WebCore/platform/network/curl/MultipartHandle.h:77
&gt; &gt; +    Vector&lt;char&gt; m_buffer;
&gt; 
&gt; Considering the operations you are doing (append and remove from beginning), a Vector may not be the best data structure. You might want to take a look at StreamBuffer (or Deque)
&gt; 

The StreamBuffer operates with the concept of blocks (which are essentially Vectors) and these blocks are in a Deque. Also it is only possible to access the first block only, so if the boundary string is split between 2 block, to correctly handle that case that&apos;ll require more code and/or complexity in the MultipartHandler.

The Deque uses internally the same VectorBuffer as the Vector. Also note that if I would use Deque&lt;char&gt; then when appending characters I would need to iterate over all input chars to call append for each one, in Vector there is already such method so I don&apos;t need to write it (I know not a big excuse but still less code to type this way :))

&gt; &gt; Source/WebCore/platform/network/curl/ResourceHandleManager.cpp:406
&gt; &gt; +                d-&gt;m_multipartHandle = adoptPtr(new MultipartHandle(job, boundary));
&gt; 
&gt; We usually use static factory functions such as PassOwnPtr&lt;MultipartHandle&gt; MultipartHandle::create() for such cases so that we never deal with raw pointers externally.

Okay, that makes sense.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>924496</commentid>
    <comment_count>12</comment_count>
      <attachid>210473</attachid>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-09-04 10:24:50 -0700</bug_when>
    <thetext>Created attachment 210473
patch v3

Updated patch (Sorry for the big delay)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>924498</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-09-04 10:27:50 -0700</bug_when>
    <thetext>Attachment 210473 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCore.vcxproj&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters&apos;, u&apos;Source/WebCore/platform/network/HTTPParsers.cpp&apos;, u&apos;Source/WebCore/platform/network/HTTPParsers.h&apos;, u&apos;Source/WebCore/platform/network/ResourceHandleInternal.h&apos;, u&apos;Source/WebCore/platform/network/curl/MultipartHandle.cpp&apos;, u&apos;Source/WebCore/platform/network/curl/MultipartHandle.h&apos;, u&apos;Source/WebCore/platform/network/curl/ResourceHandleManager.cpp&apos;]&quot; exit_code: 1
Source/WebCore/platform/network/curl/MultipartHandle.h:41:  The parameter name &quot;handle&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 1 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927772</commentid>
    <comment_count>14</comment_count>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2013-09-11 07:25:52 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; Created an attachment (id=210473) [details]
&gt; patch v3
&gt; 

ping?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>928386</commentid>
    <comment_count>15</comment_count>
      <attachid>210473</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2013-09-12 11:02:24 -0700</bug_when>
    <thetext>Comment on attachment 210473
patch v3

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>928400</commentid>
    <comment_count>16</comment_count>
      <attachid>210473</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-09-12 11:25:20 -0700</bug_when>
    <thetext>Comment on attachment 210473
patch v3

Clearing flags on attachment: 210473

Committed r155633: &lt;http://trac.webkit.org/changeset/155633&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>928401</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-09-12 11:25:23 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>206765</attachid>
            <date>2013-07-16 04:55:42 -0700</date>
            <delta_ts>2013-08-14 03:01:18 -0700</delta_ts>
            <desc>patch</desc>
            <filename>curl_multipart_win.patch</filename>
            <type>text/plain</type>
            <size>25758</size>
            <attacher name="Peter Gal">galpeter</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAwNTVlOTk3Li42NzA0ODg4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDEg
QEAKKzIwMTMtMDctMTYgIFBldGVyIEdhbCAgPGdhbHBldGVyQGluZi51LXN6ZWdlZC5odT4KKwor
ICAgICAgICBbY3VybF0gSW1wcm92ZSBtdWx0aXBhcnQgcmVzcG9uc2UgaGFuZGxpbmcKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNzczNQorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBtdWx0aXBhcnQv
eC1taXhlZC1yZXBsYWNlIG1pbWUgdHlwZSBpbiByZXNwb25zZXMgYXJlIGlnbm9yZWQKKyAgICAg
ICAgd2l0aCB0aGUgY3VybCBuZXR3b3JrIGJhY2tlbmQuIFRvIGhhbmRsZSBzdWNoIHJlc3BvbnNl
cyB0aGUKKyAgICAgICAgTXVsdGlwYXJ0SGFuZGxlIGlzIGludHJvZHVjZWQgd2hpY2ggd2lsbCBz
cGxpdCB0aGUgY29udGVudCB1c2luZworICAgICAgICB0aGUgYm91bmRhcnkgc3BlY2lmaWVkIGJ5
IHRoZSBtaW1lIHR5cGUuCisKKyAgICAgICAgVGhlcmUgYXJlIGFscmVhZHkgZXhpc3RpbmcgdGVz
dHMgKGh0dHAvdGVzdHMvbXVsdGlwYXJ0KS4KKworICAgICAgICAqIFdlYkNvcmUudmN4cHJvai9X
ZWJDb3JlLnZjeHByb2o6CisgICAgICAgICogV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJv
ai5maWx0ZXJzOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6cGFyc2VIVFRQSGVhZGVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9u
ZXR3b3JrL0hUVFBQYXJzZXJzLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9SZXNvdXJj
ZUhhbmRsZUludGVybmFsLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRp
cGFydEhhbmRsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxl
OjpleHRyYWN0Qm91bmRhcnkpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpt
YXRjaEZvckJvdW5kYXJ5KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydEhhbmRsZTo6Y2hl
Y2tGb3JCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OnBhcnNl
SGVhZGVyc0lmUG9zc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpj
b250ZW50UmVjZWl2ZWQpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpwcm9j
ZXNzQ29udGVudCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OmNvbnRlbnRF
bmRlZCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OmRpZFJlY2VpdmVEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydEhhbmRsZTo6ZGlkUmVjZWl2ZVJlc3BvbnNl
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpNdWx0aXBhcnRIYW5kbGUp
OgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjp+TXVsdGlwYXJ0SGFuZGxlKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OndyaXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6
aGVhZGVyQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVNYW5hZ2Vy
Ojpkb3dubG9hZFRpbWVyQ2FsbGJhY2spOgorCiAyMDEzLTA3LTAxICBCcmlhbiBIb2x0ICA8YnJp
YW4uaG9sdEBzYW1zdW5nLmNvbT4KIAogICAgICAgICBbQVRLXSBMZWFrOiBsZWFrcyBpbiBXZWJL
aXRBY2Nlc3NpYmxlSW50ZXJmYWNlVGV4dApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4
cHJvai9XZWJDb3JlLnZjeHByb2oKaW5kZXggZGFhMDlkZi4uZDQwZmNkYiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCkBAIC01MDI1LDYgKzUw
MjUsMTIgQEAKICAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3Vy
YXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21C
dWlsZD4KICAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRp
b24pfCQoUGxhdGZvcm0pJz09J1Byb2R1Y3Rpb258V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21C
dWlsZD4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHBsYXRm
b3JtXG5ldHdvcmtcY3VybFxNdWx0aXBhcnRIYW5kbGUuY3BwIj4KKyAgICAgIDxFeGNsdWRlZEZy
b21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVn
fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgICA8RXhjbHVkZWRGcm9tQnVp
bGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z1N1ZmZp
eHxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1
aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxX
aW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxk
IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZHVjdGlvbnxX
aW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxD
bENvbXBpbGUgSW5jbHVkZT0iLi5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXFByb3h5U2VydmVyQ3Vy
bC5jcHAiPgogICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJh
dGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWls
ZD4KICAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24p
fCQoUGxhdGZvcm0pJz09J0RlYnVnU3VmZml4fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVp
bGQ+CkBAIC0xMjI3OSw2ICsxMjI4NSwxMiBAQAogICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENv
bmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMici
PnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgogICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRp
dGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZHVjdGlvbnxXaW4zMici
PnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgogICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgorICAgIDxD
dXN0b21CdWlsZFN0ZXAgSW5jbHVkZT0iLi5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXE11bHRpcGFy
dEhhbmRsZS5oIj4KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZp
Z3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9t
QnVpbGQ+CisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0
aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z1N1ZmZpeHxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJv
bUJ1aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJh
dGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1
aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlv
bil8JChQbGF0Zm9ybSknPT0nUHJvZHVjdGlvbnxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1
aWxkPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgogICAgIDxDdXN0b21CdWlsZFN0ZXAgSW5jbHVk
ZT0iLi5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXFJlc291cmNlRXJyb3IuaCI+CiAgICAgICA8RXhj
bHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9
PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgogICAgICAgPEV4Y2x1ZGVk
RnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVi
dWdTdWZmaXh8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2ouZmlsdGVycyBiL1Nv
dXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2ouZmlsdGVycwppbmRl
eCBlOWM2ODRkLi4zN2JhZWFlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZj
eHByb2ovV2ViQ29yZS52Y3hwcm9qLmZpbHRlcnMKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvai5maWx0ZXJzCkBAIC0xOTY4LDYgKzE5NjgsOSBAQAog
ICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXEZvcm1EYXRh
U3RyZWFtQ3VybC5jcHAiPgogICAgICAgPEZpbHRlcj5wbGF0Zm9ybVxuZXR3b3JrXGN1cmw8L0Zp
bHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHBsYXRm
b3JtXG5ldHdvcmtcY3VybFxNdWx0aXBhcnRIYW5kbGUuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cGxh
dGZvcm1cbmV0d29ya1xjdXJsPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29t
cGlsZSBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxuZXR3b3JrXGN1cmxcUHJveHlTZXJ2ZXJDdXJsLmNw
cCI+CiAgICAgICA8RmlsdGVyPnBsYXRmb3JtXG5ldHdvcmtcY3VybDwvRmlsdGVyPgogICAgIDwv
Q2xDb21waWxlPgpAQCAtMTU2NjAsNiArMTU2NjMsOSBAQAogICAgIDxDdXN0b21CdWlsZFN0ZXAg
SW5jbHVkZT0iLi5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXEZvcm1EYXRhU3RyZWFtQ3VybC5oIj4K
ICAgICAgIDxGaWx0ZXI+cGxhdGZvcm1cbmV0d29ya1xjdXJsPC9GaWx0ZXI+CiAgICAgPC9DdXN0
b21CdWlsZFN0ZXA+CisgICAgPEN1c3RvbUJ1aWxkU3RlcCBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxu
ZXR3b3JrXGN1cmxcTXVsdGlwYXJ0SGFuZGxlLmgiPgorICAgICAgPEZpbHRlcj5wbGF0Zm9ybVxu
ZXR3b3JrXGN1cmw8L0ZpbHRlcj4KKyAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KICAgICA8Q3VzdG9t
QnVpbGRTdGVwIEluY2x1ZGU9Ii4uXHBsYXRmb3JtXG5ldHdvcmtcY3VybFxSZXNvdXJjZUVycm9y
LmgiPgogICAgICAgPEZpbHRlcj5wbGF0Zm9ybVxuZXR3b3JrXGN1cmw8L0ZpbHRlcj4KICAgICA8
L0N1c3RvbUJ1aWxkU3RlcD4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvSFRUUFBhcnNlcnMuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9I
VFRQUGFyc2Vycy5jcHAKaW5kZXggN2Y4NTkzYS4uNTRiODVkNyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vycy5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vycy5jcHAKQEAgLTYwNSw3ICs2MDUsNyBA
QCBzaXplX3QgcGFyc2VIVFRQUmVxdWVzdExpbmUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxl
bmd0aCwgU3RyaW5nJiBmYWlsdXJlUmVhcwogICAgIHJldHVybiBlbmQgLSBkYXRhOwogfQogCi1z
aXplX3QgcGFyc2VIVFRQSGVhZGVyKGNvbnN0IGNoYXIqIHN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBT
dHJpbmcmIGZhaWx1cmVSZWFzb24sIEF0b21pY1N0cmluZyYgbmFtZVN0ciwgU3RyaW5nJiB2YWx1
ZVN0cikKK3NpemVfdCBwYXJzZUhUVFBIZWFkZXIoY29uc3QgY2hhciogc3RhcnQsIHNpemVfdCBs
ZW5ndGgsIFN0cmluZyYgZmFpbHVyZVJlYXNvbiwgQXRvbWljU3RyaW5nJiBuYW1lU3RyLCBTdHJp
bmcmIHZhbHVlU3RyLCBib29sIHN0cmljdCkKIHsKICAgICBjb25zdCBjaGFyKiBwID0gc3RhcnQ7
CiAgICAgY29uc3QgY2hhciogZW5kID0gc3RhcnQgKyBsZW5ndGg7CkBAIC02NDgsMTcgKzY0OCwy
MCBAQCBzaXplX3QgcGFyc2VIVFRQSGVhZGVyKGNvbnN0IGNoYXIqIHN0YXJ0LCBzaXplX3QgbGVu
Z3RoLCBTdHJpbmcmIGZhaWx1cmVSZWFzb24sCiAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAg
ICAgIGJyZWFrOwogICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBmYWlsdXJlUmVhc29u
ID0gIlVuZXhwZWN0ZWQgTEYgaW4gdmFsdWUgYXQgIiArIHRyaW1JbnB1dFNhbXBsZSh2YWx1ZS5k
YXRhKCksIHZhbHVlLnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAg
IGlmIChzdHJpY3QpIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlUmVhc29uID0gIlVuZXhwZWN0
ZWQgTEYgaW4gdmFsdWUgYXQgIiArIHRyaW1JbnB1dFNhbXBsZSh2YWx1ZS5kYXRhKCksIHZhbHVl
LnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHZhbHVlLmFwcGVu
ZCgqcCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCpwID09ICdccicpIHsKKyAgICAgICAgaWYg
KCpwID09ICdccicgfHwgKCFzdHJpY3QgJiYgKnAgPT0gJ1xuJykpIHsKICAgICAgICAgICAgICsr
cDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwID49IGVu
ZCB8fCAqcCAhPSAnXG4nKSB7CisgICAgaWYgKHAgPj0gZW5kIHx8IChzdHJpY3QgJiYgKnAgIT0g
J1xuJykpIHsKICAgICAgICAgZmFpbHVyZVJlYXNvbiA9ICJDUiBkb2Vzbid0IGZvbGxvdyBMRiBh
ZnRlciB2YWx1ZSBhdCAiICsgdHJpbUlucHV0U2FtcGxlKHAsIGVuZCAtIHApOwogICAgICAgICBy
ZXR1cm4gMDsKICAgICB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL0hUVFBQYXJzZXJzLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBQ
YXJzZXJzLmgKaW5kZXggNzEwNzVlOS4uYmUxNWZlOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vycy5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMuaApAQCAtODYsNyArODYsNyBAQCBDb250ZW50VHlw
ZU9wdGlvbnNEaXNwb3NpdGlvbiBwYXJzZUNvbnRlbnRUeXBlT3B0aW9uc0hlYWRlcihjb25zdCBT
dHJpbmcmIGhlYWRlcgogLy8gUGFyc2luZyBDb21wbGV0ZSBIVFRQIE1lc3NhZ2VzLgogZW51bSBI
VFRQVmVyc2lvbiB7IFVua25vd24sIEhUVFBfMV8wLCBIVFRQXzFfMSB9Owogc2l6ZV90IHBhcnNl
SFRUUFJlcXVlc3RMaW5lKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgsIFN0cmluZyYg
ZmFpbHVyZVJlYXNvbiwgU3RyaW5nJiBtZXRob2QsIFN0cmluZyYgdXJsLCBIVFRQVmVyc2lvbiYp
Owotc2l6ZV90IHBhcnNlSFRUUEhlYWRlcihjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuZ3Ro
LCBTdHJpbmcmIGZhaWx1cmVSZWFzb24sIEF0b21pY1N0cmluZyYgbmFtZVN0ciwgU3RyaW5nJiB2
YWx1ZVN0cik7CitzaXplX3QgcGFyc2VIVFRQSGVhZGVyKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVf
dCBsZW5ndGgsIFN0cmluZyYgZmFpbHVyZVJlYXNvbiwgQXRvbWljU3RyaW5nJiBuYW1lU3RyLCBT
dHJpbmcmIHZhbHVlU3RyLCBib29sIHN0cmljdCA9IHRydWUpOwogc2l6ZV90IHBhcnNlSFRUUFJl
cXVlc3RCb2R5KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgsIFZlY3Rvcjx1bnNpZ25l
ZCBjaGFyPiYgYm9keSk7CiAKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmgKaW5kZXggNWY5NTExMi4uODU2NmRh
MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhh
bmRsZUludGVybmFsLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNv
dXJjZUhhbmRsZUludGVybmFsLmgKQEAgLTQ0LDYgKzQ0LDggQEAKICNpZiBVU0UoQ1VSTCkKICNp
bmNsdWRlIDxjdXJsL2N1cmwuaD4KICNpbmNsdWRlICJGb3JtRGF0YVN0cmVhbUN1cmwuaCIKKyNp
bmNsdWRlICJNdWx0aXBhcnRIYW5kbGUuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CiAjZW5k
aWYKIAogI2lmIFVTRShTT1VQKQpAQCAtMTg4LDYgKzE5MCw4IEBAIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAogICAgICAgICBGb3JtRGF0YVN0cmVhbSBtX2Zvcm1EYXRhU3RyZWFtOwogICAgICAgICBW
ZWN0b3I8Y2hhcj4gbV9wb3N0Qnl0ZXM7CisKKyAgICAgICAgT3duUHRyPE11bHRpcGFydEhhbmRs
ZT4gbV9tdWx0aXBhcnRIYW5kbGU7CiAjZW5kaWYKICNpZiBVU0UoU09VUCkKICAgICAgICAgR1Jl
ZlB0cjxTb3VwTWVzc2FnZT4gbV9zb3VwTWVzc2FnZTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9NdWx0aXBhcnRIYW5kbGUuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1OWUwYQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9NdWx0aXBhcnRIYW5kbGUuY3BwCkBA
IC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFVuaXZlcnNpdHkgb2Yg
U3plZ2VkCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVU5JVkVSU0lUWSBPRiBTWkVHRUQgYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBVTklWRVJTSVRZIE9GIFNaRUdFRCBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiTXVsdGlwYXJ0SGFuZGxlLmgiCisKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5o
IgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlQ2xpZW50LmgiCisjaW5jbHVkZSAiUmVzb3VyY2VI
YW5kbGVJbnRlcm5hbC5oIgorI2luY2x1ZGUgIlJlc291cmNlUmVzcG9uc2UuaCIKKyNpbmNsdWRl
IDx3dGYvU3RyaW5nRXh0cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworYm9vbCBNdWx0
aXBhcnRIYW5kbGU6OmV4dHJhY3RCb3VuZGFyeShjb25zdCBTdHJpbmcgJmNvbnRlbnRUeXBlLCBT
dHJpbmcgJmJvdW5kYXJ5KQoreworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbGVuZ3RoID0gc3Ry
bGVuKCJib3VuZGFyeT0iKTsKKyAgICBzaXplX3QgYm91bmRhcnlTdGFydCA9IGNvbnRlbnRUeXBl
LmZpbmRJZ25vcmluZ0Nhc2UoImJvdW5kYXJ5PSIpOworCisgICAgLy8gTm8gYm91bmRhcnkgZm91
bmQuCisgICAgaWYgKGJvdW5kYXJ5U3RhcnQgPT0gbm90Rm91bmQpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGJvdW5kYXJ5U3RhcnQgKz0gbGVuZ3RoOworICAgIHNpemVfdCBib3VuZGFy
eUVuZCA9IDA7CisKKyAgICBpZiAoY29udGVudFR5cGVbYm91bmRhcnlTdGFydF0gPT0gJyInKSB7
CisgICAgICAgIC8vIEJvdW5kYXJ5IHZhbHVlIHN0YXJ0cyB3aXRoIGEgIiBxdW90ZS4gU2VhcmNo
IGZvciB0aGUgY2xvc2luZyBvbmUuCisgICAgICAgICsrYm91bmRhcnlTdGFydDsKKyAgICAgICAg
Ym91bmRhcnlFbmQgPSBjb250ZW50VHlwZS5maW5kKCciJywgYm91bmRhcnlTdGFydCk7CisgICAg
ICAgIGlmIChib3VuZGFyeUVuZCA9PSBub3RGb3VuZCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlW2JvdW5kYXJ5U3RhcnRdID09ICdcJycpIHsK
KyAgICAgICAgLy8gQm91bmRhcnkgdmFsdWUgc3RhcnRzIHdpdGggYSAnIHF1b3RlLiBTZWFyY2gg
Zm9yIHRoZSBjbG9zaW5nIG9uZS4KKyAgICAgICAgKytib3VuZGFyeVN0YXJ0OworICAgICAgICBi
b3VuZGFyeUVuZCA9IGNvbnRlbnRUeXBlLmZpbmQoJ1wnJywgYm91bmRhcnlTdGFydCk7CisgICAg
ICAgIGlmIChib3VuZGFyeUVuZCA9PSBub3RGb3VuZCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGVuZCBvZiB0aGUgYm91
bmRhcnkuIFRoYXQgY2FuIGJlIGEgc2VtaWNvbG9uIG9yIGEgbmV3bGluZS4KKyAgICAgICAgYm91
bmRhcnlFbmQgPSBjb250ZW50VHlwZS5maW5kKCI7IiwgYm91bmRhcnlTdGFydCk7CisgICAgICAg
IGlmIChib3VuZGFyeUVuZCA9PSBub3RGb3VuZCkKKyAgICAgICAgICAgIGJvdW5kYXJ5RW5kID0g
Y29udGVudFR5cGUubGVuZ3RoKCk7CisgICAgfQorCisgICAgLy8gVGhlIGJvdW5kYXJ5IGVuZCBz
aG91bGQgbm90IGJlIGJlZm9yZSB0aGUgc3RhcnQKKyAgICBpZiAoYm91bmRhcnlFbmQgPD0gYm91
bmRhcnlTdGFydCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm91bmRhcnkgPSBjb250
ZW50VHlwZS5zdWJzdHJpbmcoYm91bmRhcnlTdGFydCwgYm91bmRhcnlFbmQgLSBib3VuZGFyeVN0
YXJ0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIE11bHRpcGFydEhhbmRsZTo6bWF0
Y2hGb3JCb3VuZGFyeShjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgcG9zLCBzaXplX3QgJm1hdGNo
ZWQpCit7CisgICAgbWF0Y2hlZCA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
Ym91bmRhcnlMZW5ndGg7ICsraSkKKyAgICAgICAgaWYgKGRhdGFbcG9zICsgaV0gIT0gbV9ib3Vu
ZGFyeVtpXSkgeworICAgICAgICAgICAgbWF0Y2hlZCA9IGk7CisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKworICAgIG1hdGNoZWQgPSBtX2JvdW5kYXJ5TGVuZ3RoOworICAg
IHJldHVybiB0cnVlOworfQorCitib29sIE11bHRpcGFydEhhbmRsZTo6Y2hlY2tGb3JCb3VuZGFy
eShzaXplX3QgJmJvdW5kYXJ5U3RhcnQsIHNpemVfdCAmbGFzdFBhcnRpYWxNYXRjaCkKK3sKKyAg
ICBzaXplX3QgY29udGVudExlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICBjb25zdCBjaGFy
ICpjb250ZW50ID0gbV9idWZmZXIuZGF0YSgpOworICAgIHNpemVfdCBtYXRjaGVkOworCisgICAg
Ym91bmRhcnlTdGFydCA9IG5vdEZvdW5kOworICAgIGxhc3RQYXJ0aWFsTWF0Y2ggPSBjb250ZW50
TGVuZ3RoOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb250ZW50TGVuZ3RoOyArK2kp
IHsKKyAgICAgICAgaWYgKG1hdGNoRm9yQm91bmRhcnkoY29udGVudCwgaSwgbWF0Y2hlZCkpIHsK
KyAgICAgICAgICAgIGJvdW5kYXJ5U3RhcnQgPSBpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF0Y2hlZCkKKyAgICAgICAgICAgIGxhc3RQYXJ0
aWFsTWF0Y2ggPSBpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdWx0
aXBhcnRIYW5kbGU6OnBhcnNlSGVhZGVyc0lmUG9zc2libGUoKQoreworICAgIHNpemVfdCBjb250
ZW50TGVuZ3RoID0gbV9idWZmZXIuc2l6ZSgpOworICAgIGNvbnN0IGNoYXIgKmNvbnRlbnQgPSBt
X2J1ZmZlci5kYXRhKCk7CisKKyAgICBpZiAoIWNvbnRlbnRMZW5ndGgpCisgICAgICAgIHJldHVy
biBmYWxzZTsgLy8gTm90IGVub3VnaCBkYXRhLCBza2lwcGluZyBmb3Igbm93LgorCisgICAgLy8g
Q2hlY2sgaWYgd2UgaGF2ZSB0aGUgaGVhZGVyIGNsb3Npbmcgc3RyaW5ncy4KKyAgICBpZiAoIXN0
cm5zdHIoY29udGVudCwgIlxyXG5cclxuIiwgY29udGVudExlbmd0aCkpIHsKKyAgICAgICAgLy8g
U29tZSBzZXJ2ZXJzIGNsb3NlcyB0aGUgaGVhZGVycyB3aXRoIG9ubHkgXG4tcy4KKyAgICAgICAg
aWYgKCFzdHJuc3RyKGNvbnRlbnQsICJcblxuIiwgY29udGVudExlbmd0aCkpIHsKKyAgICAgICAg
ICAgIC8vIERvbid0IGhhdmUgdGhlIGhlYWRlciBjbG9zaW5nIHN0cmluZy4gV2FpdCBmb3IgbW9y
ZSBkYXRhLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gUGFyc2UgdGhlIEhUVFAgaGVhZGVycy4KKyAgICBTdHJpbmcgdmFsdWU7CisgICAgQXRv
bWljU3RyaW5nIG5hbWU7CisgICAgY2hhciogcCA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGNvbnRlbnQp
OworICAgIGNoYXIqIGVuZCA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGNvbnRlbnQpICsgY29udGVudExl
bmd0aDsKKyAgICBzaXplX3QgdG90YWxDb25zdW1lZExlbmd0aCA9IDA7CisgICAgZm9yICg7IHAg
PCBlbmQ7IHArKykgeworICAgICAgICBTdHJpbmcgZmFpbHVyZVJlYXNvbjsKKyAgICAgICAgc2l6
ZV90IGNvbnN1bWVkTGVuZ3RoID0gcGFyc2VIVFRQSGVhZGVyKHAsIGVuZCAtIHAsIGZhaWx1cmVS
ZWFzb24sIG5hbWUsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgIGlmICghY29uc3VtZWRMZW5ndGgp
CisgICAgICAgICAgICBicmVhazsgLy8gTm8gbW9yZSBoZWFkZXIgdG8gcGFyc2UuCisKKyAgICAg
ICAgcCArPSBjb25zdW1lZExlbmd0aDsKKyAgICAgICAgdG90YWxDb25zdW1lZExlbmd0aCArPSBj
b25zdW1lZExlbmd0aDsKKworICAgICAgICAvLyBUaGUgbmFtZSBzaG91bGQgbm90IGJlIGVtcHR5
LCBidXQgdGhlIHZhbHVlIGNvdWxkIGJlIGVtcHR5LgorICAgICAgICBpZiAobmFtZS5pc0VtcHR5
KCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBtX2hlYWRlcnMuYWRkKG5hbWUsIHZh
bHVlKTsKKyAgICB9CisKKyAgICBtX2J1ZmZlci5yZW1vdmUoMCwgdG90YWxDb25zdW1lZExlbmd0
aCArIDEpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE11bHRpcGFydEhhbmRsZTo6Y29u
dGVudFJlY2VpdmVkKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYg
KG1fc3RhdGUgPT0gRW5kKQorICAgICAgICByZXR1cm47IC8vIFRoZSBoYW5kbGVyIGlzIGNsb3Nl
ZCBkb3duIHNvIGlnbm9yZSBldmVyeXRoaW5nLgorCisgICAgbV9idWZmZXIuYXBwZW5kKGRhdGEs
IGxlbmd0aCk7CisKKyAgICB3aGlsZSAocHJvY2Vzc0NvbnRlbnQoKSkgeyB9Cit9CisKK2Jvb2wg
TXVsdGlwYXJ0SGFuZGxlOjpwcm9jZXNzQ29udGVudCgpCit7CisvKgorICAgIFRoZSBhbGxvd2Vk
IHRyYW5zaXRpb25zIGJldHdlZW4gdGhlIHN0YXRlczoKKyAgICAgICAgIENoZWNrIEJvdW5kYXJ5
CisgICAgICAgICAgICAgICB8CisgICAgICAvLS0gSW4gQm91bmRhcnkgPC0tLS1cCisgICAgIHwg
ICAgICAgICB8ICAgICAgICAgICAgfAorICAgICB8ICAgICBJbiBIZWFkZXIgICAgICAgIHwKKyAg
ICAgfCAgICAgICAgIHwgICAgICAgICAgICB8CisgICAgIHwgICAgIEluIENvbnRlbnQgICAgICAg
fAorICAgICB8ICAgICAgICAgfCAgICAgICAgICAgIHwKKyAgICAgfCAgICBFbmQgQm91bmRhcnkg
LS0tLS8KKyAgICAgfCAgICAgICAgIHwKKyAgICAgIFwtLS0tLT4gRW5kCisKKyovCisgICAgc3dp
dGNoIChtX3N0YXRlKSB7CisgICAgY2FzZSBDaGVja0JvdW5kYXJ5OiB7CisgICAgICAgIGlmICht
X2J1ZmZlci5zaXplKCkgPCBtX2JvdW5kYXJ5TGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBXZSBk
b24ndCBoYXZlIGVub3VnaCBkYXRhLCBzbyBqdXN0IHNraXAuCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGJvdW5kYXJ5IHN0
cmluZy4KKyAgICAgICAgc2l6ZV90IGJvdW5kYXJ5U3RhcnQ7CisgICAgICAgIHNpemVfdCBsYXN0
UGFydGlhbE1hdGNoOworCisgICAgICAgIGlmICghY2hlY2tGb3JCb3VuZGFyeShib3VuZGFyeVN0
YXJ0LCBsYXN0UGFydGlhbE1hdGNoKSAmJiBib3VuZGFyeVN0YXJ0ID09IG5vdEZvdW5kKSB7Cisg
ICAgICAgICAgICAvLyBEaWQgbm90IGZpbmQgdGhlIGJvdW5kYXJ5IHN0YXJ0IGluIHRoaXMgY2h1
bmsuCisgICAgICAgICAgICAvLyBTa2lwIGFoZWFkIHRvIHRoZSBsYXN0IHZhbGlkIGxvb2tpbmcg
Ym91bmRhcnkgY2hhcmFjdGVyIGFuZCBzdGFydCBhZ2Fpbi4KKyAgICAgICAgICAgIG1fYnVmZmVy
LnJlbW92ZSgwLCBsYXN0UGFydGlhbE1hdGNoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIEZvdW5kIHRoZSBib3VuZGFyeSBzdGFydC4KKyAgICAg
ICAgLy8gQ29uc3VtZSBldmVyeXRoaW5nIGJlZm9yZSB0aGF0IGFuZCBhbHNvIHRoZSBib3VuZGFy
eQorICAgICAgICBtX2J1ZmZlci5yZW1vdmUoMCwgYm91bmRhcnlTdGFydCArIG1fYm91bmRhcnlM
ZW5ndGgpOworICAgICAgICBtX3N0YXRlID0gSW5Cb3VuZGFyeTsKKyAgICB9CisgICAgLy8gRmFs
bHRocm91Z2guCisgICAgY2FzZSBJbkJvdW5kYXJ5OiB7CisgICAgICAgIC8vIE5vdyB0aGUgZmly
c3QgdHdvIGNoYXJhY3RlcnMgc2hvdWxkIGJlOiBcclxuCisgICAgICAgIGlmIChtX2J1ZmZlci5z
aXplKCkgPCAyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNvbnN0IGNo
YXIgKmNvbnRlbnQgPSBtX2J1ZmZlci5kYXRhKCk7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQgd2Un
bGwgcmVtb3ZlIDIgY2hhcmFjdGVycyBhdCB0aGUgZW5kLgorICAgICAgICAvLyBUaGUgXHIgYW5k
IFxuIGFzIHN0YXRlZCBpbiB0aGUgbXVsdGlwYXJ0IFJGQy4KKyAgICAgICAgc2l6ZV90IHJlbW92
ZUNvdW50ID0gMjsKKworICAgICAgICBpZiAoY29udGVudFswXSAhPSAnXHInIHx8IGNvbnRlbnRb
MV0gIT0gJ1xuJykgeworICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGEgXHIgYW5kIGEg
XG4gYnV0IGl0IHNlZW1zIHRoYXQncyBub3QgdGhlIGNhc2UuCisgICAgICAgICAgICAvLyBTbyB3
ZSdsbCBjaGVjayBmb3IgYSBzaW1wbGUgXG4uIE5vdCByZWFsbHkgUkZDIGNvbXBhdGlibGUgYnV0
IHNlcnZlcnMgZG8gdHJpY2t5IHRoaW5ncy4KKyAgICAgICAgICAgIGlmIChjb250ZW50WzBdICE9
ICdcbicpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIG5vIFxuIHNvIGp1c3QgZ28gdG8gdGhl
IGVuZC4KKyAgICAgICAgICAgICAgICBtX3N0YXRlID0gRW5kOworICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm91bmQgYSBzaW1w
bGUgXG4gc28gcmVtb3ZlIGp1c3QgdGhhdC4KKyAgICAgICAgICAgIHJlbW92ZUNvdW50ID0gMTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMuCisgICAgICAg
IG1fYnVmZmVyLnJlbW92ZSgwLCByZW1vdmVDb3VudCk7CisgICAgICAgIG1faGVhZGVycy5jbGVh
cigpOworICAgICAgICBtX3N0YXRlID0gSW5IZWFkZXI7CisgICAgfQorICAgIC8vIEZhbGx0aHJv
dWdoLgorICAgIGNhc2UgSW5IZWFkZXI6IHsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgaGVhZGVy
cy4KKyAgICAgICAgaWYgKCFwYXJzZUhlYWRlcnNJZlBvc3NpYmxlKCkpIHsKKyAgICAgICAgICAg
IC8vIFBhcnNpbmcgb2YgaGVhZGVycyBmYWlsZWQsIHRyeSBhZ2FpbiBsYXRlci4KKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZFJlY2VpdmVSZXNwb25z
ZSgpOworICAgICAgICBtX3N0YXRlID0gSW5Db250ZW50OworICAgIH0KKyAgICAvLyBGYWxsdGhy
b3VnaC4KKyAgICBjYXNlIEluQ29udGVudDogeworICAgICAgICBpZiAoIW1fYnVmZmVyLnNpemUo
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBzaXplX3QgYm91bmRhcnlT
dGFydCA9IG5vdEZvdW5kOworICAgICAgICBzaXplX3QgbGFzdFBhcnRpYWxNYXRjaDsKKworICAg
ICAgICBpZiAoIWNoZWNrRm9yQm91bmRhcnkoYm91bmRhcnlTdGFydCwgbGFzdFBhcnRpYWxNYXRj
aCkgJiYgYm91bmRhcnlTdGFydCA9PSBub3RGb3VuZCkgeworICAgICAgICAgICAgLy8gRGlkIG5v
dCBmaW5kIHRoZSBib3VuZGFyeSBzdGFydCwgYWxsIGRhdGEgdXAgdG8gdGhlIGxhc3RQYXJ0aWFs
TWF0Y2ggaXMgb2suCisgICAgICAgICAgICBkaWRSZWNlaXZlRGF0YShsYXN0UGFydGlhbE1hdGNo
KTsKKyAgICAgICAgICAgIG1fYnVmZmVyLnJlbW92ZSgwLCBsYXN0UGFydGlhbE1hdGNoKTsKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJlIHdh
cyBhIGJvdW5kYXJ5IHN0YXJ0IChvciBlbmQgd2UnbGwgY2hlY2sgdGhhdCBsYXRlciksIHB1c2gg
b3V0IHBhcnQgb2YgdGhlIGRhdGEuCisgICAgICAgIGRpZFJlY2VpdmVEYXRhKGJvdW5kYXJ5U3Rh
cnQpOworICAgICAgICBtX2J1ZmZlci5yZW1vdmUoMCwgYm91bmRhcnlTdGFydCArIG1fYm91bmRh
cnlMZW5ndGgpOworICAgICAgICBtX3N0YXRlID0gRW5kQm91bmRhcnk7CisgICAgfQorICAgIC8v
IEZhbGx0aHJvdWdoLgorICAgIGNhc2UgRW5kQm91bmRhcnk6IHsKKyAgICAgICAgaWYgKG1fYnVm
ZmVyLnNpemUoKSA8IDIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vdCBlbm91Z2gg
ZGF0YSB0byBjaGVjay4gUmV0dXJuIGxhdGVyIHdoZW4gdGhlcmUgaXMgbW9yZSBkYXRhLgorCisg
ICAgICAgIC8vIFdlJ2xsIGRlY2lkZSBpZiB0aGlzIGlzIGEgY2xvc2luZyBib3VuZGFyeSBvciBh
biBvcGVuaW5nIG9uZS4KKyAgICAgICAgY29uc3QgY2hhciAqY29udGVudCA9IG1fYnVmZmVyLmRh
dGEoKTsKKworICAgICAgICBpZiAoY29udGVudFswXSA9PSAnLScgJiYgY29udGVudFsxXSA9PSAn
LScpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjbG9zaW5nIGJvdW5kYXJ5LiBDbG9zZSBk
b3duIHRoZSBoYW5kbGVyLgorICAgICAgICAgICAgbV9zdGF0ZSA9IEVuZDsKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgd2FzIGEgc2ltcGxl
IGNvbnRlbnQgc2VwYXJhdG9yIG5vdCBhIGNsb3Npbmcgb25lLgorICAgICAgICAvLyBHbyB0byBi
ZWZvcmUgdGhlIGNvbnRlbnQgcHJvY2Vzc2luZy4KKyAgICAgICAgbV9zdGF0ZSA9IEluQm91bmRh
cnk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEVuZDoKKyAgICAgICAgLy8gV2Ug
YXJlIGRvbmUuIE5vdGhpbmcgdG8gZG8gYW55bW9yZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7IC8vIFRoZXJlIGlzIHN0aWxsIHRo
aW5ncyB0byBwcm9jZXNzLCBzbyBnbyBmb3IgaXQuCit9CisKK3ZvaWQgTXVsdGlwYXJ0SGFuZGxl
Ojpjb250ZW50RW5kZWQoKQoreworICAgIC8vIFByb2Nlc3MgdGhlIGxlZnRvdmVyIGRhdGEuCisg
ICAgd2hpbGUgKHByb2Nlc3NDb250ZW50KCkpIHsgfQorCisgICAgaWYgKG1fc3RhdGUgIT0gRW5k
KSB7CisgICAgICAgIC8vIEl0IHNlZW1zIHdlIGFyZSBzdGlsbCBub3QgYXQgdGhlIGVuZCBvZiB0
aGUgcHJvY2Vzc2luZy4KKyAgICAgICAgLy8gUHVzaCBvdXQgdGhlIHJlbWFpbmluZyBkYXRhLgor
ICAgICAgICBkaWRSZWNlaXZlRGF0YShtX2J1ZmZlci5zaXplKCkpOworICAgICAgICBtX3N0YXRl
ID0gRW5kOworICAgIH0KKworICAgIG1fYnVmZmVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgTXVsdGlw
YXJ0SGFuZGxlOjpkaWRSZWNlaXZlRGF0YShzaXplX3QgbGVuZ3RoKQoreworICAgIFJlc291cmNl
SGFuZGxlSW50ZXJuYWwqIGQgPSBtX3Jlc291cmNlSGFuZGxlLT5nZXRJbnRlcm5hbCgpOworCisg
ICAgaWYgKGQtPm1fY2FuY2VsbGVkKSB7CisgICAgICAgIC8vIFJlcXVlc3QgaGFzIGJlZW4gY2Fu
Y2VsZWQsIHNvIHdlJ2xsIGdvIHRvIHRoZSBlbmQgc3RhdGUuCisgICAgICAgIG1fc3RhdGUgPSBF
bmQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZC0+Y2xpZW50KCkpIHsKKyAg
ICAgICAgY29uc3QgY2hhciAqZGF0YSA9IG1fYnVmZmVyLmRhdGEoKTsKKyAgICAgICAgZC0+Y2xp
ZW50KCktPmRpZFJlY2VpdmVEYXRhKG1fcmVzb3VyY2VIYW5kbGUsIGRhdGEsIGxlbmd0aCwgbGVu
Z3RoKTsKKyAgICB9Cit9CisKK3ZvaWQgTXVsdGlwYXJ0SGFuZGxlOjpkaWRSZWNlaXZlUmVzcG9u
c2UoKQoreworICAgIFJlc291cmNlSGFuZGxlSW50ZXJuYWwqIGQgPSBtX3Jlc291cmNlSGFuZGxl
LT5nZXRJbnRlcm5hbCgpOworICAgIGlmIChkLT5jbGllbnQoKSkgeworICAgICAgICBPd25QdHI8
UmVzb3VyY2VSZXNwb25zZT4gcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3BvbnNlQmFzZTo6YWRvcHQo
ZC0+bV9yZXNwb25zZS5jb3B5RGF0YSgpKTsKKworICAgICAgICBIVFRQSGVhZGVyTWFwOjpjb25z
dF9pdGVyYXRvciBlbmQgPSBtX2hlYWRlcnMuZW5kKCk7CisgICAgICAgIGZvciAoSFRUUEhlYWRl
ck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2hlYWRlcnMuYmVnaW4oKTsgaXQgIT0gZW5kOyAr
K2l0KQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEhUVFBIZWFkZXJGaWVsZChpdC0+a2V5LCBp
dC0+dmFsdWUpOworCisgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG1faGVhZGVycy5nZXQo
IkNvbnRlbnQtVHlwZSIpOworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBleHRyYWN0TUlNRVR5
cGVGcm9tTWVkaWFUeXBlKGNvbnRlbnRUeXBlKTsKKworICAgICAgICByZXNwb25zZS0+c2V0TWlt
ZVR5cGUobWltZVR5cGUubG93ZXIoKSk7CisgICAgICAgIHJlc3BvbnNlLT5zZXRUZXh0RW5jb2Rp
bmdOYW1lKGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShjb250ZW50VHlwZSkpOworICAgICAg
ICByZXNwb25zZS0+c2V0U3VnZ2VzdGVkRmlsZW5hbWUoZmlsZW5hbWVGcm9tSFRUUENvbnRlbnRE
aXNwb3NpdGlvbihyZXNwb25zZS0+aHR0cEhlYWRlckZpZWxkKCJDb250ZW50LURpc3Bvc2l0aW9u
IikpKTsKKworICAgICAgICBkLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1fcmVzb3Vy
Y2VIYW5kbGUsICpyZXNwb25zZSk7CisgICAgICAgIHJlc3BvbnNlLT5zZXRSZXNwb25zZUZpcmVk
KHRydWUpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxN2MxNAotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9NdWx0aXBhcnRIYW5k
bGUuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFVuaXZlcnNp
dHkgb2YgU3plZ2VkCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVU5JVkVSU0lUWSBPRiBTWkVHRUQgYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBVTklWRVJTSVRZIE9GIFNaRUdFRCBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIE11bHRp
cGFydEhhbmRsZV9oCisjZGVmaW5lIE11bHRpcGFydEhhbmRsZV9oCisKKyNpbmNsdWRlICJIVFRQ
SGVhZGVyTWFwLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGUuaCIKKworI2luY2x1ZGUgPHd0
Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBNdWx0aXBhcnRIYW5kbGUgeworCitwdWJsaWM6CisgICAgc3Rh
dGljIGJvb2wgZXh0cmFjdEJvdW5kYXJ5KGNvbnN0IFN0cmluZyAmY29udGVudFR5cGUsIFN0cmlu
ZyAmYm91bmRhcnkpOworCisgICAgTXVsdGlwYXJ0SGFuZGxlKFJlc291cmNlSGFuZGxlKiBoYW5k
bGUsIGNvbnN0IFN0cmluZyAmYm91bmRhcnkpCisgICAgICAgIDogbV9yZXNvdXJjZUhhbmRsZSho
YW5kbGUpCisgICAgICAgICwgbV9ib3VuZGFyeSgiLS0iICsgYm91bmRhcnkpCisgICAgICAgICwg
bV9ib3VuZGFyeUxlbmd0aChtX2JvdW5kYXJ5Lmxlbmd0aCgpKQorICAgICAgICAsIG1fc3RhdGUo
Q2hlY2tCb3VuZGFyeSkKKyAgICB7CisgICAgfQorCisgICAgfk11bHRpcGFydEhhbmRsZSgpIHsg
fQorCisgICAgdm9pZCBjb250ZW50UmVjZWl2ZWQoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxl
bmd0aCk7CisgICAgdm9pZCBjb250ZW50RW5kZWQoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIE11
bHRpcGFydEhhbmRsZVN0YXRlIHsKKyAgICAgICAgQ2hlY2tCb3VuZGFyeSwKKyAgICAgICAgSW5C
b3VuZGFyeSwKKyAgICAgICAgSW5IZWFkZXIsCisgICAgICAgIEluQ29udGVudCwKKyAgICAgICAg
RW5kQm91bmRhcnksCisgICAgICAgIEVuZAorICAgIH07CisKKyAgICB2b2lkIGRpZFJlY2VpdmVE
YXRhKHNpemVfdCBsZW5ndGgpOworICAgIHZvaWQgZGlkUmVjZWl2ZVJlc3BvbnNlKCk7CisKKyAg
ICBib29sIG1hdGNoRm9yQm91bmRhcnkoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHBvcywgc2l6
ZV90ICZtYXRjaGVkKTsKKyAgICBpbmxpbmUgYm9vbCBjaGVja0ZvckJvdW5kYXJ5KHNpemVfdCAm
Ym91bmRhcnlTdGFydCwgc2l6ZV90ICZsYXN0UGFydGlhbE1hdGNoKTsKKyAgICBib29sIHBhcnNl
SGVhZGVyc0lmUG9zc2libGUoKTsKKyAgICBib29sIHByb2Nlc3NDb250ZW50KCk7CisKKyAgICBS
ZXNvdXJjZUhhbmRsZSAqbV9yZXNvdXJjZUhhbmRsZTsKKyAgICBTdHJpbmcgbV9ib3VuZGFyeTsK
KyAgICBzaXplX3QgbV9ib3VuZGFyeUxlbmd0aDsKKworICAgIFZlY3RvcjxjaGFyPiBtX2J1ZmZl
cjsKKyAgICBIVFRQSGVhZGVyTWFwIG1faGVhZGVyczsKKworICAgIE11bHRpcGFydEhhbmRsZVN0
YXRlIG1fc3RhdGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisjZW5kaWYgLy8gTXVs
dGlwYXJ0SGFuZGxlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAKaW5kZXggMjMxODUzMi4u
MWY4ZGMzYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAKQEAgLTM4LDYgKzM4LDcgQEAK
ICNpbmNsdWRlICJEYXRhVVJMLmgiCiAjaW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKICNpbmNsdWRl
ICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiTXVsdGlwYXJ0SGFuZGxlLmgiCiAjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJSZXNvdXJjZUVycm9yLmgiCiAjaW5j
bHVkZSAiUmVzb3VyY2VIYW5kbGUuaCIKQEAgLTIzMSw4ICsyMzIsMTEgQEAgc3RhdGljIHNpemVf
dCB3cml0ZUNhbGxiYWNrKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYiwgdm9p
ZCogZGF0YSkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmIChkLT5jbGll
bnQoKSkKKyAgICBpZiAoZC0+bV9tdWx0aXBhcnRIYW5kbGUpCisgICAgICAgIGQtPm1fbXVsdGlw
YXJ0SGFuZGxlLT5jb250ZW50UmVjZWl2ZWQoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHB0ciks
IHRvdGFsU2l6ZSk7CisgICAgZWxzZSBpZiAoZC0+Y2xpZW50KCkpCiAgICAgICAgIGQtPmNsaWVu
dCgpLT5kaWRSZWNlaXZlRGF0YShqb2IsIHN0YXRpY19jYXN0PGNoYXIqPihwdHIpLCB0b3RhbFNp
emUsIDApOworCiAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKIH0KIApAQCAtMzM1LDYgKzMzOSwxMyBA
QCBzdGF0aWMgc2l6ZV90IGhlYWRlckNhbGxiYWNrKGNoYXIqIHB0ciwgc2l6ZV90IHNpemUsIHNp
emVfdCBubWVtYiwgdm9pZCogZGF0YSkKICAgICAgICAgZC0+bV9yZXNwb25zZS5zZXRUZXh0RW5j
b2RpbmdOYW1lKGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShkLT5tX3Jlc3BvbnNlLmh0dHBI
ZWFkZXJGaWVsZCgiQ29udGVudC1UeXBlIikpKTsKICAgICAgICAgZC0+bV9yZXNwb25zZS5zZXRT
dWdnZXN0ZWRGaWxlbmFtZShmaWxlbmFtZUZyb21IVFRQQ29udGVudERpc3Bvc2l0aW9uKGQtPm1f
cmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJDb250ZW50LURpc3Bvc2l0aW9uIikpKTsKIAorICAg
ICAgICBpZiAoZC0+bV9yZXNwb25zZS5pc011bHRpcGFydCgpKSB7CisgICAgICAgICAgICBTdHJp
bmcgYm91bmRhcnk7CisgICAgICAgICAgICBib29sIHBhcnNlZCA9IE11bHRpcGFydEhhbmRsZTo6
ZXh0cmFjdEJvdW5kYXJ5KGQtPm1fcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJDb250ZW50LVR5
cGUiKSwgYm91bmRhcnkpOworICAgICAgICAgICAgaWYgKHBhcnNlZCkKKyAgICAgICAgICAgICAg
ICBkLT5tX211bHRpcGFydEhhbmRsZSA9IGFkb3B0UHRyKG5ldyBNdWx0aXBhcnRIYW5kbGUoam9i
LCBib3VuZGFyeSkpOworICAgICAgICB9CisKICAgICAgICAgLy8gSFRUUCByZWRpcmVjdGlvbgog
ICAgICAgICBpZiAoaXNIdHRwUmVkaXJlY3QoaHR0cENvZGUpKSB7CiAgICAgICAgICAgICBTdHJp
bmcgbG9jYXRpb24gPSBkLT5tX3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgibG9jYXRpb24iKTsK
QEAgLTQ5NSw2ICs1MDYsOSBAQCB2b2lkIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6ZG93bmxvYWRU
aW1lckNhbGxiYWNrKFRpbWVyPFJlc291cmNlSGFuZGxlTWFuYWdlcj4qCiAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoZC0+bV9tdWx0aXBhcnRIYW5k
bGUpCisgICAgICAgICAgICAgICAgZC0+bV9tdWx0aXBhcnRIYW5kbGUtPmNvbnRlbnRFbmRlZCgp
OworCiAgICAgICAgICAgICBpZiAoZC0+Y2xpZW50KCkpCiAgICAgICAgICAgICAgICAgZC0+Y2xp
ZW50KCktPmRpZEZpbmlzaExvYWRpbmcoam9iLCAwKTsKICAgICAgICAgfSBlbHNlIHsK
</data>
<flag name="review"
          id="228493"
          type_id="1"
          status="-"
          setter="bfulgham"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>208710</attachid>
            <date>2013-08-14 03:01:18 -0700</date>
            <delta_ts>2013-09-04 10:24:50 -0700</delta_ts>
            <desc>patch v2</desc>
            <filename>curl_multipart_win.patch</filename>
            <type>text/plain</type>
            <size>25777</size>
            <attacher name="Peter Gal">galpeter</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBmY2QyY2NiLi5hNTFiNDA0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDEg
QEAKKzIwMTMtMDgtMTMgIFBldGVyIEdhbCAgPGdhbHBldGVyQGluZi51LXN6ZWdlZC5odT4KKwor
ICAgICAgICBbY3VybF0gSW1wcm92ZSBtdWx0aXBhcnQgcmVzcG9uc2UgaGFuZGxpbmcKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNzczNQorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBtdWx0aXBhcnQv
eC1taXhlZC1yZXBsYWNlIG1pbWUgdHlwZSBpbiByZXNwb25zZXMgYXJlIGlnbm9yZWQKKyAgICAg
ICAgd2l0aCB0aGUgY3VybCBuZXR3b3JrIGJhY2tlbmQuIFRvIGhhbmRsZSBzdWNoIHJlc3BvbnNl
cyB0aGUKKyAgICAgICAgTXVsdGlwYXJ0SGFuZGxlIGlzIGludHJvZHVjZWQgd2hpY2ggd2lsbCBz
cGxpdCB0aGUgY29udGVudCB1c2luZworICAgICAgICB0aGUgYm91bmRhcnkgc3BlY2lmaWVkIGJ5
IHRoZSBtaW1lIHR5cGUuCisKKyAgICAgICAgVGhlcmUgYXJlIGFscmVhZHkgZXhpc3RpbmcgdGVz
dHMgKGh0dHAvdGVzdHMvbXVsdGlwYXJ0KS4KKworICAgICAgICAqIFdlYkNvcmUudmN4cHJvai9X
ZWJDb3JlLnZjeHByb2o6CisgICAgICAgICogV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJv
ai5maWx0ZXJzOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6cGFyc2VIVFRQSGVhZGVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9u
ZXR3b3JrL0hUVFBQYXJzZXJzLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9SZXNvdXJj
ZUhhbmRsZUludGVybmFsLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRp
cGFydEhhbmRsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxl
OjpleHRyYWN0Qm91bmRhcnkpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpt
YXRjaEZvckJvdW5kYXJ5KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydEhhbmRsZTo6Y2hl
Y2tGb3JCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OnBhcnNl
SGVhZGVyc0lmUG9zc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpj
b250ZW50UmVjZWl2ZWQpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpwcm9j
ZXNzQ29udGVudCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OmNvbnRlbnRF
bmRlZCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OmRpZFJlY2VpdmVEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydEhhbmRsZTo6ZGlkUmVjZWl2ZVJlc3BvbnNl
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpNdWx0aXBhcnRIYW5kbGUp
OgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjp+TXVsdGlwYXJ0SGFuZGxlKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OndyaXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6
aGVhZGVyQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVNYW5hZ2Vy
Ojpkb3dubG9hZFRpbWVyQ2FsbGJhY2spOgorCiAyMDEzLTA4LTA5ICBDaHJpc3RvcGhlIER1bWV6
ICA8Y2guZHVtZXpAc2lzYS5zYW1zdW5nLmNvbT4KIAogICAgICAgICBBZGQgc3VwcG9ydCBmb3Ig
S2V5Ym9hcmRFdmVudC5sb2NhdGlvbiBhdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCmluZGV4IGZlMDE5OTEuLjY4MmQ5OTEgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2oKKysr
IGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagpAQCAtODI1
Niw2ICs4MjU2LDEyIEBACiAgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChD
b25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9kdWN0aW9ufFdpbjMyJyI+dHJ1ZTwvRXhj
bHVkZWRGcm9tQnVpbGQ+CiAgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChD
b25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9kdWN0aW9ufHg2NCciPnRydWU8L0V4Y2x1
ZGVkRnJvbUJ1aWxkPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0i
Li5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXE11bHRpcGFydEhhbmRsZS5jcHAiPgorICAgICAgPEV4
Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSkn
PT0nRGVidWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KKyAgICAgIDxFeGNsdWRl
ZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0Rl
YnVnU3VmZml4fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgICA8RXhjbHVk
ZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdS
ZWxlYXNlfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgICA8RXhjbHVkZWRG
cm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9k
dWN0aW9ufFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgPC9DbENvbXBpbGU+
CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxuZXR3b3JrXGN1cmxcUHJveHlT
ZXJ2ZXJDdXJsLmNwcCI+CiAgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChD
b25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVk
RnJvbUJ1aWxkPgogICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmln
dXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVp
bGQ+CkBAIC0xOTU5NSw2ICsxOTYwMSwxMiBAQAogICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENv
bmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZHVjdGlvbnxXaW4z
MiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgogICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENv
bmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZHVjdGlvbnx4NjQn
Ij50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KICAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KKyAgICA8
Q3VzdG9tQnVpbGRTdGVwIEluY2x1ZGU9Ii4uXHBsYXRmb3JtXG5ldHdvcmtcY3VybFxNdWx0aXBh
cnRIYW5kbGUuaCI+CisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25m
aWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJv
bUJ1aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJh
dGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWdTdWZmaXh8V2luMzInIj50cnVlPC9FeGNsdWRlZEZy
b21CdWlsZD4KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3Vy
YXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21C
dWlsZD4KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRp
b24pfCQoUGxhdGZvcm0pJz09J1Byb2R1Y3Rpb258V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21C
dWlsZD4KKyAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KICAgICA8Q3VzdG9tQnVpbGRTdGVwIEluY2x1
ZGU9Ii4uXHBsYXRmb3JtXG5ldHdvcmtcY3VybFxSZXNvdXJjZUVycm9yLmgiPgogICAgICAgPEV4
Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSkn
PT0nRGVidWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KICAgICAgIDxFeGNsdWRl
ZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0Rl
YnVnfHg2NCciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvai5maWx0ZXJzIGIvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvai5maWx0ZXJzCmluZGV4IDMyNjBi
Y2UuLjZlNzI0YTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9X
ZWJDb3JlLnZjeHByb2ouZmlsdGVycworKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHBy
b2ovV2ViQ29yZS52Y3hwcm9qLmZpbHRlcnMKQEAgLTE5NzEsNiArMTk3MSw5IEBACiAgICAgPENs
Q29tcGlsZSBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxuZXR3b3JrXGN1cmxcRm9ybURhdGFTdHJlYW1D
dXJsLmNwcCI+CiAgICAgICA8RmlsdGVyPnBsYXRmb3JtXG5ldHdvcmtcY3VybDwvRmlsdGVyPgog
ICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccGxhdGZvcm1cbmV0
d29ya1xjdXJsXE11bHRpcGFydEhhbmRsZS5jcHAiPgorICAgICAgPEZpbHRlcj5wbGF0Zm9ybVxu
ZXR3b3JrXGN1cmw8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIElu
Y2x1ZGU9Ii4uXHBsYXRmb3JtXG5ldHdvcmtcY3VybFxQcm94eVNlcnZlckN1cmwuY3BwIj4KICAg
ICAgIDxGaWx0ZXI+cGxhdGZvcm1cbmV0d29ya1xjdXJsPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBp
bGU+CkBAIC0xNTcwMCw2ICsxNTcwMyw5IEBACiAgICAgPEN1c3RvbUJ1aWxkU3RlcCBJbmNsdWRl
PSIuLlxwbGF0Zm9ybVxuZXR3b3JrXGN1cmxcRm9ybURhdGFTdHJlYW1DdXJsLmgiPgogICAgICAg
PEZpbHRlcj5wbGF0Zm9ybVxuZXR3b3JrXGN1cmw8L0ZpbHRlcj4KICAgICA8L0N1c3RvbUJ1aWxk
U3RlcD4KKyAgICA8Q3VzdG9tQnVpbGRTdGVwIEluY2x1ZGU9Ii4uXHBsYXRmb3JtXG5ldHdvcmtc
Y3VybFxNdWx0aXBhcnRIYW5kbGUuaCI+CisgICAgICA8RmlsdGVyPnBsYXRmb3JtXG5ldHdvcmtc
Y3VybDwvRmlsdGVyPgorICAgIDwvQ3VzdG9tQnVpbGRTdGVwPgogICAgIDxDdXN0b21CdWlsZFN0
ZXAgSW5jbHVkZT0iLi5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXFJlc291cmNlRXJyb3IuaCI+CiAg
ICAgICA8RmlsdGVyPnBsYXRmb3JtXG5ldHdvcmtcY3VybDwvRmlsdGVyPgogICAgIDwvQ3VzdG9t
QnVpbGRTdGVwPgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9I
VFRQUGFyc2Vycy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBQYXJz
ZXJzLmNwcAppbmRleCA3Zjg1OTNhLi41NGI4NWQ3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBQYXJzZXJzLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL0hUVFBQYXJzZXJzLmNwcApAQCAtNjA1LDcgKzYwNSw3IEBAIHNpemVf
dCBwYXJzZUhUVFBSZXF1ZXN0TGluZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuZ3RoLCBT
dHJpbmcmIGZhaWx1cmVSZWFzCiAgICAgcmV0dXJuIGVuZCAtIGRhdGE7CiB9CiAKLXNpemVfdCBw
YXJzZUhUVFBIZWFkZXIoY29uc3QgY2hhciogc3RhcnQsIHNpemVfdCBsZW5ndGgsIFN0cmluZyYg
ZmFpbHVyZVJlYXNvbiwgQXRvbWljU3RyaW5nJiBuYW1lU3RyLCBTdHJpbmcmIHZhbHVlU3RyKQor
c2l6ZV90IHBhcnNlSFRUUEhlYWRlcihjb25zdCBjaGFyKiBzdGFydCwgc2l6ZV90IGxlbmd0aCwg
U3RyaW5nJiBmYWlsdXJlUmVhc29uLCBBdG9taWNTdHJpbmcmIG5hbWVTdHIsIFN0cmluZyYgdmFs
dWVTdHIsIGJvb2wgc3RyaWN0KQogewogICAgIGNvbnN0IGNoYXIqIHAgPSBzdGFydDsKICAgICBj
b25zdCBjaGFyKiBlbmQgPSBzdGFydCArIGxlbmd0aDsKQEAgLTY0OCwxNyArNjQ4LDIwIEBAIHNp
emVfdCBwYXJzZUhUVFBIZWFkZXIoY29uc3QgY2hhciogc3RhcnQsIHNpemVfdCBsZW5ndGgsIFN0
cmluZyYgZmFpbHVyZVJlYXNvbiwKICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICAgYnJl
YWs7CiAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgIGZhaWx1cmVSZWFzb24gPSAiVW5l
eHBlY3RlZCBMRiBpbiB2YWx1ZSBhdCAiICsgdHJpbUlucHV0U2FtcGxlKHZhbHVlLmRhdGEoKSwg
dmFsdWUuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHN0
cmljdCkgeworICAgICAgICAgICAgICAgIGZhaWx1cmVSZWFzb24gPSAiVW5leHBlY3RlZCBMRiBp
biB2YWx1ZSBhdCAiICsgdHJpbUlucHV0U2FtcGxlKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgp
KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgdmFsdWUuYXBwZW5kKCpwKTsK
ICAgICAgICAgfQotICAgICAgICBpZiAoKnAgPT0gJ1xyJykgeworICAgICAgICBpZiAoKnAgPT0g
J1xyJyB8fCAoIXN0cmljdCAmJiAqcCA9PSAnXG4nKSkgewogICAgICAgICAgICAgKytwOwogICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHAgPj0gZW5kIHx8ICpw
ICE9ICdcbicpIHsKKyAgICBpZiAocCA+PSBlbmQgfHwgKHN0cmljdCAmJiAqcCAhPSAnXG4nKSkg
ewogICAgICAgICBmYWlsdXJlUmVhc29uID0gIkNSIGRvZXNuJ3QgZm9sbG93IExGIGFmdGVyIHZh
bHVlIGF0ICIgKyB0cmltSW5wdXRTYW1wbGUocCwgZW5kIC0gcCk7CiAgICAgICAgIHJldHVybiAw
OwogICAgIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvSFRU
UFBhcnNlcnMuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMu
aAppbmRleCA0ZjI3MDUyLi4yYzU3MGYzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL0hUVFBQYXJzZXJzLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9IVFRQUGFyc2Vycy5oCkBAIC04Niw3ICs4Niw3IEBAIENvbnRlbnRUeXBlT3B0aW9u
c0Rpc3Bvc2l0aW9uIHBhcnNlQ29udGVudFR5cGVPcHRpb25zSGVhZGVyKGNvbnN0IFN0cmluZyYg
aGVhZGVyCiAvLyBQYXJzaW5nIENvbXBsZXRlIEhUVFAgTWVzc2FnZXMuCiBlbnVtIEhUVFBWZXJz
aW9uIHsgVW5rbm93biwgSFRUUF8xXzAsIEhUVFBfMV8xIH07CiBzaXplX3QgcGFyc2VIVFRQUmVx
dWVzdExpbmUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCwgU3RyaW5nJiBmYWlsdXJl
UmVhc29uLCBTdHJpbmcmIG1ldGhvZCwgU3RyaW5nJiB1cmwsIEhUVFBWZXJzaW9uJik7Ci1zaXpl
X3QgcGFyc2VIVFRQSGVhZGVyKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgsIFN0cmlu
ZyYgZmFpbHVyZVJlYXNvbiwgQXRvbWljU3RyaW5nJiBuYW1lU3RyLCBTdHJpbmcmIHZhbHVlU3Ry
KTsKK3NpemVfdCBwYXJzZUhUVFBIZWFkZXIoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0
aCwgU3RyaW5nJiBmYWlsdXJlUmVhc29uLCBBdG9taWNTdHJpbmcmIG5hbWVTdHIsIFN0cmluZyYg
dmFsdWVTdHIsIGJvb2wgc3RyaWN0ID0gdHJ1ZSk7CiBzaXplX3QgcGFyc2VIVFRQUmVxdWVzdEJv
ZHkoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCwgVmVjdG9yPHVuc2lnbmVkIGNoYXI+
JiBib2R5KTsKIAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL1Jlc291cmNlSGFuZGxlSW50ZXJuYWwuaAppbmRleCAzMjg5MmY3Li5lOTBmMWFjIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlSW50
ZXJuYWwuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFu
ZGxlSW50ZXJuYWwuaApAQCAtNDQsNiArNDQsOCBAQAogI2lmIFVTRShDVVJMKQogI2luY2x1ZGUg
PGN1cmwvY3VybC5oPgogI2luY2x1ZGUgIkZvcm1EYXRhU3RyZWFtQ3VybC5oIgorI2luY2x1ZGUg
Ik11bHRpcGFydEhhbmRsZS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KICNlbmRpZgogCiAj
aWYgVVNFKFNPVVApCkBAIC0xOTAsNiArMTkyLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAg
ICAgICAgIEZvcm1EYXRhU3RyZWFtIG1fZm9ybURhdGFTdHJlYW07CiAgICAgICAgIFZlY3Rvcjxj
aGFyPiBtX3Bvc3RCeXRlczsKKworICAgICAgICBPd25QdHI8TXVsdGlwYXJ0SGFuZGxlPiBtX211
bHRpcGFydEhhbmRsZTsKICNlbmRpZgogI2lmIFVTRShTT1VQKQogICAgICAgICBHUmVmUHRyPFNv
dXBNZXNzYWdlPiBtX3NvdXBNZXNzYWdlOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi5hYjEwMTcyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHAKQEAgLTAsMCAr
MSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVW5pdmVyc2l0eSBvZiBTemVnZWQK
KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBVTklWRVJTSVRZIE9GIFNaRUdFRCBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIFVOSVZFUlNJVFkgT0YgU1pFR0VEIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJNdWx0aXBhcnRIYW5kbGUuaCIKKworI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgiCisjaW5j
bHVkZSAiUmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUlu
dGVybmFsLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgorI2luY2x1ZGUgPHd0Zi9T
dHJpbmdFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIE11bHRpcGFydEhh
bmRsZTo6ZXh0cmFjdEJvdW5kYXJ5KGNvbnN0IFN0cmluZyYgY29udGVudFR5cGUsIFN0cmluZyYg
Ym91bmRhcnkpCit7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBsZW5ndGggPSBzdHJsZW4oImJv
dW5kYXJ5PSIpOworICAgIHNpemVfdCBib3VuZGFyeVN0YXJ0ID0gY29udGVudFR5cGUuZmluZEln
bm9yaW5nQ2FzZSgiYm91bmRhcnk9Iik7CisKKyAgICAvLyBObyBib3VuZGFyeSBmb3VuZC4KKyAg
ICBpZiAoYm91bmRhcnlTdGFydCA9PSBub3RGb3VuZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgYm91bmRhcnlTdGFydCArPSBsZW5ndGg7CisgICAgc2l6ZV90IGJvdW5kYXJ5RW5kID0g
MDsKKworICAgIGlmIChjb250ZW50VHlwZVtib3VuZGFyeVN0YXJ0XSA9PSAnIicpIHsKKyAgICAg
ICAgLy8gQm91bmRhcnkgdmFsdWUgc3RhcnRzIHdpdGggYSAiIHF1b3RlLiBTZWFyY2ggZm9yIHRo
ZSBjbG9zaW5nIG9uZS4KKyAgICAgICAgKytib3VuZGFyeVN0YXJ0OworICAgICAgICBib3VuZGFy
eUVuZCA9IGNvbnRlbnRUeXBlLmZpbmQoJyInLCBib3VuZGFyeVN0YXJ0KTsKKyAgICAgICAgaWYg
KGJvdW5kYXJ5RW5kID09IG5vdEZvdW5kKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0gZWxzZSBpZiAoY29udGVudFR5cGVbYm91bmRhcnlTdGFydF0gPT0gJ1wnJykgeworICAgICAg
ICAvLyBCb3VuZGFyeSB2YWx1ZSBzdGFydHMgd2l0aCBhICcgcXVvdGUuIFNlYXJjaCBmb3IgdGhl
IGNsb3Npbmcgb25lLgorICAgICAgICArK2JvdW5kYXJ5U3RhcnQ7CisgICAgICAgIGJvdW5kYXJ5
RW5kID0gY29udGVudFR5cGUuZmluZCgnXCcnLCBib3VuZGFyeVN0YXJ0KTsKKyAgICAgICAgaWYg
KGJvdW5kYXJ5RW5kID09IG5vdEZvdW5kKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgZW5kIG9mIHRoZSBib3VuZGFyeS4g
VGhhdCBjYW4gYmUgYSBzZW1pY29sb24gb3IgYSBuZXdsaW5lLgorICAgICAgICBib3VuZGFyeUVu
ZCA9IGNvbnRlbnRUeXBlLmZpbmQoIjsiLCBib3VuZGFyeVN0YXJ0KTsKKyAgICAgICAgaWYgKGJv
dW5kYXJ5RW5kID09IG5vdEZvdW5kKQorICAgICAgICAgICAgYm91bmRhcnlFbmQgPSBjb250ZW50
VHlwZS5sZW5ndGgoKTsKKyAgICB9CisKKyAgICAvLyBUaGUgYm91bmRhcnkgZW5kIHNob3VsZCBu
b3QgYmUgYmVmb3JlIHRoZSBzdGFydAorICAgIGlmIChib3VuZGFyeUVuZCA8PSBib3VuZGFyeVN0
YXJ0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib3VuZGFyeSA9IGNvbnRlbnRUeXBl
LnN1YnN0cmluZyhib3VuZGFyeVN0YXJ0LCBib3VuZGFyeUVuZCAtIGJvdW5kYXJ5U3RhcnQpOwor
ICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgTXVsdGlwYXJ0SGFuZGxlOjptYXRjaEZvckJv
dW5kYXJ5KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBwb3MsIHNpemVfdCYgbWF0Y2hlZExlbmd0
aCkKK3sKKyAgICBtYXRjaGVkTGVuZ3RoID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9ib3VuZGFyeUxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChkYXRhW3BvcyArIGldICE9
IG1fYm91bmRhcnlbaV0pIHsKKyAgICAgICAgICAgIG1hdGNoZWRMZW5ndGggPSBpOworICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgbWF0Y2hlZExlbmd0
aCA9IG1fYm91bmRhcnlMZW5ndGg7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXVsdGlw
YXJ0SGFuZGxlOjpjaGVja0ZvckJvdW5kYXJ5KHNpemVfdCYgYm91bmRhcnlTdGFydFBvcywgc2l6
ZV90JiBsYXN0UGFydGlhbE1hdGNoUG9zKQoreworICAgIHNpemVfdCBjb250ZW50TGVuZ3RoID0g
bV9idWZmZXIuc2l6ZSgpOworICAgIGNvbnN0IGNoYXIqIGNvbnRlbnQgPSBtX2J1ZmZlci5kYXRh
KCk7CisgICAgc2l6ZV90IG1hdGNoZWQ7CisKKyAgICBib3VuZGFyeVN0YXJ0UG9zID0gbm90Rm91
bmQ7CisgICAgbGFzdFBhcnRpYWxNYXRjaFBvcyA9IGNvbnRlbnRMZW5ndGg7CisKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IGNvbnRlbnRMZW5ndGg7ICsraSkgeworICAgICAgICBpZiAobWF0
Y2hGb3JCb3VuZGFyeShjb250ZW50LCBpLCBtYXRjaGVkKSkgeworICAgICAgICAgICAgYm91bmRh
cnlTdGFydFBvcyA9IGk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmIChtYXRjaGVkKQorICAgICAgICAgICAgbGFzdFBhcnRpYWxNYXRjaFBvcyA9IGk7
CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE11bHRpcGFydEhhbmRsZTo6
cGFyc2VIZWFkZXJzSWZQb3NzaWJsZSgpCit7CisgICAgc2l6ZV90IGNvbnRlbnRMZW5ndGggPSBt
X2J1ZmZlci5zaXplKCk7CisgICAgY29uc3QgY2hhciogY29udGVudCA9IG1fYnVmZmVyLmRhdGEo
KTsKKworICAgIGlmICghY29udGVudExlbmd0aCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgaGVhZGVyIGNsb3Npbmcgc3RyaW5ncy4KKyAgICBp
ZiAoIXN0cm5zdHIoY29udGVudCwgIlxyXG5cclxuIiwgY29udGVudExlbmd0aCkpIHsKKyAgICAg
ICAgLy8gU29tZSBzZXJ2ZXJzIGNsb3NlcyB0aGUgaGVhZGVycyB3aXRoIG9ubHkgXG4tcy4KKyAg
ICAgICAgaWYgKCFzdHJuc3RyKGNvbnRlbnQsICJcblxuIiwgY29udGVudExlbmd0aCkpIHsKKyAg
ICAgICAgICAgIC8vIERvbid0IGhhdmUgdGhlIGhlYWRlciBjbG9zaW5nIHN0cmluZy4gV2FpdCBm
b3IgbW9yZSBkYXRhLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gUGFyc2UgdGhlIEhUVFAgaGVhZGVycy4KKyAgICBTdHJpbmcgdmFsdWU7Cisg
ICAgQXRvbWljU3RyaW5nIG5hbWU7CisgICAgY2hhciogcCA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGNv
bnRlbnQpOworICAgIGNoYXIqIGVuZCA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGNvbnRlbnQpICsgY29u
dGVudExlbmd0aDsKKyAgICBzaXplX3QgdG90YWxDb25zdW1lZExlbmd0aCA9IDA7CisgICAgZm9y
ICg7IHAgPCBlbmQ7ICsrcCkgeworICAgICAgICBTdHJpbmcgZmFpbHVyZVJlYXNvbjsKKyAgICAg
ICAgc2l6ZV90IGNvbnN1bWVkTGVuZ3RoID0gcGFyc2VIVFRQSGVhZGVyKHAsIGVuZCAtIHAsIGZh
aWx1cmVSZWFzb24sIG5hbWUsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgIGlmICghY29uc3VtZWRM
ZW5ndGgpCisgICAgICAgICAgICBicmVhazsgLy8gTm8gbW9yZSBoZWFkZXIgdG8gcGFyc2UuCisK
KyAgICAgICAgcCArPSBjb25zdW1lZExlbmd0aDsKKyAgICAgICAgdG90YWxDb25zdW1lZExlbmd0
aCArPSBjb25zdW1lZExlbmd0aDsKKworICAgICAgICAvLyBUaGUgbmFtZSBzaG91bGQgbm90IGJl
IGVtcHR5LCBidXQgdGhlIHZhbHVlIGNvdWxkIGJlIGVtcHR5LgorICAgICAgICBpZiAobmFtZS5p
c0VtcHR5KCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBtX2hlYWRlcnMuYWRkKG5h
bWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBtX2J1ZmZlci5yZW1vdmUoMCwgdG90YWxDb25zdW1l
ZExlbmd0aCArIDEpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE11bHRpcGFydEhhbmRs
ZTo6Y29udGVudFJlY2VpdmVkKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpCit7Cisg
ICAgaWYgKG1fc3RhdGUgPT0gRW5kKQorICAgICAgICByZXR1cm47IC8vIFRoZSBoYW5kbGVyIGlz
IGNsb3NlZCBkb3duIHNvIGlnbm9yZSBldmVyeXRoaW5nLgorCisgICAgbV9idWZmZXIuYXBwZW5k
KGRhdGEsIGxlbmd0aCk7CisKKyAgICB3aGlsZSAocHJvY2Vzc0NvbnRlbnQoKSkgeyB9Cit9CisK
K2Jvb2wgTXVsdGlwYXJ0SGFuZGxlOjpwcm9jZXNzQ29udGVudCgpCit7CisvKgorICAgIFRoZSBh
bGxvd2VkIHRyYW5zaXRpb25zIGJldHdlZW4gdGhlIHN0YXRlczoKKyAgICAgICAgIENoZWNrIEJv
dW5kYXJ5CisgICAgICAgICAgICAgICB8CisgICAgICAvLS0gSW4gQm91bmRhcnkgPC0tLS1cCisg
ICAgIHwgICAgICAgICB8ICAgICAgICAgICAgfAorICAgICB8ICAgICBJbiBIZWFkZXIgICAgICAg
IHwKKyAgICAgfCAgICAgICAgIHwgICAgICAgICAgICB8CisgICAgIHwgICAgIEluIENvbnRlbnQg
ICAgICAgfAorICAgICB8ICAgICAgICAgfCAgICAgICAgICAgIHwKKyAgICAgfCAgICBFbmQgQm91
bmRhcnkgLS0tLS8KKyAgICAgfCAgICAgICAgIHwKKyAgICAgIFwtLS0tLT4gRW5kCisKKyovCisg
ICAgc3dpdGNoIChtX3N0YXRlKSB7CisgICAgY2FzZSBDaGVja0JvdW5kYXJ5OiB7CisgICAgICAg
IGlmIChtX2J1ZmZlci5zaXplKCkgPCBtX2JvdW5kYXJ5TGVuZ3RoKSB7CisgICAgICAgICAgICAv
LyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhLCBzbyBqdXN0IHNraXAuCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGJvdW5k
YXJ5IHN0cmluZy4KKyAgICAgICAgc2l6ZV90IGJvdW5kYXJ5U3RhcnQ7CisgICAgICAgIHNpemVf
dCBsYXN0UGFydGlhbE1hdGNoOworCisgICAgICAgIGlmICghY2hlY2tGb3JCb3VuZGFyeShib3Vu
ZGFyeVN0YXJ0LCBsYXN0UGFydGlhbE1hdGNoKSAmJiBib3VuZGFyeVN0YXJ0ID09IG5vdEZvdW5k
KSB7CisgICAgICAgICAgICAvLyBEaWQgbm90IGZpbmQgdGhlIGJvdW5kYXJ5IHN0YXJ0IGluIHRo
aXMgY2h1bmsuCisgICAgICAgICAgICAvLyBTa2lwIGFoZWFkIHRvIHRoZSBsYXN0IHZhbGlkIGxv
b2tpbmcgYm91bmRhcnkgY2hhcmFjdGVyIGFuZCBzdGFydCBhZ2Fpbi4KKyAgICAgICAgICAgIG1f
YnVmZmVyLnJlbW92ZSgwLCBsYXN0UGFydGlhbE1hdGNoKTsKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvdW5kIHRoZSBib3VuZGFyeSBzdGFydC4K
KyAgICAgICAgLy8gQ29uc3VtZSBldmVyeXRoaW5nIGJlZm9yZSB0aGF0IGFuZCBhbHNvIHRoZSBi
b3VuZGFyeQorICAgICAgICBtX2J1ZmZlci5yZW1vdmUoMCwgYm91bmRhcnlTdGFydCArIG1fYm91
bmRhcnlMZW5ndGgpOworICAgICAgICBtX3N0YXRlID0gSW5Cb3VuZGFyeTsKKyAgICB9CisgICAg
Ly8gRmFsbHRocm91Z2guCisgICAgY2FzZSBJbkJvdW5kYXJ5OiB7CisgICAgICAgIC8vIE5vdyB0
aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgc2hvdWxkIGJlOiBcclxuCisgICAgICAgIGlmIChtX2J1
ZmZlci5zaXplKCkgPCAyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNv
bnN0IGNoYXIqIGNvbnRlbnQgPSBtX2J1ZmZlci5kYXRhKCk7CisgICAgICAgIC8vIEJ5IGRlZmF1
bHQgd2UnbGwgcmVtb3ZlIDIgY2hhcmFjdGVycyBhdCB0aGUgZW5kLgorICAgICAgICAvLyBUaGUg
XHIgYW5kIFxuIGFzIHN0YXRlZCBpbiB0aGUgbXVsdGlwYXJ0IFJGQy4KKyAgICAgICAgc2l6ZV90
IHJlbW92ZUNvdW50ID0gMjsKKworICAgICAgICBpZiAoY29udGVudFswXSAhPSAnXHInIHx8IGNv
bnRlbnRbMV0gIT0gJ1xuJykgeworICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGEgXHIg
YW5kIGEgXG4gYnV0IGl0IHNlZW1zIHRoYXQncyBub3QgdGhlIGNhc2UuCisgICAgICAgICAgICAv
LyBTbyB3ZSdsbCBjaGVjayBmb3IgYSBzaW1wbGUgXG4uIE5vdCByZWFsbHkgUkZDIGNvbXBhdGli
bGUgYnV0IHNlcnZlcnMgZG8gdHJpY2t5IHRoaW5ncy4KKyAgICAgICAgICAgIGlmIChjb250ZW50
WzBdICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIG5vIFxuIHNvIGp1c3QgZ28g
dG8gdGhlIGVuZC4KKyAgICAgICAgICAgICAgICBtX3N0YXRlID0gRW5kOworICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm91bmQg
YSBzaW1wbGUgXG4gc28gcmVtb3ZlIGp1c3QgdGhhdC4KKyAgICAgICAgICAgIHJlbW92ZUNvdW50
ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMuCisg
ICAgICAgIG1fYnVmZmVyLnJlbW92ZSgwLCByZW1vdmVDb3VudCk7CisgICAgICAgIG1faGVhZGVy
cy5jbGVhcigpOworICAgICAgICBtX3N0YXRlID0gSW5IZWFkZXI7CisgICAgfQorICAgIC8vIEZh
bGx0aHJvdWdoLgorICAgIGNhc2UgSW5IZWFkZXI6IHsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUg
aGVhZGVycy4KKyAgICAgICAgaWYgKCFwYXJzZUhlYWRlcnNJZlBvc3NpYmxlKCkpIHsKKyAgICAg
ICAgICAgIC8vIFBhcnNpbmcgb2YgaGVhZGVycyBmYWlsZWQsIHRyeSBhZ2FpbiBsYXRlci4KKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZFJlY2VpdmVS
ZXNwb25zZSgpOworICAgICAgICBtX3N0YXRlID0gSW5Db250ZW50OworICAgIH0KKyAgICAvLyBG
YWxsdGhyb3VnaC4KKyAgICBjYXNlIEluQ29udGVudDogeworICAgICAgICBpZiAoIW1fYnVmZmVy
LnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBzaXplX3QgYm91
bmRhcnlTdGFydCA9IG5vdEZvdW5kOworICAgICAgICBzaXplX3QgbGFzdFBhcnRpYWxNYXRjaDsK
KworICAgICAgICBpZiAoIWNoZWNrRm9yQm91bmRhcnkoYm91bmRhcnlTdGFydCwgbGFzdFBhcnRp
YWxNYXRjaCkgJiYgYm91bmRhcnlTdGFydCA9PSBub3RGb3VuZCkgeworICAgICAgICAgICAgLy8g
RGlkIG5vdCBmaW5kIHRoZSBib3VuZGFyeSBzdGFydCwgYWxsIGRhdGEgdXAgdG8gdGhlIGxhc3RQ
YXJ0aWFsTWF0Y2ggaXMgb2suCisgICAgICAgICAgICBkaWRSZWNlaXZlRGF0YShsYXN0UGFydGlh
bE1hdGNoKTsKKyAgICAgICAgICAgIG1fYnVmZmVyLnJlbW92ZSgwLCBsYXN0UGFydGlhbE1hdGNo
KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRo
ZXJlIHdhcyBhIGJvdW5kYXJ5IHN0YXJ0IChvciBlbmQgd2UnbGwgY2hlY2sgdGhhdCBsYXRlciks
IHB1c2ggb3V0IHBhcnQgb2YgdGhlIGRhdGEuCisgICAgICAgIGRpZFJlY2VpdmVEYXRhKGJvdW5k
YXJ5U3RhcnQpOworICAgICAgICBtX2J1ZmZlci5yZW1vdmUoMCwgYm91bmRhcnlTdGFydCArIG1f
Ym91bmRhcnlMZW5ndGgpOworICAgICAgICBtX3N0YXRlID0gRW5kQm91bmRhcnk7CisgICAgfQor
ICAgIC8vIEZhbGx0aHJvdWdoLgorICAgIGNhc2UgRW5kQm91bmRhcnk6IHsKKyAgICAgICAgaWYg
KG1fYnVmZmVyLnNpemUoKSA8IDIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vdCBl
bm91Z2ggZGF0YSB0byBjaGVjay4gUmV0dXJuIGxhdGVyIHdoZW4gdGhlcmUgaXMgbW9yZSBkYXRh
LgorCisgICAgICAgIC8vIFdlJ2xsIGRlY2lkZSBpZiB0aGlzIGlzIGEgY2xvc2luZyBib3VuZGFy
eSBvciBhbiBvcGVuaW5nIG9uZS4KKyAgICAgICAgY29uc3QgY2hhciogY29udGVudCA9IG1fYnVm
ZmVyLmRhdGEoKTsKKworICAgICAgICBpZiAoY29udGVudFswXSA9PSAnLScgJiYgY29udGVudFsx
XSA9PSAnLScpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjbG9zaW5nIGJvdW5kYXJ5LiBD
bG9zZSBkb3duIHRoZSBoYW5kbGVyLgorICAgICAgICAgICAgbV9zdGF0ZSA9IEVuZDsKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgd2FzIGEg
c2ltcGxlIGNvbnRlbnQgc2VwYXJhdG9yIG5vdCBhIGNsb3Npbmcgb25lLgorICAgICAgICAvLyBH
byB0byBiZWZvcmUgdGhlIGNvbnRlbnQgcHJvY2Vzc2luZy4KKyAgICAgICAgbV9zdGF0ZSA9IElu
Qm91bmRhcnk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEVuZDoKKyAgICAgICAg
Ly8gV2UgYXJlIGRvbmUuIE5vdGhpbmcgdG8gZG8gYW55bW9yZS4KKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7IC8vIFRoZXJlIGFyZSBz
dGlsbCB0aGluZ3MgdG8gcHJvY2Vzcywgc28gZ28gZm9yIGl0LgorfQorCit2b2lkIE11bHRpcGFy
dEhhbmRsZTo6Y29udGVudEVuZGVkKCkKK3sKKyAgICAvLyBQcm9jZXNzIHRoZSBsZWZ0b3ZlciBk
YXRhLgorICAgIHdoaWxlIChwcm9jZXNzQ29udGVudCgpKSB7IH0KKworICAgIGlmIChtX3N0YXRl
ICE9IEVuZCkgeworICAgICAgICAvLyBJdCBzZWVtcyB3ZSBhcmUgc3RpbGwgbm90IGF0IHRoZSBl
bmQgb2YgdGhlIHByb2Nlc3NpbmcuCisgICAgICAgIC8vIFB1c2ggb3V0IHRoZSByZW1haW5pbmcg
ZGF0YS4KKyAgICAgICAgZGlkUmVjZWl2ZURhdGEobV9idWZmZXIuc2l6ZSgpKTsKKyAgICAgICAg
bV9zdGF0ZSA9IEVuZDsKKyAgICB9CisKKyAgICBtX2J1ZmZlci5jbGVhcigpOworfQorCit2b2lk
IE11bHRpcGFydEhhbmRsZTo6ZGlkUmVjZWl2ZURhdGEoc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBS
ZXNvdXJjZUhhbmRsZUludGVybmFsKiBkID0gbV9yZXNvdXJjZUhhbmRsZS0+Z2V0SW50ZXJuYWwo
KTsKKworICAgIGlmIChkLT5tX2NhbmNlbGxlZCkgeworICAgICAgICAvLyBSZXF1ZXN0IGhhcyBi
ZWVuIGNhbmNlbGVkLCBzbyB3ZSdsbCBnbyB0byB0aGUgZW5kIHN0YXRlLgorICAgICAgICBtX3N0
YXRlID0gRW5kOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGQtPmNsaWVudCgp
KSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEgPSBtX2J1ZmZlci5kYXRhKCk7CisgICAgICAg
IGQtPmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX3Jlc291cmNlSGFuZGxlLCBkYXRhLCBsZW5n
dGgsIGxlbmd0aCk7CisgICAgfQorfQorCit2b2lkIE11bHRpcGFydEhhbmRsZTo6ZGlkUmVjZWl2
ZVJlc3BvbnNlKCkKK3sKKyAgICBSZXNvdXJjZUhhbmRsZUludGVybmFsKiBkID0gbV9yZXNvdXJj
ZUhhbmRsZS0+Z2V0SW50ZXJuYWwoKTsKKyAgICBpZiAoZC0+Y2xpZW50KCkpIHsKKyAgICAgICAg
T3duUHRyPFJlc291cmNlUmVzcG9uc2U+IHJlc3BvbnNlID0gUmVzb3VyY2VSZXNwb25zZUJhc2U6
OmFkb3B0KGQtPm1fcmVzcG9uc2UuY29weURhdGEoKSk7CisKKyAgICAgICAgSFRUUEhlYWRlck1h
cDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9oZWFkZXJzLmVuZCgpOworICAgICAgICBmb3IgKEhU
VFBIZWFkZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9oZWFkZXJzLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRIVFRQSGVhZGVyRmllbGQoaXQt
PmtleSwgaXQtPnZhbHVlKTsKKworICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBtX2hlYWRl
cnMuZ2V0KCJDb250ZW50LVR5cGUiKTsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZXh0cmFj
dE1JTUVUeXBlRnJvbU1lZGlhVHlwZShjb250ZW50VHlwZSk7CisKKyAgICAgICAgcmVzcG9uc2Ut
PnNldE1pbWVUeXBlKG1pbWVUeXBlLmxvd2VyKCkpOworICAgICAgICByZXNwb25zZS0+c2V0VGV4
dEVuY29kaW5nTmFtZShleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUoY29udGVudFR5cGUpKTsK
KyAgICAgICAgcmVzcG9uc2UtPnNldFN1Z2dlc3RlZEZpbGVuYW1lKGZpbGVuYW1lRnJvbUhUVFBD
b250ZW50RGlzcG9zaXRpb24ocmVzcG9uc2UtPmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNw
b3NpdGlvbiIpKSk7CisKKyAgICAgICAgZC0+Y2xpZW50KCktPmRpZFJlY2VpdmVSZXNwb25zZSht
X3Jlc291cmNlSGFuZGxlLCAqcmVzcG9uc2UpOworICAgICAgICByZXNwb25zZS0+c2V0UmVzcG9u
c2VGaXJlZCh0cnVlKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhh
bmRsZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhh
bmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzEzYjQKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlw
YXJ0SGFuZGxlLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBV
bml2ZXJzaXR5IG9mIFN6ZWdlZAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFVOSVZFUlNJVFkgT0YgU1pFR0VEIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVU5JVkVSU0lUWSBPRiBTWkVHRUQgT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRl
ZiBNdWx0aXBhcnRIYW5kbGVfaAorI2RlZmluZSBNdWx0aXBhcnRIYW5kbGVfaAorCisjaW5jbHVk
ZSAiSFRUUEhlYWRlck1hcC5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisKKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTXVsdGlwYXJ0SGFuZGxlIHsKKworcHVibGljOgor
ICAgIHN0YXRpYyBib29sIGV4dHJhY3RCb3VuZGFyeShjb25zdCBTdHJpbmcmIGNvbnRlbnRUeXBl
LCBTdHJpbmcmIGJvdW5kYXJ5KTsKKworICAgIE11bHRpcGFydEhhbmRsZShSZXNvdXJjZUhhbmRs
ZSogaGFuZGxlLCBjb25zdCBTdHJpbmcmIGJvdW5kYXJ5KQorICAgICAgICA6IG1fcmVzb3VyY2VI
YW5kbGUoaGFuZGxlKQorICAgICAgICAsIG1fYm91bmRhcnkoIi0tIiArIGJvdW5kYXJ5KQorICAg
ICAgICAsIG1fYm91bmRhcnlMZW5ndGgobV9ib3VuZGFyeS5sZW5ndGgoKSkKKyAgICAgICAgLCBt
X3N0YXRlKENoZWNrQm91bmRhcnkpCisgICAgeworICAgIH0KKworICAgIH5NdWx0aXBhcnRIYW5k
bGUoKSB7IH0KKworICAgIHZvaWQgY29udGVudFJlY2VpdmVkKGNvbnN0IGNoYXIqIGRhdGEsIHNp
emVfdCBsZW5ndGgpOworICAgIHZvaWQgY29udGVudEVuZGVkKCk7CisKK3ByaXZhdGU6CisgICAg
ZW51bSBNdWx0aXBhcnRIYW5kbGVTdGF0ZSB7CisgICAgICAgIENoZWNrQm91bmRhcnksCisgICAg
ICAgIEluQm91bmRhcnksCisgICAgICAgIEluSGVhZGVyLAorICAgICAgICBJbkNvbnRlbnQsCisg
ICAgICAgIEVuZEJvdW5kYXJ5LAorICAgICAgICBFbmQKKyAgICB9OworCisgICAgdm9pZCBkaWRS
ZWNlaXZlRGF0YShzaXplX3QgbGVuZ3RoKTsKKyAgICB2b2lkIGRpZFJlY2VpdmVSZXNwb25zZSgp
OworCisgICAgYm9vbCBtYXRjaEZvckJvdW5kYXJ5KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBw
b3MsIHNpemVfdCYgbWF0Y2hlZExlbmd0aCk7CisgICAgaW5saW5lIGJvb2wgY2hlY2tGb3JCb3Vu
ZGFyeShzaXplX3QmIGJvdW5kYXJ5U3RhcnRQb3MsIHNpemVfdCYgbGFzdFBhcnRpYWxNYXRjaFBv
cyk7CisgICAgYm9vbCBwYXJzZUhlYWRlcnNJZlBvc3NpYmxlKCk7CisgICAgYm9vbCBwcm9jZXNz
Q29udGVudCgpOworCisgICAgUmVzb3VyY2VIYW5kbGUqIG1fcmVzb3VyY2VIYW5kbGU7CisgICAg
U3RyaW5nIG1fYm91bmRhcnk7CisgICAgc2l6ZV90IG1fYm91bmRhcnlMZW5ndGg7CisKKyAgICBW
ZWN0b3I8Y2hhcj4gbV9idWZmZXI7CisgICAgSFRUUEhlYWRlck1hcCBtX2hlYWRlcnM7CisKKyAg
ICBNdWx0aXBhcnRIYW5kbGVTdGF0ZSBtX3N0YXRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorI2VuZGlmIC8vIE11bHRpcGFydEhhbmRsZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIu
Y3BwCmluZGV4IDI1YzIxNzEuLjkzNTgwMTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3Bw
CkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSAiRGF0YVVSTC5oIgogI2luY2x1ZGUgIkhUVFBQ
YXJzZXJzLmgiCiAjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgorI2luY2x1ZGUgIk11bHRp
cGFydEhhbmRsZS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUmVz
b3VyY2VFcnJvci5oIgogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCkBAIC0yMTksOCArMjIw
LDExIEBAIHN0YXRpYyBzaXplX3Qgd3JpdGVDYWxsYmFjayh2b2lkKiBwdHIsIHNpemVfdCBzaXpl
LCBzaXplX3Qgbm1lbWIsIHZvaWQqIGRhdGEpCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9
CiAKLSAgICBpZiAoZC0+Y2xpZW50KCkpCisgICAgaWYgKGQtPm1fbXVsdGlwYXJ0SGFuZGxlKQor
ICAgICAgICBkLT5tX211bHRpcGFydEhhbmRsZS0+Y29udGVudFJlY2VpdmVkKHN0YXRpY19jYXN0
PGNvbnN0IGNoYXIqPihwdHIpLCB0b3RhbFNpemUpOworICAgIGVsc2UgaWYgKGQtPmNsaWVudCgp
KQogICAgICAgICBkLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEoam9iLCBzdGF0aWNfY2FzdDxj
aGFyKj4ocHRyKSwgdG90YWxTaXplLCAwKTsKKwogICAgIHJldHVybiB0b3RhbFNpemU7CiB9CiAK
QEAgLTM5NSw2ICszOTksMTMgQEAgc3RhdGljIHNpemVfdCBoZWFkZXJDYWxsYmFjayhjaGFyKiBw
dHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIHZvaWQqIGRhdGEpCiAgICAgICAgIGQtPm1f
cmVzcG9uc2Uuc2V0VGV4dEVuY29kaW5nTmFtZShleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUo
ZC0+bV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGQoIkNvbnRlbnQtVHlwZSIpKSk7CiAgICAgICAg
IGQtPm1fcmVzcG9uc2Uuc2V0U3VnZ2VzdGVkRmlsZW5hbWUoZmlsZW5hbWVGcm9tSFRUUENvbnRl
bnREaXNwb3NpdGlvbihkLT5tX3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNw
b3NpdGlvbiIpKSk7CiAKKyAgICAgICAgaWYgKGQtPm1fcmVzcG9uc2UuaXNNdWx0aXBhcnQoKSkg
eworICAgICAgICAgICAgU3RyaW5nIGJvdW5kYXJ5OworICAgICAgICAgICAgYm9vbCBwYXJzZWQg
PSBNdWx0aXBhcnRIYW5kbGU6OmV4dHJhY3RCb3VuZGFyeShkLT5tX3Jlc3BvbnNlLmh0dHBIZWFk
ZXJGaWVsZCgiQ29udGVudC1UeXBlIiksIGJvdW5kYXJ5KTsKKyAgICAgICAgICAgIGlmIChwYXJz
ZWQpCisgICAgICAgICAgICAgICAgZC0+bV9tdWx0aXBhcnRIYW5kbGUgPSBhZG9wdFB0cihuZXcg
TXVsdGlwYXJ0SGFuZGxlKGpvYiwgYm91bmRhcnkpKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8v
IEhUVFAgcmVkaXJlY3Rpb24KICAgICAgICAgaWYgKGlzSHR0cFJlZGlyZWN0KGh0dHBDb2RlKSkg
ewogICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZC0+bV9yZXNwb25zZS5odHRwSGVhZGVy
RmllbGQoImxvY2F0aW9uIik7CkBAIC01NjgsNiArNTc5LDkgQEAgdm9pZCBSZXNvdXJjZUhhbmRs
ZU1hbmFnZXI6OmRvd25sb2FkVGltZXJDYWxsYmFjayhUaW1lcjxSZXNvdXJjZUhhbmRsZU1hbmFn
ZXI+KgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYg
KGQtPm1fbXVsdGlwYXJ0SGFuZGxlKQorICAgICAgICAgICAgICAgIGQtPm1fbXVsdGlwYXJ0SGFu
ZGxlLT5jb250ZW50RW5kZWQoKTsKKwogICAgICAgICAgICAgaWYgKGQtPmNsaWVudCgpKQogICAg
ICAgICAgICAgICAgIGQtPmNsaWVudCgpLT5kaWRGaW5pc2hMb2FkaW5nKGpvYiwgMCk7CiAgICAg
ICAgIH0gZWxzZSB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>210473</attachid>
            <date>2013-09-04 10:24:50 -0700</date>
            <delta_ts>2013-09-12 11:25:20 -0700</delta_ts>
            <desc>patch v3</desc>
            <filename>curl_multipart_3.patch</filename>
            <type>text/plain</type>
            <size>26143</size>
            <attacher name="Peter Gal">galpeter</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA3NWY4NjM2Li42MzhjNDhhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDEg
QEAKKzIwMTMtMDktMDQgIFBldGVyIEdhbCAgPGdhbHBldGVyQGluZi51LXN6ZWdlZC5odT4KKwor
ICAgICAgICBbY3VybF0gSW1wcm92ZSBtdWx0aXBhcnQgcmVzcG9uc2UgaGFuZGxpbmcKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNzczNQorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBtdWx0aXBhcnQv
eC1taXhlZC1yZXBsYWNlIG1pbWUgdHlwZSBpbiByZXNwb25zZXMgYXJlIGlnbm9yZWQKKyAgICAg
ICAgd2l0aCB0aGUgY3VybCBuZXR3b3JrIGJhY2tlbmQuIFRvIGhhbmRsZSBzdWNoIHJlc3BvbnNl
cyB0aGUKKyAgICAgICAgTXVsdGlwYXJ0SGFuZGxlIGlzIGludHJvZHVjZWQgd2hpY2ggd2lsbCBz
cGxpdCB0aGUgY29udGVudCB1c2luZworICAgICAgICB0aGUgYm91bmRhcnkgc3BlY2lmaWVkIGJ5
IHRoZSBtaW1lIHR5cGUuCisKKyAgICAgICAgVGhlcmUgYXJlIGFscmVhZHkgZXhpc3RpbmcgdGVz
dHMgKGh0dHAvdGVzdHMvbXVsdGlwYXJ0KS4KKworICAgICAgICAqIFdlYkNvcmUudmN4cHJvai9X
ZWJDb3JlLnZjeHByb2o6CisgICAgICAgICogV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJv
ai5maWx0ZXJzOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6cGFyc2VIVFRQSGVhZGVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9u
ZXR3b3JrL0hUVFBQYXJzZXJzLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9SZXNvdXJj
ZUhhbmRsZUludGVybmFsLmg6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRp
cGFydEhhbmRsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxl
OjpleHRyYWN0Qm91bmRhcnkpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpt
YXRjaEZvckJvdW5kYXJ5KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydEhhbmRsZTo6Y2hl
Y2tGb3JCb3VuZGFyeSk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OnBhcnNl
SGVhZGVyc0lmUG9zc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpj
b250ZW50UmVjZWl2ZWQpOgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpwcm9j
ZXNzQ29udGVudCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OmNvbnRlbnRF
bmRlZCk6CisgICAgICAgIChXZWJDb3JlOjpNdWx0aXBhcnRIYW5kbGU6OmRpZFJlY2VpdmVEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6Ok11bHRpcGFydEhhbmRsZTo6ZGlkUmVjZWl2ZVJlc3BvbnNl
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjpNdWx0aXBhcnRIYW5kbGUp
OgorICAgICAgICAoV2ViQ29yZTo6TXVsdGlwYXJ0SGFuZGxlOjp+TXVsdGlwYXJ0SGFuZGxlKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OndyaXRlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6
aGVhZGVyQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVNYW5hZ2Vy
Ojpkb3dubG9hZFRpbWVyQ2FsbGJhY2spOgorCiAyMDEzLTA5LTAyICBBbmRyZWFzIEtsaW5nICA8
YWtsaW5nQGFwcGxlLmNvbT4KIAogICAgICAgICBTaW1wbGlmeSBEb2N1bWVudFR5cGUgaGFuZGxp
bmcuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52
Y3hwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagpp
bmRleCAwMDJiMzc1Li5hY2I2NWIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3Jl
LnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4
cHJvai9XZWJDb3JlLnZjeHByb2oKQEAgLTgyOTksNiArODI5OSwxMiBAQAogICAgICAgPEV4Y2x1
ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0n
UHJvZHVjdGlvbnxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgogICAgICAgPEV4Y2x1
ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0n
UHJvZHVjdGlvbnx4NjQnIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KICAgICA8L0NsQ29tcGls
ZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHBsYXRmb3JtXG5ldHdvcmtcY3VybFxNdWx0
aXBhcnRIYW5kbGUuY3BwIj4KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249Iick
KENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvRXhjbHVk
ZWRGcm9tQnVpbGQ+CisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25m
aWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z1N1ZmZpeHxXaW4zMiciPnRydWU8L0V4Y2x1
ZGVkRnJvbUJ1aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29u
ZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVk
RnJvbUJ1aWxkPgorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmln
dXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZHVjdGlvbnxXaW4zMiciPnRydWU8L0V4Y2x1ZGVk
RnJvbUJ1aWxkPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5c
cGxhdGZvcm1cbmV0d29ya1xjdXJsXFByb3h5U2VydmVyQ3VybC5jcHAiPgogICAgICAgPEV4Y2x1
ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0n
RGVidWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KICAgICAgIDxFeGNsdWRlZEZy
b21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVn
fHg2NCciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgpAQCAtMTk2NjcsNiArMTk2NzMsMTIgQEAK
ICAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQo
UGxhdGZvcm0pJz09J1Byb2R1Y3Rpb258V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4K
ICAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQo
UGxhdGZvcm0pJz09J1Byb2R1Y3Rpb258eDY0JyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CiAg
ICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgICAgPEN1c3RvbUJ1aWxkU3RlcCBJbmNsdWRlPSIuLlxw
bGF0Zm9ybVxuZXR3b3JrXGN1cmxcTXVsdGlwYXJ0SGFuZGxlLmgiPgorICAgICAgPEV4Y2x1ZGVk
RnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVi
dWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KKyAgICAgIDxFeGNsdWRlZEZyb21C
dWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnU3Vm
Zml4fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgICA8RXhjbHVkZWRGcm9t
QnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNl
fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgICA8RXhjbHVkZWRGcm9tQnVp
bGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9kdWN0aW9u
fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+CisgICAgPC9DdXN0b21CdWlsZFN0ZXA+
CiAgICAgPEN1c3RvbUJ1aWxkU3RlcCBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxuZXR3b3JrXGN1cmxc
UmVzb3VyY2VFcnJvci5oIj4KICAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249Iick
KENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvRXhjbHVk
ZWRGcm9tQnVpbGQ+CiAgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25m
aWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9FeGNsdWRlZEZyb21C
dWlsZD4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3Jl
LnZjeHByb2ouZmlsdGVycyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3Jl
LnZjeHByb2ouZmlsdGVycwppbmRleCBlMTNlMjE3Li5kYzQ0YmRkIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qLmZpbHRlcnMKKysrIGIv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvai5maWx0ZXJzCkBA
IC0xOTcxLDYgKzE5NzEsOSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccGxhdGZvcm1c
bmV0d29ya1xjdXJsXEZvcm1EYXRhU3RyZWFtQ3VybC5jcHAiPgogICAgICAgPEZpbHRlcj5wbGF0
Zm9ybVxuZXR3b3JrXGN1cmw8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21w
aWxlIEluY2x1ZGU9Ii4uXHBsYXRmb3JtXG5ldHdvcmtcY3VybFxNdWx0aXBhcnRIYW5kbGUuY3Bw
Ij4KKyAgICAgIDxGaWx0ZXI+cGxhdGZvcm1cbmV0d29ya1xjdXJsPC9GaWx0ZXI+CisgICAgPC9D
bENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxuZXR3b3JrXGN1
cmxcUHJveHlTZXJ2ZXJDdXJsLmNwcCI+CiAgICAgICA8RmlsdGVyPnBsYXRmb3JtXG5ldHdvcmtc
Y3VybDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTU3NTksNiArMTU3NjIsOSBAQAog
ICAgIDxDdXN0b21CdWlsZFN0ZXAgSW5jbHVkZT0iLi5ccGxhdGZvcm1cbmV0d29ya1xjdXJsXEZv
cm1EYXRhU3RyZWFtQ3VybC5oIj4KICAgICAgIDxGaWx0ZXI+cGxhdGZvcm1cbmV0d29ya1xjdXJs
PC9GaWx0ZXI+CiAgICAgPC9DdXN0b21CdWlsZFN0ZXA+CisgICAgPEN1c3RvbUJ1aWxkU3RlcCBJ
bmNsdWRlPSIuLlxwbGF0Zm9ybVxuZXR3b3JrXGN1cmxcTXVsdGlwYXJ0SGFuZGxlLmgiPgorICAg
ICAgPEZpbHRlcj5wbGF0Zm9ybVxuZXR3b3JrXGN1cmw8L0ZpbHRlcj4KKyAgICA8L0N1c3RvbUJ1
aWxkU3RlcD4KICAgICA8Q3VzdG9tQnVpbGRTdGVwIEluY2x1ZGU9Ii4uXHBsYXRmb3JtXG5ldHdv
cmtcY3VybFxSZXNvdXJjZUVycm9yLmgiPgogICAgICAgPEZpbHRlcj5wbGF0Zm9ybVxuZXR3b3Jr
XGN1cmw8L0ZpbHRlcj4KICAgICA8L0N1c3RvbUJ1aWxkU3RlcD4KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMuY3BwIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vycy5jcHAKaW5kZXggN2Y4NTkzYS4uNTRiODVk
NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vy
cy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vycy5j
cHAKQEAgLTYwNSw3ICs2MDUsNyBAQCBzaXplX3QgcGFyc2VIVFRQUmVxdWVzdExpbmUoY29uc3Qg
Y2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCwgU3RyaW5nJiBmYWlsdXJlUmVhcwogICAgIHJldHVy
biBlbmQgLSBkYXRhOwogfQogCi1zaXplX3QgcGFyc2VIVFRQSGVhZGVyKGNvbnN0IGNoYXIqIHN0
YXJ0LCBzaXplX3QgbGVuZ3RoLCBTdHJpbmcmIGZhaWx1cmVSZWFzb24sIEF0b21pY1N0cmluZyYg
bmFtZVN0ciwgU3RyaW5nJiB2YWx1ZVN0cikKK3NpemVfdCBwYXJzZUhUVFBIZWFkZXIoY29uc3Qg
Y2hhciogc3RhcnQsIHNpemVfdCBsZW5ndGgsIFN0cmluZyYgZmFpbHVyZVJlYXNvbiwgQXRvbWlj
U3RyaW5nJiBuYW1lU3RyLCBTdHJpbmcmIHZhbHVlU3RyLCBib29sIHN0cmljdCkKIHsKICAgICBj
b25zdCBjaGFyKiBwID0gc3RhcnQ7CiAgICAgY29uc3QgY2hhciogZW5kID0gc3RhcnQgKyBsZW5n
dGg7CkBAIC02NDgsMTcgKzY0OCwyMCBAQCBzaXplX3QgcGFyc2VIVFRQSGVhZGVyKGNvbnN0IGNo
YXIqIHN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBTdHJpbmcmIGZhaWx1cmVSZWFzb24sCiAgICAgICAg
IGNhc2UgJ1xyJzoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICdcbic6Ci0gICAg
ICAgICAgICBmYWlsdXJlUmVhc29uID0gIlVuZXhwZWN0ZWQgTEYgaW4gdmFsdWUgYXQgIiArIHRy
aW1JbnB1dFNhbXBsZSh2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Ci0gICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChzdHJpY3QpIHsKKyAgICAgICAgICAgICAgICBmYWls
dXJlUmVhc29uID0gIlVuZXhwZWN0ZWQgTEYgaW4gdmFsdWUgYXQgIiArIHRyaW1JbnB1dFNhbXBs
ZSh2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAg
ICAgICAgICAgIHZhbHVlLmFwcGVuZCgqcCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCpwID09
ICdccicpIHsKKyAgICAgICAgaWYgKCpwID09ICdccicgfHwgKCFzdHJpY3QgJiYgKnAgPT0gJ1xu
JykpIHsKICAgICAgICAgICAgICsrcDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAg
ICAgfQotICAgIGlmIChwID49IGVuZCB8fCAqcCAhPSAnXG4nKSB7CisgICAgaWYgKHAgPj0gZW5k
IHx8IChzdHJpY3QgJiYgKnAgIT0gJ1xuJykpIHsKICAgICAgICAgZmFpbHVyZVJlYXNvbiA9ICJD
UiBkb2Vzbid0IGZvbGxvdyBMRiBhZnRlciB2YWx1ZSBhdCAiICsgdHJpbUlucHV0U2FtcGxlKHAs
IGVuZCAtIHApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBQYXJzZXJzLmggYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL0hUVFBQYXJzZXJzLmgKaW5kZXggNGYyNzA1Mi4uMmM1NzBmMyAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vycy5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMuaApAQCAtODYs
NyArODYsNyBAQCBDb250ZW50VHlwZU9wdGlvbnNEaXNwb3NpdGlvbiBwYXJzZUNvbnRlbnRUeXBl
T3B0aW9uc0hlYWRlcihjb25zdCBTdHJpbmcmIGhlYWRlcgogLy8gUGFyc2luZyBDb21wbGV0ZSBI
VFRQIE1lc3NhZ2VzLgogZW51bSBIVFRQVmVyc2lvbiB7IFVua25vd24sIEhUVFBfMV8wLCBIVFRQ
XzFfMSB9Owogc2l6ZV90IHBhcnNlSFRUUFJlcXVlc3RMaW5lKGNvbnN0IGNoYXIqIGRhdGEsIHNp
emVfdCBsZW5ndGgsIFN0cmluZyYgZmFpbHVyZVJlYXNvbiwgU3RyaW5nJiBtZXRob2QsIFN0cmlu
ZyYgdXJsLCBIVFRQVmVyc2lvbiYpOwotc2l6ZV90IHBhcnNlSFRUUEhlYWRlcihjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3QgbGVuZ3RoLCBTdHJpbmcmIGZhaWx1cmVSZWFzb24sIEF0b21pY1N0cmlu
ZyYgbmFtZVN0ciwgU3RyaW5nJiB2YWx1ZVN0cik7CitzaXplX3QgcGFyc2VIVFRQSGVhZGVyKGNv
bnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgsIFN0cmluZyYgZmFpbHVyZVJlYXNvbiwgQXRv
bWljU3RyaW5nJiBuYW1lU3RyLCBTdHJpbmcmIHZhbHVlU3RyLCBib29sIHN0cmljdCA9IHRydWUp
Owogc2l6ZV90IHBhcnNlSFRUUFJlcXVlc3RCb2R5KGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBs
ZW5ndGgsIFZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgYm9keSk7CiAKIH0KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmgK
aW5kZXggMzI4OTJmNy4uZGU1MmQwMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmgKQEAgLTQ0LDYgKzQ0LDcg
QEAKICNpZiBVU0UoQ1VSTCkKICNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KICNpbmNsdWRlICJGb3Jt
RGF0YVN0cmVhbUN1cmwuaCIKKyNpbmNsdWRlICJNdWx0aXBhcnRIYW5kbGUuaCIKICNlbmRpZgog
CiAjaWYgVVNFKFNPVVApCkBAIC0xOTAsNiArMTkxLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
CiAgICAgICAgIEZvcm1EYXRhU3RyZWFtIG1fZm9ybURhdGFTdHJlYW07CiAgICAgICAgIFZlY3Rv
cjxjaGFyPiBtX3Bvc3RCeXRlczsKKworICAgICAgICBPd25QdHI8TXVsdGlwYXJ0SGFuZGxlPiBt
X211bHRpcGFydEhhbmRsZTsKICNlbmRpZgogI2lmIFVTRShTT1VQKQogICAgICAgICBHUmVmUHRy
PFNvdXBNZXNzYWdlPiBtX3NvdXBNZXNzYWdlOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VkMDFmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHAKQEAgLTAs
MCArMSwzNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVW5pdmVyc2l0eSBvZiBTemVn
ZWQKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBVTklWRVJTSVRZIE9GIFNaRUdFRCBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIFVOSVZFUlNJVFkgT0YgU1pFR0VEIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJNdWx0aXBhcnRIYW5kbGUuaCIKKworI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgiCisj
aW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRs
ZUludGVybmFsLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgorI2luY2x1ZGUgPHd0
Zi9TdHJpbmdFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzT3duUHRyPE11
bHRpcGFydEhhbmRsZT4gTXVsdGlwYXJ0SGFuZGxlOjpjcmVhdGUoUmVzb3VyY2VIYW5kbGUqIGhh
bmRsZSwgY29uc3QgU3RyaW5nJiBib3VuZGFyeSkKK3sKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3
IE11bHRpcGFydEhhbmRsZShoYW5kbGUsIGJvdW5kYXJ5KSk7Cit9CisKK2Jvb2wgTXVsdGlwYXJ0
SGFuZGxlOjpleHRyYWN0Qm91bmRhcnkoY29uc3QgU3RyaW5nJiBjb250ZW50VHlwZSwgU3RyaW5n
JiBib3VuZGFyeSkKK3sKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbigi
Ym91bmRhcnk9Iik7CisgICAgc2l6ZV90IGJvdW5kYXJ5U3RhcnQgPSBjb250ZW50VHlwZS5maW5k
SWdub3JpbmdDYXNlKCJib3VuZGFyeT0iKTsKKworICAgIC8vIE5vIGJvdW5kYXJ5IGZvdW5kLgor
ICAgIGlmIChib3VuZGFyeVN0YXJ0ID09IG5vdEZvdW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBib3VuZGFyeVN0YXJ0ICs9IGxlbmd0aDsKKyAgICBzaXplX3QgYm91bmRhcnlFbmQg
PSAwOworCisgICAgaWYgKGNvbnRlbnRUeXBlW2JvdW5kYXJ5U3RhcnRdID09ICciJykgeworICAg
ICAgICAvLyBCb3VuZGFyeSB2YWx1ZSBzdGFydHMgd2l0aCBhICIgcXVvdGUuIFNlYXJjaCBmb3Ig
dGhlIGNsb3Npbmcgb25lLgorICAgICAgICArK2JvdW5kYXJ5U3RhcnQ7CisgICAgICAgIGJvdW5k
YXJ5RW5kID0gY29udGVudFR5cGUuZmluZCgnIicsIGJvdW5kYXJ5U3RhcnQpOworICAgICAgICBp
ZiAoYm91bmRhcnlFbmQgPT0gbm90Rm91bmQpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfSBlbHNlIGlmIChjb250ZW50VHlwZVtib3VuZGFyeVN0YXJ0XSA9PSAnXCcnKSB7CisgICAg
ICAgIC8vIEJvdW5kYXJ5IHZhbHVlIHN0YXJ0cyB3aXRoIGEgJyBxdW90ZS4gU2VhcmNoIGZvciB0
aGUgY2xvc2luZyBvbmUuCisgICAgICAgICsrYm91bmRhcnlTdGFydDsKKyAgICAgICAgYm91bmRh
cnlFbmQgPSBjb250ZW50VHlwZS5maW5kKCdcJycsIGJvdW5kYXJ5U3RhcnQpOworICAgICAgICBp
ZiAoYm91bmRhcnlFbmQgPT0gbm90Rm91bmQpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBlbmQgb2YgdGhlIGJvdW5kYXJ5
LiBUaGF0IGNhbiBiZSBhIHNlbWljb2xvbiBvciBhIG5ld2xpbmUuCisgICAgICAgIGJvdW5kYXJ5
RW5kID0gY29udGVudFR5cGUuZmluZCgnOycsIGJvdW5kYXJ5U3RhcnQpOworICAgICAgICBpZiAo
Ym91bmRhcnlFbmQgPT0gbm90Rm91bmQpCisgICAgICAgICAgICBib3VuZGFyeUVuZCA9IGNvbnRl
bnRUeXBlLmxlbmd0aCgpOworICAgIH0KKworICAgIC8vIFRoZSBib3VuZGFyeSBlbmQgc2hvdWxk
IG5vdCBiZSBiZWZvcmUgdGhlIHN0YXJ0CisgICAgaWYgKGJvdW5kYXJ5RW5kIDw9IGJvdW5kYXJ5
U3RhcnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvdW5kYXJ5ID0gY29udGVudFR5
cGUuc3Vic3RyaW5nKGJvdW5kYXJ5U3RhcnQsIGJvdW5kYXJ5RW5kIC0gYm91bmRhcnlTdGFydCk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBNdWx0aXBhcnRIYW5kbGU6Om1hdGNoRm9y
Qm91bmRhcnkoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHBvc2l0aW9uLCBzaXplX3QmIG1hdGNo
ZWRMZW5ndGgpCit7CisgICAgbWF0Y2hlZExlbmd0aCA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG1fYm91bmRhcnlMZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoZGF0YVtwb3Np
dGlvbiArIGldICE9IG1fYm91bmRhcnlbaV0pIHsKKyAgICAgICAgICAgIG1hdGNoZWRMZW5ndGgg
PSBpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAg
bWF0Y2hlZExlbmd0aCA9IG1fYm91bmRhcnlMZW5ndGg7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Jvb2wgTXVsdGlwYXJ0SGFuZGxlOjpjaGVja0ZvckJvdW5kYXJ5KHNpemVfdCYgYm91bmRhcnlT
dGFydFBvc2l0aW9uLCBzaXplX3QmIGxhc3RQYXJ0aWFsTWF0Y2hQb3NpdGlvbikKK3sKKyAgICBz
aXplX3QgY29udGVudExlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKworICAgIGJvdW5kYXJ5U3Rh
cnRQb3NpdGlvbiA9IG5vdEZvdW5kOworICAgIGxhc3RQYXJ0aWFsTWF0Y2hQb3NpdGlvbiA9IGNv
bnRlbnRMZW5ndGg7CisKKyAgICBpZiAoY29udGVudExlbmd0aCA8IG1fYm91bmRhcnlMZW5ndGgp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IGNoYXIqIGNvbnRlbnQgPSBtX2J1
ZmZlci5kYXRhKCk7CisgICAgc2l6ZV90IG1hdGNoZWQ7CisKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IGNvbnRlbnRMZW5ndGggLSBtX2JvdW5kYXJ5TGVuZ3RoOyArK2kpIHsKKyAgICAgICAg
aWYgKG1hdGNoRm9yQm91bmRhcnkoY29udGVudCwgaSwgbWF0Y2hlZCkpIHsKKyAgICAgICAgICAg
IGJvdW5kYXJ5U3RhcnRQb3NpdGlvbiA9IGk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmIChtYXRjaGVkKQorICAgICAgICAgICAgbGFzdFBhcnRpYWxN
YXRjaFBvc2l0aW9uID0gaTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
TXVsdGlwYXJ0SGFuZGxlOjpwYXJzZUhlYWRlcnNJZlBvc3NpYmxlKCkKK3sKKyAgICBzaXplX3Qg
Y29udGVudExlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKworICAgIGlmICghY29udGVudExlbmd0
aCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgY2hhciogY29udGVudCA9IG1f
YnVmZmVyLmRhdGEoKTsKKworICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdGhlIGhlYWRlciBjbG9z
aW5nIHN0cmluZ3MuCisgICAgaWYgKCFzdHJuc3RyKGNvbnRlbnQsICJcclxuXHJcbiIsIGNvbnRl
bnRMZW5ndGgpKSB7CisgICAgICAgIC8vIFNvbWUgc2VydmVycyBjbG9zZXMgdGhlIGhlYWRlcnMg
d2l0aCBvbmx5IFxuLXMuCisgICAgICAgIGlmICghc3RybnN0cihjb250ZW50LCAiXG5cbiIsIGNv
bnRlbnRMZW5ndGgpKSB7CisgICAgICAgICAgICAvLyBEb24ndCBoYXZlIHRoZSBoZWFkZXIgY2xv
c2luZyBzdHJpbmcuIFdhaXQgZm9yIG1vcmUgZGF0YS4KKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBhcnNlIHRoZSBIVFRQIGhlYWRlcnMuCisg
ICAgU3RyaW5nIHZhbHVlOworICAgIEF0b21pY1N0cmluZyBuYW1lOworICAgIGNoYXIqIHAgPSBj
b25zdF9jYXN0PGNoYXIqPihjb250ZW50KTsKKyAgICBjb25zdCBjaGFyKiBlbmQgPSBjb250ZW50
ICsgY29udGVudExlbmd0aDsKKyAgICBzaXplX3QgdG90YWxDb25zdW1lZExlbmd0aCA9IDA7Cisg
ICAgZm9yICg7IHAgPCBlbmQ7ICsrcCkgeworICAgICAgICBTdHJpbmcgZmFpbHVyZVJlYXNvbjsK
KyAgICAgICAgc2l6ZV90IGNvbnN1bWVkTGVuZ3RoID0gcGFyc2VIVFRQSGVhZGVyKHAsIGVuZCAt
IHAsIGZhaWx1cmVSZWFzb24sIG5hbWUsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgIGlmICghY29u
c3VtZWRMZW5ndGgpCisgICAgICAgICAgICBicmVhazsgLy8gTm8gbW9yZSBoZWFkZXIgdG8gcGFy
c2UuCisKKyAgICAgICAgcCArPSBjb25zdW1lZExlbmd0aDsKKyAgICAgICAgdG90YWxDb25zdW1l
ZExlbmd0aCArPSBjb25zdW1lZExlbmd0aDsKKworICAgICAgICAvLyBUaGUgbmFtZSBzaG91bGQg
bm90IGJlIGVtcHR5LCBidXQgdGhlIHZhbHVlIGNvdWxkIGJlIGVtcHR5LgorICAgICAgICBpZiAo
bmFtZS5pc0VtcHR5KCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBtX2hlYWRlcnMu
YWRkKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBtX2J1ZmZlci5yZW1vdmUoMCwgdG90YWxD
b25zdW1lZExlbmd0aCArIDEpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE11bHRpcGFy
dEhhbmRsZTo6Y29udGVudFJlY2VpdmVkKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgp
Cit7CisgICAgaWYgKG1fc3RhdGUgPT0gRW5kKQorICAgICAgICByZXR1cm47IC8vIFRoZSBoYW5k
bGVyIGlzIGNsb3NlZCBkb3duIHNvIGlnbm9yZSBldmVyeXRoaW5nLgorCisgICAgbV9idWZmZXIu
YXBwZW5kKGRhdGEsIGxlbmd0aCk7CisKKyAgICB3aGlsZSAocHJvY2Vzc0NvbnRlbnQoKSkgeyB9
Cit9CisKK2Jvb2wgTXVsdGlwYXJ0SGFuZGxlOjpwcm9jZXNzQ29udGVudCgpCit7CisvKgorICAg
IFRoZSBhbGxvd2VkIHRyYW5zaXRpb25zIGJldHdlZW4gdGhlIHN0YXRlczoKKyAgICAgICAgIENo
ZWNrIEJvdW5kYXJ5CisgICAgICAgICAgICAgICB8CisgICAgICAvLS0gSW4gQm91bmRhcnkgPC0t
LS1cCisgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgfAorICAgICB8ICAgICBJbiBIZWFkZXIg
ICAgICAgIHwKKyAgICAgfCAgICAgICAgIHwgICAgICAgICAgICB8CisgICAgIHwgICAgIEluIENv
bnRlbnQgICAgICAgfAorICAgICB8ICAgICAgICAgfCAgICAgICAgICAgIHwKKyAgICAgfCAgICBF
bmQgQm91bmRhcnkgLS0tLS8KKyAgICAgfCAgICAgICAgIHwKKyAgICAgIFwtLS0tLT4gRW5kCisK
KyovCisgICAgc3dpdGNoIChtX3N0YXRlKSB7CisgICAgY2FzZSBDaGVja0JvdW5kYXJ5OiB7Cisg
ICAgICAgIGlmIChtX2J1ZmZlci5zaXplKCkgPCBtX2JvdW5kYXJ5TGVuZ3RoKSB7CisgICAgICAg
ICAgICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhLCBzbyBqdXN0IHNraXAuCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgdGhl
IGJvdW5kYXJ5IHN0cmluZy4KKyAgICAgICAgc2l6ZV90IGJvdW5kYXJ5U3RhcnQ7CisgICAgICAg
IHNpemVfdCBsYXN0UGFydGlhbE1hdGNoOworCisgICAgICAgIGlmICghY2hlY2tGb3JCb3VuZGFy
eShib3VuZGFyeVN0YXJ0LCBsYXN0UGFydGlhbE1hdGNoKSAmJiBib3VuZGFyeVN0YXJ0ID09IG5v
dEZvdW5kKSB7CisgICAgICAgICAgICAvLyBEaWQgbm90IGZpbmQgdGhlIGJvdW5kYXJ5IHN0YXJ0
IGluIHRoaXMgY2h1bmsuCisgICAgICAgICAgICAvLyBTa2lwIGFoZWFkIHRvIHRoZSBsYXN0IHZh
bGlkIGxvb2tpbmcgYm91bmRhcnkgY2hhcmFjdGVyIGFuZCBzdGFydCBhZ2Fpbi4KKyAgICAgICAg
ICAgIG1fYnVmZmVyLnJlbW92ZSgwLCBsYXN0UGFydGlhbE1hdGNoKTsKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvdW5kIHRoZSBib3VuZGFyeSBz
dGFydC4KKyAgICAgICAgLy8gQ29uc3VtZSBldmVyeXRoaW5nIGJlZm9yZSB0aGF0IGFuZCBhbHNv
IHRoZSBib3VuZGFyeQorICAgICAgICBtX2J1ZmZlci5yZW1vdmUoMCwgYm91bmRhcnlTdGFydCAr
IG1fYm91bmRhcnlMZW5ndGgpOworICAgICAgICBtX3N0YXRlID0gSW5Cb3VuZGFyeTsKKyAgICB9
CisgICAgLy8gRmFsbHRocm91Z2guCisgICAgY2FzZSBJbkJvdW5kYXJ5OiB7CisgICAgICAgIC8v
IE5vdyB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgc2hvdWxkIGJlOiBcclxuCisgICAgICAgIGlm
IChtX2J1ZmZlci5zaXplKCkgPCAyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIGNvbnN0IGNoYXIqIGNvbnRlbnQgPSBtX2J1ZmZlci5kYXRhKCk7CisgICAgICAgIC8vIEJ5
IGRlZmF1bHQgd2UnbGwgcmVtb3ZlIDIgY2hhcmFjdGVycyBhdCB0aGUgZW5kLgorICAgICAgICAv
LyBUaGUgXHIgYW5kIFxuIGFzIHN0YXRlZCBpbiB0aGUgbXVsdGlwYXJ0IFJGQy4KKyAgICAgICAg
c2l6ZV90IHJlbW92ZUNvdW50ID0gMjsKKworICAgICAgICBpZiAoY29udGVudFswXSAhPSAnXHIn
IHx8IGNvbnRlbnRbMV0gIT0gJ1xuJykgeworICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJl
IGEgXHIgYW5kIGEgXG4gYnV0IGl0IHNlZW1zIHRoYXQncyBub3QgdGhlIGNhc2UuCisgICAgICAg
ICAgICAvLyBTbyB3ZSdsbCBjaGVjayBmb3IgYSBzaW1wbGUgXG4uIE5vdCByZWFsbHkgUkZDIGNv
bXBhdGlibGUgYnV0IHNlcnZlcnMgZG8gdHJpY2t5IHRoaW5ncy4KKyAgICAgICAgICAgIGlmIChj
b250ZW50WzBdICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIG5vIFxuIHNvIGp1
c3QgZ28gdG8gdGhlIGVuZC4KKyAgICAgICAgICAgICAgICBtX3N0YXRlID0gRW5kOworICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
Rm91bmQgYSBzaW1wbGUgXG4gc28gcmVtb3ZlIGp1c3QgdGhhdC4KKyAgICAgICAgICAgIHJlbW92
ZUNvdW50ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnN1bWUgdGhlIGNoYXJhY3Rl
cnMuCisgICAgICAgIG1fYnVmZmVyLnJlbW92ZSgwLCByZW1vdmVDb3VudCk7CisgICAgICAgIG1f
aGVhZGVycy5jbGVhcigpOworICAgICAgICBtX3N0YXRlID0gSW5IZWFkZXI7CisgICAgfQorICAg
IC8vIEZhbGx0aHJvdWdoLgorICAgIGNhc2UgSW5IZWFkZXI6IHsKKyAgICAgICAgLy8gUHJvY2Vz
cyB0aGUgaGVhZGVycy4KKyAgICAgICAgaWYgKCFwYXJzZUhlYWRlcnNJZlBvc3NpYmxlKCkpIHsK
KyAgICAgICAgICAgIC8vIFBhcnNpbmcgb2YgaGVhZGVycyBmYWlsZWQsIHRyeSBhZ2FpbiBsYXRl
ci4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZFJl
Y2VpdmVSZXNwb25zZSgpOworICAgICAgICBtX3N0YXRlID0gSW5Db250ZW50OworICAgIH0KKyAg
ICAvLyBGYWxsdGhyb3VnaC4KKyAgICBjYXNlIEluQ29udGVudDogeworICAgICAgICBpZiAobV9i
dWZmZXIuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHNp
emVfdCBib3VuZGFyeVN0YXJ0ID0gbm90Rm91bmQ7CisgICAgICAgIHNpemVfdCBsYXN0UGFydGlh
bE1hdGNoOworCisgICAgICAgIGlmICghY2hlY2tGb3JCb3VuZGFyeShib3VuZGFyeVN0YXJ0LCBs
YXN0UGFydGlhbE1hdGNoKSAmJiBib3VuZGFyeVN0YXJ0ID09IG5vdEZvdW5kKSB7CisgICAgICAg
ICAgICAvLyBEaWQgbm90IGZpbmQgdGhlIGJvdW5kYXJ5IHN0YXJ0LCBhbGwgZGF0YSB1cCB0byB0
aGUgbGFzdFBhcnRpYWxNYXRjaCBpcyBvay4KKyAgICAgICAgICAgIGRpZFJlY2VpdmVEYXRhKGxh
c3RQYXJ0aWFsTWF0Y2gpOworICAgICAgICAgICAgbV9idWZmZXIucmVtb3ZlKDAsIGxhc3RQYXJ0
aWFsTWF0Y2gpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gVGhlcmUgd2FzIGEgYm91bmRhcnkgc3RhcnQgKG9yIGVuZCB3ZSdsbCBjaGVjayB0aGF0
IGxhdGVyKSwgcHVzaCBvdXQgcGFydCBvZiB0aGUgZGF0YS4KKyAgICAgICAgZGlkUmVjZWl2ZURh
dGEoYm91bmRhcnlTdGFydCk7CisgICAgICAgIG1fYnVmZmVyLnJlbW92ZSgwLCBib3VuZGFyeVN0
YXJ0ICsgbV9ib3VuZGFyeUxlbmd0aCk7CisgICAgICAgIG1fc3RhdGUgPSBFbmRCb3VuZGFyeTsK
KyAgICB9CisgICAgLy8gRmFsbHRocm91Z2guCisgICAgY2FzZSBFbmRCb3VuZGFyeTogeworICAg
ICAgICBpZiAobV9idWZmZXIuc2l6ZSgpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsg
Ly8gTm90IGVub3VnaCBkYXRhIHRvIGNoZWNrLiBSZXR1cm4gbGF0ZXIgd2hlbiB0aGVyZSBpcyBt
b3JlIGRhdGEuCisKKyAgICAgICAgLy8gV2UnbGwgZGVjaWRlIGlmIHRoaXMgaXMgYSBjbG9zaW5n
IGJvdW5kYXJ5IG9yIGFuIG9wZW5pbmcgb25lLgorICAgICAgICBjb25zdCBjaGFyKiBjb250ZW50
ID0gbV9idWZmZXIuZGF0YSgpOworCisgICAgICAgIGlmIChjb250ZW50WzBdID09ICctJyAmJiBj
b250ZW50WzFdID09ICctJykgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNsb3NpbmcgYm91
bmRhcnkuIENsb3NlIGRvd24gdGhlIGhhbmRsZXIuCisgICAgICAgICAgICBtX3N0YXRlID0gRW5k
OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhp
cyB3YXMgYSBzaW1wbGUgY29udGVudCBzZXBhcmF0b3Igbm90IGEgY2xvc2luZyBvbmUuCisgICAg
ICAgIC8vIEdvIHRvIGJlZm9yZSB0aGUgY29udGVudCBwcm9jZXNzaW5nLgorICAgICAgICBtX3N0
YXRlID0gSW5Cb3VuZGFyeTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRW5kOgor
ICAgICAgICAvLyBXZSBhcmUgZG9uZS4gTm90aGluZyB0byBkbyBhbnltb3JlLgorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsgLy8gVGhl
cmUgYXJlIHN0aWxsIHRoaW5ncyB0byBwcm9jZXNzLCBzbyBnbyBmb3IgaXQuCit9CisKK3ZvaWQg
TXVsdGlwYXJ0SGFuZGxlOjpjb250ZW50RW5kZWQoKQoreworICAgIC8vIFByb2Nlc3MgdGhlIGxl
ZnRvdmVyIGRhdGEuCisgICAgd2hpbGUgKHByb2Nlc3NDb250ZW50KCkpIHsgfQorCisgICAgaWYg
KG1fc3RhdGUgIT0gRW5kKSB7CisgICAgICAgIC8vIEl0IHNlZW1zIHdlIGFyZSBzdGlsbCBub3Qg
YXQgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzc2luZy4KKyAgICAgICAgLy8gUHVzaCBvdXQgdGhlIHJl
bWFpbmluZyBkYXRhLgorICAgICAgICBkaWRSZWNlaXZlRGF0YShtX2J1ZmZlci5zaXplKCkpOwor
ICAgICAgICBtX3N0YXRlID0gRW5kOworICAgIH0KKworICAgIG1fYnVmZmVyLmNsZWFyKCk7Cit9
CisKK3ZvaWQgTXVsdGlwYXJ0SGFuZGxlOjpkaWRSZWNlaXZlRGF0YShzaXplX3QgbGVuZ3RoKQor
eworICAgIFJlc291cmNlSGFuZGxlSW50ZXJuYWwqIGQgPSBtX3Jlc291cmNlSGFuZGxlLT5nZXRJ
bnRlcm5hbCgpOworCisgICAgaWYgKGQtPm1fY2FuY2VsbGVkKSB7CisgICAgICAgIC8vIFJlcXVl
c3QgaGFzIGJlZW4gY2FuY2VsZWQsIHNvIHdlJ2xsIGdvIHRvIHRoZSBlbmQgc3RhdGUuCisgICAg
ICAgIG1fc3RhdGUgPSBFbmQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZC0+
Y2xpZW50KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogZGF0YSA9IG1fYnVmZmVyLmRhdGEoKTsK
KyAgICAgICAgZC0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKG1fcmVzb3VyY2VIYW5kbGUsIGRh
dGEsIGxlbmd0aCwgbGVuZ3RoKTsKKyAgICB9Cit9CisKK3ZvaWQgTXVsdGlwYXJ0SGFuZGxlOjpk
aWRSZWNlaXZlUmVzcG9uc2UoKQoreworICAgIFJlc291cmNlSGFuZGxlSW50ZXJuYWwqIGQgPSBt
X3Jlc291cmNlSGFuZGxlLT5nZXRJbnRlcm5hbCgpOworICAgIGlmIChkLT5jbGllbnQoKSkgewor
ICAgICAgICBPd25QdHI8UmVzb3VyY2VSZXNwb25zZT4gcmVzcG9uc2UgPSBSZXNvdXJjZVJlc3Bv
bnNlQmFzZTo6YWRvcHQoZC0+bV9yZXNwb25zZS5jb3B5RGF0YSgpKTsKKworICAgICAgICBIVFRQ
SGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2hlYWRlcnMuZW5kKCk7CisgICAgICAg
IGZvciAoSFRUUEhlYWRlck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2hlYWRlcnMuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEhUVFBIZWFkZXJG
aWVsZChpdC0+a2V5LCBpdC0+dmFsdWUpOworCisgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9
IG1faGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpOworICAgICAgICBTdHJpbmcgbWltZVR5cGUg
PSBleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKGNvbnRlbnRUeXBlKTsKKworICAgICAgICBy
ZXNwb25zZS0+c2V0TWltZVR5cGUobWltZVR5cGUubG93ZXIoKSk7CisgICAgICAgIHJlc3BvbnNl
LT5zZXRUZXh0RW5jb2RpbmdOYW1lKGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShjb250ZW50
VHlwZSkpOworICAgICAgICByZXNwb25zZS0+c2V0U3VnZ2VzdGVkRmlsZW5hbWUoZmlsZW5hbWVG
cm9tSFRUUENvbnRlbnREaXNwb3NpdGlvbihyZXNwb25zZS0+aHR0cEhlYWRlckZpZWxkKCJDb250
ZW50LURpc3Bvc2l0aW9uIikpKTsKKworICAgICAgICBkLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJl
c3BvbnNlKG1fcmVzb3VyY2VIYW5kbGUsICpyZXNwb25zZSk7CisgICAgICAgIHJlc3BvbnNlLT5z
ZXRSZXNwb25zZUZpcmVkKHRydWUpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVs
dGlwYXJ0SGFuZGxlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvTXVs
dGlwYXJ0SGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiODU2
MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9NdWx0aXBhcnRIYW5kbGUuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEzIFVuaXZlcnNpdHkgb2YgU3plZ2VkCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVU5JVkVSU0lUWSBPRiBT
WkVHRUQgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBVTklWRVJTSVRZIE9GIFNa
RUdFRCBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisjaWZuZGVmIE11bHRpcGFydEhhbmRsZV9oCisjZGVmaW5lIE11bHRpcGFydEhhbmRsZV9oCisK
KyNpbmNsdWRlICJIVFRQSGVhZGVyTWFwLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGUuaCIK
KworI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xh
c3MgTXVsdGlwYXJ0SGFuZGxlIHsKKworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPE11
bHRpcGFydEhhbmRsZT4gY3JlYXRlKFJlc291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFN0cmlu
ZyYgYm91bmRhcnkpOworICAgIHN0YXRpYyBib29sIGV4dHJhY3RCb3VuZGFyeShjb25zdCBTdHJp
bmcmIGNvbnRlbnRUeXBlLCBTdHJpbmcmIGJvdW5kYXJ5KTsKKworICAgIE11bHRpcGFydEhhbmRs
ZShSZXNvdXJjZUhhbmRsZSogaGFuZGxlLCBjb25zdCBTdHJpbmcmIGJvdW5kYXJ5KQorICAgICAg
ICA6IG1fcmVzb3VyY2VIYW5kbGUoaGFuZGxlKQorICAgICAgICAsIG1fYm91bmRhcnkoIi0tIiAr
IGJvdW5kYXJ5KQorICAgICAgICAsIG1fYm91bmRhcnlMZW5ndGgobV9ib3VuZGFyeS5sZW5ndGgo
KSkKKyAgICAgICAgLCBtX3N0YXRlKENoZWNrQm91bmRhcnkpCisgICAgeworICAgIH0KKworICAg
IH5NdWx0aXBhcnRIYW5kbGUoKSB7IH0KKworICAgIHZvaWQgY29udGVudFJlY2VpdmVkKGNvbnN0
IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpOworICAgIHZvaWQgY29udGVudEVuZGVkKCk7CisK
K3ByaXZhdGU6CisgICAgZW51bSBNdWx0aXBhcnRIYW5kbGVTdGF0ZSB7CisgICAgICAgIENoZWNr
Qm91bmRhcnksCisgICAgICAgIEluQm91bmRhcnksCisgICAgICAgIEluSGVhZGVyLAorICAgICAg
ICBJbkNvbnRlbnQsCisgICAgICAgIEVuZEJvdW5kYXJ5LAorICAgICAgICBFbmQKKyAgICB9Owor
CisgICAgdm9pZCBkaWRSZWNlaXZlRGF0YShzaXplX3QgbGVuZ3RoKTsKKyAgICB2b2lkIGRpZFJl
Y2VpdmVSZXNwb25zZSgpOworCisgICAgYm9vbCBtYXRjaEZvckJvdW5kYXJ5KGNvbnN0IGNoYXIq
IGRhdGEsIHNpemVfdCBwb3NpdGlvbiwgc2l6ZV90JiBtYXRjaGVkTGVuZ3RoKTsKKyAgICBpbmxp
bmUgYm9vbCBjaGVja0ZvckJvdW5kYXJ5KHNpemVfdCYgYm91bmRhcnlTdGFydFBvc2l0aW9uLCBz
aXplX3QmIGxhc3RQYXJ0aWFsTWF0Y2hQb3NpdGlvbik7CisgICAgYm9vbCBwYXJzZUhlYWRlcnNJ
ZlBvc3NpYmxlKCk7CisgICAgYm9vbCBwcm9jZXNzQ29udGVudCgpOworCisgICAgUmVzb3VyY2VI
YW5kbGUqIG1fcmVzb3VyY2VIYW5kbGU7CisgICAgU3RyaW5nIG1fYm91bmRhcnk7CisgICAgc2l6
ZV90IG1fYm91bmRhcnlMZW5ndGg7CisKKyAgICBWZWN0b3I8Y2hhcj4gbV9idWZmZXI7CisgICAg
SFRUUEhlYWRlck1hcCBtX2hlYWRlcnM7CisKKyAgICBNdWx0aXBhcnRIYW5kbGVTdGF0ZSBtX3N0
YXRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorI2VuZGlmIC8vIE11bHRpcGFydEhh
bmRsZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
UmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwCmluZGV4IDE3MWYzNTIuLjlhODdmNmMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJj
ZUhhbmRsZU1hbmFnZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVk
ZSAiRGF0YVVSTC5oIgogI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgiCiAjaW5jbHVkZSAiTUlNRVR5
cGVSZWdpc3RyeS5oIgorI2luY2x1ZGUgIk11bHRpcGFydEhhbmRsZS5oIgogI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VFcnJvci5oIgogI2luY2x1ZGUgIlJl
c291cmNlSGFuZGxlLmgiCkBAIC0yMjIsOCArMjIzLDExIEBAIHN0YXRpYyBzaXplX3Qgd3JpdGVD
YWxsYmFjayh2b2lkKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIHZvaWQqIGRhdGEp
CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZiAoZC0+Y2xpZW50KCkpCisg
ICAgaWYgKGQtPm1fbXVsdGlwYXJ0SGFuZGxlKQorICAgICAgICBkLT5tX211bHRpcGFydEhhbmRs
ZS0+Y29udGVudFJlY2VpdmVkKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCB0b3RhbFNp
emUpOworICAgIGVsc2UgaWYgKGQtPmNsaWVudCgpKQogICAgICAgICBkLT5jbGllbnQoKS0+ZGlk
UmVjZWl2ZURhdGEoam9iLCBzdGF0aWNfY2FzdDxjaGFyKj4ocHRyKSwgdG90YWxTaXplLCAwKTsK
KwogICAgIHJldHVybiB0b3RhbFNpemU7CiB9CiAKQEAgLTM5OCw2ICs0MDIsMTMgQEAgc3RhdGlj
IHNpemVfdCBoZWFkZXJDYWxsYmFjayhjaGFyKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1l
bWIsIHZvaWQqIGRhdGEpCiAgICAgICAgIGQtPm1fcmVzcG9uc2Uuc2V0VGV4dEVuY29kaW5nTmFt
ZShleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUoZC0+bV9yZXNwb25zZS5odHRwSGVhZGVyRmll
bGQoIkNvbnRlbnQtVHlwZSIpKSk7CiAgICAgICAgIGQtPm1fcmVzcG9uc2Uuc2V0U3VnZ2VzdGVk
RmlsZW5hbWUoZmlsZW5hbWVGcm9tSFRUUENvbnRlbnREaXNwb3NpdGlvbihkLT5tX3Jlc3BvbnNl
Lmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNwb3NpdGlvbiIpKSk7CiAKKyAgICAgICAgaWYg
KGQtPm1fcmVzcG9uc2UuaXNNdWx0aXBhcnQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGJvdW5k
YXJ5OworICAgICAgICAgICAgYm9vbCBwYXJzZWQgPSBNdWx0aXBhcnRIYW5kbGU6OmV4dHJhY3RC
b3VuZGFyeShkLT5tX3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1UeXBlIiksIGJv
dW5kYXJ5KTsKKyAgICAgICAgICAgIGlmIChwYXJzZWQpCisgICAgICAgICAgICAgICAgZC0+bV9t
dWx0aXBhcnRIYW5kbGUgPSBNdWx0aXBhcnRIYW5kbGU6OmNyZWF0ZShqb2IsIGJvdW5kYXJ5KTsK
KyAgICAgICAgfQorCiAgICAgICAgIC8vIEhUVFAgcmVkaXJlY3Rpb24KICAgICAgICAgaWYgKGlz
SHR0cFJlZGlyZWN0KGh0dHBDb2RlKSkgewogICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0g
ZC0+bV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGQoImxvY2F0aW9uIik7CkBAIC01NzEsNiArNTgy
LDkgQEAgdm9pZCBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OmRvd25sb2FkVGltZXJDYWxsYmFjayhU
aW1lcjxSZXNvdXJjZUhhbmRsZU1hbmFnZXI+KgogICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgIH0KIAorICAgICAgICAgICAgaWYgKGQtPm1fbXVsdGlwYXJ0SGFuZGxlKQorICAgICAgICAg
ICAgICAgIGQtPm1fbXVsdGlwYXJ0SGFuZGxlLT5jb250ZW50RW5kZWQoKTsKKwogICAgICAgICAg
ICAgaWYgKGQtPmNsaWVudCgpKQogICAgICAgICAgICAgICAgIGQtPmNsaWVudCgpLT5kaWRGaW5p
c2hMb2FkaW5nKGpvYiwgMCk7CiAgICAgICAgIH0gZWxzZSB7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>