<?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>170111</bug_id>
          
          <creation_ts>2017-03-26 17:27:37 -0700</creation_ts>
          <short_desc>B3::fixSSA should do liveness pruning</short_desc>
          <delta_ts>2017-03-26 21:18:18 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>oliver</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1291381</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-03-26 17:27:37 -0700</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291382</commentid>
    <comment_count>1</comment_count>
      <attachid>305440</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-03-26 17:28:39 -0700</bug_when>
    <thetext>Created attachment 305440
it begins

First step: make AirLiveness available to B3.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291383</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-03-26 17:37:37 -0700</bug_when>
    <thetext>The fact that we don&apos;t do this is probably a big source of perf issues right now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291386</commentid>
    <comment_count>3</comment_count>
      <attachid>305441</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-03-26 19:18:23 -0700</bug_when>
    <thetext>Created attachment 305441
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291390</commentid>
    <comment_count>4</comment_count>
      <attachid>305443</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-03-26 19:34:40 -0700</bug_when>
    <thetext>Created attachment 305443
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291392</commentid>
    <comment_count>5</comment_count>
      <attachid>305443</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2017-03-26 20:08:23 -0700</bug_when>
    <thetext>Comment on attachment 305443
the patch

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

&gt; Source/JavaScriptCore/b3/B3VariableLiveness.h:85
&gt; +    template&lt;typename Func&gt;
&gt; +    void forEachLateDef(BasicBlock* block, unsigned valueIndex, const Func&amp; func)

Have you ever checked to make sure that the optimizer is inlining func? (when function is a constant i mean)

(this is also more out of curiosity that anything else)

&gt; Source/WTF/wtf/Liveness.h:194
&gt; +                IndexSparseSet&lt;UnsafeVectorOverflow&gt;::const_iterator m_sparceSetIterator;

Does this really need to be Unsafe.. ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291395</commentid>
    <comment_count>6</comment_count>
      <attachid>305443</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-03-26 21:02:44 -0700</bug_when>
    <thetext>Comment on attachment 305443
the patch

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

r=me. I mostly have some style comments/suggestions.

&gt; Source/JavaScriptCore/ChangeLog:13
&gt; +        This makes B3::fixSSA run twice as fast. This is a 13% progression on WasmBench compile
&gt; +        times.

Awesome!

&gt; Source/JavaScriptCore/b3/air/AirCFG.h:44
&gt; +    typedef BasicBlock* Node;
&gt; +    typedef IndexSet&lt;BasicBlock&gt; Set;
&gt; +    template&lt;typename T&gt; using Map = IndexMap&lt;BasicBlock, T&gt;;
&gt; +    typedef Vector&lt;BasicBlock*, 4&gt; List;

Style: The typedef&apos;s here can all be &quot;using&quot;s. I feel like I&apos;ve been seeing this more in JSC/WebKit, and have been using it more myself.
(Same for typedefs elsewhere in this patch.)

&gt; Source/JavaScriptCore/b3/air/AirCFG.h:61
&gt; +    Node node(unsigned index) const { return m_code[index]; }
&gt; +    unsigned numNodes() const { return m_code.size(); }

Style: Maybe call this block() and numBlocks()? (And make the interface changes in WTF).

&gt; Source/WTF/wtf/Liveness.h:36
&gt; +// HEADS UP: The algorithm here is duplicated in AirRegLiveness.h. That one uses sets rather
&gt; +// than fancy vectors, because that&apos;s better for register liveness analysis.

Style: It feels weird to have a comment like this in WTF. Maybe we should have the &quot;heads up&quot; inside AirRegLiveness?

&gt; Source/WTF/wtf/Liveness.h:54
&gt; +            typename CFG::Node block = m_cfg.node(blockIndex);

Style: You use `typename CFG::Node` many times in this file, perhaps it&apos;s worth adding something like `using Node = typename CFG::Node` at the top of this class?

&gt; Source/WTF/wtf/Liveness.h:246
&gt; +                m_block, instIndex - 1,

Don&apos;t you need to make sure instIndex is &gt; 0? (Perhaps the code gracefully handles the wrap around, but it feels more sane to make sure it&apos;s not zero.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291396</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-03-26 21:13:02 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #6)
&gt; Comment on attachment 305443 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=305443&amp;action=review
&gt; 
&gt; r=me. I mostly have some style comments/suggestions.
&gt; 
&gt; &gt; Source/JavaScriptCore/ChangeLog:13
&gt; &gt; +        This makes B3::fixSSA run twice as fast. This is a 13% progression on WasmBench compile
&gt; &gt; +        times.
&gt; 
&gt; Awesome!
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirCFG.h:44
&gt; &gt; +    typedef BasicBlock* Node;
&gt; &gt; +    typedef IndexSet&lt;BasicBlock&gt; Set;
&gt; &gt; +    template&lt;typename T&gt; using Map = IndexMap&lt;BasicBlock, T&gt;;
&gt; &gt; +    typedef Vector&lt;BasicBlock*, 4&gt; List;
&gt; 
&gt; Style: The typedef&apos;s here can all be &quot;using&quot;s. I feel like I&apos;ve been seeing
&gt; this more in JSC/WebKit, and have been using it more myself.
&gt; (Same for typedefs elsewhere in this patch.)
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirCFG.h:61
&gt; &gt; +    Node node(unsigned index) const { return m_code[index]; }
&gt; &gt; +    unsigned numNodes() const { return m_code.size(); }
&gt; 
&gt; Style: Maybe call this block() and numBlocks()? (And make the interface
&gt; changes in WTF).

This would be an enormous change since there&apos;s also a B3CFG, DFGCFG, BackwardsGraph, and lots of other things that define this same API so that they can all be used for Dominators and other graph utilities.

That&apos;s why it&apos;s &quot;nodes&quot; not &quot;blocks&quot;. Dominators takes a Graph type argument. Graphs have nodes, not blocks. Air::CFG, B3::CFG, and DFG::CFG are just three kinds of graphs, whose nodes are blocks. Hence the method names are &quot;node&quot; and &quot;numNodes&quot; and they return information about blocks.

&gt; 
&gt; &gt; Source/WTF/wtf/Liveness.h:36
&gt; &gt; +// HEADS UP: The algorithm here is duplicated in AirRegLiveness.h. That one uses sets rather
&gt; &gt; +// than fancy vectors, because that&apos;s better for register liveness analysis.
&gt; 
&gt; Style: It feels weird to have a comment like this in WTF. Maybe we should
&gt; have the &quot;heads up&quot; inside AirRegLiveness?

I bet that most people changing the liveness analysis will find Liveness.h and hack that.

&gt; 
&gt; &gt; Source/WTF/wtf/Liveness.h:54
&gt; &gt; +            typename CFG::Node block = m_cfg.node(blockIndex);
&gt; 
&gt; Style: You use `typename CFG::Node` many times in this file, perhaps it&apos;s
&gt; worth adding something like `using Node = typename CFG::Node` at the top of
&gt; this class?
&gt; 
&gt; &gt; Source/WTF/wtf/Liveness.h:246
&gt; &gt; +                m_block, instIndex - 1,
&gt; 
&gt; Don&apos;t you need to make sure instIndex is &gt; 0? (Perhaps the code gracefully
&gt; handles the wrap around, but it feels more sane to make sure it&apos;s not zero.)

The implementation of this function uses BasicBlock::get() rather than BasicBlock::at().  get() does a bounds check and returns null if the check fails.  If instIndex is 0, this produces -1, which is unsigned-greater-than the BasicBlock vector bounds.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1291397</commentid>
    <comment_count>8</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-03-26 21:18:18 -0700</bug_when>
    <thetext>Landed in r214410.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>305440</attachid>
            <date>2017-03-26 17:28:39 -0700</date>
            <delta_ts>2017-03-26 19:18:23 -0700</delta_ts>
            <desc>it begins</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>42026</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyMTQ0MDkpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTAwNyw2ICsxMDA3LDcgQEAKIAkJMEZGNDI3NjUxNTkx
QTFDRTAwNENCOUZGIC8qIERGR0Rpc2Fzc2VtYmxlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGNDI3NjIxNTkxQTFDOTAwNENCOUZGIC8qIERGR0Rp
c2Fzc2VtYmxlci5oICovOyB9OwogCQkwRkY0QjRCQzFFODg0NDk3MDBEQkJFODYgLyogQWlyUmVn
TGl2ZW5lc3MuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEZGNEI0QkExRTg4NDQ5NTAwREJCRTg2IC8qIEFpclJlZ0xpdmVuZXNzLmNwcCAqLzsgfTsK
IAkJMEZGNEI0QkQxRTg4NDQ5QTAwREJCRTg2IC8qIEFpclJlZ0xpdmVuZXNzLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY0QjRCQjFFODg0NDk1MDBE
QkJFODYgLyogQWlyUmVnTGl2ZW5lc3MuaCAqLzsgfTsKKwkJMEZGNEI0QzcxRTg4OTNDNTAwREJC
RTg2IC8qIEFpckNGRy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMEZGNEI0QzYxRTg4OTNCRjAwREJCRTg2IC8qIEFpckNGRy5oICovOyB9OwogCQkwRkY2
MEFDMjE2NzQwRjgzMDAwMjk3NzkgLyogUmVkdWNlV2hpdGVzcGFjZS5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGNjBBQzAxNjc0MEY4MTAwMDI5Nzc5
IC8qIFJlZHVjZVdoaXRlc3BhY2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQkwRkY2MEFDMzE2NzQwRjg4MDAwMjk3NzkgLyogUmVkdWNlV2hpdGVz
cGFjZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAw
RkY2MEFCRjE2NzQwRjgxMDAwMjk3NzkgLyogUmVkdWNlV2hpdGVzcGFjZS5jcHAgKi87IH07CiAJ
CTBGRjcxNjhDMTVBM0IyMzUwMDhGNURBQSAvKiBQcm9wZXJ0eU9mZnNldC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGNzE2OEExNUEzQjIzMTAwOEY1
REFBIC8qIFByb3BlcnR5T2Zmc2V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJp
dmF0ZSwgKTsgfTsgfTsKQEAgLTM1MjQsNiArMzUyNSw3IEBACiAJCTBGRjQyNzYyMTU5MUExQzkw
MDRDQjlGRiAvKiBERkdEaXNhc3NlbWJsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBu
YW1lID0gREZHRGlzYXNzZW1ibGVyLmg7IHBhdGggPSBkZmcvREZHRGlzYXNzZW1ibGVyLmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRjRCNEJBMUU4ODQ0OTUwMERCQkU4NiAvKiBB
aXJSZWdMaXZlbmVzcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBB
aXJSZWdMaXZlbmVzcy5jcHA7IHBhdGggPSBiMy9haXIvQWlyUmVnTGl2ZW5lc3MuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkY0QjRCQjFFODg0NDk1MDBEQkJFODYgLyogQWly
UmVnTGl2ZW5lc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQWlyUmVnTGl2
ZW5lc3MuaDsgcGF0aCA9IGIzL2Fpci9BaXJSZWdMaXZlbmVzcy5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwRkY0QjRDNjFFODg5M0JGMDBEQkJFODYgLyogQWlyQ0ZHLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpckNGRy5oOyBwYXRoID0gYjMvYWlyL0FpckNG
Ry5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkY2MEFCRjE2NzQwRjgxMDAwMjk3
NzkgLyogUmVkdWNlV2hpdGVzcGFjZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBSZWR1Y2VXaGl0ZXNwYWNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJMEZGNjBBQzAxNjc0MEY4MTAwMDI5Nzc5IC8qIFJlZHVjZVdoaXRlc3BhY2UuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVkdWNlV2hpdGVzcGFjZS5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkwRkY3MTY4QTE1QTNCMjMxMDA4RjVEQUEgLyogUHJvcGVydHlP
ZmZzZXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUHJvcGVydHlPZmZzZXQu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTU1MzgsNiArNTU0MCw3IEBACiAJCQkJ
MEY2MTgzMjExQzQ1QkYwNzAwNzI0NTBCIC8qIEFpckNDYWxsaW5nQ29udmVudGlvbi5oICovLAog
CQkJCTBGRUM4NTRFMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJDQ2FsbFNwZWNpYWwuY3BwICovLAog
CQkJCTBGRUM4NTRGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJDQ2FsbFNwZWNpYWwuaCAqLywKKwkJ
CQkwRkY0QjRDNjFFODg5M0JGMDBEQkJFODYgLyogQWlyQ0ZHLmggKi8sCiAJCQkJMEZFQzg1NTAx
QkRBQ0RDNzAwODBGRjc0IC8qIEFpckNvZGUuY3BwICovLAogCQkJCTBGRUM4NTUxMUJEQUNEQzcw
MDgwRkY3NCAvKiBBaXJDb2RlLmggKi8sCiAJCQkJMEY2MTgzMjIxQzQ1QkYwNzAwNzI0NTBCIC8q
IEFpckN1c3RvbS5jcHAgKi8sCkBAIC04ODQwLDYgKzg4NDMsNyBAQAogCQkJCUJDMThDNDFFMEUx
NkY1Q0QwMEIzNDQ2MCAvKiBKU0NvbnRleHRSZWYuaCBpbiBIZWFkZXJzICovLAogCQkJCUE1RUE3
MEVFMTlGNUI1QzQwMDk4RjVFQyAvKiBKU0NvbnRleHRSZWZJbnNwZWN0b3JTdXBwb3J0LmggaW4g
SGVhZGVycyAqLywKIAkJCQlBNUQyRTY2NTE5NUUxNzQwMDBBNTE4RTcgLyogSlNDb250ZXh0UmVm
SW50ZXJuYWwuaCBpbiBIZWFkZXJzICovLAorCQkJCTBGRjRCNEM3MUU4ODkzQzUwMERCQkU4NiAv
KiBBaXJDRkcuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0OENEMUQ4MTA4Q0Y5MDIwMDgxNjNDNiAv
KiBKU0NvbnRleHRSZWZQcml2YXRlLmggaW4gSGVhZGVycyAqLywKIAkJCQlBNzIwMjhCODE3OTc2
MDFFMDA5ODAyOEMgLyogSlNDVGVzdFJ1bm5lclV0aWxzLmggaW4gSGVhZGVycyAqLywKIAkJCQk3
MkFBRjdDRTFEMEQzMUIzMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5o
IGluIEhlYWRlcnMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNG
Ry5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0ZHLmgJ
KG5vbmV4aXN0ZW50KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDRkcuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKEIzX0pJVCkK
KworI2luY2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJBaXJDb2RlLmgiCisjaW5j
bHVkZSA8d3RmL0luZGV4TWFwLmg+CisjaW5jbHVkZSA8d3RmL0luZGV4U2V0Lmg+CisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgQ0ZHIHsK
KyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDRkcpOworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NB
VEVEOworcHVibGljOgorICAgIHR5cGVkZWYgQmFzaWNCbG9jayogTm9kZTsKKyAgICB0eXBlZGVm
IEluZGV4U2V0PEJhc2ljQmxvY2s+IFNldDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1c2lu
ZyBNYXAgPSBJbmRleE1hcDxCYXNpY0Jsb2NrLCBUPjsKKyAgICB0eXBlZGVmIFZlY3RvcjxCYXNp
Y0Jsb2NrKiwgND4gTGlzdDsKKworICAgIENGRyhDb2RlJiBjb2RlKQorICAgICAgICA6IG1fY29k
ZShjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICBOb2RlIHJvb3QoKSB7IHJldHVybiBtX2NvZGVb
MF07IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgTWFwPFQ+IG5ld01hcCgpIHsg
cmV0dXJuIEluZGV4TWFwPEpTQzo6QjM6OkFpcjo6QmFzaWNCbG9jaywgVD4obV9jb2RlLnNpemUo
KSk7IH0KKworICAgIFN1Y2Nlc3NvckNvbGxlY3Rpb248QmFzaWNCbG9jaywgQmFzaWNCbG9jazo6
U3VjY2Vzc29yTGlzdD4gc3VjY2Vzc29ycyhOb2RlIG5vZGUpIHsgcmV0dXJuIG5vZGUtPnN1Y2Nl
c3NvckJsb2NrcygpOyB9CisgICAgQmFzaWNCbG9jazo6UHJlZGVjZXNzb3JMaXN0JiBwcmVkZWNl
c3NvcnMoTm9kZSBub2RlKSB7IHJldHVybiBub2RlLT5wcmVkZWNlc3NvcnMoKTsgfQorCisgICAg
dW5zaWduZWQgaW5kZXgoTm9kZSBub2RlKSBjb25zdCB7IHJldHVybiBub2RlLT5pbmRleCgpOyB9
CisgICAgTm9kZSBub2RlKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBtX3Byb2NbaW5k
ZXhdOyB9CisgICAgdW5zaWduZWQgbnVtTm9kZXMoKSBjb25zdCB7IHJldHVybiBtX3Byb2Muc2l6
ZSgpOyB9CisKKyAgICBQb2ludGVyRHVtcDxCYXNpY0Jsb2NrPiBkdW1wKE5vZGUgbm9kZSkgY29u
c3QgeyByZXR1cm4gcG9pbnRlckR1bXAobm9kZSk7IH0KKworICAgIHZvaWQgZHVtcChQcmludFN0
cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgbV9wcm9jLmR1bXAob3V0KTsKKyAgICB9
CisKK3ByaXZhdGU6CisgICAgQ29kZSYgbV9jb2RlOworfTsKKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkocmV2aXNpb24gMjE0NDA5KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjksNiArMjksNyBAQAogI2lmIEVOQUJMRShCM19KSVQpCiAKICNpbmNsdWRlICJBaXJDQ2FsbFNw
ZWNpYWwuaCIKKyNpbmNsdWRlICJBaXJDRkcuaCIKICNpbmNsdWRlICJCM0Jhc2ljQmxvY2tVdGls
cy5oIgogI2luY2x1ZGUgIkIzUHJvY2VkdXJlLmgiCiAjaW5jbHVkZSAiQjNTdGFja1Nsb3QuaCIK
QEAgLTM4LDYgKzM5LDcgQEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFj
ZQogCiBDb2RlOjpDb2RlKFByb2NlZHVyZSYgcHJvYykKICAgICA6IG1fcHJvYyhwcm9jKQorICAg
ICwgbV9jZmcobmV3IENGRygqdGhpcykpCiAgICAgLCBtX2xhc3RQaGFzZU5hbWUoImluaXRpYWwi
KQogewogICAgIC8vIENvbWUgdXAgd2l0aCBpbml0aWFsIG9yZGVyaW5ncyBvZiByZWdpc3RlcnMu
IFRoZSB1c2VyIG1heSByZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgZWxzZS4KSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5oCShyZXZpc2lvbiAyMTQ0MDkpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuaAkod29ya2luZyBjb3B5KQpAQCAt
NTIsNiArNTIsNyBAQCBuYW1lc3BhY2UgQWlyIHsKIAogY2xhc3MgQmxvY2tJbnNlcnRpb25TZXQ7
CiBjbGFzcyBDQ2FsbFNwZWNpYWw7CitjbGFzcyBDRkc7CiBjbGFzcyBEaXNhc3NlbWJsZXI7CiAK
IHR5cGVkZWYgdm9pZCBXYXNtQm91bmRzQ2hlY2tHZW5lcmF0b3JGdW5jdGlvbihDQ2FsbEhlbHBl
cnMmLCBHUFJSZWcsIHVuc2lnbmVkKTsKQEAgLTE3Niw3ICsxNzcsNyBAQCBwdWJsaWM6CiAKICAg
ICAvLyBSZWNvbXB1dGVzIHByZWRlY2Vzc29ycyBhbmQgZGVsZXRlcyB1bnJlYWNoYWJsZSBibG9j
a3MuCiAgICAgdm9pZCByZXNldFJlYWNoYWJpbGl0eSgpOwotCisgICAgCiAgICAgSlNfRVhQT1JU
X1BSSVZBVEUgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CiAKICAgICB1bnNpZ25lZCBz
aXplKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3Muc2l6ZSgpOyB9CkBAIC0yNTYsNiArMjU3LDgg
QEAgcHVibGljOgogICAgIHZvaWQgYWRkRmFzdFRtcChUbXApOwogICAgIGJvb2wgaXNGYXN0VG1w
KFRtcCB0bXApIGNvbnN0IHsgcmV0dXJuIG1fZmFzdFRtcHMuY29udGFpbnModG1wKTsgfQogICAg
IAorICAgIENGRyYgY2ZnKCkgY29uc3QgeyByZXR1cm4gKm1fY2ZnOyB9CisgICAgCiAgICAgdm9p
ZCogYWRkRGF0YVNlY3Rpb24oc2l6ZV90KTsKICAgICAKICAgICAvLyBUaGUgbmFtZSBoYXMgdG8g
YmUgYSBzdHJpbmcgbGl0ZXJhbCwgc2luY2Ugd2UgZG9uJ3QgZG8gYW55IG1lbW9yeSBtYW5hZ2Vt
ZW50IGZvciB0aGUgc3RyaW5nLgpAQCAtMzA0LDYgKzMwNyw3IEBAIHByaXZhdGU6CiAgICAgU3Bh
cnNlQ29sbGVjdGlvbjxTdGFja1Nsb3Q+IG1fc3RhY2tTbG90czsKICAgICBWZWN0b3I8c3RkOjp1
bmlxdWVfcHRyPEJhc2ljQmxvY2s+PiBtX2Jsb2NrczsKICAgICBTcGFyc2VDb2xsZWN0aW9uPFNw
ZWNpYWw+IG1fc3BlY2lhbHM7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGRz4gbV9jZmc7CiAgICAg
SGFzaFNldDxUbXA+IG1fZmFzdFRtcHM7CiAgICAgQ0NhbGxTcGVjaWFsKiBtX2NDYWxsU3BlY2lh
bCB7IG51bGxwdHIgfTsKICAgICB1bnNpZ25lZCBtX251bUdQVG1wcyB7IDAgfTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTGl2ZW5lc3MuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckxpdmVuZXNzLmgJKHJldmlzaW9uIDIxNDQw
OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTGl2ZW5lc3MuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAogI2lmIEVOQUJMRShCM19KSVQpCiAKICNpbmNsdWRl
ICJBaXJCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAiQWlyQ0ZHLmgiCiAjaW5jbHVkZSAiQWlyQ29k
ZS5oIgogI2luY2x1ZGUgIkFpckluc3RJbmxpbmVzLmgiCiAjaW5jbHVkZSAiQWlyU3RhY2tTbG90
LmgiCkBAIC0zNiwxNyArMzcsOTcgQEAKICNpbmNsdWRlIDx3dGYvSW5kZXhNYXAuaD4KICNpbmNs
dWRlIDx3dGYvSW5kZXhTcGFyc2VTZXQuaD4KICNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKyNp
bmNsdWRlIDx3dGYvTGl2ZW5lc3MuaD4KIAogbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7
IG5hbWVzcGFjZSBBaXIgewogCit0ZW1wbGF0ZTx0eXBlbmFtZSBBZGFwdGVyPgorc3RydWN0IExp
dmVuZXNzQWRhcHRlciB7CisgICAgdHlwZWRlZiBBaXI6OkNGRyBDRkc7CisgICAgCisgICAgTGl2
ZW5lc3NBZGFwdGVyKENvZGUmIGNvZGUpCisgICAgICAgIDogY29kZShjb2RlKQorICAgIHsKKyAg
ICB9CisgICAgCisgICAgQWRhcHRlciYgYWRhcHRlcigpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxB
ZGFwdGVyKj4odGhpcyk7IH0KKyAgICAKKyAgICB1bnNpZ25lZCBibG9ja1NpemUoQmFzaWNCbG9j
ayogYmxvY2spCisgICAgeworICAgICAgICByZXR1cm4gYmxvY2stPnNpemUoKTsKKyAgICB9CisK
KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgorICAgIHZvaWQgZm9yRWFjaEVhcmx5VXNlQXQo
QmFzaWNCbG9jayogYmxvY2ssIHVuc2lnbmVkIGluc3RJbmRleCwgY29uc3QgRnVuYyYgZnVuYykK
KyAgICB7CisgICAgICAgIEluc3QqIGluc3QgPSBibG9jay0+Z2V0KGluc3RJbmRleCk7CisgICAg
ICAgIGlmICghaW5zdCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW5zdC0+Zm9yRWFj
aDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4oCisgICAgICAgICAgICBbJl0gKHR5cGVuYW1lIEFk
YXB0ZXI6OlRoaW5nJiB0aGluZywgQXJnOjpSb2xlIHJvbGUsIEJhbmsgYmFuaywgV2lkdGgpIHsK
KyAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0Vhcmx5VXNlKHJvbGUpCisgICAgICAgICAgICAg
ICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNCYW5rKGJhbmspCisgICAgICAgICAgICAgICAgICAg
ICYmIEFkYXB0ZXI6OmFjY2VwdHNSb2xlKHJvbGUpKQorICAgICAgICAgICAgICAgICAgICBmdW5j
KEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGluZykpOworICAgICAgICAgICAgfSk7CisgICAgfQor
ICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CisgICAgdm9pZCBmb3JFYWNoTGF0ZVVz
ZUF0KEJhc2ljQmxvY2sqIGJsb2NrLCB1bnNpZ25lZCBpbnN0SW5kZXgsIGNvbnN0IEZ1bmMmIGZ1
bmMpCisgICAgeworICAgICAgICBJbnN0KiBpbnN0ID0gYmxvY2stPmdldChpbnN0SW5kZXgpOwor
ICAgICAgICBpZiAoIWluc3QpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGluc3QtPmZv
ckVhY2g8dHlwZW5hbWUgQWRhcHRlcjo6VGhpbmc+KAorICAgICAgICAgICAgWyZdICh0eXBlbmFt
ZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9sZSByb2xlLCBCYW5rIGJhbmssIFdpZHRo
KSB7CisgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNMYXRlVXNlKHJvbGUpCisgICAgICAgICAg
ICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNCYW5rKGJhbmspCisgICAgICAgICAgICAgICAg
ICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNSb2xlKHJvbGUpKQorICAgICAgICAgICAgICAgICAgICBm
dW5jKEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGluZykpOworICAgICAgICAgICAgfSk7CisgICAg
fQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CisgICAgdm9pZCBmb3JFYWNoRWFy
bHlEZWZBdChCYXNpY0Jsb2NrKiBibG9jaywgdW5zaWduZWQgaW5zdEluZGV4LCBjb25zdCBGdW5j
JiBmdW5jKQorICAgIHsKKyAgICAgICAgSW5zdCogaW5zdCA9IGJsb2NrLT5nZXQoaW5zdEluZGV4
KTsKKyAgICAgICAgaWYgKCFpbnN0KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnN0
LT5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nPigKKyAgICAgICAgICAgIFsmXSAodHlw
ZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBX
aWR0aCkgeworICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzRWFybHlEZWYocm9sZSkKKyAgICAg
ICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKKyAgICAgICAgICAg
ICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCisgICAgICAgICAgICAgICAg
ICAgIGZ1bmMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7CisgICAgICAgICAgICB9KTsK
KyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICB2b2lkIGZvckVh
Y2hMYXRlRGVmQXQoQmFzaWNCbG9jayogYmxvY2ssIHVuc2lnbmVkIGluc3RJbmRleCwgY29uc3Qg
RnVuYyYgZnVuYykKKyAgICB7CisgICAgICAgIEluc3QqIGluc3QgPSBibG9jay0+Z2V0KGluc3RJ
bmRleCk7CisgICAgICAgIGlmICghaW5zdCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aW5zdC0+Zm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4oCisgICAgICAgICAgICBbJl0g
KHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0aGluZywgQXJnOjpSb2xlIHJvbGUsIEJhbmsgYmFu
aywgV2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0xhdGVEZWYocm9sZSkKKyAg
ICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKKyAgICAgICAg
ICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCisgICAgICAgICAgICAg
ICAgICAgIGZ1bmMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7CisgICAgICAgICAgICB9
KTsKKyAgICB9CisgICAgCisgICAgQ29kZSYgY29kZTsKK307CisKIHRlbXBsYXRlPEJhbmsgYWRh
cHRlckJhbmssIEFyZzo6VGVtcGVyYXR1cmUgbWluaW11bVRlbXBlcmF0dXJlID0gQXJnOjpDb2xk
Pgotc3RydWN0IFRtcExpdmVuZXNzQWRhcHRlciB7CitzdHJ1Y3QgVG1wTGl2ZW5lc3NBZGFwdGVy
IDogTGl2ZW5lc3NBZGFwdGVyPFRtcExpdmVuZXNzQWRhcHRlcj4gewogICAgIHN0YXRpYyBjb25z
dGV4cHIgY29uc3QgY2hhciogbmFtZSA9ICJUbXBMaXZlbmVzcyI7CiAgICAgdHlwZWRlZiBUbXAg
VGhpbmc7CiAKLSAgICBUbXBMaXZlbmVzc0FkYXB0ZXIoQ29kZSYpIHsgfQorICAgIFRtcExpdmVu
ZXNzQWRhcHRlcihDb2RlJiBjb2RlKSA6IExpdmVuZXNzQWRhcHRlcihjb2RlKSB7IH0KIAotICAg
IHN0YXRpYyB1bnNpZ25lZCBudW1JbmRpY2VzKENvZGUmIGNvZGUpCisgICAgc3RhdGljIHVuc2ln
bmVkIG51bUluZGljZXMoKQogICAgIHsKICAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IGNvZGUu
bnVtVG1wcyhhZGFwdGVyQmFuayk7CiAgICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjxh
ZGFwdGVyQmFuaz46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7CkBAIC01NywzNTIgKzEzOCwzMiBA
QCBzdHJ1Y3QgVG1wTGl2ZW5lc3NBZGFwdGVyIHsKICAgICBzdGF0aWMgVG1wIGluZGV4VG9WYWx1
ZSh1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8YWRhcHRlckJhbms+
Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpbmRleCk7IH0KIH07CiAKLXN0cnVjdCBTdGFja1Nsb3RM
aXZlbmVzc0FkYXB0ZXIgeworc3RydWN0IFN0YWNrU2xvdExpdmVuZXNzQWRhcHRlciA6IExpdmVu
ZXNzQWRhcHRlcjxTdGFja1Nsb3RMaXZlbmVzc0FkYXB0ZXI+IHsKICAgICBzdGF0aWMgY29uc3Rl
eHByIGNvbnN0IGNoYXIqIG5hbWUgPSAiU3RhY2tTbG90TGl2ZW5lc3MiOwogICAgIHR5cGVkZWYg
U3RhY2tTbG90KiBUaGluZzsKIAogICAgIFN0YWNrU2xvdExpdmVuZXNzQWRhcHRlcihDb2RlJiBj
b2RlKQotICAgICAgICA6IG1fY29kZShjb2RlKQorICAgICAgICA6IExpdmVuZXNzQWRhcHRlcihj
b2RlKQogICAgIHsKICAgICB9CiAKLSAgICBzdGF0aWMgdW5zaWduZWQgbnVtSW5kaWNlcyhDb2Rl
JiBjb2RlKQorICAgIHN0YXRpYyB1bnNpZ25lZCBudW1JbmRpY2VzKCkKICAgICB7CiAgICAgICAg
IHJldHVybiBjb2RlLnN0YWNrU2xvdHMoKS5zaXplKCk7CiAgICAgfQogICAgIHN0YXRpYyBib29s
IGFjY2VwdHNCYW5rKEJhbmspIHsgcmV0dXJuIHRydWU7IH0KICAgICBzdGF0aWMgYm9vbCBhY2Nl
cHRzUm9sZShBcmc6OlJvbGUpIHsgcmV0dXJuIHRydWU7IH0KICAgICBzdGF0aWMgdW5zaWduZWQg
dmFsdWVUb0luZGV4KFN0YWNrU2xvdCogc3RhY2tTbG90KSB7IHJldHVybiBzdGFja1Nsb3QtPmlu
ZGV4KCk7IH0KLSAgICBTdGFja1Nsb3QqIGluZGV4VG9WYWx1ZSh1bnNpZ25lZCBpbmRleCkgeyBy
ZXR1cm4gbV9jb2RlLnN0YWNrU2xvdHMoKVtpbmRleF07IH0KLQotcHJpdmF0ZToKLSAgICBDb2Rl
JiBtX2NvZGU7CisgICAgU3RhY2tTbG90KiBpbmRleFRvVmFsdWUodW5zaWduZWQgaW5kZXgpIHsg
cmV0dXJuIGNvZGUuc3RhY2tTbG90cygpW2luZGV4XTsgfQogfTsKIAotLy8gSEVBRFMgVVA6IFRo
ZSBhbGdvcml0aG0gaGVyZSBpcyBkdXBsaWNhdGVkIGluIEFpclJlZ0xpdmVuZXNzLmguCiB0ZW1w
bGF0ZTx0eXBlbmFtZSBBZGFwdGVyPgotY2xhc3MgTGl2ZW5lc3MgOiBwdWJsaWMgQWRhcHRlciB7
Ci0gICAgc3RydWN0IFdvcmtzZXQ7CitjbGFzcyBMaXZlbmVzcyA6IHB1YmxpYyBXVEY6OkxpdmVu
ZXNzPEFkYXB0ZXI+IHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEFkYXB0ZXI6OlRo
aW5nIFRoaW5nOwotICAgIHR5cGVkZWYgVmVjdG9yPHVuc2lnbmVkLCA0LCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gSW5kZXhWZWN0b3I7Ci0gICAgCiAgICAgTGl2ZW5lc3MoQ29kZSYgY29kZSkKLSAg
ICAgICAgOiBBZGFwdGVyKGNvZGUpCi0gICAgICAgICwgbV93b3Jrc2V0KEFkYXB0ZXI6Om51bUlu
ZGljZXMoY29kZSkpCi0gICAgICAgICwgbV9saXZlQXRIZWFkKGNvZGUuc2l6ZSgpKQotICAgICAg
ICAsIG1fbGl2ZUF0VGFpbChjb2RlLnNpemUoKSkKLSAgICB7Ci0gICAgICAgIFRpbWluZ1Njb3Bl
IHRpbWluZ1Njb3BlKEFkYXB0ZXI6Om5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIGxp
dmVBdFRhaWwgb2YgZWFjaCBibG9jayBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIHRoZSBMYXRlVXNl
J3Mgb2YgdGhlIHRlcm1pbmFsLgotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogY29k
ZSkgewotICAgICAgICAgICAgSW5kZXhWZWN0b3ImIGxpdmVBdFRhaWwgPSBtX2xpdmVBdFRhaWxb
YmxvY2tdOwotCi0gICAgICAgICAgICBibG9jay0+bGFzdCgpLmZvckVhY2g8dHlwZW5hbWUgQWRh
cHRlcjo6VGhpbmc+KAotICAgICAgICAgICAgICAgIFsmXSAodHlwZW5hbWUgQWRhcHRlcjo6VGhp
bmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBXaWR0aCkgewotICAgICAgICAg
ICAgICAgICAgICBpZiAoQXJnOjppc0xhdGVVc2Uocm9sZSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNCYW5rKGJhbmspCi0gICAgICAgICAgICAgICAgICAgICAg
ICAmJiBBZGFwdGVyOjphY2NlcHRzUm9sZShyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IGxpdmVBdFRhaWwuYXBwZW5kKEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGluZykpOwotICAgICAg
ICAgICAgICAgIH0pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdGQ6OnNvcnQobGl2ZUF0
VGFpbC5iZWdpbigpLCBsaXZlQXRUYWlsLmVuZCgpKTsKLSAgICAgICAgICAgIHJlbW92ZVJlcGVh
dGVkRWxlbWVudHMobGl2ZUF0VGFpbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCbG9ja3Mg
d2l0aCBuZXcgbGl2ZSB2YWx1ZXMgYXQgdGFpbC4KLSAgICAgICAgQml0VmVjdG9yIGRpcnR5Qmxv
Y2tzOwotICAgICAgICBmb3IgKHNpemVfdCBibG9ja0luZGV4ID0gY29kZS5zaXplKCk7IGJsb2Nr
SW5kZXgtLTspCi0gICAgICAgICAgICBkaXJ0eUJsb2Nrcy5zZXQoYmxvY2tJbmRleCk7Ci0gICAg
ICAgIAotICAgICAgICBJbmRleFZlY3RvciBtZXJnZUJ1ZmZlcjsKLSAgICAgICAgCi0gICAgICAg
IGJvb2wgY2hhbmdlZDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNl
OwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBibG9ja0luZGV4ID0gY29kZS5zaXplKCk7IGJs
b2NrSW5kZXgtLTspIHsKLSAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IGNvZGVb
YmxvY2tJbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKCFibG9jaykKLSAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWRpcnR5QmxvY2tzLnF1aWNr
Q2xlYXIoYmxvY2tJbmRleCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgICAgICAgICAgTG9jYWxDYWxjIGxvY2FsQ2FsYygqdGhpcywgYmxvY2spOwotICAgICAgICAg
ICAgICAgIGZvciAoc2l6ZV90IGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0t
OykKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxDYWxjLmV4ZWN1dGUoaW5zdEluZGV4KTsKLQot
ICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZWFybHkgZGVmJ3Mgb2YgdGhlIGZpcnN0IGlu
c3RydWN0aW9uLgotICAgICAgICAgICAgICAgIGJsb2NrLT5hdCgwKS5mb3JFYWNoPHR5cGVuYW1l
IEFkYXB0ZXI6OlRoaW5nPigKLSAgICAgICAgICAgICAgICAgICAgWyZdICh0eXBlbmFtZSBBZGFw
dGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9sZSByb2xlLCBCYW5rIGJhbmssIFdpZHRoKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0Vhcmx5RGVmKHJvbGUpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2NlcHRzUm9sZShyb2xlKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dvcmtzZXQucmVtb3ZlKEFkYXB0ZXI6OnZhbHVl
VG9JbmRleCh0aGluZykpOwotICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAg
ICAgIEluZGV4VmVjdG9yJiBsaXZlQXRIZWFkID0gbV9saXZlQXRIZWFkW2Jsb2NrXTsKLQotICAg
ICAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBUbXBzIHRoYXQgd2VyZSBkaXNjb3Zl
cmVkIGluIHRoaXMgaXRlcmF0aW9uLiBJdCBpcyBpbXBvc3NpYmxlCi0gICAgICAgICAgICAgICAg
Ly8gdG8gcmVtb3ZlIGEgbGl2ZSB2YWx1ZSBmcm9tIHRoZSBoZWFkLgotICAgICAgICAgICAgICAg
IC8vIFdlIHJlbW92ZSBhbGwgdGhlIHZhbHVlcyB3ZSBhbHJlYWR5IGtuZXcgYWJvdXQgc28gdGhh
dCB3ZSBvbmx5IGhhdmUgdG8gZGVhbCB3aXRoCi0gICAgICAgICAgICAgICAgLy8gd2hhdCBpcyBu
ZXcgaW4gTGl2ZUF0SGVhZC4KLSAgICAgICAgICAgICAgICBpZiAobV93b3Jrc2V0LnNpemUoKSA9
PSBsaXZlQXRIZWFkLnNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgbV93b3Jrc2V0LmNsZWFy
KCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodW5z
aWduZWQgbGl2ZUluZGV4QXRIZWFkIDogbGl2ZUF0SGVhZCkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG1fd29ya3NldC5yZW1vdmUobGl2ZUluZGV4QXRIZWFkKTsKLSAgICAgICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgICAgICBpZiAobV93b3Jrc2V0LmlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBsaXZlQXRIZWFkLnJlc2VydmVD
YXBhY2l0eShsaXZlQXRIZWFkLnNpemUoKSArIG1fd29ya3NldC5zaXplKCkpOwotICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgbmV3VmFsdWUgOiBtX3dvcmtzZXQpCi0gICAgICAgICAgICAg
ICAgICAgIGxpdmVBdEhlYWQudW5jaGVja2VkQXBwZW5kKG5ld1ZhbHVlKTsKLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICBtX3dvcmtzZXQuc29ydCgpOwotICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayogcHJlZGVjZXNzb3IgOiBibG9jay0+
cHJlZGVjZXNzb3JzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSW5kZXhWZWN0b3ImIGxpdmVB
dFRhaWwgPSBtX2xpdmVBdFRhaWxbcHJlZGVjZXNzb3JdOwotICAgICAgICAgICAgICAgICAgICAK
LSAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVBdFRhaWwuaXNFbXB0eSgpKQotICAgICAgICAg
ICAgICAgICAgICAgICAgbGl2ZUF0VGFpbCA9IG1fd29ya3NldC52YWx1ZXMoKTsKLSAgICAgICAg
ICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZUJ1ZmZlci5y
ZXNpemUoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZUJ1ZmZlci5yZXNlcnZlQ2Fw
YWNpdHkobGl2ZUF0VGFpbC5zaXplKCkgKyBtX3dvcmtzZXQuc2l6ZSgpKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1lcmdlRGVkdXBsaWNhdGVkU29ydGVkKAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGxpdmVBdFRhaWwuYmVnaW4oKSwgbGl2ZUF0VGFpbC5lbmQo
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dvcmtzZXQuYmVnaW4oKSwgbV93b3Jr
c2V0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlQnVmZmVyLmJlZ2lu
KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VCdWZmZXIucmVzaXplKGl0ZXIgLSBt
ZXJnZUJ1ZmZlci5iZWdpbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKG1lcmdlQnVmZmVyLnNpemUoKSA9PSBsaXZlQXRUYWlsLnNpemUo
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChtZXJnZUJ1ZmZl
ci5zaXplKCkgPiBsaXZlQXRUYWlsLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBs
aXZlQXRUYWlsID0gbWVyZ2VCdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGRpcnR5QmxvY2tzLnF1aWNrU2V0KHBy
ZWRlY2Vzc29yLT5pbmRleCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChjaGFu
Z2VkKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGNhbGN1bGF0b3IgaGFzIHRvIGJlIHJ1biBpbiBy
ZXZlcnNlLgotICAgIGNsYXNzIExvY2FsQ2FsYyB7Ci0gICAgcHVibGljOgotICAgICAgICBMb2Nh
bENhbGMoTGl2ZW5lc3MmIGxpdmVuZXNzLCBCYXNpY0Jsb2NrKiBibG9jaykKLSAgICAgICAgICAg
IDogbV9saXZlbmVzcyhsaXZlbmVzcykKLSAgICAgICAgICAgICwgbV9ibG9jayhibG9jaykKLSAg
ICAgICAgewotICAgICAgICAgICAgYXV0byYgd29ya3NldCA9IGxpdmVuZXNzLm1fd29ya3NldDsK
LSAgICAgICAgICAgIHdvcmtzZXQuY2xlYXIoKTsKLSAgICAgICAgICAgIEluZGV4VmVjdG9yJiBs
aXZlQXRUYWlsID0gbGl2ZW5lc3MubV9saXZlQXRUYWlsW2Jsb2NrXTsKLSAgICAgICAgICAgIGZv
ciAodW5zaWduZWQgaW5kZXggOiBsaXZlQXRUYWlsKQotICAgICAgICAgICAgICAgIHdvcmtzZXQu
YWRkKGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIEl0ZXJhYmxlIHsKLSAgICAg
ICAgcHVibGljOgotICAgICAgICAgICAgSXRlcmFibGUoTGl2ZW5lc3MmIGxpdmVuZXNzKQotICAg
ICAgICAgICAgICAgIDogbV9saXZlbmVzcyhsaXZlbmVzcykKLSAgICAgICAgICAgIHsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgY2xhc3MgaXRlcmF0b3IgewotICAgICAgICAgICAgcHVi
bGljOgotICAgICAgICAgICAgICAgIGl0ZXJhdG9yKEFkYXB0ZXImIGFkYXB0ZXIsIEluZGV4U3Bh
cnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJmbG93Pjo6Y29uc3RfaXRlcmF0b3Igc3BhcmNlU2V0SXRl
cmF0b3IpCi0gICAgICAgICAgICAgICAgICAgIDogbV9hZGFwdGVyKGFkYXB0ZXIpCi0gICAgICAg
ICAgICAgICAgICAgICwgbV9zcGFyY2VTZXRJdGVyYXRvcihzcGFyY2VTZXRJdGVyYXRvcikKLSAg
ICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaXRl
cmF0b3ImIG9wZXJhdG9yKysoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAg
ICAgKyttX3NwYXJjZVNldEl0ZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnRo
aXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHlwZW5hbWUgQWRhcHRl
cjo6VGhpbmcgb3BlcmF0b3IqKCkgY29uc3QKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiBtX2FkYXB0ZXIuaW5kZXhUb1ZhbHVlKCptX3NwYXJjZVNldEl0ZXJh
dG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSB7IHJldHVybiBtX3NwYXJjZVNldEl0ZXJhdG9yID09
IG90aGVyLm1fc3BhcmNlU2V0SXRlcmF0b3I7IH0KLSAgICAgICAgICAgICAgICBib29sIG9wZXJh
dG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSB7IHJldHVybiBtX3NwYXJjZVNldEl0ZXJhdG9y
ICE9IG90aGVyLm1fc3BhcmNlU2V0SXRlcmF0b3I7IH0KLQotICAgICAgICAgICAgcHJpdmF0ZToK
LSAgICAgICAgICAgICAgICBBZGFwdGVyJiBtX2FkYXB0ZXI7Ci0gICAgICAgICAgICAgICAgSW5k
ZXhTcGFyc2VTZXQ8VW5zYWZlVmVjdG9yT3ZlcmZsb3c+Ojpjb25zdF9pdGVyYXRvciBtX3NwYXJj
ZVNldEl0ZXJhdG9yOwotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgaXRlcmF0b3IgYmVn
aW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2xpdmVuZXNzLCBtX2xpdmVuZXNzLm1fd29y
a3NldC5iZWdpbigpKTsgfQotICAgICAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1
cm4gaXRlcmF0b3IobV9saXZlbmVzcywgbV9saXZlbmVzcy5tX3dvcmtzZXQuZW5kKCkpOyB9Ci0g
ICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgdHlwZW5hbWUgQWRh
cHRlcjo6VGhpbmcmIHRoaW5nKSBjb25zdAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAg
IHJldHVybiBtX2xpdmVuZXNzLm1fd29ya3NldC5jb250YWlucyhBZGFwdGVyOjp2YWx1ZVRvSW5k
ZXgodGhpbmcpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAg
ICAgTGl2ZW5lc3MmIG1fbGl2ZW5lc3M7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgSXRlcmFibGUg
bGl2ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZShtX2xp
dmVuZXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgaXNMaXZlKGNvbnN0IHR5cGVuYW1l
IEFkYXB0ZXI6OlRoaW5nJiB0aGluZykgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0
dXJuIGxpdmUoKS5jb250YWlucyh0aGluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGV4
ZWN1dGUodW5zaWduZWQgaW5zdEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnN0JiBp
bnN0ID0gbV9ibG9jay0+YXQoaW5zdEluZGV4KTsKLSAgICAgICAgICAgIGF1dG8mIHdvcmtzZXQg
PSBtX2xpdmVuZXNzLm1fd29ya3NldDsKLQotICAgICAgICAgICAgLy8gRmlyc3QgaGFuZGxlIHRo
ZSBlYXJseSBkZWYncyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KLSAgICAgICAgICAgIGlmIChp
bnN0SW5kZXggKyAxIDwgbV9ibG9jay0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgSW5zdCYg
bmV4dEluc3QgPSBtX2Jsb2NrLT5hdChpbnN0SW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICBu
ZXh0SW5zdC5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nPigKLSAgICAgICAgICAgICAg
ICAgICAgWyZdICh0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9sZSByb2xl
LCBCYW5rIGJhbmssIFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjpp
c0Vhcmx5RGVmKHJvbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6
YWNjZXB0c0JhbmsoYmFuaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVy
OjphY2NlcHRzUm9sZShyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2V0
LnJlbW92ZShBZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKLSAgICAgICAgICAgICAgICAg
ICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRoZW4g
aGFuZGxlIGRlZidzLgotICAgICAgICAgICAgaW5zdC5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6
OlRoaW5nPigKLSAgICAgICAgICAgICAgICBbJl0gKHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0
aGluZywgQXJnOjpSb2xlIHJvbGUsIEJhbmsgYmFuaywgV2lkdGgpIHsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKEFyZzo6aXNMYXRlRGVmKHJvbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAm
JiBBZGFwdGVyOjphY2NlcHRzQmFuayhiYW5rKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYg
QWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3Jr
c2V0LnJlbW92ZShBZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKLSAgICAgICAgICAgICAg
ICB9KTsKLQotICAgICAgICAgICAgLy8gVGhlbiBoYW5kbGUgdXNlJ3MuCi0gICAgICAgICAgICBp
bnN0LmZvckVhY2g8dHlwZW5hbWUgQWRhcHRlcjo6VGhpbmc+KAotICAgICAgICAgICAgICAgIFsm
XSAodHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBi
YW5rLCBXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0Vhcmx5VXNlKHJv
bGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2NlcHRzQmFuayhiYW5r
KQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2V0LmFkZChBZGFwdGVyOjp2YWx1ZVRvSW5k
ZXgodGhpbmcpKTsKLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgLy8gQW5kIGZp
bmFsbHksIGhhbmRsZSB0aGUgbGF0ZSB1c2UncyBvZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24u
Ci0gICAgICAgICAgICBpZiAoaW5zdEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgSW5zdCYgcHJl
dkluc3QgPSBtX2Jsb2NrLT5hdChpbnN0SW5kZXggLSAxKTsKLSAgICAgICAgICAgICAgICBwcmV2
SW5zdC5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nPigKLSAgICAgICAgICAgICAgICAg
ICAgWyZdICh0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9sZSByb2xlLCBC
YW5rIGJhbmssIFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0xh
dGVVc2Uocm9sZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2Nl
cHRzQmFuayhiYW5rKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFj
Y2VwdHNSb2xlKHJvbGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzZXQuYWRk
KEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGluZykpOwotICAgICAgICAgICAgICAgICAgICB9KTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAg
ICBMaXZlbmVzcyYgbV9saXZlbmVzczsKLSAgICAgICAgQmFzaWNCbG9jayogbV9ibG9jazsKLSAg
ICB9OwotCi0gICAgY29uc3QgSW5kZXhWZWN0b3ImIHJhd0xpdmVBdEhlYWQoQmFzaWNCbG9jayog
YmxvY2spCisgICAgICAgIDogV1RGOjpMaXZlbmVzcyhjb2RlLmNmZygpLCBjb2RlKQogICAgIHsK
LSAgICAgICAgcmV0dXJuIG1fbGl2ZUF0SGVhZFtibG9ja107CiAgICAgfQotCi0gICAgdGVtcGxh
dGU8dHlwZW5hbWUgVW5kZXJseWluZ0l0ZXJhYmxlPgotICAgIGNsYXNzIEl0ZXJhYmxlIHsKLSAg
ICBwdWJsaWM6Ci0gICAgICAgIEl0ZXJhYmxlKExpdmVuZXNzJiBsaXZlbmVzcywgY29uc3QgVW5k
ZXJseWluZ0l0ZXJhYmxlJiBpdGVyYWJsZSkKLSAgICAgICAgICAgIDogbV9saXZlbmVzcyhsaXZl
bmVzcykKLSAgICAgICAgICAgICwgbV9pdGVyYWJsZShpdGVyYWJsZSkKLSAgICAgICAgewotICAg
ICAgICB9Ci0KLSAgICAgICAgY2xhc3MgaXRlcmF0b3IgewotICAgICAgICBwdWJsaWM6Ci0gICAg
ICAgICAgICBpdGVyYXRvcigpCi0gICAgICAgICAgICAgICAgOiBtX2xpdmVuZXNzKG51bGxwdHIp
Ci0gICAgICAgICAgICAgICAgLCBtX2l0ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAg
fQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpdGVyYXRvcihMaXZlbmVzcyYgbGl2ZW5lc3Ms
IHR5cGVuYW1lIFVuZGVybHlpbmdJdGVyYWJsZTo6Y29uc3RfaXRlcmF0b3IgaXRlcikKLSAgICAg
ICAgICAgICAgICA6IG1fbGl2ZW5lc3MoJmxpdmVuZXNzKQotICAgICAgICAgICAgICAgICwgbV9p
dGVyKGl0ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHR5
cGVuYW1lIEFkYXB0ZXI6OlRoaW5nIG9wZXJhdG9yKigpCi0gICAgICAgICAgICB7Ci0gICAgICAg
ICAgICAgICAgcmV0dXJuIG1fbGl2ZW5lc3MtPmluZGV4VG9WYWx1ZSgqbV9pdGVyKTsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQotICAgICAgICAg
ICAgewotICAgICAgICAgICAgICAgICsrbV9pdGVyOwotICAgICAgICAgICAgICAgIHJldHVybiAq
dGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0
IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBB
U1NFUlQobV9saXZlbmVzcyA9PSBvdGhlci5tX2xpdmVuZXNzKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gbV9pdGVyID09IG90aGVyLm1faXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAg
ICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIExpdmVuZXNzKiBtX2xpdmVu
ZXNzOwotICAgICAgICAgICAgdHlwZW5hbWUgVW5kZXJseWluZ0l0ZXJhYmxlOjpjb25zdF9pdGVy
YXRvciBtX2l0ZXI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25z
dCB7IHJldHVybiBpdGVyYXRvcihtX2xpdmVuZXNzLCBtX2l0ZXJhYmxlLmJlZ2luKCkpOyB9Ci0g
ICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fbGl2ZW5lc3Ms
IG1faXRlcmFibGUuZW5kKCkpOyB9Ci0KLSAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCB0eXBl
bmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAg
IHJldHVybiBtX2xpdmVuZXNzLm1fd29ya3NldC5jb250YWlucyhBZGFwdGVyOjp2YWx1ZVRvSW5k
ZXgodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgTGl2ZW5lc3Mm
IG1fbGl2ZW5lc3M7Ci0gICAgICAgIGNvbnN0IFVuZGVybHlpbmdJdGVyYWJsZSYgbV9pdGVyYWJs
ZTsKLSAgICB9OwotCi0gICAgSXRlcmFibGU8SW5kZXhWZWN0b3I+IGxpdmVBdEhlYWQoQmFzaWNC
bG9jayogYmxvY2spCi0gICAgewotICAgICAgICByZXR1cm4gSXRlcmFibGU8SW5kZXhWZWN0b3I+
KCp0aGlzLCBtX2xpdmVBdEhlYWRbYmxvY2tdKTsKLSAgICB9Ci0KLSAgICBJdGVyYWJsZTxJbmRl
eFZlY3Rvcj4gbGl2ZUF0VGFpbChCYXNpY0Jsb2NrKiBibG9jaykKLSAgICB7Ci0gICAgICAgIHJl
dHVybiBJdGVyYWJsZTxJbmRleFZlY3Rvcj4oKnRoaXMsIG1fbGl2ZUF0VGFpbFtibG9ja10pOwot
ICAgIH0KLQotICAgIEluZGV4U3BhcnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJmbG93PiYgd29ya3Nl
dCgpIHsgcmV0dXJuIG1fd29ya3NldDsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBM
b2NhbENhbGM7Ci0gICAgZnJpZW5kIGNsYXNzIExvY2FsQ2FsYzo6SXRlcmFibGU7Ci0KLSAgICBJ
bmRleFNwYXJzZVNldDxVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV93b3Jrc2V0OwotICAgIEluZGV4
TWFwPEJhc2ljQmxvY2ssIEluZGV4VmVjdG9yPiBtX2xpdmVBdEhlYWQ7Ci0gICAgSW5kZXhNYXA8
QmFzaWNCbG9jaywgSW5kZXhWZWN0b3I+IG1fbGl2ZUF0VGFpbDsKIH07CiAKIHRlbXBsYXRlPEJh
bmsgYmFuaywgQXJnOjpUZW1wZXJhdHVyZSBtaW5pbXVtVGVtcGVyYXR1cmUgPSBBcmc6OkNvbGQ+
CkluZGV4OiBTb3VyY2UvV1RGL1dURi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XVEYvV1RGLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9u
IDIxNDQwOSkKKysrIFNvdXJjZS9XVEYvV1RGLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdv
cmtpbmcgY29weSkKQEAgLTgyLDYgKzgyLDcgQEAKIAkJMEZFQzg0QUYxQkQ4MjUzMTAwODBGRjc0
IC8qIEdyYXBoTm9kZVdvcmtsaXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwRkVDODRBRTFCRDgyNTMxMDA4MEZGNzQgLyogR3JhcGhOb2RlV29ya2xp
c3QuaCAqLzsgfTsKIAkJMEZFQzg0QjExQkRBQ0QzOTAwODBGRjc0IC8qIFNjb3BlZExhbWJkYS5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZFQzg0QjAx
QkRBQ0QzOTAwODBGRjc0IC8qIFNjb3BlZExhbWJkYS5oICovOyB9OwogCQkwRkVENjdCNjFCMjJE
NEQ4MDA2NkNFMTUgLyogVGlueVB0clNldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMEZFRDY3QjUxQjIyRDREODAwNjZDRTE1IC8qIFRpbnlQdHJTZXQu
aCAqLzsgfTsKKwkJMEZGNEI0QzUxRTg4OTM5QzAwREJCRTg2IC8qIExpdmVuZXNzLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY0QjRDNDFFODg5MzlD
MDBEQkJFODYgLyogTGl2ZW5lc3MuaCAqLzsgfTsKIAkJMEZGODYwOTUxQkNDQkQ3NDAwNDUxMjdG
IC8qIFBvaW50ZXJDb21wYXJpc29uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwRkY4NjA5NDFCQ0NCRDc0MDA0NTEyN0YgLyogUG9pbnRlckNvbXBhcmlz
b24uaCAqLzsgfTsKIAkJMEZGRjE5REMxQkIzMzRFQjAwODg2RDkxIC8qIFBhcmFsbGVsSGVscGVy
UG9vbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAw
RkZGMTlEQTFCQjMzNEVCMDA4ODZEOTEgLyogUGFyYWxsZWxIZWxwZXJQb29sLmNwcCAqLzsgfTsK
IAkJMEZGRjE5REQxQkIzMzRFQjAwODg2RDkxIC8qIFBhcmFsbGVsSGVscGVyUG9vbC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGRjE5REIxQkIzMzRF
QjAwODg2RDkxIC8qIFBhcmFsbGVsSGVscGVyUG9vbC5oICovOyB9OwpAQCAtNDY3LDYgKzQ2OCw3
IEBACiAJCTBGRUM4NEFFMUJEODI1MzEwMDgwRkY3NCAvKiBHcmFwaE5vZGVXb3JrbGlzdC5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBHcmFwaE5vZGVXb3JrbGlzdC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkVDODRCMDFCREFDRDM5MDA4MEZGNzQgLyogU2Nv
cGVkTGFtYmRhLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNjb3BlZExhbWJk
YS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkVENjdCNTFCMjJENEQ4MDA2NkNF
MTUgLyogVGlueVB0clNldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUaW55
UHRyU2V0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGRjRCNEM0MUU4ODkzOUMw
MERCQkU4NiAvKiBMaXZlbmVzcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBM
aXZlbmVzcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkY4NjA5NDFCQ0NCRDc0
MDA0NTEyN0YgLyogUG9pbnRlckNvbXBhcmlzb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gUG9pbnRlckNvbXBhcmlzb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJMEZGRjE5REExQkIzMzRFQjAwODg2RDkxIC8qIFBhcmFsbGVsSGVscGVyUG9vbC5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBQYXJhbGxlbEhlbHBlclBvb2wuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkZGMTlEQjFCQjMzNEVCMDA4ODZEOTEg
LyogUGFyYWxsZWxIZWxwZXJQb29sLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFBhcmFsbGVsSGVscGVyUG9vbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTAy
Nyw2ICsxMDI5LDcgQEAKIAkJCQk1MzlFQjA2MjFENTUyODQyMDBDODJFRjcgLyogTEVCRGVjb2Rl
ci5oICovLAogCQkJCUE3MERBMDgzMTc5OUYwNEQwMDUyOUE5QiAvKiBMaXN0RHVtcC5oICovLAog
CQkJCUE4QTQ3MkMxMTUxQTgyNUEwMDQxMjNGRiAvKiBMaXN0SGFzaFNldC5oICovLAorCQkJCTBG
RjRCNEM0MUU4ODkzOUMwMERCQkU4NiAvKiBMaXZlbmVzcy5oICovLAogCQkJCTBGRTE2NDY4MUI2
RkZDOTYwMDQwMEU3QyAvKiBMb2NrLmNwcCAqLywKIAkJCQkwRkUxNjQ2OTFCNkZGQzk2MDA0MDBF
N0MgLyogTG9jay5oICovLAogCQkJCTBGMEZDREREMUREMTY3RjkwMENDQUI1MyAvKiBMb2NrQWxn
b3JpdGhtLmggKi8sCkBAIC0xMzkwLDYgKzEzOTMsNyBAQAogCQkJCTlCRDhGNDBCMTc2QzJCNDcw
MDAyRDg2NSAvKiBBdG9taWNTdHJpbmdUYWJsZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTQ2OTQx
OUMxNkVBQjEwQTAwMjRFMTQ2IC8qIEF1dG9kcmFpbmVkUG9vbC5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJMEY0M0Q4RjIxREI1QUREQzAwMTA4RkI2IC8qIEF1dG9tYXRpY1RocmVhZC5oIGluIEhlYWRl
cnMgKi8sCisJCQkJMEZGNEI0QzUxRTg4OTM5QzAwREJCRTg2IC8qIExpdmVuZXNzLmggaW4gSGVh
ZGVycyAqLywKIAkJCQlEQ0VFMjIwNTFDRUI5ODY5MDAwQzIzOTYgLyogQmFja3dhcmRzR3JhcGgu
aCBpbiBIZWFkZXJzICovLAogCQkJCTBGQjE0RTE5MTgwRkEyMTgwMDlCNkI0RCAvKiBCYWcuaCBp
biBIZWFkZXJzICovLAogCQkJCTBGQjE0RTFCMTgxMEUxREMwMDlCNkI0RCAvKiBCYWdUb0hhc2hN
YXAuaCBpbiBIZWFkZXJzICovLApJbmRleDogU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDIx
NDQwOSkKKysrIFNvdXJjZS9XVEYvd3RmL0NNYWtlTGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBA
IC01Nyw2ICs1Nyw3IEBAIHNldChXVEZfSEVBREVSUwogICAgIEl0ZXJhdG9yQWRhcHRvcnMuaAog
ICAgIEl0ZXJhdG9yUmFuZ2UuaAogICAgIExpc3RIYXNoU2V0LmgKKyAgICBMaXZlbmVzcy5oCiAg
ICAgTG9jay5oCiAgICAgTG9ja0FsZ29yaXRobS5oCiAgICAgTG9ja2VkUHJpbnRTdHJlYW0uaApJ
bmRleDogU291cmNlL1dURi93dGYvTGl2ZW5lc3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RG
L3d0Zi9MaXZlbmVzcy5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XVEYvd3RmL0xpdmVuZXNz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8
d3RmL0JpdFZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9JbmRleFNwYXJzZVNldC5oPgorI2luY2x1
ZGUgPHd0Zi9MaXN0RHVtcC5oPgorCituYW1lc3BhY2UgV1RGIHsKKworLy8gSEVBRFMgVVA6IFRo
ZSBhbGdvcml0aG0gaGVyZSBpcyBkdXBsaWNhdGVkIGluIEFpclJlZ0xpdmVuZXNzLmguIFRoYXQg
b25lIHVzZXMgc2V0cyByYXRoZXIKKy8vIHRoYW4gZmFuY3kgdmVjdG9ycywgYmVjYXVzZSB0aGF0
J3MgYmV0dGVyIGZvciByZWdpc3RlciBsaXZlbmVzcyBhbmFseXNpcy4KK3RlbXBsYXRlPHR5cGVu
YW1lIEFkYXB0ZXI+CitjbGFzcyBMaXZlbmVzcyA6IHB1YmxpYyBBZGFwdGVyIHsKK3B1YmxpYzoK
KyAgICB0eXBlZGVmIHR5cGVuYW1lIEFkYXB0ZXI6OkNGRyBDRkc7CisgICAgdHlwZWRlZiB0eXBl
bmFtZSBBZGFwdGVyOjpUaGluZyBUaGluZzsKKyAgICB0eXBlZGVmIFZlY3Rvcjx1bnNpZ25lZCwg
NCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IEluZGV4VmVjdG9yOworICAgIAorICAgIHRlbXBsYXRl
PHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAgICBMaXZlbmVzcyhDRkcmIGNmZywgQXJndW1lbnRz
JiYuLi4gYXJndW1lbnRzKQorICAgICAgICA6IEFkYXB0ZXIoc3RkOjpmb3J3YXJkPEFyZ3VtZW50
cz4oYXJndW1lbnRzKS4uLikKKyAgICAgICAgLCBtX2NmZyhjZmcpCisgICAgICAgICwgbV93b3Jr
c2V0KEFkYXB0ZXI6Om51bUluZGljZXMoKSkKKyAgICAgICAgLCBtX2xpdmVBdEhlYWQoY2ZnLnRl
bXBsYXRlIG5ld01hcCgpKQorICAgICAgICAsIG1fbGl2ZUF0VGFpbChjZmcudGVtcGxhdGUgbmV3
TWFwKCkpCisgICAgeworICAgICAgICAvLyBUaGUgbGl2ZUF0VGFpbCBvZiBlYWNoIGJsb2NrIGF1
dG9tYXRpY2FsbHkgY29udGFpbnMgdGhlIExhdGVVc2UncyBvZiB0aGUgdGVybWluYWwuCisgICAg
ICAgIGZvciAodW5zaWduZWQgYmxvY2tJbmRleCA9IG1fY2ZnLm51bU5vZGVzKCk7IGJsb2NrSW5k
ZXgtLTspIHsKKyAgICAgICAgICAgIHR5cGVuYW1lIENGRzo6Tm9kZSBibG9jayA9IG1fY2ZnLm5v
ZGUoYmxvY2tJbmRleCk7CisgICAgICAgICAgICBpZiAoIWJsb2NrKQorICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICBBZGFwdGVyOjpmb3JFYWNoTGF0
ZVVzZUF0KAorICAgICAgICAgICAgICAgIGJsb2NrLCBBZGFwdGVyOjpibG9ja1NpemUoYmxvY2sp
IC0gMSwKKyAgICAgICAgICAgICAgICBbJl0gKHVuc2lnbmVkIGluZGV4KSB7CisgICAgICAgICAg
ICAgICAgICAgIGxpdmVBdFRhaWwuYXBwZW5kKGluZGV4KTsKKyAgICAgICAgICAgICAgICB9KTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgc3RkOjpzb3J0KGxpdmVBdFRhaWwuYmVnaW4oKSwg
bGl2ZUF0VGFpbC5lbmQoKSk7CisgICAgICAgICAgICByZW1vdmVSZXBlYXRlZEVsZW1lbnRzKGxp
dmVBdFRhaWwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmxvY2tzIHdpdGggbmV3IGxpdmUg
dmFsdWVzIGF0IHRhaWwuCisgICAgICAgIEJpdFZlY3RvciBkaXJ0eUJsb2NrczsKKyAgICAgICAg
Zm9yIChzaXplX3QgYmxvY2tJbmRleCA9IGNvZGUuc2l6ZSgpOyBibG9ja0luZGV4LS07KQorICAg
ICAgICAgICAgZGlydHlCbG9ja3Muc2V0KGJsb2NrSW5kZXgpOworICAgICAgICAKKyAgICAgICAg
SW5kZXhWZWN0b3IgbWVyZ2VCdWZmZXI7CisgICAgICAgIAorICAgICAgICBib29sIGNoYW5nZWQ7
CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICAg
ICAgZm9yIChzaXplX3QgYmxvY2tJbmRleCA9IG1fY2ZnLm51bU5vZGVzKCk7IGJsb2NrSW5kZXgt
LTspIHsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBDRkc6Ok5vZGUgYmxvY2sgPSBtX2NmZy5u
b2RlKGJsb2NrSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICghYmxvY2spCisgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKCFkaXJ0eUJsb2Nrcy5x
dWlja0NsZWFyKGJsb2NrSW5kZXgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgICAgIExvY2FsQ2FsYyBsb2NhbENhbGMoKnRoaXMsIGJsb2NrKTsKKyAgICAg
ICAgICAgICAgICBmb3IgKHNpemVfdCBpbnN0SW5kZXggPSBBZGFwdGVyOjpibG9ja1NpemUoYmxv
Y2spOyBpbnN0SW5kZXgtLTspCisgICAgICAgICAgICAgICAgICAgIGxvY2FsQ2FsYy5leGVjdXRl
KGluc3RJbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGVhcmx5IGRlZidz
IG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgICAgICBBZGFwdGVyOjpmb3JF
YWNoRWFybHlEZWYoCisgICAgICAgICAgICAgICAgICAgIGJsb2NrLCAwLAorICAgICAgICAgICAg
ICAgICAgICBbJl0gKHVuc2lnbmVkIGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBt
X3dvcmtzZXQucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAg
ICAgICAgICAgICBJbmRleFZlY3RvciYgbGl2ZUF0SGVhZCA9IG1fbGl2ZUF0SGVhZFtibG9ja107
CisKKyAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgVG1wcyB0aGF0IHdlcmUg
ZGlzY292ZXJlZCBpbiB0aGlzIGl0ZXJhdGlvbi4gSXQgaXMgaW1wb3NzaWJsZQorICAgICAgICAg
ICAgICAgIC8vIHRvIHJlbW92ZSBhIGxpdmUgdmFsdWUgZnJvbSB0aGUgaGVhZC4KKyAgICAgICAg
ICAgICAgICAvLyBXZSByZW1vdmUgYWxsIHRoZSB2YWx1ZXMgd2UgYWxyZWFkeSBrbmV3IGFib3V0
IHNvIHRoYXQgd2Ugb25seSBoYXZlIHRvIGRlYWwgd2l0aAorICAgICAgICAgICAgICAgIC8vIHdo
YXQgaXMgbmV3IGluIExpdmVBdEhlYWQuCisgICAgICAgICAgICAgICAgaWYgKG1fd29ya3NldC5z
aXplKCkgPT0gbGl2ZUF0SGVhZC5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIG1fd29ya3Nl
dC5jbGVhcigpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGxpdmVJbmRleEF0SGVhZCA6IGxpdmVBdEhlYWQpCisgICAgICAgICAgICAg
ICAgICAgICAgICBtX3dvcmtzZXQucmVtb3ZlKGxpdmVJbmRleEF0SGVhZCk7CisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fd29ya3NldC5pc0VtcHR5KCkpCisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgbGl2ZUF0SGVhZC5y
ZXNlcnZlQ2FwYWNpdHkobGl2ZUF0SGVhZC5zaXplKCkgKyBtX3dvcmtzZXQuc2l6ZSgpKTsKKyAg
ICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIG5ld1ZhbHVlIDogbV93b3Jrc2V0KQorICAgICAg
ICAgICAgICAgICAgICBsaXZlQXRIZWFkLnVuY2hlY2tlZEFwcGVuZChuZXdWYWx1ZSk7CisgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbV93b3Jrc2V0LnNvcnQoKTsKKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKHR5cGVuYW1lIENGRzo6Tm9kZSBwcmVkZWNl
c3NvciA6IG1fY2ZnLnByZWRlY2Vzc29ycyhibG9jaykpIHsKKyAgICAgICAgICAgICAgICAgICAg
SW5kZXhWZWN0b3ImIGxpdmVBdFRhaWwgPSBtX2xpdmVBdFRhaWxbcHJlZGVjZXNzb3JdOworICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVBdFRhaWwuaXNF
bXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUF0VGFpbCA9IG1fd29ya3NldC52
YWx1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBtZXJnZUJ1ZmZlci5yZXNpemUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXJn
ZUJ1ZmZlci5yZXNlcnZlQ2FwYWNpdHkobGl2ZUF0VGFpbC5zaXplKCkgKyBtX3dvcmtzZXQuc2l6
ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1lcmdlRGVkdXBsaWNh
dGVkU29ydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVBdFRhaWwuYmVnaW4o
KSwgbGl2ZUF0VGFpbC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dvcmtz
ZXQuYmVnaW4oKSwgbV93b3Jrc2V0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1lcmdlQnVmZmVyLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VCdWZm
ZXIucmVzaXplKGl0ZXIgLSBtZXJnZUJ1ZmZlci5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlQnVmZmVyLnNpemUoKSA9
PSBsaXZlQXRUYWlsLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNF
X0FTU0VSVChtZXJnZUJ1ZmZlci5zaXplKCkgPiBsaXZlQXRUYWlsLnNpemUoKSk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBsaXZlQXRUYWlsID0gbWVyZ2VCdWZmZXI7CisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRpcnR5
QmxvY2tzLnF1aWNrU2V0KHByZWRlY2Vzc29yLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICAg
ICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9IHdoaWxlIChjaGFuZ2VkKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGNhbGN1bGF0b3Ig
aGFzIHRvIGJlIHJ1biBpbiByZXZlcnNlLgorICAgIGNsYXNzIExvY2FsQ2FsYyB7CisgICAgcHVi
bGljOgorICAgICAgICBMb2NhbENhbGMoTGl2ZW5lc3MmIGxpdmVuZXNzLCB0eXBlbmFtZSBDRkc6
Ok5vZGUgYmxvY2spCisgICAgICAgICAgICA6IG1fbGl2ZW5lc3MobGl2ZW5lc3MpCisgICAgICAg
ICAgICAsIG1fYmxvY2soYmxvY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8mIHdvcmtz
ZXQgPSBsaXZlbmVzcy5tX3dvcmtzZXQ7CisgICAgICAgICAgICB3b3Jrc2V0LmNsZWFyKCk7Cisg
ICAgICAgICAgICBJbmRleFZlY3RvciYgbGl2ZUF0VGFpbCA9IGxpdmVuZXNzLm1fbGl2ZUF0VGFp
bFtibG9ja107CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluZGV4IDogbGl2ZUF0VGFpbCkK
KyAgICAgICAgICAgICAgICB3b3Jrc2V0LmFkZChpbmRleCk7CisgICAgICAgIH0KKworICAgICAg
ICBjbGFzcyBJdGVyYWJsZSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEl0ZXJhYmxl
KExpdmVuZXNzJiBsaXZlbmVzcykKKyAgICAgICAgICAgICAgICA6IG1fbGl2ZW5lc3MobGl2ZW5l
c3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYXNzIGl0
ZXJhdG9yIHsKKyAgICAgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBpdGVyYXRvcihB
ZGFwdGVyJiBhZGFwdGVyLCBJbmRleFNwYXJzZVNldDxVbnNhZmVWZWN0b3JPdmVyZmxvdz46OmNv
bnN0X2l0ZXJhdG9yIHNwYXJjZVNldEl0ZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICA6IG1f
YWRhcHRlcihhZGFwdGVyKQorICAgICAgICAgICAgICAgICAgICAsIG1fc3BhcmNlU2V0SXRlcmF0
b3Ioc3BhcmNlU2V0SXRlcmF0b3IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrbV9zcGFyY2VTZXRJdGVyYXRvcjsKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nIG9wZXJhdG9yKigpIGNvbnN0CisgICAg
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9hZGFwdGVyLmluZGV4
VG9WYWx1ZSgqbV9zcGFyY2VTZXRJdGVyYXRvcik7CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgeyByZXR1
cm4gbV9zcGFyY2VTZXRJdGVyYXRvciA9PSBvdGhlci5tX3NwYXJjZVNldEl0ZXJhdG9yOyB9Cisg
ICAgICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgeyBy
ZXR1cm4gbV9zcGFyY2VTZXRJdGVyYXRvciAhPSBvdGhlci5tX3NwYXJjZVNldEl0ZXJhdG9yOyB9
CisKKyAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgQWRhcHRlciYgbV9hZGFw
dGVyOworICAgICAgICAgICAgICAgIEluZGV4U3BhcnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJmbG93
Pjo6Y29uc3RfaXRlcmF0b3IgbV9zcGFyY2VTZXRJdGVyYXRvcjsKKyAgICAgICAgICAgIH07CisK
KyAgICAgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9s
aXZlbmVzcywgbV9saXZlbmVzcy5tX3dvcmtzZXQuYmVnaW4oKSk7IH0KKyAgICAgICAgICAgIGl0
ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fbGl2ZW5lc3MsIG1fbGl2ZW5l
c3MubV93b3Jrc2V0LmVuZCgpKTsgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBib29sIGNv
bnRhaW5zKGNvbnN0IHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0aGluZykgY29uc3QKKyAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9saXZlbmVzcy5tX3dvcmtzZXQuY29u
dGFpbnMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIExpdmVuZXNzJiBtX2xpdmVuZXNzOworICAgICAg
ICB9OworCisgICAgICAgIEl0ZXJhYmxlIGxpdmUoKSBjb25zdAorICAgICAgICB7CisgICAgICAg
ICAgICByZXR1cm4gSXRlcmFibGUobV9saXZlbmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBi
b29sIGlzTGl2ZShjb25zdCB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcpIGNvbnN0Cisg
ICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsaXZlKCkuY29udGFpbnModGhpbmcpOworICAg
ICAgICB9CisKKyAgICAgICAgdm9pZCBleGVjdXRlKHVuc2lnbmVkIGluc3RJbmRleCkKKyAgICAg
ICAgeworICAgICAgICAgICAgSW5zdCYgaW5zdCA9IG1fYmxvY2stPmF0KGluc3RJbmRleCk7Cisg
ICAgICAgICAgICBhdXRvJiB3b3Jrc2V0ID0gbV9saXZlbmVzcy5tX3dvcmtzZXQ7CisKKyAgICAg
ICAgICAgIC8vIEZpcnN0IGhhbmRsZSB0aGUgZWFybHkgZGVmJ3Mgb2YgdGhlIG5leHQgaW5zdHJ1
Y3Rpb24uCisgICAgICAgICAgICBBZGFwdGVyOjpmb3JFYWNoRWFybHlEZWYoCisgICAgICAgICAg
ICAgICAgYmxvY2ssIGluc3RJbmRleCArIDEsCisgICAgICAgICAgICAgICAgWyZdICh1bnNpZ25l
ZCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICB3b3Jrc2V0LnJlbW92ZShpbmRleCk7Cisg
ICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoZW4gaGFu
ZGxlIGRlZidzLgorICAgICAgICAgICAgQWRhcHRlcjo6Zm9yRWFjaExhdGVEZWYoCisgICAgICAg
ICAgICAgICAgYmxvY2ssIGluc3RJbmRleCwKKyAgICAgICAgICAgICAgICBbJl0gKHVuc2lnbmVk
IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmtzZXQucmVtb3ZlKGluZGV4KTsKKyAg
ICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gVGhlbiBoYW5kbGUgdXNlJ3MuCisg
ICAgICAgICAgICBBZGFwdGVyOjpmb3JFYWNoRWFybHlVc2UoCisgICAgICAgICAgICAgICAgYmxv
Y2ssIGluc3RJbmRleCwKKyAgICAgICAgICAgICAgICBbJl0gKHVuc2lnbmVkIGluZGV4KSB7Cisg
ICAgICAgICAgICAgICAgICAgIHdvcmtzZXQuYWRkKGluZGV4KTsKKyAgICAgICAgICAgICAgICB9
KTsKKworICAgICAgICAgICAgLy8gQW5kIGZpbmFsbHksIGhhbmRsZSB0aGUgbGF0ZSB1c2UncyBv
ZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgICBBZGFwdGVyOjpmb3JFYWNo
TGF0ZVVzZSgKKyAgICAgICAgICAgICAgICBibG9jaywgaW5zdEluZGV4IC0gMSwKKyAgICAgICAg
ICAgICAgICBbJl0gKHVuc2lnbmVkIGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmtz
ZXQuYWRkKGluZGV4KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICBwcml2YXRlOgorICAgICAgICBMaXZlbmVzcyYgbV9saXZlbmVzczsKKyAgICAgICAgQmFz
aWNCbG9jayogbV9ibG9jazsKKyAgICB9OworCisgICAgY29uc3QgSW5kZXhWZWN0b3ImIHJhd0xp
dmVBdEhlYWQoQmFzaWNCbG9jayogYmxvY2spCisgICAgeworICAgICAgICByZXR1cm4gbV9saXZl
QXRIZWFkW2Jsb2NrXTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVbmRlcmx5aW5n
SXRlcmFibGU+CisgICAgY2xhc3MgSXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgSXRl
cmFibGUoTGl2ZW5lc3MmIGxpdmVuZXNzLCBjb25zdCBVbmRlcmx5aW5nSXRlcmFibGUmIGl0ZXJh
YmxlKQorICAgICAgICAgICAgOiBtX2xpdmVuZXNzKGxpdmVuZXNzKQorICAgICAgICAgICAgLCBt
X2l0ZXJhYmxlKGl0ZXJhYmxlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBjbGFz
cyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGl0ZXJhdG9yKCkKKyAg
ICAgICAgICAgICAgICA6IG1fbGl2ZW5lc3MobnVsbHB0cikKKyAgICAgICAgICAgICAgICAsIG1f
aXRlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGl0ZXJhdG9yKExpdmVuZXNzJiBsaXZlbmVzcywgdHlwZW5hbWUgVW5kZXJseWluZ0l0
ZXJhYmxlOjpjb25zdF9pdGVyYXRvciBpdGVyKQorICAgICAgICAgICAgICAgIDogbV9saXZlbmVz
cygmbGl2ZW5lc3MpCisgICAgICAgICAgICAgICAgLCBtX2l0ZXIoaXRlcikKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcg
b3BlcmF0b3IqKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9saXZl
bmVzcy0+aW5kZXhUb1ZhbHVlKCptX2l0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
KyttX2l0ZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25z
dAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTU0VSVChtX2xpdmVuZXNzID09IG90
aGVyLm1fbGl2ZW5lc3MpOworICAgICAgICAgICAgICAgIHJldHVybiBtX2l0ZXIgPT0gb3RoZXIu
bV9pdGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29u
c3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2
YXRlOgorICAgICAgICAgICAgTGl2ZW5lc3MqIG1fbGl2ZW5lc3M7CisgICAgICAgICAgICB0eXBl
bmFtZSBVbmRlcmx5aW5nSXRlcmFibGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICAgICAg
fTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1f
bGl2ZW5lc3MsIG1faXRlcmFibGUuYmVnaW4oKSk7IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkg
Y29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9saXZlbmVzcywgbV9pdGVyYWJsZS5lbmQoKSk7IH0K
KworICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0
aGluZykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fbGl2ZW5lc3MubV93
b3Jrc2V0LmNvbnRhaW5zKEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGluZykpOworICAgICAgICB9
CisKKyAgICBwcml2YXRlOgorICAgICAgICBMaXZlbmVzcyYgbV9saXZlbmVzczsKKyAgICAgICAg
Y29uc3QgVW5kZXJseWluZ0l0ZXJhYmxlJiBtX2l0ZXJhYmxlOworICAgIH07CisKKyAgICBJdGVy
YWJsZTxJbmRleFZlY3Rvcj4gbGl2ZUF0SGVhZChCYXNpY0Jsb2NrKiBibG9jaykKKyAgICB7Cisg
ICAgICAgIHJldHVybiBJdGVyYWJsZTxJbmRleFZlY3Rvcj4oKnRoaXMsIG1fbGl2ZUF0SGVhZFti
bG9ja10pOworICAgIH0KKworICAgIEl0ZXJhYmxlPEluZGV4VmVjdG9yPiBsaXZlQXRUYWlsKEJh
c2ljQmxvY2sqIGJsb2NrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhYmxlPEluZGV4VmVj
dG9yPigqdGhpcywgbV9saXZlQXRUYWlsW2Jsb2NrXSk7CisgICAgfQorCisgICAgSW5kZXhTcGFy
c2VTZXQ8VW5zYWZlVmVjdG9yT3ZlcmZsb3c+JiB3b3Jrc2V0KCkgeyByZXR1cm4gbV93b3Jrc2V0
OyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIExvY2FsQ2FsYzsKKyAgICBmcmllbmQg
Y2xhc3MgTG9jYWxDYWxjOjpJdGVyYWJsZTsKKworICAgIENGRyYgbV9jZmc7CisgICAgSW5kZXhT
cGFyc2VTZXQ8VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fd29ya3NldDsKKyAgICB0eXBlbmFtZSBD
Rkc6OnRlbXBsYXRlIE1hcDxJbmRleFZlY3Rvcj4gbV9saXZlQXRIZWFkOworICAgIHR5cGVuYW1l
IENGRzo6dGVtcGxhdGUgTWFwPEluZGV4VmVjdG9yPiBtX2xpdmVBdFRhaWw7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXVEYKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>305441</attachid>
            <date>2017-03-26 19:18:23 -0700</date>
            <delta_ts>2017-03-26 19:34:40 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>61747</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjE0NDA5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDg5IEBA
CisyMDE3LTAzLTI2ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
QjM6OmZpeFNTQSBzaG91bGQgZG8gbGl2ZW5lc3MgcHJ1bmluZworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcwMTExCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIG1vdmVzIGFsbCBvZiB0
aGUgbG9naWMgb2YgQWlyOjpMaXZlbmVzczw+IHRvIFdURjo6TGl2ZW5lc3M8PiBhbmQgdGhlbiB1
c2VzIHRoYXQgdG8KKyAgICAgICAgY3JlYXRlIEIzOjpWYXJpYWJsZUxpdmVuZXNzLiBUaGVuIHRo
aXMgdXNlcyBWYXJpYWJsZUxpdmVuZXNzOjpMaXZlQXRIZWFkIHRvIHBydW5lIFBoaQorICAgICAg
ICBjb25zdHJ1Y3Rpb24uCisgICAgICAgIAorICAgICAgICBUaGlzIG1ha2VzIEIzOjpmaXhTU0Eg
cnVuIHR3aWNlIGFzIGZhc3QuIFRoaXMgaXMgYSAxMyUgcHJvZ3Jlc3Npb24gb24gV2FzbUJlbmNo
IGNvbXBpbGUKKyAgICAgICAgdGltZXMuCisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGIzL0IzQmFzaWNCbG9jay5oOgorICAg
ICAgICAoSlNDOjpCMzo6QmFzaWNCbG9jazo6Z2V0KToKKyAgICAgICAgKiBiMy9CM0ZpeFNTQS5j
cHA6CisgICAgICAgIChKU0M6OkIzOjpmaXhTU0EpOgorICAgICAgICAqIGIzL0IzVmFyaWFibGVM
aXZlbmVzcy5jcHA6IEFkZGVkLgorICAgICAgICAoSlNDOjpCMzo6VmFyaWFibGVMaXZlbmVzczo6
VmFyaWFibGVMaXZlbmVzcyk6CisgICAgICAgIChKU0M6OkIzOjpWYXJpYWJsZUxpdmVuZXNzOjp+
VmFyaWFibGVMaXZlbmVzcyk6CisgICAgICAgICogYjMvQjNWYXJpYWJsZUxpdmVuZXNzLmg6IEFk
ZGVkLgorICAgICAgICAoSlNDOjpCMzo6VmFyaWFibGVMaXZlbmVzc0FkYXB0ZXI6OlZhcmlhYmxl
TGl2ZW5lc3NBZGFwdGVyKToKKyAgICAgICAgKEpTQzo6QjM6OlZhcmlhYmxlTGl2ZW5lc3NBZGFw
dGVyOjpudW1JbmRpY2VzKToKKyAgICAgICAgKEpTQzo6QjM6OlZhcmlhYmxlTGl2ZW5lc3NBZGFw
dGVyOjp2YWx1ZVRvSW5kZXgpOgorICAgICAgICAoSlNDOjpCMzo6VmFyaWFibGVMaXZlbmVzc0Fk
YXB0ZXI6OmluZGV4VG9WYWx1ZSk6CisgICAgICAgIChKU0M6OkIzOjpWYXJpYWJsZUxpdmVuZXNz
QWRhcHRlcjo6YmxvY2tTaXplKToKKyAgICAgICAgKEpTQzo6QjM6OlZhcmlhYmxlTGl2ZW5lc3NB
ZGFwdGVyOjpmb3JFYWNoRWFybHlVc2UpOgorICAgICAgICAoSlNDOjpCMzo6VmFyaWFibGVMaXZl
bmVzc0FkYXB0ZXI6OmZvckVhY2hMYXRlVXNlKToKKyAgICAgICAgKEpTQzo6QjM6OlZhcmlhYmxl
TGl2ZW5lc3NBZGFwdGVyOjpmb3JFYWNoRWFybHlEZWYpOgorICAgICAgICAoSlNDOjpCMzo6VmFy
aWFibGVMaXZlbmVzc0FkYXB0ZXI6OmZvckVhY2hMYXRlRGVmKToKKyAgICAgICAgKiBiMy9haXIv
QWlyQ0ZHLmg6IEFkZGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDRkc6OkNGRyk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkNGRzo6cm9vdCk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNG
Rzo6bmV3TWFwKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q0ZHOjpzdWNjZXNzb3JzKToKKyAg
ICAgICAgKEpTQzo6QjM6OkFpcjo6Q0ZHOjpwcmVkZWNlc3NvcnMpOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpDRkc6OmluZGV4KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q0ZHOjpub2RlKToK
KyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q0ZHOjpudW1Ob2Rlcyk6CisgICAgICAgIChKU0M6OkIz
OjpBaXI6OkNGRzo6ZHVtcCk6CisgICAgICAgICogYjMvYWlyL0FpckNvZGUuY3BwOgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpDb2RlOjpDb2RlKToKKyAgICAgICAgKiBiMy9haXIvQWlyQ29kZS5o
OgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjpjZmcpOgorICAgICAgICAqIGIzL2Fpci9B
aXJMaXZlbmVzcy5oOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzc0FkYXB0ZXI6Okxp
dmVuZXNzQWRhcHRlcik6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzQWRhcHRlcjo6
YmxvY2tTaXplKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3NBZGFwdGVyOjpmb3JF
YWNoRWFybHlVc2UpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzc0FkYXB0ZXI6OmZv
ckVhY2hMYXRlVXNlKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3NBZGFwdGVyOjpm
b3JFYWNoRWFybHlEZWYpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzc0FkYXB0ZXI6
OmZvckVhY2hMYXRlRGVmKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6VG1wTGl2ZW5lc3NBZGFw
dGVyOjpUbXBMaXZlbmVzc0FkYXB0ZXIpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpUbXBMaXZl
bmVzc0FkYXB0ZXI6Om51bUluZGljZXMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpTdGFja1Ns
b3RMaXZlbmVzc0FkYXB0ZXI6OlN0YWNrU2xvdExpdmVuZXNzQWRhcHRlcik6CisgICAgICAgIChK
U0M6OkIzOjpBaXI6OlN0YWNrU2xvdExpdmVuZXNzQWRhcHRlcjo6bnVtSW5kaWNlcyk6CisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OlN0YWNrU2xvdExpdmVuZXNzQWRhcHRlcjo6aW5kZXhUb1ZhbHVl
KToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxpdmVuZXNzKToKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6TG9jYWxDYWxjKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Okl0
ZXJhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2Fs
Q2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjppdGVyYXRvcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3Bl
cmF0b3IrKyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpMb2Nh
bENhbGM6Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3BlcmF0b3IqKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjpv
cGVyYXRvcj09KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6Okxv
Y2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvciE9KTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6OmJlZ2luKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRl
cmFibGU6OmVuZCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpM
b2NhbENhbGM6Okl0ZXJhYmxlOjpjb250YWlucyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkIz
OjpBaXI6OkxpdmVuZXNzOjpMb2NhbENhbGM6OmxpdmUpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpMaXZlbmVzczo6TG9jYWxDYWxjOjppc0xpdmUpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6TG9jYWxDYWxjOjpleGVjdXRlKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OnJhd0xpdmVBdEhlYWQpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6SXRlcmFibGU6Okl0ZXJhYmxlKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjppdGVy
YXRvcjo6aXRlcmF0b3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVz
czo6SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvciopOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpMaXZlbmVzczo6SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvcisrKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjppdGVyYXRv
cjo6b3BlcmF0b3I9PSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNz
OjpJdGVyYWJsZTo6aXRlcmF0b3I6Om9wZXJhdG9yIT0pOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpMaXZlbmVzczo6SXRlcmFibGU6OmJlZ2luKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjplbmQpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6SXRlcmFibGU6OmNvbnRhaW5zKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OmxpdmVBdEhlYWQpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6bGl2ZUF0VGFpbCk6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzOjp3b3Jrc2V0KTogRGVsZXRlZC4KKwogMjAx
Ny0wMy0yNSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEFpcjo6
TGl2ZW5lc3Mgc2hvdWxkbid0IG5lZWQgSGFzaFNldHMKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCShyZXZpc2lvbiAyMTQ0MDkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2
YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAt
MTAwNyw2ICsxMDA3LDkgQEAKIAkJMEZGNDI3NjUxNTkxQTFDRTAwNENCOUZGIC8qIERGR0Rpc2Fz
c2VtYmxlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MEZGNDI3NjIxNTkxQTFDOTAwNENCOUZGIC8qIERGR0Rpc2Fzc2VtYmxlci5oICovOyB9OwogCQkw
RkY0QjRCQzFFODg0NDk3MDBEQkJFODYgLyogQWlyUmVnTGl2ZW5lc3MuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGNEI0QkExRTg4NDQ5NTAwREJC
RTg2IC8qIEFpclJlZ0xpdmVuZXNzLmNwcCAqLzsgfTsKIAkJMEZGNEI0QkQxRTg4NDQ5QTAwREJC
RTg2IC8qIEFpclJlZ0xpdmVuZXNzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwRkY0QjRCQjFFODg0NDk1MDBEQkJFODYgLyogQWlyUmVnTGl2ZW5lc3Mu
aCAqLzsgfTsKKwkJMEZGNEI0QzcxRTg4OTNDNTAwREJCRTg2IC8qIEFpckNGRy5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGNEI0QzYxRTg4OTNCRjAw
REJCRTg2IC8qIEFpckNGRy5oICovOyB9OworCQkwRkY0QjRDQTFFODg5RDdCMDBEQkJFODYgLyog
QjNWYXJpYWJsZUxpdmVuZXNzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGRjRCNEM4MUU4ODlENzgwMERCQkU4NiAvKiBCM1ZhcmlhYmxlTGl2ZW5l
c3MuY3BwICovOyB9OworCQkwRkY0QjRDQjFFODg5RDdFMDBEQkJFODYgLyogQjNWYXJpYWJsZUxp
dmVuZXNzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAw
RkY0QjRDOTFFODg5RDc4MDBEQkJFODYgLyogQjNWYXJpYWJsZUxpdmVuZXNzLmggKi87IH07CiAJ
CTBGRjYwQUMyMTY3NDBGODMwMDAyOTc3OSAvKiBSZWR1Y2VXaGl0ZXNwYWNlLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY2MEFDMDE2NzQwRjgxMDAw
Mjk3NzkgLyogUmVkdWNlV2hpdGVzcGFjZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0g
KFByaXZhdGUsICk7IH07IH07CiAJCTBGRjYwQUMzMTY3NDBGODgwMDAyOTc3OSAvKiBSZWR1Y2VX
aGl0ZXNwYWNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDBGRjYwQUJGMTY3NDBGODEwMDAyOTc3OSAvKiBSZWR1Y2VXaGl0ZXNwYWNlLmNwcCAqLzsg
fTsKIAkJMEZGNzE2OEMxNUEzQjIzNTAwOEY1REFBIC8qIFByb3BlcnR5T2Zmc2V0LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY3MTY4QTE1QTNCMjMx
MDA4RjVEQUEgLyogUHJvcGVydHlPZmZzZXQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
IChQcml2YXRlLCApOyB9OyB9OwpAQCAtMzUyNCw2ICszNTI3LDkgQEAKIAkJMEZGNDI3NjIxNTkx
QTFDOTAwNENCOUZGIC8qIERGR0Rpc2Fzc2VtYmxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IG5hbWUgPSBERkdEaXNhc3NlbWJsZXIuaDsgcGF0aCA9IGRmZy9ERkdEaXNhc3NlbWJsZXIu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZGNEI0QkExRTg4NDQ5NTAwREJCRTg2
IC8qIEFpclJlZ0xpdmVuZXNzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFt
ZSA9IEFpclJlZ0xpdmVuZXNzLmNwcDsgcGF0aCA9IGIzL2Fpci9BaXJSZWdMaXZlbmVzcy5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRjRCNEJCMUU4ODQ0OTUwMERCQkU4NiAv
KiBBaXJSZWdMaXZlbmVzcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBaXJS
ZWdMaXZlbmVzcy5oOyBwYXRoID0gYjMvYWlyL0FpclJlZ0xpdmVuZXNzLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCTBGRjRCNEM2MUU4ODkzQkYwMERCQkU4NiAvKiBBaXJDRkcuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQWlyQ0ZHLmg7IHBhdGggPSBiMy9haXIv
QWlyQ0ZHLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGRjRCNEM4MUU4ODlENzgw
MERCQkU4NiAvKiBCM1ZhcmlhYmxlTGl2ZW5lc3MuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBuYW1lID0gQjNWYXJpYWJsZUxpdmVuZXNzLmNwcDsgcGF0aCA9IGIzL0IzVmFyaWFi
bGVMaXZlbmVzcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGRjRCNEM5MUU4
ODlENzgwMERCQkU4NiAvKiBCM1ZhcmlhYmxlTGl2ZW5lc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gQjNWYXJpYWJsZUxpdmVuZXNzLmg7IHBhdGggPSBiMy9CM1ZhcmlhYmxl
TGl2ZW5lc3MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZGNjBBQkYxNjc0MEY4
MTAwMDI5Nzc5IC8qIFJlZHVjZVdoaXRlc3BhY2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gUmVkdWNlV2hpdGVzcGFjZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTBGRjYwQUMwMTY3NDBGODEwMDAyOTc3OSAvKiBSZWR1Y2VXaGl0ZXNwYWNlLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlZHVjZVdoaXRlc3BhY2UuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZGNzE2OEExNUEzQjIzMTAwOEY1REFBIC8qIFBy
b3BlcnR5T2Zmc2V0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFByb3BlcnR5
T2Zmc2V0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC01NTA0LDYgKzU1MTAsOCBA
QAogCQkJCTBGRUM4NEZEMUJEQUNEQUMwMDgwRkY3NCAvKiBCM1ZhbHVlUmVwLmggKi8sCiAJCQkJ
MEYyQkJEOTIxQzVGRjNGNTAwMjNFRjIzIC8qIEIzVmFyaWFibGUuY3BwICovLAogCQkJCTBGMkJC
RDkzMUM1RkYzRjUwMDIzRUYyMyAvKiBCM1ZhcmlhYmxlLmggKi8sCisJCQkJMEZGNEI0QzgxRTg4
OUQ3ODAwREJCRTg2IC8qIEIzVmFyaWFibGVMaXZlbmVzcy5jcHAgKi8sCisJCQkJMEZGNEI0Qzkx
RTg4OUQ3ODAwREJCRTg2IC8qIEIzVmFyaWFibGVMaXZlbmVzcy5oICovLAogCQkJCTBGMkJCRDk0
MUM1RkYzRjUwMDIzRUYyMyAvKiBCM1ZhcmlhYmxlVmFsdWUuY3BwICovLAogCQkJCTBGMkJCRDk1
MUM1RkYzRjUwMDIzRUYyMyAvKiBCM1ZhcmlhYmxlVmFsdWUuaCAqLywKIAkJCQk1M0Q0NDRERDFE
QUYwOUEwMDBCOTI3ODQgLyogQjNXYXNtQWRkcmVzc1ZhbHVlLmNwcCAqLywKQEAgLTU1MzgsNiAr
NTU0Niw3IEBACiAJCQkJMEY2MTgzMjExQzQ1QkYwNzAwNzI0NTBCIC8qIEFpckNDYWxsaW5nQ29u
dmVudGlvbi5oICovLAogCQkJCTBGRUM4NTRFMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJDQ2FsbFNw
ZWNpYWwuY3BwICovLAogCQkJCTBGRUM4NTRGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJDQ2FsbFNw
ZWNpYWwuaCAqLywKKwkJCQkwRkY0QjRDNjFFODg5M0JGMDBEQkJFODYgLyogQWlyQ0ZHLmggKi8s
CiAJCQkJMEZFQzg1NTAxQkRBQ0RDNzAwODBGRjc0IC8qIEFpckNvZGUuY3BwICovLAogCQkJCTBG
RUM4NTUxMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJDb2RlLmggKi8sCiAJCQkJMEY2MTgzMjIxQzQ1
QkYwNzAwNzI0NTBCIC8qIEFpckN1c3RvbS5jcHAgKi8sCkBAIC04NTQ3LDYgKzg1NTYsNyBAQAog
CQkJCUJDMDJFOTBGMEUxODM5REIwMDBGOTI5NyAvKiBFcnJvclByb3RvdHlwZS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJOTk2QjczMUIxQkRBMDhEMTAwMzMxQjg0IC8qIEVycm9yUHJvdG90eXBlLmx1
dC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTRBRDkxMEMxRENBOTI5NDAwMTRGOUZFIC8qIEV2YWxD
b2RlQmxvY2suaCBpbiBIZWFkZXJzICovLAorCQkJCTBGRjRCNENCMUU4ODlEN0UwMERCQkU4NiAv
KiBCM1ZhcmlhYmxlTGl2ZW5lc3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0NzM0MUQyMURDMDJF
MkUwMEFBMjlCQSAvKiBFdmFsRXhlY3V0YWJsZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTU0OTgy
MDQxODkxRDBCMDAwODFFNUI4IC8qIEV2ZW50TG9vcC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRkUx
QzBGRkQxQjE5M0U5ODAwQjUzRkNBIC8qIEV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCkBAIC04
ODQwLDYgKzg4NTAsNyBAQAogCQkJCUJDMThDNDFFMEUxNkY1Q0QwMEIzNDQ2MCAvKiBKU0NvbnRl
eHRSZWYuaCBpbiBIZWFkZXJzICovLAogCQkJCUE1RUE3MEVFMTlGNUI1QzQwMDk4RjVFQyAvKiBK
U0NvbnRleHRSZWZJbnNwZWN0b3JTdXBwb3J0LmggaW4gSGVhZGVycyAqLywKIAkJCQlBNUQyRTY2
NTE5NUUxNzQwMDBBNTE4RTcgLyogSlNDb250ZXh0UmVmSW50ZXJuYWwuaCBpbiBIZWFkZXJzICov
LAorCQkJCTBGRjRCNEM3MUU4ODkzQzUwMERCQkU4NiAvKiBBaXJDRkcuaCBpbiBIZWFkZXJzICov
LAogCQkJCTE0OENEMUQ4MTA4Q0Y5MDIwMDgxNjNDNiAvKiBKU0NvbnRleHRSZWZQcml2YXRlLmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBNzIwMjhCODE3OTc2MDFFMDA5ODAyOEMgLyogSlNDVGVzdFJ1
bm5lclV0aWxzLmggaW4gSGVhZGVycyAqLywKIAkJCQk3MkFBRjdDRTFEMEQzMUIzMDA1RTYwQkUg
LyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5oIGluIEhlYWRlcnMgKi8sCkBAIC05OTY0
LDYgKzk5NzUsNyBAQAogCQkJCTc5NUYwOTlEMUUwMzYwMDUwMEJCRTM3RiAvKiBCM0NvbXBpbGUu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZFQzg1MEQxQkRBQ0RBQzAwODBGRjc0IC8qIEIzQ29u
c3QzMlZhbHVlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUM4NTBGMUJEQUNEQUMwMDgwRkY3
NCAvKiBCM0NvbnN0NjRWYWx1ZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwRkY0QjRDQTFFODg5
RDdCMDBEQkJFODYgLyogQjNWYXJpYWJsZUxpdmVuZXNzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTBGRUM4NTExMUJEQUNEQUMwMDgwRkY3NCAvKiBCM0NvbnN0RG91YmxlVmFsdWUuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJNDM0MjJBNjIxQzE1OEU2QTAwRTJFQjk4IC8qIEIzQ29uc3RGbG9hdFZh
bHVlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGMzM4REY1MUJFOTNENTUwMDEzQzg4RiAvKiBC
M0NvbnN0cmFpbmVkVmFsdWUuY3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzQmFzaWNCbG9jay5oCShyZXZpc2lvbiAyMTQ0MDkpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvQjNCYXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTY0LDYgKzY0
LDEzIEBAIHB1YmxpYzoKICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVz
LnNpemUoKTsgfQogICAgIFZhbHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1f
dmFsdWVzW2luZGV4XTsgfQogICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4KSB7IHJldHVybiBt
X3ZhbHVlc1tpbmRleF07IH0KKyAgICAKKyAgICBWYWx1ZSogZ2V0KHNpemVfdCBpbmRleCkgY29u
c3QKKyAgICB7CisgICAgICAgIGlmIChpbmRleCA+PSBzaXplKCkpCisgICAgICAgICAgICByZXR1
cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIGF0KGluZGV4KTsKKyAgICB9CiAKICAgICBWYWx1
ZSogbGFzdCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQogICAgIFZhbHVlKiYg
bGFzdCgpIHsgcmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL0IzRml4U1NBLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvQjNGaXhTU0EuY3BwCShyZXZpc2lvbiAyMTQ0MDkpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvQjNGaXhTU0EuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoK
LSAqIENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTYtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNs
dWRlICJCM1Vwc2lsb25WYWx1ZS5oIgogI2luY2x1ZGUgIkIzVmFsdWVJbmxpbmVzLmgiCiAjaW5j
bHVkZSAiQjNWYXJpYWJsZS5oIgorI2luY2x1ZGUgIkIzVmFyaWFibGVMaXZlbmVzcy5oIgogI2lu
Y2x1ZGUgIkIzVmFyaWFibGVWYWx1ZS5oIgogI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4K
ICNpbmNsdWRlIDx3dGYvSW5kZXhTZXQuaD4KQEAgLTEzNiw3ICsxMzcsMTAgQEAgYm9vbCBmaXhT
U0EoUHJvY2VkdXJlJiBwcm9jKQogCiAgICAgLy8gV2Uga25vdyB0aGF0IHdlIGhhdmUgdmFyaWFi
bGVzIHRvIG9wdGltaXplLCBzbyBkbyB0aGF0IG5vdy4KICAgICBicmVha0NyaXRpY2FsRWRnZXMo
cHJvYyk7Ci0KKyAgICAKKyAgICBWYXJpYWJsZUxpdmVuZXNzIGxpdmVuZXNzKHByb2MpOworICAg
IFZhcmlhYmxlTGl2ZW5lc3M6OkxpdmVBdEhlYWQgbGl2ZUF0SGVhZCA9IGxpdmVuZXNzLmxpdmVB
dEhlYWQoKTsKKyAgICAKICAgICBTU0FDYWxjdWxhdG9yIHNzYShwcm9jKTsKIAogICAgIC8vIENy
ZWF0ZSBhIFNTQUNhbGN1bGF0b3I6OlZhcmlhYmxlICgiY2FsY1ZhciIpIGZvciBldmVyeSB2YXJp
YWJsZS4KQEAgLTE2Nyw2ICsxNzEsOSBAQCBib29sIGZpeFNTQShQcm9jZWR1cmUmIHByb2MpCiAg
ICAgc3NhLmNvbXB1dGVQaGlzKAogICAgICAgICBbJl0gKFNTQUNhbGN1bGF0b3I6OlZhcmlhYmxl
KiBjYWxjVmFyLCBCYXNpY0Jsb2NrKiBibG9jaykgLT4gVmFsdWUqIHsKICAgICAgICAgICAgIFZh
cmlhYmxlKiB2YXJpYWJsZSA9IGNhbGNWYXJUb1ZhcmlhYmxlW2NhbGNWYXItPmluZGV4KCldOwor
ICAgICAgICAgICAgaWYgKCFsaXZlQXRIZWFkLmlzTGl2ZUF0SGVhZChibG9jaywgdmFyaWFibGUp
KQorICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgCiAgICAgICAg
ICAgICBWYWx1ZSogcGhpID0gcHJvYy5hZGQ8VmFsdWU+KFBoaSwgdmFyaWFibGUtPnR5cGUoKSwg
YmxvY2stPmF0KDApLT5vcmlnaW4oKSk7CiAgICAgICAgICAgICBpZiAodmVyYm9zZSkgewogICAg
ICAgICAgICAgICAgIGRhdGFMb2coCkBAIC0xODIsMTAgKzE4OSw4IEBAIGJvb2wgZml4U1NBKFBy
b2NlZHVyZSYgcHJvYykKICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogcHJvYy5ibG9ja3NJ
blByZU9yZGVyKCkpIHsKICAgICAgICAgbWFwcGluZy5jbGVhcigpOwogCi0gICAgICAgIGZvciAo
dW5zaWduZWQgaW5kZXggPSBjYWxjVmFyVG9WYXJpYWJsZS5zaXplKCk7IGluZGV4LS07KSB7Ci0g
ICAgICAgICAgICBWYXJpYWJsZSogdmFyaWFibGUgPSBjYWxjVmFyVG9WYXJpYWJsZVtpbmRleF07
Ci0gICAgICAgICAgICBTU0FDYWxjdWxhdG9yOjpWYXJpYWJsZSogY2FsY1ZhciA9IHNzYS52YXJp
YWJsZShpbmRleCk7Ci0KKyAgICAgICAgZm9yIChWYXJpYWJsZSogdmFyaWFibGUgOiBsaXZlbmVz
cy5saXZlQXRIZWFkKGJsb2NrKSkgeworICAgICAgICAgICAgU1NBQ2FsY3VsYXRvcjo6VmFyaWFi
bGUqIGNhbGNWYXIgPSB2YXJpYWJsZVRvQ2FsY1Zhclt2YXJpYWJsZV07CiAgICAgICAgICAgICBT
U0FDYWxjdWxhdG9yOjpEZWYqIGRlZiA9IHNzYS5yZWFjaGluZ0RlZkF0SGVhZChibG9jaywgY2Fs
Y1Zhcik7CiAgICAgICAgICAgICBpZiAoZGVmKQogICAgICAgICAgICAgICAgIG1hcHBpbmdbdmFy
aWFibGVdID0gZGVmLT52YWx1ZSgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0Iz
VmFyaWFibGVMaXZlbmVzcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL0IzVmFyaWFibGVMaXZlbmVzcy5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL0IzVmFyaWFibGVMaXZlbmVzcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCM1ZhcmlhYmxlTGl2ZW5lc3MuaCIKKwor
I2lmIEVOQUJMRShCM19KSVQpCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitW
YXJpYWJsZUxpdmVuZXNzOjpWYXJpYWJsZUxpdmVuZXNzKFByb2NlZHVyZSYgcHJvYykKKyAgICA6
IFdURjo6TGl2ZW5lc3M8VmFyaWFibGVMaXZlbmVzc0FkYXB0ZXI+KHByb2MuY2ZnKCksIHByb2Mp
Cit7Cit9CisKK1ZhcmlhYmxlTGl2ZW5lc3M6On5WYXJpYWJsZUxpdmVuZXNzKCkKK3sKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNWYXJpYWJsZUxpdmVuZXNzLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFyaWFibGVMaXZlbmVzcy5oCShu
b25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhcmlhYmxlTGl2ZW5l
c3MuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKEIz
X0pJVCkKKworI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzQ0ZHLmgiCisj
aW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKKyNpbmNsdWRlICJCM1ZhbHVlSW5saW5lcy5oIgorI2lu
Y2x1ZGUgIkIzVmFyaWFibGUuaCIKKyNpbmNsdWRlICJCM1ZhcmlhYmxlVmFsdWUuaCIKKyNpbmNs
dWRlIDx3dGYvTGl2ZW5lc3MuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisK
K3N0cnVjdCBWYXJpYWJsZUxpdmVuZXNzQWRhcHRlciB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBj
b25zdCBjaGFyKiBuYW1lID0gIlZhcmlhYmxlTGl2ZW5lc3MiOworICAgIHR5cGVkZWYgQjM6OkNG
RyBDRkc7CisgICAgdHlwZWRlZiBWYXJpYWJsZSogVGhpbmc7CisgICAgCisgICAgVmFyaWFibGVM
aXZlbmVzc0FkYXB0ZXIoUHJvY2VkdXJlJiBwcm9jKQorICAgICAgICA6IHByb2MocHJvYykKKyAg
ICB7CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIG51bUluZGljZXMoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHByb2MudmFyaWFibGVzKCkuc2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBzdGF0
aWMgdW5zaWduZWQgdmFsdWVUb0luZGV4KFZhcmlhYmxlKiB2YXIpIHsgcmV0dXJuIHZhci0+aW5k
ZXgoKTsgfQorICAgIFZhcmlhYmxlKiBpbmRleFRvVmFsdWUodW5zaWduZWQgaW5kZXgpIHsgcmV0
dXJuIHByb2MudmFyaWFibGVzKClbaW5kZXhdOyB9CisgICAgCisgICAgdW5zaWduZWQgYmxvY2tT
aXplKEJhc2ljQmxvY2sqIGJsb2NrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrLT5zaXpl
KCk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CisgICAgdm9pZCBm
b3JFYWNoRWFybHlVc2UoQmFzaWNCbG9jayogYmxvY2ssIHVuc2lnbmVkIHZhbHVlSW5kZXgsIGNv
bnN0IEZ1bmMmIGZ1bmMpCisgICAgeworICAgICAgICBWYWx1ZSogdmFsdWUgPSBibG9jay0+Z2V0
KHZhbHVlSW5kZXgpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBpZiAodmFsdWUtPm9wY29kZSgpICE9IEdldCkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgZnVuYyh2YWx1ZS0+YXM8VmFyaWFibGVWYWx1ZT4oKS0+dmFyaWFibGUoKS0+aW5k
ZXgoKSk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CisgICAgdm9p
ZCBmb3JFYWNoTGF0ZVVzZShCYXNpY0Jsb2NrKiwgdW5zaWduZWQsIGNvbnN0IEZ1bmMmKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICB2b2lkIGZv
ckVhY2hFYXJseURlZihCYXNpY0Jsb2NrKiwgdW5zaWduZWQsIGNvbnN0IEZ1bmMmKQorICAgIHsK
KyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICB2b2lkIGZvckVh
Y2hMYXRlRGVmKEJhc2ljQmxvY2sqIGJsb2NrLCB1bnNpZ25lZCB2YWx1ZUluZGV4LCBjb25zdCBG
dW5jJiBmdW5jKQorICAgIHsKKyAgICAgICAgVmFsdWUqIHZhbHVlID0gYmxvY2stPmdldCh2YWx1
ZUluZGV4KTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgaWYgKHZhbHVlLT5vcGNvZGUoKSAhPSBTZXQpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIGZ1bmModmFsdWUtPmFzPFZhcmlhYmxlVmFsdWU+KCktPnZhcmlhYmxlKCktPmluZGV4KCkp
OworICAgIH0KKyAgICAKKyAgICBQcm9jZWR1cmUmIHByb2M7Cit9OworCitjbGFzcyBWYXJpYWJs
ZUxpdmVuZXNzIDogcHVibGljIFdURjo6TGl2ZW5lc3M8VmFyaWFibGVMaXZlbmVzc0FkYXB0ZXI+
IHsKK3B1YmxpYzoKKyAgICBWYXJpYWJsZUxpdmVuZXNzKFByb2NlZHVyZSYpOworICAgIH5WYXJp
YWJsZUxpdmVuZXNzKCk7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlm
IC8vIEVOQUJMRShCM19KSVQpCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlyQ0ZHLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJD
RkcuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNG
Ry5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoQjNf
SklUKQorCisjaW5jbHVkZSAiQWlyQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkFpckNvZGUuaCIK
KyNpbmNsdWRlIDx3dGYvSW5kZXhNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSW5kZXhTZXQuaD4KKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBD
RkcgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKENGRyk7CisgICAgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBCYXNpY0Jsb2NrKiBOb2RlOworICAgIHR5
cGVkZWYgSW5kZXhTZXQ8QmFzaWNCbG9jaz4gU2V0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+
IHVzaW5nIE1hcCA9IEluZGV4TWFwPEJhc2ljQmxvY2ssIFQ+OworICAgIHR5cGVkZWYgVmVjdG9y
PEJhc2ljQmxvY2sqLCA0PiBMaXN0OworCisgICAgQ0ZHKENvZGUmIGNvZGUpCisgICAgICAgIDog
bV9jb2RlKGNvZGUpCisgICAgeworICAgIH0KKworICAgIE5vZGUgcm9vdCgpIHsgcmV0dXJuIG1f
Y29kZVswXTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBNYXA8VD4gbmV3TWFw
KCkgeyByZXR1cm4gSW5kZXhNYXA8SlNDOjpCMzo6QWlyOjpCYXNpY0Jsb2NrLCBUPihtX2NvZGUu
c2l6ZSgpKTsgfQorCisgICAgU3VjY2Vzc29yQ29sbGVjdGlvbjxCYXNpY0Jsb2NrLCBCYXNpY0Js
b2NrOjpTdWNjZXNzb3JMaXN0PiBzdWNjZXNzb3JzKE5vZGUgbm9kZSkgeyByZXR1cm4gbm9kZS0+
c3VjY2Vzc29yQmxvY2tzKCk7IH0KKyAgICBCYXNpY0Jsb2NrOjpQcmVkZWNlc3Nvckxpc3QmIHBy
ZWRlY2Vzc29ycyhOb2RlIG5vZGUpIHsgcmV0dXJuIG5vZGUtPnByZWRlY2Vzc29ycygpOyB9CisK
KyAgICB1bnNpZ25lZCBpbmRleChOb2RlIG5vZGUpIGNvbnN0IHsgcmV0dXJuIG5vZGUtPmluZGV4
KCk7IH0KKyAgICBOb2RlIG5vZGUodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fY29k
ZVtpbmRleF07IH0KKyAgICB1bnNpZ25lZCBudW1Ob2RlcygpIGNvbnN0IHsgcmV0dXJuIG1fY29k
ZS5zaXplKCk7IH0KKworICAgIFBvaW50ZXJEdW1wPEJhc2ljQmxvY2s+IGR1bXAoTm9kZSBub2Rl
KSBjb25zdCB7IHJldHVybiBwb2ludGVyRHVtcChub2RlKTsgfQorCisgICAgdm9pZCBkdW1wKFBy
aW50U3RyZWFtJiBvdXQpIGNvbnN0CisgICAgeworICAgICAgICBtX2NvZGUuZHVtcChvdXQpOwor
ICAgIH0KKworcHJpdmF0ZToKKyAgICBDb2RlJiBtX2NvZGU7Cit9OworCit9IH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCShyZXZpc2lvbiAyMTQ0MDkpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yOSw2ICsyOSw3IEBACiAjaWYgRU5BQkxFKEIzX0pJVCkKIAogI2luY2x1ZGUgIkFpckND
YWxsU3BlY2lhbC5oIgorI2luY2x1ZGUgIkFpckNGRy5oIgogI2luY2x1ZGUgIkIzQmFzaWNCbG9j
a1V0aWxzLmgiCiAjaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKICNpbmNsdWRlICJCM1N0YWNrU2xv
dC5oIgpAQCAtMzgsNiArMzksNyBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFt
ZXNwYWNlCiAKIENvZGU6OkNvZGUoUHJvY2VkdXJlJiBwcm9jKQogICAgIDogbV9wcm9jKHByb2Mp
CisgICAgLCBtX2NmZyhuZXcgQ0ZHKCp0aGlzKSkKICAgICAsIG1fbGFzdFBoYXNlTmFtZSgiaW5p
dGlhbCIpCiB7CiAgICAgLy8gQ29tZSB1cCB3aXRoIGluaXRpYWwgb3JkZXJpbmdzIG9mIHJlZ2lz
dGVycy4gVGhlIHVzZXIgbWF5IHJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBlbHNlLgpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgJKHJldmlzaW9uIDIxNDQwOSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ29kZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC01Miw2ICs1Miw3IEBAIG5hbWVzcGFjZSBBaXIgewogCiBjbGFzcyBCbG9ja0luc2VydGlv
blNldDsKIGNsYXNzIENDYWxsU3BlY2lhbDsKK2NsYXNzIENGRzsKIGNsYXNzIERpc2Fzc2VtYmxl
cjsKIAogdHlwZWRlZiB2b2lkIFdhc21Cb3VuZHNDaGVja0dlbmVyYXRvckZ1bmN0aW9uKENDYWxs
SGVscGVycyYsIEdQUlJlZywgdW5zaWduZWQpOwpAQCAtMTc2LDcgKzE3Nyw3IEBAIHB1YmxpYzoK
IAogICAgIC8vIFJlY29tcHV0ZXMgcHJlZGVjZXNzb3JzIGFuZCBkZWxldGVzIHVucmVhY2hhYmxl
IGJsb2Nrcy4KICAgICB2b2lkIHJlc2V0UmVhY2hhYmlsaXR5KCk7Ci0KKyAgICAKICAgICBKU19F
WFBPUlRfUFJJVkFURSB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKIAogICAgIHVuc2ln
bmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2Nrcy5zaXplKCk7IH0KQEAgLTI1Niw2ICsy
NTcsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBhZGRGYXN0VG1wKFRtcCk7CiAgICAgYm9vbCBpc0Zh
c3RUbXAoVG1wIHRtcCkgY29uc3QgeyByZXR1cm4gbV9mYXN0VG1wcy5jb250YWlucyh0bXApOyB9
CiAgICAgCisgICAgQ0ZHJiBjZmcoKSBjb25zdCB7IHJldHVybiAqbV9jZmc7IH0KKyAgICAKICAg
ICB2b2lkKiBhZGREYXRhU2VjdGlvbihzaXplX3QpOwogICAgIAogICAgIC8vIFRoZSBuYW1lIGhh
cyB0byBiZSBhIHN0cmluZyBsaXRlcmFsLCBzaW5jZSB3ZSBkb24ndCBkbyBhbnkgbWVtb3J5IG1h
bmFnZW1lbnQgZm9yIHRoZSBzdHJpbmcuCkBAIC0zMDQsNiArMzA3LDcgQEAgcHJpdmF0ZToKICAg
ICBTcGFyc2VDb2xsZWN0aW9uPFN0YWNrU2xvdD4gbV9zdGFja1Nsb3RzOwogICAgIFZlY3Rvcjxz
dGQ6OnVuaXF1ZV9wdHI8QmFzaWNCbG9jaz4+IG1fYmxvY2tzOwogICAgIFNwYXJzZUNvbGxlY3Rp
b248U3BlY2lhbD4gbV9zcGVjaWFsczsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHPiBtX2NmZzsK
ICAgICBIYXNoU2V0PFRtcD4gbV9mYXN0VG1wczsKICAgICBDQ2FsbFNwZWNpYWwqIG1fY0NhbGxT
cGVjaWFsIHsgbnVsbHB0ciB9OwogICAgIHVuc2lnbmVkIG1fbnVtR1BUbXBzIHsgMCB9OwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMaXZlbmVzcy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyTGl2ZW5lc3MuaAkocmV2aXNpb24g
MjE0NDA5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMaXZlbmVzcy5oCSh3
b3JraW5nIGNvcHkpCkBAIC0yOCwyNyArMjgsMTA3IEBACiAjaWYgRU5BQkxFKEIzX0pJVCkKIAog
I2luY2x1ZGUgIkFpckJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJBaXJDRkcuaCIKICNpbmNsdWRl
ICJBaXJDb2RlLmgiCiAjaW5jbHVkZSAiQWlySW5zdElubGluZXMuaCIKICNpbmNsdWRlICJBaXJT
dGFja1Nsb3QuaCIKICNpbmNsdWRlICJBaXJUbXBJbmxpbmVzLmgiCi0jaW5jbHVkZSAiQjNUaW1p
bmdTY29wZS5oIgotI2luY2x1ZGUgPHd0Zi9JbmRleE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9JbmRl
eFNwYXJzZVNldC5oPgotI2luY2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgorI2luY2x1ZGUgPHd0Zi9M
aXZlbmVzcy5oPgogCiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFp
ciB7CiAKK3RlbXBsYXRlPHR5cGVuYW1lIEFkYXB0ZXI+CitzdHJ1Y3QgTGl2ZW5lc3NBZGFwdGVy
IHsKKyAgICB0eXBlZGVmIEFpcjo6Q0ZHIENGRzsKKyAgICAKKyAgICBMaXZlbmVzc0FkYXB0ZXIo
Q29kZSYgY29kZSkKKyAgICAgICAgOiBjb2RlKGNvZGUpCisgICAgeworICAgIH0KKyAgICAKKyAg
ICB1bnNpZ25lZCBibG9ja1NpemUoQmFzaWNCbG9jayogYmxvY2spCisgICAgeworICAgICAgICBy
ZXR1cm4gYmxvY2stPnNpemUoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
PgorICAgIHZvaWQgZm9yRWFjaEVhcmx5VXNlKEJhc2ljQmxvY2sqIGJsb2NrLCB1bnNpZ25lZCBp
bnN0SW5kZXgsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgICAgeworICAgICAgICBJbnN0KiBpbnN0ID0g
YmxvY2stPmdldChpbnN0SW5kZXgpOworICAgICAgICBpZiAoIWluc3QpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIGluc3QtPmZvckVhY2g8dHlwZW5hbWUgQWRhcHRlcjo6VGhpbmc+KAor
ICAgICAgICAgICAgWyZdICh0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9s
ZSByb2xlLCBCYW5rIGJhbmssIFdpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNF
YXJseVVzZShyb2xlKQorICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2NlcHRzQmFu
ayhiYW5rKQorICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2NlcHRzUm9sZShyb2xl
KSkKKyAgICAgICAgICAgICAgICAgICAgZnVuYyhBZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcp
KTsKKyAgICAgICAgICAgIH0pOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBG
dW5jPgorICAgIHZvaWQgZm9yRWFjaExhdGVVc2UoQmFzaWNCbG9jayogYmxvY2ssIHVuc2lnbmVk
IGluc3RJbmRleCwgY29uc3QgRnVuYyYgZnVuYykKKyAgICB7CisgICAgICAgIEluc3QqIGluc3Qg
PSBibG9jay0+Z2V0KGluc3RJbmRleCk7CisgICAgICAgIGlmICghaW5zdCkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgaW5zdC0+Zm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4o
CisgICAgICAgICAgICBbJl0gKHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0aGluZywgQXJnOjpS
b2xlIHJvbGUsIEJhbmsgYmFuaywgV2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoQXJnOjpp
c0xhdGVVc2Uocm9sZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0Jh
bmsoYmFuaykKKyAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9s
ZSkpCisgICAgICAgICAgICAgICAgICAgIGZ1bmMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5n
KSk7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
RnVuYz4KKyAgICB2b2lkIGZvckVhY2hFYXJseURlZihCYXNpY0Jsb2NrKiBibG9jaywgdW5zaWdu
ZWQgaW5zdEluZGV4LCBjb25zdCBGdW5jJiBmdW5jKQorICAgIHsKKyAgICAgICAgSW5zdCogaW5z
dCA9IGJsb2NrLT5nZXQoaW5zdEluZGV4KTsKKyAgICAgICAgaWYgKCFpbnN0KQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBpbnN0LT5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5n
PigKKyAgICAgICAgICAgIFsmXSAodHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6
OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBXaWR0aCkgeworICAgICAgICAgICAgICAgIGlmIChBcmc6
OmlzRWFybHlEZWYocm9sZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0
c0JhbmsoYmFuaykKKyAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUo
cm9sZSkpCisgICAgICAgICAgICAgICAgICAgIGZ1bmMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRo
aW5nKSk7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5h
bWUgRnVuYz4KKyAgICB2b2lkIGZvckVhY2hMYXRlRGVmKEJhc2ljQmxvY2sqIGJsb2NrLCB1bnNp
Z25lZCBpbnN0SW5kZXgsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgICAgeworICAgICAgICBJbnN0KiBp
bnN0ID0gYmxvY2stPmdldChpbnN0SW5kZXgpOworICAgICAgICBpZiAoIWluc3QpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIGluc3QtPmZvckVhY2g8dHlwZW5hbWUgQWRhcHRlcjo6VGhp
bmc+KAorICAgICAgICAgICAgWyZdICh0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFy
Zzo6Um9sZSByb2xlLCBCYW5rIGJhbmssIFdpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKEFy
Zzo6aXNMYXRlRGVmKHJvbGUpCisgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2Vw
dHNCYW5rKGJhbmspCisgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNSb2xl
KHJvbGUpKQorICAgICAgICAgICAgICAgICAgICBmdW5jKEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0
aGluZykpOworICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAorICAgIENvZGUmIGNvZGU7Cit9
OworCiB0ZW1wbGF0ZTxCYW5rIGFkYXB0ZXJCYW5rLCBBcmc6OlRlbXBlcmF0dXJlIG1pbmltdW1U
ZW1wZXJhdHVyZSA9IEFyZzo6Q29sZD4KLXN0cnVjdCBUbXBMaXZlbmVzc0FkYXB0ZXIgeworc3Ry
dWN0IFRtcExpdmVuZXNzQWRhcHRlciA6IExpdmVuZXNzQWRhcHRlcjxUbXBMaXZlbmVzc0FkYXB0
ZXI8YWRhcHRlckJhbmssIG1pbmltdW1UZW1wZXJhdHVyZT4+IHsKKyAgICB0eXBlZGVmIExpdmVu
ZXNzQWRhcHRlcjxUbXBMaXZlbmVzc0FkYXB0ZXI8YWRhcHRlckJhbmssIG1pbmltdW1UZW1wZXJh
dHVyZT4+IEJhc2U7CisgICAgCiAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBuYW1l
ID0gIlRtcExpdmVuZXNzIjsKICAgICB0eXBlZGVmIFRtcCBUaGluZzsKIAotICAgIFRtcExpdmVu
ZXNzQWRhcHRlcihDb2RlJikgeyB9CisgICAgVG1wTGl2ZW5lc3NBZGFwdGVyKENvZGUmIGNvZGUp
CisgICAgICAgIDogQmFzZShjb2RlKQorICAgIHsKKyAgICB9CiAKLSAgICBzdGF0aWMgdW5zaWdu
ZWQgbnVtSW5kaWNlcyhDb2RlJiBjb2RlKQorICAgIHVuc2lnbmVkIG51bUluZGljZXMoKQogICAg
IHsKLSAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IGNvZGUubnVtVG1wcyhhZGFwdGVyQmFuayk7
CisgICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBCYXNlOjpjb2RlLm51bVRtcHMoYWRhcHRlckJh
bmspOwogICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8YWRhcHRlckJhbms+OjphYnNv
bHV0ZUluZGV4KG51bVRtcHMpOwogICAgIH0KICAgICBzdGF0aWMgYm9vbCBhY2NlcHRzQmFuayhC
YW5rIGJhbmspIHsgcmV0dXJuIGJhbmsgPT0gYWRhcHRlckJhbms7IH0KQEAgLTU3LDM1MiArMTM3
LDMyIEBAIHN0cnVjdCBUbXBMaXZlbmVzc0FkYXB0ZXIgewogICAgIHN0YXRpYyBUbXAgaW5kZXhU
b1ZhbHVlKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjxhZGFwdGVy
QmFuaz46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGluZGV4KTsgfQogfTsKIAotc3RydWN0IFN0YWNr
U2xvdExpdmVuZXNzQWRhcHRlciB7CitzdHJ1Y3QgU3RhY2tTbG90TGl2ZW5lc3NBZGFwdGVyIDog
TGl2ZW5lc3NBZGFwdGVyPFN0YWNrU2xvdExpdmVuZXNzQWRhcHRlcj4gewogICAgIHN0YXRpYyBj
b25zdGV4cHIgY29uc3QgY2hhciogbmFtZSA9ICJTdGFja1Nsb3RMaXZlbmVzcyI7CiAgICAgdHlw
ZWRlZiBTdGFja1Nsb3QqIFRoaW5nOwogCiAgICAgU3RhY2tTbG90TGl2ZW5lc3NBZGFwdGVyKENv
ZGUmIGNvZGUpCi0gICAgICAgIDogbV9jb2RlKGNvZGUpCisgICAgICAgIDogTGl2ZW5lc3NBZGFw
dGVyKGNvZGUpCiAgICAgewogICAgIH0KIAotICAgIHN0YXRpYyB1bnNpZ25lZCBudW1JbmRpY2Vz
KENvZGUmIGNvZGUpCisgICAgdW5zaWduZWQgbnVtSW5kaWNlcygpCiAgICAgewogICAgICAgICBy
ZXR1cm4gY29kZS5zdGFja1Nsb3RzKCkuc2l6ZSgpOwogICAgIH0KICAgICBzdGF0aWMgYm9vbCBh
Y2NlcHRzQmFuayhCYW5rKSB7IHJldHVybiB0cnVlOyB9CiAgICAgc3RhdGljIGJvb2wgYWNjZXB0
c1JvbGUoQXJnOjpSb2xlKSB7IHJldHVybiB0cnVlOyB9CiAgICAgc3RhdGljIHVuc2lnbmVkIHZh
bHVlVG9JbmRleChTdGFja1Nsb3QqIHN0YWNrU2xvdCkgeyByZXR1cm4gc3RhY2tTbG90LT5pbmRl
eCgpOyB9Ci0gICAgU3RhY2tTbG90KiBpbmRleFRvVmFsdWUodW5zaWduZWQgaW5kZXgpIHsgcmV0
dXJuIG1fY29kZS5zdGFja1Nsb3RzKClbaW5kZXhdOyB9Ci0KLXByaXZhdGU6Ci0gICAgQ29kZSYg
bV9jb2RlOworICAgIFN0YWNrU2xvdCogaW5kZXhUb1ZhbHVlKHVuc2lnbmVkIGluZGV4KSB7IHJl
dHVybiBjb2RlLnN0YWNrU2xvdHMoKVtpbmRleF07IH0KIH07CiAKLS8vIEhFQURTIFVQOiBUaGUg
YWxnb3JpdGhtIGhlcmUgaXMgZHVwbGljYXRlZCBpbiBBaXJSZWdMaXZlbmVzcy5oLgogdGVtcGxh
dGU8dHlwZW5hbWUgQWRhcHRlcj4KLWNsYXNzIExpdmVuZXNzIDogcHVibGljIEFkYXB0ZXIgewot
ICAgIHN0cnVjdCBXb3Jrc2V0OworY2xhc3MgTGl2ZW5lc3MgOiBwdWJsaWMgV1RGOjpMaXZlbmVz
czxBZGFwdGVyPiB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBBZGFwdGVyOjpUaGlu
ZyBUaGluZzsKLSAgICB0eXBlZGVmIFZlY3Rvcjx1bnNpZ25lZCwgNCwgVW5zYWZlVmVjdG9yT3Zl
cmZsb3c+IEluZGV4VmVjdG9yOwotICAgIAogICAgIExpdmVuZXNzKENvZGUmIGNvZGUpCi0gICAg
ICAgIDogQWRhcHRlcihjb2RlKQotICAgICAgICAsIG1fd29ya3NldChBZGFwdGVyOjpudW1JbmRp
Y2VzKGNvZGUpKQotICAgICAgICAsIG1fbGl2ZUF0SGVhZChjb2RlLnNpemUoKSkKLSAgICAgICAg
LCBtX2xpdmVBdFRhaWwoY29kZS5zaXplKCkpCi0gICAgewotICAgICAgICBUaW1pbmdTY29wZSB0
aW1pbmdTY29wZShBZGFwdGVyOjpuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBsaXZl
QXRUYWlsIG9mIGVhY2ggYmxvY2sgYXV0b21hdGljYWxseSBjb250YWlucyB0aGUgTGF0ZVVzZSdz
IG9mIHRoZSB0ZXJtaW5hbC4KLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGNvZGUp
IHsKLSAgICAgICAgICAgIEluZGV4VmVjdG9yJiBsaXZlQXRUYWlsID0gbV9saXZlQXRUYWlsW2Js
b2NrXTsKLQotICAgICAgICAgICAgYmxvY2stPmxhc3QoKS5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0
ZXI6OlRoaW5nPigKLSAgICAgICAgICAgICAgICBbJl0gKHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5n
JiB0aGluZywgQXJnOjpSb2xlIHJvbGUsIEJhbmsgYmFuaywgV2lkdGgpIHsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKEFyZzo6aXNMYXRlVXNlKHJvbGUpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAmJiBBZGFwdGVyOjphY2NlcHRzQmFuayhiYW5rKQotICAgICAgICAgICAgICAgICAgICAgICAg
JiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBs
aXZlQXRUYWlsLmFwcGVuZChBZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKLSAgICAgICAg
ICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RkOjpzb3J0KGxpdmVBdFRh
aWwuYmVnaW4oKSwgbGl2ZUF0VGFpbC5lbmQoKSk7Ci0gICAgICAgICAgICByZW1vdmVSZXBlYXRl
ZEVsZW1lbnRzKGxpdmVBdFRhaWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQmxvY2tzIHdp
dGggbmV3IGxpdmUgdmFsdWVzIGF0IHRhaWwuCi0gICAgICAgIEJpdFZlY3RvciBkaXJ0eUJsb2Nr
czsKLSAgICAgICAgZm9yIChzaXplX3QgYmxvY2tJbmRleCA9IGNvZGUuc2l6ZSgpOyBibG9ja0lu
ZGV4LS07KQotICAgICAgICAgICAgZGlydHlCbG9ja3Muc2V0KGJsb2NrSW5kZXgpOwotICAgICAg
ICAKLSAgICAgICAgSW5kZXhWZWN0b3IgbWVyZ2VCdWZmZXI7Ci0gICAgICAgIAotICAgICAgICBi
b29sIGNoYW5nZWQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsK
LQotICAgICAgICAgICAgZm9yIChzaXplX3QgYmxvY2tJbmRleCA9IGNvZGUuc2l6ZSgpOyBibG9j
a0luZGV4LS07KSB7Ci0gICAgICAgICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBjb2RlW2Js
b2NrSW5kZXhdOwotICAgICAgICAgICAgICAgIGlmICghYmxvY2spCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgaWYgKCFkaXJ0eUJsb2Nrcy5xdWlja0Ns
ZWFyKGJsb2NrSW5kZXgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAg
ICAgICAgICAgIExvY2FsQ2FsYyBsb2NhbENhbGMoKnRoaXMsIGJsb2NrKTsKLSAgICAgICAgICAg
ICAgICBmb3IgKHNpemVfdCBpbnN0SW5kZXggPSBibG9jay0+c2l6ZSgpOyBpbnN0SW5kZXgtLTsp
Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsQ2FsYy5leGVjdXRlKGluc3RJbmRleCk7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGVhcmx5IGRlZidzIG9mIHRoZSBmaXJzdCBpbnN0
cnVjdGlvbi4KLSAgICAgICAgICAgICAgICBibG9jay0+YXQoMCkuZm9yRWFjaDx0eXBlbmFtZSBB
ZGFwdGVyOjpUaGluZz4oCi0gICAgICAgICAgICAgICAgICAgIFsmXSAodHlwZW5hbWUgQWRhcHRl
cjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBXaWR0aCkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNFYXJseURlZihyb2xlKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNCYW5rKGJhbmspCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV93b3Jrc2V0LnJlbW92ZShBZGFwdGVyOjp2YWx1ZVRv
SW5kZXgodGhpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAg
ICBJbmRleFZlY3RvciYgbGl2ZUF0SGVhZCA9IG1fbGl2ZUF0SGVhZFtibG9ja107Ci0KLSAgICAg
ICAgICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgVG1wcyB0aGF0IHdlcmUgZGlzY292ZXJl
ZCBpbiB0aGlzIGl0ZXJhdGlvbi4gSXQgaXMgaW1wb3NzaWJsZQotICAgICAgICAgICAgICAgIC8v
IHRvIHJlbW92ZSBhIGxpdmUgdmFsdWUgZnJvbSB0aGUgaGVhZC4KLSAgICAgICAgICAgICAgICAv
LyBXZSByZW1vdmUgYWxsIHRoZSB2YWx1ZXMgd2UgYWxyZWFkeSBrbmV3IGFib3V0IHNvIHRoYXQg
d2Ugb25seSBoYXZlIHRvIGRlYWwgd2l0aAotICAgICAgICAgICAgICAgIC8vIHdoYXQgaXMgbmV3
IGluIExpdmVBdEhlYWQuCi0gICAgICAgICAgICAgICAgaWYgKG1fd29ya3NldC5zaXplKCkgPT0g
bGl2ZUF0SGVhZC5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgIG1fd29ya3NldC5jbGVhcigp
OwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2ln
bmVkIGxpdmVJbmRleEF0SGVhZCA6IGxpdmVBdEhlYWQpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBtX3dvcmtzZXQucmVtb3ZlKGxpdmVJbmRleEF0SGVhZCk7Ci0gICAgICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAgICAgaWYgKG1fd29ya3NldC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgbGl2ZUF0SGVhZC5yZXNlcnZlQ2Fw
YWNpdHkobGl2ZUF0SGVhZC5zaXplKCkgKyBtX3dvcmtzZXQuc2l6ZSgpKTsKLSAgICAgICAgICAg
ICAgICBmb3IgKHVuc2lnbmVkIG5ld1ZhbHVlIDogbV93b3Jrc2V0KQotICAgICAgICAgICAgICAg
ICAgICBsaXZlQXRIZWFkLnVuY2hlY2tlZEFwcGVuZChuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAgICAgbV93b3Jrc2V0LnNvcnQoKTsKLSAgICAgICAgICAgICAgICAK
LSAgICAgICAgICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIHByZWRlY2Vzc29yIDogYmxvY2stPnBy
ZWRlY2Vzc29ycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEluZGV4VmVjdG9yJiBsaXZlQXRU
YWlsID0gbV9saXZlQXRUYWlsW3ByZWRlY2Vzc29yXTsKLSAgICAgICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAgICAgICAgIGlmIChsaXZlQXRUYWlsLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGxpdmVBdFRhaWwgPSBtX3dvcmtzZXQudmFsdWVzKCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VCdWZmZXIucmVz
aXplKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VCdWZmZXIucmVzZXJ2ZUNhcGFj
aXR5KGxpdmVBdFRhaWwuc2l6ZSgpICsgbV93b3Jrc2V0LnNpemUoKSk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBhdXRvIGl0ZXIgPSBtZXJnZURlZHVwbGljYXRlZFNvcnRlZCgKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBsaXZlQXRUYWlsLmJlZ2luKCksIGxpdmVBdFRhaWwuZW5kKCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93b3Jrc2V0LmJlZ2luKCksIG1fd29ya3Nl
dC5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZUJ1ZmZlci5iZWdpbigp
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlQnVmZmVyLnJlc2l6ZShpdGVyIC0gbWVy
Z2VCdWZmZXIuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChtZXJnZUJ1ZmZlci5zaXplKCkgPT0gbGl2ZUF0VGFpbC5zaXplKCkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQobWVyZ2VCdWZmZXIu
c2l6ZSgpID4gbGl2ZUF0VGFpbC5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGl2
ZUF0VGFpbCA9IG1lcmdlQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBkaXJ0eUJsb2Nrcy5xdWlja1NldChwcmVk
ZWNlc3Nvci0+aW5kZXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoY2hhbmdl
ZCk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBjYWxjdWxhdG9yIGhhcyB0byBiZSBydW4gaW4gcmV2
ZXJzZS4KLSAgICBjbGFzcyBMb2NhbENhbGMgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9jYWxD
YWxjKExpdmVuZXNzJiBsaXZlbmVzcywgQmFzaWNCbG9jayogYmxvY2spCi0gICAgICAgICAgICA6
IG1fbGl2ZW5lc3MobGl2ZW5lc3MpCi0gICAgICAgICAgICAsIG1fYmxvY2soYmxvY2spCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIGF1dG8mIHdvcmtzZXQgPSBsaXZlbmVzcy5tX3dvcmtzZXQ7Ci0g
ICAgICAgICAgICB3b3Jrc2V0LmNsZWFyKCk7Ci0gICAgICAgICAgICBJbmRleFZlY3RvciYgbGl2
ZUF0VGFpbCA9IGxpdmVuZXNzLm1fbGl2ZUF0VGFpbFtibG9ja107Ci0gICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIGluZGV4IDogbGl2ZUF0VGFpbCkKLSAgICAgICAgICAgICAgICB3b3Jrc2V0LmFk
ZChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzcyBJdGVyYWJsZSB7Ci0gICAgICAg
IHB1YmxpYzoKLSAgICAgICAgICAgIEl0ZXJhYmxlKExpdmVuZXNzJiBsaXZlbmVzcykKLSAgICAg
ICAgICAgICAgICA6IG1fbGl2ZW5lc3MobGl2ZW5lc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKLSAgICAgICAgICAgIHB1Ymxp
YzoKLSAgICAgICAgICAgICAgICBpdGVyYXRvcihBZGFwdGVyJiBhZGFwdGVyLCBJbmRleFNwYXJz
ZVNldDxVbnNhZmVWZWN0b3JPdmVyZmxvdz46OmNvbnN0X2l0ZXJhdG9yIHNwYXJjZVNldEl0ZXJh
dG9yKQotICAgICAgICAgICAgICAgICAgICA6IG1fYWRhcHRlcihhZGFwdGVyKQotICAgICAgICAg
ICAgICAgICAgICAsIG1fc3BhcmNlU2V0SXRlcmF0b3Ioc3BhcmNlU2V0SXRlcmF0b3IpCi0gICAg
ICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGl0ZXJh
dG9yJiBvcGVyYXRvcisrKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAg
ICsrbV9zcGFyY2VTZXRJdGVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlz
OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHR5cGVuYW1lIEFkYXB0ZXI6
OlRoaW5nIG9wZXJhdG9yKigpIGNvbnN0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gbV9hZGFwdGVyLmluZGV4VG9WYWx1ZSgqbV9zcGFyY2VTZXRJdGVyYXRv
cik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgeyByZXR1cm4gbV9zcGFyY2VTZXRJdGVyYXRvciA9PSBv
dGhlci5tX3NwYXJjZVNldEl0ZXJhdG9yOyB9Ci0gICAgICAgICAgICAgICAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgeyByZXR1cm4gbV9zcGFyY2VTZXRJdGVyYXRvciAh
PSBvdGhlci5tX3NwYXJjZVNldEl0ZXJhdG9yOyB9Ci0KLSAgICAgICAgICAgIHByaXZhdGU6Ci0g
ICAgICAgICAgICAgICAgQWRhcHRlciYgbV9hZGFwdGVyOwotICAgICAgICAgICAgICAgIEluZGV4
U3BhcnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJmbG93Pjo6Y29uc3RfaXRlcmF0b3IgbV9zcGFyY2VT
ZXRJdGVyYXRvcjsKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGl0ZXJhdG9yIGJlZ2lu
KCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9saXZlbmVzcywgbV9saXZlbmVzcy5tX3dvcmtz
ZXQuYmVnaW4oKSk7IH0KLSAgICAgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJu
IGl0ZXJhdG9yKG1fbGl2ZW5lc3MsIG1fbGl2ZW5lc3MubV93b3Jrc2V0LmVuZCgpKTsgfQotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IHR5cGVuYW1lIEFkYXB0
ZXI6OlRoaW5nJiB0aGluZykgY29uc3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gbV9saXZlbmVzcy5tX3dvcmtzZXQuY29udGFpbnMoQWRhcHRlcjo6dmFsdWVUb0luZGV4
KHRoaW5nKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAg
IExpdmVuZXNzJiBtX2xpdmVuZXNzOwotICAgICAgICB9OwotCi0gICAgICAgIEl0ZXJhYmxlIGxp
dmUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSXRlcmFibGUobV9saXZl
bmVzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGlzTGl2ZShjb25zdCB0eXBlbmFtZSBB
ZGFwdGVyOjpUaGluZyYgdGhpbmcpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVy
biBsaXZlKCkuY29udGFpbnModGhpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBleGVj
dXRlKHVuc2lnbmVkIGluc3RJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgSW5zdCYgaW5z
dCA9IG1fYmxvY2stPmF0KGluc3RJbmRleCk7Ci0gICAgICAgICAgICBhdXRvJiB3b3Jrc2V0ID0g
bV9saXZlbmVzcy5tX3dvcmtzZXQ7Ci0KLSAgICAgICAgICAgIC8vIEZpcnN0IGhhbmRsZSB0aGUg
ZWFybHkgZGVmJ3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICBpZiAoaW5z
dEluZGV4ICsgMSA8IG1fYmxvY2stPnNpemUoKSkgewotICAgICAgICAgICAgICAgIEluc3QmIG5l
eHRJbnN0ID0gbV9ibG9jay0+YXQoaW5zdEluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgbmV4
dEluc3QuZm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4oCi0gICAgICAgICAgICAgICAg
ICAgIFsmXSAodHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwg
QmFuayBiYW5rLCBXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNF
YXJseURlZihyb2xlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFj
Y2VwdHNCYW5rKGJhbmspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6
YWNjZXB0c1JvbGUocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NldC5y
ZW1vdmUoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAg
IH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGVuIGhh
bmRsZSBkZWYncy4KLSAgICAgICAgICAgIGluc3QuZm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpU
aGluZz4oCi0gICAgICAgICAgICAgICAgWyZdICh0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhp
bmcsIEFyZzo6Um9sZSByb2xlLCBCYW5rIGJhbmssIFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChBcmc6OmlzTGF0ZURlZihyb2xlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYg
QWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIEFk
YXB0ZXI6OmFjY2VwdHNSb2xlKHJvbGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgd29ya3Nl
dC5yZW1vdmUoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7Ci0gICAgICAgICAgICAgICAg
fSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZW4gaGFuZGxlIHVzZSdzLgotICAgICAgICAgICAgaW5z
dC5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nPigKLSAgICAgICAgICAgICAgICBbJl0g
KHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0aGluZywgQXJnOjpSb2xlIHJvbGUsIEJhbmsgYmFu
aywgV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNFYXJseVVzZShyb2xl
KQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykK
LSAgICAgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNSb2xlKHJvbGUpKQot
ICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NldC5hZGQoQWRhcHRlcjo6dmFsdWVUb0luZGV4
KHRoaW5nKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIC8vIEFuZCBmaW5h
bGx5LCBoYW5kbGUgdGhlIGxhdGUgdXNlJ3Mgb2YgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLgot
ICAgICAgICAgICAgaWYgKGluc3RJbmRleCkgewotICAgICAgICAgICAgICAgIEluc3QmIHByZXZJ
bnN0ID0gbV9ibG9jay0+YXQoaW5zdEluZGV4IC0gMSk7Ci0gICAgICAgICAgICAgICAgcHJldklu
c3QuZm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4oCi0gICAgICAgICAgICAgICAgICAg
IFsmXSAodHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFu
ayBiYW5rLCBXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNMYXRl
VXNlKHJvbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0
c0JhbmsoYmFuaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2Nl
cHRzUm9sZShyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2V0LmFkZChB
ZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAg
TGl2ZW5lc3MmIG1fbGl2ZW5lc3M7Ci0gICAgICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Ci0gICAg
fTsKLQotICAgIGNvbnN0IEluZGV4VmVjdG9yJiByYXdMaXZlQXRIZWFkKEJhc2ljQmxvY2sqIGJs
b2NrKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbGl2ZUF0SGVhZFtibG9ja107Ci0gICAgfQot
Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVW5kZXJseWluZ0l0ZXJhYmxlPgotICAgIGNsYXNzIEl0
ZXJhYmxlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEl0ZXJhYmxlKExpdmVuZXNzJiBsaXZlbmVz
cywgY29uc3QgVW5kZXJseWluZ0l0ZXJhYmxlJiBpdGVyYWJsZSkKLSAgICAgICAgICAgIDogbV9s
aXZlbmVzcyhsaXZlbmVzcykKLSAgICAgICAgICAgICwgbV9pdGVyYWJsZShpdGVyYWJsZSkKLSAg
ICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgaXRlcmF0b3IgewotICAgICAgICBw
dWJsaWM6Ci0gICAgICAgICAgICBpdGVyYXRvcigpCi0gICAgICAgICAgICAgICAgOiBtX2xpdmVu
ZXNzKG51bGxwdHIpCi0gICAgICAgICAgICAgICAgLCBtX2l0ZXIoKQotICAgICAgICAgICAgewot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpdGVyYXRvcihMaXZlbmVz
cyYgbGl2ZW5lc3MsIHR5cGVuYW1lIFVuZGVybHlpbmdJdGVyYWJsZTo6Y29uc3RfaXRlcmF0b3Ig
aXRlcikKLSAgICAgICAgICAgICAgICA6IG1fbGl2ZW5lc3MoJmxpdmVuZXNzKQotICAgICAgICAg
ICAgICAgICwgbV9pdGVyKGl0ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nIG9wZXJhdG9yKigpCi0gICAgICAgICAg
ICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fbGl2ZW5lc3MtPmluZGV4VG9WYWx1ZSgqbV9p
dGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKyso
KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICsrbV9pdGVyOwotICAgICAgICAgICAg
ICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAgICAgIHsKLSAgICAg
ICAgICAgICAgICBBU1NFUlQobV9saXZlbmVzcyA9PSBvdGhlci5tX2xpdmVuZXNzKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gbV9pdGVyID09IG90aGVyLm1faXRlcjsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29u
c3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhl
cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIExpdmVu
ZXNzKiBtX2xpdmVuZXNzOwotICAgICAgICAgICAgdHlwZW5hbWUgVW5kZXJseWluZ0l0ZXJhYmxl
Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaXRlcmF0b3Ig
YmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2xpdmVuZXNzLCBtX2l0ZXJhYmxlLmJl
Z2luKCkpOyB9Ci0gICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9y
KG1fbGl2ZW5lc3MsIG1faXRlcmFibGUuZW5kKCkpOyB9Ci0KLSAgICAgICAgYm9vbCBjb250YWlu
cyhjb25zdCB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcpIGNvbnN0Ci0gICAgICAgIHsK
LSAgICAgICAgICAgIHJldHVybiBtX2xpdmVuZXNzLm1fd29ya3NldC5jb250YWlucyhBZGFwdGVy
Ojp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAg
ICAgTGl2ZW5lc3MmIG1fbGl2ZW5lc3M7Ci0gICAgICAgIGNvbnN0IFVuZGVybHlpbmdJdGVyYWJs
ZSYgbV9pdGVyYWJsZTsKLSAgICB9OwotCi0gICAgSXRlcmFibGU8SW5kZXhWZWN0b3I+IGxpdmVB
dEhlYWQoQmFzaWNCbG9jayogYmxvY2spCi0gICAgewotICAgICAgICByZXR1cm4gSXRlcmFibGU8
SW5kZXhWZWN0b3I+KCp0aGlzLCBtX2xpdmVBdEhlYWRbYmxvY2tdKTsKLSAgICB9Ci0KLSAgICBJ
dGVyYWJsZTxJbmRleFZlY3Rvcj4gbGl2ZUF0VGFpbChCYXNpY0Jsb2NrKiBibG9jaykKLSAgICB7
Ci0gICAgICAgIHJldHVybiBJdGVyYWJsZTxJbmRleFZlY3Rvcj4oKnRoaXMsIG1fbGl2ZUF0VGFp
bFtibG9ja10pOwotICAgIH0KLQotICAgIEluZGV4U3BhcnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJm
bG93PiYgd29ya3NldCgpIHsgcmV0dXJuIG1fd29ya3NldDsgfQotCi1wcml2YXRlOgotICAgIGZy
aWVuZCBjbGFzcyBMb2NhbENhbGM7Ci0gICAgZnJpZW5kIGNsYXNzIExvY2FsQ2FsYzo6SXRlcmFi
bGU7Ci0KLSAgICBJbmRleFNwYXJzZVNldDxVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV93b3Jrc2V0
OwotICAgIEluZGV4TWFwPEJhc2ljQmxvY2ssIEluZGV4VmVjdG9yPiBtX2xpdmVBdEhlYWQ7Ci0g
ICAgSW5kZXhNYXA8QmFzaWNCbG9jaywgSW5kZXhWZWN0b3I+IG1fbGl2ZUF0VGFpbDsKKyAgICAg
ICAgOiBXVEY6OkxpdmVuZXNzPEFkYXB0ZXI+KGNvZGUuY2ZnKCksIGNvZGUpCisgICAgeworICAg
IH0KIH07CiAKIHRlbXBsYXRlPEJhbmsgYmFuaywgQXJnOjpUZW1wZXJhdHVyZSBtaW5pbXVtVGVt
cGVyYXR1cmUgPSBBcmc6OkNvbGQ+CkluZGV4OiBTb3VyY2UvV1RGL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV1RGL0NoYW5nZUxvZwkocmV2aXNpb24gMjE0NDA5KQorKysgU291cmNl
L1dURi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw1NiBAQAorMjAxNy0wMy0y
NiAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAgIEIzOjpmaXhTU0Eg
c2hvdWxkIGRvIGxpdmVuZXNzIHBydW5pbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTE3MDExMQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorICAgICAgICAKKyAgICAgICAgTW92ZSBBaXI6OkxpdmVuZXNzPD4gdG8gV1RGOjpM
aXZlbmVzczw+LiBUaGlzIGlzIHByZXR0eSBlYXN5IHNpbmNlIEFpcjo6TGl2ZW5lc3M8PiB3YXMK
KyAgICAgICAgYWxyZWFkeSBmYWlybHkgZ2VuZXJpYy4gSXQgbGV2ZXJhZ2VzIHRoZSBDRkcgY29u
Y2VwdCBzbyB0aGF0IGl0IGNhbiB1bmRlcnN0YW5kIG1hbnkKKyAgICAgICAgZGlmZmVyZW50IGtp
bmRzIG9mIGJhc2ljIGJsb2Nrcy4gSXQgZG9lc24ndCB0cnkgdG8gdW5kZXJzdGFuZCB0aGUgY29u
dGVudHMgb2YgYmFzaWMKKyAgICAgICAgYmxvY2tzOyBpdCBqdXN0IGFza3MgdGhlIGFkYXB0b3Ig
Zm9yIHRoZSBibG9jayBzaXplIGFuZCBhc2tzIGZvciB0aGUgZWFybHkvbGF0ZQorICAgICAgICB1
c2VzL2RlZnMgb2YgZWFjaCB0aGluZyBpbiB0aGUgYmxvY2suCisgICAgICAgIAorICAgICAgICBU
aGlzIG1ha2VzIGl0IGVhc3kgdG8gY3JlYXRlIGEgQjM6OlZhcmlhYmxlTGl2ZW5lc3MsIHdoaWNo
IGZpeFNTQSB0aGVuIHVzZXMgZm9yCisgICAgICAgIHBydW5pbmcuIE9uZSBvZiB0aGUgbmV3IGZl
YXR1cmVzIGlzIHRoZSBMaXZlbmVzczo6TGl2ZUF0SGVhZCBuZXN0ZWQgY2xhc3MsIHdoaWNoIHlv
dQorICAgICAgICBpbnN0YW50aWF0ZSBpZiB5b3Ugd2FudCB0byBwZXJmb3JtIGxpdmVBdEhlYWQg
cXVlcmllcywgd2hpY2ggU1NBIGNvbnN0cnVjdGlvbiB3YW50cyB0bworICAgICAgICBkby4KKyAg
ICAgICAgCisgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTcwMTAyI2MxMgorCisgICAgICAgICogV1RGLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2o6CisgICAgICAgICogd3RmL0NNYWtlTGlzdHMudHh0OgorICAgICAgICAqIHd0
Zi9MaXZlbmVzcy5oOiBBZGRlZC4KKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OkxpdmVuZXNzKToK
KyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6TG9jYWxDYWxjKToKKyAgICAgICAg
KFdURjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Okl0ZXJhYmxlKToKKyAgICAgICAg
KFdURjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjppdGVyYXRvcik6
CisgICAgICAgIChXVEY6OkxpdmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxlOjppdGVyYXRvcjo6
b3BlcmF0b3IrKyk6CisgICAgICAgIChXVEY6OkxpdmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxl
OjppdGVyYXRvcjo6b3BlcmF0b3IqKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OkxvY2FsQ2Fs
Yzo6SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvcj09KToKKyAgICAgICAgKFdURjo6TGl2ZW5l
c3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvciE9KToKKyAgICAgICAg
KFdURjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6OmJlZ2luKToKKyAgICAgICAgKFdU
Rjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6OmVuZCk6CisgICAgICAgIChXVEY6Okxp
dmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxlOjpjb250YWlucyk6CisgICAgICAgIChXVEY6Okxp
dmVuZXNzOjpMb2NhbENhbGM6OmxpdmUpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6TG9jYWxD
YWxjOjppc0xpdmUpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6TG9jYWxDYWxjOjpleGVjdXRl
KToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OnJhd0xpdmVBdEhlYWQpOgorICAgICAgICAoV1RG
OjpMaXZlbmVzczo6SXRlcmFibGU6Okl0ZXJhYmxlKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6
Okl0ZXJhYmxlOjppdGVyYXRvcjo6aXRlcmF0b3IpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6
SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvciopOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6
SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvcisrKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6
Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXVEY6OkxpdmVuZXNz
OjpJdGVyYWJsZTo6aXRlcmF0b3I6Om9wZXJhdG9yIT0pOgorICAgICAgICAoV1RGOjpMaXZlbmVz
czo6SXRlcmFibGU6OmJlZ2luKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjpl
bmQpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6SXRlcmFibGU6OmNvbnRhaW5zKToKKyAgICAg
ICAgKFdURjo6TGl2ZW5lc3M6OmxpdmVBdEhlYWQpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6
bGl2ZUF0VGFpbCk6CisgICAgICAgIChXVEY6OkxpdmVuZXNzOjp3b3Jrc2V0KToKKyAgICAgICAg
KFdURjo6TGl2ZW5lc3M6OkxpdmVBdEhlYWQ6OkxpdmVBdEhlYWQpOgorICAgICAgICAoV1RGOjpM
aXZlbmVzczo6TGl2ZUF0SGVhZDo6aXNMaXZlQXRIZWFkKToKKwogMjAxNy0wMy0yNSAgRmlsaXAg
UGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEFpcjo6TGl2ZW5lc3Mgc2hvdWxk
bid0IG5lZWQgSGFzaFNldHMKSW5kZXg6IFNvdXJjZS9XVEYvV1RGLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagkocmV2aXNpb24gMjE0NDA5KQorKysgU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtODIsNiArODIsNyBAQAogCQkwRkVDODRB
RjFCRDgyNTMxMDA4MEZGNzQgLyogR3JhcGhOb2RlV29ya2xpc3QuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRUM4NEFFMUJEODI1MzEwMDgwRkY3NCAv
KiBHcmFwaE5vZGVXb3JrbGlzdC5oICovOyB9OwogCQkwRkVDODRCMTFCREFDRDM5MDA4MEZGNzQg
LyogU2NvcGVkTGFtYmRhLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAwRkVDODRCMDFCREFDRDM5MDA4MEZGNzQgLyogU2NvcGVkTGFtYmRhLmggKi87IH07
CiAJCTBGRUQ2N0I2MUIyMkQ0RDgwMDY2Q0UxNSAvKiBUaW55UHRyU2V0LmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkVENjdCNTFCMjJENEQ4MDA2NkNF
MTUgLyogVGlueVB0clNldC5oICovOyB9OworCQkwRkY0QjRDNTFFODg5MzlDMDBEQkJFODYgLyog
TGl2ZW5lc3MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDBGRjRCNEM0MUU4ODkzOUMwMERCQkU4NiAvKiBMaXZlbmVzcy5oICovOyB9OwogCQkwRkY4NjA5
NTFCQ0NCRDc0MDA0NTEyN0YgLyogUG9pbnRlckNvbXBhcmlzb24uaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRjg2MDk0MUJDQ0JENzQwMDQ1MTI3RiAv
KiBQb2ludGVyQ29tcGFyaXNvbi5oICovOyB9OwogCQkwRkZGMTlEQzFCQjMzNEVCMDA4ODZEOTEg
LyogUGFyYWxsZWxIZWxwZXJQb29sLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGRkYxOURBMUJCMzM0RUIwMDg4NkQ5MSAvKiBQYXJhbGxlbEhlbHBl
clBvb2wuY3BwICovOyB9OwogCQkwRkZGMTlERDFCQjMzNEVCMDA4ODZEOTEgLyogUGFyYWxsZWxI
ZWxwZXJQb29sLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAwRkZGMTlEQjFCQjMzNEVCMDA4ODZEOTEgLyogUGFyYWxsZWxIZWxwZXJQb29sLmggKi87IH07
CkBAIC00NjcsNiArNDY4LDcgQEAKIAkJMEZFQzg0QUUxQkQ4MjUzMTAwODBGRjc0IC8qIEdyYXBo
Tm9kZVdvcmtsaXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEdyYXBoTm9k
ZVdvcmtsaXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRUM4NEIwMUJEQUNE
MzkwMDgwRkY3NCAvKiBTY29wZWRMYW1iZGEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gU2NvcGVkTGFtYmRhLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRUQ2
N0I1MUIyMkQ0RDgwMDY2Q0UxNSAvKiBUaW55UHRyU2V0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFRpbnlQdHJTZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MEZGNEI0QzQxRTg4OTM5QzAwREJCRTg2IC8qIExpdmVuZXNzLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IExpdmVuZXNzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTBGRjg2MDk0MUJDQ0JENzQwMDQ1MTI3RiAvKiBQb2ludGVyQ29tcGFyaXNvbi5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQb2ludGVyQ29tcGFyaXNvbi5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkwRkZGMTlEQTFCQjMzNEVCMDA4ODZEOTEgLyogUGFyYWxsZWxI
ZWxwZXJQb29sLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhcmFs
bGVsSGVscGVyUG9vbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRkYxOURC
MUJCMzM0RUIwMDg4NkQ5MSAvKiBQYXJhbGxlbEhlbHBlclBvb2wuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gUGFyYWxsZWxIZWxwZXJQb29sLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CkBAIC0xMDI3LDYgKzEwMjksNyBAQAogCQkJCTUzOUVCMDYyMUQ1NTI4NDIwMEM4
MkVGNyAvKiBMRUJEZWNvZGVyLmggKi8sCiAJCQkJQTcwREEwODMxNzk5RjA0RDAwNTI5QTlCIC8q
IExpc3REdW1wLmggKi8sCiAJCQkJQThBNDcyQzExNTFBODI1QTAwNDEyM0ZGIC8qIExpc3RIYXNo
U2V0LmggKi8sCisJCQkJMEZGNEI0QzQxRTg4OTM5QzAwREJCRTg2IC8qIExpdmVuZXNzLmggKi8s
CiAJCQkJMEZFMTY0NjgxQjZGRkM5NjAwNDAwRTdDIC8qIExvY2suY3BwICovLAogCQkJCTBGRTE2
NDY5MUI2RkZDOTYwMDQwMEU3QyAvKiBMb2NrLmggKi8sCiAJCQkJMEYwRkNEREQxREQxNjdGOTAw
Q0NBQjUzIC8qIExvY2tBbGdvcml0aG0uaCAqLywKQEAgLTEzOTAsNiArMTM5Myw3IEBACiAJCQkJ
OUJEOEY0MEIxNzZDMkI0NzAwMDJEODY1IC8qIEF0b21pY1N0cmluZ1RhYmxlLmggaW4gSGVhZGVy
cyAqLywKIAkJCQkxNDY5NDE5QzE2RUFCMTBBMDAyNEUxNDYgLyogQXV0b2RyYWluZWRQb29sLmgg
aW4gSGVhZGVycyAqLywKIAkJCQkwRjQzRDhGMjFEQjVBRERDMDAxMDhGQjYgLyogQXV0b21hdGlj
VGhyZWFkLmggaW4gSGVhZGVycyAqLywKKwkJCQkwRkY0QjRDNTFFODg5MzlDMDBEQkJFODYgLyog
TGl2ZW5lc3MuaCBpbiBIZWFkZXJzICovLAogCQkJCURDRUUyMjA1MUNFQjk4NjkwMDBDMjM5NiAv
KiBCYWNrd2FyZHNHcmFwaC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZCMTRFMTkxODBGQTIxODAw
OUI2QjREIC8qIEJhZy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZCMTRFMUIxODEwRTFEQzAwOUI2
QjREIC8qIEJhZ1RvSGFzaE1hcC5oIGluIEhlYWRlcnMgKi8sCkluZGV4OiBTb3VyY2UvV1RGL3d0
Zi9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9DTWFrZUxpc3Rz
LnR4dAkocmV2aXNpb24gMjE0NDA5KQorKysgU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQJ
KHdvcmtpbmcgY29weSkKQEAgLTU3LDYgKzU3LDcgQEAgc2V0KFdURl9IRUFERVJTCiAgICAgSXRl
cmF0b3JBZGFwdG9ycy5oCiAgICAgSXRlcmF0b3JSYW5nZS5oCiAgICAgTGlzdEhhc2hTZXQuaAor
ICAgIExpdmVuZXNzLmgKICAgICBMb2NrLmgKICAgICBMb2NrQWxnb3JpdGhtLmgKICAgICBMb2Nr
ZWRQcmludFN0cmVhbS5oCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9MaXZlbmVzcy5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XVEYvd3RmL0xpdmVuZXNzLmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNl
L1dURi93dGYvTGl2ZW5lc3MuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM3MyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpbmNsdWRlIDx3dGYvQml0VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL0luZGV4U3Bh
cnNlU2V0Lmg+CisjaW5jbHVkZSA8d3RmL0xpc3REdW1wLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExp
YkV4dHJhcy5oPgorCituYW1lc3BhY2UgV1RGIHsKKworLy8gSEVBRFMgVVA6IFRoZSBhbGdvcml0
aG0gaGVyZSBpcyBkdXBsaWNhdGVkIGluIEFpclJlZ0xpdmVuZXNzLmguIFRoYXQgb25lIHVzZXMg
c2V0cyByYXRoZXIKKy8vIHRoYW4gZmFuY3kgdmVjdG9ycywgYmVjYXVzZSB0aGF0J3MgYmV0dGVy
IGZvciByZWdpc3RlciBsaXZlbmVzcyBhbmFseXNpcy4KK3RlbXBsYXRlPHR5cGVuYW1lIEFkYXB0
ZXI+CitjbGFzcyBMaXZlbmVzcyA6IHB1YmxpYyBBZGFwdGVyIHsKK3B1YmxpYzoKKyAgICB0eXBl
ZGVmIHR5cGVuYW1lIEFkYXB0ZXI6OkNGRyBDRkc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBBZGFw
dGVyOjpUaGluZyBUaGluZzsKKyAgICB0eXBlZGVmIFZlY3Rvcjx1bnNpZ25lZCwgNCwgVW5zYWZl
VmVjdG9yT3ZlcmZsb3c+IEluZGV4VmVjdG9yOworICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1l
Li4uIEFyZ3VtZW50cz4KKyAgICBMaXZlbmVzcyhDRkcmIGNmZywgQXJndW1lbnRzJiYuLi4gYXJn
dW1lbnRzKQorICAgICAgICA6IEFkYXB0ZXIoc3RkOjpmb3J3YXJkPEFyZ3VtZW50cz4oYXJndW1l
bnRzKS4uLikKKyAgICAgICAgLCBtX2NmZyhjZmcpCisgICAgICAgICwgbV93b3Jrc2V0KEFkYXB0
ZXI6Om51bUluZGljZXMoKSkKKyAgICAgICAgLCBtX2xpdmVBdEhlYWQoY2ZnLnRlbXBsYXRlIG5l
d01hcDxJbmRleFZlY3Rvcj4oKSkKKyAgICAgICAgLCBtX2xpdmVBdFRhaWwoY2ZnLnRlbXBsYXRl
IG5ld01hcDxJbmRleFZlY3Rvcj4oKSkKKyAgICB7CisgICAgICAgIC8vIFRoZSBsaXZlQXRUYWls
IG9mIGVhY2ggYmxvY2sgYXV0b21hdGljYWxseSBjb250YWlucyB0aGUgTGF0ZVVzZSdzIG9mIHRo
ZSB0ZXJtaW5hbC4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBibG9ja0luZGV4ID0gbV9jZmcubnVt
Tm9kZXMoKTsgYmxvY2tJbmRleC0tOykgeworICAgICAgICAgICAgdHlwZW5hbWUgQ0ZHOjpOb2Rl
IGJsb2NrID0gbV9jZmcubm9kZShibG9ja0luZGV4KTsKKyAgICAgICAgICAgIGlmICghYmxvY2sp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIElu
ZGV4VmVjdG9yJiBsaXZlQXRUYWlsID0gbV9saXZlQXRUYWlsW2Jsb2NrXTsKKworICAgICAgICAg
ICAgQWRhcHRlcjo6Zm9yRWFjaExhdGVVc2UoCisgICAgICAgICAgICAgICAgYmxvY2ssIEFkYXB0
ZXI6OmJsb2NrU2l6ZShibG9jaykgLSAxLAorICAgICAgICAgICAgICAgIFsmXSAodW5zaWduZWQg
aW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbGl2ZUF0VGFpbC5hcHBlbmQoaW5kZXgpOwor
ICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgCisgICAgICAgICAgICBzdGQ6OnNvcnQo
bGl2ZUF0VGFpbC5iZWdpbigpLCBsaXZlQXRUYWlsLmVuZCgpKTsKKyAgICAgICAgICAgIHJlbW92
ZVJlcGVhdGVkRWxlbWVudHMobGl2ZUF0VGFpbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBC
bG9ja3Mgd2l0aCBuZXcgbGl2ZSB2YWx1ZXMgYXQgdGFpbC4KKyAgICAgICAgQml0VmVjdG9yIGRp
cnR5QmxvY2tzOworICAgICAgICBmb3IgKHNpemVfdCBibG9ja0luZGV4ID0gbV9jZmcubnVtTm9k
ZXMoKTsgYmxvY2tJbmRleC0tOykKKyAgICAgICAgICAgIGRpcnR5QmxvY2tzLnNldChibG9ja0lu
ZGV4KTsKKyAgICAgICAgCisgICAgICAgIEluZGV4VmVjdG9yIG1lcmdlQnVmZmVyOworICAgICAg
ICAKKyAgICAgICAgYm9vbCBjaGFuZ2VkOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFu
Z2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGJsb2NrSW5kZXggPSBtX2Nm
Zy5udW1Ob2RlcygpOyBibG9ja0luZGV4LS07KSB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUg
Q0ZHOjpOb2RlIGJsb2NrID0gbV9jZmcubm9kZShibG9ja0luZGV4KTsKKyAgICAgICAgICAgICAg
ICBpZiAoIWJsb2NrKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAg
ICAgICAgIGlmICghZGlydHlCbG9ja3MucXVpY2tDbGVhcihibG9ja0luZGV4KSkKKyAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBMb2NhbENhbGMgbG9jYWxD
YWxjKCp0aGlzLCBibG9jayk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaW5zdEluZGV4
ID0gQWRhcHRlcjo6YmxvY2tTaXplKGJsb2NrKTsgaW5zdEluZGV4LS07KQorICAgICAgICAgICAg
ICAgICAgICBsb2NhbENhbGMuZXhlY3V0ZShpbnN0SW5kZXgpOworCisgICAgICAgICAgICAgICAg
Ly8gSGFuZGxlIHRoZSBlYXJseSBkZWYncyBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uCisgICAg
ICAgICAgICAgICAgQWRhcHRlcjo6Zm9yRWFjaEVhcmx5RGVmKAorICAgICAgICAgICAgICAgICAg
ICBibG9jaywgMCwKKyAgICAgICAgICAgICAgICAgICAgWyZdICh1bnNpZ25lZCBpbmRleCkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgbV93b3Jrc2V0LnJlbW92ZShpbmRleCk7CisgICAgICAg
ICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgSW5kZXhWZWN0b3ImIGxpdmVBdEhl
YWQgPSBtX2xpdmVBdEhlYWRbYmxvY2tdOworCisgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBj
YXJlIGFib3V0IFRtcHMgdGhhdCB3ZXJlIGRpc2NvdmVyZWQgaW4gdGhpcyBpdGVyYXRpb24uIEl0
IGlzIGltcG9zc2libGUKKyAgICAgICAgICAgICAgICAvLyB0byByZW1vdmUgYSBsaXZlIHZhbHVl
IGZyb20gdGhlIGhlYWQuCisgICAgICAgICAgICAgICAgLy8gV2UgcmVtb3ZlIGFsbCB0aGUgdmFs
dWVzIHdlIGFscmVhZHkga25ldyBhYm91dCBzbyB0aGF0IHdlIG9ubHkgaGF2ZSB0byBkZWFsIHdp
dGgKKyAgICAgICAgICAgICAgICAvLyB3aGF0IGlzIG5ldyBpbiBMaXZlQXRIZWFkLgorICAgICAg
ICAgICAgICAgIGlmIChtX3dvcmtzZXQuc2l6ZSgpID09IGxpdmVBdEhlYWQuc2l6ZSgpKQorICAg
ICAgICAgICAgICAgICAgICBtX3dvcmtzZXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlbHNl
IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBsaXZlSW5kZXhBdEhlYWQgOiBs
aXZlQXRIZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgbV93b3Jrc2V0LnJlbW92ZShsaXZl
SW5kZXhBdEhlYWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICht
X3dvcmtzZXQuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICAgICAgICAgIGxpdmVBdEhlYWQucmVzZXJ2ZUNhcGFjaXR5KGxpdmVBdEhlYWQuc2l6ZSgp
ICsgbV93b3Jrc2V0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBuZXdW
YWx1ZSA6IG1fd29ya3NldCkKKyAgICAgICAgICAgICAgICAgICAgbGl2ZUF0SGVhZC51bmNoZWNr
ZWRBcHBlbmQobmV3VmFsdWUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1f
d29ya3NldC5zb3J0KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICh0
eXBlbmFtZSBDRkc6Ok5vZGUgcHJlZGVjZXNzb3IgOiBtX2NmZy5wcmVkZWNlc3NvcnMoYmxvY2sp
KSB7CisgICAgICAgICAgICAgICAgICAgIEluZGV4VmVjdG9yJiBsaXZlQXRUYWlsID0gbV9saXZl
QXRUYWlsW3ByZWRlY2Vzc29yXTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgIGlmIChsaXZlQXRUYWlsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IGxpdmVBdFRhaWwgPSBtX3dvcmtzZXQudmFsdWVzKCk7CisgICAgICAgICAgICAgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VCdWZmZXIucmVzaXplKGxpdmVBdFRh
aWwuc2l6ZSgpICsgbV93b3Jrc2V0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBh
dXRvIGl0ZXIgPSBtZXJnZURlZHVwbGljYXRlZFNvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBsaXZlQXRUYWlsLmJlZ2luKCksIGxpdmVBdFRhaWwuZW5kKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbV93b3Jrc2V0LmJlZ2luKCksIG1fd29ya3NldC5lbmQoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZUJ1ZmZlci5iZWdpbigpKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG1lcmdlQnVmZmVyLnJlc2l6ZShpdGVyIC0gbWVyZ2VCdWZmZXIuYmVn
aW4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChtZXJnZUJ1ZmZlci5zaXplKCkgPT0gbGl2ZUF0VGFpbC5zaXplKCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQobWVyZ2VCdWZmZXIuc2l6ZSgpID4gbGl2
ZUF0VGFpbC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUF0VGFpbCA9IG1l
cmdlQnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICBkaXJ0eUJsb2Nrcy5xdWlja1NldChwcmVkZWNlc3Nvci0+aW5k
ZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7CisgICAgfQor
CisgICAgLy8gVGhpcyBjYWxjdWxhdG9yIGhhcyB0byBiZSBydW4gaW4gcmV2ZXJzZS4KKyAgICBj
bGFzcyBMb2NhbENhbGMgeworICAgIHB1YmxpYzoKKyAgICAgICAgTG9jYWxDYWxjKExpdmVuZXNz
JiBsaXZlbmVzcywgdHlwZW5hbWUgQ0ZHOjpOb2RlIGJsb2NrKQorICAgICAgICAgICAgOiBtX2xp
dmVuZXNzKGxpdmVuZXNzKQorICAgICAgICAgICAgLCBtX2Jsb2NrKGJsb2NrKQorICAgICAgICB7
CisgICAgICAgICAgICBhdXRvJiB3b3Jrc2V0ID0gbGl2ZW5lc3MubV93b3Jrc2V0OworICAgICAg
ICAgICAgd29ya3NldC5jbGVhcigpOworICAgICAgICAgICAgSW5kZXhWZWN0b3ImIGxpdmVBdFRh
aWwgPSBsaXZlbmVzcy5tX2xpdmVBdFRhaWxbYmxvY2tdOworICAgICAgICAgICAgZm9yICh1bnNp
Z25lZCBpbmRleCA6IGxpdmVBdFRhaWwpCisgICAgICAgICAgICAgICAgd29ya3NldC5hZGQoaW5k
ZXgpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgSXRlcmFibGUgeworICAgICAgICBwdWJs
aWM6CisgICAgICAgICAgICBJdGVyYWJsZShMaXZlbmVzcyYgbGl2ZW5lc3MpCisgICAgICAgICAg
ICAgICAgOiBtX2xpdmVuZXNzKGxpdmVuZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgICAgICBwdWJsaWM6Cisg
ICAgICAgICAgICAgICAgaXRlcmF0b3IoQWRhcHRlciYgYWRhcHRlciwgSW5kZXhTcGFyc2VTZXQ8
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+Ojpjb25zdF9pdGVyYXRvciBzcGFyY2VTZXRJdGVyYXRvcikK
KyAgICAgICAgICAgICAgICAgICAgOiBtX2FkYXB0ZXIoYWRhcHRlcikKKyAgICAgICAgICAgICAg
ICAgICAgLCBtX3NwYXJjZVNldEl0ZXJhdG9yKHNwYXJjZVNldEl0ZXJhdG9yKQorICAgICAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpdGVyYXRvciYg
b3BlcmF0b3IrKygpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK21f
c3BhcmNlU2V0SXRlcmF0b3I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBBZGFwdGVyOjpUaGlu
ZyBvcGVyYXRvciooKSBjb25zdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIG1fYWRhcHRlci5pbmRleFRvVmFsdWUoKm1fc3BhcmNlU2V0SXRlcmF0b3IpOwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBpdGVyYXRvciYgb3RoZXIpIHsgcmV0dXJuIG1fc3BhcmNlU2V0SXRlcmF0b3IgPT0gb3RoZXIu
bV9zcGFyY2VTZXRJdGVyYXRvcjsgfQorICAgICAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShj
b25zdCBpdGVyYXRvciYgb3RoZXIpIHsgcmV0dXJuIG1fc3BhcmNlU2V0SXRlcmF0b3IgIT0gb3Ro
ZXIubV9zcGFyY2VTZXRJdGVyYXRvcjsgfQorCisgICAgICAgICAgICBwcml2YXRlOgorICAgICAg
ICAgICAgICAgIEFkYXB0ZXImIG1fYWRhcHRlcjsKKyAgICAgICAgICAgICAgICBJbmRleFNwYXJz
ZVNldDxVbnNhZmVWZWN0b3JPdmVyZmxvdz46OmNvbnN0X2l0ZXJhdG9yIG1fc3BhcmNlU2V0SXRl
cmF0b3I7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNv
bnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fbGl2ZW5lc3MsIG1fbGl2ZW5lc3MubV93b3Jrc2V0LmJl
Z2luKCkpOyB9CisgICAgICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVy
YXRvcihtX2xpdmVuZXNzLCBtX2xpdmVuZXNzLm1fd29ya3NldC5lbmQoKSk7IH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCB0eXBlbmFtZSBBZGFwdGVyOjpU
aGluZyYgdGhpbmcpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG1fbGl2ZW5lc3MubV93b3Jrc2V0LmNvbnRhaW5zKEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGlu
ZykpOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBMaXZl
bmVzcyYgbV9saXZlbmVzczsKKyAgICAgICAgfTsKKworICAgICAgICBJdGVyYWJsZSBsaXZlKCkg
Y29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlKG1fbGl2ZW5lc3Mp
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBpc0xpdmUoY29uc3QgdHlwZW5hbWUgQWRhcHRl
cjo6VGhpbmcmIHRoaW5nKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGl2
ZSgpLmNvbnRhaW5zKHRoaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZXhlY3V0ZSh1
bnNpZ25lZCBpbnN0SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8mIHdvcmtzZXQg
PSBtX2xpdmVuZXNzLm1fd29ya3NldDsKKworICAgICAgICAgICAgLy8gRmlyc3QgaGFuZGxlIHRo
ZSBlYXJseSBkZWYncyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgIG1fbGl2
ZW5lc3MuZm9yRWFjaEVhcmx5RGVmKAorICAgICAgICAgICAgICAgIG1fYmxvY2ssIGluc3RJbmRl
eCArIDEsCisgICAgICAgICAgICAgICAgWyZdICh1bnNpZ25lZCBpbmRleCkgeworICAgICAgICAg
ICAgICAgICAgICB3b3Jrc2V0LnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoZW4gaGFuZGxlIGRlZidzLgorICAgICAgICAg
ICAgbV9saXZlbmVzcy5mb3JFYWNoTGF0ZURlZigKKyAgICAgICAgICAgICAgICBtX2Jsb2NrLCBp
bnN0SW5kZXgsCisgICAgICAgICAgICAgICAgWyZdICh1bnNpZ25lZCBpbmRleCkgeworICAgICAg
ICAgICAgICAgICAgICB3b3Jrc2V0LnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgfSk7
CisKKyAgICAgICAgICAgIC8vIFRoZW4gaGFuZGxlIHVzZSdzLgorICAgICAgICAgICAgbV9saXZl
bmVzcy5mb3JFYWNoRWFybHlVc2UoCisgICAgICAgICAgICAgICAgbV9ibG9jaywgaW5zdEluZGV4
LAorICAgICAgICAgICAgICAgIFsmXSAodW5zaWduZWQgaW5kZXgpIHsKKyAgICAgICAgICAgICAg
ICAgICAgd29ya3NldC5hZGQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAg
ICAgICAvLyBBbmQgZmluYWxseSwgaGFuZGxlIHRoZSBsYXRlIHVzZSdzIG9mIHRoZSBwcmV2aW91
cyBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgIG1fbGl2ZW5lc3MuZm9yRWFjaExhdGVVc2UoCisg
ICAgICAgICAgICAgICAgbV9ibG9jaywgaW5zdEluZGV4IC0gMSwKKyAgICAgICAgICAgICAgICBb
Jl0gKHVuc2lnbmVkIGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmtzZXQuYWRkKGlu
ZGV4KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICBwcml2
YXRlOgorICAgICAgICBMaXZlbmVzcyYgbV9saXZlbmVzczsKKyAgICAgICAgdHlwZW5hbWUgQ0ZH
OjpOb2RlIG1fYmxvY2s7CisgICAgfTsKKworICAgIGNvbnN0IEluZGV4VmVjdG9yJiByYXdMaXZl
QXRIZWFkKHR5cGVuYW1lIENGRzo6Tm9kZSBibG9jaykKKyAgICB7CisgICAgICAgIHJldHVybiBt
X2xpdmVBdEhlYWRbYmxvY2tdOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFVuZGVy
bHlpbmdJdGVyYWJsZT4KKyAgICBjbGFzcyBJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAg
ICBJdGVyYWJsZShMaXZlbmVzcyYgbGl2ZW5lc3MsIGNvbnN0IFVuZGVybHlpbmdJdGVyYWJsZSYg
aXRlcmFibGUpCisgICAgICAgICAgICA6IG1fbGl2ZW5lc3MobGl2ZW5lc3MpCisgICAgICAgICAg
ICAsIG1faXRlcmFibGUoaXRlcmFibGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAg
IGNsYXNzIGl0ZXJhdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3Io
KQorICAgICAgICAgICAgICAgIDogbV9saXZlbmVzcyhudWxscHRyKQorICAgICAgICAgICAgICAg
ICwgbV9pdGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgaXRlcmF0b3IoTGl2ZW5lc3MmIGxpdmVuZXNzLCB0eXBlbmFtZSBVbmRlcmx5
aW5nSXRlcmFibGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2xp
dmVuZXNzKCZsaXZlbmVzcykKKyAgICAgICAgICAgICAgICAsIG1faXRlcihpdGVyKQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0eXBlbmFtZSBBZGFwdGVyOjpU
aGluZyBvcGVyYXRvciooKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBt
X2xpdmVuZXNzLT5pbmRleFRvVmFsdWUoKm1faXRlcik7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICArK21faXRlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIp
IGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fbGl2ZW5lc3Mg
PT0gb3RoZXIubV9saXZlbmVzcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faXRlciA9PSBv
dGhlci5tX2l0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICAgICAgfQorCisgICAgICAg
IHByaXZhdGU6CisgICAgICAgICAgICBMaXZlbmVzcyogbV9saXZlbmVzczsKKyAgICAgICAgICAg
IHR5cGVuYW1lIFVuZGVybHlpbmdJdGVyYWJsZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAg
ICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0
b3IobV9saXZlbmVzcywgbV9pdGVyYWJsZS5iZWdpbigpKTsgfQorICAgICAgICBpdGVyYXRvciBl
bmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2xpdmVuZXNzLCBtX2l0ZXJhYmxlLmVuZCgp
KTsgfQorCisgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgdHlwZW5hbWUgQWRhcHRlcjo6VGhp
bmcmIHRoaW5nKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9saXZlbmVz
cy5tX3dvcmtzZXQuY29udGFpbnMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7CisgICAg
ICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIExpdmVuZXNzJiBtX2xpdmVuZXNzOworICAg
ICAgICBjb25zdCBVbmRlcmx5aW5nSXRlcmFibGUmIG1faXRlcmFibGU7CisgICAgfTsKKworICAg
IEl0ZXJhYmxlPEluZGV4VmVjdG9yPiBsaXZlQXRIZWFkKHR5cGVuYW1lIENGRzo6Tm9kZSBibG9j
aykKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZTxJbmRleFZlY3Rvcj4oKnRoaXMsIG1f
bGl2ZUF0SGVhZFtibG9ja10pOworICAgIH0KKworICAgIEl0ZXJhYmxlPEluZGV4VmVjdG9yPiBs
aXZlQXRUYWlsKHR5cGVuYW1lIENGRzo6Tm9kZSBibG9jaykKKyAgICB7CisgICAgICAgIHJldHVy
biBJdGVyYWJsZTxJbmRleFZlY3Rvcj4oKnRoaXMsIG1fbGl2ZUF0VGFpbFtibG9ja10pOworICAg
IH0KKworICAgIEluZGV4U3BhcnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJmbG93PiYgd29ya3NldCgp
IHsgcmV0dXJuIG1fd29ya3NldDsgfQorICAgIAorICAgIGNsYXNzIExpdmVBdEhlYWQgeworICAg
IHB1YmxpYzoKKyAgICAgICAgTGl2ZUF0SGVhZChMaXZlbmVzcyYgbGl2ZW5lc3MpCisgICAgICAg
ICAgICA6IG1fbGl2ZW5lc3MobGl2ZW5lc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgYmxvY2tJbmRleCA9IG1fbGl2ZW5lc3MubV9jZmcubnVtTm9kZXMoKTsgYmxvY2tJ
bmRleC0tOykgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIENGRzo6Tm9kZSBibG9jayA9IG1f
bGl2ZW5lc3MubV9jZmcubm9kZShibG9ja0luZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJs
b2NrKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBzdGQ6OnNvcnQobV9saXZlbmVzcy5tX2xpdmVBdEhlYWRbYmxvY2tdLmJl
Z2luKCksIG1fbGl2ZW5lc3MubV9saXZlQXRIZWFkW2Jsb2NrXS5lbmQoKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2wgaXNMaXZlQXRIZWFkKHR5cGVu
YW1lIENGRzo6Tm9kZSBibG9jaywgY29uc3QgdHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5n
KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISF0cnlCaW5hcnlTZWFyY2g8dW5zaWdu
ZWQ+KG1fbGl2ZW5lc3MubV9saXZlQXRIZWFkW2Jsb2NrXSwgbV9saXZlbmVzcy5tX2xpdmVBdEhl
YWRbYmxvY2tdLnNpemUoKSwgbV9saXZlbmVzcy52YWx1ZVRvSW5kZXgodGhpbmcpLCBbXSAodW5z
aWduZWQqIHZhbHVlKSB7IHJldHVybiAqdmFsdWU7IH0pOworICAgICAgICB9CisgICAgICAgIAor
ICAgIHByaXZhdGU6CisgICAgICAgIExpdmVuZXNzJiBtX2xpdmVuZXNzOworICAgIH07CisgICAg
CisgICAgTGl2ZUF0SGVhZCBsaXZlQXRIZWFkKCkgeyByZXR1cm4gTGl2ZUF0SGVhZCgqdGhpcyk7
IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTG9jYWxDYWxjOworICAgIGZyaWVuZCBj
bGFzcyBMb2NhbENhbGM6Okl0ZXJhYmxlOworCisgICAgQ0ZHJiBtX2NmZzsKKyAgICBJbmRleFNw
YXJzZVNldDxVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV93b3Jrc2V0OworICAgIHR5cGVuYW1lIENG
Rzo6dGVtcGxhdGUgTWFwPEluZGV4VmVjdG9yPiBtX2xpdmVBdEhlYWQ7CisgICAgdHlwZW5hbWUg
Q0ZHOjp0ZW1wbGF0ZSBNYXA8SW5kZXhWZWN0b3I+IG1fbGl2ZUF0VGFpbDsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdURgorCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>305443</attachid>
            <date>2017-03-26 19:34:40 -0700</date>
            <delta_ts>2017-03-26 21:02:44 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>62242</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjE0NDA5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDkwIEBA
CisyMDE3LTAzLTI2ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
QjM6OmZpeFNTQSBzaG91bGQgZG8gbGl2ZW5lc3MgcHJ1bmluZworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcwMTExCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIG1vdmVzIGFsbCBvZiB0
aGUgbG9naWMgb2YgQWlyOjpMaXZlbmVzczw+IHRvIFdURjo6TGl2ZW5lc3M8PiBhbmQgdGhlbiB1
c2VzIHRoYXQgdG8KKyAgICAgICAgY3JlYXRlIEIzOjpWYXJpYWJsZUxpdmVuZXNzLiBUaGVuIHRo
aXMgdXNlcyBWYXJpYWJsZUxpdmVuZXNzOjpMaXZlQXRIZWFkIHRvIHBydW5lIFBoaQorICAgICAg
ICBjb25zdHJ1Y3Rpb24uCisgICAgICAgIAorICAgICAgICBUaGlzIG1ha2VzIEIzOjpmaXhTU0Eg
cnVuIHR3aWNlIGFzIGZhc3QuIFRoaXMgaXMgYSAxMyUgcHJvZ3Jlc3Npb24gb24gV2FzbUJlbmNo
IGNvbXBpbGUKKyAgICAgICAgdGltZXMuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAg
ICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAg
ICAqIGIzL0IzQmFzaWNCbG9jay5oOgorICAgICAgICAoSlNDOjpCMzo6QmFzaWNCbG9jazo6Z2V0
KToKKyAgICAgICAgKiBiMy9CM0ZpeFNTQS5jcHA6CisgICAgICAgIChKU0M6OkIzOjpmaXhTU0Ep
OgorICAgICAgICAqIGIzL0IzVmFyaWFibGVMaXZlbmVzcy5jcHA6IEFkZGVkLgorICAgICAgICAo
SlNDOjpCMzo6VmFyaWFibGVMaXZlbmVzczo6VmFyaWFibGVMaXZlbmVzcyk6CisgICAgICAgIChK
U0M6OkIzOjpWYXJpYWJsZUxpdmVuZXNzOjp+VmFyaWFibGVMaXZlbmVzcyk6CisgICAgICAgICog
YjMvQjNWYXJpYWJsZUxpdmVuZXNzLmg6IEFkZGVkLgorICAgICAgICAoSlNDOjpCMzo6VmFyaWFi
bGVMaXZlbmVzc0FkYXB0ZXI6OlZhcmlhYmxlTGl2ZW5lc3NBZGFwdGVyKToKKyAgICAgICAgKEpT
Qzo6QjM6OlZhcmlhYmxlTGl2ZW5lc3NBZGFwdGVyOjpudW1JbmRpY2VzKToKKyAgICAgICAgKEpT
Qzo6QjM6OlZhcmlhYmxlTGl2ZW5lc3NBZGFwdGVyOjp2YWx1ZVRvSW5kZXgpOgorICAgICAgICAo
SlNDOjpCMzo6VmFyaWFibGVMaXZlbmVzc0FkYXB0ZXI6OmluZGV4VG9WYWx1ZSk6CisgICAgICAg
IChKU0M6OkIzOjpWYXJpYWJsZUxpdmVuZXNzQWRhcHRlcjo6YmxvY2tTaXplKToKKyAgICAgICAg
KEpTQzo6QjM6OlZhcmlhYmxlTGl2ZW5lc3NBZGFwdGVyOjpmb3JFYWNoRWFybHlVc2UpOgorICAg
ICAgICAoSlNDOjpCMzo6VmFyaWFibGVMaXZlbmVzc0FkYXB0ZXI6OmZvckVhY2hMYXRlVXNlKToK
KyAgICAgICAgKEpTQzo6QjM6OlZhcmlhYmxlTGl2ZW5lc3NBZGFwdGVyOjpmb3JFYWNoRWFybHlE
ZWYpOgorICAgICAgICAoSlNDOjpCMzo6VmFyaWFibGVMaXZlbmVzc0FkYXB0ZXI6OmZvckVhY2hM
YXRlRGVmKToKKyAgICAgICAgKiBiMy9haXIvQWlyQ0ZHLmg6IEFkZGVkLgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpDRkc6OkNGRyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNGRzo6cm9vdCk6
CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNGRzo6bmV3TWFwKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6Q0ZHOjpzdWNjZXNzb3JzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q0ZHOjpwcmVk
ZWNlc3NvcnMpOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDRkc6OmluZGV4KToKKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6Q0ZHOjpub2RlKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6Q0ZHOjpu
dW1Ob2Rlcyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OkNGRzo6ZHVtcCk6CisgICAgICAgICog
YjMvYWlyL0FpckNvZGUuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2RlOjpDb2RlKToK
KyAgICAgICAgKiBiMy9haXIvQWlyQ29kZS5oOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpDb2Rl
OjpjZmcpOgorICAgICAgICAqIGIzL2Fpci9BaXJMaXZlbmVzcy5oOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpMaXZlbmVzc0FkYXB0ZXI6OkxpdmVuZXNzQWRhcHRlcik6CisgICAgICAgIChKU0M6
OkIzOjpBaXI6OkxpdmVuZXNzQWRhcHRlcjo6YmxvY2tTaXplKToKKyAgICAgICAgKEpTQzo6QjM6
OkFpcjo6TGl2ZW5lc3NBZGFwdGVyOjpmb3JFYWNoRWFybHlVc2UpOgorICAgICAgICAoSlNDOjpC
Mzo6QWlyOjpMaXZlbmVzc0FkYXB0ZXI6OmZvckVhY2hMYXRlVXNlKToKKyAgICAgICAgKEpTQzo6
QjM6OkFpcjo6TGl2ZW5lc3NBZGFwdGVyOjpmb3JFYWNoRWFybHlEZWYpOgorICAgICAgICAoSlND
OjpCMzo6QWlyOjpMaXZlbmVzc0FkYXB0ZXI6OmZvckVhY2hMYXRlRGVmKToKKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6VG1wTGl2ZW5lc3NBZGFwdGVyOjpUbXBMaXZlbmVzc0FkYXB0ZXIpOgorICAg
ICAgICAoSlNDOjpCMzo6QWlyOjpUbXBMaXZlbmVzc0FkYXB0ZXI6Om51bUluZGljZXMpOgorICAg
ICAgICAoSlNDOjpCMzo6QWlyOjpTdGFja1Nsb3RMaXZlbmVzc0FkYXB0ZXI6OlN0YWNrU2xvdExp
dmVuZXNzQWRhcHRlcik6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlN0YWNrU2xvdExpdmVuZXNz
QWRhcHRlcjo6bnVtSW5kaWNlcyk6CisgICAgICAgIChKU0M6OkIzOjpBaXI6OlN0YWNrU2xvdExp
dmVuZXNzQWRhcHRlcjo6aW5kZXhUb1ZhbHVlKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2
ZW5lc3M6OkxpdmVuZXNzKToKKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2Fs
Q2FsYzo6TG9jYWxDYWxjKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5l
c3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Okl0ZXJhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjppdGVy
YXRvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpMb2NhbENh
bGM6Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3BlcmF0b3IrKyk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3Bl
cmF0b3IqKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2Fs
Q2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvcj09KTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjpv
cGVyYXRvciE9KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6Okxv
Y2FsQ2FsYzo6SXRlcmFibGU6OmJlZ2luKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6OmVuZCk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxlOjpjb250YWlucyk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpMb2NhbENhbGM6Omxp
dmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6TG9jYWxDYWxj
Ojppc0xpdmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6TG9j
YWxDYWxjOjpleGVjdXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5l
c3M6OnJhd0xpdmVBdEhlYWQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZl
bmVzczo6SXRlcmFibGU6Okl0ZXJhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFp
cjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjppdGVyYXRvcjo6aXRlcmF0b3IpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6SXRlcmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRv
ciopOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6SXRlcmFibGU6
Oml0ZXJhdG9yOjpvcGVyYXRvcisrKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6
TGl2ZW5lc3M6Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3BlcmF0b3I9PSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNzOjpJdGVyYWJsZTo6aXRlcmF0b3I6Om9wZXJhdG9y
IT0pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6SXRlcmFibGU6
OmJlZ2luKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5lc3M6Okl0ZXJh
YmxlOjplbmQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVzczo6SXRl
cmFibGU6OmNvbnRhaW5zKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6TGl2ZW5l
c3M6OmxpdmVBdEhlYWQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpMaXZlbmVz
czo6bGl2ZUF0VGFpbCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkIzOjpBaXI6OkxpdmVuZXNz
Ojp3b3Jrc2V0KTogRGVsZXRlZC4KKwogMjAxNy0wMy0yNSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9A
YXBwbGUuY29tPgogCiAgICAgICAgIEFpcjo6TGl2ZW5lc3Mgc2hvdWxkbid0IG5lZWQgSGFzaFNl
dHMKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDIxNDQw
OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBjb3B5
KQpAQCAtMTgwLDYgKzE4MCw3IEBAIHNldChKYXZhU2NyaXB0Q29yZV9TT1VSQ0VTCiAgICAgYjMv
QjNWYWx1ZUtleS5jcHAKICAgICBiMy9CM1ZhbHVlUmVwLmNwcAogICAgIGIzL0IzVmFyaWFibGUu
Y3BwCisgICAgYjMvQjNWYXJpYWJsZUxpdmVuZXNzLmNwcAogICAgIGIzL0IzVmFyaWFibGVWYWx1
ZS5jcHAKICAgICBiMy9CM1dhc21BZGRyZXNzVmFsdWUuY3BwCiAgICAgYjMvQjNXYXNtQm91bmRz
Q2hlY2tWYWx1ZS5jcHAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biAyMTQ0MDkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTAwNyw2ICsxMDA3LDkgQEAK
IAkJMEZGNDI3NjUxNTkxQTFDRTAwNENCOUZGIC8qIERGR0Rpc2Fzc2VtYmxlci5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGNDI3NjIxNTkxQTFDOTAw
NENCOUZGIC8qIERGR0Rpc2Fzc2VtYmxlci5oICovOyB9OwogCQkwRkY0QjRCQzFFODg0NDk3MDBE
QkJFODYgLyogQWlyUmVnTGl2ZW5lc3MuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMEZGNEI0QkExRTg4NDQ5NTAwREJCRTg2IC8qIEFpclJlZ0xpdmVu
ZXNzLmNwcCAqLzsgfTsKIAkJMEZGNEI0QkQxRTg4NDQ5QTAwREJCRTg2IC8qIEFpclJlZ0xpdmVu
ZXNzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY0
QjRCQjFFODg0NDk1MDBEQkJFODYgLyogQWlyUmVnTGl2ZW5lc3MuaCAqLzsgfTsKKwkJMEZGNEI0
QzcxRTg4OTNDNTAwREJCRTg2IC8qIEFpckNGRy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEZGNEI0QzYxRTg4OTNCRjAwREJCRTg2IC8qIEFpckNGRy5o
ICovOyB9OworCQkwRkY0QjRDQTFFODg5RDdCMDBEQkJFODYgLyogQjNWYXJpYWJsZUxpdmVuZXNz
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRjRC
NEM4MUU4ODlENzgwMERCQkU4NiAvKiBCM1ZhcmlhYmxlTGl2ZW5lc3MuY3BwICovOyB9OworCQkw
RkY0QjRDQjFFODg5RDdFMDBEQkJFODYgLyogQjNWYXJpYWJsZUxpdmVuZXNzLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY0QjRDOTFFODg5RDc4MDBE
QkJFODYgLyogQjNWYXJpYWJsZUxpdmVuZXNzLmggKi87IH07CiAJCTBGRjYwQUMyMTY3NDBGODMw
MDAyOTc3OSAvKiBSZWR1Y2VXaGl0ZXNwYWNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY2MEFDMDE2NzQwRjgxMDAwMjk3NzkgLyogUmVkdWNlV2hp
dGVzcGFjZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07
CiAJCTBGRjYwQUMzMTY3NDBGODgwMDAyOTc3OSAvKiBSZWR1Y2VXaGl0ZXNwYWNlLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRjYwQUJGMTY3NDBG
ODEwMDAyOTc3OSAvKiBSZWR1Y2VXaGl0ZXNwYWNlLmNwcCAqLzsgfTsKIAkJMEZGNzE2OEMxNUEz
QjIzNTAwOEY1REFBIC8qIFByb3BlcnR5T2Zmc2V0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkY3MTY4QTE1QTNCMjMxMDA4RjVEQUEgLyogUHJvcGVy
dHlPZmZzZXQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OwpAQCAtMzUyNCw2ICszNTI3LDkgQEAKIAkJMEZGNDI3NjIxNTkxQTFDOTAwNENCOUZGIC8qIERG
R0Rpc2Fzc2VtYmxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdEaXNh
c3NlbWJsZXIuaDsgcGF0aCA9IGRmZy9ERkdEaXNhc3NlbWJsZXIuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJMEZGNEI0QkExRTg4NDQ5NTAwREJCRTg2IC8qIEFpclJlZ0xpdmVuZXNz
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEFpclJlZ0xpdmVuZXNz
LmNwcDsgcGF0aCA9IGIzL2Fpci9BaXJSZWdMaXZlbmVzcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTBGRjRCNEJCMUU4ODQ0OTUwMERCQkU4NiAvKiBBaXJSZWdMaXZlbmVzcy5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBaXJSZWdMaXZlbmVzcy5oOyBwYXRo
ID0gYjMvYWlyL0FpclJlZ0xpdmVuZXNzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTBGRjRCNEM2MUU4ODkzQkYwMERCQkU4NiAvKiBBaXJDRkcuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gQWlyQ0ZHLmg7IHBhdGggPSBiMy9haXIvQWlyQ0ZHLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGRjRCNEM4MUU4ODlENzgwMERCQkU4NiAvKiBCM1Zhcmlh
YmxlTGl2ZW5lc3MuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQjNW
YXJpYWJsZUxpdmVuZXNzLmNwcDsgcGF0aCA9IGIzL0IzVmFyaWFibGVMaXZlbmVzcy5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGRjRCNEM5MUU4ODlENzgwMERCQkU4NiAvKiBC
M1ZhcmlhYmxlTGl2ZW5lc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQjNW
YXJpYWJsZUxpdmVuZXNzLmg7IHBhdGggPSBiMy9CM1ZhcmlhYmxlTGl2ZW5lc3MuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZGNjBBQkYxNjc0MEY4MTAwMDI5Nzc5IC8qIFJlZHVj
ZVdoaXRlc3BhY2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVk
dWNlV2hpdGVzcGFjZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRjYwQUMw
MTY3NDBGODEwMDAyOTc3OSAvKiBSZWR1Y2VXaGl0ZXNwYWNlLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IFJlZHVjZVdoaXRlc3BhY2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJMEZGNzE2OEExNUEzQjIzMTAwOEY1REFBIC8qIFByb3BlcnR5T2Zmc2V0LmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFByb3BlcnR5T2Zmc2V0Lmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC01NTA0LDYgKzU1MTAsOCBAQAogCQkJCTBGRUM4NEZEMUJE
QUNEQUMwMDgwRkY3NCAvKiBCM1ZhbHVlUmVwLmggKi8sCiAJCQkJMEYyQkJEOTIxQzVGRjNGNTAw
MjNFRjIzIC8qIEIzVmFyaWFibGUuY3BwICovLAogCQkJCTBGMkJCRDkzMUM1RkYzRjUwMDIzRUYy
MyAvKiBCM1ZhcmlhYmxlLmggKi8sCisJCQkJMEZGNEI0QzgxRTg4OUQ3ODAwREJCRTg2IC8qIEIz
VmFyaWFibGVMaXZlbmVzcy5jcHAgKi8sCisJCQkJMEZGNEI0QzkxRTg4OUQ3ODAwREJCRTg2IC8q
IEIzVmFyaWFibGVMaXZlbmVzcy5oICovLAogCQkJCTBGMkJCRDk0MUM1RkYzRjUwMDIzRUYyMyAv
KiBCM1ZhcmlhYmxlVmFsdWUuY3BwICovLAogCQkJCTBGMkJCRDk1MUM1RkYzRjUwMDIzRUYyMyAv
KiBCM1ZhcmlhYmxlVmFsdWUuaCAqLywKIAkJCQk1M0Q0NDRERDFEQUYwOUEwMDBCOTI3ODQgLyog
QjNXYXNtQWRkcmVzc1ZhbHVlLmNwcCAqLywKQEAgLTU1MzgsNiArNTU0Niw3IEBACiAJCQkJMEY2
MTgzMjExQzQ1QkYwNzAwNzI0NTBCIC8qIEFpckNDYWxsaW5nQ29udmVudGlvbi5oICovLAogCQkJ
CTBGRUM4NTRFMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJDQ2FsbFNwZWNpYWwuY3BwICovLAogCQkJ
CTBGRUM4NTRGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJDQ2FsbFNwZWNpYWwuaCAqLywKKwkJCQkw
RkY0QjRDNjFFODg5M0JGMDBEQkJFODYgLyogQWlyQ0ZHLmggKi8sCiAJCQkJMEZFQzg1NTAxQkRB
Q0RDNzAwODBGRjc0IC8qIEFpckNvZGUuY3BwICovLAogCQkJCTBGRUM4NTUxMUJEQUNEQzcwMDgw
RkY3NCAvKiBBaXJDb2RlLmggKi8sCiAJCQkJMEY2MTgzMjIxQzQ1QkYwNzAwNzI0NTBCIC8qIEFp
ckN1c3RvbS5jcHAgKi8sCkBAIC04NTQ3LDYgKzg1NTYsNyBAQAogCQkJCUJDMDJFOTBGMEUxODM5
REIwMDBGOTI5NyAvKiBFcnJvclByb3RvdHlwZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTk2Qjcz
MUIxQkRBMDhEMTAwMzMxQjg0IC8qIEVycm9yUHJvdG90eXBlLmx1dC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMTRBRDkxMEMxRENBOTI5NDAwMTRGOUZFIC8qIEV2YWxDb2RlQmxvY2suaCBpbiBIZWFk
ZXJzICovLAorCQkJCTBGRjRCNENCMUU4ODlEN0UwMERCQkU4NiAvKiBCM1ZhcmlhYmxlTGl2ZW5l
c3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0NzM0MUQyMURDMDJFMkUwMEFBMjlCQSAvKiBFdmFs
RXhlY3V0YWJsZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTU0OTgyMDQxODkxRDBCMDAwODFFNUI4
IC8qIEV2ZW50TG9vcC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRkUxQzBGRkQxQjE5M0U5ODAwQjUz
RkNBIC8qIEV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCkBAIC04ODQwLDYgKzg4NTAsNyBAQAog
CQkJCUJDMThDNDFFMEUxNkY1Q0QwMEIzNDQ2MCAvKiBKU0NvbnRleHRSZWYuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUE1RUE3MEVFMTlGNUI1QzQwMDk4RjVFQyAvKiBKU0NvbnRleHRSZWZJbnNwZWN0
b3JTdXBwb3J0LmggaW4gSGVhZGVycyAqLywKIAkJCQlBNUQyRTY2NTE5NUUxNzQwMDBBNTE4RTcg
LyogSlNDb250ZXh0UmVmSW50ZXJuYWwuaCBpbiBIZWFkZXJzICovLAorCQkJCTBGRjRCNEM3MUU4
ODkzQzUwMERCQkU4NiAvKiBBaXJDRkcuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0OENEMUQ4MTA4
Q0Y5MDIwMDgxNjNDNiAvKiBKU0NvbnRleHRSZWZQcml2YXRlLmggaW4gSGVhZGVycyAqLywKIAkJ
CQlBNzIwMjhCODE3OTc2MDFFMDA5ODAyOEMgLyogSlNDVGVzdFJ1bm5lclV0aWxzLmggaW4gSGVh
ZGVycyAqLywKIAkJCQk3MkFBRjdDRTFEMEQzMUIzMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJT
ZXR0ZXJGdW5jdGlvbi5oIGluIEhlYWRlcnMgKi8sCkBAIC05OTY0LDYgKzk5NzUsNyBAQAogCQkJ
CTc5NUYwOTlEMUUwMzYwMDUwMEJCRTM3RiAvKiBCM0NvbXBpbGUuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJMEZFQzg1MEQxQkRBQ0RBQzAwODBGRjc0IC8qIEIzQ29uc3QzMlZhbHVlLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTBGRUM4NTBGMUJEQUNEQUMwMDgwRkY3NCAvKiBCM0NvbnN0NjRWYWx1
ZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwRkY0QjRDQTFFODg5RDdCMDBEQkJFODYgLyogQjNW
YXJpYWJsZUxpdmVuZXNzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUM4NTExMUJEQUNEQUMw
MDgwRkY3NCAvKiBCM0NvbnN0RG91YmxlVmFsdWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNDM0
MjJBNjIxQzE1OEU2QTAwRTJFQjk4IC8qIEIzQ29uc3RGbG9hdFZhbHVlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGMzM4REY1MUJFOTNENTUwMDEzQzg4RiAvKiBCM0NvbnN0cmFpbmVkVmFsdWUu
Y3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNCYXNp
Y0Jsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQmFzaWNC
bG9jay5oCShyZXZpc2lvbiAyMTQ0MDkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNC
YXNpY0Jsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTY0LDYgKzY0LDEzIEBAIHB1YmxpYzoKICAg
ICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLnNpemUoKTsgfQogICAgIFZh
bHVlKiBhdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQog
ICAgIFZhbHVlKiYgYXQoc2l6ZV90IGluZGV4KSB7IHJldHVybiBtX3ZhbHVlc1tpbmRleF07IH0K
KyAgICAKKyAgICBWYWx1ZSogZ2V0KHNpemVfdCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAg
IGlmIChpbmRleCA+PSBzaXplKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAg
ICAgcmV0dXJuIGF0KGluZGV4KTsKKyAgICB9CiAKICAgICBWYWx1ZSogbGFzdCgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmxhc3QoKTsgfQogICAgIFZhbHVlKiYgbGFzdCgpIHsgcmV0dXJuIG1f
dmFsdWVzLmxhc3QoKTsgfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzRml4U1NB
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNGaXhTU0EuY3Bw
CShyZXZpc2lvbiAyMTQ0MDkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNGaXhTU0Eu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTYtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJCM1Vwc2lsb25WYWx1
ZS5oIgogI2luY2x1ZGUgIkIzVmFsdWVJbmxpbmVzLmgiCiAjaW5jbHVkZSAiQjNWYXJpYWJsZS5o
IgorI2luY2x1ZGUgIkIzVmFyaWFibGVMaXZlbmVzcy5oIgogI2luY2x1ZGUgIkIzVmFyaWFibGVW
YWx1ZS5oIgogI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KICNpbmNsdWRlIDx3dGYvSW5k
ZXhTZXQuaD4KQEAgLTEzNiw3ICsxMzcsMTAgQEAgYm9vbCBmaXhTU0EoUHJvY2VkdXJlJiBwcm9j
KQogCiAgICAgLy8gV2Uga25vdyB0aGF0IHdlIGhhdmUgdmFyaWFibGVzIHRvIG9wdGltaXplLCBz
byBkbyB0aGF0IG5vdy4KICAgICBicmVha0NyaXRpY2FsRWRnZXMocHJvYyk7Ci0KKyAgICAKKyAg
ICBWYXJpYWJsZUxpdmVuZXNzIGxpdmVuZXNzKHByb2MpOworICAgIFZhcmlhYmxlTGl2ZW5lc3M6
OkxpdmVBdEhlYWQgbGl2ZUF0SGVhZCA9IGxpdmVuZXNzLmxpdmVBdEhlYWQoKTsKKyAgICAKICAg
ICBTU0FDYWxjdWxhdG9yIHNzYShwcm9jKTsKIAogICAgIC8vIENyZWF0ZSBhIFNTQUNhbGN1bGF0
b3I6OlZhcmlhYmxlICgiY2FsY1ZhciIpIGZvciBldmVyeSB2YXJpYWJsZS4KQEAgLTE2Nyw2ICsx
NzEsOSBAQCBib29sIGZpeFNTQShQcm9jZWR1cmUmIHByb2MpCiAgICAgc3NhLmNvbXB1dGVQaGlz
KAogICAgICAgICBbJl0gKFNTQUNhbGN1bGF0b3I6OlZhcmlhYmxlKiBjYWxjVmFyLCBCYXNpY0Js
b2NrKiBibG9jaykgLT4gVmFsdWUqIHsKICAgICAgICAgICAgIFZhcmlhYmxlKiB2YXJpYWJsZSA9
IGNhbGNWYXJUb1ZhcmlhYmxlW2NhbGNWYXItPmluZGV4KCldOworICAgICAgICAgICAgaWYgKCFs
aXZlQXRIZWFkLmlzTGl2ZUF0SGVhZChibG9jaywgdmFyaWFibGUpKQorICAgICAgICAgICAgICAg
IHJldHVybiBudWxscHRyOworICAgICAgICAgICAgCiAgICAgICAgICAgICBWYWx1ZSogcGhpID0g
cHJvYy5hZGQ8VmFsdWU+KFBoaSwgdmFyaWFibGUtPnR5cGUoKSwgYmxvY2stPmF0KDApLT5vcmln
aW4oKSk7CiAgICAgICAgICAgICBpZiAodmVyYm9zZSkgewogICAgICAgICAgICAgICAgIGRhdGFM
b2coCkBAIC0xODIsMTAgKzE4OSw4IEBAIGJvb2wgZml4U1NBKFByb2NlZHVyZSYgcHJvYykKICAg
ICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogcHJvYy5ibG9ja3NJblByZU9yZGVyKCkpIHsKICAg
ICAgICAgbWFwcGluZy5jbGVhcigpOwogCi0gICAgICAgIGZvciAodW5zaWduZWQgaW5kZXggPSBj
YWxjVmFyVG9WYXJpYWJsZS5zaXplKCk7IGluZGV4LS07KSB7Ci0gICAgICAgICAgICBWYXJpYWJs
ZSogdmFyaWFibGUgPSBjYWxjVmFyVG9WYXJpYWJsZVtpbmRleF07Ci0gICAgICAgICAgICBTU0FD
YWxjdWxhdG9yOjpWYXJpYWJsZSogY2FsY1ZhciA9IHNzYS52YXJpYWJsZShpbmRleCk7Ci0KKyAg
ICAgICAgZm9yIChWYXJpYWJsZSogdmFyaWFibGUgOiBsaXZlbmVzcy5saXZlQXRIZWFkKGJsb2Nr
KSkgeworICAgICAgICAgICAgU1NBQ2FsY3VsYXRvcjo6VmFyaWFibGUqIGNhbGNWYXIgPSB2YXJp
YWJsZVRvQ2FsY1Zhclt2YXJpYWJsZV07CiAgICAgICAgICAgICBTU0FDYWxjdWxhdG9yOjpEZWYq
IGRlZiA9IHNzYS5yZWFjaGluZ0RlZkF0SGVhZChibG9jaywgY2FsY1Zhcik7CiAgICAgICAgICAg
ICBpZiAoZGVmKQogICAgICAgICAgICAgICAgIG1hcHBpbmdbdmFyaWFibGVdID0gZGVmLT52YWx1
ZSgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFyaWFibGVMaXZlbmVzcy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFyaWFibGVMaXZl
bmVzcy5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzVmFy
aWFibGVMaXZlbmVzcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJCM1ZhcmlhYmxlTGl2ZW5lc3MuaCIKKworI2lmIEVOQUJMRShCM19KSVQp
CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeworCitWYXJpYWJsZUxpdmVuZXNzOjpW
YXJpYWJsZUxpdmVuZXNzKFByb2NlZHVyZSYgcHJvYykKKyAgICA6IFdURjo6TGl2ZW5lc3M8VmFy
aWFibGVMaXZlbmVzc0FkYXB0ZXI+KHByb2MuY2ZnKCksIHByb2MpCit7Cit9CisKK1ZhcmlhYmxl
TGl2ZW5lc3M6On5WYXJpYWJsZUxpdmVuZXNzKCkKK3sKK30KKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQorCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvQjNWYXJpYWJsZUxpdmVuZXNzLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL0IzVmFyaWFibGVMaXZlbmVzcy5oCShub25leGlzdGVudCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1ZhcmlhYmxlTGl2ZW5lc3MuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKEIzX0pJVCkKKworI2luY2x1ZGUg
IkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzQ0ZHLmgiCisjaW5jbHVkZSAiQjNQcm9jZWR1
cmUuaCIKKyNpbmNsdWRlICJCM1ZhbHVlSW5saW5lcy5oIgorI2luY2x1ZGUgIkIzVmFyaWFibGUu
aCIKKyNpbmNsdWRlICJCM1ZhcmlhYmxlVmFsdWUuaCIKKyNpbmNsdWRlIDx3dGYvTGl2ZW5lc3Mu
aD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7CisKK3N0cnVjdCBWYXJpYWJsZUxp
dmVuZXNzQWRhcHRlciB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBuYW1lID0g
IlZhcmlhYmxlTGl2ZW5lc3MiOworICAgIHR5cGVkZWYgQjM6OkNGRyBDRkc7CisgICAgdHlwZWRl
ZiBWYXJpYWJsZSogVGhpbmc7CisgICAgCisgICAgVmFyaWFibGVMaXZlbmVzc0FkYXB0ZXIoUHJv
Y2VkdXJlJiBwcm9jKQorICAgICAgICA6IHByb2MocHJvYykKKyAgICB7CisgICAgfQorICAgIAor
ICAgIHVuc2lnbmVkIG51bUluZGljZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb2MudmFy
aWFibGVzKCkuc2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgdW5zaWduZWQgdmFsdWVU
b0luZGV4KFZhcmlhYmxlKiB2YXIpIHsgcmV0dXJuIHZhci0+aW5kZXgoKTsgfQorICAgIFZhcmlh
YmxlKiBpbmRleFRvVmFsdWUodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIHByb2MudmFyaWFibGVz
KClbaW5kZXhdOyB9CisgICAgCisgICAgdW5zaWduZWQgYmxvY2tTaXplKEJhc2ljQmxvY2sqIGJs
b2NrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrLT5zaXplKCk7CisgICAgfQorICAgIAor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CisgICAgdm9pZCBmb3JFYWNoRWFybHlVc2UoQmFz
aWNCbG9jayogYmxvY2ssIHVuc2lnbmVkIHZhbHVlSW5kZXgsIGNvbnN0IEZ1bmMmIGZ1bmMpCisg
ICAgeworICAgICAgICBWYWx1ZSogdmFsdWUgPSBibG9jay0+Z2V0KHZhbHVlSW5kZXgpOworICAg
ICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAodmFsdWUt
Pm9wY29kZSgpICE9IEdldCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZnVuYyh2YWx1
ZS0+YXM8VmFyaWFibGVWYWx1ZT4oKS0+dmFyaWFibGUoKS0+aW5kZXgoKSk7CisgICAgfQorICAg
IAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CisgICAgdm9pZCBmb3JFYWNoTGF0ZVVzZShC
YXNpY0Jsb2NrKiwgdW5zaWduZWQsIGNvbnN0IEZ1bmMmKQorICAgIHsKKyAgICB9CisgICAgCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICB2b2lkIGZvckVhY2hFYXJseURlZihCYXNp
Y0Jsb2NrKiwgdW5zaWduZWQsIGNvbnN0IEZ1bmMmKQorICAgIHsKKyAgICB9CisgICAgCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICB2b2lkIGZvckVhY2hMYXRlRGVmKEJhc2ljQmxv
Y2sqIGJsb2NrLCB1bnNpZ25lZCB2YWx1ZUluZGV4LCBjb25zdCBGdW5jJiBmdW5jKQorICAgIHsK
KyAgICAgICAgVmFsdWUqIHZhbHVlID0gYmxvY2stPmdldCh2YWx1ZUluZGV4KTsKKyAgICAgICAg
aWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHZhbHVlLT5vcGNv
ZGUoKSAhPSBTZXQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGZ1bmModmFsdWUtPmFz
PFZhcmlhYmxlVmFsdWU+KCktPnZhcmlhYmxlKCktPmluZGV4KCkpOworICAgIH0KKyAgICAKKyAg
ICBQcm9jZWR1cmUmIHByb2M7Cit9OworCitjbGFzcyBWYXJpYWJsZUxpdmVuZXNzIDogcHVibGlj
IFdURjo6TGl2ZW5lc3M8VmFyaWFibGVMaXZlbmVzc0FkYXB0ZXI+IHsKK3B1YmxpYzoKKyAgICBW
YXJpYWJsZUxpdmVuZXNzKFByb2NlZHVyZSYpOworICAgIH5WYXJpYWJsZUxpdmVuZXNzKCk7Cit9
OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEVOQUJMRShCM19KSVQp
CisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ0ZHLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDRkcuaAkobm9uZXhpc3RlbnQp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckNGRy5oCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoQjNfSklUKQorCisjaW5jbHVkZSAi
QWlyQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkFpckNvZGUuaCIKKyNpbmNsdWRlIDx3dGYvSW5k
ZXhNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSW5kZXhTZXQuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBDRkcgeworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKENGRyk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6
CisgICAgdHlwZWRlZiBCYXNpY0Jsb2NrKiBOb2RlOworICAgIHR5cGVkZWYgSW5kZXhTZXQ8QmFz
aWNCbG9jaz4gU2V0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIE1hcCA9IEluZGV4
TWFwPEJhc2ljQmxvY2ssIFQ+OworICAgIHR5cGVkZWYgVmVjdG9yPEJhc2ljQmxvY2sqLCA0PiBM
aXN0OworCisgICAgQ0ZHKENvZGUmIGNvZGUpCisgICAgICAgIDogbV9jb2RlKGNvZGUpCisgICAg
eworICAgIH0KKworICAgIE5vZGUgcm9vdCgpIHsgcmV0dXJuIG1fY29kZVswXTsgfQorCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBNYXA8VD4gbmV3TWFwKCkgeyByZXR1cm4gSW5kZXhN
YXA8SlNDOjpCMzo6QWlyOjpCYXNpY0Jsb2NrLCBUPihtX2NvZGUuc2l6ZSgpKTsgfQorCisgICAg
U3VjY2Vzc29yQ29sbGVjdGlvbjxCYXNpY0Jsb2NrLCBCYXNpY0Jsb2NrOjpTdWNjZXNzb3JMaXN0
PiBzdWNjZXNzb3JzKE5vZGUgbm9kZSkgeyByZXR1cm4gbm9kZS0+c3VjY2Vzc29yQmxvY2tzKCk7
IH0KKyAgICBCYXNpY0Jsb2NrOjpQcmVkZWNlc3Nvckxpc3QmIHByZWRlY2Vzc29ycyhOb2RlIG5v
ZGUpIHsgcmV0dXJuIG5vZGUtPnByZWRlY2Vzc29ycygpOyB9CisKKyAgICB1bnNpZ25lZCBpbmRl
eChOb2RlIG5vZGUpIGNvbnN0IHsgcmV0dXJuIG5vZGUtPmluZGV4KCk7IH0KKyAgICBOb2RlIG5v
ZGUodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fY29kZVtpbmRleF07IH0KKyAgICB1
bnNpZ25lZCBudW1Ob2RlcygpIGNvbnN0IHsgcmV0dXJuIG1fY29kZS5zaXplKCk7IH0KKworICAg
IFBvaW50ZXJEdW1wPEJhc2ljQmxvY2s+IGR1bXAoTm9kZSBub2RlKSBjb25zdCB7IHJldHVybiBw
b2ludGVyRHVtcChub2RlKTsgfQorCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNv
bnN0CisgICAgeworICAgICAgICBtX2NvZGUuZHVtcChvdXQpOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBDb2RlJiBtX2NvZGU7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWly
CisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJDb2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpckNvZGUuY3BwCShyZXZpc2lvbiAyMTQ0MDkpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckNvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBA
CiAjaWYgRU5BQkxFKEIzX0pJVCkKIAogI2luY2x1ZGUgIkFpckNDYWxsU3BlY2lhbC5oIgorI2lu
Y2x1ZGUgIkFpckNGRy5oIgogI2luY2x1ZGUgIkIzQmFzaWNCbG9ja1V0aWxzLmgiCiAjaW5jbHVk
ZSAiQjNQcm9jZWR1cmUuaCIKICNpbmNsdWRlICJCM1N0YWNrU2xvdC5oIgpAQCAtMzgsNiArMzks
NyBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlCiAKIENvZGU6OkNv
ZGUoUHJvY2VkdXJlJiBwcm9jKQogICAgIDogbV9wcm9jKHByb2MpCisgICAgLCBtX2NmZyhuZXcg
Q0ZHKCp0aGlzKSkKICAgICAsIG1fbGFzdFBoYXNlTmFtZSgiaW5pdGlhbCIpCiB7CiAgICAgLy8g
Q29tZSB1cCB3aXRoIGluaXRpYWwgb3JkZXJpbmdzIG9mIHJlZ2lzdGVycy4gVGhlIHVzZXIgbWF5
IHJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBlbHNlLgpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJDb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJDb2RlLmgJKHJldmlzaW9uIDIxNDQwOSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyQ29kZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01Miw2ICs1Miw3IEBA
IG5hbWVzcGFjZSBBaXIgewogCiBjbGFzcyBCbG9ja0luc2VydGlvblNldDsKIGNsYXNzIENDYWxs
U3BlY2lhbDsKK2NsYXNzIENGRzsKIGNsYXNzIERpc2Fzc2VtYmxlcjsKIAogdHlwZWRlZiB2b2lk
IFdhc21Cb3VuZHNDaGVja0dlbmVyYXRvckZ1bmN0aW9uKENDYWxsSGVscGVycyYsIEdQUlJlZywg
dW5zaWduZWQpOwpAQCAtMTc2LDcgKzE3Nyw3IEBAIHB1YmxpYzoKIAogICAgIC8vIFJlY29tcHV0
ZXMgcHJlZGVjZXNzb3JzIGFuZCBkZWxldGVzIHVucmVhY2hhYmxlIGJsb2Nrcy4KICAgICB2b2lk
IHJlc2V0UmVhY2hhYmlsaXR5KCk7Ci0KKyAgICAKICAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lk
IGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKIAogICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7
IHJldHVybiBtX2Jsb2Nrcy5zaXplKCk7IH0KQEAgLTI1Niw2ICsyNTcsOCBAQCBwdWJsaWM6CiAg
ICAgdm9pZCBhZGRGYXN0VG1wKFRtcCk7CiAgICAgYm9vbCBpc0Zhc3RUbXAoVG1wIHRtcCkgY29u
c3QgeyByZXR1cm4gbV9mYXN0VG1wcy5jb250YWlucyh0bXApOyB9CiAgICAgCisgICAgQ0ZHJiBj
ZmcoKSBjb25zdCB7IHJldHVybiAqbV9jZmc7IH0KKyAgICAKICAgICB2b2lkKiBhZGREYXRhU2Vj
dGlvbihzaXplX3QpOwogICAgIAogICAgIC8vIFRoZSBuYW1lIGhhcyB0byBiZSBhIHN0cmluZyBs
aXRlcmFsLCBzaW5jZSB3ZSBkb24ndCBkbyBhbnkgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHRoZSBz
dHJpbmcuCkBAIC0zMDQsNiArMzA3LDcgQEAgcHJpdmF0ZToKICAgICBTcGFyc2VDb2xsZWN0aW9u
PFN0YWNrU2xvdD4gbV9zdGFja1Nsb3RzOwogICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmFz
aWNCbG9jaz4+IG1fYmxvY2tzOwogICAgIFNwYXJzZUNvbGxlY3Rpb248U3BlY2lhbD4gbV9zcGVj
aWFsczsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHPiBtX2NmZzsKICAgICBIYXNoU2V0PFRtcD4g
bV9mYXN0VG1wczsKICAgICBDQ2FsbFNwZWNpYWwqIG1fY0NhbGxTcGVjaWFsIHsgbnVsbHB0ciB9
OwogICAgIHVuc2lnbmVkIG1fbnVtR1BUbXBzIHsgMCB9OwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJMaXZlbmVzcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyTGl2ZW5lc3MuaAkocmV2aXNpb24gMjE0NDA5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJMaXZlbmVzcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
OCwyNyArMjgsMTA3IEBACiAjaWYgRU5BQkxFKEIzX0pJVCkKIAogI2luY2x1ZGUgIkFpckJhc2lj
QmxvY2suaCIKKyNpbmNsdWRlICJBaXJDRkcuaCIKICNpbmNsdWRlICJBaXJDb2RlLmgiCiAjaW5j
bHVkZSAiQWlySW5zdElubGluZXMuaCIKICNpbmNsdWRlICJBaXJTdGFja1Nsb3QuaCIKICNpbmNs
dWRlICJBaXJUbXBJbmxpbmVzLmgiCi0jaW5jbHVkZSAiQjNUaW1pbmdTY29wZS5oIgotI2luY2x1
ZGUgPHd0Zi9JbmRleE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9JbmRleFNwYXJzZVNldC5oPgotI2lu
Y2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgorI2luY2x1ZGUgPHd0Zi9MaXZlbmVzcy5oPgogCiBuYW1l
c3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CiAKK3RlbXBsYXRlPHR5
cGVuYW1lIEFkYXB0ZXI+CitzdHJ1Y3QgTGl2ZW5lc3NBZGFwdGVyIHsKKyAgICB0eXBlZGVmIEFp
cjo6Q0ZHIENGRzsKKyAgICAKKyAgICBMaXZlbmVzc0FkYXB0ZXIoQ29kZSYgY29kZSkKKyAgICAg
ICAgOiBjb2RlKGNvZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBibG9ja1Np
emUoQmFzaWNCbG9jayogYmxvY2spCisgICAgeworICAgICAgICByZXR1cm4gYmxvY2stPnNpemUo
KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgorICAgIHZvaWQgZm9yRWFj
aEVhcmx5VXNlKEJhc2ljQmxvY2sqIGJsb2NrLCB1bnNpZ25lZCBpbnN0SW5kZXgsIGNvbnN0IEZ1
bmMmIGZ1bmMpCisgICAgeworICAgICAgICBJbnN0KiBpbnN0ID0gYmxvY2stPmdldChpbnN0SW5k
ZXgpOworICAgICAgICBpZiAoIWluc3QpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlu
c3QtPmZvckVhY2g8dHlwZW5hbWUgQWRhcHRlcjo6VGhpbmc+KAorICAgICAgICAgICAgWyZdICh0
eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9sZSByb2xlLCBCYW5rIGJhbmss
IFdpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNFYXJseVVzZShyb2xlKQorICAg
ICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2NlcHRzQmFuayhiYW5rKQorICAgICAgICAg
ICAgICAgICAgICAmJiBBZGFwdGVyOjphY2NlcHRzUm9sZShyb2xlKSkKKyAgICAgICAgICAgICAg
ICAgICAgZnVuYyhBZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKKyAgICAgICAgICAgIH0p
OworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgorICAgIHZvaWQgZm9y
RWFjaExhdGVVc2UoQmFzaWNCbG9jayogYmxvY2ssIHVuc2lnbmVkIGluc3RJbmRleCwgY29uc3Qg
RnVuYyYgZnVuYykKKyAgICB7CisgICAgICAgIEluc3QqIGluc3QgPSBibG9jay0+Z2V0KGluc3RJ
bmRleCk7CisgICAgICAgIGlmICghaW5zdCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aW5zdC0+Zm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4oCisgICAgICAgICAgICBbJl0g
KHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0aGluZywgQXJnOjpSb2xlIHJvbGUsIEJhbmsgYmFu
aywgV2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0xhdGVVc2Uocm9sZSkKKyAg
ICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKKyAgICAgICAg
ICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCisgICAgICAgICAgICAg
ICAgICAgIGZ1bmMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7CisgICAgICAgICAgICB9
KTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICB2b2lkIGZv
ckVhY2hFYXJseURlZihCYXNpY0Jsb2NrKiBibG9jaywgdW5zaWduZWQgaW5zdEluZGV4LCBjb25z
dCBGdW5jJiBmdW5jKQorICAgIHsKKyAgICAgICAgSW5zdCogaW5zdCA9IGJsb2NrLT5nZXQoaW5z
dEluZGV4KTsKKyAgICAgICAgaWYgKCFpbnN0KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBpbnN0LT5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nPigKKyAgICAgICAgICAgIFsm
XSAodHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBi
YW5rLCBXaWR0aCkgeworICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzRWFybHlEZWYocm9sZSkK
KyAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKKyAgICAg
ICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCisgICAgICAgICAg
ICAgICAgICAgIGZ1bmMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7CisgICAgICAgICAg
ICB9KTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KKyAgICB2b2lk
IGZvckVhY2hMYXRlRGVmKEJhc2ljQmxvY2sqIGJsb2NrLCB1bnNpZ25lZCBpbnN0SW5kZXgsIGNv
bnN0IEZ1bmMmIGZ1bmMpCisgICAgeworICAgICAgICBJbnN0KiBpbnN0ID0gYmxvY2stPmdldChp
bnN0SW5kZXgpOworICAgICAgICBpZiAoIWluc3QpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIGluc3QtPmZvckVhY2g8dHlwZW5hbWUgQWRhcHRlcjo6VGhpbmc+KAorICAgICAgICAgICAg
WyZdICh0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9sZSByb2xlLCBCYW5r
IGJhbmssIFdpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNMYXRlRGVmKHJvbGUp
CisgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNCYW5rKGJhbmspCisgICAg
ICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNSb2xlKHJvbGUpKQorICAgICAgICAg
ICAgICAgICAgICBmdW5jKEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGluZykpOworICAgICAgICAg
ICAgfSk7CisgICAgfQorICAgIAorICAgIENvZGUmIGNvZGU7Cit9OworCiB0ZW1wbGF0ZTxCYW5r
IGFkYXB0ZXJCYW5rLCBBcmc6OlRlbXBlcmF0dXJlIG1pbmltdW1UZW1wZXJhdHVyZSA9IEFyZzo6
Q29sZD4KLXN0cnVjdCBUbXBMaXZlbmVzc0FkYXB0ZXIgeworc3RydWN0IFRtcExpdmVuZXNzQWRh
cHRlciA6IExpdmVuZXNzQWRhcHRlcjxUbXBMaXZlbmVzc0FkYXB0ZXI8YWRhcHRlckJhbmssIG1p
bmltdW1UZW1wZXJhdHVyZT4+IHsKKyAgICB0eXBlZGVmIExpdmVuZXNzQWRhcHRlcjxUbXBMaXZl
bmVzc0FkYXB0ZXI8YWRhcHRlckJhbmssIG1pbmltdW1UZW1wZXJhdHVyZT4+IEJhc2U7CisgICAg
CiAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBuYW1lID0gIlRtcExpdmVuZXNzIjsK
ICAgICB0eXBlZGVmIFRtcCBUaGluZzsKIAotICAgIFRtcExpdmVuZXNzQWRhcHRlcihDb2RlJikg
eyB9CisgICAgVG1wTGl2ZW5lc3NBZGFwdGVyKENvZGUmIGNvZGUpCisgICAgICAgIDogQmFzZShj
b2RlKQorICAgIHsKKyAgICB9CiAKLSAgICBzdGF0aWMgdW5zaWduZWQgbnVtSW5kaWNlcyhDb2Rl
JiBjb2RlKQorICAgIHVuc2lnbmVkIG51bUluZGljZXMoKQogICAgIHsKLSAgICAgICAgdW5zaWdu
ZWQgbnVtVG1wcyA9IGNvZGUubnVtVG1wcyhhZGFwdGVyQmFuayk7CisgICAgICAgIHVuc2lnbmVk
IG51bVRtcHMgPSBCYXNlOjpjb2RlLm51bVRtcHMoYWRhcHRlckJhbmspOwogICAgICAgICByZXR1
cm4gQWJzb2x1dGVUbXBNYXBwZXI8YWRhcHRlckJhbms+OjphYnNvbHV0ZUluZGV4KG51bVRtcHMp
OwogICAgIH0KICAgICBzdGF0aWMgYm9vbCBhY2NlcHRzQmFuayhCYW5rIGJhbmspIHsgcmV0dXJu
IGJhbmsgPT0gYWRhcHRlckJhbms7IH0KQEAgLTU3LDM1MiArMTM3LDMyIEBAIHN0cnVjdCBUbXBM
aXZlbmVzc0FkYXB0ZXIgewogICAgIHN0YXRpYyBUbXAgaW5kZXhUb1ZhbHVlKHVuc2lnbmVkIGlu
ZGV4KSB7IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjxhZGFwdGVyQmFuaz46OnRtcEZyb21BYnNv
bHV0ZUluZGV4KGluZGV4KTsgfQogfTsKIAotc3RydWN0IFN0YWNrU2xvdExpdmVuZXNzQWRhcHRl
ciB7CitzdHJ1Y3QgU3RhY2tTbG90TGl2ZW5lc3NBZGFwdGVyIDogTGl2ZW5lc3NBZGFwdGVyPFN0
YWNrU2xvdExpdmVuZXNzQWRhcHRlcj4gewogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hh
ciogbmFtZSA9ICJTdGFja1Nsb3RMaXZlbmVzcyI7CiAgICAgdHlwZWRlZiBTdGFja1Nsb3QqIFRo
aW5nOwogCiAgICAgU3RhY2tTbG90TGl2ZW5lc3NBZGFwdGVyKENvZGUmIGNvZGUpCi0gICAgICAg
IDogbV9jb2RlKGNvZGUpCisgICAgICAgIDogTGl2ZW5lc3NBZGFwdGVyKGNvZGUpCiAgICAgewog
ICAgIH0KIAotICAgIHN0YXRpYyB1bnNpZ25lZCBudW1JbmRpY2VzKENvZGUmIGNvZGUpCisgICAg
dW5zaWduZWQgbnVtSW5kaWNlcygpCiAgICAgewogICAgICAgICByZXR1cm4gY29kZS5zdGFja1Ns
b3RzKCkuc2l6ZSgpOwogICAgIH0KICAgICBzdGF0aWMgYm9vbCBhY2NlcHRzQmFuayhCYW5rKSB7
IHJldHVybiB0cnVlOyB9CiAgICAgc3RhdGljIGJvb2wgYWNjZXB0c1JvbGUoQXJnOjpSb2xlKSB7
IHJldHVybiB0cnVlOyB9CiAgICAgc3RhdGljIHVuc2lnbmVkIHZhbHVlVG9JbmRleChTdGFja1Ns
b3QqIHN0YWNrU2xvdCkgeyByZXR1cm4gc3RhY2tTbG90LT5pbmRleCgpOyB9Ci0gICAgU3RhY2tT
bG90KiBpbmRleFRvVmFsdWUodW5zaWduZWQgaW5kZXgpIHsgcmV0dXJuIG1fY29kZS5zdGFja1Ns
b3RzKClbaW5kZXhdOyB9Ci0KLXByaXZhdGU6Ci0gICAgQ29kZSYgbV9jb2RlOworICAgIFN0YWNr
U2xvdCogaW5kZXhUb1ZhbHVlKHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiBjb2RlLnN0YWNrU2xv
dHMoKVtpbmRleF07IH0KIH07CiAKLS8vIEhFQURTIFVQOiBUaGUgYWxnb3JpdGhtIGhlcmUgaXMg
ZHVwbGljYXRlZCBpbiBBaXJSZWdMaXZlbmVzcy5oLgogdGVtcGxhdGU8dHlwZW5hbWUgQWRhcHRl
cj4KLWNsYXNzIExpdmVuZXNzIDogcHVibGljIEFkYXB0ZXIgewotICAgIHN0cnVjdCBXb3Jrc2V0
OworY2xhc3MgTGl2ZW5lc3MgOiBwdWJsaWMgV1RGOjpMaXZlbmVzczxBZGFwdGVyPiB7CiBwdWJs
aWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyBUaGluZzsKLSAgICB0eXBl
ZGVmIFZlY3Rvcjx1bnNpZ25lZCwgNCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IEluZGV4VmVjdG9y
OwotICAgIAogICAgIExpdmVuZXNzKENvZGUmIGNvZGUpCi0gICAgICAgIDogQWRhcHRlcihjb2Rl
KQotICAgICAgICAsIG1fd29ya3NldChBZGFwdGVyOjpudW1JbmRpY2VzKGNvZGUpKQotICAgICAg
ICAsIG1fbGl2ZUF0SGVhZChjb2RlLnNpemUoKSkKLSAgICAgICAgLCBtX2xpdmVBdFRhaWwoY29k
ZS5zaXplKCkpCi0gICAgewotICAgICAgICBUaW1pbmdTY29wZSB0aW1pbmdTY29wZShBZGFwdGVy
OjpuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBsaXZlQXRUYWlsIG9mIGVhY2ggYmxv
Y2sgYXV0b21hdGljYWxseSBjb250YWlucyB0aGUgTGF0ZVVzZSdzIG9mIHRoZSB0ZXJtaW5hbC4K
LSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IGNvZGUpIHsKLSAgICAgICAgICAgIElu
ZGV4VmVjdG9yJiBsaXZlQXRUYWlsID0gbV9saXZlQXRUYWlsW2Jsb2NrXTsKLQotICAgICAgICAg
ICAgYmxvY2stPmxhc3QoKS5mb3JFYWNoPHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nPigKLSAgICAg
ICAgICAgICAgICBbJl0gKHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0aGluZywgQXJnOjpSb2xl
IHJvbGUsIEJhbmsgYmFuaywgV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6
aXNMYXRlVXNlKHJvbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2Nl
cHRzQmFuayhiYW5rKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0
c1JvbGUocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXZlQXRUYWlsLmFwcGVuZChB
ZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAg
ICAgICAgIAotICAgICAgICAgICAgc3RkOjpzb3J0KGxpdmVBdFRhaWwuYmVnaW4oKSwgbGl2ZUF0
VGFpbC5lbmQoKSk7Ci0gICAgICAgICAgICByZW1vdmVSZXBlYXRlZEVsZW1lbnRzKGxpdmVBdFRh
aWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQmxvY2tzIHdpdGggbmV3IGxpdmUgdmFsdWVz
IGF0IHRhaWwuCi0gICAgICAgIEJpdFZlY3RvciBkaXJ0eUJsb2NrczsKLSAgICAgICAgZm9yIChz
aXplX3QgYmxvY2tJbmRleCA9IGNvZGUuc2l6ZSgpOyBibG9ja0luZGV4LS07KQotICAgICAgICAg
ICAgZGlydHlCbG9ja3Muc2V0KGJsb2NrSW5kZXgpOwotICAgICAgICAKLSAgICAgICAgSW5kZXhW
ZWN0b3IgbWVyZ2VCdWZmZXI7Ci0gICAgICAgIAotICAgICAgICBib29sIGNoYW5nZWQ7Ci0gICAg
ICAgIGRvIHsKLSAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9y
IChzaXplX3QgYmxvY2tJbmRleCA9IGNvZGUuc2l6ZSgpOyBibG9ja0luZGV4LS07KSB7Ci0gICAg
ICAgICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBjb2RlW2Jsb2NrSW5kZXhdOwotICAgICAg
ICAgICAgICAgIGlmICghYmxvY2spCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgICAgICAgICAgaWYgKCFkaXJ0eUJsb2Nrcy5xdWlja0NsZWFyKGJsb2NrSW5kZXgpKQot
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIExvY2FsQ2Fs
YyBsb2NhbENhbGMoKnRoaXMsIGJsb2NrKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBp
bnN0SW5kZXggPSBibG9jay0+c2l6ZSgpOyBpbnN0SW5kZXgtLTspCi0gICAgICAgICAgICAgICAg
ICAgIGxvY2FsQ2FsYy5leGVjdXRlKGluc3RJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBI
YW5kbGUgdGhlIGVhcmx5IGRlZidzIG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4KLSAgICAgICAg
ICAgICAgICBibG9jay0+YXQoMCkuZm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4oCi0g
ICAgICAgICAgICAgICAgICAgIFsmXSAodHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBB
cmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKEFyZzo6aXNFYXJseURlZihyb2xlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICYmIEFkYXB0ZXI6OmFjY2VwdHNCYW5rKGJhbmspCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbV93b3Jrc2V0LnJlbW92ZShBZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhpbmcpKTsKLSAg
ICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICBJbmRleFZlY3RvciYgbGl2
ZUF0SGVhZCA9IG1fbGl2ZUF0SGVhZFtibG9ja107Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBv
bmx5IGNhcmUgYWJvdXQgVG1wcyB0aGF0IHdlcmUgZGlzY292ZXJlZCBpbiB0aGlzIGl0ZXJhdGlv
bi4gSXQgaXMgaW1wb3NzaWJsZQotICAgICAgICAgICAgICAgIC8vIHRvIHJlbW92ZSBhIGxpdmUg
dmFsdWUgZnJvbSB0aGUgaGVhZC4KLSAgICAgICAgICAgICAgICAvLyBXZSByZW1vdmUgYWxsIHRo
ZSB2YWx1ZXMgd2UgYWxyZWFkeSBrbmV3IGFib3V0IHNvIHRoYXQgd2Ugb25seSBoYXZlIHRvIGRl
YWwgd2l0aAotICAgICAgICAgICAgICAgIC8vIHdoYXQgaXMgbmV3IGluIExpdmVBdEhlYWQuCi0g
ICAgICAgICAgICAgICAgaWYgKG1fd29ya3NldC5zaXplKCkgPT0gbGl2ZUF0SGVhZC5zaXplKCkp
Ci0gICAgICAgICAgICAgICAgICAgIG1fd29ya3NldC5jbGVhcigpOwotICAgICAgICAgICAgICAg
IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGxpdmVJbmRleEF0SGVh
ZCA6IGxpdmVBdEhlYWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3dvcmtzZXQucmVtb3Zl
KGxpdmVJbmRleEF0SGVhZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAg
aWYgKG1fd29ya3NldC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgICAgICAgICAgbGl2ZUF0SGVhZC5yZXNlcnZlQ2FwYWNpdHkobGl2ZUF0SGVhZC5z
aXplKCkgKyBtX3dvcmtzZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IG5ld1ZhbHVlIDogbV93b3Jrc2V0KQotICAgICAgICAgICAgICAgICAgICBsaXZlQXRIZWFkLnVu
Y2hlY2tlZEFwcGVuZChuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgbV93b3Jrc2V0LnNvcnQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBm
b3IgKEJhc2ljQmxvY2sqIHByZWRlY2Vzc29yIDogYmxvY2stPnByZWRlY2Vzc29ycygpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIEluZGV4VmVjdG9yJiBsaXZlQXRUYWlsID0gbV9saXZlQXRUYWls
W3ByZWRlY2Vzc29yXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAg
IGlmIChsaXZlQXRUYWlsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVB
dFRhaWwgPSBtX3dvcmtzZXQudmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2Ugewot
ICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VCdWZmZXIucmVzaXplKDApOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbWVyZ2VCdWZmZXIucmVzZXJ2ZUNhcGFjaXR5KGxpdmVBdFRhaWwuc2l6
ZSgpICsgbV93b3Jrc2V0LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0
ZXIgPSBtZXJnZURlZHVwbGljYXRlZFNvcnRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBsaXZlQXRUYWlsLmJlZ2luKCksIGxpdmVBdFRhaWwuZW5kKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV93b3Jrc2V0LmJlZ2luKCksIG1fd29ya3NldC5lbmQoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtZXJnZUJ1ZmZlci5iZWdpbigpKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIG1lcmdlQnVmZmVyLnJlc2l6ZShpdGVyIC0gbWVyZ2VCdWZmZXIuYmVnaW4oKSk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICht
ZXJnZUJ1ZmZlci5zaXplKCkgPT0gbGl2ZUF0VGFpbC5zaXplKCkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAg
ICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQobWVyZ2VCdWZmZXIuc2l6ZSgpID4gbGl2ZUF0VGFp
bC5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUF0VGFpbCA9IG1lcmdlQnVm
ZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgICAgICBkaXJ0eUJsb2Nrcy5xdWlja1NldChwcmVkZWNlc3Nvci0+aW5kZXgoKSk7
Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7Ci0gICAgfQotCi0gICAg
Ly8gVGhpcyBjYWxjdWxhdG9yIGhhcyB0byBiZSBydW4gaW4gcmV2ZXJzZS4KLSAgICBjbGFzcyBM
b2NhbENhbGMgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9jYWxDYWxjKExpdmVuZXNzJiBsaXZl
bmVzcywgQmFzaWNCbG9jayogYmxvY2spCi0gICAgICAgICAgICA6IG1fbGl2ZW5lc3MobGl2ZW5l
c3MpCi0gICAgICAgICAgICAsIG1fYmxvY2soYmxvY2spCi0gICAgICAgIHsKLSAgICAgICAgICAg
IGF1dG8mIHdvcmtzZXQgPSBsaXZlbmVzcy5tX3dvcmtzZXQ7Ci0gICAgICAgICAgICB3b3Jrc2V0
LmNsZWFyKCk7Ci0gICAgICAgICAgICBJbmRleFZlY3RvciYgbGl2ZUF0VGFpbCA9IGxpdmVuZXNz
Lm1fbGl2ZUF0VGFpbFtibG9ja107Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluZGV4IDog
bGl2ZUF0VGFpbCkKLSAgICAgICAgICAgICAgICB3b3Jrc2V0LmFkZChpbmRleCk7Ci0gICAgICAg
IH0KLQotICAgICAgICBjbGFzcyBJdGVyYWJsZSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAg
ICAgIEl0ZXJhYmxlKExpdmVuZXNzJiBsaXZlbmVzcykKLSAgICAgICAgICAgICAgICA6IG1fbGl2
ZW5lc3MobGl2ZW5lc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGNsYXNzIGl0ZXJhdG9yIHsKLSAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAg
ICBpdGVyYXRvcihBZGFwdGVyJiBhZGFwdGVyLCBJbmRleFNwYXJzZVNldDxVbnNhZmVWZWN0b3JP
dmVyZmxvdz46OmNvbnN0X2l0ZXJhdG9yIHNwYXJjZVNldEl0ZXJhdG9yKQotICAgICAgICAgICAg
ICAgICAgICA6IG1fYWRhcHRlcihhZGFwdGVyKQotICAgICAgICAgICAgICAgICAgICAsIG1fc3Bh
cmNlU2V0SXRlcmF0b3Ioc3BhcmNlU2V0SXRlcmF0b3IpCi0gICAgICAgICAgICAgICAgewotICAg
ICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkK
LSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICsrbV9zcGFyY2VTZXRJdGVy
YXRvcjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nIG9wZXJhdG9yKigp
IGNvbnN0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9h
ZGFwdGVyLmluZGV4VG9WYWx1ZSgqbV9zcGFyY2VTZXRJdGVyYXRvcik7Ci0gICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBv
dGhlcikgeyByZXR1cm4gbV9zcGFyY2VTZXRJdGVyYXRvciA9PSBvdGhlci5tX3NwYXJjZVNldEl0
ZXJhdG9yOyB9Ci0gICAgICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9y
JiBvdGhlcikgeyByZXR1cm4gbV9zcGFyY2VTZXRJdGVyYXRvciAhPSBvdGhlci5tX3NwYXJjZVNl
dEl0ZXJhdG9yOyB9Ci0KLSAgICAgICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICAgICAgQWRh
cHRlciYgbV9hZGFwdGVyOwotICAgICAgICAgICAgICAgIEluZGV4U3BhcnNlU2V0PFVuc2FmZVZl
Y3Rvck92ZXJmbG93Pjo6Y29uc3RfaXRlcmF0b3IgbV9zcGFyY2VTZXRJdGVyYXRvcjsKLSAgICAg
ICAgICAgIH07Ci0KLSAgICAgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4g
aXRlcmF0b3IobV9saXZlbmVzcywgbV9saXZlbmVzcy5tX3dvcmtzZXQuYmVnaW4oKSk7IH0KLSAg
ICAgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fbGl2ZW5l
c3MsIG1fbGl2ZW5lc3MubV93b3Jrc2V0LmVuZCgpKTsgfQotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBib29sIGNvbnRhaW5zKGNvbnN0IHR5cGVuYW1lIEFkYXB0ZXI6OlRoaW5nJiB0aGluZykg
Y29uc3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9saXZlbmVzcy5t
X3dvcmtzZXQuY29udGFpbnMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIExpdmVuZXNzJiBtX2xpdmVu
ZXNzOwotICAgICAgICB9OwotCi0gICAgICAgIEl0ZXJhYmxlIGxpdmUoKSBjb25zdAotICAgICAg
ICB7Ci0gICAgICAgICAgICByZXR1cm4gSXRlcmFibGUobV9saXZlbmVzcyk7Ci0gICAgICAgIH0K
LQotICAgICAgICBib29sIGlzTGl2ZShjb25zdCB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhp
bmcpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaXZlKCkuY29udGFpbnMo
dGhpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBleGVjdXRlKHVuc2lnbmVkIGluc3RJ
bmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgSW5zdCYgaW5zdCA9IG1fYmxvY2stPmF0KGlu
c3RJbmRleCk7Ci0gICAgICAgICAgICBhdXRvJiB3b3Jrc2V0ID0gbV9saXZlbmVzcy5tX3dvcmtz
ZXQ7Ci0KLSAgICAgICAgICAgIC8vIEZpcnN0IGhhbmRsZSB0aGUgZWFybHkgZGVmJ3Mgb2YgdGhl
IG5leHQgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICBpZiAoaW5zdEluZGV4ICsgMSA8IG1fYmxv
Y2stPnNpemUoKSkgewotICAgICAgICAgICAgICAgIEluc3QmIG5leHRJbnN0ID0gbV9ibG9jay0+
YXQoaW5zdEluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgbmV4dEluc3QuZm9yRWFjaDx0eXBl
bmFtZSBBZGFwdGVyOjpUaGluZz4oCi0gICAgICAgICAgICAgICAgICAgIFsmXSAodHlwZW5hbWUg
QWRhcHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBXaWR0aCkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNFYXJseURlZihyb2xlKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNCYW5rKGJhbmspCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c1JvbGUocm9sZSkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NldC5yZW1vdmUoQWRhcHRlcjo6dmFs
dWVUb0luZGV4KHRoaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGVuIGhhbmRsZSBkZWYncy4KLSAgICAg
ICAgICAgIGluc3QuZm9yRWFjaDx0eXBlbmFtZSBBZGFwdGVyOjpUaGluZz4oCi0gICAgICAgICAg
ICAgICAgWyZdICh0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcsIEFyZzo6Um9sZSByb2xl
LCBCYW5rIGJhbmssIFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzTGF0
ZURlZihyb2xlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0Jh
bmsoYmFuaykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNSb2xl
KHJvbGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NldC5yZW1vdmUoQWRhcHRlcjo6
dmFsdWVUb0luZGV4KHRoaW5nKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAg
IC8vIFRoZW4gaGFuZGxlIHVzZSdzLgotICAgICAgICAgICAgaW5zdC5mb3JFYWNoPHR5cGVuYW1l
IEFkYXB0ZXI6OlRoaW5nPigKLSAgICAgICAgICAgICAgICBbJl0gKHR5cGVuYW1lIEFkYXB0ZXI6
OlRoaW5nJiB0aGluZywgQXJnOjpSb2xlIHJvbGUsIEJhbmsgYmFuaywgV2lkdGgpIHsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNFYXJseVVzZShyb2xlKQotICAgICAgICAgICAgICAg
ICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICYmIEFkYXB0ZXI6OmFjY2VwdHNSb2xlKHJvbGUpKQotICAgICAgICAgICAgICAgICAg
ICAgICAgd29ya3NldC5hZGQoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7Ci0gICAgICAg
ICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIC8vIEFuZCBmaW5hbGx5LCBoYW5kbGUgdGhlIGxh
dGUgdXNlJ3Mgb2YgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLgotICAgICAgICAgICAgaWYgKGlu
c3RJbmRleCkgewotICAgICAgICAgICAgICAgIEluc3QmIHByZXZJbnN0ID0gbV9ibG9jay0+YXQo
aW5zdEluZGV4IC0gMSk7Ci0gICAgICAgICAgICAgICAgcHJldkluc3QuZm9yRWFjaDx0eXBlbmFt
ZSBBZGFwdGVyOjpUaGluZz4oCi0gICAgICAgICAgICAgICAgICAgIFsmXSAodHlwZW5hbWUgQWRh
cHRlcjo6VGhpbmcmIHRoaW5nLCBBcmc6OlJvbGUgcm9sZSwgQmFuayBiYW5rLCBXaWR0aCkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNMYXRlVXNlKHJvbGUpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJiYgQWRhcHRlcjo6YWNjZXB0c0JhbmsoYmFuaykKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAmJiBBZGFwdGVyOjphY2NlcHRzUm9sZShyb2xlKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2V0LmFkZChBZGFwdGVyOjp2YWx1ZVRvSW5k
ZXgodGhpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZToKLSAgICAgICAgTGl2ZW5lc3MmIG1fbGl2ZW5l
c3M7Ci0gICAgICAgIEJhc2ljQmxvY2sqIG1fYmxvY2s7Ci0gICAgfTsKLQotICAgIGNvbnN0IElu
ZGV4VmVjdG9yJiByYXdMaXZlQXRIZWFkKEJhc2ljQmxvY2sqIGJsb2NrKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIG1fbGl2ZUF0SGVhZFtibG9ja107Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlw
ZW5hbWUgVW5kZXJseWluZ0l0ZXJhYmxlPgotICAgIGNsYXNzIEl0ZXJhYmxlIHsKLSAgICBwdWJs
aWM6Ci0gICAgICAgIEl0ZXJhYmxlKExpdmVuZXNzJiBsaXZlbmVzcywgY29uc3QgVW5kZXJseWlu
Z0l0ZXJhYmxlJiBpdGVyYWJsZSkKLSAgICAgICAgICAgIDogbV9saXZlbmVzcyhsaXZlbmVzcykK
LSAgICAgICAgICAgICwgbV9pdGVyYWJsZShpdGVyYWJsZSkKLSAgICAgICAgewotICAgICAgICB9
Ci0KLSAgICAgICAgY2xhc3MgaXRlcmF0b3IgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAg
ICBpdGVyYXRvcigpCi0gICAgICAgICAgICAgICAgOiBtX2xpdmVuZXNzKG51bGxwdHIpCi0gICAg
ICAgICAgICAgICAgLCBtX2l0ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBpdGVyYXRvcihMaXZlbmVzcyYgbGl2ZW5lc3MsIHR5cGVu
YW1lIFVuZGVybHlpbmdJdGVyYWJsZTo6Y29uc3RfaXRlcmF0b3IgaXRlcikKLSAgICAgICAgICAg
ICAgICA6IG1fbGl2ZW5lc3MoJmxpdmVuZXNzKQotICAgICAgICAgICAgICAgICwgbV9pdGVyKGl0
ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHR5cGVuYW1l
IEFkYXB0ZXI6OlRoaW5nIG9wZXJhdG9yKigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIG1fbGl2ZW5lc3MtPmluZGV4VG9WYWx1ZSgqbV9pdGVyKTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKQotICAgICAgICAgICAgewot
ICAgICAgICAgICAgICAgICsrbV9pdGVyOwotICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJh
dG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQo
bV9saXZlbmVzcyA9PSBvdGhlci5tX2xpdmVuZXNzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4g
bV9pdGVyID09IG90aGVyLm1faXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAgICAgIHsK
LSAgICAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIExpdmVuZXNzKiBtX2xpdmVuZXNzOwot
ICAgICAgICAgICAgdHlwZW5hbWUgVW5kZXJseWluZ0l0ZXJhYmxlOjpjb25zdF9pdGVyYXRvciBt
X2l0ZXI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJl
dHVybiBpdGVyYXRvcihtX2xpdmVuZXNzLCBtX2l0ZXJhYmxlLmJlZ2luKCkpOyB9Ci0gICAgICAg
IGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKG1fbGl2ZW5lc3MsIG1faXRl
cmFibGUuZW5kKCkpOyB9Ci0KLSAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCB0eXBlbmFtZSBB
ZGFwdGVyOjpUaGluZyYgdGhpbmcpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVy
biBtX2xpdmVuZXNzLm1fd29ya3NldC5jb250YWlucyhBZGFwdGVyOjp2YWx1ZVRvSW5kZXgodGhp
bmcpKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgTGl2ZW5lc3MmIG1fbGl2
ZW5lc3M7Ci0gICAgICAgIGNvbnN0IFVuZGVybHlpbmdJdGVyYWJsZSYgbV9pdGVyYWJsZTsKLSAg
ICB9OwotCi0gICAgSXRlcmFibGU8SW5kZXhWZWN0b3I+IGxpdmVBdEhlYWQoQmFzaWNCbG9jayog
YmxvY2spCi0gICAgewotICAgICAgICByZXR1cm4gSXRlcmFibGU8SW5kZXhWZWN0b3I+KCp0aGlz
LCBtX2xpdmVBdEhlYWRbYmxvY2tdKTsKLSAgICB9Ci0KLSAgICBJdGVyYWJsZTxJbmRleFZlY3Rv
cj4gbGl2ZUF0VGFpbChCYXNpY0Jsb2NrKiBibG9jaykKLSAgICB7Ci0gICAgICAgIHJldHVybiBJ
dGVyYWJsZTxJbmRleFZlY3Rvcj4oKnRoaXMsIG1fbGl2ZUF0VGFpbFtibG9ja10pOwotICAgIH0K
LQotICAgIEluZGV4U3BhcnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJmbG93PiYgd29ya3NldCgpIHsg
cmV0dXJuIG1fd29ya3NldDsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBMb2NhbENh
bGM7Ci0gICAgZnJpZW5kIGNsYXNzIExvY2FsQ2FsYzo6SXRlcmFibGU7Ci0KLSAgICBJbmRleFNw
YXJzZVNldDxVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV93b3Jrc2V0OwotICAgIEluZGV4TWFwPEJh
c2ljQmxvY2ssIEluZGV4VmVjdG9yPiBtX2xpdmVBdEhlYWQ7Ci0gICAgSW5kZXhNYXA8QmFzaWNC
bG9jaywgSW5kZXhWZWN0b3I+IG1fbGl2ZUF0VGFpbDsKKyAgICAgICAgOiBXVEY6OkxpdmVuZXNz
PEFkYXB0ZXI+KGNvZGUuY2ZnKCksIGNvZGUpCisgICAgeworICAgIH0KIH07CiAKIHRlbXBsYXRl
PEJhbmsgYmFuaywgQXJnOjpUZW1wZXJhdHVyZSBtaW5pbXVtVGVtcGVyYXR1cmUgPSBBcmc6OkNv
bGQ+CkluZGV4OiBTb3VyY2UvV1RGL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RG
L0NoYW5nZUxvZwkocmV2aXNpb24gMjE0NDA5KQorKysgU291cmNlL1dURi9DaGFuZ2VMb2cJKHdv
cmtpbmcgY29weSkKQEAgLTEsMyArMSw1NiBAQAorMjAxNy0wMy0yNiAgRmlsaXAgUGl6bG8gIDxm
cGl6bG9AYXBwbGUuY29tPgorCisgICAgICAgIEIzOjpmaXhTU0Egc2hvdWxkIGRvIGxpdmVuZXNz
IHBydW5pbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTE3MDExMQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAK
KyAgICAgICAgTW92ZSBBaXI6OkxpdmVuZXNzPD4gdG8gV1RGOjpMaXZlbmVzczw+LiBUaGlzIGlz
IHByZXR0eSBlYXN5IHNpbmNlIEFpcjo6TGl2ZW5lc3M8PiB3YXMKKyAgICAgICAgYWxyZWFkeSBm
YWlybHkgZ2VuZXJpYy4gSXQgbGV2ZXJhZ2VzIHRoZSBDRkcgY29uY2VwdCBzbyB0aGF0IGl0IGNh
biB1bmRlcnN0YW5kIG1hbnkKKyAgICAgICAgZGlmZmVyZW50IGtpbmRzIG9mIGJhc2ljIGJsb2Nr
cy4gSXQgZG9lc24ndCB0cnkgdG8gdW5kZXJzdGFuZCB0aGUgY29udGVudHMgb2YgYmFzaWMKKyAg
ICAgICAgYmxvY2tzOyBpdCBqdXN0IGFza3MgdGhlIGFkYXB0b3IgZm9yIHRoZSBibG9jayBzaXpl
IGFuZCBhc2tzIGZvciB0aGUgZWFybHkvbGF0ZQorICAgICAgICB1c2VzL2RlZnMgb2YgZWFjaCB0
aGluZyBpbiB0aGUgYmxvY2suCisgICAgICAgIAorICAgICAgICBUaGlzIG1ha2VzIGl0IGVhc3kg
dG8gY3JlYXRlIGEgQjM6OlZhcmlhYmxlTGl2ZW5lc3MsIHdoaWNoIGZpeFNTQSB0aGVuIHVzZXMg
Zm9yCisgICAgICAgIHBydW5pbmcuIE9uZSBvZiB0aGUgbmV3IGZlYXR1cmVzIGlzIHRoZSBMaXZl
bmVzczo6TGl2ZUF0SGVhZCBuZXN0ZWQgY2xhc3MsIHdoaWNoIHlvdQorICAgICAgICBpbnN0YW50
aWF0ZSBpZiB5b3Ugd2FudCB0byBwZXJmb3JtIGxpdmVBdEhlYWQgcXVlcmllcywgd2hpY2ggU1NB
IGNvbnN0cnVjdGlvbiB3YW50cyB0bworICAgICAgICBkby4KKyAgICAgICAgCisgICAgICAgIFRo
aXMgYWxzbyBmaXhlcyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcw
MTAyI2MxMgorCisgICAgICAgICogV1RGLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAg
ICAgICogd3RmL0NNYWtlTGlzdHMudHh0OgorICAgICAgICAqIHd0Zi9MaXZlbmVzcy5oOiBBZGRl
ZC4KKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OkxpdmVuZXNzKToKKyAgICAgICAgKFdURjo6TGl2
ZW5lc3M6OkxvY2FsQ2FsYzo6TG9jYWxDYWxjKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okxv
Y2FsQ2FsYzo6SXRlcmFibGU6Okl0ZXJhYmxlKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okxv
Y2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJhdG9yOjppdGVyYXRvcik6CisgICAgICAgIChXVEY6Okxp
dmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3BlcmF0b3IrKyk6CisgICAg
ICAgIChXVEY6OkxpdmVuZXNzOjpMb2NhbENhbGM6Okl0ZXJhYmxlOjppdGVyYXRvcjo6b3BlcmF0
b3IqKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRlcmFibGU6Oml0ZXJh
dG9yOjpvcGVyYXRvcj09KToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OkxvY2FsQ2FsYzo6SXRl
cmFibGU6Oml0ZXJhdG9yOjpvcGVyYXRvciE9KToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okxv
Y2FsQ2FsYzo6SXRlcmFibGU6OmJlZ2luKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6OkxvY2Fs
Q2FsYzo6SXRlcmFibGU6OmVuZCk6CisgICAgICAgIChXVEY6OkxpdmVuZXNzOjpMb2NhbENhbGM6
Okl0ZXJhYmxlOjpjb250YWlucyk6CisgICAgICAgIChXVEY6OkxpdmVuZXNzOjpMb2NhbENhbGM6
OmxpdmUpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6TG9jYWxDYWxjOjppc0xpdmUpOgorICAg
ICAgICAoV1RGOjpMaXZlbmVzczo6TG9jYWxDYWxjOjpleGVjdXRlKToKKyAgICAgICAgKFdURjo6
TGl2ZW5lc3M6OnJhd0xpdmVBdEhlYWQpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6SXRlcmFi
bGU6Okl0ZXJhYmxlKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjppdGVyYXRv
cjo6aXRlcmF0b3IpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6SXRlcmFibGU6Oml0ZXJhdG9y
OjpvcGVyYXRvciopOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6SXRlcmFibGU6Oml0ZXJhdG9y
OjpvcGVyYXRvcisrKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjppdGVyYXRv
cjo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXVEY6OkxpdmVuZXNzOjpJdGVyYWJsZTo6aXRlcmF0
b3I6Om9wZXJhdG9yIT0pOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6SXRlcmFibGU6OmJlZ2lu
KToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okl0ZXJhYmxlOjplbmQpOgorICAgICAgICAoV1RG
OjpMaXZlbmVzczo6SXRlcmFibGU6OmNvbnRhaW5zKToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6
OmxpdmVBdEhlYWQpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6bGl2ZUF0VGFpbCk6CisgICAg
ICAgIChXVEY6OkxpdmVuZXNzOjp3b3Jrc2V0KToKKyAgICAgICAgKFdURjo6TGl2ZW5lc3M6Okxp
dmVBdEhlYWQ6OkxpdmVBdEhlYWQpOgorICAgICAgICAoV1RGOjpMaXZlbmVzczo6TGl2ZUF0SGVh
ZDo6aXNMaXZlQXRIZWFkKToKKwogMjAxNy0wMy0yNSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBw
bGUuY29tPgogCiAgICAgICAgIEFpcjo6TGl2ZW5lc3Mgc2hvdWxkbid0IG5lZWQgSGFzaFNldHMK
SW5kZXg6IFNvdXJjZS9XVEYvV1RGLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24g
MjE0NDA5KQorKysgU291cmNlL1dURi9XVEYueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29y
a2luZyBjb3B5KQpAQCAtODIsNiArODIsNyBAQAogCQkwRkVDODRBRjFCRDgyNTMxMDA4MEZGNzQg
LyogR3JhcGhOb2RlV29ya2xpc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGRUM4NEFFMUJEODI1MzEwMDgwRkY3NCAvKiBHcmFwaE5vZGVXb3JrbGlz
dC5oICovOyB9OwogCQkwRkVDODRCMTFCREFDRDM5MDA4MEZGNzQgLyogU2NvcGVkTGFtYmRhLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkVDODRCMDFC
REFDRDM5MDA4MEZGNzQgLyogU2NvcGVkTGFtYmRhLmggKi87IH07CiAJCTBGRUQ2N0I2MUIyMkQ0
RDgwMDY2Q0UxNSAvKiBUaW55UHRyU2V0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSAwRkVENjdCNTFCMjJENEQ4MDA2NkNFMTUgLyogVGlueVB0clNldC5o
ICovOyB9OworCQkwRkY0QjRDNTFFODg5MzlDMDBEQkJFODYgLyogTGl2ZW5lc3MuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGRjRCNEM0MUU4ODkzOUMw
MERCQkU4NiAvKiBMaXZlbmVzcy5oICovOyB9OwogCQkwRkY4NjA5NTFCQ0NCRDc0MDA0NTEyN0Yg
LyogUG9pbnRlckNvbXBhcmlzb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGRjg2MDk0MUJDQ0JENzQwMDQ1MTI3RiAvKiBQb2ludGVyQ29tcGFyaXNv
bi5oICovOyB9OwogCQkwRkZGMTlEQzFCQjMzNEVCMDA4ODZEOTEgLyogUGFyYWxsZWxIZWxwZXJQ
b29sLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBG
RkYxOURBMUJCMzM0RUIwMDg4NkQ5MSAvKiBQYXJhbGxlbEhlbHBlclBvb2wuY3BwICovOyB9Owog
CQkwRkZGMTlERDFCQjMzNEVCMDA4ODZEOTEgLyogUGFyYWxsZWxIZWxwZXJQb29sLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkZGMTlEQjFCQjMzNEVC
MDA4ODZEOTEgLyogUGFyYWxsZWxIZWxwZXJQb29sLmggKi87IH07CkBAIC00NjcsNiArNDY4LDcg
QEAKIAkJMEZFQzg0QUUxQkQ4MjUzMTAwODBGRjc0IC8qIEdyYXBoTm9kZVdvcmtsaXN0LmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEdyYXBoTm9kZVdvcmtsaXN0Lmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRUM4NEIwMUJEQUNEMzkwMDgwRkY3NCAvKiBTY29w
ZWRMYW1iZGEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2NvcGVkTGFtYmRh
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRUQ2N0I1MUIyMkQ0RDgwMDY2Q0Ux
NSAvKiBUaW55UHRyU2V0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRpbnlQ
dHJTZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEZGNEI0QzQxRTg4OTM5QzAw
REJCRTg2IC8qIExpdmVuZXNzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExp
dmVuZXNzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRjg2MDk0MUJDQ0JENzQw
MDQ1MTI3RiAvKiBQb2ludGVyQ29tcGFyaXNvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBQb2ludGVyQ29tcGFyaXNvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQkwRkZGMTlEQTFCQjMzNEVCMDA4ODZEOTEgLyogUGFyYWxsZWxIZWxwZXJQb29sLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhcmFsbGVsSGVscGVyUG9vbC5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRkYxOURCMUJCMzM0RUIwMDg4NkQ5MSAv
KiBQYXJhbGxlbEhlbHBlclBvb2wuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
UGFyYWxsZWxIZWxwZXJQb29sLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMDI3
LDYgKzEwMjksNyBAQAogCQkJCTUzOUVCMDYyMUQ1NTI4NDIwMEM4MkVGNyAvKiBMRUJEZWNvZGVy
LmggKi8sCiAJCQkJQTcwREEwODMxNzk5RjA0RDAwNTI5QTlCIC8qIExpc3REdW1wLmggKi8sCiAJ
CQkJQThBNDcyQzExNTFBODI1QTAwNDEyM0ZGIC8qIExpc3RIYXNoU2V0LmggKi8sCisJCQkJMEZG
NEI0QzQxRTg4OTM5QzAwREJCRTg2IC8qIExpdmVuZXNzLmggKi8sCiAJCQkJMEZFMTY0NjgxQjZG
RkM5NjAwNDAwRTdDIC8qIExvY2suY3BwICovLAogCQkJCTBGRTE2NDY5MUI2RkZDOTYwMDQwMEU3
QyAvKiBMb2NrLmggKi8sCiAJCQkJMEYwRkNEREQxREQxNjdGOTAwQ0NBQjUzIC8qIExvY2tBbGdv
cml0aG0uaCAqLywKQEAgLTEzOTAsNiArMTM5Myw3IEBACiAJCQkJOUJEOEY0MEIxNzZDMkI0NzAw
MDJEODY1IC8qIEF0b21pY1N0cmluZ1RhYmxlLmggaW4gSGVhZGVycyAqLywKIAkJCQkxNDY5NDE5
QzE2RUFCMTBBMDAyNEUxNDYgLyogQXV0b2RyYWluZWRQb29sLmggaW4gSGVhZGVycyAqLywKIAkJ
CQkwRjQzRDhGMjFEQjVBRERDMDAxMDhGQjYgLyogQXV0b21hdGljVGhyZWFkLmggaW4gSGVhZGVy
cyAqLywKKwkJCQkwRkY0QjRDNTFFODg5MzlDMDBEQkJFODYgLyogTGl2ZW5lc3MuaCBpbiBIZWFk
ZXJzICovLAogCQkJCURDRUUyMjA1MUNFQjk4NjkwMDBDMjM5NiAvKiBCYWNrd2FyZHNHcmFwaC5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJMEZCMTRFMTkxODBGQTIxODAwOUI2QjREIC8qIEJhZy5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJMEZCMTRFMUIxODEwRTFEQzAwOUI2QjREIC8qIEJhZ1RvSGFzaE1h
cC5oIGluIEhlYWRlcnMgKi8sCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9DTWFrZUxpc3RzLnR4dAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9DTWFrZUxpc3RzLnR4dAkocmV2aXNpb24gMjE0
NDA5KQorKysgU291cmNlL1dURi93dGYvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAg
LTU3LDYgKzU3LDcgQEAgc2V0KFdURl9IRUFERVJTCiAgICAgSXRlcmF0b3JBZGFwdG9ycy5oCiAg
ICAgSXRlcmF0b3JSYW5nZS5oCiAgICAgTGlzdEhhc2hTZXQuaAorICAgIExpdmVuZXNzLmgKICAg
ICBMb2NrLmgKICAgICBMb2NrQWxnb3JpdGhtLmgKICAgICBMb2NrZWRQcmludFN0cmVhbS5oCklu
ZGV4OiBTb3VyY2UvV1RGL3d0Zi9MaXZlbmVzcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYv
d3RmL0xpdmVuZXNzLmgJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dURi93dGYvTGl2ZW5lc3Mu
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNS0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx3
dGYvQml0VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL0luZGV4U3BhcnNlU2V0Lmg+CisjaW5jbHVk
ZSA8d3RmL0xpc3REdW1wLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1l
c3BhY2UgV1RGIHsKKworLy8gSEVBRFMgVVA6IFRoZSBhbGdvcml0aG0gaGVyZSBpcyBkdXBsaWNh
dGVkIGluIEFpclJlZ0xpdmVuZXNzLmguIFRoYXQgb25lIHVzZXMgc2V0cyByYXRoZXIKKy8vIHRo
YW4gZmFuY3kgdmVjdG9ycywgYmVjYXVzZSB0aGF0J3MgYmV0dGVyIGZvciByZWdpc3RlciBsaXZl
bmVzcyBhbmFseXNpcy4KK3RlbXBsYXRlPHR5cGVuYW1lIEFkYXB0ZXI+CitjbGFzcyBMaXZlbmVz
cyA6IHB1YmxpYyBBZGFwdGVyIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEFkYXB0
ZXI6OkNGRyBDRkc7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyBUaGluZzsK
KyAgICB0eXBlZGVmIFZlY3Rvcjx1bnNpZ25lZCwgNCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IElu
ZGV4VmVjdG9yOworICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3VtZW50cz4KKyAg
ICBMaXZlbmVzcyhDRkcmIGNmZywgQXJndW1lbnRzJiYuLi4gYXJndW1lbnRzKQorICAgICAgICA6
IEFkYXB0ZXIoc3RkOjpmb3J3YXJkPEFyZ3VtZW50cz4oYXJndW1lbnRzKS4uLikKKyAgICAgICAg
LCBtX2NmZyhjZmcpCisgICAgICAgICwgbV93b3Jrc2V0KEFkYXB0ZXI6Om51bUluZGljZXMoKSkK
KyAgICAgICAgLCBtX2xpdmVBdEhlYWQoY2ZnLnRlbXBsYXRlIG5ld01hcDxJbmRleFZlY3Rvcj4o
KSkKKyAgICAgICAgLCBtX2xpdmVBdFRhaWwoY2ZnLnRlbXBsYXRlIG5ld01hcDxJbmRleFZlY3Rv
cj4oKSkKKyAgICB7CisgICAgICAgIC8vIFRoZSBsaXZlQXRUYWlsIG9mIGVhY2ggYmxvY2sgYXV0
b21hdGljYWxseSBjb250YWlucyB0aGUgTGF0ZVVzZSdzIG9mIHRoZSB0ZXJtaW5hbC4KKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBibG9ja0luZGV4ID0gbV9jZmcubnVtTm9kZXMoKTsgYmxvY2tJbmRl
eC0tOykgeworICAgICAgICAgICAgdHlwZW5hbWUgQ0ZHOjpOb2RlIGJsb2NrID0gbV9jZmcubm9k
ZShibG9ja0luZGV4KTsKKyAgICAgICAgICAgIGlmICghYmxvY2spCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEluZGV4VmVjdG9yJiBsaXZlQXRU
YWlsID0gbV9saXZlQXRUYWlsW2Jsb2NrXTsKKworICAgICAgICAgICAgQWRhcHRlcjo6Zm9yRWFj
aExhdGVVc2UoCisgICAgICAgICAgICAgICAgYmxvY2ssIEFkYXB0ZXI6OmJsb2NrU2l6ZShibG9j
aykgLSAxLAorICAgICAgICAgICAgICAgIFsmXSAodW5zaWduZWQgaW5kZXgpIHsKKyAgICAgICAg
ICAgICAgICAgICAgbGl2ZUF0VGFpbC5hcHBlbmQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0p
OworICAgICAgICAgICAgCisgICAgICAgICAgICBzdGQ6OnNvcnQobGl2ZUF0VGFpbC5iZWdpbigp
LCBsaXZlQXRUYWlsLmVuZCgpKTsKKyAgICAgICAgICAgIHJlbW92ZVJlcGVhdGVkRWxlbWVudHMo
bGl2ZUF0VGFpbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBCbG9ja3Mgd2l0aCBuZXcgbGl2
ZSB2YWx1ZXMgYXQgdGFpbC4KKyAgICAgICAgQml0VmVjdG9yIGRpcnR5QmxvY2tzOworICAgICAg
ICBmb3IgKHNpemVfdCBibG9ja0luZGV4ID0gbV9jZmcubnVtTm9kZXMoKTsgYmxvY2tJbmRleC0t
OykKKyAgICAgICAgICAgIGRpcnR5QmxvY2tzLnNldChibG9ja0luZGV4KTsKKyAgICAgICAgCisg
ICAgICAgIEluZGV4VmVjdG9yIG1lcmdlQnVmZmVyOworICAgICAgICAKKyAgICAgICAgYm9vbCBj
aGFuZ2VkOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisKKyAg
ICAgICAgICAgIGZvciAoc2l6ZV90IGJsb2NrSW5kZXggPSBtX2NmZy5udW1Ob2RlcygpOyBibG9j
a0luZGV4LS07KSB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgQ0ZHOjpOb2RlIGJsb2NrID0g
bV9jZmcubm9kZShibG9ja0luZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJsb2NrKQorICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmICghZGlydHlC
bG9ja3MucXVpY2tDbGVhcihibG9ja0luZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgICAgICAgICBMb2NhbENhbGMgbG9jYWxDYWxjKCp0aGlzLCBibG9jayk7
CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaW5zdEluZGV4ID0gQWRhcHRlcjo6YmxvY2tT
aXplKGJsb2NrKTsgaW5zdEluZGV4LS07KQorICAgICAgICAgICAgICAgICAgICBsb2NhbENhbGMu
ZXhlY3V0ZShpbnN0SW5kZXgpOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBlYXJs
eSBkZWYncyBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgICAgICAgQWRhcHRl
cjo6Zm9yRWFjaEVhcmx5RGVmKAorICAgICAgICAgICAgICAgICAgICBibG9jaywgMCwKKyAgICAg
ICAgICAgICAgICAgICAgWyZdICh1bnNpZ25lZCBpbmRleCkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgbV93b3Jrc2V0LnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIH0pOwor
CisgICAgICAgICAgICAgICAgSW5kZXhWZWN0b3ImIGxpdmVBdEhlYWQgPSBtX2xpdmVBdEhlYWRb
YmxvY2tdOworCisgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IFRtcHMgdGhh
dCB3ZXJlIGRpc2NvdmVyZWQgaW4gdGhpcyBpdGVyYXRpb24uIEl0IGlzIGltcG9zc2libGUKKyAg
ICAgICAgICAgICAgICAvLyB0byByZW1vdmUgYSBsaXZlIHZhbHVlIGZyb20gdGhlIGhlYWQuCisg
ICAgICAgICAgICAgICAgLy8gV2UgcmVtb3ZlIGFsbCB0aGUgdmFsdWVzIHdlIGFscmVhZHkga25l
dyBhYm91dCBzbyB0aGF0IHdlIG9ubHkgaGF2ZSB0byBkZWFsIHdpdGgKKyAgICAgICAgICAgICAg
ICAvLyB3aGF0IGlzIG5ldyBpbiBMaXZlQXRIZWFkLgorICAgICAgICAgICAgICAgIGlmIChtX3dv
cmtzZXQuc2l6ZSgpID09IGxpdmVBdEhlYWQuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICBt
X3dvcmtzZXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBsaXZlSW5kZXhBdEhlYWQgOiBsaXZlQXRIZWFkKQorICAgICAg
ICAgICAgICAgICAgICAgICAgbV93b3Jrc2V0LnJlbW92ZShsaXZlSW5kZXhBdEhlYWQpOworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3dvcmtzZXQuaXNFbXB0eSgp
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGxpdmVB
dEhlYWQucmVzZXJ2ZUNhcGFjaXR5KGxpdmVBdEhlYWQuc2l6ZSgpICsgbV93b3Jrc2V0LnNpemUo
KSk7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBuZXdWYWx1ZSA6IG1fd29ya3NldCkK
KyAgICAgICAgICAgICAgICAgICAgbGl2ZUF0SGVhZC51bmNoZWNrZWRBcHBlbmQobmV3VmFsdWUp
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1fd29ya3NldC5zb3J0KCk7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICh0eXBlbmFtZSBDRkc6Ok5vZGUg
cHJlZGVjZXNzb3IgOiBtX2NmZy5wcmVkZWNlc3NvcnMoYmxvY2spKSB7CisgICAgICAgICAgICAg
ICAgICAgIEluZGV4VmVjdG9yJiBsaXZlQXRUYWlsID0gbV9saXZlQXRUYWlsW3ByZWRlY2Vzc29y
XTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChsaXZlQXRU
YWlsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVBdFRhaWwgPSBtX3dv
cmtzZXQudmFsdWVzKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgICAgICAgICAgbWVyZ2VCdWZmZXIucmVzaXplKGxpdmVBdFRhaWwuc2l6ZSgpICsgbV93b3Jr
c2V0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtZXJnZURl
ZHVwbGljYXRlZFNvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQXRUYWls
LmJlZ2luKCksIGxpdmVBdFRhaWwuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bV93b3Jrc2V0LmJlZ2luKCksIG1fd29ya3NldC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtZXJnZUJ1ZmZlci5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1l
cmdlQnVmZmVyLnJlc2l6ZShpdGVyIC0gbWVyZ2VCdWZmZXIuYmVnaW4oKSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZUJ1ZmZlci5z
aXplKCkgPT0gbGl2ZUF0VGFpbC5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAg
UkVMRUFTRV9BU1NFUlQobWVyZ2VCdWZmZXIuc2l6ZSgpID4gbGl2ZUF0VGFpbC5zaXplKCkpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUF0VGFpbCA9IG1lcmdlQnVmZmVyOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAg
ICBkaXJ0eUJsb2Nrcy5xdWlja1NldChwcmVkZWNlc3Nvci0+aW5kZXgoKSk7CisgICAgICAgICAg
ICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7CisgICAgfQorCisgICAgLy8gVGhpcyBjYWxj
dWxhdG9yIGhhcyB0byBiZSBydW4gaW4gcmV2ZXJzZS4KKyAgICBjbGFzcyBMb2NhbENhbGMgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgTG9jYWxDYWxjKExpdmVuZXNzJiBsaXZlbmVzcywgdHlwZW5h
bWUgQ0ZHOjpOb2RlIGJsb2NrKQorICAgICAgICAgICAgOiBtX2xpdmVuZXNzKGxpdmVuZXNzKQor
ICAgICAgICAgICAgLCBtX2Jsb2NrKGJsb2NrKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRv
JiB3b3Jrc2V0ID0gbGl2ZW5lc3MubV93b3Jrc2V0OworICAgICAgICAgICAgd29ya3NldC5jbGVh
cigpOworICAgICAgICAgICAgSW5kZXhWZWN0b3ImIGxpdmVBdFRhaWwgPSBsaXZlbmVzcy5tX2xp
dmVBdFRhaWxbYmxvY2tdOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbmRleCA6IGxpdmVB
dFRhaWwpCisgICAgICAgICAgICAgICAgd29ya3NldC5hZGQoaW5kZXgpOworICAgICAgICB9CisK
KyAgICAgICAgY2xhc3MgSXRlcmFibGUgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBJ
dGVyYWJsZShMaXZlbmVzcyYgbGl2ZW5lc3MpCisgICAgICAgICAgICAgICAgOiBtX2xpdmVuZXNz
KGxpdmVuZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBj
bGFzcyBpdGVyYXRvciB7CisgICAgICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgaXRl
cmF0b3IoQWRhcHRlciYgYWRhcHRlciwgSW5kZXhTcGFyc2VTZXQ8VW5zYWZlVmVjdG9yT3ZlcmZs
b3c+Ojpjb25zdF9pdGVyYXRvciBzcGFyY2VTZXRJdGVyYXRvcikKKyAgICAgICAgICAgICAgICAg
ICAgOiBtX2FkYXB0ZXIoYWRhcHRlcikKKyAgICAgICAgICAgICAgICAgICAgLCBtX3NwYXJjZVNl
dEl0ZXJhdG9yKHNwYXJjZVNldEl0ZXJhdG9yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAg
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK21fc3BhcmNlU2V0SXRlcmF0b3I7
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyBvcGVyYXRvciooKSBjb25z
dAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fYWRhcHRl
ci5pbmRleFRvVmFsdWUoKm1fc3BhcmNlU2V0SXRlcmF0b3IpOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIp
IHsgcmV0dXJuIG1fc3BhcmNlU2V0SXRlcmF0b3IgPT0gb3RoZXIubV9zcGFyY2VTZXRJdGVyYXRv
cjsgfQorICAgICAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3Ro
ZXIpIHsgcmV0dXJuIG1fc3BhcmNlU2V0SXRlcmF0b3IgIT0gb3RoZXIubV9zcGFyY2VTZXRJdGVy
YXRvcjsgfQorCisgICAgICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgIEFkYXB0ZXIm
IG1fYWRhcHRlcjsKKyAgICAgICAgICAgICAgICBJbmRleFNwYXJzZVNldDxVbnNhZmVWZWN0b3JP
dmVyZmxvdz46OmNvbnN0X2l0ZXJhdG9yIG1fc3BhcmNlU2V0SXRlcmF0b3I7CisgICAgICAgICAg
ICB9OworCisgICAgICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJh
dG9yKG1fbGl2ZW5lc3MsIG1fbGl2ZW5lc3MubV93b3Jrc2V0LmJlZ2luKCkpOyB9CisgICAgICAg
ICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihtX2xpdmVuZXNzLCBt
X2xpdmVuZXNzLm1fd29ya3NldC5lbmQoKSk7IH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAg
Ym9vbCBjb250YWlucyhjb25zdCB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyYgdGhpbmcpIGNvbnN0
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fbGl2ZW5lc3MubV93b3Jr
c2V0LmNvbnRhaW5zKEFkYXB0ZXI6OnZhbHVlVG9JbmRleCh0aGluZykpOworICAgICAgICAgICAg
fQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBMaXZlbmVzcyYgbV9saXZlbmVzczsK
KyAgICAgICAgfTsKKworICAgICAgICBJdGVyYWJsZSBsaXZlKCkgY29uc3QKKyAgICAgICAgewor
ICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlKG1fbGl2ZW5lc3MpOworICAgICAgICB9CisKKyAg
ICAgICAgYm9vbCBpc0xpdmUoY29uc3QgdHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nKSBj
b25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGl2ZSgpLmNvbnRhaW5zKHRoaW5n
KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZXhlY3V0ZSh1bnNpZ25lZCBpbnN0SW5kZXgp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8mIHdvcmtzZXQgPSBtX2xpdmVuZXNzLm1fd29y
a3NldDsKKworICAgICAgICAgICAgLy8gRmlyc3QgaGFuZGxlIHRoZSBlYXJseSBkZWYncyBvZiB0
aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgIG1fbGl2ZW5lc3MuZm9yRWFjaEVhcmx5
RGVmKAorICAgICAgICAgICAgICAgIG1fYmxvY2ssIGluc3RJbmRleCArIDEsCisgICAgICAgICAg
ICAgICAgWyZdICh1bnNpZ25lZCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICB3b3Jrc2V0
LnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIC8vIFRoZW4gaGFuZGxlIGRlZidzLgorICAgICAgICAgICAgbV9saXZlbmVzcy5mb3JF
YWNoTGF0ZURlZigKKyAgICAgICAgICAgICAgICBtX2Jsb2NrLCBpbnN0SW5kZXgsCisgICAgICAg
ICAgICAgICAgWyZdICh1bnNpZ25lZCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICB3b3Jr
c2V0LnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8v
IFRoZW4gaGFuZGxlIHVzZSdzLgorICAgICAgICAgICAgbV9saXZlbmVzcy5mb3JFYWNoRWFybHlV
c2UoCisgICAgICAgICAgICAgICAgbV9ibG9jaywgaW5zdEluZGV4LAorICAgICAgICAgICAgICAg
IFsmXSAodW5zaWduZWQgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgd29ya3NldC5hZGQo
aW5kZXgpOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBBbmQgZmluYWxs
eSwgaGFuZGxlIHRoZSBsYXRlIHVzZSdzIG9mIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4KKyAg
ICAgICAgICAgIG1fbGl2ZW5lc3MuZm9yRWFjaExhdGVVc2UoCisgICAgICAgICAgICAgICAgbV9i
bG9jaywgaW5zdEluZGV4IC0gMSwKKyAgICAgICAgICAgICAgICBbJl0gKHVuc2lnbmVkIGluZGV4
KSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmtzZXQuYWRkKGluZGV4KTsKKyAgICAgICAgICAg
ICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgICBMaXZl
bmVzcyYgbV9saXZlbmVzczsKKyAgICAgICAgdHlwZW5hbWUgQ0ZHOjpOb2RlIG1fYmxvY2s7Cisg
ICAgfTsKKworICAgIGNvbnN0IEluZGV4VmVjdG9yJiByYXdMaXZlQXRIZWFkKHR5cGVuYW1lIENG
Rzo6Tm9kZSBibG9jaykKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xpdmVBdEhlYWRbYmxvY2td
OworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFVuZGVybHlpbmdJdGVyYWJsZT4KKyAg
ICBjbGFzcyBJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBJdGVyYWJsZShMaXZlbmVz
cyYgbGl2ZW5lc3MsIGNvbnN0IFVuZGVybHlpbmdJdGVyYWJsZSYgaXRlcmFibGUpCisgICAgICAg
ICAgICA6IG1fbGl2ZW5lc3MobGl2ZW5lc3MpCisgICAgICAgICAgICAsIG1faXRlcmFibGUoaXRl
cmFibGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsK
KyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaXRlcmF0b3IoKQorICAgICAgICAgICAgICAg
IDogbV9saXZlbmVzcyhudWxscHRyKQorICAgICAgICAgICAgICAgICwgbV9pdGVyKCkKKyAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaXRlcmF0
b3IoTGl2ZW5lc3MmIGxpdmVuZXNzLCB0eXBlbmFtZSBVbmRlcmx5aW5nSXRlcmFibGU6OmNvbnN0
X2l0ZXJhdG9yIGl0ZXIpCisgICAgICAgICAgICAgICAgOiBtX2xpdmVuZXNzKCZsaXZlbmVzcykK
KyAgICAgICAgICAgICAgICAsIG1faXRlcihpdGVyKQorICAgICAgICAgICAgeworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICB0eXBlbmFtZSBBZGFwdGVyOjpUaGluZyBvcGVyYXRvciooKQor
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2xpdmVuZXNzLT5pbmRleFRv
VmFsdWUoKm1faXRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdG9yJiBv
cGVyYXRvcisrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK21faXRlcjsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fbGl2ZW5lc3MgPT0gb3RoZXIubV9saXZlbmVz
cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faXRlciA9PSBvdGhlci5tX2l0ZXI7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYg
b3RoZXIpIGNvbnN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICEoKnRo
aXMgPT0gb3RoZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAg
ICAgICBMaXZlbmVzcyogbV9saXZlbmVzczsKKyAgICAgICAgICAgIHR5cGVuYW1lIFVuZGVybHlp
bmdJdGVyYWJsZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgICAgICB9OworCisgICAgICAg
IGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IobV9saXZlbmVzcywgbV9p
dGVyYWJsZS5iZWdpbigpKTsgfQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVy
biBpdGVyYXRvcihtX2xpdmVuZXNzLCBtX2l0ZXJhYmxlLmVuZCgpKTsgfQorCisgICAgICAgIGJv
b2wgY29udGFpbnMoY29uc3QgdHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9saXZlbmVzcy5tX3dvcmtzZXQuY29udGFp
bnMoQWRhcHRlcjo6dmFsdWVUb0luZGV4KHRoaW5nKSk7CisgICAgICAgIH0KKworICAgIHByaXZh
dGU6CisgICAgICAgIExpdmVuZXNzJiBtX2xpdmVuZXNzOworICAgICAgICBjb25zdCBVbmRlcmx5
aW5nSXRlcmFibGUmIG1faXRlcmFibGU7CisgICAgfTsKKworICAgIEl0ZXJhYmxlPEluZGV4VmVj
dG9yPiBsaXZlQXRIZWFkKHR5cGVuYW1lIENGRzo6Tm9kZSBibG9jaykKKyAgICB7CisgICAgICAg
IHJldHVybiBJdGVyYWJsZTxJbmRleFZlY3Rvcj4oKnRoaXMsIG1fbGl2ZUF0SGVhZFtibG9ja10p
OworICAgIH0KKworICAgIEl0ZXJhYmxlPEluZGV4VmVjdG9yPiBsaXZlQXRUYWlsKHR5cGVuYW1l
IENGRzo6Tm9kZSBibG9jaykKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZTxJbmRleFZl
Y3Rvcj4oKnRoaXMsIG1fbGl2ZUF0VGFpbFtibG9ja10pOworICAgIH0KKworICAgIEluZGV4U3Bh
cnNlU2V0PFVuc2FmZVZlY3Rvck92ZXJmbG93PiYgd29ya3NldCgpIHsgcmV0dXJuIG1fd29ya3Nl
dDsgfQorICAgIAorICAgIGNsYXNzIExpdmVBdEhlYWQgeworICAgIHB1YmxpYzoKKyAgICAgICAg
TGl2ZUF0SGVhZChMaXZlbmVzcyYgbGl2ZW5lc3MpCisgICAgICAgICAgICA6IG1fbGl2ZW5lc3Mo
bGl2ZW5lc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYmxvY2tJbmRl
eCA9IG1fbGl2ZW5lc3MubV9jZmcubnVtTm9kZXMoKTsgYmxvY2tJbmRleC0tOykgeworICAgICAg
ICAgICAgICAgIHR5cGVuYW1lIENGRzo6Tm9kZSBibG9jayA9IG1fbGl2ZW5lc3MubV9jZmcubm9k
ZShibG9ja0luZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJsb2NrKQorICAgICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdGQ6
OnNvcnQobV9saXZlbmVzcy5tX2xpdmVBdEhlYWRbYmxvY2tdLmJlZ2luKCksIG1fbGl2ZW5lc3Mu
bV9saXZlQXRIZWFkW2Jsb2NrXS5lbmQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIGJvb2wgaXNMaXZlQXRIZWFkKHR5cGVuYW1lIENGRzo6Tm9kZSBibG9j
aywgY29uc3QgdHlwZW5hbWUgQWRhcHRlcjo6VGhpbmcmIHRoaW5nKQorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gISF0cnlCaW5hcnlTZWFyY2g8dW5zaWduZWQ+KG1fbGl2ZW5lc3MubV9s
aXZlQXRIZWFkW2Jsb2NrXSwgbV9saXZlbmVzcy5tX2xpdmVBdEhlYWRbYmxvY2tdLnNpemUoKSwg
bV9saXZlbmVzcy52YWx1ZVRvSW5kZXgodGhpbmcpLCBbXSAodW5zaWduZWQqIHZhbHVlKSB7IHJl
dHVybiAqdmFsdWU7IH0pOworICAgICAgICB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAg
ICAgIExpdmVuZXNzJiBtX2xpdmVuZXNzOworICAgIH07CisgICAgCisgICAgTGl2ZUF0SGVhZCBs
aXZlQXRIZWFkKCkgeyByZXR1cm4gTGl2ZUF0SGVhZCgqdGhpcyk7IH0KKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgTG9jYWxDYWxjOworICAgIGZyaWVuZCBjbGFzcyBMb2NhbENhbGM6Okl0
ZXJhYmxlOworCisgICAgQ0ZHJiBtX2NmZzsKKyAgICBJbmRleFNwYXJzZVNldDxVbnNhZmVWZWN0
b3JPdmVyZmxvdz4gbV93b3Jrc2V0OworICAgIHR5cGVuYW1lIENGRzo6dGVtcGxhdGUgTWFwPElu
ZGV4VmVjdG9yPiBtX2xpdmVBdEhlYWQ7CisgICAgdHlwZW5hbWUgQ0ZHOjp0ZW1wbGF0ZSBNYXA8
SW5kZXhWZWN0b3I+IG1fbGl2ZUF0VGFpbDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdURgorCg==
</data>
<flag name="review"
          id="326879"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
      

    </bug>

</bugzilla>