<?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>144491</bug_id>
          
          <creation_ts>2015-05-01 09:29:34 -0700</creation_ts>
          <short_desc>[Content Extensions] Add CombinedURLFilters debugging code</short_desc>
          <delta_ts>2015-05-01 10:19:34 -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 Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alex Christensen">achristensen</reporter>
          <assigned_to name="Alex Christensen">achristensen</assigned_to>
          <cc>dbates</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1090798</commentid>
    <comment_count>0</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-05-01 09:29:34 -0700</bug_when>
    <thetext>Changing CombinedURLFilters is hard because I can&apos;t see what&apos;s going on.  I add some debugging code, and I change std::pair to a struct with names of its members.  Much better!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090800</commentid>
    <comment_count>1</comment_count>
      <attachid>252154</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-05-01 09:36:59 -0700</bug_when>
    <thetext>Created attachment 252154
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090804</commentid>
    <comment_count>2</comment_count>
      <attachid>252154</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2015-05-01 09:58:35 -0700</bug_when>
    <thetext>Comment on attachment 252154
Patch

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

&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:40
&gt; +    std::unique_ptr&lt;PrefixTreeVertex&gt; child;

I take it the name child is more descriptive than vertex in this context?

&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:54
&gt; +    size_t size = sizeof(PrefixTreeNode)

Is this correct? Where is PrefixTreeNode defined?

&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:75
&gt;      

This is OK as-is. I would remove this empty line as I don&apos;t feel that it improves the readability of this function.

&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:77
&gt; +    for (unsigned i = 0; i &lt; depth * 2; ++i)
&gt; +        builder.append(&apos; &apos;);

This is OK as-is. You are underutilizing the index variable i. We only use the variable depth for this loop and can take advantage of it being passed using copy-by-value to write this loop as:

while (depth--)
    builder.append(&quot;  &quot;);

Notice I append a string of two space characters on each iteration.

&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:84
&gt; +    

This is OK as-is. I would remove this empty line as I don&apos;t feel that it improves the readability of this function.

&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:99
&gt; +        

Please remove the leading whitespace in this line.

&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:262
&gt; +                    const Term&amp; term = edge.term;
&gt; +                    unsigned newSubtreeStart = term.generateGraph(nfa, prefixEnd, edge.child-&gt;finalActions);

Can we inline the value of the local variable term on this line or make the name of the local variable more descriptive?

&gt; Source/WebCore/contentextensions/Term.h:214
&gt; +inline String quantifierToString(AtomQuantifier quantifier)

Is it necessary for this to return a String? It seems sufficient to return char.

&gt; Source/WebCore/contentextensions/Term.h:228
&gt; +inline String Term::toString() const

Is it necessary that this be inline?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090807</commentid>
    <comment_count>3</comment_count>
      <attachid>252154</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2015-05-01 10:00:14 -0700</bug_when>
    <thetext>Comment on attachment 252154
Patch

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

&gt; Source/WebCore/ChangeLog:25
&gt; +        * contentextensions/CombinedURLFilters.cpp:
&gt; +        (WebCore::ContentExtensions::recursiveMemoryUsed):
&gt; +        (WebCore::ContentExtensions::CombinedURLFilters::memoryUsed):
&gt; +        (WebCore::ContentExtensions::prefixTreeVertexToString):
&gt; +        (WebCore::ContentExtensions::recursivePrint):
&gt; +        (WebCore::ContentExtensions::CombinedURLFilters::print):
&gt; +        (WebCore::ContentExtensions::CombinedURLFilters::addPattern):
&gt; +        (WebCore::ContentExtensions::generateNFAForSubtree):
&gt; +        (WebCore::ContentExtensions::CombinedURLFilters::processNFAs):
&gt; +        * contentextensions/CombinedURLFilters.h:
&gt; +        * contentextensions/NFA.cpp:
&gt; +        (WebCore::ContentExtensions::NFA::memoryUsed):
&gt; +        * contentextensions/NFA.h:
&gt; +        * contentextensions/Term.h:
&gt; +        (WebCore::ContentExtensions::quantifierToString):
&gt; +        (WebCore::ContentExtensions::Term::toString):

For your consideration, I suggest that we add some per-function remarks to this change log entry. At the very least, I suggest adding the remark &quot;Added.&quot; to functions that were added by this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090808</commentid>
    <comment_count>4</comment_count>
      <attachid>252154</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-05-01 10:03:00 -0700</bug_when>
    <thetext>Comment on attachment 252154
Patch

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

Thanks! Addressing comments:

&gt;&gt; Source/WebCore/contentextensions/CombinedURLFilters.cpp:54
&gt;&gt; +    size_t size = sizeof(PrefixTreeNode)
&gt; 
&gt; Is this correct? Where is PrefixTreeNode defined?

Should be PrefixTreeVertex

&gt;&gt; Source/WebCore/contentextensions/Term.h:214
&gt;&gt; +inline String quantifierToString(AtomQuantifier quantifier)
&gt; 
&gt; Is it necessary for this to return a String? It seems sufficient to return char.

Yes.  AtomQuantifier::One returns the empty string.  There is no empty char.

&gt;&gt; Source/WebCore/contentextensions/Term.h:228
&gt;&gt; +inline String Term::toString() const
&gt; 
&gt; Is it necessary that this be inline?

Yes, it&apos;s a function defined in a header.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090809</commentid>
    <comment_count>5</comment_count>
      <attachid>252154</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2015-05-01 10:05:08 -0700</bug_when>
    <thetext>Comment on attachment 252154
Patch

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

&gt; Source/WebCore/contentextensions/Term.h:232
&gt; +        return &quot;(Empty)&quot;;

We should use ASCIILiteral() to avoid computing the length of the string since this is string literal that only contains ASCII characters 

return ASCIILiteral(&quot;(Empty)&quot;);

&gt; Source/WebCore/contentextensions/Term.h:234
&gt; +        return &quot;(Deleted)&quot;;

Similarly, we should write this as:

return ASCIILiteral(&quot;(Deleted)&quot;);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090812</commentid>
    <comment_count>6</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-05-01 10:07:11 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/183677

I&apos;ll change it to use ASCIILiteral soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090815</commentid>
    <comment_count>7</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2015-05-01 10:18:18 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt;&gt; Source/WebCore/contentextensions/Term.h:214
&gt; &gt;&gt; +inline String quantifierToString(AtomQuantifier quantifier)
&gt; &gt; 
&gt; &gt; Is it necessary for this to return a String? It seems sufficient to return char.
&gt; 
&gt; Yes.  AtomQuantifier::One returns the empty string.  There is no empty char.

You&apos;re right!

&gt; 
&gt; &gt;&gt; Source/WebCore/contentextensions/Term.h:228
&gt; &gt;&gt; +inline String Term::toString() const
&gt; &gt; 
&gt; &gt; Is it necessary that this be inline?
&gt; 
&gt; Yes, it&apos;s a function defined in a header.

Obviously. What I meant to ask is: can we move this function to an implementation file, say, create file Term.cpp, so that we do not inline it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1090816</commentid>
    <comment_count>8</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-05-01 10:19:34 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Obviously. What I meant to ask is: can we move this function to an
&gt; implementation file, say, create file Term.cpp, so that we do not inline it?
Yes.  Term.cpp and DFANode.cpp need to be made.  See the fix me in DFA.cpp.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>252154</attachid>
            <date>2015-05-01 09:36:59 -0700</date>
            <delta_ts>2015-05-01 09:58:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144491-20150501093547.patch</filename>
            <type>text/plain</type>
            <size>14382</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MzY3NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI5IEBACisyMDE1LTA1LTAxICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgW0NvbnRlbnQg
RXh0ZW5zaW9uc10gQWRkIENvbWJpbmVkVVJMRmlsdGVycyBkZWJ1Z2dpbmcgY29kZS4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NDQ5MQorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vIGNoYW5nZSBpbiBi
ZWhhdmlvci4KKworICAgICAgICAqIGNvbnRlbnRleHRlbnNpb25zL0NvbWJpbmVkVVJMRmlsdGVy
cy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50RXh0ZW5zaW9uczo6cmVjdXJzaXZlTWVt
b3J5VXNlZCk6CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50RXh0ZW5zaW9uczo6Q29tYmluZWRV
UkxGaWx0ZXJzOjptZW1vcnlVc2VkKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNp
b25zOjpwcmVmaXhUcmVlVmVydGV4VG9TdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Q29udGVu
dEV4dGVuc2lvbnM6OnJlY3Vyc2l2ZVByaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRF
eHRlbnNpb25zOjpDb21iaW5lZFVSTEZpbHRlcnM6OnByaW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRlbnRFeHRlbnNpb25zOjpDb21iaW5lZFVSTEZpbHRlcnM6OmFkZFBhdHRlcm4pOgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGVudEV4dGVuc2lvbnM6OmdlbmVyYXRlTkZBRm9yU3VidHJlZSk6
CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50RXh0ZW5zaW9uczo6Q29tYmluZWRVUkxGaWx0ZXJz
Ojpwcm9jZXNzTkZBcyk6CisgICAgICAgICogY29udGVudGV4dGVuc2lvbnMvQ29tYmluZWRVUkxG
aWx0ZXJzLmg6CisgICAgICAgICogY29udGVudGV4dGVuc2lvbnMvTkZBLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjpORkE6Om1lbW9yeVVzZWQpOgorICAgICAgICAq
IGNvbnRlbnRleHRlbnNpb25zL05GQS5oOgorICAgICAgICAqIGNvbnRlbnRleHRlbnNpb25zL1Rl
cm0uaDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjpxdWFudGlmaWVyVG9T
dHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Q29udGVudEV4dGVuc2lvbnM6OlRlcm06OnRvU3Ry
aW5nKToKKwogMjAxNS0wNS0wMSAgTWFydGluIFJvYmluc29uICA8bXJvYmluc29uQGlnYWxpYS5j
b20+CiAKICAgICAgICAgW0ZyZWV0eXBlXSBBZGQgc3VwcG9ydCBmb3IgdGhlIGZvbnQtc3ludGhl
c2lzIHByb3BlcnR5CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9Db21i
aW5lZFVSTEZpbHRlcnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRl
eHRlbnNpb25zL0NvbWJpbmVkVVJMRmlsdGVycy5jcHAJKHJldmlzaW9uIDE4MzU1NikKKysrIFNv
dXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0NvbWJpbmVkVVJMRmlsdGVycy5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM1LDcgKzM1LDEyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogbmFt
ZXNwYWNlIENvbnRlbnRFeHRlbnNpb25zIHsKIAotdHlwZWRlZiBWZWN0b3I8c3RkOjpwYWlyPFRl
cm0sIHN0ZDo6dW5pcXVlX3B0cjxQcmVmaXhUcmVlVmVydGV4Pj4sIDAsIFdURjo6Q3Jhc2hPbk92
ZXJmbG93LCAxPiBQcmVmaXhUcmVlRWRnZXM7CitzdHJ1Y3QgUHJlZml4VHJlZUVkZ2UgeworICAg
IFRlcm0gdGVybTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJlZml4VHJlZVZlcnRleD4gY2hpbGQ7
Cit9OworICAgIAordHlwZWRlZiBWZWN0b3I8UHJlZml4VHJlZUVkZ2UsIDAsIFdURjo6Q3Jhc2hP
bk92ZXJmbG93LCAxPiBQcmVmaXhUcmVlRWRnZXM7CiAKIHN0cnVjdCBQcmVmaXhUcmVlVmVydGV4
IHsKICAgICBQcmVmaXhUcmVlRWRnZXMgZWRnZXM7CkBAIC00MywyMSArNDgsNjYgQEAgc3RydWN0
IFByZWZpeFRyZWVWZXJ0ZXggewogICAgIGJvb2wgaW5WYXJpYWJsZUxlbmd0aFByZWZpeCB7IGZh
bHNlIH07CiB9OwogCi1zdGF0aWMgc2l6ZV90IHJlY3Vyc2l2ZU1lbW9yeVVzZWQoY29uc3Qgc3Rk
Ojp1bmlxdWVfcHRyPFByZWZpeFRyZWVWZXJ0ZXg+JiBub2RlKQorI2lmIENPTlRFTlRfRVhURU5T
SU9OU19QRVJGT1JNQU5DRV9SRVBPUlRJTkcKK3N0YXRpYyBzaXplX3QgcmVjdXJzaXZlTWVtb3J5
VXNlZChjb25zdCBQcmVmaXhUcmVlVmVydGV4JiB2ZXJ0ZXgpCiB7Ci0gICAgc2l6ZV90IHNpemUg
PSBzaXplb2YoUHJlZml4VHJlZVZlcnRleCkKLSAgICAgICAgKyBub2RlLT5lZGdlcy5jYXBhY2l0
eSgpICogc2l6ZW9mKHN0ZDo6cGFpcjxUZXJtLCBzdGQ6OnVuaXF1ZV9wdHI8UHJlZml4VHJlZVZl
cnRleD4+KQotICAgICAgICArIG5vZGUtPmZpbmFsQWN0aW9ucy5jYXBhY2l0eSgpICogc2l6ZW9m
KHVpbnQ2NF90KTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGNoaWxkIDogbm9kZS0+ZWRnZXMpCi0g
ICAgICAgIHNpemUgKz0gcmVjdXJzaXZlTWVtb3J5VXNlZChjaGlsZC5zZWNvbmQpOworICAgIHNp
emVfdCBzaXplID0gc2l6ZW9mKFByZWZpeFRyZWVOb2RlKQorICAgICAgICArIHZlcnRleC5lZGdl
cy5jYXBhY2l0eSgpICogc2l6ZW9mKFByZWZpeFRyZWVFZGdlKQorICAgICAgICArIHZlcnRleC5m
aW5hbEFjdGlvbnMuY2FwYWNpdHkoKSAqIHNpemVvZih1aW50NjRfdCk7CisgICAgZm9yIChjb25z
dCBhdXRvJiBlZGdlIDogdmVydGV4LmVkZ2VzKSB7CisgICAgICAgIEFTU0VSVChlZGdlLmNoaWxk
KTsKKyAgICAgICAgc2l6ZSArPSByZWN1cnNpdmVNZW1vcnlVc2VkKCplZGdlLmNoaWxkLmdldCgp
KTsKKyAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKIHNpemVfdCBDb21iaW5lZFVSTEZpbHRl
cnM6Om1lbW9yeVVzZWQoKSBjb25zdAogewotICAgIHJldHVybiByZWN1cnNpdmVNZW1vcnlVc2Vk
KG1fcHJlZml4VHJlZVJvb3QpOworICAgIEFTU0VSVChtX3ByZWZpeFRyZWVSb290KTsKKyAgICBy
ZXR1cm4gcmVjdXJzaXZlTWVtb3J5VXNlZCgqbV9wcmVmaXhUcmVlUm9vdC5nZXQoKSk7CiB9Cisj
ZW5kaWYKKyAgICAKKyNpZiBDT05URU5UX0VYVEVOU0lPTlNfU1RBVEVfTUFDSElORV9ERUJVR0dJ
TkcKK3N0YXRpYyBTdHJpbmcgcHJlZml4VHJlZVZlcnRleFRvU3RyaW5nKGNvbnN0IFByZWZpeFRy
ZWVWZXJ0ZXgmIHZlcnRleCwgdW5zaWduZWQgZGVwdGgpCit7CisgICAgU3RyaW5nQnVpbGRlciBi
dWlsZGVyOwogICAgIAorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aCAqIDI7ICsr
aSkKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKKyAgICBidWlsZGVyLmFwcGVuZCgidmVy
dGV4IGFjdGlvbnM6ICIpOworICAgIGZvciAoYXV0byBhY3Rpb24gOiB2ZXJ0ZXguZmluYWxBY3Rp
b25zKSB7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kTnVtYmVyKGFjdGlvbik7CisgICAgICAgIGJ1
aWxkZXIuYXBwZW5kKCcsJyk7CisgICAgfQorICAgIGJ1aWxkZXIuYXBwZW5kKCdcbicpOworICAg
IAorICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlY3Vy
c2l2ZVByaW50KGNvbnN0IFByZWZpeFRyZWVWZXJ0ZXgmIHZlcnRleCwgdW5zaWduZWQgZGVwdGgp
Cit7CisgICAgZGF0YUxvZ0YoIiVzIiwgcHJlZml4VHJlZVZlcnRleFRvU3RyaW5nKHZlcnRleCwg
ZGVwdGgpLnV0ZjgoKS5kYXRhKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IHZlcnRl
eC5lZGdlcykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aCAqIDI7ICsraSkKKyAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCcgJyk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ2ZXJ0ZXggZWRnZTogIik7Cisg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVkZ2UudGVybS50b1N0cmluZygpKTsKKyAgICAgICAgYnVp
bGRlci5hcHBlbmQoJ1xuJyk7CisgICAgICAgIGRhdGFMb2dGKCIlcyIsIGJ1aWxkZXIudG9TdHJp
bmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgCisgICAgICAgIEFTU0VSVChlZGdlLmNoaWxk
KTsKKyAgICAgICAgcmVjdXJzaXZlUHJpbnQoKmVkZ2UuY2hpbGQuZ2V0KCksIGRlcHRoICsgMSk7
CisgICAgfQorfQorCit2b2lkIENvbWJpbmVkVVJMRmlsdGVyczo6cHJpbnQoKSBjb25zdAorewor
ICAgIHJlY3Vyc2l2ZVByaW50KCptX3ByZWZpeFRyZWVSb290LmdldCgpLCAwKTsKK30KKyNlbmRp
ZgorCiBDb21iaW5lZFVSTEZpbHRlcnM6OkNvbWJpbmVkVVJMRmlsdGVycygpCiAgICAgOiBtX3By
ZWZpeFRyZWVSb290KHN0ZDo6bWFrZV91bmlxdWU8UHJlZml4VHJlZVZlcnRleD4oKSkKIHsKQEAg
LTkwLDIxICsxNDAsMTggQEAgdm9pZCBDb21iaW5lZFVSTEZpbHRlcnM6OmFkZFBhdHRlcm4odWlu
dAogICAgIGZvciAoY29uc3QgVGVybSYgdGVybSA6IHBhdHRlcm4pIHsKICAgICAgICAgc2l6ZV90
IG5leHRFbnRyeUluZGV4ID0gV1RGOjpub3RGb3VuZDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBsYXN0UHJlZml4VHJlZS0+ZWRnZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAg
IGlmIChsYXN0UHJlZml4VHJlZS0+ZWRnZXNbaV0uZmlyc3QgPT0gdGVybSkgeworICAgICAgICAg
ICAgaWYgKGxhc3RQcmVmaXhUcmVlLT5lZGdlc1tpXS50ZXJtID09IHRlcm0pIHsKICAgICAgICAg
ICAgICAgICBuZXh0RW50cnlJbmRleCA9IGk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5leHRFbnRyeUluZGV4ICE9IFdURjo6
bm90Rm91bmQpCi0gICAgICAgICAgICBsYXN0UHJlZml4VHJlZSA9IGxhc3RQcmVmaXhUcmVlLT5l
ZGdlc1tuZXh0RW50cnlJbmRleF0uc2Vjb25kLmdldCgpOworICAgICAgICAgICAgbGFzdFByZWZp
eFRyZWUgPSBsYXN0UHJlZml4VHJlZS0+ZWRnZXNbbmV4dEVudHJ5SW5kZXhdLmNoaWxkLmdldCgp
OwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGhhc05ld1Rlcm0gPSB0cnVlOwogCi0gICAg
ICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJlZml4VHJlZVZlcnRleD4gbmV4dFByZWZpeFRyZWVW
ZXJ0ZXggPSBzdGQ6Om1ha2VfdW5pcXVlPFByZWZpeFRyZWVWZXJ0ZXg+KCk7Ci0KLSAgICAgICAg
ICAgIEFTU0VSVChsYXN0UHJlZml4VHJlZS0+ZWRnZXMuZmluZChzdGQ6Om1ha2VfcGFpcih0ZXJt
LCBzdGQ6Om1ha2VfdW5pcXVlPFByZWZpeFRyZWVWZXJ0ZXg+KCkpKSA9PSBXVEY6Om5vdEZvdW5k
KTsKLSAgICAgICAgICAgIGxhc3RQcmVmaXhUcmVlLT5lZGdlcy5hcHBlbmQoc3RkOjptYWtlX3Bh
aXIodGVybSwgV1RGOjptb3ZlKG5leHRQcmVmaXhUcmVlVmVydGV4KSkpOwotICAgICAgICAgICAg
bGFzdFByZWZpeFRyZWUgPSBsYXN0UHJlZml4VHJlZS0+ZWRnZXMubGFzdCgpLnNlY29uZC5nZXQo
KTsKKyAgICAgICAgICAgIGxhc3RQcmVmaXhUcmVlLT5lZGdlcy5hcHBlbmQoUHJlZml4VHJlZUVk
Z2Uoe3Rlcm0sIHN0ZDo6bWFrZV91bmlxdWU8UHJlZml4VHJlZVZlcnRleD4oKX0pKTsKKyAgICAg
ICAgICAgIGxhc3RQcmVmaXhUcmVlID0gbGFzdFByZWZpeFRyZWUtPmVkZ2VzLmxhc3QoKS5jaGls
ZC5nZXQoKTsKICAgICAgICAgfQogICAgICAgICBwcmVmaXhUcmVlVmVydGljZXNGb3JQYXR0ZXJu
LmFwcGVuZChsYXN0UHJlZml4VHJlZSk7CiAgICAgfQpAQCAtMTQ5LDEzICsxOTYsMTMgQEAgc3Rh
dGljIHZvaWQgZ2VuZXJhdGVORkFGb3JTdWJ0cmVlKE5GQSYgbgogICAgIHdoaWxlICh0cnVlKSB7
CiAgICAgUHJvY2Vzc1N1YnRyZWU6CiAgICAgICAgIGZvciAoQWN0aXZlTkZBU3VidHJlZSYgYWN0
aXZlU3VidHJlZSA9IGFjdGl2ZVN0YWNrLmxhc3QoKTsgYWN0aXZlU3VidHJlZS5pdGVyYXRvciAh
PSBhY3RpdmVTdWJ0cmVlLnZlcnRleC0+ZWRnZXMuZW5kKCk7ICsrYWN0aXZlU3VidHJlZS5pdGVy
YXRvcikgewotICAgICAgICAgICAgaWYgKGFjdGl2ZVN1YnRyZWUuaXRlcmF0b3ItPnNlY29uZC0+
aW5WYXJpYWJsZUxlbmd0aFByZWZpeCkKKyAgICAgICAgICAgIGlmIChhY3RpdmVTdWJ0cmVlLml0
ZXJhdG9yLT5jaGlsZC0+aW5WYXJpYWJsZUxlbmd0aFByZWZpeCkKICAgICAgICAgICAgICAgICBj
b250aW51ZTsKIAotICAgICAgICAgICAgY29uc3QgVGVybSYgdGVybSA9IGFjdGl2ZVN1YnRyZWUu
aXRlcmF0b3ItPmZpcnN0OwotICAgICAgICAgICAgdW5zaWduZWQgbmV3RW5kTm9kZUluZGV4ID0g
dGVybS5nZW5lcmF0ZUdyYXBoKG5mYSwgYWN0aXZlU3VidHJlZS5sYXN0Tm9kZUluZGV4LCBhY3Rp
dmVTdWJ0cmVlLml0ZXJhdG9yLT5zZWNvbmQtPmZpbmFsQWN0aW9ucyk7CisgICAgICAgICAgICBj
b25zdCBUZXJtJiB0ZXJtID0gYWN0aXZlU3VidHJlZS5pdGVyYXRvci0+dGVybTsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIG5ld0VuZE5vZGVJbmRleCA9IHRlcm0uZ2VuZXJhdGVHcmFwaChuZmEsIGFj
dGl2ZVN1YnRyZWUubGFzdE5vZGVJbmRleCwgYWN0aXZlU3VidHJlZS5pdGVyYXRvci0+Y2hpbGQt
PmZpbmFsQWN0aW9ucyk7CiAKLSAgICAgICAgICAgIFByZWZpeFRyZWVWZXJ0ZXgqIHByZWZpeFRy
ZWVWZXJ0ZXggPSBhY3RpdmVTdWJ0cmVlLml0ZXJhdG9yLT5zZWNvbmQuZ2V0KCk7CisgICAgICAg
ICAgICBQcmVmaXhUcmVlVmVydGV4KiBwcmVmaXhUcmVlVmVydGV4ID0gYWN0aXZlU3VidHJlZS5p
dGVyYXRvci0+Y2hpbGQuZ2V0KCk7CiAgICAgICAgICAgICBpZiAoIXByZWZpeFRyZWVWZXJ0ZXgt
PmVkZ2VzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGFjdGl2ZVN0YWNrLmFwcGVuZChB
Y3RpdmVORkFTdWJ0cmVlKHByZWZpeFRyZWVWZXJ0ZXgsIHByZWZpeFRyZWVWZXJ0ZXgtPmVkZ2Vz
LmJlZ2luKCksIG5ld0VuZE5vZGVJbmRleCkpOwogICAgICAgICAgICAgICAgIGdvdG8gUHJvY2Vz
c1N1YnRyZWU7CkBAIC0xODAsNyArMjI3LDcgQEAgdm9pZCBDb21iaW5lZFVSTEZpbHRlcnM6OnBy
b2Nlc3NORkFzKHN0ZAogCiAgICAgICAgIC8vIFdlIGdvIGRlcHRoIGZpcnN0IGludG8gdGhlIHN1
YnRyZWVzIHdpdGggdmFyaWFibGUgcHJlZml4LiBGaW5kIHRoZSBuZXh0IHN1YnRyZWUuCiAgICAg
ICAgIGZvciAoOyBhY3RpdmVTdWJ0cmVlLml0ZXJhdG9yICE9IGFjdGl2ZVN1YnRyZWUudmVydGV4
LT5lZGdlcy5lbmQoKTsgKythY3RpdmVTdWJ0cmVlLml0ZXJhdG9yKSB7Ci0gICAgICAgICAgICBQ
cmVmaXhUcmVlVmVydGV4KiBwcmVmaXhUcmVlVmVydGV4ID0gYWN0aXZlU3VidHJlZS5pdGVyYXRv
ci0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgUHJlZml4VHJlZVZlcnRleCogcHJlZml4VHJl
ZVZlcnRleCA9IGFjdGl2ZVN1YnRyZWUuaXRlcmF0b3ItPmNoaWxkLmdldCgpOwogICAgICAgICAg
ICAgaWYgKHByZWZpeFRyZWVWZXJ0ZXgtPmluVmFyaWFibGVMZW5ndGhQcmVmaXgpIHsKICAgICAg
ICAgICAgICAgICBhY3RpdmVTdGFjay5hcHBlbmQoQWN0aXZlU3VidHJlZSh7IHByZWZpeFRyZWVW
ZXJ0ZXgsIHByZWZpeFRyZWVWZXJ0ZXgtPmVkZ2VzLmJlZ2luKCkgfSkpOwogICAgICAgICAgICAg
ICAgIGdvdG8gUHJvY2Vzc1N1YnRyZWU7CkBAIC0xOTIsNyArMjM5LDcgQEAgdm9pZCBDb21iaW5l
ZFVSTEZpbHRlcnM6OnByb2Nlc3NORkFzKHN0ZAogICAgICAgICBib29sIG5lZWRUb0dlbmVyYXRl
ID0gYWN0aXZlU3VidHJlZS52ZXJ0ZXgtPmVkZ2VzLmlzRW1wdHkoKSAmJiAhYWN0aXZlU3VidHJl
ZS52ZXJ0ZXgtPmZpbmFsQWN0aW9ucy5pc0VtcHR5KCk7CiAgICAgICAgIGlmICghbmVlZFRvR2Vu
ZXJhdGUpIHsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IGFjdGl2ZVN1YnRy
ZWUudmVydGV4LT5lZGdlcykgewotICAgICAgICAgICAgICAgIGlmICghZWRnZS5zZWNvbmQtPmlu
VmFyaWFibGVMZW5ndGhQcmVmaXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWVkZ2UuY2hpbGQt
PmluVmFyaWFibGVMZW5ndGhQcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgbmVlZFRvR2Vu
ZXJhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAg
ICB9CkBAIC0yMDUsMTUgKzI1MiwxNSBAQCB2b2lkIENvbWJpbmVkVVJMRmlsdGVyczo6cHJvY2Vz
c05GQXMoc3RkCiAgICAgICAgICAgICB1bnNpZ25lZCBwcmVmaXhFbmQgPSBuZmEucm9vdCgpOwog
CiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYWN0aXZlU3RhY2suc2l6ZSgp
IC0gMTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgVGVybSYgdGVybSA9IGFjdGl2ZVN0
YWNrW2ldLml0ZXJhdG9yLT5maXJzdDsKLSAgICAgICAgICAgICAgICBwcmVmaXhFbmQgPSB0ZXJt
LmdlbmVyYXRlR3JhcGgobmZhLCBwcmVmaXhFbmQsIGFjdGl2ZVN0YWNrW2ldLml0ZXJhdG9yLT5z
ZWNvbmQtPmZpbmFsQWN0aW9ucyk7CisgICAgICAgICAgICAgICAgY29uc3QgVGVybSYgdGVybSA9
IGFjdGl2ZVN0YWNrW2ldLml0ZXJhdG9yLT50ZXJtOworICAgICAgICAgICAgICAgIHByZWZpeEVu
ZCA9IHRlcm0uZ2VuZXJhdGVHcmFwaChuZmEsIHByZWZpeEVuZCwgYWN0aXZlU3RhY2tbaV0uaXRl
cmF0b3ItPmNoaWxkLT5maW5hbEFjdGlvbnMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAg
ICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBhY3RpdmVTdWJ0cmVlLnZlcnRleC0+ZWRnZXMpIHsK
LSAgICAgICAgICAgICAgICBpZiAoIWVkZ2Uuc2Vjb25kLT5pblZhcmlhYmxlTGVuZ3RoUHJlZml4
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlcm0mIHRlcm0gPSBlZGdlLmZpcnN0Owot
ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuZXdTdWJ0cmVlU3RhcnQgPSB0ZXJtLmdlbmVy
YXRlR3JhcGgobmZhLCBwcmVmaXhFbmQsIGVkZ2Uuc2Vjb25kLT5maW5hbEFjdGlvbnMpOwotICAg
ICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5GQUZvclN1YnRyZWUobmZhLCBuZXdTdWJ0cmVlU3Rh
cnQsICplZGdlLnNlY29uZCk7CisgICAgICAgICAgICAgICAgaWYgKCFlZGdlLmNoaWxkLT5pblZh
cmlhYmxlTGVuZ3RoUHJlZml4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlcm0mIHRl
cm0gPSBlZGdlLnRlcm07CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5ld1N1YnRyZWVT
dGFydCA9IHRlcm0uZ2VuZXJhdGVHcmFwaChuZmEsIHByZWZpeEVuZCwgZWRnZS5jaGlsZC0+Zmlu
YWxBY3Rpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVORkFGb3JTdWJ0cmVlKG5m
YSwgbmV3U3VidHJlZVN0YXJ0LCAqZWRnZS5jaGlsZCk7CiAgICAgICAgICAgICAgICAgfQogICAg
ICAgICAgICAgfQogICAgICAgICAgICAgCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jb250ZW50ZXh0
ZW5zaW9ucy9Db21iaW5lZFVSTEZpbHRlcnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9jb250ZW50ZXh0ZW5zaW9ucy9Db21iaW5lZFVSTEZpbHRlcnMuaAkocmV2aXNpb24gMTgzNTU2
KQorKysgU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvQ29tYmluZWRVUkxGaWx0ZXJz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2lmIEVOQUJMRShDT05URU5U
X0VYVEVOU0lPTlMpCiAKKyNpbmNsdWRlICJDb250ZW50RXh0ZW5zaW9uc0RlYnVnZ2luZy5oIgog
I2luY2x1ZGUgIk5GQS5oIgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIApAQCAtNDgsNyArNDks
MTIgQEAgcHVibGljOgogICAgIHZvaWQgcHJvY2Vzc05GQXMoc3RkOjpmdW5jdGlvbjx2b2lkKE5G
QSYmKT4gaGFuZGxlcikgY29uc3Q7CiAgICAgdm9pZCBjbGVhcigpOwogCisjaWYgQ09OVEVOVF9F
WFRFTlNJT05TX1BFUkZPUk1BTkNFX1JFUE9SVElORwogICAgIHNpemVfdCBtZW1vcnlVc2VkKCkg
Y29uc3Q7CisjZW5kaWYKKyNpZiBDT05URU5UX0VYVEVOU0lPTlNfU1RBVEVfTUFDSElORV9ERUJV
R0dJTkcKKyAgICB2b2lkIHByaW50KCkgY29uc3Q7CisjZW5kaWYKICAgICAKIHByaXZhdGU6CiAg
ICAgc3RkOjp1bmlxdWVfcHRyPFByZWZpeFRyZWVWZXJ0ZXg+IG1fcHJlZml4VHJlZVJvb3Q7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ORkEuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL05GQS5jcHAJKHJldmlzaW9uIDE4
MzY2NykKKysrIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL05GQS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQ3LDYgKzQ3LDcgQEAgdW5zaWduZWQgTkZBOjpjcmVhdGVOb2RlKCkKICAg
ICByZXR1cm4gbmV4dElkOwogfQogCisjaWYgQ09OVEVOVF9FWFRFTlNJT05TX1BFUkZPUk1BTkNF
X1JFUE9SVElORwogc2l6ZV90IE5GQTo6bWVtb3J5VXNlZCgpIGNvbnN0CiB7CiAgICAgc2l6ZV90
IHNpemUgPSBzaXplb2YoTkZBKTsKQEAgLTU2LDEwICs1NywxMSBAQCBzaXplX3QgTkZBOjptZW1v
cnlVc2VkKCkgY29uc3QKICAgICAgICAgc2l6ZSArPSBzaXplb2Yobm9kZSkKICAgICAgICAgICAg
ICsgbm9kZS50cmFuc2l0aW9ucy5jYXBhY2l0eSgpICogc2l6ZW9mKHN0ZDo6cGFpcjx1aW50MTZf
dCwgTkZBTm9kZUluZGV4U2V0PikKICAgICAgICAgICAgICsgbm9kZS50cmFuc2l0aW9uc09uQW55
Q2hhcmFjdGVyLmNhcGFjaXR5KCkgKiBzaXplb2YodW5zaWduZWQpCi0gICAgICAgICAgICArIG5v
ZGUuZmluYWxSdWxlSWRzLnNpemUoKSAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAr
IG5vZGUuZmluYWxSdWxlSWRzLmNhcGFjaXR5KCkgKiBzaXplb2YodWludDY0X3QpOwogICAgIH0K
ICAgICByZXR1cm4gc2l6ZTsKIH0KKyNlbmRpZgogCiB2b2lkIE5GQTo6YWRkVHJhbnNpdGlvbih1
bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bywgY2hhciBjaGFyYWN0ZXIpCiB7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ORkEuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ORkEuaAkocmV2aXNpb24gMTgzNTU2KQorKysgU291
cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvTkZBLmgJKHdvcmtpbmcgY29weSkKQEAgLTYx
LDcgKzYxLDkgQEAgcHVibGljOgogI2Vsc2UKICAgICB2b2lkIGFkZFJ1bGVJZCh1bnNpZ25lZCwg
dWludDY0X3QpIHsgfQogI2VuZGlmCisjaWYgQ09OVEVOVF9FWFRFTlNJT05TX1BFUkZPUk1BTkNF
X1JFUE9SVElORwogICAgIHNpemVfdCBtZW1vcnlVc2VkKCkgY29uc3Q7CisjZW5kaWYKIAogcHJp
dmF0ZToKICAgICBmcmllbmQgY2xhc3MgTkZBVG9ERkE7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9j
b250ZW50ZXh0ZW5zaW9ucy9UZXJtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY29u
dGVudGV4dGVuc2lvbnMvVGVybS5oCShyZXZpc2lvbiAxODM1NTYpCisrKyBTb3VyY2UvV2ViQ29y
ZS9jb250ZW50ZXh0ZW5zaW9ucy9UZXJtLmgJKHdvcmtpbmcgY29weSkKQEAgLTI4LDExICsyOCwx
NCBAQAogCiAjaWYgRU5BQkxFKENPTlRFTlRfRVhURU5TSU9OUykKIAorI2luY2x1ZGUgIkNvbnRl
bnRFeHRlbnNpb25zRGVidWdnaW5nLmgiCiAjaW5jbHVkZSAiTkZBLmgiCiAjaW5jbHVkZSA8dW5p
Y29kZS91dHlwZXMuaD4KICNpbmNsdWRlIDx3dGYvQVNDSUlDVHlwZS5oPgogI2luY2x1ZGUgPHd0
Zi9IYXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1N0cmluZ0J1aWxkZXIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCkBAIC0xMDYsNiArMTA5LDEwIEBAIHB1YmxpYzoKICAgICBib29s
IGlzRW1wdHlWYWx1ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNEZWxldGVkVmFsdWUoKSBjb25zdDsK
IAorI2lmIENPTlRFTlRfRVhURU5TSU9OU19TVEFURV9NQUNISU5FX0RFQlVHR0lORworICAgIFN0
cmluZyB0b1N0cmluZygpIGNvbnN0OworI2VuZGlmCisgICAgCiBwcml2YXRlOgogICAgIC8vIFRo
aXMgaXMgZXhhY3QgZm9yIGNoYXJhY3RlciBzZXRzIGJ1dCBjb25zZXJ2YXRpdmUgZm9yIGdyb3Vw
cy4KICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBmYWxzZSBmb3IgYSBncm91cCBlcXVp
dmFsZW50IHRvIGEgdW5pdmVyc2FsIHRyYW5zaXRpb24uCkBAIC0yMDMsNiArMjEwLDU5IEBAIHBy
aXZhdGU6CiAgICAgfSBtX2F0b21EYXRhOwogfTsKIAorI2lmIENPTlRFTlRfRVhURU5TSU9OU19T
VEFURV9NQUNISU5FX0RFQlVHR0lORworaW5saW5lIFN0cmluZyBxdWFudGlmaWVyVG9TdHJpbmco
QXRvbVF1YW50aWZpZXIgcXVhbnRpZmllcikKK3sKKyAgICBzd2l0Y2ggKHF1YW50aWZpZXIpIHsK
KyAgICBjYXNlIEF0b21RdWFudGlmaWVyOjpPbmU6CisgICAgICAgIHJldHVybiAiIjsKKyAgICBj
YXNlIEF0b21RdWFudGlmaWVyOjpaZXJvT3JPbmU6CisgICAgICAgIHJldHVybiAiPyI7CisgICAg
Y2FzZSBBdG9tUXVhbnRpZmllcjo6WmVyb09yTW9yZToKKyAgICAgICAgcmV0dXJuICIqIjsKKyAg
ICBjYXNlIEF0b21RdWFudGlmaWVyOjpPbmVPck1vcmU6CisgICAgICAgIHJldHVybiAiKyI7Cisg
ICAgfQorfQorICAgIAoraW5saW5lIFN0cmluZyBUZXJtOjp0b1N0cmluZygpIGNvbnN0Cit7Cisg
ICAgc3dpdGNoIChtX3Rlcm1UeXBlKSB7CisgICAgY2FzZSBUZXJtVHlwZTo6RW1wdHk6CisgICAg
ICAgIHJldHVybiAiKEVtcHR5KSI7CisgICAgY2FzZSBUZXJtVHlwZTo6RGVsZXRlZDoKKyAgICAg
ICAgcmV0dXJuICIoRGVsZXRlZCkiOworICAgIGNhc2UgVGVybVR5cGU6OkNoYXJhY3RlclNldDog
eworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KCdbJyk7CisgICAgICAgIGZvciAoVUNoYXIgYyA9IDA7IGMgPCAxMjg7IGMrKykgeworICAgICAg
ICAgICAgaWYgKG1fYXRvbURhdGEuY2hhcmFjdGVyU2V0LmdldChjKSkgeworICAgICAgICAgICAg
ICAgIGlmIChpc0FTQ0lJUHJpbnRhYmxlKGMpICYmICFpc0FTQ0lJU3BhY2UoYykpCisgICAgICAg
ICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoJ3UnKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmROdW1iZXIoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCddJyk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KHF1YW50aWZpZXJUb1N0cmluZyhtX3F1YW50aWZpZXIpKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxk
ZXIudG9TdHJpbmcoKTsKKyAgICB9CisgICAgY2FzZSBUZXJtVHlwZTo6R3JvdXA6IHsKKyAgICAg
ICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOworICAgICAgICBidWlsZGVyLmFwcGVuZCgnKCcpOwor
ICAgICAgICBmb3IgKGNvbnN0IFRlcm0mIHRlcm0gOiBtX2F0b21EYXRhLmdyb3VwLnRlcm1zKQor
ICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodGVybS50b1N0cmluZygpKTsKKyAgICAgICAgYnVp
bGRlci5hcHBlbmQoJyknKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQocXVhbnRpZmllclRvU3Ry
aW5nKG1fcXVhbnRpZmllcikpOworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwor
ICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKyAgICAKIHN0cnVjdCBUZXJtSGFzaCB7CiAgICAgc3Rh
dGljIHVuc2lnbmVkIGhhc2goY29uc3QgVGVybSYgdGVybSkgeyByZXR1cm4gdGVybS5oYXNoKCk7
IH0KICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBUZXJtJiBhLCBjb25zdCBUZXJtJiBiKSB7
IHJldHVybiBhID09IGI7IH0K
</data>
<flag name="review"
          id="276983"
          type_id="1"
          status="+"
          setter="dbates"
    />
          </attachment>
      

    </bug>

</bugzilla>