<?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>145768</bug_id>
          
          <creation_ts>2015-06-08 14:04:19 -0700</creation_ts>
          <short_desc>FTL should eliminate array bounds checks in loops</short_desc>
          <delta_ts>2015-06-20 01:13:54 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>145769</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>achristensen</cc>
    
    <cc>barraclough</cc>
    
    <cc>basile_clement</cc>
    
    <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenb</cc>
    
    <cc>mmirman</cc>
    
    <cc>msaboff</cc>
    
    <cc>nrotem</cc>
    
    <cc>oliver</cc>
    
    <cc>rniwa</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1100445</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-08 14:04:19 -0700</bug_when>
    <thetext>This will be fun.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100541</commentid>
    <comment_count>1</comment_count>
      <attachid>254531</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-08 18:02:56 -0700</bug_when>
    <thetext>Created attachment 254531
work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100563</commentid>
    <comment_count>2</comment_count>
      <attachid>254540</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-08 20:18:21 -0700</bug_when>
    <thetext>Created attachment 254540
a bit more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100585</commentid>
    <comment_count>3</comment_count>
      <attachid>254551</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-08 23:41:43 -0700</bug_when>
    <thetext>Created attachment 254551
it is written</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100767</commentid>
    <comment_count>4</comment_count>
      <attachid>254595</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-09 13:07:38 -0700</bug_when>
    <thetext>Created attachment 254595
starting to do things</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100772</commentid>
    <comment_count>5</comment_count>
      <attachid>254596</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-09 13:30:58 -0700</bug_when>
    <thetext>Created attachment 254596
it&apos;s removing bounds checks

Still a lot more testing to do though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100773</commentid>
    <comment_count>6</comment_count>
      <attachid>254597</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-09 13:33:48 -0700</bug_when>
    <thetext>Created attachment 254597
for real this time

The last upload was a stale file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100821</commentid>
    <comment_count>7</comment_count>
      <attachid>254608</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-09 15:26:14 -0700</bug_when>
    <thetext>Created attachment 254608
adding the != relationship

This will help with loops bounded by !=length or !=0, rather than the inequality.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1100886</commentid>
    <comment_count>8</comment_count>
      <attachid>254618</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-09 18:00:32 -0700</bug_when>
    <thetext>Created attachment 254618
looks pretty good

This now eliminates the array bounds check and the induction variable&apos;s increment/decrement overflow check in each of these loop styles:

function foo(array) {
    var result = 0;
    for (var i = 0; i &lt; array.length; ++i)
        result += array[i];
    return result;
}

function foo(array) {
    var result = 0;
    for (var i = array.length - 1; i &gt;= 0; i--)
        result += array[i];
    return result;
}

function foo(array) {
    var result = 0;
    for (var i = array.length; i--;)
        result += array[i];
    return result;
}

function foo(array) {
    var result = 0;
    for (var i = 0; i != array.length; ++i)
        result += array[i];
    return result;
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101096</commentid>
    <comment_count>9</comment_count>
      <attachid>254673</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-10 13:26:52 -0700</bug_when>
    <thetext>Created attachment 254673
it&apos;s starting to pass tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101134</commentid>
    <comment_count>10</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-10 15:31:51 -0700</bug_when>
    <thetext>This is so much win.


Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on dethklok (MacBookPro9,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/secondary/OpenSource/WebKitBuild/Release/jsc (r185429)
&quot;ABC&quot; at /Volumes/Data/pizlo/tertiary/OpenSource/WebKitBuild/Release/jsc (r185429)

Collected 6 samples per benchmark/VM, with 6 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level
timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.

                                                        TipOfTree                    ABC                                        
SunSpider:
   3d-cube                                            5.2522+-0.0637     ?      5.3453+-0.0754        ? might be 1.0177x slower
   3d-morph                                           6.0955+-0.6972     ?      6.6495+-0.6699        ? might be 1.0909x slower
   3d-raytrace                                        6.9005+-0.5144            6.4329+-0.0821          might be 1.0727x faster
   access-binary-trees                                2.4729+-0.2068     ?      2.5024+-0.2880        ? might be 1.0119x slower
   access-fannkuch                                    6.2685+-0.1210     ?      6.2915+-0.1741        ?
   access-nbody                                       3.0662+-0.2447     ?      3.2768+-0.5420        ? might be 1.0687x slower
   access-nsieve                                      3.4585+-0.3304            3.4557+-0.0792        
   bitops-3bit-bits-in-byte                           1.7137+-0.2047            1.6460+-0.0639          might be 1.0411x faster
   bitops-bits-in-byte                                3.9757+-0.2052            3.8198+-0.3107          might be 1.0408x faster
   bitops-bitwise-and                                 2.1706+-0.1078            2.1613+-0.0365        
   bitops-nsieve-bits                                 3.3831+-0.1320     ^      3.2180+-0.0130        ^ definitely 1.0513x faster
   controlflow-recursive                              2.9090+-0.1822            2.8485+-0.1766          might be 1.0212x faster
   crypto-aes                                         4.9152+-0.4821     ?      4.9432+-0.3993        ?
   crypto-md5                                         2.7442+-0.0922     ?      2.8453+-0.2650        ? might be 1.0368x slower
   crypto-sha1                                        3.7282+-0.2250            3.6643+-0.2416          might be 1.0174x faster
   date-format-tofte                                  9.2598+-0.0769     ?      9.5358+-0.3491        ? might be 1.0298x slower
   date-format-xparb                                  6.5205+-0.7261            6.1547+-0.2730          might be 1.0594x faster
   math-cordic                                        3.2450+-0.2680     ?      3.2911+-0.4410        ? might be 1.0142x slower
   math-partial-sums                                  5.6660+-0.3710     ?      5.7195+-0.7247        ?
   math-spectral-norm                                 2.0806+-0.0578     ?      2.2413+-0.3977        ? might be 1.0772x slower
   regexp-dna                                         7.5214+-0.1283     ?      7.5908+-0.1729        ?
   string-base64                                      5.2126+-0.4598     ?      5.7705+-0.8675        ? might be 1.1070x slower
   string-fasta                                       7.1652+-0.1449            7.1287+-0.1970        
   string-tagcloud                                   10.2728+-0.9067     ?     10.4488+-1.1835        ? might be 1.0171x slower
   string-unpack-code                                20.8645+-0.7341     ?     20.9869+-1.2084        ?
   string-validate-input                              6.1214+-0.3828            5.9665+-0.0707          might be 1.0260x faster

   &lt;arithmetic&gt;                                       5.4994+-0.0748     ?      5.5360+-0.0873        ? might be 1.0067x slower

                                                        TipOfTree                    ABC                                        
LongSpider:
   3d-cube                                          893.4778+-4.2977     !   1125.5387+-14.9048       ! definitely 1.2597x slower
   3d-morph                                        1529.4853+-4.4786     ?   1531.2384+-6.3730        ?
   3d-raytrace                                      694.9364+-3.3910     ?    714.1325+-48.1731       ? might be 1.0276x slower
   access-binary-trees                             1009.9510+-5.4842         1007.2894+-7.8937        
   access-fannkuch                                  351.6922+-8.5923          339.1489+-9.6560          might be 1.0370x faster
   access-nbody                                     589.1946+-1.2794     ?    589.8350+-2.2589        ?
   access-nsieve                                    485.8809+-18.3256         477.5903+-7.8611          might be 1.0174x faster
   bitops-3bit-bits-in-byte                          44.9884+-1.1205           44.5340+-0.8889          might be 1.0102x faster
   bitops-bits-in-byte                               99.9028+-2.5101     ?    100.3802+-0.9174        ?
   bitops-nsieve-bits                               421.4715+-4.9817          418.6126+-1.1040        
   controlflow-recursive                            484.8502+-11.1032         481.7343+-10.6275       
   crypto-aes                                       703.5952+-7.4370     ^    673.3990+-2.1696        ^ definitely 1.0448x faster
   crypto-md5                                       520.8144+-1.8768     ?    534.5755+-14.1932       ? might be 1.0264x slower
   crypto-sha1                                      720.4084+-73.5653         663.6917+-23.9593         might be 1.0855x faster
   date-format-tofte                                724.8421+-31.0369         714.3639+-8.3922          might be 1.0147x faster
   date-format-xparb                                811.7282+-64.4451         783.9195+-26.4259         might be 1.0355x faster
   hash-map                                         185.9707+-2.5719     ?    187.3777+-2.7201        ?
   math-cordic                                      578.5213+-4.7902          576.9253+-3.0887        
   math-partial-sums                                513.4990+-16.9964         508.5806+-2.1580        
   math-spectral-norm                               565.7807+-2.4077     !    570.3999+-1.8634        ! definitely 1.0082x slower
   string-base64                                    414.2543+-7.5637          413.0341+-4.2902        
   string-fasta                                     430.0909+-4.1215          427.3119+-2.9265        
   string-tagcloud                                  195.5827+-5.6611     ?    197.2655+-3.8996        ?

   &lt;geometric&gt;                                      456.7465+-3.4301     ?    457.6106+-2.1812        ? might be 1.0019x slower

                                                        TipOfTree                    ABC                                        
V8Spider:
   crypto                                            55.7027+-2.7066     ?     58.1624+-1.9861        ? might be 1.0442x slower
   deltablue                                         96.6455+-4.0267     ?     98.4035+-4.9706        ? might be 1.0182x slower
   earley-boyer                                      51.2510+-0.7040           50.6565+-0.8714          might be 1.0117x faster
   raytrace                                          42.1466+-2.3508     ?     43.4004+-1.7906        ? might be 1.0297x slower
   regexp                                            92.2725+-27.6754          84.2625+-2.2560          might be 1.0951x faster
   richards                                          87.2644+-7.1476           86.5339+-2.9325        
   splay                                             41.0767+-1.5322           39.9309+-1.7434          might be 1.0287x faster

   &lt;geometric&gt;                                       62.5474+-3.0063           62.3269+-1.1192          might be 1.0035x faster

                                                        TipOfTree                    ABC                                        
Octane:
   encrypt                                           0.20285+-0.00081    ^     0.19739+-0.00108       ^ definitely 1.0277x faster
   decrypt                                           3.65538+-0.05928    ^     3.35824+-0.01085       ^ definitely 1.0885x faster
   deltablue                                x2       0.19371+-0.00191          0.18965+-0.00292         might be 1.0214x faster
   earley                                            0.39091+-0.00444    ?     0.40227+-0.00822       ? might be 1.0291x slower
   boyer                                             6.99226+-0.38100          6.96921+-0.28905       
   navier-stokes                            x2       5.17783+-0.01189    ^     5.13246+-0.01985       ^ definitely 1.0088x faster
   raytrace                                 x2       1.32033+-0.04674    ?     1.32538+-0.05274       ?
   richards                                 x2       0.13549+-0.00482    ?     0.14440+-0.01819       ? might be 1.0658x slower
   splay                                    x2       0.41237+-0.03194          0.40210+-0.00661         might be 1.0255x faster
   regexp                                   x2      31.62929+-0.65396    ?    32.79144+-1.94677       ? might be 1.0367x slower
   pdfjs                                    x2      42.46285+-0.27487    ?    42.54016+-0.35845       ?
   mandreel                                 x2      51.31800+-0.32065    ^    50.25441+-0.62393       ^ definitely 1.0212x faster
   gbemu                                    x2      45.76554+-3.93118         45.48865+-2.52585       
   closure                                           0.56266+-0.00343    ?     0.56567+-0.00328       ?
   jquery                                            7.35740+-0.05259    ?     7.61338+-0.57767       ? might be 1.0348x slower
   box2d                                    x2      13.15896+-0.84837         12.79954+-0.09940         might be 1.0281x faster
   zlib                                     x2     385.96742+-17.01030   ?   397.56117+-5.22140       ? might be 1.0300x slower
   typescript                               x2     778.54810+-4.58329        775.21724+-7.37991       

   &lt;geometric&gt;                                       6.73337+-0.07607          6.73142+-0.07542         might be 1.0003x faster

                                                        TipOfTree                    ABC                                        
Kraken:
   ai-astar                                          239.083+-11.765     ^     219.571+-1.176         ^ definitely 1.0889x faster
   audio-beat-detection                               82.150+-1.289      ?      83.038+-3.477         ? might be 1.0108x slower
   audio-dft                                         120.988+-3.263            119.290+-1.815           might be 1.0142x faster
   audio-fft                                          71.154+-2.527      ?      71.335+-2.109         ?
   audio-oscillator                                   90.611+-1.422             89.253+-0.484           might be 1.0152x faster
   imaging-darkroom                                  104.986+-1.860      ?     105.198+-2.032         ?
   imaging-desaturate                                 65.188+-2.756             61.472+-1.336           might be 1.0604x faster
   imaging-gaussian-blur                             112.915+-7.053            107.833+-2.311           might be 1.0471x faster
   json-parse-financial                               48.038+-1.565             46.412+-1.652           might be 1.0350x faster
   json-stringify-tinderbox                           29.408+-1.629      ?      30.660+-3.014         ? might be 1.0426x slower
   stanford-crypto-aes                                58.172+-1.052      ?      58.742+-0.423         ?
   stanford-crypto-ccm                                49.042+-1.354             47.664+-0.995           might be 1.0289x faster
   stanford-crypto-pbkdf2                            111.586+-3.286            109.668+-1.530           might be 1.0175x faster
   stanford-crypto-sha256-iterative                   43.277+-1.208      ?      44.232+-2.329         ? might be 1.0221x slower

   &lt;arithmetic&gt;                                       87.614+-1.126      ^      85.312+-0.594         ^ definitely 1.0270x faster

                                                        TipOfTree                    ABC                                        
JSRegress:
   abc-forward-loop-equal                            75.3774+-3.5549     ^     47.8453+-1.5054        ^ definitely 1.5754x faster
   abc-postfix-backward-loop                         74.1728+-2.1592     ^     47.3682+-1.3506        ^ definitely 1.5659x faster
   abc-simple-backward-loop                          72.4122+-1.5056     ^     47.1067+-1.3252        ^ definitely 1.5372x faster
   abc-simple-forward-loop                           73.6608+-2.7843     ^     47.4704+-1.5804        ^ definitely 1.5517x faster
   abs-boolean                                        2.8088+-0.3358            2.7163+-0.0870          might be 1.0341x faster
   adapt-to-double-divide                            16.8056+-0.5408           16.6285+-0.1994          might be 1.0106x faster
   aliased-arguments-getbyval                         1.4012+-0.2125            1.3156+-0.0592          might be 1.0650x faster
   allocate-big-object                                2.9568+-0.1464     ?      2.9953+-0.1636        ? might be 1.0130x slower
   arguments-named-and-reflective                    12.4707+-0.2785     ?     13.2434+-0.9065        ? might be 1.0620x slower
   arguments-out-of-bounds                           14.7793+-0.7089           14.7371+-0.6646        
   arguments-strict-mode                             10.9108+-1.0062     ?     11.3059+-0.9263        ? might be 1.0362x slower
   arguments                                         10.1280+-1.0863     ?     10.6556+-0.8521        ? might be 1.0521x slower
   arity-mismatch-inlining                            0.8606+-0.0197     ?      0.9046+-0.0631        ? might be 1.0512x slower
   array-access-polymorphic-structure                 7.3223+-0.9251     ?      7.3725+-0.9116        ?
   array-nonarray-polymorhpic-access                 33.0256+-0.8787           32.6584+-0.8839          might be 1.0112x faster
   array-prototype-every                             85.8985+-2.9017     ?     88.7367+-3.5504        ? might be 1.0330x slower
   array-prototype-forEach                           83.2795+-3.3836     ?     84.7211+-2.6273        ? might be 1.0173x slower
   array-prototype-map                               94.6956+-5.6371           92.2486+-2.3710          might be 1.0265x faster
   array-prototype-reduce                            81.0990+-2.0881     ?     82.4751+-1.5355        ? might be 1.0170x slower
   array-prototype-reduceRight                       81.7428+-2.5749     ?     82.4523+-3.3261        ?
   array-prototype-some                              85.4868+-4.3089     ?     88.6150+-2.9410        ? might be 1.0366x slower
   array-splice-contiguous                           41.3377+-1.5385     ?     42.7027+-1.7323        ? might be 1.0330x slower
   array-with-double-add                              4.5020+-0.3640            4.4332+-0.4273          might be 1.0155x faster
   array-with-double-increment                        3.4929+-0.2670            3.2608+-0.0276          might be 1.0712x faster
   array-with-double-mul-add                          5.2268+-0.1595     ?      5.2456+-0.0956        ?
   array-with-double-sum                              3.7229+-0.6865            3.3477+-0.0585          might be 1.1121x faster
   array-with-int32-add-sub                           6.9163+-0.0870            6.8372+-0.0874          might be 1.0116x faster
   array-with-int32-or-double-sum                     3.4281+-0.0667            3.3877+-0.0605          might be 1.0119x faster
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     37.1376+-1.4109     ?     38.5622+-2.8303        ? might be 1.0384x slower
   ArrayBuffer-DataView-alloc-long-lived             15.1954+-1.5141     ?     15.6905+-1.9657        ? might be 1.0326x slower
   ArrayBuffer-Int32Array-byteOffset                  3.8742+-0.3285     ?      4.1673+-0.4446        ? might be 1.0757x slower
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     38.4498+-1.1179     ?     40.0710+-2.4725        ? might be 1.0422x slower
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     24.0767+-2.0528           23.2297+-2.3103          might be 1.0365x faster
   ArrayBuffer-Int8Array-alloc-long-lived            13.7183+-0.3784     ?     14.1246+-1.4691        ? might be 1.0296x slower
   ArrayBuffer-Int8Array-alloc                       10.7337+-0.2665     ?     11.5194+-1.8108        ? might be 1.0732x slower
   asmjs_bool_bug                                     7.8251+-0.2019            7.7767+-0.2162        
   assign-custom-setter-polymorphic                   3.3092+-0.0822            3.2386+-0.3639          might be 1.0218x faster
   assign-custom-setter                               5.0907+-0.8878            4.3376+-0.3387          might be 1.1736x faster
   basic-set                                          9.6776+-0.6905            9.5453+-0.2849          might be 1.0139x faster
   big-int-mul                                        4.5255+-0.3373     ^      4.0625+-0.0654        ^ definitely 1.1140x faster
   boolean-test                                       3.2496+-0.3687     ?      3.3581+-0.2122        ? might be 1.0334x slower
   branch-fold                                        4.2360+-0.4902            4.0019+-0.1961          might be 1.0585x faster
   branch-on-string-as-boolean                       20.5280+-0.5171     ?     22.4296+-1.6887        ? might be 1.0926x slower
   by-val-generic                                     8.5166+-0.3107            8.5102+-0.2323        
   call-spread-apply                                 30.5061+-1.3819           30.3291+-1.6474        
   call-spread-call                                  26.6980+-1.6376           25.4113+-0.6864          might be 1.0506x faster
   captured-assignments                               0.5507+-0.0542     ?      0.5601+-0.0631        ? might be 1.0171x slower
   cast-int-to-double                                 5.3283+-0.0608            5.3105+-0.0366        
   cell-argument                                      8.6000+-0.2663     ?      8.7522+-0.2699        ? might be 1.0177x slower
   cfg-simplify                                       2.9813+-0.3132            2.9375+-0.1878          might be 1.0149x faster
   chain-getter-access                                9.7462+-0.8438            9.4107+-0.2031          might be 1.0356x faster
   cmpeq-obj-to-obj-other                            12.6137+-0.3902           11.8312+-0.4621          might be 1.0661x faster
   constant-test                                      5.0288+-0.0281     ?      5.2840+-0.7559        ? might be 1.0507x slower
   create-lots-of-functions                          11.7549+-0.3196     ?     11.8339+-0.5868        ?
   cse-new-array-buffer                               2.5860+-0.1168     ?      2.6790+-0.2678        ? might be 1.0360x slower
   cse-new-array                                      2.6932+-0.1243     ?      2.6988+-0.1029        ?
   DataView-custom-properties                        43.8945+-1.8256           42.8975+-1.4967          might be 1.0232x faster
   deconstructing-parameters-overridden-by-function   
                                                      0.5804+-0.0283     ?      0.6008+-0.0934        ? might be 1.0351x slower
   delay-tear-off-arguments-strictmode               14.7775+-0.5230           14.2266+-0.2785          might be 1.0387x faster
   deltablue-varargs                                247.5038+-2.2917     ?    249.2660+-2.4610        ?
   destructuring-arguments                           17.3858+-0.4469     ?     17.6112+-0.9052        ? might be 1.0130x slower
   destructuring-swap                                 5.4111+-0.4472            5.1683+-0.1447          might be 1.0470x faster
   direct-arguments-getbyval                          1.4550+-0.2212            1.3228+-0.0847          might be 1.0999x faster
   div-boolean-double                                 5.3105+-0.1151     ?      5.3567+-0.1668        ?
   div-boolean                                        8.0617+-0.3088            7.9350+-0.1601          might be 1.0160x faster
   double-get-by-val-out-of-bounds                    4.7452+-0.2525            4.5974+-0.0461          might be 1.0322x faster
   double-pollution-getbyval                          8.9469+-0.0641     ?      9.0156+-0.2396        ?
   double-pollution-putbyoffset                       4.4755+-0.1257     ?      4.4887+-0.1962        ?
   double-real-use                                   29.9420+-0.6770     ?     31.5201+-1.7683        ? might be 1.0527x slower
   double-to-int32-typed-array-no-inline              2.6657+-0.1737            2.4150+-0.1649          might be 1.1038x faster
   double-to-int32-typed-array                        2.0288+-0.1556     ?      2.0494+-0.1775        ? might be 1.0102x slower
   double-to-uint32-typed-array-no-inline             2.6318+-0.1879     ?      2.8346+-0.2313        ? might be 1.0771x slower
   double-to-uint32-typed-array                       2.2504+-0.3760     ?      2.2588+-0.4819        ?
   elidable-new-object-dag                           44.3819+-1.7523           43.7157+-2.1059          might be 1.0152x faster
   elidable-new-object-roflcopter                    44.7461+-0.9156     ?     45.5520+-1.3921        ? might be 1.0180x slower
   elidable-new-object-then-call                     40.2166+-1.5685     ?     40.3070+-1.6023        ?
   elidable-new-object-tree                          46.4867+-0.7588           45.6503+-0.8967          might be 1.0183x faster
   empty-string-plus-int                              5.7586+-0.2323            5.5883+-0.1708          might be 1.0305x faster
   emscripten-cube2hash                              38.3882+-1.6519     ?     39.0316+-1.1717        ? might be 1.0168x slower
   exit-length-on-plain-object                       14.2195+-0.5448     ?     14.9981+-1.2581        ? might be 1.0548x slower
   external-arguments-getbyval                        1.3781+-0.0848            1.2575+-0.0780          might be 1.0959x faster
   external-arguments-putbyval                        2.4806+-0.1078            2.4443+-0.1261          might be 1.0148x faster
   fixed-typed-array-storage-var-index                1.2923+-0.0251            1.2537+-0.0822          might be 1.0308x faster
   fixed-typed-array-storage                          0.9991+-0.1257     ?      1.0522+-0.2782        ? might be 1.0532x slower
   Float32Array-matrix-mult                           4.6896+-0.2206     ?      4.9040+-0.7689        ? might be 1.0457x slower
   Float32Array-to-Float64Array-set                  56.7085+-1.1478     ^     53.0980+-1.5046        ^ definitely 1.0680x faster
   Float64Array-alloc-long-lived                     88.6842+-1.7099           88.0547+-1.2654        
   Float64Array-to-Int16Array-set                    69.9187+-1.3835     ?     71.1616+-0.3354        ? might be 1.0178x slower
   fold-double-to-int                                13.9430+-0.5594           13.9371+-0.7076        
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     11.0474+-1.4521           10.7326+-0.8661          might be 1.0293x faster
   fold-get-by-id-to-multi-get-by-offset             10.7014+-1.1219     ?     10.7251+-1.2815        ?
   fold-multi-get-by-offset-to-get-by-offset   
                                                      9.0004+-1.5619     ?      9.7424+-1.1130        ? might be 1.0824x slower
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                      8.7856+-0.6613     ?      8.8689+-1.2596        ?
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                      9.9988+-0.7373            9.6727+-1.1343          might be 1.0337x faster
   fold-multi-put-by-offset-to-put-by-offset   
                                                      7.5928+-0.5480     ?      7.6893+-1.1035        ? might be 1.0127x slower
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                      9.9873+-0.3813     ?     10.0739+-0.3975        ?
   fold-put-by-id-to-multi-put-by-offset             10.3665+-1.4604     ?     10.5044+-1.2599        ? might be 1.0133x slower
   fold-put-structure                                 8.2544+-0.6664            7.3497+-1.4782          might be 1.1231x faster
   for-of-iterate-array-entries                       4.7482+-0.2403            4.7017+-0.2235        
   for-of-iterate-array-keys                          3.7830+-0.1125     ?      4.1432+-0.4748        ? might be 1.0952x slower
   for-of-iterate-array-values                        3.7236+-0.3282            3.6718+-0.2302          might be 1.0141x faster
   fround                                            21.5612+-0.7981           21.5582+-0.5902        
   ftl-library-inlining-dataview                     65.2191+-1.8325     ?     66.5548+-3.6585        ? might be 1.0205x slower
   ftl-library-inlining                              66.7288+-0.2653     ?     75.5047+-18.4948       ? might be 1.1315x slower
   function-dot-apply                                 2.5102+-0.4472            2.3799+-0.2682          might be 1.0547x faster
   function-test                                      2.9355+-0.0207     ?      3.0136+-0.1607        ? might be 1.0266x slower
   function-with-eval                               105.4561+-4.3288     ?    106.7240+-4.3207        ? might be 1.0120x slower
   gcse-poly-get-less-obvious                        19.2033+-0.9650           18.8009+-0.4517          might be 1.0214x faster
   gcse-poly-get                                     20.4542+-1.2201           19.7128+-0.8873          might be 1.0376x faster
   gcse                                               4.4358+-0.0850            4.3538+-0.0527          might be 1.0188x faster
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      2.8761+-0.2561            2.8062+-0.0856          might be 1.0249x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                      6.0948+-0.1446     ?      6.1870+-0.1959        ? might be 1.0151x slower
   get-by-id-chain-from-try-block                     6.9343+-0.7729            6.5419+-0.0758          might be 1.0600x faster
   get-by-id-check-structure-elimination              5.4994+-0.5786            5.2740+-0.2191          might be 1.0427x faster
   get-by-id-proto-or-self                           18.9292+-1.0148     ?     19.0758+-1.8601        ?
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      2.9965+-0.0570     ?      3.1601+-0.1453        ? might be 1.0546x slower
   get-by-id-self-or-proto                           19.1013+-2.0658     ?     19.4988+-1.8638        ? might be 1.0208x slower
   get-by-val-out-of-bounds                           4.5004+-0.1437     ?      4.5832+-0.2495        ? might be 1.0184x slower
   get_callee_monomorphic                             3.2618+-0.7912            2.9971+-0.2376          might be 1.0883x faster
   get_callee_polymorphic                             3.8188+-0.1670     ?      3.9092+-0.3501        ? might be 1.0237x slower
   getter-no-activation                               5.3545+-0.4195            5.2229+-0.3908          might be 1.0252x faster
   getter-prototype                                  15.6335+-0.6049           15.3507+-0.9126          might be 1.0184x faster
   getter-richards                                  134.7804+-7.3646          132.6525+-5.7563          might be 1.0160x faster
   getter                                             6.3554+-0.9512            6.0685+-0.6731          might be 1.0473x faster
   global-var-const-infer-fire-from-opt               0.9745+-0.0647     ?      0.9844+-0.1082        ? might be 1.0101x slower
   global-var-const-infer                             0.9770+-0.2057     ?      1.0829+-0.2418        ? might be 1.1084x slower
   HashMap-put-get-iterate-keys                      31.8450+-2.1292           31.3839+-2.3621          might be 1.0147x faster
   HashMap-put-get-iterate                           34.3000+-3.1986           31.1834+-2.2528          might be 1.0999x faster
   HashMap-string-put-get-iterate                    33.2100+-0.9256     ?     33.6555+-0.7665        ? might be 1.0134x slower
   hoist-make-rope                                   12.2407+-1.2655     ?     12.7043+-1.3905        ? might be 1.0379x slower
   hoist-poly-check-structure-effectful-loop   
                                                      5.1443+-0.0938     ?      5.2280+-0.1729        ? might be 1.0163x slower
   hoist-poly-check-structure                         3.8209+-0.1111     ?      3.8539+-0.2640        ?
   imul-double-only                                   8.8237+-0.5224     ?      9.9184+-1.3223        ? might be 1.1241x slower
   imul-int-only                                      9.9987+-0.2673            9.8683+-0.0766          might be 1.0132x faster
   imul-mixed                                         8.3538+-0.3140     ?      9.6095+-2.5970        ? might be 1.1503x slower
   in-four-cases                                     22.4460+-0.4560           22.2763+-0.2597        
   in-one-case-false                                 11.1415+-0.1228     ?     11.3938+-0.3908        ? might be 1.0226x slower
   in-one-case-true                                  11.0500+-0.0853     ?     11.5031+-0.6740        ? might be 1.0410x slower
   in-two-cases                                      11.7533+-0.3227           11.6383+-0.0671        
   indexed-properties-in-objects                      3.0313+-0.1268            2.9819+-0.0988          might be 1.0166x faster
   infer-closure-const-then-mov-no-inline             4.5965+-0.7448            3.9635+-0.0609          might be 1.1597x faster
   infer-closure-const-then-mov                      20.0339+-0.3590           19.7205+-0.2441          might be 1.0159x faster
   infer-closure-const-then-put-to-scope-no-inline   
                                                     13.0111+-0.6656           12.9114+-0.4654        
   infer-closure-const-then-put-to-scope             21.5252+-0.5158     ?     21.9180+-1.0052        ? might be 1.0182x slower
   infer-closure-const-then-reenter-no-inline   
                                                     55.0421+-0.9203           54.2729+-1.1233          might be 1.0142x faster
   infer-closure-const-then-reenter                  22.6346+-1.0429           22.3550+-0.6938          might be 1.0125x faster
   infer-constant-global-property                     3.6468+-0.1388            3.6075+-0.1222          might be 1.0109x faster
   infer-constant-property                            2.9751+-0.4164            2.9200+-0.3513          might be 1.0189x faster
   infer-one-time-closure-ten-vars                   12.8461+-0.7024     ?     13.2059+-1.0415        ? might be 1.0280x slower
   infer-one-time-closure-two-vars                   12.7457+-1.4275     ?     12.9932+-1.3159        ? might be 1.0194x slower
   infer-one-time-closure                            12.4598+-0.6661     ?     13.4301+-1.6650        ? might be 1.0779x slower
   infer-one-time-deep-closure                       21.7930+-1.4343           21.5463+-1.1718          might be 1.0114x faster
   inline-arguments-access                            5.0683+-0.4439            4.7666+-0.1743          might be 1.0633x faster
   inline-arguments-aliased-access                    4.7885+-0.3912            4.6746+-0.1380          might be 1.0243x faster
   inline-arguments-local-escape                      4.6592+-0.0499     ?      4.6850+-0.0696        ?
   inline-get-scoped-var                              4.8912+-0.1390     ?      4.8951+-0.1528        ?
   inlined-put-by-id-transition                      12.4661+-0.5212           12.2018+-1.0271          might be 1.0217x faster
   int-or-other-abs-then-get-by-val                   5.0776+-0.0776            5.0597+-0.1409        
   int-or-other-abs-zero-then-get-by-val             17.5265+-0.2930     ?     17.7052+-0.8847        ? might be 1.0102x slower
   int-or-other-add-then-get-by-val                   4.4357+-0.1547            4.3669+-0.0226          might be 1.0157x faster
   int-or-other-add                                   5.5638+-0.2037     ?      5.6377+-0.4717        ? might be 1.0133x slower
   int-or-other-div-then-get-by-val                   4.3710+-0.1106            4.3343+-0.1779        
   int-or-other-max-then-get-by-val                   4.5190+-0.2978            4.5103+-0.3118        
   int-or-other-min-then-get-by-val                   4.3526+-0.0266     ?      4.4343+-0.1739        ? might be 1.0188x slower
   int-or-other-mod-then-get-by-val                   3.9632+-0.0387     ?      4.0865+-0.2168        ? might be 1.0311x slower
   int-or-other-mul-then-get-by-val                   4.0070+-0.0706     ?      4.1124+-0.3533        ? might be 1.0263x slower
   int-or-other-neg-then-get-by-val                   4.9795+-0.4141            4.8464+-0.0740          might be 1.0275x faster
   int-or-other-neg-zero-then-get-by-val             18.4338+-1.4504     ?     20.2390+-4.2630        ? might be 1.0979x slower
   int-or-other-sub-then-get-by-val                   4.4826+-0.1827     ?      4.5574+-0.4279        ? might be 1.0167x slower
   int-or-other-sub                                   3.8208+-0.3274            3.6892+-0.1406          might be 1.0357x faster
   int-overflow-local                                 4.5694+-0.0332     ?      4.5916+-0.0389        ?
   Int16Array-alloc-long-lived                       52.7960+-0.9886     ?     53.1394+-1.7736        ?
   Int16Array-bubble-sort-with-byteLength            20.5752+-1.5240           20.5035+-0.9296        
   Int16Array-bubble-sort                            20.9473+-0.9913           20.8058+-1.3404        
   Int16Array-load-int-mul                            1.6203+-0.1864            1.5389+-0.0537          might be 1.0529x faster
   Int16Array-to-Int32Array-set                      56.7273+-1.8823           56.1931+-1.5213        
   Int32Array-alloc-large                            24.8308+-1.7008           24.4211+-0.7459          might be 1.0168x faster
   Int32Array-alloc-long-lived                       63.4379+-1.1433     ?     64.0446+-0.6727        ?
   Int32Array-alloc                                   3.6144+-0.3962     ?      3.6787+-0.5701        ? might be 1.0178x slower
   Int32Array-Int8Array-view-alloc                    7.1302+-0.8118            6.7197+-0.3091          might be 1.0611x faster
   int52-spill                                        5.6859+-0.1007     ?      5.7664+-0.0734        ? might be 1.0141x slower
   Int8Array-alloc-long-lived                        49.1965+-2.2792           48.9821+-2.0092        
   Int8Array-load-with-byteLength                     3.6831+-0.3908            3.4236+-0.0404          might be 1.0758x faster
   Int8Array-load                                     3.5141+-0.1522     ?      3.6687+-0.3961        ? might be 1.0440x slower
   integer-divide                                    11.2480+-0.3004           11.0696+-0.3717          might be 1.0161x faster
   integer-modulo                                     2.2475+-0.2738            2.1560+-0.0929          might be 1.0424x faster
   is-boolean-fold-tricky                             4.4791+-0.0884     ?      4.4986+-0.0414        ?
   is-boolean-fold                                    2.9380+-0.1221            2.9000+-0.1478          might be 1.0131x faster
   is-function-fold-tricky-internal-function   
                                                     12.0419+-0.1709     ?     12.7079+-1.2483        ? might be 1.0553x slower
   is-function-fold-tricky                            4.9500+-0.4911            4.5997+-0.0830          might be 1.0762x faster
   is-function-fold                                   3.0971+-0.3009            3.0736+-0.3746        
   is-number-fold-tricky                              4.5676+-0.2181     ?      4.6206+-0.1304        ? might be 1.0116x slower
   is-number-fold                                     2.9073+-0.0385            2.9053+-0.1224        
   is-object-or-null-fold-functions                   3.1860+-0.3112            3.0857+-0.3883          might be 1.0325x faster
   is-object-or-null-fold-less-tricky                 4.5764+-0.1650     ?      4.8550+-0.4270        ? might be 1.0609x slower
   is-object-or-null-fold-tricky                      6.6755+-0.0641     ?      6.6937+-0.1089        ?
   is-object-or-null-fold                             2.9935+-0.1090            2.8755+-0.0283          might be 1.0410x faster
   is-object-or-null-trickier-function                4.6710+-0.1520     ?      5.0263+-0.4400        ? might be 1.0761x slower
   is-object-or-null-trickier-internal-function   
                                                     12.7232+-0.3713     ?     13.7996+-1.7587        ? might be 1.0846x slower
   is-object-or-null-tricky-function                  4.7909+-0.3689            4.7909+-0.2309        
   is-object-or-null-tricky-internal-function   
                                                      9.5022+-0.2475     ?      9.7397+-0.7677        ? might be 1.0250x slower
   is-string-fold-tricky                              4.5712+-0.2380     ?      4.6450+-0.2204        ? might be 1.0161x slower
   is-string-fold                                     3.0743+-0.3203            2.8646+-0.0810          might be 1.0732x faster
   is-undefined-fold-tricky                           3.8168+-0.0926     ?      3.8989+-0.2098        ? might be 1.0215x slower
   is-undefined-fold                                  3.0251+-0.3697     ?      3.0463+-0.3585        ?
   large-int-captured                                 4.8487+-0.1050     ?      4.9942+-0.2301        ? might be 1.0300x slower
   large-int-neg                                     16.9314+-1.2634           16.8657+-0.7946        
   large-int                                         16.4041+-2.6050           15.3085+-1.6129          might be 1.0716x faster
   load-varargs-elimination                          23.2752+-0.4936     ?     24.1651+-1.9781        ? might be 1.0382x slower
   logical-not-weird-types                            3.3204+-0.0998     ?      3.4236+-0.1848        ? might be 1.0311x slower
   logical-not                                        5.2036+-1.3052            4.6563+-0.0516          might be 1.1175x faster
   lots-of-fields                                    12.2292+-0.2119     ?     12.3655+-0.1011        ? might be 1.0111x slower
   make-indexed-storage                               3.2586+-0.4297     ?      3.3129+-0.3744        ? might be 1.0166x slower
   make-rope-cse                                     12.4507+-1.1125     ?     13.2835+-1.3802        ? might be 1.0669x slower
   marsaglia-larger-ints                             36.4821+-0.8588     ?     38.3978+-2.4731        ? might be 1.0525x slower
   marsaglia-osr-entry                               23.9025+-1.6352           23.3490+-0.4819          might be 1.0237x faster
   math-with-out-of-bounds-array-values              24.9624+-0.6751           23.9163+-0.6323          might be 1.0437x faster
   max-boolean                                        2.5660+-0.0633            2.5124+-0.0471          might be 1.0213x faster
   method-on-number                                  18.2350+-0.7152           17.6905+-0.4468          might be 1.0308x faster
   min-boolean                                        2.7280+-0.2994            2.5045+-0.0238          might be 1.0893x faster
   minus-boolean-double                               3.2909+-0.1450            3.2832+-0.0919        
   minus-boolean                                      2.4595+-0.1252     ?      2.5841+-0.4671        ? might be 1.0507x slower
   misc-strict-eq                                    39.6392+-0.9747           38.3512+-1.1700          might be 1.0336x faster
   mod-boolean-double                                11.0216+-0.1970           10.9122+-0.1312          might be 1.0100x faster
   mod-boolean                                        7.8948+-0.0826     ?      7.9404+-0.1432        ?
   mul-boolean-double                                 3.8795+-0.2749            3.8170+-0.1536          might be 1.0164x faster
   mul-boolean                                        3.2009+-0.4307            3.1224+-0.3546          might be 1.0251x faster
   neg-boolean                                        3.3785+-0.2586            3.1917+-0.0273          might be 1.0585x faster
   negative-zero-divide                               0.4061+-0.0425     ?      0.4112+-0.0277        ? might be 1.0125x slower
   negative-zero-modulo                               0.4082+-0.0460            0.4080+-0.0438        
   negative-zero-negate                               0.3873+-0.0604     ?      0.4148+-0.0935        ? might be 1.0710x slower
   nested-function-parsing                           41.8825+-2.8926           40.3062+-1.4413          might be 1.0391x faster
   new-array-buffer-dead                            112.6071+-1.3509          111.8824+-3.0027        
   new-array-buffer-push                              7.6626+-1.0624            7.0334+-0.2359          might be 1.0894x faster
   new-array-dead                                    19.6606+-1.5469           19.5090+-0.3781        
   new-array-push                                     7.3515+-1.3677            6.6348+-0.2392          might be 1.1080x faster
   no-inline-constructor                             41.2630+-1.8830           40.7146+-1.3859          might be 1.0135x faster
   number-test                                        3.1208+-0.0732     ?      3.1703+-0.1508        ? might be 1.0159x slower
   object-closure-call                                5.7198+-0.0303            5.7119+-0.0160        
   object-test                                        2.9261+-0.0518            2.9216+-0.1427        
   obvious-sink-pathology-taken                     144.3696+-4.7926          143.7350+-3.9397        
   obvious-sink-pathology                           132.7749+-2.1093     ?    133.3378+-2.7050        ?
   obviously-elidable-new-object                     36.2891+-1.3717           35.5871+-1.4511          might be 1.0197x faster
   plus-boolean-arith                                 2.5822+-0.0407     ?      2.6537+-0.3269        ? might be 1.0277x slower
   plus-boolean-double                                3.3415+-0.2132     ?      3.3597+-0.2834        ?
   plus-boolean                                       2.5417+-0.1103     ?      2.6486+-0.3213        ? might be 1.0421x slower
   poly-chain-access-different-prototypes-simple   
                                                      3.3324+-0.0858     ?      3.3440+-0.0442        ?
   poly-chain-access-different-prototypes             2.8354+-0.3366            2.6584+-0.2363          might be 1.0666x faster
   poly-chain-access-simpler                          3.4448+-0.1197     ?      3.5417+-0.4013        ? might be 1.0281x slower
   poly-chain-access                                  2.5884+-0.0158     ?      2.7445+-0.1596        ? might be 1.0603x slower
   poly-stricteq                                     61.1344+-2.1780           59.8724+-1.8982          might be 1.0211x faster
   polymorphic-array-call                             1.4302+-0.0862            1.3976+-0.0614          might be 1.0233x faster
   polymorphic-get-by-id                              3.3131+-0.1801            3.1737+-0.0339          might be 1.0439x faster
   polymorphic-put-by-id                             33.9239+-2.4388           32.2137+-1.9043          might be 1.0531x faster
   polymorphic-structure                             15.6589+-0.9997           15.2581+-0.7475          might be 1.0263x faster
   polyvariant-monomorphic-get-by-id                  8.6306+-0.1167     ?      8.6667+-0.1263        ?
   proto-getter-access                                9.5922+-0.2585            9.3617+-0.2046          might be 1.0246x faster
   put-by-id-replace-and-transition                   9.7788+-0.2816            9.6748+-0.1837          might be 1.0107x faster
   put-by-id-slightly-polymorphic                     2.9264+-0.1416            2.9131+-0.1131        
   put-by-id                                         12.8243+-0.3458     ?     12.9011+-0.3184        ?
   put-by-val-direct                                  0.4140+-0.0390     ?      0.4235+-0.0464        ? might be 1.0231x slower
   put-by-val-large-index-blank-indexing-type   
                                                     12.7731+-1.0667           12.5999+-1.2844          might be 1.0137x faster
   put-by-val-machine-int                             2.9362+-0.1228     ?      3.0000+-0.3390        ? might be 1.0218x slower
   rare-osr-exit-on-local                            15.1906+-0.4196     ?     15.3474+-0.4517        ? might be 1.0103x slower
   register-pressure-from-osr                         4.6191+-0.2874            4.4557+-0.0595          might be 1.0367x faster
   repeat-multi-get-by-offset                        24.6261+-0.3345     ?     24.8691+-0.4813        ?
   setter-prototype                                  10.5738+-0.2913     ?     10.5950+-0.1918        ?
   setter                                             6.5992+-0.9045            6.3722+-0.8996          might be 1.0356x faster
   simple-activation-demo                            25.3594+-1.1114     ?     25.9238+-1.3836        ? might be 1.0223x slower
   simple-getter-access                              12.2277+-1.2798           11.8415+-0.2083          might be 1.0326x faster
   simple-poly-call-nested                            8.2623+-0.2577     ?      8.3722+-0.7670        ? might be 1.0133x slower
   simple-poly-call                                   1.3537+-0.0860            1.3367+-0.0391          might be 1.0127x faster
   sin-boolean                                       23.9644+-1.5071           23.1274+-0.8079          might be 1.0362x faster
   singleton-scope                                   63.3407+-2.4090           63.1540+-1.9670        
   sink-function                                     12.4911+-0.3329     ?     12.8576+-0.7769        ? might be 1.0293x slower
   sink-huge-activation                              19.1983+-0.9434     ?     19.2520+-0.6571        ?
   sinkable-new-object-dag                           72.9355+-6.8371           71.2257+-0.8491          might be 1.0240x faster
   sinkable-new-object-taken                         51.1085+-2.8746     ?     56.7357+-3.7854        ? might be 1.1101x slower
   sinkable-new-object                               39.6759+-2.2480     ?     40.5074+-1.4712        ? might be 1.0210x slower
   slow-array-profile-convergence                     3.2616+-0.4616            3.1048+-0.3721          might be 1.0505x faster
   slow-convergence                                   3.9661+-0.5547            3.7228+-0.1287          might be 1.0654x faster
   slow-ternaries                                    20.7852+-2.8173     ?     22.1277+-1.9560        ? might be 1.0646x slower
   sorting-benchmark                                 19.4729+-0.6396           19.4694+-0.9927        
   sparse-conditional                                 1.2331+-0.1530     ?      1.2562+-0.0984        ? might be 1.0187x slower
   splice-to-remove                                  16.1715+-1.4076           16.0125+-1.3640        
   string-char-code-at                               16.2834+-0.1868     ?     17.1071+-1.2629        ? might be 1.0506x slower
   string-concat-object                               2.8222+-0.3954            2.6672+-0.1803          might be 1.0581x faster
   string-concat-pair-object                          2.7474+-0.2342     ?      2.7651+-0.3132        ?
   string-concat-pair-simple                         12.6751+-1.2947           11.8915+-0.3924          might be 1.0659x faster
   string-concat-simple                              12.6304+-1.0515           12.2992+-0.8564          might be 1.0269x faster
   string-cons-repeat                                 8.7845+-0.6525            8.0080+-0.2733          might be 1.0970x faster
   string-cons-tower                                  8.9521+-0.8767            8.3886+-0.5596          might be 1.0672x faster
   string-equality                                   18.3380+-1.2367     ?     18.4195+-0.8158        ?
   string-get-by-val-big-char                         7.4319+-0.5637            7.2170+-0.0610          might be 1.0298x faster
   string-get-by-val-out-of-bounds-insane             3.6762+-0.1125     ?      3.9624+-0.4809        ? might be 1.0779x slower
   string-get-by-val-out-of-bounds                    5.5040+-0.0419     ?      5.9184+-0.6679        ? might be 1.0753x slower
   string-get-by-val                                  3.4622+-0.0394     ?      3.6123+-0.3683        ? might be 1.0434x slower
   string-hash                                        2.2345+-0.2178            2.0970+-0.1102          might be 1.0656x faster
   string-long-ident-equality                        14.5144+-0.1500     ?     14.8630+-0.4418        ? might be 1.0240x slower
   string-out-of-bounds                              14.9540+-0.2555     ?     15.5554+-0.8906        ? might be 1.0402x slower
   string-repeat-arith                               34.2933+-1.3669           33.7427+-2.4550          might be 1.0163x faster
   string-sub                                        68.4407+-4.3276           66.3802+-2.7317          might be 1.0310x faster
   string-test                                        3.0449+-0.1047     ?      3.1334+-0.2613        ? might be 1.0291x slower
   string-var-equality                               34.3935+-1.8177           32.4599+-0.6365          might be 1.0596x faster
   structure-hoist-over-transitions                   2.8082+-0.1454            2.7729+-0.1855          might be 1.0127x faster
   substring-concat-weird                            44.0647+-6.1500           41.0913+-2.1720          might be 1.0724x faster
   substring-concat                                  43.3745+-1.3007           42.5035+-0.8560          might be 1.0205x faster
   substring                                         46.6376+-1.7047     ?     46.9411+-2.8114        ?
   switch-char-constant                               2.8822+-0.1340     ?      2.8887+-0.1465        ?
   switch-char                                        7.2725+-0.9559            7.0166+-0.8063          might be 1.0365x faster
   switch-constant                                    8.5747+-0.3210     ?      8.6440+-0.4173        ?
   switch-string-basic-big-var                       18.7152+-0.5142           18.4188+-0.3750          might be 1.0161x faster
   switch-string-basic-big                           15.0127+-0.3717     ?     15.0696+-0.6601        ?
   switch-string-basic-var                           15.7190+-0.9958           15.6875+-1.2207        
   switch-string-basic                               13.7335+-0.2325           13.6605+-0.2100        
   switch-string-big-length-tower-var                20.7775+-1.3132     ?     21.1073+-1.3631        ? might be 1.0159x slower
   switch-string-length-tower-var                    15.9058+-0.9173           15.6562+-0.3901          might be 1.0159x faster
   switch-string-length-tower                        13.3571+-0.4115           13.3369+-0.4185        
   switch-string-short                               13.0681+-0.2632     ?     13.0780+-0.2410        ?
   switch                                            12.6971+-0.3522     ?     12.8331+-0.3766        ? might be 1.0107x slower
   tear-off-arguments-simple                          3.7163+-0.2779            3.5373+-0.1716          might be 1.0506x faster
   tear-off-arguments                                 4.8767+-0.0937            4.8663+-0.0628        
   temporal-structure                                12.3037+-0.0991           12.1988+-0.2099        
   to-int32-boolean                                  14.0151+-0.2238     ?     14.1297+-0.1866        ?
   try-catch-get-by-val-cloned-arguments             15.9945+-1.4572           15.0421+-0.8063          might be 1.0633x faster
   try-catch-get-by-val-direct-arguments              6.8995+-0.9062            6.6646+-0.3664          might be 1.0353x faster
   try-catch-get-by-val-scoped-arguments              8.1883+-0.2582     ?      9.2985+-1.5091        ? might be 1.1356x slower
   typed-array-get-set-by-val-profiling              33.1230+-0.7783     ^     28.0772+-0.4511        ^ definitely 1.1797x faster
   undefined-property-access                        349.7361+-12.9536         342.1995+-2.0816          might be 1.0220x faster
   undefined-test                                     3.0733+-0.0326     ?      3.1207+-0.0918        ? might be 1.0154x slower
   unprofiled-licm                                   22.9499+-0.4767     ?     23.1497+-0.5466        ?
   varargs-call                                      15.0807+-0.2281     ?     15.3544+-0.8418        ? might be 1.0182x slower
   varargs-construct-inline                          29.3266+-1.3538           28.2580+-0.9663          might be 1.0378x faster
   varargs-construct                                 23.5056+-1.5459           22.6628+-0.5438          might be 1.0372x faster
   varargs-inline                                     9.4643+-0.2805            9.3975+-0.0842        
   varargs-strict-mode                                9.9999+-0.0709     ?     10.2587+-0.3611        ? might be 1.0259x slower
   varargs                                           10.5316+-1.1253     ?     11.3717+-3.5850        ? might be 1.0798x slower
   weird-inlining-const-prop                          3.2692+-0.2131     ?      3.3594+-0.2584        ? might be 1.0276x slower

   &lt;geometric&gt;                                        9.2010+-0.0166     ^      9.1231+-0.0308        ^ definitely 1.0085x faster

                                                        TipOfTree                    ABC                                        
AsmBench:
   bigfib.cpp                                       501.2403+-2.0450          501.0593+-1.5281        
   cray.c                                           427.7279+-1.4031     !    430.2067+-1.0034        ! definitely 1.0058x slower
   dry.c                                            488.7017+-11.9086    ?    493.8884+-1.8162        ? might be 1.0106x slower
   FloatMM.c                                        735.0844+-33.3353         722.1065+-1.5561          might be 1.0180x faster
   gcc-loops.cpp                                   4097.9397+-15.9951    ?   4111.0414+-14.6130       ?
   n-body.c                                         972.7664+-1.4076     ?    976.3195+-2.2343        ?
   Quicksort.c                                      425.8973+-11.4986    ?    435.4954+-30.1243       ? might be 1.0225x slower
   stepanov_container.cpp                          3597.7916+-16.2538    ?   3875.1390+-453.6387      ? might be 1.0771x slower
   Towers.c                                         245.5719+-1.6510          244.3245+-3.9464        

   &lt;geometric&gt;                                      786.6779+-4.1868     ?    794.7784+-15.2882       ? might be 1.0103x slower

                                                        TipOfTree                    ABC                                        
CompressionBench:
   huffman                                          379.7402+-15.6657    ^    357.2908+-3.5455        ^ definitely 1.0628x faster
   arithmetic-simple                                375.8312+-3.8905     ^    347.6770+-1.8509        ^ definitely 1.0810x faster
   arithmetic-precise                               299.9359+-5.9868          294.5298+-2.8183          might be 1.0184x faster
   arithmetic-complex-precise                       300.9635+-13.8135         294.1683+-12.4777         might be 1.0231x faster
   arithmetic-precise-order-0                       388.4006+-3.6318     ^    363.5165+-4.1081        ^ definitely 1.0685x faster
   arithmetic-precise-order-1                       324.8556+-2.3355     ?    325.7362+-7.4961        ?
   arithmetic-precise-order-2                       361.5630+-3.8288          361.0098+-2.8446        
   arithmetic-simple-order-1                        421.7841+-1.1354     ^    401.1082+-18.8376       ^ definitely 1.0515x faster
   arithmetic-simple-order-2                        491.2053+-26.6762    ^    454.6497+-4.0502        ^ definitely 1.0804x faster
   lz-string                                        325.8858+-8.6184          320.0770+-3.4284          might be 1.0181x faster

   &lt;geometric&gt;                                      362.8556+-2.2259     ^    348.9970+-0.9225        ^ definitely 1.0397x faster

                                                        TipOfTree                    ABC                                        
Geomean of preferred means:
   &lt;scaled-result&gt;                                   62.8416+-0.5070           62.3828+-0.2250          might be 1.0074x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101137</commentid>
    <comment_count>11</comment_count>
      <attachid>254684</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-10 15:37:04 -0700</bug_when>
    <thetext>Created attachment 254684
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1101142</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-06-10 15:40:17 -0700</bug_when>
    <thetext>Attachment 254684 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:313:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:866:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:866:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1141:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1190:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 5 in 20 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>1102133</commentid>
    <comment_count>13</comment_count>
      <attachid>254684</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-06-15 19:15:58 -0700</bug_when>
    <thetext>Comment on attachment 254684
the patch

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

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:155
&gt; +        if (m_offset == std::numeric_limits&lt;int&gt;::min())
&gt; +            return Relationship();

It would be good to have a test covering this case.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:309
&gt; +        // Make sure that if we have a LessThan, then it&apos;s first.
&gt; +        if (b.m_kind == LessThan)
&gt; +            std::swap(a, b);
&gt; +        
&gt; +        // Make sure that if we have a NotEqual, then it&apos;s first.
&gt; +        if (b.m_kind == NotEqual)
&gt; +            std::swap(a, b);

I would move those to mergeImpl() and remove the comments.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:332
&gt; +    Relationship filter(const Relationship&amp; other) const

TODO: review this.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:341
&gt; +        // this to assume that we different offsets anytime that everything but the offset is

&quot;assume that we different offsets anytime&quot;

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:436
&gt; +        int minRightValue;
&gt; +        if (m_right-&gt;isInt32Constant())
&gt; +            minRightValue = m_right-&gt;asInt32();
&gt; +        else
&gt; +            minRightValue = std::numeric_limits&lt;int&gt;::min();

Maybe simpler like this?

int minRightValue = std::numeric_limits&lt;int&gt;::min();
if (m_right-&gt;isInt32Constant())
    minRightValue = m_right-&gt;asInt32();

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:440
&gt; +        return clampedSum(minRightValue, m_offset);

I am not following this case.

If we are here, we have (kind == Equal or kind == NotEqual).
Why is the mind value of NotEqual @b + Constant?

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:455
&gt; +        int maxRightValue;
&gt; +        if (m_right-&gt;isInt32Constant())
&gt; +            maxRightValue = m_right-&gt;asInt32();
&gt; +        else
&gt; +            maxRightValue = std::numeric_limits&lt;int&gt;::max();

&quot;Simpler&quot; version here too.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:459
&gt; +        return clampedSum(maxRightValue, m_offset);

Same question about NotEqual

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:495
&gt; +        ASSERT(sameNodesAs(other));

An other precondition is that neither node has the relation &quot;GreaterThan&quot;.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:520
&gt; +        // this to assume that we different offsets anytime that everything but the offset is

&quot;that we different offsets&quot;

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:531
&gt; +                    // Saying that you might be B when you&apos;ve already said that you&apos;re anything
&gt; +                    // but A, where A and B are different, is a tautology. You could just say
&gt; +                    // that you&apos;re anything but A.

Maybe just write an example as this is a pretty obvious case?
   // Adding &quot;(a == b + 1)&quot; to &quot;(a != b + 5)&quot; has no value.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:548
&gt; +            // If we have C &gt; D, then we could keep both claims, but we are cheap, so we
&gt; +            // don&apos;t. We just use the NotEqual.

Wouldn&apos;t it be easier to implement it instead of justifying not having it? :)

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:611
&gt; +            std::max(m_offset, other.m_offset) + 1);

Not a fan of the implicit overflow here but it&apos;s harmless.

It would be good to have tests for those cases though.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:645
&gt; +        // Before we do anything, make sure that we have a zero constant at the top.

I would also say why in addition to what.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:939
&gt; +            if (!node-&gt;child2()-&gt;isInt32Constant())

No love for (constant + @value)?

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:987
&gt; +                if (!sumOverflows&lt;int&gt;(std::numeric_limits&lt;int&gt;::max(), -offset, 1)) {

I don&apos;t follow this.

Say way have:
    @1 = @x + 1000;
    @2 = @1 + 10;

You add the relationship @1 &lt; 0 + max - 10 + 1.

Say that we

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1274
&gt; +

1274 lines! The original CSS JIT was small than that :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102137</commentid>
    <comment_count>14</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-15 19:41:37 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; Comment on attachment 254684 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=254684&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:155
&gt; &gt; +        if (m_offset == std::numeric_limits&lt;int&gt;::min())
&gt; &gt; +            return Relationship();
&gt; 
&gt; It would be good to have a test covering this case.

Good idea!

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:309
&gt; &gt; +        // Make sure that if we have a LessThan, then it&apos;s first.
&gt; &gt; +        if (b.m_kind == LessThan)
&gt; &gt; +            std::swap(a, b);
&gt; &gt; +        
&gt; &gt; +        // Make sure that if we have a NotEqual, then it&apos;s first.
&gt; &gt; +        if (b.m_kind == NotEqual)
&gt; &gt; +            std::swap(a, b);
&gt; 
&gt; I would move those to mergeImpl() and remove the comments.

I don&apos;t think so - we cannot swap *this and other in mergeImpl(). :-)

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:332
&gt; &gt; +    Relationship filter(const Relationship&amp; other) const
&gt; 
&gt; TODO: review this.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:341
&gt; &gt; +        // this to assume that we different offsets anytime that everything but the offset is
&gt; 
&gt; &quot;assume that we different offsets anytime&quot;
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:436
&gt; &gt; +        int minRightValue;
&gt; &gt; +        if (m_right-&gt;isInt32Constant())
&gt; &gt; +            minRightValue = m_right-&gt;asInt32();
&gt; &gt; +        else
&gt; &gt; +            minRightValue = std::numeric_limits&lt;int&gt;::min();
&gt; 
&gt; Maybe simpler like this?
&gt; 
&gt; int minRightValue = std::numeric_limits&lt;int&gt;::min();
&gt; if (m_right-&gt;isInt32Constant())
&gt;     minRightValue = m_right-&gt;asInt32();

That works, too.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:440
&gt; &gt; +        return clampedSum(minRightValue, m_offset);
&gt; 
&gt; I am not following this case.
&gt; 
&gt; If we are here, we have (kind == Equal or kind == NotEqual).
&gt; Why is the mind value of NotEqual @b + Constant?

Ooops.  That&apos;s a bug.

I added NotEqual after writing this code.  The case for LessThan, above, which returns std::numeric_limits&lt;int&gt;::min() should also do the same for NotEqual.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:455
&gt; &gt; +        int maxRightValue;
&gt; &gt; +        if (m_right-&gt;isInt32Constant())
&gt; &gt; +            maxRightValue = m_right-&gt;asInt32();
&gt; &gt; +        else
&gt; &gt; +            maxRightValue = std::numeric_limits&lt;int&gt;::max();
&gt; 
&gt; &quot;Simpler&quot; version here too.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:459
&gt; &gt; +        return clampedSum(maxRightValue, m_offset);
&gt; 
&gt; Same question about NotEqual

Ditto, bug.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:495
&gt; &gt; +        ASSERT(sameNodesAs(other));
&gt; 
&gt; An other precondition is that neither node has the relation &quot;GreaterThan&quot;.

True!  I should add that assert.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:520
&gt; &gt; +        // this to assume that we different offsets anytime that everything but the offset is
&gt; 
&gt; &quot;that we different offsets&quot;
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:531
&gt; &gt; +                    // Saying that you might be B when you&apos;ve already said that you&apos;re anything
&gt; &gt; +                    // but A, where A and B are different, is a tautology. You could just say
&gt; &gt; +                    // that you&apos;re anything but A.
&gt; 
&gt; Maybe just write an example as this is a pretty obvious case?
&gt;    // Adding &quot;(a == b + 1)&quot; to &quot;(a != b + 5)&quot; has no value.

OK.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:548
&gt; &gt; +            // If we have C &gt; D, then we could keep both claims, but we are cheap, so we
&gt; &gt; +            // don&apos;t. We just use the NotEqual.
&gt; 
&gt; Wouldn&apos;t it be easier to implement it instead of justifying not having it? :)

By &quot;cheap&quot; I mean that we are trying to accelerate convergence.  Any time that we create more relationships, we create more things to merge, and possibly increase the number of fixpoint iterations.

Not implementing something we don&apos;t think is valuable is kind of a convergence hack - fewer relationships means less time spent processing relationships.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:611
&gt; &gt; +            std::max(m_offset, other.m_offset) + 1);
&gt; 
&gt; Not a fan of the implicit overflow here but it&apos;s harmless.
&gt; 
&gt; It would be good to have tests for those cases though.

Interesting. I didn&apos;t want this overflow. I&apos;ll guard this with sumOverflows() or something.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:645
&gt; &gt; +        // Before we do anything, make sure that we have a zero constant at the top.
&gt; 
&gt; I would also say why in addition to what.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:939
&gt; &gt; +            if (!node-&gt;child2()-&gt;isInt32Constant())
&gt; 
&gt; No love for (constant + @value)?

See DFGStrenghtReductionPhase.cpp.  It canonicalizes constant+@value to @value+constant.

This is also why we don&apos;t handle @value-constant.  It would have been canonicalized to @value+(-constant).

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:987
&gt; &gt; +                if (!sumOverflows&lt;int&gt;(std::numeric_limits&lt;int&gt;::max(), -offset, 1)) {
&gt; 
&gt; I don&apos;t follow this.
&gt; 
&gt; Say way have:
&gt;     @1 = @x + 1000;
&gt;     @2 = @1 + 10;
&gt; 
&gt; You add the relationship @1 &lt; 0 + max - 10 + 1.
&gt; 
&gt; Say that we

I&apos;m curious what you were thinking. :-)

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1274
&gt; &gt; +
&gt; 
&gt; 1274 lines! The original CSS JIT was small than that :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102142</commentid>
    <comment_count>15</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-06-15 20:04:03 -0700</bug_when>
    <thetext>I don&apos;t know why bugzilla cut that comment. The full question was:

Say way have:
    @1 = @x + 10;
    @2 = @1 + 1000;

You add the relationship
    @1 &lt; int_max - 1000 + 1.
And
    @x &lt; int_max - 1000 + 1 + 10;

Now the maxValue of @x is less than (int_max - 1000 + 1 + 10) and we could use that to change the ArithMode to Unchecked.

What am I missing?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102143</commentid>
    <comment_count>16</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-15 20:14:46 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; I don&apos;t know why bugzilla cut that comment. The full question was:
&gt; 
&gt; Say way have:
&gt;     @1 = @x + 10;
&gt;     @2 = @1 + 1000;
&gt; 
&gt; You add the relationship
&gt;     @1 &lt; int_max - 1000 + 1.
&gt; And
&gt;     @x &lt; int_max - 1000 + 1 + 10;
&gt; 
&gt; Now the maxValue of @x is less than (int_max - 1000 + 1 + 10) and we could
&gt; use that to change the ArithMode to Unchecked.
&gt; 
&gt; What am I missing?

Note that relationships are flow sensitive.  When we set a relationship, that relationship holds only *after* that node executes, and cannot be used to strength-reduce the node itself.

Now let me see if I follow.  When we see:

    @1 = @x + 10

Then we conclude that @x &lt; int_max - 10 + 1.  We also conclude that @1 &gt; int_min + 10 - 1.

This doesn&apos;t help us remove any checks from this though:

    @2 = @1 + 1000

Since @1 has no meaningful upper bound, yet.  But after this executes, we will know that @1 &lt; int_max - 1000 + 1 and @2 &gt; int_min + 1000 - 1.  Because of the other relationships, we will also have:

    @x + 10 &lt; int_max - 1000 + 1
    @x &lt; int_max - 1000 + 1 - 10
    @x &lt; int_max - 1010 + 1

Which means that if you later do:

    ArithAdd(@x, 1010)

Then we can remove the overflow check from that node.  But it does not mean that we can retroactively remove the checks from the previous nodes, since all of these relationships come into effect after the execution of those nodes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102160</commentid>
    <comment_count>17</comment_count>
      <attachid>254684</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-06-15 22:12:16 -0700</bug_when>
    <thetext>Comment on attachment 254684
the patch

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

Some more comments.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:331
&gt; +    // In some cases, it will do something conservative. It&apos;s always safe for this to return
&gt; +    // *this, or to return other. It&apos;ll do that sometimes, mainly to accelerate convergence for
&gt; +    // things that we don&apos;t think are important enough to slow down the analysis.

This is pretty clear, I think the null case makes things more complicated.

It would be good to justify every use of the null return. Otherwise anyone will be afraid to touch this code in the future because they won&apos;t know why some cases return null instead of *this.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:352
&gt; +        // Useful helper for flipping.

This comment does not help enough IMHO. It would be more helpful to say that you only implement check for LessThan and flip the relation when handling GreaterThan.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:384
&gt; +            //     @a != @b + C
&gt; +            //     @a  &lt; @b + D

Reading this patch for a while now, I really like those little examples. They help a lot.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:417
&gt; +            return Relationship();

I don&apos;t know if you have a rationale for this. I am thinking that keeping the LessThan would be valuable. In general I see code dealing mostly with positive numbers. Knowing an upper bound seems more useful on average.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:743
&gt; +                    Relationship relationship;

relationship -&gt; relationshipForTrueCase or something like that?

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:755
&gt; +                    } else {

This could be if (terminal-&gt;child1().useKind() == BooleanUse)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102169</commentid>
    <comment_count>18</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-06-15 22:58:00 -0700</bug_when>
    <thetext>&gt; Note that relationships are flow sensitive.  When we set a relationship,
&gt; that relationship holds only *after* that node executes, and cannot be used
&gt; to strength-reduce the node itself.
&gt; 
&gt; Now let me see if I follow.  When we see:
&gt; 
&gt;     @1 = @x + 10
&gt; 
&gt; Then we conclude that @x &lt; int_max - 10 + 1.  We also conclude that @1 &gt;
&gt; int_min + 10 - 1.
&gt; 
&gt; This doesn&apos;t help us remove any checks from this though:
&gt; 
&gt;     @2 = @1 + 1000
&gt; 
&gt; Since @1 has no meaningful upper bound, yet.  But after this executes, we
&gt; will know that @1 &lt; int_max - 1000 + 1 and @2 &gt; int_min + 1000 - 1.  Because
&gt; of the other relationships, we will also have:
&gt; 
&gt;     @x + 10 &lt; int_max - 1000 + 1
&gt;     @x &lt; int_max - 1000 + 1 - 10
&gt;     @x &lt; int_max - 1010 + 1
&gt; 
&gt; Which means that if you later do:
&gt; 
&gt;     ArithAdd(@x, 1010)
&gt; 
&gt; Then we can remove the overflow check from that node.  But it does not mean
&gt; that we can retroactively remove the checks from the previous nodes, since
&gt; all of these relationships come into effect after the execution of those
&gt; nodes.

Ok!

Somehow I thought the relationship on @x could end up in the relationship at head. Looking back how merging works, that makes a little more sense :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102306</commentid>
    <comment_count>19</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 12:15:07 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; Comment on attachment 254684 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=254684&amp;action=review
&gt; 
&gt; Some more comments.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:331
&gt; &gt; +    // In some cases, it will do something conservative. It&apos;s always safe for this to return
&gt; &gt; +    // *this, or to return other. It&apos;ll do that sometimes, mainly to accelerate convergence for
&gt; &gt; +    // things that we don&apos;t think are important enough to slow down the analysis.
&gt; 
&gt; This is pretty clear, I think the null case makes things more complicated.
&gt; 
&gt; It would be good to justify every use of the null return. Otherwise anyone
&gt; will be afraid to touch this code in the future because they won&apos;t know why
&gt; some cases return null instead of *this.

Null return means: please represent the intersection of the two relationships by explicitly keeping both relationships.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:352
&gt; &gt; +        // Useful helper for flipping.
&gt; 
&gt; This comment does not help enough IMHO. It would be more helpful to say that
&gt; you only implement check for LessThan and flip the relation when handling
&gt; GreaterThan.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:384
&gt; &gt; +            //     @a != @b + C
&gt; &gt; +            //     @a  &lt; @b + D
&gt; 
&gt; Reading this patch for a while now, I really like those little examples.
&gt; They help a lot.
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:417
&gt; &gt; +            return Relationship();
&gt; 
&gt; I don&apos;t know if you have a rationale for this. I am thinking that keeping
&gt; the LessThan would be valuable. In general I see code dealing mostly with
&gt; positive numbers. Knowing an upper bound seems more useful on average.

That&apos;s what this is doing.  Returning null means that we keep both relationships.  This is how we get things like 0 &lt;= @x &lt; array.length.  If we returned *this or if we returned *other, we&apos;d only get 0 &lt;= @x or @x &lt; array.length but not both.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:743
&gt; &gt; +                    Relationship relationship;
&gt; 
&gt; relationship -&gt; relationshipForTrueCase or something like that?

Good idea!

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:755
&gt; &gt; +                    } else {
&gt; 
&gt; This could be if (terminal-&gt;child1().useKind() == BooleanUse)

It could be, but it doesn&apos;t have to be.  We could have a FixupPhase decide that a Branch has an UntypedUse edge, but by later transformations (like some CFG simplification or whatever), the Branch&apos;s child ends up just being a CompareEq or the like.

Point is, if we know that the child of the Branch is one of the Compare&apos;s, then we don&apos;t need to look at the use kind.  If the use kind is either BooleanUse or UntypedUse, then the code does exactly what it should do. If the use kind was anything else, then this will always OSR exit, in which case we can propagate whatever we like to the successors (and so in that case, this code is correct as well).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102320</commentid>
    <comment_count>20</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 13:22:34 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (In reply to comment #13)
&gt; &gt; Comment on attachment 254684 [details]
&gt; &gt; the patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=254684&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:155
&gt; &gt; &gt; +        if (m_offset == std::numeric_limits&lt;int&gt;::min())
&gt; &gt; &gt; +            return Relationship();
&gt; &gt; 
&gt; &gt; It would be good to have a test covering this case.
&gt; 
&gt; Good idea!

I can&apos;t easily come up with what this test would look like.  I might try to come back to this later.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:309
&gt; &gt; &gt; +        // Make sure that if we have a LessThan, then it&apos;s first.
&gt; &gt; &gt; +        if (b.m_kind == LessThan)
&gt; &gt; &gt; +            std::swap(a, b);
&gt; &gt; &gt; +        
&gt; &gt; &gt; +        // Make sure that if we have a NotEqual, then it&apos;s first.
&gt; &gt; &gt; +        if (b.m_kind == NotEqual)
&gt; &gt; &gt; +            std::swap(a, b);
&gt; &gt; 
&gt; &gt; I would move those to mergeImpl() and remove the comments.
&gt; 
&gt; I don&apos;t think so - we cannot swap *this and other in mergeImpl(). :-)
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:332
&gt; &gt; &gt; +    Relationship filter(const Relationship&amp; other) const
&gt; &gt; 
&gt; &gt; TODO: review this.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:341
&gt; &gt; &gt; +        // this to assume that we different offsets anytime that everything but the offset is
&gt; &gt; 
&gt; &gt; &quot;assume that we different offsets anytime&quot;
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:436
&gt; &gt; &gt; +        int minRightValue;
&gt; &gt; &gt; +        if (m_right-&gt;isInt32Constant())
&gt; &gt; &gt; +            minRightValue = m_right-&gt;asInt32();
&gt; &gt; &gt; +        else
&gt; &gt; &gt; +            minRightValue = std::numeric_limits&lt;int&gt;::min();
&gt; &gt; 
&gt; &gt; Maybe simpler like this?
&gt; &gt; 
&gt; &gt; int minRightValue = std::numeric_limits&lt;int&gt;::min();
&gt; &gt; if (m_right-&gt;isInt32Constant())
&gt; &gt;     minRightValue = m_right-&gt;asInt32();
&gt; 
&gt; That works, too.

Fixed.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:440
&gt; &gt; &gt; +        return clampedSum(minRightValue, m_offset);
&gt; &gt; 
&gt; &gt; I am not following this case.
&gt; &gt; 
&gt; &gt; If we are here, we have (kind == Equal or kind == NotEqual).
&gt; &gt; Why is the mind value of NotEqual @b + Constant?
&gt; 
&gt; Ooops.  That&apos;s a bug.
&gt; 
&gt; I added NotEqual after writing this code.  The case for LessThan, above,
&gt; which returns std::numeric_limits&lt;int&gt;::min() should also do the same for
&gt; NotEqual.

Fixed.  And I added a test.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:455
&gt; &gt; &gt; +        int maxRightValue;
&gt; &gt; &gt; +        if (m_right-&gt;isInt32Constant())
&gt; &gt; &gt; +            maxRightValue = m_right-&gt;asInt32();
&gt; &gt; &gt; +        else
&gt; &gt; &gt; +            maxRightValue = std::numeric_limits&lt;int&gt;::max();
&gt; &gt; 
&gt; &gt; &quot;Simpler&quot; version here too.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:459
&gt; &gt; &gt; +        return clampedSum(maxRightValue, m_offset);
&gt; &gt; 
&gt; &gt; Same question about NotEqual
&gt; 
&gt; Ditto, bug.

Ditto, fixed.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:495
&gt; &gt; &gt; +        ASSERT(sameNodesAs(other));
&gt; &gt; 
&gt; &gt; An other precondition is that neither node has the relation &quot;GreaterThan&quot;.
&gt; 
&gt; True!  I should add that assert.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:520
&gt; &gt; &gt; +        // this to assume that we different offsets anytime that everything but the offset is
&gt; &gt; 
&gt; &gt; &quot;that we different offsets&quot;
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:531
&gt; &gt; &gt; +                    // Saying that you might be B when you&apos;ve already said that you&apos;re anything
&gt; &gt; &gt; +                    // but A, where A and B are different, is a tautology. You could just say
&gt; &gt; &gt; +                    // that you&apos;re anything but A.
&gt; &gt; 
&gt; &gt; Maybe just write an example as this is a pretty obvious case?
&gt; &gt;    // Adding &quot;(a == b + 1)&quot; to &quot;(a != b + 5)&quot; has no value.
&gt; 
&gt; OK.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:548
&gt; &gt; &gt; +            // If we have C &gt; D, then we could keep both claims, but we are cheap, so we
&gt; &gt; &gt; +            // don&apos;t. We just use the NotEqual.
&gt; &gt; 
&gt; &gt; Wouldn&apos;t it be easier to implement it instead of justifying not having it? :)
&gt; 
&gt; By &quot;cheap&quot; I mean that we are trying to accelerate convergence.  Any time
&gt; that we create more relationships, we create more things to merge, and
&gt; possibly increase the number of fixpoint iterations.
&gt; 
&gt; Not implementing something we don&apos;t think is valuable is kind of a
&gt; convergence hack - fewer relationships means less time spent processing
&gt; relationships.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:611
&gt; &gt; &gt; +            std::max(m_offset, other.m_offset) + 1);
&gt; &gt; 
&gt; &gt; Not a fan of the implicit overflow here but it&apos;s harmless.
&gt; &gt; 
&gt; &gt; It would be good to have tests for those cases though.
&gt; 
&gt; Interesting. I didn&apos;t want this overflow. I&apos;ll guard this with
&gt; sumOverflows() or something.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:645
&gt; &gt; &gt; +        // Before we do anything, make sure that we have a zero constant at the top.
&gt; &gt; 
&gt; &gt; I would also say why in addition to what.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:939
&gt; &gt; &gt; +            if (!node-&gt;child2()-&gt;isInt32Constant())
&gt; &gt; 
&gt; &gt; No love for (constant + @value)?
&gt; 
&gt; See DFGStrenghtReductionPhase.cpp.  It canonicalizes constant+@value to
&gt; @value+constant.
&gt; 
&gt; This is also why we don&apos;t handle @value-constant.  It would have been
&gt; canonicalized to @value+(-constant).
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:987
&gt; &gt; &gt; +                if (!sumOverflows&lt;int&gt;(std::numeric_limits&lt;int&gt;::max(), -offset, 1)) {
&gt; &gt; 
&gt; &gt; I don&apos;t follow this.
&gt; &gt; 
&gt; &gt; Say way have:
&gt; &gt;     @1 = @x + 1000;
&gt; &gt;     @2 = @1 + 10;
&gt; &gt; 
&gt; &gt; You add the relationship @1 &lt; 0 + max - 10 + 1.
&gt; &gt; 
&gt; &gt; Say that we
&gt; 
&gt; I&apos;m curious what you were thinking. :-)
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1274
&gt; &gt; &gt; +
&gt; &gt; 
&gt; &gt; 1274 lines! The original CSS JIT was small than that :)

Still need to address these other comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102327</commentid>
    <comment_count>21</comment_count>
      <attachid>254964</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 13:28:55 -0700</bug_when>
    <thetext>Created attachment 254964
the patch

Patch which addresses some of the feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102329</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-06-16 13:30:42 -0700</bug_when>
    <thetext>Attachment 254964 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:313:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:864:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:864:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1139:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1188:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 5 in 22 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>1102343</commentid>
    <comment_count>23</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 14:16:53 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (In reply to comment #14)
&gt; &gt; (In reply to comment #13)
&gt; &gt; &gt; Comment on attachment 254684 [details]
&gt; &gt; &gt; the patch
&gt; &gt; &gt; 
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=254684&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:155
&gt; &gt; &gt; &gt; +        if (m_offset == std::numeric_limits&lt;int&gt;::min())
&gt; &gt; &gt; &gt; +            return Relationship();
&gt; &gt; &gt; 
&gt; &gt; &gt; It would be good to have a test covering this case.
&gt; &gt; 
&gt; &gt; Good idea!
&gt; 
&gt; I can&apos;t easily come up with what this test would look like.  I might try to
&gt; come back to this later.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:309
&gt; &gt; &gt; &gt; +        // Make sure that if we have a LessThan, then it&apos;s first.
&gt; &gt; &gt; &gt; +        if (b.m_kind == LessThan)
&gt; &gt; &gt; &gt; +            std::swap(a, b);
&gt; &gt; &gt; &gt; +        
&gt; &gt; &gt; &gt; +        // Make sure that if we have a NotEqual, then it&apos;s first.
&gt; &gt; &gt; &gt; +        if (b.m_kind == NotEqual)
&gt; &gt; &gt; &gt; +            std::swap(a, b);
&gt; &gt; &gt; 
&gt; &gt; &gt; I would move those to mergeImpl() and remove the comments.
&gt; &gt; 
&gt; &gt; I don&apos;t think so - we cannot swap *this and other in mergeImpl(). :-)
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:332
&gt; &gt; &gt; &gt; +    Relationship filter(const Relationship&amp; other) const
&gt; &gt; &gt; 
&gt; &gt; &gt; TODO: review this.
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:341
&gt; &gt; &gt; &gt; +        // this to assume that we different offsets anytime that everything but the offset is
&gt; &gt; &gt; 
&gt; &gt; &gt; &quot;assume that we different offsets anytime&quot;
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:436
&gt; &gt; &gt; &gt; +        int minRightValue;
&gt; &gt; &gt; &gt; +        if (m_right-&gt;isInt32Constant())
&gt; &gt; &gt; &gt; +            minRightValue = m_right-&gt;asInt32();
&gt; &gt; &gt; &gt; +        else
&gt; &gt; &gt; &gt; +            minRightValue = std::numeric_limits&lt;int&gt;::min();
&gt; &gt; &gt; 
&gt; &gt; &gt; Maybe simpler like this?
&gt; &gt; &gt; 
&gt; &gt; &gt; int minRightValue = std::numeric_limits&lt;int&gt;::min();
&gt; &gt; &gt; if (m_right-&gt;isInt32Constant())
&gt; &gt; &gt;     minRightValue = m_right-&gt;asInt32();
&gt; &gt; 
&gt; &gt; That works, too.
&gt; 
&gt; Fixed.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:440
&gt; &gt; &gt; &gt; +        return clampedSum(minRightValue, m_offset);
&gt; &gt; &gt; 
&gt; &gt; &gt; I am not following this case.
&gt; &gt; &gt; 
&gt; &gt; &gt; If we are here, we have (kind == Equal or kind == NotEqual).
&gt; &gt; &gt; Why is the mind value of NotEqual @b + Constant?
&gt; &gt; 
&gt; &gt; Ooops.  That&apos;s a bug.
&gt; &gt; 
&gt; &gt; I added NotEqual after writing this code.  The case for LessThan, above,
&gt; &gt; which returns std::numeric_limits&lt;int&gt;::min() should also do the same for
&gt; &gt; NotEqual.
&gt; 
&gt; Fixed.  And I added a test.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:455
&gt; &gt; &gt; &gt; +        int maxRightValue;
&gt; &gt; &gt; &gt; +        if (m_right-&gt;isInt32Constant())
&gt; &gt; &gt; &gt; +            maxRightValue = m_right-&gt;asInt32();
&gt; &gt; &gt; &gt; +        else
&gt; &gt; &gt; &gt; +            maxRightValue = std::numeric_limits&lt;int&gt;::max();
&gt; &gt; &gt; 
&gt; &gt; &gt; &quot;Simpler&quot; version here too.
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:459
&gt; &gt; &gt; &gt; +        return clampedSum(maxRightValue, m_offset);
&gt; &gt; &gt; 
&gt; &gt; &gt; Same question about NotEqual
&gt; &gt; 
&gt; &gt; Ditto, bug.
&gt; 
&gt; Ditto, fixed.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:495
&gt; &gt; &gt; &gt; +        ASSERT(sameNodesAs(other));
&gt; &gt; &gt; 
&gt; &gt; &gt; An other precondition is that neither node has the relation &quot;GreaterThan&quot;.
&gt; &gt; 
&gt; &gt; True!  I should add that assert.
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:520
&gt; &gt; &gt; &gt; +        // this to assume that we different offsets anytime that everything but the offset is
&gt; &gt; &gt; 
&gt; &gt; &gt; &quot;that we different offsets&quot;
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:531
&gt; &gt; &gt; &gt; +                    // Saying that you might be B when you&apos;ve already said that you&apos;re anything
&gt; &gt; &gt; &gt; +                    // but A, where A and B are different, is a tautology. You could just say
&gt; &gt; &gt; &gt; +                    // that you&apos;re anything but A.
&gt; &gt; &gt; 
&gt; &gt; &gt; Maybe just write an example as this is a pretty obvious case?
&gt; &gt; &gt;    // Adding &quot;(a == b + 1)&quot; to &quot;(a != b + 5)&quot; has no value.
&gt; &gt; 
&gt; &gt; OK.
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:548
&gt; &gt; &gt; &gt; +            // If we have C &gt; D, then we could keep both claims, but we are cheap, so we
&gt; &gt; &gt; &gt; +            // don&apos;t. We just use the NotEqual.
&gt; &gt; &gt; 
&gt; &gt; &gt; Wouldn&apos;t it be easier to implement it instead of justifying not having it? :)
&gt; &gt; 
&gt; &gt; By &quot;cheap&quot; I mean that we are trying to accelerate convergence.  Any time
&gt; &gt; that we create more relationships, we create more things to merge, and
&gt; &gt; possibly increase the number of fixpoint iterations.
&gt; &gt; 
&gt; &gt; Not implementing something we don&apos;t think is valuable is kind of a
&gt; &gt; convergence hack - fewer relationships means less time spent processing
&gt; &gt; relationships.
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:611
&gt; &gt; &gt; &gt; +            std::max(m_offset, other.m_offset) + 1);
&gt; &gt; &gt; 
&gt; &gt; &gt; Not a fan of the implicit overflow here but it&apos;s harmless.
&gt; &gt; &gt; 
&gt; &gt; &gt; It would be good to have tests for those cases though.
&gt; &gt; 
&gt; &gt; Interesting. I didn&apos;t want this overflow. I&apos;ll guard this with
&gt; &gt; sumOverflows() or something.

Fixed.

&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:645
&gt; &gt; &gt; &gt; +        // Before we do anything, make sure that we have a zero constant at the top.
&gt; &gt; &gt; 
&gt; &gt; &gt; I would also say why in addition to what.
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:939
&gt; &gt; &gt; &gt; +            if (!node-&gt;child2()-&gt;isInt32Constant())
&gt; &gt; &gt; 
&gt; &gt; &gt; No love for (constant + @value)?
&gt; &gt; 
&gt; &gt; See DFGStrenghtReductionPhase.cpp.  It canonicalizes constant+@value to
&gt; &gt; @value+constant.
&gt; &gt; 
&gt; &gt; This is also why we don&apos;t handle @value-constant.  It would have been
&gt; &gt; canonicalized to @value+(-constant).
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:987
&gt; &gt; &gt; &gt; +                if (!sumOverflows&lt;int&gt;(std::numeric_limits&lt;int&gt;::max(), -offset, 1)) {
&gt; &gt; &gt; 
&gt; &gt; &gt; I don&apos;t follow this.
&gt; &gt; &gt; 
&gt; &gt; &gt; Say way have:
&gt; &gt; &gt;     @1 = @x + 1000;
&gt; &gt; &gt;     @2 = @1 + 10;
&gt; &gt; &gt; 
&gt; &gt; &gt; You add the relationship @1 &lt; 0 + max - 10 + 1.
&gt; &gt; &gt; 
&gt; &gt; &gt; Say that we
&gt; &gt; 
&gt; &gt; I&apos;m curious what you were thinking. :-)
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1274
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; 
&gt; &gt; &gt; 1274 lines! The original CSS JIT was small than that :)
&gt; 
&gt; Still need to address these other comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102344</commentid>
    <comment_count>24</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 14:18:52 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; (In reply to comment #17)
&gt; &gt; Comment on attachment 254684 [details]
&gt; &gt; the patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=254684&amp;action=review
&gt; &gt; 
&gt; &gt; Some more comments.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:331
&gt; &gt; &gt; +    // In some cases, it will do something conservative. It&apos;s always safe for this to return
&gt; &gt; &gt; +    // *this, or to return other. It&apos;ll do that sometimes, mainly to accelerate convergence for
&gt; &gt; &gt; +    // things that we don&apos;t think are important enough to slow down the analysis.
&gt; &gt; 
&gt; &gt; This is pretty clear, I think the null case makes things more complicated.
&gt; &gt; 
&gt; &gt; It would be good to justify every use of the null return. Otherwise anyone
&gt; &gt; will be afraid to touch this code in the future because they won&apos;t know why
&gt; &gt; some cases return null instead of *this.
&gt; 
&gt; Null return means: please represent the intersection of the two
&gt; relationships by explicitly keeping both relationships.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:352
&gt; &gt; &gt; +        // Useful helper for flipping.
&gt; &gt; 
&gt; &gt; This comment does not help enough IMHO. It would be more helpful to say that
&gt; &gt; you only implement check for LessThan and flip the relation when handling
&gt; &gt; GreaterThan.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:384
&gt; &gt; &gt; +            //     @a != @b + C
&gt; &gt; &gt; +            //     @a  &lt; @b + D
&gt; &gt; 
&gt; &gt; Reading this patch for a while now, I really like those little examples.
&gt; &gt; They help a lot.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:417
&gt; &gt; &gt; +            return Relationship();
&gt; &gt; 
&gt; &gt; I don&apos;t know if you have a rationale for this. I am thinking that keeping
&gt; &gt; the LessThan would be valuable. In general I see code dealing mostly with
&gt; &gt; positive numbers. Knowing an upper bound seems more useful on average.
&gt; 
&gt; That&apos;s what this is doing.  Returning null means that we keep both
&gt; relationships.  This is how we get things like 0 &lt;= @x &lt; array.length.  If
&gt; we returned *this or if we returned *other, we&apos;d only get 0 &lt;= @x or @x &lt;
&gt; array.length but not both.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:743
&gt; &gt; &gt; +                    Relationship relationship;
&gt; &gt; 
&gt; &gt; relationship -&gt; relationshipForTrueCase or something like that?
&gt; 
&gt; Good idea!

Fixed.  I used &quot;relationshipForTrue&quot; since it&apos;s shorter and just as meaningful.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:755
&gt; &gt; &gt; +                    } else {
&gt; &gt; 
&gt; &gt; This could be if (terminal-&gt;child1().useKind() == BooleanUse)
&gt; 
&gt; It could be, but it doesn&apos;t have to be.  We could have a FixupPhase decide
&gt; that a Branch has an UntypedUse edge, but by later transformations (like
&gt; some CFG simplification or whatever), the Branch&apos;s child ends up just being
&gt; a CompareEq or the like.
&gt; 
&gt; Point is, if we know that the child of the Branch is one of the Compare&apos;s,
&gt; then we don&apos;t need to look at the use kind.  If the use kind is either
&gt; BooleanUse or UntypedUse, then the code does exactly what it should do. If
&gt; the use kind was anything else, then this will always OSR exit, in which
&gt; case we can propagate whatever we like to the successors (and so in that
&gt; case, this code is correct as well).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102377</commentid>
    <comment_count>25</comment_count>
      <attachid>254964</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-06-16 16:12:10 -0700</bug_when>
    <thetext>Comment on attachment 254964
the patch

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

&gt; Source/JavaScriptCore/ChangeLog:35
&gt; +        * tests/stress/add-overflows-after-not-equal.js: Added.
&gt; +        * tests/stress/sub-overflows-after-not-equal.js: Added.

IMHO, it would be worth adding stress tests to check anything you can come up with.

It&apos;s not exactly a simple patch and we&apos;ll have very little time to discover any unforeseen side effect.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:714
&gt; +        bool changed = true;
&gt; +        while (changed) {

I think it would be good to explain the convergency trick on &lt; and &gt; with 1, 0, -1 that you explained in your office. Otherwise it seems a bit mysterious that this does not run forever.

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1137
&gt; +        if (m_seenBlocks.add(target)) {

What is inside the if() is pretty self contained. If it is possible to move it to a function, that may make the code more readable.

Maybe:
    filterLiveRelationships(relationshipMap, target, [] (Node* node, const Vector&lt;Relationship&gt;&amp; liveRelationships)
?

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1170
&gt; +        // are using RPO.

RPO -&gt; reverse post-order traversal. I am not good at remembering acronyms :)

&gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1181
&gt; +            Vector&lt;Relationship&gt; values;

values-&gt;mergedRelationships or something like that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102379</commentid>
    <comment_count>26</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 16:20:31 -0700</bug_when>
    <thetext>(In reply to comment #25)
&gt; Comment on attachment 254964 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=254964&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/ChangeLog:35
&gt; &gt; +        * tests/stress/add-overflows-after-not-equal.js: Added.
&gt; &gt; +        * tests/stress/sub-overflows-after-not-equal.js: Added.
&gt; 
&gt; IMHO, it would be worth adding stress tests to check anything you can come
&gt; up with.
&gt; 
&gt; It&apos;s not exactly a simple patch and we&apos;ll have very little time to discover
&gt; any unforeseen side effect.

Agreed.  I&apos;ll try to come up with more tests.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:714
&gt; &gt; +        bool changed = true;
&gt; &gt; +        while (changed) {
&gt; 
&gt; I think it would be good to explain the convergency trick on &lt; and &gt; with 1,
&gt; 0, -1 that you explained in your office. Otherwise it seems a bit mysterious
&gt; that this does not run forever.

OK.  I will try to say something about this.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1137
&gt; &gt; +        if (m_seenBlocks.add(target)) {
&gt; 
&gt; What is inside the if() is pretty self contained. If it is possible to move
&gt; it to a function, that may make the code more readable.
&gt; 
&gt; Maybe:
&gt;     filterLiveRelationships(relationshipMap, target, [] (Node* node, const
&gt; Vector&lt;Relationship&gt;&amp; liveRelationships)
&gt; ?

I&apos;ll try that.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1170
&gt; &gt; +        // are using RPO.
&gt; 
&gt; RPO -&gt; reverse post-order traversal. I am not good at remembering acronyms :)

OK!

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1181
&gt; &gt; +            Vector&lt;Relationship&gt; values;
&gt; 
&gt; values-&gt;mergedRelationships or something like that?

OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102426</commentid>
    <comment_count>27</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 18:21:55 -0700</bug_when>
    <thetext>Latest perf data.


Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on dethklok (MacBookPro9,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/secondary/OpenSource/WebKitBuild/Release/jsc (r185618)
&quot;ABC&quot; at /Volumes/Data/pizlo/tertiary/OpenSource/WebKitBuild/Release/jsc (r185618)

Collected 6 samples per benchmark/VM, with 6 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level
timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.

                                                        TipOfTree                    ABC                                        
SunSpider:
   3d-cube                                            5.1960+-0.1585     ?      5.2406+-0.2075        ?
   3d-morph                                           5.9571+-0.2759            5.9016+-0.1508        
   3d-raytrace                                        6.6202+-0.2594     ?      6.7535+-0.2991        ? might be 1.0201x slower
   access-binary-trees                                2.4146+-0.1719     ?      2.5492+-0.2759        ? might be 1.0558x slower
   access-fannkuch                                    6.5947+-0.9682            6.3028+-0.3708          might be 1.0463x faster
   access-nbody                                       3.2017+-0.2743            2.9415+-0.0694          might be 1.0884x faster
   access-nsieve                                      3.1820+-0.1015     ?      3.3265+-0.1480        ? might be 1.0454x slower
   bitops-3bit-bits-in-byte                           1.7332+-0.1737            1.6407+-0.0325          might be 1.0563x faster
   bitops-bits-in-byte                                4.0867+-0.3842            3.9713+-0.3355          might be 1.0291x faster
   bitops-bitwise-and                                 2.2540+-0.0988     ?      2.2602+-0.1528        ?
   bitops-nsieve-bits                                 3.3277+-0.1836            3.2922+-0.0401          might be 1.0108x faster
   controlflow-recursive                              3.0985+-0.1947            3.0236+-0.2647          might be 1.0248x faster
   crypto-aes                                         4.7303+-0.1611     ?      4.8579+-0.5297        ? might be 1.0270x slower
   crypto-md5                                         2.7583+-0.0762            2.7141+-0.0592          might be 1.0163x faster
   crypto-sha1                                        3.9282+-0.5834            3.7892+-0.3000          might be 1.0367x faster
   date-format-tofte                                  9.5456+-0.2658            9.3586+-0.2512          might be 1.0200x faster
   date-format-xparb                                  5.7915+-0.1684     ?      6.0771+-0.5477        ? might be 1.0493x slower
   math-cordic                                        3.2695+-0.4314            3.2180+-0.3593          might be 1.0160x faster
   math-partial-sums                                  5.7795+-0.7379            5.6410+-0.6846          might be 1.0246x faster
   math-spectral-norm                                 2.0442+-0.0407            2.0131+-0.0191          might be 1.0154x faster
   regexp-dna                                         7.7138+-0.6036            7.5404+-0.2039          might be 1.0230x faster
   string-base64                                      5.1719+-0.2584            5.0114+-0.1968          might be 1.0320x faster
   string-fasta                                       6.9038+-0.1431     ?      7.1592+-0.5351        ? might be 1.0370x slower
   string-tagcloud                                    9.4673+-0.2651     ?      9.8449+-0.5560        ? might be 1.0399x slower
   string-unpack-code                                21.0815+-0.9895     ?     21.9985+-1.2319        ? might be 1.0435x slower
   string-validate-input                              6.1742+-0.1756            6.0006+-0.1562          might be 1.0289x faster

   &lt;arithmetic&gt;                                       5.4625+-0.0463     ?      5.4780+-0.0994        ? might be 1.0028x slower

                                                        TipOfTree                    ABC                                        
LongSpider:
   3d-cube                                          890.6830+-38.7655    !   1140.6213+-39.8872       ! definitely 1.2806x slower
   3d-morph                                        1529.4299+-5.5338         1528.6065+-4.7346        
   3d-raytrace                                      700.0050+-5.5140     ?    705.2288+-22.6030       ?
   access-binary-trees                             1012.2520+-9.0308     ?   1015.2680+-8.4333        ?
   access-fannkuch                                  342.5678+-9.8797          341.9983+-7.5917        
   access-nbody                                     622.6018+-58.3607         588.4920+-0.8545          might be 1.0580x faster
   access-nsieve                                    478.9797+-7.0967          474.3830+-6.4629        
   bitops-3bit-bits-in-byte                          44.4413+-0.7706     ?     44.4815+-0.8591        ?
   bitops-bits-in-byte                               99.3187+-0.8950           98.9467+-1.4040        
   bitops-nsieve-bits                               427.7233+-19.9629         419.5245+-2.4038          might be 1.0195x faster
   controlflow-recursive                            494.6224+-11.3762    ^    471.3984+-9.7109        ^ definitely 1.0493x faster
   crypto-aes                                       723.7477+-37.0114         685.7591+-23.5605         might be 1.0554x faster
   crypto-md5                                       524.3218+-6.3999     ?    530.9508+-20.2085       ? might be 1.0126x slower
   crypto-sha1                                      713.1667+-29.8680    ^    660.7652+-14.5036       ^ definitely 1.0793x faster
   date-format-tofte                                756.8373+-9.7671     ^    710.7300+-5.3521        ^ definitely 1.0649x faster
   date-format-xparb                                781.8886+-39.3341    ?    815.0981+-22.3160       ? might be 1.0425x slower
   hash-map                                         184.3162+-4.6735          182.2640+-2.4651          might be 1.0113x faster
   math-cordic                                      577.1937+-3.6865     ?    582.1088+-16.0278       ?
   math-partial-sums                                514.1036+-13.0745         510.2251+-5.0995        
   math-spectral-norm                               566.6598+-5.3762     ?    571.9282+-5.3573        ?
   string-base64                                    415.4056+-14.1096         411.6092+-3.7756        
   string-fasta                                     437.4764+-4.0240     ?    438.6787+-3.1826        ?
   string-tagcloud                                  194.3930+-2.1499     ?    199.0745+-5.0888        ? might be 1.0241x slower

   &lt;geometric&gt;                                      458.2025+-3.3464     ?    458.2367+-1.7082        ? might be 1.0001x slower

                                                        TipOfTree                    ABC                                        
V8Spider:
   crypto                                            58.4829+-1.3024           57.0349+-2.3922          might be 1.0254x faster
   deltablue                                        104.2959+-3.7325     ?    113.0036+-32.3463       ? might be 1.0835x slower
   earley-boyer                                      48.5331+-1.9081     ?     49.9815+-2.8647        ? might be 1.0298x slower
   raytrace                                          41.8403+-0.9828     ?     43.2250+-3.3068        ? might be 1.0331x slower
   regexp                                            84.2419+-23.0458          74.9963+-1.1924          might be 1.1233x faster
   richards                                          81.7282+-2.6755           81.1254+-3.3964        
   splay                                             39.6808+-1.6475     ?     40.8530+-2.0333        ? might be 1.0295x slower

   &lt;geometric&gt;                                       61.4565+-2.2759     ?     61.6048+-2.1715        ? might be 1.0024x slower

                                                        TipOfTree                    ABC                                        
Octane:
   encrypt                                           0.20318+-0.00076          0.20124+-0.00870       
   decrypt                                           3.76633+-0.39142    ^     3.28584+-0.01509       ^ definitely 1.1462x faster
   deltablue                                x2       0.19597+-0.00155    ^     0.18933+-0.00223       ^ definitely 1.0351x faster
   earley                                            0.39422+-0.00179          0.39336+-0.00445       
   boyer                                             5.23743+-0.23507    ?     5.25768+-0.17408       ?
   navier-stokes                            x2       5.23417+-0.15376          5.12778+-0.01154         might be 1.0207x faster
   raytrace                                 x2       1.31490+-0.05422          1.29543+-0.04545         might be 1.0150x faster
   richards                                 x2       0.12803+-0.00158    ?     0.13015+-0.00317       ? might be 1.0165x slower
   splay                                    x2       0.39624+-0.00310    ?     0.39799+-0.00518       ?
   regexp                                   x2      29.78264+-0.31076         29.40092+-0.17937         might be 1.0130x faster
   pdfjs                                    x2      42.51933+-0.31240    ?    42.90453+-0.44607       ?
   mandreel                                 x2      51.21850+-0.50385    ?    54.23294+-9.25712       ? might be 1.0589x slower
   gbemu                                    x2      44.73400+-2.52451    ?    46.22316+-5.01127       ? might be 1.0333x slower
   closure                                           0.56506+-0.00232          0.56390+-0.00189       
   jquery                                            7.36495+-0.03864          7.34849+-0.05585       
   box2d                                    x2      11.89721+-0.03822    ?    12.01815+-0.31557       ? might be 1.0102x slower
   zlib                                     x2     398.51021+-2.74132        396.72526+-3.30054       
   typescript                               x2     825.53719+-16.44883       820.23372+-15.29671      

   &lt;geometric&gt;                                       6.60432+-0.04585          6.58325+-0.10602         might be 1.0032x faster

                                                        TipOfTree                    ABC                                        
Kraken:
   ai-astar                                          240.346+-7.598            233.631+-5.403           might be 1.0287x faster
   audio-beat-detection                               85.089+-7.178             83.334+-1.936           might be 1.0211x faster
   audio-dft                                         120.484+-2.807      ?     127.918+-13.981        ? might be 1.0617x slower
   audio-fft                                          70.741+-2.293      ?      71.485+-1.953         ? might be 1.0105x slower
   audio-oscillator                                   77.358+-1.535      ?      78.441+-2.207         ? might be 1.0140x slower
   imaging-darkroom                                  106.393+-3.655            105.664+-2.095         
   imaging-desaturate                                 64.450+-2.115             62.253+-2.412           might be 1.0353x faster
   imaging-gaussian-blur                             117.106+-5.205      ^     108.681+-1.639         ^ definitely 1.0775x faster
   json-parse-financial                               47.716+-1.949      ?      47.970+-1.737         ?
   json-stringify-tinderbox                           33.215+-9.437             31.445+-2.748           might be 1.0563x faster
   stanford-crypto-aes                                59.770+-1.400             58.646+-0.550           might be 1.0192x faster
   stanford-crypto-ccm                                48.867+-0.594      ?      49.508+-1.428         ? might be 1.0131x slower
   stanford-crypto-pbkdf2                            113.197+-2.883      ^     109.559+-0.480         ^ definitely 1.0332x faster
   stanford-crypto-sha256-iterative                   45.042+-2.097             43.202+-1.455           might be 1.0426x faster

   &lt;arithmetic&gt;                                       87.841+-0.595             86.553+-1.054           might be 1.0149x faster

                                                        TipOfTree                    ABC                                        
JSRegress:
   abc-forward-loop-equal                            73.6025+-0.9687     ^     47.9151+-1.3648        ^ definitely 1.5361x faster
   abc-postfix-backward-loop                         73.9181+-2.1473     ^     48.4234+-2.0258        ^ definitely 1.5265x faster
   abc-simple-backward-loop                          73.5877+-2.1058     ^     46.6553+-0.4208        ^ definitely 1.5773x faster
   abc-simple-forward-loop                           73.1920+-0.9242     ^     48.1729+-1.6541        ^ definitely 1.5194x faster
   abs-boolean                                        2.7342+-0.0805     ?      2.7607+-0.1672        ?
   adapt-to-double-divide                            16.6711+-0.2743     ?     16.9772+-0.4318        ? might be 1.0184x slower
   aliased-arguments-getbyval                         1.3217+-0.0406     ?      1.3372+-0.0852        ? might be 1.0117x slower
   allocate-big-object                                2.8967+-0.0636     ?      3.0623+-0.2078        ? might be 1.0572x slower
   arguments-named-and-reflective                    12.4870+-0.3296     ?     12.6454+-0.6824        ? might be 1.0127x slower
   arguments-out-of-bounds                           14.6392+-0.1548     ?     15.6589+-1.6785        ? might be 1.0697x slower
   arguments-strict-mode                             12.2167+-3.1572           11.3076+-1.2321          might be 1.0804x faster
   arguments                                         10.5094+-2.2274            9.9008+-0.8508          might be 1.0615x faster
   arity-mismatch-inlining                            0.9648+-0.1631            0.8715+-0.0195          might be 1.1071x faster
   array-access-polymorphic-structure                 7.3603+-0.9702            6.9139+-0.1238          might be 1.0646x faster
   array-nonarray-polymorhpic-access                 33.0238+-1.3201           32.1090+-0.9613          might be 1.0285x faster
   array-prototype-every                             88.2775+-3.0355           87.9590+-2.3232        
   array-prototype-forEach                           85.1885+-2.5273     ?     86.4713+-2.3871        ? might be 1.0151x slower
   array-prototype-map                               93.3508+-1.7576           92.7841+-4.1128        
   array-prototype-reduce                            87.7057+-5.3469           83.1573+-1.9805          might be 1.0547x faster
   array-prototype-reduceRight                       86.9582+-2.7088           82.9364+-1.6607          might be 1.0485x faster
   array-prototype-some                              87.3272+-2.8074           86.4393+-3.6196          might be 1.0103x faster
   array-splice-contiguous                           43.0173+-1.8810     ?     43.0222+-1.8602        ?
   array-with-double-add                              4.2592+-0.0470            4.2292+-0.0847        
   array-with-double-increment                        3.4484+-0.3510            3.3625+-0.1289          might be 1.0255x faster
   array-with-double-mul-add                          5.3029+-0.1488            5.2023+-0.0937          might be 1.0193x faster
   array-with-double-sum                              3.3862+-0.0677     ?      3.4049+-0.2426        ?
   array-with-int32-add-sub                           6.8784+-0.1067            6.8080+-0.0358          might be 1.0103x faster
   array-with-int32-or-double-sum                     3.3977+-0.0422     ?      3.5017+-0.2115        ? might be 1.0306x slower
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     39.8325+-2.3809           37.1976+-1.5283          might be 1.0708x faster
   ArrayBuffer-DataView-alloc-long-lived             14.6883+-0.5103     ?     15.5661+-1.5088        ? might be 1.0598x slower
   ArrayBuffer-Int32Array-byteOffset                  3.9935+-0.3258            3.8632+-0.1678          might be 1.0337x faster
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     39.0132+-3.3441           38.9919+-0.9911        
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     23.8928+-3.4078           22.8375+-1.4626          might be 1.0462x faster
   ArrayBuffer-Int8Array-alloc-long-lived            14.8730+-1.7634           14.5287+-1.8609          might be 1.0237x faster
   ArrayBuffer-Int8Array-alloc                       12.5103+-2.5156           10.4500+-0.2727          might be 1.1971x faster
   asmjs_bool_bug                                     7.9433+-0.2817            7.8689+-0.2275        
   assign-custom-setter-polymorphic                   3.3749+-0.4290            3.3092+-0.3704          might be 1.0198x faster
   assign-custom-setter                               4.6082+-0.3362            4.3802+-0.0676          might be 1.0520x faster
   basic-set                                          9.6806+-0.5041            9.5392+-0.1386          might be 1.0148x faster
   big-int-mul                                        4.1491+-0.1607            4.0790+-0.0424          might be 1.0172x faster
   boolean-test                                       3.2988+-0.3005            3.2381+-0.1153          might be 1.0187x faster
   branch-fold                                        4.3620+-0.4053     ?      4.5640+-0.6007        ? might be 1.0463x slower
   branch-on-string-as-boolean                       21.5431+-2.4735           20.7898+-1.5859          might be 1.0362x faster
   by-val-generic                                     9.0096+-0.5990            8.5437+-0.2453          might be 1.0545x faster
   call-spread-apply                                 30.7021+-2.1442           29.5722+-0.6297          might be 1.0382x faster
   call-spread-call                                  25.4045+-0.5153     ?     26.6822+-1.3813        ? might be 1.0503x slower
   captured-assignments                               0.5625+-0.0419            0.5573+-0.0709        
   cast-int-to-double                                 5.5354+-0.2060            5.3190+-0.1547          might be 1.0407x faster
   cell-argument                                      9.3733+-0.9406            8.7155+-0.3000          might be 1.0755x faster
   cfg-simplify                                       3.3274+-0.8132            2.9451+-0.1031          might be 1.1298x faster
   chain-getter-access                                9.8833+-1.2247            9.6292+-0.4128          might be 1.0264x faster
   cmpeq-obj-to-obj-other                            12.6815+-1.0205     ?     12.7437+-0.8447        ?
   constant-test                                      5.0924+-0.1910     ?      5.1292+-0.1775        ?
   create-lots-of-functions                          11.7617+-0.3572     ?     11.8509+-0.3374        ?
   cse-new-array-buffer                               2.5133+-0.0367     ?      2.6012+-0.1673        ? might be 1.0350x slower
   cse-new-array                                      2.6385+-0.0383     ?      2.7156+-0.1008        ? might be 1.0292x slower
   DataView-custom-properties                        42.7686+-2.8926     ?     43.5024+-2.6081        ? might be 1.0172x slower
   deconstructing-parameters-overridden-by-function   
                                                      0.6158+-0.0697            0.5905+-0.0368          might be 1.0428x faster
   delay-tear-off-arguments-strictmode               14.7164+-0.6468           14.0817+-0.2377          might be 1.0451x faster
   deltablue-varargs                                210.6804+-1.0489     ?    214.3517+-3.9082        ? might be 1.0174x slower
   destructuring-arguments                           17.5636+-0.4453           17.4349+-0.5357        
   destructuring-swap                                 5.1857+-0.1475            5.1167+-0.0710          might be 1.0135x faster
   direct-arguments-getbyval                          1.3606+-0.0956     ?      1.4508+-0.1937        ? might be 1.0662x slower
   div-boolean-double                                 5.4179+-0.3406            5.3109+-0.1377          might be 1.0202x faster
   div-boolean                                        7.8466+-0.0374            7.8442+-0.0523        
   double-get-by-val-out-of-bounds                    4.7781+-0.1063            4.6592+-0.1185          might be 1.0255x faster
   double-pollution-getbyval                          9.0463+-0.2135            8.9827+-0.1291        
   double-pollution-putbyoffset                       4.5760+-0.5044            4.3854+-0.0692          might be 1.0435x faster
   double-real-use                                   29.9740+-0.8371     ?     30.1638+-0.8119        ?
   double-to-int32-typed-array-no-inline              2.5520+-0.1843            2.5119+-0.2927          might be 1.0160x faster
   double-to-int32-typed-array                        2.1267+-0.1972     ?      2.1704+-0.1837        ? might be 1.0205x slower
   double-to-uint32-typed-array-no-inline             2.8360+-0.3013            2.7209+-0.3332          might be 1.0423x faster
   double-to-uint32-typed-array                       2.0821+-0.1314     ?      2.2505+-0.3216        ? might be 1.0809x slower
   elidable-new-object-dag                           43.6725+-0.9335     ?     45.4315+-2.7797        ? might be 1.0403x slower
   elidable-new-object-roflcopter                    44.4695+-1.4983           44.4169+-1.0016        
   elidable-new-object-then-call                     41.1300+-2.4055           39.5589+-0.6322          might be 1.0397x faster
   elidable-new-object-tree                          45.4648+-1.3264           45.4292+-1.0665        
   empty-string-plus-int                              5.7161+-0.1171            5.5635+-0.1710          might be 1.0274x faster
   emscripten-cube2hash                              38.7563+-1.6686     ?     38.9558+-1.2127        ?
   exit-length-on-plain-object                       14.8441+-1.6145     ?     16.0308+-2.7271        ? might be 1.0799x slower
   external-arguments-getbyval                        1.3586+-0.1526            1.2852+-0.0952          might be 1.0571x faster
   external-arguments-putbyval                        2.6578+-0.2187            2.5067+-0.2570          might be 1.0603x faster
   fixed-typed-array-storage-var-index                1.2992+-0.1467            1.2492+-0.0631          might be 1.0400x faster
   fixed-typed-array-storage                          0.9058+-0.0413     ?      0.9875+-0.1856        ? might be 1.0902x slower
   Float32Array-matrix-mult                           4.9937+-0.3738            4.9020+-0.5973          might be 1.0187x faster
   Float32Array-to-Float64Array-set                  57.9413+-3.1456     ^     52.4293+-1.9126        ^ definitely 1.1051x faster
   Float64Array-alloc-long-lived                     87.2984+-2.0573     ?     87.9021+-2.2689        ?
   Float64Array-to-Int16Array-set                    72.3487+-1.1167           70.5978+-1.4554          might be 1.0248x faster
   fold-double-to-int                                13.7404+-0.3264     ?     13.8574+-0.5717        ?
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     10.8985+-0.5474     ?     11.2330+-1.7562        ? might be 1.0307x slower
   fold-get-by-id-to-multi-get-by-offset              9.9895+-1.5700     ?     10.4126+-0.6623        ? might be 1.0424x slower
   fold-multi-get-by-offset-to-get-by-offset   
                                                      9.3152+-0.9816     ?      9.3357+-0.7551        ?
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                      9.2593+-0.8379     ?      9.4773+-0.6496        ? might be 1.0235x slower
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                     10.1844+-1.2198     ?     10.4349+-0.7655        ? might be 1.0246x slower
   fold-multi-put-by-offset-to-put-by-offset   
                                                      8.3315+-0.7275            8.0023+-0.4197          might be 1.0411x faster
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                      9.8145+-0.4245     ?     10.8479+-0.9448        ? might be 1.1053x slower
   fold-put-by-id-to-multi-put-by-offset              9.6420+-0.8663     ?     10.3847+-0.8002        ? might be 1.0770x slower
   fold-put-structure                                 7.5278+-1.3544            7.1348+-1.2024          might be 1.0551x faster
   for-of-iterate-array-entries                       4.7769+-0.3310     ?      4.7933+-0.2735        ?
   for-of-iterate-array-keys                          3.9648+-0.2261            3.8217+-0.0824          might be 1.0375x faster
   for-of-iterate-array-values                        3.6891+-0.0659     ?      3.8044+-0.0678        ? might be 1.0313x slower
   fround                                            21.7183+-1.5143           21.1999+-0.6045          might be 1.0245x faster
   ftl-library-inlining-dataview                     67.8471+-5.4248           66.2961+-3.1446          might be 1.0234x faster
   ftl-library-inlining                              76.8132+-15.6186          76.2906+-18.2989       
   function-dot-apply                                 2.3559+-0.2435     ?      2.4719+-0.3391        ? might be 1.0492x slower
   function-test                                      3.0770+-0.1929            3.0055+-0.0296          might be 1.0238x faster
   function-with-eval                               104.0791+-4.7794     ?    105.6725+-4.5839        ? might be 1.0153x slower
   gcse-poly-get-less-obvious                        18.7931+-0.8232           18.5475+-0.8243          might be 1.0132x faster
   gcse-poly-get                                     20.6963+-1.9458           19.8279+-0.9306          might be 1.0438x faster
   gcse                                               4.4638+-0.2140            4.4188+-0.2069          might be 1.0102x faster
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      2.8201+-0.1125     ?      2.9106+-0.1834        ? might be 1.0321x slower
   get-by-id-bimorphic-check-structure-elimination   
                                                      6.2723+-0.5162            6.0590+-0.1227          might be 1.0352x faster
   get-by-id-chain-from-try-block                     7.4889+-1.6102            6.9049+-0.2186          might be 1.0846x faster
   get-by-id-check-structure-elimination              5.1661+-0.1016     ?      5.4313+-0.5828        ? might be 1.0513x slower
   get-by-id-proto-or-self                           19.1172+-1.4398           18.6596+-1.7199          might be 1.0245x faster
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      3.0314+-0.0872     ?      3.0980+-0.2665        ? might be 1.0220x slower
   get-by-id-self-or-proto                           19.2998+-1.8863           18.7932+-0.8972          might be 1.0270x faster
   get-by-val-out-of-bounds                           4.5103+-0.1200            4.4760+-0.0484        
   get_callee_monomorphic                             3.2875+-0.7785            3.0190+-0.3264          might be 1.0889x faster
   get_callee_polymorphic                             3.7642+-0.0717     ?      4.1169+-0.5540        ? might be 1.0937x slower
   getter-no-activation                               5.0647+-0.2828            5.0073+-0.1746          might be 1.0115x faster
   getter-prototype                                  15.0355+-0.3293     ?     15.1189+-0.2121        ?
   getter-richards                                  123.0798+-4.1630     ?    123.6789+-3.4508        ?
   getter                                             6.0339+-0.7983     ?      6.3255+-0.7907        ? might be 1.0483x slower
   global-var-const-infer-fire-from-opt               0.9434+-0.0488     ?      0.9860+-0.1335        ? might be 1.0452x slower
   global-var-const-infer                             0.9741+-0.1541            0.8835+-0.1054          might be 1.1025x faster
   HashMap-put-get-iterate-keys                      30.2976+-2.4252     ?     30.5833+-1.8594        ?
   HashMap-put-get-iterate                           32.3424+-0.9235           32.2024+-1.1524        
   HashMap-string-put-get-iterate                    31.9597+-1.4072     ?     33.0144+-0.6667        ? might be 1.0330x slower
   hoist-make-rope                                   12.8953+-1.4380           12.6736+-0.8385          might be 1.0175x faster
   hoist-poly-check-structure-effectful-loop   
                                                      5.3238+-0.2068            5.2369+-0.2091          might be 1.0166x faster
   hoist-poly-check-structure                         3.8741+-0.2311            3.7651+-0.1186          might be 1.0290x faster
   imul-double-only                                   8.6515+-1.2234     ?      8.9180+-0.1768        ? might be 1.0308x slower
   imul-int-only                                      9.8797+-0.1847     ?     10.1685+-0.6209        ? might be 1.0292x slower
   imul-mixed                                         8.3288+-0.1564     ?      8.8255+-0.9465        ? might be 1.0596x slower
   in-four-cases                                     23.0736+-0.4894     ?     23.4517+-0.8238        ? might be 1.0164x slower
   in-one-case-false                                 11.0955+-0.0862     ?     11.2256+-0.2210        ? might be 1.0117x slower
   in-one-case-true                                  11.0851+-0.1177     ?     11.4117+-0.2756        ? might be 1.0295x slower
   in-two-cases                                      11.4632+-0.3421     ?     11.6889+-0.4664        ? might be 1.0197x slower
   indexed-properties-in-objects                      3.3645+-0.6451            3.0977+-0.3648          might be 1.0862x faster
   infer-closure-const-then-mov-no-inline             4.1952+-0.3983     ?      4.3245+-0.6095        ? might be 1.0308x slower
   infer-closure-const-then-mov                      20.1927+-0.6457           19.8562+-0.4493          might be 1.0169x faster
   infer-closure-const-then-put-to-scope-no-inline   
                                                     13.1636+-0.9691           12.7080+-0.1427          might be 1.0358x faster
   infer-closure-const-then-put-to-scope             21.7340+-0.8355     ?     23.4668+-2.0150        ? might be 1.0797x slower
   infer-closure-const-then-reenter-no-inline   
                                                     54.5461+-1.4107     ?     55.6296+-2.4980        ? might be 1.0199x slower
   infer-closure-const-then-reenter                  22.7887+-1.4661     ?     23.3534+-1.4303        ? might be 1.0248x slower
   infer-constant-global-property                     3.6449+-0.1310     ?      3.7842+-0.2367        ? might be 1.0382x slower
   infer-constant-property                            2.8054+-0.1015     ?      2.8993+-0.3746        ? might be 1.0334x slower
   infer-one-time-closure-ten-vars                   13.2291+-1.0406           12.8459+-0.9171          might be 1.0298x faster
   infer-one-time-closure-two-vars                   12.0669+-0.3393     ?     12.7440+-1.3240        ? might be 1.0561x slower
   infer-one-time-closure                            12.3604+-0.4168     ?     12.8422+-1.2639        ? might be 1.0390x slower
   infer-one-time-deep-closure                       21.7063+-1.2946           21.2054+-1.0019          might be 1.0236x faster
   inline-arguments-access                            5.0096+-0.6776            4.6694+-0.0627          might be 1.0729x faster
   inline-arguments-aliased-access                    4.8414+-0.3526            4.6692+-0.0552          might be 1.0369x faster
   inline-arguments-local-escape                      4.7723+-0.1471            4.7703+-0.2429        
   inline-get-scoped-var                              4.9910+-0.2773     ?      5.1343+-0.3683        ? might be 1.0287x slower
   inlined-put-by-id-transition                      11.8484+-0.4379           11.8181+-0.4799        
   int-or-other-abs-then-get-by-val                   5.0133+-0.0716     ?      5.0515+-0.1304        ?
   int-or-other-abs-zero-then-get-by-val             17.7474+-0.9941           17.6337+-0.4970        
   int-or-other-add-then-get-by-val                   4.4097+-0.0787     ?      4.5315+-0.4379        ? might be 1.0276x slower
   int-or-other-add                                   5.5052+-0.1663            5.4724+-0.1995        
   int-or-other-div-then-get-by-val                   4.2903+-0.0318     ?      4.3975+-0.1859        ? might be 1.0250x slower
   int-or-other-max-then-get-by-val                   4.4191+-0.1271            4.3694+-0.0881          might be 1.0114x faster
   int-or-other-min-then-get-by-val                   4.3749+-0.0757            4.3540+-0.0438        
   int-or-other-mod-then-get-by-val                   3.9631+-0.0826     ?      4.0028+-0.1254        ? might be 1.0100x slower
   int-or-other-mul-then-get-by-val                   3.9622+-0.0516     ?      4.0303+-0.1900        ? might be 1.0172x slower
   int-or-other-neg-then-get-by-val                   4.8656+-0.0848            4.7885+-0.0298          might be 1.0161x faster
   int-or-other-neg-zero-then-get-by-val             18.2415+-0.6753     ?     18.6864+-0.9009        ? might be 1.0244x slower
   int-or-other-sub-then-get-by-val                   4.4045+-0.0417            4.3991+-0.0763        
   int-or-other-sub                                   3.9119+-0.4209            3.6916+-0.0864          might be 1.0597x faster
   int-overflow-local                                 4.7029+-0.1972            4.6429+-0.2282          might be 1.0129x faster
   Int16Array-alloc-long-lived                       53.6401+-2.0327           52.9918+-1.8406          might be 1.0122x faster
   Int16Array-bubble-sort-with-byteLength            20.3352+-0.7253           20.3263+-0.7909        
   Int16Array-bubble-sort                            20.9904+-1.4695           20.7103+-0.6193          might be 1.0135x faster
   Int16Array-load-int-mul                            1.6446+-0.1973            1.5525+-0.0459          might be 1.0593x faster
   Int16Array-to-Int32Array-set                      58.0521+-1.4255     ^     54.5826+-1.9112        ^ definitely 1.0636x faster
   Int32Array-alloc-large                            23.5260+-0.6622     ?     24.3186+-1.6381        ? might be 1.0337x slower
   Int32Array-alloc-long-lived                       63.9761+-1.0218     ?     64.6050+-0.6842        ?
   Int32Array-alloc                                   3.5107+-0.2775            3.4315+-0.0521          might be 1.0231x faster
   Int32Array-Int8Array-view-alloc                    6.8626+-0.2167     ?      7.8508+-2.2408        ? might be 1.1440x slower
   int52-spill                                        5.8182+-0.1166            5.7662+-0.1564        
   Int8Array-alloc-long-lived                        48.7320+-1.9451     ?     49.5735+-0.3191        ? might be 1.0173x slower
   Int8Array-load-with-byteLength                     3.4141+-0.0547     ?      3.6268+-0.4459        ? might be 1.0623x slower
   Int8Array-load                                     3.9264+-0.4856            3.5484+-0.4019          might be 1.1065x faster
   integer-divide                                    10.9251+-0.0779     ?     10.9679+-0.1299        ?
   integer-modulo                                     2.3058+-0.2905            2.1050+-0.0724          might be 1.0954x faster
   is-boolean-fold-tricky                             4.5074+-0.1120     ?      4.6405+-0.5217        ? might be 1.0295x slower
   is-boolean-fold                                    2.8925+-0.0421            2.8910+-0.0561        
   is-function-fold-tricky-internal-function   
                                                     12.1363+-0.4721           11.7588+-0.1012          might be 1.0321x faster
   is-function-fold-tricky                            4.7861+-0.4313            4.5869+-0.0944          might be 1.0434x faster
   is-function-fold                                   2.9915+-0.0814            2.9571+-0.0672          might be 1.0117x faster
   is-number-fold-tricky                              4.7229+-0.5645            4.5131+-0.0727          might be 1.0465x faster
   is-number-fold                                     2.9056+-0.0579     ?      2.9970+-0.2070        ? might be 1.0315x slower
   is-object-or-null-fold-functions                   3.0999+-0.1690            3.0916+-0.3601        
   is-object-or-null-fold-less-tricky                 4.7891+-0.3103            4.5990+-0.1067          might be 1.0413x faster
   is-object-or-null-fold-tricky                      6.7646+-0.1303            6.6744+-0.0926          might be 1.0135x faster
   is-object-or-null-fold                             2.9364+-0.0615     ?      3.0175+-0.1886        ? might be 1.0276x slower
   is-object-or-null-trickier-function                4.8338+-0.1815     ?      4.9655+-0.6109        ? might be 1.0272x slower
   is-object-or-null-trickier-internal-function   
                                                     12.4110+-0.1194           12.3937+-0.0733        
   is-object-or-null-tricky-function                  4.6174+-0.0874     ?      4.7801+-0.2581        ? might be 1.0352x slower
   is-object-or-null-tricky-internal-function   
                                                      9.3198+-0.0877            9.3159+-0.1132        
   is-string-fold-tricky                              4.5444+-0.1354     ?      4.8885+-0.4509        ? might be 1.0757x slower
   is-string-fold                                     2.9506+-0.1473     ?      2.9712+-0.2620        ?
   is-undefined-fold-tricky                           3.7465+-0.0399     ?      3.8036+-0.0601        ? might be 1.0152x slower
   is-undefined-fold                                  3.0174+-0.2315            2.9947+-0.2924        
   large-int-captured                                 4.9521+-0.0880            4.8966+-0.1299          might be 1.0113x faster
   large-int-neg                                     16.5185+-1.0041           16.2873+-0.4356          might be 1.0142x faster
   large-int                                         14.7549+-0.4576     ?     14.9762+-0.4066        ? might be 1.0150x slower
   load-varargs-elimination                          22.8980+-0.3078     ?     23.7988+-1.3655        ? might be 1.0393x slower
   logical-not-weird-types                            3.3936+-0.0237     ?      3.5672+-0.3781        ? might be 1.0511x slower
   logical-not                                        4.6740+-0.0198     ?      4.8042+-0.1560        ? might be 1.0279x slower
   lots-of-fields                                    12.7179+-0.7427           12.1534+-0.1420          might be 1.0464x faster
   make-indexed-storage                               3.3097+-0.1025            3.3097+-0.1983        
   make-rope-cse                                     13.0005+-1.3301           12.2858+-1.5559          might be 1.0582x faster
   marsaglia-larger-ints                             36.6676+-0.7556     ?     37.4895+-1.4773        ? might be 1.0224x slower
   marsaglia-osr-entry                               23.2181+-0.9723     ?     24.0225+-1.5444        ? might be 1.0346x slower
   math-with-out-of-bounds-array-values              25.4114+-1.1494     ?     25.4931+-1.5525        ?
   max-boolean                                        2.6758+-0.3145            2.5130+-0.0293          might be 1.0648x faster
   method-on-number                                  17.9859+-0.6444     ?     19.0315+-0.9539        ? might be 1.0581x slower
   min-boolean                                        2.5653+-0.0980     ?      2.7703+-0.3775        ? might be 1.0799x slower
   minus-boolean-double                               3.3456+-0.2797            3.2171+-0.0653          might be 1.0400x faster
   minus-boolean                                      2.5597+-0.2769            2.5028+-0.2855          might be 1.0227x faster
   misc-strict-eq                                    41.0668+-5.8039           38.0527+-0.5467          might be 1.0792x faster
   mod-boolean-double                                11.1704+-0.4619           10.9989+-0.1570          might be 1.0156x faster
   mod-boolean                                        7.8923+-0.0331     ?      8.0937+-0.2766        ? might be 1.0255x slower
   mul-boolean-double                                 3.8723+-0.3476            3.8647+-0.1807        
   mul-boolean                                        3.0049+-0.2775            2.9480+-0.0426          might be 1.0193x faster
   neg-boolean                                        3.2545+-0.0784     ?      3.2915+-0.1734        ? might be 1.0114x slower
   negative-zero-divide                               0.4167+-0.0416            0.3849+-0.0135          might be 1.0827x faster
   negative-zero-modulo                               0.4042+-0.0351     ?      0.4453+-0.0424        ? might be 1.1017x slower
   negative-zero-negate                               0.3867+-0.0353     ?      0.4021+-0.0526        ? might be 1.0400x slower
   nested-function-parsing                           39.7114+-1.2322     ?     39.9244+-1.2405        ?
   new-array-buffer-dead                            113.3550+-2.4389          113.0735+-1.6879        
   new-array-buffer-push                              7.2833+-0.6878     ?      7.3370+-0.6384        ?
   new-array-dead                                    20.0577+-0.9805           19.9032+-1.1354        
   new-array-push                                     6.5542+-0.1692     ?      6.6046+-0.2462        ?
   no-inline-constructor                             42.3860+-0.9909           41.7125+-0.9925          might be 1.0161x faster
   number-test                                        3.2441+-0.2985     ?      3.2539+-0.2733        ?
   object-closure-call                                5.6760+-0.0625     ?      6.0106+-0.6846        ? might be 1.0589x slower
   object-test                                        2.9878+-0.1964            2.9071+-0.0602          might be 1.0278x faster
   obvious-sink-pathology-taken                     142.5278+-2.0688     ?    142.9125+-2.8109        ?
   obvious-sink-pathology                           132.3582+-2.6706     ?    133.4755+-2.3593        ?
   obviously-elidable-new-object                     37.1518+-3.2908           34.6395+-0.4698          might be 1.0725x faster
   plus-boolean-arith                                 2.7072+-0.3261            2.6479+-0.1647          might be 1.0224x faster
   plus-boolean-double                                3.2952+-0.1373            3.2795+-0.1074        
   plus-boolean                                       2.4724+-0.1083            2.4576+-0.0756        
   poly-chain-access-different-prototypes-simple   
                                                      3.3319+-0.0563     ?      3.4477+-0.3690        ? might be 1.0348x slower
   poly-chain-access-different-prototypes             2.7330+-0.3133            2.6183+-0.0246          might be 1.0438x faster
   poly-chain-access-simpler                          3.4047+-0.1360            3.3668+-0.0699          might be 1.0113x faster
   poly-chain-access                                  2.6913+-0.1050     ?      2.7463+-0.3154        ? might be 1.0204x slower
   poly-stricteq                                     64.4800+-2.1431           62.3552+-0.6170          might be 1.0341x faster
   polymorphic-array-call                             1.3929+-0.0355     ?      1.4465+-0.1111        ? might be 1.0384x slower
   polymorphic-get-by-id                              3.2911+-0.1556     ?      3.3894+-0.2967        ? might be 1.0299x slower
   polymorphic-put-by-id                             32.7212+-3.7259           30.7568+-1.8773          might be 1.0639x faster
   polymorphic-structure                             15.8531+-1.3805           15.5669+-1.0791          might be 1.0184x faster
   polyvariant-monomorphic-get-by-id                  8.5969+-0.1151     ?      8.9930+-0.5324        ? might be 1.0461x slower
   proto-getter-access                                9.3920+-0.1773     ?      9.3931+-0.1185        ?
   put-by-id-replace-and-transition                   9.9880+-0.6587            9.7309+-0.2145          might be 1.0264x faster
   put-by-id-slightly-polymorphic                     2.8557+-0.0333            2.8434+-0.0184        
   put-by-id                                         12.8522+-0.2451     ?     12.9682+-0.4048        ?
   put-by-val-direct                                  0.4438+-0.0602     ?      0.4496+-0.1124        ? might be 1.0131x slower
   put-by-val-large-index-blank-indexing-type   
                                                     12.4135+-1.1070     ?     12.5429+-1.4810        ? might be 1.0104x slower
   put-by-val-machine-int                             2.9025+-0.0877            2.8631+-0.0589          might be 1.0138x faster
   rare-osr-exit-on-local                            15.3892+-0.8918           15.0562+-0.3774          might be 1.0221x faster
   register-pressure-from-osr                        22.2969+-1.1054           21.8652+-1.0931          might be 1.0197x faster
   repeat-multi-get-by-offset                        24.9307+-0.7400           24.6195+-0.1725          might be 1.0126x faster
   setter-prototype                                  10.5666+-0.2624           10.5648+-0.2953        
   setter                                             5.7303+-0.7680     ?      6.3505+-0.8466        ? might be 1.1082x slower
   simple-activation-demo                            25.6131+-0.7623           25.4016+-0.6236        
   simple-getter-access                              11.9830+-0.3254           11.7417+-0.2313          might be 1.0205x faster
   simple-poly-call-nested                            8.4688+-0.9278     ?      8.5124+-0.3311        ?
   simple-poly-call                                   1.3260+-0.0258     ?      1.3269+-0.0467        ?
   sin-boolean                                       23.0092+-1.1912     ?     23.3223+-1.0133        ? might be 1.0136x slower
   singleton-scope                                   62.3020+-0.9558           61.7810+-0.6363        
   sink-function                                     12.4285+-0.9190           12.1387+-0.2871          might be 1.0239x faster
   sink-huge-activation                              20.3552+-1.7253           19.6976+-0.8876          might be 1.0334x faster
   sinkable-new-object-dag                           71.7255+-2.7672           69.8969+-1.8405          might be 1.0262x faster
   sinkable-new-object-taken                         51.2249+-3.3976           50.6859+-2.7825          might be 1.0106x faster
   sinkable-new-object                               39.5233+-1.0839     ?     41.2115+-3.6710        ? might be 1.0427x slower
   slow-array-profile-convergence                     3.0177+-0.0971     ?      3.0555+-0.3643        ? might be 1.0125x slower
   slow-convergence                                   2.9187+-0.3555     ?      2.9672+-0.4235        ? might be 1.0166x slower
   slow-ternaries                                    21.6601+-3.6756           21.1895+-2.5571          might be 1.0222x faster
   sorting-benchmark                                 18.8253+-0.5517     ?     19.2882+-0.5913        ? might be 1.0246x slower
   sparse-conditional                                 1.1679+-0.0204     ?      1.2270+-0.0708        ? might be 1.0506x slower
   splice-to-remove                                  15.6229+-0.9510     ?     15.8502+-1.3496        ? might be 1.0145x slower
   string-char-code-at                               18.4179+-0.1285     ^     16.5096+-0.5827        ^ definitely 1.1156x faster
   string-concat-object                               2.7349+-0.2900     ?      2.7576+-0.2231        ?
   string-concat-pair-object                          2.6905+-0.2391     ?      2.6996+-0.1957        ?
   string-concat-pair-simple                         11.7960+-0.4949     ?     12.2258+-1.2118        ? might be 1.0364x slower
   string-concat-simple                              12.4346+-0.9646           12.4208+-1.1704        
   string-cons-repeat                                 8.3590+-0.9899            8.1318+-0.4683          might be 1.0279x faster
   string-cons-tower                                  8.5588+-0.4869            8.2474+-0.3040          might be 1.0378x faster
   string-equality                                   17.8814+-0.1920     ?     18.0708+-0.5400        ? might be 1.0106x slower
   string-get-by-val-big-char                         7.3714+-0.1336            7.2603+-0.0488          might be 1.0153x faster
   string-get-by-val-out-of-bounds-insane             3.6827+-0.1736            3.6766+-0.2041        
   string-get-by-val-out-of-bounds                    5.4482+-0.1264            5.4121+-0.0963        
   string-get-by-val                                  3.4799+-0.0630            3.4478+-0.0187        
   string-hash                                        2.5581+-0.6408            2.2007+-0.1078          might be 1.1624x faster
   string-long-ident-equality                        14.9967+-0.1613     ?     15.3324+-1.1821        ? might be 1.0224x slower
   string-out-of-bounds                              15.0730+-0.3874     ?     15.2620+-0.8009        ? might be 1.0125x slower
   string-repeat-arith                               34.7466+-1.9024     ?     35.4045+-2.0187        ? might be 1.0189x slower
   string-sub                                        66.4457+-4.0555           63.6180+-2.0203          might be 1.0444x faster
   string-test                                        3.0701+-0.1464     ?      3.2814+-0.3691        ? might be 1.0688x slower
   string-var-equality                               35.6313+-1.2027           34.4493+-0.4713          might be 1.0343x faster
   structure-hoist-over-transitions                   2.7623+-0.1404     ?      2.8167+-0.2406        ? might be 1.0197x slower
   substring-concat-weird                            46.2624+-6.2329           42.7163+-1.6373          might be 1.0830x faster
   substring-concat                                  45.3662+-0.5974           45.3566+-1.0569        
   substring                                         49.1640+-1.3968     ?     49.7642+-1.4507        ? might be 1.0122x slower
   switch-char-constant                               2.8826+-0.1569     ?      2.9658+-0.2142        ? might be 1.0288x slower
   switch-char                                        6.7598+-0.7396     ?      6.9812+-1.4313        ? might be 1.0327x slower
   switch-constant                                    8.4552+-0.1886     ?      8.5765+-0.2114        ? might be 1.0143x slower
   switch-string-basic-big-var                       18.4473+-0.4643           18.2308+-0.2909          might be 1.0119x faster
   switch-string-basic-big                           15.2839+-0.1936           15.2373+-0.2888        
   switch-string-basic-var                           15.2655+-0.2335           15.2538+-0.3069        
   switch-string-basic                               14.3184+-0.6364           13.7689+-0.1303          might be 1.0399x faster
   switch-string-big-length-tower-var                20.7455+-1.1375           20.5647+-0.1682        
   switch-string-length-tower-var                    15.2953+-0.1701     ?     15.5288+-0.3204        ? might be 1.0153x slower
   switch-string-length-tower                        13.5295+-0.9517           13.1297+-0.1271          might be 1.0304x faster
   switch-string-short                               13.2319+-0.1601           13.1533+-0.1806        
   switch                                            12.8947+-0.5134           12.6213+-0.2242          might be 1.0217x faster
   tear-off-arguments-simple                          3.6190+-0.1177            3.5153+-0.0965          might be 1.0295x faster
   tear-off-arguments                                 4.8798+-0.1771     ?      5.1623+-0.8191        ? might be 1.0579x slower
   temporal-structure                                12.3849+-0.2125           12.3272+-0.2220        
   to-int32-boolean                                  14.3859+-0.9917           14.0723+-0.1481          might be 1.0223x faster
   try-catch-get-by-val-cloned-arguments             15.7135+-1.8378     ?     15.9762+-1.6367        ? might be 1.0167x slower
   try-catch-get-by-val-direct-arguments              6.9626+-0.5344     ?      7.5288+-0.9644        ? might be 1.0813x slower
   try-catch-get-by-val-scoped-arguments              7.6732+-0.1095     !      8.2320+-0.3856        ! definitely 1.0728x slower
   typed-array-get-set-by-val-profiling              33.4799+-0.9323           29.8670+-2.9144          might be 1.1210x faster
   undefined-property-access                        346.9084+-8.7213          343.0378+-2.8125          might be 1.0113x faster
   undefined-test                                     3.1431+-0.1237            3.0842+-0.0446          might be 1.0191x faster
   unprofiled-licm                                   22.6274+-0.4465     ?     22.8323+-0.5741        ?
   varargs-call                                      15.7485+-1.3552           15.4881+-0.7854          might be 1.0168x faster
   varargs-construct-inline                          28.4900+-0.6379           28.0432+-0.4427          might be 1.0159x faster
   varargs-construct                                 22.9314+-1.2072           22.8966+-0.5234        
   varargs-inline                                     9.3843+-0.0912     ?      9.5475+-0.2397        ? might be 1.0174x slower
   varargs-strict-mode                               10.6836+-1.2587           10.6563+-1.2309        
   varargs                                           10.3165+-0.4105           10.0305+-0.1037          might be 1.0285x faster
   weird-inlining-const-prop                          3.5450+-0.3155            3.4519+-0.2207          might be 1.0270x faster

   &lt;geometric&gt;                                        9.2278+-0.0315     ^      9.1484+-0.0324        ^ definitely 1.0087x faster

                                                        TipOfTree                    ABC                                        
AsmBench:
   bigfib.cpp                                       500.0259+-2.0519     ?    502.4072+-3.0858        ?
   cray.c                                           426.9934+-1.3342     !    432.4208+-2.4383        ! definitely 1.0127x slower
   dry.c                                            491.8765+-3.9801     ?    500.0514+-26.6401       ? might be 1.0166x slower
   FloatMM.c                                        721.0229+-1.4392     ?    722.8960+-2.2162        ?
   gcc-loops.cpp                                   4102.5776+-15.5565    ?   4159.7092+-180.4979      ? might be 1.0139x slower
   n-body.c                                         973.5851+-4.5731     ?    974.2305+-6.5683        ?
   Quicksort.c                                      424.0225+-5.5440     ?    428.2373+-13.3896       ?
   stepanov_container.cpp                          3614.4546+-14.0813        3603.5605+-30.5310       
   Towers.c                                         256.9250+-2.2223     ?    263.0252+-13.0089       ? might be 1.0237x slower

   &lt;geometric&gt;                                      789.4308+-1.2350     ?    796.3984+-11.2864       ? might be 1.0088x slower

                                                        TipOfTree                    ABC                                        
CompressionBench:
   huffman                                          373.7850+-3.0668     ^    349.3406+-2.3634        ^ definitely 1.0700x faster
   arithmetic-simple                                369.0642+-9.8230     ^    337.8705+-2.8123        ^ definitely 1.0923x faster
   arithmetic-precise                               285.2642+-2.9885     ^    276.2625+-2.5717        ^ definitely 1.0326x faster
   arithmetic-complex-precise                       286.0733+-3.3122     ^    273.4120+-2.9124        ^ definitely 1.0463x faster
   arithmetic-precise-order-0                       378.1238+-3.1771          353.2037+-22.9201         might be 1.0706x faster
   arithmetic-precise-order-1                       335.6805+-5.1630          331.3655+-4.5926          might be 1.0130x faster
   arithmetic-precise-order-2                       372.7848+-19.6185         371.1562+-3.8474        
   arithmetic-simple-order-1                        428.7566+-3.7687     ^    405.5364+-10.3436       ^ definitely 1.0573x faster
   arithmetic-simple-order-2                        484.8106+-23.7478    ^    444.6417+-5.7557        ^ definitely 1.0903x faster
   lz-string                                        317.0408+-3.7909     ?    325.8456+-6.6934        ? might be 1.0278x slower

   &lt;geometric&gt;                                      358.4650+-3.5872     ^    343.2589+-2.5697        ^ definitely 1.0443x faster

                                                        TipOfTree                    ABC                                        
Geomean of preferred means:
   &lt;scaled-result&gt;                                   62.5019+-0.1965           62.0662+-0.4398          might be 1.0070x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102438</commentid>
    <comment_count>28</comment_count>
      <attachid>254993</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 18:55:18 -0700</bug_when>
    <thetext>Created attachment 254993
getting ready for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102440</commentid>
    <comment_count>29</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-06-16 18:58:35 -0700</bug_when>
    <thetext>Attachment 254993 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:329:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:894:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:894:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1169:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1218:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 5 in 22 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>1102449</commentid>
    <comment_count>30</comment_count>
      <attachid>254995</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 19:42:49 -0700</bug_when>
    <thetext>Created attachment 254995
closer to landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102450</commentid>
    <comment_count>31</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-06-16 19:45:40 -0700</bug_when>
    <thetext>Attachment 254995 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:927:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:927:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1202:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 3 in 22 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>1102452</commentid>
    <comment_count>32</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 20:10:36 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; (In reply to comment #25)
&gt; &gt; Comment on attachment 254964 [details]
&gt; &gt; the patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=254964&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/ChangeLog:35
&gt; &gt; &gt; +        * tests/stress/add-overflows-after-not-equal.js: Added.
&gt; &gt; &gt; +        * tests/stress/sub-overflows-after-not-equal.js: Added.
&gt; &gt; 
&gt; &gt; IMHO, it would be worth adding stress tests to check anything you can come
&gt; &gt; up with.
&gt; &gt; 
&gt; &gt; It&apos;s not exactly a simple patch and we&apos;ll have very little time to discover
&gt; &gt; any unforeseen side effect.
&gt; 
&gt; Agreed.  I&apos;ll try to come up with more tests.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:714
&gt; &gt; &gt; +        bool changed = true;
&gt; &gt; &gt; +        while (changed) {
&gt; &gt; 
&gt; &gt; I think it would be good to explain the convergency trick on &lt; and &gt; with 1,
&gt; &gt; 0, -1 that you explained in your office. Otherwise it seems a bit mysterious
&gt; &gt; that this does not run forever.
&gt; 
&gt; OK.  I will try to say something about this.

The latest version simplifies this code and has a long discussion of convergence.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1137
&gt; &gt; &gt; +        if (m_seenBlocks.add(target)) {
&gt; &gt; 
&gt; &gt; What is inside the if() is pretty self contained. If it is possible to move
&gt; &gt; it to a function, that may make the code more readable.
&gt; &gt; 
&gt; &gt; Maybe:
&gt; &gt;     filterLiveRelationships(relationshipMap, target, [] (Node* node, const
&gt; &gt; Vector&lt;Relationship&gt;&amp; liveRelationships)
&gt; &gt; ?
&gt; 
&gt; I&apos;ll try that.

I don&apos;t think this is so necessary anymore, because that code no longer involves that ugly functor.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1170
&gt; &gt; &gt; +        // are using RPO.
&gt; &gt; 
&gt; &gt; RPO -&gt; reverse post-order traversal. I am not good at remembering acronyms :)
&gt; 
&gt; OK!
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/dfg/DFGIntegerRangeOptimizationPhase.cpp:1181
&gt; &gt; &gt; +            Vector&lt;Relationship&gt; values;
&gt; &gt; 
&gt; &gt; values-&gt;mergedRelationships or something like that?
&gt; 
&gt; OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102480</commentid>
    <comment_count>33</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-06-16 22:32:40 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/185640</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1102501</commentid>
    <comment_count>34</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-06-17 00:09:41 -0700</bug_when>
    <thetext>32-bit build fix in http://trac.webkit.org/changeset/185646
Also, why doesn&apos;t 64-bit JSC compile with -Wshorten-64-to-32 ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103603</commentid>
    <comment_count>35</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2015-06-20 01:13:54 -0700</bug_when>
    <thetext>Looks like this was 2% progresssion on Kraken according to our internal testing.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254531</attachid>
            <date>2015-06-08 18:02:56 -0700</date>
            <delta_ts>2015-06-08 20:18:21 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>14392</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJVCkK
KworI2luY2x1ZGUgIkRGR0dyYXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisj
aW5jbHVkZSAiREZHUGhhc2UuaCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25Q
aGFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRl
ICJKU0NJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFt
ZXNwYWNlIHsKKworc3RhdGljIGNvbnN0IGJvb2wgdmVyYm9zZSA9IGZhbHNlOworCitjbGFzcyBS
ZWxhdGlvbnNoaXAgeworcHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAgIExlc3NUaGFu
LAorICAgICAgICBFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4KKyAgICB9OworICAgIAorICAg
IHN0YXRpYyBLaW5kIGludmVyc2UoS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChr
aW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICByZXR1cm4gR3JlYXRl
clRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICByZXR1cm4gRXF1YWw7Cisg
ICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICByZXR1cm4gTGVzc1RoYW46Cisg
ICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
cmV0dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAgICAgIDog
bV9sZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxscHRyKQorICAgICAgICAsIG1f
a2luZChFcXVhbCksCisgICAgICAgICwgbV9vZmZzZXQoMCkKKyAgICB7CisgICAgfQorICAgIAor
ICAgIFJlbGF0aW9uc2hpcChOb2RlKiBsZWZ0LCBOb2RlKiByaWdodCwgS2luZCBraW5kLCBpbnQg
b2Zmc2V0ID0gMCkKKyAgICAgICAgOiBtX2xlZnQobGVmdCkKKyAgICAgICAgLCBtX3JpZ2h0KHJp
Z2h0KQorICAgICAgICAsIG1fa2luZChraW5kKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkK
KyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCk7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKG1fcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChtX2xlZnQgIT0gbV9yaWdo
dCk7CisgICAgfQorICAgIAorICAgIHR5cGVkZWYgdm9pZCogKFJlbGF0aW9uc2hpcDo6KlVuc3Bl
Y2lmaWVkQm9vbFR5cGUpOworCisgICAgb3BlcmF0b3IgVW5zcGVjaWZpZWRCb29sVHlwZSooKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbGVmdCA/IHJlaW50ZXJwcmV0X2Nhc3Q8VW5z
cGVjaWZpZWRCb29sVHlwZSo+KDEpIDogMDsKKyAgICB9CisgICAgCisgICAgTm9kZSogbGVmdCgp
IGNvbnN0IHsgcmV0dXJuIG1fbGVmdDsgfQorICAgIE5vZGUqIHJpZ2h0KCkgY29uc3QgeyByZXR1
cm4gbV9yaWdodDsgfQorICAgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZDsgfQor
ICAgIGludCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorICAgIAorICAgIFJl
bGF0aW9uc2hpcCBmbGlwcGVkKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBSZWxhdGlv
bnNoaXAobV9yaWdodCwgbV9sZWZ0LCBpbnZlcnNlKG1fa2luZCksIC1vZmZzZXQpOworICAgIH0K
KyAgICAKKyAgICBib29sIGlzQ2Fub25pY2FsKCkgeyByZXR1cm4gbV9sZWZ0IDwgbV9yaWdodDsg
fQorICAgIAorICAgIFJlbGF0aW9uc2hpcCBjYW5vbmljYWwoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgaWYgKGlzQ2Fub25pY2FsKCkpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
IHJldHVybiBmbGlwcGVkKCk7CisgICAgfQorICAgIAorICAgIGJvb2wgc2FtZU5vZGVzQXMoY29u
c3QgUmVsYXRpb25zaGlwJiBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xlZnQgPT0g
b3RoZXIubV9sZWZ0CisgICAgICAgICAgICAmJiBtX3JpZ2h0ID09IG90aGVyLm1fcmlnaHQ7Cisg
ICAgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVy
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNhbWVOb2Rlc0FzKG90aGVyKQorICAgICAgICAgICAg
JiYgbV9raW5kID09IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9vZmZzZXQgPT0gb3Ro
ZXIubV9vZmZzZXQ7CisgICAgfQorICAgIAorICAgIC8vIElmIHBvc3NpYmxlLCByZXR1cm5zIGEg
Zm9ybSBvZiB0aGlzIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUgZ2l2ZW4gbm9kZSBpcyB0aGUgbGVm
dAorICAgIC8vIHNpZGUuIFJldHVybnMgYSBudWxsIHJlbGF0aW9uc2hpcCBpZiB0aGlzIHJlbGF0
aW9uc2hpcCBjYW5ub3Qgc2F5IGFueXRoaW5nIGFib3V0IHRoaXMKKyAgICAvLyBub2RlLgorICAg
IFJlbGF0aW9uc2hpcCBmb3JOb2RlKE5vZGUqIG5vZGUpCisgICAgeworICAgICAgICBpZiAobV9s
ZWZ0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIGlmIChtX3Jp
Z2h0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gZmxpcHBlZCgpOworICAgICAgICByZXR1
cm4gUmVsYXRpb25zaGlwKCk7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCB3aXRoTGVm
dChOb2RlKiBsZWZ0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChsZWZ0LCBt
X3JpZ2h0LCBtX2tpbmQsIG1fb2Zmc2V0KTsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlw
IHdpdGhPZmZzZXQoaW50IG9mZnNldCkKKyAgICB7CisgICAgICAgIHJldHVybiBSZWxhdGlvbnNo
aXAobV9sZWZ0LCBtX3JpZ2h0LCBtX2tpbmQsIG1fb2Zmc2V0ICsgb2Zmc2V0KTsKKyAgICB9Cisg
ICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIG1lcmdlKGNvbnN0
IFJlbGF0aW9uc2hpcCYgb3RoZXIsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisgICAgeworICAg
ICAgICAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG1lcmdpbmcgcmVsYXRpb25zaGlwcyBv
dmVyIHRoZSBzYW1lIG5vZGVzLgorICAgICAgICBBU1NFUlQoc2FtZU5vZGVzQXMob3RoZXIpKTsK
KyAgICAgICAgCisgICAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGd1
YXJhbnRlZSB0aGF0OgorICAgICAgICAvLworICAgICAgICAvLyAtIFdlIGF2b2lkIGhhdmluZyBt
b3JlIHRoYW4gb25lIFJlbGF0aW9uc2hpcCBvdmVyIHRoZSBzYW1lIHR3byBub2Rlcy4gVGhlcmVm
b3JlLCBpZgorICAgICAgICAvLyAgIHRoZSBtZXJnZSBjb3VsZCBiZSBleHByZXNzZWQgYXMgdHdv
IFJlbGF0aW9uc2hpcHMsIHdlIHByZWZlciB0byBpbnN0ZWFkIHBpY2sgdGhlCisgICAgICAgIC8v
ICAgbGVzcyBwcmVjaXNlIHNpbmdsZSBSZWxhdGlvbnNoaXAgZm9ybSBldmVuIGlmIHRoYXQgbWVh
bnMgVE9QLiBPbmUgZXhjZXB0aW9uIHRvCisgICAgICAgIC8vICAgdGhpcyBpcyB0aGF0IHdlIEBh
ID09IEBiICsgQyBhbmQgQGEgPT0gQGIgKyBEIGludG8gQGEgPiBAYiArIEMgLSAxIGFuZAorICAg
ICAgICAvLyAgIEBhIDwgQGIgKyBEICsgMS4gCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gSWYg
dGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gUmVsYXRpb25zaGlwcyBpcyBqdXN0IHRoZSBtX29m
ZnNldCwgdGhlbiB3ZSBjcmVhdGUgYQorICAgICAgICAvLyAgIFJlbGF0aW9uc2hpcCB0aGF0IGhh
cyBhbiBvZmZzZXQgb2YgLTEsIDAsIG9yIDEuIFRoaXMgaXMgYW4gZXNzZW50aWFsIGNvbnZlcmdl
bmNlCisgICAgICAgIC8vICAgaGFjay4gV2UgbmVlZCAtMSBhbmQgMSB0byBzdXBwb3J0IDw9IGFu
ZCA+PS4gVGhpcyBvdmVycmlkZXMgdGhlIHByZXZpb3VzCisgICAgICAgIC8vICAgZXhjZXB0aW9u
LiBGb3IgZXhhbXBsZSwgd2Ugd291bGRuJ3QgYWRkIGEgQGEgPCBAYiArIEQgKyAxIHJlbGF0aW9u
c2hpcCBpZiBEICsgMQorICAgICAgICAvLyAgIHdhcyBub3QgZXF1YWwgdG8gb25lIG9mIC0xLCAw
LCAxLgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIFJlbGF0aW9uc2hp
cCgpIHRvIG1lYW4gVE9QLgorICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIHJlbGF0aW9uc2hp
cHMgYXJlIGlkZW50aWNhbCB0aGVuIHdlIGhhdmUgbm90aGluZyBsZWZ0IHRvIGRvLgorICAgICAg
ICBpZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGcm9tIGhl
cmUgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0d28gcmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50
aWNhbC4gVXN1YWxseSB3ZSB1c2UKKyAgICAgICAgLy8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBk
aWZmZXJlbnQgb2Zmc2V0cyBhbnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBp
cworICAgICAgICAvLyBpZGVudGljYWwuCisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09
IExlc3NUaGFuKSB7CisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IExlc3NUaGFuKSB7
CisgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGF0IG9mZnNldCB0byBzZWxlY3QgdG8g
bWVyZ2UgdGhlbS4gVGhlIGFwcHJvcHJpYXRlIG9mZnNldHMgYXJlCisgICAgICAgICAgICAgICAg
Ly8gLTEsIDAsIG9yIDEuCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRmly
c3QgZmlndXJlIG91dCB3aGF0IG9mZnNldCB3ZSdkIGxpa2UgdG8gdXNlLgorICAgICAgICAgICAg
ICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KTsK
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWV0aGluZyBs
aWtlIEBhIDwgQGIgKyAyLiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB1bmRlciB0aGUKKyAgICAg
ICAgICAgICAgICAvLyAtMSwwLDEgcnVsZS4KKyAgICAgICAgICAgICAgICBpZiAoYmVzdE9mZnNl
dCA8PSAxKQorICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQs
IG1fcmlnaHQsIG1fa2luZCwgc3RkOjptYXgoYmVzdE9mZnNldCwgLTEpKSk7CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgCisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEVxdWFsKSB7CisgICAgICAgICAg
ICAgICAgLy8gVGhpcyBpcyB0aGUgcmVhbGx5IGludGVyZXN0aW5nIGNhc2UuIFdlIGhhdmU6Cisg
ICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgICAgQGEgPCBAYiArIEMKKyAg
ICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGFuZDoKKyAgICAgICAgICAgICAg
ICAvLworICAgICAgICAgICAgICAgIC8vICAgICBAYSA9PSBAYiArIEQKKyAgICAgICAgICAgICAg
ICAvLworICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSdkIGxpa2UgdG8gcmV0dXJuOgor
ICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBtYXgo
QywgRCArIDEpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IGJlc3RPZmZz
ZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQgKyAxKTsKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWV0aGluZyBsaWtlIEBhIDwgQGIg
KyAyLiBXZSBjYW4ndCBkbyBpdC4KKyAgICAgICAgICAgICAgICBpZiAoYmVzdE9mZnNldCA8PSAx
KQorICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmln
aHQsIG1fa2luZCwgc3RkOjptYXgoYmVzdE9mZnNldCwgLTEpKSk7CisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICBBU1NFUlQob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBF
cXVhbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkgeworICAgICAg
ICAgICAgICAgIC8vIFdlIGhhdmUgQGEgPT0gQGIgKyBDIGFuZCBAYSA9PSBAYiArIEQsIHdoZXJl
IEMgIT0gRC4gVHVybiB0aGlzIGludG8gc29tZQorICAgICAgICAgICAgICAgIC8vIGluZXF1YWxp
dHkgdGhhdCBpbnZvbHZlcyBhIGNvbnN0YW50IHRoYXQgaXMgLTEsMCwxLgorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIGF1dG8gbWVyZ2VUb0xlc3NUaGFuID0gW10gKFJlbGF0aW9u
c2hpcCBhLCBSZWxhdGlvbnNoaXAgYikgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYS5z
YW1lTm9kZXNBcyhiKSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAg
ICAvLyBJZiB3ZSBoYXZlOgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAg
ICAgICAvLyAgICAgQGEgPT0gQGIgKyBDIHx8IEBhID09IEBiICsgRAorICAgICAgICAgICAgICAg
ICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIHdlIGNvdWxkIGFsdGVybmF0aXZl
bHkgc2F5OgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyAg
ICAgQGEgPCBAYiArIG1heChDLCBEKSArIDEKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAg
ICBhLmxlZnQoKSwgYS5yaWdodCgpLCBMZXNzVGhhbiwgc3RkOjptYXgoYS5vZmZzZXQoKSwgYi5v
ZmZzZXQoKSkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
IGlmIChyZXN1bHQub2Zmc2V0KCkgPCAtMSB8fCByZXN1bHQub2Zmc2V0KCkgPiAxKQorICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAg
ICB9OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChSZWxhdGlvbnNoaXAg
bGVzc1RoYW4gPSBtZXJnZVRvTGVzc1RoYW4oKnRoaXMsIG90aGVyKSkKKyAgICAgICAgICAgICAg
ICAgICAgZnVuY3RvcihsZXNzVGhhbik7CisgICAgICAgICAgICAgICAgaWYgKFJlbGF0aW9uc2hp
cCBmbGlwcGVkR3JlYXRlclRoYW4gPSBtZXJnZVRvTGVzc1RoYW4ob3RoZXIsICp0aGlzKSkKKyAg
ICAgICAgICAgICAgICAgICAgZnVuY3RvcihmbGlwcGVkR3JlYXRlclRoYW4uZmxpcHBlZCgpKTsK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIC8vIFJldXNlIHRoZSBmYWN0IHRoYXQgd2UgYWxyZWFkeSBoYXZlIGhhbmRsaW5n
IGZvciBMZXNzVGhhbi5tZXJnZShFcXVhbCksIGFib3ZlLAorICAgICAgICAgICAgLy8gYW5kIEdy
ZWF0ZXJUaGFuLm1lcmdlKEVxdWFsKSwgYmVsb3cuCisgICAgICAgICAgICBBU1NFUlQob3RoZXIu
bV9raW5kID09IExlc3NUaGFuIHx8IG90aGVyLm1fa2luZCA9PSBHcmVhdGVyVGhhbik7CisgICAg
ICAgICAgICBvdGhlci5tZXJnZSgqdGhpcywgZnVuY3Rvcik7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFJldXNlIHRoZSBmYWN0IHRoYXQgd2Ug
YWxyZWFkeSBoYXZlIGhhbmRsaW5nIGZvciBMZXNzVGhhbi5tZXJnZSguLi4pLiBXZSBjYW4gdXNl
CisgICAgICAgIC8vIHRoYXQgY29kZSBieSBmbGlwcGluZyB0aGUgcmVsYXRpb25zaGlwcyBhcm91
bmQuCisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gR3JlYXRlclRoYW4pOworICAgICAgICBmbGlw
cGVkKCkubWVyZ2UoCisgICAgICAgICAgICBvdGhlci5mbGlwcGVkKCksCisgICAgICAgICAgICBb
Jl0gKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgICAgICBmdW5jdG9y
KHJlbGF0aW9uc2hpcC5mbGlwcGVkKCkpOworICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAor
ICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXIoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikKKyAgICB7
CisgICAgICAgIEZJWE1FOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgTm9kZSogbV9sZWZ0
OworICAgIE5vZGUqIG1fcmlnaHQ7CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50IG1fb2Zmc2V0
OyAvLyBUaGlzIG9mZnNldCBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2UuCit9OworCitjbGFzcyBJ
bnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZSA6IHB1YmxpYyBQaGFzZSB7CitwdWJsaWM6Cisg
ICAgSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UoR3JhcGgmIGdyYXBoKQorICAgICAgICA6
IFBoYXNlKGdyYXBoLCAiaW50ZWdlciByYW5nZSBvcHRpbWl6YXRpb24iKQorICAgICAgICAsIG1f
emVybyhudWxscHRyKQorICAgICAgICAsIG1faW5zZXJ0aW9uU2V0KGdyYXBoKQorICAgICAgICAs
IG1fY2hhbmdlZChmYWxzZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIGJvb2wgcnVuKCkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChtX2dyYXBoLm1fZm9ybSA9PSBTU0EpOworICAgICAgICAKKyAg
ICAgICAgLy8gQmVmb3JlIHdlIGRvIGFueXRoaW5nLCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEg
emVybyBjb25zdGFudCBhdCB0aGUgdG9wLgorICAgICAgICBmb3IgKE5vZGUqIG5vZGUgOiAqbV9n
cmFwaC5ibG9jaygwKSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmlzSW50MzJDb25zdGFudCgp
ICYmICFub2RlLT5hc0ludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBtX3plcm8gPSBub2RlOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IGlmICghbV96ZXJvKSB7CisgICAgICAgICAgICBtX3plcm8gPSBtX2luc2VydGlvblNldC5pbnNl
cnRDb25zdGFudCgwLCBOb2RlT3JpZ2luKCksIGpzTnVtYmVyKDApKTsKKyAgICAgICAgICAgIG1f
aW5zZXJ0aW9uU2V0LmV4ZWN1dGUobV9ncmFwaC5ibG9jaygwKSk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIGZvciAoQmxvY2tJbmRleCBibG9ja0luZGV4ID0gbV9ncmFwaC5udW1CbG9j
a3MoKTsgYmxvY2tJbmRleC0tOykKKyAgICAgICAgICAgIGhhbmRsZUJsb2NrKGJsb2NrSW5kZXgp
OworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1fY2hhbmdlZDsKKyAgICB9CisKK3ByaXZhdGU6
CisgICAgdm9pZCBleGVjdXRlTm9kZShOb2RlKiBub2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNo
IChub2RlLT5vcCgpKSB7CisgICAgICAgIGNhc2UgQ2hlY2tJbkJvdW5kczogeworICAgICAgICAg
ICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcChtX25vZGUtPmNoaWxkMSgpLm5vZGUoKSwg
bV9ub2RlLT5jaGlsZDIoKS5ub2RlKCksIExlc3NUaGFuKSk7CisgICAgICAgICAgICBzZXRSZWxh
dGlvbnNoaXAoUmVsYXRpb25zaGlwKG1fbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIEdy
ZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICBjYXNlIEFyaXRoQWRkOiB7CisgICAgICAgICAgICAvLyBIYW5kbGUgYWRk
OiBAdmFsdWUgKyBjb25zdGFudC4KKyAgICAgICAgICAgIGlmICghbm9kZS0+Y2hpbGQyKCktPmlz
SW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisg
ICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbm9kZS0+Y2hpbGQyKCktPmFzSW50MzIoKTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgLy8gV2UgYWRkIGEgcmVsYXRpb25zaGlwIGZvciBAYWRkID09
IEB2YWx1ZSArIGNvbnN0YW50LCBhbmQgdGhlbiB3ZSBjb3B5IHRoZQorICAgICAgICAgICAgLy8g
cmVsYXRpb25zaGlwcyBmb3IgQHZhbHVlLiBUaGlzIGdpdmVzIHVzIGEgb25lLWRlZXAgdmlldyBv
ZiBAdmFsdWUncyBleGlzdGluZworICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwcywgd2hpY2gg
bWF0Y2hlcyB0aGUgb25lLWRlZXAgc2VhcmNoIGluIHNldFJlbGF0aW9uc2hpcCgpLgorICAgICAg
ICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwKQorICAg
IHsKKyAgICAgICAgYXV0byBzZXRPbmVTaWRlID0gWyZdIChSZWxhdGlvbnNoaXAgcmVsYXRpb25z
aGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlKSB7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1f
cmVsYXRpb25zaGlwcy5hZGQoCisgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwLmxlZnQoKSwg
VmVjdG9yPFJlbGF0aW9uc2hpcD4oKSk7CisgICAgICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlw
PiYgcmVsYXRpb25zaGlwcyA9IHJlc3VsdC5pdGVyYXRvci0+dmFsdWU7CisgICAgICAgICAgICBW
ZWN0b3I8UmVsYXRpb25zaGlwPiB0b0FkZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxz
ZTsKKyAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwJiBvdGhlclJlbGF0aW9uc2hpcCA6IHJl
bGF0aW9uc2hpcHMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlvbnNoaXAuc2Ft
ZU5vZGVzQXMocmVsYXRpb25zaGlwKSkgeworICAgICAgICAgICAgICAgICAgICBvdGhlclJlbGF0
aW9uc2hpcCA9IG90aGVyUmVsYXRpb25zaGlwLmZpbHRlcihyZWxhdGlvbnNoaXApOworICAgICAg
ICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAo
dGltZVRvTGl2ZSAmJiBvdGhlclJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpF
cXVhbCkgeworICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlw
ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcC53aXRoTGVmdChvdGhlclJl
bGF0aW9uc2hpcC5yaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlw
ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcC53aXRoT2Zmc2V0KG90
aGVyUmVsYXRpb25zaGlwLm9mZnNldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBw
ZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgICAgIHJl
bGF0aW9uc2hpcHMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGZvciAoUmVsYXRpb25zaGlwIGFub3RoZXJSZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAg
ICAgICAgICAgICBzZXRPbmVTaWRlKGFub3RoZXJSZWxhdGlvbnNoaXAsIHRpbWVUb0xpdmUgLSAx
KTsKKyAgICAgICAgfTsKKyAgICAgICAgCisgICAgICAgIHNldE9uZVNpZGUocmVsYXRpb25zaGlw
LCAxKTsKKyAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXAuZmxpcHBlZCgpLCAxKTsKKyAg
ICB9CisgICAgCisgICAgdm9pZCBoYW5kbGVCbG9jayhCbG9ja0luZGV4IGJsb2NrSW5kZXgpCisg
ICAgeworICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IG1fZ3JhcGguYmxvY2soYmxvY2tJbmRl
eCk7CisgICAgICAgIGlmICghYmxvY2spCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAor
ICAgICAgICAKKyAgICAgICAgZm9yICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXgg
PCBibG9jay0+c2l6ZSgpOyArK25vZGVJbmRleCkgeworICAgICAgICAgICAgTm9kZSogbm9kZSA9
IGJsb2NrLT5hdChub2RlSW5kZXgpOworICAgICAgICAgICAgRklYTUUKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgbV9pbnNlcnRpb25TZXQuZXhlY3V0ZShibG9jayk7CisgICAgfQorICAg
IAorICAgIE5vZGUqIG1femVybzsKKyAgICBIYXNoTWFwPE5vZGUqLCBWZWN0b3I8UmVsYXRpb25z
aGlwPj4gbV9yZWxhdGlvbnNoaXBzOworICAgIEluc2VydGlvblNldCBtX2luc2VydGlvblNldDsK
KyAgICBib29sIG1fY2hhbmdlZDsKK307CisgICAgCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UK
KworYm9vbCBwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKEdyYXBoJiBncmFwaCkKK3sK
KyAgICBTYW1wbGluZ1JlZ2lvbiBzYW1wbGluZ1JlZ2lvbigiREZHIEludGVnZXIgUmFuZ2UgT3B0
aW1pemF0aW9uIFBoYXNlIik7CisgICAgcmV0dXJuIHJ1blBoYXNlPEludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlPihncmFwaCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKKwor
I2VuZGlmIC8vIEVOQUJMRShERkdfSklUKQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254540</attachid>
            <date>2015-06-08 20:18:21 -0700</date>
            <delta_ts>2015-06-08 23:41:43 -0700</delta_ts>
            <desc>a bit more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>23477</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJVCkK
KworI2luY2x1ZGUgIkRGR0dyYXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisj
aW5jbHVkZSAiREZHUGhhc2UuaCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25Q
aGFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRl
ICJKU0NJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFt
ZXNwYWNlIHsKKworc3RhdGljIGNvbnN0IGJvb2wgdmVyYm9zZSA9IGZhbHNlOworCitjbGFzcyBS
ZWxhdGlvbnNoaXAgeworcHVibGljOgorICAgIGVudW0gS2luZCB7CisgICAgICAgIExlc3NUaGFu
LAorICAgICAgICBFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4KKyAgICB9OworICAgIAorICAg
IHN0YXRpYyBLaW5kIGludmVyc2UoS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChr
aW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICByZXR1cm4gR3JlYXRl
clRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICByZXR1cm4gRXF1YWw7Cisg
ICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICByZXR1cm4gTGVzc1RoYW46Cisg
ICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
cmV0dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAgICAgIDog
bV9sZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxscHRyKQorICAgICAgICAsIG1f
a2luZChFcXVhbCksCisgICAgICAgICwgbV9vZmZzZXQoMCkKKyAgICB7CisgICAgfQorICAgIAor
ICAgIFJlbGF0aW9uc2hpcChOb2RlKiBsZWZ0LCBOb2RlKiByaWdodCwgS2luZCBraW5kLCBpbnQg
b2Zmc2V0ID0gMCkKKyAgICAgICAgOiBtX2xlZnQobGVmdCkKKyAgICAgICAgLCBtX3JpZ2h0KHJp
Z2h0KQorICAgICAgICAsIG1fa2luZChraW5kKQorICAgICAgICAsIG1fb2Zmc2V0KG9mZnNldCkK
KyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCk7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKG1fcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChtX2xlZnQgIT0gbV9yaWdo
dCk7CisgICAgfQorICAgIAorICAgIHR5cGVkZWYgdm9pZCogKFJlbGF0aW9uc2hpcDo6KlVuc3Bl
Y2lmaWVkQm9vbFR5cGUpOworCisgICAgb3BlcmF0b3IgVW5zcGVjaWZpZWRCb29sVHlwZSooKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbGVmdCA/IHJlaW50ZXJwcmV0X2Nhc3Q8VW5z
cGVjaWZpZWRCb29sVHlwZSo+KDEpIDogMDsKKyAgICB9CisgICAgCisgICAgTm9kZSogbGVmdCgp
IGNvbnN0IHsgcmV0dXJuIG1fbGVmdDsgfQorICAgIE5vZGUqIHJpZ2h0KCkgY29uc3QgeyByZXR1
cm4gbV9yaWdodDsgfQorICAgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZDsgfQor
ICAgIGludCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNldDsgfQorICAgIAorICAgIFJl
bGF0aW9uc2hpcCBmbGlwcGVkKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBSZWxhdGlv
bnNoaXAobV9yaWdodCwgbV9sZWZ0LCBpbnZlcnNlKG1fa2luZCksIC1vZmZzZXQpOworICAgIH0K
KyAgICAKKyAgICBSZWxhdGlvbnNoaXAgaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgICBp
ZiAobV9raW5kID09IEVxdWFsKQorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOwor
ICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgaW52ZXJzZShtX2tp
bmQpLCBvZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBib29sIGlzQ2Fub25pY2FsKCkgeyByZXR1
cm4gbV9sZWZ0IDwgbV9yaWdodDsgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCBjYW5vbmljYWwo
KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzQ2Fub25pY2FsKCkpCisgICAgICAgICAgICBy
ZXR1cm4gKnRoaXM7CisgICAgICAgIHJldHVybiBmbGlwcGVkKCk7CisgICAgfQorICAgIAorICAg
IGJvb2wgc2FtZU5vZGVzQXMoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX2xlZnQgPT0gb3RoZXIubV9sZWZ0CisgICAgICAgICAgICAmJiBtX3JpZ2h0
ID09IG90aGVyLm1fcmlnaHQ7CisgICAgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBSZWxhdGlvbnNoaXAmIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNhbWVOb2Rlc0Fz
KG90aGVyKQorICAgICAgICAgICAgJiYgbV9raW5kID09IG90aGVyLm1fa2luZAorICAgICAgICAg
ICAgJiYgbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZzZXQ7CisgICAgfQorICAgIAorICAgIC8vIElm
IHBvc3NpYmxlLCByZXR1cm5zIGEgZm9ybSBvZiB0aGlzIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUg
Z2l2ZW4gbm9kZSBpcyB0aGUgbGVmdAorICAgIC8vIHNpZGUuIFJldHVybnMgYSBudWxsIHJlbGF0
aW9uc2hpcCBpZiB0aGlzIHJlbGF0aW9uc2hpcCBjYW5ub3Qgc2F5IGFueXRoaW5nIGFib3V0IHRo
aXMKKyAgICAvLyBub2RlLgorICAgIFJlbGF0aW9uc2hpcCBmb3JOb2RlKE5vZGUqIG5vZGUpCisg
ICAgeworICAgICAgICBpZiAobV9sZWZ0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gKnRo
aXM7CisgICAgICAgIGlmIChtX3JpZ2h0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gZmxp
cHBlZCgpOworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgfQorICAgIAorICAg
IHZvaWQgc2V0TGVmdChOb2RlKiBsZWZ0KQorICAgIHsKKyAgICAgICAgbV9sZWZ0ID0gbGVmdDsK
KyAgICB9CisgICAgYm9vbCBhZGRUb09mZnNldChpbnQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAg
aWYgKHN1bU92ZXJmbG93cyhtX29mZnNldCwgb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgbV9vZmZzZXQgKz0gb2Zmc2V0OworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIG1l
cmdlKGNvbnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCisg
ICAgeworICAgICAgICAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG1lcmdpbmcgcmVsYXRp
b25zaGlwcyBvdmVyIHRoZSBzYW1lIG5vZGVzLgorICAgICAgICBBU1NFUlQoc2FtZU5vZGVzQXMo
b3RoZXIpKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9k
IGlzIHRvIGd1YXJhbnRlZSB0aGF0OgorICAgICAgICAvLworICAgICAgICAvLyAtIFdlIGF2b2lk
IGhhdmluZyBtb3JlIHRoYW4gb25lIFJlbGF0aW9uc2hpcCBvdmVyIHRoZSBzYW1lIHR3byBub2Rl
cy4gVGhlcmVmb3JlLCBpZgorICAgICAgICAvLyAgIHRoZSBtZXJnZSBjb3VsZCBiZSBleHByZXNz
ZWQgYXMgdHdvIFJlbGF0aW9uc2hpcHMsIHdlIHByZWZlciB0byBpbnN0ZWFkIHBpY2sgdGhlCisg
ICAgICAgIC8vICAgbGVzcyBwcmVjaXNlIHNpbmdsZSBSZWxhdGlvbnNoaXAgZm9ybSBldmVuIGlm
IHRoYXQgbWVhbnMgVE9QLiBPbmUgZXhjZXB0aW9uIHRvCisgICAgICAgIC8vICAgdGhpcyBpcyB0
aGF0IHdlIEBhID09IEBiICsgQyBhbmQgQGEgPT0gQGIgKyBEIGludG8gQGEgPiBAYiArIEMgLSAx
IGFuZAorICAgICAgICAvLyAgIEBhIDwgQGIgKyBEICsgMS4gCisgICAgICAgIC8vCisgICAgICAg
IC8vIC0gSWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gUmVsYXRpb25zaGlwcyBpcyBqdXN0
IHRoZSBtX29mZnNldCwgdGhlbiB3ZSBjcmVhdGUgYQorICAgICAgICAvLyAgIFJlbGF0aW9uc2hp
cCB0aGF0IGhhcyBhbiBvZmZzZXQgb2YgLTEsIDAsIG9yIDEuIFRoaXMgaXMgYW4gZXNzZW50aWFs
IGNvbnZlcmdlbmNlCisgICAgICAgIC8vICAgaGFjay4gV2UgbmVlZCAtMSBhbmQgMSB0byBzdXBw
b3J0IDw9IGFuZCA+PS4gVGhpcyBvdmVycmlkZXMgdGhlIHByZXZpb3VzCisgICAgICAgIC8vICAg
ZXhjZXB0aW9uLiBGb3IgZXhhbXBsZSwgd2Ugd291bGRuJ3QgYWRkIGEgQGEgPCBAYiArIEQgKyAx
IHJlbGF0aW9uc2hpcCBpZiBEICsgMQorICAgICAgICAvLyAgIHdhcyBub3QgZXF1YWwgdG8gb25l
IG9mIC0xLCAwLCAxLgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIFJl
bGF0aW9uc2hpcCgpIHRvIG1lYW4gVE9QLgorICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIHJl
bGF0aW9uc2hpcHMgYXJlIGlkZW50aWNhbCB0aGVuIHdlIGhhdmUgbm90aGluZyBsZWZ0IHRvIGRv
LgorICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIGZ1bmN0b3IoKnRo
aXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAv
LyBGcm9tIGhlcmUgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0d28gcmVsYXRpb25zaGlwcyBhcmUg
bm90IGlkZW50aWNhbC4gVXN1YWxseSB3ZSB1c2UKKyAgICAgICAgLy8gdGhpcyB0byBhc3N1bWUg
dGhhdCB3ZSBkaWZmZXJlbnQgb2Zmc2V0cyBhbnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhl
IG9mZnNldCBpcworICAgICAgICAvLyBpZGVudGljYWwuCisgICAgICAgIAorICAgICAgICBpZiAo
bV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IExl
c3NUaGFuKSB7CisgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGF0IG9mZnNldCB0byBz
ZWxlY3QgdG8gbWVyZ2UgdGhlbS4gVGhlIGFwcHJvcHJpYXRlIG9mZnNldHMgYXJlCisgICAgICAg
ICAgICAgICAgLy8gLTEsIDAsIG9yIDEuCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgLy8gRmlyc3QgZmlndXJlIG91dCB3aGF0IG9mZnNldCB3ZSdkIGxpa2UgdG8gdXNlLgorICAg
ICAgICAgICAgICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1f
b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHNv
bWV0aGluZyBsaWtlIEBhIDwgQGIgKyAyLiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB1bmRlciB0
aGUKKyAgICAgICAgICAgICAgICAvLyAtMSwwLDEgcnVsZS4KKyAgICAgICAgICAgICAgICBpZiAo
YmVzdE9mZnNldCA8PSAxKQorICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hp
cChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBzdGQ6Om1heChiZXN0T2Zmc2V0LCAtMSkpKTsK
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpIHsK
KyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWFsbHkgaW50ZXJlc3RpbmcgY2FzZS4g
V2UgaGF2ZToKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICBAYSA8
IEBiICsgQworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gYW5kOgorICAg
ICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgIEBhID09IEBiICsgRAorICAg
ICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlJ2QgbGlrZSB0
byByZXR1cm46CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgICAgQGEg
PCBAYiArIG1heChDLCBEICsgMSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBp
bnQgYmVzdE9mZnNldCA9IHN0ZDo6bWF4KG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCArIDEpOwor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRoaW5nIGxp
a2UgQGEgPCBAYiArIDIuIFdlIGNhbid0IGRvIGl0LgorICAgICAgICAgICAgICAgIGlmIChiZXN0
T2Zmc2V0IDw9IDEpCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1f
bGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkpOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG90aGVyLm1fa2luZCA9PSBHcmVhdGVyVGhh
bik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
IChtX2tpbmQgPT0gRXF1YWwpIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1
YWwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIEBhID09IEBiICsgQyBhbmQgQGEgPT0g
QGIgKyBELCB3aGVyZSBDICE9IEQuIFR1cm4gdGhpcyBpbnRvIHNvbWUKKyAgICAgICAgICAgICAg
ICAvLyBpbmVxdWFsaXR5IHRoYXQgaW52b2x2ZXMgYSBjb25zdGFudCB0aGF0IGlzIC0xLDAsMS4K
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhdXRvIG1lcmdlVG9MZXNzVGhhbiA9
IFtdIChSZWxhdGlvbnNoaXAgYSwgUmVsYXRpb25zaGlwIGIpIHsKKyAgICAgICAgICAgICAgICAg
ICAgQVNTRVJUKGEuc2FtZU5vZGVzQXMoYikpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZToKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAg
ICAgICAgICAgICAgICAgICAgLy8gICAgIEBhID09IEBiICsgQyB8fCBAYSA9PSBAYiArIEQKKyAg
ICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiB3ZSBjb3Vs
ZCBhbHRlcm5hdGl2ZWx5IHNheToKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAg
ICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBtYXgoQywgRCkgKyAxCisgICAgICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgcmVzdWx0KAorICAgICAgICAg
ICAgICAgICAgICAgICAgYS5sZWZ0KCksIGEucmlnaHQoKSwgTGVzc1RoYW4sIHN0ZDo6bWF4KGEu
b2Zmc2V0KCksIGIub2Zmc2V0KCkpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICBpZiAocmVzdWx0Lm9mZnNldCgpIDwgLTEgfHwgcmVzdWx0Lm9mZnNldCgp
ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAg
ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAo
UmVsYXRpb25zaGlwIGxlc3NUaGFuID0gbWVyZ2VUb0xlc3NUaGFuKCp0aGlzLCBvdGhlcikpCisg
ICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IobGVzc1RoYW4pOworICAgICAgICAgICAgICAgIGlm
IChSZWxhdGlvbnNoaXAgZmxpcHBlZEdyZWF0ZXJUaGFuID0gbWVyZ2VUb0xlc3NUaGFuKG90aGVy
LCAqdGhpcykpCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoZmxpcHBlZEdyZWF0ZXJUaGFu
LmZsaXBwZWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgICAgICAvLyBSZXVzZSB0aGUgZmFjdCB0aGF0IHdlIGFscmVhZHkg
aGF2ZSBoYW5kbGluZyBmb3IgTGVzc1RoYW4ubWVyZ2UoRXF1YWwpLCBhYm92ZSwKKyAgICAgICAg
ICAgIC8vIGFuZCBHcmVhdGVyVGhhbi5tZXJnZShFcXVhbCksIGJlbG93LgorICAgICAgICAgICAg
QVNTRVJUKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbiB8fCBvdGhlci5tX2tpbmQgPT0gR3JlYXRl
clRoYW4pOworICAgICAgICAgICAgb3RoZXIubWVyZ2UoKnRoaXMsIGZ1bmN0b3IpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBSZXVzZSB0aGUg
ZmFjdCB0aGF0IHdlIGFscmVhZHkgaGF2ZSBoYW5kbGluZyBmb3IgTGVzc1RoYW4ubWVyZ2UoLi4u
KS4gV2UgY2FuIHVzZQorICAgICAgICAvLyB0aGF0IGNvZGUgYnkgZmxpcHBpbmcgdGhlIHJlbGF0
aW9uc2hpcHMgYXJvdW5kLgorICAgICAgICBBU1NFUlQobV9raW5kID09IEdyZWF0ZXJUaGFuKTsK
KyAgICAgICAgZmxpcHBlZCgpLm1lcmdlKAorICAgICAgICAgICAgb3RoZXIuZmxpcHBlZCgpLAor
ICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwKSB7CisgICAgICAgICAg
ICAgICAgZnVuY3RvcihyZWxhdGlvbnNoaXAuZmxpcHBlZCgpKTsKKyAgICAgICAgICAgIH0pOwor
ICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIGEgbnVsbCByZWxhdGlvbnNoaXAgaWYgdGhlIGZp
bHRyYXRpb24gc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyB0d28gZGlmZmVyZW50CisgICAgLy8gcmVs
YXRpb25zaGlwcy4KKyAgICBSZWxhdGlvbnNoaXAgZmlsdGVyKGNvbnN0IFJlbGF0aW9uc2hpcCYg
b3RoZXIpCisgICAgeworICAgICAgICAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG1lcmdp
bmcgcmVsYXRpb25zaGlwcyBvdmVyIHRoZSBzYW1lIG5vZGVzLgorICAgICAgICBBU1NFUlQoc2Ft
ZU5vZGVzQXMob3RoZXIpKTsKKyAgICAgICAgCisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikK
KyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgCisgICAgICAgIC8vIFdlIHdhbnQg
ZXF1YWxpdHkgdG8gdGFrZSBwcmVjZWRlbnQgb3ZlciBldmVyeXRoaW5nIGVsc2UuCisgICAgICAg
IGlmIChtX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAg
IGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gb3RoZXI7Cisg
ICAgICAgIAorICAgICAgICAvLyBGcm9tIGhlcmUgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0d28g
cmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50aWNhbC4gVXN1YWxseSB3ZSB1c2UKKyAgICAgICAg
Ly8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBkaWZmZXJlbnQgb2Zmc2V0cyBhbnl0aW1lIHRoYXQg
ZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBpcworICAgICAgICAvLyBpZGVudGljYWwuCisgICAg
ICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICBpZiAo
b3RoZXIubV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0
aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgbV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwg
c3RkOjptaW4obV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIEFTU0VSVChvdGhlci5tX2tpbmQgPT0gR3JlYXRlclRoYW4p
OworICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICB9CisgICAgICAg
IAorICAgICAgICBBU1NFUlQobV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgcmV0dXJu
IGZsaXBwZWQoKS5maWx0ZXIob3RoZXIuZmxpcHBlZCgpKS5mbGlwcGVkKCk7CisgICAgfQorICAg
IAorcHJpdmF0ZToKKyAgICBOb2RlKiBtX2xlZnQ7CisgICAgTm9kZSogbV9yaWdodDsKKyAgICBL
aW5kIG1fa2luZDsKKyAgICBpbnQgbV9vZmZzZXQ7IC8vIFRoaXMgb2Zmc2V0IGNhbiBiZSBhcmJp
dHJhcmlseSBsYXJnZS4KK307CisKK3R5cGVkZWYgSGFzaE1hcDxOb2RlKiwgVmVjdG9yPFJlbGF0
aW9uc2hpcD4+IFJlbGF0aW9uc2hpcE1hcDsKKworY2xhc3MgSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UgOiBwdWJsaWMgUGhhc2UgeworcHVibGljOgorICAgIEludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlKEdyYXBoJiBncmFwaCkKKyAgICAgICAgOiBQaGFzZShncmFwaCwgImludGVn
ZXIgcmFuZ2Ugb3B0aW1pemF0aW9uIikKKyAgICAgICAgLCBtX3plcm8obnVsbHB0cikKKyAgICAg
ICAgLCBtX2luc2VydGlvblNldChncmFwaCkKKyAgICAgICAgLCBtX2NoYW5nZWQoZmFsc2UpCisg
ICAgeworICAgIH0KKyAgICAKKyAgICBib29sIHJ1bigpCisgICAgeworICAgICAgICBBU1NFUlQo
bV9ncmFwaC5tX2Zvcm0gPT0gU1NBKTsKKyAgICAgICAgCisgICAgICAgIC8vIEJlZm9yZSB3ZSBk
byBhbnl0aGluZywgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIHplcm8gY29uc3RhbnQgYXQgdGhl
IHRvcC4KKyAgICAgICAgZm9yIChOb2RlKiBub2RlIDogKm1fZ3JhcGguYmxvY2soMCkpIHsKKyAg
ICAgICAgICAgIGlmIChub2RlLT5pc0ludDMyQ29uc3RhbnQoKSAmJiAhbm9kZS0+YXNJbnQzMigp
KSB7CisgICAgICAgICAgICAgICAgbV96ZXJvID0gbm9kZTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1femVybykgeworICAg
ICAgICAgICAgbV96ZXJvID0gbV9pbnNlcnRpb25TZXQuaW5zZXJ0Q29uc3RhbnQoMCwgTm9kZU9y
aWdpbigpLCBqc051bWJlcigwKSk7CisgICAgICAgICAgICBtX2luc2VydGlvblNldC5leGVjdXRl
KG1fZ3JhcGguYmxvY2soMCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBCbG9ja0xp
c3QgcG9zdE9yZGVyID0gbV9ncmFwaC5ibG9ja3NJblBvc3RPcmRlcigpOworCisgICAgICAgIEJs
b2NrU2V0IHNlZW5CbG9ja3M7CisgICAgICAgIEJsb2NrTWFwPFJlbGF0aW9uc2hpcE1hcD4gcmVs
YXRpb25zaGlwc0F0SGVhZChtX2dyYXBoKTsKKyAgICAgICAgQmxvY2tNYXA8UmVsYXRpb25zaGlw
TWFwPiByZWxhdGlvbnNoaXBzQXRUYWlsKG1fZ3JhcGgpOworICAgICAgICAKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBwb3N0T3JkZXJJbmRleCA9IHBvc3RPcmRlci5zaXplKCk7IHBvc3RPcmRlcklu
ZGV4LS07KSB7CisgICAgICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IHBvc3RPcmRlcltwb3N0
T3JkZXJJbmRleF07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwcyA9
IHJlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAgICAgCisgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIG5vZGVJbmRleCA9IDA7IG5vZGVJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsr
bm9kZUluZGV4KQorICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5k
ZXgpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSGFuZGxlIGJyYW5jaCBvbiBpbmVx
dWFsaXR5LgorICAgICAgICAgICAgTm9kZSogdGVybWluYWwgPSBibG9jay0+dGVybWluYWwoKTsK
KyAgICAgICAgICAgIGJvb2wgYWxyZWFkeU1lcmdlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYg
KHRlcm1pbmFsLT5vcCgpID09IEJyYW5jaCkgeworICAgICAgICAgICAgICAgIE5vZGUqIGNvbXBh
cmUgPSB0ZXJtaW5hbC0+Y2hpbGQxKCkubm9kZSgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAo
Y29tcGFyZS0+b3AoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUVxOgorICAgICAg
ICAgICAgICAgIGNhc2UgQ29tcGFyZVN0cmljdEVxOgorICAgICAgICAgICAgICAgIGNhc2UgQ29t
cGFyZUxlc3M6CisgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgorICAgICAgICAg
ICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6CisgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJl
R3JlYXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29tcGFyZS0+aXNCaW5hcnlV
c2VLaW5kKEludDMyVXNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIHJlbGF0aW9u
c2hpcDsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAg
ICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUVxOgorICAgICAgICAgICAgICAgICAgICBjYXNl
IENvbXBhcmVTdHJpY3RFcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9
IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGls
ZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkVxdWFsLCAwKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgorICAgICAg
ICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwKAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hp
bGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6
TGVzc1RoYW4sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3NFcToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJl
bGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLCAxKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBh
cmVHcmVhdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRp
b25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5v
ZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIDApOworICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcToKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUt
PmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXA6OkdyZWF0ZXJUaGFuLCAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERGR19D
UkFTSChtX2dyYXBoLCBjb21wYXJlLCAiSW52YWxpZCBjb21wYXJpc29uIG5vZGUgdHlwZSIpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIERGR19BU1NFUlQobV9ncmFw
aCwgY29tcGFyZSwgcmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25z
aGlwTWFwIGZvclRydWUgPSBtX3JlbGF0aW9uc2hpcHM7CisgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcE1hcCBmb3JGYWxzZSA9IG1fcmVsYXRpb25zaGlwczsKKyAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChmb3JUcnVlLCByZWxh
dGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwIGludmVyc2Ug
PSByZWxhdGlvbnNoaXAuaW52ZXJzZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVs
YXRpb25zaGlwKGZvckZhbHNlLCBpbnZlcnNlKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgICAgIG1lcmdlVG8oZm9yVHJ1ZSwgdGVybWluYWwtPmJyYW5jaERhdGEoKS0+
dGFrZW4uYmxvY2spOworICAgICAgICAgICAgICAgICAgICBtZXJnZVRvKGZvckZhbHNlLCB0ZXJt
aW5hbC0+YnJhbmNoRGF0YSgpLT5ub3RUYWtlbi5ibG9jayk7CisgICAgICAgICAgICAgICAgICAg
IGFscmVhZHlNZXJnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFhbHJlYWR5TWVyZ2VkKSB7CisgICAgICAgICAg
ICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNjZXNzb3IgOiBibG9jay0+c3VjY2Vzc29ycygpKQor
ICAgICAgICAgICAgICAgICAgICBtZXJnZVRvKG1fcmVsYXRpb25zaGlwcywgc3VjY2Vzc29yKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1fY2hh
bmdlZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBleGVjdXRlTm9kZShOb2RlKiBub2Rl
KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChub2RlLT5vcCgpKSB7CisgICAgICAgIGNhc2UgQ2hl
Y2tJbkJvdW5kczogeworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcCht
X25vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV9ub2RlLT5jaGlsZDIoKS5ub2RlKCksIFJlbGF0aW9u
c2hpcDo6TGVzc1RoYW4pKTsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNo
aXAobV9ub2RlLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVy
VGhhbiwgLTEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAK
KyAgICAgICAgY2FzZSBBcml0aEFkZDogeworICAgICAgICAgICAgLy8gV2UncmUgb25seSBpbnRl
cmVzdGVkIGluIGludDMyIGFkZGl0aW9ucyBhbmQgd2UgY3VycmVudGx5IG9ubHkga25vdyBob3cg
dG8KKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgbm9uLXdyYXBwaW5nIG9uZXMuCisgICAgICAg
ICAgICBpZiAoIW5vZGUtPmlzQmluYXJ5VXNlS2luZChJbnQzMlVzZSkpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBo
YW5kbGUgdGhlIHVuY2hlY2tlZCBhcml0aG1ldGljIGNhc2UuIFdlIGp1c3QgZG8gaXQgZG9uJ3Qg
cmlnaHQKKyAgICAgICAgICAgIC8vIG5vdy4KKyAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1v
ZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gSGFuZGxlIGFkZDogQHZhbHVlICsgY29uc3RhbnQu
CisgICAgICAgICAgICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9mZnNl
dCA9IG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IC8vIFdlIGFkZCBhIHJlbGF0aW9uc2hpcCBmb3IgQGFkZCA9PSBAdmFsdWUgKyBjb25zdGFudCwg
YW5kIHRoZW4gd2UgY29weSB0aGUKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgZm9yIEB2
YWx1ZS4gVGhpcyBnaXZlcyB1cyBhIG9uZS1kZWVwIHZpZXcgb2YgQHZhbHVlJ3MgZXhpc3RpbmcK
KyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMsIHdoaWNoIG1hdGNoZXMgdGhlIG9uZS1kZWVw
IHNlYXJjaCBpbiBzZXRSZWxhdGlvbnNoaXAoKS4KKyAgICAgICAgICAgIAorICAgICAgICAgICAg
c2V0UmVsYXRpb25zaGlwKG5vZGUsIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgUmVsYXRpb25zaGlw
OjpFcXVhbCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0g
bV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAg
IGlmIChpdGVyICE9IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZl
Y3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25z
aGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAg
ICAgICAgIG5ld1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG5vZGUpOworICAgICAgICAgICAgICAgICAg
ICBpZiAobmV3UmVsYXRpb25zaGlwLmFkZFRvT2Zmc2V0KG9mZnNldCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICB0b0FkZC5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogdG9B
ZGQpCisgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXAsIDAp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBOb3cgd2Ugd2Fu
dCB0byBlc3RhYmxpc2ggdGhhdCBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91dHB1dCBvZiB0aGUg
YWRkaXRpb24gYXJlCisgICAgICAgICAgICAvLyB3aXRoaW4gYSBwYXJ0aWN1bGFyIHJhbmdlIG9m
IGludGVnZXJzLgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkgewor
ICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFkZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBr
bm93IHRoYXQgQHZhbHVlIDw9IG1heCAtIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8v
IEB2YWx1ZSA8IG1heC4KKyAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAg
ICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96ZXJvLCBMZXNzVGhhbiwKKyAg
ICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAtIG9mZnNl
dCArIDEsIDApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhh
dmUgImFkZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQgQGFkZCA+PSBtaW4gKyAxLCBp
LmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAYWRkID4gbWluLgorICAgICAgICAgICAgICAg
IHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgbV96ZXJvLCBHcmVh
dGVyVGhhbiwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptdW1lcmljX2xpbWl0czxpbnQ+Ojpt
aW4oKSArIG9mZnNldCAtIDEsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUg
ImFkZDogQHZhbHVlIC0gMSIgdGhlbiB3ZSBrbm93IHRoYXQgQHZhbHVlID49IG1pbiArIDEsIGku
ZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEB2YWx1ZSA+IG1pbi4KKyAgICAgICAgICAgICAg
ICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5v
ZGUoKSwgbV96ZXJvLCBHcmVhdGVyVGhhbiwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1l
cmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9mZnNldCAtIDEsIDApOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFkZDogQHZhbHVlIC0xIDEiIHRoZW4g
d2Uga25vdyB0aGF0IEBhZGQgPD0gbWF4IC0gMSwgaS5lLiB0aGF0CisgICAgICAgICAgICAgICAg
Ly8gQGFkZCA8IG1heC4KKyAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAg
ICAgICAgICAgICAgIG5vZGUsIG1femVybywgTGVzc1RoYW4sCisgICAgICAgICAgICAgICAgICAg
IHN0ZDo6bXVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSBvZmZzZXQgKyAxLCAwKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgY2FzZSBHZXRBcnJheUxlbmd0aDogeworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlw
KG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgLTEpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFVwc2lsb246
IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlv
bnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBub2RlLT5waGkoKSwgUmVsYXRpb25zaGlwOjpF
cXVhbCwgMCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0
aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgaWYgKGl0
ZXIgIT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmVjdG9yPFJl
bGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVs
YXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25z
aGlwIG5ld1JlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKyAgICAgICAgICAgICAgICAgICAg
bmV3UmVsYXRpb25zaGlwLnNldExlZnQobm9kZS0+cGhpKCkpOworICAgICAgICAgICAgICAgICAg
ICB0b0FkZC5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogdG9BZGQpCisgICAg
ICAgICAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXApOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisg
ICAgdm9pZCBzZXRSZWxhdGlvbnNoaXAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwgdW5zaWdu
ZWQgdGltZVRvTGl2ZSA9IDEpCisgICAgeworICAgICAgICBzZXRSZWxhdGlvbnNoaXAobV9yZWxh
dGlvbnNoaXBzLCByZWxhdGlvbnNoaXAsIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICB2
b2lkIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNo
aXBNYXAsIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAsIHVuc2lnbmVkIHRpbWVUb0xpdmUgPSAx
KQorICAgIHsKKyAgICAgICAgYXV0byBzZXRPbmVTaWRlID0gWyZdIChSZWxhdGlvbnNoaXAgcmVs
YXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlKSB7CisgICAgICAgICAgICBhdXRvIHJlc3Vs
dCA9IHJlbGF0aW9uc2hpcE1hcC5hZGQoCisgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwLmxl
ZnQoKSwgVmVjdG9yPFJlbGF0aW9uc2hpcD4oKSk7CisgICAgICAgICAgICBWZWN0b3I8UmVsYXRp
b25zaGlwPiYgcmVsYXRpb25zaGlwcyA9IHJlc3VsdC5pdGVyYXRvci0+dmFsdWU7CisgICAgICAg
ICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiB0b0FkZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQg
PSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwJiBvdGhlclJlbGF0aW9uc2hp
cCA6IHJlbGF0aW9uc2hpcHMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlvbnNo
aXAuc2FtZU5vZGVzQXMocmVsYXRpb25zaGlwKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAo
UmVsYXRpb25zaGlwIGZpbHRlcmVkID0gb3RoZXJSZWxhdGlvbnNoaXAuZmlsdGVyKHJlbGF0aW9u
c2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUmVsYXRpb25zaGlwID0gZmls
dGVyZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAodGltZVRvTGl2ZSAm
JiBvdGhlclJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpFcXVhbCkgeworICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gb3RoZXJSZWxh
dGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG90
aGVyUmVsYXRpb25zaGlwLnJpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVs
YXRpb25zaGlwLmFkZFRvT2Zmc2V0KG90aGVyUmVsYXRpb25zaGlwLm9mZnNldCgpKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYg
KCFmb3VuZCkKKyAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChyZWxhdGlvbnNo
aXApOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCBhbm90aGVy
UmVsYXRpb25zaGlwIDogdG9BZGQpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQodGltZVRvTGl2
ZSk7CisgICAgICAgICAgICAgICAgc2V0T25lU2lkZShhbm90aGVyUmVsYXRpb25zaGlwLCB0aW1l
VG9MaXZlIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIAorICAgICAg
ICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSk7CisgICAgICAgIHNldE9uZVNp
ZGUocmVsYXRpb25zaGlwLmZsaXBwZWQoKSwgdGltZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAg
IHZvaWQgaGFuZGxlQmxvY2soQmxvY2tJbmRleCBibG9ja0luZGV4KQorICAgIHsKKyAgICAgICAg
QmFzaWNCbG9jayogYmxvY2sgPSBtX2dyYXBoLmJsb2NrKGJsb2NrSW5kZXgpOworICAgICAgICBp
ZiAoIWJsb2NrKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgCisgICAg
ICAgIGZvciAodW5zaWduZWQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgYmxvY2stPnNpemUo
KTsgKytub2RlSW5kZXgpIHsKKyAgICAgICAgICAgIE5vZGUqIG5vZGUgPSBibG9jay0+YXQobm9k
ZUluZGV4KTsKKyAgICAgICAgICAgIEZJWE1FCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IG1faW5zZXJ0aW9uU2V0LmV4ZWN1dGUoYmxvY2spOworICAgIH0KKyAgICAKKyAgICBOb2RlKiBt
X3plcm87CisgICAgUmVsYXRpb25zaGlwTWFwIG1fcmVsYXRpb25zaGlwczsKKyAgICBJbnNlcnRp
b25TZXQgbV9pbnNlcnRpb25TZXQ7CisgICAgYm9vbCBtX2NoYW5nZWQ7Cit9OworICAgIAorfSAv
LyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2Jvb2wgcGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXph
dGlvbihHcmFwaCYgZ3JhcGgpCit7CisgICAgU2FtcGxpbmdSZWdpb24gc2FtcGxpbmdSZWdpb24o
IkRGRyBJbnRlZ2VyIFJhbmdlIE9wdGltaXphdGlvbiBQaGFzZSIpOworICAgIHJldHVybiBydW5Q
aGFzZTxJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZT4oZ3JhcGgpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6REZHCisKKyNlbmRpZiAvLyBFTkFCTEUoREZHX0pJVCkKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254551</attachid>
            <date>2015-06-08 23:41:43 -0700</date>
            <delta_ts>2015-06-09 13:07:38 -0700</delta_ts>
            <desc>it is written</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>31573</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJVCkK
KworI2luY2x1ZGUgIkRGR0dyYXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisj
aW5jbHVkZSAiREZHUGhhc2UuaCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25Q
aGFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRl
ICJKU0NJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFt
ZXNwYWNlIHsKKworY29uc3QgYm9vbCB2ZXJib3NlID0gZmFsc2U7CisKK3RlbXBsYXRlPHR5cGVu
YW1lLi4uIEFyZ3M+CitpbnQ2NF90IGNsYW1wZWRTdW1JbXBsKGludCBsZWZ0LCBBcmdzLi4uIGFy
Z3MpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGxlZnQpICsgY2xhbXBlZFN1
bUltcGwoYXJncy4uLik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitpbnQgY2xh
bXBlZFN1bShBcmdzLi4uIGFyZ3MpCit7CisgICAgaW50NjRfdCByZXN1bHQgPSBjbGFtcGVkU3Vt
SW1wbChhcmdzLi4uKTsKKyAgICByZXR1cm4gc3RkOjptaW4oCisgICAgICAgIHN0YXRpY19jYXN0
PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpLAorICAgICAgICBzdGQ6
Om1heCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1p
dHM8aW50Pjo6bWluKCkpLAorICAgICAgICAgICAgcmVzdWx0KSk7Cit9CisKK2NsYXNzIFJlbGF0
aW9uc2hpcCB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgTGVzc1RoYW4sCisg
ICAgICAgIEVxdWFsLAorICAgICAgICBHcmVhdGVyVGhhbgorICAgIH07CisgICAgCisgICAgc3Rh
dGljIEtpbmQgaW52ZXJzZShLaW5kIGtpbmQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQp
IHsKKyAgICAgICAgY2FzZSBMZXNzVGhhbjoKKyAgICAgICAgICAgIHJldHVybiBHcmVhdGVyVGhh
bjsKKyAgICAgICAgY2FzZSBFcXVhbDoKKyAgICAgICAgICAgIHJldHVybiBFcXVhbDsKKyAgICAg
ICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAgICAgIHJldHVybiBMZXNzVGhhbjoKKyAgICAg
ICAgfQorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1
cm4ga2luZDsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwKCkKKyAgICAgICAgOiBtX2xl
ZnQobnVsbHB0cikKKyAgICAgICAgLCBtX3JpZ2h0KG51bGxwdHIpCisgICAgICAgICwgbV9raW5k
KEVxdWFsKSwKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgIHsKKyAgICB9CisgICAgCisgICAg
UmVsYXRpb25zaGlwKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZz
ZXQgPSAwKQorICAgICAgICA6IG1fbGVmdChsZWZ0KQorICAgICAgICAsIG1fcmlnaHQocmlnaHQp
CisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAg
IHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQobV9yaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCAhPSBtX3JpZ2h0KTsK
KyAgICB9CisgICAgCisgICAgdHlwZWRlZiB2b2lkKiAoUmVsYXRpb25zaGlwOjoqVW5zcGVjaWZp
ZWRCb29sVHlwZSk7CisKKyAgICBvcGVyYXRvciBVbnNwZWNpZmllZEJvb2xUeXBlKigpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID8gcmVpbnRlcnByZXRfY2FzdDxVbnNwZWNp
ZmllZEJvb2xUeXBlKj4oMSkgOiAwOworICAgIH0KKyAgICAKKyAgICBOb2RlKiBsZWZ0KCkgY29u
c3QgeyByZXR1cm4gbV9sZWZ0OyB9CisgICAgTm9kZSogcmlnaHQoKSBjb25zdCB7IHJldHVybiBt
X3JpZ2h0OyB9CisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9CisgICAg
aW50IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisgICAgCisgICAgUmVsYXRp
b25zaGlwIGZsaXBwZWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hp
cChtX3JpZ2h0LCBtX2xlZnQsIGludmVyc2UobV9raW5kKSwgLW9mZnNldCk7CisgICAgfQorICAg
IAorICAgIFJlbGF0aW9uc2hpcCBpbnZlcnNlKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAg
ICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBpbnZlcnNlKG1fa2luZCks
IG9mZnNldCk7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNDYW5vbmljYWwoKSB7IHJldHVybiBt
X2xlZnQgPCBtX3JpZ2h0OyB9CisgICAgCisgICAgUmVsYXRpb25zaGlwIGNhbm9uaWNhbCgpIGNv
bnN0CisgICAgeworICAgICAgICBpZiAoaXNDYW5vbmljYWwoKSkKKyAgICAgICAgICAgIHJldHVy
biAqdGhpczsKKyAgICAgICAgcmV0dXJuIGZsaXBwZWQoKTsKKyAgICB9CisgICAgCisgICAgYm9v
bCBzYW1lTm9kZXNBcyhjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1fbGVmdCA9PSBvdGhlci5tX2xlZnQKKyAgICAgICAgICAgICYmIG1fcmlnaHQgPT0g
b3RoZXIubV9yaWdodDsKKyAgICB9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJl
bGF0aW9uc2hpcCYgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gc2FtZU5vZGVzQXMob3Ro
ZXIpCisgICAgICAgICAgICAmJiBtX2tpbmQgPT0gb3RoZXIubV9raW5kCisgICAgICAgICAgICAm
JiBtX29mZnNldCA9PSBvdGhlci5tX29mZnNldDsKKyAgICB9CisgICAgCisgICAgYm9vbCBvcGVy
YXRvcjwoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChtX2xl
ZnQgIT0gb3RoZXIubV9sZWZ0KQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdCA8IG90aGVyLm1f
bGVmdDsKKyAgICAgICAgaWYgKG1fcmlnaHQgIT0gb3RoZXIubV9yaWdodCkKKyAgICAgICAgICAg
IHJldHVybiBtX3JpZ2h0IDwgb3RoZXIubV9yaWdodDsKKyAgICAgICAgaWYgKG1fa2luZCAhPSBv
dGhlci5tX2tpbmQpCisgICAgICAgICAgICByZXR1cm4gbV9raW5kIDwgb3RoZXIubV9raW5kOwor
ICAgICAgICByZXR1cm4gbV9vZmZzZXQgPCBvdGhlci5tX29mZnNldDsKKyAgICB9CisgICAgCisg
ICAgLy8gSWYgcG9zc2libGUsIHJldHVybnMgYSBmb3JtIG9mIHRoaXMgcmVsYXRpb25zaGlwIHdo
ZXJlIHRoZSBnaXZlbiBub2RlIGlzIHRoZSBsZWZ0CisgICAgLy8gc2lkZS4gUmV0dXJucyBhIG51
bGwgcmVsYXRpb25zaGlwIGlmIHRoaXMgcmVsYXRpb25zaGlwIGNhbm5vdCBzYXkgYW55dGhpbmcg
YWJvdXQgdGhpcworICAgIC8vIG5vZGUuCisgICAgUmVsYXRpb25zaGlwIGZvck5vZGUoTm9kZSog
bm9kZSkKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJl
dHVybiAqdGhpczsKKyAgICAgICAgaWYgKG1fcmlnaHQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJl
dHVybiBmbGlwcGVkKCk7CisgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICB9Cisg
ICAgCisgICAgdm9pZCBzZXRMZWZ0KE5vZGUqIGxlZnQpCisgICAgeworICAgICAgICBtX2xlZnQg
PSBsZWZ0OworICAgIH0KKyAgICBib29sIGFkZFRvT2Zmc2V0KGludCBvZmZzZXQpCisgICAgewor
ICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzKG1fb2Zmc2V0LCBvZmZzZXQpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBtX29mZnNldCArPSBvZmZzZXQ7CisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAg
IHZvaWQgbWVyZ2UoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVu
Y3RvcikKKyAgICB7CisgICAgICAgIGlmICghc2FtZU5vZGVzQXMob3RoZXIpKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRo
b2QgaXMgdG8gZ3VhcmFudGVlIHRoYXQ6CisgICAgICAgIC8vCisgICAgICAgIC8vIC0gV2UgYXZv
aWQgaGF2aW5nIG1vcmUgdGhhbiBvbmUgUmVsYXRpb25zaGlwIG92ZXIgdGhlIHNhbWUgdHdvIG5v
ZGVzLiBUaGVyZWZvcmUsIGlmCisgICAgICAgIC8vICAgdGhlIG1lcmdlIGNvdWxkIGJlIGV4cHJl
c3NlZCBhcyB0d28gUmVsYXRpb25zaGlwcywgd2UgcHJlZmVyIHRvIGluc3RlYWQgcGljayB0aGUK
KyAgICAgICAgLy8gICBsZXNzIHByZWNpc2Ugc2luZ2xlIFJlbGF0aW9uc2hpcCBmb3JtIGV2ZW4g
aWYgdGhhdCBtZWFucyBUT1AuIE9uZSBleGNlcHRpb24gdG8KKyAgICAgICAgLy8gICB0aGlzIGlz
IHRoYXQgd2UgQGEgPT0gQGIgKyBDIGFuZCBAYSA9PSBAYiArIEQgaW50byBAYSA+IEBiICsgQyAt
IDEgYW5kCisgICAgICAgIC8vICAgQGEgPCBAYiArIEQgKyAxLiAKKyAgICAgICAgLy8KKyAgICAg
ICAgLy8gLSBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBSZWxhdGlvbnNoaXBzIGlzIGp1
c3QgdGhlIG1fb2Zmc2V0LCB0aGVuIHdlIGNyZWF0ZSBhCisgICAgICAgIC8vICAgUmVsYXRpb25z
aGlwIHRoYXQgaGFzIGFuIG9mZnNldCBvZiAtMSwgMCwgb3IgMS4gVGhpcyBpcyBhbiBlc3NlbnRp
YWwgY29udmVyZ2VuY2UKKyAgICAgICAgLy8gICBoYWNrLiBXZSBuZWVkIC0xIGFuZCAxIHRvIHN1
cHBvcnQgPD0gYW5kID49LiBUaGlzIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8g
ICBleGNlcHRpb24uIEZvciBleGFtcGxlLCB3ZSB3b3VsZG4ndCBhZGQgYSBAYSA8IEBiICsgRCAr
IDEgcmVsYXRpb25zaGlwIGlmIEQgKyAxCisgICAgICAgIC8vICAgd2FzIG5vdCBlcXVhbCB0byBv
bmUgb2YgLTEsIDAsIDEuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB1c2Ug
UmVsYXRpb25zaGlwKCkgdG8gbWVhbiBUT1AuCisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGUg
cmVsYXRpb25zaGlwcyBhcmUgaWRlbnRpY2FsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIGxlZnQgdG8g
ZG8uCisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgZnVuY3Rvcigq
dGhpcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IC8vIEZyb20gaGVyZSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHR3byByZWxhdGlvbnNoaXBzIGFy
ZSBub3QgaWRlbnRpY2FsLiBVc3VhbGx5IHdlIHVzZQorICAgICAgICAvLyB0aGlzIHRvIGFzc3Vt
ZSB0aGF0IHdlIGRpZmZlcmVudCBvZmZzZXRzIGFueXRpbWUgdGhhdCBldmVyeXRoaW5nIGJ1dCB0
aGUgb2Zmc2V0IGlzCisgICAgICAgIC8vIGlkZW50aWNhbC4KKyAgICAgICAgCisgICAgICAgIGlm
IChtX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0g
TGVzc1RoYW4pIHsKKyAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgb2Zmc2V0IHRv
IHNlbGVjdCB0byBtZXJnZSB0aGVtLiBUaGUgYXBwcm9wcmlhdGUgb2Zmc2V0cyBhcmUKKyAgICAg
ICAgICAgICAgICAvLyAtMSwgMCwgb3IgMS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAvLyBGaXJzdCBmaWd1cmUgb3V0IHdoYXQgb2Zmc2V0IHdlJ2QgbGlrZSB0byB1c2UuCisg
ICAgICAgICAgICAgICAgaW50IGJlc3RPZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIu
bV9vZmZzZXQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUg
c29tZXRoaW5nIGxpa2UgQGEgPCBAYiArIDIuIFdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHVuZGVy
IHRoZQorICAgICAgICAgICAgICAgIC8vIC0xLDAsMSBydWxlLgorICAgICAgICAgICAgICAgIGlm
IChiZXN0T2Zmc2V0IDw9IDEpCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25z
aGlwKG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkp
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkg
eworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlYWxseSBpbnRlcmVzdGluZyBjYXNl
LiBXZSBoYXZlOgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgIEBh
IDwgQGIgKyBDCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBhbmQ6Cisg
ICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIgKyBECisg
ICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UnZCBsaWtl
IHRvIHJldHVybjoKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICBA
YSA8IEBiICsgbWF4KEMsIEQgKyAxKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
IGludCBiZXN0T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0ICsgMSk7
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBzb21ldGhpbmcg
bGlrZSBAYSA8IEBiICsgMi4gV2UgY2FuJ3QgZG8gaXQuCisgICAgICAgICAgICAgICAgaWYgKGJl
c3RPZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNoaXAo
bV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgc3RkOjptYXgoYmVzdE9mZnNldCwgLTEpKSk7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBBU1NFUlQob3RoZXIubV9raW5kID09IEdyZWF0ZXJU
aGFuKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAg
aWYgKG1fa2luZCA9PSBFcXVhbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBF
cXVhbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgQGEgPT0gQGIgKyBDIGFuZCBAYSA9
PSBAYiArIEQsIHdoZXJlIEMgIT0gRC4gVHVybiB0aGlzIGludG8gc29tZQorICAgICAgICAgICAg
ICAgIC8vIGluZXF1YWxpdHkgdGhhdCBpbnZvbHZlcyBhIGNvbnN0YW50IHRoYXQgaXMgLTEsMCwx
LgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGF1dG8gbWVyZ2VUb0xlc3NUaGFu
ID0gW10gKFJlbGF0aW9uc2hpcCBhLCBSZWxhdGlvbnNoaXAgYikgeworICAgICAgICAgICAgICAg
ICAgICBBU1NFUlQoYS5zYW1lTm9kZXNBcyhiKSk7CisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlOgorICAgICAgICAgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIgKyBDIHx8IEBhID09IEBiICsgRAor
ICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIHdlIGNv
dWxkIGFsdGVybmF0aXZlbHkgc2F5OgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAg
ICAgICAgICAgICAvLyAgICAgQGEgPCBAYiArIG1heChDLCBEKSArIDEKKyAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZXN1bHQoCisgICAgICAg
ICAgICAgICAgICAgICAgICBhLmxlZnQoKSwgYS5yaWdodCgpLCBMZXNzVGhhbiwgc3RkOjptYXgo
YS5vZmZzZXQoKSwgYi5vZmZzZXQoKSkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgICAgIGlmIChyZXN1bHQub2Zmc2V0KCkgPCAtMSB8fCByZXN1bHQub2Zmc2V0
KCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOwor
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlm
IChSZWxhdGlvbnNoaXAgbGVzc1RoYW4gPSBtZXJnZVRvTGVzc1RoYW4oKnRoaXMsIG90aGVyKSkK
KyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcihsZXNzVGhhbik7CisgICAgICAgICAgICAgICAg
aWYgKFJlbGF0aW9uc2hpcCBmbGlwcGVkR3JlYXRlclRoYW4gPSBtZXJnZVRvTGVzc1RoYW4ob3Ro
ZXIsICp0aGlzKSkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcihmbGlwcGVkR3JlYXRlclRo
YW4uZmxpcHBlZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJldXNlIHRoZSBmYWN0IHRoYXQgd2UgYWxyZWFk
eSBoYXZlIGhhbmRsaW5nIGZvciBMZXNzVGhhbi5tZXJnZShFcXVhbCksIGFib3ZlLAorICAgICAg
ICAgICAgLy8gYW5kIEdyZWF0ZXJUaGFuLm1lcmdlKEVxdWFsKSwgYmVsb3cuCisgICAgICAgICAg
ICBBU1NFUlQob3RoZXIubV9raW5kID09IExlc3NUaGFuIHx8IG90aGVyLm1fa2luZCA9PSBHcmVh
dGVyVGhhbik7CisgICAgICAgICAgICBvdGhlci5tZXJnZSgqdGhpcywgZnVuY3Rvcik7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFJldXNlIHRo
ZSBmYWN0IHRoYXQgd2UgYWxyZWFkeSBoYXZlIGhhbmRsaW5nIGZvciBMZXNzVGhhbi5tZXJnZSgu
Li4pLiBXZSBjYW4gdXNlCisgICAgICAgIC8vIHRoYXQgY29kZSBieSBmbGlwcGluZyB0aGUgcmVs
YXRpb25zaGlwcyBhcm91bmQuCisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gR3JlYXRlclRoYW4p
OworICAgICAgICBmbGlwcGVkKCkubWVyZ2UoCisgICAgICAgICAgICBvdGhlci5mbGlwcGVkKCks
CisgICAgICAgICAgICBbJl0gKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXApIHsKKyAgICAgICAg
ICAgICAgICBmdW5jdG9yKHJlbGF0aW9uc2hpcC5mbGlwcGVkKCkpOworICAgICAgICAgICAgfSk7
CisgICAgfQorICAgIAorICAgIC8vIFJldHVybnMgYSBudWxsIHJlbGF0aW9uc2hpcCBpZiB0aGUg
ZmlsdHJhdGlvbiBzaG91bGQgYmUgZXhwcmVzc2VkIGFzIHR3byBkaWZmZXJlbnQKKyAgICAvLyBy
ZWxhdGlvbnNoaXBzLgorICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXIoY29uc3QgUmVsYXRpb25zaGlw
JiBvdGhlcikKKyAgICB7CisgICAgICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gbWVy
Z2luZyByZWxhdGlvbnNoaXBzIG92ZXIgdGhlIHNhbWUgbm9kZXMuCisgICAgICAgIEFTU0VSVChz
YW1lTm9kZXNBcyhvdGhlcikpOworICAgICAgICAKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVy
KQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAKKyAgICAgICAgLy8gV2Ugd2Fu
dCBlcXVhbGl0eSB0byB0YWtlIHByZWNlZGVudCBvdmVyIGV2ZXJ5dGhpbmcgZWxzZS4KKyAgICAg
ICAgaWYgKG1fa2luZCA9PSBFcXVhbCkKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAg
ICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsK
KyAgICAgICAgCisgICAgICAgIC8vIEZyb20gaGVyZSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHR3
byByZWxhdGlvbnNoaXBzIGFyZSBub3QgaWRlbnRpY2FsLiBVc3VhbGx5IHdlIHVzZQorICAgICAg
ICAvLyB0aGlzIHRvIGFzc3VtZSB0aGF0IHdlIGRpZmZlcmVudCBvZmZzZXRzIGFueXRpbWUgdGhh
dCBldmVyeXRoaW5nIGJ1dCB0aGUgb2Zmc2V0IGlzCisgICAgICAgIC8vIGlkZW50aWNhbC4KKyAg
ICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAgIGlm
IChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVs
YXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICBtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFu
LCBzdGQ6Om1pbihtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG90aGVyLm1fa2luZCA9PSBHcmVhdGVyVGhh
bik7CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gR3JlYXRlclRoYW4pOworICAgICAgICByZXR1
cm4gZmxpcHBlZCgpLmZpbHRlcihvdGhlci5mbGlwcGVkKCkpLmZsaXBwZWQoKTsKKyAgICB9Cisg
ICAgCisgICAgaW50IG1pblZhbHVlT2ZMZWZ0KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X2xlZnQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdC0+YXNJ
bnQzMigpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikKKyAgICAg
ICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAK
KyAgICAgICAgaW50IG1pblJpZ2h0VmFsdWU7CisgICAgICAgIGlmIChtX3JpZ2h0LT5pc0ludDMy
Q29uc3RhbnQoKSkKKyAgICAgICAgICAgIG1pblJpZ2h0VmFsdWUgPSBtX3JpZ2h0LT5hc0ludDMy
KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1pblJpZ2h0VmFsdWUgPSBzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBH
cmVhdGVyVGhhbikKKyAgICAgICAgICAgIHJldHVybiBjbGFtcGVkU3VtKG1pblJpZ2h0VmFsdWUs
IG1fb2Zmc2V0LCAxKTsKKyAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1ZSwg
bV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBpbnQgbWF4VmFsdWVPZkxlZnQoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgaWYgKG1fbGVmdC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAg
ICByZXR1cm4gbV9sZWZ0LT5hc0ludDMyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5k
ID09IEdyZWF0ZXJUaGFuKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8
aW50Pjo6bWF4KCk7CisgICAgICAgIAorICAgICAgICBpbnQgbWF4UmlnaHRWYWx1ZTsKKyAgICAg
ICAgaWYgKG1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgbWF4UmlnaHRW
YWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF4
UmlnaHRWYWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgICAgICAgIAor
ICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKQorICAgICAgICAgICAgcmV0dXJuIGNsYW1w
ZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZzZXQsIC0xKTsKKyAgICAgICAgcmV0dXJuIGNsYW1w
ZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZzZXQpOworICAgIH0KKyAgICAKK3ByaXZhdGU6Cisg
ICAgTm9kZSogbV9sZWZ0OworICAgIE5vZGUqIG1fcmlnaHQ7CisgICAgS2luZCBtX2tpbmQ7Cisg
ICAgaW50IG1fb2Zmc2V0OyAvLyBUaGlzIG9mZnNldCBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2Uu
Cit9OworCit0eXBlZGVmIEhhc2hNYXA8Tm9kZSosIFZlY3RvcjxSZWxhdGlvbnNoaXA+PiBSZWxh
dGlvbnNoaXBNYXA7CisKK2NsYXNzIEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlIDogcHVi
bGljIFBoYXNlIHsKK3B1YmxpYzoKKyAgICBJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZShH
cmFwaCYgZ3JhcGgpCisgICAgICAgIDogUGhhc2UoZ3JhcGgsICJpbnRlZ2VyIHJhbmdlIG9wdGlt
aXphdGlvbiIpCisgICAgICAgICwgbV96ZXJvKG51bGxwdHIpCisgICAgICAgICwgbV9yZWxhdGlv
bnNoaXBzQXRIZWFkKGdyYXBoKQorICAgICAgICAsIG1faW5zZXJ0aW9uU2V0KGdyYXBoKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgYm9vbCBydW4oKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1f
Z3JhcGgubV9mb3JtID09IFNTQSk7CisgICAgICAgIAorICAgICAgICAvLyBCZWZvcmUgd2UgZG8g
YW55dGhpbmcsIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB6ZXJvIGNvbnN0YW50IGF0IHRoZSB0
b3AuCisgICAgICAgIGZvciAoTm9kZSogbm9kZSA6ICptX2dyYXBoLmJsb2NrKDApKSB7CisgICAg
ICAgICAgICBpZiAobm9kZS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgIW5vZGUtPmFzSW50MzIoKSkg
eworICAgICAgICAgICAgICAgIG1femVybyA9IG5vZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX3plcm8pIHsKKyAgICAg
ICAgICAgIG1femVybyA9IG1faW5zZXJ0aW9uU2V0Lmluc2VydENvbnN0YW50KDAsIE5vZGVPcmln
aW4oKSwganNOdW1iZXIoMCkpOworICAgICAgICAgICAgbV9pbnNlcnRpb25TZXQuZXhlY3V0ZSht
X2dyYXBoLmJsb2NrKDApKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQmxvY2tMaXN0
IHBvc3RPcmRlciA9IG1fZ3JhcGguYmxvY2tzSW5Qb3N0T3JkZXIoKTsKKyAgICAgICAgCisgICAg
ICAgIGJvb2wgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIHdoaWxlIChjaGFuZ2VkKSB7CisgICAg
ICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIHBvc3RP
cmRlckluZGV4ID0gcG9zdE9yZGVyLnNpemUoKTsgcG9zdE9yZGVySW5kZXgtLTspIHsKKyAgICAg
ICAgICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IHBvc3RPcmRlcltwb3N0T3JkZXJJbmRleF07
CisgICAgICAgICAgICAgICAgREZHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgbV9ncmFw
aCwgbnVsbHB0ciwgYmxvY2sgPT0gbV9ncmFwaC5ibG9jaygwKSB8fCBtX3NlZW5CbG9ja3MuZ2V0
KGJsb2NrKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHMg
PSBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXggPCBibG9jay0+c2l6
ZSgpOyArK25vZGVJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUoYmxvY2st
PmF0KG5vZGVJbmRleCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSGFuZGxl
IGJyYW5jaCBvbiBpbmVxdWFsaXR5LgorICAgICAgICAgICAgICAgIE5vZGUqIHRlcm1pbmFsID0g
YmxvY2stPnRlcm1pbmFsKCk7CisgICAgICAgICAgICAgICAgYm9vbCBhbHJlYWR5TWVyZ2VkID0g
ZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5vcCgpID09IEJyYW5jaCkgewor
ICAgICAgICAgICAgICAgICAgICBOb2RlKiBjb21wYXJlID0gdGVybWluYWwtPmNoaWxkMSgpLm5v
ZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAg
ICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUVxOgorICAgICAgICAgICAgICAgICAgICBjYXNl
IENvbXBhcmVTdHJpY3RFcToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlTGVzczoK
KyAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgorICAgICAgICAgICAgICAg
ICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBh
cmVHcmVhdGVyRXE6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcGFyZS0+aXNC
aW5hcnlVc2VLaW5kKEludDMyVXNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlv
bnNoaXAgcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21w
YXJlLT5vcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVFcToKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZVN0cmljdEVxOgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5j
aGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9u
c2hpcDo6RXF1YWwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlTGVzczoKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQy
KCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6
Okxlc3NUaGFuLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3NFcToKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQy
KCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6
Okxlc3NUaGFuLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNoaWxk
MigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlw
OjpHcmVhdGVyVGhhbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyRXE6CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwKAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUt
PmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRp
b25zaGlwOjpHcmVhdGVyVGhhbiwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBERkdfQ1JBU0gobV9ncmFwaCwgY29tcGFyZSwgIkludmFsaWQgY29tcGFyaXNv
biBub2RlIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIGNvbXBhcmUsIHJlbGF0aW9uc2hpcCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBNYXAgZm9yVHJ1ZSA9IG1fcmVsYXRp
b25zaGlwczsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcE1hcCBmb3JGYWxz
ZSA9IG1fcmVsYXRpb25zaGlwczsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoZm9yVHJ1ZSwgcmVsYXRpb25zaGlwKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChSZWxhdGlvbnNoaXAgaW52ZXJzZSA9IHJlbGF0aW9uc2hp
cC5pbnZlcnNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlw
KGZvckZhbHNlLCBpbnZlcnNlKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8oZm9yVHJ1ZSwgdGVybWluYWwtPmJyYW5jaERh
dGEoKS0+dGFrZW4uYmxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSBt
ZXJnZVRvKGZvckZhbHNlLCB0ZXJtaW5hbC0+YnJhbmNoRGF0YSgpLT5ub3RUYWtlbi5ibG9jayk7
CisgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5TWVyZ2VkID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlNZXJnZWQpIHsKKyAgICAgICAgICAgICAg
ICAgICAgZm9yIChCYXNpY0Jsb2NrKiBzdWNjZXNzb3IgOiBibG9jay0+c3VjY2Vzc29ycygpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSBtZXJnZVRvKG1fcmVsYXRpb25zaGlw
cywgc3VjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChCYXNp
Y0Jsb2NrKiBibG9jayA6IG1fZ3JhcGguYmxvY2tzSW5OYXR1cmFsT3JkZXIoKSkgeworICAgICAg
ICAgICAgbV9yZWxhdGlvbnNoaXBzID0gbV9yZWxhdGlvbnNoaXBzQXRIZWFkW2Jsb2NrXTsKKyAg
ICAgICAgICAgIGZvciAodW5zaWduZWQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgYmxvY2st
PnNpemUoKTsgKytub2RlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBOb2RlKiBub2RlID0gYmxv
Y2stPmF0KG5vZGVJbmRleCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8g
VGhpcyBlbmRzIHVwIGJlaW5nIHByZXR0eSBhd2t3YXJkIHRvIHdyaXRlIGJlY2F1c2Ugd2UgbmVl
ZCB0byBkZWNpZGUgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZSBieSB1c2luZyB0
aGUgcmVsYXRpb25zaGlwcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiwgYnV0IHdlIG5lZWQgdG8KKyAg
ICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHdlIG9wdGltaXplLgor
ICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgeworICAgICAgICAgICAgICAgIGNh
c2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5pc0JpbmFyeVVz
ZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxv
dykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBp
ZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
YXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgICAgICBpbnQgbWluVmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46
Om1pbigpOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VmFsdWUgPSBzdGQ6Om51bWVyaWNf
bGltaXRzPGludD46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hp
cCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAg
bWluVmFsdWUgPSBzdGQ6Om1heChtaW5WYWx1ZSwgcmVsYXRpb25zaGlwLm1pblZhbHVlT2ZMZWZ0
KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBzdGQ6Om1pbihtYXhWYWx1
ZSwgcmVsYXRpb25zaGlwLm1heFZhbHVlT2ZMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoc3VtT3ZlcmZs
b3dzKG1pblZhbHVlLCBub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpKSB8fAorICAgICAgICAgICAg
ICAgICAgICAgICAgc3VtT3ZlcmZsb3dzKG1heFZhbHVlLCBub2RlLT5jaGlsZDIoKS0+YXNJbnQz
MigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUoYmxvY2stPmF0KG5vZGVJbmRleCkp
OworICAgICAgICAgICAgICAgICAgICBub2RlLT5zZXRBcml0aE1vZGUoQXJpdGg6OlVuY2hlY2tl
ZCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIGNhc2UgQ2hlY2tJbkJvdW5kczogeworICAgICAgICAgICAgICAgICAgICBh
dXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkpOwor
ICAgICAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBtX3JlbGF0aW9uc2hpcHMuZW5kKCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgICAgIGJvb2wgbm9uTmVnYXRpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAgICAgYm9vbCBsZXNzVGhhbkxlbmd0aCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBm
b3IgKFJlbGF0aW9uc2hpcCByZWxlYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAubWluVmFsdWVPZkxlZnQoKSA+PSAwKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAucmlnaHQoKSA9PSBub2RlLT5jaGlsZDIo
KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCgp
ID09IEVxdWFsICYmIHJlbGF0aW9uc2hpcC5vZmZzZXQoKSA8IDApCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGxlc3NUaGFuTGVuZ3RoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBlbHNlIGlmIChyZWxhdGlvbnNoaXAua2luZCgpID09IExlc3NUaGFuICYmICFy
ZWxhdGlvbnNoaXAub2Zmc2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxl
c3NUaGFuTGVuZ3RoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
aWYgKGxlc3NUaGFuTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTm9k
ZShibG9jay0+YXQobm9kZUluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5y
ZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGNoYW5n
ZWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgZXhlY3V0ZU5vZGUoTm9kZSogbm9kZSkK
KyAgICB7CisgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgeworICAgICAgICBjYXNlIENoZWNr
SW5Cb3VuZHM6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAobV9u
b2RlLT5jaGlsZDEoKS5ub2RlKCksIG1fbm9kZS0+Y2hpbGQyKCkubm9kZSgpLCBSZWxhdGlvbnNo
aXA6Okxlc3NUaGFuKSk7CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoUmVsYXRpb25zaGlw
KG1fbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRo
YW4sIC0xKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgIGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIG9ubHkgaW50ZXJl
c3RlZCBpbiBpbnQzMiBhZGRpdGlvbnMgYW5kIHdlIGN1cnJlbnRseSBvbmx5IGtub3cgaG93IHRv
CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIG5vbi13cmFwcGluZyBvbmVzLgorICAgICAgICAg
ICAgaWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBGSVhNRTogV2UgY291bGQgaGFu
ZGxlIHRoZSB1bmNoZWNrZWQgYXJpdGhtZXRpYyBjYXNlLiBXZSBqdXN0IGRvIGl0IGRvbid0IHJp
Z2h0CisgICAgICAgICAgICAvLyBub3cuCisgICAgICAgICAgICBpZiAobm9kZS0+YXJpdGhNb2Rl
KCkgIT0gQXJpdGg6OkNoZWNrT3ZlcmZsb3cpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIC8vIEhhbmRsZSBhZGQ6IEB2YWx1ZSArIGNvbnN0YW50Lgor
ICAgICAgICAgICAgaWYgKCFub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBvZmZzZXQg
PSBub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpOworICAgICAgICAgICAgCisgICAgICAgICAgICAv
LyBXZSBhZGQgYSByZWxhdGlvbnNoaXAgZm9yIEBhZGQgPT0gQHZhbHVlICsgY29uc3RhbnQsIGFu
ZCB0aGVuIHdlIGNvcHkgdGhlCisgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIGZvciBAdmFs
dWUuIFRoaXMgZ2l2ZXMgdXMgYSBvbmUtZGVlcCB2aWV3IG9mIEB2YWx1ZSdzIGV4aXN0aW5nCisg
ICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLCB3aGljaCBtYXRjaGVzIHRoZSBvbmUtZGVlcCBz
ZWFyY2ggaW4gc2V0UmVsYXRpb25zaGlwKCkuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNl
dFJlbGF0aW9uc2hpcChub2RlLCBub2RlLT5jaGlsZDEoKS5ub2RlKCksIFJlbGF0aW9uc2hpcDo6
RXF1YWwsIG9mZnNldCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1f
cmVsYXRpb25zaGlwcy5maW5kKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICBp
ZiAoaXRlciAhPSBtX3JlbGF0aW9uc2hpcHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBWZWN0
b3I8UmVsYXRpb25zaGlwPiB0b0FkZDsKKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hp
cCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBSZWxh
dGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAg
ICAgICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKG5ld1JlbGF0aW9uc2hpcC5hZGRUb09mZnNldChvZmZzZXQpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IHRvQWRk
KQorICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwLCAwKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTm93IHdlIHdhbnQg
dG8gZXN0YWJsaXNoIHRoYXQgYm90aCB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgb2YgdGhlIGFk
ZGl0aW9uIGFyZQorICAgICAgICAgICAgLy8gd2l0aGluIGEgcGFydGljdWxhciByYW5nZSBvZiBp
bnRlZ2Vycy4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIHsKKyAg
ICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSArIDEiIHRoZW4gd2Uga25v
dyB0aGF0IEB2YWx1ZSA8PSBtYXggLSAxLCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBA
dmFsdWUgPCBtYXguCisgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAg
ICAgICAgICAgICBub2RlLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgTGVzc1RoYW4sCisgICAg
ICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSBvZmZzZXQg
KyAxLCAwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZl
ICJhZGQ6IEB2YWx1ZSArIDEiIHRoZW4gd2Uga25vdyB0aGF0IEBhZGQgPj0gbWluICsgMSwgaS5l
LiB0aGF0CisgICAgICAgICAgICAgICAgLy8gQGFkZCA+IG1pbi4KKyAgICAgICAgICAgICAgICBz
ZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIG1femVybywgR3JlYXRl
clRoYW4sCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bXVtZXJpY19saW1pdHM8aW50Pjo6bWlu
KCkgKyBvZmZzZXQgLSAxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJh
ZGQ6IEB2YWx1ZSAtIDEiIHRoZW4gd2Uga25vdyB0aGF0IEB2YWx1ZSA+PSBtaW4gKyAxLCBpLmUu
IHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAdmFsdWUgPiBtaW4uCisgICAgICAgICAgICAgICAg
c2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICBub2RlLT5jaGlsZDEoKS5ub2Rl
KCksIG1femVybywgR3JlYXRlclRoYW4sCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJp
Y19saW1pdHM8aW50Pjo6bWluKCkgKyBvZmZzZXQgLSAxLCAwKTsKKyAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSAtMSAxIiB0aGVuIHdl
IGtub3cgdGhhdCBAYWRkIDw9IG1heCAtIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8v
IEBhZGQgPCBtYXguCisgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAg
ICAgICAgICAgICBub2RlLCBtX3plcm8sIExlc3NUaGFuLAorICAgICAgICAgICAgICAgICAgICBz
dGQ6Om11bWVyaWNfbGltaXRzPGludD46Om1heCgpIC0gb2Zmc2V0ICsgMSwgMCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChu
b2RlLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIC0xKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBVcHNpbG9uOiB7
CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgUmVsYXRpb25z
aGlwKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+cGhpKCksIFJlbGF0aW9uc2hpcDo6RXF1
YWwsIDApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlv
bnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChpdGVy
ICE9IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxSZWxh
dGlvbnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0
aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hp
cCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIG5l
d1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG5vZGUtPnBoaSgpKTsKKyAgICAgICAgICAgICAgICAgICAg
dG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IHRvQWRkKQorICAgICAg
ICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IHZvaWQgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAsIHVuc2lnbmVk
IHRpbWVUb0xpdmUgPSAxKQorICAgIHsKKyAgICAgICAgc2V0UmVsYXRpb25zaGlwKG1fcmVsYXRp
b25zaGlwcywgcmVsYXRpb25zaGlwLCB0aW1lVG9MaXZlKTsKKyAgICB9CisgICAgCisgICAgdm9p
ZCBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgIFJlbGF0aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlw
TWFwLCBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkK
KyAgICB7CisgICAgICAgIGF1dG8gc2V0T25lU2lkZSA9IFsmXSAoUmVsYXRpb25zaGlwIHJlbGF0
aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSkgeworICAgICAgICAgICAgYXV0byByZXN1bHQg
PSByZWxhdGlvbnNoaXBNYXAuYWRkKAorICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5sZWZ0
KCksIFZlY3RvcjxSZWxhdGlvbnNoaXA+KCkpOworICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9u
c2hpcD4mIHJlbGF0aW9uc2hpcHMgPSByZXN1bHQuaXRlcmF0b3ItPnZhbHVlOworICAgICAgICAg
ICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgICAgICBib29sIGZvdW5kID0g
ZmFsc2U7CisgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCYgb3RoZXJSZWxhdGlvbnNoaXAg
OiByZWxhdGlvbnNoaXBzKSB7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyUmVsYXRpb25zaGlw
LnNhbWVOb2Rlc0FzKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFJl
bGF0aW9uc2hpcCBmaWx0ZXJlZCA9IG90aGVyUmVsYXRpb25zaGlwLmZpbHRlcihyZWxhdGlvbnNo
aXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdGhlclJlbGF0aW9uc2hpcCA9IGZpbHRl
cmVkOworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYg
b3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAgICAg
ICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9IG90aGVyUmVsYXRp
b25zaGlwOworICAgICAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChvdGhl
clJlbGF0aW9uc2hpcC5yaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlbGF0
aW9uc2hpcC5hZGRUb09mZnNldChvdGhlclJlbGF0aW9uc2hpcC5vZmZzZXQoKSkpCisgICAgICAg
ICAgICAgICAgICAgICAgICB0b0FkZC5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgh
Zm91bmQpCisgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwcy5hcHBlbmQocmVsYXRpb25zaGlw
KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgYW5vdGhlclJl
bGF0aW9uc2hpcCA6IHRvQWRkKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHRpbWVUb0xpdmUp
OworICAgICAgICAgICAgICAgIHNldE9uZVNpZGUoYW5vdGhlclJlbGF0aW9uc2hpcCwgdGltZVRv
TGl2ZSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICAKKyAgICAgICAg
c2V0T25lU2lkZShyZWxhdGlvbnNoaXAsIHRpbWVUb0xpdmUpOworICAgICAgICBzZXRPbmVTaWRl
KHJlbGF0aW9uc2hpcC5mbGlwcGVkKCksIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICBi
b29sIG1lcmdlVG8oUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBNYXAsIEJhc2ljQmxvY2sq
IHRhcmdldCkKKyAgICB7CisgICAgICAgIGlmIChtX3NlZW5CbG9ja3MuYWRkKHRhcmdldCkpIHsK
KyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgYmxvY2suIFdlIGNvcHkgc3ViamVjdCB0byBs
aXZlbmVzcyBwcnVuaW5nLgorICAgICAgICAgICAgYXV0byBpc0xpdmUgPSBbJl0gKE5vZGUqIG5v
ZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBtX3plcm8pCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQtPnNzYS0+
bGl2ZUF0SGVhZC5jb250YWlucyhub2RlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiByZWxhdGlvbnNoaXBNYXApIHsKKyAgICAg
ICAgICAgICAgICBpZiAoIWlzTGl2ZShlbnRyeS5rZXkpKQorICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWZWN0b3I8UmVsYXRp
b25zaGlwTWFwPiB2YWx1ZXM7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVs
YXRpb25zaGlwIDogZW50cnkudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHJl
bGF0aW9uc2hpcC5sZWZ0KCkgPT0gZW50cnkua2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KGlzTGl2ZShyZWxhdGlvbnNoaXAucmlnaHQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB2
YWx1ZXMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVz
LmVuZCgpKTsKKyAgICAgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5h
ZGQoZW50cnkua2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1lcmdlIGJ5IGludGVyc2Vj
dGluZy4gV2UgaGF2ZSBubyBub3Rpb24gb2YgQk9UVE9NLCBzbyB3ZSB1c2UgdGhlIG9taXNzaW9u
IG9mCisgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgZm9yIGEgcGFpciBvZiBub2RlcyB0byBtZWFu
IFRPUC4gVGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3QgbmVlZCBCT1RUT00KKyAgICAgICAgLy8gaXMg
KDEpIHdlIGp1c3Qgb3ZlcmFwcHJveGltYXRlIGNvbnRyYWRpY3Rpb25zIGFuZCAoMikgYSB2YWx1
ZSBuZXZlciBoYXZpbmcgYmVlbgorICAgICAgICAvLyBhc3NpZ25lZCB3b3VsZCBvbmx5IGhhcHBl
biBpZiB3ZSBoYXZlIG5vdCBwcm9jZXNzZWQgdGhlIG5vZGUncyBwcmVkZWNlc3Nvci4gV2UKKyAg
ICAgICAgLy8gc2hvdWxkbid0IHByb2Nlc3MgYmxvY2tzIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2Vk
IHRoZSBibG9jaydzIHByZWRlY2Vzc29yIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gYXJlIHVzaW5n
IFJQTy4KKyAgICAgICAgVmVjdG9yPE5vZGUqPiB0b1JlbW92ZTsKKyAgICAgICAgYm9vbCBjaGFu
Z2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3JlbGF0aW9uc2hpcHNB
dEhlYWRbdGFyZ2V0XSkgeworICAgICAgICAgICAgaXRlciBpdGVyID0gcmVsYXRpb25zaGlwTWFw
LmZpbmQoZW50cnkua2V5KTsKKyAgICAgICAgICAgIGlmIChpdGVyID09IHJlbGF0aW9uc2hpcE1h
cC5lbmQoKSkgeworICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChlbnRyeS5rZXkpOwor
ICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBWZWN0b3I8UmVsYXRp
b25zaGlwPiB2YWx1ZXM7CisgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCB0YXJnZXRSZWxh
dGlvbnNoaXAgOiBlbnRyeS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25z
aGlwIHNvdXJjZVJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAg
ICAgIHRhcmdldFJlbGF0aW9uc2hpcC5tZXJnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNv
dXJjZVJlbGF0aW9uc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmXSAoUmVsYXRpb25z
aGlwIG5ld1JlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVl
cy5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c29ydCh2
YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS52YWx1
ZSA9PSB2YWx1ZXMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWVzOworICAgICAgICAgICAgY2hhbmdlZCA9IHRy
dWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChOb2RlKiBub2RlIDogdG9SZW1vdmUpCisgICAg
ICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5yZW1vdmUobm9kZSk7CisgICAg
ICAgIAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisgICAgCisgICAgTm9kZSogbV96
ZXJvOworICAgIFJlbGF0aW9uc2hpcE1hcCBtX3JlbGF0aW9uc2hpcHM7CisgICAgQmxvY2tTZXQg
bV9zZWVuQmxvY2tzOworICAgIEJsb2NrTWFwPFJlbGF0aW9uc2hpcE1hcD4gbV9yZWxhdGlvbnNo
aXBzQXRIZWFkOworICAgIEluc2VydGlvblNldCBtX2luc2VydGlvblNldDsKK307CisgICAgCit9
IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworYm9vbCBwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1p
emF0aW9uKEdyYXBoJiBncmFwaCkKK3sKKyAgICBTYW1wbGluZ1JlZ2lvbiBzYW1wbGluZ1JlZ2lv
bigiREZHIEludGVnZXIgUmFuZ2UgT3B0aW1pemF0aW9uIFBoYXNlIik7CisgICAgcmV0dXJuIHJ1
blBoYXNlPEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlPihncmFwaCk7Cit9CisKK30gfSAv
LyBuYW1lc3BhY2UgSlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJMRShERkdfSklUKQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254595</attachid>
            <date>2015-06-09 13:07:38 -0700</date>
            <delta_ts>2015-06-09 13:30:58 -0700</delta_ts>
            <desc>starting to do things</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>44009</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODUzNjkpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBD
MTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdC
cmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0
OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBE
RkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1
cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8q
IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBE
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIy
NzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5
RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAg
Ki87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAw
RUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1v
dmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3Bw
ICovOyB9OwpAQCAtMjE2MSw2ICsyMTYzLDggQEAKIAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlB
IC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUg
PSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8q
IEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVj
b2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUy
M0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBw
YXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdl
T3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1l
ID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJS
YW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1p
emF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURG
MDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9j
aC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0g
ZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFE
RjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRo
ID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtNDk5Myw2ICs0OTk3LDggQEAKIAkJCQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUg
LyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0
MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBG
MzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5o
ICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjEx
OTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAog
CQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVj
dGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENv
ZGUuY3BwICovLApAQCAtNTYzMCw2ICs1NjM2LDcgQEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4
NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4g
SGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJh
bmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZC
REUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4
MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8s
CkBAIC03MzcwLDYgKzczNzcsNyBAQAogCQkJCTBGMkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBK
U0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0
MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEz
NTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4
OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0Jv
dW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVG
MDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQw
Rjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2Vz
ICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDkyNiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCIKKworI2lmIEVOQUJMRShERkdf
SklUKQorCisjaW5jbHVkZSAiREZHQmxvY2tNYXBJbmxpbmVzLmgiCisjaW5jbHVkZSAiREZHR3Jh
cGguaCIKKyNpbmNsdWRlICJERkdJbnNlcnRpb25TZXQuaCIKKyNpbmNsdWRlICJERkdQaGFzZS5o
IgorI2luY2x1ZGUgIkRGR1ByZWRpY3Rpb25Qcm9wYWdhdGlvblBoYXNlLmgiCisjaW5jbHVkZSAi
REZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5oIgorI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgeworCituYW1lc3BhY2UgeworCitjb25zdCBi
b29sIHZlcmJvc2UgPSB0cnVlOworCitpbnQ2NF90IGNsYW1wZWRTdW1JbXBsKCkgeyByZXR1cm4g
MDsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgoraW50NjRfdCBjbGFtcGVkU3VtSW1w
bChpbnQgbGVmdCwgQXJncy4uLiBhcmdzKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2
NF90PihsZWZ0KSArIGNsYW1wZWRTdW1JbXBsKGFyZ3MuLi4pOworfQorCit0ZW1wbGF0ZTx0eXBl
bmFtZS4uLiBBcmdzPgoraW50IGNsYW1wZWRTdW0oQXJncy4uLiBhcmdzKQoreworICAgIGludDY0
X3QgcmVzdWx0ID0gY2xhbXBlZFN1bUltcGwoYXJncy4uLik7CisgICAgcmV0dXJuIHN0ZDo6bWlu
KAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46
Om1heCgpKSwKKyAgICAgICAgc3RkOjptYXgoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2
NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpKSwKKyAgICAgICAgICAgIHJlc3Vs
dCkpOworfQorCitjbGFzcyBSZWxhdGlvbnNoaXAgeworcHVibGljOgorICAgIGVudW0gS2luZCB7
CisgICAgICAgIExlc3NUaGFuLAorICAgICAgICBFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4K
KyAgICB9OworICAgIAorICAgIHN0YXRpYyBLaW5kIGludmVyc2UoS2luZCBraW5kKQorICAgIHsK
KyAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAg
ICAgICByZXR1cm4gR3JlYXRlclRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAg
ICByZXR1cm4gRXF1YWw7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBy
ZXR1cm4gTGVzc1RoYW47CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9u
c2hpcCgpCisgICAgICAgIDogbV9sZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxs
cHRyKQorICAgICAgICAsIG1fa2luZChFcXVhbCkKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0
LCBLaW5kIGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgICAgICA6IG1fbGVmdChsZWZ0KQorICAg
ICAgICAsIG1fcmlnaHQocmlnaHQpCisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwg
bV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0KTsK
KyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9yaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KG1fbGVmdCAhPSBtX3JpZ2h0KTsKKyAgICB9CisgICAgCisgICAgdHlwZWRlZiB2b2lkKiAoUmVs
YXRpb25zaGlwOjoqVW5zcGVjaWZpZWRCb29sVHlwZSk7CisKKyAgICBvcGVyYXRvciBVbnNwZWNp
ZmllZEJvb2xUeXBlKigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID8gcmVp
bnRlcnByZXRfY2FzdDxVbnNwZWNpZmllZEJvb2xUeXBlKj4oMSkgOiAwOworICAgIH0KKyAgICAK
KyAgICBOb2RlKiBsZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sZWZ0OyB9CisgICAgTm9kZSogcmln
aHQoKSBjb25zdCB7IHJldHVybiBtX3JpZ2h0OyB9CisgICAgS2luZCBraW5kKCkgY29uc3QgeyBy
ZXR1cm4gbV9raW5kOyB9CisgICAgaW50IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0
OyB9CisgICAgCisgICAgUmVsYXRpb25zaGlwIGZsaXBwZWQoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgaWYgKCEqdGhpcykKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAg
ICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX3JpZ2h0LCBtX2xlZnQsIGludmVyc2UobV9raW5kKSwg
LW1fb2Zmc2V0KTsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwIGludmVyc2UoKSBjb25z
dAorICAgIHsKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDoK
KyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgY2FzZSBMZXNzVGhh
bjoKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihtX29mZnNldCwgLTEpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBHcmVhdGVyVGhhbiwgbV9vZmZzZXQgLSAxKTsK
KyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8
aW50PihtX29mZnNldCwgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgp
OworICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NU
aGFuLCBtX29mZnNldCArIDEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKyAgICAKKyAgICBib29sIGlzQ2Fub25pY2Fs
KCkgY29uc3QgeyByZXR1cm4gbV9sZWZ0IDwgbV9yaWdodDsgfQorICAgIAorICAgIFJlbGF0aW9u
c2hpcCBjYW5vbmljYWwoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzQ2Fub25pY2FsKCkp
CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIHJldHVybiBmbGlwcGVkKCk7Cisg
ICAgfQorICAgIAorICAgIGJvb2wgc2FtZU5vZGVzQXMoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhl
cikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xlZnQgPT0gb3RoZXIubV9sZWZ0Cisg
ICAgICAgICAgICAmJiBtX3JpZ2h0ID09IG90aGVyLm1fcmlnaHQ7CisgICAgfQorICAgIAorICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHNhbWVOb2Rlc0FzKG90aGVyKQorICAgICAgICAgICAgJiYgbV9raW5k
ID09IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZz
ZXQ7CisgICAgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJlbGF0aW9uc2hpcCYg
b3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9sZWZ0ICE9IG90aGVyLm1fbGVmdCkK
KyAgICAgICAgICAgIHJldHVybiBtX2xlZnQgPCBvdGhlci5tX2xlZnQ7CisgICAgICAgIGlmICht
X3JpZ2h0ICE9IG90aGVyLm1fcmlnaHQpCisgICAgICAgICAgICByZXR1cm4gbV9yaWdodCA8IG90
aGVyLm1fcmlnaHQ7CisgICAgICAgIGlmIChtX2tpbmQgIT0gb3RoZXIubV9raW5kKQorICAgICAg
ICAgICAgcmV0dXJuIG1fa2luZCA8IG90aGVyLm1fa2luZDsKKyAgICAgICAgcmV0dXJuIG1fb2Zm
c2V0IDwgb3RoZXIubV9vZmZzZXQ7CisgICAgfQorICAgIAorICAgIC8vIElmIHBvc3NpYmxlLCBy
ZXR1cm5zIGEgZm9ybSBvZiB0aGlzIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUgZ2l2ZW4gbm9kZSBp
cyB0aGUgbGVmdAorICAgIC8vIHNpZGUuIFJldHVybnMgYSBudWxsIHJlbGF0aW9uc2hpcCBpZiB0
aGlzIHJlbGF0aW9uc2hpcCBjYW5ub3Qgc2F5IGFueXRoaW5nIGFib3V0IHRoaXMKKyAgICAvLyBu
b2RlLgorICAgIFJlbGF0aW9uc2hpcCBmb3JOb2RlKE5vZGUqIG5vZGUpIGNvbnN0CisgICAgewor
ICAgICAgICBpZiAobV9sZWZ0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7Cisg
ICAgICAgIGlmIChtX3JpZ2h0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gZmxpcHBlZCgp
OworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgfQorICAgIAorICAgIHZvaWQg
c2V0TGVmdChOb2RlKiBsZWZ0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobGVmdCAh
PSBtX3JpZ2h0KTsKKyAgICAgICAgbV9sZWZ0ID0gbGVmdDsKKyAgICB9CisgICAgYm9vbCBhZGRU
b09mZnNldChpbnQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+
KG1fb2Zmc2V0LCBvZmZzZXQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBt
X29mZnNldCArPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgbWVyZ2UoY29uc3QgUmVsYXRp
b25zaGlwJiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChtX2tpbmQgPT0gR3JlYXRlclRoYW4gfHwgKG1fa2luZCAhPSBMZXNzVGhhbiAmJiBv
dGhlci5tX2tpbmQgPT0gR3JlYXRlclRoYW4pKSB7CisgICAgICAgICAgICAvLyBSZXVzZSB0aGUg
ZmFjdCB0aGF0IHdlIGFscmVhZHkgaGF2ZSBoYW5kbGluZyBmb3IgTGVzc1RoYW4ubWVyZ2UoLi4u
KS4gV2UgY2FuIHVzZQorICAgICAgICAgICAgLy8gdGhhdCBjb2RlIGJ5IGZsaXBwaW5nIHRoZSBy
ZWxhdGlvbnNoaXBzIGFyb3VuZC4KKyAgICAgICAgICAgIGZsaXBwZWQoKS5tZXJnZUltcGwoCisg
ICAgICAgICAgICAgICAgb3RoZXIuZmxpcHBlZCgpLAorICAgICAgICAgICAgICAgIFsmXSAoUmVs
YXRpb25zaGlwIHJlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKHJl
bGF0aW9uc2hpcC5mbGlwcGVkKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtZXJnZUltcGwob3RoZXIsIGZ1
bmN0b3IpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIGEgbnVsbCByZWxhdGlvbnNoaXAg
aWYgdGhlIGZpbHRyYXRpb24gc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyB0d28gZGlmZmVyZW50Cisg
ICAgLy8gcmVsYXRpb25zaGlwcy4KKyAgICBSZWxhdGlvbnNoaXAgZmlsdGVyKGNvbnN0IFJlbGF0
aW9uc2hpcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICAvLyBXZSBhcmUgb25seSBpbnRl
cmVzdGVkIGluIG1lcmdpbmcgcmVsYXRpb25zaGlwcyBvdmVyIHRoZSBzYW1lIG5vZGVzLgorICAg
ICAgICBBU1NFUlQoc2FtZU5vZGVzQXMob3RoZXIpKTsKKyAgICAgICAgCisgICAgICAgIGlmICgq
dGhpcyA9PSBvdGhlcikKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgCisgICAg
ICAgIC8vIFdlIHdhbnQgZXF1YWxpdHkgdG8gdGFrZSBwcmVjZWRlbnQgb3ZlciBldmVyeXRoaW5n
IGVsc2UuCisgICAgICAgIGlmIChtX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4g
KnRoaXM7CisgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICBy
ZXR1cm4gb3RoZXI7CisgICAgICAgIAorICAgICAgICAvLyBGcm9tIGhlcmUgd2UgY2FuIGFzc3Vt
ZSB0aGF0IHRoZSB0d28gcmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50aWNhbC4gVXN1YWxseSB3
ZSB1c2UKKyAgICAgICAgLy8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBkaWZmZXJlbnQgb2Zmc2V0
cyBhbnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBpcworICAgICAgICAvLyBp
ZGVudGljYWwuCisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKSB7Cisg
ICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgbV9sZWZ0LCBtX3Jp
Z2h0LCBMZXNzVGhhbiwgc3RkOjptaW4obV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFTU0VSVChvdGhlci5tX2tpbmQg
PT0gR3JlYXRlclRoYW4pOworICAgICAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG1fb2Zm
c2V0LCAtMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAg
ICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG90aGVyLm1fb2Zmc2V0LCAxKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICBpZiAobV9vZmZzZXQg
LSAxID09IG90aGVyLm1fb2Zmc2V0ICsgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRp
b25zaGlwKG1fbGVmdCwgbV9yaWdodCwgRXF1YWwsIG1fb2Zmc2V0IC0gMSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgQVNTRVJUKG1fa2luZCA9PSBHcmVhdGVyVGhhbik7CisgICAgICAgIHJldHVy
biBmbGlwcGVkKCkuZmlsdGVyKG90aGVyLmZsaXBwZWQoKSkuZmxpcHBlZCgpOworICAgIH0KKyAg
ICAKKyAgICBpbnQgbWluVmFsdWVPZkxlZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1f
bGVmdC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5hc0lu
dDMyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKQorICAgICAg
ICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIAor
ICAgICAgICBpbnQgbWluUmlnaHRWYWx1ZTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50MzJD
b25zdGFudCgpKQorICAgICAgICAgICAgbWluUmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIo
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWluUmlnaHRWYWx1ZSA9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IEdy
ZWF0ZXJUaGFuKQorICAgICAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1ZSwg
bV9vZmZzZXQsIDEpOworICAgICAgICByZXR1cm4gY2xhbXBlZFN1bShtaW5SaWdodFZhbHVlLCBt
X29mZnNldCk7CisgICAgfQorICAgIAorICAgIGludCBtYXhWYWx1ZU9mTGVmdCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAobV9sZWZ0LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAg
IHJldHVybiBtX2xlZnQtPmFzSW50MzIoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQg
PT0gR3JlYXRlclRoYW4pCisgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxp
bnQ+OjptYXgoKTsKKyAgICAgICAgCisgICAgICAgIGludCBtYXhSaWdodFZhbHVlOworICAgICAg
ICBpZiAobV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICBtYXhSaWdodFZh
bHVlID0gbV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhS
aWdodFZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgCisg
ICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pCisgICAgICAgICAgICByZXR1cm4gY2xhbXBl
ZFN1bShtYXhSaWdodFZhbHVlLCBtX29mZnNldCwgLTEpOworICAgICAgICByZXR1cm4gY2xhbXBl
ZFN1bShtYXhSaWdodFZhbHVlLCBtX29mZnNldCk7CisgICAgfQorICAgIAorICAgIHZvaWQgZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gVGhpcyBwcmludHMg
b3V0IHRoZSByZWxhdGlvbnNoaXAgd2l0aG91dCBhbnkgd2hpdGVzcGFjZSwgbGlrZSBAeDxAeSs0
Mi4gVGhpcworICAgICAgICAvLyBvcHRpbWl6ZXMgZm9yIHRoZSBjbGFyaXR5IG9mIGEgbGlzdCBv
ZiByZWxhdGlvbnNoaXBzLiBJdCdzIGVhc2llciB0byByZWFkIHNvbWV0aGluZworICAgICAgICAv
LyBsaWtlIFtAMTxAMiszLCBAND09QDUtNl0gdGhhbiBpdCB3b3VsZCBiZSBpZiB0aGVyZSB3YXMg
d2hpdGVzcGFjZSBpbnNpZGUgdGhlCisgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuCisgICAgICAg
IAorICAgICAgICBvdXQucHJpbnQobV9sZWZ0KTsKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsK
KyAgICAgICAgY2FzZSBMZXNzVGhhbjoKKyAgICAgICAgICAgIG91dC5wcmludCgiPCIpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICBvdXQucHJp
bnQoIj09Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoK
KyAgICAgICAgICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgb3V0LnByaW50KG1fcmlnaHQpOworICAgICAgICBpZiAobV9vZmZzZXQgPiAw
KQorICAgICAgICAgICAgb3V0LnByaW50KCIrIiwgbV9vZmZzZXQpOworICAgICAgICBlbHNlIGlm
IChtX29mZnNldCA8IDApCisgICAgICAgICAgICBvdXQucHJpbnQoIi0iLCAtc3RhdGljX2Nhc3Q8
aW50NjRfdD4obV9vZmZzZXQpKTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIHRlbXBsYXRl
PHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZUltcGwoY29uc3QgUmVsYXRpb25zaGlw
JiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIGlm
ICghc2FtZU5vZGVzQXMob3RoZXIpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAg
ICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gZ3VhcmFudGVlIHRoYXQ6
CisgICAgICAgIC8vCisgICAgICAgIC8vIC0gV2UgYXZvaWQgaGF2aW5nIG1vcmUgdGhhbiBvbmUg
UmVsYXRpb25zaGlwIG92ZXIgdGhlIHNhbWUgdHdvIG5vZGVzLiBUaGVyZWZvcmUsIGlmCisgICAg
ICAgIC8vICAgdGhlIG1lcmdlIGNvdWxkIGJlIGV4cHJlc3NlZCBhcyB0d28gUmVsYXRpb25zaGlw
cywgd2UgcHJlZmVyIHRvIGluc3RlYWQgcGljayB0aGUKKyAgICAgICAgLy8gICBsZXNzIHByZWNp
c2Ugc2luZ2xlIFJlbGF0aW9uc2hpcCBmb3JtIGV2ZW4gaWYgdGhhdCBtZWFucyBUT1AuIE9uZSBl
eGNlcHRpb24gdG8KKyAgICAgICAgLy8gICB0aGlzIGlzIHRoYXQgd2UgQGEgPT0gQGIgKyBDIGFu
ZCBAYSA9PSBAYiArIEQgaW50byBAYSA+IEBiICsgQyAtIDEgYW5kCisgICAgICAgIC8vICAgQGEg
PCBAYiArIEQgKyAxLiAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiB0aGUgZGlmZmVyZW5j
ZSBiZXR3ZWVuIHR3byBSZWxhdGlvbnNoaXBzIGlzIGp1c3QgdGhlIG1fb2Zmc2V0LCB0aGVuIHdl
IGNyZWF0ZSBhCisgICAgICAgIC8vICAgUmVsYXRpb25zaGlwIHRoYXQgaGFzIGFuIG9mZnNldCBv
ZiAtMSwgMCwgb3IgMS4gVGhpcyBpcyBhbiBlc3NlbnRpYWwgY29udmVyZ2VuY2UKKyAgICAgICAg
Ly8gICBoYWNrLiBXZSBuZWVkIC0xIGFuZCAxIHRvIHN1cHBvcnQgPD0gYW5kID49LiBUaGlzIG92
ZXJyaWRlcyB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gICBleGNlcHRpb24uIEZvciBleGFtcGxl
LCB3ZSB3b3VsZG4ndCBhZGQgYSBAYSA8IEBiICsgRCArIDEgcmVsYXRpb25zaGlwIGlmIEQgKyAx
CisgICAgICAgIC8vICAgd2FzIG5vdCBlcXVhbCB0byBvbmUgb2YgLTEsIDAsIDEuCisgICAgICAg
IC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgUmVsYXRpb25zaGlwKCkgdG8gbWVhbiBU
T1AuCisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGUgcmVsYXRpb25zaGlwcyBhcmUgaWRlbnRp
Y2FsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIGxlZnQgdG8gZG8uCisgICAgICAgIGlmICgqdGhpcyA9
PSBvdGhlcikgeworICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZyb20gaGVyZSB3ZSBjYW4gYXNz
dW1lIHRoYXQgdGhlIHR3byByZWxhdGlvbnNoaXBzIGFyZSBub3QgaWRlbnRpY2FsLiBVc3VhbGx5
IHdlIHVzZQorICAgICAgICAvLyB0aGlzIHRvIGFzc3VtZSB0aGF0IHdlIGRpZmZlcmVudCBvZmZz
ZXRzIGFueXRpbWUgdGhhdCBldmVyeXRoaW5nIGJ1dCB0aGUgb2Zmc2V0IGlzCisgICAgICAgIC8v
IGlkZW50aWNhbC4KKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pIHsK
KyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAg
ICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgb2Zmc2V0IHRvIHNlbGVjdCB0byBtZXJnZSB0aGVtLiBU
aGUgYXBwcm9wcmlhdGUgb2Zmc2V0cyBhcmUKKyAgICAgICAgICAgICAgICAvLyAtMSwgMCwgb3Ig
MS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBmaWd1cmUgb3V0
IHdoYXQgb2Zmc2V0IHdlJ2QgbGlrZSB0byB1c2UuCisgICAgICAgICAgICAgICAgaW50IGJlc3RP
ZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRoaW5nIGxpa2UgQGEgPCBAYiAr
IDIuIFdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHVuZGVyIHRoZQorICAgICAgICAgICAgICAgIC8v
IC0xLDAsMSBydWxlLgorICAgICAgICAgICAgICAgIGlmIChiZXN0T2Zmc2V0IDw9IDEpCisgICAg
ICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVz
c1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkpOworICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkgeworICAgICAgICAgICAgICAgIC8vIFRo
aXMgaXMgdGhlIHJlYWxseSBpbnRlcmVzdGluZyBjYXNlLiBXZSBoYXZlOgorICAgICAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBDCisgICAgICAgICAgICAg
ICAgLy8KKyAgICAgICAgICAgICAgICAvLyBhbmQ6CisgICAgICAgICAgICAgICAgLy8KKyAgICAg
ICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIgKyBECisgICAgICAgICAgICAgICAgLy8KKyAgICAg
ICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UnZCBsaWtlIHRvIHJldHVybjoKKyAgICAgICAgICAg
ICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICBAYSA8IEBiICsgbWF4KEMsIEQgKyAxKQor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjpt
YXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgLy8gV2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBAYSA8IEBiICsgMi4gV2UgY2Fu
J3QgZG8gaXQuCisgICAgICAgICAgICAgICAgaWYgKGJlc3RPZmZzZXQgPD0gMSkKKyAgICAgICAg
ICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhh
biwgc3RkOjptYXgoYmVzdE9mZnNldCwgLTEpKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAg
ICBBU1NFUlQob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBFcXVhbCkgewor
ICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkgeworICAgICAgICAgICAgICAg
IC8vIFdlIGhhdmUgQGEgPT0gQGIgKyBDIGFuZCBAYSA9PSBAYiArIEQsIHdoZXJlIEMgIT0gRC4g
VHVybiB0aGlzIGludG8gc29tZQorICAgICAgICAgICAgICAgIC8vIGluZXF1YWxpdHkgdGhhdCBp
bnZvbHZlcyBhIGNvbnN0YW50IHRoYXQgaXMgLTEsMCwxLgorICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIGF1dG8gbWVyZ2VUb0xlc3NUaGFuID0gW10gKFJlbGF0aW9uc2hpcCBhLCBS
ZWxhdGlvbnNoaXAgYikgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYS5zYW1lTm9kZXNB
cyhiKSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBJZiB3
ZSBoYXZlOgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyAg
ICAgQGEgPT0gQGIgKyBDIHx8IEBhID09IEBiICsgRAorICAgICAgICAgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIHdlIGNvdWxkIGFsdGVybmF0aXZlbHkgc2F5Ogor
ICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyAgICAgQGEgPCBA
YiArIG1heChDLCBEKSArIDEKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgIFJlbGF0aW9uc2hpcCByZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICBhLmxlZnQo
KSwgYS5yaWdodCgpLCBMZXNzVGhhbiwgc3RkOjptYXgoYS5vZmZzZXQoKSwgYi5vZmZzZXQoKSkg
KyAxKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1
bHQub2Zmc2V0KCkgPCAtMSB8fCByZXN1bHQub2Zmc2V0KCkgPiAxKQorICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9OworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChSZWxhdGlvbnNoaXAgbGVzc1RoYW4g
PSBtZXJnZVRvTGVzc1RoYW4oKnRoaXMsIG90aGVyKSkKKyAgICAgICAgICAgICAgICAgICAgZnVu
Y3RvcihsZXNzVGhhbik7CisgICAgICAgICAgICAgICAgaWYgKFJlbGF0aW9uc2hpcCBmbGlwcGVk
R3JlYXRlclRoYW4gPSBtZXJnZVRvTGVzc1RoYW4ob3RoZXIsICp0aGlzKSkKKyAgICAgICAgICAg
ICAgICAgICAgZnVuY3RvcihmbGlwcGVkR3JlYXRlclRoYW4uZmxpcHBlZCgpKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IC8vIFJldXNlIHRoZSBmYWN0IHRoYXQgd2UgYWxyZWFkeSBoYXZlIGhhbmRsaW5nIGZvciBMZXNz
VGhhbi5tZXJnZShFcXVhbCksIGFib3ZlLgorICAgICAgICAgICAgLy8gV2Ugd291bGRuJ3Qgc2Vl
IEdyZWF0ZXJUaGFuLm1lcmdlKEVxdWFsKSBiZWNhdXNlIG1lcmdlKCkgd291bGQgYWxyZWFkeSBo
YW5kbGUKKyAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgQVNTRVJUKG90aGVyLm1fa2lu
ZCA9PSBMZXNzVGhhbik7CisgICAgICAgICAgICBvdGhlci5tZXJnZUltcGwoKnRoaXMsIGZ1bmN0
b3IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgZ2V0
IGhlcmUgZWl0aGVyIGlmIHRoZSBraW5kIHdhcyBHcmVhdGVyVGhhbiwgd2hpY2ggc2hvdWxkIGhh
dmUgYmVlbiBoYW5kbGVkIGluCisgICAgICAgIC8vIG1lcmdlKCksIG9yIGJlY2F1c2Ugd2UgaGFk
IGFuIGludmFsaWQga2luZC4KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICB9CisgICAgCisgICAgTm9kZSogbV9sZWZ0OworICAgIE5vZGUqIG1fcmlnaHQ7CisgICAg
S2luZCBtX2tpbmQ7CisgICAgaW50IG1fb2Zmc2V0OyAvLyBUaGlzIG9mZnNldCBjYW4gYmUgYXJi
aXRyYXJpbHkgbGFyZ2UuCit9OworCit0eXBlZGVmIEhhc2hNYXA8Tm9kZSosIFZlY3RvcjxSZWxh
dGlvbnNoaXA+PiBSZWxhdGlvbnNoaXBNYXA7CisKK2NsYXNzIEludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlIDogcHVibGljIFBoYXNlIHsKK3B1YmxpYzoKKyAgICBJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZShHcmFwaCYgZ3JhcGgpCisgICAgICAgIDogUGhhc2UoZ3JhcGgsICJpbnRl
Z2VyIHJhbmdlIG9wdGltaXphdGlvbiIpCisgICAgICAgICwgbV96ZXJvKG51bGxwdHIpCisgICAg
ICAgICwgbV9yZWxhdGlvbnNoaXBzQXRIZWFkKGdyYXBoKQorICAgICAgICAsIG1faW5zZXJ0aW9u
U2V0KGdyYXBoKQorICAgIHsKKyAgICB9CisgICAgCisgICAgYm9vbCBydW4oKQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKG1fZ3JhcGgubV9mb3JtID09IFNTQSk7CisgICAgICAgIAorICAgICAgICAv
LyBCZWZvcmUgd2UgZG8gYW55dGhpbmcsIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB6ZXJvIGNv
bnN0YW50IGF0IHRoZSB0b3AuCisgICAgICAgIGZvciAoTm9kZSogbm9kZSA6ICptX2dyYXBoLmJs
b2NrKDApKSB7CisgICAgICAgICAgICBpZiAobm9kZS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgIW5v
ZGUtPmFzSW50MzIoKSkgeworICAgICAgICAgICAgICAgIG1femVybyA9IG5vZGU7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFt
X3plcm8pIHsKKyAgICAgICAgICAgIG1femVybyA9IG1faW5zZXJ0aW9uU2V0Lmluc2VydENvbnN0
YW50KDAsIE5vZGVPcmlnaW4oKSwganNOdW1iZXIoMCkpOworICAgICAgICAgICAgbV9pbnNlcnRp
b25TZXQuZXhlY3V0ZShtX2dyYXBoLmJsb2NrKDApKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkdyYXBoIGJlZm9yZSBp
bnRlZ2VyIHJhbmdlIG9wdGltaXphdGlvbjpcbiIpOworICAgICAgICAgICAgbV9ncmFwaC5kdW1w
KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEJsb2NrTGlzdCBwb3N0T3JkZXIgPSBt
X2dyYXBoLmJsb2Nrc0luUG9zdE9yZGVyKCk7CisgICAgICAgIAorICAgICAgICBib29sIGNoYW5n
ZWQgPSB0cnVlOworICAgICAgICB3aGlsZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hhbmdl
ZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBwb3N0T3JkZXJJbmRleCA9IHBv
c3RPcmRlci5zaXplKCk7IHBvc3RPcmRlckluZGV4LS07KSB7CisgICAgICAgICAgICAgICAgQmFz
aWNCbG9jayogYmxvY2sgPSBwb3N0T3JkZXJbcG9zdE9yZGVySW5kZXhdOworICAgICAgICAgICAg
ICAgIERGR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIG1fZ3JhcGgsIG51bGxwdHIsCisg
ICAgICAgICAgICAgICAgICAgIGJsb2NrID09IG1fZ3JhcGguYmxvY2soMCkgfHwgbV9zZWVuQmxv
Y2tzLmNvbnRhaW5zKGJsb2NrKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtX3Jl
bGF0aW9uc2hpcHMgPSBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXgg
PCBibG9jay0+c2l6ZSgpOyArK25vZGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBOb2Rl
KiBub2RlID0gYmxvY2stPmF0KG5vZGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2
ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiQW5hbHlzaXM6IGF0ICIs
IG5vZGUsICI6ICIsIGxpc3REdW1wKHNvcnRlZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOworICAg
ICAgICAgICAgICAgICAgICBleGVjdXRlTm9kZShub2RlKTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYnJhbmNoIG9uIGluZXF1YWxp
dHkuCisgICAgICAgICAgICAgICAgTm9kZSogdGVybWluYWwgPSBibG9jay0+dGVybWluYWwoKTsK
KyAgICAgICAgICAgICAgICBib29sIGFscmVhZHlNZXJnZWQgPSBmYWxzZTsKKyAgICAgICAgICAg
ICAgICBpZiAodGVybWluYWwtPm9wKCkgPT0gQnJhbmNoKSB7CisgICAgICAgICAgICAgICAgICAg
IE5vZGUqIGNvbXBhcmUgPSB0ZXJtaW5hbC0+Y2hpbGQxKCkubm9kZSgpOworICAgICAgICAgICAg
ICAgICAgICBzd2l0Y2ggKGNvbXBhcmUtPm9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZVN0cmljdEVxOgor
ICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgorICAgICAgICAgICAgICAgICAg
ICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdy
ZWF0ZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcTogeworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJV
c2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXA7
CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbXBhcmUtPm9wKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUVxOgorICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVs
YXRpb25zaGlwID0gUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpFcXVhbCwgMCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAg
ICBjYXNlIENvbXBhcmVMZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9u
c2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29t
cGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4sIDApOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlTGVzc0VxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9u
c2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29t
cGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4sIDEpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlv
bnNoaXAgPSBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAwKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFu
LCAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERGR19DUkFT
SChtX2dyYXBoLCBjb21wYXJlLCAiSW52YWxpZCBjb21wYXJpc29uIG5vZGUgdHlwZSIpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIERGR19BU1NF
UlQobV9ncmFwaCwgY29tcGFyZSwgcmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIFJlbGF0aW9uc2hpcE1hcCBmb3JUcnVlID0gbV9yZWxhdGlvbnNoaXBzOworICAgICAgICAg
ICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvckZhbHNlID0gbV9yZWxhdGlvbnNoaXBz
OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
dmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJEZWFsaW5nIHdp
dGggdHJ1ZTpcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKGZv
clRydWUsIHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVsYXRp
b25zaGlwIGludmVyc2UgPSByZWxhdGlvbnNoaXAuaW52ZXJzZSgpKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRhdGFMb2coIkRlYWxpbmcgd2l0aCBmYWxzZTpcbiIpOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChmb3JGYWxzZSwgaW52ZXJzZSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JUcnVlLCB0ZXJtaW5hbC0+YnJhbmNoRGF0
YSgpLT50YWtlbi5ibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1l
cmdlVG8oZm9yRmFsc2UsIHRlcm1pbmFsLT5icmFuY2hEYXRhKCktPm5vdFRha2VuLmJsb2NrKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlNZXJnZWQgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeU1lcmdlZCkgeworICAgICAgICAgICAgICAg
ICAgICBmb3IgKEJhc2ljQmxvY2sqIHN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNjZXNzb3JzKCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8obV9yZWxhdGlvbnNoaXBz
LCBzdWNjZXNzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKEJhc2lj
QmxvY2sqIGJsb2NrIDogbV9ncmFwaC5ibG9ja3NJbk5hdHVyYWxPcmRlcigpKSB7CisgICAgICAg
ICAgICBtX3JlbGF0aW9uc2hpcHMgPSBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAg
ICAgICAgICAgZm9yICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXggPCBibG9jay0+
c2l6ZSgpOyArK25vZGVJbmRleCkgeworICAgICAgICAgICAgICAgIE5vZGUqIG5vZGUgPSBibG9j
ay0+YXQobm9kZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAg
ICAgICAgICAgICAgZGF0YUxvZygiVHJhbnNmb3JtYXRpb246IGF0ICIsIG5vZGUsICI6ICIsIGxp
c3REdW1wKHNvcnRlZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIC8vIFRoaXMgZW5kcyB1cCBiZWluZyBwcmV0dHkgYXdrd2FyZCB0byB3
cml0ZSBiZWNhdXNlIHdlIG5lZWQgdG8gZGVjaWRlIGlmIHdlCisgICAgICAgICAgICAgICAgLy8g
b3B0aW1pemUgYnkgdXNpbmcgdGhlIHJlbGF0aW9uc2hpcHMgYmVmb3JlIHRoZSBvcGVyYXRpb24s
IGJ1dCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlTm9kZSgpIGJl
Zm9yZSB3ZSBvcHRpbWl6ZS4KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPm9wKCkpIHsK
KyAgICAgICAgICAgICAgICBjYXNlIEFyaXRoQWRkOiB7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghbm9kZS0+aXNCaW5hcnlVc2VLaW5kKEludDMyVXNlKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS0+YXJpdGhNb2RlKCkgIT0g
QXJpdGg6OkNoZWNrT3ZlcmZsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNvbnN0YW50KCkp
CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRpb25zaGlwcy5maW5kKG5vZGUt
PmNoaWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyID09IG1fcmVs
YXRpb25zaGlwcy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pblZhbHVlID0gc3RkOjpu
dW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFZh
bHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAg
ICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG1pblZhbHVlID0gc3RkOjptYXgobWluVmFsdWUsIHJlbGF0aW9u
c2hpcC5taW5WYWx1ZU9mTGVmdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVl
ID0gc3RkOjptaW4obWF4VmFsdWUsIHJlbGF0aW9uc2hpcC5tYXhWYWx1ZU9mTGVmdCgpKTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG1pblZhbHVlLCBub2RlLT5jaGlsZDIoKS0+YXNJ
bnQzMigpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtT3ZlcmZsb3dzPGludD4obWF4
VmFsdWUsIG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCkpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBleGVj
dXRlTm9kZShibG9jay0+YXQobm9kZUluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIG5vZGUt
PnNldEFyaXRoTW9kZShBcml0aDo6VW5jaGVja2VkKTsKKyAgICAgICAgICAgICAgICAgICAgY2hh
bmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBDaGVja0luQm91
bmRzOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRpb25zaGlwcy5m
aW5kKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVy
ID09IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBub25OZWdh
dGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBib29sIGxlc3NUaGFuTGVuZ3RoID0g
ZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hp
cCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25z
aGlwLm1pblZhbHVlT2ZMZWZ0KCkgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
b25OZWdhdGl2ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAucmlnaHQoKSA9PSBub2RlLT5jaGlsZDIoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCgpID09
IFJlbGF0aW9uc2hpcDo6RXF1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYg
cmVsYXRpb25zaGlwLm9mZnNldCgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbGVzc1RoYW5MZW5ndGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCgpID09IFJl
bGF0aW9uc2hpcDo6TGVzc1RoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYg
cmVsYXRpb25zaGlwLm9mZnNldCgpIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGxlc3NUaGFuTGVuZ3RoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKG5vbk5lZ2F0aXZlICYmIGxlc3NUaGFuTGVuZ3RoKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBleGVjdXRlTm9kZShibG9jay0+YXQobm9kZUluZGV4KSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBub2RlLT5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNo
YW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJs
b2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgZXhl
Y3V0ZU5vZGUoTm9kZSogbm9kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkg
eworICAgICAgICBjYXNlIENoZWNrSW5Cb3VuZHM6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9u
c2hpcChSZWxhdGlvbnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBub2RlLT5jaGlsZDIoKS5u
b2RlKCksIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4pKTsKKyAgICAgICAgICAgIHNldFJlbGF0aW9u
c2hpcChSZWxhdGlvbnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9u
c2hpcDo6R3JlYXRlclRoYW4sIC0xKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgIC8vIFdl
J3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBpbnQzMiBhZGRpdGlvbnMgYW5kIHdlIGN1cnJlbnRseSBv
bmx5IGtub3cgaG93IHRvCisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIG5vbi13cmFwcGluZyBv
bmVzLgorICAgICAgICAgICAgaWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBGSVhN
RTogV2UgY291bGQgaGFuZGxlIHRoZSB1bmNoZWNrZWQgYXJpdGhtZXRpYyBjYXNlLiBXZSBqdXN0
IGRvIGl0IGRvbid0IHJpZ2h0CisgICAgICAgICAgICAvLyBub3cuCisgICAgICAgICAgICBpZiAo
bm9kZS0+YXJpdGhNb2RlKCkgIT0gQXJpdGg6OkNoZWNrT3ZlcmZsb3cpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEhhbmRsZSBhZGQ6IEB2YWx1
ZSArIGNvbnN0YW50LgorICAgICAgICAgICAgaWYgKCFub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNv
bnN0YW50KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGludCBvZmZzZXQgPSBub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpOworICAgICAgICAgICAg
CisgICAgICAgICAgICAvLyBXZSBhZGQgYSByZWxhdGlvbnNoaXAgZm9yIEBhZGQgPT0gQHZhbHVl
ICsgY29uc3RhbnQsIGFuZCB0aGVuIHdlIGNvcHkgdGhlCisgICAgICAgICAgICAvLyByZWxhdGlv
bnNoaXBzIGZvciBAdmFsdWUuIFRoaXMgZ2l2ZXMgdXMgYSBvbmUtZGVlcCB2aWV3IG9mIEB2YWx1
ZSdzIGV4aXN0aW5nCisgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLCB3aGljaCBtYXRjaGVz
IHRoZSBvbmUtZGVlcCBzZWFyY2ggaW4gc2V0UmVsYXRpb25zaGlwKCkuCisgICAgICAgICAgICAK
KyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXAobm9kZSwgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBSZWxhdGlvbnNoaXA6OkVxdWFsLCBvZmZz
ZXQpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNo
aXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9
IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlv
bnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9u
c2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBu
ZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChu
ZXdSZWxhdGlvbnNoaXAucmlnaHQoKSA9PSBub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG5v
ZGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLmFkZFRvT2Zmc2V0
KG9mZnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0b0FkZC5hcHBlbmQobmV3UmVsYXRp
b25zaGlwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlv
bnNoaXAgcmVsYXRpb25zaGlwIDogdG9BZGQpCisgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0
aW9uc2hpcChyZWxhdGlvbnNoaXAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICAvLyBOb3cgd2Ugd2FudCB0byBlc3RhYmxpc2ggdGhhdCBib3RoIHRoZSBpbnB1
dCBhbmQgdGhlIG91dHB1dCBvZiB0aGUgYWRkaXRpb24gYXJlCisgICAgICAgICAgICAvLyB3aXRo
aW4gYSBwYXJ0aWN1bGFyIHJhbmdlIG9mIGludGVnZXJzLgorICAgICAgICAgICAgCisgICAgICAg
ICAgICBpZiAob2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFk
ZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQgQHZhbHVlIDw9IG1heCAtIDEsIGkuZS4g
dGhhdAorICAgICAgICAgICAgICAgIC8vIEB2YWx1ZSA8IG1heC4KKyAgICAgICAgICAgICAgICBz
ZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCgKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96ZXJvLCBSZWxhdGlv
bnNoaXA6Okxlc3NUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xp
bWl0czxpbnQ+OjptYXgoKSAtIG9mZnNldCArIDEpLAorICAgICAgICAgICAgICAgICAgICAwKTsK
KyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRk
OiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBAYWRkID49IG1pbiArIDEsIGkuZS4gdGhh
dAorICAgICAgICAgICAgICAgIC8vIEBhZGQgPiBtaW4uCisgICAgICAgICAgICAgICAgc2V0UmVs
YXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAoCisgICAgICAgICAg
ICAgICAgICAgICAgICBub2RlLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sCisg
ICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpICsg
b2Zmc2V0IC0gMSksCisgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAg
IC8vIElmIHdlIGhhdmUgImFkZDogQHZhbHVlIC0gMSIgdGhlbiB3ZSBrbm93IHRoYXQgQHZhbHVl
ID49IG1pbiArIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEB2YWx1ZSA+IG1pbi4K
KyAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUo
KSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLAorICAgICAgICAgICAgICAgICAg
ICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9mZnNldCAtIDEpLAorICAg
ICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAv
LyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSAtMSAxIiB0aGVuIHdlIGtub3cgdGhhdCBAYWRkIDw9
IG1heCAtIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEBhZGQgPCBtYXguCisgICAg
ICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlv
bnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLCBtX3plcm8sIFJlbGF0aW9uc2hp
cDo6TGVzc1RoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRz
PGludD46Om1heCgpIC0gb2Zmc2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgIDApOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICBjYXNlIEdldEFycmF5TGVuZ3RoOiB7CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNo
aXAoUmVsYXRpb25zaGlwKG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwg
LTEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgY2FzZSBVcHNpbG9uOiB7CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+cGhpKCks
IFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0
byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAg
ICAgICAgICAgIGlmIChpdGVyICE9IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAg
ICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAo
UmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAg
ICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChub2RlLT5waGkoKSA9PSBuZXdSZWxhdGlvbnNoaXAucmlnaHQo
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAg
ICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2RlLT5waGkoKSk7CisgICAgICAgICAgICAgICAg
ICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAg
ICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNp
Z25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIHNldFJlbGF0aW9uc2hpcChtX3Jl
bGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAg
IHZvaWQgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICBSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9u
c2hpcE1hcCwgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9
IDEpCisgICAgeworICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25z
aGlwLCB0aW1lVG9MaXZlKTsKKyAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIHJl
bGF0aW9uc2hpcC5mbGlwcGVkKCksIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICB2b2lk
IHNldE9uZVNpZGUoCisgICAgICAgIFJlbGF0aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBS
ZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7
CisgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZGF0YUxvZygiICAgIFNldHRpbmc6
ICIsIHJlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgIAorICAgICAgICBhdXRvIHJlc3VsdCA9
IHJlbGF0aW9uc2hpcE1hcC5hZGQoCisgICAgICAgICAgICByZWxhdGlvbnNoaXAubGVmdCgpLCBW
ZWN0b3I8UmVsYXRpb25zaGlwPigpKTsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4mIHJl
bGF0aW9uc2hpcHMgPSByZXN1bHQuaXRlcmF0b3ItPnZhbHVlOworICAgICAgICBWZWN0b3I8UmVs
YXRpb25zaGlwPiB0b0FkZDsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBm
b3IgKFJlbGF0aW9uc2hpcCYgb3RoZXJSZWxhdGlvbnNoaXAgOiByZWxhdGlvbnNoaXBzKSB7Cisg
ICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlvbnNoaXAuc2FtZU5vZGVzQXMocmVsYXRpb25zaGlw
KSkgeworICAgICAgICAgICAgICAgIGlmIChSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPSBvdGhlclJl
bGF0aW9uc2hpcC5maWx0ZXIocmVsYXRpb25zaGlwKSkgeworICAgICAgICAgICAgICAgICAgICBv
dGhlclJlbGF0aW9uc2hpcCA9IGZpbHRlcmVkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYg
b3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAgICAg
ICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gb3RoZXJSZWxhdGlvbnNo
aXA7CisgICAgICAgICAgICAgICAgaWYgKG5ld1JlbGF0aW9uc2hpcC5yaWdodCgpICE9IG90aGVy
UmVsYXRpb25zaGlwLnJpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25z
aGlwLnNldExlZnQob3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSk7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChuZXdSZWxhdGlvbnNoaXAuYWRkVG9PZmZzZXQob3RoZXJSZWxhdGlvbnNoaXAub2Zm
c2V0KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9u
c2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgcmVsYXRpb25zaGlwcy5hcHBl
bmQocmVsYXRpb25zaGlwKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIGFu
b3RoZXJSZWxhdGlvbnNoaXAgOiB0b0FkZCkgeworICAgICAgICAgICAgQVNTRVJUKHRpbWVUb0xp
dmUpOworICAgICAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIGFub3RoZXJSZWxh
dGlvbnNoaXAsIHRpbWVUb0xpdmUgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBi
b29sIG1lcmdlVG8oUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBNYXAsIEJhc2ljQmxvY2sq
IHRhcmdldCkKKyAgICB7CisgICAgICAgIGlmIChtX3NlZW5CbG9ja3MuYWRkKHRhcmdldCkpIHsK
KyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgYmxvY2suIFdlIGNvcHkgc3ViamVjdCB0byBs
aXZlbmVzcyBwcnVuaW5nLgorICAgICAgICAgICAgYXV0byBpc0xpdmUgPSBbJl0gKE5vZGUqIG5v
ZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBtX3plcm8pCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQtPnNzYS0+
bGl2ZUF0SGVhZC5jb250YWlucyhub2RlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiByZWxhdGlvbnNoaXBNYXApIHsKKyAgICAg
ICAgICAgICAgICBpZiAoIWlzTGl2ZShlbnRyeS5rZXkpKQorICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWZWN0b3I8UmVsYXRp
b25zaGlwPiB2YWx1ZXM7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRp
b25zaGlwIDogZW50cnkudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHJlbGF0
aW9uc2hpcC5sZWZ0KCkgPT0gZW50cnkua2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlz
TGl2ZShyZWxhdGlvbnNoaXAucmlnaHQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1
ZXMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVu
ZCgpKTsKKyAgICAgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5hZGQo
ZW50cnkua2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1lcmdlIGJ5IGludGVyc2VjdGlu
Zy4gV2UgaGF2ZSBubyBub3Rpb24gb2YgQk9UVE9NLCBzbyB3ZSB1c2UgdGhlIG9taXNzaW9uIG9m
CisgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgZm9yIGEgcGFpciBvZiBub2RlcyB0byBtZWFuIFRP
UC4gVGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3QgbmVlZCBCT1RUT00KKyAgICAgICAgLy8gaXMgKDEp
IHdlIGp1c3Qgb3ZlcmFwcHJveGltYXRlIGNvbnRyYWRpY3Rpb25zIGFuZCAoMikgYSB2YWx1ZSBu
ZXZlciBoYXZpbmcgYmVlbgorICAgICAgICAvLyBhc3NpZ25lZCB3b3VsZCBvbmx5IGhhcHBlbiBp
ZiB3ZSBoYXZlIG5vdCBwcm9jZXNzZWQgdGhlIG5vZGUncyBwcmVkZWNlc3Nvci4gV2UKKyAgICAg
ICAgLy8gc2hvdWxkbid0IHByb2Nlc3MgYmxvY2tzIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIHRo
ZSBibG9jaydzIHByZWRlY2Vzc29yIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gYXJlIHVzaW5nIFJQ
Ty4KKyAgICAgICAgVmVjdG9yPE5vZGUqPiB0b1JlbW92ZTsKKyAgICAgICAgYm9vbCBjaGFuZ2Vk
ID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3JlbGF0aW9uc2hpcHNBdEhl
YWRbdGFyZ2V0XSkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gcmVsYXRpb25zaGlwTWFwLmZp
bmQoZW50cnkua2V5KTsKKyAgICAgICAgICAgIGlmIChpdGVyID09IHJlbGF0aW9uc2hpcE1hcC5l
bmQoKSkgeworICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChlbnRyeS5rZXkpOworICAg
ICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBWZWN0b3I8UmVsYXRpb25z
aGlwPiB2YWx1ZXM7CisgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCB0YXJnZXRSZWxhdGlv
bnNoaXAgOiBlbnRyeS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
IHNvdXJjZVJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAg
IHRhcmdldFJlbGF0aW9uc2hpcC5tZXJnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJj
ZVJlbGF0aW9uc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmXSAoUmVsYXRpb25zaGlw
IG5ld1JlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5h
cHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1
ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS52YWx1ZSA9
PSB2YWx1ZXMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWVzOworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7
CisgICAgICAgIH0KKyAgICAgICAgZm9yIChOb2RlKiBub2RlIDogdG9SZW1vdmUpCisgICAgICAg
ICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5yZW1vdmUobm9kZSk7CisgICAgICAg
IAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisgICAgCisgICAgVmVjdG9yPFJlbGF0
aW9uc2hpcD4gc29ydGVkUmVsYXRpb25zaGlwcygpCisgICAgeworICAgICAgICBWZWN0b3I8UmVs
YXRpb25zaGlwPiByZXN1bHQ7CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3JlbGF0aW9u
c2hpcHMpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kVmVjdG9yKGVudHJ5LnZhbHVlKTsKKyAg
ICAgICAgc3RkOjpzb3J0KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBOb2RlKiBtX3plcm87CisgICAgUmVsYXRp
b25zaGlwTWFwIG1fcmVsYXRpb25zaGlwczsKKyAgICBCbG9ja1NldCBtX3NlZW5CbG9ja3M7Cisg
ICAgQmxvY2tNYXA8UmVsYXRpb25zaGlwTWFwPiBtX3JlbGF0aW9uc2hpcHNBdEhlYWQ7CisgICAg
SW5zZXJ0aW9uU2V0IG1faW5zZXJ0aW9uU2V0OworfTsKKyAgICAKK30gLy8gYW5vbnltb3VzIG5h
bWVzcGFjZQorCitib29sIHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oR3JhcGgmIGdy
YXBoKQoreworICAgIFNhbXBsaW5nUmVnaW9uIHNhbXBsaW5nUmVnaW9uKCJERkcgSW50ZWdlciBS
YW5nZSBPcHRpbWl6YXRpb24gUGhhc2UiKTsKKyAgICByZXR1cm4gcnVuUGhhc2U8SW50ZWdlclJh
bmdlT3B0aW1pemF0aW9uUGhhc2U+KGdyYXBoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gKKyNkZWZpbmUgREZHSW50ZWdl
clJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAorCisjaWYgRU5BQkxFKERGR19KSVQpCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworY2xhc3MgR3JhcGg7CisKKy8vIFJlbW92ZXMg
b3ZlcmZsb3cgY2hlY2tzIGFuZCBvdXQtb2YtYm91bmRzIGNoZWNrcyBieSBkb2luZyBhIGZvcndh
cmQgZmxvdyBhbmFseXNpcyB0byBwcm92ZQorLy8gaW5lcXVhbGl0aWVzLgorCitib29sIHBlcmZv
cm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oR3JhcGgmKTsKKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisKKyNlbmRpZiAvLyBERkdJbnRl
Z2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHUGxhbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdQbGFuLmNwcAkocmV2aXNpb24gMTg1MzY5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdQbGFuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1
ZGUgIkRGR0ZpeHVwUGhhc2UuaCIKICNpbmNsdWRlICJERkdHcmFwaFNhZmVwb2ludC5oIgogI2lu
Y2x1ZGUgIkRGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNlLmgiCisjaW5jbHVkZSAiREZHSW50
ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCIKICNpbmNsdWRlICJERkdJbnZhbGlkYXRpb25Q
b2ludEluamVjdGlvblBoYXNlLmgiCiAjaW5jbHVkZSAiREZHSklUQ29tcGlsZXIuaCIKICNpbmNs
dWRlICJERkdMSUNNUGhhc2UuaCIKQEAgLTM1Nyw2ICszNTgsOCBAQCBQbGFuOjpDb21waWxhdGlv
blBhdGggUGxhbjo6Y29tcGlsZUluVGhyCiAgICAgICAgIHBlcmZvcm1Db25zdGFudEhvaXN0aW5n
KGRmZyk7CiAgICAgICAgIHBlcmZvcm1HbG9iYWxDU0UoZGZnKTsKICAgICAgICAgcGVyZm9ybUxp
dmVuZXNzQW5hbHlzaXMoZGZnKTsKKyAgICAgICAgcGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXph
dGlvbihkZmcpOworICAgICAgICBwZXJmb3JtTGl2ZW5lc3NBbmFseXNpcyhkZmcpOwogICAgICAg
ICBwZXJmb3JtQ0ZBKGRmZyk7CiAgICAgICAgIHBlcmZvcm1Db25zdGFudEZvbGRpbmcoZGZnKTsK
ICAgICAgICAgcGVyZm9ybUNsZWFuVXAoZGZnKTsgLy8gUmVkdWNlIHRoZSBncmFwaCBzaXplIGEg
bG90Lgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254596</attachid>
            <date>2015-06-09 13:30:58 -0700</date>
            <delta_ts>2015-06-09 13:33:48 -0700</delta_ts>
            <desc>it&apos;s removing bounds checks</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>44009</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODUzNjkpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBD
MTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdC
cmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0
OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBE
RkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1
cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8q
IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBE
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIy
NzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5
RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAg
Ki87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAw
RUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1v
dmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3Bw
ICovOyB9OwpAQCAtMjE2MSw2ICsyMTYzLDggQEAKIAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlB
IC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUg
PSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8q
IEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVj
b2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUy
M0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBw
YXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdl
T3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1l
ID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJS
YW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1p
emF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURG
MDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9j
aC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0g
ZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFE
RjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRo
ID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtNDk5Myw2ICs0OTk3LDggQEAKIAkJCQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUg
LyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0
MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBG
MzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5o
ICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjEx
OTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAog
CQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVj
dGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENv
ZGUuY3BwICovLApAQCAtNTYzMCw2ICs1NjM2LDcgQEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4
NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4g
SGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJh
bmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZC
REUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4
MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8s
CkBAIC03MzcwLDYgKzczNzcsNyBAQAogCQkJCTBGMkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBK
U0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0
MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEz
NTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4
OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0Jv
dW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVG
MDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQw
Rjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2Vz
ICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDkyNiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCIKKworI2lmIEVOQUJMRShERkdf
SklUKQorCisjaW5jbHVkZSAiREZHQmxvY2tNYXBJbmxpbmVzLmgiCisjaW5jbHVkZSAiREZHR3Jh
cGguaCIKKyNpbmNsdWRlICJERkdJbnNlcnRpb25TZXQuaCIKKyNpbmNsdWRlICJERkdQaGFzZS5o
IgorI2luY2x1ZGUgIkRGR1ByZWRpY3Rpb25Qcm9wYWdhdGlvblBoYXNlLmgiCisjaW5jbHVkZSAi
REZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5oIgorI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgeworCituYW1lc3BhY2UgeworCitjb25zdCBi
b29sIHZlcmJvc2UgPSB0cnVlOworCitpbnQ2NF90IGNsYW1wZWRTdW1JbXBsKCkgeyByZXR1cm4g
MDsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgoraW50NjRfdCBjbGFtcGVkU3VtSW1w
bChpbnQgbGVmdCwgQXJncy4uLiBhcmdzKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2
NF90PihsZWZ0KSArIGNsYW1wZWRTdW1JbXBsKGFyZ3MuLi4pOworfQorCit0ZW1wbGF0ZTx0eXBl
bmFtZS4uLiBBcmdzPgoraW50IGNsYW1wZWRTdW0oQXJncy4uLiBhcmdzKQoreworICAgIGludDY0
X3QgcmVzdWx0ID0gY2xhbXBlZFN1bUltcGwoYXJncy4uLik7CisgICAgcmV0dXJuIHN0ZDo6bWlu
KAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46
Om1heCgpKSwKKyAgICAgICAgc3RkOjptYXgoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2
NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpKSwKKyAgICAgICAgICAgIHJlc3Vs
dCkpOworfQorCitjbGFzcyBSZWxhdGlvbnNoaXAgeworcHVibGljOgorICAgIGVudW0gS2luZCB7
CisgICAgICAgIExlc3NUaGFuLAorICAgICAgICBFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4K
KyAgICB9OworICAgIAorICAgIHN0YXRpYyBLaW5kIGludmVyc2UoS2luZCBraW5kKQorICAgIHsK
KyAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAg
ICAgICByZXR1cm4gR3JlYXRlclRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAg
ICByZXR1cm4gRXF1YWw7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBy
ZXR1cm4gTGVzc1RoYW47CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9u
c2hpcCgpCisgICAgICAgIDogbV9sZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxs
cHRyKQorICAgICAgICAsIG1fa2luZChFcXVhbCkKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0
LCBLaW5kIGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgICAgICA6IG1fbGVmdChsZWZ0KQorICAg
ICAgICAsIG1fcmlnaHQocmlnaHQpCisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwg
bV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0KTsK
KyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9yaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KG1fbGVmdCAhPSBtX3JpZ2h0KTsKKyAgICB9CisgICAgCisgICAgdHlwZWRlZiB2b2lkKiAoUmVs
YXRpb25zaGlwOjoqVW5zcGVjaWZpZWRCb29sVHlwZSk7CisKKyAgICBvcGVyYXRvciBVbnNwZWNp
ZmllZEJvb2xUeXBlKigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID8gcmVp
bnRlcnByZXRfY2FzdDxVbnNwZWNpZmllZEJvb2xUeXBlKj4oMSkgOiAwOworICAgIH0KKyAgICAK
KyAgICBOb2RlKiBsZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sZWZ0OyB9CisgICAgTm9kZSogcmln
aHQoKSBjb25zdCB7IHJldHVybiBtX3JpZ2h0OyB9CisgICAgS2luZCBraW5kKCkgY29uc3QgeyBy
ZXR1cm4gbV9raW5kOyB9CisgICAgaW50IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0
OyB9CisgICAgCisgICAgUmVsYXRpb25zaGlwIGZsaXBwZWQoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgaWYgKCEqdGhpcykKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAg
ICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX3JpZ2h0LCBtX2xlZnQsIGludmVyc2UobV9raW5kKSwg
LW1fb2Zmc2V0KTsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwIGludmVyc2UoKSBjb25z
dAorICAgIHsKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDoK
KyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgY2FzZSBMZXNzVGhh
bjoKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihtX29mZnNldCwgLTEpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBHcmVhdGVyVGhhbiwgbV9vZmZzZXQgLSAxKTsK
KyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8
aW50PihtX29mZnNldCwgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgp
OworICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NU
aGFuLCBtX29mZnNldCArIDEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKyAgICAKKyAgICBib29sIGlzQ2Fub25pY2Fs
KCkgY29uc3QgeyByZXR1cm4gbV9sZWZ0IDwgbV9yaWdodDsgfQorICAgIAorICAgIFJlbGF0aW9u
c2hpcCBjYW5vbmljYWwoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzQ2Fub25pY2FsKCkp
CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIHJldHVybiBmbGlwcGVkKCk7Cisg
ICAgfQorICAgIAorICAgIGJvb2wgc2FtZU5vZGVzQXMoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhl
cikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xlZnQgPT0gb3RoZXIubV9sZWZ0Cisg
ICAgICAgICAgICAmJiBtX3JpZ2h0ID09IG90aGVyLm1fcmlnaHQ7CisgICAgfQorICAgIAorICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHNhbWVOb2Rlc0FzKG90aGVyKQorICAgICAgICAgICAgJiYgbV9raW5k
ID09IG90aGVyLm1fa2luZAorICAgICAgICAgICAgJiYgbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZz
ZXQ7CisgICAgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJlbGF0aW9uc2hpcCYg
b3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9sZWZ0ICE9IG90aGVyLm1fbGVmdCkK
KyAgICAgICAgICAgIHJldHVybiBtX2xlZnQgPCBvdGhlci5tX2xlZnQ7CisgICAgICAgIGlmICht
X3JpZ2h0ICE9IG90aGVyLm1fcmlnaHQpCisgICAgICAgICAgICByZXR1cm4gbV9yaWdodCA8IG90
aGVyLm1fcmlnaHQ7CisgICAgICAgIGlmIChtX2tpbmQgIT0gb3RoZXIubV9raW5kKQorICAgICAg
ICAgICAgcmV0dXJuIG1fa2luZCA8IG90aGVyLm1fa2luZDsKKyAgICAgICAgcmV0dXJuIG1fb2Zm
c2V0IDwgb3RoZXIubV9vZmZzZXQ7CisgICAgfQorICAgIAorICAgIC8vIElmIHBvc3NpYmxlLCBy
ZXR1cm5zIGEgZm9ybSBvZiB0aGlzIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUgZ2l2ZW4gbm9kZSBp
cyB0aGUgbGVmdAorICAgIC8vIHNpZGUuIFJldHVybnMgYSBudWxsIHJlbGF0aW9uc2hpcCBpZiB0
aGlzIHJlbGF0aW9uc2hpcCBjYW5ub3Qgc2F5IGFueXRoaW5nIGFib3V0IHRoaXMKKyAgICAvLyBu
b2RlLgorICAgIFJlbGF0aW9uc2hpcCBmb3JOb2RlKE5vZGUqIG5vZGUpIGNvbnN0CisgICAgewor
ICAgICAgICBpZiAobV9sZWZ0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7Cisg
ICAgICAgIGlmIChtX3JpZ2h0ID09IG5vZGUpCisgICAgICAgICAgICByZXR1cm4gZmxpcHBlZCgp
OworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgfQorICAgIAorICAgIHZvaWQg
c2V0TGVmdChOb2RlKiBsZWZ0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobGVmdCAh
PSBtX3JpZ2h0KTsKKyAgICAgICAgbV9sZWZ0ID0gbGVmdDsKKyAgICB9CisgICAgYm9vbCBhZGRU
b09mZnNldChpbnQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+
KG1fb2Zmc2V0LCBvZmZzZXQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBt
X29mZnNldCArPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgbWVyZ2UoY29uc3QgUmVsYXRp
b25zaGlwJiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChtX2tpbmQgPT0gR3JlYXRlclRoYW4gfHwgKG1fa2luZCAhPSBMZXNzVGhhbiAmJiBv
dGhlci5tX2tpbmQgPT0gR3JlYXRlclRoYW4pKSB7CisgICAgICAgICAgICAvLyBSZXVzZSB0aGUg
ZmFjdCB0aGF0IHdlIGFscmVhZHkgaGF2ZSBoYW5kbGluZyBmb3IgTGVzc1RoYW4ubWVyZ2UoLi4u
KS4gV2UgY2FuIHVzZQorICAgICAgICAgICAgLy8gdGhhdCBjb2RlIGJ5IGZsaXBwaW5nIHRoZSBy
ZWxhdGlvbnNoaXBzIGFyb3VuZC4KKyAgICAgICAgICAgIGZsaXBwZWQoKS5tZXJnZUltcGwoCisg
ICAgICAgICAgICAgICAgb3RoZXIuZmxpcHBlZCgpLAorICAgICAgICAgICAgICAgIFsmXSAoUmVs
YXRpb25zaGlwIHJlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKHJl
bGF0aW9uc2hpcC5mbGlwcGVkKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtZXJnZUltcGwob3RoZXIsIGZ1
bmN0b3IpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIGEgbnVsbCByZWxhdGlvbnNoaXAg
aWYgdGhlIGZpbHRyYXRpb24gc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyB0d28gZGlmZmVyZW50Cisg
ICAgLy8gcmVsYXRpb25zaGlwcy4KKyAgICBSZWxhdGlvbnNoaXAgZmlsdGVyKGNvbnN0IFJlbGF0
aW9uc2hpcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICAvLyBXZSBhcmUgb25seSBpbnRl
cmVzdGVkIGluIG1lcmdpbmcgcmVsYXRpb25zaGlwcyBvdmVyIHRoZSBzYW1lIG5vZGVzLgorICAg
ICAgICBBU1NFUlQoc2FtZU5vZGVzQXMob3RoZXIpKTsKKyAgICAgICAgCisgICAgICAgIGlmICgq
dGhpcyA9PSBvdGhlcikKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgCisgICAg
ICAgIC8vIFdlIHdhbnQgZXF1YWxpdHkgdG8gdGFrZSBwcmVjZWRlbnQgb3ZlciBldmVyeXRoaW5n
IGVsc2UuCisgICAgICAgIGlmIChtX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4g
KnRoaXM7CisgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICBy
ZXR1cm4gb3RoZXI7CisgICAgICAgIAorICAgICAgICAvLyBGcm9tIGhlcmUgd2UgY2FuIGFzc3Vt
ZSB0aGF0IHRoZSB0d28gcmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50aWNhbC4gVXN1YWxseSB3
ZSB1c2UKKyAgICAgICAgLy8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBkaWZmZXJlbnQgb2Zmc2V0
cyBhbnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBpcworICAgICAgICAvLyBp
ZGVudGljYWwuCisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKSB7Cisg
ICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgbV9sZWZ0LCBtX3Jp
Z2h0LCBMZXNzVGhhbiwgc3RkOjptaW4obV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFTU0VSVChvdGhlci5tX2tpbmQg
PT0gR3JlYXRlclRoYW4pOworICAgICAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG1fb2Zm
c2V0LCAtMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAg
ICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG90aGVyLm1fb2Zmc2V0LCAxKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICBpZiAobV9vZmZzZXQg
LSAxID09IG90aGVyLm1fb2Zmc2V0ICsgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRp
b25zaGlwKG1fbGVmdCwgbV9yaWdodCwgRXF1YWwsIG1fb2Zmc2V0IC0gMSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgQVNTRVJUKG1fa2luZCA9PSBHcmVhdGVyVGhhbik7CisgICAgICAgIHJldHVy
biBmbGlwcGVkKCkuZmlsdGVyKG90aGVyLmZsaXBwZWQoKSkuZmxpcHBlZCgpOworICAgIH0KKyAg
ICAKKyAgICBpbnQgbWluVmFsdWVPZkxlZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1f
bGVmdC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5hc0lu
dDMyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKQorICAgICAg
ICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIAor
ICAgICAgICBpbnQgbWluUmlnaHRWYWx1ZTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50MzJD
b25zdGFudCgpKQorICAgICAgICAgICAgbWluUmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIo
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWluUmlnaHRWYWx1ZSA9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IEdy
ZWF0ZXJUaGFuKQorICAgICAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1ZSwg
bV9vZmZzZXQsIDEpOworICAgICAgICByZXR1cm4gY2xhbXBlZFN1bShtaW5SaWdodFZhbHVlLCBt
X29mZnNldCk7CisgICAgfQorICAgIAorICAgIGludCBtYXhWYWx1ZU9mTGVmdCgpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAobV9sZWZ0LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAg
IHJldHVybiBtX2xlZnQtPmFzSW50MzIoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQg
PT0gR3JlYXRlclRoYW4pCisgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxp
bnQ+OjptYXgoKTsKKyAgICAgICAgCisgICAgICAgIGludCBtYXhSaWdodFZhbHVlOworICAgICAg
ICBpZiAobV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICBtYXhSaWdodFZh
bHVlID0gbV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhS
aWdodFZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgCisg
ICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pCisgICAgICAgICAgICByZXR1cm4gY2xhbXBl
ZFN1bShtYXhSaWdodFZhbHVlLCBtX29mZnNldCwgLTEpOworICAgICAgICByZXR1cm4gY2xhbXBl
ZFN1bShtYXhSaWdodFZhbHVlLCBtX29mZnNldCk7CisgICAgfQorICAgIAorICAgIHZvaWQgZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gVGhpcyBwcmludHMg
b3V0IHRoZSByZWxhdGlvbnNoaXAgd2l0aG91dCBhbnkgd2hpdGVzcGFjZSwgbGlrZSBAeDxAeSs0
Mi4gVGhpcworICAgICAgICAvLyBvcHRpbWl6ZXMgZm9yIHRoZSBjbGFyaXR5IG9mIGEgbGlzdCBv
ZiByZWxhdGlvbnNoaXBzLiBJdCdzIGVhc2llciB0byByZWFkIHNvbWV0aGluZworICAgICAgICAv
LyBsaWtlIFtAMTxAMiszLCBAND09QDUtNl0gdGhhbiBpdCB3b3VsZCBiZSBpZiB0aGVyZSB3YXMg
d2hpdGVzcGFjZSBpbnNpZGUgdGhlCisgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuCisgICAgICAg
IAorICAgICAgICBvdXQucHJpbnQobV9sZWZ0KTsKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsK
KyAgICAgICAgY2FzZSBMZXNzVGhhbjoKKyAgICAgICAgICAgIG91dC5wcmludCgiPCIpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICBvdXQucHJp
bnQoIj09Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoK
KyAgICAgICAgICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgb3V0LnByaW50KG1fcmlnaHQpOworICAgICAgICBpZiAobV9vZmZzZXQgPiAw
KQorICAgICAgICAgICAgb3V0LnByaW50KCIrIiwgbV9vZmZzZXQpOworICAgICAgICBlbHNlIGlm
IChtX29mZnNldCA8IDApCisgICAgICAgICAgICBvdXQucHJpbnQoIi0iLCAtc3RhdGljX2Nhc3Q8
aW50NjRfdD4obV9vZmZzZXQpKTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIHRlbXBsYXRl
PHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZUltcGwoY29uc3QgUmVsYXRpb25zaGlw
JiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIGlm
ICghc2FtZU5vZGVzQXMob3RoZXIpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAg
ICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gZ3VhcmFudGVlIHRoYXQ6
CisgICAgICAgIC8vCisgICAgICAgIC8vIC0gV2UgYXZvaWQgaGF2aW5nIG1vcmUgdGhhbiBvbmUg
UmVsYXRpb25zaGlwIG92ZXIgdGhlIHNhbWUgdHdvIG5vZGVzLiBUaGVyZWZvcmUsIGlmCisgICAg
ICAgIC8vICAgdGhlIG1lcmdlIGNvdWxkIGJlIGV4cHJlc3NlZCBhcyB0d28gUmVsYXRpb25zaGlw
cywgd2UgcHJlZmVyIHRvIGluc3RlYWQgcGljayB0aGUKKyAgICAgICAgLy8gICBsZXNzIHByZWNp
c2Ugc2luZ2xlIFJlbGF0aW9uc2hpcCBmb3JtIGV2ZW4gaWYgdGhhdCBtZWFucyBUT1AuIE9uZSBl
eGNlcHRpb24gdG8KKyAgICAgICAgLy8gICB0aGlzIGlzIHRoYXQgd2UgQGEgPT0gQGIgKyBDIGFu
ZCBAYSA9PSBAYiArIEQgaW50byBAYSA+IEBiICsgQyAtIDEgYW5kCisgICAgICAgIC8vICAgQGEg
PCBAYiArIEQgKyAxLiAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiB0aGUgZGlmZmVyZW5j
ZSBiZXR3ZWVuIHR3byBSZWxhdGlvbnNoaXBzIGlzIGp1c3QgdGhlIG1fb2Zmc2V0LCB0aGVuIHdl
IGNyZWF0ZSBhCisgICAgICAgIC8vICAgUmVsYXRpb25zaGlwIHRoYXQgaGFzIGFuIG9mZnNldCBv
ZiAtMSwgMCwgb3IgMS4gVGhpcyBpcyBhbiBlc3NlbnRpYWwgY29udmVyZ2VuY2UKKyAgICAgICAg
Ly8gICBoYWNrLiBXZSBuZWVkIC0xIGFuZCAxIHRvIHN1cHBvcnQgPD0gYW5kID49LiBUaGlzIG92
ZXJyaWRlcyB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gICBleGNlcHRpb24uIEZvciBleGFtcGxl
LCB3ZSB3b3VsZG4ndCBhZGQgYSBAYSA8IEBiICsgRCArIDEgcmVsYXRpb25zaGlwIGlmIEQgKyAx
CisgICAgICAgIC8vICAgd2FzIG5vdCBlcXVhbCB0byBvbmUgb2YgLTEsIDAsIDEuCisgICAgICAg
IC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgUmVsYXRpb25zaGlwKCkgdG8gbWVhbiBU
T1AuCisgICAgICAgIAorICAgICAgICAvLyBJZiB0aGUgcmVsYXRpb25zaGlwcyBhcmUgaWRlbnRp
Y2FsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIGxlZnQgdG8gZG8uCisgICAgICAgIGlmICgqdGhpcyA9
PSBvdGhlcikgeworICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZyb20gaGVyZSB3ZSBjYW4gYXNz
dW1lIHRoYXQgdGhlIHR3byByZWxhdGlvbnNoaXBzIGFyZSBub3QgaWRlbnRpY2FsLiBVc3VhbGx5
IHdlIHVzZQorICAgICAgICAvLyB0aGlzIHRvIGFzc3VtZSB0aGF0IHdlIGRpZmZlcmVudCBvZmZz
ZXRzIGFueXRpbWUgdGhhdCBldmVyeXRoaW5nIGJ1dCB0aGUgb2Zmc2V0IGlzCisgICAgICAgIC8v
IGlkZW50aWNhbC4KKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pIHsK
KyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAg
ICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgb2Zmc2V0IHRvIHNlbGVjdCB0byBtZXJnZSB0aGVtLiBU
aGUgYXBwcm9wcmlhdGUgb2Zmc2V0cyBhcmUKKyAgICAgICAgICAgICAgICAvLyAtMSwgMCwgb3Ig
MS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBmaWd1cmUgb3V0
IHdoYXQgb2Zmc2V0IHdlJ2QgbGlrZSB0byB1c2UuCisgICAgICAgICAgICAgICAgaW50IGJlc3RP
ZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRoaW5nIGxpa2UgQGEgPCBAYiAr
IDIuIFdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHVuZGVyIHRoZQorICAgICAgICAgICAgICAgIC8v
IC0xLDAsMSBydWxlLgorICAgICAgICAgICAgICAgIGlmIChiZXN0T2Zmc2V0IDw9IDEpCisgICAg
ICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVz
c1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkpOworICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkgeworICAgICAgICAgICAgICAgIC8vIFRo
aXMgaXMgdGhlIHJlYWxseSBpbnRlcmVzdGluZyBjYXNlLiBXZSBoYXZlOgorICAgICAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBDCisgICAgICAgICAgICAg
ICAgLy8KKyAgICAgICAgICAgICAgICAvLyBhbmQ6CisgICAgICAgICAgICAgICAgLy8KKyAgICAg
ICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIgKyBECisgICAgICAgICAgICAgICAgLy8KKyAgICAg
ICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UnZCBsaWtlIHRvIHJldHVybjoKKyAgICAgICAgICAg
ICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICBAYSA8IEBiICsgbWF4KEMsIEQgKyAxKQor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjpt
YXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgLy8gV2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBAYSA8IEBiICsgMi4gV2UgY2Fu
J3QgZG8gaXQuCisgICAgICAgICAgICAgICAgaWYgKGJlc3RPZmZzZXQgPD0gMSkKKyAgICAgICAg
ICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhh
biwgc3RkOjptYXgoYmVzdE9mZnNldCwgLTEpKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAg
ICBBU1NFUlQob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBFcXVhbCkgewor
ICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkgeworICAgICAgICAgICAgICAg
IC8vIFdlIGhhdmUgQGEgPT0gQGIgKyBDIGFuZCBAYSA9PSBAYiArIEQsIHdoZXJlIEMgIT0gRC4g
VHVybiB0aGlzIGludG8gc29tZQorICAgICAgICAgICAgICAgIC8vIGluZXF1YWxpdHkgdGhhdCBp
bnZvbHZlcyBhIGNvbnN0YW50IHRoYXQgaXMgLTEsMCwxLgorICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIGF1dG8gbWVyZ2VUb0xlc3NUaGFuID0gW10gKFJlbGF0aW9uc2hpcCBhLCBS
ZWxhdGlvbnNoaXAgYikgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYS5zYW1lTm9kZXNB
cyhiKSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBJZiB3
ZSBoYXZlOgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyAg
ICAgQGEgPT0gQGIgKyBDIHx8IEBhID09IEBiICsgRAorICAgICAgICAgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIHdlIGNvdWxkIGFsdGVybmF0aXZlbHkgc2F5Ogor
ICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyAgICAgQGEgPCBA
YiArIG1heChDLCBEKSArIDEKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgIFJlbGF0aW9uc2hpcCByZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICBhLmxlZnQo
KSwgYS5yaWdodCgpLCBMZXNzVGhhbiwgc3RkOjptYXgoYS5vZmZzZXQoKSwgYi5vZmZzZXQoKSkg
KyAxKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1
bHQub2Zmc2V0KCkgPCAtMSB8fCByZXN1bHQub2Zmc2V0KCkgPiAxKQorICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9OworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChSZWxhdGlvbnNoaXAgbGVzc1RoYW4g
PSBtZXJnZVRvTGVzc1RoYW4oKnRoaXMsIG90aGVyKSkKKyAgICAgICAgICAgICAgICAgICAgZnVu
Y3RvcihsZXNzVGhhbik7CisgICAgICAgICAgICAgICAgaWYgKFJlbGF0aW9uc2hpcCBmbGlwcGVk
R3JlYXRlclRoYW4gPSBtZXJnZVRvTGVzc1RoYW4ob3RoZXIsICp0aGlzKSkKKyAgICAgICAgICAg
ICAgICAgICAgZnVuY3RvcihmbGlwcGVkR3JlYXRlclRoYW4uZmxpcHBlZCgpKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IC8vIFJldXNlIHRoZSBmYWN0IHRoYXQgd2UgYWxyZWFkeSBoYXZlIGhhbmRsaW5nIGZvciBMZXNz
VGhhbi5tZXJnZShFcXVhbCksIGFib3ZlLgorICAgICAgICAgICAgLy8gV2Ugd291bGRuJ3Qgc2Vl
IEdyZWF0ZXJUaGFuLm1lcmdlKEVxdWFsKSBiZWNhdXNlIG1lcmdlKCkgd291bGQgYWxyZWFkeSBo
YW5kbGUKKyAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgQVNTRVJUKG90aGVyLm1fa2lu
ZCA9PSBMZXNzVGhhbik7CisgICAgICAgICAgICBvdGhlci5tZXJnZUltcGwoKnRoaXMsIGZ1bmN0
b3IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgZ2V0
IGhlcmUgZWl0aGVyIGlmIHRoZSBraW5kIHdhcyBHcmVhdGVyVGhhbiwgd2hpY2ggc2hvdWxkIGhh
dmUgYmVlbiBoYW5kbGVkIGluCisgICAgICAgIC8vIG1lcmdlKCksIG9yIGJlY2F1c2Ugd2UgaGFk
IGFuIGludmFsaWQga2luZC4KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICB9CisgICAgCisgICAgTm9kZSogbV9sZWZ0OworICAgIE5vZGUqIG1fcmlnaHQ7CisgICAg
S2luZCBtX2tpbmQ7CisgICAgaW50IG1fb2Zmc2V0OyAvLyBUaGlzIG9mZnNldCBjYW4gYmUgYXJi
aXRyYXJpbHkgbGFyZ2UuCit9OworCit0eXBlZGVmIEhhc2hNYXA8Tm9kZSosIFZlY3RvcjxSZWxh
dGlvbnNoaXA+PiBSZWxhdGlvbnNoaXBNYXA7CisKK2NsYXNzIEludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlIDogcHVibGljIFBoYXNlIHsKK3B1YmxpYzoKKyAgICBJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZShHcmFwaCYgZ3JhcGgpCisgICAgICAgIDogUGhhc2UoZ3JhcGgsICJpbnRl
Z2VyIHJhbmdlIG9wdGltaXphdGlvbiIpCisgICAgICAgICwgbV96ZXJvKG51bGxwdHIpCisgICAg
ICAgICwgbV9yZWxhdGlvbnNoaXBzQXRIZWFkKGdyYXBoKQorICAgICAgICAsIG1faW5zZXJ0aW9u
U2V0KGdyYXBoKQorICAgIHsKKyAgICB9CisgICAgCisgICAgYm9vbCBydW4oKQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKG1fZ3JhcGgubV9mb3JtID09IFNTQSk7CisgICAgICAgIAorICAgICAgICAv
LyBCZWZvcmUgd2UgZG8gYW55dGhpbmcsIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB6ZXJvIGNv
bnN0YW50IGF0IHRoZSB0b3AuCisgICAgICAgIGZvciAoTm9kZSogbm9kZSA6ICptX2dyYXBoLmJs
b2NrKDApKSB7CisgICAgICAgICAgICBpZiAobm9kZS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgIW5v
ZGUtPmFzSW50MzIoKSkgeworICAgICAgICAgICAgICAgIG1femVybyA9IG5vZGU7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFt
X3plcm8pIHsKKyAgICAgICAgICAgIG1femVybyA9IG1faW5zZXJ0aW9uU2V0Lmluc2VydENvbnN0
YW50KDAsIE5vZGVPcmlnaW4oKSwganNOdW1iZXIoMCkpOworICAgICAgICAgICAgbV9pbnNlcnRp
b25TZXQuZXhlY3V0ZShtX2dyYXBoLmJsb2NrKDApKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkdyYXBoIGJlZm9yZSBp
bnRlZ2VyIHJhbmdlIG9wdGltaXphdGlvbjpcbiIpOworICAgICAgICAgICAgbV9ncmFwaC5kdW1w
KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEJsb2NrTGlzdCBwb3N0T3JkZXIgPSBt
X2dyYXBoLmJsb2Nrc0luUG9zdE9yZGVyKCk7CisgICAgICAgIAorICAgICAgICBib29sIGNoYW5n
ZWQgPSB0cnVlOworICAgICAgICB3aGlsZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hhbmdl
ZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBwb3N0T3JkZXJJbmRleCA9IHBv
c3RPcmRlci5zaXplKCk7IHBvc3RPcmRlckluZGV4LS07KSB7CisgICAgICAgICAgICAgICAgQmFz
aWNCbG9jayogYmxvY2sgPSBwb3N0T3JkZXJbcG9zdE9yZGVySW5kZXhdOworICAgICAgICAgICAg
ICAgIERGR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIG1fZ3JhcGgsIG51bGxwdHIsCisg
ICAgICAgICAgICAgICAgICAgIGJsb2NrID09IG1fZ3JhcGguYmxvY2soMCkgfHwgbV9zZWVuQmxv
Y2tzLmNvbnRhaW5zKGJsb2NrKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtX3Jl
bGF0aW9uc2hpcHMgPSBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXgg
PCBibG9jay0+c2l6ZSgpOyArK25vZGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBOb2Rl
KiBub2RlID0gYmxvY2stPmF0KG5vZGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2
ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiQW5hbHlzaXM6IGF0ICIs
IG5vZGUsICI6ICIsIGxpc3REdW1wKHNvcnRlZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOworICAg
ICAgICAgICAgICAgICAgICBleGVjdXRlTm9kZShub2RlKTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYnJhbmNoIG9uIGluZXF1YWxp
dHkuCisgICAgICAgICAgICAgICAgTm9kZSogdGVybWluYWwgPSBibG9jay0+dGVybWluYWwoKTsK
KyAgICAgICAgICAgICAgICBib29sIGFscmVhZHlNZXJnZWQgPSBmYWxzZTsKKyAgICAgICAgICAg
ICAgICBpZiAodGVybWluYWwtPm9wKCkgPT0gQnJhbmNoKSB7CisgICAgICAgICAgICAgICAgICAg
IE5vZGUqIGNvbXBhcmUgPSB0ZXJtaW5hbC0+Y2hpbGQxKCkubm9kZSgpOworICAgICAgICAgICAg
ICAgICAgICBzd2l0Y2ggKGNvbXBhcmUtPm9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZVN0cmljdEVxOgor
ICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgorICAgICAgICAgICAgICAgICAg
ICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdy
ZWF0ZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcTogeworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJV
c2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXA7
CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbXBhcmUtPm9wKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUVxOgorICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVs
YXRpb25zaGlwID0gUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpFcXVhbCwgMCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAg
ICBjYXNlIENvbXBhcmVMZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9u
c2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29t
cGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4sIDApOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlTGVzc0VxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9u
c2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29t
cGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4sIDEpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlv
bnNoaXAgPSBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAwKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFu
LCAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERGR19DUkFT
SChtX2dyYXBoLCBjb21wYXJlLCAiSW52YWxpZCBjb21wYXJpc29uIG5vZGUgdHlwZSIpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIERGR19BU1NF
UlQobV9ncmFwaCwgY29tcGFyZSwgcmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIFJlbGF0aW9uc2hpcE1hcCBmb3JUcnVlID0gbV9yZWxhdGlvbnNoaXBzOworICAgICAgICAg
ICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvckZhbHNlID0gbV9yZWxhdGlvbnNoaXBz
OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
dmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJEZWFsaW5nIHdp
dGggdHJ1ZTpcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKGZv
clRydWUsIHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVsYXRp
b25zaGlwIGludmVyc2UgPSByZWxhdGlvbnNoaXAuaW52ZXJzZSgpKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRhdGFMb2coIkRlYWxpbmcgd2l0aCBmYWxzZTpcbiIpOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChmb3JGYWxzZSwgaW52ZXJzZSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JUcnVlLCB0ZXJtaW5hbC0+YnJhbmNoRGF0
YSgpLT50YWtlbi5ibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1l
cmdlVG8oZm9yRmFsc2UsIHRlcm1pbmFsLT5icmFuY2hEYXRhKCktPm5vdFRha2VuLmJsb2NrKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlNZXJnZWQgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeU1lcmdlZCkgeworICAgICAgICAgICAgICAg
ICAgICBmb3IgKEJhc2ljQmxvY2sqIHN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNjZXNzb3JzKCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8obV9yZWxhdGlvbnNoaXBz
LCBzdWNjZXNzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKEJhc2lj
QmxvY2sqIGJsb2NrIDogbV9ncmFwaC5ibG9ja3NJbk5hdHVyYWxPcmRlcigpKSB7CisgICAgICAg
ICAgICBtX3JlbGF0aW9uc2hpcHMgPSBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAg
ICAgICAgICAgZm9yICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXggPCBibG9jay0+
c2l6ZSgpOyArK25vZGVJbmRleCkgeworICAgICAgICAgICAgICAgIE5vZGUqIG5vZGUgPSBibG9j
ay0+YXQobm9kZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAg
ICAgICAgICAgICAgZGF0YUxvZygiVHJhbnNmb3JtYXRpb246IGF0ICIsIG5vZGUsICI6ICIsIGxp
c3REdW1wKHNvcnRlZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIC8vIFRoaXMgZW5kcyB1cCBiZWluZyBwcmV0dHkgYXdrd2FyZCB0byB3
cml0ZSBiZWNhdXNlIHdlIG5lZWQgdG8gZGVjaWRlIGlmIHdlCisgICAgICAgICAgICAgICAgLy8g
b3B0aW1pemUgYnkgdXNpbmcgdGhlIHJlbGF0aW9uc2hpcHMgYmVmb3JlIHRoZSBvcGVyYXRpb24s
IGJ1dCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlTm9kZSgpIGJl
Zm9yZSB3ZSBvcHRpbWl6ZS4KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPm9wKCkpIHsK
KyAgICAgICAgICAgICAgICBjYXNlIEFyaXRoQWRkOiB7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghbm9kZS0+aXNCaW5hcnlVc2VLaW5kKEludDMyVXNlKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS0+YXJpdGhNb2RlKCkgIT0g
QXJpdGg6OkNoZWNrT3ZlcmZsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNvbnN0YW50KCkp
CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRpb25zaGlwcy5maW5kKG5vZGUt
PmNoaWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyID09IG1fcmVs
YXRpb25zaGlwcy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pblZhbHVlID0gc3RkOjpu
dW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFZh
bHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAg
ICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG1pblZhbHVlID0gc3RkOjptYXgobWluVmFsdWUsIHJlbGF0aW9u
c2hpcC5taW5WYWx1ZU9mTGVmdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVl
ID0gc3RkOjptaW4obWF4VmFsdWUsIHJlbGF0aW9uc2hpcC5tYXhWYWx1ZU9mTGVmdCgpKTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG1pblZhbHVlLCBub2RlLT5jaGlsZDIoKS0+YXNJ
bnQzMigpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtT3ZlcmZsb3dzPGludD4obWF4
VmFsdWUsIG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCkpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBleGVj
dXRlTm9kZShibG9jay0+YXQobm9kZUluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIG5vZGUt
PnNldEFyaXRoTW9kZShBcml0aDo6VW5jaGVja2VkKTsKKyAgICAgICAgICAgICAgICAgICAgY2hh
bmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBDaGVja0luQm91
bmRzOiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRpb25zaGlwcy5m
aW5kKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVy
ID09IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBub25OZWdh
dGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBib29sIGxlc3NUaGFuTGVuZ3RoID0g
ZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hp
cCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25z
aGlwLm1pblZhbHVlT2ZMZWZ0KCkgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
b25OZWdhdGl2ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAucmlnaHQoKSA9PSBub2RlLT5jaGlsZDIoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCgpID09
IFJlbGF0aW9uc2hpcDo6RXF1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYg
cmVsYXRpb25zaGlwLm9mZnNldCgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbGVzc1RoYW5MZW5ndGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCgpID09IFJl
bGF0aW9uc2hpcDo6TGVzc1RoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYg
cmVsYXRpb25zaGlwLm9mZnNldCgpIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGxlc3NUaGFuTGVuZ3RoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKG5vbk5lZ2F0aXZlICYmIGxlc3NUaGFuTGVuZ3RoKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBleGVjdXRlTm9kZShibG9jay0+YXQobm9kZUluZGV4KSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBub2RlLT5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNo
YW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJs
b2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgZXhl
Y3V0ZU5vZGUoTm9kZSogbm9kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkg
eworICAgICAgICBjYXNlIENoZWNrSW5Cb3VuZHM6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9u
c2hpcChSZWxhdGlvbnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBub2RlLT5jaGlsZDIoKS5u
b2RlKCksIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4pKTsKKyAgICAgICAgICAgIHNldFJlbGF0aW9u
c2hpcChSZWxhdGlvbnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9u
c2hpcDo6R3JlYXRlclRoYW4sIC0xKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgIC8vIFdl
J3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBpbnQzMiBhZGRpdGlvbnMgYW5kIHdlIGN1cnJlbnRseSBv
bmx5IGtub3cgaG93IHRvCisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIG5vbi13cmFwcGluZyBv
bmVzLgorICAgICAgICAgICAgaWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBGSVhN
RTogV2UgY291bGQgaGFuZGxlIHRoZSB1bmNoZWNrZWQgYXJpdGhtZXRpYyBjYXNlLiBXZSBqdXN0
IGRvIGl0IGRvbid0IHJpZ2h0CisgICAgICAgICAgICAvLyBub3cuCisgICAgICAgICAgICBpZiAo
bm9kZS0+YXJpdGhNb2RlKCkgIT0gQXJpdGg6OkNoZWNrT3ZlcmZsb3cpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEhhbmRsZSBhZGQ6IEB2YWx1
ZSArIGNvbnN0YW50LgorICAgICAgICAgICAgaWYgKCFub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNv
bnN0YW50KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGludCBvZmZzZXQgPSBub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpOworICAgICAgICAgICAg
CisgICAgICAgICAgICAvLyBXZSBhZGQgYSByZWxhdGlvbnNoaXAgZm9yIEBhZGQgPT0gQHZhbHVl
ICsgY29uc3RhbnQsIGFuZCB0aGVuIHdlIGNvcHkgdGhlCisgICAgICAgICAgICAvLyByZWxhdGlv
bnNoaXBzIGZvciBAdmFsdWUuIFRoaXMgZ2l2ZXMgdXMgYSBvbmUtZGVlcCB2aWV3IG9mIEB2YWx1
ZSdzIGV4aXN0aW5nCisgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLCB3aGljaCBtYXRjaGVz
IHRoZSBvbmUtZGVlcCBzZWFyY2ggaW4gc2V0UmVsYXRpb25zaGlwKCkuCisgICAgICAgICAgICAK
KyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXAobm9kZSwgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBSZWxhdGlvbnNoaXA6OkVxdWFsLCBvZmZz
ZXQpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNo
aXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9
IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlv
bnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9u
c2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBu
ZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChu
ZXdSZWxhdGlvbnNoaXAucmlnaHQoKSA9PSBub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG5v
ZGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLmFkZFRvT2Zmc2V0
KG9mZnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0b0FkZC5hcHBlbmQobmV3UmVsYXRp
b25zaGlwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlv
bnNoaXAgcmVsYXRpb25zaGlwIDogdG9BZGQpCisgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0
aW9uc2hpcChyZWxhdGlvbnNoaXAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICAvLyBOb3cgd2Ugd2FudCB0byBlc3RhYmxpc2ggdGhhdCBib3RoIHRoZSBpbnB1
dCBhbmQgdGhlIG91dHB1dCBvZiB0aGUgYWRkaXRpb24gYXJlCisgICAgICAgICAgICAvLyB3aXRo
aW4gYSBwYXJ0aWN1bGFyIHJhbmdlIG9mIGludGVnZXJzLgorICAgICAgICAgICAgCisgICAgICAg
ICAgICBpZiAob2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFk
ZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQgQHZhbHVlIDw9IG1heCAtIDEsIGkuZS4g
dGhhdAorICAgICAgICAgICAgICAgIC8vIEB2YWx1ZSA8IG1heC4KKyAgICAgICAgICAgICAgICBz
ZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCgKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96ZXJvLCBSZWxhdGlv
bnNoaXA6Okxlc3NUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xp
bWl0czxpbnQ+OjptYXgoKSAtIG9mZnNldCArIDEpLAorICAgICAgICAgICAgICAgICAgICAwKTsK
KyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRk
OiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBAYWRkID49IG1pbiArIDEsIGkuZS4gdGhh
dAorICAgICAgICAgICAgICAgIC8vIEBhZGQgPiBtaW4uCisgICAgICAgICAgICAgICAgc2V0UmVs
YXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAoCisgICAgICAgICAg
ICAgICAgICAgICAgICBub2RlLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sCisg
ICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpICsg
b2Zmc2V0IC0gMSksCisgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAg
IC8vIElmIHdlIGhhdmUgImFkZDogQHZhbHVlIC0gMSIgdGhlbiB3ZSBrbm93IHRoYXQgQHZhbHVl
ID49IG1pbiArIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEB2YWx1ZSA+IG1pbi4K
KyAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUo
KSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLAorICAgICAgICAgICAgICAgICAg
ICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9mZnNldCAtIDEpLAorICAg
ICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAv
LyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSAtMSAxIiB0aGVuIHdlIGtub3cgdGhhdCBAYWRkIDw9
IG1heCAtIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEBhZGQgPCBtYXguCisgICAg
ICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlv
bnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLCBtX3plcm8sIFJlbGF0aW9uc2hp
cDo6TGVzc1RoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRz
PGludD46Om1heCgpIC0gb2Zmc2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgIDApOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICBjYXNlIEdldEFycmF5TGVuZ3RoOiB7CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNo
aXAoUmVsYXRpb25zaGlwKG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwg
LTEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgY2FzZSBVcHNpbG9uOiB7CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+cGhpKCks
IFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0
byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAg
ICAgICAgICAgIGlmIChpdGVyICE9IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAg
ICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAo
UmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAg
ICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChub2RlLT5waGkoKSA9PSBuZXdSZWxhdGlvbnNoaXAucmlnaHQo
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAg
ICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2RlLT5waGkoKSk7CisgICAgICAgICAgICAgICAg
ICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAg
ICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNp
Z25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIHNldFJlbGF0aW9uc2hpcChtX3Jl
bGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAg
IHZvaWQgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICBSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9u
c2hpcE1hcCwgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9
IDEpCisgICAgeworICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25z
aGlwLCB0aW1lVG9MaXZlKTsKKyAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIHJl
bGF0aW9uc2hpcC5mbGlwcGVkKCksIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICB2b2lk
IHNldE9uZVNpZGUoCisgICAgICAgIFJlbGF0aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBS
ZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7
CisgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZGF0YUxvZygiICAgIFNldHRpbmc6
ICIsIHJlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgIAorICAgICAgICBhdXRvIHJlc3VsdCA9
IHJlbGF0aW9uc2hpcE1hcC5hZGQoCisgICAgICAgICAgICByZWxhdGlvbnNoaXAubGVmdCgpLCBW
ZWN0b3I8UmVsYXRpb25zaGlwPigpKTsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4mIHJl
bGF0aW9uc2hpcHMgPSByZXN1bHQuaXRlcmF0b3ItPnZhbHVlOworICAgICAgICBWZWN0b3I8UmVs
YXRpb25zaGlwPiB0b0FkZDsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBm
b3IgKFJlbGF0aW9uc2hpcCYgb3RoZXJSZWxhdGlvbnNoaXAgOiByZWxhdGlvbnNoaXBzKSB7Cisg
ICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlvbnNoaXAuc2FtZU5vZGVzQXMocmVsYXRpb25zaGlw
KSkgeworICAgICAgICAgICAgICAgIGlmIChSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPSBvdGhlclJl
bGF0aW9uc2hpcC5maWx0ZXIocmVsYXRpb25zaGlwKSkgeworICAgICAgICAgICAgICAgICAgICBv
dGhlclJlbGF0aW9uc2hpcCA9IGZpbHRlcmVkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYg
b3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAgICAg
ICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gb3RoZXJSZWxhdGlvbnNo
aXA7CisgICAgICAgICAgICAgICAgaWYgKG5ld1JlbGF0aW9uc2hpcC5yaWdodCgpICE9IG90aGVy
UmVsYXRpb25zaGlwLnJpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25z
aGlwLnNldExlZnQob3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSk7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChuZXdSZWxhdGlvbnNoaXAuYWRkVG9PZmZzZXQob3RoZXJSZWxhdGlvbnNoaXAub2Zm
c2V0KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9u
c2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgcmVsYXRpb25zaGlwcy5hcHBl
bmQocmVsYXRpb25zaGlwKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIGFu
b3RoZXJSZWxhdGlvbnNoaXAgOiB0b0FkZCkgeworICAgICAgICAgICAgQVNTRVJUKHRpbWVUb0xp
dmUpOworICAgICAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIGFub3RoZXJSZWxh
dGlvbnNoaXAsIHRpbWVUb0xpdmUgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBi
b29sIG1lcmdlVG8oUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBNYXAsIEJhc2ljQmxvY2sq
IHRhcmdldCkKKyAgICB7CisgICAgICAgIGlmIChtX3NlZW5CbG9ja3MuYWRkKHRhcmdldCkpIHsK
KyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgYmxvY2suIFdlIGNvcHkgc3ViamVjdCB0byBs
aXZlbmVzcyBwcnVuaW5nLgorICAgICAgICAgICAgYXV0byBpc0xpdmUgPSBbJl0gKE5vZGUqIG5v
ZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBtX3plcm8pCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQtPnNzYS0+
bGl2ZUF0SGVhZC5jb250YWlucyhub2RlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiByZWxhdGlvbnNoaXBNYXApIHsKKyAgICAg
ICAgICAgICAgICBpZiAoIWlzTGl2ZShlbnRyeS5rZXkpKQorICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWZWN0b3I8UmVsYXRp
b25zaGlwPiB2YWx1ZXM7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRp
b25zaGlwIDogZW50cnkudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHJlbGF0
aW9uc2hpcC5sZWZ0KCkgPT0gZW50cnkua2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlz
TGl2ZShyZWxhdGlvbnNoaXAucmlnaHQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1
ZXMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVu
ZCgpKTsKKyAgICAgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5hZGQo
ZW50cnkua2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1lcmdlIGJ5IGludGVyc2VjdGlu
Zy4gV2UgaGF2ZSBubyBub3Rpb24gb2YgQk9UVE9NLCBzbyB3ZSB1c2UgdGhlIG9taXNzaW9uIG9m
CisgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgZm9yIGEgcGFpciBvZiBub2RlcyB0byBtZWFuIFRP
UC4gVGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3QgbmVlZCBCT1RUT00KKyAgICAgICAgLy8gaXMgKDEp
IHdlIGp1c3Qgb3ZlcmFwcHJveGltYXRlIGNvbnRyYWRpY3Rpb25zIGFuZCAoMikgYSB2YWx1ZSBu
ZXZlciBoYXZpbmcgYmVlbgorICAgICAgICAvLyBhc3NpZ25lZCB3b3VsZCBvbmx5IGhhcHBlbiBp
ZiB3ZSBoYXZlIG5vdCBwcm9jZXNzZWQgdGhlIG5vZGUncyBwcmVkZWNlc3Nvci4gV2UKKyAgICAg
ICAgLy8gc2hvdWxkbid0IHByb2Nlc3MgYmxvY2tzIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIHRo
ZSBibG9jaydzIHByZWRlY2Vzc29yIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gYXJlIHVzaW5nIFJQ
Ty4KKyAgICAgICAgVmVjdG9yPE5vZGUqPiB0b1JlbW92ZTsKKyAgICAgICAgYm9vbCBjaGFuZ2Vk
ID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3JlbGF0aW9uc2hpcHNBdEhl
YWRbdGFyZ2V0XSkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gcmVsYXRpb25zaGlwTWFwLmZp
bmQoZW50cnkua2V5KTsKKyAgICAgICAgICAgIGlmIChpdGVyID09IHJlbGF0aW9uc2hpcE1hcC5l
bmQoKSkgeworICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChlbnRyeS5rZXkpOworICAg
ICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBWZWN0b3I8UmVsYXRpb25z
aGlwPiB2YWx1ZXM7CisgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCB0YXJnZXRSZWxhdGlv
bnNoaXAgOiBlbnRyeS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
IHNvdXJjZVJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAg
IHRhcmdldFJlbGF0aW9uc2hpcC5tZXJnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJj
ZVJlbGF0aW9uc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmXSAoUmVsYXRpb25zaGlw
IG5ld1JlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5h
cHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1
ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS52YWx1ZSA9
PSB2YWx1ZXMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWVzOworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7
CisgICAgICAgIH0KKyAgICAgICAgZm9yIChOb2RlKiBub2RlIDogdG9SZW1vdmUpCisgICAgICAg
ICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5yZW1vdmUobm9kZSk7CisgICAgICAg
IAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisgICAgCisgICAgVmVjdG9yPFJlbGF0
aW9uc2hpcD4gc29ydGVkUmVsYXRpb25zaGlwcygpCisgICAgeworICAgICAgICBWZWN0b3I8UmVs
YXRpb25zaGlwPiByZXN1bHQ7CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3JlbGF0aW9u
c2hpcHMpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kVmVjdG9yKGVudHJ5LnZhbHVlKTsKKyAg
ICAgICAgc3RkOjpzb3J0KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBOb2RlKiBtX3plcm87CisgICAgUmVsYXRp
b25zaGlwTWFwIG1fcmVsYXRpb25zaGlwczsKKyAgICBCbG9ja1NldCBtX3NlZW5CbG9ja3M7Cisg
ICAgQmxvY2tNYXA8UmVsYXRpb25zaGlwTWFwPiBtX3JlbGF0aW9uc2hpcHNBdEhlYWQ7CisgICAg
SW5zZXJ0aW9uU2V0IG1faW5zZXJ0aW9uU2V0OworfTsKKyAgICAKK30gLy8gYW5vbnltb3VzIG5h
bWVzcGFjZQorCitib29sIHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oR3JhcGgmIGdy
YXBoKQoreworICAgIFNhbXBsaW5nUmVnaW9uIHNhbXBsaW5nUmVnaW9uKCJERkcgSW50ZWdlciBS
YW5nZSBPcHRpbWl6YXRpb24gUGhhc2UiKTsKKyAgICByZXR1cm4gcnVuUGhhc2U8SW50ZWdlclJh
bmdlT3B0aW1pemF0aW9uUGhhc2U+KGdyYXBoKTsKK30KKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6
OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZu
ZGVmIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gKKyNkZWZpbmUgREZHSW50ZWdl
clJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAorCisjaWYgRU5BQkxFKERGR19KSVQpCisKK25hbWVz
cGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworY2xhc3MgR3JhcGg7CisKKy8vIFJlbW92ZXMg
b3ZlcmZsb3cgY2hlY2tzIGFuZCBvdXQtb2YtYm91bmRzIGNoZWNrcyBieSBkb2luZyBhIGZvcndh
cmQgZmxvdyBhbmFseXNpcyB0byBwcm92ZQorLy8gaW5lcXVhbGl0aWVzLgorCitib29sIHBlcmZv
cm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oR3JhcGgmKTsKKworfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisKKyNlbmRpZiAvLyBERkdJbnRl
Z2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHUGxhbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdQbGFuLmNwcAkocmV2aXNpb24gMTg1MzY5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdQbGFuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1
ZGUgIkRGR0ZpeHVwUGhhc2UuaCIKICNpbmNsdWRlICJERkdHcmFwaFNhZmVwb2ludC5oIgogI2lu
Y2x1ZGUgIkRGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNlLmgiCisjaW5jbHVkZSAiREZHSW50
ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCIKICNpbmNsdWRlICJERkdJbnZhbGlkYXRpb25Q
b2ludEluamVjdGlvblBoYXNlLmgiCiAjaW5jbHVkZSAiREZHSklUQ29tcGlsZXIuaCIKICNpbmNs
dWRlICJERkdMSUNNUGhhc2UuaCIKQEAgLTM1Nyw2ICszNTgsOCBAQCBQbGFuOjpDb21waWxhdGlv
blBhdGggUGxhbjo6Y29tcGlsZUluVGhyCiAgICAgICAgIHBlcmZvcm1Db25zdGFudEhvaXN0aW5n
KGRmZyk7CiAgICAgICAgIHBlcmZvcm1HbG9iYWxDU0UoZGZnKTsKICAgICAgICAgcGVyZm9ybUxp
dmVuZXNzQW5hbHlzaXMoZGZnKTsKKyAgICAgICAgcGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXph
dGlvbihkZmcpOworICAgICAgICBwZXJmb3JtTGl2ZW5lc3NBbmFseXNpcyhkZmcpOwogICAgICAg
ICBwZXJmb3JtQ0ZBKGRmZyk7CiAgICAgICAgIHBlcmZvcm1Db25zdGFudEZvbGRpbmcoZGZnKTsK
ICAgICAgICAgcGVyZm9ybUNsZWFuVXAoZGZnKTsgLy8gUmVkdWNlIHRoZSBncmFwaCBzaXplIGEg
bG90Lgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254597</attachid>
            <date>2015-06-09 13:33:48 -0700</date>
            <delta_ts>2015-06-09 15:26:14 -0700</delta_ts>
            <desc>for real this time</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>44030</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODUzNjkpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBD
MTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdC
cmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0
OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBE
RkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1
cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8q
IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBE
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIy
NzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5
RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAg
Ki87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAw
RUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1v
dmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3Bw
ICovOyB9OwpAQCAtMjE2MSw2ICsyMTYzLDggQEAKIAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlB
IC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUg
PSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8q
IEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVj
b2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUy
M0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBw
YXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdl
T3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1l
ID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJS
YW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1p
emF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURG
MDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9j
aC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0g
ZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFE
RjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRo
ID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtNDk5Myw2ICs0OTk3LDggQEAKIAkJCQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUg
LyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0
MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBG
MzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5o
ICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjEx
OTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAog
CQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVj
dGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENv
ZGUuY3BwICovLApAQCAtNTYzMCw2ICs1NjM2LDcgQEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4
NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4g
SGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJh
bmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZC
REUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4
MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8s
CkBAIC03MzcwLDYgKzczNzcsNyBAQAogCQkJCTBGMkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBK
U0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0
MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEz
NTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4
OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0Jv
dW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVG
MDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQw
Rjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2Vz
ICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDkyNSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCIKKworI2lmIEVOQUJMRShERkdf
SklUKQorCisjaW5jbHVkZSAiREZHQmxvY2tNYXBJbmxpbmVzLmgiCisjaW5jbHVkZSAiREZHR3Jh
cGguaCIKKyNpbmNsdWRlICJERkdJbnNlcnRpb25TZXQuaCIKKyNpbmNsdWRlICJERkdQaGFzZS5o
IgorI2luY2x1ZGUgIkRGR1ByZWRpY3Rpb25Qcm9wYWdhdGlvblBoYXNlLmgiCisjaW5jbHVkZSAi
REZHVmFyaWFibGVBY2Nlc3NEYXRhRHVtcC5oIgorI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKKwor
bmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgeworCituYW1lc3BhY2UgeworCitjb25zdCBi
b29sIHZlcmJvc2UgPSBmYWxzZTsKKworaW50NjRfdCBjbGFtcGVkU3VtSW1wbCgpIHsgcmV0dXJu
IDA7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KK2ludDY0X3QgY2xhbXBlZFN1bUlt
cGwoaW50IGxlZnQsIEFyZ3MuLi4gYXJncykKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50
NjRfdD4obGVmdCkgKyBjbGFtcGVkU3VtSW1wbChhcmdzLi4uKTsKK30KKwordGVtcGxhdGU8dHlw
ZW5hbWUuLi4gQXJncz4KK2ludCBjbGFtcGVkU3VtKEFyZ3MuLi4gYXJncykKK3sKKyAgICBpbnQ2
NF90IHJlc3VsdCA9IGNsYW1wZWRTdW1JbXBsKGFyZ3MuLi4pOworICAgIHJldHVybiBzdGQ6Om1p
bigKKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+
OjptYXgoKSksCisgICAgICAgIHN0ZDo6bWF4KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50
NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSksCisgICAgICAgICAgICByZXN1
bHQpKTsKK30KKworY2xhc3MgUmVsYXRpb25zaGlwIHsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQg
eworICAgICAgICBMZXNzVGhhbiwKKyAgICAgICAgRXF1YWwsCisgICAgICAgIEdyZWF0ZXJUaGFu
CisgICAgfTsKKyAgICAKKyAgICBzdGF0aWMgS2luZCBpbnZlcnNlKEtpbmQga2luZCkKKyAgICB7
CisgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICBjYXNlIExlc3NUaGFuOgorICAgICAg
ICAgICAgcmV0dXJuIEdyZWF0ZXJUaGFuOworICAgICAgICBjYXNlIEVxdWFsOgorICAgICAgICAg
ICAgcmV0dXJuIEVxdWFsOworICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgICAgICAgICAg
cmV0dXJuIExlc3NUaGFuOworICAgICAgICB9CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgICAgIHJldHVybiBraW5kOworICAgIH0KKyAgICAKKyAgICBSZWxhdGlv
bnNoaXAoKQorICAgICAgICA6IG1fbGVmdChudWxscHRyKQorICAgICAgICAsIG1fcmlnaHQobnVs
bHB0cikKKyAgICAgICAgLCBtX2tpbmQoRXF1YWwpCisgICAgICAgICwgbV9vZmZzZXQoMCkKKyAg
ICB7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcChOb2RlKiBsZWZ0LCBOb2RlKiByaWdo
dCwgS2luZCBraW5kLCBpbnQgb2Zmc2V0ID0gMCkKKyAgICAgICAgOiBtX2xlZnQobGVmdCkKKyAg
ICAgICAgLCBtX3JpZ2h0KHJpZ2h0KQorICAgICAgICAsIG1fa2luZChraW5kKQorICAgICAgICAs
IG1fb2Zmc2V0KG9mZnNldCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCk7
CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fcmlnaHQpOworICAgICAgICBSRUxFQVNFX0FTU0VS
VChtX2xlZnQgIT0gbV9yaWdodCk7CisgICAgfQorICAgIAorICAgIHR5cGVkZWYgdm9pZCogKFJl
bGF0aW9uc2hpcDo6KlVuc3BlY2lmaWVkQm9vbFR5cGUpOworCisgICAgb3BlcmF0b3IgVW5zcGVj
aWZpZWRCb29sVHlwZSooKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbGVmdCA/IHJl
aW50ZXJwcmV0X2Nhc3Q8VW5zcGVjaWZpZWRCb29sVHlwZSo+KDEpIDogMDsKKyAgICB9CisgICAg
CisgICAgTm9kZSogbGVmdCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVmdDsgfQorICAgIE5vZGUqIHJp
Z2h0KCkgY29uc3QgeyByZXR1cm4gbV9yaWdodDsgfQorICAgIEtpbmQga2luZCgpIGNvbnN0IHsg
cmV0dXJuIG1fa2luZDsgfQorICAgIGludCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX29mZnNl
dDsgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCBmbGlwcGVkKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmICghKnRoaXMpCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAg
ICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9yaWdodCwgbV9sZWZ0LCBpbnZlcnNlKG1fa2luZCks
IC1tX29mZnNldCk7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCBpbnZlcnNlKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgRXF1YWw6
CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIGNhc2UgTGVzc1Ro
YW46CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIC0xKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICByZXR1cm4g
UmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgR3JlYXRlclRoYW4sIG1fb2Zmc2V0IC0gMSk7
CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dz
PGludD4obV9vZmZzZXQsIDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAo
KTsKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNz
VGhhbiwgbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBpc0Nhbm9uaWNh
bCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVmdCA8IG1fcmlnaHQ7IH0KKyAgICAKKyAgICBSZWxhdGlv
bnNoaXAgY2Fub25pY2FsKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0Nhbm9uaWNhbCgp
KQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICByZXR1cm4gZmxpcHBlZCgpOwor
ICAgIH0KKyAgICAKKyAgICBib29sIHNhbWVOb2Rlc0FzKGNvbnN0IFJlbGF0aW9uc2hpcCYgb3Ro
ZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID09IG90aGVyLm1fbGVmdAor
ICAgICAgICAgICAgJiYgbV9yaWdodCA9PSBvdGhlci5tX3JpZ2h0OworICAgIH0KKyAgICAKKyAg
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBzYW1lTm9kZXNBcyhvdGhlcikKKyAgICAgICAgICAgICYmIG1fa2lu
ZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zm
c2V0OworICAgIH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBSZWxhdGlvbnNoaXAm
IG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fbGVmdCAhPSBvdGhlci5tX2xlZnQp
CisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0IDwgb3RoZXIubV9sZWZ0OworICAgICAgICBpZiAo
bV9yaWdodCAhPSBvdGhlci5tX3JpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIG1fcmlnaHQgPCBv
dGhlci5tX3JpZ2h0OworICAgICAgICBpZiAobV9raW5kICE9IG90aGVyLm1fa2luZCkKKyAgICAg
ICAgICAgIHJldHVybiBtX2tpbmQgPCBvdGhlci5tX2tpbmQ7CisgICAgICAgIHJldHVybiBtX29m
ZnNldCA8IG90aGVyLm1fb2Zmc2V0OworICAgIH0KKyAgICAKKyAgICAvLyBJZiBwb3NzaWJsZSwg
cmV0dXJucyBhIGZvcm0gb2YgdGhpcyByZWxhdGlvbnNoaXAgd2hlcmUgdGhlIGdpdmVuIG5vZGUg
aXMgdGhlIGxlZnQKKyAgICAvLyBzaWRlLiBSZXR1cm5zIGEgbnVsbCByZWxhdGlvbnNoaXAgaWYg
dGhpcyByZWxhdGlvbnNoaXAgY2Fubm90IHNheSBhbnl0aGluZyBhYm91dCB0aGlzCisgICAgLy8g
bm9kZS4KKyAgICBSZWxhdGlvbnNoaXAgZm9yTm9kZShOb2RlKiBub2RlKSBjb25zdAorICAgIHsK
KyAgICAgICAgaWYgKG1fbGVmdCA9PSBub2RlKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOwor
ICAgICAgICBpZiAobV9yaWdodCA9PSBub2RlKQorICAgICAgICAgICAgcmV0dXJuIGZsaXBwZWQo
KTsKKyAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgIH0KKyAgICAKKyAgICB2b2lk
IHNldExlZnQoTm9kZSogbGVmdCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGxlZnQg
IT0gbV9yaWdodCk7CisgICAgICAgIG1fbGVmdCA9IGxlZnQ7CisgICAgfQorICAgIGJvb2wgYWRk
VG9PZmZzZXQoaW50IG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50
PihtX29mZnNldCwgb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
bV9vZmZzZXQgKz0gb2Zmc2V0OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIG1lcmdlKGNvbnN0IFJlbGF0
aW9uc2hpcCYgb3RoZXIsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIGNvbnN0CisgICAgeworICAg
ICAgICBpZiAobV9raW5kID09IEdyZWF0ZXJUaGFuIHx8IChtX2tpbmQgIT0gTGVzc1RoYW4gJiYg
b3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKSkgeworICAgICAgICAgICAgLy8gUmV1c2UgdGhl
IGZhY3QgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgaGFuZGxpbmcgZm9yIExlc3NUaGFuLm1lcmdlKC4u
LikuIFdlIGNhbiB1c2UKKyAgICAgICAgICAgIC8vIHRoYXQgY29kZSBieSBmbGlwcGluZyB0aGUg
cmVsYXRpb25zaGlwcyBhcm91bmQuCisgICAgICAgICAgICBmbGlwcGVkKCkubWVyZ2VJbXBsKAor
ICAgICAgICAgICAgICAgIG90aGVyLmZsaXBwZWQoKSwKKyAgICAgICAgICAgICAgICBbJl0gKFJl
bGF0aW9uc2hpcCByZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rvcihy
ZWxhdGlvbnNoaXAuZmxpcHBlZCgpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbWVyZ2VJbXBsKG90aGVyLCBm
dW5jdG9yKTsKKyAgICB9CisgICAgCisgICAgLy8gUmV0dXJucyBhIG51bGwgcmVsYXRpb25zaGlw
IGlmIHRoZSBmaWx0cmF0aW9uIHNob3VsZCBiZSBleHByZXNzZWQgYXMgdHdvIGRpZmZlcmVudAor
ICAgIC8vIHJlbGF0aW9uc2hpcHMuCisgICAgUmVsYXRpb25zaGlwIGZpbHRlcihjb25zdCBSZWxh
dGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50
ZXJlc3RlZCBpbiBtZXJnaW5nIHJlbGF0aW9uc2hpcHMgb3ZlciB0aGUgc2FtZSBub2Rlcy4KKyAg
ICAgICAgQVNTRVJUKHNhbWVOb2Rlc0FzKG90aGVyKSk7CisgICAgICAgIAorICAgICAgICBpZiAo
KnRoaXMgPT0gb3RoZXIpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIAorICAg
ICAgICAvLyBXZSB3YW50IGVxdWFsaXR5IHRvIHRha2UgcHJlY2VkZW50IG92ZXIgZXZlcnl0aGlu
ZyBlbHNlLgorICAgICAgICBpZiAobV9raW5kID09IEVxdWFsKQorICAgICAgICAgICAgcmV0dXJu
ICp0aGlzOworICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEVxdWFsKQorICAgICAgICAgICAg
cmV0dXJuIG90aGVyOworICAgICAgICAKKyAgICAgICAgLy8gRnJvbSBoZXJlIHdlIGNhbiBhc3N1
bWUgdGhhdCB0aGUgdHdvIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBpZGVudGljYWwuIFVzdWFsbHkg
d2UgdXNlCisgICAgICAgIC8vIHRoaXMgdG8gYXNzdW1lIHRoYXQgd2UgZGlmZmVyZW50IG9mZnNl
dHMgYW55dGltZSB0aGF0IGV2ZXJ5dGhpbmcgYnV0IHRoZSBvZmZzZXQgaXMKKyAgICAgICAgLy8g
aWRlbnRpY2FsLgorICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikgewor
ICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAg
ICAgIHJldHVybiBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIG1fbGVmdCwgbV9y
aWdodCwgTGVzc1RoYW4sIHN0ZDo6bWluKG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCkpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBBU1NFUlQob3RoZXIubV9raW5k
ID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihtX29m
ZnNldCwgLTEpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAg
ICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihvdGhlci5tX29mZnNldCwgMSkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgaWYgKG1fb2Zmc2V0
IC0gMSA9PSBvdGhlci5tX29mZnNldCArIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0
aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCAtIDEpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gR3JlYXRlclRoYW4pOworICAgICAgICByZXR1
cm4gZmxpcHBlZCgpLmZpbHRlcihvdGhlci5mbGlwcGVkKCkpLmZsaXBwZWQoKTsKKyAgICB9Cisg
ICAgCisgICAgaW50IG1pblZhbHVlT2ZMZWZ0KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X2xlZnQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdC0+YXNJ
bnQzMigpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikKKyAgICAg
ICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAK
KyAgICAgICAgaW50IG1pblJpZ2h0VmFsdWU7CisgICAgICAgIGlmIChtX3JpZ2h0LT5pc0ludDMy
Q29uc3RhbnQoKSkKKyAgICAgICAgICAgIG1pblJpZ2h0VmFsdWUgPSBtX3JpZ2h0LT5hc0ludDMy
KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1pblJpZ2h0VmFsdWUgPSBzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBH
cmVhdGVyVGhhbikKKyAgICAgICAgICAgIHJldHVybiBjbGFtcGVkU3VtKG1pblJpZ2h0VmFsdWUs
IG1fb2Zmc2V0LCAxKTsKKyAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1ZSwg
bV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBpbnQgbWF4VmFsdWVPZkxlZnQoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgaWYgKG1fbGVmdC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAg
ICByZXR1cm4gbV9sZWZ0LT5hc0ludDMyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5k
ID09IEdyZWF0ZXJUaGFuKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8
aW50Pjo6bWF4KCk7CisgICAgICAgIAorICAgICAgICBpbnQgbWF4UmlnaHRWYWx1ZTsKKyAgICAg
ICAgaWYgKG1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgbWF4UmlnaHRW
YWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF4
UmlnaHRWYWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgICAgICAgIAor
ICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKQorICAgICAgICAgICAgcmV0dXJuIGNsYW1w
ZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZzZXQsIC0xKTsKKyAgICAgICAgcmV0dXJuIGNsYW1w
ZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGR1
bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIC8vIFRoaXMgcHJpbnRz
IG91dCB0aGUgcmVsYXRpb25zaGlwIHdpdGhvdXQgYW55IHdoaXRlc3BhY2UsIGxpa2UgQHg8QHkr
NDIuIFRoaXMKKyAgICAgICAgLy8gb3B0aW1pemVzIGZvciB0aGUgY2xhcml0eSBvZiBhIGxpc3Qg
b2YgcmVsYXRpb25zaGlwcy4gSXQncyBlYXNpZXIgdG8gcmVhZCBzb21ldGhpbmcKKyAgICAgICAg
Ly8gbGlrZSBbQDE8QDIrMywgQDQ9PUA1LTZdIHRoYW4gaXQgd291bGQgYmUgaWYgdGhlcmUgd2Fz
IHdoaXRlc3BhY2UgaW5zaWRlIHRoZQorICAgICAgICAvLyByZWxhdGlvbnNoaXBzLgorICAgICAg
ICAKKyAgICAgICAgb3V0LnByaW50KG1fbGVmdCk7CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7
CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICBvdXQucHJpbnQoIjwiKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVxdWFsOgorICAgICAgICAgICAgb3V0LnBy
aW50KCI9PSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46
CisgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIG91dC5wcmludChtX3JpZ2h0KTsKKyAgICAgICAgaWYgKG1fb2Zmc2V0ID4g
MCkKKyAgICAgICAgICAgIG91dC5wcmludCgiKyIsIG1fb2Zmc2V0KTsKKyAgICAgICAgZWxzZSBp
ZiAobV9vZmZzZXQgPCAwKQorICAgICAgICAgICAgb3V0LnByaW50KCItIiwgLXN0YXRpY19jYXN0
PGludDY0X3Q+KG1fb2Zmc2V0KSk7CisgICAgfQorICAgIAorcHJpdmF0ZToKKyAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIHZvaWQgbWVyZ2VJbXBsKGNvbnN0IFJlbGF0aW9uc2hp
cCYgb3RoZXIsIGNvbnN0IEZ1bmN0b3ImIGZ1bmN0b3IpIGNvbnN0CisgICAgeworICAgICAgICBp
ZiAoIXNhbWVOb2Rlc0FzKG90aGVyKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisg
ICAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGd1YXJhbnRlZSB0aGF0
OgorICAgICAgICAvLworICAgICAgICAvLyAtIFdlIGF2b2lkIGhhdmluZyBtb3JlIHRoYW4gb25l
IFJlbGF0aW9uc2hpcCBvdmVyIHRoZSBzYW1lIHR3byBub2Rlcy4gVGhlcmVmb3JlLCBpZgorICAg
ICAgICAvLyAgIHRoZSBtZXJnZSBjb3VsZCBiZSBleHByZXNzZWQgYXMgdHdvIFJlbGF0aW9uc2hp
cHMsIHdlIHByZWZlciB0byBpbnN0ZWFkIHBpY2sgdGhlCisgICAgICAgIC8vICAgbGVzcyBwcmVj
aXNlIHNpbmdsZSBSZWxhdGlvbnNoaXAgZm9ybSBldmVuIGlmIHRoYXQgbWVhbnMgVE9QLiBPbmUg
ZXhjZXB0aW9uIHRvCisgICAgICAgIC8vICAgdGhpcyBpcyB0aGF0IHdlIEBhID09IEBiICsgQyBh
bmQgQGEgPT0gQGIgKyBEIGludG8gQGEgPiBAYiArIEMgLSAxIGFuZAorICAgICAgICAvLyAgIEBh
IDwgQGIgKyBEICsgMS4gCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gSWYgdGhlIGRpZmZlcmVu
Y2UgYmV0d2VlbiB0d28gUmVsYXRpb25zaGlwcyBpcyBqdXN0IHRoZSBtX29mZnNldCwgdGhlbiB3
ZSBjcmVhdGUgYQorICAgICAgICAvLyAgIFJlbGF0aW9uc2hpcCB0aGF0IGhhcyBhbiBvZmZzZXQg
b2YgLTEsIDAsIG9yIDEuIFRoaXMgaXMgYW4gZXNzZW50aWFsIGNvbnZlcmdlbmNlCisgICAgICAg
IC8vICAgaGFjay4gV2UgbmVlZCAtMSBhbmQgMSB0byBzdXBwb3J0IDw9IGFuZCA+PS4gVGhpcyBv
dmVycmlkZXMgdGhlIHByZXZpb3VzCisgICAgICAgIC8vICAgZXhjZXB0aW9uLiBGb3IgZXhhbXBs
ZSwgd2Ugd291bGRuJ3QgYWRkIGEgQGEgPCBAYiArIEQgKyAxIHJlbGF0aW9uc2hpcCBpZiBEICsg
MQorICAgICAgICAvLyAgIHdhcyBub3QgZXF1YWwgdG8gb25lIG9mIC0xLCAwLCAxLgorICAgICAg
ICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIFJlbGF0aW9uc2hpcCgpIHRvIG1lYW4g
VE9QLgorICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIHJlbGF0aW9uc2hpcHMgYXJlIGlkZW50
aWNhbCB0aGVuIHdlIGhhdmUgbm90aGluZyBsZWZ0IHRvIGRvLgorICAgICAgICBpZiAoKnRoaXMg
PT0gb3RoZXIpIHsKKyAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGcm9tIGhlcmUgd2UgY2FuIGFz
c3VtZSB0aGF0IHRoZSB0d28gcmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50aWNhbC4gVXN1YWxs
eSB3ZSB1c2UKKyAgICAgICAgLy8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBkaWZmZXJlbnQgb2Zm
c2V0cyBhbnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBpcworICAgICAgICAv
LyBpZGVudGljYWwuCisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKSB7
CisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAg
ICAgICAgLy8gRmlndXJlIG91dCB3aGF0IG9mZnNldCB0byBzZWxlY3QgdG8gbWVyZ2UgdGhlbS4g
VGhlIGFwcHJvcHJpYXRlIG9mZnNldHMgYXJlCisgICAgICAgICAgICAgICAgLy8gLTEsIDAsIG9y
IDEuCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRmlyc3QgZmlndXJlIG91
dCB3aGF0IG9mZnNldCB3ZSdkIGxpa2UgdG8gdXNlLgorICAgICAgICAgICAgICAgIGludCBiZXN0
T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KTsKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWV0aGluZyBsaWtlIEBhIDwgQGIg
KyAyLiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB1bmRlciB0aGUKKyAgICAgICAgICAgICAgICAv
LyAtMSwwLDEgcnVsZS4KKyAgICAgICAgICAgICAgICBpZiAoYmVzdE9mZnNldCA8PSAxKQorICAg
ICAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExl
c3NUaGFuLCBzdGQ6Om1heChiZXN0T2Zmc2V0LCAtMSkpKTsKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpIHsKKyAgICAgICAgICAgICAgICAvLyBU
aGlzIGlzIHRoZSByZWFsbHkgaW50ZXJlc3RpbmcgY2FzZS4gV2UgaGF2ZToKKyAgICAgICAgICAg
ICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICBAYSA8IEBiICsgQworICAgICAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAgICAgLy8gYW5kOgorICAgICAgICAgICAgICAgIC8vCisgICAg
ICAgICAgICAgICAgLy8gICAgIEBhID09IEBiICsgRAorICAgICAgICAgICAgICAgIC8vCisgICAg
ICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlJ2QgbGlrZSB0byByZXR1cm46CisgICAgICAgICAg
ICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgICAgQGEgPCBAYiArIG1heChDLCBEICsgMSkK
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgYmVzdE9mZnNldCA9IHN0ZDo6
bWF4KG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCArIDEpOworICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRoaW5nIGxpa2UgQGEgPCBAYiArIDIuIFdlIGNh
bid0IGRvIGl0LgorICAgICAgICAgICAgICAgIGlmIChiZXN0T2Zmc2V0IDw9IDEpCisgICAgICAg
ICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVzc1Ro
YW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkpOworICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgQVNTRVJUKG90aGVyLm1fa2luZCA9PSBHcmVhdGVyVGhhbik7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gRXF1YWwpIHsK
KyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpIHsKKyAgICAgICAgICAgICAg
ICAvLyBXZSBoYXZlIEBhID09IEBiICsgQyBhbmQgQGEgPT0gQGIgKyBELCB3aGVyZSBDICE9IEQu
IFR1cm4gdGhpcyBpbnRvIHNvbWUKKyAgICAgICAgICAgICAgICAvLyBpbmVxdWFsaXR5IHRoYXQg
aW52b2x2ZXMgYSBjb25zdGFudCB0aGF0IGlzIC0xLDAsMS4KKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbGVzc1RoYW4oCisgICAgICAgICAgICAgICAgICAg
IG1fbGVmdCwgb3RoZXIubV9yaWdodCwgTGVzc1RoYW4sCisgICAgICAgICAgICAgICAgICAgIHN0
ZDo6bWF4KG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCkgKyAxKTsKKyAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICBpZiAobGVzc1RoYW4ub2Zmc2V0KCkgPj0gLTEgJiYgbGVzc1RoYW4u
b2Zmc2V0KCkgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcihsZXNzVGhhbik7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIGdyZWF0ZXJUaGFu
KAorICAgICAgICAgICAgICAgICAgICBtX2xlZnQsIG90aGVyLm1fcmlnaHQsIEdyZWF0ZXJUaGFu
LAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihtX29mZnNldCwgb3RoZXIubV9vZmZzZXQp
IC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGdyZWF0ZXJUaGFuLm9mZnNldCgpID49IC0xICYm
IGdyZWF0ZXJUaGFuLm9mZnNldCgpIDw9IDEpCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3Io
Z3JlYXRlclRoYW4pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmV1c2UgdGhlIGZh
Y3QgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgaGFuZGxpbmcgZm9yIExlc3NUaGFuLm1lcmdlKEVxdWFs
KSwgYWJvdmUuCisgICAgICAgICAgICAvLyBXZSB3b3VsZG4ndCBzZWUgR3JlYXRlclRoYW4ubWVy
Z2UoRXF1YWwpIGJlY2F1c2UgbWVyZ2UoKSB3b3VsZCBhbHJlYWR5IGhhbmRsZQorICAgICAgICAg
ICAgLy8gaXQuCisgICAgICAgICAgICBBU1NFUlQob3RoZXIubV9raW5kID09IExlc3NUaGFuKTsK
KyAgICAgICAgICAgIG90aGVyLm1lcmdlSW1wbCgqdGhpcywgZnVuY3Rvcik7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBnZXQgaGVyZSBlaXRoZXIgaWYg
dGhlIGtpbmQgd2FzIEdyZWF0ZXJUaGFuLCB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQg
aW4KKyAgICAgICAgLy8gbWVyZ2UoKSwgb3IgYmVjYXVzZSB3ZSBoYWQgYW4gaW52YWxpZCBraW5k
LgorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKyAgICAKKyAg
ICBOb2RlKiBtX2xlZnQ7CisgICAgTm9kZSogbV9yaWdodDsKKyAgICBLaW5kIG1fa2luZDsKKyAg
ICBpbnQgbV9vZmZzZXQ7IC8vIFRoaXMgb2Zmc2V0IGNhbiBiZSBhcmJpdHJhcmlseSBsYXJnZS4K
K307CisKK3R5cGVkZWYgSGFzaE1hcDxOb2RlKiwgVmVjdG9yPFJlbGF0aW9uc2hpcD4+IFJlbGF0
aW9uc2hpcE1hcDsKKworY2xhc3MgSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UgOiBwdWJs
aWMgUGhhc2UgeworcHVibGljOgorICAgIEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlKEdy
YXBoJiBncmFwaCkKKyAgICAgICAgOiBQaGFzZShncmFwaCwgImludGVnZXIgcmFuZ2Ugb3B0aW1p
emF0aW9uIikKKyAgICAgICAgLCBtX3plcm8obnVsbHB0cikKKyAgICAgICAgLCBtX3JlbGF0aW9u
c2hpcHNBdEhlYWQoZ3JhcGgpCisgICAgICAgICwgbV9pbnNlcnRpb25TZXQoZ3JhcGgpCisgICAg
eworICAgIH0KKyAgICAKKyAgICBib29sIHJ1bigpCisgICAgeworICAgICAgICBBU1NFUlQobV9n
cmFwaC5tX2Zvcm0gPT0gU1NBKTsKKyAgICAgICAgCisgICAgICAgIC8vIEJlZm9yZSB3ZSBkbyBh
bnl0aGluZywgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIHplcm8gY29uc3RhbnQgYXQgdGhlIHRv
cC4KKyAgICAgICAgZm9yIChOb2RlKiBub2RlIDogKm1fZ3JhcGguYmxvY2soMCkpIHsKKyAgICAg
ICAgICAgIGlmIChub2RlLT5pc0ludDMyQ29uc3RhbnQoKSAmJiAhbm9kZS0+YXNJbnQzMigpKSB7
CisgICAgICAgICAgICAgICAgbV96ZXJvID0gbm9kZTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1femVybykgeworICAgICAg
ICAgICAgbV96ZXJvID0gbV9pbnNlcnRpb25TZXQuaW5zZXJ0Q29uc3RhbnQoMCwgTm9kZU9yaWdp
bigpLCBqc051bWJlcigwKSk7CisgICAgICAgICAgICBtX2luc2VydGlvblNldC5leGVjdXRlKG1f
Z3JhcGguYmxvY2soMCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodmVyYm9z
ZSkgeworICAgICAgICAgICAgZGF0YUxvZygiR3JhcGggYmVmb3JlIGludGVnZXIgcmFuZ2Ugb3B0
aW1pemF0aW9uOlxuIik7CisgICAgICAgICAgICBtX2dyYXBoLmR1bXAoKTsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgQmxvY2tMaXN0IHBvc3RPcmRlciA9IG1fZ3JhcGguYmxvY2tzSW5Q
b3N0T3JkZXIoKTsKKyAgICAgICAgCisgICAgICAgIGJvb2wgY2hhbmdlZCA9IHRydWU7CisgICAg
ICAgIHdoaWxlIChjaGFuZ2VkKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIHBvc3RPcmRlckluZGV4ID0gcG9zdE9yZGVyLnNpemUoKTsg
cG9zdE9yZGVySW5kZXgtLTspIHsKKyAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBibG9jayA9
IHBvc3RPcmRlcltwb3N0T3JkZXJJbmRleF07CisgICAgICAgICAgICAgICAgREZHX0FTU0VSVCgK
KyAgICAgICAgICAgICAgICAgICAgbV9ncmFwaCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAg
ICAgYmxvY2sgPT0gbV9ncmFwaC5ibG9jaygwKSB8fCBtX3NlZW5CbG9ja3MuY29udGFpbnMoYmxv
Y2spKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwcyA9IG1f
cmVsYXRpb25zaGlwc0F0SGVhZFtibG9ja107CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIG5vZGVJbmRleCA9IDA7IG5vZGVJbmRleCA8IGJsb2NrLT5zaXplKCk7
ICsrbm9kZUluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUqIG5vZGUgPSBibG9jay0+
YXQobm9kZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAg
ICAgICAgICAgICAgICAgICBkYXRhTG9nKCJBbmFseXNpczogYXQgIiwgbm9kZSwgIjogIiwgbGlz
dER1bXAoc29ydGVkUmVsYXRpb25zaGlwcygpKSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAg
IGV4ZWN1dGVOb2RlKG5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIC8vIEhhbmRsZSBicmFuY2ggb24gaW5lcXVhbGl0eS4KKyAgICAgICAgICAg
ICAgICBOb2RlKiB0ZXJtaW5hbCA9IGJsb2NrLT50ZXJtaW5hbCgpOworICAgICAgICAgICAgICAg
IGJvb2wgYWxyZWFkeU1lcmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5h
bC0+b3AoKSA9PSBCcmFuY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSogY29tcGFyZSA9
IHRlcm1pbmFsLT5jaGlsZDEoKS5ub2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAo
Y29tcGFyZS0+b3AoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVFcToKKyAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAgICAg
ICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxl
c3NFcToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIWNvbXBhcmUtPmlzQmluYXJ5VXNlS2luZChJbnQzMlVzZSkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcDsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHN3aXRjaCAoY29tcGFyZS0+b3AoKSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVT
dHJpY3RFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBSZWxh
dGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxk
MSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkVxdWFsLCAwKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxl
c3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25z
aGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5u
b2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwgMCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNz
RXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25z
aGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5u
b2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwgMSk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVHcmVh
dGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9u
c2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCku
bm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIDApOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJl
R3JlYXRlckVxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJl
bGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hp
bGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIC0xKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREZHX0NSQVNIKG1fZ3JhcGgsIGNvbXBh
cmUsICJJbnZhbGlkIGNvbXBhcmlzb24gbm9kZSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBjb21w
YXJlLCByZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlw
TWFwIGZvclRydWUgPSBtX3JlbGF0aW9uc2hpcHM7CisgICAgICAgICAgICAgICAgICAgICAgICBS
ZWxhdGlvbnNoaXBNYXAgZm9yRmFsc2UgPSBtX3JlbGF0aW9uc2hpcHM7CisgICAgICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIkRlYWxpbmcgd2l0aCB0cnVlOlxuIik7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoZm9yVHJ1ZSwgcmVsYXRpb25z
aGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWxhdGlvbnNoaXAgaW52ZXJzZSA9
IHJlbGF0aW9uc2hpcC5pbnZlcnNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiRGVh
bGluZyB3aXRoIGZhbHNlOlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVs
YXRpb25zaGlwKGZvckZhbHNlLCBpbnZlcnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdl
ZCB8PSBtZXJnZVRvKGZvclRydWUsIHRlcm1pbmFsLT5icmFuY2hEYXRhKCktPnRha2VuLmJsb2Nr
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JGYWxzZSwg
dGVybWluYWwtPmJyYW5jaERhdGEoKS0+bm90VGFrZW4uYmxvY2spOworICAgICAgICAgICAgICAg
ICAgICAgICAgYWxyZWFkeU1lcmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgaWYgKCFhbHJlYWR5TWVyZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQmFzaWNC
bG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhtX3JlbGF0aW9uc2hpcHMsIHN1Y2Nlc3Nvcik7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBt
X2dyYXBoLmJsb2Nrc0luTmF0dXJhbE9yZGVyKCkpIHsKKyAgICAgICAgICAgIG1fcmVsYXRpb25z
aGlwcyA9IG1fcmVsYXRpb25zaGlwc0F0SGVhZFtibG9ja107CisgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIG5vZGVJbmRleCA9IDA7IG5vZGVJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsrbm9kZUlu
ZGV4KSB7CisgICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJsb2NrLT5hdChub2RlSW5kZXgp
OworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBkYXRh
TG9nKCJUcmFuc2Zvcm1hdGlvbjogYXQgIiwgbm9kZSwgIjogIiwgbGlzdER1bXAoc29ydGVkUmVs
YXRpb25zaGlwcygpKSwgIlxuIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
Ly8gVGhpcyBlbmRzIHVwIGJlaW5nIHByZXR0eSBhd2t3YXJkIHRvIHdyaXRlIGJlY2F1c2Ugd2Ug
bmVlZCB0byBkZWNpZGUgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZSBieSB1c2lu
ZyB0aGUgcmVsYXRpb25zaGlwcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiwgYnV0IHdlIG5lZWQgdG8K
KyAgICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHdlIG9wdGltaXpl
LgorICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgeworICAgICAgICAgICAgICAg
IGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5pc0JpbmFy
eVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVy
ZmxvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAg
ICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAg
ICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgp
KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgp
KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICBpbnQgbWluVmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGlu
dD46Om1pbigpOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VmFsdWUgPSBzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9u
c2hpcCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgbWluVmFsdWUgPSBzdGQ6Om1heChtaW5WYWx1ZSwgcmVsYXRpb25zaGlwLm1pblZhbHVlT2ZM
ZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBzdGQ6Om1pbihtYXhW
YWx1ZSwgcmVsYXRpb25zaGlwLm1heFZhbHVlT2ZMZWZ0KCkpOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoc3VtT3Zl
cmZsb3dzPGludD4obWluVmFsdWUsIG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCkpIHx8CisgICAg
ICAgICAgICAgICAgICAgICAgICBzdW1PdmVyZmxvd3M8aW50PihtYXhWYWx1ZSwgbm9kZS0+Y2hp
bGQyKCktPmFzSW50MzIoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5h
dChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+c2V0QXJpdGhNb2RlKEFy
aXRoOjpVbmNoZWNrZWQpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENoZWNrSW5Cb3VuZHM6IHsKKyAgICAgICAg
ICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQx
KCkubm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNo
aXBzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICBib29sIG5vbk5lZ2F0aXZlID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgIGJvb2wgbGVzc1RoYW5MZW5ndGggPSBmYWxzZTsKKyAgICAgICAg
ICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAubWluVmFsdWVPZkxl
ZnQoKSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbk5lZ2F0aXZlID0gdHJ1
ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KHJlbGF0aW9uc2hpcC5yaWdodCgpID09IG5vZGUtPmNoaWxkMigpKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpF
cXVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAub2Zm
c2V0KCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzVGhhbkxlbmd0
aCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpMZXNz
VGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAub2Zm
c2V0KCkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzc1RoYW5MZW5n
dGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobm9uTmVn
YXRpdmUgJiYgbGVzc1RoYW5MZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1
dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5v
ZGUtPnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUoYmxvY2stPmF0KG5vZGVJbmRl
eCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4g
Y2hhbmdlZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBleGVjdXRlTm9kZShOb2RlKiBu
b2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChub2RlLT5vcCgpKSB7CisgICAgICAgIGNhc2Ug
Q2hlY2tJbkJvdW5kczogeworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hp
cChub2RlLT5jaGlsZDEoKS5ub2RlKCksIG5vZGUtPmNoaWxkMigpLm5vZGUoKSwgUmVsYXRpb25z
aGlwOjpMZXNzVGhhbikpOworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hp
cChub2RlLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhh
biwgLTEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgY2FzZSBBcml0aEFkZDogeworICAgICAgICAgICAgLy8gV2UncmUgb25seSBpbnRlcmVz
dGVkIGluIGludDMyIGFkZGl0aW9ucyBhbmQgd2UgY3VycmVudGx5IG9ubHkga25vdyBob3cgdG8K
KyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgbm9uLXdyYXBwaW5nIG9uZXMuCisgICAgICAgICAg
ICBpZiAoIW5vZGUtPmlzQmluYXJ5VXNlS2luZChJbnQzMlVzZSkpCisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBoYW5k
bGUgdGhlIHVuY2hlY2tlZCBhcml0aG1ldGljIGNhc2UuIFdlIGp1c3QgZG8gaXQgZG9uJ3Qgcmln
aHQKKyAgICAgICAgICAgIC8vIG5vdy4KKyAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUo
KSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgLy8gSGFuZGxlIGFkZDogQHZhbHVlICsgY29uc3RhbnQuCisg
ICAgICAgICAgICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9mZnNldCA9
IG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8v
IFdlIGFkZCBhIHJlbGF0aW9uc2hpcCBmb3IgQGFkZCA9PSBAdmFsdWUgKyBjb25zdGFudCwgYW5k
IHRoZW4gd2UgY29weSB0aGUKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgZm9yIEB2YWx1
ZS4gVGhpcyBnaXZlcyB1cyBhIG9uZS1kZWVwIHZpZXcgb2YgQHZhbHVlJ3MgZXhpc3RpbmcKKyAg
ICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMsIHdoaWNoIG1hdGNoZXMgdGhlIG9uZS1kZWVwIHNl
YXJjaCBpbiBzZXRSZWxhdGlvbnNoaXAoKS4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0
UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcChub2RlLCBub2RlLT5j
aGlsZDEoKS5ub2RlKCksIFJlbGF0aW9uc2hpcDo6RXF1YWwsIG9mZnNldCkpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5j
aGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbV9yZWxhdGlvbnNoaXBz
LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7Cisg
ICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFs
dWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9
IHJlbGF0aW9uc2hpcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlbGF0aW9uc2hpcC5y
aWdodCgpID09IG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlwLnNldExlZnQobm9kZSk7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNoaXAuYWRkVG9PZmZzZXQob2Zmc2V0KSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNo
aXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9u
c2hpcCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5v
dyB3ZSB3YW50IHRvIGVzdGFibGlzaCB0aGF0IGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0
IG9mIHRoZSBhZGRpdGlvbiBhcmUKKyAgICAgICAgICAgIC8vIHdpdGhpbiBhIHBhcnRpY3VsYXIg
cmFuZ2Ugb2YgaW50ZWdlcnMuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvZmZzZXQg
PiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0
aGVuIHdlIGtub3cgdGhhdCBAdmFsdWUgPD0gbWF4IC0gMSwgaS5lLiB0aGF0CisgICAgICAgICAg
ICAgICAgLy8gQHZhbHVlIDwgbWF4LgorICAgICAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgK
KyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAg
ICAgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4s
CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgp
IC0gb2Zmc2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSArIDEiIHRo
ZW4gd2Uga25vdyB0aGF0IEBhZGQgPj0gbWluICsgMSwgaS5lLiB0aGF0CisgICAgICAgICAgICAg
ICAgLy8gQGFkZCA+IG1pbi4KKyAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAg
ICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5v
ZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkgKyBvZmZzZXQgLSAxKSwKKyAg
ICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAi
YWRkOiBAdmFsdWUgLSAxIiB0aGVuIHdlIGtub3cgdGhhdCBAdmFsdWUgPj0gbWluICsgMSwgaS5l
LiB0aGF0CisgICAgICAgICAgICAgICAgLy8gQHZhbHVlID4gbWluLgorICAgICAgICAgICAgICAg
IHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKAorICAg
ICAgICAgICAgICAgICAgICAgICAgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0
aW9uc2hpcDo6R3JlYXRlclRoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1pbigpICsgb2Zmc2V0IC0gMSksCisgICAgICAgICAgICAgICAgICAg
IDApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFk
ZDogQHZhbHVlIC0xIDEiIHRoZW4gd2Uga25vdyB0aGF0IEBhZGQgPD0gbWF4IC0gMSwgaS5lLiB0
aGF0CisgICAgICAgICAgICAgICAgLy8gQGFkZCA8IG1heC4KKyAgICAgICAgICAgICAgICBzZXRS
ZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCgKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSBv
ZmZzZXQgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgR2V0
QXJyYXlMZW5ndGg6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAo
bm9kZSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFVwc2lsb246
IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlv
bnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBub2RlLT5waGkoKSwgUmVsYXRpb25zaGlwOjpF
cXVhbCwgMCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0
aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgaWYgKGl0
ZXIgIT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmVjdG9yPFJl
bGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVs
YXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25z
aGlwIG5ld1JlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcDsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKG5vZGUtPnBoaSgpID09IG5ld1JlbGF0aW9uc2hpcC5yaWdodCgpKQorICAgICAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hp
cC5zZXRMZWZ0KG5vZGUtPnBoaSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBwZW5k
KG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZv
ciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IHRvQWRkKQorICAgICAgICAgICAgICAgICAg
ICBzZXRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0UmVs
YXRpb25zaGlwKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAsIHVuc2lnbmVkIHRpbWVUb0xpdmUg
PSAxKQorICAgIHsKKyAgICAgICAgc2V0UmVsYXRpb25zaGlwKG1fcmVsYXRpb25zaGlwcywgcmVs
YXRpb25zaGlwLCB0aW1lVG9MaXZlKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRSZWxhdGlv
bnNoaXAoCisgICAgICAgIFJlbGF0aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBSZWxhdGlv
bnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAg
ICAgIHNldE9uZVNpZGUocmVsYXRpb25zaGlwTWFwLCByZWxhdGlvbnNoaXAsIHRpbWVUb0xpdmUp
OworICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25zaGlwLmZsaXBw
ZWQoKSwgdGltZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0T25lU2lkZSgKKyAg
ICAgICAgUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBNYXAsIFJlbGF0aW9uc2hpcCByZWxh
dGlvbnNoaXAsIHVuc2lnbmVkIHRpbWVUb0xpdmUgPSAxKQorICAgIHsKKyAgICAgICAgaWYgKHZl
cmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2V0dGluZzogIiwgcmVsYXRpb25zaGlw
LCAiXG4iKTsKKyAgICAgICAgCisgICAgICAgIGF1dG8gcmVzdWx0ID0gcmVsYXRpb25zaGlwTWFw
LmFkZCgKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5sZWZ0KCksIFZlY3RvcjxSZWxhdGlvbnNo
aXA+KCkpOworICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiYgcmVsYXRpb25zaGlwcyA9IHJl
c3VsdC5pdGVyYXRvci0+dmFsdWU7CisgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRk
OworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
JiBvdGhlclJlbGF0aW9uc2hpcCA6IHJlbGF0aW9uc2hpcHMpIHsKKyAgICAgICAgICAgIGlmIChv
dGhlclJlbGF0aW9uc2hpcC5zYW1lTm9kZXNBcyhyZWxhdGlvbnNoaXApKSB7CisgICAgICAgICAg
ICAgICAgaWYgKFJlbGF0aW9uc2hpcCBmaWx0ZXJlZCA9IG90aGVyUmVsYXRpb25zaGlwLmZpbHRl
cihyZWxhdGlvbnNoaXApKSB7CisgICAgICAgICAgICAgICAgICAgIG90aGVyUmVsYXRpb25zaGlw
ID0gZmlsdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgICAgICBpZiAodGltZVRvTGl2ZSAmJiBvdGhlclJlbGF0aW9uc2hp
cC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpFcXVhbCkgeworICAgICAgICAgICAgICAgIFJlbGF0
aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSBvdGhlclJlbGF0aW9uc2hpcDsKKyAgICAgICAgICAg
ICAgICBpZiAobmV3UmVsYXRpb25zaGlwLnJpZ2h0KCkgIT0gb3RoZXJSZWxhdGlvbnNoaXAucmln
aHQoKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChvdGhl
clJlbGF0aW9uc2hpcC5yaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlbGF0
aW9uc2hpcC5hZGRUb09mZnNldChvdGhlclJlbGF0aW9uc2hpcC5vZmZzZXQoKSkpCisgICAgICAg
ICAgICAgICAgICAgICAgICB0b0FkZC5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
ICghZm91bmQpCisgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChyZWxhdGlvbnNoaXAp
OworICAgICAgICAKKyAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgYW5vdGhlclJlbGF0aW9uc2hp
cCA6IHRvQWRkKSB7CisgICAgICAgICAgICBBU1NFUlQodGltZVRvTGl2ZSk7CisgICAgICAgICAg
ICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgYW5vdGhlclJlbGF0aW9uc2hpcCwgdGltZVRv
TGl2ZSAtIDEpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGJvb2wgbWVyZ2VUbyhSZWxh
dGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgIHsK
KyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nKCJNZXJnaW5nIHRvICIs
IHBvaW50ZXJEdW1wKHRhcmdldCksICI6XG4iKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX3Nl
ZW5CbG9ja3MuYWRkKHRhcmdldCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgYmxv
Y2suIFdlIGNvcHkgc3ViamVjdCB0byBsaXZlbmVzcyBwcnVuaW5nLgorICAgICAgICAgICAgYXV0
byBpc0xpdmUgPSBbJl0gKE5vZGUqIG5vZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSA9
PSBtX3plcm8pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
ICAgIHJldHVybiB0YXJnZXQtPnNzYS0+bGl2ZUF0SGVhZC5jb250YWlucyhub2RlKTsKKyAgICAg
ICAgICAgIH07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBy
ZWxhdGlvbnNoaXBNYXApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTGl2ZShlbnRyeS5rZXkp
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiB2YWx1ZXM7CisgICAgICAgICAgICAgICAg
Zm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogZW50cnkudmFsdWUpIHsKKyAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUKHJlbGF0aW9uc2hpcC5sZWZ0KCkgPT0gZW50cnkua2V5KTsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKGlzTGl2ZShyZWxhdGlvbnNoaXAucmlnaHQoKSkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgUHJvcGFnYXRpbmcgIiwgcmVsYXRpb25zaGlwLCAiXG4iKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQocmVsYXRpb25zaGlwKTsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBzdGQ6OnNvcnQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7Cisg
ICAgICAgICAgICAgICAgbV9yZWxhdGlvbnNoaXBzQXRIZWFkW3RhcmdldF0uYWRkKGVudHJ5Lmtl
eSwgdmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBNZXJnZSBieSBpbnRlcnNlY3RpbmcuIFdlIGhh
dmUgbm8gbm90aW9uIG9mIEJPVFRPTSwgc28gd2UgdXNlIHRoZSBvbWlzc2lvbiBvZgorICAgICAg
ICAvLyByZWxhdGlvbnNoaXBzIGZvciBhIHBhaXIgb2Ygbm9kZXMgdG8gbWVhbiBUT1AuIFRoZSBy
ZWFzb24gd2h5IHdlIGRvbid0IG5lZWQgQk9UVE9NCisgICAgICAgIC8vIGlzICgxKSB3ZSBqdXN0
IG92ZXJhcHByb3hpbWF0ZSBjb250cmFkaWN0aW9ucyBhbmQgKDIpIGEgdmFsdWUgbmV2ZXIgaGF2
aW5nIGJlZW4KKyAgICAgICAgLy8gYXNzaWduZWQgd291bGQgb25seSBoYXBwZW4gaWYgd2UgaGF2
ZSBub3QgcHJvY2Vzc2VkIHRoZSBub2RlJ3MgcHJlZGVjZXNzb3IuIFdlCisgICAgICAgIC8vIHNo
b3VsZG4ndCBwcm9jZXNzIGJsb2NrcyB1bnRpbCB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgYmxvY2sn
cyBwcmVkZWNlc3NvciBiZWNhdXNlIHdlCisgICAgICAgIC8vIGFyZSB1c2luZyBSUE8uCisgICAg
ICAgIFZlY3RvcjxOb2RlKj4gdG9SZW1vdmU7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNl
OworICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbV9yZWxhdGlvbnNoaXBzQXRIZWFkW3Rhcmdl
dF0pIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IHJlbGF0aW9uc2hpcE1hcC5maW5kKGVudHJ5
LmtleSk7CisgICAgICAgICAgICBpZiAoaXRlciA9PSByZWxhdGlvbnNoaXBNYXAuZW5kKCkpIHsK
KyAgICAgICAgICAgICAgICB0b1JlbW92ZS5hcHBlbmQoZW50cnkua2V5KTsKKyAgICAgICAgICAg
ICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdmFs
dWVzOworICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgdGFyZ2V0UmVsYXRpb25zaGlwIDog
ZW50cnkudmFsdWUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCBzb3VyY2VS
ZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmVy
Ym9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgTWVyZ2luZyAiLCB0YXJn
ZXRSZWxhdGlvbnNoaXAsICIgYW5kICIsIHNvdXJjZVJlbGF0aW9uc2hpcCwgIjpcbiIpOworICAg
ICAgICAgICAgICAgICAgICB0YXJnZXRSZWxhdGlvbnNoaXAubWVyZ2UoCisgICAgICAgICAgICAg
ICAgICAgICAgICBzb3VyY2VSZWxhdGlvbnNoaXAsCisgICAgICAgICAgICAgICAgICAgICAgICBb
Jl0gKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0
YUxvZygiICAgIEdvdCAiLCBuZXdSZWxhdGlvbnNoaXAsICJcbiIpOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICAgICAg
ICAgIGlmIChlbnRyeS52YWx1ZSA9PSB2YWx1ZXMpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWVzOworICAgICAg
ICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChOb2RlKiBub2Rl
IDogdG9SZW1vdmUpCisgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5y
ZW1vdmUobm9kZSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9Cisg
ICAgCisgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gc29ydGVkUmVsYXRpb25zaGlwcygpCisgICAg
eworICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiByZXN1bHQ7CisgICAgICAgIGZvciAoYXV0
byYgZW50cnkgOiBtX3JlbGF0aW9uc2hpcHMpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kVmVj
dG9yKGVudHJ5LnZhbHVlKTsKKyAgICAgICAgc3RkOjpzb3J0KHJlc3VsdC5iZWdpbigpLCByZXN1
bHQuZW5kKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBOb2Rl
KiBtX3plcm87CisgICAgUmVsYXRpb25zaGlwTWFwIG1fcmVsYXRpb25zaGlwczsKKyAgICBCbG9j
a1NldCBtX3NlZW5CbG9ja3M7CisgICAgQmxvY2tNYXA8UmVsYXRpb25zaGlwTWFwPiBtX3JlbGF0
aW9uc2hpcHNBdEhlYWQ7CisgICAgSW5zZXJ0aW9uU2V0IG1faW5zZXJ0aW9uU2V0OworfTsKKyAg
ICAKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitib29sIHBlcmZvcm1JbnRlZ2VyUmFuZ2VP
cHRpbWl6YXRpb24oR3JhcGgmIGdyYXBoKQoreworICAgIFNhbXBsaW5nUmVnaW9uIHNhbXBsaW5n
UmVnaW9uKCJERkcgSW50ZWdlciBSYW5nZSBPcHRpbWl6YXRpb24gUGhhc2UiKTsKKyAgICByZXR1
cm4gcnVuUGhhc2U8SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2U+KGdyYXBoKTsKK30KKwor
fSB9IC8vIG5hbWVzcGFjZSBKU0M6OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaWZuZGVmIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
X2gKKyNkZWZpbmUgREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAorCisjaWYgRU5B
QkxFKERGR19KSVQpCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworY2xhc3Mg
R3JhcGg7CisKKy8vIFJlbW92ZXMgb3ZlcmZsb3cgY2hlY2tzIGFuZCBvdXQtb2YtYm91bmRzIGNo
ZWNrcyBieSBkb2luZyBhIGZvcndhcmQgZmxvdyBhbmFseXNpcyB0byBwcm92ZQorLy8gaW5lcXVh
bGl0aWVzLgorCitib29sIHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oR3JhcGgmKTsK
KworfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQp
CisKKyNlbmRpZiAvLyBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZV9oCisKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUGxhbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQbGFuLmNwcAkocmV2aXNpb24gMTg1MzY5KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQbGFuLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NDQsNiArNDQsNyBAQAogI2luY2x1ZGUgIkRGR0ZpeHVwUGhhc2UuaCIKICNpbmNsdWRlICJERkdH
cmFwaFNhZmVwb2ludC5oIgogI2luY2x1ZGUgIkRGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNl
LmgiCisjaW5jbHVkZSAiREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCIKICNpbmNs
dWRlICJERkdJbnZhbGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmgiCiAjaW5jbHVkZSAiREZH
SklUQ29tcGlsZXIuaCIKICNpbmNsdWRlICJERkdMSUNNUGhhc2UuaCIKQEAgLTM1Nyw2ICszNTgs
OCBAQCBQbGFuOjpDb21waWxhdGlvblBhdGggUGxhbjo6Y29tcGlsZUluVGhyCiAgICAgICAgIHBl
cmZvcm1Db25zdGFudEhvaXN0aW5nKGRmZyk7CiAgICAgICAgIHBlcmZvcm1HbG9iYWxDU0UoZGZn
KTsKICAgICAgICAgcGVyZm9ybUxpdmVuZXNzQW5hbHlzaXMoZGZnKTsKKyAgICAgICAgcGVyZm9y
bUludGVnZXJSYW5nZU9wdGltaXphdGlvbihkZmcpOworICAgICAgICBwZXJmb3JtTGl2ZW5lc3NB
bmFseXNpcyhkZmcpOwogICAgICAgICBwZXJmb3JtQ0ZBKGRmZyk7CiAgICAgICAgIHBlcmZvcm1D
b25zdGFudEZvbGRpbmcoZGZnKTsKICAgICAgICAgcGVyZm9ybUNsZWFuVXAoZGZnKTsgLy8gUmVk
dWNlIHRoZSBncmFwaCBzaXplIGEgbG90Lgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254608</attachid>
            <date>2015-06-09 15:26:14 -0700</date>
            <delta_ts>2015-06-09 18:00:32 -0700</delta_ts>
            <desc>adding the != relationship</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>49159</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODUzNjkpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBD
MTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdC
cmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0
OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBE
RkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1
cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8q
IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBE
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIy
NzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5
RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAg
Ki87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAw
RUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1v
dmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3Bw
ICovOyB9OwpAQCAtMjE2MSw2ICsyMTYzLDggQEAKIAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlB
IC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUg
PSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8q
IEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVj
b2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUy
M0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBw
YXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdl
T3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1l
ID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJS
YW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1p
emF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURG
MDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9j
aC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0g
ZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFE
RjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRo
ID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtNDk5Myw2ICs0OTk3LDggQEAKIAkJCQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUg
LyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0
MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBG
MzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5o
ICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjEx
OTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAog
CQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVj
dGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENv
ZGUuY3BwICovLApAQCAtNTYzMCw2ICs1NjM2LDcgQEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4
NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4g
SGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJh
bmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZC
REUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4
MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8s
CkBAIC03MzcwLDYgKzczNzcsNyBAQAogCQkJCTBGMkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBK
U0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0
MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEz
NTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4
OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0Jv
dW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVG
MDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQw
Rjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2Vz
ICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZH
X0pJVCkKKworI2luY2x1ZGUgIkRGR0Jsb2NrTWFwSW5saW5lcy5oIgorI2luY2x1ZGUgIkRGR0dy
YXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisjaW5jbHVkZSAiREZHUGhhc2Uu
aCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25QaGFzZS5oIgorI2luY2x1ZGUg
IkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFtZXNwYWNlIHsKKworY29uc3Qg
Ym9vbCB2ZXJib3NlID0gdHJ1ZTsKKworaW50NjRfdCBjbGFtcGVkU3VtSW1wbCgpIHsgcmV0dXJu
IDA7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KK2ludDY0X3QgY2xhbXBlZFN1bUlt
cGwoaW50IGxlZnQsIEFyZ3MuLi4gYXJncykKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50
NjRfdD4obGVmdCkgKyBjbGFtcGVkU3VtSW1wbChhcmdzLi4uKTsKK30KKwordGVtcGxhdGU8dHlw
ZW5hbWUuLi4gQXJncz4KK2ludCBjbGFtcGVkU3VtKEFyZ3MuLi4gYXJncykKK3sKKyAgICBpbnQ2
NF90IHJlc3VsdCA9IGNsYW1wZWRTdW1JbXBsKGFyZ3MuLi4pOworICAgIHJldHVybiBzdGQ6Om1p
bigKKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+
OjptYXgoKSksCisgICAgICAgIHN0ZDo6bWF4KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50
NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSksCisgICAgICAgICAgICByZXN1
bHQpKTsKK30KKworY2xhc3MgUmVsYXRpb25zaGlwIHsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQg
eworICAgICAgICBMZXNzVGhhbiwKKyAgICAgICAgRXF1YWwsCisgICAgICAgIE5vdEVxdWFsLAor
ICAgICAgICBHcmVhdGVyVGhhbgorICAgIH07CisgICAgCisgICAgc3RhdGljIEtpbmQgZmxpcHBl
ZChLaW5kIGtpbmQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2Fz
ZSBMZXNzVGhhbjoKKyAgICAgICAgICAgIHJldHVybiBHcmVhdGVyVGhhbjsKKyAgICAgICAgY2Fz
ZSBFcXVhbDoKKyAgICAgICAgICAgIHJldHVybiBFcXVhbDsKKyAgICAgICAgY2FzZSBOb3RFcXVh
bDoKKyAgICAgICAgICAgIHJldHVybiBOb3RFcXVhbDsKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhh
bjoKKyAgICAgICAgICAgIHJldHVybiBMZXNzVGhhbjsKKyAgICAgICAgfQorICAgICAgICBSRUxF
QVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4ga2luZDsKKyAgICB9Cisg
ICAgCisgICAgUmVsYXRpb25zaGlwKCkKKyAgICAgICAgOiBtX2xlZnQobnVsbHB0cikKKyAgICAg
ICAgLCBtX3JpZ2h0KG51bGxwdHIpCisgICAgICAgICwgbV9raW5kKEVxdWFsKQorICAgICAgICAs
IG1fb2Zmc2V0KDApCisgICAgeworICAgIH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAoTm9kZSog
bGVmdCwgTm9kZSogcmlnaHQsIEtpbmQga2luZCwgaW50IG9mZnNldCA9IDApCisgICAgICAgIDog
bV9sZWZ0KGxlZnQpCisgICAgICAgICwgbV9yaWdodChyaWdodCkKKyAgICAgICAgLCBtX2tpbmQo
a2luZCkKKyAgICAgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAgeworICAgICAgICBSRUxFQVNF
X0FTU0VSVChtX2xlZnQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChtX3JpZ2h0KTsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0ICE9IG1fcmlnaHQpOworICAgIH0KKyAgICAKKyAgICB0
eXBlZGVmIHZvaWQqIChSZWxhdGlvbnNoaXA6OipVbnNwZWNpZmllZEJvb2xUeXBlKTsKKworICAg
IG9wZXJhdG9yIFVuc3BlY2lmaWVkQm9vbFR5cGUqKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX2xlZnQgPyByZWludGVycHJldF9jYXN0PFVuc3BlY2lmaWVkQm9vbFR5cGUqPigxKSA6
IDA7CisgICAgfQorICAgIAorICAgIE5vZGUqIGxlZnQoKSBjb25zdCB7IHJldHVybiBtX2xlZnQ7
IH0KKyAgICBOb2RlKiByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcmlnaHQ7IH0KKyAgICBLaW5k
IGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0KKyAgICBpbnQgb2Zmc2V0KCkgY29uc3Qg
eyByZXR1cm4gbV9vZmZzZXQ7IH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgZmxpcHBlZCgpIGNv
bnN0CisgICAgeworICAgICAgICBpZiAoISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuIFJlbGF0
aW9uc2hpcCgpOworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fcmlnaHQsIG1fbGVmdCwg
ZmxpcHBlZChtX2tpbmQpLCAtbV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBSZWxhdGlvbnNo
aXAgaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0Y2ggKG1fa2luZCkgeworICAg
ICAgICBjYXNlIEVxdWFsOgorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQs
IG1fcmlnaHQsIE5vdEVxdWFsLCBtX29mZnNldCk7CisgICAgICAgIGNhc2UgTm90RXF1YWw6Cisg
ICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgRXF1YWwsIG1f
b2Zmc2V0KTsKKyAgICAgICAgY2FzZSBMZXNzVGhhbjoKKyAgICAgICAgICAgIGlmIChzdW1PdmVy
Zmxvd3M8aW50PihtX29mZnNldCwgLTEpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlv
bnNoaXAoKTsKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0
LCBHcmVhdGVyVGhhbiwgbV9vZmZzZXQgLSAxKTsKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoK
KyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihtX29mZnNldCwgMSkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgcmV0dXJuIFJlbGF0
aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBtX29mZnNldCArIDEpOworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
IH0KKyAgICAKKyAgICBib29sIGlzQ2Fub25pY2FsKCkgY29uc3QgeyByZXR1cm4gbV9sZWZ0IDwg
bV9yaWdodDsgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCBjYW5vbmljYWwoKSBjb25zdAorICAg
IHsKKyAgICAgICAgaWYgKGlzQ2Fub25pY2FsKCkpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7
CisgICAgICAgIHJldHVybiBmbGlwcGVkKCk7CisgICAgfQorICAgIAorICAgIGJvb2wgc2FtZU5v
ZGVzQXMoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX2xlZnQgPT0gb3RoZXIubV9sZWZ0CisgICAgICAgICAgICAmJiBtX3JpZ2h0ID09IG90
aGVyLm1fcmlnaHQ7CisgICAgfQorICAgIAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWxh
dGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHNhbWVOb2Rlc0Fz
KG90aGVyKQorICAgICAgICAgICAgJiYgbV9raW5kID09IG90aGVyLm1fa2luZAorICAgICAgICAg
ICAgJiYgbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZzZXQ7CisgICAgfQorICAgIAorICAgIGJvb2wg
b3BlcmF0b3I8KGNvbnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAg
ICBpZiAobV9sZWZ0ICE9IG90aGVyLm1fbGVmdCkKKyAgICAgICAgICAgIHJldHVybiBtX2xlZnQg
PCBvdGhlci5tX2xlZnQ7CisgICAgICAgIGlmIChtX3JpZ2h0ICE9IG90aGVyLm1fcmlnaHQpCisg
ICAgICAgICAgICByZXR1cm4gbV9yaWdodCA8IG90aGVyLm1fcmlnaHQ7CisgICAgICAgIGlmICht
X2tpbmQgIT0gb3RoZXIubV9raW5kKQorICAgICAgICAgICAgcmV0dXJuIG1fa2luZCA8IG90aGVy
Lm1fa2luZDsKKyAgICAgICAgcmV0dXJuIG1fb2Zmc2V0IDwgb3RoZXIubV9vZmZzZXQ7CisgICAg
fQorICAgIAorICAgIC8vIElmIHBvc3NpYmxlLCByZXR1cm5zIGEgZm9ybSBvZiB0aGlzIHJlbGF0
aW9uc2hpcCB3aGVyZSB0aGUgZ2l2ZW4gbm9kZSBpcyB0aGUgbGVmdAorICAgIC8vIHNpZGUuIFJl
dHVybnMgYSBudWxsIHJlbGF0aW9uc2hpcCBpZiB0aGlzIHJlbGF0aW9uc2hpcCBjYW5ub3Qgc2F5
IGFueXRoaW5nIGFib3V0IHRoaXMKKyAgICAvLyBub2RlLgorICAgIFJlbGF0aW9uc2hpcCBmb3JO
b2RlKE5vZGUqIG5vZGUpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9sZWZ0ID09IG5vZGUp
CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIGlmIChtX3JpZ2h0ID09IG5vZGUp
CisgICAgICAgICAgICByZXR1cm4gZmxpcHBlZCgpOworICAgICAgICByZXR1cm4gUmVsYXRpb25z
aGlwKCk7CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0TGVmdChOb2RlKiBsZWZ0KQorICAgIHsK
KyAgICAgICAgUkVMRUFTRV9BU1NFUlQobGVmdCAhPSBtX3JpZ2h0KTsKKyAgICAgICAgbV9sZWZ0
ID0gbGVmdDsKKyAgICB9CisgICAgYm9vbCBhZGRUb09mZnNldChpbnQgb2Zmc2V0KQorICAgIHsK
KyAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG1fb2Zmc2V0LCBvZmZzZXQpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBtX29mZnNldCArPSBvZmZzZXQ7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9y
PgorICAgIHZvaWQgbWVyZ2UoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlciwgY29uc3QgRnVuY3Rv
ciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIC8vIFRoaXMgZG9lcyBzb21lIGludGVy
ZXN0aW5nIHBlcm11dGF0aW9ucyB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBkdXBsaWNhdGUgY29k
ZS4gRm9yCisgICAgICAgIC8vIGV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIGluaXRp
YWxseTogQGEgIT0gQGIsIEBhID4gQGIKKyAgICAgICAgLy8gICAgICAgICAgICBAYiAhPSBAYSwg
QGIgPCBAYQorICAgICAgICAvLyAgICAgICAgICAgIEBiIDwgQGEsIEBiICE9IEBhCisgICAgICAg
IC8vICAgZmluYWxseTogQGIgIT0gYSwgQGIgPCBAYQorICAgICAgICAvLworICAgICAgICAvLyBB
bm90aGVyIGV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIGluaXRpYWxseTogQGEgPCBA
YiwgQGEgIT0gQGIKKyAgICAgICAgLy8gICBmaW5hbGx5OiBAYSAhPSBAYiwgQGEgPCBAYgorCisg
ICAgICAgIFJlbGF0aW9uc2hpcCBhID0gKnRoaXM7CisgICAgICAgIFJlbGF0aW9uc2hpcCBiID0g
b3RoZXI7CisgICAgICAgIGJvb2wgbmVlZEZsaXAgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAg
IC8vIEdldCByaWQgb2YgR3JlYXRlclRoYW4uCisgICAgICAgIGlmIChhLm1fa2luZCA9PSBHcmVh
dGVyVGhhbiB8fCBiLm1fa2luZCA9PSBHcmVhdGVyVGhhbikgeworICAgICAgICAgICAgYSA9IGEu
ZmxpcHBlZCgpOworICAgICAgICAgICAgYiA9IGIuZmxpcHBlZCgpOworICAgICAgICAgICAgbmVl
ZEZsaXAgPSB0cnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBo
YXZlIEdyZWF0ZXJUaGFuLCB0aGVuIGl0IG1lYW5zIHRoYXQgd2Ugc3RhcnRlZCB3aXRoIEBhIDwg
QGIgYW5kCisgICAgICAgICAgICAvLyBAYSA+IEBiLiBUaGF0J3MgcHJldHR5IG11Y2ggYWx3YXlz
IGEgdGF1dG9sb2d5OyB3ZSBkb24ndCBhdHRlbXB0IHRvIGRvIHNtYXJ0CisgICAgICAgICAgICAv
LyB0aGluZ3MgZm9yIHRoYXQgY2FzZSBmb3Igbm93LgorICAgICAgICAgICAgaWYgKGEubV9raW5k
ID09IEdyZWF0ZXJUaGFuIHx8IGIubV9raW5kID09IEdyZWF0ZXJUaGFuKQorICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRo
YXQgaWYgd2UgaGF2ZSBhIExlc3NUaGFuLCB0aGVuIGl0J3MgZmlyc3QuCisgICAgICAgIGlmIChi
Lm1fa2luZCA9PSBMZXNzVGhhbikKKyAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKKyAgICAg
ICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYSBOb3RFcXVhbCwgdGhl
biBpdCdzIGZpcnN0LgorICAgICAgICBpZiAoYi5tX2tpbmQgPT0gTm90RXF1YWwpCisgICAgICAg
ICAgICBzdGQ6OnN3YXAoYSwgYik7CisgICAgICAgIAorICAgICAgICBhLm1lcmdlSW1wbCgKKyAg
ICAgICAgICAgIGIsCisgICAgICAgICAgICBbJl0gKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAp
IHsKKyAgICAgICAgICAgICAgICBmdW5jdG9yKG5lZWRGbGlwID8gcmVsYXRpb25zaGlwLmZsaXBw
ZWQoKSA6IHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAg
Ly8gUmV0dXJucyBhIG51bGwgcmVsYXRpb25zaGlwIGlmIHRoZSBmaWx0cmF0aW9uIHNob3VsZCBi
ZSBleHByZXNzZWQgYXMgdHdvIGRpZmZlcmVudAorICAgIC8vIHJlbGF0aW9uc2hpcHMuCisgICAg
UmVsYXRpb25zaGlwIGZpbHRlcihjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAg
IHsKKyAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBtZXJnaW5nIHJlbGF0aW9u
c2hpcHMgb3ZlciB0aGUgc2FtZSBub2Rlcy4KKyAgICAgICAgQVNTRVJUKHNhbWVOb2Rlc0FzKG90
aGVyKSk7CisgICAgICAgIAorICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpCisgICAgICAgICAg
ICByZXR1cm4gKnRoaXM7CisgICAgICAgIAorICAgICAgICAvLyBGcm9tIGhlcmUgd2UgY2FuIGFz
c3VtZSB0aGF0IHRoZSB0d28gcmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50aWNhbC4gVXN1YWxs
eSB3ZSB1c2UKKyAgICAgICAgLy8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBkaWZmZXJlbnQgb2Zm
c2V0cyBhbnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBpcworICAgICAgICAv
LyBpZGVudGljYWwuCisgICAgICAgIAorICAgICAgICAvLyBXZSB3YW50IGVxdWFsaXR5IHRvIHRh
a2UgcHJlY2VkZW50IG92ZXIgZXZlcnl0aGluZyBlbHNlLCBhbmQgd2UgZG9uJ3Qgd2FudCBtdWx0
aXBsZQorICAgICAgICAvLyBpbmRlcGVuZGVudCBjbGFpbXMgb2YgZXF1YWxpdHkuIFRoYXQgd291
bGQganVzdCBiZSBhIGNvbnRyYWRpY3Rpb24uIFdoZW4gaXQgZG9lcworICAgICAgICAvLyBoYXBw
ZW4sIHdlIHdpbGwgYmUgY29uc2VydmF0aXZlIGluIHRoZSBzZW5zZSB0aGF0IHdlIHdpbGwgcGlj
ayBvbmUuCisgICAgICAgIGlmIChtX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4g
KnRoaXM7CisgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICBy
ZXR1cm4gb3RoZXI7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IE5vdEVxdWFsKSB7
CisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAg
ICAgICAgLy8gV2UgY291bGQgZG8gc29tZXRoaW5nIHNtYXJ0ZXIgaGVyZS4gV2UgY291bGQgZXZl
biBrZWVwIGJvdGggTm90RXF1YWwncy4gV2UKKyAgICAgICAgICAgICAgICAvLyB3b3VsZCBuZWVk
IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNvcnJlY3RseSBjb2xsYXBzZWQgdGhlbSB3aGVuIG1lcmdp
bmcuIEJ1dAorICAgICAgICAgICAgICAgIC8vIGZvciBub3csIHdlIGp1c3QgcGljayBvbmUgb2Yg
dGhlbSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlz
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob3RoZXIubV9r
aW5kID09IEdyZWF0ZXJUaGFuKSB7CisgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50IHRoaXMg
aW4gdGVybXMgb2YgTm90RXF1YWwuZmlsdGVyKExlc3NUaGFuKS4KKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmxpcHBlZCgpLmZpbHRlcihvdGhlci5mbGlwcGVkKCkpLmZsaXBwZWQoKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG90aGVyLm1fa2luZCA9
PSBMZXNzVGhhbik7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHR3byBjbGFpbXM6CisgICAgICAg
ICAgICAvLyAgICAgQGEgIT0gQGIgKyBDCisgICAgICAgICAgICAvLyAgICAgQGEgIDwgQGIgKyBE
CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgQyA+PSBELCB0aGVuIHRoZSBOb3RF
cXVhbCBpcyByZWR1bmRhbnQuCisgICAgICAgICAgICAvLyBJZiBDIDwgRCAtIDEsIHRoZW4gd2Ug
Y291bGQga2VlcCBib3RoLCBidXQgZm9yIG5vdyB3ZSBqdXN0IGtlZXAgdGhlIExlc3NUaGFuLgor
ICAgICAgICAgICAgLy8gSWYgQyA9PSBEIC0gMSwgdGhlbiB0aGUgTGVzc1RoYW4gY2FuIGJlIHR1
cm5lZCBpbnRvOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBAYSA8IEBiICsg
QworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBDID09IHRoaXMubV9v
ZmZzZXQsIEQgPT0gb3RoZXIubV9vZmZzZXQuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlm
IChtX29mZnNldCA9PSBvdGhlci5tX29mZnNldCAtIDEpCisgICAgICAgICAgICAgICAgcmV0dXJu
IFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBtX29mZnNldCk7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAgIHJldHVy
biBvdGhlci5maWx0ZXIoKnRoaXMpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBM
ZXNzVGhhbikgeworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbikgewor
ICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAg
IG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWluKG1fb2Zmc2V0LCBvdGhlci5tX29m
ZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBBU1NFUlQo
b3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxv
d3M8aW50PihtX29mZnNldCwgLTEpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNo
aXAoKTsKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihvdGhlci5tX29mZnNldCwg
MSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAg
aWYgKG1fb2Zmc2V0IC0gMSA9PSBvdGhlci5tX29mZnNldCArIDEpCisgICAgICAgICAgICAgICAg
cmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCAtIDEp
OworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gR3JlYXRlclRoYW4pOwor
ICAgICAgICByZXR1cm4gZmxpcHBlZCgpLmZpbHRlcihvdGhlci5mbGlwcGVkKCkpLmZsaXBwZWQo
KTsKKyAgICB9CisgICAgCisgICAgaW50IG1pblZhbHVlT2ZMZWZ0KCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIGlmIChtX2xlZnQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgcmV0dXJu
IG1fbGVmdC0+YXNJbnQzMigpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNz
VGhhbikKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigp
OworICAgICAgICAKKyAgICAgICAgaW50IG1pblJpZ2h0VmFsdWU7CisgICAgICAgIGlmIChtX3Jp
Z2h0LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIG1pblJpZ2h0VmFsdWUgPSBtX3Jp
Z2h0LT5hc0ludDMyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1pblJpZ2h0VmFsdWUg
PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAKKyAgICAgICAgaWYg
KG1fa2luZCA9PSBHcmVhdGVyVGhhbikKKyAgICAgICAgICAgIHJldHVybiBjbGFtcGVkU3VtKG1p
blJpZ2h0VmFsdWUsIG1fb2Zmc2V0LCAxKTsKKyAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWlu
UmlnaHRWYWx1ZSwgbV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBpbnQgbWF4VmFsdWVPZkxl
ZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fbGVmdC0+aXNJbnQzMkNvbnN0YW50KCkp
CisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5hc0ludDMyKCk7CisgICAgICAgIAorICAgICAg
ICBpZiAobV9raW5kID09IEdyZWF0ZXJUaGFuKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVt
ZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgICAgICAgIAorICAgICAgICBpbnQgbWF4UmlnaHRW
YWx1ZTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAg
ICAgbWF4UmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgbWF4UmlnaHRWYWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7
CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKQorICAgICAgICAgICAg
cmV0dXJuIGNsYW1wZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZzZXQsIC0xKTsKKyAgICAgICAg
cmV0dXJuIGNsYW1wZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZzZXQpOworICAgIH0KKyAgICAK
KyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7CisgICAgICAgIC8v
IFRoaXMgcHJpbnRzIG91dCB0aGUgcmVsYXRpb25zaGlwIHdpdGhvdXQgYW55IHdoaXRlc3BhY2Us
IGxpa2UgQHg8QHkrNDIuIFRoaXMKKyAgICAgICAgLy8gb3B0aW1pemVzIGZvciB0aGUgY2xhcml0
eSBvZiBhIGxpc3Qgb2YgcmVsYXRpb25zaGlwcy4gSXQncyBlYXNpZXIgdG8gcmVhZCBzb21ldGhp
bmcKKyAgICAgICAgLy8gbGlrZSBbQDE8QDIrMywgQDQ9PUA1LTZdIHRoYW4gaXQgd291bGQgYmUg
aWYgdGhlcmUgd2FzIHdoaXRlc3BhY2UgaW5zaWRlIHRoZQorICAgICAgICAvLyByZWxhdGlvbnNo
aXBzLgorICAgICAgICAKKyAgICAgICAgb3V0LnByaW50KG1fbGVmdCk7CisgICAgICAgIHN3aXRj
aCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICBvdXQucHJp
bnQoIjwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVxdWFsOgorICAgICAg
ICAgICAgb3V0LnByaW50KCI9PSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
Tm90RXF1YWw6CisgICAgICAgICAgICBvdXQucHJpbnQoIiE9Iik7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAgICAgIG91dC5wcmludCgiPiIp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50KG1fcmln
aHQpOworICAgICAgICBpZiAobV9vZmZzZXQgPiAwKQorICAgICAgICAgICAgb3V0LnByaW50KCIr
IiwgbV9vZmZzZXQpOworICAgICAgICBlbHNlIGlmIChtX29mZnNldCA8IDApCisgICAgICAgICAg
ICBvdXQucHJpbnQoIi0iLCAtc3RhdGljX2Nhc3Q8aW50NjRfdD4obV9vZmZzZXQpKTsKKyAgICB9
CisgICAgCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9p
ZCBtZXJnZUltcGwoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVu
Y3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghc2FtZU5vZGVzQXMob3RoZXIpKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhp
cyBtZXRob2QgaXMgdG8gZ3VhcmFudGVlIHRoYXQ6CisgICAgICAgIC8vCisgICAgICAgIC8vIC0g
V2UgYXZvaWQgaGF2aW5nIG1vcmUgdGhhbiBvbmUgUmVsYXRpb25zaGlwIG92ZXIgdGhlIHNhbWUg
dHdvIG5vZGVzLiBUaGVyZWZvcmUsIGlmCisgICAgICAgIC8vICAgdGhlIG1lcmdlIGNvdWxkIGJl
IGV4cHJlc3NlZCBhcyB0d28gUmVsYXRpb25zaGlwcywgd2UgcHJlZmVyIHRvIGluc3RlYWQgcGlj
ayB0aGUKKyAgICAgICAgLy8gICBsZXNzIHByZWNpc2Ugc2luZ2xlIFJlbGF0aW9uc2hpcCBmb3Jt
IGV2ZW4gaWYgdGhhdCBtZWFucyBUT1AuIE9uZSBleGNlcHRpb24gdG8KKyAgICAgICAgLy8gICB0
aGlzIGlzIHRoYXQgd2UgQGEgPT0gQGIgKyBDIGFuZCBAYSA9PSBAYiArIEQgaW50byBAYSA+IEBi
ICsgQyAtIDEgYW5kCisgICAgICAgIC8vICAgQGEgPCBAYiArIEQgKyAxLiAKKyAgICAgICAgLy8K
KyAgICAgICAgLy8gLSBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBSZWxhdGlvbnNoaXBz
IGlzIGp1c3QgdGhlIG1fb2Zmc2V0LCB0aGVuIHdlIGNyZWF0ZSBhCisgICAgICAgIC8vICAgUmVs
YXRpb25zaGlwIHRoYXQgaGFzIGFuIG9mZnNldCBvZiAtMSwgMCwgb3IgMS4gVGhpcyBpcyBhbiBl
c3NlbnRpYWwgY29udmVyZ2VuY2UKKyAgICAgICAgLy8gICBoYWNrLiBXZSBuZWVkIC0xIGFuZCAx
IHRvIHN1cHBvcnQgPD0gYW5kID49LiBUaGlzIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMKKyAgICAg
ICAgLy8gICBleGNlcHRpb24uIEZvciBleGFtcGxlLCB3ZSB3b3VsZG4ndCBhZGQgYSBAYSA8IEBi
ICsgRCArIDEgcmVsYXRpb25zaGlwIGlmIEQgKyAxCisgICAgICAgIC8vICAgd2FzIG5vdCBlcXVh
bCB0byBvbmUgb2YgLTEsIDAsIDEuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCB3
ZSB1c2UgUmVsYXRpb25zaGlwKCkgdG8gbWVhbiBUT1AuCisgICAgICAgIAorICAgICAgICAvLyBJ
ZiB0aGUgcmVsYXRpb25zaGlwcyBhcmUgaWRlbnRpY2FsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIGxl
ZnQgdG8gZG8uCisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgZnVu
Y3RvcigqdGhpcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIC8vIEZyb20gaGVyZSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHR3byByZWxhdGlvbnNo
aXBzIGFyZSBub3QgaWRlbnRpY2FsLiBVc3VhbGx5IHdlIHVzZQorICAgICAgICAvLyB0aGlzIHRv
IGFzc3VtZSB0aGF0IHdlIGRpZmZlcmVudCBvZmZzZXRzIGFueXRpbWUgdGhhdCBldmVyeXRoaW5n
IGJ1dCB0aGUgb2Zmc2V0IGlzCisgICAgICAgIC8vIGlkZW50aWNhbC4KKyAgICAgICAgCisgICAg
ICAgIGlmIChtX2tpbmQgPT0gTm90RXF1YWwpIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tp
bmQgPT0gTm90RXF1YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBEaWZmZXJlbnQgb2Zm
c2V0cywgc28gdGF1dG9sb2d5LgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob3RoZXIu
bV9raW5kID09IEVxdWFsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fb2Zmc2V0ICE9IG90aGVy
Lm1fb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNheWluZyB0aGF0IHlvdSBtaWdo
dCBiZSBCIHdoZW4geW91J3ZlIGFscmVhZHkgc2FpZCB0aGF0IHlvdSdyZSBhbnl0aGluZworICAg
ICAgICAgICAgICAgICAgICAvLyBidXQgQSwgd2hlcmUgQSBhbmQgQiBhcmUgZGlmZmVyZW50LCBp
cyBhIHRhdXRvbG9neS4gWW91IGNvdWxkIGp1c3Qgc2F5CisgICAgICAgICAgICAgICAgICAgIC8v
IHRoYXQgeW91J3JlIGFueXRoaW5nIGJ1dCBBLgorICAgICAgICAgICAgICAgICAgICBmdW5jdG9y
KCp0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNl
LCBzYW1lIG9mZnNldHM6IHdlJ3JlIHNheWluZyB0aGF0IHlvdSdyZSBlaXRoZXIgQSBvciB5b3Un
cmUgbm90CisgICAgICAgICAgICAgICAgLy8gZXF1YWwgdG8gQS4KKyAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbik7CisgICAg
ICAgICAgICAvLyBXZSBoYXZlIHRoZXNlIGNsYWltcywgYW5kIHdlJ3JlIG1lcmdpbmcgdGhlbToK
KyAgICAgICAgICAgIC8vICAgICBAYSAhPSBAYiArIEMKKyAgICAgICAgICAgIC8vICAgICBAYSA8
IEBiICsgRAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgQyA9PSBE
LCB0aGVuIHRoZSBtZXJnZSBpcyBjbGVhcmx5IGp1c3QgdGhlIE5vdEVxdWFsLgorICAgICAgICAg
ICAgLy8gSWYgd2UgaGF2ZSBDIDwgRCwgdGhlbiB0aGUgbWVyZ2UgaXMgYSB0YXV0b2xvZ3kuCisg
ICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIEMgPiBELCB0aGVuIHdlIGNvdWxkIGtlZXAgYm90aCBj
bGFpbXMsIGJ1dCB3ZSBhcmUgY2hlYXAsIHNvIHdlCisgICAgICAgICAgICAvLyBkb24ndC4gV2Ug
anVzdCB1c2UgdGhlIE5vdEVxdWFsLgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobV9v
ZmZzZXQgPCBvdGhlci5tX29mZnNldCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKSB7Cisg
ICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICAg
ICAgLy8gRmlndXJlIG91dCB3aGF0IG9mZnNldCB0byBzZWxlY3QgdG8gbWVyZ2UgdGhlbS4gVGhl
IGFwcHJvcHJpYXRlIG9mZnNldHMgYXJlCisgICAgICAgICAgICAgICAgLy8gLTEsIDAsIG9yIDEu
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRmlyc3QgZmlndXJlIG91dCB3
aGF0IG9mZnNldCB3ZSdkIGxpa2UgdG8gdXNlLgorICAgICAgICAgICAgICAgIGludCBiZXN0T2Zm
c2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KTsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWV0aGluZyBsaWtlIEBhIDwgQGIgKyAy
LiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB1bmRlciB0aGUKKyAgICAgICAgICAgICAgICAvLyAt
MSwwLDEgcnVsZS4KKyAgICAgICAgICAgICAgICBpZiAoYmVzdE9mZnNldCA8PSAxKQorICAgICAg
ICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NU
aGFuLCBzdGQ6Om1heChiZXN0T2Zmc2V0LCAtMSkpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIC8vIFRoZSBvbmx5IHRoaW5nIGxlZnQgaXMgRXF1YWwuIFdlIHdvdWxkIGhhdmUgZWxpbWlu
YXRlZCB0aGUgR3JlYXRlclRoYW4ncywgYW5kCisgICAgICAgICAgICAvLyBpZiB3ZSBtZXJnZSBM
ZXNzVGhhbiBhbmQgTm90RXF1YWwsIHRoZSBOb3RFcXVhbCBhbHdheXMgY29tZXMgZmlyc3QuCisg
ICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChvdGhlci5tX2tpbmQgPT0gRXF1YWwpOworICAgICAg
ICAgICAgCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWFsbHkgaW50ZXJlc3RpbmcgY2Fz
ZS4gV2UgaGF2ZToKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgQGEgPCBAYiAr
IEMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBhbmQ6CisgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgLy8gICAgIEBhID09IEBiICsgRAorICAgICAgICAgICAgLy8KKyAgICAgICAg
ICAgIC8vIFRoZXJlZm9yZSB3ZSdkIGxpa2UgdG8gcmV0dXJuOgorICAgICAgICAgICAgLy8KKyAg
ICAgICAgICAgIC8vICAgICBAYSA8IEBiICsgbWF4KEMsIEQgKyAxKQorICAgICAgICAgICAgCisg
ICAgICAgICAgICBpbnQgYmVzdE9mZnNldCA9IHN0ZDo6bWF4KG1fb2Zmc2V0LCBvdGhlci5tX29m
ZnNldCArIDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWV0aGlu
ZyBsaWtlIEBhIDwgQGIgKyAyLiBXZSBjYW4ndCBkbyBpdC4KKyAgICAgICAgICAgIGlmIChiZXN0
T2Zmc2V0IDw9IDEpCisgICAgICAgICAgICAgICAgZnVuY3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0
LCBtX3JpZ2h0LCBMZXNzVGhhbiwgc3RkOjptYXgoYmVzdE9mZnNldCwgLTEpKSk7CisKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVGhlIG9ubHkg
dGhpbmcgbGVmdCBpcyBFcXVhbCwgc2luY2Ugd2Ugd291bGQgaGF2ZSBnb3R0ZW4gcmlkIG9mIHRo
ZSBHcmVhdGVyVGhhbidzLgorICAgICAgICBSRUxFQVNFX0FTU0VSVChtX2tpbmQgPT0gRXF1YWwp
OworICAgICAgICAKKyAgICAgICAgLy8gV2Ugd291bGQgbmV2ZXIgc2VlIE5vdEVxdWFsLCBiZWNh
dXNlIHRob3NlIGFsd2F5cyBjb21lIGZpcnN0LiBXZSB3b3VsZCBuZXZlcgorICAgICAgICAvLyBz
ZWUgR3JlYXRlclRoYW4sIGJlY2F1c2Ugd2Ugd291bGQgaGF2ZSBlbGltaW5hdGVkIHRob3NlLiBX
ZSB3b3VsZCBuZXZlciBzZWUKKyAgICAgICAgLy8gTGVzc1RoYW4sIGJlY2F1c2UgdGhvc2UgYWx3
YXlzIGNvbWUgZmlyc3QuCisgICAgICAgIAorICAgICAgICBSRUxFQVNFX0FTU0VSVChvdGhlci5t
X2tpbmQgPT0gRXF1YWwpOworICAgICAgICAvLyBXZSBoYXZlIEBhID09IEBiICsgQyBhbmQgQGEg
PT0gQGIgKyBELCB3aGVyZSBDICE9IEQuIFR1cm4gdGhpcyBpbnRvIHNvbWUKKyAgICAgICAgLy8g
aW5lcXVhbGl0eSB0aGF0IGludm9sdmVzIGEgY29uc3RhbnQgdGhhdCBpcyAtMSwwLDEuCisgICAg
ICAgIAorICAgICAgICBSZWxhdGlvbnNoaXAgbGVzc1RoYW4oCisgICAgICAgICAgICBtX2xlZnQs
IG90aGVyLm1fcmlnaHQsIExlc3NUaGFuLAorICAgICAgICAgICAgc3RkOjptYXgobV9vZmZzZXQs
IG90aGVyLm1fb2Zmc2V0KSArIDEpOworICAgICAgICAKKyAgICAgICAgaWYgKGxlc3NUaGFuLm9m
ZnNldCgpID49IC0xICYmIGxlc3NUaGFuLm9mZnNldCgpIDw9IDEpCisgICAgICAgICAgICBmdW5j
dG9yKGxlc3NUaGFuKTsKKyAgICAgICAgCisgICAgICAgIFJlbGF0aW9uc2hpcCBncmVhdGVyVGhh
bigKKyAgICAgICAgICAgIG1fbGVmdCwgb3RoZXIubV9yaWdodCwgR3JlYXRlclRoYW4sCisgICAg
ICAgICAgICBzdGQ6Om1pbihtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpIC0gMSk7CisgICAgICAg
IGlmIChncmVhdGVyVGhhbi5vZmZzZXQoKSA+PSAtMSAmJiBncmVhdGVyVGhhbi5vZmZzZXQoKSA8
PSAxKQorICAgICAgICAgICAgZnVuY3RvcihncmVhdGVyVGhhbik7CisgICAgfQorICAgIAorICAg
IE5vZGUqIG1fbGVmdDsKKyAgICBOb2RlKiBtX3JpZ2h0OworICAgIEtpbmQgbV9raW5kOworICAg
IGludCBtX29mZnNldDsgLy8gVGhpcyBvZmZzZXQgY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlLgor
fTsKKwordHlwZWRlZiBIYXNoTWFwPE5vZGUqLCBWZWN0b3I8UmVsYXRpb25zaGlwPj4gUmVsYXRp
b25zaGlwTWFwOworCitjbGFzcyBJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZSA6IHB1Ymxp
YyBQaGFzZSB7CitwdWJsaWM6CisgICAgSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UoR3Jh
cGgmIGdyYXBoKQorICAgICAgICA6IFBoYXNlKGdyYXBoLCAiaW50ZWdlciByYW5nZSBvcHRpbWl6
YXRpb24iKQorICAgICAgICAsIG1femVybyhudWxscHRyKQorICAgICAgICAsIG1fcmVsYXRpb25z
aGlwc0F0SGVhZChncmFwaCkKKyAgICAgICAgLCBtX2luc2VydGlvblNldChncmFwaCkKKyAgICB7
CisgICAgfQorICAgIAorICAgIGJvb2wgcnVuKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2dy
YXBoLm1fZm9ybSA9PSBTU0EpOworICAgICAgICAKKyAgICAgICAgLy8gQmVmb3JlIHdlIGRvIGFu
eXRoaW5nLCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgemVybyBjb25zdGFudCBhdCB0aGUgdG9w
LgorICAgICAgICBmb3IgKE5vZGUqIG5vZGUgOiAqbV9ncmFwaC5ibG9jaygwKSkgeworICAgICAg
ICAgICAgaWYgKG5vZGUtPmlzSW50MzJDb25zdGFudCgpICYmICFub2RlLT5hc0ludDMyKCkpIHsK
KyAgICAgICAgICAgICAgICBtX3plcm8gPSBub2RlOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbV96ZXJvKSB7CisgICAgICAg
ICAgICBtX3plcm8gPSBtX2luc2VydGlvblNldC5pbnNlcnRDb25zdGFudCgwLCBOb2RlT3JpZ2lu
KCksIGpzTnVtYmVyKDApKTsKKyAgICAgICAgICAgIG1faW5zZXJ0aW9uU2V0LmV4ZWN1dGUobV9n
cmFwaC5ibG9jaygwKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh2ZXJib3Nl
KSB7CisgICAgICAgICAgICBkYXRhTG9nKCJHcmFwaCBiZWZvcmUgaW50ZWdlciByYW5nZSBvcHRp
bWl6YXRpb246XG4iKTsKKyAgICAgICAgICAgIG1fZ3JhcGguZHVtcCgpOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICBCbG9ja0xpc3QgcG9zdE9yZGVyID0gbV9ncmFwaC5ibG9ja3NJblBv
c3RPcmRlcigpOworICAgICAgICAKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAg
ICAgd2hpbGUgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgcG9zdE9yZGVySW5kZXggPSBwb3N0T3JkZXIuc2l6ZSgpOyBw
b3N0T3JkZXJJbmRleC0tOykgeworICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0g
cG9zdE9yZGVyW3Bvc3RPcmRlckluZGV4XTsKKyAgICAgICAgICAgICAgICBERkdfQVNTRVJUKAor
ICAgICAgICAgICAgICAgICAgICBtX2dyYXBoLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAg
ICBibG9jayA9PSBtX2dyYXBoLmJsb2NrKDApIHx8IG1fc2VlbkJsb2Nrcy5jb250YWlucyhibG9j
aykpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbV9yZWxhdGlvbnNoaXBzID0gbV9y
ZWxhdGlvbnNoaXBzQXRIZWFkW2Jsb2NrXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
IGZvciAodW5zaWduZWQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgYmxvY2stPnNpemUoKTsg
Kytub2RlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJsb2NrLT5h
dChub2RlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGRhdGFMb2coIkFuYWx5c2lzOiBhdCAiLCBub2RlLCAiOiAiLCBsaXN0
RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKCkpLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAg
ZXhlY3V0ZU5vZGUobm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgLy8gSGFuZGxlOgorICAgICAgICAgICAgICAgIC8vIC0gQnJhbmNoIG9uIGlu
dDMyLgorICAgICAgICAgICAgICAgIC8vIC0gQnJhbmNoIG9uIGNvbXBhcmUgb3ZlciBpbnQzMidz
LgorICAgICAgICAgICAgICAgIE5vZGUqIHRlcm1pbmFsID0gYmxvY2stPnRlcm1pbmFsKCk7Cisg
ICAgICAgICAgICAgICAgYm9vbCBhbHJlYWR5TWVyZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAg
ICAgaWYgKHRlcm1pbmFsLT5vcCgpID09IEJyYW5jaCkgeworICAgICAgICAgICAgICAgICAgICBS
ZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5jaGlsZDEoKS51c2VLaW5kKCkgPT0gSW50MzJVc2Up
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbC0+Y2hpbGQxKCkubm9kZSgpLCBt
X3plcm8sIFJlbGF0aW9uc2hpcDo6Tm90RXF1YWwsIDApOworICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSogY29tcGFyZSA9IHRlcm1pbmFs
LT5jaGlsZDEoKS5ub2RlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbXBh
cmUtPm9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUVxOgorICAg
ICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAg
ICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBDb21wYXJlTGVzc0VxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlR3Jl
YXRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXJFcTogewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcGFyZS0+aXNCaW5hcnlVc2VLaW5k
KEludDMyVXNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29t
cGFyZS0+b3AoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUVx
OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZVN0cmljdEVxOgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXAo
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5u
b2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENv
bXBhcmVMZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAg
PSBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21w
YXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4sIDApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQy
KCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25z
aGlwOjpMZXNzVGhhbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdyZWF0ZXI6CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5v
ZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgMCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNh
c2UgQ29tcGFyZUdyZWF0ZXJFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVs
YXRpb25zaGlwID0gUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkdyZWF0
ZXJUaGFuLCAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIERGR19DUkFTSChtX2dyYXBoLCBjb21wYXJlLCAiSW52YWxpZCBjb21wYXJpc29u
IG5vZGUgdHlwZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgY29tcGFyZSwgcmVsYXRp
b25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBNYXAgZm9yVHJ1ZSA9IG1fcmVsYXRpb25zaGlw
czsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcE1hcCBmb3JGYWxzZSA9IG1f
cmVsYXRpb25zaGlwczsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxv
ZygiRGVhbGluZyB3aXRoIHRydWU6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJl
bGF0aW9uc2hpcChmb3JUcnVlLCByZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKFJlbGF0aW9uc2hpcCBpbnZlcnNlID0gcmVsYXRpb25zaGlwLmludmVyc2UoKSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkYXRhTG9nKCJEZWFsaW5nIHdpdGggZmFsc2U6XG4iKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoZm9yRmFsc2UsIGludmVyc2Up
OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8oZm9yVHJ1ZSwgdGVybWlu
YWwtPmJyYW5jaERhdGEoKS0+dGFrZW4uYmxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAg
Y2hhbmdlZCB8PSBtZXJnZVRvKGZvckZhbHNlLCB0ZXJtaW5hbC0+YnJhbmNoRGF0YSgpLT5ub3RU
YWtlbi5ibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5TWVyZ2VkID0gdHJ1
ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIGlmICghYWxyZWFkeU1lcmdlZCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEJh
c2ljQmxvY2sqIHN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNjZXNzb3JzKCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8obV9yZWxhdGlvbnNoaXBzLCBzdWNjZXNzb3Ip
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2Nr
IDogbV9ncmFwaC5ibG9ja3NJbk5hdHVyYWxPcmRlcigpKSB7CisgICAgICAgICAgICBtX3JlbGF0
aW9uc2hpcHMgPSBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAgICAgZm9y
ICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXggPCBibG9jay0+c2l6ZSgpOyArK25v
ZGVJbmRleCkgeworICAgICAgICAgICAgICAgIE5vZGUqIG5vZGUgPSBibG9jay0+YXQobm9kZUlu
ZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAg
ZGF0YUxvZygiVHJhbnNmb3JtYXRpb246IGF0ICIsIG5vZGUsICI6ICIsIGxpc3REdW1wKHNvcnRl
ZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgIC8vIFRoaXMgZW5kcyB1cCBiZWluZyBwcmV0dHkgYXdrd2FyZCB0byB3cml0ZSBiZWNhdXNl
IHdlIG5lZWQgdG8gZGVjaWRlIGlmIHdlCisgICAgICAgICAgICAgICAgLy8gb3B0aW1pemUgYnkg
dXNpbmcgdGhlIHJlbGF0aW9uc2hpcHMgYmVmb3JlIHRoZSBvcGVyYXRpb24sIGJ1dCB3ZSBuZWVk
IHRvCisgICAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlTm9kZSgpIGJlZm9yZSB3ZSBvcHRp
bWl6ZS4KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPm9wKCkpIHsKKyAgICAgICAgICAg
ICAgICBjYXNlIEFyaXRoQWRkOiB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS0+aXNC
aW5hcnlVc2VLaW5kKEludDMyVXNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS0+YXJpdGhNb2RlKCkgIT0gQXJpdGg6OkNoZWNr
T3ZlcmZsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCFub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRpb25zaGlwcy5maW5kKG5vZGUtPmNoaWxkMSgpLm5v
ZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyID09IG1fcmVsYXRpb25zaGlwcy5l
bmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pblZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0
czxpbnQ+OjptaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFZhbHVlID0gc3RkOjpu
dW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChSZWxh
dGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIG1pblZhbHVlID0gc3RkOjptYXgobWluVmFsdWUsIHJlbGF0aW9uc2hpcC5taW5WYWx1
ZU9mTGVmdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlID0gc3RkOjptaW4o
bWF4VmFsdWUsIHJlbGF0aW9uc2hpcC5tYXhWYWx1ZU9mTGVmdCgpKTsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1
bU92ZXJmbG93czxpbnQ+KG1pblZhbHVlLCBub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpKSB8fAor
ICAgICAgICAgICAgICAgICAgICAgICAgc3VtT3ZlcmZsb3dzPGludD4obWF4VmFsdWUsIG5vZGUt
PmNoaWxkMigpLT5hc0ludDMyKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBleGVjdXRlTm9kZShibG9j
ay0+YXQobm9kZUluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIG5vZGUtPnNldEFyaXRoTW9k
ZShBcml0aDo6VW5jaGVja2VkKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBDaGVja0luQm91bmRzOiB7CisgICAg
ICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRpb25zaGlwcy5maW5kKG5vZGUtPmNo
aWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyID09IG1fcmVsYXRp
b25zaGlwcy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBub25OZWdhdGl2ZSA9IGZhbHNl
OworICAgICAgICAgICAgICAgICAgICBib29sIGxlc3NUaGFuTGVuZ3RoID0gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXItPnZh
bHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLm1pblZhbHVl
T2ZMZWZ0KCkgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25OZWdhdGl2ZSA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChyZWxhdGlvbnNoaXAucmlnaHQoKSA9PSBub2RlLT5jaGlsZDIoKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hp
cDo6RXF1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVsYXRpb25zaGlw
Lm9mZnNldCgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzc1RoYW5M
ZW5ndGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6
TGVzc1RoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVsYXRpb25zaGlw
Lm9mZnNldCgpIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3NUaGFu
TGVuZ3RoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5v
bk5lZ2F0aXZlICYmIGxlc3NUaGFuTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBl
eGVjdXRlTm9kZShibG9jay0+YXQobm9kZUluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBub2RlLT5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2Rl
SW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0
dXJuIGNoYW5nZWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgZXhlY3V0ZU5vZGUoTm9k
ZSogbm9kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgeworICAgICAgICBj
YXNlIENoZWNrSW5Cb3VuZHM6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlv
bnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBub2RlLT5jaGlsZDIoKS5ub2RlKCksIFJlbGF0
aW9uc2hpcDo6TGVzc1RoYW4pKTsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlv
bnNoaXAobm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRl
clRoYW4sIC0xKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAg
CisgICAgICAgIGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIG9ubHkgaW50
ZXJlc3RlZCBpbiBpbnQzMiBhZGRpdGlvbnMgYW5kIHdlIGN1cnJlbnRseSBvbmx5IGtub3cgaG93
IHRvCisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIG5vbi13cmFwcGluZyBvbmVzLgorICAgICAg
ICAgICAgaWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBGSVhNRTogV2UgY291bGQg
aGFuZGxlIHRoZSB1bmNoZWNrZWQgYXJpdGhtZXRpYyBjYXNlLiBXZSBqdXN0IGRvIGl0IGRvbid0
IHJpZ2h0CisgICAgICAgICAgICAvLyBub3cuCisgICAgICAgICAgICBpZiAobm9kZS0+YXJpdGhN
b2RlKCkgIT0gQXJpdGg6OkNoZWNrT3ZlcmZsb3cpCisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEhhbmRsZSBhZGQ6IEB2YWx1ZSArIGNvbnN0YW50
LgorICAgICAgICAgICAgaWYgKCFub2RlLT5jaGlsZDIoKS0+aXNJbnQzMkNvbnN0YW50KCkpCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBvZmZz
ZXQgPSBub2RlLT5jaGlsZDIoKS0+YXNJbnQzMigpOworICAgICAgICAgICAgCisgICAgICAgICAg
ICAvLyBXZSBhZGQgYSByZWxhdGlvbnNoaXAgZm9yIEBhZGQgPT0gQHZhbHVlICsgY29uc3RhbnQs
IGFuZCB0aGVuIHdlIGNvcHkgdGhlCisgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIGZvciBA
dmFsdWUuIFRoaXMgZ2l2ZXMgdXMgYSBvbmUtZGVlcCB2aWV3IG9mIEB2YWx1ZSdzIGV4aXN0aW5n
CisgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLCB3aGljaCBtYXRjaGVzIHRoZSBvbmUtZGVl
cCBzZWFyY2ggaW4gc2V0UmVsYXRpb25zaGlwKCkuCisgICAgICAgICAgICAKKyAgICAgICAgICAg
IHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAobm9kZSwgbm9k
ZS0+Y2hpbGQxKCkubm9kZSgpLCBSZWxhdGlvbnNoaXA6OkVxdWFsLCBvZmZzZXQpKTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9k
ZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1fcmVsYXRpb25z
aGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRk
OworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXIt
PnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNo
aXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNo
aXAucmlnaHQoKSA9PSBub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG5vZGUpOworICAgICAg
ICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLmFkZFRvT2Zmc2V0KG9mZnNldCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICB0b0FkZC5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRp
b25zaGlwIDogdG9BZGQpCisgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChyZWxh
dGlvbnNoaXAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAv
LyBOb3cgd2Ugd2FudCB0byBlc3RhYmxpc2ggdGhhdCBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91
dHB1dCBvZiB0aGUgYWRkaXRpb24gYXJlCisgICAgICAgICAgICAvLyB3aXRoaW4gYSBwYXJ0aWN1
bGFyIHJhbmdlIG9mIGludGVnZXJzLgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob2Zm
c2V0ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFkZDogQHZhbHVlICsg
MSIgdGhlbiB3ZSBrbm93IHRoYXQgQHZhbHVlIDw9IG1heCAtIDEsIGkuZS4gdGhhdAorICAgICAg
ICAgICAgICAgIC8vIEB2YWx1ZSA8IG1heC4KKyAgICAgICAgICAgICAgICBpZiAoIXN1bU92ZXJm
bG93czxpbnQ+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCksIC1vZmZzZXQsIDEpKSB7
CisgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAg
ICAgICAgIFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5j
aGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC0gb2Zm
c2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFk
ZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQgQGFkZCA+PSBtaW4gKyAxLCBpLmUuIHRo
YXQKKyAgICAgICAgICAgICAgICAvLyBAYWRkID4gbWluLgorICAgICAgICAgICAgICAgIGlmICgh
c3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSwgb2Zmc2V0
LCAtMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAg
ICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpICsgb2Zmc2V0IC0g
MSksCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7Cisg
ICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgLSAxIiB0aGVuIHdlIGtu
b3cgdGhhdCBAdmFsdWUgPj0gbWluICsgMSwgaS5lLiB0aGF0CisgICAgICAgICAgICAgICAgLy8g
QHZhbHVlID4gbWluLgorICAgICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZsb3dzPGludD4oc3Rk
OjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSwgb2Zmc2V0LCAtMSkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRp
b25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUo
KSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkgKyBvZmZzZXQgLSAxKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSAtMSAx
IiB0aGVuIHdlIGtub3cgdGhhdCBAYWRkIDw9IG1heCAtIDEsIGkuZS4gdGhhdAorICAgICAgICAg
ICAgICAgIC8vIEBhZGQgPCBtYXguCisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8
aW50PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpLCAtb2Zmc2V0LCAxKSkgeworICAg
ICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAg
ICBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwgbV96ZXJv
LCBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSBvZmZzZXQgKyAxKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBHZXRB
cnJheUxlbmd0aDogeworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcChu
b2RlLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIC0xKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgVXBzaWxvbjog
eworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgIFJlbGF0aW9u
c2hpcChub2RlLT5jaGlsZDEoKS5ub2RlKCksIG5vZGUtPnBoaSgpLCBSZWxhdGlvbnNoaXA6OkVx
dWFsLCAwKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRp
b25zaGlwcy5maW5kKG5vZGUtPmNoaWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICBpZiAoaXRl
ciAhPSBtX3JlbGF0aW9uc2hpcHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8UmVs
YXRpb25zaGlwPiB0b0FkZDsKKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxh
dGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICBp
ZiAobm9kZS0+cGhpKCkgPT0gbmV3UmVsYXRpb25zaGlwLnJpZ2h0KCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlw
LnNldExlZnQobm9kZS0+cGhpKCkpOworICAgICAgICAgICAgICAgICAgICB0b0FkZC5hcHBlbmQo
bmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9y
IChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogdG9BZGQpCisgICAgICAgICAgICAgICAgICAg
IHNldFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXApOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRSZWxh
dGlvbnNoaXAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9
IDEpCisgICAgeworICAgICAgICBzZXRSZWxhdGlvbnNoaXAobV9yZWxhdGlvbnNoaXBzLCByZWxh
dGlvbnNoaXAsIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldFJlbGF0aW9u
c2hpcCgKKyAgICAgICAgUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBNYXAsIFJlbGF0aW9u
c2hpcCByZWxhdGlvbnNoaXAsIHVuc2lnbmVkIHRpbWVUb0xpdmUgPSAxKQorICAgIHsKKyAgICAg
ICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIHJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSk7
CisgICAgICAgIHNldE9uZVNpZGUocmVsYXRpb25zaGlwTWFwLCByZWxhdGlvbnNoaXAuZmxpcHBl
ZCgpLCB0aW1lVG9MaXZlKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRPbmVTaWRlKAorICAg
ICAgICBSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgUmVsYXRpb25zaGlwIHJlbGF0
aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9IDEpCisgICAgeworICAgICAgICBpZiAodmVy
Ym9zZSkKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBTZXR0aW5nOiAiLCByZWxhdGlvbnNoaXAs
ICJcbiIpOworICAgICAgICAKKyAgICAgICAgYXV0byByZXN1bHQgPSByZWxhdGlvbnNoaXBNYXAu
YWRkKAorICAgICAgICAgICAgcmVsYXRpb25zaGlwLmxlZnQoKSwgVmVjdG9yPFJlbGF0aW9uc2hp
cD4oKSk7CisgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+JiByZWxhdGlvbnNoaXBzID0gcmVz
dWx0Lml0ZXJhdG9yLT52YWx1ZTsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7
CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAm
IG90aGVyUmVsYXRpb25zaGlwIDogcmVsYXRpb25zaGlwcykgeworICAgICAgICAgICAgaWYgKG90
aGVyUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAg
ICAgICBpZiAoUmVsYXRpb25zaGlwIGZpbHRlcmVkID0gb3RoZXJSZWxhdGlvbnNoaXAuZmlsdGVy
KHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJSZWxhdGlvbnNoaXAg
PSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICh0aW1lVG9MaXZlICYmIG90aGVyUmVsYXRpb25zaGlw
LmtpbmQoKSA9PSBSZWxhdGlvbnNoaXA6OkVxdWFsKSB7CisgICAgICAgICAgICAgICAgUmVsYXRp
b25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9IG90aGVyUmVsYXRpb25zaGlwOworICAgICAgICAgICAg
ICAgIGlmIChuZXdSZWxhdGlvbnNoaXAucmlnaHQoKSAhPSBvdGhlclJlbGF0aW9uc2hpcC5yaWdo
dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG90aGVy
UmVsYXRpb25zaGlwLnJpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRp
b25zaGlwLmFkZFRvT2Zmc2V0KG90aGVyUmVsYXRpb25zaGlwLm9mZnNldCgpKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYg
KCFmb3VuZCkKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7
CisgICAgICAgIAorICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCBhbm90aGVyUmVsYXRpb25zaGlw
IDogdG9BZGQpIHsKKyAgICAgICAgICAgIEFTU0VSVCh0aW1lVG9MaXZlKTsKKyAgICAgICAgICAg
IHNldE9uZVNpZGUocmVsYXRpb25zaGlwTWFwLCBhbm90aGVyUmVsYXRpb25zaGlwLCB0aW1lVG9M
aXZlIC0gMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYm9vbCBtZXJnZVRvKFJlbGF0
aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgewor
ICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGRhdGFMb2coIk1lcmdpbmcgdG8gIiwg
cG9pbnRlckR1bXAodGFyZ2V0KSwgIjpcbiIpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fc2Vl
bkJsb2Nrcy5hZGQodGFyZ2V0KSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBibG9j
ay4gV2UgY29weSBzdWJqZWN0IHRvIGxpdmVuZXNzIHBydW5pbmcuCisgICAgICAgICAgICBhdXRv
IGlzTGl2ZSA9IFsmXSAoTm9kZSogbm9kZSkgeworICAgICAgICAgICAgICAgIGlmIChub2RlID09
IG1femVybykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIHRhcmdldC0+c3NhLT5saXZlQXRIZWFkLmNvbnRhaW5zKG5vZGUpOworICAgICAg
ICAgICAgfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IHJl
bGF0aW9uc2hpcE1hcCkgeworICAgICAgICAgICAgICAgIGlmICghaXNMaXZlKGVudHJ5LmtleSkp
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHZhbHVlczsKKyAgICAgICAgICAgICAgICBm
b3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBlbnRyeS52YWx1ZSkgeworICAgICAgICAg
ICAgICAgICAgICBBU1NFUlQocmVsYXRpb25zaGlwLmxlZnQoKSA9PSBlbnRyeS5rZXkpOworICAg
ICAgICAgICAgICAgICAgICBpZiAoaXNMaXZlKHJlbGF0aW9uc2hpcC5yaWdodCgpKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGF0YUxvZygiICBQcm9wYWdhdGluZyAiLCByZWxhdGlvbnNoaXAsICJcbiIpOworICAg
ICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChyZWxhdGlvbnNoaXApOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAg
ICAgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5hZGQoZW50cnkua2V5
LCB2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1lcmdlIGJ5IGludGVyc2VjdGluZy4gV2UgaGF2
ZSBubyBub3Rpb24gb2YgQk9UVE9NLCBzbyB3ZSB1c2UgdGhlIG9taXNzaW9uIG9mCisgICAgICAg
IC8vIHJlbGF0aW9uc2hpcHMgZm9yIGEgcGFpciBvZiBub2RlcyB0byBtZWFuIFRPUC4gVGhlIHJl
YXNvbiB3aHkgd2UgZG9uJ3QgbmVlZCBCT1RUT00KKyAgICAgICAgLy8gaXMgKDEpIHdlIGp1c3Qg
b3ZlcmFwcHJveGltYXRlIGNvbnRyYWRpY3Rpb25zIGFuZCAoMikgYSB2YWx1ZSBuZXZlciBoYXZp
bmcgYmVlbgorICAgICAgICAvLyBhc3NpZ25lZCB3b3VsZCBvbmx5IGhhcHBlbiBpZiB3ZSBoYXZl
IG5vdCBwcm9jZXNzZWQgdGhlIG5vZGUncyBwcmVkZWNlc3Nvci4gV2UKKyAgICAgICAgLy8gc2hv
dWxkbid0IHByb2Nlc3MgYmxvY2tzIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBibG9jaydz
IHByZWRlY2Vzc29yIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gYXJlIHVzaW5nIFJQTy4KKyAgICAg
ICAgVmVjdG9yPE5vZGUqPiB0b1JlbW92ZTsKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7
CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0
XSkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gcmVsYXRpb25zaGlwTWFwLmZpbmQoZW50cnku
a2V5KTsKKyAgICAgICAgICAgIGlmIChpdGVyID09IHJlbGF0aW9uc2hpcE1hcC5lbmQoKSkgewor
ICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChlbnRyeS5rZXkpOworICAgICAgICAgICAg
ICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiB2YWx1
ZXM7CisgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCB0YXJnZXRSZWxhdGlvbnNoaXAgOiBl
bnRyeS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHNvdXJjZVJl
bGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJi
b3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICBNZXJnaW5nICIsIHRhcmdl
dFJlbGF0aW9uc2hpcCwgIiBhbmQgIiwgc291cmNlUmVsYXRpb25zaGlwLCAiOlxuIik7CisgICAg
ICAgICAgICAgICAgICAgIHRhcmdldFJlbGF0aW9uc2hpcC5tZXJnZSgKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHNvdXJjZVJlbGF0aW9uc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsm
XSAoUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRh
TG9nKCIgICAgR290ICIsIG5ld1JlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAg
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICAgICAgc3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICAgICAgICAg
ICAgaWYgKGVudHJ5LnZhbHVlID09IHZhbHVlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZXM7CisgICAgICAg
ICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKE5vZGUqIG5vZGUg
OiB0b1JlbW92ZSkKKyAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdLnJl
bW92ZShub2RlKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgIH0KKyAg
ICAKKyAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiBzb3J0ZWRSZWxhdGlvbnNoaXBzKCkKKyAgICB7
CisgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHJlc3VsdDsKKyAgICAgICAgZm9yIChhdXRv
JiBlbnRyeSA6IG1fcmVsYXRpb25zaGlwcykKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRWZWN0
b3IoZW50cnkudmFsdWUpOworICAgICAgICBzdGQ6OnNvcnQocmVzdWx0LmJlZ2luKCksIHJlc3Vs
dC5lbmQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIE5vZGUq
IG1femVybzsKKyAgICBSZWxhdGlvbnNoaXBNYXAgbV9yZWxhdGlvbnNoaXBzOworICAgIEJsb2Nr
U2V0IG1fc2VlbkJsb2NrczsKKyAgICBCbG9ja01hcDxSZWxhdGlvbnNoaXBNYXA+IG1fcmVsYXRp
b25zaGlwc0F0SGVhZDsKKyAgICBJbnNlcnRpb25TZXQgbV9pbnNlcnRpb25TZXQ7Cit9OworICAg
IAorfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2Jvb2wgcGVyZm9ybUludGVnZXJSYW5nZU9w
dGltaXphdGlvbihHcmFwaCYgZ3JhcGgpCit7CisgICAgU2FtcGxpbmdSZWdpb24gc2FtcGxpbmdS
ZWdpb24oIkRGRyBJbnRlZ2VyIFJhbmdlIE9wdGltaXphdGlvbiBQaGFzZSIpOworICAgIHJldHVy
biBydW5QaGFzZTxJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZT4oZ3JhcGgpOworfQorCit9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCisKKyNlbmRpZiAvLyBFTkFCTEUoREZHX0pJVCkKKwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRp
b25QaGFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50
ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2Vf
aAorI2RlZmluZSBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZV9oCisKKyNpZiBFTkFC
TEUoREZHX0pJVCkKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgeworCitjbGFzcyBH
cmFwaDsKKworLy8gUmVtb3ZlcyBvdmVyZmxvdyBjaGVja3MgYW5kIG91dC1vZi1ib3VuZHMgY2hl
Y2tzIGJ5IGRvaW5nIGEgZm9yd2FyZCBmbG93IGFuYWx5c2lzIHRvIHByb3ZlCisvLyBpbmVxdWFs
aXRpZXMuCisKK2Jvb2wgcGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXphdGlvbihHcmFwaCYpOwor
Cit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCisKKyNlbmRpZiAvLyBFTkFCTEUoREZHX0pJVCkK
KworI2VuZGlmIC8vIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQbGFuLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4uY3BwCShyZXZpc2lvbiAxODUzNjkpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
NCw2ICs0NCw3IEBACiAjaW5jbHVkZSAiREZHRml4dXBQaGFzZS5oIgogI2luY2x1ZGUgIkRGR0dy
YXBoU2FmZXBvaW50LmgiCiAjaW5jbHVkZSAiREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2Uu
aCIKKyNpbmNsdWRlICJERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIgogI2luY2x1
ZGUgIkRGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuaCIKICNpbmNsdWRlICJERkdK
SVRDb21waWxlci5oIgogI2luY2x1ZGUgIkRGR0xJQ01QaGFzZS5oIgpAQCAtMzU3LDYgKzM1OCw4
IEBAIFBsYW46OkNvbXBpbGF0aW9uUGF0aCBQbGFuOjpjb21waWxlSW5UaHIKICAgICAgICAgcGVy
Zm9ybUNvbnN0YW50SG9pc3RpbmcoZGZnKTsKICAgICAgICAgcGVyZm9ybUdsb2JhbENTRShkZmcp
OwogICAgICAgICBwZXJmb3JtTGl2ZW5lc3NBbmFseXNpcyhkZmcpOworICAgICAgICBwZXJmb3Jt
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKGRmZyk7CisgICAgICAgIHBlcmZvcm1MaXZlbmVzc0Fu
YWx5c2lzKGRmZyk7CiAgICAgICAgIHBlcmZvcm1DRkEoZGZnKTsKICAgICAgICAgcGVyZm9ybUNv
bnN0YW50Rm9sZGluZyhkZmcpOwogICAgICAgICBwZXJmb3JtQ2xlYW5VcChkZmcpOyAvLyBSZWR1
Y2UgdGhlIGdyYXBoIHNpemUgYSBsb3QuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254618</attachid>
            <date>2015-06-09 18:00:32 -0700</date>
            <delta_ts>2015-06-10 13:26:52 -0700</delta_ts>
            <desc>looks pretty good</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>56221</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg1Mzk3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBA
CisyMDE1LTA2LTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIGFk
ZHMgYSBwaGFzZSB0aGF0IGRvZXMgZm9yd2FyZCBwcm9wYWdhdGlvbiBvZiBpbnRlZ2VyIGluZXF1
YWxpdGllcy4gVGhpcyBhbGxvd3MgdXMKKyAgICAgICAgdG8gZG8gdGhlIGFsZ2VicmFpYyByZWFz
b25pbmcgd2UgbmVlZCB0byBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcy4g
SXQKKyAgICAgICAgYWxzbyBlbGltaW5hdGVzIG92ZXJmbG93IGNoZWNrcyBvbiBBcml0aEFkZCB3
aXRoIGEgY29uc3RhbnQuCisgICAgICAgIAorICAgICAgICBUaGUgcGhhc2UncyBhbmFseXNpcyBw
cm9kdWNlcyByZXN1bHRzIHRoYXQgYXJlIHBvd2VyZnVsIGVub3VnaCB0byBkbyBzcGVjdWxhdGl2
ZSBib3VuZHMKKyAgICAgICAgY2hlY2sgaG9pc3RpbmcsIGJ1dCB0aGlzIHBoYXNlIGN1cnJlbnRs
eSBvbmx5IGRvZXMgZWxpbWluYXRpb24uIFdlIGNhbiBpbXBsZW1lbnQKKyAgICAgICAgaG9pc3Rp
bmcgbGF0ZXIuCisgICAgICAgIAorICAgICAgICBPbiBwcm9ncmFtcyB0aGF0IGp1c3QgbG9vcCBv
dmVyIGFuIGFycmF5IGxpa2U6CisgICAgICAgIAorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBhcnJheS5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICB0aGluZ3kgKz0gYXJyYXlb
aV0KKyAgICAgICAgCisgICAgICAgIFRoaXMgY2hhbmdlIGlzIGEgNjAlIHNwZWVkLXVwLgorCisg
ICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUudmN4cHJv
ai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogZGZnL0RGR0ludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChKU0M6OkRGRzo6cGVyZm9ybUludGVn
ZXJSYW5nZU9wdGltaXphdGlvbik6CisgICAgICAgICogZGZnL0RGR0ludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlLmg6IEFkZGVkLgorICAgICAgICAqIGRmZy9ERkdQbGFuLmNwcDoKKyAgICAg
ICAgKEpTQzo6REZHOjpQbGFuOjpjb21waWxlSW5UaHJlYWRJbXBsKToKKwogMjAxNS0wNi0wOSAg
Q2hyaXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgogCiAgICAgICAgIEFsbG93IG9uZSBzeW5j
IEdDIHBlciBnY1RpbWVyIGludGVydmFsIG9uIGNyaXRpY2FsIG1lbW9yeSBwcmVzc3VyZSB3YXJu
aW5nCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiAxODUz
NjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29w
eSkKQEAgLTE4MSw2ICsxODEsNyBAQCBzZXQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGRm
Zy9ERkdJblBsYWNlQWJzdHJhY3RTdGF0ZS5jcHAKICAgICBkZmcvREZHSW5zZXJ0T1NSSGludHNG
b3JVcGRhdGUuY3BwCiAgICAgZGZnL0RGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNlLmNwcAor
ICAgIGRmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKICAgICBkZmcvREZH
SW52YWxpZGF0aW9uUG9pbnRJbmplY3Rpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSklUQ29kZS5j
cHAKICAgICBkZmcvREZHSklUQ29tcGlsZXIuY3BwCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFT
Y3JpcHRDb3JlLnZjeHByb2oJKHJldmlzaW9uIDE4NTM2OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2oJKHdvcmtp
bmcgY29weSkKQEAgLTQxOCw2ICs0MTgsNyBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5c
ZGZnXERGR0luUGxhY2VBYnN0cmFjdFN0YXRlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1
ZGU9Ii4uXGRmZ1xERkdJbnNlcnRPU1JIaW50c0ZvclVwZGF0ZS5jcHAiIC8+CiAgICAgPENsQ29t
cGlsZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwIiAv
PgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnZh
bGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1
ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4u
XGRmZ1xERkdKSVRDb21waWxlci5jcHAiIC8+CkBAIC0xMTEzLDYgKzExMTQsNyBAQAogICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0luc2VydE9TUkhpbnRzRm9yVXBkYXRlLmgiIC8+
CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW5zZXJ0aW9uU2V0LmgiIC8+CiAg
ICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhh
c2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnRlZ2VyUmFuZ2VP
cHRpbWl6YXRpb25QaGFzZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERG
R0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuaCIgLz4KICAgICA8Q2xJbmNsdWRlIElu
Y2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIu
LlxkZmdcREZHSklUQ29tcGlsZXIuaCIgLz4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCShyZXZpc2lvbiAxODUzNjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlw
dENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYg
KzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBDMTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rp
b24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2
NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3Mg
PSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBG
MUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURl
Zi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBG
ODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkz
NkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJ
MEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBo
YXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBG
ODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFz
ZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFu
Z2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9w
dGltaXphdGlvblBoYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5
MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAgKi87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVE
NzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8q
IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwICovOyB9OwpAQCAtMjE2MSw2ICsyMTYzLDggQEAK
IAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlBIC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9
IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8qIEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVjb2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0
cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0
cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBwYXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0
VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlG
MDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9u
UGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzND
IC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGgg
PSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9
IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMw
MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0gZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFERjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVt
b3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01v
dkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2Uu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNDk5Myw2ICs0OTk3LDggQEAKIAkJ
CQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUgLyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUu
aCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29t
YmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBGMzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJ
bnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5oICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgz
QTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4
OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjExOTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBv
aW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAogCQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAv
KiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYx
NzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENvZGUuY3BwICovLApAQCAtNTYzMCw2ICs1NjM2LDcg
QEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5U
aHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBB
cml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4
NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2
ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZCREUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBp
biBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1
bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJCTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBS
dW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8sCkBAIC03MzcwLDYgKzczNzcsNyBAQAogCQkJCTBG
MkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBKU0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEzNTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2Uu
Y3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5
RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0JvdW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVGMDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQwRjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxs
YmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25Q
aGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDExNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJVCkKKworI2luY2x1ZGUgIkRGR0Jsb2NrTWFw
SW5saW5lcy5oIgorI2luY2x1ZGUgIkRGR0dyYXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9u
U2V0LmgiCisjaW5jbHVkZSAiREZHUGhhc2UuaCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJv
cGFnYXRpb25QaGFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIK
KyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZH
IHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgYm9vbCB2ZXJib3NlID0gZmFsc2U7CisKK2ludDY0
X3QgY2xhbXBlZFN1bUltcGwoKSB7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4u
IEFyZ3M+CitpbnQ2NF90IGNsYW1wZWRTdW1JbXBsKGludCBsZWZ0LCBBcmdzLi4uIGFyZ3MpCit7
CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGxlZnQpICsgY2xhbXBlZFN1bUltcGwo
YXJncy4uLik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitpbnQgY2xhbXBlZFN1
bShBcmdzLi4uIGFyZ3MpCit7CisgICAgaW50NjRfdCByZXN1bHQgPSBjbGFtcGVkU3VtSW1wbChh
cmdzLi4uKTsKKyAgICByZXR1cm4gc3RkOjptaW4oCisgICAgICAgIHN0YXRpY19jYXN0PGludDY0
X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpLAorICAgICAgICBzdGQ6Om1heCgK
KyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50
Pjo6bWluKCkpLAorICAgICAgICAgICAgcmVzdWx0KSk7Cit9CisKK2NsYXNzIFJlbGF0aW9uc2hp
cCB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgTGVzc1RoYW4sCisgICAgICAg
IEVxdWFsLAorICAgICAgICBOb3RFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4KKyAgICB9Owor
ICAgIAorICAgIHN0YXRpYyBLaW5kIGZsaXBwZWQoS2luZCBraW5kKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICByZXR1
cm4gR3JlYXRlclRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICByZXR1cm4g
RXF1YWw7CisgICAgICAgIGNhc2UgTm90RXF1YWw6CisgICAgICAgICAgICByZXR1cm4gTm90RXF1
YWw7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICByZXR1cm4gTGVzc1Ro
YW47CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgcmV0dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAg
ICAgIDogbV9sZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxscHRyKQorICAgICAg
ICAsIG1fa2luZChFcXVhbCkKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgIHsKKyAgICB9Cisg
ICAgCisgICAgUmVsYXRpb25zaGlwKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQs
IGludCBvZmZzZXQgPSAwKQorICAgICAgICA6IG1fbGVmdChsZWZ0KQorICAgICAgICAsIG1fcmln
aHQocmlnaHQpCisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwgbV9vZmZzZXQob2Zm
c2V0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0KTsKKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQobV9yaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCAhPSBt
X3JpZ2h0KTsKKyAgICB9CisgICAgCisgICAgdHlwZWRlZiB2b2lkKiAoUmVsYXRpb25zaGlwOjoq
VW5zcGVjaWZpZWRCb29sVHlwZSk7CisKKyAgICBvcGVyYXRvciBVbnNwZWNpZmllZEJvb2xUeXBl
KigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID8gcmVpbnRlcnByZXRfY2Fz
dDxVbnNwZWNpZmllZEJvb2xUeXBlKj4oMSkgOiAwOworICAgIH0KKyAgICAKKyAgICBOb2RlKiBs
ZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9sZWZ0OyB9CisgICAgTm9kZSogcmlnaHQoKSBjb25zdCB7
IHJldHVybiBtX3JpZ2h0OyB9CisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5k
OyB9CisgICAgaW50IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0OyB9CisgICAgCisg
ICAgUmVsYXRpb25zaGlwIGZsaXBwZWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCEqdGhp
cykKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgCisgICAgICAg
IC8vIFRoaXMgc2hvdWxkIHJldHVybiBSZWxhdGlvbnNoaXAoKSBpZiAtbV9vZmZzZXQgb3ZlcmZs
b3dzLiBGb3IgZXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIEBhID4gQGIgLSAy
KiozMQorICAgICAgICAvLworICAgICAgICAvLyBJZiB3ZSBmbGlwIGl0IHdlIGdldDoKKyAgICAg
ICAgLy8KKyAgICAgICAgLy8gICAgIEBiIDwgQGEgKyAyKiozMQorICAgICAgICAvLworICAgICAg
ICAvLyBFeGNlcHQgdGhhdCB0aGUgc2lnbiBnZXRzIGZsaXBwZWQgc2luY2UgaXQncyBJTlRfTUlO
OgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQGIgPCBAYSAtIDIqKjMxCisgICAgICAgIC8v
CisgICAgICAgIC8vIEFuZCB0aGF0IG1ha2VzIG5vIHNlbnNlLiBUbyBzZWUgaG93IGxpdHRsZSBz
ZW5zZSBpdCBtYWtlcywgY29uc2lkZXI6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYSA+
IEB6ZXJvIC0gMioqMzEKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2Ugd291bGQgZmxpcCBpdCB0
byBtZWFuOgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQHplcm8gPCBAYSAtIDIqKjMxCisg
ICAgICAgIC8vCisgICAgICAgIC8vIFdoaWNoIGlzIGFic3VyZC4KKyAgICAgICAgCisgICAgICAg
IGlmIChtX29mZnNldCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpKQorICAgICAg
ICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIFJl
bGF0aW9uc2hpcChtX3JpZ2h0LCBtX2xlZnQsIGZsaXBwZWQobV9raW5kKSwgLW1fb2Zmc2V0KTsK
KyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwIGludmVyc2UoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgaWYgKCEqdGhpcykKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgCisg
ICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAg
ICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTm90RXF1YWwsIG1fb2Zmc2V0
KTsKKyAgICAgICAgY2FzZSBOb3RFcXVhbDoKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNo
aXAobV9sZWZ0LCBtX3JpZ2h0LCBFcXVhbCwgbV9vZmZzZXQpOworICAgICAgICBjYXNlIExlc3NU
aGFuOgorICAgICAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG1fb2Zmc2V0LCAtMSkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgcmV0dXJu
IFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEdyZWF0ZXJUaGFuLCBtX29mZnNldCAtIDEp
OworICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgICAgICAgICAgaWYgKHN1bU92ZXJmbG93
czxpbnQ+KG1fb2Zmc2V0LCAxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlw
KCk7CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVz
c1RoYW4sIG1fb2Zmc2V0ICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIAorICAgIGJvb2wgaXNDYW5vbmlj
YWwoKSBjb25zdCB7IHJldHVybiBtX2xlZnQgPCBtX3JpZ2h0OyB9CisgICAgCisgICAgUmVsYXRp
b25zaGlwIGNhbm9uaWNhbCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaXNDYW5vbmljYWwo
KSkKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgcmV0dXJuIGZsaXBwZWQoKTsK
KyAgICB9CisgICAgCisgICAgYm9vbCBzYW1lTm9kZXNBcyhjb25zdCBSZWxhdGlvbnNoaXAmIG90
aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbGVmdCA9PSBvdGhlci5tX2xlZnQK
KyAgICAgICAgICAgICYmIG1fcmlnaHQgPT0gb3RoZXIubV9yaWdodDsKKyAgICB9CisgICAgCisg
ICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gc2FtZU5vZGVzQXMob3RoZXIpCisgICAgICAgICAgICAmJiBtX2tp
bmQgPT0gb3RoZXIubV9raW5kCisgICAgICAgICAgICAmJiBtX29mZnNldCA9PSBvdGhlci5tX29m
ZnNldDsKKyAgICB9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVsYXRpb25zaGlw
JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgIT0gb3RoZXIubV9sZWZ0
KQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdCA8IG90aGVyLm1fbGVmdDsKKyAgICAgICAgaWYg
KG1fcmlnaHQgIT0gb3RoZXIubV9yaWdodCkKKyAgICAgICAgICAgIHJldHVybiBtX3JpZ2h0IDwg
b3RoZXIubV9yaWdodDsKKyAgICAgICAgaWYgKG1fa2luZCAhPSBvdGhlci5tX2tpbmQpCisgICAg
ICAgICAgICByZXR1cm4gbV9raW5kIDwgb3RoZXIubV9raW5kOworICAgICAgICByZXR1cm4gbV9v
ZmZzZXQgPCBvdGhlci5tX29mZnNldDsKKyAgICB9CisgICAgCisgICAgLy8gSWYgcG9zc2libGUs
IHJldHVybnMgYSBmb3JtIG9mIHRoaXMgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSBnaXZlbiBub2Rl
IGlzIHRoZSBsZWZ0CisgICAgLy8gc2lkZS4gUmV0dXJucyBhIG51bGwgcmVsYXRpb25zaGlwIGlm
IHRoaXMgcmVsYXRpb25zaGlwIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgdGhpcworICAgIC8v
IG5vZGUuCisgICAgUmVsYXRpb25zaGlwIGZvck5vZGUoTm9kZSogbm9kZSkgY29uc3QKKyAgICB7
CisgICAgICAgIGlmIChtX2xlZnQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICAgICAgaWYgKG1fcmlnaHQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBmbGlwcGVk
KCk7CisgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICB9CisgICAgCisgICAgdm9p
ZCBzZXRMZWZ0KE5vZGUqIGxlZnQpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChsZWZ0
ICE9IG1fcmlnaHQpOworICAgICAgICBtX2xlZnQgPSBsZWZ0OworICAgIH0KKyAgICBib29sIGFk
ZFRvT2Zmc2V0KGludCBvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGlu
dD4obV9vZmZzZXQsIG9mZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IG1fb2Zmc2V0ICs9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZShjb25zdCBSZWxh
dGlvbnNoaXAmIG90aGVyLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSBjb25zdAorICAgIHsKKyAg
ICAgICAgLy8gSGFuZGxlIHRoZSBzdXBlciBvYnZpb3VzIGNhc2UgZmlyc3QuCisgICAgICAgIGlm
ICgqdGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoaXMgZG9lcyBz
b21lIGludGVyZXN0aW5nIHBlcm11dGF0aW9ucyB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBkdXBs
aWNhdGUgY29kZS4gRm9yCisgICAgICAgIC8vIGV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAg
IC8vIGluaXRpYWxseTogQGEgIT0gQGIsIEBhID4gQGIKKyAgICAgICAgLy8gICAgICAgICAgICBA
YiAhPSBAYSwgQGIgPCBAYQorICAgICAgICAvLyAgICAgICAgICAgIEBiIDwgQGEsIEBiICE9IEBh
CisgICAgICAgIC8vICAgZmluYWxseTogQGIgIT0gYSwgQGIgPCBAYQorICAgICAgICAvLworICAg
ICAgICAvLyBBbm90aGVyIGV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIGluaXRpYWxs
eTogQGEgPCBAYiwgQGEgIT0gQGIKKyAgICAgICAgLy8gICBmaW5hbGx5OiBAYSAhPSBAYiwgQGEg
PCBAYgorCisgICAgICAgIFJlbGF0aW9uc2hpcCBhID0gKnRoaXM7CisgICAgICAgIFJlbGF0aW9u
c2hpcCBiID0gb3RoZXI7CisgICAgICAgIGJvb2wgbmVlZEZsaXAgPSBmYWxzZTsKKyAgICAgICAg
CisgICAgICAgIC8vIEdldCByaWQgb2YgR3JlYXRlclRoYW4uCisgICAgICAgIGlmIChhLm1fa2lu
ZCA9PSBHcmVhdGVyVGhhbiB8fCBiLm1fa2luZCA9PSBHcmVhdGVyVGhhbikgeworICAgICAgICAg
ICAgYSA9IGEuZmxpcHBlZCgpOworICAgICAgICAgICAgYiA9IGIuZmxpcHBlZCgpOworICAgICAg
ICAgICAgCisgICAgICAgICAgICAvLyBJbiByYXJlIGNhc2VzLCB3ZSBtaWdodCBub3QgYmUgYWJs
ZSB0byBmbGlwLiBKdXN0IGdpdmUgdXAgb24gbGlmZSBpbiB0aG9zZQorICAgICAgICAgICAgLy8g
Y2FzZXMuCisgICAgICAgICAgICBpZiAoIWEgfHwgIWIpCisgICAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgICAgCisgICAgICAgICAgICBuZWVkRmxpcCA9IHRydWU7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgR3JlYXRlclRoYW4sIHRoZW4gaXQg
bWVhbnMgdGhhdCB3ZSBzdGFydGVkIHdpdGggQGEgPCBAYiBhbmQKKyAgICAgICAgICAgIC8vIEBh
ID4gQGIuIFRoYXQncyBwcmV0dHkgbXVjaCBhbHdheXMgYSB0YXV0b2xvZ3k7IHdlIGRvbid0IGF0
dGVtcHQgdG8gZG8gc21hcnQKKyAgICAgICAgICAgIC8vIHRoaW5ncyBmb3IgdGhhdCBjYXNlIGZv
ciBub3cuCisgICAgICAgICAgICBpZiAoYS5tX2tpbmQgPT0gR3JlYXRlclRoYW4gfHwgYi5tX2tp
bmQgPT0gR3JlYXRlclRoYW4pCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEgTGVzc1RoYW4s
IHRoZW4gaXQncyBmaXJzdC4KKyAgICAgICAgaWYgKGIubV9raW5kID09IExlc3NUaGFuKQorICAg
ICAgICAgICAgc3RkOjpzd2FwKGEsIGIpOworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJl
IHRoYXQgaWYgd2UgaGF2ZSBhIE5vdEVxdWFsLCB0aGVuIGl0J3MgZmlyc3QuCisgICAgICAgIGlm
IChiLm1fa2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKKyAg
ICAgICAgCisgICAgICAgIGEubWVyZ2VJbXBsKAorICAgICAgICAgICAgYiwKKyAgICAgICAgICAg
IFsmXSAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgIGlmIChu
ZWVkRmxpcCkgeworICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNo
aXAuZmxpcHBlZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbGF0aW9uc2hpcCkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgZnVuY3RvcihyZWxhdGlvbnNoaXApOworICAgICAgICAgICAgfSk7CisgICAgfQor
ICAgIAorICAgIC8vIFJldHVybnMgYSBudWxsIHJlbGF0aW9uc2hpcCBpZiB0aGUgZmlsdHJhdGlv
biBzaG91bGQgYmUgZXhwcmVzc2VkIGFzIHR3byBkaWZmZXJlbnQKKyAgICAvLyByZWxhdGlvbnNo
aXBzLgorICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXIoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gbWVyZ2lu
ZyByZWxhdGlvbnNoaXBzIG92ZXIgdGhlIHNhbWUgbm9kZXMuCisgICAgICAgIEFTU0VSVChzYW1l
Tm9kZXNBcyhvdGhlcikpOworICAgICAgICAKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKQor
ICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAKKyAgICAgICAgLy8gRnJvbSBoZXJl
IHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgdHdvIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBpZGVudGlj
YWwuIFVzdWFsbHkgd2UgdXNlCisgICAgICAgIC8vIHRoaXMgdG8gYXNzdW1lIHRoYXQgd2UgZGlm
ZmVyZW50IG9mZnNldHMgYW55dGltZSB0aGF0IGV2ZXJ5dGhpbmcgYnV0IHRoZSBvZmZzZXQgaXMK
KyAgICAgICAgLy8gaWRlbnRpY2FsLgorICAgICAgICAKKyAgICAgICAgLy8gV2Ugd2FudCBlcXVh
bGl0eSB0byB0YWtlIHByZWNlZGVudCBvdmVyIGV2ZXJ5dGhpbmcgZWxzZSwgYW5kIHdlIGRvbid0
IHdhbnQgbXVsdGlwbGUKKyAgICAgICAgLy8gaW5kZXBlbmRlbnQgY2xhaW1zIG9mIGVxdWFsaXR5
LiBUaGF0IHdvdWxkIGp1c3QgYmUgYSBjb250cmFkaWN0aW9uLiBXaGVuIGl0IGRvZXMKKyAgICAg
ICAgLy8gaGFwcGVuLCB3ZSB3aWxsIGJlIGNvbnNlcnZhdGl2ZSBpbiB0aGUgc2Vuc2UgdGhhdCB3
ZSB3aWxsIHBpY2sgb25lLgorICAgICAgICBpZiAobV9raW5kID09IEVxdWFsKQorICAgICAgICAg
ICAgcmV0dXJuICp0aGlzOworICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEVxdWFsKQorICAg
ICAgICAgICAgcmV0dXJuIG90aGVyOworICAgICAgICAKKyAgICAgICAgLy8gVXNlZnVsIGhlbHBl
ciBmb3IgZmxpcHBpbmcuCisgICAgICAgIGF1dG8gZmlsdGVyRmxpcHBlZCA9IFsmXSAoKSAtPiBS
ZWxhdGlvbnNoaXAgeworICAgICAgICAgICAgLy8gSWYgd2UgY2Fubm90IGZsaXAsIHRoZW4ganVz
dCBjb25zZXJ2YXRpdmVseSByZXR1cm4gKnRoaXMuCisgICAgICAgICAgICBSZWxhdGlvbnNoaXAg
YSA9IGZsaXBwZWQoKTsKKyAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBiID0gb3RoZXIuZmxpcHBl
ZCgpOworICAgICAgICAgICAgaWYgKCFhIHx8ICFiKQorICAgICAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZXN1bHQgPSBhLmZpbHRlcihiKTsKKyAg
ICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNo
aXAoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5mbGlwcGVkKCk7CisgICAgICAgICAg
ICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2lu
ZCA9PSBOb3RFcXVhbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBOb3RFcXVh
bCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIGRvIHNvbWV0aGluZyBzbWFydGVyIGhl
cmUuIFdlIGNvdWxkIGV2ZW4ga2VlcCBib3RoIE5vdEVxdWFsJ3MuIFdlCisgICAgICAgICAgICAg
ICAgLy8gd291bGQgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBjb3JyZWN0bHkgY29sbGFwc2Vk
IHRoZW0gd2hlbiBtZXJnaW5nLiBCdXQKKyAgICAgICAgICAgICAgICAvLyBmb3Igbm93LCB3ZSBq
dXN0IHBpY2sgb25lIG9mIHRoZW0gYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgorICAgICAgICAgICAg
ICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgaWYgKG90aGVyLm1fa2luZCA9PSBHcmVhdGVyVGhhbikgeworICAgICAgICAgICAgICAgIC8v
IEltcGxlbWVudCB0aGlzIGluIHRlcm1zIG9mIE5vdEVxdWFsLmZpbHRlcihMZXNzVGhhbikuIAor
ICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJGbGlwcGVkKCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIEFTU0VSVChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4p
OworICAgICAgICAgICAgLy8gV2UgaGF2ZSB0d28gY2xhaW1zOgorICAgICAgICAgICAgLy8gICAg
IEBhICE9IEBiICsgQworICAgICAgICAgICAgLy8gICAgIEBhICA8IEBiICsgRAorICAgICAgICAg
ICAgLy8KKyAgICAgICAgICAgIC8vIElmIEMgPj0gRCwgdGhlbiB0aGUgTm90RXF1YWwgaXMgcmVk
dW5kYW50LgorICAgICAgICAgICAgLy8gSWYgQyA8IEQgLSAxLCB0aGVuIHdlIGNvdWxkIGtlZXAg
Ym90aCwgYnV0IGZvciBub3cgd2UganVzdCBrZWVwIHRoZSBMZXNzVGhhbi4KKyAgICAgICAgICAg
IC8vIElmIEMgPT0gRCAtIDEsIHRoZW4gdGhlIExlc3NUaGFuIGNhbiBiZSB0dXJuZWQgaW50bzoK
KyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgQGEgPCBAYiArIEMKKyAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgQyA9PSB0aGlzLm1fb2Zmc2V0LCBEID09
IG90aGVyLm1fb2Zmc2V0LgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobV9vZmZzZXQg
PT0gb3RoZXIubV9vZmZzZXQgLSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNo
aXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgbV9vZmZzZXQpOworICAgICAgICAgICAgCisg
ICAgICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
IChvdGhlci5tX2tpbmQgPT0gTm90RXF1YWwpCisgICAgICAgICAgICByZXR1cm4gb3RoZXIuZmls
dGVyKCp0aGlzKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pIHsK
KyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICBtX2xlZnQsIG1f
cmlnaHQsIExlc3NUaGFuLCBzdGQ6Om1pbihtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG90aGVyLm1fa2lu
ZCA9PSBHcmVhdGVyVGhhbik7CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9v
ZmZzZXQsIC0xKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAg
ICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4ob3RoZXIubV9vZmZzZXQsIDEpKQorICAgICAg
ICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIGlmIChtX29mZnNl
dCAtIDEgPT0gb3RoZXIubV9vZmZzZXQgKyAxKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxh
dGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBFcXVhbCwgbV9vZmZzZXQgLSAxKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBBU1NFUlQobV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgcmV0
dXJuIGZpbHRlckZsaXBwZWQoKTsKKyAgICB9CisgICAgCisgICAgaW50IG1pblZhbHVlT2ZMZWZ0
KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQtPmlzSW50MzJDb25zdGFudCgpKQor
ICAgICAgICAgICAgcmV0dXJuIG1fbGVmdC0+YXNJbnQzMigpOworICAgICAgICAKKyAgICAgICAg
aWYgKG1fa2luZCA9PSBMZXNzVGhhbikKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNf
bGltaXRzPGludD46Om1pbigpOworICAgICAgICAKKyAgICAgICAgaW50IG1pblJpZ2h0VmFsdWU7
CisgICAgICAgIGlmIChtX3JpZ2h0LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIG1p
blJpZ2h0VmFsdWUgPSBtX3JpZ2h0LT5hc0ludDMyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIG1pblJpZ2h0VmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAg
ICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBHcmVhdGVyVGhhbikKKyAgICAgICAgICAgIHJl
dHVybiBjbGFtcGVkU3VtKG1pblJpZ2h0VmFsdWUsIG1fb2Zmc2V0LCAxKTsKKyAgICAgICAgcmV0
dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1ZSwgbV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAg
ICBpbnQgbWF4VmFsdWVPZkxlZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fbGVmdC0+
aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5hc0ludDMyKCk7
CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IEdyZWF0ZXJUaGFuKQorICAgICAgICAg
ICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisgICAgICAgIAorICAg
ICAgICBpbnQgbWF4UmlnaHRWYWx1ZTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50MzJDb25z
dGFudCgpKQorICAgICAgICAgICAgbWF4UmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIoKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF4UmlnaHRWYWx1ZSA9IHN0ZDo6bnVtZXJpY19s
aW1pdHM8aW50Pjo6bWF4KCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NU
aGFuKQorICAgICAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZz
ZXQsIC0xKTsKKyAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZz
ZXQpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIC8vIFRoaXMgcHJpbnRzIG91dCB0aGUgcmVsYXRpb25zaGlwIHdpdGhv
dXQgYW55IHdoaXRlc3BhY2UsIGxpa2UgQHg8QHkrNDIuIFRoaXMKKyAgICAgICAgLy8gb3B0aW1p
emVzIGZvciB0aGUgY2xhcml0eSBvZiBhIGxpc3Qgb2YgcmVsYXRpb25zaGlwcy4gSXQncyBlYXNp
ZXIgdG8gcmVhZCBzb21ldGhpbmcKKyAgICAgICAgLy8gbGlrZSBbQDE8QDIrMywgQDQ9PUA1LTZd
IHRoYW4gaXQgd291bGQgYmUgaWYgdGhlcmUgd2FzIHdoaXRlc3BhY2UgaW5zaWRlIHRoZQorICAg
ICAgICAvLyByZWxhdGlvbnNoaXBzLgorICAgICAgICAKKyAgICAgICAgb3V0LnByaW50KG1fbGVm
dCk7CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46Cisg
ICAgICAgICAgICBvdXQucHJpbnQoIjwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEVxdWFsOgorICAgICAgICAgICAgb3V0LnByaW50KCI9PSIpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgTm90RXF1YWw6CisgICAgICAgICAgICBvdXQucHJpbnQoIiE9Iik7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAg
ICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgb3V0LnByaW50KG1fcmlnaHQpOworICAgICAgICBpZiAobV9vZmZzZXQgPiAwKQorICAgICAg
ICAgICAgb3V0LnByaW50KCIrIiwgbV9vZmZzZXQpOworICAgICAgICBlbHNlIGlmIChtX29mZnNl
dCA8IDApCisgICAgICAgICAgICBvdXQucHJpbnQoIi0iLCAtc3RhdGljX2Nhc3Q8aW50NjRfdD4o
bV9vZmZzZXQpKTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZUltcGwoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlciwg
Y29uc3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghc2FtZU5v
ZGVzQXMob3RoZXIpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLy8g
VGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gZ3VhcmFudGVlIHRoYXQ6CisgICAgICAg
IC8vCisgICAgICAgIC8vIC0gV2UgYXZvaWQgaGF2aW5nIG1vcmUgdGhhbiBvbmUgUmVsYXRpb25z
aGlwIG92ZXIgdGhlIHNhbWUgdHdvIG5vZGVzLiBUaGVyZWZvcmUsIGlmCisgICAgICAgIC8vICAg
dGhlIG1lcmdlIGNvdWxkIGJlIGV4cHJlc3NlZCBhcyB0d28gUmVsYXRpb25zaGlwcywgd2UgcHJl
ZmVyIHRvIGluc3RlYWQgcGljayB0aGUKKyAgICAgICAgLy8gICBsZXNzIHByZWNpc2Ugc2luZ2xl
IFJlbGF0aW9uc2hpcCBmb3JtIGV2ZW4gaWYgdGhhdCBtZWFucyBUT1AuIE9uZSBleGNlcHRpb24g
dG8KKyAgICAgICAgLy8gICB0aGlzIGlzIHRoYXQgd2UgQGEgPT0gQGIgKyBDIGFuZCBAYSA9PSBA
YiArIEQgaW50byBAYSA+IEBiICsgQyAtIDEgYW5kCisgICAgICAgIC8vICAgQGEgPCBAYiArIEQg
KyAxLiAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVu
IHR3byBSZWxhdGlvbnNoaXBzIGlzIGp1c3QgdGhlIG1fb2Zmc2V0LCB0aGVuIHdlIGNyZWF0ZSBh
CisgICAgICAgIC8vICAgUmVsYXRpb25zaGlwIHRoYXQgaGFzIGFuIG9mZnNldCBvZiAtMSwgMCwg
b3IgMS4gVGhpcyBpcyBhbiBlc3NlbnRpYWwgY29udmVyZ2VuY2UKKyAgICAgICAgLy8gICBoYWNr
LiBXZSBuZWVkIC0xIGFuZCAxIHRvIHN1cHBvcnQgPD0gYW5kID49LiBUaGlzIG92ZXJyaWRlcyB0
aGUgcHJldmlvdXMKKyAgICAgICAgLy8gICBleGNlcHRpb24uIEZvciBleGFtcGxlLCB3ZSB3b3Vs
ZG4ndCBhZGQgYSBAYSA8IEBiICsgRCArIDEgcmVsYXRpb25zaGlwIGlmIEQgKyAxCisgICAgICAg
IC8vICAgd2FzIG5vdCBlcXVhbCB0byBvbmUgb2YgLTEsIDAsIDEuCisgICAgICAgIC8vCisgICAg
ICAgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgUmVsYXRpb25zaGlwKCkgdG8gbWVhbiBUT1AuCisgICAg
ICAgIAorICAgICAgICAvLyBJZiB0aGUgcmVsYXRpb25zaGlwcyBhcmUgaWRlbnRpY2FsIHRoZW4g
d2UgaGF2ZSBub3RoaW5nIGxlZnQgdG8gZG8uCisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikg
eworICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZyb20gaGVyZSB3ZSBjYW4gYXNzdW1lIHRoYXQg
dGhlIHR3byByZWxhdGlvbnNoaXBzIGFyZSBub3QgaWRlbnRpY2FsLiBVc3VhbGx5IHdlIHVzZQor
ICAgICAgICAvLyB0aGlzIHRvIGFzc3VtZSB0aGF0IHdlIGRpZmZlcmVudCBvZmZzZXRzIGFueXRp
bWUgdGhhdCBldmVyeXRoaW5nIGJ1dCB0aGUgb2Zmc2V0IGlzCisgICAgICAgIC8vIGlkZW50aWNh
bC4KKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTm90RXF1YWwpIHsKKyAgICAgICAg
ICAgIGlmIChvdGhlci5tX2tpbmQgPT0gTm90RXF1YWwpCisgICAgICAgICAgICAgICAgcmV0dXJu
OyAvLyBEaWZmZXJlbnQgb2Zmc2V0cywgc28gdGF1dG9sb2d5LgorICAgICAgICAgICAgCisgICAg
ICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEVxdWFsKSB7CisgICAgICAgICAgICAgICAgaWYg
KG1fb2Zmc2V0ICE9IG90aGVyLm1fb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNh
eWluZyB0aGF0IHlvdSBtaWdodCBiZSBCIHdoZW4geW91J3ZlIGFscmVhZHkgc2FpZCB0aGF0IHlv
dSdyZSBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAvLyBidXQgQSwgd2hlcmUgQSBhbmQg
QiBhcmUgZGlmZmVyZW50LCBpcyBhIHRhdXRvbG9neS4gWW91IGNvdWxkIGp1c3Qgc2F5CisgICAg
ICAgICAgICAgICAgICAgIC8vIHRoYXQgeW91J3JlIGFueXRoaW5nIGJ1dCBBLgorICAgICAgICAg
ICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgLy8gT3RoZXJ3aXNlLCBzYW1lIG9mZnNldHM6IHdlJ3JlIHNheWluZyB0aGF0IHlvdSdy
ZSBlaXRoZXIgQSBvciB5b3UncmUgbm90CisgICAgICAgICAgICAgICAgLy8gZXF1YWwgdG8gQS4K
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVyLm1fa2luZCA9
PSBMZXNzVGhhbik7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHRoZXNlIGNsYWltcywgYW5kIHdl
J3JlIG1lcmdpbmcgdGhlbToKKyAgICAgICAgICAgIC8vICAgICBAYSAhPSBAYiArIEMKKyAgICAg
ICAgICAgIC8vICAgICBAYSA8IEBiICsgRAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8v
IElmIHdlIGhhdmUgQyA9PSBELCB0aGVuIHRoZSBtZXJnZSBpcyBjbGVhcmx5IGp1c3QgdGhlIE5v
dEVxdWFsLgorICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBDIDwgRCwgdGhlbiB0aGUgbWVyZ2Ug
aXMgYSB0YXV0b2xvZ3kuCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIEMgPiBELCB0aGVuIHdl
IGNvdWxkIGtlZXAgYm90aCBjbGFpbXMsIGJ1dCB3ZSBhcmUgY2hlYXAsIHNvIHdlCisgICAgICAg
ICAgICAvLyBkb24ndC4gV2UganVzdCB1c2UgdGhlIE5vdEVxdWFsLgorICAgICAgICAgICAgCisg
ICAgICAgICAgICBpZiAobV9vZmZzZXQgPCBvdGhlci5tX29mZnNldCkKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5k
ID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IExlc3NUaGFu
KSB7CisgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGF0IG9mZnNldCB0byBzZWxlY3Qg
dG8gbWVyZ2UgdGhlbS4gVGhlIGFwcHJvcHJpYXRlIG9mZnNldHMgYXJlCisgICAgICAgICAgICAg
ICAgLy8gLTEsIDAsIG9yIDEuCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8g
Rmlyc3QgZmlndXJlIG91dCB3aGF0IG9mZnNldCB3ZSdkIGxpa2UgdG8gdXNlLgorICAgICAgICAg
ICAgICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0
KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWV0aGlu
ZyBsaWtlIEBhIDwgQGIgKyAyLiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB1bmRlciB0aGUKKyAg
ICAgICAgICAgICAgICAvLyAtMSwwLDEgcnVsZS4KKyAgICAgICAgICAgICAgICBpZiAoYmVzdE9m
ZnNldCA8PSAxKQorICAgICAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xl
ZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBzdGQ6Om1heChiZXN0T2Zmc2V0LCAtMSkpKTsKKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoZSBvbmx5IHRoaW5nIGxlZnQgaXMgRXF1YWwuIFdl
IHdvdWxkIGhhdmUgZWxpbWluYXRlZCB0aGUgR3JlYXRlclRoYW4ncywgYW5kCisgICAgICAgICAg
ICAvLyBpZiB3ZSBtZXJnZSBMZXNzVGhhbiBhbmQgTm90RXF1YWwsIHRoZSBOb3RFcXVhbCBhbHdh
eXMgY29tZXMgZmlyc3QuCisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChvdGhlci5tX2tpbmQg
PT0gRXF1YWwpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWFs
bHkgaW50ZXJlc3RpbmcgY2FzZS4gV2UgaGF2ZToKKyAgICAgICAgICAgIC8vCisgICAgICAgICAg
ICAvLyAgICAgQGEgPCBAYiArIEMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBhbmQ6
CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgIEBhID09IEBiICsgRAorICAgICAg
ICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSdkIGxpa2UgdG8gcmV0dXJuOgor
ICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBAYSA8IEBiICsgbWF4KEMsIEQgKyAx
KQorICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgYmVzdE9mZnNldCA9IHN0ZDo6bWF4KG1f
b2Zmc2V0LCBvdGhlci5tX29mZnNldCArIDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICAv
LyBXZSBoYXZlIHNvbWV0aGluZyBsaWtlIEBhIDwgQGIgKyAyLiBXZSBjYW4ndCBkbyBpdC4KKyAg
ICAgICAgICAgIGlmIChiZXN0T2Zmc2V0IDw9IDEpCisgICAgICAgICAgICAgICAgZnVuY3RvcihS
ZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgc3RkOjptYXgoYmVzdE9mZnNl
dCwgLTEpKSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBFcXVhbCwgc2luY2Ugd2Ugd291bGQgaGF2
ZSBnb3R0ZW4gcmlkIG9mIHRoZSBHcmVhdGVyVGhhbidzLgorICAgICAgICBSRUxFQVNFX0FTU0VS
VChtX2tpbmQgPT0gRXF1YWwpOworICAgICAgICAKKyAgICAgICAgLy8gV2Ugd291bGQgbmV2ZXIg
c2VlIE5vdEVxdWFsLCBiZWNhdXNlIHRob3NlIGFsd2F5cyBjb21lIGZpcnN0LiBXZSB3b3VsZCBu
ZXZlcgorICAgICAgICAvLyBzZWUgR3JlYXRlclRoYW4sIGJlY2F1c2Ugd2Ugd291bGQgaGF2ZSBl
bGltaW5hdGVkIHRob3NlLiBXZSB3b3VsZCBuZXZlciBzZWUKKyAgICAgICAgLy8gTGVzc1RoYW4s
IGJlY2F1c2UgdGhvc2UgYWx3YXlzIGNvbWUgZmlyc3QuCisgICAgICAgIAorICAgICAgICBSRUxF
QVNFX0FTU0VSVChvdGhlci5tX2tpbmQgPT0gRXF1YWwpOworICAgICAgICAvLyBXZSBoYXZlIEBh
ID09IEBiICsgQyBhbmQgQGEgPT0gQGIgKyBELCB3aGVyZSBDICE9IEQuIFR1cm4gdGhpcyBpbnRv
IHNvbWUKKyAgICAgICAgLy8gaW5lcXVhbGl0eSB0aGF0IGludm9sdmVzIGEgY29uc3RhbnQgdGhh
dCBpcyAtMSwwLDEuCisgICAgICAgIAorICAgICAgICBSZWxhdGlvbnNoaXAgbGVzc1RoYW4oCisg
ICAgICAgICAgICBtX2xlZnQsIG90aGVyLm1fcmlnaHQsIExlc3NUaGFuLAorICAgICAgICAgICAg
c3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KSArIDEpOworICAgICAgICAKKyAgICAg
ICAgaWYgKGxlc3NUaGFuLm9mZnNldCgpID49IC0xICYmIGxlc3NUaGFuLm9mZnNldCgpIDw9IDEp
CisgICAgICAgICAgICBmdW5jdG9yKGxlc3NUaGFuKTsKKyAgICAgICAgCisgICAgICAgIFJlbGF0
aW9uc2hpcCBncmVhdGVyVGhhbigKKyAgICAgICAgICAgIG1fbGVmdCwgb3RoZXIubV9yaWdodCwg
R3JlYXRlclRoYW4sCisgICAgICAgICAgICBzdGQ6Om1pbihtX29mZnNldCwgb3RoZXIubV9vZmZz
ZXQpIC0gMSk7CisgICAgICAgIGlmIChncmVhdGVyVGhhbi5vZmZzZXQoKSA+PSAtMSAmJiBncmVh
dGVyVGhhbi5vZmZzZXQoKSA8PSAxKQorICAgICAgICAgICAgZnVuY3RvcihncmVhdGVyVGhhbik7
CisgICAgfQorICAgIAorICAgIE5vZGUqIG1fbGVmdDsKKyAgICBOb2RlKiBtX3JpZ2h0OworICAg
IEtpbmQgbV9raW5kOworICAgIGludCBtX29mZnNldDsgLy8gVGhpcyBvZmZzZXQgY2FuIGJlIGFy
Yml0cmFyaWx5IGxhcmdlLgorfTsKKwordHlwZWRlZiBIYXNoTWFwPE5vZGUqLCBWZWN0b3I8UmVs
YXRpb25zaGlwPj4gUmVsYXRpb25zaGlwTWFwOworCitjbGFzcyBJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZSA6IHB1YmxpYyBQaGFzZSB7CitwdWJsaWM6CisgICAgSW50ZWdlclJhbmdlT3B0
aW1pemF0aW9uUGhhc2UoR3JhcGgmIGdyYXBoKQorICAgICAgICA6IFBoYXNlKGdyYXBoLCAiaW50
ZWdlciByYW5nZSBvcHRpbWl6YXRpb24iKQorICAgICAgICAsIG1femVybyhudWxscHRyKQorICAg
ICAgICAsIG1fcmVsYXRpb25zaGlwc0F0SGVhZChncmFwaCkKKyAgICAgICAgLCBtX2luc2VydGlv
blNldChncmFwaCkKKyAgICB7CisgICAgfQorICAgIAorICAgIGJvb2wgcnVuKCkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChtX2dyYXBoLm1fZm9ybSA9PSBTU0EpOworICAgICAgICAKKyAgICAgICAg
Ly8gQmVmb3JlIHdlIGRvIGFueXRoaW5nLCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgemVybyBj
b25zdGFudCBhdCB0aGUgdG9wLgorICAgICAgICBmb3IgKE5vZGUqIG5vZGUgOiAqbV9ncmFwaC5i
bG9jaygwKSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmlzSW50MzJDb25zdGFudCgpICYmICFu
b2RlLT5hc0ludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBtX3plcm8gPSBub2RlOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgh
bV96ZXJvKSB7CisgICAgICAgICAgICBtX3plcm8gPSBtX2luc2VydGlvblNldC5pbnNlcnRDb25z
dGFudCgwLCBOb2RlT3JpZ2luKCksIGpzTnVtYmVyKDApKTsKKyAgICAgICAgICAgIG1faW5zZXJ0
aW9uU2V0LmV4ZWN1dGUobV9ncmFwaC5ibG9jaygwKSk7CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBkYXRhTG9nKCJHcmFwaCBiZWZvcmUg
aW50ZWdlciByYW5nZSBvcHRpbWl6YXRpb246XG4iKTsKKyAgICAgICAgICAgIG1fZ3JhcGguZHVt
cCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBCbG9ja0xpc3QgcG9zdE9yZGVyID0g
bV9ncmFwaC5ibG9ja3NJblBvc3RPcmRlcigpOworICAgICAgICAKKyAgICAgICAgYm9vbCBjaGFu
Z2VkID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgIGNoYW5n
ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgcG9zdE9yZGVySW5kZXggPSBw
b3N0T3JkZXIuc2l6ZSgpOyBwb3N0T3JkZXJJbmRleC0tOykgeworICAgICAgICAgICAgICAgIEJh
c2ljQmxvY2sqIGJsb2NrID0gcG9zdE9yZGVyW3Bvc3RPcmRlckluZGV4XTsKKyAgICAgICAgICAg
ICAgICBERkdfQVNTRVJUKAorICAgICAgICAgICAgICAgICAgICBtX2dyYXBoLCBudWxscHRyLAor
ICAgICAgICAgICAgICAgICAgICBibG9jayA9PSBtX2dyYXBoLmJsb2NrKDApIHx8IG1fc2VlbkJs
b2Nrcy5jb250YWlucyhibG9jaykpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbV9y
ZWxhdGlvbnNoaXBzID0gbV9yZWxhdGlvbnNoaXBzQXRIZWFkW2Jsb2NrXTsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4
IDwgYmxvY2stPnNpemUoKTsgKytub2RlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9k
ZSogbm9kZSA9IGJsb2NrLT5hdChub2RlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAo
dmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIkFuYWx5c2lzOiBhdCAi
LCBub2RlLCAiOiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKCkpLCAiXG4iKTsKKyAg
ICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUobm9kZSk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlOgorICAgICAgICAgICAgICAg
IC8vIC0gQnJhbmNoIG9uIGludDMyLgorICAgICAgICAgICAgICAgIC8vIC0gQnJhbmNoIG9uIGNv
bXBhcmUgb3ZlciBpbnQzMidzLgorICAgICAgICAgICAgICAgIE5vZGUqIHRlcm1pbmFsID0gYmxv
Y2stPnRlcm1pbmFsKCk7CisgICAgICAgICAgICAgICAgYm9vbCBhbHJlYWR5TWVyZ2VkID0gZmFs
c2U7CisgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5vcCgpID09IEJyYW5jaCkgeworICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwOworICAgICAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5jaGlsZDEoKS51c2VL
aW5kKCkgPT0gSW50MzJVc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hp
cCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbC0+
Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6Tm90RXF1YWwsIDApOworICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSog
Y29tcGFyZSA9IHRlcm1pbmFsLT5jaGlsZDEoKS5ub2RlKCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBib29sIGludmVydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNv
bXBhcmUtPm9wKCkgPT0gTG9naWNhbE5vdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbXBhcmUgPSBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW52ZXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tcGFyZS0+b3AoKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNl
IENvbXBhcmVTdHJpY3RFcToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxl
c3M6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAg
ICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICAgICAgICAgICAg
ICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKCFjb21wYXJlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCku
bm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlw
OjpFcXVhbCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcCgKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29t
cGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxl
c3NFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVs
YXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+
Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLCAxKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5u
b2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6
OkdyZWF0ZXJUaGFuLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXAo
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5u
b2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIC0xKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREZHX0NSQVNIKG1fZ3Jh
cGgsIGNvbXBhcmUsICJJbnZhbGlkIGNvbXBhcmlzb24gbm9kZSB0eXBlIik7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREZH
X0FTU0VSVChtX2dyYXBoLCBjb21wYXJlLCByZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnQp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlw
LmludmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvclRydWUgPSBtX3JlbGF0aW9uc2hpcHM7CisgICAg
ICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBNYXAgZm9yRmFsc2UgPSBtX3JlbGF0aW9u
c2hpcHM7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIkRlYWxp
bmcgd2l0aCB0cnVlOlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNo
aXAoZm9yVHJ1ZSwgcmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChS
ZWxhdGlvbnNoaXAgaW52ZXJzZSA9IHJlbGF0aW9uc2hpcC5pbnZlcnNlKCkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGF0YUxvZygiRGVhbGluZyB3aXRoIGZhbHNlOlxuIik7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKGZvckZhbHNlLCBpbnZlcnNlKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICAgICAgY2hhbmdlZCB8PSBtZXJnZVRvKGZvclRydWUsIHRlcm1pbmFsLT5icmFu
Y2hEYXRhKCktPnRha2VuLmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQg
fD0gbWVyZ2VUbyhmb3JGYWxzZSwgdGVybWluYWwtPmJyYW5jaERhdGEoKS0+bm90VGFrZW4uYmxv
Y2spOworICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeU1lcmdlZCA9IHRydWU7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBp
ZiAoIWFscmVhZHlNZXJnZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChCYXNpY0Jsb2Nr
KiBzdWNjZXNzb3IgOiBibG9jay0+c3VjY2Vzc29ycygpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgY2hhbmdlZCB8PSBtZXJnZVRvKG1fcmVsYXRpb25zaGlwcywgc3VjY2Vzc29yKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fZ3Jh
cGguYmxvY2tzSW5OYXR1cmFsT3JkZXIoKSkgeworICAgICAgICAgICAgbV9yZWxhdGlvbnNoaXBz
ID0gbV9yZWxhdGlvbnNoaXBzQXRIZWFkW2Jsb2NrXTsKKyAgICAgICAgICAgIGZvciAodW5zaWdu
ZWQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgYmxvY2stPnNpemUoKTsgKytub2RlSW5kZXgp
IHsKKyAgICAgICAgICAgICAgICBOb2RlKiBub2RlID0gYmxvY2stPmF0KG5vZGVJbmRleCk7Cisg
ICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2co
IlRyYW5zZm9ybWF0aW9uOiBhdCAiLCBub2RlLCAiOiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlv
bnNoaXBzKCkpLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBU
aGlzIGVuZHMgdXAgYmVpbmcgcHJldHR5IGF3a3dhcmQgdG8gd3JpdGUgYmVjYXVzZSB3ZSBuZWVk
IHRvIGRlY2lkZSBpZiB3ZQorICAgICAgICAgICAgICAgIC8vIG9wdGltaXplIGJ5IHVzaW5nIHRo
ZSByZWxhdGlvbnNoaXBzIGJlZm9yZSB0aGUgb3BlcmF0aW9uLCBidXQgd2UgbmVlZCB0bworICAg
ICAgICAgICAgICAgIC8vIGNhbGwgZXhlY3V0ZU5vZGUoKSBiZWZvcmUgd2Ugb3B0aW1pemUuCisg
ICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLT5vcCgpKSB7CisgICAgICAgICAgICAgICAgY2Fz
ZSBBcml0aEFkZDogeworICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUtPmlzQmluYXJ5VXNl
S2luZChJbnQzMlVzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKG5vZGUtPmFyaXRoTW9kZSgpICE9IEFyaXRoOjpDaGVja092ZXJmbG93
KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghbm9kZS0+Y2hpbGQyKCktPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBh
dXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkpOwor
ICAgICAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBtX3JlbGF0aW9uc2hpcHMuZW5kKCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgICAgIGludCBtaW5WYWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6
bWluKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhWYWx1ZSA9IHN0ZDo6bnVtZXJpY19s
aW1pdHM8aW50Pjo6bWF4KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
IHJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBt
aW5WYWx1ZSA9IHN0ZDo6bWF4KG1pblZhbHVlLCByZWxhdGlvbnNoaXAubWluVmFsdWVPZkxlZnQo
KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IHN0ZDo6bWluKG1heFZhbHVl
LCByZWxhdGlvbnNoaXAubWF4VmFsdWVPZkxlZnQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChzdW1PdmVyZmxv
d3M8aW50PihtaW5WYWx1ZSwgbm9kZS0+Y2hpbGQyKCktPmFzSW50MzIoKSkgfHwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHN1bU92ZXJmbG93czxpbnQ+KG1heFZhbHVlLCBub2RlLT5jaGlsZDIo
KS0+YXNJbnQzMigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUoYmxvY2stPmF0KG5v
ZGVJbmRleCkpOworICAgICAgICAgICAgICAgICAgICBub2RlLT5zZXRBcml0aE1vZGUoQXJpdGg6
OlVuY2hlY2tlZCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ2hlY2tJbkJvdW5kczogeworICAgICAgICAgICAg
ICAgICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5u
b2RlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBtX3JlbGF0aW9uc2hpcHMu
ZW5kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbm9uTmVnYXRpdmUgPSBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAgICAgYm9vbCBsZXNzVGhhbkxlbmd0aCA9IGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5taW5WYWx1ZU9mTGVmdCgp
ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uTmVnYXRpdmUgPSB0cnVlOwor
ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVs
YXRpb25zaGlwLnJpZ2h0KCkgPT0gbm9kZS0+Y2hpbGQyKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLmtpbmQoKSA9PSBSZWxhdGlvbnNoaXA6OkVxdWFs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlbGF0aW9uc2hpcC5vZmZzZXQo
KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3NUaGFuTGVuZ3RoID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAocmVsYXRpb25zaGlwLmtpbmQoKSA9PSBSZWxhdGlvbnNoaXA6Okxlc3NUaGFu
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlbGF0aW9uc2hpcC5vZmZzZXQo
KSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzVGhhbkxlbmd0aCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChub25OZWdhdGl2
ZSAmJiBsZXNzVGhhbkxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5v
ZGUoYmxvY2stPmF0KG5vZGVJbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+
cmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICBleGVjdXRlTm9kZShibG9jay0+YXQobm9kZUluZGV4KSk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBjaGFu
Z2VkOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGV4ZWN1dGVOb2RlKE5vZGUqIG5vZGUp
CisgICAgeworICAgICAgICBzd2l0Y2ggKG5vZGUtPm9wKCkpIHsKKyAgICAgICAgY2FzZSBDaGVj
a0luQm91bmRzOiB7CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoUmVsYXRpb25zaGlwKG5v
ZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+Y2hpbGQyKCkubm9kZSgpLCBSZWxhdGlvbnNoaXA6
Okxlc3NUaGFuKSk7CisgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoUmVsYXRpb25zaGlwKG5v
ZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAt
MSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICBjYXNlIEFyaXRoQWRkOiB7CisgICAgICAgICAgICAvLyBXZSdyZSBvbmx5IGludGVyZXN0ZWQg
aW4gaW50MzIgYWRkaXRpb25zIGFuZCB3ZSBjdXJyZW50bHkgb25seSBrbm93IGhvdyB0bworICAg
ICAgICAgICAgLy8gaGFuZGxlIHRoZSBub24td3JhcHBpbmcgb25lcy4KKyAgICAgICAgICAgIGlm
ICghbm9kZS0+aXNCaW5hcnlVc2VLaW5kKEludDMyVXNlKSkKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRklYTUU6IFdlIGNvdWxkIGhhbmRsZSB0
aGUgdW5jaGVja2VkIGFyaXRobWV0aWMgY2FzZS4gV2UganVzdCBkbyBpdCBkb24ndCByaWdodAor
ICAgICAgICAgICAgLy8gbm93LgorICAgICAgICAgICAgaWYgKG5vZGUtPmFyaXRoTW9kZSgpICE9
IEFyaXRoOjpDaGVja092ZXJmbG93KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgCisgICAgICAgICAgICAvLyBIYW5kbGUgYWRkOiBAdmFsdWUgKyBjb25zdGFudC4KKyAgICAg
ICAgICAgIGlmICghbm9kZS0+Y2hpbGQyKCktPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbm9k
ZS0+Y2hpbGQyKCktPmFzSW50MzIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2Ug
YWRkIGEgcmVsYXRpb25zaGlwIGZvciBAYWRkID09IEB2YWx1ZSArIGNvbnN0YW50LCBhbmQgdGhl
biB3ZSBjb3B5IHRoZQorICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwcyBmb3IgQHZhbHVlLiBU
aGlzIGdpdmVzIHVzIGEgb25lLWRlZXAgdmlldyBvZiBAdmFsdWUncyBleGlzdGluZworICAgICAg
ICAgICAgLy8gcmVsYXRpb25zaGlwcywgd2hpY2ggbWF0Y2hlcyB0aGUgb25lLWRlZXAgc2VhcmNo
IGluIHNldFJlbGF0aW9uc2hpcCgpLgorICAgICAgICAgICAgCisgICAgICAgICAgICBzZXRSZWxh
dGlvbnNoaXAoCisgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKG5vZGUsIG5vZGUtPmNoaWxk
MSgpLm5vZGUoKSwgUmVsYXRpb25zaGlwOjpFcXVhbCwgb2Zmc2V0KSk7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1fcmVsYXRpb25zaGlwcy5maW5kKG5vZGUtPmNoaWxk
MSgpLm5vZGUoKSk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBtX3JlbGF0aW9uc2hpcHMuZW5k
KCkpIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiB0b0FkZDsKKyAgICAg
ICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkg
eworICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlOgorICAgICAgICAgICAgICAgICAgICAv
LyAgICAgYWRkOiBBcml0aEFkZChAeCwgQykKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIEB4
IG9wIEB5ICsgRAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAv
LyBUaGUgZm9sbG93aW5nIGNlcnRhaW5seSBob2xkczoKKyAgICAgICAgICAgICAgICAgICAgLy8g
ICAgIEB4ID09IEBhZGQgLSBDCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAg
ICAgICAgIC8vIFdoaWNoIGFsbG93cyB1cyB0byBzdWJzdGl0dXRlOgorICAgICAgICAgICAgICAg
ICAgICAvLyAgICAgQGFkZCAtIEMgb3AgQHkgKyBECisgICAgICAgICAgICAgICAgICAgIC8vCisg
ICAgICAgICAgICAgICAgICAgIC8vIEFuZCB0aGVuIGNhcnJ5IHRoZSBDIG92ZXI6CisgICAgICAg
ICAgICAgICAgICAgIC8vICAgICBAYWRkIG9wIEB5ICsgRCArIEMKKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSBy
ZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChuZXdSZWxhdGlvbnNoaXAu
bGVmdCgpID09IG5vZGUtPmNoaWxkMSgpLm5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLnJpZ2h0KCkgPT0gbm9kZSkK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBu
ZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5l
d1JlbGF0aW9uc2hpcC5hZGRUb09mZnNldChvZmZzZXQpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IHRvQWRkKQorICAg
ICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwLCAwKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTm93IHdlIHdhbnQgdG8gZXN0
YWJsaXNoIHRoYXQgYm90aCB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgb2YgdGhlIGFkZGl0aW9u
IGFyZQorICAgICAgICAgICAgLy8gd2l0aGluIGEgcGFydGljdWxhciByYW5nZSBvZiBpbnRlZ2Vy
cy4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAg
ICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSArIDEiIHRoZW4gd2Uga25vdyB0aGF0
IEB2YWx1ZSA8PSBtYXggLSAxLCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAdmFsdWUg
PCBtYXguCisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1heCgpLCAtb2Zmc2V0LCAxKSkgeworICAgICAgICAgICAgICAgICAg
ICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAo
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3pl
cm8sIFJlbGF0aW9uc2hpcDo6TGVzc1RoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAtIG9mZnNldCArIDEpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSArIDEiIHRoZW4g
d2Uga25vdyB0aGF0IEBhZGQgPj0gbWluICsgMSwgaS5lLiB0aGF0CisgICAgICAgICAgICAgICAg
Ly8gQGFkZCA+IG1pbi4KKyAgICAgICAgICAgICAgICBpZiAoIXN1bU92ZXJmbG93czxpbnQ+KHN0
ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCksIG9mZnNldCwgLTEpKSB7CisgICAgICAgICAg
ICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0
aW9uc2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLCBtX3plcm8sIFJlbGF0
aW9uc2hpcDo6R3JlYXRlclRoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpu
dW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9mZnNldCAtIDEpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgIC8vIElm
IHdlIGhhdmUgImFkZDogQHZhbHVlIC0gMSIgdGhlbiB3ZSBrbm93IHRoYXQgQHZhbHVlID49IG1p
biArIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEB2YWx1ZSA+IG1pbi4KKyAgICAg
ICAgICAgICAgICBpZiAoIXN1bU92ZXJmbG93czxpbnQ+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50
Pjo6bWluKCksIG9mZnNldCwgLTEpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0aW9u
c2hpcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBub2RlLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25z
aGlwOjpHcmVhdGVyVGhhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1pbigpICsgb2Zmc2V0IC0gMSksCisgICAgICAgICAgICAgICAgICAg
ICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgLTEgMSIgdGhlbiB3ZSBrbm93IHRoYXQg
QGFkZCA8PSBtYXggLSAxLCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAYWRkIDwgbWF4
LgorICAgICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xp
bWl0czxpbnQ+OjptYXgoKSwgLW9mZnNldCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0
UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpMZXNz
VGhhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGlu
dD46Om1heCgpIC0gb2Zmc2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6IHsKKyAgICAg
ICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAobm9kZSwgbV96ZXJvLCBSZWxhdGlv
bnNoaXA6OkdyZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFVwc2lsb246IHsKKyAgICAgICAgICAgIHNldFJl
bGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAobm9kZS0+Y2hpbGQxKCku
bm9kZSgpLCBub2RlLT5waGkoKSwgUmVsYXRpb25zaGlwOjpFcXVhbCwgMCkpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5j
aGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbV9yZWxhdGlvbnNoaXBz
LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7Cisg
ICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFs
dWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9
IHJlbGF0aW9uc2hpcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUtPnBoaSgpID09IG5l
d1JlbGF0aW9uc2hpcC5yaWdodCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcC5zZXRMZWZ0KG5vZGUtPnBoaSgp
KTsKKyAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0
aW9uc2hpcCA6IHRvQWRkKQorICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAocmVs
YXRpb25zaGlwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hp
cCByZWxhdGlvbnNoaXAsIHVuc2lnbmVkIHRpbWVUb0xpdmUgPSAxKQorICAgIHsKKyAgICAgICAg
c2V0UmVsYXRpb25zaGlwKG1fcmVsYXRpb25zaGlwcywgcmVsYXRpb25zaGlwLCB0aW1lVG9MaXZl
KTsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgIFJlbGF0
aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1
bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIHNldE9uZVNpZGUocmVsYXRp
b25zaGlwTWFwLCByZWxhdGlvbnNoaXAsIHRpbWVUb0xpdmUpOworICAgICAgICBzZXRPbmVTaWRl
KHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25zaGlwLmZsaXBwZWQoKSwgdGltZVRvTGl2ZSk7Cisg
ICAgfQorICAgIAorICAgIHZvaWQgc2V0T25lU2lkZSgKKyAgICAgICAgUmVsYXRpb25zaGlwTWFw
JiByZWxhdGlvbnNoaXBNYXAsIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAsIHVuc2lnbmVkIHRp
bWVUb0xpdmUgPSAxKQorICAgIHsKKyAgICAgICAgaWYgKCFyZWxhdGlvbnNoaXApCisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAg
IGRhdGFMb2coIiAgICBTZXR0aW5nOiAiLCByZWxhdGlvbnNoaXAsICIgKHR0bCA9ICIsIHRpbWVU
b0xpdmUsICIpXG4iKTsKKworICAgICAgICBhdXRvIHJlc3VsdCA9IHJlbGF0aW9uc2hpcE1hcC5h
ZGQoCisgICAgICAgICAgICByZWxhdGlvbnNoaXAubGVmdCgpLCBWZWN0b3I8UmVsYXRpb25zaGlw
PigpKTsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4mIHJlbGF0aW9uc2hpcHMgPSByZXN1
bHQuaXRlcmF0b3ItPnZhbHVlOworICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiB0b0FkZDsK
KyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCYg
b3RoZXJSZWxhdGlvbnNoaXAgOiByZWxhdGlvbnNoaXBzKSB7CisgICAgICAgICAgICBpZiAob3Ro
ZXJSZWxhdGlvbnNoaXAuc2FtZU5vZGVzQXMocmVsYXRpb25zaGlwKSkgeworICAgICAgICAgICAg
ICAgIGlmIChSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPSBvdGhlclJlbGF0aW9uc2hpcC5maWx0ZXIo
cmVsYXRpb25zaGlwKSkgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoZmlsdGVyZWQubGVm
dCgpID09IHJlbGF0aW9uc2hpcC5sZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICBvdGhlclJl
bGF0aW9uc2hpcCA9IGZpbHRlcmVkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
ICAgICBpZiAodGltZVRvTGl2ZSAmJiBvdGhlclJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRp
b25zaGlwOjpFcXVhbCkgeworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAg
ICAgICAgICAgICBkYXRhTG9nKCIgICAgICBDb25zaWRlcmluZzogIiwgb3RoZXJSZWxhdGlvbnNo
aXAsICJcbiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmU6
CisgICAgICAgICAgICAgICAgLy8gICAgIEBhIG9wIEBiICsgQworICAgICAgICAgICAgICAgIC8v
ICAgICBAYSA9PSBAYyArIEQKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8v
IFRoaXMgaW1wbGllczoKKyAgICAgICAgICAgICAgICAvLyAgICAgQGMgKyBEIG9wIEBiICsgQwor
ICAgICAgICAgICAgICAgIC8vICAgICBAYyBvcCBAYiArIEMgLSBECisgICAgICAgICAgICAgICAg
Ly8KKyAgICAgICAgICAgICAgICAvLyBXaGVyZTogQGEgPT0gcmVsYXRpb25zaGlwLmxlZnQoKSwg
QGIgPT0gcmVsYXRpb25zaGlwLnJpZ2h0KCksCisgICAgICAgICAgICAgICAgLy8gQGEgPT0gb3Ro
ZXJSZWxhdGlvbnNoaXAubGVmdCgpLCBAYyA9PSBvdGhlclJlbGF0aW9uc2hpcC5yaWdodCgpLgor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChvdGhlclJlbGF0aW9uc2hpcC5v
ZmZzZXQoKSAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpKSB7CisgICAgICAgICAg
ICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNoaXAucmlnaHQoKSAhPSBvdGhlclJl
bGF0aW9uc2hpcC5yaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdSZWxhdGlv
bnNoaXAuc2V0TGVmdChvdGhlclJlbGF0aW9uc2hpcC5yaWdodCgpKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNoaXAuYWRkVG9PZmZzZXQoLW90aGVyUmVsYXRpb25z
aGlwLm9mZnNldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0FkZC5hcHBlbmQo
bmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFmb3Vu
ZCkKKyAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAg
ICAgIAorICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCBhbm90aGVyUmVsYXRpb25zaGlwIDogdG9B
ZGQpIHsKKyAgICAgICAgICAgIEFTU0VSVCh0aW1lVG9MaXZlKTsKKyAgICAgICAgICAgIHNldE9u
ZVNpZGUocmVsYXRpb25zaGlwTWFwLCBhbm90aGVyUmVsYXRpb25zaGlwLCB0aW1lVG9MaXZlIC0g
MSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYm9vbCBtZXJnZVRvKFJlbGF0aW9uc2hp
cE1hcCYgcmVsYXRpb25zaGlwTWFwLCBCYXNpY0Jsb2NrKiB0YXJnZXQpCisgICAgeworICAgICAg
ICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIGRhdGFMb2coIk1lcmdpbmcgdG8gIiwgcG9pbnRl
ckR1bXAodGFyZ2V0KSwgIjpcbiIpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fc2VlbkJsb2Nr
cy5hZGQodGFyZ2V0KSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBibG9jay4gV2Ug
Y29weSBzdWJqZWN0IHRvIGxpdmVuZXNzIHBydW5pbmcuCisgICAgICAgICAgICBhdXRvIGlzTGl2
ZSA9IFsmXSAoTm9kZSogbm9kZSkgeworICAgICAgICAgICAgICAgIGlmIChub2RlID09IG1femVy
bykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRhcmdldC0+c3NhLT5saXZlQXRIZWFkLmNvbnRhaW5zKG5vZGUpOworICAgICAgICAgICAg
fTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IHJlbGF0aW9u
c2hpcE1hcCkgeworICAgICAgICAgICAgICAgIGlmICghaXNMaXZlKGVudHJ5LmtleSkpCisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHZhbHVlczsKKyAgICAgICAgICAgICAgICBmb3IgKFJl
bGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBlbnRyeS52YWx1ZSkgeworICAgICAgICAgICAgICAg
ICAgICBBU1NFUlQocmVsYXRpb25zaGlwLmxlZnQoKSA9PSBlbnRyeS5rZXkpOworICAgICAgICAg
ICAgICAgICAgICBpZiAoaXNMaXZlKHJlbGF0aW9uc2hpcC5yaWdodCgpKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGF0YUxvZygiICBQcm9wYWdhdGluZyAiLCByZWxhdGlvbnNoaXAsICJcbiIpOworICAgICAgICAg
ICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChyZWxhdGlvbnNoaXApOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICAgICAg
ICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5hZGQoZW50cnkua2V5LCB2YWx1
ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIC8vIE1lcmdlIGJ5IGludGVyc2VjdGluZy4gV2UgaGF2ZSBubyBu
b3Rpb24gb2YgQk9UVE9NLCBzbyB3ZSB1c2UgdGhlIG9taXNzaW9uIG9mCisgICAgICAgIC8vIHJl
bGF0aW9uc2hpcHMgZm9yIGEgcGFpciBvZiBub2RlcyB0byBtZWFuIFRPUC4gVGhlIHJlYXNvbiB3
aHkgd2UgZG9uJ3QgbmVlZCBCT1RUT00KKyAgICAgICAgLy8gaXMgKDEpIHdlIGp1c3Qgb3ZlcmFw
cHJveGltYXRlIGNvbnRyYWRpY3Rpb25zIGFuZCAoMikgYSB2YWx1ZSBuZXZlciBoYXZpbmcgYmVl
bgorICAgICAgICAvLyBhc3NpZ25lZCB3b3VsZCBvbmx5IGhhcHBlbiBpZiB3ZSBoYXZlIG5vdCBw
cm9jZXNzZWQgdGhlIG5vZGUncyBwcmVkZWNlc3Nvci4gV2UKKyAgICAgICAgLy8gc2hvdWxkbid0
IHByb2Nlc3MgYmxvY2tzIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBibG9jaydzIHByZWRl
Y2Vzc29yIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gYXJlIHVzaW5nIFJQTy4KKyAgICAgICAgVmVj
dG9yPE5vZGUqPiB0b1JlbW92ZTsKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAg
ICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XSkgewor
ICAgICAgICAgICAgYXV0byBpdGVyID0gcmVsYXRpb25zaGlwTWFwLmZpbmQoZW50cnkua2V5KTsK
KyAgICAgICAgICAgIGlmIChpdGVyID09IHJlbGF0aW9uc2hpcE1hcC5lbmQoKSkgeworICAgICAg
ICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChlbnRyeS5rZXkpOworICAgICAgICAgICAgICAgIGNo
YW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiB2YWx1ZXM7Cisg
ICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCB0YXJnZXRSZWxhdGlvbnNoaXAgOiBlbnRyeS52
YWx1ZSkgeworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHNvdXJjZVJlbGF0aW9u
c2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQor
ICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICBNZXJnaW5nICIsIHRhcmdldFJlbGF0
aW9uc2hpcCwgIiBhbmQgIiwgc291cmNlUmVsYXRpb25zaGlwLCAiOlxuIik7CisgICAgICAgICAg
ICAgICAgICAgIHRhcmdldFJlbGF0aW9uc2hpcC5tZXJnZSgKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHNvdXJjZVJlbGF0aW9uc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmXSAoUmVs
YXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIg
ICAgR290ICIsIG5ld1JlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdmFsdWVzLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgICAg
ICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAg
c3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICAgICAgICAgICAgaWYg
KGVudHJ5LnZhbHVlID09IHZhbHVlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZXM7CisgICAgICAgICAgICBj
aGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKE5vZGUqIG5vZGUgOiB0b1Jl
bW92ZSkKKyAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdLnJlbW92ZShu
b2RlKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgIH0KKyAgICAKKyAg
ICBWZWN0b3I8UmVsYXRpb25zaGlwPiBzb3J0ZWRSZWxhdGlvbnNoaXBzKCkKKyAgICB7CisgICAg
ICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHJlc3VsdDsKKyAgICAgICAgZm9yIChhdXRvJiBlbnRy
eSA6IG1fcmVsYXRpb25zaGlwcykKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRWZWN0b3IoZW50
cnkudmFsdWUpOworICAgICAgICBzdGQ6OnNvcnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQo
KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIE5vZGUqIG1femVy
bzsKKyAgICBSZWxhdGlvbnNoaXBNYXAgbV9yZWxhdGlvbnNoaXBzOworICAgIEJsb2NrU2V0IG1f
c2VlbkJsb2NrczsKKyAgICBCbG9ja01hcDxSZWxhdGlvbnNoaXBNYXA+IG1fcmVsYXRpb25zaGlw
c0F0SGVhZDsKKyAgICBJbnNlcnRpb25TZXQgbV9pbnNlcnRpb25TZXQ7Cit9OworICAgIAorfSAv
LyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2Jvb2wgcGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXph
dGlvbihHcmFwaCYgZ3JhcGgpCit7CisgICAgU2FtcGxpbmdSZWdpb24gc2FtcGxpbmdSZWdpb24o
IkRGRyBJbnRlZ2VyIFJhbmdlIE9wdGltaXphdGlvbiBQaGFzZSIpOworICAgIHJldHVybiBydW5Q
aGFzZTxJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZT4oZ3JhcGgpOworfQorCit9IH0gLy8g
bmFtZXNwYWNlIEpTQzo6REZHCisKKyNlbmRpZiAvLyBFTkFCTEUoREZHX0pJVCkKKwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFz
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJh
bmdlT3B0aW1pemF0aW9uUGhhc2UuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpZm5kZWYgREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAorI2Rl
ZmluZSBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZV9oCisKKyNpZiBFTkFCTEUoREZH
X0pJVCkKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgeworCitjbGFzcyBHcmFwaDsK
KworLy8gUmVtb3ZlcyBvdmVyZmxvdyBjaGVja3MgYW5kIG91dC1vZi1ib3VuZHMgY2hlY2tzIGJ5
IGRvaW5nIGEgZm9yd2FyZCBmbG93IGFuYWx5c2lzIHRvIHByb3ZlCisvLyBpbmVxdWFsaXRpZXMu
CisKK2Jvb2wgcGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXphdGlvbihHcmFwaCYpOworCit9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6REZHCisKKyNlbmRpZiAvLyBFTkFCTEUoREZHX0pJVCkKKworI2Vu
ZGlmIC8vIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gKKwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQbGFuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4uY3BwCShyZXZpc2lvbiAxODUzNjkpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0
NCw3IEBACiAjaW5jbHVkZSAiREZHRml4dXBQaGFzZS5oIgogI2luY2x1ZGUgIkRGR0dyYXBoU2Fm
ZXBvaW50LmgiCiAjaW5jbHVkZSAiREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuaCIKKyNp
bmNsdWRlICJERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIgogI2luY2x1ZGUgIkRG
R0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuaCIKICNpbmNsdWRlICJERkdKSVRDb21w
aWxlci5oIgogI2luY2x1ZGUgIkRGR0xJQ01QaGFzZS5oIgpAQCAtMzU3LDYgKzM1OCw4IEBAIFBs
YW46OkNvbXBpbGF0aW9uUGF0aCBQbGFuOjpjb21waWxlSW5UaHIKICAgICAgICAgcGVyZm9ybUNv
bnN0YW50SG9pc3RpbmcoZGZnKTsKICAgICAgICAgcGVyZm9ybUdsb2JhbENTRShkZmcpOwogICAg
ICAgICBwZXJmb3JtTGl2ZW5lc3NBbmFseXNpcyhkZmcpOworICAgICAgICBwZXJmb3JtSW50ZWdl
clJhbmdlT3B0aW1pemF0aW9uKGRmZyk7CisgICAgICAgIHBlcmZvcm1MaXZlbmVzc0FuYWx5c2lz
KGRmZyk7CiAgICAgICAgIHBlcmZvcm1DRkEoZGZnKTsKICAgICAgICAgcGVyZm9ybUNvbnN0YW50
Rm9sZGluZyhkZmcpOwogICAgICAgICBwZXJmb3JtQ2xlYW5VcChkZmcpOyAvLyBSZWR1Y2UgdGhl
IGdyYXBoIHNpemUgYSBsb3QuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254673</attachid>
            <date>2015-06-10 13:26:52 -0700</date>
            <delta_ts>2015-06-10 15:37:04 -0700</delta_ts>
            <desc>it&apos;s starting to pass tests</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>64060</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg1Mzk3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBA
CisyMDE1LTA2LTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIGFk
ZHMgYSBwaGFzZSB0aGF0IGRvZXMgZm9yd2FyZCBwcm9wYWdhdGlvbiBvZiBpbnRlZ2VyIGluZXF1
YWxpdGllcy4gVGhpcyBhbGxvd3MgdXMKKyAgICAgICAgdG8gZG8gdGhlIGFsZ2VicmFpYyByZWFz
b25pbmcgd2UgbmVlZCB0byBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcy4g
SXQKKyAgICAgICAgYWxzbyBlbGltaW5hdGVzIG92ZXJmbG93IGNoZWNrcyBvbiBBcml0aEFkZCB3
aXRoIGEgY29uc3RhbnQuCisgICAgICAgIAorICAgICAgICBUaGUgcGhhc2UncyBhbmFseXNpcyBw
cm9kdWNlcyByZXN1bHRzIHRoYXQgYXJlIHBvd2VyZnVsIGVub3VnaCB0byBkbyBzcGVjdWxhdGl2
ZSBib3VuZHMKKyAgICAgICAgY2hlY2sgaG9pc3RpbmcsIGJ1dCB0aGlzIHBoYXNlIGN1cnJlbnRs
eSBvbmx5IGRvZXMgZWxpbWluYXRpb24uIFdlIGNhbiBpbXBsZW1lbnQKKyAgICAgICAgaG9pc3Rp
bmcgbGF0ZXIuCisgICAgICAgIAorICAgICAgICBPbiBwcm9ncmFtcyB0aGF0IGp1c3QgbG9vcCBv
dmVyIGFuIGFycmF5IGxpa2U6CisgICAgICAgIAorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBhcnJheS5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICB0aGluZ3kgKz0gYXJyYXlb
aV0KKyAgICAgICAgCisgICAgICAgIFRoaXMgY2hhbmdlIGlzIGEgNjAlIHNwZWVkLXVwLgorCisg
ICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUudmN4cHJv
ai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogZGZnL0RGR0ludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChKU0M6OkRGRzo6cGVyZm9ybUludGVn
ZXJSYW5nZU9wdGltaXphdGlvbik6CisgICAgICAgICogZGZnL0RGR0ludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlLmg6IEFkZGVkLgorICAgICAgICAqIGRmZy9ERkdQbGFuLmNwcDoKKyAgICAg
ICAgKEpTQzo6REZHOjpQbGFuOjpjb21waWxlSW5UaHJlYWRJbXBsKToKKwogMjAxNS0wNi0wOSAg
Q2hyaXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgogCiAgICAgICAgIEFsbG93IG9uZSBzeW5j
IEdDIHBlciBnY1RpbWVyIGludGVydmFsIG9uIGNyaXRpY2FsIG1lbW9yeSBwcmVzc3VyZSB3YXJu
aW5nCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiAxODUz
NjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29w
eSkKQEAgLTE4MSw2ICsxODEsNyBAQCBzZXQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGRm
Zy9ERkdJblBsYWNlQWJzdHJhY3RTdGF0ZS5jcHAKICAgICBkZmcvREZHSW5zZXJ0T1NSSGludHNG
b3JVcGRhdGUuY3BwCiAgICAgZGZnL0RGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNlLmNwcAor
ICAgIGRmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKICAgICBkZmcvREZH
SW52YWxpZGF0aW9uUG9pbnRJbmplY3Rpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSklUQ29kZS5j
cHAKICAgICBkZmcvREZHSklUQ29tcGlsZXIuY3BwCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFT
Y3JpcHRDb3JlLnZjeHByb2oJKHJldmlzaW9uIDE4NTM2OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2oJKHdvcmtp
bmcgY29weSkKQEAgLTQxOCw2ICs0MTgsNyBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5c
ZGZnXERGR0luUGxhY2VBYnN0cmFjdFN0YXRlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1
ZGU9Ii4uXGRmZ1xERkdJbnNlcnRPU1JIaW50c0ZvclVwZGF0ZS5jcHAiIC8+CiAgICAgPENsQ29t
cGlsZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwIiAv
PgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludGVnZXJSYW5nZU9wdGltaXph
dGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnZh
bGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1
ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4u
XGRmZ1xERkdKSVRDb21waWxlci5jcHAiIC8+CkBAIC0xMTEzLDYgKzExMTQsNyBAQAogICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0luc2VydE9TUkhpbnRzRm9yVXBkYXRlLmgiIC8+
CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW5zZXJ0aW9uU2V0LmgiIC8+CiAg
ICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhh
c2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnRlZ2VyUmFuZ2VP
cHRpbWl6YXRpb25QaGFzZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERG
R0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuaCIgLz4KICAgICA8Q2xJbmNsdWRlIElu
Y2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIu
LlxkZmdcREZHSklUQ29tcGlsZXIuaCIgLz4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCShyZXZpc2lvbiAxODUzNjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlw
dENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYg
KzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBDMTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rp
b24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2
NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3Mg
PSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBG
MUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURl
Zi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBG
ODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkz
NkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJ
MEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBo
YXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBG
ODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFz
ZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFu
Z2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9w
dGltaXphdGlvblBoYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5
MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAgKi87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVE
NzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8q
IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwICovOyB9OwpAQCAtMjE2MSw2ICsyMTYzLDggQEAK
IAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlBIC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9
IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8qIEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVjb2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0
cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0
cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBwYXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0
VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlG
MDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9u
UGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzND
IC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGgg
PSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9
IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMw
MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0gZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFERjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVt
b3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01v
dkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2Uu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNDk5Myw2ICs0OTk3LDggQEAKIAkJ
CQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUgLyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUu
aCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29t
YmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBGMzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJ
bnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5oICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgz
QTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4
OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjExOTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBv
aW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAogCQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAv
KiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYx
NzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENvZGUuY3BwICovLApAQCAtNTYzMCw2ICs1NjM2LDcg
QEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5U
aHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBB
cml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4
NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2
ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZCREUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBp
biBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1
bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJCTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBS
dW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8sCkBAIC03MzcwLDYgKzczNzcsNyBAQAogCQkJCTBG
MkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBKU0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEzNTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2Uu
Y3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5
RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0JvdW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVGMDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQwRjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxs
YmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25Q
aGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJVCkKKworI2luY2x1ZGUgIkRGR0Jsb2NrTWFw
SW5saW5lcy5oIgorI2luY2x1ZGUgIkRGR0dyYXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9u
U2V0LmgiCisjaW5jbHVkZSAiREZHUGhhc2UuaCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJv
cGFnYXRpb25QaGFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIK
KyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZH
IHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgYm9vbCB2ZXJib3NlID0gZmFsc2U7CisKK2ludDY0
X3QgY2xhbXBlZFN1bUltcGwoKSB7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4u
IEFyZ3M+CitpbnQ2NF90IGNsYW1wZWRTdW1JbXBsKGludCBsZWZ0LCBBcmdzLi4uIGFyZ3MpCit7
CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGxlZnQpICsgY2xhbXBlZFN1bUltcGwo
YXJncy4uLik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitpbnQgY2xhbXBlZFN1
bShBcmdzLi4uIGFyZ3MpCit7CisgICAgaW50NjRfdCByZXN1bHQgPSBjbGFtcGVkU3VtSW1wbChh
cmdzLi4uKTsKKyAgICByZXR1cm4gc3RkOjptaW4oCisgICAgICAgIHN0YXRpY19jYXN0PGludDY0
X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpLAorICAgICAgICBzdGQ6Om1heCgK
KyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50
Pjo6bWluKCkpLAorICAgICAgICAgICAgcmVzdWx0KSk7Cit9CisKK2NsYXNzIFJlbGF0aW9uc2hp
cCB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgTGVzc1RoYW4sCisgICAgICAg
IEVxdWFsLAorICAgICAgICBOb3RFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4KKyAgICB9Owor
ICAgIAorICAgIHN0YXRpYyBLaW5kIGZsaXBwZWQoS2luZCBraW5kKQorICAgIHsKKyAgICAgICAg
c3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICByZXR1
cm4gR3JlYXRlclRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICByZXR1cm4g
RXF1YWw7CisgICAgICAgIGNhc2UgTm90RXF1YWw6CisgICAgICAgICAgICByZXR1cm4gTm90RXF1
YWw7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICByZXR1cm4gTGVzc1Ro
YW47CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgcmV0dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAg
ICAgIDogbV9sZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxscHRyKQorICAgICAg
ICAsIG1fa2luZChFcXVhbCkKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgIHsKKyAgICB9Cisg
ICAgCisgICAgUmVsYXRpb25zaGlwKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQs
IGludCBvZmZzZXQgPSAwKQorICAgICAgICA6IG1fbGVmdChsZWZ0KQorICAgICAgICAsIG1fcmln
aHQocmlnaHQpCisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwgbV9vZmZzZXQob2Zm
c2V0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0KTsKKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQobV9yaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCAhPSBt
X3JpZ2h0KTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIFJlbGF0aW9uc2hpcCBzYWZlQ3JlYXRl
KE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAg
IHsKKyAgICAgICAgaWYgKCFsZWZ0IHx8ICFyaWdodCB8fCBsZWZ0ID09IHJpZ2h0KQorICAgICAg
ICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlw
KGxlZnQsIHJpZ2h0LCBraW5kLCBvZmZzZXQpOworICAgIH0KKyAgICAKKyAgICB0eXBlZGVmIHZv
aWQqIChSZWxhdGlvbnNoaXA6OipVbnNwZWNpZmllZEJvb2xUeXBlKTsKKworICAgIG9wZXJhdG9y
IFVuc3BlY2lmaWVkQm9vbFR5cGUqKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xl
ZnQgPyByZWludGVycHJldF9jYXN0PFVuc3BlY2lmaWVkQm9vbFR5cGUqPigxKSA6IDA7CisgICAg
fQorICAgIAorICAgIE5vZGUqIGxlZnQoKSBjb25zdCB7IHJldHVybiBtX2xlZnQ7IH0KKyAgICBO
b2RlKiByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcmlnaHQ7IH0KKyAgICBLaW5kIGtpbmQoKSBj
b25zdCB7IHJldHVybiBtX2tpbmQ7IH0KKyAgICBpbnQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4g
bV9vZmZzZXQ7IH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgZmxpcHBlZCgpIGNvbnN0CisgICAg
eworICAgICAgICBpZiAoISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgp
OworICAgICAgICAKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIFJlbGF0aW9uc2hpcCgp
IGlmIC1tX29mZnNldCBvdmVyZmxvd3MuIEZvciBleGFtcGxlOgorICAgICAgICAvLworICAgICAg
ICAvLyAgICAgQGEgPiBAYiAtIDIqKjMxCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHdlIGZs
aXAgaXQgd2UgZ2V0OgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQGIgPCBAYSArIDIqKjMx
CisgICAgICAgIC8vCisgICAgICAgIC8vIEV4Y2VwdCB0aGF0IHRoZSBzaWduIGdldHMgZmxpcHBl
ZCBzaW5jZSBpdCdzIElOVF9NSU46CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYiA8IEBh
IC0gMioqMzEKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQW5kIHRoYXQgbWFrZXMgbm8gc2Vuc2Uu
IFRvIHNlZSBob3cgbGl0dGxlIHNlbnNlIGl0IG1ha2VzLCBjb25zaWRlcjoKKyAgICAgICAgLy8K
KyAgICAgICAgLy8gICAgIEBhID4gQHplcm8gLSAyKiozMQorICAgICAgICAvLworICAgICAgICAv
LyBXZSB3b3VsZCBmbGlwIGl0IHRvIG1lYW46CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBA
emVybyA8IEBhIC0gMioqMzEKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hpY2ggaXMgYWJzdXJk
LgorICAgICAgICAKKyAgICAgICAgaWYgKG1fb2Zmc2V0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8
aW50Pjo6bWluKCkpCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAg
IAorICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fcmlnaHQsIG1fbGVmdCwgZmxpcHBlZCht
X2tpbmQpLCAtbV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgaW52ZXJz
ZSgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoISp0aGlzKQorICAgICAgICAgICAgcmV0dXJu
ICp0aGlzOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2Fz
ZSBFcXVhbDoKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0
LCBOb3RFcXVhbCwgbV9vZmZzZXQpOworICAgICAgICBjYXNlIE5vdEVxdWFsOgorICAgICAgICAg
ICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCk7
CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGlu
dD4obV9vZmZzZXQsIC0xKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7
CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgR3JlYXRl
clRoYW4sIG1fb2Zmc2V0IC0gMSk7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAg
ICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIDEpKQorICAgICAgICAgICAgICAg
IHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAo
bV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAg
CisgICAgYm9vbCBpc0Nhbm9uaWNhbCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVmdCA8IG1fcmlnaHQ7
IH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgY2Fub25pY2FsKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChpc0Nhbm9uaWNhbCgpKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAg
ICByZXR1cm4gZmxpcHBlZCgpOworICAgIH0KKyAgICAKKyAgICBib29sIHNhbWVOb2Rlc0FzKGNv
bnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9s
ZWZ0ID09IG90aGVyLm1fbGVmdAorICAgICAgICAgICAgJiYgbV9yaWdodCA9PSBvdGhlci5tX3Jp
Z2h0OworICAgIH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVsYXRpb25zaGlw
JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzYW1lTm9kZXNBcyhvdGhlcikK
KyAgICAgICAgICAgICYmIG1fa2luZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1f
b2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0OworICAgIH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9y
IT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcjwoY29u
c3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQg
IT0gb3RoZXIubV9sZWZ0KQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdCA8IG90aGVyLm1fbGVm
dDsKKyAgICAgICAgaWYgKG1fcmlnaHQgIT0gb3RoZXIubV9yaWdodCkKKyAgICAgICAgICAgIHJl
dHVybiBtX3JpZ2h0IDwgb3RoZXIubV9yaWdodDsKKyAgICAgICAgaWYgKG1fa2luZCAhPSBvdGhl
ci5tX2tpbmQpCisgICAgICAgICAgICByZXR1cm4gbV9raW5kIDwgb3RoZXIubV9raW5kOworICAg
ICAgICByZXR1cm4gbV9vZmZzZXQgPCBvdGhlci5tX29mZnNldDsKKyAgICB9CisgICAgCisgICAg
Ly8gSWYgcG9zc2libGUsIHJldHVybnMgYSBmb3JtIG9mIHRoaXMgcmVsYXRpb25zaGlwIHdoZXJl
IHRoZSBnaXZlbiBub2RlIGlzIHRoZSBsZWZ0CisgICAgLy8gc2lkZS4gUmV0dXJucyBhIG51bGwg
cmVsYXRpb25zaGlwIGlmIHRoaXMgcmVsYXRpb25zaGlwIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJv
dXQgdGhpcworICAgIC8vIG5vZGUuCisgICAgUmVsYXRpb25zaGlwIGZvck5vZGUoTm9kZSogbm9k
ZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgPT0gbm9kZSkKKyAgICAgICAgICAg
IHJldHVybiAqdGhpczsKKyAgICAgICAgaWYgKG1fcmlnaHQgPT0gbm9kZSkKKyAgICAgICAgICAg
IHJldHVybiBmbGlwcGVkKCk7CisgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICB9
CisgICAgCisgICAgdm9pZCBzZXRMZWZ0KE5vZGUqIGxlZnQpCisgICAgeworICAgICAgICBSRUxF
QVNFX0FTU0VSVChsZWZ0ICE9IG1fcmlnaHQpOworICAgICAgICBtX2xlZnQgPSBsZWZ0OworICAg
IH0KKyAgICBib29sIGFkZFRvT2Zmc2V0KGludCBvZmZzZXQpCisgICAgeworICAgICAgICBpZiAo
c3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIG9mZnNldCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIG1fb2Zmc2V0ICs9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIAorICAgIC8vIEF0dGVtcHRzIHRvIGNhbGwgZnVuY3RvcigpIHdpdGggemVy
bywgb25lLCBvciB0d28gcmVsYXRpb25zaGlwcyB0aGF0IHN1bW1hcml6ZSB0aGUKKyAgICAvLyB1
bmlvbiBvZiB0aGlzIHJlbGF0aW9uc2hpcCBhbmQgdGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gVGhl
IHJlbGF0aW9uc2hpcHMgcGFzc2VkIHRvIHRoZQorICAgIC8vIGZ1bmN0b3IgYXJlIHJlbGF0ZWQg
YnkgaW50ZXJzZWN0aW9uLiBOb3QgY2FsbGluZyB0aGUgZnVuY3RvciBpbXBsaWVzIFRPUC4gRWFj
aCBjYWxsIHRvCisgICAgLy8gdGhlIGZ1bmN0b3IgY29uc3RyYWlucyB0aGUgc3RhdGUgc3BhY2Uu
IEZvciBleGFtcGxlIGlmIHRoaXMgY2FsbHMgdGhlIGZ1bmN0b3Igd2l0aCByZWwxLAorICAgIC8v
IHJlbDIsIC4uLiwgcmVsTiwgeW91IHNob3VsZCByZWFkIGl0IGFzOgorICAgIC8vCisgICAgLy8g
ICAgIFRPUCAmJiByZWwxICYmIHJlbDIgJiYgLi4uICYmIHJlbE4KKyAgICAvLworICAgIC8vIFRo
ZSAiVE9QIiBpcyB0aGVyZSBpbiBjYXNlIHRoYXQgdGhlIGZ1bmN0b3IgaXNuJ3QgY2FsbGVkLgor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZShjb25zdCBSZWxh
dGlvbnNoaXAmIG90aGVyLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSBjb25zdAorICAgIHsKKyAg
ICAgICAgaWYgKCFzYW1lTm9kZXNBcyhvdGhlcikpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIAorICAgICAgICAvLyBIYW5kbGUgdGhlIHN1cGVyIG9idmlvdXMgY2FzZSBmaXJzdC4KKyAg
ICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVGhp
cyBkb2VzIHNvbWUgaW50ZXJlc3RpbmcgcGVybXV0YXRpb25zIHRvIHJlZHVjZSB0aGUgYW1vdW50
IG9mIGR1cGxpY2F0ZSBjb2RlLiBGb3IKKyAgICAgICAgLy8gZXhhbXBsZToKKyAgICAgICAgLy8K
KyAgICAgICAgLy8gaW5pdGlhbGx5OiBAYSAhPSBAYiwgQGEgPiBAYgorICAgICAgICAvLyAgICAg
ICAgICAgIEBiICE9IEBhLCBAYiA8IEBhCisgICAgICAgIC8vICAgICAgICAgICAgQGIgPCBAYSwg
QGIgIT0gQGEKKyAgICAgICAgLy8gICBmaW5hbGx5OiBAYiAhPSBhLCBAYiA8IEBhCisgICAgICAg
IC8vCisgICAgICAgIC8vIEFub3RoZXIgZXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8g
aW5pdGlhbGx5OiBAYSA8IEBiLCBAYSAhPSBAYgorICAgICAgICAvLyAgIGZpbmFsbHk6IEBhICE9
IEBiLCBAYSA8IEBiCisKKyAgICAgICAgUmVsYXRpb25zaGlwIGEgPSAqdGhpczsKKyAgICAgICAg
UmVsYXRpb25zaGlwIGIgPSBvdGhlcjsKKyAgICAgICAgYm9vbCBuZWVkRmxpcCA9IGZhbHNlOwor
ICAgICAgICAKKyAgICAgICAgLy8gR2V0IHJpZCBvZiBHcmVhdGVyVGhhbi4KKyAgICAgICAgaWYg
KGEubV9raW5kID09IEdyZWF0ZXJUaGFuIHx8IGIubV9raW5kID09IEdyZWF0ZXJUaGFuKSB7Cisg
ICAgICAgICAgICBhID0gYS5mbGlwcGVkKCk7CisgICAgICAgICAgICBiID0gYi5mbGlwcGVkKCk7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEluIHJhcmUgY2FzZXMsIHdlIG1pZ2h0IG5v
dCBiZSBhYmxlIHRvIGZsaXAuIEp1c3QgZ2l2ZSB1cCBvbiBsaWZlIGluIHRob3NlCisgICAgICAg
ICAgICAvLyBjYXNlcy4KKyAgICAgICAgICAgIGlmICghYSB8fCAhYikKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5lZWRGbGlwID0gdHJ1ZTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBHcmVhdGVyVGhhbiwg
dGhlbiBpdCBtZWFucyB0aGF0IHdlIHN0YXJ0ZWQgd2l0aCBAYSA8IEBiIGFuZAorICAgICAgICAg
ICAgLy8gQGEgPiBAYi4gVGhhdCdzIHByZXR0eSBtdWNoIGFsd2F5cyBhIHRhdXRvbG9neTsgd2Ug
ZG9uJ3QgYXR0ZW1wdCB0byBkbyBzbWFydAorICAgICAgICAgICAgLy8gdGhpbmdzIGZvciB0aGF0
IGNhc2UgZm9yIG5vdy4KKyAgICAgICAgICAgIGlmIChhLm1fa2luZCA9PSBHcmVhdGVyVGhhbiB8
fCBiLm1fa2luZCA9PSBHcmVhdGVyVGhhbikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYSBM
ZXNzVGhhbiwgdGhlbiBpdCdzIGZpcnN0LgorICAgICAgICBpZiAoYi5tX2tpbmQgPT0gTGVzc1Ro
YW4pCisgICAgICAgICAgICBzdGQ6OnN3YXAoYSwgYik7CisgICAgICAgIAorICAgICAgICAvLyBN
YWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEgTm90RXF1YWwsIHRoZW4gaXQncyBmaXJzdC4KKyAg
ICAgICAgaWYgKGIubV9raW5kID09IE5vdEVxdWFsKQorICAgICAgICAgICAgc3RkOjpzd2FwKGEs
IGIpOworICAgICAgICAKKyAgICAgICAgYS5tZXJnZUltcGwoCisgICAgICAgICAgICBiLAorICAg
ICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICAg
ICAgaWYgKG5lZWRGbGlwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IHJl
bGF0aW9uc2hpcC5mbGlwcGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVsYXRpb25z
aGlwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBmdW5jdG9yKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICB9KTsK
KyAgICB9CisgICAgCisgICAgLy8gQXR0ZW1wdHMgdG8gY29uc3RydWN0IG9uZSBSZWxhdGlvbnNo
aXAgdGhhdCBhZGVxdWF0ZWx5IHN1bW1hcml6ZXMgdGhlIGludGVyc2VjdGlvbiBvZgorICAgIC8v
IHRoaXMgYW5kIG90aGVyLiBSZXR1cm5zIGEgbnVsbCByZWxhdGlvbnNoaXAgaWYgdGhlIGZpbHRy
YXRpb24gc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyB0d28KKyAgICAvLyBkaWZmZXJlbnQgcmVsYXRp
b25zaGlwcy4gUmV0dXJuaW5nIG51bGwgaXMgYWx3YXlzIHNhZmUgYmVjYXVzZSByZWxhdGlvbnNo
aXAgbGlzdHMgaW4KKyAgICAvLyB0aGlzIHBoYXNlIGFsd2F5cyBpbXBseSBpbnRlcnNlY3Rpb24u
IFNvLCB5b3UgY291bGQgc291bmRseSBza2lwIGNhbGxpbmcgdGhpcyBtZXRob2QgYW5kCisgICAg
Ly8ganVzdCBwdXQgYm90aCByZWxhdGlvbnNoaXBzIGludG8gdGhlIGxpc3QuIEJ1dCwgdGhhdCBj
b3VsZCBsZWFkIHRoZSBmaXhwb2ludCB0byBkaXZlcmdlLgorICAgIC8vIEhlbmNlIHRoaXMgd2ls
bCBhdHRlbXB0IHRvIGNvbWJpbmUgdGhlIHR3byByZWxhdGlvbnNoaXBzIGludG8gb25lIGFzIGEg
Y29udmVyZ2VuY2UgaGFjay4KKyAgICAvLyBJbiBzb21lIGNhc2VzLCBpdCB3aWxsIGRvIHNvbWV0
aGluZyBjb25zZXJ2YXRpdmUuIEl0J3MgYWx3YXlzIHNhZmUgZm9yIHRoaXMgdG8gcmV0dXJuCisg
ICAgLy8gKnRoaXMsIG9yIHRvIHJldHVybiBvdGhlci4gSXQnbGwgZG8gdGhhdCBzb21ldGltZXMs
IG1haW5seSB0byBhY2NlbGVyYXRlIGNvbnZlcmdlbmNlIGZvcgorICAgIC8vIHRoaW5ncyB0aGF0
IHdlIGRvbid0IHRoaW5rIGFyZSBpbXBvcnRhbnQgZW5vdWdoIHRvIHNsb3cgZG93biB0aGUgYW5h
bHlzaXMuCisgICAgUmVsYXRpb25zaGlwIGZpbHRlcihjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVy
KSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBtZXJn
aW5nIHJlbGF0aW9uc2hpcHMgb3ZlciB0aGUgc2FtZSBub2Rlcy4KKyAgICAgICAgQVNTRVJUKHNh
bWVOb2Rlc0FzKG90aGVyKSk7CisgICAgICAgIAorICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIp
CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIAorICAgICAgICAvLyBGcm9tIGhl
cmUgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0d28gcmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50
aWNhbC4gVXN1YWxseSB3ZSB1c2UKKyAgICAgICAgLy8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBk
aWZmZXJlbnQgb2Zmc2V0cyBhbnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBp
cworICAgICAgICAvLyBpZGVudGljYWwuCisgICAgICAgIAorICAgICAgICAvLyBXZSB3YW50IGVx
dWFsaXR5IHRvIHRha2UgcHJlY2VkZW50IG92ZXIgZXZlcnl0aGluZyBlbHNlLCBhbmQgd2UgZG9u
J3Qgd2FudCBtdWx0aXBsZQorICAgICAgICAvLyBpbmRlcGVuZGVudCBjbGFpbXMgb2YgZXF1YWxp
dHkuIFRoYXQgd291bGQganVzdCBiZSBhIGNvbnRyYWRpY3Rpb24uIFdoZW4gaXQgZG9lcworICAg
ICAgICAvLyBoYXBwZW4sIHdlIHdpbGwgYmUgY29uc2VydmF0aXZlIGluIHRoZSBzZW5zZSB0aGF0
IHdlIHdpbGwgcGljayBvbmUuCisgICAgICAgIGlmIChtX2tpbmQgPT0gRXF1YWwpCisgICAgICAg
ICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisg
ICAgICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgICAgIAorICAgICAgICAvLyBVc2VmdWwgaGVs
cGVyIGZvciBmbGlwcGluZy4KKyAgICAgICAgYXV0byBmaWx0ZXJGbGlwcGVkID0gWyZdICgpIC0+
IFJlbGF0aW9uc2hpcCB7CisgICAgICAgICAgICAvLyBJZiB3ZSBjYW5ub3QgZmxpcCwgdGhlbiBq
dXN0IGNvbnNlcnZhdGl2ZWx5IHJldHVybiAqdGhpcy4KKyAgICAgICAgICAgIFJlbGF0aW9uc2hp
cCBhID0gZmxpcHBlZCgpOworICAgICAgICAgICAgUmVsYXRpb25zaGlwIGIgPSBvdGhlci5mbGlw
cGVkKCk7CisgICAgICAgICAgICBpZiAoIWEgfHwgIWIpCisgICAgICAgICAgICAgICAgcmV0dXJu
ICp0aGlzOworICAgICAgICAgICAgUmVsYXRpb25zaGlwIHJlc3VsdCA9IGEuZmlsdGVyKGIpOwor
ICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9u
c2hpcCgpOworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmZsaXBwZWQoKTsKKyAgICAgICAg
ICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07CisgICAgICAgIAorICAgICAgICBpZiAobV9r
aW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IE5vdEVx
dWFsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgY291bGQgZG8gc29tZXRoaW5nIHNtYXJ0ZXIg
aGVyZS4gV2UgY291bGQgZXZlbiBrZWVwIGJvdGggTm90RXF1YWwncy4gV2UKKyAgICAgICAgICAg
ICAgICAvLyB3b3VsZCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNvcnJlY3RseSBjb2xsYXBz
ZWQgdGhlbSB3aGVuIG1lcmdpbmcuIEJ1dAorICAgICAgICAgICAgICAgIC8vIGZvciBub3csIHdl
IGp1c3QgcGljayBvbmUgb2YgdGhlbSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisgICAgICAgICAg
ICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
ICAgICBpZiAob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKSB7CisgICAgICAgICAgICAgICAg
Ly8gSW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgTm90RXF1YWwuZmlsdGVyKExlc3NUaGFuKS4g
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckZsaXBwZWQoKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG90aGVyLm1fa2luZCA9PSBMZXNzVGhh
bik7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHR3byBjbGFpbXM6CisgICAgICAgICAgICAvLyAg
ICAgQGEgIT0gQGIgKyBDCisgICAgICAgICAgICAvLyAgICAgQGEgIDwgQGIgKyBECisgICAgICAg
ICAgICAvLworICAgICAgICAgICAgLy8gSWYgQyA+PSBELCB0aGVuIHRoZSBOb3RFcXVhbCBpcyBy
ZWR1bmRhbnQuCisgICAgICAgICAgICAvLyBJZiBDIDwgRCAtIDEsIHRoZW4gd2UgY291bGQga2Vl
cCBib3RoLCBidXQgZm9yIG5vdyB3ZSBqdXN0IGtlZXAgdGhlIExlc3NUaGFuLgorICAgICAgICAg
ICAgLy8gSWYgQyA9PSBEIC0gMSwgdGhlbiB0aGUgTGVzc1RoYW4gY2FuIGJlIHR1cm5lZCBpbnRv
OgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBAYSA8IEBiICsgQworICAgICAg
ICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBDID09IHRoaXMubV9vZmZzZXQsIEQg
PT0gb3RoZXIubV9vZmZzZXQuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChtX29mZnNl
dCA9PSBvdGhlci5tX29mZnNldCAtIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9u
c2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBtX29mZnNldCk7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAg
aWYgKG90aGVyLm1fa2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAgIHJldHVybiBvdGhlci5m
aWx0ZXIoKnRoaXMpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikg
eworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAg
ICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgIG1fbGVmdCwg
bV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWluKG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCkpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBBU1NFUlQob3RoZXIubV9r
aW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50Piht
X29mZnNldCwgLTEpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAg
ICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihvdGhlci5tX29mZnNldCwgMSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgaWYgKG1fb2Zm
c2V0IC0gMSA9PSBvdGhlci5tX29mZnNldCArIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJl
bGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCAtIDEpOworICAgICAg
ICAgICAgCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gR3JlYXRlclRoYW4pOworICAgICAgICBy
ZXR1cm4gZmlsdGVyRmxpcHBlZCgpOworICAgIH0KKyAgICAKKyAgICBpbnQgbWluVmFsdWVPZkxl
ZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fbGVmdC0+aXNJbnQzMkNvbnN0YW50KCkp
CisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5hc0ludDMyKCk7CisgICAgICAgIAorICAgICAg
ICBpZiAobV9raW5kID09IExlc3NUaGFuKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJp
Y19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIAorICAgICAgICBpbnQgbWluUmlnaHRWYWx1
ZTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAg
bWluUmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgbWluUmlnaHRWYWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCk7Cisg
ICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IEdyZWF0ZXJUaGFuKQorICAgICAgICAgICAg
cmV0dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1ZSwgbV9vZmZzZXQsIDEpOworICAgICAgICBy
ZXR1cm4gY2xhbXBlZFN1bShtaW5SaWdodFZhbHVlLCBtX29mZnNldCk7CisgICAgfQorICAgIAor
ICAgIGludCBtYXhWYWx1ZU9mTGVmdCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9sZWZ0
LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBtX2xlZnQtPmFzSW50MzIo
KTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gR3JlYXRlclRoYW4pCisgICAgICAg
ICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgCisg
ICAgICAgIGludCBtYXhSaWdodFZhbHVlOworICAgICAgICBpZiAobV9yaWdodC0+aXNJbnQzMkNv
bnN0YW50KCkpCisgICAgICAgICAgICBtYXhSaWdodFZhbHVlID0gbV9yaWdodC0+YXNJbnQzMigp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXhSaWdodFZhbHVlID0gc3RkOjpudW1lcmlj
X2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVz
c1RoYW4pCisgICAgICAgICAgICByZXR1cm4gY2xhbXBlZFN1bShtYXhSaWdodFZhbHVlLCBtX29m
ZnNldCwgLTEpOworICAgICAgICByZXR1cm4gY2xhbXBlZFN1bShtYXhSaWdodFZhbHVlLCBtX29m
ZnNldCk7CisgICAgfQorICAgIAorICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25z
dAorICAgIHsKKyAgICAgICAgLy8gVGhpcyBwcmludHMgb3V0IHRoZSByZWxhdGlvbnNoaXAgd2l0
aG91dCBhbnkgd2hpdGVzcGFjZSwgbGlrZSBAeDxAeSs0Mi4gVGhpcworICAgICAgICAvLyBvcHRp
bWl6ZXMgZm9yIHRoZSBjbGFyaXR5IG9mIGEgbGlzdCBvZiByZWxhdGlvbnNoaXBzLiBJdCdzIGVh
c2llciB0byByZWFkIHNvbWV0aGluZworICAgICAgICAvLyBsaWtlIFtAMTxAMiszLCBAND09QDUt
Nl0gdGhhbiBpdCB3b3VsZCBiZSBpZiB0aGVyZSB3YXMgd2hpdGVzcGFjZSBpbnNpZGUgdGhlCisg
ICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuCisgICAgICAgIAorICAgICAgICBvdXQucHJpbnQobV9s
ZWZ0KTsKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBMZXNzVGhhbjoK
KyAgICAgICAgICAgIG91dC5wcmludCgiPCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgRXF1YWw6CisgICAgICAgICAgICBvdXQucHJpbnQoIj09Iik7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBOb3RFcXVhbDoKKyAgICAgICAgICAgIG91dC5wcmludCgiIT0i
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgICAg
ICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBvdXQucHJpbnQobV9yaWdodCk7CisgICAgICAgIGlmIChtX29mZnNldCA+IDApCisgICAg
ICAgICAgICBvdXQucHJpbnQoIisiLCBtX29mZnNldCk7CisgICAgICAgIGVsc2UgaWYgKG1fb2Zm
c2V0IDwgMCkKKyAgICAgICAgICAgIG91dC5wcmludCgiLSIsIC1zdGF0aWNfY2FzdDxpbnQ2NF90
PihtX29mZnNldCkpOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5h
bWUgRnVuY3Rvcj4KKyAgICB2b2lkIG1lcmdlSW1wbChjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVy
LCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKHNh
bWVOb2Rlc0FzKG90aGVyKSk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgcHVycG9zZSBvZiB0
aGlzIG1ldGhvZCBpcyB0byBndWFyYW50ZWUgdGhhdDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8g
LSBXZSBhdm9pZCBoYXZpbmcgbW9yZSB0aGFuIG9uZSBSZWxhdGlvbnNoaXAgb3ZlciB0aGUgc2Ft
ZSB0d28gbm9kZXMuIFRoZXJlZm9yZSwgaWYKKyAgICAgICAgLy8gICB0aGUgbWVyZ2UgY291bGQg
YmUgZXhwcmVzc2VkIGFzIHR3byBSZWxhdGlvbnNoaXBzLCB3ZSBwcmVmZXIgdG8gaW5zdGVhZCBw
aWNrIHRoZQorICAgICAgICAvLyAgIGxlc3MgcHJlY2lzZSBzaW5nbGUgUmVsYXRpb25zaGlwIGZv
cm0gZXZlbiBpZiB0aGF0IG1lYW5zIFRPUC4gT25lIGV4Y2VwdGlvbiB0bworICAgICAgICAvLyAg
IHRoaXMgaXMgdGhhdCB3ZSBAYSA9PSBAYiArIEMgYW5kIEBhID09IEBiICsgRCBpbnRvIEBhID4g
QGIgKyBDIC0gMSBhbmQKKyAgICAgICAgLy8gICBAYSA8IEBiICsgRCArIDEuIAorICAgICAgICAv
LworICAgICAgICAvLyAtIElmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIFJlbGF0aW9uc2hp
cHMgaXMganVzdCB0aGUgbV9vZmZzZXQsIHRoZW4gd2UgY3JlYXRlIGEKKyAgICAgICAgLy8gICBS
ZWxhdGlvbnNoaXAgdGhhdCBoYXMgYW4gb2Zmc2V0IG9mIC0xLCAwLCBvciAxLiBUaGlzIGlzIGFu
IGVzc2VudGlhbCBjb252ZXJnZW5jZQorICAgICAgICAvLyAgIGhhY2suIFdlIG5lZWQgLTEgYW5k
IDEgdG8gc3VwcG9ydCA8PSBhbmQgPj0uIFRoaXMgb3ZlcnJpZGVzIHRoZSBwcmV2aW91cworICAg
ICAgICAvLyAgIGV4Y2VwdGlvbi4gRm9yIGV4YW1wbGUsIHdlIHdvdWxkbid0IGFkZCBhIEBhIDwg
QGIgKyBEICsgMSByZWxhdGlvbnNoaXAgaWYgRCArIDEKKyAgICAgICAgLy8gICB3YXMgbm90IGVx
dWFsIHRvIG9uZSBvZiAtMSwgMCwgMS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0
IHdlIHVzZSBSZWxhdGlvbnNoaXAoKSB0byBtZWFuIFRPUC4KKyAgICAgICAgCisgICAgICAgIC8v
IElmIHRoZSByZWxhdGlvbnNoaXBzIGFyZSBpZGVudGljYWwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcg
bGVmdCB0byBkby4KKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICBm
dW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgLy8gRnJvbSBoZXJlIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgdHdvIHJlbGF0aW9u
c2hpcHMgYXJlIG5vdCBpZGVudGljYWwuIFVzdWFsbHkgd2UgdXNlCisgICAgICAgIC8vIHRoaXMg
dG8gYXNzdW1lIHRoYXQgd2UgZGlmZmVyZW50IG9mZnNldHMgYW55dGltZSB0aGF0IGV2ZXJ5dGhp
bmcgYnV0IHRoZSBvZmZzZXQgaXMKKyAgICAgICAgLy8gaWRlbnRpY2FsLgorICAgICAgICAKKyAg
ICAgICAgaWYgKG1fa2luZCA9PSBOb3RFcXVhbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLm1f
a2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIERpZmZlcmVudCBv
ZmZzZXRzLCBzbyB0YXV0b2xvZ3kuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvdGhl
ci5tX2tpbmQgPT0gRXF1YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9vZmZzZXQgIT0gb3Ro
ZXIubV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2F5aW5nIHRoYXQgeW91IG1p
Z2h0IGJlIEIgd2hlbiB5b3UndmUgYWxyZWFkeSBzYWlkIHRoYXQgeW91J3JlIGFueXRoaW5nCisg
ICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBBLCB3aGVyZSBBIGFuZCBCIGFyZSBkaWZmZXJlbnQs
IGlzIGEgdGF1dG9sb2d5LiBZb3UgY291bGQganVzdCBzYXkKKyAgICAgICAgICAgICAgICAgICAg
Ly8gdGhhdCB5b3UncmUgYW55dGhpbmcgYnV0IEEuCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0
b3IoKnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndp
c2UsIHNhbWUgb2Zmc2V0czogd2UncmUgc2F5aW5nIHRoYXQgeW91J3JlIGVpdGhlciBBIG9yIHlv
dSdyZSBub3QKKyAgICAgICAgICAgICAgICAvLyBlcXVhbCB0byBBLgorICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQob3RoZXIubV9raW5kID09IExlc3NUaGFuKTsKKyAg
ICAgICAgICAgIC8vIFdlIGhhdmUgdGhlc2UgY2xhaW1zLCBhbmQgd2UncmUgbWVyZ2luZyB0aGVt
OgorICAgICAgICAgICAgLy8gICAgIEBhICE9IEBiICsgQworICAgICAgICAgICAgLy8gICAgIEBh
IDwgQGIgKyBECisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBDID09
IEQsIHRoZW4gdGhlIG1lcmdlIGlzIGNsZWFybHkganVzdCB0aGUgTm90RXF1YWwuCisgICAgICAg
ICAgICAvLyBJZiB3ZSBoYXZlIEMgPCBELCB0aGVuIHRoZSBtZXJnZSBpcyBhIHRhdXRvbG9neS4K
KyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgQyA+IEQsIHRoZW4gd2UgY291bGQga2VlcCBib3Ro
IGNsYWltcywgYnV0IHdlIGFyZSBjaGVhcCwgc28gd2UKKyAgICAgICAgICAgIC8vIGRvbid0LiBX
ZSBqdXN0IHVzZSB0aGUgTm90RXF1YWwuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICht
X29mZnNldCA8IG90aGVyLm1fb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pIHsK
KyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAg
ICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgb2Zmc2V0IHRvIHNlbGVjdCB0byBtZXJnZSB0aGVtLiBU
aGUgYXBwcm9wcmlhdGUgb2Zmc2V0cyBhcmUKKyAgICAgICAgICAgICAgICAvLyAtMSwgMCwgb3Ig
MS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBmaWd1cmUgb3V0
IHdoYXQgb2Zmc2V0IHdlJ2QgbGlrZSB0byB1c2UuCisgICAgICAgICAgICAgICAgaW50IGJlc3RP
ZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRoaW5nIGxpa2UgQGEgPCBAYiAr
IDIuIFdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHVuZGVyIHRoZQorICAgICAgICAgICAgICAgIC8v
IC0xLDAsMSBydWxlLgorICAgICAgICAgICAgICAgIGlmIChiZXN0T2Zmc2V0IDw9IDEpCisgICAg
ICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVz
c1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkpOworICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBFcXVhbC4gV2Ugd291bGQgaGF2ZSBlbGlt
aW5hdGVkIHRoZSBHcmVhdGVyVGhhbidzLCBhbmQKKyAgICAgICAgICAgIC8vIGlmIHdlIG1lcmdl
IExlc3NUaGFuIGFuZCBOb3RFcXVhbCwgdGhlIE5vdEVxdWFsIGFsd2F5cyBjb21lcyBmaXJzdC4K
KyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVyLm1fa2luZCA9PSBFcXVhbCk7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlYWxseSBpbnRlcmVzdGluZyBj
YXNlLiBXZSBoYXZlOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBAYSA8IEBi
ICsgQworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGFuZDoKKyAgICAgICAgICAgIC8v
CisgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIgKyBECisgICAgICAgICAgICAvLworICAgICAg
ICAgICAgLy8gVGhlcmVmb3JlIHdlJ2QgbGlrZSB0byByZXR1cm46CisgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBtYXgoQywgRCArIDEpCisgICAgICAgICAgICAK
KyAgICAgICAgICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1f
b2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRo
aW5nIGxpa2UgQGEgPCBAYiArIDIuIFdlIGNhbid0IGRvIGl0LgorICAgICAgICAgICAgaWYgKGJl
c3RPZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xl
ZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBzdGQ6Om1heChiZXN0T2Zmc2V0LCAtMSkpKTsKKworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUaGUgb25s
eSB0aGluZyBsZWZ0IGlzIEVxdWFsLCBzaW5jZSB3ZSB3b3VsZCBoYXZlIGdvdHRlbiByaWQgb2Yg
dGhlIEdyZWF0ZXJUaGFuJ3MuCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fa2luZCA9PSBFcXVh
bCk7CisgICAgICAgIAorICAgICAgICAvLyBXZSB3b3VsZCBuZXZlciBzZWUgTm90RXF1YWwsIGJl
Y2F1c2UgdGhvc2UgYWx3YXlzIGNvbWUgZmlyc3QuIFdlIHdvdWxkIG5ldmVyCisgICAgICAgIC8v
IHNlZSBHcmVhdGVyVGhhbiwgYmVjYXVzZSB3ZSB3b3VsZCBoYXZlIGVsaW1pbmF0ZWQgdGhvc2Uu
IFdlIHdvdWxkIG5ldmVyIHNlZQorICAgICAgICAvLyBMZXNzVGhhbiwgYmVjYXVzZSB0aG9zZSBh
bHdheXMgY29tZSBmaXJzdC4KKyAgICAgICAgCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVy
Lm1fa2luZCA9PSBFcXVhbCk7CisgICAgICAgIC8vIFdlIGhhdmUgQGEgPT0gQGIgKyBDIGFuZCBA
YSA9PSBAYiArIEQsIHdoZXJlIEMgIT0gRC4gVHVybiB0aGlzIGludG8gc29tZQorICAgICAgICAv
LyBpbmVxdWFsaXR5IHRoYXQgaW52b2x2ZXMgYSBjb25zdGFudCB0aGF0IGlzIC0xLDAsMS4KKyAg
ICAgICAgCisgICAgICAgIFJlbGF0aW9uc2hpcCBsZXNzVGhhbigKKyAgICAgICAgICAgIG1fbGVm
dCwgb3RoZXIubV9yaWdodCwgTGVzc1RoYW4sCisgICAgICAgICAgICBzdGQ6Om1heChtX29mZnNl
dCwgb3RoZXIubV9vZmZzZXQpICsgMSk7CisgICAgICAgIAorICAgICAgICBpZiAobGVzc1RoYW4u
b2Zmc2V0KCkgPj0gLTEgJiYgbGVzc1RoYW4ub2Zmc2V0KCkgPD0gMSkKKyAgICAgICAgICAgIGZ1
bmN0b3IobGVzc1RoYW4pOworICAgICAgICAKKyAgICAgICAgUmVsYXRpb25zaGlwIGdyZWF0ZXJU
aGFuKAorICAgICAgICAgICAgbV9sZWZ0LCBvdGhlci5tX3JpZ2h0LCBHcmVhdGVyVGhhbiwKKyAg
ICAgICAgICAgIHN0ZDo6bWluKG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCkgLSAxKTsKKyAgICAg
ICAgaWYgKGdyZWF0ZXJUaGFuLm9mZnNldCgpID49IC0xICYmIGdyZWF0ZXJUaGFuLm9mZnNldCgp
IDw9IDEpCisgICAgICAgICAgICBmdW5jdG9yKGdyZWF0ZXJUaGFuKTsKKyAgICB9CisgICAgCisg
ICAgTm9kZSogbV9sZWZ0OworICAgIE5vZGUqIG1fcmlnaHQ7CisgICAgS2luZCBtX2tpbmQ7Cisg
ICAgaW50IG1fb2Zmc2V0OyAvLyBUaGlzIG9mZnNldCBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2Uu
Cit9OworCit0eXBlZGVmIEhhc2hNYXA8Tm9kZSosIFZlY3RvcjxSZWxhdGlvbnNoaXA+PiBSZWxh
dGlvbnNoaXBNYXA7CisKK2NsYXNzIEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlIDogcHVi
bGljIFBoYXNlIHsKK3B1YmxpYzoKKyAgICBJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZShH
cmFwaCYgZ3JhcGgpCisgICAgICAgIDogUGhhc2UoZ3JhcGgsICJpbnRlZ2VyIHJhbmdlIG9wdGlt
aXphdGlvbiIpCisgICAgICAgICwgbV96ZXJvKG51bGxwdHIpCisgICAgICAgICwgbV9yZWxhdGlv
bnNoaXBzQXRIZWFkKGdyYXBoKQorICAgICAgICAsIG1faW5zZXJ0aW9uU2V0KGdyYXBoKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgYm9vbCBydW4oKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1f
Z3JhcGgubV9mb3JtID09IFNTQSk7CisgICAgICAgIAorICAgICAgICAvLyBCZWZvcmUgd2UgZG8g
YW55dGhpbmcsIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB6ZXJvIGNvbnN0YW50IGF0IHRoZSB0
b3AuCisgICAgICAgIGZvciAoTm9kZSogbm9kZSA6ICptX2dyYXBoLmJsb2NrKDApKSB7CisgICAg
ICAgICAgICBpZiAobm9kZS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgIW5vZGUtPmFzSW50MzIoKSkg
eworICAgICAgICAgICAgICAgIG1femVybyA9IG5vZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX3plcm8pIHsKKyAgICAg
ICAgICAgIG1femVybyA9IG1faW5zZXJ0aW9uU2V0Lmluc2VydENvbnN0YW50KDAsIE5vZGVPcmln
aW4oKSwganNOdW1iZXIoMCkpOworICAgICAgICAgICAgbV9pbnNlcnRpb25TZXQuZXhlY3V0ZSht
X2dyYXBoLmJsb2NrKDApKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHZlcmJv
c2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkdyYXBoIGJlZm9yZSBpbnRlZ2VyIHJhbmdlIG9w
dGltaXphdGlvbjpcbiIpOworICAgICAgICAgICAgbV9ncmFwaC5kdW1wKCk7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIC8vIFRoaXMgcGVyZm9ybXMgYSBmaXhwb2ludCBvdmVyIHRoZSBi
bG9ja3MgaW4gcmV2ZXJzZSBwb3N0LW9yZGVyLiBMb2dpY2FsbHksIHdlCisgICAgICAgIC8vIG1h
aW50YWluIGEgbGlzdCBvZiByZWxhdGlvbnNoaXBzIGF0IGVhY2ggcG9pbnQgaW4gdGhlIHByb2dy
YW0uIFRoZSBsaXN0IHNob3VsZCBiZQorICAgICAgICAvLyByZWFkIGFzIGFuIGludGVyc2VjdGlv
bi4gRm9yIGV4YW1wbGUgaWYgd2UgaGF2ZSB7cmVsMSwgcmVsMiwgLi4uLCByZWxOfSwgeW91IHNo
b3VsZAorICAgICAgICAvLyByZWFkIHRoaXMgYXM6CisgICAgICAgIC8vCisgICAgICAgIC8vICAg
ICBUT1AgJiYgcmVsMSAmJiByZWwyICYmIC4uLiAmJiByZWxOCisgICAgICAgIC8vCisgICAgICAg
IC8vIFRoaXMgYWxsb3dzIHVzIHRvIGV4cHJlc3MgdGhpbmdzIGxpa2U6CisgICAgICAgIC8vCisg
ICAgICAgIC8vICAgICBAYSA+IEBiIC0gNDIgJiYgQGEgPCBAYiArIDI1CisgICAgICAgIC8vCisg
ICAgICAgIC8vIEJ1dCBub3QgdGhpbmdzIGxpa2U6CisgICAgICAgIC8vCisgICAgICAgIC8vICAg
ICBAYSA8IEBiIC0gNDIgfHwgQGEgPiBAYiArIDI1CisgICAgICAgIC8vCisgICAgICAgIC8vIFdl
IG1lcmdlIHR3byBsaXN0cyBieSBtZXJnaW5nIGVhY2ggcmVsYXRpb25zaGlwIGluIG9uZSBsaXN0
IHdpdGggZWFjaCByZWxhdGlvbnNoaXAKKyAgICAgICAgLy8gaW4gdGhlIG90aGVyIGxpc3QuIE1l
cmdpbmcgdHdvIHJlbGF0aW9uc2hpcHMgd2lsbCB5aWVsZCBhIHJlbGF0aW9uc2hpcCBsaXN0OyBh
cyB3aXRoCisgICAgICAgIC8vIGFsbCBzdWNoIGxpc3RzIGl0IGlzIGFuIGludGVyc2N0aW9uLiBN
ZXJnaW5nIHJlbGF0aW9uc2hpcHMgb3ZlciBkaWZmZXJlbnQgdmFyaWFibGVzCisgICAgICAgIC8v
IGFsd2F5cyB5aWVsZHMgdGhlIGVtcHR5IGxpc3QgKGkuZS4gVE9QKS4gVGhpcyBtZXJnZSBzdHls
ZSBpcyBzb3VuZCBiZWNhdXNlIGlmIHdlCisgICAgICAgIC8vIGhhdmU6CisgICAgICAgIC8vCisg
ICAgICAgIC8vICAgICAoQSAmJiBCICYmIEMpIHx8IChEICYmIEUgJiYgRikKKyAgICAgICAgLy8K
KyAgICAgICAgLy8gVGhlbiBhIHZhbGlkIG1lcmdlIGlzIGp1c3Qgb25lIHRoYXQgd2lsbCByZXR1
cm4gdHJ1ZSBpZiBBLCBCLCBDIGFyZSBhbGwgdHJ1ZSwgb3IKKyAgICAgICAgLy8gdGhhdCB3aWxs
IHJldHVybiB0cnVlIGlmIEQsIEUsIEYgYXJlIGFsbCB0cnVlLiBPdXIgbWVyZ2Ugc3R5bGUgZXNz
ZW50aWFsbHkgZG9lczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIChBIHx8IEQpICYmIChB
IHx8IEUpICYmIChBIHx8IEYpICYmIChCIHx8IEQpICYmIChCIHx8IEUpICYmIChCIHx8IEYpICYm
CisgICAgICAgIC8vICAgICAgICAgKEMgfHwgRCkgJiYgKEMgfHwgRSkgJiYgKEMgfHwgRikKKyAg
ICAgICAgLy8KKyAgICAgICAgLy8gSWYgQSAmJiBCICYmIEMgaXMgdHJ1ZSwgdGhlbiB0aGlzIHJl
dHVybnMgdHJ1ZS4gSWYgRCAmJiBFICYmIEYgaXMgdHJ1ZSwgdGhpcyBhbHNvCisgICAgICAgIC8v
IHJldHVybnMgdHJ1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hpbGUgdGhpcyBhcHBlYXJz
IGF0IGZpcnN0IGxpa2UgYSBraW5kIG9mIGV4cHJlc3Npb24gZXhwbG9zaW9uLCBpbiBwcmFjdGlj
ZSBpdAorICAgICAgICAvLyBpc24ndC4gVGhlIGNvZGUgdGhhdCBoYW5kbGVzIHRoaXMga25vd3Mg
dGhhdCB0aGUgbWVyZ2Ugb2YgdHdvIHJlbGF0aW9uc2hpcHMgb3ZlcgorICAgICAgICAvLyBkaWZm
ZXJlbnQgdmFyaWFibGVzIGlzIFRPUCAoaS5lLiB0aGUgZW1wdHkgbGlzdCkuIEZvciBleGFtcGxl
IGlmIEEgYWJvdmUgaXMgQGEgPCBAYgorICAgICAgICAvLyBhbmQgQiBhYm92ZSBpcyBAYyA+IEBk
LCB3aGVyZSBAYSwgQGIsIEBjLCBhbmQgQGQgYXJlIGRpZmZlcmVudCBub2RlcywgdGhlIG1lcmdl
IHdpbGwKKyAgICAgICAgLy8geWllbGQgbm90aGluZy4gSW4gZmFjdCwgdGhlIG1lcmdlIGFsZ29y
aXRobSB3aWxsIHNraXAgc3VjaCBtZXJnZXMgZW50aXJlbHkgYmVjYXVzZQorICAgICAgICAvLyB0
aGUgcmVsYXRpb25zaGlwIGxpc3RzIGFyZSBhY3R1YWxseSBrZXllZCBieSBub2RlLgorICAgICAg
ICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgc2FmZSB0byBkcm9wIGFueSBv
ZiByZWxhdGlvbnNoaXAgZnJvbSB0aGUgcmVsYXRpb25zaGlwIGxpc3QuCisgICAgICAgIC8vIFRo
aXMgbWVyZWx5IGluY3JlYXNlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgImV4cHJlc3Npb24iIHlp
ZWxkaW5nIHRydWUsIGkuZS4gYmVpbmcKKyAgICAgICAgLy8gY2xvc2VyIHRvIFRPUC4gT3B0aW1p
emF0aW9ucyBhcmUgb25seSBwZXJmb3JtZWQgaWYgd2UgY2FuIGVzdGFibGlzaCB0aGF0IHRoZQor
ICAgICAgICAvLyBleHByZXNzaW9uIGltcGxpZWQgYnkgdGhlIHJlbGF0aW9uc2hpcCBsaXN0IGlz
IGZhbHNlIGZvciBhbGwgb2YgdGhvc2UgY2FzZXMgd2hlcmUKKyAgICAgICAgLy8gc29tZSBjaGVj
ayB3b3VsZCBoYXZlIGZhaWxlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgaXMgbm8g
bm90aW9uIG9mIEJPVFRPTSBiZWNhdXNlIHdlIHRyZWF0IGJsb2NrcyB0aGF0IGhhdmVuJ3QgaGFk
IHRoZWlyCisgICAgICAgIC8vIHN0YXRlLWF0LWhlYWQgc2V0IGFzIGEgc3BlY2lhbCBjYXNlOiB3
ZSBqdXN0IHRyYW5zZmVyIGFsbCBsaXZlIHJlbGF0aW9uc2hpcHMgdG8gc3VjaAorICAgICAgICAv
LyBhIGJsb2NrLiBBZnRlciB0aGUgaGVhZCBvZiBhIGJsb2NrIGlzIHNldCwgd2UgcGVyZm9ybSB0
aGUgbWVyZ2luZyBhcyBhYm92ZS4gSW4gYWxsCisgICAgICAgIC8vIG90aGVyIHBsYWNlcyB3aGVy
ZSB3ZSB3b3VsZCBvcmRpbmFyaWx5IG5lZWQgQk9UVE9NLCB3ZSBhcHByb3hpbWF0ZSBpdCBieSBo
YXZpbmcgc29tZQorICAgICAgICAvLyBub24tQk9UVE9NIHJlbGF0aW9uc2hpcC4KKyAgICAgICAg
CisgICAgICAgIEJsb2NrTGlzdCBwb3N0T3JkZXIgPSBtX2dyYXBoLmJsb2Nrc0luUG9zdE9yZGVy
KCk7CisgICAgICAgIAorICAgICAgICBib29sIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB3aGls
ZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBwb3N0T3JkZXJJbmRleCA9IHBvc3RPcmRlci5zaXplKCk7IHBvc3RPcmRl
ckluZGV4LS07KSB7CisgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBwb3N0T3Jk
ZXJbcG9zdE9yZGVySW5kZXhdOworICAgICAgICAgICAgICAgIERGR19BU1NFUlQoCisgICAgICAg
ICAgICAgICAgICAgIG1fZ3JhcGgsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIGJsb2Nr
ID09IG1fZ3JhcGguYmxvY2soMCkgfHwgbV9zZWVuQmxvY2tzLmNvbnRhaW5zKGJsb2NrKSk7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHMgPSBtX3JlbGF0aW9u
c2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXggPCBibG9jay0+c2l6ZSgpOyArK25vZGVJ
bmRleCkgeworICAgICAgICAgICAgICAgICAgICBOb2RlKiBub2RlID0gYmxvY2stPmF0KG5vZGVJ
bmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAg
ICAgICAgICAgZGF0YUxvZygiQW5hbHlzaXM6IGF0ICIsIG5vZGUsICI6ICIsIGxpc3REdW1wKHNv
cnRlZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOworICAgICAgICAgICAgICAgICAgICBleGVjdXRl
Tm9kZShub2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgLy8gTm93IGNvbWVzIHBlcmhhcHMgdGhlIG1vc3QgaW1wb3J0YW50IHBpZWNlIG9m
IGNsZXZlcm5lc3M6IGlmIHdlIEJyYW5jaCwgYW5kCisgICAgICAgICAgICAgICAgLy8gdGhlIHBy
ZWRpY2F0ZSBpbnZvbHZlcyBzb21lIHJlbGF0aW9uIG92ZXIgaW50ZWdlcnMsIHdlIHByb3BhZ2F0
ZSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byB0aGUgdGFrZW4g
YW5kIG5vdFRha2VuIHBhdGhzLiBUaGlzIGhhbmRsZXM6CisgICAgICAgICAgICAgICAgLy8gLSBC
cmFuY2ggb24gaW50MzIuCisgICAgICAgICAgICAgICAgLy8gLSBCcmFuY2ggb24gTG9naWNhbE5v
dCBvbiBpbnQzMi4KKyAgICAgICAgICAgICAgICAvLyAtIEJyYW5jaCBvbiBjb21wYXJlIG9uIGlu
dDMyJ3MuCisgICAgICAgICAgICAgICAgLy8gLSBCcmFuY2ggb24gTG9naWNhbE5vdCBvZiBjb21w
YXJlIG9uIGludDMyJ3MuCisgICAgICAgICAgICAgICAgTm9kZSogdGVybWluYWwgPSBibG9jay0+
dGVybWluYWwoKTsKKyAgICAgICAgICAgICAgICBib29sIGFscmVhZHlNZXJnZWQgPSBmYWxzZTsK
KyAgICAgICAgICAgICAgICBpZiAodGVybWluYWwtPm9wKCkgPT0gQnJhbmNoKSB7CisgICAgICAg
ICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAg
ICAgIEJyYW5jaERhdGEqIGJyYW5jaERhdGEgPSB0ZXJtaW5hbC0+YnJhbmNoRGF0YSgpOworICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnZlcnQgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5jaGlsZDEoKS0+b3AoKSA9PSBM
b2dpY2FsTm90KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCA9IHRlcm1pbmFs
LT5jaGlsZDEoKS5ub2RlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnQgPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICBpZiAodGVybWluYWwtPmNoaWxkMSgpLnVzZUtpbmQoKSA9PSBJbnQzMlVzZSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwOjpz
YWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsLT5jaGlsZDEo
KS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpOb3RFcXVhbCwgMCk7CisgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlKiBjb21wYXJl
ID0gdGVybWluYWwtPmNoaWxkMSgpLm5vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3
aXRjaCAoY29tcGFyZS0+b3AoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21w
YXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVTdHJpY3RFcToKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgICAgICAgICAg
ICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNl
IENvbXBhcmVHcmVhdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlR3Jl
YXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlLT5pc0Jp
bmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlU3Ry
aWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJl
bGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpFcXVhbCwg
MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwg
Y29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFy
ZUxlc3NFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0g
UmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okxlc3NU
aGFuLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRl
KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCku
bm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAwKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlR3JlYXRlckVxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNo
aWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0
aW9uc2hpcDo6R3JlYXRlclRoYW4sIC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgREZHX0NSQVNIKG1fZ3JhcGgsIGNvbXBhcmUsICJJbnZh
bGlkIGNvbXBhcmlzb24gbm9kZSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
ICAgICBpZiAoaW52ZXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0g
cmVsYXRpb25zaGlwLmludmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcE1hcCBmb3JUcnVlID0gbV9yZWxhdGlvbnNoaXBzOworICAgICAgICAgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvckZhbHNlID0gbV9yZWxhdGlvbnNoaXBzOworICAg
ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9z
ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJEZWFsaW5nIHdpdGggdHJ1
ZTpcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKGZvclRydWUs
IHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlw
IGludmVyc2UgPSByZWxhdGlvbnNoaXAuaW52ZXJzZSgpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRh
dGFMb2coIkRlYWxpbmcgd2l0aCBmYWxzZTpcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNldFJlbGF0aW9uc2hpcChmb3JGYWxzZSwgaW52ZXJzZSk7CisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JUcnVlLCBicmFuY2hEYXRhLT50YWtlbi5ibG9jayk7
CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8oZm9yRmFsc2UsIGJy
YW5jaERhdGEtPm5vdFRha2VuLmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscmVh
ZHlNZXJnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TWVyZ2VkKSB7CisgICAgICAgICAgICAg
ICAgICAgIGZvciAoQmFzaWNCbG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhtX3JlbGF0aW9uc2hp
cHMsIHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoQmFz
aWNCbG9jayogYmxvY2sgOiBtX2dyYXBoLmJsb2Nrc0luTmF0dXJhbE9yZGVyKCkpIHsKKyAgICAg
ICAgICAgIG1fcmVsYXRpb25zaGlwcyA9IG1fcmVsYXRpb25zaGlwc0F0SGVhZFtibG9ja107Cisg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIG5vZGVJbmRleCA9IDA7IG5vZGVJbmRleCA8IGJsb2Nr
LT5zaXplKCk7ICsrbm9kZUluZGV4KSB7CisgICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJs
b2NrLT5hdChub2RlSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAg
ICAgICAgICAgICAgICBkYXRhTG9nKCJUcmFuc2Zvcm1hdGlvbjogYXQgIiwgbm9kZSwgIjogIiwg
bGlzdER1bXAoc29ydGVkUmVsYXRpb25zaGlwcygpKSwgIlxuIik7CisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgLy8gVGhpcyBlbmRzIHVwIGJlaW5nIHByZXR0eSBhd2t3YXJkIHRv
IHdyaXRlIGJlY2F1c2Ugd2UgbmVlZCB0byBkZWNpZGUgaWYgd2UKKyAgICAgICAgICAgICAgICAv
LyBvcHRpbWl6ZSBieSB1c2luZyB0aGUgcmVsYXRpb25zaGlwcyBiZWZvcmUgdGhlIG9wZXJhdGlv
biwgYnV0IHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVOb2RlKCkg
YmVmb3JlIHdlIG9wdGltaXplLgorICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkg
eworICAgICAgICAgICAgICAgIGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAh
PSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQo
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9k
ZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9y
ZWxhdGlvbnNoaXBzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgbWluVmFsdWUgPSBzdGQ6
Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4
VmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOworICAgICAgICAgICAgICAg
ICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUgPSBzdGQ6Om1heChtaW5WYWx1ZSwgcmVsYXRp
b25zaGlwLm1pblZhbHVlT2ZMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFs
dWUgPSBzdGQ6Om1pbihtYXhWYWx1ZSwgcmVsYXRpb25zaGlwLm1heFZhbHVlT2ZMZWZ0KCkpOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obWluVmFsdWUsIG5vZGUtPmNoaWxkMigpLT5h
c0ludDMyKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdW1PdmVyZmxvd3M8aW50Piht
YXhWYWx1ZSwgbm9kZS0+Y2hpbGQyKCktPmFzSW50MzIoKSkpCisgICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGV4
ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9k
ZS0+c2V0QXJpdGhNb2RlKEFyaXRoOjpVbmNoZWNrZWQpOworICAgICAgICAgICAgICAgICAgICBj
aGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENoZWNrSW5C
b3VuZHM6IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBz
LmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0
ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBib29sIG5vbk5l
Z2F0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgbGVzc1RoYW5MZW5ndGgg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25z
aGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlv
bnNoaXAubWluVmFsdWVPZkxlZnQoKSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5vbk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5yaWdodCgpID09IG5vZGUtPmNoaWxkMigp
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkg
PT0gUmVsYXRpb25zaGlwOjpFcXVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm
JiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBsZXNzVGhhbkxlbmd0aCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0g
UmVsYXRpb25zaGlwOjpMZXNzVGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm
JiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbGVzc1RoYW5MZW5ndGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgICAgICBpZiAobm9uTmVnYXRpdmUgJiYgbGVzc1RoYW5MZW5ndGgpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG5vZGUtPnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAg
Y2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUo
YmxvY2stPmF0KG5vZGVJbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBl
eGVjdXRlTm9kZShOb2RlKiBub2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChub2RlLT5vcCgp
KSB7CisgICAgICAgIGNhc2UgQ2hlY2tJbkJvdW5kczogeworICAgICAgICAgICAgc2V0UmVsYXRp
b25zaGlwKFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIG5v
ZGUtPmNoaWxkMigpLm5vZGUoKSwgUmVsYXRpb25zaGlwOjpMZXNzVGhhbikpOworICAgICAgICAg
ICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZShub2RlLT5jaGlsZDEo
KS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgLTEpKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBcml0
aEFkZDogeworICAgICAgICAgICAgLy8gV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGludDMyIGFk
ZGl0aW9ucyBhbmQgd2UgY3VycmVudGx5IG9ubHkga25vdyBob3cgdG8KKyAgICAgICAgICAgIC8v
IGhhbmRsZSB0aGUgbm9uLXdyYXBwaW5nIG9uZXMuCisgICAgICAgICAgICBpZiAoIW5vZGUtPmlz
QmluYXJ5VXNlS2luZChJbnQzMlVzZSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBoYW5kbGUgdGhlIHVuY2hlY2tl
ZCBhcml0aG1ldGljIGNhc2UuIFdlIGp1c3QgZG8gaXQgZG9uJ3QgcmlnaHQKKyAgICAgICAgICAg
IC8vIG5vdy4KKyAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hl
Y2tPdmVyZmxvdykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgLy8gSGFuZGxlIGFkZDogQHZhbHVlICsgY29uc3RhbnQuCisgICAgICAgICAgICBpZiAo
IW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9mZnNldCA9IG5vZGUtPmNoaWxkMigp
LT5hc0ludDMyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGFkZCBhIHJlbGF0
aW9uc2hpcCBmb3IgQGFkZCA9PSBAdmFsdWUgKyBjb25zdGFudCwgYW5kIHRoZW4gd2UgY29weSB0
aGUKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgZm9yIEB2YWx1ZS4gVGhpcyBnaXZlcyB1
cyBhIG9uZS1kZWVwIHZpZXcgb2YgQHZhbHVlJ3MgZXhpc3RpbmcKKyAgICAgICAgICAgIC8vIHJl
bGF0aW9uc2hpcHMsIHdoaWNoIG1hdGNoZXMgdGhlIG9uZS1kZWVwIHNlYXJjaCBpbiBzZXRSZWxh
dGlvbnNoaXAoKS4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAor
ICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcChub2RlLCBub2RlLT5jaGlsZDEoKS5ub2RlKCks
IFJlbGF0aW9uc2hpcDo6RXF1YWwsIG9mZnNldCkpOworICAgICAgICAgICAgCisgICAgICAgICAg
ICBhdXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkp
OworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKSB7CisgICAg
ICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgICAgICAgICAg
Zm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgaGF2ZToKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZDog
QXJpdGhBZGQoQHgsIEMpCisgICAgICAgICAgICAgICAgICAgIC8vICAgICBAeCBvcCBAeSArIEQK
KyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxv
d2luZyBjZXJ0YWlubHkgaG9sZHM6CisgICAgICAgICAgICAgICAgICAgIC8vICAgICBAeCA9PSBA
YWRkIC0gQworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBX
aGljaCBhbGxvd3MgdXMgdG8gc3Vic3RpdHV0ZToKKyAgICAgICAgICAgICAgICAgICAgLy8gICAg
IEBhZGQgLSBDIG9wIEB5ICsgRAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAg
ICAgICAgICAvLyBBbmQgdGhlbiBjYXJyeSB0aGUgQyBvdmVyOgorICAgICAgICAgICAgICAgICAg
ICAvLyAgICAgQGFkZCBvcCBAeSArIEQgKyBDCisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlw
OworICAgICAgICAgICAgICAgICAgICBBU1NFUlQobmV3UmVsYXRpb25zaGlwLmxlZnQoKSA9PSBu
b2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKG5ld1JlbGF0aW9uc2hpcC5yaWdodCgpID09IG5vZGUpCisgICAgICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25z
aGlwLnNldExlZnQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNo
aXAuYWRkVG9PZmZzZXQob2Zmc2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvQWRkLmFw
cGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAg
ICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcCwgMCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5vdyB3ZSB3YW50IHRvIGVzdGFibGlzaCB0aGF0
IGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0IG9mIHRoZSBhZGRpdGlvbiBhcmUKKyAgICAg
ICAgICAgIC8vIHdpdGhpbiBhIHBhcnRpY3VsYXIgcmFuZ2Ugb2YgaW50ZWdlcnMuCisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8g
SWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBAdmFsdWUgPD0g
bWF4IC0gMSwgaS5lLiB0aGF0CisgICAgICAgICAgICAgICAgLy8gQHZhbHVlIDwgbWF4LgorICAg
ICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0czxp
bnQ+OjptYXgoKSwgLW9mZnNldCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRp
b25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRl
KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96
ZXJvLCBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSBvZmZzZXQgKyAxKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0aGVu
IHdlIGtub3cgdGhhdCBAYWRkID49IG1pbiArIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAg
IC8vIEBhZGQgPiBtaW4uCisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50Pihz
dGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpLCBvZmZzZXQsIC0xKSkgeworICAgICAgICAg
ICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxh
dGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwgbV96ZXJvLCBSZWxh
dGlvbnNoaXA6OkdyZWF0ZXJUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6
bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkgKyBvZmZzZXQgLSAxKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgJiYgb2Zmc2V0ICE9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8aW50Pjo6bWluKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJh
ZGQ6IEB2YWx1ZSAtIDEiIHRoZW4gd2Uga25vdyB0aGF0IEB2YWx1ZSA+PSBtaW4gKyAxLCBpLmUu
IHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAdmFsdWUgPiBtaW4uCisgICAgICAgICAgICAgICAg
aWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpLCBv
ZmZzZXQsIC0xKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAg
ICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9u
c2hpcDo6R3JlYXRlclRoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1l
cmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9mZnNldCAtIDEpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIC8vIElmIHdlIGhhdmUgImFkZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQg
QGFkZCA8PSBtYXggLSAxLCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAYWRkIDwgbWF4
LgorICAgICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xp
bWl0czxpbnQ+OjptYXgoKSwgLW9mZnNldCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0
UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpMZXNz
VGhhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGlu
dD46Om1heCgpIC0gb2Zmc2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6IHsKKyAgICAg
ICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAobm9kZSwgbV96ZXJvLCBSZWxhdGlv
bnNoaXA6OkdyZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFVwc2lsb246IHsKKyAgICAgICAgICAgIHNldFJl
bGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisg
ICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+cGhpKCksIFJl
bGF0aW9uc2hpcDo6RXF1YWwsIDApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0byBp
dGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAg
ICAgICAgIGlmIChpdGVyICE9IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAgICAg
ICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAoUmVs
YXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAg
ICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChub2RlLT5waGkoKSA9PSBuZXdSZWxhdGlvbnNoaXAucmlnaHQoKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBu
ZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2RlLT5waGkoKSk7CisgICAgICAgICAgICAgICAgICAg
IHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAg
ICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAg
ICB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25l
ZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIHNldFJlbGF0aW9uc2hpcChtX3JlbGF0
aW9uc2hpcHMsIHJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAgIHZv
aWQgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICBSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hp
cE1hcCwgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9IDEp
CisgICAgeworICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25zaGlw
LCB0aW1lVG9MaXZlKTsKKyAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIHJlbGF0
aW9uc2hpcC5mbGlwcGVkKCksIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNl
dE9uZVNpZGUoCisgICAgICAgIFJlbGF0aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBSZWxh
dGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7Cisg
ICAgICAgIGlmICghcmVsYXRpb25zaGlwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAK
KyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2V0dGluZzog
IiwgcmVsYXRpb25zaGlwLCAiICh0dGwgPSAiLCB0aW1lVG9MaXZlLCAiKVxuIik7CisKKyAgICAg
ICAgYXV0byByZXN1bHQgPSByZWxhdGlvbnNoaXBNYXAuYWRkKAorICAgICAgICAgICAgcmVsYXRp
b25zaGlwLmxlZnQoKSwgVmVjdG9yPFJlbGF0aW9uc2hpcD4oKSk7CisgICAgICAgIFZlY3RvcjxS
ZWxhdGlvbnNoaXA+JiByZWxhdGlvbnNoaXBzID0gcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsKKyAg
ICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgIGJvb2wgZm91bmQgPSBm
YWxzZTsKKyAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAmIG90aGVyUmVsYXRpb25zaGlwIDogcmVs
YXRpb25zaGlwcykgeworICAgICAgICAgICAgaWYgKG90aGVyUmVsYXRpb25zaGlwLnNhbWVOb2Rl
c0FzKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwIGZp
bHRlcmVkID0gb3RoZXJSZWxhdGlvbnNoaXAuZmlsdGVyKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKGZpbHRlcmVkLmxlZnQoKSA9PSByZWxhdGlvbnNoaXAubGVm
dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsK
KyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYg
b3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAgICAg
ICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAg
ICAgQ29uc2lkZXJpbmc6ICIsIG90aGVyUmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlOgorICAgICAgICAgICAgICAgIC8vICAg
ICBAYSBvcCBAYiArIEMKKyAgICAgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGMgKyBECisgICAg
ICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGltcGxpZXM6CisgICAgICAg
ICAgICAgICAgLy8gICAgIEBjICsgRCBvcCBAYiArIEMKKyAgICAgICAgICAgICAgICAvLyAgICAg
QGMgb3AgQGIgKyBDIC0gRAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8g
V2hlcmU6IEBhID09IHJlbGF0aW9uc2hpcC5sZWZ0KCksIEBiID09IHJlbGF0aW9uc2hpcC5yaWdo
dCgpLAorICAgICAgICAgICAgICAgIC8vIEBhID09IG90aGVyUmVsYXRpb25zaGlwLmxlZnQoKSwg
QGMgPT0gb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKS4KKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlvbnNoaXAub2Zmc2V0KCkgIT0gc3RkOjpudW1lcmlj
X2xpbWl0czxpbnQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAg
bmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICBpZiAo
bmV3UmVsYXRpb25zaGlwLnJpZ2h0KCkgIT0gb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlwLnNldExlZnQob3RoZXJSZWxh
dGlvbnNoaXAucmlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRp
b25zaGlwLmFkZFRvT2Zmc2V0KC1vdGhlclJlbGF0aW9uc2hpcC5vZmZzZXQoKSkpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICByZWxhdGlv
bnNoaXBzLmFwcGVuZChyZWxhdGlvbnNoaXApOworICAgICAgICAKKyAgICAgICAgZm9yIChSZWxh
dGlvbnNoaXAgYW5vdGhlclJlbGF0aW9uc2hpcCA6IHRvQWRkKSB7CisgICAgICAgICAgICBBU1NF
UlQodGltZVRvTGl2ZSk7CisgICAgICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwg
YW5vdGhlclJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSAtIDEpOworICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIGJvb2wgbWVyZ2VUbyhSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwg
QmFzaWNCbG9jayogdGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAg
ICAgICAgIGRhdGFMb2coIk1lcmdpbmcgdG8gIiwgcG9pbnRlckR1bXAodGFyZ2V0KSwgIjpcbiIp
OworICAgICAgICAgICAgZGF0YUxvZygiICAgIEluY29taW5nOiAiLCBsaXN0RHVtcChzb3J0ZWRS
ZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcE1hcCkpLCAiXG4iKTsKKyAgICAgICAgICAgIGRhdGFM
b2coIiAgICBBdCBoZWFkOiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKG1fcmVsYXRp
b25zaGlwc0F0SGVhZFt0YXJnZXRdKSksICJcbiIpOworICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICBpZiAobV9zZWVuQmxvY2tzLmFkZCh0YXJnZXQpKSB7CisgICAgICAgICAgICAvLyBUaGlz
IGlzIGEgbmV3IGJsb2NrLiBXZSBjb3B5IHN1YmplY3QgdG8gbGl2ZW5lc3MgcHJ1bmluZy4KKyAg
ICAgICAgICAgIGF1dG8gaXNMaXZlID0gWyZdIChOb2RlKiBub2RlKSB7CisgICAgICAgICAgICAg
ICAgaWYgKG5vZGUgPT0gbV96ZXJvKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LT5zc2EtPmxpdmVBdEhlYWQuY29udGFpbnMo
bm9kZSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGF1
dG8mIGVudHJ5IDogcmVsYXRpb25zaGlwTWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0xp
dmUoZW50cnkua2V5KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdmFsdWVzOworICAg
ICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVl
KSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChyZWxhdGlvbnNoaXAubGVmdCgpID09IGVu
dHJ5LmtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0xpdmUocmVsYXRpb25zaGlwLnJp
Z2h0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgIFByb3BhZ2F0aW5nICIsIHJlbGF0aW9uc2hp
cCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHJlbGF0aW9u
c2hpcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1
ZXMuZW5kKCkpOworICAgICAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRd
LmFkZChlbnRyeS5rZXksIHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTWVyZ2UgYnkgaW50ZXJz
ZWN0aW5nLiBXZSBoYXZlIG5vIG5vdGlvbiBvZiBCT1RUT00sIHNvIHdlIHVzZSB0aGUgb21pc3Np
b24gb2YKKyAgICAgICAgLy8gcmVsYXRpb25zaGlwcyBmb3IgYSBwYWlyIG9mIG5vZGVzIHRvIG1l
YW4gVE9QLiBUaGUgcmVhc29uIHdoeSB3ZSBkb24ndCBuZWVkIEJPVFRPTQorICAgICAgICAvLyBp
cyAoMSkgd2UganVzdCBvdmVyYXBwcm94aW1hdGUgY29udHJhZGljdGlvbnMgYW5kICgyKSBhIHZh
bHVlIG5ldmVyIGhhdmluZyBiZWVuCisgICAgICAgIC8vIGFzc2lnbmVkIHdvdWxkIG9ubHkgaGFw
cGVuIGlmIHdlIGhhdmUgbm90IHByb2Nlc3NlZCB0aGUgbm9kZSdzIHByZWRlY2Vzc29yLiBXZQor
ICAgICAgICAvLyBzaG91bGRuJ3QgcHJvY2VzcyBibG9ja3MgdW50aWwgd2UgaGF2ZSBwcm9jZXNz
ZWQgdGhlIGJsb2NrJ3MgcHJlZGVjZXNzb3IgYmVjYXVzZSB3ZQorICAgICAgICAvLyBhcmUgdXNp
bmcgUlBPLgorICAgICAgICBWZWN0b3I8Tm9kZSo+IHRvUmVtb3ZlOworICAgICAgICBib29sIGNo
YW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IG1fcmVsYXRpb25zaGlw
c0F0SGVhZFt0YXJnZXRdKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSByZWxhdGlvbnNoaXBN
YXAuZmluZChlbnRyeS5rZXkpOworICAgICAgICAgICAgaWYgKGl0ZXIgPT0gcmVsYXRpb25zaGlw
TWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGVudHJ5LmtleSk7
CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZlY3RvcjxSZWxh
dGlvbnNoaXA+IHZhbHVlczsKKyAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHRhcmdldFJl
bGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlv
bnNoaXAgc291cmNlUmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgIE1l
cmdpbmcgIiwgdGFyZ2V0UmVsYXRpb25zaGlwLCAiIGFuZCAiLCBzb3VyY2VSZWxhdGlvbnNoaXAs
ICI6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVsYXRpb25zaGlwLm1lcmdlKAor
ICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUmVsYXRpb25zaGlwLAorICAgICAgICAgICAg
ICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwgbmV3UmVsYXRpb25zaGlwLCAiXG4iKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBXZSBuZWVkIHRvIGZpbHRlcigpIHRvIGF2b2lkIGV4cG9uZW50aWFsIGV4cGxvc2lvbiBvZiBp
ZGVudGljYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLiBX
ZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgbWFraW5nIHNldE9uZVNpZGUoKSBzbworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgd29yaywgc2luY2Ugd2UgZXhwZWN0IHNldE9uZVNp
ZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
ZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUuIEF0IHNvbWUgcG9pbnQgc29tZW9uZSBtaWdo
dCBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdHdvIHJlbGF0aW9u
c2hpcHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQgQGEgPCBAYiArIEQuIFRoZW4KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBzb21lb25lIGRvZXMgYSBzZXRSZWxhdGlvbnNoaXAoKSBwYXNz
aW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
Ym90aCBvZiB0aGVzZSBpbnRvIEBhID09IEBiLiBOb3cgd2UgaGF2ZSBAYSA9PSBAYiBkdXBsaWNh
dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIHNheSB0aGF0IHRoaXMg
ZHVwbGljYXRlIEBhID09IEBiIGVuZHMgdXAgYXQgdGhlIGhlYWQgb2YgYQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdlIGRpZG4ndCBoYXZlIHRoaXMgcnVsZSwgdGhl
biB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRvIHRoZSBleGlzdGluZyBkdXBsaWNhdGUgQGEgPT0g
QGIncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSB3b3VsZCBiZSBmb3Vy
IHBhaXJzIG9mIEBhID09IEBiLCBlYWNoIG9mIHdoaWNoIHdvdWxkCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEBhID09IEBiLiBXZSBhdm9pZCB0aGlzIGhlcmUg
YnkgZG9pbmcgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRyYXRpb24u
IFRoYXQgbWlnaHQgYmUgYSBiaXQgb2Ygb3ZlcmtpbGwsIHNpbmNlIGl0J3MgcHJvYmFibHkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHRoZSBpZGVudGljYWwgZHVwbGljYXRl
IHJlbGF0aW9uc2hpcCBjYXNlIHdlIHdhbnQnIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gYXZvaWQuIEJ1dCwgSSdsbCBrZWVwIHRoaXMgdW50aWwgd2UgaGF2ZSBldmlkZW5jZSB0
aGF0IHRoaXMgaXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNl
IHByb2JsZW0uIFJlbWVtYmVyIC0gd2UgYXJlIGFscmVhZHkgZGVhbGluZyB3aXRoIGEKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24gdG8gcmVs
YXRpb25zaGlwcyB3aXRoIGlkZW50aWNhbCBsZWZ0CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gb3BlcmFuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9u
c2hpcCYgZXhpc3RpbmdSZWxhdGlvbnNoaXAgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKG5ld1Jl
bGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0
aW9uc2hpcCBmaWx0ZXJlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZXhpc3RpbmdSZWxhdGlvbnNoaXAuZmlsdGVyKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWQpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0aW9uc2hpcCA9IGZpbHRl
cmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBw
ZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnNvcnQodmFsdWVz
LmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgICAgICAgICAgICBpZiAoZW50cnkudmFsdWUgPT0g
dmFsdWVzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgCisgICAgICAg
ICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlczsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwor
ICAgICAgICB9CisgICAgICAgIGZvciAoTm9kZSogbm9kZSA6IHRvUmVtb3ZlKQorICAgICAgICAg
ICAgbV9yZWxhdGlvbnNoaXBzQXRIZWFkW3RhcmdldF0ucmVtb3ZlKG5vZGUpOworICAgICAgICAK
KyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgfQorICAgICAgICAKKyAgICBWZWN0b3I8UmVs
YXRpb25zaGlwPiBzb3J0ZWRSZWxhdGlvbnNoaXBzKGNvbnN0IFJlbGF0aW9uc2hpcE1hcCYgcmVs
YXRpb25zaGlwcykKKyAgICB7CisgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHJlc3VsdDsK
KyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IHJlbGF0aW9uc2hpcHMpCisgICAgICAgICAgICBy
ZXN1bHQuYXBwZW5kVmVjdG9yKGVudHJ5LnZhbHVlKTsKKyAgICAgICAgc3RkOjpzb3J0KHJlc3Vs
dC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
KyAgICAKKyAgICBWZWN0b3I8UmVsYXRpb25zaGlwPiBzb3J0ZWRSZWxhdGlvbnNoaXBzKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBzb3J0ZWRSZWxhdGlvbnNoaXBzKG1fcmVsYXRpb25zaGlwcyk7
CisgICAgfQorICAgIAorICAgIE5vZGUqIG1femVybzsKKyAgICBSZWxhdGlvbnNoaXBNYXAgbV9y
ZWxhdGlvbnNoaXBzOworICAgIEJsb2NrU2V0IG1fc2VlbkJsb2NrczsKKyAgICBCbG9ja01hcDxS
ZWxhdGlvbnNoaXBNYXA+IG1fcmVsYXRpb25zaGlwc0F0SGVhZDsKKyAgICBJbnNlcnRpb25TZXQg
bV9pbnNlcnRpb25TZXQ7Cit9OworICAgIAorfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2Jv
b2wgcGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXphdGlvbihHcmFwaCYgZ3JhcGgpCit7CisgICAg
U2FtcGxpbmdSZWdpb24gc2FtcGxpbmdSZWdpb24oIkRGRyBJbnRlZ2VyIFJhbmdlIE9wdGltaXph
dGlvbiBQaGFzZSIpOworICAgIHJldHVybiBydW5QaGFzZTxJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRp
b25QaGFzZT4oZ3JhcGgpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCisKKyNlbmRp
ZiAvLyBFTkFCTEUoREZHX0pJVCkKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0
aW1pemF0aW9uUGhhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgREZHSW50ZWdl
clJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAorI2RlZmluZSBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZV9oCisKKyNpZiBFTkFCTEUoREZHX0pJVCkKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBERkcgeworCitjbGFzcyBHcmFwaDsKKworLy8gUmVtb3ZlcyBvdmVyZmxvdyBjaGVj
a3MgYW5kIG91dC1vZi1ib3VuZHMgY2hlY2tzIGJ5IGRvaW5nIGEgZm9yd2FyZCBmbG93IGFuYWx5
c2lzIHRvIHByb3ZlCisvLyBpbmVxdWFsaXRpZXMuCisKK2Jvb2wgcGVyZm9ybUludGVnZXJSYW5n
ZU9wdGltaXphdGlvbihHcmFwaCYpOworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCisKKyNl
bmRpZiAvLyBFTkFCTEUoREZHX0pJVCkKKworI2VuZGlmIC8vIERGR0ludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlX2gKKwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdQbGFu
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4uY3Bw
CShyZXZpc2lvbiAxODUzNjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSAiREZHRml4dXBQ
aGFzZS5oIgogI2luY2x1ZGUgIkRGR0dyYXBoU2FmZXBvaW50LmgiCiAjaW5jbHVkZSAiREZHSW50
ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuaCIKKyNpbmNsdWRlICJERkdJbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb25QaGFzZS5oIgogI2luY2x1ZGUgIkRGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9u
UGhhc2UuaCIKICNpbmNsdWRlICJERkdKSVRDb21waWxlci5oIgogI2luY2x1ZGUgIkRGR0xJQ01Q
aGFzZS5oIgpAQCAtMzU3LDYgKzM1OCw4IEBAIFBsYW46OkNvbXBpbGF0aW9uUGF0aCBQbGFuOjpj
b21waWxlSW5UaHIKICAgICAgICAgcGVyZm9ybUNvbnN0YW50SG9pc3RpbmcoZGZnKTsKICAgICAg
ICAgcGVyZm9ybUdsb2JhbENTRShkZmcpOwogICAgICAgICBwZXJmb3JtTGl2ZW5lc3NBbmFseXNp
cyhkZmcpOworICAgICAgICBwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKGRmZyk7Cisg
ICAgICAgIHBlcmZvcm1MaXZlbmVzc0FuYWx5c2lzKGRmZyk7CiAgICAgICAgIHBlcmZvcm1DRkEo
ZGZnKTsKICAgICAgICAgcGVyZm9ybUNvbnN0YW50Rm9sZGluZyhkZmcpOwogICAgICAgICBwZXJm
b3JtQ2xlYW5VcChkZmcpOyAvLyBSZWR1Y2UgdGhlIGdyYXBoIHNpemUgYSBsb3QuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254684</attachid>
            <date>2015-06-10 15:37:04 -0700</date>
            <delta_ts>2015-06-16 13:28:55 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>72927</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg1NDI5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM3IEBA
CisyMDE1LTA2LTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIGFk
ZHMgYSBwaGFzZSB0aGF0IGRvZXMgZm9yd2FyZCBwcm9wYWdhdGlvbiBvZiBpbnRlZ2VyIGluZXF1
YWxpdGllcy4gVGhpcyBhbGxvd3MgdXMKKyAgICAgICAgdG8gZG8gdGhlIGFsZ2VicmFpYyByZWFz
b25pbmcgd2UgbmVlZCB0byBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcy4g
SXQKKyAgICAgICAgYWxzbyBlbGltaW5hdGVzIG92ZXJmbG93IGNoZWNrcyBvbiBBcml0aEFkZCB3
aXRoIGEgY29uc3RhbnQuCisgICAgICAgIAorICAgICAgICBUaGUgcGhhc2UncyBhbmFseXNpcyBw
cm9kdWNlcyByZXN1bHRzIHRoYXQgYXJlIHBvd2VyZnVsIGVub3VnaCB0byBkbyBzcGVjdWxhdGl2
ZSBib3VuZHMKKyAgICAgICAgY2hlY2sgaG9pc3RpbmcsIGJ1dCB0aGlzIHBoYXNlIGN1cnJlbnRs
eSBvbmx5IGRvZXMgZWxpbWluYXRpb24uIFdlIGNhbiBpbXBsZW1lbnQKKyAgICAgICAgaG9pc3Rp
bmcgbGF0ZXIuCisgICAgICAgIAorICAgICAgICBPbiBwcm9ncmFtcyB0aGF0IGp1c3QgbG9vcCBv
dmVyIGFuIGFycmF5IGxpa2U6CisgICAgICAgIAorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBhcnJheS5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICB0aGluZ3kgKz0gYXJyYXlb
aV0KKyAgICAgICAgCisgICAgICAgIFRoaXMgY2hhbmdlIGlzIGEgNjAlIHNwZWVkLXVwLgorICAg
ICAgICAKKyAgICAgICAgVGhpcyBpcyBhbHNvIGEgfjMlIHNwZWVkLXVwIG9uIEtyYWtlbiwgYW5k
IGl0IHNob3dzIHZhcmlvdXMgc3BlZWQtdXBzIG9uIGluZGl2aWR1YWwKKyAgICAgICAgdGVzdHMg
aW4gT2N0YW5lLgorCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNj
cmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qOgorICAgICAgICAqIEphdmFT
Y3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChKU0M6OkRG
Rzo6cGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXphdGlvbik6CisgICAgICAgICogZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmg6IEFkZGVkLgorICAgICAgICAqIGRmZy9ERkdQ
bGFuLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpQbGFuOjpjb21waWxlSW5UaHJlYWRJbXBsKToK
KwogMjAxNS0wNi0xMCAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAg
IERGRyBBU1NFUlRJT04gRkFJTEVEOiAhaXRlcmF0ZSgpIG9uIHN0cmVzcy9zaW5nbGV0b24tc2Nv
cGUtdGhlbi1vdmVyd3JpdGUuanMuZnRsLWVhZ2VyCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0NN
YWtlTGlzdHMudHh0CShyZXZpc2lvbiAxODU0MjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Q01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTE4MSw2ICsxODEsNyBAQCBzZXQoSmF2
YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGRmZy9ERkdJblBsYWNlQWJzdHJhY3RTdGF0ZS5jcHAK
ICAgICBkZmcvREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuY3BwCiAgICAgZGZnL0RGR0ludGVn
ZXJDaGVja0NvbWJpbmluZ1BoYXNlLmNwcAorICAgIGRmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSW52YWxpZGF0aW9uUG9pbnRJbmplY3Rpb25QaGFz
ZS5jcHAKICAgICBkZmcvREZHSklUQ29kZS5jcHAKICAgICBkZmcvREZHSklUQ29tcGlsZXIuY3Bw
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmN4cHJvai9KYXZh
U2NyaXB0Q29yZS52Y3hwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2oJKHJldmlzaW9uIDE4
NTQyOSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0ph
dmFTY3JpcHRDb3JlLnZjeHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTQxOCw2ICs0MTgsNyBAQAog
ICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0luUGxhY2VBYnN0cmFjdFN0YXRlLmNw
cCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnNlcnRPU1JIaW50c0Zv
clVwZGF0ZS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdl
ckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5c
ZGZnXERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21w
aWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnZhbGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmNw
cCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmNwcCIgLz4K
ICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb21waWxlci5jcHAiIC8+CkBA
IC0xMTEyLDYgKzExMTMsNyBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0lu
c2VydE9TUkhpbnRzRm9yVXBkYXRlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxk
ZmdcREZHSW5zZXJ0aW9uU2V0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdc
REZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1
ZGU9Ii4uXGRmZ1xERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIiAvPgogICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhh
c2UuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmgiIC8+
CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSklUQ29tcGlsZXIuaCIgLz4KSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODU0MjkpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBDMTEw
MDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdCcmFu
Y2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0OUEz
QkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVT
ID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdT
dHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVB
YnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJ
bnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIyNzY4
OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5RjAw
ODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkwMTAw
RUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAgKi87
IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAwRUQ3
OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFs
UGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwICov
OyB9OwpAQCAtMjE2MCw2ICsyMTYyLDggQEAKIAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlBIC8q
IERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBE
RkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8qIEJ5
dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVjb2Rl
VXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUyM0Mw
MDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBwYXRo
ID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdlT3B0
aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0g
REZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0ludGVn
ZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
bmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0gZGZn
L0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFERjA5
MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRoID0g
ZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwpAQCAtNDk5MCw2ICs0OTk0LDggQEAKIAkJCQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUgLyog
REZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0MDBB
NkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBGMzAw
QjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5oICov
LAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjExOTAw
MkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAogCQkJ
CTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVjdGlv
blBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENvZGUu
Y3BwICovLApAQCAtNTYyNyw2ICs1NjMzLDcgQEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4NDVE
OTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTBG
NkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4gSGVh
ZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdl
T3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZCREUw
MDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4MUFB
OTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJCTUy
QzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8sCkBA
IC03MzY2LDYgKzczNzMsNyBAQAogCQkJCTBGMkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBKU0Fy
cmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0MDBG
NjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEzNTlC
MEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4OThG
MzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0JvdW5k
RnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVGMDYx
IC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQwRjg5
MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2VzICov
LApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJ
VCkKKworI2luY2x1ZGUgIkRGR0Jsb2NrTWFwSW5saW5lcy5oIgorI2luY2x1ZGUgIkRGR0dyYXBo
LmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisjaW5jbHVkZSAiREZHUGhhc2UuaCIK
KyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25QaGFzZS5oIgorI2luY2x1ZGUgIkRG
R1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgYm9v
bCB2ZXJib3NlID0gZmFsc2U7CisKK2ludDY0X3QgY2xhbXBlZFN1bUltcGwoKSB7IHJldHVybiAw
OyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitpbnQ2NF90IGNsYW1wZWRTdW1JbXBs
KGludCBsZWZ0LCBBcmdzLi4uIGFyZ3MpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0
X3Q+KGxlZnQpICsgY2xhbXBlZFN1bUltcGwoYXJncy4uLik7Cit9CisKK3RlbXBsYXRlPHR5cGVu
YW1lLi4uIEFyZ3M+CitpbnQgY2xhbXBlZFN1bShBcmdzLi4uIGFyZ3MpCit7CisgICAgaW50NjRf
dCByZXN1bHQgPSBjbGFtcGVkU3VtSW1wbChhcmdzLi4uKTsKKyAgICByZXR1cm4gc3RkOjptaW4o
CisgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6
bWF4KCkpLAorICAgICAgICBzdGQ6Om1heCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0
X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpLAorICAgICAgICAgICAgcmVzdWx0
KSk7Cit9CisKK2NsYXNzIFJlbGF0aW9uc2hpcCB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsK
KyAgICAgICAgTGVzc1RoYW4sCisgICAgICAgIEVxdWFsLAorICAgICAgICBOb3RFcXVhbCwKKyAg
ICAgICAgR3JlYXRlclRoYW4KKyAgICB9OworICAgIAorICAgIHN0YXRpYyBLaW5kIGZsaXBwZWQo
S2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2Ug
TGVzc1RoYW46CisgICAgICAgICAgICByZXR1cm4gR3JlYXRlclRoYW47CisgICAgICAgIGNhc2Ug
RXF1YWw6CisgICAgICAgICAgICByZXR1cm4gRXF1YWw7CisgICAgICAgIGNhc2UgTm90RXF1YWw6
CisgICAgICAgICAgICByZXR1cm4gTm90RXF1YWw7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46
CisgICAgICAgICAgICByZXR1cm4gTGVzc1RoYW47CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgfQorICAg
IAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAgICAgIDogbV9sZWZ0KG51bGxwdHIpCisgICAgICAg
ICwgbV9yaWdodChudWxscHRyKQorICAgICAgICAsIG1fa2luZChFcXVhbCkKKyAgICAgICAgLCBt
X29mZnNldCgwKQorICAgIHsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwKE5vZGUqIGxl
ZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgICAgICA6IG1f
bGVmdChsZWZ0KQorICAgICAgICAsIG1fcmlnaHQocmlnaHQpCisgICAgICAgICwgbV9raW5kKGtp
bmQpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQobV9sZWZ0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9yaWdodCk7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKG1fbGVmdCAhPSBtX3JpZ2h0KTsKKyAgICB9CisgICAgCisgICAgc3Rh
dGljIFJlbGF0aW9uc2hpcCBzYWZlQ3JlYXRlKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5k
IGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFsZWZ0IHx8ICFyaWdo
dCB8fCBsZWZ0ID09IHJpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOwor
ICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKGxlZnQsIHJpZ2h0LCBraW5kLCBvZmZzZXQpOwor
ICAgIH0KKyAgICAKKyAgICB0eXBlZGVmIHZvaWQqIChSZWxhdGlvbnNoaXA6OipVbnNwZWNpZmll
ZEJvb2xUeXBlKTsKKworICAgIG9wZXJhdG9yIFVuc3BlY2lmaWVkQm9vbFR5cGUqKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2xlZnQgPyByZWludGVycHJldF9jYXN0PFVuc3BlY2lm
aWVkQm9vbFR5cGUqPigxKSA6IDA7CisgICAgfQorICAgIAorICAgIE5vZGUqIGxlZnQoKSBjb25z
dCB7IHJldHVybiBtX2xlZnQ7IH0KKyAgICBOb2RlKiByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1f
cmlnaHQ7IH0KKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0KKyAgICBp
bnQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXQ7IH0KKyAgICAKKyAgICBSZWxhdGlv
bnNoaXAgZmxpcHBlZCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoISp0aGlzKQorICAgICAg
ICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAKKyAgICAgICAgLy8gVGhpcyBz
aG91bGQgcmV0dXJuIFJlbGF0aW9uc2hpcCgpIGlmIC1tX29mZnNldCBvdmVyZmxvd3MuIEZvciBl
eGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQGEgPiBAYiAtIDIqKjMxCisgICAg
ICAgIC8vCisgICAgICAgIC8vIElmIHdlIGZsaXAgaXQgd2UgZ2V0OgorICAgICAgICAvLworICAg
ICAgICAvLyAgICAgQGIgPCBAYSArIDIqKjMxCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4Y2Vw
dCB0aGF0IHRoZSBzaWduIGdldHMgZmxpcHBlZCBzaW5jZSBpdCdzIElOVF9NSU46CisgICAgICAg
IC8vCisgICAgICAgIC8vICAgICBAYiA8IEBhIC0gMioqMzEKKyAgICAgICAgLy8KKyAgICAgICAg
Ly8gQW5kIHRoYXQgbWFrZXMgbm8gc2Vuc2UuIFRvIHNlZSBob3cgbGl0dGxlIHNlbnNlIGl0IG1h
a2VzLCBjb25zaWRlcjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIEBhID4gQHplcm8gLSAy
KiozMQorICAgICAgICAvLworICAgICAgICAvLyBXZSB3b3VsZCBmbGlwIGl0IHRvIG1lYW46Cisg
ICAgICAgIC8vCisgICAgICAgIC8vICAgICBAemVybyA8IEBhIC0gMioqMzEKKyAgICAgICAgLy8K
KyAgICAgICAgLy8gV2hpY2ggaXMgYWJzdXJkLgorICAgICAgICAKKyAgICAgICAgaWYgKG1fb2Zm
c2V0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpCisgICAgICAgICAgICByZXR1
cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlw
KG1fcmlnaHQsIG1fbGVmdCwgZmxpcHBlZChtX2tpbmQpLCAtbV9vZmZzZXQpOworICAgIH0KKyAg
ICAKKyAgICBSZWxhdGlvbnNoaXAgaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAo
ISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAKKyAgICAgICAgc3dp
dGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDoKKyAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBOb3RFcXVhbCwgbV9vZmZzZXQpOworICAgICAg
ICBjYXNlIE5vdEVxdWFsOgorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQs
IG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCk7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAg
ICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIC0xKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25z
aGlwKG1fbGVmdCwgbV9yaWdodCwgR3JlYXRlclRoYW4sIG1fb2Zmc2V0IC0gMSk7CisgICAgICAg
IGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9v
ZmZzZXQsIDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAg
ICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgbV9v
ZmZzZXQgKyAxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBpc0Nhbm9uaWNhbCgpIGNvbnN0
IHsgcmV0dXJuIG1fbGVmdCA8IG1fcmlnaHQ7IH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgY2Fu
b25pY2FsKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0Nhbm9uaWNhbCgpKQorICAgICAg
ICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICByZXR1cm4gZmxpcHBlZCgpOworICAgIH0KKyAg
ICAKKyAgICBib29sIHNhbWVOb2Rlc0FzKGNvbnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID09IG90aGVyLm1fbGVmdAorICAgICAgICAg
ICAgJiYgbV9yaWdodCA9PSBvdGhlci5tX3JpZ2h0OworICAgIH0KKyAgICAKKyAgICBib29sIG9w
ZXJhdG9yPT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBzYW1lTm9kZXNBcyhvdGhlcikKKyAgICAgICAgICAgICYmIG1fa2luZCA9PSBvdGhl
ci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0OworICAg
IH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9Cisg
ICAgCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgIT0gb3RoZXIubV9sZWZ0KQorICAgICAgICAgICAg
cmV0dXJuIG1fbGVmdCA8IG90aGVyLm1fbGVmdDsKKyAgICAgICAgaWYgKG1fcmlnaHQgIT0gb3Ro
ZXIubV9yaWdodCkKKyAgICAgICAgICAgIHJldHVybiBtX3JpZ2h0IDwgb3RoZXIubV9yaWdodDsK
KyAgICAgICAgaWYgKG1fa2luZCAhPSBvdGhlci5tX2tpbmQpCisgICAgICAgICAgICByZXR1cm4g
bV9raW5kIDwgb3RoZXIubV9raW5kOworICAgICAgICByZXR1cm4gbV9vZmZzZXQgPCBvdGhlci5t
X29mZnNldDsKKyAgICB9CisgICAgCisgICAgLy8gSWYgcG9zc2libGUsIHJldHVybnMgYSBmb3Jt
IG9mIHRoaXMgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSBnaXZlbiBub2RlIGlzIHRoZSBsZWZ0Cisg
ICAgLy8gc2lkZS4gUmV0dXJucyBhIG51bGwgcmVsYXRpb25zaGlwIGlmIHRoaXMgcmVsYXRpb25z
aGlwIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgdGhpcworICAgIC8vIG5vZGUuCisgICAgUmVs
YXRpb25zaGlwIGZvck5vZGUoTm9kZSogbm9kZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X2xlZnQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgaWYgKG1f
cmlnaHQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBmbGlwcGVkKCk7CisgICAgICAgIHJl
dHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRMZWZ0KE5vZGUq
IGxlZnQpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChsZWZ0ICE9IG1fcmlnaHQpOwor
ICAgICAgICBtX2xlZnQgPSBsZWZ0OworICAgIH0KKyAgICBib29sIGFkZFRvT2Zmc2V0KGludCBv
ZmZzZXQpCisgICAgeworICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIG9m
ZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIG1fb2Zmc2V0ICs9IG9m
ZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8vIEF0dGVtcHRz
IHRvIGNhbGwgZnVuY3RvcigpIHdpdGggemVybywgb25lLCBvciB0d28gcmVsYXRpb25zaGlwcyB0
aGF0IHN1bW1hcml6ZSB0aGUKKyAgICAvLyB1bmlvbiBvZiB0aGlzIHJlbGF0aW9uc2hpcCBhbmQg
dGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gVGhlIHJlbGF0aW9uc2hpcHMgcGFzc2VkIHRvIHRoZQor
ICAgIC8vIGZ1bmN0b3IgYXJlIHJlbGF0ZWQgYnkgaW50ZXJzZWN0aW9uLiBOb3QgY2FsbGluZyB0
aGUgZnVuY3RvciBpbXBsaWVzIFRPUC4gRWFjaCBjYWxsIHRvCisgICAgLy8gdGhlIGZ1bmN0b3Ig
Y29uc3RyYWlucyB0aGUgc3RhdGUgc3BhY2UuIEZvciBleGFtcGxlIGlmIHRoaXMgY2FsbHMgdGhl
IGZ1bmN0b3Igd2l0aCByZWwxLAorICAgIC8vIHJlbDIsIC4uLiwgcmVsTiwgeW91IHNob3VsZCBy
ZWFkIGl0IGFzOgorICAgIC8vCisgICAgLy8gICAgIFRPUCAmJiByZWwxICYmIHJlbDIgJiYgLi4u
ICYmIHJlbE4KKyAgICAvLworICAgIC8vIFRoZSAiVE9QIiBpcyB0aGVyZSBpbiBjYXNlIHRoYXQg
dGhlIGZ1bmN0b3IgaXNuJ3QgY2FsbGVkLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+
CisgICAgdm9pZCBtZXJnZShjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyLCBjb25zdCBGdW5jdG9y
JiBmdW5jdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFzYW1lTm9kZXNBcyhvdGhlcikp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBIYW5kbGUgdGhlIHN1
cGVyIG9idmlvdXMgY2FzZSBmaXJzdC4KKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7Cisg
ICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgLy8gVGhpcyBkb2VzIHNvbWUgaW50ZXJlc3RpbmcgcGVybXV0
YXRpb25zIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGR1cGxpY2F0ZSBjb2RlLiBGb3IKKyAgICAg
ICAgLy8gZXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaW5pdGlhbGx5OiBAYSAhPSBA
YiwgQGEgPiBAYgorICAgICAgICAvLyAgICAgICAgICAgIEBiICE9IEBhLCBAYiA8IEBhCisgICAg
ICAgIC8vICAgICAgICAgICAgQGIgPCBAYSwgQGIgIT0gQGEKKyAgICAgICAgLy8gICBmaW5hbGx5
OiBAYiAhPSBhLCBAYiA8IEBhCisgICAgICAgIC8vCisgICAgICAgIC8vIEFub3RoZXIgZXhhbXBs
ZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaW5pdGlhbGx5OiBAYSA8IEBiLCBAYSAhPSBAYgor
ICAgICAgICAvLyAgIGZpbmFsbHk6IEBhICE9IEBiLCBAYSA8IEBiCisKKyAgICAgICAgUmVsYXRp
b25zaGlwIGEgPSAqdGhpczsKKyAgICAgICAgUmVsYXRpb25zaGlwIGIgPSBvdGhlcjsKKyAgICAg
ICAgYm9vbCBuZWVkRmxpcCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgLy8gR2V0IHJpZCBv
ZiBHcmVhdGVyVGhhbi4KKyAgICAgICAgaWYgKGEubV9raW5kID09IEdyZWF0ZXJUaGFuIHx8IGIu
bV9raW5kID09IEdyZWF0ZXJUaGFuKSB7CisgICAgICAgICAgICBhID0gYS5mbGlwcGVkKCk7Cisg
ICAgICAgICAgICBiID0gYi5mbGlwcGVkKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8v
IEluIHJhcmUgY2FzZXMsIHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvIGZsaXAuIEp1c3QgZ2l2ZSB1
cCBvbiBsaWZlIGluIHRob3NlCisgICAgICAgICAgICAvLyBjYXNlcy4KKyAgICAgICAgICAgIGlm
ICghYSB8fCAhYikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIG5lZWRGbGlwID0gdHJ1ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYg
d2Ugc3RpbGwgaGF2ZSBHcmVhdGVyVGhhbiwgdGhlbiBpdCBtZWFucyB0aGF0IHdlIHN0YXJ0ZWQg
d2l0aCBAYSA8IEBiIGFuZAorICAgICAgICAgICAgLy8gQGEgPiBAYi4gVGhhdCdzIHByZXR0eSBt
dWNoIGFsd2F5cyBhIHRhdXRvbG9neTsgd2UgZG9uJ3QgYXR0ZW1wdCB0byBkbyBzbWFydAorICAg
ICAgICAgICAgLy8gdGhpbmdzIGZvciB0aGF0IGNhc2UgZm9yIG5vdy4KKyAgICAgICAgICAgIGlm
IChhLm1fa2luZCA9PSBHcmVhdGVyVGhhbiB8fCBiLm1fa2luZCA9PSBHcmVhdGVyVGhhbikKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1h
a2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYSBMZXNzVGhhbiwgdGhlbiBpdCdzIGZpcnN0LgorICAg
ICAgICBpZiAoYi5tX2tpbmQgPT0gTGVzc1RoYW4pCisgICAgICAgICAgICBzdGQ6OnN3YXAoYSwg
Yik7CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEgTm90
RXF1YWwsIHRoZW4gaXQncyBmaXJzdC4KKyAgICAgICAgaWYgKGIubV9raW5kID09IE5vdEVxdWFs
KQorICAgICAgICAgICAgc3RkOjpzd2FwKGEsIGIpOworICAgICAgICAKKyAgICAgICAgYS5tZXJn
ZUltcGwoCisgICAgICAgICAgICBiLAorICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgcmVs
YXRpb25zaGlwKSB7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRGbGlwKSB7CisgICAgICAgICAg
ICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcC5mbGlwcGVkKCk7CisgICAgICAg
ICAgICAgICAgICAgIGlmICghcmVsYXRpb25zaGlwKQorICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdW5jdG9yKHJlbGF0
aW9uc2hpcCk7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgLy8gQXR0ZW1wdHMg
dG8gY29uc3RydWN0IG9uZSBSZWxhdGlvbnNoaXAgdGhhdCBhZGVxdWF0ZWx5IHN1bW1hcml6ZXMg
dGhlIGludGVyc2VjdGlvbiBvZgorICAgIC8vIHRoaXMgYW5kIG90aGVyLiBSZXR1cm5zIGEgbnVs
bCByZWxhdGlvbnNoaXAgaWYgdGhlIGZpbHRyYXRpb24gc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyB0
d28KKyAgICAvLyBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcy4gUmV0dXJuaW5nIG51bGwgaXMgYWx3
YXlzIHNhZmUgYmVjYXVzZSByZWxhdGlvbnNoaXAgbGlzdHMgaW4KKyAgICAvLyB0aGlzIHBoYXNl
IGFsd2F5cyBpbXBseSBpbnRlcnNlY3Rpb24uIFNvLCB5b3UgY291bGQgc291bmRseSBza2lwIGNh
bGxpbmcgdGhpcyBtZXRob2QgYW5kCisgICAgLy8ganVzdCBwdXQgYm90aCByZWxhdGlvbnNoaXBz
IGludG8gdGhlIGxpc3QuIEJ1dCwgdGhhdCBjb3VsZCBsZWFkIHRoZSBmaXhwb2ludCB0byBkaXZl
cmdlLgorICAgIC8vIEhlbmNlIHRoaXMgd2lsbCBhdHRlbXB0IHRvIGNvbWJpbmUgdGhlIHR3byBy
ZWxhdGlvbnNoaXBzIGludG8gb25lIGFzIGEgY29udmVyZ2VuY2UgaGFjay4KKyAgICAvLyBJbiBz
b21lIGNhc2VzLCBpdCB3aWxsIGRvIHNvbWV0aGluZyBjb25zZXJ2YXRpdmUuIEl0J3MgYWx3YXlz
IHNhZmUgZm9yIHRoaXMgdG8gcmV0dXJuCisgICAgLy8gKnRoaXMsIG9yIHRvIHJldHVybiBvdGhl
ci4gSXQnbGwgZG8gdGhhdCBzb21ldGltZXMsIG1haW5seSB0byBhY2NlbGVyYXRlIGNvbnZlcmdl
bmNlIGZvcgorICAgIC8vIHRoaW5ncyB0aGF0IHdlIGRvbid0IHRoaW5rIGFyZSBpbXBvcnRhbnQg
ZW5vdWdoIHRvIHNsb3cgZG93biB0aGUgYW5hbHlzaXMuCisgICAgUmVsYXRpb25zaGlwIGZpbHRl
cihjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gV2Ug
YXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBtZXJnaW5nIHJlbGF0aW9uc2hpcHMgb3ZlciB0aGUgc2Ft
ZSBub2Rlcy4KKyAgICAgICAgQVNTRVJUKHNhbWVOb2Rlc0FzKG90aGVyKSk7CisgICAgICAgIAor
ICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7Cisg
ICAgICAgIAorICAgICAgICAvLyBGcm9tIGhlcmUgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0d28g
cmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50aWNhbC4gVXN1YWxseSB3ZSB1c2UKKyAgICAgICAg
Ly8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBkaWZmZXJlbnQgb2Zmc2V0cyBhbnl0aW1lIHRoYXQg
ZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldCBpcworICAgICAgICAvLyBpZGVudGljYWwuCisgICAg
ICAgIAorICAgICAgICAvLyBXZSB3YW50IGVxdWFsaXR5IHRvIHRha2UgcHJlY2VkZW50IG92ZXIg
ZXZlcnl0aGluZyBlbHNlLCBhbmQgd2UgZG9uJ3Qgd2FudCBtdWx0aXBsZQorICAgICAgICAvLyBp
bmRlcGVuZGVudCBjbGFpbXMgb2YgZXF1YWxpdHkuIFRoYXQgd291bGQganVzdCBiZSBhIGNvbnRy
YWRpY3Rpb24uIFdoZW4gaXQgZG9lcworICAgICAgICAvLyBoYXBwZW4sIHdlIHdpbGwgYmUgY29u
c2VydmF0aXZlIGluIHRoZSBzZW5zZSB0aGF0IHdlIHdpbGwgcGljayBvbmUuCisgICAgICAgIGlm
IChtX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIGlm
IChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gb3RoZXI7CisgICAg
ICAgIAorICAgICAgICAvLyBVc2VmdWwgaGVscGVyIGZvciBmbGlwcGluZy4KKyAgICAgICAgYXV0
byBmaWx0ZXJGbGlwcGVkID0gWyZdICgpIC0+IFJlbGF0aW9uc2hpcCB7CisgICAgICAgICAgICAv
LyBJZiB3ZSBjYW5ub3QgZmxpcCwgdGhlbiBqdXN0IGNvbnNlcnZhdGl2ZWx5IHJldHVybiAqdGhp
cy4KKyAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBhID0gZmxpcHBlZCgpOworICAgICAgICAgICAg
UmVsYXRpb25zaGlwIGIgPSBvdGhlci5mbGlwcGVkKCk7CisgICAgICAgICAgICBpZiAoIWEgfHwg
IWIpCisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgUmVsYXRpb25z
aGlwIHJlc3VsdCA9IGEuZmlsdGVyKGIpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgcmVzdWx0ID0g
cmVzdWx0LmZsaXBwZWQoKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAg
ICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07
CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAg
ICBpZiAob3RoZXIubV9raW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ug
Y291bGQgZG8gc29tZXRoaW5nIHNtYXJ0ZXIgaGVyZS4gV2UgY291bGQgZXZlbiBrZWVwIGJvdGgg
Tm90RXF1YWwncy4gV2UKKyAgICAgICAgICAgICAgICAvLyB3b3VsZCBuZWVkIHRvIG1ha2Ugc3Vy
ZSB0aGF0IHdlIGNvcnJlY3RseSBjb2xsYXBzZWQgdGhlbSB3aGVuIG1lcmdpbmcuIEJ1dAorICAg
ICAgICAgICAgICAgIC8vIGZvciBub3csIHdlIGp1c3QgcGljayBvbmUgb2YgdGhlbSBhbmQgaG9w
ZSBmb3IgdGhlIGJlc3QuCisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEdyZWF0
ZXJUaGFuKSB7CisgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2Yg
Tm90RXF1YWwuZmlsdGVyKExlc3NUaGFuKS4gCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRl
ckZsaXBwZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQVNT
RVJUKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbik7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHR3
byBjbGFpbXM6CisgICAgICAgICAgICAvLyAgICAgQGEgIT0gQGIgKyBDCisgICAgICAgICAgICAv
LyAgICAgQGEgIDwgQGIgKyBECisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgQyA+
PSBELCB0aGVuIHRoZSBOb3RFcXVhbCBpcyByZWR1bmRhbnQuCisgICAgICAgICAgICAvLyBJZiBD
IDwgRCAtIDEsIHRoZW4gd2UgY291bGQga2VlcCBib3RoLCBidXQgZm9yIG5vdyB3ZSBqdXN0IGtl
ZXAgdGhlIExlc3NUaGFuLgorICAgICAgICAgICAgLy8gSWYgQyA9PSBEIC0gMSwgdGhlbiB0aGUg
TGVzc1RoYW4gY2FuIGJlIHR1cm5lZCBpbnRvOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAg
IC8vICAgICBAYSA8IEBiICsgQworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdGUg
dGhhdCBDID09IHRoaXMubV9vZmZzZXQsIEQgPT0gb3RoZXIubV9vZmZzZXQuCisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmIChtX29mZnNldCA9PSBvdGhlci5tX29mZnNldCAtIDEpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFu
LCBtX29mZnNldCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAg
ICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBOb3RFcXVhbCkK
KyAgICAgICAgICAgIHJldHVybiBvdGhlci5maWx0ZXIoKnRoaXMpOworICAgICAgICAKKyAgICAg
ICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2lu
ZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoCisg
ICAgICAgICAgICAgICAgICAgIG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWluKG1f
b2Zmc2V0LCBvdGhlci5tX29mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICBBU1NFUlQob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAg
ICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihtX29mZnNldCwgLTEpKQorICAgICAgICAgICAgICAg
IHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50
PihvdGhlci5tX29mZnNldCwgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hp
cCgpOworICAgICAgICAgICAgaWYgKG1fb2Zmc2V0IC0gMSA9PSBvdGhlci5tX29mZnNldCArIDEp
CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVx
dWFsLCBtX29mZnNldCAtIDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gUmVs
YXRpb25zaGlwKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFTU0VSVChtX2tpbmQg
PT0gR3JlYXRlclRoYW4pOworICAgICAgICByZXR1cm4gZmlsdGVyRmxpcHBlZCgpOworICAgIH0K
KyAgICAKKyAgICBpbnQgbWluVmFsdWVPZkxlZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYg
KG1fbGVmdC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5h
c0ludDMyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKQorICAg
ICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAg
IAorICAgICAgICBpbnQgbWluUmlnaHRWYWx1ZTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50
MzJDb25zdGFudCgpKQorICAgICAgICAgICAgbWluUmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50
MzIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWluUmlnaHRWYWx1ZSA9IHN0ZDo6bnVt
ZXJpY19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09
IEdyZWF0ZXJUaGFuKQorICAgICAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1
ZSwgbV9vZmZzZXQsIDEpOworICAgICAgICByZXR1cm4gY2xhbXBlZFN1bShtaW5SaWdodFZhbHVl
LCBtX29mZnNldCk7CisgICAgfQorICAgIAorICAgIGludCBtYXhWYWx1ZU9mTGVmdCgpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAobV9sZWZ0LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAg
ICAgIHJldHVybiBtX2xlZnQtPmFzSW50MzIoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tp
bmQgPT0gR3JlYXRlclRoYW4pCisgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0
czxpbnQ+OjptYXgoKTsKKyAgICAgICAgCisgICAgICAgIGludCBtYXhSaWdodFZhbHVlOworICAg
ICAgICBpZiAobV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICBtYXhSaWdo
dFZhbHVlID0gbV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBt
YXhSaWdodFZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAg
CisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pCisgICAgICAgICAgICByZXR1cm4gY2xh
bXBlZFN1bShtYXhSaWdodFZhbHVlLCBtX29mZnNldCwgLTEpOworICAgICAgICByZXR1cm4gY2xh
bXBlZFN1bShtYXhSaWdodFZhbHVlLCBtX29mZnNldCk7CisgICAgfQorICAgIAorICAgIHZvaWQg
ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gVGhpcyBwcmlu
dHMgb3V0IHRoZSByZWxhdGlvbnNoaXAgd2l0aG91dCBhbnkgd2hpdGVzcGFjZSwgbGlrZSBAeDxA
eSs0Mi4gVGhpcworICAgICAgICAvLyBvcHRpbWl6ZXMgZm9yIHRoZSBjbGFyaXR5IG9mIGEgbGlz
dCBvZiByZWxhdGlvbnNoaXBzLiBJdCdzIGVhc2llciB0byByZWFkIHNvbWV0aGluZworICAgICAg
ICAvLyBsaWtlIFtAMTxAMiszLCBAND09QDUtNl0gdGhhbiBpdCB3b3VsZCBiZSBpZiB0aGVyZSB3
YXMgd2hpdGVzcGFjZSBpbnNpZGUgdGhlCisgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuCisgICAg
ICAgIAorICAgICAgICBvdXQucHJpbnQobV9sZWZ0KTsKKyAgICAgICAgc3dpdGNoIChtX2tpbmQp
IHsKKyAgICAgICAgY2FzZSBMZXNzVGhhbjoKKyAgICAgICAgICAgIG91dC5wcmludCgiPCIpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICBvdXQu
cHJpbnQoIj09Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOb3RFcXVhbDoK
KyAgICAgICAgICAgIG91dC5wcmludCgiIT0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIEdyZWF0ZXJUaGFuOgorICAgICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnQobV9yaWdodCk7CisgICAg
ICAgIGlmIChtX29mZnNldCA+IDApCisgICAgICAgICAgICBvdXQucHJpbnQoIisiLCBtX29mZnNl
dCk7CisgICAgICAgIGVsc2UgaWYgKG1fb2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIG91dC5wcmlu
dCgiLSIsIC1zdGF0aWNfY2FzdDxpbnQ2NF90PihtX29mZnNldCkpOworICAgIH0KKyAgICAKK3By
aXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIG1lcmdlSW1w
bChjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSBjb25z
dAorICAgIHsKKyAgICAgICAgQVNTRVJUKHNhbWVOb2Rlc0FzKG90aGVyKSk7CisgICAgICAgIAor
ICAgICAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBndWFyYW50ZWUgdGhh
dDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBXZSBhdm9pZCBoYXZpbmcgbW9yZSB0aGFuIG9u
ZSBSZWxhdGlvbnNoaXAgb3ZlciB0aGUgc2FtZSB0d28gbm9kZXMuIFRoZXJlZm9yZSwgaWYKKyAg
ICAgICAgLy8gICB0aGUgbWVyZ2UgY291bGQgYmUgZXhwcmVzc2VkIGFzIHR3byBSZWxhdGlvbnNo
aXBzLCB3ZSBwcmVmZXIgdG8gaW5zdGVhZCBwaWNrIHRoZQorICAgICAgICAvLyAgIGxlc3MgcHJl
Y2lzZSBzaW5nbGUgUmVsYXRpb25zaGlwIGZvcm0gZXZlbiBpZiB0aGF0IG1lYW5zIFRPUC4gT25l
IGV4Y2VwdGlvbiB0bworICAgICAgICAvLyAgIHRoaXMgaXMgdGhhdCB3ZSBAYSA9PSBAYiArIEMg
YW5kIEBhID09IEBiICsgRCBpbnRvIEBhID4gQGIgKyBDIC0gMSBhbmQKKyAgICAgICAgLy8gICBA
YSA8IEBiICsgRCArIDEuIAorICAgICAgICAvLworICAgICAgICAvLyAtIElmIHRoZSBkaWZmZXJl
bmNlIGJldHdlZW4gdHdvIFJlbGF0aW9uc2hpcHMgaXMganVzdCB0aGUgbV9vZmZzZXQsIHRoZW4g
d2UgY3JlYXRlIGEKKyAgICAgICAgLy8gICBSZWxhdGlvbnNoaXAgdGhhdCBoYXMgYW4gb2Zmc2V0
IG9mIC0xLCAwLCBvciAxLiBUaGlzIGlzIGFuIGVzc2VudGlhbCBjb252ZXJnZW5jZQorICAgICAg
ICAvLyAgIGhhY2suIFdlIG5lZWQgLTEgYW5kIDEgdG8gc3VwcG9ydCA8PSBhbmQgPj0uIFRoaXMg
b3ZlcnJpZGVzIHRoZSBwcmV2aW91cworICAgICAgICAvLyAgIGV4Y2VwdGlvbi4gRm9yIGV4YW1w
bGUsIHdlIHdvdWxkbid0IGFkZCBhIEBhIDwgQGIgKyBEICsgMSByZWxhdGlvbnNoaXAgaWYgRCAr
IDEKKyAgICAgICAgLy8gICB3YXMgbm90IGVxdWFsIHRvIG9uZSBvZiAtMSwgMCwgMS4KKyAgICAg
ICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHVzZSBSZWxhdGlvbnNoaXAoKSB0byBtZWFu
IFRPUC4KKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSByZWxhdGlvbnNoaXBzIGFyZSBpZGVu
dGljYWwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgbGVmdCB0byBkby4KKyAgICAgICAgaWYgKCp0aGlz
ID09IG90aGVyKSB7CisgICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRnJvbSBoZXJlIHdlIGNhbiBh
c3N1bWUgdGhhdCB0aGUgdHdvIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBpZGVudGljYWwuIFVzdWFs
bHkgd2UgdXNlCisgICAgICAgIC8vIHRoaXMgdG8gYXNzdW1lIHRoYXQgd2UgZGlmZmVyZW50IG9m
ZnNldHMgYW55dGltZSB0aGF0IGV2ZXJ5dGhpbmcgYnV0IHRoZSBvZmZzZXQgaXMKKyAgICAgICAg
Ly8gaWRlbnRpY2FsLgorICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBOb3RFcXVhbCkg
eworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAg
ICAgICByZXR1cm47IC8vIERpZmZlcmVudCBvZmZzZXRzLCBzbyB0YXV0b2xvZ3kuCisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpIHsKKyAgICAgICAg
ICAgICAgICBpZiAobV9vZmZzZXQgIT0gb3RoZXIubV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAg
ICAgICAgLy8gU2F5aW5nIHRoYXQgeW91IG1pZ2h0IGJlIEIgd2hlbiB5b3UndmUgYWxyZWFkeSBz
YWlkIHRoYXQgeW91J3JlIGFueXRoaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBBLCB3
aGVyZSBBIGFuZCBCIGFyZSBkaWZmZXJlbnQsIGlzIGEgdGF1dG9sb2d5LiBZb3UgY291bGQganVz
dCBzYXkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB5b3UncmUgYW55dGhpbmcgYnV0IEEu
CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNhbWUgb2Zmc2V0czogd2UncmUgc2F5aW5n
IHRoYXQgeW91J3JlIGVpdGhlciBBIG9yIHlvdSdyZSBub3QKKyAgICAgICAgICAgICAgICAvLyBl
cXVhbCB0byBBLgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQob3Ro
ZXIubV9raW5kID09IExlc3NUaGFuKTsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlc2UgY2xh
aW1zLCBhbmQgd2UncmUgbWVyZ2luZyB0aGVtOgorICAgICAgICAgICAgLy8gICAgIEBhICE9IEBi
ICsgQworICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBECisgICAgICAgICAgICAvLworICAg
ICAgICAgICAgLy8gSWYgd2UgaGF2ZSBDID09IEQsIHRoZW4gdGhlIG1lcmdlIGlzIGNsZWFybHkg
anVzdCB0aGUgTm90RXF1YWwuCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIEMgPCBELCB0aGVu
IHRoZSBtZXJnZSBpcyBhIHRhdXRvbG9neS4KKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgQyA+
IEQsIHRoZW4gd2UgY291bGQga2VlcCBib3RoIGNsYWltcywgYnV0IHdlIGFyZSBjaGVhcCwgc28g
d2UKKyAgICAgICAgICAgIC8vIGRvbid0LiBXZSBqdXN0IHVzZSB0aGUgTm90RXF1YWwuCisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmIChtX29mZnNldCA8IG90aGVyLm1fb2Zmc2V0KQorICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZnVuY3Rvcigq
dGhpcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQg
PT0gTGVzc1RoYW4pIHsKKyAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgb2Zmc2V0
IHRvIHNlbGVjdCB0byBtZXJnZSB0aGVtLiBUaGUgYXBwcm9wcmlhdGUgb2Zmc2V0cyBhcmUKKyAg
ICAgICAgICAgICAgICAvLyAtMSwgMCwgb3IgMS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAvLyBGaXJzdCBmaWd1cmUgb3V0IHdoYXQgb2Zmc2V0IHdlJ2QgbGlrZSB0byB1c2Uu
CisgICAgICAgICAgICAgICAgaW50IGJlc3RPZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3Ro
ZXIubV9vZmZzZXQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhh
dmUgc29tZXRoaW5nIGxpa2UgQGEgPCBAYiArIDIuIFdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHVu
ZGVyIHRoZQorICAgICAgICAgICAgICAgIC8vIC0xLDAsMSBydWxlLgorICAgICAgICAgICAgICAg
IGlmIChiZXN0T2Zmc2V0IDw9IDEpCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRp
b25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0x
KSkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgbGVmdCBp
cyBFcXVhbC4gV2Ugd291bGQgaGF2ZSBlbGltaW5hdGVkIHRoZSBHcmVhdGVyVGhhbidzLCBhbmQK
KyAgICAgICAgICAgIC8vIGlmIHdlIG1lcmdlIExlc3NUaGFuIGFuZCBOb3RFcXVhbCwgdGhlIE5v
dEVxdWFsIGFsd2F5cyBjb21lcyBmaXJzdC4KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90
aGVyLm1fa2luZCA9PSBFcXVhbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoaXMg
aXMgdGhlIHJlYWxseSBpbnRlcmVzdGluZyBjYXNlLiBXZSBoYXZlOgorICAgICAgICAgICAgLy8K
KyAgICAgICAgICAgIC8vICAgICBAYSA8IEBiICsgQworICAgICAgICAgICAgLy8KKyAgICAgICAg
ICAgIC8vIGFuZDoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIg
KyBECisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlJ2QgbGlrZSB0
byByZXR1cm46CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBt
YXgoQywgRCArIDEpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBiZXN0T2Zmc2V0ID0g
c3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRoaW5nIGxpa2UgQGEgPCBAYiArIDIuIFdlIGNhbid0
IGRvIGl0LgorICAgICAgICAgICAgaWYgKGJlc3RPZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAg
ICBmdW5jdG9yKFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBzdGQ6Om1h
eChiZXN0T2Zmc2V0LCAtMSkpKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICAvLyBUaGUgb25seSB0aGluZyBsZWZ0IGlzIEVxdWFsLCBzaW5jZSB3
ZSB3b3VsZCBoYXZlIGdvdHRlbiByaWQgb2YgdGhlIEdyZWF0ZXJUaGFuJ3MuCisgICAgICAgIFJF
TEVBU0VfQVNTRVJUKG1fa2luZCA9PSBFcXVhbCk7CisgICAgICAgIAorICAgICAgICAvLyBXZSB3
b3VsZCBuZXZlciBzZWUgTm90RXF1YWwsIGJlY2F1c2UgdGhvc2UgYWx3YXlzIGNvbWUgZmlyc3Qu
IFdlIHdvdWxkIG5ldmVyCisgICAgICAgIC8vIHNlZSBHcmVhdGVyVGhhbiwgYmVjYXVzZSB3ZSB3
b3VsZCBoYXZlIGVsaW1pbmF0ZWQgdGhvc2UuIFdlIHdvdWxkIG5ldmVyIHNlZQorICAgICAgICAv
LyBMZXNzVGhhbiwgYmVjYXVzZSB0aG9zZSBhbHdheXMgY29tZSBmaXJzdC4KKyAgICAgICAgCisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVyLm1fa2luZCA9PSBFcXVhbCk7CisgICAgICAgIC8v
IFdlIGhhdmUgQGEgPT0gQGIgKyBDIGFuZCBAYSA9PSBAYiArIEQsIHdoZXJlIEMgIT0gRC4gVHVy
biB0aGlzIGludG8gc29tZQorICAgICAgICAvLyBpbmVxdWFsaXR5IHRoYXQgaW52b2x2ZXMgYSBj
b25zdGFudCB0aGF0IGlzIC0xLDAsMS4KKyAgICAgICAgCisgICAgICAgIFJlbGF0aW9uc2hpcCBs
ZXNzVGhhbigKKyAgICAgICAgICAgIG1fbGVmdCwgb3RoZXIubV9yaWdodCwgTGVzc1RoYW4sCisg
ICAgICAgICAgICBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpICsgMSk7CisgICAg
ICAgIAorICAgICAgICBpZiAobGVzc1RoYW4ub2Zmc2V0KCkgPj0gLTEgJiYgbGVzc1RoYW4ub2Zm
c2V0KCkgPD0gMSkKKyAgICAgICAgICAgIGZ1bmN0b3IobGVzc1RoYW4pOworICAgICAgICAKKyAg
ICAgICAgUmVsYXRpb25zaGlwIGdyZWF0ZXJUaGFuKAorICAgICAgICAgICAgbV9sZWZ0LCBvdGhl
ci5tX3JpZ2h0LCBHcmVhdGVyVGhhbiwKKyAgICAgICAgICAgIHN0ZDo6bWluKG1fb2Zmc2V0LCBv
dGhlci5tX29mZnNldCkgLSAxKTsKKyAgICAgICAgaWYgKGdyZWF0ZXJUaGFuLm9mZnNldCgpID49
IC0xICYmIGdyZWF0ZXJUaGFuLm9mZnNldCgpIDw9IDEpCisgICAgICAgICAgICBmdW5jdG9yKGdy
ZWF0ZXJUaGFuKTsKKyAgICB9CisgICAgCisgICAgTm9kZSogbV9sZWZ0OworICAgIE5vZGUqIG1f
cmlnaHQ7CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50IG1fb2Zmc2V0OyAvLyBUaGlzIG9mZnNl
dCBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2UuCit9OworCit0eXBlZGVmIEhhc2hNYXA8Tm9kZSos
IFZlY3RvcjxSZWxhdGlvbnNoaXA+PiBSZWxhdGlvbnNoaXBNYXA7CisKK2NsYXNzIEludGVnZXJS
YW5nZU9wdGltaXphdGlvblBoYXNlIDogcHVibGljIFBoYXNlIHsKK3B1YmxpYzoKKyAgICBJbnRl
Z2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZShHcmFwaCYgZ3JhcGgpCisgICAgICAgIDogUGhhc2Uo
Z3JhcGgsICJpbnRlZ2VyIHJhbmdlIG9wdGltaXphdGlvbiIpCisgICAgICAgICwgbV96ZXJvKG51
bGxwdHIpCisgICAgICAgICwgbV9yZWxhdGlvbnNoaXBzQXRIZWFkKGdyYXBoKQorICAgICAgICAs
IG1faW5zZXJ0aW9uU2V0KGdyYXBoKQorICAgIHsKKyAgICB9CisgICAgCisgICAgYm9vbCBydW4o
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZ3JhcGgubV9mb3JtID09IFNTQSk7CisgICAgICAg
IAorICAgICAgICAvLyBCZWZvcmUgd2UgZG8gYW55dGhpbmcsIG1ha2Ugc3VyZSB0aGF0IHdlIGhh
dmUgYSB6ZXJvIGNvbnN0YW50IGF0IHRoZSB0b3AuCisgICAgICAgIGZvciAoTm9kZSogbm9kZSA6
ICptX2dyYXBoLmJsb2NrKDApKSB7CisgICAgICAgICAgICBpZiAobm9kZS0+aXNJbnQzMkNvbnN0
YW50KCkgJiYgIW5vZGUtPmFzSW50MzIoKSkgeworICAgICAgICAgICAgICAgIG1femVybyA9IG5v
ZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKCFtX3plcm8pIHsKKyAgICAgICAgICAgIG1femVybyA9IG1faW5zZXJ0aW9uU2V0
Lmluc2VydENvbnN0YW50KDAsIE5vZGVPcmlnaW4oKSwganNOdW1iZXIoMCkpOworICAgICAgICAg
ICAgbV9pbnNlcnRpb25TZXQuZXhlY3V0ZShtX2dyYXBoLmJsb2NrKDApKTsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkdy
YXBoIGJlZm9yZSBpbnRlZ2VyIHJhbmdlIG9wdGltaXphdGlvbjpcbiIpOworICAgICAgICAgICAg
bV9ncmFwaC5kdW1wKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoaXMgcGVy
Zm9ybXMgYSBmaXhwb2ludCBvdmVyIHRoZSBibG9ja3MgaW4gcmV2ZXJzZSBwb3N0LW9yZGVyLiBM
b2dpY2FsbHksIHdlCisgICAgICAgIC8vIG1haW50YWluIGEgbGlzdCBvZiByZWxhdGlvbnNoaXBz
IGF0IGVhY2ggcG9pbnQgaW4gdGhlIHByb2dyYW0uIFRoZSBsaXN0IHNob3VsZCBiZQorICAgICAg
ICAvLyByZWFkIGFzIGFuIGludGVyc2VjdGlvbi4gRm9yIGV4YW1wbGUgaWYgd2UgaGF2ZSB7cmVs
MSwgcmVsMiwgLi4uLCByZWxOfSwgeW91IHNob3VsZAorICAgICAgICAvLyByZWFkIHRoaXMgYXM6
CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBUT1AgJiYgcmVsMSAmJiByZWwyICYmIC4uLiAm
JiByZWxOCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGV4cHJlc3Mg
dGhpbmdzIGxpa2U6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYSA+IEBiIC0gNDIgJiYg
QGEgPCBAYiArIDI1CisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1dCBub3QgdGhpbmdzIGxpa2U6
CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYSA8IEBiIC0gNDIgfHwgQGEgPiBAYiArIDI1
CisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIG1lcmdlIHR3byBsaXN0cyBieSBtZXJnaW5nIGVh
Y2ggcmVsYXRpb25zaGlwIGluIG9uZSBsaXN0IHdpdGggZWFjaCByZWxhdGlvbnNoaXAKKyAgICAg
ICAgLy8gaW4gdGhlIG90aGVyIGxpc3QuIE1lcmdpbmcgdHdvIHJlbGF0aW9uc2hpcHMgd2lsbCB5
aWVsZCBhIHJlbGF0aW9uc2hpcCBsaXN0OyBhcyB3aXRoCisgICAgICAgIC8vIGFsbCBzdWNoIGxp
c3RzIGl0IGlzIGFuIGludGVyc2N0aW9uLiBNZXJnaW5nIHJlbGF0aW9uc2hpcHMgb3ZlciBkaWZm
ZXJlbnQgdmFyaWFibGVzCisgICAgICAgIC8vIGFsd2F5cyB5aWVsZHMgdGhlIGVtcHR5IGxpc3Qg
KGkuZS4gVE9QKS4gVGhpcyBtZXJnZSBzdHlsZSBpcyBzb3VuZCBiZWNhdXNlIGlmIHdlCisgICAg
ICAgIC8vIGhhdmU6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAoQSAmJiBCICYmIEMpIHx8
IChEICYmIEUgJiYgRikKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlbiBhIHZhbGlkIG1lcmdl
IGlzIGp1c3Qgb25lIHRoYXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBBLCBCLCBDIGFyZSBhbGwgdHJ1
ZSwgb3IKKyAgICAgICAgLy8gdGhhdCB3aWxsIHJldHVybiB0cnVlIGlmIEQsIEUsIEYgYXJlIGFs
bCB0cnVlLiBPdXIgbWVyZ2Ugc3R5bGUgZXNzZW50aWFsbHkgZG9lczoKKyAgICAgICAgLy8KKyAg
ICAgICAgLy8gICAgIChBIHx8IEQpICYmIChBIHx8IEUpICYmIChBIHx8IEYpICYmIChCIHx8IEQp
ICYmIChCIHx8IEUpICYmIChCIHx8IEYpICYmCisgICAgICAgIC8vICAgICAgICAgKEMgfHwgRCkg
JiYgKEMgfHwgRSkgJiYgKEMgfHwgRikKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgQSAmJiBC
ICYmIEMgaXMgdHJ1ZSwgdGhlbiB0aGlzIHJldHVybnMgdHJ1ZS4gSWYgRCAmJiBFICYmIEYgaXMg
dHJ1ZSwgdGhpcyBhbHNvCisgICAgICAgIC8vIHJldHVybnMgdHJ1ZS4KKyAgICAgICAgLy8KKyAg
ICAgICAgLy8gV2hpbGUgdGhpcyBhcHBlYXJzIGF0IGZpcnN0IGxpa2UgYSBraW5kIG9mIGV4cHJl
c3Npb24gZXhwbG9zaW9uLCBpbiBwcmFjdGljZSBpdAorICAgICAgICAvLyBpc24ndC4gVGhlIGNv
ZGUgdGhhdCBoYW5kbGVzIHRoaXMga25vd3MgdGhhdCB0aGUgbWVyZ2Ugb2YgdHdvIHJlbGF0aW9u
c2hpcHMgb3ZlcgorICAgICAgICAvLyBkaWZmZXJlbnQgdmFyaWFibGVzIGlzIFRPUCAoaS5lLiB0
aGUgZW1wdHkgbGlzdCkuIEZvciBleGFtcGxlIGlmIEEgYWJvdmUgaXMgQGEgPCBAYgorICAgICAg
ICAvLyBhbmQgQiBhYm92ZSBpcyBAYyA+IEBkLCB3aGVyZSBAYSwgQGIsIEBjLCBhbmQgQGQgYXJl
IGRpZmZlcmVudCBub2RlcywgdGhlIG1lcmdlIHdpbGwKKyAgICAgICAgLy8geWllbGQgbm90aGlu
Zy4gSW4gZmFjdCwgdGhlIG1lcmdlIGFsZ29yaXRobSB3aWxsIHNraXAgc3VjaCBtZXJnZXMgZW50
aXJlbHkgYmVjYXVzZQorICAgICAgICAvLyB0aGUgcmVsYXRpb25zaGlwIGxpc3RzIGFyZSBhY3R1
YWxseSBrZXllZCBieSBub2RlLgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgaXQn
cyBhbHdheXMgc2FmZSB0byBkcm9wIGFueSBvZiByZWxhdGlvbnNoaXAgZnJvbSB0aGUgcmVsYXRp
b25zaGlwIGxpc3QuCisgICAgICAgIC8vIFRoaXMgbWVyZWx5IGluY3JlYXNlcyB0aGUgbGlrZWxp
aG9vZCBvZiB0aGUgImV4cHJlc3Npb24iIHlpZWxkaW5nIHRydWUsIGkuZS4gYmVpbmcKKyAgICAg
ICAgLy8gY2xvc2VyIHRvIFRPUC4gT3B0aW1pemF0aW9ucyBhcmUgb25seSBwZXJmb3JtZWQgaWYg
d2UgY2FuIGVzdGFibGlzaCB0aGF0IHRoZQorICAgICAgICAvLyBleHByZXNzaW9uIGltcGxpZWQg
YnkgdGhlIHJlbGF0aW9uc2hpcCBsaXN0IGlzIGZhbHNlIGZvciBhbGwgb2YgdGhvc2UgY2FzZXMg
d2hlcmUKKyAgICAgICAgLy8gc29tZSBjaGVjayB3b3VsZCBoYXZlIGZhaWxlZC4KKyAgICAgICAg
Ly8KKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gbm90aW9uIG9mIEJPVFRPTSBiZWNhdXNlIHdlIHRy
ZWF0IGJsb2NrcyB0aGF0IGhhdmVuJ3QgaGFkIHRoZWlyCisgICAgICAgIC8vIHN0YXRlLWF0LWhl
YWQgc2V0IGFzIGEgc3BlY2lhbCBjYXNlOiB3ZSBqdXN0IHRyYW5zZmVyIGFsbCBsaXZlIHJlbGF0
aW9uc2hpcHMgdG8gc3VjaAorICAgICAgICAvLyBhIGJsb2NrLiBBZnRlciB0aGUgaGVhZCBvZiBh
IGJsb2NrIGlzIHNldCwgd2UgcGVyZm9ybSB0aGUgbWVyZ2luZyBhcyBhYm92ZS4gSW4gYWxsCisg
ICAgICAgIC8vIG90aGVyIHBsYWNlcyB3aGVyZSB3ZSB3b3VsZCBvcmRpbmFyaWx5IG5lZWQgQk9U
VE9NLCB3ZSBhcHByb3hpbWF0ZSBpdCBieSBoYXZpbmcgc29tZQorICAgICAgICAvLyBub24tQk9U
VE9NIHJlbGF0aW9uc2hpcC4KKyAgICAgICAgCisgICAgICAgIEJsb2NrTGlzdCBwb3N0T3JkZXIg
PSBtX2dyYXBoLmJsb2Nrc0luUG9zdE9yZGVyKCk7CisgICAgICAgIAorICAgICAgICBib29sIGNo
YW5nZWQgPSB0cnVlOworICAgICAgICB3aGlsZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hh
bmdlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBwb3N0T3JkZXJJbmRleCA9
IHBvc3RPcmRlci5zaXplKCk7IHBvc3RPcmRlckluZGV4LS07KSB7CisgICAgICAgICAgICAgICAg
QmFzaWNCbG9jayogYmxvY2sgPSBwb3N0T3JkZXJbcG9zdE9yZGVySW5kZXhdOworICAgICAgICAg
ICAgICAgIERGR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIG1fZ3JhcGgsIG51bGxwdHIs
CisgICAgICAgICAgICAgICAgICAgIGJsb2NrID09IG1fZ3JhcGguYmxvY2soMCkgfHwgbV9zZWVu
QmxvY2tzLmNvbnRhaW5zKGJsb2NrKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBt
X3JlbGF0aW9uc2hpcHMgPSBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5k
ZXggPCBibG9jay0+c2l6ZSgpOyArK25vZGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBO
b2RlKiBub2RlID0gYmxvY2stPmF0KG5vZGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlm
ICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiQW5hbHlzaXM6IGF0
ICIsIG5vZGUsICI6ICIsIGxpc3REdW1wKHNvcnRlZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOwor
ICAgICAgICAgICAgICAgICAgICBleGVjdXRlTm9kZShub2RlKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTm93IGNvbWVzIHBlcmhhcHMg
dGhlIG1vc3QgaW1wb3J0YW50IHBpZWNlIG9mIGNsZXZlcm5lc3M6IGlmIHdlIEJyYW5jaCwgYW5k
CisgICAgICAgICAgICAgICAgLy8gdGhlIHByZWRpY2F0ZSBpbnZvbHZlcyBzb21lIHJlbGF0aW9u
IG92ZXIgaW50ZWdlcnMsIHdlIHByb3BhZ2F0ZSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAv
LyBpbmZvcm1hdGlvbiB0byB0aGUgdGFrZW4gYW5kIG5vdFRha2VuIHBhdGhzLiBUaGlzIGhhbmRs
ZXM6CisgICAgICAgICAgICAgICAgLy8gLSBCcmFuY2ggb24gaW50MzIuCisgICAgICAgICAgICAg
ICAgLy8gLSBCcmFuY2ggb24gTG9naWNhbE5vdCBvbiBpbnQzMi4KKyAgICAgICAgICAgICAgICAv
LyAtIEJyYW5jaCBvbiBjb21wYXJlIG9uIGludDMyJ3MuCisgICAgICAgICAgICAgICAgLy8gLSBC
cmFuY2ggb24gTG9naWNhbE5vdCBvZiBjb21wYXJlIG9uIGludDMyJ3MuCisgICAgICAgICAgICAg
ICAgTm9kZSogdGVybWluYWwgPSBibG9jay0+dGVybWluYWwoKTsKKyAgICAgICAgICAgICAgICBi
b29sIGFscmVhZHlNZXJnZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAodGVybWluYWwt
Pm9wKCkgPT0gQnJhbmNoKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZWxh
dGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIEJyYW5jaERhdGEqIGJyYW5jaERhdGEgPSB0
ZXJtaW5hbC0+YnJhbmNoRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAgICAgYm9vbCBpbnZlcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRl
cm1pbmFsLT5jaGlsZDEoKS0+b3AoKSA9PSBMb2dpY2FsTm90KSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICB0ZXJtaW5hbCA9IHRlcm1pbmFsLT5jaGlsZDEoKS5ub2RlKCk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBpbnZlcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWwtPmNoaWxk
MSgpLnVzZUtpbmQoKSA9PSBJbnQzMlVzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVs
YXRpb25zaGlwID0gUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHRlcm1pbmFsLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlw
OjpOb3RFcXVhbCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBOb2RlKiBjb21wYXJlID0gdGVybWluYWwtPmNoaWxkMSgpLm5vZGUoKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tcGFyZS0+b3AoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAg
ICBjYXNlIENvbXBhcmVTdHJpY3RFcToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29t
cGFyZUxlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCFjb21wYXJlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwg
Y29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgUmVsYXRpb25zaGlwOjpFcXVhbCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxl
c3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0
aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwg
MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3NFcToKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgp
LCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLCAxKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21w
YXJlR3JlYXRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlw
ID0gUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2Rl
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okdy
ZWF0ZXJUaGFuLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXA6OnNh
ZmVDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5j
aGlsZDEoKS5ub2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIC0xKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREZHX0NS
QVNIKG1fZ3JhcGgsIGNvbXBhcmUsICJJbnZhbGlkIGNvbXBhcmlzb24gbm9kZSB0eXBlIik7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0KQorICAgICAgICAgICAg
ICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwLmludmVyc2UoKTsKKyAgICAg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXApIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcE1hcCBmb3JUcnVlID0gbV9yZWxh
dGlvbnNoaXBzOworICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvckZh
bHNlID0gbV9yZWxhdGlvbnNoaXBzOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBkYXRhTG9nKCJEZWFsaW5nIHdpdGggdHJ1ZTpcbiIpOworICAgICAgICAgICAgICAgICAgICAg
ICAgc2V0UmVsYXRpb25zaGlwKGZvclRydWUsIHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwIGludmVyc2UgPSByZWxhdGlvbnNoaXAuaW52ZXJz
ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIkRlYWxpbmcgd2l0aCBmYWxzZTpcbiIp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChmb3JGYWxzZSwg
aW52ZXJzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JUcnVl
LCBicmFuY2hEYXRhLT50YWtlbi5ibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFu
Z2VkIHw9IG1lcmdlVG8oZm9yRmFsc2UsIGJyYW5jaERhdGEtPm5vdFRha2VuLmJsb2NrKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlNZXJnZWQgPSB0cnVlOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFhbHJl
YWR5TWVyZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayogc3VjY2Vz
c29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5n
ZWQgfD0gbWVyZ2VUbyhtX3JlbGF0aW9uc2hpcHMsIHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjaGFuZ2Vk
ID0gZmFsc2U7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2dyYXBoLmJsb2Nr
c0luTmF0dXJhbE9yZGVyKCkpIHsKKyAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwcyA9IG1fcmVs
YXRpb25zaGlwc0F0SGVhZFtibG9ja107CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIG5vZGVJ
bmRleCA9IDA7IG5vZGVJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsrbm9kZUluZGV4KSB7CisgICAg
ICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJsb2NrLT5hdChub2RlSW5kZXgpOworICAgICAgICAg
ICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJUcmFuc2Zv
cm1hdGlvbjogYXQgIiwgbm9kZSwgIjogIiwgbGlzdER1bXAoc29ydGVkUmVsYXRpb25zaGlwcygp
KSwgIlxuIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVGhpcyBlbmRz
IHVwIGJlaW5nIHByZXR0eSBhd2t3YXJkIHRvIHdyaXRlIGJlY2F1c2Ugd2UgbmVlZCB0byBkZWNp
ZGUgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZSBieSB1c2luZyB0aGUgcmVsYXRp
b25zaGlwcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiwgYnV0IHdlIG5lZWQgdG8KKyAgICAgICAgICAg
ICAgICAvLyBjYWxsIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHdlIG9wdGltaXplLgorICAgICAgICAg
ICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQXJpdGhB
ZGQ6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQoSW50
MzJVc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUt
PmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdGVy
ID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKQorICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgICAgICBpbnQgbWluVmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOwor
ICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGlu
dD46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlv
bnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUg
PSBzdGQ6Om1heChtaW5WYWx1ZSwgcmVsYXRpb25zaGlwLm1pblZhbHVlT2ZMZWZ0KCkpOworICAg
ICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBzdGQ6Om1pbihtYXhWYWx1ZSwgcmVsYXRp
b25zaGlwLm1heFZhbHVlT2ZMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4o
bWluVmFsdWUsIG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCkpIHx8CisgICAgICAgICAgICAgICAg
ICAgICAgICBzdW1PdmVyZmxvd3M8aW50PihtYXhWYWx1ZSwgbm9kZS0+Y2hpbGQyKCktPmFzSW50
MzIoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgp
KTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+c2V0QXJpdGhNb2RlKEFyaXRoOjpVbmNoZWNr
ZWQpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBjYXNlIENoZWNrSW5Cb3VuZHM6IHsKKyAgICAgICAgICAgICAgICAgICAg
YXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgICAgICBib29sIG5vbk5lZ2F0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAg
ICAgICAgIGJvb2wgbGVzc1RoYW5MZW5ndGggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAg
Zm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAubWluVmFsdWVPZkxlZnQoKSA+PSAwKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hp
cC5yaWdodCgpID09IG5vZGUtPmNoaWxkMigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpFcXVhbAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPCAwKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzVGhhbkxlbmd0aCA9IHRydWU7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpMZXNzVGhhbgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPD0gMCkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzc1RoYW5MZW5ndGggPSB0cnVlOwor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobm9uTmVnYXRpdmUgJiYgbGVz
c1RoYW5MZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2Nr
LT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnJlbW92ZSgp
OworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUoYmxvY2stPmF0KG5vZGVJbmRleCkpOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAg
ICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBleGVjdXRlTm9kZShOb2RlKiBub2RlKQorICAgIHsK
KyAgICAgICAgc3dpdGNoIChub2RlLT5vcCgpKSB7CisgICAgICAgIGNhc2UgQ2hlY2tJbkJvdW5k
czogeworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0
ZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIG5vZGUtPmNoaWxkMigpLm5vZGUoKSwgUmVsYXRpb25z
aGlwOjpMZXNzVGhhbikpOworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hp
cDo6c2FmZUNyZWF0ZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlw
OjpHcmVhdGVyVGhhbiwgLTEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgICAgICAKKyAgICAgICAgY2FzZSBBcml0aEFkZDogeworICAgICAgICAgICAgLy8gV2UncmUg
b25seSBpbnRlcmVzdGVkIGluIGludDMyIGFkZGl0aW9ucyBhbmQgd2UgY3VycmVudGx5IG9ubHkg
a25vdyBob3cgdG8KKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgbm9uLXdyYXBwaW5nIG9uZXMu
CisgICAgICAgICAgICBpZiAoIW5vZGUtPmlzQmluYXJ5VXNlS2luZChJbnQzMlVzZSkpCisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1FOiBX
ZSBjb3VsZCBoYW5kbGUgdGhlIHVuY2hlY2tlZCBhcml0aG1ldGljIGNhc2UuIFdlIGp1c3QgZG8g
aXQgZG9uJ3QgcmlnaHQKKyAgICAgICAgICAgIC8vIG5vdy4KKyAgICAgICAgICAgIGlmIChub2Rl
LT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSGFuZGxlIGFkZDogQHZhbHVlICsg
Y29uc3RhbnQuCisgICAgICAgICAgICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3Rh
bnQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAg
aW50IG9mZnNldCA9IG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCk7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIC8vIFdlIGFkZCBhIHJlbGF0aW9uc2hpcCBmb3IgQGFkZCA9PSBAdmFsdWUgKyBj
b25zdGFudCwgYW5kIHRoZW4gd2UgY29weSB0aGUKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hp
cHMgZm9yIEB2YWx1ZS4gVGhpcyBnaXZlcyB1cyBhIG9uZS1kZWVwIHZpZXcgb2YgQHZhbHVlJ3Mg
ZXhpc3RpbmcKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMsIHdoaWNoIG1hdGNoZXMgdGhl
IG9uZS1kZWVwIHNlYXJjaCBpbiBzZXRSZWxhdGlvbnNoaXAoKS4KKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcChu
b2RlLCBub2RlLT5jaGlsZDEoKS5ub2RlKCksIFJlbGF0aW9uc2hpcDo6RXF1YWwsIG9mZnNldCkp
OworICAgICAgICAgICAgCisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMu
ZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbV9y
ZWxhdGlvbnNoaXBzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hp
cD4gdG9BZGQ7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlw
IDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZToKKyAgICAg
ICAgICAgICAgICAgICAgLy8gICAgIGFkZDogQXJpdGhBZGQoQHgsIEMpCisgICAgICAgICAgICAg
ICAgICAgIC8vICAgICBAeCBvcCBAeSArIEQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAg
ICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjZXJ0YWlubHkgaG9sZHM6CisgICAgICAg
ICAgICAgICAgICAgIC8vICAgICBAeCA9PSBAYWRkIC0gQworICAgICAgICAgICAgICAgICAgICAv
LworICAgICAgICAgICAgICAgICAgICAvLyBXaGljaCBhbGxvd3MgdXMgdG8gc3Vic3RpdHV0ZToK
KyAgICAgICAgICAgICAgICAgICAgLy8gICAgIEBhZGQgLSBDIG9wIEB5ICsgRAorICAgICAgICAg
ICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGhlbiBjYXJyeSB0aGUg
QyBvdmVyOgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgQGFkZCBvcCBAeSArIEQgKyBDCisg
ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3
UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQo
bmV3UmVsYXRpb25zaGlwLmxlZnQoKSA9PSBub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlbGF0aW9uc2hpcC5y
aWdodCgpID09IG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlwLnNldExlZnQobm9kZSk7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNoaXAuYWRkVG9PZmZzZXQob2Zmc2V0KSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNo
aXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9u
c2hpcCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5v
dyB3ZSB3YW50IHRvIGVzdGFibGlzaCB0aGF0IGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0
IG9mIHRoZSBhZGRpdGlvbiBhcmUKKyAgICAgICAgICAgIC8vIHdpdGhpbiBhIHBhcnRpY3VsYXIg
cmFuZ2Ugb2YgaW50ZWdlcnMuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvZmZzZXQg
PiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0
aGVuIHdlIGtub3cgdGhhdCBAdmFsdWUgPD0gbWF4IC0gMSwgaS5lLiB0aGF0CisgICAgICAgICAg
ICAgICAgLy8gQHZhbHVlIDwgbWF4LgorICAgICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZsb3dz
PGludD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwgLW9mZnNldCwgMSkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAg
ICAgUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4
KCkgLSBvZmZzZXQgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSWYgd2Ug
aGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBAYWRkID49IG1pbiArIDEs
IGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEBhZGQgPiBtaW4uCisgICAgICAgICAgICAg
ICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigp
LCBvZmZzZXQsIC0xKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisg
ICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbm9kZSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkgKyBv
ZmZzZXQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG9mZnNldCA8
IDAgJiYgb2Zmc2V0ICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpIHsKKyAgICAg
ICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSAtIDEiIHRoZW4gd2Uga25vdyB0
aGF0IEB2YWx1ZSA+PSBtaW4gKyAxLCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAdmFs
dWUgPiBtaW4uCisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6Om51
bWVyaWNfbGltaXRzPGludD46Om1pbigpLCBvZmZzZXQsIC0xKSkgeworICAgICAgICAgICAgICAg
ICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+Y2hpbGQx
KCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9mZnNl
dCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFkZDogQHZh
bHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQgQGFkZCA8PSBtYXggLSAxLCBpLmUuIHRoYXQKKyAg
ICAgICAgICAgICAgICAvLyBAYWRkIDwgbWF4LgorICAgICAgICAgICAgICAgIGlmICghc3VtT3Zl
cmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwgLW9mZnNldCwgMSkp
IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUs
IG1femVybywgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC0gb2Zmc2V0ICsgMSksCisgICAg
ICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNh
c2UgR2V0QXJyYXlMZW5ndGg6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlv
bnNoaXAobm9kZSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAtMSkpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFVw
c2lsb246IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBS
ZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxk
MSgpLm5vZGUoKSwgbm9kZS0+cGhpKCksIFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApKTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9k
ZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1fcmVsYXRpb25z
aGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRk
OworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXIt
PnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNo
aXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5waGkoKSA9
PSBuZXdSZWxhdGlvbnNoaXAucmlnaHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2RlLT5w
aGkoKSk7CisgICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXAp
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCBy
ZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlw
KHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxhdGlv
bnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAg
ICAgIHNldFJlbGF0aW9uc2hpcChtX3JlbGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcCwgdGltZVRv
TGl2ZSk7CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICBS
ZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hp
cCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9IDEpCisgICAgeworICAgICAgICBzZXRPbmVTaWRlKHJl
bGF0aW9uc2hpcE1hcCwgcmVsYXRpb25zaGlwLCB0aW1lVG9MaXZlKTsKKyAgICAgICAgc2V0T25l
U2lkZShyZWxhdGlvbnNoaXBNYXAsIHJlbGF0aW9uc2hpcC5mbGlwcGVkKCksIHRpbWVUb0xpdmUp
OworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldE9uZVNpZGUoCisgICAgICAgIFJlbGF0aW9uc2hp
cE1hcCYgcmVsYXRpb25zaGlwTWFwLCBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25l
ZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIGlmICghcmVsYXRpb25zaGlwKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAg
ICAgICBkYXRhTG9nKCIgICAgU2V0dGluZzogIiwgcmVsYXRpb25zaGlwLCAiICh0dGwgPSAiLCB0
aW1lVG9MaXZlLCAiKVxuIik7CisKKyAgICAgICAgYXV0byByZXN1bHQgPSByZWxhdGlvbnNoaXBN
YXAuYWRkKAorICAgICAgICAgICAgcmVsYXRpb25zaGlwLmxlZnQoKSwgVmVjdG9yPFJlbGF0aW9u
c2hpcD4oKSk7CisgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+JiByZWxhdGlvbnNoaXBzID0g
cmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9B
ZGQ7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChSZWxhdGlvbnNo
aXAmIG90aGVyUmVsYXRpb25zaGlwIDogcmVsYXRpb25zaGlwcykgeworICAgICAgICAgICAgaWYg
KG90aGVyUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoUmVsYXRpb25zaGlwIGZpbHRlcmVkID0gb3RoZXJSZWxhdGlvbnNoaXAuZmls
dGVyKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGZpbHRlcmVk
LmxlZnQoKSA9PSByZWxhdGlvbnNoaXAubGVmdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3Ro
ZXJSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0
cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYgb3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09IFJl
bGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAg
ICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgQ29uc2lkZXJpbmc6ICIsIG90aGVyUmVsYXRp
b25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBo
YXZlOgorICAgICAgICAgICAgICAgIC8vICAgICBAYSBvcCBAYiArIEMKKyAgICAgICAgICAgICAg
ICAvLyAgICAgQGEgPT0gQGMgKyBECisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAg
ICAvLyBUaGlzIGltcGxpZXM6CisgICAgICAgICAgICAgICAgLy8gICAgIEBjICsgRCBvcCBAYiAr
IEMKKyAgICAgICAgICAgICAgICAvLyAgICAgQGMgb3AgQGIgKyBDIC0gRAorICAgICAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2hlcmU6IEBhID09IHJlbGF0aW9uc2hpcC5sZWZ0
KCksIEBiID09IHJlbGF0aW9uc2hpcC5yaWdodCgpLAorICAgICAgICAgICAgICAgIC8vIEBhID09
IG90aGVyUmVsYXRpb25zaGlwLmxlZnQoKSwgQGMgPT0gb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQo
KS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlvbnNo
aXAub2Zmc2V0KCkgIT0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSkgeworICAgICAg
ICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlw
OworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLnJpZ2h0KCkgIT0gb3Ro
ZXJSZWxhdGlvbnNoaXAucmlnaHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVs
YXRpb25zaGlwLnNldExlZnQob3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLmFkZFRvT2Zmc2V0KC1vdGhlclJlbGF0
aW9uc2hpcC5vZmZzZXQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBw
ZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgh
Zm91bmQpCisgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChyZWxhdGlvbnNoaXApOwor
ICAgICAgICAKKyAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgYW5vdGhlclJlbGF0aW9uc2hpcCA6
IHRvQWRkKSB7CisgICAgICAgICAgICBBU1NFUlQodGltZVRvTGl2ZSk7CisgICAgICAgICAgICBz
ZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgYW5vdGhlclJlbGF0aW9uc2hpcCwgdGltZVRvTGl2
ZSAtIDEpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGJvb2wgbWVyZ2VUbyhSZWxhdGlv
bnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgIHsKKyAg
ICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIk1lcmdpbmcgdG8gIiwg
cG9pbnRlckR1bXAodGFyZ2V0KSwgIjpcbiIpOworICAgICAgICAgICAgZGF0YUxvZygiICAgIElu
Y29taW5nOiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcE1hcCkp
LCAiXG4iKTsKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBBdCBoZWFkOiAiLCBsaXN0RHVtcChz
b3J0ZWRSZWxhdGlvbnNoaXBzKG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdKSksICJcbiIp
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9zZWVuQmxvY2tzLmFkZCh0YXJn
ZXQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IGJsb2NrLiBXZSBjb3B5IHN1Ympl
Y3QgdG8gbGl2ZW5lc3MgcHJ1bmluZy4KKyAgICAgICAgICAgIGF1dG8gaXNMaXZlID0gWyZdIChO
b2RlKiBub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbV96ZXJvKQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0
LT5zc2EtPmxpdmVBdEhlYWQuY29udGFpbnMobm9kZSk7CisgICAgICAgICAgICB9OworICAgICAg
ICAgICAgCisgICAgICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogcmVsYXRpb25zaGlwTWFwKSB7
CisgICAgICAgICAgICAgICAgaWYgKCFpc0xpdmUoZW50cnkua2V5KSkKKyAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVmVjdG9y
PFJlbGF0aW9uc2hpcD4gdmFsdWVzOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
IHJlbGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VS
VChyZWxhdGlvbnNoaXAubGVmdCgpID09IGVudHJ5LmtleSk7CisgICAgICAgICAgICAgICAgICAg
IGlmIChpc0xpdmUocmVsYXRpb25zaGlwLnJpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIg
IFByb3BhZ2F0aW5nICIsIHJlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAg
ICAgICB2YWx1ZXMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3Rk
Ojpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICAgICAgICAgICAgICAgIG1f
cmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdLmFkZChlbnRyeS5rZXksIHZhbHVlcyk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgLy8gTWVyZ2UgYnkgaW50ZXJzZWN0aW5nLiBXZSBoYXZlIG5vIG5vdGlvbiBvZiBC
T1RUT00sIHNvIHdlIHVzZSB0aGUgb21pc3Npb24gb2YKKyAgICAgICAgLy8gcmVsYXRpb25zaGlw
cyBmb3IgYSBwYWlyIG9mIG5vZGVzIHRvIG1lYW4gVE9QLiBUaGUgcmVhc29uIHdoeSB3ZSBkb24n
dCBuZWVkIEJPVFRPTQorICAgICAgICAvLyBpcyAoMSkgd2UganVzdCBvdmVyYXBwcm94aW1hdGUg
Y29udHJhZGljdGlvbnMgYW5kICgyKSBhIHZhbHVlIG5ldmVyIGhhdmluZyBiZWVuCisgICAgICAg
IC8vIGFzc2lnbmVkIHdvdWxkIG9ubHkgaGFwcGVuIGlmIHdlIGhhdmUgbm90IHByb2Nlc3NlZCB0
aGUgbm9kZSdzIHByZWRlY2Vzc29yLiBXZQorICAgICAgICAvLyBzaG91bGRuJ3QgcHJvY2VzcyBi
bG9ja3MgdW50aWwgd2UgaGF2ZSBwcm9jZXNzZWQgdGhlIGJsb2NrJ3MgcHJlZGVjZXNzb3IgYmVj
YXVzZSB3ZQorICAgICAgICAvLyBhcmUgdXNpbmcgUlBPLgorICAgICAgICBWZWN0b3I8Tm9kZSo+
IHRvUmVtb3ZlOworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChh
dXRvJiBlbnRyeSA6IG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdKSB7CisgICAgICAgICAg
ICBhdXRvIGl0ZXIgPSByZWxhdGlvbnNoaXBNYXAuZmluZChlbnRyeS5rZXkpOworICAgICAgICAg
ICAgaWYgKGl0ZXIgPT0gcmVsYXRpb25zaGlwTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAg
dG9SZW1vdmUuYXBwZW5kKGVudHJ5LmtleSk7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRy
dWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHZhbHVlczsKKyAgICAgICAgICAg
IGZvciAoUmVsYXRpb25zaGlwIHRhcmdldFJlbGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVlKSB7Cisg
ICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgc291cmNlUmVsYXRpb25zaGlwIDogaXRl
ci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIgIE1lcmdpbmcgIiwgdGFyZ2V0UmVsYXRpb25zaGlwLCAi
IGFuZCAiLCBzb3VyY2VSZWxhdGlvbnNoaXAsICI6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAg
dGFyZ2V0UmVsYXRpb25zaGlwLm1lcmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNl
UmVsYXRpb25zaGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAg
bmV3UmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJv
c2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwg
bmV3UmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbHRlcigpIHRvIGF2b2lk
IGV4cG9uZW50aWFsIGV4cGxvc2lvbiBvZiBpZGVudGljYWwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyByZWxhdGlvbnNoaXBzLiBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgbWFraW5n
IHNldE9uZVNpZGUoKSBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgd29y
aywgc2luY2Ugd2UgZXhwZWN0IHNldE9uZVNpZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUu
IEF0IHNvbWUgcG9pbnQgc29tZW9uZSBtaWdodCBzdGFydAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIHdpdGggdHdvIHJlbGF0aW9uc2hpcHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQgQGEg
PCBAYiArIEQuIFRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lb25lIGRv
ZXMgYSBzZXRSZWxhdGlvbnNoaXAoKSBwYXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvZiB0aGVzZSBpbnRvIEBhID09IEBiLiBO
b3cgd2UgaGF2ZSBAYSA9PSBAYiBkdXBsaWNhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIExldCdzIHNheSB0aGF0IHRoaXMgZHVwbGljYXRlIEBhID09IEBiIGVuZHMgdXAgYXQg
dGhlIGhlYWQgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdl
IGRpZG4ndCBoYXZlIHRoaXMgcnVsZSwgdGhlbiB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRvIHRo
ZSBleGlzdGluZyBkdXBsaWNhdGUgQGEgPT0gQGIncy4KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBUaGVyZSB3b3VsZCBiZSBmb3VyIHBhaXJzIG9mIEBhID09IEBiLCBlYWNoIG9mIHdo
aWNoIHdvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEBh
ID09IEBiLiBOb3cgd2UnZCBoYXZlIGZvdXIgb2YgdGhlc2UgZHVwbGljYXRlcworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSdkIGhhdmUg
OCwgdGhlbiAxNiwgZXRjLiBXZSBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IHRoaXMgaGVyZSBieSBkb2luZyB0aGlzIGZpbHRyYXRpb24uIFRoYXQgbWlnaHQgYmUgYSBiaXQg
b2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVya2lsbCwgc2luY2UgaXQncyBw
cm9iYWJseSBqdXN0IHRoZSBpZGVudGljYWwgZHVwbGljYXRlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gcmVsYXRpb25zaGlwIGNhc2Ugd2Ugd2FudCcgdG8gYXZvaWQuIEJ1dCwgSSds
bCBrZWVwIHRoaXMgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZl
IGV2aWRlbmNlIHRoYXQgdGhpcyBpcyBhIHBlcmZvcm1hbmNlIHByb2JsZW0uIFJlbWVtYmVyIC0K
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdp
dGggYSBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyByZWxhdGlvbnNoaXBzIHdpdGggaWRlbnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQgc2hv
dWxkbid0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXJnZSBsaXN0Lgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwJiBleGlzdGluZ1Jl
bGF0aW9uc2hpcCA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoZXhpc3RpbmdSZWxhdGlvbnNoaXAuc2FtZU5vZGVzQXMobmV3UmVsYXRpb25zaGlwKSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIGZpbHRlcmVk
ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0
aW9uc2hpcC5maWx0ZXIobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChmaWx0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGV4aXN0aW5nUmVsYXRpb25zaGlwID0gZmlsdGVyZWQ7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQobmV3UmVsYXRpb25z
aGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVz
LmVuZCgpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS52YWx1ZSA9PSB2YWx1ZXMpCisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVudHJ5LnZhbHVl
ID0gdmFsdWVzOworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAg
ICAgZm9yIChOb2RlKiBub2RlIDogdG9SZW1vdmUpCisgICAgICAgICAgICBtX3JlbGF0aW9uc2hp
cHNBdEhlYWRbdGFyZ2V0XS5yZW1vdmUobm9kZSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4g
Y2hhbmdlZDsKKyAgICB9CisgICAgICAgIAorICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHNvcnRl
ZFJlbGF0aW9uc2hpcHMoY29uc3QgUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBzKQorICAg
IHsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gcmVzdWx0OworICAgICAgICBmb3IgKGF1
dG8mIGVudHJ5IDogcmVsYXRpb25zaGlwcykKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRWZWN0
b3IoZW50cnkudmFsdWUpOworICAgICAgICBzdGQ6OnNvcnQocmVzdWx0LmJlZ2luKCksIHJlc3Vs
dC5lbmQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIFZlY3Rv
cjxSZWxhdGlvbnNoaXA+IHNvcnRlZFJlbGF0aW9uc2hpcHMoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHNvcnRlZFJlbGF0aW9uc2hpcHMobV9yZWxhdGlvbnNoaXBzKTsKKyAgICB9CisgICAgCisg
ICAgTm9kZSogbV96ZXJvOworICAgIFJlbGF0aW9uc2hpcE1hcCBtX3JlbGF0aW9uc2hpcHM7Cisg
ICAgQmxvY2tTZXQgbV9zZWVuQmxvY2tzOworICAgIEJsb2NrTWFwPFJlbGF0aW9uc2hpcE1hcD4g
bV9yZWxhdGlvbnNoaXBzQXRIZWFkOworICAgIEluc2VydGlvblNldCBtX2luc2VydGlvblNldDsK
K307CisgICAgCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworYm9vbCBwZXJmb3JtSW50ZWdl
clJhbmdlT3B0aW1pemF0aW9uKEdyYXBoJiBncmFwaCkKK3sKKyAgICBTYW1wbGluZ1JlZ2lvbiBz
YW1wbGluZ1JlZ2lvbigiREZHIEludGVnZXIgUmFuZ2UgT3B0aW1pemF0aW9uIFBoYXNlIik7Cisg
ICAgcmV0dXJuIHJ1blBoYXNlPEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlPihncmFwaCk7
Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJMRShERkdf
SklUKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9w
dGltaXphdGlvblBoYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRp
b25QaGFzZV9oCisjZGVmaW5lIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gKKwor
I2lmIEVOQUJMRShERkdfSklUKQorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CisK
K2NsYXNzIEdyYXBoOworCisvLyBSZW1vdmVzIG92ZXJmbG93IGNoZWNrcyBhbmQgb3V0LW9mLWJv
dW5kcyBjaGVja3MgYnkgZG9pbmcgYSBmb3J3YXJkIGZsb3cgYW5hbHlzaXMgdG8gcHJvdmUKKy8v
IGluZXF1YWxpdGllcy4KKworYm9vbCBwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKEdy
YXBoJik7CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJMRShE
RkdfSklUKQorCisjZW5kaWYgLy8gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAor
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUGxhbi5jcHAJKHJldmlzaW9uIDE4NTQy
OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUGxhbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJERkdGaXh1cFBoYXNlLmgiCiAjaW5jbHVk
ZSAiREZHR3JhcGhTYWZlcG9pbnQuaCIKICNpbmNsdWRlICJERkdJbnRlZ2VyQ2hlY2tDb21iaW5p
bmdQaGFzZS5oIgorI2luY2x1ZGUgIkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgi
CiAjaW5jbHVkZSAiREZHSW52YWxpZGF0aW9uUG9pbnRJbmplY3Rpb25QaGFzZS5oIgogI2luY2x1
ZGUgIkRGR0pJVENvbXBpbGVyLmgiCiAjaW5jbHVkZSAiREZHTElDTVBoYXNlLmgiCkBAIC0zNTcs
NiArMzU4LDggQEAgUGxhbjo6Q29tcGlsYXRpb25QYXRoIFBsYW46OmNvbXBpbGVJblRocgogICAg
ICAgICBwZXJmb3JtQ29uc3RhbnRIb2lzdGluZyhkZmcpOwogICAgICAgICBwZXJmb3JtR2xvYmFs
Q1NFKGRmZyk7CiAgICAgICAgIHBlcmZvcm1MaXZlbmVzc0FuYWx5c2lzKGRmZyk7CisgICAgICAg
IHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oZGZnKTsKKyAgICAgICAgcGVyZm9ybUxp
dmVuZXNzQW5hbHlzaXMoZGZnKTsKICAgICAgICAgcGVyZm9ybUNGQShkZmcpOwogICAgICAgICBw
ZXJmb3JtQ29uc3RhbnRGb2xkaW5nKGRmZyk7CiAgICAgICAgIHBlcmZvcm1DbGVhblVwKGRmZyk7
IC8vIFJlZHVjZSB0aGUgZ3JhcGggc2l6ZSBhIGxvdC4KSW5kZXg6IExheW91dFRlc3RzL0NoYW5n
ZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4NTQz
MSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI3
IEBACisyMDE1LTA2LTEwICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAg
ICAgRlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcworICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBqcy9yZWdyZXNz
L2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBq
cy9yZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwuaHRtbDogQWRkZWQuCisgICAgICAgICog
anMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLWV4cGVjdGVkLnR4dDogQWRkZWQu
CisgICAgICAgICoganMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmh0bWw6IEFk
ZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJk
LWxvb3AuaHRtbDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9hYmMtc2ltcGxlLWZvcndh
cmQtbG9vcC1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3MvYWJjLXNp
bXBsZS1mb3J3YXJkLWxvb3AuaHRtbDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9zY3Jp
cHQtdGVzdHMvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5qczogQWRkZWQuCisgICAgICAgIChmb28p
OgorICAgICAgICAqIGpzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2FiYy1wb3N0Zml4LWJhY2t3YXJk
LWxvb3AuanM6IEFkZGVkLgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiBqcy9yZWdyZXNzL3Nj
cmlwdC10ZXN0cy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuanM6IEFkZGVkLgorICAgICAgICAo
Zm9vKToKKyAgICAgICAgKiBqcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWZvcndh
cmQtbG9vcC5qczogQWRkZWQuCisgICAgICAgIChmb28pOgorCiAyMDE1LTA2LTEwICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CiAKICAgICAgICAgTW92ZSBhbGwg
Y29udGVudCBleHRlbnNpb24gdGVzdHMgdG8gc2FtZSBkaXJlY3RvcnkgdG8gZml4IGZsYWtpbmVz
cy4KSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC1l
eHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtZm9y
d2FyZC1sb29wLWVxdWFsLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC1leHBlY3RlZC50eHQJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwK
KworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywg
Zm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCisKK1BBU1Mgbm8gZXhjZXB0aW9uIHRocm93
bgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5k
ZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5odG1sCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVh
bC5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtZm9yd2Fy
ZC1sb29wLWVxdWFsLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMiBAQAorPCFET0NU
WVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4K
KzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0Pgor
PC9oZWFkPgorPGJvZHk+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcHJl
LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvYWJjLWZvcndhcmQtbG9v
cC1lcXVhbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jl
c3MtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRl
c3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXBvc3RmaXgtYmFja3dhcmQtbG9v
cC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2Fi
Yy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTAgQEAKK0pTUmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wCisKK09uIHN1
Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2Vk
IGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mg
c3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuaHRtbAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3Au
aHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXBvc3RmaXgt
YmFja3dhcmQtbG9vcC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9D
VFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+
Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4K
KzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXBy
ZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL2FiYy1wb3N0Zml4LWJh
Y2t3YXJkLWxvb3AuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9y
ZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9q
cy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0
VGVzdHMvanMvcmVncmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1s
b29wLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mv
YWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDEwIEBACitKU1JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wCisKK09uIHN1
Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2Vk
IGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mg
c3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLmh0
bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFj
a3dhcmQtbG9vcC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQ
RSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8
c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwv
aGVhZD4KKzxib2R5PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXByZS5q
cyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL2FiYy1zaW1wbGUtYmFja3dh
cmQtbG9vcC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jl
c3MtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRl
c3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLWV4cGVjdGVkLnR4dAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNp
bXBsZS1mb3J3YXJkLWxvb3AtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTAgQEAKK0pTUmVncmVzcy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcAorCitPbiBzdWNjZXNzLCB5
b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVT
VCBDT01QTEVURSIuCisKKworUEFTUyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3Nm
dWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMv
anMvcmVncmVzcy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC5odG1sCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuaHRtbAkocmV2aXNp
b24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3Au
aHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJM
SUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9
Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9k
eT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0
PgorPHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC5qcyI+
PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcG9zdC5qcyI+
PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+
PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNz
L3NjcmlwdC10ZXN0cy9hYmMtZm9yd2FyZC1sb29wLWVxdWFsLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwu
anMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9h
YmMtZm9yd2FyZC1sb29wLWVxdWFsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQgQEAK
K2Z1bmN0aW9uIGZvbyhhcnJheSkgeworICAgIHZhciByZXN1bHQgPSAwOworICAgIGZvciAodmFy
IGkgPSAwOyBpICE9IGFycmF5Lmxlbmd0aDsgKytpKQorICAgICAgICByZXN1bHQgKz0gYXJyYXlb
aV07CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIGFycmF5
ID0gW107Citmb3IgKHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICBhcnJheS5wdXNoKGkp
OworZm9yICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZvbyhhcnJheSk7CkluZGV4
OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2Fy
ZC1sb29wLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRl
c3RzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRU
ZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0aW9uIGZvbyhhcnJheSkgewor
ICAgIHZhciByZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGg7IGktLTsp
CisgICAgICAgIHJlc3VsdCArPSBhcnJheVtpXTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitu
b0lubGluZShmb28pOworCit2YXIgYXJyYXkgPSBbXTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAw
MDsgKytpKQorICAgIGFycmF5LnB1c2goaSk7Citmb3IgKHZhciBpID0gMDsgaSA8IDUwMDAwOyAr
K2kpCisgICAgZm9vKGFycmF5KTsKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0
LXRlc3RzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuanMJ
KHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMt
c2ltcGxlLWJhY2t3YXJkLWxvb3AuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNCBAQAor
ZnVuY3Rpb24gZm9vKGFycmF5KSB7CisgICAgdmFyIHJlc3VsdCA9IDA7CisgICAgZm9yICh2YXIg
aSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICByZXN1bHQgKz0gYXJy
YXlbaV07CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIGFy
cmF5ID0gW107Citmb3IgKHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICBhcnJheS5wdXNo
KGkpOworZm9yICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZvbyhhcnJheSk7Cklu
ZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWZvcndh
cmQtbG9vcC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10
ZXN0cy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC5qcwkocmV2aXNpb24gMCkKKysrIExheW91dFRl
c3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0aW9uIGZvbyhhcnJheSkgeworICAg
IHZhciByZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyAr
K2kpCisgICAgICAgIHJlc3VsdCArPSBhcnJheVtpXTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
Citub0lubGluZShmb28pOworCit2YXIgYXJyYXkgPSBbXTsKK2ZvciAodmFyIGkgPSAwOyBpIDwg
MTAwMDsgKytpKQorICAgIGFycmF5LnB1c2goaSk7Citmb3IgKHZhciBpID0gMDsgaSA8IDUwMDAw
OyArK2kpCisgICAgZm9vKGFycmF5KTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254964</attachid>
            <date>2015-06-16 13:28:55 -0700</date>
            <delta_ts>2015-06-16 18:55:18 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>74395</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg1NjAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM5IEBA
CisyMDE1LTA2LTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGlzIGFk
ZHMgYSBwaGFzZSB0aGF0IGRvZXMgZm9yd2FyZCBwcm9wYWdhdGlvbiBvZiBpbnRlZ2VyIGluZXF1
YWxpdGllcy4gVGhpcyBhbGxvd3MgdXMKKyAgICAgICAgdG8gZG8gdGhlIGFsZ2VicmFpYyByZWFz
b25pbmcgd2UgbmVlZCB0byBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcy4g
SXQKKyAgICAgICAgYWxzbyBlbGltaW5hdGVzIG92ZXJmbG93IGNoZWNrcyBvbiBBcml0aEFkZCB3
aXRoIGEgY29uc3RhbnQuCisgICAgICAgIAorICAgICAgICBUaGUgcGhhc2UncyBhbmFseXNpcyBw
cm9kdWNlcyByZXN1bHRzIHRoYXQgYXJlIHBvd2VyZnVsIGVub3VnaCB0byBkbyBzcGVjdWxhdGl2
ZSBib3VuZHMKKyAgICAgICAgY2hlY2sgaG9pc3RpbmcsIGJ1dCB0aGlzIHBoYXNlIGN1cnJlbnRs
eSBvbmx5IGRvZXMgZWxpbWluYXRpb24uIFdlIGNhbiBpbXBsZW1lbnQKKyAgICAgICAgaG9pc3Rp
bmcgbGF0ZXIuCisgICAgICAgIAorICAgICAgICBPbiBwcm9ncmFtcyB0aGF0IGp1c3QgbG9vcCBv
dmVyIGFuIGFycmF5IGxpa2U6CisgICAgICAgIAorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBhcnJheS5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICB0aGluZ3kgKz0gYXJyYXlb
aV0KKyAgICAgICAgCisgICAgICAgIFRoaXMgY2hhbmdlIGlzIGEgNjAlIHNwZWVkLXVwLgorICAg
ICAgICAKKyAgICAgICAgVGhpcyBpcyBhbHNvIGEgfjMlIHNwZWVkLXVwIG9uIEtyYWtlbiwgYW5k
IGl0IHNob3dzIHZhcmlvdXMgc3BlZWQtdXBzIG9uIGluZGl2aWR1YWwKKyAgICAgICAgdGVzdHMg
aW4gT2N0YW5lLgorCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNj
cmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qOgorICAgICAgICAqIEphdmFT
Y3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChKU0M6OkRG
Rzo6cGVyZm9ybUludGVnZXJSYW5nZU9wdGltaXphdGlvbik6CisgICAgICAgICogZGZnL0RGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmg6IEFkZGVkLgorICAgICAgICAqIGRmZy9ERkdQ
bGFuLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpQbGFuOjpjb21waWxlSW5UaHJlYWRJbXBsKToK
KyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvYWRkLW92ZXJmbG93cy1hZnRlci1ub3QtZXF1YWwuanM6
IEFkZGVkLgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9zdWItb3ZlcmZsb3dzLWFmdGVyLW5vdC1l
cXVhbC5qczogQWRkZWQuCisKIDIwMTUtMDYtMTUgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxl
LmNvbT4KIAogICAgICAgICBGVEwgYm9vbGlmeSgpIFVudHlwZWRVc2UgaXMgd3JvbmcgaW4gdGhl
IG1hc3F1ZXJhZGVzLWFzLXVuZGVmaW5lZCBjYXNlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0NN
YWtlTGlzdHMudHh0CShyZXZpc2lvbiAxODU2MDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Q01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTE4MSw2ICsxODEsNyBAQCBzZXQoSmF2
YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGRmZy9ERkdJblBsYWNlQWJzdHJhY3RTdGF0ZS5jcHAK
ICAgICBkZmcvREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuY3BwCiAgICAgZGZnL0RGR0ludGVn
ZXJDaGVja0NvbWJpbmluZ1BoYXNlLmNwcAorICAgIGRmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSW52YWxpZGF0aW9uUG9pbnRJbmplY3Rpb25QaGFz
ZS5jcHAKICAgICBkZmcvREZHSklUQ29kZS5jcHAKICAgICBkZmcvREZHSklUQ29tcGlsZXIuY3Bw
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmN4cHJvai9KYXZh
U2NyaXB0Q29yZS52Y3hwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9K
YXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2oJKHJldmlzaW9uIDE4
NTYwMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0ph
dmFTY3JpcHRDb3JlLnZjeHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTQxOCw2ICs0MTgsNyBAQAog
ICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0luUGxhY2VBYnN0cmFjdFN0YXRlLmNw
cCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnNlcnRPU1JIaW50c0Zv
clVwZGF0ZS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdl
ckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5c
ZGZnXERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21w
aWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnZhbGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmNw
cCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmNwcCIgLz4K
ICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb21waWxlci5jcHAiIC8+CkBA
IC0xMTA5LDYgKzExMTAsNyBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0lu
c2VydE9TUkhpbnRzRm9yVXBkYXRlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxk
ZmdcREZHSW5zZXJ0aW9uU2V0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdc
REZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1
ZGU9Ii4uXGRmZ1xERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIiAvPgogICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhh
c2UuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGRmZ1xERkdKSVRDb2RlLmgiIC8+
CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSklUQ29tcGlsZXIuaCIgLz4KSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODU2MDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBACiAJCTBGODM2NEI3MTY0QjBDMTEw
MDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBDMEUwMDUzMzI5QSAvKiBERkdCcmFu
Y2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyogQnl0ZWNvZGVVc2VEZWYuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODg1RTEwMTg0OUEz
QkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVT
ID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdT
dHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVB
YnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJ
bnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87IH07CisJCTBGODk4RjMyMUIyNzY4
OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4OThGMzAxQjI3Njg5RjAw
ODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzMxQURGMDkwMTAw
RUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5jcHAgKi87
IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzAxQURGMDkwMTAwRUQ3
OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFs
UGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwICov
OyB9OwpAQCAtMjE1NCw2ICsyMTU2LDggQEAKIAkJMEY4MzY0QjUxNjRCMEMwRTAwNTMzMjlBIC8q
IERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBE
RkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdCcmFuY2hEaXJlY3Rpb24uaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAxODQ5QTNCRTAwRjFFM0ZBIC8qIEJ5
dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJ5dGVjb2Rl
VXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGODkzQkRBMTkzNkUyM0Mw
MDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBwYXRo
ID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdlT3B0
aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0g
REZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR0ludGVn
ZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IERGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0
aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4RjE0MkYxQURGMDkw
MTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
bmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdFcG9jaC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEwMEVENzkyQyAvKiBERkdFcG9jaC5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBERkdFcG9jaC5oOyBwYXRoID0gZGZn
L0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMxMUFERjA5
MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNlLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBwYXRoID0g
ZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwpAQCAtNDk3Miw2ICs0OTc2LDggQEAKIAkJCQkwRjJCOUNEOTE5RDBCQTdEMDBCMUQxQjUgLyog
REZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJCQkwRjMwMEI3OTE4QUIxQjE0MDBB
NkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwICovLAogCQkJCTBGMzAw
QjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5oICov
LAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJCQkJMEZDOTdGMzcxODIwMjExOTAw
MkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0aW9uUGhhc2UuY3BwICovLAogCQkJ
CTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZhbGlkYXRpb25Qb2ludEluamVjdGlv
blBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAwQkI3MjJDIC8qIERGR0pJVENvZGUu
Y3BwICovLApAQCAtNTYwOSw2ICs1NjE1LDcgQEAKIAkJCQkwRjZCMUNDQTE4NjQxREY4MDA4NDVE
OTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTBG
NkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNrTW9kZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFSTTY0QXNzZW1ibGVyLmggaW4gSGVh
ZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0EzM0MgLyogREZHSW50ZWdlclJhbmdl
T3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2RDNCMkM0MTAxNTZCREUw
MDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTA1MDI4MUFB
OTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBpbiBIZWFkZXJzICovLAogCQkJCTUy
QzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlwZS5oIGluIEhlYWRlcnMgKi8sCkBA
IC03MzQzLDYgKzczNTAsNyBAQAogCQkJCTBGMkI2NkU4MTdCNkI1QUIwMEE3QUUzRiAvKiBKU0Fy
cmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0JEQUVDQTE3RjRFQTE0MDBG
NjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjEzNTlC
MEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY4OThG
MzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJCMkUwMDE3NzNCNyAvKiBKU0JvdW5k
RnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0MEY4QUYwQTUwOEQyMDAwMDVGMDYx
IC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDQwRjg5
MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2VzICov
LApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgiCisKKyNpZiBFTkFCTEUoREZHX0pJ
VCkKKworI2luY2x1ZGUgIkRGR0Jsb2NrTWFwSW5saW5lcy5oIgorI2luY2x1ZGUgIkRGR0dyYXBo
LmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisjaW5jbHVkZSAiREZHUGhhc2UuaCIK
KyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25QaGFzZS5oIgorI2luY2x1ZGUgIkRG
R1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisKK25h
bWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgYm9v
bCB2ZXJib3NlID0gZmFsc2U7CisKK2ludDY0X3QgY2xhbXBlZFN1bUltcGwoKSB7IHJldHVybiAw
OyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitpbnQ2NF90IGNsYW1wZWRTdW1JbXBs
KGludCBsZWZ0LCBBcmdzLi4uIGFyZ3MpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0
X3Q+KGxlZnQpICsgY2xhbXBlZFN1bUltcGwoYXJncy4uLik7Cit9CisKK3RlbXBsYXRlPHR5cGVu
YW1lLi4uIEFyZ3M+CitpbnQgY2xhbXBlZFN1bShBcmdzLi4uIGFyZ3MpCit7CisgICAgaW50NjRf
dCByZXN1bHQgPSBjbGFtcGVkU3VtSW1wbChhcmdzLi4uKTsKKyAgICByZXR1cm4gc3RkOjptaW4o
CisgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6
bWF4KCkpLAorICAgICAgICBzdGQ6Om1heCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0
X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpLAorICAgICAgICAgICAgcmVzdWx0
KSk7Cit9CisKK2NsYXNzIFJlbGF0aW9uc2hpcCB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsK
KyAgICAgICAgTGVzc1RoYW4sCisgICAgICAgIEVxdWFsLAorICAgICAgICBOb3RFcXVhbCwKKyAg
ICAgICAgR3JlYXRlclRoYW4KKyAgICB9OworICAgIAorICAgIHN0YXRpYyBLaW5kIGZsaXBwZWQo
S2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2Ug
TGVzc1RoYW46CisgICAgICAgICAgICByZXR1cm4gR3JlYXRlclRoYW47CisgICAgICAgIGNhc2Ug
RXF1YWw6CisgICAgICAgICAgICByZXR1cm4gRXF1YWw7CisgICAgICAgIGNhc2UgTm90RXF1YWw6
CisgICAgICAgICAgICByZXR1cm4gTm90RXF1YWw7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46
CisgICAgICAgICAgICByZXR1cm4gTGVzc1RoYW47CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgfQorICAg
IAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAgICAgIDogbV9sZWZ0KG51bGxwdHIpCisgICAgICAg
ICwgbV9yaWdodChudWxscHRyKQorICAgICAgICAsIG1fa2luZChFcXVhbCkKKyAgICAgICAgLCBt
X29mZnNldCgwKQorICAgIHsKKyAgICB9CisgICAgCisgICAgUmVsYXRpb25zaGlwKE5vZGUqIGxl
ZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgICAgICA6IG1f
bGVmdChsZWZ0KQorICAgICAgICAsIG1fcmlnaHQocmlnaHQpCisgICAgICAgICwgbV9raW5kKGtp
bmQpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQobV9sZWZ0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9yaWdodCk7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKG1fbGVmdCAhPSBtX3JpZ2h0KTsKKyAgICB9CisgICAgCisgICAgc3Rh
dGljIFJlbGF0aW9uc2hpcCBzYWZlQ3JlYXRlKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5k
IGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFsZWZ0IHx8ICFyaWdo
dCB8fCBsZWZ0ID09IHJpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOwor
ICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKGxlZnQsIHJpZ2h0LCBraW5kLCBvZmZzZXQpOwor
ICAgIH0KKyAgICAKKyAgICB0eXBlZGVmIHZvaWQqIChSZWxhdGlvbnNoaXA6OipVbnNwZWNpZmll
ZEJvb2xUeXBlKTsKKworICAgIG9wZXJhdG9yIFVuc3BlY2lmaWVkQm9vbFR5cGUqKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2xlZnQgPyByZWludGVycHJldF9jYXN0PFVuc3BlY2lm
aWVkQm9vbFR5cGUqPigxKSA6IDA7CisgICAgfQorICAgIAorICAgIE5vZGUqIGxlZnQoKSBjb25z
dCB7IHJldHVybiBtX2xlZnQ7IH0KKyAgICBOb2RlKiByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1f
cmlnaHQ7IH0KKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0KKyAgICBp
bnQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXQ7IH0KKyAgICAKKyAgICBSZWxhdGlv
bnNoaXAgZmxpcHBlZCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoISp0aGlzKQorICAgICAg
ICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAKKyAgICAgICAgLy8gVGhpcyBz
aG91bGQgcmV0dXJuIFJlbGF0aW9uc2hpcCgpIGlmIC1tX29mZnNldCBvdmVyZmxvd3MuIEZvciBl
eGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQGEgPiBAYiAtIDIqKjMxCisgICAg
ICAgIC8vCisgICAgICAgIC8vIElmIHdlIGZsaXAgaXQgd2UgZ2V0OgorICAgICAgICAvLworICAg
ICAgICAvLyAgICAgQGIgPCBAYSArIDIqKjMxCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4Y2Vw
dCB0aGF0IHRoZSBzaWduIGdldHMgZmxpcHBlZCBzaW5jZSBpdCdzIElOVF9NSU46CisgICAgICAg
IC8vCisgICAgICAgIC8vICAgICBAYiA8IEBhIC0gMioqMzEKKyAgICAgICAgLy8KKyAgICAgICAg
Ly8gQW5kIHRoYXQgbWFrZXMgbm8gc2Vuc2UuIFRvIHNlZSBob3cgbGl0dGxlIHNlbnNlIGl0IG1h
a2VzLCBjb25zaWRlcjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIEBhID4gQHplcm8gLSAy
KiozMQorICAgICAgICAvLworICAgICAgICAvLyBXZSB3b3VsZCBmbGlwIGl0IHRvIG1lYW46Cisg
ICAgICAgIC8vCisgICAgICAgIC8vICAgICBAemVybyA8IEBhIC0gMioqMzEKKyAgICAgICAgLy8K
KyAgICAgICAgLy8gV2hpY2ggaXMgYWJzdXJkLgorICAgICAgICAKKyAgICAgICAgaWYgKG1fb2Zm
c2V0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpCisgICAgICAgICAgICByZXR1
cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlw
KG1fcmlnaHQsIG1fbGVmdCwgZmxpcHBlZChtX2tpbmQpLCAtbV9vZmZzZXQpOworICAgIH0KKyAg
ICAKKyAgICBSZWxhdGlvbnNoaXAgaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAo
ISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAKKyAgICAgICAgc3dp
dGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDoKKyAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBOb3RFcXVhbCwgbV9vZmZzZXQpOworICAgICAg
ICBjYXNlIE5vdEVxdWFsOgorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQs
IG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCk7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAg
ICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIC0xKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25z
aGlwKG1fbGVmdCwgbV9yaWdodCwgR3JlYXRlclRoYW4sIG1fb2Zmc2V0IC0gMSk7CisgICAgICAg
IGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9v
ZmZzZXQsIDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAg
ICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgbV9v
ZmZzZXQgKyAxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBpc0Nhbm9uaWNhbCgpIGNvbnN0
IHsgcmV0dXJuIG1fbGVmdCA8IG1fcmlnaHQ7IH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgY2Fu
b25pY2FsKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0Nhbm9uaWNhbCgpKQorICAgICAg
ICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICByZXR1cm4gZmxpcHBlZCgpOworICAgIH0KKyAg
ICAKKyAgICBib29sIHNhbWVOb2Rlc0FzKGNvbnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID09IG90aGVyLm1fbGVmdAorICAgICAgICAg
ICAgJiYgbV9yaWdodCA9PSBvdGhlci5tX3JpZ2h0OworICAgIH0KKyAgICAKKyAgICBib29sIG9w
ZXJhdG9yPT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBzYW1lTm9kZXNBcyhvdGhlcikKKyAgICAgICAgICAgICYmIG1fa2luZCA9PSBvdGhl
ci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0OworICAg
IH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9Cisg
ICAgCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgIT0gb3RoZXIubV9sZWZ0KQorICAgICAgICAgICAg
cmV0dXJuIG1fbGVmdCA8IG90aGVyLm1fbGVmdDsKKyAgICAgICAgaWYgKG1fcmlnaHQgIT0gb3Ro
ZXIubV9yaWdodCkKKyAgICAgICAgICAgIHJldHVybiBtX3JpZ2h0IDwgb3RoZXIubV9yaWdodDsK
KyAgICAgICAgaWYgKG1fa2luZCAhPSBvdGhlci5tX2tpbmQpCisgICAgICAgICAgICByZXR1cm4g
bV9raW5kIDwgb3RoZXIubV9raW5kOworICAgICAgICByZXR1cm4gbV9vZmZzZXQgPCBvdGhlci5t
X29mZnNldDsKKyAgICB9CisgICAgCisgICAgLy8gSWYgcG9zc2libGUsIHJldHVybnMgYSBmb3Jt
IG9mIHRoaXMgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSBnaXZlbiBub2RlIGlzIHRoZSBsZWZ0Cisg
ICAgLy8gc2lkZS4gUmV0dXJucyBhIG51bGwgcmVsYXRpb25zaGlwIGlmIHRoaXMgcmVsYXRpb25z
aGlwIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgdGhpcworICAgIC8vIG5vZGUuCisgICAgUmVs
YXRpb25zaGlwIGZvck5vZGUoTm9kZSogbm9kZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICht
X2xlZnQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgaWYgKG1f
cmlnaHQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBmbGlwcGVkKCk7CisgICAgICAgIHJl
dHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRMZWZ0KE5vZGUq
IGxlZnQpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChsZWZ0ICE9IG1fcmlnaHQpOwor
ICAgICAgICBtX2xlZnQgPSBsZWZ0OworICAgIH0KKyAgICBib29sIGFkZFRvT2Zmc2V0KGludCBv
ZmZzZXQpCisgICAgeworICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIG9m
ZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIG1fb2Zmc2V0ICs9IG9m
ZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8vIEF0dGVtcHRz
IHRvIGNhbGwgZnVuY3RvcigpIHdpdGggemVybywgb25lLCBvciB0d28gcmVsYXRpb25zaGlwcyB0
aGF0IHN1bW1hcml6ZSB0aGUKKyAgICAvLyB1bmlvbiBvZiB0aGlzIHJlbGF0aW9uc2hpcCBhbmQg
dGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gVGhlIHJlbGF0aW9uc2hpcHMgcGFzc2VkIHRvIHRoZQor
ICAgIC8vIGZ1bmN0b3IgYXJlIHJlbGF0ZWQgYnkgaW50ZXJzZWN0aW9uLiBOb3QgY2FsbGluZyB0
aGUgZnVuY3RvciBpbXBsaWVzIFRPUC4gRWFjaCBjYWxsIHRvCisgICAgLy8gdGhlIGZ1bmN0b3Ig
Y29uc3RyYWlucyB0aGUgc3RhdGUgc3BhY2UuIEZvciBleGFtcGxlIGlmIHRoaXMgY2FsbHMgdGhl
IGZ1bmN0b3Igd2l0aCByZWwxLAorICAgIC8vIHJlbDIsIC4uLiwgcmVsTiwgeW91IHNob3VsZCBy
ZWFkIGl0IGFzOgorICAgIC8vCisgICAgLy8gICAgIFRPUCAmJiByZWwxICYmIHJlbDIgJiYgLi4u
ICYmIHJlbE4KKyAgICAvLworICAgIC8vIFRoZSAiVE9QIiBpcyB0aGVyZSBpbiBjYXNlIHRoYXQg
dGhlIGZ1bmN0b3IgaXNuJ3QgY2FsbGVkLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+
CisgICAgdm9pZCBtZXJnZShjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyLCBjb25zdCBGdW5jdG9y
JiBmdW5jdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFzYW1lTm9kZXNBcyhvdGhlcikp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBIYW5kbGUgdGhlIHN1
cGVyIG9idmlvdXMgY2FzZSBmaXJzdC4KKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7Cisg
ICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgLy8gVGhpcyBkb2VzIHNvbWUgaW50ZXJlc3RpbmcgcGVybXV0
YXRpb25zIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGR1cGxpY2F0ZSBjb2RlLiBGb3IKKyAgICAg
ICAgLy8gZXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaW5pdGlhbGx5OiBAYSAhPSBA
YiwgQGEgPiBAYgorICAgICAgICAvLyAgICAgICAgICAgIEBiICE9IEBhLCBAYiA8IEBhCisgICAg
ICAgIC8vICAgICAgICAgICAgQGIgPCBAYSwgQGIgIT0gQGEKKyAgICAgICAgLy8gICBmaW5hbGx5
OiBAYiAhPSBhLCBAYiA8IEBhCisgICAgICAgIC8vCisgICAgICAgIC8vIEFub3RoZXIgZXhhbXBs
ZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaW5pdGlhbGx5OiBAYSA8IEBiLCBAYSAhPSBAYgor
ICAgICAgICAvLyAgIGZpbmFsbHk6IEBhICE9IEBiLCBAYSA8IEBiCisKKyAgICAgICAgUmVsYXRp
b25zaGlwIGEgPSAqdGhpczsKKyAgICAgICAgUmVsYXRpb25zaGlwIGIgPSBvdGhlcjsKKyAgICAg
ICAgYm9vbCBuZWVkRmxpcCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgLy8gR2V0IHJpZCBv
ZiBHcmVhdGVyVGhhbi4KKyAgICAgICAgaWYgKGEubV9raW5kID09IEdyZWF0ZXJUaGFuIHx8IGIu
bV9raW5kID09IEdyZWF0ZXJUaGFuKSB7CisgICAgICAgICAgICBhID0gYS5mbGlwcGVkKCk7Cisg
ICAgICAgICAgICBiID0gYi5mbGlwcGVkKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8v
IEluIHJhcmUgY2FzZXMsIHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvIGZsaXAuIEp1c3QgZ2l2ZSB1
cCBvbiBsaWZlIGluIHRob3NlCisgICAgICAgICAgICAvLyBjYXNlcy4KKyAgICAgICAgICAgIGlm
ICghYSB8fCAhYikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIG5lZWRGbGlwID0gdHJ1ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYg
d2Ugc3RpbGwgaGF2ZSBHcmVhdGVyVGhhbiwgdGhlbiBpdCBtZWFucyB0aGF0IHdlIHN0YXJ0ZWQg
d2l0aCBAYSA8IEBiIGFuZAorICAgICAgICAgICAgLy8gQGEgPiBAYi4gVGhhdCdzIHByZXR0eSBt
dWNoIGFsd2F5cyBhIHRhdXRvbG9neTsgd2UgZG9uJ3QgYXR0ZW1wdCB0byBkbyBzbWFydAorICAg
ICAgICAgICAgLy8gdGhpbmdzIGZvciB0aGF0IGNhc2UgZm9yIG5vdy4KKyAgICAgICAgICAgIGlm
IChhLm1fa2luZCA9PSBHcmVhdGVyVGhhbiB8fCBiLm1fa2luZCA9PSBHcmVhdGVyVGhhbikKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1h
a2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYSBMZXNzVGhhbiwgdGhlbiBpdCdzIGZpcnN0LgorICAg
ICAgICBpZiAoYi5tX2tpbmQgPT0gTGVzc1RoYW4pCisgICAgICAgICAgICBzdGQ6OnN3YXAoYSwg
Yik7CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEgTm90
RXF1YWwsIHRoZW4gaXQncyBmaXJzdC4KKyAgICAgICAgaWYgKGIubV9raW5kID09IE5vdEVxdWFs
KQorICAgICAgICAgICAgc3RkOjpzd2FwKGEsIGIpOworICAgICAgICAKKyAgICAgICAgYS5tZXJn
ZUltcGwoCisgICAgICAgICAgICBiLAorICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgcmVs
YXRpb25zaGlwKSB7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRGbGlwKSB7CisgICAgICAgICAg
ICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcC5mbGlwcGVkKCk7CisgICAgICAg
ICAgICAgICAgICAgIGlmICghcmVsYXRpb25zaGlwKQorICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdW5jdG9yKHJlbGF0
aW9uc2hpcCk7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgLy8gQXR0ZW1wdHMg
dG8gY29uc3RydWN0IG9uZSBSZWxhdGlvbnNoaXAgdGhhdCBhZGVxdWF0ZWx5IHN1bW1hcml6ZXMg
dGhlIGludGVyc2VjdGlvbiBvZgorICAgIC8vIHRoaXMgYW5kIG90aGVyLiBSZXR1cm5zIGEgbnVs
bCByZWxhdGlvbnNoaXAgaWYgdGhlIGZpbHRyYXRpb24gc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyB0
d28KKyAgICAvLyBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcy4gUmV0dXJuaW5nIG51bGwgaXMgYWx3
YXlzIHNhZmUgYmVjYXVzZSByZWxhdGlvbnNoaXAgbGlzdHMgaW4KKyAgICAvLyB0aGlzIHBoYXNl
IGFsd2F5cyBpbXBseSBpbnRlcnNlY3Rpb24uIFNvLCB5b3UgY291bGQgc291bmRseSBza2lwIGNh
bGxpbmcgdGhpcyBtZXRob2QgYW5kCisgICAgLy8ganVzdCBwdXQgYm90aCByZWxhdGlvbnNoaXBz
IGludG8gdGhlIGxpc3QuIEJ1dCwgdGhhdCBjb3VsZCBsZWFkIHRoZSBmaXhwb2ludCB0byBkaXZl
cmdlLgorICAgIC8vIEhlbmNlIHRoaXMgd2lsbCBhdHRlbXB0IHRvIGNvbWJpbmUgdGhlIHR3byBy
ZWxhdGlvbnNoaXBzIGludG8gb25lIGFzIGEgY29udmVyZ2VuY2UgaGFjay4KKyAgICAvLyBJbiBz
b21lIGNhc2VzLCBpdCB3aWxsIGRvIHNvbWV0aGluZyBjb25zZXJ2YXRpdmUuIEl0J3MgYWx3YXlz
IHNhZmUgZm9yIHRoaXMgdG8gcmV0dXJuCisgICAgLy8gKnRoaXMsIG9yIHRvIHJldHVybiBvdGhl
ci4gSXQnbGwgZG8gdGhhdCBzb21ldGltZXMsIG1haW5seSB0byBhY2NlbGVyYXRlIGNvbnZlcmdl
bmNlIGZvcgorICAgIC8vIHRoaW5ncyB0aGF0IHdlIGRvbid0IHRoaW5rIGFyZSBpbXBvcnRhbnQg
ZW5vdWdoIHRvIHNsb3cgZG93biB0aGUgYW5hbHlzaXMuCisgICAgUmVsYXRpb25zaGlwIGZpbHRl
cihjb25zdCBSZWxhdGlvbnNoaXAmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gV2Ug
YXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBtZXJnaW5nIHJlbGF0aW9uc2hpcHMgb3ZlciB0aGUgc2Ft
ZSBub2Rlcy4KKyAgICAgICAgQVNTRVJUKHNhbWVOb2Rlc0FzKG90aGVyKSk7CisgICAgICAgIAor
ICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7Cisg
ICAgICAgIAorICAgICAgICAvLyBGcm9tIGhlcmUgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSB0d28g
cmVsYXRpb25zaGlwcyBhcmUgbm90IGlkZW50aWNhbC4gVXN1YWxseSB3ZSB1c2UKKyAgICAgICAg
Ly8gdGhpcyB0byBhc3N1bWUgdGhhdCB3ZSBoYXZlIGRpZmZlcmVudCBvZmZzZXRzIGFueXRpbWUg
dGhhdCBldmVyeXRoaW5nIGJ1dCB0aGUgb2Zmc2V0CisgICAgICAgIC8vIGlzIGlkZW50aWNhbC4K
KyAgICAgICAgCisgICAgICAgIC8vIFdlIHdhbnQgZXF1YWxpdHkgdG8gdGFrZSBwcmVjZWRlbnQg
b3ZlciBldmVyeXRoaW5nIGVsc2UsIGFuZCB3ZSBkb24ndCB3YW50IG11bHRpcGxlCisgICAgICAg
IC8vIGluZGVwZW5kZW50IGNsYWltcyBvZiBlcXVhbGl0eS4gVGhhdCB3b3VsZCBqdXN0IGJlIGEg
Y29udHJhZGljdGlvbi4gV2hlbiBpdCBkb2VzCisgICAgICAgIC8vIGhhcHBlbiwgd2Ugd2lsbCBi
ZSBjb25zZXJ2YXRpdmUgaW4gdGhlIHNlbnNlIHRoYXQgd2Ugd2lsbCBwaWNrIG9uZS4KKyAgICAg
ICAgaWYgKG1fa2luZCA9PSBFcXVhbCkKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAg
ICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsK
KyAgICAgICAgCisgICAgICAgIC8vIFVzZWZ1bCBoZWxwZXIgZm9yIGZsaXBwaW5nLgorICAgICAg
ICBhdXRvIGZpbHRlckZsaXBwZWQgPSBbJl0gKCkgLT4gUmVsYXRpb25zaGlwIHsKKyAgICAgICAg
ICAgIC8vIElmIHdlIGNhbm5vdCBmbGlwLCB0aGVuIGp1c3QgY29uc2VydmF0aXZlbHkgcmV0dXJu
ICp0aGlzLgorICAgICAgICAgICAgUmVsYXRpb25zaGlwIGEgPSBmbGlwcGVkKCk7CisgICAgICAg
ICAgICBSZWxhdGlvbnNoaXAgYiA9IG90aGVyLmZsaXBwZWQoKTsKKyAgICAgICAgICAgIGlmICgh
YSB8fCAhYikKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICBSZWxh
dGlvbnNoaXAgcmVzdWx0ID0gYS5maWx0ZXIoYik7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkK
KyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICByZXN1
bHQgPSByZXN1bHQuZmxpcHBlZCgpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAg
ICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAg
ICAgfTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTm90RXF1YWwpIHsKKyAgICAg
ICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gTm90RXF1YWwpIHsKKyAgICAgICAgICAgICAgICAv
LyBXZSBjb3VsZCBkbyBzb21ldGhpbmcgc21hcnRlciBoZXJlLiBXZSBjb3VsZCBldmVuIGtlZXAg
Ym90aCBOb3RFcXVhbCdzLiBXZQorICAgICAgICAgICAgICAgIC8vIHdvdWxkIG5lZWQgdG8gbWFr
ZSBzdXJlIHRoYXQgd2UgY29ycmVjdGx5IGNvbGxhcHNlZCB0aGVtIHdoZW4gbWVyZ2luZy4gQnV0
CisgICAgICAgICAgICAgICAgLy8gZm9yIG5vdywgd2UganVzdCBwaWNrIG9uZSBvZiB0aGVtIGFu
ZCBob3BlIGZvciB0aGUgYmVzdC4KKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0g
R3JlYXRlclRoYW4pIHsKKyAgICAgICAgICAgICAgICAvLyBJbXBsZW1lbnQgdGhpcyBpbiB0ZXJt
cyBvZiBOb3RFcXVhbC5maWx0ZXIoTGVzc1RoYW4pLiAKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmlsdGVyRmxpcHBlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAg
ICBBU1NFUlQob3RoZXIubV9raW5kID09IExlc3NUaGFuKTsKKyAgICAgICAgICAgIC8vIFdlIGhh
dmUgdHdvIGNsYWltczoKKyAgICAgICAgICAgIC8vICAgICBAYSAhPSBAYiArIEMKKyAgICAgICAg
ICAgIC8vICAgICBAYSAgPCBAYiArIEQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJ
ZiBDID49IEQsIHRoZW4gdGhlIE5vdEVxdWFsIGlzIHJlZHVuZGFudC4KKyAgICAgICAgICAgIC8v
IElmIEMgPCBEIC0gMSwgdGhlbiB3ZSBjb3VsZCBrZWVwIGJvdGgsIGJ1dCBmb3Igbm93IHdlIGp1
c3Qga2VlcCB0aGUgTGVzc1RoYW4uCisgICAgICAgICAgICAvLyBJZiBDID09IEQgLSAxLCB0aGVu
IHRoZSBMZXNzVGhhbiBjYW4gYmUgdHVybmVkIGludG86CisgICAgICAgICAgICAvLworICAgICAg
ICAgICAgLy8gICAgIEBhIDwgQGIgKyBDCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8g
Tm90ZSB0aGF0IEMgPT0gdGhpcy5tX29mZnNldCwgRCA9PSBvdGhlci5tX29mZnNldC4KKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgaWYgKG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0IC0gMSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVz
c1RoYW4sIG1fb2Zmc2V0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG90aGVy
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAob3RoZXIubV9raW5kID09IE5vdEVx
dWFsKQorICAgICAgICAgICAgcmV0dXJuIG90aGVyLmZpbHRlcigqdGhpcyk7CisgICAgICAgIAor
ICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICBpZiAob3RoZXIu
bV9raW5kID09IExlc3NUaGFuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hp
cCgKKyAgICAgICAgICAgICAgICAgICAgbV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgc3RkOjpt
aW4obV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIEFTU0VSVChvdGhlci5tX2tpbmQgPT0gR3JlYXRlclRoYW4pOworICAg
ICAgICAgICAgaWYgKHN1bU92ZXJmbG93czxpbnQ+KG1fb2Zmc2V0LCAtMSkpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgaWYgKHN1bU92ZXJmbG93
czxpbnQ+KG90aGVyLm1fb2Zmc2V0LCAxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRp
b25zaGlwKCk7CisgICAgICAgICAgICBpZiAobV9vZmZzZXQgLSAxID09IG90aGVyLm1fb2Zmc2V0
ICsgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdo
dCwgRXF1YWwsIG1fb2Zmc2V0IC0gMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVy
biBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQVNTRVJUKG1f
a2luZCA9PSBHcmVhdGVyVGhhbik7CisgICAgICAgIHJldHVybiBmaWx0ZXJGbGlwcGVkKCk7Cisg
ICAgfQorICAgIAorICAgIGludCBtaW5WYWx1ZU9mTGVmdCgpIGNvbnN0CisgICAgeworICAgICAg
ICBpZiAobV9sZWZ0LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBtX2xl
ZnQtPmFzSW50MzIoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4g
fHwgbV9raW5kID09IE5vdEVxdWFsKQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19s
aW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIAorICAgICAgICBpbnQgbWluUmlnaHRWYWx1ZSA9
IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIGlmIChtX3JpZ2h0LT5p
c0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgIG1pblJpZ2h0VmFsdWUgPSBtX3JpZ2h0LT5h
c0ludDMyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IEdyZWF0ZXJUaGFuKQor
ICAgICAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWluUmlnaHRWYWx1ZSwgbV9vZmZzZXQsIDEp
OworICAgICAgICBBU1NFUlQobV9raW5kID09IEVxdWFsKTsKKyAgICAgICAgcmV0dXJuIGNsYW1w
ZWRTdW0obWluUmlnaHRWYWx1ZSwgbV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBpbnQgbWF4
VmFsdWVPZkxlZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fbGVmdC0+aXNJbnQzMkNv
bnN0YW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5hc0ludDMyKCk7CisgICAgICAg
IAorICAgICAgICBpZiAobV9raW5kID09IEdyZWF0ZXJUaGFuIHx8IG1fa2luZCA9PSBOb3RFcXVh
bCkKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwor
ICAgICAgICAKKyAgICAgICAgaW50IG1heFJpZ2h0VmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRz
PGludD46Om1heCgpOworICAgICAgICBpZiAobV9yaWdodC0+aXNJbnQzMkNvbnN0YW50KCkpCisg
ICAgICAgICAgICBtYXhSaWdodFZhbHVlID0gbV9yaWdodC0+YXNJbnQzMigpOworICAgICAgICAK
KyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikKKyAgICAgICAgICAgIHJldHVybiBjbGFt
cGVkU3VtKG1heFJpZ2h0VmFsdWUsIG1fb2Zmc2V0LCAtMSk7CisgICAgICAgIEFTU0VSVChtX2tp
bmQgPT0gRXF1YWwpOworICAgICAgICByZXR1cm4gY2xhbXBlZFN1bShtYXhSaWdodFZhbHVlLCBt
X29mZnNldCk7CisgICAgfQorICAgIAorICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBj
b25zdAorICAgIHsKKyAgICAgICAgLy8gVGhpcyBwcmludHMgb3V0IHRoZSByZWxhdGlvbnNoaXAg
d2l0aG91dCBhbnkgd2hpdGVzcGFjZSwgbGlrZSBAeDxAeSs0Mi4gVGhpcworICAgICAgICAvLyBv
cHRpbWl6ZXMgZm9yIHRoZSBjbGFyaXR5IG9mIGEgbGlzdCBvZiByZWxhdGlvbnNoaXBzLiBJdCdz
IGVhc2llciB0byByZWFkIHNvbWV0aGluZworICAgICAgICAvLyBsaWtlIFtAMTxAMiszLCBAND09
QDUtNl0gdGhhbiBpdCB3b3VsZCBiZSBpZiB0aGVyZSB3YXMgd2hpdGVzcGFjZSBpbnNpZGUgdGhl
CisgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMuCisgICAgICAgIAorICAgICAgICBvdXQucHJpbnQo
bV9sZWZ0KTsKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBMZXNzVGhh
bjoKKyAgICAgICAgICAgIG91dC5wcmludCgiPCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICBvdXQucHJpbnQoIj09Iik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBOb3RFcXVhbDoKKyAgICAgICAgICAgIG91dC5wcmludCgi
IT0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdyZWF0ZXJUaGFuOgorICAg
ICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBvdXQucHJpbnQobV9yaWdodCk7CisgICAgICAgIGlmIChtX29mZnNldCA+IDApCisg
ICAgICAgICAgICBvdXQucHJpbnQoIisiLCBtX29mZnNldCk7CisgICAgICAgIGVsc2UgaWYgKG1f
b2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIG91dC5wcmludCgiLSIsIC1zdGF0aWNfY2FzdDxpbnQ2
NF90PihtX29mZnNldCkpOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlw
ZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIG1lcmdlSW1wbChjb25zdCBSZWxhdGlvbnNoaXAmIG90
aGVyLCBjb25zdCBGdW5jdG9yJiBmdW5jdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJU
KHNhbWVOb2Rlc0FzKG90aGVyKSk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgcHVycG9zZSBv
ZiB0aGlzIG1ldGhvZCBpcyB0byBndWFyYW50ZWUgdGhhdDoKKyAgICAgICAgLy8KKyAgICAgICAg
Ly8gLSBXZSBhdm9pZCBoYXZpbmcgbW9yZSB0aGFuIG9uZSBSZWxhdGlvbnNoaXAgb3ZlciB0aGUg
c2FtZSB0d28gbm9kZXMuIFRoZXJlZm9yZSwgaWYKKyAgICAgICAgLy8gICB0aGUgbWVyZ2UgY291
bGQgYmUgZXhwcmVzc2VkIGFzIHR3byBSZWxhdGlvbnNoaXBzLCB3ZSBwcmVmZXIgdG8gaW5zdGVh
ZCBwaWNrIHRoZQorICAgICAgICAvLyAgIGxlc3MgcHJlY2lzZSBzaW5nbGUgUmVsYXRpb25zaGlw
IGZvcm0gZXZlbiBpZiB0aGF0IG1lYW5zIFRPUC4gT25lIGV4Y2VwdGlvbiB0bworICAgICAgICAv
LyAgIHRoaXMgaXMgdGhhdCB3ZSBAYSA9PSBAYiArIEMgYW5kIEBhID09IEBiICsgRCBpbnRvIEBh
ID4gQGIgKyBDIC0gMSBhbmQKKyAgICAgICAgLy8gICBAYSA8IEBiICsgRCArIDEuIAorICAgICAg
ICAvLworICAgICAgICAvLyAtIElmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIFJlbGF0aW9u
c2hpcHMgaXMganVzdCB0aGUgbV9vZmZzZXQsIHRoZW4gd2UgY3JlYXRlIGEKKyAgICAgICAgLy8g
ICBSZWxhdGlvbnNoaXAgdGhhdCBoYXMgYW4gb2Zmc2V0IG9mIC0xLCAwLCBvciAxLiBUaGlzIGlz
IGFuIGVzc2VudGlhbCBjb252ZXJnZW5jZQorICAgICAgICAvLyAgIGhhY2suIFdlIG5lZWQgLTEg
YW5kIDEgdG8gc3VwcG9ydCA8PSBhbmQgPj0uIFRoaXMgb3ZlcnJpZGVzIHRoZSBwcmV2aW91cwor
ICAgICAgICAvLyAgIGV4Y2VwdGlvbi4gRm9yIGV4YW1wbGUsIHdlIHdvdWxkbid0IGFkZCBhIEBh
IDwgQGIgKyBEICsgMSByZWxhdGlvbnNoaXAgaWYgRCArIDEKKyAgICAgICAgLy8gICB3YXMgbm90
IGVxdWFsIHRvIG9uZSBvZiAtMSwgMCwgMS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0
aGF0IHdlIHVzZSBSZWxhdGlvbnNoaXAoKSB0byBtZWFuIFRPUC4KKyAgICAgICAgCisgICAgICAg
IC8vIElmIHRoZSByZWxhdGlvbnNoaXBzIGFyZSBpZGVudGljYWwgdGhlbiB3ZSBoYXZlIG5vdGhp
bmcgbGVmdCB0byBkby4KKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7CisgICAgICAgICAg
ICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgLy8gRnJvbSBoZXJlIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgdHdvIHJlbGF0
aW9uc2hpcHMgYXJlIG5vdCBpZGVudGljYWwuIFVzdWFsbHkgd2UgdXNlCisgICAgICAgIC8vIHRo
aXMgdG8gYXNzdW1lIHRoYXQgd2UgZGlmZmVyZW50IG9mZnNldHMgYW55dGltZSB0aGF0IGV2ZXJ5
dGhpbmcgYnV0IHRoZSBvZmZzZXQgaXMKKyAgICAgICAgLy8gaWRlbnRpY2FsLgorICAgICAgICAK
KyAgICAgICAgaWYgKG1fa2luZCA9PSBOb3RFcXVhbCkgeworICAgICAgICAgICAgaWYgKG90aGVy
Lm1fa2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIERpZmZlcmVu
dCBvZmZzZXRzLCBzbyB0YXV0b2xvZ3kuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChv
dGhlci5tX2tpbmQgPT0gRXF1YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9vZmZzZXQgIT0g
b3RoZXIubV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2F5aW5nIHRoYXQgeW91
IG1pZ2h0IGJlIEIgd2hlbiB5b3UndmUgYWxyZWFkeSBzYWlkIHRoYXQgeW91J3JlIGFueXRoaW5n
CisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBBLCB3aGVyZSBBIGFuZCBCIGFyZSBkaWZmZXJl
bnQsIGlzIGEgdGF1dG9sb2d5LiBZb3UgY291bGQganVzdCBzYXkKKyAgICAgICAgICAgICAgICAg
ICAgLy8gdGhhdCB5b3UncmUgYW55dGhpbmcgYnV0IEEuCisgICAgICAgICAgICAgICAgICAgIGZ1
bmN0b3IoKnRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBPdGhl
cndpc2UsIHNhbWUgb2Zmc2V0czogd2UncmUgc2F5aW5nIHRoYXQgeW91J3JlIGVpdGhlciBBIG9y
IHlvdSdyZSBub3QKKyAgICAgICAgICAgICAgICAvLyBlcXVhbCB0byBBLgorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IAorICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQob3RoZXIubV9raW5kID09IExlc3NUaGFuKTsK
KyAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlc2UgY2xhaW1zLCBhbmQgd2UncmUgbWVyZ2luZyB0
aGVtOgorICAgICAgICAgICAgLy8gICAgIEBhICE9IEBiICsgQworICAgICAgICAgICAgLy8gICAg
IEBhIDwgQGIgKyBECisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBD
ID09IEQsIHRoZW4gdGhlIG1lcmdlIGlzIGNsZWFybHkganVzdCB0aGUgTm90RXF1YWwuCisgICAg
ICAgICAgICAvLyBJZiB3ZSBoYXZlIEMgPCBELCB0aGVuIHRoZSBtZXJnZSBpcyBhIHRhdXRvbG9n
eS4KKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgQyA+IEQsIHRoZW4gd2UgY291bGQga2VlcCBi
b3RoIGNsYWltcywgYnV0IHdlIGFyZSBjaGVhcCwgc28gd2UKKyAgICAgICAgICAgIC8vIGRvbid0
LiBXZSBqdXN0IHVzZSB0aGUgTm90RXF1YWwuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlm
IChtX29mZnNldCA8IG90aGVyLm1fb2Zmc2V0KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4p
IHsKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4pIHsKKyAgICAgICAg
ICAgICAgICAvLyBGaWd1cmUgb3V0IHdoYXQgb2Zmc2V0IHRvIHNlbGVjdCB0byBtZXJnZSB0aGVt
LiBUaGUgYXBwcm9wcmlhdGUgb2Zmc2V0cyBhcmUKKyAgICAgICAgICAgICAgICAvLyAtMSwgMCwg
b3IgMS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBmaWd1cmUg
b3V0IHdoYXQgb2Zmc2V0IHdlJ2QgbGlrZSB0byB1c2UuCisgICAgICAgICAgICAgICAgaW50IGJl
c3RPZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpOworICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgc29tZXRoaW5nIGxpa2UgQGEgPCBA
YiArIDIuIFdlIGNhbid0IHJlcHJlc2VudCB0aGlzIHVuZGVyIHRoZQorICAgICAgICAgICAgICAg
IC8vIC0xLDAsMSBydWxlLgorICAgICAgICAgICAgICAgIGlmIChiZXN0T2Zmc2V0IDw9IDEpCisg
ICAgICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwg
TGVzc1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBFcXVhbC4gV2Ugd291bGQgaGF2ZSBl
bGltaW5hdGVkIHRoZSBHcmVhdGVyVGhhbidzLCBhbmQKKyAgICAgICAgICAgIC8vIGlmIHdlIG1l
cmdlIExlc3NUaGFuIGFuZCBOb3RFcXVhbCwgdGhlIE5vdEVxdWFsIGFsd2F5cyBjb21lcyBmaXJz
dC4KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVyLm1fa2luZCA9PSBFcXVhbCk7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlYWxseSBpbnRlcmVzdGlu
ZyBjYXNlLiBXZSBoYXZlOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBAYSA8
IEBiICsgQworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGFuZDoKKyAgICAgICAgICAg
IC8vCisgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIgKyBECisgICAgICAgICAgICAvLworICAg
ICAgICAgICAgLy8gVGhlcmVmb3JlIHdlJ2QgbGlrZSB0byByZXR1cm46CisgICAgICAgICAgICAv
LworICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBtYXgoQywgRCArIDEpCisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVy
Lm1fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgc29t
ZXRoaW5nIGxpa2UgQGEgPCBAYiArIDIuIFdlIGNhbid0IGRvIGl0LgorICAgICAgICAgICAgaWYg
KGJlc3RPZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAgICBmdW5jdG9yKFJlbGF0aW9uc2hpcCht
X2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBzdGQ6Om1heChiZXN0T2Zmc2V0LCAtMSkpKTsKKwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUaGUg
b25seSB0aGluZyBsZWZ0IGlzIEVxdWFsLCBzaW5jZSB3ZSB3b3VsZCBoYXZlIGdvdHRlbiByaWQg
b2YgdGhlIEdyZWF0ZXJUaGFuJ3MuCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fa2luZCA9PSBF
cXVhbCk7CisgICAgICAgIAorICAgICAgICAvLyBXZSB3b3VsZCBuZXZlciBzZWUgTm90RXF1YWws
IGJlY2F1c2UgdGhvc2UgYWx3YXlzIGNvbWUgZmlyc3QuIFdlIHdvdWxkIG5ldmVyCisgICAgICAg
IC8vIHNlZSBHcmVhdGVyVGhhbiwgYmVjYXVzZSB3ZSB3b3VsZCBoYXZlIGVsaW1pbmF0ZWQgdGhv
c2UuIFdlIHdvdWxkIG5ldmVyIHNlZQorICAgICAgICAvLyBMZXNzVGhhbiwgYmVjYXVzZSB0aG9z
ZSBhbHdheXMgY29tZSBmaXJzdC4KKyAgICAgICAgCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90
aGVyLm1fa2luZCA9PSBFcXVhbCk7CisgICAgICAgIC8vIFdlIGhhdmUgQGEgPT0gQGIgKyBDIGFu
ZCBAYSA9PSBAYiArIEQsIHdoZXJlIEMgIT0gRC4gVHVybiB0aGlzIGludG8gc29tZQorICAgICAg
ICAvLyBpbmVxdWFsaXR5IHRoYXQgaW52b2x2ZXMgYSBjb25zdGFudCB0aGF0IGlzIC0xLDAsMS4K
KyAgICAgICAgCisgICAgICAgIFJlbGF0aW9uc2hpcCBsZXNzVGhhbigKKyAgICAgICAgICAgIG1f
bGVmdCwgb3RoZXIubV9yaWdodCwgTGVzc1RoYW4sCisgICAgICAgICAgICBzdGQ6Om1heChtX29m
ZnNldCwgb3RoZXIubV9vZmZzZXQpICsgMSk7CisgICAgICAgIAorICAgICAgICBpZiAobGVzc1Ro
YW4ub2Zmc2V0KCkgPj0gLTEgJiYgbGVzc1RoYW4ub2Zmc2V0KCkgPD0gMSkKKyAgICAgICAgICAg
IGZ1bmN0b3IobGVzc1RoYW4pOworICAgICAgICAKKyAgICAgICAgUmVsYXRpb25zaGlwIGdyZWF0
ZXJUaGFuKAorICAgICAgICAgICAgbV9sZWZ0LCBvdGhlci5tX3JpZ2h0LCBHcmVhdGVyVGhhbiwK
KyAgICAgICAgICAgIHN0ZDo6bWluKG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCkgLSAxKTsKKyAg
ICAgICAgaWYgKGdyZWF0ZXJUaGFuLm9mZnNldCgpID49IC0xICYmIGdyZWF0ZXJUaGFuLm9mZnNl
dCgpIDw9IDEpCisgICAgICAgICAgICBmdW5jdG9yKGdyZWF0ZXJUaGFuKTsKKyAgICB9CisgICAg
CisgICAgTm9kZSogbV9sZWZ0OworICAgIE5vZGUqIG1fcmlnaHQ7CisgICAgS2luZCBtX2tpbmQ7
CisgICAgaW50IG1fb2Zmc2V0OyAvLyBUaGlzIG9mZnNldCBjYW4gYmUgYXJiaXRyYXJpbHkgbGFy
Z2UuCit9OworCit0eXBlZGVmIEhhc2hNYXA8Tm9kZSosIFZlY3RvcjxSZWxhdGlvbnNoaXA+PiBS
ZWxhdGlvbnNoaXBNYXA7CisKK2NsYXNzIEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlIDog
cHVibGljIFBoYXNlIHsKK3B1YmxpYzoKKyAgICBJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFz
ZShHcmFwaCYgZ3JhcGgpCisgICAgICAgIDogUGhhc2UoZ3JhcGgsICJpbnRlZ2VyIHJhbmdlIG9w
dGltaXphdGlvbiIpCisgICAgICAgICwgbV96ZXJvKG51bGxwdHIpCisgICAgICAgICwgbV9yZWxh
dGlvbnNoaXBzQXRIZWFkKGdyYXBoKQorICAgICAgICAsIG1faW5zZXJ0aW9uU2V0KGdyYXBoKQor
ICAgIHsKKyAgICB9CisgICAgCisgICAgYm9vbCBydW4oKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KG1fZ3JhcGgubV9mb3JtID09IFNTQSk7CisgICAgICAgIAorICAgICAgICAvLyBCZWZvcmUgd2Ug
ZG8gYW55dGhpbmcsIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB6ZXJvIGNvbnN0YW50IGF0IHRo
ZSB0b3AuCisgICAgICAgIGZvciAoTm9kZSogbm9kZSA6ICptX2dyYXBoLmJsb2NrKDApKSB7Cisg
ICAgICAgICAgICBpZiAobm9kZS0+aXNJbnQzMkNvbnN0YW50KCkgJiYgIW5vZGUtPmFzSW50MzIo
KSkgeworICAgICAgICAgICAgICAgIG1femVybyA9IG5vZGU7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX3plcm8pIHsKKyAg
ICAgICAgICAgIG1femVybyA9IG1faW5zZXJ0aW9uU2V0Lmluc2VydENvbnN0YW50KDAsIE5vZGVP
cmlnaW4oKSwganNOdW1iZXIoMCkpOworICAgICAgICAgICAgbV9pbnNlcnRpb25TZXQuZXhlY3V0
ZShtX2dyYXBoLmJsb2NrKDApKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHZl
cmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkdyYXBoIGJlZm9yZSBpbnRlZ2VyIHJhbmdl
IG9wdGltaXphdGlvbjpcbiIpOworICAgICAgICAgICAgbV9ncmFwaC5kdW1wKCk7CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoaXMgcGVyZm9ybXMgYSBmaXhwb2ludCBvdmVyIHRo
ZSBibG9ja3MgaW4gcmV2ZXJzZSBwb3N0LW9yZGVyLiBMb2dpY2FsbHksIHdlCisgICAgICAgIC8v
IG1haW50YWluIGEgbGlzdCBvZiByZWxhdGlvbnNoaXBzIGF0IGVhY2ggcG9pbnQgaW4gdGhlIHBy
b2dyYW0uIFRoZSBsaXN0IHNob3VsZCBiZQorICAgICAgICAvLyByZWFkIGFzIGFuIGludGVyc2Vj
dGlvbi4gRm9yIGV4YW1wbGUgaWYgd2UgaGF2ZSB7cmVsMSwgcmVsMiwgLi4uLCByZWxOfSwgeW91
IHNob3VsZAorICAgICAgICAvLyByZWFkIHRoaXMgYXM6CisgICAgICAgIC8vCisgICAgICAgIC8v
ICAgICBUT1AgJiYgcmVsMSAmJiByZWwyICYmIC4uLiAmJiByZWxOCisgICAgICAgIC8vCisgICAg
ICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGV4cHJlc3MgdGhpbmdzIGxpa2U6CisgICAgICAgIC8v
CisgICAgICAgIC8vICAgICBAYSA+IEBiIC0gNDIgJiYgQGEgPCBAYiArIDI1CisgICAgICAgIC8v
CisgICAgICAgIC8vIEJ1dCBub3QgdGhpbmdzIGxpa2U6CisgICAgICAgIC8vCisgICAgICAgIC8v
ICAgICBAYSA8IEBiIC0gNDIgfHwgQGEgPiBAYiArIDI1CisgICAgICAgIC8vCisgICAgICAgIC8v
IFdlIG1lcmdlIHR3byBsaXN0cyBieSBtZXJnaW5nIGVhY2ggcmVsYXRpb25zaGlwIGluIG9uZSBs
aXN0IHdpdGggZWFjaCByZWxhdGlvbnNoaXAKKyAgICAgICAgLy8gaW4gdGhlIG90aGVyIGxpc3Qu
IE1lcmdpbmcgdHdvIHJlbGF0aW9uc2hpcHMgd2lsbCB5aWVsZCBhIHJlbGF0aW9uc2hpcCBsaXN0
OyBhcyB3aXRoCisgICAgICAgIC8vIGFsbCBzdWNoIGxpc3RzIGl0IGlzIGFuIGludGVyc2N0aW9u
LiBNZXJnaW5nIHJlbGF0aW9uc2hpcHMgb3ZlciBkaWZmZXJlbnQgdmFyaWFibGVzCisgICAgICAg
IC8vIGFsd2F5cyB5aWVsZHMgdGhlIGVtcHR5IGxpc3QgKGkuZS4gVE9QKS4gVGhpcyBtZXJnZSBz
dHlsZSBpcyBzb3VuZCBiZWNhdXNlIGlmIHdlCisgICAgICAgIC8vIGhhdmU6CisgICAgICAgIC8v
CisgICAgICAgIC8vICAgICAoQSAmJiBCICYmIEMpIHx8IChEICYmIEUgJiYgRikKKyAgICAgICAg
Ly8KKyAgICAgICAgLy8gVGhlbiBhIHZhbGlkIG1lcmdlIGlzIGp1c3Qgb25lIHRoYXQgd2lsbCBy
ZXR1cm4gdHJ1ZSBpZiBBLCBCLCBDIGFyZSBhbGwgdHJ1ZSwgb3IKKyAgICAgICAgLy8gdGhhdCB3
aWxsIHJldHVybiB0cnVlIGlmIEQsIEUsIEYgYXJlIGFsbCB0cnVlLiBPdXIgbWVyZ2Ugc3R5bGUg
ZXNzZW50aWFsbHkgZG9lczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIChBIHx8IEQpICYm
IChBIHx8IEUpICYmIChBIHx8IEYpICYmIChCIHx8IEQpICYmIChCIHx8IEUpICYmIChCIHx8IEYp
ICYmCisgICAgICAgIC8vICAgICAgICAgKEMgfHwgRCkgJiYgKEMgfHwgRSkgJiYgKEMgfHwgRikK
KyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgQSAmJiBCICYmIEMgaXMgdHJ1ZSwgdGhlbiB0aGlz
IHJldHVybnMgdHJ1ZS4gSWYgRCAmJiBFICYmIEYgaXMgdHJ1ZSwgdGhpcyBhbHNvCisgICAgICAg
IC8vIHJldHVybnMgdHJ1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hpbGUgdGhpcyBhcHBl
YXJzIGF0IGZpcnN0IGxpa2UgYSBraW5kIG9mIGV4cHJlc3Npb24gZXhwbG9zaW9uLCBpbiBwcmFj
dGljZSBpdAorICAgICAgICAvLyBpc24ndC4gVGhlIGNvZGUgdGhhdCBoYW5kbGVzIHRoaXMga25v
d3MgdGhhdCB0aGUgbWVyZ2Ugb2YgdHdvIHJlbGF0aW9uc2hpcHMgb3ZlcgorICAgICAgICAvLyBk
aWZmZXJlbnQgdmFyaWFibGVzIGlzIFRPUCAoaS5lLiB0aGUgZW1wdHkgbGlzdCkuIEZvciBleGFt
cGxlIGlmIEEgYWJvdmUgaXMgQGEgPCBAYgorICAgICAgICAvLyBhbmQgQiBhYm92ZSBpcyBAYyA+
IEBkLCB3aGVyZSBAYSwgQGIsIEBjLCBhbmQgQGQgYXJlIGRpZmZlcmVudCBub2RlcywgdGhlIG1l
cmdlIHdpbGwKKyAgICAgICAgLy8geWllbGQgbm90aGluZy4gSW4gZmFjdCwgdGhlIG1lcmdlIGFs
Z29yaXRobSB3aWxsIHNraXAgc3VjaCBtZXJnZXMgZW50aXJlbHkgYmVjYXVzZQorICAgICAgICAv
LyB0aGUgcmVsYXRpb25zaGlwIGxpc3RzIGFyZSBhY3R1YWxseSBrZXllZCBieSBub2RlLgorICAg
ICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgc2FmZSB0byBkcm9wIGFu
eSBvZiByZWxhdGlvbnNoaXAgZnJvbSB0aGUgcmVsYXRpb25zaGlwIGxpc3QuCisgICAgICAgIC8v
IFRoaXMgbWVyZWx5IGluY3JlYXNlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgImV4cHJlc3Npb24i
IHlpZWxkaW5nIHRydWUsIGkuZS4gYmVpbmcKKyAgICAgICAgLy8gY2xvc2VyIHRvIFRPUC4gT3B0
aW1pemF0aW9ucyBhcmUgb25seSBwZXJmb3JtZWQgaWYgd2UgY2FuIGVzdGFibGlzaCB0aGF0IHRo
ZQorICAgICAgICAvLyBleHByZXNzaW9uIGltcGxpZWQgYnkgdGhlIHJlbGF0aW9uc2hpcCBsaXN0
IGlzIGZhbHNlIGZvciBhbGwgb2YgdGhvc2UgY2FzZXMgd2hlcmUKKyAgICAgICAgLy8gc29tZSBj
aGVjayB3b3VsZCBoYXZlIGZhaWxlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgaXMg
bm8gbm90aW9uIG9mIEJPVFRPTSBiZWNhdXNlIHdlIHRyZWF0IGJsb2NrcyB0aGF0IGhhdmVuJ3Qg
aGFkIHRoZWlyCisgICAgICAgIC8vIHN0YXRlLWF0LWhlYWQgc2V0IGFzIGEgc3BlY2lhbCBjYXNl
OiB3ZSBqdXN0IHRyYW5zZmVyIGFsbCBsaXZlIHJlbGF0aW9uc2hpcHMgdG8gc3VjaAorICAgICAg
ICAvLyBhIGJsb2NrLiBBZnRlciB0aGUgaGVhZCBvZiBhIGJsb2NrIGlzIHNldCwgd2UgcGVyZm9y
bSB0aGUgbWVyZ2luZyBhcyBhYm92ZS4gSW4gYWxsCisgICAgICAgIC8vIG90aGVyIHBsYWNlcyB3
aGVyZSB3ZSB3b3VsZCBvcmRpbmFyaWx5IG5lZWQgQk9UVE9NLCB3ZSBhcHByb3hpbWF0ZSBpdCBi
eSBoYXZpbmcgc29tZQorICAgICAgICAvLyBub24tQk9UVE9NIHJlbGF0aW9uc2hpcC4KKyAgICAg
ICAgCisgICAgICAgIEJsb2NrTGlzdCBwb3N0T3JkZXIgPSBtX2dyYXBoLmJsb2Nrc0luUG9zdE9y
ZGVyKCk7CisgICAgICAgIAorICAgICAgICBib29sIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB3
aGlsZSAoY2hhbmdlZCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBwb3N0T3JkZXJJbmRleCA9IHBvc3RPcmRlci5zaXplKCk7IHBvc3RP
cmRlckluZGV4LS07KSB7CisgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogYmxvY2sgPSBwb3N0
T3JkZXJbcG9zdE9yZGVySW5kZXhdOworICAgICAgICAgICAgICAgIERGR19BU1NFUlQoCisgICAg
ICAgICAgICAgICAgICAgIG1fZ3JhcGgsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIGJs
b2NrID09IG1fZ3JhcGguYmxvY2soMCkgfHwgbV9zZWVuQmxvY2tzLmNvbnRhaW5zKGJsb2NrKSk7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHMgPSBtX3JlbGF0
aW9uc2hpcHNBdEhlYWRbYmxvY2tdOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9y
ICh1bnNpZ25lZCBub2RlSW5kZXggPSAwOyBub2RlSW5kZXggPCBibG9jay0+c2l6ZSgpOyArK25v
ZGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBOb2RlKiBub2RlID0gYmxvY2stPmF0KG5v
ZGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAg
ICAgICAgICAgICAgZGF0YUxvZygiQW5hbHlzaXM6IGF0ICIsIG5vZGUsICI6ICIsIGxpc3REdW1w
KHNvcnRlZFJlbGF0aW9uc2hpcHMoKSksICJcbiIpOworICAgICAgICAgICAgICAgICAgICBleGVj
dXRlTm9kZShub2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgLy8gTm93IGNvbWVzIHBlcmhhcHMgdGhlIG1vc3QgaW1wb3J0YW50IHBpZWNl
IG9mIGNsZXZlcm5lc3M6IGlmIHdlIEJyYW5jaCwgYW5kCisgICAgICAgICAgICAgICAgLy8gdGhl
IHByZWRpY2F0ZSBpbnZvbHZlcyBzb21lIHJlbGF0aW9uIG92ZXIgaW50ZWdlcnMsIHdlIHByb3Bh
Z2F0ZSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byB0aGUgdGFr
ZW4gYW5kIG5vdFRha2VuIHBhdGhzLiBUaGlzIGhhbmRsZXM6CisgICAgICAgICAgICAgICAgLy8g
LSBCcmFuY2ggb24gaW50MzIuCisgICAgICAgICAgICAgICAgLy8gLSBCcmFuY2ggb24gTG9naWNh
bE5vdCBvbiBpbnQzMi4KKyAgICAgICAgICAgICAgICAvLyAtIEJyYW5jaCBvbiBjb21wYXJlIG9u
IGludDMyJ3MuCisgICAgICAgICAgICAgICAgLy8gLSBCcmFuY2ggb24gTG9naWNhbE5vdCBvZiBj
b21wYXJlIG9uIGludDMyJ3MuCisgICAgICAgICAgICAgICAgTm9kZSogdGVybWluYWwgPSBibG9j
ay0+dGVybWluYWwoKTsKKyAgICAgICAgICAgICAgICBib29sIGFscmVhZHlNZXJnZWQgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICBpZiAodGVybWluYWwtPm9wKCkgPT0gQnJhbmNoKSB7CisgICAg
ICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAg
ICAgICAgIEJyYW5jaERhdGEqIGJyYW5jaERhdGEgPSB0ZXJtaW5hbC0+YnJhbmNoRGF0YSgpOwor
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnZlcnQgPSBm
YWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5jaGlsZDEoKS0+b3AoKSA9
PSBMb2dpY2FsTm90KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCA9IHRlcm1p
bmFsLT5jaGlsZDEoKS5ub2RlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnQgPSB0
cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICBpZiAodGVybWluYWwtPmNoaWxkMSgpLnVzZUtpbmQoKSA9PSBJbnQzMlVz
ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlw
OjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsLT5jaGls
ZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpOb3RFcXVhbCwgMCk7CisgICAgICAg
ICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlKiBjb21w
YXJlID0gdGVybWluYWwtPmNoaWxkMSgpLm5vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHN3aXRjaCAoY29tcGFyZS0+b3AoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBD
b21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVTdHJpY3RFcToK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgICAgICAg
ICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgICAgICAgICAgICAgICAgICBj
YXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJl
R3JlYXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlLT5p
c0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJl
U3RyaWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9
IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpFcXVh
bCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3M6CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUo
KSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwgMCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29t
cGFyZUxlc3NFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlw
ID0gUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2Rl
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okxl
c3NUaGFuLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gUmVsYXRpb25zaGlwOjpzYWZlQ3Jl
YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQx
KCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAwKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZWxhdGlvbnNoaXAgPSBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBhcmUt
PmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJl
bGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sIC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgREZHX0NSQVNIKG1fZ3JhcGgsIGNvbXBhcmUsICJJ
bnZhbGlkIGNvbXBhcmlzb24gbm9kZSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgICAgICBpZiAoaW52ZXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlw
ID0gcmVsYXRpb25zaGlwLmludmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IFJlbGF0aW9uc2hpcE1hcCBmb3JUcnVlID0gbV9yZWxhdGlvbnNoaXBzOworICAgICAgICAgICAg
ICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvckZhbHNlID0gbV9yZWxhdGlvbnNoaXBzOwor
ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVy
Ym9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJEZWFsaW5nIHdpdGgg
dHJ1ZTpcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKGZvclRy
dWUsIHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVsYXRpb25z
aGlwIGludmVyc2UgPSByZWxhdGlvbnNoaXAuaW52ZXJzZSgpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRhdGFMb2coIkRlYWxpbmcgd2l0aCBmYWxzZTpcbiIpOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNldFJlbGF0aW9uc2hpcChmb3JGYWxzZSwgaW52ZXJzZSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JUcnVlLCBicmFuY2hEYXRhLT50YWtlbi5ibG9j
ayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8oZm9yRmFsc2Us
IGJyYW5jaERhdGEtPm5vdFRha2VuLmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFs
cmVhZHlNZXJnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TWVyZ2VkKSB7CisgICAgICAgICAg
ICAgICAgICAgIGZvciAoQmFzaWNCbG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMo
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhtX3JlbGF0aW9u
c2hpcHMsIHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGZvciAo
QmFzaWNCbG9jayogYmxvY2sgOiBtX2dyYXBoLmJsb2Nrc0luTmF0dXJhbE9yZGVyKCkpIHsKKyAg
ICAgICAgICAgIG1fcmVsYXRpb25zaGlwcyA9IG1fcmVsYXRpb25zaGlwc0F0SGVhZFtibG9ja107
CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIG5vZGVJbmRleCA9IDA7IG5vZGVJbmRleCA8IGJs
b2NrLT5zaXplKCk7ICsrbm9kZUluZGV4KSB7CisgICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9
IGJsb2NrLT5hdChub2RlSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAg
ICAgICAgICAgICAgICAgICBkYXRhTG9nKCJUcmFuc2Zvcm1hdGlvbjogYXQgIiwgbm9kZSwgIjog
IiwgbGlzdER1bXAoc29ydGVkUmVsYXRpb25zaGlwcygpKSwgIlxuIik7CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgLy8gVGhpcyBlbmRzIHVwIGJlaW5nIHByZXR0eSBhd2t3YXJk
IHRvIHdyaXRlIGJlY2F1c2Ugd2UgbmVlZCB0byBkZWNpZGUgaWYgd2UKKyAgICAgICAgICAgICAg
ICAvLyBvcHRpbWl6ZSBieSB1c2luZyB0aGUgcmVsYXRpb25zaGlwcyBiZWZvcmUgdGhlIG9wZXJh
dGlvbiwgYnV0IHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVOb2Rl
KCkgYmVmb3JlIHdlIG9wdGltaXplLgorICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3Ao
KSkgeworICAgICAgICAgICAgICAgIGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUo
KSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3Rh
bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQo
bm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0g
bV9yZWxhdGlvbnNoaXBzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgbWluVmFsdWUgPSBz
dGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICAgICAgICAgICAgICBpbnQg
bWF4VmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOworICAgICAgICAgICAg
ICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUgPSBzdGQ6Om1heChtaW5WYWx1ZSwgcmVs
YXRpb25zaGlwLm1pblZhbHVlT2ZMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4
VmFsdWUgPSBzdGQ6Om1pbihtYXhWYWx1ZSwgcmVsYXRpb25zaGlwLm1heFZhbHVlT2ZMZWZ0KCkp
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obWluVmFsdWUsIG5vZGUtPmNoaWxkMigp
LT5hc0ludDMyKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdW1PdmVyZmxvd3M8aW50
PihtYXhWYWx1ZSwgbm9kZS0+Y2hpbGQyKCktPmFzSW50MzIoKSkpCisgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
IGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAg
bm9kZS0+c2V0QXJpdGhNb2RlKEFyaXRoOjpVbmNoZWNrZWQpOworICAgICAgICAgICAgICAgICAg
ICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENoZWNr
SW5Cb3VuZHM6IHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNo
aXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBib29sIG5v
bk5lZ2F0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgbGVzc1RoYW5MZW5n
dGggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRp
b25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxh
dGlvbnNoaXAubWluVmFsdWVPZkxlZnQoKSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5vbk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5yaWdodCgpID09IG5vZGUtPmNoaWxk
MigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5k
KCkgPT0gUmVsYXRpb25zaGlwOjpFcXVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmJiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBsZXNzVGhhbkxlbmd0aCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkg
PT0gUmVsYXRpb25zaGlwOjpMZXNzVGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmJiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbGVzc1RoYW5MZW5ndGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICBpZiAobm9uTmVnYXRpdmUgJiYgbGVzc1RoYW5MZW5ndGgpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG5vZGUtPnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAg
ICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZXhlY3V0ZU5v
ZGUoYmxvY2stPmF0KG5vZGVJbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9p
ZCBleGVjdXRlTm9kZShOb2RlKiBub2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChub2RlLT5v
cCgpKSB7CisgICAgICAgIGNhc2UgQ2hlY2tJbkJvdW5kczogeworICAgICAgICAgICAgc2V0UmVs
YXRpb25zaGlwKFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZShub2RlLT5jaGlsZDEoKS5ub2RlKCks
IG5vZGUtPmNoaWxkMigpLm5vZGUoKSwgUmVsYXRpb25zaGlwOjpMZXNzVGhhbikpOworICAgICAg
ICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZShub2RlLT5jaGls
ZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgLTEpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBB
cml0aEFkZDogeworICAgICAgICAgICAgLy8gV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGludDMy
IGFkZGl0aW9ucyBhbmQgd2UgY3VycmVudGx5IG9ubHkga25vdyBob3cgdG8KKyAgICAgICAgICAg
IC8vIGhhbmRsZSB0aGUgbm9uLXdyYXBwaW5nIG9uZXMuCisgICAgICAgICAgICBpZiAoIW5vZGUt
PmlzQmluYXJ5VXNlS2luZChJbnQzMlVzZSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBoYW5kbGUgdGhlIHVuY2hl
Y2tlZCBhcml0aG1ldGljIGNhc2UuIFdlIGp1c3QgZG8gaXQgZG9uJ3QgcmlnaHQKKyAgICAgICAg
ICAgIC8vIG5vdy4KKyAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6
Q2hlY2tPdmVyZmxvdykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgLy8gSGFuZGxlIGFkZDogQHZhbHVlICsgY29uc3RhbnQuCisgICAgICAgICAgICBp
ZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9mZnNldCA9IG5vZGUtPmNoaWxk
MigpLT5hc0ludDMyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGFkZCBhIHJl
bGF0aW9uc2hpcCBmb3IgQGFkZCA9PSBAdmFsdWUgKyBjb25zdGFudCwgYW5kIHRoZW4gd2UgY29w
eSB0aGUKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMgZm9yIEB2YWx1ZS4gVGhpcyBnaXZl
cyB1cyBhIG9uZS1kZWVwIHZpZXcgb2YgQHZhbHVlJ3MgZXhpc3RpbmcKKyAgICAgICAgICAgIC8v
IHJlbGF0aW9uc2hpcHMsIHdoaWNoIG1hdGNoZXMgdGhlIG9uZS1kZWVwIHNlYXJjaCBpbiBzZXRS
ZWxhdGlvbnNoaXAoKS4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlw
KAorICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcChub2RlLCBub2RlLT5jaGlsZDEoKS5ub2Rl
KCksIFJlbGF0aW9uc2hpcDo6RXF1YWwsIG9mZnNldCkpOworICAgICAgICAgICAgCisgICAgICAg
ICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2Rl
KCkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKSB7Cisg
ICAgICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgICAgICAg
ICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gV2UgaGF2ZToKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFk
ZDogQXJpdGhBZGQoQHgsIEMpCisgICAgICAgICAgICAgICAgICAgIC8vICAgICBAeCBvcCBAeSAr
IEQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZv
bGxvd2luZyBjZXJ0YWlubHkgaG9sZHM6CisgICAgICAgICAgICAgICAgICAgIC8vICAgICBAeCA9
PSBAYWRkIC0gQworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAv
LyBXaGljaCBhbGxvd3MgdXMgdG8gc3Vic3RpdHV0ZToKKyAgICAgICAgICAgICAgICAgICAgLy8g
ICAgIEBhZGQgLSBDIG9wIEB5ICsgRAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAg
ICAgICAgICAgICAvLyBBbmQgdGhlbiBjYXJyeSB0aGUgQyBvdmVyOgorICAgICAgICAgICAgICAg
ICAgICAvLyAgICAgQGFkZCBvcCBAeSArIEQgKyBDCisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25z
aGlwOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQobmV3UmVsYXRpb25zaGlwLmxlZnQoKSA9
PSBub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKG5ld1JlbGF0aW9uc2hpcC5yaWdodCgpID09IG5vZGUpCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRp
b25zaGlwLnNldExlZnQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdSZWxhdGlv
bnNoaXAuYWRkVG9PZmZzZXQob2Zmc2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvQWRk
LmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAgICAgICAg
ICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcCwgMCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5vdyB3ZSB3YW50IHRvIGVzdGFibGlzaCB0
aGF0IGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0IG9mIHRoZSBhZGRpdGlvbiBhcmUKKyAg
ICAgICAgICAgIC8vIHdpdGhpbiBhIHBhcnRpY3VsYXIgcmFuZ2Ugb2YgaW50ZWdlcnMuCisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAg
Ly8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBAdmFsdWUg
PD0gbWF4IC0gMSwgaS5lLiB0aGF0CisgICAgICAgICAgICAgICAgLy8gQHZhbHVlIDwgbWF4Lgor
ICAgICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0
czxpbnQ+OjptYXgoKSwgLW9mZnNldCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVs
YXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpzYWZlQ3Jl
YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwg
bV96ZXJvLCBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLSBvZmZzZXQgKyAxKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0
aGVuIHdlIGtub3cgdGhhdCBAYWRkID49IG1pbiArIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAg
ICAgIC8vIEBhZGQgPiBtaW4uCisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50
PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpLCBvZmZzZXQsIC0xKSkgeworICAgICAg
ICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBS
ZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwgbV96ZXJvLCBS
ZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkgKyBvZmZzZXQgLSAxKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgJiYgb2Zmc2V0ICE9IHN0ZDo6bnVt
ZXJpY19saW1pdHM8aW50Pjo6bWluKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZl
ICJhZGQ6IEB2YWx1ZSAtIDEiIHRoZW4gd2Uga25vdyB0aGF0IEB2YWx1ZSA+PSBtaW4gKyAxLCBp
LmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAdmFsdWUgPiBtaW4uCisgICAgICAgICAgICAg
ICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigp
LCBvZmZzZXQsIC0xKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisg
ICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0
aW9uc2hpcDo6R3JlYXRlclRoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpu
dW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9mZnNldCAtIDEpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFkZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRo
YXQgQGFkZCA8PSBtYXggLSAxLCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAYWRkIDwg
bWF4LgorICAgICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmlj
X2xpbWl0czxpbnQ+OjptYXgoKSwgLW9mZnNldCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAg
c2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpM
ZXNzVGhhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRz
PGludD46Om1heCgpIC0gb2Zmc2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6IHsKKyAg
ICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAobm9kZSwgbV96ZXJvLCBSZWxh
dGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAtMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFVwc2lsb246IHsKKyAgICAgICAgICAgIHNl
dFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUo
CisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+cGhpKCks
IFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0
byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAg
ICAgICAgICAgIGlmIChpdGVyICE9IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAg
ICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAo
UmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAg
ICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChub2RlLT5waGkoKSA9PSBuZXdSZWxhdGlvbnNoaXAucmlnaHQo
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAg
ICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2RlLT5waGkoKSk7CisgICAgICAgICAgICAgICAg
ICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAg
ICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNp
Z25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIHNldFJlbGF0aW9uc2hpcChtX3Jl
bGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAg
IHZvaWQgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICBSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9u
c2hpcE1hcCwgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9
IDEpCisgICAgeworICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25z
aGlwLCB0aW1lVG9MaXZlKTsKKyAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIHJl
bGF0aW9uc2hpcC5mbGlwcGVkKCksIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICB2b2lk
IHNldE9uZVNpZGUoCisgICAgICAgIFJlbGF0aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBS
ZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7
CisgICAgICAgIGlmICghcmVsYXRpb25zaGlwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2V0dGlu
ZzogIiwgcmVsYXRpb25zaGlwLCAiICh0dGwgPSAiLCB0aW1lVG9MaXZlLCAiKVxuIik7CisKKyAg
ICAgICAgYXV0byByZXN1bHQgPSByZWxhdGlvbnNoaXBNYXAuYWRkKAorICAgICAgICAgICAgcmVs
YXRpb25zaGlwLmxlZnQoKSwgVmVjdG9yPFJlbGF0aW9uc2hpcD4oKSk7CisgICAgICAgIFZlY3Rv
cjxSZWxhdGlvbnNoaXA+JiByZWxhdGlvbnNoaXBzID0gcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsK
KyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgIGJvb2wgZm91bmQg
PSBmYWxzZTsKKyAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAmIG90aGVyUmVsYXRpb25zaGlwIDog
cmVsYXRpb25zaGlwcykgeworICAgICAgICAgICAgaWYgKG90aGVyUmVsYXRpb25zaGlwLnNhbWVO
b2Rlc0FzKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlw
IGZpbHRlcmVkID0gb3RoZXJSZWxhdGlvbnNoaXAuZmlsdGVyKHJlbGF0aW9uc2hpcCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKGZpbHRlcmVkLmxlZnQoKSA9PSByZWxhdGlvbnNoaXAu
bGVmdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJSZWxhdGlvbnNoaXAgPSBmaWx0ZXJl
ZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUg
JiYgb3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAg
ICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygi
ICAgICAgQ29uc2lkZXJpbmc6ICIsIG90aGVyUmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlOgorICAgICAgICAgICAgICAgIC8v
ICAgICBAYSBvcCBAYiArIEMKKyAgICAgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGMgKyBECisg
ICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGltcGxpZXM6CisgICAg
ICAgICAgICAgICAgLy8gICAgIEBjICsgRCBvcCBAYiArIEMKKyAgICAgICAgICAgICAgICAvLyAg
ICAgQGMgb3AgQGIgKyBDIC0gRAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAg
Ly8gV2hlcmU6IEBhID09IHJlbGF0aW9uc2hpcC5sZWZ0KCksIEBiID09IHJlbGF0aW9uc2hpcC5y
aWdodCgpLAorICAgICAgICAgICAgICAgIC8vIEBhID09IG90aGVyUmVsYXRpb25zaGlwLmxlZnQo
KSwgQGMgPT0gb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKS4KKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlvbnNoaXAub2Zmc2V0KCkgIT0gc3RkOjpudW1l
cmljX2xpbWl0czxpbnQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICBp
ZiAobmV3UmVsYXRpb25zaGlwLnJpZ2h0KCkgIT0gb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlwLnNldExlZnQob3RoZXJS
ZWxhdGlvbnNoaXAucmlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVs
YXRpb25zaGlwLmFkZFRvT2Zmc2V0KC1vdGhlclJlbGF0aW9uc2hpcC5vZmZzZXQoKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICByZWxh
dGlvbnNoaXBzLmFwcGVuZChyZWxhdGlvbnNoaXApOworICAgICAgICAKKyAgICAgICAgZm9yIChS
ZWxhdGlvbnNoaXAgYW5vdGhlclJlbGF0aW9uc2hpcCA6IHRvQWRkKSB7CisgICAgICAgICAgICBB
U1NFUlQodGltZVRvTGl2ZSk7CisgICAgICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1h
cCwgYW5vdGhlclJlbGF0aW9uc2hpcCwgdGltZVRvTGl2ZSAtIDEpOworICAgICAgICB9CisgICAg
fQorICAgIAorICAgIGJvb2wgbWVyZ2VUbyhSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1h
cCwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAg
ICAgICAgICAgIGRhdGFMb2coIk1lcmdpbmcgdG8gIiwgcG9pbnRlckR1bXAodGFyZ2V0KSwgIjpc
biIpOworICAgICAgICAgICAgZGF0YUxvZygiICAgIEluY29taW5nOiAiLCBsaXN0RHVtcChzb3J0
ZWRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcE1hcCkpLCAiXG4iKTsKKyAgICAgICAgICAgIGRh
dGFMb2coIiAgICBBdCBoZWFkOiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKG1fcmVs
YXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdKSksICJcbiIpOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICBpZiAobV9zZWVuQmxvY2tzLmFkZCh0YXJnZXQpKSB7CisgICAgICAgICAgICAvLyBU
aGlzIGlzIGEgbmV3IGJsb2NrLiBXZSBjb3B5IHN1YmplY3QgdG8gbGl2ZW5lc3MgcHJ1bmluZy4K
KyAgICAgICAgICAgIGF1dG8gaXNMaXZlID0gWyZdIChOb2RlKiBub2RlKSB7CisgICAgICAgICAg
ICAgICAgaWYgKG5vZGUgPT0gbV96ZXJvKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LT5zc2EtPmxpdmVBdEhlYWQuY29udGFp
bnMobm9kZSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogcmVsYXRpb25zaGlwTWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFp
c0xpdmUoZW50cnkua2V5KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdmFsdWVzOwor
ICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGVudHJ5LnZh
bHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChyZWxhdGlvbnNoaXAubGVmdCgpID09
IGVudHJ5LmtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0xpdmUocmVsYXRpb25zaGlw
LnJpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgIFByb3BhZ2F0aW5nICIsIHJlbGF0aW9u
c2hpcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHJlbGF0
aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2
YWx1ZXMuZW5kKCkpOworICAgICAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJn
ZXRdLmFkZChlbnRyeS5rZXksIHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTWVyZ2UgYnkgaW50
ZXJzZWN0aW5nLiBXZSBoYXZlIG5vIG5vdGlvbiBvZiBCT1RUT00sIHNvIHdlIHVzZSB0aGUgb21p
c3Npb24gb2YKKyAgICAgICAgLy8gcmVsYXRpb25zaGlwcyBmb3IgYSBwYWlyIG9mIG5vZGVzIHRv
IG1lYW4gVE9QLiBUaGUgcmVhc29uIHdoeSB3ZSBkb24ndCBuZWVkIEJPVFRPTQorICAgICAgICAv
LyBpcyAoMSkgd2UganVzdCBvdmVyYXBwcm94aW1hdGUgY29udHJhZGljdGlvbnMgYW5kICgyKSBh
IHZhbHVlIG5ldmVyIGhhdmluZyBiZWVuCisgICAgICAgIC8vIGFzc2lnbmVkIHdvdWxkIG9ubHkg
aGFwcGVuIGlmIHdlIGhhdmUgbm90IHByb2Nlc3NlZCB0aGUgbm9kZSdzIHByZWRlY2Vzc29yLiBX
ZQorICAgICAgICAvLyBzaG91bGRuJ3QgcHJvY2VzcyBibG9ja3MgdW50aWwgd2UgaGF2ZSBwcm9j
ZXNzZWQgdGhlIGJsb2NrJ3MgcHJlZGVjZXNzb3IgYmVjYXVzZSB3ZQorICAgICAgICAvLyBhcmUg
dXNpbmcgUlBPLgorICAgICAgICBWZWN0b3I8Tm9kZSo+IHRvUmVtb3ZlOworICAgICAgICBib29s
IGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IG1fcmVsYXRpb25z
aGlwc0F0SGVhZFt0YXJnZXRdKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSByZWxhdGlvbnNo
aXBNYXAuZmluZChlbnRyeS5rZXkpOworICAgICAgICAgICAgaWYgKGl0ZXIgPT0gcmVsYXRpb25z
aGlwTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGVudHJ5Lmtl
eSk7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZlY3RvcjxS
ZWxhdGlvbnNoaXA+IHZhbHVlczsKKyAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHRhcmdl
dFJlbGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZm9yIChSZWxh
dGlvbnNoaXAgc291cmNlUmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIg
IE1lcmdpbmcgIiwgdGFyZ2V0UmVsYXRpb25zaGlwLCAiIGFuZCAiLCBzb3VyY2VSZWxhdGlvbnNo
aXAsICI6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVsYXRpb25zaGlwLm1lcmdl
KAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUmVsYXRpb25zaGlwLAorICAgICAgICAg
ICAgICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRhdGFMb2coIiAgICBHb3QgIiwgbmV3UmVsYXRpb25zaGlwLCAiXG4iKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBXZSBuZWVkIHRvIGZpbHRlcigpIHRvIGF2b2lkIGV4cG9uZW50aWFsIGV4cGxvc2lvbiBv
ZiBpZGVudGljYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBz
LiBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgbWFraW5nIHNldE9uZVNpZGUoKSBkbworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgd29yaywgc2luY2Ugd2UgZXhwZWN0IHNldE9u
ZVNpZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1wbGUuIEF0IHNvbWUgcG9pbnQgc29tZW9uZSBt
aWdodCBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdHdvIHJlbGF0
aW9uc2hpcHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQgQGEgPCBAYiArIEQuIFRoZW4KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBzb21lb25lIGRvZXMgYSBzZXRSZWxhdGlvbnNoaXAoKSBw
YXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gYm90aCBvZiB0aGVzZSBpbnRvIEBhID09IEBiLiBOb3cgd2UgaGF2ZSBAYSA9PSBAYiBkdXBs
aWNhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIHNheSB0aGF0IHRo
aXMgZHVwbGljYXRlIEBhID09IEBiIGVuZHMgdXAgYXQgdGhlIGhlYWQgb2YgYQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIGxvb3AuIElmIHdlIGRpZG4ndCBoYXZlIHRoaXMgcnVsZSwg
dGhlbiB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRvIHRoZSBleGlzdGluZyBkdXBsaWNhdGUgQGEg
PT0gQGIncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSB3b3VsZCBiZSBm
b3VyIHBhaXJzIG9mIEBhID09IEBiLCBlYWNoIG9mIHdoaWNoIHdvdWxkCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEBhID09IEBiLiBOb3cgd2UnZCBoYXZlIGZv
dXIgb2YgdGhlc2UgZHVwbGljYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFu
ZCB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSdkIGhhdmUgOCwgdGhlbiAxNiwgZXRjLiBXZSBhdm9p
ZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaGVyZSBieSBkb2luZyB0aGlz
IGZpbHRyYXRpb24uIFRoYXQgbWlnaHQgYmUgYSBiaXQgb2YKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBvdmVya2lsbCwgc2luY2UgaXQncyBwcm9iYWJseSBqdXN0IHRoZSBpZGVudGlj
YWwgZHVwbGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlw
IGNhc2Ugd2Ugd2FudCcgdG8gYXZvaWQuIEJ1dCwgSSdsbCBrZWVwIHRoaXMgdW50aWwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGV2aWRlbmNlIHRoYXQgdGhpcyBpcyBh
IHBlcmZvcm1hbmNlIHByb2JsZW0uIFJlbWVtYmVyIC0KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGggYSBsaXN0IHRoYXQgaXMgcHJ1bmVk
IGRvd24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzIHdp
dGggaWRlbnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQgc2hvdWxkbid0IGJlIGEKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBsYXJnZSBsaXN0LgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciAoUmVsYXRpb25zaGlwJiBleGlzdGluZ1JlbGF0aW9uc2hpcCA6IHZhbHVlcykgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdSZWxhdGlvbnNoaXAu
c2FtZU5vZGVzQXMobmV3UmVsYXRpb25zaGlwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVsYXRpb25zaGlwIGZpbHRlcmVkID0KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0aW9uc2hpcC5maWx0ZXIobmV3UmVsYXRp
b25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJl
ZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVs
YXRpb25zaGlwID0gZmlsdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHZhbHVlcy5hcHBlbmQobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICAgICAgICAgIGlm
IChlbnRyeS52YWx1ZSA9PSB2YWx1ZXMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWVzOworICAgICAgICAgICAg
Y2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChOb2RlKiBub2RlIDogdG9S
ZW1vdmUpCisgICAgICAgICAgICBtX3JlbGF0aW9uc2hpcHNBdEhlYWRbdGFyZ2V0XS5yZW1vdmUo
bm9kZSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisgICAgICAg
IAorICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHNvcnRlZFJlbGF0aW9uc2hpcHMoY29uc3QgUmVs
YXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBzKQorICAgIHsKKyAgICAgICAgVmVjdG9yPFJlbGF0
aW9uc2hpcD4gcmVzdWx0OworICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogcmVsYXRpb25zaGlw
cykKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRWZWN0b3IoZW50cnkudmFsdWUpOworICAgICAg
ICBzdGQ6OnNvcnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSk7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorICAgIAorICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHNvcnRlZFJl
bGF0aW9uc2hpcHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNvcnRlZFJlbGF0aW9uc2hpcHMo
bV9yZWxhdGlvbnNoaXBzKTsKKyAgICB9CisgICAgCisgICAgTm9kZSogbV96ZXJvOworICAgIFJl
bGF0aW9uc2hpcE1hcCBtX3JlbGF0aW9uc2hpcHM7CisgICAgQmxvY2tTZXQgbV9zZWVuQmxvY2tz
OworICAgIEJsb2NrTWFwPFJlbGF0aW9uc2hpcE1hcD4gbV9yZWxhdGlvbnNoaXBzQXRIZWFkOwor
ICAgIEluc2VydGlvblNldCBtX2luc2VydGlvblNldDsKK307CisgICAgCit9IC8vIGFub255bW91
cyBuYW1lc3BhY2UKKworYm9vbCBwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKEdyYXBo
JiBncmFwaCkKK3sKKyAgICBTYW1wbGluZ1JlZ2lvbiBzYW1wbGluZ1JlZ2lvbigiREZHIEludGVn
ZXIgUmFuZ2UgT3B0aW1pemF0aW9uIFBoYXNlIik7CisgICAgcmV0dXJuIHJ1blBoYXNlPEludGVn
ZXJSYW5nZU9wdGltaXphdGlvblBoYXNlPihncmFwaCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJMRShERkdfSklUKQorCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2lmbmRlZiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZV9oCisjZGVmaW5lIERGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gKKworI2lmIEVOQUJMRShERkdfSklUKQorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7CisKK2NsYXNzIEdyYXBoOworCisvLyBSZW1v
dmVzIG92ZXJmbG93IGNoZWNrcyBhbmQgb3V0LW9mLWJvdW5kcyBjaGVja3MgYnkgZG9pbmcgYSBm
b3J3YXJkIGZsb3cgYW5hbHlzaXMgdG8gcHJvdmUKKy8vIGluZXF1YWxpdGllcy4KKworYm9vbCBw
ZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKEdyYXBoJik7CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJMRShERkdfSklUKQorCisjZW5kaWYgLy8gREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1BsYW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHUGxhbi5jcHAJKHJldmlzaW9uIDE4NTYwMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHUGxhbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDYgKzQ0LDcgQEAKICNp
bmNsdWRlICJERkdGaXh1cFBoYXNlLmgiCiAjaW5jbHVkZSAiREZHR3JhcGhTYWZlcG9pbnQuaCIK
ICNpbmNsdWRlICJERkdJbnRlZ2VyQ2hlY2tDb21iaW5pbmdQaGFzZS5oIgorI2luY2x1ZGUgIkRG
R0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgiCiAjaW5jbHVkZSAiREZHSW52YWxpZGF0
aW9uUG9pbnRJbmplY3Rpb25QaGFzZS5oIgogI2luY2x1ZGUgIkRGR0pJVENvbXBpbGVyLmgiCiAj
aW5jbHVkZSAiREZHTElDTVBoYXNlLmgiCkBAIC0zNTcsNiArMzU4LDggQEAgUGxhbjo6Q29tcGls
YXRpb25QYXRoIFBsYW46OmNvbXBpbGVJblRocgogICAgICAgICBwZXJmb3JtQ29uc3RhbnRIb2lz
dGluZyhkZmcpOwogICAgICAgICBwZXJmb3JtR2xvYmFsQ1NFKGRmZyk7CiAgICAgICAgIHBlcmZv
cm1MaXZlbmVzc0FuYWx5c2lzKGRmZyk7CisgICAgICAgIHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRp
bWl6YXRpb24oZGZnKTsKKyAgICAgICAgcGVyZm9ybUxpdmVuZXNzQW5hbHlzaXMoZGZnKTsKICAg
ICAgICAgcGVyZm9ybUNGQShkZmcpOwogICAgICAgICBwZXJmb3JtQ29uc3RhbnRGb2xkaW5nKGRm
Zyk7CiAgICAgICAgIHBlcmZvcm1DbGVhblVwKGRmZyk7IC8vIFJlZHVjZSB0aGUgZ3JhcGggc2l6
ZSBhIGxvdC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYWRkLW92
ZXJmbG93cy1hZnRlci1ub3QtZXF1YWwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3Rlc3RzL3N0cmVzcy9hZGQtb3ZlcmZsb3dzLWFmdGVyLW5vdC1lcXVhbC5qcwkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvYWRkLW92ZXJm
bG93cy1hZnRlci1ub3QtZXF1YWwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNiBAQAor
ZnVuY3Rpb24gZm9vKGEpIHsKKyAgICBpZiAoYSAhPSAwKQorICAgICAgICByZXR1cm4gYSArIDE7
Cit9CisKK25vSW5saW5lKGZvbyk7CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDA7ICsraSkg
eworICAgIHZhciByZXN1bHQgPSBmb28oNDIpOworICAgIGlmIChyZXN1bHQgIT0gNDMpCisgICAg
ICAgIHRocm93ICJFcnJvcjogYmFkIHJlc3VsdCBpbiBsb29wOiAiICsgcmVzdWx0OworfQorCit2
YXIgcmVzdWx0ID0gZm9vKDIxNDc0ODM2NDcpOworaWYgKHJlc3VsdCAhPSAyMTQ3NDgzNjQ4KQor
ICAgIHRocm93ICJFcnJvcjogYmFkIHJlc3VsdCBhdCBlbmQ6ICIgKyByZXN1bHQ7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3N1Yi1vdmVyZmxvd3MtYWZ0ZXItbm90
LWVxdWFsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJl
c3Mvc3ViLW92ZXJmbG93cy1hZnRlci1ub3QtZXF1YWwuanMJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3N1Yi1vdmVyZmxvd3MtYWZ0ZXItbm90LWVx
dWFsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTYgQEAKK2Z1bmN0aW9uIGZvbyhhKSB7
CisgICAgaWYgKGEgIT0gMCkKKyAgICAgICAgcmV0dXJuIGEgLSAxOworfQorCitub0lubGluZShm
b28pOworCitmb3IgKHZhciBpID0gMDsgaSA8IDEwMDAwOyArK2kpIHsKKyAgICB2YXIgcmVzdWx0
ID0gZm9vKDQyKTsKKyAgICBpZiAocmVzdWx0ICE9IDQxKQorICAgICAgICB0aHJvdyAiRXJyb3I6
IGJhZCByZXN1bHQgaW4gbG9vcDogIiArIHJlc3VsdDsKK30KKwordmFyIHJlc3VsdCA9IGZvbygt
MjE0NzQ4MzY0OCk7CitpZiAocmVzdWx0ICE9IC0yMTQ3NDgzNjQ5KQorICAgIHRocm93ICJFcnJv
cjogYmFkIHJlc3VsdCBhdCBlbmQ6ICIgKyByZXN1bHQ7CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxODU2
MDApCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwy
NyBAQAorMjAxNS0wNi0xMCAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAg
ICAgIEZUTCBzaG91bGQgZWxpbWluYXRlIGFycmF5IGJvdW5kcyBjaGVja3MgaW4gbG9vcHMKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTc2OAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICoganMvcmVncmVz
cy9hYmMtZm9yd2FyZC1sb29wLWVxdWFsLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICog
anMvcmVncmVzcy9hYmMtZm9yd2FyZC1sb29wLWVxdWFsLmh0bWw6IEFkZGVkLgorICAgICAgICAq
IGpzL3JlZ3Jlc3MvYWJjLXBvc3RmaXgtYmFja3dhcmQtbG9vcC1leHBlY3RlZC50eHQ6IEFkZGVk
LgorICAgICAgICAqIGpzL3JlZ3Jlc3MvYWJjLXBvc3RmaXgtYmFja3dhcmQtbG9vcC5odG1sOiBB
ZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC1leHBl
Y3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2Fy
ZC1sb29wLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3
YXJkLWxvb3AtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2FiYy1z
aW1wbGUtZm9yd2FyZC1sb29wLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3Mvc2Ny
aXB0LXRlc3RzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwuanM6IEFkZGVkLgorICAgICAgICAoZm9v
KToKKyAgICAgICAgKiBqcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2Fy
ZC1sb29wLmpzOiBBZGRlZC4KKyAgICAgICAgKGZvbyk6CisgICAgICAgICoganMvcmVncmVzcy9z
Y3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLmpzOiBBZGRlZC4KKyAgICAgICAg
KGZvbyk6CisgICAgICAgICoganMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1mb3J3
YXJkLWxvb3AuanM6IEFkZGVkLgorICAgICAgICAoZm9vKToKKwogMjAxNS0wNi0xNiAgQWxleGV5
IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxlLmNvbT4KIAogICAgICAgICBSRUdSRVNTSU9OOiBqcy9k
b20vbmF2aWdhdG9yLXBsdWdpbnMtY3Jhc2guaHRtbCBhc3NlcnRzIGEgbG90CkluZGV4OiBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwtZXhwZWN0ZWQudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVh
bC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2Fi
Yy1mb3J3YXJkLWxvb3AtZXF1YWwtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTAgQEAKK0pTUmVncmVzcy9hYmMtZm9yd2FyZC1sb29wLWVxdWFsCisKK09uIHN1Y2Nlc3Ms
IHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJU
RVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mgc3VjY2Vz
c2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwuaHRtbAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwuaHRtbAkocmV2aXNp
b24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5o
dG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJ
QyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0i
Li4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5
PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXByZS5qcyI+PC9zY3JpcHQ+
Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwuanMiPjwv
c2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXBvc3QuanMiPjwv
c2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwv
c2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9h
YmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0
CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNr
d2FyZC1sb29wLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwIEBACitK
U1JlZ3Jlc3MvYWJjLXBvc3RmaXgtYmFja3dhcmQtbG9vcAorCitPbiBzdWNjZXNzLCB5b3Ugd2ls
bCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01Q
TEVURSIuCisKKworUEFTUyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBh
cnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVn
cmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmh0bWwKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvanMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmh0bWwJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3Au
aHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJM
SUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9
Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9k
eT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0
PgorPHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmpz
Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wb3N0Lmpz
Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wb3N0Lmpz
Ij48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jl
c3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC1leHBlY3RlZC50
eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFj
a3dhcmQtbG9vcC1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMCBAQAor
SlNSZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcAorCitPbiBzdWNjZXNzLCB5b3Ugd2ls
bCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01Q
TEVURSIuCisKKworUEFTUyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBh
cnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVn
cmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC5odG1sCShyZXZpc2lvbiAw
KQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuaHRt
bAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMg
Ii0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4u
Ly4uL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4K
KzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0Pgor
PHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuanMiPjwv
c2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXBvc3QuanMiPjwv
c2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwv
c2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9h
YmMtc2ltcGxlLWZvcndhcmQtbG9vcC1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvanMvcmVncmVzcy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC1leHBlY3RlZC50eHQJKHJl
dmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1s
b29wLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwIEBACitKU1JlZ3Jl
c3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AKKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEg
c2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgor
CisKK1BBU1Mgbm8gZXhjZXB0aW9uIHRocm93bgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMg
dHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJj
LXNpbXBsZS1mb3J3YXJkLWxvb3AuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLmh0bWwJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9E
VEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJj
ZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8c2NyaXB0IHNy
Yz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3Jj
PSJzY3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuanMiPjwvc2NyaXB0PgorPHNj
cmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0PgorPHNj
cmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9i
b2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMv
YWJjLWZvcndhcmQtbG9vcC1lcXVhbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtZm9yd2FyZC1sb29wLWVxdWFsLmpzCShyZXZpc2lvbiAw
KQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLWZvcndhcmQtbG9v
cC1lcXVhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0IEBACitmdW5jdGlvbiBmb28o
YXJyYXkpIHsKKyAgICB2YXIgcmVzdWx0ID0gMDsKKyAgICBmb3IgKHZhciBpID0gMDsgaSAhPSBh
cnJheS5sZW5ndGg7ICsraSkKKyAgICAgICAgcmVzdWx0ICs9IGFycmF5W2ldOworICAgIHJldHVy
biByZXN1bHQ7Cit9CisKK25vSW5saW5lKGZvbyk7CisKK3ZhciBhcnJheSA9IFtdOworZm9yICh2
YXIgaSA9IDA7IGkgPCAxMDAwOyArK2kpCisgICAgYXJyYXkucHVzaChpKTsKK2ZvciAodmFyIGkg
PSAwOyBpIDwgNTAwMDA7ICsraSkKKyAgICBmb28oYXJyYXkpOwpJbmRleDogTGF5b3V0VGVzdHMv
anMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXBvc3RmaXgtYmFja3dhcmQtbG9vcC5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtcG9zdGZp
eC1iYWNrd2FyZC1sb29wLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVz
cy9zY3JpcHQtdGVzdHMvYWJjLXBvc3RmaXgtYmFja3dhcmQtbG9vcC5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE0IEBACitmdW5jdGlvbiBmb28oYXJyYXkpIHsKKyAgICB2YXIgcmVzdWx0
ID0gMDsKKyAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoOyBpLS07KQorICAgICAgICByZXN1
bHQgKz0gYXJyYXlbaV07CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsK
KwordmFyIGFycmF5ID0gW107Citmb3IgKHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICBh
cnJheS5wdXNoKGkpOworZm9yICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZvbyhh
cnJheSk7CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2lt
cGxlLWJhY2t3YXJkLWxvb3AuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVz
cy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLmpzCShyZXZpc2lvbiAwKQor
KysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1iYWNrd2Fy
ZC1sb29wLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0aW9uIGZvbyhh
cnJheSkgeworICAgIHZhciByZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5n
dGggLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgcmVzdWx0ICs9IGFycmF5W2ldOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK25vSW5saW5lKGZvbyk7CisKK3ZhciBhcnJheSA9IFtdOworZm9y
ICh2YXIgaSA9IDA7IGkgPCAxMDAwOyArK2kpCisgICAgYXJyYXkucHVzaChpKTsKK2ZvciAodmFy
IGkgPSAwOyBpIDwgNTAwMDA7ICsraSkKKyAgICBmb28oYXJyYXkpOwpJbmRleDogTGF5b3V0VGVz
dHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBs
ZS1mb3J3YXJkLWxvb3AuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNz
L3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDE0IEBACitmdW5jdGlvbiBmb28oYXJyYXkpIHsKKyAgICB2YXIgcmVzdWx0ID0g
MDsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKQorICAgICAgICBy
ZXN1bHQgKz0gYXJyYXlbaV07CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9v
KTsKKwordmFyIGFycmF5ID0gW107Citmb3IgKHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAg
ICBhcnJheS5wdXNoKGkpOworZm9yICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZv
byhhcnJheSk7Cg==
</data>
<flag name="review"
          id="279980"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254993</attachid>
            <date>2015-06-16 18:55:18 -0700</date>
            <delta_ts>2015-06-16 19:42:49 -0700</delta_ts>
            <desc>getting ready for landing</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>76480</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg1NjE4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM5IEBA
CisyMDE1LTA2LTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgQmVuamFtaW4gUG91bGFpbi4KKyAgICAgICAgCisgICAgICAgIFRoaXMg
YWRkcyBhIHBoYXNlIHRoYXQgZG9lcyBmb3J3YXJkIHByb3BhZ2F0aW9uIG9mIGludGVnZXIgaW5l
cXVhbGl0aWVzLiBUaGlzIGFsbG93cyB1cworICAgICAgICB0byBkbyB0aGUgYWxnZWJyYWljIHJl
YXNvbmluZyB3ZSBuZWVkIHRvIGVsaW1pbmF0ZSBhcnJheSBib3VuZHMgY2hlY2tzIGluIGxvb3Bz
LiBJdAorICAgICAgICBhbHNvIGVsaW1pbmF0ZXMgb3ZlcmZsb3cgY2hlY2tzIG9uIEFyaXRoQWRk
IHdpdGggYSBjb25zdGFudC4KKyAgICAgICAgCisgICAgICAgIFRoZSBwaGFzZSdzIGFuYWx5c2lz
IHByb2R1Y2VzIHJlc3VsdHMgdGhhdCBhcmUgcG93ZXJmdWwgZW5vdWdoIHRvIGRvIHNwZWN1bGF0
aXZlIGJvdW5kcworICAgICAgICBjaGVjayBob2lzdGluZywgYnV0IHRoaXMgcGhhc2UgY3VycmVu
dGx5IG9ubHkgZG9lcyBlbGltaW5hdGlvbi4gV2UgY2FuIGltcGxlbWVudAorICAgICAgICBob2lz
dGluZyBsYXRlci4KKyAgICAgICAgCisgICAgICAgIE9uIHByb2dyYW1zIHRoYXQganVzdCBsb29w
IG92ZXIgYW4gYXJyYXkgbGlrZToKKyAgICAgICAgCisgICAgICAgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIHRoaW5neSArPSBhcnJh
eVtpXQorICAgICAgICAKKyAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYSA2MCUgc3BlZWQtdXAuCisg
ICAgICAgIAorICAgICAgICBUaGlzIGlzIGFsc28gYSB+MyUgc3BlZWQtdXAgb24gS3Jha2VuLCBh
bmQgaXQgc2hvd3MgdmFyaW91cyBzcGVlZC11cHMgb24gaW5kaXZpZHVhbAorICAgICAgICB0ZXN0
cyBpbiBPY3RhbmUuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBKYXZh
U2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2o6CisgICAgICAgICogSmF2
YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBkZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6
REZHOjpwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKToKKyAgICAgICAgKiBkZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaDogQWRkZWQuCisgICAgICAgICogZGZnL0RG
R1BsYW4uY3BwOgorICAgICAgICAoSlNDOjpERkc6OlBsYW46OmNvbXBpbGVJblRocmVhZEltcGwp
OgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9hZGQtb3ZlcmZsb3dzLWFmdGVyLW5vdC1lcXVhbC5q
czogQWRkZWQuCisgICAgICAgICogdGVzdHMvc3RyZXNzL3N1Yi1vdmVyZmxvd3MtYWZ0ZXItbm90
LWVxdWFsLmpzOiBBZGRlZC4KKwogMjAxNS0wNi0xNiAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBw
bGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGwgb3V0IHVuaW50ZW5kZWQgSlNDIGNo
YW5nZSBmcm9tIGh0dHBzOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC8xODU0MjUuCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiAxODU2MTgpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTE4
MSw2ICsxODEsNyBAQCBzZXQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGRmZy9ERkdJblBs
YWNlQWJzdHJhY3RTdGF0ZS5jcHAKICAgICBkZmcvREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUu
Y3BwCiAgICAgZGZnL0RGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNlLmNwcAorICAgIGRmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSW52YWxpZGF0
aW9uUG9pbnRJbmplY3Rpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSklUQ29kZS5jcHAKICAgICBk
ZmcvREZHSklUQ29tcGlsZXIuY3BwCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNj
cmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3Jl
LnZjeHByb2oJKHJldmlzaW9uIDE4NTYxOCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZh
U2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2oJKHdvcmtpbmcgY29weSkK
QEAgLTQxOCw2ICs0MTgsNyBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0lu
UGxhY2VBYnN0cmFjdFN0YXRlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRm
Z1xERkdJbnNlcnRPU1JIaW50c0ZvclVwZGF0ZS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNs
dWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwIiAvPgorICAgIDxD
bENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnZhbGlkYXRpb25Q
b2ludEluamVjdGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRm
Z1xERkdKSVRDb2RlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdK
SVRDb21waWxlci5jcHAiIC8+CkBAIC0xMTA5LDYgKzExMTAsNyBAQAogICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5cZGZnXERGR0luc2VydE9TUkhpbnRzRm9yVXBkYXRlLmgiIC8+CiAgICAgPENs
SW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW5zZXJ0aW9uU2V0LmgiIC8+CiAgICAgPENsSW5j
bHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuaCIgLz4K
KyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRp
b25QaGFzZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludmFsaWRh
dGlvblBvaW50SW5qZWN0aW9uUGhhc2UuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4u
XGRmZ1xERkdKSVRDb2RlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZH
SklUQ29tcGlsZXIuaCIgLz4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZp
c2lvbiAxODU2MTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBA
CiAJCTBGODM2NEI3MTY0QjBDMTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBD
MEUwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyog
Qnl0ZWNvZGVVc2VEZWYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDBGODg1RTEwMTg0OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBz
ZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkz
NkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEy
MTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzEx
QjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIy
NzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87
IH07CisJCTBGODk4RjMyMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJMEY4RjE0MzMxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzky
QyAvKiBERkdFcG9jaC5jcHAgKi87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBE
RkdFcG9jaC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MEY4RjE0MzAxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FU
VFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJD
IC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhp
bnRSZW1vdmFsUGhhc2UuY3BwICovOyB9OwpAQCAtMjE1NCw2ICsyMTU2LDggQEAKIAkJMEY4MzY0
QjUxNjRCMEMwRTAwNTMzMjlBIC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IG5hbWUgPSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdC
cmFuY2hEaXJlY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAx
ODQ5QTNCRTAwRjFFM0ZBIC8qIEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IEJ5dGVjb2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVl
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFi
c3RyYWN0VmFsdWUuY3BwOyBwYXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0Mg
LyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBuYW1lID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3Bw
OyBwYXRoID0gZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
bmFtZSA9IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJMEY4RjE0MkYxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdF
cG9jaC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEw
MEVENzkyQyAvKiBERkdFcG9jaC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBE
RkdFcG9jaC5oOyBwYXRoID0gZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCTBGOEYxNDMxMUFERjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNl
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1v
dmFsUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNDk3Miw2ICs0OTc2LDggQEAKIAkJCQkwRjJCOUNE
OTE5RDBCQTdEMDBCMUQxQjUgLyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJ
CQkwRjMwMEI3OTE4QUIxQjE0MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhh
c2UuY3BwICovLAogCQkJCTBGMzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hl
Y2tDb21iaW5pbmdQaGFzZS5oICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBE
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3
Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJ
CQkJMEZDOTdGMzcxODIwMjExOTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0
aW9uUGhhc2UuY3BwICovLAogCQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZh
bGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAw
QkI3MjJDIC8qIERGR0pJVENvZGUuY3BwICovLApAQCAtNTYwOSw2ICs1NjE1LDcgQEAKIAkJCQkw
RjZCMUNDQTE4NjQxREY4MDA4NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBp
biBIZWFkZXJzICovLAogCQkJCTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNr
TW9kZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFS
TTY0QXNzZW1ibGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0Ez
M0MgLyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAog
CQkJCTg2RDNCMkM0MTAxNTZCREUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTBGRTA1MDI4MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBp
biBIZWFkZXJzICovLAogCQkJCTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlw
ZS5oIGluIEhlYWRlcnMgKi8sCkBAIC03MzQzLDYgKzczNTAsNyBAQAogCQkJCTBGMkI2NkU4MTdC
NkI1QUIwMEE3QUUzRiAvKiBKU0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQlBN0JEQUVDQTE3RjRFQTE0MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTE0MjEzNTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJC
MkUwMDE3NzNCNyAvKiBKU0JvdW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0
MEY4QUYwQTUwOEQyMDAwMDVGMDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQkxNDQwRjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0
aW9uLmNwcCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEzMDIgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgi
CisKKyNpZiBFTkFCTEUoREZHX0pJVCkKKworI2luY2x1ZGUgIkRGR0Jsb2NrTWFwSW5saW5lcy5o
IgorI2luY2x1ZGUgIkRGR0dyYXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisj
aW5jbHVkZSAiREZHUGhhc2UuaCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25Q
aGFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRl
ICJKU0NJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFt
ZXNwYWNlIHsKKworY29uc3QgYm9vbCB2ZXJib3NlID0gZmFsc2U7CisKK2ludDY0X3QgY2xhbXBl
ZFN1bUltcGwoKSB7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+Citp
bnQ2NF90IGNsYW1wZWRTdW1JbXBsKGludCBsZWZ0LCBBcmdzLi4uIGFyZ3MpCit7CisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGxlZnQpICsgY2xhbXBlZFN1bUltcGwoYXJncy4uLik7
Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitpbnQgY2xhbXBlZFN1bShBcmdzLi4u
IGFyZ3MpCit7CisgICAgaW50NjRfdCByZXN1bHQgPSBjbGFtcGVkU3VtSW1wbChhcmdzLi4uKTsK
KyAgICByZXR1cm4gc3RkOjptaW4oCisgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6
bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpLAorICAgICAgICBzdGQ6Om1heCgKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkp
LAorICAgICAgICAgICAgcmVzdWx0KSk7Cit9CisKK2NsYXNzIFJlbGF0aW9uc2hpcCB7CitwdWJs
aWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgTGVzc1RoYW4sCisgICAgICAgIEVxdWFsLAor
ICAgICAgICBOb3RFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4KKyAgICB9OworICAgIAorICAg
IHN0YXRpYyBLaW5kIGZsaXBwZWQoS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChr
aW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICByZXR1cm4gR3JlYXRl
clRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICByZXR1cm4gRXF1YWw7Cisg
ICAgICAgIGNhc2UgTm90RXF1YWw6CisgICAgICAgICAgICByZXR1cm4gTm90RXF1YWw7CisgICAg
ICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICByZXR1cm4gTGVzc1RoYW47CisgICAg
ICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0
dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAgICAgIDogbV9s
ZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxscHRyKQorICAgICAgICAsIG1fa2lu
ZChFcXVhbCkKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgIHsKKyAgICB9CisgICAgCisgICAg
UmVsYXRpb25zaGlwKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZz
ZXQgPSAwKQorICAgICAgICA6IG1fbGVmdChsZWZ0KQorICAgICAgICAsIG1fcmlnaHQocmlnaHQp
CisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAg
IHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQobV9yaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCAhPSBtX3JpZ2h0KTsK
KyAgICB9CisgICAgCisgICAgc3RhdGljIFJlbGF0aW9uc2hpcCBzYWZlQ3JlYXRlKE5vZGUqIGxl
ZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAg
ICAgaWYgKCFsZWZ0IHx8ICFyaWdodCB8fCBsZWZ0ID09IHJpZ2h0KQorICAgICAgICAgICAgcmV0
dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKGxlZnQsIHJp
Z2h0LCBraW5kLCBvZmZzZXQpOworICAgIH0KKyAgICAKKyAgICB0eXBlZGVmIHZvaWQqIChSZWxh
dGlvbnNoaXA6OipVbnNwZWNpZmllZEJvb2xUeXBlKTsKKworICAgIG9wZXJhdG9yIFVuc3BlY2lm
aWVkQm9vbFR5cGUqKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xlZnQgPyByZWlu
dGVycHJldF9jYXN0PFVuc3BlY2lmaWVkQm9vbFR5cGUqPigxKSA6IDA7CisgICAgfQorICAgIAor
ICAgIE5vZGUqIGxlZnQoKSBjb25zdCB7IHJldHVybiBtX2xlZnQ7IH0KKyAgICBOb2RlKiByaWdo
dCgpIGNvbnN0IHsgcmV0dXJuIG1fcmlnaHQ7IH0KKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJl
dHVybiBtX2tpbmQ7IH0KKyAgICBpbnQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXQ7
IH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgZmxpcHBlZCgpIGNvbnN0CisgICAgeworICAgICAg
ICBpZiAoISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAg
ICAKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIFJlbGF0aW9uc2hpcCgpIGlmIC1tX29m
ZnNldCBvdmVyZmxvd3MuIEZvciBleGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAgICAg
QGEgPiBAYiAtIDIqKjMxCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHdlIGZsaXAgaXQgd2Ug
Z2V0OgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQGIgPCBAYSArIDIqKjMxCisgICAgICAg
IC8vCisgICAgICAgIC8vIEV4Y2VwdCB0aGF0IHRoZSBzaWduIGdldHMgZmxpcHBlZCBzaW5jZSBp
dCdzIElOVF9NSU46CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYiA8IEBhIC0gMioqMzEK
KyAgICAgICAgLy8KKyAgICAgICAgLy8gQW5kIHRoYXQgbWFrZXMgbm8gc2Vuc2UuIFRvIHNlZSBo
b3cgbGl0dGxlIHNlbnNlIGl0IG1ha2VzLCBjb25zaWRlcjoKKyAgICAgICAgLy8KKyAgICAgICAg
Ly8gICAgIEBhID4gQHplcm8gLSAyKiozMQorICAgICAgICAvLworICAgICAgICAvLyBXZSB3b3Vs
ZCBmbGlwIGl0IHRvIG1lYW46CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAemVybyA8IEBh
IC0gMioqMzEKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hpY2ggaXMgYWJzdXJkLgorICAgICAg
ICAKKyAgICAgICAgaWYgKG1fb2Zmc2V0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWlu
KCkpCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gUmVsYXRpb25zaGlwKG1fcmlnaHQsIG1fbGVmdCwgZmxpcHBlZChtX2tpbmQpLCAt
bV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgaW52ZXJzZSgpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAoISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOwor
ICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDoK
KyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBOb3RFcXVh
bCwgbV9vZmZzZXQpOworICAgICAgICBjYXNlIE5vdEVxdWFsOgorICAgICAgICAgICAgcmV0dXJu
IFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCk7CisgICAgICAg
IGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZz
ZXQsIC0xKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAg
ICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgR3JlYXRlclRoYW4sIG1f
b2Zmc2V0IC0gMSk7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBpZiAo
c3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBt
X3JpZ2h0LCBMZXNzVGhhbiwgbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgCisgICAgYm9v
bCBpc0Nhbm9uaWNhbCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVmdCA8IG1fcmlnaHQ7IH0KKyAgICAK
KyAgICBSZWxhdGlvbnNoaXAgY2Fub25pY2FsKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChp
c0Nhbm9uaWNhbCgpKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICByZXR1cm4g
ZmxpcHBlZCgpOworICAgIH0KKyAgICAKKyAgICBib29sIHNhbWVOb2Rlc0FzKGNvbnN0IFJlbGF0
aW9uc2hpcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID09IG90
aGVyLm1fbGVmdAorICAgICAgICAgICAgJiYgbV9yaWdodCA9PSBvdGhlci5tX3JpZ2h0OworICAg
IH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzYW1lTm9kZXNBcyhvdGhlcikKKyAgICAgICAg
ICAgICYmIG1fa2luZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09
IG90aGVyLm1fb2Zmc2V0OworICAgIH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
UmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVsYXRp
b25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgIT0gb3RoZXIu
bV9sZWZ0KQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdCA8IG90aGVyLm1fbGVmdDsKKyAgICAg
ICAgaWYgKG1fcmlnaHQgIT0gb3RoZXIubV9yaWdodCkKKyAgICAgICAgICAgIHJldHVybiBtX3Jp
Z2h0IDwgb3RoZXIubV9yaWdodDsKKyAgICAgICAgaWYgKG1fa2luZCAhPSBvdGhlci5tX2tpbmQp
CisgICAgICAgICAgICByZXR1cm4gbV9raW5kIDwgb3RoZXIubV9raW5kOworICAgICAgICByZXR1
cm4gbV9vZmZzZXQgPCBvdGhlci5tX29mZnNldDsKKyAgICB9CisgICAgCisgICAgLy8gSWYgcG9z
c2libGUsIHJldHVybnMgYSBmb3JtIG9mIHRoaXMgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSBnaXZl
biBub2RlIGlzIHRoZSBsZWZ0CisgICAgLy8gc2lkZS4gUmV0dXJucyBhIG51bGwgcmVsYXRpb25z
aGlwIGlmIHRoaXMgcmVsYXRpb25zaGlwIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgdGhpcwor
ICAgIC8vIG5vZGUuCisgICAgUmVsYXRpb25zaGlwIGZvck5vZGUoTm9kZSogbm9kZSkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgaWYgKG1fcmlnaHQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBm
bGlwcGVkKCk7CisgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICB9CisgICAgCisg
ICAgdm9pZCBzZXRMZWZ0KE5vZGUqIGxlZnQpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VChsZWZ0ICE9IG1fcmlnaHQpOworICAgICAgICBtX2xlZnQgPSBsZWZ0OworICAgIH0KKyAgICBi
b29sIGFkZFRvT2Zmc2V0KGludCBvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoc3VtT3ZlcmZs
b3dzPGludD4obV9vZmZzZXQsIG9mZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIG1fb2Zmc2V0ICs9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIAorICAgIC8vIEF0dGVtcHRzIHRvIGNhbGwgZnVuY3RvcigpIHdpdGggemVybywgb25lLCBv
ciB0d28gcmVsYXRpb25zaGlwcyB0aGF0IHN1bW1hcml6ZSB0aGUKKyAgICAvLyB1bmlvbiBvZiB0
aGlzIHJlbGF0aW9uc2hpcCBhbmQgdGhlIG90aGVyIHJlbGF0aW9uc2hpcC4gVGhlIHJlbGF0aW9u
c2hpcHMgcGFzc2VkIHRvIHRoZQorICAgIC8vIGZ1bmN0b3IgYXJlIHJlbGF0ZWQgYnkgaW50ZXJz
ZWN0aW9uLiBOb3QgY2FsbGluZyB0aGUgZnVuY3RvciBpbXBsaWVzIFRPUC4gRWFjaCBjYWxsIHRv
CisgICAgLy8gdGhlIGZ1bmN0b3IgY29uc3RyYWlucyB0aGUgc3RhdGUgc3BhY2UuIEZvciBleGFt
cGxlIGlmIHRoaXMgY2FsbHMgdGhlIGZ1bmN0b3Igd2l0aCByZWwxLAorICAgIC8vIHJlbDIsIC4u
LiwgcmVsTiwgeW91IHNob3VsZCByZWFkIGl0IGFzOgorICAgIC8vCisgICAgLy8gICAgIFRPUCAm
JiByZWwxICYmIHJlbDIgJiYgLi4uICYmIHJlbE4KKyAgICAvLworICAgIC8vIFRoZSAiVE9QIiBp
cyB0aGVyZSBpbiBjYXNlIHRoYXQgdGhlIGZ1bmN0b3IgaXNuJ3QgY2FsbGVkLiBOb3RlIHRoYXQg
dGhpcyBlbnN1cmVzCisgICAgLy8gY29udmVyZ2VuY2UgYnkgcGlja2luZyBmcm9tIGEgZmluaXRl
IHNldCBvZiAiZ2VuZXJhbCIgcmVsYXRpb25zaGlwcyBpbiBjYXNlIHRoZXJlIGlzCisgICAgLy8g
ZGlzYWdyZWVtZW50LiBJZiAqdGhpcyBhbmQgb3RoZXIgYXJlIGlkZW50aWNhbCwgd2UgbGVhdmUg
dGhlbSBhbG9uZS4gQnV0IGlmIHRoZXkgZGlmZmVyLAorICAgIC8vIHdlIHBpY2sgb25lIG9mIHRo
ZXNlIGdlbmVyYWwgcmVsYXRpb25zaGlwczoKKyAgICAvLworICAgIC8vIEVxOiB0aGlzID09IG90
aGVyICsgQywgd2hlcmUgQyBpcyAtMSwgMCwgb3IgMS4KKyAgICAvLyBMdDogdGhpcyA8IG90aGVy
ICsgQywgd2hlcmUgQyBpcyAtMSwgMCwgb3IgMS4KKyAgICAvLyBHdDogdGhpcyA+IG90aGVyICsg
Qywgd2hlcmUgQyBpcyAtMSwgMCwgb3IgMS4KKyAgICAvLyBOZTogdGhpcyAhPSBvdGhlciArIEMs
IHdoZXJlIEMgaXMgLTEsIDAsIG9yIDEuCisgICAgLy8KKyAgICAvLyBUaGlzIG1heSBwcm9kdWNl
IHplcm8sIG9uZSwgb3IgdHdvIHJlbGF0aW9uc2hpcHMgdG8gcmVwcmVzZW50IHRoZSBtZXJnZS4g
VGhlIG9ubHkgdGltZQorICAgIC8vIGl0IHdpbGwgcHJvZHVjZSB0d28gcmVsYXRpb25zaGlwcyBp
cyBpZiBpdCB1c2VzIGEgY29tYmluYXRpb24gb2YgTHQgYW5kIEd0IHRvIHJlcHJlc2VudAorICAg
IC8vIGEgcmFuZ2UuIEhlbmNlIHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBFcSwgTHQsIEd0LCBh
bmQgTmUgcmVsYXRpb25zaGlwcyBhcyB3ZWxsIGFzIHRoZQorICAgIC8vIGZvbGxvd2luZyBMdC9H
dCBjb21iaW5hdGlvbnM6CisgICAgLy8KKyAgICAvLyB0aGlzID4gb3RoZXIgLSAxICYmIHRoaXMg
PCBvdGhlciArIDEKKyAgICAvLyAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAg
IHZvaWQgbWVyZ2UoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlciwgY29uc3QgRnVuY3RvciYgZnVu
Y3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghc2FtZU5vZGVzQXMob3RoZXIpKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBzdXBlciBv
YnZpb3VzIGNhc2UgZmlyc3QuCisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgeworICAgICAg
ICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIC8vIFRoaXMgZG9lcyBzb21lIGludGVyZXN0aW5nIHBlcm11dGF0aW9u
cyB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBkdXBsaWNhdGUgY29kZS4gRm9yCisgICAgICAgIC8v
IGV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIGluaXRpYWxseTogQGEgIT0gQGIsIEBh
ID4gQGIKKyAgICAgICAgLy8gICAgICAgICAgICBAYiAhPSBAYSwgQGIgPCBAYQorICAgICAgICAv
LyAgICAgICAgICAgIEBiIDwgQGEsIEBiICE9IEBhCisgICAgICAgIC8vICAgZmluYWxseTogQGIg
IT0gYSwgQGIgPCBAYQorICAgICAgICAvLworICAgICAgICAvLyBBbm90aGVyIGV4YW1wbGU6Cisg
ICAgICAgIC8vCisgICAgICAgIC8vIGluaXRpYWxseTogQGEgPCBAYiwgQGEgIT0gQGIKKyAgICAg
ICAgLy8gICBmaW5hbGx5OiBAYSAhPSBAYiwgQGEgPCBAYgorCisgICAgICAgIFJlbGF0aW9uc2hp
cCBhID0gKnRoaXM7CisgICAgICAgIFJlbGF0aW9uc2hpcCBiID0gb3RoZXI7CisgICAgICAgIGJv
b2wgbmVlZEZsaXAgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCByaWQgb2YgR3Jl
YXRlclRoYW4uCisgICAgICAgIGlmIChhLm1fa2luZCA9PSBHcmVhdGVyVGhhbiB8fCBiLm1fa2lu
ZCA9PSBHcmVhdGVyVGhhbikgeworICAgICAgICAgICAgYSA9IGEuZmxpcHBlZCgpOworICAgICAg
ICAgICAgYiA9IGIuZmxpcHBlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJbiBy
YXJlIGNhc2VzLCB3ZSBtaWdodCBub3QgYmUgYWJsZSB0byBmbGlwLiBKdXN0IGdpdmUgdXAgb24g
bGlmZSBpbiB0aG9zZQorICAgICAgICAgICAgLy8gY2FzZXMuCisgICAgICAgICAgICBpZiAoIWEg
fHwgIWIpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgCisgICAgICAgICAg
ICBuZWVkRmxpcCA9IHRydWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIHdlIHN0
aWxsIGhhdmUgR3JlYXRlclRoYW4sIHRoZW4gaXQgbWVhbnMgdGhhdCB3ZSBzdGFydGVkIHdpdGgg
QGEgPCBAYiBhbmQKKyAgICAgICAgICAgIC8vIEBhID4gQGIuIFRoYXQncyBwcmV0dHkgbXVjaCBh
bHdheXMgYSB0YXV0b2xvZ3k7IHdlIGRvbid0IGF0dGVtcHQgdG8gZG8gc21hcnQKKyAgICAgICAg
ICAgIC8vIHRoaW5ncyBmb3IgdGhhdCBjYXNlIGZvciBub3cuCisgICAgICAgICAgICBpZiAoYS5t
X2tpbmQgPT0gR3JlYXRlclRoYW4gfHwgYi5tX2tpbmQgPT0gR3JlYXRlclRoYW4pCisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1
cmUgdGhhdCBpZiB3ZSBoYXZlIGEgTGVzc1RoYW4sIHRoZW4gaXQncyBmaXJzdC4KKyAgICAgICAg
aWYgKGIubV9raW5kID09IExlc3NUaGFuKQorICAgICAgICAgICAgc3RkOjpzd2FwKGEsIGIpOwor
ICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaWYgd2UgaGF2ZSBhIE5vdEVxdWFs
LCB0aGVuIGl0J3MgZmlyc3QuCisgICAgICAgIGlmIChiLm1fa2luZCA9PSBOb3RFcXVhbCkKKyAg
ICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKKyAgICAgICAgCisgICAgICAgIGEubWVyZ2VJbXBs
KAorICAgICAgICAgICAgYiwKKyAgICAgICAgICAgIFsmXSAoUmVsYXRpb25zaGlwIHJlbGF0aW9u
c2hpcCkgeworICAgICAgICAgICAgICAgIGlmIChuZWVkRmxpcCkgeworICAgICAgICAgICAgICAg
ICAgICByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXAuZmxpcHBlZCgpOworICAgICAgICAgICAg
ICAgICAgICBpZiAoIXJlbGF0aW9uc2hpcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnVuY3RvcihyZWxhdGlvbnNo
aXApOworICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAorICAgIC8vIEF0dGVtcHRzIHRvIGNv
bnN0cnVjdCBvbmUgUmVsYXRpb25zaGlwIHRoYXQgYWRlcXVhdGVseSBzdW1tYXJpemVzIHRoZSBp
bnRlcnNlY3Rpb24gb2YKKyAgICAvLyB0aGlzIGFuZCBvdGhlci4gUmV0dXJucyBhIG51bGwgcmVs
YXRpb25zaGlwIGlmIHRoZSBmaWx0cmF0aW9uIHNob3VsZCBiZSBleHByZXNzZWQgYXMgdHdvCisg
ICAgLy8gZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMuIFJldHVybmluZyBudWxsIGlzIGFsd2F5cyBz
YWZlIGJlY2F1c2UgcmVsYXRpb25zaGlwIGxpc3RzIGluCisgICAgLy8gdGhpcyBwaGFzZSBhbHdh
eXMgaW1wbHkgaW50ZXJzZWN0aW9uLiBTbywgeW91IGNvdWxkIHNvdW5kbHkgc2tpcCBjYWxsaW5n
IHRoaXMgbWV0aG9kIGFuZAorICAgIC8vIGp1c3QgcHV0IGJvdGggcmVsYXRpb25zaGlwcyBpbnRv
IHRoZSBsaXN0LiBCdXQsIHRoYXQgY291bGQgbGVhZCB0aGUgZml4cG9pbnQgdG8gZGl2ZXJnZS4K
KyAgICAvLyBIZW5jZSB0aGlzIHdpbGwgYXR0ZW1wdCB0byBjb21iaW5lIHRoZSB0d28gcmVsYXRp
b25zaGlwcyBpbnRvIG9uZSBhcyBhIGNvbnZlcmdlbmNlIGhhY2suCisgICAgLy8gSW4gc29tZSBj
YXNlcywgaXQgd2lsbCBkbyBzb21ldGhpbmcgY29uc2VydmF0aXZlLiBJdCdzIGFsd2F5cyBzYWZl
IGZvciB0aGlzIHRvIHJldHVybgorICAgIC8vICp0aGlzLCBvciB0byByZXR1cm4gb3RoZXIuIEl0
J2xsIGRvIHRoYXQgc29tZXRpbWVzLCBtYWlubHkgdG8gYWNjZWxlcmF0ZSBjb252ZXJnZW5jZSBm
b3IKKyAgICAvLyB0aGluZ3MgdGhhdCB3ZSBkb24ndCB0aGluayBhcmUgaW1wb3J0YW50IGVub3Vn
aCB0byBzbG93IGRvd24gdGhlIGFuYWx5c2lzLgorICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXIoY29u
c3QgUmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIC8vIFdlIGFyZSBv
bmx5IGludGVyZXN0ZWQgaW4gbWVyZ2luZyByZWxhdGlvbnNoaXBzIG92ZXIgdGhlIHNhbWUgbm9k
ZXMuCisgICAgICAgIEFTU0VSVChzYW1lTm9kZXNBcyhvdGhlcikpOworICAgICAgICAKKyAgICAg
ICAgaWYgKCp0aGlzID09IG90aGVyKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAg
ICAKKyAgICAgICAgLy8gRnJvbSBoZXJlIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgdHdvIHJlbGF0
aW9uc2hpcHMgYXJlIG5vdCBpZGVudGljYWwuIFVzdWFsbHkgd2UgdXNlCisgICAgICAgIC8vIHRo
aXMgdG8gYXNzdW1lIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgb2Zmc2V0cyBhbnl0aW1lIHRoYXQg
ZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldAorICAgICAgICAvLyBpcyBpZGVudGljYWwuCisgICAg
ICAgIAorICAgICAgICAvLyBXZSB3YW50IGVxdWFsaXR5IHRvIHRha2UgcHJlY2VkZW50IG92ZXIg
ZXZlcnl0aGluZyBlbHNlLCBhbmQgd2UgZG9uJ3Qgd2FudCBtdWx0aXBsZQorICAgICAgICAvLyBp
bmRlcGVuZGVudCBjbGFpbXMgb2YgZXF1YWxpdHkuIFRoYXQgd291bGQganVzdCBiZSBhIGNvbnRy
YWRpY3Rpb24uIFdoZW4gaXQgZG9lcworICAgICAgICAvLyBoYXBwZW4sIHdlIHdpbGwgYmUgY29u
c2VydmF0aXZlIGluIHRoZSBzZW5zZSB0aGF0IHdlIHdpbGwgcGljayBvbmUuCisgICAgICAgIGlm
IChtX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIGlm
IChvdGhlci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gb3RoZXI7CisgICAg
ICAgIAorICAgICAgICAvLyBVc2VmdWwgaGVscGVyIGZvciBmbGlwcGluZy4KKyAgICAgICAgYXV0
byBmaWx0ZXJGbGlwcGVkID0gWyZdICgpIC0+IFJlbGF0aW9uc2hpcCB7CisgICAgICAgICAgICAv
LyBJZiB3ZSBjYW5ub3QgZmxpcCwgdGhlbiBqdXN0IGNvbnNlcnZhdGl2ZWx5IHJldHVybiAqdGhp
cy4KKyAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBhID0gZmxpcHBlZCgpOworICAgICAgICAgICAg
UmVsYXRpb25zaGlwIGIgPSBvdGhlci5mbGlwcGVkKCk7CisgICAgICAgICAgICBpZiAoIWEgfHwg
IWIpCisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgUmVsYXRpb25z
aGlwIHJlc3VsdCA9IGEuZmlsdGVyKGIpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgcmVzdWx0ID0g
cmVzdWx0LmZsaXBwZWQoKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAg
ICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07
CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAg
ICBpZiAob3RoZXIubV9raW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ug
Y291bGQgZG8gc29tZXRoaW5nIHNtYXJ0ZXIgaGVyZS4gV2UgY291bGQgZXZlbiBrZWVwIGJvdGgg
Tm90RXF1YWwncy4gV2UKKyAgICAgICAgICAgICAgICAvLyB3b3VsZCBuZWVkIHRvIG1ha2Ugc3Vy
ZSB0aGF0IHdlIGNvcnJlY3RseSBjb2xsYXBzZWQgdGhlbSB3aGVuIG1lcmdpbmcuIEJ1dAorICAg
ICAgICAgICAgICAgIC8vIGZvciBub3csIHdlIGp1c3QgcGljayBvbmUgb2YgdGhlbSBhbmQgaG9w
ZSBmb3IgdGhlIGJlc3QuCisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEdyZWF0
ZXJUaGFuKSB7CisgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2Yg
Tm90RXF1YWwuZmlsdGVyKExlc3NUaGFuKS4gCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRl
ckZsaXBwZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQVNT
RVJUKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbik7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHR3
byBjbGFpbXM6CisgICAgICAgICAgICAvLyAgICAgQGEgIT0gQGIgKyBDCisgICAgICAgICAgICAv
LyAgICAgQGEgIDwgQGIgKyBECisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgQyA+
PSBELCB0aGVuIHRoZSBOb3RFcXVhbCBpcyByZWR1bmRhbnQuCisgICAgICAgICAgICAvLyBJZiBD
IDwgRCAtIDEsIHRoZW4gd2UgY291bGQga2VlcCBib3RoLCBidXQgZm9yIG5vdyB3ZSBqdXN0IGtl
ZXAgdGhlIExlc3NUaGFuLgorICAgICAgICAgICAgLy8gSWYgQyA9PSBEIC0gMSwgdGhlbiB0aGUg
TGVzc1RoYW4gY2FuIGJlIHR1cm5lZCBpbnRvOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAg
IC8vICAgICBAYSA8IEBiICsgQworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdGUg
dGhhdCBDID09IHRoaXMubV9vZmZzZXQsIEQgPT0gb3RoZXIubV9vZmZzZXQuCisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmIChtX29mZnNldCA9PSBvdGhlci5tX29mZnNldCAtIDEpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFu
LCBtX29mZnNldCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAg
ICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBOb3RFcXVhbCkK
KyAgICAgICAgICAgIHJldHVybiBvdGhlci5maWx0ZXIoKnRoaXMpOworICAgICAgICAKKyAgICAg
ICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2lu
ZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoCisg
ICAgICAgICAgICAgICAgICAgIG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWluKG1f
b2Zmc2V0LCBvdGhlci5tX29mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICBBU1NFUlQob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAg
ICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihtX29mZnNldCwgLTEpKQorICAgICAgICAgICAgICAg
IHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50
PihvdGhlci5tX29mZnNldCwgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hp
cCgpOworICAgICAgICAgICAgaWYgKG1fb2Zmc2V0IC0gMSA9PSBvdGhlci5tX29mZnNldCArIDEp
CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVx
dWFsLCBtX29mZnNldCAtIDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gUmVs
YXRpb25zaGlwKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFTU0VSVChtX2tpbmQg
PT0gR3JlYXRlclRoYW4pOworICAgICAgICByZXR1cm4gZmlsdGVyRmxpcHBlZCgpOworICAgIH0K
KyAgICAKKyAgICBpbnQgbWluVmFsdWVPZkxlZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYg
KG1fbGVmdC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5h
c0ludDMyKCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuIHx8IG1f
a2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRz
PGludD46Om1pbigpOworICAgICAgICAKKyAgICAgICAgaW50IG1pblJpZ2h0VmFsdWUgPSBzdGQ6
Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICBpZiAobV9yaWdodC0+aXNJbnQz
MkNvbnN0YW50KCkpCisgICAgICAgICAgICBtaW5SaWdodFZhbHVlID0gbV9yaWdodC0+YXNJbnQz
MigpOworICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBHcmVhdGVyVGhhbikKKyAgICAg
ICAgICAgIHJldHVybiBjbGFtcGVkU3VtKG1pblJpZ2h0VmFsdWUsIG1fb2Zmc2V0LCAxKTsKKyAg
ICAgICAgQVNTRVJUKG1fa2luZCA9PSBFcXVhbCk7CisgICAgICAgIHJldHVybiBjbGFtcGVkU3Vt
KG1pblJpZ2h0VmFsdWUsIG1fb2Zmc2V0KTsKKyAgICB9CisgICAgCisgICAgaW50IG1heFZhbHVl
T2ZMZWZ0KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQtPmlzSW50MzJDb25zdGFu
dCgpKQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdC0+YXNJbnQzMigpOworICAgICAgICAKKyAg
ICAgICAgaWYgKG1fa2luZCA9PSBHcmVhdGVyVGhhbiB8fCBtX2tpbmQgPT0gTm90RXF1YWwpCisg
ICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAg
ICAgCisgICAgICAgIGludCBtYXhSaWdodFZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+
OjptYXgoKTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAg
ICAgICAgbWF4UmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgCisgICAg
ICAgIGlmIChtX2tpbmQgPT0gTGVzc1RoYW4pCisgICAgICAgICAgICByZXR1cm4gY2xhbXBlZFN1
bShtYXhSaWdodFZhbHVlLCBtX29mZnNldCwgLTEpOworICAgICAgICBBU1NFUlQobV9raW5kID09
IEVxdWFsKTsKKyAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZz
ZXQpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
KyAgICB7CisgICAgICAgIC8vIFRoaXMgcHJpbnRzIG91dCB0aGUgcmVsYXRpb25zaGlwIHdpdGhv
dXQgYW55IHdoaXRlc3BhY2UsIGxpa2UgQHg8QHkrNDIuIFRoaXMKKyAgICAgICAgLy8gb3B0aW1p
emVzIGZvciB0aGUgY2xhcml0eSBvZiBhIGxpc3Qgb2YgcmVsYXRpb25zaGlwcy4gSXQncyBlYXNp
ZXIgdG8gcmVhZCBzb21ldGhpbmcKKyAgICAgICAgLy8gbGlrZSBbQDE8QDIrMywgQDQ9PUA1LTZd
IHRoYW4gaXQgd291bGQgYmUgaWYgdGhlcmUgd2FzIHdoaXRlc3BhY2UgaW5zaWRlIHRoZQorICAg
ICAgICAvLyByZWxhdGlvbnNoaXBzLgorICAgICAgICAKKyAgICAgICAgb3V0LnByaW50KG1fbGVm
dCk7CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46Cisg
ICAgICAgICAgICBvdXQucHJpbnQoIjwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEVxdWFsOgorICAgICAgICAgICAgb3V0LnByaW50KCI9PSIpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgTm90RXF1YWw6CisgICAgICAgICAgICBvdXQucHJpbnQoIiE9Iik7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHcmVhdGVyVGhhbjoKKyAgICAgICAg
ICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgb3V0LnByaW50KG1fcmlnaHQpOworICAgICAgICBpZiAobV9vZmZzZXQgPiAwKQorICAgICAg
ICAgICAgb3V0LnByaW50KCIrIiwgbV9vZmZzZXQpOworICAgICAgICBlbHNlIGlmIChtX29mZnNl
dCA8IDApCisgICAgICAgICAgICBvdXQucHJpbnQoIi0iLCAtc3RhdGljX2Nhc3Q8aW50NjRfdD4o
bV9vZmZzZXQpKTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0b3I+CisgICAgdm9pZCBtZXJnZUltcGwoY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlciwg
Y29uc3QgRnVuY3RvciYgZnVuY3RvcikgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChzYW1l
Tm9kZXNBcyhvdGhlcikpOworICAgICAgICBBU1NFUlQobV9raW5kICE9IEdyZWF0ZXJUaGFuKTsK
KyAgICAgICAgQVNTRVJUKG90aGVyLm1fa2luZCAhPSBHcmVhdGVyVGhhbik7CisgICAgICAgIAor
ICAgICAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBndWFyYW50ZWUgdGhh
dDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBXZSBhdm9pZCBoYXZpbmcgbW9yZSB0aGFuIG9u
ZSBSZWxhdGlvbnNoaXAgb3ZlciB0aGUgc2FtZSB0d28gbm9kZXMuIFRoZXJlZm9yZSwgaWYKKyAg
ICAgICAgLy8gICB0aGUgbWVyZ2UgY291bGQgYmUgZXhwcmVzc2VkIGFzIHR3byBSZWxhdGlvbnNo
aXBzLCB3ZSBwcmVmZXIgdG8gaW5zdGVhZCBwaWNrIHRoZQorICAgICAgICAvLyAgIGxlc3MgcHJl
Y2lzZSBzaW5nbGUgUmVsYXRpb25zaGlwIGZvcm0gZXZlbiBpZiB0aGF0IG1lYW5zIFRPUC4gT25l
IGV4Y2VwdGlvbiB0bworICAgICAgICAvLyAgIHRoaXMgaXMgdGhhdCB3ZSBAYSA9PSBAYiArIEMg
YW5kIEBhID09IEBiICsgRCBpbnRvIEBhID4gQGIgKyBDIC0gMSBhbmQKKyAgICAgICAgLy8gICBA
YSA8IEBiICsgRCArIDEuIAorICAgICAgICAvLworICAgICAgICAvLyAtIElmIHRoZSBkaWZmZXJl
bmNlIGJldHdlZW4gdHdvIFJlbGF0aW9uc2hpcHMgaXMganVzdCB0aGUgbV9vZmZzZXQsIHRoZW4g
d2UgY3JlYXRlIGEKKyAgICAgICAgLy8gICBSZWxhdGlvbnNoaXAgdGhhdCBoYXMgYW4gb2Zmc2V0
IG9mIC0xLCAwLCBvciAxLiBUaGlzIGlzIGFuIGVzc2VudGlhbCBjb252ZXJnZW5jZQorICAgICAg
ICAvLyAgIGhhY2suIFdlIG5lZWQgLTEgYW5kIDEgdG8gc3VwcG9ydCA8PSBhbmQgPj0uIFRoaXMg
b3ZlcnJpZGVzIHRoZSBwcmV2aW91cworICAgICAgICAvLyAgIGV4Y2VwdGlvbi4gRm9yIGV4YW1w
bGUsIHdlIHdvdWxkbid0IGFkZCBhIEBhIDwgQGIgKyBEICsgMSByZWxhdGlvbnNoaXAgaWYgRCAr
IDEKKyAgICAgICAgLy8gICB3YXMgbm90IGVxdWFsIHRvIG9uZSBvZiAtMSwgMCwgMS4KKyAgICAg
ICAgCisgICAgICAgIC8vIElmIHRoZSByZWxhdGlvbnNoaXBzIGFyZSBpZGVudGljYWwgdGhlbiB3
ZSBoYXZlIG5vdGhpbmcgbGVmdCB0byBkby4KKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7
CisgICAgICAgICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRnJvbSBoZXJlIHdlIGNhbiBhc3N1bWUgdGhhdCB0
aGUgdHdvIHJlbGF0aW9uc2hpcHMgYXJlIG5vdCBpZGVudGljYWwuIFVzdWFsbHkgd2UgdXNlCisg
ICAgICAgIC8vIHRoaXMgdG8gYXNzdW1lIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgb2Zmc2V0cyBh
bnl0aW1lIHRoYXQgZXZlcnl0aGluZyBidXQgdGhlIG9mZnNldAorICAgICAgICAvLyBpcyBpZGVu
dGljYWwuCisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IE5vdEVxdWFsKSB7CisgICAg
ICAgICAgICBpZiAob3RoZXIubV9raW5kID09IE5vdEVxdWFsKQorICAgICAgICAgICAgICAgIHJl
dHVybjsgLy8gRGlmZmVyZW50IG9mZnNldHMsIHNvIHRhdXRvbG9neS4KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBFcXVhbCkgeworICAgICAgICAgICAgICAg
IGlmIChtX29mZnNldCAhPSBvdGhlci5tX29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAv
LyBTYXlpbmcgdGhhdCB5b3UgbWlnaHQgYmUgQiB3aGVuIHlvdSd2ZSBhbHJlYWR5IHNhaWQgdGhh
dCB5b3UncmUgYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IEEsIHdoZXJlIEEg
YW5kIEIgYXJlIGRpZmZlcmVudCwgaXMgYSB0YXV0b2xvZ3kuIFlvdSBjb3VsZCBqdXN0IHNheQor
ICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHlvdSdyZSBhbnl0aGluZyBidXQgQS4gQWRkaW5n
ICIoYSA9PSBiICsgMSkiIHRvICIoYSAhPSBiICsgNSkiIGhhcworICAgICAgICAgICAgICAgICAg
ICAvLyBubyB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgZnVuY3RvcigqdGhpcyk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2FtZSBvZmZzZXRz
OiB3ZSdyZSBzYXlpbmcgdGhhdCB5b3UncmUgZWl0aGVyIEEgb3IgeW91J3JlIG5vdAorICAgICAg
ICAgICAgICAgIC8vIGVxdWFsIHRvIEEuCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBSRUxF
QVNFX0FTU0VSVChvdGhlci5tX2tpbmQgPT0gTGVzc1RoYW4pOworICAgICAgICAgICAgLy8gV2Ug
aGF2ZSB0aGVzZSBjbGFpbXMsIGFuZCB3ZSdyZSBtZXJnaW5nIHRoZW06CisgICAgICAgICAgICAv
LyAgICAgQGEgIT0gQGIgKyBDCisgICAgICAgICAgICAvLyAgICAgQGEgPCBAYiArIEQKKyAgICAg
ICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIEMgPT0gRCwgdGhlbiB0aGUgbWVy
Z2UgaXMgY2xlYXJseSBqdXN0IHRoZSBOb3RFcXVhbC4KKyAgICAgICAgICAgIC8vIElmIHdlIGhh
dmUgQyA8IEQsIHRoZW4gdGhlIG1lcmdlIGlzIGEgdGF1dG9sb2d5LgorICAgICAgICAgICAgLy8g
SWYgd2UgaGF2ZSBDID4gRCwgdGhlbiB3ZSBjb3VsZCBrZWVwIGJvdGggY2xhaW1zLCBidXQgd2Ug
YXJlIGNoZWFwLCBzbyB3ZQorICAgICAgICAgICAgLy8gZG9uJ3QuIFdlIGp1c3QgdXNlIHRoZSBO
b3RFcXVhbC4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG1fb2Zmc2V0IDwgb3RoZXIu
bV9vZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgCisgICAgICAg
ICAgICBmdW5jdG9yKCp0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgaWYg
KG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBv
dXQgd2hhdCBvZmZzZXQgdG8gc2VsZWN0IHRvIG1lcmdlIHRoZW0uIFRoZSBhcHByb3ByaWF0ZSBv
ZmZzZXRzIGFyZQorICAgICAgICAgICAgICAgIC8vIC0xLCAwLCBvciAxLgorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIEZpcnN0IGZpZ3VyZSBvdXQgd2hhdCBvZmZzZXQgd2Un
ZCBsaWtlIHRvIHVzZS4KKyAgICAgICAgICAgICAgICBpbnQgYmVzdE9mZnNldCA9IHN0ZDo6bWF4
KG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgLy8gV2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBAYSA8IEBiICsgMi4gV2UgY2FuJ3QgcmVw
cmVzZW50IHRoaXMgdW5kZXIgdGhlCisgICAgICAgICAgICAgICAgLy8gLTEsMCwxIHJ1bGUuCisg
ICAgICAgICAgICAgICAgaWYgKGJlc3RPZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAg
ZnVuY3RvcihSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBMZXNzVGhhbiwgc3RkOjptYXgo
YmVzdE9mZnNldCwgLTEpKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBUaGUgb25s
eSB0aGluZyBsZWZ0IGlzIEVxdWFsLiBXZSB3b3VsZCBoYXZlIGVsaW1pbmF0ZWQgdGhlIEdyZWF0
ZXJUaGFuJ3MsIGFuZAorICAgICAgICAgICAgLy8gaWYgd2UgbWVyZ2UgTGVzc1RoYW4gYW5kIE5v
dEVxdWFsLCB0aGUgTm90RXF1YWwgYWx3YXlzIGNvbWVzIGZpcnN0LgorICAgICAgICAgICAgUkVM
RUFTRV9BU1NFUlQob3RoZXIubV9raW5kID09IEVxdWFsKTsKKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgLy8gVGhpcyBpcyB0aGUgcmVhbGx5IGludGVyZXN0aW5nIGNhc2UuIFdlIGhhdmU6Cisg
ICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBDCisgICAgICAgICAg
ICAvLworICAgICAgICAgICAgLy8gYW5kOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8v
ICAgICBAYSA9PSBAYiArIEQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGVyZWZv
cmUgd2UnZCBsaWtlIHRvIHJldHVybjoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAg
ICAgQGEgPCBAYiArIG1heChDLCBEICsgMSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50
IGJlc3RPZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQgKyAxKTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBAYSA8IEBi
ICsgMi4gV2UgY2FuJ3QgZG8gaXQuCisgICAgICAgICAgICBpZiAoYmVzdE9mZnNldCA8PSAxKQor
ICAgICAgICAgICAgICAgIGZ1bmN0b3IoUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgTGVz
c1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSkpOworCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBvbmx5IHRoaW5nIGxlZnQgaXMg
RXF1YWwsIHNpbmNlIHdlIHdvdWxkIGhhdmUgZ290dGVuIHJpZCBvZiB0aGUgR3JlYXRlclRoYW4n
cy4KKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9raW5kID09IEVxdWFsKTsKKyAgICAgICAgCisg
ICAgICAgIC8vIFdlIHdvdWxkIG5ldmVyIHNlZSBOb3RFcXVhbCwgYmVjYXVzZSB0aG9zZSBhbHdh
eXMgY29tZSBmaXJzdC4gV2Ugd291bGQgbmV2ZXIKKyAgICAgICAgLy8gc2VlIEdyZWF0ZXJUaGFu
LCBiZWNhdXNlIHdlIHdvdWxkIGhhdmUgZWxpbWluYXRlZCB0aG9zZS4gV2Ugd291bGQgbmV2ZXIg
c2VlCisgICAgICAgIC8vIExlc3NUaGFuLCBiZWNhdXNlIHRob3NlIGFsd2F5cyBjb21lIGZpcnN0
LgorICAgICAgICAKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQob3RoZXIubV9raW5kID09IEVxdWFs
KTsKKyAgICAgICAgLy8gV2UgaGF2ZSBAYSA9PSBAYiArIEMgYW5kIEBhID09IEBiICsgRCwgd2hl
cmUgQyAhPSBELiBUdXJuIHRoaXMgaW50byBzb21lCisgICAgICAgIC8vIGluZXF1YWxpdHkgdGhh
dCBpbnZvbHZlcyBhIGNvbnN0YW50IHRoYXQgaXMgLTEsMCwxLgorCisgICAgICAgIGludCBsZXNz
VGhhbkVxT2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KTsKKyAgICAg
ICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihsZXNzVGhhbkVxT2Zmc2V0LCAxKSkgeworICAgICAg
ICAgICAgUmVsYXRpb25zaGlwIGxlc3NUaGFuKAorICAgICAgICAgICAgICAgIG1fbGVmdCwgb3Ro
ZXIubV9yaWdodCwgTGVzc1RoYW4sIGxlc3NUaGFuRXFPZmZzZXQgKyAxKTsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgaWYgKGxlc3NUaGFuLm9mZnNldCgpID49IC0xICYmIGxlc3NUaGFuLm9m
ZnNldCgpIDw9IDEpCisgICAgICAgICAgICAgICAgZnVuY3RvcihsZXNzVGhhbik7CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIGludCBncmVhdGVyVGhhbkVxT2Zmc2V0ID0gc3RkOjptaW4o
bV9vZmZzZXQsIG90aGVyLm1fb2Zmc2V0KTsKKyAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50
PihncmVhdGVyVGhhbkVxT2Zmc2V0LCAtMSkpIHsKKyAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBn
cmVhdGVyVGhhbigKKyAgICAgICAgICAgICAgICBtX2xlZnQsIG90aGVyLm1fcmlnaHQsIEdyZWF0
ZXJUaGFuLCBncmVhdGVyVGhhbkVxT2Zmc2V0IC0gMSk7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGlmIChncmVhdGVyVGhhbi5vZmZzZXQoKSA+PSAtMSAmJiBncmVhdGVyVGhhbi5vZmZzZXQo
KSA8PSAxKQorICAgICAgICAgICAgICAgIGZ1bmN0b3IoZ3JlYXRlclRoYW4pOworICAgICAgICB9
CisgICAgfQorICAgIAorICAgIE5vZGUqIG1fbGVmdDsKKyAgICBOb2RlKiBtX3JpZ2h0OworICAg
IEtpbmQgbV9raW5kOworICAgIGludCBtX29mZnNldDsgLy8gVGhpcyBvZmZzZXQgY2FuIGJlIGFy
Yml0cmFyaWx5IGxhcmdlLgorfTsKKwordHlwZWRlZiBIYXNoTWFwPE5vZGUqLCBWZWN0b3I8UmVs
YXRpb25zaGlwPj4gUmVsYXRpb25zaGlwTWFwOworCitjbGFzcyBJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZSA6IHB1YmxpYyBQaGFzZSB7CitwdWJsaWM6CisgICAgSW50ZWdlclJhbmdlT3B0
aW1pemF0aW9uUGhhc2UoR3JhcGgmIGdyYXBoKQorICAgICAgICA6IFBoYXNlKGdyYXBoLCAiaW50
ZWdlciByYW5nZSBvcHRpbWl6YXRpb24iKQorICAgICAgICAsIG1femVybyhudWxscHRyKQorICAg
ICAgICAsIG1fcmVsYXRpb25zaGlwc0F0SGVhZChncmFwaCkKKyAgICAgICAgLCBtX2luc2VydGlv
blNldChncmFwaCkKKyAgICB7CisgICAgfQorICAgIAorICAgIGJvb2wgcnVuKCkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChtX2dyYXBoLm1fZm9ybSA9PSBTU0EpOworICAgICAgICAKKyAgICAgICAg
Ly8gQmVmb3JlIHdlIGRvIGFueXRoaW5nLCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgemVybyBj
b25zdGFudCBhdCB0aGUgdG9wLgorICAgICAgICBmb3IgKE5vZGUqIG5vZGUgOiAqbV9ncmFwaC5i
bG9jaygwKSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmlzSW50MzJDb25zdGFudCgpICYmICFu
b2RlLT5hc0ludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBtX3plcm8gPSBub2RlOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgh
bV96ZXJvKSB7CisgICAgICAgICAgICBtX3plcm8gPSBtX2luc2VydGlvblNldC5pbnNlcnRDb25z
dGFudCgwLCBOb2RlT3JpZ2luKCksIGpzTnVtYmVyKDApKTsKKyAgICAgICAgICAgIG1faW5zZXJ0
aW9uU2V0LmV4ZWN1dGUobV9ncmFwaC5ibG9jaygwKSk7CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBkYXRhTG9nKCJHcmFwaCBiZWZvcmUg
aW50ZWdlciByYW5nZSBvcHRpbWl6YXRpb246XG4iKTsKKyAgICAgICAgICAgIG1fZ3JhcGguZHVt
cCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUaGlzIHBlcmZvcm1zIGEgZml4
cG9pbnQgb3ZlciB0aGUgYmxvY2tzIGluIHJldmVyc2UgcG9zdC1vcmRlci4gTG9naWNhbGx5LCB3
ZQorICAgICAgICAvLyBtYWludGFpbiBhIGxpc3Qgb2YgcmVsYXRpb25zaGlwcyBhdCBlYWNoIHBv
aW50IGluIHRoZSBwcm9ncmFtLiBUaGUgbGlzdCBzaG91bGQgYmUKKyAgICAgICAgLy8gcmVhZCBh
cyBhbiBpbnRlcnNlY3Rpb24uIEZvciBleGFtcGxlIGlmIHdlIGhhdmUge3JlbDEsIHJlbDIsIC4u
LiwgcmVsTn0sIHlvdSBzaG91bGQKKyAgICAgICAgLy8gcmVhZCB0aGlzIGFzOgorICAgICAgICAv
LworICAgICAgICAvLyAgICAgVE9QICYmIHJlbDEgJiYgcmVsMiAmJiAuLi4gJiYgcmVsTgorICAg
ICAgICAvLworICAgICAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBleHByZXNzIHRoaW5ncyBsaWtl
OgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQGEgPiBAYiAtIDQyICYmIEBhIDwgQGIgKyAy
NQorICAgICAgICAvLworICAgICAgICAvLyBCdXQgbm90IHRoaW5ncyBsaWtlOgorICAgICAgICAv
LworICAgICAgICAvLyAgICAgQGEgPCBAYiAtIDQyIHx8IEBhID4gQGIgKyAyNQorICAgICAgICAv
LworICAgICAgICAvLyBXZSBtZXJnZSB0d28gbGlzdHMgYnkgbWVyZ2luZyBlYWNoIHJlbGF0aW9u
c2hpcCBpbiBvbmUgbGlzdCB3aXRoIGVhY2ggcmVsYXRpb25zaGlwCisgICAgICAgIC8vIGluIHRo
ZSBvdGhlciBsaXN0LiBNZXJnaW5nIHR3byByZWxhdGlvbnNoaXBzIHdpbGwgeWllbGQgYSByZWxh
dGlvbnNoaXAgbGlzdDsgYXMgd2l0aAorICAgICAgICAvLyBhbGwgc3VjaCBsaXN0cyBpdCBpcyBh
biBpbnRlcnNjdGlvbi4gTWVyZ2luZyByZWxhdGlvbnNoaXBzIG92ZXIgZGlmZmVyZW50IHZhcmlh
YmxlcworICAgICAgICAvLyBhbHdheXMgeWllbGRzIHRoZSBlbXB0eSBsaXN0IChpLmUuIFRPUCku
IFRoaXMgbWVyZ2Ugc3R5bGUgaXMgc291bmQgYmVjYXVzZSBpZiB3ZQorICAgICAgICAvLyBoYXZl
OgorICAgICAgICAvLworICAgICAgICAvLyAgICAgKEEgJiYgQiAmJiBDKSB8fCAoRCAmJiBFICYm
IEYpCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZW4gYSB2YWxpZCBtZXJnZSBpcyBqdXN0IG9u
ZSB0aGF0IHdpbGwgcmV0dXJuIHRydWUgaWYgQSwgQiwgQyBhcmUgYWxsIHRydWUsIG9yCisgICAg
ICAgIC8vIHRoYXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBELCBFLCBGIGFyZSBhbGwgdHJ1ZS4gT3Vy
IG1lcmdlIHN0eWxlIGVzc2VudGlhbGx5IGRvZXM6CisgICAgICAgIC8vCisgICAgICAgIC8vICAg
ICAoQSB8fCBEKSAmJiAoQSB8fCBFKSAmJiAoQSB8fCBGKSAmJiAoQiB8fCBEKSAmJiAoQiB8fCBF
KSAmJiAoQiB8fCBGKSAmJgorICAgICAgICAvLyAgICAgICAgIChDIHx8IEQpICYmIChDIHx8IEUp
ICYmIChDIHx8IEYpCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIEEgJiYgQiAmJiBDIGlzIHRy
dWUsIHRoZW4gdGhpcyByZXR1cm5zIHRydWUuIElmIEQgJiYgRSAmJiBGIGlzIHRydWUsIHRoaXMg
YWxzbworICAgICAgICAvLyByZXR1cm5zIHRydWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIFdo
aWxlIHRoaXMgYXBwZWFycyBhdCBmaXJzdCBsaWtlIGEga2luZCBvZiBleHByZXNzaW9uIGV4cGxv
c2lvbiwgaW4gcHJhY3RpY2UgaXQKKyAgICAgICAgLy8gaXNuJ3QuIFRoZSBjb2RlIHRoYXQgaGFu
ZGxlcyB0aGlzIGtub3dzIHRoYXQgdGhlIG1lcmdlIG9mIHR3byByZWxhdGlvbnNoaXBzIG92ZXIK
KyAgICAgICAgLy8gZGlmZmVyZW50IHZhcmlhYmxlcyBpcyBUT1AgKGkuZS4gdGhlIGVtcHR5IGxp
c3QpLiBGb3IgZXhhbXBsZSBpZiBBIGFib3ZlIGlzIEBhIDwgQGIKKyAgICAgICAgLy8gYW5kIEIg
YWJvdmUgaXMgQGMgPiBAZCwgd2hlcmUgQGEsIEBiLCBAYywgYW5kIEBkIGFyZSBkaWZmZXJlbnQg
bm9kZXMsIHRoZSBtZXJnZSB3aWxsCisgICAgICAgIC8vIHlpZWxkIG5vdGhpbmcuIEluIGZhY3Qs
IHRoZSBtZXJnZSBhbGdvcml0aG0gd2lsbCBza2lwIHN1Y2ggbWVyZ2VzIGVudGlyZWx5IGJlY2F1
c2UKKyAgICAgICAgLy8gdGhlIHJlbGF0aW9uc2hpcCBsaXN0cyBhcmUgYWN0dWFsbHkga2V5ZWQg
Ynkgbm9kZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgYWx3YXlzIHNh
ZmUgdG8gZHJvcCBhbnkgb2YgcmVsYXRpb25zaGlwIGZyb20gdGhlIHJlbGF0aW9uc2hpcCBsaXN0
LgorICAgICAgICAvLyBUaGlzIG1lcmVseSBpbmNyZWFzZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhl
ICJleHByZXNzaW9uIiB5aWVsZGluZyB0cnVlLCBpLmUuIGJlaW5nCisgICAgICAgIC8vIGNsb3Nl
ciB0byBUT1AuIE9wdGltaXphdGlvbnMgYXJlIG9ubHkgcGVyZm9ybWVkIGlmIHdlIGNhbiBlc3Rh
Ymxpc2ggdGhhdCB0aGUKKyAgICAgICAgLy8gZXhwcmVzc2lvbiBpbXBsaWVkIGJ5IHRoZSByZWxh
dGlvbnNoaXAgbGlzdCBpcyBmYWxzZSBmb3IgYWxsIG9mIHRob3NlIGNhc2VzIHdoZXJlCisgICAg
ICAgIC8vIHNvbWUgY2hlY2sgd291bGQgaGF2ZSBmYWlsZWQuCisgICAgICAgIC8vCisgICAgICAg
IC8vIFRoZXJlIGlzIG5vIG5vdGlvbiBvZiBCT1RUT00gYmVjYXVzZSB3ZSB0cmVhdCBibG9ja3Mg
dGhhdCBoYXZlbid0IGhhZCB0aGVpcgorICAgICAgICAvLyBzdGF0ZS1hdC1oZWFkIHNldCBhcyBh
IHNwZWNpYWwgY2FzZTogd2UganVzdCB0cmFuc2ZlciBhbGwgbGl2ZSByZWxhdGlvbnNoaXBzIHRv
IHN1Y2gKKyAgICAgICAgLy8gYSBibG9jay4gQWZ0ZXIgdGhlIGhlYWQgb2YgYSBibG9jayBpcyBz
ZXQsIHdlIHBlcmZvcm0gdGhlIG1lcmdpbmcgYXMgYWJvdmUuIEluIGFsbAorICAgICAgICAvLyBv
dGhlciBwbGFjZXMgd2hlcmUgd2Ugd291bGQgb3JkaW5hcmlseSBuZWVkIEJPVFRPTSwgd2UgYXBw
cm94aW1hdGUgaXQgYnkgaGF2aW5nIHNvbWUKKyAgICAgICAgLy8gbm9uLUJPVFRPTSByZWxhdGlv
bnNoaXAuCisgICAgICAgIAorICAgICAgICBCbG9ja0xpc3QgcG9zdE9yZGVyID0gbV9ncmFwaC5i
bG9ja3NJblBvc3RPcmRlcigpOworCisgICAgICAgIC8vIFRoaXMgbG9vcCBhbmFseXplcyB0aGUg
SVIgdG8gZ2l2ZSB1cyBtX3JlbGF0aW9uc2hpcHNBdEhlYWQgZm9yIGVhY2ggYmxvY2suIFRoaXMK
KyAgICAgICAgLy8gbWF5IHJlZXhlY3V0ZSBibG9ja3MgbWFueSB0aW1lcywgYnV0IGl0IGlzIGd1
YXJhbnRlZWQgdG8gY29udmVyZ2UuIFRoZSBzdGF0ZSBvZgorICAgICAgICAvLyB0aGUgcmVsYXRp
b25zaGlwc0F0SGVhZCBvdmVyIGFueSBwYWlyIG9mIG5vZGVzIGNvbnZlcmdlIG1vbm90b25pY2Fs
bHkgdG93YXJkcyB0aGUKKyAgICAgICAgLy8gVE9QIHJlbGF0aW9uc2hpcCAoaS5lLiBubyByZWxh
dGlvbnNoaXBzIGluIHRoZSByZWxhdGlvbnNoaXAgbGlzdCkuIFRoZSBtZXJnZSBydWxlCisgICAg
ICAgIC8vIHdoZW4gYmV0d2VlbiB0aGUgY3VycmVudCByZWxhdGlvbnNoaXBzQXRIZWFkIGFuZCB0
aGUgcmVsYXRpb25zaGlwcyBiZWluZyBwcm9wYWdhdGVkCisgICAgICAgIC8vIGZyb20gYSBwcmVk
ZWNlc3NvciBlbnN1cmVzIG1vbm90b25pY2l0eSBieSBjb252ZXJ0aW5nIGRpc2FncmVlbWVudHMg
aW50byBvbmUgb2YgYQorICAgICAgICAvLyBzbWFsbCBzZXQgb2YgbWVyZ2VkIHJlbGF0aW9uc2hp
cHMuIFRoZXJlIGFyZSAKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgd2hp
bGUgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAg
IGZvciAodW5zaWduZWQgcG9zdE9yZGVySW5kZXggPSBwb3N0T3JkZXIuc2l6ZSgpOyBwb3N0T3Jk
ZXJJbmRleC0tOykgeworICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gcG9zdE9y
ZGVyW3Bvc3RPcmRlckluZGV4XTsKKyAgICAgICAgICAgICAgICBERkdfQVNTRVJUKAorICAgICAg
ICAgICAgICAgICAgICBtX2dyYXBoLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBibG9j
ayA9PSBtX2dyYXBoLmJsb2NrKDApIHx8IG1fc2VlbkJsb2Nrcy5jb250YWlucyhibG9jaykpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbV9yZWxhdGlvbnNoaXBzID0gbV9yZWxhdGlv
bnNoaXBzQXRIZWFkW2Jsb2NrXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgYmxvY2stPnNpemUoKTsgKytub2Rl
SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJsb2NrLT5hdChub2Rl
SW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGRhdGFMb2coIkFuYWx5c2lzOiBhdCAiLCBub2RlLCAiOiAiLCBsaXN0RHVtcChz
b3J0ZWRSZWxhdGlvbnNoaXBzKCkpLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0
ZU5vZGUobm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIC8vIE5vdyBjb21lcyBwZXJoYXBzIHRoZSBtb3N0IGltcG9ydGFudCBwaWVjZSBv
ZiBjbGV2ZXJuZXNzOiBpZiB3ZSBCcmFuY2gsIGFuZAorICAgICAgICAgICAgICAgIC8vIHRoZSBw
cmVkaWNhdGUgaW52b2x2ZXMgc29tZSByZWxhdGlvbiBvdmVyIGludGVnZXJzLCB3ZSBwcm9wYWdh
dGUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gdGhlIHRha2Vu
IGFuZCBub3RUYWtlbiBwYXRocy4gVGhpcyBoYW5kbGVzOgorICAgICAgICAgICAgICAgIC8vIC0g
QnJhbmNoIG9uIGludDMyLgorICAgICAgICAgICAgICAgIC8vIC0gQnJhbmNoIG9uIExvZ2ljYWxO
b3Qgb24gaW50MzIuCisgICAgICAgICAgICAgICAgLy8gLSBCcmFuY2ggb24gY29tcGFyZSBvbiBp
bnQzMidzLgorICAgICAgICAgICAgICAgIC8vIC0gQnJhbmNoIG9uIExvZ2ljYWxOb3Qgb2YgY29t
cGFyZSBvbiBpbnQzMidzLgorICAgICAgICAgICAgICAgIE5vZGUqIHRlcm1pbmFsID0gYmxvY2st
PnRlcm1pbmFsKCk7CisgICAgICAgICAgICAgICAgYm9vbCBhbHJlYWR5TWVyZ2VkID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5vcCgpID09IEJyYW5jaCkgeworICAgICAg
ICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwRm9yVHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgQnJhbmNoRGF0YSogYnJhbmNoRGF0YSA9IHRlcm1pbmFsLT5icmFuY2hEYXRh
KCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBib29sIGludmVy
dCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWwtPmNoaWxkMSgpLT5v
cCgpID09IExvZ2ljYWxOb3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsID0g
dGVybWluYWwtPmNoaWxkMSgpLm5vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmVy
dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbC0+Y2hpbGQxKCkudXNlS2luZCgpID09IElu
dDMyVXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGb3JUcnVlID0g
UmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRl
cm1pbmFsLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlwOjpOb3RFcXVhbCwg
MCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBOb2RlKiBjb21wYXJlID0gdGVybWluYWwtPmNoaWxkMSgpLm5vZGUoKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHN3aXRjaCAoY29tcGFyZS0+b3AoKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBh
cmVTdHJpY3RFcToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUxlc3M6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6CisgICAgICAgICAgICAg
ICAgICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlR3JlYXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCFjb21wYXJlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
bGF0aW9uc2hpcEZvclRydWUgPSBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5ub2RlKCksIGNvbXBh
cmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzOgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGb3JUcnVlID0gUmVs
YXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okxlc3NUaGFu
LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGb3JUcnVlID0gUmVsYXRpb25zaGlwOjpzYWZlQ3Jl
YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQx
KCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLCAxKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVs
YXRpb25zaGlwRm9yVHJ1ZSA9IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFy
ZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyZUdy
ZWF0ZXJFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwRm9y
VHJ1ZSA9IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCku
bm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlw
OjpHcmVhdGVyVGhhbiwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBERkdfQ1JBU0gobV9ncmFwaCwgY29tcGFyZSwgIkludmFsaWQgY29t
cGFyaXNvbiBub2RlIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlm
IChpbnZlcnQpCisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGb3JUcnVlID0g
cmVsYXRpb25zaGlwRm9yVHJ1ZS5pbnZlcnNlKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwRm9yVHJ1ZSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvclRydWUgPSBtX3JlbGF0aW9uc2hpcHM7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBNYXAgZm9yRmFsc2UgPSBtX3JlbGF0
aW9uc2hpcHM7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIkRl
YWxpbmcgd2l0aCB0cnVlOlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlv
bnNoaXAoZm9yVHJ1ZSwgcmVsYXRpb25zaGlwRm9yVHJ1ZSk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcEZvckZhbHNlID0gcmVsYXRpb25zaGlw
Rm9yVHJ1ZS5pbnZlcnNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVy
Ym9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiRGVhbGluZyB3
aXRoIGZhbHNlOlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25z
aGlwKGZvckZhbHNlLCByZWxhdGlvbnNoaXBGb3JGYWxzZSk7CisgICAgICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JUcnVlLCBicmFuY2hEYXRhLT50YWtlbi5ibG9jayk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8oZm9yRmFsc2UsIGJyYW5j
aERhdGEtPm5vdFRha2VuLmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlN
ZXJnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TWVyZ2VkKSB7CisgICAgICAgICAgICAgICAg
ICAgIGZvciAoQmFzaWNCbG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhtX3JlbGF0aW9uc2hpcHMs
IHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIAorICAgICAgICAvLyBOb3cgd2UgdHJhbnNmb3JtIHRoZSBjb2RlIGJhc2VkIG9u
IHRoZSByZXN1bHRzIGNvbXB1dGVkIGluIHRoZSBwcmV2aW91cyBsb29wLgorICAgICAgICBjaGFu
Z2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2dyYXBoLmJs
b2Nrc0luTmF0dXJhbE9yZGVyKCkpIHsKKyAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwcyA9IG1f
cmVsYXRpb25zaGlwc0F0SGVhZFtibG9ja107CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIG5v
ZGVJbmRleCA9IDA7IG5vZGVJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsrbm9kZUluZGV4KSB7Cisg
ICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJsb2NrLT5hdChub2RlSW5kZXgpOworICAgICAg
ICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJUcmFu
c2Zvcm1hdGlvbjogYXQgIiwgbm9kZSwgIjogIiwgbGlzdER1bXAoc29ydGVkUmVsYXRpb25zaGlw
cygpKSwgIlxuIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVGhpcyBl
bmRzIHVwIGJlaW5nIHByZXR0eSBhd2t3YXJkIHRvIHdyaXRlIGJlY2F1c2Ugd2UgbmVlZCB0byBk
ZWNpZGUgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZSBieSB1c2luZyB0aGUgcmVs
YXRpb25zaGlwcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiwgYnV0IHdlIG5lZWQgdG8KKyAgICAgICAg
ICAgICAgICAvLyBjYWxsIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHdlIG9wdGltaXplLgorICAgICAg
ICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQXJp
dGhBZGQ6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5pc0JpbmFyeVVzZUtpbmQo
SW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5v
ZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYXV0byBp
dGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICBpbnQgbWluVmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigp
OworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRz
PGludD46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxh
dGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVmFs
dWUgPSBzdGQ6Om1heChtaW5WYWx1ZSwgcmVsYXRpb25zaGlwLm1pblZhbHVlT2ZMZWZ0KCkpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBzdGQ6Om1pbihtYXhWYWx1ZSwgcmVs
YXRpb25zaGlwLm1heFZhbHVlT2ZMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGlu
dD4obWluVmFsdWUsIG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCkpIHx8CisgICAgICAgICAgICAg
ICAgICAgICAgICBzdW1PdmVyZmxvd3M8aW50PihtYXhWYWx1ZSwgbm9kZS0+Y2hpbGQyKCktPmFz
SW50MzIoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5k
ZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+c2V0QXJpdGhNb2RlKEFyaXRoOjpVbmNo
ZWNrZWQpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICBjYXNlIENoZWNrSW5Cb3VuZHM6IHsKKyAgICAgICAgICAgICAgICAg
ICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgp
KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgp
KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICBib29sIG5vbk5lZ2F0aXZlID0gZmFsc2U7CisgICAgICAgICAg
ICAgICAgICAgIGJvb2wgbGVzc1RoYW5MZW5ndGggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAubWluVmFsdWVPZkxlZnQoKSA+PSAw
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9u
c2hpcC5yaWdodCgpID09IG5vZGUtPmNoaWxkMigpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpFcXVhbAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPCAw
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzVGhhbkxlbmd0aCA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpMZXNzVGhhbgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAub2Zmc2V0KCkgPD0g
MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzc1RoYW5MZW5ndGggPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobm9uTmVnYXRpdmUgJiYg
bGVzc1RoYW5MZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJs
b2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnJlbW92
ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUoYmxvY2stPmF0KG5vZGVJbmRleCkpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gY2hhbmdlZDsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBleGVjdXRlTm9kZShOb2RlKiBub2RlKQorICAg
IHsKKyAgICAgICAgc3dpdGNoIChub2RlLT5vcCgpKSB7CisgICAgICAgIGNhc2UgQ2hlY2tJbkJv
dW5kczogeworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9uc2hpcDo6c2FmZUNy
ZWF0ZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIG5vZGUtPmNoaWxkMigpLm5vZGUoKSwgUmVsYXRp
b25zaGlwOjpMZXNzVGhhbikpOworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9u
c2hpcDo6c2FmZUNyZWF0ZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25z
aGlwOjpHcmVhdGVyVGhhbiwgLTEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBcml0aEFkZDogeworICAgICAgICAgICAgLy8gV2Un
cmUgb25seSBpbnRlcmVzdGVkIGluIGludDMyIGFkZGl0aW9ucyBhbmQgd2UgY3VycmVudGx5IG9u
bHkga25vdyBob3cgdG8KKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgbm9uLXdyYXBwaW5nIG9u
ZXMuCisgICAgICAgICAgICBpZiAoIW5vZGUtPmlzQmluYXJ5VXNlS2luZChJbnQzMlVzZSkpCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1F
OiBXZSBjb3VsZCBoYW5kbGUgdGhlIHVuY2hlY2tlZCBhcml0aG1ldGljIGNhc2UuIFdlIGp1c3Qg
ZG8gaXQgZG9uJ3QgcmlnaHQKKyAgICAgICAgICAgIC8vIG5vdy4KKyAgICAgICAgICAgIGlmIChu
b2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSGFuZGxlIGFkZDogQHZhbHVl
ICsgY29uc3RhbnQuCisgICAgICAgICAgICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29u
c3RhbnQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgaW50IG9mZnNldCA9IG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCk7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIC8vIFdlIGFkZCBhIHJlbGF0aW9uc2hpcCBmb3IgQGFkZCA9PSBAdmFsdWUg
KyBjb25zdGFudCwgYW5kIHRoZW4gd2UgY29weSB0aGUKKyAgICAgICAgICAgIC8vIHJlbGF0aW9u
c2hpcHMgZm9yIEB2YWx1ZS4gVGhpcyBnaXZlcyB1cyBhIG9uZS1kZWVwIHZpZXcgb2YgQHZhbHVl
J3MgZXhpc3RpbmcKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMsIHdoaWNoIG1hdGNoZXMg
dGhlIG9uZS1kZWVwIHNlYXJjaCBpbiBzZXRSZWxhdGlvbnNoaXAoKS4KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hp
cChub2RlLCBub2RlLT5jaGlsZDEoKS5ub2RlKCksIFJlbGF0aW9uc2hpcDo6RXF1YWwsIG9mZnNl
dCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtX3JlbGF0aW9uc2hp
cHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0g
bV9yZWxhdGlvbnNoaXBzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmVjdG9yPFJlbGF0aW9u
c2hpcD4gdG9BZGQ7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25z
aGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZToKKyAg
ICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZDogQXJpdGhBZGQoQHgsIEMpCisgICAgICAgICAg
ICAgICAgICAgIC8vICAgICBAeCBvcCBAeSArIEQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAg
ICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjZXJ0YWlubHkgaG9sZHM6CisgICAg
ICAgICAgICAgICAgICAgIC8vICAgICBAeCA9PSBAYWRkIC0gQworICAgICAgICAgICAgICAgICAg
ICAvLworICAgICAgICAgICAgICAgICAgICAvLyBXaGljaCBhbGxvd3MgdXMgdG8gc3Vic3RpdHV0
ZToKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIEBhZGQgLSBDIG9wIEB5ICsgRAorICAgICAg
ICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGhlbiBjYXJyeSB0
aGUgQyBvdmVyOgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgQGFkZCBvcCBAeSArIEQgKyBD
CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAg
bmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICBBU1NF
UlQobmV3UmVsYXRpb25zaGlwLmxlZnQoKSA9PSBub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlbGF0aW9uc2hp
cC5yaWdodCgpID09IG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlwLnNldExlZnQobm9kZSk7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNoaXAuYWRkVG9PZmZzZXQob2Zmc2V0KSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNoaXApOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlv
bnNoaXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKHJlbGF0
aW9uc2hpcCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8v
IE5vdyB3ZSB3YW50IHRvIGVzdGFibGlzaCB0aGF0IGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0
cHV0IG9mIHRoZSBhZGRpdGlvbiBhcmUKKyAgICAgICAgICAgIC8vIHdpdGhpbiBhIHBhcnRpY3Vs
YXIgcmFuZ2Ugb2YgaW50ZWdlcnMuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvZmZz
ZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAx
IiB0aGVuIHdlIGtub3cgdGhhdCBAdmFsdWUgPD0gbWF4IC0gMSwgaS5lLiB0aGF0CisgICAgICAg
ICAgICAgICAgLy8gQHZhbHVlIDwgbWF4LgorICAgICAgICAgICAgICAgIGlmICghc3VtT3ZlcmZs
b3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwgLW9mZnNldCwgMSkpIHsK
KyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAg
ICAgICAgUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6Okxlc3NUaGFu
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6
bWF4KCkgLSBvZmZzZXQgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSWYg
d2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBAYWRkID49IG1pbiAr
IDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEBhZGQgPiBtaW4uCisgICAgICAgICAg
ICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1p
bigpLCBvZmZzZXQsIC0xKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAo
CisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbm9kZSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkg
KyBvZmZzZXQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG9mZnNl
dCA8IDAgJiYgb2Zmc2V0ICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpIHsKKyAg
ICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSAtIDEiIHRoZW4gd2Uga25v
dyB0aGF0IEB2YWx1ZSA+PSBtaW4gKyAxLCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBA
dmFsdWUgPiBtaW4uCisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6
Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpLCBvZmZzZXQsIC0xKSkgeworICAgICAgICAgICAg
ICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlv
bnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+Y2hp
bGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRoYW4sCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSArIG9m
ZnNldCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgImFkZDog
QHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQgQGFkZCA8PSBtYXggLSAxLCBpLmUuIHRoYXQK
KyAgICAgICAgICAgICAgICAvLyBAYWRkIDwgbWF4LgorICAgICAgICAgICAgICAgIGlmICghc3Vt
T3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwgLW9mZnNldCwg
MSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAg
ICAgICAgICAgICAgUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5v
ZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC0gb2Zmc2V0ICsgMSksCisg
ICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
IGNhc2UgR2V0QXJyYXlMZW5ndGg6IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcChSZWxh
dGlvbnNoaXAobm9kZSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJUaGFuLCAtMSkpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBjYXNl
IFVwc2lsb246IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgICAg
ICBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmNo
aWxkMSgpLm5vZGUoKSwgbm9kZS0+cGhpKCksIFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApKTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQo
bm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1fcmVsYXRp
b25zaGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHRv
QWRkOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGl0
ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlv
bnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5waGko
KSA9PSBuZXdSZWxhdGlvbnNoaXAucmlnaHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbnNoaXAuc2V0TGVmdChub2Rl
LT5waGkoKSk7CisgICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlvbnNo
aXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hp
cCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25z
aGlwKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHNldFJlbGF0aW9uc2hpcChSZWxh
dGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7Cisg
ICAgICAgIHNldFJlbGF0aW9uc2hpcChtX3JlbGF0aW9uc2hpcHMsIHJlbGF0aW9uc2hpcCwgdGlt
ZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0UmVsYXRpb25zaGlwKAorICAgICAg
ICBSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgUmVsYXRpb25zaGlwIHJlbGF0aW9u
c2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9IDEpCisgICAgeworICAgICAgICBzZXRPbmVTaWRl
KHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25zaGlwLCB0aW1lVG9MaXZlKTsKKyAgICAgICAgc2V0
T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIHJlbGF0aW9uc2hpcC5mbGlwcGVkKCksIHRpbWVUb0xp
dmUpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldE9uZVNpZGUoCisgICAgICAgIFJlbGF0aW9u
c2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNp
Z25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIGlmICghcmVsYXRpb25zaGlwKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAg
ICAgICAgICBkYXRhTG9nKCIgICAgU2V0dGluZzogIiwgcmVsYXRpb25zaGlwLCAiICh0dGwgPSAi
LCB0aW1lVG9MaXZlLCAiKVxuIik7CisKKyAgICAgICAgYXV0byByZXN1bHQgPSByZWxhdGlvbnNo
aXBNYXAuYWRkKAorICAgICAgICAgICAgcmVsYXRpb25zaGlwLmxlZnQoKSwgVmVjdG9yPFJlbGF0
aW9uc2hpcD4oKSk7CisgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+JiByZWxhdGlvbnNoaXBz
ID0gcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4g
dG9BZGQ7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChSZWxhdGlv
bnNoaXAmIG90aGVyUmVsYXRpb25zaGlwIDogcmVsYXRpb25zaGlwcykgeworICAgICAgICAgICAg
aWYgKG90aGVyUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwIGZpbHRlcmVkID0gb3RoZXJSZWxhdGlvbnNoaXAu
ZmlsdGVyKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGZpbHRl
cmVkLmxlZnQoKSA9PSByZWxhdGlvbnNoaXAubGVmdCgpKTsKKyAgICAgICAgICAgICAgICAgICAg
b3RoZXJSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQg
PSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYgb3RoZXJSZWxhdGlvbnNoaXAua2luZCgpID09
IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAg
ICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgQ29uc2lkZXJpbmc6ICIsIG90aGVyUmVs
YXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBX
ZSBoYXZlOgorICAgICAgICAgICAgICAgIC8vICAgICBAYSBvcCBAYiArIEMKKyAgICAgICAgICAg
ICAgICAvLyAgICAgQGEgPT0gQGMgKyBECisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAg
ICAgICAvLyBUaGlzIGltcGxpZXM6CisgICAgICAgICAgICAgICAgLy8gICAgIEBjICsgRCBvcCBA
YiArIEMKKyAgICAgICAgICAgICAgICAvLyAgICAgQGMgb3AgQGIgKyBDIC0gRAorICAgICAgICAg
ICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2hlcmU6IEBhID09IHJlbGF0aW9uc2hpcC5s
ZWZ0KCksIEBiID09IHJlbGF0aW9uc2hpcC5yaWdodCgpLAorICAgICAgICAgICAgICAgIC8vIEBh
ID09IG90aGVyUmVsYXRpb25zaGlwLmxlZnQoKSwgQGMgPT0gb3RoZXJSZWxhdGlvbnNoaXAucmln
aHQoKS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAob3RoZXJSZWxhdGlv
bnNoaXAub2Zmc2V0KCkgIT0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSkgeworICAg
ICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25z
aGlwOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLnJpZ2h0KCkgIT0g
b3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3
UmVsYXRpb25zaGlwLnNldExlZnQob3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLmFkZFRvT2Zmc2V0KC1vdGhlclJl
bGF0aW9uc2hpcC5vZmZzZXQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9BZGQu
YXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
ICghZm91bmQpCisgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChyZWxhdGlvbnNoaXAp
OworICAgICAgICAKKyAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgYW5vdGhlclJlbGF0aW9uc2hp
cCA6IHRvQWRkKSB7CisgICAgICAgICAgICBBU1NFUlQodGltZVRvTGl2ZSk7CisgICAgICAgICAg
ICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgYW5vdGhlclJlbGF0aW9uc2hpcCwgdGltZVRv
TGl2ZSAtIDEpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGJvb2wgbWVyZ2VUbyhSZWxh
dGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgQmFzaWNCbG9jayogdGFyZ2V0KQorICAgIHsK
KyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIk1lcmdpbmcgdG8g
IiwgcG9pbnRlckR1bXAodGFyZ2V0KSwgIjpcbiIpOworICAgICAgICAgICAgZGF0YUxvZygiICAg
IEluY29taW5nOiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcE1h
cCkpLCAiXG4iKTsKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBBdCBoZWFkOiAiLCBsaXN0RHVt
cChzb3J0ZWRSZWxhdGlvbnNoaXBzKG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdKSksICJc
biIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9zZWVuQmxvY2tzLmFkZCh0
YXJnZXQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IGJsb2NrLiBXZSBjb3B5IHN1
YmplY3QgdG8gbGl2ZW5lc3MgcHJ1bmluZy4KKyAgICAgICAgICAgIGF1dG8gaXNMaXZlID0gWyZd
IChOb2RlKiBub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbV96ZXJvKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFy
Z2V0LT5zc2EtPmxpdmVBdEhlYWQuY29udGFpbnMobm9kZSk7CisgICAgICAgICAgICB9OworICAg
ICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogcmVsYXRpb25zaGlwTWFw
KSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0xpdmUoZW50cnkua2V5KSkKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVmVj
dG9yPFJlbGF0aW9uc2hpcD4gdmFsdWVzOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25z
aGlwIHJlbGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFT
U0VSVChyZWxhdGlvbnNoaXAubGVmdCgpID09IGVudHJ5LmtleSk7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChpc0xpdmUocmVsYXRpb25zaGlwLnJpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgIFByb3BhZ2F0aW5nICIsIHJlbGF0aW9uc2hpcCwgIlxuIik7CisgICAgICAgICAgICAgICAg
ICAgICAgICB2YWx1ZXMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
c3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICAgICAgICAgICAgICAg
IG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdLmFkZChlbnRyeS5rZXksIHZhbHVlcyk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgLy8gTWVyZ2UgYnkgaW50ZXJzZWN0aW5nLiBXZSBoYXZlIG5vIG5vdGlvbiBv
ZiBCT1RUT00sIHNvIHdlIHVzZSB0aGUgb21pc3Npb24gb2YKKyAgICAgICAgLy8gcmVsYXRpb25z
aGlwcyBmb3IgYSBwYWlyIG9mIG5vZGVzIHRvIG1lYW4gVE9QLiBUaGUgcmVhc29uIHdoeSB3ZSBk
b24ndCBuZWVkIEJPVFRPTQorICAgICAgICAvLyBpcyAoMSkgd2UganVzdCBvdmVyYXBwcm94aW1h
dGUgY29udHJhZGljdGlvbnMgYW5kICgyKSBhIHZhbHVlIG5ldmVyIGhhdmluZyBiZWVuCisgICAg
ICAgIC8vIGFzc2lnbmVkIHdvdWxkIG9ubHkgaGFwcGVuIGlmIHdlIGhhdmUgbm90IHByb2Nlc3Nl
ZCB0aGUgbm9kZSdzIHByZWRlY2Vzc29yLiBXZQorICAgICAgICAvLyBzaG91bGRuJ3QgcHJvY2Vz
cyBibG9ja3MgdW50aWwgd2UgaGF2ZSBwcm9jZXNzZWQgdGhlIGJsb2NrJ3MgcHJlZGVjZXNzb3Ig
YmVjYXVzZSB3ZQorICAgICAgICAvLyBhcmUgdXNpbmcgUlBPLgorICAgICAgICBWZWN0b3I8Tm9k
ZSo+IHRvUmVtb3ZlOworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9y
IChhdXRvJiBlbnRyeSA6IG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdKSB7CisgICAgICAg
ICAgICBhdXRvIGl0ZXIgPSByZWxhdGlvbnNoaXBNYXAuZmluZChlbnRyeS5rZXkpOworICAgICAg
ICAgICAgaWYgKGl0ZXIgPT0gcmVsYXRpb25zaGlwTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAg
ICAgdG9SZW1vdmUuYXBwZW5kKGVudHJ5LmtleSk7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9
IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHZhbHVlczsKKyAgICAgICAg
ICAgIGZvciAoUmVsYXRpb25zaGlwIHRhcmdldFJlbGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVlKSB7
CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgc291cmNlUmVsYXRpb25zaGlwIDog
aXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAg
ICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgIE1lcmdpbmcgIiwgdGFyZ2V0UmVsYXRpb25zaGlw
LCAiIGFuZCAiLCBzb3VyY2VSZWxhdGlvbnNoaXAsICI6XG4iKTsKKyAgICAgICAgICAgICAgICAg
ICAgdGFyZ2V0UmVsYXRpb25zaGlwLm1lcmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgc291
cmNlUmVsYXRpb25zaGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZdIChSZWxhdGlvbnNo
aXAgbmV3UmVsYXRpb25zaGlwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZl
cmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBHb3Qg
IiwgbmV3UmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbHRlcigpIHRvIGF2
b2lkIGV4cG9uZW50aWFsIGV4cGxvc2lvbiBvZiBpZGVudGljYWwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLiBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgbWFr
aW5nIHNldE9uZVNpZGUoKSBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUg
d29yaywgc2luY2Ugd2UgZXhwZWN0IHNldE9uZVNpZGUoKSB3aWxsIGJlIGNhbGxlZCBtb3JlCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbnRseS4gSGVyZSdzIGFuIGV4YW1w
bGUuIEF0IHNvbWUgcG9pbnQgc29tZW9uZSBtaWdodCBzdGFydAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIHdpdGggdHdvIHJlbGF0aW9uc2hpcHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQg
QGEgPCBAYiArIEQuIFRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lb25l
IGRvZXMgYSBzZXRSZWxhdGlvbnNoaXAoKSBwYXNzaW5nIHNvbWV0aGluZyB0aGF0IHR1cm5zCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvZiB0aGVzZSBpbnRvIEBhID09IEBi
LiBOb3cgd2UgaGF2ZSBAYSA9PSBAYiBkdXBsaWNhdGVkLgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIExldCdzIHNheSB0aGF0IHRoaXMgZHVwbGljYXRlIEBhID09IEBiIGVuZHMgdXAg
YXQgdGhlIGhlYWQgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AuIElm
IHdlIGRpZG4ndCBoYXZlIHRoaXMgcnVsZSwgdGhlbiB0aGUgbG9vcCB3b3VsZCBwcm9wYWdhdGUK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgQGEgPT0gQGIncyBvbnRv
IHRoZSBleGlzdGluZyBkdXBsaWNhdGUgQGEgPT0gQGIncy4KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBUaGVyZSB3b3VsZCBiZSBmb3VyIHBhaXJzIG9mIEBhID09IEBiLCBlYWNoIG9m
IHdoaWNoIHdvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3
IEBhID09IEBiLiBOb3cgd2UnZCBoYXZlIGZvdXIgb2YgdGhlc2UgZHVwbGljYXRlcworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSdkIGhh
dmUgOCwgdGhlbiAxNiwgZXRjLiBXZSBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIHRoaXMgaGVyZSBieSBkb2luZyB0aGlzIGZpbHRyYXRpb24uIFRoYXQgbWlnaHQgYmUgYSBi
aXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVya2lsbCwgc2luY2UgaXQn
cyBwcm9iYWJseSBqdXN0IHRoZSBpZGVudGljYWwgZHVwbGljYXRlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gcmVsYXRpb25zaGlwIGNhc2Ugd2Ugd2FudCcgdG8gYXZvaWQuIEJ1dCwg
SSdsbCBrZWVwIHRoaXMgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBo
YXZlIGV2aWRlbmNlIHRoYXQgdGhpcyBpcyBhIHBlcmZvcm1hbmNlIHByb2JsZW0uIFJlbWVtYmVy
IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5n
IHdpdGggYSBsaXN0IHRoYXQgaXMgcHJ1bmVkIGRvd24gdG8KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyByZWxhdGlvbnNoaXBzIHdpdGggaWRlbnRpY2FsIGxlZnQgb3BlcmFuZC4gSXQg
c2hvdWxkbid0IGJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXJnZSBsaXN0
LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwJiBleGlzdGlu
Z1JlbGF0aW9uc2hpcCA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoZXhpc3RpbmdSZWxhdGlvbnNoaXAuc2FtZU5vZGVzQXMobmV3UmVsYXRpb25zaGlwKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIGZpbHRl
cmVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Jl
bGF0aW9uc2hpcC5maWx0ZXIobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVsYXRpb25zaGlwID0gZmlsdGVyZWQ7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQobmV3UmVsYXRp
b25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c29ydCh2YWx1ZXMuYmVnaW4oKSwgdmFs
dWVzLmVuZCgpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS52YWx1ZSA9PSB2YWx1ZXMpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVudHJ5LnZh
bHVlID0gdmFsdWVzOworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAg
ICAgICAgZm9yIChOb2RlKiBub2RlIDogdG9SZW1vdmUpCisgICAgICAgICAgICBtX3JlbGF0aW9u
c2hpcHNBdEhlYWRbdGFyZ2V0XS5yZW1vdmUobm9kZSk7CisgICAgICAgIAorICAgICAgICByZXR1
cm4gY2hhbmdlZDsKKyAgICB9CisgICAgICAgIAorICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHNv
cnRlZFJlbGF0aW9uc2hpcHMoY29uc3QgUmVsYXRpb25zaGlwTWFwJiByZWxhdGlvbnNoaXBzKQor
ICAgIHsKKyAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gcmVzdWx0OworICAgICAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogcmVsYXRpb25zaGlwcykKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRW
ZWN0b3IoZW50cnkudmFsdWUpOworICAgICAgICBzdGQ6OnNvcnQocmVzdWx0LmJlZ2luKCksIHJl
c3VsdC5lbmQoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIFZl
Y3RvcjxSZWxhdGlvbnNoaXA+IHNvcnRlZFJlbGF0aW9uc2hpcHMoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHNvcnRlZFJlbGF0aW9uc2hpcHMobV9yZWxhdGlvbnNoaXBzKTsKKyAgICB9CisgICAg
CisgICAgTm9kZSogbV96ZXJvOworICAgIFJlbGF0aW9uc2hpcE1hcCBtX3JlbGF0aW9uc2hpcHM7
CisgICAgQmxvY2tTZXQgbV9zZWVuQmxvY2tzOworICAgIEJsb2NrTWFwPFJlbGF0aW9uc2hpcE1h
cD4gbV9yZWxhdGlvbnNoaXBzQXRIZWFkOworICAgIEluc2VydGlvblNldCBtX2luc2VydGlvblNl
dDsKK307CisgICAgCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworYm9vbCBwZXJmb3JtSW50
ZWdlclJhbmdlT3B0aW1pemF0aW9uKEdyYXBoJiBncmFwaCkKK3sKKyAgICBTYW1wbGluZ1JlZ2lv
biBzYW1wbGluZ1JlZ2lvbigiREZHIEludGVnZXIgUmFuZ2UgT3B0aW1pemF0aW9uIFBoYXNlIik7
CisgICAgcmV0dXJuIHJ1blBoYXNlPEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlPihncmFw
aCk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJMRShE
RkdfSklUKQorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFz
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZV9oCisjZGVmaW5lIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gK
KworI2lmIEVOQUJMRShERkdfSklUKQorCituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIERGRyB7
CisKK2NsYXNzIEdyYXBoOworCisvLyBSZW1vdmVzIG92ZXJmbG93IGNoZWNrcyBhbmQgb3V0LW9m
LWJvdW5kcyBjaGVja3MgYnkgZG9pbmcgYSBmb3J3YXJkIGZsb3cgYW5hbHlzaXMgdG8gcHJvdmUK
Ky8vIGluZXF1YWxpdGllcy4KKworYm9vbCBwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9u
KEdyYXBoJik7CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKKworI2VuZGlmIC8vIEVOQUJM
RShERkdfSklUKQorCisjZW5kaWYgLy8gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2Vf
aAorCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1BsYW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUGxhbi5jcHAJKHJldmlzaW9uIDE4
NTYxOCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUGxhbi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJERkdGaXh1cFBoYXNlLmgiCiAjaW5j
bHVkZSAiREZHR3JhcGhTYWZlcG9pbnQuaCIKICNpbmNsdWRlICJERkdJbnRlZ2VyQ2hlY2tDb21i
aW5pbmdQaGFzZS5oIgorI2luY2x1ZGUgIkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmgiCiAjaW5jbHVkZSAiREZHSW52YWxpZGF0aW9uUG9pbnRJbmplY3Rpb25QaGFzZS5oIgogI2lu
Y2x1ZGUgIkRGR0pJVENvbXBpbGVyLmgiCiAjaW5jbHVkZSAiREZHTElDTVBoYXNlLmgiCkBAIC0z
NTcsNiArMzU4LDggQEAgUGxhbjo6Q29tcGlsYXRpb25QYXRoIFBsYW46OmNvbXBpbGVJblRocgog
ICAgICAgICBwZXJmb3JtQ29uc3RhbnRIb2lzdGluZyhkZmcpOwogICAgICAgICBwZXJmb3JtR2xv
YmFsQ1NFKGRmZyk7CiAgICAgICAgIHBlcmZvcm1MaXZlbmVzc0FuYWx5c2lzKGRmZyk7CisgICAg
ICAgIHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oZGZnKTsKKyAgICAgICAgcGVyZm9y
bUxpdmVuZXNzQW5hbHlzaXMoZGZnKTsKICAgICAgICAgcGVyZm9ybUNGQShkZmcpOwogICAgICAg
ICBwZXJmb3JtQ29uc3RhbnRGb2xkaW5nKGRmZyk7CiAgICAgICAgIHBlcmZvcm1DbGVhblVwKGRm
Zyk7IC8vIFJlZHVjZSB0aGUgZ3JhcGggc2l6ZSBhIGxvdC4KSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS90ZXN0cy9zdHJlc3MvYWRkLW92ZXJmbG93cy1hZnRlci1ub3QtZXF1YWwuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9hZGQtb3ZlcmZs
b3dzLWFmdGVyLW5vdC1lcXVhbC5qcwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS90ZXN0cy9zdHJlc3MvYWRkLW92ZXJmbG93cy1hZnRlci1ub3QtZXF1YWwuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxNiBAQAorZnVuY3Rpb24gZm9vKGEpIHsKKyAgICBpZiAoYSAh
PSAwKQorICAgICAgICByZXR1cm4gYSArIDE7Cit9CisKK25vSW5saW5lKGZvbyk7CisKK2ZvciAo
dmFyIGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgeworICAgIHZhciByZXN1bHQgPSBmb28oNDIpOwor
ICAgIGlmIChyZXN1bHQgIT0gNDMpCisgICAgICAgIHRocm93ICJFcnJvcjogYmFkIHJlc3VsdCBp
biBsb29wOiAiICsgcmVzdWx0OworfQorCit2YXIgcmVzdWx0ID0gZm9vKDIxNDc0ODM2NDcpOwor
aWYgKHJlc3VsdCAhPSAyMTQ3NDgzNjQ4KQorICAgIHRocm93ICJFcnJvcjogYmFkIHJlc3VsdCBh
dCBlbmQ6ICIgKyByZXN1bHQ7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3Ry
ZXNzL3N1Yi1vdmVyZmxvd3MtYWZ0ZXItbm90LWVxdWFsLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3Mvc3ViLW92ZXJmbG93cy1hZnRlci1ub3QtZXF1
YWwuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNz
L3N1Yi1vdmVyZmxvd3MtYWZ0ZXItbm90LWVxdWFsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTYgQEAKK2Z1bmN0aW9uIGZvbyhhKSB7CisgICAgaWYgKGEgIT0gMCkKKyAgICAgICAgcmV0
dXJuIGEgLSAxOworfQorCitub0lubGluZShmb28pOworCitmb3IgKHZhciBpID0gMDsgaSA8IDEw
MDAwOyArK2kpIHsKKyAgICB2YXIgcmVzdWx0ID0gZm9vKDQyKTsKKyAgICBpZiAocmVzdWx0ICE9
IDQxKQorICAgICAgICB0aHJvdyAiRXJyb3I6IGJhZCByZXN1bHQgaW4gbG9vcDogIiArIHJlc3Vs
dDsKK30KKwordmFyIHJlc3VsdCA9IGZvbygtMjE0NzQ4MzY0OCk7CitpZiAocmVzdWx0ICE9IC0y
MTQ3NDgzNjQ5KQorICAgIHRocm93ICJFcnJvcjogYmFkIHJlc3VsdCBhdCBlbmQ6ICIgKyByZXN1
bHQ7CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxODU2MTgpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyNyBAQAorMjAxNS0wNi0xMCAgRmlsaXAgUGl6bG8g
IDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAgIEZUTCBzaG91bGQgZWxpbWluYXRlIGFycmF5
IGJvdW5kcyBjaGVja3MgaW4gbG9vcHMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE0NTc2OAorCisgICAgICAgIFJldmlld2VkIGJ5IEJlbmphbWluIFBv
dWxhaW4uCisKKyAgICAgICAgKiBqcy9yZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwtZXhw
ZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3At
ZXF1YWwuaHRtbDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNr
d2FyZC1sb29wLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9hYmMt
cG9zdGZpeC1iYWNrd2FyZC1sb29wLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3Mv
YWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICog
anMvcmVncmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuaHRtbDogQWRkZWQuCisgICAgICAg
ICoganMvcmVncmVzcy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC1leHBlY3RlZC50eHQ6IEFkZGVk
LgorICAgICAgICAqIGpzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuaHRtbDogQWRk
ZWQuCisgICAgICAgICoganMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLWZvcndhcmQtbG9vcC1l
cXVhbC5qczogQWRkZWQuCisgICAgICAgIChmb28pOgorICAgICAgICAqIGpzL3JlZ3Jlc3Mvc2Ny
aXB0LXRlc3RzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuanM6IEFkZGVkLgorICAgICAgICAo
Zm9vKToKKyAgICAgICAgKiBqcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWJhY2t3
YXJkLWxvb3AuanM6IEFkZGVkLgorICAgICAgICAoZm9vKToKKyAgICAgICAgKiBqcy9yZWdyZXNz
L3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC5qczogQWRkZWQuCisgICAgICAg
IChmb28pOgorCiAyMDE1LTA2LTE2ICBCcmVudCBGdWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29t
PgogCiAgICAgICAgIFVucmV2aWV3ZWQgdGVzdCB1cGRhdGU6IEFkZCBtdWx0aXBsZSBzY3JvbGwt
c25hcC1jb29yZGluYXRlIHRlc3QuCkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1m
b3J3YXJkLWxvb3AtZXF1YWwtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3Rz
L2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC1leHBlY3RlZC50eHQJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwtZXhw
ZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAgQEAKK0pTUmVncmVzcy9hYmMt
Zm9yd2FyZC1sb29wLWVxdWFsCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBv
ZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNT
IG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKwor
VEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1mb3J3YXJk
LWxvb3AtZXF1YWwuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2Fi
Yy1mb3J3YXJkLWxvb3AtZXF1YWwuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pz
L3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VO
Ij4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3Qt
cHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jl
c291cmNlcy9yZWdyZXNzLXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRl
c3RzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4u
Ly4uL3Jlc291cmNlcy9yZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4u
Ly4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1s
PgpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29w
LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1w
b3N0Zml4LWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0
VGVzdHMvanMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLWV4cGVjdGVkLnR4dAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwIEBACitKU1JlZ3Jlc3MvYWJjLXBvc3RmaXgtYmFj
a3dhcmQtbG9vcAorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1Mi
IG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworUEFTUyBubyBleGNl
cHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09N
UExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2Fy
ZC1sb29wLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtcG9z
dGZpeC1iYWNrd2FyZC1sb29wLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuaHRtbAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9F
TiI+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0
LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9y
ZXNvdXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdC10
ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3Jj
PSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wb3N0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3Jj
PSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwv
aHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1s
b29wLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2Fi
Yy1zaW1wbGUtYmFja3dhcmQtbG9vcC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC1leHBlY3RlZC50eHQJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL2FiYy1zaW1wbGUtYmFj
a3dhcmQtbG9vcAorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1Mi
IG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworUEFTUyBubyBleGNl
cHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09N
UExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJk
LWxvb3AuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1w
bGUtYmFja3dhcmQtbG9vcC5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVn
cmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+
Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBy
ZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNv
dXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0
cy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4u
Ly4uL3Jlc291cmNlcy9yZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4u
Ly4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1s
PgpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC1l
eHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtc2lt
cGxlLWZvcndhcmQtbG9vcC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLWV4cGVjdGVkLnR4dAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDEwIEBACitKU1JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxv
b3AKKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdl
cywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCisKK1BBU1Mgbm8gZXhjZXB0aW9uIHRo
cm93bgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisK
SW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuaHRt
bAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2Fy
ZC1sb29wLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1z
aW1wbGUtZm9yd2FyZC1sb29wLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMiBAQAor
PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8
aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2Ny
aXB0PgorPC9oZWFkPgorPGJvZHk+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jl
c3MtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvYWJjLXNpbXBs
ZS1mb3J3YXJkLWxvb3AuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNl
cy9yZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNl
cy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5
b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMt
Zm9yd2FyZC1sb29wLWVxdWFsLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVn
cmVzcy9zY3JpcHQtdGVzdHMvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE0IEBACitmdW5jdGlvbiBmb28oYXJyYXkpIHsKKyAgICB2YXIgcmVzdWx0
ID0gMDsKKyAgICBmb3IgKHZhciBpID0gMDsgaSAhPSBhcnJheS5sZW5ndGg7ICsraSkKKyAgICAg
ICAgcmVzdWx0ICs9IGFycmF5W2ldOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK25vSW5saW5l
KGZvbyk7CisKK3ZhciBhcnJheSA9IFtdOworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwOyArK2kp
CisgICAgYXJyYXkucHVzaChpKTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgNTAwMDA7ICsraSkKKyAg
ICBmb28oYXJyYXkpOwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMv
YWJjLXBvc3RmaXgtYmFja3dhcmQtbG9vcC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9q
cy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmpzCShyZXZp
c2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXBvc3Rm
aXgtYmFja3dhcmQtbG9vcC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0IEBACitmdW5j
dGlvbiBmb28oYXJyYXkpIHsKKyAgICB2YXIgcmVzdWx0ID0gMDsKKyAgICBmb3IgKHZhciBpID0g
YXJyYXkubGVuZ3RoOyBpLS07KQorICAgICAgICByZXN1bHQgKz0gYXJyYXlbaV07CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIGFycmF5ID0gW107Citmb3Ig
KHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICBhcnJheS5wdXNoKGkpOworZm9yICh2YXIg
aSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZvbyhhcnJheSk7CkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBs
ZS1iYWNrd2FyZC1sb29wLmpzCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVz
cy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0aW9uIGZvbyhhcnJheSkgeworICAgIHZhciByZXN1bHQg
PSAwOworICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKKyAg
ICAgICAgcmVzdWx0ICs9IGFycmF5W2ldOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK25vSW5s
aW5lKGZvbyk7CisKK3ZhciBhcnJheSA9IFtdOworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwOyAr
K2kpCisgICAgYXJyYXkucHVzaChpKTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgNTAwMDA7ICsraSkK
KyAgICBmb28oYXJyYXkpOwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVz
dHMvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
anMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuanMJKHJldmlz
aW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxl
LWZvcndhcmQtbG9vcC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0IEBACitmdW5jdGlv
biBmb28oYXJyYXkpIHsKKyAgICB2YXIgcmVzdWx0ID0gMDsKKyAgICBmb3IgKHZhciBpID0gMDsg
aSA8IGFycmF5Lmxlbmd0aDsgKytpKQorICAgICAgICByZXN1bHQgKz0gYXJyYXlbaV07CisgICAg
cmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIGFycmF5ID0gW107Citm
b3IgKHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICBhcnJheS5wdXNoKGkpOworZm9yICh2
YXIgaSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZvbyhhcnJheSk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254995</attachid>
            <date>2015-06-16 19:42:49 -0700</date>
            <delta_ts>2015-06-16 19:42:49 -0700</delta_ts>
            <desc>closer to landing</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>78906</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg1NjE4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM5IEBA
CisyMDE1LTA2LTA5ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgQmVuamFtaW4gUG91bGFpbi4KKyAgICAgICAgCisgICAgICAgIFRoaXMg
YWRkcyBhIHBoYXNlIHRoYXQgZG9lcyBmb3J3YXJkIHByb3BhZ2F0aW9uIG9mIGludGVnZXIgaW5l
cXVhbGl0aWVzLiBUaGlzIGFsbG93cyB1cworICAgICAgICB0byBkbyB0aGUgYWxnZWJyYWljIHJl
YXNvbmluZyB3ZSBuZWVkIHRvIGVsaW1pbmF0ZSBhcnJheSBib3VuZHMgY2hlY2tzIGluIGxvb3Bz
LiBJdAorICAgICAgICBhbHNvIGVsaW1pbmF0ZXMgb3ZlcmZsb3cgY2hlY2tzIG9uIEFyaXRoQWRk
IHdpdGggYSBjb25zdGFudC4KKyAgICAgICAgCisgICAgICAgIFRoZSBwaGFzZSdzIGFuYWx5c2lz
IHByb2R1Y2VzIHJlc3VsdHMgdGhhdCBhcmUgcG93ZXJmdWwgZW5vdWdoIHRvIGRvIHNwZWN1bGF0
aXZlIGJvdW5kcworICAgICAgICBjaGVjayBob2lzdGluZywgYnV0IHRoaXMgcGhhc2UgY3VycmVu
dGx5IG9ubHkgZG9lcyBlbGltaW5hdGlvbi4gV2UgY2FuIGltcGxlbWVudAorICAgICAgICBob2lz
dGluZyBsYXRlci4KKyAgICAgICAgCisgICAgICAgIE9uIHByb2dyYW1zIHRoYXQganVzdCBsb29w
IG92ZXIgYW4gYXJyYXkgbGlrZToKKyAgICAgICAgCisgICAgICAgICAgICBmb3IgKHZhciBpID0g
MDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIHRoaW5neSArPSBhcnJh
eVtpXQorICAgICAgICAKKyAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYSA2MCUgc3BlZWQtdXAuCisg
ICAgICAgIAorICAgICAgICBUaGlzIGlzIGFsc28gYSB+MyUgc3BlZWQtdXAgb24gS3Jha2VuLCBh
bmQgaXQgc2hvd3MgdmFyaW91cyBzcGVlZC11cHMgb24gaW5kaXZpZHVhbAorICAgICAgICB0ZXN0
cyBpbiBPY3RhbmUuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBKYXZh
U2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2o6CisgICAgICAgICogSmF2
YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBkZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6
REZHOjpwZXJmb3JtSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uKToKKyAgICAgICAgKiBkZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaDogQWRkZWQuCisgICAgICAgICogZGZnL0RG
R1BsYW4uY3BwOgorICAgICAgICAoSlNDOjpERkc6OlBsYW46OmNvbXBpbGVJblRocmVhZEltcGwp
OgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9hZGQtb3ZlcmZsb3dzLWFmdGVyLW5vdC1lcXVhbC5q
czogQWRkZWQuCisgICAgICAgICogdGVzdHMvc3RyZXNzL3N1Yi1vdmVyZmxvd3MtYWZ0ZXItbm90
LWVxdWFsLmpzOiBBZGRlZC4KKwogMjAxNS0wNi0xNiAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBw
bGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGwgb3V0IHVuaW50ZW5kZWQgSlNDIGNo
YW5nZSBmcm9tIGh0dHBzOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC8xODU0MjUuCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiAxODU2MTgpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTE4
MSw2ICsxODEsNyBAQCBzZXQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIGRmZy9ERkdJblBs
YWNlQWJzdHJhY3RTdGF0ZS5jcHAKICAgICBkZmcvREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUu
Y3BwCiAgICAgZGZnL0RGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNlLmNwcAorICAgIGRmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSW52YWxpZGF0
aW9uUG9pbnRJbmplY3Rpb25QaGFzZS5jcHAKICAgICBkZmcvREZHSklUQ29kZS5jcHAKICAgICBk
ZmcvREZHSklUQ29tcGlsZXIuY3BwCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNj
cmlwdENvcmUudmN4cHJvai9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3Jl
LnZjeHByb2oJKHJldmlzaW9uIDE4NTYxOCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZh
U2NyaXB0Q29yZS52Y3hwcm9qL0phdmFTY3JpcHRDb3JlLnZjeHByb2oJKHdvcmtpbmcgY29weSkK
QEAgLTQxOCw2ICs0MTgsNyBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0lu
UGxhY2VBYnN0cmFjdFN0YXRlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRm
Z1xERkdJbnNlcnRPU1JIaW50c0ZvclVwZGF0ZS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNs
dWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuY3BwIiAvPgorICAgIDxD
bENvbXBpbGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNl
LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnZhbGlkYXRpb25Q
b2ludEluamVjdGlvblBoYXNlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRm
Z1xERkdKSVRDb2RlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGRmZ1xERkdK
SVRDb21waWxlci5jcHAiIC8+CkBAIC0xMTA5LDYgKzExMTAsNyBAQAogICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5cZGZnXERGR0luc2VydE9TUkhpbnRzRm9yVXBkYXRlLmgiIC8+CiAgICAgPENs
SW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW5zZXJ0aW9uU2V0LmgiIC8+CiAgICAgPENsSW5j
bHVkZSBJbmNsdWRlPSIuLlxkZmdcREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhhc2UuaCIgLz4K
KyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGRmZ1xERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRp
b25QaGFzZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZGZnXERGR0ludmFsaWRh
dGlvblBvaW50SW5qZWN0aW9uUGhhc2UuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4u
XGRmZ1xERkdKSVRDb2RlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkZmdcREZH
SklUQ29tcGlsZXIuaCIgLz4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZp
c2lvbiAxODU2MTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDE2LDYgKzQxNiw4IEBA
CiAJCTBGODM2NEI3MTY0QjBDMTEwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODM2NEI1MTY0QjBD
MEUwMDUzMzI5QSAvKiBERkdCcmFuY2hEaXJlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwRjg4NUUxMTE4NDlBM0JFMDBGMUUzRkEgLyog
Qnl0ZWNvZGVVc2VEZWYuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDBGODg1RTEwMTg0OUEzQkUwMEYxRTNGQSAvKiBCeXRlY29kZVVzZURlZi5oICovOyBz
ZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGODkzQkRCMTkz
NkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODkzQkRBMTkzNkUyM0MwMDEy
MTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVlLmNwcCAqLzsgfTsKKwkJMEY4OThGMzEx
QjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGODk4RjJGMUIy
NzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi87
IH07CisJCTBGODk4RjMyMUIyNzY4OUYwMDgzQTMzQyAvKiBERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6
YXRpb25QaGFzZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlv
blBoYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJMEY4RjE0MzMxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGOEYxNDJGMUFERjA5MDEwMEVENzky
QyAvKiBERkdFcG9jaC5jcHAgKi87IH07CiAJCTBGOEYxNDM0MUFERjA5MDEwMEVENzkyQyAvKiBE
RkdFcG9jaC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MEY4RjE0MzAxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmggKi87IHNldHRpbmdzID0ge0FU
VFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY4RjE0MzUxQURGMDkwMTAwRUQ3OTJD
IC8qIERGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEY4RjE0MzExQURGMDkwMTAwRUQ3OTJDIC8qIERGR01vdkhp
bnRSZW1vdmFsUGhhc2UuY3BwICovOyB9OwpAQCAtMjE1NCw2ICsyMTU2LDggQEAKIAkJMEY4MzY0
QjUxNjRCMEMwRTAwNTMzMjlBIC8qIERGR0JyYW5jaERpcmVjdGlvbi5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IG5hbWUgPSBERkdCcmFuY2hEaXJlY3Rpb24uaDsgcGF0aCA9IGRmZy9ERkdC
cmFuY2hEaXJlY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY4ODVFMTAx
ODQ5QTNCRTAwRjFFM0ZBIC8qIEJ5dGVjb2RlVXNlRGVmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IEJ5dGVjb2RlVXNlRGVmLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTBGODkzQkRBMTkzNkUyM0MwMDEyMTFGNCAvKiBERkdTdHJ1Y3R1cmVBYnN0cmFjdFZhbHVl
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR1N0cnVjdHVyZUFi
c3RyYWN0VmFsdWUuY3BwOyBwYXRoID0gZGZnL0RGR1N0cnVjdHVyZUFic3RyYWN0VmFsdWUuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjg5OEYyRjFCMjc2ODlGMDA4M0EzM0Mg
LyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBuYW1lID0gREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuY3Bw
OyBwYXRoID0gZGZnL0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY4OThGMzAxQjI3Njg5RjAwODNBMzNDIC8qIERGR0lu
dGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
bmFtZSA9IERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmg7IHBhdGggPSBkZmcvREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJMEY4RjE0MkYxQURGMDkwMTAwRUQ3OTJDIC8qIERGR0Vwb2NoLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR0Vwb2NoLmNwcDsgcGF0aCA9IGRmZy9ERkdF
cG9jaC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGOEYxNDMwMUFERjA5MDEw
MEVENzkyQyAvKiBERkdFcG9jaC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBE
RkdFcG9jaC5oOyBwYXRoID0gZGZnL0RGR0Vwb2NoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCTBGOEYxNDMxMUFERjA5MDEwMEVENzkyQyAvKiBERkdNb3ZIaW50UmVtb3ZhbFBoYXNl
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IERGR01vdkhpbnRSZW1v
dmFsUGhhc2UuY3BwOyBwYXRoID0gZGZnL0RGR01vdkhpbnRSZW1vdmFsUGhhc2UuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNDk3Miw2ICs0OTc2LDggQEAKIAkJCQkwRjJCOUNE
OTE5RDBCQTdEMDBCMUQxQjUgLyogREZHSW5zZXJ0T1NSSGludHNGb3JVcGRhdGUuaCAqLywKIAkJ
CQkwRjMwMEI3OTE4QUIxQjE0MDBBNkQ3MkUgLyogREZHSW50ZWdlckNoZWNrQ29tYmluaW5nUGhh
c2UuY3BwICovLAogCQkJCTBGMzAwQjdBMThBQjFCMTQwMEE2RDcyRSAvKiBERkdJbnRlZ2VyQ2hl
Y2tDb21iaW5pbmdQaGFzZS5oICovLAorCQkJCTBGODk4RjJGMUIyNzY4OUYwMDgzQTMzQyAvKiBE
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAgKi8sCisJCQkJMEY4OThGMzAxQjI3
Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmggKi8sCiAJ
CQkJMEZDOTdGMzcxODIwMjExOTAwMkM5QjI2IC8qIERGR0ludmFsaWRhdGlvblBvaW50SW5qZWN0
aW9uUGhhc2UuY3BwICovLAogCQkJCTBGQzk3RjM4MTgyMDIxMTkwMDJDOUIyNiAvKiBERkdJbnZh
bGlkYXRpb25Qb2ludEluamVjdGlvblBoYXNlLmggKi8sCiAJCQkJMEZFQTBBMkYxNzBENDBCRjAw
QkI3MjJDIC8qIERGR0pJVENvZGUuY3BwICovLApAQCAtNTYwOSw2ICs1NjE1LDcgQEAKIAkJCQkw
RjZCMUNDQTE4NjQxREY4MDA4NDVEOTcgLyogQXJpdHlDaGVja0ZhaWxSZXR1cm5UaHVua3MuaCBp
biBIZWFkZXJzICovLAogCQkJCTBGNkIxQ0I5MTg2MTI0NEMwMDg0NUQ5NyAvKiBBcml0eUNoZWNr
TW9kZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTFBMDA5QzExODMxQTI2RTAwQ0Y4NzExIC8qIEFS
TTY0QXNzZW1ibGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkwRjg5OEYzMjFCMjc2ODlGMDA4M0Ez
M0MgLyogREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCBpbiBIZWFkZXJzICovLAog
CQkJCTg2RDNCMkM0MTAxNTZCREUwMDI4NjVFNyAvKiBBUk1Bc3NlbWJsZXIuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTBGRTA1MDI4MUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1bWVudHMuaCBp
biBIZWFkZXJzICovLAogCQkJCTUyQzA2MTFGMUFBNTFFMUMwMEI0QURCQSAvKiBSdW50aW1lVHlw
ZS5oIGluIEhlYWRlcnMgKi8sCkBAIC03MzQzLDYgKzczNTAsNyBAQAogCQkJCTBGMkI2NkU4MTdC
NkI1QUIwMEE3QUUzRiAvKiBKU0FycmF5QnVmZmVyVmlldy5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQlBN0JEQUVDQTE3RjRFQTE0MDBGNjE0MEMgLyogSlNBcnJheUl0ZXJhdG9yLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTE0MjEzNTlCMEE2NzdGNEYwMEE4MTk1RSAvKiBKU0Jhc2UuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJMEY4OThGMzExQjI3Njg5RjAwODNBMzNDIC8qIERGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RkE5RTkxMTQyQkJC
MkUwMDE3NzNCNyAvKiBKU0JvdW5kRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0
MEY4QUYwQTUwOEQyMDAwMDVGMDYxIC8qIEpTQ2FsbGJhY2tDb25zdHJ1Y3Rvci5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQkxNDQwRjg5MjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxsYmFja0Z1bmN0
aW9uLmNwcCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZS5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5n
ZU9wdGltaXphdGlvblBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEzNDAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkRGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgi
CisKKyNpZiBFTkFCTEUoREZHX0pJVCkKKworI2luY2x1ZGUgIkRGR0Jsb2NrTWFwSW5saW5lcy5o
IgorI2luY2x1ZGUgIkRGR0dyYXBoLmgiCisjaW5jbHVkZSAiREZHSW5zZXJ0aW9uU2V0LmgiCisj
aW5jbHVkZSAiREZHUGhhc2UuaCIKKyNpbmNsdWRlICJERkdQcmVkaWN0aW9uUHJvcGFnYXRpb25Q
aGFzZS5oIgorI2luY2x1ZGUgIkRGR1ZhcmlhYmxlQWNjZXNzRGF0YUR1bXAuaCIKKyNpbmNsdWRl
ICJKU0NJbmxpbmVzLmgiCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworbmFt
ZXNwYWNlIHsKKworY29uc3QgYm9vbCB2ZXJib3NlID0gZmFsc2U7CisKK2ludDY0X3QgY2xhbXBl
ZFN1bUltcGwoKSB7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+Citp
bnQ2NF90IGNsYW1wZWRTdW1JbXBsKGludCBsZWZ0LCBBcmdzLi4uIGFyZ3MpCit7CisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGxlZnQpICsgY2xhbXBlZFN1bUltcGwoYXJncy4uLik7
Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CitpbnQgY2xhbXBlZFN1bShBcmdzLi4u
IGFyZ3MpCit7CisgICAgaW50NjRfdCByZXN1bHQgPSBjbGFtcGVkU3VtSW1wbChhcmdzLi4uKTsK
KyAgICByZXR1cm4gc3RkOjptaW4oCisgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6
bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpLAorICAgICAgICBzdGQ6Om1heCgKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkp
LAorICAgICAgICAgICAgcmVzdWx0KSk7Cit9CisKK2NsYXNzIFJlbGF0aW9uc2hpcCB7CitwdWJs
aWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgTGVzc1RoYW4sCisgICAgICAgIEVxdWFsLAor
ICAgICAgICBOb3RFcXVhbCwKKyAgICAgICAgR3JlYXRlclRoYW4KKyAgICB9OworICAgIAorICAg
IHN0YXRpYyBLaW5kIGZsaXBwZWQoS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChr
aW5kKSB7CisgICAgICAgIGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICByZXR1cm4gR3JlYXRl
clRoYW47CisgICAgICAgIGNhc2UgRXF1YWw6CisgICAgICAgICAgICByZXR1cm4gRXF1YWw7Cisg
ICAgICAgIGNhc2UgTm90RXF1YWw6CisgICAgICAgICAgICByZXR1cm4gTm90RXF1YWw7CisgICAg
ICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICByZXR1cm4gTGVzc1RoYW47CisgICAg
ICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0
dXJuIGtpbmQ7CisgICAgfQorICAgIAorICAgIFJlbGF0aW9uc2hpcCgpCisgICAgICAgIDogbV9s
ZWZ0KG51bGxwdHIpCisgICAgICAgICwgbV9yaWdodChudWxscHRyKQorICAgICAgICAsIG1fa2lu
ZChFcXVhbCkKKyAgICAgICAgLCBtX29mZnNldCgwKQorICAgIHsKKyAgICB9CisgICAgCisgICAg
UmVsYXRpb25zaGlwKE5vZGUqIGxlZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZz
ZXQgPSAwKQorICAgICAgICA6IG1fbGVmdChsZWZ0KQorICAgICAgICAsIG1fcmlnaHQocmlnaHQp
CisgICAgICAgICwgbV9raW5kKGtpbmQpCisgICAgICAgICwgbV9vZmZzZXQob2Zmc2V0KQorICAg
IHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQobV9sZWZ0KTsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQobV9yaWdodCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKG1fbGVmdCAhPSBtX3JpZ2h0KTsK
KyAgICB9CisgICAgCisgICAgc3RhdGljIFJlbGF0aW9uc2hpcCBzYWZlQ3JlYXRlKE5vZGUqIGxl
ZnQsIE5vZGUqIHJpZ2h0LCBLaW5kIGtpbmQsIGludCBvZmZzZXQgPSAwKQorICAgIHsKKyAgICAg
ICAgaWYgKCFsZWZ0IHx8ICFyaWdodCB8fCBsZWZ0ID09IHJpZ2h0KQorICAgICAgICAgICAgcmV0
dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKGxlZnQsIHJp
Z2h0LCBraW5kLCBvZmZzZXQpOworICAgIH0KKyAgICAKKyAgICB0eXBlZGVmIHZvaWQqIChSZWxh
dGlvbnNoaXA6OipVbnNwZWNpZmllZEJvb2xUeXBlKTsKKworICAgIG9wZXJhdG9yIFVuc3BlY2lm
aWVkQm9vbFR5cGUqKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2xlZnQgPyByZWlu
dGVycHJldF9jYXN0PFVuc3BlY2lmaWVkQm9vbFR5cGUqPigxKSA6IDA7CisgICAgfQorICAgIAor
ICAgIE5vZGUqIGxlZnQoKSBjb25zdCB7IHJldHVybiBtX2xlZnQ7IH0KKyAgICBOb2RlKiByaWdo
dCgpIGNvbnN0IHsgcmV0dXJuIG1fcmlnaHQ7IH0KKyAgICBLaW5kIGtpbmQoKSBjb25zdCB7IHJl
dHVybiBtX2tpbmQ7IH0KKyAgICBpbnQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXQ7
IH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgZmxpcHBlZCgpIGNvbnN0CisgICAgeworICAgICAg
ICBpZiAoISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAg
ICAKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgcmV0dXJuIFJlbGF0aW9uc2hpcCgpIGlmIC1tX29m
ZnNldCBvdmVyZmxvd3MuIEZvciBleGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAgICAg
QGEgPiBAYiAtIDIqKjMxCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHdlIGZsaXAgaXQgd2Ug
Z2V0OgorICAgICAgICAvLworICAgICAgICAvLyAgICAgQGIgPCBAYSArIDIqKjMxCisgICAgICAg
IC8vCisgICAgICAgIC8vIEV4Y2VwdCB0aGF0IHRoZSBzaWduIGdldHMgZmxpcHBlZCBzaW5jZSBp
dCdzIElOVF9NSU46CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYiA8IEBhIC0gMioqMzEK
KyAgICAgICAgLy8KKyAgICAgICAgLy8gQW5kIHRoYXQgbWFrZXMgbm8gc2Vuc2UuIFRvIHNlZSBo
b3cgbGl0dGxlIHNlbnNlIGl0IG1ha2VzLCBjb25zaWRlcjoKKyAgICAgICAgLy8KKyAgICAgICAg
Ly8gICAgIEBhID4gQHplcm8gLSAyKiozMQorICAgICAgICAvLworICAgICAgICAvLyBXZSB3b3Vs
ZCBmbGlwIGl0IHRvIG1lYW46CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAemVybyA8IEBh
IC0gMioqMzEKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hpY2ggaXMgYWJzdXJkLgorICAgICAg
ICAKKyAgICAgICAgaWYgKG1fb2Zmc2V0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWlu
KCkpCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gUmVsYXRpb25zaGlwKG1fcmlnaHQsIG1fbGVmdCwgZmxpcHBlZChtX2tpbmQpLCAt
bV9vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBSZWxhdGlvbnNoaXAgaW52ZXJzZSgpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAoISp0aGlzKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOwor
ICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBFcXVhbDoK
KyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBtX3JpZ2h0LCBOb3RFcXVh
bCwgbV9vZmZzZXQpOworICAgICAgICBjYXNlIE5vdEVxdWFsOgorICAgICAgICAgICAgcmV0dXJu
IFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVxdWFsLCBtX29mZnNldCk7CisgICAgICAg
IGNhc2UgTGVzc1RoYW46CisgICAgICAgICAgICBpZiAoc3VtT3ZlcmZsb3dzPGludD4obV9vZmZz
ZXQsIC0xKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAg
ICAgICByZXR1cm4gUmVsYXRpb25zaGlwKG1fbGVmdCwgbV9yaWdodCwgR3JlYXRlclRoYW4sIG1f
b2Zmc2V0IC0gMSk7CisgICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBpZiAo
c3VtT3ZlcmZsb3dzPGludD4obV9vZmZzZXQsIDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAobV9sZWZ0LCBt
X3JpZ2h0LCBMZXNzVGhhbiwgbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgCisgICAgYm9v
bCBpc0Nhbm9uaWNhbCgpIGNvbnN0IHsgcmV0dXJuIG1fbGVmdCA8IG1fcmlnaHQ7IH0KKyAgICAK
KyAgICBSZWxhdGlvbnNoaXAgY2Fub25pY2FsKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChp
c0Nhbm9uaWNhbCgpKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICByZXR1cm4g
ZmxpcHBlZCgpOworICAgIH0KKyAgICAKKyAgICBib29sIHNhbWVOb2Rlc0FzKGNvbnN0IFJlbGF0
aW9uc2hpcCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9sZWZ0ID09IG90
aGVyLm1fbGVmdAorICAgICAgICAgICAgJiYgbV9yaWdodCA9PSBvdGhlci5tX3JpZ2h0OworICAg
IH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVsYXRpb25zaGlwJiBvdGhlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzYW1lTm9kZXNBcyhvdGhlcikKKyAgICAgICAg
ICAgICYmIG1fa2luZCA9PSBvdGhlci5tX2tpbmQKKyAgICAgICAgICAgICYmIG1fb2Zmc2V0ID09
IG90aGVyLm1fb2Zmc2V0OworICAgIH0KKyAgICAKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3Qg
UmVsYXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhKCp0aGlz
ID09IG90aGVyKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmVsYXRp
b25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgIT0gb3RoZXIu
bV9sZWZ0KQorICAgICAgICAgICAgcmV0dXJuIG1fbGVmdCA8IG90aGVyLm1fbGVmdDsKKyAgICAg
ICAgaWYgKG1fcmlnaHQgIT0gb3RoZXIubV9yaWdodCkKKyAgICAgICAgICAgIHJldHVybiBtX3Jp
Z2h0IDwgb3RoZXIubV9yaWdodDsKKyAgICAgICAgaWYgKG1fa2luZCAhPSBvdGhlci5tX2tpbmQp
CisgICAgICAgICAgICByZXR1cm4gbV9raW5kIDwgb3RoZXIubV9raW5kOworICAgICAgICByZXR1
cm4gbV9vZmZzZXQgPCBvdGhlci5tX29mZnNldDsKKyAgICB9CisgICAgCisgICAgLy8gSWYgcG9z
c2libGUsIHJldHVybnMgYSBmb3JtIG9mIHRoaXMgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSBnaXZl
biBub2RlIGlzIHRoZSBsZWZ0CisgICAgLy8gc2lkZS4gUmV0dXJucyBhIG51bGwgcmVsYXRpb25z
aGlwIGlmIHRoaXMgcmVsYXRpb25zaGlwIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgdGhpcwor
ICAgIC8vIG5vZGUuCisgICAgUmVsYXRpb25zaGlwIGZvck5vZGUoTm9kZSogbm9kZSkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChtX2xlZnQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgaWYgKG1fcmlnaHQgPT0gbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBm
bGlwcGVkKCk7CisgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICB9CisgICAgCisg
ICAgdm9pZCBzZXRMZWZ0KE5vZGUqIGxlZnQpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VChsZWZ0ICE9IG1fcmlnaHQpOworICAgICAgICBtX2xlZnQgPSBsZWZ0OworICAgIH0KKyAgICBi
b29sIGFkZFRvT2Zmc2V0KGludCBvZmZzZXQpCisgICAgeworICAgICAgICBpZiAoc3VtT3ZlcmZs
b3dzPGludD4obV9vZmZzZXQsIG9mZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIG1fb2Zmc2V0ICs9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgLy8gQXR0ZW1wdHMgdG8gY3JlYXRlIGEgcmVsYXRpb25zaGlwIHRoYXQgc3VtbWFyaXpl
cyB0aGUgdW5pb24gb2YgdGhpcyByZWxhdGlvbnNoaXAgYW5kCisgICAgLy8gdGhlIG90aGVyIHJl
bGF0aW9uc2hpcC4gVGhlIG51bGwgcmVsYXRpb25zaGlwIGlzIHJldHVybmVkIHRvIGluZGljYXRl
IFRPUC4gVGhpcyBpcyB1c2VkCisgICAgLy8gZm9yIG1lcmdpbmcgdGhlIGN1cnJlbnQgcmVsYXRp
b25zaGlwLWF0LWhlYWQgZm9yIHNvbWUgcGFpciBvZiBub2RlcyBhbmQgYSBuZXcKKyAgICAvLyBy
ZWxhdGlvbnNoaXAtYXQtaGVhZCBiZWluZyBwcm9wb3NlZCBieSBhIHByZWRlY2Vzc29yLiBXZSB3
aXNoIHRvIGNyZWF0ZSBhIG5ldworICAgIC8vIHJlbGF0aW9uc2hpcCB0aGF0IGlzIHRydWUgd2hl
bmV2ZXIgZWl0aGVyIG9mIHRoZW0gYXJlIHRydWUsIHdoaWNoIGVuc3VyaW5nIHRoYXQgd2UgZG9u
J3QKKyAgICAvLyBkbyB0aGlzIGZvcmV2ZXIuIEFueXRpbWUgd2UgY3JlYXRlIGEgcmVsYXRpb25z
aGlwIHRoYXQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciBvZiB0aGUKKyAgICAvLyBwcmV2aW91cyBv
bmVzLCB3ZSB3aWxsIGNhdXNlIHRoZSBhbmFseXNpcyBmaXhwb2ludCB0byByZWV4ZWN1dGUuCisg
ICAgLy8KKyAgICAvLyBJZiAqdGhpcyBhbmQgb3RoZXIgYXJlIGlkZW50aWNhbCwgd2UganVzdCBy
ZXR1cm4gaXQuCisgICAgLy8KKyAgICAvLyBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHdlIHBpY2sg
ZnJvbSBhIGZpbml0ZSBzZXQgb2YgImdlbmVyYWwiIHJlbGF0aW9uc2hpcHM6CisgICAgLy8KKyAg
ICAvLyBFcTogdGhpcyA9PSBvdGhlciArIEMsIHdoZXJlIEMgaXMgLTEsIDAsIG9yIDEuCisgICAg
Ly8gTHQ6IHRoaXMgPCBvdGhlciArIEMsIHdoZXJlIEMgaXMgLTEsIDAsIG9yIDEuCisgICAgLy8g
R3Q6IHRoaXMgPiBvdGhlciArIEMsIHdoZXJlIEMgaXMgLTEsIDAsIG9yIDEuCisgICAgLy8gTmU6
IHRoaXMgIT0gb3RoZXIgKyBDLCB3aGVyZSBDIGlzIC0xLCAwLCBvciAxLgorICAgIC8vIFRPUDog
dGhlIG51bGwgcmVsYXRpb25zaGlwLgorICAgIC8vCisgICAgLy8gQ29uc3RyYWluaW5nIEMgdG8g
LTEsMCwxIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgc2V0IG9mIGdlbmVyYWwgcmVs
YXRpb25zaGlwcyBpcworICAgIC8vIGZpbml0ZS4gVGhpcyBmaW5pdGUgc2V0IG9mIHJlbGF0aW9u
c2hpcHMgZm9ybXMgYSBwcmV0dHkgc2ltcGxlIGxhdHRpY2Ugd2hlcmUgYQorICAgIC8vIHJlbEEt
PnJlbEIgbWVhbnMgInJlbEIgaXMgbW9yZSBnZW5lcmFsIHRoYW4gcmVsQSIuIEZvciBleGFtcGxl
LCB0aGlzPG90aGVyKzEgaXMgbW9yZQorICAgIC8vIGdlbmVyYWwgdGhhbiB0aGlzPT1vdGhlci4g
SSdsbCBsZWF2ZSBpdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlciB0byBzZWUgdGhhdCBh
CisgICAgLy8gZ3JhcGggYmV0d2VlbiB0aGUgMTMgZ2VuZXJhbCByZWxhdGlvbnNoaXBzIGlzIGlu
ZGVlZCBhIGxhdHRpY2UuIFRoZSBmYWN0IHRoYXQgdGhlIHNldCBvZgorICAgIC8vIGdlbmVyYWwg
cmVsYXRpb25zaGlwcyBpcyBhIGZpbml0ZSBsYXR0aWNlIGVuc3VyZXMgbW9ub3RvbmljaXR5IG9m
IHRoZSBmaXhwb2ludCwgc2luY2UKKyAgICAvLyBhbnkgbWVyZ2Ugb3ZlciBub3QtaWRlbnRpY2Fs
IHJlbGF0aW9uc2hpcHMgcmV0dXJucyBhIHJlbGF0aW9uc2hpcCB0aGF0IGlzIGNsb3NlciB0byB0
aGUKKyAgICAvLyBUT1AgcmVsYXRpb25zaGlwIHRoYW4gZWl0aGVyIG9mIHRoZSBvcmlnaW5hbCBy
ZWxhdGlvbnNoaXBzLiBIZXJlJ3MgaG93IGNvbnZlcmdlbmNlIGlzCisgICAgLy8gYWNoaWV2ZWQg
Zm9yIGFueSBwYWlyIG9mIHJlbGF0aW9uc2hpcHMgb3ZlciB0aGUgc2FtZSBub2RlczoKKyAgICAv
LworICAgIC8vIC0gSWYgdGhleSBhcmUgaWRlbnRpY2FsLCB0aGVuIHJldHVybmluZyAqdGhpcyBt
ZWFucyB0aGF0IHdlIHdvbid0IGJlIHJlc3BvbnNpYmxlIGZvcgorICAgIC8vICAgY2F1c2luZyBh
bm90aGVyIGZpeHBvaW50IGl0ZXJhdGlvbi4gT25jZSBhbGwgbWVyZ2VzIHJlYWNoIHRoaXMgcG9p
bnQsIHdlJ3JlIGRvbmUuCisgICAgLy8KKyAgICAvLyAtIElmIHRoZXkgYXJlIGRpZmZlcmVudCwg
dGhlbiB3ZSBwaWNrIHRoZSBtb3N0IGNvbnN0cmFpbmluZyBvZiB0aGUgMTMgZ2VuZXJhbAorICAg
IC8vICAgcmVsYXRpb25zaGlwcyB0aGF0IGlzIHRydWUgaWYgZWl0aGVyICp0aGlzIG9yIG90aGVy
IGFyZSB0cnVlLiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlCisgICAgLy8gICByZWxhdGlvbnNoaXBz
IGFyZSBub3QgaWRlbnRpY2FsLCB0aGUgbWVyZ2VkIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNsb3Nl
ciB0byBUT1AgdGhhbgorICAgIC8vICAgZWl0aGVyIG9mIHRoZSBvcmlnaW5hbHMuIFJldHVybmlu
ZyBhIGRpZmZlcmVudCByZWxhdGlvbnNoaXAgbWVhbnMgdGhhdCB3ZSB3aWxsIGJlCisgICAgLy8g
ICByZXNwb25zaWJsZSBmb3IgdGhlIGZpeHBvaW50IHRvIHJlbG9vcCwgYnV0IHdlIGNhbiBvbmx5
IGRvIHRoaXMgYXQgbW9zdCAxMyB0aW1lcyBzaW5jZQorICAgIC8vICAgdGhhdCdzIGhvdyAiZGVl
cCIgdGhlIGdlbmVyYWwgcmVsYXRpb25zaGlwIGxhdHRpY2UgaXMuCisgICAgLy8KKyAgICAvLyBO
b3RlIHRoYXQgQyBiZWluZyBjb25zdHJhaW5lZCB0byAtMSwwLDEgYWxzbyBlbnN1cmVzIHRoYXQg
d2UgbmV2ZXIgaGF2ZSB0byByZXR1cm4gYQorICAgIC8vIGNvbWJpbmF0aW9uIG9mIEx0IGFuZCBH
dCwgYXMgaW4gZm9yIGV4YW1wbGUgdGhpczxvdGhlcitDICYmIHRoaXM+b3RoZXItRC4gVGhhdCdz
IHdoeQorICAgIC8vIHRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiB6ZXJvIG9yIG9uZSByZWxhdGlv
bnNoaXBzIHJhdGhlciB0aGFuIGEgbGlzdCBvZiByZWxhdGlvbnNoaXBzLgorICAgIC8vIFRoZSBv
bmx5IHBvc3NpYmxlIHZhbHVlcyBvZiBDIGFuZCBEIHdoZXJlIHRoaXMgd291bGQgd29yayBhcmUg
LTEgYW5kIDEsIGJ1dCBpbiB0aGF0IGNhc2UKKyAgICAvLyB3ZSBqdXN0IHNheSB0aGlzPT1vdGhl
ci4gVGhhdCBzYWlkLCB0aGUgbG9naWMgZm9yIG1lcmdpbmcgdHdvID09IHJlbGF0aW9uc2hpcHMs
IGxpa2UKKyAgICAvLyB0aGlzPT1vdGhlcitDIHx8IHRoaXM9PW90aGVyK0QgaXMgdG8gYXR0ZW1w
dCB0byBjcmVhdGUgdGhlc2UgdHdvIHJlbGF0aW9uc2hpcHM6CisgICAgLy8gdGhpcz5vdGhlcitt
aW4oQyxEKS0xICYmIHRoaXM8b3RoZXIrbWF4KEMsRCkrMS4gQnV0IG9ubHkgb25lIG9mIHRoZXNl
IHJlbGF0aW9uc2hpcHMgd2lsbAorICAgIC8vIGJlbG9uZyB0byB0aGUgc2V0IG9mIGdlbmVyYWwg
cmVsYXRpb25zaGlwcy4KKyAgICAvLworICAgIC8vIEhlcmUncyBhbiBleGFtcGxlIG9mIHRoaXMg
aW4gYWN0aW9uOgorICAgIC8vCisgICAgLy8gZm9yICh2YXIgaSA9IGE7IDsgKytpKSB7IH0KKyAg
ICAvLworICAgIC8vIFdpdGhvdXQgQyBiZWluZyBjb25zdHJhaW5lZCB0byAtMSwwLDEsIHdlIGNv
dWxkIGVuZCB1cCBsb29waW5nIGZvcmV2ZXI6IGZpcnN0IHdlJ2Qgc2F5CisgICAgLy8gdGhhdCBp
PT1hLCB0aGVuIHdlIG1pZ2h0IHNheSB0aGF0IGk8YSsyLCB0aGVuIGk8YSszLCB0aGVuIGk8YSs0
LCBldGMuIFdlIHdvbid0IGRvIHRoaXMKKyAgICAvLyBiZWNhdXNlIGk8YSsyIGlzIG5vdCBhIHZh
bGlkIGdlbmVyYWwgcmVsYXRpb25zaGlwOiBzbyB3aGVuIHdlIG1lcmdlIGk9PWEgZnJvbSB0aGUg
Zmlyc3QKKyAgICAvLyBpdGVyYXRpb24gYW5kIGk9PWErMSBmcm9tIHRoZSBzZWNvbmQgaXRlcmF0
aW9uLCB3ZSBjcmVhdGUgaT5hLTEgYW5kIGk8YSsyIGJ1dCB0aGVuCisgICAgLy8gcmVhbGl6ZSB0
aGF0IG9ubHkgaT5hLTEgaXMgYSB2YWxpZCBnZW5lcmFsIHJlbGF0aW9uc2hpcC4gVGhpcyBnaXZl
cyB1cyBleGFjdGx5IHdoYXQgd2UKKyAgICAvLyB3YW50OiBhIHN0YXRlbWVudCB0aGF0IGk+PWEu
CisgICAgUmVsYXRpb25zaGlwIG1lcmdlKGNvbnN0IFJlbGF0aW9uc2hpcCYgb3RoZXIpIGNvbnN0
CisgICAgeworICAgICAgICBpZiAoIXNhbWVOb2Rlc0FzKG90aGVyKSkKKyAgICAgICAgICAgIHJl
dHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgCisgICAgICAgIC8vIEhhbmRsZSB0aGUgc3Vw
ZXIgb2J2aW91cyBjYXNlIGZpcnN0LgorICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpCisgICAg
ICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIAorICAgICAgICAvLyBUaGlzIGRvZXMgc29t
ZSBpbnRlcmVzdGluZyBwZXJtdXRhdGlvbnMgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZHVwbGlj
YXRlIGNvZGUuIEZvcgorICAgICAgICAvLyBleGFtcGxlOgorICAgICAgICAvLworICAgICAgICAv
LyBpbml0aWFsbHk6IEBhICE9IEBiLCBAYSA+IEBiCisgICAgICAgIC8vICAgICAgICAgICAgQGIg
IT0gQGEsIEBiIDwgQGEKKyAgICAgICAgLy8gICAgICAgICAgICBAYiA8IEBhLCBAYiAhPSBAYQor
ICAgICAgICAvLyAgIGZpbmFsbHk6IEBiICE9IGEsIEBiIDwgQGEKKyAgICAgICAgLy8KKyAgICAg
ICAgLy8gQW5vdGhlciBleGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyBpbml0aWFsbHk6
IEBhIDwgQGIsIEBhICE9IEBiCisgICAgICAgIC8vICAgZmluYWxseTogQGEgIT0gQGIsIEBhIDwg
QGIKKworICAgICAgICBSZWxhdGlvbnNoaXAgYSA9ICp0aGlzOworICAgICAgICBSZWxhdGlvbnNo
aXAgYiA9IG90aGVyOworICAgICAgICBib29sIG5lZWRGbGlwID0gZmFsc2U7CisgICAgICAgIAor
ICAgICAgICAvLyBHZXQgcmlkIG9mIEdyZWF0ZXJUaGFuLgorICAgICAgICBpZiAoYS5tX2tpbmQg
PT0gR3JlYXRlclRoYW4gfHwgYi5tX2tpbmQgPT0gR3JlYXRlclRoYW4pIHsKKyAgICAgICAgICAg
IGEgPSBhLmZsaXBwZWQoKTsKKyAgICAgICAgICAgIGIgPSBiLmZsaXBwZWQoKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgLy8gSW4gcmFyZSBjYXNlcywgd2UgbWlnaHQgbm90IGJlIGFibGUg
dG8gZmxpcC4gSnVzdCBnaXZlIHVwIG9uIGxpZmUgaW4gdGhvc2UKKyAgICAgICAgICAgIC8vIGNh
c2VzLgorICAgICAgICAgICAgaWYgKCFhIHx8ICFiKQorICAgICAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbmVlZEZsaXAgPSB0cnVl
OworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIEdyZWF0ZXJU
aGFuLCB0aGVuIGl0IG1lYW5zIHRoYXQgd2Ugc3RhcnRlZCB3aXRoIEBhIDwgQGIgYW5kCisgICAg
ICAgICAgICAvLyBAYSA+IEBiLiBUaGF0J3MgcHJldHR5IG11Y2ggYWx3YXlzIGEgdGF1dG9sb2d5
OyB3ZSBkb24ndCBhdHRlbXB0IHRvIGRvIHNtYXJ0CisgICAgICAgICAgICAvLyB0aGluZ3MgZm9y
IHRoYXQgY2FzZSBmb3Igbm93LgorICAgICAgICAgICAgaWYgKGEubV9raW5kID09IEdyZWF0ZXJU
aGFuIHx8IGIubV9raW5kID09IEdyZWF0ZXJUaGFuKQorICAgICAgICAgICAgICAgIHJldHVybiBS
ZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJl
IHRoYXQgaWYgd2UgaGF2ZSBhIExlc3NUaGFuLCB0aGVuIGl0J3MgZmlyc3QuCisgICAgICAgIGlm
IChiLm1fa2luZCA9PSBMZXNzVGhhbikKKyAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYSBOb3RFcXVhbCwg
dGhlbiBpdCdzIGZpcnN0LgorICAgICAgICBpZiAoYi5tX2tpbmQgPT0gTm90RXF1YWwpCisgICAg
ICAgICAgICBzdGQ6OnN3YXAoYSwgYik7CisgICAgICAgIAorICAgICAgICBSZWxhdGlvbnNoaXAg
cmVzdWx0ID0gYS5tZXJnZUltcGwoYik7CisgICAgICAgIAorICAgICAgICBpZiAobmVlZEZsaXAp
CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmZsaXBwZWQoKTsKKyAgICAgICAgCisgICAgICAg
IHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIC8vIEF0dGVtcHRzIHRvIGNvbnN0cnVj
dCBvbmUgUmVsYXRpb25zaGlwIHRoYXQgYWRlcXVhdGVseSBzdW1tYXJpemVzIHRoZSBpbnRlcnNl
Y3Rpb24gb2YKKyAgICAvLyB0aGlzIGFuZCBvdGhlci4gUmV0dXJucyBhIG51bGwgcmVsYXRpb25z
aGlwIGlmIHRoZSBmaWx0cmF0aW9uIHNob3VsZCBiZSBleHByZXNzZWQgYXMgdHdvCisgICAgLy8g
ZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMuIFJldHVybmluZyBudWxsIGlzIGFsd2F5cyBzYWZlIGJl
Y2F1c2UgcmVsYXRpb25zaGlwIGxpc3RzIGluCisgICAgLy8gdGhpcyBwaGFzZSBhbHdheXMgaW1w
bHkgaW50ZXJzZWN0aW9uLiBTbywgeW91IGNvdWxkIHNvdW5kbHkgc2tpcCBjYWxsaW5nIHRoaXMg
bWV0aG9kIGFuZAorICAgIC8vIGp1c3QgcHV0IGJvdGggcmVsYXRpb25zaGlwcyBpbnRvIHRoZSBs
aXN0LiBCdXQsIHRoYXQgY291bGQgbGVhZCB0aGUgZml4cG9pbnQgdG8gZGl2ZXJnZS4KKyAgICAv
LyBIZW5jZSB0aGlzIHdpbGwgYXR0ZW1wdCB0byBjb21iaW5lIHRoZSB0d28gcmVsYXRpb25zaGlw
cyBpbnRvIG9uZSBhcyBhIGNvbnZlcmdlbmNlIGhhY2suCisgICAgLy8gSW4gc29tZSBjYXNlcywg
aXQgd2lsbCBkbyBzb21ldGhpbmcgY29uc2VydmF0aXZlLiBJdCdzIGFsd2F5cyBzYWZlIGZvciB0
aGlzIHRvIHJldHVybgorICAgIC8vICp0aGlzLCBvciB0byByZXR1cm4gb3RoZXIuIEl0J2xsIGRv
IHRoYXQgc29tZXRpbWVzLCBtYWlubHkgdG8gYWNjZWxlcmF0ZSBjb252ZXJnZW5jZSBmb3IKKyAg
ICAvLyB0aGluZ3MgdGhhdCB3ZSBkb24ndCB0aGluayBhcmUgaW1wb3J0YW50IGVub3VnaCB0byBz
bG93IGRvd24gdGhlIGFuYWx5c2lzLgorICAgIFJlbGF0aW9uc2hpcCBmaWx0ZXIoY29uc3QgUmVs
YXRpb25zaGlwJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIC8vIFdlIGFyZSBvbmx5IGlu
dGVyZXN0ZWQgaW4gbWVyZ2luZyByZWxhdGlvbnNoaXBzIG92ZXIgdGhlIHNhbWUgbm9kZXMuCisg
ICAgICAgIEFTU0VSVChzYW1lTm9kZXNBcyhvdGhlcikpOworICAgICAgICAKKyAgICAgICAgaWYg
KCp0aGlzID09IG90aGVyKQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAKKyAg
ICAgICAgLy8gRnJvbSBoZXJlIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgdHdvIHJlbGF0aW9uc2hp
cHMgYXJlIG5vdCBpZGVudGljYWwuIFVzdWFsbHkgd2UgdXNlCisgICAgICAgIC8vIHRoaXMgdG8g
YXNzdW1lIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgb2Zmc2V0cyBhbnl0aW1lIHRoYXQgZXZlcnl0
aGluZyBidXQgdGhlIG9mZnNldAorICAgICAgICAvLyBpcyBpZGVudGljYWwuCisgICAgICAgIAor
ICAgICAgICAvLyBXZSB3YW50IGVxdWFsaXR5IHRvIHRha2UgcHJlY2VkZW50IG92ZXIgZXZlcnl0
aGluZyBlbHNlLCBhbmQgd2UgZG9uJ3Qgd2FudCBtdWx0aXBsZQorICAgICAgICAvLyBpbmRlcGVu
ZGVudCBjbGFpbXMgb2YgZXF1YWxpdHkuIFRoYXQgd291bGQganVzdCBiZSBhIGNvbnRyYWRpY3Rp
b24uIFdoZW4gaXQgZG9lcworICAgICAgICAvLyBoYXBwZW4sIHdlIHdpbGwgYmUgY29uc2VydmF0
aXZlIGluIHRoZSBzZW5zZSB0aGF0IHdlIHdpbGwgcGljayBvbmUuCisgICAgICAgIGlmIChtX2tp
bmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIGlmIChvdGhl
ci5tX2tpbmQgPT0gRXF1YWwpCisgICAgICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgICAgIAor
ICAgICAgICAvLyBVc2VmdWwgaGVscGVyIGZvciBmbGlwcGluZy4KKyAgICAgICAgYXV0byBmaWx0
ZXJGbGlwcGVkID0gWyZdICgpIC0+IFJlbGF0aW9uc2hpcCB7CisgICAgICAgICAgICAvLyBJZiB3
ZSBjYW5ub3QgZmxpcCwgdGhlbiBqdXN0IGNvbnNlcnZhdGl2ZWx5IHJldHVybiAqdGhpcy4KKyAg
ICAgICAgICAgIFJlbGF0aW9uc2hpcCBhID0gZmxpcHBlZCgpOworICAgICAgICAgICAgUmVsYXRp
b25zaGlwIGIgPSBvdGhlci5mbGlwcGVkKCk7CisgICAgICAgICAgICBpZiAoIWEgfHwgIWIpCisg
ICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgUmVsYXRpb25zaGlwIHJl
c3VsdCA9IGEuZmlsdGVyKGIpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0
LmZsaXBwZWQoKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgIHJl
dHVybiAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH07CisgICAg
ICAgIAorICAgICAgICBpZiAobV9raW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAgICBpZiAo
b3RoZXIubV9raW5kID09IE5vdEVxdWFsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgY291bGQg
ZG8gc29tZXRoaW5nIHNtYXJ0ZXIgaGVyZS4gV2UgY291bGQgZXZlbiBrZWVwIGJvdGggTm90RXF1
YWwncy4gV2UKKyAgICAgICAgICAgICAgICAvLyB3b3VsZCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0
IHdlIGNvcnJlY3RseSBjb2xsYXBzZWQgdGhlbSB3aGVuIG1lcmdpbmcuIEJ1dAorICAgICAgICAg
ICAgICAgIC8vIGZvciBub3csIHdlIGp1c3QgcGljayBvbmUgb2YgdGhlbSBhbmQgaG9wZSBmb3Ig
dGhlIGJlc3QuCisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFu
KSB7CisgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgTm90RXF1
YWwuZmlsdGVyKExlc3NUaGFuKS4gCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckZsaXBw
ZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKG90
aGVyLm1fa2luZCA9PSBMZXNzVGhhbik7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHR3byBjbGFp
bXM6CisgICAgICAgICAgICAvLyAgICAgQGEgIT0gQGIgKyBDCisgICAgICAgICAgICAvLyAgICAg
QGEgIDwgQGIgKyBECisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgQyA+PSBELCB0
aGVuIHRoZSBOb3RFcXVhbCBpcyByZWR1bmRhbnQuCisgICAgICAgICAgICAvLyBJZiBDIDwgRCAt
IDEsIHRoZW4gd2UgY291bGQga2VlcCBib3RoLCBidXQgZm9yIG5vdyB3ZSBqdXN0IGtlZXAgdGhl
IExlc3NUaGFuLgorICAgICAgICAgICAgLy8gSWYgQyA9PSBEIC0gMSwgdGhlbiB0aGUgTGVzc1Ro
YW4gY2FuIGJlIHR1cm5lZCBpbnRvOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAg
ICBAYSA8IEBiICsgQworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBD
ID09IHRoaXMubV9vZmZzZXQsIEQgPT0gb3RoZXIubV9vZmZzZXQuCisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGlmIChtX29mZnNldCA9PSBvdGhlci5tX29mZnNldCAtIDEpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBtX29m
ZnNldCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBOb3RFcXVhbCkKKyAgICAg
ICAgICAgIHJldHVybiBvdGhlci5maWx0ZXIoKnRoaXMpOworICAgICAgICAKKyAgICAgICAgaWYg
KG1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBM
ZXNzVGhhbikgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoCisgICAgICAg
ICAgICAgICAgICAgIG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWluKG1fb2Zmc2V0
LCBvdGhlci5tX29mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
ICAgICBBU1NFUlQob3RoZXIubV9raW5kID09IEdyZWF0ZXJUaGFuKTsKKyAgICAgICAgICAgIGlm
IChzdW1PdmVyZmxvd3M8aW50PihtX29mZnNldCwgLTEpKQorICAgICAgICAgICAgICAgIHJldHVy
biBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIGlmIChzdW1PdmVyZmxvd3M8aW50PihvdGhl
ci5tX29mZnNldCwgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcCgpOwor
ICAgICAgICAgICAgaWYgKG1fb2Zmc2V0IC0gMSA9PSBvdGhlci5tX29mZnNldCArIDEpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIEVxdWFsLCBt
X29mZnNldCAtIDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25z
aGlwKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFTU0VSVChtX2tpbmQgPT0gR3Jl
YXRlclRoYW4pOworICAgICAgICByZXR1cm4gZmlsdGVyRmxpcHBlZCgpOworICAgIH0KKyAgICAK
KyAgICBpbnQgbWluVmFsdWVPZkxlZnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fbGVm
dC0+aXNJbnQzMkNvbnN0YW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9sZWZ0LT5hc0ludDMy
KCk7CisgICAgICAgIAorICAgICAgICBpZiAobV9raW5kID09IExlc3NUaGFuIHx8IG1fa2luZCA9
PSBOb3RFcXVhbCkKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46
Om1pbigpOworICAgICAgICAKKyAgICAgICAgaW50IG1pblJpZ2h0VmFsdWUgPSBzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1pbigpOworICAgICAgICBpZiAobV9yaWdodC0+aXNJbnQzMkNvbnN0
YW50KCkpCisgICAgICAgICAgICBtaW5SaWdodFZhbHVlID0gbV9yaWdodC0+YXNJbnQzMigpOwor
ICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBHcmVhdGVyVGhhbikKKyAgICAgICAgICAg
IHJldHVybiBjbGFtcGVkU3VtKG1pblJpZ2h0VmFsdWUsIG1fb2Zmc2V0LCAxKTsKKyAgICAgICAg
QVNTRVJUKG1fa2luZCA9PSBFcXVhbCk7CisgICAgICAgIHJldHVybiBjbGFtcGVkU3VtKG1pblJp
Z2h0VmFsdWUsIG1fb2Zmc2V0KTsKKyAgICB9CisgICAgCisgICAgaW50IG1heFZhbHVlT2ZMZWZ0
KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2xlZnQtPmlzSW50MzJDb25zdGFudCgpKQor
ICAgICAgICAgICAgcmV0dXJuIG1fbGVmdC0+YXNJbnQzMigpOworICAgICAgICAKKyAgICAgICAg
aWYgKG1fa2luZCA9PSBHcmVhdGVyVGhhbiB8fCBtX2tpbmQgPT0gTm90RXF1YWwpCisgICAgICAg
ICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgICAgICAgCisg
ICAgICAgIGludCBtYXhSaWdodFZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgo
KTsKKyAgICAgICAgaWYgKG1fcmlnaHQtPmlzSW50MzJDb25zdGFudCgpKQorICAgICAgICAgICAg
bWF4UmlnaHRWYWx1ZSA9IG1fcmlnaHQtPmFzSW50MzIoKTsKKyAgICAgICAgCisgICAgICAgIGlm
IChtX2tpbmQgPT0gTGVzc1RoYW4pCisgICAgICAgICAgICByZXR1cm4gY2xhbXBlZFN1bShtYXhS
aWdodFZhbHVlLCBtX29mZnNldCwgLTEpOworICAgICAgICBBU1NFUlQobV9raW5kID09IEVxdWFs
KTsKKyAgICAgICAgcmV0dXJuIGNsYW1wZWRTdW0obWF4UmlnaHRWYWx1ZSwgbV9vZmZzZXQpOwor
ICAgIH0KKyAgICAKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICB7
CisgICAgICAgIC8vIFRoaXMgcHJpbnRzIG91dCB0aGUgcmVsYXRpb25zaGlwIHdpdGhvdXQgYW55
IHdoaXRlc3BhY2UsIGxpa2UgQHg8QHkrNDIuIFRoaXMKKyAgICAgICAgLy8gb3B0aW1pemVzIGZv
ciB0aGUgY2xhcml0eSBvZiBhIGxpc3Qgb2YgcmVsYXRpb25zaGlwcy4gSXQncyBlYXNpZXIgdG8g
cmVhZCBzb21ldGhpbmcKKyAgICAgICAgLy8gbGlrZSBbQDE8QDIrMywgQDQ9PUA1LTZdIHRoYW4g
aXQgd291bGQgYmUgaWYgdGhlcmUgd2FzIHdoaXRlc3BhY2UgaW5zaWRlIHRoZQorICAgICAgICAv
LyByZWxhdGlvbnNoaXBzLgorICAgICAgICAKKyAgICAgICAgaWYgKCEqdGhpcykgeworICAgICAg
ICAgICAgb3V0LnByaW50KCJudWxsIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIG91dC5wcmludChtX2xlZnQpOworICAgICAgICBzd2l0Y2ggKG1f
a2luZCkgeworICAgICAgICBjYXNlIExlc3NUaGFuOgorICAgICAgICAgICAgb3V0LnByaW50KCI8
Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFcXVhbDoKKyAgICAgICAgICAg
IG91dC5wcmludCgiPT0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5vdEVx
dWFsOgorICAgICAgICAgICAgb3V0LnByaW50KCIhPSIpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgR3JlYXRlclRoYW46CisgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludChtX3JpZ2h0KTsK
KyAgICAgICAgaWYgKG1fb2Zmc2V0ID4gMCkKKyAgICAgICAgICAgIG91dC5wcmludCgiKyIsIG1f
b2Zmc2V0KTsKKyAgICAgICAgZWxzZSBpZiAobV9vZmZzZXQgPCAwKQorICAgICAgICAgICAgb3V0
LnByaW50KCItIiwgLXN0YXRpY19jYXN0PGludDY0X3Q+KG1fb2Zmc2V0KSk7CisgICAgfQorICAg
IAorcHJpdmF0ZToKKyAgICBSZWxhdGlvbnNoaXAgbWVyZ2VJbXBsKGNvbnN0IFJlbGF0aW9uc2hp
cCYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoc2FtZU5vZGVzQXMob3RoZXIp
KTsKKyAgICAgICAgQVNTRVJUKG1fa2luZCAhPSBHcmVhdGVyVGhhbik7CisgICAgICAgIEFTU0VS
VChvdGhlci5tX2tpbmQgIT0gR3JlYXRlclRoYW4pOworICAgICAgICBBU1NFUlQoKnRoaXMgIT0g
b3RoZXIpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2Qg
aXMgdG8gZ3VhcmFudGVlIHRoYXQ6CisgICAgICAgIC8vCisgICAgICAgIC8vIC0gV2UgYXZvaWQg
aGF2aW5nIG1vcmUgdGhhbiBvbmUgUmVsYXRpb25zaGlwIG92ZXIgdGhlIHNhbWUgdHdvIG5vZGVz
LiBUaGVyZWZvcmUsIGlmCisgICAgICAgIC8vICAgdGhlIG1lcmdlIGNvdWxkIGJlIGV4cHJlc3Nl
ZCBhcyB0d28gUmVsYXRpb25zaGlwcywgd2UgcHJlZmVyIHRvIGluc3RlYWQgcGljayB0aGUKKyAg
ICAgICAgLy8gICBsZXNzIHByZWNpc2Ugc2luZ2xlIFJlbGF0aW9uc2hpcCBmb3JtIGV2ZW4gaWYg
dGhhdCBtZWFucyBUT1AuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gSWYgdGhlIGRpZmZlcmVu
Y2UgYmV0d2VlbiB0d28gUmVsYXRpb25zaGlwcyBpcyBqdXN0IHRoZSBtX29mZnNldCwgdGhlbiB3
ZSBjcmVhdGUgYQorICAgICAgICAvLyAgIFJlbGF0aW9uc2hpcCB0aGF0IGhhcyBhbiBvZmZzZXQg
b2YgLTEsIDAsIG9yIDEuIFRoaXMgaXMgYW4gZXNzZW50aWFsIGNvbnZlcmdlbmNlCisgICAgICAg
IC8vICAgaGFjay4gV2UgbmVlZCAtMSBhbmQgMSB0byBzdXBwb3J0IDw9IGFuZCA+PS4KKyAgICAg
ICAgCisgICAgICAgIC8vIEZyb20gaGVyZSB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHR3byByZWxh
dGlvbnNoaXBzIGFyZSBub3QgaWRlbnRpY2FsLiBVc3VhbGx5IHdlIHVzZQorICAgICAgICAvLyB0
aGlzIHRvIGFzc3VtZSB0aGF0IHdlIGhhdmUgZGlmZmVyZW50IG9mZnNldHMgYW55dGltZSB0aGF0
IGV2ZXJ5dGhpbmcgYnV0IHRoZSBvZmZzZXQKKyAgICAgICAgLy8gaXMgaWRlbnRpY2FsLgorICAg
ICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBOb3RFcXVhbCkgeworICAgICAgICAgICAgaWYg
KG90aGVyLm1fa2luZCA9PSBOb3RFcXVhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRp
b25zaGlwKCk7IC8vIERpZmZlcmVudCBvZmZzZXRzLCBzbyB0YXV0b2xvZ3kuCisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmIChvdGhlci5tX2tpbmQgPT0gRXF1YWwpIHsKKyAgICAgICAgICAg
ICAgICBpZiAobV9vZmZzZXQgIT0gb3RoZXIubV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAg
ICAgLy8gU2F5aW5nIHRoYXQgeW91IG1pZ2h0IGJlIEIgd2hlbiB5b3UndmUgYWxyZWFkeSBzYWlk
IHRoYXQgeW91J3JlIGFueXRoaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBBLCB3aGVy
ZSBBIGFuZCBCIGFyZSBkaWZmZXJlbnQsIGlzIGEgdGF1dG9sb2d5LiBZb3UgY291bGQganVzdCBz
YXkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB5b3UncmUgYW55dGhpbmcgYnV0IEEuIEFk
ZGluZyAiKGEgPT0gYiArIDEpIiB0byAiKGEgIT0gYiArIDUpIiBoYXMKKyAgICAgICAgICAgICAg
ICAgICAgLy8gbm8gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzYW1lIG9mZnNl
dHM6IHdlJ3JlIHNheWluZyB0aGF0IHlvdSdyZSBlaXRoZXIgQSBvciB5b3UncmUgbm90CisgICAg
ICAgICAgICAgICAgLy8gZXF1YWwgdG8gQS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICByZXR1cm4gUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbik7Cisg
ICAgICAgICAgICAvLyBXZSBoYXZlIHRoZXNlIGNsYWltcywgYW5kIHdlJ3JlIG1lcmdpbmcgdGhl
bToKKyAgICAgICAgICAgIC8vICAgICBAYSAhPSBAYiArIEMKKyAgICAgICAgICAgIC8vICAgICBA
YSA8IEBiICsgRAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgQyA9
PSBELCB0aGVuIHRoZSBtZXJnZSBpcyBjbGVhcmx5IGp1c3QgdGhlIE5vdEVxdWFsLgorICAgICAg
ICAgICAgLy8gSWYgd2UgaGF2ZSBDIDwgRCwgdGhlbiB0aGUgbWVyZ2UgaXMgYSB0YXV0b2xvZ3ku
CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIEMgPiBELCB0aGVuIHdlIGNvdWxkIGtlZXAgYm90
aCBjbGFpbXMsIGJ1dCB3ZSBhcmUgY2hlYXAsIHNvIHdlCisgICAgICAgICAgICAvLyBkb24ndC4g
V2UganVzdCB1c2UgdGhlIE5vdEVxdWFsLgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAo
bV9vZmZzZXQgPCBvdGhlci5tX29mZnNldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRp
b25zaGlwKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAg
ICAgICAgaWYgKG90aGVyLm1fa2luZCA9PSBMZXNzVGhhbikgeworICAgICAgICAgICAgICAgIC8v
IEZpZ3VyZSBvdXQgd2hhdCBvZmZzZXQgdG8gc2VsZWN0IHRvIG1lcmdlIHRoZW0uIFRoZSBhcHBy
b3ByaWF0ZSBvZmZzZXRzIGFyZQorICAgICAgICAgICAgICAgIC8vIC0xLCAwLCBvciAxLgorICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEZpcnN0IGZpZ3VyZSBvdXQgd2hhdCBv
ZmZzZXQgd2UnZCBsaWtlIHRvIHVzZS4KKyAgICAgICAgICAgICAgICBpbnQgYmVzdE9mZnNldCA9
IHN0ZDo6bWF4KG1fb2Zmc2V0LCBvdGhlci5tX29mZnNldCk7CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBAYSA8IEBiICsgMi4gV2Ug
Y2FuJ3QgcmVwcmVzZW50IHRoaXMgdW5kZXIgdGhlCisgICAgICAgICAgICAgICAgLy8gLTEsMCwx
IHJ1bGUuCisgICAgICAgICAgICAgICAgaWYgKGJlc3RPZmZzZXQgPD0gMSkKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIFJlbGF0aW9uc2hpcChtX2xlZnQsIG1fcmlnaHQsIExlc3NUaGFuLCBz
dGQ6Om1heChiZXN0T2Zmc2V0LCAtMSkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBFcXVhbC4gV2Ugd291bGQgaGF2
ZSBlbGltaW5hdGVkIHRoZSBHcmVhdGVyVGhhbidzLCBhbmQKKyAgICAgICAgICAgIC8vIGlmIHdl
IG1lcmdlIExlc3NUaGFuIGFuZCBOb3RFcXVhbCwgdGhlIE5vdEVxdWFsIGFsd2F5cyBjb21lcyBm
aXJzdC4KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG90aGVyLm1fa2luZCA9PSBFcXVhbCk7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlYWxseSBpbnRlcmVz
dGluZyBjYXNlLiBXZSBoYXZlOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBA
YSA8IEBiICsgQworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGFuZDoKKyAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGIgKyBECisgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlJ2QgbGlrZSB0byByZXR1cm46CisgICAgICAgICAg
ICAvLworICAgICAgICAgICAgLy8gICAgIEBhIDwgQGIgKyBtYXgoQywgRCArIDEpCisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGludCBiZXN0T2Zmc2V0ID0gc3RkOjptYXgobV9vZmZzZXQsIG90
aGVyLm1fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGhhdmUg
c29tZXRoaW5nIGxpa2UgQGEgPCBAYiArIDIuIFdlIGNhbid0IGRvIGl0LgorICAgICAgICAgICAg
aWYgKGJlc3RPZmZzZXQgPD0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVsYXRpb25zaGlw
KG1fbGVmdCwgbV9yaWdodCwgTGVzc1RoYW4sIHN0ZDo6bWF4KGJlc3RPZmZzZXQsIC0xKSk7CisK
KyAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXAoKTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBFcXVhbCwgc2luY2Ugd2Ugd291bGQg
aGF2ZSBnb3R0ZW4gcmlkIG9mIHRoZSBHcmVhdGVyVGhhbidzLgorICAgICAgICBSRUxFQVNFX0FT
U0VSVChtX2tpbmQgPT0gRXF1YWwpOworICAgICAgICAKKyAgICAgICAgLy8gV2Ugd291bGQgbmV2
ZXIgc2VlIE5vdEVxdWFsLCBiZWNhdXNlIHRob3NlIGFsd2F5cyBjb21lIGZpcnN0LiBXZSB3b3Vs
ZCBuZXZlcgorICAgICAgICAvLyBzZWUgR3JlYXRlclRoYW4sIGJlY2F1c2Ugd2Ugd291bGQgaGF2
ZSBlbGltaW5hdGVkIHRob3NlLiBXZSB3b3VsZCBuZXZlciBzZWUKKyAgICAgICAgLy8gTGVzc1Ro
YW4sIGJlY2F1c2UgdGhvc2UgYWx3YXlzIGNvbWUgZmlyc3QuCisgICAgICAgIAorICAgICAgICBS
RUxFQVNFX0FTU0VSVChvdGhlci5tX2tpbmQgPT0gRXF1YWwpOworICAgICAgICAvLyBXZSBoYXZl
IEBhID09IEBiICsgQyBhbmQgQGEgPT0gQGIgKyBELCB3aGVyZSBDICE9IEQuIFR1cm4gdGhpcyBp
bnRvIHNvbWUKKyAgICAgICAgLy8gaW5lcXVhbGl0eSB0aGF0IGludm9sdmVzIGEgY29uc3RhbnQg
dGhhdCBpcyAtMSwwLDEuIE5vdGUgdGhhdCB3ZSB3aWxsIG5ldmVyIGhhdmUKKyAgICAgICAgLy8g
bGVzc1RoYW4gYW5kIGdyZWF0ZXJUaGFuIGJlY2F1c2UgdGhlIGNvbnN0YW50cyBhcmUgY29uc3Ry
YWluZWQgdG8gLTEsMCwxLiBUaGUgb25seQorICAgICAgICAvLyB3YXkgZm9yIGJvdGggb2YgdGhl
bSB0byBiZSB2YWxpZCBpcyBhPGIrMSBhbmQgYT5iLTEsIGJ1dCB0aGVuIHdlIHdvdWxkIGhhdmUg
c2FpZAorICAgICAgICAvLyBhPT1iLgorCisgICAgICAgIFJlbGF0aW9uc2hpcCBsZXNzVGhhbjsK
KyAgICAgICAgUmVsYXRpb25zaGlwIGdyZWF0ZXJUaGFuOworICAgICAgICAKKyAgICAgICAgaW50
IGxlc3NUaGFuRXFPZmZzZXQgPSBzdGQ6Om1heChtX29mZnNldCwgb3RoZXIubV9vZmZzZXQpOwor
ICAgICAgICBpZiAobGVzc1RoYW5FcU9mZnNldCA+PSAtMiAmJiBsZXNzVGhhbkVxT2Zmc2V0IDw9
IDApIHsKKyAgICAgICAgICAgIGxlc3NUaGFuID0gUmVsYXRpb25zaGlwKAorICAgICAgICAgICAg
ICAgIG1fbGVmdCwgb3RoZXIubV9yaWdodCwgTGVzc1RoYW4sIGxlc3NUaGFuRXFPZmZzZXQgKyAx
KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQVNTRVJUKGxlc3NUaGFuLm9mZnNldCgpID49
IC0xICYmIGxlc3NUaGFuLm9mZnNldCgpIDw9IDEpOworICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICBpbnQgZ3JlYXRlclRoYW5FcU9mZnNldCA9IHN0ZDo6bWluKG1fb2Zmc2V0LCBvdGhlci5t
X29mZnNldCk7CisgICAgICAgIGlmIChncmVhdGVyVGhhbkVxT2Zmc2V0ID49IDAgJiYgZ3JlYXRl
clRoYW5FcU9mZnNldCA8PSAyKSB7CisgICAgICAgICAgICBncmVhdGVyVGhhbiA9IFJlbGF0aW9u
c2hpcCgKKyAgICAgICAgICAgICAgICBtX2xlZnQsIG90aGVyLm1fcmlnaHQsIEdyZWF0ZXJUaGFu
LCBncmVhdGVyVGhhbkVxT2Zmc2V0IC0gMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFT
U0VSVChncmVhdGVyVGhhbi5vZmZzZXQoKSA+PSAtMSAmJiBncmVhdGVyVGhhbi5vZmZzZXQoKSA8
PSAxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGxlc3NUaGFuKSB7CisgICAg
ICAgICAgICAvLyBCb3RoIHJlbGF0aW9uc2hpcHMgY2Fubm90IGJlIHZhbGlkOyBzZWUgYWJvdmUu
CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCghZ3JlYXRlclRoYW4pOworICAgICAgICAgICAg
CisgICAgICAgICAgICByZXR1cm4gbGVzc1RoYW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAg
ICAgIHJldHVybiBncmVhdGVyVGhhbjsKKyAgICB9CisgICAgCisgICAgTm9kZSogbV9sZWZ0Owor
ICAgIE5vZGUqIG1fcmlnaHQ7CisgICAgS2luZCBtX2tpbmQ7CisgICAgaW50IG1fb2Zmc2V0OyAv
LyBUaGlzIG9mZnNldCBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2UuCit9OworCit0eXBlZGVmIEhh
c2hNYXA8Tm9kZSosIFZlY3RvcjxSZWxhdGlvbnNoaXA+PiBSZWxhdGlvbnNoaXBNYXA7CisKK2Ns
YXNzIEludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlIDogcHVibGljIFBoYXNlIHsKK3B1Ymxp
YzoKKyAgICBJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZShHcmFwaCYgZ3JhcGgpCisgICAg
ICAgIDogUGhhc2UoZ3JhcGgsICJpbnRlZ2VyIHJhbmdlIG9wdGltaXphdGlvbiIpCisgICAgICAg
ICwgbV96ZXJvKG51bGxwdHIpCisgICAgICAgICwgbV9yZWxhdGlvbnNoaXBzQXRIZWFkKGdyYXBo
KQorICAgICAgICAsIG1faW5zZXJ0aW9uU2V0KGdyYXBoKQorICAgIHsKKyAgICB9CisgICAgCisg
ICAgYm9vbCBydW4oKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZ3JhcGgubV9mb3JtID09IFNT
QSk7CisgICAgICAgIAorICAgICAgICAvLyBCZWZvcmUgd2UgZG8gYW55dGhpbmcsIG1ha2Ugc3Vy
ZSB0aGF0IHdlIGhhdmUgYSB6ZXJvIGNvbnN0YW50IGF0IHRoZSB0b3AuCisgICAgICAgIGZvciAo
Tm9kZSogbm9kZSA6ICptX2dyYXBoLmJsb2NrKDApKSB7CisgICAgICAgICAgICBpZiAobm9kZS0+
aXNJbnQzMkNvbnN0YW50KCkgJiYgIW5vZGUtPmFzSW50MzIoKSkgeworICAgICAgICAgICAgICAg
IG1femVybyA9IG5vZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgaWYgKCFtX3plcm8pIHsKKyAgICAgICAgICAgIG1femVybyA9IG1f
aW5zZXJ0aW9uU2V0Lmluc2VydENvbnN0YW50KDAsIE5vZGVPcmlnaW4oKSwganNOdW1iZXIoMCkp
OworICAgICAgICAgICAgbV9pbnNlcnRpb25TZXQuZXhlY3V0ZShtX2dyYXBoLmJsb2NrKDApKTsK
KyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAg
IGRhdGFMb2coIkdyYXBoIGJlZm9yZSBpbnRlZ2VyIHJhbmdlIG9wdGltaXphdGlvbjpcbiIpOwor
ICAgICAgICAgICAgbV9ncmFwaC5kdW1wKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IC8vIFRoaXMgcGVyZm9ybXMgYSBmaXhwb2ludCBvdmVyIHRoZSBibG9ja3MgaW4gcmV2ZXJzZSBw
b3N0LW9yZGVyLiBMb2dpY2FsbHksIHdlCisgICAgICAgIC8vIG1haW50YWluIGEgbGlzdCBvZiBy
ZWxhdGlvbnNoaXBzIGF0IGVhY2ggcG9pbnQgaW4gdGhlIHByb2dyYW0uIFRoZSBsaXN0IHNob3Vs
ZCBiZQorICAgICAgICAvLyByZWFkIGFzIGFuIGludGVyc2VjdGlvbi4gRm9yIGV4YW1wbGUgaWYg
d2UgaGF2ZSB7cmVsMSwgcmVsMiwgLi4uLCByZWxOfSwgeW91IHNob3VsZAorICAgICAgICAvLyBy
ZWFkIHRoaXMgYXM6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBUT1AgJiYgcmVsMSAmJiBy
ZWwyICYmIC4uLiAmJiByZWxOCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgYWxsb3dzIHVz
IHRvIGV4cHJlc3MgdGhpbmdzIGxpa2U6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYSA+
IEBiIC0gNDIgJiYgQGEgPCBAYiArIDI1CisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1dCBub3Qg
dGhpbmdzIGxpa2U6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICBAYSA8IEBiIC0gNDIgfHwg
QGEgPiBAYiArIDI1CisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIG1lcmdlIHR3byBsaXN0cyBi
eSBtZXJnaW5nIGVhY2ggcmVsYXRpb25zaGlwIGluIG9uZSBsaXN0IHdpdGggZWFjaCByZWxhdGlv
bnNoaXAKKyAgICAgICAgLy8gaW4gdGhlIG90aGVyIGxpc3QuIE1lcmdpbmcgdHdvIHJlbGF0aW9u
c2hpcHMgd2lsbCB5aWVsZCBhIHJlbGF0aW9uc2hpcCBsaXN0OyBhcyB3aXRoCisgICAgICAgIC8v
IGFsbCBzdWNoIGxpc3RzIGl0IGlzIGFuIGludGVyc2N0aW9uLiBNZXJnaW5nIHJlbGF0aW9uc2hp
cHMgb3ZlciBkaWZmZXJlbnQgdmFyaWFibGVzCisgICAgICAgIC8vIGFsd2F5cyB5aWVsZHMgdGhl
IGVtcHR5IGxpc3QgKGkuZS4gVE9QKS4gVGhpcyBtZXJnZSBzdHlsZSBpcyBzb3VuZCBiZWNhdXNl
IGlmIHdlCisgICAgICAgIC8vIGhhdmU6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAoQSAm
JiBCICYmIEMpIHx8IChEICYmIEUgJiYgRikKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlbiBh
IHZhbGlkIG1lcmdlIGlzIGp1c3Qgb25lIHRoYXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBBLCBCLCBD
IGFyZSBhbGwgdHJ1ZSwgb3IKKyAgICAgICAgLy8gdGhhdCB3aWxsIHJldHVybiB0cnVlIGlmIEQs
IEUsIEYgYXJlIGFsbCB0cnVlLiBPdXIgbWVyZ2Ugc3R5bGUgZXNzZW50aWFsbHkgZG9lczoKKyAg
ICAgICAgLy8KKyAgICAgICAgLy8gICAgIChBIHx8IEQpICYmIChBIHx8IEUpICYmIChBIHx8IEYp
ICYmIChCIHx8IEQpICYmIChCIHx8IEUpICYmIChCIHx8IEYpICYmCisgICAgICAgIC8vICAgICAg
ICAgKEMgfHwgRCkgJiYgKEMgfHwgRSkgJiYgKEMgfHwgRikKKyAgICAgICAgLy8KKyAgICAgICAg
Ly8gSWYgQSAmJiBCICYmIEMgaXMgdHJ1ZSwgdGhlbiB0aGlzIHJldHVybnMgdHJ1ZS4gSWYgRCAm
JiBFICYmIEYgaXMgdHJ1ZSwgdGhpcyBhbHNvCisgICAgICAgIC8vIHJldHVybnMgdHJ1ZS4KKyAg
ICAgICAgLy8KKyAgICAgICAgLy8gV2hpbGUgdGhpcyBhcHBlYXJzIGF0IGZpcnN0IGxpa2UgYSBr
aW5kIG9mIGV4cHJlc3Npb24gZXhwbG9zaW9uLCBpbiBwcmFjdGljZSBpdAorICAgICAgICAvLyBp
c24ndC4gVGhlIGNvZGUgdGhhdCBoYW5kbGVzIHRoaXMga25vd3MgdGhhdCB0aGUgbWVyZ2Ugb2Yg
dHdvIHJlbGF0aW9uc2hpcHMgb3ZlcgorICAgICAgICAvLyBkaWZmZXJlbnQgdmFyaWFibGVzIGlz
IFRPUCAoaS5lLiB0aGUgZW1wdHkgbGlzdCkuIEZvciBleGFtcGxlIGlmIEEgYWJvdmUgaXMgQGEg
PCBAYgorICAgICAgICAvLyBhbmQgQiBhYm92ZSBpcyBAYyA+IEBkLCB3aGVyZSBAYSwgQGIsIEBj
LCBhbmQgQGQgYXJlIGRpZmZlcmVudCBub2RlcywgdGhlIG1lcmdlIHdpbGwKKyAgICAgICAgLy8g
eWllbGQgbm90aGluZy4gSW4gZmFjdCwgdGhlIG1lcmdlIGFsZ29yaXRobSB3aWxsIHNraXAgc3Vj
aCBtZXJnZXMgZW50aXJlbHkgYmVjYXVzZQorICAgICAgICAvLyB0aGUgcmVsYXRpb25zaGlwIGxp
c3RzIGFyZSBhY3R1YWxseSBrZXllZCBieSBub2RlLgorICAgICAgICAvLworICAgICAgICAvLyBO
b3RlIHRoYXQgaXQncyBhbHdheXMgc2FmZSB0byBkcm9wIGFueSBvZiByZWxhdGlvbnNoaXAgZnJv
bSB0aGUgcmVsYXRpb25zaGlwIGxpc3QuCisgICAgICAgIC8vIFRoaXMgbWVyZWx5IGluY3JlYXNl
cyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgImV4cHJlc3Npb24iIHlpZWxkaW5nIHRydWUsIGkuZS4g
YmVpbmcKKyAgICAgICAgLy8gY2xvc2VyIHRvIFRPUC4gT3B0aW1pemF0aW9ucyBhcmUgb25seSBw
ZXJmb3JtZWQgaWYgd2UgY2FuIGVzdGFibGlzaCB0aGF0IHRoZQorICAgICAgICAvLyBleHByZXNz
aW9uIGltcGxpZWQgYnkgdGhlIHJlbGF0aW9uc2hpcCBsaXN0IGlzIGZhbHNlIGZvciBhbGwgb2Yg
dGhvc2UgY2FzZXMgd2hlcmUKKyAgICAgICAgLy8gc29tZSBjaGVjayB3b3VsZCBoYXZlIGZhaWxl
ZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gbm90aW9uIG9mIEJPVFRPTSBi
ZWNhdXNlIHdlIHRyZWF0IGJsb2NrcyB0aGF0IGhhdmVuJ3QgaGFkIHRoZWlyCisgICAgICAgIC8v
IHN0YXRlLWF0LWhlYWQgc2V0IGFzIGEgc3BlY2lhbCBjYXNlOiB3ZSBqdXN0IHRyYW5zZmVyIGFs
bCBsaXZlIHJlbGF0aW9uc2hpcHMgdG8gc3VjaAorICAgICAgICAvLyBhIGJsb2NrLiBBZnRlciB0
aGUgaGVhZCBvZiBhIGJsb2NrIGlzIHNldCwgd2UgcGVyZm9ybSB0aGUgbWVyZ2luZyBhcyBhYm92
ZS4gSW4gYWxsCisgICAgICAgIC8vIG90aGVyIHBsYWNlcyB3aGVyZSB3ZSB3b3VsZCBvcmRpbmFy
aWx5IG5lZWQgQk9UVE9NLCB3ZSBhcHByb3hpbWF0ZSBpdCBieSBoYXZpbmcgc29tZQorICAgICAg
ICAvLyBub24tQk9UVE9NIHJlbGF0aW9uc2hpcC4KKyAgICAgICAgCisgICAgICAgIEJsb2NrTGlz
dCBwb3N0T3JkZXIgPSBtX2dyYXBoLmJsb2Nrc0luUG9zdE9yZGVyKCk7CisKKyAgICAgICAgLy8g
VGhpcyBsb29wIGFuYWx5emVzIHRoZSBJUiB0byBnaXZlIHVzIG1fcmVsYXRpb25zaGlwc0F0SGVh
ZCBmb3IgZWFjaCBibG9jay4gVGhpcworICAgICAgICAvLyBtYXkgcmVleGVjdXRlIGJsb2NrcyBt
YW55IHRpbWVzLCBidXQgaXQgaXMgZ3VhcmFudGVlZCB0byBjb252ZXJnZS4gVGhlIHN0YXRlIG9m
CisgICAgICAgIC8vIHRoZSByZWxhdGlvbnNoaXBzQXRIZWFkIG92ZXIgYW55IHBhaXIgb2Ygbm9k
ZXMgY29udmVyZ2UgbW9ub3RvbmljYWxseSB0b3dhcmRzIHRoZQorICAgICAgICAvLyBUT1AgcmVs
YXRpb25zaGlwIChpLmUuIG5vIHJlbGF0aW9uc2hpcHMgaW4gdGhlIHJlbGF0aW9uc2hpcCBsaXN0
KS4gVGhlIG1lcmdlIHJ1bGUKKyAgICAgICAgLy8gd2hlbiBiZXR3ZWVuIHRoZSBjdXJyZW50IHJl
bGF0aW9uc2hpcHNBdEhlYWQgYW5kIHRoZSByZWxhdGlvbnNoaXBzIGJlaW5nIHByb3BhZ2F0ZWQK
KyAgICAgICAgLy8gZnJvbSBhIHByZWRlY2Vzc29yIGVuc3VyZXMgbW9ub3RvbmljaXR5IGJ5IGNv
bnZlcnRpbmcgZGlzYWdyZWVtZW50cyBpbnRvIG9uZSBvZiBhCisgICAgICAgIC8vIHNtYWxsIHNl
dCBvZiAiZ2VuZXJhbCIgcmVsYXRpb25zaGlwcy4gVGhlcmUgYXJlIDEyIHN1Y2ggcmVsYXRpb25z
aGlzLCBwbHVzIFRPUC4gU2VlCisgICAgICAgIC8vIHRoZSBjb21tZW50IGFib3ZlIFJlbGF0aW9u
c2hpcDo6bWVyZ2UoKSBmb3IgZGV0YWlscy4KKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gdHJ1ZTsK
KyAgICAgICAgd2hpbGUgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsK
KyAgICAgICAgICAgIGZvciAodW5zaWduZWQgcG9zdE9yZGVySW5kZXggPSBwb3N0T3JkZXIuc2l6
ZSgpOyBwb3N0T3JkZXJJbmRleC0tOykgeworICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIGJs
b2NrID0gcG9zdE9yZGVyW3Bvc3RPcmRlckluZGV4XTsKKyAgICAgICAgICAgICAgICBERkdfQVNT
RVJUKAorICAgICAgICAgICAgICAgICAgICBtX2dyYXBoLCBudWxscHRyLAorICAgICAgICAgICAg
ICAgICAgICBibG9jayA9PSBtX2dyYXBoLmJsb2NrKDApIHx8IG1fc2VlbkJsb2Nrcy5jb250YWlu
cyhibG9jaykpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbV9yZWxhdGlvbnNoaXBz
ID0gbV9yZWxhdGlvbnNoaXBzQXRIZWFkW2Jsb2NrXTsKKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgYmxvY2stPnNp
emUoKTsgKytub2RlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJs
b2NrLT5hdChub2RlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIkFuYWx5c2lzOiBhdCAiLCBub2RlLCAiOiAi
LCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKCkpLCAiXG4iKTsKKyAgICAgICAgICAgICAg
ICAgICAgZXhlY3V0ZU5vZGUobm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIE5vdyBjb21lcyBwZXJoYXBzIHRoZSBtb3N0IGltcG9y
dGFudCBwaWVjZSBvZiBjbGV2ZXJuZXNzOiBpZiB3ZSBCcmFuY2gsIGFuZAorICAgICAgICAgICAg
ICAgIC8vIHRoZSBwcmVkaWNhdGUgaW52b2x2ZXMgc29tZSByZWxhdGlvbiBvdmVyIGludGVnZXJz
LCB3ZSBwcm9wYWdhdGUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24g
dG8gdGhlIHRha2VuIGFuZCBub3RUYWtlbiBwYXRocy4gVGhpcyBoYW5kbGVzOgorICAgICAgICAg
ICAgICAgIC8vIC0gQnJhbmNoIG9uIGludDMyLgorICAgICAgICAgICAgICAgIC8vIC0gQnJhbmNo
IG9uIExvZ2ljYWxOb3Qgb24gaW50MzIuCisgICAgICAgICAgICAgICAgLy8gLSBCcmFuY2ggb24g
Y29tcGFyZSBvbiBpbnQzMidzLgorICAgICAgICAgICAgICAgIC8vIC0gQnJhbmNoIG9uIExvZ2lj
YWxOb3Qgb2YgY29tcGFyZSBvbiBpbnQzMidzLgorICAgICAgICAgICAgICAgIE5vZGUqIHRlcm1p
bmFsID0gYmxvY2stPnRlcm1pbmFsKCk7CisgICAgICAgICAgICAgICAgYm9vbCBhbHJlYWR5TWVy
Z2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsLT5vcCgpID09IEJyYW5j
aCkgeworICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwRm9yVHJ1
ZTsKKyAgICAgICAgICAgICAgICAgICAgQnJhbmNoRGF0YSogYnJhbmNoRGF0YSA9IHRlcm1pbmFs
LT5icmFuY2hEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAg
ICBib29sIGludmVydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWwt
PmNoaWxkMSgpLT5vcCgpID09IExvZ2ljYWxOb3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHRlcm1pbmFsID0gdGVybWluYWwtPmNoaWxkMSgpLm5vZGUoKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGludmVydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbC0+Y2hpbGQxKCkudXNl
S2luZCgpID09IEludDMyVXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNo
aXBGb3JUcnVlID0gUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHRlcm1pbmFsLT5jaGlsZDEoKS5ub2RlKCksIG1femVybywgUmVsYXRpb25zaGlw
OjpOb3RFcXVhbCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBOb2RlKiBjb21wYXJlID0gdGVybWluYWwtPmNoaWxkMSgpLm5vZGUoKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tcGFyZS0+b3AoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAgICAgICAg
ICBjYXNlIENvbXBhcmVTdHJpY3RFcToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29t
cGFyZUxlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVMZXNzRXE6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmVHcmVhdGVyOgorICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlckVxOiB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCFjb21wYXJlLT5pc0JpbmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21wYXJlLT5vcCgpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlRXE6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlU3RyaWN0RXE6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJlbGF0aW9uc2hpcEZvclRydWUgPSBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUo
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlLT5jaGlsZDEoKS5u
b2RlKCksIGNvbXBhcmUtPmNoaWxkMigpLm5vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFJlbGF0aW9uc2hpcDo6RXF1YWwsIDApOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENv
bXBhcmVMZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBG
b3JUcnVlID0gUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29tcGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIo
KS5ub2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNo
aXA6Okxlc3NUaGFuLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJlTGVzc0VxOgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGb3JUcnVlID0gUmVsYXRpb25z
aGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29t
cGFyZS0+Y2hpbGQxKCkubm9kZSgpLCBjb21wYXJlLT5jaGlsZDIoKS5ub2RlKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6Okxlc3NUaGFuLCAxKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDb21wYXJlR3JlYXRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmVsYXRpb25zaGlwRm9yVHJ1ZSA9IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5v
ZGUoKSwgY29tcGFyZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgMCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNh
c2UgQ29tcGFyZUdyZWF0ZXJFcToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVs
YXRpb25zaGlwRm9yVHJ1ZSA9IFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZSgKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUtPmNoaWxkMSgpLm5vZGUoKSwgY29tcGFy
ZS0+Y2hpbGQyKCkubm9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERkdfQ1JBU0gobV9ncmFwaCwgY29tcGFyZSwg
IkludmFsaWQgY29tcGFyaXNvbiBub2RlIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgICAgIGlmIChpbnZlcnQpCisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNo
aXBGb3JUcnVlID0gcmVsYXRpb25zaGlwRm9yVHJ1ZS5pbnZlcnNlKCk7CisgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwRm9yVHJ1ZSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwTWFwIGZvclRydWUgPSBtX3JlbGF0
aW9uc2hpcHM7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBNYXAgZm9yRmFs
c2UgPSBtX3JlbGF0aW9uc2hpcHM7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRhdGFMb2coIkRlYWxpbmcgd2l0aCB0cnVlOlxuIik7CisgICAgICAgICAgICAgICAgICAgICAg
ICBzZXRSZWxhdGlvbnNoaXAoZm9yVHJ1ZSwgcmVsYXRpb25zaGlwRm9yVHJ1ZSk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcEZvckZhbHNlID0g
cmVsYXRpb25zaGlwRm9yVHJ1ZS5pbnZlcnNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxv
ZygiRGVhbGluZyB3aXRoIGZhbHNlOlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2V0UmVsYXRpb25zaGlwKGZvckZhbHNlLCByZWxhdGlvbnNoaXBGb3JGYWxzZSk7CisgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhmb3JUcnVlLCBicmFuY2hEYXRhLT50YWtl
bi5ibG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlVG8oZm9y
RmFsc2UsIGJyYW5jaERhdGEtPm5vdFRha2VuLmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGFscmVhZHlNZXJnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TWVyZ2VkKSB7CisgICAg
ICAgICAgICAgICAgICAgIGZvciAoQmFzaWNCbG9jayogc3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nl
c3NvcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2VUbyhtX3Jl
bGF0aW9uc2hpcHMsIHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBOb3cgd2UgdHJhbnNmb3JtIHRoZSBj
b2RlIGJhc2VkIG9uIHRoZSByZXN1bHRzIGNvbXB1dGVkIGluIHRoZSBwcmV2aW91cyBsb29wLgor
ICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiBtX2dyYXBoLmJsb2Nrc0luTmF0dXJhbE9yZGVyKCkpIHsKKyAgICAgICAgICAgIG1fcmVsYXRp
b25zaGlwcyA9IG1fcmVsYXRpb25zaGlwc0F0SGVhZFtibG9ja107CisgICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIG5vZGVJbmRleCA9IDA7IG5vZGVJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsrbm9k
ZUluZGV4KSB7CisgICAgICAgICAgICAgICAgTm9kZSogbm9kZSA9IGJsb2NrLT5hdChub2RlSW5k
ZXgpOworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBk
YXRhTG9nKCJUcmFuc2Zvcm1hdGlvbjogYXQgIiwgbm9kZSwgIjogIiwgbGlzdER1bXAoc29ydGVk
UmVsYXRpb25zaGlwcygpKSwgIlxuIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgLy8gVGhpcyBlbmRzIHVwIGJlaW5nIHByZXR0eSBhd2t3YXJkIHRvIHdyaXRlIGJlY2F1c2Ug
d2UgbmVlZCB0byBkZWNpZGUgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZSBieSB1
c2luZyB0aGUgcmVsYXRpb25zaGlwcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiwgYnV0IHdlIG5lZWQg
dG8KKyAgICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHdlIG9wdGlt
aXplLgorICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgeworICAgICAgICAgICAg
ICAgIGNhc2UgQXJpdGhBZGQ6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5pc0Jp
bmFyeVVzZUtpbmQoSW50MzJVc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tP
dmVyZmxvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
ICAgICBpZiAoIW5vZGUtPmNoaWxkMigpLT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9k
ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlvbnNoaXBzLmVu
ZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgICAgICBpbnQgbWluVmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRz
PGludD46Om1pbigpOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VmFsdWUgPSBzdGQ6Om51
bWVyaWNfbGltaXRzPGludD46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJlbGF0
aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBpdGVyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgbWluVmFsdWUgPSBzdGQ6Om1heChtaW5WYWx1ZSwgcmVsYXRpb25zaGlwLm1pblZhbHVl
T2ZMZWZ0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBzdGQ6Om1pbiht
YXhWYWx1ZSwgcmVsYXRpb25zaGlwLm1heFZhbHVlT2ZMZWZ0KCkpOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoc3Vt
T3ZlcmZsb3dzPGludD4obWluVmFsdWUsIG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCkpIHx8Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzdW1PdmVyZmxvd3M8aW50PihtYXhWYWx1ZSwgbm9kZS0+
Y2hpbGQyKCktPmFzSW50MzIoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVOb2RlKGJsb2Nr
LT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+c2V0QXJpdGhNb2Rl
KEFyaXRoOjpVbmNoZWNrZWQpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENoZWNrSW5Cb3VuZHM6IHsKKyAgICAg
ICAgICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlvbnNoaXBzLmZpbmQobm9kZS0+Y2hp
bGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gbV9yZWxhdGlv
bnNoaXBzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBib29sIG5vbk5lZ2F0aXZlID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgICAgIGJvb2wgbGVzc1RoYW5MZW5ndGggPSBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFs
dWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAubWluVmFsdWVP
ZkxlZnQoKSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbk5lZ2F0aXZlID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKHJlbGF0aW9uc2hpcC5yaWdodCgpID09IG5vZGUtPmNoaWxkMigpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlw
OjpFcXVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAu
b2Zmc2V0KCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzVGhhbkxl
bmd0aCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5raW5kKCkgPT0gUmVsYXRpb25zaGlwOjpM
ZXNzVGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWxhdGlvbnNoaXAu
b2Zmc2V0KCkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzc1RoYW5M
ZW5ndGggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobm9u
TmVnYXRpdmUgJiYgbGVzc1RoYW5MZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4
ZWN1dGVOb2RlKGJsb2NrLT5hdChub2RlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG5vZGUtPnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGUoYmxvY2stPmF0KG5vZGVJ
bmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1
cm4gY2hhbmdlZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBleGVjdXRlTm9kZShOb2Rl
KiBub2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChub2RlLT5vcCgpKSB7CisgICAgICAgIGNh
c2UgQ2hlY2tJbkJvdW5kczogeworICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKFJlbGF0aW9u
c2hpcDo6c2FmZUNyZWF0ZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIG5vZGUtPmNoaWxkMigpLm5v
ZGUoKSwgUmVsYXRpb25zaGlwOjpMZXNzVGhhbikpOworICAgICAgICAgICAgc2V0UmVsYXRpb25z
aGlwKFJlbGF0aW9uc2hpcDo6c2FmZUNyZWF0ZShub2RlLT5jaGlsZDEoKS5ub2RlKCksIG1femVy
bywgUmVsYXRpb25zaGlwOjpHcmVhdGVyVGhhbiwgLTEpKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBcml0aEFkZDogeworICAgICAg
ICAgICAgLy8gV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGludDMyIGFkZGl0aW9ucyBhbmQgd2Ug
Y3VycmVudGx5IG9ubHkga25vdyBob3cgdG8KKyAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgbm9u
LXdyYXBwaW5nIG9uZXMuCisgICAgICAgICAgICBpZiAoIW5vZGUtPmlzQmluYXJ5VXNlS2luZChJ
bnQzMlVzZSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBXZSBjb3VsZCBoYW5kbGUgdGhlIHVuY2hlY2tlZCBhcml0aG1ldGljIGNh
c2UuIFdlIGp1c3QgZG8gaXQgZG9uJ3QgcmlnaHQKKyAgICAgICAgICAgIC8vIG5vdy4KKyAgICAg
ICAgICAgIGlmIChub2RlLT5hcml0aE1vZGUoKSAhPSBBcml0aDo6Q2hlY2tPdmVyZmxvdykKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSGFuZGxl
IGFkZDogQHZhbHVlICsgY29uc3RhbnQuCisgICAgICAgICAgICBpZiAoIW5vZGUtPmNoaWxkMigp
LT5pc0ludDMyQ29uc3RhbnQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgaW50IG9mZnNldCA9IG5vZGUtPmNoaWxkMigpLT5hc0ludDMyKCk7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGFkZCBhIHJlbGF0aW9uc2hpcCBmb3IgQGFk
ZCA9PSBAdmFsdWUgKyBjb25zdGFudCwgYW5kIHRoZW4gd2UgY29weSB0aGUKKyAgICAgICAgICAg
IC8vIHJlbGF0aW9uc2hpcHMgZm9yIEB2YWx1ZS4gVGhpcyBnaXZlcyB1cyBhIG9uZS1kZWVwIHZp
ZXcgb2YgQHZhbHVlJ3MgZXhpc3RpbmcKKyAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcHMsIHdo
aWNoIG1hdGNoZXMgdGhlIG9uZS1kZWVwIHNlYXJjaCBpbiBzZXRSZWxhdGlvbnNoaXAoKS4KKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAg
IFJlbGF0aW9uc2hpcChub2RlLCBub2RlLT5jaGlsZDEoKS5ub2RlKCksIFJlbGF0aW9uc2hpcDo6
RXF1YWwsIG9mZnNldCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBt
X3JlbGF0aW9uc2hpcHMuZmluZChub2RlLT5jaGlsZDEoKS5ub2RlKCkpOworICAgICAgICAgICAg
aWYgKGl0ZXIgIT0gbV9yZWxhdGlvbnNoaXBzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgVmVj
dG9yPFJlbGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNo
aXAgcmVsYXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g
V2UgaGF2ZToKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZDogQXJpdGhBZGQoQHgsIEMp
CisgICAgICAgICAgICAgICAgICAgIC8vICAgICBAeCBvcCBAeSArIEQKKyAgICAgICAgICAgICAg
ICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjZXJ0YWlubHkg
aG9sZHM6CisgICAgICAgICAgICAgICAgICAgIC8vICAgICBAeCA9PSBAYWRkIC0gQworICAgICAg
ICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBXaGljaCBhbGxvd3MgdXMg
dG8gc3Vic3RpdHV0ZToKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIEBhZGQgLSBDIG9wIEB5
ICsgRAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBbmQg
dGhlbiBjYXJyeSB0aGUgQyBvdmVyOgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgQGFkZCBv
cCBAeSArIEQgKyBDCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBS
ZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAg
ICAgICAgICBBU1NFUlQobmV3UmVsYXRpb25zaGlwLmxlZnQoKSA9PSBub2RlLT5jaGlsZDEoKS5u
b2RlKCkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5l
d1JlbGF0aW9uc2hpcC5yaWdodCgpID09IG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlwLnNldExlZnQobm9k
ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdSZWxhdGlvbnNoaXAuYWRkVG9PZmZzZXQo
b2Zmc2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChuZXdSZWxhdGlv
bnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9u
c2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRp
b25zaGlwKHJlbGF0aW9uc2hpcCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIC8vIE5vdyB3ZSB3YW50IHRvIGVzdGFibGlzaCB0aGF0IGJvdGggdGhlIGlucHV0
IGFuZCB0aGUgb3V0cHV0IG9mIHRoZSBhZGRpdGlvbiBhcmUKKyAgICAgICAgICAgIC8vIHdpdGhp
biBhIHBhcnRpY3VsYXIgcmFuZ2Ugb2YgaW50ZWdlcnMuCisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRk
OiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBAdmFsdWUgPD0gbWF4IC0gMSwgaS5lLiB0
aGF0CisgICAgICAgICAgICAgICAgLy8gQHZhbHVlIDwgbWF4LgorICAgICAgICAgICAgICAgIGlm
ICghc3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwgLW9m
ZnNldCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAorICAgICAg
ICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwOjpzYWZlQ3JlYXRlKAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbV96ZXJvLCBSZWxhdGlvbnNo
aXA6Okxlc3NUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19s
aW1pdHM8aW50Pjo6bWF4KCkgLSBvZmZzZXQgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgLy8gSWYgd2UgaGF2ZSAiYWRkOiBAdmFsdWUgKyAxIiB0aGVuIHdlIGtub3cgdGhhdCBA
YWRkID49IG1pbiArIDEsIGkuZS4gdGhhdAorICAgICAgICAgICAgICAgIC8vIEBhZGQgPiBtaW4u
CisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxvd3M8aW50PihzdGQ6Om51bWVyaWNfbGlt
aXRzPGludD46Om1pbigpLCBvZmZzZXQsIC0xKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRS
ZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAoCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0
ZXJUaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8
aW50Pjo6bWluKCkgKyBvZmZzZXQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgaWYgKG9mZnNldCA8IDAgJiYgb2Zmc2V0ICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6
bWluKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlICJhZGQ6IEB2YWx1ZSAtIDEi
IHRoZW4gd2Uga25vdyB0aGF0IEB2YWx1ZSA+PSBtaW4gKyAxLCBpLmUuIHRoYXQKKyAgICAgICAg
ICAgICAgICAvLyBAdmFsdWUgPiBtaW4uCisgICAgICAgICAgICAgICAgaWYgKCFzdW1PdmVyZmxv
d3M8aW50PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpLCBvZmZzZXQsIC0xKSkgewor
ICAgICAgICAgICAgICAgICAgICBzZXRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgICAgICAg
ICAgICBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbm9kZS0+Y2hpbGQxKCkubm9kZSgpLCBtX3plcm8sIFJlbGF0aW9uc2hpcDo6R3JlYXRlclRo
YW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+
OjptaW4oKSArIG9mZnNldCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHdl
IGhhdmUgImFkZDogQHZhbHVlICsgMSIgdGhlbiB3ZSBrbm93IHRoYXQgQGFkZCA8PSBtYXggLSAx
LCBpLmUuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBAYWRkIDwgbWF4LgorICAgICAgICAgICAg
ICAgIGlmICghc3VtT3ZlcmZsb3dzPGludD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgo
KSwgLW9mZnNldCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVsYXRpb25zaGlwKAor
ICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vZGUsIG1femVybywgUmVsYXRpb25zaGlwOjpMZXNzVGhhbiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC0gb2Zm
c2V0ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAg
ICAgCisgICAgICAgIGNhc2UgR2V0QXJyYXlMZW5ndGg6IHsKKyAgICAgICAgICAgIHNldFJlbGF0
aW9uc2hpcChSZWxhdGlvbnNoaXAobm9kZSwgbV96ZXJvLCBSZWxhdGlvbnNoaXA6OkdyZWF0ZXJU
aGFuLCAtMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICBjYXNlIFVwc2lsb246IHsKKyAgICAgICAgICAgIHNldFJlbGF0aW9uc2hpcCgKKyAg
ICAgICAgICAgICAgICBSZWxhdGlvbnNoaXA6OnNhZmVDcmVhdGUoCisgICAgICAgICAgICAgICAg
ICAgIG5vZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+cGhpKCksIFJlbGF0aW9uc2hpcDo6RXF1
YWwsIDApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXV0byBpdGVyID0gbV9yZWxhdGlv
bnNoaXBzLmZpbmQobm9kZS0+Y2hpbGQxKCkubm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChpdGVy
ICE9IG1fcmVsYXRpb25zaGlwcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIFZlY3RvcjxSZWxh
dGlvbnNoaXA+IHRvQWRkOworICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHJlbGF0
aW9uc2hpcCA6IGl0ZXItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hp
cCBuZXdSZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXA7CisgICAgICAgICAgICAgICAgICAgIGlm
IChub2RlLT5waGkoKSA9PSBuZXdSZWxhdGlvbnNoaXAucmlnaHQoKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBuZXdSZWxhdGlvbnNoaXAu
c2V0TGVmdChub2RlLT5waGkoKSk7CisgICAgICAgICAgICAgICAgICAgIHRvQWRkLmFwcGVuZChu
ZXdSZWxhdGlvbnNoaXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3Ig
KFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiB0b0FkZCkKKyAgICAgICAgICAgICAgICAgICAg
c2V0UmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHNldFJlbGF0
aW9uc2hpcChSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0g
MSkKKyAgICB7CisgICAgICAgIHNldFJlbGF0aW9uc2hpcChtX3JlbGF0aW9uc2hpcHMsIHJlbGF0
aW9uc2hpcCwgdGltZVRvTGl2ZSk7CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0UmVsYXRpb25z
aGlwKAorICAgICAgICBSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgUmVsYXRpb25z
aGlwIHJlbGF0aW9uc2hpcCwgdW5zaWduZWQgdGltZVRvTGl2ZSA9IDEpCisgICAgeworICAgICAg
ICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgcmVsYXRpb25zaGlwLCB0aW1lVG9MaXZlKTsK
KyAgICAgICAgc2V0T25lU2lkZShyZWxhdGlvbnNoaXBNYXAsIHJlbGF0aW9uc2hpcC5mbGlwcGVk
KCksIHRpbWVUb0xpdmUpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldE9uZVNpZGUoCisgICAg
ICAgIFJlbGF0aW9uc2hpcE1hcCYgcmVsYXRpb25zaGlwTWFwLCBSZWxhdGlvbnNoaXAgcmVsYXRp
b25zaGlwLCB1bnNpZ25lZCB0aW1lVG9MaXZlID0gMSkKKyAgICB7CisgICAgICAgIGlmICghcmVs
YXRpb25zaGlwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHZl
cmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2V0dGluZzogIiwgcmVsYXRpb25zaGlw
LCAiICh0dGwgPSAiLCB0aW1lVG9MaXZlLCAiKVxuIik7CisKKyAgICAgICAgYXV0byByZXN1bHQg
PSByZWxhdGlvbnNoaXBNYXAuYWRkKAorICAgICAgICAgICAgcmVsYXRpb25zaGlwLmxlZnQoKSwg
VmVjdG9yPFJlbGF0aW9uc2hpcD4oKSk7CisgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+JiBy
ZWxhdGlvbnNoaXBzID0gcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsKKyAgICAgICAgVmVjdG9yPFJl
bGF0aW9uc2hpcD4gdG9BZGQ7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAg
Zm9yIChSZWxhdGlvbnNoaXAmIG90aGVyUmVsYXRpb25zaGlwIDogcmVsYXRpb25zaGlwcykgewor
ICAgICAgICAgICAgaWYgKG90aGVyUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKHJlbGF0aW9uc2hp
cCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUmVsYXRpb25zaGlwIGZpbHRlcmVkID0gb3RoZXJS
ZWxhdGlvbnNoaXAuZmlsdGVyKHJlbGF0aW9uc2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKGZpbHRlcmVkLmxlZnQoKSA9PSByZWxhdGlvbnNoaXAubGVmdCgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgb3RoZXJSZWxhdGlvbnNoaXAgPSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAg
ICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHRpbWVUb0xpdmUgJiYgb3RoZXJSZWxhdGlvbnNo
aXAua2luZCgpID09IFJlbGF0aW9uc2hpcDo6RXF1YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAo
dmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICAgQ29uc2lkZXJpbmc6
ICIsIG90aGVyUmVsYXRpb25zaGlwLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAvLyBXZSBoYXZlOgorICAgICAgICAgICAgICAgIC8vICAgICBAYSBvcCBAYiArIEMK
KyAgICAgICAgICAgICAgICAvLyAgICAgQGEgPT0gQGMgKyBECisgICAgICAgICAgICAgICAgLy8K
KyAgICAgICAgICAgICAgICAvLyBUaGlzIGltcGxpZXM6CisgICAgICAgICAgICAgICAgLy8gICAg
IEBjICsgRCBvcCBAYiArIEMKKyAgICAgICAgICAgICAgICAvLyAgICAgQGMgb3AgQGIgKyBDIC0g
RAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2hlcmU6IEBhID09IHJl
bGF0aW9uc2hpcC5sZWZ0KCksIEBiID09IHJlbGF0aW9uc2hpcC5yaWdodCgpLAorICAgICAgICAg
ICAgICAgIC8vIEBhID09IG90aGVyUmVsYXRpb25zaGlwLmxlZnQoKSwgQGMgPT0gb3RoZXJSZWxh
dGlvbnNoaXAucmlnaHQoKS4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAo
b3RoZXJSZWxhdGlvbnNoaXAub2Zmc2V0KCkgIT0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+Ojpt
aW4oKSkgeworICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlw
ID0gcmVsYXRpb25zaGlwOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlw
LnJpZ2h0KCkgIT0gb3RoZXJSZWxhdGlvbnNoaXAucmlnaHQoKSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3UmVsYXRpb25zaGlwLnNldExlZnQob3RoZXJSZWxhdGlvbnNoaXAucmlnaHQo
KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UmVsYXRpb25zaGlwLmFkZFRvT2Zm
c2V0KC1vdGhlclJlbGF0aW9uc2hpcC5vZmZzZXQoKSkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdG9BZGQuYXBwZW5kKG5ld1JlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg
CisgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChy
ZWxhdGlvbnNoaXApOworICAgICAgICAKKyAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgYW5vdGhl
clJlbGF0aW9uc2hpcCA6IHRvQWRkKSB7CisgICAgICAgICAgICBBU1NFUlQodGltZVRvTGl2ZSk7
CisgICAgICAgICAgICBzZXRPbmVTaWRlKHJlbGF0aW9uc2hpcE1hcCwgYW5vdGhlclJlbGF0aW9u
c2hpcCwgdGltZVRvTGl2ZSAtIDEpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGJvb2wg
bWVyZ2VUbyhSZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcE1hcCwgQmFzaWNCbG9jayogdGFy
Z2V0KQorICAgIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGRhdGFMb2co
Ik1lcmdpbmcgdG8gIiwgcG9pbnRlckR1bXAodGFyZ2V0KSwgIjpcbiIpOworICAgICAgICAgICAg
ZGF0YUxvZygiICAgIEluY29taW5nOiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKHJl
bGF0aW9uc2hpcE1hcCkpLCAiXG4iKTsKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBBdCBoZWFk
OiAiLCBsaXN0RHVtcChzb3J0ZWRSZWxhdGlvbnNoaXBzKG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0
YXJnZXRdKSksICJcbiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobV9zZWVu
QmxvY2tzLmFkZCh0YXJnZXQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IGJsb2Nr
LiBXZSBjb3B5IHN1YmplY3QgdG8gbGl2ZW5lc3MgcHJ1bmluZy4KKyAgICAgICAgICAgIGF1dG8g
aXNMaXZlID0gWyZdIChOb2RlKiBub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0g
bV96ZXJvKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gdGFyZ2V0LT5zc2EtPmxpdmVBdEhlYWQuY29udGFpbnMobm9kZSk7CisgICAgICAg
ICAgICB9OworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogcmVs
YXRpb25zaGlwTWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0xpdmUoZW50cnkua2V5KSkK
KyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gdmFsdWVzOworICAgICAgICAgICAgICAgIGZv
ciAoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA6IGVudHJ5LnZhbHVlKSB7CisgICAgICAgICAg
ICAgICAgICAgIEFTU0VSVChyZWxhdGlvbnNoaXAubGVmdCgpID09IGVudHJ5LmtleSk7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChpc0xpdmUocmVsYXRpb25zaGlwLnJpZ2h0KCkpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkYXRhTG9nKCIgIFByb3BhZ2F0aW5nICIsIHJlbGF0aW9uc2hpcCwgIlxuIik7CisgICAg
ICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHJlbGF0aW9uc2hpcCk7CisgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgc3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICAg
ICAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdLmFkZChlbnRyeS5rZXks
IHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTWVyZ2UgYnkgaW50ZXJzZWN0aW5nLiBXZSBoYXZl
IG5vIG5vdGlvbiBvZiBCT1RUT00sIHNvIHdlIHVzZSB0aGUgb21pc3Npb24gb2YKKyAgICAgICAg
Ly8gcmVsYXRpb25zaGlwcyBmb3IgYSBwYWlyIG9mIG5vZGVzIHRvIG1lYW4gVE9QLiBUaGUgcmVh
c29uIHdoeSB3ZSBkb24ndCBuZWVkIEJPVFRPTQorICAgICAgICAvLyBpcyAoMSkgd2UganVzdCBv
dmVyYXBwcm94aW1hdGUgY29udHJhZGljdGlvbnMgYW5kICgyKSBhIHZhbHVlIG5ldmVyIGhhdmlu
ZyBiZWVuCisgICAgICAgIC8vIGFzc2lnbmVkIHdvdWxkIG9ubHkgaGFwcGVuIGlmIHdlIGhhdmUg
bm90IHByb2Nlc3NlZCB0aGUgbm9kZSdzIHByZWRlY2Vzc29yLiBXZQorICAgICAgICAvLyBzaG91
bGRuJ3QgcHJvY2VzcyBibG9ja3MgdW50aWwgd2UgaGF2ZSBwcm9jZXNzZWQgdGhlIGJsb2NrJ3Mg
cHJlZGVjZXNzb3IgYmVjYXVzZSB3ZQorICAgICAgICAvLyBhcmUgdXNpbmcgUlBPLgorICAgICAg
ICBWZWN0b3I8Tm9kZSo+IHRvUmVtb3ZlOworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsK
KyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRd
KSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSByZWxhdGlvbnNoaXBNYXAuZmluZChlbnRyeS5r
ZXkpOworICAgICAgICAgICAgaWYgKGl0ZXIgPT0gcmVsYXRpb25zaGlwTWFwLmVuZCgpKSB7Cisg
ICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGVudHJ5LmtleSk7CisgICAgICAgICAgICAg
ICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZlY3RvcjxSZWxhdGlvbnNoaXA+IHZhbHVl
czsKKyAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlwIHRhcmdldFJlbGF0aW9uc2hpcCA6IGVu
dHJ5LnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgc291cmNlUmVs
YXRpb25zaGlwIDogaXRlci0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJv
c2UpCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgIE1lcmdpbmcgIiwgdGFyZ2V0
UmVsYXRpb25zaGlwLCAiIGFuZCAiLCBzb3VyY2VSZWxhdGlvbnNoaXAsICI6XG4iKTsKKyAgICAg
ICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCA9CisgICAgICAgICAg
ICAgICAgICAgICAgICB0YXJnZXRSZWxhdGlvbnNoaXAubWVyZ2Uoc291cmNlUmVsYXRpb25zaGlw
KTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3Nl
KQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEdvdCAiLCBuZXdSZWxhdGlv
bnNoaXAsICJcbiIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFuZXdSZWxhdGlvbnNoaXApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8g
ZmlsdGVyKCkgdG8gYXZvaWQgZXhwb25lbnRpYWwgZXhwbG9zaW9uIG9mIGlkZW50aWNhbAorICAg
ICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXBzLiBXZSBkbyB0aGlzIGhlcmUgdG8gYXZv
aWQgbWFraW5nIHNldE9uZVNpZGUoKSBkbworICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHdv
cmssIHNpbmNlIHdlIGV4cGVjdCBzZXRPbmVTaWRlKCkgd2lsbCBiZSBjYWxsZWQgbW9yZQorICAg
ICAgICAgICAgICAgICAgICAvLyBmcmVxdWVudGx5LiBIZXJlJ3MgYW4gZXhhbXBsZS4gQXQgc29t
ZSBwb2ludCBzb21lb25lIG1pZ2h0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGgg
dHdvIHJlbGF0aW9uc2hpcHMgbGlrZSBAYSA+IEBiIC0gQyBhbmQgQGEgPCBAYiArIEQuIFRoZW4K
KyAgICAgICAgICAgICAgICAgICAgLy8gc29tZW9uZSBkb2VzIGEgc2V0UmVsYXRpb25zaGlwKCkg
cGFzc2luZyBzb21ldGhpbmcgdGhhdCB0dXJucworICAgICAgICAgICAgICAgICAgICAvLyBib3Ro
IG9mIHRoZXNlIGludG8gQGEgPT0gQGIuIE5vdyB3ZSBoYXZlIEBhID09IEBiIGR1cGxpY2F0ZWQu
CisgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIHNheSB0aGF0IHRoaXMgZHVwbGljYXRlIEBh
ID09IEBiIGVuZHMgdXAgYXQgdGhlIGhlYWQgb2YgYQorICAgICAgICAgICAgICAgICAgICAvLyBs
b29wLiBJZiB3ZSBkaWRuJ3QgaGF2ZSB0aGlzIHJ1bGUsIHRoZW4gdGhlIGxvb3Agd291bGQgcHJv
cGFnYXRlCisgICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBAYSA9PSBAYidzIG9udG8g
dGhlIGV4aXN0aW5nIGR1cGxpY2F0ZSBAYSA9PSBAYidzLgorICAgICAgICAgICAgICAgICAgICAv
LyBUaGVyZSB3b3VsZCBiZSBmb3VyIHBhaXJzIG9mIEBhID09IEBiLCBlYWNoIG9mIHdoaWNoIHdv
dWxkCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBAYSA9PSBAYi4gTm93IHdl
J2QgaGF2ZSBmb3VyIG9mIHRoZXNlIGR1cGxpY2F0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8g
YW5kIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHdlJ2QgaGF2ZSA4LCB0aGVuIDE2LCBldGMuIFdlIGF2
b2lkCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaGVyZSBieSBkb2luZyB0aGlzIGZpbHRy
YXRpb24uIFRoYXQgbWlnaHQgYmUgYSBiaXQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gb3Zl
cmtpbGwsIHNpbmNlIGl0J3MgcHJvYmFibHkganVzdCB0aGUgaWRlbnRpY2FsIGR1cGxpY2F0ZQor
ICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbnNoaXAgY2FzZSB3ZSB3YW50JyB0byBhdm9p
ZC4gQnV0LCBJJ2xsIGtlZXAgdGhpcyB1bnRpbAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBo
YXZlIGV2aWRlbmNlIHRoYXQgdGhpcyBpcyBhIHBlcmZvcm1hbmNlIHByb2JsZW0uIFJlbWVtYmVy
IC0KKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGFscmVhZHkgZGVhbGluZyB3aXRoIGEg
bGlzdCB0aGF0IGlzIHBydW5lZCBkb3duIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0
aW9uc2hpcHMgd2l0aCBpZGVudGljYWwgbGVmdCBvcGVyYW5kLiBJdCBzaG91bGRuJ3QgYmUgYQor
ICAgICAgICAgICAgICAgICAgICAvLyBsYXJnZSBsaXN0LgorICAgICAgICAgICAgICAgICAgICBi
b29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmVsYXRpb25zaGlw
JiBleGlzdGluZ1JlbGF0aW9uc2hpcCA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKGV4aXN0aW5nUmVsYXRpb25zaGlwLnNhbWVOb2Rlc0FzKG5ld1JlbGF0aW9uc2hpcCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgZmlsdGVyZWQgPQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlbGF0aW9uc2hpcC5maWx0
ZXIobmV3UmVsYXRpb25zaGlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmls
dGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWxhdGlv
bnNoaXAgPSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQg
PSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
IGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKG5ld1Jl
bGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgc3RkOjpzb3J0KHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICAgICAgICAgICAg
aWYgKGVudHJ5LnZhbHVlID09IHZhbHVlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZXM7CisgICAgICAgICAg
ICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKE5vZGUqIG5vZGUgOiB0
b1JlbW92ZSkKKyAgICAgICAgICAgIG1fcmVsYXRpb25zaGlwc0F0SGVhZFt0YXJnZXRdLnJlbW92
ZShub2RlKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgIH0KKyAgICAg
ICAgCisgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gc29ydGVkUmVsYXRpb25zaGlwcyhjb25zdCBS
ZWxhdGlvbnNoaXBNYXAmIHJlbGF0aW9uc2hpcHMpCisgICAgeworICAgICAgICBWZWN0b3I8UmVs
YXRpb25zaGlwPiByZXN1bHQ7CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiByZWxhdGlvbnNo
aXBzKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZFZlY3RvcihlbnRyeS52YWx1ZSk7CisgICAg
ICAgIHN0ZDo6c29ydChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpKTsKKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgVmVjdG9yPFJlbGF0aW9uc2hpcD4gc29ydGVk
UmVsYXRpb25zaGlwcygpCisgICAgeworICAgICAgICByZXR1cm4gc29ydGVkUmVsYXRpb25zaGlw
cyhtX3JlbGF0aW9uc2hpcHMpOworICAgIH0KKyAgICAKKyAgICBOb2RlKiBtX3plcm87CisgICAg
UmVsYXRpb25zaGlwTWFwIG1fcmVsYXRpb25zaGlwczsKKyAgICBCbG9ja1NldCBtX3NlZW5CbG9j
a3M7CisgICAgQmxvY2tNYXA8UmVsYXRpb25zaGlwTWFwPiBtX3JlbGF0aW9uc2hpcHNBdEhlYWQ7
CisgICAgSW5zZXJ0aW9uU2V0IG1faW5zZXJ0aW9uU2V0OworfTsKKyAgICAKK30gLy8gYW5vbnlt
b3VzIG5hbWVzcGFjZQorCitib29sIHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oR3Jh
cGgmIGdyYXBoKQoreworICAgIFNhbXBsaW5nUmVnaW9uIHNhbXBsaW5nUmVnaW9uKCJERkcgSW50
ZWdlciBSYW5nZSBPcHRpbWl6YXRpb24gUGhhc2UiKTsKKyAgICByZXR1cm4gcnVuUGhhc2U8SW50
ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2U+KGdyYXBoKTsKK30KKworfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0ludGVnZXJSYW5nZU9wdGlt
aXphdGlvblBoYXNlLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaWZuZGVmIERGR0ludGVnZXJSYW5nZU9wdGltaXphdGlvblBoYXNlX2gKKyNkZWZpbmUgREZH
SW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2VfaAorCisjaWYgRU5BQkxFKERGR19KSVQpCisK
K25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgREZHIHsKKworY2xhc3MgR3JhcGg7CisKKy8vIFJl
bW92ZXMgb3ZlcmZsb3cgY2hlY2tzIGFuZCBvdXQtb2YtYm91bmRzIGNoZWNrcyBieSBkb2luZyBh
IGZvcndhcmQgZmxvdyBhbmFseXNpcyB0byBwcm92ZQorLy8gaW5lcXVhbGl0aWVzLgorCitib29s
IHBlcmZvcm1JbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb24oR3JhcGgmKTsKKworfSB9IC8vIG5hbWVz
cGFjZSBKU0M6OkRGRworCisjZW5kaWYgLy8gRU5BQkxFKERGR19KSVQpCisKKyNlbmRpZiAvLyBE
RkdJbnRlZ2VyUmFuZ2VPcHRpbWl6YXRpb25QaGFzZV9oCisKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHUGxhbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdQbGFuLmNwcAkocmV2aXNpb24gMTg1NjE4KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdQbGFuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBAQAog
I2luY2x1ZGUgIkRGR0ZpeHVwUGhhc2UuaCIKICNpbmNsdWRlICJERkdHcmFwaFNhZmVwb2ludC5o
IgogI2luY2x1ZGUgIkRGR0ludGVnZXJDaGVja0NvbWJpbmluZ1BoYXNlLmgiCisjaW5jbHVkZSAi
REZHSW50ZWdlclJhbmdlT3B0aW1pemF0aW9uUGhhc2UuaCIKICNpbmNsdWRlICJERkdJbnZhbGlk
YXRpb25Qb2ludEluamVjdGlvblBoYXNlLmgiCiAjaW5jbHVkZSAiREZHSklUQ29tcGlsZXIuaCIK
ICNpbmNsdWRlICJERkdMSUNNUGhhc2UuaCIKQEAgLTM1Nyw2ICszNTgsOCBAQCBQbGFuOjpDb21w
aWxhdGlvblBhdGggUGxhbjo6Y29tcGlsZUluVGhyCiAgICAgICAgIHBlcmZvcm1Db25zdGFudEhv
aXN0aW5nKGRmZyk7CiAgICAgICAgIHBlcmZvcm1HbG9iYWxDU0UoZGZnKTsKICAgICAgICAgcGVy
Zm9ybUxpdmVuZXNzQW5hbHlzaXMoZGZnKTsKKyAgICAgICAgcGVyZm9ybUludGVnZXJSYW5nZU9w
dGltaXphdGlvbihkZmcpOworICAgICAgICBwZXJmb3JtTGl2ZW5lc3NBbmFseXNpcyhkZmcpOwog
ICAgICAgICBwZXJmb3JtQ0ZBKGRmZyk7CiAgICAgICAgIHBlcmZvcm1Db25zdGFudEZvbGRpbmco
ZGZnKTsKICAgICAgICAgcGVyZm9ybUNsZWFuVXAoZGZnKTsgLy8gUmVkdWNlIHRoZSBncmFwaCBz
aXplIGEgbG90LgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9hZGQt
b3ZlcmZsb3dzLWFmdGVyLW5vdC1lcXVhbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvdGVzdHMvc3RyZXNzL2FkZC1vdmVyZmxvd3MtYWZ0ZXItbm90LWVxdWFsLmpzCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9hZGQtb3Zl
cmZsb3dzLWFmdGVyLW5vdC1lcXVhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2IEBA
CitmdW5jdGlvbiBmb28oYSkgeworICAgIGlmIChhICE9IDApCisgICAgICAgIHJldHVybiBhICsg
MTsKK30KKworbm9JbmxpbmUoZm9vKTsKKworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwMDsgKytp
KSB7CisgICAgdmFyIHJlc3VsdCA9IGZvbyg0Mik7CisgICAgaWYgKHJlc3VsdCAhPSA0MykKKyAg
ICAgICAgdGhyb3cgIkVycm9yOiBiYWQgcmVzdWx0IGluIGxvb3A6ICIgKyByZXN1bHQ7Cit9CisK
K3ZhciByZXN1bHQgPSBmb28oMjE0NzQ4MzY0Nyk7CitpZiAocmVzdWx0ICE9IDIxNDc0ODM2NDgp
CisgICAgdGhyb3cgIkVycm9yOiBiYWQgcmVzdWx0IGF0IGVuZDogIiArIHJlc3VsdDsKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3Mvc3ViLW92ZXJmbG93cy1hZnRlci1u
b3QtZXF1YWwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0
cmVzcy9zdWItb3ZlcmZsb3dzLWFmdGVyLW5vdC1lcXVhbC5qcwkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3Mvc3ViLW92ZXJmbG93cy1hZnRlci1ub3Qt
ZXF1YWwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNiBAQAorZnVuY3Rpb24gZm9vKGEp
IHsKKyAgICBpZiAoYSAhPSAwKQorICAgICAgICByZXR1cm4gYSAtIDE7Cit9CisKK25vSW5saW5l
KGZvbyk7CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgeworICAgIHZhciByZXN1
bHQgPSBmb28oNDIpOworICAgIGlmIChyZXN1bHQgIT0gNDEpCisgICAgICAgIHRocm93ICJFcnJv
cjogYmFkIHJlc3VsdCBpbiBsb29wOiAiICsgcmVzdWx0OworfQorCit2YXIgcmVzdWx0ID0gZm9v
KC0yMTQ3NDgzNjQ4KTsKK2lmIChyZXN1bHQgIT0gLTIxNDc0ODM2NDkpCisgICAgdGhyb3cgIkVy
cm9yOiBiYWQgcmVzdWx0IGF0IGVuZDogIiArIHJlc3VsdDsKSW5kZXg6IExheW91dFRlc3RzL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4
NTYxOCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDI3IEBACisyMDE1LTA2LTEwICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAg
ICAgICAgRlRMIHNob3VsZCBlbGltaW5hdGUgYXJyYXkgYm91bmRzIGNoZWNrcyBpbiBsb29wcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1NzY4CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgQmVuamFtaW4gUG91bGFpbi4KKworICAgICAgICAqIGpzL3Jl
Z3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAg
ICAqIGpzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5odG1sOiBBZGRlZC4KKyAgICAg
ICAgKiBqcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0OiBB
ZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuaHRt
bDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3At
ZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFj
a3dhcmQtbG9vcC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2FiYy1zaW1wbGUt
Zm9yd2FyZC1sb29wLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9h
YmMtc2ltcGxlLWZvcndhcmQtbG9vcC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNz
L3NjcmlwdC10ZXN0cy9hYmMtZm9yd2FyZC1sb29wLWVxdWFsLmpzOiBBZGRlZC4KKyAgICAgICAg
KGZvbyk6CisgICAgICAgICoganMvcmVncmVzcy9zY3JpcHQtdGVzdHMvYWJjLXBvc3RmaXgtYmFj
a3dhcmQtbG9vcC5qczogQWRkZWQuCisgICAgICAgIChmb28pOgorICAgICAgICAqIGpzL3JlZ3Jl
c3Mvc2NyaXB0LXRlc3RzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC5qczogQWRkZWQuCisgICAg
ICAgIChmb28pOgorICAgICAgICAqIGpzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2FiYy1zaW1wbGUt
Zm9yd2FyZC1sb29wLmpzOiBBZGRlZC4KKyAgICAgICAgKGZvbyk6CisKIDIwMTUtMDYtMTYgIEJy
ZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBhcHBsZS5jb20+CiAKICAgICAgICAgVW5yZXZpZXdlZCB0
ZXN0IHVwZGF0ZTogQWRkIG11bHRpcGxlIHNjcm9sbC1zbmFwLWNvb3JkaW5hdGUgdGVzdC4KSW5k
ZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC1leHBlY3Rl
ZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtZm9yd2FyZC1s
b29wLWVxdWFsLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3Jl
Z3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwKKworT24g
c3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93
ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCisKK1BBU1Mgbm8gZXhjZXB0aW9uIHRocm93bgorUEFT
UyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExh
eW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLWZvcndhcmQtbG9vcC1lcXVhbC5odG1s
CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9hYmMtZm9yd2FyZC1sb29w
LWVxdWFsLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMiBAQAorPCFET0NUWVBFIEhU
TUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3Jp
cHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFk
PgorPGJvZHk+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcHJlLmpzIj48
L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvYWJjLWZvcndhcmQtbG9vcC1lcXVh
bC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcG9z
dC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9z
dC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXBvc3RmaXgtYmFja3dhcmQtbG9vcC1leHBl
Y3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1wb3N0
Zml4LWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTAgQEAKK0pTUmVncmVzcy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wCisKK09uIHN1Y2Nlc3Ms
IHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJU
RVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mgc3VjY2Vz
c2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuaHRtbAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuaHRtbAko
cmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXBvc3RmaXgtYmFja3dh
cmQtbG9vcC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBI
VE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2Ny
aXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVh
ZD4KKzxib2R5PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXByZS5qcyI+
PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL2FiYy1wb3N0Zml4LWJhY2t3YXJk
LWxvb3AuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNz
LXBvc3QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0
LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMv
anMvcmVncmVzcy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AtZXhwZWN0ZWQudHh0Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNp
bXBsZS1iYWNrd2FyZC1sb29wLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEwIEBACitKU1JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wCisKK09uIHN1Y2Nlc3Ms
IHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJU
RVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mgc3VjY2Vz
c2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1iYWNrd2FyZC1sb29wLmh0bWwJKHJl
dmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtYmFja3dhcmQt
bG9vcC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBIVE1M
IFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0
IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4K
Kzxib2R5PgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXByZS5qcyI+PC9z
Y3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL2FiYy1zaW1wbGUtYmFja3dhcmQtbG9v
cC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcG9z
dC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9z
dC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLWV4cGVjdGVk
LnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1m
b3J3YXJkLWxvb3AtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAgQEAK
K0pTUmVncmVzcy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcAorCitPbiBzdWNjZXNzLCB5b3Ugd2ls
bCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01Q
TEVURSIuCisKKworUEFTUyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBh
cnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVn
cmVzcy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuaHRtbAkocmV2aXNpb24gMCkK
KysrIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvYWJjLXNpbXBsZS1mb3J3YXJkLWxvb3AuaHRtbAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0v
L0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uLy4u
L3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxz
Y3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0PgorPHNj
cmlwdCBzcmM9InNjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWZvcndhcmQtbG9vcC5qcyI+PC9zY3Jp
cHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcG9zdC5qcyI+PC9zY3Jp
cHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3Jp
cHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3Njcmlw
dC10ZXN0cy9hYmMtZm9yd2FyZC1sb29wLWVxdWFsLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2FiYy1mb3J3YXJkLWxvb3AtZXF1YWwuanMJKHJl
dmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtZm9y
d2FyZC1sb29wLWVxdWFsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0
aW9uIGZvbyhhcnJheSkgeworICAgIHZhciByZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSAw
OyBpICE9IGFycmF5Lmxlbmd0aDsgKytpKQorICAgICAgICByZXN1bHQgKz0gYXJyYXlbaV07Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIGFycmF5ID0gW107
Citmb3IgKHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICBhcnJheS5wdXNoKGkpOworZm9y
ICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZvbyhhcnJheSk7CkluZGV4OiBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29w
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2Fi
Yy1wb3N0Zml4LWJhY2t3YXJkLWxvb3AuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9q
cy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtcG9zdGZpeC1iYWNrd2FyZC1sb29wLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0aW9uIGZvbyhhcnJheSkgeworICAgIHZh
ciByZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGg7IGktLTspCisgICAg
ICAgIHJlc3VsdCArPSBhcnJheVtpXTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitub0lubGlu
ZShmb28pOworCit2YXIgYXJyYXkgPSBbXTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDsgKytp
KQorICAgIGFycmF5LnB1c2goaSk7Citmb3IgKHZhciBpID0gMDsgaSA8IDUwMDAwOyArK2kpCisg
ICAgZm9vKGFycmF5KTsKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3Rz
L2FiYy1zaW1wbGUtYmFja3dhcmQtbG9vcC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9q
cy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWJhY2t3YXJkLWxvb3AuanMJKHJldmlz
aW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxl
LWJhY2t3YXJkLWxvb3AuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNCBAQAorZnVuY3Rp
b24gZm9vKGFycmF5KSB7CisgICAgdmFyIHJlc3VsdCA9IDA7CisgICAgZm9yICh2YXIgaSA9IGFy
cmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICByZXN1bHQgKz0gYXJyYXlbaV07
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworbm9JbmxpbmUoZm9vKTsKKwordmFyIGFycmF5ID0g
W107Citmb3IgKHZhciBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICBhcnJheS5wdXNoKGkpOwor
Zm9yICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgKytpKQorICAgIGZvbyhhcnJheSk7CkluZGV4OiBM
YXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9hYmMtc2ltcGxlLWZvcndhcmQtbG9v
cC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9h
YmMtc2ltcGxlLWZvcndhcmQtbG9vcC5qcwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pz
L3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2FiYy1zaW1wbGUtZm9yd2FyZC1sb29wLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTQgQEAKK2Z1bmN0aW9uIGZvbyhhcnJheSkgeworICAgIHZhciBy
ZXN1bHQgPSAwOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpCisg
ICAgICAgIHJlc3VsdCArPSBhcnJheVtpXTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitub0lu
bGluZShmb28pOworCit2YXIgYXJyYXkgPSBbXTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDsg
KytpKQorICAgIGFycmF5LnB1c2goaSk7Citmb3IgKHZhciBpID0gMDsgaSA8IDUwMDAwOyArK2kp
CisgICAgZm9vKGFycmF5KTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>