<?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>156603</bug_id>
          
          <creation_ts>2016-04-14 15:13:25 -0700</creation_ts>
          <short_desc>[JSC] ReduceDoubleToFloat should work accross Phis</short_desc>
          <delta_ts>2016-04-17 22:12:57 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Benjamin Poulain">benjamin</reporter>
          <assigned_to name="Benjamin Poulain">benjamin</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1183895</commentid>
    <comment_count>0</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-04-14 15:13:25 -0700</bug_when>
    <thetext>[JSC] ReduceDoubleToFloat should work accross Phis</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183903</commentid>
    <comment_count>1</comment_count>
      <attachid>276440</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-04-14 15:27:48 -0700</bug_when>
    <thetext>Created attachment 276440
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183905</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-04-14 15:30:47 -0700</bug_when>
    <thetext>Attachment 276440 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/testb3.cpp:4236:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:4236:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 2 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183906</commentid>
    <comment_count>3</comment_count>
      <attachid>276441</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-04-14 15:31:19 -0700</bug_when>
    <thetext>Created attachment 276441
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183907</commentid>
    <comment_count>4</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-04-14 15:31:45 -0700</bug_when>
    <thetext>1.5% faster on Unity3D.
2.8% faster on box2d-throughput-f32

                                                  Conf#1                    Conf#2                                      
SunSpider:
   3d-cube                                    5.0630+-0.0857     ?      5.1213+-0.0912        ? might be 1.0115x slower
   3d-morph                                   5.1391+-0.0193     ?      5.2100+-0.0776        ? might be 1.0138x slower
   3d-raytrace                                5.5978+-0.0689     ?      5.6257+-0.0604        ?
   access-binary-trees                        2.1249+-0.0241            2.1194+-0.0183        
   access-fannkuch                            5.9132+-0.0966            5.8171+-0.1002          might be 1.0165x faster
   access-nbody                               2.5805+-0.0718            2.5222+-0.0056          might be 1.0231x faster
   access-nsieve                              3.0710+-0.0510            3.0691+-0.0538        
   bitops-3bit-bits-in-byte                   1.1362+-0.0128            1.1247+-0.0095          might be 1.0102x faster
   bitops-bits-in-byte                        2.7992+-0.0283     ?      2.8100+-0.0510        ?
   bitops-bitwise-and                         2.1385+-0.0990            2.0785+-0.0485          might be 1.0288x faster
   bitops-nsieve-bits                         3.1204+-0.0447            3.1090+-0.0156        
   controlflow-recursive                      2.3639+-0.0231            2.3509+-0.0494        
   crypto-aes                                 4.0411+-0.0868            4.0368+-0.0466        
   crypto-md5                                 2.4738+-0.0330     ?      2.5009+-0.0602        ? might be 1.0109x slower
   crypto-sha1                                2.3662+-0.0380            2.3448+-0.0259        
   date-format-tofte                          6.3992+-0.0751     ?      6.5363+-0.1850        ? might be 1.0214x slower
   date-format-xparb                          4.7750+-0.1088     ?      4.8119+-0.0967        ?
   math-cordic                                2.8944+-0.0293            2.8840+-0.0174        
   math-partial-sums                          4.8608+-0.0467     ?      4.9004+-0.0901        ?
   math-spectral-norm                         2.0161+-0.0368            1.9980+-0.0088        
   regexp-dna                                 6.3816+-0.1312     ?      6.4131+-0.1861        ?
   string-base64                              4.9389+-0.1949     ?      5.0019+-0.2586        ? might be 1.0128x slower
   string-fasta                               5.9164+-0.1130            5.8000+-0.0569          might be 1.0201x faster
   string-tagcloud                            8.1603+-0.0850            8.1314+-0.0860        
   string-unpack-code                        19.3697+-0.4996     ?     19.7377+-0.6318        ? might be 1.0190x slower
   string-validate-input                      4.4263+-0.0927            4.4134+-0.1178        

   &lt;arithmetic&gt;                               4.6180+-0.0226     ?      4.6334+-0.0330        ? might be 1.0033x slower

                                                  Conf#1                    Conf#2                                      
Octane:
   encrypt                                   0.16302+-0.00072          0.16235+-0.00062       
   decrypt                                   2.84583+-0.00869          2.84089+-0.00306       
   deltablue                        x2       0.13999+-0.00195          0.13934+-0.00196       
   earley                                    0.28653+-0.00112    ?     0.28696+-0.00135       ?
   boyer                                     5.03678+-0.03691          5.02123+-0.05303       
   navier-stokes                    x2       5.00274+-0.00923    ?     5.01018+-0.01144       ?
   raytrace                         x2       0.79686+-0.00220    ?     0.79716+-0.00250       ?
   richards                         x2       0.08333+-0.00051    ?     0.08348+-0.00042       ?
   splay                            x2       0.34197+-0.00270          0.34191+-0.00165       
   regexp                           x2      15.83075+-0.10910         15.79311+-0.11414       
   pdfjs                            x2      39.62902+-0.28598    ?    39.74836+-0.27570       ?
   mandreel                         x2      42.53394+-0.11733         42.36217+-0.11472       
   gbemu                            x2      24.25185+-0.05847    ?    24.29922+-0.14632       ?
   closure                                   0.53462+-0.00215          0.53338+-0.00160       
   jquery                                    6.83363+-0.02290    ?     6.87418+-0.02429       ?
   box2d                            x2       9.18677+-0.03212    ?     9.26675+-0.05235       ?
   zlib                             x2     357.60263+-4.57913        355.81132+-3.04523       
   typescript                       x2     619.53806+-2.20658        618.44664+-1.75235       

   &lt;geometric&gt;                               5.02325+-0.00644          5.02243+-0.00712         might be 1.0002x faster

                                                  Conf#1                    Conf#2                                      
Kraken:
   ai-astar                                   88.233+-0.805             88.147+-0.868         
   audio-beat-detection                       42.004+-0.068      ?      42.064+-0.090         ?
   audio-dft                                  99.891+-1.072             99.869+-1.198         
   audio-fft                                  32.905+-0.269             32.834+-0.171         
   audio-oscillator                           47.920+-0.127      ?      47.926+-0.049         ?
   imaging-darkroom                           60.327+-0.173      ^      59.968+-0.106         ^ definitely 1.0060x faster
   imaging-desaturate                         45.300+-0.161             45.242+-0.133         
   imaging-gaussian-blur                      64.753+-1.804             64.115+-2.095         
   json-parse-financial                       37.782+-0.091      ^      37.230+-0.232         ^ definitely 1.0148x faster
   json-stringify-tinderbox                   24.799+-1.453             22.849+-0.701           might be 1.0853x faster
   stanford-crypto-aes                        39.370+-0.432             39.369+-0.408         
   stanford-crypto-ccm                        32.723+-0.580             32.631+-0.857         
   stanford-crypto-pbkdf2                     96.461+-0.334      ?      96.972+-0.934         ?
   stanford-crypto-sha256-iterative           37.037+-0.538             36.835+-0.239         

   &lt;arithmetic&gt;                               53.536+-0.193             53.289+-0.238           might be 1.0046x faster

                                                  Conf#1                    Conf#2                                      
AsmBench:
   bigfib.cpp                               443.7581+-1.3842     ?    444.4828+-2.2829        ?
   cray.c                                   364.3141+-1.2121     ?    365.1794+-1.8583        ?
   dry.c                                    443.5284+-23.1532         427.9712+-4.1389          might be 1.0364x faster
   FloatMM.c                                725.7166+-3.5496     ?    726.8204+-3.3913        ?
   gcc-loops.cpp                           3712.3209+-3.7844     ?   3720.0697+-12.8160       ?
   n-body.c                                 808.3756+-2.3792     ?    809.4591+-3.0377        ?
   Quicksort.c                              397.8874+-1.1236     ?    398.7238+-1.4567        ?
   stepanov_container.cpp                  3332.8912+-15.0782        3328.9234+-13.3996       
   Towers.c                                 272.8819+-0.5958          272.7597+-0.2360        

   &lt;geometric&gt;                              726.3510+-3.9406          724.5353+-1.0660          might be 1.0025x faster

                                                  Conf#1                    Conf#2                                      
Geomean of preferred means:
   &lt;scaled-result&gt;                           30.8175+-0.0684           30.7869+-0.0589          might be 1.0010x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183908</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-04-14 15:33:23 -0700</bug_when>
    <thetext>Attachment 276441 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/testb3.cpp:4236:  Consider using CHECK_EQ instead of CHECK(a == b)  [readability/check] [2]
ERROR: Source/JavaScriptCore/b3/testb3.cpp:4236:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 2 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183928</commentid>
    <comment_count>6</comment_count>
      <attachid>276441</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-04-14 16:10:22 -0700</bug_when>
    <thetext>Comment on attachment 276441
Patch

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

I think I buy this.  I will read it again before r+&apos;ing.  Maybe worth it to get someone else to look at it, too.  Maybe Saam.

&gt; Source/JavaScriptCore/ChangeLog:10
&gt; +        This patch extends B3&apos;s ReduceDoubleToFloat phase to work accross
&gt; +        Upsilon-Phis. This is important to optimize loops and some crazy cases.

Awesome.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1183980</commentid>
    <comment_count>7</comment_count>
      <attachid>276441</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-04-14 19:40:28 -0700</bug_when>
    <thetext>Comment on attachment 276441
Patch

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

I think I understand mostly what&apos;s going on. I&apos;ve added some comments. 
I want to read it and grok it a bit more, but I have to catch a plane now. 
I&apos;ll look more later.

&gt; Source/JavaScriptCore/ChangeLog:15
&gt; +            Float @2 = DoubleToPhi(@1)

Typo: DoubleToFloat

&gt; Source/JavaScriptCore/ChangeLog:22
&gt; +        but the user of the value does not do DoubleToPhi.

Typo here too

&gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:176
&gt; +                changedPhiState = true;

This is dead code.

&gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:216
&gt; +                || (value-&gt;type() == Double

Indentation is off here.
This might be easier to read if it were broken up into individual if statements.

&gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:346
&gt; +                    if (phi-&gt;type() == Float &amp;&amp; child-&gt;type() == Double

The &quot;child-&gt;type() == Double&quot; should always be true, right? Maybe make it an assertion

&gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:388
&gt; +                            upsilon-&gt;child(0) = newChild;

I have a question about B3 here:
What happens to the old value if we were the only reference of it?
Are all values allocated under some arena and are cleaned up after compilation?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1184120</commentid>
    <comment_count>8</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-04-15 10:47:02 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:346
&gt; &gt; +                    if (phi-&gt;type() == Float &amp;&amp; child-&gt;type() == Double
&gt; 
&gt; The &quot;child-&gt;type() == Double&quot; should always be true, right? Maybe make it an
&gt; assertion

Remember that we are not in a valid state in simplify().
You can have a child that was already converted to float by an other node.

It would be fine to convert it again, but changedPhi has to tell the truth.

&gt; &gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:388
&gt; &gt; +                            upsilon-&gt;child(0) = newChild;
&gt; 
&gt; I have a question about B3 here:
&gt; What happens to the old value if we were the only reference of it?
&gt; Are all values allocated under some arena and are cleaned up after
&gt; compilation?

All the values are owned by the Procedure. The dead values stick around until you call deleteValue().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1184502</commentid>
    <comment_count>9</comment_count>
      <attachid>276441</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-04-17 12:52:29 -0700</bug_when>
    <thetext>Comment on attachment 276441
Patch

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

&gt;&gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:216
&gt;&gt; +                || (value-&gt;type() == Double
&gt; 
&gt; Indentation is off here.
&gt; This might be easier to read if it were broken up into individual if statements.

I believe that this indentation style is what we&apos;re supposed to do, but I agree that this would read easier if it was broken up.

&gt;&gt; Source/JavaScriptCore/b3/B3ReduceDoubleToFloat.cpp:388
&gt;&gt; +                            upsilon-&gt;child(0) = newChild;
&gt; 
&gt; I have a question about B3 here:
&gt; What happens to the old value if we were the only reference of it?
&gt; Are all values allocated under some arena and are cleaned up after compilation?

Values are owned by Procedure and it will delete all of them when the Procedure is deleted.

More precisely, Values can be in one of these states:

1) Not owned by any Procedure.  We don&apos;t allow this state to be user-visible by always funneling allocations through Procedure.
2) Owned by a Procedure but not in any BasicBlock.  This is not a memory leak since Procedure will delete all values.  This state will fail validation because we require all values to be in basic blocks.  If you know that you&apos;re in this state, Procedure has a GC method you can call.  Currently, the FTL calls this method right after lowering.  I don&apos;t think that method has any other users.
3) Owned by a Procedure and in one BasicBlock.  This is expected state of all values in between phases (i.e. when we validate).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1184575</commentid>
    <comment_count>10</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-04-17 22:12:57 -0700</bug_when>
    <thetext>Committed r199648: &lt;http://trac.webkit.org/changeset/199648&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>276440</attachid>
            <date>2016-04-14 15:27:48 -0700</date>
            <delta_ts>2016-04-14 15:31:16 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-156603-20160414152801.patch</filename>
            <type>text/plain</type>
            <size>48834</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk5NTI5CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBi
YTMwYzdhMjBlMTNjZmNjMzQ3MDU5ZDc2YWM5MDM1OWZiY2JhMmQ0Li4xZTJlNjAxMDVjZWFmODE3
NzlmYjhiNGJlZTE1YjUyZDVkOTBiZTgyIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw4MiBAQAorMjAxNi0wNC0xNCAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KKworICAgICAgICBbSlNDXSBSZWR1Y2VEb3VibGVUb0Zsb2F0IHNob3VsZCB3b3JrIGFj
Y3Jvc3MgUGhpcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTU2NjAzCisgICAgICAgIAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFRoaXMgcGF0Y2ggZXh0ZW5kcyBCMydzIFJlZHVjZURvdWJsZVRvRmxvYXQg
cGhhc2UgdG8gd29yayBhY2Nyb3NzCisgICAgICAgIFVwc2lsb24tUGhpcy4gVGhpcyBpcyBpbXBv
cnRhbnQgdG8gb3B0aW1pemUgbG9vcHMgYW5kIHNvbWUgY3JhenkgY2FzZXMuCisKKyAgICAgICAg
SW4gaXRzIHNpbXBsZXN0IGZvcm0sIHdlIGNhbiBoYXZlIGNvbnZlcnNpb24gcHJvcGFnYXRlZCBm
cm9tIHNvbWV0aGluZworICAgICAgICBsaWtlIHRoaXM6CisgICAgICAgICAgICBEb3VibGUgQDEg
PSBQaGkoKQorICAgICAgICAgICAgRmxvYXQgQDIgPSBEb3VibGVUb1BoaShAMSkKKworICAgICAg
ICBXaGVuIHRoYXQgaGFwcGVucywgd2UganVzdCBuZWVkIHRvIHByb3BhZ2F0ZSB0aGF0IHRoZSBy
ZXN1bHQgb25seQorICAgICAgICBuZWVkIGZsb2F0IHByZWNpc2lvbiBhY2Nyb3NzIGFsbCB2YWx1
ZXMgY29taW5nIHRvIHRoaXMgUGhpLgorCisKKyAgICAgICAgVGhlcmUgYXJlIG1vcmUgY29tcGxp
Y2F0ZWQgY2FzZXMgd2hlbiB0aGUgdmFsdWUgcHJvZHVjZWQgaXMgZWZmZWN0aXZlbHkgRmxvYXQK
KyAgICAgICAgYnV0IHRoZSB1c2VyIG9mIHRoZSB2YWx1ZSBkb2VzIG5vdCBkbyBEb3VibGVUb1Bo
aS4KKworICAgICAgICBUeXBpY2FsbHksIHdlIGhhdmUgc29tZXRoaW5nIGxpa2U6CisgICAgICAg
ICAgICAjMQorICAgICAgICAgICAgICAgIEAxID0gQ29uc3REb3VibGUoMSkKKyAgICAgICAgICAg
ICAgICBAMiA9IFVwc2lsb24oQDEsIF41KQorICAgICAgICAgICAgIzIKKyAgICAgICAgICAgICAg
ICBAMyA9IEZsb2F0VG9Eb3VibGUoQHgpCisgICAgICAgICAgICAgICAgQDQgPSBVcHNpbG9uKEAz
LCBeNSkKKyAgICAgICAgICAgICMzCisgICAgICAgICAgICAgICAgQDUgPSBQaGkoKQorICAgICAg
ICAgICAgICAgIEA2ID0gQWRkKEA1LCBAc29tZXRoaW5nRmxvYXQpCisgICAgICAgICAgICAgICAg
QDcgPSBEb3VibGVUb0Zsb2F0KEA2KQorCisgICAgICAgIEhlcmUgd2l0aCBhIFBoaS1VcHNpbG9u
IHRoYXQgaXMgYSBEb3VibGUgYnV0IGNhbiBiZSByZXByZXNlbnRlZAorICAgICAgICBhcyBGbG9h
dCB3aXRob3V0IGxvc3Mgb2YgcHJlY2lzaW9uLgorCisgICAgICAgIEl0IGlzIHZhbHVhYmxlIHRv
IGNvbnZlcnQgc3VjaCBQaGlzIHRvIGZsb2F0IGlmIGFuZCBvbmx5IGlmIHRoZSB2YWx1ZQorICAg
ICAgICBpcyB1c2VkIGFzIGZsb2F0LiBPdGhlcndpc2UsIHlvdSBtYXkgYmUganVzdCBhZGRpbmcg
dXNlbGVzcyBjb252ZXJzaW9ucworICAgICAgICAoZm9yIGV4YW1wbGUsIHR3byBkb3VibGUgY29u
c3RhbnRzIHRoYXQgZmxvdyBpbnRvIGEgZG91YmxlIEFkZCBzaG91bGQgbm90CisgICAgICAgIHR1
cm4gaW50byB0d28gZmxvYXQgY29uc3RhbnQgZmxvd2luZyBpbnRvIGEgRmxvYXRUb0RvdWJsZSB0
aGVuIEFkZCkuCisKKworICAgICAgICBSZWR1Y2VEb3VibGVUb0Zsb2F0IGRvIHR3byBhbmFseXNp
cyBwYXNzZXMgdG8gZ2F0aGVyIHRoZSBuZWNlc3NhcnkKKyAgICAgICAgbWV0YSBpbmZvcm1hdGlv
bi4gVGhlbiB3ZSBoYXZlIGEgc2ltcGxpZnkoKSBwaGFzZSB0byBhY3R1YWxseSByZWR1Y2UKKyAg
ICAgICAgb3BlcmF0aW9uLiBGaW5hbGx5LCB0aGUgY2xlYW51cCgpIHBhc3MgcHV0IHRoZSBncmFw
aCBpbnRvIGEgdmFsaWQKKyAgICAgICAgc3RhdGUgYWdhaW4uCisKKyAgICAgICAgVGhlIHR3byBh
bmFseXNpcyBwYXNzZXMgd29yayBieSBkaXNwcm92aW5nIHRoYXQgc29tZXRoaW5nIGlzIGZsb2F0
LgorICAgICAgICAtZmluZENhbmRpZGF0ZXMoKSBhY2N1bXVsYXRlcyBhbnl0aGluZyB1c2VkIGFz
IERvdWJsZS4KKyAgICAgICAgLWZpbmRQaGlzQ29udGFpbmluZ0Zsb2F0KCkgYWNjdW11bGF0ZXMg
cGhpcyB0aGF0IHdvdWxkIGxvc2UgcHJlY2lzaW9uCisgICAgICAgICBieSBjb252ZXJ0aW5nIHRo
ZSBpbnB1dCB0byBmbG9hdC4KKworICAgICAgICAqIGIzL0IzUmVkdWNlRG91YmxlVG9GbG9hdC5j
cHA6CisgICAgICAgIChKU0M6OkIzOjpyZWR1Y2VEb3VibGVUb0Zsb2F0KToKKyAgICAgICAgKiBi
My90ZXN0YjMuY3BwOgorICAgICAgICAoSlNDOjpCMzo6dGVzdENvbXBhcmVUd29GbG9hdFRvRG91
YmxlKToKKyAgICAgICAgKEpTQzo6QjM6OnRlc3RDb21wYXJlT25lRmxvYXRUb0RvdWJsZSk6Cisg
ICAgICAgIChKU0M6OkIzOjp0ZXN0Q29tcGFyZUZsb2F0VG9Eb3VibGVUaHJvdWdoUGhpKToKKyAg
ICAgICAgKEpTQzo6QjM6OnRlc3REb3VibGVUb0Zsb2F0VGhyb3VnaFBoaSk6CisgICAgICAgIChK
U0M6OkIzOjp0ZXN0RG91YmxlUHJvZHVjZXJQaGlUb0Zsb2F0Q29udmVyc2lvbik6CisgICAgICAg
IChKU0M6OkIzOjp0ZXN0RG91YmxlUHJvZHVjZXJQaGlUb0Zsb2F0Q29udmVyc2lvbldpdGhEb3Vi
bGVDb25zdW1lcik6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0RG91YmxlUHJvZHVjZXJQaGlXaXRo
Tm9uRmxvYXRDb25zdCk6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0U3RvcmVEb3VibGVDb25zdGFu
dEFzRmxvYXQpOgorICAgICAgICAoSlNDOjpCMzo6cnVuKToKKyAgICAgICAgKiB0ZXN0cy9zdHJl
c3MvZG91YmxlLWNvbXBhcmUtdG8tZmxvYXQuanM6IEFkZGVkLgorICAgICAgICAoY2FuU2ltcGxp
ZnlUb0Zsb2F0KToKKyAgICAgICAgKGNhblNpbXBsaWZ5VG9GbG9hdFdpdGhDb25zdGFudCk6Cisg
ICAgICAgIChjYW5ub3RTaW1wbGlmeUEpOgorICAgICAgICAoY2Fubm90U2ltcGxpZnlCKToKKyAg
ICAgICAgKiB0ZXN0cy9zdHJlc3MvZG91YmxlLXRvLWZsb2F0LmpzOiBBZGRlZC4KKyAgICAgICAg
KHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaSk6CisgICAgICAgICh1cHNpbG9uUmVmZXJlbmNpbmdJ
dHNQaGlBbGxGbG9hdCk6CisgICAgICAgICh1cHNpbG9uUmVmZXJlbmNpbmdJdHNQaGlXaXRob3V0
Q29udmVyc2lvbik6CisgICAgICAgIChjb252ZXJzaW9uUHJvcGFnYWdlcyk6CisgICAgICAgIChj
aGFpbmVkVXBzaWxvbkJvdGhDb252ZXJ0KToKKyAgICAgICAgKGNoYWluZWRVcHNpbG9uRmlyc3RD
b252ZXJ0KToKKwogMjAxNi0wNC0xMyAgSm9zZXBoIFBlY29yYXJvICA8cGVjb3Jhcm9AYXBwbGUu
Y29tPgogCiAgICAgICAgIEpTQ29udGV4dCBJbnNwZWN0b3I6IEltcHJvdmUgQ2xhc3MgaW5zdGFu
Y2VzIGFuZCBKU0MgQVBJIEV4cG9ydGVkIFZhbHVlcyB2aWV3IGluIENvbnNvbGUgLyBPYmplY3RU
cmVlCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNSZWR1Y2VEb3VibGVU
b0Zsb2F0LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1JlZHVjZURvdWJsZVRvRmxv
YXQuY3BwCmluZGV4IGQ4ZTQzYjRlZWIwMTA2MjU1Yzg5YmY1MzZhNjAxMjZmMWJhODcyYjkuLmE3
YmZlMTZmOWRmYmI2ZTBhNDQ3MTA1N2U3NTcyMTk5Y2I1MTU3MWYgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1JlZHVjZURvdWJsZVRvRmxvYXQuY3BwCisrKyBiL1NvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1JlZHVjZURvdWJsZVRvRmxvYXQuY3BwCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDEyNiArMjks
NDUwIEBACiAjaWYgRU5BQkxFKEIzX0pJVCkKIAogI2luY2x1ZGUgIkIzQmFzaWNCbG9jay5oIgor
I2luY2x1ZGUgIkIzSW5kZXhTZXQuaCIKKyNpbmNsdWRlICJCM0luc2VydGlvblNldElubGluZXMu
aCIKICNpbmNsdWRlICJCM1BoYXNlU2NvcGUuaCIKKyNpbmNsdWRlICJCM1VzZUNvdW50cy5oIgog
I2luY2x1ZGUgIkIzVmFsdWVJbmxpbmVzLmgiCiAKIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2Ug
QjMgewogCiBuYW1lc3BhY2Ugewotdm9pZCBhdHRlbXB0U2ltcGxpZmljYXRpb24oVmFsdWUqIGNh
bmRpZGF0ZSkKLXsKLSAgICBzd2l0Y2ggKGNhbmRpZGF0ZS0+b3Bjb2RlKCkpIHsKLSAgICBjYXNl
IEFkZDoKLSAgICBjYXNlIFN1YjoKLSAgICBjYXNlIE11bDoKLSAgICBjYXNlIERpdjoKLSAgICAg
ICAgaWYgKGNhbmRpZGF0ZS0+Y2hpbGQoMCktPm9wY29kZSgpID09IEZsb2F0VG9Eb3VibGUgJiYg
Y2FuZGlkYXRlLT5jaGlsZCgxKS0+b3Bjb2RlKCkgPT0gRmxvYXRUb0RvdWJsZSkgewotICAgICAg
ICAgICAgY2FuZGlkYXRlLT5jaGlsZCgwKSA9IGNhbmRpZGF0ZS0+Y2hpbGQoMCktPmNoaWxkKDAp
OwotICAgICAgICAgICAgY2FuZGlkYXRlLT5jaGlsZCgxKSA9IGNhbmRpZGF0ZS0+Y2hpbGQoMSkt
PmNoaWxkKDApOwotICAgICAgICAgICAgY2FuZGlkYXRlLT5zZXRUeXBlKEZsb2F0KTsKKworYm9v
bCB2ZXJib3NlID0gZmFsc2U7Citib29sIHByaW50UmVtYWluaW5nQ29udmVyc2lvbnMgPSBmYWxz
ZTsKKworY2xhc3MgRG91YmxlVG9GbG9hdFJlZHVjdGlvbiB7CitwdWJsaWM6CisgICAgRG91Ymxl
VG9GbG9hdFJlZHVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkKKyAgICAgICAgOiBtX3Byb2Nl
ZHVyZShwcm9jZWR1cmUpCisgICAgeworICAgIH0KKworICAgIHZvaWQgcnVuKCkKKyAgICB7Cisg
ICAgICAgIGlmICghZmluZENhbmRpZGF0ZXMoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBmaW5kUGhpc0NvbnRhaW5pbmdGbG9hdCgpOworCisgICAgICAgIHNpbXBsaWZ5KCk7CisK
KyAgICAgICAgY2xlYW5VcCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIHN0ZXAg
ZmluZCB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBhcyBEb3VibGUgYW5kIGNhbm5vdCBiZSBjb252ZXJ0
ZWQgdG8gRmxvYXQuLgorICAgIC8vIEl0IGZsb3dzIHRoZSBpbmZvcm1hdGlvbiBiYWNrd2FyZCB0
aHJvdWdoIFBoaS1VcHNpbG9ucy4KKyAgICBib29sIGZpbmRDYW5kaWRhdGVzKCkKKyAgICB7Cisg
ICAgICAgIGJvb2wgZm91bmRDb252ZXJzaW9uQ2FuZGlkYXRlID0gZmFsc2U7CisgICAgICAgIFZl
Y3RvcjxWYWx1ZSosIDMyPiB1cHNpbG9uczsKKworICAgICAgICAvLyBGaXJzdCwgd2UgZmluZCBh
bGwgdmFsdWVzIHRoYXQgYXJlIHN0cmljdGx5IHVzZWQgYXMgZG91YmxlLgorICAgICAgICAvLyBU
aG9zZSBhcmUgdmFsdWVzIHVzZWQgYnkgc29tZXRoaW5nIGVsc2UgdGhhbiBEb3VibGVUb0Zsb2F0
LgorICAgICAgICAvLworICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBzdGF0ZSBvZiBVcHNp
bG9ucyB1bnRpbCB0aGVpciBQaGkgaGFzIGJlZW4KKyAgICAgICAgLy8gc2V0LiBXZSBqdXN0IGtl
ZXAgYSBsaXN0IG9mIHRoZW0gYW5kIHVwZGF0ZSB0aGVtIG5leHQuCisgICAgICAgIGZvciAoQmFz
aWNCbG9jayogYmxvY2sgOiBtX3Byb2NlZHVyZSkgeworICAgICAgICAgICAgZm9yIChWYWx1ZSog
dmFsdWUgOiAqYmxvY2spIHsKKyAgICAgICAgICAgICAgICB2YWx1ZS0+cGVyZm9ybVN1YnN0aXR1
dGlvbigpOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSA9PSBEb3VibGVU
b0Zsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kQ29udmVyc2lvbkNhbmRpZGF0ZSA9
IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUqIGNoaWxkID0gdmFsdWUtPmNoaWxk
KDApOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPm9wY29kZSgpID09IEZsb2F0VG9E
b3VibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHJlYWxseSBuZWVk
IHRvIHNpbXBsaWZ5IHRoaXMgZWFybHkgYnV0IGl0IHNpbXBsaWZpZXMgZGVidWdnaW5nLgorICAg
ICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPnJlcGxhY2VXaXRoSWRlbnRpdHkoY2hpbGQtPmNo
aWxkKDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUtPm9w
Y29kZSgpID09IEZsb2F0VG9Eb3VibGUpCisgICAgICAgICAgICAgICAgICAgIGZvdW5kQ29udmVy
c2lvbkNhbmRpZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUtPm9wY29k
ZSgpID09IFVwc2lsb24pIHsKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUqIGNoaWxkID0gdmFs
dWUtPmNoaWxkKDApOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPnR5cGUoKSA9PSBE
b3VibGUpCisgICAgICAgICAgICAgICAgICAgICAgICB1cHNpbG9ucy5hcHBlbmQodmFsdWUpOwor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICBmb3IgKFZhbHVlKiBjaGlsZCA6IHZhbHVlLT5jaGlsZHJlbigpKSB7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+dHlwZSgpID09IERvdWJsZSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIG1fdmFsdWVzVXNlZEFzRG91YmxlLmFkZChjaGlsZCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNh
c2UgQWJzOgotICAgIGNhc2UgQ2VpbDoKLSAgICBjYXNlIEZsb29yOgotICAgIGNhc2UgU3FydDoK
LSAgICAgICAgaWYgKGNhbmRpZGF0ZS0+Y2hpbGQoMCktPm9wY29kZSgpID09IEZsb2F0VG9Eb3Vi
bGUpIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZS0+Y2hpbGQoMCkgPSBjYW5kaWRhdGUtPmNoaWxk
KDApLT5jaGlsZCgwKTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZS0+c2V0VHlwZShGbG9hdCk7CisK
KyAgICAgICAgaWYgKCFmb3VuZENvbnZlcnNpb25DYW5kaWRhdGUpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgLy8gTm93IHdlIGp1c3QgbmVlZCB0byBwcm9wYWdhdGUgdGhy
b3VnaCBQaGktVXBzaWxvbi4KKyAgICAgICAgLy8gQSBVcHNpbG9uIGNhbiBjb252ZXJ0IGl0cyBp
bnB1dCB0byBmbG9hdCBpZiBpdHMgcGhpIGlzIG5ldmVyIHVzZWQgYXMgZG91YmxlLgorICAgICAg
ICAvLyBJZiB3ZSBtb2RpZnkgYSBwaGksIHdlIG5lZWQgdG8gY29udGludWUgdW50aWwgYWxsIHRo
ZSBVcHNpbG9uLVBoaSBjb252ZXJnZS4KKyAgICAgICAgYm9vbCBjaGFuZ2VkUGhpU3RhdGU7Cisg
ICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWRQaGlTdGF0ZSA9IGZhbHNlOworICAgICAg
ICAgICAgZm9yIChWYWx1ZSogdmFsdWUgOiB1cHNpbG9ucykgeworICAgICAgICAgICAgICAgIFVw
c2lsb25WYWx1ZSogdXBzaWxvbiA9IHZhbHVlLT5hczxVcHNpbG9uVmFsdWU+KCk7CisgICAgICAg
ICAgICAgICAgVmFsdWUqIHBoaSA9IHVwc2lsb24tPnBoaSgpOworICAgICAgICAgICAgICAgIGlm
ICghbV92YWx1ZXNVc2VkQXNEb3VibGUuY29udGFpbnMocGhpKSkKKyAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBWYWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hp
bGQoMCk7CisgICAgICAgICAgICAgICAgYm9vbCBjaGlsZENoYW5nZWQgPSBtX3ZhbHVlc1VzZWRB
c0RvdWJsZS5hZGQoY2hpbGQpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZENoYW5nZWQgJiYg
Y2hpbGQtPm9wY29kZSgpID09IFBoaSkKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFBoaVN0
YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoY2hhbmdlZFBoaVN0
YXRlKTsKKworICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgZGF0YUxvZygiQ29u
dmVyc2lvbiBjYW5kaWRhdGVzOlxuIik7CisgICAgICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJs
b2NrIDogbV9wcm9jZWR1cmUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFZhbHVlKiB2YWx1ZSA6
ICpibG9jaykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUtPnR5cGUoKSA9PSBEb3Vi
bGUgJiYgIW1fdmFsdWVzVXNlZEFzRG91YmxlLmNvbnRhaW5zKHZhbHVlKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGRhdGFMb2coIiAgICAiLCBkZWVwRHVtcChtX3Byb2NlZHVyZSwgdmFsdWUp
LCAiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBk
YXRhTG9nKCJcbiIpOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIGJyZWFrOworCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLX0KIAotfSAvLyBu
YW1lc3BhY2UKLQotLy8gVGhlIGdvYWwgb2YgdGhpcyBwaGFzZSBpcyB0byB0cmFuc2Zvcm0gRG91
YmxlIG9wZXJhdGlvbnMKLS8vIGludG8gZmxvYXQgaWYgdGhlIERvdWJsZSByZXN1bHQgaXMgbmV2
ZXIgdXNlZCBhcyBEb3VibGUuCi0vLwotLy8gSW4gQywgdGhhdCB3b3VsZCBiZSBzb21ldGhpbmcg
bGlrZToKLS8vICAgICBmbG9hdCBhZGQoZmxvYXQgYSwgZmxvYXQgYikgewotLy8gICAgICAgICBy
ZXR1cm4gKGRvdWJsZSlhICsgKGRvdWJsZSliOwotLy8gICAgIH0KLS8vCi0vLyBTdWNoIG9wZXJh
dGlvbiBhcmlzZSBpbiBKUyBiZWNhdXNlIHRoZXJlIGFyZSBpcyBubyBGbG9hdCB0eXBlCi0vLyBh
bmQgZmxvYXQgb3BlcmF0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IGFkZGluZyBkb3VibGUtdG8tZmxv
YXQgcm91bmRpbmcuCi0vLwotLy8gVGhlIG9wZXJhdGlvbnMgY2FuIGJlIGRvbmUgZW50aXJlbHkg
d2l0aG91dCBEb3VibGUgY29udmVyc2lvbi4KLS8vIFVzaW5nIGZsb2F0IGluIHBsYWNlIHJlbW92
ZSB0aGUgdXNlbGVzcyBjb252ZXJzaW9uLCBhbmQgdGhlIGZsb2F0Ci0vLyBvcHMgaXMgc29tZXRp
bWUgbWFzc2l2ZWx5IGNoZWFwZXIgKFNRUlQgZm9yIGV4YW1wbGUpLgotLy8KLS8vIElmIHRoZSBE
b3VibGUgdmFsdWUgaXMgdXNlZCBhcyBEb3VibGUsIHdlIGRvIG5vdCBkbyB0aGUgY29udmVyc2lv
bi4KLS8vIEl0IGlzIGNoZWFwZXIgdG8gZG8gYSBjb252ZXJzaW9uIHRoYW4gcmVwZWF0IGFueSBm
bG9hdGluZy1wb2ludCBvcGVyYXRpb24uCi12b2lkIHJlZHVjZURvdWJsZVRvRmxvYXQoUHJvY2Vk
dXJlJiBwcm9jZWR1cmUpCi17Ci0gICAgLy8gRklYTUU6IFdlIHNob3VsZCB0dW5lIHRoaXMgcGhh
c2UgZm9yIHBlcmZvcm1hbmNlIGFuZCBtYWtlIGl0IHBhcnQgb2YgUmVkdWNlU3RyZW5ndGguCi0g
ICAgLy8gUmVkdWNlU3RyZW5ndGggY2FuIGVsaW1pbmF0ZSBub2RlcyB0aGF0IHByZXZlbnRzIHVz
IGZyb20gc2ltcGxpZnlpbmcgb3BlcmF0aW9ucy4KLSAgICBQaGFzZVNjb3BlIHBoYXNlU2NvcGUo
cHJvY2VkdXJlLCAicmVkdWNlRG91YmxlVG9GbG9hdCIpOworICAgIC8vIFRoaXMgc3RlcCBmaW5k
cyBQaGlzIG9mIHR5cGUgRG91YmxlIHRoYXQgZWZmZWN0aXZlbHkgY29udGFpbnMgRmxvYXQgdmFs
dWVzLgorICAgIC8vIEl0IGZsb3dzIHRoYXQgaW5mb3JtYXRpb24gZm9yd2FyZCB0aHJvdWdoIFBo
aS1VcHNpbG9ucy4KKyAgICB2b2lkIGZpbmRQaGlzQ29udGFpbmluZ0Zsb2F0KCkKKyAgICB7Cisg
ICAgICAgIFZlY3RvcjxWYWx1ZSosIDMyPiB1cHNpbG9uczsKKyAgICAgICAgYm9vbCBjaGFuZ2Vk
UGhpU3RhdGUgPSBmYWxzZTsKIAotICAgIEhhc2hTZXQ8VmFsdWUqPiBjYW5kaWRhdGVzOworICAg
ICAgICAvLyBUaGUgRG91YmxlIHZhbHVlIHRoYXQgY2FuIGJlIHNhZmVseSB0dXJuZWQgaW50byBh
IEZsb2F0IGFyZToKKyAgICAgICAgLy8gLSBGbG9hdFRvRG91YmxlCisgICAgICAgIC8vIC0gQ29u
c3REb3VibGUgd2l0aCBhIHZhbHVlIHRoYXQgY29udmVydHMgdG8gRmxvYXQgd2l0aG91dCBsb3Np
bmcgcHJlY2lzaW9uLgorICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9wcm9jZWR1
cmUpIHsKKyAgICAgICAgICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKmJsb2NrKSB7CisgICAgICAg
ICAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSAhPSBVcHNpbG9uKQorICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKIAotICAgIC8vIEZpcnN0LCB3ZSBmaW5kIGFueSB2YWx1ZSB0aGF0IGlz
IGNvbnZlcnRlZCB0byBmbG9hdAotICAgIC8vIGFuZCBvbmx5IHVzZWQgYXMgZmxvYXQuCi0gICAg
Ly8gV2UgYWxzbyBzaW1wbGlmeSBjb21wYXJpc29ucyBzaW5jZSB0aGF0J3MgYWx3YXlzIHNhZmUg
YW5kIHdlCi0gICAgLy8gZG9uJ3Qgd2FudCB0aGVtIHRvIGFwcGVhciBpbiB0aGUgbmV4dCBsb29w
LgotICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBwcm9jZWR1cmUpIHsKLSAgICAgICAgZm9y
IChWYWx1ZSogdmFsdWUgOiAqYmxvY2spIHsKLSAgICAgICAgICAgIHZhbHVlLT5wZXJmb3JtU3Vi
c3RpdHV0aW9uKCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAodmFsdWUtPm9wY29kZSgpKSB7Ci0g
ICAgICAgICAgICBjYXNlIERvdWJsZVRvRmxvYXQ6Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRl
cy5hZGQodmFsdWUtPmNoaWxkKDApKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIGNhc2UgRXF1YWw6Ci0gICAgICAgICAgICBjYXNlIE5vdEVxdWFsOgotICAgICAgICAgICAg
Y2FzZSBMZXNzVGhhbjoKLSAgICAgICAgICAgIGNhc2UgR3JlYXRlclRoYW46Ci0gICAgICAgICAg
ICBjYXNlIExlc3NFcXVhbDoKLSAgICAgICAgICAgIGNhc2UgR3JlYXRlckVxdWFsOgotICAgICAg
ICAgICAgY2FzZSBFcXVhbE9yVW5vcmRlcmVkOgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+
Y2hpbGQoMCktPm9wY29kZSgpID09IEZsb2F0VG9Eb3VibGUgJiYgdmFsdWUtPmNoaWxkKDEpLT5v
cGNvZGUoKSA9PSBGbG9hdFRvRG91YmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlLT5j
aGlsZCgwKSA9IHZhbHVlLT5jaGlsZCgwKS0+Y2hpbGQoMCk7Ci0gICAgICAgICAgICAgICAgICAg
IHZhbHVlLT5jaGlsZCgxKSA9IHZhbHVlLT5jaGlsZCgxKS0+Y2hpbGQoMCk7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBWYWx1ZSogY2hpbGQgPSB2YWx1
ZS0+Y2hpbGQoMCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT50eXBlKCkgIT0gRG91Ymxl
CisgICAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLT5vcGNvZGUoKSA9PSBGbG9hdFRvRG91Ymxl
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChj
aGlsZC0+aGFzRG91YmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvbnN0VmFs
dWUgPSBjaGlsZC0+YXNEb3VibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzSWRlbnRp
Y2FsKHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbnN0VmFsdWUpKSwg
Y29uc3RWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPm9wY29kZSgpID09IFBoaSkg
eworICAgICAgICAgICAgICAgICAgICB1cHNpbG9ucy5hcHBlbmQodmFsdWUpOworICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICBjaGFuZ2VkUGhpU3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIFVwc2lsb25WYWx1ZSog
dXBzaWxvbiA9IHZhbHVlLT5hczxVcHNpbG9uVmFsdWU+KCk7CisgICAgICAgICAgICAgICAgVmFs
dWUqIHBoaSA9IHVwc2lsb24tPnBoaSgpOworICAgICAgICAgICAgICAgIG1fcGhpc0NvbnRhaW5p
bmdEb3VibGUuYWRkKHBoaSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAv
LyBQcm9wYWdhdGUgdGhlIGZsYWdzIGZvcndhcmQuCisgICAgICAgIGRvIHsKKyAgICAgICAgICAg
IGNoYW5nZWRQaGlTdGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChWYWx1ZSogdmFsdWUg
OiB1cHNpbG9ucykgeworICAgICAgICAgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGls
ZCgwKTsKKyAgICAgICAgICAgICAgICBpZiAobV9waGlzQ29udGFpbmluZ0RvdWJsZS5jb250YWlu
cyhjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uID0g
dmFsdWUtPmFzPFVwc2lsb25WYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUqIHBo
aSA9IHVwc2lsb24tPnBoaSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUGhpU3RhdGUg
fD0gbV9waGlzQ29udGFpbmluZ0RvdWJsZS5hZGQocGhpKTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGNoYW5nZWRQaGlTdGF0ZSk7CisKKyAgICAg
ICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIlBoaXMgY29udGFpbmluZyBm
bG9hdCB2YWx1ZXM6XG4iKTsKKyAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBt
X3Byb2NlZHVyZSkgeworICAgICAgICAgICAgICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKmJsb2Nr
KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+b3Bjb2RlKCkgPT0gUGhpCisgICAg
ICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZS0+dHlwZSgpID09IERvdWJsZQorICAgICAgICAg
ICAgICAgICAgICAgICAgJiYgIW1fcGhpc0NvbnRhaW5pbmdEb3VibGUuY29udGFpbnModmFsdWUp
KQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICIsIGRlZXBEdW1wKG1fcHJv
Y2VkdXJlLCB2YWx1ZSksICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGRhdGFMb2coIlxuIik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3Ig
KEJhc2ljQmxvY2sqIGJsb2NrIDogcHJvY2VkdXJlKSB7Ci0gICAgICAgIGZvciAoVmFsdWUqIHZh
bHVlIDogKmJsb2NrKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUtPm9wY29kZSgpID09IERvdWJs
ZVRvRmxvYXQpCi0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgYm9vbCBjYW5CZVRyYW5z
Zm9ybWVkVG9GbG9hdChWYWx1ZSogdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUt
Pm9wY29kZSgpID09IEZsb2F0VG9Eb3VibGUKKyAgICAgICAgICAgIHx8IHZhbHVlLT5oYXNEb3Vi
bGUoKQorICAgICAgICAgICAgfHwgKHZhbHVlLT5vcGNvZGUoKSA9PSBQaGkKKyAgICAgICAgICAg
ICAgICAmJiAodmFsdWUtPnR5cGUoKSA9PSBGbG9hdAorICAgICAgICAgICAgICAgIHx8ICh2YWx1
ZS0+dHlwZSgpID09IERvdWJsZQorICAgICAgICAgICAgICAgICAgICAmJiAhbV9waGlzQ29udGFp
bmluZ0RvdWJsZS5jb250YWlucyh2YWx1ZSkpKSk7CisgICAgfQorCisgICAgVmFsdWUqIHRyYW5z
Zm9ybVRvRmxvYXQoVmFsdWUqIHZhbHVlLCB1bnNpZ25lZCB2YWx1ZUluZGV4LCBJbnNlcnRpb25T
ZXQmIGluc2VydGlvblNldCkKKyAgICB7CisgICAgICAgIEFTU0VSVChjYW5CZVRyYW5zZm9ybWVk
VG9GbG9hdCh2YWx1ZSkpOworICAgICAgICBpZiAodmFsdWUtPm9wY29kZSgpID09IEZsb2F0VG9E
b3VibGUpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUtPmNoaWxkKDApOworCisgICAgICAgIGlm
ICh2YWx1ZS0+aGFzRG91YmxlKCkpCisgICAgICAgICAgICByZXR1cm4gaW5zZXJ0aW9uU2V0Lmlu
c2VydDxDb25zdEZsb2F0VmFsdWU+KHZhbHVlSW5kZXgsIHZhbHVlLT5vcmlnaW4oKSwgc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KHZhbHVlLT5hc0RvdWJsZSgpKSk7CisKKyAgICAgICAgaWYgKHZhbHVlLT5v
cGNvZGUoKSA9PSBQaGkpIHsKKyAgICAgICAgICAgIGNvbnZlcnRQaGkodmFsdWUpOworICAgICAg
ICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZvaWQg
Y29udmVydFBoaShWYWx1ZSogcGhpKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHBoaS0+b3Bjb2Rl
KCkgPT0gUGhpKTsKKyAgICAgICAgcGhpLT5zZXRUeXBlKEZsb2F0KTsKKyAgICAgICAgbV9jb252
ZXJ0ZWRQaGlzLmFkZChwaGkpOworICAgIH0KKworICAgIGJvb2wgYXR0ZW1wdFR3b09wZXJhbmRz
U2ltcGxpZnkoVmFsdWUqIGNhbmRpZGF0ZSwgdW5zaWduZWQgY2FuZGlkYXRlSW5kZXgsIEluc2Vy
dGlvblNldCYgaW5zZXJ0aW9uU2V0KQorICAgIHsKKyAgICAgICAgVmFsdWUqIGxlZnQgPSBjYW5k
aWRhdGUtPmNoaWxkKDApOworICAgICAgICBWYWx1ZSogcmlnaHQgPSBjYW5kaWRhdGUtPmNoaWxk
KDEpOworICAgICAgICBpZiAoIWNhbkJlVHJhbnNmb3JtZWRUb0Zsb2F0KGxlZnQpIHx8ICFjYW5C
ZVRyYW5zZm9ybWVkVG9GbG9hdChyaWdodCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgbV9jb252ZXJ0ZWRWYWx1ZS5hZGQoY2FuZGlkYXRlKTsKKyAgICAgICAgY2FuZGlk
YXRlLT5jaGlsZCgwKSA9IHRyYW5zZm9ybVRvRmxvYXQobGVmdCwgY2FuZGlkYXRlSW5kZXgsIGlu
c2VydGlvblNldCk7CisgICAgICAgIGNhbmRpZGF0ZS0+Y2hpbGQoMSkgPSB0cmFuc2Zvcm1Ub0Zs
b2F0KHJpZ2h0LCBjYW5kaWRhdGVJbmRleCwgaW5zZXJ0aW9uU2V0KTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgLy8gU2ltcGxpZnkgRG91YmxlIG9wZXJhdGlvbnMgaW50byBG
bG9hdCBvcGVyYXRpb25zLgorICAgIHZvaWQgc2ltcGxpZnkoKQorICAgIHsKKyAgICAgICAgVmVj
dG9yPFZhbHVlKiwgMzI+IHVwc2lsb25SZWZlcmVuY2luZ0RvdWJsZVBoaTsKKworICAgICAgICBJ
bnNlcnRpb25TZXQgaW5zZXJ0aW9uU2V0KG1fcHJvY2VkdXJlKTsKKyAgICAgICAgZm9yIChCYXNp
Y0Jsb2NrKiBibG9jayA6IG1fcHJvY2VkdXJlKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGluZGV4ID0gMDsgaW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgICAg
ICAgICAgVmFsdWUqIHZhbHVlID0gYmxvY2stPmF0KGluZGV4KTsKKworICAgICAgICAgICAgICAg
IHN3aXRjaCAodmFsdWUtPm9wY29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFcXVhbDoK
KyAgICAgICAgICAgICAgICBjYXNlIE5vdEVxdWFsOgorICAgICAgICAgICAgICAgIGNhc2UgTGVz
c1RoYW46CisgICAgICAgICAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAgICAgICAg
ICBjYXNlIExlc3NFcXVhbDoKKyAgICAgICAgICAgICAgICBjYXNlIEdyZWF0ZXJFcXVhbDoKKyAg
ICAgICAgICAgICAgICBjYXNlIEVxdWFsT3JVbm9yZGVyZWQ6CisgICAgICAgICAgICAgICAgICAg
IGF0dGVtcHRUd29PcGVyYW5kc1NpbXBsaWZ5KHZhbHVlLCBpbmRleCwgaW5zZXJ0aW9uU2V0KTsK
KyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSBVcHNp
bG9uOiB7CisgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZCgw
KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5vcGNvZGUoKSA9PSBQaGkgJiYgY2hp
bGQtPnR5cGUoKSA9PSBEb3VibGUpCisgICAgICAgICAgICAgICAgICAgICAgICB1cHNpbG9uUmVm
ZXJlbmNpbmdEb3VibGVQaGkuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIGlmIChtX3ZhbHVlc1VzZWRBc0RvdWJsZS5jb250YWlucyh2YWx1ZSkpCisgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS0+b3Bj
b2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFkZDoKKyAgICAgICAgICAgICAgICBjYXNl
IFN1YjoKKyAgICAgICAgICAgICAgICBjYXNlIE11bDoKKyAgICAgICAgICAgICAgICBjYXNlIERp
djoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRUd29PcGVyYW5kc1NpbXBsaWZ5KHZh
bHVlLCBpbmRleCwgaW5zZXJ0aW9uU2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVl
LT5zZXRUeXBlKEZsb2F0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgY2FzZSBBYnM6CisgICAgICAgICAgICAgICAgY2FzZSBDZWlsOgorICAgICAgICAgICAg
ICAgIGNhc2UgRmxvb3I6CisgICAgICAgICAgICAgICAgY2FzZSBTcXJ0OiB7CisgICAgICAgICAg
ICAgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZCgwKTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKGNhbkJlVHJhbnNmb3JtZWRUb0Zsb2F0KGNoaWxkKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgdmFsdWUtPmNoaWxkKDApID0gdHJhbnNmb3JtVG9GbG9hdChjaGlsZCwgaW5k
ZXgsIGluc2VydGlvblNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+c2V0VHlw
ZShGbG9hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbnZlcnRlZFZhbHVlLmFkZCh2
YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRmxvYXRUb0RvdWJsZToK
KyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIGlmIHdlIHJvdW5kIHR3aWNlLgor
ICAgICAgICAgICAgICAgICAgICAvLyBUeXBpY2FsbHksIHRoaXMgaXMgaW5kaXJlY3QgdGhyb3Vn
aCBQaGktVXBzaWxvbnMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBVcHNpbG9uIHJvdW5k
cyBhbmQgdGhlIFBoaSByb3VuZHMuCisgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5zZXRUeXBl
KEZsb2F0KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUtPnJlcGxhY2VXaXRoSWRlbnRpdHko
dmFsdWUtPmNoaWxkKDApKTsKKyAgICAgICAgICAgICAgICAgICAgbV9jb252ZXJ0ZWRWYWx1ZS5h
ZGQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBj
YXNlIFBoaToKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBQaGkgaXMgYWx3YXlzIGNvbnZl
cnRlZCB0byBGbG9hdCwgd2UgYWx3YXlzIG1ha2UgaXQgaW50byBhIGZsb2F0IFBoaS1VcHNpbG9u
LgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc2ltcGxpc3RpYyB2aWV3IG9mIHRo
aW5ncy4gSWRlYWxseSB3ZSBzaG91bGQga2VlcCB0eXBlIHRoYXQgd2lsbCBtaW5pbWl6ZQorICAg
ICAgICAgICAgICAgICAgICAvLyB0aGUgYW1vdW50IG9mIGNvbnZlcnNpb24gaW4gdGhlIGxvb3Au
CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+dHlwZSgpID09IERvdWJsZSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQaGkodmFsdWUpOworICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNl
cnRpb25TZXQuZXhlY3V0ZShibG9jayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXVwc2ls
b25SZWZlcmVuY2luZ0RvdWJsZVBoaS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIElmIGEg
UGhpIGNvbnRhaW5zIEZsb2F0IHZhbHVlcyB0eXBlZCBhcyBEb3VibGUsIGJ1dCBpcyBub3QgdXNl
ZCBhcyBGbG9hdAorICAgICAgICAgICAgLy8gYnkgYSBub24tdHJpdmlhbCBvcGVyYXRpb24sIHdl
IGRpZCBub3QgY29udmVydCBpdC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXZSBm
aXggdGhhdCBub3cgYnkgY29udmVydGluZyB0aGUgcmVtYWluaW5nIHBoaXMgdGhhdCBjb250YWlu
cworICAgICAgICAgICAgLy8gZmxvYXQgYnV0IHdoZXJlIG5vdCBjb252ZXJ0ZWQgdG8gZmxvYXQu
CisgICAgICAgICAgICBib29sIGNoYW5nZWRQaGk7CisgICAgICAgICAgICBkbyB7CisgICAgICAg
ICAgICAgICAgY2hhbmdlZFBoaSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgZm9yIChWYWx1
ZSogdmFsdWUgOiB1cHNpbG9uUmVmZXJlbmNpbmdEb3VibGVQaGkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uID0gdmFsdWUtPmFzPFVwc2lsb25WYWx1ZT4oKTsK
KyAgICAgICAgICAgICAgICAgICAgVmFsdWUqIGNoaWxkID0gdmFsdWUtPmNoaWxkKDApOworICAg
ICAgICAgICAgICAgICAgICBWYWx1ZSogcGhpID0gdXBzaWxvbi0+cGhpKCk7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChwaGktPnR5cGUoKSA9PSBGbG9hdCAmJiBjaGlsZC0+dHlwZSgpID09IERv
dWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1fcGhpc0NvbnRhaW5pbmdEb3VibGUu
Y29udGFpbnMoY2hpbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0UGhpKGNo
aWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQaGkgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IHdoaWxl
IChjaGFuZ2VkUGhpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIGFyZSBpbiBhbiBp
bmNvbnNpc3RlbnQgc3RhdGUgd2hlcmUgd2UgaGF2ZQorICAgIC8vIERvdWJsZVRvRmxvYXQgbm9k
ZXMgb3ZlciB2YWx1ZXMgcHJvZHVjaW5nIGZsb2F0IGFuZCBQaGlzIHRoYXQgYXJlCisgICAgLy8g
ZmxvYXQgZm9yIFVwc2lsb25zIHRoYXQgYXJlIERvdWJsZS4KKyAgICAvLworICAgIC8vIFRoaXMg
c3RlcHMgcHV0cyB1cyBiYWNrIGluIGEgY29uc2lzdGVudCBzdGF0ZS4KKyAgICB2b2lkIGNsZWFu
VXAoKQorICAgIHsKKyAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlvblNldChtX3Byb2NlZHVy
ZSk7CisKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fcHJvY2VkdXJlKSB7Cisg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gMDsgaW5kZXggPCBibG9jay0+c2l6ZSgp
OyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgVmFsdWUqIHZhbHVlID0gYmxvY2stPmF0KGlu
ZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUtPm9wY29kZSgpID09IERvdWJsZVRvRmxv
YXQgJiYgdmFsdWUtPmNoaWxkKDApLT50eXBlKCkgPT0gRmxvYXQpIHsKKyAgICAgICAgICAgICAg
ICAgICAgdmFsdWUtPnJlcGxhY2VXaXRoSWRlbnRpdHkodmFsdWUtPmNoaWxkKDApKTsKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAg
ICBmb3IgKFZhbHVlKiBjaGlsZCA6IHZhbHVlLT5jaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKGNoaWxkLT50eXBlKCkgPT0gRG91YmxlKQotICAgICAgICAgICAgICAgICAgICBjYW5k
aWRhdGVzLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUo
KSA9PSBVcHNpbG9uKSB7CisgICAgICAgICAgICAgICAgICAgIFVwc2lsb25WYWx1ZSogdXBzaWxv
biA9IHZhbHVlLT5hczxVcHNpbG9uVmFsdWU+KCk7CisgICAgICAgICAgICAgICAgICAgIFZhbHVl
KiBjaGlsZCA9IHZhbHVlLT5jaGlsZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUqIHBo
aSA9IHVwc2lsb24tPnBoaSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwaGktPnR5cGUo
KSA9PSBGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT50eXBlKCkg
PT0gRG91YmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUqIG5ld0NoaWxk
ID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPm9wY29k
ZSgpID09IEZsb2F0VG9Eb3VibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5l
d0NoaWxkID0gY2hpbGQtPmNoaWxkKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVs
c2UgaWYgKGNoaWxkLT5oYXNEb3VibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbmV3Q2hpbGQgPSBpbnNlcnRpb25TZXQuaW5zZXJ0PENvbnN0RmxvYXRWYWx1ZT4oaW5kZXgs
IGNoaWxkLT5vcmlnaW4oKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNoaWxkLT5hc0RvdWJsZSgpKSk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBuZXdDaGlsZCA9IGluc2VydGlvblNldC5pbnNlcnQ8VmFsdWU+KGluZGV4LCBE
b3VibGVUb0Zsb2F0LCB1cHNpbG9uLT5vcmlnaW4oKSwgY2hpbGQpOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHVwc2lsb24tPmNoaWxkKDApID0gbmV3Q2hpbGQ7CisgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgh
bV9jb252ZXJ0ZWRWYWx1ZS5jb250YWlucyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAg
Ly8gUGhpcyBjYW4gYmUgY29udmVydGVkIGZyb20gRG91YmxlIHRvIEZsb2F0IGlmIHRoZSB2YWx1
ZSB0aGV5IGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IG1vcmUgcHJlY2lz
ZSB0aGFuIGEgRmxvYXQuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBu
ZWVkZWQgYXMgRG91YmxlLCBpdCBoYXMgdG8gYmUgY29udmVydGVkIGJhY2suCisgICAgICAgICAg
ICAgICAgICAgIGZvciAoVmFsdWUqJiBjaGlsZCA6IHZhbHVlLT5jaGlsZHJlbigpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAobV9jb252ZXJ0ZWRQaGlzLmNvbnRhaW5zKGNoaWxkKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGluc2VydGlvblNldC5pbnNlcnQ8
VmFsdWU+KGluZGV4LCBGbG9hdFRvRG91YmxlLCB2YWx1ZS0+b3JpZ2luKCksIGNoaWxkKTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKGJsb2NrKTsKICAgICAgICAgfQogICAgIH0K
IAotICAgIGlmIChjYW5kaWRhdGVzLmlzRW1wdHkoKSkKKyAgICBQcm9jZWR1cmUmIG1fcHJvY2Vk
dXJlOworCisgICAgLy8gU2V0IG9mIGFsbCB0aGUgRG91YmxlIHZhbHVlcyB0aGF0IGFyZSBhY3R1
YWxseSB1c2VkIGFzIERvdWJsZS4KKyAgICAvLyBDb252ZXJ0aW5nIGFueSBvZiB0aGVtIHRvIEZs
b2F0IHdvdWxkIGxvc2UgcHJlY2lzaW9uLgorICAgIEluZGV4U2V0PFZhbHVlPiBtX3ZhbHVlc1Vz
ZWRBc0RvdWJsZTsKKworICAgIC8vIFNldCBvZiBhbGwgdGhlIFBoaSBvZiB0eXBlIERvdWJsZSB0
aGF0IHJlYWxseSBjb250YWlucyBhIERvdWJsZS4KKyAgICAvLyBBbnkgRG91YmxlIFBoaSBub3Qg
aW4gdGhlIHNldCBjYW4gYmUgY29udmVydGVkIHRvIEZsb2F0IHdpdGhvdXQgbG9zaW5nIHByZWNp
c2lvbi4KKyAgICBJbmRleFNldDxWYWx1ZT4gbV9waGlzQ29udGFpbmluZ0RvdWJsZTsKKworICAg
IC8vIEFueSB2YWx1ZSB0aGF0IHdhcyBjb252ZXJ0ZWQgZnJvbSBwcm9kdWNpbmcgYSBEb3VibGUg
dG8gcHJvZHVjaW5nIGEgRmxvYXQuCisgICAgLy8gVGhpcyBzZXQgZG9lcyBub3QgaW5jbHVkZSBQ
aGktVXBzaWxvbnMuCisgICAgSW5kZXhTZXQ8VmFsdWU+IG1fY29udmVydGVkVmFsdWU7CisKKyAg
ICAvLyBBbnkgdmFsdWUgdGhhdCBwcmV2aW91c2x5IHByb2R1Y2VkIERvdWJsZSBhbmQgbm93IHBy
b2R1Y2UgRmxvYXQuCisgICAgSW5kZXhTZXQ8VmFsdWU+IG1fY29udmVydGVkUGhpczsKK307CisK
K3ZvaWQgcHJpbnRHcmFwaElmQ29udmVydGluZyhQcm9jZWR1cmUmIHByb2NlZHVyZSkKK3sKKyAg
ICBpZiAoIXByaW50UmVtYWluaW5nQ29udmVyc2lvbnMpCiAgICAgICAgIHJldHVybjsKIAotICAg
IC8vIFNlY29uZCwgd2UgZ28gb3ZlciB0aGUgY2FuZGlkYXRlcyBhbmQgYXR0ZW1wdCB0byBzaW1w
bGlmeSB0aGVtLgotICAgIC8vIFRoaXMgbGVhdmVzIHRoZSBncmFwaCBpbiBhbiBpbnZhbGlkIHN0
YXRlIHdoZXJlIEZsb2F0IFZhbHVlcyBhcmUKLSAgICAvLyB1c2VkIGJ5IERvdWJsZVRvRmxvYXQg
VmFsdWVzLiBUaGlzIGlzIG9ubHkgdGVtcG9yYXJ5LgotICAgIGZvciAoVmFsdWUqIGNhbmRpZGF0
ZSA6IGNhbmRpZGF0ZXMpCi0gICAgICAgIGF0dGVtcHRTaW1wbGlmaWNhdGlvbihjYW5kaWRhdGUp
OworICAgIFVzZUNvdW50cyB1c2VDb3VudChwcm9jZWR1cmUpOworCisgICAgVmVjdG9yPFZhbHVl
Kj4gZG91YmxlVG9GbG9hdDsKKyAgICBWZWN0b3I8VmFsdWUqPiBmbG9hdFRvRG91YmxlOwogCi0g
ICAgLy8gRmluYWxseSwgcmVtb3ZlIHRoZSBEb3VibGVUb0Zsb2F0IG1hZGUgdXNlbGVzcyBieSB0
aGUgc2ltcGxpZmljYXRpb25zLgogICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBwcm9jZWR1
cmUpIHsKICAgICAgICAgZm9yIChWYWx1ZSogdmFsdWUgOiAqYmxvY2spIHsKLSAgICAgICAgICAg
IGlmICh2YWx1ZS0+b3Bjb2RlKCkgPT0gRG91YmxlVG9GbG9hdCAmJiB2YWx1ZS0+Y2hpbGQoMCkt
PnR5cGUoKSA9PSBGbG9hdCkKLSAgICAgICAgICAgICAgICB2YWx1ZS0+cmVwbGFjZVdpdGhJZGVu
dGl0eSh2YWx1ZS0+Y2hpbGQoMCkpOworICAgICAgICAgICAgaWYgKCF1c2VDb3VudC5udW1Vc2Vz
KHZhbHVlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHZh
bHVlLT5vcGNvZGUoKSA9PSBEb3VibGVUb0Zsb2F0KQorICAgICAgICAgICAgICAgIGRvdWJsZVRv
RmxvYXQuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZS0+b3Bjb2RlKCkgPT0g
RmxvYXRUb0RvdWJsZSkKKyAgICAgICAgICAgICAgICBmbG9hdFRvRG91YmxlLmFwcGVuZCh2YWx1
ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBXZSBkbyBub3QgY2xlYW4gYWxsIHRoZSB1
c2VsZXNzIG5vZGVzIGFuZCBjb252ZXJzaW9ucy4gUmVkdWNlU3RyZW5ndGggZG9lcyB0aGF0IGJl
dHRlci4KKyAgICBpZiAoZG91YmxlVG9GbG9hdC5pc0VtcHR5KCkgJiYgZmxvYXRUb0RvdWJsZS5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGRhdGFMb2coIlByb2NlZHVyZSB3aXRo
IEZsb2F0LURvdWJsZSBjb252ZXJzaW9uOlxuIiwgcHJvY2VkdXJlLCAiXG4iKTsKKyAgICBkYXRh
TG9nKCJDb252ZXJ0aW5nIG5vZGVzOlxuIik7CisgICAgZm9yIChWYWx1ZSogdmFsdWUgOiBkb3Vi
bGVUb0Zsb2F0KQorICAgICAgICBkYXRhTG9nKCIgICAgIiwgZGVlcER1bXAocHJvY2VkdXJlLCB2
YWx1ZSksICJcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDogZmxvYXRUb0RvdWJsZSkKKyAg
ICAgICAgZGF0YUxvZygiICAgICIsIGRlZXBEdW1wKHByb2NlZHVyZSwgdmFsdWUpLCAiXG4iKTsK
KworfQorCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UuCisKK3ZvaWQgcmVkdWNlRG91YmxlVG9G
bG9hdChQcm9jZWR1cmUmIHByb2NlZHVyZSkKK3sKKyAgICBQaGFzZVNjb3BlIHBoYXNlU2NvcGUo
cHJvY2VkdXJlLCAicmVkdWNlRG91YmxlVG9GbG9hdCIpOworCisgICAgaWYgKHZlcmJvc2UpCisg
ICAgICAgIGRhdGFMb2coIkJlZm9yZSBEb3VibGVUb0Zsb2F0UmVkdWN0aW9uOlxuIiwgcHJvY2Vk
dXJlLCAiXG4iKTsKKworICAgIERvdWJsZVRvRmxvYXRSZWR1Y3Rpb24gZG91YmxlVG9GbG9hdFJl
ZHVjdGlvbihwcm9jZWR1cmUpOworICAgIGRvdWJsZVRvRmxvYXRSZWR1Y3Rpb24ucnVuKCk7CisK
KyAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgZGF0YUxvZygiQWZ0ZXIgRG91YmxlVG9GbG9hdFJl
ZHVjdGlvbjpcbiIsIHByb2NlZHVyZSwgIlxuIik7CisKKyAgICBwcmludEdyYXBoSWZDb252ZXJ0
aW5nKHByb2NlZHVyZSk7CiB9CiAKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMwpkaWZmIC0tZ2l0
IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvdGVzdGIzLmNwcAppbmRleCBkNmUxMmE0YmI1NTcyMWVhODZmNjlkZDQ1ZGI2NmJj
OGM0ZTkzOGMwLi40OGE5YmJlNDliMDQwNzEwZWJlMzUwMzg5ODg1ZWMyNTczZjkxOWQwIDEwMDY0
NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvdGVzdGIzLmNwcAorKysgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvdGVzdGIzLmNwcApAQCAtNDE1Myw2ICs0MTUzLDI2NSBAQCB2b2lk
IHRlc3RTcXJ0QXJnV2l0aEVmZmVjdGZ1bERvdWJsZUNvbnZlcnNpb24oZmxvYXQgYSkKICAgICBD
SEVDSyhpc0lkZW50aWNhbChlZmZlY3QsIHNxcnQoYSkpKTsKIH0KIAordm9pZCB0ZXN0Q29tcGFy
ZVR3b0Zsb2F0VG9Eb3VibGUoZmxvYXQgYSwgZmxvYXQgYikKK3sKKyAgICBQcm9jZWR1cmUgcHJv
YzsKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9jaygpOworCisgICAgVmFsdWUq
IGFyZzFBczMyID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBUcnVuYywgT3JpZ2luKCks
CisgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4o
KSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSk7CisgICAgVmFsdWUqIGFyZzFGbG9hdCA9IHJvb3Qt
PmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmcxQXMzMik7
CisgICAgVmFsdWUqIGFyZzFBc0RvdWJsZSA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywg
RmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGFyZzFGbG9hdCk7CisKKyAgICBWYWx1ZSogYXJnMkFz
MzIgPSByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAg
ICAgcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJ
bmZvOjphcmd1bWVudEdQUjEpKTsKKyAgICBWYWx1ZSogYXJnMkZsb2F0ID0gcm9vdC0+YXBwZW5k
TmV3PFZhbHVlPihwcm9jLCBCaXR3aXNlQ2FzdCwgT3JpZ2luKCksIGFyZzJBczMyKTsKKyAgICBW
YWx1ZSogYXJnMkFzRG91YmxlID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBGbG9hdFRv
RG91YmxlLCBPcmlnaW4oKSwgYXJnMkZsb2F0KTsKKyAgICBWYWx1ZSogZXF1YWwgPSByb290LT5h
cHBlbmROZXc8VmFsdWU+KHByb2MsIEVxdWFsLCBPcmlnaW4oKSwgYXJnMUFzRG91YmxlLCBhcmcy
QXNEb3VibGUpOworCisgICAgcm9vdC0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4ocHJvYywgUmV0
dXJuLCBPcmlnaW4oKSwgZXF1YWwpOworCisgICAgQ0hFQ0soY29tcGlsZUFuZFJ1bjxpbnQ2NF90
Pihwcm9jLCBiaXR3aXNlX2Nhc3Q8aW50MzJfdD4oYSksIGJpdHdpc2VfY2FzdDxpbnQzMl90Pihi
KSkgPT0gKGEgPT0gYikpOworfQorCit2b2lkIHRlc3RDb21wYXJlT25lRmxvYXRUb0RvdWJsZShm
bG9hdCBhLCBkb3VibGUgYikKK3sKKyAgICBQcm9jZWR1cmUgcHJvYzsKKyAgICBCYXNpY0Jsb2Nr
KiByb290ID0gcHJvYy5hZGRCbG9jaygpOworCisgICAgVmFsdWUqIGFyZzFBczMyID0gcm9vdC0+
YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgIHJvb3QtPmFw
cGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1l
bnRHUFIwKSk7CisgICAgVmFsdWUqIGFyZzFGbG9hdCA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4o
cHJvYywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmcxQXMzMik7CisgICAgVmFsdWUqIGFyZzFB
c0RvdWJsZSA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwgT3Jp
Z2luKCksIGFyZzFGbG9hdCk7CisKKyAgICBWYWx1ZSogYXJnMkFzRG91YmxlID0gcm9vdC0+YXBw
ZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBGUFJJbmZvOjphcmd1bWVu
dEZQUjApOworICAgIFZhbHVlKiBlcXVhbCA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywg
RXF1YWwsIE9yaWdpbigpLCBhcmcxQXNEb3VibGUsIGFyZzJBc0RvdWJsZSk7CisKKyAgICByb290
LT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBSZXR1cm4sIE9yaWdpbigpLCBlcXVhbCk7
CisKKyAgICBDSEVDSyhjb21waWxlQW5kUnVuPGludDY0X3Q+KHByb2MsIGJpdHdpc2VfY2FzdDxp
bnQzMl90PihhKSwgYikgPT0gKGEgPT0gYikpOworfQorCit2b2lkIHRlc3RDb21wYXJlRmxvYXRU
b0RvdWJsZVRocm91Z2hQaGkoZmxvYXQgYSwgZmxvYXQgYikKK3sKKyAgICBQcm9jZWR1cmUgcHJv
YzsKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxv
Y2sqIHRoZW5DYXNlID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIGVsc2VDYXNl
ID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIHRhaWwgPSBwcm9jLmFkZEJsb2Nr
KCk7CisKKyAgICBWYWx1ZSogY29uZGl0aW9uID0gcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVn
VmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOworCisgICAgVmFs
dWUqIGFyZzFBczMyID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBUcnVuYywgT3JpZ2lu
KCksCisgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmln
aW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSk7CisgICAgVmFsdWUqIGFyZzFGbG9hdCA9IHJv
b3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmcxQXMz
Mik7CisgICAgVmFsdWUqIGFyZzFBc0RvdWJsZSA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJv
YywgRmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGFyZzFGbG9hdCk7CisKKyAgICBWYWx1ZSogYXJn
MkFzRG91YmxlID0gcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdp
bigpLCBGUFJJbmZvOjphcmd1bWVudEZQUjApOworICAgIFZhbHVlKiBhcmcyQXNGbG9hdCA9IHJv
b3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRG91YmxlVG9GbG9hdCwgT3JpZ2luKCksIGFyZzJB
c0RvdWJsZSk7CisgICAgVmFsdWUqIGFyZzJBc0ZSb3VuZGVkRG91YmxlID0gcm9vdC0+YXBwZW5k
TmV3PFZhbHVlPihwcm9jLCBGbG9hdFRvRG91YmxlLCBPcmlnaW4oKSwgYXJnMkFzRmxvYXQpOwor
CisgICAgcm9vdC0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4oCisgICAgICAgIHByb2MsIEJyYW5j
aCwgT3JpZ2luKCksCisgICAgICAgIGNvbmRpdGlvbiwKKyAgICAgICAgRnJlcXVlbnRlZEJsb2Nr
KHRoZW5DYXNlKSwgRnJlcXVlbnRlZEJsb2NrKGVsc2VDYXNlKSk7CisKKyAgICBVcHNpbG9uVmFs
dWUqIHRoZW5WYWx1ZSA9IHRoZW5DYXNlLT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPihwcm9jLCBP
cmlnaW4oKSwgYXJnMUFzRG91YmxlKTsKKyAgICB0aGVuQ2FzZS0+YXBwZW5kTmV3PENvbnRyb2xW
YWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCksIEZyZXF1ZW50ZWRCbG9jayh0YWlsKSk7CisKKyAg
ICBWYWx1ZSogZWxzZUNvbnN0ID0gZWxzZUNhc2UtPmFwcGVuZE5ldzxDb25zdERvdWJsZVZhbHVl
Pihwcm9jLCBPcmlnaW4oKSwgMC4pOworICAgIFVwc2lsb25WYWx1ZSogZWxzZVZhbHVlID0gZWxz
ZUNhc2UtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KHByb2MsIE9yaWdpbigpLCBlbHNlQ29uc3Qp
OworICAgIGVsc2VDYXNlLT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBKdW1wLCBPcmln
aW4oKSwgRnJlcXVlbnRlZEJsb2NrKHRhaWwpKTsKKworICAgIFZhbHVlKiBkb3VibGVJbnB1dCA9
IHRhaWwtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgUGhpLCBEb3VibGUsIE9yaWdpbigpKTsKKyAg
ICB0aGVuVmFsdWUtPnNldFBoaShkb3VibGVJbnB1dCk7CisgICAgZWxzZVZhbHVlLT5zZXRQaGko
ZG91YmxlSW5wdXQpOworICAgIFZhbHVlKiBlcXVhbCA9IHRhaWwtPmFwcGVuZE5ldzxWYWx1ZT4o
cHJvYywgRXF1YWwsIE9yaWdpbigpLCBkb3VibGVJbnB1dCwgYXJnMkFzRlJvdW5kZWREb3VibGUp
OworICAgIHRhaWwtPmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIFJldHVybiwgT3JpZ2lu
KCksIGVxdWFsKTsKKworICAgIGF1dG8gY29kZSA9IGNvbXBpbGUocHJvYyk7CisgICAgaW50MzJf
dCBpbnRlZ2VyQSA9IGJpdHdpc2VfY2FzdDxpbnQzMl90PihhKTsKKyAgICBkb3VibGUgZG91Ymxl
QiA9IGI7CisgICAgQ0hFQ0soaW52b2tlPGludDY0X3Q+KCpjb2RlLCAxLCBpbnRlZ2VyQSwgZG91
YmxlQikgPT0gKGEgPT0gYikpOworICAgIENIRUNLKGludm9rZTxpbnQ2NF90PigqY29kZSwgMCwg
aW50ZWdlckEsIGRvdWJsZUIpID09IChiID09IDApKTsKK30KKwordm9pZCB0ZXN0RG91YmxlVG9G
bG9hdFRocm91Z2hQaGkoZmxvYXQgdmFsdWUpCit7CisgICAgLy8gU2ltcGxlIGNhc2Ugb2Y6Cisg
ICAgLy8gICAgIGlmIChhKSB7CisgICAgLy8gICAgICAgICB4ID0gRG91YmxlQWRkKGEsIGIpCisg
ICAgLy8gICAgIGVsc2UKKyAgICAvLyAgICAgICAgIHggPSBEb3VibGVBZGQoYSwgYykKKyAgICAv
LyAgICAgRG91YmxlVG9GbG9hdCh4KQorICAgIC8vCisgICAgLy8gQm90aCBBZGRzIGNhbiBiZSBj
b252ZXJ0ZWQgdG8gZmxvYXQgYWRkLgorICAgIFByb2NlZHVyZSBwcm9jOworICAgIEJhc2ljQmxv
Y2sqIHJvb3QgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGhlbkNhc2UgPSBw
cm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogZWxzZUNhc2UgPSBwcm9jLmFkZEJsb2Nr
KCk7CisgICAgQmFzaWNCbG9jayogdGFpbCA9IHByb2MuYWRkQmxvY2soKTsKKworICAgIFZhbHVl
KiBjb25kaXRpb24gPSByb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3Jp
Z2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgVmFsdWUqIGFyZ3VtZW50MzIgPSBy
b290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgcm9v
dC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjph
cmd1bWVudEdQUjEpKTsKKyAgICBWYWx1ZSogZmxvYXRWYWx1ZSA9IHJvb3QtPmFwcGVuZE5ldzxW
YWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmd1bWVudDMyKTsKKyAgICBWYWx1
ZSogYXJnQXNEb3VibGUgPSByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEZsb2F0VG9Eb3Vi
bGUsIE9yaWdpbigpLCBmbG9hdFZhbHVlKTsKKworICAgIHJvb3QtPmFwcGVuZE5ldzxDb250cm9s
VmFsdWU+KAorICAgICAgICBwcm9jLCBCcmFuY2gsIE9yaWdpbigpLAorICAgICAgICBjb25kaXRp
b24sCisgICAgICAgIEZyZXF1ZW50ZWRCbG9jayh0aGVuQ2FzZSksIEZyZXF1ZW50ZWRCbG9jayhl
bHNlQ2FzZSkpOworCisgICAgVmFsdWUqIHBvc3RpdGl2ZUNvbnN0ID0gdGhlbkNhc2UtPmFwcGVu
ZE5ldzxDb25zdERvdWJsZVZhbHVlPihwcm9jLCBPcmlnaW4oKSwgNDIuNWYpOworICAgIFZhbHVl
KiB0aGVuQWRkID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQWRkLCBPcmlnaW4o
KSwgYXJnQXNEb3VibGUsIHBvc3RpdGl2ZUNvbnN0KTsKKyAgICBVcHNpbG9uVmFsdWUqIHRoZW5W
YWx1ZSA9IHRoZW5DYXNlLT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPihwcm9jLCBPcmlnaW4oKSwg
dGhlbkFkZCk7CisgICAgdGhlbkNhc2UtPmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIEp1
bXAsIE9yaWdpbigpLCBGcmVxdWVudGVkQmxvY2sodGFpbCkpOworCisgICAgVmFsdWUqIGVsc2VD
b25zdCA9IGVsc2VDYXNlLT5hcHBlbmROZXc8Q29uc3REb3VibGVWYWx1ZT4ocHJvYywgT3JpZ2lu
KCksIE1fUEkpOworICAgIFVwc2lsb25WYWx1ZSogZWxzZVZhbHVlID0gZWxzZUNhc2UtPmFwcGVu
ZE5ldzxVcHNpbG9uVmFsdWU+KHByb2MsIE9yaWdpbigpLCBlbHNlQ29uc3QpOworICAgIGVsc2VD
YXNlLT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBKdW1wLCBPcmlnaW4oKSwgRnJlcXVl
bnRlZEJsb2NrKHRhaWwpKTsKKworICAgIFZhbHVlKiBkb3VibGVJbnB1dCA9IHRhaWwtPmFwcGVu
ZE5ldzxWYWx1ZT4ocHJvYywgUGhpLCBEb3VibGUsIE9yaWdpbigpKTsKKyAgICB0aGVuVmFsdWUt
PnNldFBoaShkb3VibGVJbnB1dCk7CisgICAgZWxzZVZhbHVlLT5zZXRQaGkoZG91YmxlSW5wdXQp
OworICAgIFZhbHVlKiBmbG9hdFJlc3VsdCA9IHRhaWwtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywg
RG91YmxlVG9GbG9hdCwgT3JpZ2luKCksIGRvdWJsZUlucHV0KTsKKyAgICB0YWlsLT5hcHBlbmRO
ZXc8Q29udHJvbFZhbHVlPihwcm9jLCBSZXR1cm4sIE9yaWdpbigpLCBmbG9hdFJlc3VsdCk7CisK
KyAgICBhdXRvIGNvZGUgPSBjb21waWxlKHByb2MpOworICAgIENIRUNLKGlzSWRlbnRpY2FsKGlu
dm9rZTxmbG9hdD4oKmNvZGUsIDEsIGJpdHdpc2VfY2FzdDxpbnQzMl90Pih2YWx1ZSkpLCB2YWx1
ZSArIDQyLjVmKSk7CisgICAgQ0hFQ0soaXNJZGVudGljYWwoaW52b2tlPGZsb2F0PigqY29kZSwg
MCwgYml0d2lzZV9jYXN0PGludDMyX3Q+KHZhbHVlKSksIHN0YXRpY19jYXN0PGZsb2F0PihNX1BJ
KSkpOworfQorCit2b2lkIHRlc3REb3VibGVQcm9kdWNlclBoaVRvRmxvYXRDb252ZXJzaW9uKGZs
b2F0IHZhbHVlKQoreworICAgIFByb2NlZHVyZSBwcm9jOworICAgIEJhc2ljQmxvY2sqIHJvb3Qg
PSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGhlbkNhc2UgPSBwcm9jLmFkZEJs
b2NrKCk7CisgICAgQmFzaWNCbG9jayogZWxzZUNhc2UgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAg
QmFzaWNCbG9jayogdGFpbCA9IHByb2MuYWRkQmxvY2soKTsKKworICAgIFZhbHVlKiBjb25kaXRp
b24gPSByb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQ
UkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgVmFsdWUqIGFyZ3VtZW50MzIgPSByb290LT5hcHBl
bmROZXc8VmFsdWU+KHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgcm9vdC0+YXBwZW5k
TmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQ
UjEpKTsKKyAgICBWYWx1ZSogZmxvYXRWYWx1ZSA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJv
YywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmd1bWVudDMyKTsKKworICAgIHJvb3QtPmFwcGVu
ZE5ldzxDb250cm9sVmFsdWU+KAorICAgICAgICBwcm9jLCBCcmFuY2gsIE9yaWdpbigpLAorICAg
ICAgICBjb25kaXRpb24sCisgICAgICAgIEZyZXF1ZW50ZWRCbG9jayh0aGVuQ2FzZSksIEZyZXF1
ZW50ZWRCbG9jayhlbHNlQ2FzZSkpOworCisgICAgVmFsdWUqIGFzRG91YmxlID0gdGhlbkNhc2Ut
PmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGZsb2F0VmFs
dWUpOworICAgIFVwc2lsb25WYWx1ZSogdGhlblZhbHVlID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxV
cHNpbG9uVmFsdWU+KHByb2MsIE9yaWdpbigpLCBhc0RvdWJsZSk7CisgICAgdGhlbkNhc2UtPmFw
cGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigpLCBGcmVxdWVudGVkQmxv
Y2sodGFpbCkpOworCisgICAgVmFsdWUqIGNvbnN0RG91YmxlID0gZWxzZUNhc2UtPmFwcGVuZE5l
dzxDb25zdERvdWJsZVZhbHVlPihwcm9jLCBPcmlnaW4oKSwgNDIuNSk7CisgICAgVXBzaWxvblZh
bHVlKiBlbHNlVmFsdWUgPSBlbHNlQ2FzZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4ocHJvYywg
T3JpZ2luKCksIGNvbnN0RG91YmxlKTsKKyAgICBlbHNlQ2FzZS0+YXBwZW5kTmV3PENvbnRyb2xW
YWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCksIEZyZXF1ZW50ZWRCbG9jayh0YWlsKSk7CisKKyAg
ICBWYWx1ZSogZG91YmxlSW5wdXQgPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFBoaSwg
RG91YmxlLCBPcmlnaW4oKSk7CisgICAgdGhlblZhbHVlLT5zZXRQaGkoZG91YmxlSW5wdXQpOwor
ICAgIGVsc2VWYWx1ZS0+c2V0UGhpKGRvdWJsZUlucHV0KTsKKworICAgIFZhbHVlKiBhcmdBc0Rv
dWJsZUFnYWluID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBGbG9hdFRvRG91YmxlLCBP
cmlnaW4oKSwgZmxvYXRWYWx1ZSk7CisgICAgVmFsdWUqIGZpbmFsQWRkID0gdGFpbC0+YXBwZW5k
TmV3PFZhbHVlPihwcm9jLCBBZGQsIE9yaWdpbigpLCBkb3VibGVJbnB1dCwgYXJnQXNEb3VibGVB
Z2Fpbik7CisgICAgVmFsdWUqIGZsb2F0UmVzdWx0ID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihw
cm9jLCBEb3VibGVUb0Zsb2F0LCBPcmlnaW4oKSwgZmluYWxBZGQpOworICAgIHRhaWwtPmFwcGVu
ZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIFJldHVybiwgT3JpZ2luKCksIGZsb2F0UmVzdWx0KTsK
KworICAgIGF1dG8gY29kZSA9IGNvbXBpbGUocHJvYyk7CisgICAgQ0hFQ0soaXNJZGVudGljYWwo
aW52b2tlPGZsb2F0PigqY29kZSwgMSwgYml0d2lzZV9jYXN0PGludDMyX3Q+KHZhbHVlKSksIHZh
bHVlICsgdmFsdWUpKTsKKyAgICBDSEVDSyhpc0lkZW50aWNhbChpbnZva2U8ZmxvYXQ+KCpjb2Rl
LCAwLCBiaXR3aXNlX2Nhc3Q8aW50MzJfdD4odmFsdWUpKSwgNDIuNWYgKyB2YWx1ZSkpOworfQor
Cit2b2lkIHRlc3REb3VibGVQcm9kdWNlclBoaVRvRmxvYXRDb252ZXJzaW9uV2l0aERvdWJsZUNv
bnN1bWVyKGZsb2F0IHZhbHVlKQoreworICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIFVwc2lsb24t
UGhpIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGEgRmxvYXQgdmFsdWUsIGJ1dCBpdCBpcyB1c2VkCisg
ICAgLy8gYXMgYSBGbG9hdCBhbmQgYXMgYSBEb3VibGUuCisgICAgUHJvY2VkdXJlIHByb2M7Cisg
ICAgQmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiB0
aGVuQ2FzZSA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiBlbHNlQ2FzZSA9IHBy
b2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiB0YWlsID0gcHJvYy5hZGRCbG9jaygpOwor
CisgICAgVmFsdWUqIGNvbmRpdGlvbiA9IHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVl
Pihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKKyAgICBWYWx1ZSogYXJn
dW1lbnQzMiA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgVHJ1bmMsIE9yaWdpbigpLAor
ICAgICAgICByb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCks
IEdQUkluZm86OmFyZ3VtZW50R1BSMSkpOworICAgIFZhbHVlKiBmbG9hdFZhbHVlID0gcm9vdC0+
YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBCaXR3aXNlQ2FzdCwgT3JpZ2luKCksIGFyZ3VtZW50MzIp
OworCisgICAgcm9vdC0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4oCisgICAgICAgIHByb2MsIEJy
YW5jaCwgT3JpZ2luKCksCisgICAgICAgIGNvbmRpdGlvbiwKKyAgICAgICAgRnJlcXVlbnRlZEJs
b2NrKHRoZW5DYXNlKSwgRnJlcXVlbnRlZEJsb2NrKGVsc2VDYXNlKSk7CisKKyAgICBWYWx1ZSog
YXNEb3VibGUgPSB0aGVuQ2FzZS0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBGbG9hdFRvRG91Ymxl
LCBPcmlnaW4oKSwgZmxvYXRWYWx1ZSk7CisgICAgVXBzaWxvblZhbHVlKiB0aGVuVmFsdWUgPSB0
aGVuQ2FzZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4ocHJvYywgT3JpZ2luKCksIGFzRG91Ymxl
KTsKKyAgICB0aGVuQ2FzZS0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4ocHJvYywgSnVtcCwgT3Jp
Z2luKCksIEZyZXF1ZW50ZWRCbG9jayh0YWlsKSk7CisKKyAgICBWYWx1ZSogY29uc3REb3VibGUg
PSBlbHNlQ2FzZS0+YXBwZW5kTmV3PENvbnN0RG91YmxlVmFsdWU+KHByb2MsIE9yaWdpbigpLCA0
Mi41KTsKKyAgICBVcHNpbG9uVmFsdWUqIGVsc2VWYWx1ZSA9IGVsc2VDYXNlLT5hcHBlbmROZXc8
VXBzaWxvblZhbHVlPihwcm9jLCBPcmlnaW4oKSwgY29uc3REb3VibGUpOworICAgIGVsc2VDYXNl
LT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBKdW1wLCBPcmlnaW4oKSwgRnJlcXVlbnRl
ZEJsb2NrKHRhaWwpKTsKKworICAgIFZhbHVlKiBkb3VibGVJbnB1dCA9IHRhaWwtPmFwcGVuZE5l
dzxWYWx1ZT4ocHJvYywgUGhpLCBEb3VibGUsIE9yaWdpbigpKTsKKyAgICB0aGVuVmFsdWUtPnNl
dFBoaShkb3VibGVJbnB1dCk7CisgICAgZWxzZVZhbHVlLT5zZXRQaGkoZG91YmxlSW5wdXQpOwor
CisgICAgVmFsdWUqIGFyZ0FzRG91YmxlQWdhaW4gPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHBy
b2MsIEZsb2F0VG9Eb3VibGUsIE9yaWdpbigpLCBmbG9hdFZhbHVlKTsKKyAgICBWYWx1ZSogZmxv
YXRBZGQgPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEFkZCwgT3JpZ2luKCksIGRvdWJs
ZUlucHV0LCBhcmdBc0RvdWJsZUFnYWluKTsKKworICAgIC8vIEZSb3VuZC4KKyAgICBWYWx1ZSog
ZmxvYXRSZXN1bHQgPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIERvdWJsZVRvRmxvYXQs
IE9yaWdpbigpLCBmbG9hdEFkZCk7CisgICAgVmFsdWUqIGRvdWJsZVJlc3VsdCA9IHRhaWwtPmFw
cGVuZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGZsb2F0UmVzdWx0
KTsKKworICAgIC8vIFRoaXMgb25lICpjYW5ub3QqIGJlIGVsaW1pbmF0ZWQKKyAgICBWYWx1ZSog
ZG91YmxlQWRkID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBBZGQsIE9yaWdpbigpLCBk
b3VibGVJbnB1dCwgZG91YmxlUmVzdWx0KTsKKworICAgIHRhaWwtPmFwcGVuZE5ldzxDb250cm9s
VmFsdWU+KHByb2MsIFJldHVybiwgT3JpZ2luKCksIGRvdWJsZUFkZCk7CisKKyAgICBhdXRvIGNv
ZGUgPSBjb21waWxlKHByb2MpOworICAgIENIRUNLKGlzSWRlbnRpY2FsKGludm9rZTxkb3VibGU+
KCpjb2RlLCAxLCBiaXR3aXNlX2Nhc3Q8aW50MzJfdD4odmFsdWUpKSwgKHZhbHVlICsgdmFsdWUp
ICsgc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkpKTsKKyAgICBDSEVDSyhpc0lkZW50aWNhbChp
bnZva2U8ZG91YmxlPigqY29kZSwgMCwgYml0d2lzZV9jYXN0PGludDMyX3Q+KHZhbHVlKSksICg0
Mi41ZiArIHZhbHVlKSArIDQyLjVmKSk7Cit9CisKK3ZvaWQgdGVzdERvdWJsZVByb2R1Y2VyUGhp
V2l0aE5vbkZsb2F0Q29uc3QoZmxvYXQgdmFsdWUsIGRvdWJsZSBjb25zdFZhbHVlKQoreworICAg
IFByb2NlZHVyZSBwcm9jOworICAgIEJhc2ljQmxvY2sqIHJvb3QgPSBwcm9jLmFkZEJsb2NrKCk7
CisgICAgQmFzaWNCbG9jayogdGhlbkNhc2UgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNC
bG9jayogZWxzZUNhc2UgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGFpbCA9
IHByb2MuYWRkQmxvY2soKTsKKworICAgIFZhbHVlKiBjb25kaXRpb24gPSByb290LT5hcHBlbmRO
ZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BS
MCk7CisgICAgVmFsdWUqIGFyZ3VtZW50MzIgPSByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2Ms
IFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFs
dWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKTsKKyAgICBWYWx1ZSog
ZmxvYXRWYWx1ZSA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9y
aWdpbigpLCBhcmd1bWVudDMyKTsKKworICAgIHJvb3QtPmFwcGVuZE5ldzxDb250cm9sVmFsdWU+
KAorICAgICAgICBwcm9jLCBCcmFuY2gsIE9yaWdpbigpLAorICAgICAgICBjb25kaXRpb24sCisg
ICAgICAgIEZyZXF1ZW50ZWRCbG9jayh0aGVuQ2FzZSksIEZyZXF1ZW50ZWRCbG9jayhlbHNlQ2Fz
ZSkpOworCisgICAgVmFsdWUqIGFzRG91YmxlID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxWYWx1ZT4o
cHJvYywgRmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGZsb2F0VmFsdWUpOworICAgIFVwc2lsb25W
YWx1ZSogdGhlblZhbHVlID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KHByb2Ms
IE9yaWdpbigpLCBhc0RvdWJsZSk7CisgICAgdGhlbkNhc2UtPmFwcGVuZE5ldzxDb250cm9sVmFs
dWU+KHByb2MsIEp1bXAsIE9yaWdpbigpLCBGcmVxdWVudGVkQmxvY2sodGFpbCkpOworCisgICAg
VmFsdWUqIGNvbnN0RG91YmxlID0gZWxzZUNhc2UtPmFwcGVuZE5ldzxDb25zdERvdWJsZVZhbHVl
Pihwcm9jLCBPcmlnaW4oKSwgY29uc3RWYWx1ZSk7CisgICAgVXBzaWxvblZhbHVlKiBlbHNlVmFs
dWUgPSBlbHNlQ2FzZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4ocHJvYywgT3JpZ2luKCksIGNv
bnN0RG91YmxlKTsKKyAgICBlbHNlQ2FzZS0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4ocHJvYywg
SnVtcCwgT3JpZ2luKCksIEZyZXF1ZW50ZWRCbG9jayh0YWlsKSk7CisKKyAgICBWYWx1ZSogZG91
YmxlSW5wdXQgPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFBoaSwgRG91YmxlLCBPcmln
aW4oKSk7CisgICAgdGhlblZhbHVlLT5zZXRQaGkoZG91YmxlSW5wdXQpOworICAgIGVsc2VWYWx1
ZS0+c2V0UGhpKGRvdWJsZUlucHV0KTsKKworICAgIFZhbHVlKiBhcmdBc0RvdWJsZUFnYWluID0g
dGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBGbG9hdFRvRG91YmxlLCBPcmlnaW4oKSwgZmxv
YXRWYWx1ZSk7CisgICAgVmFsdWUqIGZpbmFsQWRkID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihw
cm9jLCBBZGQsIE9yaWdpbigpLCBkb3VibGVJbnB1dCwgYXJnQXNEb3VibGVBZ2Fpbik7CisgICAg
VmFsdWUqIGZsb2F0UmVzdWx0ID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBEb3VibGVU
b0Zsb2F0LCBPcmlnaW4oKSwgZmluYWxBZGQpOworICAgIHRhaWwtPmFwcGVuZE5ldzxDb250cm9s
VmFsdWU+KHByb2MsIFJldHVybiwgT3JpZ2luKCksIGZsb2F0UmVzdWx0KTsKKworICAgIGF1dG8g
Y29kZSA9IGNvbXBpbGUocHJvYyk7CisgICAgQ0hFQ0soaXNJZGVudGljYWwoaW52b2tlPGZsb2F0
PigqY29kZSwgMSwgYml0d2lzZV9jYXN0PGludDMyX3Q+KHZhbHVlKSksIHZhbHVlICsgdmFsdWUp
KTsKKyAgICBDSEVDSyhpc0lkZW50aWNhbChpbnZva2U8ZmxvYXQ+KCpjb2RlLCAwLCBiaXR3aXNl
X2Nhc3Q8aW50MzJfdD4odmFsdWUpKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbnN0VmFsdWUgKyB2
YWx1ZSkpKTsKK30KKwogdm9pZCB0ZXN0RG91YmxlQXJnVG9JbnQ2NEJpdHdpc2VDYXN0KGRvdWJs
ZSB2YWx1ZSkKIHsKICAgICBQcm9jZWR1cmUgcHJvYzsKQEAgLTU3OTQsNiArNjA1MywyNSBAQCB2
b2lkIHRlc3RTdG9yZUZsb2F0KGRvdWJsZSBpbnB1dCkKICAgICB9CiB9CiAKK3ZvaWQgdGVzdFN0
b3JlRG91YmxlQ29uc3RhbnRBc0Zsb2F0KGRvdWJsZSBpbnB1dCkKK3sKKyAgICAvLyBTaW1wbGUg
c3RvcmUgZnJvbSBhbiBhZGRyZXNzIGluIGEgcmVnaXN0ZXIuCisgICAgUHJvY2VkdXJlIHByb2M7
CisgICAgQmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBWYWx1ZSogdmFs
dWUgPSByb290LT5hcHBlbmROZXc8Q29uc3REb3VibGVWYWx1ZT4ocHJvYywgT3JpZ2luKCksIGlu
cHV0KTsKKyAgICBWYWx1ZSogdmFsdWVBc0Zsb2F0ID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihw
cm9jLCBEb3VibGVUb0Zsb2F0LCBPcmlnaW4oKSwgdmFsdWUpOworCisgICAgVmFsdWUqIGRlc3Rp
bmF0aW9uQWRkcmVzcyA9IHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBP
cmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKKworICAgIHJvb3QtPmFwcGVuZE5ldzxN
ZW1vcnlWYWx1ZT4ocHJvYywgU3RvcmUsIE9yaWdpbigpLCB2YWx1ZUFzRmxvYXQsIGRlc3RpbmF0
aW9uQWRkcmVzcyk7CisKKyAgICByb290LT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBS
ZXR1cm4sIE9yaWdpbigpLCByb290LT5hcHBlbmROZXc8Q29uc3QzMlZhbHVlPihwcm9jLCBPcmln
aW4oKSwgMCkpOworCisgICAgZmxvYXQgb3V0cHV0ID0gMC47CisgICAgQ0hFQ0soIWNvbXBpbGVB
bmRSdW48aW50NjRfdD4ocHJvYywgaW5wdXQsICZvdXRwdXQpKTsKKyAgICBDSEVDSyhpc0lkZW50
aWNhbChzdGF0aWNfY2FzdDxmbG9hdD4oaW5wdXQpLCBvdXRwdXQpKTsKK30KKwogdm9pZCB0ZXN0
U3BpbGxHUCgpCiB7CiAgICAgUHJvY2VkdXJlIHByb2M7CkBAIC0xMjE0Nyw2ICsxMjQyNSwxNCBA
QCB2b2lkIHJ1bihjb25zdCBjaGFyKiBmaWx0ZXIpCiAgICAgUlVOX1VOQVJZKHRlc3RTcXJ0QXJn
V2l0aFVzZWxlc3NEb3VibGVDb252ZXJzaW9uLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZmxvYXQ+
KCkpOwogICAgIFJVTl9VTkFSWSh0ZXN0U3FydEFyZ1dpdGhFZmZlY3RmdWxEb3VibGVDb252ZXJz
aW9uLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZmxvYXQ+KCkpOwogCisgICAgUlVOX0JJTkFSWSh0
ZXN0Q29tcGFyZVR3b0Zsb2F0VG9Eb3VibGUsIGZsb2F0aW5nUG9pbnRPcGVyYW5kczxmbG9hdD4o
KSwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpKTsKKyAgICBSVU5fQklOQVJZKHRlc3RD
b21wYXJlT25lRmxvYXRUb0RvdWJsZSwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpLCBm
bG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsKKyAgICBSVU5fQklOQVJZKHRlc3RDb21w
YXJlRmxvYXRUb0RvdWJsZVRocm91Z2hQaGksIGZsb2F0aW5nUG9pbnRPcGVyYW5kczxmbG9hdD4o
KSwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpKTsKKyAgICBSVU5fVU5BUlkodGVzdERv
dWJsZVRvRmxvYXRUaHJvdWdoUGhpLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZmxvYXQ+KCkpOwor
ICAgIFJVTl9VTkFSWSh0ZXN0RG91YmxlUHJvZHVjZXJQaGlUb0Zsb2F0Q29udmVyc2lvbiwgZmxv
YXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpKTsKKyAgICBSVU5fVU5BUlkodGVzdERvdWJsZVBy
b2R1Y2VyUGhpVG9GbG9hdENvbnZlcnNpb25XaXRoRG91YmxlQ29uc3VtZXIsIGZsb2F0aW5nUG9p
bnRPcGVyYW5kczxmbG9hdD4oKSk7CisgICAgUlVOX0JJTkFSWSh0ZXN0RG91YmxlUHJvZHVjZXJQ
aGlXaXRoTm9uRmxvYXRDb25zdCwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpLCBmbG9h
dGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsKKwogICAgIFJVTl9VTkFSWSh0ZXN0RG91Ymxl
QXJnVG9JbnQ2NEJpdHdpc2VDYXN0LCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsK
ICAgICBSVU5fVU5BUlkodGVzdERvdWJsZUltbVRvSW50NjRCaXR3aXNlQ2FzdCwgZmxvYXRpbmdQ
b2ludE9wZXJhbmRzPGRvdWJsZT4oKSk7CiAgICAgUlVOX1VOQVJZKHRlc3RUd29CaXR3aXNlQ2Fz
dE9uRG91YmxlLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsKQEAgLTEyMTcyLDYg
KzEyNDU4LDcgQEAgdm9pZCBydW4oY29uc3QgY2hhciogZmlsdGVyKQogICAgIFJVTl9VTkFSWSh0
ZXN0Q29udmVydEZsb2F0VG9Eb3VibGVNZW0sIGZsb2F0aW5nUG9pbnRPcGVyYW5kczxmbG9hdD4o
KSk7CiAgICAgUlVOX1VOQVJZKHRlc3RDb252ZXJ0RG91YmxlVG9GbG9hdFRvRG91YmxlVG9GbG9h
dCwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGRvdWJsZT4oKSk7CiAgICAgUlVOX1VOQVJZKHRlc3RT
dG9yZUZsb2F0LCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsKKyAgICBSVU5fVU5B
UlkodGVzdFN0b3JlRG91YmxlQ29uc3RhbnRBc0Zsb2F0LCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8
ZG91YmxlPigpKTsKICAgICBSVU5fVU5BUlkodGVzdExvYWRGbG9hdENvbnZlcnREb3VibGVDb252
ZXJ0RmxvYXRTdG9yZUZsb2F0LCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZmxvYXQ+KCkpOwogICAg
IFJVTl9VTkFSWSh0ZXN0RnJvdW5kQXJnLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigp
KTsKICAgICBSVU5fVU5BUlkodGVzdEZyb3VuZE1lbSwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGRv
dWJsZT4oKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNz
L2RvdWJsZS1jb21wYXJlLXRvLWZsb2F0LmpzIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3Rz
L3N0cmVzcy9kb3VibGUtY29tcGFyZS10by1mbG9hdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40MjhkNDA1NGY1
NjQ3NGZjNTEzOGI5Y2FlMTUwZGFjNmM3NDA5YmJlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9kb3VibGUtY29tcGFyZS10by1mbG9hdC5qcwpA
QCAtMCwwICsxLDQ5IEBACitmdW5jdGlvbiBjYW5TaW1wbGlmeVRvRmxvYXQoYSwgYikKK3sKKyAg
ICByZXR1cm4gTWF0aC5mcm91bmQoYSkgPT09IE1hdGguZnJvdW5kKGIpOworfQorbm9JbmxpbmUo
Y2FuU2ltcGxpZnlUb0Zsb2F0KTsKKworZnVuY3Rpb24gY2FuU2ltcGxpZnlUb0Zsb2F0V2l0aENv
bnN0YW50KGEpCit7CisgICAgcmV0dXJuIE1hdGguZnJvdW5kKGEpID09PSAxLjA7Cit9Citub0lu
bGluZShjYW5TaW1wbGlmeVRvRmxvYXRXaXRoQ29uc3RhbnQpOworCitmdW5jdGlvbiBjYW5ub3RT
aW1wbGlmeUEoYSwgYikKK3sKKyAgICByZXR1cm4gYSA9PT0gTWF0aC5mcm91bmQoYik7Cit9Citu
b0lubGluZShjYW5ub3RTaW1wbGlmeUEpOworCitmdW5jdGlvbiBjYW5ub3RTaW1wbGlmeUIoYSwg
YikKK3sKKyAgICByZXR1cm4gTWF0aC5mcm91bmQoYSkgPT09IGI7Cit9Citub0lubGluZShjYW5u
b3RTaW1wbGlmeUIpOworCitmb3IgKGxldCBpID0gMTsgaSA8IDFlNDsgKytpKSB7CisgICAgaWYg
KGNhblNpbXBsaWZ5VG9GbG9hdChNYXRoLlBJLCBNYXRoLlBJKSAhPT0gdHJ1ZSkKKyAgICAgICAg
dGhyb3cgIkZhaWxlZCBjYW5TaW1wbGlmeVRvRmxvYXQoTWF0aC5QSSwgTWF0aC5QSSkiOworICAg
IGlmIChjYW5TaW1wbGlmeVRvRmxvYXQoTWF0aC5MTjIsIE1hdGguUEkpICE9PSBmYWxzZSkKKyAg
ICAgICAgdGhyb3cgIkZhaWxlZCBjYW5TaW1wbGlmeVRvRmxvYXQoTWF0aC5MTjIsIE1hdGguUEkp
IjsKKworICAgIGlmIChjYW5TaW1wbGlmeVRvRmxvYXRXaXRoQ29uc3RhbnQoTWF0aC5QSSkgIT09
IGZhbHNlKQorICAgICAgICB0aHJvdyAiRmFpbGVkIGNhblNpbXBsaWZ5VG9GbG9hdFdpdGhDb25z
dGFudChNYXRoLlBJKSI7CisgICAgaWYgKGNhblNpbXBsaWZ5VG9GbG9hdFdpdGhDb25zdGFudCgx
KSAhPT0gdHJ1ZSkKKyAgICAgICAgdGhyb3cgIkZhaWxlZCBjYW5TaW1wbGlmeVRvRmxvYXRXaXRo
Q29uc3RhbnQoMSkiOworCisgICAgaWYgKGNhbm5vdFNpbXBsaWZ5QShNYXRoLlBJLCBNYXRoLlBJ
KSAhPT0gZmFsc2UpCisgICAgICAgIHRocm93ICJGYWlsZWQgY2Fubm90U2ltcGxpZnlBKE1hdGgu
UEksIE1hdGguUEkpIjsKKyAgICBpZiAoY2Fubm90U2ltcGxpZnlBKE1hdGguZnJvdW5kKE1hdGgu
UEkpLCBNYXRoLlBJKSAhPT0gdHJ1ZSkKKyAgICAgICAgdGhyb3cgIkZhaWxlZCBjYW5ub3RTaW1w
bGlmeUEoTWF0aC5yb3VuZChNYXRoLlBJKSwgTWF0aC5QSSkiOworICAgIGlmIChjYW5ub3RTaW1w
bGlmeUEoTWF0aC5MTjIsIE1hdGguUEkpICE9PSBmYWxzZSkKKyAgICAgICAgdGhyb3cgIkZhaWxl
ZCBjYW5ub3RTaW1wbGlmeUEoTWF0aC5MTjIsIE1hdGguUEkpIjsKKworICAgIGlmIChjYW5ub3RT
aW1wbGlmeUIoTWF0aC5QSSwgTWF0aC5QSSkgIT09IGZhbHNlKQorICAgICAgICB0aHJvdyAiRmFp
bGVkIGNhbm5vdFNpbXBsaWZ5QShNYXRoLlBJLCBNYXRoLlBJKSI7CisgICAgaWYgKGNhbm5vdFNp
bXBsaWZ5QihNYXRoLlBJLCBNYXRoLmZyb3VuZChNYXRoLlBJKSkgIT09IHRydWUpCisgICAgICAg
IHRocm93ICJGYWlsZWQgY2Fubm90U2ltcGxpZnlBKE1hdGgucm91bmQoTWF0aC5QSSksIE1hdGgu
UEkpIjsKKyAgICBpZiAoY2Fubm90U2ltcGxpZnlCKE1hdGguTE4yLCBNYXRoLlBJKSAhPT0gZmFs
c2UpCisgICAgICAgIHRocm93ICJGYWlsZWQgY2Fubm90U2ltcGxpZnlBKE1hdGguTE4yLCBNYXRo
LlBJKSI7Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNz
L2RvdWJsZS10by1mbG9hdC5qcyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3Mv
ZG91YmxlLXRvLWZsb2F0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmFkY2MzNzdjNmJmNGQ2YjlhZGM4NDMwNzBm
NjI2MDcyZjU2YjQ5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
dGVzdHMvc3RyZXNzL2RvdWJsZS10by1mbG9hdC5qcwpAQCAtMCwwICsxLDE1NyBAQAorZnVuY3Rp
b24gdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpKGluZGV4LCBpbnB1dCkKK3sKKyAgICAvLyBBbGwg
dXNlcyBvZiAib3V0cHV0RG91YmxlIiBhcmUgY29udmVydGVkIHRvIGZsb2F0LgorICAgIC8vIElu
c2lkZSB0aGUgbG9vcCwgdGhlIFVwc2lsb24gaXMgcmVmZXJlbmNpbmcgaXRzIG93biBQaGkuIFRo
aXMgc2hvdWxkCisgICAgLy8gbm90IHByZXZlbnQgdGhlIGNvbnZlcnNpb24uCisgICAgbGV0IG91
dHB1dERvdWJsZSA9IGlucHV0OworICAgIHdoaWxlIChpbmRleCkgeworICAgICAgICBpZiAoaW5k
ZXggJiAweDQpCisgICAgICAgICAgICBvdXRwdXREb3VibGUgPSBNYXRoLmZyb3VuZChvdXRwdXRE
b3VibGUpICsgTWF0aC5QSTsKKyAgICAgICAgaW5kZXggPSBpbmRleCA+Pj4gMTsKKyAgICB9Cisg
ICAgcmV0dXJuIE1hdGguZnJvdW5kKG91dHB1dERvdWJsZSk7Cit9Citub0lubGluZSh1cHNpbG9u
UmVmZXJlbmNpbmdJdHNQaGkpOworCitsZXQgZXhwZWN0ZWROb3RUYWtlbiA9IE1hdGguZnJvdW5k
KE1hdGguTE4yKTsKK2xldCBleHBlY3RlZFRha2VuID0gTWF0aC5mcm91bmQoTWF0aC5mcm91bmQo
TWF0aC5MTjIpICsgTWF0aC5QSSk7Citmb3IgKGxldCBpID0gMDsgaSA8IDFlNjsgKytpKSB7Cisg
ICAgbGV0IGJyYW5jaE5vdFRha2VuUmVzdWx0ID0gdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpKDMs
IE1hdGguTE4yKTsKKyAgICBpZiAoYnJhbmNoTm90VGFrZW5SZXN1bHQgIT09IGV4cGVjdGVkTm90
VGFrZW4pCisgICAgICAgIHRocm93ICJGYWlsZWQgdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpKDMs
IE1hdGguTE4yKSBhdCBpID0gIiArIGkgKyAiIHJlc3VsdCA9ICIgKyBicmFuY2hOb3RUYWtlblJl
c3VsdDsKKworICAgIGxldCBicmFuY2hUYWtlblJlc3VsdCA9IHVwc2lsb25SZWZlcmVuY2luZ0l0
c1BoaSg3LCBNYXRoLkxOMik7CisgICAgaWYgKGJyYW5jaFRha2VuUmVzdWx0ICE9PSBleHBlY3Rl
ZFRha2VuKQorICAgICAgICB0aHJvdyAiRmFpbGVkIHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaSg3
LCBNYXRoLkxOMikgYXQgaSA9ICIgKyBpICsgIiByZXN1bHQgPSAiICsgYnJhbmNoVGFrZW5SZXN1
bHQ7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB0aGlzIHRpbWUgaXQgaXMgYWx3YXlzIGJl
dHRlciB0byBjb252ZXJ0IHRoZSBvdXRzaWRlIFBoaS1VcHNpbG9uLgorZnVuY3Rpb24gdXBzaWxv
blJlZmVyZW5jaW5nSXRzUGhpQWxsRmxvYXQoaW5kZXgsIGlucHV0KQoreworICAgIGxldCBvdXRw
dXREb3VibGUgPSBNYXRoLmZyb3VuZChpbnB1dCk7CisgICAgd2hpbGUgKGluZGV4KSB7CisgICAg
ICAgIGlmIChpbmRleCAmIDB4NCkKKyAgICAgICAgICAgIG91dHB1dERvdWJsZSA9IE1hdGguZnJv
dW5kKG91dHB1dERvdWJsZSkgKyBNYXRoLlBJOworICAgICAgICBpbmRleCA9IGluZGV4ID4+PiAx
OworICAgIH0KKyAgICByZXR1cm4gTWF0aC5mcm91bmQob3V0cHV0RG91YmxlKTsKK30KK25vSW5s
aW5lKHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaUFsbEZsb2F0KTsKKworZm9yIChsZXQgaSA9IDA7
IGkgPCAxZTY7ICsraSkgeworICAgIGxldCBicmFuY2hOb3RUYWtlblJlc3VsdCA9IHVwc2lsb25S
ZWZlcmVuY2luZ0l0c1BoaUFsbEZsb2F0KDMsIE1hdGguTE4yKTsKKyAgICBpZiAoYnJhbmNoTm90
VGFrZW5SZXN1bHQgIT09IGV4cGVjdGVkTm90VGFrZW4pCisgICAgICAgIHRocm93ICJGYWlsZWQg
dXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpQWxsRmxvYXQoMywgTWF0aC5MTjIpIGF0IGkgPSAiICsg
aSArICIgcmVzdWx0ID0gIiArIGJyYW5jaE5vdFRha2VuUmVzdWx0OworCisgICAgbGV0IGJyYW5j
aFRha2VuUmVzdWx0ID0gdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpQWxsRmxvYXQoNywgTWF0aC5M
TjIpOworICAgIGlmIChicmFuY2hUYWtlblJlc3VsdCAhPT0gZXhwZWN0ZWRUYWtlbikKKyAgICAg
ICAgdGhyb3cgIkZhaWxlZCB1cHNpbG9uUmVmZXJlbmNpbmdJdHNQaGlBbGxGbG9hdCg3LCBNYXRo
LkxOMikgYXQgaSA9ICIgKyBpICsgIiByZXN1bHQgPSAiICsgYnJhbmNoVGFrZW5SZXN1bHQ7Cit9
CisKKy8vIFRoaXMgdGltZSwgY29udmVydGluZyB0byBmbG9hdCB3b3VsZCBiZSBhIG1pc3Rha2Ug
YmVjYXVzZSBvbmUgb2YgdGhlIFBoaQorLy8gaXMgbm90IGNvbnZlcnRlZC4KK2Z1bmN0aW9uIHVw
c2lsb25SZWZlcmVuY2luZ0l0c1BoaVdpdGhvdXRDb252ZXJzaW9uKGluZGV4LCBpbnB1dCkKK3sK
KyAgICBsZXQgb3V0cHV0RG91YmxlID0gaW5wdXQ7CisgICAgd2hpbGUgKGluZGV4KSB7CisgICAg
ICAgIGlmIChpbmRleCAmIDB4NCkKKyAgICAgICAgICAgIG91dHB1dERvdWJsZSA9IE1hdGguZnJv
dW5kKG91dHB1dERvdWJsZSkgKyBNYXRoLlBJOworICAgICAgICBpbmRleCA9IGluZGV4ID4+PiAx
OworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RG91YmxlOworfQorbm9JbmxpbmUodXBzaWxvblJl
ZmVyZW5jaW5nSXRzUGhpV2l0aG91dENvbnZlcnNpb24pOworCitsZXQgZXhwZWN0ZWROb3RUYWtl
bldpdGhvdXRDb252ZXJzaW9uID0gTWF0aC5MTjI7CitsZXQgZXhwZWN0ZWRUYWtlbldpdGhvdXRD
b252ZXJzaW9uID0gTWF0aC5mcm91bmQoTWF0aC5MTjIpICsgTWF0aC5QSTsKK2ZvciAobGV0IGkg
PSAwOyBpIDwgMWU2OyArK2kpIHsKKyAgICBsZXQgYnJhbmNoTm90VGFrZW5SZXN1bHQgPSB1cHNp
bG9uUmVmZXJlbmNpbmdJdHNQaGlXaXRob3V0Q29udmVyc2lvbigzLCBNYXRoLkxOMik7CisgICAg
aWYgKGJyYW5jaE5vdFRha2VuUmVzdWx0ICE9PSBleHBlY3RlZE5vdFRha2VuV2l0aG91dENvbnZl
cnNpb24pCisgICAgICAgIHRocm93ICJGYWlsZWQgdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpV2l0
aG91dENvbnZlcnNpb24oMywgTWF0aC5MTjIpIGF0IGkgPSAiICsgaSArICIgcmVzdWx0ID0gIiAr
IGJyYW5jaE5vdFRha2VuUmVzdWx0OworCisgICAgbGV0IGJyYW5jaFRha2VuUmVzdWx0ID0gdXBz
aWxvblJlZmVyZW5jaW5nSXRzUGhpV2l0aG91dENvbnZlcnNpb24oNywgTWF0aC5MTjIpOworICAg
IGlmIChicmFuY2hUYWtlblJlc3VsdCAhPT0gZXhwZWN0ZWRUYWtlbldpdGhvdXRDb252ZXJzaW9u
KQorICAgICAgICB0aHJvdyAiRmFpbGVkIHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaVdpdGhvdXRD
b252ZXJzaW9uKDcsIE1hdGguTE4yKSBhdCBpID0gIiArIGkgKyAiIHJlc3VsdCA9ICIgKyBicmFu
Y2hUYWtlblJlc3VsdDsKK30KKworZnVuY3Rpb24gY29udmVyc2lvblByb3BhZ2FnZXMoZmxhZ3Ms
IGEsIGIpCit7CisgICAgbGV0IHJlc3VsdCA9IDAuNTsKKyAgICBpZiAoZmxhZ3MgJiAweDEpIHsK
KyAgICAgICAgaWYgKGZsYWdzICYgMHgyKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDQp
IHsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDgpIHsKKyAgICAgICAgICAgICAgICAg
ICAgcmVzdWx0ID0gTWF0aC5mcm91bmQoYSkgKyBNYXRoLmZyb3VuZChiKTsKKyAgICAgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSA2LjU7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQg
PSA0LjU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1
bHQgPSAyLjU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSAxLjU7
CisgICAgfQorICAgIHJldHVybiBNYXRoLmZyb3VuZChyZXN1bHQpOworfQorbm9JbmxpbmUoY29u
dmVyc2lvblByb3BhZ2FnZXMpOworCitsZXQgY29udmVyc2lvblByb3BhZ2FnZUV4cGVjdGVkUmVz
dWx0ID0gTWF0aC5mcm91bmQoTWF0aC5mcm91bmQoTWF0aC5MTjIpICsgTWF0aC5mcm91bmQoTWF0
aC5QSSkpOworZm9yIChsZXQgaSA9IDA7IGkgPCAxZTY7ICsraSkgeworICAgIGxldCByZXN1bHQg
PSBjb252ZXJzaW9uUHJvcGFnYWdlcygweGYsIE1hdGguTE4yLCBNYXRoLlBJKTsKKyAgICBpZiAo
cmVzdWx0ICE9PSBjb252ZXJzaW9uUHJvcGFnYWdlRXhwZWN0ZWRSZXN1bHQpCisgICAgICAgIHRo
cm93ICJGYWlsZWQgY29udmVyc2lvblByb3BhZ2FnZXMoMHhmLCBNYXRoLkxOMiwgTWF0aC5QSSki
OworfQorCisKK2Z1bmN0aW9uIGNoYWluZWRVcHNpbG9uQm90aENvbnZlcnQoY29uZGl0aW9uMSwg
Y29uZGl0aW9uMiwgYSwgYikKK3sKKyAgICBsZXQgZmlyc3RQaGk7CisgICAgaWYgKGNvbmRpdGlv
bjEpCisgICAgICAgIGZpcnN0UGhpID0gTWF0aC5mcm91bmQoYSk7CisgICAgZWxzZQorICAgICAg
ICBmaXJzdFBoaSA9IE1hdGguZnJvdW5kKGIpOworCisgICAgbGV0IHNlY29uZFBoaTsKKyAgICBp
ZiAoY29uZGl0aW9uMikKKyAgICAgICAgc2Vjb25kUGhpID0gZmlyc3RQaGkgKyAyOworICAgIGVs
c2UKKyAgICAgICAgc2Vjb25kUGhpID0gZmlyc3RQaGkgKyAxOworICAgIHJldHVybiBNYXRoLmZy
b3VuZChzZWNvbmRQaGkpOworfQorbm9JbmxpbmUoY2hhaW5lZFVwc2lsb25Cb3RoQ29udmVydCk7
CisKK2xldCBleHBlY3RlZENoYWluZWRVcHNpbG9uQm90aENvbnZlcnQgPSBNYXRoLmZyb3VuZChN
YXRoLmZyb3VuZChNYXRoLlBJKSArIE1hdGguZnJvdW5kKDEpKTsKK2ZvciAobGV0IGkgPSAwOyBp
IDwgMWU2OyArK2kpIHsKKyAgICBpZiAoY2hhaW5lZFVwc2lsb25Cb3RoQ29udmVydCgxLCAwLCBN
YXRoLlBJLCBNYXRoLkxOMikgIT09IGV4cGVjdGVkQ2hhaW5lZFVwc2lsb25Cb3RoQ29udmVydCkK
KyAgICAgICAgdGhyb3cgIkZhaWxlZCBjaGFpbmVkVXBzaWxvbkJvdGhDb252ZXJ0KDEsIDAsIE1h
dGguUEksIE1hdGguTE4yKSI7Cit9CisKK2Z1bmN0aW9uIGNoYWluZWRVcHNpbG9uRmlyc3RDb252
ZXJ0KGNvbmRpdGlvbjEsIGNvbmRpdGlvbjIsIGEsIGIpCit7CisgICAgLy8gVGhpcyBmaXJzdCBw
aGkgaXMgdHJpdmlhbGx5IHNpbXBsaWZpZWQgYnkgdGhlIGZyb3VuZCgpCisgICAgLy8gb2YgdGhl
IHNlY29uZCBpZi1lbHNlLgorICAgIGxldCBmaXJzdFBoaTsKKyAgICBpZiAoY29uZGl0aW9uMSkK
KyAgICAgICAgZmlyc3RQaGkgPSBNYXRoLmZyb3VuZChhKTsKKyAgICBlbHNlCisgICAgICAgIGZp
cnN0UGhpID0gTWF0aC5mcm91bmQoYik7CisKKyAgICAvLyBUaGlzIHNlY29uZCBvbmUgY2Fubm90
IGV2ZXIgYmUgY29udmVydGVkIGJlY2F1c2UgdGhlCisgICAgLy8gcmVzdWx0IGlzIG5vdCByb3Vu
ZGVkIHRvIGZsb2F0LgorICAgIGxldCBzZWNvbmRQaGk7CisgICAgaWYgKGNvbmRpdGlvbjIpCisg
ICAgICAgIHNlY29uZFBoaSA9IE1hdGguZnJvdW5kKGZpcnN0UGhpKSArIE1hdGguZnJvdW5kKDEv
Myk7CisgICAgZWxzZQorICAgICAgICBzZWNvbmRQaGkgPSBNYXRoLmZyb3VuZChmaXJzdFBoaSkg
LSBNYXRoLmZyb3VuZCgxLzMpOworICAgIHJldHVybiBzZWNvbmRQaGk7Cit9Citub0lubGluZShj
aGFpbmVkVXBzaWxvbkZpcnN0Q29udmVydCk7CisKK2xldCBleHBlY3RlZENoYWluZWRVcHNpbG9u
Rmlyc3RDb252ZXJ0ID0gTWF0aC5mcm91bmQoTWF0aC5QSSkgLSBNYXRoLmZyb3VuZCgxLzMpOwor
Zm9yIChsZXQgaSA9IDA7IGkgPCAxZTY7ICsraSkgeworICAgIGlmIChjaGFpbmVkVXBzaWxvbkZp
cnN0Q29udmVydCgxLCAwLCBNYXRoLlBJLCBNYXRoLkxOMikgIT09IGV4cGVjdGVkQ2hhaW5lZFVw
c2lsb25GaXJzdENvbnZlcnQpCisgICAgICAgIHRocm93ICJGYWlsZWQgY2hhaW5lZFVwc2lsb25G
aXJzdENvbnZlcnQoMSwgMCwgTWF0aC5QSSwgTWF0aC5MTjIpIjsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>276441</attachid>
            <date>2016-04-14 15:31:19 -0700</date>
            <delta_ts>2016-04-17 12:52:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-156603-20160414153131.patch</filename>
            <type>text/plain</type>
            <size>48966</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk5NTI5CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBi
YTMwYzdhMjBlMTNjZmNjMzQ3MDU5ZDc2YWM5MDM1OWZiY2JhMmQ0Li43MDljZDM1NjIxZDIxMDUw
MTdlMDAyNGZmZjFlZTkzNTMyNTA0NTgwIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw4NSBAQAorMjAxNi0wNC0xNCAgQmVuamFtaW4gUG91bGFpbiAgPGJwb3VsYWluQGFwcGxl
LmNvbT4KKworICAgICAgICBbSlNDXSBSZWR1Y2VEb3VibGVUb0Zsb2F0IHNob3VsZCB3b3JrIGFj
Y3Jvc3MgUGhpcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTU2NjAzCisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8yNTczNjIwNT4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGV4dGVuZHMg
QjMncyBSZWR1Y2VEb3VibGVUb0Zsb2F0IHBoYXNlIHRvIHdvcmsgYWNjcm9zcworICAgICAgICBV
cHNpbG9uLVBoaXMuIFRoaXMgaXMgaW1wb3J0YW50IHRvIG9wdGltaXplIGxvb3BzIGFuZCBzb21l
IGNyYXp5IGNhc2VzLgorCisgICAgICAgIEluIGl0cyBzaW1wbGVzdCBmb3JtLCB3ZSBjYW4gaGF2
ZSBjb252ZXJzaW9uIHByb3BhZ2F0ZWQgZnJvbSBzb21ldGhpbmcKKyAgICAgICAgbGlrZSB0aGlz
OgorICAgICAgICAgICAgRG91YmxlIEAxID0gUGhpKCkKKyAgICAgICAgICAgIEZsb2F0IEAyID0g
RG91YmxlVG9QaGkoQDEpCisKKyAgICAgICAgV2hlbiB0aGF0IGhhcHBlbnMsIHdlIGp1c3QgbmVl
ZCB0byBwcm9wYWdhdGUgdGhhdCB0aGUgcmVzdWx0IG9ubHkKKyAgICAgICAgbmVlZCBmbG9hdCBw
cmVjaXNpb24gYWNjcm9zcyBhbGwgdmFsdWVzIGNvbWluZyB0byB0aGlzIFBoaS4KKworCisgICAg
ICAgIFRoZXJlIGFyZSBtb3JlIGNvbXBsaWNhdGVkIGNhc2VzIHdoZW4gdGhlIHZhbHVlIHByb2R1
Y2VkIGlzIGVmZmVjdGl2ZWx5IEZsb2F0CisgICAgICAgIGJ1dCB0aGUgdXNlciBvZiB0aGUgdmFs
dWUgZG9lcyBub3QgZG8gRG91YmxlVG9QaGkuCisKKyAgICAgICAgVHlwaWNhbGx5LCB3ZSBoYXZl
IHNvbWV0aGluZyBsaWtlOgorICAgICAgICAgICAgIzEKKyAgICAgICAgICAgICAgICBAMSA9IENv
bnN0RG91YmxlKDEpCisgICAgICAgICAgICAgICAgQDIgPSBVcHNpbG9uKEAxLCBeNSkKKyAgICAg
ICAgICAgICMyCisgICAgICAgICAgICAgICAgQDMgPSBGbG9hdFRvRG91YmxlKEB4KQorICAgICAg
ICAgICAgICAgIEA0ID0gVXBzaWxvbihAMywgXjUpCisgICAgICAgICAgICAjMworICAgICAgICAg
ICAgICAgIEA1ID0gUGhpKCkKKyAgICAgICAgICAgICAgICBANiA9IEFkZChANSwgQHNvbWV0aGlu
Z0Zsb2F0KQorICAgICAgICAgICAgICAgIEA3ID0gRG91YmxlVG9GbG9hdChANikKKworICAgICAg
ICBIZXJlIHdpdGggYSBQaGktVXBzaWxvbiB0aGF0IGlzIGEgRG91YmxlIGJ1dCBjYW4gYmUgcmVw
cmVzZW50ZWQKKyAgICAgICAgYXMgRmxvYXQgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi4KKwor
ICAgICAgICBJdCBpcyB2YWx1YWJsZSB0byBjb252ZXJ0IHN1Y2ggUGhpcyB0byBmbG9hdCBpZiBh
bmQgb25seSBpZiB0aGUgdmFsdWUKKyAgICAgICAgaXMgdXNlZCBhcyBmbG9hdC4gT3RoZXJ3aXNl
LCB5b3UgbWF5IGJlIGp1c3QgYWRkaW5nIHVzZWxlc3MgY29udmVyc2lvbnMKKyAgICAgICAgKGZv
ciBleGFtcGxlLCB0d28gZG91YmxlIGNvbnN0YW50cyB0aGF0IGZsb3cgaW50byBhIGRvdWJsZSBB
ZGQgc2hvdWxkIG5vdAorICAgICAgICB0dXJuIGludG8gdHdvIGZsb2F0IGNvbnN0YW50IGZsb3dp
bmcgaW50byBhIEZsb2F0VG9Eb3VibGUgdGhlbiBBZGQpLgorCisKKyAgICAgICAgUmVkdWNlRG91
YmxlVG9GbG9hdCBkbyB0d28gYW5hbHlzaXMgcGFzc2VzIHRvIGdhdGhlciB0aGUgbmVjZXNzYXJ5
CisgICAgICAgIG1ldGEgaW5mb3JtYXRpb24uIFRoZW4gd2UgaGF2ZSBhIHNpbXBsaWZ5KCkgcGhh
c2UgdG8gYWN0dWFsbHkgcmVkdWNlCisgICAgICAgIG9wZXJhdGlvbi4gRmluYWxseSwgdGhlIGNs
ZWFudXAoKSBwYXNzIHB1dCB0aGUgZ3JhcGggaW50byBhIHZhbGlkCisgICAgICAgIHN0YXRlIGFn
YWluLgorCisgICAgICAgIFRoZSB0d28gYW5hbHlzaXMgcGFzc2VzIHdvcmsgYnkgZGlzcHJvdmlu
ZyB0aGF0IHNvbWV0aGluZyBpcyBmbG9hdC4KKyAgICAgICAgLWZpbmRDYW5kaWRhdGVzKCkgYWNj
dW11bGF0ZXMgYW55dGhpbmcgdXNlZCBhcyBEb3VibGUuCisgICAgICAgIC1maW5kUGhpc0NvbnRh
aW5pbmdGbG9hdCgpIGFjY3VtdWxhdGVzIHBoaXMgdGhhdCB3b3VsZCBsb3NlIHByZWNpc2lvbgor
ICAgICAgICAgYnkgY29udmVydGluZyB0aGUgaW5wdXQgdG8gZmxvYXQuCisKKyAgICAgICAgV2l0
aCB0aGlzIGNoYW5nZSwgVW5pdHkzRCBpbXByb3ZlcyBieSB+MS41JSwgYm94MmQtZjMyIGltcHJv
dmVzCisgICAgICAgIGJ5IH4yLjglIChvbiBIYXN3ZWxsKS4KKworICAgICAgICAqIGIzL0IzUmVk
dWNlRG91YmxlVG9GbG9hdC5jcHA6CisgICAgICAgIChKU0M6OkIzOjpyZWR1Y2VEb3VibGVUb0Zs
b2F0KToKKyAgICAgICAgKiBiMy90ZXN0YjMuY3BwOgorICAgICAgICAoSlNDOjpCMzo6dGVzdENv
bXBhcmVUd29GbG9hdFRvRG91YmxlKToKKyAgICAgICAgKEpTQzo6QjM6OnRlc3RDb21wYXJlT25l
RmxvYXRUb0RvdWJsZSk6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0Q29tcGFyZUZsb2F0VG9Eb3Vi
bGVUaHJvdWdoUGhpKToKKyAgICAgICAgKEpTQzo6QjM6OnRlc3REb3VibGVUb0Zsb2F0VGhyb3Vn
aFBoaSk6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0RG91YmxlUHJvZHVjZXJQaGlUb0Zsb2F0Q29u
dmVyc2lvbik6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0RG91YmxlUHJvZHVjZXJQaGlUb0Zsb2F0
Q29udmVyc2lvbldpdGhEb3VibGVDb25zdW1lcik6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0RG91
YmxlUHJvZHVjZXJQaGlXaXRoTm9uRmxvYXRDb25zdCk6CisgICAgICAgIChKU0M6OkIzOjp0ZXN0
U3RvcmVEb3VibGVDb25zdGFudEFzRmxvYXQpOgorICAgICAgICAoSlNDOjpCMzo6cnVuKToKKyAg
ICAgICAgKiB0ZXN0cy9zdHJlc3MvZG91YmxlLWNvbXBhcmUtdG8tZmxvYXQuanM6IEFkZGVkLgor
ICAgICAgICAoY2FuU2ltcGxpZnlUb0Zsb2F0KToKKyAgICAgICAgKGNhblNpbXBsaWZ5VG9GbG9h
dFdpdGhDb25zdGFudCk6CisgICAgICAgIChjYW5ub3RTaW1wbGlmeUEpOgorICAgICAgICAoY2Fu
bm90U2ltcGxpZnlCKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvZG91YmxlLXRvLWZsb2F0Lmpz
OiBBZGRlZC4KKyAgICAgICAgKHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaSk6CisgICAgICAgICh1
cHNpbG9uUmVmZXJlbmNpbmdJdHNQaGlBbGxGbG9hdCk6CisgICAgICAgICh1cHNpbG9uUmVmZXJl
bmNpbmdJdHNQaGlXaXRob3V0Q29udmVyc2lvbik6CisgICAgICAgIChjb252ZXJzaW9uUHJvcGFn
YWdlcyk6CisgICAgICAgIChjaGFpbmVkVXBzaWxvbkJvdGhDb252ZXJ0KToKKyAgICAgICAgKGNo
YWluZWRVcHNpbG9uRmlyc3RDb252ZXJ0KToKKwogMjAxNi0wNC0xMyAgSm9zZXBoIFBlY29yYXJv
ICA8cGVjb3Jhcm9AYXBwbGUuY29tPgogCiAgICAgICAgIEpTQ29udGV4dCBJbnNwZWN0b3I6IElt
cHJvdmUgQ2xhc3MgaW5zdGFuY2VzIGFuZCBKU0MgQVBJIEV4cG9ydGVkIFZhbHVlcyB2aWV3IGlu
IENvbnNvbGUgLyBPYmplY3RUcmVlCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNSZWR1Y2VEb3VibGVUb0Zsb2F0LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9C
M1JlZHVjZURvdWJsZVRvRmxvYXQuY3BwCmluZGV4IGQ4ZTQzYjRlZWIwMTA2MjU1Yzg5YmY1MzZh
NjAxMjZmMWJhODcyYjkuLmE3YmZlMTZmOWRmYmI2ZTBhNDQ3MTA1N2U3NTcyMTk5Y2I1MTU3MWYg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1JlZHVjZURvdWJsZVRvRmxv
YXQuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM1JlZHVjZURvdWJsZVRvRmxv
YXQuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKQEAgLTI5LDEyNiArMjksNDUwIEBACiAjaWYgRU5BQkxFKEIzX0pJVCkKIAogI2luY2x1ZGUg
IkIzQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgIkIzSW5kZXhTZXQuaCIKKyNpbmNsdWRlICJCM0lu
c2VydGlvblNldElubGluZXMuaCIKICNpbmNsdWRlICJCM1BoYXNlU2NvcGUuaCIKKyNpbmNsdWRl
ICJCM1VzZUNvdW50cy5oIgogI2luY2x1ZGUgIkIzVmFsdWVJbmxpbmVzLmgiCiAKIG5hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgewogCiBuYW1lc3BhY2Ugewotdm9pZCBhdHRlbXB0U2ltcGxp
ZmljYXRpb24oVmFsdWUqIGNhbmRpZGF0ZSkKLXsKLSAgICBzd2l0Y2ggKGNhbmRpZGF0ZS0+b3Bj
b2RlKCkpIHsKLSAgICBjYXNlIEFkZDoKLSAgICBjYXNlIFN1YjoKLSAgICBjYXNlIE11bDoKLSAg
ICBjYXNlIERpdjoKLSAgICAgICAgaWYgKGNhbmRpZGF0ZS0+Y2hpbGQoMCktPm9wY29kZSgpID09
IEZsb2F0VG9Eb3VibGUgJiYgY2FuZGlkYXRlLT5jaGlsZCgxKS0+b3Bjb2RlKCkgPT0gRmxvYXRU
b0RvdWJsZSkgewotICAgICAgICAgICAgY2FuZGlkYXRlLT5jaGlsZCgwKSA9IGNhbmRpZGF0ZS0+
Y2hpbGQoMCktPmNoaWxkKDApOwotICAgICAgICAgICAgY2FuZGlkYXRlLT5jaGlsZCgxKSA9IGNh
bmRpZGF0ZS0+Y2hpbGQoMSktPmNoaWxkKDApOwotICAgICAgICAgICAgY2FuZGlkYXRlLT5zZXRU
eXBlKEZsb2F0KTsKKworYm9vbCB2ZXJib3NlID0gZmFsc2U7Citib29sIHByaW50UmVtYWluaW5n
Q29udmVyc2lvbnMgPSBmYWxzZTsKKworY2xhc3MgRG91YmxlVG9GbG9hdFJlZHVjdGlvbiB7Citw
dWJsaWM6CisgICAgRG91YmxlVG9GbG9hdFJlZHVjdGlvbihQcm9jZWR1cmUmIHByb2NlZHVyZSkK
KyAgICAgICAgOiBtX3Byb2NlZHVyZShwcm9jZWR1cmUpCisgICAgeworICAgIH0KKworICAgIHZv
aWQgcnVuKCkKKyAgICB7CisgICAgICAgIGlmICghZmluZENhbmRpZGF0ZXMoKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBmaW5kUGhpc0NvbnRhaW5pbmdGbG9hdCgpOworCisgICAg
ICAgIHNpbXBsaWZ5KCk7CisKKyAgICAgICAgY2xlYW5VcCgpOworICAgIH0KKworcHJpdmF0ZToK
KyAgICAvLyBUaGlzIHN0ZXAgZmluZCB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBhcyBEb3VibGUgYW5k
IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gRmxvYXQuLgorICAgIC8vIEl0IGZsb3dzIHRoZSBpbmZv
cm1hdGlvbiBiYWNrd2FyZCB0aHJvdWdoIFBoaS1VcHNpbG9ucy4KKyAgICBib29sIGZpbmRDYW5k
aWRhdGVzKCkKKyAgICB7CisgICAgICAgIGJvb2wgZm91bmRDb252ZXJzaW9uQ2FuZGlkYXRlID0g
ZmFsc2U7CisgICAgICAgIFZlY3RvcjxWYWx1ZSosIDMyPiB1cHNpbG9uczsKKworICAgICAgICAv
LyBGaXJzdCwgd2UgZmluZCBhbGwgdmFsdWVzIHRoYXQgYXJlIHN0cmljdGx5IHVzZWQgYXMgZG91
YmxlLgorICAgICAgICAvLyBUaG9zZSBhcmUgdmFsdWVzIHVzZWQgYnkgc29tZXRoaW5nIGVsc2Ug
dGhhbiBEb3VibGVUb0Zsb2F0LgorICAgICAgICAvLworICAgICAgICAvLyBXZSBkb24ndCBrbm93
IHRoZSBzdGF0ZSBvZiBVcHNpbG9ucyB1bnRpbCB0aGVpciBQaGkgaGFzIGJlZW4KKyAgICAgICAg
Ly8gc2V0LiBXZSBqdXN0IGtlZXAgYSBsaXN0IG9mIHRoZW0gYW5kIHVwZGF0ZSB0aGVtIG5leHQu
CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX3Byb2NlZHVyZSkgeworICAgICAg
ICAgICAgZm9yIChWYWx1ZSogdmFsdWUgOiAqYmxvY2spIHsKKyAgICAgICAgICAgICAgICB2YWx1
ZS0+cGVyZm9ybVN1YnN0aXR1dGlvbigpOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5v
cGNvZGUoKSA9PSBEb3VibGVUb0Zsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kQ29u
dmVyc2lvbkNhbmRpZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUqIGNo
aWxkID0gdmFsdWUtPmNoaWxkKDApOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPm9w
Y29kZSgpID09IEZsb2F0VG9Eb3VibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdl
IGRvbid0IHJlYWxseSBuZWVkIHRvIHNpbXBsaWZ5IHRoaXMgZWFybHkgYnV0IGl0IHNpbXBsaWZp
ZXMgZGVidWdnaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPnJlcGxhY2VXaXRo
SWRlbnRpdHkoY2hpbGQtPmNoaWxkKDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICBpZiAodmFsdWUtPm9wY29kZSgpID09IEZsb2F0VG9Eb3VibGUpCisgICAgICAgICAgICAg
ICAgICAgIGZvdW5kQ29udmVyc2lvbkNhbmRpZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgICAg
ICBpZiAodmFsdWUtPm9wY29kZSgpID09IFVwc2lsb24pIHsKKyAgICAgICAgICAgICAgICAgICAg
VmFsdWUqIGNoaWxkID0gdmFsdWUtPmNoaWxkKDApOworICAgICAgICAgICAgICAgICAgICBpZiAo
Y2hpbGQtPnR5cGUoKSA9PSBEb3VibGUpCisgICAgICAgICAgICAgICAgICAgICAgICB1cHNpbG9u
cy5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKFZhbHVlKiBjaGlsZCA6IHZhbHVlLT5j
aGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+dHlwZSgpID09IERv
dWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFsdWVzVXNlZEFzRG91YmxlLmFkZChj
aGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAg
ICAgIGJyZWFrOwotICAgIGNhc2UgQWJzOgotICAgIGNhc2UgQ2VpbDoKLSAgICBjYXNlIEZsb29y
OgotICAgIGNhc2UgU3FydDoKLSAgICAgICAgaWYgKGNhbmRpZGF0ZS0+Y2hpbGQoMCktPm9wY29k
ZSgpID09IEZsb2F0VG9Eb3VibGUpIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZS0+Y2hpbGQoMCkg
PSBjYW5kaWRhdGUtPmNoaWxkKDApLT5jaGlsZCgwKTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZS0+
c2V0VHlwZShGbG9hdCk7CisKKyAgICAgICAgaWYgKCFmb3VuZENvbnZlcnNpb25DYW5kaWRhdGUp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gTm93IHdlIGp1c3QgbmVl
ZCB0byBwcm9wYWdhdGUgdGhyb3VnaCBQaGktVXBzaWxvbi4KKyAgICAgICAgLy8gQSBVcHNpbG9u
IGNhbiBjb252ZXJ0IGl0cyBpbnB1dCB0byBmbG9hdCBpZiBpdHMgcGhpIGlzIG5ldmVyIHVzZWQg
YXMgZG91YmxlLgorICAgICAgICAvLyBJZiB3ZSBtb2RpZnkgYSBwaGksIHdlIG5lZWQgdG8gY29u
dGludWUgdW50aWwgYWxsIHRoZSBVcHNpbG9uLVBoaSBjb252ZXJnZS4KKyAgICAgICAgYm9vbCBj
aGFuZ2VkUGhpU3RhdGU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWRQaGlTdGF0
ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChWYWx1ZSogdmFsdWUgOiB1cHNpbG9ucykgewor
ICAgICAgICAgICAgICAgIFVwc2lsb25WYWx1ZSogdXBzaWxvbiA9IHZhbHVlLT5hczxVcHNpbG9u
VmFsdWU+KCk7CisgICAgICAgICAgICAgICAgVmFsdWUqIHBoaSA9IHVwc2lsb24tPnBoaSgpOwor
ICAgICAgICAgICAgICAgIGlmICghbV92YWx1ZXNVc2VkQXNEb3VibGUuY29udGFpbnMocGhpKSkK
KyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBWYWx1ZSog
Y2hpbGQgPSB2YWx1ZS0+Y2hpbGQoMCk7CisgICAgICAgICAgICAgICAgYm9vbCBjaGlsZENoYW5n
ZWQgPSBtX3ZhbHVlc1VzZWRBc0RvdWJsZS5hZGQoY2hpbGQpOworICAgICAgICAgICAgICAgIGlm
IChjaGlsZENoYW5nZWQgJiYgY2hpbGQtPm9wY29kZSgpID09IFBoaSkKKyAgICAgICAgICAgICAg
ICAgICAgY2hhbmdlZFBoaVN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3
aGlsZSAoY2hhbmdlZFBoaVN0YXRlKTsKKworICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAg
ICAgICAgZGF0YUxvZygiQ29udmVyc2lvbiBjYW5kaWRhdGVzOlxuIik7CisgICAgICAgICAgICBm
b3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9wcm9jZWR1cmUpIHsKKyAgICAgICAgICAgICAgICBm
b3IgKFZhbHVlKiB2YWx1ZSA6ICpibG9jaykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFs
dWUtPnR5cGUoKSA9PSBEb3VibGUgJiYgIW1fdmFsdWVzVXNlZEFzRG91YmxlLmNvbnRhaW5zKHZh
bHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAiLCBkZWVwRHVtcCht
X3Byb2NlZHVyZSwgdmFsdWUpLCAiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBkYXRhTG9nKCJcbiIpOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFr
OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworCisgICAgICAgIHJldHVybiB0cnVlOwog
ICAgIH0KLX0KIAotfSAvLyBuYW1lc3BhY2UKLQotLy8gVGhlIGdvYWwgb2YgdGhpcyBwaGFzZSBp
cyB0byB0cmFuc2Zvcm0gRG91YmxlIG9wZXJhdGlvbnMKLS8vIGludG8gZmxvYXQgaWYgdGhlIERv
dWJsZSByZXN1bHQgaXMgbmV2ZXIgdXNlZCBhcyBEb3VibGUuCi0vLwotLy8gSW4gQywgdGhhdCB3
b3VsZCBiZSBzb21ldGhpbmcgbGlrZToKLS8vICAgICBmbG9hdCBhZGQoZmxvYXQgYSwgZmxvYXQg
YikgewotLy8gICAgICAgICByZXR1cm4gKGRvdWJsZSlhICsgKGRvdWJsZSliOwotLy8gICAgIH0K
LS8vCi0vLyBTdWNoIG9wZXJhdGlvbiBhcmlzZSBpbiBKUyBiZWNhdXNlIHRoZXJlIGFyZSBpcyBu
byBGbG9hdCB0eXBlCi0vLyBhbmQgZmxvYXQgb3BlcmF0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IGFk
ZGluZyBkb3VibGUtdG8tZmxvYXQgcm91bmRpbmcuCi0vLwotLy8gVGhlIG9wZXJhdGlvbnMgY2Fu
IGJlIGRvbmUgZW50aXJlbHkgd2l0aG91dCBEb3VibGUgY29udmVyc2lvbi4KLS8vIFVzaW5nIGZs
b2F0IGluIHBsYWNlIHJlbW92ZSB0aGUgdXNlbGVzcyBjb252ZXJzaW9uLCBhbmQgdGhlIGZsb2F0
Ci0vLyBvcHMgaXMgc29tZXRpbWUgbWFzc2l2ZWx5IGNoZWFwZXIgKFNRUlQgZm9yIGV4YW1wbGUp
LgotLy8KLS8vIElmIHRoZSBEb3VibGUgdmFsdWUgaXMgdXNlZCBhcyBEb3VibGUsIHdlIGRvIG5v
dCBkbyB0aGUgY29udmVyc2lvbi4KLS8vIEl0IGlzIGNoZWFwZXIgdG8gZG8gYSBjb252ZXJzaW9u
IHRoYW4gcmVwZWF0IGFueSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24uCi12b2lkIHJlZHVjZURv
dWJsZVRvRmxvYXQoUHJvY2VkdXJlJiBwcm9jZWR1cmUpCi17Ci0gICAgLy8gRklYTUU6IFdlIHNo
b3VsZCB0dW5lIHRoaXMgcGhhc2UgZm9yIHBlcmZvcm1hbmNlIGFuZCBtYWtlIGl0IHBhcnQgb2Yg
UmVkdWNlU3RyZW5ndGguCi0gICAgLy8gUmVkdWNlU3RyZW5ndGggY2FuIGVsaW1pbmF0ZSBub2Rl
cyB0aGF0IHByZXZlbnRzIHVzIGZyb20gc2ltcGxpZnlpbmcgb3BlcmF0aW9ucy4KLSAgICBQaGFz
ZVNjb3BlIHBoYXNlU2NvcGUocHJvY2VkdXJlLCAicmVkdWNlRG91YmxlVG9GbG9hdCIpOworICAg
IC8vIFRoaXMgc3RlcCBmaW5kcyBQaGlzIG9mIHR5cGUgRG91YmxlIHRoYXQgZWZmZWN0aXZlbHkg
Y29udGFpbnMgRmxvYXQgdmFsdWVzLgorICAgIC8vIEl0IGZsb3dzIHRoYXQgaW5mb3JtYXRpb24g
Zm9yd2FyZCB0aHJvdWdoIFBoaS1VcHNpbG9ucy4KKyAgICB2b2lkIGZpbmRQaGlzQ29udGFpbmlu
Z0Zsb2F0KCkKKyAgICB7CisgICAgICAgIFZlY3RvcjxWYWx1ZSosIDMyPiB1cHNpbG9uczsKKyAg
ICAgICAgYm9vbCBjaGFuZ2VkUGhpU3RhdGUgPSBmYWxzZTsKIAotICAgIEhhc2hTZXQ8VmFsdWUq
PiBjYW5kaWRhdGVzOworICAgICAgICAvLyBUaGUgRG91YmxlIHZhbHVlIHRoYXQgY2FuIGJlIHNh
ZmVseSB0dXJuZWQgaW50byBhIEZsb2F0IGFyZToKKyAgICAgICAgLy8gLSBGbG9hdFRvRG91Ymxl
CisgICAgICAgIC8vIC0gQ29uc3REb3VibGUgd2l0aCBhIHZhbHVlIHRoYXQgY29udmVydHMgdG8g
RmxvYXQgd2l0aG91dCBsb3NpbmcgcHJlY2lzaW9uLgorICAgICAgICBmb3IgKEJhc2ljQmxvY2sq
IGJsb2NrIDogbV9wcm9jZWR1cmUpIHsKKyAgICAgICAgICAgIGZvciAoVmFsdWUqIHZhbHVlIDog
KmJsb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSAhPSBVcHNpbG9u
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgIC8vIEZpcnN0LCB3ZSBmaW5k
IGFueSB2YWx1ZSB0aGF0IGlzIGNvbnZlcnRlZCB0byBmbG9hdAotICAgIC8vIGFuZCBvbmx5IHVz
ZWQgYXMgZmxvYXQuCi0gICAgLy8gV2UgYWxzbyBzaW1wbGlmeSBjb21wYXJpc29ucyBzaW5jZSB0
aGF0J3MgYWx3YXlzIHNhZmUgYW5kIHdlCi0gICAgLy8gZG9uJ3Qgd2FudCB0aGVtIHRvIGFwcGVh
ciBpbiB0aGUgbmV4dCBsb29wLgotICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBwcm9jZWR1
cmUpIHsKLSAgICAgICAgZm9yIChWYWx1ZSogdmFsdWUgOiAqYmxvY2spIHsKLSAgICAgICAgICAg
IHZhbHVlLT5wZXJmb3JtU3Vic3RpdHV0aW9uKCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAodmFs
dWUtPm9wY29kZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIERvdWJsZVRvRmxvYXQ6Ci0gICAgICAg
ICAgICAgICAgY2FuZGlkYXRlcy5hZGQodmFsdWUtPmNoaWxkKDApKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRXF1YWw6Ci0gICAgICAgICAgICBjYXNlIE5vdEVx
dWFsOgotICAgICAgICAgICAgY2FzZSBMZXNzVGhhbjoKLSAgICAgICAgICAgIGNhc2UgR3JlYXRl
clRoYW46Ci0gICAgICAgICAgICBjYXNlIExlc3NFcXVhbDoKLSAgICAgICAgICAgIGNhc2UgR3Jl
YXRlckVxdWFsOgotICAgICAgICAgICAgY2FzZSBFcXVhbE9yVW5vcmRlcmVkOgotICAgICAgICAg
ICAgICAgIGlmICh2YWx1ZS0+Y2hpbGQoMCktPm9wY29kZSgpID09IEZsb2F0VG9Eb3VibGUgJiYg
dmFsdWUtPmNoaWxkKDEpLT5vcGNvZGUoKSA9PSBGbG9hdFRvRG91YmxlKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIHZhbHVlLT5jaGlsZCgwKSA9IHZhbHVlLT5jaGlsZCgwKS0+Y2hpbGQoMCk7Ci0g
ICAgICAgICAgICAgICAgICAgIHZhbHVlLT5jaGlsZCgxKSA9IHZhbHVlLT5jaGlsZCgxKS0+Y2hp
bGQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBW
YWx1ZSogY2hpbGQgPSB2YWx1ZS0+Y2hpbGQoMCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxk
LT50eXBlKCkgIT0gRG91YmxlCisgICAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLT5vcGNvZGUo
KSA9PSBGbG9hdFRvRG91YmxlKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICAgICAgICAgIGlmIChjaGlsZC0+aGFzRG91YmxlKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgZG91YmxlIGNvbnN0VmFsdWUgPSBjaGlsZC0+YXNEb3VibGUoKTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKGlzSWRlbnRpY2FsKHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGNvbnN0VmFsdWUpKSwgY29uc3RWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQt
Pm9wY29kZSgpID09IFBoaSkgeworICAgICAgICAgICAgICAgICAgICB1cHNpbG9ucy5hcHBlbmQo
dmFsdWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICBjaGFuZ2VkUGhpU3RhdGUgPSB0cnVlOworICAgICAgICAgICAg
ICAgIFVwc2lsb25WYWx1ZSogdXBzaWxvbiA9IHZhbHVlLT5hczxVcHNpbG9uVmFsdWU+KCk7Cisg
ICAgICAgICAgICAgICAgVmFsdWUqIHBoaSA9IHVwc2lsb24tPnBoaSgpOworICAgICAgICAgICAg
ICAgIG1fcGhpc0NvbnRhaW5pbmdEb3VibGUuYWRkKHBoaSk7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KKworICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGZsYWdzIGZvcndhcmQuCisgICAgICAg
IGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWRQaGlTdGF0ZSA9IGZhbHNlOworICAgICAgICAgICAg
Zm9yIChWYWx1ZSogdmFsdWUgOiB1cHNpbG9ucykgeworICAgICAgICAgICAgICAgIFZhbHVlKiBj
aGlsZCA9IHZhbHVlLT5jaGlsZCgwKTsKKyAgICAgICAgICAgICAgICBpZiAobV9waGlzQ29udGFp
bmluZ0RvdWJsZS5jb250YWlucyhjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVXBzaWxv
blZhbHVlKiB1cHNpbG9uID0gdmFsdWUtPmFzPFVwc2lsb25WYWx1ZT4oKTsKKyAgICAgICAgICAg
ICAgICAgICAgVmFsdWUqIHBoaSA9IHVwc2lsb24tPnBoaSgpOworICAgICAgICAgICAgICAgICAg
ICBjaGFuZ2VkUGhpU3RhdGUgfD0gbV9waGlzQ29udGFpbmluZ0RvdWJsZS5hZGQocGhpKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGNoYW5nZWRQ
aGlTdGF0ZSk7CisKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2co
IlBoaXMgY29udGFpbmluZyBmbG9hdCB2YWx1ZXM6XG4iKTsKKyAgICAgICAgICAgIGZvciAoQmFz
aWNCbG9jayogYmxvY2sgOiBtX3Byb2NlZHVyZSkgeworICAgICAgICAgICAgICAgIGZvciAoVmFs
dWUqIHZhbHVlIDogKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+b3Bj
b2RlKCkgPT0gUGhpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZS0+dHlwZSgpID09
IERvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1fcGhpc0NvbnRhaW5pbmdEb3Vi
bGUuY29udGFpbnModmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAg
ICIsIGRlZXBEdW1wKG1fcHJvY2VkdXJlLCB2YWx1ZSksICJcbiIpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFMb2coIlxuIik7CisgICAgICAgIH0K
ICAgICB9CiAKLSAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogcHJvY2VkdXJlKSB7Ci0gICAg
ICAgIGZvciAoVmFsdWUqIHZhbHVlIDogKmJsb2NrKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUt
Pm9wY29kZSgpID09IERvdWJsZVRvRmxvYXQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgYm9vbCBjYW5CZVRyYW5zZm9ybWVkVG9GbG9hdChWYWx1ZSogdmFsdWUpCisgICAgeworICAg
ICAgICByZXR1cm4gdmFsdWUtPm9wY29kZSgpID09IEZsb2F0VG9Eb3VibGUKKyAgICAgICAgICAg
IHx8IHZhbHVlLT5oYXNEb3VibGUoKQorICAgICAgICAgICAgfHwgKHZhbHVlLT5vcGNvZGUoKSA9
PSBQaGkKKyAgICAgICAgICAgICAgICAmJiAodmFsdWUtPnR5cGUoKSA9PSBGbG9hdAorICAgICAg
ICAgICAgICAgIHx8ICh2YWx1ZS0+dHlwZSgpID09IERvdWJsZQorICAgICAgICAgICAgICAgICAg
ICAmJiAhbV9waGlzQ29udGFpbmluZ0RvdWJsZS5jb250YWlucyh2YWx1ZSkpKSk7CisgICAgfQor
CisgICAgVmFsdWUqIHRyYW5zZm9ybVRvRmxvYXQoVmFsdWUqIHZhbHVlLCB1bnNpZ25lZCB2YWx1
ZUluZGV4LCBJbnNlcnRpb25TZXQmIGluc2VydGlvblNldCkKKyAgICB7CisgICAgICAgIEFTU0VS
VChjYW5CZVRyYW5zZm9ybWVkVG9GbG9hdCh2YWx1ZSkpOworICAgICAgICBpZiAodmFsdWUtPm9w
Y29kZSgpID09IEZsb2F0VG9Eb3VibGUpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUtPmNoaWxk
KDApOworCisgICAgICAgIGlmICh2YWx1ZS0+aGFzRG91YmxlKCkpCisgICAgICAgICAgICByZXR1
cm4gaW5zZXJ0aW9uU2V0Lmluc2VydDxDb25zdEZsb2F0VmFsdWU+KHZhbHVlSW5kZXgsIHZhbHVl
LT5vcmlnaW4oKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlLT5hc0RvdWJsZSgpKSk7CisKKyAg
ICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSA9PSBQaGkpIHsKKyAgICAgICAgICAgIGNvbnZlcnRQ
aGkodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOwor
ICAgIH0KKworICAgIHZvaWQgY29udmVydFBoaShWYWx1ZSogcGhpKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKHBoaS0+b3Bjb2RlKCkgPT0gUGhpKTsKKyAgICAgICAgcGhpLT5zZXRUeXBlKEZsb2F0
KTsKKyAgICAgICAgbV9jb252ZXJ0ZWRQaGlzLmFkZChwaGkpOworICAgIH0KKworICAgIGJvb2wg
YXR0ZW1wdFR3b09wZXJhbmRzU2ltcGxpZnkoVmFsdWUqIGNhbmRpZGF0ZSwgdW5zaWduZWQgY2Fu
ZGlkYXRlSW5kZXgsIEluc2VydGlvblNldCYgaW5zZXJ0aW9uU2V0KQorICAgIHsKKyAgICAgICAg
VmFsdWUqIGxlZnQgPSBjYW5kaWRhdGUtPmNoaWxkKDApOworICAgICAgICBWYWx1ZSogcmlnaHQg
PSBjYW5kaWRhdGUtPmNoaWxkKDEpOworICAgICAgICBpZiAoIWNhbkJlVHJhbnNmb3JtZWRUb0Zs
b2F0KGxlZnQpIHx8ICFjYW5CZVRyYW5zZm9ybWVkVG9GbG9hdChyaWdodCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbV9jb252ZXJ0ZWRWYWx1ZS5hZGQoY2FuZGlkYXRl
KTsKKyAgICAgICAgY2FuZGlkYXRlLT5jaGlsZCgwKSA9IHRyYW5zZm9ybVRvRmxvYXQobGVmdCwg
Y2FuZGlkYXRlSW5kZXgsIGluc2VydGlvblNldCk7CisgICAgICAgIGNhbmRpZGF0ZS0+Y2hpbGQo
MSkgPSB0cmFuc2Zvcm1Ub0Zsb2F0KHJpZ2h0LCBjYW5kaWRhdGVJbmRleCwgaW5zZXJ0aW9uU2V0
KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gU2ltcGxpZnkgRG91Ymxl
IG9wZXJhdGlvbnMgaW50byBGbG9hdCBvcGVyYXRpb25zLgorICAgIHZvaWQgc2ltcGxpZnkoKQor
ICAgIHsKKyAgICAgICAgVmVjdG9yPFZhbHVlKiwgMzI+IHVwc2lsb25SZWZlcmVuY2luZ0RvdWJs
ZVBoaTsKKworICAgICAgICBJbnNlcnRpb25TZXQgaW5zZXJ0aW9uU2V0KG1fcHJvY2VkdXJlKTsK
KyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fcHJvY2VkdXJlKSB7CisgICAgICAg
ICAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gMDsgaW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2lu
ZGV4KSB7CisgICAgICAgICAgICAgICAgVmFsdWUqIHZhbHVlID0gYmxvY2stPmF0KGluZGV4KTsK
KworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUtPm9wY29kZSgpKSB7CisgICAgICAgICAg
ICAgICAgY2FzZSBFcXVhbDoKKyAgICAgICAgICAgICAgICBjYXNlIE5vdEVxdWFsOgorICAgICAg
ICAgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICAgICAgY2FzZSBHcmVhdGVyVGhh
bjoKKyAgICAgICAgICAgICAgICBjYXNlIExlc3NFcXVhbDoKKyAgICAgICAgICAgICAgICBjYXNl
IEdyZWF0ZXJFcXVhbDoKKyAgICAgICAgICAgICAgICBjYXNlIEVxdWFsT3JVbm9yZGVyZWQ6Cisg
ICAgICAgICAgICAgICAgICAgIGF0dGVtcHRUd29PcGVyYW5kc1NpbXBsaWZ5KHZhbHVlLCBpbmRl
eCwgaW5zZXJ0aW9uU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgY2FzZSBVcHNpbG9uOiB7CisgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBjaGls
ZCA9IHZhbHVlLT5jaGlsZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5vcGNv
ZGUoKSA9PSBQaGkgJiYgY2hpbGQtPnR5cGUoKSA9PSBEb3VibGUpCisgICAgICAgICAgICAgICAg
ICAgICAgICB1cHNpbG9uUmVmZXJlbmNpbmdEb3VibGVQaGkuYXBwZW5kKHZhbHVlKTsKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhbHVlc1VzZWRBc0RvdWJsZS5jb250YWlucyh2
YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAg
c3dpdGNoICh2YWx1ZS0+b3Bjb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFkZDoKKyAg
ICAgICAgICAgICAgICBjYXNlIFN1YjoKKyAgICAgICAgICAgICAgICBjYXNlIE11bDoKKyAgICAg
ICAgICAgICAgICBjYXNlIERpdjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRUd29P
cGVyYW5kc1NpbXBsaWZ5KHZhbHVlLCBpbmRleCwgaW5zZXJ0aW9uU2V0KSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHZhbHVlLT5zZXRUeXBlKEZsb2F0KTsKKyAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBYnM6CisgICAgICAgICAgICAgICAgY2FzZSBD
ZWlsOgorICAgICAgICAgICAgICAgIGNhc2UgRmxvb3I6CisgICAgICAgICAgICAgICAgY2FzZSBT
cXJ0OiB7CisgICAgICAgICAgICAgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZCgw
KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkJlVHJhbnNmb3JtZWRUb0Zsb2F0KGNoaWxk
KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPmNoaWxkKDApID0gdHJhbnNmb3Jt
VG9GbG9hdChjaGlsZCwgaW5kZXgsIGluc2VydGlvblNldCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICB2YWx1ZS0+c2V0VHlwZShGbG9hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Nv
bnZlcnRlZFZhbHVlLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNh
c2UgRmxvYXRUb0RvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIGlm
IHdlIHJvdW5kIHR3aWNlLgorICAgICAgICAgICAgICAgICAgICAvLyBUeXBpY2FsbHksIHRoaXMg
aXMgaW5kaXJlY3QgdGhyb3VnaCBQaGktVXBzaWxvbnMuCisgICAgICAgICAgICAgICAgICAgIC8v
IFRoZSBVcHNpbG9uIHJvdW5kcyBhbmQgdGhlIFBoaSByb3VuZHMuCisgICAgICAgICAgICAgICAg
ICAgIHZhbHVlLT5zZXRUeXBlKEZsb2F0KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUtPnJl
cGxhY2VXaXRoSWRlbnRpdHkodmFsdWUtPmNoaWxkKDApKTsKKyAgICAgICAgICAgICAgICAgICAg
bV9jb252ZXJ0ZWRWYWx1ZS5hZGQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICBjYXNlIFBoaToKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBQ
aGkgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byBGbG9hdCwgd2UgYWx3YXlzIG1ha2UgaXQgaW50byBh
IGZsb2F0IFBoaS1VcHNpbG9uLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc2lt
cGxpc3RpYyB2aWV3IG9mIHRoaW5ncy4gSWRlYWxseSB3ZSBzaG91bGQga2VlcCB0eXBlIHRoYXQg
d2lsbCBtaW5pbWl6ZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYW1vdW50IG9mIGNvbnZl
cnNpb24gaW4gdGhlIGxvb3AuCisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+dHlwZSgp
ID09IERvdWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQaGkodmFsdWUpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpbnNlcnRpb25TZXQuZXhlY3V0ZShibG9jayk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoIXVwc2lsb25SZWZlcmVuY2luZ0RvdWJsZVBoaS5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgICAgIC8vIElmIGEgUGhpIGNvbnRhaW5zIEZsb2F0IHZhbHVlcyB0eXBlZCBhcyBEb3Vi
bGUsIGJ1dCBpcyBub3QgdXNlZCBhcyBGbG9hdAorICAgICAgICAgICAgLy8gYnkgYSBub24tdHJp
dmlhbCBvcGVyYXRpb24sIHdlIGRpZCBub3QgY29udmVydCBpdC4KKyAgICAgICAgICAgIC8vCisg
ICAgICAgICAgICAvLyBXZSBmaXggdGhhdCBub3cgYnkgY29udmVydGluZyB0aGUgcmVtYWluaW5n
IHBoaXMgdGhhdCBjb250YWlucworICAgICAgICAgICAgLy8gZmxvYXQgYnV0IHdoZXJlIG5vdCBj
b252ZXJ0ZWQgdG8gZmxvYXQuCisgICAgICAgICAgICBib29sIGNoYW5nZWRQaGk7CisgICAgICAg
ICAgICBkbyB7CisgICAgICAgICAgICAgICAgY2hhbmdlZFBoaSA9IGZhbHNlOworCisgICAgICAg
ICAgICAgICAgZm9yIChWYWx1ZSogdmFsdWUgOiB1cHNpbG9uUmVmZXJlbmNpbmdEb3VibGVQaGkp
IHsKKyAgICAgICAgICAgICAgICAgICAgVXBzaWxvblZhbHVlKiB1cHNpbG9uID0gdmFsdWUtPmFz
PFVwc2lsb25WYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUqIGNoaWxkID0gdmFs
dWUtPmNoaWxkKDApOworICAgICAgICAgICAgICAgICAgICBWYWx1ZSogcGhpID0gdXBzaWxvbi0+
cGhpKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaGktPnR5cGUoKSA9PSBGbG9hdCAmJiBj
aGlsZC0+dHlwZSgpID09IERvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1fcGhp
c0NvbnRhaW5pbmdEb3VibGUuY29udGFpbnMoY2hpbGQpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBjb252ZXJ0UGhpKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQ
aGkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9IHdoaWxlIChjaGFuZ2VkUGhpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIFdlIGFyZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgd2hlcmUgd2UgaGF2ZQorICAgIC8v
IERvdWJsZVRvRmxvYXQgbm9kZXMgb3ZlciB2YWx1ZXMgcHJvZHVjaW5nIGZsb2F0IGFuZCBQaGlz
IHRoYXQgYXJlCisgICAgLy8gZmxvYXQgZm9yIFVwc2lsb25zIHRoYXQgYXJlIERvdWJsZS4KKyAg
ICAvLworICAgIC8vIFRoaXMgc3RlcHMgcHV0cyB1cyBiYWNrIGluIGEgY29uc2lzdGVudCBzdGF0
ZS4KKyAgICB2b2lkIGNsZWFuVXAoKQorICAgIHsKKyAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2Vy
dGlvblNldChtX3Byb2NlZHVyZSk7CisKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6
IG1fcHJvY2VkdXJlKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gMDsgaW5k
ZXggPCBibG9jay0+c2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgVmFsdWUqIHZh
bHVlID0gYmxvY2stPmF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUtPm9wY29k
ZSgpID09IERvdWJsZVRvRmxvYXQgJiYgdmFsdWUtPmNoaWxkKDApLT50eXBlKCkgPT0gRmxvYXQp
IHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUtPnJlcGxhY2VXaXRoSWRlbnRpdHkodmFsdWUt
PmNoaWxkKDApKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAg
ICAgfQogCi0gICAgICAgICAgICBmb3IgKFZhbHVlKiBjaGlsZCA6IHZhbHVlLT5jaGlsZHJlbigp
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkLT50eXBlKCkgPT0gRG91YmxlKQotICAgICAg
ICAgICAgICAgICAgICBjYW5kaWRhdGVzLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICAgICAg
aWYgKHZhbHVlLT5vcGNvZGUoKSA9PSBVcHNpbG9uKSB7CisgICAgICAgICAgICAgICAgICAgIFVw
c2lsb25WYWx1ZSogdXBzaWxvbiA9IHZhbHVlLT5hczxVcHNpbG9uVmFsdWU+KCk7CisgICAgICAg
ICAgICAgICAgICAgIFZhbHVlKiBjaGlsZCA9IHZhbHVlLT5jaGlsZCgwKTsKKyAgICAgICAgICAg
ICAgICAgICAgVmFsdWUqIHBoaSA9IHVwc2lsb24tPnBoaSgpOworCisgICAgICAgICAgICAgICAg
ICAgIGlmIChwaGktPnR5cGUoKSA9PSBGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGNoaWxkLT50eXBlKCkgPT0gRG91YmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgVmFsdWUqIG5ld0NoaWxkID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoY2hpbGQtPm9wY29kZSgpID09IEZsb2F0VG9Eb3VibGUpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG5ld0NoaWxkID0gY2hpbGQtPmNoaWxkKDApOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLT5oYXNEb3VibGUoKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQgPSBpbnNlcnRpb25TZXQuaW5zZXJ0PENvbnN0
RmxvYXRWYWx1ZT4oaW5kZXgsIGNoaWxkLT5vcmlnaW4oKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNo
aWxkLT5hc0RvdWJsZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZCA9IGluc2VydGlvblNldC5pbnNl
cnQ8VmFsdWU+KGluZGV4LCBEb3VibGVUb0Zsb2F0LCB1cHNpbG9uLT5vcmlnaW4oKSwgY2hpbGQp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwc2lsb24tPmNoaWxkKDApID0gbmV3Q2hp
bGQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGlmICghbV9jb252ZXJ0ZWRWYWx1ZS5jb250YWlucyh2YWx1ZSkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgLy8gUGhpcyBjYW4gYmUgY29udmVydGVkIGZyb20gRG91YmxlIHRv
IEZsb2F0IGlmIHRoZSB2YWx1ZSB0aGV5IGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgICAgLy8g
aXMgbm90IG1vcmUgcHJlY2lzZSB0aGFuIGEgRmxvYXQuCisgICAgICAgICAgICAgICAgICAgIC8v
IElmIHRoZSB2YWx1ZSBpcyBuZWVkZWQgYXMgRG91YmxlLCBpdCBoYXMgdG8gYmUgY29udmVydGVk
IGJhY2suCisgICAgICAgICAgICAgICAgICAgIGZvciAoVmFsdWUqJiBjaGlsZCA6IHZhbHVlLT5j
aGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9jb252ZXJ0ZWRQaGlz
LmNvbnRhaW5zKGNoaWxkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGlu
c2VydGlvblNldC5pbnNlcnQ8VmFsdWU+KGluZGV4LCBGbG9hdFRvRG91YmxlLCB2YWx1ZS0+b3Jp
Z2luKCksIGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKGJsb2NrKTsK
ICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChjYW5kaWRhdGVzLmlzRW1wdHkoKSkKKyAgICBQ
cm9jZWR1cmUmIG1fcHJvY2VkdXJlOworCisgICAgLy8gU2V0IG9mIGFsbCB0aGUgRG91YmxlIHZh
bHVlcyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIGFzIERvdWJsZS4KKyAgICAvLyBDb252ZXJ0aW5n
IGFueSBvZiB0aGVtIHRvIEZsb2F0IHdvdWxkIGxvc2UgcHJlY2lzaW9uLgorICAgIEluZGV4U2V0
PFZhbHVlPiBtX3ZhbHVlc1VzZWRBc0RvdWJsZTsKKworICAgIC8vIFNldCBvZiBhbGwgdGhlIFBo
aSBvZiB0eXBlIERvdWJsZSB0aGF0IHJlYWxseSBjb250YWlucyBhIERvdWJsZS4KKyAgICAvLyBB
bnkgRG91YmxlIFBoaSBub3QgaW4gdGhlIHNldCBjYW4gYmUgY29udmVydGVkIHRvIEZsb2F0IHdp
dGhvdXQgbG9zaW5nIHByZWNpc2lvbi4KKyAgICBJbmRleFNldDxWYWx1ZT4gbV9waGlzQ29udGFp
bmluZ0RvdWJsZTsKKworICAgIC8vIEFueSB2YWx1ZSB0aGF0IHdhcyBjb252ZXJ0ZWQgZnJvbSBw
cm9kdWNpbmcgYSBEb3VibGUgdG8gcHJvZHVjaW5nIGEgRmxvYXQuCisgICAgLy8gVGhpcyBzZXQg
ZG9lcyBub3QgaW5jbHVkZSBQaGktVXBzaWxvbnMuCisgICAgSW5kZXhTZXQ8VmFsdWU+IG1fY29u
dmVydGVkVmFsdWU7CisKKyAgICAvLyBBbnkgdmFsdWUgdGhhdCBwcmV2aW91c2x5IHByb2R1Y2Vk
IERvdWJsZSBhbmQgbm93IHByb2R1Y2UgRmxvYXQuCisgICAgSW5kZXhTZXQ8VmFsdWU+IG1fY29u
dmVydGVkUGhpczsKK307CisKK3ZvaWQgcHJpbnRHcmFwaElmQ29udmVydGluZyhQcm9jZWR1cmUm
IHByb2NlZHVyZSkKK3sKKyAgICBpZiAoIXByaW50UmVtYWluaW5nQ29udmVyc2lvbnMpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIC8vIFNlY29uZCwgd2UgZ28gb3ZlciB0aGUgY2FuZGlkYXRlcyBh
bmQgYXR0ZW1wdCB0byBzaW1wbGlmeSB0aGVtLgotICAgIC8vIFRoaXMgbGVhdmVzIHRoZSBncmFw
aCBpbiBhbiBpbnZhbGlkIHN0YXRlIHdoZXJlIEZsb2F0IFZhbHVlcyBhcmUKLSAgICAvLyB1c2Vk
IGJ5IERvdWJsZVRvRmxvYXQgVmFsdWVzLiBUaGlzIGlzIG9ubHkgdGVtcG9yYXJ5LgotICAgIGZv
ciAoVmFsdWUqIGNhbmRpZGF0ZSA6IGNhbmRpZGF0ZXMpCi0gICAgICAgIGF0dGVtcHRTaW1wbGlm
aWNhdGlvbihjYW5kaWRhdGUpOworICAgIFVzZUNvdW50cyB1c2VDb3VudChwcm9jZWR1cmUpOwor
CisgICAgVmVjdG9yPFZhbHVlKj4gZG91YmxlVG9GbG9hdDsKKyAgICBWZWN0b3I8VmFsdWUqPiBm
bG9hdFRvRG91YmxlOwogCi0gICAgLy8gRmluYWxseSwgcmVtb3ZlIHRoZSBEb3VibGVUb0Zsb2F0
IG1hZGUgdXNlbGVzcyBieSB0aGUgc2ltcGxpZmljYXRpb25zLgogICAgIGZvciAoQmFzaWNCbG9j
ayogYmxvY2sgOiBwcm9jZWR1cmUpIHsKICAgICAgICAgZm9yIChWYWx1ZSogdmFsdWUgOiAqYmxv
Y2spIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS0+b3Bjb2RlKCkgPT0gRG91YmxlVG9GbG9hdCAm
JiB2YWx1ZS0+Y2hpbGQoMCktPnR5cGUoKSA9PSBGbG9hdCkKLSAgICAgICAgICAgICAgICB2YWx1
ZS0+cmVwbGFjZVdpdGhJZGVudGl0eSh2YWx1ZS0+Y2hpbGQoMCkpOworICAgICAgICAgICAgaWYg
KCF1c2VDb3VudC5udW1Vc2VzKHZhbHVlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgaWYgKHZhbHVlLT5vcGNvZGUoKSA9PSBEb3VibGVUb0Zsb2F0KQorICAgICAg
ICAgICAgICAgIGRvdWJsZVRvRmxvYXQuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh2
YWx1ZS0+b3Bjb2RlKCkgPT0gRmxvYXRUb0RvdWJsZSkKKyAgICAgICAgICAgICAgICBmbG9hdFRv
RG91YmxlLmFwcGVuZCh2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBXZSBkbyBu
b3QgY2xlYW4gYWxsIHRoZSB1c2VsZXNzIG5vZGVzIGFuZCBjb252ZXJzaW9ucy4gUmVkdWNlU3Ry
ZW5ndGggZG9lcyB0aGF0IGJldHRlci4KKyAgICBpZiAoZG91YmxlVG9GbG9hdC5pc0VtcHR5KCkg
JiYgZmxvYXRUb0RvdWJsZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGRhdGFM
b2coIlByb2NlZHVyZSB3aXRoIEZsb2F0LURvdWJsZSBjb252ZXJzaW9uOlxuIiwgcHJvY2VkdXJl
LCAiXG4iKTsKKyAgICBkYXRhTG9nKCJDb252ZXJ0aW5nIG5vZGVzOlxuIik7CisgICAgZm9yIChW
YWx1ZSogdmFsdWUgOiBkb3VibGVUb0Zsb2F0KQorICAgICAgICBkYXRhTG9nKCIgICAgIiwgZGVl
cER1bXAocHJvY2VkdXJlLCB2YWx1ZSksICJcbiIpOworICAgIGZvciAoVmFsdWUqIHZhbHVlIDog
ZmxvYXRUb0RvdWJsZSkKKyAgICAgICAgZGF0YUxvZygiICAgICIsIGRlZXBEdW1wKHByb2NlZHVy
ZSwgdmFsdWUpLCAiXG4iKTsKKworfQorCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UuCisKK3Zv
aWQgcmVkdWNlRG91YmxlVG9GbG9hdChQcm9jZWR1cmUmIHByb2NlZHVyZSkKK3sKKyAgICBQaGFz
ZVNjb3BlIHBoYXNlU2NvcGUocHJvY2VkdXJlLCAicmVkdWNlRG91YmxlVG9GbG9hdCIpOworCisg
ICAgaWYgKHZlcmJvc2UpCisgICAgICAgIGRhdGFMb2coIkJlZm9yZSBEb3VibGVUb0Zsb2F0UmVk
dWN0aW9uOlxuIiwgcHJvY2VkdXJlLCAiXG4iKTsKKworICAgIERvdWJsZVRvRmxvYXRSZWR1Y3Rp
b24gZG91YmxlVG9GbG9hdFJlZHVjdGlvbihwcm9jZWR1cmUpOworICAgIGRvdWJsZVRvRmxvYXRS
ZWR1Y3Rpb24ucnVuKCk7CisKKyAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgZGF0YUxvZygiQWZ0
ZXIgRG91YmxlVG9GbG9hdFJlZHVjdGlvbjpcbiIsIHByb2NlZHVyZSwgIlxuIik7CisKKyAgICBw
cmludEdyYXBoSWZDb252ZXJ0aW5nKHByb2NlZHVyZSk7CiB9CiAKIH0gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL3Rlc3RiMy5jcHAg
Yi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvdGVzdGIzLmNwcAppbmRleCBkNmUxMmE0YmI1NTcy
MWVhODZmNjlkZDQ1ZGI2NmJjOGM0ZTkzOGMwLi40OGE5YmJlNDliMDQwNzEwZWJlMzUwMzg5ODg1
ZWMyNTczZjkxOWQwIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvdGVzdGIz
LmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvdGVzdGIzLmNwcApAQCAtNDE1Myw2
ICs0MTUzLDI2NSBAQCB2b2lkIHRlc3RTcXJ0QXJnV2l0aEVmZmVjdGZ1bERvdWJsZUNvbnZlcnNp
b24oZmxvYXQgYSkKICAgICBDSEVDSyhpc0lkZW50aWNhbChlZmZlY3QsIHNxcnQoYSkpKTsKIH0K
IAordm9pZCB0ZXN0Q29tcGFyZVR3b0Zsb2F0VG9Eb3VibGUoZmxvYXQgYSwgZmxvYXQgYikKK3sK
KyAgICBQcm9jZWR1cmUgcHJvYzsKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9j
aygpOworCisgICAgVmFsdWUqIGFyZzFBczMyID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9j
LCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1Zh
bHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSk7CisgICAgVmFsdWUq
IGFyZzFGbG9hdCA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9y
aWdpbigpLCBhcmcxQXMzMik7CisgICAgVmFsdWUqIGFyZzFBc0RvdWJsZSA9IHJvb3QtPmFwcGVu
ZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGFyZzFGbG9hdCk7CisK
KyAgICBWYWx1ZSogYXJnMkFzMzIgPSByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFRydW5j
LCBPcmlnaW4oKSwKKyAgICAgICAgcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHBy
b2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKTsKKyAgICBWYWx1ZSogYXJnMkZs
b2F0ID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBCaXR3aXNlQ2FzdCwgT3JpZ2luKCks
IGFyZzJBczMyKTsKKyAgICBWYWx1ZSogYXJnMkFzRG91YmxlID0gcm9vdC0+YXBwZW5kTmV3PFZh
bHVlPihwcm9jLCBGbG9hdFRvRG91YmxlLCBPcmlnaW4oKSwgYXJnMkZsb2F0KTsKKyAgICBWYWx1
ZSogZXF1YWwgPSByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEVxdWFsLCBPcmlnaW4oKSwg
YXJnMUFzRG91YmxlLCBhcmcyQXNEb3VibGUpOworCisgICAgcm9vdC0+YXBwZW5kTmV3PENvbnRy
b2xWYWx1ZT4ocHJvYywgUmV0dXJuLCBPcmlnaW4oKSwgZXF1YWwpOworCisgICAgQ0hFQ0soY29t
cGlsZUFuZFJ1bjxpbnQ2NF90Pihwcm9jLCBiaXR3aXNlX2Nhc3Q8aW50MzJfdD4oYSksIGJpdHdp
c2VfY2FzdDxpbnQzMl90PihiKSkgPT0gKGEgPT0gYikpOworfQorCit2b2lkIHRlc3RDb21wYXJl
T25lRmxvYXRUb0RvdWJsZShmbG9hdCBhLCBkb3VibGUgYikKK3sKKyAgICBQcm9jZWR1cmUgcHJv
YzsKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9jaygpOworCisgICAgVmFsdWUq
IGFyZzFBczMyID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBUcnVuYywgT3JpZ2luKCks
CisgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4o
KSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKSk7CisgICAgVmFsdWUqIGFyZzFGbG9hdCA9IHJvb3Qt
PmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmcxQXMzMik7
CisgICAgVmFsdWUqIGFyZzFBc0RvdWJsZSA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywg
RmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGFyZzFGbG9hdCk7CisKKyAgICBWYWx1ZSogYXJnMkFz
RG91YmxlID0gcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigp
LCBGUFJJbmZvOjphcmd1bWVudEZQUjApOworICAgIFZhbHVlKiBlcXVhbCA9IHJvb3QtPmFwcGVu
ZE5ldzxWYWx1ZT4ocHJvYywgRXF1YWwsIE9yaWdpbigpLCBhcmcxQXNEb3VibGUsIGFyZzJBc0Rv
dWJsZSk7CisKKyAgICByb290LT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBSZXR1cm4s
IE9yaWdpbigpLCBlcXVhbCk7CisKKyAgICBDSEVDSyhjb21waWxlQW5kUnVuPGludDY0X3Q+KHBy
b2MsIGJpdHdpc2VfY2FzdDxpbnQzMl90PihhKSwgYikgPT0gKGEgPT0gYikpOworfQorCit2b2lk
IHRlc3RDb21wYXJlRmxvYXRUb0RvdWJsZVRocm91Z2hQaGkoZmxvYXQgYSwgZmxvYXQgYikKK3sK
KyAgICBQcm9jZWR1cmUgcHJvYzsKKyAgICBCYXNpY0Jsb2NrKiByb290ID0gcHJvYy5hZGRCbG9j
aygpOworICAgIEJhc2ljQmxvY2sqIHRoZW5DYXNlID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJh
c2ljQmxvY2sqIGVsc2VDYXNlID0gcHJvYy5hZGRCbG9jaygpOworICAgIEJhc2ljQmxvY2sqIHRh
aWwgPSBwcm9jLmFkZEJsb2NrKCk7CisKKyAgICBWYWx1ZSogY29uZGl0aW9uID0gcm9vdC0+YXBw
ZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVu
dEdQUjApOworCisgICAgVmFsdWUqIGFyZzFBczMyID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihw
cm9jLCBUcnVuYywgT3JpZ2luKCksCisgICAgICAgIHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVudFJl
Z1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKSk7CisgICAgVmFs
dWUqIGFyZzFGbG9hdCA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3Qs
IE9yaWdpbigpLCBhcmcxQXMzMik7CisgICAgVmFsdWUqIGFyZzFBc0RvdWJsZSA9IHJvb3QtPmFw
cGVuZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGFyZzFGbG9hdCk7
CisKKyAgICBWYWx1ZSogYXJnMkFzRG91YmxlID0gcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVn
VmFsdWU+KHByb2MsIE9yaWdpbigpLCBGUFJJbmZvOjphcmd1bWVudEZQUjApOworICAgIFZhbHVl
KiBhcmcyQXNGbG9hdCA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRG91YmxlVG9GbG9h
dCwgT3JpZ2luKCksIGFyZzJBc0RvdWJsZSk7CisgICAgVmFsdWUqIGFyZzJBc0ZSb3VuZGVkRG91
YmxlID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBGbG9hdFRvRG91YmxlLCBPcmlnaW4o
KSwgYXJnMkFzRmxvYXQpOworCisgICAgcm9vdC0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4oCisg
ICAgICAgIHByb2MsIEJyYW5jaCwgT3JpZ2luKCksCisgICAgICAgIGNvbmRpdGlvbiwKKyAgICAg
ICAgRnJlcXVlbnRlZEJsb2NrKHRoZW5DYXNlKSwgRnJlcXVlbnRlZEJsb2NrKGVsc2VDYXNlKSk7
CisKKyAgICBVcHNpbG9uVmFsdWUqIHRoZW5WYWx1ZSA9IHRoZW5DYXNlLT5hcHBlbmROZXc8VXBz
aWxvblZhbHVlPihwcm9jLCBPcmlnaW4oKSwgYXJnMUFzRG91YmxlKTsKKyAgICB0aGVuQ2FzZS0+
YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCksIEZyZXF1ZW50ZWRC
bG9jayh0YWlsKSk7CisKKyAgICBWYWx1ZSogZWxzZUNvbnN0ID0gZWxzZUNhc2UtPmFwcGVuZE5l
dzxDb25zdERvdWJsZVZhbHVlPihwcm9jLCBPcmlnaW4oKSwgMC4pOworICAgIFVwc2lsb25WYWx1
ZSogZWxzZVZhbHVlID0gZWxzZUNhc2UtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KHByb2MsIE9y
aWdpbigpLCBlbHNlQ29uc3QpOworICAgIGVsc2VDYXNlLT5hcHBlbmROZXc8Q29udHJvbFZhbHVl
Pihwcm9jLCBKdW1wLCBPcmlnaW4oKSwgRnJlcXVlbnRlZEJsb2NrKHRhaWwpKTsKKworICAgIFZh
bHVlKiBkb3VibGVJbnB1dCA9IHRhaWwtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgUGhpLCBEb3Vi
bGUsIE9yaWdpbigpKTsKKyAgICB0aGVuVmFsdWUtPnNldFBoaShkb3VibGVJbnB1dCk7CisgICAg
ZWxzZVZhbHVlLT5zZXRQaGkoZG91YmxlSW5wdXQpOworICAgIFZhbHVlKiBlcXVhbCA9IHRhaWwt
PmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRXF1YWwsIE9yaWdpbigpLCBkb3VibGVJbnB1dCwgYXJn
MkFzRlJvdW5kZWREb3VibGUpOworICAgIHRhaWwtPmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KHBy
b2MsIFJldHVybiwgT3JpZ2luKCksIGVxdWFsKTsKKworICAgIGF1dG8gY29kZSA9IGNvbXBpbGUo
cHJvYyk7CisgICAgaW50MzJfdCBpbnRlZ2VyQSA9IGJpdHdpc2VfY2FzdDxpbnQzMl90PihhKTsK
KyAgICBkb3VibGUgZG91YmxlQiA9IGI7CisgICAgQ0hFQ0soaW52b2tlPGludDY0X3Q+KCpjb2Rl
LCAxLCBpbnRlZ2VyQSwgZG91YmxlQikgPT0gKGEgPT0gYikpOworICAgIENIRUNLKGludm9rZTxp
bnQ2NF90PigqY29kZSwgMCwgaW50ZWdlckEsIGRvdWJsZUIpID09IChiID09IDApKTsKK30KKwor
dm9pZCB0ZXN0RG91YmxlVG9GbG9hdFRocm91Z2hQaGkoZmxvYXQgdmFsdWUpCit7CisgICAgLy8g
U2ltcGxlIGNhc2Ugb2Y6CisgICAgLy8gICAgIGlmIChhKSB7CisgICAgLy8gICAgICAgICB4ID0g
RG91YmxlQWRkKGEsIGIpCisgICAgLy8gICAgIGVsc2UKKyAgICAvLyAgICAgICAgIHggPSBEb3Vi
bGVBZGQoYSwgYykKKyAgICAvLyAgICAgRG91YmxlVG9GbG9hdCh4KQorICAgIC8vCisgICAgLy8g
Qm90aCBBZGRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gZmxvYXQgYWRkLgorICAgIFByb2NlZHVyZSBw
cm9jOworICAgIEJhc2ljQmxvY2sqIHJvb3QgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNC
bG9jayogdGhlbkNhc2UgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogZWxzZUNh
c2UgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGFpbCA9IHByb2MuYWRkQmxv
Y2soKTsKKworICAgIFZhbHVlKiBjb25kaXRpb24gPSByb290LT5hcHBlbmROZXc8QXJndW1lbnRS
ZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgVmFs
dWUqIGFyZ3VtZW50MzIgPSByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFRydW5jLCBPcmln
aW4oKSwKKyAgICAgICAgcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9y
aWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpKTsKKyAgICBWYWx1ZSogZmxvYXRWYWx1ZSA9
IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmd1
bWVudDMyKTsKKyAgICBWYWx1ZSogYXJnQXNEb3VibGUgPSByb290LT5hcHBlbmROZXc8VmFsdWU+
KHByb2MsIEZsb2F0VG9Eb3VibGUsIE9yaWdpbigpLCBmbG9hdFZhbHVlKTsKKworICAgIHJvb3Qt
PmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KAorICAgICAgICBwcm9jLCBCcmFuY2gsIE9yaWdpbigp
LAorICAgICAgICBjb25kaXRpb24sCisgICAgICAgIEZyZXF1ZW50ZWRCbG9jayh0aGVuQ2FzZSks
IEZyZXF1ZW50ZWRCbG9jayhlbHNlQ2FzZSkpOworCisgICAgVmFsdWUqIHBvc3RpdGl2ZUNvbnN0
ID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxDb25zdERvdWJsZVZhbHVlPihwcm9jLCBPcmlnaW4oKSwg
NDIuNWYpOworICAgIFZhbHVlKiB0aGVuQWRkID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxWYWx1ZT4o
cHJvYywgQWRkLCBPcmlnaW4oKSwgYXJnQXNEb3VibGUsIHBvc3RpdGl2ZUNvbnN0KTsKKyAgICBV
cHNpbG9uVmFsdWUqIHRoZW5WYWx1ZSA9IHRoZW5DYXNlLT5hcHBlbmROZXc8VXBzaWxvblZhbHVl
Pihwcm9jLCBPcmlnaW4oKSwgdGhlbkFkZCk7CisgICAgdGhlbkNhc2UtPmFwcGVuZE5ldzxDb250
cm9sVmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigpLCBGcmVxdWVudGVkQmxvY2sodGFpbCkpOwor
CisgICAgVmFsdWUqIGVsc2VDb25zdCA9IGVsc2VDYXNlLT5hcHBlbmROZXc8Q29uc3REb3VibGVW
YWx1ZT4ocHJvYywgT3JpZ2luKCksIE1fUEkpOworICAgIFVwc2lsb25WYWx1ZSogZWxzZVZhbHVl
ID0gZWxzZUNhc2UtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KHByb2MsIE9yaWdpbigpLCBlbHNl
Q29uc3QpOworICAgIGVsc2VDYXNlLT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBKdW1w
LCBPcmlnaW4oKSwgRnJlcXVlbnRlZEJsb2NrKHRhaWwpKTsKKworICAgIFZhbHVlKiBkb3VibGVJ
bnB1dCA9IHRhaWwtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgUGhpLCBEb3VibGUsIE9yaWdpbigp
KTsKKyAgICB0aGVuVmFsdWUtPnNldFBoaShkb3VibGVJbnB1dCk7CisgICAgZWxzZVZhbHVlLT5z
ZXRQaGkoZG91YmxlSW5wdXQpOworICAgIFZhbHVlKiBmbG9hdFJlc3VsdCA9IHRhaWwtPmFwcGVu
ZE5ldzxWYWx1ZT4ocHJvYywgRG91YmxlVG9GbG9hdCwgT3JpZ2luKCksIGRvdWJsZUlucHV0KTsK
KyAgICB0YWlsLT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBSZXR1cm4sIE9yaWdpbigp
LCBmbG9hdFJlc3VsdCk7CisKKyAgICBhdXRvIGNvZGUgPSBjb21waWxlKHByb2MpOworICAgIENI
RUNLKGlzSWRlbnRpY2FsKGludm9rZTxmbG9hdD4oKmNvZGUsIDEsIGJpdHdpc2VfY2FzdDxpbnQz
Ml90Pih2YWx1ZSkpLCB2YWx1ZSArIDQyLjVmKSk7CisgICAgQ0hFQ0soaXNJZGVudGljYWwoaW52
b2tlPGZsb2F0PigqY29kZSwgMCwgYml0d2lzZV9jYXN0PGludDMyX3Q+KHZhbHVlKSksIHN0YXRp
Y19jYXN0PGZsb2F0PihNX1BJKSkpOworfQorCit2b2lkIHRlc3REb3VibGVQcm9kdWNlclBoaVRv
RmxvYXRDb252ZXJzaW9uKGZsb2F0IHZhbHVlKQoreworICAgIFByb2NlZHVyZSBwcm9jOworICAg
IEJhc2ljQmxvY2sqIHJvb3QgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGhl
bkNhc2UgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogZWxzZUNhc2UgPSBwcm9j
LmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGFpbCA9IHByb2MuYWRkQmxvY2soKTsKKwor
ICAgIFZhbHVlKiBjb25kaXRpb24gPSByb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4o
cHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgVmFsdWUqIGFyZ3Vt
ZW50MzIgPSByb290LT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAg
ICAgICAgcm9vdC0+YXBwZW5kTmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBH
UFJJbmZvOjphcmd1bWVudEdQUjEpKTsKKyAgICBWYWx1ZSogZmxvYXRWYWx1ZSA9IHJvb3QtPmFw
cGVuZE5ldzxWYWx1ZT4ocHJvYywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmd1bWVudDMyKTsK
KworICAgIHJvb3QtPmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KAorICAgICAgICBwcm9jLCBCcmFu
Y2gsIE9yaWdpbigpLAorICAgICAgICBjb25kaXRpb24sCisgICAgICAgIEZyZXF1ZW50ZWRCbG9j
ayh0aGVuQ2FzZSksIEZyZXF1ZW50ZWRCbG9jayhlbHNlQ2FzZSkpOworCisgICAgVmFsdWUqIGFz
RG91YmxlID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwg
T3JpZ2luKCksIGZsb2F0VmFsdWUpOworICAgIFVwc2lsb25WYWx1ZSogdGhlblZhbHVlID0gdGhl
bkNhc2UtPmFwcGVuZE5ldzxVcHNpbG9uVmFsdWU+KHByb2MsIE9yaWdpbigpLCBhc0RvdWJsZSk7
CisgICAgdGhlbkNhc2UtPmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIEp1bXAsIE9yaWdp
bigpLCBGcmVxdWVudGVkQmxvY2sodGFpbCkpOworCisgICAgVmFsdWUqIGNvbnN0RG91YmxlID0g
ZWxzZUNhc2UtPmFwcGVuZE5ldzxDb25zdERvdWJsZVZhbHVlPihwcm9jLCBPcmlnaW4oKSwgNDIu
NSk7CisgICAgVXBzaWxvblZhbHVlKiBlbHNlVmFsdWUgPSBlbHNlQ2FzZS0+YXBwZW5kTmV3PFVw
c2lsb25WYWx1ZT4ocHJvYywgT3JpZ2luKCksIGNvbnN0RG91YmxlKTsKKyAgICBlbHNlQ2FzZS0+
YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCksIEZyZXF1ZW50ZWRC
bG9jayh0YWlsKSk7CisKKyAgICBWYWx1ZSogZG91YmxlSW5wdXQgPSB0YWlsLT5hcHBlbmROZXc8
VmFsdWU+KHByb2MsIFBoaSwgRG91YmxlLCBPcmlnaW4oKSk7CisgICAgdGhlblZhbHVlLT5zZXRQ
aGkoZG91YmxlSW5wdXQpOworICAgIGVsc2VWYWx1ZS0+c2V0UGhpKGRvdWJsZUlucHV0KTsKKwor
ICAgIFZhbHVlKiBhcmdBc0RvdWJsZUFnYWluID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9j
LCBGbG9hdFRvRG91YmxlLCBPcmlnaW4oKSwgZmxvYXRWYWx1ZSk7CisgICAgVmFsdWUqIGZpbmFs
QWRkID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBBZGQsIE9yaWdpbigpLCBkb3VibGVJ
bnB1dCwgYXJnQXNEb3VibGVBZ2Fpbik7CisgICAgVmFsdWUqIGZsb2F0UmVzdWx0ID0gdGFpbC0+
YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBEb3VibGVUb0Zsb2F0LCBPcmlnaW4oKSwgZmluYWxBZGQp
OworICAgIHRhaWwtPmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIFJldHVybiwgT3JpZ2lu
KCksIGZsb2F0UmVzdWx0KTsKKworICAgIGF1dG8gY29kZSA9IGNvbXBpbGUocHJvYyk7CisgICAg
Q0hFQ0soaXNJZGVudGljYWwoaW52b2tlPGZsb2F0PigqY29kZSwgMSwgYml0d2lzZV9jYXN0PGlu
dDMyX3Q+KHZhbHVlKSksIHZhbHVlICsgdmFsdWUpKTsKKyAgICBDSEVDSyhpc0lkZW50aWNhbChp
bnZva2U8ZmxvYXQ+KCpjb2RlLCAwLCBiaXR3aXNlX2Nhc3Q8aW50MzJfdD4odmFsdWUpKSwgNDIu
NWYgKyB2YWx1ZSkpOworfQorCit2b2lkIHRlc3REb3VibGVQcm9kdWNlclBoaVRvRmxvYXRDb252
ZXJzaW9uV2l0aERvdWJsZUNvbnN1bWVyKGZsb2F0IHZhbHVlKQoreworICAgIC8vIEluIHRoaXMg
Y2FzZSwgdGhlIFVwc2lsb24tUGhpIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGEgRmxvYXQgdmFsdWUs
IGJ1dCBpdCBpcyB1c2VkCisgICAgLy8gYXMgYSBGbG9hdCBhbmQgYXMgYSBEb3VibGUuCisgICAg
UHJvY2VkdXJlIHByb2M7CisgICAgQmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2soKTsK
KyAgICBCYXNpY0Jsb2NrKiB0aGVuQ2FzZSA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Js
b2NrKiBlbHNlQ2FzZSA9IHByb2MuYWRkQmxvY2soKTsKKyAgICBCYXNpY0Jsb2NrKiB0YWlsID0g
cHJvYy5hZGRCbG9jaygpOworCisgICAgVmFsdWUqIGNvbmRpdGlvbiA9IHJvb3QtPmFwcGVuZE5l
dzxBcmd1bWVudFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIw
KTsKKyAgICBWYWx1ZSogYXJndW1lbnQzMiA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywg
VHJ1bmMsIE9yaWdpbigpLAorICAgICAgICByb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1
ZT4ocHJvYywgT3JpZ2luKCksIEdQUkluZm86OmFyZ3VtZW50R1BSMSkpOworICAgIFZhbHVlKiBm
bG9hdFZhbHVlID0gcm9vdC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBCaXR3aXNlQ2FzdCwgT3Jp
Z2luKCksIGFyZ3VtZW50MzIpOworCisgICAgcm9vdC0+YXBwZW5kTmV3PENvbnRyb2xWYWx1ZT4o
CisgICAgICAgIHByb2MsIEJyYW5jaCwgT3JpZ2luKCksCisgICAgICAgIGNvbmRpdGlvbiwKKyAg
ICAgICAgRnJlcXVlbnRlZEJsb2NrKHRoZW5DYXNlKSwgRnJlcXVlbnRlZEJsb2NrKGVsc2VDYXNl
KSk7CisKKyAgICBWYWx1ZSogYXNEb3VibGUgPSB0aGVuQ2FzZS0+YXBwZW5kTmV3PFZhbHVlPihw
cm9jLCBGbG9hdFRvRG91YmxlLCBPcmlnaW4oKSwgZmxvYXRWYWx1ZSk7CisgICAgVXBzaWxvblZh
bHVlKiB0aGVuVmFsdWUgPSB0aGVuQ2FzZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4ocHJvYywg
T3JpZ2luKCksIGFzRG91YmxlKTsKKyAgICB0aGVuQ2FzZS0+YXBwZW5kTmV3PENvbnRyb2xWYWx1
ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCksIEZyZXF1ZW50ZWRCbG9jayh0YWlsKSk7CisKKyAgICBW
YWx1ZSogY29uc3REb3VibGUgPSBlbHNlQ2FzZS0+YXBwZW5kTmV3PENvbnN0RG91YmxlVmFsdWU+
KHByb2MsIE9yaWdpbigpLCA0Mi41KTsKKyAgICBVcHNpbG9uVmFsdWUqIGVsc2VWYWx1ZSA9IGVs
c2VDYXNlLT5hcHBlbmROZXc8VXBzaWxvblZhbHVlPihwcm9jLCBPcmlnaW4oKSwgY29uc3REb3Vi
bGUpOworICAgIGVsc2VDYXNlLT5hcHBlbmROZXc8Q29udHJvbFZhbHVlPihwcm9jLCBKdW1wLCBP
cmlnaW4oKSwgRnJlcXVlbnRlZEJsb2NrKHRhaWwpKTsKKworICAgIFZhbHVlKiBkb3VibGVJbnB1
dCA9IHRhaWwtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgUGhpLCBEb3VibGUsIE9yaWdpbigpKTsK
KyAgICB0aGVuVmFsdWUtPnNldFBoaShkb3VibGVJbnB1dCk7CisgICAgZWxzZVZhbHVlLT5zZXRQ
aGkoZG91YmxlSW5wdXQpOworCisgICAgVmFsdWUqIGFyZ0FzRG91YmxlQWdhaW4gPSB0YWlsLT5h
cHBlbmROZXc8VmFsdWU+KHByb2MsIEZsb2F0VG9Eb3VibGUsIE9yaWdpbigpLCBmbG9hdFZhbHVl
KTsKKyAgICBWYWx1ZSogZmxvYXRBZGQgPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEFk
ZCwgT3JpZ2luKCksIGRvdWJsZUlucHV0LCBhcmdBc0RvdWJsZUFnYWluKTsKKworICAgIC8vIEZS
b3VuZC4KKyAgICBWYWx1ZSogZmxvYXRSZXN1bHQgPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHBy
b2MsIERvdWJsZVRvRmxvYXQsIE9yaWdpbigpLCBmbG9hdEFkZCk7CisgICAgVmFsdWUqIGRvdWJs
ZVJlc3VsdCA9IHRhaWwtPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwgT3Jp
Z2luKCksIGZsb2F0UmVzdWx0KTsKKworICAgIC8vIFRoaXMgb25lICpjYW5ub3QqIGJlIGVsaW1p
bmF0ZWQKKyAgICBWYWx1ZSogZG91YmxlQWRkID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9j
LCBBZGQsIE9yaWdpbigpLCBkb3VibGVJbnB1dCwgZG91YmxlUmVzdWx0KTsKKworICAgIHRhaWwt
PmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIFJldHVybiwgT3JpZ2luKCksIGRvdWJsZUFk
ZCk7CisKKyAgICBhdXRvIGNvZGUgPSBjb21waWxlKHByb2MpOworICAgIENIRUNLKGlzSWRlbnRp
Y2FsKGludm9rZTxkb3VibGU+KCpjb2RlLCAxLCBiaXR3aXNlX2Nhc3Q8aW50MzJfdD4odmFsdWUp
KSwgKHZhbHVlICsgdmFsdWUpICsgc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkpKTsKKyAgICBD
SEVDSyhpc0lkZW50aWNhbChpbnZva2U8ZG91YmxlPigqY29kZSwgMCwgYml0d2lzZV9jYXN0PGlu
dDMyX3Q+KHZhbHVlKSksICg0Mi41ZiArIHZhbHVlKSArIDQyLjVmKSk7Cit9CisKK3ZvaWQgdGVz
dERvdWJsZVByb2R1Y2VyUGhpV2l0aE5vbkZsb2F0Q29uc3QoZmxvYXQgdmFsdWUsIGRvdWJsZSBj
b25zdFZhbHVlKQoreworICAgIFByb2NlZHVyZSBwcm9jOworICAgIEJhc2ljQmxvY2sqIHJvb3Qg
PSBwcm9jLmFkZEJsb2NrKCk7CisgICAgQmFzaWNCbG9jayogdGhlbkNhc2UgPSBwcm9jLmFkZEJs
b2NrKCk7CisgICAgQmFzaWNCbG9jayogZWxzZUNhc2UgPSBwcm9jLmFkZEJsb2NrKCk7CisgICAg
QmFzaWNCbG9jayogdGFpbCA9IHByb2MuYWRkQmxvY2soKTsKKworICAgIFZhbHVlKiBjb25kaXRp
b24gPSByb290LT5hcHBlbmROZXc8QXJndW1lbnRSZWdWYWx1ZT4ocHJvYywgT3JpZ2luKCksIEdQ
UkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgVmFsdWUqIGFyZ3VtZW50MzIgPSByb290LT5hcHBl
bmROZXc8VmFsdWU+KHByb2MsIFRydW5jLCBPcmlnaW4oKSwKKyAgICAgICAgcm9vdC0+YXBwZW5k
TmV3PEFyZ3VtZW50UmVnVmFsdWU+KHByb2MsIE9yaWdpbigpLCBHUFJJbmZvOjphcmd1bWVudEdQ
UjEpKTsKKyAgICBWYWx1ZSogZmxvYXRWYWx1ZSA9IHJvb3QtPmFwcGVuZE5ldzxWYWx1ZT4ocHJv
YywgQml0d2lzZUNhc3QsIE9yaWdpbigpLCBhcmd1bWVudDMyKTsKKworICAgIHJvb3QtPmFwcGVu
ZE5ldzxDb250cm9sVmFsdWU+KAorICAgICAgICBwcm9jLCBCcmFuY2gsIE9yaWdpbigpLAorICAg
ICAgICBjb25kaXRpb24sCisgICAgICAgIEZyZXF1ZW50ZWRCbG9jayh0aGVuQ2FzZSksIEZyZXF1
ZW50ZWRCbG9jayhlbHNlQ2FzZSkpOworCisgICAgVmFsdWUqIGFzRG91YmxlID0gdGhlbkNhc2Ut
PmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgRmxvYXRUb0RvdWJsZSwgT3JpZ2luKCksIGZsb2F0VmFs
dWUpOworICAgIFVwc2lsb25WYWx1ZSogdGhlblZhbHVlID0gdGhlbkNhc2UtPmFwcGVuZE5ldzxV
cHNpbG9uVmFsdWU+KHByb2MsIE9yaWdpbigpLCBhc0RvdWJsZSk7CisgICAgdGhlbkNhc2UtPmFw
cGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIEp1bXAsIE9yaWdpbigpLCBGcmVxdWVudGVkQmxv
Y2sodGFpbCkpOworCisgICAgVmFsdWUqIGNvbnN0RG91YmxlID0gZWxzZUNhc2UtPmFwcGVuZE5l
dzxDb25zdERvdWJsZVZhbHVlPihwcm9jLCBPcmlnaW4oKSwgY29uc3RWYWx1ZSk7CisgICAgVXBz
aWxvblZhbHVlKiBlbHNlVmFsdWUgPSBlbHNlQ2FzZS0+YXBwZW5kTmV3PFVwc2lsb25WYWx1ZT4o
cHJvYywgT3JpZ2luKCksIGNvbnN0RG91YmxlKTsKKyAgICBlbHNlQ2FzZS0+YXBwZW5kTmV3PENv
bnRyb2xWYWx1ZT4ocHJvYywgSnVtcCwgT3JpZ2luKCksIEZyZXF1ZW50ZWRCbG9jayh0YWlsKSk7
CisKKyAgICBWYWx1ZSogZG91YmxlSW5wdXQgPSB0YWlsLT5hcHBlbmROZXc8VmFsdWU+KHByb2Ms
IFBoaSwgRG91YmxlLCBPcmlnaW4oKSk7CisgICAgdGhlblZhbHVlLT5zZXRQaGkoZG91YmxlSW5w
dXQpOworICAgIGVsc2VWYWx1ZS0+c2V0UGhpKGRvdWJsZUlucHV0KTsKKworICAgIFZhbHVlKiBh
cmdBc0RvdWJsZUFnYWluID0gdGFpbC0+YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBGbG9hdFRvRG91
YmxlLCBPcmlnaW4oKSwgZmxvYXRWYWx1ZSk7CisgICAgVmFsdWUqIGZpbmFsQWRkID0gdGFpbC0+
YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBBZGQsIE9yaWdpbigpLCBkb3VibGVJbnB1dCwgYXJnQXNE
b3VibGVBZ2Fpbik7CisgICAgVmFsdWUqIGZsb2F0UmVzdWx0ID0gdGFpbC0+YXBwZW5kTmV3PFZh
bHVlPihwcm9jLCBEb3VibGVUb0Zsb2F0LCBPcmlnaW4oKSwgZmluYWxBZGQpOworICAgIHRhaWwt
PmFwcGVuZE5ldzxDb250cm9sVmFsdWU+KHByb2MsIFJldHVybiwgT3JpZ2luKCksIGZsb2F0UmVz
dWx0KTsKKworICAgIGF1dG8gY29kZSA9IGNvbXBpbGUocHJvYyk7CisgICAgQ0hFQ0soaXNJZGVu
dGljYWwoaW52b2tlPGZsb2F0PigqY29kZSwgMSwgYml0d2lzZV9jYXN0PGludDMyX3Q+KHZhbHVl
KSksIHZhbHVlICsgdmFsdWUpKTsKKyAgICBDSEVDSyhpc0lkZW50aWNhbChpbnZva2U8ZmxvYXQ+
KCpjb2RlLCAwLCBiaXR3aXNlX2Nhc3Q8aW50MzJfdD4odmFsdWUpKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGNvbnN0VmFsdWUgKyB2YWx1ZSkpKTsKK30KKwogdm9pZCB0ZXN0RG91YmxlQXJnVG9JbnQ2
NEJpdHdpc2VDYXN0KGRvdWJsZSB2YWx1ZSkKIHsKICAgICBQcm9jZWR1cmUgcHJvYzsKQEAgLTU3
OTQsNiArNjA1MywyNSBAQCB2b2lkIHRlc3RTdG9yZUZsb2F0KGRvdWJsZSBpbnB1dCkKICAgICB9
CiB9CiAKK3ZvaWQgdGVzdFN0b3JlRG91YmxlQ29uc3RhbnRBc0Zsb2F0KGRvdWJsZSBpbnB1dCkK
K3sKKyAgICAvLyBTaW1wbGUgc3RvcmUgZnJvbSBhbiBhZGRyZXNzIGluIGEgcmVnaXN0ZXIuCisg
ICAgUHJvY2VkdXJlIHByb2M7CisgICAgQmFzaWNCbG9jayogcm9vdCA9IHByb2MuYWRkQmxvY2so
KTsKKyAgICBWYWx1ZSogdmFsdWUgPSByb290LT5hcHBlbmROZXc8Q29uc3REb3VibGVWYWx1ZT4o
cHJvYywgT3JpZ2luKCksIGlucHV0KTsKKyAgICBWYWx1ZSogdmFsdWVBc0Zsb2F0ID0gcm9vdC0+
YXBwZW5kTmV3PFZhbHVlPihwcm9jLCBEb3VibGVUb0Zsb2F0LCBPcmlnaW4oKSwgdmFsdWUpOwor
CisgICAgVmFsdWUqIGRlc3RpbmF0aW9uQWRkcmVzcyA9IHJvb3QtPmFwcGVuZE5ldzxBcmd1bWVu
dFJlZ1ZhbHVlPihwcm9jLCBPcmlnaW4oKSwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKKworICAg
IHJvb3QtPmFwcGVuZE5ldzxNZW1vcnlWYWx1ZT4ocHJvYywgU3RvcmUsIE9yaWdpbigpLCB2YWx1
ZUFzRmxvYXQsIGRlc3RpbmF0aW9uQWRkcmVzcyk7CisKKyAgICByb290LT5hcHBlbmROZXc8Q29u
dHJvbFZhbHVlPihwcm9jLCBSZXR1cm4sIE9yaWdpbigpLCByb290LT5hcHBlbmROZXc8Q29uc3Qz
MlZhbHVlPihwcm9jLCBPcmlnaW4oKSwgMCkpOworCisgICAgZmxvYXQgb3V0cHV0ID0gMC47Cisg
ICAgQ0hFQ0soIWNvbXBpbGVBbmRSdW48aW50NjRfdD4ocHJvYywgaW5wdXQsICZvdXRwdXQpKTsK
KyAgICBDSEVDSyhpc0lkZW50aWNhbChzdGF0aWNfY2FzdDxmbG9hdD4oaW5wdXQpLCBvdXRwdXQp
KTsKK30KKwogdm9pZCB0ZXN0U3BpbGxHUCgpCiB7CiAgICAgUHJvY2VkdXJlIHByb2M7CkBAIC0x
MjE0Nyw2ICsxMjQyNSwxNCBAQCB2b2lkIHJ1bihjb25zdCBjaGFyKiBmaWx0ZXIpCiAgICAgUlVO
X1VOQVJZKHRlc3RTcXJ0QXJnV2l0aFVzZWxlc3NEb3VibGVDb252ZXJzaW9uLCBmbG9hdGluZ1Bv
aW50T3BlcmFuZHM8ZmxvYXQ+KCkpOwogICAgIFJVTl9VTkFSWSh0ZXN0U3FydEFyZ1dpdGhFZmZl
Y3RmdWxEb3VibGVDb252ZXJzaW9uLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZmxvYXQ+KCkpOwog
CisgICAgUlVOX0JJTkFSWSh0ZXN0Q29tcGFyZVR3b0Zsb2F0VG9Eb3VibGUsIGZsb2F0aW5nUG9p
bnRPcGVyYW5kczxmbG9hdD4oKSwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpKTsKKyAg
ICBSVU5fQklOQVJZKHRlc3RDb21wYXJlT25lRmxvYXRUb0RvdWJsZSwgZmxvYXRpbmdQb2ludE9w
ZXJhbmRzPGZsb2F0PigpLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsKKyAgICBS
VU5fQklOQVJZKHRlc3RDb21wYXJlRmxvYXRUb0RvdWJsZVRocm91Z2hQaGksIGZsb2F0aW5nUG9p
bnRPcGVyYW5kczxmbG9hdD4oKSwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpKTsKKyAg
ICBSVU5fVU5BUlkodGVzdERvdWJsZVRvRmxvYXRUaHJvdWdoUGhpLCBmbG9hdGluZ1BvaW50T3Bl
cmFuZHM8ZmxvYXQ+KCkpOworICAgIFJVTl9VTkFSWSh0ZXN0RG91YmxlUHJvZHVjZXJQaGlUb0Zs
b2F0Q29udmVyc2lvbiwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGZsb2F0PigpKTsKKyAgICBSVU5f
VU5BUlkodGVzdERvdWJsZVByb2R1Y2VyUGhpVG9GbG9hdENvbnZlcnNpb25XaXRoRG91YmxlQ29u
c3VtZXIsIGZsb2F0aW5nUG9pbnRPcGVyYW5kczxmbG9hdD4oKSk7CisgICAgUlVOX0JJTkFSWSh0
ZXN0RG91YmxlUHJvZHVjZXJQaGlXaXRoTm9uRmxvYXRDb25zdCwgZmxvYXRpbmdQb2ludE9wZXJh
bmRzPGZsb2F0PigpLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsKKwogICAgIFJV
Tl9VTkFSWSh0ZXN0RG91YmxlQXJnVG9JbnQ2NEJpdHdpc2VDYXN0LCBmbG9hdGluZ1BvaW50T3Bl
cmFuZHM8ZG91YmxlPigpKTsKICAgICBSVU5fVU5BUlkodGVzdERvdWJsZUltbVRvSW50NjRCaXR3
aXNlQ2FzdCwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGRvdWJsZT4oKSk7CiAgICAgUlVOX1VOQVJZ
KHRlc3RUd29CaXR3aXNlQ2FzdE9uRG91YmxlLCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91Ymxl
PigpKTsKQEAgLTEyMTcyLDYgKzEyNDU4LDcgQEAgdm9pZCBydW4oY29uc3QgY2hhciogZmlsdGVy
KQogICAgIFJVTl9VTkFSWSh0ZXN0Q29udmVydEZsb2F0VG9Eb3VibGVNZW0sIGZsb2F0aW5nUG9p
bnRPcGVyYW5kczxmbG9hdD4oKSk7CiAgICAgUlVOX1VOQVJZKHRlc3RDb252ZXJ0RG91YmxlVG9G
bG9hdFRvRG91YmxlVG9GbG9hdCwgZmxvYXRpbmdQb2ludE9wZXJhbmRzPGRvdWJsZT4oKSk7CiAg
ICAgUlVOX1VOQVJZKHRlc3RTdG9yZUZsb2F0LCBmbG9hdGluZ1BvaW50T3BlcmFuZHM8ZG91Ymxl
PigpKTsKKyAgICBSVU5fVU5BUlkodGVzdFN0b3JlRG91YmxlQ29uc3RhbnRBc0Zsb2F0LCBmbG9h
dGluZ1BvaW50T3BlcmFuZHM8ZG91YmxlPigpKTsKICAgICBSVU5fVU5BUlkodGVzdExvYWRGbG9h
dENvbnZlcnREb3VibGVDb252ZXJ0RmxvYXRTdG9yZUZsb2F0LCBmbG9hdGluZ1BvaW50T3BlcmFu
ZHM8ZmxvYXQ+KCkpOwogICAgIFJVTl9VTkFSWSh0ZXN0RnJvdW5kQXJnLCBmbG9hdGluZ1BvaW50
T3BlcmFuZHM8ZG91YmxlPigpKTsKICAgICBSVU5fVU5BUlkodGVzdEZyb3VuZE1lbSwgZmxvYXRp
bmdQb2ludE9wZXJhbmRzPGRvdWJsZT4oKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvdGVzdHMvc3RyZXNzL2RvdWJsZS1jb21wYXJlLXRvLWZsb2F0LmpzIGIvU291cmNlL0ph
dmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9kb3VibGUtY29tcGFyZS10by1mbG9hdC5qcwpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi40MjhkNDA1NGY1NjQ3NGZjNTEzOGI5Y2FlMTUwZGFjNmM3NDA5YmJlCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9kb3VibGUtY29t
cGFyZS10by1mbG9hdC5qcwpAQCAtMCwwICsxLDQ5IEBACitmdW5jdGlvbiBjYW5TaW1wbGlmeVRv
RmxvYXQoYSwgYikKK3sKKyAgICByZXR1cm4gTWF0aC5mcm91bmQoYSkgPT09IE1hdGguZnJvdW5k
KGIpOworfQorbm9JbmxpbmUoY2FuU2ltcGxpZnlUb0Zsb2F0KTsKKworZnVuY3Rpb24gY2FuU2lt
cGxpZnlUb0Zsb2F0V2l0aENvbnN0YW50KGEpCit7CisgICAgcmV0dXJuIE1hdGguZnJvdW5kKGEp
ID09PSAxLjA7Cit9Citub0lubGluZShjYW5TaW1wbGlmeVRvRmxvYXRXaXRoQ29uc3RhbnQpOwor
CitmdW5jdGlvbiBjYW5ub3RTaW1wbGlmeUEoYSwgYikKK3sKKyAgICByZXR1cm4gYSA9PT0gTWF0
aC5mcm91bmQoYik7Cit9Citub0lubGluZShjYW5ub3RTaW1wbGlmeUEpOworCitmdW5jdGlvbiBj
YW5ub3RTaW1wbGlmeUIoYSwgYikKK3sKKyAgICByZXR1cm4gTWF0aC5mcm91bmQoYSkgPT09IGI7
Cit9Citub0lubGluZShjYW5ub3RTaW1wbGlmeUIpOworCitmb3IgKGxldCBpID0gMTsgaSA8IDFl
NDsgKytpKSB7CisgICAgaWYgKGNhblNpbXBsaWZ5VG9GbG9hdChNYXRoLlBJLCBNYXRoLlBJKSAh
PT0gdHJ1ZSkKKyAgICAgICAgdGhyb3cgIkZhaWxlZCBjYW5TaW1wbGlmeVRvRmxvYXQoTWF0aC5Q
SSwgTWF0aC5QSSkiOworICAgIGlmIChjYW5TaW1wbGlmeVRvRmxvYXQoTWF0aC5MTjIsIE1hdGgu
UEkpICE9PSBmYWxzZSkKKyAgICAgICAgdGhyb3cgIkZhaWxlZCBjYW5TaW1wbGlmeVRvRmxvYXQo
TWF0aC5MTjIsIE1hdGguUEkpIjsKKworICAgIGlmIChjYW5TaW1wbGlmeVRvRmxvYXRXaXRoQ29u
c3RhbnQoTWF0aC5QSSkgIT09IGZhbHNlKQorICAgICAgICB0aHJvdyAiRmFpbGVkIGNhblNpbXBs
aWZ5VG9GbG9hdFdpdGhDb25zdGFudChNYXRoLlBJKSI7CisgICAgaWYgKGNhblNpbXBsaWZ5VG9G
bG9hdFdpdGhDb25zdGFudCgxKSAhPT0gdHJ1ZSkKKyAgICAgICAgdGhyb3cgIkZhaWxlZCBjYW5T
aW1wbGlmeVRvRmxvYXRXaXRoQ29uc3RhbnQoMSkiOworCisgICAgaWYgKGNhbm5vdFNpbXBsaWZ5
QShNYXRoLlBJLCBNYXRoLlBJKSAhPT0gZmFsc2UpCisgICAgICAgIHRocm93ICJGYWlsZWQgY2Fu
bm90U2ltcGxpZnlBKE1hdGguUEksIE1hdGguUEkpIjsKKyAgICBpZiAoY2Fubm90U2ltcGxpZnlB
KE1hdGguZnJvdW5kKE1hdGguUEkpLCBNYXRoLlBJKSAhPT0gdHJ1ZSkKKyAgICAgICAgdGhyb3cg
IkZhaWxlZCBjYW5ub3RTaW1wbGlmeUEoTWF0aC5yb3VuZChNYXRoLlBJKSwgTWF0aC5QSSkiOwor
ICAgIGlmIChjYW5ub3RTaW1wbGlmeUEoTWF0aC5MTjIsIE1hdGguUEkpICE9PSBmYWxzZSkKKyAg
ICAgICAgdGhyb3cgIkZhaWxlZCBjYW5ub3RTaW1wbGlmeUEoTWF0aC5MTjIsIE1hdGguUEkpIjsK
KworICAgIGlmIChjYW5ub3RTaW1wbGlmeUIoTWF0aC5QSSwgTWF0aC5QSSkgIT09IGZhbHNlKQor
ICAgICAgICB0aHJvdyAiRmFpbGVkIGNhbm5vdFNpbXBsaWZ5QShNYXRoLlBJLCBNYXRoLlBJKSI7
CisgICAgaWYgKGNhbm5vdFNpbXBsaWZ5QihNYXRoLlBJLCBNYXRoLmZyb3VuZChNYXRoLlBJKSkg
IT09IHRydWUpCisgICAgICAgIHRocm93ICJGYWlsZWQgY2Fubm90U2ltcGxpZnlBKE1hdGgucm91
bmQoTWF0aC5QSSksIE1hdGguUEkpIjsKKyAgICBpZiAoY2Fubm90U2ltcGxpZnlCKE1hdGguTE4y
LCBNYXRoLlBJKSAhPT0gZmFsc2UpCisgICAgICAgIHRocm93ICJGYWlsZWQgY2Fubm90U2ltcGxp
ZnlBKE1hdGguTE4yLCBNYXRoLlBJKSI7Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvdGVzdHMvc3RyZXNzL2RvdWJsZS10by1mbG9hdC5qcyBiL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS90ZXN0cy9zdHJlc3MvZG91YmxlLXRvLWZsb2F0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmFkY2MzNzdj
NmJmNGQ2YjlhZGM4NDMwNzBmNjI2MDcyZjU2YjQ5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2RvdWJsZS10by1mbG9hdC5qcwpAQCAtMCww
ICsxLDE1NyBAQAorZnVuY3Rpb24gdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpKGluZGV4LCBpbnB1
dCkKK3sKKyAgICAvLyBBbGwgdXNlcyBvZiAib3V0cHV0RG91YmxlIiBhcmUgY29udmVydGVkIHRv
IGZsb2F0LgorICAgIC8vIEluc2lkZSB0aGUgbG9vcCwgdGhlIFVwc2lsb24gaXMgcmVmZXJlbmNp
bmcgaXRzIG93biBQaGkuIFRoaXMgc2hvdWxkCisgICAgLy8gbm90IHByZXZlbnQgdGhlIGNvbnZl
cnNpb24uCisgICAgbGV0IG91dHB1dERvdWJsZSA9IGlucHV0OworICAgIHdoaWxlIChpbmRleCkg
eworICAgICAgICBpZiAoaW5kZXggJiAweDQpCisgICAgICAgICAgICBvdXRwdXREb3VibGUgPSBN
YXRoLmZyb3VuZChvdXRwdXREb3VibGUpICsgTWF0aC5QSTsKKyAgICAgICAgaW5kZXggPSBpbmRl
eCA+Pj4gMTsKKyAgICB9CisgICAgcmV0dXJuIE1hdGguZnJvdW5kKG91dHB1dERvdWJsZSk7Cit9
Citub0lubGluZSh1cHNpbG9uUmVmZXJlbmNpbmdJdHNQaGkpOworCitsZXQgZXhwZWN0ZWROb3RU
YWtlbiA9IE1hdGguZnJvdW5kKE1hdGguTE4yKTsKK2xldCBleHBlY3RlZFRha2VuID0gTWF0aC5m
cm91bmQoTWF0aC5mcm91bmQoTWF0aC5MTjIpICsgTWF0aC5QSSk7Citmb3IgKGxldCBpID0gMDsg
aSA8IDFlNjsgKytpKSB7CisgICAgbGV0IGJyYW5jaE5vdFRha2VuUmVzdWx0ID0gdXBzaWxvblJl
ZmVyZW5jaW5nSXRzUGhpKDMsIE1hdGguTE4yKTsKKyAgICBpZiAoYnJhbmNoTm90VGFrZW5SZXN1
bHQgIT09IGV4cGVjdGVkTm90VGFrZW4pCisgICAgICAgIHRocm93ICJGYWlsZWQgdXBzaWxvblJl
ZmVyZW5jaW5nSXRzUGhpKDMsIE1hdGguTE4yKSBhdCBpID0gIiArIGkgKyAiIHJlc3VsdCA9ICIg
KyBicmFuY2hOb3RUYWtlblJlc3VsdDsKKworICAgIGxldCBicmFuY2hUYWtlblJlc3VsdCA9IHVw
c2lsb25SZWZlcmVuY2luZ0l0c1BoaSg3LCBNYXRoLkxOMik7CisgICAgaWYgKGJyYW5jaFRha2Vu
UmVzdWx0ICE9PSBleHBlY3RlZFRha2VuKQorICAgICAgICB0aHJvdyAiRmFpbGVkIHVwc2lsb25S
ZWZlcmVuY2luZ0l0c1BoaSg3LCBNYXRoLkxOMikgYXQgaSA9ICIgKyBpICsgIiByZXN1bHQgPSAi
ICsgYnJhbmNoVGFrZW5SZXN1bHQ7Cit9CisKKy8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB0aGlzIHRp
bWUgaXQgaXMgYWx3YXlzIGJldHRlciB0byBjb252ZXJ0IHRoZSBvdXRzaWRlIFBoaS1VcHNpbG9u
LgorZnVuY3Rpb24gdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpQWxsRmxvYXQoaW5kZXgsIGlucHV0
KQoreworICAgIGxldCBvdXRwdXREb3VibGUgPSBNYXRoLmZyb3VuZChpbnB1dCk7CisgICAgd2hp
bGUgKGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCAmIDB4NCkKKyAgICAgICAgICAgIG91dHB1
dERvdWJsZSA9IE1hdGguZnJvdW5kKG91dHB1dERvdWJsZSkgKyBNYXRoLlBJOworICAgICAgICBp
bmRleCA9IGluZGV4ID4+PiAxOworICAgIH0KKyAgICByZXR1cm4gTWF0aC5mcm91bmQob3V0cHV0
RG91YmxlKTsKK30KK25vSW5saW5lKHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaUFsbEZsb2F0KTsK
KworZm9yIChsZXQgaSA9IDA7IGkgPCAxZTY7ICsraSkgeworICAgIGxldCBicmFuY2hOb3RUYWtl
blJlc3VsdCA9IHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaUFsbEZsb2F0KDMsIE1hdGguTE4yKTsK
KyAgICBpZiAoYnJhbmNoTm90VGFrZW5SZXN1bHQgIT09IGV4cGVjdGVkTm90VGFrZW4pCisgICAg
ICAgIHRocm93ICJGYWlsZWQgdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpQWxsRmxvYXQoMywgTWF0
aC5MTjIpIGF0IGkgPSAiICsgaSArICIgcmVzdWx0ID0gIiArIGJyYW5jaE5vdFRha2VuUmVzdWx0
OworCisgICAgbGV0IGJyYW5jaFRha2VuUmVzdWx0ID0gdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhp
QWxsRmxvYXQoNywgTWF0aC5MTjIpOworICAgIGlmIChicmFuY2hUYWtlblJlc3VsdCAhPT0gZXhw
ZWN0ZWRUYWtlbikKKyAgICAgICAgdGhyb3cgIkZhaWxlZCB1cHNpbG9uUmVmZXJlbmNpbmdJdHNQ
aGlBbGxGbG9hdCg3LCBNYXRoLkxOMikgYXQgaSA9ICIgKyBpICsgIiByZXN1bHQgPSAiICsgYnJh
bmNoVGFrZW5SZXN1bHQ7Cit9CisKKy8vIFRoaXMgdGltZSwgY29udmVydGluZyB0byBmbG9hdCB3
b3VsZCBiZSBhIG1pc3Rha2UgYmVjYXVzZSBvbmUgb2YgdGhlIFBoaQorLy8gaXMgbm90IGNvbnZl
cnRlZC4KK2Z1bmN0aW9uIHVwc2lsb25SZWZlcmVuY2luZ0l0c1BoaVdpdGhvdXRDb252ZXJzaW9u
KGluZGV4LCBpbnB1dCkKK3sKKyAgICBsZXQgb3V0cHV0RG91YmxlID0gaW5wdXQ7CisgICAgd2hp
bGUgKGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCAmIDB4NCkKKyAgICAgICAgICAgIG91dHB1
dERvdWJsZSA9IE1hdGguZnJvdW5kKG91dHB1dERvdWJsZSkgKyBNYXRoLlBJOworICAgICAgICBp
bmRleCA9IGluZGV4ID4+PiAxOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RG91YmxlOworfQor
bm9JbmxpbmUodXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpV2l0aG91dENvbnZlcnNpb24pOworCits
ZXQgZXhwZWN0ZWROb3RUYWtlbldpdGhvdXRDb252ZXJzaW9uID0gTWF0aC5MTjI7CitsZXQgZXhw
ZWN0ZWRUYWtlbldpdGhvdXRDb252ZXJzaW9uID0gTWF0aC5mcm91bmQoTWF0aC5MTjIpICsgTWF0
aC5QSTsKK2ZvciAobGV0IGkgPSAwOyBpIDwgMWU2OyArK2kpIHsKKyAgICBsZXQgYnJhbmNoTm90
VGFrZW5SZXN1bHQgPSB1cHNpbG9uUmVmZXJlbmNpbmdJdHNQaGlXaXRob3V0Q29udmVyc2lvbigz
LCBNYXRoLkxOMik7CisgICAgaWYgKGJyYW5jaE5vdFRha2VuUmVzdWx0ICE9PSBleHBlY3RlZE5v
dFRha2VuV2l0aG91dENvbnZlcnNpb24pCisgICAgICAgIHRocm93ICJGYWlsZWQgdXBzaWxvblJl
ZmVyZW5jaW5nSXRzUGhpV2l0aG91dENvbnZlcnNpb24oMywgTWF0aC5MTjIpIGF0IGkgPSAiICsg
aSArICIgcmVzdWx0ID0gIiArIGJyYW5jaE5vdFRha2VuUmVzdWx0OworCisgICAgbGV0IGJyYW5j
aFRha2VuUmVzdWx0ID0gdXBzaWxvblJlZmVyZW5jaW5nSXRzUGhpV2l0aG91dENvbnZlcnNpb24o
NywgTWF0aC5MTjIpOworICAgIGlmIChicmFuY2hUYWtlblJlc3VsdCAhPT0gZXhwZWN0ZWRUYWtl
bldpdGhvdXRDb252ZXJzaW9uKQorICAgICAgICB0aHJvdyAiRmFpbGVkIHVwc2lsb25SZWZlcmVu
Y2luZ0l0c1BoaVdpdGhvdXRDb252ZXJzaW9uKDcsIE1hdGguTE4yKSBhdCBpID0gIiArIGkgKyAi
IHJlc3VsdCA9ICIgKyBicmFuY2hUYWtlblJlc3VsdDsKK30KKworZnVuY3Rpb24gY29udmVyc2lv
blByb3BhZ2FnZXMoZmxhZ3MsIGEsIGIpCit7CisgICAgbGV0IHJlc3VsdCA9IDAuNTsKKyAgICBp
ZiAoZmxhZ3MgJiAweDEpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgMHgyKSB7CisgICAgICAgICAg
ICBpZiAoZmxhZ3MgJiAweDQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDgpIHsK
KyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWF0aC5mcm91bmQoYSkgKyBNYXRoLmZyb3Vu
ZChiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1
bHQgPSA2LjU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICByZXN1bHQgPSA0LjU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICByZXN1bHQgPSAyLjU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAg
ICAgICByZXN1bHQgPSAxLjU7CisgICAgfQorICAgIHJldHVybiBNYXRoLmZyb3VuZChyZXN1bHQp
OworfQorbm9JbmxpbmUoY29udmVyc2lvblByb3BhZ2FnZXMpOworCitsZXQgY29udmVyc2lvblBy
b3BhZ2FnZUV4cGVjdGVkUmVzdWx0ID0gTWF0aC5mcm91bmQoTWF0aC5mcm91bmQoTWF0aC5MTjIp
ICsgTWF0aC5mcm91bmQoTWF0aC5QSSkpOworZm9yIChsZXQgaSA9IDA7IGkgPCAxZTY7ICsraSkg
eworICAgIGxldCByZXN1bHQgPSBjb252ZXJzaW9uUHJvcGFnYWdlcygweGYsIE1hdGguTE4yLCBN
YXRoLlBJKTsKKyAgICBpZiAocmVzdWx0ICE9PSBjb252ZXJzaW9uUHJvcGFnYWdlRXhwZWN0ZWRS
ZXN1bHQpCisgICAgICAgIHRocm93ICJGYWlsZWQgY29udmVyc2lvblByb3BhZ2FnZXMoMHhmLCBN
YXRoLkxOMiwgTWF0aC5QSSkiOworfQorCisKK2Z1bmN0aW9uIGNoYWluZWRVcHNpbG9uQm90aENv
bnZlcnQoY29uZGl0aW9uMSwgY29uZGl0aW9uMiwgYSwgYikKK3sKKyAgICBsZXQgZmlyc3RQaGk7
CisgICAgaWYgKGNvbmRpdGlvbjEpCisgICAgICAgIGZpcnN0UGhpID0gTWF0aC5mcm91bmQoYSk7
CisgICAgZWxzZQorICAgICAgICBmaXJzdFBoaSA9IE1hdGguZnJvdW5kKGIpOworCisgICAgbGV0
IHNlY29uZFBoaTsKKyAgICBpZiAoY29uZGl0aW9uMikKKyAgICAgICAgc2Vjb25kUGhpID0gZmly
c3RQaGkgKyAyOworICAgIGVsc2UKKyAgICAgICAgc2Vjb25kUGhpID0gZmlyc3RQaGkgKyAxOwor
ICAgIHJldHVybiBNYXRoLmZyb3VuZChzZWNvbmRQaGkpOworfQorbm9JbmxpbmUoY2hhaW5lZFVw
c2lsb25Cb3RoQ29udmVydCk7CisKK2xldCBleHBlY3RlZENoYWluZWRVcHNpbG9uQm90aENvbnZl
cnQgPSBNYXRoLmZyb3VuZChNYXRoLmZyb3VuZChNYXRoLlBJKSArIE1hdGguZnJvdW5kKDEpKTsK
K2ZvciAobGV0IGkgPSAwOyBpIDwgMWU2OyArK2kpIHsKKyAgICBpZiAoY2hhaW5lZFVwc2lsb25C
b3RoQ29udmVydCgxLCAwLCBNYXRoLlBJLCBNYXRoLkxOMikgIT09IGV4cGVjdGVkQ2hhaW5lZFVw
c2lsb25Cb3RoQ29udmVydCkKKyAgICAgICAgdGhyb3cgIkZhaWxlZCBjaGFpbmVkVXBzaWxvbkJv
dGhDb252ZXJ0KDEsIDAsIE1hdGguUEksIE1hdGguTE4yKSI7Cit9CisKK2Z1bmN0aW9uIGNoYWlu
ZWRVcHNpbG9uRmlyc3RDb252ZXJ0KGNvbmRpdGlvbjEsIGNvbmRpdGlvbjIsIGEsIGIpCit7Cisg
ICAgLy8gVGhpcyBmaXJzdCBwaGkgaXMgdHJpdmlhbGx5IHNpbXBsaWZpZWQgYnkgdGhlIGZyb3Vu
ZCgpCisgICAgLy8gb2YgdGhlIHNlY29uZCBpZi1lbHNlLgorICAgIGxldCBmaXJzdFBoaTsKKyAg
ICBpZiAoY29uZGl0aW9uMSkKKyAgICAgICAgZmlyc3RQaGkgPSBNYXRoLmZyb3VuZChhKTsKKyAg
ICBlbHNlCisgICAgICAgIGZpcnN0UGhpID0gTWF0aC5mcm91bmQoYik7CisKKyAgICAvLyBUaGlz
IHNlY29uZCBvbmUgY2Fubm90IGV2ZXIgYmUgY29udmVydGVkIGJlY2F1c2UgdGhlCisgICAgLy8g
cmVzdWx0IGlzIG5vdCByb3VuZGVkIHRvIGZsb2F0LgorICAgIGxldCBzZWNvbmRQaGk7CisgICAg
aWYgKGNvbmRpdGlvbjIpCisgICAgICAgIHNlY29uZFBoaSA9IE1hdGguZnJvdW5kKGZpcnN0UGhp
KSArIE1hdGguZnJvdW5kKDEvMyk7CisgICAgZWxzZQorICAgICAgICBzZWNvbmRQaGkgPSBNYXRo
LmZyb3VuZChmaXJzdFBoaSkgLSBNYXRoLmZyb3VuZCgxLzMpOworICAgIHJldHVybiBzZWNvbmRQ
aGk7Cit9Citub0lubGluZShjaGFpbmVkVXBzaWxvbkZpcnN0Q29udmVydCk7CisKK2xldCBleHBl
Y3RlZENoYWluZWRVcHNpbG9uRmlyc3RDb252ZXJ0ID0gTWF0aC5mcm91bmQoTWF0aC5QSSkgLSBN
YXRoLmZyb3VuZCgxLzMpOworZm9yIChsZXQgaSA9IDA7IGkgPCAxZTY7ICsraSkgeworICAgIGlm
IChjaGFpbmVkVXBzaWxvbkZpcnN0Q29udmVydCgxLCAwLCBNYXRoLlBJLCBNYXRoLkxOMikgIT09
IGV4cGVjdGVkQ2hhaW5lZFVwc2lsb25GaXJzdENvbnZlcnQpCisgICAgICAgIHRocm93ICJGYWls
ZWQgY2hhaW5lZFVwc2lsb25GaXJzdENvbnZlcnQoMSwgMCwgTWF0aC5QSSwgTWF0aC5MTjIpIjsK
K30K
</data>
<flag name="review"
          id="300741"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>