<?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>229393</bug_id>
          
          <creation_ts>2021-08-23 01:31:50 -0700</creation_ts>
          <short_desc>Start teaching WidthIterator about character clusters</short_desc>
          <delta_ts>2021-09-10 17:38:02 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>229394</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Myles C. Maxfield">mmaxfield</assigned_to>
          <cc>fujii</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1786346</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2021-08-23 01:31:50 -0700</bug_when>
    <thetext>Start teaching WidthIterator about character clusters</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1786349</commentid>
    <comment_count>1</comment_count>
      <attachid>436165</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2021-08-23 01:33:32 -0700</bug_when>
    <thetext>Created attachment 436165
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1788454</commentid>
    <comment_count>2</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-08-30 01:32:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/82514688&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1792263</commentid>
    <comment_count>3</comment_count>
      <attachid>436165</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2021-09-10 00:29:20 -0700</bug_when>
    <thetext>Comment on attachment 436165
Patch

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

&gt; Source/WebCore/ChangeLog:16
&gt; +        * platform/graphics/ComposedCharacterClusterTextIterator.h: Added.

Unicode is using the term &quot;grapheme cluster&quot;. Is &quot;grapheme cluster&quot; a better word?
https://unicode.org/reports/tr29/

&gt; Source/WebCore/platform/graphics/ComposedCharacterClusterTextIterator.h:46
&gt; +    bool consume(UChar32&amp; character, unsigned&amp; clusterLength)

Why does &apos;consume&apos; return a single character?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1792277</commentid>
    <comment_count>4</comment_count>
      <attachid>436165</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2021-09-10 02:10:30 -0700</bug_when>
    <thetext>Comment on attachment 436165
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:16
&gt;&gt; +        * platform/graphics/ComposedCharacterClusterTextIterator.h: Added.
&gt; 
&gt; Unicode is using the term &quot;grapheme cluster&quot;. Is &quot;grapheme cluster&quot; a better word?
&gt; https://unicode.org/reports/tr29/

&quot;Grapheme cluster&quot; has a formal and rigorous definition defined by Unicode, but that definition doesn&apos;t actually always match what users view of as a conceptual &quot;letter.&quot; It&apos;s close, but there are some tweaks that text engines use to better match user expectation. There&apos;s a more general, fuzzy term &quot;composed character cluster&quot; that matches this idea. It&apos;s similar to what css-text calls a &quot;typographic letter unit&quot; which has an intentionally fuzzy definition. The concept of a composed character cluster does not have a formal rigorous definition; representing it by a grapheme cluster is a good approximation, but many text engines go beyond this with their own custom tweaks.

&gt;&gt; Source/WebCore/platform/graphics/ComposedCharacterClusterTextIterator.h:46
&gt;&gt; +    bool consume(UChar32&amp; character, unsigned&amp; clusterLength)
&gt; 
&gt; Why does &apos;consume&apos; return a single character?

The |UChar32&amp; character| is an out param that returns the &quot;base&quot; character in the cluster. The &quot;base&quot; character is always the first character. For example, if the cluster is U+0065 LATIN SMALL LETTER E followed by U+0301 COMBINING ACUTE ACCENT (to form &quot;é&quot;), the &quot;base&quot; character is the &quot;e&quot;. I believe the term &quot;base character&quot; in a cluster is a term defined by Unicode, but I&apos;m not sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1792292</commentid>
    <comment_count>5</comment_count>
      <attachid>436165</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2021-09-10 05:13:56 -0700</bug_when>
    <thetext>Comment on attachment 436165
Patch

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/ComposedCharacterClusterTextIterator.h:46
&gt;&gt;&gt; +    bool consume(UChar32&amp; character, unsigned&amp; clusterLength)
&gt;&gt; 
&gt;&gt; Why does &apos;consume&apos; return a single character?
&gt; 
&gt; The |UChar32&amp; character| is an out param that returns the &quot;base&quot; character in the cluster. The &quot;base&quot; character is always the first character. For example, if the cluster is U+0065 LATIN SMALL LETTER E followed by U+0301 COMBINING ACUTE ACCENT (to form &quot;é&quot;), the &quot;base&quot; character is the &quot;e&quot;. I believe the term &quot;base character&quot; in a cluster is a term defined by Unicode, but I&apos;m not sure.

&apos;WidthIterator::advanceInternal&apos; advances by &apos;advanceLength&apos; which is &apos;clusterLength&apos; returned by the &apos;consume&apos; method.

https://github.com/WebKit/WebKit/blob/e6953d368b55b5daba4805cc9bbc9383d79e1375/Source/WebCore/platform/graphics/WidthIterator.cpp#L340

&gt; textIterator.advance(advanceLength);

If the complex text code path is removed, I think only base characters of clusters are shown.
For example, family emoji 👨‍👩‍👧‍👦 shows only the first person 👨. This is unhappy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1792430</commentid>
    <comment_count>6</comment_count>
      <attachid>436165</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2021-09-10 10:21:02 -0700</bug_when>
    <thetext>Comment on attachment 436165
Patch

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

&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/ComposedCharacterClusterTextIterator.h:46
&gt;&gt;&gt;&gt; +    bool consume(UChar32&amp; character, unsigned&amp; clusterLength)
&gt;&gt;&gt; 
&gt;&gt;&gt; Why does &apos;consume&apos; return a single character?
&gt;&gt; 
&gt;&gt; The |UChar32&amp; character| is an out param that returns the &quot;base&quot; character in the cluster. The &quot;base&quot; character is always the first character. For example, if the cluster is U+0065 LATIN SMALL LETTER E followed by U+0301 COMBINING ACUTE ACCENT (to form &quot;é&quot;), the &quot;base&quot; character is the &quot;e&quot;. I believe the term &quot;base character&quot; in a cluster is a term defined by Unicode, but I&apos;m not sure.
&gt; 
&gt; &apos;WidthIterator::advanceInternal&apos; advances by &apos;advanceLength&apos; which is &apos;clusterLength&apos; returned by the &apos;consume&apos; method.
&gt; 
&gt; https://github.com/WebKit/WebKit/blob/e6953d368b55b5daba4805cc9bbc9383d79e1375/Source/WebCore/platform/graphics/WidthIterator.cpp#L340

Right. The next patch I’m planning to write is to iterate across the whole cluster, instead of only considering the base glyph. Font fallback has to be done for the cluster as a whole, and then after font fallback is complete, each code point in the cluster gets mapped to a glyph in the (one) font. This patch is the first step in that process.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1792432</commentid>
    <comment_count>7</comment_count>
      <attachid>436165</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2021-09-10 10:24:38 -0700</bug_when>
    <thetext>Comment on attachment 436165
Patch

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/ComposedCharacterClusterTextIterator.h:46
&gt;&gt;&gt;&gt;&gt; +    bool consume(UChar32&amp; character, unsigned&amp; clusterLength)
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Why does &apos;consume&apos; return a single character?
&gt;&gt;&gt; 
&gt;&gt;&gt; The |UChar32&amp; character| is an out param that returns the &quot;base&quot; character in the cluster. The &quot;base&quot; character is always the first character. For example, if the cluster is U+0065 LATIN SMALL LETTER E followed by U+0301 COMBINING ACUTE ACCENT (to form &quot;é&quot;), the &quot;base&quot; character is the &quot;e&quot;. I believe the term &quot;base character&quot; in a cluster is a term defined by Unicode, but I&apos;m not sure.
&gt;&gt; 
&gt;&gt; &apos;WidthIterator::advanceInternal&apos; advances by &apos;advanceLength&apos; which is &apos;clusterLength&apos; returned by the &apos;consume&apos; method.
&gt;&gt; 
&gt;&gt; https://github.com/WebKit/WebKit/blob/e6953d368b55b5daba4805cc9bbc9383d79e1375/Source/WebCore/platform/graphics/WidthIterator.cpp#L340
&gt; 
&gt; Right. The next patch I’m planning to write is to iterate across the whole cluster, instead of only considering the base glyph. Font fallback has to be done for the cluster as a whole, and then after font fallback is complete, each code point in the cluster gets mapped to a glyph in the (one) font. This patch is the first step in that process.

(That’s why this new code is behind a USE(CLUSTER_AWARE_WIDTH_ITERATOR) which is off by default. Additional patches will be needed before we can flip the switch and enable the functionality. Also, I’m confident there will need to be performance work to make this cluster stuff as fast as the current behavior.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1792622</commentid>
    <comment_count>8</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-09-10 17:38:00 -0700</bug_when>
    <thetext>Committed r282304 (241576@main): &lt;https://commits.webkit.org/241576@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 436165.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>436165</attachid>
            <date>2021-08-23 01:33:32 -0700</date>
            <delta_ts>2021-09-10 17:38:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-229393-20210823013331.patch</filename>
            <type>text/plain</type>
            <size>8314</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjgxNDM5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNWM3MThlM2I2YTlhZGZk
ODA1ZTMxYzliNmRmYzAwMzEwNzU0NTJhNS4uNjM1OWQ5MTdkYWJkNTQ2YWI2YzQ4MWM3ODcxNDE0
MTJjMzM3MTg1ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI2IEBACisyMDIxLTA4LTIzICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgU3RhcnQgdGVh
Y2hpbmcgV2lkdGhJdGVyYXRvciBhYm91dCBjaGFyYWN0ZXIgY2x1c3RlcnMKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyOTM5MworCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIElmIHdlIHJlbW92ZSB0aGUgY29t
cGxleCB0ZXh0IGNvZGVwYXRoLCB3ZSBoYXZlIHRvIHRlYWNoIHRoZSBmYXN0IHRleHQKKyAgICAg
ICAgY29kZXBhdGggYWJvdXQgY2hhcmFjdGVyIGNsdXN0ZXJzLCBzbyBpdCBjYW4gcGVyZm9ybSBm
b250IGZhbGxiYWNrIGNvcnJlY3RseS4KKyAgICAgICAgV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlu
Z3MgbGlrZSBzcGxpdCB1cCBlbW9qaSBmYW1pbGllcyBiZWNhdXNlIHdlIGRpZG4ndCByZWFsaXpl
CisgICAgICAgIHRoZXkgc2hvdWxkIGFsbCBiZSBrZXB0IHRvZ2V0aGVyIGFzIGFuIGF0b21pYyB1
bml0IQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBiZWNhdXNlIHRoaXMgaXNuJ3QgZW5hYmxlZCB5
ZXQuCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29tcG9zZWRDaGFyYWN0ZXJDbHVzdGVyVGV4dEl0ZXJh
dG9yLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29tcG9zZWRDaGFyYWN0ZXJDbHVzdGVy
VGV4dEl0ZXJhdG9yOjpDb21wb3NlZENoYXJhY3RlckNsdXN0ZXJUZXh0SXRlcmF0b3IpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcG9zZWRDaGFyYWN0ZXJDbHVzdGVyVGV4dEl0ZXJhdG9yOjpjb25z
dW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2VkQ2hhcmFjdGVyQ2x1c3RlclRleHRJdGVy
YXRvcjo6YWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wb3NlZENoYXJhY3RlckNsdXN0
ZXJUZXh0SXRlcmF0b3I6OmN1cnJlbnRJbmRleCBjb25zdCk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvV2lkdGhJdGVyYXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXaWR0aEl0ZXJh
dG9yOjphZHZhbmNlKToKKwogMjAyMS0wOC0yMiAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2Fy
Y2lhQGlnYWxpYS5jb20+CiAKICAgICAgICAgW0ZyZWV0eXBlXSBTZXQgbWF4aW11bSBhbGxvd2Vk
IGZvbnQgc2l6ZSBmb3IgRnJlZXR5cGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCBiMDkzNmEwZDQ1OWYyNDFiZTUyYTdhMWVjNGZj
ODZjNzM3NjE3M2ZiLi40MGQ2MGI4OWMwZjQxYzc0OGI5MWI1NGE0ZDM2ZDVhOGFlYjYyYmY0IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
CkBAIC02OTY1LDYgKzY5NjUsNyBAQAogCQkxQzgxQjk1NjBFOTczMzA4MDAyNjZFMDcgLyogSW5z
cGVjdG9yQ29udHJvbGxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJbnNw
ZWN0b3JDb250cm9sbGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFDODFCOTU3
MEU5NzMzMDgwMDI2NkUwNyAvKiBJbnNwZWN0b3JDb250cm9sbGVyLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEluc3BlY3RvckNvbnRyb2xsZXIuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQkxQzgxQjk1ODBFOTczMzA4MDAyNjZFMDcgLyogSW5zcGVj
dG9yQ2xpZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEluc3BlY3RvckNs
aWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQzg0QkU0MTI2RDM5MzlGMDAy
RDYxRkMgLyogQ29tcG9zZWRDaGFyYWN0ZXJDbHVzdGVyVGV4dEl0ZXJhdG9yLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IENvbXBvc2VkQ2hhcmFjdGVyQ2x1c3RlclRleHRJdGVyYXRvci5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkxQzhEMjZEMDIyQzA5Q0RFMDBEMTI1RjMgLyogbGliY29tcHJl
c3Npb24udGJkICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBl
ID0gInNvdXJjZWNvZGUudGV4dC1iYXNlZC1keWxpYi1kZWZpbml0aW9uIjsgbmFtZSA9IGxpYmNv
bXByZXNzaW9uLnRiZDsgcGF0aCA9IHVzci9saWIvbGliY29tcHJlc3Npb24udGJkOyBzb3VyY2VU
cmVlID0gU0RLUk9PVDsgfTsKIAkJMUM5MDRERjkwQkE5RDJDODAwODFFOUQwIC8qIFZlcnNpb24u
eGNjb25maWcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnhjY29uZmlnOyBwYXRoID0gVmVyc2lvbi54Y2NvbmZp
Zzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMUNBRjM0N0UwQTZDNDA1MjAwQUJFMDZF
IC8qIFdlYlNjcmlwdE9iamVjdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBX
ZWJTY3JpcHRPYmplY3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTI2NTIzLDYg
KzI2NTI0LDcgQEAKIAkJCQkwRkU2Qzc2QzFGQkZCN0E2MDAyNUMwNTMgLyogQ29sb3JVdGlsaXRp
ZXMuaCAqLywKIAkJCQlDMkY0RTc4ODFFNDVBRURGMDA2RDcxMDUgLyogQ29tcGxleFRleHRDb250
cm9sbGVyLmNwcCAqLywKIAkJCQlDMkY0RTc4OTFFNDVBRURGMDA2RDcxMDUgLyogQ29tcGxleFRl
eHRDb250cm9sbGVyLmggKi8sCisJCQkJMUM4NEJFNDEyNkQzOTM5RjAwMkQ2MUZDIC8qIENvbXBv
c2VkQ2hhcmFjdGVyQ2x1c3RlclRleHRJdGVyYXRvci5oICovLAogCQkJCTcyQkFDM0E3MjNFMTcz
MjgwMDhENzQxQyAvKiBDb25jcmV0ZUltYWdlQnVmZmVyLmggKi8sCiAJCQkJMkQyRkMwNTQxNDYw
Q0Q2RjAwMjYzNjMzIC8qIENyb3NzZmFkZUdlbmVyYXRlZEltYWdlLmNwcCAqLywKIAkJCQkyRDJG
QzA1NTE0NjBDRDZGMDAyNjM2MzMgLyogQ3Jvc3NmYWRlR2VuZXJhdGVkSW1hZ2UuaCAqLywKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbXBvc2VkQ2hhcmFj
dGVyQ2x1c3RlclRleHRJdGVyYXRvci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvQ29tcG9zZWRDaGFyYWN0ZXJDbHVzdGVyVGV4dEl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDgz
MWNlNThkMzJlNTc0MGMxOTM5OTE4ZWFlOGJmZDA4MWVhMmE1YgotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbXBvc2VkQ2hhcmFjdGVyQ2x1c3Rl
clRleHRJdGVyYXRvci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MjEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2luY2x1ZGUgPHVuaWNvZGUvdXRmMTYuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9UZXh0
QnJlYWtJdGVyYXRvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvbXBvc2Vk
Q2hhcmFjdGVyQ2x1c3RlclRleHRJdGVyYXRvciB7CitwdWJsaWM6CisgICAgLy8gVGhlIHBhc3Nl
ZCBpbiBVQ2hhciBwb2ludGVyIHN0YXJ0cyBhdCAnY3VycmVudEluZGV4Jy4gVGhlIGl0ZXJhdG9y
IG9wZXJhdGVzIG9uIHRoZSByYW5nZSBbY3VycmVudEluZGV4LCBsYXN0SW5kZXhdLgorICAgIC8v
ICdlbmRJbmRleCcgZGVub3RlcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIFVDaGFyIGFycmF5
LCB3aGljaCBtaWdodCBleGNlZWQgJ2xhc3RJbmRleCcuCisgICAgQ29tcG9zZWRDaGFyYWN0ZXJD
bHVzdGVyVGV4dEl0ZXJhdG9yKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBjdXJy
ZW50SW5kZXgsIHVuc2lnbmVkIGxhc3RJbmRleCwgdW5zaWduZWQgZW5kSW5kZXgpCisgICAgICAg
IDogbV9pdGVyYXRvcihTdHJpbmdWaWV3KGNoYXJhY3RlcnMsIGVuZEluZGV4IC0gY3VycmVudElu
ZGV4KSwgVGV4dEJyZWFrSXRlcmF0b3I6Ok1vZGU6OkNhcmV0LCBudWxsQXRvbSgpKQorICAgICAg
ICAsIG1fY2hhcmFjdGVycyhjaGFyYWN0ZXJzKQorICAgICAgICAsIG1fb3JpZ2luYWxJbmRleChj
dXJyZW50SW5kZXgpCisgICAgICAgICwgbV9jdXJyZW50SW5kZXgoY3VycmVudEluZGV4KQorICAg
ICAgICAsIG1fbGFzdEluZGV4KGxhc3RJbmRleCkKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBj
b25zdW1lKFVDaGFyMzImIGNoYXJhY3RlciwgdW5zaWduZWQmIGNsdXN0ZXJMZW5ndGgpCisgICAg
eworICAgICAgICBpZiAobV9jdXJyZW50SW5kZXggPj0gbV9sYXN0SW5kZXgpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYXV0byByZWxhdGl2ZUluZGV4ID0gbV9jdXJyZW50
SW5kZXggLSBtX29yaWdpbmFsSW5kZXg7CisgICAgICAgIGlmIChhdXRvIHJlc3VsdCA9IG1faXRl
cmF0b3IuZm9sbG93aW5nKHJlbGF0aXZlSW5kZXgpKSB7CisgICAgICAgICAgICBjbHVzdGVyTGVu
Z3RoID0gcmVzdWx0LnZhbHVlKCkgLSByZWxhdGl2ZUluZGV4OworICAgICAgICAgICAgVTE2X05F
WFQobV9jaGFyYWN0ZXJzLCByZWxhdGl2ZUluZGV4LCByZXN1bHQudmFsdWUoKSwgY2hhcmFjdGVy
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBhZHZhbmNlKHVuc2lnbmVkIGFkdmFu
Y2VMZW5ndGgpCisgICAgeworICAgICAgICBtX2N1cnJlbnRJbmRleCArPSBhZHZhbmNlTGVuZ3Ro
OworICAgIH0KKworICAgIHVuc2lnbmVkIGN1cnJlbnRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1f
Y3VycmVudEluZGV4OyB9CisKK3ByaXZhdGU6CisgICAgQ2FjaGVkVGV4dEJyZWFrSXRlcmF0b3Ig
bV9pdGVyYXRvcjsKKyAgICBjb25zdCBVQ2hhciogbV9jaGFyYWN0ZXJzOworICAgIHVuc2lnbmVk
IG1fb3JpZ2luYWxJbmRleCB7IDAgfTsKKyAgICB1bnNpZ25lZCBtX2N1cnJlbnRJbmRleCB7IDAg
fTsKKyAgICB1bnNpZ25lZCBtX2xhc3RJbmRleCB7IDAgfTsKK307CisKK30KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1dpZHRoSXRlcmF0b3IuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5jcHAKaW5kZXggZGU0
YWVkZjg3MjMwZTNiMDExYThhZGY4ZTBlOWE2MDIxODNiZWIwMy4uMjU3NzkyZDNiNjU5ODEzNDY4
Nzc2M2M1NTBkMzg5OTkyMzhhOTEwYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRl
ICJXaWR0aEl0ZXJhdG9yLmgiCiAKICNpbmNsdWRlICJDaGFyYWN0ZXJQcm9wZXJ0aWVzLmgiCisj
aW5jbHVkZSAiQ29tcG9zZWRDaGFyYWN0ZXJDbHVzdGVyVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVk
ZSAiRm9udC5oIgogI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCiAjaW5jbHVkZSAiR2x5cGhCdWZm
ZXIuaCIKQEAgLTY1Nyw3ICs2NTgsMTEgQEAgdm9pZCBXaWR0aEl0ZXJhdG9yOjphZHZhbmNlKHVu
c2lnbmVkIG9mZnNldCwgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyKQogICAgICAgICBMYXRpbjFU
ZXh0SXRlcmF0b3IgdGV4dEl0ZXJhdG9yKG1fcnVuLmRhdGE4KG1fY3VycmVudENoYXJhY3Rlcklu
ZGV4KSwgbV9jdXJyZW50Q2hhcmFjdGVySW5kZXgsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAg
YWR2YW5jZUludGVybmFsKHRleHRJdGVyYXRvciwgZ2x5cGhCdWZmZXIpOwogICAgIH0gZWxzZSB7
CisjaWYgVVNFKENMVVNURVJfQVdBUkVfV0lEVEhfSVRFUkFUT1IpCisgICAgICAgIENvbXBvc2Vk
Q2hhcmFjdGVyQ2x1c3RlclRleHRJdGVyYXRvciB0ZXh0SXRlcmF0b3IobV9ydW4uZGF0YTE2KG1f
Y3VycmVudENoYXJhY3RlckluZGV4KSwgbV9jdXJyZW50Q2hhcmFjdGVySW5kZXgsIG9mZnNldCwg
bGVuZ3RoKTsKKyNlbHNlCiAgICAgICAgIFN1cnJvZ2F0ZVBhaXJBd2FyZVRleHRJdGVyYXRvciB0
ZXh0SXRlcmF0b3IobV9ydW4uZGF0YTE2KG1fY3VycmVudENoYXJhY3RlckluZGV4KSwgbV9jdXJy
ZW50Q2hhcmFjdGVySW5kZXgsIG9mZnNldCwgbGVuZ3RoKTsKKyNlbmRpZgogICAgICAgICBhZHZh
bmNlSW50ZXJuYWwodGV4dEl0ZXJhdG9yLCBnbHlwaEJ1ZmZlcik7CiAgICAgfQogCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>