<?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>44921</bug_id>
          
          <creation_ts>2010-08-30 18:42:59 -0700</creation_ts>
          <short_desc>audio engine: add AudioChannel files</short_desc>
          <delta_ts>2010-09-03 12:19:22 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris Rogers">crogers</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>japhet</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>271851</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 18:42:59 -0700</bug_when>
    <thetext>audio engine: add AudioChannel files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271852</commentid>
    <comment_count>1</comment_count>
      <attachid>65996</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 18:44:25 -0700</bug_when>
    <thetext>Created attachment 65996
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272560</commentid>
    <comment_count>2</comment_count>
      <attachid>65996</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-08-31 18:30:54 -0700</bug_when>
    <thetext>Comment on attachment 65996
Patch

Looks good overall, but r- because there&apos;s one place where there aren&apos;t enough assertions to catch a potential memory stomp.


&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 66445)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,25 @@
&gt; +2010-08-30  Chris Rogers  &lt;crogers@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        audio engine: add AudioChannel files
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=44921
&gt; +
&gt; +        No new tests since audio API is not yet implemented.
&gt; +
&gt; +        * platform/audio/AudioChannel.cpp: Added.
&gt; +        (WebCore::AudioChannel::scale):
&gt; +        (WebCore::AudioChannel::copyFrom):
&gt; +        (WebCore::AudioChannel::copyFromRange):
&gt; +        (WebCore::AudioChannel::sumFrom):
&gt; +        (WebCore::AudioChannel::maxAbsValue):
&gt; +        * platform/audio/AudioChannel.h: Added.
&gt; +        (WebCore::AudioChannel::AudioChannel):
&gt; +        (WebCore::AudioChannel::set):
&gt; +        (WebCore::AudioChannel::length):
&gt; +        (WebCore::AudioChannel::data):
&gt; +        (WebCore::AudioChannel::zero):
&gt; +
&gt;  2010-08-30  Adam Barth  &lt;abarth@webkit.org&gt;
&gt;  
&gt;          Reviewed by Eric Seidel.
&gt; Index: WebCore/platform/audio/AudioChannel.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/audio/AudioChannel.cpp	(revision 0)
&gt; +++ WebCore/platform/audio/AudioChannel.cpp	(revision 0)
&gt; @@ -0,0 +1,100 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +
&gt; +#if ENABLE(WEB_AUDIO)
&gt; +
&gt; +#include &quot;AudioChannel.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +#include &lt;math.h&gt;
&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +void AudioChannel::scale(double scale)
&gt; +{
&gt; +    float s = static_cast&lt;float&gt;(scale);
&gt; +    vsmul(data(), 1, &amp;s, data(), 1, length());
&gt; +}
&gt; +
&gt; +void AudioChannel::copyFrom(const AudioChannel* sourceChannel)
&gt; +{
&gt; +    bool isSafe = (sourceChannel &amp;&amp; sourceChannel-&gt;length() &gt;= length());
&gt; +    ASSERT(isSafe);
&gt; +    if (!isSafe)
&gt; +        return;
&gt; +
&gt; +    memcpy(data(), sourceChannel-&gt;data(), sizeof(float) * length());
&gt; +}
&gt; +
&gt; +void AudioChannel::copyFromRange(const AudioChannel* sourceChannel, unsigned startFrame, unsigned endFrame)
&gt; +{
&gt; +    // Sanity checking
&gt; +    bool isRangeSafe = sourceChannel &amp;&amp; startFrame &lt; endFrame &amp;&amp; endFrame &lt;= sourceChannel-&gt;length();
&gt; +    ASSERT(isRangeSafe);
&gt; +    if (!isRangeSafe)
&gt; +        return;
&gt; +
&gt; +    size_t rangeLength = endFrame - startFrame;

Where are the guarantees that this AudioChannel has enough storage to cover rangeLength * sizeof(float) bytes?

&gt; +
&gt; +    const float* source = sourceChannel-&gt;data();
&gt; +    float* destination = data();
&gt; +    memcpy(destination, source + startFrame, sizeof(float) * rangeLength);
&gt; +}
&gt; +
&gt; +void AudioChannel::sumFrom(const AudioChannel* sourceChannel)
&gt; +{
&gt; +    bool isSafe = sourceChannel &amp;&amp; sourceChannel-&gt;length() &gt;= length();
&gt; +    ASSERT(isSafe);
&gt; +    if (!isSafe)
&gt; +        return;
&gt; +
&gt; +    vadd(data(), 1, sourceChannel-&gt;data(), 1, data(), 1, length());
&gt; +}
&gt; +
&gt; +float AudioChannel::maxAbsValue() const
&gt; +{
&gt; +    const float* p = data();
&gt; +    int n = length();
&gt; +
&gt; +    float max = 0.0f;
&gt; +    while (n--) {
&gt; +        float value = *p++;
&gt; +        float absValue = fabsf(value);
&gt; +        if (absValue &gt; max)
&gt; +            max = absValue;

Could just write &quot;max = std::max(max, fabsf(*p++))&quot;.

&gt; +    }
&gt; +
&gt; +    return max;
&gt; +}
&gt; +
&gt; +} // WebCore
&gt; +
&gt; +#endif // ENABLE(WEB_AUDIO)
&gt; Index: WebCore/platform/audio/AudioChannel.h
&gt; ===================================================================
&gt; --- WebCore/platform/audio/AudioChannel.h	(revision 0)
&gt; +++ WebCore/platform/audio/AudioChannel.h	(revision 0)
&gt; @@ -0,0 +1,113 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef AudioChannel_h
&gt; +#define AudioChannel_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +#include &lt;wtf/Noncopyable.h&gt;
&gt; +#include &lt;wtf/PassOwnPtr.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +// An AudioChannel represents a buffer of non-interleaved floating-point audio samples.
&gt; +// The PCM samples are normally assumed to be in a nominal range -1.0 -&gt; +1.0
&gt; +class AudioChannel : public Noncopyable {
&gt; +public:
&gt; +    // Memory can be externally referenced, or can be internally allocated with an AudioFloatArray.
&gt; +
&gt; +    // Reference an external buffer.
&gt; +    AudioChannel(float* storage, size_t length)
&gt; +        : m_length(length), m_rawPointer(storage), m_memBuffer(0) { }

It&apos;s unnecessary to explicitly initialize m_memBuffer.

&gt; +
&gt; +    // Manage storage for us.
&gt; +    explicit AudioChannel(size_t length)
&gt; +        : m_length(length)
&gt; +        , m_rawPointer(0)
&gt; +    {
&gt; +        m_memBuffer = new AudioFloatArray(length);

adoptPtr(new AudioFloatArray(...))

&gt; +    }
&gt; +
&gt; +    // A &quot;blank&quot; audio channel -- must call set() before it&apos;s useful...
&gt; +    AudioChannel()
&gt; +        : m_length(0)
&gt; +        , m_rawPointer(0)
&gt; +        , m_memBuffer(0)

Unnecessary to initialize m_memBuffer explicitly.

&gt; +    {
&gt; +    }
&gt; +
&gt; +    // Redefine the memory for this channel.
&gt; +    // storage represents external memory not managed by this object.
&gt; +    void set(float* storage, size_t length)
&gt; +    {
&gt; +        m_memBuffer.clear(); // cleanup managed storage
&gt; +        m_rawPointer = storage;
&gt; +        m_length = length;
&gt; +    }
&gt; +
&gt; +    // How many sample-frames do we contain?
&gt; +    size_t length() const { return m_length; }
&gt; +
&gt; +    // Direct access to PCM sample data
&gt; +    float* data() { return m_rawPointer ? m_rawPointer : m_memBuffer-&gt;data(); }
&gt; +    const float* data() const { return m_rawPointer ? m_rawPointer : m_memBuffer-&gt;data(); }
&gt; +
&gt; +    // Zeroes out all sample values in buffer.
&gt; +    void zero()
&gt; +    {
&gt; +        if (m_memBuffer.get())
&gt; +            m_memBuffer-&gt;zero();
&gt; +        else
&gt; +            memset(m_rawPointer, 0, sizeof(float) * m_length);
&gt; +    }
&gt; +
&gt; +    // Scales all samples by the same amount.
&gt; +    void scale(double scale);
&gt; +
&gt; +    // A simple memcpy() from the source channel
&gt; +    void copyFrom(const AudioChannel* sourceChannel);
&gt; +
&gt; +    // Copies the given range from the source channel.
&gt; +    void copyFromRange(const AudioChannel* sourceChannel, unsigned startFrame, unsigned endFrame);
&gt; +
&gt; +    // Sums (with unity gain) from the source channel.
&gt; +    void sumFrom(const AudioChannel* sourceChannel);
&gt; +
&gt; +    // Returns maximum absolute value (useful for normalization).
&gt; +    float maxAbsValue() const;
&gt; +
&gt; +private:
&gt; +    size_t m_length;
&gt; +
&gt; +    float* m_rawPointer;
&gt; +    OwnPtr&lt;AudioFloatArray&gt; m_memBuffer;
&gt; +};
&gt; +
&gt; +} // WebCore
&gt; +
&gt; +#endif // AudioChannel_h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272923</commentid>
    <comment_count>3</comment_count>
      <attachid>66243</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-01 12:10:03 -0700</bug_when>
    <thetext>Created attachment 66243
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273154</commentid>
    <comment_count>4</comment_count>
      <attachid>66311</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-01 18:53:23 -0700</bug_when>
    <thetext>Created attachment 66311
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273649</commentid>
    <comment_count>5</comment_count>
      <attachid>66311</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-02 16:10:26 -0700</bug_when>
    <thetext>Comment on attachment 66311
Patch

Looks good. r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273707</commentid>
    <comment_count>6</comment_count>
      <attachid>66311</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-02 18:01:20 -0700</bug_when>
    <thetext>Comment on attachment 66311
Patch

Rejecting patch 66311 from commit-queue.

crogers@google.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/common/config/committers.py.

- If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.

- If you have committer rights please correct the error in WebKitTools/Scripts/webkitpy/common/config/committers.py by adding yourself to the file (no review needed).  The commit-queue restarts itself every 2 hours.  After restart the commit-queue will correctly respect your committer rights.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274113</commentid>
    <comment_count>7</comment_count>
      <attachid>66311</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-03 12:19:17 -0700</bug_when>
    <thetext>Comment on attachment 66311
Patch

Clearing flags on attachment: 66311

Committed r66758: &lt;http://trac.webkit.org/changeset/66758&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274114</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-03 12:19:22 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65996</attachid>
            <date>2010-08-30 18:44:25 -0700</date>
            <delta_ts>2010-09-01 12:09:59 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44921-20100830184423.patch</filename>
            <type>text/plain</type>
            <size>9032</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjQ0NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjUgQEAKKzIwMTAtMDgtMzAgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBh
dWRpbyBlbmdpbmU6IGFkZCBBdWRpb0NoYW5uZWwgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0OTIxCisKKyAgICAgICAgTm8gbmV3IHRlc3Rz
IHNpbmNlIGF1ZGlvIEFQSSBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorCisgICAgICAgICogcGxh
dGZvcm0vYXVkaW8vQXVkaW9DaGFubmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NoYW5uZWw6OnNjYWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ2hhbm5lbDo6Y29w
eUZyb20pOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9DaGFubmVsOjpjb3B5RnJvbVJhbmdlKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ2hhbm5lbDo6c3VtRnJvbSk6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0NoYW5uZWw6Om1heEFic1ZhbHVlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRp
by9BdWRpb0NoYW5uZWwuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6
OkF1ZGlvQ2hhbm5lbCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6OnNldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NoYW5uZWw6OmRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9DaGFubmVsOjp6
ZXJvKToKKwogMjAxMC0wOC0zMCAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9h
dWRpby9BdWRpb0NoYW5uZWwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vQXVkaW9DaGFubmVsLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vQXVkaW9DaGFubmVsLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVy
LCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICog
ICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisjaW5jbHVkZSAiQXVk
aW9DaGFubmVsLmgiCisKKyNpbmNsdWRlICJBY2NlbGVyYXRlLmgiCisjaW5jbHVkZSA8bWF0aC5o
PgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lk
IEF1ZGlvQ2hhbm5lbDo6c2NhbGUoZG91YmxlIHNjYWxlKQoreworICAgIGZsb2F0IHMgPSBzdGF0
aWNfY2FzdDxmbG9hdD4oc2NhbGUpOworICAgIHZzbXVsKGRhdGEoKSwgMSwgJnMsIGRhdGEoKSwg
MSwgbGVuZ3RoKCkpOworfQorCit2b2lkIEF1ZGlvQ2hhbm5lbDo6Y29weUZyb20oY29uc3QgQXVk
aW9DaGFubmVsKiBzb3VyY2VDaGFubmVsKQoreworICAgIGJvb2wgaXNTYWZlID0gKHNvdXJjZUNo
YW5uZWwgJiYgc291cmNlQ2hhbm5lbC0+bGVuZ3RoKCkgPj0gbGVuZ3RoKCkpOworICAgIEFTU0VS
VChpc1NhZmUpOworICAgIGlmICghaXNTYWZlKQorICAgICAgICByZXR1cm47CisKKyAgICBtZW1j
cHkoZGF0YSgpLCBzb3VyY2VDaGFubmVsLT5kYXRhKCksIHNpemVvZihmbG9hdCkgKiBsZW5ndGgo
KSk7Cit9CisKK3ZvaWQgQXVkaW9DaGFubmVsOjpjb3B5RnJvbVJhbmdlKGNvbnN0IEF1ZGlvQ2hh
bm5lbCogc291cmNlQ2hhbm5lbCwgdW5zaWduZWQgc3RhcnRGcmFtZSwgdW5zaWduZWQgZW5kRnJh
bWUpCit7CisgICAgLy8gU2FuaXR5IGNoZWNraW5nCisgICAgYm9vbCBpc1JhbmdlU2FmZSA9IHNv
dXJjZUNoYW5uZWwgJiYgc3RhcnRGcmFtZSA8IGVuZEZyYW1lICYmIGVuZEZyYW1lIDw9IHNvdXJj
ZUNoYW5uZWwtPmxlbmd0aCgpOworICAgIEFTU0VSVChpc1JhbmdlU2FmZSk7CisgICAgaWYgKCFp
c1JhbmdlU2FmZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2l6ZV90IHJhbmdlTGVuZ3RoID0g
ZW5kRnJhbWUgLSBzdGFydEZyYW1lOworCisgICAgY29uc3QgZmxvYXQqIHNvdXJjZSA9IHNvdXJj
ZUNoYW5uZWwtPmRhdGEoKTsKKyAgICBmbG9hdCogZGVzdGluYXRpb24gPSBkYXRhKCk7CisgICAg
bWVtY3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UgKyBzdGFydEZyYW1lLCBzaXplb2YoZmxvYXQpICog
cmFuZ2VMZW5ndGgpOworfQorCit2b2lkIEF1ZGlvQ2hhbm5lbDo6c3VtRnJvbShjb25zdCBBdWRp
b0NoYW5uZWwqIHNvdXJjZUNoYW5uZWwpCit7CisgICAgYm9vbCBpc1NhZmUgPSBzb3VyY2VDaGFu
bmVsICYmIHNvdXJjZUNoYW5uZWwtPmxlbmd0aCgpID49IGxlbmd0aCgpOworICAgIEFTU0VSVChp
c1NhZmUpOworICAgIGlmICghaXNTYWZlKQorICAgICAgICByZXR1cm47CisKKyAgICB2YWRkKGRh
dGEoKSwgMSwgc291cmNlQ2hhbm5lbC0+ZGF0YSgpLCAxLCBkYXRhKCksIDEsIGxlbmd0aCgpKTsK
K30KKworZmxvYXQgQXVkaW9DaGFubmVsOjptYXhBYnNWYWx1ZSgpIGNvbnN0Cit7CisgICAgY29u
c3QgZmxvYXQqIHAgPSBkYXRhKCk7CisgICAgaW50IG4gPSBsZW5ndGgoKTsKKworICAgIGZsb2F0
IG1heCA9IDAuMGY7CisgICAgd2hpbGUgKG4tLSkgeworICAgICAgICBmbG9hdCB2YWx1ZSA9ICpw
Kys7CisgICAgICAgIGZsb2F0IGFic1ZhbHVlID0gZmFic2YodmFsdWUpOworICAgICAgICBpZiAo
YWJzVmFsdWUgPiBtYXgpCisgICAgICAgICAgICBtYXggPSBhYnNWYWx1ZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gbWF4OworfQorCit9IC8vIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJf
QVVESU8pCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQ2hhbm5lbC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9DaGFubmVsLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQ2hhbm5lbC5oCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQXVkaW9DaGFubmVsX2gKKyNkZWZpbmUgQXVk
aW9DaGFubmVsX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorI2luY2x1ZGUgPHd0
Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworLy8gQW4gQXVkaW9DaGFubmVsIHJlcHJlc2VudHMgYSBidWZmZXIgb2Yg
bm9uLWludGVybGVhdmVkIGZsb2F0aW5nLXBvaW50IGF1ZGlvIHNhbXBsZXMuCisvLyBUaGUgUENN
IHNhbXBsZXMgYXJlIG5vcm1hbGx5IGFzc3VtZWQgdG8gYmUgaW4gYSBub21pbmFsIHJhbmdlIC0x
LjAgLT4gKzEuMAorY2xhc3MgQXVkaW9DaGFubmVsIDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1
YmxpYzoKKyAgICAvLyBNZW1vcnkgY2FuIGJlIGV4dGVybmFsbHkgcmVmZXJlbmNlZCwgb3IgY2Fu
IGJlIGludGVybmFsbHkgYWxsb2NhdGVkIHdpdGggYW4gQXVkaW9GbG9hdEFycmF5LgorCisgICAg
Ly8gUmVmZXJlbmNlIGFuIGV4dGVybmFsIGJ1ZmZlci4KKyAgICBBdWRpb0NoYW5uZWwoZmxvYXQq
IHN0b3JhZ2UsIHNpemVfdCBsZW5ndGgpCisgICAgICAgIDogbV9sZW5ndGgobGVuZ3RoKSwgbV9y
YXdQb2ludGVyKHN0b3JhZ2UpLCBtX21lbUJ1ZmZlcigwKSB7IH0KKworICAgIC8vIE1hbmFnZSBz
dG9yYWdlIGZvciB1cy4KKyAgICBleHBsaWNpdCBBdWRpb0NoYW5uZWwoc2l6ZV90IGxlbmd0aCkK
KyAgICAgICAgOiBtX2xlbmd0aChsZW5ndGgpCisgICAgICAgICwgbV9yYXdQb2ludGVyKDApCisg
ICAgeworICAgICAgICBtX21lbUJ1ZmZlciA9IG5ldyBBdWRpb0Zsb2F0QXJyYXkobGVuZ3RoKTsK
KyAgICB9CisKKyAgICAvLyBBICJibGFuayIgYXVkaW8gY2hhbm5lbCAtLSBtdXN0IGNhbGwgc2V0
KCkgYmVmb3JlIGl0J3MgdXNlZnVsLi4uCisgICAgQXVkaW9DaGFubmVsKCkKKyAgICAgICAgOiBt
X2xlbmd0aCgwKQorICAgICAgICAsIG1fcmF3UG9pbnRlcigwKQorICAgICAgICAsIG1fbWVtQnVm
ZmVyKDApCisgICAgeworICAgIH0KKworICAgIC8vIFJlZGVmaW5lIHRoZSBtZW1vcnkgZm9yIHRo
aXMgY2hhbm5lbC4KKyAgICAvLyBzdG9yYWdlIHJlcHJlc2VudHMgZXh0ZXJuYWwgbWVtb3J5IG5v
dCBtYW5hZ2VkIGJ5IHRoaXMgb2JqZWN0LgorICAgIHZvaWQgc2V0KGZsb2F0KiBzdG9yYWdlLCBz
aXplX3QgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgbV9tZW1CdWZmZXIuY2xlYXIoKTsgLy8gY2xl
YW51cCBtYW5hZ2VkIHN0b3JhZ2UKKyAgICAgICAgbV9yYXdQb2ludGVyID0gc3RvcmFnZTsKKyAg
ICAgICAgbV9sZW5ndGggPSBsZW5ndGg7CisgICAgfQorCisgICAgLy8gSG93IG1hbnkgc2FtcGxl
LWZyYW1lcyBkbyB3ZSBjb250YWluPworICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVy
biBtX2xlbmd0aDsgfQorCisgICAgLy8gRGlyZWN0IGFjY2VzcyB0byBQQ00gc2FtcGxlIGRhdGEK
KyAgICBmbG9hdCogZGF0YSgpIHsgcmV0dXJuIG1fcmF3UG9pbnRlciA/IG1fcmF3UG9pbnRlciA6
IG1fbWVtQnVmZmVyLT5kYXRhKCk7IH0KKyAgICBjb25zdCBmbG9hdCogZGF0YSgpIGNvbnN0IHsg
cmV0dXJuIG1fcmF3UG9pbnRlciA/IG1fcmF3UG9pbnRlciA6IG1fbWVtQnVmZmVyLT5kYXRhKCk7
IH0KKworICAgIC8vIFplcm9lcyBvdXQgYWxsIHNhbXBsZSB2YWx1ZXMgaW4gYnVmZmVyLgorICAg
IHZvaWQgemVybygpCisgICAgeworICAgICAgICBpZiAobV9tZW1CdWZmZXIuZ2V0KCkpCisgICAg
ICAgICAgICBtX21lbUJ1ZmZlci0+emVybygpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBt
ZW1zZXQobV9yYXdQb2ludGVyLCAwLCBzaXplb2YoZmxvYXQpICogbV9sZW5ndGgpOworICAgIH0K
KworICAgIC8vIFNjYWxlcyBhbGwgc2FtcGxlcyBieSB0aGUgc2FtZSBhbW91bnQuCisgICAgdm9p
ZCBzY2FsZShkb3VibGUgc2NhbGUpOworCisgICAgLy8gQSBzaW1wbGUgbWVtY3B5KCkgZnJvbSB0
aGUgc291cmNlIGNoYW5uZWwKKyAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IEF1ZGlvQ2hhbm5lbCog
c291cmNlQ2hhbm5lbCk7CisKKyAgICAvLyBDb3BpZXMgdGhlIGdpdmVuIHJhbmdlIGZyb20gdGhl
IHNvdXJjZSBjaGFubmVsLgorICAgIHZvaWQgY29weUZyb21SYW5nZShjb25zdCBBdWRpb0NoYW5u
ZWwqIHNvdXJjZUNoYW5uZWwsIHVuc2lnbmVkIHN0YXJ0RnJhbWUsIHVuc2lnbmVkIGVuZEZyYW1l
KTsKKworICAgIC8vIFN1bXMgKHdpdGggdW5pdHkgZ2FpbikgZnJvbSB0aGUgc291cmNlIGNoYW5u
ZWwuCisgICAgdm9pZCBzdW1Gcm9tKGNvbnN0IEF1ZGlvQ2hhbm5lbCogc291cmNlQ2hhbm5lbCk7
CisKKyAgICAvLyBSZXR1cm5zIG1heGltdW0gYWJzb2x1dGUgdmFsdWUgKHVzZWZ1bCBmb3Igbm9y
bWFsaXphdGlvbikuCisgICAgZmxvYXQgbWF4QWJzVmFsdWUoKSBjb25zdDsKKworcHJpdmF0ZToK
KyAgICBzaXplX3QgbV9sZW5ndGg7CisKKyAgICBmbG9hdCogbV9yYXdQb2ludGVyOworICAgIE93
blB0cjxBdWRpb0Zsb2F0QXJyYXk+IG1fbWVtQnVmZmVyOworfTsKKworfSAvLyBXZWJDb3JlCisK
KyNlbmRpZiAvLyBBdWRpb0NoYW5uZWxfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66243</attachid>
            <date>2010-09-01 12:10:03 -0700</date>
            <delta_ts>2010-09-01 18:53:20 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44921-20100901121001.patch</filename>
            <type>text/plain</type>
            <size>9202</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjYxMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjUgQEAKKzIwMTAtMDktMDEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBh
dWRpbyBlbmdpbmU6IGFkZCBBdWRpb0NoYW5uZWwgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0OTIxCisKKyAgICAgICAgTm8gbmV3IHRlc3Rz
IHNpbmNlIGF1ZGlvIEFQSSBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorCisgICAgICAgICogcGxh
dGZvcm0vYXVkaW8vQXVkaW9DaGFubmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NoYW5uZWw6OnNjYWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ2hhbm5lbDo6Y29w
eUZyb20pOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9DaGFubmVsOjpjb3B5RnJvbVJhbmdlKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ2hhbm5lbDo6c3VtRnJvbSk6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0NoYW5uZWw6Om1heEFic1ZhbHVlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRp
by9BdWRpb0NoYW5uZWwuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6
OkF1ZGlvQ2hhbm5lbCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6OnNldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NoYW5uZWw6OmRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9DaGFubmVsOjp6
ZXJvKToKKwogMjAxMC0wOS0wMSAgRGF2ZSBIeWF0dCAgPGh5YXR0QGFwcGxlLmNvbT4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluIGFuZCBTaW1vbiBGcmFzZXIuCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQ2hhbm5lbC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0NoYW5uZWwuY3BwCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0NoYW5uZWwuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfQVVESU8p
CisKKyNpbmNsdWRlICJBdWRpb0NoYW5uZWwuaCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIK
KyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9P
d25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEF1ZGlvQ2hhbm5lbDo6c2Nh
bGUoZG91YmxlIHNjYWxlKQoreworICAgIGZsb2F0IHMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oc2Nh
bGUpOworICAgIHZzbXVsKGRhdGEoKSwgMSwgJnMsIGRhdGEoKSwgMSwgbGVuZ3RoKCkpOworfQor
Cit2b2lkIEF1ZGlvQ2hhbm5lbDo6Y29weUZyb20oY29uc3QgQXVkaW9DaGFubmVsKiBzb3VyY2VD
aGFubmVsKQoreworICAgIGJvb2wgaXNTYWZlID0gKHNvdXJjZUNoYW5uZWwgJiYgc291cmNlQ2hh
bm5lbC0+bGVuZ3RoKCkgPj0gbGVuZ3RoKCkpOworICAgIEFTU0VSVChpc1NhZmUpOworICAgIGlm
ICghaXNTYWZlKQorICAgICAgICByZXR1cm47CisKKyAgICBtZW1jcHkoZGF0YSgpLCBzb3VyY2VD
aGFubmVsLT5kYXRhKCksIHNpemVvZihmbG9hdCkgKiBsZW5ndGgoKSk7Cit9CisKK3ZvaWQgQXVk
aW9DaGFubmVsOjpjb3B5RnJvbVJhbmdlKGNvbnN0IEF1ZGlvQ2hhbm5lbCogc291cmNlQ2hhbm5l
bCwgdW5zaWduZWQgc3RhcnRGcmFtZSwgdW5zaWduZWQgZW5kRnJhbWUpCit7CisgICAgLy8gQ2hl
Y2sgdGhhdCByYW5nZSBpcyBzYWZlIGZvciByZWFkaW5nIGZyb20gc291cmNlQ2hhbm5lbC4KKyAg
ICBib29sIGlzUmFuZ2VTYWZlID0gc291cmNlQ2hhbm5lbCAmJiBzdGFydEZyYW1lIDwgZW5kRnJh
bWUgJiYgZW5kRnJhbWUgPD0gc291cmNlQ2hhbm5lbC0+bGVuZ3RoKCk7CisgICAgQVNTRVJUKGlz
UmFuZ2VTYWZlKTsKKyAgICBpZiAoIWlzUmFuZ2VTYWZlKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBDaGVjayB0aGF0IHRoaXMgY2hhbm5lbCBoYXMgZW5vdWdoIHNwYWNlLgorICAgIHNpemVf
dCByYW5nZUxlbmd0aCA9IGVuZEZyYW1lIC0gc3RhcnRGcmFtZTsKKyAgICBib29sIGlzUmFuZ2VM
ZW5ndGhTYWZlID0gcmFuZ2VMZW5ndGggPD0gbGVuZ3RoKCk7CisgICAgQVNTRVJUKGlzUmFuZ2VM
ZW5ndGhTYWZlKTsKKyAgICBpZiAoIWlzUmFuZ2VMZW5ndGhTYWZlKQorICAgICAgICByZXR1cm47
CisKKyAgICBjb25zdCBmbG9hdCogc291cmNlID0gc291cmNlQ2hhbm5lbC0+ZGF0YSgpOworICAg
IGZsb2F0KiBkZXN0aW5hdGlvbiA9IGRhdGEoKTsKKyAgICBtZW1jcHkoZGVzdGluYXRpb24sIHNv
dXJjZSArIHN0YXJ0RnJhbWUsIHNpemVvZihmbG9hdCkgKiByYW5nZUxlbmd0aCk7Cit9CisKK3Zv
aWQgQXVkaW9DaGFubmVsOjpzdW1Gcm9tKGNvbnN0IEF1ZGlvQ2hhbm5lbCogc291cmNlQ2hhbm5l
bCkKK3sKKyAgICBib29sIGlzU2FmZSA9IHNvdXJjZUNoYW5uZWwgJiYgc291cmNlQ2hhbm5lbC0+
bGVuZ3RoKCkgPj0gbGVuZ3RoKCk7CisgICAgQVNTRVJUKGlzU2FmZSk7CisgICAgaWYgKCFpc1Nh
ZmUpCisgICAgICAgIHJldHVybjsKKworICAgIHZhZGQoZGF0YSgpLCAxLCBzb3VyY2VDaGFubmVs
LT5kYXRhKCksIDEsIGRhdGEoKSwgMSwgbGVuZ3RoKCkpOworfQorCitmbG9hdCBBdWRpb0NoYW5u
ZWw6Om1heEFic1ZhbHVlKCkgY29uc3QKK3sKKyAgICBjb25zdCBmbG9hdCogcCA9IGRhdGEoKTsK
KyAgICBpbnQgbiA9IGxlbmd0aCgpOworCisgICAgZmxvYXQgbWF4ID0gMC4wZjsKKyAgICB3aGls
ZSAobi0tKQorICAgICAgICBtYXggPSBzdGQ6Om1heChtYXgsIGZhYnNmKCpwKyspKTsKKworICAg
IHJldHVybiBtYXg7Cit9CisKK30gLy8gV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQl9B
VURJTykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9DaGFubmVsLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0NoYW5uZWwuaAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9DaGFubmVsLmgJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBv
ZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBBdWRpb0NoYW5uZWxfaAorI2RlZmluZSBBdWRp
b0NoYW5uZWxfaAorCisjaW5jbHVkZSAiQXVkaW9GbG9hdEFycmF5LmgiCisjaW5jbHVkZSA8d3Rm
L05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCisvLyBBbiBBdWRpb0NoYW5uZWwgcmVwcmVzZW50cyBhIGJ1ZmZlciBvZiBu
b24taW50ZXJsZWF2ZWQgZmxvYXRpbmctcG9pbnQgYXVkaW8gc2FtcGxlcy4KKy8vIFRoZSBQQ00g
c2FtcGxlcyBhcmUgbm9ybWFsbHkgYXNzdW1lZCB0byBiZSBpbiBhIG5vbWluYWwgcmFuZ2UgLTEu
MCAtPiArMS4wCitjbGFzcyBBdWRpb0NoYW5uZWwgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVi
bGljOgorICAgIC8vIE1lbW9yeSBjYW4gYmUgZXh0ZXJuYWxseSByZWZlcmVuY2VkLCBvciBjYW4g
YmUgaW50ZXJuYWxseSBhbGxvY2F0ZWQgd2l0aCBhbiBBdWRpb0Zsb2F0QXJyYXkuCisKKyAgICAv
LyBSZWZlcmVuY2UgYW4gZXh0ZXJuYWwgYnVmZmVyLgorICAgIEF1ZGlvQ2hhbm5lbChmbG9hdCog
c3RvcmFnZSwgc2l6ZV90IGxlbmd0aCkKKyAgICAgICAgOiBtX2xlbmd0aChsZW5ndGgpLCBtX3Jh
d1BvaW50ZXIoc3RvcmFnZSksIG1fbWVtQnVmZmVyKDApIHsgfQorCisgICAgLy8gTWFuYWdlIHN0
b3JhZ2UgZm9yIHVzLgorICAgIGV4cGxpY2l0IEF1ZGlvQ2hhbm5lbChzaXplX3QgbGVuZ3RoKQor
ICAgICAgICA6IG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAgICAgLCBtX3Jhd1BvaW50ZXIoMCkKKyAg
ICB7CisgICAgICAgIG1fbWVtQnVmZmVyID0gbmV3IEF1ZGlvRmxvYXRBcnJheShsZW5ndGgpOwor
ICAgIH0KKworICAgIC8vIEEgImJsYW5rIiBhdWRpbyBjaGFubmVsIC0tIG11c3QgY2FsbCBzZXQo
KSBiZWZvcmUgaXQncyB1c2VmdWwuLi4KKyAgICBBdWRpb0NoYW5uZWwoKQorICAgICAgICA6IG1f
bGVuZ3RoKDApCisgICAgICAgICwgbV9yYXdQb2ludGVyKDApCisgICAgICAgICwgbV9tZW1CdWZm
ZXIoMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gUmVkZWZpbmUgdGhlIG1lbW9yeSBmb3IgdGhp
cyBjaGFubmVsLgorICAgIC8vIHN0b3JhZ2UgcmVwcmVzZW50cyBleHRlcm5hbCBtZW1vcnkgbm90
IG1hbmFnZWQgYnkgdGhpcyBvYmplY3QuCisgICAgdm9pZCBzZXQoZmxvYXQqIHN0b3JhZ2UsIHNp
emVfdCBsZW5ndGgpCisgICAgeworICAgICAgICBtX21lbUJ1ZmZlci5jbGVhcigpOyAvLyBjbGVh
bnVwIG1hbmFnZWQgc3RvcmFnZQorICAgICAgICBtX3Jhd1BvaW50ZXIgPSBzdG9yYWdlOworICAg
ICAgICBtX2xlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBIb3cgbWFueSBzYW1wbGUt
ZnJhbWVzIGRvIHdlIGNvbnRhaW4/CisgICAgc2l6ZV90IGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJu
IG1fbGVuZ3RoOyB9CisKKyAgICAvLyBEaXJlY3QgYWNjZXNzIHRvIFBDTSBzYW1wbGUgZGF0YQor
ICAgIGZsb2F0KiBkYXRhKCkgeyByZXR1cm4gbV9yYXdQb2ludGVyID8gbV9yYXdQb2ludGVyIDog
bV9tZW1CdWZmZXItPmRhdGEoKTsgfQorICAgIGNvbnN0IGZsb2F0KiBkYXRhKCkgY29uc3QgeyBy
ZXR1cm4gbV9yYXdQb2ludGVyID8gbV9yYXdQb2ludGVyIDogbV9tZW1CdWZmZXItPmRhdGEoKTsg
fQorCisgICAgLy8gWmVyb2VzIG91dCBhbGwgc2FtcGxlIHZhbHVlcyBpbiBidWZmZXIuCisgICAg
dm9pZCB6ZXJvKCkKKyAgICB7CisgICAgICAgIGlmIChtX21lbUJ1ZmZlci5nZXQoKSkKKyAgICAg
ICAgICAgIG1fbWVtQnVmZmVyLT56ZXJvKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1l
bXNldChtX3Jhd1BvaW50ZXIsIDAsIHNpemVvZihmbG9hdCkgKiBtX2xlbmd0aCk7CisgICAgfQor
CisgICAgLy8gU2NhbGVzIGFsbCBzYW1wbGVzIGJ5IHRoZSBzYW1lIGFtb3VudC4KKyAgICB2b2lk
IHNjYWxlKGRvdWJsZSBzY2FsZSk7CisKKyAgICAvLyBBIHNpbXBsZSBtZW1jcHkoKSBmcm9tIHRo
ZSBzb3VyY2UgY2hhbm5lbAorICAgIHZvaWQgY29weUZyb20oY29uc3QgQXVkaW9DaGFubmVsKiBz
b3VyY2VDaGFubmVsKTsKKworICAgIC8vIENvcGllcyB0aGUgZ2l2ZW4gcmFuZ2UgZnJvbSB0aGUg
c291cmNlIGNoYW5uZWwuCisgICAgdm9pZCBjb3B5RnJvbVJhbmdlKGNvbnN0IEF1ZGlvQ2hhbm5l
bCogc291cmNlQ2hhbm5lbCwgdW5zaWduZWQgc3RhcnRGcmFtZSwgdW5zaWduZWQgZW5kRnJhbWUp
OworCisgICAgLy8gU3VtcyAod2l0aCB1bml0eSBnYWluKSBmcm9tIHRoZSBzb3VyY2UgY2hhbm5l
bC4KKyAgICB2b2lkIHN1bUZyb20oY29uc3QgQXVkaW9DaGFubmVsKiBzb3VyY2VDaGFubmVsKTsK
KworICAgIC8vIFJldHVybnMgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSAodXNlZnVsIGZvciBub3Jt
YWxpemF0aW9uKS4KKyAgICBmbG9hdCBtYXhBYnNWYWx1ZSgpIGNvbnN0OworCitwcml2YXRlOgor
ICAgIHNpemVfdCBtX2xlbmd0aDsKKworICAgIGZsb2F0KiBtX3Jhd1BvaW50ZXI7CisgICAgT3du
UHRyPEF1ZGlvRmxvYXRBcnJheT4gbV9tZW1CdWZmZXI7Cit9OworCit9IC8vIFdlYkNvcmUKKwor
I2VuZGlmIC8vIEF1ZGlvQ2hhbm5lbF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66311</attachid>
            <date>2010-09-01 18:53:23 -0700</date>
            <delta_ts>2010-09-03 12:19:17 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-44921-20100901185322.patch</filename>
            <type>text/plain</type>
            <size>9154</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjYyOSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjUgQEAKKzIwMTAtMDktMDEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBh
dWRpbyBlbmdpbmU6IGFkZCBBdWRpb0NoYW5uZWwgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0OTIxCisKKyAgICAgICAgTm8gbmV3IHRlc3Rz
IHNpbmNlIGF1ZGlvIEFQSSBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorCisgICAgICAgICogcGxh
dGZvcm0vYXVkaW8vQXVkaW9DaGFubmVsLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0NoYW5uZWw6OnNjYWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ2hhbm5lbDo6Y29w
eUZyb20pOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9DaGFubmVsOjpjb3B5RnJvbVJhbmdlKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQ2hhbm5lbDo6c3VtRnJvbSk6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0NoYW5uZWw6Om1heEFic1ZhbHVlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRp
by9BdWRpb0NoYW5uZWwuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6
OkF1ZGlvQ2hhbm5lbCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6OnNldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0NoYW5uZWw6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0NoYW5uZWw6OmRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9DaGFubmVsOjp6
ZXJvKToKKwogMjAxMC0wOS0wMSAgS2ludWtvIFlhc3VkYSAgPGtpbnVrb0BjaHJvbWl1bS5vcmc+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSmlhbiBMaS4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vQXVkaW9DaGFubmVsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL0F1ZGlvQ2hhbm5lbC5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL0F1ZGlvQ2hhbm5lbC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRl
ciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAq
ICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQg
SVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAq
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
CisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdFQl9BVURJTykKKworI2luY2x1ZGUgIkF1
ZGlvQ2hhbm5lbC5oIgorCisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgPGFsZ29y
aXRobT4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgQXVkaW9DaGFubmVsOjpzY2FsZShkb3VibGUgc2NhbGUp
Cit7CisgICAgZmxvYXQgcyA9IHN0YXRpY19jYXN0PGZsb2F0PihzY2FsZSk7CisgICAgdnNtdWwo
ZGF0YSgpLCAxLCAmcywgZGF0YSgpLCAxLCBsZW5ndGgoKSk7Cit9CisKK3ZvaWQgQXVkaW9DaGFu
bmVsOjpjb3B5RnJvbShjb25zdCBBdWRpb0NoYW5uZWwqIHNvdXJjZUNoYW5uZWwpCit7CisgICAg
Ym9vbCBpc1NhZmUgPSAoc291cmNlQ2hhbm5lbCAmJiBzb3VyY2VDaGFubmVsLT5sZW5ndGgoKSA+
PSBsZW5ndGgoKSk7CisgICAgQVNTRVJUKGlzU2FmZSk7CisgICAgaWYgKCFpc1NhZmUpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1lbWNweShkYXRhKCksIHNvdXJjZUNoYW5uZWwtPmRhdGEoKSwg
c2l6ZW9mKGZsb2F0KSAqIGxlbmd0aCgpKTsKK30KKwordm9pZCBBdWRpb0NoYW5uZWw6OmNvcHlG
cm9tUmFuZ2UoY29uc3QgQXVkaW9DaGFubmVsKiBzb3VyY2VDaGFubmVsLCB1bnNpZ25lZCBzdGFy
dEZyYW1lLCB1bnNpZ25lZCBlbmRGcmFtZSkKK3sKKyAgICAvLyBDaGVjayB0aGF0IHJhbmdlIGlz
IHNhZmUgZm9yIHJlYWRpbmcgZnJvbSBzb3VyY2VDaGFubmVsLgorICAgIGJvb2wgaXNSYW5nZVNh
ZmUgPSBzb3VyY2VDaGFubmVsICYmIHN0YXJ0RnJhbWUgPCBlbmRGcmFtZSAmJiBlbmRGcmFtZSA8
PSBzb3VyY2VDaGFubmVsLT5sZW5ndGgoKTsKKyAgICBBU1NFUlQoaXNSYW5nZVNhZmUpOworICAg
IGlmICghaXNSYW5nZVNhZmUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENoZWNrIHRoYXQg
dGhpcyBjaGFubmVsIGhhcyBlbm91Z2ggc3BhY2UuCisgICAgc2l6ZV90IHJhbmdlTGVuZ3RoID0g
ZW5kRnJhbWUgLSBzdGFydEZyYW1lOworICAgIGJvb2wgaXNSYW5nZUxlbmd0aFNhZmUgPSByYW5n
ZUxlbmd0aCA8PSBsZW5ndGgoKTsKKyAgICBBU1NFUlQoaXNSYW5nZUxlbmd0aFNhZmUpOworICAg
IGlmICghaXNSYW5nZUxlbmd0aFNhZmUpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IGZs
b2F0KiBzb3VyY2UgPSBzb3VyY2VDaGFubmVsLT5kYXRhKCk7CisgICAgZmxvYXQqIGRlc3RpbmF0
aW9uID0gZGF0YSgpOworICAgIG1lbWNweShkZXN0aW5hdGlvbiwgc291cmNlICsgc3RhcnRGcmFt
ZSwgc2l6ZW9mKGZsb2F0KSAqIHJhbmdlTGVuZ3RoKTsKK30KKwordm9pZCBBdWRpb0NoYW5uZWw6
OnN1bUZyb20oY29uc3QgQXVkaW9DaGFubmVsKiBzb3VyY2VDaGFubmVsKQoreworICAgIGJvb2wg
aXNTYWZlID0gc291cmNlQ2hhbm5lbCAmJiBzb3VyY2VDaGFubmVsLT5sZW5ndGgoKSA+PSBsZW5n
dGgoKTsKKyAgICBBU1NFUlQoaXNTYWZlKTsKKyAgICBpZiAoIWlzU2FmZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgdmFkZChkYXRhKCksIDEsIHNvdXJjZUNoYW5uZWwtPmRhdGEoKSwgMSwgZGF0
YSgpLCAxLCBsZW5ndGgoKSk7Cit9CisKK2Zsb2F0IEF1ZGlvQ2hhbm5lbDo6bWF4QWJzVmFsdWUo
KSBjb25zdAoreworICAgIGNvbnN0IGZsb2F0KiBwID0gZGF0YSgpOworICAgIGludCBuID0gbGVu
Z3RoKCk7CisKKyAgICBmbG9hdCBtYXggPSAwLjBmOworICAgIHdoaWxlIChuLS0pCisgICAgICAg
IG1heCA9IHN0ZDo6bWF4KG1heCwgZmFic2YoKnArKykpOworCisgICAgcmV0dXJuIG1heDsKK30K
KworfSAvLyBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9BdWRpb0NoYW5uZWwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL0F1ZGlvQ2hhbm5lbC5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9hdWRpby9BdWRpb0NoYW5uZWwuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxl
IENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIEF1ZGlvQ2hhbm5lbF9oCisjZGVmaW5lIEF1ZGlvQ2hhbm5lbF9oCisKKyNp
bmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4K
KyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8v
IEFuIEF1ZGlvQ2hhbm5lbCByZXByZXNlbnRzIGEgYnVmZmVyIG9mIG5vbi1pbnRlcmxlYXZlZCBm
bG9hdGluZy1wb2ludCBhdWRpbyBzYW1wbGVzLgorLy8gVGhlIFBDTSBzYW1wbGVzIGFyZSBub3Jt
YWxseSBhc3N1bWVkIHRvIGJlIGluIGEgbm9taW5hbCByYW5nZSAtMS4wIC0+ICsxLjAKK2NsYXNz
IEF1ZGlvQ2hhbm5lbCA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgLy8gTWVt
b3J5IGNhbiBiZSBleHRlcm5hbGx5IHJlZmVyZW5jZWQsIG9yIGNhbiBiZSBpbnRlcm5hbGx5IGFs
bG9jYXRlZCB3aXRoIGFuIEF1ZGlvRmxvYXRBcnJheS4KKworICAgIC8vIFJlZmVyZW5jZSBhbiBl
eHRlcm5hbCBidWZmZXIuCisgICAgQXVkaW9DaGFubmVsKGZsb2F0KiBzdG9yYWdlLCBzaXplX3Qg
bGVuZ3RoKQorICAgICAgICA6IG1fbGVuZ3RoKGxlbmd0aCksIG1fcmF3UG9pbnRlcihzdG9yYWdl
KSB7IH0KKworICAgIC8vIE1hbmFnZSBzdG9yYWdlIGZvciB1cy4KKyAgICBleHBsaWNpdCBBdWRp
b0NoYW5uZWwoc2l6ZV90IGxlbmd0aCkKKyAgICAgICAgOiBtX2xlbmd0aChsZW5ndGgpCisgICAg
ICAgICwgbV9yYXdQb2ludGVyKDApCisgICAgeworICAgICAgICBtX21lbUJ1ZmZlciA9IGFkb3B0
UHRyKG5ldyBBdWRpb0Zsb2F0QXJyYXkobGVuZ3RoKSk7CisgICAgfQorCisgICAgLy8gQSAiYmxh
bmsiIGF1ZGlvIGNoYW5uZWwgLS0gbXVzdCBjYWxsIHNldCgpIGJlZm9yZSBpdCdzIHVzZWZ1bC4u
LgorICAgIEF1ZGlvQ2hhbm5lbCgpCisgICAgICAgIDogbV9sZW5ndGgoMCkKKyAgICAgICAgLCBt
X3Jhd1BvaW50ZXIoMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gUmVkZWZpbmUgdGhlIG1lbW9y
eSBmb3IgdGhpcyBjaGFubmVsLgorICAgIC8vIHN0b3JhZ2UgcmVwcmVzZW50cyBleHRlcm5hbCBt
ZW1vcnkgbm90IG1hbmFnZWQgYnkgdGhpcyBvYmplY3QuCisgICAgdm9pZCBzZXQoZmxvYXQqIHN0
b3JhZ2UsIHNpemVfdCBsZW5ndGgpCisgICAgeworICAgICAgICBtX21lbUJ1ZmZlci5jbGVhcigp
OyAvLyBjbGVhbnVwIG1hbmFnZWQgc3RvcmFnZQorICAgICAgICBtX3Jhd1BvaW50ZXIgPSBzdG9y
YWdlOworICAgICAgICBtX2xlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBIb3cgbWFu
eSBzYW1wbGUtZnJhbWVzIGRvIHdlIGNvbnRhaW4/CisgICAgc2l6ZV90IGxlbmd0aCgpIGNvbnN0
IHsgcmV0dXJuIG1fbGVuZ3RoOyB9CisKKyAgICAvLyBEaXJlY3QgYWNjZXNzIHRvIFBDTSBzYW1w
bGUgZGF0YQorICAgIGZsb2F0KiBkYXRhKCkgeyByZXR1cm4gbV9yYXdQb2ludGVyID8gbV9yYXdQ
b2ludGVyIDogbV9tZW1CdWZmZXItPmRhdGEoKTsgfQorICAgIGNvbnN0IGZsb2F0KiBkYXRhKCkg
Y29uc3QgeyByZXR1cm4gbV9yYXdQb2ludGVyID8gbV9yYXdQb2ludGVyIDogbV9tZW1CdWZmZXIt
PmRhdGEoKTsgfQorCisgICAgLy8gWmVyb2VzIG91dCBhbGwgc2FtcGxlIHZhbHVlcyBpbiBidWZm
ZXIuCisgICAgdm9pZCB6ZXJvKCkKKyAgICB7CisgICAgICAgIGlmIChtX21lbUJ1ZmZlci5nZXQo
KSkKKyAgICAgICAgICAgIG1fbWVtQnVmZmVyLT56ZXJvKCk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIG1lbXNldChtX3Jhd1BvaW50ZXIsIDAsIHNpemVvZihmbG9hdCkgKiBtX2xlbmd0aCk7
CisgICAgfQorCisgICAgLy8gU2NhbGVzIGFsbCBzYW1wbGVzIGJ5IHRoZSBzYW1lIGFtb3VudC4K
KyAgICB2b2lkIHNjYWxlKGRvdWJsZSBzY2FsZSk7CisKKyAgICAvLyBBIHNpbXBsZSBtZW1jcHko
KSBmcm9tIHRoZSBzb3VyY2UgY2hhbm5lbAorICAgIHZvaWQgY29weUZyb20oY29uc3QgQXVkaW9D
aGFubmVsKiBzb3VyY2VDaGFubmVsKTsKKworICAgIC8vIENvcGllcyB0aGUgZ2l2ZW4gcmFuZ2Ug
ZnJvbSB0aGUgc291cmNlIGNoYW5uZWwuCisgICAgdm9pZCBjb3B5RnJvbVJhbmdlKGNvbnN0IEF1
ZGlvQ2hhbm5lbCogc291cmNlQ2hhbm5lbCwgdW5zaWduZWQgc3RhcnRGcmFtZSwgdW5zaWduZWQg
ZW5kRnJhbWUpOworCisgICAgLy8gU3VtcyAod2l0aCB1bml0eSBnYWluKSBmcm9tIHRoZSBzb3Vy
Y2UgY2hhbm5lbC4KKyAgICB2b2lkIHN1bUZyb20oY29uc3QgQXVkaW9DaGFubmVsKiBzb3VyY2VD
aGFubmVsKTsKKworICAgIC8vIFJldHVybnMgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSAodXNlZnVs
IGZvciBub3JtYWxpemF0aW9uKS4KKyAgICBmbG9hdCBtYXhBYnNWYWx1ZSgpIGNvbnN0OworCitw
cml2YXRlOgorICAgIHNpemVfdCBtX2xlbmd0aDsKKworICAgIGZsb2F0KiBtX3Jhd1BvaW50ZXI7
CisgICAgT3duUHRyPEF1ZGlvRmxvYXRBcnJheT4gbV9tZW1CdWZmZXI7Cit9OworCit9IC8vIFdl
YkNvcmUKKworI2VuZGlmIC8vIEF1ZGlvQ2hhbm5lbF9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>