<?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>19002</bug_id>
          
          <creation_ts>2008-05-11 20:50:27 -0700</creation_ts>
          <short_desc>Optimize id selectors in querySelector/querySelectorAll</short_desc>
          <delta_ts>2008-06-26 20:30:40 -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>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="David Smith">catfish.man</reporter>
          <assigned_to name="David Smith">catfish.man</assigned_to>
          <cc>rik</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>80153</commentid>
    <comment_count>0</comment_count>
    <who name="David Smith">catfish.man</who>
    <bug_when>2008-05-11 20:50:27 -0700</bug_when>
    <thetext>From irc:

othermaciej: Catfish_Man: I am belatedly reading the comments to http://webkit.org/blog/156/queryselector-and-queryselectorall/

I think we could in fact special-case ID selectors in querySelectorAll and querySelector

WebKit&apos;s internal ID cache not only caches the first match, but it also tracks whether there are multiple elements with that ID

I think it would be worth doing

So that a single uniform API can consistently give good performance</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84371</commentid>
    <comment_count>1</comment_count>
      <attachid>21927</attachid>
    <who name="David Smith">catfish.man</who>
    <bug_when>2008-06-25 03:14:45 -0700</bug_when>
    <thetext>Created attachment 21927
Initial patch

Needs additional tests to ensure correct behavior in the presence of multiple elements with the same ID, and I probably missed a few coding style things. Other than that it should be ready for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84449</commentid>
    <comment_count>2</comment_count>
      <attachid>21940</attachid>
    <who name="David Smith">catfish.man</who>
    <bug_when>2008-06-25 21:54:34 -0700</bug_when>
    <thetext>Created attachment 21940
Now with tests and less bugs</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84537</commentid>
    <comment_count>3</comment_count>
      <attachid>21940</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2008-06-26 19:33:29 -0700</bug_when>
    <thetext>Comment on attachment 21940
Now with tests and less bugs

Please include the speedup and on what test you tested it on.

You can probably put this with the other Id related methods (getElementById, and hasElementWithId).
+    bool containsMultipleElementsWithId(const AtomicString&amp; elementId) { return m_duplicateIds.contains(elementId.impl()); }

The parens around (querySelector-&gt;next()) are not needed.
+    if (!(querySelector-&gt;next()) &amp;&amp; querySelector-&gt;m_match == CSSSelector::Id) {

Here too.
+    if (!(querySelector-&gt;next()) &amp;&amp; querySelector-&gt;m_match == CSSSelector::Id &amp;&amp; !document-&gt;containsMultipleElementsWithId(selectorValue)) {

You can remove the else here and and just return 0.
+        if (element &amp;&amp; (isDocumentNode() || element-&gt;isDescendantOf(this)))
+            return element;
+    } else {
+        // FIXME: We can speed this up by implementing caching similar to the one use by getElementById


r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>84542</commentid>
    <comment_count>4</comment_count>
    <who name="David Smith">catfish.man</who>
    <bug_when>2008-06-26 20:30:40 -0700</bug_when>
    <thetext>r34823</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>21927</attachid>
            <date>2008-06-25 03:14:45 -0700</date>
            <delta_ts>2008-06-25 21:54:34 -0700</delta_ts>
            <desc>Initial patch</desc>
            <filename>qsaidoptimization1.txt</filename>
            <type>text/plain</type>
            <size>4314</size>
            <attacher name="David Smith">catfish.man</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzNDc5MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYgQEAKKzIwMDgtMDYtMjUgIERhdmlkIFNtaXRoICA8Y2F0ZmlzaC5tYW5AZ21h
aWwuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5MDAyCisg
ICAgICAgIAorICAgICAgICBPcHRpbWl6ZSBzaW1wbGUgaWQgc2VsZWN0b3JzIGluIHF1ZXJ5U2Vs
ZWN0b3IvcXVlcnlTZWxlY3RvckFsbAorCisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Tm9kZTo6cXVlcnlTZWxlY3Rvcik6CisgICAgICAgICogZG9tL1NlbGVjdG9y
Tm9kZUxpc3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlU2VsZWN0b3JOb2RlTGlzdCk6
CisKIDIwMDgtMDYtMjQgIEFub255bW91cwogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFk
bGVyLiAgQ29tbWl0dGVkIGJ5IEFkYW0gQmFydGguCkluZGV4OiBXZWJDb3JlL2RvbS9Eb2N1bWVu
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL0RvY3VtZW50LmgJKHJldmlzaW9uIDM0Nzkx
KQorKysgV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNzUxLDYgKzc1
MSw5IEBAIHB1YmxpYzoKICAgICAvLyBFeHRlbnNpb24gZm9yIG1hbmlwdWxhdGluZyBjYW52YXMg
ZHJhd2luZyBjb250ZXh0cyBmb3IgdXNlIGluIENTUwogICAgIENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQyRCogZ2V0Q1NTQ2FudmFzQ29udGV4dChjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICBIVE1MQ2FudmFzRWxlbWVudCog
Z2V0Q1NTQ2FudmFzRWxlbWVudChjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIAorICAgIC8vRGlm
ZmVycyBmcm9tIGdldEVsZW1lbnRCeUlkIGluIHRoYXQgaXQgZG9lc24ndCBoYW5kbGUgdGhlIGlu
dmFsaWQgY2FzZSBvZiBtdWx0aXBsZSBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGlkCisgICAgRWxl
bWVudCogZ2V0RWxlbWVudEJ5VW5pcXVlSWQoY29uc3QgQXRvbWljU3RyaW5nJiBlbGVtZW50SWQp
IHsgcmV0dXJuIG1fZWxlbWVudHNCeUlkLmdldChlbGVtZW50SWQuaW1wbCgpKTsgfQogCiBwcm90
ZWN0ZWQ6CiAgICAgRG9jdW1lbnQoRnJhbWUqLCBib29sIGlzWEhUTUwpOwpJbmRleDogV2ViQ29y
ZS9kb20vTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vTm9kZS5jcHAJKHJldmlz
aW9uIDM0NzkxKQorKysgV2ViQ29yZS9kb20vTm9kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEy
NTAsNiArMTI1MCwxMyBAQCBQYXNzUmVmUHRyPEVsZW1lbnQ+IE5vZGU6OnF1ZXJ5U2VsZWN0b3Io
CiAgICAgQ1NTU3R5bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihk
b2N1bWVudCgpLCAhZG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkpOwogICAgIENTU1NlbGVjdG9y
KiBxdWVyeVNlbGVjdG9yID0gc3RhdGljX2Nhc3Q8Q1NTU3R5bGVSdWxlKj4ocnVsZS5nZXQoKSkt
PnNlbGVjdG9yKCk7CiAgICAgCisgICAgaWYocXVlcnlTZWxlY3Rvci0+bmV4dCgpID09IE5VTEwg
JiYgcXVlcnlTZWxlY3Rvci0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6SWQpCisgICAgeworICAg
ICAgICBFbGVtZW50KiBlbGVtZW50ID0gZG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQocXVlcnlT
ZWxlY3Rvci0+bV92YWx1ZSk7CisgICAgICAgIGlmKGlzRG9jdW1lbnROb2RlKCkgfHwgZWxlbWVu
dC0+aXNEZXNjZW5kYW50T2YodGhpcykpCisgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAg
ICB9CisgICAgCiAgICAgLy8gRklYTUU6IFdlIGNhbiBzcGVlZCB0aGlzIHVwIGJ5IGltcGxlbWVu
dGluZyBjYWNoaW5nIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2UgYnkgZ2V0RWxlbWVudEJ5SWQKICAg
ICBmb3IgKE5vZGUqIG4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT50cmF2ZXJzZU5leHROb2Rl
KHRoaXMpKSB7CiAgICAgICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkpIHsKSW5kZXg6IFdlYkNv
cmUvZG9tL1NlbGVjdG9yTm9kZUxpc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL1Nl
bGVjdG9yTm9kZUxpc3QuY3BwCShyZXZpc2lvbiAzNDc5MSkKKysrIFdlYkNvcmUvZG9tL1NlbGVj
dG9yTm9kZUxpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCwxOCArNDAsMjkgQEAgUGFzc1Jl
ZlB0cjxTdGF0aWNOb2RlTGlzdD4gY3JlYXRlU2VsZWN0bwogewogICAgIFZlY3RvcjxSZWZQdHI8
Tm9kZT4gPiBub2RlczsKICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSByb290Tm9kZS0+ZG9jdW1l
bnQoKTsKLSAgICBDU1NTdHlsZVNlbGVjdG9yOjpTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVj
a2VyKGRvY3VtZW50LCAhZG9jdW1lbnQtPmluQ29tcGF0TW9kZSgpKTsKLSAgICBmb3IgKE5vZGUq
IG4gPSByb290Tm9kZS0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZShy
b290Tm9kZS5nZXQoKSkpIHsKLSAgICAgICAgaWYgKG4tPmlzRWxlbWVudE5vZGUoKSkgewotICAg
ICAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihuKTsKLSAg
ICAgICAgICAgIGZvciAoQ1NTU2VsZWN0b3IqIHNlbGVjdG9yID0gcXVlcnlTZWxlY3Rvcjsgc2Vs
ZWN0b3I7IHNlbGVjdG9yID0gc2VsZWN0b3ItPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlm
IChzZWxlY3RvckNoZWNrZXIuY2hlY2tTZWxlY3RvcihzZWxlY3RvciwgZWxlbWVudCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kKG4pOwotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICBBdG9taWNTdHJpbmcgc2VsZWN0b3JWYWx1ZSA9IHF1ZXJ5U2VsZWN0b3ItPm1f
dmFsdWU7CisgICAgRWxlbWVudCogZWxlbWVudDsKKworICAgIGlmIChxdWVyeVNlbGVjdG9yLT5u
ZXh0KCkgPT0gTlVMTCAmJiBxdWVyeVNlbGVjdG9yLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpJ
ZCAmJiAoKGVsZW1lbnQgPSBkb2N1bWVudC0+Z2V0RWxlbWVudEJ5VW5pcXVlSWQoc2VsZWN0b3JW
YWx1ZSkpICE9IE5VTEwgfHwgKGVsZW1lbnQgPSBkb2N1bWVudC0+Z2V0RWxlbWVudEJ5SWQoc2Vs
ZWN0b3JWYWx1ZSkpID09IE5VTEwpKSB7CisgICAgICAgIGlmKHJvb3ROb2RlLT5pc0RvY3VtZW50
Tm9kZSgpIHx8IGVsZW1lbnQtPmlzRGVzY2VuZGFudE9mKHJvb3ROb2RlLmdldCgpKSkKKyAgICAg
ICAgICAgIG5vZGVzLmFwcGVuZChlbGVtZW50KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAg
IENTU1N0eWxlU2VsZWN0b3I6OlNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1l
bnQsICFkb2N1bWVudC0+aW5Db21wYXRNb2RlKCkpOworICAgICAgICAKKyAgICAgICAgZm9yIChO
b2RlKiBuID0gcm9vdE5vZGUtPmZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPnRyYXZlcnNlTmV4dE5v
ZGUocm9vdE5vZGUuZ2V0KCkpKSB7CisgICAgICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgp
KSB7CisgICAgICAgICAgICAgICAgZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihuKTsK
KyAgICAgICAgICAgICAgICBmb3IgKENTU1NlbGVjdG9yKiBzZWxlY3RvciA9IHF1ZXJ5U2VsZWN0
b3I7IHNlbGVjdG9yOyBzZWxlY3RvciA9IHNlbGVjdG9yLT5uZXh0KCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5jaGVja1NlbGVjdG9yKHNlbGVjdG9yLCBlbGVt
ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kKG4pOworICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgCiAgICAgcmV0
dXJuIFN0YXRpY05vZGVMaXN0OjphZG9wdChub2Rlcyk7CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>21940</attachid>
            <date>2008-06-25 21:54:34 -0700</date>
            <delta_ts>2008-06-26 19:33:29 -0700</delta_ts>
            <desc>Now with tests and less bugs</desc>
            <filename>qsaidoptimization2.txt</filename>
            <type>text/plain</type>
            <size>11431</size>
            <attacher name="David Smith">catfish.man</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzNDgwNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDgtMDYtMjUgIERhdmlkIFNtaXRoICA8Y2F0ZmlzaC5tYW5AZ21h
aWwuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5MDAyCisg
ICAgICAgIAorICAgICAgICBPcHRpbWl6ZSBzaW1wbGUgaWQgc2VsZWN0b3JzIGluIHF1ZXJ5U2Vs
ZWN0b3IvcXVlcnlTZWxlY3RvckFsbAorCisgICAgICAgICogZG9tL0RvY3VtZW50Lmg6CisgICAg
ICAgIChXZWJDb3JlOjpEb2N1bWVudDo6Y29udGFpbnNNdWx0aXBsZUVsZW1lbnRzV2l0aElkKTog
QWRkZWQgdG8gYWxsb3cgb3B0aW1pemluZyB0aGUgY29tbW9uIGNhc2Ugb2Ygbm8gZHVwbGljYXRl
cworICAgICAgICAqIGRvbS9Ob2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OnF1ZXJ5
U2VsZWN0b3IpOiBVc2VzIGdldEVsZW1lbnRCeUlkIGluc3RlYWQgb2YgRE9NIHRyYXZlcnNhbCB3
aGVyZSBwb3NzaWJsZSBub3cKKyAgICAgICAgKiBkb20vU2VsZWN0b3JOb2RlTGlzdC5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpjcmVhdGVTZWxlY3Rvck5vZGVMaXN0KTogVXNlcyBnZXRFbGVtZW50
QnlJZCBpbnN0ZWFkIG9mIERPTSB0cmF2ZXJzYWwgd2hlcmUgcG9zc2libGUgbm93CisKIDIwMDgt
MDYtMjUgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBi
eSBCcmFkeSBFaWRzb24uCkluZGV4OiBXZWJDb3JlL2RvbS9Eb2N1bWVudC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvZG9tL0RvY3VtZW50LmgJKHJldmlzaW9uIDM0ODA0KQorKysgV2ViQ29yZS9k
b20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNzUxLDYgKzc1MSw4IEBAIHB1YmxpYzoK
ICAgICAvLyBFeHRlbnNpb24gZm9yIG1hbmlwdWxhdGluZyBjYW52YXMgZHJhd2luZyBjb250ZXh0
cyBmb3IgdXNlIGluIENTUwogICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogZ2V0Q1NTQ2Fu
dmFzQ29udGV4dChjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IHdp
ZHRoLCBpbnQgaGVpZ2h0KTsKICAgICBIVE1MQ2FudmFzRWxlbWVudCogZ2V0Q1NTQ2FudmFzRWxl
bWVudChjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIAorICAgIGJvb2wgY29udGFpbnNNdWx0aXBs
ZUVsZW1lbnRzV2l0aElkKGNvbnN0IEF0b21pY1N0cmluZyYgZWxlbWVudElkKSB7IHJldHVybiBt
X2R1cGxpY2F0ZUlkcy5jb250YWlucyhlbGVtZW50SWQuaW1wbCgpKTsgfQogCiBwcm90ZWN0ZWQ6
CiAgICAgRG9jdW1lbnQoRnJhbWUqLCBib29sIGlzWEhUTUwpOwpJbmRleDogV2ViQ29yZS9kb20v
Tm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vTm9kZS5jcHAJKHJldmlzaW9uIDM0
ODA0KQorKysgV2ViQ29yZS9kb20vTm9kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyMzQsMTMg
KzEyMzQsMTkgQEAgUGFzc1JlZlB0cjxFbGVtZW50PiBOb2RlOjpxdWVyeVNlbGVjdG9yKAogICAg
IENTU1N0eWxlU2VsZWN0b3I6OlNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1l
bnQoKSwgIWRvY3VtZW50KCktPmluQ29tcGF0TW9kZSgpKTsKICAgICBDU1NTZWxlY3RvciogcXVl
cnlTZWxlY3RvciA9IHN0YXRpY19jYXN0PENTU1N0eWxlUnVsZSo+KHJ1bGUuZ2V0KCkpLT5zZWxl
Y3RvcigpOwogICAgIAotICAgIC8vIEZJWE1FOiBXZSBjYW4gc3BlZWQgdGhpcyB1cCBieSBpbXBs
ZW1lbnRpbmcgY2FjaGluZyBzaW1pbGFyIHRvIHRoZSBvbmUgdXNlIGJ5IGdldEVsZW1lbnRCeUlk
Ci0gICAgZm9yIChOb2RlKiBuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+dHJhdmVyc2VOZXh0
Tm9kZSh0aGlzKSkgewotICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgpKSB7Ci0gICAgICAg
ICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwotICAgICAg
ICAgICAgZm9yIChDU1NTZWxlY3Rvciogc2VsZWN0b3IgPSBxdWVyeVNlbGVjdG9yOyBzZWxlY3Rv
cjsgc2VsZWN0b3IgPSBzZWxlY3Rvci0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNl
bGVjdG9yQ2hlY2tlci5jaGVja1NlbGVjdG9yKHNlbGVjdG9yLCBlbGVtZW50KSkKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgaWYgKCEocXVlcnlTZWxlY3Rvci0+bmV4
dCgpKSAmJiBxdWVyeVNlbGVjdG9yLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpJZCkgeworICAg
ICAgICBFbGVtZW50KiBlbGVtZW50ID0gZG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQocXVlcnlT
ZWxlY3Rvci0+bV92YWx1ZSk7CisgICAgICAgIGlmIChlbGVtZW50ICYmIChpc0RvY3VtZW50Tm9k
ZSgpIHx8IGVsZW1lbnQtPmlzRGVzY2VuZGFudE9mKHRoaXMpKSkKKyAgICAgICAgICAgIHJldHVy
biBlbGVtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZJWE1FOiBXZSBjYW4gc3BlZWQg
dGhpcyB1cCBieSBpbXBsZW1lbnRpbmcgY2FjaGluZyBzaW1pbGFyIHRvIHRoZSBvbmUgdXNlIGJ5
IGdldEVsZW1lbnRCeUlkCisgICAgICAgIGZvciAoTm9kZSogbiA9IGZpcnN0Q2hpbGQoKTsgbjsg
biA9IG4tPnRyYXZlcnNlTmV4dE5vZGUodGhpcykpIHsKKyAgICAgICAgICAgIGlmIChuLT5pc0Vs
ZW1lbnROb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG4pOworICAgICAgICAgICAgICAgIGZvciAoQ1NTU2VsZWN0b3IqIHNl
bGVjdG9yID0gcXVlcnlTZWxlY3Rvcjsgc2VsZWN0b3I7IHNlbGVjdG9yID0gc2VsZWN0b3ItPm5l
eHQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JDaGVja2VyLmNoZWNrU2Vs
ZWN0b3Ioc2VsZWN0b3IsIGVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAg
ICAgfQpJbmRleDogV2ViQ29yZS9kb20vU2VsZWN0b3JOb2RlTGlzdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9kb20vU2VsZWN0b3JOb2RlTGlzdC5jcHAJKHJldmlzaW9uIDM0ODA0KQorKysg
V2ViQ29yZS9kb20vU2VsZWN0b3JOb2RlTGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDE4
ICs0MCwyOCBAQCBQYXNzUmVmUHRyPFN0YXRpY05vZGVMaXN0PiBjcmVhdGVTZWxlY3RvCiB7CiAg
ICAgVmVjdG9yPFJlZlB0cjxOb2RlPiA+IG5vZGVzOwogICAgIERvY3VtZW50KiBkb2N1bWVudCA9
IHJvb3ROb2RlLT5kb2N1bWVudCgpOwotICAgIENTU1N0eWxlU2VsZWN0b3I6OlNlbGVjdG9yQ2hl
Y2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQsICFkb2N1bWVudC0+aW5Db21wYXRNb2RlKCkp
OwotICAgIGZvciAoTm9kZSogbiA9IHJvb3ROb2RlLT5maXJzdENoaWxkKCk7IG47IG4gPSBuLT50
cmF2ZXJzZU5leHROb2RlKHJvb3ROb2RlLmdldCgpKSkgewotICAgICAgICBpZiAobi0+aXNFbGVt
ZW50Tm9kZSgpKSB7Ci0gICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8
RWxlbWVudCo+KG4pOwotICAgICAgICAgICAgZm9yIChDU1NTZWxlY3Rvciogc2VsZWN0b3IgPSBx
dWVyeVNlbGVjdG9yOyBzZWxlY3Rvcjsgc2VsZWN0b3IgPSBzZWxlY3Rvci0+bmV4dCgpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5jaGVja1NlbGVjdG9yKHNlbGVjdG9y
LCBlbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBub2Rlcy5hcHBlbmQobik7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgIEF0b21pY1N0cmluZyBzZWxlY3RvclZhbHVlID0g
cXVlcnlTZWxlY3Rvci0+bV92YWx1ZTsKKworICAgIGlmICghKHF1ZXJ5U2VsZWN0b3ItPm5leHQo
KSkgJiYgcXVlcnlTZWxlY3Rvci0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6SWQgJiYgIWRvY3Vt
ZW50LT5jb250YWluc011bHRpcGxlRWxlbWVudHNXaXRoSWQoc2VsZWN0b3JWYWx1ZSkpIHsKKyAg
ICAgICAgRWxlbWVudCogZWxlbWVudCA9IGRvY3VtZW50LT5nZXRFbGVtZW50QnlJZChzZWxlY3Rv
clZhbHVlKTsKKyAgICAgICAgaWYgKGVsZW1lbnQgJiYgKHJvb3ROb2RlLT5pc0RvY3VtZW50Tm9k
ZSgpIHx8IGVsZW1lbnQtPmlzRGVzY2VuZGFudE9mKHJvb3ROb2RlLmdldCgpKSkpCisgICAgICAg
ICAgICBub2Rlcy5hcHBlbmQoZWxlbWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ1NTU3R5
bGVTZWxlY3Rvcjo6U2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCwgIWRv
Y3VtZW50LT5pbkNvbXBhdE1vZGUoKSk7CisgICAgICAgIAorICAgICAgICBmb3IgKE5vZGUqIG4g
PSByb290Tm9kZS0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZShyb290
Tm9kZS5nZXQoKSkpIHsKKyAgICAgICAgICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkpIHsKKyAg
ICAgICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4p
OworICAgICAgICAgICAgICAgIGZvciAoQ1NTU2VsZWN0b3IqIHNlbGVjdG9yID0gcXVlcnlTZWxl
Y3Rvcjsgc2VsZWN0b3I7IHNlbGVjdG9yID0gc2VsZWN0b3ItPm5leHQoKSkgeworICAgICAgICAg
ICAgICAgICAgICBpZiAoc2VsZWN0b3JDaGVja2VyLmNoZWNrU2VsZWN0b3Ioc2VsZWN0b3IsIGVs
ZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5hcHBlbmQobik7CisgICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICAKICAgICBy
ZXR1cm4gU3RhdGljTm9kZUxpc3Q6OmFkb3B0KG5vZGVzKTsKIH0KIApJbmRleDogTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNp
b24gMzQ4MDQpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxMCBAQAorMjAwOC0wNi0yNSAgRGF2aWQgU21pdGggIDxjYXRmaXNoLm1hbkBnbWFpbC5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBm
YXN0L2RvbS9TZWxlY3RvckFQSS9kdW1wTm9kZUxpc3QtZXhwZWN0ZWQudHh0OgorICAgICAgICAq
IGZhc3QvZG9tL1NlbGVjdG9yQVBJL2R1bXBOb2RlTGlzdC5odG1sOiBBZGQgdGVzdHMgZm9yIGZp
bmRpbmcgaWRzIG5vdCBpbiB0aGUgZG9jdW1lbnQsIGFuZCBmaW5kaW5nIGR1cGxpY2F0ZSBpZHMK
KwogMjAwOC0wNi0yNSAgSmVhbi1DaGFybGVzIFZlcmRpw6kgIDxqY3ZlcmRpZUBwbGV5by5jb20+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR2VvZmZyZXkgR2FyZW4uCkluZGV4OiBMYXlvdXRUZXN0
cy9mYXN0L2RvbS9TZWxlY3RvckFQSS9kdW1wTm9kZUxpc3QtZXhwZWN0ZWQudHh0Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvZG9tL1NlbGVjdG9yQVBJL2R1bXBOb2RlTGlzdC1leHBl
Y3RlZC50eHQJKHJldmlzaW9uIDM0ODA0KQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vU2VsZWN0
b3JBUEkvZHVtcE5vZGVMaXN0LWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtNiw2ICs2
LDggQEAgbGluZSA0CiBsaW5lIDUKIAogW29iamVjdCBIVE1MRGl2RWxlbWVudF0sIGxlbmd0aDog
MQorbGVuZ3RoOiAwCitbb2JqZWN0IEhUTUxEaXZFbGVtZW50XSwgW29iamVjdCBIVE1MRGl2RWxl
bWVudF0sIGxlbmd0aDogMgogW29iamVjdCBIVE1MRGl2RWxlbWVudF0sIFtvYmplY3QgSFRNTERp
dkVsZW1lbnRdLCBbb2JqZWN0IEhUTUxEaXZFbGVtZW50XSwgW29iamVjdCBIVE1MUGFyYWdyYXBo
RWxlbWVudF0sIGxlbmd0aDogNAogW29iamVjdCBIVE1MRGl2RWxlbWVudF0sIFtvYmplY3QgSFRN
TERpdkVsZW1lbnRdLCBbb2JqZWN0IEhUTUxEaXZFbGVtZW50XSwgW29iamVjdCBIVE1MRGl2RWxl
bWVudF0sIFtvYmplY3QgSFRNTFBhcmFncmFwaEVsZW1lbnRdLCBsZW5ndGg6IDUKIEVycm9yOiBT
WU5UQVhfRVJSOiBET00gRXhjZXB0aW9uIDEyCkBAIC0xNSw2ICsxNyw4IEBAIEVycm9yOiBTWU5U
QVhfRVJSOiBET00gRXhjZXB0aW9uIDEyCiBFcnJvcjogU1lOVEFYX0VSUjogRE9NIEV4Y2VwdGlv
biAxMgogbGVuZ3RoOiAwCiBbb2JqZWN0IEhUTUxEaXZFbGVtZW50XSwgbGVuZ3RoOiAxCitsZW5n
dGg6IDAKK1tvYmplY3QgSFRNTERpdkVsZW1lbnRdLCBbb2JqZWN0IEhUTUxEaXZFbGVtZW50XSwg
bGVuZ3RoOiAyCiBbb2JqZWN0IEhUTUxEaXZFbGVtZW50XSwgW29iamVjdCBIVE1MUGFyYWdyYXBo
RWxlbWVudF0sIGxlbmd0aDogMgogW29iamVjdCBIVE1MRGl2RWxlbWVudF0sIFtvYmplY3QgSFRN
TFBhcmFncmFwaEVsZW1lbnRdLCBsZW5ndGg6IDIKIEVycm9yOiBTWU5UQVhfRVJSOiBET00gRXhj
ZXB0aW9uIDEyCkBAIC0yMyw2ICsyNyw4IEBAIEVycm9yOiBTWU5UQVhfRVJSOiBET00gRXhjZXB0
aW9uIDEyCiBFcnJvcjogU1lOVEFYX0VSUjogRE9NIEV4Y2VwdGlvbiAxMgogRXJyb3I6IFNZTlRB
WF9FUlI6IERPTSBFeGNlcHRpb24gMTIKIFtvYmplY3QgSFRNTERpdkVsZW1lbnRdCitUeXBlRXJy
b3I6IE51bGwgdmFsdWUKK1tvYmplY3QgSFRNTERpdkVsZW1lbnRdCiBbb2JqZWN0IEhUTUxEaXZF
bGVtZW50XQogW29iamVjdCBIVE1MRGl2RWxlbWVudF0KIEVycm9yOiBTWU5UQVhfRVJSOiBET00g
RXhjZXB0aW9uIDEyCkBAIC0zMiw2ICszOCw4IEBAIEVycm9yOiBTWU5UQVhfRVJSOiBET00gRXhj
ZXB0aW9uIDEyCiBFcnJvcjogU1lOVEFYX0VSUjogRE9NIEV4Y2VwdGlvbiAxMgogVHlwZUVycm9y
OiBOdWxsIHZhbHVlCiBbb2JqZWN0IEhUTUxEaXZFbGVtZW50XQorVHlwZUVycm9yOiBOdWxsIHZh
bHVlCitbb2JqZWN0IEhUTUxEaXZFbGVtZW50XQogW29iamVjdCBIVE1MRGl2RWxlbWVudF0KIFtv
YmplY3QgSFRNTERpdkVsZW1lbnRdCiBFcnJvcjogU1lOVEFYX0VSUjogRE9NIEV4Y2VwdGlvbiAx
MgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9kb20vU2VsZWN0b3JBUEkvZHVtcE5vZGVMaXN0Lmh0
bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9kb20vU2VsZWN0b3JBUEkvZHVtcE5v
ZGVMaXN0Lmh0bWwJKHJldmlzaW9uIDM0ODA0KQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vU2Vs
ZWN0b3JBUEkvZHVtcE5vZGVMaXN0Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTEsNyArMSw4IEBA
CiA8aHRtbD4KIDxib2R5PgogPGRpdiBjbGFzcz0ib25lIj5MaW5lIDE8ZGl2IGNsYXNzPSJ0d28i
PkxpbmUgMjwvZGl2PjxwPkxpbmUgPGk+MzwvaT48L3A+PC9kaXY+Ci08ZGl2IGlkPSJ0ZXN0IiBj
bGFzcz0ib25lIHR3byI+PGRpdiBpZD0idGVzdDIiIGNsYXNzPSJvbmUgdHdvIj5saW5lIDQ8L2Rp
dj48cCBjbGFzcz0idHdvIj5saW5lIDU8L3A+PC9kaXY+Cis8ZGl2IGlkPSJ0ZXN0IiBjbGFzcz0i
b25lIHR3byI+PGRpdiBpZD0iZHVwZSI+PC9kaXY+PGRpdiBpZD0iZHVwZSI+PC9kaXY+Cis8ZGl2
IGlkPSJ0ZXN0MiIgY2xhc3M9Im9uZSB0d28iPmxpbmUgNDwvZGl2PjxwIGNsYXNzPSJ0d28iPmxp
bmUgNTwvcD48L2Rpdj4KIDxwPjxvbCBpZD0iY29uc29sZSI+PC9vbD48L3A+CiA8c2NyaXB0IHR5
cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxl
cikKQEAgLTIyLDEwICsyMywxMCBAQAogICAgIE5vZGVMaXN0LnByb3RvdHlwZS5kdW1wID0gZnVu
Y3Rpb24oKQogICAgIHsKICAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwotICAgICAgICB2YXIgaSA9
IDA7Ci0gICAgICAgIGZvciAoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykKKyAgICAgICAgdmFyIGxl
bmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsg
aSsrKQogICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXNbaV0gKyAiLCAiOwotICAgICAgICByZXN1
bHQgKz0gImxlbmd0aDogIiArIGk7CisgICAgICAgIHJlc3VsdCArPSAibGVuZ3RoOiAiICsgbGVu
Z3RoOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMzMsNiArMzQsOCBAQAog
ICAgICAgICB2YXIgZWxtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3QiKTsKICAgICAg
ICAgCiAgICAgICAgIHRyeSB7IGxvZyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjdGVzdCIp
LmR1bXAoKSk7ICAgICAgfSBjYXRjaCAoZSkgeyBsb2coZSkgfQorICAgICAgICB0cnkgeyBsb2co
ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI25vdHRoZXJlIikuZHVtcCgpKTsgIH0gY2F0Y2gg
KGUpIHsgbG9nKGUpIH0KKyAgICAgICAgdHJ5IHsgbG9nKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JB
bGwoIiNkdXBlIikuZHVtcCgpKTsgICAgICB9IGNhdGNoIChlKSB7IGxvZyhlKSB9CiAgICAgICAg
IHRyeSB7IGxvZyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudHdvIikuZHVtcCgpKTsgICAg
ICAgfSBjYXRjaCAoZSkgeyBsb2coZSkgfQogICAgICAgICB0cnkgeyBsb2coZG9jdW1lbnQucXVl
cnlTZWxlY3RvckFsbCgiLm9uZSwgLnR3byIpLmR1bXAoKSk7IH0gY2F0Y2ggKGUpIHsgbG9nKGUp
IH0KICAgICAgICAgdHJ5IHsgbG9nKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIkBmb250LWZh
Y2UiKS5kdW1wKCkpOyB9IGNhdGNoIChlKSB7IGxvZyhlKSB9CkBAIC00Miw3ICs0NSw5IEBACiAg
ICAgICAgIHRyeSB7IGxvZyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHVuZGVmaW5lZCkuZHVt
cCgpKTsgICAgfSBjYXRjaCAoZSkgeyBsb2coZSkgfQogCiAgICAgICAgIHRyeSB7IGxvZyhlbG0u
cXVlcnlTZWxlY3RvckFsbCgiI3Rlc3QiKS5kdW1wKCkpOyAgICAgICAgICAgfSBjYXRjaCAoZSkg
eyBsb2coZSkgfQotICAgICAgICB0cnkgeyBsb2coZWxtLnF1ZXJ5U2VsZWN0b3JBbGwoIiN0ZXN0
MiIpLmR1bXAoKSk7ICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgbG9nKGUpIH0KKyAgICAgICAgdHJ5
IHsgbG9nKGVsbS5xdWVyeVNlbGVjdG9yQWxsKCIjdGVzdDIiKS5kdW1wKCkpOyAgICAgICAgICB9
IGNhdGNoIChlKSB7IGxvZyhlKSB9ICAgICAgIAorICAgICAgICB0cnkgeyBsb2coZWxtLnF1ZXJ5
U2VsZWN0b3JBbGwoIiNub3R0aGVyZSIpLmR1bXAoKSk7ICAgICAgIH0gY2F0Y2ggKGUpIHsgbG9n
KGUpIH0KKyAgICAgICAgdHJ5IHsgbG9nKGVsbS5xdWVyeVNlbGVjdG9yQWxsKCIjZHVwZSIpLmR1
bXAoKSk7ICAgICAgICAgICB9IGNhdGNoIChlKSB7IGxvZyhlKSB9CiAgICAgICAgIHRyeSB7IGxv
ZyhlbG0ucXVlcnlTZWxlY3RvckFsbCgiLnR3byIpLmR1bXAoKSk7ICAgICAgICAgICAgfSBjYXRj
aCAoZSkgeyBsb2coZSkgfQogICAgICAgICB0cnkgeyBsb2coZWxtLnF1ZXJ5U2VsZWN0b3JBbGwo
Ii5vbmUsIC50d28iKS5kdW1wKCkpOyAgICAgIH0gY2F0Y2ggKGUpIHsgbG9nKGUpIH0KICAgICAg
ICAgdHJ5IHsgbG9nKGVsbS5xdWVyeVNlbGVjdG9yQWxsKCJAZm9udC1mYWNlIikuZHVtcCgpKTsg
ICAgICB9IGNhdGNoIChlKSB7IGxvZyhlKSB9CkBAIC01Miw2ICs1Nyw4IEBACiAgICAgICAgIHRy
eSB7IGxvZyhlbG0ucXVlcnlTZWxlY3RvckFsbCh1bmRlZmluZWQpLmR1bXAoKSk7ICAgICAgICAg
fSBjYXRjaCAoZSkgeyBsb2coZSkgfQogCiAgICAgICAgIHRyeSB7IGxvZyhkb2N1bWVudC5xdWVy
eVNlbGVjdG9yKCIjdGVzdCIpLmR1bXAoKSk7ICAgICAgICAgfSBjYXRjaCAoZSkgeyBsb2coZSkg
fQorICAgICAgICB0cnkgeyBsb2coZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI25vdHRoZXJlIiku
ZHVtcCgpKTsgICAgIH0gY2F0Y2ggKGUpIHsgbG9nKGUpIH0KKyAgICAgICAgdHJ5IHsgbG9nKGRv
Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNkdXBlIikuZHVtcCgpKTsgICAgICAgICB9IGNhdGNoIChl
KSB7IGxvZyhlKSB9CiAgICAgICAgIHRyeSB7IGxvZyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIu
dHdvIikuZHVtcCgpKTsgICAgICAgICAgfSBjYXRjaCAoZSkgeyBsb2coZSkgfQogICAgICAgICB0
cnkgeyBsb2coZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm9uZSwgLnR3byIpLmR1bXAoKSk7ICAg
IH0gY2F0Y2ggKGUpIHsgbG9nKGUpIH0KICAgICAgICAgdHJ5IHsgbG9nKGRvY3VtZW50LnF1ZXJ5
U2VsZWN0b3IoIkBmb250LWZhY2UiKS5kdW1wKCkpOyAgICB9IGNhdGNoIChlKSB7IGxvZyhlKSB9
CkBAIC02Miw2ICs2OSw4IEBACiAKICAgICAgICAgdHJ5IHsgbG9nKGVsbS5xdWVyeVNlbGVjdG9y
KCIjdGVzdCIpLmR1bXAoKSk7ICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IGxvZyhlKSB9CiAg
ICAgICAgIHRyeSB7IGxvZyhlbG0ucXVlcnlTZWxlY3RvcigiI3Rlc3QyIikuZHVtcCgpKTsgICAg
ICAgICAgICAgfSBjYXRjaCAoZSkgeyBsb2coZSkgfQorICAgICAgICB0cnkgeyBsb2coZWxtLnF1
ZXJ5U2VsZWN0b3IoIiNub3R0aGVyZSIpLmR1bXAoKSk7ICAgICAgICAgIH0gY2F0Y2ggKGUpIHsg
bG9nKGUpIH0KKyAgICAgICAgdHJ5IHsgbG9nKGVsbS5xdWVyeVNlbGVjdG9yKCIjZHVwZSIpLmR1
bXAoKSk7ICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IGxvZyhlKSB9CiAgICAgICAgIHRyeSB7
IGxvZyhlbG0ucXVlcnlTZWxlY3RvcigiLnR3byIpLmR1bXAoKSk7ICAgICAgICAgICAgICAgfSBj
YXRjaCAoZSkgeyBsb2coZSkgfQogICAgICAgICB0cnkgeyBsb2coZWxtLnF1ZXJ5U2VsZWN0b3Io
Ii5vbmUsIC50d28iKS5kdW1wKCkpOyAgICAgICAgIH0gY2F0Y2ggKGUpIHsgbG9nKGUpIH0KICAg
ICAgICAgdHJ5IHsgbG9nKGVsbS5xdWVyeVNlbGVjdG9yKCJAZm9udC1mYWNlIikuZHVtcCgpKTsg
ICAgICAgICB9IGNhdGNoIChlKSB7IGxvZyhlKSB9Cg==
</data>
<flag name="review"
          id="9641"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
      

    </bug>

</bugzilla>