<?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>86703</bug_id>
          
          <creation_ts>2012-05-16 21:52:30 -0700</creation_ts>
          <short_desc>[CSS3 Backgrounds and Borders] Refactor background-position parsing code for 2 values</short_desc>
          <delta_ts>2012-11-13 10:24:58 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>79073</blocked>
    
    <blocked>37514</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Uday Kiran">udaykiran4u</reporter>
          <assigned_to name="Uday Kiran">udaykiran4u</assigned_to>
          <cc>bugzilla</cc>
    
    <cc>jchaffraix</cc>
    
    <cc>macpherson</cc>
    
    <cc>menard</cc>
    
    <cc>shanestephens</cc>
    
    <cc>syoichi</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>626244</commentid>
    <comment_count>0</comment_count>
    <who name="Uday Kiran">udaykiran4u</who>
    <bug_when>2012-05-16 21:52:30 -0700</bug_when>
    <thetext>rewrite the background-position parsing code for two values in such a way as to later extend it to support three and four values.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>626258</commentid>
    <comment_count>1</comment_count>
      <attachid>142412</attachid>
    <who name="Uday Kiran">udaykiran4u</who>
    <bug_when>2012-05-16 22:14:12 -0700</bug_when>
    <thetext>Created attachment 142412
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>627299</commentid>
    <comment_count>2</comment_count>
      <attachid>142412</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2012-05-17 20:59:23 -0700</bug_when>
    <thetext>Comment on attachment 142412
Patch

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

A global comment: it&apos;s really painful that you just forked the whole code here. Our current algorithm implements the CSS 2.1 version of it (see bug 47159). As CSS 3 should be backward compatible, there should be ways to share as much code as possible. If your refactoring is to duplicate the code in this way, I really doubt this is the right approach. It would be better to evaluate which blocks already exist, extract those that can be shared and try to build on top of them / extend them keeping the 2 code paths (old vs new grammars).

&gt; Source/WebCore/ChangeLog:13
&gt; +        Covered by existing test fast/backgrounds/background-position-parsing.html.

I am really not convinced the new code is equivalent even if you seem to be thinking it is.

&gt; Source/WebCore/css/CSSParser.cpp:3267
&gt; +static PassRefPtr&lt;CSSPrimitiveValue&gt; createBackgroundPosition(PassRefPtr&lt;CSSPrimitiveValue&gt; position)

This code already exists in parseFillPositionX, it also supported &lt;length | percent&gt;.

Note sure why I don&apos;t see the equivalent code for bottom / center / top.

&gt; Source/WebCore/css/CSSParser.cpp:3302
&gt; +        value = valueList-&gt;next();

You should just break if !value instead of NULL-checking all the way.

&gt; Source/WebCore/css/CSSParser.cpp:3305
&gt; +        if (value &amp;&amp; value-&gt;unit == CSSParserValue::Operator &amp;&amp; value-&gt;iValue == &apos;,&apos;)

You can use isComma here.

&gt; Source/WebCore/css/CSSParser.cpp:3312
&gt; +    case 2:

I don&apos;t really understand why you picked up a switch - case. A very simple state machine (see the previous code) was a better design and for 4 values shouldn&apos;t be too complicated to implement.

Here you end up with some massive switch that will likely increase as you implement more of the syntax.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>627440</commentid>
    <comment_count>3</comment_count>
    <who name="Uday Kiran">udaykiran4u</who>
    <bug_when>2012-05-18 00:52:14 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 142412 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=142412&amp;action=review
&gt; 
&gt; A global comment: it&apos;s really painful that you just forked the whole code here. Our current algorithm implements the CSS 2.1 version of it (see bug 47159). As CSS 3 should be backward compatible, there should be ways to share as much code as possible. If your refactoring is to duplicate the code in this way, I really doubt this is the right approach. It would be better to evaluate which blocks already exist, extract those that can be shared and try to build on top of them / extend them keeping the 2 code paths (old vs new grammars).

Thank you for reviewing.

Considering that my patches should be small for easier review, I thought of doing this in following approach.

1. Existing parsing function parseFillPosition is shared by background-position, -webkit-mask-position, -transform-origin, -prespective-origin and -radial-gradient. So consider one property at time.
2. Change code path just for background-position without affecting other properties. Start with background-position for two values in a patch.
3. Extend background-position to four values in another bug.
4. Make other properties -webkit-mask-position, -transform-origin, -prespective-origin and -radial-gradient to use newly implemented parsing code as to do code sharing.
   Each property will be in a separate bug and tested one at time.
5. Remove the duplicate code after all properties are parsed using newly implemented function.

Rendering code for two values already exists and &lt;position&gt; property with four values can be reduced to two values. One special case for which rendering support needs to be added is when offset in pixels from right or bottom is specified which only is case when three or four values are specified.

The patch uploaded is step2.

I couldn&apos;t think of alternate approach where it could be done without touching multiple CSS properties at same time.

I had given a thought of implementing the parsing code as a state machine but I thought code readability by using switch case for four values would be simpler to read and easier to understand and relate to specification. 

Also -webkit-position, -transform-origin and -perspective-origin take only two values in position and not four. So it would just be one of cases of switch statement.
I doubt if code size with state machine approach for four values will be much smaller than switch. I will give it another try. :)

I will upload patch addressing review comments in patch if the above approach is fine.

&gt; 
&gt; &gt; Source/WebCore/ChangeLog:13
&gt; &gt; +        Covered by existing test fast/backgrounds/background-position-parsing.html.
&gt; 
&gt; I am really not convinced the new code is equivalent even if you seem to be thinking it is.

This test covers the rendering part.
Sorry, I should have mentioned other testcases where getComputedStyle is covered.
fast/css/getComputedStyle/getComputedStyle-background-position.html
fast/backgrounds/multiple-backgrounds-computed-style.html
and from CSS2.1 test suite
css2.1/t140201-c536-bgpos-00-b-ag.html
css3/calc/background-position-parsing.html which tests calc values in position.
I will add these also in Changelog. Am I missing any other test? I would be glad to write those tests.

If you think new parsing code is different from existing parsing code, can you please elaborate where I might have gone wrong?

&gt; 
&gt; &gt; Source/WebCore/css/CSSParser.cpp:3267
&gt; &gt; +static PassRefPtr&lt;CSSPrimitiveValue&gt; createBackgroundPosition(PassRefPtr&lt;CSSPrimitiveValue&gt; position)
&gt; 
&gt; This code already exists in parseFillPositionX, it also supported &lt;length | percent&gt;.
&gt; 
&gt; Note sure why I don&apos;t see the equivalent code for bottom / center / top.

parseFillPositionX only handles values on X coordinate. equivalent code for bottom / center / top is in parseFillPositionY.
To use these function first we need to determine on which axis in position and then call parseFillPositionX/Y 
which again checks for identifier. I don&apos;t think that would be good.

&gt; 
&gt; &gt; Source/WebCore/css/CSSParser.cpp:3302
&gt; &gt; +        value = valueList-&gt;next();
&gt; 
&gt; You should just break if !value instead of NULL-checking all the way.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/css/CSSParser.cpp:3305
&gt; &gt; +        if (value &amp;&amp; value-&gt;unit == CSSParserValue::Operator &amp;&amp; value-&gt;iValue == &apos;,&apos;)
&gt; 
&gt; You can use isComma here.
&gt;
Fixed.
 
&gt; &gt; Source/WebCore/css/CSSParser.cpp:3312
&gt; &gt; +    case 2:
&gt; 
&gt; I don&apos;t really understand why you picked up a switch - case. A very simple state machine (see the previous code) was a better design and for 4 values shouldn&apos;t be too complicated to implement.
&gt; 
&gt; Here you end up with some massive switch that will likely increase as you implement more of the syntax.

See global comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>627551</commentid>
    <comment_count>4</comment_count>
      <attachid>142412</attachid>
    <who name="Uday Kiran">udaykiran4u</who>
    <bug_when>2012-05-18 04:13:37 -0700</bug_when>
    <thetext>Comment on attachment 142412
Patch

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

&gt;&gt;&gt; Source/WebCore/css/CSSParser.cpp:3312
&gt;&gt;&gt; +    case 2:
&gt;&gt; 
&gt;&gt; I don&apos;t really understand why you picked up a switch - case. A very simple state machine (see the previous code) was a better design and for 4 values shouldn&apos;t be too complicated to implement.
&gt;&gt; 
&gt;&gt; Here you end up with some massive switch that will likely increase as you implement more of the syntax.
&gt; 
&gt; See global comment.

If you see a draft patch from bug 37514 (https://bugs.webkit.org/attachment.cgi?id=138085&amp;action=review) which I had uploaded, it implements case values 3 and 4.
It is not much code since we need to consider only few cases as offset must be preceded by keyword.
1. keyword offset keyword offset for four values. 
2. keyword keyword offset, keyword offset keyword for three values.
We just need to validate this order. 
It is a little bit different with two values. &apos;50% left&apos; or &apos;top 50%&apos; are invalid and hence case 2: code is little bigger.

One doubt about Vector&lt;RefPtr&lt;CSSPrimitiveValue&gt; &gt; values, is values.clear() call required?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>635340</commentid>
    <comment_count>5</comment_count>
    <who name="Alexis Menard (darktears)">menard</who>
    <bug_when>2012-05-28 11:41:12 -0700</bug_when>
    <thetext>*** Bug 87673 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>645248</commentid>
    <comment_count>6</comment_count>
    <who name="Uday Kiran">udaykiran4u</who>
    <bug_when>2012-06-08 23:09:32 -0700</bug_when>
    <thetext>Hi Julien,

I tried implementing background-position with 3-4 values with state machine logic like existing code but there are too many ambiguous states while parsing position values since possible ways of specifying position is much higher. We can see that by constructing state machine.
It becomes more complex as background-position, radial-gradient take maximum of 4 values and -webkit-mask-position, -transform-origin, -prespective-origin take only two values.

Implementing using switch case is much simpler and easier to read code.
If you think switch case logic doesn&apos;t cover some code path or if missing some tests, can you please elaborate? I will be glad to fix it.

Main concern here seems to be step 2 in comment #3, without that I am not sure how we can implement this feature in small patches as any modifications to existing parsing function needs testing for all properties, background-position, -webkit-mask-position, -transform-origin, -prespective-origin and -radial-gradient, making the patch larger.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765765</commentid>
    <comment_count>7</comment_count>
    <who name="Alexis Menard (darktears)">menard</who>
    <bug_when>2012-11-13 10:24:58 -0800</bug_when>
    <thetext>I&apos;m closing it since the patch of https://bugs.webkit.org/show_bug.cgi?id=102104 implements the new feature on top of the old two values parsing code.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>142412</attachid>
            <date>2012-05-16 22:14:12 -0700</date>
            <delta_ts>2012-05-18 04:13:37 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-86703-20120517104218.patch</filename>
            <type>text/plain</type>
            <size>9116</size>
            <attacher name="Uday Kiran">udaykiran4u</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTE3MzkyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjc5MmQyZmE0ZDZhYjE5
YTkxNzdjODlkN2UwOTUxNzZhNzM5M2QzNi4uOWU5ZWIxNTk0NzFmYWMzMDkyYzNmOWIxZTkzMGNm
NWVjYzgzYjJjMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMxIEBACisyMDEyLTA1LTE2ICBVZGF5
IEtpcmFuICA8dWRheWtpcmFuQG1vdG9yb2xhLmNvbT4KKworICAgICAgICBSZWZhY3RvciBwYXJz
aW5nIGNvZGUgZm9yIGJhY2tncm91bmQtcG9zaXRpb24gd2l0aCB0d28gb2Zmc2V0cy4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg2NzAzCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hhbmdlZCBwYXJzaW5n
IGNvZGUgb2YgYmFja2dyb3VuZC1wb3NpdGlvbiBwYXJzaW5nIHdpdGggdHdvIG9mZnNldHMgc28g
dGhhdAorICAgICAgICBpdCBjYW4gYmUgbGF0ZXIgZXh0ZW5kIHRvIHN1cHBvcnQgdGhyZWUgYW5k
IGZvdXIgb2Zmc2V0cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTM3NTE0IHRyYWNrcyBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlZSBhbmQgZm91ciBvZmZz
ZXRzLgorICAgICAgICBUaGlzIHBhdGNoIGNoYW5nZXMgcGFyc2luZyBjb2RlIG9ubHkgZm9yIHR3
byB2YWx1ZXMgZm9yIHdoaWNoIHJlbmRlcmluZyBzdXBwb3J0IGFscmVhZHkgZXhpc3RzLgorCisg
ICAgICAgIENvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdCBmYXN0L2JhY2tncm91bmRzL2JhY2tncm91
bmQtcG9zaXRpb24tcGFyc2luZy5odG1sLgorCisgICAgICAgICogY3NzL0NTU1BhcnNlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjppc0JhY2tncm91bmRLZXl3b3JkWCk6CisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmlzQmFja2dyb3VuZEtleXdvcmRZKToKKyAgICAgICAg
KFdlYkNvcmU6OmlzQmFja2dyb3VuZEtleXdvcmRDZW50ZXIpOgorICAgICAgICAoV2ViQ29yZTo6
aXNCYWNrZ3JvdW5kS2V5d29yZCk6CisgICAgICAgIChXZWJDb3JlOjppc0JhY2tncm91bmRLZXl3
b3JkT25TYW1lQXhpcyk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVCYWNrZ3JvdW5kUG9zaXRp
b24pOiBDcmVhdGUgdmFsdWUgZnJvbSBrZXl3b3JkIGxlZnQvdG9wIC0gMCUsIGNlbnRlciAtIDUw
JSwgcmlnaHQvYm90dG9tIC0gMTAwJS4KKyAgICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlcjo6cGFy
c2VGaWxsUG9zaXRpb25Db21wb25lbnQpOiBQYXJzZSB2YWx1ZSBmb3Iga2V5d29yZC9vZmZzZXQu
CisgICAgICAgIChXZWJDb3JlOjpDU1NQYXJzZXI6OnBhcnNlRmlsbFBvc2l0aW9uWFkpOiBQYXJz
ZXMgdmFsdWVMaXN0IGZvciB4IGFuZCB5IHBvc2l0aW9uLgorICAgICAgICBJdCBvbmx5IHN1cHBv
cnRzIG1heGltdW0gb2YgdHdvIHZhbHVlcyBhbmQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQuCisgICAg
ICAgIChXZWJDb3JlOjpDU1NQYXJzZXI6OnBhcnNlRmlsbFByb3BlcnR5KToKKyAgICAgICAgKiBj
c3MvQ1NTUGFyc2VyLmg6CisKIDIwMTItMDUtMTYgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtp
dC5vcmc+CiAKICAgICAgICAgTW92aW5nIGNhcmV0IHVwIG9yIGRvd24gc2tpcHMgbGluZXMgd2hl
biB0aGVyZSdzIGEgbm9uLWVkaXRhYmxlIGxpbmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2Nzcy9DU1NQYXJzZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlci5jcHAKaW5k
ZXggODE3ZDNmNDUzNGMyNTU4Y2IzOTMzYzM5MzU1NGZlMTM2ZGJlNDE3Ny4uZjJlNmMyMjQ4NDRj
OTA5ZTg5NzQ2Yzk5MjIxZjUxNGFhYTJkZmNjMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
Y3NzL0NTU1BhcnNlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU1BhcnNlci5jcHAK
QEAgLTMyMjcsNiArMzIyNywxNDYgQEAgUGFzc1JlZlB0cjxDU1NWYWx1ZT4gQ1NTUGFyc2VyOjpw
YXJzZUZpbGxQb3NpdGlvblkoQ1NTUGFyc2VyVmFsdWVMaXN0KiB2YWx1ZUxpc3QKICAgICByZXR1
cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgaXNCYWNrZ3JvdW5kS2V5d29yZFgoQ1NTUHJpbWl0aXZl
VmFsdWUqIHZhbHVlKQoreworICAgIGlmICghdmFsdWUtPmlzSWRlbnQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaW50IGlkID0gdmFsdWUtPmdldElkZW50KCk7CisgICAgcmV0dXJu
IGlkID09IENTU1ZhbHVlTGVmdCB8fCBpZCA9PSBDU1NWYWx1ZVJpZ2h0OworfQorCitzdGF0aWMg
Ym9vbCBpc0JhY2tncm91bmRLZXl3b3JkWShDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUpCit7Cisg
ICAgaWYgKCF2YWx1ZS0+aXNJZGVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
bnQgaWQgPSB2YWx1ZS0+Z2V0SWRlbnQoKTsKKyAgICByZXR1cm4gaWQgPT0gQ1NTVmFsdWVUb3Ag
fHwgaWQgPT0gQ1NTVmFsdWVCb3R0b207Cit9CisKK3N0YXRpYyBib29sIGlzQmFja2dyb3VuZEtl
eXdvcmRDZW50ZXIoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlKQoreworICAgIGlmICghdmFsdWUt
PmlzSWRlbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlQ2VudGVyOworfQorCitzdGF0aWMgYm9vbCBpc0JhY2tncm91
bmRLZXl3b3JkKENTU1ByaW1pdGl2ZVZhbHVlKiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gaXNCYWNr
Z3JvdW5kS2V5d29yZFgodmFsdWUpIHx8IGlzQmFja2dyb3VuZEtleXdvcmRZKHZhbHVlKSB8fCBp
c0JhY2tncm91bmRLZXl3b3JkQ2VudGVyKHZhbHVlKTsKK30KKworc3RhdGljIGJvb2wgaXNCYWNr
Z3JvdW5kS2V5d29yZE9uU2FtZUF4aXMoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlMSwgQ1NTUHJp
bWl0aXZlVmFsdWUqIHZhbHVlMikKK3sKKyAgICByZXR1cm4gKGlzQmFja2dyb3VuZEtleXdvcmRY
KHZhbHVlMSkgJiYgaXNCYWNrZ3JvdW5kS2V5d29yZFgodmFsdWUyKSkKKyAgICAgICAgfHwgKGlz
QmFja2dyb3VuZEtleXdvcmRZKHZhbHVlMSkgJiYgaXNCYWNrZ3JvdW5kS2V5d29yZFkodmFsdWUy
KSk7Cit9CisKK3N0YXRpYyBQYXNzUmVmUHRyPENTU1ByaW1pdGl2ZVZhbHVlPiBjcmVhdGVCYWNr
Z3JvdW5kUG9zaXRpb24oUGFzc1JlZlB0cjxDU1NQcmltaXRpdmVWYWx1ZT4gcG9zaXRpb24pCit7
CisgICAgaWYgKCFwb3NpdGlvbi0+aXNJZGVudCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IGludCBwZXJjZW50ID0gMDsKKyAgICBpbnQgaWQgPSBwb3NpdGlvbi0+Z2V0SWRlbnQoKTsKKyAg
ICBpZiAoaWQgPT0gQ1NTVmFsdWVSaWdodCB8fCBpZCA9PSBDU1NWYWx1ZUJvdHRvbSkKKyAgICAg
ICAgcGVyY2VudCA9IDEwMDsKKyAgICBlbHNlIGlmIChpZCA9PSBDU1NWYWx1ZUNlbnRlcikKKyAg
ICAgICAgcGVyY2VudCA9IDUwOworICAgIHJldHVybiBjc3NWYWx1ZVBvb2woKS5jcmVhdGVWYWx1
ZShwZXJjZW50LCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BFUkNFTlRBR0UpOworfQorCitQYXNz
UmVmUHRyPENTU1ByaW1pdGl2ZVZhbHVlPiBDU1NQYXJzZXI6OnBhcnNlRmlsbFBvc2l0aW9uQ29t
cG9uZW50KENTU1BhcnNlclZhbHVlTGlzdCogdmFsdWVMaXN0KQoreworICAgIGlmICh2YWx1ZUxp
c3QtPmN1cnJlbnQoKSkgeworICAgICAgICBpbnQgaWQgPSB2YWx1ZUxpc3QtPmN1cnJlbnQoKS0+
aWQ7CisKKyAgICAgICAgaWYgKGlkID09IENTU1ZhbHVlTGVmdCB8fCBpZCA9PSBDU1NWYWx1ZVRv
cCB8fCBpZCA9PSBDU1NWYWx1ZVJpZ2h0IHx8IGlkID09IENTU1ZhbHVlQm90dG9tIHx8IGlkID09
IENTU1ZhbHVlQ2VudGVyKQorICAgICAgICAgICAgcmV0dXJuIGNzc1ZhbHVlUG9vbCgpLmNyZWF0
ZUlkZW50aWZpZXJWYWx1ZShpZCk7CisKKyAgICAgICAgaWYgKHZhbGlkVW5pdCh2YWx1ZUxpc3Qt
PmN1cnJlbnQoKSwgRlBlcmNlbnQgfCBGTGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiBjcmVh
dGVQcmltaXRpdmVOdW1lcmljVmFsdWUodmFsdWVMaXN0LT5jdXJyZW50KCkpOworICAgIH0KKyAg
ICByZXR1cm4gMDsKK30KKwordm9pZCBDU1NQYXJzZXI6OnBhcnNlRmlsbFBvc2l0aW9uWFkoQ1NT
UGFyc2VyVmFsdWVMaXN0KiB2YWx1ZUxpc3QsIFJlZlB0cjxDU1NWYWx1ZT4mIHZhbHVlMSwgUmVm
UHRyPENTU1ZhbHVlPiYgdmFsdWUyKQoreworICAgIFZlY3RvcjxSZWZQdHI8Q1NTUHJpbWl0aXZl
VmFsdWU+ID4gdmFsdWVzOworICAgIENTU1BhcnNlclZhbHVlKiB2YWx1ZSA9IHZhbHVlTGlzdC0+
Y3VycmVudCgpOworICAgIFJlZlB0cjxDU1NQcmltaXRpdmVWYWx1ZT4gcHJpbWl0aXZlVmFsdWUg
PSBwYXJzZUZpbGxQb3NpdGlvbkNvbXBvbmVudCh2YWx1ZUxpc3QpOworICAgIHdoaWxlICh2YWx1
ZSAmJiBwcmltaXRpdmVWYWx1ZSkgeworICAgICAgICB2YWx1ZXMuYXBwZW5kKHByaW1pdGl2ZVZh
bHVlKTsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZUxpc3QtPm5leHQoKTsKKworICAgICAgICAvLyBG
aXJzdCBjaGVjayBmb3IgdGhlIGNvbW1hLiBJZiBzbywgd2UgYXJlIGZpbmlzaGVkIHBhcnNpbmcg
dGhpcyB2YWx1ZSBvciB2YWx1ZSBwYWlyLgorICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUtPnVu
aXQgPT0gQ1NTUGFyc2VyVmFsdWU6Ok9wZXJhdG9yICYmIHZhbHVlLT5pVmFsdWUgPT0gJywnKQor
ICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICBw
cmltaXRpdmVWYWx1ZSA9IHBhcnNlRmlsbFBvc2l0aW9uQ29tcG9uZW50KHZhbHVlTGlzdCk7Cisg
ICAgfQorCisgICAgc3dpdGNoICh2YWx1ZXMuc2l6ZSgpKSB7CisgICAgY2FzZSAyOgorICAgICAg
ICBpZiAoaXNCYWNrZ3JvdW5kS2V5d29yZCh2YWx1ZXNbMF0uZ2V0KCkpICYmIGlzQmFja2dyb3Vu
ZEtleXdvcmQodmFsdWVzWzFdLmdldCgpKSkgeworICAgICAgICAgICAgLy8ga2V5d29yZCBrZXl3
b3JkCisgICAgICAgICAgICBpZiAoaXNCYWNrZ3JvdW5kS2V5d29yZE9uU2FtZUF4aXModmFsdWVz
WzBdLmdldCgpLCB2YWx1ZXNbMV0uZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLmNs
ZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgdmFsdWUxID0gY3JlYXRlQmFja2dyb3VuZFBvc2l0aW9uKHZhbHVlc1swXSk7CisgICAgICAg
ICAgICB2YWx1ZTIgPSBjcmVhdGVCYWNrZ3JvdW5kUG9zaXRpb24odmFsdWVzWzFdKTsKKworICAg
ICAgICAgICAgLy8gdmFsdWUxIG11c3QgY29udGFpbiB4LW9mZnNldCBhbmQgdmFsdWUyIG11c3Qg
Y29udGFpbiB5LW9mZnNldAorICAgICAgICAgICAgaWYgKGlzQmFja2dyb3VuZEtleXdvcmRZKHZh
bHVlc1swXS5nZXQoKSkgfHwgaXNCYWNrZ3JvdW5kS2V5d29yZFgodmFsdWVzWzFdLmdldCgpKSkK
KyAgICAgICAgICAgICAgICB2YWx1ZTEuc3dhcCh2YWx1ZTIpOworICAgICAgICB9IGVsc2UgaWYg
KGlzQmFja2dyb3VuZEtleXdvcmQodmFsdWVzWzBdLmdldCgpKSAmJiAhaXNCYWNrZ3JvdW5kS2V5
d29yZCh2YWx1ZXNbMV0uZ2V0KCkpKSB7CisgICAgICAgICAgICAvLyBrZXl3b3JkIG9mZnNldAor
ICAgICAgICAgICAgaWYgKGlzQmFja2dyb3VuZEtleXdvcmRZKHZhbHVlc1swXS5nZXQoKSkpIHsK
KyAgICAgICAgICAgICAgICAvLyB0b3AgMTVweCBpcyBpbnZhbGlkIGFjY29yZGluZyB0byBzcGVj
aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgdmFsdWVzLmNsZWFyKCk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUxID0gY3JlYXRlQmFj
a2dyb3VuZFBvc2l0aW9uKHZhbHVlc1swXSk7CisgICAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZXNb
MV07CisgICAgICAgIH0gZWxzZSBpZiAoIWlzQmFja2dyb3VuZEtleXdvcmQodmFsdWVzWzBdLmdl
dCgpKSAmJiBpc0JhY2tncm91bmRLZXl3b3JkKHZhbHVlc1sxXS5nZXQoKSkpIHsKKyAgICAgICAg
ICAgIC8vIG9mZnNldCBrZXl3b3JkCisgICAgICAgICAgICBpZiAoaXNCYWNrZ3JvdW5kS2V5d29y
ZFgodmFsdWVzWzFdLmdldCgpKSkgeworICAgICAgICAgICAgICAgIC8vIDE1cHggbGVmdCBpcyBp
bnZhbGlkIGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgdmFsdWVz
LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgdmFsdWUxID0gdmFsdWVzWzBdOworICAgICAgICAgICAgdmFsdWUyID0gY3JlYXRlQmFj
a2dyb3VuZFBvc2l0aW9uKHZhbHVlc1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAvLyBvZmZzZXQgb2Zmc2V0CisgICAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZXNbMF07CisgICAg
ICAgICAgICB2YWx1ZTIgPSB2YWx1ZXNbMV07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSAxOgorICAgICAgICAvLyBPbmx5IG9uZSB2YWx1ZSB3YXMgc3BlY2lmaWVkLiBJZiB0
aGF0IHZhbHVlIHdhcyBub3QgYSBrZXl3b3JkLCB0aGVuIGl0IHNldHMgdGhlIHggcG9zaXRpb24s
IGFuZCB0aGUgeSBwb3NpdGlvbgorICAgICAgICAvLyBpcyBzaW1wbHkgNTAlLiBUaGlzIGlzIG91
ciBkZWZhdWx0LgorICAgICAgICAvLyBGb3Iga2V5d29yZHMsIHRoZSBrZXl3b3JkIHdhcyBlaXRo
ZXIgYW4geC1rZXl3b3JkIChsZWZ0L3JpZ2h0KSwgYSB5LWtleXdvcmQgKHRvcC9ib3R0b20pLCBv
ciBhbiBhbWJpZ3VvdXMga2V5d29yZCAoY2VudGVyKS4KKyAgICAgICAgLy8gRm9yIGxlZnQvcmln
aHQvY2VudGVyLCB0aGUgZGVmYXVsdCBvZiA1MCUgaW4gdGhlIHkgaXMgc3RpbGwgY29ycmVjdC4K
KyAgICAgICAgdmFsdWUyID0gY3NzVmFsdWVQb29sKCkuY3JlYXRlVmFsdWUoNTAsIENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfUEVSQ0VOVEFHRSk7CisgICAgICAgIGlmIChpc0JhY2tncm91bmRLZXl3
b3JkKHZhbHVlc1swXS5nZXQoKSkpCisgICAgICAgICAgICB2YWx1ZTEgPSBjcmVhdGVCYWNrZ3Jv
dW5kUG9zaXRpb24odmFsdWVzWzBdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUx
ID0gdmFsdWVzWzBdOworCisgICAgICAgIC8vIHZhbHVlMSBtdXN0IGNvbnRhaW4geC1vZmZzZXQg
YW5kIHZhbHVlMiBtdXN0IGNvbnRhaW4geS1vZmZzZXQKKyAgICAgICAgaWYgKGlzQmFja2dyb3Vu
ZEtleXdvcmRZKHZhbHVlc1swXS5nZXQoKSkpCisgICAgICAgICAgICB2YWx1ZTEuc3dhcCh2YWx1
ZTIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB2YWx1ZXMuY2xlYXIo
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogUGFzc1JlZlB0cjxDU1NWYWx1ZT4gQ1NT
UGFyc2VyOjpwYXJzZUZpbGxQb3NpdGlvbkNvbXBvbmVudChDU1NQYXJzZXJWYWx1ZUxpc3QqIHZh
bHVlTGlzdCwgdW5zaWduZWQmIGN1bXVsYXRpdmVGbGFncywgRmlsbFBvc2l0aW9uRmxhZyYgaW5k
aXZpZHVhbEZsYWcpCiB7CiAgICAgaW50IGlkID0gdmFsdWVMaXN0LT5jdXJyZW50KCktPmlkOwpA
QCAtMzQ3OCw2ICszNjE4LDkgQEAgYm9vbCBDU1NQYXJzZXI6OnBhcnNlRmlsbFByb3BlcnR5KENT
U1Byb3BlcnR5SUQgcHJvcElkLCBDU1NQcm9wZXJ0eUlEJiBwcm9wSWQxLAogICAgICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgIHBh
cnNlRmlsbFBvc2l0aW9uWFkobV92YWx1ZUxpc3QuZ2V0KCksIGN1cnJWYWx1ZSwgY3VyclZhbHVl
Mik7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlRmlsbFBvc2l0aW9uWFkgYWR2YW5jZXMg
dGhlIG1fdmFsdWVMaXN0IHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvbjoKICAgICAgICAg
ICAgICAgICAgICAgcGFyc2VGaWxsUG9zaXRpb24obV92YWx1ZUxpc3QuZ2V0KCksIGN1cnJWYWx1
ZSwgY3VyclZhbHVlMik7CiAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlRmlsbFBvc2l0aW9u
IGFkdmFuY2VzIHRoZSBtX3ZhbHVlTGlzdCBwb2ludGVyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9jc3MvQ1NTUGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTUGFyc2VyLmgKaW5k
ZXggMmM1YTI3YWI4OWNiMDUzM2Q5NDVkOTNmNWZmNTRkY2UyNjQ3OWVmZC4uZjA4ZmZlZmExMzUz
OTMzMGM5ZGJiNGViNmQzYmI3M2MzZjBmMDkyZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
Y3NzL0NTU1BhcnNlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYXJzZXIuaApAQCAt
MTAxLDYgKzEwMSw4IEBAIHB1YmxpYzoKICAgICBQYXNzUmVmUHRyPENTU1ZhbHVlPiBwYXJzZUZp
bGxQb3NpdGlvbkNvbXBvbmVudChDU1NQYXJzZXJWYWx1ZUxpc3QqLCB1bnNpZ25lZCYgY3VtdWxh
dGl2ZUZsYWdzLCBGaWxsUG9zaXRpb25GbGFnJiBpbmRpdmlkdWFsRmxhZyk7CiAgICAgUGFzc1Jl
ZlB0cjxDU1NWYWx1ZT4gcGFyc2VGaWxsUG9zaXRpb25YKENTU1BhcnNlclZhbHVlTGlzdCopOwog
ICAgIFBhc3NSZWZQdHI8Q1NTVmFsdWU+IHBhcnNlRmlsbFBvc2l0aW9uWShDU1NQYXJzZXJWYWx1
ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPENTU1ByaW1pdGl2ZVZhbHVlPiBwYXJzZUZpbGxQb3Np
dGlvbkNvbXBvbmVudChDU1NQYXJzZXJWYWx1ZUxpc3QqKTsKKyAgICB2b2lkIHBhcnNlRmlsbFBv
c2l0aW9uWFkoQ1NTUGFyc2VyVmFsdWVMaXN0KiwgUmVmUHRyPENTU1ZhbHVlPiYsIFJlZlB0cjxD
U1NWYWx1ZT4mKTsKICAgICB2b2lkIHBhcnNlRmlsbFBvc2l0aW9uKENTU1BhcnNlclZhbHVlTGlz
dCosIFJlZlB0cjxDU1NWYWx1ZT4mLCBSZWZQdHI8Q1NTVmFsdWU+Jik7CiAKICAgICB2b2lkIHBh
cnNlRmlsbFJlcGVhdChSZWZQdHI8Q1NTVmFsdWU+JiwgUmVmUHRyPENTU1ZhbHVlPiYpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>