<?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>45519</bug_id>
          
          <creation_ts>2010-09-09 21:52:05 -0700</creation_ts>
          <short_desc>Add cache for GPU-accelerated path processing results</short_desc>
          <delta_ts>2011-02-08 18:40:18 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>44729</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Kenneth Russell">kbr</assigned_to>
          <cc>abarth</cc>
    
    <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>gman</cc>
    
    <cc>jamesr</cc>
    
    <cc>senorblanco</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>vangelis</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>277008</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 21:52:05 -0700</bug_when>
    <thetext>A class is needed to hold the results of processing a path into a triangle mesh suitable for rendering on the GPU. The data structures exposed by this cache need to be low level to be compatible with the GraphicsContext3D rendering API, which matches OpenGL.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277030</commentid>
    <comment_count>1</comment_count>
      <attachid>67156</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 22:36:26 -0700</bug_when>
    <thetext>Created attachment 67156
Patch

From the ChangeLog:

Adding a cache which holds the results of processing a path into interior and exterior triangle meshes, according to the path rendering algorithm from GPU Gems 3. No tests yet; will be tested in conjunction with later code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277403</commentid>
    <comment_count>2</comment_count>
      <attachid>67156</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-10 13:34:26 -0700</bug_when>
    <thetext>Comment on attachment 67156
Patch

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

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:43
&gt; +class LoopBlinnPathCache : public Noncopyable {
&gt; +public:
Please declare a destructor here and give it an (empty) definition in the .cpp.  Otherwise the body of the destructor for vector will get inlined in to every file that includes this header.

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:61
&gt; +    // Get the base pointer to the vertex information. There are two
&gt; +    // coordinates per vertex. This pointer is valid until the cache is
&gt; +    // cleared or another vertex is added. Returns 0 if there are no
&gt; +    // vertices in the mesh.
&gt; +    const float* vertices() const
&gt; +    {
&gt; +        if (!numberOfVertices())
&gt; +            return 0;
&gt; +        return m_vertices.data();
&gt; +    }
&gt; +
&gt; +    // Get the base pointer to the texture coordinate information. There
&gt; +    // are three coordinates per vertex. This pointer is valid until the
&gt; +    // cache is cleared or another vertex is added. Returns 0 if
&gt; +    // there are no vertices in the mesh.
&gt; +    const float* texcoords() const
Instead of exposing raw pointers to this class&apos; underlying vector types, this class should expose getters for the length and data at a given offset.  That way users of this class are insulated from the details of the class&apos; guts.  That would also avoid oddness around how to do the correct pointer math for vertices vs texcoords and allow us to change out the underlying implementation if we wanted to.

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:80
&gt; +    // Base pointer to the interior vertices; two coordinates per
&gt; +    // vertex, which can be drawn as GL_TRIANGLES. Returns 0 if there
&gt; +    // are no interior vertices in the mesh.
&gt; +    const float* interiorVertices() const
Same here. A better interface would be something like &quot;int interiorVertexCount(); FloatPoint interiorVertex(int i);&quot;

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:87
&gt; +    void addInteriorVertex(float x, float y);
Why not use FloatPoint here (and all the other locations that use pairs or triples of floats)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>278469</commentid>
    <comment_count>3</comment_count>
      <attachid>67470</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-13 14:13:04 -0700</bug_when>
    <thetext>Created attachment 67470
Revised patch

Addressed above review feedback.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>278473</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-13 14:19:17 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 67156 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=67156&amp;action=prettypatch
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:43
&gt; &gt; +class LoopBlinnPathCache : public Noncopyable {
&gt; &gt; +public:
&gt; Please declare a destructor here and give it an (empty) definition in the .cpp.  Otherwise the body of the destructor for vector will get inlined in to every file that includes this header.

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:61
&gt; &gt; +    // Get the base pointer to the vertex information. There are two
&gt; &gt; +    // coordinates per vertex. This pointer is valid until the cache is
&gt; &gt; +    // cleared or another vertex is added. Returns 0 if there are no
&gt; &gt; +    // vertices in the mesh.
&gt; &gt; +    const float* vertices() const
&gt; &gt; +    {
&gt; &gt; +        if (!numberOfVertices())
&gt; &gt; +            return 0;
&gt; &gt; +        return m_vertices.data();
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    // Get the base pointer to the texture coordinate information. There
&gt; &gt; +    // are three coordinates per vertex. This pointer is valid until the
&gt; &gt; +    // cache is cleared or another vertex is added. Returns 0 if
&gt; &gt; +    // there are no vertices in the mesh.
&gt; &gt; +    const float* texcoords() const
&gt; Instead of exposing raw pointers to this class&apos; underlying vector types, this class should expose getters for the length and data at a given offset.  That way users of this class are insulated from the details of the class&apos; guts.  That would also avoid oddness around how to do the correct pointer math for vertices vs texcoords and allow us to change out the underlying implementation if we wanted to.

This comment doesn&apos;t make sense in the context of how the path cache is used. The entire point is to be able to pass the resulting vertices and texture coordinates directly to OpenGL (via GraphicsContext3D). The using code looks approximately like:

GraphicsContext3D* context = ...;
LoopBlinnPathCache pathCache = ...;
// LoopBlinnPathProcessor.process(path, pathCache);
context.bindBuffer(GraphicsContext3D::ARRAY_BUFFER, vertexBuffer);
context.bufferData(GraphicsContext3D::ARRAY_BUFFER, 2 * pathCache.numberOfVertices() * sizeof(float), pathCache.vertices(), GraphicsContext3D::STATIC_DRAW);

The intent is to avoid a data copy when retrieving the vertices and texture coordinates from the path cache; GC3D&apos;s bufferData and bufferSubData already copy the incoming data.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:80
&gt; &gt; +    // Base pointer to the interior vertices; two coordinates per
&gt; &gt; +    // vertex, which can be drawn as GL_TRIANGLES. Returns 0 if there
&gt; &gt; +    // are no interior vertices in the mesh.
&gt; &gt; +    const float* interiorVertices() const
&gt; Same here. A better interface would be something like &quot;int interiorVertexCount(); FloatPoint interiorVertex(int i);&quot;

No, for the reason described above.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:87
&gt; &gt; +    void addInteriorVertex(float x, float y);
&gt; Why not use FloatPoint here (and all the other locations that use pairs or triples of floats)?

For the reason described above. The data must be returned as a series of floats, not FloatPoint or FloatPoint3D, so it can be uploaded to OpenGL directly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279794</commentid>
    <comment_count>5</comment_count>
      <attachid>67470</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-15 16:03:52 -0700</bug_when>
    <thetext>Comment on attachment 67470
Revised patch

r- for the error handling.  Otherwise, this look all right

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

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:52
&gt; +    // cleared or another vertex is added. Returns 0 if there are no
&gt; +    // vertices in the mesh.
&gt; +    const float* vertices() const
Wouldn&apos;t calling this function if there are no vertices be an error from the caller? This should be an ASSERT() then, not an if check.

Also, why doesn&apos;t this return a const Vector&lt;float&gt;*?  Then the caller could grab the .data() if they want and deal with the empty case in whatever way they please.

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:63
&gt; +    // cache is cleared or another vertex is added. Returns 0 if
&gt; +    // there are no vertices in the mesh.
&gt; +    const float* texcoords() const
Same here.

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:82
&gt; +    // vertex, which can be drawn as GL_TRIANGLES. Returns 0 if there
&gt; +    // are no interior vertices in the mesh.
&gt; +    const float* interiorVertices() const
Same here

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:96
&gt; +    unsigned numberOfInteriorEdgeVertices() const;
Why isn&apos;t this inline like the rest?

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:100
&gt; +    // no interior edge vertices in the mesh.
&gt; +    const float* interiorEdgeVertices() const;
Same comments as above (don&apos;t return NULL, consider exposing a const Vector&lt;float&gt;&amp;).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347839</commentid>
    <comment_count>6</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-08 17:27:35 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 67470 [details])
&gt; r- for the error handling.  Otherwise, this look all right
&gt; 
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=67470&amp;action=prettypatch
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:52
&gt; &gt; +    // cleared or another vertex is added. Returns 0 if there are no
&gt; &gt; +    // vertices in the mesh.
&gt; &gt; +    const float* vertices() const
&gt; Wouldn&apos;t calling this function if there are no vertices be an error from the caller? This should be an ASSERT() then, not an if check.

It isn&apos;t an error. The calling code uses OpenGL functions and semantics, where passing 0 down for the source pointer is legal when 0 vertices are being transferred. Allowing this function to return 0 simplifies the calling code significantly, eliminating the need for several if-tests.

&gt; Also, why doesn&apos;t this return a const Vector&lt;float&gt;*?  Then the caller could grab the .data() if they want and deal with the empty case in whatever way they please.

That would be an abstraction violation. The point of this class is to provide a very narrow interface between the code which generates the mesh and the code which consumes it.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:63
&gt; &gt; +    // cache is cleared or another vertex is added. Returns 0 if
&gt; &gt; +    // there are no vertices in the mesh.
&gt; &gt; +    const float* texcoords() const
&gt; Same here.
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:82
&gt; &gt; +    // vertex, which can be drawn as GL_TRIANGLES. Returns 0 if there
&gt; &gt; +    // are no interior vertices in the mesh.
&gt; &gt; +    const float* interiorVertices() const
&gt; Same here
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:96
&gt; &gt; +    unsigned numberOfInteriorEdgeVertices() const;
&gt; Why isn&apos;t this inline like the rest?

This is code for debugging only, so performance is not an issue, and it&apos;s cleaner to keep it all together in the .cpp.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:100
&gt; &gt; +    // no interior edge vertices in the mesh.
&gt; &gt; +    const float* interiorEdgeVertices() const;
&gt; Same comments as above (don&apos;t return NULL, consider exposing a const Vector&lt;float&gt;&amp;).

I&apos;ll upload a new version of the patch shortly which won&apos;t change anything semantically but will do things like update the copyright notice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347863</commentid>
    <comment_count>7</comment_count>
      <attachid>81725</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-08 17:44:33 -0800</bug_when>
    <thetext>Created attachment 81725
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347867</commentid>
    <comment_count>8</comment_count>
      <attachid>81725</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-02-08 17:53:05 -0800</bug_when>
    <thetext>Comment on attachment 81725
Patch

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

R=me

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:77
&gt; +    void addVertex(float x, float y,
&gt; +                   float /*k*/, float /*l*/, float /*m*/);

nit: &quot;float k, float l, float m&quot; should be fine here</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347869</commentid>
    <comment_count>9</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-08 17:55:04 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 81725 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81725&amp;action=review
&gt; 
&gt; R=me

Thanks.

&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:77
&gt; &gt; +    void addVertex(float x, float y,
&gt; &gt; +                   float /*k*/, float /*l*/, float /*m*/);
&gt; 
&gt; nit: &quot;float k, float l, float m&quot; should be fine here

The style bot didn&apos;t like &quot;float l&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347871</commentid>
    <comment_count>10</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-08 18:03:22 -0800</bug_when>
    <thetext>Committed r78002: &lt;http://trac.webkit.org/changeset/78002&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347886</commentid>
    <comment_count>11</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-02-08 18:40:18 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #8)
&gt; &gt; (From update of attachment 81725 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81725&amp;action=review
&gt; &gt; 
&gt; &gt; R=me
&gt; 
&gt; Thanks.
&gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathCache.h:77
&gt; &gt; &gt; +    void addVertex(float x, float y,
&gt; &gt; &gt; +                   float /*k*/, float /*l*/, float /*m*/);
&gt; &gt; 
&gt; &gt; nit: &quot;float k, float l, float m&quot; should be fine here
&gt; 
&gt; The style bot didn&apos;t like &quot;float l&quot;.

Come to think of it I added that check :P  we had some code which was in fact confusing a local variable &apos;1&apos; with the literal value &apos;1&apos; which led to a crash.  In the code review font the two glyphs are identical.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67156</attachid>
            <date>2010-09-09 22:36:26 -0700</date>
            <delta_ts>2010-09-13 14:13:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>path-cache.patch</filename>
            <type>text/plain</type>
            <size>9478</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzE2NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMTAtMDktMDkgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBjYWNoZSBmb3IgR1BVLWFjY2VsZXJhdGVkIHBhdGggcHJvY2Vzc2luZyByZXN1bHRzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTUxOQorCisgICAg
ICAgIEFkZGluZyBhIGNhY2hlIHdoaWNoIGhvbGRzIHRoZSByZXN1bHRzIG9mIHByb2Nlc3Npbmcg
YSBwYXRoIGludG8KKyAgICAgICAgaW50ZXJpb3IgYW5kIGV4dGVyaW9yIHRyaWFuZ2xlIG1lc2hl
cywgYWNjb3JkaW5nIHRvIHRoZSBwYXRoCisgICAgICAgIHJlbmRlcmluZyBhbGdvcml0aG0gZnJv
bSBHUFUgR2VtcyAzLiBObyB0ZXN0cyB5ZXQ7IHdpbGwgYmUgdGVzdGVkCisgICAgICAgIGluIGNv
bmp1bmN0aW9uIHdpdGggbGF0ZXIgY29kZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Okxv
b3BCbGlublBhdGhDYWNoZTo6YWRkVmVydGV4KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
blBhdGhDYWNoZTo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aENhY2hl
OjphZGRJbnRlcmlvclZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2Fj
aGU6Om51bWJlck9mSW50ZXJpb3JFZGdlVmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uUGF0aENhY2hlOjppbnRlcmlvckVkZ2VWZXJ0aWNlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoQ2FjaGU6OmFkZEludGVyaW9yRWRnZVZlcnRleCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBhdGhDYWNoZS5oOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhDYWNoZTo6bnVtYmVyT2ZWZXJ0aWNlcyk6CisgICAg
ICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6OnZlcnRpY2VzKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlublBhdGhDYWNoZTo6dGV4Y29vcmRzKToKKyAgICAgICAgKFdlYkNvcmU6
Okxvb3BCbGlublBhdGhDYWNoZTo6bnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKToKKyAgICAgICAg
KFdlYkNvcmU6Okxvb3BCbGlublBhdGhDYWNoZTo6aW50ZXJpb3JWZXJ0aWNlcyk6CisKIDIwMTAt
MDktMDkgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L0xvb3BCbGlublBhdGhDYWNoZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aENhY2hlLmNwcAkocmV2aXNpb24gMCkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBhdGhDYWNoZS5jcHAJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNp
bmNsdWRlICJMb29wQmxpbm5QYXRoQ2FjaGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2
b2lkIExvb3BCbGlublBhdGhDYWNoZTo6YWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGssIGZsb2F0IGwsIGZsb2F0IG0p
Cit7CisgICAgbV92ZXJ0aWNlcy5hcHBlbmQoeCk7CisgICAgbV92ZXJ0aWNlcy5hcHBlbmQoeSk7
CisgICAgbV90ZXhjb29yZHMuYXBwZW5kKGspOworICAgIG1fdGV4Y29vcmRzLmFwcGVuZChsKTsK
KyAgICBtX3RleGNvb3Jkcy5hcHBlbmQobSk7Cit9CisKK3ZvaWQgTG9vcEJsaW5uUGF0aENhY2hl
OjpjbGVhcigpCit7CisgICAgbV92ZXJ0aWNlcy5jbGVhcigpOworICAgIG1fdGV4Y29vcmRzLmNs
ZWFyKCk7CisgICAgbV9pbnRlcmlvclZlcnRpY2VzLmNsZWFyKCk7CisjaWZkZWYgTE9PUF9CTElO
Tl9QQVRIX0NBQ0hFX0RFQlVHX0lOVEVSSU9SX0VER0VTCisgICAgbV9pbnRlcmlvckVkZ2VWZXJ0
aWNlcy5jbGVhcigpOworI2VuZGlmIC8vIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRF
UklPUl9FREdFUworfQorCit2b2lkIExvb3BCbGlublBhdGhDYWNoZTo6YWRkSW50ZXJpb3JWZXJ0
ZXgoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBtX2ludGVyaW9yVmVydGljZXMuYXBwZW5kKHgp
OworICAgIG1faW50ZXJpb3JWZXJ0aWNlcy5hcHBlbmQoeSk7Cit9CisKKyNpZmRlZiBMT09QX0JM
SU5OX1BBVEhfQ0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKK3Vuc2lnbmVkIExvb3BCbGlublBh
dGhDYWNoZTo6bnVtYmVyT2ZJbnRlcmlvckVkZ2VWZXJ0aWNlcygpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1faW50ZXJpb3JFZGdlVmVydGljZXMuc2l6ZSgpIC8gMjsKK30KKworY29uc3QgZmxvYXQq
IExvb3BCbGlublBhdGhDYWNoZTo6aW50ZXJpb3JFZGdlVmVydGljZXMoKSBjb25zdAoreworICAg
IGlmICghbnVtYmVyT2ZJbnRlcmlvckVkZ2VWZXJ0aWNlcygpKQorICAgICAgICByZXR1cm4gMDsK
KyAgICByZXR1cm4gbV9pbnRlcmlvckVkZ2VWZXJ0aWNlcy5kYXRhKCk7Cit9CisKK3ZvaWQgTG9v
cEJsaW5uUGF0aENhY2hlOjphZGRJbnRlcmlvckVkZ2VWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSkK
K3sKKyAgICBtX2ludGVyaW9yRWRnZVZlcnRpY2VzLmFwcGVuZCh4KTsKKyAgICBtX2ludGVyaW9y
RWRnZVZlcnRpY2VzLmFwcGVuZCh5KTsKK30KKyNlbmRpZiAvLyBMT09QX0JMSU5OX1BBVEhfQ0FD
SEVfREVCVUdfSU5URVJJT1JfRURHRVMKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aENhY2hlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aENhY2hl
LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxp
bm5QYXRoQ2FjaGUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZu
ZGVmIExvb3BCbGlublBhdGhDYWNoZV9oCisjZGVmaW5lIExvb3BCbGlublBhdGhDYWNoZV9oCisK
KyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQSBjYWNoZSBvZiB0aGUgcHJvY2Vzc2VkIHRyaWFu
Z2xlIG1lc2ggZm9yIGEgZ2l2ZW4gcGF0aC4gQmVjYXVzZSB0aGVzZQorLy8gbWlnaHQgYmUgZXhw
ZW5zaXZlIHRvIGFsbG9jYXRlICh1c2luZyBtYWxsb2MvZnJlZSBpbnRlcm5hbGx5KSwgaXQgaXMK
Ky8vIHJlY29tbWVuZGVkIHRvIHRyeSB0byByZXVzZSB0aGVtIHdoZW4gcG9zc2libGUuCisKKy8v
IFVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIG9idGFpbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24g
Zm9yIHRoZSBlZGdlcworLy8gZmFjaW5nIHRoZSBpbnRlcmlvciByZWdpb24gb2YgdGhlIG1lc2gu
CisvLyAjZGVmaW5lIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRFUklPUl9FREdFUwor
CitjbGFzcyBMb29wQmxpbm5QYXRoQ2FjaGUgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGlj
OgorICAgIHVuc2lnbmVkIG51bWJlck9mVmVydGljZXMoKSBjb25zdCB7IHJldHVybiBtX3ZlcnRp
Y2VzLnNpemUoKSAvIDI7IH0KKworICAgIC8vIEdldCB0aGUgYmFzZSBwb2ludGVyIHRvIHRoZSB2
ZXJ0ZXggaW5mb3JtYXRpb24uIFRoZXJlIGFyZSB0d28KKyAgICAvLyBjb29yZGluYXRlcyBwZXIg
dmVydGV4LiBUaGlzIHBvaW50ZXIgaXMgdmFsaWQgdW50aWwgdGhlIGNhY2hlIGlzCisgICAgLy8g
Y2xlYXJlZCBvciBhbm90aGVyIHZlcnRleCBpcyBhZGRlZC4gUmV0dXJucyAwIGlmIHRoZXJlIGFy
ZSBubworICAgIC8vIHZlcnRpY2VzIGluIHRoZSBtZXNoLgorICAgIGNvbnN0IGZsb2F0KiB2ZXJ0
aWNlcygpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIW51bWJlck9mVmVydGljZXMoKSkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbV92ZXJ0aWNlcy5kYXRhKCk7Cisg
ICAgfQorCisgICAgLy8gR2V0IHRoZSBiYXNlIHBvaW50ZXIgdG8gdGhlIHRleHR1cmUgY29vcmRp
bmF0ZSBpbmZvcm1hdGlvbi4gVGhlcmUKKyAgICAvLyBhcmUgdGhyZWUgY29vcmRpbmF0ZXMgcGVy
IHZlcnRleC4gVGhpcyBwb2ludGVyIGlzIHZhbGlkIHVudGlsIHRoZQorICAgIC8vIGNhY2hlIGlz
IGNsZWFyZWQgb3IgYW5vdGhlciB2ZXJ0ZXggaXMgYWRkZWQuIFJldHVybnMgMCBpZgorICAgIC8v
IHRoZXJlIGFyZSBubyB2ZXJ0aWNlcyBpbiB0aGUgbWVzaC4KKyAgICBjb25zdCBmbG9hdCogdGV4
Y29vcmRzKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghbnVtYmVyT2ZWZXJ0aWNlcygpKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtX3RleGNvb3Jkcy5kYXRhKCk7
CisgICAgfQorCisgICAgLy8gQWRkcyBhIHZlcnRleCdzIGluZm9ybWF0aW9uIHRvIHRoZSBjYWNo
ZS4gVGhlIGZpcnN0IHR3byBhcmd1bWVudHMKKyAgICAvLyBhcmUgdGhlIHggYW5kIHkgY29vcmRp
bmF0ZXMgb2YgdGhlIHZlcnRleCBvbiB0aGUgcGxhbmU7IHRoZSBsYXN0CisgICAgLy8gdGhyZWUg
YXJndW1lbnRzIGFyZSB0aGUgY3ViaWMgdGV4dHVyZSBjb29yZGluYXRlcyBhc3NvY2lhdGVkIHdp
dGgKKyAgICAvLyB0aGlzIHZlcnRleC4KKyAgICB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9h
dCB5LAorICAgICAgICAgICAgICAgICAgIGZsb2F0IGssIGZsb2F0IGwsIGZsb2F0IG0pOworCisg
ICAgdW5zaWduZWQgbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9p
bnRlcmlvclZlcnRpY2VzLnNpemUoKSAvIDI7IH0KKworICAgIC8vIEJhc2UgcG9pbnRlciB0byB0
aGUgaW50ZXJpb3IgdmVydGljZXM7IHR3byBjb29yZGluYXRlcyBwZXIKKyAgICAvLyB2ZXJ0ZXgs
IHdoaWNoIGNhbiBiZSBkcmF3biBhcyBHTF9UUklBTkdMRVMuIFJldHVybnMgMCBpZiB0aGVyZQor
ICAgIC8vIGFyZSBubyBpbnRlcmlvciB2ZXJ0aWNlcyBpbiB0aGUgbWVzaC4KKyAgICBjb25zdCBm
bG9hdCogaW50ZXJpb3JWZXJ0aWNlcygpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoIW51bWJl
ck9mSW50ZXJpb3JWZXJ0aWNlcygpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJl
dHVybiBtX2ludGVyaW9yVmVydGljZXMuZGF0YSgpOworICAgIH0KKworICAgIHZvaWQgYWRkSW50
ZXJpb3JWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSk7CisKKyAgICAvLyBDbGVhcnMgYWxsIG9mIHRo
ZSBzdG9yZWQgdmVydGV4IGluZm9ybWF0aW9uIGluIHRoaXMgY2FjaGUuCisgICAgdm9pZCBjbGVh
cigpOworCisjaWZkZWYgTE9PUF9CTElOTl9QQVRIX0NBQ0hFX0RFQlVHX0lOVEVSSU9SX0VER0VT
CisgICAgLy8gVGhlIG51bWJlciBvZiBpbnRlcmlvciBlZGdlIHZlcnRpY2VzCisgICAgdW5zaWdu
ZWQgbnVtYmVyT2ZJbnRlcmlvckVkZ2VWZXJ0aWNlcygpIGNvbnN0OworICAgIC8vIEJhc2UgcG9p
bnRlciB0byB0aGUgaW50ZXJpb3IgdmVydGljZXM7IHR3byBjb29yZGluYXRlcyBwZXIKKyAgICAv
LyB2ZXJ0ZXgsIHdoaWNoIGNhbiBiZSBkcmF3biBhcyBHTF9MSU5FUy4gUmV0dXJucyAwIGlmIHRo
ZXJlIGFyZQorICAgIC8vIG5vIGludGVyaW9yIGVkZ2UgdmVydGljZXMgaW4gdGhlIG1lc2guCisg
ICAgY29uc3QgZmxvYXQqIGludGVyaW9yRWRnZVZlcnRpY2VzKCkgY29uc3Q7CisgICAgdm9pZCBh
ZGRJbnRlcmlvckVkZ2VWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSk7CisjZW5kaWYgLy8gTE9PUF9C
TElOTl9QQVRIX0NBQ0hFX0RFQlVHX0lOVEVSSU9SX0VER0VTCisKK3ByaXZhdGU6CisgICAgLy8g
VGhlIHR3by1kaW1lbnNpb25hbCB2ZXJ0aWNlcyBvZiB0aGUgdHJpYW5nbGUgbWVzaC4KKyAgICBW
ZWN0b3I8ZmxvYXQ+IG1fdmVydGljZXM7CisKKyAgICAvLyBUaGUgdGhyZWUtZGltZW5zaW9uYWwg
Y3ViaWMgdGV4dHVyZSBjb29yZGluYXRlcy4KKyAgICBWZWN0b3I8ZmxvYXQ+IG1fdGV4Y29vcmRz
OworCisgICAgVmVjdG9yPGZsb2F0PiBtX2ludGVyaW9yVmVydGljZXM7CisKKyNpZmRlZiBMT09Q
X0JMSU5OX1BBVEhfQ0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKKyAgICAvLyBUaGUgZm9sbG93
aW5nIGlzIG9ubHkgZm9yIGRlYnVnZ2luZworICAgIFZlY3RvcjxmbG9hdD4gbV9pbnRlcmlvckVk
Z2VWZXJ0aWNlczsKKyNlbmRpZiAvLyBMT09QX0JMSU5OX1BBVEhfQ0FDSEVfREVCVUdfSU5URVJJ
T1JfRURHRVMKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIExvb3BC
bGlublBhdGhDYWNoZV9oCg==
</data>
<flag name="review"
          id="56384"
          type_id="1"
          status="-"
          setter="jamesr"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67470</attachid>
            <date>2010-09-13 14:13:04 -0700</date>
            <delta_ts>2011-02-08 17:44:30 -0800</delta_ts>
            <desc>Revised patch</desc>
            <filename>path-cache.patch</filename>
            <type>text/plain</type>
            <size>9621</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzQxMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMTAtMDktMTMgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBjYWNoZSBmb3IgR1BVLWFjY2VsZXJhdGVkIHBhdGggcHJvY2Vzc2luZyByZXN1bHRzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTUxOQorCisgICAg
ICAgIEFkZGluZyBhIGNhY2hlIHdoaWNoIGhvbGRzIHRoZSByZXN1bHRzIG9mIHByb2Nlc3Npbmcg
YSBwYXRoIGludG8KKyAgICAgICAgaW50ZXJpb3IgYW5kIGV4dGVyaW9yIHRyaWFuZ2xlIG1lc2hl
cywgYWNjb3JkaW5nIHRvIHRoZSBwYXRoCisgICAgICAgIHJlbmRlcmluZyBhbGdvcml0aG0gZnJv
bSBHUFUgR2VtcyAzLiBObyB0ZXN0cyB5ZXQ7IHdpbGwgYmUgdGVzdGVkCisgICAgICAgIGluIGNv
bmp1bmN0aW9uIHdpdGggbGF0ZXIgY29kZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Okxv
b3BCbGlublBhdGhDYWNoZTo6fkxvb3BCbGlublBhdGhDYWNoZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoQ2FjaGU6OmFkZFZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5QYXRoQ2FjaGU6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhD
YWNoZTo6YWRkSW50ZXJpb3JWZXJ0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0
aENhY2hlOjpudW1iZXJPZkludGVyaW9yRWRnZVZlcnRpY2VzKToKKyAgICAgICAgKFdlYkNvcmU6
Okxvb3BCbGlublBhdGhDYWNoZTo6aW50ZXJpb3JFZGdlVmVydGljZXMpOgorICAgICAgICAoV2Vi
Q29yZTo6TG9vcEJsaW5uUGF0aENhY2hlOjphZGRJbnRlcmlvckVkZ2VWZXJ0ZXgpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6Om51bWJlck9mVmVydGljZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aENhY2hlOjp2ZXJ0aWNlcyk6CisgICAgICAg
IChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6OnRleGNvb3Jkcyk6CisgICAgICAgIChXZWJD
b3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6Om51bWJlck9mSW50ZXJpb3JWZXJ0aWNlcyk6CisgICAg
ICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6OmludGVyaW9yVmVydGljZXMpOgorCiAy
MDEwLTA5LTEzICBDaHJpcyBGbGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgRGF2aWQgS2lsemVyLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ncHUvTG9vcEJsaW5uUGF0aENhY2hlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuY3BwCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aENhY2hlLmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2luY2x1ZGUgIkxvb3BCbGlublBhdGhDYWNoZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK0xvb3BCbGlublBhdGhDYWNoZTo6fkxvb3BCbGlublBhdGhDYWNoZSgpCit7Cit9CisKK3Zv
aWQgTG9vcEJsaW5uUGF0aENhY2hlOjphZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaywgZmxvYXQgbCwgZmxvYXQgbSkK
K3sKKyAgICBtX3ZlcnRpY2VzLmFwcGVuZCh4KTsKKyAgICBtX3ZlcnRpY2VzLmFwcGVuZCh5KTsK
KyAgICBtX3RleGNvb3Jkcy5hcHBlbmQoayk7CisgICAgbV90ZXhjb29yZHMuYXBwZW5kKGwpOwor
ICAgIG1fdGV4Y29vcmRzLmFwcGVuZChtKTsKK30KKwordm9pZCBMb29wQmxpbm5QYXRoQ2FjaGU6
OmNsZWFyKCkKK3sKKyAgICBtX3ZlcnRpY2VzLmNsZWFyKCk7CisgICAgbV90ZXhjb29yZHMuY2xl
YXIoKTsKKyAgICBtX2ludGVyaW9yVmVydGljZXMuY2xlYXIoKTsKKyNpZmRlZiBMT09QX0JMSU5O
X1BBVEhfQ0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKKyAgICBtX2ludGVyaW9yRWRnZVZlcnRp
Y2VzLmNsZWFyKCk7CisjZW5kaWYgLy8gTE9PUF9CTElOTl9QQVRIX0NBQ0hFX0RFQlVHX0lOVEVS
SU9SX0VER0VTCit9CisKK3ZvaWQgTG9vcEJsaW5uUGF0aENhY2hlOjphZGRJbnRlcmlvclZlcnRl
eChmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIG1faW50ZXJpb3JWZXJ0aWNlcy5hcHBlbmQoeCk7
CisgICAgbV9pbnRlcmlvclZlcnRpY2VzLmFwcGVuZCh5KTsKK30KKworI2lmZGVmIExPT1BfQkxJ
Tk5fUEFUSF9DQUNIRV9ERUJVR19JTlRFUklPUl9FREdFUwordW5zaWduZWQgTG9vcEJsaW5uUGF0
aENhY2hlOjpudW1iZXJPZkludGVyaW9yRWRnZVZlcnRpY2VzKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9pbnRlcmlvckVkZ2VWZXJ0aWNlcy5zaXplKCkgLyAyOworfQorCitjb25zdCBmbG9hdCog
TG9vcEJsaW5uUGF0aENhY2hlOjppbnRlcmlvckVkZ2VWZXJ0aWNlcygpIGNvbnN0Cit7CisgICAg
aWYgKCFudW1iZXJPZkludGVyaW9yRWRnZVZlcnRpY2VzKCkpCisgICAgICAgIHJldHVybiAwOwor
ICAgIHJldHVybiBtX2ludGVyaW9yRWRnZVZlcnRpY2VzLmRhdGEoKTsKK30KKwordm9pZCBMb29w
Qmxpbm5QYXRoQ2FjaGU6OmFkZEludGVyaW9yRWRnZVZlcnRleChmbG9hdCB4LCBmbG9hdCB5KQor
eworICAgIG1faW50ZXJpb3JFZGdlVmVydGljZXMuYXBwZW5kKHgpOworICAgIG1faW50ZXJpb3JF
ZGdlVmVydGljZXMuYXBwZW5kKHkpOworfQorI2VuZGlmIC8vIExPT1BfQkxJTk5fUEFUSF9DQUNI
RV9ERUJVR19JTlRFUklPUl9FREdFUworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUu
aAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlu
blBhdGhDYWNoZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgTG9vcEJsaW5uUGF0aENhY2hlX2gKKyNkZWZpbmUgTG9vcEJsaW5uUGF0aENhY2hlX2gKKwor
I2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBBIGNhY2hlIG9mIHRoZSBwcm9jZXNzZWQgdHJpYW5n
bGUgbWVzaCBmb3IgYSBnaXZlbiBwYXRoLiBCZWNhdXNlIHRoZXNlCisvLyBtaWdodCBiZSBleHBl
bnNpdmUgdG8gYWxsb2NhdGUgKHVzaW5nIG1hbGxvYy9mcmVlIGludGVybmFsbHkpLCBpdCBpcwor
Ly8gcmVjb21tZW5kZWQgdG8gdHJ5IHRvIHJldXNlIHRoZW0gd2hlbiBwb3NzaWJsZS4KKworLy8g
VW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdG8gb2J0YWluIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBm
b3IgdGhlIGVkZ2VzCisvLyBmYWNpbmcgdGhlIGludGVyaW9yIHJlZ2lvbiBvZiB0aGUgbWVzaC4K
Ky8vICNkZWZpbmUgTE9PUF9CTElOTl9QQVRIX0NBQ0hFX0RFQlVHX0lOVEVSSU9SX0VER0VTCisK
K2NsYXNzIExvb3BCbGlublBhdGhDYWNoZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6
CisgICAgfkxvb3BCbGlublBhdGhDYWNoZSgpOworCisgICAgdW5zaWduZWQgbnVtYmVyT2ZWZXJ0
aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmVydGljZXMuc2l6ZSgpIC8gMjsgfQorCisgICAgLy8g
R2V0IHRoZSBiYXNlIHBvaW50ZXIgdG8gdGhlIHZlcnRleCBpbmZvcm1hdGlvbi4gVGhlcmUgYXJl
IHR3bworICAgIC8vIGNvb3JkaW5hdGVzIHBlciB2ZXJ0ZXguIFRoaXMgcG9pbnRlciBpcyB2YWxp
ZCB1bnRpbCB0aGUgY2FjaGUgaXMKKyAgICAvLyBjbGVhcmVkIG9yIGFub3RoZXIgdmVydGV4IGlz
IGFkZGVkLiBSZXR1cm5zIDAgaWYgdGhlcmUgYXJlIG5vCisgICAgLy8gdmVydGljZXMgaW4gdGhl
IG1lc2guCisgICAgY29uc3QgZmxvYXQqIHZlcnRpY2VzKCkgY29uc3QKKyAgICB7CisgICAgICAg
IGlmICghbnVtYmVyT2ZWZXJ0aWNlcygpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IHJldHVybiBtX3ZlcnRpY2VzLmRhdGEoKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGJhc2Ug
cG9pbnRlciB0byB0aGUgdGV4dHVyZSBjb29yZGluYXRlIGluZm9ybWF0aW9uLiBUaGVyZQorICAg
IC8vIGFyZSB0aHJlZSBjb29yZGluYXRlcyBwZXIgdmVydGV4LiBUaGlzIHBvaW50ZXIgaXMgdmFs
aWQgdW50aWwgdGhlCisgICAgLy8gY2FjaGUgaXMgY2xlYXJlZCBvciBhbm90aGVyIHZlcnRleCBp
cyBhZGRlZC4gUmV0dXJucyAwIGlmCisgICAgLy8gdGhlcmUgYXJlIG5vIHZlcnRpY2VzIGluIHRo
ZSBtZXNoLgorICAgIGNvbnN0IGZsb2F0KiB0ZXhjb29yZHMoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgaWYgKCFudW1iZXJPZlZlcnRpY2VzKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgcmV0dXJuIG1fdGV4Y29vcmRzLmRhdGEoKTsKKyAgICB9CisKKyAgICAvLyBBZGRzIGEgdmVy
dGV4J3MgaW5mb3JtYXRpb24gdG8gdGhlIGNhY2hlLiBUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cwor
ICAgIC8vIGFyZSB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGV4IG9uIHRoZSBw
bGFuZTsgdGhlIGxhc3QKKyAgICAvLyB0aHJlZSBhcmd1bWVudHMgYXJlIHRoZSBjdWJpYyB0ZXh0
dXJlIGNvb3JkaW5hdGVzIGFzc29jaWF0ZWQgd2l0aAorICAgIC8vIHRoaXMgdmVydGV4LgorICAg
IHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgZmxv
YXQgaywgZmxvYXQgbCwgZmxvYXQgbSk7CisKKyAgICB1bnNpZ25lZCBudW1iZXJPZkludGVyaW9y
VmVydGljZXMoKSBjb25zdCB7IHJldHVybiBtX2ludGVyaW9yVmVydGljZXMuc2l6ZSgpIC8gMjsg
fQorCisgICAgLy8gQmFzZSBwb2ludGVyIHRvIHRoZSBpbnRlcmlvciB2ZXJ0aWNlczsgdHdvIGNv
b3JkaW5hdGVzIHBlcgorICAgIC8vIHZlcnRleCwgd2hpY2ggY2FuIGJlIGRyYXduIGFzIEdMX1RS
SUFOR0xFUy4gUmV0dXJucyAwIGlmIHRoZXJlCisgICAgLy8gYXJlIG5vIGludGVyaW9yIHZlcnRp
Y2VzIGluIHRoZSBtZXNoLgorICAgIGNvbnN0IGZsb2F0KiBpbnRlcmlvclZlcnRpY2VzKCkgY29u
c3QKKyAgICB7CisgICAgICAgIGlmICghbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCkpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIG1faW50ZXJpb3JWZXJ0aWNlcy5kYXRh
KCk7CisgICAgfQorCisgICAgdm9pZCBhZGRJbnRlcmlvclZlcnRleChmbG9hdCB4LCBmbG9hdCB5
KTsKKworICAgIC8vIENsZWFycyBhbGwgb2YgdGhlIHN0b3JlZCB2ZXJ0ZXggaW5mb3JtYXRpb24g
aW4gdGhpcyBjYWNoZS4KKyAgICB2b2lkIGNsZWFyKCk7CisKKyNpZmRlZiBMT09QX0JMSU5OX1BB
VEhfQ0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGludGVy
aW9yIGVkZ2UgdmVydGljZXMKKyAgICB1bnNpZ25lZCBudW1iZXJPZkludGVyaW9yRWRnZVZlcnRp
Y2VzKCkgY29uc3Q7CisgICAgLy8gQmFzZSBwb2ludGVyIHRvIHRoZSBpbnRlcmlvciB2ZXJ0aWNl
czsgdHdvIGNvb3JkaW5hdGVzIHBlcgorICAgIC8vIHZlcnRleCwgd2hpY2ggY2FuIGJlIGRyYXdu
IGFzIEdMX0xJTkVTLiBSZXR1cm5zIDAgaWYgdGhlcmUgYXJlCisgICAgLy8gbm8gaW50ZXJpb3Ig
ZWRnZSB2ZXJ0aWNlcyBpbiB0aGUgbWVzaC4KKyAgICBjb25zdCBmbG9hdCogaW50ZXJpb3JFZGdl
VmVydGljZXMoKSBjb25zdDsKKyAgICB2b2lkIGFkZEludGVyaW9yRWRnZVZlcnRleChmbG9hdCB4
LCBmbG9hdCB5KTsKKyNlbmRpZiAvLyBMT09QX0JMSU5OX1BBVEhfQ0FDSEVfREVCVUdfSU5URVJJ
T1JfRURHRVMKKworcHJpdmF0ZToKKyAgICAvLyBUaGUgdHdvLWRpbWVuc2lvbmFsIHZlcnRpY2Vz
IG9mIHRoZSB0cmlhbmdsZSBtZXNoLgorICAgIFZlY3RvcjxmbG9hdD4gbV92ZXJ0aWNlczsKKwor
ICAgIC8vIFRoZSB0aHJlZS1kaW1lbnNpb25hbCBjdWJpYyB0ZXh0dXJlIGNvb3JkaW5hdGVzLgor
ICAgIFZlY3RvcjxmbG9hdD4gbV90ZXhjb29yZHM7CisKKyAgICBWZWN0b3I8ZmxvYXQ+IG1faW50
ZXJpb3JWZXJ0aWNlczsKKworI2lmZGVmIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRF
UklPUl9FREdFUworICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgb25seSBmb3IgZGVidWdnaW5nCisg
ICAgVmVjdG9yPGZsb2F0PiBtX2ludGVyaW9yRWRnZVZlcnRpY2VzOworI2VuZGlmIC8vIExPT1Bf
QkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRFUklPUl9FREdFUworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gTG9vcEJsaW5uUGF0aENhY2hlX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81725</attachid>
            <date>2011-02-08 17:44:33 -0800</date>
            <delta_ts>2011-02-08 17:53:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45519-20110208174432.patch</filename>
            <type>text/plain</type>
            <size>9870</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc3OTk4KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTEtMDItMDggIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEFkZCBjYWNoZSBmb3IgR1BVLWFjY2VsZXJhdGVkIHBhdGggcHJv
Y2Vzc2luZyByZXN1bHRzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD00NTUxOQorCisgICAgICAgIEFkZGluZyBhIGNhY2hlIHdoaWNoIGhvbGRzIHRoZSBy
ZXN1bHRzIG9mIHByb2Nlc3NpbmcgYSBwYXRoIGludG8KKyAgICAgICAgaW50ZXJpb3IgYW5kIGV4
dGVyaW9yIHRyaWFuZ2xlIG1lc2hlcywgYWNjb3JkaW5nIHRvIHRoZSBwYXRoCisgICAgICAgIHJl
bmRlcmluZyBhbGdvcml0aG0gZnJvbSBHUFUgR2VtcyAzLiBObyB0ZXN0cyB5ZXQ7IHdpbGwgYmUg
dGVzdGVkCisgICAgICAgIGluIGNvbmp1bmN0aW9uIHdpdGggbGF0ZXIgY29kZS4KKworICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhDYWNoZTo6TG9vcEJsaW5uUGF0aENhY2hl
KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhDYWNoZTo6fkxvb3BCbGlublBhdGhD
YWNoZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6OmFkZFZlcnRleCk6
CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6OmNsZWFyKToKKyAgICAgICAg
KFdlYkNvcmU6Okxvb3BCbGlublBhdGhDYWNoZTo6YWRkSW50ZXJpb3JWZXJ0ZXgpOgorICAgICAg
ICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aENhY2hlOjpudW1iZXJPZkludGVyaW9yRWRnZVZlcnRp
Y2VzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhDYWNoZTo6aW50ZXJpb3JFZGdl
VmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aENhY2hlOjphZGRJbnRl
cmlvckVkZ2VWZXJ0ZXgpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxp
bm5QYXRoQ2FjaGUuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2Fj
aGU6Om51bWJlck9mVmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aENh
Y2hlOjp2ZXJ0aWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6OnRl
eGNvb3Jkcyk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6Om51bWJlck9m
SW50ZXJpb3JWZXJ0aWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoQ2FjaGU6
OmludGVyaW9yVmVydGljZXMpOgorCiAyMDExLTAyLTA4ICBTaGVyaWZmIEJvdCAgPHdlYmtpdC5y
ZXZpZXcuYm90QGdtYWlsLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCBy
Nzc5ODAuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJs
aW5uUGF0aENhY2hlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aENhY2hlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuY3BwCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
CisjaW5jbHVkZSAiTG9vcEJsaW5uUGF0aENhY2hlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworTG9vcEJsaW5uUGF0aENhY2hlOjpMb29wQmxpbm5QYXRoQ2FjaGUoKQoreworfQorCitMb29w
Qmxpbm5QYXRoQ2FjaGU6On5Mb29wQmxpbm5QYXRoQ2FjaGUoKQoreworfQorCit2b2lkIExvb3BC
bGlublBhdGhDYWNoZTo6YWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGssIGZsb2F0IGwsIGZsb2F0IG0pCit7CisgICAg
bV92ZXJ0aWNlcy5hcHBlbmQoeCk7CisgICAgbV92ZXJ0aWNlcy5hcHBlbmQoeSk7CisgICAgbV90
ZXhjb29yZHMuYXBwZW5kKGspOworICAgIG1fdGV4Y29vcmRzLmFwcGVuZChsKTsKKyAgICBtX3Rl
eGNvb3Jkcy5hcHBlbmQobSk7Cit9CisKK3ZvaWQgTG9vcEJsaW5uUGF0aENhY2hlOjpjbGVhcigp
Cit7CisgICAgbV92ZXJ0aWNlcy5jbGVhcigpOworICAgIG1fdGV4Y29vcmRzLmNsZWFyKCk7Cisg
ICAgbV9pbnRlcmlvclZlcnRpY2VzLmNsZWFyKCk7CisjaWZkZWYgTE9PUF9CTElOTl9QQVRIX0NB
Q0hFX0RFQlVHX0lOVEVSSU9SX0VER0VTCisgICAgbV9pbnRlcmlvckVkZ2VWZXJ0aWNlcy5jbGVh
cigpOworI2VuZGlmIC8vIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRFUklPUl9FREdF
UworfQorCit2b2lkIExvb3BCbGlublBhdGhDYWNoZTo6YWRkSW50ZXJpb3JWZXJ0ZXgoZmxvYXQg
eCwgZmxvYXQgeSkKK3sKKyAgICBtX2ludGVyaW9yVmVydGljZXMuYXBwZW5kKHgpOworICAgIG1f
aW50ZXJpb3JWZXJ0aWNlcy5hcHBlbmQoeSk7Cit9CisKKyNpZmRlZiBMT09QX0JMSU5OX1BBVEhf
Q0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKK3Vuc2lnbmVkIExvb3BCbGlublBhdGhDYWNoZTo6
bnVtYmVyT2ZJbnRlcmlvckVkZ2VWZXJ0aWNlcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW50
ZXJpb3JFZGdlVmVydGljZXMuc2l6ZSgpIC8gMjsKK30KKworY29uc3QgZmxvYXQqIExvb3BCbGlu
blBhdGhDYWNoZTo6aW50ZXJpb3JFZGdlVmVydGljZXMoKSBjb25zdAoreworICAgIGlmICghbnVt
YmVyT2ZJbnRlcmlvckVkZ2VWZXJ0aWNlcygpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1
cm4gbV9pbnRlcmlvckVkZ2VWZXJ0aWNlcy5kYXRhKCk7Cit9CisKK3ZvaWQgTG9vcEJsaW5uUGF0
aENhY2hlOjphZGRJbnRlcmlvckVkZ2VWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBt
X2ludGVyaW9yRWRnZVZlcnRpY2VzLmFwcGVuZCh4KTsKKyAgICBtX2ludGVyaW9yRWRnZVZlcnRp
Y2VzLmFwcGVuZCh5KTsKK30KKyNlbmRpZiAvLyBMT09QX0JMSU5OX1BBVEhfQ0FDSEVfREVCVUdf
SU5URVJJT1JfRURHRVMKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBhdGhDYWNoZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRo
Q2FjaGUuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2dwdS9Mb29wQmxpbm5QYXRoQ2FjaGUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMjMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIExvb3BCbGlublBhdGhDYWNoZV9oCisjZGVmaW5lIExvb3BCbGlublBh
dGhDYWNoZV9oCisKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQSBjYWNoZSBvZiB0aGUgcHJv
Y2Vzc2VkIHRyaWFuZ2xlIG1lc2ggZm9yIGEgZ2l2ZW4gcGF0aC4gQmVjYXVzZSB0aGVzZQorLy8g
bWlnaHQgYmUgZXhwZW5zaXZlIHRvIGFsbG9jYXRlICh1c2luZyBtYWxsb2MvZnJlZSBpbnRlcm5h
bGx5KSwgaXQgaXMKKy8vIHJlY29tbWVuZGVkIHRvIHRyeSB0byByZXVzZSB0aGVtIHdoZW4gcG9z
c2libGUuCisKKy8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIG9idGFpbiBkZWJ1Z2dpbmcg
aW5mb3JtYXRpb24gZm9yIHRoZSBlZGdlcworLy8gZmFjaW5nIHRoZSBpbnRlcmlvciByZWdpb24g
b2YgdGhlIG1lc2guCisvLyAjZGVmaW5lIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRF
UklPUl9FREdFUworCitjbGFzcyBMb29wQmxpbm5QYXRoQ2FjaGUgeworICAgIFdURl9NQUtFX05P
TkNPUFlBQkxFKExvb3BCbGlublBhdGhDYWNoZSk7CitwdWJsaWM6CisgICAgTG9vcEJsaW5uUGF0
aENhY2hlKCk7CisgICAgfkxvb3BCbGlublBhdGhDYWNoZSgpOworCisgICAgdW5zaWduZWQgbnVt
YmVyT2ZWZXJ0aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmVydGljZXMuc2l6ZSgpIC8gMjsgfQor
CisgICAgLy8gR2V0IHRoZSBiYXNlIHBvaW50ZXIgdG8gdGhlIHZlcnRleCBpbmZvcm1hdGlvbi4g
VGhlcmUgYXJlIHR3bworICAgIC8vIGNvb3JkaW5hdGVzIHBlciB2ZXJ0ZXguIFRoaXMgcG9pbnRl
ciBpcyB2YWxpZCB1bnRpbCB0aGUgY2FjaGUgaXMKKyAgICAvLyBjbGVhcmVkIG9yIGFub3RoZXIg
dmVydGV4IGlzIGFkZGVkLiBSZXR1cm5zIDAgaWYgdGhlcmUgYXJlIG5vCisgICAgLy8gdmVydGlj
ZXMgaW4gdGhlIG1lc2guCisgICAgY29uc3QgZmxvYXQqIHZlcnRpY2VzKCkgY29uc3QKKyAgICB7
CisgICAgICAgIGlmICghbnVtYmVyT2ZWZXJ0aWNlcygpKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIHJldHVybiBtX3ZlcnRpY2VzLmRhdGEoKTsKKyAgICB9CisKKyAgICAvLyBHZXQg
dGhlIGJhc2UgcG9pbnRlciB0byB0aGUgdGV4dHVyZSBjb29yZGluYXRlIGluZm9ybWF0aW9uLiBU
aGVyZQorICAgIC8vIGFyZSB0aHJlZSBjb29yZGluYXRlcyBwZXIgdmVydGV4LiBUaGlzIHBvaW50
ZXIgaXMgdmFsaWQgdW50aWwgdGhlCisgICAgLy8gY2FjaGUgaXMgY2xlYXJlZCBvciBhbm90aGVy
IHZlcnRleCBpcyBhZGRlZC4gUmV0dXJucyAwIGlmCisgICAgLy8gdGhlcmUgYXJlIG5vIHZlcnRp
Y2VzIGluIHRoZSBtZXNoLgorICAgIGNvbnN0IGZsb2F0KiB0ZXhjb29yZHMoKSBjb25zdAorICAg
IHsKKyAgICAgICAgaWYgKCFudW1iZXJPZlZlcnRpY2VzKCkpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgcmV0dXJuIG1fdGV4Y29vcmRzLmRhdGEoKTsKKyAgICB9CisKKyAgICAvLyBB
ZGRzIGEgdmVydGV4J3MgaW5mb3JtYXRpb24gdG8gdGhlIGNhY2hlLiBUaGUgZmlyc3QgdHdvIGFy
Z3VtZW50cworICAgIC8vIGFyZSB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGV4
IG9uIHRoZSBwbGFuZTsgdGhlIGxhc3QKKyAgICAvLyB0aHJlZSBhcmd1bWVudHMgYXJlIHRoZSBj
dWJpYyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFzc29jaWF0ZWQgd2l0aAorICAgIC8vIHRoaXMgdmVy
dGV4LgorICAgIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAg
ICAgICAgZmxvYXQgLyprKi8sIGZsb2F0IC8qbCovLCBmbG9hdCAvKm0qLyk7CisKKyAgICB1bnNp
Z25lZCBudW1iZXJPZkludGVyaW9yVmVydGljZXMoKSBjb25zdCB7IHJldHVybiBtX2ludGVyaW9y
VmVydGljZXMuc2l6ZSgpIC8gMjsgfQorCisgICAgLy8gQmFzZSBwb2ludGVyIHRvIHRoZSBpbnRl
cmlvciB2ZXJ0aWNlczsgdHdvIGNvb3JkaW5hdGVzIHBlcgorICAgIC8vIHZlcnRleCwgd2hpY2gg
Y2FuIGJlIGRyYXduIGFzIEdMX1RSSUFOR0xFUy4gUmV0dXJucyAwIGlmIHRoZXJlCisgICAgLy8g
YXJlIG5vIGludGVyaW9yIHZlcnRpY2VzIGluIHRoZSBtZXNoLgorICAgIGNvbnN0IGZsb2F0KiBp
bnRlcmlvclZlcnRpY2VzKCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghbnVtYmVyT2ZJbnRl
cmlvclZlcnRpY2VzKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIG1f
aW50ZXJpb3JWZXJ0aWNlcy5kYXRhKCk7CisgICAgfQorCisgICAgdm9pZCBhZGRJbnRlcmlvclZl
cnRleChmbG9hdCB4LCBmbG9hdCB5KTsKKworICAgIC8vIENsZWFycyBhbGwgb2YgdGhlIHN0b3Jl
ZCB2ZXJ0ZXggaW5mb3JtYXRpb24gaW4gdGhpcyBjYWNoZS4KKyAgICB2b2lkIGNsZWFyKCk7CisK
KyNpZmRlZiBMT09QX0JMSU5OX1BBVEhfQ0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKKyAgICAv
LyBUaGUgbnVtYmVyIG9mIGludGVyaW9yIGVkZ2UgdmVydGljZXMKKyAgICB1bnNpZ25lZCBudW1i
ZXJPZkludGVyaW9yRWRnZVZlcnRpY2VzKCkgY29uc3Q7CisgICAgLy8gQmFzZSBwb2ludGVyIHRv
IHRoZSBpbnRlcmlvciB2ZXJ0aWNlczsgdHdvIGNvb3JkaW5hdGVzIHBlcgorICAgIC8vIHZlcnRl
eCwgd2hpY2ggY2FuIGJlIGRyYXduIGFzIEdMX0xJTkVTLiBSZXR1cm5zIDAgaWYgdGhlcmUgYXJl
CisgICAgLy8gbm8gaW50ZXJpb3IgZWRnZSB2ZXJ0aWNlcyBpbiB0aGUgbWVzaC4KKyAgICBjb25z
dCBmbG9hdCogaW50ZXJpb3JFZGdlVmVydGljZXMoKSBjb25zdDsKKyAgICB2b2lkIGFkZEludGVy
aW9yRWRnZVZlcnRleChmbG9hdCB4LCBmbG9hdCB5KTsKKyNlbmRpZiAvLyBMT09QX0JMSU5OX1BB
VEhfQ0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKKworcHJpdmF0ZToKKyAgICAvLyBUaGUgdHdv
LWRpbWVuc2lvbmFsIHZlcnRpY2VzIG9mIHRoZSB0cmlhbmdsZSBtZXNoLgorICAgIFZlY3Rvcjxm
bG9hdD4gbV92ZXJ0aWNlczsKKworICAgIC8vIFRoZSB0aHJlZS1kaW1lbnNpb25hbCBjdWJpYyB0
ZXh0dXJlIGNvb3JkaW5hdGVzLgorICAgIFZlY3RvcjxmbG9hdD4gbV90ZXhjb29yZHM7CisKKyAg
ICBWZWN0b3I8ZmxvYXQ+IG1faW50ZXJpb3JWZXJ0aWNlczsKKworI2lmZGVmIExPT1BfQkxJTk5f
UEFUSF9DQUNIRV9ERUJVR19JTlRFUklPUl9FREdFUworICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMg
b25seSBmb3IgZGVidWdnaW5nCisgICAgVmVjdG9yPGZsb2F0PiBtX2ludGVyaW9yRWRnZVZlcnRp
Y2VzOworI2VuZGlmIC8vIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRFUklPUl9FREdF
UworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gTG9vcEJsaW5uUGF0
aENhY2hlX2gK
</data>
<flag name="review"
          id="73331"
          type_id="1"
          status="+"
          setter="jamesr"
    />
    <flag name="commit-queue"
          id="73332"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>