<?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>156152</bug_id>
          
          <creation_ts>2016-04-03 17:55:39 -0700</creation_ts>
          <short_desc>bmalloc: segregate small and large objects again, and allocate more objects on the small path</short_desc>
          <delta_ts>2016-04-04 00:47:22 -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>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>kling</cc>
    
    <cc>msaboff</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1180247</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-04-03 17:55:39 -0700</bug_when>
    <thetext>bmalloc: segregate small and large objects again, and allocate more objects on the small path</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1180248</commentid>
    <comment_count>1</comment_count>
      <attachid>275519</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-04-03 18:31:06 -0700</bug_when>
    <thetext>Created attachment 275519
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1180249</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-04-03 18:32:14 -0700</bug_when>
    <thetext>Attachment 275519 did not pass style-queue:


ERROR: Source/bmalloc/bmalloc/Heap.cpp:86:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/bmalloc/bmalloc/Heap.cpp:91:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/bmalloc/bmalloc/Heap.cpp:296:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/bmalloc/bmalloc/Heap.cpp:344:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/bmalloc/bmalloc/Heap.cpp:403:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 5 in 13 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>1180251</commentid>
    <comment_count>3</comment_count>
      <attachid>275519</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2016-04-03 18:52:56 -0700</bug_when>
    <thetext>Comment on attachment 275519
Patch

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

&gt; Source/bmalloc/bmalloc/Chunk.h:92
&gt; +        // The first few bytes of metadata cover the metadata region, so they&apos;re
&gt; +        // not used. We can steal them to store m_objectType.
&gt; +        ObjectType m_objectType;
&gt; +
&gt; +        // A chunk is either small or large for its lifetime, so we can union
&gt; +        // small and large metadata, and then use one or the other at runtime.
&gt; +        std::array&lt;SmallPage, chunkSize / smallPageSize&gt; m_pages;
&gt; +        std::array&lt;BoundaryTag, boundaryTagCount&gt; m_boundaryTags;

This is neat, but it would be neater if there was an assertion that the object type never overlapped with anything interesting in m_pages or m_boundaryTags.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1180272</commentid>
    <comment_count>4</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-04-03 22:21:33 -0700</bug_when>
    <thetext>&gt; This is neat, but it would be neater if there was an assertion that the
&gt; object type never overlapped with anything interesting in m_pages or
&gt; m_boundaryTags.

I wrote this assertion and it demonstrated that we had two problems:

(1) Chunk::begin() would provide a pointer that wasn&apos;t physical-page-size-aligned on 16kB systems. All pages in this kind of chunk would fail to madvise. 

(2) If you changed things around so that the first page started at byte 0, which was physical-page-size-aligned, then you would collide with m_objectType.

I solved these problems by changing Chunk::begin() to round up to the physical page size, and keeping the first page starting at Chunk::begin(). This wastes a little metadata space on 16kB systems, but not a lot (1.5% vs 1.0%).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1180273</commentid>
    <comment_count>5</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-04-03 22:26:37 -0700</bug_when>
    <thetext>Committed r198995: &lt;http://trac.webkit.org/changeset/198995&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1180286</commentid>
    <comment_count>6</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-04-04 00:47:22 -0700</bug_when>
    <thetext>From AreWeFastYet, it looks like this could be a 0.5% win on Sunspider.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>275519</attachid>
            <date>2016-04-03 18:31:06 -0700</date>
            <delta_ts>2016-04-03 18:52:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-156152-20160403183111.patch</filename>
            <type>text/plain</type>
            <size>41378</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9ibWFsbG9jL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1h
bGxvYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5ODk5NCkKKysrIFNvdXJjZS9ibWFsbG9jL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2MCBAQAorMjAxNi0wNC0wMyAgR2VvZmZy
ZXkgR2FyZW4gIDxnZ2FyZW5AYXBwbGUuY29tPgorCisgICAgICAgIGJtYWxsb2M6IHNlZ3JlZ2F0
ZSBzbWFsbCBhbmQgbGFyZ2Ugb2JqZWN0cyBhZ2FpbiwgYW5kIGFsbG9jYXRlIG1vcmUgb2JqZWN0
cyBvbiB0aGUgc21hbGwgcGF0aAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTU2MTUyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgTWljcm9iZW5jaG1hcmsgZGF0YSBzdWdnZXN0ZWQgdGhhdCBpdCB3YXMgYSBn
b29kIGlkZWEgZm9yIHNtYWxsIGFuZCBsYXJnZQorICAgICAgICBvYmplY3RzIHRvIHNoYXJlIG1l
bW9yeS4gQnV0IHIxOTg2NzUgZGlkIG5vdCBpbXByb3ZlIG1lbW9yeSB1c2UgaW4KKyAgICAgICAg
ZnVsbCBicm93c2VyIGJlbmNobWFya3MuCisKKyAgICAgICAgVGhpcyBwYXRjaCByZXZlcnRzIHRv
IHNlZ3JlZ2F0aW5nIHNtYWxsIGFuZCBsYXJnZSBvYmplY3RzIC0tIGJ1dCB3aXRob3V0CisgICAg
ICAgIGdvaW5nIGJhY2sgdG8gZG91YmxlZCBWTSB1c2FnZSAtLSBpbiBvcmRlciB0byBjYXB0dXJl
IGEgZmV3IGJlbmVmaXRzOgorCisgICAgICAgICgqKSBTbWFsbCBwYWdlcyBmcmFnbWVudCB0aGUg
bGFyZ2UgaGVhcC4gU2VwYXJhdGluZyB0aGVtIG91dCBzYXZlcyBhIGxvdAorICAgICAgICBvZiBt
ZW1vcnkgaW4gb3VyIHdvcnN0IGNhc2UgZnJhZ21lbnRhdGlvbiByZWNvcmRpbmc6CisKKyAgICAg
ICAgICAgIG5pbWxhbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAy
NzYsMDc2a0IgICAgICAgICAgICAgICAgICAgICAgMjA5LDYzNmtCICAgICAgICAgICAgICAgIF4g
MS4zMnggc21hbGxlcgorCisgICAgICAgICgqKSBTbWFsbCBvYmplY3RzIGFyZSBjb21tb24gZW5v
dWdoIHRoYXQgZXZlbiB0aGVpciBzbG93IHBhdGhzIGJlbmVmaXQgCisgICAgICAgIGZyb20gc2lt
cGxlciBjb2RlOgorCisgICAgICAgIEV4ZWN1dGlvbiBUaW1lOgorICAgICAgICAgICAgLi4uCisg
ICAgICAgICAgICBmYWNlYm9vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDIzNG1zICAgICAgICAgICAgICAgICAgICAgICAgICAyMTZtcyAgICAgICAgICAgICAg
ICAgXiAxLjA4eCBmYXN0ZXIKKyAgICAgICAgICAgIHJlZGRpdCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0bXMgICAgICAgICAgICAgICAgICAgICAgICAg
IDEwOG1zICAgICAgICAgICAgICAgICBeIDEuMDZ4IGZhc3RlcgorICAgICAgICAgICAgZmxpY2ty
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMThtcyAgICAg
ICAgICAgICAgICAgICAgICAgICAgMTExbXMgICAgICAgICAgICAgICAgIF4gMS4wNnggZmFzdGVy
CisgICAgICAgICAgICB0aGV2ZXJnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIDE0Nm1zICAgICAgICAgICAgICAgICAgICAgICAgICAxNDBtcyAgICAgICAgICAg
ICAgICAgXiAxLjA0eCBmYXN0ZXIKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgPGFyaXRo
bWV0aWMgbWVhbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDdtcyAgICAg
ICAgICAgICAgICAgICAgICAgICAgMTAybXMgICAgICAgICAgICAgICAgIF4gMS4wNHggZmFzdGVy
CisKKyAgICAgICAgKCopIFdlIGNhbiB1c2UgbGVzcyBtZXRhZGF0YToKKworICAgICAgICBNZW1v
cnkgYXQgRW5kOgorICAgICAgICAgICAgLi4uCisgICAgICAgICAgICBsaXN0X2FsbG9jYXRlICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2MGtCICAgICAgICAgICAgICAg
ICAgICAgICAgICAzODRrQiAgICAgICAgICAgICAgICAgXiAxLjJ4IHNtYWxsZXIKKyAgICAgICAg
ICAgIHRyZWVfYWxsb2NhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
NDkya0IgICAgICAgICAgICAgICAgICAgICAgICAgIDQyNGtCICAgICAgICAgICAgICAgIF4gMS4x
Nnggc21hbGxlcgorICAgICAgICAgICAgdHJlZV9jaHVybiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA0ODBrQiAgICAgICAgICAgICAgICAgICAgICAgICAgNDA0a0Ig
ICAgICAgICAgICAgICAgXiAxLjE5eCBzbWFsbGVyCisgICAgICAgICAgICBmcmFnbWVudCAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMmtCICAgICAgICAgICAg
ICAgICAgICAgICAgICA0NTJrQiAgICAgICAgICAgICAgICBeIDEuMTh4IHNtYWxsZXIKKyAgICAg
ICAgICAgIGZyYWdtZW50X2l0ZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgNzEya0IgICAgICAgICAgICAgICAgICAgICAgICAgIDU4OGtCICAgICAgICAgICAgICAgIF4g
MS4yMXggc21hbGxlcgorICAgICAgICAgICAgbWVkaXVtICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAxNSwxNTJrQiAgICAgICAgICAgICAgICAgICAgICAgMTEsNzk2
a0IgICAgICAgICAgICAgICAgXiAxLjI4eCBzbWFsbGVyCisgICAgICAgICAgICBiaWcgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LDA0NGtCICAgICAgICAg
ICAgICAgICAgICAgICAxMCw5NzZrQiAgICAgICAgICAgICAgICBeIDEuMzd4IHNtYWxsZXIKKyAg
ICAgICAgICAgIC4uLgorICAgICAgICAgICAgPGFyaXRobWV0aWMgbWVhbj4gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgNyw3MjRrQiAgICAgICAgICAgICAgICAgICAgICAgIDcsMTkw
a0IgICAgICAgICAgICAgICAgXiAxLjA3eCBzbWFsbGVyCisKKyAgICAgICAgVGhpcyBwYXRjaCBh
bHNvIHRha2VzIGFkdmFudGFnZSBvZiBvdXIgc3VwcG9ydCBmb3IgdmFyeWluZyB0aGUgcGFnZSBz
aXplCisgICAgICAgIGF0IHJ1bnRpbWUgYnkgYWxsb2NhdGluZyBtb3JlIG9iamVjdHMgb24gdGhl
IHNtYWxsIG9iamVjdCBwYXRoOgorCisgICAgICAgICAgICBtZWRpdW0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OG1zICAgICAgICAgICAgICAgICAgICAg
ICAgICAxNTBtcyAgICAgICAgICAgICAgICAgXiAxLjE5eCBmYXN0ZXIKKworICAgICAgICBTb21l
IG1pY3JvYmVuY2htYXJrcyByZXBvcnQgbWVtb3J5IHVzZSBpbmNyZWFzZXMgZnJvbSB0aGlzIGNo
YW5nZSAtLSBsaWtlCisgICAgICAgIHRoZXkgcmVwb3J0ZWQgbWVtb3J5IHVzZSBkZWNyZWFzZXMg
ZnJvbSByMTk4Njc1IC0tIGJ1dCBJJ20gaWdub3JpbmcgdGhlbQorICAgICAgICBmb3Igbm93IGJl
Y2F1c2UgSSBleHBlY3Qgb3VyIGZ1bGwgYnJvd3NlciBtZW1vcnkgYmVuY2htYXJrcyB0byBjb25m
aXJtCisgICAgICAgIHRoYXQgdGhpcyBwYXRjaCBpcyBmaW5lLgorCisgICAgICAgICogYm1hbGxv
Yy9CdW1wQWxsb2NhdG9yLmg6CisgICAgICAgIChibWFsbG9jOjpCdW1wQWxsb2NhdG9yOjpCdW1w
QWxsb2NhdG9yKTogVXNlIGEgZnVsbCB1bnNpZ25lZCBiZWNhdXNlIHdlCisgICAgICAgIGNhbiBh
bGxvY2F0ZSBvYmplY3RzIGxhcmdlciB0aGFuIDE2a0IgLSAxLCBhbmQgYSBmdWxsIHVuc2lnbmVk
IGRvZXMgbm90CisgICAgICAgIG1ha2UgQnVtcEFsbG9jYXRvciBhbnkgbGFyZ2VyIG9uIDY0Yml0
IHN5c3RlbXMuCisKKyAgICAgICAgKiBibWFsbG9jL0NodW5rLmg6CisgICAgICAgIChibWFsbG9j
OjpDaHVuazo6YmVnaW4pOgorICAgICAgICAoYm1hbGxvYzo6Q2h1bms6OmVuZCk6CisgICAgICAg
IChibWFsbG9jOjpDaHVuazo6c2l6ZSk6CisgICAgICAgIChibWFsbG9jOjpDaHVuazo6b2JqZWN0
VHlwZSk6IFN0b3JlIE9iamVjdFR5cGUgaW4gdGhlIENodW5rLCBzaW5jZSBpdCBvbmx5CisgICAg
ICAgIHZhcmllcyBieSBDaHVuayBub3csIGFuZCBub3QgZnJvbSBwYWdlIHRvIHBhZ2Ugd2l0aGlu
IGEgQ2h1bmsuIEFsc28sCisgICAgICAgIHVuaW9uIHRvZ2V0aGVyIHNtYWxsIGFuZCBsYXJnZSBv
YmplY3QgbWV0YWRhdGEsIHNpbmNlIHdlIHdpbGwgb25seSB1c2UKKyAgICAgICAgb25lIG9yIHRo
ZSBvdGhlci4gVGhpcyBzYXZlcyBtZW1vcnkuCisKKyAgICAgICAgKGJtYWxsb2M6OkNodW5rOjpD
aHVuayk6IENvbmRpdGlvbmFsaXplIGluaXRpYWxpemF0aW9uIGJhc2VkIG9uIG9iamVjdAorICAg
ICAgICB0eXBlLCBzaW5jZSBvbmx5IG9uZSBraW5kIG9mIG1ldGFkYXRhIG9yIHRoZSBvdGhlciBj
YW4gYmUgdXNlZCBhdCBydW50aW1lLgorCisgICAgICAgIChibWFsbG9jOjpPYmplY3Q6Ok9iamVj
dCk6CisgICAgICAgIChibWFsbG9jOjpPYmplY3Q6OmJlZ2luKToKKyAgICAgICAgKGJtYWxsb2M6
OlNtYWxsUGFnZTo6ZW5kKTogRGVsZXRlZC4KKworICAgICAgICAqIGJtYWxsb2MvSGVhcC5jcHA6
CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpIZWFwKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6
OmluaXRpYWxpemVMaW5lTWV0YWRhdGEpOiBTYXZlIGEgbGl0dGxlIHNwYWNlLCBzaW5jZSB3ZQor
ICAgICAgICBrbm93IHRoYXQgbGluZXMgYXJlIG9ubHkgMjU2IGJ5dGVzIGxvbmcuCisKKyAgICAg
ICAgKGJtYWxsb2M6OkhlYXA6OmluaXRpYWxpemVQYWdlTWV0YWRhdGEpOiBTdG9yZSBhIGR5bmFt
aWMgcGFnZSBzaXplIGZvcgorICAgICAgICBlYWNoIHNpemUgY2xhc3MuIFdlIHVzZWQgdG8gdXNl
IG9ubHkgb25lIHBhZ2Ugc2l6ZSAodGhlIHN5c3RlbSBwYWdlIHNpemUpCisgICAgICAgIGJ1dCB0
aGF0IGxpbWl0ZWQgb3VyIGFiaWxpdHkgdG8gYWxsb2NhdGUgb2JqZWN0cyBsYXJnZXIgdGhhbiAx
a0Igb24gdGhlCisgICAgICAgIHNtYWxsIG9iamVjdCBwYXRoLiBOb3cgd2UgY2FuIGhhbmRsZSBh
bnkgb2JqZWN0IHNpemUgd2Ugd2FudCBieSBzdG9yaW5nCisgICAgICAgIG9iamVjdHMgb2YgdGhh
dCBzaXplIGluIGEgY3VzdG9tIHBhZ2Ugc2l6ZS4KKworICAgICAgICAoYm1hbGxvYzo6SGVhcDo6
Y29uY3VycmVudFNjYXZlbmdlKToKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OnNjYXZlbmdlKToK
KyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OnNjYXZlbmdlU21hbGxQYWdlcyk6IFJldmVydCB0byBv
dXIgb2xkIGxpbmtlZCBsaXN0CisgICAgICAgIHN0cmF0ZWd5IGZvciBzdG9yaW5nIHNtYWxsIHBh
Z2VzLgorCisgICAgICAgIChibWFsbG9jOjpIZWFwOjpzcGxpdEFuZEFsbG9jYXRlKTogT2JqZWN0
IHR5cGUgaXMgcGVyIENodW5rIG5vdy4KKworICAgICAgICAoYm1hbGxvYzo6SGVhcDo6YWxsb2Nh
dGVMYXJnZSk6IERvbid0IG51a2UgdGhlIHNtYWxsIHBhZ2UgbGlzdCB3aGVuCisgICAgICAgIGFs
bG9jYXRpbmcgYSBsYXJnZSBvYmplY3QgYmVjYXVzZSB0aGUgdHdvIGRvbid0IHNoYXJlIG1lbW9y
eSBhbnltb3JlLgorCisgICAgICAgIChibWFsbG9jOjpIZWFwOjphbGxvY2F0ZVNtYWxsUGFnZSk6
IFJldmVydCB0byBvdXIgb2xkIGxpbmtlZCBsaXN0CisgICAgICAgIHN0cmF0ZWd5IGZvciBzdG9y
aW5nIHNtYWxsIHBhZ2VzLgorCisgICAgICAgIChibWFsbG9jOjpIZWFwOjpkZWFsbG9jYXRlU21h
bGxMaW5lKTogRG9uJ3QgcmV0dXJuIGVhcmx5IGluIHRoZSBjYXNlCisgICAgICAgIHdoZXJlIHRo
aXMgaXMgdGhlIGZpcnN0IGZyZWUgb2JqZWN0IGluIHRoZSBwYWdlLiBJbiB0aGUgY2FzZSBvZiBs
YXJnZS1pc2gKKyAgICAgICAgb2JqZWN0cywgdGhlIGZpcnN0IGZyZWUgb2JqZWN0IG1pZ2h0IGFs
c28gYmUgdGhlIGxhc3QgZnJlZSBvYmplY3QsCisgICAgICAgIHNpbmNlIHRoZXJlJ3Mgb25lIG9i
amVjdCBwZXIgcGFnZS4KKworICAgICAgICAoYm1hbGxvYzo6SGVhcDo6YWxsb2NhdGVTbWFsbEJ1
bXBSYW5nZXNCeU1ldGFkYXRhKTogU3BsaXQgb3V0IHNvbWUgaGVscGVyCisgICAgICAgIGxhbWJk
YXMgdG8gbWFrZSB0aGlzIGNvZGUgY2xlYXJlci4KKworICAgICAgICAoYm1hbGxvYzo6SGVhcDo6
YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU9iamVjdCk6IEFkZGVkIGEgZmFzdCBzY2FuCisgICAg
ICAgIGZvciBvYmplY3RzIGxhcmdlciB0aGFuIHRoZSBsaW5lIHNpemUuIFdoZW4gbXVsdGlwbGUg
b2JqZWN0cyBmaXQgaW4KKyAgICAgICAgYSBzaW5nbGUgbGluZSwgaXQncyBhbiBvcHRpbWl6YXRp
b24gdG8gc2NhbiBhIGxpbmUgYXQgYSB0aW1lLiBCdXQgd2hlbgorICAgICAgICBpdCdzIG9uZSBv
YmplY3QgcGVyIGxpbmUsIG9yIG9uZSBvYmplY3QgcGVyIDY0IGxpbmVzLCBpdCdzIGJldHRlciBq
dXN0CisgICAgICAgIHRvIHNjYW4gYW4gb2JqZWN0IGF0IGEgdGltZS4KKworICAgICAgICAqIGJt
YWxsb2MvSGVhcC5oOgorICAgICAgICAoYm1hbGxvYzo6SGVhcDo6YWxsb2NhdGVTbWFsbEJ1bXBS
YW5nZXMpOgorICAgICAgICAoYm1hbGxvYzo6SGVhcDo6ZGVyZWZTbWFsbExpbmUpOiBNYXRjaCB0
aGUgY2hhbmdlcyBhYm92ZS4KKworICAgICAgICAqIGJtYWxsb2MvTGluZU1ldGFkYXRhLmg6IFdl
IHdlcmVuJ3QgdXNpbmcgYWxsIHRob3NlIGJpdHMuCisKKyAgICAgICAgKiBibWFsbG9jL0xpc3Qu
aDoKKyAgICAgICAgKGJtYWxsb2M6Okxpc3Q6OnJlbW92ZSk6IFB1dCBhIHJlbW92ZWQgTm9kZSBm
dWxseSBiYWNrIGludG8gdGhlIGRlZmF1bHQKKyAgICAgICAgKGVtcHR5KSBzdGF0ZSBpdCB3YXMg
aW4gYmVmb3JlIGl0IGVudGVyZWQgdGhlIGxpc3QuIFRoaXMgY2hhbmdlIGlzIG5vdAorICAgICAg
ICBvYnNlcnZhYmxlLCBidXQgaXQgbWFrZXMgdGhpbmdzIGNsZWFyZXIgd2hlbiB5b3UncmUgZGVi
dWdnaW5nLgorCisgICAgICAgICogYm1hbGxvYy9PYmplY3QuaDoKKyAgICAgICAgKGJtYWxsb2M6
Ok9iamVjdDo6T2JqZWN0KToKKyAgICAgICAgKGJtYWxsb2M6Ok9iamVjdDo6Y2h1bmspOgorICAg
ICAgICAoYm1hbGxvYzo6T2JqZWN0OjpvZmZzZXQpOgorICAgICAgICAoYm1hbGxvYzo6T2JqZWN0
OjpvcGVyYXRvcispOgorICAgICAgICAoYm1hbGxvYzo6T2JqZWN0OjpvcGVyYXRvcjw9KTogQWRk
ZWQgc29tZSBoZWxwZXJzIGZvciBpdGVyYXRpbmcgYnkgb2JqZWN0LgorCisgICAgICAgICogYm1h
bGxvYy9PYmplY3RUeXBlLmNwcDoKKyAgICAgICAgKGJtYWxsb2M6Om9iamVjdFR5cGUpOiBVcGRh
dGVkIGZvciBBUEkgY2hhbmdlLgorCisgICAgICAgICogYm1hbGxvYy9TaXplcy5oOgorICAgICAg
ICAoYm1hbGxvYzo6U2l6ZXM6Om1hc2tPYmplY3RTaXplKToKKyAgICAgICAgKGJtYWxsb2M6OlNp
emVzOjpvYmplY3RTaXplKToKKyAgICAgICAgKGJtYWxsb2M6OlNpemVzOjpwYWdlU2l6ZSk6IFN1
cHBvcnQgbW9yZSBwYWdlIHNpemVzLgorCisgICAgICAgICogYm1hbGxvYy9TbWFsbFBhZ2UuaDoK
KyAgICAgICAgKGJtYWxsb2M6OlNtYWxsUGFnZTo6U21hbGxQYWdlKToKKyAgICAgICAgKGJtYWxs
b2M6OlNtYWxsUGFnZTo6b2JqZWN0VHlwZSk6IERlbGV0ZWQuCisgICAgICAgIChibWFsbG9jOjpT
bWFsbFBhZ2U6OnNldE9iamVjdFR5cGUpOiBEZWxldGVkLgorICAgICAgICAoYm1hbGxvYzo6U21h
bGxQYWdlOjpzbWFsbFBhZ2VDb3VudCk6IERlbGV0ZWQuCisgICAgICAgIChibWFsbG9jOjpTbWFs
bFBhZ2U6OnNldFNtYWxsUGFnZUNvdW50KTogRGVsZXRlZC4gT2JqZWN0IHR5cGUgaXMgcGVyCisg
ICAgICAgIENodW5rIG5vdywgYW5kIHdlIGNhbiBpbmZlciBwYWdlIGNvdW50IGZyb20gc2l6ZSBj
bGFzcy4KKworICAgICAgICAqIGJtYWxsb2MvVk1IZWFwLmNwcDoKKyAgICAgICAgKGJtYWxsb2M6
OlZNSGVhcDo6YWxsb2NhdGVDaHVuayk6CisgICAgICAgIChibWFsbG9jOjpWTUhlYXA6OmFsbG9j
YXRlU21hbGxDaHVuayk6CisgICAgICAgICogYm1hbGxvYy9WTUhlYXAuaDoKKyAgICAgICAgKGJt
YWxsb2M6OlZNSGVhcDo6YWxsb2NhdGVTbWFsbFBhZ2UpOgorICAgICAgICAoYm1hbGxvYzo6Vk1I
ZWFwOjpkZWFsbG9jYXRlU21hbGxQYWdlKToKKyAgICAgICAgKGJtYWxsb2M6OlZNSGVhcDo6YWxs
b2NhdGVMYXJnZU9iamVjdCk6IFN1cHBvcnQgb3VyIG9sZCBiZWhhdmlvciBvZgorICAgICAgICBz
dG9yaW5nIGZyZWUgcGFnZXMgaW4gbGlua2VkIGxpc3RzLgorCiAyMDE2LTAzLTI5ICBHZW9mZnJl
eSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+CiAKICAgICAgICAgYm1hbGxvYzogc3VwcG9ydCBw
aHlzaWNhbCBwYWdlIHNpemVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHZpcnR1YWwgcGFnZSBzaXpl
ICh0YWtlIDIpCkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0J1bXBBbGxvY2F0b3IuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0J1bXBBbGxvY2F0b3IuaAkocmV2
aXNpb24gMTk4OTk0KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9CdW1wQWxsb2NhdG9yLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTUxLDggKzUxLDggQEAgcHVibGljOgogCiBwcml2YXRlOgogICAg
IGNoYXIqIG1fcHRyOwotICAgIHVuc2lnbmVkIHNob3J0IG1fc2l6ZTsKLSAgICB1bnNpZ25lZCBz
aG9ydCBtX3JlbWFpbmluZzsKKyAgICB1bnNpZ25lZCBtX3NpemU7CisgICAgdW5zaWduZWQgbV9y
ZW1haW5pbmc7CiB9OwogCiBpbmxpbmUgQnVtcEFsbG9jYXRvcjo6QnVtcEFsbG9jYXRvcigpCklu
ZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0NodW5rLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L2JtYWxsb2MvYm1hbGxvYy9DaHVuay5oCShyZXZpc2lvbiAxOTg5OTQpCisrKyBTb3VyY2UvYm1h
bGxvYy9ibWFsbG9jL0NodW5rLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDExICs0NSwxMSBAQCBw
dWJsaWM6CiAgICAgc3RhdGljIEJlZ2luVGFnKiBiZWdpblRhZyh2b2lkKik7CiAgICAgc3RhdGlj
IEVuZFRhZyogZW5kVGFnKHZvaWQqLCBzaXplX3QpOwogCi0gICAgQ2h1bmsoc3RkOjpsb2NrX2d1
YXJkPFN0YXRpY011dGV4PiYpOworICAgIENodW5rKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRl
eD4mLCBPYmplY3RUeXBlKTsKIAogICAgIHNpemVfdCBvZmZzZXQodm9pZCopOwogCi0gICAgdm9p
ZCogb2JqZWN0KHNpemVfdCBvZmZzZXQpOworICAgIGNoYXIqIG9iamVjdChzaXplX3Qgb2Zmc2V0
KTsKICAgICBTbWFsbFBhZ2UqIHBhZ2Uoc2l6ZV90IG9mZnNldCk7CiAgICAgU21hbGxMaW5lKiBs
aW5lKHNpemVfdCBvZmZzZXQpOwogCkBAIC01OCw2ICs1OCw5IEBAIHB1YmxpYzoKIAogICAgIGNo
YXIqIGJlZ2luKCkgeyByZXR1cm4gbV9tZW1vcnk7IH0KICAgICBjaGFyKiBlbmQoKSB7IHJldHVy
biByZWludGVycHJldF9jYXN0PGNoYXIqPih0aGlzKSArIGNodW5rU2l6ZTsgfQorICAgIHNpemVf
dCBzaXplKCkgeyByZXR1cm4gZW5kKCkgLSBiZWdpbigpOyB9CisKKyAgICBPYmplY3RUeXBlIG9i
amVjdFR5cGUoKSB7IHJldHVybiBtX29iamVjdFR5cGU7IH0KIAogcHJpdmF0ZToKICAgICBzdGF0
aWMgY29uc3Qgc2l6ZV90IGJvdW5kYXJ5VGFnQ291bnQgPSBjaHVua1NpemUgLyBsYXJnZU1pbjsK
QEAgLTc4LDQ1ICs4MSw2NSBAQCBwcml2YXRlOgogICAgIC8vIFdlIHVzZSB0aGUgWCdzIGZvciBi
b3VuZGFyeSB0YWdzIGFuZCB0aGUgTydzIGZvciBlZGdlIHNlbnRpbmVscy4KIAogICAgIHN0ZDo6
YXJyYXk8U21hbGxMaW5lLCBjaHVua1NpemUgLyBzbWFsbExpbmVTaXplPiBtX2xpbmVzOwotICAg
IHN0ZDo6YXJyYXk8U21hbGxQYWdlLCBjaHVua1NpemUgLyBzbWFsbFBhZ2VTaXplPiBtX3BhZ2Vz
OwotICAgIHN0ZDo6YXJyYXk8Qm91bmRhcnlUYWcsIGJvdW5kYXJ5VGFnQ291bnQ+IG1fYm91bmRh
cnlUYWdzOworICAgIHVuaW9uIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IGZldyBieXRlcyBvZiBt
ZXRhZGF0YSBjb3ZlciB0aGUgbWV0YWRhdGEgcmVnaW9uLCBzbyB0aGV5J3JlCisgICAgICAgIC8v
IG5vdCB1c2VkLiBXZSBjYW4gc3RlYWwgdGhlbSB0byBzdG9yZSBtX29iamVjdFR5cGUuCisgICAg
ICAgIE9iamVjdFR5cGUgbV9vYmplY3RUeXBlOworCisgICAgICAgIC8vIEEgY2h1bmsgaXMgZWl0
aGVyIHNtYWxsIG9yIGxhcmdlIGZvciBpdHMgbGlmZXRpbWUsIHNvIHdlIGNhbiB1bmlvbgorICAg
ICAgICAvLyBzbWFsbCBhbmQgbGFyZ2UgbWV0YWRhdGEsIGFuZCB0aGVuIHVzZSBvbmUgb3IgdGhl
IG90aGVyIGF0IHJ1bnRpbWUuCisgICAgICAgIHN0ZDo6YXJyYXk8U21hbGxQYWdlLCBjaHVua1Np
emUgLyBzbWFsbFBhZ2VTaXplPiBtX3BhZ2VzOworICAgICAgICBzdGQ6OmFycmF5PEJvdW5kYXJ5
VGFnLCBib3VuZGFyeVRhZ0NvdW50PiBtX2JvdW5kYXJ5VGFnczsKKyAgICB9OwogICAgIGNoYXIg
bV9tZW1vcnlbXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGxhcmdlQWxpZ25tZW50ICsgMCkpKTsK
IH07CiAKIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENodW5rKSArIGxhcmdlTWF4IDw9IGNodW5rU2l6
ZSwgImxhcmdlTWF4IGlzIHRvbyBiaWciKTsKIAotaW5saW5lIENodW5rOjpDaHVuayhzdGQ6Omxv
Y2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBsb2NrKQoraW5saW5lIENodW5rOjpDaHVuayhzdGQ6Omxv
Y2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBsb2NrLCBPYmplY3RUeXBlIG9iamVjdFR5cGUpCisgICAg
OiBtX29iamVjdFR5cGUob2JqZWN0VHlwZSkKIHsKLSAgICBSYW5nZSByYW5nZShiZWdpbigpLCBl
bmQoKSAtIGJlZ2luKCkpOwotICAgIEJBU1NFUlQocmFuZ2Uuc2l6ZSgpIDw9IGxhcmdlT2JqZWN0
TWF4KTsKLQotICAgIEJlZ2luVGFnKiBiZWdpblRhZyA9IENodW5rOjpiZWdpblRhZyhyYW5nZS5i
ZWdpbigpKTsKLSAgICBiZWdpblRhZy0+c2V0UmFuZ2UocmFuZ2UpOwotICAgIGJlZ2luVGFnLT5z
ZXRGcmVlKHRydWUpOwotICAgIGJlZ2luVGFnLT5zZXRWTVN0YXRlKFZNU3RhdGU6OlZpcnR1YWwp
OwotCi0gICAgRW5kVGFnKiBlbmRUYWcgPSBDaHVuazo6ZW5kVGFnKHJhbmdlLmJlZ2luKCksIHJh
bmdlLnNpemUoKSk7Ci0gICAgZW5kVGFnLT5pbml0KGJlZ2luVGFnKTsKLQotICAgIC8vIE1hcmsg
dGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIG91ciByYW5nZSBhcyBhbGxvY2F0ZWQuIFRoaXMg
bmF0dXJhbGx5Ci0gICAgLy8gcHJldmVudHMgbWVyZ2luZyBsb2dpYyBmcm9tIG92ZXJmbG93aW5n
IGxlZnQgKGludG8gbWV0YWRhdGEpIG9yIHJpZ2h0Ci0gICAgLy8gKGJleW9uZCBvdXIgY2h1bmsp
LCB3aXRob3V0IHJlcXVpcmluZyBzcGVjaWFsLWNhc2UgY2hlY2tzLgotCi0gICAgRW5kVGFnKiBs
ZWZ0U2VudGluZWwgPSBiZWdpblRhZy0+cHJldigpOwotICAgIEJBU1NFUlQobGVmdFNlbnRpbmVs
ID49IG1fYm91bmRhcnlUYWdzLmJlZ2luKCkpOwotICAgIEJBU1NFUlQobGVmdFNlbnRpbmVsIDwg
bV9ib3VuZGFyeVRhZ3MuZW5kKCkpOwotICAgIGxlZnRTZW50aW5lbC0+aW5pdFNlbnRpbmVsKCk7
Ci0KLSAgICBCZWdpblRhZyogcmlnaHRTZW50aW5lbCA9IGVuZFRhZy0+bmV4dCgpOwotICAgIEJB
U1NFUlQocmlnaHRTZW50aW5lbCA+PSBtX2JvdW5kYXJ5VGFncy5iZWdpbigpKTsKLSAgICBCQVNT
RVJUKHJpZ2h0U2VudGluZWwgPCBtX2JvdW5kYXJ5VGFncy5lbmQoKSk7Ci0gICAgcmlnaHRTZW50
aW5lbC0+aW5pdFNlbnRpbmVsKCk7Ci0KLSAgICAvLyBUcmFjayB0aGUgbWVtb3J5IHVzZWQgZm9y
IG1ldGFkYXRhIGJ5IGFsbG9jYXRpbmcgaW1hZ2luYXJ5IG9iamVjdHMuCi0gICAgZm9yIChjaGFy
KiBpdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRoaXMpOyBpdCA8IG1fbWVtb3J5OyBpdCAr
PSBzbWFsbExpbmVTaXplKSB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QoaXQpOwotICAgICAgICBv
YmplY3QubGluZSgpLT5yZWYobG9jayk7Ci0gICAgICAgIG9iamVjdC5wYWdlKCktPnJlZihsb2Nr
KTsKKyAgICBzd2l0Y2ggKG9iamVjdFR5cGUpIHsKKyAgICBjYXNlIE9iamVjdFR5cGU6OlNtYWxs
OiB7CisgICAgICAgIC8vIFRyYWNrIHRoZSBtZW1vcnkgdXNlZCBmb3IgbWV0YWRhdGEgYnkgYWxs
b2NhdGluZyBpbWFnaW5hcnkgb2JqZWN0cy4KKyAgICAgICAgZm9yIChjaGFyKiBpdCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRoaXMpOyBpdCA8IG1fbWVtb3J5OyBpdCArPSBzbWFsbExpbmVT
aXplKSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0KGl0KTsKKyAgICAgICAgICAgIG9iamVj
dC5saW5lKCktPnJlZihsb2NrKTsKKyAgICAgICAgICAgIG9iamVjdC5wYWdlKCktPnJlZihsb2Nr
KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPYmplY3RUeXBl
OjpMYXJnZTogeworICAgICAgICBSYW5nZSByYW5nZShiZWdpbigpLCBzaXplKCkpOworICAgICAg
ICBCQVNTRVJUKHJhbmdlLnNpemUoKSA8PSBsYXJnZU9iamVjdE1heCk7CisKKyAgICAgICAgQmVn
aW5UYWcqIGJlZ2luVGFnID0gQ2h1bms6OmJlZ2luVGFnKHJhbmdlLmJlZ2luKCkpOworICAgICAg
ICBiZWdpblRhZy0+c2V0UmFuZ2UocmFuZ2UpOworICAgICAgICBiZWdpblRhZy0+c2V0RnJlZSh0
cnVlKTsKKyAgICAgICAgYmVnaW5UYWctPnNldFZNU3RhdGUoVk1TdGF0ZTo6VmlydHVhbCk7CisK
KyAgICAgICAgRW5kVGFnKiBlbmRUYWcgPSBDaHVuazo6ZW5kVGFnKHJhbmdlLmJlZ2luKCksIHJh
bmdlLnNpemUoKSk7CisgICAgICAgIGVuZFRhZy0+aW5pdChiZWdpblRhZyk7CisKKyAgICAgICAg
Ly8gTWFyayB0aGUgbGVmdCBhbmQgcmlnaHQgZWRnZXMgb2Ygb3VyIHJhbmdlIGFzIGFsbG9jYXRl
ZC4gVGhpcyBuYXR1cmFsbHkKKyAgICAgICAgLy8gcHJldmVudHMgbWVyZ2luZyBsb2dpYyBmcm9t
IG92ZXJmbG93aW5nIGxlZnQgKGludG8gbWV0YWRhdGEpIG9yIHJpZ2h0CisgICAgICAgIC8vIChi
ZXlvbmQgb3VyIGNodW5rKSwgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbC1jYXNlIGNoZWNrcy4K
KworICAgICAgICBFbmRUYWcqIGxlZnRTZW50aW5lbCA9IGJlZ2luVGFnLT5wcmV2KCk7CisgICAg
ICAgIEJBU1NFUlQobGVmdFNlbnRpbmVsID49IG1fYm91bmRhcnlUYWdzLmJlZ2luKCkpOworICAg
ICAgICBCQVNTRVJUKGxlZnRTZW50aW5lbCA8IG1fYm91bmRhcnlUYWdzLmVuZCgpKTsKKyAgICAg
ICAgbGVmdFNlbnRpbmVsLT5pbml0U2VudGluZWwoKTsKKworICAgICAgICBCZWdpblRhZyogcmln
aHRTZW50aW5lbCA9IGVuZFRhZy0+bmV4dCgpOworICAgICAgICBCQVNTRVJUKHJpZ2h0U2VudGlu
ZWwgPj0gbV9ib3VuZGFyeVRhZ3MuYmVnaW4oKSk7CisgICAgICAgIEJBU1NFUlQocmlnaHRTZW50
aW5lbCA8IG1fYm91bmRhcnlUYWdzLmVuZCgpKTsKKyAgICAgICAgcmlnaHRTZW50aW5lbC0+aW5p
dFNlbnRpbmVsKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9iamVjdFR5cGU6
OlhMYXJnZTogeworICAgICAgICBCQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAg
fQogICAgIH0KIH0KIApAQCAtMTUyLDcgKzE3NSw3IEBAIGlubGluZSBzaXplX3QgQ2h1bms6Om9m
ZnNldCh2b2lkKiBvYmplY3QKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcio+KG9iamVjdCkg
LSByZWludGVycHJldF9jYXN0PGNoYXIqPih0aGlzKTsKIH0KIAotaW5saW5lIHZvaWQqIENodW5r
OjpvYmplY3Qoc2l6ZV90IG9mZnNldCkKK2lubGluZSBjaGFyKiBDaHVuazo6b2JqZWN0KHNpemVf
dCBvZmZzZXQpCiB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRoaXMpICsg
b2Zmc2V0OwogfQpAQCAtMTkyLDEyICsyMTUsNiBAQCBpbmxpbmUgU21hbGxMaW5lKiBTbWFsbFBh
Z2U6OmJlZ2luKCkKICAgICByZXR1cm4gJmNodW5rLT5saW5lcygpW2xpbmVOdW1iZXJdOwogfQog
Ci1pbmxpbmUgU21hbGxMaW5lKiBTbWFsbFBhZ2U6OmVuZCgpCi17Ci0gICAgQkFTU0VSVCghbV9z
bGlkZSk7Ci0gICAgcmV0dXJuIGJlZ2luKCkgKyBtX3NtYWxsUGFnZUNvdW50ICogc21hbGxQYWdl
TGluZUNvdW50OwotfQotCiBpbmxpbmUgT2JqZWN0OjpPYmplY3Qodm9pZCogb2JqZWN0KQogICAg
IDogbV9jaHVuayhDaHVuazo6Z2V0KG9iamVjdCkpCiAgICAgLCBtX29mZnNldChtX2NodW5rLT5v
ZmZzZXQob2JqZWN0KSkKQEAgLTIxMSw3ICsyMjgsNyBAQCBpbmxpbmUgT2JqZWN0OjpPYmplY3Qo
Q2h1bmsqIGNodW5rLCB2b2lkCiAgICAgQkFTU0VSVChjaHVuayA9PSBDaHVuazo6Z2V0KG9iamVj
dCkpOwogfQogCi1pbmxpbmUgdm9pZCogT2JqZWN0OjpiZWdpbigpCitpbmxpbmUgY2hhciogT2Jq
ZWN0OjpiZWdpbigpCiB7CiAgICAgcmV0dXJuIG1fY2h1bmstPm9iamVjdChtX29mZnNldCk7CiB9
CkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5jcHAJKHJldmlzaW9uIDE5ODk5NCkKKysrIFNvdXJj
ZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDEyICs0NSwx
MiBAQCBIZWFwOjpIZWFwKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mCiAgICAgUkVMRUFT
RV9CQVNTRVJUKHhMYXJnZUFsaWdubWVudCA+PSB2bVBhZ2VTaXplKCkpOwogCiAgICAgaW5pdGlh
bGl6ZUxpbmVNZXRhZGF0YSgpOworICAgIGluaXRpYWxpemVQYWdlTWV0YWRhdGEoKTsKIH0KIAog
dm9pZCBIZWFwOjppbml0aWFsaXplTGluZU1ldGFkYXRhKCkKIHsKLSAgICAvLyBXZSBhc3N1bWUg
dGhhdCBtX3NtYWxsTGluZU1ldGFkYXRhIGlzIHplcm8tZmlsbGVkLgotCisgICAgc2l6ZV90IHNp
emVDbGFzc0NvdW50ID0gYm1hbGxvYzo6c2l6ZUNsYXNzKHNtYWxsTGluZVNpemUpOwogICAgIHNp
emVfdCBzbWFsbExpbmVDb3VudCA9IG1fdm1QYWdlU2l6ZVBoeXNpY2FsIC8gc21hbGxMaW5lU2l6
ZTsKICAgICBtX3NtYWxsTGluZU1ldGFkYXRhLmdyb3coc2l6ZUNsYXNzQ291bnQgKiBzbWFsbExp
bmVDb3VudCk7CiAKQEAgLTY4LDcgKzY4LDcgQEAgdm9pZCBIZWFwOjppbml0aWFsaXplTGluZU1l
dGFkYXRhKCkKICAgICAgICAgICAgIHNpemVfdCByZW1haW5kZXI7CiAgICAgICAgICAgICBkaXZp
ZGVSb3VuZGluZ1VwKHNtYWxsTGluZVNpemUgLSBsZWZ0b3Zlciwgc2l6ZSwgb2JqZWN0Q291bnQs
IHJlbWFpbmRlcik7CiAKLSAgICAgICAgICAgIHBhZ2VNZXRhZGF0YVtsaW5lXSA9IHsgc3RhdGlj
X2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KGxlZnRvdmVyKSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hv
cnQ+KG9iamVjdENvdW50KSB9OworICAgICAgICAgICAgcGFnZU1ldGFkYXRhW2xpbmVdID0geyBz
dGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihsZWZ0b3ZlciksIHN0YXRpY19jYXN0PHVuc2lnbmVk
IGNoYXI+KG9iamVjdENvdW50KSB9OwogCiAgICAgICAgICAgICBvYmplY3QgKz0gb2JqZWN0Q291
bnQgKiBzaXplOwogICAgICAgICB9CkBAIC04MSw2ICs4MSwyOSBAQCB2b2lkIEhlYXA6OmluaXRp
YWxpemVMaW5lTWV0YWRhdGEoKQogICAgIH0KIH0KIAordm9pZCBIZWFwOjppbml0aWFsaXplUGFn
ZU1ldGFkYXRhKCkKK3sKKyAgICBhdXRvIGNvbXB1dGVQYWdlU2l6ZSA9IFsmXShzaXplX3Qgc2l6
ZUNsYXNzKSB7CisgICAgICAgIHNpemVfdCBzaXplID0gb2JqZWN0U2l6ZShzaXplQ2xhc3MpOwor
ICAgICAgICBpZiAoc2l6ZUNsYXNzIDwgYm1hbGxvYzo6c2l6ZUNsYXNzKHNtYWxsTGluZVNpemUp
KQorICAgICAgICAgICAgcmV0dXJuIG1fdm1QYWdlU2l6ZVBoeXNpY2FsOworCisgICAgICAgIGZv
ciAoc2l6ZV90IHBhZ2VTaXplID0gbV92bVBhZ2VTaXplUGh5c2ljYWw7CisgICAgICAgICAgICBw
YWdlU2l6ZSA8IHBhZ2VTaXplTWF4OworICAgICAgICAgICAgcGFnZVNpemUgKz0gbV92bVBhZ2VT
aXplUGh5c2ljYWwpIHsKKyAgICAgICAgICAgIFJFTEVBU0VfQkFTU0VSVChwYWdlU2l6ZSA8PSBs
YXJnZU9iamVjdE1heCk7CisgICAgICAgICAgICBzaXplX3Qgd2FzdGUgPSBwYWdlU2l6ZSAlIHNp
emU7CisgICAgICAgICAgICBpZiAod2FzdGUgPD0gcGFnZVNpemUgLyBwYWdlU2l6ZVdhc3RlRmFj
dG9yKQorICAgICAgICAgICAgICAgIHJldHVybiBwYWdlU2l6ZTsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgcmV0dXJuIHBhZ2VTaXplTWF4OworICAgIH07CisKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNpemVDbGFzc0NvdW50OyArK2kpCisgICAgICAgIG1fcGFnZUNsYXNzZXNb
aV0gPSAoY29tcHV0ZVBhZ2VTaXplKGkpIC0gMSkgLyBzbWFsbFBhZ2VTaXplOworfQorCiB2b2lk
IEhlYXA6OmNvbmN1cnJlbnRTY2F2ZW5nZSgpCiB7CiAgICAgc3RkOjp1bmlxdWVfbG9jazxTdGF0
aWNNdXRleD4gbG9jayhQZXJQcm9jZXNzPEhlYXA+OjptdXRleCgpKTsKQEAgLTkxLDM5ICsxMTQs
MjMgQEAgdm9pZCBIZWFwOjpzY2F2ZW5nZShzdGQ6OnVuaXF1ZV9sb2NrPFN0YQogewogICAgIHdh
aXRVbnRpbEZhbHNlKGxvY2ssIHNsZWVwRHVyYXRpb24sIG1faXNBbGxvY2F0aW5nUGFnZXMpOwog
Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxTdGF0
aWNNdXRleD4gbG9jayhQZXJQcm9jZXNzPEhlYXA+OjptdXRleCgpKTsKLSAgICAgICAgc2NhdmVu
Z2VTbWFsbFBhZ2VzKGxvY2spOwotICAgIH0KLSAgICBsb2NrLmxvY2soKTsKLQorICAgIHNjYXZl
bmdlU21hbGxQYWdlcyhsb2NrLCBzbGVlcER1cmF0aW9uKTsKICAgICBzY2F2ZW5nZUxhcmdlT2Jq
ZWN0cyhsb2NrLCBzbGVlcER1cmF0aW9uKTsKICAgICBzY2F2ZW5nZVhMYXJnZU9iamVjdHMobG9j
aywgc2xlZXBEdXJhdGlvbik7CiAKICAgICBzbGVlcChsb2NrLCBzbGVlcER1cmF0aW9uKTsKIH0K
IAotdm9pZCBIZWFwOjpzY2F2ZW5nZVNtYWxsUGFnZShzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0
ZXg+JiBsb2NrKQordm9pZCBIZWFwOjpzY2F2ZW5nZVNtYWxsUGFnZXMoc3RkOjp1bmlxdWVfbG9j
azxTdGF0aWNNdXRleD4mIGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgc2xlZXBEdXJh
dGlvbikKIHsKLSAgICBTbWFsbFBhZ2UqIHBhZ2UgPSBtX3NtYWxsUGFnZXMucG9wKCk7Ci0KLSAg
ICAvLyBSZXZlcnQgdGhlIHNsaWRlKCkgdmFsdWUgb24gaW50ZXJtZWRpYXRlIFNtYWxsUGFnZXMg
c28gdGhleSBoYXNoIHRvCi0gICAgLy8gdGhlbXNlbHZlcyBhZ2Fpbi4KLSAgICBmb3IgKHNpemVf
dCBpID0gMTsgaSA8IHBhZ2UtPnNtYWxsUGFnZUNvdW50KCk7ICsraSkKLSAgICAgICAgcGFnZVtp
XS5zZXRTbGlkZSgwKTsKLQotICAgIC8vIFJldmVydCBvdXIgc21hbGwgb2JqZWN0IHBhZ2UgYmFj
ayB0byBsYXJnZSBvYmplY3QuCi0gICAgcGFnZS0+c2V0T2JqZWN0VHlwZShPYmplY3RUeXBlOjpM
YXJnZSk7Ci0KLSAgICBMYXJnZU9iamVjdCBsYXJnZU9iamVjdChwYWdlLT5iZWdpbigpLT5iZWdp
bigpKTsKLSAgICBkZWFsbG9jYXRlTGFyZ2UobG9jaywgbGFyZ2VPYmplY3QpOwotfQotCi12b2lk
IEhlYXA6OnNjYXZlbmdlU21hbGxQYWdlcyhzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBs
b2NrKQotewotICAgIHdoaWxlICghbV9zbWFsbFBhZ2VzLmlzRW1wdHkoKSkKLSAgICAgICAgc2Nh
dmVuZ2VTbWFsbFBhZ2UobG9jayk7CisgICAgZm9yIChhdXRvJiBzbWFsbFBhZ2VzIDogbV9zbWFs
bFBhZ2VzKSB7CisgICAgICAgIHdoaWxlICghc21hbGxQYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgIFNtYWxsUGFnZSogcGFnZSA9IHNtYWxsUGFnZXMucG9wKCk7CisgICAgICAgICAgICBz
aXplX3QgcGFnZUNsYXNzID0gbV9wYWdlQ2xhc3Nlc1twYWdlLT5zaXplQ2xhc3MoKV07CisgICAg
ICAgICAgICBtX3ZtSGVhcC5kZWFsbG9jYXRlU21hbGxQYWdlKGxvY2ssIHBhZ2VDbGFzcywgcGFn
ZSk7CisgICAgICAgICAgICB3YWl0VW50aWxGYWxzZShsb2NrLCBzbGVlcER1cmF0aW9uLCBtX2lz
QWxsb2NhdGluZ1BhZ2VzKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBIZWFwOjpzY2F2
ZW5nZUxhcmdlT2JqZWN0cyhzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgc3Rk
OjpjaHJvbm86Om1pbGxpc2Vjb25kcyBzbGVlcER1cmF0aW9uKQpAQCAtMTUwLDExNiArMTU3LDYg
QEAgdm9pZCBIZWFwOjpzY2F2ZW5nZVhMYXJnZU9iamVjdHMoc3RkOjp1bgogICAgIG1feExhcmdl
TWFwLnNocmlua1RvRml0KCk7CiB9CiAKLXZvaWQgSGVhcDo6YWxsb2NhdGVTbWFsbEJ1bXBSYW5n
ZXMoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYgbG9jaywgc2l6ZV90IHNpemVDbGFzcywg
QnVtcEFsbG9jYXRvciYgYWxsb2NhdG9yLCBCdW1wUmFuZ2VDYWNoZSYgcmFuZ2VDYWNoZSkKLXsK
LSAgICBCQVNTRVJUKCFyYW5nZUNhY2hlLnNpemUoKSk7Ci0gICAgU21hbGxQYWdlKiBwYWdlID0g
YWxsb2NhdGVTbWFsbFBhZ2UobG9jaywgc2l6ZUNsYXNzKTsKLSAgICBTbWFsbExpbmUqIGxpbmVz
ID0gcGFnZS0+YmVnaW4oKTsKLSAgICBCQVNTRVJUKHBhZ2UtPmhhc0ZyZWVMaW5lcyhsb2NrKSk7
Ci0gICAgc2l6ZV90IHNtYWxsTGluZUNvdW50ID0gbV92bVBhZ2VTaXplUGh5c2ljYWwgLyBzbWFs
bExpbmVTaXplOwotICAgIExpbmVNZXRhZGF0YSogcGFnZU1ldGFkYXRhID0gJm1fc21hbGxMaW5l
TWV0YWRhdGFbc2l6ZUNsYXNzICogc21hbGxMaW5lQ291bnRdOwotCi0gICAgLy8gRmluZCBhIGZy
ZWUgbGluZS4KLSAgICBmb3IgKHNpemVfdCBsaW5lTnVtYmVyID0gMDsgbGluZU51bWJlciA8IHNt
YWxsTGluZUNvdW50OyArK2xpbmVOdW1iZXIpIHsKLSAgICAgICAgaWYgKGxpbmVzW2xpbmVOdW1i
ZXJdLnJlZkNvdW50KGxvY2spKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgTGlu
ZU1ldGFkYXRhJiBsaW5lTWV0YWRhdGEgPSBwYWdlTWV0YWRhdGFbbGluZU51bWJlcl07Ci0gICAg
ICAgIGlmICghbGluZU1ldGFkYXRhLm9iamVjdENvdW50KQotICAgICAgICAgICAgY29udGludWU7
Ci0KLSAgICAgICAgLy8gSW4gYSBmcmFnbWVudGVkIHBhZ2UsIHNvbWUgZnJlZSByYW5nZXMgbWln
aHQgbm90IGZpdCBpbiB0aGUgY2FjaGUuCi0gICAgICAgIGlmIChyYW5nZUNhY2hlLnNpemUoKSA9
PSByYW5nZUNhY2hlLmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgIG1fc21hbGxQYWdlc1dpdGhG
cmVlTGluZXNbc2l6ZUNsYXNzXS5wdXNoKHBhZ2UpOwotICAgICAgICAgICAgQkFTU0VSVChhbGxv
Y2F0b3IuY2FuQWxsb2NhdGUoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
ICAgICAgICBjaGFyKiBiZWdpbiA9IGxpbmVzW2xpbmVOdW1iZXJdLmJlZ2luKCkgKyBsaW5lTWV0
YWRhdGEuc3RhcnRPZmZzZXQ7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IG9iamVjdENvdW50ID0g
bGluZU1ldGFkYXRhLm9iamVjdENvdW50OwotICAgICAgICBsaW5lc1tsaW5lTnVtYmVyXS5yZWYo
bG9jaywgbGluZU1ldGFkYXRhLm9iamVjdENvdW50KTsKLSAgICAgICAgcGFnZS0+cmVmKGxvY2sp
OwotCi0gICAgICAgIC8vIE1lcmdlIHdpdGggc3Vic2VxdWVudCBmcmVlIGxpbmVzLgotICAgICAg
ICB3aGlsZSAoKytsaW5lTnVtYmVyIDwgc21hbGxMaW5lQ291bnQpIHsKLSAgICAgICAgICAgIGlm
IChsaW5lc1tsaW5lTnVtYmVyXS5yZWZDb3VudChsb2NrKSkKLSAgICAgICAgICAgICAgICBicmVh
azsKLQotICAgICAgICAgICAgTGluZU1ldGFkYXRhJiBsaW5lTWV0YWRhdGEgPSBwYWdlTWV0YWRh
dGFbbGluZU51bWJlcl07Ci0gICAgICAgICAgICBpZiAoIWxpbmVNZXRhZGF0YS5vYmplY3RDb3Vu
dCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgb2JqZWN0Q291bnQg
Kz0gbGluZU1ldGFkYXRhLm9iamVjdENvdW50OwotICAgICAgICAgICAgbGluZXNbbGluZU51bWJl
cl0ucmVmKGxvY2ssIGxpbmVNZXRhZGF0YS5vYmplY3RDb3VudCk7Ci0gICAgICAgICAgICBwYWdl
LT5yZWYobG9jayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFsbG9jYXRvci5jYW5BbGxv
Y2F0ZSgpKQotICAgICAgICAgICAgYWxsb2NhdG9yLnJlZmlsbCh7IGJlZ2luLCBvYmplY3RDb3Vu
dCB9KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmFuZ2VDYWNoZS5wdXNoKHsgYmVnaW4s
IG9iamVjdENvdW50IH0pOwotICAgIH0KLQotICAgIEJBU1NFUlQoYWxsb2NhdG9yLmNhbkFsbG9j
YXRlKCkpOwotICAgIHBhZ2UtPnNldEhhc0ZyZWVMaW5lcyhsb2NrLCBmYWxzZSk7Ci19Ci0KLVNt
YWxsUGFnZSogSGVhcDo6YWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011
dGV4PiYgbG9jaywgc2l6ZV90IHNpemVDbGFzcykKLXsKLSAgICBpZiAoIW1fc21hbGxQYWdlc1dp
dGhGcmVlTGluZXNbc2l6ZUNsYXNzXS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBtX3NtYWxs
UGFnZXNXaXRoRnJlZUxpbmVzW3NpemVDbGFzc10ucG9wRnJvbnQoKTsKLSAgICAKLSAgICBpZiAo
IW1fc21hbGxQYWdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgU21hbGxQYWdlKiBwYWdlID0gbV9z
bWFsbFBhZ2VzLnBvcCgpOwotICAgICAgICBwYWdlLT5zZXRTaXplQ2xhc3Moc2l6ZUNsYXNzKTsK
LSAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IHVuYWxpZ25lZFNpemUg
PSBsYXJnZU1pbiArIG1fdm1QYWdlU2l6ZVBoeXNpY2FsIC0gbGFyZ2VBbGlnbm1lbnQgKyBtX3Zt
UGFnZVNpemVQaHlzaWNhbDsKLSAgICBMYXJnZU9iamVjdCBsYXJnZU9iamVjdCA9IGFsbG9jYXRl
TGFyZ2UobG9jaywgbV92bVBhZ2VTaXplUGh5c2ljYWwsIG1fdm1QYWdlU2l6ZVBoeXNpY2FsLCB1
bmFsaWduZWRTaXplKTsKLSAgICAKLSAgICAvLyBUcmFuc2Zvcm0gb3VyIGxhcmdlIG9iamVjdCBp
bnRvIGEgc21hbGwgb2JqZWN0IHBhZ2UuIFdlIGRlcmVmIGhlcmUKLSAgICAvLyBiZWNhdXNlIG91
ciBzbWFsbCBvYmplY3RzIHdpbGwga2VlcCB0aGVpciBvd24gbGluZSByZWZjb3VudHMuCi0gICAg
T2JqZWN0IG9iamVjdChsYXJnZU9iamVjdC5iZWdpbigpKTsKLSAgICBvYmplY3QubGluZSgpLT5k
ZXJlZihsb2NrKTsKLSAgICBvYmplY3QucGFnZSgpLT5zZXRPYmplY3RUeXBlKE9iamVjdFR5cGU6
OlNtYWxsKTsKLQotICAgIFNtYWxsUGFnZSogcGFnZSA9IG9iamVjdC5wYWdlKCk7Ci0gICAgcGFn
ZS0+c2V0U2l6ZUNsYXNzKHNpemVDbGFzcyk7Ci0gICAgcGFnZS0+c2V0U21hbGxQYWdlQ291bnQo
bV92bVBhZ2VTaXplUGh5c2ljYWwgLyBzbWFsbFBhZ2VTaXplKTsKLQotICAgIC8vIFNldCBhIHNs
aWRlKCkgdmFsdWUgb24gaW50ZXJtZWRpYXRlIFNtYWxsUGFnZXMgc28gdGhleSBoYXNoIHRvIHRo
ZWlyCi0gICAgLy8gdm1QYWdlU2l6ZVBoeXNpY2FsLXNpemVkIHBhZ2UuCi0gICAgZm9yIChzaXpl
X3QgaSA9IDE7IGkgPCBwYWdlLT5zbWFsbFBhZ2VDb3VudCgpOyArK2kpCi0gICAgICAgIHBhZ2Vb
aV0uc2V0U2xpZGUoaSk7Ci0KLSAgICByZXR1cm4gb2JqZWN0LnBhZ2UoKTsKLX0KLQotdm9pZCBI
ZWFwOjpkZWFsbG9jYXRlU21hbGxMaW5lKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mIGxv
Y2ssIE9iamVjdCBvYmplY3QpCi17Ci0gICAgQkFTU0VSVCghb2JqZWN0LmxpbmUoKS0+cmVmQ291
bnQobG9jaykpOwotICAgIFNtYWxsUGFnZSogcGFnZSA9IG9iamVjdC5wYWdlKCk7Ci0gICAgaWYg
KHBhZ2UtPm9iamVjdFR5cGUoKSA9PSBPYmplY3RUeXBlOjpMYXJnZSkKLSAgICAgICAgcmV0dXJu
IGRlYWxsb2NhdGVMYXJnZShsb2NrLCBMYXJnZU9iamVjdChvYmplY3QuYmVnaW4oKSkpOwotCi0g
ICAgcGFnZS0+ZGVyZWYobG9jayk7Ci0gICAgaWYgKCFwYWdlLT5oYXNGcmVlTGluZXMobG9jaykp
IHsKLSAgICAgICAgcGFnZS0+c2V0SGFzRnJlZUxpbmVzKGxvY2ssIHRydWUpOwotICAgICAgICBt
X3NtYWxsUGFnZXNXaXRoRnJlZUxpbmVzW3BhZ2UtPnNpemVDbGFzcygpXS5wdXNoKHBhZ2UpOwot
Ci0gICAgICAgIEJBU1NFUlQocGFnZS0+cmVmQ291bnQobG9jaykpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgaWYgKHBhZ2UtPnJlZkNvdW50KGxvY2spKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBtX3NtYWxsUGFnZXNXaXRoRnJlZUxpbmVzW3BhZ2UtPnNpemVDbGFzcygpXS5yZW1v
dmUocGFnZSk7Ci0gICAgbV9zbWFsbFBhZ2VzLnB1c2gocGFnZSk7Ci0gICAgbV9zY2F2ZW5nZXIu
cnVuKCk7Ci19Ci0KIGlubGluZSBMYXJnZU9iamVjdCYgSGVhcDo6c3BsaXRBbmRBbGxvY2F0ZShz
dGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBsb2NrLCBMYXJnZU9iamVjdCYgbGFyZ2VPYmpl
Y3QsIHNpemVfdCBzaXplKQogewogICAgIEJBU1NFUlQobGFyZ2VPYmplY3QuaXNGcmVlKCkpOwpA
QCAtMjc1LDcgKzE3Miw3IEBAIGlubGluZSBMYXJnZU9iamVjdCYgSGVhcDo6c3BsaXRBbmRBbGxv
Y2EKICAgICBsYXJnZU9iamVjdC5zZXRGcmVlKGZhbHNlKTsKICAgICBPYmplY3Qgb2JqZWN0KGxh
cmdlT2JqZWN0LmJlZ2luKCkpOwogICAgIG9iamVjdC5saW5lKCktPnJlZihsb2NrKTsKLSAgICBC
QVNTRVJUKG9iamVjdC5wYWdlKCktPm9iamVjdFR5cGUoKSA9PSBPYmplY3RUeXBlOjpMYXJnZSk7
CisgICAgQkFTU0VSVChvYmplY3QuY2h1bmsoKS0+b2JqZWN0VHlwZSgpID09IE9iamVjdFR5cGU6
OkxhcmdlKTsKIAogICAgIGlmIChuZXh0TGFyZ2VPYmplY3QpIHsKICAgICAgICAgQkFTU0VSVCgh
bmV4dExhcmdlT2JqZWN0Lm5leHRDYW5NZXJnZSgpKTsKQEAgLTMwOSw3ICsyMDYsNyBAQCBpbmxp
bmUgTGFyZ2VPYmplY3QmIEhlYXA6OnNwbGl0QW5kQWxsb2NhCiAgICAgbGFyZ2VPYmplY3Quc2V0
RnJlZShmYWxzZSk7CiAgICAgT2JqZWN0IG9iamVjdChsYXJnZU9iamVjdC5iZWdpbigpKTsKICAg
ICBvYmplY3QubGluZSgpLT5yZWYobG9jayk7Ci0gICAgQkFTU0VSVChvYmplY3QucGFnZSgpLT5v
YmplY3RUeXBlKCkgPT0gT2JqZWN0VHlwZTo6TGFyZ2UpOworICAgIEJBU1NFUlQob2JqZWN0LmNo
dW5rKCktPm9iamVjdFR5cGUoKSA9PSBPYmplY3RUeXBlOjpMYXJnZSk7CiAKICAgICBpZiAocHJl
dkxhcmdlT2JqZWN0KSB7CiAgICAgICAgIExhcmdlT2JqZWN0IG1lcmdlZCA9IHByZXZMYXJnZU9i
amVjdC5tZXJnZSgpOwpAQCAtMzMwLDkgKzIyNyw2IEBAIHZvaWQqIEhlYXA6OmFsbG9jYXRlTGFy
Z2Uoc3RkOjpsb2NrX2d1YXIKICAgICBCQVNTRVJUKHNpemUgPj0gbGFyZ2VNaW4pOwogICAgIEJB
U1NFUlQoc2l6ZSA9PSByb3VuZFVwVG9NdWx0aXBsZU9mPGxhcmdlQWxpZ25tZW50PihzaXplKSk7
CiAgICAgCi0gICAgaWYgKHNpemUgPD0gbV92bVBhZ2VTaXplUGh5c2ljYWwpCi0gICAgICAgIHNj
YXZlbmdlU21hbGxQYWdlcyhsb2NrKTsKLQogICAgIExhcmdlT2JqZWN0IGxhcmdlT2JqZWN0ID0g
bV9sYXJnZU9iamVjdHMudGFrZShzaXplKTsKICAgICBpZiAoIWxhcmdlT2JqZWN0KQogICAgICAg
ICBsYXJnZU9iamVjdCA9IG1fdm1IZWFwLmFsbG9jYXRlTGFyZ2VPYmplY3QobG9jaywgc2l6ZSk7
CkBAIC0zNjEsOSArMjU1LDYgQEAgdm9pZCogSGVhcDo6YWxsb2NhdGVMYXJnZShzdGQ6OmxvY2tf
Z3VhcgogICAgIEJBU1NFUlQoYWxpZ25tZW50ID49IGxhcmdlQWxpZ25tZW50KTsKICAgICBCQVNT
RVJUKGlzUG93ZXJPZlR3byhhbGlnbm1lbnQpKTsKIAotICAgIGlmIChzaXplIDw9IG1fdm1QYWdl
U2l6ZVBoeXNpY2FsKQotICAgICAgICBzY2F2ZW5nZVNtYWxsUGFnZXMobG9jayk7Ci0KICAgICBM
YXJnZU9iamVjdCBsYXJnZU9iamVjdCA9IG1fbGFyZ2VPYmplY3RzLnRha2UoYWxpZ25tZW50LCBz
aXplLCB1bmFsaWduZWRTaXplKTsKICAgICBpZiAoIWxhcmdlT2JqZWN0KQogICAgICAgICBsYXJn
ZU9iamVjdCA9IG1fdm1IZWFwLmFsbG9jYXRlTGFyZ2VPYmplY3QobG9jaywgYWxpZ25tZW50LCBz
aXplLCB1bmFsaWduZWRTaXplKTsKQEAgLTM4OSw3ICsyODAsNyBAQCB2b2lkIEhlYXA6OnNocmlu
a0xhcmdlKHN0ZDo6bG9ja19ndWFyZDxTCiB2b2lkIEhlYXA6OmRlYWxsb2NhdGVMYXJnZShzdGQ6
OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiwgY29uc3QgTGFyZ2VPYmplY3QmIGxhcmdlT2JqZWN0
KQogewogICAgIEJBU1NFUlQoIWxhcmdlT2JqZWN0LmlzRnJlZSgpKTsKLSAgICBCQVNTRVJUKE9i
amVjdChsYXJnZU9iamVjdC5iZWdpbigpKS5wYWdlKCktPm9iamVjdFR5cGUoKSA9PSBPYmplY3RU
eXBlOjpMYXJnZSk7CisgICAgQkFTU0VSVChPYmplY3QobGFyZ2VPYmplY3QuYmVnaW4oKSkuY2h1
bmsoKS0+b2JqZWN0VHlwZSgpID09IE9iamVjdFR5cGU6OkxhcmdlKTsKICAgICBsYXJnZU9iamVj
dC5zZXRGcmVlKHRydWUpOwogICAgIAogICAgIExhcmdlT2JqZWN0IG1lcmdlZCA9IGxhcmdlT2Jq
ZWN0Lm1lcmdlKCk7CkBAIC0zOTcsNiArMjg4LDE2NCBAQCB2b2lkIEhlYXA6OmRlYWxsb2NhdGVM
YXJnZShzdGQ6OmxvY2tfZ3VhCiAgICAgbV9zY2F2ZW5nZXIucnVuKCk7CiB9CiAKK1NtYWxsUGFn
ZSogSGVhcDo6YWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYg
bG9jaywgc2l6ZV90IHNpemVDbGFzcykKK3sKKyAgICBpZiAoIW1fc21hbGxQYWdlc1dpdGhGcmVl
TGluZXNbc2l6ZUNsYXNzXS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBtX3NtYWxsUGFnZXNX
aXRoRnJlZUxpbmVzW3NpemVDbGFzc10ucG9wRnJvbnQoKTsKKworICAgIFNtYWxsUGFnZSogcGFn
ZSA9IFsmXSgpIHsKKyAgICAgICAgc2l6ZV90IHBhZ2VDbGFzcyA9IG1fcGFnZUNsYXNzZXNbc2l6
ZUNsYXNzXTsKKyAgICAgICAgaWYgKCFtX3NtYWxsUGFnZXNbcGFnZUNsYXNzXS5pc0VtcHR5KCkp
CisgICAgICAgICAgICByZXR1cm4gbV9zbWFsbFBhZ2VzW3BhZ2VDbGFzc10ucG9wKCk7CisKKyAg
ICAgICAgbV9pc0FsbG9jYXRpbmdQYWdlcyA9IHRydWU7CisgICAgICAgIHJldHVybiBtX3ZtSGVh
cC5hbGxvY2F0ZVNtYWxsUGFnZShsb2NrLCBwYWdlQ2xhc3MpOworICAgIH0oKTsKKworICAgIHBh
Z2UtPnNldFNpemVDbGFzcyhzaXplQ2xhc3MpOworICAgIHJldHVybiBwYWdlOworfQorCit2b2lk
IEhlYXA6OmRlYWxsb2NhdGVTbWFsbExpbmUoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYg
bG9jaywgT2JqZWN0IG9iamVjdCkKK3sKKyAgICBCQVNTRVJUKCFvYmplY3QubGluZSgpLT5yZWZD
b3VudChsb2NrKSk7CisgICAgU21hbGxQYWdlKiBwYWdlID0gb2JqZWN0LnBhZ2UoKTsKKyAgICBp
ZiAob2JqZWN0LmNodW5rKCktPm9iamVjdFR5cGUoKSA9PSBPYmplY3RUeXBlOjpMYXJnZSkKKyAg
ICAgICAgcmV0dXJuIGRlYWxsb2NhdGVMYXJnZShsb2NrLCBMYXJnZU9iamVjdChvYmplY3QuYmVn
aW4oKSkpOworCisgICAgcGFnZS0+ZGVyZWYobG9jayk7CisgICAgaWYgKCFwYWdlLT5oYXNGcmVl
TGluZXMobG9jaykpIHsKKyAgICAgICAgcGFnZS0+c2V0SGFzRnJlZUxpbmVzKGxvY2ssIHRydWUp
OworICAgICAgICBtX3NtYWxsUGFnZXNXaXRoRnJlZUxpbmVzW3BhZ2UtPnNpemVDbGFzcygpXS5w
dXNoKHBhZ2UpOworICAgIH0KKworICAgIGlmIChwYWdlLT5yZWZDb3VudChsb2NrKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgc2l6ZV90IHNpemVDbGFzcyA9IHBhZ2UtPnNpemVDbGFzcygpOwor
ICAgIHNpemVfdCBwYWdlQ2xhc3MgPSBtX3BhZ2VDbGFzc2VzW3NpemVDbGFzc107CisKKyAgICBt
X3NtYWxsUGFnZXNXaXRoRnJlZUxpbmVzW3NpemVDbGFzc10ucmVtb3ZlKHBhZ2UpOworICAgIG1f
c21hbGxQYWdlc1twYWdlQ2xhc3NdLnB1c2gocGFnZSk7CisKKyAgICBtX3NjYXZlbmdlci5ydW4o
KTsKK30KKwordm9pZCBIZWFwOjphbGxvY2F0ZVNtYWxsQnVtcFJhbmdlc0J5TWV0YWRhdGEoCisg
ICAgc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYgbG9jaywgc2l6ZV90IHNpemVDbGFzcywK
KyAgICBCdW1wQWxsb2NhdG9yJiBhbGxvY2F0b3IsIEJ1bXBSYW5nZUNhY2hlJiByYW5nZUNhY2hl
KQoreworICAgIFNtYWxsUGFnZSogcGFnZSA9IGFsbG9jYXRlU21hbGxQYWdlKGxvY2ssIHNpemVD
bGFzcyk7CisgICAgU21hbGxMaW5lKiBsaW5lcyA9IHBhZ2UtPmJlZ2luKCk7CisgICAgQkFTU0VS
VChwYWdlLT5oYXNGcmVlTGluZXMobG9jaykpOworICAgIHNpemVfdCBzbWFsbExpbmVDb3VudCA9
IG1fdm1QYWdlU2l6ZVBoeXNpY2FsIC8gc21hbGxMaW5lU2l6ZTsKKyAgICBMaW5lTWV0YWRhdGEq
IHBhZ2VNZXRhZGF0YSA9ICZtX3NtYWxsTGluZU1ldGFkYXRhW3NpemVDbGFzcyAqIHNtYWxsTGlu
ZUNvdW50XTsKKyAgICAKKyAgICBhdXRvIGZpbmRTbWFsbEJ1bXBSYW5nZSA9IFsmXShzaXplX3Qm
IGxpbmVOdW1iZXIpIHsKKyAgICAgICAgZm9yICggOyBsaW5lTnVtYmVyIDwgc21hbGxMaW5lQ291
bnQ7ICsrbGluZU51bWJlcikgeworICAgICAgICAgICAgaWYgKCFsaW5lc1tsaW5lTnVtYmVyXS5y
ZWZDb3VudChsb2NrKSkgeworICAgICAgICAgICAgICAgIGlmIChwYWdlTWV0YWRhdGFbbGluZU51
bWJlcl0ub2JqZWN0Q291bnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworCisg
ICAgYXV0byBhbGxvY2F0ZVNtYWxsQnVtcFJhbmdlID0gWyZdKHNpemVfdCYgbGluZU51bWJlcikg
LT4gQnVtcFJhbmdlIHsKKyAgICAgICAgY2hhciogYmVnaW4gPSBsaW5lc1tsaW5lTnVtYmVyXS5i
ZWdpbigpICsgcGFnZU1ldGFkYXRhW2xpbmVOdW1iZXJdLnN0YXJ0T2Zmc2V0OworICAgICAgICB1
bnNpZ25lZCBzaG9ydCBvYmplY3RDb3VudCA9IDA7CisgICAgICAgIAorICAgICAgICBmb3IgKCA7
IGxpbmVOdW1iZXIgPCBzbWFsbExpbmVDb3VudDsgKytsaW5lTnVtYmVyKSB7CisgICAgICAgICAg
ICBpZiAobGluZXNbbGluZU51bWJlcl0ucmVmQ291bnQobG9jaykpCisgICAgICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgICAgIGlmICghcGFnZU1ldGFkYXRhW2xpbmVOdW1iZXJdLm9iamVj
dENvdW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBvYmplY3RD
b3VudCArPSBwYWdlTWV0YWRhdGFbbGluZU51bWJlcl0ub2JqZWN0Q291bnQ7CisgICAgICAgICAg
ICBsaW5lc1tsaW5lTnVtYmVyXS5yZWYobG9jaywgcGFnZU1ldGFkYXRhW2xpbmVOdW1iZXJdLm9i
amVjdENvdW50KTsKKyAgICAgICAgICAgIHBhZ2UtPnJlZihsb2NrKTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4geyBiZWdpbiwgb2JqZWN0Q291bnQgfTsKKyAgICB9OworCisgICAgc2l6ZV90
IGxpbmVOdW1iZXIgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCFmaW5kU21hbGxC
dW1wUmFuZ2UobGluZU51bWJlcikpIHsKKyAgICAgICAgICAgIHBhZ2UtPnNldEhhc0ZyZWVMaW5l
cyhsb2NrLCBmYWxzZSk7CisgICAgICAgICAgICBCQVNTRVJUKGFsbG9jYXRvci5jYW5BbGxvY2F0
ZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluIGEg
ZnJhZ21lbnRlZCBwYWdlLCBzb21lIGZyZWUgcmFuZ2VzIG1pZ2h0IG5vdCBmaXQgaW4gdGhlIGNh
Y2hlLgorICAgICAgICBpZiAocmFuZ2VDYWNoZS5zaXplKCkgPT0gcmFuZ2VDYWNoZS5jYXBhY2l0
eSgpKSB7CisgICAgICAgICAgICBtX3NtYWxsUGFnZXNXaXRoRnJlZUxpbmVzW3NpemVDbGFzc10u
cHVzaChwYWdlKTsKKyAgICAgICAgICAgIEJBU1NFUlQoYWxsb2NhdG9yLmNhbkFsbG9jYXRlKCkp
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQnVtcFJhbmdlIGJ1
bXBSYW5nZSA9IGFsbG9jYXRlU21hbGxCdW1wUmFuZ2UobGluZU51bWJlcik7CisgICAgICAgIGlm
IChhbGxvY2F0b3IuY2FuQWxsb2NhdGUoKSkKKyAgICAgICAgICAgIHJhbmdlQ2FjaGUucHVzaChi
dW1wUmFuZ2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhbGxvY2F0b3IucmVmaWxsKGJ1
bXBSYW5nZSk7CisgICAgfQorfQorCit2b2lkIEhlYXA6OmFsbG9jYXRlU21hbGxCdW1wUmFuZ2Vz
QnlPYmplY3QoCisgICAgc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYgbG9jaywgc2l6ZV90
IHNpemVDbGFzcywKKyAgICBCdW1wQWxsb2NhdG9yJiBhbGxvY2F0b3IsIEJ1bXBSYW5nZUNhY2hl
JiByYW5nZUNhY2hlKQoreworICAgIHNpemVfdCBzaXplID0gYWxsb2NhdG9yLnNpemUoKTsKKyAg
ICBTbWFsbFBhZ2UqIHBhZ2UgPSBhbGxvY2F0ZVNtYWxsUGFnZShsb2NrLCBzaXplQ2xhc3MpOwor
ICAgIEJBU1NFUlQocGFnZS0+aGFzRnJlZUxpbmVzKGxvY2spKTsKKworICAgIGF1dG8gZmluZFNt
YWxsQnVtcFJhbmdlID0gWyZdKE9iamVjdCYgaXQsIE9iamVjdCYgZW5kKSB7CisgICAgICAgIGZv
ciAoIDsgaXQgKyBzaXplIDw9IGVuZDsgaXQgPSBpdCArIHNpemUpIHsKKyAgICAgICAgICAgIGlm
ICghaXQubGluZSgpLT5yZWZDb3VudChsb2NrKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKworICAgIGF1dG8g
YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZSA9IFsmXShPYmplY3QmIGl0LCBPYmplY3QmIGVuZCkgLT4g
QnVtcFJhbmdlIHsKKyAgICAgICAgY2hhciogYmVnaW4gPSBpdC5iZWdpbigpOworICAgICAgICB1
bnNpZ25lZCBzaG9ydCBvYmplY3RDb3VudCA9IDA7CisgICAgICAgIGZvciAoIDsgaXQgKyBzaXpl
IDw9IGVuZDsgaXQgPSBpdCArIHNpemUpIHsKKyAgICAgICAgICAgIGlmIChpdC5saW5lKCktPnJl
ZkNvdW50KGxvY2spKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICArK29i
amVjdENvdW50OworICAgICAgICAgICAgaXQubGluZSgpLT5yZWYobG9jayk7CisgICAgICAgICAg
ICBpdC5wYWdlKCktPnJlZihsb2NrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geyBiZWdp
biwgb2JqZWN0Q291bnQgfTsKKyAgICB9OworCisgICAgT2JqZWN0IGl0KHBhZ2UtPmJlZ2luKCkt
PmJlZ2luKCkpOworICAgIE9iamVjdCBlbmQoaXQgKyBwYWdlU2l6ZShtX3BhZ2VDbGFzc2VzW3Np
emVDbGFzc10pKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICghZmluZFNtYWxsQnVtcFJh
bmdlKGl0LCBlbmQpKSB7CisgICAgICAgICAgICBwYWdlLT5zZXRIYXNGcmVlTGluZXMobG9jaywg
ZmFsc2UpOworICAgICAgICAgICAgQkFTU0VSVChhbGxvY2F0b3IuY2FuQWxsb2NhdGUoKSk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBJbiBhIGZyYWdtZW50
ZWQgcGFnZSwgc29tZSBmcmVlIHJhbmdlcyBtaWdodCBub3QgZml0IGluIHRoZSBjYWNoZS4KKyAg
ICAgICAgaWYgKHJhbmdlQ2FjaGUuc2l6ZSgpID09IHJhbmdlQ2FjaGUuY2FwYWNpdHkoKSkgewor
ICAgICAgICAgICAgbV9zbWFsbFBhZ2VzV2l0aEZyZWVMaW5lc1tzaXplQ2xhc3NdLnB1c2gocGFn
ZSk7CisgICAgICAgICAgICBCQVNTRVJUKGFsbG9jYXRvci5jYW5BbGxvY2F0ZSgpKTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJ1bXBSYW5nZSBidW1wUmFuZ2Ug
PSBhbGxvY2F0ZVNtYWxsQnVtcFJhbmdlKGl0LCBlbmQpOworICAgICAgICBpZiAoYWxsb2NhdG9y
LmNhbkFsbG9jYXRlKCkpCisgICAgICAgICAgICByYW5nZUNhY2hlLnB1c2goYnVtcFJhbmdlKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWxsb2NhdG9yLnJlZmlsbChidW1wUmFuZ2UpOwor
ICAgIH0KK30KKwogdm9pZCogSGVhcDo6YWxsb2NhdGVYTGFyZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0
YXRpY011dGV4PiYgbG9jaywgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNpemUpCiB7CiAgICAg
dm9pZCogcmVzdWx0ID0gdHJ5QWxsb2NhdGVYTGFyZ2UobG9jaywgYWxpZ25tZW50LCBzaXplKTsK
SW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5oCShyZXZpc2lvbiAxOTg5OTQpCisrKyBTb3VyY2UvYm1h
bGxvYy9ibWFsbG9jL0hlYXAuaAkod29ya2luZyBjb3B5KQpAQCAtNzMsNiArNzMsMTIgQEAgcHJp
dmF0ZToKICAgICB+SGVhcCgpID0gZGVsZXRlOwogICAgIAogICAgIHZvaWQgaW5pdGlhbGl6ZUxp
bmVNZXRhZGF0YSgpOworICAgIHZvaWQgaW5pdGlhbGl6ZVBhZ2VNZXRhZGF0YSgpOworCisgICAg
dm9pZCBhbGxvY2F0ZVNtYWxsQnVtcFJhbmdlc0J5TWV0YWRhdGEoc3RkOjpsb2NrX2d1YXJkPFN0
YXRpY011dGV4PiYsCisgICAgICAgIHNpemVfdCBzaXplQ2xhc3MsIEJ1bXBBbGxvY2F0b3ImLCBC
dW1wUmFuZ2VDYWNoZSYpOworICAgIHZvaWQgYWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU9iamVj
dChzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiwKKyAgICAgICAgc2l6ZV90IHNpemVDbGFz
cywgQnVtcEFsbG9jYXRvciYsIEJ1bXBSYW5nZUNhY2hlJik7CiAKICAgICBTbWFsbFBhZ2UqIGFs
bG9jYXRlU21hbGxQYWdlKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBzaXplX3Qgc2l6
ZUNsYXNzKTsKIApAQCAtODgsMTggKzk0LDE2IEBAIHByaXZhdGU6CiAgICAgWExhcmdlUmFuZ2Ug
c3BsaXRBbmRBbGxvY2F0ZShYTGFyZ2VSYW5nZSYsIHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCk7
CiAKICAgICB2b2lkIGNvbmN1cnJlbnRTY2F2ZW5nZSgpOwotICAgIHZvaWQgc2NhdmVuZ2VTbWFs
bFBhZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYpOwotICAgIHZvaWQgc2NhdmVuZ2VT
bWFsbFBhZ2VzKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mKTsKKyAgICB2b2lkIHNjYXZl
bmdlU21hbGxQYWdlcyhzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYsIHN0ZDo6Y2hyb25v
OjptaWxsaXNlY29uZHMpOwogICAgIHZvaWQgc2NhdmVuZ2VMYXJnZU9iamVjdHMoc3RkOjp1bmlx
dWVfbG9jazxTdGF0aWNNdXRleD4mLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKTsKICAgICB2
b2lkIHNjYXZlbmdlWExhcmdlT2JqZWN0cyhzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYs
IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMpOwogCiAgICAgc2l6ZV90IG1fdm1QYWdlU2l6ZVBo
eXNpY2FsOwotCiAgICAgVmVjdG9yPExpbmVNZXRhZGF0YT4gbV9zbWFsbExpbmVNZXRhZGF0YTsK
KyAgICBzdGQ6OmFycmF5PHNpemVfdCwgc2l6ZUNsYXNzQ291bnQ+IG1fcGFnZUNsYXNzZXM7CiAK
ICAgICBzdGQ6OmFycmF5PExpc3Q8U21hbGxQYWdlPiwgc2l6ZUNsYXNzQ291bnQ+IG1fc21hbGxQ
YWdlc1dpdGhGcmVlTGluZXM7Ci0KLSAgICBMaXN0PFNtYWxsUGFnZT4gbV9zbWFsbFBhZ2VzOwor
ICAgIHN0ZDo6YXJyYXk8TGlzdDxTbWFsbFBhZ2U+LCBwYWdlQ2xhc3NDb3VudD4gbV9zbWFsbFBh
Z2VzOwogCiAgICAgU2VncmVnYXRlZEZyZWVMaXN0IG1fbGFyZ2VPYmplY3RzOwogICAgIApAQCAt
MTEzLDYgKzExNywxNSBAQCBwcml2YXRlOgogICAgIFZNSGVhcCBtX3ZtSGVhcDsKIH07CiAKK2lu
bGluZSB2b2lkIEhlYXA6OmFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzKAorICAgIHN0ZDo6bG9ja19n
dWFyZDxTdGF0aWNNdXRleD4mIGxvY2ssIHNpemVfdCBzaXplQ2xhc3MsCisgICAgQnVtcEFsbG9j
YXRvciYgYWxsb2NhdG9yLCBCdW1wUmFuZ2VDYWNoZSYgcmFuZ2VDYWNoZSkKK3sKKyAgICBpZiAo
c2l6ZUNsYXNzIDwgYm1hbGxvYzo6c2l6ZUNsYXNzKHNtYWxsTGluZVNpemUpKQorICAgICAgICBy
ZXR1cm4gYWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU1ldGFkYXRhKGxvY2ssIHNpemVDbGFzcywg
YWxsb2NhdG9yLCByYW5nZUNhY2hlKTsKKyAgICByZXR1cm4gYWxsb2NhdGVTbWFsbEJ1bXBSYW5n
ZXNCeU9iamVjdChsb2NrLCBzaXplQ2xhc3MsIGFsbG9jYXRvciwgcmFuZ2VDYWNoZSk7Cit9CisK
IGlubGluZSB2b2lkIEhlYXA6OmRlcmVmU21hbGxMaW5lKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNN
dXRleD4mIGxvY2ssIE9iamVjdCBvYmplY3QpCiB7CiAgICAgaWYgKCFvYmplY3QubGluZSgpLT5k
ZXJlZihsb2NrKSkKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvTGluZU1ldGFkYXRhLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9MaW5lTWV0YWRhdGEuaAkocmV2
aXNpb24gMTk4OTk0KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9MaW5lTWV0YWRhdGEuaAko
d29ya2luZyBjb3B5KQpAQCAtMjksMTAgKzI5LDE4IEBACiBuYW1lc3BhY2UgYm1hbGxvYyB7CiAK
IHN0cnVjdCBMaW5lTWV0YWRhdGEgewotICAgIHVuc2lnbmVkIHNob3J0IHN0YXJ0T2Zmc2V0Owot
ICAgIHVuc2lnbmVkIHNob3J0IG9iamVjdENvdW50OworICAgIHVuc2lnbmVkIGNoYXIgc3RhcnRP
ZmZzZXQ7CisgICAgdW5zaWduZWQgY2hhciBvYmplY3RDb3VudDsKIH07CiAKK3N0YXRpY19hc3Nl
cnQoCisgICAgc21hbGxMaW5lU2l6ZSAtIGFsaWdubWVudCA8PSBzdGQ6Om51bWVyaWNfbGltaXRz
PHVuc2lnbmVkIGNoYXI+OjptYXgoKSwKKyAgICAibWF4aW11bSBvYmplY3Qgb2Zmc2V0IG11c3Qg
Zml0IGluIExpbmVNZXRhZGF0YTo6c3RhcnRPZmZzZXQiKTsKKworc3RhdGljX2Fzc2VydCgKKyAg
ICBzbWFsbExpbmVTaXplIC8gYWxpZ25tZW50IDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWdu
ZWQgY2hhcj46Om1heCgpLAorICAgICJtYXhpbXVtIG9iamVjdCBjb3VudCBtdXN0IGZpdCBpbiBM
aW5lTWV0YWRhdGE6Om9iamVjdENvdW50Iik7CisKIH0gLy8gbmFtZXNwYWNlIGJtYWxsb2MKIAog
I2VuZGlmIC8vIExpbmVNZXRhZGF0YV9oCkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0xp
c3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0xpc3QuaAkocmV2aXNp
b24gMTk4OTk0KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9MaXN0LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTg4LDYgKzg4LDkgQEAgcHVibGljOgogCiAgICAgICAgIG5leHQtPnByZXYgPSBwcmV2
OwogICAgICAgICBwcmV2LT5uZXh0ID0gbmV4dDsKKyAgICAgICAgCisgICAgICAgIG5vZGUtPnBy
ZXYgPSBub2RlOworICAgICAgICBub2RlLT5uZXh0ID0gbm9kZTsKICAgICB9CiAKIHByaXZhdGU6
CkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL09iamVjdC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9ibWFsbG9jL2JtYWxsb2MvT2JqZWN0LmgJKHJldmlzaW9uIDE5ODk5NCkKKysrIFNvdXJj
ZS9ibWFsbG9jL2JtYWxsb2MvT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDE5ICszNiwz
OCBAQCBjbGFzcyBPYmplY3QgewogcHVibGljOgogICAgIE9iamVjdCh2b2lkKik7CiAgICAgT2Jq
ZWN0KENodW5rKiwgdm9pZCopOworICAgIE9iamVjdChDaHVuayogY2h1bmssIHNpemVfdCBvZmZz
ZXQpCisgICAgICAgIDogbV9jaHVuayhjaHVuaykKKyAgICAgICAgLCBtX29mZnNldChvZmZzZXQp
CisgICAgeworICAgIH0KICAgICAKICAgICBDaHVuayogY2h1bmsoKSB7IHJldHVybiBtX2NodW5r
OyB9Ci0gICAgdm9pZCogYmVnaW4oKTsKLSAgICB2b2lkKiBwYWdlQmVnaW4oKTsKKyAgICBzaXpl
X3Qgb2Zmc2V0KCkgeyByZXR1cm4gbV9vZmZzZXQ7IH0KKyAgICBjaGFyKiBiZWdpbigpOwogCiAg
ICAgU21hbGxMaW5lKiBsaW5lKCk7CiAgICAgU21hbGxQYWdlKiBwYWdlKCk7CisgICAgCisgICAg
T2JqZWN0IG9wZXJhdG9yKyhzaXplX3QpOworICAgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBPYmpl
Y3QmKTsKIAogcHJpdmF0ZToKICAgICBDaHVuayogbV9jaHVuazsKICAgICBzaXplX3QgbV9vZmZz
ZXQ7CiB9OwogCitpbmxpbmUgT2JqZWN0IE9iamVjdDo6b3BlcmF0b3IrKHNpemVfdCBvZmZzZXQp
Cit7CisgICAgcmV0dXJuIE9iamVjdChtX2NodW5rLCBtX29mZnNldCArIG9mZnNldCk7Cit9CisK
K2lubGluZSBib29sIE9iamVjdDo6b3BlcmF0b3I8PShjb25zdCBPYmplY3QmIG90aGVyKQorewor
ICAgIEJBU1NFUlQobV9jaHVuayA9PSBvdGhlci5tX2NodW5rKTsKKyAgICByZXR1cm4gbV9vZmZz
ZXQgPD0gb3RoZXIubV9vZmZzZXQ7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBibWFsbG9jCiAKICNl
bmRpZiAvLyBPYmplY3RfaApJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9PYmplY3RUeXBl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL09iamVjdFR5cGUuY3Bw
CShyZXZpc2lvbiAxOTg5OTQpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL09iamVjdFR5cGUu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw3ICszNSw3IEBAIE9iamVjdFR5cGUgb2JqZWN0VHlw
ZSh2b2lkKiBvYmplY3QpCiAgICAgaWYgKGlzWExhcmdlKG9iamVjdCkpCiAgICAgICAgIHJldHVy
biBPYmplY3RUeXBlOjpYTGFyZ2U7CiAgICAgCi0gICAgcmV0dXJuIE9iamVjdChvYmplY3QpLnBh
Z2UoKS0+b2JqZWN0VHlwZSgpOworICAgIHJldHVybiBPYmplY3Qob2JqZWN0KS5jaHVuaygpLT5v
YmplY3RUeXBlKCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGJtYWxsb2MKSW5kZXg6IFNvdXJjZS9i
bWFsbG9jL2JtYWxsb2MvU2l6ZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFs
bG9jL1NpemVzLmgJKHJldmlzaW9uIDE5ODk5NCkKKysrIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2Mv
U2l6ZXMuaAkod29ya2luZyBjb3B5KQpAQCAtNTAsMTQgKzUwLDIwIEBAIG5hbWVzcGFjZSBTaXpl
cyB7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBzbWFsbFBhZ2VTaXplID0gNCAqIGtCOwogICAg
IHN0YXRpYyBjb25zdCBzaXplX3Qgc21hbGxQYWdlTGluZUNvdW50ID0gc21hbGxQYWdlU2l6ZSAv
IHNtYWxsTGluZVNpemU7CiAKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IHNtYWxsTWF4ID0gMSAq
IGtCOwogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWFza1NpemVDbGFzc01heCA9IDUxMjsKKyAg
ICBzdGF0aWMgY29uc3Qgc2l6ZV90IHNtYWxsTWF4ID0gMTYgKiBrQjsKKworICAgIHN0YXRpYyBj
b25zdCBzaXplX3QgcGFnZVNpemVNYXggPSAzMiAqIGtCOworICAgIHN0YXRpYyBjb25zdCBzaXpl
X3QgcGFnZUNsYXNzQ291bnQgPSBwYWdlU2l6ZU1heCAvIHNtYWxsUGFnZVNpemU7CisKKyAgICBz
dGF0aWMgY29uc3Qgc2l6ZV90IHBhZ2VTaXplV2FzdGVGYWN0b3IgPSA4OworICAgIHN0YXRpYyBj
b25zdCBzaXplX3QgbG9nV2FzdGVGYWN0b3IgPSA4OwogCiAgICAgc3RhdGljIGNvbnN0IHNpemVf
dCBjaHVua1NpemUgPSAyICogTUI7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBjaHVua01hc2sg
PSB+KGNodW5rU2l6ZSAtIDF1bCk7CiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGxhcmdlQWxp
Z25tZW50ID0gNjQ7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBsYXJnZU1pbiA9IHNtYWxsTWF4
OworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbGFyZ2VNaW4gPSAxICoga0I7CiAgICAgc3RhdGlj
IGNvbnN0IHNpemVfdCBsYXJnZU9iamVjdE1heCA9IGNodW5rU2l6ZTsKICAgICBzdGF0aWMgY29u
c3Qgc2l6ZV90IGxhcmdlTWF4ID0gbGFyZ2VPYmplY3RNYXggLyAyOwogCkBAIC04Niw3ICs5Miw2
IEBAIG5hbWVzcGFjZSBTaXplcyB7CiAgICAgICAgIHJldHVybiAobWFza1NpemVDbGFzcyArIDEp
ICogYWxpZ25tZW50OwogICAgIH0KIAotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbG9nV2FzdGVG
YWN0b3IgPSA4OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbG9nQWxpZ25tZW50TWluID0gbWFz
a1NpemVDbGFzc01heCAvIGxvZ1dhc3RlRmFjdG9yOwogCiAgICAgc3RhdGljIGNvbnN0IHNpemVf
dCBsb2dTaXplQ2xhc3NDb3VudCA9IChsb2cyKHNtYWxsTWF4KSAtIGxvZzIobWFza1NpemVDbGFz
c01heCkpICogbG9nV2FzdGVGYWN0b3I7CkBAIC0xMjAsNiArMTI1LDExIEBAIG5hbWVzcGFjZSBT
aXplcyB7CiAgICAgICAgICAgICByZXR1cm4gbWFza09iamVjdFNpemUoc2l6ZUNsYXNzKTsKICAg
ICAgICAgcmV0dXJuIGxvZ09iamVjdFNpemUoc2l6ZUNsYXNzIC0gbWFza1NpemVDbGFzc0NvdW50
KTsKICAgICB9CisgICAgCisgICAgaW5saW5lIHNpemVfdCBwYWdlU2l6ZShzaXplX3QgcGFnZUNs
YXNzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChwYWdlQ2xhc3MgKyAxKSAqIHNtYWxsUGFnZVNp
emU7CisgICAgfQogfQogCiB1c2luZyBuYW1lc3BhY2UgU2l6ZXM7CkluZGV4OiBTb3VyY2UvYm1h
bGxvYy9ibWFsbG9jL1NtYWxsUGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2Jt
YWxsb2MvU21hbGxQYWdlLmgJKHJldmlzaW9uIDE5ODk5NCkKKysrIFNvdXJjZS9ibWFsbG9jL2Jt
YWxsb2MvU21hbGxQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDcgKzM4LDYgQEAgY2xhc3Mg
U21hbGxQYWdlIDogcHVibGljIExpc3ROb2RlPFNtYWxsUAogcHVibGljOgogICAgIFNtYWxsUGFn
ZSgpCiAgICAgICAgIDogbV9oYXNGcmVlTGluZXModHJ1ZSkKLSAgICAgICAgLCBtX29iamVjdFR5
cGUoT2JqZWN0VHlwZTo6TGFyZ2UpCiAgICAgewogICAgIH0KIApAQCAtNDksMjggKzQ4LDE5IEBA
IHB1YmxpYzoKICAgICBzaXplX3Qgc2l6ZUNsYXNzKCkgeyByZXR1cm4gbV9zaXplQ2xhc3M7IH0K
ICAgICB2b2lkIHNldFNpemVDbGFzcyhzaXplX3Qgc2l6ZUNsYXNzKSB7IG1fc2l6ZUNsYXNzID0g
c2l6ZUNsYXNzOyB9CiAgICAgCi0gICAgT2JqZWN0VHlwZSBvYmplY3RUeXBlKCkgY29uc3QgeyBy
ZXR1cm4gbV9vYmplY3RUeXBlOyB9Ci0gICAgdm9pZCBzZXRPYmplY3RUeXBlKE9iamVjdFR5cGUg
b2JqZWN0VHlwZSkgeyBtX29iamVjdFR5cGUgPSBvYmplY3RUeXBlOyB9Ci0KICAgICBib29sIGhh
c0ZyZWVMaW5lcyhzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JikgY29uc3QgeyByZXR1cm4g
bV9oYXNGcmVlTGluZXM7IH0KICAgICB2b2lkIHNldEhhc0ZyZWVMaW5lcyhzdGQ6OmxvY2tfZ3Vh
cmQ8U3RhdGljTXV0ZXg+JiwgYm9vbCBoYXNGcmVlTGluZXMpIHsgbV9oYXNGcmVlTGluZXMgPSBo
YXNGcmVlTGluZXM7IH0KICAgICAKICAgICBTbWFsbExpbmUqIGJlZ2luKCk7Ci0gICAgU21hbGxM
aW5lKiBlbmQoKTsKIAogICAgIHVuc2lnbmVkIGNoYXIgc2xpZGUoKSBjb25zdCB7IHJldHVybiBt
X3NsaWRlOyB9CiAgICAgdm9pZCBzZXRTbGlkZSh1bnNpZ25lZCBjaGFyIHNsaWRlKSB7IG1fc2xp
ZGUgPSBzbGlkZTsgfQotCi0gICAgdW5zaWduZWQgY2hhciBzbWFsbFBhZ2VDb3VudCgpIGNvbnN0
IHsgcmV0dXJuIG1fc21hbGxQYWdlQ291bnQ7IH0KLSAgICB2b2lkIHNldFNtYWxsUGFnZUNvdW50
KHVuc2lnbmVkIGNoYXIgc21hbGxQYWdlQ291bnQpIHsgbV9zbWFsbFBhZ2VDb3VudCA9IHNtYWxs
UGFnZUNvdW50OyB9Ci0KKyAgICAKIHByaXZhdGU6CiAgICAgdW5zaWduZWQgY2hhciBtX2hhc0Zy
ZWVMaW5lczogMTsKICAgICB1bnNpZ25lZCBjaGFyIG1fcmVmQ291bnQ6IDc7CiAgICAgdW5zaWdu
ZWQgY2hhciBtX3NpemVDbGFzczsKLSAgICB1bnNpZ25lZCBjaGFyIG1fc21hbGxQYWdlQ291bnQ7
CiAgICAgdW5zaWduZWQgY2hhciBtX3NsaWRlOwotICAgIE9iamVjdFR5cGUgbV9vYmplY3RUeXBl
OwogCiBzdGF0aWNfYXNzZXJ0KAogICAgIHNpemVDbGFzc0NvdW50IDw9IHN0ZDo6bnVtZXJpY19s
aW1pdHM8ZGVjbHR5cGUobV9zaXplQ2xhc3MpPjo6bWF4KCksCkluZGV4OiBTb3VyY2UvYm1hbGxv
Yy9ibWFsbG9jL1ZNSGVhcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxv
Yy9WTUhlYXAuY3BwCShyZXZpc2lvbiAxOTg5OTQpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9j
L1ZNSGVhcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4LDcgKzM4LDcgQEAgVk1IZWFwOjpWTUhl
YXAoKQogTGFyZ2VPYmplY3QgVk1IZWFwOjphbGxvY2F0ZUNodW5rKHN0ZDo6bG9ja19ndWFyZDxT
dGF0aWNNdXRleD4mIGxvY2spCiB7CiAgICAgQ2h1bmsqIGNodW5rID0KLSAgICAgICAgbmV3ICh2
bUFsbG9jYXRlKGNodW5rU2l6ZSwgY2h1bmtTaXplKSkgQ2h1bmsobG9jayk7CisgICAgICAgIG5l
dyAodm1BbGxvY2F0ZShjaHVua1NpemUsIGNodW5rU2l6ZSkpIENodW5rKGxvY2ssIE9iamVjdFR5
cGU6OkxhcmdlKTsKIAogI2lmIEJPUyhEQVJXSU4pCiAgICAgbV96b25lLmFkZENodW5rKGNodW5r
KTsKQEAgLTQ3LDQgKzQ3LDMwIEBAIExhcmdlT2JqZWN0IFZNSGVhcDo6YWxsb2NhdGVDaHVuayhz
dGQ6OmwKICAgICByZXR1cm4gTGFyZ2VPYmplY3QoY2h1bmstPmJlZ2luKCkpOwogfQogCit2b2lk
IFZNSGVhcDo6YWxsb2NhdGVTbWFsbENodW5rKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4m
IGxvY2ssIHNpemVfdCBwYWdlQ2xhc3MpCit7CisgICAgQ2h1bmsqIGNodW5rID0KKyAgICAgICAg
bmV3ICh2bUFsbG9jYXRlKGNodW5rU2l6ZSwgY2h1bmtTaXplKSkgQ2h1bmsobG9jaywgT2JqZWN0
VHlwZTo6U21hbGwpOworCisjaWYgQk9TKERBUldJTikKKyAgICBtX3pvbmUuYWRkQ2h1bmsoY2h1
bmspOworI2VuZGlmCisKKyAgICBzaXplX3QgcGFnZVNpemUgPSBibWFsbG9jOjpwYWdlU2l6ZShw
YWdlQ2xhc3MpOworICAgIHNpemVfdCBzbWFsbFBhZ2VDb3VudCA9IHBhZ2VTaXplIC8gc21hbGxQ
YWdlU2l6ZTsKKworICAgIE9iamVjdCBiZWdpbihjaHVuay0+YmVnaW4oKSk7CisgICAgT2JqZWN0
IGVuZChiZWdpbiArIGNodW5rLT5zaXplKCkpOworCisgICAgZm9yIChPYmplY3QgaXQgPSBiZWdp
bjsgaXQgKyBwYWdlU2l6ZSA8PSBlbmQ7IGl0ID0gaXQgKyBwYWdlU2l6ZSkgeworICAgICAgICBT
bWFsbFBhZ2UqIHBhZ2UgPSBpdC5wYWdlKCk7CisgICAgICAgIG5ldyAocGFnZSkgU21hbGxQYWdl
OworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc21hbGxQYWdlQ291bnQ7ICsraSkK
KyAgICAgICAgICAgIHBhZ2VbaV0uc2V0U2xpZGUoaSk7CisKKyAgICAgICAgbV9zbWFsbFBhZ2Vz
W3BhZ2VDbGFzc10ucHVzaChwYWdlKTsKKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIGJtYWxs
b2MKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvVk1IZWFwLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL2JtYWxsb2MvYm1hbGxvYy9WTUhlYXAuaAkocmV2aXNpb24gMTk4OTk0KQorKysgU291
cmNlL2JtYWxsb2MvYm1hbGxvYy9WTUhlYXAuaAkod29ya2luZyBjb3B5KQpAQCAtNDcsNiArNDcs
OSBAQCBjbGFzcyBIZWFwOwogY2xhc3MgVk1IZWFwIHsKIHB1YmxpYzoKICAgICBWTUhlYXAoKTsK
KyAgICAKKyAgICBTbWFsbFBhZ2UqIGFsbG9jYXRlU21hbGxQYWdlKHN0ZDo6bG9ja19ndWFyZDxT
dGF0aWNNdXRleD4mLCBzaXplX3QpOworICAgIHZvaWQgZGVhbGxvY2F0ZVNtYWxsUGFnZShzdGQ6
OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYsIHNpemVfdCwgU21hbGxQYWdlKik7CiAKICAgICBM
YXJnZU9iamVjdCBhbGxvY2F0ZUxhcmdlT2JqZWN0KHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRl
eD4mLCBzaXplX3QpOwogICAgIExhcmdlT2JqZWN0IGFsbG9jYXRlTGFyZ2VPYmplY3Qoc3RkOjps
b2NrX2d1YXJkPFN0YXRpY011dGV4PiYsIHNpemVfdCwgc2l6ZV90LCBzaXplX3QpOwpAQCAtNTUs
NyArNTgsOSBAQCBwdWJsaWM6CiAgICAgCiBwcml2YXRlOgogICAgIExhcmdlT2JqZWN0IGFsbG9j
YXRlQ2h1bmsoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYpOworICAgIHZvaWQgYWxsb2Nh
dGVTbWFsbENodW5rKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBzaXplX3QpOwogCisg
ICAgc3RkOjphcnJheTxMaXN0PFNtYWxsUGFnZT4sIHBhZ2VDbGFzc0NvdW50PiBtX3NtYWxsUGFn
ZXM7CiAgICAgU2VncmVnYXRlZEZyZWVMaXN0IG1fbGFyZ2VPYmplY3RzOwogCiAjaWYgQk9TKERB
UldJTikKQEAgLTYzLDYgKzY4LDI1IEBAIHByaXZhdGU6CiAjZW5kaWYKIH07CiAKK2lubGluZSBT
bWFsbFBhZ2UqIFZNSGVhcDo6YWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRp
Y011dGV4PiYgbG9jaywgc2l6ZV90IHBhZ2VDbGFzcykKK3sKKyAgICBpZiAobV9zbWFsbFBhZ2Vz
W3BhZ2VDbGFzc10uaXNFbXB0eSgpKQorICAgICAgICBhbGxvY2F0ZVNtYWxsQ2h1bmsobG9jaywg
cGFnZUNsYXNzKTsKKworICAgIFNtYWxsUGFnZSogcGFnZSA9IG1fc21hbGxQYWdlc1twYWdlQ2xh
c3NdLnBvcCgpOworICAgIHZtQWxsb2NhdGVQaHlzaWNhbFBhZ2VzU2xvcHB5KHBhZ2UtPmJlZ2lu
KCktPmJlZ2luKCksIHBhZ2VTaXplKHBhZ2VDbGFzcykpOworICAgIHJldHVybiBwYWdlOworfQor
CitpbmxpbmUgdm9pZCBWTUhlYXA6OmRlYWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjp1bmlxdWVfbG9j
azxTdGF0aWNNdXRleD4mIGxvY2ssIHNpemVfdCBwYWdlQ2xhc3MsIFNtYWxsUGFnZSogcGFnZSkK
K3sKKyAgICBsb2NrLnVubG9jaygpOworICAgIHZtRGVhbGxvY2F0ZVBoeXNpY2FsUGFnZXNTbG9w
cHkocGFnZS0+YmVnaW4oKS0+YmVnaW4oKSwgcGFnZVNpemUocGFnZUNsYXNzKSk7CisgICAgbG9j
ay5sb2NrKCk7CisgICAgCisgICAgbV9zbWFsbFBhZ2VzW3BhZ2VDbGFzc10ucHVzaChwYWdlKTsK
K30KKwogaW5saW5lIExhcmdlT2JqZWN0IFZNSGVhcDo6YWxsb2NhdGVMYXJnZU9iamVjdChzdGQ6
OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBsb2NrLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBpZiAo
TGFyZ2VPYmplY3QgbGFyZ2VPYmplY3QgPSBtX2xhcmdlT2JqZWN0cy50YWtlKHNpemUpKQo=
</data>
<flag name="review"
          id="299846"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
      

    </bug>

</bugzilla>