<?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>152420</bug_id>
          
          <creation_ts>2015-12-17 23:27:25 -0800</creation_ts>
          <short_desc>[JSC] Streamline Tmp indexing inside the register allocator</short_desc>
          <delta_ts>2015-12-19 13:06:35 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>
          
          <blocked>150903</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Benjamin Poulain">benjamin</reporter>
          <assigned_to name="Benjamin Poulain">benjamin</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1150221</commentid>
    <comment_count>0</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-12-17 23:27:25 -0800</bug_when>
    <thetext>[JSC] Streamline Tmp indexing inside the register allocator</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150225</commentid>
    <comment_count>1</comment_count>
      <attachid>267615</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-12-17 23:34:30 -0800</bug_when>
    <thetext>Created attachment 267615
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150226</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-12-17 23:36:31 -0800</bug_when>
    <thetext>Attachment 267615 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:870:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 1 in 3 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>1150308</commentid>
    <comment_count>3</comment_count>
      <attachid>267615</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-12-18 10:05:01 -0800</bug_when>
    <thetext>Comment on attachment 267615
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150391</commentid>
    <comment_count>4</comment_count>
      <attachid>267615</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-12-18 14:37:55 -0800</bug_when>
    <thetext>Comment on attachment 267615
Patch

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

&gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:89
&gt; +    AbstractIteratedRegisterCoalescingAllocator(const Vector&lt;Reg&gt;&amp; regsInPriorityOrder, IndexType lastPrecoloredRegisterIndex, unsigned tmpArraySize)

This should take Code&amp;, and the class should have a field called Code&amp; m_code, and all other helper functions should be members of this class if at all possible.  I think that there are two good reasons for this:

1) Consistency.  All phases currently make Code&amp; available to all helpers, either by making those helpers be lambdas that close over Code&amp; or by having a helper class that holds a Code&amp; m_code property.  Also, all phases currently make it easy to share state with all helper functions, for example if we need to run some analysis and stash the results so that they can be reused throughout the phase.  They do it by making all helper functions either be lambdas that close over [&amp;] or by making them member functions inside the helper class.
2) Hackability.  It&apos;s within bounds to add new code that relies on Code&amp; or on some additional analysis.  If we write phases using your style, then anytime we need to modify the phase to make use of some new analysis, we&apos;ll have to thread this analysis through all of the functions/classes.  If we write phases using the style that all other phases use, then it&apos;s easy to make use of new analyses.

An example of this is the work I&apos;m doing right now to teach IRC that Move32 is sometimes coalescable.  To do that, I need mayBeCoalescable() to have access to Code&amp; plus two other analyses.  Had you written IRC using the same style as the other phases, this would have been easy.  But now I&apos;m going to essentially have to hack IRC to do what other phases do, or I&apos;ll have to thread Code&amp; plus the two other analyses as arguments to all of the standalone functions that call mayBeCoalescable().  That&apos;s not fun.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150392</commentid>
    <comment_count>5</comment_count>
      <attachid>267615</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-12-18 14:40:23 -0800</bug_when>
    <thetext>Comment on attachment 267615
Patch

Marking r- because in its current form, this refactoring would make it very difficult to add Move32 coalescing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150405</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-12-18 15:31:02 -0800</bug_when>
    <thetext>Benjamin: check out the WIP patch in https://bugs.webkit.org/show_bug.cgi?id=152365.

Notice how this adds a TmpWidth member to the main class of IRC, and then it uses it from a lot of places.  I want this kind of extension to be easy to add to any phase.  Roughly, inside any part of a phase, it should be possible to easily insert code that queries some analysis.  It&apos;s easy if all of the code in the phase shares some common lexical scope or class instance.  It&apos;s not easy if the phase has a lot of code in standalone functions.

This is why the other phases all try to share some lexical scope or some class instance.  In the past, I was ambivalent towards IRC adopting its own style, but now I think that there is an actual argument in favor of using a common style that makes it easy to write these kinds of improvements.

Can you do your refactoring in such a way that there is a class that holds all of the code in the phase, and all of the functionality has a pointer to an instance of that class?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150547</commentid>
    <comment_count>7</comment_count>
      <attachid>267690</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-12-19 10:10:42 -0800</bug_when>
    <thetext>Created attachment 267690
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150548</commentid>
    <comment_count>8</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-12-19 10:12:25 -0800</bug_when>
    <thetext>Does that work for you?

m_tmpWidth would be ownned by IteratedRegisterCoalescing. It will then be used by each ColoringAllocator to build its own graph.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150549</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-12-19 10:12:41 -0800</bug_when>
    <thetext>Attachment 267690 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:773:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:842:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 2 in 3 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>1150553</commentid>
    <comment_count>10</comment_count>
      <attachid>267690</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-12-19 10:36:12 -0800</bug_when>
    <thetext>Comment on attachment 267690
Patch

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

&gt; Source/JavaScriptCore/ChangeLog:8
&gt; +        AirIteratedRegisterCoalescing has been allocating a bit of mess over time.

Typo:
    allocating-&gt;accumulating

&gt; Source/JavaScriptCore/ChangeLog:13
&gt; +        with half of the function using Tmp, the other using indices.

the other -&gt; the other half</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150563</commentid>
    <comment_count>11</comment_count>
      <attachid>267696</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-12-19 11:17:10 -0800</bug_when>
    <thetext>Created attachment 267696
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150576</commentid>
    <comment_count>12</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-12-19 12:40:43 -0800</bug_when>
    <thetext>The failing test that is blocking commit-queue is not related to B3.  I&apos;m going to land this myself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150579</commentid>
    <comment_count>13</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-12-19 13:06:08 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/194316</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>267615</attachid>
            <date>2015-12-17 23:34:30 -0800</date>
            <delta_ts>2015-12-19 10:10:34 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152420-20151218083348.patch</filename>
            <type>text/plain</type>
            <size>58918</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0MTAxCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBm
Yzc2NzZmMDllZjI2MWUwOWI4ZDc4YjdmNDEyYjRhODgzMDFlYzM5Li5lYTQzMjU4MTU0Y2UwZjQ0
MWY3NWVkM2YwZDI3YzBiNjY1M2YzNjViIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwzMiBAQAorMjAxNS0xMi0xNyAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KKworICAgICAgICBbSlNDXSBTdHJlYW1saW5lIFRtcCBpbmRleGluZyBpbnNpZGUgdGhl
IHJlZ2lzdGVyIGFsbG9jYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTUyNDIwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgaGFzIGJlZW4gYWxsb2Nh
dGluZyBhIGJpdCBvZiBtZXNzIG92ZXIgdGltZS4KKworICAgICAgICBXaGVuIGl0IHN0YXJ0ZWQs
IGV2ZXJ5IG1hcCBhZGRyZXNzZWQgYnkgVG1wIHdhcyB1c2luZyBUbXAgaGFzaGluZy4KKyAgICAg
ICAgVGhhdCBjYXVzZWQgbWFzc2l2ZSBwZXJmb3JtYW5jZSBwcm9ibGVtcy4gRXZlcnl0aGluZyBw
ZXJmIHNlbnNpdGl2ZSB3YXMgbW92ZWQKKyAgICAgICAgdG8gZGlyZWN0IGFycmF5IGFkZHJlc3Np
bmcgYnkgdGhlIGFic29sdXRlIFRtcCBpbmRleC4gVGhpcyBsZWZ0IHRoZSBjb2RlCisgICAgICAg
IHdpdGggaGFsZiBvZiB0aGUgZnVuY3Rpb24gdXNpbmcgVG1wLCB0aGUgb3RoZXIgdXNpbmcgaW5k
aWNlcy4KKworICAgICAgICBXaXRoIHRoaXMgcGF0Y2gsIGFsbW9zdCBldmVyeXRoaW5nIGlzIG1v
dmVkIHRvIGFic29sdXRlIGluZGV4aW5nLgorICAgICAgICBUaGVyZSBhcmUgYSBmZXcgYWR2YW50
YWdlcyB0byB0aGlzOgorICAgICAgICAtTm8gbW9yZSBjb252ZXJzaW9uIGNodXJuIGZvciBGbG9h
dGluZyBQb2ludCByZWdpc3RlcnMuCisgICAgICAgIC1Nb3N0IG9mIHRoZSBmdW5jdGlvbnMgY2Fu
IG5vdyBiZSBzaGFyZWQgYmV0d2VlbiBHUCBhbmQgRlAuCisgICAgICAgIC1BIGJpdCBvZiBjbGVh
biB1cCBzaW5jZSB0aGUgY29yZSBhbGdvcml0aG0gb25seSBkZWFscyB3aXRoIGludGVnZXJzIG5v
dy4KKworICAgICAgICBUaGlzIHBhdGNoIGFsc28gY2hhbmdlcyB0aGUgaW5kZXggdHlwZSB0byBi
ZSBhIHRlbXBsYXRlIGFyZ3VtZW50LgorICAgICAgICBUaGF0IHdpbGwgYWxsb3cgZnV0dXJlIHNw
ZWNpYWxpemF0aW9uIG9mICJtX2ludGVyZmVyZW5jZUVkZ2VzIiBiYXNlZAorICAgICAgICBvbiB0
aGUgZXhwZWN0ZWQgcHJvYmxlbSBzaXplLgorCisgICAgICAgICogYjMvYWlyL0Fpckl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nLmNwcDoKKyAgICAgICAgKiBiMy9haXIvQWlyVG1wSW5saW5lcy5o
OgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpBYnNvbHV0ZVRtcE1hcHBlcjxBcmc6OkdQPjo6bGFz
dE1hY2hpbmVSZWdpc3RlckluZGV4KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6QWJzb2x1dGVU
bXBNYXBwZXI8QXJnOjpGUD46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCk6CisKIDIwMTUtMTIt
MTUgIENzYWJhIE9zenRyb2dvbsOhYyAgPG9zc3lAd2Via2l0Lm9yZz4KIAogICAgICAgICBVUlRC
RiBhZnRlciAxOTQwNjIuCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCmluZGV4IDUwMmM4OWRm
NmQwN2Y5NzFkZjdjZmJhYWRmZWQ3MDI1ZjdhOTZkOWYuLjQyYmMwZDgwMGIwN2IyMDI4OTM5ZWVi
NzEzM2VmN2U2MTVmZWY5OGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCkBAIC04MSw1
MyArODEsNjczIEBAIHN0cnVjdCBNb3ZlSW5zdEhlbHBlcjxBcmc6OkZQPiB7CiAgICAgfQogfTsK
IAorLy8gVGhlIEFic3RyYWN0SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3IgZGVm
aW5lcyBhbGwgdGhlIGNvZGUgdGhhdCBpcyBpbmRlcGVuZGFudAorLy8gZnJvbSB0aGUgdHlwZSBv
ciByZWdpc3RlciBhbmQgY2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgor
dGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorY2xhc3MgQWJzdHJhY3RJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZ0FsbG9jYXRvciB7CitwdWJsaWM6CisgICAgQWJzdHJhY3RJdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcihjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0luUHJpb3Jp
dHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5zaWduZWQg
dG1wQXJyYXlTaXplKQorICAgICAgICA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcihyZWdzSW5Qcmlv
cml0eU9yZGVyKQorICAgICAgICAsIG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4KGxhc3RQ
cmVjb2xvcmVkUmVnaXN0ZXJJbmRleCkKKyAgICB7CisgICAgICAgIGluaXRpYWxpemVEZWdyZWVz
KHRtcEFycmF5U2l6ZSk7CisKKyAgICAgICAgbV9hZGphY2VuY3lMaXN0LnJlc2l6ZSh0bXBBcnJh
eVNpemUpOworICAgICAgICBtX21vdmVMaXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOworICAgICAg
ICBtX2NvYWxlc2NlZFRtcHMuZmlsbCgwLCB0bXBBcnJheVNpemUpOworICAgICAgICBtX2lzT25T
ZWxlY3RTdGFjay5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZSk7CisgICAgfQorCitwcm90ZWN0ZWQ6
CisgICAgSW5kZXhUeXBlIGdldEFsaWFzKEluZGV4VHlwZSB0bXBJbmRleCkgY29uc3QKKyAgICB7
CisgICAgICAgIEluZGV4VHlwZSBhbGlhcyA9IHRtcEluZGV4OworICAgICAgICB3aGlsZSAoSW5k
ZXhUeXBlIG5leHRBbGlhcyA9IG1fY29hbGVzY2VkVG1wc1thbGlhc10pCisgICAgICAgICAgICBh
bGlhcyA9IG5leHRBbGlhczsKKyAgICAgICAgcmV0dXJuIGFsaWFzOworICAgIH0KKworICAgIHZv
aWQgYWRkRWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCisgICAgeworICAgICAgICBpZiAo
YSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBhZGRFZGdlRGlzdGluY3QoYSwg
Yik7CisgICAgfQorCisgICAgdm9pZCBtYWtlV29ya0xpc3QoKQorICAgIHsKKyAgICAgICAgSW5k
ZXhUeXBlIGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCAr
IDE7CisgICAgICAgIGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9k
ZWdyZWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBkZWdyZWUgPSBtX2Rl
Z3JlZXNbaV07CisgICAgICAgICAgICBpZiAoIWRlZ3JlZSkKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKworICAgICAgICAgICAgaWYgKGRlZ3JlZSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpKQorICAgICAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5hZGQoaSk7CisgICAgICAg
ICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
bV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDoganVzdCBwaWNrIGFu
eSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVyaWNl
cy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0IG9m
IHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAgdm9pZCBzaW1wbGlm
eSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgbGFzdEluZGV4ID0gbV9zaW1wbGlmeVdvcmts
aXN0LnRha2VMYXN0KCk7CisKKyAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5z
KGxhc3RJbmRleCkpOworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0YWNrLmdldChsYXN0
SW5kZXgpKTsKKyAgICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdEluZGV4KTsKKyAgICAg
ICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQobGFzdEluZGV4KTsKKworICAgICAgICBmb3JF
YWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10oSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgp
IHsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAg
ICAgfSk7CisgICAgfQorCisgICAgdm9pZCBmcmVlemUoKQorICAgIHsKKyAgICAgICAgSW5kZXhU
eXBlIHZpY3RpbUluZGV4ID0gbV9mcmVlemVXb3JrbGlzdC50YWtlQW55KCk7CisgICAgICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UoZ2V0QWxpYXModmljdGltSW5kZXgpID09IHZpY3RpbUluZGV4LCAi
Y29hbGVzY2UoKSBzaG91bGQgbm90IGxlYXZlIGFsaWFzZWQgVG1wIGluIHRoZSB3b3JrbGlzdC4i
KTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisgICAg
ICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZU1v
dmVzKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvckVhY2hOb2RlTW92ZXMo
dG1wSW5kZXgsIFt0aGlzLCB0bXBJbmRleF0gKEluZGV4VHlwZSBtb3ZlSW5kZXgpIHsKKyAgICAg
ICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRleCkpCisgICAgICAg
ICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VNb3ZlKG1vdmVJbmRleCk7CisKKyAgICAgICAg
ICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlk
YXRlc1ttb3ZlSW5kZXhdOworICAgICAgICAgICAgSW5kZXhUeXBlIHNyY1RtcEluZGV4ID0gbW92
ZU9wZXJhbmRzLnNyY0luZGV4OworICAgICAgICAgICAgSW5kZXhUeXBlIGRzdFRtcEluZGV4ID0g
bW92ZU9wZXJhbmRzLmRzdEluZGV4OworCisgICAgICAgICAgICBJbmRleFR5cGUgb3JpZ2luYWxP
dGhlclRtcCA9IHNyY1RtcEluZGV4ICE9IHRtcEluZGV4ID8gc3JjVG1wSW5kZXggOiBkc3RUbXBJ
bmRleDsKKyAgICAgICAgICAgIEluZGV4VHlwZSBvdGhlclRtcEluZGV4ID0gZ2V0QWxpYXMob3Jp
Z2luYWxPdGhlclRtcCk7CisgICAgICAgICAgICBpZiAobV9kZWdyZWVzW290aGVyVG1wSW5kZXhd
IDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRt
cEluZGV4KSkgeworICAgICAgICAgICAgICAgIGlmIChtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZShv
dGhlclRtcEluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFw
cGVuZChvdGhlclRtcEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQor
CisgICAgdm9pZCBjb2FsZXNjZSgpCisgICAgeworICAgICAgICB1bnNpZ25lZCBtb3ZlSW5kZXgg
PSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3ZlKCk7CisgICAgICAgIGNvbnN0IE1vdmVPcGVy
YW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOwor
ICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7Cisg
ICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKKwor
ICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYp
OworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVz
Y2luZyBtb3ZlIGF0IGluZGV4IiwgbW92ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2LCAi
XG4iKTsKKworICAgICAgICBpZiAodSA9PSB2KSB7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1
KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxv
ZygiICAgIENvYWxlc2NlZFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xvcmVkKHYp
IHx8IG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCB2KSkp
IHsKKyAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgYWRkV29ya0xpc3Qo
dik7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFM
b2coIiAgICBDb25zdHJhaW5lZFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQmVTYWZlbHlD
b2FsZXNjZWQodSwgdikpIHsKKyAgICAgICAgICAgIGNvbWJpbmUodSwgdik7CisgICAgICAgICAg
ICBhZGRXb3JrTGlzdCh1KTsKKyAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1v
dmUgPSB0cnVlOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsKKworICAgICAgICAg
ICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxlZCBj
b2FsZXNjaW5nLCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHZvaWQgYXNzaWduQ29sb3JzKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3NpbXBs
aWZ5V29ya2xpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKG1fd29ya2xpc3RNb3Zlcy5p
c0VtcHR5KCkpOworICAgICAgICBBU1NFUlQobV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpOwor
ICAgICAgICBBU1NFUlQobV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7CisKKyAgICAgICAgLy8g
UmVjbGFpbSBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZS4KKyAgICAgICAgbV9pbnRlcmZlcmVu
Y2VFZGdlcy5jbGVhcigpOworICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsKKyAgICAgICAgbV9t
b3ZlTGlzdC5jbGVhcigpOworICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKKyAgICAg
ICAgbV9zaW1wbGlmeVdvcmtsaXN0LmNsZWFyKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5j
bGVhcigpOworICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmNsZWFyKCk7CisKKyAgICAgICAgLy8g
VHJ5IHRvIGNvbG9yIHRoZSBUbXAgb24gdGhlIHN0YWNrLgorICAgICAgICBtX2NvbG9yZWRUbXAu
cmVzaXplKG1fYWRqYWNlbmN5TGlzdC5zaXplKCkpOworCisgICAgICAgIHdoaWxlICghbV9zZWxl
Y3RTdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gbV9z
ZWxlY3RTdGFjay50YWtlTGFzdCgpOworICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQo
dG1wSW5kZXgpKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9jb2xvcmVkVG1wW3RtcEluZGV4XSk7
CisKKyAgICAgICAgICAgIFJlZ2lzdGVyU2V0IGNvbG9yZWRSZWdpc3RlcnM7CisgICAgICAgICAg
ICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogbV9hZGphY2VuY3lMaXN0W3RtcElu
ZGV4XSkgeworICAgICAgICAgICAgICAgIEluZGV4VHlwZSBhbGlhc1RtcEluZGV4ID0gZ2V0QWxp
YXMoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAgUmVnIHJlZyA9IG1fY29sb3Jl
ZFRtcFthbGlhc1RtcEluZGV4XTsKKworICAgICAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xv
cmVkKGFsaWFzVG1wSW5kZXgpIHx8IChpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgJiYgcmVn
KSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVnKQorICAgICAgICAgICAgICAgICAgICBjb2xv
cmVkUmVnaXN0ZXJzLnNldChyZWcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29s
IGNvbG9yQXNzaWduZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVn
c0luUHJpb3JpdHlPcmRlcikgeworICAgICAgICAgICAgICAgIGlmICghY29sb3JlZFJlZ2lzdGVy
cy5nZXQocmVnKSkgeworICAgICAgICAgICAgICAgICAgICBtX2NvbG9yZWRUbXBbdG1wSW5kZXhd
ID0gcmVnOworICAgICAgICAgICAgICAgICAgICBjb2xvckFzc2lnbmVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAoIWNvbG9yQXNzaWduZWQpCisgICAgICAgICAgICAgICAgbV9zcGls
bGVkVG1wcy5hcHBlbmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgICAgIG1fc2VsZWN0U3Rh
Y2suY2xlYXIoKTsKKworICAgICAgICBpZiAobV9zcGlsbGVkVG1wcy5pc0VtcHR5KCkpCisgICAg
ICAgICAgICBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsLmNsZWFyKCk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG1fY29sb3JlZFRtcC5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2
b2lkIGluaXRpYWxpemVEZWdyZWVzKHVuc2lnbmVkIHRtcEFycmF5U2l6ZSkKKyAgICB7CisgICAg
ICAgIG1fZGVncmVlcy5yZXNpemUodG1wQXJyYXlTaXplKTsKKworICAgICAgICAvLyBBbGwgcHJl
Y29sb3JlZCByZWdpc3RlcnMgaGF2ZSAgYW4gImluZmluaXRlIiBkZWdyZWUuCisgICAgICAgIHVu
c2lnbmVkIGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCAr
IDE7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaXJzdE5vblJlZ0luZGV4OyAr
K2kpCisgICAgICAgICAgICBtX2RlZ3JlZXNbaV0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2ln
bmVkPjo6bWF4KCk7CisKKyAgICAgICAgYnplcm8obV9kZWdyZWVzLmRhdGEoKSArIGZpcnN0Tm9u
UmVnSW5kZXgsICh0bXBBcnJheVNpemUgLSBmaXJzdE5vblJlZ0luZGV4KSAqIHNpemVvZih1bnNp
Z25lZCkpOworICAgIH0KKworICAgIHZvaWQgYWRkRWRnZURpc3RpbmN0KEluZGV4VHlwZSBhLCBJ
bmRleFR5cGUgYikKKyAgICB7CisgICAgICAgIEFTU0VSVChhICE9IGIpOworICAgICAgICBpZiAo
bV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRy
eSkgeworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKKyAgICAgICAgICAgICAg
ICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7CisgICAgICAgICAgICAg
ICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKKyAgICAgICAgICAgICAgICBtX2RlZ3Jl
ZXNbYV0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQo
YikpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFtiXS5jb250YWlu
cyhhKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2JdLmFwcGVuZChhKTsKKyAg
ICAgICAgICAgICAgICBtX2RlZ3JlZXNbYl0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKworICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4VHlwZSB0bXBJbmRleCkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKworICAgICAgICB1bnNp
Z25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07CisgICAgICAgIGlmIChvbGRE
ZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAgZW5h
YmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcEluZGV4KTsKKyAgICAgICAgICAgIG1fc3Bp
bGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOworICAgICAgICAgICAgaWYgKGlzTW92ZVJlbGF0
ZWQodG1wSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKHRtcElu
ZGV4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xp
c3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNNb3Zl
UmVsYXRlZChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVk
IG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAobV9h
Y3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlu
cyhtb3ZlSW5kZXgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
dGlvbj4KKyAgICB2b2lkIGZvckVhY2hBZGphY2VudChJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0
aW9uIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJ
bmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmICghaGFz
QmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkpCisgICAgICAgICAgICAgICAgZnVuY3Rp
b24oYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGhhc0Jl
ZW5TaW1wbGlmaWVkKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBt
X2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNb
dG1wSW5kZXhdOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgorICAg
IHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0
aW9uKQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0
W3RtcEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92
ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKKyAgICAgICAg
ICAgICAgICBmdW5jdGlvbihtb3ZlSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9p
ZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAg
ICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQorICAgICAgICAg
ICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJbmRleCk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyhJbmRleFR5
cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wSW5kZXgp
OworCisgICAgICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwgW3RoaXNdIChJbmRleFR5cGUg
YWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFj
ZW50VG1wSW5kZXgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBib29sIGlzUHJlY29sb3Jl
ZChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gdG1wSW5kZXggPD0g
bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CisgICAgfQorCisgICAgdm9pZCBhZGRXb3Jr
TGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBpZiAoIWlzUHJlY29sb3Jl
ZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRl
ci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7CisgICAgICAgICAgICBtX2Zy
ZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3NpbXBsaWZ5V29y
a2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY29t
YmluZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBpZiAoIW1fZnJl
ZXplV29ya2xpc3QucmVtb3ZlKHYpKQorICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92
ZSh2KTsKKworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7CisgICAgICAgIG1f
Y29hbGVzY2VkVG1wc1t2XSA9IHU7CisKKyAgICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3ZlTGlz
dFt2XTsKKyAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCksIHZNb3Zlcy5l
bmQoKSk7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1XSAoSW5kZXhUeXBl
IGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGFkZEVkZ2VEaXN0aW5jdChhZGphY2Vu
dFRtcEluZGV4LCB1KTsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcElu
ZGV4KTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKG1fZGVncmVlc1t1XSA+PSBtX3JlZ3NJ
blByaW9yaXR5T3JkZXIuc2l6ZSgpICYmIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQorICAg
ICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmFkZCh1KTsKKyAgICB9CisKKyAgICBib29sIGNhbkJl
U2FmZWx5Q29hbGVzY2VkKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAgICAg
IEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh1KSkK
KyAgICAgICAgICAgIHJldHVybiBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyh1LCB2KTsK
KyAgICAgICAgcmV0dXJuIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyh1LCB2KTsKKyAgICB9CisKKyAg
ICBib29sIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisg
ICAgeworICAgICAgICAvLyBUaGlzIGlzIHVzaW5nIHRoZSBCcmlnZ3MnIGNvbnNlcnZhdGl2ZSBj
b2FsZXNjaW5nIHJ1bGU6CisgICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgY29tYmluZWQgYWRq
YWNlbnQgbm9kZSB3aXRoIGEgZGVncmVlID49IEsgaXMgbGVzcyB0aGFuIEssCisgICAgICAgIC8v
IGl0IGlzIHNhZmUgdG8gY29tYmluZSB0aGUgdHdvIG5vZGVzLiBUaGUgcmVhc29uIGlzIHRoYXQg
d2Uga25vdyB0aGF0IGlmIHRoZSBncmFwaAorICAgICAgICAvLyBpcyBjb2xvcmFibGUsIHdlIGhh
dmUgZmV3ZXIgdGhhbiBLIGFkamFjZW50cyB3aXRoIGhpZ2ggb3JkZXIgYW5kIHRoZXJlIGlzIGEg
Y29sb3IKKyAgICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgIEFTU0VSVCh1
ICE9IHYpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh1KSk7CisgICAgICAgIEFTU0VS
VCghaXNQcmVjb2xvcmVkKHYpKTsKKworICAgICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlUg
PSBtX2FkamFjZW5jeUxpc3RbdV07CisgICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mViA9
IG1fYWRqYWNlbmN5TGlzdFt2XTsKKworICAgICAgICBpZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSAr
IGFkamFjZW50c09mVi5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7Cisg
ICAgICAgICAgICAvLyBTaG9ydGN1dDogaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhZGphY2VudHMg
aXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIsIHRoZSBjb25kaXRpb24gaXMgYWx3
YXlzIG1ldC4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAg
SGFzaFNldDxJbmRleFR5cGU+IGhpZ2hPcmRlckFkamFjZW50czsKKworICAgICAgICBmb3IgKElu
ZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZVKSB7CisgICAgICAgICAgICBB
U1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKKyAgICAgICAgICAgIEFTU0VSVChhZGphY2Vu
dFRtcEluZGV4ICE9IHUpOworICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGph
Y2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Q
cmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0ID0g
aGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAg
ICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+
PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJbmRleFR5
cGUgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikgeworICAgICAgICAgICAgQVNTRVJU
KGFkamFjZW50VG1wSW5kZXggIT0gdSk7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJ
bmRleCAhPSB2KTsKKyAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRU
bXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3Jp
dHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hP
cmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAgaWYg
KGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9y
ZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUKGhpZ2hPcmRl
ckFkamFjZW50cy5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBwcmVjb2xvcmVkQ29hbGVzY2luZ0hl
dXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBBU1NFUlQo
aXNQcmVjb2xvcmVkKHUpKTsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOworCisg
ICAgICAgIC8vIElmIGFueSBhZGphY2VudCBvZiB0aGUgbm9uLWNvbG9yZWQgbm9kZSBpcyBub3Qg
YW4gYWRqYWNlbnQgb2YgdGhlIGNvbG9yZWQgbm9kZSBBTkQgaGFzIGEgZGVncmVlID49IEsKKyAg
ICAgICAgLy8gdGhlcmUgaXMgYSByaXNrIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGhhdmUgdGhl
IHNhbWUgY29sb3IgYXMgb3VyIHByZWNvbG9yZWQgbm9kZS4gSWYgd2UgY29hbGVzY2Ugc3VjaAor
ICAgICAgICAvLyBtb3ZlLCB3ZSBtYXkgY3JlYXRlIGFuIHVuY29sb3JhYmxlIGdyYXBoLgorICAg
ICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlYgPSBtX2FkamFjZW5jeUxpc3Rbdl07CisgICAg
ICAgIGZvciAodW5zaWduZWQgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikgeworICAg
ICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYWRqYWNlbnRUbXBJbmRleCkKKyAgICAgICAgICAg
ICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkKKyAgICAgICAgICAg
ICAgICAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKQorICAgICAgICAgICAgICAgICYmICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRh
aW5zKEludGVyZmVyZW5jZUVkZ2UodSwgYWRqYWNlbnRUbXBJbmRleCkpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKK3Byb3RlY3RlZDoKKyNpZiBQTEFURk9STShDT0NPQSkKKyNwcmFnbWEgbWFyayAtCisjZW5k
aWYKKworICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVkLiBBbiBlZGdl
IGJldHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVkCisgICAgLy8gYnkgdGhlIGNvbmNh
dGVuYXRlZCB2YWx1ZXMgb2YgdGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0aGUgYmlnZ2Vy
IFRtcC4KKyAgICBjbGFzcyBJbnRlcmZlcmVuY2VFZGdlIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IEludGVyZmVyZW5jZUVkZ2UoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBJbnRl
cmZlcmVuY2VFZGdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKKyAgICAgICAgeworICAgICAg
ICAgICAgQVNTRVJUKGEpOworICAgICAgICAgICAgQVNTRVJUKGIpOworICAgICAgICAgICAgQVNT
RVJUX1dJVEhfTUVTU0FHRShhICE9IGIsICJBIFRtcCBjYW4gbmV2ZXIgaW50ZXJmZXJlIHdpdGgg
aXRzZWxmLiBEb2luZyBzbyB3b3VsZCBmb3JjZSBpdCB0byBiZSB0aGUgc3VwZXJwb3NpdGlvbiBv
ZiB0d28gcmVnaXN0ZXJzLiIpOworCisgICAgICAgICAgICBpZiAoYiA8IGEpCisgICAgICAgICAg
ICAgICAgc3RkOjpzd2FwKGEsIGIpOworICAgICAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0
PHVpbnQ2NF90PihhKSA8PCAzMiB8IGI7CisgICAgICAgIH0KKworICAgICAgICBJbnRlcmZlcmVu
Y2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlVHlwZSkKKyAgICAgICAgICAgIDogbV92
YWx1ZShzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpCisgICAgICAgIHsKKyAg
ICAgICAgfQorCisgICAgICAgIEluZGV4VHlwZSBmaXJzdCgpIGNvbnN0CisgICAgICAgIHsKKyAg
ICAgICAgICAgIHJldHVybiBtX3ZhbHVlID4+IDMyICYgMHhmZmZmZmZmZjsKKyAgICAgICAgfQor
CisgICAgICAgIEluZGV4VHlwZSBzZWNvbmQoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbV92YWx1ZSAmIDB4ZmZmZmZmZmY7CisgICAgICAgIH0KKworICAgICAgICBib29s
IG9wZXJhdG9yPT0oY29uc3QgSW50ZXJmZXJlbmNlRWRnZSBvdGhlcikgY29uc3QKKyAgICAgICAg
eworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgPT0gb3RoZXIubV92YWx1ZTsKKyAgICAgICAg
fQorCisgICAgICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSBjb25zdAorICAgICAg
ICB7CisgICAgICAgICAgICByZXR1cm4gKnRoaXMgPT0gSW50ZXJmZXJlbmNlRWRnZShXVEY6Okhh
c2hUYWJsZURlbGV0ZWRWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBoYXNo
KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdURjo6SW50SGFzaDx1aW50
NjRfdD46Omhhc2gobV92YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGR1bXAoUHJp
bnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LnByaW50KGZp
cnN0KCksICI8PT4iLCBzZWNvbmQoKSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIHVpbnQ2NF90IG1fdmFsdWUgeyAwIH07CisgICAgfTsKKworICAgIHN0cnVjdCBJbnRlcmZl
cmVuY2VFZGdlSGFzaCB7CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEludGVy
ZmVyZW5jZUVkZ2UmIGtleSkgeyByZXR1cm4ga2V5Lmhhc2goKTsgfQorICAgICAgICBzdGF0aWMg
Ym9vbCBlcXVhbChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBhLCBjb25zdCBJbnRlcmZlcmVuY2VF
ZGdlJiBiKSB7IHJldHVybiBhID09IGI7IH0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgc2Fm
ZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworICAgIH07CisgICAgdHlwZWRlZiBT
aW1wbGVDbGFzc0hhc2hUcmFpdHM8SW50ZXJmZXJlbmNlRWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhh
c2hUcmFpdHM7CisKKyAgICBjb25zdCBWZWN0b3I8UmVnPiYgbV9yZWdzSW5Qcmlvcml0eU9yZGVy
OworICAgIEluZGV4VHlwZSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsKKwor
ICAgIC8vIFRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCisgICAgSGFzaFNldDxJbnRlcmZlcmVuY2VF
ZGdlLCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1f
aW50ZXJmZXJlbmNlRWRnZXM7CisgICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2Fm
ZVZlY3Rvck92ZXJmbG93LCA0PiwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5
TGlzdDsKKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9k
ZWdyZWVzOworCisgICAgLy8gSW5zdGVhZCBvZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGlu
c3RydWN0aW9ucywgd2UganVzdCBrZWVwIHRoZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRo
ZSBpbmRleAorICAgIC8vIGluIHRoZSB2ZWN0b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3IgdGhl
IG1vdmUuCisgICAgc3RydWN0IE1vdmVPcGVyYW5kcyB7CisgICAgICAgIEluZGV4VHlwZSBzcmNJ
bmRleDsKKyAgICAgICAgSW5kZXhUeXBlIGRzdEluZGV4OworICAgIH07CisgICAgVmVjdG9yPE1v
dmVPcGVyYW5kcywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0
ZXM7CisKKyAgICAvLyBMaXN0IG9mIGV2ZXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3
aXRoIGEgVG1wLgorICAgIFZlY3RvcjxIYXNoU2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVs
dEhhc2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0
czxJbmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsKKworICAgIC8vIENvbG9ycy4KKyAgICBWZWN0b3I8
UmVnLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2xvcmVkVG1wOworICAgIFZlY3RvcjxJ
bmRleFR5cGU+IG1fc3BpbGxlZFRtcHM7CisKKyAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4g
Y29hbGVzY2VkIHdpdGggYW4gb3RoZXIgdmFsdWUuCisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwg
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wczsKKworICAgIC8vIFRoZSBzdGFj
ayBvZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgor
ICAgIEJpdFZlY3RvciBtX2lzT25TZWxlY3RTdGFjazsKKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBt
X3NlbGVjdFN0YWNrOworCisgICAgc3RydWN0IE9yZGVyZWRNb3ZlU2V0IHsKKyAgICAgICAgdW5z
aWduZWQgYWRkTW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG5leHRJbmRl
eCA9IG1fbW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQobmV4
dEluZGV4KTsKKyAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0LmFwcGVuZChuZXh0SW5k
ZXgpOworICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX21v
dmVMaXN0LmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgY29udGFpbnModW5z
aWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdFtpbmRleF0gIT0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOwor
ICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0YWtlTW92ZSh1bnNpZ25lZCBtb3ZlSW5kZXgpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uSW5Nb3ZlTGlzdCA9IG1fcG9z
aXRpb25Jbk1vdmVMaXN0W21vdmVJbmRleF07CisgICAgICAgICAgICBpZiAocG9zaXRpb25Jbk1v
dmVMaXN0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIEFTU0VSVChtX21vdmVMaXN0W3Bvc2l0aW9u
SW5Nb3ZlTGlzdF0gPT0gbW92ZUluZGV4KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJbmRl
eCA9IG1fbW92ZUxpc3QubGFzdCgpOworICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3Rb
bGFzdEluZGV4XSA9IHBvc2l0aW9uSW5Nb3ZlTGlzdDsKKyAgICAgICAgICAgIG1fbW92ZUxpc3Rb
cG9zaXRpb25Jbk1vdmVMaXN0XSA9IGxhc3RJbmRleDsKKyAgICAgICAgICAgIG1fbW92ZUxpc3Qu
cmVtb3ZlTGFzdCgpOworCisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFttb3ZlSW5k
ZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworCisgICAgICAgICAg
ICBBU1NFUlQoIWNvbnRhaW5zKG1vdmVJbmRleCkpOworICAgICAgICB9CisKKyAgICAgICAgdW5z
aWduZWQgdGFrZUxhc3RNb3ZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKCFpc0Vt
cHR5KCkpOworCisgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXggPSBtX21vdmVMaXN0LnRh
a2VMYXN0KCk7CisgICAgICAgICAgICBBU1NFUlQobV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdElu
ZGV4XSA9PSBtX21vdmVMaXN0LnNpemUoKSk7CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3Zl
TGlzdFtsYXN0SW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOwor
CisgICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKGxhc3RJbmRleCkpOworICAgICAgICAgICAg
cmV0dXJuIGxhc3RJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmV0dXJuTW92ZSh1
bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBhc3NlcnRpb24g
aXMgYSBiaXQgc3RyaWN0IGJ1dCB0aGF0IGlzIGhvdyB0aGUgbW92ZSBsaXN0IHNob3VsZCBiZSB1
c2VkLiBUaGUgb25seSBraW5kIG9mIG1vdmVzIHRoYXQgY2FuCisgICAgICAgICAgICAvLyByZXR1
cm4gdG8gdGhlIGxpc3QgYXJlIHRoZSBvbmVzIHRoYXQgd2UgcHJldmlvdXNseSBmYWlsZWQgdG8g
Y29hbGVzY2Ugd2l0aCB0aGUgY29uc2VydmF0aXZlIGhldXJpc3RpY3MuCisgICAgICAgICAgICAv
LyBWYWx1ZXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBiYWNrIGlmIHRoZXkgd2VyZSBuZXZlciB0YWtl
biBvdXQgd2hlbiBhdHRlbXB0aW5nIGNvYWxlc2NpbmcuCisgICAgICAgICAgICBBU1NFUlQoIWNv
bnRhaW5zKGluZGV4KSk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9tb3Zl
TGlzdC5zaXplKCk7CisgICAgICAgICAgICBtX21vdmVMaXN0LmFwcGVuZChpbmRleCk7CisgICAg
ICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gPSBwb3NpdGlvbjsKKworICAgICAg
ICAgICAgQVNTRVJUKGNvbnRhaW5zKGluZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lk
IGNsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3QuY2xl
YXIoKTsKKyAgICAgICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAg
cHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxv
dz4gbV9wb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5z
YWZlVmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7CisgICAgfTsKKworICAgIC8vIFdvcmsgbGlz
dHMuCisgICAgLy8gU2V0IG9mICJtb3ZlIiBlbmFibGVkIGZvciBwb3NzaWJsZSBjb2FsZXNjaW5n
LgorICAgIE9yZGVyZWRNb3ZlU2V0IG1fd29ya2xpc3RNb3ZlczsKKyAgICAvLyBTZXQgb2YgIm1v
dmUiIG5vdCB5ZXQgcmVhZHkgZm9yIGNvYWxlc2NpbmcuCisgICAgQml0VmVjdG9yIG1fYWN0aXZl
TW92ZXM7CisgICAgLy8gTG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVsYXRlZC4KKyAgICBWZWN0b3I8
SW5kZXhUeXBlPiBtX3NpbXBsaWZ5V29ya2xpc3Q7CisgICAgLy8gSGlnaC1kZWdyZWUgVG1wLgor
ICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX3NwaWxsV29ya2xpc3Q7CisgICAgLy8gTG93LWRlZ3Jl
ZSwgTW92ZSByZWxhdGVkLgorICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6ZVdvcmtsaXN0
OworCisgICAgYm9vbCBtX2hhc1NlbGVjdGVkU3BpbGwgeyBmYWxzZSB9OworICAgIGJvb2wgbV9o
YXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSB7IGZhbHNlIH07CisKKyAgICAvLyBUaGUgbWFwcGlu
ZyBvZiBUbXAgdG8gdGhlaXIgYWxpYXMgZm9yIE1vdmVzIHRoYXQgYXJlIGFsd2F5cyBjb2FsZXNj
aW5nIHJlZ2FyZGxlc3Mgb2Ygc3BpbGxpbmcuCisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5z
YWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wc0F0U3BpbGw7Cit9OworCiB0ZW1wbGF0
ZTxBcmc6OlR5cGUgdHlwZT4KLWNsYXNzIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2Nh
dG9yIHsKK2NsYXNzIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9yIDogcHVibGlj
IEFic3RyYWN0SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I8dW5zaWduZWQ+IHsK
IHB1YmxpYzoKLSAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcigKLSAgICAg
ICAgQ29kZSYgY29kZSwgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFz
aFNldDxUbXA+JiB1bnNwaWxsYWJsZVRtcCkKLSAgICAgICAgOiBtX2NvZGUoY29kZSkKKyAgICBJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcihDb2RlJiBjb2RlLCBjb25zdCBVc2VD
b3VudHM8VG1wPiYgdXNlQ291bnRzLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFi
bGVUbXApCisgICAgICAgIDogQWJzdHJhY3RJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9j
YXRvcjx1bnNpZ25lZD4ocmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKSwgQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUoY29kZSkp
CisgICAgICAgICwgbV9jb2RlKGNvZGUpCiAgICAgICAgICwgbV91c2VDb3VudHModXNlQ291bnRz
KQotICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXAodW5zcGlsbGFibGVUbXApCi0gICAgICAgICwg
bV9udW1iZXJPZlJlZ2lzdGVycyhyZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpLnNpemUoKSkKKyAg
ICAgICAgLCBtX3Vuc3BpbGxhYmxlVG1wcyh1bnNwaWxsYWJsZVRtcCkKICAgICB7Ci0gICAgICAg
IGluaXRpYWxpemVEZWdyZWVzKCk7Ci0KLSAgICAgICAgdW5zaWduZWQgdG1wQXJyYXlTaXplID0g
dGhpcy0+dG1wQXJyYXlTaXplKCk7Ci0gICAgICAgIG1fYWRqYWNlbmN5TGlzdC5yZXNpemUodG1w
QXJyYXlTaXplKTsKLSAgICAgICAgbV9tb3ZlTGlzdC5yZXNpemUodG1wQXJyYXlTaXplKTsKLSAg
ICAgICAgbV9jb2FsZXNjZWRUbXBzLnJlc2l6ZSh0bXBBcnJheVNpemUpOwotICAgICAgICBtX2lz
T25TZWxlY3RTdGFjay5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZSk7Ci0KKyAgICAgICAgaW5pdGlh
bGl6ZVByZWNvbG9yZWRUbXAoKTsKICAgICAgICAgYnVpbGQoKTsKICAgICAgICAgYWxsb2NhdGUo
KTsKICAgICB9CiAKICAgICBUbXAgZ2V0QWxpYXMoVG1wIHRtcCkgY29uc3QKICAgICB7Ci0gICAg
ICAgIFRtcCBhbGlhcyA9IHRtcDsKLSAgICAgICAgd2hpbGUgKFRtcCBuZXh0QWxpYXMgPSBtX2Nv
YWxlc2NlZFRtcHNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYWxpYXMp
XSkKLSAgICAgICAgICAgIGFsaWFzID0gbmV4dEFsaWFzOwotICAgICAgICByZXR1cm4gYWxpYXM7
CisgICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRl
SW5kZXgoZ2V0QWxpYXMoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1w
KSkpOwogICAgIH0KIAogICAgIFRtcCBnZXRBbGlhc1doZW5TcGlsbGluZyhUbXAgdG1wKSBjb25z
dAogICAgIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wLmlzRW1w
dHkoKSwgIlRoaXMgZnVuY3Rpb24gaXMgb25seSB2YWxpZCBmb3IgY29hbGVzY2luZyBkdXJpbmcg
c3BpbGxpbmcuIik7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMu
aXNFbXB0eSgpLCAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBjb2FsZXNjaW5nIGR1
cmluZyBzcGlsbGluZy4iKTsKIAogICAgICAgICBpZiAobV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5p
c0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdG1wOwogCi0gICAgICAgIFRtcCBhbGlhcyA9
IHRtcDsKLSAgICAgICAgd2hpbGUgKFRtcCBuZXh0QWxpYXMgPSBtX2NvYWxlc2NlZFRtcHNBdFNw
aWxsW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFsaWFzKV0pCi0gICAg
ICAgICAgICBhbGlhcyA9IG5leHRBbGlhczsKKyAgICAgICAgdW5zaWduZWQgYWxpYXNJbmRleCA9
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAgICAgIHdo
aWxlICh1bnNpZ25lZCBuZXh0QWxpYXNJbmRleCA9IG1fY29hbGVzY2VkVG1wc0F0U3BpbGxbYWxp
YXNJbmRleF0pCisgICAgICAgICAgICBhbGlhc0luZGV4ID0gbmV4dEFsaWFzSW5kZXg7CisKKyAg
ICAgICAgVG1wIGFsaWFzID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0
ZUluZGV4KGFsaWFzSW5kZXgpOwogCi0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3Bp
bGxlZFRtcC5jb250YWlucyh0bXApIHx8IGFsaWFzID09IHRtcCwgIlRoZSBhbGlhc2VzIGF0IHNw
aWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcgd2VudCBob3JyaWJseSB3
cm9uZy4iKTsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wcy5jb250
YWlucyhhbGlhc0luZGV4KSB8fCBhbGlhcyA9PSB0bXAsICJUaGUgYWxpYXNlcyBhdCBzcGlsbCBz
aG91bGQgYWx3YXlzIGJlIGNvbG9yYWJsZS4gU29tZXRoaW5nIHdlbnQgaG9ycmlibHkgd3Jvbmcu
Iik7CiAKICAgICAgICAgcmV0dXJuIGFsaWFzOwogICAgIH0KIAotICAgIGNvbnN0IEhhc2hTZXQ8
VG1wPiYgc3BpbGxlZFRtcCgpIGNvbnN0IHsgcmV0dXJuIG1fc3BpbGxlZFRtcDsgfQorICAgIHRl
bXBsYXRlPHR5cGVuYW1lIEluZGV4SXRlcmF0b3I+CisgICAgY2xhc3MgSW5kZXhUb1RtcEl0ZXJh
dG9yQWRhcHRvciB7CisgICAgcHVibGljOgorICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFw
dG9yKEluZGV4SXRlcmF0b3ImJiBpbmRleEl0ZXJhdG9yKQorICAgICAgICAgICAgOiBtX2luZGV4
SXRlcmF0b3IoV1RGOjptb3ZlKGluZGV4SXRlcmF0b3IpKQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBUbXAgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCptX2luZGV4SXRlcmF0b3IpOyB9CisgICAg
ICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG9wZXJhdG9yKysoKSB7ICsrbV9pbmRleEl0
ZXJhdG9yOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qg
SW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAg
ICAgICAgIHJldHVybiBtX2luZGV4SXRlcmF0b3IgPT0gb3RoZXIubV9pbmRleEl0ZXJhdG9yOwor
ICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEluZGV4VG9UbXBJdGVy
YXRvckFkYXB0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4g
ISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIElu
ZGV4SXRlcmF0b3IgbV9pbmRleEl0ZXJhdG9yOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBDb2xsZWN0aW9uPgorICAgIGNsYXNzIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3Igewor
ICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcihjb25zdCBDb2xs
ZWN0aW9uJiBjb2xsZWN0aW9uKQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29sbGVjdGlv
bikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRh
cHRvcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvcj4gYmVnaW4oKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmJlZ2luKCk7CisgICAg
ICAgIH0KKworICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1lIENvbGxl
Y3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBlbmQoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbV9jb2xsZWN0aW9uLmVuZCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBjb25zdCBDb2xsZWN0aW9uJiBtX2NvbGxlY3Rpb247CisgICAgfTsKKworICAgIElu
ZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3I8VmVjdG9yPHVuc2lnbmVkPj4gc3BpbGxlZFRtcHMoKSBj
b25zdCB7IHJldHVybiBtX3NwaWxsZWRUbXBzOyB9CisKKyAgICBib29sIHJlcXVpcmVzU3BpbGxp
bmcoKSBjb25zdCB7IHJldHVybiAhbV9zcGlsbGVkVG1wcy5pc0VtcHR5KCk7IH0KKwogICAgIFJl
ZyBhbGxvY2F0ZWRSZWcoVG1wIHRtcCkgY29uc3QKICAgICB7CiAgICAgICAgIEFTU0VSVCghdG1w
LmlzUmVnKCkpOwpAQCAtMTQ0LDIzICs3NjQsMjAgQEAgcHVibGljOgogICAgIH0KIAogcHJpdmF0
ZToKLSAgICB1bnNpZ25lZCB0bXBBcnJheVNpemUoKQorICAgIHN0YXRpYyB1bnNpZ25lZCB0bXBB
cnJheVNpemUoQ29kZSYgY29kZSkKICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBt
X2NvZGUubnVtVG1wcyh0eXBlKTsKKyAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IGNvZGUubnVt
VG1wcyh0eXBlKTsKICAgICAgICAgcmV0dXJuIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KG51bVRtcHMpOwogICAgIH0KIAotICAgIHZvaWQgaW5pdGlhbGl6ZURlZ3JlZXMo
KQorICAgIHZvaWQgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKQogICAgIHsKLSAgICAgICAgdW5z
aWduZWQgdG1wQXJyYXlTaXplID0gdGhpcy0+dG1wQXJyYXlTaXplKCk7Ci0gICAgICAgIG1fZGVn
cmVlcy5yZXNpemUodG1wQXJyYXlTaXplKTsKLQotICAgICAgICAvLyBBbGwgcHJlY29sb3JlZCBy
ZWdpc3RlcnMgaGF2ZSAgYW4gImluZmluaXRlIiBkZWdyZWUuCi0gICAgICAgIHVuc2lnbmVkIGZp
cnN0Tm9uUmVnSW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCgw
KTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpcnN0Tm9uUmVnSW5kZXg7ICsr
aSkKLSAgICAgICAgICAgIG1fZGVncmVlc1tpXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWdu
ZWQ+OjptYXgoKTsKLQotICAgICAgICBiemVybyhtX2RlZ3JlZXMuZGF0YSgpICsgZmlyc3ROb25S
ZWdJbmRleCwgKHRtcEFycmF5U2l6ZSAtIGZpcnN0Tm9uUmVnSW5kZXgpICogc2l6ZW9mKHVuc2ln
bmVkKSk7CisgICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9sYXN0UHJlY29sb3JlZFJlZ2lz
dGVySW5kZXggKyAxKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSBtX2xhc3RQ
cmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsgKytpKSB7CisgICAgICAgICAgICBUbXAgdG1wID0gQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOworICAgICAgICAg
ICAgQVNTRVJUKHRtcC5pc1JlZygpKTsKKyAgICAgICAgICAgIG1fY29sb3JlZFRtcFtpXSA9IHRt
cC5yZWcoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgYnVpbGQoKQpAQCAtMjE0LDMz
NCArODMxLDU4IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBBU1NFUlQodXNlVG1wKTsKIAogICAg
ICAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMu
c2l6ZSgpOwotICAgICAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyB1c2VU
bXAsIGRlZlRtcCB9KTsKLQotICAgICAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldvcmtsaXN0
ID0gbV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKLSAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQo
bmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7
Ci0KLSAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6
ZSgpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4
ICsgMSk7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgQXJnJiBhcmcgOiBpbnN0LmFyZ3MpIHsK
LSAgICAgICAgICAgICAgICBhdXRvJiBsaXN0ID0gbV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcudG1wKCkpXTsKLSAgICAgICAgICAgICAgICBsaXN0
LmFkZChuZXh0TW92ZUluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChj
b25zdCBUbXAmIGxpdmVUbXAgOiBsb2NhbENhbGMubGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGxpdmVUbXAgIT0gdXNlVG1wKQotICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGRlZlRt
cCwgbGl2ZVRtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBuZXh0IGlu
c3RydWN0aW9uIGNvdWxkIGhhdmUgZWFybHkgY2xvYmJlcnMuIFdlIG5lZWQgdG8gY29uc2lkZXIg
dGhvc2Ugbm93LgotICAgICAgICAgICAgaWYgKG5leHRJbnN0ICYmIG5leHRJbnN0LT5oYXNTcGVj
aWFsKCkpIHsKLSAgICAgICAgICAgICAgICBuZXh0SW5zdC0+ZXh0cmFFYXJseUNsb2JiZXJlZFJl
Z3MoKS5mb3JFYWNoKAotICAgICAgICAgICAgICAgICAgICBbJl0gKFJlZyByZWcpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChyZWcuaXNHUFIoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDog
bG9jYWxDYWxjLmxpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRF
ZGdlKFRtcChyZWcpLCBsaXZlVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGFkZEVkZ2VzKGluc3QsIG5leHRJ
bnN0LCBsb2NhbENhbGMubGl2ZSgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEVkZ2VzKEluc3Qm
IGluc3QsIEluc3QqIG5leHRJbnN0LCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxD
YWxjOjpJdGVyYWJsZSBsaXZlVG1wcykKLSAgICB7Ci0gICAgICAgIC8vIEFsbCB0aGUgRGVmKClz
IGludGVyZmVyZSB3aXRoIGV2ZXJ0aGluZyBsaXZlLgotICAgICAgICBpbnN0LmZvckVhY2hUbXBX
aXRoRXh0cmFDbG9iYmVyZWRSZWdzKAotICAgICAgICAgICAgbmV4dEluc3QsCi0gICAgICAgICAg
ICBbJl0gKGNvbnN0IFRtcCYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUp
IHsKLSAgICAgICAgICAgICAgICBpZiAoIUFyZzo6aXNEZWYocm9sZSkgfHwgYXJnVHlwZSAhPSB0
eXBlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgCi0gICAg
ICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsaXZlVG1wcykgewotICAgICAg
ICAgICAgICAgICAgICBpZiAobGl2ZVRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpHUCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGFyZywgbGl2ZVRtcCk7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRFZGdlKGNvbnN0
IFRtcCYgYSwgY29uc3QgVG1wJiBiKQotICAgIHsKLSAgICAgICAgaWYgKGEgPT0gYikKLSAgICAg
ICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50
ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgewotICAgICAgICAgICAgaWYgKCFhLmlz
UmVnKCkpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhKV0uY29udGFpbnMoYikpOwotICAgICAg
ICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChhKV0uYXBwZW5kKGIpOwotICAgICAgICAgICAgICAgIG1fZGVncmVlc1tBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhKV0rKzsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKCFiLmlzUmVnKCkpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoIW1f
YWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKV0u
Y29udGFpbnMoYSkpOwotICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKV0uYXBwZW5kKGEpOwotICAgICAgICAgICAg
ICAgIG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKV0r
KzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgbWFrZVdvcmtM
aXN0KCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGZpcnN0Tm9uUmVnSW5kZXggPSBBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCgwKTsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gZmlyc3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsraSkgewotICAg
ICAgICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOwotICAgICAgICAgICAgaWYg
KCFkZWdyZWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFRtcCB0
bXAgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoaSk7Ci0K
LSAgICAgICAgICAgIGlmIChkZWdyZWUgPj0gbV9udW1iZXJPZlJlZ2lzdGVycykKLSAgICAgICAg
ICAgICAgICBtX3NwaWxsV29ya2xpc3QuYWRkKHRtcCk7Ci0gICAgICAgICAgICBlbHNlIGlmICgh
bV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXS5p
c0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wKTsKLSAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5k
KHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNpbXBsaWZ5KCkKLSAgICB7Ci0g
ICAgICAgIFRtcCBsYXN0ID0gbV9zaW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7Ci0KLSAgICAg
ICAgQVNTRVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5zKGxhc3QpKTsKLSAgICAgICAgQVNTRVJU
KCFtX2lzT25TZWxlY3RTdGFjay5nZXQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRl
SW5kZXgobGFzdCkpKTsKLSAgICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdCk7Ci0gICAg
ICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KGxhc3QpKTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdCwgW3Ro
aXNdKFRtcCBhZGphY2VudFRtcCkgewotICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFj
ZW50VG1wKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rpb24+Ci0gICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQoVG1wIHRtcCwgRnVuY3Rpb24gZnVuY3Rp
b24pCi0gICAgewotICAgICAgICBmb3IgKFRtcCBhZGphY2VudFRtcCA6IG1fYWRqYWNlbmN5TGlz
dFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSkgewotICAgICAg
ICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcCkpCi0gICAgICAgICAgICAg
ICAgZnVuY3Rpb24oYWRqYWNlbnRUbXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBo
YXNCZWVuU2ltcGxpZmllZChUbXAgdG1wKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1faXNPblNl
bGVjdFN0YWNrLnF1aWNrR2V0KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHRtcCkpIHx8ICEhbV9jb2FsZXNjZWRUbXBzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KHRtcCldOwotICAgIH0KLQotICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKFRtcCB0
bXApCi0gICAgewotICAgICAgICBBU1NFUlQobV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKTsKLQotICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUg
PSBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0t
LTsKLSAgICAgICAgaWYgKG9sZERlZ3JlZSA9PSBtX251bWJlck9mUmVnaXN0ZXJzKSB7Ci0gICAg
ICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wKTsKLSAgICAgICAgICAg
IG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodG1wKTsKLSAgICAgICAgICAgIGlmIChpc01vdmVSZWxh
dGVkKHRtcCkpCi0gICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wKTsKLSAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5k
KHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlv
bj4KLSAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoVG1wIHRtcCwgRnVuY3Rpb24gZnVuY3Rpb24p
Ci0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pIHsKLSAgICAgICAgICAg
IGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVz
LmNvbnRhaW5zKG1vdmVJbmRleCkpCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaXNNb3ZlUmVsYXRlZChUbXAgdG1wKQot
ICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W0Fic29s
dXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKSB7Ci0gICAgICAgICAgICBp
ZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5j
b250YWlucyhtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
ICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZU1vdmVz
T25WYWx1ZShUbXAgdG1wKQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXgg
OiBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCld
KSB7Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRleCkp
Ci0gICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnJldHVybk1vdmUobW92ZUluZGV4KTsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNl
bnRzKFRtcCB0bXApCi0gICAgewotICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wKTsKLQot
ICAgICAgICBmb3JFYWNoQWRqYWNlbnQodG1wLCBbdGhpc10gKFRtcCBhZGphY2VudFRtcCkgewot
ICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFjZW50VG1wKTsKLSAgICAgICAgfSk7
Ci0gICAgfQotCi0gICAgdm9pZCBjb2FsZXNjZSgpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBt
b3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3ZlKCk7Ci0gICAgICAgIGNvbnN0
IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3Zl
SW5kZXhdOwotICAgICAgICBUbXAgdSA9IG1vdmVPcGVyYW5kcy5zcmM7Ci0gICAgICAgIHUgPSBn
ZXRBbGlhcyh1KTsKLSAgICAgICAgVG1wIHYgPSBtb3ZlT3BlcmFuZHMuZHN0OwotICAgICAgICB2
ID0gZ2V0QWxpYXModik7Ci0KLSAgICAgICAgaWYgKHYuaXNSZWcoKSkKLSAgICAgICAgICAgIHN0
ZDo6c3dhcCh1LCB2KTsKLQotICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgIGRh
dGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCIsIG1vdmVJbmRleCwgIiB1ID0gIiwgdSwg
IiB2ID0gIiwgdiwgIlxuIik7Ci0KLSAgICAgICAgaWYgKHUgPT0gdikgewotICAgICAgICAgICAg
YWRkV29ya0xpc3QodSk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOwotICAgICAgICB9IGVsc2UgaWYgKHYu
aXNSZWcoKSB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2Uo
dSwgdikpKSB7Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLSAgICAgICAgICAgIGFkZFdv
cmtMaXN0KHYpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOwotICAgICAgICB9IGVsc2UgaWYgKGNhbkJl
U2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7Ci0gICAgICAgICAgICBjb21iaW5lKHUsIHYpOwotICAg
ICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0gICAgICAgICAgICBtX2hhc0NvYWxlc2NlZE5vblRy
aXZpYWxNb3ZlID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1aWNrU2V0KG1vdmVJbmRleCk7Ci0KLSAg
ICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBG
YWlsZWQgY29hbGVzY2luZywgYWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBib29sIGNhbkJlU2FmZWx5Q29hbGVzY2VkKFRtcCB1LCBUbXAgdikKLSAg
ICB7Ci0gICAgICAgIEFTU0VSVCghdi5pc1JlZygpKTsKLSAgICAgICAgaWYgKHUuaXNSZWcoKSkK
LSAgICAgICAgICAgIHJldHVybiBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyh1LCB2KTsK
LSAgICAgICAgcmV0dXJuIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyh1LCB2KTsKLSAgICB9Ci0KLSAg
ICBib29sIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljKFRtcCB1LCBUbXAgdikKLSAgICB7
Ci0gICAgICAgIEFTU0VSVCh1LmlzUmVnKCkpOwotICAgICAgICBBU1NFUlQoIXYuaXNSZWcoKSk7
Ci0KLSAgICAgICAgLy8gSWYgYW55IGFkamFjZW50IG9mIHRoZSBub24tY29sb3JlZCBub2RlIGlz
IG5vdCBhbiBhZGphY2VudCBvZiB0aGUgY29sb3JlZCBub2RlIEFORCBoYXMgYSBkZWdyZWUgPj0g
SwotICAgICAgICAvLyB0aGVyZSBpcyBhIHJpc2sgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gaGF2
ZSB0aGUgc2FtZSBjb2xvciBhcyBvdXIgcHJlY29sb3JlZCBub2RlLiBJZiB3ZSBjb2FsZXNjZSBz
dWNoCi0gICAgICAgIC8vIG1vdmUsIHdlIG1heSBjcmVhdGUgYW4gdW5jb2xvcmFibGUgZ3JhcGgu
Ci0gICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFtBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh2KV07Ci0gICAgICAgIGZvciAoVG1w
IGFkamFjZW50VG1wIDogYWRqYWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBpZiAoIWFkamFjZW50
VG1wLmlzUmVnKCkKLSAgICAgICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNl
bnRUbXApCi0gICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KGFkamFjZW50VG1wKV0gPj0gbV9udW1iZXJPZlJlZ2lzdGVycwot
ICAgICAgICAgICAgICAgICYmICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVy
ZW5jZUVkZ2UodSwgYWRqYWNlbnRUbXApKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBjb25z
ZXJ2YXRpdmVIZXVyaXN0aWMoVG1wIHUsIFRtcCB2KQotICAgIHsKLSAgICAgICAgLy8gVGhpcyBp
cyB1c2luZyB0aGUgQnJpZ2dzJyBjb25zZXJ2YXRpdmUgY29hbGVzY2luZyBydWxlOgotICAgICAg
ICAvLyBJZiB0aGUgbnVtYmVyIG9mIGNvbWJpbmVkIGFkamFjZW50IG5vZGUgd2l0aCBhIGRlZ3Jl
ZSA+PSBLIGlzIGxlc3MgdGhhbiBLLAotICAgICAgICAvLyBpdCBpcyBzYWZlIHRvIGNvbWJpbmUg
dGhlIHR3byBub2Rlcy4gVGhlIHJlYXNvbiBpcyB0aGF0IHdlIGtub3cgdGhhdCBpZiB0aGUgZ3Jh
cGgKLSAgICAgICAgLy8gaXMgY29sb3JhYmxlLCB3ZSBoYXZlIGZld2VyIHRoYW4gSyBhZGphY2Vu
dHMgd2l0aCBoaWdoIG9yZGVyIGFuZCB0aGVyZSBpcyBhIGNvbG9yCi0gICAgICAgIC8vIGZvciB0
aGUgY3VycmVudCBub2RlLgotICAgICAgICBBU1NFUlQodSAhPSB2KTsKLSAgICAgICAgQVNTRVJU
KCF1LmlzUmVnKCkpOwotICAgICAgICBBU1NFUlQoIXYuaXNSZWcoKSk7Ci0KLSAgICAgICAgY29u
c3QgYXV0byYgYWRqYWNlbnRzT2ZVID0gbV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KHUpXTsKLSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRz
T2ZWID0gbV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KHYpXTsKLQotICAgICAgICBpZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09m
Vi5zaXplKCkgPCBtX251bWJlck9mUmVnaXN0ZXJzKSB7Ci0gICAgICAgICAgICAvLyBTaG9ydGN1
dDogaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhZGphY2VudHMgaXMgbGVzcyB0aGFuIHRoZSBudW1i
ZXIgb2YgcmVnaXN0ZXIsIHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIG1ldC4KLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgSGFzaFNldDxUbXA+IGhpZ2hPcmRl
ckFkamFjZW50czsKLQotICAgICAgICBmb3IgKFRtcCBhZGphY2VudFRtcCA6IGFkamFjZW50c09m
VSkgewotICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wICE9IHYpOwotICAgICAgICAgICAg
QVNTRVJUKGFkamFjZW50VG1wICE9IHUpOwotICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxp
ZmllZChhZGphY2VudFRtcCkgJiYgbV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KGFkamFjZW50VG1wKV0gPj0gbV9udW1iZXJPZlJlZ2lzdGVycykgewotICAg
ICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGph
Y2VudFRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhp
Z2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9udW1iZXJPZlJlZ2lzdGVycykKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
ICAgIGZvciAoVG1wIGFkamFjZW50VG1wIDogYWRqYWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBB
U1NFUlQoYWRqYWNlbnRUbXAgIT0gdSk7Ci0gICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXAg
IT0gdik7Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wKSAm
JiBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYWRqYWNl
bnRUbXApXSA+PSBtX251bWJlck9mUmVnaXN0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBh
ZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wKTsKLSAgICAgICAg
ICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNp
emUoKSA+PSBtX251bWJlck9mUmVnaXN0ZXJzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBU1NFUlQoaGlnaE9y
ZGVyQWRqYWNlbnRzLnNpemUoKSA8IG1fbnVtYmVyT2ZSZWdpc3RlcnMpOwotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFdvcmtMaXN0KFRtcCB0bXApCi0gICAgewot
ICAgICAgICBpZiAoIXRtcC5pc1JlZygpICYmIG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSA8IG1fbnVtYmVyT2ZSZWdpc3RlcnMgJiYgIWlzTW92
ZVJlbGF0ZWQodG1wKSkgewotICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1w
KTsKLSAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wKTsKLSAgICAgICAg
fQotICAgIH0KKyAgICAgICAgICAgIG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodXNlVG1wKSwgQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoZGVmVG1wKSB9KTsKIAotICAgIHZvaWQgY29tYmlu
ZShUbXAgdSwgVG1wIHYpCi0gICAgewotICAgICAgICBpZiAoIW1fZnJlZXplV29ya2xpc3QucmVt
b3ZlKHYpKQotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2KTsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRNb3Zl
KCk7CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5k
ZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOwogCi0gICAgICAgIEFTU0VSVCghbV9jb2Fs
ZXNjZWRUbXBzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHYpXSk7Ci0g
ICAgICAgIG1fY29hbGVzY2VkVG1wc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleCh2KV0gPSB1OworICAgICAgICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9hY3Rp
dmVNb3Zlcy5zaXplKCkpOworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXplKG5l
eHRNb3ZlSW5kZXggKyAxKTsKIAotICAgICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVMaXN0W0Fi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHYpXTsKLSAgICAgICAgbV9tb3Zl
TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh1KV0uYWRkKHZNb3Zl
cy5iZWdpbigpLCB2TW92ZXMuZW5kKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBBcmcmIGFy
ZyA6IGluc3QuYXJncykgeworICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0
W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOworICAg
ICAgICAgICAgICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5kZXgpOworICAgICAgICAgICAgfQogCi0g
ICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywgdV0gKFRtcCBhZGphY2VudFRtcCkgewot
ICAgICAgICAgICAgYWRkRWRnZShhZGphY2VudFRtcCwgdSk7Ci0gICAgICAgICAgICBkZWNyZW1l
bnREZWdyZWUoYWRqYWNlbnRUbXApOwotICAgICAgICB9KTsKKyAgICAgICAgICAgIGZvciAoY29u
c3QgVG1wJiBsaXZlVG1wIDogbG9jYWxDYWxjLmxpdmUoKSkgeworICAgICAgICAgICAgICAgIGlm
IChsaXZlVG1wICE9IHVzZVRtcCkKKyAgICAgICAgICAgICAgICAgICAgYWRkRWRnZShkZWZUbXAs
IGxpdmVUbXApOworICAgICAgICAgICAgfQogCi0gICAgICAgIGlmIChtX2RlZ3JlZXNbQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodSldID49IG1fbnVtYmVyT2ZSZWdpc3Rl
cnMgJiYgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodSkpCi0gICAgICAgICAgICBtX3NwaWxsV29y
a2xpc3QuYWRkKHUpOworICAgICAgICAgICAgLy8gVGhlIG5leHQgaW5zdHJ1Y3Rpb24gY291bGQg
aGF2ZSBlYXJseSBjbG9iYmVycy4gV2UgbmVlZCB0byBjb25zaWRlciB0aG9zZSBub3cuCisgICAg
ICAgICAgICBpZiAobmV4dEluc3QgJiYgbmV4dEluc3QtPmhhc1NwZWNpYWwoKSkgeworICAgICAg
ICAgICAgICAgIG5leHRJbnN0LT5leHRyYUVhcmx5Q2xvYmJlcmVkUmVncygpLmZvckVhY2goWyZd
IChSZWcgcmVnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWcuaXNHUFIoKSA9PSAodHlw
ZSA9PSBBcmc6OkdQKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBUbXAm
IGxpdmVUbXAgOiBsb2NhbENhbGMubGl2ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFkZEVkZ2UoVG1wKHJlZyksIGxpdmVUbXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgYWRkRWRnZXMoaW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYy5saXZlKCkpOwogICAgIH0KIAot
ICAgIHZvaWQgZnJlZXplKCkKKyAgICB2b2lkIGFkZEVkZ2VzKEluc3QmIGluc3QsIEluc3QqIG5l
eHRJbnN0LCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxjOjpJdGVyYWJsZSBs
aXZlVG1wcykKICAgICB7Ci0gICAgICAgIFRtcCB2aWN0aW0gPSBtX2ZyZWV6ZVdvcmtsaXN0LnRh
a2VBbnkoKTsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShnZXRBbGlhcyh2aWN0aW0pID09
IHZpY3RpbSwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBhbGlhc2VkIFRtcCBpbiB0aGUg
d29ya2xpc3QuIik7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltKTsK
LSAgICAgICAgZnJlZXplTW92ZXModmljdGltKTsKKyAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMg
aW50ZXJmZXJlIHdpdGggZXZlcnRoaW5nIGxpdmUuCisgICAgICAgIGluc3QuZm9yRWFjaFRtcFdp
dGhFeHRyYUNsb2JiZXJlZFJlZ3MoCisgICAgICAgICAgICBuZXh0SW5zdCwKKyAgICAgICAgICAg
IFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSkg
eworICAgICAgICAgICAgICAgIGlmICghQXJnOjppc0RlZihyb2xlKSB8fCBhcmdUeXBlICE9IHR5
cGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBmb3IgKGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxpdmVUbXBzKSB7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChsaXZlVG1wLmlzR1AoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoYXJnLCBsaXZlVG1wKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICB2b2lkIGZyZWV6ZU1vdmVzKFRt
cCB0bXApCisgICAgdm9pZCBhZGRFZGdlKFRtcCBhLCBUbXAgYikKICAgICB7Ci0gICAgICAgIGZv
ckVhY2hOb2RlTW92ZXModG1wLCBbdGhpcywgdG1wXSAodW5zaWduZWQgbW92ZUluZGV4KSB7Ci0g
ICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQotICAg
ICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy50YWtlTW92ZShtb3ZlSW5kZXgpOworICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEuaXNHUCgpID09IGIuaXNHUCgpLCAiQW4gaW50ZXJmZXJl
bmNlIGJldHdlZW4gcmVnaXN0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBtYWtlIHNl
bnNlLCBpdCBjYW4gbGVhZCB0byBub24tY29sb3JhYmxlIGdyYXBocy4iKTsKIAotICAgICAgICAg
ICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRh
dGVzW21vdmVJbmRleF07Ci0gICAgICAgICAgICBUbXAgb3JpZ2luYWxPdGhlclRtcCA9IG1vdmVP
cGVyYW5kcy5zcmMgIT0gdG1wID8gbW92ZU9wZXJhbmRzLnNyYyA6IG1vdmVPcGVyYW5kcy5kc3Q7
Ci0gICAgICAgICAgICBUbXAgb3RoZXJUbXAgPSBnZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1wKTsK
LSAgICAgICAgICAgIGlmIChtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29s
dXRlSW5kZXgob3RoZXJUbXApXSA8IG1fbnVtYmVyT2ZSZWdpc3RlcnMgJiYgIWlzTW92ZVJlbGF0
ZWQob3RoZXJUbXApKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZnJlZXplV29ya2xpc3QucmVt
b3ZlKG90aGVyVG1wKSkKLSAgICAgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFw
cGVuZChvdGhlclRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBhZGRF
ZGdlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKSk7CiAgICAgfQogCiAgICAgdm9pZCBzZWxl
Y3RTcGlsbCgpCkBAIC01NTUsNyArODk2LDcgQEAgcHJpdmF0ZToKIAogICAgICAgICBhdXRvIGl0
ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0LmJlZ2luKCk7CiAKLSAgICAgICAgd2hpbGUgKGl0ZXJh
dG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSAmJiBtX3Vuc3BpbGxhYmxlVG1wLmNvbnRhaW5z
KCppdGVyYXRvcikpCisgICAgICAgIHdoaWxlIChpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3Qu
ZW5kKCkgJiYgbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSkKICAgICAgICAg
ICAgICsraXRlcmF0b3I7CiAKICAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0
ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBj
b2xvciB0aGUgQWlyIGdyYXBoIHdpdGggdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcmVnaXN0ZXJz
LiIpOwpAQCAtNTgwLDEzICs5MjEsMTMgQEAgcHJpdmF0ZToKICAgICAgICAgfTsKIAogICAgICAg
ICBhdXRvIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIGRvdWJsZSBtYXhTY29y
ZSA9IHNjb3JlKCppdGVyYXRvcik7CisgICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3JlKEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsK
IAogICAgICAgICArK2l0ZXJhdG9yOwogICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3NwaWxs
V29ya2xpc3QuZW5kKCk7ICsraXRlcmF0b3IpIHsKLSAgICAgICAgICAgIGRvdWJsZSB0bXBTY29y
ZSA9IHNjb3JlKCppdGVyYXRvcik7CisgICAgICAgICAgICBkb3VibGUgdG1wU2NvcmUgPSBzY29y
ZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9y
KSk7CiAgICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgewotICAgICAgICAgICAg
ICAgIGlmIChtX3Vuc3BpbGxhYmxlVG1wLmNvbnRhaW5zKCppdGVyYXRvcikpCisgICAgICAgICAg
ICAgICAgaWYgKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvcikpCiAgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgdmljdGltSXRlcmF0b3Ig
PSBpdGVyYXRvcjsKQEAgLTU5NCwxMCArOTM1LDExIEBAIHByaXZhdGU6CiAgICAgICAgICAgICB9
CiAgICAgICAgIH0KIAotICAgICAgICBUbXAgdmljdGltVG1wID0gKnZpY3RpbUl0ZXJhdG9yOwor
ICAgICAgICB1bnNpZ25lZCB2aWN0aW1JbmRleCA9ICp2aWN0aW1JdGVyYXRvcjsKICAgICAgICAg
bV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2aWN0aW1JdGVyYXRvcik7Ci0gICAgICAgIG1fc2ltcGxp
ZnlXb3JrbGlzdC5hcHBlbmQodmljdGltVG1wKTsKLSAgICAgICAgZnJlZXplTW92ZXModmljdGlt
VG1wKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisK
KyAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOwogICAgIH0KIAogICAgIHZvaWQgYWxs
b2NhdGUoKQpAQCAtNjM3LDY0ICs5NzksNiBAQCBwcml2YXRlOgogICAgICAgICBhc3NpZ25Db2xv
cnMoKTsKICAgICB9CiAKLSAgICB2b2lkIGFzc2lnbkNvbG9ycygpCi0gICAgewotICAgICAgICBB
U1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX3dv
cmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fZnJlZXplV29ya2xpc3Qu
aXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOwot
Ci0gICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCi0gICAgICAg
IG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKLSAgICAgICAgbV9kZWdyZWVzLmNsZWFyKCk7
Ci0gICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNs
ZWFyKCk7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVhcigpOwotICAgICAgICBtX3Nw
aWxsV29ya2xpc3QuY2xlYXIoKTsKLSAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5jbGVhcigpOwot
Ci0gICAgICAgIC8vIFRyeSB0byBjb2xvciB0aGUgVG1wIG9uIHRoZSBzdGFjay4KLSAgICAgICAg
bV9jb2xvcmVkVG1wLnJlc2l6ZShtX2FkamFjZW5jeUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgY29u
c3QgYXV0byYgcmVnaXN0ZXJzSW5Qcmlvcml0eU9yZGVyID0gcmVnc0luUHJpb3JpdHlPcmRlcih0
eXBlKTsKLQotICAgICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2suaXNFbXB0eSgpKSB7Ci0gICAg
ICAgICAgICBUbXAgdG1wID0gbV9zZWxlY3RTdGFjay50YWtlTGFzdCgpOwotICAgICAgICAgICAg
QVNTRVJUKCF0bXAuaXNSZWcoKSk7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fY29sb3JlZFRtcFtB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSk7Ci0KLSAgICAgICAg
ICAgIFJlZ2lzdGVyU2V0IGNvbG9yZWRSZWdpc3RlcnM7Ci0gICAgICAgICAgICBmb3IgKFRtcCBh
ZGphY2VudFRtcCA6IG1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleCh0bXApXSkgewotICAgICAgICAgICAgICAgIFRtcCBhbGlhc1RtcCA9IGdldEFs
aWFzKGFkamFjZW50VG1wKTsKLSAgICAgICAgICAgICAgICBpZiAoYWxpYXNUbXAuaXNSZWcoKSkg
ewotICAgICAgICAgICAgICAgICAgICBjb2xvcmVkUmVnaXN0ZXJzLnNldChhbGlhc1RtcC5yZWco
KSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OmFic29sdXRlSW5kZXgoYWxpYXNUbXApXTsKLSAgICAgICAgICAgICAgICBpZiAocmVn
KQotICAgICAgICAgICAgICAgICAgICBjb2xvcmVkUmVnaXN0ZXJzLnNldChyZWcpOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICBib29sIGNvbG9yQXNzaWduZWQgPSBmYWxzZTsKLSAgICAg
ICAgICAgIGZvciAoUmVnIHJlZyA6IHJlZ2lzdGVyc0luUHJpb3JpdHlPcmRlcikgewotICAgICAg
ICAgICAgICAgIGlmICghY29sb3JlZFJlZ2lzdGVycy5nZXQocmVnKSkgewotICAgICAgICAgICAg
ICAgICAgICBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgodG1wKV0gPSByZWc7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yQXNzaWduZWQgPSB0cnVl
OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKLSAgICAgICAgICAgICAg
ICBtX3NwaWxsZWRUbXAuYWRkKHRtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9zZWxlY3RTdGFj
ay5jbGVhcigpOwotCi0gICAgICAgIGlmIChtX3NwaWxsZWRUbXAuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKLSAgICB9Ci0KICNpZiBQTEFURk9STShDT0NP
QSkKICNwcmFnbWEgbWFyayAtIERlYnVnZ2luZyBoZWxwZXJzLgogI2VuZGlmCkBAIC03MDUsMjI2
ICs5ODksMzkgQEAgcHJpdmF0ZToKIAogICAgICAgICBIYXNoU2V0PFRtcD4gdG1wc1dpdGhJbnRl
cmZlcmVuY2VzOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5j
ZUVkZ2VzKSB7Ci0gICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKGVkZ2UuZmly
c3QoKSk7Ci0gICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKGVkZ2Uuc2Vjb25k
KCkpOworICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7CisgICAgICAg
ICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0
bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7CiAgICAgICAgIH0KIAogICAgICAg
ICBmb3IgKGNvbnN0IGF1dG8mIHRtcCA6IHRtcHNXaXRoSW50ZXJmZXJlbmNlcykKICAgICAgICAg
ICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwg
dG1wLCAiICgiLCBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgodG1wKV0sICIpXCJdO1xuIik7CiAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDog
bV9pbnRlcmZlcmVuY2VFZGdlcykKLSAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGVkZ2Uu
Zmlyc3QoKS5pbnRlcm5hbFZhbHVlKCksICIgLS0gIiwgZWRnZS5zZWNvbmQoKS5pbnRlcm5hbFZh
bHVlKCksICI7XG4iKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGVkZ2UuZmlyc3Qo
KSwgIiAtLSAiLCBlZGdlLnNlY29uZCgpLCAiO1xuIik7CiAgICAgICAgIG91dC5wcmludCgifVxu
Iik7CiAgICAgfQogCiAgICAgdm9pZCBkdW1wV29ya0xpc3RzKFByaW50U3RyZWFtJiBvdXQpCiAg
ICAgewogICAgICAgICBvdXQucHJpbnQoIlNpbXBsaWZ5IHdvcmsgbGlzdDpcbiIpOwotICAgICAg
ICBmb3IgKFRtcCB0bXAgOiBtX3NpbXBsaWZ5V29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJp
bnQoIiAgICAiLCB0bXAsICJcbiIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDog
bV9zaW1wbGlmeVdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7
CiAgICAgICAgIG91dC5wcmludGYoIk1vdmVzIHdvcmsgbGlzdCBpcyBlbXB0eT8gJWRcbiIsIG1f
d29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpOwogICAgICAgICBvdXQucHJpbnQoIkZyZWV6ZSB3b3Jr
IGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yIChUbXAgdG1wIDogbV9mcmVlemVXb3JrbGlzdCkKLSAg
ICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcCwgIlxuIik7CisgICAgICAgIGZvciAodW5z
aWduZWQgdG1wSW5kZXggOiBtX2ZyZWV6ZVdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50
KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRt
cEluZGV4KSwgIlxuIik7CiAgICAgICAgIG91dC5wcmludCgiU3BpbGwgd29yayBsaXN0OlxuIik7
Ci0gICAgICAgIGZvciAoVG1wIHRtcCA6IG1fc3BpbGxXb3JrbGlzdCkKLSAgICAgICAgICAgIG91
dC5wcmludCgiICAgICIsIHRtcCwgIlxuIik7CisgICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5k
ZXggOiBtX3NwaWxsV29ya2xpc3QpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4i
KTsKICAgICB9CiAKLSNpZiBQTEFURk9STShDT0NPQSkKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYK
LQotICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVkLiBBbiBlZGdlIGJl
dHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVkCi0gICAgLy8gYnkgdGhlIGNvbmNhdGVu
YXRlZCB2YWx1ZXMgb2YgdGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0aGUgYmlnZ2VyIFRt
cC4KLSAgICBjbGFzcyBJbnRlcmZlcmVuY2VFZGdlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIElu
dGVyZmVyZW5jZUVkZ2UoKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlcmZl
cmVuY2VFZGdlKFRtcCBhLCBUbXAgYikKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKGEu
aW50ZXJuYWxWYWx1ZSgpKTsKLSAgICAgICAgICAgIEFTU0VSVChiLmludGVybmFsVmFsdWUoKSk7
Ci0gICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEgIT0gYiwgIkEgVG1wIGNhbiBuZXZl
ciBpbnRlcmZlcmUgd2l0aCBpdHNlbGYuIERvaW5nIHNvIHdvdWxkIGZvcmNlIGl0IHRvIGJlIHRo
ZSBzdXBlcnBvc2l0aW9uIG9mIHR3byByZWdpc3RlcnMuIik7Ci0KLSAgICAgICAgICAgIHVuc2ln
bmVkIGFJbnRlcm5hbCA9IGEuaW50ZXJuYWxWYWx1ZSgpOwotICAgICAgICAgICAgdW5zaWduZWQg
YkludGVybmFsID0gYi5pbnRlcm5hbFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoYkludGVybmFs
IDwgYUludGVybmFsKQotICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChhSW50ZXJuYWwsIGJJbnRl
cm5hbCk7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGFJbnRl
cm5hbCkgPDwgMzIgfCBiSW50ZXJuYWw7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlcmZlcmVu
Y2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlVHlwZSkKLSAgICAgICAgICAgIDogbV92
YWx1ZShzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpCi0gICAgICAgIHsKLSAg
ICAgICAgfQotCi0gICAgICAgIFRtcCBmaXJzdCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAg
ICAgIHJldHVybiBUbXA6OnRtcEZvckludGVybmFsVmFsdWUobV92YWx1ZSA+PiAzMik7Ci0gICAg
ICAgIH0KLQotICAgICAgICBUbXAgc2Vjb25kKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAg
ICAgcmV0dXJuIFRtcDo6dG1wRm9ySW50ZXJuYWxWYWx1ZShtX3ZhbHVlICYgMHhmZmZmZmZmZik7
Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZXJmZXJlbmNl
RWRnZSBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUg
PT0gb3RoZXIubV92YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgaXNIYXNoVGFibGVE
ZWxldGVkVmFsdWUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXMg
PT0gSW50ZXJmZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZSk7Ci0gICAgICAg
IH0KLQotICAgICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAg
ICAgcmV0dXJuIFdURjo6SW50SGFzaDx1aW50NjRfdD46Omhhc2gobV92YWx1ZSk7Ci0gICAgICAg
IH0KLQotICAgICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKLSAgICAgICAg
ewotICAgICAgICAgICAgb3V0LnByaW50KGZpcnN0KCksICI8PT4iLCBzZWNvbmQoKSk7Ci0gICAg
ICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHVpbnQ2NF90IG1fdmFsdWUgeyAwIH07Ci0g
ICAgfTsKLQotICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7Ci0gICAgICAgIHN0YXRp
YyB1bnNpZ25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGtleSkgeyByZXR1cm4ga2V5
Lmhhc2goKTsgfQotICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBJbnRlcmZlcmVuY2VF
ZGdlJiBhLCBjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBiKSB7IHJldHVybiBhID09IGI7IH0KLSAg
ICAgICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0
cnVlOwotICAgIH07Ci0gICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hUcmFpdHM8SW50ZXJmZXJl
bmNlRWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM7CisgICAgdXNpbmcgQWJzdHJhY3RJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmFkZEVkZ2U7Cisg
ICAgdXNpbmcgQWJzdHJhY3RJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjx1bnNp
Z25lZD46OmdldEFsaWFzOwogCiAgICAgQ29kZSYgbV9jb2RlOworICAgIC8vIEZJWE1FOiBzcGls
bGluZyBzaG91bGQgbm90IHR5cGUgc3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBzaWRlIGVmZmVjdCBv
ZiB1c2luZyBVc2VDb3VudHMuCiAgICAgY29uc3QgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRz
OwotCi0gICAgY29uc3QgSGFzaFNldDxUbXA+JiBtX3Vuc3BpbGxhYmxlVG1wOwotICAgIHVuc2ln
bmVkIG1fbnVtYmVyT2ZSZWdpc3RlcnMgeyAwIH07Ci0KLSAgICAvLyBUaGUgaW50ZXJmZXJlbmNl
IGdyYXBoLgotICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhh
c2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOwotICAg
IFZlY3RvcjxWZWN0b3I8VG1wLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2Fm
ZVZlY3Rvck92ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7Ci0gICAgVmVjdG9yPHVuc2lnbmVkLCAw
LCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOwotCi0gICAgLy8gSW5zdGVhZCBvZiBr
ZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3RydWN0aW9ucywgd2UganVzdCBrZWVwIHRoZWly
IG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBpbmRleAotICAgIC8vIGluIHRoZSB2ZWN0b3Ig
YXMgdGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1vdmUuCi0gICAgc3RydWN0IE1vdmVPcGVyYW5k
cyB7Ci0gICAgICAgIFRtcCBzcmM7Ci0gICAgICAgIFRtcCBkc3Q7Ci0gICAgfTsKLSAgICBWZWN0
b3I8TW92ZU9wZXJhbmRzLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjaW5nQ2Fu
ZGlkYXRlczsKLQotICAgIC8vIExpc3Qgb2YgZXZlcnkgbW92ZSBpbnN0cnVjdGlvbiBhc3NvY2lh
dGVkIHdpdGggYSBUbXAuCi0gICAgVmVjdG9yPEhhc2hTZXQ8dW5zaWduZWQsIERlZmF1bHRIYXNo
PHVuc2lnbmVkPjo6SGFzaCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czx1bnNp
Z25lZD4+PiBtX21vdmVMaXN0OwotCi0gICAgLy8gQ29sb3JzLgotICAgIFZlY3RvcjxSZWcsIDAs
IFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvbG9yZWRUbXA7Ci0gICAgSGFzaFNldDxUbXA+IG1f
c3BpbGxlZFRtcDsKLQotICAgIC8vIFZhbHVlcyB0aGF0IGhhdmUgYmVlbiBjb2FsZXNjZWQgd2l0
aCBhbiBvdGhlciB2YWx1ZS4KLSAgICBWZWN0b3I8VG1wLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxv
dz4gbV9jb2FsZXNjZWRUbXBzOwotCi0gICAgLy8gVGhlIHN0YWNrIG9mIFRtcCByZW1vdmVkIGZy
b20gdGhlIGdyYXBoIGFuZCByZWFkeSBmb3IgY29sb3JpbmcuCi0gICAgQml0VmVjdG9yIG1faXNP
blNlbGVjdFN0YWNrOwotICAgIFZlY3RvcjxUbXA+IG1fc2VsZWN0U3RhY2s7Ci0KLSAgICBzdHJ1
Y3QgT3JkZXJlZE1vdmVTZXQgewotICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKLSAgICAgICAg
ewotICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9tb3ZlTGlzdC5zaXplKCk7Ci0g
ICAgICAgICAgICBtX21vdmVMaXN0LmFwcGVuZChuZXh0SW5kZXgpOwotICAgICAgICAgICAgbV9w
b3NpdGlvbkluTW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4g
bmV4dEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QKLSAg
ICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fbW92ZUxpc3QuaXNFbXB0eSgpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBpbmRleCkKLSAgICAgICAgewot
ICAgICAgICAgICAgcmV0dXJuIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSAhPSBzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lk
IHRha2VNb3ZlKHVuc2lnbmVkIG1vdmVJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgdW5z
aWduZWQgcG9zaXRpb25Jbk1vdmVMaXN0ID0gbV9wb3NpdGlvbkluTW92ZUxpc3RbbW92ZUluZGV4
XTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbkluTW92ZUxpc3QgPT0gc3RkOjpudW1lcmljX2xp
bWl0czx1bnNpZ25lZD46Om1heCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAg
ICAgICAgQVNTRVJUKG1fbW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9PSBtb3ZlSW5kZXgp
OwotICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4ID0gbV9tb3ZlTGlzdC5sYXN0KCk7Ci0g
ICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0gcG9zaXRpb25Jbk1v
dmVMaXN0OwotICAgICAgICAgICAgbV9tb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID0gbGFz
dEluZGV4OwotICAgICAgICAgICAgbV9tb3ZlTGlzdC5yZW1vdmVMYXN0KCk7Ci0KLSAgICAgICAg
ICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W21vdmVJbmRleF0gPSBzdGQ6Om51bWVyaWNfbGltaXRz
PHVuc2lnbmVkPjo6bWF4KCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVCghY29udGFpbnMobW92ZUlu
ZGV4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICB1bnNpZ25lZCB0YWtlTGFzdE1vdmUoKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQoIWlzRW1wdHkoKSk7Ci0KLSAgICAgICAgICAgIHVu
c2lnbmVkIGxhc3RJbmRleCA9IG1fbW92ZUxpc3QudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIEFT
U0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID09IG1fbW92ZUxpc3Quc2l6ZSgp
KTsKLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPSBzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVCghY29u
dGFpbnMobGFzdEluZGV4KSk7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdEluZGV4OwotICAgICAg
ICB9Ci0KLSAgICAgICAgdm9pZCByZXR1cm5Nb3ZlKHVuc2lnbmVkIGluZGV4KQotICAgICAgICB7
Ci0gICAgICAgICAgICAvLyBUaGlzIGFzc2VydGlvbiBpcyBhIGJpdCBzdHJpY3QgYnV0IHRoYXQg
aXMgaG93IHRoZSBtb3ZlIGxpc3Qgc2hvdWxkIGJlIHVzZWQuIFRoZSBvbmx5IGtpbmQgb2YgbW92
ZXMgdGhhdCBjYW4KLSAgICAgICAgICAgIC8vIHJldHVybiB0byB0aGUgbGlzdCBhcmUgdGhlIG9u
ZXMgdGhhdCB3ZSBwcmV2aW91c2x5IGZhaWxlZCB0byBjb2FsZXNjZSB3aXRoIHRoZSBjb25zZXJ2
YXRpdmUgaGV1cmlzdGljcy4KLSAgICAgICAgICAgIC8vIFZhbHVlcyBzaG91bGQgbm90IGJlIGFk
ZGVkIGJhY2sgaWYgdGhleSB3ZXJlIG5ldmVyIHRha2VuIG91dCB3aGVuIGF0dGVtcHRpbmcgY29h
bGVzY2luZy4KLSAgICAgICAgICAgIEFTU0VSVCghY29udGFpbnMoaW5kZXgpKTsKLQotICAgICAg
ICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX21vdmVMaXN0LnNpemUoKTsKLSAgICAgICAgICAg
IG1fbW92ZUxpc3QuYXBwZW5kKGluZGV4KTsKLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVM
aXN0W2luZGV4XSA9IHBvc2l0aW9uOwotCi0gICAgICAgICAgICBBU1NFUlQoY29udGFpbnMoaW5k
ZXgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY2xlYXIoKQotICAgICAgICB7Ci0gICAg
ICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5jbGVhcigpOwotICAgICAgICAgICAgbV9tb3Zl
TGlzdC5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBWZWN0b3I8
dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdDsK
LSAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9tb3Zl
TGlzdDsKLSAgICB9OwotCi0gICAgLy8gV29yayBsaXN0cy4KLSAgICAvLyBTZXQgb2YgIm1vdmUi
IGVuYWJsZWQgZm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCi0gICAgT3JkZXJlZE1vdmVTZXQgbV93
b3JrbGlzdE1vdmVzOwotICAgIC8vIFNldCBvZiAibW92ZSIgbm90IHlldCByZWFkeSBmb3IgY29h
bGVzY2luZy4KLSAgICBCaXRWZWN0b3IgbV9hY3RpdmVNb3ZlczsKLSAgICAvLyBMb3ctZGVncmVl
LCBub24tTW92ZSByZWxhdGVkLgotICAgIFZlY3RvcjxUbXA+IG1fc2ltcGxpZnlXb3JrbGlzdDsK
LSAgICAvLyBIaWdoLWRlZ3JlZSBUbXAuCi0gICAgSGFzaFNldDxUbXA+IG1fc3BpbGxXb3JrbGlz
dDsKLSAgICAvLyBMb3ctZGVncmVlLCBNb3ZlIHJlbGF0ZWQuCi0gICAgSGFzaFNldDxUbXA+IG1f
ZnJlZXplV29ya2xpc3Q7Ci0KLSAgICBib29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7IGZhbHNlIH07
Ci0gICAgYm9vbCBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2UgfTsKLQotICAg
IC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0byB0aGVpciBhbGlhcyBmb3IgTW92ZXMgdGhhdCBhcmUg
YWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJkbGVzcyBvZiBzcGlsbGluZy4KLSAgICBWZWN0b3I8VG1w
LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICBj
b25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgbV91bnNwaWxsYWJsZVRtcHM7CiB9OwogCiB0ZW1wbGF0
ZTxBcmc6OlR5cGUgdHlwZT4KQEAgLTk2NCwxNiArMTA2MSwxNCBAQCB2b2lkIGFzc2lnblJlZ2lz
dGVyVG9UbXBJblByb2dyYW0oQ29kZSYgY29kZSwgY29uc3QgSXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmdBbAogfQogCiB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLXZvaWQgYWRkU3BpbGxBbmRG
aWxsVG9Qcm9ncmFtKENvZGUmIGNvZGUsIGNvbnN0IEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
QWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IsIEhhc2hTZXQ8VG1wPiYgdW5zcGlsbGFibGVUbXAp
Cit2b2lkIGFkZFNwaWxsQW5kRmlsbFRvUHJvZ3JhbShDb2RlJiBjb2RlLCBjb25zdCBJdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvcjx0eXBlPiYgYWxsb2NhdG9yLCBIYXNoU2V0PHVu
c2lnbmVkPiYgdW5zcGlsbGFibGVUbXBzKQogewotICAgIGNvbnN0IEhhc2hTZXQ8VG1wPiYgc3Bp
bGxlZFRtcCA9IGFsbG9jYXRvci5zcGlsbGVkVG1wKCk7Ci0KLSAgICAvLyBBbGwgdGhlIHNwaWxs
ZWQgdmFsdWVzIGJlY29tZSB1bnNwaWxsYWJsZS4KLSAgICB1bnNwaWxsYWJsZVRtcC5hZGQoc3Bp
bGxlZFRtcC5iZWdpbigpLCBzcGlsbGVkVG1wLmVuZCgpKTsKLQotICAgIC8vIEFsbG9jYXRlIHN0
YWNrIHNsb3QgZm9yIGVhY2ggc3BpbGxlZCB2YWx1ZS4KICAgICBIYXNoTWFwPFRtcCwgU3RhY2tT
bG90Kj4gc3RhY2tTbG90czsKLSAgICBmb3IgKFRtcCB0bXAgOiBzcGlsbGVkVG1wKSB7CisgICAg
Zm9yIChUbXAgdG1wIDogYWxsb2NhdG9yLnNwaWxsZWRUbXBzKCkpIHsKKyAgICAgICAgLy8gQWxs
IHRoZSBzcGlsbGVkIHZhbHVlcyBiZWNvbWUgdW5zcGlsbGFibGUuCisgICAgICAgIHVuc3BpbGxh
YmxlVG1wcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSk7
CisKKyAgICAgICAgLy8gQWxsb2NhdGUgc3RhY2sgc2xvdCBmb3IgZWFjaCBzcGlsbGVkIHZhbHVl
LgogICAgICAgICBib29sIGlzTmV3VG1wID0gc3RhY2tTbG90cy5hZGQodG1wLCBjb2RlLmFkZFN0
YWNrU2xvdCg4LCBTdGFja1Nsb3RLaW5kOjpBbm9ueW1vdXMpKS5pc05ld0VudHJ5OwogICAgICAg
ICBBU1NFUlRfVU5VU0VEKGlzTmV3VG1wLCBpc05ld1RtcCk7CiAgICAgfQpAQCAtMTAyMCw3ICsx
MTE1LDcgQEAgdm9pZCBhZGRTcGlsbEFuZEZpbGxUb1Byb2dyYW0oQ29kZSYgY29kZSwgY29uc3Qg
SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2EKICAgICAgICAgICAgICAgICAgICAgdG1w
ID0gbmV3VG1wOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBuZXcgRmlsbCgpIHNob3Vs
ZCBuZXZlciBiZSBzcGlsbGVkLgotICAgICAgICAgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcC5h
ZGQodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsKICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNEZWYocm9sZSkpCiAgICAgICAgICAgICAgICAg
ICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdEluZGV4ICsgMSwgbW92ZSwgaW5zdC5vcmlnaW4s
IHRtcCwgYXJnKTsKQEAgLTEwMzcsMTEgKzExMzIsMTEgQEAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5
cGU+CiB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlKAogICAgIENvZGUmIGNv
ZGUsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMsIHVuc2lnbmVkJiBudW1JdGVyYXRp
b25zKQogewotICAgIEhhc2hTZXQ8VG1wPiB1bnNwaWxsYWJsZVRtcHM7CisgICAgSGFzaFNldDx1
bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIG51
bUl0ZXJhdGlvbnMrKzsKICAgICAgICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0
b3I8dHlwZT4gYWxsb2NhdG9yKGNvZGUsIHVzZUNvdW50cywgdW5zcGlsbGFibGVUbXBzKTsKLSAg
ICAgICAgaWYgKGFsbG9jYXRvci5zcGlsbGVkVG1wKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIGlm
ICghYWxsb2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgewogICAgICAgICAgICAgYXNzaWduUmVn
aXN0ZXJUb1RtcEluUHJvZ3JhbShjb2RlLCBhbGxvY2F0b3IpOwogICAgICAgICAgICAgcmV0dXJu
OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
clRtcElubGluZXMuaCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wSW5saW5l
cy5oCmluZGV4IDJmMWUwOWM1ZDUwYjg3ZTYxZDVmY2NlNTE4YzY4MGZiNWVjOGI4MWMuLjJlNDJi
OWI5NmYxMDhhMjAyNzUwMWEyMDFhNjhiNTEyODU5ZGZiNDcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wSW5saW5lcy5oCisrKyBiL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyVG1wSW5saW5lcy5oCkBAIC01Nyw2ICs1NywxMSBAQCBzdHJ1Y3Qg
QWJzb2x1dGVUbXBNYXBwZXI8QXJnOjpHUD4gewogICAgICAgICByZXR1cm4gYWJzb2x1dGVJbmRl
eChUbXA6OmdwVG1wRm9ySW5kZXgodG1wSW5kZXgpKTsKICAgICB9CiAKKyAgICBzdGF0aWMgdW5z
aWduZWQgbGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCkKKyAgICB7CisgICAgICAgIHJldHVybiBh
YnNvbHV0ZUluZGV4KFRtcChNYWNyb0Fzc2VtYmxlcjo6bGFzdFJlZ2lzdGVyKCkpKTsKKyAgICB9
CisKICAgICBzdGF0aWMgVG1wIHRtcEZyb21BYnNvbHV0ZUluZGV4KHVuc2lnbmVkIHRtcEluZGV4
KQogICAgIHsKICAgICAgICAgcmV0dXJuIFRtcDo6dG1wRm9ySW50ZXJuYWxWYWx1ZSh0bXBJbmRl
eCk7CkBAIC03Nyw2ICs4MiwxMSBAQCBzdHJ1Y3QgQWJzb2x1dGVUbXBNYXBwZXI8QXJnOjpGUD4g
ewogICAgICAgICByZXR1cm4gYWJzb2x1dGVJbmRleChUbXA6OmZwVG1wRm9ySW5kZXgodG1wSW5k
ZXgpKTsKICAgICB9CiAKKyAgICBzdGF0aWMgdW5zaWduZWQgbGFzdE1hY2hpbmVSZWdpc3Rlcklu
ZGV4KCkKKyAgICB7CisgICAgICAgIHJldHVybiBhYnNvbHV0ZUluZGV4KFRtcChNYWNyb0Fzc2Vt
Ymxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkpOworICAgIH0KKwogICAgIHN0YXRpYyBUbXAgdG1wRnJv
bUFic29sdXRlSW5kZXgodW5zaWduZWQgdG1wSW5kZXgpCiAgICAgewogICAgICAgICByZXR1cm4g
VG1wOjp0bXBGb3JJbnRlcm5hbFZhbHVlKC10bXBJbmRleCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>267690</attachid>
            <date>2015-12-19 10:10:42 -0800</date>
            <delta_ts>2015-12-19 11:17:01 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152420-20151219191002.patch</filename>
            <type>text/plain</type>
            <size>71476</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0MzEzCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA2
ZGNhNmVkMzkyMzA1NTk3NDI0ZjA4ZWU1MTIyNjJlZTQ4NDM4Nzc4Li4wZThlNjk3OWM3NzNlZTEw
OTViMzJmNTcyMWQ0ZjVmNmFiODM1ZWVhIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
NSArMSw0OSBAQAogMjAxNS0xMi0xOSAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KIAorICAgICAgICBbSlNDXSBTdHJlYW1saW5lIFRtcCBpbmRleGluZyBpbnNpZGUgdGhl
IHJlZ2lzdGVyIGFsbG9jYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTUyNDIwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgaGFzIGJlZW4gYWxsb2Nh
dGluZyBhIGJpdCBvZiBtZXNzIG92ZXIgdGltZS4KKworICAgICAgICBXaGVuIGl0IHN0YXJ0ZWQs
IGV2ZXJ5IG1hcCBhZGRyZXNzZWQgYnkgVG1wIHdhcyB1c2luZyBUbXAgaGFzaGluZy4KKyAgICAg
ICAgVGhhdCBjYXVzZWQgbWFzc2l2ZSBwZXJmb3JtYW5jZSBwcm9ibGVtcy4gRXZlcnl0aGluZyBw
ZXJmIHNlbnNpdGl2ZSB3YXMgbW92ZWQKKyAgICAgICAgdG8gZGlyZWN0IGFycmF5IGFkZHJlc3Np
bmcgYnkgdGhlIGFic29sdXRlIFRtcCBpbmRleC4gVGhpcyBsZWZ0IHRoZSBjb2RlCisgICAgICAg
IHdpdGggaGFsZiBvZiB0aGUgZnVuY3Rpb24gdXNpbmcgVG1wLCB0aGUgb3RoZXIgdXNpbmcgaW5k
aWNlcy4KKworICAgICAgICBXaXRoIHRoaXMgcGF0Y2gsIGFsbW9zdCBldmVyeXRoaW5nIGlzIG1v
dmVkIHRvIGFic29sdXRlIGluZGV4aW5nLgorICAgICAgICBUaGVyZSBhcmUgYSBmZXcgYWR2YW50
YWdlcyB0byB0aGlzOgorICAgICAgICAtTm8gbW9yZSBjb252ZXJzaW9uIGNodXJuIGZvciBGbG9h
dGluZyBQb2ludCByZWdpc3RlcnMuCisgICAgICAgIC1Nb3N0IG9mIHRoZSBmdW5jdGlvbnMgY2Fu
IG5vdyBiZSBzaGFyZWQgYmV0d2VlbiBHUCBhbmQgRlAuCisgICAgICAgIC1BIGJpdCBvZiBjbGVh
biB1cCBzaW5jZSB0aGUgY29yZSBhbGdvcml0aG0gb25seSBkZWFscyB3aXRoIGludGVnZXJzIG5v
dy4KKworICAgICAgICBUaGlzIHBhdGNoIGFsc28gY2hhbmdlcyB0aGUgaW5kZXggdHlwZSB0byBi
ZSBhIHRlbXBsYXRlIGFyZ3VtZW50LgorICAgICAgICBUaGF0IHdpbGwgYWxsb3cgZnV0dXJlIHNw
ZWNpYWxpemF0aW9uIG9mICJtX2ludGVyZmVyZW5jZUVkZ2VzIiBiYXNlZAorICAgICAgICBvbiB0
aGUgZXhwZWN0ZWQgcHJvYmxlbSBzaXplLgorCisgICAgICAgIEZpbmFsbHksIHRoZSBjb2RlIHJl
bGF0ZWQgdG8gdGhlIHByb2dyYW0gbW9kaWZpY2F0aW9uIChyZWdpc3RlciBhc3NpZ25tZW50Cisg
ICAgICAgIGFuZCBzcGlsbGluZykgd2FzIG1vdmVkIHRvIHRoZSB3cmFwcGVyICJJdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZyIuCisKKyAgICAgICAgVGhlIGN1cnJlbnQgc3BsaXQgaXM6CisgICAg
ICAgIC1BYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yOiBjb21tb24gY29yZS4gU2hhcmUgYXMgbXVj
aCBhcyBwb3NzaWJsZSBiZXR3ZWVuCisgICAgICAgICBHUCBhbmQgRlAuCisgICAgICAgIC1Db2xv
cmluZ0FsbG9jYXRvcjogdGhlIHJlbWFpbmluZyBwYXJ0cyBvZiB0aGUgYWxnb3JpdGhtLCBldmVy
eXRoaW5nIHRoYXQKKyAgICAgICAgIGlzIHNwZWNpZmljIHRvIEdQLCBGUC4KKyAgICAgICAgLUl0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nOiB0aGUgIml0ZXJhdGVkIiBwYXJ0IG9mIHRoZSBhbGdv
cml0aG0uCisgICAgICAgICBUcnkgdG8gYWxsb2NhdGUgYW5kIG1vZGlmeSB0aGUgY29kZSBhcyBu
ZWVkZWQuCisKKyAgICAgICAgVGhlIGxvbmcgdGVybSBwbGFuIGlzOgorICAgICAgICAtTW92ZSBz
ZWxlY3RTcGlsbCgpIGFuZCB0aGUgY29sb3JpbmcgbG9vcCB0byBBYnN0cmFjdENvbG9yaW5nQWxs
b2NhdG9yLgorICAgICAgICAtU3BlY2lhbGl6ZSBtX2ludGVyZmVyZW5jZUVkZ2VzIHRvIG1ha2Ug
aXQgZmFzdGVyLgorCisgICAgICAgICogYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nLmNwcDoKKyAgICAgICAgKiBiMy9haXIvQWlyVG1wSW5saW5lcy5oOgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpBYnNvbHV0ZVRtcE1hcHBlcjxBcmc6OkdQPjo6bGFzdE1hY2hpbmVSZWdpc3Rl
ckluZGV4KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6QWJzb2x1dGVUbXBNYXBwZXI8QXJnOjpG
UD46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCk6CisKKzIwMTUtMTItMTkgIEJlbmphbWluIFBv
dWxhaW4gIDxicG91bGFpbkBhcHBsZS5jb20+CisKICAgICAgICAgW0pTQ10gQjM6IEFkZCBpbmRl
eGVkIGFkZHJlc3Npbmcgd2hlbiBsb3dlcmluZyBCaXR3aXNlQ2FzdAogICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDMyCiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Npbmcu
Y3BwIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29h
bGVzY2luZy5jcHAKaW5kZXggNTAyYzg5ZGY2ZDA3Zjk3MWRmN2NmYmFhZGZlZDcwMjVmN2E5NmQ5
Zi4uMDFmNzQyMWZkMWJkMTgxNjBlNDAxODE0MTgyYjQ4OGU5M2NlMTk3YiAxMDA2NDQKLS0tIGEv
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Zy5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZy5jcHAKQEAgLTQ3LDQwOCArNDcsMzMxIEBAIGJvb2wgZGVidWcgPSBmYWxz
ZTsKIGJvb2wgdHJhY2VEZWJ1ZyA9IGZhbHNlOwogYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNlOwog
Ci10ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLXN0cnVjdCBNb3ZlSW5zdEhlbHBlcjsKLQotdGVt
cGxhdGU8Pgotc3RydWN0IE1vdmVJbnN0SGVscGVyPEFyZzo6R1A+IHsKLSAgICBzdGF0aWMgYm9v
bCBtYXlCZUNvYWxlc2NhYmxlKGNvbnN0IEluc3QmIGluc3QpCi0gICAgewotICAgICAgICBib29s
IGlzTW92ZSA9IGluc3Qub3Bjb2RlID09IE1vdmU7Ci0gICAgICAgIGlmICghaXNNb3ZlKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW5z
dC5hcmdzLnNpemUoKSA9PSAyLCAiV2UgYXNzdW1lIGNvYWxlY2FibGUgbW92ZXMgb25seSBoYXZl
IHR3byBhcmd1bWVudHMgaW4gYSBmZXcgcGxhY2VzLiIpOwotICAgICAgICBBU1NFUlQoaW5zdC5h
cmdzWzBdLmlzVHlwZShBcmc6OkdQKSk7Ci0gICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMV0uaXNU
eXBlKEFyZzo6R1ApKTsKLQotICAgICAgICByZXR1cm4gaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYg
aW5zdC5hcmdzWzFdLmlzVG1wKCk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGU8Pgotc3RydWN0IE1v
dmVJbnN0SGVscGVyPEFyZzo6RlA+IHsKLSAgICBzdGF0aWMgYm9vbCBtYXlCZUNvYWxlc2NhYmxl
KGNvbnN0IEluc3QmIGluc3QpCi0gICAgewotICAgICAgICBpZiAoaW5zdC5vcGNvZGUgIT0gTW92
ZURvdWJsZSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBBU1NFUlRfV0lU
SF9NRVNTQUdFKGluc3QuYXJncy5zaXplKCkgPT0gMiwgIldlIGFzc3VtZSBjb2FsZWNhYmxlIG1v
dmVzIG9ubHkgaGF2ZSB0d28gYXJndW1lbnRzIGluIGEgZmV3IHBsYWNlcy4iKTsKLSAgICAgICAg
QVNTRVJUKGluc3QuYXJnc1swXS5pc1R5cGUoQXJnOjpGUCkpOwotICAgICAgICBBU1NFUlQoaW5z
dC5hcmdzWzFdLmlzVHlwZShBcmc6OkZQKSk7Ci0KLSAgICAgICAgcmV0dXJuIGluc3QuYXJnc1sw
XS5pc1RtcCgpICYmIGluc3QuYXJnc1sxXS5pc1RtcCgpOwotICAgIH0KLX07Ci0KLXRlbXBsYXRl
PEFyZzo6VHlwZSB0eXBlPgotY2xhc3MgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0
b3IgeworLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgZGVmaW5lcyBhbGwgdGhlIGNv
ZGUgdGhhdCBpcyBpbmRlcGVuZGFudAorLy8gZnJvbSB0aGUgdHlwZSBvciByZWdpc3RlciBhbmQg
Y2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgordGVtcGxhdGU8dHlwZW5h
bWUgSW5kZXhUeXBlPgorY2xhc3MgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvciB7CiBwdWJsaWM6
Ci0gICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3IoCi0gICAgICAgIENvZGUm
IGNvZGUsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMsIGNvbnN0IEhhc2hTZXQ8VG1w
PiYgdW5zcGlsbGFibGVUbXApCi0gICAgICAgIDogbV9jb2RlKGNvZGUpCi0gICAgICAgICwgbV91
c2VDb3VudHModXNlQ291bnRzKQotICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXAodW5zcGlsbGFi
bGVUbXApCi0gICAgICAgICwgbV9udW1iZXJPZlJlZ2lzdGVycyhyZWdzSW5Qcmlvcml0eU9yZGVy
KHR5cGUpLnNpemUoKSkKKyAgICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKGNvbnN0IFZlY3Rv
cjxSZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdp
c3RlckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUpCisgICAgICAgIDogbV9yZWdzSW5Qcmlv
cml0eU9yZGVyKHJlZ3NJblByaW9yaXR5T3JkZXIpCisgICAgICAgICwgbV9sYXN0UHJlY29sb3Jl
ZFJlZ2lzdGVySW5kZXgobGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4KQogICAgIHsKLSAgICAg
ICAgaW5pdGlhbGl6ZURlZ3JlZXMoKTsKKyAgICAgICAgaW5pdGlhbGl6ZURlZ3JlZXModG1wQXJy
YXlTaXplKTsKIAotICAgICAgICB1bnNpZ25lZCB0bXBBcnJheVNpemUgPSB0aGlzLT50bXBBcnJh
eVNpemUoKTsKICAgICAgICAgbV9hZGphY2VuY3lMaXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOwog
ICAgICAgICBtX21vdmVMaXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOwotICAgICAgICBtX2NvYWxl
c2NlZFRtcHMucmVzaXplKHRtcEFycmF5U2l6ZSk7CisgICAgICAgIG1fY29hbGVzY2VkVG1wcy5m
aWxsKDAsIHRtcEFycmF5U2l6ZSk7CiAgICAgICAgIG1faXNPblNlbGVjdFN0YWNrLmVuc3VyZVNp
emUodG1wQXJyYXlTaXplKTsKLQotICAgICAgICBidWlsZCgpOwotICAgICAgICBhbGxvY2F0ZSgp
OwogICAgIH0KIAotICAgIFRtcCBnZXRBbGlhcyhUbXAgdG1wKSBjb25zdAorcHJvdGVjdGVkOgor
ICAgIEluZGV4VHlwZSBnZXRBbGlhcyhJbmRleFR5cGUgdG1wSW5kZXgpIGNvbnN0CiAgICAgewot
ICAgICAgICBUbXAgYWxpYXMgPSB0bXA7Ci0gICAgICAgIHdoaWxlIChUbXAgbmV4dEFsaWFzID0g
bV9jb2FsZXNjZWRUbXBzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFs
aWFzKV0pCisgICAgICAgIEluZGV4VHlwZSBhbGlhcyA9IHRtcEluZGV4OworICAgICAgICB3aGls
ZSAoSW5kZXhUeXBlIG5leHRBbGlhcyA9IG1fY29hbGVzY2VkVG1wc1thbGlhc10pCiAgICAgICAg
ICAgICBhbGlhcyA9IG5leHRBbGlhczsKICAgICAgICAgcmV0dXJuIGFsaWFzOwogICAgIH0KIAot
ICAgIFRtcCBnZXRBbGlhc1doZW5TcGlsbGluZyhUbXAgdG1wKSBjb25zdAorICAgIHZvaWQgYWRk
RWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCiAgICAgewotICAgICAgICBBU1NFUlRfV0lU
SF9NRVNTQUdFKCFtX3NwaWxsZWRUbXAuaXNFbXB0eSgpLCAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5
IHZhbGlkIGZvciBjb2FsZXNjaW5nIGR1cmluZyBzcGlsbGluZy4iKTsKLQotICAgICAgICBpZiAo
bV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdG1w
OwotCi0gICAgICAgIFRtcCBhbGlhcyA9IHRtcDsKLSAgICAgICAgd2hpbGUgKFRtcCBuZXh0QWxp
YXMgPSBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KGFsaWFzKV0pCi0gICAgICAgICAgICBhbGlhcyA9IG5leHRBbGlhczsKLQotICAg
ICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3NwaWxsZWRUbXAuY29udGFpbnModG1wKSB8fCBh
bGlhcyA9PSB0bXAsICJUaGUgYWxpYXNlcyBhdCBzcGlsbCBzaG91bGQgYWx3YXlzIGJlIGNvbG9y
YWJsZS4gU29tZXRoaW5nIHdlbnQgaG9ycmlibHkgd3JvbmcuIik7Ci0KLSAgICAgICAgcmV0dXJu
IGFsaWFzOworICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBhZGRFZGdlRGlzdGluY3QoYSwgYik7CiAgICAgfQogCi0gICAgY29uc3QgSGFzaFNldDxUbXA+
JiBzcGlsbGVkVG1wKCkgY29uc3QgeyByZXR1cm4gbV9zcGlsbGVkVG1wOyB9Ci0gICAgUmVnIGFs
bG9jYXRlZFJlZyhUbXAgdG1wKSBjb25zdAorICAgIHZvaWQgbWFrZVdvcmtMaXN0KCkKICAgICB7
Ci0gICAgICAgIEFTU0VSVCghdG1wLmlzUmVnKCkpOwotICAgICAgICBBU1NFUlQobV9jb2xvcmVk
VG1wLnNpemUoKSk7Ci0gICAgICAgIEFTU0VSVCh0bXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6
R1ApKTsKKyAgICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xv
cmVkUmVnaXN0ZXJJbmRleCArIDE7CisgICAgICAgIGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5v
blJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07CisgICAgICAgICAgICBpZiAoIWRlZ3JlZSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1w
W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOwotICAgICAgICBp
ZiAoIXJlZykgewotICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IFRtcHMgdGhhdCBp
bnRlcmZlcmUuIEEgVG1wIHRoYXQgbmV2ZXIgaW50ZXJmZXJlIHdpdGggYW55dGhpbmcKLSAgICAg
ICAgICAgIC8vIGNhbiB0YWtlIGFueSByZWdpc3Rlci4KLSAgICAgICAgICAgIHJlZyA9IHJlZ3NJ
blByaW9yaXR5T3JkZXIodHlwZSkuZmlyc3QoKTsKKyAgICAgICAgICAgIGlmIChkZWdyZWUgPj0g
bV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICBtX3NwaWxsV29y
a2xpc3QuYWRkKGkpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0
eSgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKGkpOworICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7CiAg
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlZzsKICAgICB9CiAKLXByaXZhdGU6Ci0gICAgdW5z
aWduZWQgdG1wQXJyYXlTaXplKCkKKyAgICAvLyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3YXlz
IGJlIGNvbG9yZWQ6IGp1c3QgcGljayBhbnkgb2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQorICAg
IC8vIG90aGVyIGFkamFjZW50IHZlcmljZXMuCisgICAgLy8gVGhlICJTaW1wbGlmeSIgcGhhc2Ug
dGFrZXMgYSBsb3ctZGVncmVlIG91dCBvZiB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBs
aWZ5IGl0LgorICAgIHZvaWQgc2ltcGxpZnkoKQogICAgIHsKLSAgICAgICAgdW5zaWduZWQgbnVt
VG1wcyA9IG1fY29kZS5udW1UbXBzKHR5cGUpOwotICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7CisgICAgICAgIEluZGV4VHlwZSBs
YXN0SW5kZXggPSBtX3NpbXBsaWZ5V29ya2xpc3QudGFrZUxhc3QoKTsKKworICAgICAgICBBU1NF
UlQoIW1fc2VsZWN0U3RhY2suY29udGFpbnMobGFzdEluZGV4KSk7CisgICAgICAgIEFTU0VSVCgh
bV9pc09uU2VsZWN0U3RhY2suZ2V0KGxhc3RJbmRleCkpOworICAgICAgICBtX3NlbGVjdFN0YWNr
LmFwcGVuZChsYXN0SW5kZXgpOworICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlja1NldChs
YXN0SW5kZXgpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0SW5kZXgsIFt0aGlzXShJ
bmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgZGVjcmVtZW50RGVncmVl
KGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9KTsKICAgICB9CiAKLSAgICB2b2lkIGluaXRp
YWxpemVEZWdyZWVzKCkKKyAgICB2b2lkIGZyZWV6ZSgpCiAgICAgewotICAgICAgICB1bnNpZ25l
ZCB0bXBBcnJheVNpemUgPSB0aGlzLT50bXBBcnJheVNpemUoKTsKLSAgICAgICAgbV9kZWdyZWVz
LnJlc2l6ZSh0bXBBcnJheVNpemUpOworICAgICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBt
X2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShn
ZXRBbGlhcyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5kZXgsICJjb2FsZXNjZSgpIHNob3VsZCBu
b3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0LiIpOworICAgICAgICBtX3NpbXBs
aWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKKyAgICAgICAgZnJlZXplTW92ZXModmlj
dGltSW5kZXgpOworICAgIH0KIAotICAgICAgICAvLyBBbGwgcHJlY29sb3JlZCByZWdpc3RlcnMg
aGF2ZSAgYW4gImluZmluaXRlIiBkZWdyZWUuCi0gICAgICAgIHVuc2lnbmVkIGZpcnN0Tm9uUmVn
SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCgwKTsKLSAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpcnN0Tm9uUmVnSW5kZXg7ICsraSkKLSAgICAg
ICAgICAgIG1fZGVncmVlc1tpXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgo
KTsKKyAgICB2b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAg
ICAgIGZvckVhY2hOb2RlTW92ZXModG1wSW5kZXgsIFt0aGlzLCB0bXBJbmRleF0gKEluZGV4VHlw
ZSBtb3ZlSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFy
KG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VNb3ZlKG1v
dmVJbmRleCk7CiAKLSAgICAgICAgYnplcm8obV9kZWdyZWVzLmRhdGEoKSArIGZpcnN0Tm9uUmVn
SW5kZXgsICh0bXBBcnJheVNpemUgLSBmaXJzdE5vblJlZ0luZGV4KSAqIHNpemVvZih1bnNpZ25l
ZCkpOworICAgICAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2Nv
YWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07CisgICAgICAgICAgICBJbmRleFR5cGUgc3Jj
VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuc3JjSW5kZXg7CisgICAgICAgICAgICBJbmRleFR5cGUg
ZHN0VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7CisKKyAgICAgICAgICAgIEluZGV4
VHlwZSBvcmlnaW5hbE90aGVyVG1wID0gc3JjVG1wSW5kZXggIT0gdG1wSW5kZXggPyBzcmNUbXBJ
bmRleCA6IGRzdFRtcEluZGV4OworICAgICAgICAgICAgSW5kZXhUeXBlIG90aGVyVG1wSW5kZXgg
PSBnZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1wKTsKKyAgICAgICAgICAgIGlmIChtX2RlZ3JlZXNb
b3RoZXJUbXBJbmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVS
ZWxhdGVkKG90aGVyVG1wSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fZnJlZXplV29y
a2xpc3QucmVtb3ZlKG90aGVyVG1wSW5kZXgpKQorICAgICAgICAgICAgICAgICAgICBtX3NpbXBs
aWZ5V29ya2xpc3QuYXBwZW5kKG90aGVyVG1wSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAg
ICB9KTsKICAgICB9CiAKLSAgICB2b2lkIGJ1aWxkKCkKKyAgICB2b2lkIGNvYWxlc2NlKCkKICAg
ICB7Ci0gICAgICAgIFRtcExpdmVuZXNzPHR5cGU+IGxpdmVuZXNzKG1fY29kZSk7Ci0gICAgICAg
IGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKLSAgICAgICAgICAgIHR5cGVuYW1l
IFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7
Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGlu
c3RJbmRleC0tOykgewotICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5z
dEluZGV4KTsKLSAgICAgICAgICAgICAgICBJbnN0KiBuZXh0SW5zdCA9IGluc3RJbmRleCArIDEg
PCBibG9jay0+c2l6ZSgpID8gJmJsb2NrLT5hdChpbnN0SW5kZXggKyAxKSA6IG51bGxwdHI7Ci0g
ICAgICAgICAgICAgICAgYnVpbGQoaW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYyk7Ci0gICAgICAg
ICAgICAgICAgbG9jYWxDYWxjLmV4ZWN1dGUoaW5zdEluZGV4KTsKLSAgICAgICAgICAgIH0KKyAg
ICAgICAgdW5zaWduZWQgbW92ZUluZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92ZSgp
OworICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2lu
Z0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyht
b3ZlT3BlcmFuZHMuc3JjSW5kZXgpOworICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1v
dmVPcGVyYW5kcy5kc3RJbmRleCk7CisKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKKyAg
ICAgICAgICAgIHN0ZDo6c3dhcCh1LCB2KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAg
ICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCIsIG1vdmVJbmRleCwg
IiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7CisKKyAgICAgICAgaWYgKHUgPT0gdikgewor
ICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVn
KQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOworICAgICAgICB9
IGVsc2UgaWYgKGlzUHJlY29sb3JlZCh2KSB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5z
KEludGVyZmVyZW5jZUVkZ2UodSwgdikpKSB7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsK
KyAgICAgICAgICAgIGFkZFdvcmtMaXN0KHYpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1
ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOworICAgICAg
ICB9IGVsc2UgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7CisgICAgICAgICAgICBj
b21iaW5lKHUsIHYpOworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAgICBt
X2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xu
Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1aWNrU2V0
KG1vdmVJbmRleCk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAg
ICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywgYWRkZWQgdG8gYWN0aXZlIG1vdmVz
LlxuIik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIGJ1aWxkKEluc3QmIGluc3QsIElu
c3QqIG5leHRJbnN0LCBjb25zdCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxj
JiBsb2NhbENhbGMpCisgICAgdm9pZCBhc3NpZ25Db2xvcnMoKQogICAgIHsKLSAgICAgICAgaW5z
dC5mb3JFYWNoVG1wV2l0aEV4dHJhQ2xvYmJlcmVkUmVncygKLSAgICAgICAgICAgIG5leHRJbnN0
LAotICAgICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6
VHlwZSBhcmdUeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFBcmc6OmlzRGVmKHJvbGUpIHx8
IGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAg
ICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgRGVmKClzIGludGVyZmVyZSB3aXRo
IGVhY2ggb3RoZXIgYW5kIHdpdGggYWxsIHRoZSBleHRyYSBjbG9iYmVyZWQgVG1wcy4KLSAgICAg
ICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IHVzZSBmb3JFYWNoRGVmQW5kRXh0cmFDbG9iYmVy
ZWRUbXAoKSBoZXJlIHNpbmNlIGNvbG9yZWQgVG1wcwotICAgICAgICAgICAgICAgIC8vIGRvIG5v
dCBuZWVkIGludGVyZmVyZW5jZSBlZGdlcyBpbiBvdXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAg
ICAgICAgICAgaW5zdC5mb3JFYWNoVG1wKFsmXSAoVG1wJiBvdGhlckFyZywgQXJnOjpSb2xlIHJv
bGUsIEFyZzo6VHlwZSBhcmdUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFy
Zzo6aXNEZWYocm9sZSkgfHwgYXJnVHlwZSAhPSB0eXBlKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAg
ICAgICAgICAgYWRkRWRnZShhcmcsIG90aGVyQXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7
Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgQVNTRVJUKG1fc2ltcGxpZnlXb3JrbGlzdC5pc0Vt
cHR5KCkpOworICAgICAgICBBU1NFUlQobV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAg
ICAgIEFTU0VSVChtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVCht
X3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKIAotICAgICAgICBpZiAoTW92ZUluc3RIZWxwZXI8
dHlwZT46Om1heUJlQ29hbGVzY2FibGUoaW5zdCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGRvIG5v
dCB3YW50IHRoZSBVc2UoKSBvZiB0aGlzIG1vdmUgdG8gaW50ZXJmZXJlIHdpdGggdGhlIERlZigp
LCBldmVuIGlmIGl0IGlzIGxpdmUKLSAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBNb3ZlLiBJZiB3
ZSB3ZXJlIHRvIGFkZCB0aGUgaW50ZXJmZXJlbmNlIGVkZ2UsIGl0IHdvdWxkIGJlIGltcG9zc2li
bGUgdG8KLSAgICAgICAgICAgIC8vIGNvYWxlc2NlIHRoZSBNb3ZlIGV2ZW4gaWYgdGhlIHR3byBU
bXAgbmV2ZXIgaW50ZXJmZXJlIGFueXdoZXJlLgotICAgICAgICAgICAgVG1wIGRlZlRtcDsKLSAg
ICAgICAgICAgIFRtcCB1c2VUbXA7Ci0gICAgICAgICAgICBpbnN0LmZvckVhY2hUbXAoWyZkZWZU
bXAsICZ1c2VUbXBdIChUbXAmIGFyZ1RtcCwgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSkgewot
ICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzRGVmKHJvbGUpKQotICAgICAgICAgICAgICAgICAg
ICBkZWZUbXAgPSBhcmdUbXA7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgICAgIEFTU0VSVChBcmc6OmlzRWFybHlVc2Uocm9sZSkpOwotICAgICAgICAgICAgICAgICAg
ICB1c2VUbXAgPSBhcmdUbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0g
ICAgICAgICAgICBBU1NFUlQoZGVmVG1wKTsKLSAgICAgICAgICAgIEFTU0VSVCh1c2VUbXApOwor
ICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlLgorICAgICAgICBt
X2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7CisgICAgICAgIG1fZGVncmVlcy5jbGVhcigpOwor
ICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVh
cigpOworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9zcGls
bFdvcmtsaXN0LmNsZWFyKCk7CisgICAgICAgIG1fZnJlZXplV29ya2xpc3QuY2xlYXIoKTsKIAot
ICAgICAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0
ZXMuc2l6ZSgpOwotICAgICAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyB1
c2VUbXAsIGRlZlRtcCB9KTsKKyAgICAgICAgLy8gVHJ5IHRvIGNvbG9yIHRoZSBUbXAgb24gdGhl
IHN0YWNrLgorICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fYWRqYWNlbmN5TGlzdC5zaXpl
KCkpOwogCi0gICAgICAgICAgICB1bnNpZ25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmts
aXN0TW92ZXMuYWRkTW92ZSgpOwotICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChuZXdJbmRleElu
V29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUluZGV4KTsKKyAgICAgICAg
d2hpbGUgKCFtX3NlbGVjdFN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdW5zaWduZWQg
dG1wSW5kZXggPSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7CisgICAgICAgICAgICBBU1NFUlQo
IWlzUHJlY29sb3JlZCh0bXBJbmRleCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX2NvbG9yZWRU
bXBbdG1wSW5kZXhdKTsKIAotICAgICAgICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9h
Y3RpdmVNb3Zlcy5zaXplKCkpOwotICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXpl
KG5leHRNb3ZlSW5kZXggKyAxKTsKKyAgICAgICAgICAgIFJlZ2lzdGVyU2V0IGNvbG9yZWRSZWdp
c3RlcnM7CisgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogbV9h
ZGphY2VuY3lMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgICAgIEluZGV4VHlwZSBhbGlh
c1RtcEluZGV4ID0gZ2V0QWxpYXMoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAg
UmVnIHJlZyA9IG1fY29sb3JlZFRtcFthbGlhc1RtcEluZGV4XTsKIAotICAgICAgICAgICAgZm9y
IChjb25zdCBBcmcmIGFyZyA6IGluc3QuYXJncykgewotICAgICAgICAgICAgICAgIGF1dG8mIGxp
c3QgPSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFy
Zy50bXAoKSldOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5kZXgpOwotICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKGFsaWFzVG1w
SW5kZXgpIHx8IChpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgJiYgcmVnKSk7CiAKLSAgICAg
ICAgICAgIGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDogbG9jYWxDYWxjLmxpdmUoKSkgewotICAg
ICAgICAgICAgICAgIGlmIChsaXZlVG1wICE9IHVzZVRtcCkKLSAgICAgICAgICAgICAgICAgICAg
YWRkRWRnZShkZWZUbXAsIGxpdmVUbXApOworICAgICAgICAgICAgICAgIGlmIChyZWcpCisgICAg
ICAgICAgICAgICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7CiAgICAgICAgICAgICB9
CiAKLSAgICAgICAgICAgIC8vIFRoZSBuZXh0IGluc3RydWN0aW9uIGNvdWxkIGhhdmUgZWFybHkg
Y2xvYmJlcnMuIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhvc2Ugbm93LgotICAgICAgICAgICAgaWYg
KG5leHRJbnN0ICYmIG5leHRJbnN0LT5oYXNTcGVjaWFsKCkpIHsKLSAgICAgICAgICAgICAgICBu
ZXh0SW5zdC0+ZXh0cmFFYXJseUNsb2JiZXJlZFJlZ3MoKS5mb3JFYWNoKAotICAgICAgICAgICAg
ICAgICAgICBbJl0gKFJlZyByZWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWcu
aXNHUFIoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDogbG9jYWxDYWxjLmxpdmUoKSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKFRtcChyZWcpLCBsaXZlVG1wKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYm9vbCBjb2xvckFzc2lnbmVkID0g
ZmFsc2U7CisgICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIp
IHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJlZykpIHsKKyAg
ICAgICAgICAgICAgICAgICAgbV9jb2xvcmVkVG1wW3RtcEluZGV4XSA9IHJlZzsKKyAgICAgICAg
ICAgICAgICAgICAgY29sb3JBc3NpZ25lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICBhZGRFZGdlcyhpbnN0LCBuZXh0SW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7CisK
KyAgICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKKyAgICAgICAgICAgICAgICBtX3NwaWxs
ZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgbV9zZWxlY3RTdGFj
ay5jbGVhcigpOworCisgICAgICAgIGlmIChtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuY2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7CiAgICAgfQogCi0gICAgdm9pZCBhZGRFZGdl
cyhJbnN0JiBpbnN0LCBJbnN0KiBuZXh0SW5zdCwgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46
OkxvY2FsQ2FsYzo6SXRlcmFibGUgbGl2ZVRtcHMpCitwcml2YXRlOgorICAgIHZvaWQgaW5pdGlh
bGl6ZURlZ3JlZXModW5zaWduZWQgdG1wQXJyYXlTaXplKQogICAgIHsKLSAgICAgICAgLy8gQWxs
IHRoZSBEZWYoKXMgaW50ZXJmZXJlIHdpdGggZXZlcnRoaW5nIGxpdmUuCi0gICAgICAgIGluc3Qu
Zm9yRWFjaFRtcFdpdGhFeHRyYUNsb2JiZXJlZFJlZ3MoCi0gICAgICAgICAgICBuZXh0SW5zdCwK
LSAgICAgICAgICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5
cGUgYXJnVHlwZSkgewotICAgICAgICAgICAgICAgIGlmICghQXJnOjppc0RlZihyb2xlKSB8fCBh
cmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxpdmVUbXBz
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlVG1wLmlzR1AoKSA9PSAodHlwZSA9PSBB
cmc6OkdQKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoYXJnLCBsaXZlVG1wKTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgbV9kZWdyZWVzLnJl
c2l6ZSh0bXBBcnJheVNpemUpOworCisgICAgICAgIC8vIEFsbCBwcmVjb2xvcmVkIHJlZ2lzdGVy
cyBoYXZlICBhbiAiaW5maW5pdGUiIGRlZ3JlZS4KKyAgICAgICAgdW5zaWduZWQgZmlyc3ROb25S
ZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpcnN0Tm9uUmVnSW5kZXg7ICsraSkKKyAgICAgICAgICAg
IG1fZGVncmVlc1tpXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKwor
ICAgICAgICBiemVybyhtX2RlZ3JlZXMuZGF0YSgpICsgZmlyc3ROb25SZWdJbmRleCwgKHRtcEFy
cmF5U2l6ZSAtIGZpcnN0Tm9uUmVnSW5kZXgpICogc2l6ZW9mKHVuc2lnbmVkKSk7CiAgICAgfQog
Ci0gICAgdm9pZCBhZGRFZGdlKGNvbnN0IFRtcCYgYSwgY29uc3QgVG1wJiBiKQorICAgIHZvaWQg
YWRkRWRnZURpc3RpbmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKICAgICB7Ci0gICAgICAg
IGlmIChhID09IGIpCi0gICAgICAgICAgICByZXR1cm47Ci0KKyAgICAgICAgQVNTRVJUKGEgIT0g
Yik7CiAgICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdl
KGEsIGIpKS5pc05ld0VudHJ5KSB7Ci0gICAgICAgICAgICBpZiAoIWEuaXNSZWcoKSkgewotICAg
ICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KGEpXS5jb250YWlucyhiKSk7Ci0gICAgICAgICAgICAgICAgbV9h
ZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpXS5h
cHBlbmQoYik7Ci0gICAgICAgICAgICAgICAgbV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KGEpXSsrOworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQo
YSkpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlu
cyhiKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKKyAg
ICAgICAgICAgICAgICBtX2RlZ3JlZXNbYV0rKzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAg
ICAgaWYgKCFiLmlzUmVnKCkpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5
TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKV0uY29udGFpbnMo
YSkpOwotICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleChiKV0uYXBwZW5kKGEpOwotICAgICAgICAgICAgICAgIG1fZGVn
cmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKV0rKzsKKyAgICAg
ICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGIpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKCFt
X2FkamFjZW5jeUxpc3RbYl0uY29udGFpbnMoYSkpOworICAgICAgICAgICAgICAgIG1fYWRqYWNl
bmN5TGlzdFtiXS5hcHBlbmQoYSk7CisgICAgICAgICAgICAgICAgbV9kZWdyZWVzW2JdKys7CiAg
ICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIG1ha2VXb3JrTGlzdCgp
CisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQogICAgIHsKLSAg
ICAgICAgdW5zaWduZWQgZmlyc3ROb25SZWdJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
OjphYnNvbHV0ZUluZGV4KDApOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBmaXJzdE5vblJl
Z0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICB1bnNpZ25l
ZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07Ci0gICAgICAgICAgICBpZiAoIWRlZ3JlZSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgVG1wIHRtcCA9IEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpKTsKLQotICAgICAgICAgICAgaWYg
KGRlZ3JlZSA+PSBtX251bWJlck9mUmVnaXN0ZXJzKQotICAgICAgICAgICAgICAgIG1fc3BpbGxX
b3JrbGlzdC5hZGQodG1wKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX21vdmVMaXN0W0Fic29s
dXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZCh0bXApOworICAgICAgICBBU1NFUlQobV9k
ZWdyZWVzW3RtcEluZGV4XSk7CisKKyAgICAgICAgdW5zaWduZWQgb2xkRGVncmVlID0gbV9kZWdy
ZWVzW3RtcEluZGV4XS0tOworICAgICAgICBpZiAob2xkRGVncmVlID09IG1fcmVnc0luUHJpb3Jp
dHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFj
ZW50cyh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHRtcElu
ZGV4KTsKKyAgICAgICAgICAgIGlmIChpc01vdmVSZWxhdGVkKHRtcEluZGV4KSkKKyAgICAgICAg
ICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZCh0bXBJbmRleCk7CiAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXApOworICAgICAg
ICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOwogICAgICAgICB9
CiAgICAgfQogCi0gICAgdm9pZCBzaW1wbGlmeSgpCisgICAgYm9vbCBpc01vdmVSZWxhdGVkKElu
ZGV4VHlwZSB0bXBJbmRleCkKICAgICB7Ci0gICAgICAgIFRtcCBsYXN0ID0gbV9zaW1wbGlmeVdv
cmtsaXN0LnRha2VMYXN0KCk7Ci0KLSAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRh
aW5zKGxhc3QpKTsKLSAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQoQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGFzdCkpKTsKLSAgICAgICAgbV9zZWxl
Y3RTdGFjay5hcHBlbmQobGFzdCk7Ci0gICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0
KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGxhc3QpKTsKLQotICAgICAg
ICBmb3JFYWNoQWRqYWNlbnQobGFzdCwgW3RoaXNdKFRtcCBhZGphY2VudFRtcCkgewotICAgICAg
ICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wKTsKLSAgICAgICAgfSk7CisgICAgICAg
IGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAg
ICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlz
dE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHRlbXBsYXRl
PHR5cGVuYW1lIEZ1bmN0aW9uPgotICAgIHZvaWQgZm9yRWFjaEFkamFjZW50KFRtcCB0bXAsIEZ1
bmN0aW9uIGZ1bmN0aW9uKQorICAgIHZvaWQgZm9yRWFjaEFkamFjZW50KEluZGV4VHlwZSB0bXBJ
bmRleCwgRnVuY3Rpb24gZnVuY3Rpb24pCiAgICAgewotICAgICAgICBmb3IgKFRtcCBhZGphY2Vu
dFRtcCA6IG1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleCh0bXApXSkgewotICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2Vu
dFRtcCkpCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24oYWRqYWNlbnRUbXApOworICAgICAgICBm
b3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogbV9hZGphY2VuY3lMaXN0W3RtcEluZGV4
XSkgeworICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4
KSkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihhZGphY2VudFRtcEluZGV4KTsKICAgICAgICAg
fQogICAgIH0KIAotICAgIGJvb2wgaGFzQmVlblNpbXBsaWZpZWQoVG1wIHRtcCkKLSAgICB7Ci0g
ICAgICAgIHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldChBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKSB8fCAhIW1fY29hbGVzY2VkVG1wc1tBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXTsKLSAgICB9Ci0KLSAgICB2b2lk
IGRlY3JlbWVudERlZ3JlZShUbXAgdG1wKQorICAgIGJvb2wgaGFzQmVlblNpbXBsaWZpZWQoSW5k
ZXhUeXBlIHRtcEluZGV4KQogICAgIHsKLSAgICAgICAgQVNTRVJUKG1fZGVncmVlc1tBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSk7Ci0KLSAgICAgICAgdW5zaWdu
ZWQgb2xkRGVncmVlID0gbV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KHRtcCldLS07Ci0gICAgICAgIGlmIChvbGREZWdyZWUgPT0gbV9udW1iZXJPZlJlZ2lz
dGVycykgewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcCk7
Ci0gICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHRtcCk7Ci0gICAgICAgICAgICBp
ZiAoaXNNb3ZlUmVsYXRlZCh0bXApKQotICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3Qu
YWRkKHRtcCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdv
cmtsaXN0LmFwcGVuZCh0bXApOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtX2lzT25TZWxl
Y3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhd
OwogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgotICAgIHZvaWQgZm9y
RWFjaE5vZGVNb3ZlcyhUbXAgdG1wLCBGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB2b2lkIGZvckVh
Y2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKICAgICB7
Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFtBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSkgeworICAgICAgICBmb3IgKHVuc2ln
bmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7CiAgICAgICAgICAgICBpZiAo
bV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250
YWlucyhtb3ZlSW5kZXgpKQogICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG1vdmVJbmRleCk7CiAg
ICAgICAgIH0KICAgICB9CiAKLSAgICBib29sIGlzTW92ZVJlbGF0ZWQoVG1wIHRtcCkKLSAgICB7
Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFtBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSkgewotICAgICAgICAgICAgaWYgKG1f
YWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFp
bnMobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVNb3Zlc09uVmFs
dWUoVG1wIHRtcCkKKyAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZShJbmRleFR5cGUgdG1wSW5k
ZXgpCiAgICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3Rb
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pIHsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewogICAgICAg
ICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQogICAgICAgICAg
ICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJbmRleCk7CiAgICAgICAgIH0K
ICAgICB9CiAKLSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyhUbXAgdG1w
KQorICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKEluZGV4VHlwZSB0bXBJ
bmRleCkKICAgICB7Ci0gICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZSh0bXApOworICAgICAgICBl
bmFibGVNb3Zlc09uVmFsdWUodG1wSW5kZXgpOwogCi0gICAgICAgIGZvckVhY2hBZGphY2VudCh0
bXAsIFt0aGlzXSAoVG1wIGFkamFjZW50VG1wKSB7Ci0gICAgICAgICAgICBlbmFibGVNb3Zlc09u
VmFsdWUoYWRqYWNlbnRUbXApOworICAgICAgICBmb3JFYWNoQWRqYWNlbnQodG1wSW5kZXgsIFt0
aGlzXSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGVuYWJsZU1v
dmVzT25WYWx1ZShhZGphY2VudFRtcEluZGV4KTsKICAgICAgICAgfSk7CiAgICAgfQogCi0gICAg
dm9pZCBjb2FsZXNjZSgpCisgICAgYm9vbCBpc1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4
KQogICAgIHsKLSAgICAgICAgdW5zaWduZWQgbW92ZUluZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRh
a2VMYXN0TW92ZSgpOwotICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9
IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAgICAgVG1wIHUgPSBtb3Zl
T3BlcmFuZHMuc3JjOwotICAgICAgICB1ID0gZ2V0QWxpYXModSk7Ci0gICAgICAgIFRtcCB2ID0g
bW92ZU9wZXJhbmRzLmRzdDsKLSAgICAgICAgdiA9IGdldEFsaWFzKHYpOworICAgICAgICByZXR1
cm4gdG1wSW5kZXggPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CisgICAgfQogCi0g
ICAgICAgIGlmICh2LmlzUmVnKCkpCi0gICAgICAgICAgICBzdGQ6OnN3YXAodSwgdik7CisgICAg
dm9pZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBpZiAo
IWlzUHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4XSA8IG1fcmVnc0lu
UHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7CisgICAg
ICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7CisgICAgICAgICAgICBt
X3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KIAot
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2Npbmcg
bW92ZSBhdCBpbmRleCIsIG1vdmVJbmRleCwgIiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7
CisgICAgdm9pZCBjb21iaW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAg
ICAgIGlmICghbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodikpCisgICAgICAgICAgICBtX3NwaWxs
V29ya2xpc3QucmVtb3ZlKHYpOwogCi0gICAgICAgIGlmICh1ID09IHYpIHsKLSAgICAgICAgICAg
IGFkZFdvcmtMaXN0KHUpOworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7Cisg
ICAgICAgIG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7CiAKLSAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOwotICAgICAg
ICB9IGVsc2UgaWYgKHYuaXNSZWcoKSB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKElu
dGVyZmVyZW5jZUVkZ2UodSwgdikpKSB7Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLSAg
ICAgICAgICAgIGFkZFdvcmtMaXN0KHYpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykK
LSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOwotICAgICAgICB9
IGVsc2UgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7Ci0gICAgICAgICAgICBjb21i
aW5lKHUsIHYpOwotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0gICAgICAgICAgICBtX2hh
c0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKKyAgICAgICAgYXV0byYgdk1vdmVzID0g
bV9tb3ZlTGlzdFt2XTsKKyAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCks
IHZNb3Zlcy5lbmQoKSk7CiAKLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgpOworICAgICAg
ICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRl
eCkgeworICAgICAgICAgICAgYWRkRWRnZURpc3RpbmN0KGFkamFjZW50VG1wSW5kZXgsIHUpOwor
ICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9
KTsKIAotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxv
ZygiICAgIEZhaWxlZCBjb2FsZXNjaW5nLCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKLSAg
ICAgICAgfQorICAgICAgICBpZiAobV9kZWdyZWVzW3VdID49IG1fcmVnc0luUHJpb3JpdHlPcmRl
ci5zaXplKCkgJiYgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodSkpCisgICAgICAgICAgICBtX3Nw
aWxsV29ya2xpc3QuYWRkKHUpOwogICAgIH0KIAotICAgIGJvb2wgY2FuQmVTYWZlbHlDb2FsZXNj
ZWQoVG1wIHUsIFRtcCB2KQorICAgIGJvb2wgY2FuQmVTYWZlbHlDb2FsZXNjZWQoSW5kZXhUeXBl
IHUsIEluZGV4VHlwZSB2KQogICAgIHsKLSAgICAgICAgQVNTRVJUKCF2LmlzUmVnKCkpOwotICAg
ICAgICBpZiAodS5pc1JlZygpKQorICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7Cisg
ICAgICAgIGlmIChpc1ByZWNvbG9yZWQodSkpCiAgICAgICAgICAgICByZXR1cm4gcHJlY29sb3Jl
ZENvYWxlc2NpbmdIZXVyaXN0aWModSwgdik7CiAgICAgICAgIHJldHVybiBjb25zZXJ2YXRpdmVI
ZXVyaXN0aWModSwgdik7CiAgICAgfQogCi0gICAgYm9vbCBwcmVjb2xvcmVkQ29hbGVzY2luZ0hl
dXJpc3RpYyhUbXAgdSwgVG1wIHYpCi0gICAgewotICAgICAgICBBU1NFUlQodS5pc1JlZygpKTsK
LSAgICAgICAgQVNTRVJUKCF2LmlzUmVnKCkpOwotCi0gICAgICAgIC8vIElmIGFueSBhZGphY2Vu
dCBvZiB0aGUgbm9uLWNvbG9yZWQgbm9kZSBpcyBub3QgYW4gYWRqYWNlbnQgb2YgdGhlIGNvbG9y
ZWQgbm9kZSBBTkQgaGFzIGEgZGVncmVlID49IEsKLSAgICAgICAgLy8gdGhlcmUgaXMgYSByaXNr
IHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgY29sb3IgYXMgb3VyIHByZWNv
bG9yZWQgbm9kZS4gSWYgd2UgY29hbGVzY2Ugc3VjaAotICAgICAgICAvLyBtb3ZlLCB3ZSBtYXkg
Y3JlYXRlIGFuIHVuY29sb3JhYmxlIGdyYXBoLgotICAgICAgICBjb25zdCBhdXRvJiBhZGphY2Vu
dHNPZlYgPSBtX2FkamFjZW5jeUxpc3RbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRl
SW5kZXgodildOwotICAgICAgICBmb3IgKFRtcCBhZGphY2VudFRtcCA6IGFkamFjZW50c09mVikg
ewotICAgICAgICAgICAgaWYgKCFhZGphY2VudFRtcC5pc1JlZygpCi0gICAgICAgICAgICAgICAg
JiYgIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wKQotICAgICAgICAgICAgICAgICYmIG1f
ZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhZGphY2VudFRt
cCldID49IG1fbnVtYmVyT2ZSZWdpc3RlcnMKLSAgICAgICAgICAgICAgICAmJiAhbV9pbnRlcmZl
cmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1wKSkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLQotICAgIGJvb2wgY29uc2VydmF0aXZlSGV1cmlzdGljKFRtcCB1LCBUbXAg
dikKKyAgICBib29sIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBl
IHYpCiAgICAgewogICAgICAgICAvLyBUaGlzIGlzIHVzaW5nIHRoZSBCcmlnZ3MnIGNvbnNlcnZh
dGl2ZSBjb2FsZXNjaW5nIHJ1bGU6CiAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgY29tYmlu
ZWQgYWRqYWNlbnQgbm9kZSB3aXRoIGEgZGVncmVlID49IEsgaXMgbGVzcyB0aGFuIEssCkBAIC00
NTYsMjgxICszNzksNjIgQEAgcHJpdmF0ZToKICAgICAgICAgLy8gaXMgY29sb3JhYmxlLCB3ZSBo
YXZlIGZld2VyIHRoYW4gSyBhZGphY2VudHMgd2l0aCBoaWdoIG9yZGVyIGFuZCB0aGVyZSBpcyBh
IGNvbG9yCiAgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBub2RlLgogICAgICAgICBBU1NFUlQo
dSAhPSB2KTsKLSAgICAgICAgQVNTRVJUKCF1LmlzUmVnKCkpOwotICAgICAgICBBU1NFUlQoIXYu
aXNSZWcoKSk7CisgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHUpKTsKKyAgICAgICAgQVNT
RVJUKCFpc1ByZWNvbG9yZWQodikpOwogCi0gICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09m
VSA9IG1fYWRqYWNlbmN5TGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRl
eCh1KV07Ci0gICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlz
dFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh2KV07CisgICAgICAgIGNv
bnN0IGF1dG8mIGFkamFjZW50c09mVSA9IG1fYWRqYWNlbmN5TGlzdFt1XTsKKyAgICAgICAgY29u
c3QgYXV0byYgYWRqYWNlbnRzT2ZWID0gbV9hZGphY2VuY3lMaXN0W3ZdOwogCi0gICAgICAgIGlm
IChhZGphY2VudHNPZlUuc2l6ZSgpICsgYWRqYWNlbnRzT2ZWLnNpemUoKSA8IG1fbnVtYmVyT2ZS
ZWdpc3RlcnMpIHsKKyAgICAgICAgaWYgKGFkamFjZW50c09mVS5zaXplKCkgKyBhZGphY2VudHNP
ZlYuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgewogICAgICAgICAgICAg
Ly8gU2hvcnRjdXQ6IGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgYWRqYWNlbnRzIGlzIGxlc3MgdGhh
biB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyLCB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyBtZXQuCiAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIEhhc2hTZXQ8VG1w
PiBoaWdoT3JkZXJBZGphY2VudHM7CisgICAgICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBoaWdoT3Jk
ZXJBZGphY2VudHM7CiAKLSAgICAgICAgZm9yIChUbXAgYWRqYWNlbnRUbXAgOiBhZGphY2VudHNP
ZlUpIHsKLSAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcCAhPSB2KTsKLSAgICAgICAgICAg
IEFTU0VSVChhZGphY2VudFRtcCAhPSB1KTsKLSAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBs
aWZpZWQoYWRqYWNlbnRUbXApICYmIG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
YWJzb2x1dGVJbmRleChhZGphY2VudFRtcCldID49IG1fbnVtYmVyT2ZSZWdpc3RlcnMpIHsKLSAg
ICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5hZGQoYWRq
YWNlbnRUbXApOwotICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBo
aWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49IG1fbnVtYmVyT2ZSZWdpc3RlcnMpCisgICAgICAg
IGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlUpIHsKKyAgICAg
ICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOworICAgICAgICAgICAgQVNTRVJU
KGFkamFjZW50VG1wSW5kZXggIT0gdSk7CisgICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlm
aWVkKGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBt
X3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgYXV0byBhZGRS
ZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5kZXgpOworICAgICAg
ICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMu
c2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCiAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmb3Ig
KFRtcCBhZGphY2VudFRtcCA6IGFkamFjZW50c09mVikgewotICAgICAgICAgICAgQVNTRVJUKGFk
amFjZW50VG1wICE9IHUpOwotICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wICE9IHYpOwot
ICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcCkgJiYgbV9kZWdy
ZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFkamFjZW50VG1wKV0g
Pj0gbV9udW1iZXJPZlJlZ2lzdGVycykgewotICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0
ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcCk7Ci0gICAgICAgICAgICAgICAg
aWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0g
bV9udW1iZXJPZlJlZ2lzdGVycykKKyAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJ
bmRleCA6IGFkamFjZW50c09mVikgeworICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5k
ZXggIT0gdSk7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKKyAg
ICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYgbV9k
ZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkp
IHsKKyAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5h
ZGQoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05l
d0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAg
ICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50cy5zaXpl
KCkgPCBtX251bWJlck9mUmVnaXN0ZXJzKTsKKyAgICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFj
ZW50cy5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKTsKICAgICAgICAgcmV0
dXJuIHRydWU7CiAgICAgfQogCi0gICAgdm9pZCBhZGRXb3JrTGlzdChUbXAgdG1wKQotICAgIHsK
LSAgICAgICAgaWYgKCF0bXAuaXNSZWcoKSAmJiBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0gPCBtX251bWJlck9mUmVnaXN0ZXJzICYmICFpc01v
dmVSZWxhdGVkKHRtcCkpIHsKLSAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHRt
cCk7Ci0gICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcCk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICB2b2lkIGNvbWJpbmUoVG1wIHUsIFRtcCB2KQotICAgIHsKLSAgICAg
ICAgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh2KSkKLSAgICAgICAgICAgIG1fc3BpbGxX
b3JrbGlzdC5yZW1vdmUodik7Ci0KLSAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodildKTsKLSAgICAgICAgbV9jb2Fs
ZXNjZWRUbXBzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHYpXSA9IHU7
Ci0KLSAgICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleCh2KV07Ci0gICAgICAgIG1fbW92ZUxpc3RbQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodSldLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVz
LmVuZCgpKTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChUbXAgYWRq
YWNlbnRUbXApIHsKLSAgICAgICAgICAgIGFkZEVkZ2UoYWRqYWNlbnRUbXAsIHUpOwotICAgICAg
ICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wKTsKLSAgICAgICAgfSk7Ci0KLSAgICAg
ICAgaWYgKG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh1
KV0gPj0gbV9udW1iZXJPZlJlZ2lzdGVycyAmJiBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh1KSkK
LSAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5hZGQodSk7Ci0gICAgfQotCi0gICAgdm9pZCBm
cmVlemUoKQotICAgIHsKLSAgICAgICAgVG1wIHZpY3RpbSA9IG1fZnJlZXplV29ya2xpc3QudGFr
ZUFueSgpOwotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZpY3RpbSkgPT0g
dmljdGltLCAiY29hbGVzY2UoKSBzaG91bGQgbm90IGxlYXZlIGFsaWFzZWQgVG1wIGluIHRoZSB3
b3JrbGlzdC4iKTsKLSAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW0pOwot
ICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW0pOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXplTW92
ZXMoVG1wIHRtcCkKLSAgICB7Ci0gICAgICAgIGZvckVhY2hOb2RlTW92ZXModG1wLCBbdGhpcywg
dG1wXSAodW5zaWduZWQgbW92ZUluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92
ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zl
cy50YWtlTW92ZShtb3ZlSW5kZXgpOwotCi0gICAgICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMm
IG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAg
ICAgICAgIFRtcCBvcmlnaW5hbE90aGVyVG1wID0gbW92ZU9wZXJhbmRzLnNyYyAhPSB0bXAgPyBt
b3ZlT3BlcmFuZHMuc3JjIDogbW92ZU9wZXJhbmRzLmRzdDsKLSAgICAgICAgICAgIFRtcCBvdGhl
clRtcCA9IGdldEFsaWFzKG9yaWdpbmFsT3RoZXJUbXApOwotICAgICAgICAgICAgaWYgKG1fZGVn
cmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChvdGhlclRtcCldIDwg
bV9udW1iZXJPZlJlZ2lzdGVycyAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcCkpIHsKLSAgICAg
ICAgICAgICAgICBpZiAobV9mcmVlemVXb3JrbGlzdC5yZW1vdmUob3RoZXJUbXApKQotICAgICAg
ICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKG90aGVyVG1wKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBzZWxlY3RTcGlsbCgpCi0g
ICAgewotICAgICAgICBpZiAoIW1faGFzU2VsZWN0ZWRTcGlsbCkgewotICAgICAgICAgICAgbV9o
YXNTZWxlY3RlZFNwaWxsID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKG1faGFzQ29hbGVzY2Vk
Tm9uVHJpdmlhbE1vdmUpCi0gICAgICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbCA9
IG1fY29hbGVzY2VkVG1wczsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaXRlcmF0b3IgPSBt
X3NwaWxsV29ya2xpc3QuYmVnaW4oKTsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IgIT0gbV9z
cGlsbFdvcmtsaXN0LmVuZCgpICYmIG1fdW5zcGlsbGFibGVUbXAuY29udGFpbnMoKml0ZXJhdG9y
KSkKLSAgICAgICAgICAgICsraXRlcmF0b3I7Ci0KLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lU
SF9NRVNTQUdFKGl0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgIkl0IGlzIG5vdCBw
b3NzaWJsZSB0byBjb2xvciB0aGUgQWlyIGdyYXBoIHdpdGggdGhlIG51bWJlciBvZiBhdmFpbGFi
bGUgcmVnaXN0ZXJzLiIpOwotCi0gICAgICAgIC8vIEhpZ2hlciBzY29yZSBtZWFucyBtb3JlIGRl
c2lyYWJsZSB0byBzcGlsbC4gTG93ZXIgc2NvcmVzIG1heGltaXplIHRoZSBsaWtlbGlob29kIHRo
YXQgYSB0bXAKLSAgICAgICAgLy8gZ2V0cyBhIHJlZ2lzdGVyLgotICAgICAgICBhdXRvIHNjb3Jl
ID0gWyZdIChUbXAgdG1wKSAtPiBkb3VibGUgewotICAgICAgICAgICAgLy8gQWlyIGV4cG9zZXMg
dGhlIGNvbmNlcHQgb2YgImZhc3QgdG1wcyIsIGFuZCB3ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFu
IHRoYXQgdGhlIHRtcAotICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHJlZ2lz
dGVyLgotICAgICAgICAgICAgaWYgKG1fY29kZS5pc0Zhc3RUbXAodG1wKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVp
bmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgZGVn
cmVlLgotICAgICAgICAgICAgZG91YmxlIGRlZ3JlZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV9k
ZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKTsKLQot
ICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUg
aW52ZXJzZWx5IHJlbGF0ZWQgdG8gdGhlIG51bWJlciBvZiB3YXJtIHVzZXMgYW5kCi0gICAgICAg
ICAgICAvLyBkZWZzLgotICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyYg
Y291bnRzID0gbV91c2VDb3VudHNbdG1wXTsKLSAgICAgICAgICAgIGRvdWJsZSB1c2VzID0gY291
bnRzLm51bVdhcm1Vc2VzICsgY291bnRzLm51bURlZnM7Ci0KLSAgICAgICAgICAgIHJldHVybiBk
ZWdyZWUgLyB1c2VzOwotICAgICAgICB9OwotCi0gICAgICAgIGF1dG8gdmljdGltSXRlcmF0b3Ig
PSBpdGVyYXRvcjsKLSAgICAgICAgZG91YmxlIG1heFNjb3JlID0gc2NvcmUoKml0ZXJhdG9yKTsK
LQotICAgICAgICArK2l0ZXJhdG9yOwotICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3NwaWxs
V29ya2xpc3QuZW5kKCk7ICsraXRlcmF0b3IpIHsKLSAgICAgICAgICAgIGRvdWJsZSB0bXBTY29y
ZSA9IHNjb3JlKCppdGVyYXRvcik7Ci0gICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29y
ZSkgewotICAgICAgICAgICAgICAgIGlmIChtX3Vuc3BpbGxhYmxlVG1wLmNvbnRhaW5zKCppdGVy
YXRvcikpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAg
dmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgICAgICAgICBtYXhTY29yZSA9IHRt
cFNjb3JlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVG1wIHZpY3RpbVRt
cCA9ICp2aWN0aW1JdGVyYXRvcjsKLSAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2aWN0
aW1JdGVyYXRvcik7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltVG1w
KTsKLSAgICAgICAgZnJlZXplTW92ZXModmljdGltVG1wKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFs
bG9jYXRlKCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UobV9hY3RpdmVNb3Zl
cy5zaXplKCkgPj0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCksICJUaGUgYWN0aXZlTW92
ZSBzZXQgc2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yIHRoZSBxdWljayBvcGVyYXRpb25zIG9mIEJp
dFZlY3Rvci4iKTsKLQotICAgICAgICBtYWtlV29ya0xpc3QoKTsKLQotICAgICAgICBpZiAoZGVi
dWcpIHsKLSAgICAgICAgICAgIGRhdGFMb2coIkludGVyZmVyZW5jZTogIiwgbGlzdER1bXAobV9p
bnRlcmZlcmVuY2VFZGdlcyksICJcbiIpOwotICAgICAgICAgICAgZHVtcEludGVyZmVyZW5jZUdy
YXBoSW5Eb3QoV1RGOjpkYXRhRmlsZSgpKTsKLSAgICAgICAgICAgIGRhdGFMb2coIkluaXRpYWwg
d29yayBsaXN0XG4iKTsKLSAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgp
KTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVn
KSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBsaWZpY2F0aW9u
IGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFG
aWxlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1fc2ltcGxpZnlXb3Jr
bGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsKLSAgICAgICAgICAg
IGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGNv
YWxlc2NlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgZnJlZXplKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9z
cGlsbFdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgpOwot
Ci0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFMb2co
IkFmdGVyIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAg
ICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IHdoaWxlICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93b3JrbGlzdE1v
dmVzLmlzRW1wdHkoKSB8fCAhbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fc3BpbGxX
b3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIGFzc2lnbkNvbG9ycygpOwotICAgIH0KLQot
ICAgIHZvaWQgYXNzaWduQ29sb3JzKCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX3NpbXBsaWZ5
V29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fd29ya2xpc3RNb3Zlcy5pc0Vt
cHR5KCkpOwotICAgICAgICBBU1NFUlQobV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpOwotICAg
ICAgICBBU1NFUlQobV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgLy8gUmVj
bGFpbSBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZS4KLSAgICAgICAgbV9pbnRlcmZlcmVuY2VF
ZGdlcy5jbGVhcigpOwotICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsKLSAgICAgICAgbV9tb3Zl
TGlzdC5jbGVhcigpOwotICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKLSAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5jbGVh
cigpOwotICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmNsZWFyKCk7Ci0KLSAgICAgICAgLy8gVHJ5
IHRvIGNvbG9yIHRoZSBUbXAgb24gdGhlIHN0YWNrLgotICAgICAgICBtX2NvbG9yZWRUbXAucmVz
aXplKG1fYWRqYWNlbmN5TGlzdC5zaXplKCkpOwotICAgICAgICBjb25zdCBhdXRvJiByZWdpc3Rl
cnNJblByaW9yaXR5T3JkZXIgPSByZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpOwotCi0gICAgICAg
IHdoaWxlICghbV9zZWxlY3RTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFRtcCB0bXAg
PSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBBU1NFUlQoIXRtcC5pc1Jl
ZygpKTsKLSAgICAgICAgICAgIEFTU0VSVCghbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKTsKLQotICAgICAgICAgICAgUmVnaXN0ZXJTZXQg
Y29sb3JlZFJlZ2lzdGVyczsKLSAgICAgICAgICAgIGZvciAoVG1wIGFkamFjZW50VG1wIDogbV9h
ZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCld
KSB7Ci0gICAgICAgICAgICAgICAgVG1wIGFsaWFzVG1wID0gZ2V0QWxpYXMoYWRqYWNlbnRUbXAp
OwotICAgICAgICAgICAgICAgIGlmIChhbGlhc1RtcC5pc1JlZygpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KGFsaWFzVG1wLnJlZygpKTsKLSAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAg
UmVnIHJlZyA9IG1fY29sb3JlZFRtcFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChhbGlhc1RtcCldOwotICAgICAgICAgICAgICAgIGlmIChyZWcpCi0gICAgICAgICAgICAg
ICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIGJvb2wgY29sb3JBc3NpZ25lZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChSZWcg
cmVnIDogcmVnaXN0ZXJzSW5Qcmlvcml0eU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFj
b2xvcmVkUmVnaXN0ZXJzLmdldChyZWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fY29sb3Jl
ZFRtcFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSA9IHJlZzsK
LSAgICAgICAgICAgICAgICAgICAgY29sb3JBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgaWYgKCFjb2xvckFzc2lnbmVkKQotICAgICAgICAgICAgICAgIG1fc3BpbGxlZFRtcC5h
ZGQodG1wKTsKLSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7Ci0KLSAg
ICAgICAgaWYgKG1fc3BpbGxlZFRtcC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBtX2NvYWxlc2Nl
ZFRtcHNBdFNwaWxsLmNsZWFyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fY29sb3Jl
ZFRtcC5jbGVhcigpOwotICAgIH0KLQotI2lmIFBMQVRGT1JNKENPQ09BKQotI3ByYWdtYSBtYXJr
IC0gRGVidWdnaW5nIGhlbHBlcnMuCi0jZW5kaWYKLQotICAgIHZvaWQgZHVtcEludGVyZmVyZW5j
ZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkKKyAgICBib29sIHByZWNvbG9yZWRDb2FsZXNj
aW5nSGV1cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKICAgICB7Ci0gICAgICAgIG91
dC5wcmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBcbiIpOworICAgICAgICBBU1NFUlQo
aXNQcmVjb2xvcmVkKHUpKTsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOwogCi0g
ICAgICAgIEhhc2hTZXQ8VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7Ci0gICAgICAgIGZvciAo
Y29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsKLSAgICAgICAgICAgIHRt
cHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoZWRnZS5maXJzdCgpKTsKLSAgICAgICAgICAgIHRtcHNX
aXRoSW50ZXJmZXJlbmNlcy5hZGQoZWRnZS5zZWNvbmQoKSk7CisgICAgICAgIC8vIElmIGFueSBh
ZGphY2VudCBvZiB0aGUgbm9uLWNvbG9yZWQgbm9kZSBpcyBub3QgYW4gYWRqYWNlbnQgb2YgdGhl
IGNvbG9yZWQgbm9kZSBBTkQgaGFzIGEgZGVncmVlID49IEsKKyAgICAgICAgLy8gdGhlcmUgaXMg
YSByaXNrIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgY29sb3IgYXMgb3Vy
IHByZWNvbG9yZWQgbm9kZS4gSWYgd2UgY29hbGVzY2Ugc3VjaAorICAgICAgICAvLyBtb3ZlLCB3
ZSBtYXkgY3JlYXRlIGFuIHVuY29sb3JhYmxlIGdyYXBoLgorICAgICAgICBjb25zdCBhdXRvJiBh
ZGphY2VudHNPZlYgPSBtX2FkamFjZW5jeUxpc3Rbdl07CisgICAgICAgIGZvciAodW5zaWduZWQg
YWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikgeworICAgICAgICAgICAgaWYgKCFpc1By
ZWNvbG9yZWQoYWRqYWNlbnRUbXBJbmRleCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzQmVlblNp
bXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkKKyAgICAgICAgICAgICAgICAmJiBtX2RlZ3JlZXNb
YWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKQorICAgICAg
ICAgICAgICAgICYmICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVk
Z2UodSwgYWRqYWNlbnRUbXBJbmRleCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAgICAgfQotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJbnRl
cmZlcmVuY2VzKQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFs
dWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICIgKCIsIG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSwgIilcIl07XG4iKTsKLQotICAgICAgICBmb3Ig
KGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQotICAgICAgICAgICAgb3V0
LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgpLmludGVybmFsVmFsdWUoKSwgIiAtLSAiLCBlZGdl
LnNlY29uZCgpLmludGVybmFsVmFsdWUoKSwgIjtcbiIpOwotICAgICAgICBvdXQucHJpbnQoIn1c
biIpOwotICAgIH0KLQotICAgIHZvaWQgZHVtcFdvcmtMaXN0cyhQcmludFN0cmVhbSYgb3V0KQot
ICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsKLSAgICAg
ICAgZm9yIChUbXAgdG1wIDogbV9zaW1wbGlmeVdvcmtsaXN0KQotICAgICAgICAgICAgb3V0LnBy
aW50KCIgICAgIiwgdG1wLCAiXG4iKTsKLSAgICAgICAgb3V0LnByaW50ZigiTW92ZXMgd29yayBs
aXN0IGlzIGVtcHR5PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7Ci0gICAgICAg
IG91dC5wcmludCgiRnJlZXplIHdvcmsgbGlzdDpcbiIpOwotICAgICAgICBmb3IgKFRtcCB0bXAg
OiBtX2ZyZWV6ZVdvcmtsaXN0KQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLCAi
XG4iKTsKLSAgICAgICAgb3V0LnByaW50KCJTcGlsbCB3b3JrIGxpc3Q6XG4iKTsKLSAgICAgICAg
Zm9yIChUbXAgdG1wIDogbV9zcGlsbFdvcmtsaXN0KQotICAgICAgICAgICAgb3V0LnByaW50KCIg
ICAgIiwgdG1wLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCitwcm90ZWN0
ZWQ6CiAjaWYgUExBVEZPUk0oQ09DT0EpCiAjcHJhZ21hIG1hcmsgLQogI2VuZGlmCkBAIC03NDMs
MTcgKzQ0NywxNSBAQCBwcml2YXRlOgogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBJ
bnRlcmZlcmVuY2VFZGdlKFRtcCBhLCBUbXAgYikKKyAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShJ
bmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChh
LmludGVybmFsVmFsdWUoKSk7Ci0gICAgICAgICAgICBBU1NFUlQoYi5pbnRlcm5hbFZhbHVlKCkp
OworICAgICAgICAgICAgQVNTRVJUKGEpOworICAgICAgICAgICAgQVNTRVJUKGIpOwogICAgICAg
ICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShhICE9IGIsICJBIFRtcCBjYW4gbmV2ZXIgaW50ZXJm
ZXJlIHdpdGggaXRzZWxmLiBEb2luZyBzbyB3b3VsZCBmb3JjZSBpdCB0byBiZSB0aGUgc3VwZXJw
b3NpdGlvbiBvZiB0d28gcmVnaXN0ZXJzLiIpOwogCi0gICAgICAgICAgICB1bnNpZ25lZCBhSW50
ZXJuYWwgPSBhLmludGVybmFsVmFsdWUoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGJJbnRlcm5h
bCA9IGIuaW50ZXJuYWxWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGJJbnRlcm5hbCA8IGFJbnRl
cm5hbCkKLSAgICAgICAgICAgICAgICBzdGQ6OnN3YXAoYUludGVybmFsLCBiSW50ZXJuYWwpOwot
ICAgICAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihhSW50ZXJuYWwpIDw8
IDMyIHwgYkludGVybmFsOworICAgICAgICAgICAgaWYgKGIgPCBhKQorICAgICAgICAgICAgICAg
IHN0ZDo6c3dhcChhLCBiKTsKKyAgICAgICAgICAgIG1fdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50
NjRfdD4oYSkgPDwgMzIgfCBiOwogICAgICAgICB9CiAKICAgICAgICAgSW50ZXJmZXJlbmNlRWRn
ZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCkBAIC03NjEsMTQgKzQ2MywxNCBAQCBw
cml2YXRlOgogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBUbXAgZmlyc3QoKSBjb25z
dAorICAgICAgICBJbmRleFR5cGUgZmlyc3QoKSBjb25zdAogICAgICAgICB7Ci0gICAgICAgICAg
ICByZXR1cm4gVG1wOjp0bXBGb3JJbnRlcm5hbFZhbHVlKG1fdmFsdWUgPj4gMzIpOworICAgICAg
ICAgICAgcmV0dXJuIG1fdmFsdWUgPj4gMzIgJiAweGZmZmZmZmZmOwogICAgICAgICB9CiAKLSAg
ICAgICAgVG1wIHNlY29uZCgpIGNvbnN0CisgICAgICAgIEluZGV4VHlwZSBzZWNvbmQoKSBjb25z
dAogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVG1wOjp0bXBGb3JJbnRlcm5hbFZhbHVl
KG1fdmFsdWUgJiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlICYgMHhm
ZmZmZmZmZjsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRl
cmZlcmVuY2VFZGdlIG90aGVyKSBjb25zdApAQCAtODAyLDM4ICs1MDQsMzUgQEAgcHJpdmF0ZToK
ICAgICB9OwogICAgIHR5cGVkZWYgU2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVk
Z2U+IEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzOwogCi0gICAgQ29kZSYgbV9jb2RlOwotICAg
IGNvbnN0IFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKLQotICAgIGNvbnN0IEhhc2hTZXQ8
VG1wPiYgbV91bnNwaWxsYWJsZVRtcDsKLSAgICB1bnNpZ25lZCBtX251bWJlck9mUmVnaXN0ZXJz
IHsgMCB9OworICAgIGNvbnN0IFZlY3RvcjxSZWc+JiBtX3JlZ3NJblByaW9yaXR5T3JkZXI7Cisg
ICAgSW5kZXhUeXBlIG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4IHsgMCB9OwogCiAgICAg
Ly8gVGhlIGludGVyZmVyZW5jZSBncmFwaC4KICAgICBIYXNoU2V0PEludGVyZmVyZW5jZUVkZ2Us
IEludGVyZmVyZW5jZUVkZ2VIYXNoLCBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0cz4gbV9pbnRl
cmZlcmVuY2VFZGdlczsKLSAgICBWZWN0b3I8VmVjdG9yPFRtcCwgMCwgVW5zYWZlVmVjdG9yT3Zl
cmZsb3csIDQ+LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2VuY3lMaXN0OwotICAg
IFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fZGVncmVlczsKKyAg
ICBWZWN0b3I8VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3csIDQ+LCAw
LCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2VuY3lMaXN0OworICAgIFZlY3RvcjxJbmRl
eFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2RlZ3JlZXM7CiAKICAgICAvLyBJbnN0
ZWFkIG9mIGtlZXBpbmcgdHJhY2sgb2YgdGhlIG1vdmUgaW5zdHJ1Y3Rpb25zLCB3ZSBqdXN0IGtl
ZXAgdGhlaXIgb3BlcmFuZHMgYXJvdW5kIGFuZCB1c2UgdGhlIGluZGV4CiAgICAgLy8gaW4gdGhl
IHZlY3RvciBhcyB0aGUgImlkZW50aWZpZXIiIGZvciB0aGUgbW92ZS4KICAgICBzdHJ1Y3QgTW92
ZU9wZXJhbmRzIHsKLSAgICAgICAgVG1wIHNyYzsKLSAgICAgICAgVG1wIGRzdDsKKyAgICAgICAg
SW5kZXhUeXBlIHNyY0luZGV4OworICAgICAgICBJbmRleFR5cGUgZHN0SW5kZXg7CiAgICAgfTsK
ICAgICBWZWN0b3I8TW92ZU9wZXJhbmRzLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2Fs
ZXNjaW5nQ2FuZGlkYXRlczsKIAogICAgIC8vIExpc3Qgb2YgZXZlcnkgbW92ZSBpbnN0cnVjdGlv
biBhc3NvY2lhdGVkIHdpdGggYSBUbXAuCi0gICAgVmVjdG9yPEhhc2hTZXQ8dW5zaWduZWQsIERl
ZmF1bHRIYXNoPHVuc2lnbmVkPjo6SGFzaCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRy
YWl0czx1bnNpZ25lZD4+PiBtX21vdmVMaXN0OworICAgIFZlY3RvcjxIYXNoU2V0PEluZGV4VHlw
ZSwgdHlwZW5hbWUgRGVmYXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RGOjpVbnNpZ25lZFdp
dGhaZXJvS2V5SGFzaFRyYWl0czxJbmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsKIAogICAgIC8vIENv
bG9ycy4KICAgICBWZWN0b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2xvcmVk
VG1wOwotICAgIEhhc2hTZXQ8VG1wPiBtX3NwaWxsZWRUbXA7CisgICAgVmVjdG9yPEluZGV4VHlw
ZT4gbV9zcGlsbGVkVG1wczsKIAogICAgIC8vIFZhbHVlcyB0aGF0IGhhdmUgYmVlbiBjb2FsZXNj
ZWQgd2l0aCBhbiBvdGhlciB2YWx1ZS4KLSAgICBWZWN0b3I8VG1wLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzOworICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2Fm
ZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHM7CiAKICAgICAvLyBUaGUgc3RhY2sgb2Yg
VG1wIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGggYW5kIHJlYWR5IGZvciBjb2xvcmluZy4KICAgICBC
aXRWZWN0b3IgbV9pc09uU2VsZWN0U3RhY2s7Ci0gICAgVmVjdG9yPFRtcD4gbV9zZWxlY3RTdGFj
azsKKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NlbGVjdFN0YWNrOwogCiAgICAgc3RydWN0IE9y
ZGVyZWRNb3ZlU2V0IHsKICAgICAgICAgdW5zaWduZWQgYWRkTW92ZSgpCkBAIC05MTQsMTQwICs2
MTMsNTYyIEBAIHByaXZhdGU6CiAgICAgLy8gU2V0IG9mICJtb3ZlIiBub3QgeWV0IHJlYWR5IGZv
ciBjb2FsZXNjaW5nLgogICAgIEJpdFZlY3RvciBtX2FjdGl2ZU1vdmVzOwogICAgIC8vIExvdy1k
ZWdyZWUsIG5vbi1Nb3ZlIHJlbGF0ZWQuCi0gICAgVmVjdG9yPFRtcD4gbV9zaW1wbGlmeVdvcmts
aXN0OworICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2ltcGxpZnlXb3JrbGlzdDsKICAgICAvLyBI
aWdoLWRlZ3JlZSBUbXAuCi0gICAgSGFzaFNldDxUbXA+IG1fc3BpbGxXb3JrbGlzdDsKKyAgICBI
YXNoU2V0PEluZGV4VHlwZT4gbV9zcGlsbFdvcmtsaXN0OwogICAgIC8vIExvdy1kZWdyZWUsIE1v
dmUgcmVsYXRlZC4KLSAgICBIYXNoU2V0PFRtcD4gbV9mcmVlemVXb3JrbGlzdDsKKyAgICBIYXNo
U2V0PEluZGV4VHlwZT4gbV9mcmVlemVXb3JrbGlzdDsKIAogICAgIGJvb2wgbV9oYXNTZWxlY3Rl
ZFNwaWxsIHsgZmFsc2UgfTsKICAgICBib29sIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUg
eyBmYWxzZSB9OwogCiAgICAgLy8gVGhlIG1hcHBpbmcgb2YgVG1wIHRvIHRoZWlyIGFsaWFzIGZv
ciBNb3ZlcyB0aGF0IGFyZSBhbHdheXMgY29hbGVzY2luZyByZWdhcmRsZXNzIG9mIHNwaWxsaW5n
LgotICAgIFZlY3RvcjxUbXAsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRt
cHNBdFNwaWxsOworICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93
PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwogfTsKIAorLy8gVGhpcyBwZXJmb3JtIGFsbCB0aGUg
dGFza3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiByZWdpc3RlciB0eXBlLgogdGVtcGxh
dGU8QXJnOjpUeXBlIHR5cGU+Ci1ib29sIGlzVXNlbGVzc01vdmVJbnN0KGNvbnN0IEluc3QmIGlu
c3QpCi17Ci0gICAgcmV0dXJuIE1vdmVJbnN0SGVscGVyPHR5cGU+OjptYXlCZUNvYWxlc2NhYmxl
KGluc3QpICYmIGluc3QuYXJnc1swXS50bXAoKSA9PSBpbnN0LmFyZ3NbMV0udG1wKCk7Ci19Ci0K
LXRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotdm9pZCBhc3NpZ25SZWdpc3RlclRvVG1wSW5Qcm9n
cmFtKENvZGUmIGNvZGUsIGNvbnN0IEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nQWxsb2NhdG9y
PHR5cGU+JiBhbGxvY2F0b3IpCi17Ci0gICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGNvZGUp
IHsKLSAgICAgICAgLy8gR2l2ZSBUbXAgYSB2YWxpZCByZWdpc3Rlci4KLSAgICAgICAgZm9yICh1
bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJ
bmRleCkgewotICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOwot
ICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wRmFzdChbJl0gKFRtcCYgdG1wKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKHRtcC5pc1JlZygpIHx8IHRtcC5pc0dQKCkgPT0gKHR5cGUgIT0gQXJnOjpH
UCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKK2NsYXNzIENvbG9yaW5nQWxsb2NhdG9y
IDogcHVibGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+IHsKK3B1YmxpYzoK
KyAgICBDb2xvcmluZ0FsbG9jYXRvcihDb2RlJiBjb2RlLCBjb25zdCBVc2VDb3VudHM8VG1wPiYg
dXNlQ291bnRzLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXApCisgICAg
ICAgIDogQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4ocmVnc0luUHJpb3JpdHlP
cmRlcih0eXBlKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJ
bmRleCgpLCB0bXBBcnJheVNpemUoY29kZSkpCisgICAgICAgICwgbV9jb2RlKGNvZGUpCisgICAg
ICAgICwgbV91c2VDb3VudHModXNlQ291bnRzKQorICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXBz
KHVuc3BpbGxhYmxlVG1wKQorICAgIHsKKyAgICAgICAgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAo
KTsKKyAgICAgICAgYnVpbGQoKTsKKyAgICAgICAgYWxsb2NhdGUoKTsKKyAgICB9CiAKLSAgICAg
ICAgICAgICAgICBUbXAgYWxpYXNUbXAgPSBhbGxvY2F0b3IuZ2V0QWxpYXModG1wKTsKLSAgICAg
ICAgICAgICAgICBUbXAgYXNzaWduZWRUbXA7Ci0gICAgICAgICAgICAgICAgaWYgKGFsaWFzVG1w
LmlzUmVnKCkpCi0gICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKGFsaWFzVG1w
LnJlZygpKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0
byByZWcgPSBhbGxvY2F0b3IuYWxsb2NhdGVkUmVnKGFsaWFzVG1wKTsKLSAgICAgICAgICAgICAg
ICAgICAgQVNTRVJUKHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1w
KHJlZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFTU0VSVChhc3NpZ25l
ZFRtcC5pc1JlZygpKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBhc3NpZ25lZFRtcDsKLSAgICAg
ICAgICAgIH0pOwotICAgICAgICB9CisgICAgVG1wIGdldEFsaWFzKFRtcCB0bXApIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNv
bHV0ZUluZGV4KGdldEFsaWFzKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHRtcCkpKTsKKyAgICB9CiAKLSAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgdXNlbGVzcyBtb3Zl
cyB3ZSBjcmVhdGVkIGluIHRoaXMgYmxvY2suCi0gICAgICAgIGJsb2NrLT5pbnN0cygpLnJlbW92
ZUFsbE1hdGNoaW5nKGlzVXNlbGVzc01vdmVJbnN0PHR5cGU+KTsKKyAgICBib29sIGlzVXNlbGVz
c01vdmUoY29uc3QgSW5zdCYgaW5zdCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtYXlC
ZUNvYWxlc2NhYmxlKGluc3QpICYmIGluc3QuYXJnc1swXS50bXAoKSA9PSBpbnN0LmFyZ3NbMV0u
dG1wKCk7CiAgICAgfQotfQogCi10ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLXZvaWQgYWRkU3Bp
bGxBbmRGaWxsVG9Qcm9ncmFtKENvZGUmIGNvZGUsIGNvbnN0IEl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IsIEhhc2hTZXQ8VG1wPiYgdW5zcGlsbGFi
bGVUbXApCi17Ci0gICAgY29uc3QgSGFzaFNldDxUbXA+JiBzcGlsbGVkVG1wID0gYWxsb2NhdG9y
LnNwaWxsZWRUbXAoKTsKKyAgICBUbXAgZ2V0QWxpYXNXaGVuU3BpbGxpbmcoVG1wIHRtcCkgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMuaXNF
bXB0eSgpLCAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBjb2FsZXNjaW5nIGR1cmlu
ZyBzcGlsbGluZy4iKTsKIAotICAgIC8vIEFsbCB0aGUgc3BpbGxlZCB2YWx1ZXMgYmVjb21lIHVu
c3BpbGxhYmxlLgotICAgIHVuc3BpbGxhYmxlVG1wLmFkZChzcGlsbGVkVG1wLmJlZ2luKCksIHNw
aWxsZWRUbXAuZW5kKCkpOworICAgICAgICBpZiAobV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5pc0Vt
cHR5KCkpCisgICAgICAgICAgICByZXR1cm4gdG1wOwogCi0gICAgLy8gQWxsb2NhdGUgc3RhY2sg
c2xvdCBmb3IgZWFjaCBzcGlsbGVkIHZhbHVlLgotICAgIEhhc2hNYXA8VG1wLCBTdGFja1Nsb3Qq
PiBzdGFja1Nsb3RzOwotICAgIGZvciAoVG1wIHRtcCA6IHNwaWxsZWRUbXApIHsKLSAgICAgICAg
Ym9vbCBpc05ld1RtcCA9IHN0YWNrU2xvdHMuYWRkKHRtcCwgY29kZS5hZGRTdGFja1Nsb3QoOCwg
U3RhY2tTbG90S2luZDo6QW5vbnltb3VzKSkuaXNOZXdFbnRyeTsKLSAgICAgICAgQVNTRVJUX1VO
VVNFRChpc05ld1RtcCwgaXNOZXdUbXApOwotICAgIH0KKyAgICAgICAgdW5zaWduZWQgYWxpYXNJ
bmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAg
ICAgIHdoaWxlICh1bnNpZ25lZCBuZXh0QWxpYXNJbmRleCA9IG1fY29hbGVzY2VkVG1wc0F0U3Bp
bGxbYWxpYXNJbmRleF0pCisgICAgICAgICAgICBhbGlhc0luZGV4ID0gbmV4dEFsaWFzSW5kZXg7
CiAKLSAgICAvLyBSZXdyaXRlIHRoZSBwcm9ncmFtIHRvIGdldCByaWQgb2YgdGhlIHNwaWxsZWQg
VG1wLgotICAgIEluc2VydGlvblNldCBpbnNlcnRpb25TZXQoY29kZSk7Ci0gICAgZm9yIChCYXNp
Y0Jsb2NrKiBibG9jayA6IGNvZGUpIHsKLSAgICAgICAgYm9vbCBoYXNBbGlhc2VkVG1wcyA9IGZh
bHNlOwotCi0gICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwg
YmxvY2stPnNpemUoKTsgKytpbnN0SW5kZXgpIHsKLSAgICAgICAgICAgIEluc3QmIGluc3QgPSBi
bG9jay0+YXQoaW5zdEluZGV4KTsKLQotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlcGxhY2UgdGhl
IHJlZ2lzdGVyIHVzZSBieSBtZW1vcnkgdXNlIHdoZW4gcG9zc2libGUuCi0gICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5zdC5hcmdzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
ICAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3NbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGFy
Zy5pc1RtcCgpICYmIGFyZy50eXBlKCkgPT0gdHlwZSAmJiAhYXJnLmlzUmVnKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgYXV0byBzdGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMuZmluZChhcmcu
dG1wKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tTbG90RW50cnkgIT0gc3RhY2tT
bG90cy5lbmQoKSAmJiBpbnN0LmFkbWl0c1N0YWNrKGkpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgYXJnID0gQXJnOjpzdGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgVG1wIGFsaWFzID0gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGFsaWFzSW5kZXgpOwogCi0gICAgICAgICAg
ICAvLyBGb3IgZXZlcnkgb3RoZXIgY2FzZSwgYWRkIExvYWQvU3RvcmUgYXMgbmVlZGVkLgotICAg
ICAgICAgICAgaW5zdC5mb3JFYWNoVG1wKFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9sZSByb2xlLCBB
cmc6OlR5cGUgYXJnVHlwZSkgewotICAgICAgICAgICAgICAgIGlmICh0bXAuaXNSZWcoKSB8fCBh
cmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQVNT
RVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wcy5jb250YWlucyhhbGlhc0luZGV4KSB8fCBh
bGlhcyA9PSB0bXAsICJUaGUgYWxpYXNlcyBhdCBzcGlsbCBzaG91bGQgYWx3YXlzIGJlIGNvbG9y
YWJsZS4gU29tZXRoaW5nIHdlbnQgaG9ycmlibHkgd3JvbmcuIik7CiAKLSAgICAgICAgICAgICAg
ICBhdXRvIHN0YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKHRtcCk7Ci0gICAgICAgICAg
ICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgVG1wIGFsaWFzID0gYWxsb2NhdG9yLmdldEFsaWFzV2hlblNwaWxsaW5nKHRt
cCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbGlhcyAhPSB0bXApIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHRtcCA9IGFsaWFzOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWxp
YXNlZFRtcHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGlhczsKKyAg
ICB9CiAKLSAgICAgICAgICAgICAgICBBcmcgYXJnID0gQXJnOjpzdGFjayhzdGFja1Nsb3RFbnRy
eS0+dmFsdWUpOwotICAgICAgICAgICAgICAgIE9wY29kZSBtb3ZlID0gdHlwZSA9PSBBcmc6OkdQ
ID8gTW92ZSA6IE1vdmVEb3VibGU7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhJdGVyYXRv
cj4KKyAgICBjbGFzcyBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yIHsKKyAgICBwdWJsaWM6Cisg
ICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3IoSW5kZXhJdGVyYXRvciYmIGluZGV4SXRl
cmF0b3IpCisgICAgICAgICAgICA6IG1faW5kZXhJdGVyYXRvcihXVEY6Om1vdmUoaW5kZXhJdGVy
YXRvcikpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKEFyZzo6
aXNBbnlVc2Uocm9sZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgVG1wIG5ld1RtcCA9IGNvZGUu
bmV3VG1wKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25TZXQuaW5zZXJ0KGlu
c3RJbmRleCwgbW92ZSwgaW5zdC5vcmlnaW4sIGFyZywgbmV3VG1wKTsKLSAgICAgICAgICAgICAg
ICAgICAgdG1wID0gbmV3VG1wOworICAgICAgICBUbXAgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1
cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCptX2luZGV4
SXRlcmF0b3IpOyB9CisgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG9wZXJhdG9y
KysoKSB7ICsrbV9pbmRleEl0ZXJhdG9yOyByZXR1cm4gKnRoaXM7IH0KIAotICAgICAgICAgICAg
ICAgICAgICAvLyBBbnkgbmV3IEZpbGwoKSBzaG91bGQgbmV2ZXIgYmUgc3BpbGxlZC4KLSAgICAg
ICAgICAgICAgICAgICAgdW5zcGlsbGFibGVUbXAuYWRkKHRtcCk7Ci0gICAgICAgICAgICAgICAg
fQorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRv
ciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4SXRl
cmF0b3IgPT0gb3RoZXIubV9pbmRleEl0ZXJhdG9yOworICAgICAgICB9CisKKyAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAg
ICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEluZGV4SXRlcmF0b3IgbV9pbmRleEl0ZXJh
dG9yOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0aW9uPgorICAgIGNs
YXNzIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5k
ZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcihjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uKQorICAg
ICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29sbGVjdGlvbikKKyAgICAgICAgeworICAgICAgICB9
CisKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcjx0eXBlbmFtZSBDb2xsZWN0aW9u
Ojpjb25zdF9pdGVyYXRvcj4gYmVnaW4oKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gbV9jb2xsZWN0aW9uLmJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBJbmRleFRv
VG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBl
bmQoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmVu
ZCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9u
JiBtX2NvbGxlY3Rpb247CisgICAgfTsKKworICAgIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3I8
VmVjdG9yPHVuc2lnbmVkPj4gc3BpbGxlZFRtcHMoKSBjb25zdCB7IHJldHVybiBtX3NwaWxsZWRU
bXBzOyB9CisKKyAgICBib29sIHJlcXVpcmVzU3BpbGxpbmcoKSBjb25zdCB7IHJldHVybiAhbV9z
cGlsbGVkVG1wcy5pc0VtcHR5KCk7IH0KKworICAgIFJlZyBhbGxvY2F0ZWRSZWcoVG1wIHRtcCkg
Y29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVCghdG1wLmlzUmVnKCkpOworICAgICAgICBBU1NF
UlQobV9jb2xvcmVkVG1wLnNpemUoKSk7CisgICAgICAgIEFTU0VSVCh0bXAuaXNHUCgpID09ICh0
eXBlID09IEFyZzo6R1ApKTsKKworICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW0Fic29s
dXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOworICAgICAgICBpZiAoIXJl
ZykgeworICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IFRtcHMgdGhhdCBpbnRlcmZl
cmUuIEEgVG1wIHRoYXQgbmV2ZXIgaW50ZXJmZXJlIHdpdGggYW55dGhpbmcKKyAgICAgICAgICAg
IC8vIGNhbiB0YWtlIGFueSByZWdpc3Rlci4KKyAgICAgICAgICAgIHJlZyA9IHJlZ3NJblByaW9y
aXR5T3JkZXIodHlwZSkuZmlyc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVnOwor
ICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdW5zaWduZWQgdG1wQXJyYXlTaXplKENvZGUm
IGNvZGUpCisgICAgeworICAgICAgICB1bnNpZ25lZCBudW1UbXBzID0gY29kZS5udW1UbXBzKHR5
cGUpOworICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgobnVtVG1wcyk7CisgICAgfQorCisgICAgdm9pZCBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgp
CisgICAgeworICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fbGFzdFByZWNvbG9yZWRSZWdp
c3RlckluZGV4ICsgMSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPD0gbV9sYXN0
UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7ICsraSkgeworICAgICAgICAgICAgVG1wIHRtcCA9IEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpKTsKKyAgICAgICAg
ICAgIEFTU0VSVCh0bXAuaXNSZWcoKSk7CisgICAgICAgICAgICBtX2NvbG9yZWRUbXBbaV0gPSB0
bXAucmVnKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKCkKKyAgICB7Cisg
ICAgICAgIFRtcExpdmVuZXNzPHR5cGU+IGxpdmVuZXNzKG1fY29kZSk7CisgICAgICAgIGZvciAo
QmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAgIHR5cGVuYW1lIFRtcExp
dmVuZXNzPHR5cGU+OjpMb2NhbENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7CisgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRl
eC0tOykgeworICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4
KTsKKyAgICAgICAgICAgICAgICBJbnN0KiBuZXh0SW5zdCA9IGluc3RJbmRleCArIDEgPCBibG9j
ay0+c2l6ZSgpID8gJmJsb2NrLT5hdChpbnN0SW5kZXggKyAxKSA6IG51bGxwdHI7CisgICAgICAg
ICAgICAgICAgYnVpbGQoaW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYyk7CisgICAgICAgICAgICAg
ICAgbG9jYWxDYWxjLmV4ZWN1dGUoaW5zdEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKworICAgIHZvaWQgYnVpbGQoSW5zdCYgaW5zdCwgSW5zdCogbmV4dEluc3QsIGNv
bnN0IHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMmIGxvY2FsQ2FsYykKKyAg
ICB7CisgICAgICAgIGluc3QuZm9yRWFjaFRtcFdpdGhFeHRyYUNsb2JiZXJlZFJlZ3MoCisgICAg
ICAgICAgICBuZXh0SW5zdCwKKyAgICAgICAgICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6
Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSkgeworICAgICAgICAgICAgICAgIGlmICghQXJn
Ojppc0RlZihyb2xlKSB8fCBhcmdUeXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBBbGwgdGhlIERlZigp
cyBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIGFuZCB3aXRoIGFsbCB0aGUgZXh0cmEgY2xvYmJl
cmVkIFRtcHMuCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgZm9yRWFjaERl
ZkFuZEV4dHJhQ2xvYmJlcmVkVG1wKCkgaGVyZSBzaW5jZSBjb2xvcmVkIFRtcHMKKyAgICAgICAg
ICAgICAgICAvLyBkbyBub3QgbmVlZCBpbnRlcmZlcmVuY2UgZWRnZXMgaW4gb3VyIGltcGxlbWVu
dGF0aW9uLgorICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcChbJl0gKFRtcCYgb3RoZXJB
cmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSkgeworICAgICAgICAgICAgICAg
ICAgICBpZiAoIUFyZzo6aXNEZWYocm9sZSkgfHwgYXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoYXJn
LCBvdGhlckFyZyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKworICAg
ICAgICBpZiAobWF5QmVDb2FsZXNjYWJsZShpbnN0KSkgeworICAgICAgICAgICAgLy8gV2UgZG8g
bm90IHdhbnQgdGhlIFVzZSgpIG9mIHRoaXMgbW92ZSB0byBpbnRlcmZlcmUgd2l0aCB0aGUgRGVm
KCksIGV2ZW4gaWYgaXQgaXMgbGl2ZQorICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIE1vdmUuIElm
IHdlIHdlcmUgdG8gYWRkIHRoZSBpbnRlcmZlcmVuY2UgZWRnZSwgaXQgd291bGQgYmUgaW1wb3Nz
aWJsZSB0bworICAgICAgICAgICAgLy8gY29hbGVzY2UgdGhlIE1vdmUgZXZlbiBpZiB0aGUgdHdv
IFRtcCBuZXZlciBpbnRlcmZlcmUgYW55d2hlcmUuCisgICAgICAgICAgICBUbXAgZGVmVG1wOwor
ICAgICAgICAgICAgVG1wIHVzZVRtcDsKKyAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcChbJmRl
ZlRtcCwgJnVzZVRtcF0gKFRtcCYgYXJnVG1wLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlKSB7
CiAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNEZWYocm9sZSkpCi0gICAgICAgICAgICAgICAg
ICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdEluZGV4ICsgMSwgbW92ZSwgaW5zdC5vcmlnaW4s
IHRtcCwgYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmVG1wID0gYXJnVG1wOworICAgICAg
ICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoQXJnOjppc0Vhcmx5
VXNlKHJvbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgdXNlVG1wID0gYXJnVG1wOworICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQVNTRVJUKGRlZlRtcCk7
CisgICAgICAgICAgICBBU1NFUlQodXNlVG1wKTsKKworICAgICAgICAgICAgdW5zaWduZWQgbmV4
dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpOworICAgICAgICAgICAg
bV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
YWJzb2x1dGVJbmRleCh1c2VUbXApLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChkZWZUbXApIH0pOworCisgICAgICAgICAgICB1bnNpZ25lZCBuZXdJbmRleEluV29ya2xp
c3QgPSBtX3dvcmtsaXN0TW92ZXMuYWRkTW92ZSgpOworICAgICAgICAgICAgQVNTRVJUX1VOVVNF
RChuZXdJbmRleEluV29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUluZGV4
KTsKKworICAgICAgICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5z
aXplKCkpOworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXplKG5leHRNb3ZlSW5k
ZXggKyAxKTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBBcmcmIGFyZyA6IGluc3QuYXJncykg
eworICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOworICAgICAgICAgICAgICAgIGxp
c3QuYWRkKG5leHRNb3ZlSW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3Ig
KGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxvY2FsQ2FsYy5saXZlKCkpIHsKKyAgICAgICAgICAgICAg
ICBpZiAobGl2ZVRtcCAhPSB1c2VUbXApCisgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoZGVm
VG1wLCBsaXZlVG1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhlIG5leHQg
aW5zdHJ1Y3Rpb24gY291bGQgaGF2ZSBlYXJseSBjbG9iYmVycy4gV2UgbmVlZCB0byBjb25zaWRl
ciB0aG9zZSBub3cuCisgICAgICAgICAgICBpZiAobmV4dEluc3QgJiYgbmV4dEluc3QtPmhhc1Nw
ZWNpYWwoKSkgeworICAgICAgICAgICAgICAgIG5leHRJbnN0LT5leHRyYUVhcmx5Q2xvYmJlcmVk
UmVncygpLmZvckVhY2goWyZdIChSZWcgcmVnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChy
ZWcuaXNHUFIoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsb2NhbENhbGMubGl2ZSgpKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoVG1wKHJlZyksIGxpdmVUbXApOworICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgYWRkRWRnZXMoaW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYy5s
aXZlKCkpOworICAgIH0KKworICAgIHZvaWQgYWRkRWRnZXMoSW5zdCYgaW5zdCwgSW5zdCogbmV4
dEluc3QsIHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGM6Okl0ZXJhYmxlIGxp
dmVUbXBzKQorICAgIHsKKyAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMgaW50ZXJmZXJlIHdpdGgg
ZXZlcnRoaW5nIGxpdmUuCisgICAgICAgIGluc3QuZm9yRWFjaFRtcFdpdGhFeHRyYUNsb2JiZXJl
ZFJlZ3MoCisgICAgICAgICAgICBuZXh0SW5zdCwKKyAgICAgICAgICAgIFsmXSAoY29uc3QgVG1w
JiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSkgeworICAgICAgICAgICAg
ICAgIGlmICghQXJnOjppc0RlZihyb2xlKSB8fCBhcmdUeXBlICE9IHR5cGUpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3Ig
KGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxpdmVUbXBzKSB7CisgICAgICAgICAgICAgICAgICAgIGlm
IChsaXZlVG1wLmlzR1AoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGFkZEVkZ2UoYXJnLCBsaXZlVG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEVkZ2UoVG1wIGEsIFRtcCBiKQorICAgIHsK
KyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShhLmlzR1AoKSA9PSBiLmlzR1AoKSwgIkFuIGlu
dGVyZmVyZW5jZSBiZXR3ZWVuIHJlZ2lzdGVycyBvZiBkaWZmZXJlbnQgdHlwZXMgZG9lcyBub3Qg
bWFrZSBzZW5zZSwgaXQgY2FuIGxlYWQgdG8gbm9uLWNvbG9yYWJsZSBncmFwaHMuIik7CisKKyAg
ICAgICAgYWRkRWRnZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhKSwg
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYikpOworICAgIH0KKworICAg
IGJvb2wgbWF5QmVDb2FsZXNjYWJsZShjb25zdCBJbnN0JiBpbnN0KSBjb25zdAorICAgIHsKKyAg
ICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQXJnOjpHUDoKKyAgICAgICAgICAg
IHN3aXRjaCAoaW5zdC5vcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTW92ZToKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgQXJnOjpGUDoKKyAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5vcGNvZGUpIHsKKyAgICAgICAg
ICAgIGNhc2UgTW92ZUZsb2F0OgorICAgICAgICAgICAgY2FzZSBNb3ZlRG91YmxlOgorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAg
fQotICAgICAgICBpbnNlcnRpb25TZXQuZXhlY3V0ZShibG9jayk7CiAKLSAgICAgICAgaWYgKGhh
c0FsaWFzZWRUbXBzKQotICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hp
bmcoaXNVc2VsZXNzTW92ZUluc3Q8dHlwZT4pOworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdF
KGluc3QuYXJncy5zaXplKCkgPT0gMiwgIldlIGFzc3VtZSBjb2FsZWNhYmxlIG1vdmVzIG9ubHkg
aGF2ZSB0d28gYXJndW1lbnRzIGluIGEgZmV3IHBsYWNlcy4iKTsKKworICAgICAgICBpZiAoIWlu
c3QuYXJnc1swXS5pc1RtcCgpIHx8ICFpbnN0LmFyZ3NbMV0uaXNUbXAoKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICBBU1NFUlQoaW5zdC5hcmdzWzBdLnR5cGUoKSA9PSB0
eXBlKTsKKyAgICAgICAgQVNTRVJUKGluc3QuYXJnc1sxXS50eXBlKCkgPT0gdHlwZSk7CisKKyAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotfQogCi10ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4K
LXZvaWQgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGUoCi0gICAgQ29kZSYgY29kZSwg
Y29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cywgdW5zaWduZWQmIG51bUl0ZXJhdGlvbnMp
Ci17Ci0gICAgSGFzaFNldDxUbXA+IHVuc3BpbGxhYmxlVG1wczsKLSAgICB3aGlsZSAodHJ1ZSkg
ewotICAgICAgICBudW1JdGVyYXRpb25zKys7Ci0gICAgICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nQWxsb2NhdG9yPHR5cGU+IGFsbG9jYXRvcihjb2RlLCB1c2VDb3VudHMsIHVuc3BpbGxh
YmxlVG1wcyk7Ci0gICAgICAgIGlmIChhbGxvY2F0b3Iuc3BpbGxlZFRtcCgpLmlzRW1wdHkoKSkg
ewotICAgICAgICAgICAgYXNzaWduUmVnaXN0ZXJUb1RtcEluUHJvZ3JhbShjb2RlLCBhbGxvY2F0
b3IpOwotICAgICAgICAgICAgcmV0dXJuOworICAgIHZvaWQgc2VsZWN0U3BpbGwoKQorICAgIHsK
KyAgICAgICAgaWYgKCFtX2hhc1NlbGVjdGVkU3BpbGwpIHsKKyAgICAgICAgICAgIG1faGFzU2Vs
ZWN0ZWRTcGlsbCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRy
aXZpYWxNb3ZlKQorICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2Nv
YWxlc2NlZFRtcHM7CiAgICAgICAgIH0KLSAgICAgICAgYWRkU3BpbGxBbmRGaWxsVG9Qcm9ncmFt
PHR5cGU+KGNvZGUsIGFsbG9jYXRvciwgdW5zcGlsbGFibGVUbXBzKTsKKworICAgICAgICBhdXRv
IGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0LmJlZ2luKCk7CisKKyAgICAgICAgd2hpbGUgKGl0
ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSAmJiBtX3Vuc3BpbGxhYmxlVG1wcy5jb250
YWlucygqaXRlcmF0b3IpKQorICAgICAgICAgICAgKytpdGVyYXRvcjsKKworICAgICAgICBSRUxF
QVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoaXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgp
LCAiSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNvbG9yIHRoZSBBaXIgZ3JhcGggd2l0aCB0aGUgbnVt
YmVyIG9mIGF2YWlsYWJsZSByZWdpc3RlcnMuIik7CisKKyAgICAgICAgLy8gSGlnaGVyIHNjb3Jl
IG1lYW5zIG1vcmUgZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhl
IGxpa2VsaWhvb2QgdGhhdCBhIHRtcAorICAgICAgICAvLyBnZXRzIGEgcmVnaXN0ZXIuCisgICAg
ICAgIGF1dG8gc2NvcmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7CisgICAgICAgICAgICAv
LyBBaXIgZXhwb3NlcyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJl
dCB0aGF0IHRvIG1lYW4gdGhhdCB0aGUgdG1wCisgICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlz
IGJlIGluIGEgcmVnaXN0ZXIuCisgICAgICAgICAgICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXAp
KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgCisgICAgICAgICAgICAv
LyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxh
dGVkIHRvIHRoZSBkZWdyZWUuCisgICAgICAgICAgICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nh
c3Q8ZG91YmxlPihtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgodG1wKV0pOworCisgICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNj
b3JlIHNob3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHdhcm0gdXNl
cyBhbmQKKyAgICAgICAgICAgIC8vIGRlZnMuCisgICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8
VG1wPjo6Q291bnRzJiBjb3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOworICAgICAgICAgICAgZG91
YmxlIHVzZXMgPSBjb3VudHMubnVtV2FybVVzZXMgKyBjb3VudHMubnVtRGVmczsKKworICAgICAg
ICAgICAgcmV0dXJuIGRlZ3JlZSAvIHVzZXM7CisgICAgICAgIH07CisKKyAgICAgICAgYXV0byB2
aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOworICAgICAgICBkb3VibGUgbWF4U2NvcmUgPSBzY29y
ZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9y
KSk7CisKKyAgICAgICAgKytpdGVyYXRvcjsKKyAgICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9z
cGlsbFdvcmtsaXN0LmVuZCgpOyArK2l0ZXJhdG9yKSB7CisgICAgICAgICAgICBkb3VibGUgdG1w
U2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5k
ZXgoKml0ZXJhdG9yKSk7CisgICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgewor
ICAgICAgICAgICAgICAgIGlmIChtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0b3Ip
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIHZpY3Rp
bUl0ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgICAgICAgICAgICAgbWF4U2NvcmUgPSB0bXBTY29y
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIHZpY3RpbUlu
ZGV4ID0gKnZpY3RpbUl0ZXJhdG9yOworICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHZp
Y3RpbUl0ZXJhdG9yKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1J
bmRleCk7CisKKyAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOwogICAgIH0KLX0KKwor
ICAgIHZvaWQgYWxsb2NhdGUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSht
X2FjdGl2ZU1vdmVzLnNpemUoKSA+PSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKSwgIlRo
ZSBhY3RpdmVNb3ZlIHNldCBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgdGhlIHF1aWNrIG9wZXJh
dGlvbnMgb2YgQml0VmVjdG9yLiIpOworCisgICAgICAgIG1ha2VXb3JrTGlzdCgpOworCisgICAg
ICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgZGF0YUxvZygiSW50ZXJmZXJlbmNlOiAiLCBs
aXN0RHVtcChtX2ludGVyZmVyZW5jZUVkZ2VzKSwgIlxuIik7CisgICAgICAgICAgICBkdW1wSW50
ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgZGF0YUxv
ZygiSW5pdGlhbCB3b3JrIGxpc3RcbiIpOworICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6
OmRhdGFGaWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYg
KHRyYWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJCZWZvcmUgR3JhcGggc2lt
cGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3Rz
KFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbV9z
aW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBzaW1wbGlmeSgpOwor
ICAgICAgICAgICAgZWxzZSBpZiAoIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpCisgICAgICAg
ICAgICAgICAgY29hbGVzY2UoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX2ZyZWV6ZVdvcmts
aXN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBmcmVlemUoKTsKKyAgICAgICAgICAgIGVs
c2UgaWYgKCFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHNlbGVj
dFNwaWxsKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7CisgICAgICAgICAgICAg
ICAgZGF0YUxvZygiQWZ0ZXIgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKKyAg
ICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0gd2hpbGUgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpIHx8ICFt
X3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpIHx8ICFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSB8
fCAhbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXNzaWduQ29sb3JzKCk7
CisgICAgfQorCisjaWYgUExBVEZPUk0oQ09DT0EpCisjcHJhZ21hIG1hcmsgLSBEZWJ1Z2dpbmcg
aGVscGVycy4KKyNlbmRpZgorCisgICAgdm9pZCBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChQ
cmludFN0cmVhbSYgb3V0KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50KCJncmFwaCBJbnRlcmZl
cmVuY2VHcmFwaCB7IFxuIik7CisKKyAgICAgICAgSGFzaFNldDxUbXA+IHRtcHNXaXRoSW50ZXJm
ZXJlbmNlczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZlcmVuY2VF
ZGdlcykgeworICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7CisgICAg
ICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7CisgICAgICAgIH0KKworICAg
ICAgICBmb3IgKGNvbnN0IGF1dG8mIHRtcCA6IHRtcHNXaXRoSW50ZXJmZXJlbmNlcykKKyAgICAg
ICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwi
IiwgdG1wLCAiICgiLCBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRl
SW5kZXgodG1wKV0sICIpXCJdO1xuIik7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdl
IDogbV9pbnRlcmZlcmVuY2VFZGdlcykKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGVk
Z2UuZmlyc3QoKSwgIiAtLSAiLCBlZGdlLnNlY29uZCgpLCAiO1xuIik7CisgICAgICAgIG91dC5w
cmludCgifVxuIik7CisgICAgfQorCisgICAgdm9pZCBkdW1wV29ya0xpc3RzKFByaW50U3RyZWFt
JiBvdXQpCisgICAgeworICAgICAgICBvdXQucHJpbnQoIlNpbXBsaWZ5IHdvcmsgbGlzdDpcbiIp
OworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zaW1wbGlmeVdvcmtsaXN0KQor
ICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRt
cEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7CisgICAgICAgIG91dC5wcmludGYo
Ik1vdmVzIHdvcmsgbGlzdCBpcyBlbXB0eT8gJWRcbiIsIG1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5
KCkpOworICAgICAgICBvdXQucHJpbnQoIkZyZWV6ZSB3b3JrIGxpc3Q6XG4iKTsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fZnJlZXplV29ya2xpc3QpCisgICAgICAgICAgICBv
dXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRl
SW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICAgICAgb3V0LnByaW50KCJTcGlsbCB3b3JrIGxp
c3Q6XG4iKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc3BpbGxXb3JrbGlz
dCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOworICAgIH0KKworICAgIHVz
aW5nIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+OjphZGRFZGdlOworICAgIHVz
aW5nIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+OjpnZXRBbGlhczsKKworICAg
IENvZGUmIG1fY29kZTsKKyAgICAvLyBGSVhNRTogc3BpbGxpbmcgc2hvdWxkIG5vdCB0eXBlIHNw
ZWNpZmljLiBJdCBpcyBvbmx5IGEgc2lkZSBlZmZlY3Qgb2YgdXNpbmcgVXNlQ291bnRzLgorICAg
IGNvbnN0IFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKKyAgICBjb25zdCBIYXNoU2V0PHVu
c2lnbmVkPiYgbV91bnNwaWxsYWJsZVRtcHM7Cit9OworCitjbGFzcyBJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZyB7CitwdWJsaWM6CisgICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29k
ZSYgY29kZSkKKyAgICAgICAgOiBtX2NvZGUoY29kZSkKKyAgICAgICAgLCBtX3VzZUNvdW50cyhj
b2RlKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIHJ1bigpCisgICAgeworICAgICAgICBpdGVy
YXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkdQPigpOworICAgICAgICBpdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkZQPigpOworCisgICAgICAgIGlmIChyZXBv
cnRTdGF0cykKKyAgICAgICAgICAgIGRhdGFMb2coIk51bSBpdGVyYXRpb25zID0gIiwgbV9udW1J
dGVyYXRpb25zLCAiXG4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8QXJnOjpU
eXBlIHR5cGU+CisgICAgdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZSgpCisg
ICAgeworICAgICAgICBIYXNoU2V0PHVuc2lnbmVkPiB1bnNwaWxsYWJsZVRtcHM7CisgICAgICAg
IHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICArK21fbnVtSXRlcmF0aW9uczsKKyAgICAgICAg
ICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+IGFsbG9jYXRvcihtX2NvZGUsIG1fdXNlQ291bnRz
LCB1bnNwaWxsYWJsZVRtcHMpOworICAgICAgICAgICAgaWYgKCFhbGxvY2F0b3IucmVxdWlyZXNT
cGlsbGluZygpKSB7CisgICAgICAgICAgICAgICAgYXNzaWduUmVnaXN0ZXJzVG9UbXAoYWxsb2Nh
dG9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBhZGRTcGlsbEFuZEZpbGw8dHlwZT4oYWxsb2NhdG9yLCB1bnNwaWxsYWJsZVRtcHMpOworICAg
ICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CisgICAgdm9pZCBh
c3NpZ25SZWdpc3RlcnNUb1RtcChjb25zdCBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlPiYgYWxsb2Nh
dG9yKQorICAgIHsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgewor
ICAgICAgICAgICAgLy8gR2l2ZSBUbXAgYSB2YWxpZCByZWdpc3Rlci4KKyAgICAgICAgICAgIGZv
ciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2stPnNpemUoKTsgKytp
bnN0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJ
bmRleCk7CisgICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wRmFzdChbJl0gKFRtcCYgdG1w
KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAuaXNSZWcoKSB8fCB0bXAuaXNHUCgpID09
ICh0eXBlICE9IEFyZzo6R1ApKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisg
ICAgICAgICAgICAgICAgICAgIFRtcCBhbGlhc1RtcCA9IGFsbG9jYXRvci5nZXRBbGlhcyh0bXAp
OworICAgICAgICAgICAgICAgICAgICBUbXAgYXNzaWduZWRUbXA7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChhbGlhc1RtcC5pc1JlZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWdu
ZWRUbXAgPSBUbXAoYWxpYXNUbXAucmVnKCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVnID0gYWxsb2NhdG9yLmFsbG9jYXRlZFJl
ZyhhbGlhc1RtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQocmVnKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKHJlZyk7CisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGFzc2lnbmVkVG1wLmlzUmVnKCkp
OworICAgICAgICAgICAgICAgICAgICB0bXAgPSBhc3NpZ25lZFRtcDsKKyAgICAgICAgICAgICAg
ICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgdXNl
bGVzcyBtb3ZlcyB3ZSBjcmVhdGVkIGluIHRoaXMgYmxvY2suCisgICAgICAgICAgICBibG9jay0+
aW5zdHMoKS5yZW1vdmVBbGxNYXRjaGluZyhbJl0gKGNvbnN0IEluc3QmIGluc3QpIHsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gYWxsb2NhdG9yLmlzVXNlbGVzc01vdmUoaW5zdCk7CisgICAgICAg
ICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBl
PgorICAgIHZvaWQgYWRkU3BpbGxBbmRGaWxsKGNvbnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+
JiBhbGxvY2F0b3IsIEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMpCisgICAgewor
ICAgICAgICBIYXNoTWFwPFRtcCwgU3RhY2tTbG90Kj4gc3RhY2tTbG90czsKKyAgICAgICAgZm9y
IChUbXAgdG1wIDogYWxsb2NhdG9yLnNwaWxsZWRUbXBzKCkpIHsKKyAgICAgICAgICAgIC8vIEFs
bCB0aGUgc3BpbGxlZCB2YWx1ZXMgYmVjb21lIHVuc3BpbGxhYmxlLgorICAgICAgICAgICAgdW5z
cGlsbGFibGVUbXBzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0
bXApKTsKKworICAgICAgICAgICAgLy8gQWxsb2NhdGUgc3RhY2sgc2xvdCBmb3IgZWFjaCBzcGls
bGVkIHZhbHVlLgorICAgICAgICAgICAgYm9vbCBpc05ld1RtcCA9IHN0YWNrU2xvdHMuYWRkKHRt
cCwgbV9jb2RlLmFkZFN0YWNrU2xvdCg4LCBTdGFja1Nsb3RLaW5kOjpBbm9ueW1vdXMpKS5pc05l
d0VudHJ5OworICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChpc05ld1RtcCwgaXNOZXdUbXApOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gUmV3cml0ZSB0aGUgcHJvZ3JhbSB0byBnZXQgcmlkIG9m
IHRoZSBzcGlsbGVkIFRtcC4KKyAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlvblNldChtX2Nv
ZGUpOworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7CisgICAgICAg
ICAgICBib29sIGhhc0FsaWFzZWRUbXBzID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZvciAodW5z
aWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0SW5k
ZXgpIHsKKyAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRleCk7
CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcmVwbGFjZSB0aGUgcmVnaXN0ZXIgdXNlIGJ5
IG1lbW9yeSB1c2Ugd2hlbiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgaW5zdC5hcmdzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAg
IEFyZyYgYXJnID0gaW5zdC5hcmdzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmlz
VG1wKCkgJiYgYXJnLnR5cGUoKSA9PSB0eXBlICYmICFhcmcuaXNSZWcoKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgYXV0byBzdGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMuZmluZChhcmcu
dG1wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ICE9IHN0
YWNrU2xvdHMuZW5kKCkgJiYgaW5zdC5hZG1pdHNTdGFjayhpKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAv
LyBGb3IgZXZlcnkgb3RoZXIgY2FzZSwgYWRkIExvYWQvU3RvcmUgYXMgbmVlZGVkLgorICAgICAg
ICAgICAgICAgIGluc3QuZm9yRWFjaFRtcChbJl0gKFRtcCYgdG1wLCBBcmc6OlJvbGUgcm9sZSwg
QXJnOjpUeXBlIGFyZ1R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcC5pc1JlZygp
IHx8IGFyZ1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICAgICAgICAgICAgICBhdXRvIHN0YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5k
KHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1Nsb3RFbnRyeSA9PSBzdGFja1Ns
b3RzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUbXAgYWxpYXMgPSBhbGxvY2F0
b3IuZ2V0QWxpYXNXaGVuU3BpbGxpbmcodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChhbGlhcyAhPSB0bXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBhbGlh
czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBbGlhc2VkVG1wcyA9IHRydWU7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBcmcgYXJnID0g
QXJnOjpzdGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICBP
cGNvZGUgbW92ZSA9IHR5cGUgPT0gQXJnOjpHUCA/IE1vdmUgOiBNb3ZlRG91YmxlOworCisgICAg
ICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55VXNlKHJvbGUpKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBUbXAgbmV3VG1wID0gbV9jb2RlLm5ld1RtcCh0eXBlKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdEluZGV4LCBtb3ZlLCBpbnN0Lm9y
aWdpbiwgYXJnLCBuZXdUbXApOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbmV3VG1w
OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbnkgbmV3IEZpbGwoKSBzaG91bGQgbmV2
ZXIgYmUgc3BpbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc3BpbGxhYmxlVG1wcy5h
ZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSk7CisgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNEZWYocm9sZSkp
CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25TZXQuaW5zZXJ0KGluc3RJbmRleCAr
IDEsIG1vdmUsIGluc3Qub3JpZ2luLCB0bXAsIGFyZyk7CisgICAgICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNlcnRpb25TZXQuZXhlY3V0ZShibG9jayk7CisK
KyAgICAgICAgICAgIGlmIChoYXNBbGlhc2VkVG1wcykgeworICAgICAgICAgICAgICAgIGJsb2Nr
LT5pbnN0cygpLnJlbW92ZUFsbE1hdGNoaW5nKFsmXSAoY29uc3QgSW5zdCYgaW5zdCkgeworICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb2NhdG9yLmlzVXNlbGVzc01vdmUoaW5zdCk7Cisg
ICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBDb2RlJiBtX2NvZGU7CisgICAgVXNlQ291bnRzPFRtcD4gbV91c2VDb3VudHM7CisgICAgdW5z
aWduZWQgbV9udW1JdGVyYXRpb25zIHsgMCB9OworfTsKIAogfSAvLyBhbm9ueW1vdXMgbmFtZXNw
YWNlCiAKQEAgLTEwNTUsMTQgKzExNzYsOCBAQCB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nKENvZGUmIGNvZGUpCiB7CiAgICAgUGhhc2VTY29wZSBwaGFzZVNjb3BlKGNvZGUsICJpdGVy
YXRlZFJlZ2lzdGVyQ29hbGVzY2luZyIpOwogCi0gICAgdW5zaWduZWQgbnVtSXRlcmF0aW9ucyA9
IDA7Ci0KLSAgICBVc2VDb3VudHM8VG1wPiB1c2VDb3VudHMoY29kZSk7Ci0gICAgaXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpHUD4oY29kZSwgdXNlQ291bnRzLCBudW1JdGVy
YXRpb25zKTsKLSAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkZQPihj
b2RlLCB1c2VDb3VudHMsIG51bUl0ZXJhdGlvbnMpOwotCi0gICAgaWYgKHJlcG9ydFN0YXRzKQot
ICAgICAgICBkYXRhTG9nKCJOdW0gaXRlcmF0aW9ucyA9ICIsIG51bUl0ZXJhdGlvbnMsICJcbiIp
OworICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nKGNvZGUpOworICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLnJ1bigpOwogfQogCiB9
IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpclRtcElubGluZXMuaCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyVG1wSW5saW5lcy5oCmluZGV4IDJmMWUwOWM1ZDUwYjg3ZTYxZDVmY2NlNTE4YzY4
MGZiNWVjOGI4MWMuLjJlNDJiOWI5NmYxMDhhMjAyNzUwMWEyMDFhNjhiNTEyODU5ZGZiNDcgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wSW5saW5lcy5oCisr
KyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1wSW5saW5lcy5oCkBAIC01Nyw2
ICs1NywxMSBAQCBzdHJ1Y3QgQWJzb2x1dGVUbXBNYXBwZXI8QXJnOjpHUD4gewogICAgICAgICBy
ZXR1cm4gYWJzb2x1dGVJbmRleChUbXA6OmdwVG1wRm9ySW5kZXgodG1wSW5kZXgpKTsKICAgICB9
CiAKKyAgICBzdGF0aWMgdW5zaWduZWQgbGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCkKKyAgICB7
CisgICAgICAgIHJldHVybiBhYnNvbHV0ZUluZGV4KFRtcChNYWNyb0Fzc2VtYmxlcjo6bGFzdFJl
Z2lzdGVyKCkpKTsKKyAgICB9CisKICAgICBzdGF0aWMgVG1wIHRtcEZyb21BYnNvbHV0ZUluZGV4
KHVuc2lnbmVkIHRtcEluZGV4KQogICAgIHsKICAgICAgICAgcmV0dXJuIFRtcDo6dG1wRm9ySW50
ZXJuYWxWYWx1ZSh0bXBJbmRleCk7CkBAIC03Nyw2ICs4MiwxMSBAQCBzdHJ1Y3QgQWJzb2x1dGVU
bXBNYXBwZXI8QXJnOjpGUD4gewogICAgICAgICByZXR1cm4gYWJzb2x1dGVJbmRleChUbXA6OmZw
VG1wRm9ySW5kZXgodG1wSW5kZXgpKTsKICAgICB9CiAKKyAgICBzdGF0aWMgdW5zaWduZWQgbGFz
dE1hY2hpbmVSZWdpc3RlckluZGV4KCkKKyAgICB7CisgICAgICAgIHJldHVybiBhYnNvbHV0ZUlu
ZGV4KFRtcChNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKSkpOworICAgIH0KKwogICAg
IHN0YXRpYyBUbXAgdG1wRnJvbUFic29sdXRlSW5kZXgodW5zaWduZWQgdG1wSW5kZXgpCiAgICAg
ewogICAgICAgICByZXR1cm4gVG1wOjp0bXBGb3JJbnRlcm5hbFZhbHVlKC10bXBJbmRleCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>267696</attachid>
            <date>2015-12-19 11:17:10 -0800</date>
            <delta_ts>2015-12-19 11:17:10 -0800</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-152420-20151219201630.patch</filename>
            <type>text/plain</type>
            <size>71454</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0MzE0CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCAw
MjhmYjQyOWYxZWU4OGRiZDc3MjRhOTIxNzU5NWQzYTZlNmM4NjljLi42ZTE2YTI3NmZiMWRkOTVj
MzNlMjQwZDhhOTA3MzZmYjQ4MWQyNTIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
NSArMSw0OSBAQAogMjAxNS0xMi0xOSAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KIAorICAgICAgICBbSlNDXSBTdHJlYW1saW5lIFRtcCBpbmRleGluZyBpbnNpZGUgdGhl
IHJlZ2lzdGVyIGFsbG9jYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTUyNDIwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRmlsaXAgUGl6bG8uCisK
KyAgICAgICAgQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgaGFzIGJlZW4gYWNjdW11bGF0
aW5nIGEgYml0IG9mIG1lc3Mgb3ZlciB0aW1lLgorCisgICAgICAgIFdoZW4gaXQgc3RhcnRlZCwg
ZXZlcnkgbWFwIGFkZHJlc3NlZCBieSBUbXAgd2FzIHVzaW5nIFRtcCBoYXNoaW5nLgorICAgICAg
ICBUaGF0IGNhdXNlZCBtYXNzaXZlIHBlcmZvcm1hbmNlIHByb2JsZW1zLiBFdmVyeXRoaW5nIHBl
cmYgc2Vuc2l0aXZlIHdhcyBtb3ZlZAorICAgICAgICB0byBkaXJlY3QgYXJyYXkgYWRkcmVzc2lu
ZyBieSB0aGUgYWJzb2x1dGUgVG1wIGluZGV4LiBUaGlzIGxlZnQgdGhlIGNvZGUKKyAgICAgICAg
d2l0aCBoYWxmIG9mIHRoZSBmdW5jdGlvbiB1c2luZyBUbXAsIHRoZSBvdGhlciBoYWxmIHVzaW5n
IGluZGljZXMuCisKKyAgICAgICAgV2l0aCB0aGlzIHBhdGNoLCBhbG1vc3QgZXZlcnl0aGluZyBp
cyBtb3ZlZCB0byBhYnNvbHV0ZSBpbmRleGluZy4KKyAgICAgICAgVGhlcmUgYXJlIGEgZmV3IGFk
dmFudGFnZXMgdG8gdGhpczoKKyAgICAgICAgLU5vIG1vcmUgY29udmVyc2lvbiBjaHVybiBmb3Ig
RmxvYXRpbmcgUG9pbnQgcmVnaXN0ZXJzLgorICAgICAgICAtTW9zdCBvZiB0aGUgZnVuY3Rpb25z
IGNhbiBub3cgYmUgc2hhcmVkIGJldHdlZW4gR1AgYW5kIEZQLgorICAgICAgICAtQSBiaXQgb2Yg
Y2xlYW4gdXAgc2luY2UgdGhlIGNvcmUgYWxnb3JpdGhtIG9ubHkgZGVhbHMgd2l0aCBpbnRlZ2Vy
cyBub3cuCisKKyAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGNoYW5nZXMgdGhlIGluZGV4IHR5cGUg
dG8gYmUgYSB0ZW1wbGF0ZSBhcmd1bWVudC4KKyAgICAgICAgVGhhdCB3aWxsIGFsbG93IGZ1dHVy
ZSBzcGVjaWFsaXphdGlvbiBvZiAibV9pbnRlcmZlcmVuY2VFZGdlcyIgYmFzZWQKKyAgICAgICAg
b24gdGhlIGV4cGVjdGVkIHByb2JsZW0gc2l6ZS4KKworICAgICAgICBGaW5hbGx5LCB0aGUgY29k
ZSByZWxhdGVkIHRvIHRoZSBwcm9ncmFtIG1vZGlmaWNhdGlvbiAocmVnaXN0ZXIgYXNzaWdubWVu
dAorICAgICAgICBhbmQgc3BpbGxpbmcpIHdhcyBtb3ZlZCB0byB0aGUgd3JhcHBlciAiSXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmciLgorCisgICAgICAgIFRoZSBjdXJyZW50IHNwbGl0IGlzOgor
ICAgICAgICAtQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjogY29tbW9uIGNvcmUuIFNoYXJlIGFz
IG11Y2ggYXMgcG9zc2libGUgYmV0d2VlbgorICAgICAgICAgR1AgYW5kIEZQLgorICAgICAgICAt
Q29sb3JpbmdBbGxvY2F0b3I6IHRoZSByZW1haW5pbmcgcGFydHMgb2YgdGhlIGFsZ29yaXRobSwg
ZXZlcnl0aGluZyB0aGF0CisgICAgICAgICBpcyBzcGVjaWZpYyB0byBHUCwgRlAuCisgICAgICAg
IC1JdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZzogdGhlICJpdGVyYXRlZCIgcGFydCBvZiB0aGUg
YWxnb3JpdGhtLgorICAgICAgICAgVHJ5IHRvIGFsbG9jYXRlIGFuZCBtb2RpZnkgdGhlIGNvZGUg
YXMgbmVlZGVkLgorCisgICAgICAgIFRoZSBsb25nIHRlcm0gcGxhbiBpczoKKyAgICAgICAgLU1v
dmUgc2VsZWN0U3BpbGwoKSBhbmQgdGhlIGNvbG9yaW5nIGxvb3AgdG8gQWJzdHJhY3RDb2xvcmlu
Z0FsbG9jYXRvci4KKyAgICAgICAgLVNwZWNpYWxpemUgbV9pbnRlcmZlcmVuY2VFZGdlcyB0byBt
YWtlIGl0IGZhc3Rlci4KKworICAgICAgICAqIGIzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29h
bGVzY2luZy5jcHA6CisgICAgICAgICogYjMvYWlyL0FpclRtcElubGluZXMuaDoKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6QWJzb2x1dGVUbXBNYXBwZXI8QXJnOjpHUD46Omxhc3RNYWNoaW5lUmVn
aXN0ZXJJbmRleCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkFic29sdXRlVG1wTWFwcGVyPEFy
Zzo6RlA+OjpsYXN0TWFjaGluZVJlZ2lzdGVySW5kZXgpOgorCisyMDE1LTEyLTE5ICBCZW5qYW1p
biBQb3VsYWluICA8YnBvdWxhaW5AYXBwbGUuY29tPgorCiAgICAgICAgIFtKU0NdIEFkZCBFcXVh
bE9yVW5vcmRlcmVkIHRvIEIzCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNTI0MjUKIApkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAppbmRleCA1MDJj
ODlkZjZkMDdmOTcxZGY3Y2ZiYWFkZmVkNzAyNWY3YTk2ZDlmLi4wMWY3NDIxZmQxYmQxODE2MGU0
MDE4MTQxODJiNDg4ZTkzY2UxOTdiIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAorKysgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcApAQCAt
NDcsNDA4ICs0NywzMzEgQEAgYm9vbCBkZWJ1ZyA9IGZhbHNlOwogYm9vbCB0cmFjZURlYnVnID0g
ZmFsc2U7CiBib29sIHJlcG9ydFN0YXRzID0gZmFsc2U7CiAKLXRlbXBsYXRlPEFyZzo6VHlwZSB0
eXBlPgotc3RydWN0IE1vdmVJbnN0SGVscGVyOwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgTW92ZUlu
c3RIZWxwZXI8QXJnOjpHUD4gewotICAgIHN0YXRpYyBib29sIG1heUJlQ29hbGVzY2FibGUoY29u
c3QgSW5zdCYgaW5zdCkKLSAgICB7Ci0gICAgICAgIGJvb2wgaXNNb3ZlID0gaW5zdC5vcGNvZGUg
PT0gTW92ZTsKLSAgICAgICAgaWYgKCFpc01vdmUpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShpbnN0LmFyZ3Muc2l6ZSgpID09IDIsICJX
ZSBhc3N1bWUgY29hbGVjYWJsZSBtb3ZlcyBvbmx5IGhhdmUgdHdvIGFyZ3VtZW50cyBpbiBhIGZl
dyBwbGFjZXMuIik7Ci0gICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMF0uaXNUeXBlKEFyZzo6R1Ap
KTsKLSAgICAgICAgQVNTRVJUKGluc3QuYXJnc1sxXS5pc1R5cGUoQXJnOjpHUCkpOwotCi0gICAg
ICAgIHJldHVybiBpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAoKTsK
LSAgICB9Ci19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgTW92ZUluc3RIZWxwZXI8QXJnOjpGUD4g
ewotICAgIHN0YXRpYyBib29sIG1heUJlQ29hbGVzY2FibGUoY29uc3QgSW5zdCYgaW5zdCkKLSAg
ICB7Ci0gICAgICAgIGlmIChpbnN0Lm9wY29kZSAhPSBNb3ZlRG91YmxlKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW5zdC5hcmdzLnNp
emUoKSA9PSAyLCAiV2UgYXNzdW1lIGNvYWxlY2FibGUgbW92ZXMgb25seSBoYXZlIHR3byBhcmd1
bWVudHMgaW4gYSBmZXcgcGxhY2VzLiIpOwotICAgICAgICBBU1NFUlQoaW5zdC5hcmdzWzBdLmlz
VHlwZShBcmc6OkZQKSk7Ci0gICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMV0uaXNUeXBlKEFyZzo6
RlApKTsKLQotICAgICAgICByZXR1cm4gaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgaW5zdC5hcmdz
WzFdLmlzVG1wKCk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci1jbGFz
cyBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ0FsbG9jYXRvciB7CisvLyBUaGUgQWJzdHJhY3RD
b2xvcmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29kZSB0aGF0IGlzIGluZGVwZW5kYW50
CisvLyBmcm9tIHRoZSB0eXBlIG9yIHJlZ2lzdGVyIGFuZCBjYW4gYmUgc2hhcmVkIHdoZW4gYWxs
b2NhdGluZyByZWdpc3RlcnMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+CitjbGFzcyBB
YnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIHsKIHB1YmxpYzoKLSAgICBJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZ0FsbG9jYXRvcigKLSAgICAgICAgQ29kZSYgY29kZSwgY29uc3QgVXNlQ291bnRz
PFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFzaFNldDxUbXA+JiB1bnNwaWxsYWJsZVRtcCkKLSAg
ICAgICAgOiBtX2NvZGUoY29kZSkKLSAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3VudHMpCi0g
ICAgICAgICwgbV91bnNwaWxsYWJsZVRtcCh1bnNwaWxsYWJsZVRtcCkKLSAgICAgICAgLCBtX251
bWJlck9mUmVnaXN0ZXJzKHJlZ3NJblByaW9yaXR5T3JkZXIodHlwZSkuc2l6ZSgpKQorICAgIEFi
c3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IoY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5
T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRt
cEFycmF5U2l6ZSkKKyAgICAgICAgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIocmVnc0luUHJpb3Jp
dHlPcmRlcikKKyAgICAgICAgLCBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleChsYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXgpCiAgICAgewotICAgICAgICBpbml0aWFsaXplRGVncmVlcygp
OworICAgICAgICBpbml0aWFsaXplRGVncmVlcyh0bXBBcnJheVNpemUpOwogCi0gICAgICAgIHVu
c2lnbmVkIHRtcEFycmF5U2l6ZSA9IHRoaXMtPnRtcEFycmF5U2l6ZSgpOwogICAgICAgICBtX2Fk
amFjZW5jeUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CiAgICAgICAgIG1fbW92ZUxpc3QucmVz
aXplKHRtcEFycmF5U2l6ZSk7Ci0gICAgICAgIG1fY29hbGVzY2VkVG1wcy5yZXNpemUodG1wQXJy
YXlTaXplKTsKKyAgICAgICAgbV9jb2FsZXNjZWRUbXBzLmZpbGwoMCwgdG1wQXJyYXlTaXplKTsK
ICAgICAgICAgbV9pc09uU2VsZWN0U3RhY2suZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUpOwotCi0g
ICAgICAgIGJ1aWxkKCk7Ci0gICAgICAgIGFsbG9jYXRlKCk7CiAgICAgfQogCi0gICAgVG1wIGdl
dEFsaWFzKFRtcCB0bXApIGNvbnN0Citwcm90ZWN0ZWQ6CisgICAgSW5kZXhUeXBlIGdldEFsaWFz
KEluZGV4VHlwZSB0bXBJbmRleCkgY29uc3QKICAgICB7Ci0gICAgICAgIFRtcCBhbGlhcyA9IHRt
cDsKLSAgICAgICAgd2hpbGUgKFRtcCBuZXh0QWxpYXMgPSBtX2NvYWxlc2NlZFRtcHNbQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYWxpYXMpXSkKKyAgICAgICAgSW5kZXhU
eXBlIGFsaWFzID0gdG1wSW5kZXg7CisgICAgICAgIHdoaWxlIChJbmRleFR5cGUgbmV4dEFsaWFz
ID0gbV9jb2FsZXNjZWRUbXBzW2FsaWFzXSkKICAgICAgICAgICAgIGFsaWFzID0gbmV4dEFsaWFz
OwogICAgICAgICByZXR1cm4gYWxpYXM7CiAgICAgfQogCi0gICAgVG1wIGdldEFsaWFzV2hlblNw
aWxsaW5nKFRtcCB0bXApIGNvbnN0CisgICAgdm9pZCBhZGRFZGdlKEluZGV4VHlwZSBhLCBJbmRl
eFR5cGUgYikKICAgICB7Ci0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRt
cC5pc0VtcHR5KCksICJUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGNvYWxlc2Npbmcg
ZHVyaW5nIHNwaWxsaW5nLiIpOwotCi0gICAgICAgIGlmIChtX2NvYWxlc2NlZFRtcHNBdFNwaWxs
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0KLSAgICAgICAgVG1wIGFsaWFz
ID0gdG1wOwotICAgICAgICB3aGlsZSAoVG1wIG5leHRBbGlhcyA9IG1fY29hbGVzY2VkVG1wc0F0
U3BpbGxbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYWxpYXMpXSkKLSAg
ICAgICAgICAgIGFsaWFzID0gbmV4dEFsaWFzOwotCi0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NB
R0UoIW1fc3BpbGxlZFRtcC5jb250YWlucyh0bXApIHx8IGFsaWFzID09IHRtcCwgIlRoZSBhbGlh
c2VzIGF0IHNwaWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcgd2VudCBo
b3JyaWJseSB3cm9uZy4iKTsKLQotICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgICAgIGlmIChh
ID09IGIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGFkZEVkZ2VEaXN0aW5jdChhLCBi
KTsKICAgICB9CiAKLSAgICBjb25zdCBIYXNoU2V0PFRtcD4mIHNwaWxsZWRUbXAoKSBjb25zdCB7
IHJldHVybiBtX3NwaWxsZWRUbXA7IH0KLSAgICBSZWcgYWxsb2NhdGVkUmVnKFRtcCB0bXApIGNv
bnN0CisgICAgdm9pZCBtYWtlV29ya0xpc3QoKQogICAgIHsKLSAgICAgICAgQVNTRVJUKCF0bXAu
aXNSZWcoKSk7Ci0gICAgICAgIEFTU0VSVChtX2NvbG9yZWRUbXAuc2l6ZSgpKTsKLSAgICAgICAg
QVNTRVJUKHRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpHUCkpOworICAgICAgICBJbmRleFR5
cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsK
KyAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3Jl
ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVl
c1tpXTsKKyAgICAgICAgICAgIGlmICghZGVncmVlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwogCi0gICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgodG1wKV07Ci0gICAgICAgIGlmICghcmVnKSB7Ci0gICAgICAgICAg
ICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgVG1wcyB0aGF0IGludGVyZmVyZS4gQSBUbXAgdGhhdCBu
ZXZlciBpbnRlcmZlcmUgd2l0aCBhbnl0aGluZwotICAgICAgICAgICAgLy8gY2FuIHRha2UgYW55
IHJlZ2lzdGVyLgotICAgICAgICAgICAgcmVnID0gcmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKS5m
aXJzdCgpOworICAgICAgICAgICAgaWYgKGRlZ3JlZSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpKQorICAgICAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5hZGQoaSk7CisgICAgICAg
ICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
bV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKICAgICAgICAgfQotICAgICAgICByZXR1
cm4gcmVnOwogICAgIH0KIAotcHJpdmF0ZToKLSAgICB1bnNpZ25lZCB0bXBBcnJheVNpemUoKQor
ICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDoganVzdCBwaWNr
IGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVy
aWNlcy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0
IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAgdm9pZCBzaW1w
bGlmeSgpCiAgICAgewotICAgICAgICB1bnNpZ25lZCBudW1UbXBzID0gbV9jb2RlLm51bVRtcHMo
dHlwZSk7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChudW1UbXBzKTsKKyAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlX
b3JrbGlzdC50YWtlTGFzdCgpOworCisgICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250
YWlucyhsYXN0SW5kZXgpKTsKKyAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQo
bGFzdEluZGV4KSk7CisgICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7Cisg
ICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7CisKKyAgICAgICAg
Zm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcElu
ZGV4KSB7CisgICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7Cisg
ICAgICAgIH0pOwogICAgIH0KIAotICAgIHZvaWQgaW5pdGlhbGl6ZURlZ3JlZXMoKQorICAgIHZv
aWQgZnJlZXplKCkKICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSA9IHRoaXMt
PnRtcEFycmF5U2l6ZSgpOwotICAgICAgICBtX2RlZ3JlZXMucmVzaXplKHRtcEFycmF5U2l6ZSk7
CisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJlZXplV29ya2xpc3QudGFrZUFu
eSgpOworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZpY3RpbUluZGV4KSA9
PSB2aWN0aW1JbmRleCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBhbGlhc2VkIFRtcCBp
biB0aGUgd29ya2xpc3QuIik7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmlj
dGltSW5kZXgpOworICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7CisgICAgfQogCi0g
ICAgICAgIC8vIEFsbCBwcmVjb2xvcmVkIHJlZ2lzdGVycyBoYXZlICBhbiAiaW5maW5pdGUiIGRl
Z3JlZS4KLSAgICAgICAgdW5zaWduZWQgZmlyc3ROb25SZWdJbmRleCA9IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KDApOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgZmlyc3ROb25SZWdJbmRleDsgKytpKQotICAgICAgICAgICAgbV9kZWdyZWVzW2ldID0g
c3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworICAgIHZvaWQgZnJlZXplTW92
ZXMoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZm9yRWFjaE5vZGVNb3Zlcyh0
bXBJbmRleCwgW3RoaXMsIHRtcEluZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgeworICAgICAg
ICAgICAgaWYgKCFtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKKyAgICAgICAg
ICAgICAgICBtX3dvcmtsaXN0TW92ZXMudGFrZU1vdmUobW92ZUluZGV4KTsKIAotICAgICAgICBi
emVybyhtX2RlZ3JlZXMuZGF0YSgpICsgZmlyc3ROb25SZWdJbmRleCwgKHRtcEFycmF5U2l6ZSAt
IGZpcnN0Tm9uUmVnSW5kZXgpICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgICAgICAgICBjb25z
dCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92
ZUluZGV4XTsKKyAgICAgICAgICAgIEluZGV4VHlwZSBzcmNUbXBJbmRleCA9IG1vdmVPcGVyYW5k
cy5zcmNJbmRleDsKKyAgICAgICAgICAgIEluZGV4VHlwZSBkc3RUbXBJbmRleCA9IG1vdmVPcGVy
YW5kcy5kc3RJbmRleDsKKworICAgICAgICAgICAgSW5kZXhUeXBlIG9yaWdpbmFsT3RoZXJUbXAg
PSBzcmNUbXBJbmRleCAhPSB0bXBJbmRleCA/IHNyY1RtcEluZGV4IDogZHN0VG1wSW5kZXg7Cisg
ICAgICAgICAgICBJbmRleFR5cGUgb3RoZXJUbXBJbmRleCA9IGdldEFsaWFzKG9yaWdpbmFsT3Ro
ZXJUbXApOworICAgICAgICAgICAgaWYgKG1fZGVncmVlc1tvdGhlclRtcEluZGV4XSA8IG1fcmVn
c0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQob3RoZXJUbXBJbmRleCkp
IHsKKyAgICAgICAgICAgICAgICBpZiAobV9mcmVlemVXb3JrbGlzdC5yZW1vdmUob3RoZXJUbXBJ
bmRleCkpCisgICAgICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQob3Ro
ZXJUbXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgIH0KIAotICAgIHZv
aWQgYnVpbGQoKQorICAgIHZvaWQgY29hbGVzY2UoKQogICAgIHsKLSAgICAgICAgVG1wTGl2ZW5l
c3M8dHlwZT4gbGl2ZW5lc3MobV9jb2RlKTsKLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9j
ayA6IG1fY29kZSkgewotICAgICAgICAgICAgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46Okxv
Y2FsQ2FsYyBsb2NhbENhbGMobGl2ZW5lc3MsIGJsb2NrKTsKLSAgICAgICAgICAgIGZvciAodW5z
aWduZWQgaW5zdEluZGV4ID0gYmxvY2stPnNpemUoKTsgaW5zdEluZGV4LS07KSB7Ci0gICAgICAg
ICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOwotICAgICAgICAgICAg
ICAgIEluc3QqIG5leHRJbnN0ID0gaW5zdEluZGV4ICsgMSA8IGJsb2NrLT5zaXplKCkgPyAmYmxv
Y2stPmF0KGluc3RJbmRleCArIDEpIDogbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBidWlsZChp
bnN0LCBuZXh0SW5zdCwgbG9jYWxDYWxjKTsKLSAgICAgICAgICAgICAgICBsb2NhbENhbGMuZXhl
Y3V0ZShpbnN0SW5kZXgpOwotICAgICAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBtb3ZlSW5k
ZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3ZlKCk7CisgICAgICAgIGNvbnN0IE1vdmVP
cGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhd
OworICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7
CisgICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLmRzdEluZGV4KTsK
KworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAgc3RkOjpzd2FwKHUs
IHYpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZygiQ29h
bGVzY2luZyBtb3ZlIGF0IGluZGV4IiwgbW92ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2
LCAiXG4iKTsKKworICAgICAgICBpZiAodSA9PSB2KSB7CisgICAgICAgICAgICBhZGRXb3JrTGlz
dCh1KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0
YUxvZygiICAgIENvYWxlc2NlZFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xvcmVk
KHYpIHx8IG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCB2
KSkpIHsKKyAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgYWRkV29ya0xp
c3Qodik7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRh
dGFMb2coIiAgICBDb25zdHJhaW5lZFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQmVTYWZl
bHlDb2FsZXNjZWQodSwgdikpIHsKKyAgICAgICAgICAgIGNvbWJpbmUodSwgdik7CisgICAgICAg
ICAgICBhZGRXb3JrTGlzdCh1KTsKKyAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlh
bE1vdmUgPSB0cnVlOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAg
ICAgICBkYXRhTG9nKCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsKKworICAgICAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxl
ZCBjb2FsZXNjaW5nLCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKICAgICAgICAgfQogICAg
IH0KIAotICAgIHZvaWQgYnVpbGQoSW5zdCYgaW5zdCwgSW5zdCogbmV4dEluc3QsIGNvbnN0IHR5
cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMmIGxvY2FsQ2FsYykKKyAgICB2b2lk
IGFzc2lnbkNvbG9ycygpCiAgICAgewotICAgICAgICBpbnN0LmZvckVhY2hUbXBXaXRoRXh0cmFD
bG9iYmVyZWRSZWdzKAotICAgICAgICAgICAgbmV4dEluc3QsCi0gICAgICAgICAgICBbJl0gKGNv
bnN0IFRtcCYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoIUFyZzo6aXNEZWYocm9sZSkgfHwgYXJnVHlwZSAhPSB0eXBlKQotICAg
ICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgLy8gQWxsIHRoZSBEZWYoKXMgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlciBhbmQgd2l0aCBh
bGwgdGhlIGV4dHJhIGNsb2JiZXJlZCBUbXBzLgotICAgICAgICAgICAgICAgIC8vIFdlIHNob3Vs
ZCBub3QgdXNlIGZvckVhY2hEZWZBbmRFeHRyYUNsb2JiZXJlZFRtcCgpIGhlcmUgc2luY2UgY29s
b3JlZCBUbXBzCi0gICAgICAgICAgICAgICAgLy8gZG8gbm90IG5lZWQgaW50ZXJmZXJlbmNlIGVk
Z2VzIGluIG91ciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hU
bXAoWyZdIChUbXAmIG90aGVyQXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJnOjppc0RlZihyb2xlKSB8fCBhcmdU
eXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGFyZywg
b3RoZXJBcmcpOwotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0pOworICAg
ICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VS
VChtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKG1fZnJlZXplV29y
a2xpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5
KCkpOwogCi0gICAgICAgIGlmIChNb3ZlSW5zdEhlbHBlcjx0eXBlPjo6bWF5QmVDb2FsZXNjYWJs
ZShpbnN0KSkgewotICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdGhlIFVzZSgpIG9mIHRo
aXMgbW92ZSB0byBpbnRlcmZlcmUgd2l0aCB0aGUgRGVmKCksIGV2ZW4gaWYgaXQgaXMgbGl2ZQot
ICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIE1vdmUuIElmIHdlIHdlcmUgdG8gYWRkIHRoZSBpbnRl
cmZlcmVuY2UgZWRnZSwgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0bwotICAgICAgICAgICAgLy8g
Y29hbGVzY2UgdGhlIE1vdmUgZXZlbiBpZiB0aGUgdHdvIFRtcCBuZXZlciBpbnRlcmZlcmUgYW55
d2hlcmUuCi0gICAgICAgICAgICBUbXAgZGVmVG1wOwotICAgICAgICAgICAgVG1wIHVzZVRtcDsK
LSAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcChbJmRlZlRtcCwgJnVzZVRtcF0gKFRtcCYgYXJn
VG1wLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEFy
Zzo6aXNEZWYocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgIGRlZlRtcCA9IGFyZ1RtcDsKLSAg
ICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKEFyZzo6aXNF
YXJseVVzZShyb2xlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzZVRtcCA9IGFyZ1RtcDsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIEFTU0VSVChkZWZU
bXApOwotICAgICAgICAgICAgQVNTRVJUKHVzZVRtcCk7CisgICAgICAgIC8vIFJlY2xhaW0gYXMg
bXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCisgICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xl
YXIoKTsKKyAgICAgICAgbV9kZWdyZWVzLmNsZWFyKCk7CisgICAgICAgIG1fbW92ZUxpc3QuY2xl
YXIoKTsKKyAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7CisgICAgICAgIG1fc2ltcGxp
ZnlXb3JrbGlzdC5jbGVhcigpOworICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXIoKTsKKyAg
ICAgICAgbV9mcmVlemVXb3JrbGlzdC5jbGVhcigpOwogCi0gICAgICAgICAgICB1bnNpZ25lZCBu
ZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCk7Ci0gICAgICAgICAg
ICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IHVzZVRtcCwgZGVmVG1wIH0pOworICAg
ICAgICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCisgICAgICAgIG1fY29s
b3JlZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7CiAKLSAgICAgICAgICAgIHVu
c2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRNb3ZlKCk7Ci0g
ICAgICAgICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldv
cmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOworICAgICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2su
aXNFbXB0eSgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IG1fc2VsZWN0U3Rh
Y2sudGFrZUxhc3QoKTsKKyAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4
KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOwogCi0gICAg
ICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7Ci0g
ICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOwor
ICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVyczsKKyAgICAgICAgICAgIGZv
ciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhd
KSB7CisgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFsaWFzVG1wSW5kZXggPSBnZXRBbGlhcyhh
ZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1w
W2FsaWFzVG1wSW5kZXhdOwogCi0gICAgICAgICAgICBmb3IgKGNvbnN0IEFyZyYgYXJnIDogaW5z
dC5hcmdzKSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgbGlzdCA9IG1fbW92ZUxpc3RbQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYXJnLnRtcCgpKV07Ci0gICAgICAgICAg
ICAgICAgbGlzdC5hZGQobmV4dE1vdmVJbmRleCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3Jl
ZChhbGlhc1RtcEluZGV4KSAmJiByZWcpKTsKIAotICAgICAgICAgICAgZm9yIChjb25zdCBUbXAm
IGxpdmVUbXAgOiBsb2NhbENhbGMubGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpdmVU
bXAgIT0gdXNlVG1wKQotICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGRlZlRtcCwgbGl2ZVRt
cCk7CisgICAgICAgICAgICAgICAgaWYgKHJlZykKKyAgICAgICAgICAgICAgICAgICAgY29sb3Jl
ZFJlZ2lzdGVycy5zZXQocmVnKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gVGhl
IG5leHQgaW5zdHJ1Y3Rpb24gY291bGQgaGF2ZSBlYXJseSBjbG9iYmVycy4gV2UgbmVlZCB0byBj
b25zaWRlciB0aG9zZSBub3cuCi0gICAgICAgICAgICBpZiAobmV4dEluc3QgJiYgbmV4dEluc3Qt
Pmhhc1NwZWNpYWwoKSkgewotICAgICAgICAgICAgICAgIG5leHRJbnN0LT5leHRyYUVhcmx5Q2xv
YmJlcmVkUmVncygpLmZvckVhY2goCi0gICAgICAgICAgICAgICAgICAgIFsmXSAoUmVnIHJlZykg
ewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZy5pc0dQUigpID09ICh0eXBlID09IEFy
Zzo6R1ApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxp
dmVUbXAgOiBsb2NhbENhbGMubGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFkZEVkZ2UoVG1wKHJlZyksIGxpdmVUbXApOwotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7
CisgICAgICAgICAgICBib29sIGNvbG9yQXNzaWduZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZv
ciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcikgeworICAgICAgICAgICAgICAgIGlm
ICghY29sb3JlZFJlZ2lzdGVycy5nZXQocmVnKSkgeworICAgICAgICAgICAgICAgICAgICBtX2Nv
bG9yZWRUbXBbdG1wSW5kZXhdID0gcmVnOworICAgICAgICAgICAgICAgICAgICBjb2xvckFzc2ln
bmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGFkZEVkZ2VzKGlu
c3QsIG5leHRJbnN0LCBsb2NhbENhbGMubGl2ZSgpKTsKKworICAgICAgICAgICAgaWYgKCFjb2xv
ckFzc2lnbmVkKQorICAgICAgICAgICAgICAgIG1fc3BpbGxlZFRtcHMuYXBwZW5kKHRtcEluZGV4
KTsKKyAgICAgICAgfQorICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7CisKKyAgICAgICAg
aWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBz
QXRTcGlsbC5jbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2NvbG9yZWRUbXAu
Y2xlYXIoKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEVkZ2VzKEluc3QmIGluc3QsIEluc3QqIG5l
eHRJbnN0LCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxjOjpJdGVyYWJsZSBs
aXZlVG1wcykKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0aWFsaXplRGVncmVlcyh1bnNpZ25lZCB0
bXBBcnJheVNpemUpCiAgICAgewotICAgICAgICAvLyBBbGwgdGhlIERlZigpcyBpbnRlcmZlcmUg
d2l0aCBldmVydGhpbmcgbGl2ZS4KLSAgICAgICAgaW5zdC5mb3JFYWNoVG1wV2l0aEV4dHJhQ2xv
YmJlcmVkUmVncygKLSAgICAgICAgICAgIG5leHRJbnN0LAotICAgICAgICAgICAgWyZdIChjb25z
dCBUbXAmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKCFBcmc6OmlzRGVmKHJvbGUpIHx8IGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAg
IGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDogbGl2ZVRtcHMpIHsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKGxpdmVUbXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1ApKQotICAgICAgICAgICAg
ICAgICAgICAgICAgYWRkRWRnZShhcmcsIGxpdmVUbXApOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0pOworICAgICAgICBtX2RlZ3JlZXMucmVzaXplKHRtcEFycmF5U2l6ZSk7CisK
KyAgICAgICAgLy8gQWxsIHByZWNvbG9yZWQgcmVnaXN0ZXJzIGhhdmUgIGFuICJpbmZpbml0ZSIg
ZGVncmVlLgorICAgICAgICB1bnNpZ25lZCBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29s
b3JlZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
Zmlyc3ROb25SZWdJbmRleDsgKytpKQorICAgICAgICAgICAgbV9kZWdyZWVzW2ldID0gc3RkOjpu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworCisgICAgICAgIGJ6ZXJvKG1fZGVncmVl
cy5kYXRhKCkgKyBmaXJzdE5vblJlZ0luZGV4LCAodG1wQXJyYXlTaXplIC0gZmlyc3ROb25SZWdJ
bmRleCkgKiBzaXplb2YodW5zaWduZWQpKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEVkZ2UoY29u
c3QgVG1wJiBhLCBjb25zdCBUbXAmIGIpCisgICAgdm9pZCBhZGRFZGdlRGlzdGluY3QoSW5kZXhU
eXBlIGEsIEluZGV4VHlwZSBiKQogICAgIHsKLSAgICAgICAgaWYgKGEgPT0gYikKLSAgICAgICAg
ICAgIHJldHVybjsKLQorICAgICAgICBBU1NFUlQoYSAhPSBiKTsKICAgICAgICAgaWYgKG1faW50
ZXJmZXJlbmNlRWRnZXMuYWRkKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpLmlzTmV3RW50cnkpIHsK
LSAgICAgICAgICAgIGlmICghYS5pc1JlZygpKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKCFt
X2FkamFjZW5jeUxpc3RbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYSld
LmNvbnRhaW5zKGIpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYSldLmFwcGVuZChiKTsKLSAgICAgICAgICAg
ICAgICBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYSld
Kys7CisgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkgeworICAgICAgICAgICAgICAg
IEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKKyAgICAgICAgICAgICAg
ICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOworICAgICAgICAgICAgICAgIG1fZGVncmVl
c1thXSsrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIWIuaXNSZWcoKSkgewot
ICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KGIpXS5jb250YWlucyhhKSk7Ci0gICAgICAgICAgICAgICAg
bV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGIp
XS5hcHBlbmQoYSk7Ci0gICAgICAgICAgICAgICAgbV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KGIpXSsrOworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9y
ZWQoYikpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFtiXS5jb250
YWlucyhhKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2JdLmFwcGVuZChhKTsK
KyAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbYl0rKzsKICAgICAgICAgICAgIH0KICAgICAgICAg
fQogICAgIH0KIAotICAgIHZvaWQgbWFrZVdvcmtMaXN0KCkKKyAgICB2b2lkIGRlY3JlbWVudERl
Z3JlZShJbmRleFR5cGUgdG1wSW5kZXgpCiAgICAgewotICAgICAgICB1bnNpZ25lZCBmaXJzdE5v
blJlZ0luZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoMCk7Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMu
c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tp
XTsKLSAgICAgICAgICAgIGlmICghZGVncmVlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgICAgICBUbXAgdG1wID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21B
YnNvbHV0ZUluZGV4KGkpOwotCi0gICAgICAgICAgICBpZiAoZGVncmVlID49IG1fbnVtYmVyT2ZS
ZWdpc3RlcnMpCi0gICAgICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmFkZCh0bXApOwotICAg
ICAgICAgICAgZWxzZSBpZiAoIW1fbW92ZUxpc3RbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgodG1wKV0uaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG1fZnJlZXplV29y
a2xpc3QuYWRkKHRtcCk7CisgICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKwor
ICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07CisgICAg
ICAgIGlmIChvbGREZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAg
ICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcEluZGV4KTsKKyAgICAg
ICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOworICAgICAgICAgICAgaWYg
KGlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xp
c3QuYWRkKHRtcEluZGV4KTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3Np
bXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcCk7CisgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdv
cmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHNp
bXBsaWZ5KCkKKyAgICBib29sIGlzTW92ZVJlbGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQogICAg
IHsKLSAgICAgICAgVG1wIGxhc3QgPSBtX3NpbXBsaWZ5V29ya2xpc3QudGFrZUxhc3QoKTsKLQot
ICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29udGFpbnMobGFzdCkpOwotICAgICAgICBB
U1NFUlQoIW1faXNPblNlbGVjdFN0YWNrLmdldChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleChsYXN0KSkpOwotICAgICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0KTsK
LSAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQoQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgobGFzdCkpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0
LCBbdGhpc10oVG1wIGFkamFjZW50VG1wKSB7Ci0gICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUo
YWRqYWNlbnRUbXApOwotICAgICAgICB9KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5k
ZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92
ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUlu
ZGV4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24+Ci0g
ICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQoVG1wIHRtcCwgRnVuY3Rpb24gZnVuY3Rpb24pCisgICAg
dm9pZCBmb3JFYWNoQWRqYWNlbnQoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBmdW5jdGlv
bikKICAgICB7Ci0gICAgICAgIGZvciAoVG1wIGFkamFjZW50VG1wIDogbV9hZGphY2VuY3lMaXN0
W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKSB7Ci0gICAgICAg
ICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wKSkKLSAgICAgICAgICAgICAg
ICBmdW5jdGlvbihhZGphY2VudFRtcCk7CisgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50
VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAo
IWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpKQorICAgICAgICAgICAgICAgIGZ1
bmN0aW9uKGFkamFjZW50VG1wSW5kZXgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgYm9vbCBo
YXNCZWVuU2ltcGxpZmllZChUbXAgdG1wKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1faXNPblNl
bGVjdFN0YWNrLnF1aWNrR2V0KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHRtcCkpIHx8ICEhbV9jb2FsZXNjZWRUbXBzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KHRtcCldOwotICAgIH0KLQotICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKFRtcCB0
bXApCisgICAgYm9vbCBoYXNCZWVuU2ltcGxpZmllZChJbmRleFR5cGUgdG1wSW5kZXgpCiAgICAg
ewotICAgICAgICBBU1NFUlQobV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KHRtcCldKTsKLQotICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3Jl
ZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0tLTsKLSAgICAg
ICAgaWYgKG9sZERlZ3JlZSA9PSBtX251bWJlck9mUmVnaXN0ZXJzKSB7Ci0gICAgICAgICAgICBl
bmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wKTsKLSAgICAgICAgICAgIG1fc3BpbGxX
b3JrbGlzdC5yZW1vdmUodG1wKTsKLSAgICAgICAgICAgIGlmIChpc01vdmVSZWxhdGVkKHRtcCkp
Ci0gICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wKTsKLSAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcCk7Ci0g
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrR2V0KHRtcElu
ZGV4KSB8fCAhIW1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF07CiAgICAgfQogCiAgICAgdGVtcGxh
dGU8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gICAgdm9pZCBmb3JFYWNoTm9kZU1vdmVzKFRtcCB0bXAs
IEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgIHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUg
dG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQogICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KHRtcCldKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3Zl
TGlzdFt0bXBJbmRleF0pIHsKICAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0
KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCiAgICAg
ICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKICAgICAgICAgfQogICAgIH0KIAotICAg
IGJvb2wgaXNNb3ZlUmVsYXRlZChUbXAgdG1wKQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KHRtcCldKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldCht
b3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgpKQotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZShUbXAgdG1wKQorICAgIHZvaWQg
ZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4VHlwZSB0bXBJbmRleCkKICAgICB7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleCh0bXApXSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRl
eCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7CiAgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zl
cy5xdWlja0NsZWFyKG1vdmVJbmRleCkpCiAgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVz
LnJldHVybk1vdmUobW92ZUluZGV4KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgZW5h
YmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKFRtcCB0bXApCisgICAgdm9pZCBlbmFibGVNb3Zl
c09uVmFsdWVBbmRBZGphY2VudHMoSW5kZXhUeXBlIHRtcEluZGV4KQogICAgIHsKLSAgICAgICAg
ZW5hYmxlTW92ZXNPblZhbHVlKHRtcCk7CisgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZSh0bXBJ
bmRleCk7CiAKLSAgICAgICAgZm9yRWFjaEFkamFjZW50KHRtcCwgW3RoaXNdIChUbXAgYWRqYWNl
bnRUbXApIHsKLSAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZShhZGphY2VudFRtcCk7Cisg
ICAgICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwgW3RoaXNdIChJbmRleFR5cGUgYWRqYWNl
bnRUbXBJbmRleCkgeworICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFjZW50VG1w
SW5kZXgpOwogICAgICAgICB9KTsKICAgICB9CiAKLSAgICB2b2lkIGNvYWxlc2NlKCkKKyAgICBi
b29sIGlzUHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5kZXgpCiAgICAgewotICAgICAgICB1bnNp
Z25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3ZlKCk7Ci0gICAgICAg
IGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRl
c1ttb3ZlSW5kZXhdOwotICAgICAgICBUbXAgdSA9IG1vdmVPcGVyYW5kcy5zcmM7Ci0gICAgICAg
IHUgPSBnZXRBbGlhcyh1KTsKLSAgICAgICAgVG1wIHYgPSBtb3ZlT3BlcmFuZHMuZHN0OwotICAg
ICAgICB2ID0gZ2V0QWxpYXModik7CisgICAgICAgIHJldHVybiB0bXBJbmRleCA8PSBtX2xhc3RQ
cmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsKKyAgICB9CiAKLSAgICAgICAgaWYgKHYuaXNSZWcoKSkK
LSAgICAgICAgICAgIHN0ZDo6c3dhcCh1LCB2KTsKKyAgICB2b2lkIGFkZFdvcmtMaXN0KEluZGV4
VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHRtcEluZGV4
KSAmJiBtX2RlZ3JlZXNbdG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAm
JiAhaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpIHsKKyAgICAgICAgICAgIG1fZnJlZXplV29ya2xp
c3QucmVtb3ZlKHRtcEluZGV4KTsKKyAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBl
bmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmICh0cmFjZURlYnVn
KQotICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4IiwgbW92ZUlu
ZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2LCAiXG4iKTsKKyAgICB2b2lkIGNvbWJpbmUoSW5k
ZXhUeXBlIHUsIEluZGV4VHlwZSB2KQorICAgIHsKKyAgICAgICAgaWYgKCFtX2ZyZWV6ZVdvcmts
aXN0LnJlbW92ZSh2KSkKKyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodik7CiAK
LSAgICAgICAgaWYgKHUgPT0gdikgewotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAg
ICAgIEFTU0VSVCghbV9jb2FsZXNjZWRUbXBzW3ZdKTsKKyAgICAgICAgbV9jb2FsZXNjZWRUbXBz
W3ZdID0gdTsKIAotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAg
ZGF0YUxvZygiICAgIENvYWxlc2NlZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAodi5pc1JlZygp
IHx8IG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCB2KSkp
IHsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAgICAgICAgYWRkV29ya0xpc3Qo
dik7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRhdGFM
b2coIiAgICBDb25zdHJhaW5lZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2FuQmVTYWZlbHlD
b2FsZXNjZWQodSwgdikpIHsKLSAgICAgICAgICAgIGNvbWJpbmUodSwgdik7Ci0gICAgICAgICAg
ICBhZGRXb3JrTGlzdCh1KTsKLSAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1v
dmUgPSB0cnVlOworICAgICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVMaXN0W3ZdOworICAgICAg
ICBtX21vdmVMaXN0W3VdLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVzLmVuZCgpKTsKIAotICAg
ICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNh
ZmUgQ29hbGVzY2luZ1xuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2FjdGl2
ZU1vdmVzLnF1aWNrU2V0KG1vdmVJbmRleCk7CisgICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBb
dGhpcywgdV0gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBhZGRF
ZGdlRGlzdGluY3QoYWRqYWNlbnRUbXBJbmRleCwgdSk7CisgICAgICAgICAgICBkZWNyZW1lbnRE
ZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgIH0pOwogCi0gICAgICAgICAgICBpZiAo
dHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgRmFpbGVkIGNvYWxlc2Np
bmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOwotICAgICAgICB9CisgICAgICAgIGlmICht
X2RlZ3JlZXNbdV0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiBtX2ZyZWV6ZVdv
cmtsaXN0LnJlbW92ZSh1KSkKKyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5hZGQodSk7CiAg
ICAgfQogCi0gICAgYm9vbCBjYW5CZVNhZmVseUNvYWxlc2NlZChUbXAgdSwgVG1wIHYpCisgICAg
Ym9vbCBjYW5CZVNhZmVseUNvYWxlc2NlZChJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCiAgICAg
ewotICAgICAgICBBU1NFUlQoIXYuaXNSZWcoKSk7Ci0gICAgICAgIGlmICh1LmlzUmVnKCkpCisg
ICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKKyAgICAgICAgaWYgKGlzUHJlY29sb3Jl
ZCh1KSkKICAgICAgICAgICAgIHJldHVybiBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyh1
LCB2KTsKICAgICAgICAgcmV0dXJuIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyh1LCB2KTsKICAgICB9
CiAKLSAgICBib29sIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljKFRtcCB1LCBUbXAgdikK
LSAgICB7Ci0gICAgICAgIEFTU0VSVCh1LmlzUmVnKCkpOwotICAgICAgICBBU1NFUlQoIXYuaXNS
ZWcoKSk7Ci0KLSAgICAgICAgLy8gSWYgYW55IGFkamFjZW50IG9mIHRoZSBub24tY29sb3JlZCBu
b2RlIGlzIG5vdCBhbiBhZGphY2VudCBvZiB0aGUgY29sb3JlZCBub2RlIEFORCBoYXMgYSBkZWdy
ZWUgPj0gSwotICAgICAgICAvLyB0aGVyZSBpcyBhIHJpc2sgdGhhdCB0aGlzIG5vZGUgbmVlZHMg
dG8gaGF2ZSB0aGUgc2FtZSBjb2xvciBhcyBvdXIgcHJlY29sb3JlZCBub2RlLiBJZiB3ZSBjb2Fs
ZXNjZSBzdWNoCi0gICAgICAgIC8vIG1vdmUsIHdlIG1heSBjcmVhdGUgYW4gdW5jb2xvcmFibGUg
Z3JhcGguCi0gICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlz
dFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh2KV07Ci0gICAgICAgIGZv
ciAoVG1wIGFkamFjZW50VG1wIDogYWRqYWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBpZiAoIWFk
amFjZW50VG1wLmlzUmVnKCkKLSAgICAgICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQo
YWRqYWNlbnRUbXApCi0gICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW0Fic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFkamFjZW50VG1wKV0gPj0gbV9udW1iZXJPZlJlZ2lz
dGVycwotICAgICAgICAgICAgICAgICYmICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKElu
dGVyZmVyZW5jZUVkZ2UodSwgYWRqYWNlbnRUbXApKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9v
bCBjb25zZXJ2YXRpdmVIZXVyaXN0aWMoVG1wIHUsIFRtcCB2KQorICAgIGJvb2wgY29uc2VydmF0
aXZlSGV1cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKICAgICB7CiAgICAgICAgIC8v
IFRoaXMgaXMgdXNpbmcgdGhlIEJyaWdncycgY29uc2VydmF0aXZlIGNvYWxlc2NpbmcgcnVsZToK
ICAgICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiBjb21iaW5lZCBhZGphY2VudCBub2RlIHdpdGgg
YSBkZWdyZWUgPj0gSyBpcyBsZXNzIHRoYW4gSywKQEAgLTQ1NiwyODEgKzM3OSw2MiBAQCBwcml2
YXRlOgogICAgICAgICAvLyBpcyBjb2xvcmFibGUsIHdlIGhhdmUgZmV3ZXIgdGhhbiBLIGFkamFj
ZW50cyB3aXRoIGhpZ2ggb3JkZXIgYW5kIHRoZXJlIGlzIGEgY29sb3IKICAgICAgICAgLy8gZm9y
IHRoZSBjdXJyZW50IG5vZGUuCiAgICAgICAgIEFTU0VSVCh1ICE9IHYpOwotICAgICAgICBBU1NF
UlQoIXUuaXNSZWcoKSk7Ci0gICAgICAgIEFTU0VSVCghdi5pc1JlZygpKTsKKyAgICAgICAgQVNT
RVJUKCFpc1ByZWNvbG9yZWQodSkpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7
CiAKLSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZVID0gbV9hZGphY2VuY3lMaXN0W0Fi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHUpXTsKLSAgICAgICAgY29uc3Qg
YXV0byYgYWRqYWNlbnRzT2ZWID0gbV9hZGphY2VuY3lMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KHYpXTsKKyAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZV
ID0gbV9hZGphY2VuY3lMaXN0W3VdOworICAgICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlYg
PSBtX2FkamFjZW5jeUxpc3Rbdl07CiAKLSAgICAgICAgaWYgKGFkamFjZW50c09mVS5zaXplKCkg
KyBhZGphY2VudHNPZlYuc2l6ZSgpIDwgbV9udW1iZXJPZlJlZ2lzdGVycykgeworICAgICAgICBp
ZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09mVi5zaXplKCkgPCBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyBTaG9ydGN1dDogaWYgdGhlIHRv
dGFsIG51bWJlciBvZiBhZGphY2VudHMgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0
ZXIsIHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIG1ldC4KICAgICAgICAgICAgIHJldHVybiB0cnVl
OwogICAgICAgICB9CiAKLSAgICAgICAgSGFzaFNldDxUbXA+IGhpZ2hPcmRlckFkamFjZW50czsK
KyAgICAgICAgSGFzaFNldDxJbmRleFR5cGU+IGhpZ2hPcmRlckFkamFjZW50czsKIAotICAgICAg
ICBmb3IgKFRtcCBhZGphY2VudFRtcCA6IGFkamFjZW50c09mVSkgewotICAgICAgICAgICAgQVNT
RVJUKGFkamFjZW50VG1wICE9IHYpOwotICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wICE9
IHUpOwotICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcCkgJiYg
bV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFkamFjZW50
VG1wKV0gPj0gbV9udW1iZXJPZlJlZ2lzdGVycykgewotICAgICAgICAgICAgICAgIGF1dG8gYWRk
UmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcCk7Ci0gICAgICAgICAg
ICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXpl
KCkgPj0gbV9udW1iZXJPZlJlZ2lzdGVycykKKyAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNl
bnRUbXBJbmRleCA6IGFkamFjZW50c09mVSkgeworICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50
VG1wSW5kZXggIT0gdik7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1
KTsKKyAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkg
JiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5z
aXplKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFj
ZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZFJlc3Vs
dC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlv
cml0eU9yZGVyLnNpemUoKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg
ICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZvciAoVG1wIGFkamFjZW50VG1wIDogYWRq
YWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXAgIT0gdSk7Ci0gICAg
ICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXAgIT0gdik7Ci0gICAgICAgICAgICBpZiAoIWhhc0Jl
ZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wKSAmJiBtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OmFic29sdXRlSW5kZXgoYWRqYWNlbnRUbXApXSA+PSBtX251bWJlck9mUmVnaXN0ZXJz
KSB7Ci0gICAgICAgICAgICAgICAgYXV0byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMu
YWRkKGFkamFjZW50VG1wKTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50
cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX251bWJlck9mUmVnaXN0ZXJzKQor
ICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7
CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKKyAgICAgICAgICAg
IEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOworICAgICAgICAgICAgaWYgKCFoYXNCZWVu
U2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRl
eF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGF1
dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcEluZGV4KTsK
KyAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRq
YWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQogICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAg
ICAgICBBU1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8IG1fbnVtYmVyT2ZSZWdpc3Rl
cnMpOworICAgICAgICBBU1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8IG1fcmVnc0lu
UHJpb3JpdHlPcmRlci5zaXplKCkpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAg
ICB2b2lkIGFkZFdvcmtMaXN0KFRtcCB0bXApCi0gICAgewotICAgICAgICBpZiAoIXRtcC5pc1Jl
ZygpICYmIG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0
bXApXSA8IG1fbnVtYmVyT2ZSZWdpc3RlcnMgJiYgIWlzTW92ZVJlbGF0ZWQodG1wKSkgewotICAg
ICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1wKTsKLSAgICAgICAgICAgIG1fc2lt
cGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQg
Y29tYmluZShUbXAgdSwgVG1wIHYpCi0gICAgewotICAgICAgICBpZiAoIW1fZnJlZXplV29ya2xp
c3QucmVtb3ZlKHYpKQotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2KTsKLQot
ICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
YWJzb2x1dGVJbmRleCh2KV0pOwotICAgICAgICBtX2NvYWxlc2NlZFRtcHNbQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodildID0gdTsKLQotICAgICAgICBhdXRvJiB2TW92
ZXMgPSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHYp
XTsKLSAgICAgICAgbV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleCh1KV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMuZW5kKCkpOwotCi0gICAgICAgIGZv
ckVhY2hBZGphY2VudCh2LCBbdGhpcywgdV0gKFRtcCBhZGphY2VudFRtcCkgewotICAgICAgICAg
ICAgYWRkRWRnZShhZGphY2VudFRtcCwgdSk7Ci0gICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUo
YWRqYWNlbnRUbXApOwotICAgICAgICB9KTsKLQotICAgICAgICBpZiAobV9kZWdyZWVzW0Fic29s
dXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHUpXSA+PSBtX251bWJlck9mUmVnaXN0
ZXJzICYmIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQotICAgICAgICAgICAgbV9zcGlsbFdv
cmtsaXN0LmFkZCh1KTsKLSAgICB9Ci0KLSAgICB2b2lkIGZyZWV6ZSgpCi0gICAgewotICAgICAg
ICBUbXAgdmljdGltID0gbV9mcmVlemVXb3JrbGlzdC50YWtlQW55KCk7Ci0gICAgICAgIEFTU0VS
VF9XSVRIX01FU1NBR0UoZ2V0QWxpYXModmljdGltKSA9PSB2aWN0aW0sICJjb2FsZXNjZSgpIHNo
b3VsZCBub3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0LiIpOwotICAgICAgICBt
X3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbSk7Ci0gICAgICAgIGZyZWV6ZU1vdmVzKHZp
Y3RpbSk7Ci0gICAgfQotCi0gICAgdm9pZCBmcmVlemVNb3ZlcyhUbXAgdG1wKQotICAgIHsKLSAg
ICAgICAgZm9yRWFjaE5vZGVNb3Zlcyh0bXAsIFt0aGlzLCB0bXBdICh1bnNpZ25lZCBtb3ZlSW5k
ZXgpIHsKLSAgICAgICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRl
eCkpCi0gICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VNb3ZlKG1vdmVJbmRleCk7
Ci0KLSAgICAgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2Fs
ZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOwotICAgICAgICAgICAgVG1wIG9yaWdpbmFsT3Ro
ZXJUbXAgPSBtb3ZlT3BlcmFuZHMuc3JjICE9IHRtcCA/IG1vdmVPcGVyYW5kcy5zcmMgOiBtb3Zl
T3BlcmFuZHMuZHN0OwotICAgICAgICAgICAgVG1wIG90aGVyVG1wID0gZ2V0QWxpYXMob3JpZ2lu
YWxPdGhlclRtcCk7Ci0gICAgICAgICAgICBpZiAobV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KG90aGVyVG1wKV0gPCBtX251bWJlck9mUmVnaXN0ZXJzICYm
ICFpc01vdmVSZWxhdGVkKG90aGVyVG1wKSkgewotICAgICAgICAgICAgICAgIGlmIChtX2ZyZWV6
ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcCkpCi0gICAgICAgICAgICAgICAgICAgIG1fc2ltcGxp
ZnlXb3JrbGlzdC5hcHBlbmQob3RoZXJUbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsK
LSAgICB9Ci0KLSAgICB2b2lkIHNlbGVjdFNwaWxsKCkKLSAgICB7Ci0gICAgICAgIGlmICghbV9o
YXNTZWxlY3RlZFNwaWxsKSB7Ci0gICAgICAgICAgICBtX2hhc1NlbGVjdGVkU3BpbGwgPSB0cnVl
OwotCi0gICAgICAgICAgICBpZiAobV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSkKLSAgICAg
ICAgICAgICAgICBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsID0gbV9jb2FsZXNjZWRUbXBzOwotICAg
ICAgICB9Ci0KLSAgICAgICAgYXV0byBpdGVyYXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigp
OwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCkgJiYg
bV91bnNwaWxsYWJsZVRtcC5jb250YWlucygqaXRlcmF0b3IpKQotICAgICAgICAgICAgKytpdGVy
YXRvcjsKLQotICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoaXRlcmF0b3IgIT0g
bV9zcGlsbFdvcmtsaXN0LmVuZCgpLCAiSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNvbG9yIHRoZSBB
aXIgZ3JhcGggd2l0aCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByZWdpc3RlcnMuIik7Ci0KLSAg
ICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUgZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dl
ciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRtcAotICAgICAgICAvLyBn
ZXRzIGEgcmVnaXN0ZXIuCi0gICAgICAgIGF1dG8gc2NvcmUgPSBbJl0gKFRtcCB0bXApIC0+IGRv
dWJsZSB7Ci0gICAgICAgICAgICAvLyBBaXIgZXhwb3NlcyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0
bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1lYW4gdGhhdCB0aGUgdG1wCi0gICAgICAg
ICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVnaXN0ZXIuCi0gICAgICAgICAgICBpZiAo
bV9jb2RlLmlzRmFzdFRtcCh0bXApKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNo
b3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBkZWdyZWUuCi0gICAgICAgICAgICBkb3Vi
bGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pOwotCi0gICAgICAgICAgICAvLyBBbGwgZWxz
ZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0
aGUgbnVtYmVyIG9mIHdhcm0gdXNlcyBhbmQKLSAgICAgICAgICAgIC8vIGRlZnMuCi0gICAgICAg
ICAgICBjb25zdCBVc2VDb3VudHM8VG1wPjo6Q291bnRzJiBjb3VudHMgPSBtX3VzZUNvdW50c1t0
bXBdOwotICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBjb3VudHMubnVtV2FybVVzZXMgKyBjb3Vu
dHMubnVtRGVmczsKLQotICAgICAgICAgICAgcmV0dXJuIGRlZ3JlZSAvIHVzZXM7Ci0gICAgICAg
IH07Ci0KLSAgICAgICAgYXV0byB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICBk
b3VibGUgbWF4U2NvcmUgPSBzY29yZSgqaXRlcmF0b3IpOwotCi0gICAgICAgICsraXRlcmF0b3I7
Ci0gICAgICAgIGZvciAoO2l0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKTsgKytpdGVy
YXRvcikgewotICAgICAgICAgICAgZG91YmxlIHRtcFNjb3JlID0gc2NvcmUoKml0ZXJhdG9yKTsK
LSAgICAgICAgICAgIGlmICh0bXBTY29yZSA+IG1heFNjb3JlKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKG1fdW5zcGlsbGFibGVUbXAuY29udGFpbnMoKml0ZXJhdG9yKSkKLSAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICB2aWN0aW1JdGVyYXRvciA9IGl0ZXJh
dG9yOwotICAgICAgICAgICAgICAgIG1heFNjb3JlID0gdG1wU2NvcmU7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICBUbXAgdmljdGltVG1wID0gKnZpY3RpbUl0ZXJhdG9yOwot
ICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHZpY3RpbUl0ZXJhdG9yKTsKLSAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1UbXApOwotICAgICAgICBmcmVlemVNb3Zl
cyh2aWN0aW1UbXApOwotICAgIH0KLQotICAgIHZvaWQgYWxsb2NhdGUoKQotICAgIHsKLSAgICAg
ICAgQVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2ZU1vdmVzLnNpemUoKSA+PSBtX2NvYWxlc2Np
bmdDYW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3RpdmVNb3ZlIHNldCBzaG91bGQgYmUgYmlnIGVu
b3VnaCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMgb2YgQml0VmVjdG9yLiIpOwotCi0gICAgICAg
IG1ha2VXb3JrTGlzdCgpOwotCi0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgZGF0
YUxvZygiSW50ZXJmZXJlbmNlOiAiLCBsaXN0RHVtcChtX2ludGVyZmVyZW5jZUVkZ2VzKSwgIlxu
Iik7Ci0gICAgICAgICAgICBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxl
KCkpOwotICAgICAgICAgICAgZGF0YUxvZygiSW5pdGlhbCB3b3JrIGxpc3RcbiIpOwotICAgICAg
ICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgZG8gewotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKLSAgICAgICAgICAgICAgICBk
YXRhTG9nKCJCZWZvcmUgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKLSAgICAg
ICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGlmICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgICBzaW1wbGlmeSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1fd29ya2xpc3RN
b3Zlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgY29hbGVzY2UoKTsKLSAgICAgICAgICAg
IGVsc2UgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBm
cmVlemUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgp
KQotICAgICAgICAgICAgICAgIHNlbGVjdFNwaWxsKCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFj
ZURlYnVnKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiQWZ0ZXIgR3JhcGggc2ltcGxpZmlj
YXRpb24gaXRlcmF0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6
ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCFtX3NpbXBsaWZ5
V29ya2xpc3QuaXNFbXB0eSgpIHx8ICFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpIHx8ICFtX2Zy
ZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0K
LSAgICAgICAgYXNzaWduQ29sb3JzKCk7Ci0gICAgfQotCi0gICAgdm9pZCBhc3NpZ25Db2xvcnMo
KQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpOwot
ICAgICAgICBBU1NFUlQobV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VS
VChtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX3NwaWxsV29y
a2xpc3QuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFz
IHBvc3NpYmxlLgotICAgICAgICBtX2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7Ci0gICAgICAg
IG1fZGVncmVlcy5jbGVhcigpOwotICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7Ci0gICAgICAg
IG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xl
YXIoKTsKLSAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fZnJlZXpl
V29ya2xpc3QuY2xlYXIoKTsKLQotICAgICAgICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0
aGUgc3RhY2suCi0gICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNp
emUoKSk7Ci0gICAgICAgIGNvbnN0IGF1dG8mIHJlZ2lzdGVyc0luUHJpb3JpdHlPcmRlciA9IHJl
Z3NJblByaW9yaXR5T3JkZXIodHlwZSk7Ci0KLSAgICAgICAgd2hpbGUgKCFtX3NlbGVjdFN0YWNr
LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgVG1wIHRtcCA9IG1fc2VsZWN0U3RhY2sudGFrZUxh
c3QoKTsKLSAgICAgICAgICAgIEFTU0VSVCghdG1wLmlzUmVnKCkpOwotICAgICAgICAgICAgQVNT
RVJUKCFtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgo
dG1wKV0pOwotCi0gICAgICAgICAgICBSZWdpc3RlclNldCBjb2xvcmVkUmVnaXN0ZXJzOwotICAg
ICAgICAgICAgZm9yIChUbXAgYWRqYWNlbnRUbXAgOiBtX2FkamFjZW5jeUxpc3RbQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pIHsKLSAgICAgICAgICAgICAgICBU
bXAgYWxpYXNUbXAgPSBnZXRBbGlhcyhhZGphY2VudFRtcCk7Ci0gICAgICAgICAgICAgICAgaWYg
KGFsaWFzVG1wLmlzUmVnKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lzdGVy
cy5zZXQoYWxpYXNUbXAucmVnKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1w
W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFsaWFzVG1wKV07Ci0gICAg
ICAgICAgICAgICAgaWYgKHJlZykKLSAgICAgICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lzdGVy
cy5zZXQocmVnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBjb2xvckFzc2ln
bmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKFJlZyByZWcgOiByZWdpc3RlcnNJblByaW9y
aXR5T3JkZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJl
ZykpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldID0gcmVnOwotICAgICAgICAgICAgICAgICAgICBj
b2xvckFzc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNvbG9yQXNzaWdu
ZWQpCi0gICAgICAgICAgICAgICAgbV9zcGlsbGVkVG1wLmFkZCh0bXApOwotICAgICAgICB9Ci0g
ICAgICAgIG1fc2VsZWN0U3RhY2suY2xlYXIoKTsKLQotICAgICAgICBpZiAobV9zcGlsbGVkVG1w
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuY2xlYXIoKTsK
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7Ci0gICAgfQot
Ci0jaWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsgLSBEZWJ1Z2dpbmcgaGVscGVycy4K
LSNlbmRpZgotCi0gICAgdm9pZCBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChQcmludFN0cmVh
bSYgb3V0KQorICAgIGJvb2wgcHJlY29sb3JlZENvYWxlc2NpbmdIZXVyaXN0aWMoSW5kZXhUeXBl
IHUsIEluZGV4VHlwZSB2KQogICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJncmFwaCBJbnRlcmZl
cmVuY2VHcmFwaCB7IFxuIik7CisgICAgICAgIEFTU0VSVChpc1ByZWNvbG9yZWQodSkpOworICAg
ICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7CiAKLSAgICAgICAgSGFzaFNldDxUbXA+IHRt
cHNXaXRoSW50ZXJmZXJlbmNlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9p
bnRlcmZlcmVuY2VFZGdlcykgewotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFk
ZChlZGdlLmZpcnN0KCkpOwotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChl
ZGdlLnNlY29uZCgpKTsKKyAgICAgICAgLy8gSWYgYW55IGFkamFjZW50IG9mIHRoZSBub24tY29s
b3JlZCBub2RlIGlzIG5vdCBhbiBhZGphY2VudCBvZiB0aGUgY29sb3JlZCBub2RlIEFORCBoYXMg
YSBkZWdyZWUgPj0gSworICAgICAgICAvLyB0aGVyZSBpcyBhIHJpc2sgdGhhdCB0aGlzIG5vZGUg
bmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBjb2xvciBhcyBvdXIgcHJlY29sb3JlZCBub2RlLiBJZiB3
ZSBjb2FsZXNjZSBzdWNoCisgICAgICAgIC8vIG1vdmUsIHdlIG1heSBjcmVhdGUgYW4gdW5jb2xv
cmFibGUgZ3JhcGguCisgICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNl
bmN5TGlzdFt2XTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBhZGphY2VudFRtcEluZGV4IDogYWRq
YWNlbnRzT2ZWKSB7CisgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhZGphY2VudFRtcElu
ZGV4KQorICAgICAgICAgICAgICAgICYmICFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcElu
ZGV4KQorICAgICAgICAgICAgICAgICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBt
X3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpCisgICAgICAgICAgICAgICAgJiYgIW1faW50ZXJm
ZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCBhZGphY2VudFRtcEluZGV4
KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KLSAgICAgICAg
Zm9yIChjb25zdCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVyZW5jZXMpCi0gICAgICAgICAg
ICBvdXQucHJpbnQoIiAgICAiLCB0bXAuaW50ZXJuYWxWYWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRt
cCwgIiAoIiwgbV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHRtcCldLCAiKVwiXTtcbiIpOwotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1f
aW50ZXJmZXJlbmNlRWRnZXMpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZp
cnN0KCkuaW50ZXJuYWxWYWx1ZSgpLCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCkuaW50ZXJuYWxWYWx1
ZSgpLCAiO1xuIik7Ci0gICAgICAgIG91dC5wcmludCgifVxuIik7Ci0gICAgfQotCi0gICAgdm9p
ZCBkdW1wV29ya0xpc3RzKFByaW50U3RyZWFtJiBvdXQpCi0gICAgewotICAgICAgICBvdXQucHJp
bnQoIlNpbXBsaWZ5IHdvcmsgbGlzdDpcbiIpOwotICAgICAgICBmb3IgKFRtcCB0bXAgOiBtX3Np
bXBsaWZ5V29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAsICJcbiIp
OwotICAgICAgICBvdXQucHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBt
X3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgb3V0LnByaW50KCJGcmVlemUgd29y
ayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAoVG1wIHRtcCA6IG1fZnJlZXplV29ya2xpc3QpCi0g
ICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAsICJcbiIpOwotICAgICAgICBvdXQucHJp
bnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIpOwotICAgICAgICBmb3IgKFRtcCB0bXAgOiBtX3NwaWxs
V29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAsICJcbiIpOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKK3Byb3RlY3RlZDoKICNpZiBQTEFURk9STShDT0NP
QSkKICNwcmFnbWEgbWFyayAtCiAjZW5kaWYKQEAgLTc0MywxNyArNDQ3LDE1IEBAIHByaXZhdGU6
CiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIEludGVyZmVyZW5jZUVkZ2UoVG1wIGEs
IFRtcCBiKQorICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUg
YikKICAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKGEuaW50ZXJuYWxWYWx1ZSgpKTsKLSAg
ICAgICAgICAgIEFTU0VSVChiLmludGVybmFsVmFsdWUoKSk7CisgICAgICAgICAgICBBU1NFUlQo
YSk7CisgICAgICAgICAgICBBU1NFUlQoYik7CiAgICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNT
QUdFKGEgIT0gYiwgIkEgVG1wIGNhbiBuZXZlciBpbnRlcmZlcmUgd2l0aCBpdHNlbGYuIERvaW5n
IHNvIHdvdWxkIGZvcmNlIGl0IHRvIGJlIHRoZSBzdXBlcnBvc2l0aW9uIG9mIHR3byByZWdpc3Rl
cnMuIik7CiAKLSAgICAgICAgICAgIHVuc2lnbmVkIGFJbnRlcm5hbCA9IGEuaW50ZXJuYWxWYWx1
ZSgpOwotICAgICAgICAgICAgdW5zaWduZWQgYkludGVybmFsID0gYi5pbnRlcm5hbFZhbHVlKCk7
Ci0gICAgICAgICAgICBpZiAoYkludGVybmFsIDwgYUludGVybmFsKQotICAgICAgICAgICAgICAg
IHN0ZDo6c3dhcChhSW50ZXJuYWwsIGJJbnRlcm5hbCk7Ci0gICAgICAgICAgICBtX3ZhbHVlID0g
c3RhdGljX2Nhc3Q8dWludDY0X3Q+KGFJbnRlcm5hbCkgPDwgMzIgfCBiSW50ZXJuYWw7CisgICAg
ICAgICAgICBpZiAoYiA8IGEpCisgICAgICAgICAgICAgICAgc3RkOjpzd2FwKGEsIGIpOworICAg
ICAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihhKSA8PCAzMiB8IGI7CiAg
ICAgICAgIH0KIAogICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRl
ZFZhbHVlVHlwZSkKQEAgLTc2MSwxNCArNDYzLDE0IEBAIHByaXZhdGU6CiAgICAgICAgIHsKICAg
ICAgICAgfQogCi0gICAgICAgIFRtcCBmaXJzdCgpIGNvbnN0CisgICAgICAgIEluZGV4VHlwZSBm
aXJzdCgpIGNvbnN0CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUbXA6OnRtcEZvcklu
dGVybmFsVmFsdWUobV92YWx1ZSA+PiAzMik7CisgICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA+
PiAzMiAmIDB4ZmZmZmZmZmY7CiAgICAgICAgIH0KIAotICAgICAgICBUbXAgc2Vjb25kKCkgY29u
c3QKKyAgICAgICAgSW5kZXhUeXBlIHNlY29uZCgpIGNvbnN0CiAgICAgICAgIHsKLSAgICAgICAg
ICAgIHJldHVybiBUbXA6OnRtcEZvckludGVybmFsVmFsdWUobV92YWx1ZSAmIDB4ZmZmZmZmZmYp
OworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgJiAweGZmZmZmZmZmOwogICAgICAgICB9CiAK
ICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVyZmVyZW5jZUVkZ2Ugb3RoZXIpIGNv
bnN0CkBAIC04MDIsMzggKzUwNCwzNSBAQCBwcml2YXRlOgogICAgIH07CiAgICAgdHlwZWRlZiBT
aW1wbGVDbGFzc0hhc2hUcmFpdHM8SW50ZXJmZXJlbmNlRWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhh
c2hUcmFpdHM7CiAKLSAgICBDb2RlJiBtX2NvZGU7Ci0gICAgY29uc3QgVXNlQ291bnRzPFRtcD4m
IG1fdXNlQ291bnRzOwotCi0gICAgY29uc3QgSGFzaFNldDxUbXA+JiBtX3Vuc3BpbGxhYmxlVG1w
OwotICAgIHVuc2lnbmVkIG1fbnVtYmVyT2ZSZWdpc3RlcnMgeyAwIH07CisgICAgY29uc3QgVmVj
dG9yPFJlZz4mIG1fcmVnc0luUHJpb3JpdHlPcmRlcjsKKyAgICBJbmRleFR5cGUgbV9sYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CiAKICAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdy
YXBoLgogICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhhc2gs
IEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOwotICAgIFZl
Y3RvcjxWZWN0b3I8VG1wLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZl
Y3Rvck92ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7Ci0gICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBV
bnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOworICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhU
eXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93
PiBtX2FkamFjZW5jeUxpc3Q7CisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9y
T3ZlcmZsb3c+IG1fZGVncmVlczsKIAogICAgIC8vIEluc3RlYWQgb2Yga2VlcGluZyB0cmFjayBv
ZiB0aGUgbW92ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qga2VlcCB0aGVpciBvcGVyYW5kcyBhcm91
bmQgYW5kIHVzZSB0aGUgaW5kZXgKICAgICAvLyBpbiB0aGUgdmVjdG9yIGFzIHRoZSAiaWRlbnRp
ZmllciIgZm9yIHRoZSBtb3ZlLgogICAgIHN0cnVjdCBNb3ZlT3BlcmFuZHMgewotICAgICAgICBU
bXAgc3JjOwotICAgICAgICBUbXAgZHN0OworICAgICAgICBJbmRleFR5cGUgc3JjSW5kZXg7Cisg
ICAgICAgIEluZGV4VHlwZSBkc3RJbmRleDsKICAgICB9OwogICAgIFZlY3RvcjxNb3ZlT3BlcmFu
ZHMsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzOwogCiAg
ICAgLy8gTGlzdCBvZiBldmVyeSBtb3ZlIGluc3RydWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIFRt
cC4KLSAgICBWZWN0b3I8SGFzaFNldDx1bnNpZ25lZCwgRGVmYXVsdEhhc2g8dW5zaWduZWQ+OjpI
YXNoLCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJhaXRzPHVuc2lnbmVkPj4+IG1fbW92
ZUxpc3Q7CisgICAgVmVjdG9yPEhhc2hTZXQ8SW5kZXhUeXBlLCB0eXBlbmFtZSBEZWZhdWx0SGFz
aDxJbmRleFR5cGU+OjpIYXNoLCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJhaXRzPElu
ZGV4VHlwZT4+PiBtX21vdmVMaXN0OwogCiAgICAgLy8gQ29sb3JzLgogICAgIFZlY3RvcjxSZWcs
IDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvbG9yZWRUbXA7Ci0gICAgSGFzaFNldDxUbXA+
IG1fc3BpbGxlZFRtcDsKKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NwaWxsZWRUbXBzOwogCiAg
ICAgLy8gVmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZCB3aXRoIGFuIG90aGVyIHZhbHVl
LgotICAgIFZlY3RvcjxUbXAsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRt
cHM7CisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29h
bGVzY2VkVG1wczsKIAogICAgIC8vIFRoZSBzdGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBn
cmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgogICAgIEJpdFZlY3RvciBtX2lzT25TZWxlY3RT
dGFjazsKLSAgICBWZWN0b3I8VG1wPiBtX3NlbGVjdFN0YWNrOworICAgIFZlY3RvcjxJbmRleFR5
cGU+IG1fc2VsZWN0U3RhY2s7CiAKICAgICBzdHJ1Y3QgT3JkZXJlZE1vdmVTZXQgewogICAgICAg
ICB1bnNpZ25lZCBhZGRNb3ZlKCkKQEAgLTkxNCwxNDAgKzYxMyw1NjIgQEAgcHJpdmF0ZToKICAg
ICAvLyBTZXQgb2YgIm1vdmUiIG5vdCB5ZXQgcmVhZHkgZm9yIGNvYWxlc2NpbmcuCiAgICAgQml0
VmVjdG9yIG1fYWN0aXZlTW92ZXM7CiAgICAgLy8gTG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVsYXRl
ZC4KLSAgICBWZWN0b3I8VG1wPiBtX3NpbXBsaWZ5V29ya2xpc3Q7CisgICAgVmVjdG9yPEluZGV4
VHlwZT4gbV9zaW1wbGlmeVdvcmtsaXN0OwogICAgIC8vIEhpZ2gtZGVncmVlIFRtcC4KLSAgICBI
YXNoU2V0PFRtcD4gbV9zcGlsbFdvcmtsaXN0OworICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX3Nw
aWxsV29ya2xpc3Q7CiAgICAgLy8gTG93LWRlZ3JlZSwgTW92ZSByZWxhdGVkLgotICAgIEhhc2hT
ZXQ8VG1wPiBtX2ZyZWV6ZVdvcmtsaXN0OworICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6
ZVdvcmtsaXN0OwogCiAgICAgYm9vbCBtX2hhc1NlbGVjdGVkU3BpbGwgeyBmYWxzZSB9OwogICAg
IGJvb2wgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSB7IGZhbHNlIH07CiAKICAgICAvLyBU
aGUgbWFwcGluZyBvZiBUbXAgdG8gdGhlaXIgYWxpYXMgZm9yIE1vdmVzIHRoYXQgYXJlIGFsd2F5
cyBjb2FsZXNjaW5nIHJlZ2FyZGxlc3Mgb2Ygc3BpbGxpbmcuCi0gICAgVmVjdG9yPFRtcCwgMCwg
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wc0F0U3BpbGw7CisgICAgVmVjdG9y
PEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wc0F0U3Bp
bGw7CiB9OwogCisvLyBUaGlzIHBlcmZvcm0gYWxsIHRoZSB0YXNrcyB0aGF0IGFyZSBzcGVjaWZp
YyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCiB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLWJv
b2wgaXNVc2VsZXNzTW92ZUluc3QoY29uc3QgSW5zdCYgaW5zdCkKLXsKLSAgICByZXR1cm4gTW92
ZUluc3RIZWxwZXI8dHlwZT46Om1heUJlQ29hbGVzY2FibGUoaW5zdCkgJiYgaW5zdC5hcmdzWzBd
LnRtcCgpID09IGluc3QuYXJnc1sxXS50bXAoKTsKLX0KLQotdGVtcGxhdGU8QXJnOjpUeXBlIHR5
cGU+Ci12b2lkIGFzc2lnblJlZ2lzdGVyVG9UbXBJblByb2dyYW0oQ29kZSYgY29kZSwgY29uc3Qg
SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9jYXRvcikKLXsK
LSAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogY29kZSkgewotICAgICAgICAvLyBHaXZlIFRt
cCBhIHZhbGlkIHJlZ2lzdGVyLgotICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7
IGluc3RJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7Ci0gICAgICAgICAgICBJ
bnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRleCk7Ci0gICAgICAgICAgICBpbnN0LmZvckVh
Y2hUbXBGYXN0KFsmXSAoVG1wJiB0bXApIHsKLSAgICAgICAgICAgICAgICBpZiAodG1wLmlzUmVn
KCkgfHwgdG1wLmlzR1AoKSA9PSAodHlwZSAhPSBBcmc6OkdQKSkKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMgQWJzdHJhY3RDb2xv
cmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4geworcHVibGljOgorICAgIENvbG9yaW5nQWxsb2NhdG9y
KENvZGUmIGNvZGUsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMsIGNvbnN0IEhhc2hT
ZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAgOiBBYnN0cmFjdENvbG9yaW5n
QWxsb2NhdG9yPHVuc2lnbmVkPihyZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpLCBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCksIHRtcEFycmF5U2l6ZShj
b2RlKSkKKyAgICAgICAgLCBtX2NvZGUoY29kZSkKKyAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VD
b3VudHMpCisgICAgICAgICwgbV91bnNwaWxsYWJsZVRtcHModW5zcGlsbGFibGVUbXApCisgICAg
eworICAgICAgICBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgpOworICAgICAgICBidWlsZCgpOwor
ICAgICAgICBhbGxvY2F0ZSgpOworICAgIH0KIAotICAgICAgICAgICAgICAgIFRtcCBhbGlhc1Rt
cCA9IGFsbG9jYXRvci5nZXRBbGlhcyh0bXApOwotICAgICAgICAgICAgICAgIFRtcCBhc3NpZ25l
ZFRtcDsKLSAgICAgICAgICAgICAgICBpZiAoYWxpYXNUbXAuaXNSZWcoKSkKLSAgICAgICAgICAg
ICAgICAgICAgYXNzaWduZWRUbXAgPSBUbXAoYWxpYXNUbXAucmVnKCkpOwotICAgICAgICAgICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdXRvIHJlZyA9IGFsbG9jYXRvci5hbGxv
Y2F0ZWRSZWcoYWxpYXNUbXApOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQocmVnKTsKLSAg
ICAgICAgICAgICAgICAgICAgYXNzaWduZWRUbXAgPSBUbXAocmVnKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgQVNTRVJUKGFzc2lnbmVkVG1wLmlzUmVnKCkpOwotICAgICAg
ICAgICAgICAgIHRtcCA9IGFzc2lnbmVkVG1wOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0K
KyAgICBUbXAgZ2V0QWxpYXMoVG1wIHRtcCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZ2V0QWxpYXMoQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSkpOworICAgIH0KIAotICAg
ICAgICAvLyBSZW1vdmUgYWxsIHRoZSB1c2VsZXNzIG1vdmVzIHdlIGNyZWF0ZWQgaW4gdGhpcyBi
bG9jay4KLSAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hpbmcoaXNVc2VsZXNz
TW92ZUluc3Q8dHlwZT4pOworICAgIGJvb2wgaXNVc2VsZXNzTW92ZShjb25zdCBJbnN0JiBpbnN0
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1heUJlQ29hbGVzY2FibGUoaW5zdCkgJiYg
aW5zdC5hcmdzWzBdLnRtcCgpID09IGluc3QuYXJnc1sxXS50bXAoKTsKICAgICB9Ci19CiAKLXRl
bXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotdm9pZCBhZGRTcGlsbEFuZEZpbGxUb1Byb2dyYW0oQ29k
ZSYgY29kZSwgY29uc3QgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I8dHlwZT4m
IGFsbG9jYXRvciwgSGFzaFNldDxUbXA+JiB1bnNwaWxsYWJsZVRtcCkKLXsKLSAgICBjb25zdCBI
YXNoU2V0PFRtcD4mIHNwaWxsZWRUbXAgPSBhbGxvY2F0b3Iuc3BpbGxlZFRtcCgpOworICAgIFRt
cCBnZXRBbGlhc1doZW5TcGlsbGluZyhUbXAgdG1wKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNT
RVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wcy5pc0VtcHR5KCksICJUaGlzIGZ1bmN0aW9u
IGlzIG9ubHkgdmFsaWQgZm9yIGNvYWxlc2NpbmcgZHVyaW5nIHNwaWxsaW5nLiIpOwogCi0gICAg
Ly8gQWxsIHRoZSBzcGlsbGVkIHZhbHVlcyBiZWNvbWUgdW5zcGlsbGFibGUuCi0gICAgdW5zcGls
bGFibGVUbXAuYWRkKHNwaWxsZWRUbXAuYmVnaW4oKSwgc3BpbGxlZFRtcC5lbmQoKSk7CisgICAg
ICAgIGlmIChtX2NvYWxlc2NlZFRtcHNBdFNwaWxsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJl
dHVybiB0bXA7CiAKLSAgICAvLyBBbGxvY2F0ZSBzdGFjayBzbG90IGZvciBlYWNoIHNwaWxsZWQg
dmFsdWUuCi0gICAgSGFzaE1hcDxUbXAsIFN0YWNrU2xvdCo+IHN0YWNrU2xvdHM7Ci0gICAgZm9y
IChUbXAgdG1wIDogc3BpbGxlZFRtcCkgewotICAgICAgICBib29sIGlzTmV3VG1wID0gc3RhY2tT
bG90cy5hZGQodG1wLCBjb2RlLmFkZFN0YWNrU2xvdCg4LCBTdGFja1Nsb3RLaW5kOjpBbm9ueW1v
dXMpKS5pc05ld0VudHJ5OwotICAgICAgICBBU1NFUlRfVU5VU0VEKGlzTmV3VG1wLCBpc05ld1Rt
cCk7Ci0gICAgfQorICAgICAgICB1bnNpZ25lZCBhbGlhc0luZGV4ID0gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsKKyAgICAgICAgd2hpbGUgKHVuc2lnbmVkIG5l
eHRBbGlhc0luZGV4ID0gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbFthbGlhc0luZGV4XSkKKyAgICAg
ICAgICAgIGFsaWFzSW5kZXggPSBuZXh0QWxpYXNJbmRleDsKIAotICAgIC8vIFJld3JpdGUgdGhl
IHByb2dyYW0gdG8gZ2V0IHJpZCBvZiB0aGUgc3BpbGxlZCBUbXAuCi0gICAgSW5zZXJ0aW9uU2V0
IGluc2VydGlvblNldChjb2RlKTsKLSAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogY29kZSkg
ewotICAgICAgICBib29sIGhhc0FsaWFzZWRUbXBzID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yICh1
bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJ
bmRleCkgewotICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOwot
Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmVwbGFjZSB0aGUgcmVnaXN0ZXIgdXNlIGJ5IG1lbW9y
eSB1c2Ugd2hlbiBwb3NzaWJsZS4KLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBpbnN0LmFyZ3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBBcmcmIGFyZyA9IGlu
c3QuYXJnc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoYXJnLmlzVG1wKCkgJiYgYXJnLnR5cGUo
KSA9PSB0eXBlICYmICFhcmcuaXNSZWcoKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvIHN0
YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKGFyZy50bXAoKSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIChzdGFja1Nsb3RFbnRyeSAhPSBzdGFja1Nsb3RzLmVuZCgpICYmIGluc3QuYWRt
aXRzU3RhY2soaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBBcmc6OnN0YWNrKHN0
YWNrU2xvdEVudHJ5LT52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQor
ICAgICAgICBUbXAgYWxpYXMgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29s
dXRlSW5kZXgoYWxpYXNJbmRleCk7CiAKLSAgICAgICAgICAgIC8vIEZvciBldmVyeSBvdGhlciBj
YXNlLCBhZGQgTG9hZC9TdG9yZSBhcyBuZWVkZWQuCi0gICAgICAgICAgICBpbnN0LmZvckVhY2hU
bXAoWyZdIChUbXAmIHRtcCwgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHRtcC5pc1JlZygpIHx8IGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3Nw
aWxsZWRUbXBzLmNvbnRhaW5zKGFsaWFzSW5kZXgpIHx8IGFsaWFzID09IHRtcCwgIlRoZSBhbGlh
c2VzIGF0IHNwaWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcgd2VudCBo
b3JyaWJseSB3cm9uZy4iKTsKIAotICAgICAgICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50cnkg
PSBzdGFja1Nsb3RzLmZpbmQodG1wKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhY2tTbG90RW50
cnkgPT0gc3RhY2tTbG90cy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBUbXAgYWxpYXMg
PSBhbGxvY2F0b3IuZ2V0QWxpYXNXaGVuU3BpbGxpbmcodG1wKTsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKGFsaWFzICE9IHRtcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gYWxp
YXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXNBbGlhc2VkVG1wcyA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsaWFzOworICAgIH0KIAotICAgICAgICAgICAgICAg
IEFyZyBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7Ci0gICAgICAgICAg
ICAgICAgT3Bjb2RlIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3ZlIDogTW92ZURvdWJsZTsK
KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleEl0ZXJhdG9yPgorICAgIGNsYXNzIEluZGV4VG9U
bXBJdGVyYXRvckFkYXB0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJh
dG9yQWRhcHRvcihJbmRleEl0ZXJhdG9yJiYgaW5kZXhJdGVyYXRvcikKKyAgICAgICAgICAgIDog
bV9pbmRleEl0ZXJhdG9yKFdURjo6bW92ZShpbmRleEl0ZXJhdG9yKSkKKyAgICAgICAgeworICAg
ICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueVVzZShyb2xlKSkgewotICAg
ICAgICAgICAgICAgICAgICBUbXAgbmV3VG1wID0gY29kZS5uZXdUbXAodHlwZSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdEluZGV4LCBtb3ZlLCBpbnN0Lm9y
aWdpbiwgYXJnLCBuZXdUbXApOwotICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZXdUbXA7Cisg
ICAgICAgIFRtcCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRvcik7IH0KKyAgICAgICAg
SW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3BlcmF0b3IrKygpIHsgKyttX2luZGV4SXRlcmF0
b3I7IHJldHVybiAqdGhpczsgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEFueSBuZXcgRmls
bCgpIHNob3VsZCBuZXZlciBiZSBzcGlsbGVkLgotICAgICAgICAgICAgICAgICAgICB1bnNwaWxs
YWJsZVRtcC5hZGQodG1wKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvdGhlcikgY29uc3QKKyAgICAg
ICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXhJdGVyYXRvciA9PSBvdGhlci5tX2luZGV4
SXRlcmF0b3I7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5k
ZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAg
ICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToK
KyAgICAgICAgSW5kZXhJdGVyYXRvciBtX2luZGV4SXRlcmF0b3I7CisgICAgfTsKKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb24+CisgICAgY2xhc3MgSW5kZXhUb1RtcEl0ZXJhYmxl
QWRhcHRvciB7CisgICAgcHVibGljOgorICAgICAgICBJbmRleFRvVG1wSXRlcmFibGVBZGFwdG9y
KGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24pCisgICAgICAgICAgICA6IG1fY29sbGVjdGlv
bihjb2xsZWN0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBJbmRleFRvVG1w
SXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBiZWdp
bigpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24uYmVn
aW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3I8dHlw
ZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3I+IGVuZCgpIGNvbnN0CisgICAgICAgIHsK
KyAgICAgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24uZW5kKCk7CisgICAgICAgIH0KKworICAg
IHByaXZhdGU6CisgICAgICAgIGNvbnN0IENvbGxlY3Rpb24mIG1fY29sbGVjdGlvbjsKKyAgICB9
OworCisgICAgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcjxWZWN0b3I8dW5zaWduZWQ+PiBzcGls
bGVkVG1wcygpIGNvbnN0IHsgcmV0dXJuIG1fc3BpbGxlZFRtcHM7IH0KKworICAgIGJvb2wgcmVx
dWlyZXNTcGlsbGluZygpIGNvbnN0IHsgcmV0dXJuICFtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKTsg
fQorCisgICAgUmVnIGFsbG9jYXRlZFJlZyhUbXAgdG1wKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKCF0bXAuaXNSZWcoKSk7CisgICAgICAgIEFTU0VSVChtX2NvbG9yZWRUbXAuc2l6ZSgp
KTsKKyAgICAgICAgQVNTRVJUKHRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpHUCkpOworCisg
ICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgodG1wKV07CisgICAgICAgIGlmICghcmVnKSB7CisgICAgICAgICAgICAvLyBX
ZSBvbmx5IGNhcmUgYWJvdXQgVG1wcyB0aGF0IGludGVyZmVyZS4gQSBUbXAgdGhhdCBuZXZlciBp
bnRlcmZlcmUgd2l0aCBhbnl0aGluZworICAgICAgICAgICAgLy8gY2FuIHRha2UgYW55IHJlZ2lz
dGVyLgorICAgICAgICAgICAgcmVnID0gcmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKS5maXJzdCgp
OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWc7CisgICAgfQorCitwcml2YXRlOgorICAg
IHN0YXRpYyB1bnNpZ25lZCB0bXBBcnJheVNpemUoQ29kZSYgY29kZSkKKyAgICB7CisgICAgICAg
IHVuc2lnbmVkIG51bVRtcHMgPSBjb2RlLm51bVRtcHModHlwZSk7CisgICAgICAgIHJldHVybiBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKKyAgICB9CisK
KyAgICB2b2lkIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCkKKyAgICB7CisgICAgICAgIG1fY29s
b3JlZFRtcC5yZXNpemUobV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxKTsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRl
eDsgKytpKSB7CisgICAgICAgICAgICBUbXAgdG1wID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOworICAgICAgICAgICAgQVNTRVJUKHRtcC5pc1JlZygp
KTsKKyAgICAgICAgICAgIG1fY29sb3JlZFRtcFtpXSA9IHRtcC5yZWcoKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHZvaWQgYnVpbGQoKQorICAgIHsKKyAgICAgICAgVG1wTGl2ZW5lc3M8dHlw
ZT4gbGl2ZW5lc3MobV9jb2RlKTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1f
Y29kZSkgeworICAgICAgICAgICAgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2FsQ2Fs
YyBsb2NhbENhbGMobGl2ZW5lc3MsIGJsb2NrKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQg
aW5zdEluZGV4ID0gYmxvY2stPnNpemUoKTsgaW5zdEluZGV4LS07KSB7CisgICAgICAgICAgICAg
ICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOworICAgICAgICAgICAgICAgIElu
c3QqIG5leHRJbnN0ID0gaW5zdEluZGV4ICsgMSA8IGJsb2NrLT5zaXplKCkgPyAmYmxvY2stPmF0
KGluc3RJbmRleCArIDEpIDogbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBidWlsZChpbnN0LCBu
ZXh0SW5zdCwgbG9jYWxDYWxjKTsKKyAgICAgICAgICAgICAgICBsb2NhbENhbGMuZXhlY3V0ZShp
bnN0SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBi
dWlsZChJbnN0JiBpbnN0LCBJbnN0KiBuZXh0SW5zdCwgY29uc3QgdHlwZW5hbWUgVG1wTGl2ZW5l
c3M8dHlwZT46OkxvY2FsQ2FsYyYgbG9jYWxDYWxjKQorICAgIHsKKyAgICAgICAgaW5zdC5mb3JF
YWNoVG1wV2l0aEV4dHJhQ2xvYmJlcmVkUmVncygKKyAgICAgICAgICAgIG5leHRJbnN0LAorICAg
ICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSBh
cmdUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFBcmc6OmlzRGVmKHJvbGUpIHx8IGFyZ1R5
cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgRGVmKClzIGludGVyZmVyZSB3aXRoIGVhY2gg
b3RoZXIgYW5kIHdpdGggYWxsIHRoZSBleHRyYSBjbG9iYmVyZWQgVG1wcy4KKyAgICAgICAgICAg
ICAgICAvLyBXZSBzaG91bGQgbm90IHVzZSBmb3JFYWNoRGVmQW5kRXh0cmFDbG9iYmVyZWRUbXAo
KSBoZXJlIHNpbmNlIGNvbG9yZWQgVG1wcworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBuZWVk
IGludGVyZmVyZW5jZSBlZGdlcyBpbiBvdXIgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICAg
ICAgaW5zdC5mb3JFYWNoVG1wKFsmXSAoVG1wJiBvdGhlckFyZywgQXJnOjpSb2xlIHJvbGUsIEFy
Zzo6VHlwZSBhcmdUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghQXJnOjppc0RlZihy
b2xlKSB8fCBhcmdUeXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgICAgICAgICAgICAgYWRkRWRnZShhcmcsIG90aGVyQXJnKTsKKyAgICAgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmIChtYXlCZUNvYWxlc2Nh
YmxlKGluc3QpKSB7CisgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0aGUgVXNlKCkgb2Yg
dGhpcyBtb3ZlIHRvIGludGVyZmVyZSB3aXRoIHRoZSBEZWYoKSwgZXZlbiBpZiBpdCBpcyBsaXZl
CisgICAgICAgICAgICAvLyBhZnRlciB0aGUgTW92ZS4gSWYgd2Ugd2VyZSB0byBhZGQgdGhlIGlu
dGVyZmVyZW5jZSBlZGdlLCBpdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvCisgICAgICAgICAgICAv
LyBjb2FsZXNjZSB0aGUgTW92ZSBldmVuIGlmIHRoZSB0d28gVG1wIG5ldmVyIGludGVyZmVyZSBh
bnl3aGVyZS4KKyAgICAgICAgICAgIFRtcCBkZWZUbXA7CisgICAgICAgICAgICBUbXAgdXNlVG1w
OworICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wKFsmZGVmVG1wLCAmdXNlVG1wXSAoVG1wJiBh
cmdUbXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUpIHsKICAgICAgICAgICAgICAgICBpZiAo
QXJnOjppc0RlZihyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2Vy
dChpbnN0SW5kZXggKyAxLCBtb3ZlLCBpbnN0Lm9yaWdpbiwgdG1wLCBhcmcpOworICAgICAgICAg
ICAgICAgICAgICBkZWZUbXAgPSBhcmdUbXA7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIEFTU0VSVChBcmc6OmlzRWFybHlVc2Uocm9sZSkpOworICAgICAgICAg
ICAgICAgICAgICB1c2VUbXAgPSBhcmdUbXA7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgfSk7CisgICAgICAgICAgICBBU1NFUlQoZGVmVG1wKTsKKyAgICAgICAgICAgIEFTU0VSVCh1
c2VUbXApOworCisgICAgICAgICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlcy5zaXplKCk7CisgICAgICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVz
LmFwcGVuZCh7IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHVzZVRtcCks
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7CisKKyAg
ICAgICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5h
ZGRNb3ZlKCk7CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwg
bmV3SW5kZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOworCisgICAgICAgICAgICBBU1NF
UlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7CisgICAgICAgICAgICBt
X2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOworCisgICAgICAgICAg
ICBmb3IgKGNvbnN0IEFyZyYgYXJnIDogaW5zdC5hcmdzKSB7CisgICAgICAgICAgICAgICAgYXV0
byYgbGlzdCA9IG1fbW92ZUxpc3RbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgoYXJnLnRtcCgpKV07CisgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV4dE1vdmVJbmRleCk7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDog
bG9jYWxDYWxjLmxpdmUoKSkgeworICAgICAgICAgICAgICAgIGlmIChsaXZlVG1wICE9IHVzZVRt
cCkKKyAgICAgICAgICAgICAgICAgICAgYWRkRWRnZShkZWZUbXAsIGxpdmVUbXApOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgbmV4dCBpbnN0cnVjdGlvbiBjb3VsZCBoYXZl
IGVhcmx5IGNsb2JiZXJzLiBXZSBuZWVkIHRvIGNvbnNpZGVyIHRob3NlIG5vdy4KKyAgICAgICAg
ICAgIGlmIChuZXh0SW5zdCAmJiBuZXh0SW5zdC0+aGFzU3BlY2lhbCgpKSB7CisgICAgICAgICAg
ICAgICAgbmV4dEluc3QtPmV4dHJhRWFybHlDbG9iYmVyZWRSZWdzKCkuZm9yRWFjaChbJl0gKFJl
ZyByZWcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZy5pc0dQUigpID09ICh0eXBlID09
IEFyZzo6R1ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFRtcCYgbGl2
ZVRtcCA6IGxvY2FsQ2FsYy5saXZlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRk
RWRnZShUbXAocmVnKSwgbGl2ZVRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBh
ZGRFZGdlcyhpbnN0LCBuZXh0SW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7CisgICAgfQorCisgICAg
dm9pZCBhZGRFZGdlcyhJbnN0JiBpbnN0LCBJbnN0KiBuZXh0SW5zdCwgdHlwZW5hbWUgVG1wTGl2
ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYzo6SXRlcmFibGUgbGl2ZVRtcHMpCisgICAgeworICAgICAg
ICAvLyBBbGwgdGhlIERlZigpcyBpbnRlcmZlcmUgd2l0aCBldmVydGhpbmcgbGl2ZS4KKyAgICAg
ICAgaW5zdC5mb3JFYWNoVG1wV2l0aEV4dHJhQ2xvYmJlcmVkUmVncygKKyAgICAgICAgICAgIG5l
eHRJbnN0LAorICAgICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlIHJvbGUs
IEFyZzo6VHlwZSBhcmdUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFBcmc6OmlzRGVmKHJv
bGUpIHx8IGFyZ1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDog
bGl2ZVRtcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVUbXAuaXNHUCgpID09ICh0
eXBlID09IEFyZzo6R1ApKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWRnZShhcmcsIGxp
dmVUbXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KKworICAg
IHZvaWQgYWRkRWRnZShUbXAgYSwgVG1wIGIpCisgICAgeworICAgICAgICBBU1NFUlRfV0lUSF9N
RVNTQUdFKGEuaXNHUCgpID09IGIuaXNHUCgpLCAiQW4gaW50ZXJmZXJlbmNlIGJldHdlZW4gcmVn
aXN0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4gbGVh
ZCB0byBub24tY29sb3JhYmxlIGdyYXBocy4iKTsKKworICAgICAgICBhZGRFZGdlKEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleChiKSk7CisgICAgfQorCisgICAgYm9vbCBtYXlCZUNvYWxlc2NhYmxl
KGNvbnN0IEluc3QmIGluc3QpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsK
KyAgICAgICAgY2FzZSBBcmc6OkdQOgorICAgICAgICAgICAgc3dpdGNoIChpbnN0Lm9wY29kZSkg
eworICAgICAgICAgICAgY2FzZSBNb3ZlOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBcmc6OkZQOgorICAgICAgICAg
ICAgc3dpdGNoIChpbnN0Lm9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBNb3ZlRmxvYXQ6Cisg
ICAgICAgICAgICBjYXNlIE1vdmVEb3VibGU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGluc2VydGlvblNl
dC5leGVjdXRlKGJsb2NrKTsKIAotICAgICAgICBpZiAoaGFzQWxpYXNlZFRtcHMpCi0gICAgICAg
ICAgICBibG9jay0+aW5zdHMoKS5yZW1vdmVBbGxNYXRjaGluZyhpc1VzZWxlc3NNb3ZlSW5zdDx0
eXBlPik7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW5zdC5hcmdzLnNpemUoKSA9PSAy
LCAiV2UgYXNzdW1lIGNvYWxlY2FibGUgbW92ZXMgb25seSBoYXZlIHR3byBhcmd1bWVudHMgaW4g
YSBmZXcgcGxhY2VzLiIpOworCisgICAgICAgIGlmICghaW5zdC5hcmdzWzBdLmlzVG1wKCkgfHwg
IWluc3QuYXJnc1sxXS5pc1RtcCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIEFTU0VSVChpbnN0LmFyZ3NbMF0udHlwZSgpID09IHR5cGUpOworICAgICAgICBBU1NFUlQo
aW5zdC5hcmdzWzFdLnR5cGUoKSA9PSB0eXBlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKICAg
ICB9Ci19CiAKLXRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotdm9pZCBpdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZ09uVHlwZSgKLSAgICBDb2RlJiBjb2RlLCBjb25zdCBVc2VDb3VudHM8VG1wPiYg
dXNlQ291bnRzLCB1bnNpZ25lZCYgbnVtSXRlcmF0aW9ucykKLXsKLSAgICBIYXNoU2V0PFRtcD4g
dW5zcGlsbGFibGVUbXBzOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIG51bUl0ZXJhdGlv
bnMrKzsKLSAgICAgICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdBbGxvY2F0b3I8dHlwZT4g
YWxsb2NhdG9yKGNvZGUsIHVzZUNvdW50cywgdW5zcGlsbGFibGVUbXBzKTsKLSAgICAgICAgaWYg
KGFsbG9jYXRvci5zcGlsbGVkVG1wKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhc3NpZ25S
ZWdpc3RlclRvVG1wSW5Qcm9ncmFtKGNvZGUsIGFsbG9jYXRvcik7Ci0gICAgICAgICAgICByZXR1
cm47CisgICAgdm9pZCBzZWxlY3RTcGlsbCgpCisgICAgeworICAgICAgICBpZiAoIW1faGFzU2Vs
ZWN0ZWRTcGlsbCkgeworICAgICAgICAgICAgbV9oYXNTZWxlY3RlZFNwaWxsID0gdHJ1ZTsKKwor
ICAgICAgICAgICAgaWYgKG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUpCisgICAgICAgICAg
ICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbCA9IG1fY29hbGVzY2VkVG1wczsKICAgICAgICAg
fQotICAgICAgICBhZGRTcGlsbEFuZEZpbGxUb1Byb2dyYW08dHlwZT4oY29kZSwgYWxsb2NhdG9y
LCB1bnNwaWxsYWJsZVRtcHMpOworCisgICAgICAgIGF1dG8gaXRlcmF0b3IgPSBtX3NwaWxsV29y
a2xpc3QuYmVnaW4oKTsKKworICAgICAgICB3aGlsZSAoaXRlcmF0b3IgIT0gbV9zcGlsbFdvcmts
aXN0LmVuZCgpICYmIG1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvcikpCisgICAg
ICAgICAgICArK2l0ZXJhdG9yOworCisgICAgICAgIFJFTEVBU0VfQVNTRVJUX1dJVEhfTUVTU0FH
RShpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCksICJJdCBpcyBub3QgcG9zc2libGUg
dG8gY29sb3IgdGhlIEFpciBncmFwaCB3aXRoIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHJlZ2lz
dGVycy4iKTsKKworICAgICAgICAvLyBIaWdoZXIgc2NvcmUgbWVhbnMgbW9yZSBkZXNpcmFibGUg
dG8gc3BpbGwuIExvd2VyIHNjb3JlcyBtYXhpbWl6ZSB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgdG1w
CisgICAgICAgIC8vIGdldHMgYSByZWdpc3Rlci4KKyAgICAgICAgYXV0byBzY29yZSA9IFsmXSAo
VG1wIHRtcCkgLT4gZG91YmxlIHsKKyAgICAgICAgICAgIC8vIEFpciBleHBvc2VzIHRoZSBjb25j
ZXB0IG9mICJmYXN0IHRtcHMiLCBhbmQgd2UgaW50ZXJwcmV0IHRoYXQgdG8gbWVhbiB0aGF0IHRo
ZSB0bXAKKyAgICAgICAgICAgIC8vIHNob3VsZCBhbHdheXMgYmUgaW4gYSByZWdpc3Rlci4KKyAg
ICAgICAgICAgIGlmIChtX2NvZGUuaXNGYXN0VG1wKHRtcCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFs
LCB0aGUgc2NvcmUgc2hvdWxkIGJlIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGRlZ3JlZS4KKyAg
ICAgICAgICAgIGRvdWJsZSBkZWdyZWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG1fZGVncmVlc1tB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSk7CisKKyAgICAgICAg
ICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJlIGludmVyc2Vs
eSByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2Ygd2FybSB1c2VzIGFuZAorICAgICAgICAgICAgLy8g
ZGVmcy4KKyAgICAgICAgICAgIGNvbnN0IFVzZUNvdW50czxUbXA+OjpDb3VudHMmIGNvdW50cyA9
IG1fdXNlQ291bnRzW3RtcF07CisgICAgICAgICAgICBkb3VibGUgdXNlcyA9IGNvdW50cy5udW1X
YXJtVXNlcyArIGNvdW50cy5udW1EZWZzOworCisgICAgICAgICAgICByZXR1cm4gZGVncmVlIC8g
dXNlczsKKyAgICAgICAgfTsKKworICAgICAgICBhdXRvIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0
b3I7CisgICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3JlKEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKKworICAgICAgICArK2l0ZXJh
dG9yOworICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCk7ICsr
aXRlcmF0b3IpIHsKKyAgICAgICAgICAgIGRvdWJsZSB0bXBTY29yZSA9IHNjb3JlKEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKKyAgICAg
ICAgICAgIGlmICh0bXBTY29yZSA+IG1heFNjb3JlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1f
dW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvcikpCisgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsK
KyAgICAgICAgICAgICAgICBtYXhTY29yZSA9IHRtcFNjb3JlOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgdmljdGltSW5kZXggPSAqdmljdGltSXRlcmF0b3I7
CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodmljdGltSXRlcmF0b3IpOworICAgICAg
ICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKKworICAgICAgICBmcmVl
emVNb3Zlcyh2aWN0aW1JbmRleCk7CiAgICAgfQotfQorCisgICAgdm9pZCBhbGxvY2F0ZSgpCisg
ICAgeworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1fYWN0aXZlTW92ZXMuc2l6ZSgpID49
IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAiVGhlIGFjdGl2ZU1vdmUgc2V0IHNob3Vs
ZCBiZSBiaWcgZW5vdWdoIGZvciB0aGUgcXVpY2sgb3BlcmF0aW9ucyBvZiBCaXRWZWN0b3IuIik7
CisKKyAgICAgICAgbWFrZVdvcmtMaXN0KCk7CisKKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAg
ICAgICAgICBkYXRhTG9nKCJJbnRlcmZlcmVuY2U6ICIsIGxpc3REdW1wKG1faW50ZXJmZXJlbmNl
RWRnZXMpLCAiXG4iKTsKKyAgICAgICAgICAgIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFdU
Rjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICBkYXRhTG9nKCJJbml0aWFsIHdvcmsgbGlzdFxu
Iik7CisgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAg
IH0KKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgeworICAgICAg
ICAgICAgICAgIGRhdGFMb2coIkJlZm9yZSBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25c
biIpOworICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0
eSgpKQorICAgICAgICAgICAgICAgIHNpbXBsaWZ5KCk7CisgICAgICAgICAgICBlbHNlIGlmICgh
bV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb2FsZXNjZSgpOwor
ICAgICAgICAgICAgZWxzZSBpZiAoIW1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgICAgIGZyZWV6ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fc3BpbGxXb3JrbGlz
dC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2VsZWN0U3BpbGwoKTsKKworICAgICAgICAg
ICAgaWYgKHRyYWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJBZnRlciBHcmFw
aCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGR1bXBXb3Jr
TGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAo
IW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5
KCkgfHwgIW1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpIHx8ICFtX3NwaWxsV29ya2xpc3QuaXNF
bXB0eSgpKTsKKworICAgICAgICBhc3NpZ25Db2xvcnMoKTsKKyAgICB9CisKKyNpZiBQTEFURk9S
TShDT0NPQSkKKyNwcmFnbWEgbWFyayAtIERlYnVnZ2luZyBoZWxwZXJzLgorI2VuZGlmCisKKyAg
ICB2b2lkIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFByaW50U3RyZWFtJiBvdXQpCisgICAg
eworICAgICAgICBvdXQucHJpbnQoImdyYXBoIEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKKwor
ICAgICAgICBIYXNoU2V0PFRtcD4gdG1wc1dpdGhJbnRlcmZlcmVuY2VzOworICAgICAgICBmb3Ig
KGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKSB7CisgICAgICAgICAgICB0
bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9t
QWJzb2x1dGVJbmRleChlZGdlLmZpcnN0KCkpKTsKKyAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJm
ZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4
KGVkZ2Uuc2Vjb25kKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgYXV0byYg
dG1wIDogdG1wc1dpdGhJbnRlcmZlcmVuY2VzKQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAg
IiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICIgKCIsIG1fZGVncmVl
c1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSwgIilcIl07XG4i
KTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2Vz
KQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgpLCAiIC0tICIsIGVk
Z2Uuc2Vjb25kKCksICI7XG4iKTsKKyAgICAgICAgb3V0LnByaW50KCJ9XG4iKTsKKyAgICB9CisK
KyAgICB2b2lkIGR1bXBXb3JrTGlzdHMoUHJpbnRTdHJlYW0mIG91dCkKKyAgICB7CisgICAgICAg
IG91dC5wcmludCgiU2ltcGxpZnkgd29yayBsaXN0OlxuIik7CisgICAgICAgIGZvciAodW5zaWdu
ZWQgdG1wSW5kZXggOiBtX3NpbXBsaWZ5V29ya2xpc3QpCisgICAgICAgICAgICBvdXQucHJpbnQo
IiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1w
SW5kZXgpLCAiXG4iKTsKKyAgICAgICAgb3V0LnByaW50ZigiTW92ZXMgd29yayBsaXN0IGlzIGVt
cHR5PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAgICAgIG91dC5wcmlu
dCgiRnJlZXplIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4
IDogbV9mcmVlemVXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIp
OworICAgICAgICBvdXQucHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3Ig
KHVuc2lnbmVkIHRtcEluZGV4IDogbV9zcGlsbFdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnBy
aW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4
KHRtcEluZGV4KSwgIlxuIik7CisgICAgfQorCisgICAgdXNpbmcgQWJzdHJhY3RDb2xvcmluZ0Fs
bG9jYXRvcjx1bnNpZ25lZD46OmFkZEVkZ2U7CisgICAgdXNpbmcgQWJzdHJhY3RDb2xvcmluZ0Fs
bG9jYXRvcjx1bnNpZ25lZD46OmdldEFsaWFzOworCisgICAgQ29kZSYgbV9jb2RlOworICAgIC8v
IEZJWE1FOiBzcGlsbGluZyBzaG91bGQgbm90IHR5cGUgc3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBz
aWRlIGVmZmVjdCBvZiB1c2luZyBVc2VDb3VudHMuCisgICAgY29uc3QgVXNlQ291bnRzPFRtcD4m
IG1fdXNlQ291bnRzOworICAgIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxl
VG1wczsKK307CisKK2NsYXNzIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIHsKK3B1YmxpYzoK
KyAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQorICAgICAgICA6IG1f
Y29kZShjb2RlKQorICAgICAgICAsIG1fdXNlQ291bnRzKGNvZGUpCisgICAgeworICAgIH0KKwor
ICAgIHZvaWQgcnVuKCkKKyAgICB7CisgICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
T25UeXBlPEFyZzo6R1A+KCk7CisgICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25U
eXBlPEFyZzo6RlA+KCk7CisKKyAgICAgICAgaWYgKHJlcG9ydFN0YXRzKQorICAgICAgICAgICAg
ZGF0YUxvZygiTnVtIGl0ZXJhdGlvbnMgPSAiLCBtX251bUl0ZXJhdGlvbnMsICJcbiIpOworICAg
IH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KKyAgICB2b2lkIGl0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlKCkKKyAgICB7CisgICAgICAgIEhhc2hTZXQ8
dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wczsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAg
ICAgICAgICsrbV9udW1JdGVyYXRpb25zOworICAgICAgICAgICAgQ29sb3JpbmdBbGxvY2F0b3I8
dHlwZT4gYWxsb2NhdG9yKG1fY29kZSwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Cisg
ICAgICAgICAgICBpZiAoIWFsbG9jYXRvci5yZXF1aXJlc1NwaWxsaW5nKCkpIHsKKyAgICAgICAg
ICAgICAgICBhc3NpZ25SZWdpc3RlcnNUb1RtcChhbGxvY2F0b3IpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFNwaWxsQW5kRmlsbDx0eXBl
PihhbGxvY2F0b3IsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0
ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KKyAgICB2b2lkIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGNv
bnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IpCisgICAgeworICAgICAgICBm
b3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7CisgICAgICAgICAgICAvLyBHaXZlIFRt
cCBhIHZhbGlkIHJlZ2lzdGVyLgorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnN0SW5kZXgg
PSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJbmRleCkgeworICAgICAgICAg
ICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKKyAgICAgICAgICAgICAg
ICBpbnN0LmZvckVhY2hUbXBGYXN0KFsmXSAoVG1wJiB0bXApIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKHRtcC5pc1JlZygpIHx8IHRtcC5pc0dQKCkgPT0gKHR5cGUgIT0gQXJnOjpHUCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgVG1w
IGFsaWFzVG1wID0gYWxsb2NhdG9yLmdldEFsaWFzKHRtcCk7CisgICAgICAgICAgICAgICAgICAg
IFRtcCBhc3NpZ25lZFRtcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzVG1wLmlzUmVn
KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFRtcCA9IFRtcChhbGlhc1RtcC5y
ZWcoKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAg
ICAgYXV0byByZWcgPSBhbGxvY2F0b3IuYWxsb2NhdGVkUmVnKGFsaWFzVG1wKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIEFTU0VSVChyZWcpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNz
aWduZWRUbXAgPSBUbXAocmVnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICBBU1NFUlQoYXNzaWduZWRUbXAuaXNSZWcoKSk7CisgICAgICAgICAgICAgICAgICAg
IHRtcCA9IGFzc2lnbmVkVG1wOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHRoZSB1c2VsZXNzIG1vdmVzIHdlIGNyZWF0ZWQg
aW4gdGhpcyBibG9jay4KKyAgICAgICAgICAgIGJsb2NrLT5pbnN0cygpLnJlbW92ZUFsbE1hdGNo
aW5nKFsmXSAoY29uc3QgSW5zdCYgaW5zdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhbGxv
Y2F0b3IuaXNVc2VsZXNzTW92ZShpbnN0KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9Cisg
ICAgfQorCisgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CisgICAgdm9pZCBhZGRTcGlsbEFu
ZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9jYXRvciwgSGFzaFNldDx1
bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykKKyAgICB7CisgICAgICAgIEhhc2hNYXA8VG1wLCBT
dGFja1Nsb3QqPiBzdGFja1Nsb3RzOworICAgICAgICBmb3IgKFRtcCB0bXAgOiBhbGxvY2F0b3Iu
c3BpbGxlZFRtcHMoKSkgeworICAgICAgICAgICAgLy8gQWxsIHRoZSBzcGlsbGVkIHZhbHVlcyBi
ZWNvbWUgdW5zcGlsbGFibGUuCisgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpOworCisgICAgICAgICAgICAv
LyBBbGxvY2F0ZSBzdGFjayBzbG90IGZvciBlYWNoIHNwaWxsZWQgdmFsdWUuCisgICAgICAgICAg
ICBib29sIGlzTmV3VG1wID0gc3RhY2tTbG90cy5hZGQodG1wLCBtX2NvZGUuYWRkU3RhY2tTbG90
KDgsIFN0YWNrU2xvdEtpbmQ6OkFub255bW91cykpLmlzTmV3RW50cnk7CisgICAgICAgICAgICBB
U1NFUlRfVU5VU0VEKGlzTmV3VG1wLCBpc05ld1RtcCk7CisgICAgICAgIH0KKworICAgICAgICAv
LyBSZXdyaXRlIHRoZSBwcm9ncmFtIHRvIGdldCByaWQgb2YgdGhlIHNwaWxsZWQgVG1wLgorICAg
ICAgICBJbnNlcnRpb25TZXQgaW5zZXJ0aW9uU2V0KG1fY29kZSk7CisgICAgICAgIGZvciAoQmFz
aWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAgIGJvb2wgaGFzQWxpYXNlZFRt
cHMgPSBmYWxzZTsKKworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBp
bnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJbmRleCkgeworICAgICAgICAgICAgICAg
IEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKKworICAgICAgICAgICAgICAgIC8v
IFRyeSB0byByZXBsYWNlIHRoZSByZWdpc3RlciB1c2UgYnkgbWVtb3J5IHVzZSB3aGVuIHBvc3Np
YmxlLgorICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpbnN0LmFyZ3Mu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJnJiBhcmcgPSBpbnN0LmFyZ3Nb
aV07CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuaXNUbXAoKSAmJiBhcmcudHlwZSgpID09
IHR5cGUgJiYgIWFyZy5pc1JlZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHN0
YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKGFyZy50bXAoKSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoc3RhY2tTbG90RW50cnkgIT0gc3RhY2tTbG90cy5lbmQoKSAmJiBpbnN0
LmFkbWl0c1N0YWNrKGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IEFyZzo6
c3RhY2soc3RhY2tTbG90RW50cnktPnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZvciBldmVyeSBvdGhlciBjYXNl
LCBhZGQgTG9hZC9TdG9yZSBhcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNo
VG1wKFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSkgewor
ICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlzUmVnKCkgfHwgYXJnVHlwZSAhPSB0eXBlKQor
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIGF1
dG8gc3RhY2tTbG90RW50cnkgPSBzdGFja1Nsb3RzLmZpbmQodG1wKTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIFRtcCBhbGlhcyA9IGFsbG9jYXRvci5nZXRBbGlhc1doZW5TcGlsbGlu
Zyh0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzICE9IHRtcCkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGFsaWFzOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGhhc0FsaWFzZWRUbXBzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgICAgIEFyZyBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVu
dHJ5LT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIE9wY29kZSBtb3ZlID0gdHlwZSA9PSBB
cmc6OkdQID8gTW92ZSA6IE1vdmVEb3VibGU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFy
Zzo6aXNBbnlVc2Uocm9sZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRtcCBuZXdUbXAg
PSBtX2NvZGUubmV3VG1wKHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9u
U2V0Lmluc2VydChpbnN0SW5kZXgsIG1vdmUsIGluc3Qub3JpZ2luLCBhcmcsIG5ld1RtcCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZXdUbXA7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIEFueSBuZXcgRmlsbCgpIHNob3VsZCBuZXZlciBiZSBzcGlsbGVkLgorICAgICAg
ICAgICAgICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICBpZiAoQXJnOjppc0RlZihyb2xlKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdEluZGV4ICsgMSwgbW92ZSwgaW5zdC5vcmlnaW4s
IHRtcCwgYXJnKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGluc2VydGlvblNldC5leGVjdXRlKGJsb2NrKTsKKworICAgICAgICAgICAgaWYgKGhhc0Fs
aWFzZWRUbXBzKSB7CisgICAgICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0
Y2hpbmcoWyZdIChjb25zdCBJbnN0JiBpbnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVy
biBhbGxvY2F0b3IuaXNVc2VsZXNzTW92ZShpbnN0KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIENvZGUmIG1fY29kZTsKKyAgICBV
c2VDb3VudHM8VG1wPiBtX3VzZUNvdW50czsKKyAgICB1bnNpZ25lZCBtX251bUl0ZXJhdGlvbnMg
eyAwIH07Cit9OwogCiB9IC8vIGFub255bW91cyBuYW1lc3BhY2UKIApAQCAtMTA1NSwxNCArMTE3
Niw4IEBAIHZvaWQgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYgY29kZSkKIHsKICAg
ICBQaGFzZVNjb3BlIHBoYXNlU2NvcGUoY29kZSwgIml0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
Iik7CiAKLSAgICB1bnNpZ25lZCBudW1JdGVyYXRpb25zID0gMDsKLQotICAgIFVzZUNvdW50czxU
bXA+IHVzZUNvdW50cyhjb2RlKTsKLSAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlw
ZTxBcmc6OkdQPihjb2RlLCB1c2VDb3VudHMsIG51bUl0ZXJhdGlvbnMpOwotICAgIGl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlPEFyZzo6RlA+KGNvZGUsIHVzZUNvdW50cywgbnVtSXRl
cmF0aW9ucyk7Ci0KLSAgICBpZiAocmVwb3J0U3RhdHMpCi0gICAgICAgIGRhdGFMb2coIk51bSBp
dGVyYXRpb25zID0gIiwgbnVtSXRlcmF0aW9ucywgIlxuIik7CisgICAgSXRlcmF0ZWRSZWdpc3Rl
ckNvYWxlc2NpbmcgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoY29kZSk7CisgICAgaXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcucnVuKCk7CiB9CiAKIH0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkIzOjpBaXIKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyVG1w
SW5saW5lcy5oIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBJbmxpbmVzLmgK
aW5kZXggMmYxZTA5YzVkNTBiODdlNjFkNWZjY2U1MThjNjgwZmI1ZWM4YjgxYy4uMmU0MmI5Yjk2
ZjEwOGEyMDI3NTAxYTIwMWE2OGI1MTI4NTlkZmI0NyAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJUbXBJbmxpbmVzLmgKKysrIGIvU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJUbXBJbmxpbmVzLmgKQEAgLTU3LDYgKzU3LDExIEBAIHN0cnVjdCBBYnNv
bHV0ZVRtcE1hcHBlcjxBcmc6OkdQPiB7CiAgICAgICAgIHJldHVybiBhYnNvbHV0ZUluZGV4KFRt
cDo6Z3BUbXBGb3JJbmRleCh0bXBJbmRleCkpOwogICAgIH0KIAorICAgIHN0YXRpYyB1bnNpZ25l
ZCBsYXN0TWFjaGluZVJlZ2lzdGVySW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFic29s
dXRlSW5kZXgoVG1wKE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKSkpOworICAgIH0KKwog
ICAgIHN0YXRpYyBUbXAgdG1wRnJvbUFic29sdXRlSW5kZXgodW5zaWduZWQgdG1wSW5kZXgpCiAg
ICAgewogICAgICAgICByZXR1cm4gVG1wOjp0bXBGb3JJbnRlcm5hbFZhbHVlKHRtcEluZGV4KTsK
QEAgLTc3LDYgKzgyLDExIEBAIHN0cnVjdCBBYnNvbHV0ZVRtcE1hcHBlcjxBcmc6OkZQPiB7CiAg
ICAgICAgIHJldHVybiBhYnNvbHV0ZUluZGV4KFRtcDo6ZnBUbXBGb3JJbmRleCh0bXBJbmRleCkp
OwogICAgIH0KIAorICAgIHN0YXRpYyB1bnNpZ25lZCBsYXN0TWFjaGluZVJlZ2lzdGVySW5kZXgo
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFic29sdXRlSW5kZXgoVG1wKE1hY3JvQXNzZW1ibGVy
OjpsYXN0RlBSZWdpc3RlcigpKSk7CisgICAgfQorCiAgICAgc3RhdGljIFRtcCB0bXBGcm9tQWJz
b2x1dGVJbmRleCh1bnNpZ25lZCB0bXBJbmRleCkKICAgICB7CiAgICAgICAgIHJldHVybiBUbXA6
OnRtcEZvckludGVybmFsVmFsdWUoLXRtcEluZGV4KTsK
</data>
<flag name="commit-queue"
          id="292714"
          type_id="3"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>