<?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>164192</bug_id>
          
          <creation_ts>2016-10-29 15:52:10 -0700</creation_ts>
          <short_desc>Add $vm.codeBlock() debugging utility.</short_desc>
          <delta_ts>2016-10-31 16:24:25 -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>JavaScriptCore</component>
          <version>WebKit Local 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="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>keith_miller</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1246100</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 15:52:10 -0700</bug_when>
    <thetext>Sometimes, while debugging, it would be nice if we can get the codeBlock info for a function.  This can be useful for checking what optimization level the function is currently at.  With $vm.codeBlock(), we can now do this.  For example:

    print(&quot;test&apos;s codeBlock = &quot; + $vm.classBlock(test)); // prints function test&apos;s codeBlock.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246102</commentid>
    <comment_count>1</comment_count>
      <attachid>293315</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 15:57:07 -0700</bug_when>
    <thetext>Created attachment 293315
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246103</commentid>
    <comment_count>2</comment_count>
      <attachid>293315</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 16:00:46 -0700</bug_when>
    <thetext>Comment on attachment 293315
proposed patch.

I have a better patch coming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246104</commentid>
    <comment_count>3</comment_count>
      <attachid>293316</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 16:02:32 -0700</bug_when>
    <thetext>Created attachment 293316
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246109</commentid>
    <comment_count>4</comment_count>
      <attachid>293316</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-10-29 17:05:14 -0700</bug_when>
    <thetext>Comment on attachment 293316
proposed patch.

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

&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:295
&gt; +        codeBlock = reinterpret_cast&lt;CodeBlock*&gt;(bitwise_cast&lt;uint64_t&gt;(value.asDouble()));

This could just be a single bitwise_cast to CodeBlock*. Why is this code even important. Why would a double JSValue ever be a CodeBlock? This seems sketchy

&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:323
&gt; +    JSValue value = exec-&gt;uncheckedArgument(0);

Might as well use argument instead of unchrckedArgument here just to be friendly to incorrect usage.

&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:464
&gt; +    addFunction(vm, globalObject, &quot;codeBlock&quot;, functionCodeBlockFor, 1);

I think a better name is codeBlockFor in the exposed JS name</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246113</commentid>
    <comment_count>5</comment_count>
      <attachid>293316</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2016-10-29 17:18:46 -0700</bug_when>
    <thetext>Comment on attachment 293316
proposed patch.

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

&gt; Source/JavaScriptCore/ChangeLog:13
&gt; +            print(&quot;test&apos;s codeBlock = &quot; + $vm.classBlock(test)); // prints function test&apos;s codeBlock.

I think you mean $vm.codeBlock(...), not $vm.classBlock(...).

&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:276
&gt;      if (exec-&gt;argumentCount() &lt; 1)
&gt;          return nullptr;

Now that you are passing a value, it&apos;s weird that you are still checking the argument count.  If you want to keep this check, you should probably move it to the call sites.  That said, I&apos;m not clear why you changed this to pass a value since it is always argument 0.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246120</commentid>
    <comment_count>6</comment_count>
      <attachid>293316</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 19:08:14 -0700</bug_when>
    <thetext>Comment on attachment 293316
proposed patch.

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

&gt;&gt; Source/JavaScriptCore/ChangeLog:13
&gt;&gt; +            print(&quot;test&apos;s codeBlock = &quot; + $vm.classBlock(test)); // prints function test&apos;s codeBlock.
&gt; 
&gt; I think you mean $vm.codeBlock(...), not $vm.classBlock(...).

This is from muscle memory of typing &quot;classBlock&quot; for many years in a pass career.  Fixed now.

&gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:276
&gt;&gt;          return nullptr;
&gt; 
&gt; Now that you are passing a value, it&apos;s weird that you are still checking the argument count.  If you want to keep this check, you should probably move it to the call sites.  That said, I&apos;m not clear why you changed this to pass a value since it is always argument 0.

Thanks for catching this.  I was sloppy.  After thinking about this some more, I&apos;m going to revert this function to be codeBlockFromArg() so that I don&apos;t have to duplicate the check in the 3 clients that calls this function.

&gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:295
&gt;&gt; +        codeBlock = reinterpret_cast&lt;CodeBlock*&gt;(bitwise_cast&lt;uint64_t&gt;(value.asDouble()));
&gt; 
&gt; This could just be a single bitwise_cast to CodeBlock*. Why is this code even important. Why would a double JSValue ever be a CodeBlock? This seems sketchy

Fixed to just use a single bitwise_cast.

The reason it can be a double is because $vm.codeBlockForFrame(...) returns the bits of a CodeBlock* encoded as a double JSValue cookie.  That&apos;s why there&apos;s a isValidCodeBlock() check below before we actually use it as a CodeBlock*.  This API is for debugging with $vm only where we get to look into C++ data structures.  In real world JS code, we&apos;ll never have a JSValue that is a CodeBlock*, let alone a CodeBlock* that is a double JSValue.

&gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:323
&gt;&gt; +    JSValue value = exec-&gt;uncheckedArgument(0);
&gt; 
&gt; Might as well use argument instead of unchrckedArgument here just to be friendly to incorrect usage.

I reverted to using codeBlockFromArg() which checks the argument count first.

&gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:464
&gt;&gt; +    addFunction(vm, globalObject, &quot;codeBlock&quot;, functionCodeBlockFor, 1);
&gt; 
&gt; I think a better name is codeBlockFor in the exposed JS name

I was going for brevity, but I think you are right that codeBlockFor is more clear.  Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246121</commentid>
    <comment_count>7</comment_count>
      <attachid>293322</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 19:18:43 -0700</bug_when>
    <thetext>Created attachment 293322
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246122</commentid>
    <comment_count>8</comment_count>
      <attachid>293322</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 19:27:55 -0700</bug_when>
    <thetext>Comment on attachment 293322
proposed patch.

Can&apos;t just use a single bitwise_cast after all.  Also have a bug.  I think a JSFuntion can only have a FunctionExecutable.  I&apos;ll double check before uploading another patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246123</commentid>
    <comment_count>9</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-10-29 19:28:14 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Comment on attachment 293316 [details]
&gt; proposed patch.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=293316&amp;action=review
&gt; 
&gt; &gt;&gt; Source/JavaScriptCore/ChangeLog:13
&gt; &gt;&gt; +            print(&quot;test&apos;s codeBlock = &quot; + $vm.classBlock(test)); // prints function test&apos;s codeBlock.
&gt; &gt; 
&gt; &gt; I think you mean $vm.codeBlock(...), not $vm.classBlock(...).
&gt; 
&gt; This is from muscle memory of typing &quot;classBlock&quot; for many years in a pass
&gt; career.  Fixed now.
&gt; 
&gt; &gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:276
&gt; &gt;&gt;          return nullptr;
&gt; &gt; 
&gt; &gt; Now that you are passing a value, it&apos;s weird that you are still checking the argument count.  If you want to keep this check, you should probably move it to the call sites.  That said, I&apos;m not clear why you changed this to pass a value since it is always argument 0.
&gt; 
&gt; Thanks for catching this.  I was sloppy.  After thinking about this some
&gt; more, I&apos;m going to revert this function to be codeBlockFromArg() so that I
&gt; don&apos;t have to duplicate the check in the 3 clients that calls this function.
&gt; 
&gt; &gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:295
&gt; &gt;&gt; +        codeBlock = reinterpret_cast&lt;CodeBlock*&gt;(bitwise_cast&lt;uint64_t&gt;(value.asDouble()));
&gt; &gt; 
&gt; &gt; This could just be a single bitwise_cast to CodeBlock*. Why is this code even important. Why would a double JSValue ever be a CodeBlock? This seems sketchy
&gt; 
&gt; Fixed to just use a single bitwise_cast.
&gt; 
&gt; The reason it can be a double is because $vm.codeBlockForFrame(...) returns
&gt; the bits of a CodeBlock* encoded as a double JSValue cookie.  That&apos;s why
&gt; there&apos;s a isValidCodeBlock() check below before we actually use it as a
&gt; CodeBlock*.  This API is for debugging with $vm only where we get to look
&gt; into C++ data structures.  In real world JS code, we&apos;ll never have a JSValue
&gt; that is a CodeBlock*, let alone a CodeBlock* that is a double JSValue.
I&apos;m not still confused why this would ever return true because of our encoding. Maybe I&apos;m missing something here? 

&gt; &gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:323
&gt; &gt;&gt; +    JSValue value = exec-&gt;uncheckedArgument(0);
&gt; &gt; 
&gt; &gt; Might as well use argument instead of unchrckedArgument here just to be friendly to incorrect usage.
&gt; 
&gt; I reverted to using codeBlockFromArg() which checks the argument count first.
&gt; 
&gt; &gt;&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:464
&gt; &gt;&gt; +    addFunction(vm, globalObject, &quot;codeBlock&quot;, functionCodeBlockFor, 1);
&gt; &gt; 
&gt; &gt; I think a better name is codeBlockFor in the exposed JS name
&gt; 
&gt; I was going for brevity, but I think you are right that codeBlockFor is more
&gt; clear.  Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246124</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-10-29 19:28:48 -0700</bug_when>
    <thetext>&quot;not still&quot; =&gt; &quot;still&quot;

(Sorry I&apos;m typing on my phone.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246126</commentid>
    <comment_count>11</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 19:40:08 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; I&apos;m [still] confused why this would ever return true because of our
&gt; encoding. Maybe I&apos;m missing something here? 

You&apos;ll need to see the implementation of functionCodeBlockForFrame() in JSDollarVMPrototype.cpp.  When reading that, consider the following use case of $vm:

    function foo(i) { 
        if (i &gt; 0)
            foo(i - 1);
        else {
            var cb = $vm.codeBlockForFrame(2);
            $vm.printByteCodeFor(cb);
        }
    }
    foo(5);

$vm.codeBlockForFrame(2) will return the CodeBlock* at callFrame 2 (0 == top frame, 2 == 2nd below top frame).  That CodeBlock* is returned encoded as a double.

You know what ... CodeBlock is a JSCell.  I wrote this code way back before I understood many things about the system.  I&apos;ll just fix it to return the CodeBlock* itself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246151</commentid>
    <comment_count>12</comment_count>
      <attachid>293332</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 22:26:15 -0700</bug_when>
    <thetext>Created attachment 293332
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246154</commentid>
    <comment_count>13</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-29 22:32:47 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; You know what ... CodeBlock is a JSCell.  I wrote this code way back before
&gt; I understood many things about the system.  I&apos;ll just fix it to return the
&gt; CodeBlock* itself.

I stand corrected.  While exploring this, I discover why I encoded the CodeBlock* as a double.  The reason is that JS code is not supposed to handle JSCells that are not JSObjects.  Hence, if we have $vm.codeBlockForFrame(...) return a CodeBlock*, the client will crash the VM if it uses the CodeBlock* as a JSObject*.  By first encoding it as a double, JS code will simply see it as a double which is safe.  The only way it can be used as a CodeBlock* is if we pass that double encoded CodeBlock* to $vm.codeBlockFor(...), $vm.printSourceCodeFor(...), and $vm.printByteCodeFor(...).

I added comments to the patch to document this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246629</commentid>
    <comment_count>14</comment_count>
      <attachid>293332</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-10-31 15:21:10 -0700</bug_when>
    <thetext>Comment on attachment 293332
proposed patch.

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

&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:270
&gt; +    // Though CodeBlock is a JSCell, it is not safe to return a JSCell* that is not a JSObject*

This is not strictly true. There are other things that are cells but not objects, like JSString*.

&gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:273
&gt;      return JSValue::encode(JSValue(bitwise_cast&lt;double&gt;(reinterpret_cast&lt;uint64_t&gt;(codeBlock))));

I think you want to make sure to pass the EncodeAsDouble tag to this. Also, I&apos;m not sure your reinterpret_cast is going to work well on 32-bit platforms. You might want this:
bitwise_cast&lt;double&gt;(static_cast&lt;uint64_t&gt;(bitwise_cast&lt;uintptr_t&gt;(CodeBlock*)))</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1246686</commentid>
    <comment_count>15</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-10-31 16:24:25 -0700</bug_when>
    <thetext>Thanks for the review.

(In reply to comment #14)
&gt; &gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:270
&gt; &gt; +    // Though CodeBlock is a JSCell, it is not safe to return a JSCell* that is not a JSObject*
&gt; 
&gt; This is not strictly true. There are other things that are cells but not
&gt; objects, like JSString*.

I fixed the comment to say:
&quot;Though CodeBlock is a JSCell, it is not safe to return it directly back to JS code as it is an internal type that the JS code cannot handle.&quot;

&gt; &gt; Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp:273
&gt; &gt;      return JSValue::encode(JSValue(bitwise_cast&lt;double&gt;(reinterpret_cast&lt;uint64_t&gt;(codeBlock))));
&gt; 
&gt; I think you want to make sure to pass the EncodeAsDouble tag to this. Also,
&gt; I&apos;m not sure your reinterpret_cast is going to work well on 32-bit
&gt; platforms. You might want this:
&gt; bitwise_cast&lt;double&gt;(static_cast&lt;uint64_t&gt;(bitwise_cast&lt;uintptr_t&gt;(CodeBlock*
&gt; )))

I changed this to JSValue(bitwise_cast&lt;double&gt;(static_cast&lt;uint64_t&gt;(reinterpret_cast&lt;uintptr_t&gt;(codeBlock)))) which adds the extra zero extension on 32-bit platforms.

Landed in r208189: &lt;http://trac.webkit.org/r208189&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293315</attachid>
            <date>2016-10-29 15:57:07 -0700</date>
            <delta_ts>2016-10-29 16:02:32 -0700</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-164192.patch</filename>
            <type>text/plain</type>
            <size>4237</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA4MTE2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBA
CisyMDE2LTEwLTI5ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBB
ZGQgJHZtLmNvZGVCbG9jaygpIGRlYnVnZ2luZyB1dGlsaXR5LgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY0MTkyCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU29tZXRpbWVzLCB3aGlsZSBkZWJ1Z2dpbmcs
IGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY2FuIGdldCB0aGUgY29kZUJsb2NrIGluZm8gZm9yCisg
ICAgICAgIGEgZnVuY3Rpb24uICBBbW9uZ3N0IG90aGVyIHVzZXMsIHRoaXMgaXMgdXNlZnVsIGZv
ciBjaGVja2luZyB3aGF0IG9wdGltaXphdGlvbgorICAgICAgICBsZXZlbCB0aGUgZnVuY3Rpb24g
aXMgY3VycmVudGx5IGF0LiAgV2l0aCAkdm0uY29kZUJsb2NrKCksIHdlIGNhbiBub3cgZG8gdGhp
cy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIHdoZW4gSlNfdXNlRG9sbGFyVk09dHJ1ZToKKworICAg
ICAgICAgICAgcHJpbnQoInRlc3QncyBjb2RlQmxvY2sgPSAiICsgJHZtLmNsYXNzQmxvY2sodGVz
dCkpOyAvLyBwcmludHMgZnVuY3Rpb24gdGVzdCdzIGNvZGVCbG9jay4KKworICAgICAgICAqIHRv
b2xzL0pTRG9sbGFyVk1Qcm90b3R5cGUuY3BwOgorICAgICAgICAoSlNDOjpjb2RlQmxvY2tGcm9t
QXJnKToKKyAgICAgICAgKEpTQzo6ZnVuY3Rpb25Db2RlQmxvY2tGb3IpOgorICAgICAgICAoSlND
OjpKU0RvbGxhclZNUHJvdG90eXBlOjpmaW5pc2hDcmVhdGlvbik6CisKIDIwMTYtMTAtMjggIEpv
c2VwaCBQZWNvcmFybyAgPHBlY29yYXJvQGFwcGxlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVj
dG9yOiBCcmVha3BvaW50cyBub3Qgd29ya2luZyBpbiBzY3JpcHRzIHdpdGggdW5pY29kZSBjaGFy
YWN0ZXJzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdG9vbHMvSlNEb2xsYXJWTVByb3Rv
dHlwZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rvb2xzL0pTRG9s
bGFyVk1Qcm90b3R5cGUuY3BwCShyZXZpc2lvbiAyMDgxMTYpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvdG9vbHMvSlNEb2xsYXJWTVByb3RvdHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3
NSwyMCArMjc1LDQ3IEBAIHN0YXRpYyBDb2RlQmxvY2sqIGNvZGVCbG9ja0Zyb21BcmcoRXhlY1MK
ICAgICBpZiAoZXhlYy0+YXJndW1lbnRDb3VudCgpIDwgMSkKICAgICAgICAgcmV0dXJuIG51bGxw
dHI7CiAKKyAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG51bGxwdHI7CiAgICAgSlNWYWx1ZSB2
YWx1ZSA9IGV4ZWMtPnVuY2hlY2tlZEFyZ3VtZW50KDApOwotICAgIGlmICghdmFsdWUuaXNEb3Vi
bGUoKSkgewotICAgICAgICBkYXRhTG9nKCJJbnZhbGlkIGNvZGVCbG9jazogIiwgdmFsdWUsICJc
biIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBpZiAodmFsdWUuaXNDZWxsKCkpIHsK
KyAgICAgICAgSlNGdW5jdGlvbiogZnVuYyA9IGpzRHluYW1pY0Nhc3Q8SlNGdW5jdGlvbio+KHZh
bHVlLmFzQ2VsbCgpKTsKKyAgICAgICAgaWYgKGZ1bmMpIHsKKyAgICAgICAgICAgIEV4ZWN1dGFi
bGVCYXNlKiBleGVjdXRhYmxlID0gZnVuYy0+ZXhlY3V0YWJsZSgpOworICAgICAgICAgICAgaWYg
KGV4ZWN1dGFibGUtPmlzSG9zdEZ1bmN0aW9uKCkpCisgICAgICAgICAgICAgICAgY29kZUJsb2Nr
ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGV4ZWN1dGFibGUtPmlzRXZhbEV4ZWN1
dGFibGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFdmFsRXhl
Y3V0YWJsZSo+KGV4ZWN1dGFibGUpLT5jb2RlQmxvY2soKTsKKyAgICAgICAgICAgIGVsc2UgaWYg
KGV4ZWN1dGFibGUtPmlzRnVuY3Rpb25FeGVjdXRhYmxlKCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4oZXhlY3V0YWJsZSktPmVp
dGhlckNvZGVCbG9jaygpOworICAgICAgICAgICAgZWxzZSBpZiAoZXhlY3V0YWJsZS0+aXNQcm9n
cmFtRXhlY3V0YWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0
PFByb2dyYW1FeGVjdXRhYmxlKj4oZXhlY3V0YWJsZSktPmNvZGVCbG9jaygpOworICAgICAgICAg
ICAgZWxzZSBpZiAoZXhlY3V0YWJsZS0+aXNNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKj4oZXhlY3V0YWJsZSktPmNvZGVCbG9jaygpOworICAgICAgICB9CisgICAgfSBlbHNlIGlm
ICh2YWx1ZS5pc0RvdWJsZSgpKSB7CisgICAgICAgIGNvZGVCbG9jayA9IHJlaW50ZXJwcmV0X2Nh
c3Q8Q29kZUJsb2NrKj4oYml0d2lzZV9jYXN0PHVpbnQ2NF90Pih2YWx1ZS5hc0RvdWJsZSgpKSk7
CiAgICAgfQogCi0gICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSByZWludGVycHJldF9jYXN0PENv
ZGVCbG9jayo+KGJpdHdpc2VfY2FzdDx1aW50NjRfdD4odmFsdWUuYXNEb3VibGUoKSkpOwotICAg
IGlmIChKU0RvbGxhclZNUHJvdG90eXBlOjppc1ZhbGlkQ29kZUJsb2NrKGV4ZWMsIGNvZGVCbG9j
aykpCisgICAgaWYgKGNvZGVCbG9jayAmJiBKU0RvbGxhclZNUHJvdG90eXBlOjppc1ZhbGlkQ29k
ZUJsb2NrKGV4ZWMsIGNvZGVCbG9jaykpCiAgICAgICAgIHJldHVybiBjb2RlQmxvY2s7CiAKLSAg
ICBkYXRhTG9nRigiSW52YWxpZCBjb2RlQmxvY2s6ICVwICIsIGNvZGVCbG9jayk7Ci0gICAgZGF0
YUxvZyh2YWx1ZSwgIlxuIik7CisgICAgaWYgKGNvZGVCbG9jaykKKyAgICAgICAgZGF0YUxvZygi
SW52YWxpZCBjb2RlQmxvY2s6ICIsIFJhd1BvaW50ZXIoY29kZUJsb2NrKSwgIiAiLCB2YWx1ZSwg
IlxuIik7CisgICAgZWxzZQorICAgICAgICBkYXRhTG9nKCJJbnZhbGlkIGNvZGVCbG9jazogIiwg
dmFsdWUsICJcbiIpOwogICAgIHJldHVybiBudWxscHRyOwotICAgIAorfQorCitzdGF0aWMgRW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkNvZGVCbG9ja0ZvcihFeGVjU3RhdGUq
IGV4ZWMpCit7CisgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBjb2RlQmxvY2tGcm9tQXJnKGV4
ZWMpOworCisgICAgV1RGOjpTdHJpbmdQcmludFN0cmVhbSBzdHJlYW07CisgICAgaWYgKGNvZGVC
bG9jaykgeworICAgICAgICBzdHJlYW0ucHJpbnQoKmNvZGVCbG9jayk7CisgICAgICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUoanNTdHJpbmcoZXhlYywgc3RyZWFtLnRvU3RyaW5nKCkpKTsKKyAg
ICB9CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKIH0KIAogc3Rh
dGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25QcmludFNvdXJjZUZvcihF
eGVjU3RhdGUqIGV4ZWMpCkBAIC00MzIsNiArNDU5LDcgQEAgdm9pZCBKU0RvbGxhclZNUHJvdG90
eXBlOjpmaW5pc2hDcmVhdGlvbgogICAgIGFkZEZ1bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJn
YyIsIGZ1bmN0aW9uR0MsIDApOwogICAgIGFkZEZ1bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJl
ZGVuR0MiLCBmdW5jdGlvbkVkZW5HQywgMCk7CiAgICAgCisgICAgYWRkRnVuY3Rpb24odm0sIGds
b2JhbE9iamVjdCwgImNvZGVCbG9jayIsIGZ1bmN0aW9uQ29kZUJsb2NrRm9yLCAxKTsKICAgICBh
ZGRGdW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0LCAiY29kZUJsb2NrRm9yRnJhbWUiLCBmdW5jdGlv
bkNvZGVCbG9ja0ZvckZyYW1lLCAxKTsKICAgICBhZGRGdW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0
LCAicHJpbnRTb3VyY2VGb3IiLCBmdW5jdGlvblByaW50U291cmNlRm9yLCAxKTsKICAgICBhZGRG
dW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0LCAicHJpbnRCeXRlQ29kZUZvciIsIGZ1bmN0aW9uUHJp
bnRCeXRlQ29kZUZvciwgMSk7Cg==
</data>
<flag name="review"
          id="316216"
          type_id="1"
          status="-"
          setter="mark.lam"
    />
    <flag name="commit-queue"
          id="316217"
          type_id="3"
          status="-"
          setter="mark.lam"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293316</attachid>
            <date>2016-10-29 16:02:32 -0700</date>
            <delta_ts>2016-10-29 19:18:43 -0700</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-164192.patch</filename>
            <type>text/plain</type>
            <size>5322</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA4MTE2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBA
CisyMDE2LTEwLTI5ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBB
ZGQgJHZtLmNvZGVCbG9jaygpIGRlYnVnZ2luZyB1dGlsaXR5LgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY0MTkyCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU29tZXRpbWVzLCB3aGlsZSBkZWJ1Z2dpbmcs
IGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY2FuIGdldCB0aGUgY29kZUJsb2NrIGluZm8gZm9yCisg
ICAgICAgIGEgZnVuY3Rpb24uICBBbW9uZ3N0IG90aGVyIHVzZXMsIHRoaXMgaXMgdXNlZnVsIGZv
ciBjaGVja2luZyB3aGF0IG9wdGltaXphdGlvbgorICAgICAgICBsZXZlbCB0aGUgZnVuY3Rpb24g
aXMgY3VycmVudGx5IGF0LiAgV2l0aCAkdm0uY29kZUJsb2NrKCksIHdlIGNhbiBub3cgZG8gdGhp
cy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIHdoZW4gSlNfdXNlRG9sbGFyVk09dHJ1ZToKKworICAg
ICAgICAgICAgcHJpbnQoInRlc3QncyBjb2RlQmxvY2sgPSAiICsgJHZtLmNsYXNzQmxvY2sodGVz
dCkpOyAvLyBwcmludHMgZnVuY3Rpb24gdGVzdCdzIGNvZGVCbG9jay4KKworICAgICAgICAqIHRv
b2xzL0pTRG9sbGFyVk1Qcm90b3R5cGUuY3BwOgorICAgICAgICAoSlNDOjpjb2RlQmxvY2tGcm9t
VmFsdWUpOgorICAgICAgICAoSlNDOjpmdW5jdGlvbkNvZGVCbG9ja0Zvcik6CisgICAgICAgIChK
U0M6OmZ1bmN0aW9uUHJpbnRTb3VyY2VGb3IpOgorICAgICAgICAoSlNDOjpmdW5jdGlvblByaW50
Qnl0ZUNvZGVGb3IpOgorICAgICAgICAoSlNDOjpKU0RvbGxhclZNUHJvdG90eXBlOjpmaW5pc2hD
cmVhdGlvbik6CisgICAgICAgIChKU0M6OmNvZGVCbG9ja0Zyb21BcmcpOiBEZWxldGVkLgorCiAy
MDE2LTEwLTI4ICBKb3NlcGggUGVjb3Jhcm8gIDxwZWNvcmFyb0BhcHBsZS5jb20+CiAKICAgICAg
ICAgV2ViIEluc3BlY3RvcjogQnJlYWtwb2ludHMgbm90IHdvcmtpbmcgaW4gc2NyaXB0cyB3aXRo
IHVuaWNvZGUgY2hhcmFjdGVycwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Rvb2xzL0pT
RG9sbGFyVk1Qcm90b3R5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS90b29scy9KU0RvbGxhclZNUHJvdG90eXBlLmNwcAkocmV2aXNpb24gMjA4MTE2KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3Rvb2xzL0pTRG9sbGFyVk1Qcm90b3R5cGUuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNzAsMzAgKzI3MCw1OCBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hP
U1RfQ0FMTCBmdW5jCiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShKU1ZhbHVlKGJpdHdpc2Vf
Y2FzdDxkb3VibGU+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KGNvZGVCbG9jaykpKSk7CiB9
CiAKLXN0YXRpYyBDb2RlQmxvY2sqIGNvZGVCbG9ja0Zyb21BcmcoRXhlY1N0YXRlKiBleGVjKQor
c3RhdGljIENvZGVCbG9jayogY29kZUJsb2NrRnJvbVZhbHVlKEV4ZWNTdGF0ZSogZXhlYywgSlNW
YWx1ZSB2YWx1ZSkKIHsKICAgICBpZiAoZXhlYy0+YXJndW1lbnRDb3VudCgpIDwgMSkKICAgICAg
ICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBKU1ZhbHVlIHZhbHVlID0gZXhlYy0+dW5jaGVja2Vk
QXJndW1lbnQoMCk7Ci0gICAgaWYgKCF2YWx1ZS5pc0RvdWJsZSgpKSB7Ci0gICAgICAgIGRhdGFM
b2coIkludmFsaWQgY29kZUJsb2NrOiAiLCB2YWx1ZSwgIlxuIik7Ci0gICAgICAgIHJldHVybiBu
dWxscHRyOworICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gbnVsbHB0cjsKKyAgICBpZiAodmFs
dWUuaXNDZWxsKCkpIHsKKyAgICAgICAgSlNGdW5jdGlvbiogZnVuYyA9IGpzRHluYW1pY0Nhc3Q8
SlNGdW5jdGlvbio+KHZhbHVlLmFzQ2VsbCgpKTsKKyAgICAgICAgaWYgKGZ1bmMpIHsKKyAgICAg
ICAgICAgIEV4ZWN1dGFibGVCYXNlKiBleGVjdXRhYmxlID0gZnVuYy0+ZXhlY3V0YWJsZSgpOwor
ICAgICAgICAgICAgaWYgKGV4ZWN1dGFibGUtPmlzSG9zdEZ1bmN0aW9uKCkpCisgICAgICAgICAg
ICAgICAgY29kZUJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGV4ZWN1dGFi
bGUtPmlzRXZhbEV4ZWN1dGFibGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnBy
ZXRfY2FzdDxFdmFsRXhlY3V0YWJsZSo+KGV4ZWN1dGFibGUpLT5jb2RlQmxvY2soKTsKKyAgICAg
ICAgICAgIGVsc2UgaWYgKGV4ZWN1dGFibGUtPmlzRnVuY3Rpb25FeGVjdXRhYmxlKCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4o
ZXhlY3V0YWJsZSktPmVpdGhlckNvZGVCbG9jaygpOworICAgICAgICAgICAgZWxzZSBpZiAoZXhl
Y3V0YWJsZS0+aXNQcm9ncmFtRXhlY3V0YWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBy
ZWludGVycHJldF9jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oZXhlY3V0YWJsZSktPmNvZGVCbG9j
aygpOworICAgICAgICAgICAgZWxzZSBpZiAoZXhlY3V0YWJsZS0+aXNNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKj4oZXhlY3V0YWJsZSktPmNvZGVCbG9jaygpOworICAgICAgICB9
CisgICAgfSBlbHNlIGlmICh2YWx1ZS5pc0RvdWJsZSgpKSB7CisgICAgICAgIGNvZGVCbG9jayA9
IHJlaW50ZXJwcmV0X2Nhc3Q8Q29kZUJsb2NrKj4oYml0d2lzZV9jYXN0PHVpbnQ2NF90Pih2YWx1
ZS5hc0RvdWJsZSgpKSk7CiAgICAgfQogCi0gICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSByZWlu
dGVycHJldF9jYXN0PENvZGVCbG9jayo+KGJpdHdpc2VfY2FzdDx1aW50NjRfdD4odmFsdWUuYXNE
b3VibGUoKSkpOwotICAgIGlmIChKU0RvbGxhclZNUHJvdG90eXBlOjppc1ZhbGlkQ29kZUJsb2Nr
KGV4ZWMsIGNvZGVCbG9jaykpCisgICAgaWYgKGNvZGVCbG9jayAmJiBKU0RvbGxhclZNUHJvdG90
eXBlOjppc1ZhbGlkQ29kZUJsb2NrKGV4ZWMsIGNvZGVCbG9jaykpCiAgICAgICAgIHJldHVybiBj
b2RlQmxvY2s7CiAKLSAgICBkYXRhTG9nRigiSW52YWxpZCBjb2RlQmxvY2s6ICVwICIsIGNvZGVC
bG9jayk7Ci0gICAgZGF0YUxvZyh2YWx1ZSwgIlxuIik7CisgICAgaWYgKGNvZGVCbG9jaykKKyAg
ICAgICAgZGF0YUxvZygiSW52YWxpZCBjb2RlQmxvY2s6ICIsIFJhd1BvaW50ZXIoY29kZUJsb2Nr
KSwgIiAiLCB2YWx1ZSwgIlxuIik7CisgICAgZWxzZQorICAgICAgICBkYXRhTG9nKCJJbnZhbGlk
IGNvZGVCbG9jazogIiwgdmFsdWUsICJcbiIpOwogICAgIHJldHVybiBudWxscHRyOwotICAgIAor
fQorCitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkNvZGVCbG9j
a0ZvcihFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNWYWx1ZSB2YWx1ZSA9IGV4ZWMtPnVuY2hl
Y2tlZEFyZ3VtZW50KDApOworICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gY29kZUJsb2NrRnJv
bVZhbHVlKGV4ZWMsIHZhbHVlKTsKKworICAgIFdURjo6U3RyaW5nUHJpbnRTdHJlYW0gc3RyZWFt
OworICAgIGlmIChjb2RlQmxvY2spIHsKKyAgICAgICAgc3RyZWFtLnByaW50KCpjb2RlQmxvY2sp
OworICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzU3RyaW5nKGV4ZWMsIHN0cmVhbS50
b1N0cmluZygpKSk7CisgICAgfQorICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmlu
ZWQoKSk7CiB9CiAKIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9u
UHJpbnRTb3VyY2VGb3IoRXhlY1N0YXRlKiBleGVjKQogewotICAgIENvZGVCbG9jayogY29kZUJs
b2NrID0gY29kZUJsb2NrRnJvbUFyZyhleGVjKTsKKyAgICBKU1ZhbHVlIHZhbHVlID0gZXhlYy0+
dW5jaGVja2VkQXJndW1lbnQoMCk7CisgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBjb2RlQmxv
Y2tGcm9tVmFsdWUoZXhlYywgdmFsdWUpOwogICAgIGlmIChjb2RlQmxvY2spCiAgICAgICAgIGNv
ZGVCbG9jay0+ZHVtcFNvdXJjZSgpOwogICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRl
ZmluZWQoKSk7CkBAIC0zMDEsNyArMzI5LDggQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19I
T1NUX0NBTEwgZnVuYwogCiBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5j
dGlvblByaW50Qnl0ZUNvZGVGb3IoRXhlY1N0YXRlKiBleGVjKQogewotICAgIENvZGVCbG9jayog
Y29kZUJsb2NrID0gY29kZUJsb2NrRnJvbUFyZyhleGVjKTsKKyAgICBKU1ZhbHVlIHZhbHVlID0g
ZXhlYy0+dW5jaGVja2VkQXJndW1lbnQoMCk7CisgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBj
b2RlQmxvY2tGcm9tVmFsdWUoZXhlYywgdmFsdWUpOwogICAgIGlmIChjb2RlQmxvY2spCiAgICAg
ICAgIGNvZGVCbG9jay0+ZHVtcEJ5dGVjb2RlKCk7CiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29k
ZShqc1VuZGVmaW5lZCgpKTsKQEAgLTQzMiw2ICs0NjEsNyBAQCB2b2lkIEpTRG9sbGFyVk1Qcm90
b3R5cGU6OmZpbmlzaENyZWF0aW9uCiAgICAgYWRkRnVuY3Rpb24odm0sIGdsb2JhbE9iamVjdCwg
ImdjIiwgZnVuY3Rpb25HQywgMCk7CiAgICAgYWRkRnVuY3Rpb24odm0sIGdsb2JhbE9iamVjdCwg
ImVkZW5HQyIsIGZ1bmN0aW9uRWRlbkdDLCAwKTsKICAgICAKKyAgICBhZGRGdW5jdGlvbih2bSwg
Z2xvYmFsT2JqZWN0LCAiY29kZUJsb2NrIiwgZnVuY3Rpb25Db2RlQmxvY2tGb3IsIDEpOwogICAg
IGFkZEZ1bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJjb2RlQmxvY2tGb3JGcmFtZSIsIGZ1bmN0
aW9uQ29kZUJsb2NrRm9yRnJhbWUsIDEpOwogICAgIGFkZEZ1bmN0aW9uKHZtLCBnbG9iYWxPYmpl
Y3QsICJwcmludFNvdXJjZUZvciIsIGZ1bmN0aW9uUHJpbnRTb3VyY2VGb3IsIDEpOwogICAgIGFk
ZEZ1bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJwcmludEJ5dGVDb2RlRm9yIiwgZnVuY3Rpb25Q
cmludEJ5dGVDb2RlRm9yLCAxKTsK
</data>
<flag name="review"
          id="316218"
          type_id="1"
          status="-"
          setter="mark.lam"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293322</attachid>
            <date>2016-10-29 19:18:43 -0700</date>
            <delta_ts>2016-10-29 22:26:15 -0700</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-164192.patch</filename>
            <type>text/plain</type>
            <size>4690</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA4MTE3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBA
CisyMDE2LTEwLTI5ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBB
ZGQgJHZtLmNvZGVCbG9ja0ZvcigpIGRlYnVnZ2luZyB1dGlsaXR5LgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY0MTkyCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU29tZXRpbWVzLCB3aGlsZSBkZWJ1Z2dp
bmcsIGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY2FuIGdldCB0aGUgY29kZUJsb2NrIGluZm8gZm9y
CisgICAgICAgIGEgZnVuY3Rpb24uICBBbW9uZ3N0IG90aGVyIHVzZXMsIHRoaXMgaXMgdXNlZnVs
IGZvciBjaGVja2luZyB3aGF0IG9wdGltaXphdGlvbgorICAgICAgICBsZXZlbCB0aGUgZnVuY3Rp
b24gaXMgY3VycmVudGx5IGF0LiAgV2l0aCAkdm0uY29kZUJsb2NrRm9yKCksIHdlIGNhbiBub3cg
ZG8gdGhpcy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIHdoZW4gSlNfdXNlRG9sbGFyVk09dHJ1ZToK
KworICAgICAgICAgICAgcHJpbnQoInRlc3QncyBjb2RlQmxvY2sgPSAiICsgJHZtLmNvZGVCbG9j
a0Zvcih0ZXN0KSk7IC8vIHByaW50cyBmdW5jdGlvbiB0ZXN0J3MgY29kZUJsb2NrLgorCisgICAg
ICAgICogdG9vbHMvSlNEb2xsYXJWTVByb3RvdHlwZS5jcHA6CisgICAgICAgIChKU0M6OmZ1bmN0
aW9uQ29kZUJsb2NrRm9yRnJhbWUpOgorICAgICAgICAoSlNDOjpjb2RlQmxvY2tGcm9tQXJnKToK
KyAgICAgICAgKEpTQzo6ZnVuY3Rpb25Db2RlQmxvY2tGb3IpOgorICAgICAgICAoSlNDOjpKU0Rv
bGxhclZNUHJvdG90eXBlOjpmaW5pc2hDcmVhdGlvbik6CisKIDIwMTYtMTAtMjkgIFNhYW0gQmFy
YXRpICA8c2JhcmF0aUBhcHBsZS5jb20+CiAKICAgICAgICAgV2Ugc2hvdWxkIGhhdmUgYSB3YXkg
b2YgcHJvZmlsaW5nIHdoZW4gYSBnZXRfYnlfaWQgaXMgcHVyZSBhbmQgdG8gZW1pdCBhIFB1cmVH
ZXRCeUlkIGluIHRoZSBERkcvRlRMCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdG9vbHMv
SlNEb2xsYXJWTVByb3RvdHlwZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL3Rvb2xzL0pTRG9sbGFyVk1Qcm90b3R5cGUuY3BwCShyZXZpc2lvbiAyMDgxMTYpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvdG9vbHMvSlNEb2xsYXJWTVByb3RvdHlwZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI2Nyw3ICsyNjcsNyBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hP
U1RfQ0FMTCBmdW5jCiAgICAgLy8gZnVuY3Rpb24uCiAgICAgdW5zaWduZWQgZnJhbWVOdW1iZXIg
PSB2YWx1ZS5hc1VJbnQzMigpICsgMTsKICAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IEpTRG9s
bGFyVk1Qcm90b3R5cGU6OmNvZGVCbG9ja0ZvckZyYW1lKGV4ZWMsIGZyYW1lTnVtYmVyKTsKLSAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKEpTVmFsdWUoYml0d2lzZV9jYXN0PGRvdWJsZT4ocmVp
bnRlcnByZXRfY2FzdDx1aW50NjRfdD4oY29kZUJsb2NrKSkpKTsKKyAgICByZXR1cm4gSlNWYWx1
ZTo6ZW5jb2RlKEpTVmFsdWUoYml0d2lzZV9jYXN0PGRvdWJsZT4oY29kZUJsb2NrKSkpOwogfQog
CiBzdGF0aWMgQ29kZUJsb2NrKiBjb2RlQmxvY2tGcm9tQXJnKEV4ZWNTdGF0ZSogZXhlYykKQEAg
LTI3NiwxOSArMjc2LDQ1IEBAIHN0YXRpYyBDb2RlQmxvY2sqIGNvZGVCbG9ja0Zyb21BcmcoRXhl
Y1MKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICBKU1ZhbHVlIHZhbHVlID0gZXhlYy0+
dW5jaGVja2VkQXJndW1lbnQoMCk7Ci0gICAgaWYgKCF2YWx1ZS5pc0RvdWJsZSgpKSB7Ci0gICAg
ICAgIGRhdGFMb2coIkludmFsaWQgY29kZUJsb2NrOiAiLCB2YWx1ZSwgIlxuIik7Ci0gICAgICAg
IHJldHVybiBudWxscHRyOworICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gbnVsbHB0cjsKKyAg
ICBpZiAodmFsdWUuaXNDZWxsKCkpIHsKKyAgICAgICAgSlNGdW5jdGlvbiogZnVuYyA9IGpzRHlu
YW1pY0Nhc3Q8SlNGdW5jdGlvbio+KHZhbHVlLmFzQ2VsbCgpKTsKKyAgICAgICAgaWYgKGZ1bmMp
IHsKKyAgICAgICAgICAgIEV4ZWN1dGFibGVCYXNlKiBleGVjdXRhYmxlID0gZnVuYy0+ZXhlY3V0
YWJsZSgpOworICAgICAgICAgICAgaWYgKGV4ZWN1dGFibGUtPmlzSG9zdEZ1bmN0aW9uKCkpCisg
ICAgICAgICAgICAgICAgY29kZUJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVsc2UgaWYg
KGV4ZWN1dGFibGUtPmlzRXZhbEV4ZWN1dGFibGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDxFdmFsRXhlY3V0YWJsZSo+KGV4ZWN1dGFibGUpLT5jb2RlQmxvY2so
KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGV4ZWN1dGFibGUtPmlzRnVuY3Rpb25FeGVjdXRhYmxl
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY3Rpb25FeGVj
dXRhYmxlKj4oZXhlY3V0YWJsZSktPmVpdGhlckNvZGVCbG9jaygpOworICAgICAgICAgICAgZWxz
ZSBpZiAoZXhlY3V0YWJsZS0+aXNQcm9ncmFtRXhlY3V0YWJsZSgpKQorICAgICAgICAgICAgICAg
IHJldHVybiByZWludGVycHJldF9jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oZXhlY3V0YWJsZSkt
PmNvZGVCbG9jaygpOworICAgICAgICAgICAgZWxzZSBpZiAoZXhlY3V0YWJsZS0+aXNNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9j
YXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4oZXhlY3V0YWJsZSktPmNvZGVCbG9jaygpOwor
ICAgICAgICB9CisgICAgfSBlbHNlIGlmICh2YWx1ZS5pc0RvdWJsZSgpKSB7CisgICAgICAgIGNv
ZGVCbG9jayA9IGJpdHdpc2VfY2FzdDxDb2RlQmxvY2sqPih2YWx1ZS5hc0RvdWJsZSgpKTsKICAg
ICB9CiAKLSAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29kZUJs
b2NrKj4oYml0d2lzZV9jYXN0PHVpbnQ2NF90Pih2YWx1ZS5hc0RvdWJsZSgpKSk7Ci0gICAgaWYg
KEpTRG9sbGFyVk1Qcm90b3R5cGU6OmlzVmFsaWRDb2RlQmxvY2soZXhlYywgY29kZUJsb2NrKSkK
KyAgICBpZiAoY29kZUJsb2NrICYmIEpTRG9sbGFyVk1Qcm90b3R5cGU6OmlzVmFsaWRDb2RlQmxv
Y2soZXhlYywgY29kZUJsb2NrKSkKICAgICAgICAgcmV0dXJuIGNvZGVCbG9jazsKIAotICAgIGRh
dGFMb2dGKCJJbnZhbGlkIGNvZGVCbG9jazogJXAgIiwgY29kZUJsb2NrKTsKLSAgICBkYXRhTG9n
KHZhbHVlLCAiXG4iKTsKKyAgICBpZiAoY29kZUJsb2NrKQorICAgICAgICBkYXRhTG9nKCJJbnZh
bGlkIGNvZGVCbG9jazogIiwgUmF3UG9pbnRlcihjb2RlQmxvY2spLCAiICIsIHZhbHVlLCAiXG4i
KTsKKyAgICBlbHNlCisgICAgICAgIGRhdGFMb2coIkludmFsaWQgY29kZUJsb2NrOiAiLCB2YWx1
ZSwgIlxuIik7CiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgCit9CisKK3N0YXRpYyBFbmNvZGVk
SlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uQ29kZUJsb2NrRm9yKEV4ZWNTdGF0ZSogZXhl
YykKK3sKKyAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGNvZGVCbG9ja0Zyb21BcmcoZXhlYyk7
CisgICAgV1RGOjpTdHJpbmdQcmludFN0cmVhbSBzdHJlYW07CisgICAgaWYgKGNvZGVCbG9jaykg
eworICAgICAgICBzdHJlYW0ucHJpbnQoKmNvZGVCbG9jayk7CisgICAgICAgIHJldHVybiBKU1Zh
bHVlOjplbmNvZGUoanNTdHJpbmcoZXhlYywgc3RyZWFtLnRvU3RyaW5nKCkpKTsKKyAgICB9Cisg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKIH0KIAogc3RhdGljIEVu
Y29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25QcmludFNvdXJjZUZvcihFeGVjU3Rh
dGUqIGV4ZWMpCkBAIC00MzIsNiArNDU4LDcgQEAgdm9pZCBKU0RvbGxhclZNUHJvdG90eXBlOjpm
aW5pc2hDcmVhdGlvbgogICAgIGFkZEZ1bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJnYyIsIGZ1
bmN0aW9uR0MsIDApOwogICAgIGFkZEZ1bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJlZGVuR0Mi
LCBmdW5jdGlvbkVkZW5HQywgMCk7CiAgICAgCisgICAgYWRkRnVuY3Rpb24odm0sIGdsb2JhbE9i
amVjdCwgImNvZGVCbG9ja0ZvciIsIGZ1bmN0aW9uQ29kZUJsb2NrRm9yLCAxKTsKICAgICBhZGRG
dW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0LCAiY29kZUJsb2NrRm9yRnJhbWUiLCBmdW5jdGlvbkNv
ZGVCbG9ja0ZvckZyYW1lLCAxKTsKICAgICBhZGRGdW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0LCAi
cHJpbnRTb3VyY2VGb3IiLCBmdW5jdGlvblByaW50U291cmNlRm9yLCAxKTsKICAgICBhZGRGdW5j
dGlvbih2bSwgZ2xvYmFsT2JqZWN0LCAicHJpbnRCeXRlQ29kZUZvciIsIGZ1bmN0aW9uUHJpbnRC
eXRlQ29kZUZvciwgMSk7Cg==
</data>
<flag name="review"
          id="316223"
          type_id="1"
          status="-"
          setter="mark.lam"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293332</attachid>
            <date>2016-10-29 22:26:15 -0700</date>
            <delta_ts>2016-10-31 15:21:10 -0700</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-164192.patch</filename>
            <type>text/plain</type>
            <size>4666</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA4MTE3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBA
CisyMDE2LTEwLTI5ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBB
ZGQgJHZtLmNvZGVCbG9ja0ZvcigpIGRlYnVnZ2luZyB1dGlsaXR5LgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY0MTkyCisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU29tZXRpbWVzLCB3aGlsZSBkZWJ1Z2dp
bmcsIGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY2FuIGdldCB0aGUgY29kZUJsb2NrIGluZm8gZm9y
CisgICAgICAgIGEgZnVuY3Rpb24uICBBbW9uZ3N0IG90aGVyIHVzZXMsIHRoaXMgaXMgdXNlZnVs
IGZvciBjaGVja2luZyB3aGF0IG9wdGltaXphdGlvbgorICAgICAgICBsZXZlbCB0aGUgZnVuY3Rp
b24gaXMgY3VycmVudGx5IGF0LiAgV2l0aCAkdm0uY29kZUJsb2NrRm9yKCksIHdlIGNhbiBub3cg
ZG8gdGhpcy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIHdoZW4gSlNfdXNlRG9sbGFyVk09dHJ1ZToK
KworICAgICAgICAgICAgcHJpbnQoInRlc3QncyBjb2RlQmxvY2sgPSAiICsgJHZtLmNvZGVCbG9j
a0Zvcih0ZXN0KSk7IC8vIHByaW50cyBmdW5jdGlvbiB0ZXN0J3MgY29kZUJsb2NrLgorCisgICAg
ICAgIEFsc28gYWRkZWQgc29tZSBjb21tZW50cyB0byBjbGFyaWZ5IHNvbWUgcHJlLWV4aXN0aW5n
IGNvZGUuCisKKyAgICAgICAgKiB0b29scy9KU0RvbGxhclZNUHJvdG90eXBlLmNwcDoKKyAgICAg
ICAgKEpTQzo6ZnVuY3Rpb25Db2RlQmxvY2tGb3JGcmFtZSk6CisgICAgICAgIChKU0M6OmNvZGVC
bG9ja0Zyb21BcmcpOgorICAgICAgICAoSlNDOjpmdW5jdGlvbkNvZGVCbG9ja0Zvcik6CisgICAg
ICAgIChKU0M6OkpTRG9sbGFyVk1Qcm90b3R5cGU6OmZpbmlzaENyZWF0aW9uKToKKwogMjAxNi0x
MC0yOSAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KIAogICAgICAgICBXZSBzaG91
bGQgaGF2ZSBhIHdheSBvZiBwcm9maWxpbmcgd2hlbiBhIGdldF9ieV9pZCBpcyBwdXJlIGFuZCB0
byBlbWl0IGEgUHVyZUdldEJ5SWQgaW4gdGhlIERGRy9GVEwKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS90b29scy9KU0RvbGxhclZNUHJvdG90eXBlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvdG9vbHMvSlNEb2xsYXJWTVByb3RvdHlwZS5jcHAJKHJldmlzaW9u
IDIwODExNikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90b29scy9KU0RvbGxhclZNUHJvdG90
eXBlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjY3LDYgKzI2Nyw5IEBAIHN0YXRpYyBFbmNvZGVk
SlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmMKICAgICAvLyBmdW5jdGlvbi4KICAgICB1bnNpZ25l
ZCBmcmFtZU51bWJlciA9IHZhbHVlLmFzVUludDMyKCkgKyAxOwogICAgIENvZGVCbG9jayogY29k
ZUJsb2NrID0gSlNEb2xsYXJWTVByb3RvdHlwZTo6Y29kZUJsb2NrRm9yRnJhbWUoZXhlYywgZnJh
bWVOdW1iZXIpOworICAgIC8vIFRob3VnaCBDb2RlQmxvY2sgaXMgYSBKU0NlbGwsIGl0IGlzIG5v
dCBzYWZlIHRvIHJldHVybiBhIEpTQ2VsbCogdGhhdCBpcyBub3QgYSBKU09iamVjdCoKKyAgICAv
LyBiYWNrIHRvIEpTIGNvZGUuIEhlbmNlLCB3ZSBmaXJzdCBlbmNvZGUgdGhlIENvZGVCbG9jayog
YXMgYSBkb3VibGUgdG9rZW4gKHdoaWNoIGlzCisgICAgLy8gc2FmZSBmb3IgSlMgY29kZSB0byBo
YW5kbGUpIGJlZm9yZSByZXR1cm5pbmcgaXQuCiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShK
U1ZhbHVlKGJpdHdpc2VfY2FzdDxkb3VibGU+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KGNv
ZGVCbG9jaykpKSk7CiB9CiAKQEAgLTI3NiwxOSArMjc5LDQxIEBAIHN0YXRpYyBDb2RlQmxvY2sq
IGNvZGVCbG9ja0Zyb21BcmcoRXhlY1MKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICBK
U1ZhbHVlIHZhbHVlID0gZXhlYy0+dW5jaGVja2VkQXJndW1lbnQoMCk7Ci0gICAgaWYgKCF2YWx1
ZS5pc0RvdWJsZSgpKSB7Ci0gICAgICAgIGRhdGFMb2coIkludmFsaWQgY29kZUJsb2NrOiAiLCB2
YWx1ZSwgIlxuIik7Ci0gICAgICAgIHJldHVybiBudWxscHRyOworICAgIENvZGVCbG9jayogY2Fu
ZGlkYXRlQ29kZUJsb2NrID0gbnVsbHB0cjsKKyAgICBpZiAodmFsdWUuaXNDZWxsKCkpIHsKKyAg
ICAgICAgSlNGdW5jdGlvbiogZnVuYyA9IGpzRHluYW1pY0Nhc3Q8SlNGdW5jdGlvbio+KHZhbHVl
LmFzQ2VsbCgpKTsKKyAgICAgICAgaWYgKGZ1bmMpIHsKKyAgICAgICAgICAgIGlmIChmdW5jLT5p
c0hvc3RGdW5jdGlvbigpKQorICAgICAgICAgICAgICAgIGNhbmRpZGF0ZUNvZGVCbG9jayA9IG51
bGxwdHI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2FuZGlkYXRlQ29kZUJs
b2NrID0gZnVuYy0+anNFeGVjdXRhYmxlKCktPmVpdGhlckNvZGVCbG9jaygpOworICAgICAgICB9
CisgICAgfSBlbHNlIGlmICh2YWx1ZS5pc0RvdWJsZSgpKSB7CisgICAgICAgIC8vIElmIHRoZSB2
YWx1ZSBpcyBhIGRvdWJsZSwgaXQgbWF5IGJlIGFuIGVuY29kZWQgQ29kZUJsb2NrKiB0aGF0IGNh
bWUgZnJvbQorICAgICAgICAvLyAkdm0uY29kZUJsb2NrRm9yRnJhbWUoKS4gV2UnbGwgdHJlYXQg
aXQgYXMgYSBjYW5kaWRhdGUgY29kZUJsb2NrIGFuZCBjaGVjayBpZiBpdCdzCisgICAgICAgIC8v
IHZhbGlkIGJlbG93IGJlZm9yZSB1c2luZy4KKyAgICAgICAgY2FuZGlkYXRlQ29kZUJsb2NrID0g
cmVpbnRlcnByZXRfY2FzdDxDb2RlQmxvY2sqPihiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KHZhbHVl
LmFzRG91YmxlKCkpKTsKICAgICB9CiAKLSAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IHJlaW50
ZXJwcmV0X2Nhc3Q8Q29kZUJsb2NrKj4oYml0d2lzZV9jYXN0PHVpbnQ2NF90Pih2YWx1ZS5hc0Rv
dWJsZSgpKSk7Ci0gICAgaWYgKEpTRG9sbGFyVk1Qcm90b3R5cGU6OmlzVmFsaWRDb2RlQmxvY2so
ZXhlYywgY29kZUJsb2NrKSkKLSAgICAgICAgcmV0dXJuIGNvZGVCbG9jazsKKyAgICBpZiAoY2Fu
ZGlkYXRlQ29kZUJsb2NrICYmIEpTRG9sbGFyVk1Qcm90b3R5cGU6OmlzVmFsaWRDb2RlQmxvY2so
ZXhlYywgY2FuZGlkYXRlQ29kZUJsb2NrKSkKKyAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZUNvZGVC
bG9jazsKIAotICAgIGRhdGFMb2dGKCJJbnZhbGlkIGNvZGVCbG9jazogJXAgIiwgY29kZUJsb2Nr
KTsKLSAgICBkYXRhTG9nKHZhbHVlLCAiXG4iKTsKKyAgICBpZiAoY2FuZGlkYXRlQ29kZUJsb2Nr
KQorICAgICAgICBkYXRhTG9nKCJJbnZhbGlkIGNvZGVCbG9jazogIiwgUmF3UG9pbnRlcihjYW5k
aWRhdGVDb2RlQmxvY2spLCAiICIsIHZhbHVlLCAiXG4iKTsKKyAgICBlbHNlCisgICAgICAgIGRh
dGFMb2coIkludmFsaWQgY29kZUJsb2NrOiAiLCB2YWx1ZSwgIlxuIik7CiAgICAgcmV0dXJuIG51
bGxwdHI7Ci0gICAgCit9CisKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1
bmN0aW9uQ29kZUJsb2NrRm9yKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBDb2RlQmxvY2sqIGNv
ZGVCbG9jayA9IGNvZGVCbG9ja0Zyb21BcmcoZXhlYyk7CisgICAgV1RGOjpTdHJpbmdQcmludFN0
cmVhbSBzdHJlYW07CisgICAgaWYgKGNvZGVCbG9jaykgeworICAgICAgICBzdHJlYW0ucHJpbnQo
KmNvZGVCbG9jayk7CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNTdHJpbmcoZXhl
Yywgc3RyZWFtLnRvU3RyaW5nKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29k
ZShqc1VuZGVmaW5lZCgpKTsKIH0KIAogc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NB
TEwgZnVuY3Rpb25QcmludFNvdXJjZUZvcihFeGVjU3RhdGUqIGV4ZWMpCkBAIC00MzIsNiArNDU3
LDcgQEAgdm9pZCBKU0RvbGxhclZNUHJvdG90eXBlOjpmaW5pc2hDcmVhdGlvbgogICAgIGFkZEZ1
bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJnYyIsIGZ1bmN0aW9uR0MsIDApOwogICAgIGFkZEZ1
bmN0aW9uKHZtLCBnbG9iYWxPYmplY3QsICJlZGVuR0MiLCBmdW5jdGlvbkVkZW5HQywgMCk7CiAg
ICAgCisgICAgYWRkRnVuY3Rpb24odm0sIGdsb2JhbE9iamVjdCwgImNvZGVCbG9ja0ZvciIsIGZ1
bmN0aW9uQ29kZUJsb2NrRm9yLCAxKTsKICAgICBhZGRGdW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0
LCAiY29kZUJsb2NrRm9yRnJhbWUiLCBmdW5jdGlvbkNvZGVCbG9ja0ZvckZyYW1lLCAxKTsKICAg
ICBhZGRGdW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0LCAicHJpbnRTb3VyY2VGb3IiLCBmdW5jdGlv
blByaW50U291cmNlRm9yLCAxKTsKICAgICBhZGRGdW5jdGlvbih2bSwgZ2xvYmFsT2JqZWN0LCAi
cHJpbnRCeXRlQ29kZUZvciIsIGZ1bmN0aW9uUHJpbnRCeXRlQ29kZUZvciwgMSk7Cg==
</data>
<flag name="review"
          id="316231"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
      

    </bug>

</bugzilla>