<?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>44566</bug_id>
          
          <creation_ts>2010-08-24 17:34:47 -0700</creation_ts>
          <short_desc>Passing premultiplyAlpha=false to tex{Sub}Image2D loses information (cg)</short_desc>
          <delta_ts>2010-09-07 12:13:04 -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>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</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>
          
          <blocked>44661</blocked>
    
    <blocked>44993</blocked>
    
    <blocked>45316</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Zhenyao Mo">zmo</reporter>
          <assigned_to name="Zhenyao Mo">zmo</assigned_to>
          <cc>abarth</cc>
    
    <cc>cmarrin</cc>
    
    <cc>enne</cc>
    
    <cc>eric</cc>
    
    <cc>kbr</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>268927</commentid>
    <comment_count>0</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-24 17:34:47 -0700</bug_when>
    <thetext>skia port is fixed in https://bugs.webkit.org/show_bug.cgi?id=38282</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>269702</commentid>
    <comment_count>1</comment_count>
      <attachid>65521</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-25 20:49:39 -0700</bug_when>
    <thetext>Created attachment 65521
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>269976</commentid>
    <comment_count>2</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-26 11:19:10 -0700</bug_when>
    <thetext>Don&apos;t review this patch.  There is some issue I need to fix first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270006</commentid>
    <comment_count>3</comment_count>
      <attachid>65590</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-26 11:46:39 -0700</bug_when>
    <thetext>Created attachment 65590
revised patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271767</commentid>
    <comment_count>4</comment_count>
      <attachid>65590</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-08-30 17:00:06 -0700</bug_when>
    <thetext>Comment on attachment 65590
revised patch

This basically looks good but there is one issue that needs addressing which is why I&apos;m r-&apos;ing it.

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 66078)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,13 @@
&gt; +2010-08-25  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Passing premultiplyAlpha=false to tex{Sub}Image2D loses information (cg)
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=44566
&gt; +
&gt; +        * platform/graphics/cg/GraphicsContext3DCG.cpp:
&gt; +        (WebCore::GraphicsContext3D::getImageData): Fix the premultiplyAlpha issue for cg.
&gt; +
&gt;  2010-08-25  Mark Rowe  &lt;mrowe@apple.com&gt;
&gt;  
&gt;          Reviewed by Dan Bernstein.
&gt; Index: WebCore/platform/graphics/cg/GraphicsContext3DCG.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/cg/GraphicsContext3DCG.cpp	(revision 66042)
&gt; +++ WebCore/platform/graphics/cg/GraphicsContext3DCG.cpp	(working copy)
&gt; @@ -34,6 +34,7 @@
&gt;  
&gt;  #include &lt;CoreGraphics/CGBitmapContext.h&gt;
&gt;  #include &lt;CoreGraphics/CGContext.h&gt;
&gt; +#include &lt;CoreGraphics/CGDataProvider.h&gt;
&gt;  #include &lt;CoreGraphics/CGImage.h&gt;
&gt;  
&gt;  #include &lt;wtf/RetainPtr.h&gt;
&gt; @@ -49,61 +50,98 @@ bool GraphicsContext3D::getImageData(Ima
&gt;      if (!image)
&gt;          return false;
&gt;      CGImageRef cgImage = image-&gt;nativeImageForCurrentFrame();

We don&apos;t want to call this all the time, only if image-&gt;data() is 0. Since you&apos;d be assigning cgImage in both arms of the if, you wouldn&apos;t need to initialize it upon declaration.

&gt; +    RetainPtr&lt;CGImageRef&gt; decodedImage;
&gt; +    if (image-&gt;data()) {
&gt; +        ImageSource decoder(false);
&gt; +        decoder.setData(image-&gt;data(), true);
&gt; +        if (!decoder.frameCount())
&gt; +            return false;
&gt; +        decodedImage = decoder.createFrameAtIndex(0);
&gt; +        cgImage = decodedImage.get();
&gt; +    }
&gt;      if (!cgImage)
&gt;          return false;
&gt; -    int width = CGImageGetWidth(cgImage);
&gt; -    int height = CGImageGetHeight(cgImage);
&gt; -    // FIXME: we should get rid of this temporary copy where possible.
&gt; -    int tempRowBytes = width * 4;
&gt; -    Vector&lt;uint8_t&gt; tempVector;
&gt; -    tempVector.resize(height * tempRowBytes);
&gt; -    // Try to reuse the color space from the image to preserve its colors.
&gt; -    // Some images use a color space (such as indexed) unsupported by the bitmap context.
&gt; -    CGColorSpaceRef colorSpace = CGImageGetColorSpace(cgImage);
&gt; -    bool releaseColorSpace = false;
&gt; -    CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);
&gt; -    switch (colorSpaceModel) {
&gt; -    case kCGColorSpaceModelMonochrome:
&gt; -    case kCGColorSpaceModelRGB:
&gt; -    case kCGColorSpaceModelCMYK:
&gt; -    case kCGColorSpaceModelLab:
&gt; -    case kCGColorSpaceModelDeviceN:
&gt; +    size_t width = CGImageGetWidth(cgImage);
&gt; +    size_t height = CGImageGetHeight(cgImage);
&gt; +    if (!width || !height || CGImageGetBitsPerComponent(cgImage) != 8)
&gt; +        return false;
&gt; +    size_t componentsPerPixel = CGImageGetBitsPerPixel(cgImage) / 8;
&gt; +    SourceDataFormat srcDataFormat = kSourceFormatRGBA8;
&gt; +    AlphaOp neededAlphaOp = kAlphaDoNothing;
&gt; +    switch (CGImageGetAlphaInfo(cgImage)) {
&gt; +    case kCGImageAlphaPremultipliedFirst:
&gt; +    case kCGImageAlphaFirst:
&gt; +    case kCGImageAlphaNoneSkipFirst:
&gt; +        return false;
&gt; +    case kCGImageAlphaPremultipliedLast:
&gt; +        // This is a special case for texImage2D with HTMLCanvasElement input,
&gt; +        // in which case image-&gt;data() should be null.
&gt; +        ASSERT(!image-&gt;data());
&gt; +        if (!premultiplyAlpha)
&gt; +            neededAlphaOp = kAlphaDoUnmultiply;
&gt; +        switch (componentsPerPixel) {
&gt; +        case 2:
&gt; +            srcDataFormat = kSourceFormatRA8;
&gt; +            break;
&gt; +        case 4:
&gt; +            srcDataFormat = kSourceFormatRGBA8;
&gt; +            break;
&gt; +        default:
&gt; +            return false;
&gt; +        }
&gt;          break;
&gt; -    default:
&gt; -        colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGBLinear);
&gt; -        releaseColorSpace = true;
&gt; +    case kCGImageAlphaLast:
&gt; +        if (premultiplyAlpha)
&gt; +            neededAlphaOp = kAlphaDoPremultiply;
&gt; +        switch (componentsPerPixel) {
&gt; +        case 1:
&gt; +            srcDataFormat = kSourceFormatA8;
&gt; +            break;
&gt; +        case 2:
&gt; +            srcDataFormat = kSourceFormatRA8;
&gt; +            break;
&gt; +        case 4:
&gt; +            srcDataFormat = kSourceFormatRGBA8;
&gt; +            break;
&gt; +        default:
&gt; +            return false;
&gt; +        }
&gt;          break;
&gt; +    case kCGImageAlphaNoneSkipLast:
&gt; +        switch (componentsPerPixel) {
&gt; +        case 2:
&gt; +            srcDataFormat = kSourceFormatRA8;
&gt; +            break;
&gt; +        case 4:
&gt; +            srcDataFormat = kSourceFormatRGBA8;
&gt; +            break;
&gt; +        default:
&gt; +            return false;
&gt; +        }
&gt; +    case kCGImageAlphaNone:
&gt; +        switch (componentsPerPixel) {
&gt; +        case 1:
&gt; +            srcDataFormat = kSourceFormatR8;
&gt; +            break;
&gt; +        case 3:
&gt; +            srcDataFormat = kSourceFormatRGB8;
&gt; +            break;
&gt; +        default:
&gt; +            return false;
&gt; +        }
&gt; +        break;
&gt; +    default:
&gt; +        return false;
&gt;      }
&gt; -    CGContextRef tempContext = CGBitmapContextCreate(tempVector.data(),
&gt; -                                                     width, height, 8, tempRowBytes,
&gt; -                                                     colorSpace,
&gt; -                                                     // FIXME: change this!
&gt; -                                                     kCGImageAlphaPremultipliedLast);
&gt; -    if (releaseColorSpace)
&gt; -        CGColorSpaceRelease(colorSpace);
&gt; -    if (!tempContext)
&gt; -        return false;
&gt; -    CGContextSetBlendMode(tempContext, kCGBlendModeCopy);
&gt; -    CGContextDrawImage(tempContext,
&gt; -                       CGRectMake(0, 0, static_cast&lt;CGFloat&gt;(width), static_cast&lt;CGFloat&gt;(height)),
&gt; -                       cgImage);
&gt; -    CGContextRelease(tempContext);
&gt; -    // Pack the pixel data into the output vector.
&gt; -    unsigned long componentsPerPixel, bytesPerComponent;
&gt; -    if (!computeFormatAndTypeParameters(format, type, &amp;componentsPerPixel, &amp;bytesPerComponent))
&gt; -        return false;
&gt; -    int rowBytes = width * componentsPerPixel * bytesPerComponent;
&gt; -    outputVector.resize(height * rowBytes);
&gt; -    CGImageAlphaInfo info = CGImageGetAlphaInfo(cgImage);
&gt; -    bool hasAlphaChannel = (info != kCGImageAlphaNone
&gt; -                            &amp;&amp; info != kCGImageAlphaNoneSkipLast
&gt; -                            &amp;&amp; info != kCGImageAlphaNoneSkipFirst);
&gt; -    AlphaOp neededAlphaOp = kAlphaDoNothing;
&gt; -    if (!premultiplyAlpha &amp;&amp; hasAlphaChannel)
&gt; -        // FIXME: must fetch the image data before the premultiplication step.
&gt; -        neededAlphaOp = kAlphaDoUnmultiply;
&gt; -    return packPixels(tempVector.data(), kSourceFormatRGBA8, width, height, 0,
&gt; -                      format, type, neededAlphaOp, outputVector.data());
&gt; +    CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));

Does this work even if we didn&apos;t take the code path for &quot;if (image-&gt;data())&quot;? Also, you should use RetainPtr&lt;CFDataRef&gt; here, and initialize it with adoptCF(...).

&gt; +    if (!pixelData)
&gt; +        return false;
&gt; +    const UInt8* rgba = CFDataGetBytePtr(pixelData);
&gt; +    outputVector.resize(width * height * 4);
&gt; +    bool rt = packPixels(rgba, srcDataFormat, width, height, 0,
&gt; +                         format, type, neededAlphaOp, outputVector.data());
&gt; +    CFRelease(pixelData);
&gt; +    return rt;
&gt;  }
&gt;  
&gt;  void GraphicsContext3D::paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight, int canvasWidth, int canvasHeight, CGContextRef context)
&gt; Index: LayoutTests/ChangeLog
&gt; ===================================================================
&gt; --- LayoutTests/ChangeLog	(revision 66078)
&gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; @@ -1,3 +1,14 @@
&gt; +2010-08-25  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Passing premultiplyAlpha=false to tex{Sub}Image2D loses information (cg)
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=44566
&gt; +
&gt; +        * fast/canvas/webgl/gl-teximage-expected.txt: Fix a typo in the file.
&gt; +        * platform/chromium/test_expectations.txt: Re-enable gl-teximage.html test.
&gt; +        * platform/mac/Skipped: Ditto.
&gt; +
&gt;  2010-08-25  Michael Saboff  &lt;msaboff@apple.com&gt;
&gt;  
&gt;          Reviewed by Oliver Hunt.
&gt; Index: LayoutTests/fast/canvas/webgl/gl-teximage-expected.txt
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/gl-teximage-expected.txt	(revision 66042)
&gt; +++ LayoutTests/fast/canvas/webgl/gl-teximage-expected.txt	(working copy)
&gt; @@ -7,7 +7,7 @@ PASS getError was expected value: NO_ERR
&gt;  check pixels are NOT pre-multiplied
&gt;  PASS getError was expected value: NO_ERROR : Should be no errors from setup
&gt;  PASS pixel 0, 15 should be 0, 0, 0, 255 was 0, 0, 0, 255
&gt; -PASS pixel 128, 15 should be 255, 0, 255, 255 was 255, 0, 0, 255
&gt; +PASS pixel 128, 15 should be 255, 0, 255, 255 was 255, 0, 255, 255
&gt;  PASS pixel 255, 15 should be 0, 0, 255, 255 was 0, 0, 255, 255
&gt;  PASS pixel 0, 8 should be 128, 128, 128, 255 was 128, 128, 128, 255
&gt;  PASS pixel 128, 8 should be 255, 255, 255, 255 was 255, 255, 255, 255
&gt; Index: LayoutTests/platform/chromium/test_expectations.txt
&gt; ===================================================================
&gt; --- LayoutTests/platform/chromium/test_expectations.txt	(revision 66042)
&gt; +++ LayoutTests/platform/chromium/test_expectations.txt	(working copy)
&gt; @@ -2565,9 +2565,6 @@ BUGWK37297 : fast/history/sibling-visite
&gt;  BUGWK36983 MAC : fast/canvas/webgl/null-object-behaviour.html = TEXT
&gt;  BUGWK36983 MAC : fast/canvas/webgl/uniform-location.html = TEXT
&gt;  
&gt; -// Caused by premultiplying alphas in CG image decoding.
&gt; -BUG44566 MAC : fast/canvas/webgl/gl-teximage.html = TEXT
&gt; -
&gt;  // Added in http://trac.webkit.org/changeset/57476. Fails in Chromium because
&gt;  // LayoutTestController::computedStyleWithVisitedInfo() is missing.
&gt;  BUG41206 : fast/history/multiple-classes-visited.html = TEXT TIMEOUT
&gt; Index: LayoutTests/platform/mac/Skipped
&gt; ===================================================================
&gt; --- LayoutTests/platform/mac/Skipped	(revision 66042)
&gt; +++ LayoutTests/platform/mac/Skipped	(working copy)
&gt; @@ -292,6 +292,3 @@ animations/play-state.html
&gt;  
&gt;  # https://bugs.webkit.org/show_bug.cgi?id=43332
&gt;  inspector/dom-breakpoints.html
&gt; -
&gt; -# https://bugs.webkit.org/show_bug.cgi?id=44566
&gt; -fast/canvas/webgl/gl-teximage.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271846</commentid>
    <comment_count>5</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-30 18:36:20 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 65590 [details])
&gt; This basically looks good but there is one issue that needs addressing which is why I&apos;m r-&apos;ing it.
&gt; 
&gt; &gt; Index: WebCore/ChangeLog
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/ChangeLog	(revision 66078)
&gt; &gt; +++ WebCore/ChangeLog	(working copy)
&gt; &gt; @@ -1,3 +1,13 @@
&gt; &gt; +2010-08-25  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        Passing premultiplyAlpha=false to tex{Sub}Image2D loses information (cg)
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=44566
&gt; &gt; +
&gt; &gt; +        * platform/graphics/cg/GraphicsContext3DCG.cpp:
&gt; &gt; +        (WebCore::GraphicsContext3D::getImageData): Fix the premultiplyAlpha issue for cg.
&gt; &gt; +
&gt; &gt;  2010-08-25  Mark Rowe  &lt;mrowe@apple.com&gt;
&gt; &gt;  
&gt; &gt;          Reviewed by Dan Bernstein.
&gt; &gt; Index: WebCore/platform/graphics/cg/GraphicsContext3DCG.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/platform/graphics/cg/GraphicsContext3DCG.cpp	(revision 66042)
&gt; &gt; +++ WebCore/platform/graphics/cg/GraphicsContext3DCG.cpp	(working copy)
&gt; &gt; @@ -34,6 +34,7 @@
&gt; &gt;  
&gt; &gt;  #include &lt;CoreGraphics/CGBitmapContext.h&gt;
&gt; &gt;  #include &lt;CoreGraphics/CGContext.h&gt;
&gt; &gt; +#include &lt;CoreGraphics/CGDataProvider.h&gt;
&gt; &gt;  #include &lt;CoreGraphics/CGImage.h&gt;
&gt; &gt;  
&gt; &gt;  #include &lt;wtf/RetainPtr.h&gt;
&gt; &gt; @@ -49,61 +50,98 @@ bool GraphicsContext3D::getImageData(Ima
&gt; &gt;      if (!image)
&gt; &gt;          return false;
&gt; &gt;      CGImageRef cgImage = image-&gt;nativeImageForCurrentFrame();
&gt; 
&gt; We don&apos;t want to call this all the time, only if image-&gt;data() is 0. Since you&apos;d be assigning cgImage in both arms of the if, you wouldn&apos;t need to initialize it upon declaration.
&gt; 
&gt; &gt; +    RetainPtr&lt;CGImageRef&gt; decodedImage;
&gt; &gt; +    if (image-&gt;data()) {
&gt; &gt; +        ImageSource decoder(false);
&gt; &gt; +        decoder.setData(image-&gt;data(), true);
&gt; &gt; +        if (!decoder.frameCount())
&gt; &gt; +            return false;
&gt; &gt; +        decodedImage = decoder.createFrameAtIndex(0);
&gt; &gt; +        cgImage = decodedImage.get();
&gt; &gt; +    }
&gt; &gt;      if (!cgImage)
&gt; &gt;          return false;
&gt; &gt; -    int width = CGImageGetWidth(cgImage);
&gt; &gt; -    int height = CGImageGetHeight(cgImage);
&gt; &gt; -    // FIXME: we should get rid of this temporary copy where possible.
&gt; &gt; -    int tempRowBytes = width * 4;
&gt; &gt; -    Vector&lt;uint8_t&gt; tempVector;
&gt; &gt; -    tempVector.resize(height * tempRowBytes);
&gt; &gt; -    // Try to reuse the color space from the image to preserve its colors.
&gt; &gt; -    // Some images use a color space (such as indexed) unsupported by the bitmap context.
&gt; &gt; -    CGColorSpaceRef colorSpace = CGImageGetColorSpace(cgImage);
&gt; &gt; -    bool releaseColorSpace = false;
&gt; &gt; -    CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);
&gt; &gt; -    switch (colorSpaceModel) {
&gt; &gt; -    case kCGColorSpaceModelMonochrome:
&gt; &gt; -    case kCGColorSpaceModelRGB:
&gt; &gt; -    case kCGColorSpaceModelCMYK:
&gt; &gt; -    case kCGColorSpaceModelLab:
&gt; &gt; -    case kCGColorSpaceModelDeviceN:
&gt; &gt; +    size_t width = CGImageGetWidth(cgImage);
&gt; &gt; +    size_t height = CGImageGetHeight(cgImage);
&gt; &gt; +    if (!width || !height || CGImageGetBitsPerComponent(cgImage) != 8)
&gt; &gt; +        return false;
&gt; &gt; +    size_t componentsPerPixel = CGImageGetBitsPerPixel(cgImage) / 8;
&gt; &gt; +    SourceDataFormat srcDataFormat = kSourceFormatRGBA8;
&gt; &gt; +    AlphaOp neededAlphaOp = kAlphaDoNothing;
&gt; &gt; +    switch (CGImageGetAlphaInfo(cgImage)) {
&gt; &gt; +    case kCGImageAlphaPremultipliedFirst:
&gt; &gt; +    case kCGImageAlphaFirst:
&gt; &gt; +    case kCGImageAlphaNoneSkipFirst:
&gt; &gt; +        return false;
&gt; &gt; +    case kCGImageAlphaPremultipliedLast:
&gt; &gt; +        // This is a special case for texImage2D with HTMLCanvasElement input,
&gt; &gt; +        // in which case image-&gt;data() should be null.
&gt; &gt; +        ASSERT(!image-&gt;data());
&gt; &gt; +        if (!premultiplyAlpha)
&gt; &gt; +            neededAlphaOp = kAlphaDoUnmultiply;
&gt; &gt; +        switch (componentsPerPixel) {
&gt; &gt; +        case 2:
&gt; &gt; +            srcDataFormat = kSourceFormatRA8;
&gt; &gt; +            break;
&gt; &gt; +        case 4:
&gt; &gt; +            srcDataFormat = kSourceFormatRGBA8;
&gt; &gt; +            break;
&gt; &gt; +        default:
&gt; &gt; +            return false;
&gt; &gt; +        }
&gt; &gt;          break;
&gt; &gt; -    default:
&gt; &gt; -        colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGBLinear);
&gt; &gt; -        releaseColorSpace = true;
&gt; &gt; +    case kCGImageAlphaLast:
&gt; &gt; +        if (premultiplyAlpha)
&gt; &gt; +            neededAlphaOp = kAlphaDoPremultiply;
&gt; &gt; +        switch (componentsPerPixel) {
&gt; &gt; +        case 1:
&gt; &gt; +            srcDataFormat = kSourceFormatA8;
&gt; &gt; +            break;
&gt; &gt; +        case 2:
&gt; &gt; +            srcDataFormat = kSourceFormatRA8;
&gt; &gt; +            break;
&gt; &gt; +        case 4:
&gt; &gt; +            srcDataFormat = kSourceFormatRGBA8;
&gt; &gt; +            break;
&gt; &gt; +        default:
&gt; &gt; +            return false;
&gt; &gt; +        }
&gt; &gt;          break;
&gt; &gt; +    case kCGImageAlphaNoneSkipLast:
&gt; &gt; +        switch (componentsPerPixel) {
&gt; &gt; +        case 2:
&gt; &gt; +            srcDataFormat = kSourceFormatRA8;
&gt; &gt; +            break;
&gt; &gt; +        case 4:
&gt; &gt; +            srcDataFormat = kSourceFormatRGBA8;
&gt; &gt; +            break;
&gt; &gt; +        default:
&gt; &gt; +            return false;
&gt; &gt; +        }
&gt; &gt; +    case kCGImageAlphaNone:
&gt; &gt; +        switch (componentsPerPixel) {
&gt; &gt; +        case 1:
&gt; &gt; +            srcDataFormat = kSourceFormatR8;
&gt; &gt; +            break;
&gt; &gt; +        case 3:
&gt; &gt; +            srcDataFormat = kSourceFormatRGB8;
&gt; &gt; +            break;
&gt; &gt; +        default:
&gt; &gt; +            return false;
&gt; &gt; +        }
&gt; &gt; +        break;
&gt; &gt; +    default:
&gt; &gt; +        return false;
&gt; &gt;      }
&gt; &gt; -    CGContextRef tempContext = CGBitmapContextCreate(tempVector.data(),
&gt; &gt; -                                                     width, height, 8, tempRowBytes,
&gt; &gt; -                                                     colorSpace,
&gt; &gt; -                                                     // FIXME: change this!
&gt; &gt; -                                                     kCGImageAlphaPremultipliedLast);
&gt; &gt; -    if (releaseColorSpace)
&gt; &gt; -        CGColorSpaceRelease(colorSpace);
&gt; &gt; -    if (!tempContext)
&gt; &gt; -        return false;
&gt; &gt; -    CGContextSetBlendMode(tempContext, kCGBlendModeCopy);
&gt; &gt; -    CGContextDrawImage(tempContext,
&gt; &gt; -                       CGRectMake(0, 0, static_cast&lt;CGFloat&gt;(width), static_cast&lt;CGFloat&gt;(height)),
&gt; &gt; -                       cgImage);
&gt; &gt; -    CGContextRelease(tempContext);
&gt; &gt; -    // Pack the pixel data into the output vector.
&gt; &gt; -    unsigned long componentsPerPixel, bytesPerComponent;
&gt; &gt; -    if (!computeFormatAndTypeParameters(format, type, &amp;componentsPerPixel, &amp;bytesPerComponent))
&gt; &gt; -        return false;
&gt; &gt; -    int rowBytes = width * componentsPerPixel * bytesPerComponent;
&gt; &gt; -    outputVector.resize(height * rowBytes);
&gt; &gt; -    CGImageAlphaInfo info = CGImageGetAlphaInfo(cgImage);
&gt; &gt; -    bool hasAlphaChannel = (info != kCGImageAlphaNone
&gt; &gt; -                            &amp;&amp; info != kCGImageAlphaNoneSkipLast
&gt; &gt; -                            &amp;&amp; info != kCGImageAlphaNoneSkipFirst);
&gt; &gt; -    AlphaOp neededAlphaOp = kAlphaDoNothing;
&gt; &gt; -    if (!premultiplyAlpha &amp;&amp; hasAlphaChannel)
&gt; &gt; -        // FIXME: must fetch the image data before the premultiplication step.
&gt; &gt; -        neededAlphaOp = kAlphaDoUnmultiply;
&gt; &gt; -    return packPixels(tempVector.data(), kSourceFormatRGBA8, width, height, 0,
&gt; &gt; -                      format, type, neededAlphaOp, outputVector.data());
&gt; &gt; +    CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
&gt; 
&gt; Does this work even if we didn&apos;t take the code path for &quot;if (image-&gt;data())&quot;? Also, you should use RetainPtr&lt;CFDataRef&gt; here, and initialize it with adoptCF(...).

Yes, it works for both cases.  I&apos;ll fix the mentioned issues.

&gt; 
&gt; &gt; +    if (!pixelData)
&gt; &gt; +        return false;
&gt; &gt; +    const UInt8* rgba = CFDataGetBytePtr(pixelData);
&gt; &gt; +    outputVector.resize(width * height * 4);
&gt; &gt; +    bool rt = packPixels(rgba, srcDataFormat, width, height, 0,
&gt; &gt; +                         format, type, neededAlphaOp, outputVector.data());
&gt; &gt; +    CFRelease(pixelData);
&gt; &gt; +    return rt;
&gt; &gt;  }
&gt; &gt;  
&gt; &gt;  void GraphicsContext3D::paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight, int canvasWidth, int canvasHeight, CGContextRef context)
&gt; &gt; Index: LayoutTests/ChangeLog
&gt; &gt; ===================================================================
&gt; &gt; --- LayoutTests/ChangeLog	(revision 66078)
&gt; &gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; &gt; @@ -1,3 +1,14 @@
&gt; &gt; +2010-08-25  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        Passing premultiplyAlpha=false to tex{Sub}Image2D loses information (cg)
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=44566
&gt; &gt; +
&gt; &gt; +        * fast/canvas/webgl/gl-teximage-expected.txt: Fix a typo in the file.
&gt; &gt; +        * platform/chromium/test_expectations.txt: Re-enable gl-teximage.html test.
&gt; &gt; +        * platform/mac/Skipped: Ditto.
&gt; &gt; +
&gt; &gt;  2010-08-25  Michael Saboff  &lt;msaboff@apple.com&gt;
&gt; &gt;  
&gt; &gt;          Reviewed by Oliver Hunt.
&gt; &gt; Index: LayoutTests/fast/canvas/webgl/gl-teximage-expected.txt
&gt; &gt; ===================================================================
&gt; &gt; --- LayoutTests/fast/canvas/webgl/gl-teximage-expected.txt	(revision 66042)
&gt; &gt; +++ LayoutTests/fast/canvas/webgl/gl-teximage-expected.txt	(working copy)
&gt; &gt; @@ -7,7 +7,7 @@ PASS getError was expected value: NO_ERR
&gt; &gt;  check pixels are NOT pre-multiplied
&gt; &gt;  PASS getError was expected value: NO_ERROR : Should be no errors from setup
&gt; &gt;  PASS pixel 0, 15 should be 0, 0, 0, 255 was 0, 0, 0, 255
&gt; &gt; -PASS pixel 128, 15 should be 255, 0, 255, 255 was 255, 0, 0, 255
&gt; &gt; +PASS pixel 128, 15 should be 255, 0, 255, 255 was 255, 0, 255, 255
&gt; &gt;  PASS pixel 255, 15 should be 0, 0, 255, 255 was 0, 0, 255, 255
&gt; &gt;  PASS pixel 0, 8 should be 128, 128, 128, 255 was 128, 128, 128, 255
&gt; &gt;  PASS pixel 128, 8 should be 255, 255, 255, 255 was 255, 255, 255, 255
&gt; &gt; Index: LayoutTests/platform/chromium/test_expectations.txt
&gt; &gt; ===================================================================
&gt; &gt; --- LayoutTests/platform/chromium/test_expectations.txt	(revision 66042)
&gt; &gt; +++ LayoutTests/platform/chromium/test_expectations.txt	(working copy)
&gt; &gt; @@ -2565,9 +2565,6 @@ BUGWK37297 : fast/history/sibling-visite
&gt; &gt;  BUGWK36983 MAC : fast/canvas/webgl/null-object-behaviour.html = TEXT
&gt; &gt;  BUGWK36983 MAC : fast/canvas/webgl/uniform-location.html = TEXT
&gt; &gt;  
&gt; &gt; -// Caused by premultiplying alphas in CG image decoding.
&gt; &gt; -BUG44566 MAC : fast/canvas/webgl/gl-teximage.html = TEXT
&gt; &gt; -
&gt; &gt;  // Added in http://trac.webkit.org/changeset/57476. Fails in Chromium because
&gt; &gt;  // LayoutTestController::computedStyleWithVisitedInfo() is missing.
&gt; &gt;  BUG41206 : fast/history/multiple-classes-visited.html = TEXT TIMEOUT
&gt; &gt; Index: LayoutTests/platform/mac/Skipped
&gt; &gt; ===================================================================
&gt; &gt; --- LayoutTests/platform/mac/Skipped	(revision 66042)
&gt; &gt; +++ LayoutTests/platform/mac/Skipped	(working copy)
&gt; &gt; @@ -292,6 +292,3 @@ animations/play-state.html
&gt; &gt;  
&gt; &gt;  # https://bugs.webkit.org/show_bug.cgi?id=43332
&gt; &gt;  inspector/dom-breakpoints.html
&gt; &gt; -
&gt; &gt; -# https://bugs.webkit.org/show_bug.cgi?id=44566
&gt; &gt; -fast/canvas/webgl/gl-teximage.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271871</commentid>
    <comment_count>6</comment_count>
      <attachid>66002</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-30 19:22:39 -0700</bug_when>
    <thetext>Created attachment 66002
revised patch: responding to kbr&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271881</commentid>
    <comment_count>7</comment_count>
      <attachid>66002</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-08-30 20:27:49 -0700</bug_when>
    <thetext>Comment on attachment 66002
revised patch: responding to kbr&apos;s review

Looks good; r=me. It would be nice to common up the nested switch statements at some point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272159</commentid>
    <comment_count>8</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-31 09:57:50 -0700</bug_when>
    <thetext>Committed r66494: &lt;http://trac.webkit.org/changeset/66494&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>272636</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-31 22:15:42 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/66494 might have broken Leopard Intel Debug (Tests)
The following changes are on the blame list:
http://trac.webkit.org/changeset/66493
http://trac.webkit.org/changeset/66494
http://trac.webkit.org/changeset/66495</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65521</attachid>
            <date>2010-08-25 20:49:39 -0700</date>
            <delta_ts>2010-08-26 11:46:39 -0700</delta_ts>
            <desc>patch</desc>
            <filename>cg.patch</filename>
            <type>text/plain</type>
            <size>9812</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjA3OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTMgQEAKKzIwMTAtMDgtMjUgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBQYXNzaW5n
IHByZW11bHRpcGx5QWxwaGE9ZmFsc2UgdG8gdGV4e1N1Yn1JbWFnZTJEIGxvc2VzIGluZm9ybWF0
aW9uIChjZykKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ0NTY2CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHQz
RENHLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbWFnZURh
dGEpOiBGaXggdGhlIHByZW11bHRpcGx5QWxwaGEgaXNzdWUgZm9yIGNnLgorCiAyMDEwLTA4LTI1
ICBNYXJrIFJvd2UgIDxtcm93ZUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFu
IEJlcm5zdGVpbi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3ND
b250ZXh0M0RDRy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
Zy9HcmFwaGljc0NvbnRleHQzRENHLmNwcAkocmV2aXNpb24gNjYwNDIpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dDNEQ0cuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250
ZXh0Lmg+CiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQ29udGV4dC5oPgorI2luY2x1ZGUgPENv
cmVHcmFwaGljcy9DR0RhdGFQcm92aWRlci5oPgogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0lt
YWdlLmg+CiAKICNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+CkBAIC00OSw2MSArNTAsOTUgQEAg
Ym9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0SW1hZ2VEYXRhKEltYQogICAgIGlmICghaW1hZ2Up
CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBDR0ltYWdlUmVmIGNnSW1hZ2UgPSBpbWFnZS0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICBSZXRhaW5QdHI8Q0dJbWFnZVJlZj4g
ZGVjb2RlZEltYWdlOworICAgIGlmIChpbWFnZS0+ZGF0YSgpKSB7CisgICAgICAgIEltYWdlU291
cmNlIGRlY29kZXIoZmFsc2UpOworICAgICAgICBkZWNvZGVyLnNldERhdGEoaW1hZ2UtPmRhdGEo
KSwgdHJ1ZSk7CisgICAgICAgIGlmICghZGVjb2Rlci5mcmFtZUNvdW50KCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGRlY29kZWRJbWFnZSA9IGRlY29kZXIuY3JlYXRlRnJh
bWVBdEluZGV4KDApOworICAgICAgICBjZ0ltYWdlID0gZGVjb2RlZEltYWdlLmdldCgpOworICAg
IH0KICAgICBpZiAoIWNnSW1hZ2UpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpbnQgd2lk
dGggPSBDR0ltYWdlR2V0V2lkdGgoY2dJbWFnZSk7Ci0gICAgaW50IGhlaWdodCA9IENHSW1hZ2VH
ZXRIZWlnaHQoY2dJbWFnZSk7Ci0gICAgLy8gRklYTUU6IHdlIHNob3VsZCBnZXQgcmlkIG9mIHRo
aXMgdGVtcG9yYXJ5IGNvcHkgd2hlcmUgcG9zc2libGUuCi0gICAgaW50IHRlbXBSb3dCeXRlcyA9
IHdpZHRoICogNDsKLSAgICBWZWN0b3I8dWludDhfdD4gdGVtcFZlY3RvcjsKLSAgICB0ZW1wVmVj
dG9yLnJlc2l6ZShoZWlnaHQgKiB0ZW1wUm93Qnl0ZXMpOwotICAgIC8vIFRyeSB0byByZXVzZSB0
aGUgY29sb3Igc3BhY2UgZnJvbSB0aGUgaW1hZ2UgdG8gcHJlc2VydmUgaXRzIGNvbG9ycy4KLSAg
ICAvLyBTb21lIGltYWdlcyB1c2UgYSBjb2xvciBzcGFjZSAoc3VjaCBhcyBpbmRleGVkKSB1bnN1
cHBvcnRlZCBieSB0aGUgYml0bWFwIGNvbnRleHQuCi0gICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9y
U3BhY2UgPSBDR0ltYWdlR2V0Q29sb3JTcGFjZShjZ0ltYWdlKTsKLSAgICBib29sIHJlbGVhc2VD
b2xvclNwYWNlID0gZmFsc2U7Ci0gICAgQ0dDb2xvclNwYWNlTW9kZWwgY29sb3JTcGFjZU1vZGVs
ID0gQ0dDb2xvclNwYWNlR2V0TW9kZWwoY29sb3JTcGFjZSk7Ci0gICAgc3dpdGNoIChjb2xvclNw
YWNlTW9kZWwpIHsKLSAgICBjYXNlIGtDR0NvbG9yU3BhY2VNb2RlbE1vbm9jaHJvbWU6Ci0gICAg
Y2FzZSBrQ0dDb2xvclNwYWNlTW9kZWxSR0I6Ci0gICAgY2FzZSBrQ0dDb2xvclNwYWNlTW9kZWxD
TVlLOgotICAgIGNhc2Uga0NHQ29sb3JTcGFjZU1vZGVsTGFiOgotICAgIGNhc2Uga0NHQ29sb3JT
cGFjZU1vZGVsRGV2aWNlTjoKKyAgICBzaXplX3Qgd2lkdGggPSBDR0ltYWdlR2V0V2lkdGgoY2dJ
bWFnZSk7CisgICAgc2l6ZV90IGhlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQoY2dJbWFnZSk7Cisg
ICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0IHx8IENHSW1hZ2VHZXRCaXRzUGVyQ29tcG9uZW50KGNn
SW1hZ2UpICE9IDgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzaXplX3QgY29tcG9uZW50
c1BlclBpeGVsID0gQ0dJbWFnZUdldEJpdHNQZXJQaXhlbChjZ0ltYWdlKSAvIDg7CisgICAgYm9v
bCBoYXNBbHBoYSA9IGZhbHNlOworICAgIFNvdXJjZURhdGFGb3JtYXQgc3JjRGF0YUZvcm1hdCA9
IGtTb3VyY2VGb3JtYXRSR0JBODsKKyAgICBzd2l0Y2ggKENHSW1hZ2VHZXRBbHBoYUluZm8oY2dJ
bWFnZSkpIHsKKyAgICBjYXNlIGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkTGFzdDoKKyAgICAg
ICAgaWYgKGNvbXBvbmVudHNQZXJQaXhlbCA9PSA0ICYmICFpbWFnZS0+ZGF0YSgpKSB7CisgICAg
ICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGZvciB0ZXhJbWFnZTJEIHdpdGggSFRN
TENhbnZhc0VsZW1lbnQgaW5wdXQuCisgICAgICAgICAgICBoYXNBbHBoYSA9IGZhbHNlOworICAg
ICAgICAgICAgc3JjRGF0YUZvcm1hdCA9IGtTb3VyY2VGb3JtYXRSR0JBODsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIGtDR0lt
YWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3Q6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBj
YXNlIGtDR0ltYWdlQWxwaGFGaXJzdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2Ug
a0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3Q6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBj
YXNlIGtDR0ltYWdlQWxwaGFMYXN0OgorICAgICAgICBoYXNBbHBoYSA9IHRydWU7CisgICAgICAg
IHN3aXRjaCAoY29tcG9uZW50c1BlclBpeGVsKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAg
ICAgIHNyY0RhdGFGb3JtYXQgPSBrU291cmNlRm9ybWF0QTg7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc3JjRGF0YUZvcm1hdCA9IGtTb3VyY2VGb3Jt
YXRSQTg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAg
c3JjRGF0YUZvcm1hdCA9IGtTb3VyY2VGb3JtYXRSR0JBODsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAg
ICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNvbG9yU3BhY2UgPSBDR0NvbG9y
U3BhY2VDcmVhdGVXaXRoTmFtZShrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQkxpbmVhcik7Ci0gICAg
ICAgIHJlbGVhc2VDb2xvclNwYWNlID0gdHJ1ZTsKKyAgICBjYXNlIGtDR0ltYWdlQWxwaGFOb25l
U2tpcExhc3Q6CisgICAgICAgIGhhc0FscGhhID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoY29t
cG9uZW50c1BlclBpeGVsKSB7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNyY0RhdGFG
b3JtYXQgPSBrU291cmNlRm9ybWF0UkE4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgNDoKKyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQgPSBrU291cmNlRm9ybWF0UkdCQTg7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgIGNhc2Uga0NHSW1hZ2VBbHBoYU5vbmU6CisgICAgICAgIGhh
c0FscGhhID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoY29tcG9uZW50c1BlclBpeGVsKSB7Cisg
ICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQgPSBrU291cmNlRm9ybWF0
Ujg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc3Jj
RGF0YUZvcm1hdCA9IGtTb3VyY2VGb3JtYXRSR0I4OworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICAg
ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAg
ICBDR0NvbnRleHRSZWYgdGVtcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUodGVtcFZl
Y3Rvci5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDgsIHRlbXBSb3dCeXRlcywKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6
IGNoYW5nZSB0aGlzIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZExhc3QpOwotICAgIGlmIChyZWxl
YXNlQ29sb3JTcGFjZSkKLSAgICAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShjb2xvclNwYWNlKTsK
LSAgICBpZiAoIXRlbXBDb250ZXh0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ0dDb250
ZXh0U2V0QmxlbmRNb2RlKHRlbXBDb250ZXh0LCBrQ0dCbGVuZE1vZGVDb3B5KTsKLSAgICBDR0Nv
bnRleHREcmF3SW1hZ2UodGVtcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgIENHUmVj
dE1ha2UoMCwgMCwgc3RhdGljX2Nhc3Q8Q0dGbG9hdD4od2lkdGgpLCBzdGF0aWNfY2FzdDxDR0Zs
b2F0PihoZWlnaHQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2dJbWFnZSk7Ci0gICAgQ0dD
b250ZXh0UmVsZWFzZSh0ZW1wQ29udGV4dCk7Ci0gICAgLy8gUGFjayB0aGUgcGl4ZWwgZGF0YSBp
bnRvIHRoZSBvdXRwdXQgdmVjdG9yLgotICAgIHVuc2lnbmVkIGxvbmcgY29tcG9uZW50c1BlclBp
eGVsLCBieXRlc1BlckNvbXBvbmVudDsKLSAgICBpZiAoIWNvbXB1dGVGb3JtYXRBbmRUeXBlUGFy
YW1ldGVycyhmb3JtYXQsIHR5cGUsICZjb21wb25lbnRzUGVyUGl4ZWwsICZieXRlc1BlckNvbXBv
bmVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpbnQgcm93Qnl0ZXMgPSB3aWR0aCAq
IGNvbXBvbmVudHNQZXJQaXhlbCAqIGJ5dGVzUGVyQ29tcG9uZW50OwotICAgIG91dHB1dFZlY3Rv
ci5yZXNpemUoaGVpZ2h0ICogcm93Qnl0ZXMpOwotICAgIENHSW1hZ2VBbHBoYUluZm8gaW5mbyA9
IENHSW1hZ2VHZXRBbHBoYUluZm8oY2dJbWFnZSk7Ci0gICAgYm9vbCBoYXNBbHBoYUNoYW5uZWwg
PSAoaW5mbyAhPSBrQ0dJbWFnZUFscGhhTm9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICYmIGluZm8gIT0ga0NHSW1hZ2VBbHBoYU5vbmVTa2lwTGFzdAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICYmIGluZm8gIT0ga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOworICAgIENG
RGF0YVJlZiBwaXhlbERhdGEgPSBDR0RhdGFQcm92aWRlckNvcHlEYXRhKENHSW1hZ2VHZXREYXRh
UHJvdmlkZXIoY2dJbWFnZSkpOworICAgIGlmICghcGl4ZWxEYXRhKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgY29uc3QgVUludDgqIHJnYmEgPSBDRkRhdGFHZXRCeXRlUHRyKHBpeGVsRGF0
YSk7CisgICAgb3V0cHV0VmVjdG9yLnJlc2l6ZSh3aWR0aCAqIGhlaWdodCAqIDQpOwogICAgIEFs
cGhhT3AgbmVlZGVkQWxwaGFPcCA9IGtBbHBoYURvTm90aGluZzsKLSAgICBpZiAoIXByZW11bHRp
cGx5QWxwaGEgJiYgaGFzQWxwaGFDaGFubmVsKQotICAgICAgICAvLyBGSVhNRTogbXVzdCBmZXRj
aCB0aGUgaW1hZ2UgZGF0YSBiZWZvcmUgdGhlIHByZW11bHRpcGxpY2F0aW9uIHN0ZXAuCi0gICAg
ICAgIG5lZWRlZEFscGhhT3AgPSBrQWxwaGFEb1VubXVsdGlwbHk7Ci0gICAgcmV0dXJuIHBhY2tQ
aXhlbHModGVtcFZlY3Rvci5kYXRhKCksIGtTb3VyY2VGb3JtYXRSR0JBOCwgd2lkdGgsIGhlaWdo
dCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIG5lZWRlZEFscGhhT3As
IG91dHB1dFZlY3Rvci5kYXRhKCkpOworICAgIGlmIChoYXNBbHBoYSAmJiBwcmVtdWx0aXBseUFs
cGhhKQorICAgICAgICBuZWVkZWRBbHBoYU9wID0ga0FscGhhRG9QcmVtdWx0aXBseTsKKyAgICBi
b29sIHJ0ID0gcGFja1BpeGVscyhyZ2JhLCBzcmNEYXRhRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAw
LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdHlwZSwgbmVlZGVkQWxwaGFPcCwg
b3V0cHV0VmVjdG9yLmRhdGEoKSk7CisgICAgQ0ZSZWxlYXNlKHBpeGVsRGF0YSk7CisgICAgcmV0
dXJuIHJ0OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwYWludFRvQ2FudmFzKGNvbnN0
IHVuc2lnbmVkIGNoYXIqIGltYWdlUGl4ZWxzLCBpbnQgaW1hZ2VXaWR0aCwgaW50IGltYWdlSGVp
Z2h0LCBpbnQgY2FudmFzV2lkdGgsIGludCBjYW52YXNIZWlnaHQsIENHQ29udGV4dFJlZiBjb250
ZXh0KQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNjYwNzgpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNCBAQAorMjAxMC0wOC0yNSAgWmhlbnlhbyBNbyAg
PHptb0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFBhc3NpbmcgcHJlbXVsdGlwbHlBbHBoYT1mYWxzZSB0byB0ZXh7U3VifUltYWdl
MkQgbG9zZXMgaW5mb3JtYXRpb24gKGNnKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NDQ1NjYKKworICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2ds
LXRleGltYWdlLWV4cGVjdGVkLnR4dDogRml4IGEgdHlwbyBpbiB0aGUgZmlsZS4KKyAgICAgICAg
KiBwbGF0Zm9ybS9jaHJvbWl1bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQ6IFJlLWVuYWJsZSBnbC10
ZXhpbWFnZS5odG1sIHRlc3QuCisgICAgICAgICogcGxhdGZvcm0vbWFjL1NraXBwZWQ6IERpdHRv
LgorCiAyMDEwLTA4LTI1ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IE9saXZlciBIdW50LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9j
YW52YXMvd2ViZ2wvZ2wtdGV4aW1hZ2UtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2dsLXRleGltYWdlLWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gNjYwNDIpCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC10ZXhpbWFnZS1l
eHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTcsNyArNyw3IEBAIFBBU1MgZ2V0RXJyb3Ig
d2FzIGV4cGVjdGVkIHZhbHVlOiBOT19FUlIKIGNoZWNrIHBpeGVscyBhcmUgTk9UIHByZS1tdWx0
aXBsaWVkCiBQQVNTIGdldEVycm9yIHdhcyBleHBlY3RlZCB2YWx1ZTogTk9fRVJST1IgOiBTaG91
bGQgYmUgbm8gZXJyb3JzIGZyb20gc2V0dXAKIFBBU1MgcGl4ZWwgMCwgMTUgc2hvdWxkIGJlIDAs
IDAsIDAsIDI1NSB3YXMgMCwgMCwgMCwgMjU1Ci1QQVNTIHBpeGVsIDEyOCwgMTUgc2hvdWxkIGJl
IDI1NSwgMCwgMjU1LCAyNTUgd2FzIDI1NSwgMCwgMCwgMjU1CitQQVNTIHBpeGVsIDEyOCwgMTUg
c2hvdWxkIGJlIDI1NSwgMCwgMjU1LCAyNTUgd2FzIDI1NSwgMCwgMjU1LCAyNTUKIFBBU1MgcGl4
ZWwgMjU1LCAxNSBzaG91bGQgYmUgMCwgMCwgMjU1LCAyNTUgd2FzIDAsIDAsIDI1NSwgMjU1CiBQ
QVNTIHBpeGVsIDAsIDggc2hvdWxkIGJlIDEyOCwgMTI4LCAxMjgsIDI1NSB3YXMgMTI4LCAxMjgs
IDEyOCwgMjU1CiBQQVNTIHBpeGVsIDEyOCwgOCBzaG91bGQgYmUgMjU1LCAyNTUsIDI1NSwgMjU1
IHdhcyAyNTUsIDI1NSwgMjU1LCAyNTUKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9t
aXVtL3Rlc3RfZXhwZWN0YXRpb25zLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0
Zm9ybS9jaHJvbWl1bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQJKHJldmlzaW9uIDY2MDQyKQorKysg
TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0CSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNTY1LDkgKzI1NjUsNiBAQCBCVUdXSzM3Mjk3IDogZmFzdC9oaXN0b3J5
L3NpYmxpbmctdmlzaXRlCiBCVUdXSzM2OTgzIE1BQyA6IGZhc3QvY2FudmFzL3dlYmdsL251bGwt
b2JqZWN0LWJlaGF2aW91ci5odG1sID0gVEVYVAogQlVHV0szNjk4MyBNQUMgOiBmYXN0L2NhbnZh
cy93ZWJnbC91bmlmb3JtLWxvY2F0aW9uLmh0bWwgPSBURVhUCiAKLS8vIENhdXNlZCBieSBwcmVt
dWx0aXBseWluZyBhbHBoYXMgaW4gQ0cgaW1hZ2UgZGVjb2RpbmcuCi1CVUc0NDU2NiBNQUMgOiBm
YXN0L2NhbnZhcy93ZWJnbC9nbC10ZXhpbWFnZS5odG1sID0gVEVYVAotCiAvLyBBZGRlZCBpbiBo
dHRwOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC81NzQ3Ni4gRmFpbHMgaW4gQ2hyb21pdW0g
YmVjYXVzZQogLy8gTGF5b3V0VGVzdENvbnRyb2xsZXI6OmNvbXB1dGVkU3R5bGVXaXRoVmlzaXRl
ZEluZm8oKSBpcyBtaXNzaW5nLgogQlVHNDEyMDYgOiBmYXN0L2hpc3RvcnkvbXVsdGlwbGUtY2xh
c3Nlcy12aXNpdGVkLmh0bWwgPSBURVhUIFRJTUVPVVQKSW5kZXg6IExheW91dFRlc3RzL3BsYXRm
b3JtL21hYy9Ta2lwcGVkCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9T
a2lwcGVkCShyZXZpc2lvbiA2NjA0MikKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lw
cGVkCSh3b3JraW5nIGNvcHkpCkBAIC0yOTIsNiArMjkyLDMgQEAgYW5pbWF0aW9ucy9wbGF5LXN0
YXRlLmh0bWwKIAogIyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDMz
MzIKIGluc3BlY3Rvci9kb20tYnJlYWtwb2ludHMuaHRtbAotCi0jIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDU2NgotZmFzdC9jYW52YXMvd2ViZ2wvZ2wtdGV4aW1h
Z2UuaHRtbAo=
</data>
<flag name="review"
          id="54313"
          type_id="1"
          status="-"
          setter="zmo"
    />
    <flag name="commit-queue"
          id="54314"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65590</attachid>
            <date>2010-08-26 11:46:39 -0700</date>
            <delta_ts>2010-08-30 19:22:39 -0700</delta_ts>
            <desc>revised patch</desc>
            <filename>cg.patch</filename>
            <type>text/plain</type>
            <size>9955</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjA3OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTMgQEAKKzIwMTAtMDgtMjUgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBQYXNzaW5n
IHByZW11bHRpcGx5QWxwaGE9ZmFsc2UgdG8gdGV4e1N1Yn1JbWFnZTJEIGxvc2VzIGluZm9ybWF0
aW9uIChjZykKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ0NTY2CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHQz
RENHLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbWFnZURh
dGEpOiBGaXggdGhlIHByZW11bHRpcGx5QWxwaGEgaXNzdWUgZm9yIGNnLgorCiAyMDEwLTA4LTI1
ICBNYXJrIFJvd2UgIDxtcm93ZUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFu
IEJlcm5zdGVpbi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3ND
b250ZXh0M0RDRy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
Zy9HcmFwaGljc0NvbnRleHQzRENHLmNwcAkocmV2aXNpb24gNjYwNDIpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dDNEQ0cuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250
ZXh0Lmg+CiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQ29udGV4dC5oPgorI2luY2x1ZGUgPENv
cmVHcmFwaGljcy9DR0RhdGFQcm92aWRlci5oPgogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0lt
YWdlLmg+CiAKICNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+CkBAIC00OSw2MSArNTAsOTggQEAg
Ym9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0SW1hZ2VEYXRhKEltYQogICAgIGlmICghaW1hZ2Up
CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBDR0ltYWdlUmVmIGNnSW1hZ2UgPSBpbWFnZS0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICBSZXRhaW5QdHI8Q0dJbWFnZVJlZj4g
ZGVjb2RlZEltYWdlOworICAgIGlmIChpbWFnZS0+ZGF0YSgpKSB7CisgICAgICAgIEltYWdlU291
cmNlIGRlY29kZXIoZmFsc2UpOworICAgICAgICBkZWNvZGVyLnNldERhdGEoaW1hZ2UtPmRhdGEo
KSwgdHJ1ZSk7CisgICAgICAgIGlmICghZGVjb2Rlci5mcmFtZUNvdW50KCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGRlY29kZWRJbWFnZSA9IGRlY29kZXIuY3JlYXRlRnJh
bWVBdEluZGV4KDApOworICAgICAgICBjZ0ltYWdlID0gZGVjb2RlZEltYWdlLmdldCgpOworICAg
IH0KICAgICBpZiAoIWNnSW1hZ2UpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpbnQgd2lk
dGggPSBDR0ltYWdlR2V0V2lkdGgoY2dJbWFnZSk7Ci0gICAgaW50IGhlaWdodCA9IENHSW1hZ2VH
ZXRIZWlnaHQoY2dJbWFnZSk7Ci0gICAgLy8gRklYTUU6IHdlIHNob3VsZCBnZXQgcmlkIG9mIHRo
aXMgdGVtcG9yYXJ5IGNvcHkgd2hlcmUgcG9zc2libGUuCi0gICAgaW50IHRlbXBSb3dCeXRlcyA9
IHdpZHRoICogNDsKLSAgICBWZWN0b3I8dWludDhfdD4gdGVtcFZlY3RvcjsKLSAgICB0ZW1wVmVj
dG9yLnJlc2l6ZShoZWlnaHQgKiB0ZW1wUm93Qnl0ZXMpOwotICAgIC8vIFRyeSB0byByZXVzZSB0
aGUgY29sb3Igc3BhY2UgZnJvbSB0aGUgaW1hZ2UgdG8gcHJlc2VydmUgaXRzIGNvbG9ycy4KLSAg
ICAvLyBTb21lIGltYWdlcyB1c2UgYSBjb2xvciBzcGFjZSAoc3VjaCBhcyBpbmRleGVkKSB1bnN1
cHBvcnRlZCBieSB0aGUgYml0bWFwIGNvbnRleHQuCi0gICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9y
U3BhY2UgPSBDR0ltYWdlR2V0Q29sb3JTcGFjZShjZ0ltYWdlKTsKLSAgICBib29sIHJlbGVhc2VD
b2xvclNwYWNlID0gZmFsc2U7Ci0gICAgQ0dDb2xvclNwYWNlTW9kZWwgY29sb3JTcGFjZU1vZGVs
ID0gQ0dDb2xvclNwYWNlR2V0TW9kZWwoY29sb3JTcGFjZSk7Ci0gICAgc3dpdGNoIChjb2xvclNw
YWNlTW9kZWwpIHsKLSAgICBjYXNlIGtDR0NvbG9yU3BhY2VNb2RlbE1vbm9jaHJvbWU6Ci0gICAg
Y2FzZSBrQ0dDb2xvclNwYWNlTW9kZWxSR0I6Ci0gICAgY2FzZSBrQ0dDb2xvclNwYWNlTW9kZWxD
TVlLOgotICAgIGNhc2Uga0NHQ29sb3JTcGFjZU1vZGVsTGFiOgotICAgIGNhc2Uga0NHQ29sb3JT
cGFjZU1vZGVsRGV2aWNlTjoKKyAgICBzaXplX3Qgd2lkdGggPSBDR0ltYWdlR2V0V2lkdGgoY2dJ
bWFnZSk7CisgICAgc2l6ZV90IGhlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQoY2dJbWFnZSk7Cisg
ICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0IHx8IENHSW1hZ2VHZXRCaXRzUGVyQ29tcG9uZW50KGNn
SW1hZ2UpICE9IDgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzaXplX3QgY29tcG9uZW50
c1BlclBpeGVsID0gQ0dJbWFnZUdldEJpdHNQZXJQaXhlbChjZ0ltYWdlKSAvIDg7CisgICAgU291
cmNlRGF0YUZvcm1hdCBzcmNEYXRhRm9ybWF0ID0ga1NvdXJjZUZvcm1hdFJHQkE4OworICAgIEFs
cGhhT3AgbmVlZGVkQWxwaGFPcCA9IGtBbHBoYURvTm90aGluZzsKKyAgICBzd2l0Y2ggKENHSW1h
Z2VHZXRBbHBoYUluZm8oY2dJbWFnZSkpIHsKKyAgICBjYXNlIGtDR0ltYWdlQWxwaGFQcmVtdWx0
aXBsaWVkRmlyc3Q6CisgICAgY2FzZSBrQ0dJbWFnZUFscGhhRmlyc3Q6CisgICAgY2FzZSBrQ0dJ
bWFnZUFscGhhTm9uZVNraXBGaXJzdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2Ug
a0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRMYXN0OgorICAgICAgICAvLyBUaGlzIGlzIGEgc3Bl
Y2lhbCBjYXNlIGZvciB0ZXhJbWFnZTJEIHdpdGggSFRNTENhbnZhc0VsZW1lbnQgaW5wdXQsCisg
ICAgICAgIC8vIGluIHdoaWNoIGNhc2UgaW1hZ2UtPmRhdGEoKSBzaG91bGQgYmUgbnVsbC4KKyAg
ICAgICAgQVNTRVJUKCFpbWFnZS0+ZGF0YSgpKTsKKyAgICAgICAgaWYgKCFwcmVtdWx0aXBseUFs
cGhhKQorICAgICAgICAgICAgbmVlZGVkQWxwaGFPcCA9IGtBbHBoYURvVW5tdWx0aXBseTsKKyAg
ICAgICAgc3dpdGNoIChjb21wb25lbnRzUGVyUGl4ZWwpIHsKKyAgICAgICAgY2FzZSAyOgorICAg
ICAgICAgICAgc3JjRGF0YUZvcm1hdCA9IGtTb3VyY2VGb3JtYXRSQTg7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgc3JjRGF0YUZvcm1hdCA9IGtTb3Vy
Y2VGb3JtYXRSR0JBODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgIGRl
ZmF1bHQ6Ci0gICAgICAgIGNvbG9yU3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVXaXRoTmFtZShr
Q0dDb2xvclNwYWNlR2VuZXJpY1JHQkxpbmVhcik7Ci0gICAgICAgIHJlbGVhc2VDb2xvclNwYWNl
ID0gdHJ1ZTsKKyAgICBjYXNlIGtDR0ltYWdlQWxwaGFMYXN0OgorICAgICAgICBpZiAocHJlbXVs
dGlwbHlBbHBoYSkKKyAgICAgICAgICAgIG5lZWRlZEFscGhhT3AgPSBrQWxwaGFEb1ByZW11bHRp
cGx5OworICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudHNQZXJQaXhlbCkgeworICAgICAgICBjYXNl
IDE6CisgICAgICAgICAgICBzcmNEYXRhRm9ybWF0ID0ga1NvdXJjZUZvcm1hdEE4OworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQg
PSBrU291cmNlRm9ybWF0UkE4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoK
KyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQgPSBrU291cmNlRm9ybWF0UkdCQTg7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIGtDR0ltYWdlQWxwaGFOb25lU2tp
cExhc3Q6CisgICAgICAgIHN3aXRjaCAoY29tcG9uZW50c1BlclBpeGVsKSB7CisgICAgICAgIGNh
c2UgMjoKKyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQgPSBrU291cmNlRm9ybWF0UkE4OworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHNyY0RhdGFGb3Jt
YXQgPSBrU291cmNlRm9ybWF0UkdCQTg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGNhc2Uga0NH
SW1hZ2VBbHBoYU5vbmU6CisgICAgICAgIHN3aXRjaCAoY29tcG9uZW50c1BlclBpeGVsKSB7Cisg
ICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQgPSBrU291cmNlRm9ybWF0
Ujg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc3Jj
RGF0YUZvcm1hdCA9IGtTb3VyY2VGb3JtYXRSR0I4OworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAg
ICBDR0NvbnRleHRSZWYgdGVtcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUodGVtcFZl
Y3Rvci5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDgsIHRlbXBSb3dCeXRlcywKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6
IGNoYW5nZSB0aGlzIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZExhc3QpOwotICAgIGlmIChyZWxl
YXNlQ29sb3JTcGFjZSkKLSAgICAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShjb2xvclNwYWNlKTsK
LSAgICBpZiAoIXRlbXBDb250ZXh0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ0dDb250
ZXh0U2V0QmxlbmRNb2RlKHRlbXBDb250ZXh0LCBrQ0dCbGVuZE1vZGVDb3B5KTsKLSAgICBDR0Nv
bnRleHREcmF3SW1hZ2UodGVtcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgIENHUmVj
dE1ha2UoMCwgMCwgc3RhdGljX2Nhc3Q8Q0dGbG9hdD4od2lkdGgpLCBzdGF0aWNfY2FzdDxDR0Zs
b2F0PihoZWlnaHQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2dJbWFnZSk7Ci0gICAgQ0dD
b250ZXh0UmVsZWFzZSh0ZW1wQ29udGV4dCk7Ci0gICAgLy8gUGFjayB0aGUgcGl4ZWwgZGF0YSBp
bnRvIHRoZSBvdXRwdXQgdmVjdG9yLgotICAgIHVuc2lnbmVkIGxvbmcgY29tcG9uZW50c1BlclBp
eGVsLCBieXRlc1BlckNvbXBvbmVudDsKLSAgICBpZiAoIWNvbXB1dGVGb3JtYXRBbmRUeXBlUGFy
YW1ldGVycyhmb3JtYXQsIHR5cGUsICZjb21wb25lbnRzUGVyUGl4ZWwsICZieXRlc1BlckNvbXBv
bmVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpbnQgcm93Qnl0ZXMgPSB3aWR0aCAq
IGNvbXBvbmVudHNQZXJQaXhlbCAqIGJ5dGVzUGVyQ29tcG9uZW50OwotICAgIG91dHB1dFZlY3Rv
ci5yZXNpemUoaGVpZ2h0ICogcm93Qnl0ZXMpOwotICAgIENHSW1hZ2VBbHBoYUluZm8gaW5mbyA9
IENHSW1hZ2VHZXRBbHBoYUluZm8oY2dJbWFnZSk7Ci0gICAgYm9vbCBoYXNBbHBoYUNoYW5uZWwg
PSAoaW5mbyAhPSBrQ0dJbWFnZUFscGhhTm9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICYmIGluZm8gIT0ga0NHSW1hZ2VBbHBoYU5vbmVTa2lwTGFzdAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICYmIGluZm8gIT0ga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAgIEFs
cGhhT3AgbmVlZGVkQWxwaGFPcCA9IGtBbHBoYURvTm90aGluZzsKLSAgICBpZiAoIXByZW11bHRp
cGx5QWxwaGEgJiYgaGFzQWxwaGFDaGFubmVsKQotICAgICAgICAvLyBGSVhNRTogbXVzdCBmZXRj
aCB0aGUgaW1hZ2UgZGF0YSBiZWZvcmUgdGhlIHByZW11bHRpcGxpY2F0aW9uIHN0ZXAuCi0gICAg
ICAgIG5lZWRlZEFscGhhT3AgPSBrQWxwaGFEb1VubXVsdGlwbHk7Ci0gICAgcmV0dXJuIHBhY2tQ
aXhlbHModGVtcFZlY3Rvci5kYXRhKCksIGtTb3VyY2VGb3JtYXRSR0JBOCwgd2lkdGgsIGhlaWdo
dCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIG5lZWRlZEFscGhhT3As
IG91dHB1dFZlY3Rvci5kYXRhKCkpOworICAgIENGRGF0YVJlZiBwaXhlbERhdGEgPSBDR0RhdGFQ
cm92aWRlckNvcHlEYXRhKENHSW1hZ2VHZXREYXRhUHJvdmlkZXIoY2dJbWFnZSkpOworICAgIGlm
ICghcGl4ZWxEYXRhKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgVUludDgqIHJn
YmEgPSBDRkRhdGFHZXRCeXRlUHRyKHBpeGVsRGF0YSk7CisgICAgb3V0cHV0VmVjdG9yLnJlc2l6
ZSh3aWR0aCAqIGhlaWdodCAqIDQpOworICAgIGJvb2wgcnQgPSBwYWNrUGl4ZWxzKHJnYmEsIHNy
Y0RhdGFGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAg
Zm9ybWF0LCB0eXBlLCBuZWVkZWRBbHBoYU9wLCBvdXRwdXRWZWN0b3IuZGF0YSgpKTsKKyAgICBD
RlJlbGVhc2UocGl4ZWxEYXRhKTsKKyAgICByZXR1cm4gcnQ7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnBhaW50VG9DYW52YXMoY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2VQaXhlbHMs
IGludCBpbWFnZVdpZHRoLCBpbnQgaW1hZ2VIZWlnaHQsIGludCBjYW52YXNXaWR0aCwgaW50IGNh
bnZhc0hlaWdodCwgQ0dDb250ZXh0UmVmIGNvbnRleHQpCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NjA3
OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0
IEBACisyMDEwLTA4LTI1ICBaaGVueWFvIE1vICA8em1vQGdvb2dsZS5jb20+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUGFzc2luZyBwcmVtdWx0aXBs
eUFscGhhPWZhbHNlIHRvIHRleHtTdWJ9SW1hZ2UyRCBsb3NlcyBpbmZvcm1hdGlvbiAoY2cpCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDU2NgorCisg
ICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvZ2wtdGV4aW1hZ2UtZXhwZWN0ZWQudHh0OiBGaXgg
YSB0eXBvIGluIHRoZSBmaWxlLgorICAgICAgICAqIHBsYXRmb3JtL2Nocm9taXVtL3Rlc3RfZXhw
ZWN0YXRpb25zLnR4dDogUmUtZW5hYmxlIGdsLXRleGltYWdlLmh0bWwgdGVzdC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9tYWMvU2tpcHBlZDogRGl0dG8uCisKIDIwMTAtMDgtMjUgIE1pY2hhZWwgU2Fi
b2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1
bnQuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC10ZXhpbWFnZS1leHBl
Y3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvZ2wt
dGV4aW1hZ2UtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiA2NjA0MikKKysrIExheW91dFRlc3RzL2Zh
c3QvY2FudmFzL3dlYmdsL2dsLXRleGltYWdlLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpA
QCAtNyw3ICs3LDcgQEAgUEFTUyBnZXRFcnJvciB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUgog
Y2hlY2sgcGl4ZWxzIGFyZSBOT1QgcHJlLW11bHRpcGxpZWQKIFBBU1MgZ2V0RXJyb3Igd2FzIGV4
cGVjdGVkIHZhbHVlOiBOT19FUlJPUiA6IFNob3VsZCBiZSBubyBlcnJvcnMgZnJvbSBzZXR1cAog
UEFTUyBwaXhlbCAwLCAxNSBzaG91bGQgYmUgMCwgMCwgMCwgMjU1IHdhcyAwLCAwLCAwLCAyNTUK
LVBBU1MgcGl4ZWwgMTI4LCAxNSBzaG91bGQgYmUgMjU1LCAwLCAyNTUsIDI1NSB3YXMgMjU1LCAw
LCAwLCAyNTUKK1BBU1MgcGl4ZWwgMTI4LCAxNSBzaG91bGQgYmUgMjU1LCAwLCAyNTUsIDI1NSB3
YXMgMjU1LCAwLCAyNTUsIDI1NQogUEFTUyBwaXhlbCAyNTUsIDE1IHNob3VsZCBiZSAwLCAwLCAy
NTUsIDI1NSB3YXMgMCwgMCwgMjU1LCAyNTUKIFBBU1MgcGl4ZWwgMCwgOCBzaG91bGQgYmUgMTI4
LCAxMjgsIDEyOCwgMjU1IHdhcyAxMjgsIDEyOCwgMTI4LCAyNTUKIFBBU1MgcGl4ZWwgMTI4LCA4
IHNob3VsZCBiZSAyNTUsIDI1NSwgMjU1LCAyNTUgd2FzIDI1NSwgMjU1LCAyNTUsIDI1NQpJbmRl
eDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL3Rlc3RfZXhwZWN0YXRp
b25zLnR4dAkocmV2aXNpb24gNjYwNDIpCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1
bS90ZXN0X2V4cGVjdGF0aW9ucy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTI1NjUsOSArMjU2NSw2
IEBAIEJVR1dLMzcyOTcgOiBmYXN0L2hpc3Rvcnkvc2libGluZy12aXNpdGUKIEJVR1dLMzY5ODMg
TUFDIDogZmFzdC9jYW52YXMvd2ViZ2wvbnVsbC1vYmplY3QtYmVoYXZpb3VyLmh0bWwgPSBURVhU
CiBCVUdXSzM2OTgzIE1BQyA6IGZhc3QvY2FudmFzL3dlYmdsL3VuaWZvcm0tbG9jYXRpb24uaHRt
bCA9IFRFWFQKIAotLy8gQ2F1c2VkIGJ5IHByZW11bHRpcGx5aW5nIGFscGhhcyBpbiBDRyBpbWFn
ZSBkZWNvZGluZy4KLUJVRzQ0NTY2IE1BQyA6IGZhc3QvY2FudmFzL3dlYmdsL2dsLXRleGltYWdl
Lmh0bWwgPSBURVhUCi0KIC8vIEFkZGVkIGluIGh0dHA6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdl
c2V0LzU3NDc2LiBGYWlscyBpbiBDaHJvbWl1bSBiZWNhdXNlCiAvLyBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6Y29tcHV0ZWRTdHlsZVdpdGhWaXNpdGVkSW5mbygpIGlzIG1pc3NpbmcuCiBCVUc0MTIw
NiA6IGZhc3QvaGlzdG9yeS9tdWx0aXBsZS1jbGFzc2VzLXZpc2l0ZWQuaHRtbCA9IFRFWFQgVElN
RU9VVApJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL1NraXBwZWQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL1NraXBwZWQJKHJldmlzaW9uIDY2MDQyKQorKysg
TGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL1NraXBwZWQJKHdvcmtpbmcgY29weSkKQEAgLTI5Miw2
ICsyOTIsMyBAQCBhbmltYXRpb25zL3BsYXktc3RhdGUuaHRtbAogCiAjIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MzMzMgogaW5zcGVjdG9yL2RvbS1icmVha3BvaW50
cy5odG1sCi0KLSMgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0NTY2
Ci1mYXN0L2NhbnZhcy93ZWJnbC9nbC10ZXhpbWFnZS5odG1sCg==
</data>
<flag name="commit-queue"
          id="54402"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66002</attachid>
            <date>2010-08-30 19:22:39 -0700</date>
            <delta_ts>2010-08-30 20:27:49 -0700</delta_ts>
            <desc>revised patch: responding to kbr&apos;s review</desc>
            <filename>cg.patch</filename>
            <type>text/plain</type>
            <size>11621</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjE0MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTMgQEAKKzIwMTAtMDgtMjUgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBQYXNzaW5n
IHByZW11bHRpcGx5QWxwaGE9ZmFsc2UgdG8gdGV4e1N1Yn1JbWFnZTJEIGxvc2VzIGluZm9ybWF0
aW9uIChjZykKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ0NTY2CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHQz
RENHLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbWFnZURh
dGEpOiBGaXggdGhlIHByZW11bHRpcGx5QWxwaGEgaXNzdWUgZm9yIGNnLgorCiAyMDEwLTA4LTI2
ICBTaW1vbiBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IERhdmUgSHlhdHQuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dy
YXBoaWNzQ29udGV4dDNEQ0cuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0M0RDRy5jcHAJKHJldmlzaW9uIDY2MTQxKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHQzRENHLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0
bWFwQ29udGV4dC5oPgogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0NvbnRleHQuaD4KKyNpbmNs
dWRlIDxDb3JlR3JhcGhpY3MvQ0dEYXRhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxDb3JlR3JhcGhp
Y3MvQ0dJbWFnZS5oPgogCiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgpAQCAtNDgsNjIgKzQ5
LDEwMCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbWFnZURhdGEoSW1hCiB7CiAgICAg
aWYgKCFpbWFnZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIENHSW1hZ2VSZWYgY2dJbWFn
ZSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIENHSW1hZ2VSZWYg
Y2dJbWFnZTsKKyAgICBSZXRhaW5QdHI8Q0dJbWFnZVJlZj4gZGVjb2RlZEltYWdlOworICAgIGlm
IChpbWFnZS0+ZGF0YSgpKSB7CisgICAgICAgIEltYWdlU291cmNlIGRlY29kZXIoZmFsc2UpOwor
ICAgICAgICBkZWNvZGVyLnNldERhdGEoaW1hZ2UtPmRhdGEoKSwgdHJ1ZSk7CisgICAgICAgIGlm
ICghZGVjb2Rlci5mcmFtZUNvdW50KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGRlY29kZWRJbWFnZSA9IGRlY29kZXIuY3JlYXRlRnJhbWVBdEluZGV4KDApOworICAgICAg
ICBjZ0ltYWdlID0gZGVjb2RlZEltYWdlLmdldCgpOworICAgIH0gZWxzZQorICAgICAgICBjZ0lt
YWdlID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CiAgICAgaWYgKCFjZ0lt
YWdlKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaW50IHdpZHRoID0gQ0dJbWFnZUdldFdp
ZHRoKGNnSW1hZ2UpOwotICAgIGludCBoZWlnaHQgPSBDR0ltYWdlR2V0SGVpZ2h0KGNnSW1hZ2Up
OwotICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgZ2V0IHJpZCBvZiB0aGlzIHRlbXBvcmFyeSBjb3B5
IHdoZXJlIHBvc3NpYmxlLgotICAgIGludCB0ZW1wUm93Qnl0ZXMgPSB3aWR0aCAqIDQ7Ci0gICAg
VmVjdG9yPHVpbnQ4X3Q+IHRlbXBWZWN0b3I7Ci0gICAgdGVtcFZlY3Rvci5yZXNpemUoaGVpZ2h0
ICogdGVtcFJvd0J5dGVzKTsKLSAgICAvLyBUcnkgdG8gcmV1c2UgdGhlIGNvbG9yIHNwYWNlIGZy
b20gdGhlIGltYWdlIHRvIHByZXNlcnZlIGl0cyBjb2xvcnMuCi0gICAgLy8gU29tZSBpbWFnZXMg
dXNlIGEgY29sb3Igc3BhY2UgKHN1Y2ggYXMgaW5kZXhlZCkgdW5zdXBwb3J0ZWQgYnkgdGhlIGJp
dG1hcCBjb250ZXh0LgotICAgIENHQ29sb3JTcGFjZVJlZiBjb2xvclNwYWNlID0gQ0dJbWFnZUdl
dENvbG9yU3BhY2UoY2dJbWFnZSk7Ci0gICAgYm9vbCByZWxlYXNlQ29sb3JTcGFjZSA9IGZhbHNl
OwotICAgIENHQ29sb3JTcGFjZU1vZGVsIGNvbG9yU3BhY2VNb2RlbCA9IENHQ29sb3JTcGFjZUdl
dE1vZGVsKGNvbG9yU3BhY2UpOwotICAgIHN3aXRjaCAoY29sb3JTcGFjZU1vZGVsKSB7Ci0gICAg
Y2FzZSBrQ0dDb2xvclNwYWNlTW9kZWxNb25vY2hyb21lOgotICAgIGNhc2Uga0NHQ29sb3JTcGFj
ZU1vZGVsUkdCOgotICAgIGNhc2Uga0NHQ29sb3JTcGFjZU1vZGVsQ01ZSzoKLSAgICBjYXNlIGtD
R0NvbG9yU3BhY2VNb2RlbExhYjoKLSAgICBjYXNlIGtDR0NvbG9yU3BhY2VNb2RlbERldmljZU46
CisgICAgc2l6ZV90IHdpZHRoID0gQ0dJbWFnZUdldFdpZHRoKGNnSW1hZ2UpOworICAgIHNpemVf
dCBoZWlnaHQgPSBDR0ltYWdlR2V0SGVpZ2h0KGNnSW1hZ2UpOworICAgIGlmICghd2lkdGggfHwg
IWhlaWdodCB8fCBDR0ltYWdlR2V0Qml0c1BlckNvbXBvbmVudChjZ0ltYWdlKSAhPSA4KQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgc2l6ZV90IGNvbXBvbmVudHNQZXJQaXhlbCA9IENHSW1h
Z2VHZXRCaXRzUGVyUGl4ZWwoY2dJbWFnZSkgLyA4OworICAgIFNvdXJjZURhdGFGb3JtYXQgc3Jj
RGF0YUZvcm1hdCA9IGtTb3VyY2VGb3JtYXRSR0JBODsKKyAgICBBbHBoYU9wIG5lZWRlZEFscGhh
T3AgPSBrQWxwaGFEb05vdGhpbmc7CisgICAgc3dpdGNoIChDR0ltYWdlR2V0QWxwaGFJbmZvKGNn
SW1hZ2UpKSB7CisgICAgY2FzZSBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0OgorICAg
IGNhc2Uga0NHSW1hZ2VBbHBoYUZpcnN0OgorICAgIGNhc2Uga0NHSW1hZ2VBbHBoYU5vbmVTa2lw
Rmlyc3Q6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIGtDR0ltYWdlQWxwaGFQcmVt
dWx0aXBsaWVkTGFzdDoKKyAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgdGV4
SW1hZ2UyRCB3aXRoIEhUTUxDYW52YXNFbGVtZW50IGlucHV0LAorICAgICAgICAvLyBpbiB3aGlj
aCBjYXNlIGltYWdlLT5kYXRhKCkgc2hvdWxkIGJlIG51bGwuCisgICAgICAgIEFTU0VSVCghaW1h
Z2UtPmRhdGEoKSk7CisgICAgICAgIGlmICghcHJlbXVsdGlwbHlBbHBoYSkKKyAgICAgICAgICAg
IG5lZWRlZEFscGhhT3AgPSBrQWxwaGFEb1VubXVsdGlwbHk7CisgICAgICAgIHN3aXRjaCAoY29t
cG9uZW50c1BlclBpeGVsKSB7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNyY0RhdGFG
b3JtYXQgPSBrU291cmNlRm9ybWF0UkE4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgNDoKKyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQgPSBrU291cmNlRm9ybWF0UkdCQTg7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBj
b2xvclNwYWNlID0gQ0dDb2xvclNwYWNlQ3JlYXRlV2l0aE5hbWUoa0NHQ29sb3JTcGFjZUdlbmVy
aWNSR0JMaW5lYXIpOwotICAgICAgICByZWxlYXNlQ29sb3JTcGFjZSA9IHRydWU7CisgICAgY2Fz
ZSBrQ0dJbWFnZUFscGhhTGFzdDoKKyAgICAgICAgaWYgKHByZW11bHRpcGx5QWxwaGEpCisgICAg
ICAgICAgICBuZWVkZWRBbHBoYU9wID0ga0FscGhhRG9QcmVtdWx0aXBseTsKKyAgICAgICAgc3dp
dGNoIChjb21wb25lbnRzUGVyUGl4ZWwpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAg
c3JjRGF0YUZvcm1hdCA9IGtTb3VyY2VGb3JtYXRBODsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIDI6CisgICAgICAgICAgICBzcmNEYXRhRm9ybWF0ID0ga1NvdXJjZUZvcm1hdFJB
ODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzcmNE
YXRhRm9ybWF0ID0ga1NvdXJjZUZvcm1hdFJHQkE4OworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBrQ0dJbWFnZUFscGhhTm9uZVNraXBMYXN0OgorICAgICAgICBz
d2l0Y2ggKGNvbXBvbmVudHNQZXJQaXhlbCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAg
ICBzcmNEYXRhRm9ybWF0ID0ga1NvdXJjZUZvcm1hdFJBODsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzcmNEYXRhRm9ybWF0ID0ga1NvdXJjZUZvcm1h
dFJHQkE4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICBjYXNlIGtDR0ltYWdlQWxwaGFOb25lOgor
ICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudHNQZXJQaXhlbCkgeworICAgICAgICBjYXNlIDE6Cisg
ICAgICAgICAgICBzcmNEYXRhRm9ybWF0ID0ga1NvdXJjZUZvcm1hdFI4OworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHNyY0RhdGFGb3JtYXQgPSBrU291
cmNlRm9ybWF0UkdCODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOworICAgIGRl
ZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgQ0dDb250ZXh0UmVmIHRl
bXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKHRlbXBWZWN0b3IuZGF0YSgpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwg
aGVpZ2h0LCA4LCB0ZW1wUm93Qnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBjaGFuZ2UgdGhpcyEKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHSW1h
Z2VBbHBoYVByZW11bHRpcGxpZWRMYXN0KTsKLSAgICBpZiAocmVsZWFzZUNvbG9yU3BhY2UpCi0g
ICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoY29sb3JTcGFjZSk7Ci0gICAgaWYgKCF0ZW1wQ29u
dGV4dCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIENHQ29udGV4dFNldEJsZW5kTW9kZSh0
ZW1wQ29udGV4dCwga0NHQmxlbmRNb2RlQ29weSk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRl
bXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RNYWtlKDAsIDAsIHN0YXRp
Y19jYXN0PENHRmxvYXQ+KHdpZHRoKSwgc3RhdGljX2Nhc3Q8Q0dGbG9hdD4oaGVpZ2h0KSksCi0g
ICAgICAgICAgICAgICAgICAgICAgIGNnSW1hZ2UpOwotICAgIENHQ29udGV4dFJlbGVhc2UodGVt
cENvbnRleHQpOwotICAgIC8vIFBhY2sgdGhlIHBpeGVsIGRhdGEgaW50byB0aGUgb3V0cHV0IHZl
Y3Rvci4KLSAgICB1bnNpZ25lZCBsb25nIGNvbXBvbmVudHNQZXJQaXhlbCwgYnl0ZXNQZXJDb21w
b25lbnQ7Ci0gICAgaWYgKCFjb21wdXRlRm9ybWF0QW5kVHlwZVBhcmFtZXRlcnMoZm9ybWF0LCB0
eXBlLCAmY29tcG9uZW50c1BlclBpeGVsLCAmYnl0ZXNQZXJDb21wb25lbnQpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgaW50IHJvd0J5dGVzID0gd2lkdGggKiBjb21wb25lbnRzUGVyUGl4
ZWwgKiBieXRlc1BlckNvbXBvbmVudDsKLSAgICBvdXRwdXRWZWN0b3IucmVzaXplKGhlaWdodCAq
IHJvd0J5dGVzKTsKLSAgICBDR0ltYWdlQWxwaGFJbmZvIGluZm8gPSBDR0ltYWdlR2V0QWxwaGFJ
bmZvKGNnSW1hZ2UpOwotICAgIGJvb2wgaGFzQWxwaGFDaGFubmVsID0gKGluZm8gIT0ga0NHSW1h
Z2VBbHBoYU5vbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvICE9IGtDR0lt
YWdlQWxwaGFOb25lU2tpcExhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZv
ICE9IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKLSAgICBBbHBoYU9wIG5lZWRlZEFscGhh
T3AgPSBrQWxwaGFEb05vdGhpbmc7Ci0gICAgaWYgKCFwcmVtdWx0aXBseUFscGhhICYmIGhhc0Fs
cGhhQ2hhbm5lbCkKLSAgICAgICAgLy8gRklYTUU6IG11c3QgZmV0Y2ggdGhlIGltYWdlIGRhdGEg
YmVmb3JlIHRoZSBwcmVtdWx0aXBsaWNhdGlvbiBzdGVwLgotICAgICAgICBuZWVkZWRBbHBoYU9w
ID0ga0FscGhhRG9Vbm11bHRpcGx5OwotICAgIHJldHVybiBwYWNrUGl4ZWxzKHRlbXBWZWN0b3Iu
ZGF0YSgpLCBrU291cmNlRm9ybWF0UkdCQTgsIHdpZHRoLCBoZWlnaHQsIDAsCi0gICAgICAgICAg
ICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBuZWVkZWRBbHBoYU9wLCBvdXRwdXRWZWN0b3IuZGF0
YSgpKTsKKyAgICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiBwaXhlbERhdGE7CisgICAgcGl4ZWxEYXRh
LmFkb3B0Q0YoQ0dEYXRhUHJvdmlkZXJDb3B5RGF0YShDR0ltYWdlR2V0RGF0YVByb3ZpZGVyKGNn
SW1hZ2UpKSk7CisgICAgaWYgKCFwaXhlbERhdGEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBjb25zdCBVSW50OCogcmdiYSA9IENGRGF0YUdldEJ5dGVQdHIocGl4ZWxEYXRhLmdldCgpKTsK
KyAgICBvdXRwdXRWZWN0b3IucmVzaXplKHdpZHRoICogaGVpZ2h0ICogNCk7CisgICAgYm9vbCBy
dCA9IHBhY2tQaXhlbHMocmdiYSwgc3JjRGF0YUZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIG5lZWRlZEFscGhhT3AsIG91dHB1
dFZlY3Rvci5kYXRhKCkpOworICAgIHJldHVybiBydDsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6cGFpbnRUb0NhbnZhcyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZVBpeGVscywgaW50
IGltYWdlV2lkdGgsIGludCBpbWFnZUhlaWdodCwgaW50IGNhbnZhc1dpZHRoLCBpbnQgY2FudmFz
SGVpZ2h0LCBDR0NvbnRleHRSZWYgY29udGV4dCkKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxv
Zwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDY2MTQxKQor
KysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAK
KzIwMTAtMDgtMjUgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBQYXNzaW5nIHByZW11bHRpcGx5QWxw
aGE9ZmFsc2UgdG8gdGV4e1N1Yn1JbWFnZTJEIGxvc2VzIGluZm9ybWF0aW9uIChjZykKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ0NTY2CisKKyAgICAg
ICAgKiBmYXN0L2NhbnZhcy93ZWJnbC9nbC10ZXhpbWFnZS1leHBlY3RlZC50eHQ6IEZpeCBhIHR5
cG8gaW4gdGhlIGZpbGUuCisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3Rh
dGlvbnMudHh0OiBSZS1lbmFibGUgZ2wtdGV4aW1hZ2UuaHRtbCB0ZXN0LgorICAgICAgICAqIHBs
YXRmb3JtL21hYy9Ta2lwcGVkOiBEaXR0by4KKwogMjAxMC0wOC0yNiAgU2ltb24gRnJhc2VyICA8
c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZlIEh5YXR0
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvZ2wtdGV4aW1hZ2UtZXhwZWN0
ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2dsLXRl
eGltYWdlLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gNjYxNDEpCisrKyBMYXlvdXRUZXN0cy9mYXN0
L2NhbnZhcy93ZWJnbC9nbC10ZXhpbWFnZS1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAg
LTcsNyArNyw3IEBAIFBBU1MgZ2V0RXJyb3Igd2FzIGV4cGVjdGVkIHZhbHVlOiBOT19FUlIKIGNo
ZWNrIHBpeGVscyBhcmUgTk9UIHByZS1tdWx0aXBsaWVkCiBQQVNTIGdldEVycm9yIHdhcyBleHBl
Y3RlZCB2YWx1ZTogTk9fRVJST1IgOiBTaG91bGQgYmUgbm8gZXJyb3JzIGZyb20gc2V0dXAKIFBB
U1MgcGl4ZWwgMCwgMTUgc2hvdWxkIGJlIDAsIDAsIDAsIDI1NSB3YXMgMCwgMCwgMCwgMjU1Ci1Q
QVNTIHBpeGVsIDEyOCwgMTUgc2hvdWxkIGJlIDI1NSwgMCwgMjU1LCAyNTUgd2FzIDI1NSwgMCwg
MCwgMjU1CitQQVNTIHBpeGVsIDEyOCwgMTUgc2hvdWxkIGJlIDI1NSwgMCwgMjU1LCAyNTUgd2Fz
IDI1NSwgMCwgMjU1LCAyNTUKIFBBU1MgcGl4ZWwgMjU1LCAxNSBzaG91bGQgYmUgMCwgMCwgMjU1
LCAyNTUgd2FzIDAsIDAsIDI1NSwgMjU1CiBQQVNTIHBpeGVsIDAsIDggc2hvdWxkIGJlIDEyOCwg
MTI4LCAxMjgsIDI1NSB3YXMgMTI4LCAxMjgsIDEyOCwgMjU1CiBQQVNTIHBpeGVsIDEyOCwgOCBz
aG91bGQgYmUgMjU1LCAyNTUsIDI1NSwgMjU1IHdhcyAyNTUsIDI1NSwgMjU1LCAyNTUKQEAgLTM4
LDYgKzM4LDE1IEBAIFBBU1MgVGhlcmUgc2hvdWxkIGJlIDMyIHVuaXF1ZSB2YWx1ZXMgaW4KIFBB
U1MgVGhlcmUgc2hvdWxkIGJlIDMyIHVuaXF1ZSB2YWx1ZXMgaW4gY2hhbm5lbCAyLiBGb3VuZCAz
MgogUEFTUyBUaGVyZSBzaG91bGQgYmUgMiB1bmlxdWUgdmFsdWVzIGluIGNoYW5uZWwgMy4gRm91
bmQgMgogCitjaGVjayBwaXhlbHMgYXJlIFVOIHByZS1tdWx0aXBsaWVkCitQQVNTIGdldEVycm9y
IHdhcyBleHBlY3RlZCB2YWx1ZTogTk9fRVJST1IgOiBTaG91bGQgYmUgbm8gZXJyb3JzIGZyb20g
c2V0dXAuCitQQVNTIEhhbGYgdGhlIHBpeGVscyBpbiBjaGFubmVsIDAgc2hvdWxkIGJlID49IDEy
OCwxMjgsMTI4LiBmb3VuZCA1MCUKK1BBU1MgSGFsZiB0aGUgcGl4ZWxzIGluIGNoYW5uZWwgMCBz
aG91bGQgYmUgPCAxMjgsMTI4LDEyOC4gZm91bmQgNTAlCitQQVNTIEhhbGYgdGhlIHBpeGVscyBp
biBjaGFubmVsIDEgc2hvdWxkIGJlID49IDEyOCwxMjgsMTI4LiBmb3VuZCA1MCUKK1BBU1MgSGFs
ZiB0aGUgcGl4ZWxzIGluIGNoYW5uZWwgMSBzaG91bGQgYmUgPCAxMjgsMTI4LDEyOC4gZm91bmQg
NTAlCitQQVNTIEhhbGYgdGhlIHBpeGVscyBpbiBjaGFubmVsIDIgc2hvdWxkIGJlID49IDEyOCwx
MjgsMTI4LiBmb3VuZCA1MCUKK1BBU1MgSGFsZiB0aGUgcGl4ZWxzIGluIGNoYW5uZWwgMiBzaG91
bGQgYmUgPCAxMjgsMTI4LDEyOC4gZm91bmQgNTAlCisKIGNoZWNrIHBpeGVscyBhcmUgcHJlLW11
bHRpcGxpZWQKIFBBU1MgZ2V0RXJyb3Igd2FzIGV4cGVjdGVkIHZhbHVlOiBOT19FUlJPUiA6IFNo
b3VsZCBiZSBubyBlcnJvcnMgZnJvbSBzZXR1cAogUEFTUyBwaXhlbHMgc2hvdWxkIGFsbCBiZSAw
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvZ2wtdGV4aW1hZ2UuaHRtbAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC10ZXhpbWFnZS5o
dG1sCShyZXZpc2lvbiA2NjE0MSkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2ds
LXRleGltYWdlLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTE2OSw2ICsxNjksNyBAQCBmdW5jdGlv
biBydW5UZXN0cyhpbWdzKSB7CiAgICAgfQogICAgIGFzc2VydE1zZyhzYW1lLCAicGl4ZWxzIHNo
b3VsZCBiZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgZ2FtbWEgc2V0dGluZ3MuIik7CiAgIH0KKyovCiAK
ICAgZGVidWcoIiIpOwogICBkZWJ1ZygiY2hlY2sgcGl4ZWxzIGFyZSBVTiBwcmUtbXVsdGlwbGll
ZCIpOwpAQCAtMjEwLDcgKzIxMSw2IEBAIGZ1bmN0aW9uIHJ1blRlc3RzKGltZ3MpIHsKICAgICAg
ICAgICAgICAgIiBzaG91bGQgYmUgPCAxMjgsMTI4LDEyOC4gZm91bmQgIiArCiAgICAgICAgICAg
ICAgICgobHQxMjhDb3VudFtqal0gLyAyNTYpICogMTAwKS50b0ZpeGVkKCkgKyAiJSIpOwogICB9
Ci0qLwogCiAgIGRlYnVnKCIiKTsKICAgZGVidWcoImNoZWNrIHBpeGVscyBhcmUgcHJlLW11bHRp
cGxpZWQiKTsKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtL3Rlc3RfZXhwZWN0
YXRpb25zLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS90
ZXN0X2V4cGVjdGF0aW9ucy50eHQJKHJldmlzaW9uIDY2MTQxKQorKysgTGF5b3V0VGVzdHMvcGxh
dGZvcm0vY2hyb21pdW0vdGVzdF9leHBlY3RhdGlvbnMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0y
NTY1LDkgKzI1NjUsNiBAQCBCVUdXSzM3Mjk3IDogZmFzdC9oaXN0b3J5L3NpYmxpbmctdmlzaXRl
CiBCVUdXSzM2OTgzIE1BQyA6IGZhc3QvY2FudmFzL3dlYmdsL251bGwtb2JqZWN0LWJlaGF2aW91
ci5odG1sID0gVEVYVAogQlVHV0szNjk4MyBNQUMgOiBmYXN0L2NhbnZhcy93ZWJnbC91bmlmb3Jt
LWxvY2F0aW9uLmh0bWwgPSBURVhUCiAKLS8vIENhdXNlZCBieSBwcmVtdWx0aXBseWluZyBhbHBo
YXMgaW4gQ0cgaW1hZ2UgZGVjb2RpbmcuCi1CVUc0NDU2NiBNQUMgOiBmYXN0L2NhbnZhcy93ZWJn
bC9nbC10ZXhpbWFnZS5odG1sID0gVEVYVAotCiAvLyBBZGRlZCBpbiBodHRwOi8vdHJhYy53ZWJr
aXQub3JnL2NoYW5nZXNldC81NzQ3Ni4gRmFpbHMgaW4gQ2hyb21pdW0gYmVjYXVzZQogLy8gTGF5
b3V0VGVzdENvbnRyb2xsZXI6OmNvbXB1dGVkU3R5bGVXaXRoVmlzaXRlZEluZm8oKSBpcyBtaXNz
aW5nLgogQlVHNDEyMDYgOiBmYXN0L2hpc3RvcnkvbXVsdGlwbGUtY2xhc3Nlcy12aXNpdGVkLmh0
bWwgPSBURVhUIFRJTUVPVVQKSW5kZXg6IExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVk
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVkCShyZXZpc2lv
biA2NjE0MSkKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9Ta2lwcGVkCSh3b3JraW5nIGNv
cHkpCkBAIC0yOTIsNiArMjkyLDMgQEAgYW5pbWF0aW9ucy9wbGF5LXN0YXRlLmh0bWwKIAogIyBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDMzMzIKIGluc3BlY3Rvci9k
b20tYnJlYWtwb2ludHMuaHRtbAotCi0jIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD00NDU2NgotZmFzdC9jYW52YXMvd2ViZ2wvZ2wtdGV4aW1hZ2UuaHRtbAo=
</data>
<flag name="review"
          id="54902"
          type_id="1"
          status="+"
          setter="kbr"
    />
    <flag name="commit-queue"
          id="54903"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
      

    </bug>

</bugzilla>