<?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>144348</bug_id>
          
          <creation_ts>2015-04-28 12:52:36 -0700</creation_ts>
          <short_desc>FTL should fully support Switch (it currently lacks the SwitchString variant)</short_desc>
          <delta_ts>2015-04-28 20:36:22 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>
          
          <blocked>132356</blocked>
    
    <blocked>144368</blocked>
    
    <blocked>144369</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</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>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1089691</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-04-28 12:52:36 -0700</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089783</commentid>
    <comment_count>1</comment_count>
      <attachid>251894</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-04-28 16:19:08 -0700</bug_when>
    <thetext>Created attachment 251894
work in progress

I think that I wrote the important parts.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089825</commentid>
    <comment_count>2</comment_count>
      <attachid>251909</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-04-28 18:21:46 -0700</bug_when>
    <thetext>Created attachment 251909
more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089833</commentid>
    <comment_count>3</comment_count>
      <attachid>251912</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-04-28 18:37:07 -0700</bug_when>
    <thetext>Created attachment 251912
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089834</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-04-28 18:38:51 -0700</bug_when>
    <thetext>Attachment 251912 did not pass style-queue:


ERROR: Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6211:  Multi line control clauses should use braces.  [whitespace/braces] [4]
Total errors found: 1 in 13 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089849</commentid>
    <comment_count>5</comment_count>
      <attachid>251912</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-04-28 19:29:17 -0700</bug_when>
    <thetext>Comment on attachment 251912
the patch

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

&gt; Source/JavaScriptCore/dfg/DFGCommon.cpp:49
&gt; +bool stringLessThan(StringImpl* a, StringImpl* b)

Should be StringImpl&amp;

&gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6214
&gt; +            for (
&gt; +                unsigned j = numChecked;
&gt; +                j &lt; std::min(cases[begin].string-&gt;length(), cases[i].string-&gt;length());
&gt; +                ++j) {

This is not particularly readable. 
It would probably look nicer if std::min(cases[begin].string-&gt;length(), cases[i].string-&gt;length()) was just stored in a temporary.

&gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6242
&gt; +            m_out.check(
&gt; +                m_out.notEqual(
&gt; +                    m_out.load8(buffer, m_heaps.characters8[i]),
&gt; +                    m_out.constInt8(cases[begin].string-&gt;at(i))),
&gt; +                unsure(fallThrough));

I wonder if LLVM can mutate this in whole-word load and compare.

&gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6268
&gt; +            switchStringRecurse(
&gt; +                data, buffer, length, cases, commonChars, begin + 1, end, minLength + 1, false);

Could be on one line.

&gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6300
&gt; +            switchCases.append(SwitchCase(
&gt; +                m_out.constInt8(characterCases[i].character), characterBlocks[i], Weight()));

Could be on one line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089854</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-04-28 19:46:58 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 251912 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=251912&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGCommon.cpp:49
&gt; &gt; +bool stringLessThan(StringImpl* a, StringImpl* b)
&gt; 
&gt; Should be StringImpl&amp;

I did this, and the code just became more awkward. Passing around StringImpl* is an idiom throughout the DFG/FTL. Using StringImpl&amp; here means that both callers have to convert. It&apos;s not clear that this is better.

&gt; 
&gt; &gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6214
&gt; &gt; +            for (
&gt; &gt; +                unsigned j = numChecked;
&gt; &gt; +                j &lt; std::min(cases[begin].string-&gt;length(), cases[i].string-&gt;length());
&gt; &gt; +                ++j) {
&gt; 
&gt; This is not particularly readable. 
&gt; It would probably look nicer if std::min(cases[begin].string-&gt;length(),
&gt; cases[i].string-&gt;length()) was just stored in a temporary.

Good call.

&gt; 
&gt; &gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6242
&gt; &gt; +            m_out.check(
&gt; &gt; +                m_out.notEqual(
&gt; &gt; +                    m_out.load8(buffer, m_heaps.characters8[i]),
&gt; &gt; +                    m_out.constInt8(cases[begin].string-&gt;at(i))),
&gt; &gt; +                unsure(fallThrough));
&gt; 
&gt; I wonder if LLVM can mutate this in whole-word load and compare.

What do you mean?  Like, converting multiple load-and-compare-byte&apos;s into a single load-and-compare-word?  There are probably super weird rules governing this.  Currently, LLVM emits something kind of gross:

      0x5a96e7603c9d: 	movzbl	2(%rax), %ecx
      0x5a96e7603ca1: 	cmpl	$97, %ecx
      0x5a96e7603ca4: 	jne	0x5a96e7603ce8

It&apos;s not clear why this isn&apos;t a cmpb.

&gt; 
&gt; &gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6268
&gt; &gt; +            switchStringRecurse(
&gt; &gt; +                data, buffer, length, cases, commonChars, begin + 1, end, minLength + 1, false);
&gt; 
&gt; Could be on one line.
&gt; 
&gt; &gt; Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:6300
&gt; &gt; +            switchCases.append(SwitchCase(
&gt; &gt; +                m_out.constInt8(characterCases[i].character), characterBlocks[i], Weight()));
&gt; 
&gt; Could be on one line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089869</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-04-28 20:34:40 -0700</bug_when>
    <thetext>This appears to be generally good. There are probably still opportunities for improving the FTL codegen, though. The main bug for that is https://bugs.webkit.org/show_bug.cgi?id=144369.

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 (r183523)
&quot;Terminals&quot; at /Volumes/Data/pizlo/primary/OpenSource/WebKitBuild/Release/jsc (r183523)

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                 Terminals                                     
SunSpider:
   3d-cube                                            5.3543+-0.3548            5.1802+-0.1009          might be 1.0336x faster
   3d-morph                                           5.9595+-0.3917            5.7491+-0.0912          might be 1.0366x faster
   3d-raytrace                                        6.6210+-0.1638            6.6015+-0.1482        
   access-binary-trees                                2.3643+-0.1516     ?      2.4142+-0.2575        ? might be 1.0211x slower
   access-fannkuch                                    6.1366+-0.1046            5.9721+-0.2269          might be 1.0275x faster
   access-nbody                                       2.8062+-0.0508     ?      3.1547+-0.3853        ? might be 1.1242x slower
   access-nsieve                                      3.4931+-0.1653            3.3087+-0.0532          might be 1.0557x faster
   bitops-3bit-bits-in-byte                           1.5824+-0.0587     ?      1.6420+-0.1949        ? might be 1.0377x slower
   bitops-bits-in-byte                                3.3286+-0.0358     ?      3.3493+-0.0308        ?
   bitops-bitwise-and                                 2.4613+-0.3675            2.2797+-0.2896          might be 1.0797x faster
   bitops-nsieve-bits                                 3.3494+-0.1084     ?      3.5010+-0.0440        ? might be 1.0453x slower
   controlflow-recursive                              2.2801+-0.0926     ?      2.6474+-0.9948        ? might be 1.1611x slower
   crypto-aes                                         4.4760+-0.1885            4.4671+-0.2250        
   crypto-md5                                         3.1236+-0.2565     ^      2.6996+-0.0987        ^ definitely 1.1571x faster
   crypto-sha1                                        2.8200+-0.3372            2.8170+-0.3394        
   date-format-tofte                                  9.1293+-0.0785     !      9.3199+-0.0705        ! definitely 1.0209x slower
   date-format-xparb                                  5.6182+-0.0931     ?      5.7032+-0.1303        ? might be 1.0151x slower
   math-cordic                                        3.1801+-0.0951     ^      3.0370+-0.0205        ^ definitely 1.0471x faster
   math-partial-sums                                  5.6758+-0.5938            5.1611+-0.1023          might be 1.0997x faster
   math-spectral-norm                                 1.8988+-0.0367     ?      2.1923+-0.3723        ? might be 1.1545x slower
   regexp-dna                                         8.0303+-1.2339            7.5879+-0.3587          might be 1.0583x faster
   string-base64                                      5.0626+-0.8457     ?      5.1441+-0.9787        ? might be 1.0161x slower
   string-fasta                                       6.8106+-0.6028            6.6533+-0.1993          might be 1.0236x faster
   string-tagcloud                                   10.2061+-0.5869            9.6366+-0.2065          might be 1.0591x faster
   string-unpack-code                                19.4661+-0.4855           19.2476+-0.1938          might be 1.0114x faster
   string-validate-input                              4.9673+-0.1107            4.8568+-0.0529          might be 1.0227x faster

   &lt;arithmetic&gt;                                       5.2385+-0.0658            5.1663+-0.0207          might be 1.0140x faster

                                                        TipOfTree                 Terminals                                     
LongSpider:
   3d-cube                                          874.1553+-14.6006         873.9714+-9.4267        
   3d-morph                                        1527.2032+-1.4312     ?   1527.8996+-2.4811        ?
   3d-raytrace                                      729.5059+-6.5604     ?    741.5318+-6.0231        ? might be 1.0165x slower
   access-binary-trees                             1033.6076+-7.2170     ?   1036.3295+-4.9198        ?
   access-fannkuch                                  333.6738+-8.6508          328.2607+-8.2592          might be 1.0165x faster
   access-nbody                                     610.1186+-1.0428     ?    610.9359+-2.4936        ?
   access-nsieve                                    878.3144+-7.0189     ^    857.3562+-8.5277        ^ definitely 1.0244x faster
   bitops-3bit-bits-in-byte                          45.9904+-3.4009           44.5866+-0.6467          might be 1.0315x faster
   bitops-bits-in-byte                              101.0753+-1.3525          100.9071+-1.4578        
   bitops-nsieve-bits                               637.4696+-3.6806          636.5802+-4.4428        
   controlflow-recursive                            479.9611+-1.8852     ?    484.0185+-2.5203        ?
   crypto-aes                                       704.7030+-7.5512          704.4341+-7.8390        
   crypto-md5                                       528.8409+-12.8919         516.0682+-5.6817          might be 1.0248x faster
   crypto-sha1                                      602.9231+-17.1810         599.3675+-3.2430        
   date-format-tofte                                748.4829+-15.0739    ?    819.7740+-185.0228      ? might be 1.0952x slower
   date-format-xparb                                782.6889+-18.5365         770.1645+-21.8697         might be 1.0163x faster
   math-cordic                                      591.3864+-2.8311          590.3917+-1.6318        
   math-partial-sums                                506.8916+-2.2305          503.9038+-2.1031        
   math-spectral-norm                               565.7580+-2.6590          564.2144+-2.3893        
   string-base64                                    378.3989+-7.2973          374.0896+-6.6529          might be 1.0115x faster
   string-fasta                                     437.4173+-2.7056          437.3315+-4.7366        
   string-tagcloud                                  224.3921+-2.8835     ^    214.8813+-1.4074        ^ definitely 1.0443x faster

   &lt;geometric&gt;                                      497.2868+-2.0832          495.4879+-4.3402          might be 1.0036x faster

                                                        TipOfTree                 Terminals                                     
V8Spider:
   crypto                                            55.1071+-1.9533     ?     55.9237+-2.1187        ? might be 1.0148x slower
   deltablue                                        103.6455+-20.8532          98.2136+-5.2241          might be 1.0553x faster
   earley-boyer                                      44.8873+-1.3239     ?     45.4948+-0.9255        ? might be 1.0135x slower
   raytrace                                          41.6949+-1.9005           40.3507+-2.1623          might be 1.0333x faster
   regexp                                            80.3903+-1.6702     ?     83.7220+-2.6260        ? might be 1.0414x slower
   richards                                          79.8234+-0.6533           79.6188+-2.7412        
   splay                                             39.2321+-0.9938           39.1759+-1.8225        

   &lt;geometric&gt;                                       59.5556+-1.8556           59.4438+-0.8604          might be 1.0019x faster

                                                        TipOfTree                 Terminals                                     
Octane:
   encrypt                                           0.20376+-0.00182    ?     0.20473+-0.00218       ?
   decrypt                                           3.56558+-0.02625    ?     3.57213+-0.01568       ?
   deltablue                                x2       0.20806+-0.00323          0.20801+-0.00115       
   earley                                            0.53938+-0.00404          0.53903+-0.00754       
   boyer                                             6.69160+-0.03336          6.66578+-0.04062       
   navier-stokes                            x2       5.22408+-0.13524          5.19022+-0.03152       
   raytrace                                 x2       1.26482+-0.04865    ?     1.28234+-0.04380       ? might be 1.0138x slower
   richards                                 x2       0.12282+-0.00066    ?     0.12413+-0.00344       ? might be 1.0107x slower
   splay                                    x2       0.39894+-0.00038    ?     0.39957+-0.00350       ?
   regexp                                   x2      34.20295+-6.04788         31.57183+-0.10591         might be 1.0833x faster
   pdfjs                                    x2      43.56107+-0.36633    ?    43.89870+-0.20334       ?
   mandreel                                 x2      50.27427+-0.42446    ?    50.36641+-0.24247       ?
   gbemu                                    x2      41.66389+-0.32640    ?    42.12281+-0.83950       ? might be 1.0110x slower
   closure                                           0.55669+-0.00279          0.55504+-0.00200       
   jquery                                            7.06367+-0.01208    ^     7.01817+-0.02159       ^ definitely 1.0065x faster
   box2d                                    x2      12.26414+-0.05100    !    12.40304+-0.05474       ! definitely 1.0113x slower
   zlib                                     x2     393.75937+-2.59497        393.65640+-3.11857       
   typescript                               x2     831.85677+-7.85343        827.71370+-13.46260      

   &lt;geometric&gt;                                       6.73876+-0.07661          6.72592+-0.01912         might be 1.0019x faster

                                                        TipOfTree                 Terminals                                     
Kraken:
   ai-astar                                          271.553+-2.789            269.685+-1.419         
   audio-beat-detection                              107.219+-0.416            106.822+-0.967         
   audio-dft                                         148.165+-3.214      ?     151.206+-4.127         ? might be 1.0205x slower
   audio-fft                                          80.992+-1.404      ?      83.386+-4.045         ? might be 1.0296x slower
   audio-oscillator                                  207.298+-2.139      ?     207.578+-1.864         ?
   imaging-darkroom                                  105.222+-1.783            104.926+-1.798         
   imaging-desaturate                                 63.251+-1.423             63.241+-1.574         
   imaging-gaussian-blur                             113.191+-2.040      ?     113.397+-1.748         ?
   json-parse-financial                               56.222+-1.904      ^      45.671+-2.117         ^ definitely 1.2310x faster
   json-stringify-tinderbox                           57.459+-2.007      ?      57.560+-2.162         ?
   stanford-crypto-aes                                65.285+-0.840             64.933+-0.654         
   stanford-crypto-ccm                                55.403+-0.535             54.941+-0.537         
   stanford-crypto-pbkdf2                            168.524+-2.143      ?     171.076+-2.877         ? might be 1.0151x slower
   stanford-crypto-sha256-iterative                   55.034+-1.474      ?      56.026+-1.651         ? might be 1.0180x slower

   &lt;arithmetic&gt;                                      111.058+-0.310            110.746+-0.482           might be 1.0028x faster

                                                        TipOfTree                 Terminals                                     
JSRegress:
   abs-boolean                                        2.6748+-0.0547     ?      2.7028+-0.1269        ? might be 1.0105x slower
   adapt-to-double-divide                            16.8320+-0.5143     ?     16.9319+-0.7521        ?
   aliased-arguments-getbyval                         1.2622+-0.0646            1.2192+-0.0207          might be 1.0353x faster
   allocate-big-object                                2.8846+-0.1676     ?      3.0803+-0.5389        ? might be 1.0678x slower
   arguments-named-and-reflective                    12.6722+-0.3151     ?     13.5960+-1.2742        ? might be 1.0729x slower
   arguments-out-of-bounds                           14.6987+-0.1280     !     15.0413+-0.1904        ! definitely 1.0233x slower
   arguments-strict-mode                             12.7061+-1.5184           11.9705+-1.0020          might be 1.0615x faster
   arguments                                         10.9130+-1.0913     ?     11.0470+-1.1746        ? might be 1.0123x slower
   arity-mismatch-inlining                            0.8642+-0.0511     ?      0.9539+-0.2793        ? might be 1.1038x slower
   array-access-polymorphic-structure                 6.9828+-0.3438     ?      7.0872+-0.4011        ? might be 1.0150x slower
   array-nonarray-polymorhpic-access                 33.3645+-1.5401     ?     34.6131+-1.6635        ? might be 1.0374x slower
   array-prototype-every                             90.5893+-1.0248     ^     87.1557+-1.6225        ^ definitely 1.0394x faster
   array-prototype-forEach                           87.1612+-2.0687     ?     87.3557+-2.2626        ?
   array-prototype-map                               98.0798+-1.3631           93.7365+-3.2327          might be 1.0463x faster
   array-prototype-some                              90.5638+-1.3956           90.2819+-2.1775        
   array-splice-contiguous                           40.9797+-0.6826     ?     42.2029+-1.6058        ? might be 1.0298x slower
   array-with-double-add                              4.3008+-0.1901            4.0951+-0.0742          might be 1.0502x faster
   array-with-double-increment                        3.1980+-0.0271     ?      3.2689+-0.0642        ? might be 1.0222x slower
   array-with-double-mul-add                          5.1099+-0.2681            5.0349+-0.0997          might be 1.0149x faster
   array-with-double-sum                              3.2804+-0.0274     ?      3.4484+-0.4016        ? might be 1.0512x slower
   array-with-int32-add-sub                           7.4794+-1.8582            6.8204+-0.1154          might be 1.0966x faster
   array-with-int32-or-double-sum                     3.3136+-0.0300            3.3055+-0.0410        
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     37.8524+-6.9794     ?     39.0662+-1.7577        ? might be 1.0321x slower
   ArrayBuffer-DataView-alloc-long-lived             14.6647+-1.7984     !     17.6277+-0.9519        ! definitely 1.2021x slower
   ArrayBuffer-Int32Array-byteOffset                  3.8673+-0.0999     ?      3.9336+-0.2830        ? might be 1.0171x slower
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     34.2815+-2.8311           32.8380+-0.9591          might be 1.0440x faster
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     24.5369+-2.0046           23.9162+-1.7467          might be 1.0260x faster
   ArrayBuffer-Int8Array-alloc-long-lived            13.7998+-1.7044     ?     14.0795+-1.6301        ? might be 1.0203x slower
   ArrayBuffer-Int8Array-alloc                       11.5745+-1.2511     ?     12.3962+-1.9041        ? might be 1.0710x slower
   asmjs_bool_bug                                     7.9771+-0.2937            7.6560+-0.1023          might be 1.0419x faster
   assign-custom-setter-polymorphic                   3.1385+-0.0570     ?      3.1853+-0.4096        ? might be 1.0149x slower
   assign-custom-setter                               4.5199+-0.2481            4.1438+-0.1326          might be 1.0908x faster
   basic-set                                          8.6023+-0.2689     ?      8.7197+-0.5806        ? might be 1.0137x slower
   big-int-mul                                        4.0173+-0.0758     ?      4.1272+-0.4603        ? might be 1.0274x slower
   boolean-test                                       3.2784+-0.3903            3.0503+-0.0396          might be 1.0748x faster
   branch-fold                                        3.7240+-0.0570     ?      3.8177+-0.3189        ? might be 1.0252x slower
   branch-on-string-as-boolean                       19.4287+-1.4203     ?     19.8091+-1.3357        ? might be 1.0196x slower
   by-val-generic                                     8.0669+-0.3758            8.0156+-0.4390        
   call-spread-apply                                 30.5898+-1.2614           30.4508+-1.3060        
   call-spread-call                                  24.7109+-0.6061     ?     24.7463+-0.3133        ?
   captured-assignments                               0.4750+-0.0971     ?      0.4788+-0.0284        ?
   cast-int-to-double                                 5.3840+-0.2658            5.2672+-0.0298          might be 1.0222x faster
   cell-argument                                      8.5710+-0.2864            8.5387+-0.2229        
   cfg-simplify                                       3.1154+-0.1437            3.0387+-0.1092          might be 1.0252x faster
   chain-getter-access                               11.2305+-3.0223            9.9807+-0.1025          might be 1.1252x faster
   cmpeq-obj-to-obj-other                            11.0646+-1.1299     ?     11.7672+-1.3661        ? might be 1.0635x slower
   constant-test                                      4.9379+-0.0264     ?      4.9494+-0.0351        ?
   create-lots-of-functions                          11.7059+-0.3221     ?     11.8120+-0.4339        ?
   DataView-custom-properties                        39.7018+-1.9457     !     44.3875+-0.7322        ! definitely 1.1180x slower
   deconstructing-parameters-overridden-by-function   
                                                      0.5103+-0.0390     ?      0.5149+-0.0671        ?
   delay-tear-off-arguments-strictmode               14.5728+-1.1654           14.5353+-1.0030        
   deltablue-varargs                                203.4777+-3.3522          203.0190+-1.9222        
   destructuring-arguments                           17.8840+-0.7646     ?     18.2347+-1.1878        ? might be 1.0196x slower
   destructuring-swap                                 5.0677+-0.0315     ?      5.1081+-0.0994        ?
   direct-arguments-getbyval                          1.2841+-0.1673            1.2815+-0.1616        
   div-boolean-double                                 5.2168+-0.0380     ?      5.2436+-0.0512        ?
   div-boolean                                        7.8272+-0.0646     ?      7.8385+-0.1263        ?
   double-get-by-val-out-of-bounds                    4.5444+-0.0831     ?      4.6110+-0.0704        ? might be 1.0147x slower
   double-pollution-getbyval                          8.8482+-0.0525     ?      8.9486+-0.2063        ? might be 1.0114x slower
   double-pollution-putbyoffset                       4.4757+-0.4607     ?      4.5290+-0.2026        ? might be 1.0119x slower
   double-to-int32-typed-array-no-inline              2.2733+-0.0888            2.2666+-0.0540        
   double-to-int32-typed-array                        1.9022+-0.0256     ?      1.9474+-0.0743        ? might be 1.0238x slower
   double-to-uint32-typed-array-no-inline             2.4384+-0.2560            2.3394+-0.2742          might be 1.0423x faster
   double-to-uint32-typed-array                       2.0805+-0.1404            2.0356+-0.1096          might be 1.0221x faster
   elidable-new-object-dag                           43.4681+-1.6821     ?     44.9207+-1.8449        ? might be 1.0334x slower
   elidable-new-object-roflcopter                    47.7045+-2.6726           46.5331+-0.7936          might be 1.0252x faster
   elidable-new-object-then-call                     38.7701+-1.0755     ?     39.5025+-1.9359        ? might be 1.0189x slower
   elidable-new-object-tree                          47.5940+-3.2415           45.8630+-1.7272          might be 1.0377x faster
   empty-string-plus-int                              5.5282+-0.1148     ?      5.5374+-0.2167        ?
   emscripten-cube2hash                              40.3355+-1.9809           38.7348+-1.2565          might be 1.0413x faster
   exit-length-on-plain-object                       15.7105+-2.3431           14.5216+-1.1599          might be 1.0819x faster
   external-arguments-getbyval                        1.3368+-0.1155            1.2714+-0.0560          might be 1.0514x faster
   external-arguments-putbyval                        2.3499+-0.1222            2.2948+-0.0577          might be 1.0240x faster
   fixed-typed-array-storage-var-index                1.3031+-0.1545            1.2826+-0.1530          might be 1.0160x faster
   fixed-typed-array-storage                          0.9422+-0.0796            0.9270+-0.0525          might be 1.0163x faster
   Float32Array-matrix-mult                           4.5040+-0.1303     ?      4.6139+-0.4878        ? might be 1.0244x slower
   Float32Array-to-Float64Array-set                  55.6069+-1.6692     ?     57.6822+-1.9317        ? might be 1.0373x slower
   Float64Array-alloc-long-lived                     74.5455+-2.3756           73.9613+-2.0857        
   Float64Array-to-Int16Array-set                    69.9509+-0.2347           69.4741+-1.6717        
   fold-double-to-int                                13.2622+-0.1791     ?     13.6732+-0.3782        ? might be 1.0310x slower
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     11.5358+-1.3182           11.4169+-2.1288          might be 1.0104x faster
   fold-get-by-id-to-multi-get-by-offset             10.2603+-0.6220           10.2065+-1.0509        
   fold-multi-get-by-offset-to-get-by-offset   
                                                      9.6280+-0.9382     ?      9.6835+-1.1025        ?
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                      9.9385+-0.8200            9.2304+-1.3560          might be 1.0767x faster
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                      9.2130+-0.8638     ?      9.5136+-1.0404        ? might be 1.0326x slower
   fold-multi-put-by-offset-to-put-by-offset   
                                                      5.0787+-0.9761     ?      5.7345+-1.2134        ? might be 1.1291x slower
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                     10.0735+-0.4310     ?     10.5248+-1.0726        ? might be 1.0448x slower
   fold-put-by-id-to-multi-put-by-offset             10.8592+-1.3351           10.1503+-1.1576          might be 1.0698x faster
   fold-put-structure                                 4.1205+-0.1486     !      5.4808+-0.8417        ! definitely 1.3301x slower
   for-of-iterate-array-entries                       4.7305+-0.1185     ?      4.7675+-0.3292        ?
   for-of-iterate-array-keys                          3.7697+-0.1004            3.7624+-0.1343        
   for-of-iterate-array-values                        3.8255+-0.3107            3.8249+-0.3718        
   fround                                            21.1401+-0.8072     ?     21.5707+-0.6276        ? might be 1.0204x slower
   ftl-library-inlining-dataview                     66.4744+-2.7873     ?     68.6969+-3.4656        ? might be 1.0334x slower
   ftl-library-inlining                              67.4517+-2.2149     ?     72.8828+-15.8915       ? might be 1.0805x slower
   function-dot-apply                                 2.1917+-0.0228     ?      2.2064+-0.1084        ?
   function-test                                      3.5903+-0.4370            3.3213+-0.0413          might be 1.0810x faster
   function-with-eval                               103.7676+-2.3764     ?    106.5173+-3.1287        ? might be 1.0265x slower
   gcse-poly-get-less-obvious                        18.3383+-0.7236           18.1753+-0.4995        
   gcse-poly-get                                     22.0983+-2.2052           21.2064+-1.6252          might be 1.0421x faster
   gcse                                               4.2967+-0.0744     ?      4.3157+-0.0562        ?
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      2.7678+-0.0711            2.7125+-0.0468          might be 1.0204x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                      6.1802+-0.3784            6.0406+-0.1792          might be 1.0231x faster
   get-by-id-chain-from-try-block                     6.5776+-0.1729     ?      7.3235+-1.2094        ? might be 1.1134x slower
   get-by-id-check-structure-elimination              5.1184+-0.0392     ?      5.1349+-0.1155        ?
   get-by-id-proto-or-self                           17.0965+-1.0342           16.9502+-0.6220        
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      3.2653+-0.2320            3.2369+-0.2349        
   get-by-id-self-or-proto                           17.2513+-0.7330     ?     17.5508+-0.4209        ? might be 1.0174x slower
   get-by-val-out-of-bounds                           4.3920+-0.0865     ?      4.4508+-0.1316        ? might be 1.0134x slower
   get_callee_monomorphic                             2.8787+-0.0879            2.8350+-0.0505          might be 1.0154x faster
   get_callee_polymorphic                             3.9651+-0.4066     ?      4.1114+-0.4812        ? might be 1.0369x slower
   getter-no-activation                               4.9266+-0.1621     ?      5.0208+-0.2617        ? might be 1.0191x slower
   getter-richards                                  124.4921+-7.0920     ?    126.4354+-9.0568        ? might be 1.0156x slower
   getter                                             6.1124+-0.7415            5.7592+-0.8499          might be 1.0613x faster
   global-var-const-infer-fire-from-opt               0.9967+-0.0556            0.9851+-0.0792          might be 1.0117x faster
   global-var-const-infer                             0.7846+-0.0927     ?      0.8092+-0.1171        ? might be 1.0313x slower
   HashMap-put-get-iterate-keys                      26.3253+-0.4601     ?     26.4456+-0.4670        ?
   HashMap-put-get-iterate                           26.1915+-0.2845     ?     26.4290+-0.3790        ?
   HashMap-string-put-get-iterate                    27.2035+-0.6849     ?     27.9698+-1.4364        ? might be 1.0282x slower
   hoist-make-rope                                   13.1993+-1.2698           12.1194+-0.7804          might be 1.0891x faster
   hoist-poly-check-structure-effectful-loop   
                                                      5.2686+-0.2791            5.1731+-0.2625          might be 1.0184x faster
   hoist-poly-check-structure                         3.8122+-0.2859            3.6575+-0.0365          might be 1.0423x faster
   imul-double-only                                   8.9667+-0.7078     ?      9.0523+-0.8701        ?
   imul-int-only                                     10.0442+-0.6035            9.8386+-0.2487          might be 1.0209x faster
   imul-mixed                                         8.4321+-0.2643            8.2791+-0.1785          might be 1.0185x faster
   in-four-cases                                     20.6042+-0.2633           20.5675+-0.2130        
   in-one-case-false                                 10.4448+-0.8932     ?     10.6485+-0.7448        ? might be 1.0195x slower
   in-one-case-true                                  10.3568+-0.6635           10.2627+-0.5078        
   in-two-cases                                      10.5717+-0.5969           10.3499+-0.2955          might be 1.0214x faster
   indexed-properties-in-objects                      3.1556+-0.2508            3.0012+-0.1151          might be 1.0515x faster
   infer-closure-const-then-mov-no-inline             3.8637+-0.0308     ?      3.8758+-0.0434        ?
   infer-closure-const-then-mov                      19.7024+-0.1977           19.6564+-0.2236        
   infer-closure-const-then-put-to-scope-no-inline   
                                                     14.1866+-0.9840     ?     14.2634+-0.8101        ?
   infer-closure-const-then-put-to-scope             22.6101+-1.7351     ?     23.1429+-1.5286        ? might be 1.0236x slower
   infer-closure-const-then-reenter-no-inline   
                                                     62.0937+-0.7669     ?     62.6497+-0.7914        ?
   infer-closure-const-then-reenter                  23.4227+-0.9684     ?     23.5657+-2.0214        ?
   infer-constant-global-property                    31.3488+-1.8036           31.2987+-1.5027        
   infer-constant-property                            2.9745+-0.3990            2.7082+-0.0212          might be 1.0983x faster
   infer-one-time-closure-ten-vars                   13.9141+-1.6768           12.3693+-0.2336          might be 1.1249x faster
   infer-one-time-closure-two-vars                   13.6365+-1.7756           13.3428+-1.1640          might be 1.0220x faster
   infer-one-time-closure                            12.9135+-1.1277     ?     12.9140+-0.8865        ?
   infer-one-time-deep-closure                       21.3886+-1.7792     ?     22.0115+-1.7834        ? might be 1.0291x slower
   inline-arguments-access                            4.6584+-0.2760     ?      4.7167+-0.2122        ? might be 1.0125x slower
   inline-arguments-aliased-access                    4.7278+-0.2187            4.6014+-0.0453          might be 1.0275x faster
   inline-arguments-local-escape                      4.7021+-0.1508     ?      4.9007+-0.1235        ? might be 1.0422x slower
   inline-get-scoped-var                              5.0772+-0.3841            4.8327+-0.1583          might be 1.0506x faster
   inlined-put-by-id-transition                      11.9243+-0.6408           11.9008+-0.6428        
   int-or-other-abs-then-get-by-val                   4.8024+-0.2169            4.7111+-0.1257          might be 1.0194x faster
   int-or-other-abs-zero-then-get-by-val             17.2363+-0.3287     ?     18.0448+-1.5431        ? might be 1.0469x slower
   int-or-other-add-then-get-by-val                   4.3003+-0.0531     ?      4.5269+-0.2877        ? might be 1.0527x slower
   int-or-other-add                                   5.2904+-0.0362     ?      5.3428+-0.1078        ?
   int-or-other-div-then-get-by-val                   4.4141+-0.2559            4.3312+-0.1403          might be 1.0191x faster
   int-or-other-max-then-get-by-val                   4.4001+-0.0501            4.3277+-0.0313          might be 1.0167x faster
   int-or-other-min-then-get-by-val                   4.3872+-0.0422     ?      4.5638+-0.5393        ? might be 1.0403x slower
   int-or-other-mod-then-get-by-val                   3.9639+-0.0376     ?      3.9950+-0.0913        ?
   int-or-other-mul-then-get-by-val                   4.0305+-0.1750            3.9285+-0.0610          might be 1.0260x faster
   int-or-other-neg-then-get-by-val                   4.4786+-0.0494     ?      4.5859+-0.2239        ? might be 1.0240x slower
   int-or-other-neg-zero-then-get-by-val             18.1554+-1.4256           17.5907+-1.1918          might be 1.0321x faster
   int-or-other-sub-then-get-by-val                   4.6995+-0.2828            4.5116+-0.0586          might be 1.0416x faster
   int-or-other-sub                                   3.5482+-0.0387     ?      3.6148+-0.3583        ? might be 1.0188x slower
   int-overflow-local                                 4.5832+-0.3516            4.5497+-0.1984        
   Int16Array-alloc-long-lived                       53.4273+-1.3685           53.0343+-1.9862        
   Int16Array-bubble-sort-with-byteLength            20.2749+-0.1740     ?     21.1253+-1.5050        ? might be 1.0419x slower
   Int16Array-bubble-sort                            19.8651+-0.3189     ?     20.1002+-1.1495        ? might be 1.0118x slower
   Int16Array-load-int-mul                            1.5019+-0.0582     ?      1.5894+-0.2384        ? might be 1.0582x slower
   Int16Array-to-Int32Array-set                      52.4190+-2.1994     !     56.3946+-0.4760        ! definitely 1.0758x slower
   Int32Array-alloc-large                            24.6608+-1.0729           24.5356+-0.9581        
   Int32Array-alloc-long-lived                       57.9063+-1.0319           57.7856+-1.3952        
   Int32Array-alloc                                   3.7441+-0.4869            3.5340+-0.1684          might be 1.0594x faster
   Int32Array-Int8Array-view-alloc                    7.5746+-0.8337            7.2794+-0.8385          might be 1.0405x faster
   int52-spill                                        6.2711+-0.0850     ?      6.4707+-0.1310        ? might be 1.0318x slower
   Int8Array-alloc-long-lived                        48.0685+-1.3242           47.8883+-1.3372        
   Int8Array-load-with-byteLength                     3.6593+-0.4495            3.3636+-0.1234          might be 1.0879x faster
   Int8Array-load                                     3.3409+-0.0831            3.3260+-0.0625        
   integer-divide                                    11.2454+-0.2836           11.0526+-0.0902          might be 1.0174x faster
   integer-modulo                                     2.0011+-0.0875     ?      2.0627+-0.2802        ? might be 1.0308x slower
   large-int-captured                                 4.6508+-0.0562            4.5833+-0.0401          might be 1.0147x faster
   large-int-neg                                     16.3036+-0.3042     ?     16.5643+-0.7709        ? might be 1.0160x slower
   large-int                                         15.4900+-0.8742     ?     15.8624+-1.8426        ? might be 1.0240x slower
   logical-not                                        4.5222+-0.0785            4.5186+-0.0442        
   lots-of-fields                                    13.3108+-0.3085     ?     14.4874+-2.3588        ? might be 1.0884x slower
   make-indexed-storage                               3.1751+-0.0491     ?      3.2263+-0.4732        ? might be 1.0161x slower
   make-rope-cse                                      4.6630+-0.0547     ?      5.1268+-0.5102        ? might be 1.0995x slower
   marsaglia-larger-ints                             36.6963+-1.1585           35.8216+-0.3260          might be 1.0244x faster
   marsaglia-osr-entry                               23.0338+-0.3296     ?     23.7320+-1.3635        ? might be 1.0303x slower
   max-boolean                                        2.4413+-0.0575     ?      2.5144+-0.0920        ? might be 1.0300x slower
   method-on-number                                  18.1484+-0.2958           17.8257+-0.1657          might be 1.0181x faster
   min-boolean                                        2.4942+-0.0680     ?      2.5542+-0.1086        ? might be 1.0240x slower
   minus-boolean-double                               3.2667+-0.1601            3.2046+-0.0430          might be 1.0194x faster
   minus-boolean                                      2.3449+-0.0871     ?      2.4336+-0.3876        ? might be 1.0378x slower
   misc-strict-eq                                    38.2471+-2.1430           37.9819+-1.2772        
   mod-boolean-double                                11.4400+-1.4171           11.0592+-0.1971          might be 1.0344x faster
   mod-boolean                                        7.8496+-0.0298     ?      7.8866+-0.0923        ?
   mul-boolean-double                                 3.8579+-0.3733     ?      3.9023+-0.3104        ? might be 1.0115x slower
   mul-boolean                                        2.8420+-0.0289     ?      3.0050+-0.3141        ? might be 1.0574x slower
   neg-boolean                                        3.2876+-0.3643     ?      3.3437+-0.3623        ? might be 1.0171x slower
   negative-zero-divide                               0.3592+-0.0234     ?      0.3683+-0.0581        ? might be 1.0255x slower
   negative-zero-modulo                               0.3671+-0.0435            0.3664+-0.0670        
   negative-zero-negate                               0.3267+-0.0133     ?      0.3587+-0.0796        ? might be 1.0982x slower
   nested-function-parsing                           39.3559+-1.8256     ?     43.6181+-7.7991        ? might be 1.1083x slower
   new-array-buffer-dead                            112.1038+-2.5414     ?    112.9250+-2.2069        ?
   new-array-buffer-push                              7.4660+-0.8606     ?      7.8741+-0.7084        ? might be 1.0547x slower
   new-array-dead                                    19.5510+-0.3984           19.5157+-0.7147        
   new-array-push                                     4.3523+-0.9975            4.1925+-0.3851          might be 1.0381x faster
   no-inline-constructor                            124.9724+-2.5215     ?    126.5118+-1.4425        ? might be 1.0123x slower
   number-test                                        3.0006+-0.0408     ?      3.0303+-0.0897        ?
   object-closure-call                                5.6276+-0.1009            5.5819+-0.0204        
   object-test                                        3.1141+-0.0459     ?      3.2059+-0.2828        ? might be 1.0295x slower
   obvious-sink-pathology-taken                     140.4048+-2.2576     ?    140.6861+-1.7339        ?
   obvious-sink-pathology                           132.7371+-1.9195          131.8789+-2.0809        
   obviously-elidable-new-object                     36.3644+-1.5924           35.9536+-1.8046          might be 1.0114x faster
   plus-boolean-arith                                 2.4712+-0.0365     ?      2.4965+-0.0656        ? might be 1.0103x slower
   plus-boolean-double                                3.2000+-0.0444     ?      3.2367+-0.1426        ? might be 1.0115x slower
   plus-boolean                                       2.4311+-0.1545            2.4182+-0.1152        
   poly-chain-access-different-prototypes-simple   
                                                      3.2846+-0.0631            3.2826+-0.0432        
   poly-chain-access-different-prototypes             2.6753+-0.1538            2.5666+-0.0354          might be 1.0424x faster
   poly-chain-access-simpler                          3.3130+-0.1034            3.3084+-0.0603        
   poly-chain-access                                  2.7238+-0.2898            2.6377+-0.1380          might be 1.0327x faster
   poly-stricteq                                     62.0871+-0.5762     ?     62.5262+-0.8359        ?
   polymorphic-array-call                             1.2348+-0.0468     ?      1.2923+-0.1806        ? might be 1.0466x slower
   polymorphic-get-by-id                              3.2546+-0.3721     ?      3.2621+-0.3877        ?
   polymorphic-put-by-id                             29.3740+-2.4701     ?     29.8955+-2.4562        ? might be 1.0178x slower
   polymorphic-structure                             15.3610+-1.0582           14.9816+-0.3282          might be 1.0253x faster
   polyvariant-monomorphic-get-by-id                  8.6151+-0.4644            8.5454+-0.1436        
   proto-getter-access                                9.8990+-0.1977            9.8352+-0.1345        
   put-by-id-replace-and-transition                   9.0442+-0.0942     ?      9.1396+-0.2007        ? might be 1.0106x slower
   put-by-id-slightly-polymorphic                     2.8595+-0.0702            2.8020+-0.0622          might be 1.0205x faster
   put-by-id                                         12.7913+-0.4452           12.7067+-0.3014        
   put-by-val-direct                                  0.4625+-0.0232            0.4597+-0.0137        
   put-by-val-large-index-blank-indexing-type   
                                                      6.0574+-0.2273            5.7723+-0.0906          might be 1.0494x faster
   put-by-val-machine-int                             2.8801+-0.2301            2.8159+-0.0781          might be 1.0228x faster
   rare-osr-exit-on-local                            15.4924+-1.0425           15.4816+-1.3892        
   register-pressure-from-osr                        21.4709+-0.2095           21.3330+-0.1640        
   setter                                             6.6345+-0.4659            5.7812+-0.7151          might be 1.1476x faster
   simple-activation-demo                            24.8079+-0.2665     ?     25.5987+-1.2549        ? might be 1.0319x slower
   simple-getter-access                              13.1394+-0.2919     ?     13.2441+-0.7480        ?
   simple-poly-call-nested                            8.3512+-0.2603     ?      8.3936+-0.4565        ?
   simple-poly-call                                   1.2994+-0.0496     ?      1.3270+-0.0537        ? might be 1.0213x slower
   sin-boolean                                       23.3797+-0.8145     ?     24.2513+-2.6086        ? might be 1.0373x slower
   singleton-scope                                   67.0863+-0.6621     ?     67.8235+-1.9307        ? might be 1.0110x slower
   sink-function                                     12.4987+-0.3541     ?     12.6694+-0.4807        ? might be 1.0137x slower
   sinkable-new-object-dag                           71.0027+-1.5743     ?     71.8188+-2.1119        ? might be 1.0115x slower
   sinkable-new-object-taken                         51.3573+-2.9525           50.8887+-2.4628        
   sinkable-new-object                               39.3928+-1.4149     ?     39.8171+-1.7263        ? might be 1.0108x slower
   slow-array-profile-convergence                     2.8501+-0.1139            2.8428+-0.0767        
   slow-convergence                                   2.9356+-0.4372            2.6764+-0.0560          might be 1.0969x faster
   sorting-benchmark                                 27.3591+-6.1244           25.0432+-0.7522          might be 1.0925x faster
   sparse-conditional                                 1.1486+-0.0438     ?      1.2065+-0.1928        ? might be 1.0504x slower
   splice-to-remove                                  17.6734+-1.5925           17.0087+-1.8451          might be 1.0391x faster
   string-char-code-at                               17.1917+-0.4752     ?     18.0083+-1.3155        ? might be 1.0475x slower
   string-concat-object                               2.6065+-0.1559     ?      2.7340+-0.2380        ? might be 1.0489x slower
   string-concat-pair-object                          2.5721+-0.2047     ?      2.7462+-0.3228        ? might be 1.0677x slower
   string-concat-pair-simple                         12.2632+-0.9467           11.6532+-0.4317          might be 1.0523x faster
   string-concat-simple                              13.5338+-1.3697           13.1717+-1.4560          might be 1.0275x faster
   string-cons-repeat                                 8.1469+-0.4886     ?      9.1047+-0.9790        ? might be 1.1176x slower
   string-cons-tower                                  8.7563+-1.0260     ?      9.2319+-1.2502        ? might be 1.0543x slower
   string-equality                                   17.2334+-0.1400     ?     17.4769+-0.2444        ? might be 1.0141x slower
   string-get-by-val-big-char                         7.1500+-0.0368     ?      7.2313+-0.2321        ? might be 1.0114x slower
   string-get-by-val-out-of-bounds-insane             4.0721+-0.9264     ?      4.1210+-0.7653        ? might be 1.0120x slower
   string-get-by-val-out-of-bounds                    5.2660+-0.0550     ?      5.2888+-0.0773        ?
   string-get-by-val                                  3.5238+-0.4640            3.3243+-0.0889          might be 1.0600x faster
   string-hash                                        2.0334+-0.0847     ?      2.2047+-0.2148        ? might be 1.0842x slower
   string-long-ident-equality                        15.1318+-0.3900           14.7858+-0.1277          might be 1.0234x faster
   string-out-of-bounds                              14.8850+-0.1285     ?     14.9237+-0.2610        ?
   string-repeat-arith                               34.0893+-2.2596           32.7359+-2.4283          might be 1.0413x faster
   string-sub                                        69.5118+-4.2879           64.4708+-3.9805          might be 1.0782x faster
   string-test                                        2.9385+-0.0404            2.8852+-0.0524          might be 1.0185x faster
   string-var-equality                               31.3082+-2.3463           31.0919+-1.9319        
   structure-hoist-over-transitions                   2.6222+-0.0863     ?      2.6509+-0.1075        ? might be 1.0109x slower
   substring-concat-weird                            39.7762+-1.0077     ?     40.2220+-1.1142        ? might be 1.0112x slower
   substring-concat                                  42.1387+-2.0149           41.4270+-1.1429          might be 1.0172x faster
   substring                                         46.8692+-2.0332           46.2790+-1.5925          might be 1.0128x faster
   switch-char-constant                               2.7385+-0.1402     ?      2.7498+-0.0700        ?
   switch-char                                        6.9626+-1.0444     ?      7.0225+-0.6977        ?
   switch-constant                                    8.6090+-0.4927            8.4573+-0.2479          might be 1.0179x faster
   switch-string-basic-big-var                       15.2704+-1.5360     !     18.4760+-0.6953        ! definitely 1.2099x slower
   switch-string-basic-big                           14.5329+-1.4245           14.3690+-0.1442          might be 1.0114x faster
   switch-string-basic-var                           14.7098+-1.0208           14.6261+-0.2126        
   switch-string-basic                               13.8297+-1.5640           13.5736+-0.2606          might be 1.0189x faster
   switch-string-big-length-tower-var                20.2002+-1.5841     ?     21.0655+-1.4009        ? might be 1.0428x slower
   switch-string-length-tower-var                    15.7887+-1.9318           15.2662+-0.1705          might be 1.0342x faster
   switch-string-length-tower                        14.3843+-1.8795           12.9677+-0.3641          might be 1.1092x faster
   switch-string-short                               13.8087+-1.8365           12.7974+-0.2330          might be 1.0790x faster
   switch                                            12.6725+-0.2102           12.6556+-0.3083        
   tear-off-arguments-simple                          3.6372+-0.3098            3.5484+-0.2026          might be 1.0250x faster
   tear-off-arguments                                 4.8075+-0.2478            4.6993+-0.1143          might be 1.0230x faster
   temporal-structure                                12.5603+-0.4906           12.3249+-0.1692          might be 1.0191x faster
   to-int32-boolean                                  13.5349+-0.1511     ?     13.9533+-0.2718        ? might be 1.0309x slower
   try-catch-get-by-val-cloned-arguments             14.8156+-1.2887     ?     15.4980+-2.1070        ? might be 1.0461x slower
   try-catch-get-by-val-direct-arguments              7.0168+-0.9222     ?      7.0798+-0.7917        ?
   try-catch-get-by-val-scoped-arguments              8.2320+-1.1068     ?      8.5033+-1.4045        ? might be 1.0330x slower
   typed-array-get-set-by-val-profiling              32.6621+-1.1924     ?     33.1569+-2.3431        ? might be 1.0151x slower
   undefined-property-access                        353.9491+-2.5183     ?    355.4368+-3.2411        ?
   undefined-test                                     3.1955+-0.3721            3.0844+-0.2040          might be 1.0360x faster
   unprofiled-licm                                   22.7355+-0.3311     ?     22.9991+-0.8605        ? might be 1.0116x slower
   varargs-call                                      16.3224+-1.3491     ?     16.6448+-1.1707        ? might be 1.0197x slower
   varargs-construct-inline                          22.5042+-0.4270     ?     24.0538+-1.5010        ? might be 1.0689x slower
   varargs-construct                                 32.1652+-0.5990     ?     32.1919+-0.8634        ?
   varargs-inline                                     9.8497+-0.9108            9.5335+-0.4138          might be 1.0332x faster
   varargs-strict-mode                               10.2370+-0.1358     ?     10.2853+-0.2641        ?
   varargs                                           10.4180+-0.3968           10.2558+-0.1368          might be 1.0158x faster
   weird-inlining-const-prop                          2.3513+-0.1742     ?      2.3637+-0.1634        ?

   &lt;geometric&gt;                                        8.9734+-0.0224     ?      8.9962+-0.0364        ? might be 1.0025x slower

                                                        TipOfTree                 Terminals                                     
AsmBench:
   bigfib.cpp                                       495.0863+-3.4191     ?    495.2115+-1.4958        ?
   cray.c                                           427.2837+-3.6813          425.4461+-1.5655        
   dry.c                                            486.6491+-13.0536         481.4631+-8.7362          might be 1.0108x faster
   FloatMM.c                                        726.2350+-5.0755          723.6348+-1.7695        
   gcc-loops.cpp                                   4265.7178+-8.6135         4259.5857+-8.2617        
   n-body.c                                         982.0747+-7.8687          981.1179+-3.1693        
   Quicksort.c                                      418.7010+-3.8462     ?    421.1767+-5.0543        ?
   stepanov_container.cpp                          3597.5999+-6.4450     ?   3598.2443+-12.0231       ?
   Towers.c                                         259.5325+-0.4221     ?    262.0172+-3.7301        ?

   &lt;geometric&gt;                                      791.8489+-2.7091          791.4071+-3.4608          might be 1.0006x faster

                                                        TipOfTree                 Terminals                                     
CompressionBench:
   huffman                                          365.6912+-2.4995     ?    367.0227+-3.0184        ?
   arithmetic-simple                                395.1027+-3.1648     ?    397.7232+-3.7063        ?
   arithmetic-precise                               303.2745+-5.3614          298.5373+-4.5625          might be 1.0159x faster
   arithmetic-complex-precise                       299.4463+-2.9283          298.1935+-3.8454        
   arithmetic-precise-order-0                       427.2052+-5.4192          422.9203+-5.0545          might be 1.0101x faster
   arithmetic-precise-order-1                       328.2134+-4.3051          324.3773+-1.8315          might be 1.0118x faster
   arithmetic-precise-order-2                       358.3283+-2.8711          358.0954+-4.1034        
   arithmetic-simple-order-1                        426.0775+-6.6666          422.2477+-3.1185        
   arithmetic-simple-order-2                        468.1896+-4.5746     ?    473.8795+-13.5784       ? might be 1.0122x slower
   lz-string                                        326.5867+-2.4388          325.8449+-3.6595        

   &lt;geometric&gt;                                      365.8279+-1.3168          364.6733+-1.2909          might be 1.0032x faster

                                                        TipOfTree                 Terminals                                     
Geomean of preferred means:
   &lt;scaled-result&gt;                                   64.5574+-0.3217           64.3559+-0.1307          might be 1.0031x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1089871</commentid>
    <comment_count>8</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-04-28 20:36:22 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/183525</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>251894</attachid>
            <date>2015-04-28 16:19:08 -0700</date>
            <delta_ts>2015-04-28 18:21:46 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>21384</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29tbW9uLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NvbW1vbi5jcHAJKHJldmlzaW9uIDE4
MzQ5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29tbW9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTIzLDYgKzEyMywxNyBAQCB2b2lkIHByaW50SW50ZXJuYWwoUHJpbnRTdHJl
YW0mIG91dCwgUHJvCiAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKIH0KIAorYm9v
bCBzdHJpbmdMZXNzVGhhbihTdHJpbmdJbXBsKiBhLCBTdHJpbmdJbXBsKiBiKQoreworICAgIHVu
c2lnbmVkIG1pbkxlbmd0aCA9IHN0ZDo6bWluKGEtPmxlbmd0aCgpLCBiLT5sZW5ndGgoKSk7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1pbkxlbmd0aDsgKytpKSB7CisgICAgICAgIGlm
IChhLT5hdChpKSA9PSBiLT5hdChpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBy
ZXR1cm4gYS0+YXQoaSkgPCBiLT5hdChpKTsKKyAgICB9CisgICAgcmV0dXJuIGEtPmxlbmd0aCgp
IDwgYi0+bGVuZ3RoKCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdURgogCiAjZW5kaWYgLy8gRU5B
QkxFKERGR19KSVQpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NvbW1vbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29tbW9uLmgJKHJl
dmlzaW9uIDE4MzQ5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29tbW9uLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI5Nyw2ICsyOTcsMTAgQEAgc3RydWN0IE5vZGVBbmRJbmRleCB7
CiAgICAgdW5zaWduZWQgaW5kZXg7CiB9OwogCisvLyBBIGxlc3MtdGhhbiBvcGVyYXRvciBmb3Ig
c3RyaW5ncyB0aGF0IGlzIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBzdHJpbmcgc3dpdGNoZXMuIFNv
cnRzIGJ5IDwKKy8vIHJlbGF0aW9uIG9uIGNoYXJhY3RlcnMuIEVuc3VyZXMgdGhhdCBpZiBhIGlz
IGEgcHJlZml4IG9mIGIsIHRoZW4gYSA8IGIuCitib29sIHN0cmluZ0xlc3NUaGFuKFN0cmluZ0lt
cGwqIGEsIFN0cmluZ0ltcGwqIGIpOworCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCiAKIG5h
bWVzcGFjZSBXVEYgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPcGVyYXRp
b25zLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09wZXJh
dGlvbnMuY3BwCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR09wZXJhdGlvbnMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDc3LDYgKzEwNzcsMTQgQEAg
Y2hhciogSklUX09QRVJBVElPTiBvcGVyYXRpb25Td2l0Y2hTdHJpbgogICAgIHJldHVybiBzdGF0
aWNfY2FzdDxjaGFyKj4oZXhlYy0+Y29kZUJsb2NrKCktPnN0cmluZ1N3aXRjaEp1bXBUYWJsZSh0
YWJsZUluZGV4KS5jdGlGb3JWYWx1ZShzdHJpbmctPnZhbHVlKGV4ZWMpLmltcGwoKSkuZXhlY3V0
YWJsZUFkZHJlc3MoKSk7CiB9CiAKK2ludDMyX3QgSklUX09QRVJBVElPTiBvcGVyYXRpb25Td2l0
Y2hTdHJpbmdBbmRHZXRCcmFuY2hPZmZzZXQoRXhlY1N0YXRlKiBleGVjLCBzaXplX3QgdGFibGVJ
bmRleCwgSlNTdHJpbmcqIHN0cmluZykKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAg
IE5hdGl2ZUNhbGxGcmFtZVRyYWNlciB0cmFjZXIoJnZtLCBleGVjKTsKKworICAgIHJldHVybiBl
eGVjLT5jb2RlQmxvY2soKS0+c3RyaW5nU3dpdGNoSnVtcFRhYmxlKHRhYmxlSW5kZXgpLm9mZnNl
dEZvclZhbHVlKHN0cmluZy0+dmFsdWUoZXhlYykuaW1wbCgpKTsKK30KKwogdm9pZCBKSVRfT1BF
UkFUSU9OIG9wZXJhdGlvbk5vdGlmeVdyaXRlKEV4ZWNTdGF0ZSogZXhlYywgV2F0Y2hwb2ludFNl
dCogc2V0KQogewogICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR09wZXJhdGlvbnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR09wZXJhdGlvbnMuaAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPcGVyYXRpb25zLmgJKHdvcmtpbmcgY29weSkKQEAgLTEy
Nyw2ICsxMjcsNyBAQCBKU0NlbGwqIEpJVF9PUEVSQVRJT04gb3BlcmF0aW9uTWFrZVJvcGUyCiBK
U0NlbGwqIEpJVF9PUEVSQVRJT04gb3BlcmF0aW9uTWFrZVJvcGUzKEV4ZWNTdGF0ZSosIEpTU3Ry
aW5nKiwgSlNTdHJpbmcqLCBKU1N0cmluZyopOwogY2hhciogSklUX09QRVJBVElPTiBvcGVyYXRp
b25GaW5kU3dpdGNoSW1tVGFyZ2V0Rm9yRG91YmxlKEV4ZWNTdGF0ZSosIEVuY29kZWRKU1ZhbHVl
LCBzaXplX3QgdGFibGVJbmRleCk7CiBjaGFyKiBKSVRfT1BFUkFUSU9OIG9wZXJhdGlvblN3aXRj
aFN0cmluZyhFeGVjU3RhdGUqLCBzaXplX3QgdGFibGVJbmRleCwgSlNTdHJpbmcqKTsKK2ludDMy
X3QgSklUX09QRVJBVElPTiBvcGVyYXRpb25Td2l0Y2hTdHJpbmdBbmRHZXRCcmFuY2hPZmZzZXQo
RXhlY1N0YXRlKiwgc2l6ZV90IHRhYmxlSW5kZXgsIEpTU3RyaW5nKik7CiB2b2lkIEpJVF9PUEVS
QVRJT04gb3BlcmF0aW9uTm90aWZ5V3JpdGUoRXhlY1N0YXRlKiwgV2F0Y2hwb2ludFNldCopOwog
dm9pZCBKSVRfT1BFUkFUSU9OIG9wZXJhdGlvblRocm93U3RhY2tPdmVyZmxvd0ZvclZhcmFyZ3Mo
RXhlY1N0YXRlKikgV1RGX0lOVEVSTkFMOwogaW50MzJfdCBKSVRfT1BFUkFUSU9OIG9wZXJhdGlv
blNpemVPZlZhcmFyZ3MoRXhlY1N0YXRlKiwgRW5jb2RlZEpTVmFsdWUgYXJndW1lbnRzLCBpbnQz
Ml90IGZpcnN0VmFyQXJnT2Zmc2V0KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHU3BlY3VsYXRpdmVKSVQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNTYzNCwxOCArNTYzNCw2IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmVtaXRTd2l0Y2hDaGFy
KE5vZGUKICAgICB9CiB9CiAKLWJvb2wgU3BlY3VsYXRpdmVKSVQ6OlN0cmluZ1N3aXRjaENhc2U6
Om9wZXJhdG9yPCgKLSAgICBjb25zdCBTcGVjdWxhdGl2ZUpJVDo6U3RyaW5nU3dpdGNoQ2FzZSYg
b3RoZXIpIGNvbnN0Ci17Ci0gICAgdW5zaWduZWQgbWluTGVuZ3RoID0gc3RkOjptaW4oc3RyaW5n
LT5sZW5ndGgoKSwgb3RoZXIuc3RyaW5nLT5sZW5ndGgoKSk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1pbkxlbmd0aDsgKytpKSB7Ci0gICAgICAgIGlmIChzdHJpbmctPmF0KGkpID09
IG90aGVyLnN0cmluZy0+YXQoaSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcmV0
dXJuIHN0cmluZy0+YXQoaSkgPCBvdGhlci5zdHJpbmctPmF0KGkpOwotICAgIH0KLSAgICByZXR1
cm4gc3RyaW5nLT5sZW5ndGgoKSA8IG90aGVyLnN0cmluZy0+bGVuZ3RoKCk7Ci19Ci0KIG5hbWVz
cGFjZSB7CiAKIHN0cnVjdCBDaGFyYWN0ZXJDYXNlIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgJKHJldmlzaW9uIDE4MzQ5NykKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkod29ya2luZyBjb3B5
KQpAQCAtMjExNSw3ICsyMTE1LDEwIEBAIHB1YmxpYzoKICAgICAgICAgewogICAgICAgICB9CiAg
ICAgICAgIAotICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBTdHJpbmdTd2l0Y2hDYXNlJiBv
dGhlcikgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cmluZ1N3aXRjaENh
c2UmIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nTGVz
c1RoYW4oc3RyaW5nLCBvdGhlci5zdHJpbmcpOworICAgICAgICB9CiAgICAgICAgIAogICAgICAg
ICBTdHJpbmdJbXBsKiBzdHJpbmc7CiAgICAgICAgIEJhc2ljQmxvY2sqIHRhcmdldDsKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMQ2FwYWJpbGl0aWVzLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTENhcGFiaWxpdGllcy5jcHAJKHJldmlz
aW9uIDE4MzQ5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMQ2FwYWJpbGl0aWVz
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTg4LDYgKzE4OCw3IEBAIGlubGluZSBDYXBhYmlsaXR5
TGV2ZWwgY2FuQ29tcGlsZShOb2RlKiAKICAgICBjYXNlIFBoYW50b21DbG9uZWRBcmd1bWVudHM6
CiAgICAgY2FzZSBHZXRNeUFyZ3VtZW50QnlWYWw6CiAgICAgY2FzZSBGb3J3YXJkVmFyYXJnczoK
KyAgICBjYXNlIFN3aXRjaDoKICAgICAgICAgLy8gVGhlc2UgYXJlIE9LLgogICAgICAgICBicmVh
azsKICAgICBjYXNlIElkZW50aXR5OgpAQCAtMzUwLDE2ICszNTEsNiBAQCBpbmxpbmUgQ2FwYWJp
bGl0eUxldmVsIGNhbkNvbXBpbGUoTm9kZSogCiAgICAgICAgIGlmIChub2RlLT5pc0JpbmFyeVVz
ZUtpbmQoVW50eXBlZFVzZSkpCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgcmV0dXJuIENh
bm5vdENvbXBpbGU7Ci0gICAgY2FzZSBTd2l0Y2g6Ci0gICAgICAgIHN3aXRjaCAobm9kZS0+c3dp
dGNoRGF0YSgpLT5raW5kKSB7Ci0gICAgICAgIGNhc2UgU3dpdGNoSW1tOgotICAgICAgICBjYXNl
IFN3aXRjaENoYXI6Ci0gICAgICAgIGNhc2UgU3dpdGNoQ2VsbDoKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIENhbm5vdENvbXBpbGU7Ci0g
ICAgICAgIH0KLSAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgLy8gRG9uJ3Qg
a25vdyBob3cgdG8gaGFuZGxlIGFueXRoaW5nIGVsc2UuCiAgICAgICAgIHJldHVybiBDYW5ub3RD
b21waWxlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRGR1RvTExW
TS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRG
R1RvTExWTS5jcHAJKHJldmlzaW9uIDE4MzQ5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9m
dGwvRlRMTG93ZXJERkdUb0xMVk0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NDM5LDcgKzQ0Mzks
NTQgQEAgcHJpdmF0ZToKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgY2FzZSBTd2l0Y2hT
dHJpbmc6IHsKLSAgICAgICAgICAgIERGR19DUkFTSChtX2dyYXBoLCBtX25vZGUsICJVbmltcGxl
bWVudGVkIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1fbm9kZS0+Y2hpbGQxKCkudXNlS2luZCgp
KSB7CisgICAgICAgICAgICBjYXNlIFN0cmluZ0lkZW50VXNlOiB7CisgICAgICAgICAgICAgICAg
TFZhbHVlIHN0cmluZ0ltcGwgPSBsb3dTdHJpbmdJZGVudChtX25vZGUtPmNoaWxkMSgpKTsKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWZWN0b3I8U3dpdGNoQ2FzZT4gY2FzZXM7
CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRhdGEtPmNhc2VzLnNp
emUoKTsgK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgTFZhbHVlIHZhbHVlID0gbV9vdXQuY29u
c3RJbnRQdHIoZGF0YS0+Y2FzZXNbaV0udmFsdWUuc3RyaW5nSW1wbCgpKTsKKyAgICAgICAgICAg
ICAgICAgICAgTEJhc2ljQmxvY2sgYmxvY2sgPSBsb3dCbG9jayhkYXRhLT5jYXNlc1tpXS50YXJn
ZXQuYmxvY2spOworICAgICAgICAgICAgICAgICAgICBXZWlnaHQgd2VpZ2h0ID0gV2VpZ2h0KGRh
dGEtPmNhc2VzW2ldLnRhcmdldC5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2VzLmFw
cGVuZChTd2l0Y2hDYXNlKHZhbHVlLCBibG9jaywgd2VpZ2h0KSk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1fb3V0LnN3aXRjaEluc3RydWN0
aW9uKAorICAgICAgICAgICAgICAgICAgICBzdHJpbmdJbXBsLCBjYXNlcywgbG93QmxvY2soZGF0
YS0+ZmFsbFRocm91Z2guYmxvY2spLAorICAgICAgICAgICAgICAgICAgICBXZWlnaHQoZGF0YS0+
ZmFsbFRocm91Z2guY291bnQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFN0cmluZ1VzZTogeworICAg
ICAgICAgICAgICAgIHN3aXRjaFN0cmluZyhkYXRhLCBsb3dTdHJpbmcobV9ub2RlLT5jaGlsZDEo
KSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGNhc2UgVW50eXBlZFVzZTogeworICAgICAgICAgICAgICAgIExW
YWx1ZSB2YWx1ZSA9IGxvd0pTVmFsdWUobV9ub2RlLT5jaGlsZDEoKSk7CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgTEJhc2ljQmxvY2sgaXNDZWxsQmxvY2sgPSBGVExfTkVXX0JM
T0NLKG1fb3V0LCAoIlN3aXRjaC9Td2l0Y2hTdHJpbmcgVW50eXBlZCBjZWxsIGNhc2UiKSk7Cisg
ICAgICAgICAgICAgICAgTEJhc2ljQmxvY2sgaXNTdHJpbmdCbG9jayA9IEZUTF9ORVdfQkxPQ0so
bV9vdXQsICgiU3dpdGNoL1N3aXRjaFN0cmluZyBVbnR5cGVkIHN0cmluZyBjYXNlIikpOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1fb3V0LmJyYW5jaCgKKyAgICAgICAgICAg
ICAgICAgICAgaXNDZWxsKHZhbHVlKSwgdW5zdXJlKGlzQ2VsbEJsb2NrKSwgdW5zdXJlKGxvd0Js
b2NrKGRhdGEtPmZhbGxUaHJvdWdoLmJsb2NrKSkpOworICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIExCYXNpY0Jsb2NrIGxhc3ROZXh0ID0gbV9vdXQuYXBwZW5kVG8oaXNDZWxsQmxv
Y2ssIGlzU3RyaW5nQmxvY2spOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1f
b3V0LmJyYW5jaCgKKyAgICAgICAgICAgICAgICAgICAgaXNTdHJpbmcodmFsdWUpLAorICAgICAg
ICAgICAgICAgICAgICB1bnN1cmUoaXNTdHJpbmdCbG9jayksIHVuc3VyZShsb3dCbG9jayhkYXRh
LT5mYWxsVGhyb3VnaC5ibG9jaykpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBtX291dC5hcHBlbmRUbyhpc1N0cmluZ0Jsb2NrLCBsYXN0TmV4dCk7CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgc3dpdGNoU3RyaW5nKGRhdGEsIHZhbHVlKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERGR19DUkFTSChtX2dyYXBoLCBtX25vZGUs
ICJCYWQgdXNlIGtpbmQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9
CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgICAgIApAQCAtNjAzOSw2
ICs2MDg2LDI1OSBAQCBwcml2YXRlOgogICAgICAgICAgICAgbG93QmxvY2soZGF0YS0+ZmFsbFRo
cm91Z2guYmxvY2spLCBXZWlnaHQoZGF0YS0+ZmFsbFRocm91Z2guY291bnQpKTsKICAgICB9CiAg
ICAgCisgICAgdm9pZCBzd2l0Y2hTdHJpbmcoU3dpdGNoRGF0YSogZGF0YSwgTFZhbHVlIHN0cmlu
ZykKKyAgICB7CisgICAgICAgIGJvb2wgY2FuRG9CaW5hcnlTd2l0Y2ggPSB0cnVlOworICAgICAg
ICB1bnNpZ25lZCB0b3RhbExlbmd0aCA9IDA7CisgICAgICAgIAorICAgICAgICBmb3IgKFN3aXRj
aENhc2UmIG15Q2FzZSA6IGRhdGEtPmNhc2VzKSB7CisgICAgICAgICAgICBTdHJpbmdJbXBsKiBz
dHJpbmcgPSBteUNhc2UudmFsdWUuc3RyaW5nSW1wbCgpOworICAgICAgICAgICAgaWYgKCFzdHJp
bmctPmlzOEJpdCgpKSB7CisgICAgICAgICAgICAgICAgY2FuRG9CaW5hcnlTd2l0Y2ggPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
IChzdHJpbmctPmxlbmd0aCgpID4gT3B0aW9uczo6bWF4aW11bUJpbmFyeVN0cmluZ1N3aXRjaENh
c2VMZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGNhbkRvQmluYXJ5U3dpdGNoID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3Rh
bExlbmd0aCArPSBzdHJpbmctPmxlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBpZiAoIWNhbkRvQmluYXJ5U3dpdGNoIHx8IHRvdGFsTGVuZ3RoID4gT3B0aW9uczo6bWF4aW11
bUJpbmFyeVN0cmluZ1N3aXRjaFRvdGFsTGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaFN0
cmluZ1Nsb3coZGF0YSwgc3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgTFZhbHVlIHN0cmluZ0ltcGwgPSBtX291dC5sb2FkUHRyKHN0cmlu
ZywgbV9oZWFwcy5KU1N0cmluZ192YWx1ZSk7CisgICAgICAgIExWYWx1ZSBsZW5ndGggPSBtX291
dC5sb2FkMzIoc3RyaW5nLCBtX2hlYXBzLkpTU3RyaW5nX2xlbmd0aCk7CisgICAgICAgIAorICAg
ICAgICBMQmFzaWNCbG9jayBoYXNJbXBsQmxvY2sgPSBGVExfTkVXX0JMT0NLKG1fb3V0LCAoIlN3
aXRjaC9Td2l0Y2hTdHJpbmcgaGFzIGltcGwgY2FzZSIpKTsKKyAgICAgICAgTEJhc2ljQmxvY2sg
aXM4Qml0QmxvY2sgPSBGVExfTkVXX0JMT0NLKG1fb3V0LCAoIlN3aXRjaC9Td2l0Y2hTdHJpbmcg
aXMgOCBiaXQgY2FzZSIpKTsKKyAgICAgICAgTEJhc2ljQmxvY2sgc2xvd0Jsb2NrID0gRlRMX05F
V19CTE9DSyhtX291dCwgKCJTd2l0Y2gvU3dpdGNoU3RyaW5nIHNsb3cgY2FzZSIpKTsKKyAgICAg
ICAgCisgICAgICAgIG1fb3V0LmJyYW5jaChtX291dC5pc051bGwoc3RyaW5nSW1wbCksIHVuc3Vy
ZShzbG93QmxvY2spLCB1bnN1cmUoaGFzSW1wbEJsb2NrKSk7CisgICAgICAgIAorICAgICAgICBM
QmFzaWNCbG9jayBsYXN0TmV4dCA9IG1fb3V0LmFwcGVuZFRvKGhhc0ltcGxCbG9jaywgaXM4Qml0
QmxvY2spOworICAgICAgICAKKyAgICAgICAgbV9vdXQuYnJhbmNoKAorICAgICAgICAgICAgbV9v
dXQudGVzdElzWmVybzMyKAorICAgICAgICAgICAgICAgIG1fb3V0LmxvYWQzMihzdHJpbmdJbXBs
LCBtX2hlYXBzLlN0cmluZ0ltcGxfaGFzaEFuZEZsYWdzKSwKKyAgICAgICAgICAgICAgICBtX291
dC5jb25zdEludDMyKFN0cmltZ0ltcGw6OmZsYWdJczhCaXQoKSkpLAorICAgICAgICAgICAgdW5z
dXJlKHNsb3dCbG9jayksIHVuc3VyZShpczhCaXRCbG9jaykpOworICAgICAgICAKKyAgICAgICAg
bV9vdXQuYXBwZW5kVG8oaXM4Qml0QmxvY2ssIHNsb3dCbG9jayk7CisgICAgICAgIAorICAgICAg
ICBMVmFsdWUgYnVmZmVyID0gbV9vdXQubG9hZFB0cihzdHJpbmdJbXBsLCBtX2hlYXBzLlN0cmlu
Z0ltcGxfZGF0YSk7CisgICAgICAgIAorICAgICAgICBWZWN0b3I8U3RyaW5nU3dpdGNoQ2FzZT4g
Y2FzZXM7CisgICAgICAgIGZvciAoU3dpdGNoQ2FzZSYgbXlDYXNlIDogZGF0YS0+Y2FzZXMpIHsK
KyAgICAgICAgICAgIFdlaWdodGVkVGFyZ2V0IHRhcmdldCA9IFdlaWdodGVkVGFyZ2V0KAorICAg
ICAgICAgICAgICAgIGxvd0Jsb2NrKG15Q2FzZS50YXJnZXQuYmxvY2spLCBXZWlnaHQobXlDYXNl
LnRhcmdldC5jb3VudCkpOworICAgICAgICAgICAgY2FzZXMuYXBwZW5kKFN0cmluZ1N3aXRjaENh
c2UobXlDYXNlLnZhbHVlLnN0cmluZ0ltcGwoKSwgdGFyZ2V0KSk7CisgICAgICAgIH0KKyAgICAg
ICAgc3RkOjpzb3J0KGNhc2VzLmJlZ2luKCksIGNhc2VzLmVuZCgpKTsKKyAgICAgICAgc3dpdGNo
U3RyaW5nUmVjdXJzZShkYXRhLCBidWZmZXIsIGxlbmd0aCwgY2FzZXMsIDAsIDAsIGNhc2VzLnNp
emUoKSwgMCwgZmFsc2UpOworCisgICAgICAgIG1fb3V0LmFwcGVuZFRvKHNsb3dCbG9jaywgbGFz
dE5leHQpOworICAgICAgICBzd2l0Y2hTdHJpbmdTbG93KGRhdGEsIHN0cmluZyk7CisgICAgfQor
ICAgIAorICAgIC8vIFRoZSBjb2RlIGZvciBzdHJpbmcgc3dpdGNoaW5nIGlzIGJhc2VkIGNsb3Nl
bHkgb24gdGhlIHNhbWUgY29kZSBpbiB0aGUgREZHIGJhY2tlbmQuIFdoaWxlIGl0CisgICAgLy8g
d291bGQgYmUgbmljZSB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBzaW1pbGFyLWxvb2tpbmcgY29k
ZSwgaXQgc2VlbXMgbGlrZSB0aGlzIGlzIG9uZSBvZgorICAgIC8vIHRob3NlIGFsZ29yaXRobXMg
d2hlcmUgZmFjdG9yaW5nIG91dCB0aGUgY29tbW9uIGJpdHMgd291bGQgcmVzdWx0IGluIG1vcmUg
Y29kZSB0aGFuIGp1c3QKKyAgICAvLyBkdXBsaWNhdGluZy4KKyAgICAKKyAgICBzdHJ1Y3QgU3Ry
aW5nU3dpdGNoQ2FzZSB7CisgICAgICAgIFN0cmluZ1N3aXRjaENhc2UoKSB7IH0KKyAgICAgICAg
CisgICAgICAgIFN0cmluZ1N3aXRjaENhc2UoU3RyaW5nSW1wbCogc3RyaW5nLCBXZWlnaHRlZFRh
cmdldCB0YXJnZXQpCisgICAgICAgICAgICA6IHN0cmluZyhzdHJpbmcpCisgICAgICAgICAgICAs
IHRhcmdldCh0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3Bl
cmF0b3I8KGNvbnN0IFN0cmluZ1N3aXRjaENhc2UmIG90aGVyKSBjb25zdAorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gc3RyaW5nTGVzc1RoYW4oc3RyaW4sIG90aGVyLnN0cmluZyk7Cisg
ICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZ0ltcGwqIHN0cmluZzsKKyAgICAgICAg
V2VpZ2h0ZWRUYXJnZXQgdGFyZ2V0OworICAgIH07CisgICAgCisgICAgc3RydWN0IENoYXJhY3Rl
ckNhc2UgeworICAgICAgICBDaGFyYWN0ZXJDYXNlKCkKKyAgICAgICAgICAgIDogY2hhcmFjdGVy
KDApCisgICAgICAgICAgICAsIGJlZ2luKDApCisgICAgICAgICAgICAsIGVuZCgwKQorICAgICAg
ICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIENoYXJhY3RlckNhc2UoTENoYXIgY2hh
cmFjdGVyLCB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgZW5kKQorICAgICAgICAgICAgOiBjaGFy
YWN0ZXIoY2hhcmFjdGVyKQorICAgICAgICAgICAgLCBiZWdpbihiZWdpbikKKyAgICAgICAgICAg
ICwgZW5kKGVuZCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29s
IG9wZXJhdG9yPChjb25zdCBDaGFyYWN0ZXJDYXNlJiBvdGhlcikgY29uc3QKKyAgICAgICAgewor
ICAgICAgICAgICAgcmV0dXJuIGNoYXJhY3RlciA8IG90aGVyLmNoYXJhY3RlcjsKKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgTENoYXIgY2hhcmFjdGVyOworICAgICAgICB1bnNpZ25lZCBi
ZWdpbjsKKyAgICAgICAgdW5zaWduZWQgZW5kOworICAgIH07CisgICAgCisgICAgdm9pZCBzd2l0
Y2hTdHJpbmdSZWN1cnNlKAorICAgICAgICBTd2l0Y2hEYXRhKiBkYXRhLCBMVmFsdWUgYnVmZmVy
LCBMVmFsdWUgbGVuZ3RoLCBjb25zdCBWZWN0b3I8U3RyaW5nU3dpdGNoQ2FzZT4mIGNhc2VzLAor
ICAgICAgICB1bnNpZ25lZCBudW1DaGVja2VkLCB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgZW5k
LCB1bnNpZ25lZCBhbHJlYWR5Q2hlY2tlZExlbmd0aCwKKyAgICAgICAgdW5zaWduZWQgY2hlY2tl
ZEV4YWN0TGVuZ3RoKQorICAgIHsKKyAgICAgICAgTEJhc2ljQmxvY2sgZmFsbFRocm91Z2ggPSBs
b3dCbG9jayhkYXRhLT5mYWxsVGhyb3VnaC5ibG9jayk7CisgICAgICAgIAorICAgICAgICBpZiAo
YmVnaW4gPT0gZW5kKSB7CisgICAgICAgICAgICBtX291dC5qdW1wKGZhbGxUaHJvdWdoKTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdW5zaWduZWQg
bWluTGVuZ3RoID0gY2FzZXNbYmVnaW5dLnN0cmluZy0+bGVuZ3RoKCk7CisgICAgICAgIHVuc2ln
bmVkIGNvbW1vbkNoYXJzID0gbWluTGVuZ3RoOworICAgICAgICBib29sIGFsbExlbmd0aHNFcXVh
bCA9IHRydWU7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IGJlZ2luICsgMTsgaSA8IGVuZDsg
KytpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBteUNvbW1vbkNoYXJzID0gbnVtQ2hlY2tlZDsK
KyAgICAgICAgICAgIGZvciAoCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaiA9IG51bUNoZWNr
ZWQ7CisgICAgICAgICAgICAgICAgaiA8IHN0ZDo6bWluKGNhc2VzW2JlZ2luXS5zdHJpbmctPmxl
bmd0aCgpLCBjYXNlc1tpXS5zdHJpbmctPmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICArK2op
IHsKKyAgICAgICAgICAgICAgICBpZiAoY2FzZXNbYmVnaW5dLnN0cmluZy0+YXQoaikgIT0gY2Fz
ZXNbaV0uc3RyaW5nLT5hdChqKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgbXlDb21tb25DaGFycysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29t
bW9uQ2hhcnMgPSBzdGQ6Om1pbihjb21tb25DaGFycywgbXlDb21tb25DaGFycyk7CisgICAgICAg
ICAgICBpZiAobWluTGVuZ3RoICE9IGNhc2VzW2ldLnN0cmluZy0+bGVuZ3RoKCkpCisgICAgICAg
ICAgICAgICAgYWxsTGVuZ3Roc0VxdWFsID0gZmFsc2U7CisgICAgICAgICAgICBtaW5MZW5ndGgg
PSBzdGQ6Om1pbihtaW5MZW5ndGgsIGNhc2VzW2ldLnN0cmluZy0+bGVuZ3RoKCkpOworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBpZiAoY2hlY2tlZEV4YWN0TGVuZ3RoKSB7CisgICAgICAg
ICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIG1fbm9kZSwgYWxyZWFkeUNoZWNrZWRMZW5ndGggPT0g
bWluTGVuZ3RoKTsKKyAgICAgICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2RlLCBhbGxM
ZW5ndGhzRXF1YWwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBERkdfQVNTRVJUKG1p
bkxlbmd0aCA+PSBjb21tb25DaGFycyk7CisgICAgICAgIAorICAgICAgICBpZiAoIWFsbExlbmd0
aHNFcXVhbCAmJiBhbHJlYWR5Q2hlY2tlZExlbmd0aCA8IG1pbkxlbmd0aCkKKyAgICAgICAgICAg
IG1fb3V0LmNoZWNrKG1fb3V0LmJlbG93KGxlbmd0aCwgbV9vdXQuY29uc3RJbnQzMihtaW5MZW5n
dGgpKSwgdW5zdXJlKGZhbGxUaHJvdWdoKSk7CisgICAgICAgIGlmIChhbGxMZW5ndGhzRXF1YWwg
JiYgKGFscmVhZHlDaGVja2VkTGVuZ3RoIDwgbWluTGVuZ3RoIHx8ICFjaGVja2VkRXhhY3RMZW5n
dGgpKQorICAgICAgICAgICAgbV9vdXQuY2hlY2sobV9vdXQubm90RXF1YWwobGVuZ3RoLCBtX291
dC5jb25zdEludDMyKG1pbkxlbmd0aCkpLCB1bnN1cmUoZmFsbFRocm91Z2gpKTsKKyAgICAgICAg
CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IG51bUNoZWNrZWQ7IGkgPCBjb21tb25DaGFyczsg
KytpKSB7CisgICAgICAgICAgICBtX291dC5jaGVjaygKKyAgICAgICAgICAgICAgICBtX291dC5u
b3RFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgbV9vdXQubG9hZDgoYnVmZmVyLCBtX2hlYXBz
LmNoYXJhY3RlcnM4W2ldKSwKKyAgICAgICAgICAgICAgICAgICAgbV9vdXQuY29uc3RJbnQ4KGNh
c2VzW2JlZ2luXS5zdHJpbmctPmF0KGkpKSksCisgICAgICAgICAgICAgICAgdW5zdXJlKGZhbGxU
aHJvdWdoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtaW5MZW5ndGggPT0g
Y29tbW9uQ2hhcnMpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgb25l
IG9mIHRoZSBjYXNlcyBpcyBhIHByZWZpeCBvZiBhbGwgb2YgdGhlIG90aGVyIGNhc2VzLgorICAg
ICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIGlucHV0IHN0cmluZyBp
cyBhIHByZWZpeCBvZiBhbGwgb2YgdGhlIGNhc2VzLAorICAgICAgICAgICAgLy8gc28gd2UganVz
dCBjaGVjayBsZW5ndGggdG8ganVtcCB0byB0aGF0IGNhc2UuCisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2RlLCBjYXNlc1tiZWdpbl0uc3RyaW5nLT5s
ZW5ndGgoKSA9PSBjb21tb25DaGFycyk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBi
ZWdpbiArIDE7IGkgPCBlbmQ7ICsraSkKKyAgICAgICAgICAgICAgICBERkdfQVNTRVJUKG1fZ3Jh
cGgsIG1fbm9kZSwgY2FzZXNbaV0uc3RyaW5nLT5sZW5ndGgoKSA+IGNvbW1vbkNoYXJzKTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGFsbExlbmd0aHNFcXVhbCkgeworICAgICAgICAg
ICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2RlLCBlbmQgPT0gYmVnaW4gKyAxKTsKKyAg
ICAgICAgICAgICAgICBtX291dC5qdW1wKGxvd0Jsb2NrKGNhc2VzW2JlZ2luXS50YXJnZXQpKTsK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIG1fb3V0LmNoZWNrKAorICAgICAgICAgICAgICAgIG1fb3V0LmVxdWFsKGxlbmd0
aCwgbV9vdXQuY29uc3RJbnQzMihjb21tb25DaGFycykpLAorICAgICAgICAgICAgICAgIHVuc3Vy
ZShsb3dCbG9jayhjYXNlc1tiZWdpbl0udGFyZ2V0KSkpOworICAgICAgICAgICAgCisgICAgICAg
ICAgICAvLyBXZSd2ZSBjaGVja2VkIGlmIHRoZSBsZW5ndGggaXMgPj0gbWluTGVuZ3RoLCBhbmQg
dGhlbiB3ZSBjaGVja2VkIGlmIHRoZSBsZW5ndGggaXMKKyAgICAgICAgICAgIC8vID09IGNvbW1v
bkNoYXJzLiBXZSBnZXQgdG8gdGhpcyBwb2ludCBpZiBpdCBpcyA+PSBtaW5MZW5ndGggYnV0IG5v
dCA9PSBjb21tb25DaGFycy4KKyAgICAgICAgICAgIC8vIEhlbmNlIHdlIGtub3cgdGhhdCBpdCBu
b3cgbXVzdCBiZSA+IG1pbkxlbmd0aCwgaS5lLiB0aGF0IGl0J3MgPj0gbWluTGVuZ3RoICsgMS4K
KyAgICAgICAgICAgIHN3aXRjaFN0cmluZ1JlY3Vyc2UoCisgICAgICAgICAgICAgICAgZGF0YSwg
YnVmZmVyLCBsZW5ndGgsIGNhc2VzLCBjb21tb25DaGFycywgYmVnaW4gKyAxLCBlbmQsIG1pbkxl
bmd0aCArIDEsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgdGhlIHN0cmluZyBpcyBs
b25nZXIgdGhhbiBjb21tb25DaGFycywgYW5kIHdlJ3ZlIG9ubHkgdmVyaWZpZWQKKyAgICAgICAg
Ly8gY29tbW9uQ2hhcnMuIFVzZSBhIGJpbmFyeSBzd2l0Y2ggb24gdGhlIG5leHQgdW5jaGVja2Vk
IGNoYXJhY3RlciwgaS5lLgorICAgICAgICAvLyBzdHJpbmdbY29tbW9uQ2hhcnNdLgorICAgICAg
ICAKKyAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBtX25vZGUsIGVuZCA+PSBiZWdpbiArIDIp
OworICAgICAgICAKKyAgICAgICAgTFZhbHVlIHVuY2hlY2tlZENoYXIgPSBtX291dC5sb2FkOChi
dWZmZXIsIG1faGVhcHMuY2hhcmFjdGVyczhbY29tbW9uQ2hhcnNdKTsKKyAgICAgICAgCisgICAg
ICAgIFZlY3RvcjxDaGFyYWN0ZXJDYXNlPiBjaGFyYWN0ZXJDYXNlczsKKyAgICAgICAgQ2hhcmFj
dGVyQ2FzZSBjdXJyZW50Q2FzZShjYXNlc1tiZWdpbl0uc3RyaW5nLT5hdChjb21tb25DaGFycyks
IGJlZ2luLCBiZWdpbiArIDEpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBiZWdpbiArIDE7
IGkgPCBlbmQ7ICsraSkgeworICAgICAgICAgICAgTENoYXIgY3VycmVudENoYXIgPSBjYXNlc1tp
XS5zdHJpbmctPmF0KGNvbW1vbkNoYXJzKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciAh
PSBjdXJyZW50Q2FzZS5jaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2FzZS5l
bmQgPSBpOworICAgICAgICAgICAgICAgIGNoYXJhY3RlckNhc2VzLmFwcGVuZChjdXJyZW50Q2Fz
ZSk7CisgICAgICAgICAgICAgICAgY3VycmVudENhc2UgPSBDaGFyYWN0ZXJDYXNlKGN1cnJlbnRD
aGFyLCBpLCBpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjdXJy
ZW50Q2FzZS5lbmQgPSBpICsgMTsKKyAgICAgICAgfQorICAgICAgICBjaGFyYWN0ZXJDYXNlcy5h
cHBlbmQoY3VycmVudENhc2UpOworICAgICAgICAKKyAgICAgICAgVmVjdG9yPExCYXNpY0Jsb2Nr
PiBjaGFyYWN0ZXJCbG9ja3M7CisgICAgICAgIGZvciAoQ2hhcmFjdGVyQ2FzZSYgbXlDYXNlIDog
Y2hhcmFjdGVyQ2FzZXMpCisgICAgICAgICAgICBjaGFyYWN0ZXJCbG9ja3MgPSBGVExfTkVXX0JM
T0NLKG1fb3V0LCAoIlN3aXRjaC9Td2l0Y2hTdHJpbmcgY2FzZSBmb3IgIiwgbXlDYXNlLmNoYXJh
Y3RlciwgIiBhdCBpbmRleCAiLCBjb21tb25DaGFycykpOworICAgICAgICAKKyAgICAgICAgVmVj
dG9yPFN3aXRjaENhc2U+IGNhc2VzOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
Y2hhcmFjdGVyQ2FzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNhc2VzLmFwcGVuZChT
d2l0Y2hDYXNlKAorICAgICAgICAgICAgICAgIG1fb3V0LmNvbnN0SW50OChjaGFyYWN0ZXJDYXNl
c1tpXS5jaGFyYWN0ZXIpLCBjaGFyYWN0ZXJCbG9ja3NbaV0sIFdlaWdodCgpKSk7CisgICAgICAg
IH0KKyAgICAgICAgbV9vdXQuc3dpdGNoSW5zdHJ1Y3Rpb24odW5jaGVja2VkQ2hhciwgY2FzZXMs
IGZhbGxUaHJvdWdoLCBXZWlnaHQoKSk7CisgICAgICAgIAorICAgICAgICBsYXN0TmV4dCA9IG1f
b3V0Lm1fbmV4dEJsb2NrOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2hhcmFj
dGVyQ2FzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIG1fb3V0LmFwcGVuZFRvKAorICAg
ICAgICAgICAgICAgIGNoYXJhY3RlckNhc2VzW2ldLAorICAgICAgICAgICAgICAgIGkgKyAxID09
IGNoYXJhY3RlckNhc2VzLnNpemUoKSA/IGxhc3ROZXh0LCBjaGFyYWN0ZXJDYXNlc1tpICsgMV0p
OworICAgICAgICAgICAgc3dpdGNoU3RyaW5nUmVjdXJzZSgKKyAgICAgICAgICAgICAgICBkYXRh
LCBidWZmZXIsIGxlbmd0aCwgY2FzZXMsIGNvbW1vbkNoYXJzICsgMSwKKyAgICAgICAgICAgICAg
ICBjaGFyYWN0ZXJDYXNlc1tpXS5iZWdpbiwgY2hhcmFjdGVyQ2FzZXNbaV0uZW5kLCBtaW5MZW5n
dGgsIGFsbExlbmd0aHNFcXVhbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERGR19B
U1NFUlQobV9ncmFwaCwgbV9ub2RlLCBtX291dC5tX25leHRCbG9jayA9PSBsYXN0TmV4dCk7Cisg
ICAgfQorICAgIAorICAgIHZvaWQgc3dpdGNoU3RyaW5nU2xvdyhTd2l0Y2hEYXRhKiBkYXRhLCBM
VmFsdWUgc3RyaW5nKQorICAgIHsKKyAgICAgICAgTFZhbHVlIGJyYW5jaE9mZnNldCA9IHZtQ2Fs
bCgKKyAgICAgICAgICAgIG1fb3V0Lm9wZXJhdGlvbihvcGVyYXRpb25Td2l0Y2hTdHJpbmdBbmRH
ZXRCcmFuY2hPZmZzZXQpLAorICAgICAgICAgICAgbV9jYWxsRnJhbWUsIG1fb3V0LmNvbnN0SW50
MzIoZGF0YS0+c3dpdGNoVGFibGVJbmRleCksIHN0cmluZyk7CisgICAgICAgIAorICAgICAgICBT
dHJpbmdKdW1wVGFibGUmIHRhYmxlID0gY29kZUJsb2NrKCktPnN0cmluZ1N3aXRjaEp1bXBUYWJs
ZShkYXRhLnN3aXRjaFRhYmxlSW5kZXgpOworICAgICAgICAKKyAgICAgICAgVmVjdG9yPFN3aXRj
aENhc2U+IGNhc2VzOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YS0+Y2Fz
ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFN3aXRjaENhc2UmIG15Q2FzZSA9IGRhdGEt
PmNhc2VzW2ldOworICAgICAgICAgICAgU3RyaW5nSnVtcFRhYmxlOjpTdHJpbmdPZmZzZXRUYWJs
ZTo6aXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgICAgdGFibGUub2Zmc2V0VGFibGUuZmlu
ZChteUNhc2UudmFsdWUuc3RyaW5nSW1wbCgpKTsKKyAgICAgICAgICAgIERGR19BU1NFUlQobV9n
cmFwaCwgbV9ub2RlLCBpdGVyICE9IHRhYmxlLm9mZnNldFRhYmxlLmVuZCgpKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgY2FzZXMuYXBwZW5kKFN3aXRjaENhc2UoCisgICAgICAgICAgICAg
ICAgbV9vdXQuY29uc3RJbnQzMihpdGVyLT52YWx1ZS5icmFuY2hPZmZzZXQpLAorICAgICAgICAg
ICAgICAgIGxvd0Jsb2NrKG15Q2FzZS50YXJnZXQuYmxvY2spLCBXZWlnaHQobXlDYXNlLnRhcmdl
dC5jb3VudCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbV9vdXQuc3dpdGNoSW5z
dHJ1Y3Rpb24oCisgICAgICAgICAgICBicmFuY2hPZmZzZXQsIGNhc2VzLCBsb3dCbG9jayhkYXRh
LT5mYWxsVGhyb3VnaC5ibG9jayksCisgICAgICAgICAgICBXZWlnaHQoZGF0YS0+ZmFsbFRocm91
Z2guY291bnQpKTsKKyAgICB9CisgICAgCiAgICAgTFZhbHVlIGRvdWJsZVRvSW50MzIoTFZhbHVl
IGRvdWJsZVZhbHVlLCBkb3VibGUgbG93LCBkb3VibGUgaGlnaCwgYm9vbCBpc1NpZ25lZCA9IHRy
dWUpCiAgICAgewogICAgICAgICBMQmFzaWNCbG9jayBncmVhdEVub3VnaCA9IEZUTF9ORVdfQkxP
Q0sobV9vdXQsICgiZG91YmxlVG9JbnQzMiBncmVhdEVub3VnaCIpKTsKQEAgLTcxNzMsOCArNzQ3
Myw4IEBAIHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICBPU1JFeGl0JiBleGl0ID0gbV9mdGxT
dGF0ZS5qaXRDb2RlLT5vc3JFeGl0Lmxhc3QoKTsKIAotICAgICAgICBMQmFzaWNCbG9jayBsYXN0
TmV4dCA9IDA7Ci0gICAgICAgIExCYXNpY0Jsb2NrIGNvbnRpbnVhdGlvbiA9IDA7CisgICAgICAg
IExCYXNpY0Jsb2NrIGxhc3ROZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgTEJhc2ljQmxvY2sgY29u
dGludWF0aW9uID0gbnVsbHB0cjsKICAgICAgICAgCiAgICAgICAgIExCYXNpY0Jsb2NrIGZhaWxD
YXNlID0gRlRMX05FV19CTE9DSyhtX291dCwgKCJPU1IgZXhpdCBmYWlsQ2FzZSBmb3IgIiwgbV9u
b2RlKSk7CiAgICAgICAgIGNvbnRpbnVhdGlvbiA9IEZUTF9ORVdfQkxPQ0sobV9vdXQsICgiT1NS
IGV4aXQgY29udGludWF0aW9uIGZvciAiLCBtX25vZGUpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMT3V0cHV0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZnRsL0ZUTE91dHB1dC5jcHAJKHJldmlzaW9uIDE4MzQ5NykKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9mdGwvRlRMT3V0cHV0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM4LDYgKzEz
OCwxMyBAQCB2b2lkIE91dHB1dDo6YnJhbmNoKExWYWx1ZSBjb25kaXRpb24sIExCCiAgICAgICAg
ICAgICBjb25zdEludDMyKG5vdFRha2VuV2VpZ2h0LnNjYWxlVG9Ub3RhbCh0b3RhbCkpKSk7CiB9
CiAKK3ZvaWQgT3V0cHV0OjpjaGVjayhMVmFsdWUgY29uZGl0aW9uLCBXZWlnaHRlZFRhcmdldCB0
YWtlbikKK3sKKyAgICBMQmFzaWNCbG9jayBjb250aW51YXRpb24gPSBGVExfTkVXX0JMT0NLKCp0
aGlzLCAoIk91dHB1dDo6Y2hlY2sgY29udGludWF0aW9uIikpOworICAgIG1fb3V0LmJyYW5jaChj
b25kaXRpb24sIHRha2VuLCBXZWlnaHRlZFRhcmdldChjb250aW51YXRpb24sIHRha2VuLndlaWdo
dCgpLmludmVyc2UoKSkpOworICAgIG1fb3V0LmFwcGVuZFRvKGNvbnRpbnVhdGlvbik7Cit9CisK
IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpGVEwKIAogI2VuZGlmIC8vIEVOQUJMRShGVExfSklUKQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPdXRwdXQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE91dHB1dC5oCShyZXZpc2lvbiAxODM0OTcp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE91dHB1dC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zODQsNiArMzg0LDEwIEBAIHB1YmxpYzoKICAgICB7CiAgICAgICAgIGJyYW5jaChjb25k
aXRpb24sIHRha2VuLnRhcmdldCgpLCB0YWtlbi53ZWlnaHQoKSwgbm90VGFrZW4udGFyZ2V0KCks
IG5vdFRha2VuLndlaWdodCgpKTsKICAgICB9CisKKyAgICAvLyBCcmFuY2hlcyB0byBhbiBhbHJl
YWR5LWNyZWF0ZWQgaGFuZGxlciBpZiB0cnVlLCAiZmFsbHMgdGhyb3VnaCIgaWYgZmFsc2UuIEZh
bGwtdGhyb3VnaCBpcworICAgIC8vIHNpbXVsYXRlZCBieSBjcmVhdGluZyBhIGNvbnRpbnVhdGlv
biBmb3IgeW91LgorICAgIHZvaWQgY2hlY2soTFZhbHVlIGNvbmRpdGlvbiwgV2VpZ2h0ZWRUYXJn
ZXQgdGFrZW4pOwogICAgIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+CiAgICAg
dm9pZCBzd2l0Y2hJbnN0cnVjdGlvbihMVmFsdWUgdmFsdWUsIGNvbnN0IFZlY3RvclR5cGUmIGNh
c2VzLCBMQmFzaWNCbG9jayBmYWxsVGhyb3VnaCwgV2VpZ2h0IGZhbGxUaHJvdWdoV2VpZ2h0KQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExXZWlnaHQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFdlaWdodC5oCShyZXZpc2lvbiAxODM0OTcp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFdlaWdodC5oCSh3b3JraW5nIGNvcHkp
CkBAIC02Miw2ICs2MiwxNiBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1
bnNpZ25lZD4ocmVzdWx0KTsKICAgICB9CiAgICAgCisgICAgLy8gSW52ZXJzZSB3ZWlnaHQgZm9y
IGEgdHdvLXRhcmdldCBicmFuY2guCisgICAgV2VpZ2h0IGludmVyc2UoKSBjb25zdAorICAgIHsK
KyAgICAgICAgaWYgKCFpc1NldCgpKQorICAgICAgICAgICAgcmV0dXJuIFdlaWdodCgpOworICAg
ICAgICBpZiAodmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBXZWlnaHQoMCk7CisgICAgICAg
IHJldHVybiBXZWlnaHQoMSk7CisgICAgfQorICAgIAogcHJpdmF0ZToKICAgICBmbG9hdCBtX3Zh
bHVlOwogfTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>251909</attachid>
            <date>2015-04-28 18:21:46 -0700</date>
            <delta_ts>2015-04-28 18:37:07 -0700</delta_ts>
            <desc>more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>23139</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29tbW9uLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NvbW1vbi5jcHAJKHJldmlzaW9uIDE4
MzQ5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ29tbW9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDYsNiArNDYsMTcgQEAgYm9vbCBpc0NyYXNoaW5nKCkKICAgICByZXR1cm4g
Y3Jhc2hMb2NrLmlzTG9ja2VkKCk7CiB9CiAKK2Jvb2wgc3RyaW5nTGVzc1RoYW4oU3RyaW5nSW1w
bCogYSwgU3RyaW5nSW1wbCogYikKK3sKKyAgICB1bnNpZ25lZCBtaW5MZW5ndGggPSBzdGQ6Om1p
bihhLT5sZW5ndGgoKSwgYi0+bGVuZ3RoKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtaW5MZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoYS0+YXQoaSkgPT0gYi0+YXQoaSkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0dXJuIGEtPmF0KGkpIDwgYi0+YXQoaSk7
CisgICAgfQorICAgIHJldHVybiBhLT5sZW5ndGgoKSA8IGItPmxlbmd0aCgpOworfQorCiB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6REZHCiAKIG5hbWVzcGFjZSBXVEYgewpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdDb21tb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0NvbW1vbi5oCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0NvbW1vbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOTcsNiArMjk3
LDEwIEBAIHN0cnVjdCBOb2RlQW5kSW5kZXggewogICAgIHVuc2lnbmVkIGluZGV4OwogfTsKIAor
Ly8gQSBsZXNzLXRoYW4gb3BlcmF0b3IgZm9yIHN0cmluZ3MgdGhhdCBpcyB1c2VmdWwgZm9yIGdl
bmVyYXRpbmcgc3RyaW5nIHN3aXRjaGVzLiBTb3J0cyBieSA8CisvLyByZWxhdGlvbiBvbiBjaGFy
YWN0ZXJzLiBFbnN1cmVzIHRoYXQgaWYgYSBpcyBhIHByZWZpeCBvZiBiLCB0aGVuIGEgPCBiLgor
Ym9vbCBzdHJpbmdMZXNzVGhhbihTdHJpbmdJbXBsKiBhLCBTdHJpbmdJbXBsKiBiKTsKKwogfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkRGRwogCiBuYW1lc3BhY2UgV1RGIHsKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPcGVyYXRpb25zLmNwcAkocmV2aXNpb24gMTgzNDk3KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPcGVyYXRpb25zLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTA3Nyw2ICsxMDc3LDE0IEBAIGNoYXIqIEpJVF9PUEVSQVRJT04gb3BlcmF0aW9u
U3dpdGNoU3RyaW4KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcio+KGV4ZWMtPmNvZGVCbG9j
aygpLT5zdHJpbmdTd2l0Y2hKdW1wVGFibGUodGFibGVJbmRleCkuY3RpRm9yVmFsdWUoc3RyaW5n
LT52YWx1ZShleGVjKS5pbXBsKCkpLmV4ZWN1dGFibGVBZGRyZXNzKCkpOwogfQogCitpbnQzMl90
IEpJVF9PUEVSQVRJT04gb3BlcmF0aW9uU3dpdGNoU3RyaW5nQW5kR2V0QnJhbmNoT2Zmc2V0KEV4
ZWNTdGF0ZSogZXhlYywgc2l6ZV90IHRhYmxlSW5kZXgsIEpTU3RyaW5nKiBzdHJpbmcpCit7Cisg
ICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAgICBOYXRpdmVDYWxsRnJhbWVUcmFjZXIgdHJhY2Vy
KCZ2bSwgZXhlYyk7CisKKyAgICByZXR1cm4gZXhlYy0+Y29kZUJsb2NrKCktPnN0cmluZ1N3aXRj
aEp1bXBUYWJsZSh0YWJsZUluZGV4KS5vZmZzZXRGb3JWYWx1ZShzdHJpbmctPnZhbHVlKGV4ZWMp
LmltcGwoKSwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkpOworfQorCiB2b2lk
IEpJVF9PUEVSQVRJT04gb3BlcmF0aW9uTm90aWZ5V3JpdGUoRXhlY1N0YXRlKiBleGVjLCBXYXRj
aHBvaW50U2V0KiBzZXQpCiB7CiAgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5oCShyZXZpc2lvbiAxODM0OTcpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09wZXJhdGlvbnMuaAkod29ya2luZyBjb3B5
KQpAQCAtMTI3LDYgKzEyNyw3IEBAIEpTQ2VsbCogSklUX09QRVJBVElPTiBvcGVyYXRpb25NYWtl
Um9wZTIKIEpTQ2VsbCogSklUX09QRVJBVElPTiBvcGVyYXRpb25NYWtlUm9wZTMoRXhlY1N0YXRl
KiwgSlNTdHJpbmcqLCBKU1N0cmluZyosIEpTU3RyaW5nKik7CiBjaGFyKiBKSVRfT1BFUkFUSU9O
IG9wZXJhdGlvbkZpbmRTd2l0Y2hJbW1UYXJnZXRGb3JEb3VibGUoRXhlY1N0YXRlKiwgRW5jb2Rl
ZEpTVmFsdWUsIHNpemVfdCB0YWJsZUluZGV4KTsKIGNoYXIqIEpJVF9PUEVSQVRJT04gb3BlcmF0
aW9uU3dpdGNoU3RyaW5nKEV4ZWNTdGF0ZSosIHNpemVfdCB0YWJsZUluZGV4LCBKU1N0cmluZyop
OworaW50MzJfdCBKSVRfT1BFUkFUSU9OIG9wZXJhdGlvblN3aXRjaFN0cmluZ0FuZEdldEJyYW5j
aE9mZnNldChFeGVjU3RhdGUqLCBzaXplX3QgdGFibGVJbmRleCwgSlNTdHJpbmcqKTsKIHZvaWQg
SklUX09QRVJBVElPTiBvcGVyYXRpb25Ob3RpZnlXcml0ZShFeGVjU3RhdGUqLCBXYXRjaHBvaW50
U2V0Kik7CiB2b2lkIEpJVF9PUEVSQVRJT04gb3BlcmF0aW9uVGhyb3dTdGFja092ZXJmbG93Rm9y
VmFyYXJncyhFeGVjU3RhdGUqKSBXVEZfSU5URVJOQUw7CiBpbnQzMl90IEpJVF9PUEVSQVRJT04g
b3BlcmF0aW9uU2l6ZU9mVmFyYXJncyhFeGVjU3RhdGUqLCBFbmNvZGVkSlNWYWx1ZSBhcmd1bWVu
dHMsIGludDMyX3QgZmlyc3RWYXJBcmdPZmZzZXQpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHJldmlzaW9uIDE4MzQ5NykKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC01NjM0LDE4ICs1NjM0LDYgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6ZW1pdFN3
aXRjaENoYXIoTm9kZQogICAgIH0KIH0KIAotYm9vbCBTcGVjdWxhdGl2ZUpJVDo6U3RyaW5nU3dp
dGNoQ2FzZTo6b3BlcmF0b3I8KAotICAgIGNvbnN0IFNwZWN1bGF0aXZlSklUOjpTdHJpbmdTd2l0
Y2hDYXNlJiBvdGhlcikgY29uc3QKLXsKLSAgICB1bnNpZ25lZCBtaW5MZW5ndGggPSBzdGQ6Om1p
bihzdHJpbmctPmxlbmd0aCgpLCBvdGhlci5zdHJpbmctPmxlbmd0aCgpKTsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbWluTGVuZ3RoOyArK2kpIHsKLSAgICAgICAgaWYgKHN0cmluZy0+
YXQoaSkgPT0gb3RoZXIuc3RyaW5nLT5hdChpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICByZXR1cm4gc3RyaW5nLT5hdChpKSA8IG90aGVyLnN0cmluZy0+YXQoaSk7Ci0gICAgfQot
ICAgIHJldHVybiBzdHJpbmctPmxlbmd0aCgpIDwgb3RoZXIuc3RyaW5nLT5sZW5ndGgoKTsKLX0K
LQogbmFtZXNwYWNlIHsKIAogc3RydWN0IENoYXJhY3RlckNhc2UgewpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkocmV2aXNpb24gMTgzNDk3
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMTE1LDcgKzIxMTUsMTAgQEAgcHVibGljOgogICAgICAgICB7CiAgICAg
ICAgIH0KICAgICAgICAgCi0gICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cmluZ1N3aXRj
aENhc2UmIG90aGVyKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RyaW5n
U3dpdGNoQ2FzZSYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBz
dHJpbmdMZXNzVGhhbihzdHJpbmcsIG90aGVyLnN0cmluZyk7CisgICAgICAgIH0KICAgICAgICAg
CiAgICAgICAgIFN0cmluZ0ltcGwqIHN0cmluZzsKICAgICAgICAgQmFzaWNCbG9jayogdGFyZ2V0
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExDYXBhYmlsaXRpZXMuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMQ2FwYWJpbGl0aWVzLmNw
cAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExDYXBh
YmlsaXRpZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xODgsNiArMTg4LDcgQEAgaW5saW5lIENh
cGFiaWxpdHlMZXZlbCBjYW5Db21waWxlKE5vZGUqIAogICAgIGNhc2UgUGhhbnRvbUNsb25lZEFy
Z3VtZW50czoKICAgICBjYXNlIEdldE15QXJndW1lbnRCeVZhbDoKICAgICBjYXNlIEZvcndhcmRW
YXJhcmdzOgorICAgIGNhc2UgU3dpdGNoOgogICAgICAgICAvLyBUaGVzZSBhcmUgT0suCiAgICAg
ICAgIGJyZWFrOwogICAgIGNhc2UgSWRlbnRpdHk6CkBAIC0zNTAsMTYgKzM1MSw2IEBAIGlubGlu
ZSBDYXBhYmlsaXR5TGV2ZWwgY2FuQ29tcGlsZShOb2RlKiAKICAgICAgICAgaWYgKG5vZGUtPmlz
QmluYXJ5VXNlS2luZChVbnR5cGVkVXNlKSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBy
ZXR1cm4gQ2Fubm90Q29tcGlsZTsKLSAgICBjYXNlIFN3aXRjaDoKLSAgICAgICAgc3dpdGNoIChu
b2RlLT5zd2l0Y2hEYXRhKCktPmtpbmQpIHsKLSAgICAgICAgY2FzZSBTd2l0Y2hJbW06Ci0gICAg
ICAgIGNhc2UgU3dpdGNoQ2hhcjoKLSAgICAgICAgY2FzZSBTd2l0Y2hDZWxsOgotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQ2Fubm90Q29t
cGlsZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICAv
LyBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgYW55dGhpbmcgZWxzZS4KICAgICAgICAgcmV0dXJu
IENhbm5vdENvbXBpbGU7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEludHJp
bnNpY1JlcG9zaXRvcnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTEludHJpbnNpY1JlcG9zaXRvcnkuaAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExJbnRyaW5zaWNSZXBvc2l0b3J5LmgJKHdvcmtpbmcgY29weSkK
QEAgLTExMiw3ICsxMTIsOCBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEZUTCB7CiAgICAg
bWFjcm8oVl9KSVRPcGVyYXRpb25fWiwgZnVuY3Rpb25UeXBlKHZvaWRUeXBlLCBpbnQzMikpIFwK
ICAgICBtYWNybyhaX0pJVE9wZXJhdGlvbl9ELCBmdW5jdGlvblR5cGUoaW50MzIsIGRvdWJsZVR5
cGUpKSBcCiAgICAgbWFjcm8oWl9KSVRPcGVyYXRpb25fRUMsIGZ1bmN0aW9uVHlwZShpbnQzMiwg
aW50UHRyLCBpbnRQdHIpKSBcCi0gICAgbWFjcm8oWl9KSVRPcGVyYXRpb25fRUpaLCBmdW5jdGlv
blR5cGUoaW50MzIsIGludFB0ciwgaW50NjQsIGludDMyKSkKKyAgICBtYWNybyhaX0pJVE9wZXJh
dGlvbl9FSlosIGZ1bmN0aW9uVHlwZShpbnQzMiwgaW50UHRyLCBpbnQ2NCwgaW50MzIpKSBcCisg
ICAgbWFjcm8oWl9KSVRPcGVyYXRpb25fRVNKc3MsIGZ1bmN0aW9uVHlwZShpbnQzMiwgaW50UHRy
LCBpbnRQdHIsIGludDY0KSkgXAogICAgIAogY2xhc3MgSW50cmluc2ljUmVwb3NpdG9yeSA6IHB1
YmxpYyBDb21tb25WYWx1ZXMgewogcHVibGljOgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2Z0bC9GVExMb3dlckRGR1RvTExWTS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2Z0bC9GVExMb3dlckRGR1RvTExWTS5jcHAJKHJldmlzaW9uIDE4MzQ5NykKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMTG93ZXJERkdUb0xMVk0uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC00NDM5LDcgKzQ0MzksNTQgQEAgcHJpdmF0ZToKICAgICAgICAgfQogICAgICAgICAK
ICAgICAgICAgY2FzZSBTd2l0Y2hTdHJpbmc6IHsKLSAgICAgICAgICAgIERGR19DUkFTSChtX2dy
YXBoLCBtX25vZGUsICJVbmltcGxlbWVudGVkIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1fbm9k
ZS0+Y2hpbGQxKCkudXNlS2luZCgpKSB7CisgICAgICAgICAgICBjYXNlIFN0cmluZ0lkZW50VXNl
OiB7CisgICAgICAgICAgICAgICAgTFZhbHVlIHN0cmluZ0ltcGwgPSBsb3dTdHJpbmdJZGVudCht
X25vZGUtPmNoaWxkMSgpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWZWN0
b3I8U3dpdGNoQ2FzZT4gY2FzZXM7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGRhdGEtPmNhc2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIExW
YWx1ZSB2YWx1ZSA9IG1fb3V0LmNvbnN0SW50UHRyKGRhdGEtPmNhc2VzW2ldLnZhbHVlLnN0cmlu
Z0ltcGwoKSk7CisgICAgICAgICAgICAgICAgICAgIExCYXNpY0Jsb2NrIGJsb2NrID0gbG93Qmxv
Y2soZGF0YS0+Y2FzZXNbaV0udGFyZ2V0LmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgV2Vp
Z2h0IHdlaWdodCA9IFdlaWdodChkYXRhLT5jYXNlc1tpXS50YXJnZXQuY291bnQpOworICAgICAg
ICAgICAgICAgICAgICBjYXNlcy5hcHBlbmQoU3dpdGNoQ2FzZSh2YWx1ZSwgYmxvY2ssIHdlaWdo
dCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBtX291dC5zd2l0Y2hJbnN0cnVjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nSW1w
bCwgY2FzZXMsIGxvd0Jsb2NrKGRhdGEtPmZhbGxUaHJvdWdoLmJsb2NrKSwKKyAgICAgICAgICAg
ICAgICAgICAgV2VpZ2h0KGRhdGEtPmZhbGxUaHJvdWdoLmNvdW50KSk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
Y2FzZSBTdHJpbmdVc2U6IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2hTdHJpbmcoZGF0YSwgbG93
U3RyaW5nKG1fbm9kZS0+Y2hpbGQxKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFVudHlwZWRVc2U6
IHsKKyAgICAgICAgICAgICAgICBMVmFsdWUgdmFsdWUgPSBsb3dKU1ZhbHVlKG1fbm9kZS0+Y2hp
bGQxKCkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExCYXNpY0Jsb2NrIGlz
Q2VsbEJsb2NrID0gRlRMX05FV19CTE9DSyhtX291dCwgKCJTd2l0Y2gvU3dpdGNoU3RyaW5nIFVu
dHlwZWQgY2VsbCBjYXNlIikpOworICAgICAgICAgICAgICAgIExCYXNpY0Jsb2NrIGlzU3RyaW5n
QmxvY2sgPSBGVExfTkVXX0JMT0NLKG1fb3V0LCAoIlN3aXRjaC9Td2l0Y2hTdHJpbmcgVW50eXBl
ZCBzdHJpbmcgY2FzZSIpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtX291
dC5icmFuY2goCisgICAgICAgICAgICAgICAgICAgIGlzQ2VsbCh2YWx1ZSksIHVuc3VyZShpc0Nl
bGxCbG9jayksIHVuc3VyZShsb3dCbG9jayhkYXRhLT5mYWxsVGhyb3VnaC5ibG9jaykpKTsKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMQmFzaWNCbG9jayBsYXN0TmV4dCA9IG1f
b3V0LmFwcGVuZFRvKGlzQ2VsbEJsb2NrLCBpc1N0cmluZ0Jsb2NrKTsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBtX291dC5icmFuY2goCisgICAgICAgICAgICAgICAgICAgIGlz
U3RyaW5nKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgdW5zdXJlKGlzU3RyaW5nQmxvY2sp
LCB1bnN1cmUobG93QmxvY2soZGF0YS0+ZmFsbFRocm91Z2guYmxvY2spKSk7CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgbV9vdXQuYXBwZW5kVG8oaXNTdHJpbmdCbG9jaywgbGFz
dE5leHQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaFN0cmluZyhk
YXRhLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBERkdf
Q1JBU0gobV9ncmFwaCwgbV9ub2RlLCAiQmFkIHVzZSBraW5kIik7CisgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAg
ICAgICAgICAgICAKQEAgLTYwMzksNiArNjA4NiwyNTggQEAgcHJpdmF0ZToKICAgICAgICAgICAg
IGxvd0Jsb2NrKGRhdGEtPmZhbGxUaHJvdWdoLmJsb2NrKSwgV2VpZ2h0KGRhdGEtPmZhbGxUaHJv
dWdoLmNvdW50KSk7CiAgICAgfQogICAgIAorICAgIHZvaWQgc3dpdGNoU3RyaW5nKFN3aXRjaERh
dGEqIGRhdGEsIExWYWx1ZSBzdHJpbmcpCisgICAgeworICAgICAgICBib29sIGNhbkRvQmluYXJ5
U3dpdGNoID0gdHJ1ZTsKKyAgICAgICAgdW5zaWduZWQgdG90YWxMZW5ndGggPSAwOworICAgICAg
ICAKKyAgICAgICAgZm9yIChERkc6OlN3aXRjaENhc2UgbXlDYXNlIDogZGF0YS0+Y2FzZXMpIHsK
KyAgICAgICAgICAgIFN0cmluZ0ltcGwqIHN0cmluZyA9IG15Q2FzZS52YWx1ZS5zdHJpbmdJbXBs
KCk7CisgICAgICAgICAgICBpZiAoIXN0cmluZy0+aXM4Qml0KCkpIHsKKyAgICAgICAgICAgICAg
ICBjYW5Eb0JpbmFyeVN3aXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmluZy0+bGVuZ3RoKCkgPiBPcHRpb25zOjpt
YXhpbXVtQmluYXJ5U3RyaW5nU3dpdGNoQ2FzZUxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAg
Y2FuRG9CaW5hcnlTd2l0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IHN0cmluZy0+bGVuZ3RoKCk7Cisg
ICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghY2FuRG9CaW5hcnlTd2l0Y2ggfHwgdG90
YWxMZW5ndGggPiBPcHRpb25zOjptYXhpbXVtQmluYXJ5U3RyaW5nU3dpdGNoVG90YWxMZW5ndGgo
KSkgeworICAgICAgICAgICAgc3dpdGNoU3RyaW5nU2xvdyhkYXRhLCBzdHJpbmcpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBMVmFsdWUgc3RyaW5n
SW1wbCA9IG1fb3V0LmxvYWRQdHIoc3RyaW5nLCBtX2hlYXBzLkpTU3RyaW5nX3ZhbHVlKTsKKyAg
ICAgICAgTFZhbHVlIGxlbmd0aCA9IG1fb3V0LmxvYWQzMihzdHJpbmcsIG1faGVhcHMuSlNTdHJp
bmdfbGVuZ3RoKTsKKyAgICAgICAgCisgICAgICAgIExCYXNpY0Jsb2NrIGhhc0ltcGxCbG9jayA9
IEZUTF9ORVdfQkxPQ0sobV9vdXQsICgiU3dpdGNoL1N3aXRjaFN0cmluZyBoYXMgaW1wbCBjYXNl
IikpOworICAgICAgICBMQmFzaWNCbG9jayBpczhCaXRCbG9jayA9IEZUTF9ORVdfQkxPQ0sobV9v
dXQsICgiU3dpdGNoL1N3aXRjaFN0cmluZyBpcyA4IGJpdCBjYXNlIikpOworICAgICAgICBMQmFz
aWNCbG9jayBzbG93QmxvY2sgPSBGVExfTkVXX0JMT0NLKG1fb3V0LCAoIlN3aXRjaC9Td2l0Y2hT
dHJpbmcgc2xvdyBjYXNlIikpOworICAgICAgICAKKyAgICAgICAgbV9vdXQuYnJhbmNoKG1fb3V0
LmlzTnVsbChzdHJpbmdJbXBsKSwgdW5zdXJlKHNsb3dCbG9jayksIHVuc3VyZShoYXNJbXBsQmxv
Y2spKTsKKyAgICAgICAgCisgICAgICAgIExCYXNpY0Jsb2NrIGxhc3ROZXh0ID0gbV9vdXQuYXBw
ZW5kVG8oaGFzSW1wbEJsb2NrLCBpczhCaXRCbG9jayk7CisgICAgICAgIAorICAgICAgICBtX291
dC5icmFuY2goCisgICAgICAgICAgICBtX291dC50ZXN0SXNaZXJvMzIoCisgICAgICAgICAgICAg
ICAgbV9vdXQubG9hZDMyKHN0cmluZ0ltcGwsIG1faGVhcHMuU3RyaW5nSW1wbF9oYXNoQW5kRmxh
Z3MpLAorICAgICAgICAgICAgICAgIG1fb3V0LmNvbnN0SW50MzIoU3RyaW5nSW1wbDo6ZmxhZ0lz
OEJpdCgpKSksCisgICAgICAgICAgICB1bnN1cmUoc2xvd0Jsb2NrKSwgdW5zdXJlKGlzOEJpdEJs
b2NrKSk7CisgICAgICAgIAorICAgICAgICBtX291dC5hcHBlbmRUbyhpczhCaXRCbG9jaywgc2xv
d0Jsb2NrKTsKKyAgICAgICAgCisgICAgICAgIExWYWx1ZSBidWZmZXIgPSBtX291dC5sb2FkUHRy
KHN0cmluZ0ltcGwsIG1faGVhcHMuU3RyaW5nSW1wbF9kYXRhKTsKKyAgICAgICAgCisgICAgICAg
IC8vIEZJWE1FOiBXZSBzaG91bGQgcHJvcGFnYXRlIGJyYW5jaCB3ZWlnaHQgZGF0YSB0byB0aGUg
Y2FzZXMgb2YgdGhpcyBzd2l0Y2guCisgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xNDQzNjgKKyAgICAgICAgCisgICAgICAgIFZlY3RvcjxTdHJpbmdT
d2l0Y2hDYXNlPiBjYXNlczsKKyAgICAgICAgZm9yIChERkc6OlN3aXRjaENhc2UgbXlDYXNlIDog
ZGF0YS0+Y2FzZXMpCisgICAgICAgICAgICBjYXNlcy5hcHBlbmQoU3RyaW5nU3dpdGNoQ2FzZSht
eUNhc2UudmFsdWUuc3RyaW5nSW1wbCgpLCBsb3dCbG9jayhteUNhc2UudGFyZ2V0LmJsb2NrKSkp
OworICAgICAgICBzdGQ6OnNvcnQoY2FzZXMuYmVnaW4oKSwgY2FzZXMuZW5kKCkpOworICAgICAg
ICBzd2l0Y2hTdHJpbmdSZWN1cnNlKGRhdGEsIGJ1ZmZlciwgbGVuZ3RoLCBjYXNlcywgMCwgMCwg
Y2FzZXMuc2l6ZSgpLCAwLCBmYWxzZSk7CisKKyAgICAgICAgbV9vdXQuYXBwZW5kVG8oc2xvd0Js
b2NrLCBsYXN0TmV4dCk7CisgICAgICAgIHN3aXRjaFN0cmluZ1Nsb3coZGF0YSwgc3RyaW5nKTsK
KyAgICB9CisgICAgCisgICAgLy8gVGhlIGNvZGUgZm9yIHN0cmluZyBzd2l0Y2hpbmcgaXMgYmFz
ZWQgY2xvc2VseSBvbiB0aGUgc2FtZSBjb2RlIGluIHRoZSBERkcgYmFja2VuZC4gV2hpbGUgaXQK
KyAgICAvLyB3b3VsZCBiZSBuaWNlIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIHNpbWlsYXItbG9v
a2luZyBjb2RlLCBpdCBzZWVtcyBsaWtlIHRoaXMgaXMgb25lIG9mCisgICAgLy8gdGhvc2UgYWxn
b3JpdGhtcyB3aGVyZSBmYWN0b3Jpbmcgb3V0IHRoZSBjb21tb24gYml0cyB3b3VsZCByZXN1bHQg
aW4gbW9yZSBjb2RlIHRoYW4ganVzdAorICAgIC8vIGR1cGxpY2F0aW5nLgorICAgIAorICAgIHN0
cnVjdCBTdHJpbmdTd2l0Y2hDYXNlIHsKKyAgICAgICAgU3RyaW5nU3dpdGNoQ2FzZSgpIHsgfQor
ICAgICAgICAKKyAgICAgICAgU3RyaW5nU3dpdGNoQ2FzZShTdHJpbmdJbXBsKiBzdHJpbmcsIExC
YXNpY0Jsb2NrIHRhcmdldCkKKyAgICAgICAgICAgIDogc3RyaW5nKHN0cmluZykKKyAgICAgICAg
ICAgICwgdGFyZ2V0KHRhcmdldCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgYm9v
bCBvcGVyYXRvcjwoY29uc3QgU3RyaW5nU3dpdGNoQ2FzZSYgb3RoZXIpIGNvbnN0CisgICAgICAg
IHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdMZXNzVGhhbihzdHJpbmcsIG90aGVyLnN0cmlu
Zyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZ0ltcGwqIHN0cmluZzsKKyAg
ICAgICAgTEJhc2ljQmxvY2sgdGFyZ2V0OworICAgIH07CisgICAgCisgICAgc3RydWN0IENoYXJh
Y3RlckNhc2UgeworICAgICAgICBDaGFyYWN0ZXJDYXNlKCkKKyAgICAgICAgICAgIDogY2hhcmFj
dGVyKDApCisgICAgICAgICAgICAsIGJlZ2luKDApCisgICAgICAgICAgICAsIGVuZCgwKQorICAg
ICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIENoYXJhY3RlckNhc2UoTENoYXIg
Y2hhcmFjdGVyLCB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgZW5kKQorICAgICAgICAgICAgOiBj
aGFyYWN0ZXIoY2hhcmFjdGVyKQorICAgICAgICAgICAgLCBiZWdpbihiZWdpbikKKyAgICAgICAg
ICAgICwgZW5kKGVuZCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBi
b29sIG9wZXJhdG9yPChjb25zdCBDaGFyYWN0ZXJDYXNlJiBvdGhlcikgY29uc3QKKyAgICAgICAg
eworICAgICAgICAgICAgcmV0dXJuIGNoYXJhY3RlciA8IG90aGVyLmNoYXJhY3RlcjsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgTENoYXIgY2hhcmFjdGVyOworICAgICAgICB1bnNpZ25l
ZCBiZWdpbjsKKyAgICAgICAgdW5zaWduZWQgZW5kOworICAgIH07CisgICAgCisgICAgdm9pZCBz
d2l0Y2hTdHJpbmdSZWN1cnNlKAorICAgICAgICBTd2l0Y2hEYXRhKiBkYXRhLCBMVmFsdWUgYnVm
ZmVyLCBMVmFsdWUgbGVuZ3RoLCBjb25zdCBWZWN0b3I8U3RyaW5nU3dpdGNoQ2FzZT4mIGNhc2Vz
LAorICAgICAgICB1bnNpZ25lZCBudW1DaGVja2VkLCB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQg
ZW5kLCB1bnNpZ25lZCBhbHJlYWR5Q2hlY2tlZExlbmd0aCwKKyAgICAgICAgdW5zaWduZWQgY2hl
Y2tlZEV4YWN0TGVuZ3RoKQorICAgIHsKKyAgICAgICAgTEJhc2ljQmxvY2sgZmFsbFRocm91Z2gg
PSBsb3dCbG9jayhkYXRhLT5mYWxsVGhyb3VnaC5ibG9jayk7CisgICAgICAgIAorICAgICAgICBp
ZiAoYmVnaW4gPT0gZW5kKSB7CisgICAgICAgICAgICBtX291dC5qdW1wKGZhbGxUaHJvdWdoKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdW5zaWdu
ZWQgbWluTGVuZ3RoID0gY2FzZXNbYmVnaW5dLnN0cmluZy0+bGVuZ3RoKCk7CisgICAgICAgIHVu
c2lnbmVkIGNvbW1vbkNoYXJzID0gbWluTGVuZ3RoOworICAgICAgICBib29sIGFsbExlbmd0aHNF
cXVhbCA9IHRydWU7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IGJlZ2luICsgMTsgaSA8IGVu
ZDsgKytpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBteUNvbW1vbkNoYXJzID0gbnVtQ2hlY2tl
ZDsKKyAgICAgICAgICAgIGZvciAoCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaiA9IG51bUNo
ZWNrZWQ7CisgICAgICAgICAgICAgICAgaiA8IHN0ZDo6bWluKGNhc2VzW2JlZ2luXS5zdHJpbmct
Pmxlbmd0aCgpLCBjYXNlc1tpXS5zdHJpbmctPmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAr
K2opIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FzZXNbYmVnaW5dLnN0cmluZy0+YXQoaikgIT0g
Y2FzZXNbaV0uc3RyaW5nLT5hdChqKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgbXlDb21tb25DaGFycysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
Y29tbW9uQ2hhcnMgPSBzdGQ6Om1pbihjb21tb25DaGFycywgbXlDb21tb25DaGFycyk7CisgICAg
ICAgICAgICBpZiAobWluTGVuZ3RoICE9IGNhc2VzW2ldLnN0cmluZy0+bGVuZ3RoKCkpCisgICAg
ICAgICAgICAgICAgYWxsTGVuZ3Roc0VxdWFsID0gZmFsc2U7CisgICAgICAgICAgICBtaW5MZW5n
dGggPSBzdGQ6Om1pbihtaW5MZW5ndGgsIGNhc2VzW2ldLnN0cmluZy0+bGVuZ3RoKCkpOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY2hlY2tlZEV4YWN0TGVuZ3RoKSB7CisgICAg
ICAgICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIG1fbm9kZSwgYWxyZWFkeUNoZWNrZWRMZW5ndGgg
PT0gbWluTGVuZ3RoKTsKKyAgICAgICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2RlLCBh
bGxMZW5ndGhzRXF1YWwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBERkdfQVNTRVJU
KG1fZ3JhcGgsIG1fbm9kZSwgbWluTGVuZ3RoID49IGNvbW1vbkNoYXJzKTsKKyAgICAgICAgCisg
ICAgICAgIGlmICghYWxsTGVuZ3Roc0VxdWFsICYmIGFscmVhZHlDaGVja2VkTGVuZ3RoIDwgbWlu
TGVuZ3RoKQorICAgICAgICAgICAgbV9vdXQuY2hlY2sobV9vdXQuYmVsb3cobGVuZ3RoLCBtX291
dC5jb25zdEludDMyKG1pbkxlbmd0aCkpLCB1bnN1cmUoZmFsbFRocm91Z2gpKTsKKyAgICAgICAg
aWYgKGFsbExlbmd0aHNFcXVhbCAmJiAoYWxyZWFkeUNoZWNrZWRMZW5ndGggPCBtaW5MZW5ndGgg
fHwgIWNoZWNrZWRFeGFjdExlbmd0aCkpCisgICAgICAgICAgICBtX291dC5jaGVjayhtX291dC5u
b3RFcXVhbChsZW5ndGgsIG1fb3V0LmNvbnN0SW50MzIobWluTGVuZ3RoKSksIHVuc3VyZShmYWxs
VGhyb3VnaCkpOworICAgICAgICAKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gbnVtQ2hlY2tl
ZDsgaSA8IGNvbW1vbkNoYXJzOyArK2kpIHsKKyAgICAgICAgICAgIG1fb3V0LmNoZWNrKAorICAg
ICAgICAgICAgICAgIG1fb3V0Lm5vdEVxdWFsKAorICAgICAgICAgICAgICAgICAgICBtX291dC5s
b2FkOChidWZmZXIsIG1faGVhcHMuY2hhcmFjdGVyczhbaV0pLAorICAgICAgICAgICAgICAgICAg
ICBtX291dC5jb25zdEludDgoY2FzZXNbYmVnaW5dLnN0cmluZy0+YXQoaSkpKSwKKyAgICAgICAg
ICAgICAgICB1bnN1cmUoZmFsbFRocm91Z2gpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAg
ICAgaWYgKG1pbkxlbmd0aCA9PSBjb21tb25DaGFycykgeworICAgICAgICAgICAgLy8gVGhpcyBp
cyB0aGUgY2FzZSB3aGVyZSBvbmUgb2YgdGhlIGNhc2VzIGlzIGEgcHJlZml4IG9mIGFsbCBvZiB0
aGUgb3RoZXIgY2FzZXMuCisgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGNoZWNrZWQgdGhh
dCB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgcHJlZml4IG9mIGFsbCBvZiB0aGUgY2FzZXMsCisgICAg
ICAgICAgICAvLyBzbyB3ZSBqdXN0IGNoZWNrIGxlbmd0aCB0byBqdW1wIHRvIHRoYXQgY2FzZS4K
KyAgICAgICAgICAgIAorICAgICAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBtX25vZGUsIGNh
c2VzW2JlZ2luXS5zdHJpbmctPmxlbmd0aCgpID09IGNvbW1vbkNoYXJzKTsKKyAgICAgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IGJlZ2luICsgMTsgaSA8IGVuZDsgKytpKQorICAgICAgICAgICAg
ICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2RlLCBjYXNlc1tpXS5zdHJpbmctPmxlbmd0aCgp
ID4gY29tbW9uQ2hhcnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWxsTGVuZ3Ro
c0VxdWFsKSB7CisgICAgICAgICAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBtX25vZGUsIGVu
ZCA9PSBiZWdpbiArIDEpOworICAgICAgICAgICAgICAgIG1fb3V0Lmp1bXAoY2FzZXNbYmVnaW5d
LnRhcmdldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgCisgICAgICAgICAgICBtX291dC5jaGVjaygKKyAgICAgICAgICAgICAgICBtX291dC5l
cXVhbChsZW5ndGgsIG1fb3V0LmNvbnN0SW50MzIoY29tbW9uQ2hhcnMpKSwKKyAgICAgICAgICAg
ICAgICB1bnN1cmUoY2FzZXNbYmVnaW5dLnRhcmdldCkpOworICAgICAgICAgICAgCisgICAgICAg
ICAgICAvLyBXZSd2ZSBjaGVja2VkIGlmIHRoZSBsZW5ndGggaXMgPj0gbWluTGVuZ3RoLCBhbmQg
dGhlbiB3ZSBjaGVja2VkIGlmIHRoZSBsZW5ndGggaXMKKyAgICAgICAgICAgIC8vID09IGNvbW1v
bkNoYXJzLiBXZSBnZXQgdG8gdGhpcyBwb2ludCBpZiBpdCBpcyA+PSBtaW5MZW5ndGggYnV0IG5v
dCA9PSBjb21tb25DaGFycy4KKyAgICAgICAgICAgIC8vIEhlbmNlIHdlIGtub3cgdGhhdCBpdCBu
b3cgbXVzdCBiZSA+IG1pbkxlbmd0aCwgaS5lLiB0aGF0IGl0J3MgPj0gbWluTGVuZ3RoICsgMS4K
KyAgICAgICAgICAgIHN3aXRjaFN0cmluZ1JlY3Vyc2UoCisgICAgICAgICAgICAgICAgZGF0YSwg
YnVmZmVyLCBsZW5ndGgsIGNhc2VzLCBjb21tb25DaGFycywgYmVnaW4gKyAxLCBlbmQsIG1pbkxl
bmd0aCArIDEsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgdGhlIHN0cmluZyBpcyBs
b25nZXIgdGhhbiBjb21tb25DaGFycywgYW5kIHdlJ3ZlIG9ubHkgdmVyaWZpZWQKKyAgICAgICAg
Ly8gY29tbW9uQ2hhcnMuIFVzZSBhIGJpbmFyeSBzd2l0Y2ggb24gdGhlIG5leHQgdW5jaGVja2Vk
IGNoYXJhY3RlciwgaS5lLgorICAgICAgICAvLyBzdHJpbmdbY29tbW9uQ2hhcnNdLgorICAgICAg
ICAKKyAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBtX25vZGUsIGVuZCA+PSBiZWdpbiArIDIp
OworICAgICAgICAKKyAgICAgICAgTFZhbHVlIHVuY2hlY2tlZENoYXIgPSBtX291dC5sb2FkOChi
dWZmZXIsIG1faGVhcHMuY2hhcmFjdGVyczhbY29tbW9uQ2hhcnNdKTsKKyAgICAgICAgCisgICAg
ICAgIFZlY3RvcjxDaGFyYWN0ZXJDYXNlPiBjaGFyYWN0ZXJDYXNlczsKKyAgICAgICAgQ2hhcmFj
dGVyQ2FzZSBjdXJyZW50Q2FzZShjYXNlc1tiZWdpbl0uc3RyaW5nLT5hdChjb21tb25DaGFycyks
IGJlZ2luLCBiZWdpbiArIDEpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBiZWdpbiArIDE7
IGkgPCBlbmQ7ICsraSkgeworICAgICAgICAgICAgTENoYXIgY3VycmVudENoYXIgPSBjYXNlc1tp
XS5zdHJpbmctPmF0KGNvbW1vbkNoYXJzKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciAh
PSBjdXJyZW50Q2FzZS5jaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2FzZS5l
bmQgPSBpOworICAgICAgICAgICAgICAgIGNoYXJhY3RlckNhc2VzLmFwcGVuZChjdXJyZW50Q2Fz
ZSk7CisgICAgICAgICAgICAgICAgY3VycmVudENhc2UgPSBDaGFyYWN0ZXJDYXNlKGN1cnJlbnRD
aGFyLCBpLCBpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjdXJy
ZW50Q2FzZS5lbmQgPSBpICsgMTsKKyAgICAgICAgfQorICAgICAgICBjaGFyYWN0ZXJDYXNlcy5h
cHBlbmQoY3VycmVudENhc2UpOworICAgICAgICAKKyAgICAgICAgVmVjdG9yPExCYXNpY0Jsb2Nr
PiBjaGFyYWN0ZXJCbG9ja3M7CisgICAgICAgIGZvciAoQ2hhcmFjdGVyQ2FzZSYgbXlDYXNlIDog
Y2hhcmFjdGVyQ2FzZXMpCisgICAgICAgICAgICBjaGFyYWN0ZXJCbG9ja3MuYXBwZW5kKEZUTF9O
RVdfQkxPQ0sobV9vdXQsICgiU3dpdGNoL1N3aXRjaFN0cmluZyBjYXNlIGZvciAiLCBteUNhc2Uu
Y2hhcmFjdGVyLCAiIGF0IGluZGV4ICIsIGNvbW1vbkNoYXJzKSkpOworICAgICAgICAKKyAgICAg
ICAgVmVjdG9yPFN3aXRjaENhc2U+IHN3aXRjaENhc2VzOworICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgY2hhcmFjdGVyQ2FzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN3
aXRjaENhc2VzLmFwcGVuZChTd2l0Y2hDYXNlKAorICAgICAgICAgICAgICAgIG1fb3V0LmNvbnN0
SW50OChjaGFyYWN0ZXJDYXNlc1tpXS5jaGFyYWN0ZXIpLCBjaGFyYWN0ZXJCbG9ja3NbaV0sIFdl
aWdodCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgbV9vdXQuc3dpdGNoSW5zdHJ1Y3Rpb24odW5j
aGVja2VkQ2hhciwgc3dpdGNoQ2FzZXMsIGZhbGxUaHJvdWdoLCBXZWlnaHQoKSk7CisgICAgICAg
IAorICAgICAgICBMQmFzaWNCbG9jayBsYXN0TmV4dCA9IG1fb3V0Lm1fbmV4dEJsb2NrOworICAg
ICAgICBjaGFyYWN0ZXJCbG9ja3MuYXBwZW5kKGxhc3ROZXh0KTsgLy8gTWFrZXMgaXQgY29udmVu
aWVudCB0byBzZXQgbmV4dEJsb2NrLgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
Y2hhcmFjdGVyQ2FzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIG1fb3V0LmFwcGVuZFRv
KGNoYXJhY3RlckJsb2Nrc1tpXSwgY2hhcmFjdGVyQmxvY2tzW2kgKyAxXSk7CisgICAgICAgICAg
ICBzd2l0Y2hTdHJpbmdSZWN1cnNlKAorICAgICAgICAgICAgICAgIGRhdGEsIGJ1ZmZlciwgbGVu
Z3RoLCBjYXNlcywgY29tbW9uQ2hhcnMgKyAxLAorICAgICAgICAgICAgICAgIGNoYXJhY3RlckNh
c2VzW2ldLmJlZ2luLCBjaGFyYWN0ZXJDYXNlc1tpXS5lbmQsIG1pbkxlbmd0aCwgYWxsTGVuZ3Ro
c0VxdWFsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgREZHX0FTU0VSVChtX2dyYXBo
LCBtX25vZGUsIG1fb3V0Lm1fbmV4dEJsb2NrID09IGxhc3ROZXh0KTsKKyAgICB9CisgICAgCisg
ICAgdm9pZCBzd2l0Y2hTdHJpbmdTbG93KFN3aXRjaERhdGEqIGRhdGEsIExWYWx1ZSBzdHJpbmcp
CisgICAgeworICAgICAgICBMVmFsdWUgYnJhbmNoT2Zmc2V0ID0gdm1DYWxsKAorICAgICAgICAg
ICAgbV9vdXQub3BlcmF0aW9uKG9wZXJhdGlvblN3aXRjaFN0cmluZ0FuZEdldEJyYW5jaE9mZnNl
dCksCisgICAgICAgICAgICBtX2NhbGxGcmFtZSwgbV9vdXQuY29uc3RJbnQzMihkYXRhLT5zd2l0
Y2hUYWJsZUluZGV4KSwgc3RyaW5nKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ0p1bXBUYWJs
ZSYgdGFibGUgPSBjb2RlQmxvY2soKS0+c3RyaW5nU3dpdGNoSnVtcFRhYmxlKGRhdGEtPnN3aXRj
aFRhYmxlSW5kZXgpOworICAgICAgICAKKyAgICAgICAgVmVjdG9yPFN3aXRjaENhc2U+IGNhc2Vz
OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YS0+Y2FzZXMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgICAgIERGRzo6U3dpdGNoQ2FzZSBteUNhc2UgPSBkYXRhLT5jYXNlc1tp
XTsKKyAgICAgICAgICAgIFN0cmluZ0p1bXBUYWJsZTo6U3RyaW5nT2Zmc2V0VGFibGU6Oml0ZXJh
dG9yIGl0ZXIgPQorICAgICAgICAgICAgICAgIHRhYmxlLm9mZnNldFRhYmxlLmZpbmQobXlDYXNl
LnZhbHVlLnN0cmluZ0ltcGwoKSk7CisgICAgICAgICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIG1f
bm9kZSwgaXRlciAhPSB0YWJsZS5vZmZzZXRUYWJsZS5lbmQoKSk7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGNhc2VzLmFwcGVuZChTd2l0Y2hDYXNlKAorICAgICAgICAgICAgICAgIG1fb3V0
LmNvbnN0SW50MzIoaXRlci0+dmFsdWUuYnJhbmNoT2Zmc2V0KSwKKyAgICAgICAgICAgICAgICBs
b3dCbG9jayhteUNhc2UudGFyZ2V0LmJsb2NrKSwgV2VpZ2h0KG15Q2FzZS50YXJnZXQuY291bnQp
KSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1fb3V0LnN3aXRjaEluc3RydWN0aW9u
KAorICAgICAgICAgICAgYnJhbmNoT2Zmc2V0LCBjYXNlcywgbG93QmxvY2soZGF0YS0+ZmFsbFRo
cm91Z2guYmxvY2spLAorICAgICAgICAgICAgV2VpZ2h0KGRhdGEtPmZhbGxUaHJvdWdoLmNvdW50
KSk7CisgICAgfQorICAgIAogICAgIExWYWx1ZSBkb3VibGVUb0ludDMyKExWYWx1ZSBkb3VibGVW
YWx1ZSwgZG91YmxlIGxvdywgZG91YmxlIGhpZ2gsIGJvb2wgaXNTaWduZWQgPSB0cnVlKQogICAg
IHsKICAgICAgICAgTEJhc2ljQmxvY2sgZ3JlYXRFbm91Z2ggPSBGVExfTkVXX0JMT0NLKG1fb3V0
LCAoImRvdWJsZVRvSW50MzIgZ3JlYXRFbm91Z2giKSk7CkBAIC03MTczLDggKzc0NzIsOCBAQCBw
cml2YXRlOgogICAgICAgICAKICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IG1fZnRsU3RhdGUuaml0
Q29kZS0+b3NyRXhpdC5sYXN0KCk7CiAKLSAgICAgICAgTEJhc2ljQmxvY2sgbGFzdE5leHQgPSAw
OwotICAgICAgICBMQmFzaWNCbG9jayBjb250aW51YXRpb24gPSAwOworICAgICAgICBMQmFzaWNC
bG9jayBsYXN0TmV4dCA9IG51bGxwdHI7CisgICAgICAgIExCYXNpY0Jsb2NrIGNvbnRpbnVhdGlv
biA9IG51bGxwdHI7CiAgICAgICAgIAogICAgICAgICBMQmFzaWNCbG9jayBmYWlsQ2FzZSA9IEZU
TF9ORVdfQkxPQ0sobV9vdXQsICgiT1NSIGV4aXQgZmFpbENhc2UgZm9yICIsIG1fbm9kZSkpOwog
ICAgICAgICBjb250aW51YXRpb24gPSBGVExfTkVXX0JMT0NLKG1fb3V0LCAoIk9TUiBleGl0IGNv
bnRpbnVhdGlvbiBmb3IgIiwgbV9ub2RlKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZnRsL0ZUTE91dHB1dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0
bC9GVExPdXRwdXQuY3BwCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZnRsL0ZUTE91dHB1dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzOCw2ICsxMzgsMTMgQEAg
dm9pZCBPdXRwdXQ6OmJyYW5jaChMVmFsdWUgY29uZGl0aW9uLCBMQgogICAgICAgICAgICAgY29u
c3RJbnQzMihub3RUYWtlbldlaWdodC5zY2FsZVRvVG90YWwodG90YWwpKSkpOwogfQogCit2b2lk
IE91dHB1dDo6Y2hlY2soTFZhbHVlIGNvbmRpdGlvbiwgV2VpZ2h0ZWRUYXJnZXQgdGFrZW4pCit7
CisgICAgTEJhc2ljQmxvY2sgY29udGludWF0aW9uID0gRlRMX05FV19CTE9DSygqdGhpcywgKCJP
dXRwdXQ6OmNoZWNrIGNvbnRpbnVhdGlvbiIpKTsKKyAgICBicmFuY2goY29uZGl0aW9uLCB0YWtl
biwgV2VpZ2h0ZWRUYXJnZXQoY29udGludWF0aW9uLCB0YWtlbi53ZWlnaHQoKS5pbnZlcnNlKCkp
KTsKKyAgICBhcHBlbmRUbyhjb250aW51YXRpb24pOworfQorCiB9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6RlRMCiAKICNlbmRpZiAvLyBFTkFCTEUoRlRMX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMT3V0cHV0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2Z0bC9GVExPdXRwdXQuaAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2Z0bC9GVExPdXRwdXQuaAkod29ya2luZyBjb3B5KQpAQCAtMzg0LDYgKzM4NCwxMCBA
QCBwdWJsaWM6CiAgICAgewogICAgICAgICBicmFuY2goY29uZGl0aW9uLCB0YWtlbi50YXJnZXQo
KSwgdGFrZW4ud2VpZ2h0KCksIG5vdFRha2VuLnRhcmdldCgpLCBub3RUYWtlbi53ZWlnaHQoKSk7
CiAgICAgfQorCisgICAgLy8gQnJhbmNoZXMgdG8gYW4gYWxyZWFkeS1jcmVhdGVkIGhhbmRsZXIg
aWYgdHJ1ZSwgImZhbGxzIHRocm91Z2giIGlmIGZhbHNlLiBGYWxsLXRocm91Z2ggaXMKKyAgICAv
LyBzaW11bGF0ZWQgYnkgY3JlYXRpbmcgYSBjb250aW51YXRpb24gZm9yIHlvdS4KKyAgICB2b2lk
IGNoZWNrKExWYWx1ZSBjb25kaXRpb24sIFdlaWdodGVkVGFyZ2V0IHRha2VuKTsKICAgICAKICAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgogICAgIHZvaWQgc3dpdGNoSW5zdHJ1Y3Rp
b24oTFZhbHVlIHZhbHVlLCBjb25zdCBWZWN0b3JUeXBlJiBjYXNlcywgTEJhc2ljQmxvY2sgZmFs
bFRocm91Z2gsIFdlaWdodCBmYWxsVGhyb3VnaFdlaWdodCkKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMV2VpZ2h0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2Z0bC9GVExXZWlnaHQuaAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2Z0bC9GVExXZWlnaHQuaAkod29ya2luZyBjb3B5KQpAQCAtNjIsNiArNjIsMTYgQEAg
cHVibGljOgogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHJlc3VsdCk7CiAg
ICAgfQogICAgIAorICAgIC8vIEludmVyc2Ugd2VpZ2h0IGZvciBhIHR3by10YXJnZXQgYnJhbmNo
LgorICAgIFdlaWdodCBpbnZlcnNlKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghaXNTZXQo
KSkKKyAgICAgICAgICAgIHJldHVybiBXZWlnaHQoKTsKKyAgICAgICAgaWYgKHZhbHVlKCkpCisg
ICAgICAgICAgICByZXR1cm4gV2VpZ2h0KDApOworICAgICAgICByZXR1cm4gV2VpZ2h0KDEpOwor
ICAgIH0KKyAgICAKIHByaXZhdGU6CiAgICAgZmxvYXQgbV92YWx1ZTsKIH07CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVE9wZXJhdGlvbnMuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVE9wZXJhdGlvbnMuaAkocmV2aXNpb24gMTgzNDk3KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVRPcGVyYXRpb25zLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTE1Nyw2ICsxNTcsNyBAQCB0eXBlZGVmIGludDY0X3QgSklUX09QRVJBVElPTigqUV9K
SVRPcGVyCiB0eXBlZGVmIGludDMyX3QgSklUX09QRVJBVElPTiAoKlpfSklUT3BlcmF0aW9uX0Qp
KGRvdWJsZSk7CiB0eXBlZGVmIGludDMyX3QgSklUX09QRVJBVElPTiAoKlpfSklUT3BlcmF0aW9u
X0UpKEV4ZWNTdGF0ZSopOwogdHlwZWRlZiBpbnQzMl90IEpJVF9PUEVSQVRJT04gKCpaX0pJVE9w
ZXJhdGlvbl9FQykoRXhlY1N0YXRlKiwgSlNDZWxsKik7Cit0eXBlZGVmIGludDMyX3QgSklUX09Q
RVJBVElPTiAoKlpfSklUT3BlcmF0aW9uX0VTSnNzKShFeGVjU3RhdGUqLCBzaXplX3QsIEpTU3Ry
aW5nKik7CiB0eXBlZGVmIGludDMyX3QgSklUX09QRVJBVElPTiAoKlpfSklUT3BlcmF0aW9uX0VK
WikoRXhlY1N0YXRlKiwgRW5jb2RlZEpTVmFsdWUsIGludDMyX3QpOwogdHlwZWRlZiBpbnQzMl90
IEpJVF9PUEVSQVRJT04gKCpaX0pJVE9wZXJhdGlvbl9FSlpaKShFeGVjU3RhdGUqLCBFbmNvZGVk
SlNWYWx1ZSwgaW50MzJfdCwgaW50MzJfdCk7CiB0eXBlZGVmIHNpemVfdCBKSVRfT1BFUkFUSU9O
ICgqU19KSVRPcGVyYXRpb25fRUNDKShFeGVjU3RhdGUqLCBKU0NlbGwqLCBKU0NlbGwqKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>251912</attachid>
            <date>2015-04-28 18:37:07 -0700</date>
            <delta_ts>2015-04-28 19:29:17 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>25388</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTgzNTIyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQyIEBA
CisyMDE1LTA0LTI4ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCBmdWxseSBzdXBwb3J0IFN3aXRjaCAoaXQgY3VycmVudGx5IGxhY2tzIHRoZSBT
d2l0Y2hTdHJpbmcgdmFyaWFudCkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTE0NDM0OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorICAgICAgICAKKyAgICAgICAgVGhpcyBhZGRzIFN3aXRjaFN0cmluZyBzdXBwb3J0IHRvIHRo
ZSBGVEwuIFRoaXMgaXMgYWxyZWFkeSB0ZXN0ZWQgYnkgc3dpdGNoIG1pY3JvYmVuY2htYXJrcwor
ICAgICAgICBpbiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzLgorCisgICAgICAgICogZGZnL0RGR0Nv
bW1vbi5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6c3RyaW5nTGVzc1RoYW4pOgorICAgICAgICAq
IGRmZy9ERkdDb21tb24uaDoKKyAgICAgICAgKiBkZmcvREZHT3BlcmF0aW9ucy5jcHA6CisgICAg
ICAgICogZGZnL0RGR09wZXJhdGlvbnMuaDoKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVK
SVQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpTdHJpbmdTd2l0Y2hD
YXNlOjpvcGVyYXRvcjwpOiBEZWxldGVkLgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJ
VC5oOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpTdHJpbmdTd2l0Y2hDYXNl
OjpvcGVyYXRvcjwpOgorICAgICAgICAqIGZ0bC9GVExDYXBhYmlsaXRpZXMuY3BwOgorICAgICAg
ICAoSlNDOjpGVEw6OmNhbkNvbXBpbGUpOgorICAgICAgICAqIGZ0bC9GVExJbnRyaW5zaWNSZXBv
c2l0b3J5Lmg6CisgICAgICAgICogZnRsL0ZUTExvd2VyREZHVG9MTFZNLmNwcDoKKyAgICAgICAg
KEpTQzo6RlRMOjpMb3dlckRGR1RvTExWTTo6Y29tcGlsZVN3aXRjaCk6CisgICAgICAgIChKU0M6
OkZUTDo6TG93ZXJERkdUb0xMVk06OnN3aXRjaFN0cmluZyk6CisgICAgICAgIChKU0M6OkZUTDo6
TG93ZXJERkdUb0xMVk06OlN0cmluZ1N3aXRjaENhc2U6OlN0cmluZ1N3aXRjaENhc2UpOgorICAg
ICAgICAoSlNDOjpGVEw6Okxvd2VyREZHVG9MTFZNOjpTdHJpbmdTd2l0Y2hDYXNlOjpvcGVyYXRv
cjwpOgorICAgICAgICAoSlNDOjpGVEw6Okxvd2VyREZHVG9MTFZNOjpDaGFyYWN0ZXJDYXNlOjpD
aGFyYWN0ZXJDYXNlKToKKyAgICAgICAgKEpTQzo6RlRMOjpMb3dlckRGR1RvTExWTTo6Q2hhcmFj
dGVyQ2FzZTo6b3BlcmF0b3I8KToKKyAgICAgICAgKEpTQzo6RlRMOjpMb3dlckRGR1RvTExWTTo6
c3dpdGNoU3RyaW5nUmVjdXJzZSk6CisgICAgICAgIChKU0M6OkZUTDo6TG93ZXJERkdUb0xMVk06
OnN3aXRjaFN0cmluZ1Nsb3cpOgorICAgICAgICAoSlNDOjpGVEw6Okxvd2VyREZHVG9MTFZNOjph
cHBlbmRPU1JFeGl0KToKKyAgICAgICAgKiBmdGwvRlRMT3V0cHV0LmNwcDoKKyAgICAgICAgKEpT
Qzo6RlRMOjpPdXRwdXQ6OmNoZWNrKToKKyAgICAgICAgKiBmdGwvRlRMT3V0cHV0Lmg6CisgICAg
ICAgICogZnRsL0ZUTFdlaWdodC5oOgorICAgICAgICAoSlNDOjpGVEw6OldlaWdodDo6aW52ZXJz
ZSk6CisgICAgICAgICogaml0L0pJVE9wZXJhdGlvbnMuaDoKKwogMjAxNS0wNC0yOCAgTWljaGFl
bCBDYXRhbnphcm8gIDxtY2F0YW56YXJvQGlnYWxpYS5jb20+CiAKICAgICAgICAgRnVsbHkgcmVw
bGFjZSBFTkFCTEVfTExJTlRfQ19MT09QIHdpdGggRU5BQkxFX0pJVApJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdDb21tb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHQ29tbW9uLmNwcAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDb21tb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Niw2
ICs0NiwxNyBAQCBib29sIGlzQ3Jhc2hpbmcoKQogICAgIHJldHVybiBjcmFzaExvY2suaXNMb2Nr
ZWQoKTsKIH0KIAorYm9vbCBzdHJpbmdMZXNzVGhhbihTdHJpbmdJbXBsKiBhLCBTdHJpbmdJbXBs
KiBiKQoreworICAgIHVuc2lnbmVkIG1pbkxlbmd0aCA9IHN0ZDo6bWluKGEtPmxlbmd0aCgpLCBi
LT5sZW5ndGgoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1pbkxlbmd0aDsgKytp
KSB7CisgICAgICAgIGlmIChhLT5hdChpKSA9PSBiLT5hdChpKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICByZXR1cm4gYS0+YXQoaSkgPCBiLT5hdChpKTsKKyAgICB9CisgICAgcmV0
dXJuIGEtPmxlbmd0aCgpIDwgYi0+bGVuZ3RoKCk7Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlND
OjpERkcKIAogbmFtZXNwYWNlIFdURiB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR0NvbW1vbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
Q29tbW9uLmgJKHJldmlzaW9uIDE4MzQ5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHQ29tbW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTI5Nyw2ICsyOTcsMTAgQEAgc3RydWN0IE5v
ZGVBbmRJbmRleCB7CiAgICAgdW5zaWduZWQgaW5kZXg7CiB9OwogCisvLyBBIGxlc3MtdGhhbiBv
cGVyYXRvciBmb3Igc3RyaW5ncyB0aGF0IGlzIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBzdHJpbmcg
c3dpdGNoZXMuIFNvcnRzIGJ5IDwKKy8vIHJlbGF0aW9uIG9uIGNoYXJhY3RlcnMuIEVuc3VyZXMg
dGhhdCBpZiBhIGlzIGEgcHJlZml4IG9mIGIsIHRoZW4gYSA8IGIuCitib29sIHN0cmluZ0xlc3NU
aGFuKFN0cmluZ0ltcGwqIGEsIFN0cmluZ0ltcGwqIGIpOworCiB9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6REZHCiAKIG5hbWVzcGFjZSBXVEYgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPcGVyYXRpb25zLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR09wZXJhdGlvbnMuY3BwCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR09wZXJhdGlvbnMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDc3LDYg
KzEwNzcsMTQgQEAgY2hhciogSklUX09QRVJBVElPTiBvcGVyYXRpb25Td2l0Y2hTdHJpbgogICAg
IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyKj4oZXhlYy0+Y29kZUJsb2NrKCktPnN0cmluZ1N3aXRj
aEp1bXBUYWJsZSh0YWJsZUluZGV4KS5jdGlGb3JWYWx1ZShzdHJpbmctPnZhbHVlKGV4ZWMpLmlt
cGwoKSkuZXhlY3V0YWJsZUFkZHJlc3MoKSk7CiB9CiAKK2ludDMyX3QgSklUX09QRVJBVElPTiBv
cGVyYXRpb25Td2l0Y2hTdHJpbmdBbmRHZXRCcmFuY2hPZmZzZXQoRXhlY1N0YXRlKiBleGVjLCBz
aXplX3QgdGFibGVJbmRleCwgSlNTdHJpbmcqIHN0cmluZykKK3sKKyAgICBWTSYgdm0gPSBleGVj
LT52bSgpOworICAgIE5hdGl2ZUNhbGxGcmFtZVRyYWNlciB0cmFjZXIoJnZtLCBleGVjKTsKKwor
ICAgIHJldHVybiBleGVjLT5jb2RlQmxvY2soKS0+c3RyaW5nU3dpdGNoSnVtcFRhYmxlKHRhYmxl
SW5kZXgpLm9mZnNldEZvclZhbHVlKHN0cmluZy0+dmFsdWUoZXhlYykuaW1wbCgpLCBzdGQ6Om51
bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSk7Cit9CisKIHZvaWQgSklUX09QRVJBVElPTiBv
cGVyYXRpb25Ob3RpZnlXcml0ZShFeGVjU3RhdGUqIGV4ZWMsIFdhdGNocG9pbnRTZXQqIHNldCkK
IHsKICAgICBWTSYgdm0gPSBleGVjLT52bSgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdPcGVyYXRpb25zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdPcGVyYXRpb25zLmgJKHJldmlzaW9uIDE4MzQ5NykKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjcsNiArMTI3
LDcgQEAgSlNDZWxsKiBKSVRfT1BFUkFUSU9OIG9wZXJhdGlvbk1ha2VSb3BlMgogSlNDZWxsKiBK
SVRfT1BFUkFUSU9OIG9wZXJhdGlvbk1ha2VSb3BlMyhFeGVjU3RhdGUqLCBKU1N0cmluZyosIEpT
U3RyaW5nKiwgSlNTdHJpbmcqKTsKIGNoYXIqIEpJVF9PUEVSQVRJT04gb3BlcmF0aW9uRmluZFN3
aXRjaEltbVRhcmdldEZvckRvdWJsZShFeGVjU3RhdGUqLCBFbmNvZGVkSlNWYWx1ZSwgc2l6ZV90
IHRhYmxlSW5kZXgpOwogY2hhciogSklUX09QRVJBVElPTiBvcGVyYXRpb25Td2l0Y2hTdHJpbmco
RXhlY1N0YXRlKiwgc2l6ZV90IHRhYmxlSW5kZXgsIEpTU3RyaW5nKik7CitpbnQzMl90IEpJVF9P
UEVSQVRJT04gb3BlcmF0aW9uU3dpdGNoU3RyaW5nQW5kR2V0QnJhbmNoT2Zmc2V0KEV4ZWNTdGF0
ZSosIHNpemVfdCB0YWJsZUluZGV4LCBKU1N0cmluZyopOwogdm9pZCBKSVRfT1BFUkFUSU9OIG9w
ZXJhdGlvbk5vdGlmeVdyaXRlKEV4ZWNTdGF0ZSosIFdhdGNocG9pbnRTZXQqKTsKIHZvaWQgSklU
X09QRVJBVElPTiBvcGVyYXRpb25UaHJvd1N0YWNrT3ZlcmZsb3dGb3JWYXJhcmdzKEV4ZWNTdGF0
ZSopIFdURl9JTlRFUk5BTDsKIGludDMyX3QgSklUX09QRVJBVElPTiBvcGVyYXRpb25TaXplT2ZW
YXJhcmdzKEV4ZWNTdGF0ZSosIEVuY29kZWRKU1ZhbHVlIGFyZ3VtZW50cywgaW50MzJfdCBmaXJz
dFZhckFyZ09mZnNldCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1
bGF0aXZlSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R1NwZWN1bGF0aXZlSklULmNwcAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2MzQs
MTggKzU2MzQsNiBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjplbWl0U3dpdGNoQ2hhcihOb2RlCiAg
ICAgfQogfQogCi1ib29sIFNwZWN1bGF0aXZlSklUOjpTdHJpbmdTd2l0Y2hDYXNlOjpvcGVyYXRv
cjwoCi0gICAgY29uc3QgU3BlY3VsYXRpdmVKSVQ6OlN0cmluZ1N3aXRjaENhc2UmIG90aGVyKSBj
b25zdAotewotICAgIHVuc2lnbmVkIG1pbkxlbmd0aCA9IHN0ZDo6bWluKHN0cmluZy0+bGVuZ3Ro
KCksIG90aGVyLnN0cmluZy0+bGVuZ3RoKCkpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtaW5MZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoc3RyaW5nLT5hdChpKSA9PSBvdGhlci5z
dHJpbmctPmF0KGkpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHJldHVybiBzdHJp
bmctPmF0KGkpIDwgb3RoZXIuc3RyaW5nLT5hdChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cmlu
Zy0+bGVuZ3RoKCkgPCBvdGhlci5zdHJpbmctPmxlbmd0aCgpOwotfQotCiBuYW1lc3BhY2Ugewog
CiBzdHJ1Y3QgQ2hhcmFjdGVyQ2FzZSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1NwZWN1bGF0aXZlSklULmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgJKHdvcmtpbmcgY29weSkKQEAgLTIx
MTUsNyArMjExNSwxMCBAQCBwdWJsaWM6CiAgICAgICAgIHsKICAgICAgICAgfQogICAgICAgICAK
LSAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RyaW5nU3dpdGNoQ2FzZSYgb3RoZXIpIGNv
bnN0OworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBTdHJpbmdTd2l0Y2hDYXNlJiBvdGhl
cikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0xlc3NUaGFuKHN0
cmluZywgb3RoZXIuc3RyaW5nKTsKKyAgICAgICAgfQogICAgICAgICAKICAgICAgICAgU3RyaW5n
SW1wbCogc3RyaW5nOwogICAgICAgICBCYXNpY0Jsb2NrKiB0YXJnZXQ7CkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZnRsL0ZUTENhcGFiaWxpdGllcy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExDYXBhYmlsaXRpZXMuY3BwCShyZXZpc2lvbiAxODM0
OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTENhcGFiaWxpdGllcy5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTE4OCw2ICsxODgsNyBAQCBpbmxpbmUgQ2FwYWJpbGl0eUxldmVsIGNh
bkNvbXBpbGUoTm9kZSogCiAgICAgY2FzZSBQaGFudG9tQ2xvbmVkQXJndW1lbnRzOgogICAgIGNh
c2UgR2V0TXlBcmd1bWVudEJ5VmFsOgogICAgIGNhc2UgRm9yd2FyZFZhcmFyZ3M6CisgICAgY2Fz
ZSBTd2l0Y2g6CiAgICAgICAgIC8vIFRoZXNlIGFyZSBPSy4KICAgICAgICAgYnJlYWs7CiAgICAg
Y2FzZSBJZGVudGl0eToKQEAgLTM1MCwxNiArMzUxLDYgQEAgaW5saW5lIENhcGFiaWxpdHlMZXZl
bCBjYW5Db21waWxlKE5vZGUqIAogICAgICAgICBpZiAobm9kZS0+aXNCaW5hcnlVc2VLaW5kKFVu
dHlwZWRVc2UpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIHJldHVybiBDYW5ub3RDb21w
aWxlOwotICAgIGNhc2UgU3dpdGNoOgotICAgICAgICBzd2l0Y2ggKG5vZGUtPnN3aXRjaERhdGEo
KS0+a2luZCkgewotICAgICAgICBjYXNlIFN3aXRjaEltbToKLSAgICAgICAgY2FzZSBTd2l0Y2hD
aGFyOgotICAgICAgICBjYXNlIFN3aXRjaENlbGw6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBDYW5ub3RDb21waWxlOwotICAgICAgICB9
Ci0gICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIC8vIERvbid0IGtub3cgaG93
IHRvIGhhbmRsZSBhbnl0aGluZyBlbHNlLgogICAgICAgICByZXR1cm4gQ2Fubm90Q29tcGlsZTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSW50cmluc2ljUmVwb3NpdG9yeS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSW50cmluc2ljUmVw
b3NpdG9yeS5oCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTEludHJpbnNpY1JlcG9zaXRvcnkuaAkod29ya2luZyBjb3B5KQpAQCAtMTEyLDcgKzExMiw4
IEBAIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgRlRMIHsKICAgICBtYWNybyhWX0pJVE9wZXJh
dGlvbl9aLCBmdW5jdGlvblR5cGUodm9pZFR5cGUsIGludDMyKSkgXAogICAgIG1hY3JvKFpfSklU
T3BlcmF0aW9uX0QsIGZ1bmN0aW9uVHlwZShpbnQzMiwgZG91YmxlVHlwZSkpIFwKICAgICBtYWNy
byhaX0pJVE9wZXJhdGlvbl9FQywgZnVuY3Rpb25UeXBlKGludDMyLCBpbnRQdHIsIGludFB0cikp
IFwKLSAgICBtYWNybyhaX0pJVE9wZXJhdGlvbl9FSlosIGZ1bmN0aW9uVHlwZShpbnQzMiwgaW50
UHRyLCBpbnQ2NCwgaW50MzIpKQorICAgIG1hY3JvKFpfSklUT3BlcmF0aW9uX0VKWiwgZnVuY3Rp
b25UeXBlKGludDMyLCBpbnRQdHIsIGludDY0LCBpbnQzMikpIFwKKyAgICBtYWNybyhaX0pJVE9w
ZXJhdGlvbl9FU0pzcywgZnVuY3Rpb25UeXBlKGludDMyLCBpbnRQdHIsIGludFB0ciwgaW50NjQp
KSBcCiAgICAgCiBjbGFzcyBJbnRyaW5zaWNSZXBvc2l0b3J5IDogcHVibGljIENvbW1vblZhbHVl
cyB7CiBwdWJsaWM6CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExvd2VyREZH
VG9MTFZNLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExv
d2VyREZHVG9MTFZNLmNwcAkocmV2aXNpb24gMTgzNDk3KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2Z0bC9GVExMb3dlckRGR1RvTExWTS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0MzksNyAr
NDQzOSw1NCBAQCBwcml2YXRlOgogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBjYXNlIFN3
aXRjaFN0cmluZzogewotICAgICAgICAgICAgREZHX0NSQVNIKG1fZ3JhcGgsIG1fbm9kZSwgIlVu
aW1wbGVtZW50ZWQiKTsKKyAgICAgICAgICAgIHN3aXRjaCAobV9ub2RlLT5jaGlsZDEoKS51c2VL
aW5kKCkpIHsKKyAgICAgICAgICAgIGNhc2UgU3RyaW5nSWRlbnRVc2U6IHsKKyAgICAgICAgICAg
ICAgICBMVmFsdWUgc3RyaW5nSW1wbCA9IGxvd1N0cmluZ0lkZW50KG1fbm9kZS0+Y2hpbGQxKCkp
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZlY3RvcjxTd2l0Y2hDYXNlPiBj
YXNlczsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGF0YS0+Y2Fz
ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgTFZhbHVlIHZhbHVlID0gbV9v
dXQuY29uc3RJbnRQdHIoZGF0YS0+Y2FzZXNbaV0udmFsdWUuc3RyaW5nSW1wbCgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgTEJhc2ljQmxvY2sgYmxvY2sgPSBsb3dCbG9jayhkYXRhLT5jYXNlc1tp
XS50YXJnZXQuYmxvY2spOworICAgICAgICAgICAgICAgICAgICBXZWlnaHQgd2VpZ2h0ID0gV2Vp
Z2h0KGRhdGEtPmNhc2VzW2ldLnRhcmdldC5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGNh
c2VzLmFwcGVuZChTd2l0Y2hDYXNlKHZhbHVlLCBibG9jaywgd2VpZ2h0KSk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1fb3V0LnN3aXRjaElu
c3RydWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBzdHJpbmdJbXBsLCBjYXNlcywgbG93Qmxv
Y2soZGF0YS0+ZmFsbFRocm91Z2guYmxvY2spLAorICAgICAgICAgICAgICAgICAgICBXZWlnaHQo
ZGF0YS0+ZmFsbFRocm91Z2guY291bnQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFN0cmluZ1VzZTog
eworICAgICAgICAgICAgICAgIHN3aXRjaFN0cmluZyhkYXRhLCBsb3dTdHJpbmcobV9ub2RlLT5j
aGlsZDEoKSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgVW50eXBlZFVzZTogeworICAgICAgICAgICAg
ICAgIExWYWx1ZSB2YWx1ZSA9IGxvd0pTVmFsdWUobV9ub2RlLT5jaGlsZDEoKSk7CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgTEJhc2ljQmxvY2sgaXNDZWxsQmxvY2sgPSBGVExf
TkVXX0JMT0NLKG1fb3V0LCAoIlN3aXRjaC9Td2l0Y2hTdHJpbmcgVW50eXBlZCBjZWxsIGNhc2Ui
KSk7CisgICAgICAgICAgICAgICAgTEJhc2ljQmxvY2sgaXNTdHJpbmdCbG9jayA9IEZUTF9ORVdf
QkxPQ0sobV9vdXQsICgiU3dpdGNoL1N3aXRjaFN0cmluZyBVbnR5cGVkIHN0cmluZyBjYXNlIikp
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1fb3V0LmJyYW5jaCgKKyAgICAg
ICAgICAgICAgICAgICAgaXNDZWxsKHZhbHVlKSwgdW5zdXJlKGlzQ2VsbEJsb2NrKSwgdW5zdXJl
KGxvd0Jsb2NrKGRhdGEtPmZhbGxUaHJvdWdoLmJsb2NrKSkpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIExCYXNpY0Jsb2NrIGxhc3ROZXh0ID0gbV9vdXQuYXBwZW5kVG8oaXND
ZWxsQmxvY2ssIGlzU3RyaW5nQmxvY2spOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgIG1fb3V0LmJyYW5jaCgKKyAgICAgICAgICAgICAgICAgICAgaXNTdHJpbmcodmFsdWUpLAor
ICAgICAgICAgICAgICAgICAgICB1bnN1cmUoaXNTdHJpbmdCbG9jayksIHVuc3VyZShsb3dCbG9j
ayhkYXRhLT5mYWxsVGhyb3VnaC5ibG9jaykpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBtX291dC5hcHBlbmRUbyhpc1N0cmluZ0Jsb2NrLCBsYXN0TmV4dCk7CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgc3dpdGNoU3RyaW5nKGRhdGEsIHZhbHVlKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERGR19DUkFTSChtX2dyYXBoLCBt
X25vZGUsICJCYWQgdXNlIGtpbmQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgICAgIApAQCAt
NjAzOSw2ICs2MDg2LDI2MiBAQCBwcml2YXRlOgogICAgICAgICAgICAgbG93QmxvY2soZGF0YS0+
ZmFsbFRocm91Z2guYmxvY2spLCBXZWlnaHQoZGF0YS0+ZmFsbFRocm91Z2guY291bnQpKTsKICAg
ICB9CiAgICAgCisgICAgdm9pZCBzd2l0Y2hTdHJpbmcoU3dpdGNoRGF0YSogZGF0YSwgTFZhbHVl
IHN0cmluZykKKyAgICB7CisgICAgICAgIGJvb2wgY2FuRG9CaW5hcnlTd2l0Y2ggPSB0cnVlOwor
ICAgICAgICB1bnNpZ25lZCB0b3RhbExlbmd0aCA9IDA7CisgICAgICAgIAorICAgICAgICBmb3Ig
KERGRzo6U3dpdGNoQ2FzZSBteUNhc2UgOiBkYXRhLT5jYXNlcykgeworICAgICAgICAgICAgU3Ry
aW5nSW1wbCogc3RyaW5nID0gbXlDYXNlLnZhbHVlLnN0cmluZ0ltcGwoKTsKKyAgICAgICAgICAg
IGlmICghc3RyaW5nLT5pczhCaXQoKSkgeworICAgICAgICAgICAgICAgIGNhbkRvQmluYXJ5U3dp
dGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoc3RyaW5nLT5sZW5ndGgoKSA+IE9wdGlvbnM6Om1heGltdW1CaW5hcnlTdHJp
bmdTd2l0Y2hDYXNlTGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBjYW5Eb0JpbmFyeVN3aXRj
aCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgdG90YWxMZW5ndGggKz0gc3RyaW5nLT5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgaWYgKCFjYW5Eb0JpbmFyeVN3aXRjaCB8fCB0b3RhbExlbmd0aCA+IE9wdGlv
bnM6Om1heGltdW1CaW5hcnlTdHJpbmdTd2l0Y2hUb3RhbExlbmd0aCgpKSB7CisgICAgICAgICAg
ICBzd2l0Y2hTdHJpbmdTbG93KGRhdGEsIHN0cmluZyk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIExWYWx1ZSBzdHJpbmdJbXBsID0gbV9vdXQubG9h
ZFB0cihzdHJpbmcsIG1faGVhcHMuSlNTdHJpbmdfdmFsdWUpOworICAgICAgICBMVmFsdWUgbGVu
Z3RoID0gbV9vdXQubG9hZDMyKHN0cmluZywgbV9oZWFwcy5KU1N0cmluZ19sZW5ndGgpOworICAg
ICAgICAKKyAgICAgICAgTEJhc2ljQmxvY2sgaGFzSW1wbEJsb2NrID0gRlRMX05FV19CTE9DSyht
X291dCwgKCJTd2l0Y2gvU3dpdGNoU3RyaW5nIGhhcyBpbXBsIGNhc2UiKSk7CisgICAgICAgIExC
YXNpY0Jsb2NrIGlzOEJpdEJsb2NrID0gRlRMX05FV19CTE9DSyhtX291dCwgKCJTd2l0Y2gvU3dp
dGNoU3RyaW5nIGlzIDggYml0IGNhc2UiKSk7CisgICAgICAgIExCYXNpY0Jsb2NrIHNsb3dCbG9j
ayA9IEZUTF9ORVdfQkxPQ0sobV9vdXQsICgiU3dpdGNoL1N3aXRjaFN0cmluZyBzbG93IGNhc2Ui
KSk7CisgICAgICAgIAorICAgICAgICBtX291dC5icmFuY2gobV9vdXQuaXNOdWxsKHN0cmluZ0lt
cGwpLCB1bnN1cmUoc2xvd0Jsb2NrKSwgdW5zdXJlKGhhc0ltcGxCbG9jaykpOworICAgICAgICAK
KyAgICAgICAgTEJhc2ljQmxvY2sgbGFzdE5leHQgPSBtX291dC5hcHBlbmRUbyhoYXNJbXBsQmxv
Y2ssIGlzOEJpdEJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIG1fb3V0LmJyYW5jaCgKKyAgICAg
ICAgICAgIG1fb3V0LnRlc3RJc1plcm8zMigKKyAgICAgICAgICAgICAgICBtX291dC5sb2FkMzIo
c3RyaW5nSW1wbCwgbV9oZWFwcy5TdHJpbmdJbXBsX2hhc2hBbmRGbGFncyksCisgICAgICAgICAg
ICAgICAgbV9vdXQuY29uc3RJbnQzMihTdHJpbmdJbXBsOjpmbGFnSXM4Qml0KCkpKSwKKyAgICAg
ICAgICAgIHVuc3VyZShzbG93QmxvY2spLCB1bnN1cmUoaXM4Qml0QmxvY2spKTsKKyAgICAgICAg
CisgICAgICAgIG1fb3V0LmFwcGVuZFRvKGlzOEJpdEJsb2NrLCBzbG93QmxvY2spOworICAgICAg
ICAKKyAgICAgICAgTFZhbHVlIGJ1ZmZlciA9IG1fb3V0LmxvYWRQdHIoc3RyaW5nSW1wbCwgbV9o
ZWFwcy5TdHJpbmdJbXBsX2RhdGEpOworICAgICAgICAKKyAgICAgICAgLy8gRklYTUU6IFdlIHNo
b3VsZCBwcm9wYWdhdGUgYnJhbmNoIHdlaWdodCBkYXRhIHRvIHRoZSBjYXNlcyBvZiB0aGlzIHN3
aXRjaC4KKyAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTE0NDM2OAorICAgICAgICAKKyAgICAgICAgVmVjdG9yPFN0cmluZ1N3aXRjaENhc2U+IGNhc2Vz
OworICAgICAgICBmb3IgKERGRzo6U3dpdGNoQ2FzZSBteUNhc2UgOiBkYXRhLT5jYXNlcykKKyAg
ICAgICAgICAgIGNhc2VzLmFwcGVuZChTdHJpbmdTd2l0Y2hDYXNlKG15Q2FzZS52YWx1ZS5zdHJp
bmdJbXBsKCksIGxvd0Jsb2NrKG15Q2FzZS50YXJnZXQuYmxvY2spKSk7CisgICAgICAgIHN0ZDo6
c29ydChjYXNlcy5iZWdpbigpLCBjYXNlcy5lbmQoKSk7CisgICAgICAgIHN3aXRjaFN0cmluZ1Jl
Y3Vyc2UoZGF0YSwgYnVmZmVyLCBsZW5ndGgsIGNhc2VzLCAwLCAwLCBjYXNlcy5zaXplKCksIDAs
IGZhbHNlKTsKKworICAgICAgICBtX291dC5hcHBlbmRUbyhzbG93QmxvY2ssIGxhc3ROZXh0KTsK
KyAgICAgICAgc3dpdGNoU3RyaW5nU2xvdyhkYXRhLCBzdHJpbmcpOworICAgIH0KKyAgICAKKyAg
ICAvLyBUaGUgY29kZSBmb3Igc3RyaW5nIHN3aXRjaGluZyBpcyBiYXNlZCBjbG9zZWx5IG9uIHRo
ZSBzYW1lIGNvZGUgaW4gdGhlIERGRyBiYWNrZW5kLiBXaGlsZSBpdAorICAgIC8vIHdvdWxkIGJl
IG5pY2UgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2Ygc2ltaWxhci1sb29raW5nIGNvZGUsIGl0IHNl
ZW1zIGxpa2UgdGhpcyBpcyBvbmUgb2YKKyAgICAvLyB0aG9zZSBhbGdvcml0aG1zIHdoZXJlIGZh
Y3RvcmluZyBvdXQgdGhlIGNvbW1vbiBiaXRzIHdvdWxkIHJlc3VsdCBpbiBtb3JlIGNvZGUgdGhh
biBqdXN0CisgICAgLy8gZHVwbGljYXRpbmcuCisgICAgCisgICAgc3RydWN0IFN0cmluZ1N3aXRj
aENhc2UgeworICAgICAgICBTdHJpbmdTd2l0Y2hDYXNlKCkgeyB9CisgICAgICAgIAorICAgICAg
ICBTdHJpbmdTd2l0Y2hDYXNlKFN0cmluZ0ltcGwqIHN0cmluZywgTEJhc2ljQmxvY2sgdGFyZ2V0
KQorICAgICAgICAgICAgOiBzdHJpbmcoc3RyaW5nKQorICAgICAgICAgICAgLCB0YXJnZXQodGFy
Z2V0KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPChjb25z
dCBTdHJpbmdTd2l0Y2hDYXNlJiBvdGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAg
cmV0dXJuIHN0cmluZ0xlc3NUaGFuKHN0cmluZywgb3RoZXIuc3RyaW5nKTsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgU3RyaW5nSW1wbCogc3RyaW5nOworICAgICAgICBMQmFzaWNCbG9j
ayB0YXJnZXQ7CisgICAgfTsKKyAgICAKKyAgICBzdHJ1Y3QgQ2hhcmFjdGVyQ2FzZSB7CisgICAg
ICAgIENoYXJhY3RlckNhc2UoKQorICAgICAgICAgICAgOiBjaGFyYWN0ZXIoMCkKKyAgICAgICAg
ICAgICwgYmVnaW4oMCkKKyAgICAgICAgICAgICwgZW5kKDApCisgICAgICAgIHsKKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgQ2hhcmFjdGVyQ2FzZShMQ2hhciBjaGFyYWN0ZXIsIHVuc2ln
bmVkIGJlZ2luLCB1bnNpZ25lZCBlbmQpCisgICAgICAgICAgICA6IGNoYXJhY3RlcihjaGFyYWN0
ZXIpCisgICAgICAgICAgICAsIGJlZ2luKGJlZ2luKQorICAgICAgICAgICAgLCBlbmQoZW5kKQor
ICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2wgb3BlcmF0b3I8KGNv
bnN0IENoYXJhY3RlckNhc2UmIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gY2hhcmFjdGVyIDwgb3RoZXIuY2hhcmFjdGVyOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICBMQ2hhciBjaGFyYWN0ZXI7CisgICAgICAgIHVuc2lnbmVkIGJlZ2luOworICAgICAg
ICB1bnNpZ25lZCBlbmQ7CisgICAgfTsKKyAgICAKKyAgICB2b2lkIHN3aXRjaFN0cmluZ1JlY3Vy
c2UoCisgICAgICAgIFN3aXRjaERhdGEqIGRhdGEsIExWYWx1ZSBidWZmZXIsIExWYWx1ZSBsZW5n
dGgsIGNvbnN0IFZlY3RvcjxTdHJpbmdTd2l0Y2hDYXNlPiYgY2FzZXMsCisgICAgICAgIHVuc2ln
bmVkIG51bUNoZWNrZWQsIHVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBlbmQsIHVuc2lnbmVkIGFs
cmVhZHlDaGVja2VkTGVuZ3RoLAorICAgICAgICB1bnNpZ25lZCBjaGVja2VkRXhhY3RMZW5ndGgp
CisgICAgeworICAgICAgICBMQmFzaWNCbG9jayBmYWxsVGhyb3VnaCA9IGxvd0Jsb2NrKGRhdGEt
PmZhbGxUaHJvdWdoLmJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIGlmIChiZWdpbiA9PSBlbmQp
IHsKKyAgICAgICAgICAgIG1fb3V0Lmp1bXAoZmFsbFRocm91Z2gpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB1bnNpZ25lZCBtaW5MZW5ndGggPSBj
YXNlc1tiZWdpbl0uc3RyaW5nLT5sZW5ndGgoKTsKKyAgICAgICAgdW5zaWduZWQgY29tbW9uQ2hh
cnMgPSBtaW5MZW5ndGg7CisgICAgICAgIGJvb2wgYWxsTGVuZ3Roc0VxdWFsID0gdHJ1ZTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gYmVnaW4gKyAxOyBpIDwgZW5kOyArK2kpIHsKKyAgICAg
ICAgICAgIHVuc2lnbmVkIG15Q29tbW9uQ2hhcnMgPSBudW1DaGVja2VkOworICAgICAgICAgICAg
Zm9yICgKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBqID0gbnVtQ2hlY2tlZDsKKyAgICAgICAg
ICAgICAgICBqIDwgc3RkOjptaW4oY2FzZXNbYmVnaW5dLnN0cmluZy0+bGVuZ3RoKCksIGNhc2Vz
W2ldLnN0cmluZy0+bGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICsraikgeworICAgICAgICAg
ICAgICAgIGlmIChjYXNlc1tiZWdpbl0uc3RyaW5nLT5hdChqKSAhPSBjYXNlc1tpXS5zdHJpbmct
PmF0KGopKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBteUNv
bW1vbkNoYXJzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21tb25DaGFycyA9IHN0
ZDo6bWluKGNvbW1vbkNoYXJzLCBteUNvbW1vbkNoYXJzKTsKKyAgICAgICAgICAgIGlmIChtaW5M
ZW5ndGggIT0gY2FzZXNbaV0uc3RyaW5nLT5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBhbGxM
ZW5ndGhzRXF1YWwgPSBmYWxzZTsKKyAgICAgICAgICAgIG1pbkxlbmd0aCA9IHN0ZDo6bWluKG1p
bkxlbmd0aCwgY2FzZXNbaV0uc3RyaW5nLT5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAg
CisgICAgICAgIGlmIChjaGVja2VkRXhhY3RMZW5ndGgpIHsKKyAgICAgICAgICAgIERGR19BU1NF
UlQobV9ncmFwaCwgbV9ub2RlLCBhbHJlYWR5Q2hlY2tlZExlbmd0aCA9PSBtaW5MZW5ndGgpOwor
ICAgICAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBtX25vZGUsIGFsbExlbmd0aHNFcXVhbCk7
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2Rl
LCBtaW5MZW5ndGggPj0gY29tbW9uQ2hhcnMpOworICAgICAgICAKKyAgICAgICAgaWYgKCFhbGxM
ZW5ndGhzRXF1YWwgJiYgYWxyZWFkeUNoZWNrZWRMZW5ndGggPCBtaW5MZW5ndGgpCisgICAgICAg
ICAgICBtX291dC5jaGVjayhtX291dC5iZWxvdyhsZW5ndGgsIG1fb3V0LmNvbnN0SW50MzIobWlu
TGVuZ3RoKSksIHVuc3VyZShmYWxsVGhyb3VnaCkpOworICAgICAgICBpZiAoYWxsTGVuZ3Roc0Vx
dWFsICYmIChhbHJlYWR5Q2hlY2tlZExlbmd0aCA8IG1pbkxlbmd0aCB8fCAhY2hlY2tlZEV4YWN0
TGVuZ3RoKSkKKyAgICAgICAgICAgIG1fb3V0LmNoZWNrKG1fb3V0Lm5vdEVxdWFsKGxlbmd0aCwg
bV9vdXQuY29uc3RJbnQzMihtaW5MZW5ndGgpKSwgdW5zdXJlKGZhbGxUaHJvdWdoKSk7CisgICAg
ICAgIAorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBudW1DaGVja2VkOyBpIDwgY29tbW9uQ2hh
cnM7ICsraSkgeworICAgICAgICAgICAgbV9vdXQuY2hlY2soCisgICAgICAgICAgICAgICAgbV9v
dXQubm90RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIG1fb3V0LmxvYWQ4KGJ1ZmZlciwgbV9o
ZWFwcy5jaGFyYWN0ZXJzOFtpXSksCisgICAgICAgICAgICAgICAgICAgIG1fb3V0LmNvbnN0SW50
OChjYXNlc1tiZWdpbl0uc3RyaW5nLT5hdChpKSkpLAorICAgICAgICAgICAgICAgIHVuc3VyZShm
YWxsVGhyb3VnaCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobWluTGVuZ3Ro
ID09IGNvbW1vbkNoYXJzKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJl
IG9uZSBvZiB0aGUgY2FzZXMgaXMgYSBwcmVmaXggb2YgYWxsIG9mIHRoZSBvdGhlciBjYXNlcy4K
KyAgICAgICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBpbnB1dCBzdHJp
bmcgaXMgYSBwcmVmaXggb2YgYWxsIG9mIHRoZSBjYXNlcywKKyAgICAgICAgICAgIC8vIHNvIHdl
IGp1c3QgY2hlY2sgbGVuZ3RoIHRvIGp1bXAgdG8gdGhhdCBjYXNlLgorICAgICAgICAgICAgCisg
ICAgICAgICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIG1fbm9kZSwgY2FzZXNbYmVnaW5dLnN0cmlu
Zy0+bGVuZ3RoKCkgPT0gY29tbW9uQ2hhcnMpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gYmVnaW4gKyAxOyBpIDwgZW5kOyArK2kpCisgICAgICAgICAgICAgICAgREZHX0FTU0VSVCht
X2dyYXBoLCBtX25vZGUsIGNhc2VzW2ldLnN0cmluZy0+bGVuZ3RoKCkgPiBjb21tb25DaGFycyk7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChhbGxMZW5ndGhzRXF1YWwpIHsKKyAgICAg
ICAgICAgICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIG1fbm9kZSwgZW5kID09IGJlZ2luICsgMSk7
CisgICAgICAgICAgICAgICAgbV9vdXQuanVtcChjYXNlc1tiZWdpbl0udGFyZ2V0KTsKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIG1fb3V0LmNoZWNrKAorICAgICAgICAgICAgICAgIG1fb3V0LmVxdWFsKGxlbmd0aCwgbV9v
dXQuY29uc3RJbnQzMihjb21tb25DaGFycykpLAorICAgICAgICAgICAgICAgIHVuc3VyZShjYXNl
c1tiZWdpbl0udGFyZ2V0KSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlJ3ZlIGNo
ZWNrZWQgaWYgdGhlIGxlbmd0aCBpcyA+PSBtaW5MZW5ndGgsIGFuZCB0aGVuIHdlIGNoZWNrZWQg
aWYgdGhlIGxlbmd0aCBpcworICAgICAgICAgICAgLy8gPT0gY29tbW9uQ2hhcnMuIFdlIGdldCB0
byB0aGlzIHBvaW50IGlmIGl0IGlzID49IG1pbkxlbmd0aCBidXQgbm90ID09IGNvbW1vbkNoYXJz
LgorICAgICAgICAgICAgLy8gSGVuY2Ugd2Uga25vdyB0aGF0IGl0IG5vdyBtdXN0IGJlID4gbWlu
TGVuZ3RoLCBpLmUuIHRoYXQgaXQncyA+PSBtaW5MZW5ndGggKyAxLgorICAgICAgICAgICAgc3dp
dGNoU3RyaW5nUmVjdXJzZSgKKyAgICAgICAgICAgICAgICBkYXRhLCBidWZmZXIsIGxlbmd0aCwg
Y2FzZXMsIGNvbW1vbkNoYXJzLCBiZWdpbiArIDEsIGVuZCwgbWluTGVuZ3RoICsgMSwgZmFsc2Up
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBB
dCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGUgc3RyaW5nIGlzIGxvbmdlciB0aGFuIGNvbW1v
bkNoYXJzLCBhbmQgd2UndmUgb25seSB2ZXJpZmllZAorICAgICAgICAvLyBjb21tb25DaGFycy4g
VXNlIGEgYmluYXJ5IHN3aXRjaCBvbiB0aGUgbmV4dCB1bmNoZWNrZWQgY2hhcmFjdGVyLCBpLmUu
CisgICAgICAgIC8vIHN0cmluZ1tjb21tb25DaGFyc10uCisgICAgICAgIAorICAgICAgICBERkdf
QVNTRVJUKG1fZ3JhcGgsIG1fbm9kZSwgZW5kID49IGJlZ2luICsgMik7CisgICAgICAgIAorICAg
ICAgICBMVmFsdWUgdW5jaGVja2VkQ2hhciA9IG1fb3V0LmxvYWQ4KGJ1ZmZlciwgbV9oZWFwcy5j
aGFyYWN0ZXJzOFtjb21tb25DaGFyc10pOworICAgICAgICAKKyAgICAgICAgVmVjdG9yPENoYXJh
Y3RlckNhc2U+IGNoYXJhY3RlckNhc2VzOworICAgICAgICBDaGFyYWN0ZXJDYXNlIGN1cnJlbnRD
YXNlKGNhc2VzW2JlZ2luXS5zdHJpbmctPmF0KGNvbW1vbkNoYXJzKSwgYmVnaW4sIGJlZ2luICsg
MSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IGJlZ2luICsgMTsgaSA8IGVuZDsgKytpKSB7
CisgICAgICAgICAgICBMQ2hhciBjdXJyZW50Q2hhciA9IGNhc2VzW2ldLnN0cmluZy0+YXQoY29t
bW9uQ2hhcnMpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyICE9IGN1cnJlbnRDYXNlLmNo
YXJhY3RlcikgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDYXNlLmVuZCA9IGk7CisgICAgICAg
ICAgICAgICAgY2hhcmFjdGVyQ2FzZXMuYXBwZW5kKGN1cnJlbnRDYXNlKTsKKyAgICAgICAgICAg
ICAgICBjdXJyZW50Q2FzZSA9IENoYXJhY3RlckNhc2UoY3VycmVudENoYXIsIGksIGkgKyAxKTsK
KyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGN1cnJlbnRDYXNlLmVuZCA9IGkg
KyAxOworICAgICAgICB9CisgICAgICAgIGNoYXJhY3RlckNhc2VzLmFwcGVuZChjdXJyZW50Q2Fz
ZSk7CisgICAgICAgIAorICAgICAgICBWZWN0b3I8TEJhc2ljQmxvY2s+IGNoYXJhY3RlckJsb2Nr
czsKKyAgICAgICAgZm9yIChDaGFyYWN0ZXJDYXNlJiBteUNhc2UgOiBjaGFyYWN0ZXJDYXNlcykK
KyAgICAgICAgICAgIGNoYXJhY3RlckJsb2Nrcy5hcHBlbmQoRlRMX05FV19CTE9DSyhtX291dCwg
KCJTd2l0Y2gvU3dpdGNoU3RyaW5nIGNhc2UgZm9yICIsIG15Q2FzZS5jaGFyYWN0ZXIsICIgYXQg
aW5kZXggIiwgY29tbW9uQ2hhcnMpKSk7CisgICAgICAgIAorICAgICAgICBWZWN0b3I8U3dpdGNo
Q2FzZT4gc3dpdGNoQ2FzZXM7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjaGFy
YWN0ZXJDYXNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3dpdGNoQ2FzZXMuYXBwZW5k
KFN3aXRjaENhc2UoCisgICAgICAgICAgICAgICAgbV9vdXQuY29uc3RJbnQ4KGNoYXJhY3RlckNh
c2VzW2ldLmNoYXJhY3RlciksIGNoYXJhY3RlckJsb2Nrc1tpXSwgV2VpZ2h0KCkpKTsKKyAgICAg
ICAgfQorICAgICAgICBtX291dC5zd2l0Y2hJbnN0cnVjdGlvbih1bmNoZWNrZWRDaGFyLCBzd2l0
Y2hDYXNlcywgZmFsbFRocm91Z2gsIFdlaWdodCgpKTsKKyAgICAgICAgCisgICAgICAgIExCYXNp
Y0Jsb2NrIGxhc3ROZXh0ID0gbV9vdXQubV9uZXh0QmxvY2s7CisgICAgICAgIGNoYXJhY3RlckJs
b2Nrcy5hcHBlbmQobGFzdE5leHQpOyAvLyBNYWtlcyBpdCBjb252ZW5pZW50IHRvIHNldCBuZXh0
QmxvY2suCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjaGFyYWN0ZXJDYXNlcy5z
aXplKCk7ICsraSkgeworICAgICAgICAgICAgbV9vdXQuYXBwZW5kVG8oY2hhcmFjdGVyQmxvY2tz
W2ldLCBjaGFyYWN0ZXJCbG9ja3NbaSArIDFdKTsKKyAgICAgICAgICAgIHN3aXRjaFN0cmluZ1Jl
Y3Vyc2UoCisgICAgICAgICAgICAgICAgZGF0YSwgYnVmZmVyLCBsZW5ndGgsIGNhc2VzLCBjb21t
b25DaGFycyArIDEsCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyQ2FzZXNbaV0uYmVnaW4sIGNo
YXJhY3RlckNhc2VzW2ldLmVuZCwgbWluTGVuZ3RoLCBhbGxMZW5ndGhzRXF1YWwpOworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIG1fbm9kZSwgbV9vdXQu
bV9uZXh0QmxvY2sgPT0gbGFzdE5leHQpOworICAgIH0KKyAgICAKKyAgICB2b2lkIHN3aXRjaFN0
cmluZ1Nsb3coU3dpdGNoRGF0YSogZGF0YSwgTFZhbHVlIHN0cmluZykKKyAgICB7CisgICAgICAg
IC8vIEZJWE1FOiBXZSBvdWdodCB0byBiZSBhYmxlIHRvIHVzZSBjb21wdXRlZCBnb3RvcyBoZXJl
LiBXZSB3b3VsZCBzYXZlIHRoZSBsYWJlbHMgb2YgdGhlCisgICAgICAgIC8vIGJsb2NrcyB3ZSB3
YW50IHRvIGp1bXAgdG8sIGFuZCB0aGVuIHJlcXVlc3QgdGhlaXIgYWRkcmVzc2VzIGFmdGVyIGNv
bXBpbGF0aW9uIGNvbXBsZXRlcy4KKyAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE0NDM2OQorICAgICAgICAKKyAgICAgICAgTFZhbHVlIGJyYW5jaE9m
ZnNldCA9IHZtQ2FsbCgKKyAgICAgICAgICAgIG1fb3V0Lm9wZXJhdGlvbihvcGVyYXRpb25Td2l0
Y2hTdHJpbmdBbmRHZXRCcmFuY2hPZmZzZXQpLAorICAgICAgICAgICAgbV9jYWxsRnJhbWUsIG1f
b3V0LmNvbnN0SW50UHRyKGRhdGEtPnN3aXRjaFRhYmxlSW5kZXgpLCBzdHJpbmcpOworICAgICAg
ICAKKyAgICAgICAgU3RyaW5nSnVtcFRhYmxlJiB0YWJsZSA9IGNvZGVCbG9jaygpLT5zdHJpbmdT
d2l0Y2hKdW1wVGFibGUoZGF0YS0+c3dpdGNoVGFibGVJbmRleCk7CisgICAgICAgIAorICAgICAg
ICBWZWN0b3I8U3dpdGNoQ2FzZT4gY2FzZXM7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBkYXRhLT5jYXNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgREZHOjpTd2l0Y2hD
YXNlIG15Q2FzZSA9IGRhdGEtPmNhc2VzW2ldOworICAgICAgICAgICAgU3RyaW5nSnVtcFRhYmxl
OjpTdHJpbmdPZmZzZXRUYWJsZTo6aXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgICAgICAgdGFi
bGUub2Zmc2V0VGFibGUuZmluZChteUNhc2UudmFsdWUuc3RyaW5nSW1wbCgpKTsKKyAgICAgICAg
ICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2RlLCBpdGVyICE9IHRhYmxlLm9mZnNldFRhYmxl
LmVuZCgpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZXMuYXBwZW5kKFN3aXRjaENh
c2UoCisgICAgICAgICAgICAgICAgbV9vdXQuY29uc3RJbnQzMihpdGVyLT52YWx1ZS5icmFuY2hP
ZmZzZXQpLAorICAgICAgICAgICAgICAgIGxvd0Jsb2NrKG15Q2FzZS50YXJnZXQuYmxvY2spLCBX
ZWlnaHQobXlDYXNlLnRhcmdldC5jb3VudCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAg
ICAgbV9vdXQuc3dpdGNoSW5zdHJ1Y3Rpb24oCisgICAgICAgICAgICBicmFuY2hPZmZzZXQsIGNh
c2VzLCBsb3dCbG9jayhkYXRhLT5mYWxsVGhyb3VnaC5ibG9jayksCisgICAgICAgICAgICBXZWln
aHQoZGF0YS0+ZmFsbFRocm91Z2guY291bnQpKTsKKyAgICB9CisgICAgCiAgICAgTFZhbHVlIGRv
dWJsZVRvSW50MzIoTFZhbHVlIGRvdWJsZVZhbHVlLCBkb3VibGUgbG93LCBkb3VibGUgaGlnaCwg
Ym9vbCBpc1NpZ25lZCA9IHRydWUpCiAgICAgewogICAgICAgICBMQmFzaWNCbG9jayBncmVhdEVu
b3VnaCA9IEZUTF9ORVdfQkxPQ0sobV9vdXQsICgiZG91YmxlVG9JbnQzMiBncmVhdEVub3VnaCIp
KTsKQEAgLTcxNzMsOCArNzQ3Niw4IEBAIHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICBPU1JF
eGl0JiBleGl0ID0gbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0Lmxhc3QoKTsKIAotICAgICAg
ICBMQmFzaWNCbG9jayBsYXN0TmV4dCA9IDA7Ci0gICAgICAgIExCYXNpY0Jsb2NrIGNvbnRpbnVh
dGlvbiA9IDA7CisgICAgICAgIExCYXNpY0Jsb2NrIGxhc3ROZXh0ID0gbnVsbHB0cjsKKyAgICAg
ICAgTEJhc2ljQmxvY2sgY29udGludWF0aW9uID0gbnVsbHB0cjsKICAgICAgICAgCiAgICAgICAg
IExCYXNpY0Jsb2NrIGZhaWxDYXNlID0gRlRMX05FV19CTE9DSyhtX291dCwgKCJPU1IgZXhpdCBm
YWlsQ2FzZSBmb3IgIiwgbV9ub2RlKSk7CiAgICAgICAgIGNvbnRpbnVhdGlvbiA9IEZUTF9ORVdf
QkxPQ0sobV9vdXQsICgiT1NSIGV4aXQgY29udGludWF0aW9uIGZvciAiLCBtX25vZGUpKTsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT3V0cHV0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE91dHB1dC5jcHAJKHJldmlzaW9uIDE4MzQ5
NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT3V0cHV0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTM4LDYgKzEzOCwxMyBAQCB2b2lkIE91dHB1dDo6YnJhbmNoKExWYWx1ZSBjb25k
aXRpb24sIExCCiAgICAgICAgICAgICBjb25zdEludDMyKG5vdFRha2VuV2VpZ2h0LnNjYWxlVG9U
b3RhbCh0b3RhbCkpKSk7CiB9CiAKK3ZvaWQgT3V0cHV0OjpjaGVjayhMVmFsdWUgY29uZGl0aW9u
LCBXZWlnaHRlZFRhcmdldCB0YWtlbikKK3sKKyAgICBMQmFzaWNCbG9jayBjb250aW51YXRpb24g
PSBGVExfTkVXX0JMT0NLKCp0aGlzLCAoIk91dHB1dDo6Y2hlY2sgY29udGludWF0aW9uIikpOwor
ICAgIGJyYW5jaChjb25kaXRpb24sIHRha2VuLCBXZWlnaHRlZFRhcmdldChjb250aW51YXRpb24s
IHRha2VuLndlaWdodCgpLmludmVyc2UoKSkpOworICAgIGFwcGVuZFRvKGNvbnRpbnVhdGlvbik7
Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpGVEwKIAogI2VuZGlmIC8vIEVOQUJMRShGVExf
SklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPdXRwdXQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE91dHB1dC5oCShyZXZpc2lvbiAx
ODM0OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE91dHB1dC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zODQsNiArMzg0LDEwIEBAIHB1YmxpYzoKICAgICB7CiAgICAgICAgIGJyYW5j
aChjb25kaXRpb24sIHRha2VuLnRhcmdldCgpLCB0YWtlbi53ZWlnaHQoKSwgbm90VGFrZW4udGFy
Z2V0KCksIG5vdFRha2VuLndlaWdodCgpKTsKICAgICB9CisKKyAgICAvLyBCcmFuY2hlcyB0byBh
biBhbHJlYWR5LWNyZWF0ZWQgaGFuZGxlciBpZiB0cnVlLCAiZmFsbHMgdGhyb3VnaCIgaWYgZmFs
c2UuIEZhbGwtdGhyb3VnaCBpcworICAgIC8vIHNpbXVsYXRlZCBieSBjcmVhdGluZyBhIGNvbnRp
bnVhdGlvbiBmb3IgeW91LgorICAgIHZvaWQgY2hlY2soTFZhbHVlIGNvbmRpdGlvbiwgV2VpZ2h0
ZWRUYXJnZXQgdGFrZW4pOwogICAgIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+
CiAgICAgdm9pZCBzd2l0Y2hJbnN0cnVjdGlvbihMVmFsdWUgdmFsdWUsIGNvbnN0IFZlY3RvclR5
cGUmIGNhc2VzLCBMQmFzaWNCbG9jayBmYWxsVGhyb3VnaCwgV2VpZ2h0IGZhbGxUaHJvdWdoV2Vp
Z2h0KQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExXZWlnaHQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFdlaWdodC5oCShyZXZpc2lvbiAx
ODM0OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFdlaWdodC5oCSh3b3JraW5n
IGNvcHkpCkBAIC02Miw2ICs2MiwxNiBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4ocmVzdWx0KTsKICAgICB9CiAgICAgCisgICAgLy8gSW52ZXJzZSB3ZWln
aHQgZm9yIGEgdHdvLXRhcmdldCBicmFuY2guCisgICAgV2VpZ2h0IGludmVyc2UoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgaWYgKCFpc1NldCgpKQorICAgICAgICAgICAgcmV0dXJuIFdlaWdodCgp
OworICAgICAgICBpZiAodmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBXZWlnaHQoMCk7Cisg
ICAgICAgIHJldHVybiBXZWlnaHQoMSk7CisgICAgfQorICAgIAogcHJpdmF0ZToKICAgICBmbG9h
dCBtX3ZhbHVlOwogfTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklUT3BlcmF0
aW9ucy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklUT3BlcmF0
aW9ucy5oCShyZXZpc2lvbiAxODM0OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJ
VE9wZXJhdGlvbnMuaAkod29ya2luZyBjb3B5KQpAQCAtMTU3LDYgKzE1Nyw3IEBAIHR5cGVkZWYg
aW50NjRfdCBKSVRfT1BFUkFUSU9OKCpRX0pJVE9wZXIKIHR5cGVkZWYgaW50MzJfdCBKSVRfT1BF
UkFUSU9OICgqWl9KSVRPcGVyYXRpb25fRCkoZG91YmxlKTsKIHR5cGVkZWYgaW50MzJfdCBKSVRf
T1BFUkFUSU9OICgqWl9KSVRPcGVyYXRpb25fRSkoRXhlY1N0YXRlKik7CiB0eXBlZGVmIGludDMy
X3QgSklUX09QRVJBVElPTiAoKlpfSklUT3BlcmF0aW9uX0VDKShFeGVjU3RhdGUqLCBKU0NlbGwq
KTsKK3R5cGVkZWYgaW50MzJfdCBKSVRfT1BFUkFUSU9OICgqWl9KSVRPcGVyYXRpb25fRVNKc3Mp
KEV4ZWNTdGF0ZSosIHNpemVfdCwgSlNTdHJpbmcqKTsKIHR5cGVkZWYgaW50MzJfdCBKSVRfT1BF
UkFUSU9OICgqWl9KSVRPcGVyYXRpb25fRUpaKShFeGVjU3RhdGUqLCBFbmNvZGVkSlNWYWx1ZSwg
aW50MzJfdCk7CiB0eXBlZGVmIGludDMyX3QgSklUX09QRVJBVElPTiAoKlpfSklUT3BlcmF0aW9u
X0VKWlopKEV4ZWNTdGF0ZSosIEVuY29kZWRKU1ZhbHVlLCBpbnQzMl90LCBpbnQzMl90KTsKIHR5
cGVkZWYgc2l6ZV90IEpJVF9PUEVSQVRJT04gKCpTX0pJVE9wZXJhdGlvbl9FQ0MpKEV4ZWNTdGF0
ZSosIEpTQ2VsbCosIEpTQ2VsbCopOwo=
</data>
<flag name="review"
          id="276716"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>