<?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>70418</bug_id>
          
          <creation_ts>2011-10-19 07:17:28 -0700</creation_ts>
          <short_desc>DFG JIT 32_64 - improve double boxing/unboxing</short_desc>
          <delta_ts>2011-10-19 17:47:33 -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>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Yuqiang Xian">yuqiang.xian</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>barraclough</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>486768</commentid>
    <comment_count>0</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2011-10-19 07:17:28 -0700</bug_when>
    <thetext>The double boxing/unboxing in DFG JIT 32_64 is currently not implemented efficiently, which tries to exchange data through memory. On X86 some SSE instructions can help us on such operations with better performance, which is also marked as a FIXME in DFG 32_64.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486776</commentid>
    <comment_count>1</comment_count>
      <attachid>111614</attachid>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2011-10-19 07:32:24 -0700</bug_when>
    <thetext>Created attachment 111614
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486781</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-19 07:36:56 -0700</bug_when>
    <thetext>Attachment 111614 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/JavaScriptCore/ChangeLog&apos;, u&apos;Source...&quot; exit_code: 1

Source/JavaScriptCore/assembler/X86Assembler.h:1421:  movd_rr is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/assembler/X86Assembler.h:1491:  psllq_i8r is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/assembler/X86Assembler.h:1498:  psrlq_i8r is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/assembler/X86Assembler.h:1505:  por_rr is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 4 in 7 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>486784</commentid>
    <comment_count>3</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2011-10-19 07:40:25 -0700</bug_when>
    <thetext>Performance result on Linux IA32 (Core i7 Nehalem) : 29% on Kraken, 7% on SunSpider and 2% on V8. (Against the original 32bit DFG w/o this change)

And with this fix the 32bit DFG performance advantage over the NON-DFG is -

SunSpider:
TEST                   COMPARISON            FROM                 TO             DETAILS

=============================================================================

** TOTAL **:           1.066x as fast    231.0ms +/- 0.8%   216.6ms +/- 1.0%     significant

=============================================================================

  3d:                  -                  33.1ms +/- 3.9%    32.3ms +/- 4.8%
    cube:              ??                 12.0ms +/- 10.5%    12.9ms +/- 11.2%     not conclusive: might be *1.075x as slow*
    morph:             -                  10.1ms +/- 2.2%    10.0ms +/- 0.0%
    raytrace:          1.170x as fast     11.0ms +/- 0.0%     9.4ms +/- 3.9%     significant

  access:              1.89x as fast      35.3ms +/- 1.4%    18.7ms +/- 3.6%     significant
    binary-trees:      1.50x as fast       3.0ms +/- 0.0%     2.0ms +/- 0.0%     significant
    fannkuch:          1.85x as fast      17.4ms +/- 2.1%     9.4ms +/- 3.9%     significant
    nbody:             2.48x as fast       9.9ms +/- 2.3%     4.0ms +/- 0.0%     significant
    nsieve:            1.52x as fast       5.0ms +/- 0.0%     3.3ms +/- 10.5%     significant

  bitops:              1.26x as fast      19.3ms +/- 1.8%    15.3ms +/- 3.2%     significant
    3bit-bits-in-byte: 2.00x as fast       2.0ms +/- 0.0%     1.0ms +/- 0.0%     significant
    bits-in-byte:      1.20x as fast       5.3ms +/- 6.5%     4.4ms +/- 8.4%     significant
    bitwise-and:       1.54x as fast       6.0ms +/- 0.0%     3.9ms +/- 5.8%     significant
    nsieve-bits:       -                   6.0ms +/- 0.0%     6.0ms +/- 0.0%

  controlflow:         ??                  2.0ms +/- 0.0%     2.1ms +/- 10.8%     not conclusive: might be *1.050x as slow*
    recursive:         ??                  2.0ms +/- 0.0%     2.1ms +/- 10.8%     not conclusive: might be *1.050x as slow*

  crypto:              *1.026x as slow*   15.6ms +/- 2.4%    16.0ms +/- 0.0%     significant
    aes:               -                   9.0ms +/- 0.0%     9.0ms +/- 0.0%
    md5:               *1.111x as slow*    3.6ms +/- 10.3%     4.0ms +/- 0.0%     significant
    sha1:              -                   3.0ms +/- 0.0%     3.0ms +/- 0.0%

  date:                *1.109x as slow*   23.0ms +/- 2.5%    25.5ms +/- 1.5%     significant
    format-tofte:      *1.186x as slow*   11.3ms +/- 3.1%    13.4ms +/- 2.8%     significant
    format-xparb:      *1.034x as slow*   11.7ms +/- 3.0%    12.1ms +/- 1.9%     significant

  math:                1.044x as fast     26.2ms +/- 1.2%    25.1ms +/- 2.1%     significant
    cordic:            *1.073x as slow*    8.2ms +/- 3.7%     8.8ms +/- 3.4%     significant
    partial-sums:      ??                 13.0ms +/- 0.0%    13.3ms +/- 2.6%     not conclusive: might be *1.023x as slow*
    spectral-norm:     1.67x as fast       5.0ms +/- 0.0%     3.0ms +/- 0.0%     significant

  regexp:              ??                 14.6ms +/- 2.5%    14.9ms +/- 1.5%     not conclusive: might be *1.021x as slow*
    dna:               ??                 14.6ms +/- 2.5%    14.9ms +/- 1.5%     not conclusive: might be *1.021x as slow*

  string:              *1.078x as slow*   61.9ms +/- 0.9%    66.7ms +/- 0.5%     significant
    base64:            -                   5.0ms +/- 0.0%     5.0ms +/- 0.0%
    fasta:             *1.111x as slow*    9.0ms +/- 0.0%    10.0ms +/- 0.0%     significant
    tagcloud:          *1.032x as slow*   15.5ms +/- 2.4%    16.0ms +/- 0.0%     significant
    unpack-code:       *1.130x as slow*   25.4ms +/- 1.5%    28.7ms +/- 1.2%     significant
    validate-input:    -                   7.0ms +/- 0.0%     7.0ms +/- 0.0%


Kraken:
TEST                         COMPARISON            FROM                 TO             DETAILS

=============================================================================

** TOTAL **:                 1.77x as fast     10101.0ms +/- 0.5%   5712.0ms +/- 0.1%     significant

=============================================================================

  ai:                        2.66x as fast      2145.7ms +/- 1.2%    806.0ms +/- 0.6%     significant
    astar:                   2.66x as fast      2145.7ms +/- 1.2%    806.0ms +/- 0.6%     significant

  audio:                     1.54x as fast      2369.6ms +/- 0.7%   1543.1ms +/- 0.3%     significant
    beat-detection:          1.64x as fast       693.7ms +/- 1.0%    422.2ms +/- 0.5%     significant
    dft:                     1.51x as fast       609.4ms +/- 1.6%    403.4ms +/- 0.6%     significant
    fft:                     2.12x as fast       533.9ms +/- 0.3%    251.7ms +/- 0.4%     significant
    oscillator:              1.143x as fast      532.6ms +/- 0.2%    465.8ms +/- 0.2%     significant

  imaging:                   1.90x as fast      4127.1ms +/- 0.2%   2172.9ms +/- 0.2%     significant
    gaussian-blur:           3.55x as fast      2569.5ms +/- 0.2%    724.2ms +/- 0.2%     significant
    darkroom:                1.179x as fast      640.5ms +/- 0.8%    543.1ms +/- 0.4%     significant
    desaturate:              1.013x as fast      917.1ms +/- 0.2%    905.6ms +/- 0.2%     significant

  json:                      ??                  194.4ms +/- 0.5%    195.1ms +/- 0.4%     not conclusive: might be *1.004x as slow*
    parse-financial:         1.009x as fast       82.4ms +/- 0.4%     81.7ms +/- 0.6%     significant
    stringify-tinderbox:     *1.012x as slow*    112.0ms +/- 0.6%    113.4ms +/- 0.7%     significant

  stanford:                  1.27x as fast      1264.2ms +/- 0.6%    994.9ms +/- 0.2%     significant
    crypto-aes:              *1.021x as slow*    164.3ms +/- 1.0%    167.8ms +/- 0.4%     significant
    crypto-ccm:              *1.027x as slow*    137.7ms +/- 0.6%    141.4ms +/- 0.4%     significant
    crypto-pbkdf2:           1.25x as fast       724.3ms +/- 0.6%    579.9ms +/- 0.4%     significant
    crypto-sha256-iterative: 2.25x as fast       237.9ms +/- 0.4%    105.8ms +/- 0.4%     significant


V8:
w/o DFG -
Richards: 3791
DeltaBlue: 3567
Crypto: 4285
RayTrace: 6387
EarleyBoyer: 6394
RegExp: 1827
Splay: 3960
----
Score (version 6): 4025

w/ DFG -
Richards: 4829
DeltaBlue: 4192
Crypto: 10176
RayTrace: 7731
EarleyBoyer: 6336
RegExp: 1756
Splay: 4563
----
Score (version 6): 5025</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486925</commentid>
    <comment_count>4</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-10-19 12:40:54 -0700</bug_when>
    <thetext>This patch is a great improvement. Long term, it seems like it would be even better to teach the DFG JIT not to load into GPRs in the first place when dealing with doubles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486930</commentid>
    <comment_count>5</comment_count>
      <attachid>111614</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-10-19 12:47:59 -0700</bug_when>
    <thetext>Comment on attachment 111614
proposed patch

This is excellent.  I think we might be able to do even better in some cases - from fillSpeculateDouble, if a value is currently in memory we should probably be loading directly into fpr rather than going via a register - we could then compare to memory to test the tag, or compare the fpr to itself to test form NaN-encoded values.
Still, this improvement is simple awesome!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487088</commentid>
    <comment_count>6</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2011-10-19 16:05:10 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; This patch is a great improvement. Long term, it seems like it would be even better to teach the DFG JIT not to load into GPRs in the first place when dealing with doubles.

Thanks. Yes, we&apos;re also seeking the opportunity to eliminate some of the double boxing/unboxings. We kept some code to let a JSValue able to be represented by a single FPR if we know it&apos;s actually a Double at compile time, while it&apos;s currently unused as it introduces a bit complex logic in code generation. But we&apos;ll revisit this for sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487091</commentid>
    <comment_count>7</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2011-10-19 16:05:57 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 111614 [details])
&gt; This is excellent.  I think we might be able to do even better in some cases - from fillSpeculateDouble, if a value is currently in memory we should probably be loading directly into fpr rather than going via a register - we could then compare to memory to test the tag, or compare the fpr to itself to test form NaN-encoded values.
&gt; Still, this improvement is simple awesome!

Hi Gavin, good point! I think it&apos;s something that we can do immediately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487179</commentid>
    <comment_count>8</comment_count>
    <who name="Yuqiang Xian">yuqiang.xian</who>
    <bug_when>2011-10-19 17:45:02 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #5)
&gt; &gt; (From update of attachment 111614 [details] [details])
&gt; &gt; This is excellent.  I think we might be able to do even better in some cases - from fillSpeculateDouble, if a value is currently in memory we should probably be loading directly into fpr rather than going via a register - we could then compare to memory to test the tag, or compare the fpr to itself to test form NaN-encoded values.
&gt; &gt; Still, this improvement is simple awesome!
&gt; 
&gt; Hi Gavin, good point! I think it&apos;s something that we can do immediately.

bug #70460 is created for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487182</commentid>
    <comment_count>9</comment_count>
      <attachid>111614</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-19 17:47:28 -0700</bug_when>
    <thetext>Comment on attachment 111614
proposed patch

Clearing flags on attachment: 111614

Committed r97903: &lt;http://trac.webkit.org/changeset/97903&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487183</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-19 17:47:33 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>111614</attachid>
            <date>2011-10-19 07:32:24 -0700</date>
            <delta_ts>2011-10-19 17:47:28 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>70418.patch</filename>
            <type>text/plain</type>
            <size>15984</size>
            <attacher name="Yuqiang Xian">yuqiang.xian</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTc4NTkpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDUgQEAK
KzIwMTEtMTAtMTkgIFl1cWlhbmcgWGlhbiAgPHl1cWlhbmcueGlhbkBpbnRlbC5jb20+CisKKyAg
ICAgICAgREZHIEpJVCAzMl82NCAtIGltcHJvdmUgZG91YmxlIGJveGluZy91bmJveGluZworICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MTgKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBEb3VibGUgYm94aW5n
L3VuYm94aW5nIGluIERGRyBKSVQgMzJfNjQgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIGluZWZm
aWNpZW50bHksCisgICAgICAgIHdoaWNoIHRyaWVzIHRvIGV4Y2hhbmdlIGRhdGEgdGhyb3VnaCBt
ZW1vcnkuCisgICAgICAgIE9uIFg4NiBzb21lIFNTRSBpbnN0cnVjdGlvbnMgY2FuIGhlbHAgdXMg
b24gc3VjaCBvcGVyYXRpb25zIHdpdGggYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAgICBUaGlz
IGltcHJvdmVzIDMyLWJpdCBERkcgcGVyZm9ybWFuY2UgYnkgMjklIG9uIEtyYWtlbiwgNyUgb24g
U3VuU3BpZGVyLAorICAgICAgICBhbmQgMiUgb24gVjgsIHRlc3RlZCBvbiBMaW51eCBYODYgKENv
cmUgaTcgTmVoYWxlbSkuCisKKyAgICAgICAgKiBhc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJYODZD
b21tb24uaDoKKyAgICAgICAgKEpTQzo6TWFjcm9Bc3NlbWJsZXJYODZDb21tb246OmxzaGlmdFBh
Y2tlZCk6CisgICAgICAgIChKU0M6Ok1hY3JvQXNzZW1ibGVyWDg2Q29tbW9uOjpyc2hpZnRQYWNr
ZWQpOgorICAgICAgICAoSlNDOjpNYWNyb0Fzc2VtYmxlclg4NkNvbW1vbjo6b3JQYWNrZWQpOgor
ICAgICAgICAoSlNDOjpNYWNyb0Fzc2VtYmxlclg4NkNvbW1vbjo6bW92ZUludDMyVG9QYWNrZWQp
OgorICAgICAgICAoSlNDOjpNYWNyb0Fzc2VtYmxlclg4NkNvbW1vbjo6bW92ZVBhY2tlZFRvSW50
MzIpOgorICAgICAgICAqIGFzc2VtYmxlci9YODZBc3NlbWJsZXIuaDoKKyAgICAgICAgKEpTQzo6
WDg2QXNzZW1ibGVyOjptb3ZkX3JyKToKKyAgICAgICAgKEpTQzo6WDg2QXNzZW1ibGVyOjpwc2xs
cV9pOHIpOgorICAgICAgICAoSlNDOjpYODZBc3NlbWJsZXI6OnBzcmxxX2k4cik6CisgICAgICAg
IChKU0M6Olg4NkFzc2VtYmxlcjo6cG9yX3JyKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdl
bmVyYXRvci5oOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6OmJveERvdWJs
ZSk6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6dW5ib3hEb3VibGUpOgor
ICAgICAgICAqIGRmZy9ERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwOgorICAgICAgICAoSlND
OjpERkc6OkpJVENvZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUpOgorICAgICAgICAoSlNDOjpERkc6
OkpJVENvZGVHZW5lcmF0b3I6OmZpbGxKU1ZhbHVlKToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRD
b2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZVZhbHVlVG9OdW1iZXIpOgorICAgICAgICAoSlND
OjpERkc6OkpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlVUludDMyVG9OdW1iZXIpOgor
ICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlS25vd25D
b25zdGFudEFyaXRoT3ApOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6Om5v
blNwZWN1bGF0aXZlQmFzaWNBcml0aE9wKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29tcGlsZXIu
aDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6Ym94RG91YmxlKToKKyAgICAgICAg
KEpTQzo6REZHOjpKSVRDb21waWxlcjo6dW5ib3hEb3VibGUpOgorICAgICAgICAqIGRmZy9ERkdT
cGVjdWxhdGl2ZUpJVDMyXzY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJ
VDo6ZmlsbFNwZWN1bGF0ZURvdWJsZSk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVK
SVQ6OmNvbnZlcnRUb0RvdWJsZSk6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6
OmNvbXBpbGUpOgorCiAyMDExLTEwLTE4ICBHZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5j
b20+CiAKICAgICAgICAgUm9sbGVkIG91dCBsYXN0IFdpbmRvd3MgYnVpbGQgZml4IGJlY2F1c2Ug
aXQgd2FzIHdyb25nLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Fzc2VtYmxlci9NYWNy
b0Fzc2VtYmxlclg4NkNvbW1vbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJYODZDb21tb24uaAkocmV2aXNpb24gOTc4NTgpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyWDg2Q29tbW9u
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcgQEAgY2xhc3MgTWFjcm9Bc3NlbWJsZXJY
ODZDb21tb24gOiBwdWJsaWMgQQogCiBwdWJsaWM6CiAgICAgdHlwZWRlZiBYODZBc3NlbWJsZXI6
OkZQUmVnaXN0ZXJJRCBGUFJlZ2lzdGVySUQ7CisgICAgdHlwZWRlZiBYODZBc3NlbWJsZXI6OlhN
TVJlZ2lzdGVySUQgWE1NUmVnaXN0ZXJJRDsKICAgICAKICAgICBzdGF0aWMgY29uc3QgaW50IE1h
eGltdW1Db21wYWN0UHRyQWxpZ25lZEFkZHJlc3NPZmZzZXQgPSAxMjc7CiAKQEAgLTcyNCw2ICs3
MjUsMzYgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gYnJhbmNoRG91YmxlKERvdWJsZUVxdWFs
T3JVbm9yZGVyZWQsIHJlZywgc2NyYXRjaCk7CiAgICAgfQogCisgICAgdm9pZCBsc2hpZnRQYWNr
ZWQoVHJ1c3RlZEltbTMyIGltbSwgWE1NUmVnaXN0ZXJJRCByZWcpCisgICAgeworICAgICAgICBB
U1NFUlQoaXNTU0UyUHJlc2VudCgpKTsKKyAgICAgICAgbV9hc3NlbWJsZXIucHNsbHFfaThyKGlt
bS5tX3ZhbHVlLCByZWcpOworICAgIH0KKworICAgIHZvaWQgcnNoaWZ0UGFja2VkKFRydXN0ZWRJ
bW0zMiBpbW0sIFhNTVJlZ2lzdGVySUQgcmVnKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGlzU1NF
MlByZXNlbnQoKSk7CisgICAgICAgIG1fYXNzZW1ibGVyLnBzcmxxX2k4cihpbW0ubV92YWx1ZSwg
cmVnKTsKKyAgICB9CisKKyAgICB2b2lkIG9yUGFja2VkKFhNTVJlZ2lzdGVySUQgc3JjLCBYTU1S
ZWdpc3RlcklEIGRzdCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc1NTRTJQcmVzZW50KCkpOwor
ICAgICAgICBtX2Fzc2VtYmxlci5wb3JfcnIoc3JjLCBkc3QpOworICAgIH0KKworICAgIHZvaWQg
bW92ZUludDMyVG9QYWNrZWQoUmVnaXN0ZXJJRCBzcmMsIFhNTVJlZ2lzdGVySUQgZHN0KQorICAg
IHsKKyAgICAgICAgQVNTRVJUKGlzU1NFMlByZXNlbnQoKSk7CisgICAgICAgIG1fYXNzZW1ibGVy
Lm1vdmRfcnIoc3JjLCBkc3QpOworICAgIH0KKworICAgIHZvaWQgbW92ZVBhY2tlZFRvSW50MzIo
WE1NUmVnaXN0ZXJJRCBzcmMsIFJlZ2lzdGVySUQgZHN0KQorICAgIHsKKyAgICAgICAgQVNTRVJU
KGlzU1NFMlByZXNlbnQoKSk7CisgICAgICAgIG1fYXNzZW1ibGVyLm1vdmRfcnIoc3JjLCBkc3Qp
OworICAgIH0KKwogICAgIC8vIFN0YWNrIG1hbmlwdWxhdGlvbiBvcGVyYXRpb25zOgogICAgIC8v
CiAgICAgLy8gVGhlIEFCSSBpcyBhc3N1bWVkIHRvIHByb3ZpZGUgYSBzdGFjayBhYnN0cmFjdGlv
biB0byBtZW1vcnksCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL1g4NkFz
c2VtYmxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIv
WDg2QXNzZW1ibGVyLmgJKHJldmlzaW9uIDk3ODU4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2Fzc2VtYmxlci9YODZBc3NlbWJsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMTgyLDYgKzE4Miw5
IEBAIHByaXZhdGU6CiAgICAgICAgIE9QMl9NT1ZaWF9HdkViICAgICAgPSAweEI2LAogICAgICAg
ICBPUDJfTU9WWlhfR3ZFdyAgICAgID0gMHhCNywKICAgICAgICAgT1AyX1BFWFRSV19HZFVkSWIg
ICA9IDB4QzUsCisgICAgICAgIE9QMl9QU0xMUV9VZHFJYiAgICAgPSAweDczLAorICAgICAgICBP
UDJfUFNSTFFfVWRxSWIgICAgID0gMHg3MywKKyAgICAgICAgT1AyX1BPUl9WZHFXZHEgICAgICA9
IDBYRUIsCiAgICAgfSBUd29CeXRlT3Bjb2RlSUQ7CiAKICAgICBUd29CeXRlT3Bjb2RlSUQgamNj
UmVsMzIoQ29uZGl0aW9uIGNvbmQpCkBAIC0yMjAsNiArMjIzLDkgQEAgcHJpdmF0ZToKIAogICAg
ICAgICBHUk9VUDExX01PViA9IDAsCiAKKyAgICAgICAgR1JPVVAxNF9PUF9QU0xMUSA9IDYsCisg
ICAgICAgIEdST1VQMTRfT1BfUFNSTFEgPSAyLAorCiAgICAgICAgIEVTQ0FQRV9ERF9GU1RQX2Rv
dWJsZVJlYWwgPSAzLAogICAgIH0gR3JvdXBPcGNvZGVJRDsKICAgICAKQEAgLTE0MTIsNiArMTQx
OCwxMiBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9ybWF0dGVyLnR3b0J5dGVPcChPUDJfTU9WRF9F
ZFZkLCAoUmVnaXN0ZXJJRClzcmMsIGRzdCk7CiAgICAgfQogCisgICAgdm9pZCBtb3ZkX3JyKFJl
Z2lzdGVySUQgc3JjLCBYTU1SZWdpc3RlcklEIGRzdCkKKyAgICB7CisgICAgICAgIG1fZm9ybWF0
dGVyLnByZWZpeChQUkVfU1NFXzY2KTsKKyAgICAgICAgbV9mb3JtYXR0ZXIudHdvQnl0ZU9wKE9Q
Ml9NT1ZEX1ZkRWQsIChSZWdpc3RlcklEKWRzdCwgc3JjKTsKKyAgICB9CisKICNpZiBDUFUoWDg2
XzY0KQogICAgIHZvaWQgbW92cV9ycihYTU1SZWdpc3RlcklEIHNyYywgUmVnaXN0ZXJJRCBkc3Qp
CiAgICAgewpAQCAtMTQ3Niw2ICsxNDg4LDI2IEBAIHB1YmxpYzoKICAgICAgICAgbV9mb3JtYXR0
ZXIuaW1tZWRpYXRlOCh3aGljaFdvcmQpOwogICAgIH0KIAorICAgIHZvaWQgcHNsbHFfaThyKGlu
dCBpbW0sIFhNTVJlZ2lzdGVySUQgZHN0KQorICAgIHsKKyAgICAgICAgbV9mb3JtYXR0ZXIucHJl
Zml4KFBSRV9TU0VfNjYpOworICAgICAgICBtX2Zvcm1hdHRlci50d29CeXRlT3A4KE9QMl9QU0xM
UV9VZHFJYiwgR1JPVVAxNF9PUF9QU0xMUSwgKFJlZ2lzdGVySUQpZHN0KTsKKyAgICAgICAgbV9m
b3JtYXR0ZXIuaW1tZWRpYXRlOChpbW0pOworICAgIH0KKworICAgIHZvaWQgcHNybHFfaThyKGlu
dCBpbW0sIFhNTVJlZ2lzdGVySUQgZHN0KQorICAgIHsKKyAgICAgICAgbV9mb3JtYXR0ZXIucHJl
Zml4KFBSRV9TU0VfNjYpOworICAgICAgICBtX2Zvcm1hdHRlci50d29CeXRlT3A4KE9QMl9QU1JM
UV9VZHFJYiwgR1JPVVAxNF9PUF9QU1JMUSwgKFJlZ2lzdGVySUQpZHN0KTsKKyAgICAgICAgbV9m
b3JtYXR0ZXIuaW1tZWRpYXRlOChpbW0pOworICAgIH0KKworICAgIHZvaWQgcG9yX3JyKFhNTVJl
Z2lzdGVySUQgc3JjLCBYTU1SZWdpc3RlcklEIGRzdCkKKyAgICB7CisgICAgICAgIG1fZm9ybWF0
dGVyLnByZWZpeChQUkVfU1NFXzY2KTsKKyAgICAgICAgbV9mb3JtYXR0ZXIudHdvQnl0ZU9wKE9Q
Ml9QT1JfVmRxV2RxLCAoUmVnaXN0ZXJJRClkc3QsIChSZWdpc3RlcklEKXNyYyk7CisgICAgfQor
CiAgICAgdm9pZCBzdWJzZF9ycihYTU1SZWdpc3RlcklEIHNyYywgWE1NUmVnaXN0ZXJJRCBkc3Qp
CiAgICAgewogICAgICAgICBtX2Zvcm1hdHRlci5wcmVmaXgoUFJFX1NTRV9GMik7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IzMl82NC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9y
MzJfNjQuY3BwCShyZXZpc2lvbiA5Nzg1OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHSklUQ29kZUdlbmVyYXRvcjMyXzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTY1LDkgKzE2
NSwxMCBAQCBGUFJSZWcgSklUQ29kZUdlbmVyYXRvcjo6ZmlsbERvdWJsZShOb2RlCiAgICAgICAg
IEpJVENvbXBpbGVyOjpKdW1wIGhhc1VuYm94ZWREb3VibGU7CiAKICAgICAgICAgaWYgKGluZm8u
cmVnaXN0ZXJGb3JtYXQoKSAhPSBEYXRhRm9ybWF0SlNJbnRlZ2VyKSB7CisgICAgICAgICAgICBG
UFJUZW1wb3Jhcnkgc2NyYXRjaCh0aGlzKTsKICAgICAgICAgICAgIEpJVENvbXBpbGVyOjpKdW1w
IGlzSW50ZWdlciA9IG1faml0LmJyYW5jaDMyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdGFnR1BS
LCBUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6SW50MzJUYWcpKTsKICAgICAgICAgICAgIG1faml0Lmpp
dEFzc2VydElzSlNEb3VibGUodGFnR1BSKTsKLSAgICAgICAgICAgIHVuYm94RG91YmxlKHRhZ0dQ
UiwgcGF5bG9hZEdQUiwgZnByLCB2aXJ0dWFsUmVnaXN0ZXIpOworICAgICAgICAgICAgdW5ib3hE
b3VibGUodGFnR1BSLCBwYXlsb2FkR1BSLCBmcHIsIHNjcmF0Y2guZnByKCkpOwogICAgICAgICAg
ICAgaGFzVW5ib3hlZERvdWJsZSA9IG1faml0Lmp1bXAoKTsKICAgICAgICAgICAgIGlzSW50ZWdl
ci5saW5rKCZtX2ppdCk7CiAgICAgICAgIH0KQEAgLTI3Niw3ICsyNzcsNyBAQCBib29sIEpJVENv
ZGVHZW5lcmF0b3I6OmZpbGxKU1ZhbHVlKE5vZGVJCiAgICAgICAgIG1fZnBycy5sb2NrKG9sZEZQ
Uik7CiAgICAgICAgIHRhZ0dQUiA9IGFsbG9jYXRlKCk7CiAgICAgICAgIHBheWxvYWRHUFIgPSBh
bGxvY2F0ZSgpOwotICAgICAgICBib3hEb3VibGUob2xkRlBSLCB0YWdHUFIsIHBheWxvYWRHUFIs
IHZpcnR1YWxSZWdpc3Rlcik7CisgICAgICAgIGJveERvdWJsZShvbGRGUFIsIHRhZ0dQUiwgcGF5
bG9hZEdQUik7CiAgICAgICAgIG1fZnBycy51bmxvY2sob2xkRlBSKTsKICAgICAgICAgbV9mcHJz
LnJlbGVhc2Uob2xkRlBSKTsKICAgICAgICAgbV9ncHJzLnJldGFpbih0YWdHUFIsIHZpcnR1YWxS
ZWdpc3RlciwgU3BpbGxPcmRlckpTKTsKQEAgLTM0OCw3ICszNDksNyBAQCB2b2lkIEpJVENvZGVH
ZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlVmFsCiAgICAgbm9uTnVtZXJpYy5saW5rKCZtX2ppdCk7
CiAgICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0VGFnR1BSLCByZXN1bHRQYXlsb2Fk
R1BSKTsKICAgICBjYWxsT3BlcmF0aW9uKGRmZ0NvbnZlcnRKU1ZhbHVlVG9OdW1iZXIsIEZQUklu
Zm86OnJldHVyblZhbHVlRlBSLCB0YWdHUFIsIHBheWxvYWRHUFIpOwotICAgIGJveERvdWJsZShG
UFJJbmZvOjpyZXR1cm5WYWx1ZUZQUiwgcmVzdWx0VGFnR1BSLCByZXN1bHRQYXlsb2FkR1BSLCBh
dChtX2NvbXBpbGVJbmRleCkudmlydHVhbFJlZ2lzdGVyKCkpOworICAgIGJveERvdWJsZShGUFJJ
bmZvOjpyZXR1cm5WYWx1ZUZQUiwgcmVzdWx0VGFnR1BSLCByZXN1bHRQYXlsb2FkR1BSKTsKICAg
ICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdFRhZ0dQUiwgcmVzdWx0UGF5bG9hZEdQUik7
CiAgICAgSklUQ29tcGlsZXI6Okp1bXAgaGFzQ2FsbGVkVG9OdW1iZXIgPSBtX2ppdC5qdW1wKCk7
CiAgICAgCkBAIC00MzMsNyArNDM0LDcgQEAgdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVj
dWxhdGl2ZVVJbgogICAgIG1faml0Lm1vdmUoSklUQ29tcGlsZXI6OlRydXN0ZWRJbW1QdHIoJnR3
b1RvVGhlMzIpLCByZXN1bHRQYXlsb2FkLmdwcigpKTsgLy8gcmV1c2UgcmVzdWx0UGF5bG9hZCBy
ZWdpc3RlciBoZXJlLgogICAgIG1faml0LmFkZERvdWJsZShKSVRDb21waWxlcjo6QWRkcmVzcyhy
ZXN1bHRQYXlsb2FkLmdwcigpLCAwKSwgYm94ZXIuZnByKCkpOwogICAgICAgICAKLSAgICBib3hE
b3VibGUoYm94ZXIuZnByKCksIHJlc3VsdFRhZy5ncHIoKSwgcmVzdWx0UGF5bG9hZC5ncHIoKSwg
YXQobV9jb21waWxlSW5kZXgpLnZpcnR1YWxSZWdpc3RlcigpKTsKKyAgICBib3hEb3VibGUoYm94
ZXIuZnByKCksIHJlc3VsdFRhZy5ncHIoKSwgcmVzdWx0UGF5bG9hZC5ncHIoKSk7CiAgICAgICAg
IAogICAgIEpJVENvbXBpbGVyOjpKdW1wIGRvbmUgPSBtX2ppdC5qdW1wKCk7CiAgICAgICAgIApA
QCAtNTUzLDcgKzU1NCw3IEBAIHZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVL
bm8KICAgICAgICAgZmFpbHVyZUNhc2VzLmxpbmsoJm1faml0KTsKICAgICB9CiAgICAgCi0gICAg
Ym94RG91YmxlKHRtcDJGUFIsIHJlc3VsdFRhZ0dQUiwgcmVzdWx0UGF5bG9hZEdQUiwgYXQobV9j
b21waWxlSW5kZXgpLnZpcnR1YWxSZWdpc3RlcigpKTsKKyAgICBib3hEb3VibGUodG1wMkZQUiwg
cmVzdWx0VGFnR1BSLCByZXN1bHRQYXlsb2FkR1BSKTsKICAgICAgICAgCiAgICAgaWYgKCFpc0tu
b3duTnVtZXJpYyhyZWdDaGlsZCkpIHsKICAgICAgICAgQVNTRVJUKG5vdEludC5pc1NldCgpKTsK
QEAgLTYzNSw3ICs2MzYsNyBAQCB2b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZl
QmFzCiAgICAgaWYgKGFyZzEuaXNEb3VibGUoKSkgewogICAgICAgICBhcmcxVGFnR1BSID0gdG1w
VGFnLmdwcigpOwogICAgICAgICBhcmcxUGF5bG9hZEdQUiA9IHRtcFBheWxvYWQuZ3ByKCk7Ci0g
ICAgICAgIGJveERvdWJsZShhcmcxLmZwcigpLCBhcmcxVGFnR1BSLCBhcmcxUGF5bG9hZEdQUiwg
YXQoYXJnMS5pbmRleCgpKS52aXJ0dWFsUmVnaXN0ZXIoKSk7CisgICAgICAgIGJveERvdWJsZShh
cmcxLmZwcigpLCBhcmcxVGFnR1BSLCBhcmcxUGF5bG9hZEdQUik7CiAgICAgICAgIGFyZzJUYWdH
UFIgPSBhcmcyLnRhZ0dQUigpOwogICAgICAgICBhcmcyUGF5bG9hZEdQUiA9IGFyZzIucGF5bG9h
ZEdQUigpOwogICAgIH0gZWxzZSBpZiAoYXJnMi5pc0RvdWJsZSgpKSB7CkBAIC02NDMsNyArNjQ0
LDcgQEAgdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZUJhcwogICAgICAgICBh
cmcxUGF5bG9hZEdQUiA9IGFyZzEucGF5bG9hZEdQUigpOwogICAgICAgICBhcmcyVGFnR1BSID0g
dG1wVGFnLmdwcigpOwogICAgICAgICBhcmcyUGF5bG9hZEdQUiA9IHRtcFBheWxvYWQuZ3ByKCk7
Ci0gICAgICAgIGJveERvdWJsZShhcmcyLmZwcigpLCBhcmcyVGFnR1BSLCBhcmcyUGF5bG9hZEdQ
UiwgYXQoYXJnMi5pbmRleCgpKS52aXJ0dWFsUmVnaXN0ZXIoKSk7CisgICAgICAgIGJveERvdWJs
ZShhcmcyLmZwcigpLCBhcmcyVGFnR1BSLCBhcmcyUGF5bG9hZEdQUik7CiAgICAgfSBlbHNlIHsK
ICAgICAgICAgYXJnMVRhZ0dQUiA9IGFyZzEudGFnR1BSKCk7CiAgICAgICAgIGFyZzFQYXlsb2Fk
R1BSID0gYXJnMS5wYXlsb2FkR1BSKCk7CkBAIC03MDUsNiArNzA2LDcgQEAgdm9pZCBKSVRDb2Rl
R2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZUJhcwogICAgIEpJVENvbXBpbGVyOjpKdW1wIGNoaWxk
Mk5vdEludDI7CiAgICAgICAgIAogICAgIGlmICghaXNLbm93bkludGVnZXIobm9kZS5jaGlsZDEo
KSkpIHsKKyAgICAgICAgRlBSVGVtcG9yYXJ5IHNjcmF0Y2godGhpcyk7CiAgICAgICAgIGNoaWxk
MU5vdEludC5saW5rKCZtX2ppdCk7CiAgICAgICAgICAgICAKICAgICAgICAgaWYgKCFpc0tub3du
TnVtZXJpYyhub2RlLmNoaWxkMSgpKSkgewpAQCAtNzE1LDcgKzcxNyw3IEBAIHZvaWQgSklUQ29k
ZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVCYXMKICAgICAgICAgaWYgKGFyZzEuaXNEb3VibGUo
KSkKICAgICAgICAgICAgIG1faml0Lm1vdmVEb3VibGUoYXJnMS5mcHIoKSwgdG1wMUZQUik7CiAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVuYm94RG91YmxlKGFyZzFUYWdHUFIsIGFyZzFQYXls
b2FkR1BSLCB0bXAxRlBSLCBhdChhcmcxLmluZGV4KCkpLnZpcnR1YWxSZWdpc3RlcigpKTsKKyAg
ICAgICAgICAgIHVuYm94RG91YmxlKGFyZzFUYWdHUFIsIGFyZzFQYXlsb2FkR1BSLCB0bXAxRlBS
LCBzY3JhdGNoLmZwcigpKTsKICAgICAgICAgICAgIAogICAgICAgICAvLyBjaGlsZDEgaXMgY29u
dmVydGVkIHRvIGEgZG91YmxlOyBjaGlsZDIgbWF5IGVpdGhlciBiZSBhbiBpbnQgb3IKICAgICAg
ICAgLy8gYSBib3hlZCBkb3VibGUKQEAgLTczOSw2ICs3NDEsNyBAQCB2b2lkIEpJVENvZGVHZW5l
cmF0b3I6Om5vblNwZWN1bGF0aXZlQmFzCiAgICAgfQogICAgICAgICAKICAgICBpZiAoIWlzS25v
d25JbnRlZ2VyKG5vZGUuY2hpbGQyKCkpKSB7CisgICAgICAgIEZQUlRlbXBvcmFyeSBzY3JhdGNo
KHRoaXMpOwogICAgICAgICBjaGlsZDJOb3RJbnQubGluaygmbV9qaXQpOwogICAgICAgICAgICAg
CiAgICAgICAgIGlmICghaXNLbm93bk51bWVyaWMobm9kZS5jaGlsZDIoKSkpIHsKQEAgLTc1NSw3
ICs3NTgsNyBAQCB2b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlQmFzCiAgICAg
ICAgIGlmIChhcmcyLmlzRG91YmxlKCkpCiAgICAgICAgICAgICBtX2ppdC5tb3ZlRG91YmxlKGFy
ZzIuZnByKCksIHRtcDJGUFIpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB1bmJveERvdWJs
ZShhcmcyVGFnR1BSLCBhcmcyUGF5bG9hZEdQUiwgdG1wMkZQUiwgYXQoYXJnMi5pbmRleCgpKS52
aXJ0dWFsUmVnaXN0ZXIoKSk7CisgICAgICAgICAgICB1bmJveERvdWJsZShhcmcyVGFnR1BSLCBh
cmcyUGF5bG9hZEdQUiwgdG1wMkZQUiwgc2NyYXRjaC5mcHIoKSk7CiAgICAgfQogICAgICAgICAK
ICAgICBoYXZlRlBSQXJndW1lbnRzLmxpbmsoJm1faml0KTsKQEAgLTc5MCw3ICs3OTMsNyBAQCB2
b2lkIEpJVENvZGVHZW5lcmF0b3I6Om5vblNwZWN1bGF0aXZlQmFzCiAgICAgICAgIGZhaWx1cmVD
YXNlcy5saW5rKCZtX2ppdCk7CiAgICAgfQogICAgICAgICAKLSAgICBib3hEb3VibGUodG1wMUZQ
UiwgcmVzdWx0VGFnR1BSLCByZXN1bHRQYXlsb2FkR1BSLCBhdChtX2NvbXBpbGVJbmRleCkudmly
dHVhbFJlZ2lzdGVyKCkpOworICAgIGJveERvdWJsZSh0bXAxRlBSLCByZXN1bHRUYWdHUFIsIHJl
c3VsdFBheWxvYWRHUFIpOwogICAgICAgICAKICAgICBpZiAoIW5vdE51bWJlcnMuZW1wdHkoKSkg
ewogICAgICAgICBBU1NFUlQob3AgPT0gVmFsdWVBZGQpOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgJKHJldmlzaW9uIDk3ODU4KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQ3OSwxMyArNDc5LDEzIEBAIHByb3RlY3RlZDoKICAgICAgICAgcmV0dXJu
IGJveERvdWJsZShmcHIsIGFsbG9jYXRlKCkpOwogICAgIH0KICNlbGlmIFVTRShKU1ZBTFVFMzJf
NjQpCi0gICAgdm9pZCBib3hEb3VibGUoRlBSUmVnIGZwciwgR1BSUmVnIHRhZ0dQUiwgR1BSUmVn
IHBheWxvYWRHUFIsIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIpCisgICAgdm9pZCBi
b3hEb3VibGUoRlBSUmVnIGZwciwgR1BSUmVnIHRhZ0dQUiwgR1BSUmVnIHBheWxvYWRHUFIpCiAg
ICAgewotICAgICAgICBtX2ppdC5ib3hEb3VibGUoZnByLCB0YWdHUFIsIHBheWxvYWRHUFIsIHZp
cnR1YWxSZWdpc3Rlcik7CisgICAgICAgIG1faml0LmJveERvdWJsZShmcHIsIHRhZ0dQUiwgcGF5
bG9hZEdQUik7CiAgICAgfQotICAgIHZvaWQgdW5ib3hEb3VibGUoR1BSUmVnIHRhZ0dQUiwgR1BS
UmVnIHBheWxvYWRHUFIsIEZQUlJlZyBmcHIsIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0
ZXIpCisgICAgdm9pZCB1bmJveERvdWJsZShHUFJSZWcgdGFnR1BSLCBHUFJSZWcgcGF5bG9hZEdQ
UiwgRlBSUmVnIGZwciwgRlBSUmVnIHNjcmF0Y2hGUFIpCiAgICAgewotICAgICAgICBtX2ppdC51
bmJveERvdWJsZSh0YWdHUFIsIHBheWxvYWRHUFIsIGZwciwgdmlydHVhbFJlZ2lzdGVyKTsKKyAg
ICAgICAgbV9qaXQudW5ib3hEb3VibGUodGFnR1BSLCBwYXlsb2FkR1BSLCBmcHIsIHNjcmF0Y2hG
UFIpOwogICAgIH0KICNlbmRpZgogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0pJVENvbXBpbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdKSVRDb21waWxlci5oCShyZXZpc2lvbiA5Nzg1OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHSklUQ29tcGlsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMzQ1LDIwICszNDUsMjMg
QEAgcHVibGljOgogICAgICAgICByZXR1cm4gZnByOwogICAgIH0KICNlbGlmIFVTRShKU1ZBTFVF
MzJfNjQpCi0gICAgLy8gRklYTUU6IFRoZSBib3gvdW5ib3ggb2YgZG91YmxlcyBjb3VsZCBiZSBp
bXByb3ZlZCB3aXRob3V0IGV4Y2hhbmdpbmcgZGF0YSB0aHJvdWdoIG1lbW9yeSwKLSAgICAvLyBm
b3IgZXhhbXBsZSBvbiB4ODYgc29tZSBTU0UgaW5zdHJ1Y3Rpb25zIGNhbiBoZWxwIGRvIHRoaXMu
Ci0gICAgdm9pZCBib3hEb3VibGUoRlBSUmVnIGZwciwgR1BSUmVnIHRhZ0dQUiwgR1BSUmVnIHBh
eWxvYWRHUFIsIFZpcnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIpCi0gICAgewotICAgICAg
ICBzdG9yZURvdWJsZShmcHIsIGFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVyKSk7Ci0gICAgICAg
IGxvYWQzMih0YWdGb3IodmlydHVhbFJlZ2lzdGVyKSwgdGFnR1BSKTsKLSAgICAgICAgbG9hZDMy
KHBheWxvYWRGb3IodmlydHVhbFJlZ2lzdGVyKSwgcGF5bG9hZEdQUik7CisgICAgdm9pZCBib3hE
b3VibGUoRlBSUmVnIGZwciwgR1BSUmVnIHRhZ0dQUiwgR1BSUmVnIHBheWxvYWRHUFIpCisgICAg
eworI2lmIENQVShYODYpCisgICAgICAgIG1vdmVQYWNrZWRUb0ludDMyKGZwciwgcGF5bG9hZEdQ
Uik7CisgICAgICAgIHJzaGlmdFBhY2tlZChUcnVzdGVkSW1tMzIoMzIpLCBmcHIpOworICAgICAg
ICBtb3ZlUGFja2VkVG9JbnQzMihmcHIsIHRhZ0dQUik7CisjZW5kaWYKICAgICB9Ci0gICAgdm9p
ZCB1bmJveERvdWJsZShHUFJSZWcgdGFnR1BSLCBHUFJSZWcgcGF5bG9hZEdQUiwgRlBSUmVnIGZw
ciwgVmlydHVhbFJlZ2lzdGVyIHZpcnR1YWxSZWdpc3RlcikKKyAgICB2b2lkIHVuYm94RG91Ymxl
KEdQUlJlZyB0YWdHUFIsIEdQUlJlZyBwYXlsb2FkR1BSLCBGUFJSZWcgZnByLCBGUFJSZWcgc2Ny
YXRjaEZQUikKICAgICB7CiAgICAgICAgIGppdEFzc2VydElzSlNEb3VibGUodGFnR1BSKTsKLSAg
ICAgICAgc3RvcmUzMih0YWdHUFIsIHRhZ0Zvcih2aXJ0dWFsUmVnaXN0ZXIpKTsKLSAgICAgICAg
c3RvcmUzMihwYXlsb2FkR1BSLCBwYXlsb2FkRm9yKHZpcnR1YWxSZWdpc3RlcikpOwotICAgICAg
ICBsb2FkRG91YmxlKGFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVyKSwgZnByKTsKKyNpZiBDUFUo
WDg2KQorICAgICAgICBtb3ZlSW50MzJUb1BhY2tlZChwYXlsb2FkR1BSLCBmcHIpOworICAgICAg
ICBtb3ZlSW50MzJUb1BhY2tlZCh0YWdHUFIsIHNjcmF0Y2hGUFIpOworICAgICAgICBsc2hpZnRQ
YWNrZWQoVHJ1c3RlZEltbTMyKDMyKSwgc2NyYXRjaEZQUik7CisgICAgICAgIG9yUGFja2VkKHNj
cmF0Y2hGUFIsIGZwcik7CisjZW5kaWYKICAgICB9CiAjZW5kaWYKIApJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCShy
ZXZpc2lvbiA5Nzg1OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRp
dmVKSVQzMl82NC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxNyw5ICsyMTcsMTAgQEAgRlBSUmVn
IFNwZWN1bGF0aXZlSklUOjpmaWxsU3BlY3VsYXRlRG91YgogICAgICAgICBKSVRDb21waWxlcjo6
SnVtcCBoYXNVbmJveGVkRG91YmxlOwogCiAgICAgICAgIGlmIChpbmZvLnJlZ2lzdGVyRm9ybWF0
KCkgIT0gRGF0YUZvcm1hdEpTSW50ZWdlcikgeworICAgICAgICAgICAgRlBSVGVtcG9yYXJ5IHNj
cmF0Y2godGhpcyk7CiAgICAgICAgICAgICBKSVRDb21waWxlcjo6SnVtcCBpc0ludGVnZXIgPSBt
X2ppdC5icmFuY2gzMihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHRhZ0dQUiwgVHJ1c3RlZEltbTMy
KEpTVmFsdWU6OkludDMyVGFnKSk7CiAgICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0
LmJyYW5jaDMyKE1hY3JvQXNzZW1ibGVyOjpBYm92ZU9yRXF1YWwsIHRhZ0dQUiwgVHJ1c3RlZElt
bTMyKEpTVmFsdWU6Okxvd2VzdFRhZykpKTsKLSAgICAgICAgICAgIHVuYm94RG91YmxlKHRhZ0dQ
UiwgcGF5bG9hZEdQUiwgZnByLCB2aXJ0dWFsUmVnaXN0ZXIpOworICAgICAgICAgICAgdW5ib3hE
b3VibGUodGFnR1BSLCBwYXlsb2FkR1BSLCBmcHIsIHNjcmF0Y2guZnByKCkpOwogICAgICAgICAg
ICAgaGFzVW5ib3hlZERvdWJsZSA9IG1faml0Lmp1bXAoKTsKICAgICAgICAgICAgIGlzSW50ZWdl
ci5saW5rKCZtX2ppdCk7CiAgICAgICAgIH0KQEAgLTM0NywxMCArMzQ4LDEyIEBAIEdQUlJlZyBT
cGVjdWxhdGl2ZUpJVDo6ZmlsbFNwZWN1bGF0ZUJvb2wKIAogSklUQ29tcGlsZXI6Okp1bXAgU3Bl
Y3VsYXRpdmVKSVQ6OmNvbnZlcnRUb0RvdWJsZShKU1ZhbHVlT3BlcmFuZCYgb3AsIEZQUlJlZyBy
ZXN1bHQpCiB7CisgICAgRlBSVGVtcG9yYXJ5IHNjcmF0Y2godGhpcyk7CisKICAgICBKSVRDb21w
aWxlcjo6SnVtcCBpc0ludGVnZXIgPSBtX2ppdC5icmFuY2gzMihNYWNyb0Fzc2VtYmxlcjo6RXF1
YWwsIG9wLnRhZ0dQUigpLCBUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6SW50MzJUYWcpKTsKICAgICBK
SVRDb21waWxlcjo6SnVtcCBub3ROdW1iZXIgPSBtX2ppdC5icmFuY2gzMihNYWNyb0Fzc2VtYmxl
cjo6QWJvdmVPckVxdWFsLCBvcC5wYXlsb2FkR1BSKCksIFRydXN0ZWRJbW0zMihKU1ZhbHVlOjpM
b3dlc3RUYWcpKTsKIAotICAgIHVuYm94RG91YmxlKG9wLnRhZ0dQUigpLCBvcC5wYXlsb2FkR1BS
KCksIHJlc3VsdCwgYXQob3AuaW5kZXgoKSkudmlydHVhbFJlZ2lzdGVyKCkpOworICAgIHVuYm94
RG91YmxlKG9wLnRhZ0dQUigpLCBvcC5wYXlsb2FkR1BSKCksIHJlc3VsdCwgc2NyYXRjaC5mcHIo
KSk7CiAgICAgSklUQ29tcGlsZXI6Okp1bXAgZG9uZSA9IG1faml0Lmp1bXAoKTsKIAogICAgIGlz
SW50ZWdlci5saW5rKCZtX2ppdCk7CkBAIC0xNjEyLDcgKzE2MTUsNyBAQCB2b2lkIFNwZWN1bGF0
aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiAgICAgICAgIEpTVmFsdWVPcGVyYW5kIG9wMSh0
aGlzLCBub2RlLmNoaWxkMSgpKTsKICAgICAgICAgb3AxLmZpbGwoKTsKICAgICAgICAgaWYgKG9w
MS5pc0RvdWJsZSgpKQotICAgICAgICAgICAgYm94RG91YmxlKG9wMS5mcHIoKSwgR1BSSW5mbzo6
cmV0dXJuVmFsdWVHUFIyLCBHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgYXQob3AxLmluZGV4KCkp
LnZpcnR1YWxSZWdpc3RlcigpKTsKKyAgICAgICAgICAgIGJveERvdWJsZShvcDEuZnByKCksIEdQ
UkluZm86OnJldHVyblZhbHVlR1BSMiwgR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIpOwogICAgICAg
ICBlbHNlIHsKICAgICAgICAgICAgIGlmIChvcDEucGF5bG9hZEdQUigpID09IEdQUkluZm86OnJl
dHVyblZhbHVlR1BSMiAmJiBvcDEudGFnR1BSKCkgPT0gR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIp
CiAgICAgICAgICAgICAgICAgbV9qaXQuc3dhcChHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgR1BS
SW5mbzo6cmV0dXJuVmFsdWVHUFIyKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>