<?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>173552</bug_id>
          
          <creation_ts>2017-06-19 10:34:32 -0700</creation_ts>
          <short_desc>bmalloc: Add a per-thread line cache</short_desc>
          <delta_ts>2017-06-26 12:04:44 -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>bmalloc</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>darin</cc>
    
    <cc>ggaren</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1320735</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-19 10:34:32 -0700</bug_when>
    <thetext>bmalloc: Add a per-thread line cache</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1320944</commentid>
    <comment_count>1</comment_count>
      <attachid>313353</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-19 20:13:14 -0700</bug_when>
    <thetext>Created attachment 313353
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1320945</commentid>
    <comment_count>2</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-19 20:14:11 -0700</bug_when>
    <thetext>MacBook Air MallocBench results:

~/OpenSource/Source/bmalloc&gt;  ~/OpenSource/PerformanceTests/MallocBench/run-malloc-benchmarks Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
                                                                                
                                                      Baseline                          Patch                              Δ
Execution Time:
    churn                                                 80ms                           78ms                 ^ 1.03x faster
    list_allocate                                         70ms                           73ms                 ! 1.04x slower
    tree_allocate                                         74ms                           76ms                 ! 1.03x slower
    tree_churn                                            82ms                           81ms                 ^ 1.01x faster
    fragment                                              70ms                           70ms                               
    fragment_iterate                                      78ms                           77ms                 ^ 1.01x faster
    medium                                               157ms                          160ms                 ! 1.02x slower
    big                                                  139ms                          138ms                 ^ 1.01x faster
    facebook                                             221ms                          219ms                 ^ 1.01x faster
    reddit                                               112ms                          113ms                 ! 1.01x slower
    flickr                                               115ms                          117ms                 ! 1.02x slower
    theverge                                             144ms                          150ms                 ! 1.04x slower
    nimlang                                              119ms                          117ms                 ^ 1.02x faster
    message_one                                          190ms                          188ms                 ^ 1.01x faster
    message_many                                         122ms                          119ms                 ^ 1.03x faster
    churn --parallel                                      37ms                           37ms                               
    list_allocate --parallel                              68ms                           69ms                 ! 1.01x slower
    tree_allocate --parallel                              84ms                           80ms                 ^ 1.05x faster
    tree_churn --parallel                                 83ms                           73ms                 ^ 1.14x faster
    fragment --parallel                                   53ms                           50ms                 ^ 1.06x faster
    fragment_iterate --parallel                           33ms                           33ms                               
    medium --parallel                                    155ms                          153ms                 ^ 1.01x faster
    big --parallel                                       148ms                          140ms                 ^ 1.06x faster
    facebook --parallel                                  635ms                          628ms                 ^ 1.01x faster
    reddit --parallel                                    316ms                          277ms                 ^ 1.14x faster
    flickr --parallel                                    312ms                          282ms                 ^ 1.11x faster
    theverge --parallel                                  412ms                          368ms                 ^ 1.12x faster

    &lt;geometric mean&gt;                                     118ms                          115ms                 ^ 1.02x faster
    &lt;arithmetic mean&gt;                                    152ms                          147ms                 ^ 1.04x faster
    &lt;harmonic mean&gt;                                       96ms                           94ms                 ^ 1.02x faster

Peak Memory:
    churn                                              2,296kB                        2,288kB                 ^ 1.0x smaller
    list_allocate                                      3,584kB                        3,588kB                  ! 1.0x bigger
    tree_allocate                                      7,404kB                        7,408kB                  ! 1.0x bigger
    tree_churn                                         6,224kB                        6,224kB                               
    fragment                                           9,452kB                        9,460kB                  ! 1.0x bigger
    fragment_iterate                                  27,124kB                       27,120kB                 ^ 1.0x smaller
    medium                                         1,190,816kB                    1,190,812kB                 ^ 1.0x smaller
    big                                            1,090,788kB                    1,090,588kB                 ^ 1.0x smaller
    facebook                                          81,136kB                       80,624kB                ^ 1.01x smaller
    reddit                                            15,412kB                       15,412kB                               
    flickr                                            29,324kB                       29,320kB                 ^ 1.0x smaller
    theverge                                          28,976kB                       28,940kB                 ^ 1.0x smaller
    nimlang                                          166,900kB                      166,344kB                 ^ 1.0x smaller
    message_one                                        6,612kB                        6,632kB                  ! 1.0x bigger
    message_many                                       4,272kB                        4,444kB                 ! 1.04x bigger
    churn --parallel                                   2,420kB                        2,428kB                  ! 1.0x bigger
    list_allocate --parallel                           3,684kB                        3,684kB                               
    tree_allocate --parallel                           4,764kB                        4,752kB                 ^ 1.0x smaller
    tree_churn --parallel                              4,412kB                        4,416kB                  ! 1.0x bigger
    fragment --parallel                                9,560kB                        9,576kB                  ! 1.0x bigger
    fragment_iterate --parallel                       27,984kB                       28,004kB                  ! 1.0x bigger
    medium --parallel                              1,191,240kB                    1,193,328kB                  ! 1.0x bigger
    big --parallel                                 1,087,676kB                    1,089,688kB                  ! 1.0x bigger
    facebook --parallel                              286,476kB                      284,320kB                ^ 1.01x smaller
    reddit --parallel                                 56,480kB                       56,548kB                  ! 1.0x bigger
    flickr --parallel                                101,908kB                      101,936kB                  ! 1.0x bigger
    theverge --parallel                              110,156kB                      109,852kB                 ^ 1.0x smaller

    &lt;geometric mean&gt;                                  29,976kB                       30,008kB                  ! 1.0x bigger
    &lt;arithmetic mean&gt;                                205,818kB                      205,842kB                  ! 1.0x bigger
    &lt;harmonic mean&gt;                                    9,014kB                        9,043kB                  ! 1.0x bigger

Memory at End:
    churn                                                464kB                          456kB                ^ 1.02x smaller
    list_allocate                                        464kB                          468kB                 ! 1.01x bigger
    tree_allocate                                        464kB                          468kB                 ! 1.01x bigger
    tree_churn                                           468kB                          468kB                               
    fragment                                             468kB                          476kB                 ! 1.02x bigger
    fragment_iterate                                     480kB                          476kB                ^ 1.01x smaller
    medium                                               544kB                          540kB                ^ 1.01x smaller
    big                                                  536kB                          536kB                               
    facebook                                           2,444kB                        2,444kB                               
    reddit                                             1,684kB                        1,684kB                               
    flickr                                             2,600kB                        2,596kB                 ^ 1.0x smaller
    theverge                                           2,644kB                        2,608kB                ^ 1.01x smaller
    nimlang                                           58,460kB                       58,544kB                  ! 1.0x bigger
    message_one                                          740kB                          748kB                 ! 1.01x bigger
    message_many                                       1,324kB                        1,148kB                ^ 1.15x smaller
    churn --parallel                                     580kB                          588kB                 ! 1.01x bigger
    list_allocate --parallel                             620kB                          608kB                ^ 1.02x smaller
    tree_allocate --parallel                             820kB                          828kB                 ! 1.01x bigger
    tree_churn --parallel                                868kB                          780kB                ^ 1.11x smaller
    fragment --parallel                                  716kB                        1,008kB                 ! 1.41x bigger
    fragment_iterate --parallel                          652kB                          644kB                ^ 1.01x smaller
    medium --parallel                                  5,752kB                        6,744kB                 ! 1.17x bigger
    big --parallel                                    38,308kB                       29,200kB                ^ 1.31x smaller
    facebook --parallel                               12,392kB                       11,956kB                ^ 1.04x smaller
    reddit --parallel                                  6,972kB                        6,808kB                ^ 1.02x smaller
    flickr --parallel                                 11,432kB                       11,524kB                 ! 1.01x bigger
    theverge --parallel                               10,848kB                       10,996kB                 ! 1.01x bigger

    &lt;geometric mean&gt;                                   1,689kB                        1,685kB                 ^ 1.0x smaller
    &lt;arithmetic mean&gt;                                  6,065kB                        5,753kB                ^ 1.05x smaller
    &lt;harmonic mean&gt;                                      910kB                          916kB                 ! 1.01x bigger</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1320947</commentid>
    <comment_count>3</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-19 20:15:24 -0700</bug_when>
    <thetext>Mac Pro MallocBench results:

~/OpenSource/Source/bmalloc&gt; ~/OpenSource/PerformanceTests/MallocBench/run-malloc-benchmarks Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
                                                                                
                                                      Baseline                          Patch                              Δ
Execution Time:
    churn                                                 71ms                           71ms                               
    list_allocate                                         63ms                           65ms                 ! 1.03x slower
    tree_allocate                                         63ms                           64ms                 ! 1.02x slower
    tree_churn                                            76ms                           75ms                 ^ 1.01x faster
    fragment                                              61ms                           61ms                               
    fragment_iterate                                      66ms                           66ms                               
    medium                                               138ms                          138ms                               
    big                                                  119ms                          121ms                 ! 1.02x slower
    facebook                                             184ms                          184ms                               
    reddit                                               100ms                          100ms                               
    flickr                                               104ms                          105ms                 ! 1.01x slower
    theverge                                             132ms                          133ms                 ! 1.01x slower
    nimlang                                              117ms                          114ms                 ^ 1.03x faster
    message_one                                          176ms                          174ms                 ^ 1.01x faster
    message_many                                         953ms                          911ms                 ^ 1.05x faster
    churn --parallel                                      33ms                           32ms                 ^ 1.03x faster
    list_allocate --parallel                             146ms                          116ms                 ^ 1.26x faster
    tree_allocate --parallel                             805ms                          613ms                 ^ 1.31x faster
    tree_churn --parallel                              1,009ms                          354ms                 ^ 2.85x faster
    fragment --parallel                                   82ms                           62ms                 ^ 1.32x faster
    fragment_iterate --parallel                           12ms                           12ms                               
    medium --parallel                                    119ms                          117ms                 ^ 1.02x faster
    big --parallel                                       116ms                          115ms                 ^ 1.01x faster
    facebook --parallel                                4,719ms                        4,104ms                 ^ 1.15x faster
    reddit --parallel                                  3,852ms                        2,753ms                  ^ 1.4x faster
    flickr --parallel                                  4,126ms                        2,532ms                 ^ 1.63x faster
    theverge --parallel                                4,456ms                        3,289ms                 ^ 1.35x faster

    &lt;geometric mean&gt;                                     199ms                          177ms                 ^ 1.12x faster
    &lt;arithmetic mean&gt;                                    811ms                          610ms                 ^ 1.33x faster
    &lt;harmonic mean&gt;                                       88ms                           85ms                 ^ 1.03x faster

Peak Memory:
    churn                                              1,024kB                        1,036kB                 ! 1.01x bigger
    list_allocate                                      2,324kB                        2,324kB                               
    tree_allocate                                      6,132kB                        6,144kB                  ! 1.0x bigger
    tree_churn                                         4,960kB                        4,948kB                 ^ 1.0x smaller
    fragment                                           8,176kB                        8,176kB                               
    fragment_iterate                                  25,840kB                       25,852kB                  ! 1.0x bigger
    medium                                         1,189,528kB                    1,189,528kB                               
    big                                            1,089,316kB                    1,089,548kB                  ! 1.0x bigger
    facebook                                          79,400kB                       79,816kB                 ! 1.01x bigger
    reddit                                            14,092kB                       14,080kB                 ^ 1.0x smaller
    flickr                                            28,044kB                       27,976kB                 ^ 1.0x smaller
    theverge                                          27,608kB                       27,608kB                               
    nimlang                                          165,688kB                      166,184kB                  ! 1.0x bigger
    message_one                                        5,484kB                        5,460kB                 ^ 1.0x smaller
    message_many                                       2,916kB                        2,924kB                  ! 1.0x bigger
    churn --parallel                                   1,696kB                        1,760kB                 ! 1.04x bigger
    list_allocate --parallel                           3,136kB                        3,296kB                 ! 1.05x bigger
    tree_allocate --parallel                          12,972kB                       12,800kB                ^ 1.01x smaller
    tree_churn --parallel                             13,024kB                       13,964kB                 ! 1.07x bigger
    fragment --parallel                                7,216kB                        7,528kB                 ! 1.04x bigger
    fragment_iterate --parallel                       28,176kB                       28,348kB                 ! 1.01x bigger
    medium --parallel                              1,134,232kB                    1,159,656kB                 ! 1.02x bigger
    big --parallel                                 1,038,960kB                    1,024,420kB                ^ 1.01x smaller
    facebook --parallel                            1,582,944kB                    1,595,348kB                 ! 1.01x bigger
    reddit --parallel                                291,172kB                      300,924kB                 ! 1.03x bigger
    flickr --parallel                                550,712kB                      555,568kB                 ! 1.01x bigger
    theverge --parallel                              602,324kB                      614,916kB                 ! 1.02x bigger

    &lt;geometric mean&gt;                                  36,479kB                       36,866kB                 ! 1.01x bigger
    &lt;arithmetic mean&gt;                                293,226kB                      295,190kB                 ! 1.01x bigger
    &lt;harmonic mean&gt;                                    6,982kB                        7,089kB                 ! 1.02x bigger

Memory at End:
    churn                                                572kB                          584kB                 ! 1.02x bigger
    list_allocate                                        584kB                          584kB                               
    tree_allocate                                        572kB                          584kB                 ! 1.02x bigger
    tree_churn                                           584kB                          572kB                ^ 1.02x smaller
    fragment                                             572kB                          572kB                               
    fragment_iterate                                     572kB                          584kB                 ! 1.02x bigger
    medium                                               632kB                          632kB                               
    big                                                  632kB                          636kB                 ! 1.01x bigger
    facebook                                           2,560kB                        2,508kB                ^ 1.02x smaller
    reddit                                             1,748kB                        1,736kB                ^ 1.01x smaller
    flickr                                             2,704kB                        2,636kB                ^ 1.03x smaller
    theverge                                           2,660kB                        2,660kB                               
    nimlang                                           58,548kB                       58,440kB                 ^ 1.0x smaller
    message_one                                        1,012kB                          984kB                ^ 1.03x smaller
    message_many                                       1,488kB                        1,556kB                 ! 1.05x bigger
    churn --parallel                                   1,260kB                        1,324kB                 ! 1.05x bigger
    list_allocate --parallel                           1,596kB                        1,652kB                 ! 1.04x bigger
    tree_allocate --parallel                           2,560kB                        2,764kB                 ! 1.08x bigger
    tree_churn --parallel                              2,836kB                        2,520kB                ^ 1.13x smaller
    fragment --parallel                                2,608kB                        2,828kB                 ! 1.08x bigger
    fragment_iterate --parallel                        1,716kB                        2,128kB                 ! 1.24x bigger
    medium --parallel                                 49,384kB                       31,760kB                ^ 1.55x smaller
    big --parallel                                    79,960kB                       77,192kB                ^ 1.04x smaller
    facebook --parallel                               40,992kB                       39,532kB                ^ 1.04x smaller
    reddit --parallel                                 30,316kB                       29,752kB                ^ 1.02x smaller
    flickr --parallel                                 37,020kB                       34,972kB                ^ 1.06x smaller
    theverge --parallel                               32,012kB                       32,288kB                 ! 1.01x bigger

    &lt;geometric mean&gt;                                   3,081kB                        3,055kB                ^ 1.01x smaller
    &lt;arithmetic mean&gt;                                 13,248kB                       12,370kB                ^ 1.07x smaller
    &lt;harmonic mean&gt;                                    1,334kB                        1,349kB                 ! 1.01x bigger</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1321008</commentid>
    <comment_count>4</comment_count>
      <attachid>313353</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2017-06-19 22:57:54 -0700</bug_when>
    <thetext>Comment on attachment 313353
Patch

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

&gt; Source/bmalloc/bmalloc/List.h:118
&gt; +    static void remove(ListNode&lt;T&gt;* node)

The insertAfter function could also be marked static; why not?

&gt; Source/bmalloc/bmalloc/SmallPage.h:71
&gt; +typedef std::array&lt;List&lt;SmallPage&gt;, sizeClassCount&gt; LineCache;

In new code, we’ve been preferring using to typedef.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1322625</commentid>
    <comment_count>5</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-24 13:14:35 -0700</bug_when>
    <thetext>Committed r218788: &lt;http://trac.webkit.org/changeset/218788&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1322933</commentid>
    <comment_count>6</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-06-26 12:04:44 -0700</bug_when>
    <thetext>This is a 4% progression on wasm benchmarks too.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>313353</attachid>
            <date>2017-06-19 20:13:14 -0700</date>
            <delta_ts>2017-06-19 22:57:54 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-173552-20170619201312.patch</filename>
            <type>text/plain</type>
            <size>14533</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9ibWFsbG9jL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1h
bGxvYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDIxODQ5NykKKysrIFNvdXJjZS9ibWFsbG9jL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY0IEBACisyMDE3LTA2LTE5ICBHZW9mZnJl
eSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+CisKKyAgICAgICAgYm1hbGxvYzogQWRkIGEgcGVy
LXRocmVhZCBsaW5lIGNhY2hlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNzM1NTIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBQcmV2aW91c2x5LCBhbnkgdGhyZWFkIGNvdWxkIGFsbG9jYXRlIG91dCBvZiBh
bnkgcGFnZSB3aXRoIGZyZWUgbGluZXMuCisgICAgICAgIE5vdywgdGhlIGZpcnN0IHRocmVhZCB0
byBmcmVlIGEgbGluZSBpbiBhIHBhZ2Ugb3ducyB0aGF0IHBhZ2UncyBmcmVlCisgICAgICAgIGxp
bmVzIHVudGlsIHRoZSB3aG9sZSBwYWdlIGJlY29tZXMgZnJlZS4KKworICAgICAgICBUaGlzIHBh
dGNoIGlzIGEgYmlnIHNwZWVkdXAgb24gbXVsdGktdGhyZWFkZWQgYmVuY2htYXJrcy4KKyAgICAg
ICAgdHJlZV9jaHVybiAtLXBhcmFsbGVsIGdldHMgMTQlIGZhc3RlciBvbiBhIDItY29yZSAoNC1o
eXBlci1jb3JlKSBNYWNCb29rCisgICAgICAgIEFpciBhbmQgMi44NVggZmFzdGVyIG9uIDEyLWNv
cmUgKDI0LWh5cGVyLWNvcmUpIE1hYyBQcm8uIE90aGVyIHBhcmFsbGVsCisgICAgICAgIGJlbmNo
bWFya3Mgc2hvdyBzaWduaWZpY2FudCBidXQgc21hbGxlciBzcGVlZHVwcy4KKworICAgICAgICBU
aHJlYWQgYWZmaW5pdHkgaXMgYSBncmVhdCBwcmVkaWN0b3Igb2Ygb2JqZWN0IGxpZmV0aW1lLiBU
aGUgcGVyLXRocmVhZAorICAgICAgICBsaW5lIGNhY2hlIGF2b2lkcyB0aGUgcGF0aG9sb2d5IG9m
IHNodWZmbGluZyBwYWdlcyBiZXR3ZWVuIHRocmVhZHMsCisgICAgICAgIHR1cm5pbmcgcHJlZGlj
dGFibGUgbGlmZXRpbWVzIGludG8gdW5wcmVkaWN0YWJsZSBsaWZldGltZXMsIGluY3JlYXNpbmcK
KyAgICAgICAgZnJhZ21lbnRhdGlvbi4gT24gdHJlZV9jaHVybiAtLXBhcmFsbGVsLCB0aGUgcGVy
LXRocmVhZCBsaW5lIGNhY2hlCisgICAgICAgIGluY3JlYXNlcyBmcmVlIG1lbW9yeSBmb3VuZCBw
ZXIgcGFnZSBzY2FubmVkIGJ5IDIuODVYLgorCisgICAgICAgIEZyZWUgbGluZSBzY2FubmluZyBp
biBmcmFnbWVudGVkIHBhZ2VzIGlzIHByZXR0eSBleHBlbnNpdmUgcmVsYXRpdmUgdG8KKyAgICAg
ICAgb3RoZXIgYWxsb2NhdGUgLyBpbml0aWFsaXplIC8gZnJlZSBvcGVyYXRpb25zLiBBY2NvcmRp
bmcgdG8gSW5zdHJ1bWVudHMsCisgICAgICAgIG9uIHRyZWVfY2h1cm4gLS1wYXJhbGxlbCwgc2Nh
bm5pbmcgaXMgYWJvdXQgMTBYIG1vcmUgZXhwZW5zaXZlIHRoYW4KKyAgICAgICAgZnJlZWluZy4g
VGhpcyBleHBsYWlucyB3aHkgYSAyLjg1WCBpbXByb3ZlbWVudCBpbiBzY2FubmluZyBlZmZpY2ll
bmN5CisgICAgICAgIHRyYW5zbGF0ZXMgaW50byBhIDIuODVYIG92ZXJhbGwgc3BlZWR1cCBvbiB0
cmVlX2NodXJuIC0tcGFyYWxsZWwuCisKKyAgICAgICAgKiBibWFsbG9jL0FsbG9jYXRvci5jcHA6
CisgICAgICAgIChibWFsbG9jOjpBbGxvY2F0b3I6OnJlZmlsbEFsbG9jYXRvclNsb3dDYXNlKTog
UGFzcyB0aHJvdWdoIG91ciBsaW5lCisgICAgICAgIGNhY2hlIHNvIHRoZSBIZWFwIGNhbiBmaWxs
IGl0LgorCisgICAgICAgICogYm1hbGxvYy9EZWFsbG9jYXRvci5jcHA6CisgICAgICAgIChibWFs
bG9jOjpEZWFsbG9jYXRvcjo6c2NhdmVuZ2UpOiBTY2F2ZW5nZSBvdXIgbGluZSBjYWNoZS4KKwor
ICAgICAgICAoYm1hbGxvYzo6RGVhbGxvY2F0b3I6OnByb2Nlc3NPYmplY3RMb2cpOiBEZWxldGVk
LgorCisgICAgICAgICogYm1hbGxvYy9EZWFsbG9jYXRvci5oOgorICAgICAgICAoYm1hbGxvYzo6
RGVhbGxvY2F0b3I6OmxpbmVDYWNoZSk6IEFkZGVkIGEgbGluZSBjYWNoZS4KKworICAgICAgICAq
IGJtYWxsb2MvSGVhcC5jcHA6CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpkZWFsbG9jYXRlTGlu
ZUNhY2hlKTogRGVhbGxvY2F0aW9uIGZ1bmN0aW9uIGZvciB0aHJlYWQKKyAgICAgICAgZGVzdHJ1
Y3Rpb24uCisKKyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OmFsbG9jYXRlU21hbGxQYWdlKToKKyAg
ICAgICAgKGJtYWxsb2M6OkhlYXA6OmRlYWxsb2NhdGVTbWFsbExpbmUpOgorICAgICAgICAoYm1h
bGxvYzo6SGVhcDo6YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU1ldGFkYXRhKToKKyAgICAgICAg
KGJtYWxsb2M6OkhlYXA6OmFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzQnlPYmplY3QpOiBDb25zdWx0
IHRoZSBuZXcgcGVyLXRocmVhZCBsaW5lCisgICAgICAgIGNhY2hlIGZvciBhbGxvY2F0aW9uIGFu
ZCBkZWFsbG9jYXRpb24uCisKKyAgICAgICAgKiBibWFsbG9jL0hlYXAuaDoKKyAgICAgICAgKGJt
YWxsb2M6OkhlYXA6OmFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzKToKKyAgICAgICAgKGJtYWxsb2M6
OkhlYXA6OmRlcmVmU21hbGxMaW5lKToKKworICAgICAgICAqIGJtYWxsb2MvTGlzdC5oOgorICAg
ICAgICAoYm1hbGxvYzo6TGlzdDo6cmVtb3ZlKTogUmVtb3ZlIGhhcyBhbHdheXMgYmVlbiBhIGxv
Z2ljYWxseSBzdGF0aWMKKyAgICAgICAgb3BlcmF0aW9uLiBEZWNsYXJlIGl0IHN0YXRpYyBub3cg
c28gdGhhdCB0aGUgSGVhcCBjYW4gcmVtb3ZlIGEgcGFnZSBmcm9tCisgICAgICAgIGEgdGhyZWFk
J3MgbGluZSBjYWNoZSB3aXRob3V0IGhvbGRpbmcgYSBkaXJlY3QgcG9pbnRlciB0byB0aGUgY2Fj
aGUuCisKKyAgICAgICAgKiBibWFsbG9jL1NtYWxsUGFnZS5oOgorCiAyMDE3LTA2LTEwICBEYW4g
QmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2ZXJ0ZWQgcjIxODA1NiBi
ZWNhdXNlIGl0IG1hZGUgdGhlIElERSByZWluZGV4IGNvbnN0YW50bHkuCkluZGV4OiBTb3VyY2Uv
Ym1hbGxvYy9ibWFsbG9jL0FsbG9jYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxs
b2MvYm1hbGxvYy9BbGxvY2F0b3IuY3BwCShyZXZpc2lvbiAyMTc5NDgpCisrKyBTb3VyY2UvYm1h
bGxvYy9ibWFsbG9jL0FsbG9jYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1NSw3ICsxNTUs
OCBAQCBOT19JTkxJTkUgdm9pZCBBbGxvY2F0b3I6OnJlZmlsbEFsbG9jYXRvCiAKICAgICBzdGQ6
OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+IGxvY2soUGVyUHJvY2VzczxIZWFwPjo6bXV0ZXgoKSk7
CiAgICAgbV9kZWFsbG9jYXRvci5wcm9jZXNzT2JqZWN0TG9nKGxvY2spOwotICAgIFBlclByb2Nl
c3M8SGVhcD46OmdldEZhc3RDYXNlKCktPmFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzKGxvY2ssIHNp
emVDbGFzcywgYWxsb2NhdG9yLCBidW1wUmFuZ2VDYWNoZSk7CisgICAgUGVyUHJvY2VzczxIZWFw
Pjo6Z2V0RmFzdENhc2UoKS0+YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXMoCisgICAgICAgIGxvY2ss
IHNpemVDbGFzcywgYWxsb2NhdG9yLCBidW1wUmFuZ2VDYWNoZSwgbV9kZWFsbG9jYXRvci5saW5l
Q2FjaGUobG9jaykpOwogfQogCiBJTkxJTkUgdm9pZCBBbGxvY2F0b3I6OnJlZmlsbEFsbG9jYXRv
cihCdW1wQWxsb2NhdG9yJiBhbGxvY2F0b3IsIHNpemVfdCBzaXplQ2xhc3MpCkluZGV4OiBTb3Vy
Y2UvYm1hbGxvYy9ibWFsbG9jL0RlYWxsb2NhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
Ym1hbGxvYy9ibWFsbG9jL0RlYWxsb2NhdG9yLmNwcAkocmV2aXNpb24gMjE3OTQ4KQorKysgU291
cmNlL2JtYWxsb2MvYm1hbGxvYy9EZWFsbG9jYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU5
LDcgKzU5LDEwIEBAIHZvaWQgRGVhbGxvY2F0b3I6OnNjYXZlbmdlKCkKICAgICBpZiAobV9kZWJ1
Z0hlYXApCiAgICAgICAgIHJldHVybjsKIAotICAgIHByb2Nlc3NPYmplY3RMb2coKTsKKyAgICBz
dGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+IGxvY2soUGVyUHJvY2VzczxIZWFwPjo6bXV0ZXgo
KSk7CisKKyAgICBwcm9jZXNzT2JqZWN0TG9nKGxvY2spOworICAgIFBlclByb2Nlc3M8SGVhcD46
OmdldEZhc3RDYXNlKCktPmRlYWxsb2NhdGVMaW5lQ2FjaGUobG9jaywgbGluZUNhY2hlKGxvY2sp
KTsKIH0KIAogdm9pZCBEZWFsbG9jYXRvcjo6cHJvY2Vzc09iamVjdExvZyhzdGQ6OmxvY2tfZ3Vh
cmQ8U3RhdGljTXV0ZXg+JiBsb2NrKQpAQCAtNjcsMTcgKzcwLDEwIEBAIHZvaWQgRGVhbGxvY2F0
b3I6OnByb2Nlc3NPYmplY3RMb2coc3RkOjoKICAgICBIZWFwKiBoZWFwID0gUGVyUHJvY2VzczxI
ZWFwPjo6Z2V0RmFzdENhc2UoKTsKICAgICAKICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBtX29i
amVjdExvZykKLSAgICAgICAgaGVhcC0+ZGVyZWZTbWFsbExpbmUobG9jaywgb2JqZWN0KTsKLQor
ICAgICAgICBoZWFwLT5kZXJlZlNtYWxsTGluZShsb2NrLCBvYmplY3QsIGxpbmVDYWNoZShsb2Nr
KSk7CiAgICAgbV9vYmplY3RMb2cuY2xlYXIoKTsKIH0KIAotdm9pZCBEZWFsbG9jYXRvcjo6cHJv
Y2Vzc09iamVjdExvZygpCi17Ci0gICAgc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiBsb2Nr
KFBlclByb2Nlc3M8SGVhcD46Om11dGV4KCkpOwotICAgIHByb2Nlc3NPYmplY3RMb2cobG9jayk7
Ci19Ci0KIHZvaWQgRGVhbGxvY2F0b3I6OmRlYWxsb2NhdGVTbG93Q2FzZSh2b2lkKiBvYmplY3Qp
CiB7CiAgICAgaWYgKG1fZGVidWdIZWFwKQpJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9E
ZWFsbG9jYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvRGVhbGxv
Y2F0b3IuaAkocmV2aXNpb24gMjE3OTQ4KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9EZWFs
bG9jYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIERlYWxs
b2NhdG9yX2gKIAogI2luY2x1ZGUgIkZpeGVkVmVjdG9yLmgiCisjaW5jbHVkZSAiU21hbGxQYWdl
LmgiCiAjaW5jbHVkZSA8bXV0ZXg+CiAKIG5hbWVzcGFjZSBibWFsbG9jIHsKQEAgLTQ1LDE0ICs0
NiwxNiBAQCBwdWJsaWM6CiAgICAgdm9pZCBkZWFsbG9jYXRlKHZvaWQqKTsKICAgICB2b2lkIHNj
YXZlbmdlKCk7CiAgICAgCi0gICAgdm9pZCBwcm9jZXNzT2JqZWN0TG9nKCk7CiAgICAgdm9pZCBw
cm9jZXNzT2JqZWN0TG9nKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mKTsKKyAgICAKKyAg
ICBMaW5lQ2FjaGUmIGxpbmVDYWNoZShzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JikgeyBy
ZXR1cm4gbV9saW5lQ2FjaGU7IH0KIAogcHJpdmF0ZToKICAgICBib29sIGRlYWxsb2NhdGVGYXN0
Q2FzZSh2b2lkKik7CiAgICAgdm9pZCBkZWFsbG9jYXRlU2xvd0Nhc2Uodm9pZCopOwogCiAgICAg
Rml4ZWRWZWN0b3I8dm9pZCosIGRlYWxsb2NhdG9yTG9nQ2FwYWNpdHk+IG1fb2JqZWN0TG9nOwor
ICAgIExpbmVDYWNoZSBtX2xpbmVDYWNoZTsgLy8gVGhlIEhlYXAgcmVtb3ZlcyBpdGVtcyBmcm9t
IHRoaXMgY2FjaGUuCiAgICAgRGVidWdIZWFwKiBtX2RlYnVnSGVhcDsKIH07CiAKSW5kZXg6IFNv
dXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxs
b2MvYm1hbGxvYy9IZWFwLmNwcAkocmV2aXNpb24gMjE3OTQ4KQorKysgU291cmNlL2JtYWxsb2Mv
Ym1hbGxvYy9IZWFwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTkxLDYgKzE5MSwxNiBAQCB2b2lk
IEhlYXA6OnNjaGVkdWxlU2NhdmVuZ2VyKHNpemVfdCBieXRlCiAgICAgbV9zY2F2ZW5nZXIucnVu
U29vbigpOwogfQogCit2b2lkIEhlYXA6OmRlYWxsb2NhdGVMaW5lQ2FjaGUoc3RkOjpsb2NrX2d1
YXJkPFN0YXRpY011dGV4PiYsIExpbmVDYWNoZSYgbGluZUNhY2hlKQoreworICAgIGZvciAoYXV0
byYgbGlzdCA6IGxpbmVDYWNoZSkgeworICAgICAgICB3aGlsZSAoIWxpc3QuaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICBzaXplX3Qgc2l6ZUNsYXNzID0gJmxpc3QgLSAmbGluZUNhY2hlWzBdOwor
ICAgICAgICAgICAgbV9saW5lQ2FjaGVbc2l6ZUNsYXNzXS5wdXNoKGxpc3QucG9wRnJvbnQoKSk7
CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgSGVhcDo6YWxsb2NhdGVTbWFsbENodW5rKHN0
ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mIGxvY2ssIHNpemVfdCBwYWdlQ2xhc3MpCiB7CiAg
ICAgc2l6ZV90IHBhZ2VTaXplID0gYm1hbGxvYzo6cGFnZVNpemUocGFnZUNsYXNzKTsKQEAgLTIz
NSwxMCArMjQ1LDEzIEBAIHZvaWQgSGVhcDo6ZGVhbGxvY2F0ZVNtYWxsQ2h1bmsoQ2h1bmsqIGMK
ICAgICBtX2xhcmdlRnJlZS5hZGQoTGFyZ2VSYW5nZShjaHVuaywgc2l6ZSwgcGh5c2ljYWxTaXpl
KSk7CiB9CiAKLVNtYWxsUGFnZSogSGVhcDo6YWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjpsb2NrX2d1
YXJkPFN0YXRpY011dGV4PiYgbG9jaywgc2l6ZV90IHNpemVDbGFzcykKK1NtYWxsUGFnZSogSGVh
cDo6YWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYgbG9jaywg
c2l6ZV90IHNpemVDbGFzcywgTGluZUNhY2hlJiBsaW5lQ2FjaGUpCiB7Ci0gICAgaWYgKCFtX2Zy
ZWVMaW5lc1tzaXplQ2xhc3NdLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIG1fZnJlZUxpbmVz
W3NpemVDbGFzc10ucG9wRnJvbnQoKTsKKyAgICBpZiAoIWxpbmVDYWNoZVtzaXplQ2xhc3NdLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGxpbmVDYWNoZVtzaXplQ2xhc3NdLnBvcEZyb250KCk7
CisKKyAgICBpZiAoIW1fbGluZUNhY2hlW3NpemVDbGFzc10uaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gbV9saW5lQ2FjaGVbc2l6ZUNsYXNzXS5wb3BGcm9udCgpOwogCiAgICAgbV9pc0dyb3dp
bmcgPSB0cnVlOwogICAgIApAQCAtMjcwLDcgKzI4Myw3IEBAIFNtYWxsUGFnZSogSGVhcDo6YWxs
b2NhdGVTbWFsbFBhZ2Uoc3RkOjoKICAgICByZXR1cm4gcGFnZTsKIH0KIAotdm9pZCBIZWFwOjpk
ZWFsbG9jYXRlU21hbGxMaW5lKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mIGxvY2ssIE9i
amVjdCBvYmplY3QpCit2b2lkIEhlYXA6OmRlYWxsb2NhdGVTbWFsbExpbmUoc3RkOjpsb2NrX2d1
YXJkPFN0YXRpY011dGV4PiYgbG9jaywgT2JqZWN0IG9iamVjdCwgTGluZUNhY2hlJiBsaW5lQ2Fj
aGUpCiB7CiAgICAgQkFTU0VSVCghb2JqZWN0LmxpbmUoKS0+cmVmQ291bnQobG9jaykpOwogICAg
IFNtYWxsUGFnZSogcGFnZSA9IG9iamVjdC5wYWdlKCk7CkBAIC0yNzgsNyArMjkxLDcgQEAgdm9p
ZCBIZWFwOjpkZWFsbG9jYXRlU21hbGxMaW5lKHN0ZDo6bG9jawogCiAgICAgaWYgKCFwYWdlLT5o
YXNGcmVlTGluZXMobG9jaykpIHsKICAgICAgICAgcGFnZS0+c2V0SGFzRnJlZUxpbmVzKGxvY2ss
IHRydWUpOwotICAgICAgICBtX2ZyZWVMaW5lc1twYWdlLT5zaXplQ2xhc3MoKV0ucHVzaChwYWdl
KTsKKyAgICAgICAgbGluZUNhY2hlW3BhZ2UtPnNpemVDbGFzcygpXS5wdXNoKHBhZ2UpOwogICAg
IH0KIAogICAgIGlmIChwYWdlLT5yZWZDb3VudChsb2NrKSkKQEAgLTI4Nyw3ICszMDAsNyBAQCB2
b2lkIEhlYXA6OmRlYWxsb2NhdGVTbWFsbExpbmUoc3RkOjpsb2NrCiAgICAgc2l6ZV90IHNpemVD
bGFzcyA9IHBhZ2UtPnNpemVDbGFzcygpOwogICAgIHNpemVfdCBwYWdlQ2xhc3MgPSBtX3BhZ2VD
bGFzc2VzW3NpemVDbGFzc107CiAKLSAgICBtX2ZyZWVMaW5lc1tzaXplQ2xhc3NdLnJlbW92ZShw
YWdlKTsKKyAgICBMaXN0PFNtYWxsUGFnZT46OnJlbW92ZShwYWdlKTsgLy8gJ3BhZ2UnIG1heSBi
ZSBpbiBhbnkgdGhyZWFkJ3MgbGluZSBjYWNoZS4KICAgICAKICAgICBDaHVuayogY2h1bmsgPSBD
aHVuazo6Z2V0KHBhZ2UpOwogICAgIGlmIChjaHVuay0+ZnJlZVBhZ2VzKCkuaXNFbXB0eSgpKQpA
QCAtMzEwLDkgKzMyMywxMCBAQCB2b2lkIEhlYXA6OmRlYWxsb2NhdGVTbWFsbExpbmUoc3RkOjps
b2NrCiAKIHZvaWQgSGVhcDo6YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU1ldGFkYXRhKAogICAg
IHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mIGxvY2ssIHNpemVfdCBzaXplQ2xhc3MsCi0g
ICAgQnVtcEFsbG9jYXRvciYgYWxsb2NhdG9yLCBCdW1wUmFuZ2VDYWNoZSYgcmFuZ2VDYWNoZSkK
KyAgICBCdW1wQWxsb2NhdG9yJiBhbGxvY2F0b3IsIEJ1bXBSYW5nZUNhY2hlJiByYW5nZUNhY2hl
LAorICAgIExpbmVDYWNoZSYgbGluZUNhY2hlKQogewotICAgIFNtYWxsUGFnZSogcGFnZSA9IGFs
bG9jYXRlU21hbGxQYWdlKGxvY2ssIHNpemVDbGFzcyk7CisgICAgU21hbGxQYWdlKiBwYWdlID0g
YWxsb2NhdGVTbWFsbFBhZ2UobG9jaywgc2l6ZUNsYXNzLCBsaW5lQ2FjaGUpOwogICAgIFNtYWxs
TGluZSogbGluZXMgPSBwYWdlLT5iZWdpbigpOwogICAgIEJBU1NFUlQocGFnZS0+aGFzRnJlZUxp
bmVzKGxvY2spKTsKICAgICBzaXplX3Qgc21hbGxMaW5lQ291bnQgPSBtX3ZtUGFnZVNpemVQaHlz
aWNhbCAvIHNtYWxsTGluZVNpemU7CkBAIC0zNTYsNyArMzcwLDcgQEAgdm9pZCBIZWFwOjphbGxv
Y2F0ZVNtYWxsQnVtcFJhbmdlc0J5TWV0YQogCiAgICAgICAgIC8vIEluIGEgZnJhZ21lbnRlZCBw
YWdlLCBzb21lIGZyZWUgcmFuZ2VzIG1pZ2h0IG5vdCBmaXQgaW4gdGhlIGNhY2hlLgogICAgICAg
ICBpZiAocmFuZ2VDYWNoZS5zaXplKCkgPT0gcmFuZ2VDYWNoZS5jYXBhY2l0eSgpKSB7Ci0gICAg
ICAgICAgICBtX2ZyZWVMaW5lc1tzaXplQ2xhc3NdLnB1c2gocGFnZSk7CisgICAgICAgICAgICBs
aW5lQ2FjaGVbc2l6ZUNsYXNzXS5wdXNoKHBhZ2UpOwogICAgICAgICAgICAgQkFTU0VSVChhbGxv
Y2F0b3IuY2FuQWxsb2NhdGUoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAg
LTM3MSwxMCArMzg1LDExIEBAIHZvaWQgSGVhcDo6YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU1l
dGEKIAogdm9pZCBIZWFwOjphbGxvY2F0ZVNtYWxsQnVtcFJhbmdlc0J5T2JqZWN0KAogICAgIHN0
ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mIGxvY2ssIHNpemVfdCBzaXplQ2xhc3MsCi0gICAg
QnVtcEFsbG9jYXRvciYgYWxsb2NhdG9yLCBCdW1wUmFuZ2VDYWNoZSYgcmFuZ2VDYWNoZSkKKyAg
ICBCdW1wQWxsb2NhdG9yJiBhbGxvY2F0b3IsIEJ1bXBSYW5nZUNhY2hlJiByYW5nZUNhY2hlLAor
ICAgIExpbmVDYWNoZSYgbGluZUNhY2hlKQogewogICAgIHNpemVfdCBzaXplID0gYWxsb2NhdG9y
LnNpemUoKTsKLSAgICBTbWFsbFBhZ2UqIHBhZ2UgPSBhbGxvY2F0ZVNtYWxsUGFnZShsb2NrLCBz
aXplQ2xhc3MpOworICAgIFNtYWxsUGFnZSogcGFnZSA9IGFsbG9jYXRlU21hbGxQYWdlKGxvY2ss
IHNpemVDbGFzcywgbGluZUNhY2hlKTsKICAgICBCQVNTRVJUKHBhZ2UtPmhhc0ZyZWVMaW5lcyhs
b2NrKSk7CiAKICAgICBhdXRvIGZpbmRTbWFsbEJ1bXBSYW5nZSA9IFsmXShPYmplY3QmIGl0LCBP
YmplY3QmIGVuZCkgewpAQCAtNDEwLDcgKzQyNSw3IEBAIHZvaWQgSGVhcDo6YWxsb2NhdGVTbWFs
bEJ1bXBSYW5nZXNCeU9iamUKIAogICAgICAgICAvLyBJbiBhIGZyYWdtZW50ZWQgcGFnZSwgc29t
ZSBmcmVlIHJhbmdlcyBtaWdodCBub3QgZml0IGluIHRoZSBjYWNoZS4KICAgICAgICAgaWYgKHJh
bmdlQ2FjaGUuc2l6ZSgpID09IHJhbmdlQ2FjaGUuY2FwYWNpdHkoKSkgewotICAgICAgICAgICAg
bV9mcmVlTGluZXNbc2l6ZUNsYXNzXS5wdXNoKHBhZ2UpOworICAgICAgICAgICAgbGluZUNhY2hl
W3NpemVDbGFzc10ucHVzaChwYWdlKTsKICAgICAgICAgICAgIEJBU1NFUlQoYWxsb2NhdG9yLmNh
bkFsbG9jYXRlKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkluZGV4OiBTb3Vy
Y2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9i
bWFsbG9jL0hlYXAuaAkocmV2aXNpb24gMjE3OTQ4KQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxv
Yy9IZWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTU5LDggKzU5LDEwIEBAIHB1YmxpYzoKICAgICAK
ICAgICBEZWJ1Z0hlYXAqIGRlYnVnSGVhcCgpIHsgcmV0dXJuIG1fZGVidWdIZWFwOyB9CiAKLSAg
ICB2b2lkIGFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRl
eD4mLCBzaXplX3Qgc2l6ZUNsYXNzLCBCdW1wQWxsb2NhdG9yJiwgQnVtcFJhbmdlQ2FjaGUmKTsK
LSAgICB2b2lkIGRlcmVmU21hbGxMaW5lKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBP
YmplY3QpOworICAgIHZvaWQgYWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXMoc3RkOjpsb2NrX2d1YXJk
PFN0YXRpY011dGV4PiYsIHNpemVfdCBzaXplQ2xhc3MsCisgICAgICAgIEJ1bXBBbGxvY2F0b3Im
LCBCdW1wUmFuZ2VDYWNoZSYsIExpbmVDYWNoZSYpOworICAgIHZvaWQgZGVyZWZTbWFsbExpbmUo
c3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYsIE9iamVjdCwgTGluZUNhY2hlJik7CisgICAg
dm9pZCBkZWFsbG9jYXRlTGluZUNhY2hlKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBM
aW5lQ2FjaGUmKTsKIAogICAgIHZvaWQqIGFsbG9jYXRlTGFyZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0
YXRpY011dGV4PiYsIHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCk7CiAgICAgdm9pZCogdHJ5QWxs
b2NhdGVMYXJnZShzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+Jiwgc2l6ZV90IGFsaWdubWVu
dCwgc2l6ZV90KTsKQEAgLTkxLDEyICs5MywxMiBAQCBwcml2YXRlOgogICAgIHZvaWQgaW5pdGlh
bGl6ZVBhZ2VNZXRhZGF0YSgpOwogCiAgICAgdm9pZCBhbGxvY2F0ZVNtYWxsQnVtcFJhbmdlc0J5
TWV0YWRhdGEoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYsCi0gICAgICAgIHNpemVfdCBz
aXplQ2xhc3MsIEJ1bXBBbGxvY2F0b3ImLCBCdW1wUmFuZ2VDYWNoZSYpOworICAgICAgICBzaXpl
X3Qgc2l6ZUNsYXNzLCBCdW1wQWxsb2NhdG9yJiwgQnVtcFJhbmdlQ2FjaGUmLCBMaW5lQ2FjaGUm
KTsKICAgICB2b2lkIGFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzQnlPYmplY3Qoc3RkOjpsb2NrX2d1
YXJkPFN0YXRpY011dGV4PiYsCi0gICAgICAgIHNpemVfdCBzaXplQ2xhc3MsIEJ1bXBBbGxvY2F0
b3ImLCBCdW1wUmFuZ2VDYWNoZSYpOworICAgICAgICBzaXplX3Qgc2l6ZUNsYXNzLCBCdW1wQWxs
b2NhdG9yJiwgQnVtcFJhbmdlQ2FjaGUmLCBMaW5lQ2FjaGUmKTsKIAotICAgIFNtYWxsUGFnZSog
YWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYsIHNpemVfdCBz
aXplQ2xhc3MpOwotICAgIHZvaWQgZGVhbGxvY2F0ZVNtYWxsTGluZShzdGQ6OmxvY2tfZ3VhcmQ8
U3RhdGljTXV0ZXg+JiwgT2JqZWN0KTsKKyAgICBTbWFsbFBhZ2UqIGFsbG9jYXRlU21hbGxQYWdl
KHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBzaXplX3Qgc2l6ZUNsYXNzLCBMaW5lQ2Fj
aGUmKTsKKyAgICB2b2lkIGRlYWxsb2NhdGVTbWFsbExpbmUoc3RkOjpsb2NrX2d1YXJkPFN0YXRp
Y011dGV4PiYsIE9iamVjdCwgTGluZUNhY2hlJik7CiAKICAgICB2b2lkIGFsbG9jYXRlU21hbGxD
aHVuayhzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+Jiwgc2l6ZV90IHBhZ2VDbGFzcyk7CiAg
ICAgdm9pZCBkZWFsbG9jYXRlU21hbGxDaHVuayhDaHVuayosIHNpemVfdCBwYWdlQ2xhc3MpOwpA
QCAtMTE2LDcgKzExOCw3IEBAIHByaXZhdGU6CiAgICAgVmVjdG9yPExpbmVNZXRhZGF0YT4gbV9z
bWFsbExpbmVNZXRhZGF0YTsKICAgICBzdGQ6OmFycmF5PHNpemVfdCwgc2l6ZUNsYXNzQ291bnQ+
IG1fcGFnZUNsYXNzZXM7CiAKLSAgICBzdGQ6OmFycmF5PExpc3Q8U21hbGxQYWdlPiwgc2l6ZUNs
YXNzQ291bnQ+IG1fZnJlZUxpbmVzOworICAgIExpbmVDYWNoZSBtX2xpbmVDYWNoZTsKICAgICBz
dGQ6OmFycmF5PExpc3Q8Q2h1bms+LCBwYWdlQ2xhc3NDb3VudD4gbV9mcmVlUGFnZXM7CiAgICAg
c3RkOjphcnJheTxMaXN0PENodW5rPiwgcGFnZUNsYXNzQ291bnQ+IG1fY2h1bmtDYWNoZTsKIApA
QCAtMTQzLDE4ICsxNDUsMTkgQEAgcHJpdmF0ZToKIAogaW5saW5lIHZvaWQgSGVhcDo6YWxsb2Nh
dGVTbWFsbEJ1bXBSYW5nZXMoCiAgICAgc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYgbG9j
aywgc2l6ZV90IHNpemVDbGFzcywKLSAgICBCdW1wQWxsb2NhdG9yJiBhbGxvY2F0b3IsIEJ1bXBS
YW5nZUNhY2hlJiByYW5nZUNhY2hlKQorICAgIEJ1bXBBbGxvY2F0b3ImIGFsbG9jYXRvciwgQnVt
cFJhbmdlQ2FjaGUmIHJhbmdlQ2FjaGUsCisgICAgTGluZUNhY2hlJiBsaW5lQ2FjaGUpCiB7CiAg
ICAgaWYgKHNpemVDbGFzcyA8IGJtYWxsb2M6OnNpemVDbGFzcyhzbWFsbExpbmVTaXplKSkKLSAg
ICAgICAgcmV0dXJuIGFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzQnlNZXRhZGF0YShsb2NrLCBzaXpl
Q2xhc3MsIGFsbG9jYXRvciwgcmFuZ2VDYWNoZSk7Ci0gICAgcmV0dXJuIGFsbG9jYXRlU21hbGxC
dW1wUmFuZ2VzQnlPYmplY3QobG9jaywgc2l6ZUNsYXNzLCBhbGxvY2F0b3IsIHJhbmdlQ2FjaGUp
OworICAgICAgICByZXR1cm4gYWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU1ldGFkYXRhKGxvY2ss
IHNpemVDbGFzcywgYWxsb2NhdG9yLCByYW5nZUNhY2hlLCBsaW5lQ2FjaGUpOworICAgIHJldHVy
biBhbGxvY2F0ZVNtYWxsQnVtcFJhbmdlc0J5T2JqZWN0KGxvY2ssIHNpemVDbGFzcywgYWxsb2Nh
dG9yLCByYW5nZUNhY2hlLCBsaW5lQ2FjaGUpOwogfQogCi1pbmxpbmUgdm9pZCBIZWFwOjpkZXJl
ZlNtYWxsTGluZShzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBsb2NrLCBPYmplY3Qgb2Jq
ZWN0KQoraW5saW5lIHZvaWQgSGVhcDo6ZGVyZWZTbWFsbExpbmUoc3RkOjpsb2NrX2d1YXJkPFN0
YXRpY011dGV4PiYgbG9jaywgT2JqZWN0IG9iamVjdCwgTGluZUNhY2hlJiBsaW5lQ2FjaGUpCiB7
CiAgICAgaWYgKCFvYmplY3QubGluZSgpLT5kZXJlZihsb2NrKSkKICAgICAgICAgcmV0dXJuOwot
ICAgIGRlYWxsb2NhdGVTbWFsbExpbmUobG9jaywgb2JqZWN0KTsKKyAgICBkZWFsbG9jYXRlU21h
bGxMaW5lKGxvY2ssIG9iamVjdCwgbGluZUNhY2hlKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYm1h
bGxvYwpJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9MaXN0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL2JtYWxsb2MvYm1hbGxvYy9MaXN0LmgJKHJldmlzaW9uIDIxNzk0OCkKKysrIFNvdXJj
ZS9ibWFsbG9jL2JtYWxsb2MvTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTUsNyArMTE1LDcg
QEAgcHVibGljOgogICAgICAgICBwcmV2LT5uZXh0ID0gbm9kZTsKICAgICB9CiAKLSAgICB2b2lk
IHJlbW92ZShMaXN0Tm9kZTxUPiogbm9kZSkKKyAgICBzdGF0aWMgdm9pZCByZW1vdmUoTGlzdE5v
ZGU8VD4qIG5vZGUpCiAgICAgewogICAgICAgICBMaXN0Tm9kZTxUPiogbmV4dCA9IG5vZGUtPm5l
eHQ7CiAgICAgICAgIExpc3ROb2RlPFQ+KiBwcmV2ID0gbm9kZS0+cHJldjsKSW5kZXg6IFNvdXJj
ZS9ibWFsbG9jL2JtYWxsb2MvU21hbGxQYWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxs
b2MvYm1hbGxvYy9TbWFsbFBhZ2UuaAkocmV2aXNpb24gMjE3OTQ4KQorKysgU291cmNlL2JtYWxs
b2MvYm1hbGxvYy9TbWFsbFBhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsOCBAQAog
CiBuYW1lc3BhY2UgYm1hbGxvYyB7CiAKK2NsYXNzIFNtYWxsTGluZTsKKwogY2xhc3MgU21hbGxQ
YWdlIDogcHVibGljIExpc3ROb2RlPFNtYWxsUGFnZT4gewogcHVibGljOgogICAgIHZvaWQgcmVm
KHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mKTsKQEAgLTY2LDYgKzY4LDggQEAgc3RhdGlj
X2Fzc2VydCgKICAgICAiTGFyZ2VzdCBzaXplIGNsYXNzIG11c3QgZml0IGluIFNtYWxsUGFnZSBt
ZXRhZGF0YSIpOwogfTsKIAordHlwZWRlZiBzdGQ6OmFycmF5PExpc3Q8U21hbGxQYWdlPiwgc2l6
ZUNsYXNzQ291bnQ+IExpbmVDYWNoZTsKKwogaW5saW5lIHZvaWQgU21hbGxQYWdlOjpyZWYoc3Rk
Ojpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYpCiB7CiAgICAgQkFTU0VSVCghbV9zbGlkZSk7Cg==
</data>
<flag name="review"
          id="334253"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>