<?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>54282</bug_id>
          
          <creation_ts>2011-02-11 05:22:13 -0800</creation_ts>
          <short_desc>Extract a function to process contents for one node from Range::processContents</short_desc>
          <delta_ts>2011-02-12 01:10:53 -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>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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>
          
          <blocked>51006</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>ap</cc>
    
    <cc>darin</cc>
    
    <cc>koivisto</cc>
    
    <cc>sam</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>349722</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-11 05:22:13 -0800</bug_when>
    <thetext>This is a cleanup of Range::processContents.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349729</commentid>
    <comment_count>1</comment_count>
      <attachid>82125</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-11 05:40:42 -0800</bug_when>
    <thetext>Created attachment 82125
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349950</commentid>
    <comment_count>2</comment_count>
      <attachid>82125</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-02-11 13:03:39 -0800</bug_when>
    <thetext>Comment on attachment 82125
Patch

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

Nice to not repeat so much code twice. What level of test coverage do we have for this function?

I’ll say r=me, but I am not happy about the new use of UINT_MAX as a magic number.

&gt; Source/WebCore/dom/Range.cpp:41
&gt; +#include &lt;limits.h&gt;

Normally we’d use numeric_limits&lt;unsigned&gt;::max() rather than UINT_MAX. But given the way you are using it for a special meaning as an argument to the function, I suggest a named constant that states that special meaning.

Is the UINT_MAX behavior really needed? Can’t the caller instead compute the correct value to pass? We could provide a helper function for that.

&gt; Source/WebCore/dom/Range.cpp:604
&gt; +    while (node-&gt;parentNode() != commonRoot)
&gt; +        node = node-&gt;parentNode();

Looks to me like this can crash if node isn’t actually inside commonRoot. Maybe the function should assert that on entry.

&gt; Source/WebCore/dom/Range.cpp:854
&gt; +                result-&gt;appendChild(n, ec); // will remove n from its parent

Could do nodes[i].release() here and avoid a bit of reference count churn.

&gt; Source/WebCore/dom/Range.h:150
&gt; +    PassRefPtr&lt;Node&gt; processContentsBetweenOffsets(ActionType, ExceptionCode&amp;, PassRefPtr&lt;DocumentFragment&gt;, Node*, unsigned startOffset, unsigned endOffset);

Normally ExceptionCode&amp; goes last after all the in arguments, and it makes sense to do that even in a case like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350021</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-11 14:15:12 -0800</bug_when>
    <thetext>Thanks for the review.  I&apos;ll resubmit new patch for a review because I&apos;m making quite few changes.

(In reply to comment #2)
&gt; Nice to not repeat so much code twice. What level of test coverage do we have for this function?

We have quite few now in fast/dom/Range.  I had encountered several crashes and fails while I was refactoring this code so I&apos;d trust that they have a decent coverage.

&gt; I’ll say r=me, but I am not happy about the new use of UINT_MAX as a magic number.
&gt; 
&gt; &gt; Source/WebCore/dom/Range.cpp:41
&gt; &gt; +#include &lt;limits.h&gt;
&gt; 
&gt; Normally we’d use numeric_limits&lt;unsigned&gt;::max() rather than UINT_MAX. But given the way you are using it for a special meaning as an argument to the function, I suggest a named constant that states that special meaning.
&gt; 
&gt; Is the UINT_MAX behavior really needed? Can’t the caller instead compute the correct value to pass? We could provide a helper function for that.

I&apos;m not happy about that either.  However, I was more concerned about having two identical switch statement&apos;s cases that need to be maintained to be same.  I think that&apos;s unnecessarily error-prone.  I also considered using template to generate 3 versions of functions but that seemed to bloat the code unnecessary.  I added LengthOfContentsInNode using numeric_limits&lt;unsigned&gt;::max()

&gt; &gt; Source/WebCore/dom/Range.cpp:604
&gt; &gt; +    while (node-&gt;parentNode() != commonRoot)
&gt; &gt; +        node = node-&gt;parentNode();
&gt; 
&gt; Looks to me like this can crash if node isn’t actually inside commonRoot. Maybe the function should assert that on entry.

Thanks for pointing that out.  I was intending to add an assertion there and forgot.

&gt; &gt; Source/WebCore/dom/Range.cpp:854
&gt; &gt; +                result-&gt;appendChild(n, ec); // will remove n from its parent
&gt; 
&gt; Could do nodes[i].release() here and avoid a bit of reference count churn.

Good idea.  Got rid of local variable n altogether.

&gt; &gt; Source/WebCore/dom/Range.h:150
&gt; &gt; +    PassRefPtr&lt;Node&gt; processContentsBetweenOffsets(ActionType, ExceptionCode&amp;, PassRefPtr&lt;DocumentFragment&gt;, Node*, unsigned startOffset, unsigned endOffset);
&gt; 
&gt; Normally ExceptionCode&amp; goes last after all the in arguments, and it makes sense to do that even in a case like this.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350029</commentid>
    <comment_count>4</comment_count>
      <attachid>82176</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-11 14:19:42 -0800</bug_when>
    <thetext>Created attachment 82176
Fixed per Darin&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350056</commentid>
    <comment_count>5</comment_count>
      <attachid>82176</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-02-11 14:45:51 -0800</bug_when>
    <thetext>Comment on attachment 82176
Fixed per Darin&apos;s comments

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

&gt; Source/WebCore/dom/Range.cpp:610
&gt; +static unsigned LengthOfContentsInNode = numeric_limits&lt;unsigned&gt;::max();

Should be const.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350234</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-11 22:04:43 -0800</bug_when>
    <thetext>Attachment 82176 did not build on mac:
Build output: http://queues.webkit.org/results/7868815</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350251</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-12 01:10:53 -0800</bug_when>
    <thetext>Committed r78409: &lt;http://trac.webkit.org/changeset/78409&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82125</attachid>
            <date>2011-02-11 05:40:42 -0800</date>
            <delta_ts>2011-02-11 14:19:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-54282-20110211224040.patch</filename>
            <type>text/plain</type>
            <size>17743</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc4MzMyKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTEtMDItMTEgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgRXh0cmFjdCBhIGZ1bmN0aW9uIHRvIHByb2Nlc3MgY29udGVudHMg
Zm9yIG9uZSBub2RlIGZyb20gUmFuZ2U6OnByb2Nlc3NDb250ZW50cworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQyODIKKworICAgICAgICBFeHRyYWN0
ZWQgUmFuZ2U6OnByb2Nlc3NDb250ZW50c0JldHdlZW5PZmZzZXRzLCB3aGljaCBwcm9jZXNzIGNv
bnRlbnRzIG9mIGEgbm9kZQorICAgICAgICBiZXR3ZWVuIHR3byBvZmZzZXRzLiBUaGlzIGZ1bmN0
aW9uIGlzIHVzZWQgZm9yIHRoZSBzaW1wbGUgY2FzZSB3aGVyZSB0aGUgc3RhcnQKKyAgICAgICAg
YW5kIHRoZSBlbmQgY29udGFpbmVycyBhcmUgb2YgdGhlIHNhbWUgbm9kZSwgYW5kIHRvIHByb2Nl
c3Mgc3RhcnQgYW5kIGVuZCBjb250YWluZXJzCisgICAgICAgIGluIHRoZSBjb21wbGV4IGNhc2Uu
CisKKyAgICAgICAgV2hlbiB0aGUgZnVuY3Rpb24gdGFrZXMgYSBub24tbnVsbCBmcmFnbWVudCAo
c2ltcGxlIGNhc2UpLCBpdCBhcHBlbmRzIHRoZSBwcm9jZXNzZWQKKyAgICAgICAgY29udGVudHMg
dG8gdGhlIGZyYWdtZW50OyBjaGFyYWN0ZXIgZGF0YSBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlv
bidzIGNvbnRlbnRzIGFyZSBjb3BpZWQKKyAgICAgICAgYmV0d2VlbiB0aGUgb2Zmc2V0cywgYW5k
IGRlc2NlbmRhbnRzIGFyZSBjb3BpZWQgZm9yIG5vZGUgb2Ygb3RoZXIgdHlwZXMgKG5vdCBub2Rl
IGl0c2VsZikuCisKKyAgICAgICAgV2hlbiB0aGUgZnJhZ21lbnQgaXMgbnVsbCAoY29tcGxleCBj
YXNlKSwgdGhlIGZ1bmN0aW9uIGNvcGllcyBjb250ZW50cyBvZiBjaGFyYWN0ZXIgZGF0YSwKKyAg
ICAgICAgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgYW5kIG5vZGUgb2Ygb3RoZXIgdHlwZXMgKGlu
Y2x1ZGluZyBub2RlIGl0c2VsZikuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGFyZSBhZGRlZCBz
aW5jZSB0aGlzIGlzIGEgcmVmYWN0b3JpbmcuCisKKyAgICAgICAgKiBkb20vUmFuZ2UuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6aGlnaGVzdEFuY2VzdG9yVW5kZXJDb21tb25Sb290KTogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6cHJvY2Vzc0NvbnRlbnRzKTogQ2FsbHMgaGlnaGVz
dEFuY2VzdG9yVW5kZXJDb21tb25Sb290IGFuZAorICAgICAgICBwcm9jZXNzQ29udGVudHNCZXR3
ZWVuT2Zmc2V0cy4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpwcm9jZXNzQ29udGVudHNCZXR3
ZWVuT2Zmc2V0cyk6IEFkZGVkLgorICAgICAgICAqIGRvbS9SYW5nZS5oOgorCiAyMDExLTAyLTEx
ICBKYW5uZSBLb3NraW5lbiAgPGphbm5lLnAua29za2luZW5AZGlnaWEuY29tPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IEFuZHJlYXMgS2xpbmcuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUmFu
Z2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9SYW5nZS5jcHAJKHJldmlz
aW9uIDc3OTEzKQorKysgU291cmNlL1dlYkNvcmUvZG9tL1JhbmdlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCiAjaW5jbHVkZSAi
bWFya3VwLmgiCiAjaW5jbHVkZSAidmlzaWJsZV91bml0cy5oIgorI2luY2x1ZGUgPGxpbWl0cy5o
PgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogI2lu
Y2x1ZGUgPHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIuaD4KQEAgLTU5NCw2ICs1OTUsMTcgQEAg
Ym9vbCBSYW5nZTo6aW50ZXJzZWN0c05vZGUoTm9kZSogcmVmTm9kZQogICAgIHJldHVybiB0cnVl
OyAvLyBhbGwgb3RoZXIgY2FzZXMKIH0KIAorc3RhdGljIGlubGluZSBOb2RlKiBoaWdoZXN0QW5j
ZXN0b3JVbmRlckNvbW1vblJvb3QoTm9kZSogbm9kZSwgTm9kZSogY29tbW9uUm9vdCkKK3sKKyAg
ICBpZiAobm9kZSA9PSBjb21tb25Sb290KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdoaWxl
IChub2RlLT5wYXJlbnROb2RlKCkgIT0gY29tbW9uUm9vdCkKKyAgICAgICAgbm9kZSA9IG5vZGUt
PnBhcmVudE5vZGUoKTsKKworICAgIHJldHVybiBub2RlOworfQorCiBQYXNzUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IFJhbmdlOjpwcm9jZXNzQ29udGVudHMoQWN0aW9uVHlwZSBhY3Rpb24sIEV4
Y2VwdGlvbkNvZGUmIGVjKQogewogICAgIHR5cGVkZWYgVmVjdG9yPFJlZlB0cjxOb2RlPiA+IE5v
ZGVWZWN0b3I7CkBAIC02MDEsNyArNjEzLDcgQEAgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50
PiBSYW5nZTo6cHJvYwogICAgIFJlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudDsKICAg
ICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IENMT05FX0NPTlRF
TlRTKQogICAgICAgICBmcmFnbWVudCA9IERvY3VtZW50RnJhZ21lbnQ6OmNyZWF0ZShtX293bmVy
RG9jdW1lbnQuZ2V0KCkpOwotICAgIAorCiAgICAgZWMgPSAwOwogICAgIGlmIChjb2xsYXBzZWQo
ZWMpKQogICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOwpAQCAtNjEzLDY4ICs2MjUs
MTYgQEAgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBSYW5nZTo6cHJvYwogICAgICAgICBy
ZXR1cm4gMDsKICAgICBBU1NFUlQoY29tbW9uUm9vdCk7CiAKLSAgICAvLyB3aGF0IGlzIHRoZSBo
aWdoZXN0IG5vZGUgdGhhdCBwYXJ0aWFsbHkgc2VsZWN0cyB0aGUgc3RhcnQgb2YgdGhlIHJhbmdl
PwotICAgIE5vZGUqIHBhcnRpYWxTdGFydCA9IDA7Ci0gICAgaWYgKG1fc3RhcnQuY29udGFpbmVy
KCkgIT0gY29tbW9uUm9vdCkgewotICAgICAgICBwYXJ0aWFsU3RhcnQgPSBtX3N0YXJ0LmNvbnRh
aW5lcigpOwotICAgICAgICB3aGlsZSAocGFydGlhbFN0YXJ0LT5wYXJlbnROb2RlKCkgIT0gY29t
bW9uUm9vdCkKLSAgICAgICAgICAgIHBhcnRpYWxTdGFydCA9IHBhcnRpYWxTdGFydC0+cGFyZW50
Tm9kZSgpOwotICAgIH0KLQotICAgIC8vIHdoYXQgaXMgdGhlIGhpZ2hlc3Qgbm9kZSB0aGF0IHBh
cnRpYWxseSBzZWxlY3RzIHRoZSBlbmQgb2YgdGhlIHJhbmdlPwotICAgIE5vZGUqIHBhcnRpYWxF
bmQgPSAwOwotICAgIGlmIChtX2VuZC5jb250YWluZXIoKSAhPSBjb21tb25Sb290KSB7Ci0gICAg
ICAgIHBhcnRpYWxFbmQgPSBtX2VuZC5jb250YWluZXIoKTsKLSAgICAgICAgd2hpbGUgKHBhcnRp
YWxFbmQtPnBhcmVudE5vZGUoKSAhPSBjb21tb25Sb290KQotICAgICAgICAgICAgcGFydGlhbEVu
ZCA9IHBhcnRpYWxFbmQtPnBhcmVudE5vZGUoKTsKLSAgICB9Ci0KLSAgICAvLyBTaW1wbGUgY2Fz
ZTogdGhlIHN0YXJ0IGFuZCBlbmQgY29udGFpbmVycyBhcmUgdGhlIHNhbWUuIFdlIGp1c3QgZ3Jh
YgotICAgIC8vIGV2ZXJ5dGhpbmcgPj0gc3RhcnQgb2Zmc2V0IGFuZCA8IGVuZCBvZmZzZXQKICAg
ICBpZiAobV9zdGFydC5jb250YWluZXIoKSA9PSBtX2VuZC5jb250YWluZXIoKSkgewotICAgICAg
ICBOb2RlOjpOb2RlVHlwZSBzdGFydE5vZGVUeXBlID0gbV9zdGFydC5jb250YWluZXIoKS0+bm9k
ZVR5cGUoKTsKLSAgICAgICAgaWYgKHN0YXJ0Tm9kZVR5cGUgPT0gTm9kZTo6VEVYVF9OT0RFIHx8
IHN0YXJ0Tm9kZVR5cGUgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFIHx8IHN0YXJ0Tm9kZVR5
cGUgPT0gTm9kZTo6Q09NTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IEVY
VFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IENMT05FX0NPTlRFTlRTKSB7Ci0gICAgICAgICAg
ICAgICAgUmVmUHRyPENoYXJhY3RlckRhdGE+IGMgPSBzdGF0aWNfcG9pbnRlcl9jYXN0PENoYXJh
Y3RlckRhdGE+KG1fc3RhcnQuY29udGFpbmVyKCktPmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAg
ICAgICAgICAgYy0+ZGVsZXRlRGF0YShtX2VuZC5vZmZzZXQoKSwgYy0+bGVuZ3RoKCkgLSBtX2Vu
ZC5vZmZzZXQoKSwgZWMpOwotICAgICAgICAgICAgICAgIGMtPmRlbGV0ZURhdGEoMCwgbV9zdGFy
dC5vZmZzZXQoKSwgZWMpOwotICAgICAgICAgICAgICAgIGZyYWdtZW50LT5hcHBlbmRDaGlsZChj
LnJlbGVhc2UoKSwgZWMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFjdGlvbiA9
PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBERUxFVEVfQ09OVEVOVFMpCi0gICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8Q2hhcmFjdGVyRGF0YSo+KG1fc3RhcnQuY29udGFpbmVyKCkp
LT5kZWxldGVEYXRhKG1fc3RhcnQub2Zmc2V0KCksIG1fZW5kLm9mZnNldCgpIC0gbV9zdGFydC5v
ZmZzZXQoKSwgZWMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0Tm9kZVR5cGUgPT0gTm9kZTo6
UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09
IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IENMT05FX0NPTlRFTlRTKSB7Ci0gICAgICAg
ICAgICAgICAgUmVmUHRyPFByb2Nlc3NpbmdJbnN0cnVjdGlvbj4gYyA9IHN0YXRpY19wb2ludGVy
X2Nhc3Q8UHJvY2Vzc2luZ0luc3RydWN0aW9uPihtX3N0YXJ0LmNvbnRhaW5lcigpLT5jbG9uZU5v
ZGUodHJ1ZSkpOwotICAgICAgICAgICAgICAgIGMtPnNldERhdGEoYy0+ZGF0YSgpLnN1YnN0cmlu
ZyhtX3N0YXJ0Lm9mZnNldCgpLCBtX2VuZC5vZmZzZXQoKSAtIG1fc3RhcnQub2Zmc2V0KCkpLCBl
Yyk7Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnQtPmFwcGVuZENoaWxkKGMucmVsZWFzZSgpLCBl
Yyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09O
VEVOVFMgfHwgYWN0aW9uID09IERFTEVURV9DT05URU5UUykgewotICAgICAgICAgICAgICAgIFBy
b2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rp
b24qPihtX3N0YXJ0LmNvbnRhaW5lcigpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YShw
aS0+ZGF0YSgpKTsKLSAgICAgICAgICAgICAgICBkYXRhLnJlbW92ZShtX3N0YXJ0Lm9mZnNldCgp
LCBtX2VuZC5vZmZzZXQoKSAtIG1fc3RhcnQub2Zmc2V0KCkpOwotICAgICAgICAgICAgICAgIHBp
LT5zZXREYXRhKGRhdGEsIGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIFJlZlB0cjxOb2RlPiBuID0gbV9zdGFydC5jb250YWluZXIoKS0+Zmlyc3RDaGls
ZCgpOwotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBuICYmIGkg
PCBtX3N0YXJ0Lm9mZnNldCgpOyBpKyspIC8vIHNraXAgdW50aWwgc3RhcnQgb2Zmc2V0Ci0gICAg
ICAgICAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBpbnQgZW5kT2Zm
c2V0ID0gbV9lbmQub2Zmc2V0KCk7Ci0gICAgICAgICAgICBSZWZQdHI8Tm9kZT4gbmV4dDsKLSAg
ICAgICAgICAgIGZvciAoOyBuICYmIGkgPCBlbmRPZmZzZXQ7IG4gPSBuZXh0LCBpKyspIHsgLy8g
ZGVsZXRlIHVudGlsIGVuZCBvZmZzZXQKLSAgICAgICAgICAgICAgICBuZXh0ID0gbi0+bmV4dFNp
YmxpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMp
Ci0gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LT5hcHBlbmRDaGlsZChuLCBlYyk7IC8vIHdp
bGwgcmVtb3ZlIG4gZnJvbSBpdHMgcGFyZW50Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWN0
aW9uID09IENMT05FX0NPTlRFTlRTKQotICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC0+YXBw
ZW5kQ2hpbGQobi0+Y2xvbmVOb2RlKHRydWUpLCBlYyk7Ci0gICAgICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgICAgICB0b0NvbnRhaW5lck5vZGUobV9zdGFydC5jb250YWluZXIoKSkt
PnJlbW92ZUNoaWxkKG4uZ2V0KCksIGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOworICAgICAgICBwcm9jZXNzQ29udGVudHNC
ZXR3ZWVuT2Zmc2V0cyhhY3Rpb24sIGVjLCBmcmFnbWVudCwgbV9zdGFydC5jb250YWluZXIoKSwg
bV9zdGFydC5vZmZzZXQoKSwgbV9lbmQub2Zmc2V0KCkpOworICAgICAgICByZXR1cm4gZnJhZ21l
bnQ7CiAgICAgfQogCi0gICAgLy8gQ29tcGxleCBjYXNlOiBTdGFydCBhbmQgZW5kIGNvbnRhaW5l
cnMgYXJlIGRpZmZlcmVudC4KKyAgICAvLyB3aGF0IGlzIHRoZSBoaWdoZXN0IG5vZGUgdGhhdCBw
YXJ0aWFsbHkgc2VsZWN0cyB0aGUgc3RhcnQgLyBlbmQgb2YgdGhlIHJhbmdlPworICAgIE5vZGUq
IHBhcnRpYWxTdGFydCA9IGhpZ2hlc3RBbmNlc3RvclVuZGVyQ29tbW9uUm9vdChtX3N0YXJ0LmNv
bnRhaW5lcigpLCBjb21tb25Sb290KTsKKyAgICBOb2RlKiBwYXJ0aWFsRW5kID0gaGlnaGVzdEFu
Y2VzdG9yVW5kZXJDb21tb25Sb290KG1fZW5kLmNvbnRhaW5lcigpLCBjb21tb25Sb290KTsKKwor
ICAgIC8vIFN0YXJ0IGFuZCBlbmQgY29udGFpbmVycyBhcmUgZGlmZmVyZW50LgogICAgIC8vIFRo
ZXJlIGFyZSB0aHJlZSBwb3NzaWJpbGl0aWVzIGhlcmU6CiAgICAgLy8gMS4gU3RhcnQgY29udGFp
bmVyID09IGNvbW1vblJvb3QgKEVuZCBjb250YWluZXIgbXVzdCBiZSBhIGRlc2NlbmRhbnQpCiAg
ICAgLy8gMi4gRW5kIGNvbnRhaW5lciA9PSBjb21tb25Sb290IChTdGFydCBjb250YWluZXIgbXVz
dCBiZSBhIGRlc2NlbmRhbnQpCkBAIC02OTMsNDkgKzY1Myw3IEBAIFBhc3NSZWZQdHI8RG9jdW1l
bnRGcmFnbWVudD4gUmFuZ2U6OnByb2MKIAogICAgIFJlZlB0cjxOb2RlPiBsZWZ0Q29udGVudHM7
CiAgICAgaWYgKG1fc3RhcnQuY29udGFpbmVyKCkgIT0gY29tbW9uUm9vdCkgewotICAgICAgICAv
LyBwcm9jZXNzIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgcmFuZ2UsIHVwIHVudGlsIHRoZSBs
YXN0IGFuY2VzdG9yIG9mCi0gICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lciBiZWZvcmUgY29tbW9u
Um9vdAotICAgICAgICBOb2RlOjpOb2RlVHlwZSBzdGFydE5vZGVUeXBlID0gbV9zdGFydC5jb250
YWluZXIoKS0+bm9kZVR5cGUoKTsKLSAgICAgICAgaWYgKHN0YXJ0Tm9kZVR5cGUgPT0gTm9kZTo6
VEVYVF9OT0RFIHx8IHN0YXJ0Tm9kZVR5cGUgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFIHx8
IHN0YXJ0Tm9kZVR5cGUgPT0gTm9kZTo6Q09NTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICBpZiAo
YWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IENMT05FX0NPTlRFTlRTKSB7
Ci0gICAgICAgICAgICAgICAgUmVmUHRyPENoYXJhY3RlckRhdGE+IGMgPSBzdGF0aWNfcG9pbnRl
cl9jYXN0PENoYXJhY3RlckRhdGE+KG1fc3RhcnQuY29udGFpbmVyKCktPmNsb25lTm9kZSh0cnVl
KSk7Ci0gICAgICAgICAgICAgICAgYy0+ZGVsZXRlRGF0YSgwLCBtX3N0YXJ0Lm9mZnNldCgpLCBl
Yyk7Ci0gICAgICAgICAgICAgICAgbGVmdENvbnRlbnRzID0gYy5yZWxlYXNlKCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0
aW9uID09IERFTEVURV9DT05URU5UUykKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDaGFy
YWN0ZXJEYXRhKj4obV9zdGFydC5jb250YWluZXIoKSktPmRlbGV0ZURhdGEoCi0gICAgICAgICAg
ICAgICAgICAgIG1fc3RhcnQub2Zmc2V0KCksIHN0YXRpY19jYXN0PENoYXJhY3RlckRhdGEqPiht
X3N0YXJ0LmNvbnRhaW5lcigpKS0+bGVuZ3RoKCkgLSBtX3N0YXJ0Lm9mZnNldCgpLCBlYyk7Ci0g
ICAgICAgIH0gZWxzZSBpZiAoc3RhcnROb2RlVHlwZSA9PSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RS
VUNUSU9OX05PREUpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5U
UyB8fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpIHsKLSAgICAgICAgICAgICAgICBSZWZQdHI8
UHJvY2Vzc2luZ0luc3RydWN0aW9uPiBjID0gc3RhdGljX3BvaW50ZXJfY2FzdDxQcm9jZXNzaW5n
SW5zdHJ1Y3Rpb24+KG1fc3RhcnQuY29udGFpbmVyKCktPmNsb25lTm9kZSh0cnVlKSk7Ci0gICAg
ICAgICAgICAgICAgYy0+c2V0RGF0YShjLT5kYXRhKCkuc3Vic3RyaW5nKG1fc3RhcnQub2Zmc2V0
KCkpLCBlYyk7Ci0gICAgICAgICAgICAgICAgbGVmdENvbnRlbnRzID0gYy5yZWxlYXNlKCk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMg
fHwgYWN0aW9uID09IERFTEVURV9DT05URU5UUykgewotICAgICAgICAgICAgICAgIFByb2Nlc3Np
bmdJbnN0cnVjdGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPiht
X3N0YXJ0LmNvbnRhaW5lcigpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YShwaS0+ZGF0
YSgpKTsKLSAgICAgICAgICAgICAgICBwaS0+c2V0RGF0YShkYXRhLmxlZnQobV9zdGFydC5vZmZz
ZXQoKSksIGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVO
VFMpCi0gICAgICAgICAgICAgICAgbGVmdENvbnRlbnRzID0gbV9zdGFydC5jb250YWluZXIoKS0+
Y2xvbmVOb2RlKGZhbHNlKTsKLSAgICAgICAgICAgIE5vZGVWZWN0b3Igbm9kZXM7Ci0gICAgICAg
ICAgICBOb2RlKiBuID0gbV9zdGFydC5jb250YWluZXIoKS0+Zmlyc3RDaGlsZCgpOwotICAgICAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IG47IG4gPSBuLT5uZXh0U2libGluZygpLCBpKyspIHsKLSAg
ICAgICAgICAgICAgICBpZiAoaSA8IG1fc3RhcnQub2Zmc2V0KCkpCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOyAvLyBTa2lwIHVudGlsIHN0YXJ0IG9mZnNldC4KLSAgICAgICAgICAgICAg
ICBub2Rlcy5hcHBlbmQobik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKE5vZGVW
ZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbm9kZXMuYmVnaW4oKTsgaXQgIT0gbm9kZXMuZW5k
KCk7IGl0KyspIHsKLSAgICAgICAgICAgICAgICBOb2RlKiBuID0gaXQtPmdldCgpOwotICAgICAg
ICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUykKLSAgICAgICAgICAgICAg
ICAgICAgbGVmdENvbnRlbnRzLT5hcHBlbmRDaGlsZChuLCBlYyk7IC8vIFdpbGwgcmVtb3ZlIG4g
ZnJvbSBzdGFydCBjb250YWluZXIuCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09
IENMT05FX0NPTlRFTlRTKQotICAgICAgICAgICAgICAgICAgICBsZWZ0Q29udGVudHMtPmFwcGVu
ZENoaWxkKG4tPmNsb25lTm9kZSh0cnVlKSwgZWMpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgdG9Db250YWluZXJOb2RlKG1fc3RhcnQuY29udGFpbmVyKCkpLT5y
ZW1vdmVDaGlsZChuLCBlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbGVm
dENvbnRlbnRzID0gcHJvY2Vzc0NvbnRlbnRzQmV0d2Vlbk9mZnNldHMoYWN0aW9uLCBlYywgMCwg
bV9zdGFydC5jb250YWluZXIoKSwgbV9zdGFydC5vZmZzZXQoKSwgVUlOVF9NQVgpOwogCiAgICAg
ICAgIE5vZGVWZWN0b3IgYW5jZXN0b3JOb2RlczsKICAgICAgICAgZm9yIChDb250YWluZXJOb2Rl
KiBuID0gbV9zdGFydC5jb250YWluZXIoKS0+cGFyZW50Tm9kZSgpOyBuICYmIG4gIT0gY29tbW9u
Um9vdDsgbiA9IG4tPnBhcmVudE5vZGUoKSkKQEAgLTc2Nyw0NiArNjg1LDcgQEAgUGFzc1JlZlB0
cjxEb2N1bWVudEZyYWdtZW50PiBSYW5nZTo6cHJvYwogCiAgICAgUmVmUHRyPE5vZGU+IHJpZ2h0
Q29udGVudHM7CiAgICAgaWYgKG1fZW5kLmNvbnRhaW5lcigpICE9IGNvbW1vblJvb3QpIHsKLSAg
ICAgICAgLy8gZGVsZXRlIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIHJhbmdlLCB1cCB1bnRp
bCB0aGUgbGFzdCBhbmNlc3RvciBvZgotICAgICAgICAvLyBlbmQgY29udGFpbmVyIGJlZm9yZSBj
b21tb25Sb290Ci0gICAgICAgIE5vZGU6Ok5vZGVUeXBlIGVuZE5vZGVUeXBlID0gbV9lbmQuY29u
dGFpbmVyKCktPm5vZGVUeXBlKCk7Ci0gICAgICAgIGlmIChlbmROb2RlVHlwZSA9PSBOb2RlOjpU
RVhUX05PREUgfHwgZW5kTm9kZVR5cGUgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFIHx8IGVu
ZE5vZGVUeXBlID09IE5vZGU6OkNPTU1FTlRfTk9ERSkgewotICAgICAgICAgICAgaWYgKGFjdGlv
biA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBDTE9ORV9DT05URU5UUykgewotICAg
ICAgICAgICAgICAgIFJlZlB0cjxDaGFyYWN0ZXJEYXRhPiBjID0gc3RhdGljX3BvaW50ZXJfY2Fz
dDxDaGFyYWN0ZXJEYXRhPihtX2VuZC5jb250YWluZXIoKS0+Y2xvbmVOb2RlKHRydWUpKTsKLSAg
ICAgICAgICAgICAgICBjLT5kZWxldGVEYXRhKG1fZW5kLm9mZnNldCgpLCBzdGF0aWNfY2FzdDxD
aGFyYWN0ZXJEYXRhKj4obV9lbmQuY29udGFpbmVyKCkpLT5sZW5ndGgoKSAtIG1fZW5kLm9mZnNl
dCgpLCBlYyk7Ci0gICAgICAgICAgICAgICAgcmlnaHRDb250ZW50cyA9IGM7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9u
ID09IERFTEVURV9DT05URU5UUykKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDaGFyYWN0
ZXJEYXRhKj4obV9lbmQuY29udGFpbmVyKCkpLT5kZWxldGVEYXRhKDAsIG1fZW5kLm9mZnNldCgp
LCBlYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kTm9kZVR5cGUgPT0gTm9kZTo6UFJPQ0VTU0lO
R19JTlNUUlVDVElPTl9OT0RFKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1Rf
Q09OVEVOVFMgfHwgYWN0aW9uID09IENMT05FX0NPTlRFTlRTKSB7Ci0gICAgICAgICAgICAgICAg
UmVmUHRyPFByb2Nlc3NpbmdJbnN0cnVjdGlvbj4gYyA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8UHJv
Y2Vzc2luZ0luc3RydWN0aW9uPihtX2VuZC5jb250YWluZXIoKS0+Y2xvbmVOb2RlKHRydWUpKTsK
LSAgICAgICAgICAgICAgICBjLT5zZXREYXRhKGMtPmRhdGEoKS5sZWZ0KG1fZW5kLm9mZnNldCgp
KSwgZWMpOwotICAgICAgICAgICAgICAgIHJpZ2h0Q29udGVudHMgPSBjLnJlbGVhc2UoKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8
fCBhY3Rpb24gPT0gREVMRVRFX0NPTlRFTlRTKSB7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc2lu
Z0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG1f
ZW5kLmNvbnRhaW5lcigpKTsKLSAgICAgICAgICAgICAgICBwaS0+c2V0RGF0YShwaS0+ZGF0YSgp
LnN1YnN0cmluZyhtX2VuZC5vZmZzZXQoKSksIGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBh
Y3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpCi0gICAgICAgICAgICAgICAgcmlnaHRDb250ZW50cyA9
IG1fZW5kLmNvbnRhaW5lcigpLT5jbG9uZU5vZGUoZmFsc2UpOwotICAgICAgICAgICAgTm9kZSog
biA9IG1fZW5kLmNvbnRhaW5lcigpLT5maXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBpZiAobiAm
JiBtX2VuZC5vZmZzZXQoKSkgewotICAgICAgICAgICAgICAgIE5vZGVWZWN0b3Igbm9kZXM7Ci0g
ICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2VuZC5vZmZzZXQoKSAmJiBuOyBp
KyssIG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgICAgICAgICBub2Rlcy5hcHBl
bmQobik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5vZGVzLnNpemUoKSAtIDE7IGkg
Pj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG4gPSBub2Rlc1tpXS5nZXQoKTsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTKQotICAgICAg
ICAgICAgICAgICAgICAgICAgcmlnaHRDb250ZW50cy0+aW5zZXJ0QmVmb3JlKG4sIHJpZ2h0Q29u
dGVudHMtPmZpcnN0Q2hpbGQoKSwgZWMpOyAvLyB3aWxsIHJlbW92ZSBuIGZyb20gaXRzIHBhcmVu
dAotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMp
Ci0gICAgICAgICAgICAgICAgICAgICAgICByaWdodENvbnRlbnRzLT5pbnNlcnRCZWZvcmUobi0+
Y2xvbmVOb2RlKHRydWUpLCByaWdodENvbnRlbnRzLT5maXJzdENoaWxkKCksIGVjKTsKLSAgICAg
ICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdG9Db250YWluZXJO
b2RlKG1fZW5kLmNvbnRhaW5lcigpKS0+cmVtb3ZlQ2hpbGQobiwgZWMpOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICByaWdodENvbnRlbnRzID0g
cHJvY2Vzc0NvbnRlbnRzQmV0d2Vlbk9mZnNldHMoYWN0aW9uLCBlYywgMCwgbV9lbmQuY29udGFp
bmVyKCksIDAsIG1fZW5kLm9mZnNldCgpKTsKIAogICAgICAgICBDb250YWluZXJOb2RlKiByaWdo
dFBhcmVudCA9IG1fZW5kLmNvbnRhaW5lcigpLT5wYXJlbnROb2RlKCk7CiAgICAgICAgIE5vZGUq
IG4gPSBtX2VuZC5jb250YWluZXIoKS0+cHJldmlvdXNTaWJsaW5nKCk7CkBAIC04OTIsNiArNzcx
LDk5IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gUmFuZ2U6OnByb2MKICAgICByZXR1
cm4gZnJhZ21lbnQucmVsZWFzZSgpOwogfQogCitQYXNzUmVmUHRyPE5vZGU+IFJhbmdlOjpwcm9j
ZXNzQ29udGVudHNCZXR3ZWVuT2Zmc2V0cyhBY3Rpb25UeXBlIGFjdGlvbiwgRXhjZXB0aW9uQ29k
ZSYgZWMsIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQsCisgICAgTm9kZSog
Y29udGFpbmVyLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgdW5zaWduZWQgZW5kT2Zmc2V0KQorewor
ICAgIEFTU0VSVChjb250YWluZXIpOworICAgIEFTU0VSVChzdGFydE9mZnNldCA8PSBlbmRPZmZz
ZXQpOworICAgIAorICAgIFJlZlB0cjxOb2RlPiByZXN1bHQ7CisgICAgc3dpdGNoIChjb250YWlu
ZXItPm5vZGVUeXBlKCkpIHsKKyAgICBjYXNlIE5vZGU6OlRFWFRfTk9ERToKKyAgICBjYXNlIE5v
ZGU6OkNEQVRBX1NFQ1RJT05fTk9ERToKKyAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9ERToKKyAg
ICAgICAgQVNTRVJUKGVuZE9mZnNldCA8PSBzdGF0aWNfY2FzdDxDaGFyYWN0ZXJEYXRhKj4oY29u
dGFpbmVyKS0+bGVuZ3RoKCkgfHwgZW5kT2Zmc2V0ID09IFVJTlRfTUFYKTsKKyAgICAgICAgaWYg
KGVuZE9mZnNldCA9PSBVSU5UX01BWCkKKyAgICAgICAgICAgIGVuZE9mZnNldCA9IHN0YXRpY19j
YXN0PENoYXJhY3RlckRhdGEqPihjb250YWluZXIpLT5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGFj
dGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBDTE9ORV9DT05URU5UUykgewor
ICAgICAgICAgICAgUmVmUHRyPENoYXJhY3RlckRhdGE+IGMgPSBzdGF0aWNfcG9pbnRlcl9jYXN0
PENoYXJhY3RlckRhdGE+KGNvbnRhaW5lci0+Y2xvbmVOb2RlKHRydWUpKTsKKyAgICAgICAgICAg
IGlmIChjLT5sZW5ndGgoKSAtIGVuZE9mZnNldCkKKyAgICAgICAgICAgICAgICBjLT5kZWxldGVE
YXRhKGVuZE9mZnNldCwgYy0+bGVuZ3RoKCkgLSBlbmRPZmZzZXQsIGVjKTsKKyAgICAgICAgICAg
IGlmIChzdGFydE9mZnNldCkKKyAgICAgICAgICAgICAgICBjLT5kZWxldGVEYXRhKDAsIHN0YXJ0
T2Zmc2V0LCBlYyk7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQpIHsKKyAgICAgICAgICAgICAg
ICByZXN1bHQgPSBmcmFnbWVudDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmFwcGVuZENoaWxk
KGMucmVsZWFzZSgpLCBlYyk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBy
ZXN1bHQgPSBjLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uID09IEVY
VFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IERFTEVURV9DT05URU5UUykKKyAgICAgICAgICAg
IHN0YXRpY19jYXN0PENoYXJhY3RlckRhdGEqPihjb250YWluZXIpLT5kZWxldGVEYXRhKHN0YXJ0
T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgZWMpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKKyAgICAgICAgQVNTRVJU
KGVuZE9mZnNldCA8PSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihjb250YWlu
ZXIpLT5kYXRhKCkubGVuZ3RoKCkgfHwgZW5kT2Zmc2V0ID09IFVJTlRfTUFYKTsKKyAgICAgICAg
aWYgKGVuZE9mZnNldCA9PSBVSU5UX01BWCkKKyAgICAgICAgICAgIGVuZE9mZnNldCA9IHN0YXRp
Y19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KGNvbnRhaW5lciktPmRhdGEoKS5sZW5ndGgo
KTsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBD
TE9ORV9DT05URU5UUykgeworICAgICAgICAgICAgUmVmUHRyPFByb2Nlc3NpbmdJbnN0cnVjdGlv
bj4gYyA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8UHJvY2Vzc2luZ0luc3RydWN0aW9uPihjb250YWlu
ZXItPmNsb25lTm9kZSh0cnVlKSk7CisgICAgICAgICAgICBjLT5zZXREYXRhKGMtPmRhdGEoKS5z
dWJzdHJpbmcoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KSwgZWMpOworICAg
ICAgICAgICAgaWYgKGZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnJhZ21l
bnQ7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5hcHBlbmRDaGlsZChjLnJlbGVhc2UoKSwgZWMp
OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYy5yZWxlYXNl
KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8
IGFjdGlvbiA9PSBERUxFVEVfQ09OVEVOVFMpIHsKKyAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0
cnVjdGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihjb250YWlu
ZXIpOworICAgICAgICAgICAgU3RyaW5nIGRhdGEocGktPmRhdGEoKSk7CisgICAgICAgICAgICBk
YXRhLnJlbW92ZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOworICAgICAg
ICAgICAgcGktPnNldERhdGEoZGF0YSwgZWMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOgorICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05P
REU6CisgICAgY2FzZSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAgY2FzZSBOb2Rl
OjpFTlRJVFlfTk9ERToKKyAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6CisgICAgY2FzZSBO
b2RlOjpET0NVTUVOVF9UWVBFX05PREU6CisgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVO
VF9OT0RFOgorICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKKyAgICBjYXNlIE5vZGU6OlhQ
QVRIX05BTUVTUEFDRV9OT0RFOgorICAgICAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGFzc2VydCB0
aGF0IHNvbWUgbm9kZXMgbmV2ZXIgYXBwZWFyIGhlcmU/CisgICAgICAgIGlmIChhY3Rpb24gPT0g
RVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpIHsKKyAgICAgICAg
ICAgIGlmIChmcmFnbWVudCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmcmFnbWVudDsKKyAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb250YWluZXItPmNsb25l
Tm9kZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBOb2RlKiBuID0gY29udGFpbmVyLT5m
aXJzdENoaWxkKCk7CisgICAgICAgIFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiBub2RlczsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gc3RhcnRPZmZzZXQ7IG4gJiYgaTsgaS0tKQorICAgICAgICAg
ICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IHN0YXJ0
T2Zmc2V0OyBuICYmIGkgPCBlbmRPZmZzZXQ7IGkrKywgbiA9IG4tPm5leHRTaWJsaW5nKCkpCisg
ICAgICAgICAgICBub2Rlcy5hcHBlbmQobik7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBuID0gbm9kZXNbaV0uZ2V0
KCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBERUxF
VEVfQ09OVEVOVFM6CisgICAgICAgICAgICAgICAgdG9Db250YWluZXJOb2RlKGNvbnRhaW5lcikt
PnJlbW92ZUNoaWxkKG4sIGVjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGNhc2UgRVhUUkFDVF9DT05URU5UUzoKKyAgICAgICAgICAgICAgICByZXN1bHQtPmFwcGVuZENo
aWxkKG4sIGVjKTsgLy8gd2lsbCByZW1vdmUgbiBmcm9tIGl0cyBwYXJlbnQKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0xPTkVfQ09OVEVOVFM6CisgICAgICAgICAg
ICAgICAgcmVzdWx0LT5hcHBlbmRDaGlsZChuLT5jbG9uZU5vZGUodHJ1ZSksIGVjKTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVh
azsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBQYXNzUmVmUHRyPERvY3VtZW50
RnJhZ21lbnQ+IFJhbmdlOjpleHRyYWN0Q29udGVudHMoRXhjZXB0aW9uQ29kZSYgZWMpCiB7CiAg
ICAgY2hlY2tEZWxldGVFeHRyYWN0KGVjKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9SYW5n
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9SYW5nZS5oCShyZXZpc2lvbiA3
NzkxMykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9SYW5nZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
NDcsNiArMTQ3LDcgQEAgcHJpdmF0ZToKIAogICAgIGVudW0gQWN0aW9uVHlwZSB7IERFTEVURV9D
T05URU5UUywgRVhUUkFDVF9DT05URU5UUywgQ0xPTkVfQ09OVEVOVFMgfTsKICAgICBQYXNzUmVm
UHRyPERvY3VtZW50RnJhZ21lbnQ+IHByb2Nlc3NDb250ZW50cyhBY3Rpb25UeXBlLCBFeGNlcHRp
b25Db2RlJik7CisgICAgUGFzc1JlZlB0cjxOb2RlPiBwcm9jZXNzQ29udGVudHNCZXR3ZWVuT2Zm
c2V0cyhBY3Rpb25UeXBlLCBFeGNlcHRpb25Db2RlJiwgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdt
ZW50PiwgTm9kZSosIHVuc2lnbmVkIHN0YXJ0T2Zmc2V0LCB1bnNpZ25lZCBlbmRPZmZzZXQpOwog
CiAgICAgUmVmUHRyPERvY3VtZW50PiBtX293bmVyRG9jdW1lbnQ7CiAgICAgUmFuZ2VCb3VuZGFy
eVBvaW50IG1fc3RhcnQ7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82176</attachid>
            <date>2011-02-11 14:19:42 -0800</date>
            <delta_ts>2011-02-11 14:45:51 -0800</delta_ts>
            <desc>Fixed per Darin&apos;s comments</desc>
            <filename>bug-54282-20110212071939.patch</filename>
            <type>text/plain</type>
            <size>17732</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc4MzMyKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTEtMDItMTEgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgRXh0cmFjdCBhIGZ1bmN0aW9uIHRvIHByb2Nlc3MgY29udGVudHMg
Zm9yIG9uZSBub2RlIGZyb20gUmFuZ2U6OnByb2Nlc3NDb250ZW50cworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQyODIKKworICAgICAgICBFeHRyYWN0
ZWQgUmFuZ2U6OnByb2Nlc3NDb250ZW50c0JldHdlZW5PZmZzZXRzLCB3aGljaCBwcm9jZXNzIGNv
bnRlbnRzIG9mIGEgbm9kZQorICAgICAgICBiZXR3ZWVuIHR3byBvZmZzZXRzLiBUaGlzIGZ1bmN0
aW9uIGlzIHVzZWQgZm9yIHRoZSBzaW1wbGUgY2FzZSB3aGVyZSB0aGUgc3RhcnQKKyAgICAgICAg
YW5kIHRoZSBlbmQgY29udGFpbmVycyBhcmUgb2YgdGhlIHNhbWUgbm9kZSwgYW5kIHRvIHByb2Nl
c3Mgc3RhcnQgYW5kIGVuZCBjb250YWluZXJzCisgICAgICAgIGluIHRoZSBjb21wbGV4IGNhc2Uu
CisKKyAgICAgICAgV2hlbiB0aGUgZnVuY3Rpb24gdGFrZXMgYSBub24tbnVsbCBmcmFnbWVudCAo
c2ltcGxlIGNhc2UpLCBpdCBhcHBlbmRzIHRoZSBwcm9jZXNzZWQKKyAgICAgICAgY29udGVudHMg
dG8gdGhlIGZyYWdtZW50OyBjaGFyYWN0ZXIgZGF0YSBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlv
bidzIGNvbnRlbnRzIGFyZSBjb3BpZWQKKyAgICAgICAgYmV0d2VlbiB0aGUgb2Zmc2V0cywgYW5k
IGRlc2NlbmRhbnRzIGFyZSBjb3BpZWQgZm9yIG5vZGUgb2Ygb3RoZXIgdHlwZXMgKG5vdCBub2Rl
IGl0c2VsZikuCisKKyAgICAgICAgV2hlbiB0aGUgZnJhZ21lbnQgaXMgbnVsbCAoY29tcGxleCBj
YXNlKSwgdGhlIGZ1bmN0aW9uIGNvcGllcyBjb250ZW50cyBvZiBjaGFyYWN0ZXIgZGF0YSwKKyAg
ICAgICAgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgYW5kIG5vZGUgb2Ygb3RoZXIgdHlwZXMgKGlu
Y2x1ZGluZyBub2RlIGl0c2VsZikuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGFyZSBhZGRlZCBz
aW5jZSB0aGlzIGlzIGEgcmVmYWN0b3JpbmcuCisKKyAgICAgICAgKiBkb20vUmFuZ2UuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6aGlnaGVzdEFuY2VzdG9yVW5kZXJDb21tb25Sb290KTogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpSYW5nZTo6cHJvY2Vzc0NvbnRlbnRzKTogQ2FsbHMgaGlnaGVz
dEFuY2VzdG9yVW5kZXJDb21tb25Sb290IGFuZAorICAgICAgICBwcm9jZXNzQ29udGVudHNCZXR3
ZWVuT2Zmc2V0cy4KKyAgICAgICAgKFdlYkNvcmU6OlJhbmdlOjpwcm9jZXNzQ29udGVudHNCZXR3
ZWVuT2Zmc2V0cyk6IEFkZGVkLgorICAgICAgICAqIGRvbS9SYW5nZS5oOgorCiAyMDExLTAyLTEx
ICBKYW5uZSBLb3NraW5lbiAgPGphbm5lLnAua29za2luZW5AZGlnaWEuY29tPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IEFuZHJlYXMgS2xpbmcuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUmFu
Z2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9SYW5nZS5jcHAJKHJldmlz
aW9uIDc3OTEzKQorKysgU291cmNlL1dlYkNvcmUvZG9tL1JhbmdlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTk0LDYgKzU5NCwyMSBAQCBib29sIFJhbmdlOjppbnRlcnNlY3RzTm9kZShOb2RlKiBy
ZWZOb2RlCiAgICAgcmV0dXJuIHRydWU7IC8vIGFsbCBvdGhlciBjYXNlcwogfQogCitzdGF0aWMg
aW5saW5lIE5vZGUqIGhpZ2hlc3RBbmNlc3RvclVuZGVyQ29tbW9uUm9vdChOb2RlKiBub2RlLCBO
b2RlKiBjb21tb25Sb290KQoreworICAgIGlmIChub2RlID09IGNvbW1vblJvb3QpCisgICAgICAg
IHJldHVybiAwOworCisgICAgQVNTRVJUKGNvbW1vblJvb3QtPmNvbnRhaW5zKG5vZGUpKTsKKwor
ICAgIHdoaWxlIChub2RlLT5wYXJlbnROb2RlKCkgIT0gY29tbW9uUm9vdCkKKyAgICAgICAgbm9k
ZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKworICAgIHJldHVybiBub2RlOworfQorCitzdGF0aWMg
dW5zaWduZWQgTGVuZ3RoT2ZDb250ZW50c0luTm9kZSA9IG51bWVyaWNfbGltaXRzPHVuc2lnbmVk
Pjo6bWF4KCk7CisKIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gUmFuZ2U6OnByb2Nlc3ND
b250ZW50cyhBY3Rpb25UeXBlIGFjdGlvbiwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7CiAgICAgdHlw
ZWRlZiBWZWN0b3I8UmVmUHRyPE5vZGU+ID4gTm9kZVZlY3RvcjsKQEAgLTYwMSw3ICs2MTYsNyBA
QCBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFJhbmdlOjpwcm9jCiAgICAgUmVmUHRyPERv
Y3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50OwogICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05U
RU5UUyB8fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpCiAgICAgICAgIGZyYWdtZW50ID0gRG9j
dW1lbnRGcmFnbWVudDo6Y3JlYXRlKG1fb3duZXJEb2N1bWVudC5nZXQoKSk7Ci0gICAgCisKICAg
ICBlYyA9IDA7CiAgICAgaWYgKGNvbGxhcHNlZChlYykpCiAgICAgICAgIHJldHVybiBmcmFnbWVu
dC5yZWxlYXNlKCk7CkBAIC02MTMsNjggKzYyOCwxNiBAQCBQYXNzUmVmUHRyPERvY3VtZW50RnJh
Z21lbnQ+IFJhbmdlOjpwcm9jCiAgICAgICAgIHJldHVybiAwOwogICAgIEFTU0VSVChjb21tb25S
b290KTsKIAotICAgIC8vIHdoYXQgaXMgdGhlIGhpZ2hlc3Qgbm9kZSB0aGF0IHBhcnRpYWxseSBz
ZWxlY3RzIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2U/Ci0gICAgTm9kZSogcGFydGlhbFN0YXJ0ID0g
MDsKLSAgICBpZiAobV9zdGFydC5jb250YWluZXIoKSAhPSBjb21tb25Sb290KSB7Ci0gICAgICAg
IHBhcnRpYWxTdGFydCA9IG1fc3RhcnQuY29udGFpbmVyKCk7Ci0gICAgICAgIHdoaWxlIChwYXJ0
aWFsU3RhcnQtPnBhcmVudE5vZGUoKSAhPSBjb21tb25Sb290KQotICAgICAgICAgICAgcGFydGlh
bFN0YXJ0ID0gcGFydGlhbFN0YXJ0LT5wYXJlbnROb2RlKCk7Ci0gICAgfQotCi0gICAgLy8gd2hh
dCBpcyB0aGUgaGlnaGVzdCBub2RlIHRoYXQgcGFydGlhbGx5IHNlbGVjdHMgdGhlIGVuZCBvZiB0
aGUgcmFuZ2U/Ci0gICAgTm9kZSogcGFydGlhbEVuZCA9IDA7Ci0gICAgaWYgKG1fZW5kLmNvbnRh
aW5lcigpICE9IGNvbW1vblJvb3QpIHsKLSAgICAgICAgcGFydGlhbEVuZCA9IG1fZW5kLmNvbnRh
aW5lcigpOwotICAgICAgICB3aGlsZSAocGFydGlhbEVuZC0+cGFyZW50Tm9kZSgpICE9IGNvbW1v
blJvb3QpCi0gICAgICAgICAgICBwYXJ0aWFsRW5kID0gcGFydGlhbEVuZC0+cGFyZW50Tm9kZSgp
OwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBjYXNlOiB0aGUgc3RhcnQgYW5kIGVuZCBjb250YWlu
ZXJzIGFyZSB0aGUgc2FtZS4gV2UganVzdCBncmFiCi0gICAgLy8gZXZlcnl0aGluZyA+PSBzdGFy
dCBvZmZzZXQgYW5kIDwgZW5kIG9mZnNldAogICAgIGlmIChtX3N0YXJ0LmNvbnRhaW5lcigpID09
IG1fZW5kLmNvbnRhaW5lcigpKSB7Ci0gICAgICAgIE5vZGU6Ok5vZGVUeXBlIHN0YXJ0Tm9kZVR5
cGUgPSBtX3N0YXJ0LmNvbnRhaW5lcigpLT5ub2RlVHlwZSgpOwotICAgICAgICBpZiAoc3RhcnRO
b2RlVHlwZSA9PSBOb2RlOjpURVhUX05PREUgfHwgc3RhcnROb2RlVHlwZSA9PSBOb2RlOjpDREFU
QV9TRUNUSU9OX05PREUgfHwgc3RhcnROb2RlVHlwZSA9PSBOb2RlOjpDT01NRU5UX05PREUpIHsK
LSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0g
Q0xPTkVfQ09OVEVOVFMpIHsKLSAgICAgICAgICAgICAgICBSZWZQdHI8Q2hhcmFjdGVyRGF0YT4g
YyA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8Q2hhcmFjdGVyRGF0YT4obV9zdGFydC5jb250YWluZXIo
KS0+Y2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgICAgICBjLT5kZWxldGVEYXRhKG1fZW5k
Lm9mZnNldCgpLCBjLT5sZW5ndGgoKSAtIG1fZW5kLm9mZnNldCgpLCBlYyk7Ci0gICAgICAgICAg
ICAgICAgYy0+ZGVsZXRlRGF0YSgwLCBtX3N0YXJ0Lm9mZnNldCgpLCBlYyk7Ci0gICAgICAgICAg
ICAgICAgZnJhZ21lbnQtPmFwcGVuZENoaWxkKGMucmVsZWFzZSgpLCBlYyk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9u
ID09IERFTEVURV9DT05URU5UUykKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDaGFyYWN0
ZXJEYXRhKj4obV9zdGFydC5jb250YWluZXIoKSktPmRlbGV0ZURhdGEobV9zdGFydC5vZmZzZXQo
KSwgbV9lbmQub2Zmc2V0KCkgLSBtX3N0YXJ0Lm9mZnNldCgpLCBlYyk7Ci0gICAgICAgIH0gZWxz
ZSBpZiAoc3RhcnROb2RlVHlwZSA9PSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUp
IHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24g
PT0gQ0xPTkVfQ09OVEVOVFMpIHsKLSAgICAgICAgICAgICAgICBSZWZQdHI8UHJvY2Vzc2luZ0lu
c3RydWN0aW9uPiBjID0gc3RhdGljX3BvaW50ZXJfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+
KG1fc3RhcnQuY29udGFpbmVyKCktPmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgICAgICAgICAg
Yy0+c2V0RGF0YShjLT5kYXRhKCkuc3Vic3RyaW5nKG1fc3RhcnQub2Zmc2V0KCksIG1fZW5kLm9m
ZnNldCgpIC0gbV9zdGFydC5vZmZzZXQoKSksIGVjKTsKLSAgICAgICAgICAgICAgICBmcmFnbWVu
dC0+YXBwZW5kQ2hpbGQoYy5yZWxlYXNlKCksIGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0gREVMRVRFX0NP
TlRFTlRTKSB7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSA9IHN0
YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG1fc3RhcnQuY29udGFpbmVyKCkpOwot
ICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhKHBpLT5kYXRhKCkpOwotICAgICAgICAgICAgICAg
IGRhdGEucmVtb3ZlKG1fc3RhcnQub2Zmc2V0KCksIG1fZW5kLm9mZnNldCgpIC0gbV9zdGFydC5v
ZmZzZXQoKSk7Ci0gICAgICAgICAgICAgICAgcGktPnNldERhdGEoZGF0YSwgZWMpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUmVmUHRyPE5vZGU+IG4gPSBt
X3N0YXJ0LmNvbnRhaW5lcigpLT5maXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBpbnQgaTsKLSAg
ICAgICAgICAgIGZvciAoaSA9IDA7IG4gJiYgaSA8IG1fc3RhcnQub2Zmc2V0KCk7IGkrKykgLy8g
c2tpcCB1bnRpbCBzdGFydCBvZmZzZXQKLSAgICAgICAgICAgICAgICBuID0gbi0+bmV4dFNpYmxp
bmcoKTsKLSAgICAgICAgICAgIGludCBlbmRPZmZzZXQgPSBtX2VuZC5vZmZzZXQoKTsKLSAgICAg
ICAgICAgIFJlZlB0cjxOb2RlPiBuZXh0OwotICAgICAgICAgICAgZm9yICg7IG4gJiYgaSA8IGVu
ZE9mZnNldDsgbiA9IG5leHQsIGkrKykgeyAvLyBkZWxldGUgdW50aWwgZW5kIG9mZnNldAotICAg
ICAgICAgICAgICAgIG5leHQgPSBuLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgICAgIGlm
IChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUykKLSAgICAgICAgICAgICAgICAgICAgZnJhZ21l
bnQtPmFwcGVuZENoaWxkKG4sIGVjKTsgLy8gd2lsbCByZW1vdmUgbiBmcm9tIGl0cyBwYXJlbnQK
LSAgICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpCi0gICAg
ICAgICAgICAgICAgICAgIGZyYWdtZW50LT5hcHBlbmRDaGlsZChuLT5jbG9uZU5vZGUodHJ1ZSks
IGVjKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRvQ29udGFp
bmVyTm9kZShtX3N0YXJ0LmNvbnRhaW5lcigpKS0+cmVtb3ZlQ2hpbGQobi5nZXQoKSwgZWMpOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNl
KCk7CisgICAgICAgIHByb2Nlc3NDb250ZW50c0JldHdlZW5PZmZzZXRzKGFjdGlvbiwgZnJhZ21l
bnQsIG1fc3RhcnQuY29udGFpbmVyKCksIG1fc3RhcnQub2Zmc2V0KCksIG1fZW5kLm9mZnNldCgp
LCBlYyk7CisgICAgICAgIHJldHVybiBmcmFnbWVudDsKICAgICB9CiAKLSAgICAvLyBDb21wbGV4
IGNhc2U6IFN0YXJ0IGFuZCBlbmQgY29udGFpbmVycyBhcmUgZGlmZmVyZW50LgorICAgIC8vIHdo
YXQgaXMgdGhlIGhpZ2hlc3Qgbm9kZSB0aGF0IHBhcnRpYWxseSBzZWxlY3RzIHRoZSBzdGFydCAv
IGVuZCBvZiB0aGUgcmFuZ2U/CisgICAgTm9kZSogcGFydGlhbFN0YXJ0ID0gaGlnaGVzdEFuY2Vz
dG9yVW5kZXJDb21tb25Sb290KG1fc3RhcnQuY29udGFpbmVyKCksIGNvbW1vblJvb3QpOworICAg
IE5vZGUqIHBhcnRpYWxFbmQgPSBoaWdoZXN0QW5jZXN0b3JVbmRlckNvbW1vblJvb3QobV9lbmQu
Y29udGFpbmVyKCksIGNvbW1vblJvb3QpOworCisgICAgLy8gU3RhcnQgYW5kIGVuZCBjb250YWlu
ZXJzIGFyZSBkaWZmZXJlbnQuCiAgICAgLy8gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmlsaXRpZXMg
aGVyZToKICAgICAvLyAxLiBTdGFydCBjb250YWluZXIgPT0gY29tbW9uUm9vdCAoRW5kIGNvbnRh
aW5lciBtdXN0IGJlIGEgZGVzY2VuZGFudCkKICAgICAvLyAyLiBFbmQgY29udGFpbmVyID09IGNv
bW1vblJvb3QgKFN0YXJ0IGNvbnRhaW5lciBtdXN0IGJlIGEgZGVzY2VuZGFudCkKQEAgLTY5Myw0
OSArNjU2LDcgQEAgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBSYW5nZTo6cHJvYwogCiAg
ICAgUmVmUHRyPE5vZGU+IGxlZnRDb250ZW50czsKICAgICBpZiAobV9zdGFydC5jb250YWluZXIo
KSAhPSBjb21tb25Sb290KSB7Ci0gICAgICAgIC8vIHByb2Nlc3MgdGhlIGxlZnQtaGFuZCBzaWRl
IG9mIHRoZSByYW5nZSwgdXAgdW50aWwgdGhlIGxhc3QgYW5jZXN0b3Igb2YKLSAgICAgICAgLy8g
c3RhcnQgY29udGFpbmVyIGJlZm9yZSBjb21tb25Sb290Ci0gICAgICAgIE5vZGU6Ok5vZGVUeXBl
IHN0YXJ0Tm9kZVR5cGUgPSBtX3N0YXJ0LmNvbnRhaW5lcigpLT5ub2RlVHlwZSgpOwotICAgICAg
ICBpZiAoc3RhcnROb2RlVHlwZSA9PSBOb2RlOjpURVhUX05PREUgfHwgc3RhcnROb2RlVHlwZSA9
PSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREUgfHwgc3RhcnROb2RlVHlwZSA9PSBOb2RlOjpDT01N
RU5UX05PREUpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8
fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpIHsKLSAgICAgICAgICAgICAgICBSZWZQdHI8Q2hh
cmFjdGVyRGF0YT4gYyA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8Q2hhcmFjdGVyRGF0YT4obV9zdGFy
dC5jb250YWluZXIoKS0+Y2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgICAgICBjLT5kZWxl
dGVEYXRhKDAsIG1fc3RhcnQub2Zmc2V0KCksIGVjKTsKLSAgICAgICAgICAgICAgICBsZWZ0Q29u
dGVudHMgPSBjLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhY3Rp
b24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0gREVMRVRFX0NPTlRFTlRTKQotICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PENoYXJhY3RlckRhdGEqPihtX3N0YXJ0LmNvbnRhaW5l
cigpKS0+ZGVsZXRlRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgbV9zdGFydC5vZmZzZXQoKSwg
c3RhdGljX2Nhc3Q8Q2hhcmFjdGVyRGF0YSo+KG1fc3RhcnQuY29udGFpbmVyKCkpLT5sZW5ndGgo
KSAtIG1fc3RhcnQub2Zmc2V0KCksIGVjKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGFydE5vZGVU
eXBlID09IE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotICAgICAgICAgICAg
aWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBDTE9ORV9DT05URU5U
UykgewotICAgICAgICAgICAgICAgIFJlZlB0cjxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IGMgPSBz
dGF0aWNfcG9pbnRlcl9jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbj4obV9zdGFydC5jb250YWlu
ZXIoKS0+Y2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgICAgICBjLT5zZXREYXRhKGMtPmRh
dGEoKS5zdWJzdHJpbmcobV9zdGFydC5vZmZzZXQoKSksIGVjKTsKLSAgICAgICAgICAgICAgICBs
ZWZ0Q29udGVudHMgPSBjLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlm
IChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0gREVMRVRFX0NPTlRFTlRT
KSB7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19j
YXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG1fc3RhcnQuY29udGFpbmVyKCkpOwotICAgICAg
ICAgICAgICAgIFN0cmluZyBkYXRhKHBpLT5kYXRhKCkpOwotICAgICAgICAgICAgICAgIHBpLT5z
ZXREYXRhKGRhdGEubGVmdChtX3N0YXJ0Lm9mZnNldCgpKSwgZWMpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRF
TlRTIHx8IGFjdGlvbiA9PSBDTE9ORV9DT05URU5UUykKLSAgICAgICAgICAgICAgICBsZWZ0Q29u
dGVudHMgPSBtX3N0YXJ0LmNvbnRhaW5lcigpLT5jbG9uZU5vZGUoZmFsc2UpOwotICAgICAgICAg
ICAgTm9kZVZlY3RvciBub2RlczsKLSAgICAgICAgICAgIE5vZGUqIG4gPSBtX3N0YXJ0LmNvbnRh
aW5lcigpLT5maXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgbjsgbiA9
IG4tPm5leHRTaWJsaW5nKCksIGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpIDwgbV9zdGFy
dC5vZmZzZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgdW50aWwg
c3RhcnQgb2Zmc2V0LgotICAgICAgICAgICAgICAgIG5vZGVzLmFwcGVuZChuKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGZvciAoTm9kZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBu
b2Rlcy5iZWdpbigpOyBpdCAhPSBub2Rlcy5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgICAg
IE5vZGUqIG4gPSBpdC0+Z2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBFWFRS
QUNUX0NPTlRFTlRTKQotICAgICAgICAgICAgICAgICAgICBsZWZ0Q29udGVudHMtPmFwcGVuZENo
aWxkKG4sIGVjKTsgLy8gV2lsbCByZW1vdmUgbiBmcm9tIHN0YXJ0IGNvbnRhaW5lci4KLSAgICAg
ICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpCi0gICAgICAgICAg
ICAgICAgICAgIGxlZnRDb250ZW50cy0+YXBwZW5kQ2hpbGQobi0+Y2xvbmVOb2RlKHRydWUpLCBl
Yyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0b0NvbnRhaW5l
ck5vZGUobV9zdGFydC5jb250YWluZXIoKSktPnJlbW92ZUNoaWxkKG4sIGVjKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQorICAgICAgICBsZWZ0Q29udGVudHMgPSBwcm9jZXNzQ29udGVudHNC
ZXR3ZWVuT2Zmc2V0cyhhY3Rpb24sIDAsIG1fc3RhcnQuY29udGFpbmVyKCksIG1fc3RhcnQub2Zm
c2V0KCksIExlbmd0aE9mQ29udGVudHNJbk5vZGUsIGVjKTsKIAogICAgICAgICBOb2RlVmVjdG9y
IGFuY2VzdG9yTm9kZXM7CiAgICAgICAgIGZvciAoQ29udGFpbmVyTm9kZSogbiA9IG1fc3RhcnQu
Y29udGFpbmVyKCktPnBhcmVudE5vZGUoKTsgbiAmJiBuICE9IGNvbW1vblJvb3Q7IG4gPSBuLT5w
YXJlbnROb2RlKCkpCkBAIC03NjcsNDYgKzY4OCw3IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gUmFuZ2U6OnByb2MKIAogICAgIFJlZlB0cjxOb2RlPiByaWdodENvbnRlbnRzOwogICAg
IGlmIChtX2VuZC5jb250YWluZXIoKSAhPSBjb21tb25Sb290KSB7Ci0gICAgICAgIC8vIGRlbGV0
ZSB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSByYW5nZSwgdXAgdW50aWwgdGhlIGxhc3QgYW5j
ZXN0b3Igb2YKLSAgICAgICAgLy8gZW5kIGNvbnRhaW5lciBiZWZvcmUgY29tbW9uUm9vdAotICAg
ICAgICBOb2RlOjpOb2RlVHlwZSBlbmROb2RlVHlwZSA9IG1fZW5kLmNvbnRhaW5lcigpLT5ub2Rl
VHlwZSgpOwotICAgICAgICBpZiAoZW5kTm9kZVR5cGUgPT0gTm9kZTo6VEVYVF9OT0RFIHx8IGVu
ZE5vZGVUeXBlID09IE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERSB8fCBlbmROb2RlVHlwZSA9PSBO
b2RlOjpDT01NRU5UX05PREUpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9D
T05URU5UUyB8fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpIHsKLSAgICAgICAgICAgICAgICBS
ZWZQdHI8Q2hhcmFjdGVyRGF0YT4gYyA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8Q2hhcmFjdGVyRGF0
YT4obV9lbmQuY29udGFpbmVyKCktPmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgICAgICAgICAg
Yy0+ZGVsZXRlRGF0YShtX2VuZC5vZmZzZXQoKSwgc3RhdGljX2Nhc3Q8Q2hhcmFjdGVyRGF0YSo+
KG1fZW5kLmNvbnRhaW5lcigpKS0+bGVuZ3RoKCkgLSBtX2VuZC5vZmZzZXQoKSwgZWMpOwotICAg
ICAgICAgICAgICAgIHJpZ2h0Q29udGVudHMgPSBjOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBERUxFVEVfQ09O
VEVOVFMpCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2hhcmFjdGVyRGF0YSo+KG1fZW5k
LmNvbnRhaW5lcigpKS0+ZGVsZXRlRGF0YSgwLCBtX2VuZC5vZmZzZXQoKSwgZWMpOwotICAgICAg
ICB9IGVsc2UgaWYgKGVuZE5vZGVUeXBlID09IE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05f
Tk9ERSkgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFj
dGlvbiA9PSBDTE9ORV9DT05URU5UUykgewotICAgICAgICAgICAgICAgIFJlZlB0cjxQcm9jZXNz
aW5nSW5zdHJ1Y3Rpb24+IGMgPSBzdGF0aWNfcG9pbnRlcl9jYXN0PFByb2Nlc3NpbmdJbnN0cnVj
dGlvbj4obV9lbmQuY29udGFpbmVyKCktPmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgICAgICAg
ICAgYy0+c2V0RGF0YShjLT5kYXRhKCkubGVmdChtX2VuZC5vZmZzZXQoKSksIGVjKTsKLSAgICAg
ICAgICAgICAgICByaWdodENvbnRlbnRzID0gYy5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IERF
TEVURV9DT05URU5UUykgewotICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiog
cGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihtX2VuZC5jb250YWluZXIo
KSk7Ci0gICAgICAgICAgICAgICAgcGktPnNldERhdGEocGktPmRhdGEoKS5zdWJzdHJpbmcobV9l
bmQub2Zmc2V0KCkpLCBlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IENMT05F
X0NPTlRFTlRTKQotICAgICAgICAgICAgICAgIHJpZ2h0Q29udGVudHMgPSBtX2VuZC5jb250YWlu
ZXIoKS0+Y2xvbmVOb2RlKGZhbHNlKTsKLSAgICAgICAgICAgIE5vZGUqIG4gPSBtX2VuZC5jb250
YWluZXIoKS0+Zmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgaWYgKG4gJiYgbV9lbmQub2Zmc2V0
KCkpIHsKLSAgICAgICAgICAgICAgICBOb2RlVmVjdG9yIG5vZGVzOwotICAgICAgICAgICAgICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgbV9lbmQub2Zmc2V0KCkgJiYgbjsgaSsrLCBuID0gbi0+bmV4
dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kKG4pOwotICAgICAg
ICAgICAgICAgIGZvciAoaW50IGkgPSBub2Rlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewot
ICAgICAgICAgICAgICAgICAgICBuID0gbm9kZXNbaV0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUykKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHJpZ2h0Q29udGVudHMtPmluc2VydEJlZm9yZShuLCByaWdodENvbnRlbnRzLT5maXJzdENo
aWxkKCksIGVjKTsgLy8gd2lsbCByZW1vdmUgbiBmcm9tIGl0cyBwYXJlbnQKLSAgICAgICAgICAg
ICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09IENMT05FX0NPTlRFTlRTKQotICAgICAgICAgICAg
ICAgICAgICAgICAgcmlnaHRDb250ZW50cy0+aW5zZXJ0QmVmb3JlKG4tPmNsb25lTm9kZSh0cnVl
KSwgcmlnaHRDb250ZW50cy0+Zmlyc3RDaGlsZCgpLCBlYyk7Ci0gICAgICAgICAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvQ29udGFpbmVyTm9kZShtX2VuZC5jb250
YWluZXIoKSktPnJlbW92ZUNoaWxkKG4sIGVjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcmlnaHRDb250ZW50cyA9IHByb2Nlc3NDb250ZW50
c0JldHdlZW5PZmZzZXRzKGFjdGlvbiwgMCwgbV9lbmQuY29udGFpbmVyKCksIDAsIG1fZW5kLm9m
ZnNldCgpLCBlYyk7CiAKICAgICAgICAgQ29udGFpbmVyTm9kZSogcmlnaHRQYXJlbnQgPSBtX2Vu
ZC5jb250YWluZXIoKS0+cGFyZW50Tm9kZSgpOwogICAgICAgICBOb2RlKiBuID0gbV9lbmQuY29u
dGFpbmVyKCktPnByZXZpb3VzU2libGluZygpOwpAQCAtODkyLDYgKzc3NCw5OCBAQCBQYXNzUmVm
UHRyPERvY3VtZW50RnJhZ21lbnQ+IFJhbmdlOjpwcm9jCiAgICAgcmV0dXJuIGZyYWdtZW50LnJl
bGVhc2UoKTsKIH0KIAorUGFzc1JlZlB0cjxOb2RlPiBSYW5nZTo6cHJvY2Vzc0NvbnRlbnRzQmV0
d2Vlbk9mZnNldHMoQWN0aW9uVHlwZSBhY3Rpb24sIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVu
dD4gZnJhZ21lbnQsCisgICAgTm9kZSogY29udGFpbmVyLCB1bnNpZ25lZCBzdGFydE9mZnNldCwg
dW5zaWduZWQgZW5kT2Zmc2V0LCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBBU1NFUlQoY29u
dGFpbmVyKTsKKyAgICBBU1NFUlQoc3RhcnRPZmZzZXQgPD0gZW5kT2Zmc2V0KTsKKyAgICAKKyAg
ICBSZWZQdHI8Tm9kZT4gcmVzdWx0OworICAgIHN3aXRjaCAoY29udGFpbmVyLT5ub2RlVHlwZSgp
KSB7CisgICAgY2FzZSBOb2RlOjpURVhUX05PREU6CisgICAgY2FzZSBOb2RlOjpDREFUQV9TRUNU
SU9OX05PREU6CisgICAgY2FzZSBOb2RlOjpDT01NRU5UX05PREU6CisgICAgICAgIEFTU0VSVChl
bmRPZmZzZXQgPD0gc3RhdGljX2Nhc3Q8Q2hhcmFjdGVyRGF0YSo+KGNvbnRhaW5lciktPmxlbmd0
aCgpIHx8IGVuZE9mZnNldCA9PSBMZW5ndGhPZkNvbnRlbnRzSW5Ob2RlKTsKKyAgICAgICAgaWYg
KGVuZE9mZnNldCA9PSBMZW5ndGhPZkNvbnRlbnRzSW5Ob2RlKQorICAgICAgICAgICAgZW5kT2Zm
c2V0ID0gc3RhdGljX2Nhc3Q8Q2hhcmFjdGVyRGF0YSo+KGNvbnRhaW5lciktPmxlbmd0aCgpOwor
ICAgICAgICBpZiAoYWN0aW9uID09IEVYVFJBQ1RfQ09OVEVOVFMgfHwgYWN0aW9uID09IENMT05F
X0NPTlRFTlRTKSB7CisgICAgICAgICAgICBSZWZQdHI8Q2hhcmFjdGVyRGF0YT4gYyA9IHN0YXRp
Y19wb2ludGVyX2Nhc3Q8Q2hhcmFjdGVyRGF0YT4oY29udGFpbmVyLT5jbG9uZU5vZGUodHJ1ZSkp
OworICAgICAgICAgICAgaWYgKGMtPmxlbmd0aCgpIC0gZW5kT2Zmc2V0KQorICAgICAgICAgICAg
ICAgIGMtPmRlbGV0ZURhdGEoZW5kT2Zmc2V0LCBjLT5sZW5ndGgoKSAtIGVuZE9mZnNldCwgZWMp
OworICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0KQorICAgICAgICAgICAgICAgIGMtPmRlbGV0
ZURhdGEoMCwgc3RhcnRPZmZzZXQsIGVjKTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudCkgewor
ICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZyYWdtZW50OworICAgICAgICAgICAgICAgIHJlc3Vs
dC0+YXBwZW5kQ2hpbGQoYy5yZWxlYXNlKCksIGVjKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IGMucmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIGlm
IChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5UUyB8fCBhY3Rpb24gPT0gREVMRVRFX0NPTlRFTlRT
KQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2hhcmFjdGVyRGF0YSo+KGNvbnRhaW5lciktPmRl
bGV0ZURhdGEoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBlYyk7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgor
ICAgICAgICBBU1NFUlQoZW5kT2Zmc2V0IDw9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVj
dGlvbio+KGNvbnRhaW5lciktPmRhdGEoKS5sZW5ndGgoKSB8fCBlbmRPZmZzZXQgPT0gTGVuZ3Ro
T2ZDb250ZW50c0luTm9kZSk7CisgICAgICAgIGlmIChlbmRPZmZzZXQgPT0gTGVuZ3RoT2ZDb250
ZW50c0luTm9kZSkKKyAgICAgICAgICAgIGVuZE9mZnNldCA9IHN0YXRpY19jYXN0PFByb2Nlc3Np
bmdJbnN0cnVjdGlvbio+KGNvbnRhaW5lciktPmRhdGEoKS5sZW5ndGgoKTsKKyAgICAgICAgaWYg
KGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBDTE9ORV9DT05URU5UUykg
eworICAgICAgICAgICAgUmVmUHRyPFByb2Nlc3NpbmdJbnN0cnVjdGlvbj4gYyA9IHN0YXRpY19w
b2ludGVyX2Nhc3Q8UHJvY2Vzc2luZ0luc3RydWN0aW9uPihjb250YWluZXItPmNsb25lTm9kZSh0
cnVlKSk7CisgICAgICAgICAgICBjLT5zZXREYXRhKGMtPmRhdGEoKS5zdWJzdHJpbmcoc3RhcnRP
ZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KSwgZWMpOworICAgICAgICAgICAgaWYgKGZy
YWdtZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnJhZ21lbnQ7CisgICAgICAgICAg
ICAgICAgcmVzdWx0LT5hcHBlbmRDaGlsZChjLnJlbGVhc2UoKSwgZWMpOworICAgICAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYy5yZWxlYXNlKCk7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKGFjdGlvbiA9PSBFWFRSQUNUX0NPTlRFTlRTIHx8IGFjdGlvbiA9PSBERUxF
VEVfQ09OVEVOVFMpIHsKKyAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkgPSBz
dGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihjb250YWluZXIpOworICAgICAgICAg
ICAgU3RyaW5nIGRhdGEocGktPmRhdGEoKSk7CisgICAgICAgICAgICBkYXRhLnJlbW92ZShzdGFy
dE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgcGktPnNldERh
dGEoZGF0YSwgZWMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZTo6
RUxFTUVOVF9OT0RFOgorICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05PREU6CisgICAgY2FzZSBO
b2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9ERToK
KyAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6CisgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9U
WVBFX05PREU6CisgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgIGNh
c2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKKyAgICBjYXNlIE5vZGU6OlhQQVRIX05BTUVTUEFDRV9O
T0RFOgorICAgICAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGFzc2VydCB0aGF0IHNvbWUgbm9kZXMg
bmV2ZXIgYXBwZWFyIGhlcmU/CisgICAgICAgIGlmIChhY3Rpb24gPT0gRVhUUkFDVF9DT05URU5U
UyB8fCBhY3Rpb24gPT0gQ0xPTkVfQ09OVEVOVFMpIHsKKyAgICAgICAgICAgIGlmIChmcmFnbWVu
dCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmcmFnbWVudDsKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb250YWluZXItPmNsb25lTm9kZShmYWxzZSk7Cisg
ICAgICAgIH0KKworICAgICAgICBOb2RlKiBuID0gY29udGFpbmVyLT5maXJzdENoaWxkKCk7Cisg
ICAgICAgIFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiBub2RlczsKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gc3RhcnRPZmZzZXQ7IG4gJiYgaTsgaS0tKQorICAgICAgICAgICAgbiA9IG4tPm5leHRT
aWJsaW5nKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IHN0YXJ0T2Zmc2V0OyBuICYmIGkg
PCBlbmRPZmZzZXQ7IGkrKywgbiA9IG4tPm5leHRTaWJsaW5nKCkpCisgICAgICAgICAgICBub2Rl
cy5hcHBlbmQobik7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5vZGVzLnNp
emUoKTsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAg
Y2FzZSBERUxFVEVfQ09OVEVOVFM6CisgICAgICAgICAgICAgICAgdG9Db250YWluZXJOb2RlKGNv
bnRhaW5lciktPnJlbW92ZUNoaWxkKG5vZGVzW2ldLmdldCgpLCBlYyk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVYVFJBQ1RfQ09OVEVOVFM6CisgICAgICAgICAg
ICAgICAgcmVzdWx0LT5hcHBlbmRDaGlsZChub2Rlc1tpXS5yZWxlYXNlKCksIGVjKTsgLy8gd2ls
bCByZW1vdmUgbiBmcm9tIGl0cyBwYXJlbnQKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgQ0xPTkVfQ09OVEVOVFM6CisgICAgICAgICAgICAgICAgcmVzdWx0LT5hcHBl
bmRDaGlsZChub2Rlc1tpXS0+Y2xvbmVOb2RlKHRydWUpLCBlYyk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQor
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBS
YW5nZTo6ZXh0cmFjdENvbnRlbnRzKEV4Y2VwdGlvbkNvZGUmIGVjKQogewogICAgIGNoZWNrRGVs
ZXRlRXh0cmFjdChlYyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUmFuZ2UuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vUmFuZ2UuaAkocmV2aXNpb24gNzc5MTMpCisrKyBT
b3VyY2UvV2ViQ29yZS9kb20vUmFuZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTQ3LDYgKzE0Nyw3
IEBAIHByaXZhdGU6CiAKICAgICBlbnVtIEFjdGlvblR5cGUgeyBERUxFVEVfQ09OVEVOVFMsIEVY
VFJBQ1RfQ09OVEVOVFMsIENMT05FX0NPTlRFTlRTIH07CiAgICAgUGFzc1JlZlB0cjxEb2N1bWVu
dEZyYWdtZW50PiBwcm9jZXNzQ29udGVudHMoQWN0aW9uVHlwZSwgRXhjZXB0aW9uQ29kZSYpOwor
ICAgIFBhc3NSZWZQdHI8Tm9kZT4gcHJvY2Vzc0NvbnRlbnRzQmV0d2Vlbk9mZnNldHMoQWN0aW9u
VHlwZSwgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiwgTm9kZSosIHVuc2lnbmVkIHN0YXJ0
T2Zmc2V0LCB1bnNpZ25lZCBlbmRPZmZzZXQsIEV4Y2VwdGlvbkNvZGUmKTsKIAogICAgIFJlZlB0
cjxEb2N1bWVudD4gbV9vd25lckRvY3VtZW50OwogICAgIFJhbmdlQm91bmRhcnlQb2ludCBtX3N0
YXJ0Owo=
</data>
<flag name="review"
          id="73819"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>