<?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>27749</bug_id>
          
          <creation_ts>2009-07-27 18:29:53 -0700</creation_ts>
          <short_desc>StyleChange::init needs clean up before fixing the bug 23892</short_desc>
          <delta_ts>2009-08-18 17:01:43 -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>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</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>23892</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>hyatt</cc>
    
    <cc>justin.garcia</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>135091</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-07-27 18:29:53 -0700</bug_when>
    <thetext>StyleChange::init and checkForLegacyHTMLStyleChange needs clean up in order to fix:
Bug 23892 - execCommand(&quot;Underline&quot;) uses CSS even when styleWithCSS has been turned off (edit)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135095</commentid>
    <comment_count>1</comment_count>
      <attachid>33590</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-07-27 18:38:28 -0700</bug_when>
    <thetext>Created attachment 33590
fixes the bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135096</commentid>
    <comment_count>2</comment_count>
      <attachid>33591</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-07-27 18:53:21 -0700</bug_when>
    <thetext>Created attachment 33591
minor correction</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135097</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-07-27 18:55:53 -0700</bug_when>
    <thetext>SVN diff did terrible job here:

Original if statments:
118	        if (property-&gt;id() == CSSPropertyWhiteSpace &amp;&amp; (isTabSpanTextNode(position.node()) || isTabSpanNode((position.node()))))
119	            continue;
120	       
121	        // If needed, figure out if this change is a legacy HTML style change.
122	        if (useHTMLFormattingTags &amp;&amp; checkForLegacyHTMLStyleChange(property))
123	            continue;
124	
125	        if (property-&gt;id() == CSSPropertyDirection) {
126	            if (addedDirection)
127	                continue;
128	            addedDirection = true;
129	        }
130	
131	        // Add this property
132	        if (property-&gt;id() == CSSPropertyTextDecoration || property-&gt;id() == CSSPropertyWebkitTextDecorationsInEffect) {
133	            // Always use text-decoration because -webkit-text-decoration-in-effect is internal.
134	            CSSProperty alteredProperty(CSSPropertyTextDecoration, property-&gt;value(), property-&gt;isImportant());
135	            // We don&apos;t add &quot;text-decoration: none&quot; because it doesn&apos;t override the existing text decorations; i.e. redundant
136	            if (!equalIgnoringCase(alteredProperty.value()-&gt;cssText(), &quot;none&quot;))
137	                styleText += alteredProperty.cssText();
138	        } else
139	            styleText += property-&gt;cssText();
140	
141	        if (!addedDirection &amp;&amp; property-&gt;id() == CSSPropertyUnicodeBidi) {
142	            styleText += &quot;direction: &quot; + style-&gt;getPropertyValue(CSSPropertyDirection) + &quot;; &quot;;
143	            addedDirection = true;
144	        }

My switch statement:
        switch (property-&gt;id()) {
        case CSSPropertyWhiteSpace:
            // Changing the whitespace style in a tab span would collapse the tab into a space.
            if (isTabSpanTextNode(position.node()) || isTabSpanNode(position.node()))
                continue;
            break;
        case CSSPropertyDirection:
            if (!addedDirection) {
                styleText += property-&gt;cssText();
                addedDirection = true;
            }
            continue;
        case CSSPropertyUnicodeBidi:
            if (!addedDirection) {
                styleText += &quot;direction: &quot; + style-&gt;getPropertyValue(CSSPropertyDirection) + &quot;; &quot;;
                addedDirection = true;
            }
            break;
        case CSSPropertyTextDecoration:
        case CSSPropertyWebkitTextDecorationsInEffect:
            // Always use text-decoration because -webkit-text-decoration-in-effect is internal.
            CSSProperty alteredProperty(CSSPropertyTextDecoration, property-&gt;value(), property-&gt;isImportant());
            // We don&apos;t add &quot;text-decoration: none&quot; because it doesn&apos;t override the existing text decorations; i.e. redundant
            if (!equalIgnoringCase(alteredProperty.value()-&gt;cssText(), &quot;none&quot;))
                styleText += alteredProperty.cssText();
            continue;
        }

        // If needed, convert the CSS property to HTML tags by turning on m_apply*
        styleText += useHTMLFormattingTags ? convertCSSPropertyToApplyFlags(property) : property-&gt;cssText();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135251</commentid>
    <comment_count>4</comment_count>
      <attachid>33591</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-07-28 09:56:21 -0700</bug_when>
    <thetext>Comment on attachment 33591
minor correction

Maybe convertCSSPropertyToApplyFlags should just be &quot;styleText += cssTextForPropertyRespectingLegacyTags(propertyId, useHTMLFormattingTags)&quot;

or
&quot;checkForFormatingTagsAndReturnCSSText&quot;

or
&quot;cssTextIgnoringFormattingTags&quot;

Any of these would just take the useHTMLFormattingTags parameter, and then you wouldn&apos;t have two places where you have to call property-&gt;cssText()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135261</commentid>
    <comment_count>5</comment_count>
      <attachid>33652</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-07-28 10:30:52 -0700</bug_when>
    <thetext>Created attachment 33652
fixed per comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135262</commentid>
    <comment_count>6</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-07-28 10:32:42 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 33591 [details])
&gt; Maybe convertCSSPropertyToApplyFlags should just be &quot;styleText +=
&gt; cssTextForPropertyRespectingLegacyTags(propertyId, useHTMLFormattingTags)&quot;

I was considering this earlier but I thought passing boolean value and bailing out right away isn&apos;t so elegant.  But I guess that&apos;s much cleaner.

&gt; &quot;cssTextIgnoringFormattingTags&quot;

I like the name</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135326</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-07-28 12:33:47 -0700</bug_when>
    <thetext>It turned out that we need more substantial clean up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139704</commentid>
    <comment_count>8</comment_count>
      <attachid>34712</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-12 18:50:42 -0700</bug_when>
    <thetext>Created attachment 34712
fixes the bug, a minor rebaseline is required</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139853</commentid>
    <comment_count>9</comment_count>
      <attachid>34712</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-13 08:46:19 -0700</bug_when>
    <thetext>Comment on attachment 34712
fixes the bug, a minor rebaseline is required

&gt; +    void cleanupTextDecorationProperties(CSSMutableStyleDeclaration* style);

The verb &quot;clean up&quot; is two words, so this would be &quot;cleanUpTextDecorationProperties&quot;. But it&apos;s not clear what &quot;clean up&quot; means and I&apos;d like the function to have a better name. I think a better verb might be &quot;reconcile&quot; or &quot;standardize&quot;. This function needs a name that explains what it does as clearly as possible.

The declaration of this function should not have a name for the argument &quot;style&quot; since the type is unambiguous. Same for the other function added in this patch.

&gt; +    RefPtr&lt;CSSValue&gt; textDecorationsInEffect = style-&gt;getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect);
&gt; +    RefPtr&lt;CSSValue&gt; textDecoration = style-&gt;getPropertyCSSValue(CSSPropertyTextDecoration);
&gt; +    // We shouldn&apos;t have both text-decoration and -webkit-text-decorations-in-effect because that wouldn&apos;t make sense.
&gt; +    ASSERT(!textDecorationsInEffect || !textDecoration);

The textDecoration value fetched here is never used except in the assertion. It would be slightly better not to even make the getPropertyCSSValue call in debug builds.

&gt; +    textDecoration = style-&gt;getPropertyCSSValue(CSSPropertyTextDecoration);
&gt; +    if (textDecoration &amp;&amp; !textDecoration-&gt;isValueList())
&gt; +        style-&gt;removeProperty(CSSPropertyTextDecoration);

I don&apos;t understand the purpose of removing the text-decoration property when its value is not a value list. The code needs a comment explaining why this is a good idea.

&gt; +    if (equalIgnoringCase(style-&gt;getPropertyValue(CSSPropertyFontWeight), &quot;bold&quot;)) {

Even though the old code already did this, it would be more efficient to do this check on CSSValue rather than constructing a string with the text form of the value just so you can compare with a constant string. You can make a helper function to help automate checking that it&apos;s a CSSPrimitiveValue, then calling getIdent() and checking for the particular identifier value.

&gt; +    if (equalIgnoringCase(style-&gt;getPropertyValue(CSSPropertyFontStyle), &quot;italic&quot;)
&gt; +        || equalIgnoringCase(style-&gt;getPropertyValue(CSSPropertyFontStyle), &quot;oblique&quot;)) {

Ditto.

&gt; +    if (equalIgnoringCase(style-&gt;getPropertyValue(CSSPropertyVerticalAlign), &quot;sub&quot;)) {
&gt; +        style-&gt;removeProperty(CSSPropertyVerticalAlign);
&gt; +        m_applySubscript = true;
&gt; +    } else if (equalIgnoringCase(style-&gt;getPropertyValue(CSSPropertyVerticalAlign), &quot;super&quot;)) {
&gt; +        style-&gt;removeProperty(CSSPropertyVerticalAlign);
&gt; +        m_applySuperscript = true;
&gt; +    }

Ditto. It would also be more efficient to not get the same property value twice.

&gt; +    if (RefPtr&lt;CSSValue&gt; colorValue = style-&gt;getPropertyCSSValue(CSSPropertyColor)) {
&gt; +        RGBA32 rgba = 0;
&gt; +        CSSParser::parseColor(rgba, colorValue-&gt;cssText());
&gt; +        Color color(rgba);
&gt; +        m_applyFontColor = color.name();
&gt; +        style-&gt;removeProperty(CSSPropertyColor);
&gt; +    }

Is there no more efficient way to find out what color is specified by a CSSValue than to convert to a string and then parse the color? For example, would the getRGBA32Value function cover enough cases? Or do we also have to parse color strings?

&gt; +    RefPtr&lt;CSSValue&gt; fontSize = style-&gt;getPropertyCSSValue(CSSPropertyFontSize);
&gt; +    if (fontSize) {
&gt; +        if (!fontSize-&gt;isPrimitiveValue())
&gt; +            style-&gt;removeProperty(CSSPropertyFontSize); // Can&apos;t make sense of the number. Put no font size.
&gt; +        else {
&gt; +            CSSPrimitiveValue* value = static_cast&lt;CSSPrimitiveValue*&gt;(fontSize.get());
&gt;  
&gt; +            if (value-&gt;primitiveType() &lt; CSSPrimitiveValue::CSS_PX || value-&gt;primitiveType() &gt; CSSPrimitiveValue::CSS_PC)
&gt; +                ;// Size keyword or relative unit.

The formatting here is confusing. I suggest using braces instead of just a semicolon. I also suggest a longer comment, and if it&apos;s two lines then it would justify having braces! Understood that it&apos;s a size keyword or a relative unit, but why are does this code do nothing in that case? Is it something we want to handle later or is it already correct?

&gt; +        RefPtr&lt;CSSValueList&gt; resultValueList = static_cast&lt;CSSValueList*&gt;(resultValue.get())-&gt;copy();
&gt;          CSSValueList* computedValueList = static_cast&lt;CSSValueList*&gt;(computedValue.get());
&gt; +        for (size_t i = 0; i &lt; computedValueList-&gt;length(); i++)
&gt; +            resultValueList-&gt;removeAll(computedValueList-&gt;item(i));
&gt; +        result-&gt;setProperty(textDecorationProperties[n], resultValueList-&gt;cssText());

I don&apos;t understand why you&apos;re copying the CSSValueList here. If the list is &quot;live&quot; and associated with the original property, then it seems that we could just modify the list and we wouldn&apos;t need to call setProperty at all. If the list is not live and is not associated with the property, then it seems we could modify it without making a copy.

I&apos;m going to say review- because there are a few items above that might inspire code changes. Generally the patch seems quite good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139926</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 10:54:22 -0700</bug_when>
    <thetext>Thanks you for your feedback!

(In reply to comment #9)
&gt; I&apos;d like the function to have a better name. I think a better verb might be
&gt; &quot;reconcile&quot; or &quot;standardize&quot;. This function needs a name that explains what it
&gt; does as clearly as possible.

I&apos;ll use reconcileTextDecorationProperties unless we come up with a better name.

&gt; The declaration of this function should not have a name for the argument
&gt; &quot;style&quot; since the type is unambiguous. Same for the other function added in
&gt; this patch.

Ugh, style glitch.  Removed.

&gt; The textDecoration value fetched here is never used except in the assertion. It
&gt; would be slightly better not to even make the getPropertyCSSValue call in debug
&gt; builds.

I changed the logic slightly so that textDecoration is used when textDecorationsInEffect is 0.
 
&gt; I don&apos;t understand the purpose of removing the text-decoration property when
&gt; its value is not a value list. The code needs a comment explaining why this is
&gt; a good idea.

We don&apos;t want to add &quot;text-decoration: none&quot; because it&apos;s redundant

&gt; Even though the old code already did this, it would be more efficient to do
&gt; this check on CSSValue rather than constructing a string with the text form of
&gt; the value just so you can compare with a constant string. You can make a helper
&gt; function to help automate checking that it&apos;s a CSSPrimitiveValue, then calling
&gt; getIdent() and checking for the particular identifier value.

I added
int getPrimitiveValue(CSSMutableStyleDeclaration* style, int propertyID)
don&apos;t know why I didn&apos;t come up with this earlier.

&gt; It would also be more efficient to not get the same property value twice.

Done.  A local copy of the identifier is made.

&gt; &gt; +    if (RefPtr&lt;CSSValue&gt; colorValue = style-&gt;getPropertyCSSValue(CSSPropertyColor)) {
&gt; &gt; +        RGBA32 rgba = 0;
&gt; &gt; +        CSSParser::parseColor(rgba, colorValue-&gt;cssText());
&gt; &gt; +        Color color(rgba);
&gt; &gt; +        m_applyFontColor = color.name();
&gt; &gt; +        style-&gt;removeProperty(CSSPropertyColor);
&gt; &gt; +    }
&gt; 
&gt; Is there no more efficient way to find out what color is specified by a
&gt; CSSValue than to convert to a string and then parse the color? For example,
&gt; would the getRGBA32Value function cover enough cases? Or do we also have to
&gt; parse color strings?

I&apos;m working on this.

&gt; &gt; +            CSSPrimitiveValue* value = static_cast&lt;CSSPrimitiveValue*&gt;(fontSize.get());
&gt; &gt;  
&gt; &gt; +            if (value-&gt;primitiveType() &lt; CSSPrimitiveValue::CSS_PX || value-&gt;primitiveType() &gt; CSSPrimitiveValue::CSS_PC)
&gt; &gt; +                ;// Size keyword or relative unit.
&gt; 
&gt; The formatting here is confusing. I suggest using braces instead of just a
&gt; semicolon. I also suggest a longer comment, and if it&apos;s two lines then it would
&gt; justify having braces! Understood that it&apos;s a size keyword or a relative unit,
&gt; but why are does this code do nothing in that case? Is it something we want to
&gt; handle later or is it already correct?

In the original function, there was a break statement so I was intending to negate the condition
and delete the empty if but totally forgot.  Now done.

&gt; 
&gt; &gt; +        RefPtr&lt;CSSValueList&gt; resultValueList = static_cast&lt;CSSValueList*&gt;(resultValue.get())-&gt;copy();
&gt; &gt;          CSSValueList* computedValueList = static_cast&lt;CSSValueList*&gt;(computedValue.get());
&gt; &gt; +        for (size_t i = 0; i &lt; computedValueList-&gt;length(); i++)
&gt; &gt; +            resultValueList-&gt;removeAll(computedValueList-&gt;item(i));
&gt; &gt; +        result-&gt;setProperty(textDecorationProperties[n], resultValueList-&gt;cssText());
&gt; 
&gt; I don&apos;t understand why you&apos;re copying the CSSValueList here. If the list is
&gt; &quot;live&quot; and associated with the original property, then it seems that we could
&gt; just modify the list and we wouldn&apos;t need to call setProperty at all. If the
&gt; list is not live and is not associated with the property, then it seems we
&gt; could modify it without making a copy.

So it turned out that when we copy() computed style, it won&apos;t create a copy of CSSValueList.
i.e. we will be changing the value of both mutable object and computed style.

Take a look at the lines 147-161 of CSSStyleDeclaration.  It only copies CSSProperty but CSSProperty merely copies the RefPtr to CSSValue* which means CSSValueList isn&apos;t really copied.  I think this is a bad implementation of copy, but if we decided to copy every single CSSValue then performance may regress significantly, so I won&apos;t touch it this time.  I should add a comment maybe?


&gt; I&apos;m going to say review- because there are a few items above that might inspire
&gt; code changes. Generally the patch seems quite good.

Thanks for the review.  I&apos;m posting the follow up patch shortly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139971</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-13 12:28:19 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; &gt; I don&apos;t understand the purpose of removing the text-decoration property when
&gt; &gt; its value is not a value list. The code needs a comment explaining why this is
&gt; &gt; a good idea.
&gt; 
&gt; We don&apos;t want to add &quot;text-decoration: none&quot; because it&apos;s redundant

Needs a comment. !isValueList() is not an obvious way to check for &quot;none&quot;.

&gt; &gt; Even though the old code already did this, it would be more efficient to do
&gt; &gt; this check on CSSValue rather than constructing a string with the text form of
&gt; &gt; the value just so you can compare with a constant string. You can make a helper
&gt; &gt; function to help automate checking that it&apos;s a CSSPrimitiveValue, then calling
&gt; &gt; getIdent() and checking for the particular identifier value.
&gt; 
&gt; I added
&gt; int getPrimitiveValue(CSSMutableStyleDeclaration* style, int propertyID)

I don&apos;t think that&apos;s quite the right name. A primitive value is not necessarily an identifier, and I think you need a name that mentions the word identifier.

&gt; &gt; &gt; +        RefPtr&lt;CSSValueList&gt; resultValueList = static_cast&lt;CSSValueList*&gt;(resultValue.get())-&gt;copy();
&gt; &gt; &gt;          CSSValueList* computedValueList = static_cast&lt;CSSValueList*&gt;(computedValue.get());
&gt; &gt; &gt; +        for (size_t i = 0; i &lt; computedValueList-&gt;length(); i++)
&gt; &gt; &gt; +            resultValueList-&gt;removeAll(computedValueList-&gt;item(i));
&gt; &gt; &gt; +        result-&gt;setProperty(textDecorationProperties[n], resultValueList-&gt;cssText());
&gt; &gt; 
&gt; &gt; I don&apos;t understand why you&apos;re copying the CSSValueList here. If the list is
&gt; &gt; &quot;live&quot; and associated with the original property, then it seems that we could
&gt; &gt; just modify the list and we wouldn&apos;t need to call setProperty at all. If the
&gt; &gt; list is not live and is not associated with the property, then it seems we
&gt; &gt; could modify it without making a copy.
&gt; 
&gt; So it turned out that when we copy() computed style, it won&apos;t create a copy of
&gt; CSSValueList.
&gt; i.e. we will be changing the value of both mutable object and computed style.
&gt; 
&gt; Take a look at the lines 147-161 of CSSStyleDeclaration.  It only copies
&gt; CSSProperty but CSSProperty merely copies the RefPtr to CSSValue* which means
&gt; CSSValueList isn&apos;t really copied.  I think this is a bad implementation of
&gt; copy, but if we decided to copy every single CSSValue then performance may
&gt; regress significantly, so I won&apos;t touch it this time.  I should add a comment
&gt; maybe?

I don&apos;t understand how a computed style is involved here. The CSSValueList you are copying is from resultValue. Can that be a a computed style?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140011</commentid>
    <comment_count>12</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 13:50:18 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; Needs a comment. !isValueList() is not an obvious way to check for &quot;none&quot;.

I&apos;m adding comment.

&gt; &gt; int getPrimitiveValue(CSSMutableStyleDeclaration* style, int propertyID)
&gt; 
&gt; I don&apos;t think that&apos;s quite the right name. A primitive value is not necessarily
&gt; an identifier, and I think you need a name that mentions the word identifier.

How about getPrimitiveValueIdentifier then?
 
&gt; &gt; So it turned out that when we copy() computed style, it won&apos;t create a copy of
&gt; &gt; CSSValueList.
&gt; &gt; i.e. we will be changing the value of both mutable object and computed style.
&gt; &gt; 
&gt; &gt; Take a look at the lines 147-161 of CSSStyleDeclaration.  It only copies
&gt; &gt; CSSProperty but CSSProperty merely copies the RefPtr to CSSValue* which means
&gt; &gt; CSSValueList isn&apos;t really copied.  I think this is a bad implementation of
&gt; &gt; copy, but if we decided to copy every single CSSValue then performance may
&gt; &gt; regress significantly, so I won&apos;t touch it this time.  I should add a comment
&gt; &gt; maybe?
&gt; 
&gt; I don&apos;t understand how a computed style is involved here. The CSSValueList you
&gt; are copying is from resultValue. Can that be a a computed style?

So we&apos;re creating mutable style by calling computedStyle-&gt;copy(). But then this copy function does NOT copy CSSValue object.  It merely copies the pointer. So if we alter the content of CSSValue, we&apos;ll be modifying the content of all computed / mutable styles that share this CSSValueList.


And it turned out that there is a bug that forces us to re-parse color.  I&apos;ll file a bug and possibility fix it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140014</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-13 13:53:28 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; How about getPrimitiveValueIdentifier then?

I think getIdentifierValue would be even better. Returns the identifier of a value unless it&apos;s not an identifier in which case it returns 0.

&gt; So we&apos;re creating mutable style by calling computedStyle-&gt;copy(). But then this
&gt; copy function does NOT copy CSSValue object.  It merely copies the pointer. So
&gt; if we alter the content of CSSValue, we&apos;ll be modifying the content of all
&gt; computed / mutable styles that share this CSSValueList.

I think we should take the risk of slowing down performance and fix this in the style copy function. The code is getting more twisted and we need it to be less twisted. Complicated rules about when we need to copy create trouble.

&gt; And it turned out that there is a bug that forces us to re-parse color.  I&apos;ll
&gt; file a bug and possibility fix it.

OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140026</commentid>
    <comment_count>14</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 14:09:32 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; I think getIdentifierValue would be even better. Returns the identifier of a
&gt; value unless it&apos;s not an identifier in which case it returns 0.

Ok, I&apos;ll use that.

&gt; &gt; So we&apos;re creating mutable style by calling computedStyle-&gt;copy(). But then this
&gt; &gt; copy function does NOT copy CSSValue object.  It merely copies the pointer. So
&gt; &gt; if we alter the content of CSSValue, we&apos;ll be modifying the content of all
&gt; &gt; computed / mutable styles that share this CSSValueList.
&gt; 
&gt; I think we should take the risk of slowing down performance and fix this in the
&gt; style copy function. The code is getting more twisted and we need it to be less
&gt; twisted. Complicated rules about when we need to copy create trouble.

Eric S. mentioned that we&apos;re trying to avoid copying computed styles and CSSValue to minimize memory usage and such.  I think changing copy method is quite expensive operation since it&apos;s used everywhere.  One idea Eric broguht up is to make the return value of getPropertyCSSValue const so that we don&apos;t accidently modify it.  I think it&apos;s quite misleading that it returns RefPtr.  I first though it&apos;ll return new object because of it.

+hyatt since he knows a lot about CSS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140032</commentid>
    <comment_count>15</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-13 14:20:14 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; One idea Eric broguht up
&gt; is to make the return value of getPropertyCSSValue const so that we don&apos;t
&gt; accidently modify it.  I think it&apos;s quite misleading that it returns RefPtr.  I
&gt; first though it&apos;ll return new object because of it.

It returns PassRefPtr because it returns a new object in the case of computed style.

I think we may want a different call for use when you have a mutable style.

Maybe we can move getPropertyCSSValue out of the base class into the mutable style derived class?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140051</commentid>
    <comment_count>16</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 14:47:37 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; &gt; And it turned out that there is a bug that forces us to re-parse color.  I&apos;ll
&gt; &gt; file a bug and possibility fix it.
&gt; 
&gt; OK.

Filed:
CSSMutableStyleDeclaration::setProperty does not parse color property
https://bugs.webkit.org/show_bug.cgi?id=28282</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140053</commentid>
    <comment_count>17</comment_count>
      <attachid>34791</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 14:48:37 -0700</bug_when>
    <thetext>Created attachment 34791
fixed per comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140057</commentid>
    <comment_count>18</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 14:52:39 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; It returns PassRefPtr because it returns a new object in the case of computed
&gt; style.
&gt; 
&gt; I think we may want a different call for use when you have a mutable style.
&gt; 
&gt; Maybe we can move getPropertyCSSValue out of the base class into the mutable
&gt; style derived class?

That might be a good call.  I&apos;ll look into it.  But that should be a separate patch though.  This cleanup is already getting pretty big.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140087</commentid>
    <comment_count>19</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 15:58:05 -0700</bug_when>
    <thetext>Talked with Eric S. in person.  It seems that we need duplicateCSSValues that deep-copies the content of a CSSStyleDeclaration.  For time being, we can implement this with just iterating through properties and call setProperty for each property.  But ultimately, we want copy method in each derived class of CSSValue to speed up this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140094</commentid>
    <comment_count>20</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-13 16:27:37 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; Talked with Eric S. in person.  It seems that we need duplicateCSSValues that
&gt; deep-copies the content of a CSSStyleDeclaration.  For time being, we can
&gt; implement this with just iterating through properties and call setProperty for
&gt; each property.  But ultimately, we want copy method in each derived class of
&gt; CSSValue to speed up this.

Mn... this might not be as efficient as we want it to be.

&gt; Maybe we can move getPropertyCSSValue out of the base class into the mutable
&gt; style derived class?

Maybe that we should copy when getPropertyCSSValue is first called for the mutable style.  Either way, it&apos;s not clear to me whether we should copy every property at once or should copy on demand.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140839</commentid>
    <comment_count>21</comment_count>
    <who name="Justin Garcia">justin.garcia</who>
    <bug_when>2009-08-17 14:32:05 -0700</bug_when>
    <thetext>+        and adding functions cleanupTextDecorationProperties and extractTextStyle to handle the style.

Typo new name is reconcileTextDecorationProperties.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140852</commentid>
    <comment_count>22</comment_count>
      <attachid>34995</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-17 15:45:41 -0700</bug_when>
    <thetext>Created attachment 34995
removed the fix on how text decorations are trimmed, no behavioral change</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140857</commentid>
    <comment_count>23</comment_count>
      <attachid>34998</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-17 16:06:59 -0700</bug_when>
    <thetext>Created attachment 34998
made formatted diff more readable</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141286</commentid>
    <comment_count>24</comment_count>
      <attachid>34998</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-18 15:23:31 -0700</bug_when>
    <thetext>Comment on attachment 34998
made formatted diff more readable

Changes look good. I&apos;m saying r=me.

But doesn&apos;t this patch change the results of some layout tests? Where are the changes to the expected results?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141305</commentid>
    <comment_count>25</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2009-08-18 16:04:18 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; (From update of attachment 34998 [details])
&gt; Changes look good. I&apos;m saying r=me.
&gt; 
&gt; But doesn&apos;t this patch change the results of some layout tests? Where are the
&gt; changes to the expected results?

No, the code I had in getPropertiesNotInComputedStyle was preparation to use it in other places.  But since that patch hasn&apos;t been submitted yet, there is no harm in replacing it with a simpler code.  In fact, that was why the bug survived there without being noticed by me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141326</commentid>
    <comment_count>26</comment_count>
      <attachid>34998</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-18 17:01:37 -0700</bug_when>
    <thetext>Comment on attachment 34998
made formatted diff more readable

Clearing flags on attachment: 34998

Committed r47466: &lt;http://trac.webkit.org/changeset/47466&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141327</commentid>
    <comment_count>27</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-18 17:01:43 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33590</attachid>
            <date>2009-07-27 18:38:28 -0700</date>
            <delta_ts>2009-07-27 18:53:21 -0700</delta_ts>
            <desc>fixes the bug</desc>
            <filename>fix27749</filename>
            <type>text/plain</type>
            <size>8190</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NjQ0OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjAgQEAKKzIwMDktMDctMjcgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3R5
bGVDaGFuZ2U6OmluaXQgbmVlZHMgY2xlYW4gdXAgYmVmb3JlIGZpeGluZyB0aGUgYnVnIDIzODky
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzc0OQor
CisgICAgICAgIFRoaXMgcGF0Y2ggY2xlYW5zIHVwIFN0eWxlQ2hhbmdlOjppbml0IGZvciBmdXR1
cmUgcGF0Y2ggZm9yIHRoZSBidWcgMjM4OTIuCisgICAgICAgIEl0IHJlcGxhY2VzIGZvdXIgaWYg
c3RhdGVtZW50cyBieSBhIHN3aXRjaCBzdGF0ZW1lbnQsIGFuZCByZW5hbWVzIGNoZWNrRm9yTGVn
YWN5SFRNTFN0eWxlQ2hhbmdlCisgICAgICAgIHRvIGNvbnZlcnRDU1NQcm9wZXJ0eVRvQXBwbHlG
bGFnczsgd2hpY2ggbm93IHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGluIFN0cmluZyBpbnN0
ZWFkIG9mIGJvb2xlYW4gdHlwZS4KKyAgICAgICAgCisgICAgICAgIFNpbmNlIHRoaXMgaXMgYSBj
bGVhbiB1cCwgdGhlcmUgaXMgbm8gdGVzdC4KKworICAgICAgICAqIGVkaXRpbmcvQXBwbHlTdHls
ZUNvbW1hbmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVDaGFuZ2U6OmluaXQpOiBkaXR0
bworICAgICAgICAoV2ViQ29yZTo6U3R5bGVDaGFuZ2U6OmNvbnZlcnRDU1NQcm9wZXJ0eVRvQXBw
bHlGbGFncyk6IFVzZWQgdG8gYmUgY2hlY2tGb3JMZWdhY3lIVE1MU3R5bGVDaGFuZ2UKKwogMjAw
OS0wNy0yNyAgSmlhbiBMaSAgPGppYW5saUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRGF2aWQgTGV2aW4uCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvQXBwbHlTdHlsZUNvbW1h
bmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5j
cHAJKHJldmlzaW9uIDQ2NDQ1KQorKysgV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5k
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzAsNyArNzAsNyBAQCBwdWJsaWM6CiAKIHByaXZhdGU6
CiAgICAgdm9pZCBpbml0KFBhc3NSZWZQdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4sIGNvbnN0IFBv
c2l0aW9uJik7Ci0gICAgYm9vbCBjaGVja0ZvckxlZ2FjeUhUTUxTdHlsZUNoYW5nZShjb25zdCBD
U1NQcm9wZXJ0eSopOworICAgIFN0cmluZyBjb252ZXJ0Q1NTUHJvcGVydHlUb0FwcGx5RmxhZ3Mo
Y29uc3QgQ1NTUHJvcGVydHkqKTsKICAgICBzdGF0aWMgYm9vbCBjdXJyZW50bHlIYXNTdHlsZShj
b25zdCBQb3NpdGlvbiYsIGNvbnN0IENTU1Byb3BlcnR5Kik7CiAgICAgCiAgICAgU3RyaW5nIG1f
Y3NzU3R5bGU7CkBAIC0xMTQsMzQgKzExNCwzMyBAQCB2b2lkIFN0eWxlQ2hhbmdlOjppbml0KFBh
c3NSZWZQdHI8Q1NTU3R5CiAgICAgICAgIGlmIChwb3NpdGlvbi5pc05vdE51bGwoKSAmJiBjdXJy
ZW50bHlIYXNTdHlsZShwb3NpdGlvbiwgcHJvcGVydHkpKQogICAgICAgICAgICAgY29udGludWU7
CiAgICAgICAgIAotICAgICAgICAvLyBDaGFuZ2luZyB0aGUgd2hpdGVzcGFjZSBzdHlsZSBpbiBh
IHRhYiBzcGFuIHdvdWxkIGNvbGxhcHNlIHRoZSB0YWIgaW50byBhIHNwYWNlLgotICAgICAgICBp
ZiAocHJvcGVydHktPmlkKCkgPT0gQ1NTUHJvcGVydHlXaGl0ZVNwYWNlICYmIChpc1RhYlNwYW5U
ZXh0Tm9kZShwb3NpdGlvbi5ub2RlKCkpIHx8IGlzVGFiU3Bhbk5vZGUoKHBvc2l0aW9uLm5vZGUo
KSkpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgbmVl
ZGVkLCBmaWd1cmUgb3V0IGlmIHRoaXMgY2hhbmdlIGlzIGEgbGVnYWN5IEhUTUwgc3R5bGUgY2hh
bmdlLgotICAgICAgICBpZiAodXNlSFRNTEZvcm1hdHRpbmdUYWdzICYmIGNoZWNrRm9yTGVnYWN5
SFRNTFN0eWxlQ2hhbmdlKHByb3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgIGlmIChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eURpcmVjdGlvbikgewotICAgICAg
ICAgICAgaWYgKGFkZGVkRGlyZWN0aW9uKQorICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LT5pZCgp
KSB7CisgICAgICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToKKyAgICAgICAgICAg
ICAgICAvLyBDaGFuZ2luZyB0aGUgd2hpdGVzcGFjZSBzdHlsZSBpbiBhIHRhYiBzcGFuIHdvdWxk
IGNvbGxhcHNlIHRoZSB0YWIgaW50byBhIHNwYWNlLgorICAgICAgICAgICAgICAgIGlmIChpc1Rh
YlNwYW5UZXh0Tm9kZShwb3NpdGlvbi5ub2RlKCkpIHx8IGlzVGFiU3Bhbk5vZGUocG9zaXRpb24u
bm9kZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgorICAgICAgICAg
ICAgICAgIGFkZGVkRGlyZWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlVbmljb2RlQmlkaToKKyAgICAgICAgICAgICAg
ICBpZiAoIWFkZGVkRGlyZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlVGV4dCAr
PSAiZGlyZWN0aW9uOiAiICsgc3R5bGUtPmdldFByb3BlcnR5VmFsdWUoQ1NTUHJvcGVydHlEaXJl
Y3Rpb24pICsgIjsgIjsKKyAgICAgICAgICAgICAgICAgICAgYWRkZWREaXJlY3Rpb24gPSB0cnVl
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbjoKKyAgICAgICAgICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdDoKKyAgICAgICAgICAgICAgICAvLyBB
bHdheXMgdXNlIHRleHQtZGVjb3JhdGlvbiBiZWNhdXNlIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9u
LWluLWVmZmVjdCBpcyBpbnRlcm5hbC4KKyAgICAgICAgICAgICAgICBDU1NQcm9wZXJ0eSBhbHRl
cmVkUHJvcGVydHkoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbiwgcHJvcGVydHktPnZhbHVlKCks
IHByb3BlcnR5LT5pc0ltcG9ydGFudCgpKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBh
ZGQgInRleHQtZGVjb3JhdGlvbjogbm9uZSIgYmVjYXVzZSBpdCBkb2Vzbid0IG92ZXJyaWRlIHRo
ZSBleGlzdGluZyB0ZXh0IGRlY29yYXRpb25zOyBpLmUuIHJlZHVuZGFudAorICAgICAgICAgICAg
ICAgIGlmICghZXF1YWxJZ25vcmluZ0Nhc2UoYWx0ZXJlZFByb3BlcnR5LnZhbHVlKCktPmNzc1Rl
eHQoKSwgIm5vbmUiKSkKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IGFsdGVyZWRQ
cm9wZXJ0eS5jc3NUZXh0KCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICBhZGRlZERpcmVjdGlvbiA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhp
cyBwcm9wZXJ0eQotICAgICAgICBpZiAocHJvcGVydHktPmlkKCkgPT0gQ1NTUHJvcGVydHlUZXh0
RGVjb3JhdGlvbiB8fCBwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNv
cmF0aW9uc0luRWZmZWN0KSB7Ci0gICAgICAgICAgICAvLyBBbHdheXMgdXNlIHRleHQtZGVjb3Jh
dGlvbiBiZWNhdXNlIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLWluLWVmZmVjdCBpcyBpbnRlcm5h
bC4KLSAgICAgICAgICAgIENTU1Byb3BlcnR5IGFsdGVyZWRQcm9wZXJ0eShDU1NQcm9wZXJ0eVRl
eHREZWNvcmF0aW9uLCBwcm9wZXJ0eS0+dmFsdWUoKSwgcHJvcGVydHktPmlzSW1wb3J0YW50KCkp
OwotICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYWRkICJ0ZXh0LWRlY29yYXRpb246IG5vbmUiIGJl
Y2F1c2UgaXQgZG9lc24ndCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgdGV4dCBkZWNvcmF0aW9uczsg
aS5lLiByZWR1bmRhbnQKLSAgICAgICAgICAgIGlmICghZXF1YWxJZ25vcmluZ0Nhc2UoYWx0ZXJl
ZFByb3BlcnR5LnZhbHVlKCktPmNzc1RleHQoKSwgIm5vbmUiKSkKLSAgICAgICAgICAgICAgICBz
dHlsZVRleHQgKz0gYWx0ZXJlZFByb3BlcnR5LmNzc1RleHQoKTsKLSAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICBzdHlsZVRleHQgKz0gcHJvcGVydHktPmNzc1RleHQoKTsKLQotICAgICAgICBp
ZiAoIWFkZGVkRGlyZWN0aW9uICYmIHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5VW5pY29k
ZUJpZGkpIHsKLSAgICAgICAgICAgIHN0eWxlVGV4dCArPSAiZGlyZWN0aW9uOiAiICsgc3R5bGUt
PmdldFByb3BlcnR5VmFsdWUoQ1NTUHJvcGVydHlEaXJlY3Rpb24pICsgIjsgIjsKLSAgICAgICAg
ICAgIGFkZGVkRGlyZWN0aW9uID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAg
Ly8gSWYgbmVlZGVkLCBjb252ZXJ0IHRoZSBDU1MgcHJvcGVydHkgdG8gSFRNTCB0YWdzIGJ5IHR1
cm5pbmcgb24gbV9hcHBseSoKKyAgICAgICAgc3R5bGVUZXh0ICs9IHVzZUhUTUxGb3JtYXR0aW5n
VGFncyA/IGNvbnZlcnRDU1NQcm9wZXJ0eVRvQXBwbHlGbGFncyhwcm9wZXJ0eSkgOiBwcm9wZXJ0
eS0+Y3NzVGV4dCgpOwogICAgIH0KIAogICAgIC8vIFNhdmUgdGhlIHJlc3VsdCBmb3IgbGF0ZXIK
QEAgLTE0OSwzMyArMTQ4LDMzIEBAIHZvaWQgU3R5bGVDaGFuZ2U6OmluaXQoUGFzc1JlZlB0cjxD
U1NTdHkKIH0KIAogLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWFwcGluZyBmcm9tIENTUyBzdHls
ZXMgdG8gc3R5bGluZyB0YWdzIChsaWtlIGZvbnQtd2VpZ2h0OiBib2xkIHRvIDxiPikKLWJvb2wg
U3R5bGVDaGFuZ2U6OmNoZWNrRm9yTGVnYWN5SFRNTFN0eWxlQ2hhbmdlKGNvbnN0IENTU1Byb3Bl
cnR5KiBwcm9wZXJ0eSkKK1N0cmluZyBTdHlsZUNoYW5nZTo6Y29udmVydENTU1Byb3BlcnR5VG9B
cHBseUZsYWdzKGNvbnN0IENTU1Byb3BlcnR5KiBwcm9wZXJ0eSkKIHsKICAgICBpZiAoIXByb3Bl
cnR5IHx8ICFwcm9wZXJ0eS0+dmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAor
ICAgICAgICByZXR1cm4gcHJvcGVydHktPmNzc1RleHQoKTsKKwogICAgIFN0cmluZyB2YWx1ZVRl
eHQocHJvcGVydHktPnZhbHVlKCktPmNzc1RleHQoKSk7CiAgICAgc3dpdGNoIChwcm9wZXJ0eS0+
aWQoKSkgewogICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKICAgICAgICAgICAg
IGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJib2xkIikpIHsKICAgICAgICAgICAg
ICAgICBtX2FwcGx5Qm9sZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJl
YWs7CiAgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgogICAgICAgICAgICAg
aWYgKGVxdWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgInN1YiIpKSB7CiAgICAgICAgICAgICAg
ICAgbV9hcHBseVN1YnNjcmlwdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAg
aWYgKGVxdWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgInN1cGVyIikpIHsKICAgICAgICAgICAg
ICAgICBtX2FwcGx5U3VwZXJzY3JpcHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgIGJyZWFrOwogICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgogICAgICAgICAg
ICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgIml0YWxpYyIpIHx8IGVxdWFsSWdu
b3JpbmdDYXNlKHZhbHVlVGV4dCwgIm9ibGlxdWUiKSkgewogICAgICAgICAgICAgICAgIG1fYXBw
bHlJdGFsaWMgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAg
ICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAg
ICAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6IHsKQEAgLTE4MywxOCArMTgyLDE5IEBAIGJvb2wg
U3R5bGVDaGFuZ2U6OmNoZWNrRm9yTGVnYWN5SFRNTFN0eWwKICAgICAgICAgICAgIENTU1BhcnNl
cjo6cGFyc2VDb2xvcihyZ2JhLCB2YWx1ZVRleHQpOwogICAgICAgICAgICAgQ29sb3IgY29sb3Io
cmdiYSk7CiAgICAgICAgICAgICBtX2FwcGx5Rm9udENvbG9yID0gY29sb3IubmFtZSgpOwotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0K
ICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRGYW1pbHk6CiAgICAgICAgICAgICBtX2FwcGx5
Rm9udEZhY2UgPSB2YWx1ZVRleHQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
ICAgIHJldHVybiAiIjsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXplOgogICAgICAg
ICAgICAgaWYgKHByb3BlcnR5LT52YWx1ZSgpLT5jc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZTo6
Q1NTX1BSSU1JVElWRV9WQUxVRSkgewogICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
ICp2YWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlICo+KHByb3BlcnR5LT52YWx1
ZSgpKTsKIAotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+cHJpbWl0aXZlVHlwZSgpIDwgQ1NT
UHJpbWl0aXZlVmFsdWU6OkNTU19QWCB8fCB2YWx1ZS0+cHJpbWl0aXZlVHlwZSgpID4gQ1NTUHJp
bWl0aXZlVmFsdWU6OkNTU19QQykKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUtPnByaW1pdGl2
ZVR5cGUoKSA8IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFggfHwgdmFsdWUtPnByaW1pdGl2ZVR5
cGUoKSA+IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUEMpIHsKICAgICAgICAgICAgICAgICAgICAg
Ly8gU2l6ZSBrZXl3b3JkIG9yIHJlbGF0aXZlIHVuaXQuCi0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQogCiAgICAgICAgICAgICAgICAgZmxvYXQgbnVtYmVyID0gdmFsdWUtPmdldEZsb2F0VmFsdWUo
Q1NTUHJpbWl0aXZlVmFsdWU6OkNTU19QWCk7CiAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA8
PSA5KQpAQCAtMjE0LDE0ICsyMTQsMTQgQEAgYm9vbCBTdHlsZUNoYW5nZTo6Y2hlY2tGb3JMZWdh
Y3lIVE1MU3R5bAogICAgICAgICAgICAgICAgIC8vIEh1Z2UgcXVpcmsgaW4gTWljcm9zZnQgRW50
b3VyYWdlIGlzIHRoYXQgdGhleSB1bmRlcnN0YW5kIENTUyBmb250LXNpemUsIGJ1dCBhbHNvIHdy
aXRlIAogICAgICAgICAgICAgICAgIC8vIG91dCBsZWdhY3kgMS03IHZhbHVlcyBpbiBmb250IHRh
Z3MgKEkgZ3Vlc3MgZm9yIG1haWxlcnMgdGhhdCBhcmUgbm90IENTUy1zYXZ2eSBhdCBhbGwsIAog
ICAgICAgICAgICAgICAgIC8vIGxpa2UgRXVkb3JhKS4gWWVzLCB0aGV5IHdyaXRlIG91dCAqYm90
aCouIFdlIG5lZWQgdG8gd3JpdGUgb3V0IGJvdGggYXMgd2VsbC4gUmV0dXJuIGZhbHNlLgotICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBDYW4ndCBt
YWtlIHNlbnNlIG9mIHRoZSBudW1iZXIuIFB1dCBubyBmb250IHNpemUuCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAg
fQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHByb3BlcnR5LT5jc3NUZXh0
KCk7CiB9CiAKIGJvb2wgU3R5bGVDaGFuZ2U6OmN1cnJlbnRseUhhc1N0eWxlKGNvbnN0IFBvc2l0
aW9uICZwb3MsIGNvbnN0IENTU1Byb3BlcnR5ICpwcm9wZXJ0eSkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33591</attachid>
            <date>2009-07-27 18:53:21 -0700</date>
            <delta_ts>2009-07-28 10:30:52 -0700</delta_ts>
            <desc>minor correction</desc>
            <filename>fix27749b</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33652</attachid>
            <date>2009-07-28 10:30:52 -0700</date>
            <delta_ts>2009-08-12 18:50:42 -0700</delta_ts>
            <desc>fixed per comment</desc>
            <filename>fix27749c</filename>
            <type>text/plain</type>
            <size>8389</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NjQ0OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjAgQEAKKzIwMDktMDctMjcgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3R5
bGVDaGFuZ2U6OmluaXQgbmVlZHMgY2xlYW4gdXAgYmVmb3JlIGZpeGluZyB0aGUgYnVnIDIzODky
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzc0OQor
CisgICAgICAgIFRoaXMgcGF0Y2ggY2xlYW5zIHVwIFN0eWxlQ2hhbmdlOjppbml0IGZvciBmdXR1
cmUgcGF0Y2ggZm9yIHRoZSBidWcgMjM4OTIuCisgICAgICAgIEl0IHJlcGxhY2VzIGZvdXIgaWYg
c3RhdGVtZW50cyBieSBhIHN3aXRjaCBzdGF0ZW1lbnQsIGFuZCByZW5hbWVzIGNoZWNrRm9yTGVn
YWN5SFRNTFN0eWxlQ2hhbmdlCisgICAgICAgIHRvIGNzc1RleHRJZ25vcmluZ0Zvcm1hdHRpbmdU
YWdzOyB3aGljaCBub3cgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gU3RyaW5nIGluc3Rl
YWQgb2YgYm9vbGVhbiB0eXBlLgorCisgICAgICAgIFNpbmNlIHRoaXMgaXMgYSBjbGVhbiB1cCwg
dGhlcmUgaXMgbm8gdGVzdC4KKworICAgICAgICAqIGVkaXRpbmcvQXBwbHlTdHlsZUNvbW1hbmQu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVDaGFuZ2U6OmluaXQpOiBkaXR0bworICAgICAg
ICAoV2ViQ29yZTo6U3R5bGVDaGFuZ2U6OmNzc1RleHRJZ25vcmluZ0Zvcm1hdHRpbmdUYWdzKTog
VXNlZCB0byBiZSBjaGVja0ZvckxlZ2FjeUhUTUxTdHlsZUNoYW5nZQorCiAyMDA5LTA3LTI3ICBK
aWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZp
ZCBMZXZpbi4KSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAkocmV2aXNp
b24gNDY0NDUpCisrKyBXZWJDb3JlL2VkaXRpbmcvQXBwbHlTdHlsZUNvbW1hbmQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC03MCw3ICs3MCw3IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICB2b2lk
IGluaXQoUGFzc1JlZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiwgY29uc3QgUG9zaXRpb24mKTsK
LSAgICBib29sIGNoZWNrRm9yTGVnYWN5SFRNTFN0eWxlQ2hhbmdlKGNvbnN0IENTU1Byb3BlcnR5
Kik7CisgICAgU3RyaW5nIGNzc1RleHRJZ25vcmluZ0Zvcm1hdHRpbmdUYWdzKGNvbnN0IENTU1By
b3BlcnR5KiwgYm9vbCBzaG91bGRTdHlsZVdpdGhDU1MpOwogICAgIHN0YXRpYyBib29sIGN1cnJl
bnRseUhhc1N0eWxlKGNvbnN0IFBvc2l0aW9uJiwgY29uc3QgQ1NTUHJvcGVydHkqKTsKICAgICAK
ICAgICBTdHJpbmcgbV9jc3NTdHlsZTsKQEAgLTk5LDcgKzk5LDYgQEAgdm9pZCBTdHlsZUNoYW5n
ZTo6aW5pdChQYXNzUmVmUHRyPENTU1N0eQogICAgIGlmICghZG9jdW1lbnQgfHwgIWRvY3VtZW50
LT5mcmFtZSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBib29sIHVzZUhUTUxGb3JtYXR0aW5n
VGFncyA9ICFkb2N1bWVudC0+ZnJhbWUoKS0+ZWRpdG9yKCktPnNob3VsZFN0eWxlV2l0aENTUygp
OwogICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbj4gbXV0YWJsZVN0eWxlID0g
c3R5bGUtPm1ha2VNdXRhYmxlKCk7CiAgICAgLy8gV2Ugc2hvdWxkbid0IGhhdmUgYm90aCB0ZXh0
LWRlY29yYXRpb24gYW5kIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3QgYmVjYXVz
ZSB0aGF0IHdvdWxkbid0IG1ha2Ugc2Vuc2UuCiAgICAgQVNTRVJUKCFtdXRhYmxlU3R5bGUtPmdl
dFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbikgfHwgIW11dGFibGVT
dHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9u
c0luRWZmZWN0KSk7CkBAIC0xMTQsMzQgKzExMywzNiBAQCB2b2lkIFN0eWxlQ2hhbmdlOjppbml0
KFBhc3NSZWZQdHI8Q1NTU3R5CiAgICAgICAgIGlmIChwb3NpdGlvbi5pc05vdE51bGwoKSAmJiBj
dXJyZW50bHlIYXNTdHlsZShwb3NpdGlvbiwgcHJvcGVydHkpKQogICAgICAgICAgICAgY29udGlu
dWU7CiAgICAgICAgIAotICAgICAgICAvLyBDaGFuZ2luZyB0aGUgd2hpdGVzcGFjZSBzdHlsZSBp
biBhIHRhYiBzcGFuIHdvdWxkIGNvbGxhcHNlIHRoZSB0YWIgaW50byBhIHNwYWNlLgotICAgICAg
ICBpZiAocHJvcGVydHktPmlkKCkgPT0gQ1NTUHJvcGVydHlXaGl0ZVNwYWNlICYmIChpc1RhYlNw
YW5UZXh0Tm9kZShwb3NpdGlvbi5ub2RlKCkpIHx8IGlzVGFiU3Bhbk5vZGUoKHBvc2l0aW9uLm5v
ZGUoKSkpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAgLy8gSWYg
bmVlZGVkLCBmaWd1cmUgb3V0IGlmIHRoaXMgY2hhbmdlIGlzIGEgbGVnYWN5IEhUTUwgc3R5bGUg
Y2hhbmdlLgotICAgICAgICBpZiAodXNlSFRNTEZvcm1hdHRpbmdUYWdzICYmIGNoZWNrRm9yTGVn
YWN5SFRNTFN0eWxlQ2hhbmdlKHByb3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgIGlmIChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eURpcmVjdGlvbikgewotICAg
ICAgICAgICAgaWYgKGFkZGVkRGlyZWN0aW9uKQorICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LT5p
ZCgpKSB7CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNwYWNlOgorICAgICAgICAgICAg
Ly8gQ2hhbmdpbmcgdGhlIHdoaXRlc3BhY2Ugc3R5bGUgaW4gYSB0YWIgc3BhbiB3b3VsZCBjb2xs
YXBzZSB0aGUgdGFiIGludG8gYSBzcGFjZS4KKyAgICAgICAgICAgIGlmIChpc1RhYlNwYW5UZXh0
Tm9kZShwb3NpdGlvbi5ub2RlKCkpIHx8IGlzVGFiU3Bhbk5vZGUocG9zaXRpb24ubm9kZSgpKSkK
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGFkZGVkRGlyZWN0aW9uID0g
dHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGlzIHByb3BlcnR5Ci0gICAgICAg
IGlmIChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uIHx8IHByb3Bl
cnR5LT5pZCgpID09IENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3QpIHsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgor
ICAgICAgICAgICAgaWYgKCFhZGRlZERpcmVjdGlvbikgeworICAgICAgICAgICAgICAgIHN0eWxl
VGV4dCArPSBwcm9wZXJ0eS0+Y3NzVGV4dCgpOworICAgICAgICAgICAgICAgIGFkZGVkRGlyZWN0
aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZUJpZGk6CisgICAgICAgICAgICBpZiAoIWFkZGVkRGly
ZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9ICJkaXJlY3Rpb246ICIgKyBz
dHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0eURpcmVjdGlvbikgKyAiOyAiOworICAg
ICAgICAgICAgICAgIGFkZGVkRGlyZWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246Cisg
ICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdDoKICAg
ICAgICAgICAgIC8vIEFsd2F5cyB1c2UgdGV4dC1kZWNvcmF0aW9uIGJlY2F1c2UgLXdlYmtpdC10
ZXh0LWRlY29yYXRpb24taW4tZWZmZWN0IGlzIGludGVybmFsLgogICAgICAgICAgICAgQ1NTUHJv
cGVydHkgYWx0ZXJlZFByb3BlcnR5KENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24sIHByb3BlcnR5
LT52YWx1ZSgpLCBwcm9wZXJ0eS0+aXNJbXBvcnRhbnQoKSk7CiAgICAgICAgICAgICAvLyBXZSBk
b24ndCBhZGQgInRleHQtZGVjb3JhdGlvbjogbm9uZSIgYmVjYXVzZSBpdCBkb2Vzbid0IG92ZXJy
aWRlIHRoZSBleGlzdGluZyB0ZXh0IGRlY29yYXRpb25zOyBpLmUuIHJlZHVuZGFudAogICAgICAg
ICAgICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShhbHRlcmVkUHJvcGVydHkudmFsdWUoKS0+Y3Nz
VGV4dCgpLCAibm9uZSIpKQogICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBhbHRlcmVkUHJv
cGVydHkuY3NzVGV4dCgpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN0eWxlVGV4dCAr
PSBwcm9wZXJ0eS0+Y3NzVGV4dCgpOwotCi0gICAgICAgIGlmICghYWRkZWREaXJlY3Rpb24gJiYg
cHJvcGVydHktPmlkKCkgPT0gQ1NTUHJvcGVydHlVbmljb2RlQmlkaSkgewotICAgICAgICAgICAg
c3R5bGVUZXh0ICs9ICJkaXJlY3Rpb246ICIgKyBzdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQ
cm9wZXJ0eURpcmVjdGlvbikgKyAiOyAiOwotICAgICAgICAgICAgYWRkZWREaXJlY3Rpb24gPSB0
cnVlOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiBu
ZWVkZWQsIGNvbnZlcnQgdGhlIENTUyBwcm9wZXJ0eSB0byBIVE1MIHRhZ3MgYnkgdHVybmluZyBv
biBtX2FwcGx5KgorICAgICAgICBzdHlsZVRleHQgKz0gY3NzVGV4dElnbm9yaW5nRm9ybWF0dGlu
Z1RhZ3MocHJvcGVydHksIGRvY3VtZW50LT5mcmFtZSgpLT5lZGl0b3IoKS0+c2hvdWxkU3R5bGVX
aXRoQ1NTKCkpOwogICAgIH0KIAogICAgIC8vIFNhdmUgdGhlIHJlc3VsdCBmb3IgbGF0ZXIKQEAg
LTE0OSwzMyArMTUwLDMzIEBAIHZvaWQgU3R5bGVDaGFuZ2U6OmluaXQoUGFzc1JlZlB0cjxDU1NT
dHkKIH0KIAogLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWFwcGluZyBmcm9tIENTUyBzdHlsZXMg
dG8gc3R5bGluZyB0YWdzIChsaWtlIGZvbnQtd2VpZ2h0OiBib2xkIHRvIDxiPikKLWJvb2wgU3R5
bGVDaGFuZ2U6OmNoZWNrRm9yTGVnYWN5SFRNTFN0eWxlQ2hhbmdlKGNvbnN0IENTU1Byb3BlcnR5
KiBwcm9wZXJ0eSkKK1N0cmluZyBTdHlsZUNoYW5nZTo6Y3NzVGV4dElnbm9yaW5nRm9ybWF0dGlu
Z1RhZ3MoY29uc3QgQ1NTUHJvcGVydHkqIHByb3BlcnR5LCBib29sIHNob3VsZFN0eWxlV2l0aENT
UykKIHsKLSAgICBpZiAoIXByb3BlcnR5IHx8ICFwcm9wZXJ0eS0+dmFsdWUoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIAorICAgIGlmICghcHJvcGVydHkgfHwgIXByb3BlcnR5LT52YWx1
ZSgpIHx8IHNob3VsZFN0eWxlV2l0aENTUykKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5LT5jc3NU
ZXh0KCk7CisKICAgICBTdHJpbmcgdmFsdWVUZXh0KHByb3BlcnR5LT52YWx1ZSgpLT5jc3NUZXh0
KCkpOwogICAgIHN3aXRjaCAocHJvcGVydHktPmlkKCkpIHsKICAgICAgICAgY2FzZSBDU1NQcm9w
ZXJ0eUZvbnRXZWlnaHQ6CiAgICAgICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodmFsdWVU
ZXh0LCAiYm9sZCIpKSB7CiAgICAgICAgICAgICAgICAgbV9hcHBseUJvbGQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENTU1Byb3BlcnR5
VmVydGljYWxBbGlnbjoKICAgICAgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRl
eHQsICJzdWIiKSkgewogICAgICAgICAgICAgICAgIG1fYXBwbHlTdWJzY3JpcHQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiAiIjsK
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRl
eHQsICJzdXBlciIpKSB7CiAgICAgICAgICAgICAgICAgbV9hcHBseVN1cGVyc2NyaXB0ID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
IiI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDU1NQ
cm9wZXJ0eUZvbnRTdHlsZToKICAgICAgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1
ZVRleHQsICJpdGFsaWMiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJvYmxpcXVl
IikpIHsKICAgICAgICAgICAgICAgICBtX2FwcGx5SXRhbGljID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOiB7
CkBAIC0xODMsMTggKzE4NCwxOSBAQCBib29sIFN0eWxlQ2hhbmdlOjpjaGVja0ZvckxlZ2FjeUhU
TUxTdHlsCiAgICAgICAgICAgICBDU1NQYXJzZXI6OnBhcnNlQ29sb3IocmdiYSwgdmFsdWVUZXh0
KTsKICAgICAgICAgICAgIENvbG9yIGNvbG9yKHJnYmEpOwogICAgICAgICAgICAgbV9hcHBseUZv
bnRDb2xvciA9IGNvbG9yLm5hbWUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICAgICAgcmV0dXJuICIiOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlGb250
RmFtaWx5OgogICAgICAgICAgICAgbV9hcHBseUZvbnRGYWNlID0gdmFsdWVUZXh0OwotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIGNhc2Ug
Q1NTUHJvcGVydHlGb250U2l6ZToKICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS0+dmFsdWUoKS0+
Y3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWU6OkNTU19QUklNSVRJVkVfVkFMVUUpIHsKICAgICAg
ICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSAqdmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSAqPihwcm9wZXJ0eS0+dmFsdWUoKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAo
dmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA8IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFggfHwgdmFs
dWUtPnByaW1pdGl2ZVR5cGUoKSA+IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUEMpCisgICAgICAg
ICAgICAgICAgaWYgKHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPCBDU1NQcmltaXRpdmVWYWx1ZTo6
Q1NTX1BYIHx8IHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPiBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NT
X1BDKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNpemUga2V5d29yZCBvciByZWxhdGl2ZSB1
bml0LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZsb2F0IG51
bWJlciA9IHZhbHVlLT5nZXRGbG9hdFZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFgpOwog
ICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPD0gOSkKQEAgLTIxNCwxNCArMjE2LDE0IEBAIGJv
b2wgU3R5bGVDaGFuZ2U6OmNoZWNrRm9yTGVnYWN5SFRNTFN0eWwKICAgICAgICAgICAgICAgICAv
LyBIdWdlIHF1aXJrIGluIE1pY3Jvc2Z0IEVudG91cmFnZSBpcyB0aGF0IHRoZXkgdW5kZXJzdGFu
ZCBDU1MgZm9udC1zaXplLCBidXQgYWxzbyB3cml0ZSAKICAgICAgICAgICAgICAgICAvLyBvdXQg
bGVnYWN5IDEtNyB2YWx1ZXMgaW4gZm9udCB0YWdzIChJIGd1ZXNzIGZvciBtYWlsZXJzIHRoYXQg
YXJlIG5vdCBDU1Mtc2F2dnkgYXQgYWxsLCAKICAgICAgICAgICAgICAgICAvLyBsaWtlIEV1ZG9y
YSkuIFllcywgdGhleSB3cml0ZSBvdXQgKmJvdGgqLiBXZSBuZWVkIHRvIHdyaXRlIG91dCBib3Ro
IGFzIHdlbGwuIFJldHVybiBmYWxzZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IAor
ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7
CiAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbWFrZSBzZW5zZSBvZiB0aGUgbnVtYmVyLiBQdXQg
bm8gZm9udCBzaXplLgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
ICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwor
ICAgIHJldHVybiBwcm9wZXJ0eS0+Y3NzVGV4dCgpOwogfQogCiBib29sIFN0eWxlQ2hhbmdlOjpj
dXJyZW50bHlIYXNTdHlsZShjb25zdCBQb3NpdGlvbiAmcG9zLCBjb25zdCBDU1NQcm9wZXJ0eSAq
cHJvcGVydHkpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34712</attachid>
            <date>2009-08-12 18:50:42 -0700</date>
            <delta_ts>2009-08-13 14:48:37 -0700</delta_ts>
            <desc>fixes the bug, a minor rebaseline is required</desc>
            <filename>fix27749d</filename>
            <type>text/plain</type>
            <size>18154</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NzE3NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMDktMDgtMTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3R5
bGVDaGFuZ2U6OmluaXQgbmVlZHMgY2xlYW4gdXAgYmVmb3JlIGZpeGluZyB0aGUgYnVnIDIzODky
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzc0OQor
CisgICAgICAgIFRoaXMgcGF0Y2ggc2ltcGxpZmllcyBTdHlsZUNoYW5nZTo6aW5pdCBieSByZW1v
dmluZyB0aGUgaXRlcmF0aW9uIG9uIENTUyBwcm9wZXJ0aWVzLAorICAgICAgICBhbmQgYWRkaW5n
IGZ1bmN0aW9ucyBjbGVhbnVwVGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzIGFuZCBleHRyYWN0VGV4
dFN0eWxlIHRvIGhhbmRsZSB0aGUgc3R5bGUuCisKKyAgICAgICAgV2hpbGUgdGhpcyBwYXRjaCBk
b2VzIG5vdCBjaGFuZ2UgdGhlIG1vc3Qgb2YgYmVoYXZpb3JzLCBpdCBtb2RpZmllcyBnZXRQcm9w
ZXJ0aWVzTm90SW5Db21wdXRlZFN0eWxlCisgICAgICAgIHN1Y2ggdGhhdCB3ZSBkbyBub3QgYWRk
IGV4dHJhIHRleHQgZGVjb3JhdGlvbnMgdGhhdCBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBj
b21wdXRlZCBzdHlsZS4KKworICAgICAgICBObyB0ZXN0IGlzIGFkZGVkIGJlY2F1c2UgdGhlIG9u
bHkgYmVoYXZpb3JhbCBjaGFuZ2UgaXMgbm90IHRvIGFkZCByZWR1bmRhbnQgdGV4dCBkZWNvcmF0
aW9ucworICAgICAgICBhbmQgdGhpcyBiZWhhdmlvciBpcyBhbHJlYWR5IHRlc3RlZCBieSB0b2dn
bGUtc3R5bGUtMi5odG1sCisKKyAgICAgICAgKiBjc3MvQ1NTVmFsdWVMaXN0LmNwcDogQWRkZWQg
Y29weQorICAgICAgICAoV2ViQ29yZTo6Q1NTVmFsdWVMaXN0Ojpjb3B5KTogbWFrZSBhIGNvcHkg
b2YgQ1NTVmFsdWVMaXN0CisgICAgICAgICogY3NzL0NTU1ZhbHVlTGlzdC5oOiBBZGRlZCBjb3B5
CisgICAgICAgICogZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpTdHlsZUNoYW5nZTo6aW5pdCk6IFVzZXMgZ2V0UHJvcGVydGllc05vdEluQ29tcHV0ZWRT
dHlsZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzCisgICAgICAg
IChXZWJDb3JlOjpTdHlsZUNoYW5nZTo6Y2xlYW51cFRleHREZWNvcmF0aW9uUHJvcGVydGllcyk6
IFJlbW92ZXMgLXdlYmtpdC10ZXh0LWRlY29yYXRpb25zLWluLWVmZmVjdHMgYW5kIHJlZHVuZGFu
dCAibm9uZSIKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlQ2hhbmdlOjpleHRyYWN0VGV4dFN0eWxl
KTogQ29udmVydHMgcHJvcGVydGllcyBpbiBzdHlsZSB0byBtX2FwcGx5KiBhbmQgcmVtb3ZlcyB0
aGUgcHJvcGVydHkKKyAgICAgICAgKFdlYkNvcmU6OmdldFByb3BlcnRpZXNOb3RJbkNvbXB1dGVk
U3R5bGUpOiBGaXhlZCBhIGJ1ZyB3aXRoIGhvdyB0ZXh0IGRlY29yYXRpb25zIGFyZSB0cmVhdGVk
CisKIDIwMDktMDgtMTIgIEdlb3JnZSBXcmlnaHQgIDxnZW9yZ2Uud3JpZ2h0QHRvcmNobW9iaWxl
LmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZpZCBIeWF0dC4KSW5kZXg6IFdlYkNvcmUv
Y3NzL0NTU1ZhbHVlTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9jc3MvQ1NTVmFsdWVM
aXN0LmNwcAkocmV2aXNpb24gNDcwMDkpCisrKyBXZWJDb3JlL2Nzcy9DU1NWYWx1ZUxpc3QuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC05Niw2ICs5NiwxNCBAQCBib29sIENTU1ZhbHVlTGlzdDo6aGFz
VmFsdWUoQ1NTVmFsdWUqIHZhCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitQYXNzUmVmUHRyPENT
U1ZhbHVlTGlzdD4gQ1NTVmFsdWVMaXN0Ojpjb3B5KCkKK3sKKyAgICBQYXNzUmVmUHRyPENTU1Zh
bHVlTGlzdD4gbmV3TGlzdCA9IG1faXNTcGFjZVNlcGFyYXRlZCA/IGNyZWF0ZVNwYWNlU2VwYXJh
dGVkKCkgOiBjcmVhdGVDb21tYVNlcGFyYXRlZCgpOworICAgIGZvciAoc2l6ZV90IGluZGV4ID0g
MDsgaW5kZXggPCBtX3ZhbHVlcy5zaXplKCk7IGluZGV4KyspCisgICAgICAgIG5ld0xpc3QtPmFw
cGVuZChpdGVtKGluZGV4KSk7CisgICAgcmV0dXJuIG5ld0xpc3Q7Cit9CisKIFN0cmluZyBDU1NW
YWx1ZUxpc3Q6OmNzc1RleHQoKSBjb25zdAogewogICAgIFN0cmluZyByZXN1bHQgPSAiIjsKSW5k
ZXg6IFdlYkNvcmUvY3NzL0NTU1ZhbHVlTGlzdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvY3Nz
L0NTU1ZhbHVlTGlzdC5oCShyZXZpc2lvbiA0NzAwOSkKKysrIFdlYkNvcmUvY3NzL0NTU1ZhbHVl
TGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC01NCw2ICs1NCw3IEBAIHB1YmxpYzoKICAgICB2b2lk
IHByZXBlbmQoUGFzc1JlZlB0cjxDU1NWYWx1ZT4pOwogICAgIGJvb2wgcmVtb3ZlQWxsKENTU1Zh
bHVlKik7CiAgICAgYm9vbCBoYXNWYWx1ZShDU1NWYWx1ZSopOworICAgIFBhc3NSZWZQdHI8Q1NT
VmFsdWVMaXN0PiBjb3B5KCk7CiAKICAgICB2aXJ0dWFsIFN0cmluZyBjc3NUZXh0KCkgY29uc3Q7
CiAKSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAkocmV2aXNpb24gNDcw
MDkpCisrKyBXZWJDb3JlL2VkaXRpbmcvQXBwbHlTdHlsZUNvbW1hbmQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC03MCw5ICs3MCw5IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICB2b2lkIGluaXQo
UGFzc1JlZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiwgY29uc3QgUG9zaXRpb24mKTsKLSAgICBi
b29sIGNoZWNrRm9yTGVnYWN5SFRNTFN0eWxlQ2hhbmdlKGNvbnN0IENTU1Byb3BlcnR5Kik7Ci0g
ICAgc3RhdGljIGJvb2wgY3VycmVudGx5SGFzU3R5bGUoY29uc3QgUG9zaXRpb24mLCBjb25zdCBD
U1NQcm9wZXJ0eSopOwotICAgIAorICAgIHZvaWQgY2xlYW51cFRleHREZWNvcmF0aW9uUHJvcGVy
dGllcyhDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUpOworICAgIHZvaWQgZXh0cmFj
dFRleHRTdHlsZShDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUpOworCiAgICAgU3Ry
aW5nIG1fY3NzU3R5bGU7CiAgICAgYm9vbCBtX2FwcGx5Qm9sZDsKICAgICBib29sIG1fYXBwbHlJ
dGFsaWM7CkBAIC0xMDAsMTAyICsxMDAsODYgQEAgdm9pZCBTdHlsZUNoYW5nZTo6aW5pdChQYXNz
UmVmUHRyPENTU1N0eQogICAgICAgICByZXR1cm47CiAKICAgICBib29sIHVzZUhUTUxGb3JtYXR0
aW5nVGFncyA9ICFkb2N1bWVudC0+ZnJhbWUoKS0+ZWRpdG9yKCktPnNob3VsZFN0eWxlV2l0aENT
UygpOwotICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbj4gbXV0YWJsZVN0eWxl
ID0gc3R5bGUtPm1ha2VNdXRhYmxlKCk7Ci0gICAgLy8gV2Ugc2hvdWxkbid0IGhhdmUgYm90aCB0
ZXh0LWRlY29yYXRpb24gYW5kIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3QgYmVj
YXVzZSB0aGF0IHdvdWxkbid0IG1ha2Ugc2Vuc2UuCi0gICAgQVNTRVJUKCFtdXRhYmxlU3R5bGUt
PmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbikgfHwgIW11dGFi
bGVTdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0
aW9uc0luRWZmZWN0KSk7Ci0gICAgU3RyaW5nIHN0eWxlVGV4dCgiIik7Ci0gICAgYm9vbCBhZGRl
ZERpcmVjdGlvbiA9IGZhbHNlOwotICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uOjpjb25z
dF9pdGVyYXRvciBlbmQgPSBtdXRhYmxlU3R5bGUtPmVuZCgpOwotICAgIGZvciAoQ1NTTXV0YWJs
ZVN0eWxlRGVjbGFyYXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbXV0YWJsZVN0eWxlLT5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgQ1NTUHJvcGVydHkgKnByb3Bl
cnR5ID0gJippdDsKLQotICAgICAgICAvLyBJZiBwb3NpdGlvbiBpcyBlbXB0eSBvciB0aGUgcG9z
aXRpb24gcGFzc2VkIGluIGFscmVhZHkgaGFzIHRoZSAKLSAgICAgICAgLy8gc3R5bGUsIGp1c3Qg
bW92ZSBvbi4KLSAgICAgICAgaWYgKHBvc2l0aW9uLmlzTm90TnVsbCgpICYmIGN1cnJlbnRseUhh
c1N0eWxlKHBvc2l0aW9uLCBwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgCi0gICAgICAgIC8vIENoYW5naW5nIHRoZSB3aGl0ZXNwYWNlIHN0eWxlIGluIGEgdGFiIHNw
YW4gd291bGQgY29sbGFwc2UgdGhlIHRhYiBpbnRvIGEgc3BhY2UuCi0gICAgICAgIGlmIChwcm9w
ZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2UgJiYgKGlzVGFiU3BhblRleHROb2Rl
KHBvc2l0aW9uLm5vZGUoKSkgfHwgaXNUYWJTcGFuTm9kZSgocG9zaXRpb24ubm9kZSgpKSkpKQot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBuZWVkZWQsIGZp
Z3VyZSBvdXQgaWYgdGhpcyBjaGFuZ2UgaXMgYSBsZWdhY3kgSFRNTCBzdHlsZSBjaGFuZ2UuCi0g
ICAgICAgIGlmICh1c2VIVE1MRm9ybWF0dGluZ1RhZ3MgJiYgY2hlY2tGb3JMZWdhY3lIVE1MU3R5
bGVDaGFuZ2UocHJvcGVydHkpKQotICAgICAgICAgICAgY29udGludWU7CisgICAgUmVmUHRyPENT
U0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4gY29tcHV0ZWRTdHlsZSA9IHBvc2l0aW9uLmNvbXB1
dGVkU3R5bGUoKTsKKyAgICBSZWZQdHI8Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24+IG11dGFi
bGVTdHlsZSA9IGdldFByb3BlcnRpZXNOb3RJbkNvbXB1dGVkU3R5bGUoc3R5bGUuZ2V0KCksIGNv
bXB1dGVkU3R5bGUuZ2V0KCkpOwogCi0gICAgICAgIGlmIChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQ
cm9wZXJ0eURpcmVjdGlvbikgewotICAgICAgICAgICAgaWYgKGFkZGVkRGlyZWN0aW9uKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYWRkZWREaXJlY3Rpb24gPSB0cnVl
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoaXMgcHJvcGVydHkKLSAgICAgICAgaWYg
KHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24gfHwgcHJvcGVydHkt
PmlkKCkgPT0gQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCkgewotICAg
ICAgICAgICAgLy8gQWx3YXlzIHVzZSB0ZXh0LWRlY29yYXRpb24gYmVjYXVzZSAtd2Via2l0LXRl
eHQtZGVjb3JhdGlvbi1pbi1lZmZlY3QgaXMgaW50ZXJuYWwuCi0gICAgICAgICAgICBDU1NQcm9w
ZXJ0eSBhbHRlcmVkUHJvcGVydHkoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbiwgcHJvcGVydHkt
PnZhbHVlKCksIHByb3BlcnR5LT5pc0ltcG9ydGFudCgpKTsKLSAgICAgICAgICAgIC8vIFdlIGRv
bid0IGFkZCAidGV4dC1kZWNvcmF0aW9uOiBub25lIiBiZWNhdXNlIGl0IGRvZXNuJ3Qgb3ZlcnJp
ZGUgdGhlIGV4aXN0aW5nIHRleHQgZGVjb3JhdGlvbnM7IGkuZS4gcmVkdW5kYW50Ci0gICAgICAg
ICAgICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKGFsdGVyZWRQcm9wZXJ0eS52YWx1ZSgpLT5jc3NU
ZXh0KCksICJub25lIikpCi0gICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IGFsdGVyZWRQcm9w
ZXJ0eS5jc3NUZXh0KCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3R5bGVUZXh0ICs9
IHByb3BlcnR5LT5jc3NUZXh0KCk7Ci0KLSAgICAgICAgaWYgKCFhZGRlZERpcmVjdGlvbiAmJiBw
cm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpKSB7Ci0gICAgICAgICAgICBz
dHlsZVRleHQgKz0gImRpcmVjdGlvbjogIiArIHN0eWxlLT5nZXRQcm9wZXJ0eVZhbHVlKENTU1By
b3BlcnR5RGlyZWN0aW9uKSArICI7ICI7Ci0gICAgICAgICAgICBhZGRlZERpcmVjdGlvbiA9IHRy
dWU7Ci0gICAgICAgIH0KLSAgICB9CisgICAgY2xlYW51cFRleHREZWNvcmF0aW9uUHJvcGVydGll
cyhtdXRhYmxlU3R5bGUuZ2V0KCkpOworICAgIGlmICh1c2VIVE1MRm9ybWF0dGluZ1RhZ3MpCisg
ICAgICAgIGV4dHJhY3RUZXh0U3R5bGUobXV0YWJsZVN0eWxlLmdldCgpKTsKKworICAgIC8vIENo
YW5naW5nIHRoZSB3aGl0ZXNwYWNlIHN0eWxlIGluIGEgdGFiIHNwYW4gd291bGQgY29sbGFwc2Ug
dGhlIHRhYiBpbnRvIGEgc3BhY2UuCisgICAgaWYgKGlzVGFiU3BhblRleHROb2RlKHBvc2l0aW9u
Lm5vZGUoKSkgfHwgaXNUYWJTcGFuTm9kZSgocG9zaXRpb24ubm9kZSgpKSkpCisgICAgICAgIG11
dGFibGVTdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlXaGl0ZVNwYWNlKTsKKworICAg
IC8vIElmIHVuaWNvZGUtYmlkaSBpcyBwcmVzZW50IGluIG11dGFibGVTdHlsZSBhbmQgZGlyZWN0
aW9uIGlzIG5vdCwgdGhlbiBhZGQgZGlyZWN0aW9uIHRvIG11dGFibGVTdHlsZS4KKyAgICAvLyBG
SVhNRTogU2hvdWxkbid0IHRoaXMgYmUgZG9uZSBpbiBnZXRQcm9wZXJ0aWVzTm90SW5Db21wdXRl
ZFN0eWxlPworICAgIGlmIChtdXRhYmxlU3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJv
cGVydHlVbmljb2RlQmlkaSkgJiYgIXN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1Byb3Bl
cnR5RGlyZWN0aW9uKSkKKyAgICAgICAgbXV0YWJsZVN0eWxlLT5zZXRQcm9wZXJ0eShDU1NQcm9w
ZXJ0eURpcmVjdGlvbiwgc3R5bGUtPmdldFByb3BlcnR5VmFsdWUoQ1NTUHJvcGVydHlEaXJlY3Rp
b24pKTsKIAogICAgIC8vIFNhdmUgdGhlIHJlc3VsdCBmb3IgbGF0ZXIKLSAgICBtX2Nzc1N0eWxl
ID0gc3R5bGVUZXh0LnN0cmlwV2hpdGVTcGFjZSgpOworICAgIG1fY3NzU3R5bGUgPSBtdXRhYmxl
U3R5bGUtPmNzc1RleHQoKS5zdHJpcFdoaXRlU3BhY2UoKTsKIH0KIAotLy8gVGhpcyBmdW5jdGlv
biBpcyB0aGUgbWFwcGluZyBmcm9tIENTUyBzdHlsZXMgdG8gc3R5bGluZyB0YWdzIChsaWtlIGZv
bnQtd2VpZ2h0OiBib2xkIHRvIDxiPikKLWJvb2wgU3R5bGVDaGFuZ2U6OmNoZWNrRm9yTGVnYWN5
SFRNTFN0eWxlQ2hhbmdlKGNvbnN0IENTU1Byb3BlcnR5KiBwcm9wZXJ0eSkKK3ZvaWQgU3R5bGVD
aGFuZ2U6OmNsZWFudXBUZXh0RGVjb3JhdGlvblByb3BlcnRpZXMoQ1NTTXV0YWJsZVN0eWxlRGVj
bGFyYXRpb24qIHN0eWxlKQoreyAgICAKKyAgICBSZWZQdHI8Q1NTVmFsdWU+IHRleHREZWNvcmF0
aW9uc0luRWZmZWN0ID0gc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlXZWJr
aXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCk7CisgICAgUmVmUHRyPENTU1ZhbHVlPiB0ZXh0RGVj
b3JhdGlvbiA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1Byb3BlcnR5VGV4dERlY29y
YXRpb24pOworICAgIC8vIFdlIHNob3VsZG4ndCBoYXZlIGJvdGggdGV4dC1kZWNvcmF0aW9uIGFu
ZCAtd2Via2l0LXRleHQtZGVjb3JhdGlvbnMtaW4tZWZmZWN0IGJlY2F1c2UgdGhhdCB3b3VsZG4n
dCBtYWtlIHNlbnNlLgorICAgIEFTU0VSVCghdGV4dERlY29yYXRpb25zSW5FZmZlY3QgfHwgIXRl
eHREZWNvcmF0aW9uKTsKKyAgICBpZiAodGV4dERlY29yYXRpb25zSW5FZmZlY3QpIHsKKyAgICAg
ICAgc3R5bGUtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24sIHRleHREZWNv
cmF0aW9uc0luRWZmZWN0LT5jc3NUZXh0KCkpOworICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVy
dHkoQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCk7CisgICAgfQorICAg
IAorICAgIHRleHREZWNvcmF0aW9uID0gc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJv
cGVydHlUZXh0RGVjb3JhdGlvbik7CisgICAgaWYgKHRleHREZWNvcmF0aW9uICYmICF0ZXh0RGVj
b3JhdGlvbi0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgc3R5bGUtPnJlbW92ZVByb3BlcnR5KENT
U1Byb3BlcnR5VGV4dERlY29yYXRpb24pOworfQorCit2b2lkIFN0eWxlQ2hhbmdlOjpleHRyYWN0
VGV4dFN0eWxlKENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkKIHsKLSAgICBpZiAo
IXByb3BlcnR5IHx8ICFwcm9wZXJ0eS0+dmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIEFTU0VSVChzdHlsZSk7CisKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uoc3R5bGUtPmdl
dFByb3BlcnR5VmFsdWUoQ1NTUHJvcGVydHlGb250V2VpZ2h0KSwgImJvbGQiKSkgeworICAgICAg
ICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlGb250V2VpZ2h0KTsKKyAgICAgICAg
bV9hcHBseUJvbGQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShz
dHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0eUZvbnRTdHlsZSksICJpdGFsaWMiKQor
ICAgICAgICB8fCBlcXVhbElnbm9yaW5nQ2FzZShzdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQ
cm9wZXJ0eUZvbnRTdHlsZSksICJvYmxpcXVlIikpIHsKKyAgICAgICAgc3R5bGUtPnJlbW92ZVBy
b3BlcnR5KENTU1Byb3BlcnR5Rm9udFN0eWxlKTsKKyAgICAgICAgbV9hcHBseUl0YWxpYyA9IHRy
dWU7CisgICAgfQorCisgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHN0eWxlLT5nZXRQcm9wZXJ0
eVZhbHVlKENTU1Byb3BlcnR5VmVydGljYWxBbGlnbiksICJzdWIiKSkgeworICAgICAgICBzdHls
ZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduKTsKKyAgICAgICAgbV9h
cHBseVN1YnNjcmlwdCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShz
dHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0eVZlcnRpY2FsQWxpZ24pLCAic3VwZXIi
KSkgeworICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlWZXJ0aWNhbEFs
aWduKTsKKyAgICAgICAgbV9hcHBseVN1cGVyc2NyaXB0ID0gdHJ1ZTsKKyAgICB9CiAgICAgCi0g
ICAgU3RyaW5nIHZhbHVlVGV4dChwcm9wZXJ0eS0+dmFsdWUoKS0+Y3NzVGV4dCgpKTsKLSAgICBz
d2l0Y2ggKHByb3BlcnR5LT5pZCgpKSB7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2Vp
Z2h0OgotICAgICAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgImJvbGQi
KSkgewotICAgICAgICAgICAgICAgIG1fYXBwbHlCb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIENTU1Byb3BlcnR5VmVydGljYWxBbGlnbjoKLSAgICAgICAgICAgIGlmIChlcXVhbEln
bm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJzdWIiKSkgewotICAgICAgICAgICAgICAgIG1fYXBwbHlT
dWJzY3JpcHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgInN1cGVy
IikpIHsKLSAgICAgICAgICAgICAgICBtX2FwcGx5U3VwZXJzY3JpcHQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6Ci0gICAgICAgICAgICBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UodmFsdWVUZXh0LCAiaXRhbGljIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2Uo
dmFsdWVUZXh0LCAib2JsaXF1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgbV9hcHBseUl0YWxpYyA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOiB7Ci0gICAgICAg
ICAgICBSR0JBMzIgcmdiYSA9IDA7Ci0gICAgICAgICAgICBDU1NQYXJzZXI6OnBhcnNlQ29sb3Io
cmdiYSwgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgIENvbG9yIGNvbG9yKHJnYmEpOwotICAgICAg
ICAgICAgbV9hcHBseUZvbnRDb2xvciA9IGNvbG9yLm5hbWUoKTsKLSAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlGb250RmFtaWx5Ogot
ICAgICAgICAgICAgbV9hcHBseUZvbnRGYWNlID0gdmFsdWVUZXh0OwotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToKLSAgICAgICAgICAg
IGlmIChwcm9wZXJ0eS0+dmFsdWUoKS0+Y3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWU6OkNTU19Q
UklNSVRJVkVfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSAqdmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSAqPihwcm9wZXJ0eS0+dmFsdWUoKSk7
Ci0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA8IENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfUFggfHwgdmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA+IENTU1ByaW1pdGl2
ZVZhbHVlOjpDU1NfUEMpCi0gICAgICAgICAgICAgICAgICAgIC8vIFNpemUga2V5d29yZCBvciBy
ZWxhdGl2ZSB1bml0LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYg
KFJlZlB0cjxDU1NWYWx1ZT4gY29sb3JWYWx1ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVl
KENTU1Byb3BlcnR5Q29sb3IpKSB7CisgICAgICAgIFJHQkEzMiByZ2JhID0gMDsKKyAgICAgICAg
Q1NTUGFyc2VyOjpwYXJzZUNvbG9yKHJnYmEsIGNvbG9yVmFsdWUtPmNzc1RleHQoKSk7CisgICAg
ICAgIENvbG9yIGNvbG9yKHJnYmEpOworICAgICAgICBtX2FwcGx5Rm9udENvbG9yID0gY29sb3Iu
bmFtZSgpOworICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlDb2xvcik7
CisgICAgfQorCisgICAgbV9hcHBseUZvbnRGYWNlID0gc3R5bGUtPmdldFByb3BlcnR5VmFsdWUo
Q1NTUHJvcGVydHlGb250RmFtaWx5KTsKKyAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJv
cGVydHlGb250RmFtaWx5KTsKKworICAgIFJlZlB0cjxDU1NWYWx1ZT4gZm9udFNpemUgPSBzdHls
ZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eUZvbnRTaXplKTsKKyAgICBpZiAoZm9u
dFNpemUpIHsKKyAgICAgICAgaWYgKCFmb250U2l6ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAg
ICAgICAgICAgc3R5bGUtPnJlbW92ZVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFNpemUpOyAvLyBD
YW4ndCBtYWtlIHNlbnNlIG9mIHRoZSBudW1iZXIuIFB1dCBubyBmb250IHNpemUuCisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihmb250U2l6ZS5nZXQoKSk7CiAKKyAgICAgICAgICAgIGlm
ICh2YWx1ZS0+cHJpbWl0aXZlVHlwZSgpIDwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19QWCB8fCB2
YWx1ZS0+cHJpbWl0aXZlVHlwZSgpID4gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19QQykKKyAgICAg
ICAgICAgICAgICA7Ly8gU2l6ZSBrZXl3b3JkIG9yIHJlbGF0aXZlIHVuaXQuCisgICAgICAgICAg
ICBlbHNlIHsKICAgICAgICAgICAgICAgICBmbG9hdCBudW1iZXIgPSB2YWx1ZS0+Z2V0RmxvYXRW
YWx1ZShDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKTsKICAgICAgICAgICAgICAgICBpZiAobnVt
YmVyIDw9IDkpCiAgICAgICAgICAgICAgICAgICAgIG1fYXBwbHlGb250U2l6ZSA9ICIxIjsKQEAg
LTIxMSwzNCArMTk1LDEzIEBAIGJvb2wgU3R5bGVDaGFuZ2U6OmNoZWNrRm9yTGVnYWN5SFRNTFN0
eWwKICAgICAgICAgICAgICAgICAgICAgbV9hcHBseUZvbnRTaXplID0gIjYiOwogICAgICAgICAg
ICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgbV9hcHBseUZvbnRTaXplID0gIjciOwot
ICAgICAgICAgICAgICAgIC8vIEh1Z2UgcXVpcmsgaW4gTWljcm9zZnQgRW50b3VyYWdlIGlzIHRo
YXQgdGhleSB1bmRlcnN0YW5kIENTUyBmb250LXNpemUsIGJ1dCBhbHNvIHdyaXRlIAotICAgICAg
ICAgICAgICAgIC8vIG91dCBsZWdhY3kgMS03IHZhbHVlcyBpbiBmb250IHRhZ3MgKEkgZ3Vlc3Mg
Zm9yIG1haWxlcnMgdGhhdCBhcmUgbm90IENTUy1zYXZ2eSBhdCBhbGwsIAotICAgICAgICAgICAg
ICAgIC8vIGxpa2UgRXVkb3JhKS4gWWVzLCB0aGV5IHdyaXRlIG91dCAqYm90aCouIFdlIG5lZWQg
dG8gd3JpdGUgb3V0IGJvdGggYXMgd2VsbC4gUmV0dXJuIGZhbHNlLgotICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAvLyBDYW4ndCBtYWtlIHNlbnNlIG9mIHRoZSBudW1iZXIuIFB1dCBubyBmb250
IHNpemUuCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAvLyBIdWdlIHF1aXJrIGluIE1pY3Jvc2Z0IEVudG91cmFnZSBpcyB0aGF0IHRoZXkg
dW5kZXJzdGFuZCBDU1MgZm9udC1zaXplLCBidXQgYWxzbyB3cml0ZSAKKyAgICAgICAgICAgIC8v
IG91dCBsZWdhY3kgMS03IHZhbHVlcyBpbiBmb250IHRhZ3MgKEkgZ3Vlc3MgZm9yIG1haWxlcnMg
dGhhdCBhcmUgbm90IENTUy1zYXZ2eSBhdCBhbGwsIAorICAgICAgICAgICAgLy8gbGlrZSBFdWRv
cmEpLiBZZXMsIHRoZXkgd3JpdGUgb3V0ICpib3RoKi4gV2UgbmVlZCB0byB3cml0ZSBvdXQgYm90
aCBhcyB3ZWxsLgorICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KIAotYm9v
bCBTdHlsZUNoYW5nZTo6Y3VycmVudGx5SGFzU3R5bGUoY29uc3QgUG9zaXRpb24gJnBvcywgY29u
c3QgQ1NTUHJvcGVydHkgKnByb3BlcnR5KQotewotICAgIEFTU0VSVChwb3MuaXNOb3ROdWxsKCkp
OwotICAgIFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24+IHN0eWxlID0gcG9zLmNv
bXB1dGVkU3R5bGUoKTsKLSAgICBSZWZQdHI8Q1NTVmFsdWU+IHZhbHVlOwotICAgIGlmIChwcm9w
ZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eUZvbnRTaXplKQotICAgICAgICB2YWx1ZSA9IHN0eWxl
LT5nZXRGb250U2l6ZUNTU1ZhbHVlUHJlZmVycmluZ0tleXdvcmQoKTsKLSAgICAvLyBXZSBuZWVk
IHRvIHVzZSAtd2Via2l0LXRleHQtZGVjb3JhdGlvbnMtaW4tZWZmZWN0IHRvIHRha2UgY2FyZSBv
ZiB0ZXh0IGRlY29yYXRpb25zIHNldCBieSB1LCBzLCBhbmQgc3RyaWtlCi0gICAgZWxzZSBpZiAo
cHJvcGVydHktPmlkKCkgPT0gQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbikKLSAgICAgICAgdmFs
dWUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNv
cmF0aW9uc0luRWZmZWN0KTsKLSAgICBlbHNlCi0gICAgICAgIHZhbHVlID0gc3R5bGUtPmdldFBy
b3BlcnR5Q1NTVmFsdWUocHJvcGVydHktPmlkKCkpOwotICAgIGlmICghdmFsdWUpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gZXF1YWxJZ25vcmluZ0Nhc2UodmFsdWUtPmNzc1Rl
eHQoKSwgcHJvcGVydHktPnZhbHVlKCktPmNzc1RleHQoKSk7CiB9CiAKIHN0YXRpYyBTdHJpbmcm
IHN0eWxlU3BhbkNsYXNzU3RyaW5nKCkKQEAgLTMxOCwxOCArMjgxLDE1IEBAIFJlZlB0cjxDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbj4gZ2V0UHIKICAgICAvLyBUYWtlIGNhcmUgb2YgYm90aCB0
ZXh0LWRlY29yYXRpb24gYW5kIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3QKICAg
ICBzdGF0aWMgY29uc3QgaW50IHRleHREZWNvcmF0aW9uUHJvcGVydGllc1tdPXtDU1NQcm9wZXJ0
eVRleHREZWNvcmF0aW9uLCBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0
fTsKICAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHNpemVvZih0ZXh0RGVjb3JhdGlvblByb3Bl
cnRpZXMpL3NpemVvZih0ZXh0RGVjb3JhdGlvblByb3BlcnRpZXNbMV0pOyBuKyspIHsKLSAgICAg
ICAgUmVmUHRyPENTU1ZhbHVlPiBzdHlsZVZhbHVlID0gc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFs
dWUodGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzW25dKTsKLSAgICAgICAgaWYgKCFzdHlsZVZhbHVl
IHx8ICFzdHlsZVZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICBSZWZQdHI8Q1NTVmFsdWU+
IHJlc3VsdFZhbHVlID0gcmVzdWx0LT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHRleHREZWNvcmF0aW9u
UHJvcGVydGllc1tuXSk7CisgICAgICAgIGlmICghcmVzdWx0VmFsdWUgfHwgIXJlc3VsdFZhbHVl
LT5pc1ZhbHVlTGlzdCgpKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgQ1NTVmFs
dWVMaXN0KiBkZXNpcmVkVmFsdWVMaXN0ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4oc3R5
bGVWYWx1ZS5nZXQoKSk7CisgICAgICAgIFJlZlB0cjxDU1NWYWx1ZUxpc3Q+IHJlc3VsdFZhbHVl
TGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHJlc3VsdFZhbHVlLmdldCgpKS0+Y29w
eSgpOwogICAgICAgICBDU1NWYWx1ZUxpc3QqIGNvbXB1dGVkVmFsdWVMaXN0ID0gc3RhdGljX2Nh
c3Q8Q1NTVmFsdWVMaXN0Kj4oY29tcHV0ZWRWYWx1ZS5nZXQoKSk7Ci0gICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgZGVzaXJlZFZhbHVlTGlzdC0+bGVuZ3RoKCk7IGkrKykgewotICAgICAg
ICAgICAgaWYgKCFjb21wdXRlZFZhbHVlTGlzdC0+aGFzVmFsdWUoZGVzaXJlZFZhbHVlTGlzdC0+
aXRlbShpKSkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnJlbW92ZVByb3BlcnR5KHRleHRE
ZWNvcmF0aW9uUHJvcGVydGllc1tuXSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wdXRl
ZFZhbHVlTGlzdC0+bGVuZ3RoKCk7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdFZhbHVlTGlzdC0+
cmVtb3ZlQWxsKGNvbXB1dGVkVmFsdWVMaXN0LT5pdGVtKGkpKTsKKyAgICAgICAgcmVzdWx0LT5z
ZXRQcm9wZXJ0eSh0ZXh0RGVjb3JhdGlvblByb3BlcnRpZXNbbl0sIHJlc3VsdFZhbHVlTGlzdC0+
Y3NzVGV4dCgpKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpJbmRleDogTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNp
b24gNDcxNzQpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxNiBAQAorMjAwOS0wOC0xMiAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTdHlsZUNo
YW5nZTo6aW5pdCBuZWVkcyBjbGVhbiB1cCBiZWZvcmUgZml4aW5nIHRoZSBidWcgMjM4OTIKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3NzQ5CisKKyAg
ICAgICAgVGhpcyBjbGVhbi11cCBwYXRjaCBmaXhlZCBhIGJ1ZyBpbiBnZXRQcm9wZXJ0aWVzTm90
SW5Db21wdXRlZFN0eWxlLCBhbmQgY29uc2VxdWVudGx5LAorICAgICAgICBXZWJLaXQgbm8gbG9u
Z2VyIGFkZHMgcmVkdW5kYW50IHRleHQgZGVjb3JhdGlvbnMgYWxyZWFkeSBwcmVzZW50IGluIHRo
ZSBjb21wdXRlZCBzdHlsZS4KKyAgICAgICAgVGhpcyBhZmZlY3RzIHRoZSBleHBlY3RlZCByZXN1
bHQgb2YgdG9nZ2xlLXN0eWxlLTIuaHRtbAorCisgICAgICAgICogZWRpdGluZy9leGVjQ29tbWFu
ZC90b2dnbGUtc3R5bGUtMi1leHBlY3RlZC50eHQ6IFJlYmFzZWxpbmVkLgorCiAyMDA5LTA4LTEy
ICBBbHBoYSBMYW0gPCBoY2xhbUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgTm90IHJldmlld2Vk
LCBXaW5kb3dzIHRlc3QgZml4IGFmdGVyIGh0dHA6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0
LzQ3MTcxLgpJbmRleDogTGF5b3V0VGVzdHMvZWRpdGluZy9leGVjQ29tbWFuZC90b2dnbGUtc3R5
bGUtMi1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9leGVj
Q29tbWFuZC90b2dnbGUtc3R5bGUtMi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDQ3MDA5KQorKysg
TGF5b3V0VGVzdHMvZWRpdGluZy9leGVjQ29tbWFuZC90b2dnbGUtc3R5bGUtMi1leHBlY3RlZC50
eHQJKHdvcmtpbmcgY29weSkKQEAgLTksOCArOSw4IEBAIFBBU1MgdHdvIHVuZGVybGluZSBjb21t
YW5kcyBjb252ZXJ0ZWQgdGUKIEZBSUwgb25lIHN0cmlrZXRocm91Z2ggY29tbWFuZCBjb252ZXJ0
ZWQgdGVzdCB0byA8c3BhbiBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgc3R5bGU9InRleHQtZGVj
b3JhdGlvbjogbGluZS10aHJvdWdoOyI+dGVzdDwvc3Bhbj4sIGV4cGVjdGVkIDxzPnRlc3Q8L3M+
CiBQQVNTIG9uZSBzdHJpa2V0aHJvdWdoIGNvbW1hbmQgY29udmVydGVkIDx1PjxiPjxzPnRlc3Q8
L3M+PC9iPjwvdT4gdG8gPHU+PGI+dGVzdDwvYj48L3U+CiBQQVNTIHR3byBzdHJpa2V0aHJvdWdo
IGNvbW1hbmRzIGNvbnZlcnRlZCB0ZXN0IHRvIHRlc3QKLUZBSUwgb25lIHN0cmlrZXRocm91Z2gg
Y29tbWFuZCBjb252ZXJ0ZWQgPHU+dGVzdDwvdT4gdG8gPHU+PHNwYW4gY2xhc3M9IkFwcGxlLXN0
eWxlLXNwYW4iIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBsaW5lLXRocm91Z2g7
Ij50ZXN0PC9zcGFuPjwvdT4sIGV4cGVjdGVkIDxzPjx1PnRlc3Q8L3U+PC9zPgotRkFJTCBvbmUg
dW5kZXJsaW5lIGNvbW1hbmQgY29udmVydGVkIDxzPnRlc3Q8L3M+IHRvIDxzPjxzcGFuIGNsYXNz
PSJBcHBsZS1zdHlsZS1zcGFuIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2gg
dW5kZXJsaW5lOyI+dGVzdDwvc3Bhbj48L3M+LCBleHBlY3RlZCA8dT48cz50ZXN0PC9zPjwvdT4K
K0ZBSUwgb25lIHN0cmlrZXRocm91Z2ggY29tbWFuZCBjb252ZXJ0ZWQgPHU+dGVzdDwvdT4gdG8g
PHU+PHNwYW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246
IGxpbmUtdGhyb3VnaDsiPnRlc3Q8L3NwYW4+PC91PiwgZXhwZWN0ZWQgPHM+PHU+dGVzdDwvdT48
L3M+CitGQUlMIG9uZSB1bmRlcmxpbmUgY29tbWFuZCBjb252ZXJ0ZWQgPHM+dGVzdDwvcz4gdG8g
PHM+PHNwYW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246
IHVuZGVybGluZTsiPnRlc3Q8L3NwYW4+PC9zPiwgZXhwZWN0ZWQgPHU+PHM+dGVzdDwvcz48L3U+
CiBGQUlMIG9uZSBzdHJpa2V0aHJvdWdoIGNvbW1hbmQgY29udmVydGVkIDxzcGFuIHN0eWxlPSd0
ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lJz50ZXN0PC9zcGFuPiB0byA8c3BhbiBjbGFzcz0iQXBw
bGUtc3R5bGUtc3BhbiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmUgbGluZS10aHJv
dWdoOyI+dGVzdDwvc3Bhbj4sIGV4cGVjdGVkIDxzPjxzcGFuIHN0eWxlPSd0ZXh0LWRlY29yYXRp
b246IG92ZXJsaW5lJz50ZXN0PC9zcGFuPjwvcz4KIEZBSUwgb25lIHVuZGVybGluZSBjb21tYW5k
IGNvbnZlcnRlZCA8c3BhbiBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSc+dGVzdDwv
c3Bhbj4gdG8gPHNwYW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJ0ZXh0LWRlY29y
YXRpb246IG92ZXJsaW5lIHVuZGVybGluZTsiPnRlc3Q8L3NwYW4+LCBleHBlY3RlZCA8dT48c3Bh
biBzdHlsZT0ndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSc+dGVzdDwvc3Bhbj48L3U+CiBQQVNT
IHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCg==
</data>
<flag name="review"
          id="18908"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34791</attachid>
            <date>2009-08-13 14:48:37 -0700</date>
            <delta_ts>2009-08-17 15:45:41 -0700</delta_ts>
            <desc>fixed per comment</desc>
            <filename>fix27749e</filename>
            <type>text/plain</type>
            <size>19413</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NzIzNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMDktMDgtMTMgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3R5
bGVDaGFuZ2U6OmluaXQgbmVlZHMgY2xlYW4gdXAgYmVmb3JlIGZpeGluZyB0aGUgYnVnIDIzODky
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzc0OQor
CisgICAgICAgIFRoaXMgcGF0Y2ggc2ltcGxpZmllcyBTdHlsZUNoYW5nZTo6aW5pdCBieSByZW1v
dmluZyB0aGUgaXRlcmF0aW9uIG9uIENTUyBwcm9wZXJ0aWVzLAorICAgICAgICBhbmQgYWRkaW5n
IGZ1bmN0aW9ucyBjbGVhbnVwVGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzIGFuZCBleHRyYWN0VGV4
dFN0eWxlIHRvIGhhbmRsZSB0aGUgc3R5bGUuCisKKyAgICAgICAgV2hpbGUgdGhpcyBwYXRjaCBk
b2VzIG5vdCBjaGFuZ2UgdGhlIG1vc3Qgb2YgYmVoYXZpb3JzLCBpdCBtb2RpZmllcyBnZXRQcm9w
ZXJ0aWVzTm90SW5Db21wdXRlZFN0eWxlCisgICAgICAgIHN1Y2ggdGhhdCB3ZSBkbyBub3QgYWRk
IGV4dHJhIHRleHQgZGVjb3JhdGlvbnMgdGhhdCBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBj
b21wdXRlZCBzdHlsZS4KKworICAgICAgICBObyB0ZXN0IGlzIGFkZGVkIGJlY2F1c2UgdGhlIG9u
bHkgYmVoYXZpb3JhbCBjaGFuZ2UgaXMgbm90IHRvIGFkZCByZWR1bmRhbnQgdGV4dCBkZWNvcmF0
aW9ucworICAgICAgICBhbmQgdGhpcyBiZWhhdmlvciBpcyBhbHJlYWR5IHRlc3RlZCBieSB0b2dn
bGUtc3R5bGUtMi5oCisKKyAgICAgICAgKiBjc3MvQ1NTVmFsdWVMaXN0LmNwcDogQWRkZWQgY29w
eQorICAgICAgICAoV2ViQ29yZTo6Q1NTVmFsdWVMaXN0Ojpjb3B5KTogTWFrZSBhIGNvcHkgb2Yg
Q1NTVmFsdWVMaXN0CisgICAgICAgICogY3NzL0NTU1ZhbHVlTGlzdC5oOiBBZGRlZCBjb3B5Cisg
ICAgICAgICogZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZUNoYW5nZTo6aW5pdCk6IFVzZXMgZ2V0UHJvcGVydGllc05vdEluQ29tcHV0ZWRTdHls
ZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzCisgICAgICAgIChX
ZWJDb3JlOjpTdHlsZUNoYW5nZTo6cmVjb25jaWxlVGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzKTog
UmVtb3ZlcyAtd2Via2l0LXRleHQtZGVjb3JhdGlvbnMtaW4tZWZmZWN0cyBhbmQgcmVkdW5kYW50
ICJub25lIgorICAgICAgICAoV2ViQ29yZTo6Z2V0SWRlbnRpZmllclZhbHVlKTogT2J0YWlucyB0
aGUgaWRlbnRpZmllciBvZiBhIENTU1ByaW1pdGl2ZVZhbHVlCisgICAgICAgIChXZWJDb3JlOjpT
dHlsZUNoYW5nZTo6ZXh0cmFjdFRleHRTdHlsZXMpOiBDb252ZXJ0cyBwcm9wZXJ0aWVzIGluIHN0
eWxlIHRvIG1fYXBwbHkqIGFuZCByZW1vdmVzIHRoZSBwcm9wZXJ0eQorICAgICAgICAoV2ViQ29y
ZTo6Z2V0UHJvcGVydGllc05vdEluQ29tcHV0ZWRTdHlsZSk6IEZpeGVkIGEgYnVnIHdpdGggaG93
IHRleHQgZGVjb3JhdGlvbnMgYXJlIHRyZWF0ZWQKKwogMjAwOS0wOC0xMyAgQnJhZHkgRWlkc29u
ICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwu
CkluZGV4OiBXZWJDb3JlL2Nzcy9DU1NWYWx1ZUxpc3QuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvY3NzL0NTU1ZhbHVlTGlzdC5jcHAJKHJldmlzaW9uIDQ3MDA5KQorKysgV2ViQ29yZS9jc3Mv
Q1NTVmFsdWVMaXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTYsNiArOTYsMTQgQEAgYm9vbCBD
U1NWYWx1ZUxpc3Q6Omhhc1ZhbHVlKENTU1ZhbHVlKiB2YQogICAgIHJldHVybiBmYWxzZTsKIH0K
IAorUGFzc1JlZlB0cjxDU1NWYWx1ZUxpc3Q+IENTU1ZhbHVlTGlzdDo6Y29weSgpCit7CisgICAg
UGFzc1JlZlB0cjxDU1NWYWx1ZUxpc3Q+IG5ld0xpc3QgPSBtX2lzU3BhY2VTZXBhcmF0ZWQgPyBj
cmVhdGVTcGFjZVNlcGFyYXRlZCgpIDogY3JlYXRlQ29tbWFTZXBhcmF0ZWQoKTsKKyAgICBmb3Ig
KHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbV92YWx1ZXMuc2l6ZSgpOyBpbmRleCsrKQorICAg
ICAgICBuZXdMaXN0LT5hcHBlbmQoaXRlbShpbmRleCkpOworICAgIHJldHVybiBuZXdMaXN0Owor
fQorCiBTdHJpbmcgQ1NTVmFsdWVMaXN0Ojpjc3NUZXh0KCkgY29uc3QKIHsKICAgICBTdHJpbmcg
cmVzdWx0ID0gIiI7CkluZGV4OiBXZWJDb3JlL2Nzcy9DU1NWYWx1ZUxpc3QuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2Nzcy9DU1NWYWx1ZUxpc3QuaAkocmV2aXNpb24gNDcwMDkpCisrKyBXZWJD
b3JlL2Nzcy9DU1NWYWx1ZUxpc3QuaAkod29ya2luZyBjb3B5KQpAQCAtNTQsNiArNTQsNyBAQCBw
dWJsaWM6CiAgICAgdm9pZCBwcmVwZW5kKFBhc3NSZWZQdHI8Q1NTVmFsdWU+KTsKICAgICBib29s
IHJlbW92ZUFsbChDU1NWYWx1ZSopOwogICAgIGJvb2wgaGFzVmFsdWUoQ1NTVmFsdWUqKTsKKyAg
ICBQYXNzUmVmUHRyPENTU1ZhbHVlTGlzdD4gY29weSgpOwogCiAgICAgdmlydHVhbCBTdHJpbmcg
Y3NzVGV4dCgpIGNvbnN0OwogCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvQXBwbHlTdHlsZUNvbW1h
bmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5j
cHAJKHJldmlzaW9uIDQ3MDA5KQorKysgV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5k
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzAsOSArNzAsOSBAQCBwdWJsaWM6CiAKIHByaXZhdGU6
CiAgICAgdm9pZCBpbml0KFBhc3NSZWZQdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4sIGNvbnN0IFBv
c2l0aW9uJik7Ci0gICAgYm9vbCBjaGVja0ZvckxlZ2FjeUhUTUxTdHlsZUNoYW5nZShjb25zdCBD
U1NQcm9wZXJ0eSopOwotICAgIHN0YXRpYyBib29sIGN1cnJlbnRseUhhc1N0eWxlKGNvbnN0IFBv
c2l0aW9uJiwgY29uc3QgQ1NTUHJvcGVydHkqKTsKLSAgICAKKyAgICB2b2lkIHJlY29uY2lsZVRl
eHREZWNvcmF0aW9uUHJvcGVydGllcyhDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiopOworICAg
IHZvaWQgZXh0cmFjdFRleHRTdHlsZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qKTsKKwog
ICAgIFN0cmluZyBtX2Nzc1N0eWxlOwogICAgIGJvb2wgbV9hcHBseUJvbGQ7CiAgICAgYm9vbCBt
X2FwcGx5SXRhbGljOwpAQCAtMTAwLDEwMiArMTAwLDEwOSBAQCB2b2lkIFN0eWxlQ2hhbmdlOjpp
bml0KFBhc3NSZWZQdHI8Q1NTU3R5CiAgICAgICAgIHJldHVybjsKIAogICAgIGJvb2wgdXNlSFRN
TEZvcm1hdHRpbmdUYWdzID0gIWRvY3VtZW50LT5mcmFtZSgpLT5lZGl0b3IoKS0+c2hvdWxkU3R5
bGVXaXRoQ1NTKCk7Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBtdXRh
YmxlU3R5bGUgPSBzdHlsZS0+bWFrZU11dGFibGUoKTsKLSAgICAvLyBXZSBzaG91bGRuJ3QgaGF2
ZSBib3RoIHRleHQtZGVjb3JhdGlvbiBhbmQgLXdlYmtpdC10ZXh0LWRlY29yYXRpb25zLWluLWVm
ZmVjdCBiZWNhdXNlIHRoYXQgd291bGRuJ3QgbWFrZSBzZW5zZS4KLSAgICBBU1NFUlQoIW11dGFi
bGVTdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uKSB8
fCAhbXV0YWJsZVN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1Byb3BlcnR5V2Via2l0VGV4
dERlY29yYXRpb25zSW5FZmZlY3QpKTsKLSAgICBTdHJpbmcgc3R5bGVUZXh0KCIiKTsKLSAgICBi
b29sIGFkZGVkRGlyZWN0aW9uID0gZmFsc2U7Ci0gICAgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b246OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG11dGFibGVTdHlsZS0+ZW5kKCk7Ci0gICAgZm9yIChD
U1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtdXRhYmxlU3R5
bGUtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBDU1NQcm9wZXJ0
eSAqcHJvcGVydHkgPSAmKml0OwotCi0gICAgICAgIC8vIElmIHBvc2l0aW9uIGlzIGVtcHR5IG9y
IHRoZSBwb3NpdGlvbiBwYXNzZWQgaW4gYWxyZWFkeSBoYXMgdGhlIAotICAgICAgICAvLyBzdHls
ZSwganVzdCBtb3ZlIG9uLgotICAgICAgICBpZiAocG9zaXRpb24uaXNOb3ROdWxsKCkgJiYgY3Vy
cmVudGx5SGFzU3R5bGUocG9zaXRpb24sIHByb3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAKLSAgICAgICAgLy8gQ2hhbmdpbmcgdGhlIHdoaXRlc3BhY2Ugc3R5bGUgaW4g
YSB0YWIgc3BhbiB3b3VsZCBjb2xsYXBzZSB0aGUgdGFiIGludG8gYSBzcGFjZS4KLSAgICAgICAg
aWYgKHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5V2hpdGVTcGFjZSAmJiAoaXNUYWJTcGFu
VGV4dE5vZGUocG9zaXRpb24ubm9kZSgpKSB8fCBpc1RhYlNwYW5Ob2RlKChwb3NpdGlvbi5ub2Rl
KCkpKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIG5l
ZWRlZCwgZmlndXJlIG91dCBpZiB0aGlzIGNoYW5nZSBpcyBhIGxlZ2FjeSBIVE1MIHN0eWxlIGNo
YW5nZS4KLSAgICAgICAgaWYgKHVzZUhUTUxGb3JtYXR0aW5nVGFncyAmJiBjaGVja0ZvckxlZ2Fj
eUhUTUxTdHlsZUNoYW5nZShwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBS
ZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uPiBjb21wdXRlZFN0eWxlID0gcG9zaXRp
b24uY29tcHV0ZWRTdHlsZSgpOworICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlv
bj4gbXV0YWJsZVN0eWxlID0gZ2V0UHJvcGVydGllc05vdEluQ29tcHV0ZWRTdHlsZShzdHlsZS5n
ZXQoKSwgY29tcHV0ZWRTdHlsZS5nZXQoKSk7CiAKLSAgICAgICAgaWYgKHByb3BlcnR5LT5pZCgp
ID09IENTU1Byb3BlcnR5RGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoYWRkZWREaXJlY3Rp
b24pCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBhZGRlZERpcmVjdGlv
biA9IHRydWU7Ci0gICAgICAgIH0KKyAgICByZWNvbmNpbGVUZXh0RGVjb3JhdGlvblByb3BlcnRp
ZXMobXV0YWJsZVN0eWxlLmdldCgpKTsKKyAgICBpZiAodXNlSFRNTEZvcm1hdHRpbmdUYWdzKQor
ICAgICAgICBleHRyYWN0VGV4dFN0eWxlcyhtdXRhYmxlU3R5bGUuZ2V0KCkpOworCisgICAgLy8g
Q2hhbmdpbmcgdGhlIHdoaXRlc3BhY2Ugc3R5bGUgaW4gYSB0YWIgc3BhbiB3b3VsZCBjb2xsYXBz
ZSB0aGUgdGFiIGludG8gYSBzcGFjZS4KKyAgICBpZiAoaXNUYWJTcGFuVGV4dE5vZGUocG9zaXRp
b24ubm9kZSgpKSB8fCBpc1RhYlNwYW5Ob2RlKChwb3NpdGlvbi5ub2RlKCkpKSkKKyAgICAgICAg
bXV0YWJsZVN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eVdoaXRlU3BhY2UpOworCisg
ICAgLy8gSWYgdW5pY29kZS1iaWRpIGlzIHByZXNlbnQgaW4gbXV0YWJsZVN0eWxlIGFuZCBkaXJl
Y3Rpb24gaXMgbm90LCB0aGVuIGFkZCBkaXJlY3Rpb24gdG8gbXV0YWJsZVN0eWxlLgorICAgIC8v
IEZJWE1FOiBTaG91bGRuJ3QgdGhpcyBiZSBkb25lIGluIGdldFByb3BlcnRpZXNOb3RJbkNvbXB1
dGVkU3R5bGU/CisgICAgaWYgKG11dGFibGVTdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQ
cm9wZXJ0eVVuaWNvZGVCaWRpKSAmJiAhc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJv
cGVydHlEaXJlY3Rpb24pKQorICAgICAgICBtdXRhYmxlU3R5bGUtPnNldFByb3BlcnR5KENTU1By
b3BlcnR5RGlyZWN0aW9uLCBzdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0eURpcmVj
dGlvbikpOwogCi0gICAgICAgIC8vIEFkZCB0aGlzIHByb3BlcnR5Ci0gICAgICAgIGlmIChwcm9w
ZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uIHx8IHByb3BlcnR5LT5pZCgp
ID09IENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3QpIHsKLSAgICAgICAg
ICAgIC8vIEFsd2F5cyB1c2UgdGV4dC1kZWNvcmF0aW9uIGJlY2F1c2UgLXdlYmtpdC10ZXh0LWRl
Y29yYXRpb24taW4tZWZmZWN0IGlzIGludGVybmFsLgotICAgICAgICAgICAgQ1NTUHJvcGVydHkg
YWx0ZXJlZFByb3BlcnR5KENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24sIHByb3BlcnR5LT52YWx1
ZSgpLCBwcm9wZXJ0eS0+aXNJbXBvcnRhbnQoKSk7Ci0gICAgICAgICAgICAvLyBXZSBkb24ndCBh
ZGQgInRleHQtZGVjb3JhdGlvbjogbm9uZSIgYmVjYXVzZSBpdCBkb2Vzbid0IG92ZXJyaWRlIHRo
ZSBleGlzdGluZyB0ZXh0IGRlY29yYXRpb25zOyBpLmUuIHJlZHVuZGFudAotICAgICAgICAgICAg
aWYgKCFlcXVhbElnbm9yaW5nQ2FzZShhbHRlcmVkUHJvcGVydHkudmFsdWUoKS0+Y3NzVGV4dCgp
LCAibm9uZSIpKQotICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBhbHRlcmVkUHJvcGVydHku
Y3NzVGV4dCgpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN0eWxlVGV4dCArPSBwcm9w
ZXJ0eS0+Y3NzVGV4dCgpOwotCi0gICAgICAgIGlmICghYWRkZWREaXJlY3Rpb24gJiYgcHJvcGVy
dHktPmlkKCkgPT0gQ1NTUHJvcGVydHlVbmljb2RlQmlkaSkgewotICAgICAgICAgICAgc3R5bGVU
ZXh0ICs9ICJkaXJlY3Rpb246ICIgKyBzdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0
eURpcmVjdGlvbikgKyAiOyAiOwotICAgICAgICAgICAgYWRkZWREaXJlY3Rpb24gPSB0cnVlOwot
ICAgICAgICB9CisgICAgLy8gU2F2ZSB0aGUgcmVzdWx0IGZvciBsYXRlcgorICAgIG1fY3NzU3R5
bGUgPSBtdXRhYmxlU3R5bGUtPmNzc1RleHQoKS5zdHJpcFdoaXRlU3BhY2UoKTsKK30KKwordm9p
ZCBTdHlsZUNoYW5nZTo6cmVjb25jaWxlVGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzKENTU011dGFi
bGVTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkKK3sgICAgCisgICAgUmVmUHRyPENTU1ZhbHVlPiB0
ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1By
b3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3QpOworICAgIFJlZlB0cjxDU1NWYWx1
ZT4gdGV4dERlY29yYXRpb24gPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0
eVRleHREZWNvcmF0aW9uKTsKKyAgICAvLyBXZSBzaG91bGRuJ3QgaGF2ZSBib3RoIHRleHQtZGVj
b3JhdGlvbiBhbmQgLXdlYmtpdC10ZXh0LWRlY29yYXRpb25zLWluLWVmZmVjdCBiZWNhdXNlIHRo
YXQgd291bGRuJ3QgbWFrZSBzZW5zZS4KKyAgICBBU1NFUlQoIXRleHREZWNvcmF0aW9uc0luRWZm
ZWN0IHx8ICF0ZXh0RGVjb3JhdGlvbik7CisgICAgaWYgKHRleHREZWNvcmF0aW9uc0luRWZmZWN0
KSB7CisgICAgICAgIHN0eWxlLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9u
LCB0ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdC0+Y3NzVGV4dCgpKTsKKyAgICAgICAgc3R5bGUtPnJl
bW92ZVByb3BlcnR5KENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3QpOwor
ICAgICAgICB0ZXh0RGVjb3JhdGlvbiA9IHRleHREZWNvcmF0aW9uc0luRWZmZWN0OwogICAgIH0K
IAotICAgIC8vIFNhdmUgdGhlIHJlc3VsdCBmb3IgbGF0ZXIKLSAgICBtX2Nzc1N0eWxlID0gc3R5
bGVUZXh0LnN0cmlwV2hpdGVTcGFjZSgpOworICAgIC8vIElmIHRleHQtZGVjcmF0aW9uIGlzIHNl
dCB0byAibm9uZSIsIHJlbW92ZSB0aGUgcHJvcGVydHkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRv
IGFkZCByZWR1bmRhbnQgInRleHQtZGVjb3JhdGlvbjogbm9uZSIuCisgICAgaWYgKHRleHREZWNv
cmF0aW9uICYmICF0ZXh0RGVjb3JhdGlvbi0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgc3R5bGUt
PnJlbW92ZVByb3BlcnR5KENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24pOwogfQogCi0vLyBUaGlz
IGZ1bmN0aW9uIGlzIHRoZSBtYXBwaW5nIGZyb20gQ1NTIHN0eWxlcyB0byBzdHlsaW5nIHRhZ3Mg
KGxpa2UgZm9udC13ZWlnaHQ6IGJvbGQgdG8gPGI+KQotYm9vbCBTdHlsZUNoYW5nZTo6Y2hlY2tG
b3JMZWdhY3lIVE1MU3R5bGVDaGFuZ2UoY29uc3QgQ1NTUHJvcGVydHkqIHByb3BlcnR5KQoraW50
IGdldElkZW50aWZpZXJWYWx1ZShDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUsIGlu
dCBwcm9wZXJ0eUlEKQogewotICAgIGlmICghcHJvcGVydHkgfHwgIXByb3BlcnR5LT52YWx1ZSgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgU3RyaW5nIHZhbHVlVGV4dChwcm9w
ZXJ0eS0+dmFsdWUoKS0+Y3NzVGV4dCgpKTsKLSAgICBzd2l0Y2ggKHByb3BlcnR5LT5pZCgpKSB7
Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgotICAgICAgICAgICAgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgImJvbGQiKSkgewotICAgICAgICAgICAgICAgIG1f
YXBwbHlCb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1Byb3BlcnR5VmVydGlj
YWxBbGlnbjoKLSAgICAgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJz
dWIiKSkgewotICAgICAgICAgICAgICAgIG1fYXBwbHlTdWJzY3JpcHQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgInN1cGVyIikpIHsKLSAgICAgICAgICAgICAgICBt
X2FwcGx5U3VwZXJzY3JpcHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVy
dHlGb250U3R5bGU6Ci0gICAgICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodmFsdWVUZXh0
LCAiaXRhbGljIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UodmFsdWVUZXh0LCAib2JsaXF1ZSIpKSB7
Ci0gICAgICAgICAgICAgICAgbV9hcHBseUl0YWxpYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBDU1NQcm9wZXJ0eUNvbG9yOiB7Ci0gICAgICAgICAgICBSR0JBMzIgcmdiYSA9IDA7Ci0g
ICAgICAgICAgICBDU1NQYXJzZXI6OnBhcnNlQ29sb3IocmdiYSwgdmFsdWVUZXh0KTsKLSAgICAg
ICAgICAgIENvbG9yIGNvbG9yKHJnYmEpOwotICAgICAgICAgICAgbV9hcHBseUZvbnRDb2xvciA9
IGNvbG9yLm5hbWUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghc3R5bGUp
CisgICAgICAgIHJldHVybiAwOworCisgICAgUmVmUHRyPENTU1ZhbHVlPiB2YWx1ZSA9IHN0eWxl
LT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHByb3BlcnR5SUQpOworICAgIGlmICghdmFsdWUgfHwgIXZh
bHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJu
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUuZ2V0KCkpLT5nZXRJZGVudCgp
OworfQorCit2b2lkIFN0eWxlQ2hhbmdlOjpleHRyYWN0VGV4dFN0eWxlcyhDU1NNdXRhYmxlU3R5
bGVEZWNsYXJhdGlvbiogc3R5bGUpCit7CisgICAgQVNTRVJUKHN0eWxlKTsKKworICAgIGlmIChn
ZXRJZGVudGlmaWVyVmFsdWUoc3R5bGUsIENTU1Byb3BlcnR5Rm9udFdlaWdodCkgPT0gQ1NTVmFs
dWVCb2xkKSB7CisgICAgICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRX
ZWlnaHQpOworICAgICAgICBtX2FwcGx5Qm9sZCA9IHRydWU7CisgICAgfQorCisgICAgaW50IGZv
bnRTdHlsZSA9IGdldElkZW50aWZpZXJWYWx1ZShzdHlsZSwgQ1NTUHJvcGVydHlGb250U3R5bGUp
OworICAgIGlmIChmb250U3R5bGUgPT0gQ1NTVmFsdWVJdGFsaWMgfHwgZm9udFN0eWxlID09IENT
U1ZhbHVlT2JsaXF1ZSkgeworICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVy
dHlGb250U3R5bGUpOworICAgICAgICBtX2FwcGx5SXRhbGljID0gdHJ1ZTsKKyAgICB9CisKKyAg
ICBpbnQgdmVydGljYWxBbGlnbiA9IGdldElkZW50aWZpZXJWYWx1ZShzdHlsZSwgQ1NTUHJvcGVy
dHlWZXJ0aWNhbEFsaWduKTsKKyAgICBzd2l0Y2ggKHZlcnRpY2FsQWxpZ24pIHsKKyAgICBjYXNl
IENTU1ZhbHVlU3ViOgorICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlW
ZXJ0aWNhbEFsaWduKTsKKyAgICAgICAgbV9hcHBseVN1YnNjcmlwdCA9IHRydWU7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgQ1NTVmFsdWVTdXBlcjoKKyAgICAgICAgc3R5bGUtPnJlbW92ZVBy
b3BlcnR5KENTU1Byb3BlcnR5VmVydGljYWxBbGlnbik7CisgICAgICAgIG1fYXBwbHlTdXBlcnNj
cmlwdCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChSZWZQdHI8Q1NT
VmFsdWU+IGNvbG9yVmFsdWUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0
eUNvbG9yKSkgeworICAgICAgICBBU1NFUlQoY29sb3JWYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgp
KTsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZUNvbG9yID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjb2xvclZhbHVlLmdldCgpKTsKKyAgICAgICAgUkdCQTMy
IHJnYmE7CisgICAgICAgIGlmIChwcmltaXRpdmVDb2xvci0+cHJpbWl0aXZlVHlwZSgpID09IENT
U1ByaW1pdGl2ZVZhbHVlOjpDU1NfUkdCQ09MT1IpCisgICAgICAgICAgICByZ2JhID0gcHJpbWl0
aXZlQ29sb3ItPmdldFJHQkEzMlZhbHVlKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
Q1NTUGFyc2VyOjpwYXJzZUNvbG9yKHJnYmEsIGNvbG9yVmFsdWUtPmNzc1RleHQoKSk7CisgICAg
ICAgICAgICAvLyBOZWVkIHRvIHRha2UgY2FyZSBvZiBuYW1lZCBjb2xvciBzdWNoIGFzIGdyZWVu
IGFuZCBibGFjaworICAgICAgICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBiZSByZW1vdmVkIGFm
dGVyIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yODI4MiBpcyBmaXhl
ZC4KICAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseToKLSAgICAg
ICAgICAgIG1fYXBwbHlGb250RmFjZSA9IHZhbHVlVGV4dDsKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgICAgICAgICBpZiAo
cHJvcGVydHktPnZhbHVlKCktPmNzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlOjpDU1NfUFJJTUlU
SVZFX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUgKnZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUgKj4ocHJvcGVydHktPnZhbHVlKCkpOwotCi0g
ICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPCBDU1NQcmltaXRpdmVW
YWx1ZTo6Q1NTX1BYIHx8IHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPiBDU1NQcmltaXRpdmVWYWx1
ZTo6Q1NTX1BDKQotICAgICAgICAgICAgICAgICAgICAvLyBTaXplIGtleXdvcmQgb3IgcmVsYXRp
dmUgdW5pdC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCisgICAgICAgIG1f
YXBwbHlGb250Q29sb3IgPSBDb2xvcihyZ2JhKS5uYW1lKCk7CisgICAgICAgIHN0eWxlLT5yZW1v
dmVQcm9wZXJ0eShDU1NQcm9wZXJ0eUNvbG9yKTsKKyAgICB9CisKKyAgICBtX2FwcGx5Rm9udEZh
Y2UgPSBzdHlsZS0+Z2V0UHJvcGVydHlWYWx1ZShDU1NQcm9wZXJ0eUZvbnRGYW1pbHkpOworICAg
IHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRGYW1pbHkpOworCisgICAgaWYg
KFJlZlB0cjxDU1NWYWx1ZT4gZm9udFNpemUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShD
U1NQcm9wZXJ0eUZvbnRTaXplKSkgeworICAgICAgICBpZiAoIWZvbnRTaXplLT5pc1ByaW1pdGl2
ZVZhbHVlKCkpCisgICAgICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlG
b250U2l6ZSk7IC8vIENhbid0IG1ha2Ugc2Vuc2Ugb2YgdGhlIG51bWJlci4gUHV0IG5vIGZvbnQg
c2l6ZS4KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZvbnRTaXplLmdldCgpKTsKKwor
ICAgICAgICAgICAgLy8gT25seSBhY2NlcHQgYWJzb2x1dGUgc2NhbGUKKyAgICAgICAgICAgIGlm
ICh2YWx1ZS0+cHJpbWl0aXZlVHlwZSgpID49IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFggJiYg
dmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA8PSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BDKSB7CiAg
ICAgICAgICAgICAgICAgZmxvYXQgbnVtYmVyID0gdmFsdWUtPmdldEZsb2F0VmFsdWUoQ1NTUHJp
bWl0aXZlVmFsdWU6OkNTU19QWCk7CiAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA8PSA5KQog
ICAgICAgICAgICAgICAgICAgICBtX2FwcGx5Rm9udFNpemUgPSAiMSI7CkBAIC0yMTEsMzQgKzIx
OCwxMiBAQCBib29sIFN0eWxlQ2hhbmdlOjpjaGVja0ZvckxlZ2FjeUhUTUxTdHlsCiAgICAgICAg
ICAgICAgICAgICAgIG1fYXBwbHlGb250U2l6ZSA9ICI2IjsKICAgICAgICAgICAgICAgICBlbHNl
CiAgICAgICAgICAgICAgICAgICAgIG1fYXBwbHlGb250U2l6ZSA9ICI3IjsKLSAgICAgICAgICAg
ICAgICAvLyBIdWdlIHF1aXJrIGluIE1pY3Jvc2Z0IEVudG91cmFnZSBpcyB0aGF0IHRoZXkgdW5k
ZXJzdGFuZCBDU1MgZm9udC1zaXplLCBidXQgYWxzbyB3cml0ZSAKLSAgICAgICAgICAgICAgICAv
LyBvdXQgbGVnYWN5IDEtNyB2YWx1ZXMgaW4gZm9udCB0YWdzIChJIGd1ZXNzIGZvciBtYWlsZXJz
IHRoYXQgYXJlIG5vdCBDU1Mtc2F2dnkgYXQgYWxsLCAKLSAgICAgICAgICAgICAgICAvLyBsaWtl
IEV1ZG9yYSkuIFllcywgdGhleSB3cml0ZSBvdXQgKmJvdGgqLiBXZSBuZWVkIHRvIHdyaXRlIG91
dCBib3RoIGFzIHdlbGwuIFJldHVybiBmYWxzZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAg
Ly8gQ2FuJ3QgbWFrZSBzZW5zZSBvZiB0aGUgbnVtYmVyLiBQdXQgbm8gZm9udCBzaXplLgotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8g
SHVnZSBxdWlyayBpbiBNaWNyb3NmdCBFbnRvdXJhZ2UgaXMgdGhhdCB0aGV5IHVuZGVyc3RhbmQg
Q1NTIGZvbnQtc2l6ZSwgYnV0IGFsc28gd3JpdGUgCisgICAgICAgICAgICAvLyBvdXQgbGVnYWN5
IDEtNyB2YWx1ZXMgaW4gZm9udCB0YWdzIChJIGd1ZXNzIGZvciBtYWlsZXJzIHRoYXQgYXJlIG5v
dCBDU1Mtc2F2dnkgYXQgYWxsLCAKKyAgICAgICAgICAgIC8vIGxpa2UgRXVkb3JhKS4gWWVzLCB0
aGV5IHdyaXRlIG91dCAqYm90aCouIFdlIG5lZWQgdG8gd3JpdGUgb3V0IGJvdGggYXMgd2VsbC4K
KyAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU3R5bGVDaGFu
Z2U6OmN1cnJlbnRseUhhc1N0eWxlKGNvbnN0IFBvc2l0aW9uICZwb3MsIGNvbnN0IENTU1Byb3Bl
cnR5ICpwcm9wZXJ0eSkKLXsKLSAgICBBU1NFUlQocG9zLmlzTm90TnVsbCgpKTsKLSAgICBSZWZQ
dHI8Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uPiBzdHlsZSA9IHBvcy5jb21wdXRlZFN0eWxl
KCk7Ci0gICAgUmVmUHRyPENTU1ZhbHVlPiB2YWx1ZTsKLSAgICBpZiAocHJvcGVydHktPmlkKCkg
PT0gQ1NTUHJvcGVydHlGb250U2l6ZSkKLSAgICAgICAgdmFsdWUgPSBzdHlsZS0+Z2V0Rm9udFNp
emVDU1NWYWx1ZVByZWZlcnJpbmdLZXl3b3JkKCk7Ci0gICAgLy8gV2UgbmVlZCB0byB1c2UgLXdl
YmtpdC10ZXh0LWRlY29yYXRpb25zLWluLWVmZmVjdCB0byB0YWtlIGNhcmUgb2YgdGV4dCBkZWNv
cmF0aW9ucyBzZXQgYnkgdSwgcywgYW5kIHN0cmlrZQotICAgIGVsc2UgaWYgKHByb3BlcnR5LT5p
ZCgpID09IENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24pCi0gICAgICAgIHZhbHVlID0gc3R5bGUt
PmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVm
ZmVjdCk7Ci0gICAgZWxzZQotICAgICAgICB2YWx1ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1Zh
bHVlKHByb3BlcnR5LT5pZCgpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgcmV0dXJuIGVxdWFsSWdub3JpbmdDYXNlKHZhbHVlLT5jc3NUZXh0KCksIHByb3Bl
cnR5LT52YWx1ZSgpLT5jc3NUZXh0KCkpOwogfQogCiBzdGF0aWMgU3RyaW5nJiBzdHlsZVNwYW5D
bGFzc1N0cmluZygpCkBAIC0zMTgsMTggKzMwMywxNSBAQCBSZWZQdHI8Q1NTTXV0YWJsZVN0eWxl
RGVjbGFyYXRpb24+IGdldFByCiAgICAgLy8gVGFrZSBjYXJlIG9mIGJvdGggdGV4dC1kZWNvcmF0
aW9uIGFuZCAtd2Via2l0LXRleHQtZGVjb3JhdGlvbnMtaW4tZWZmZWN0CiAgICAgc3RhdGljIGNv
bnN0IGludCB0ZXh0RGVjb3JhdGlvblByb3BlcnRpZXNbXT17Q1NTUHJvcGVydHlUZXh0RGVjb3Jh
dGlvbiwgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdH07CiAgICAgZm9y
IChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2YodGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzKS9zaXpl
b2YodGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzWzFdKTsgbisrKSB7Ci0gICAgICAgIFJlZlB0cjxD
U1NWYWx1ZT4gc3R5bGVWYWx1ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHRleHREZWNv
cmF0aW9uUHJvcGVydGllc1tuXSk7Ci0gICAgICAgIGlmICghc3R5bGVWYWx1ZSB8fCAhc3R5bGVW
YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgUmVmUHRyPENTU1ZhbHVlPiByZXN1bHRWYWx1
ZSA9IHJlc3VsdC0+Z2V0UHJvcGVydHlDU1NWYWx1ZSh0ZXh0RGVjb3JhdGlvblByb3BlcnRpZXNb
bl0pOworICAgICAgICBpZiAoIXJlc3VsdFZhbHVlIHx8ICFyZXN1bHRWYWx1ZS0+aXNWYWx1ZUxp
c3QoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIENTU1ZhbHVlTGlzdCogZGVz
aXJlZFZhbHVlTGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHN0eWxlVmFsdWUuZ2V0
KCkpOworICAgICAgICBSZWZQdHI8Q1NTVmFsdWVMaXN0PiByZXN1bHRWYWx1ZUxpc3QgPSBzdGF0
aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihyZXN1bHRWYWx1ZS5nZXQoKSktPmNvcHkoKTsKICAgICAg
ICAgQ1NTVmFsdWVMaXN0KiBjb21wdXRlZFZhbHVlTGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVl
TGlzdCo+KGNvbXB1dGVkVmFsdWUuZ2V0KCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGRlc2lyZWRWYWx1ZUxpc3QtPmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgh
Y29tcHV0ZWRWYWx1ZUxpc3QtPmhhc1ZhbHVlKGRlc2lyZWRWYWx1ZUxpc3QtPml0ZW0oaSkpKSB7
Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT5yZW1vdmVQcm9wZXJ0eSh0ZXh0RGVjb3JhdGlvblBy
b3BlcnRpZXNbbl0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAg
ICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcHV0ZWRWYWx1ZUxpc3Qt
Pmxlbmd0aCgpOyBpKyspCisgICAgICAgICAgICByZXN1bHRWYWx1ZUxpc3QtPnJlbW92ZUFsbChj
b21wdXRlZFZhbHVlTGlzdC0+aXRlbShpKSk7CisgICAgICAgIHJlc3VsdC0+c2V0UHJvcGVydHko
dGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzW25dLCByZXN1bHRWYWx1ZUxpc3QtPmNzc1RleHQoKSk7
CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQyNCw3ICs0MDYsNyBAQCB2b2lkIHJl
bW92ZVN0eWxlc0FkZGVkQnlOb2RlKENTU011dGFibGVTCiAgICAgcGFyZW50U3R5bGUtPmRpZmYo
c3R5bGUuZ2V0KCkpOwogICAgIHN0eWxlLT5kaWZmKGVkaXRpbmdTdHlsZSk7CiB9Ci0gICAgCisK
IEFwcGx5U3R5bGVDb21tYW5kOjpBcHBseVN0eWxlQ29tbWFuZChEb2N1bWVudCogZG9jdW1lbnQs
IENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlLCBFZGl0QWN0aW9uIGVkaXRpbmdBY3Rpb24sIEVQ
cm9wZXJ0eUxldmVsIHByb3BlcnR5TGV2ZWwpCiAgICAgOiBDb21wb3NpdGVFZGl0Q29tbWFuZChk
b2N1bWVudCkKICAgICAsIG1fc3R5bGUoc3R5bGUtPm1ha2VNdXRhYmxlKCkpCkluZGV4OiBMYXlv
dXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShy
ZXZpc2lvbiA0NzE3NCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE2IEBACisyMDA5LTA4LTEzICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQu
b3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFN0
eWxlQ2hhbmdlOjppbml0IG5lZWRzIGNsZWFuIHVwIGJlZm9yZSBmaXhpbmcgdGhlIGJ1ZyAyMzg5
MgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3NDkK
KworICAgICAgICBUaGlzIGNsZWFuLXVwIHBhdGNoIGZpeGVkIGEgYnVnIGluIGdldFByb3BlcnRp
ZXNOb3RJbkNvbXB1dGVkU3R5bGUsIGFuZCBjb25zZXF1ZW50bHksCisgICAgICAgIFdlYktpdCBu
byBsb25nZXIgYWRkcyByZWR1bmRhbnQgdGV4dCBkZWNvcmF0aW9ucyBhbHJlYWR5IHByZXNlbnQg
aW4gdGhlIGNvbXB1dGVkIHN0eWxlLgorICAgICAgICBUaGlzIGFmZmVjdHMgdGhlIGV4cGVjdGVk
IHJlc3VsdCBvZiB0b2dnbGUtc3R5bGUtMi5odG1sCisKKyAgICAgICAgKiBlZGl0aW5nL2V4ZWND
b21tYW5kL3RvZ2dsZS1zdHlsZS0yLWV4cGVjdGVkLnR4dDogUmViYXNlbGluZWQuCisKIDIwMDkt
MDgtMTIgIEFscGhhIExhbSA8IGhjbGFtQGNocm9taXVtLm9yZz4KIAogICAgICAgICBOb3QgcmV2
aWV3ZWQsIFdpbmRvd3MgdGVzdCBmaXggYWZ0ZXIgaHR0cDovL3RyYWMud2Via2l0Lm9yZy9jaGFu
Z2VzZXQvNDcxNzEuCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL2V4ZWNDb21tYW5kL3RvZ2ds
ZS1zdHlsZS0yLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5n
L2V4ZWNDb21tYW5kL3RvZ2dsZS1zdHlsZS0yLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gNDcwMDkp
CisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL2V4ZWNDb21tYW5kL3RvZ2dsZS1zdHlsZS0yLWV4cGVj
dGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtOSw4ICs5LDggQEAgUEFTUyB0d28gdW5kZXJsaW5l
IGNvbW1hbmRzIGNvbnZlcnRlZCB0ZQogRkFJTCBvbmUgc3RyaWtldGhyb3VnaCBjb21tYW5kIGNv
bnZlcnRlZCB0ZXN0IHRvIDxzcGFuIGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBzdHlsZT0idGV4
dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Ij50ZXN0PC9zcGFuPiwgZXhwZWN0ZWQgPHM+dGVz
dDwvcz4KIFBBU1Mgb25lIHN0cmlrZXRocm91Z2ggY29tbWFuZCBjb252ZXJ0ZWQgPHU+PGI+PHM+
dGVzdDwvcz48L2I+PC91PiB0byA8dT48Yj50ZXN0PC9iPjwvdT4KIFBBU1MgdHdvIHN0cmlrZXRo
cm91Z2ggY29tbWFuZHMgY29udmVydGVkIHRlc3QgdG8gdGVzdAotRkFJTCBvbmUgc3RyaWtldGhy
b3VnaCBjb21tYW5kIGNvbnZlcnRlZCA8dT50ZXN0PC91PiB0byA8dT48c3BhbiBjbGFzcz0iQXBw
bGUtc3R5bGUtc3BhbiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGxpbmUtdGhy
b3VnaDsiPnRlc3Q8L3NwYW4+PC91PiwgZXhwZWN0ZWQgPHM+PHU+dGVzdDwvdT48L3M+Ci1GQUlM
IG9uZSB1bmRlcmxpbmUgY29tbWFuZCBjb252ZXJ0ZWQgPHM+dGVzdDwvcz4gdG8gPHM+PHNwYW4g
Y2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhy
b3VnaCB1bmRlcmxpbmU7Ij50ZXN0PC9zcGFuPjwvcz4sIGV4cGVjdGVkIDx1PjxzPnRlc3Q8L3M+
PC91PgorRkFJTCBvbmUgc3RyaWtldGhyb3VnaCBjb21tYW5kIGNvbnZlcnRlZCA8dT50ZXN0PC91
PiB0byA8dT48c3BhbiBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgc3R5bGU9InRleHQtZGVjb3Jh
dGlvbjogbGluZS10aHJvdWdoOyI+dGVzdDwvc3Bhbj48L3U+LCBleHBlY3RlZCA8cz48dT50ZXN0
PC91Pjwvcz4KK0ZBSUwgb25lIHVuZGVybGluZSBjb21tYW5kIGNvbnZlcnRlZCA8cz50ZXN0PC9z
PiB0byA8cz48c3BhbiBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgc3R5bGU9InRleHQtZGVjb3Jh
dGlvbjogdW5kZXJsaW5lOyI+dGVzdDwvc3Bhbj48L3M+LCBleHBlY3RlZCA8dT48cz50ZXN0PC9z
PjwvdT4KIEZBSUwgb25lIHN0cmlrZXRocm91Z2ggY29tbWFuZCBjb252ZXJ0ZWQgPHNwYW4gc3R5
bGU9J3RleHQtZGVjb3JhdGlvbjogb3ZlcmxpbmUnPnRlc3Q8L3NwYW4+IHRvIDxzcGFuIGNsYXNz
PSJBcHBsZS1zdHlsZS1zcGFuIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZSBsaW5l
LXRocm91Z2g7Ij50ZXN0PC9zcGFuPiwgZXhwZWN0ZWQgPHM+PHNwYW4gc3R5bGU9J3RleHQtZGVj
b3JhdGlvbjogb3ZlcmxpbmUnPnRlc3Q8L3NwYW4+PC9zPgogRkFJTCBvbmUgdW5kZXJsaW5lIGNv
bW1hbmQgY29udmVydGVkIDxzcGFuIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lJz50
ZXN0PC9zcGFuPiB0byA8c3BhbiBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgc3R5bGU9InRleHQt
ZGVjb3JhdGlvbjogb3ZlcmxpbmUgdW5kZXJsaW5lOyI+dGVzdDwvc3Bhbj4sIGV4cGVjdGVkIDx1
PjxzcGFuIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lJz50ZXN0PC9zcGFuPjwvdT4K
IFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34995</attachid>
            <date>2009-08-17 15:45:41 -0700</date>
            <delta_ts>2009-08-17 16:06:59 -0700</delta_ts>
            <desc>removed the fix on how text decorations are trimmed, no behavioral change</desc>
            <filename>fix27749f</filename>
            <type>text/plain</type>
            <size>15699</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NzM5NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMDktMDgtMTcgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3R5
bGVDaGFuZ2U6OmluaXQgbmVlZHMgY2xlYW4gdXAgYmVmb3JlIGZpeGluZyB0aGUgYnVnIDIzODky
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzc0OQor
CisgICAgICAgIFRoaXMgcGF0Y2ggc2ltcGxpZmllcyBTdHlsZUNoYW5nZTo6aW5pdCBieSByZW1v
dmluZyB0aGUgaXRlcmF0aW9uIG9uIENTUyBwcm9wZXJ0aWVzLAorICAgICAgICBhbmQgYWRkaW5n
IGZ1bmN0aW9ucyBjbGVhbnVwVGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzIGFuZCBleHRyYWN0VGV4
dFN0eWxlIHRvIGhhbmRsZSB0aGUgc3R5bGUuCisKKyAgICAgICAgQmVjYXVzZSB0aGVyZSBpcyBh
IGJ1ZyBpbiBob3cgdGV4dCBkZWNvcmF0aW9ucyBhcmUgcHJvY2Vzc2VzIGluIGdldFByb3BlcnRp
ZXNOb3RJbkNvbXB1dGVkU3R5bGUsCisgICAgICAgIHRoaXMgcGF0Y2ggc2ltcGxpZmllcyB0aGUg
dHJlYXRtZW50IGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBiZWhhdmlvciBvZiBX
ZWJLaXQuCisgICAgICAgIEhvd2V2ZXIsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5v
dCBiZXN0IChhZGRzIHJlZHVuZGFudCB0ZXh0LWRlY29yYXRpb25zKSBhbmQgd2Ugc2hvdWxkIGZp
eCBpdCBsYXRlci4KKworICAgICAgICBObyB0ZXN0IGlzIGFkZGVkIHNpbmNlIHRoZXJlIGlzIG5v
IGNoYW5nZSBpbiBiZWhhdmlvci4KKworICAgICAgICAqIGVkaXRpbmcvQXBwbHlTdHlsZUNvbW1h
bmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVDaGFuZ2U6OmluaXQpOiBVc2VzIGdldFBy
b3BlcnRpZXNOb3RJbkNvbXB1dGVkU3R5bGUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdGhyb3VnaCB0
aGUgcHJvcGVydGllcworICAgICAgICAoV2ViQ29yZTo6U3R5bGVDaGFuZ2U6OnJlY29uY2lsZVRl
eHREZWNvcmF0aW9uUHJvcGVydGllcyk6IFJlbW92ZXMgLXdlYmtpdC10ZXh0LWRlY29yYXRpb25z
LWluLWVmZmVjdHMgYW5kIHJlZHVuZGFudCAibm9uZSIKKyAgICAgICAgKFdlYkNvcmU6OmdldElk
ZW50aWZpZXJWYWx1ZSk6IE9idGFpbnMgdGhlIGlkZW50aWZpZXIgb2YgYSBDU1NQcmltaXRpdmVW
YWx1ZQorICAgICAgICAoV2ViQ29yZTo6U3R5bGVDaGFuZ2U6OmV4dHJhY3RUZXh0U3R5bGVzKTog
Q29udmVydHMgcHJvcGVydGllcyBpbiBzdHlsZSB0byBtX2FwcGx5KiBhbmQgcmVtb3ZlcyB0aGUg
cHJvcGVydHkKKyAgICAgICAgKFdlYkNvcmU6OmdldFByb3BlcnRpZXNOb3RJbkNvbXB1dGVkU3R5
bGUpOiBGaXhlZCBhIGJ1ZyB3aXRoIGhvdyB0ZXh0IGRlY29yYXRpb25zIGFyZSB0cmVhdGVkCisK
IDIwMDktMDgtMTcgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAg
ICAgVHJ5aW5nIHRvIGZpeCBXaW5kb3dzIGJ1aWxkLgpJbmRleDogV2ViQ29yZS9lZGl0aW5nL0Fw
cGx5U3R5bGVDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2VkaXRpbmcvQXBwbHlT
dHlsZUNvbW1hbmQuY3BwCShyZXZpc2lvbiA0NzM4OCkKKysrIFdlYkNvcmUvZWRpdGluZy9BcHBs
eVN0eWxlQ29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcwLDkgKzcwLDkgQEAgcHVibGlj
OgogCiBwcml2YXRlOgogICAgIHZvaWQgaW5pdChQYXNzUmVmUHRyPENTU1N0eWxlRGVjbGFyYXRp
b24+LCBjb25zdCBQb3NpdGlvbiYpOwotICAgIGJvb2wgY2hlY2tGb3JMZWdhY3lIVE1MU3R5bGVD
aGFuZ2UoY29uc3QgQ1NTUHJvcGVydHkqKTsKLSAgICBzdGF0aWMgYm9vbCBjdXJyZW50bHlIYXNT
dHlsZShjb25zdCBQb3NpdGlvbiYsIGNvbnN0IENTU1Byb3BlcnR5Kik7Ci0gICAgCisgICAgdm9p
ZCByZWNvbmNpbGVUZXh0RGVjb3JhdGlvblByb3BlcnRpZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFy
YXRpb24qKTsKKyAgICB2b2lkIGV4dHJhY3RUZXh0U3R5bGVzKENTU011dGFibGVTdHlsZURlY2xh
cmF0aW9uKik7CisKICAgICBTdHJpbmcgbV9jc3NTdHlsZTsKICAgICBib29sIG1fYXBwbHlCb2xk
OwogICAgIGJvb2wgbV9hcHBseUl0YWxpYzsKQEAgLTEwMCwxMDIgKzEwMCwxMDkgQEAgdm9pZCBT
dHlsZUNoYW5nZTo6aW5pdChQYXNzUmVmUHRyPENTU1N0eQogICAgICAgICByZXR1cm47CiAKICAg
ICBib29sIHVzZUhUTUxGb3JtYXR0aW5nVGFncyA9ICFkb2N1bWVudC0+ZnJhbWUoKS0+ZWRpdG9y
KCktPnNob3VsZFN0eWxlV2l0aENTUygpOwotICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbj4gbXV0YWJsZVN0eWxlID0gc3R5bGUtPm1ha2VNdXRhYmxlKCk7Ci0gICAgLy8gV2Ug
c2hvdWxkbid0IGhhdmUgYm90aCB0ZXh0LWRlY29yYXRpb24gYW5kIC13ZWJraXQtdGV4dC1kZWNv
cmF0aW9ucy1pbi1lZmZlY3QgYmVjYXVzZSB0aGF0IHdvdWxkbid0IG1ha2Ugc2Vuc2UuCi0gICAg
QVNTRVJUKCFtdXRhYmxlU3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlUZXh0
RGVjb3JhdGlvbikgfHwgIW11dGFibGVTdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9w
ZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0KSk7Ci0gICAgU3RyaW5nIHN0eWxlVGV4
dCgiIik7Ci0gICAgYm9vbCBhZGRlZERpcmVjdGlvbiA9IGZhbHNlOwotICAgIENTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtdXRhYmxlU3R5bGUtPmVuZCgp
OwotICAgIGZvciAoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gbXV0YWJsZVN0eWxlLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29u
c3QgQ1NTUHJvcGVydHkgKnByb3BlcnR5ID0gJippdDsKLQotICAgICAgICAvLyBJZiBwb3NpdGlv
biBpcyBlbXB0eSBvciB0aGUgcG9zaXRpb24gcGFzc2VkIGluIGFscmVhZHkgaGFzIHRoZSAKLSAg
ICAgICAgLy8gc3R5bGUsIGp1c3QgbW92ZSBvbi4KLSAgICAgICAgaWYgKHBvc2l0aW9uLmlzTm90
TnVsbCgpICYmIGN1cnJlbnRseUhhc1N0eWxlKHBvc2l0aW9uLCBwcm9wZXJ0eSkpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoYW5naW5nIHRoZSB3aGl0ZXNw
YWNlIHN0eWxlIGluIGEgdGFiIHNwYW4gd291bGQgY29sbGFwc2UgdGhlIHRhYiBpbnRvIGEgc3Bh
Y2UuCi0gICAgICAgIGlmIChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2Ug
JiYgKGlzVGFiU3BhblRleHROb2RlKHBvc2l0aW9uLm5vZGUoKSkgfHwgaXNUYWJTcGFuTm9kZSgo
cG9zaXRpb24ubm9kZSgpKSkpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIAotICAg
ICAgICAvLyBJZiBuZWVkZWQsIGZpZ3VyZSBvdXQgaWYgdGhpcyBjaGFuZ2UgaXMgYSBsZWdhY3kg
SFRNTCBzdHlsZSBjaGFuZ2UuCi0gICAgICAgIGlmICh1c2VIVE1MRm9ybWF0dGluZ1RhZ3MgJiYg
Y2hlY2tGb3JMZWdhY3lIVE1MU3R5bGVDaGFuZ2UocHJvcGVydHkpKQotICAgICAgICAgICAgY29u
dGludWU7CisgICAgUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4gY29tcHV0ZWRT
dHlsZSA9IHBvc2l0aW9uLmNvbXB1dGVkU3R5bGUoKTsKKyAgICBSZWZQdHI8Q1NTTXV0YWJsZVN0
eWxlRGVjbGFyYXRpb24+IG11dGFibGVTdHlsZSA9IGdldFByb3BlcnRpZXNOb3RJbkNvbXB1dGVk
U3R5bGUoc3R5bGUuZ2V0KCksIGNvbXB1dGVkU3R5bGUuZ2V0KCkpOwogCi0gICAgICAgIGlmIChw
cm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eURpcmVjdGlvbikgewotICAgICAgICAgICAgaWYg
KGFkZGVkRGlyZWN0aW9uKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
YWRkZWREaXJlY3Rpb24gPSB0cnVlOwotICAgICAgICB9CisgICAgcmVjb25jaWxlVGV4dERlY29y
YXRpb25Qcm9wZXJ0aWVzKG11dGFibGVTdHlsZS5nZXQoKSk7CisgICAgaWYgKHVzZUhUTUxGb3Jt
YXR0aW5nVGFncykKKyAgICAgICAgZXh0cmFjdFRleHRTdHlsZXMobXV0YWJsZVN0eWxlLmdldCgp
KTsKKworICAgIC8vIENoYW5naW5nIHRoZSB3aGl0ZXNwYWNlIHN0eWxlIGluIGEgdGFiIHNwYW4g
d291bGQgY29sbGFwc2UgdGhlIHRhYiBpbnRvIGEgc3BhY2UuCisgICAgaWYgKGlzVGFiU3BhblRl
eHROb2RlKHBvc2l0aW9uLm5vZGUoKSkgfHwgaXNUYWJTcGFuTm9kZSgocG9zaXRpb24ubm9kZSgp
KSkpCisgICAgICAgIG11dGFibGVTdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlXaGl0
ZVNwYWNlKTsKKworICAgIC8vIElmIHVuaWNvZGUtYmlkaSBpcyBwcmVzZW50IGluIG11dGFibGVT
dHlsZSBhbmQgZGlyZWN0aW9uIGlzIG5vdCwgdGhlbiBhZGQgZGlyZWN0aW9uIHRvIG11dGFibGVT
dHlsZS4KKyAgICAvLyBGSVhNRTogU2hvdWxkbid0IHRoaXMgYmUgZG9uZSBpbiBnZXRQcm9wZXJ0
aWVzTm90SW5Db21wdXRlZFN0eWxlPworICAgIGlmIChtdXRhYmxlU3R5bGUtPmdldFByb3BlcnR5
Q1NTVmFsdWUoQ1NTUHJvcGVydHlVbmljb2RlQmlkaSkgJiYgIXN0eWxlLT5nZXRQcm9wZXJ0eUNT
U1ZhbHVlKENTU1Byb3BlcnR5RGlyZWN0aW9uKSkKKyAgICAgICAgbXV0YWJsZVN0eWxlLT5zZXRQ
cm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgc3R5bGUtPmdldFByb3BlcnR5VmFsdWUoQ1NT
UHJvcGVydHlEaXJlY3Rpb24pKTsKIAotICAgICAgICAvLyBBZGQgdGhpcyBwcm9wZXJ0eQotICAg
ICAgICBpZiAocHJvcGVydHktPmlkKCkgPT0gQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbiB8fCBw
cm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0
KSB7Ci0gICAgICAgICAgICAvLyBBbHdheXMgdXNlIHRleHQtZGVjb3JhdGlvbiBiZWNhdXNlIC13
ZWJraXQtdGV4dC1kZWNvcmF0aW9uLWluLWVmZmVjdCBpcyBpbnRlcm5hbC4KLSAgICAgICAgICAg
IENTU1Byb3BlcnR5IGFsdGVyZWRQcm9wZXJ0eShDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uLCBw
cm9wZXJ0eS0+dmFsdWUoKSwgcHJvcGVydHktPmlzSW1wb3J0YW50KCkpOwotICAgICAgICAgICAg
Ly8gV2UgZG9uJ3QgYWRkICJ0ZXh0LWRlY29yYXRpb246IG5vbmUiIGJlY2F1c2UgaXQgZG9lc24n
dCBvdmVycmlkZSB0aGUgZXhpc3RpbmcgdGV4dCBkZWNvcmF0aW9uczsgaS5lLiByZWR1bmRhbnQK
LSAgICAgICAgICAgIGlmICghZXF1YWxJZ25vcmluZ0Nhc2UoYWx0ZXJlZFByb3BlcnR5LnZhbHVl
KCktPmNzc1RleHQoKSwgIm5vbmUiKSkKLSAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gYWx0
ZXJlZFByb3BlcnR5LmNzc1RleHQoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdHls
ZVRleHQgKz0gcHJvcGVydHktPmNzc1RleHQoKTsKLQotICAgICAgICBpZiAoIWFkZGVkRGlyZWN0
aW9uICYmIHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5VW5pY29kZUJpZGkpIHsKLSAgICAg
ICAgICAgIHN0eWxlVGV4dCArPSAiZGlyZWN0aW9uOiAiICsgc3R5bGUtPmdldFByb3BlcnR5VmFs
dWUoQ1NTUHJvcGVydHlEaXJlY3Rpb24pICsgIjsgIjsKLSAgICAgICAgICAgIGFkZGVkRGlyZWN0
aW9uID0gdHJ1ZTsKLSAgICAgICAgfQorICAgIC8vIFNhdmUgdGhlIHJlc3VsdCBmb3IgbGF0ZXIK
KyAgICBtX2Nzc1N0eWxlID0gbXV0YWJsZVN0eWxlLT5jc3NUZXh0KCkuc3RyaXBXaGl0ZVNwYWNl
KCk7Cit9CisKK3ZvaWQgU3R5bGVDaGFuZ2U6OnJlY29uY2lsZVRleHREZWNvcmF0aW9uUHJvcGVy
dGllcyhDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUpCit7ICAgIAorICAgIFJlZlB0
cjxDU1NWYWx1ZT4gdGV4dERlY29yYXRpb25zSW5FZmZlY3QgPSBzdHlsZS0+Z2V0UHJvcGVydHlD
U1NWYWx1ZShDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0KTsKKyAgICBS
ZWZQdHI8Q1NTVmFsdWU+IHRleHREZWNvcmF0aW9uID0gc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFs
dWUoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbik7CisgICAgLy8gV2Ugc2hvdWxkbid0IGhhdmUg
Ym90aCB0ZXh0LWRlY29yYXRpb24gYW5kIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZl
Y3QgYmVjYXVzZSB0aGF0IHdvdWxkbid0IG1ha2Ugc2Vuc2UuCisgICAgQVNTRVJUKCF0ZXh0RGVj
b3JhdGlvbnNJbkVmZmVjdCB8fCAhdGV4dERlY29yYXRpb24pOworICAgIGlmICh0ZXh0RGVjb3Jh
dGlvbnNJbkVmZmVjdCkgeworICAgICAgICBzdHlsZS0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlU
ZXh0RGVjb3JhdGlvbiwgdGV4dERlY29yYXRpb25zSW5FZmZlY3QtPmNzc1RleHQoKSk7CisgICAg
ICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9u
c0luRWZmZWN0KTsKKyAgICAgICAgdGV4dERlY29yYXRpb24gPSB0ZXh0RGVjb3JhdGlvbnNJbkVm
ZmVjdDsKICAgICB9CiAKLSAgICAvLyBTYXZlIHRoZSByZXN1bHQgZm9yIGxhdGVyCi0gICAgbV9j
c3NTdHlsZSA9IHN0eWxlVGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICAvLyBJZiB0ZXh0LWRl
Y3JhdGlvbiBpcyBzZXQgdG8gIm5vbmUiLCByZW1vdmUgdGhlIHByb3BlcnR5IGJlY2F1c2Ugd2Ug
ZG9uJ3Qgd2FudCB0byBhZGQgcmVkdW5kYW50ICJ0ZXh0LWRlY29yYXRpb246IG5vbmUiLgorICAg
IGlmICh0ZXh0RGVjb3JhdGlvbiAmJiAhdGV4dERlY29yYXRpb24tPmlzVmFsdWVMaXN0KCkpCisg
ICAgICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uKTsK
IH0KIAotLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWFwcGluZyBmcm9tIENTUyBzdHlsZXMgdG8g
c3R5bGluZyB0YWdzIChsaWtlIGZvbnQtd2VpZ2h0OiBib2xkIHRvIDxiPikKLWJvb2wgU3R5bGVD
aGFuZ2U6OmNoZWNrRm9yTGVnYWN5SFRNTFN0eWxlQ2hhbmdlKGNvbnN0IENTU1Byb3BlcnR5KiBw
cm9wZXJ0eSkKK2ludCBnZXRJZGVudGlmaWVyVmFsdWUoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b24qIHN0eWxlLCBpbnQgcHJvcGVydHlJRCkKIHsKLSAgICBpZiAoIXByb3BlcnR5IHx8ICFwcm9w
ZXJ0eS0+dmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIFN0cmluZyB2
YWx1ZVRleHQocHJvcGVydHktPnZhbHVlKCktPmNzc1RleHQoKSk7Ci0gICAgc3dpdGNoIChwcm9w
ZXJ0eS0+aWQoKSkgewotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKLSAgICAg
ICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJib2xkIikpIHsKLSAgICAg
ICAgICAgICAgICBtX2FwcGx5Qm9sZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NQ
cm9wZXJ0eVZlcnRpY2FsQWxpZ246Ci0gICAgICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
dmFsdWVUZXh0LCAic3ViIikpIHsKLSAgICAgICAgICAgICAgICBtX2FwcGx5U3Vic2NyaXB0ID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJzdXBlciIpKSB7Ci0gICAg
ICAgICAgICAgICAgbV9hcHBseVN1cGVyc2NyaXB0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgotICAgICAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKHZhbHVlVGV4dCwgIml0YWxpYyIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwg
Im9ibGlxdWUiKSkgewotICAgICAgICAgICAgICAgIG1fYXBwbHlJdGFsaWMgPSB0cnVlOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjogewotICAgICAgICAgICAgUkdCQTMy
IHJnYmEgPSAwOwotICAgICAgICAgICAgQ1NTUGFyc2VyOjpwYXJzZUNvbG9yKHJnYmEsIHZhbHVl
VGV4dCk7Ci0gICAgICAgICAgICBDb2xvciBjb2xvcihyZ2JhKTsKLSAgICAgICAgICAgIG1fYXBw
bHlGb250Q29sb3IgPSBjb2xvci5uYW1lKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICBpZiAoIXN0eWxlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlZlB0cjxDU1NWYWx1ZT4g
dmFsdWUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wZXJ0eUlEKTsKKyAgICBpZiAo
IXZhbHVlIHx8ICF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlLmdldCgp
KS0+Z2V0SWRlbnQoKTsKK30KKwordm9pZCBTdHlsZUNoYW5nZTo6ZXh0cmFjdFRleHRTdHlsZXMo
Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIHN0eWxlKQoreworICAgIEFTU0VSVChzdHlsZSk7
CisKKyAgICBpZiAoZ2V0SWRlbnRpZmllclZhbHVlKHN0eWxlLCBDU1NQcm9wZXJ0eUZvbnRXZWln
aHQpID09IENTU1ZhbHVlQm9sZCkgeworICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NT
UHJvcGVydHlGb250V2VpZ2h0KTsKKyAgICAgICAgbV9hcHBseUJvbGQgPSB0cnVlOworICAgIH0K
KworICAgIGludCBmb250U3R5bGUgPSBnZXRJZGVudGlmaWVyVmFsdWUoc3R5bGUsIENTU1Byb3Bl
cnR5Rm9udFN0eWxlKTsKKyAgICBpZiAoZm9udFN0eWxlID09IENTU1ZhbHVlSXRhbGljIHx8IGZv
bnRTdHlsZSA9PSBDU1NWYWx1ZU9ibGlxdWUpIHsKKyAgICAgICAgc3R5bGUtPnJlbW92ZVByb3Bl
cnR5KENTU1Byb3BlcnR5Rm9udFN0eWxlKTsKKyAgICAgICAgbV9hcHBseUl0YWxpYyA9IHRydWU7
CisgICAgfQorCisgICAgaW50IHZlcnRpY2FsQWxpZ24gPSBnZXRJZGVudGlmaWVyVmFsdWUoc3R5
bGUsIENTU1Byb3BlcnR5VmVydGljYWxBbGlnbik7CisgICAgc3dpdGNoICh2ZXJ0aWNhbEFsaWdu
KSB7CisgICAgY2FzZSBDU1NWYWx1ZVN1YjoKKyAgICAgICAgc3R5bGUtPnJlbW92ZVByb3BlcnR5
KENTU1Byb3BlcnR5VmVydGljYWxBbGlnbik7CisgICAgICAgIG1fYXBwbHlTdWJzY3JpcHQgPSB0
cnVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1ZhbHVlU3VwZXI6CisgICAgICAgIHN0
eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eVZlcnRpY2FsQWxpZ24pOworICAgICAgICBt
X2FwcGx5U3VwZXJzY3JpcHQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBp
ZiAoUmVmUHRyPENTU1ZhbHVlPiBjb2xvclZhbHVlID0gc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFs
dWUoQ1NTUHJvcGVydHlDb2xvcikpIHsKKyAgICAgICAgQVNTRVJUKGNvbG9yVmFsdWUtPmlzUHJp
bWl0aXZlVmFsdWUoKSk7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVDb2xv
ciA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oY29sb3JWYWx1ZS5nZXQoKSk7Cisg
ICAgICAgIFJHQkEzMiByZ2JhOworICAgICAgICBpZiAocHJpbWl0aXZlQ29sb3ItPnByaW1pdGl2
ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1JHQkNPTE9SKQorICAgICAgICAgICAg
cmdiYSA9IHByaW1pdGl2ZUNvbG9yLT5nZXRSR0JBMzJWYWx1ZSgpOworICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgIENTU1BhcnNlcjo6cGFyc2VDb2xvcihyZ2JhLCBjb2xvclZhbHVlLT5jc3NU
ZXh0KCkpOworICAgICAgICAgICAgLy8gTmVlZCB0byB0YWtlIGNhcmUgb2YgbmFtZWQgY29sb3Ig
c3VjaCBhcyBncmVlbiBhbmQgYmxhY2sKKyAgICAgICAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQg
YmUgcmVtb3ZlZCBhZnRlciBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjgyODIgaXMgZml4ZWQuCiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRG
YW1pbHk6Ci0gICAgICAgICAgICBtX2FwcGx5Rm9udEZhY2UgPSB2YWx1ZVRleHQ7Ci0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXplOgotICAg
ICAgICAgICAgaWYgKHByb3BlcnR5LT52YWx1ZSgpLT5jc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1
ZTo6Q1NTX1BSSU1JVElWRV9WQUxVRSkgewotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZh
bHVlICp2YWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlICo+KHByb3BlcnR5LT52
YWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS0+cHJpbWl0aXZlVHlwZSgpIDwg
Q1NTUHJpbWl0aXZlVmFsdWU6OkNTU19QWCB8fCB2YWx1ZS0+cHJpbWl0aXZlVHlwZSgpID4gQ1NT
UHJpbWl0aXZlVmFsdWU6OkNTU19QQykKLSAgICAgICAgICAgICAgICAgICAgLy8gU2l6ZSBrZXl3
b3JkIG9yIHJlbGF0aXZlIHVuaXQuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
IAorICAgICAgICBtX2FwcGx5Rm9udENvbG9yID0gQ29sb3IocmdiYSkubmFtZSgpOworICAgICAg
ICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlDb2xvcik7CisgICAgfQorCisgICAg
bV9hcHBseUZvbnRGYWNlID0gc3R5bGUtPmdldFByb3BlcnR5VmFsdWUoQ1NTUHJvcGVydHlGb250
RmFtaWx5KTsKKyAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlGb250RmFtaWx5
KTsKKworICAgIGlmIChSZWZQdHI8Q1NTVmFsdWU+IGZvbnRTaXplID0gc3R5bGUtPmdldFByb3Bl
cnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlGb250U2l6ZSkpIHsKKyAgICAgICAgaWYgKCFmb250U2l6
ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgc3R5bGUtPnJlbW92ZVByb3BlcnR5
KENTU1Byb3BlcnR5Rm9udFNpemUpOyAvLyBDYW4ndCBtYWtlIHNlbnNlIG9mIHRoZSBudW1iZXIu
IFB1dCBubyBmb250IHNpemUuCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihmb250U2l6
ZS5nZXQoKSk7CisKKyAgICAgICAgICAgIC8vIE9ubHkgYWNjZXB0IGFic29sdXRlIHNjYWxlCisg
ICAgICAgICAgICBpZiAodmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA+PSBDU1NQcmltaXRpdmVWYWx1
ZTo6Q1NTX1BYICYmIHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPD0gQ1NTUHJpbWl0aXZlVmFsdWU6
OkNTU19QQykgewogICAgICAgICAgICAgICAgIGZsb2F0IG51bWJlciA9IHZhbHVlLT5nZXRGbG9h
dFZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFgpOwogICAgICAgICAgICAgICAgIGlmIChu
dW1iZXIgPD0gOSkKICAgICAgICAgICAgICAgICAgICAgbV9hcHBseUZvbnRTaXplID0gIjEiOwpA
QCAtMjExLDM0ICsyMTgsMTIgQEAgYm9vbCBTdHlsZUNoYW5nZTo6Y2hlY2tGb3JMZWdhY3lIVE1M
U3R5bAogICAgICAgICAgICAgICAgICAgICBtX2FwcGx5Rm9udFNpemUgPSAiNiI7CiAgICAgICAg
ICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBtX2FwcGx5Rm9udFNpemUgPSAiNyI7
Ci0gICAgICAgICAgICAgICAgLy8gSHVnZSBxdWlyayBpbiBNaWNyb3NmdCBFbnRvdXJhZ2UgaXMg
dGhhdCB0aGV5IHVuZGVyc3RhbmQgQ1NTIGZvbnQtc2l6ZSwgYnV0IGFsc28gd3JpdGUgCi0gICAg
ICAgICAgICAgICAgLy8gb3V0IGxlZ2FjeSAxLTcgdmFsdWVzIGluIGZvbnQgdGFncyAoSSBndWVz
cyBmb3IgbWFpbGVycyB0aGF0IGFyZSBub3QgQ1NTLXNhdnZ5IGF0IGFsbCwgCi0gICAgICAgICAg
ICAgICAgLy8gbGlrZSBFdWRvcmEpLiBZZXMsIHRoZXkgd3JpdGUgb3V0ICpib3RoKi4gV2UgbmVl
ZCB0byB3cml0ZSBvdXQgYm90aCBhcyB3ZWxsLiBSZXR1cm4gZmFsc2UuCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAg
ICAgICAgICAgICAgIC8vIENhbid0IG1ha2Ugc2Vuc2Ugb2YgdGhlIG51bWJlci4gUHV0IG5vIGZv
bnQgc2l6ZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIC8vIEh1Z2UgcXVpcmsgaW4gTWljcm9zZnQgRW50b3VyYWdlIGlzIHRoYXQgdGhl
eSB1bmRlcnN0YW5kIENTUyBmb250LXNpemUsIGJ1dCBhbHNvIHdyaXRlIAorICAgICAgICAgICAg
Ly8gb3V0IGxlZ2FjeSAxLTcgdmFsdWVzIGluIGZvbnQgdGFncyAoSSBndWVzcyBmb3IgbWFpbGVy
cyB0aGF0IGFyZSBub3QgQ1NTLXNhdnZ5IGF0IGFsbCwgCisgICAgICAgICAgICAvLyBsaWtlIEV1
ZG9yYSkuIFllcywgdGhleSB3cml0ZSBvdXQgKmJvdGgqLiBXZSBuZWVkIHRvIHdyaXRlIG91dCBi
b3RoIGFzIHdlbGwuCisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIFN0eWxlQ2hhbmdlOjpjdXJyZW50bHlIYXNTdHlsZShjb25zdCBQb3NpdGlvbiAmcG9zLCBj
b25zdCBDU1NQcm9wZXJ0eSAqcHJvcGVydHkpCi17Ci0gICAgQVNTRVJUKHBvcy5pc05vdE51bGwo
KSk7Ci0gICAgUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4gc3R5bGUgPSBwb3Mu
Y29tcHV0ZWRTdHlsZSgpOwotICAgIFJlZlB0cjxDU1NWYWx1ZT4gdmFsdWU7Ci0gICAgaWYgKHBy
b3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5Rm9udFNpemUpCi0gICAgICAgIHZhbHVlID0gc3R5
bGUtPmdldEZvbnRTaXplQ1NTVmFsdWVQcmVmZXJyaW5nS2V5d29yZCgpOwotICAgIC8vIFdlIG5l
ZWQgdG8gdXNlIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3QgdG8gdGFrZSBjYXJl
IG9mIHRleHQgZGVjb3JhdGlvbnMgc2V0IGJ5IHUsIHMsIGFuZCBzdHJpa2UKLSAgICBlbHNlIGlm
IChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uKQotICAgICAgICB2
YWx1ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1Byb3BlcnR5V2Via2l0VGV4dERl
Y29yYXRpb25zSW5FZmZlY3QpOwotICAgIGVsc2UKLSAgICAgICAgdmFsdWUgPSBzdHlsZS0+Z2V0
UHJvcGVydHlDU1NWYWx1ZShwcm9wZXJ0eS0+aWQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZS0+Y3Nz
VGV4dCgpLCBwcm9wZXJ0eS0+dmFsdWUoKS0+Y3NzVGV4dCgpKTsKIH0KIAogc3RhdGljIFN0cmlu
ZyYgc3R5bGVTcGFuQ2xhc3NTdHJpbmcoKQpAQCAtMzEwLDI3ICsyOTUsOSBAQCBSZWZQdHI8Q1NT
TXV0YWJsZVN0eWxlRGVjbGFyYXRpb24+IGdldFByCiAgICAgUmVmUHRyPENTU011dGFibGVTdHls
ZURlY2xhcmF0aW9uPiByZXN1bHQgPSBzdHlsZS0+Y29weSgpOwogICAgIGNvbXB1dGVkU3R5bGUt
PmRpZmYocmVzdWx0LmdldCgpKTsKIAotICAgIC8vIElmIHRleHQgZGVjb3JhdGlvbnMgaW4gZWZm
ZWN0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb21wdXRlZCBzdHlsZSwgdGhlbiB0aGVyZSBpcyBu
b3RoaW5nIHRvIHJlbW92ZSBmcm9tIHJlc3VsdAotICAgIFJlZlB0cjxDU1NWYWx1ZT4gY29tcHV0
ZWRWYWx1ZSA9IGNvbXB1dGVkU3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlX
ZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCk7Ci0gICAgaWYgKCFjb21wdXRlZFZhbHVlIHx8
ICFjb21wdXRlZFZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1cm4gcmVzdWx0Owot
Ci0gICAgLy8gVGFrZSBjYXJlIG9mIGJvdGggdGV4dC1kZWNvcmF0aW9uIGFuZCAtd2Via2l0LXRl
eHQtZGVjb3JhdGlvbnMtaW4tZWZmZWN0Ci0gICAgc3RhdGljIGNvbnN0IGludCB0ZXh0RGVjb3Jh
dGlvblByb3BlcnRpZXNbXT17Q1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbiwgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdH07Ci0gICAgZm9yIChzaXplX3QgbiA9IDA7IG4g
PCBzaXplb2YodGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzKS9zaXplb2YodGV4dERlY29yYXRpb25Q
cm9wZXJ0aWVzWzFdKTsgbisrKSB7Ci0gICAgICAgIFJlZlB0cjxDU1NWYWx1ZT4gc3R5bGVWYWx1
ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHRleHREZWNvcmF0aW9uUHJvcGVydGllc1tu
XSk7Ci0gICAgICAgIGlmICghc3R5bGVWYWx1ZSB8fCAhc3R5bGVWYWx1ZS0+aXNWYWx1ZUxpc3Qo
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIENTU1ZhbHVlTGlzdCogZGVzaXJl
ZFZhbHVlTGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHN0eWxlVmFsdWUuZ2V0KCkp
OwotICAgICAgICBDU1NWYWx1ZUxpc3QqIGNvbXB1dGVkVmFsdWVMaXN0ID0gc3RhdGljX2Nhc3Q8
Q1NTVmFsdWVMaXN0Kj4oY29tcHV0ZWRWYWx1ZS5nZXQoKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgZGVzaXJlZFZhbHVlTGlzdC0+bGVuZ3RoKCk7IGkrKykgewotICAgICAgICAg
ICAgaWYgKCFjb21wdXRlZFZhbHVlTGlzdC0+aGFzVmFsdWUoZGVzaXJlZFZhbHVlTGlzdC0+aXRl
bShpKSkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnJlbW92ZVByb3BlcnR5KHRleHREZWNv
cmF0aW9uUHJvcGVydGllc1tuXSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgLy8gaWYgdGV4dC1kZWNvcmF0aW9uIGlzIGVxdWFs
IHRvIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3QsIHRoZW4gZG9uJ3QgYWRkIHRo
ZSBwcm9wZXJ0eS4KKyAgICBpZiAocmVzdWx0LT5nZXRQcm9wZXJ0eVZhbHVlKENTU1Byb3BlcnR5
VGV4dERlY29yYXRpb24pID09IGNvbXB1dGVkU3R5bGUtPmdldFByb3BlcnR5VmFsdWUoQ1NTUHJv
cGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCkpCisgICAgICAgIHJlc3VsdC0+cmVt
b3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbik7CiAKICAgICByZXR1cm4gcmVz
dWx0OwogfQpAQCAtNDI0LDcgKzM5MSw3IEBAIHZvaWQgcmVtb3ZlU3R5bGVzQWRkZWRCeU5vZGUo
Q1NTTXV0YWJsZVMKICAgICBwYXJlbnRTdHlsZS0+ZGlmZihzdHlsZS5nZXQoKSk7CiAgICAgc3R5
bGUtPmRpZmYoZWRpdGluZ1N0eWxlKTsKIH0KLSAgICAKKwogQXBwbHlTdHlsZUNvbW1hbmQ6OkFw
cGx5U3R5bGVDb21tYW5kKERvY3VtZW50KiBkb2N1bWVudCwgQ1NTU3R5bGVEZWNsYXJhdGlvbiog
c3R5bGUsIEVkaXRBY3Rpb24gZWRpdGluZ0FjdGlvbiwgRVByb3BlcnR5TGV2ZWwgcHJvcGVydHlM
ZXZlbCkKICAgICA6IENvbXBvc2l0ZUVkaXRDb21tYW5kKGRvY3VtZW50KQogICAgICwgbV9zdHls
ZShzdHlsZS0+bWFrZU11dGFibGUoKSkK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34998</attachid>
            <date>2009-08-17 16:06:59 -0700</date>
            <delta_ts>2009-08-18 17:01:36 -0700</delta_ts>
            <desc>made formatted diff more readable</desc>
            <filename>fix27749g</filename>
            <type>text/plain</type>
            <size>15410</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NzM5NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMDktMDgtMTcgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3R5
bGVDaGFuZ2U6OmluaXQgbmVlZHMgY2xlYW4gdXAgYmVmb3JlIGZpeGluZyB0aGUgYnVnIDIzODky
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzc0OQor
CisgICAgICAgIFRoaXMgcGF0Y2ggc2ltcGxpZmllcyBTdHlsZUNoYW5nZTo6aW5pdCBieSByZW1v
dmluZyB0aGUgaXRlcmF0aW9uIG9uIENTUyBwcm9wZXJ0aWVzLAorICAgICAgICBhbmQgYWRkaW5n
IGZ1bmN0aW9ucyByZWNvbmNpbGVUZXh0RGVjb3JhdGlvblByb3BlcnRpZXMgYW5kIGV4dHJhY3RU
ZXh0U3R5bGUgdG8gaGFuZGxlIHRoZSBzdHlsZS4KKworICAgICAgICBCZWNhdXNlIHRoZXJlIGlz
IGEgYnVnIGluIGhvdyB0ZXh0IGRlY29yYXRpb25zIGFyZSBwcm9jZXNzZXMgaW4gZ2V0UHJvcGVy
dGllc05vdEluQ29tcHV0ZWRTdHlsZSwKKyAgICAgICAgdGhpcyBwYXRjaCBzaW1wbGlmaWVzIHRo
ZSB0cmVhdG1lbnQgaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsIGJlaGF2aW9yIG9m
IFdlYktpdC4KKyAgICAgICAgSG93ZXZlciwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMg
bm90IGJlc3QgKGFkZHMgcmVkdW5kYW50IHRleHQtZGVjb3JhdGlvbnMpIGFuZCB3ZSBzaG91bGQg
Zml4IGl0IGxhdGVyLgorCisgICAgICAgIE5vIHRlc3QgaXMgYWRkZWQgc2luY2UgdGhlcmUgaXMg
bm8gY2hhbmdlIGluIGJlaGF2aW9yLgorCisgICAgICAgICogZWRpdGluZy9BcHBseVN0eWxlQ29t
bWFuZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZUNoYW5nZTo6aW5pdCk6IFVzZXMgZ2V0
UHJvcGVydGllc05vdEluQ29tcHV0ZWRTdHlsZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdo
IHRoZSBwcm9wZXJ0aWVzCisgICAgICAgIChXZWJDb3JlOjpTdHlsZUNoYW5nZTo6cmVjb25jaWxl
VGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzKTogUmVtb3ZlcyAtd2Via2l0LXRleHQtZGVjb3JhdGlv
bnMtaW4tZWZmZWN0cyBhbmQgcmVkdW5kYW50ICJub25lIgorICAgICAgICAoV2ViQ29yZTo6Z2V0
SWRlbnRpZmllclZhbHVlKTogT2J0YWlucyB0aGUgaWRlbnRpZmllciBvZiBhIENTU1ByaW1pdGl2
ZVZhbHVlCisgICAgICAgIChXZWJDb3JlOjpTdHlsZUNoYW5nZTo6ZXh0cmFjdFRleHRTdHlsZXMp
OiBDb252ZXJ0cyBwcm9wZXJ0aWVzIGluIHN0eWxlIHRvIG1fYXBwbHkqIGFuZCByZW1vdmVzIHRo
ZSBwcm9wZXJ0eQorICAgICAgICAoV2ViQ29yZTo6Z2V0UHJvcGVydGllc05vdEluQ29tcHV0ZWRT
dHlsZSk6IEZpeGVkIGEgYnVnIHdpdGggaG93IHRleHQgZGVjb3JhdGlvbnMgYXJlIHRyZWF0ZWQK
KwogMjAwOS0wOC0xNyAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFwcGxlLmNvbT4KIAogICAg
ICAgICBUcnlpbmcgdG8gZml4IFdpbmRvd3MgYnVpbGQuCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcv
QXBwbHlTdHlsZUNvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9BcHBs
eVN0eWxlQ29tbWFuZC5jcHAJKHJldmlzaW9uIDQ3Mzg4KQorKysgV2ViQ29yZS9lZGl0aW5nL0Fw
cGx5U3R5bGVDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzAsOSArNzAsOSBAQCBwdWJs
aWM6CiAKIHByaXZhdGU6CiAgICAgdm9pZCBpbml0KFBhc3NSZWZQdHI8Q1NTU3R5bGVEZWNsYXJh
dGlvbj4sIGNvbnN0IFBvc2l0aW9uJik7Ci0gICAgYm9vbCBjaGVja0ZvckxlZ2FjeUhUTUxTdHls
ZUNoYW5nZShjb25zdCBDU1NQcm9wZXJ0eSopOwotICAgIHN0YXRpYyBib29sIGN1cnJlbnRseUhh
c1N0eWxlKGNvbnN0IFBvc2l0aW9uJiwgY29uc3QgQ1NTUHJvcGVydHkqKTsKLSAgICAKKyAgICB2
b2lkIHJlY29uY2lsZVRleHREZWNvcmF0aW9uUHJvcGVydGllcyhDU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbiopOworICAgIHZvaWQgZXh0cmFjdFRleHRTdHlsZXMoQ1NTTXV0YWJsZVN0eWxlRGVj
bGFyYXRpb24qKTsKKwogICAgIFN0cmluZyBtX2Nzc1N0eWxlOwogICAgIGJvb2wgbV9hcHBseUJv
bGQ7CiAgICAgYm9vbCBtX2FwcGx5SXRhbGljOwpAQCAtOTksMTAzICs5OSwxMDcgQEAgdm9pZCBT
dHlsZUNoYW5nZTo6aW5pdChQYXNzUmVmUHRyPENTU1N0eQogICAgIGlmICghZG9jdW1lbnQgfHwg
IWRvY3VtZW50LT5mcmFtZSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBib29sIHVzZUhUTUxG
b3JtYXR0aW5nVGFncyA9ICFkb2N1bWVudC0+ZnJhbWUoKS0+ZWRpdG9yKCktPnNob3VsZFN0eWxl
V2l0aENTUygpOwotICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbj4gbXV0YWJs
ZVN0eWxlID0gc3R5bGUtPm1ha2VNdXRhYmxlKCk7Ci0gICAgLy8gV2Ugc2hvdWxkbid0IGhhdmUg
Ym90aCB0ZXh0LWRlY29yYXRpb24gYW5kIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZl
Y3QgYmVjYXVzZSB0aGF0IHdvdWxkbid0IG1ha2Ugc2Vuc2UuCi0gICAgQVNTRVJUKCFtdXRhYmxl
U3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbikgfHwg
IW11dGFibGVTdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eVdlYmtpdFRleHRE
ZWNvcmF0aW9uc0luRWZmZWN0KSk7Ci0gICAgU3RyaW5nIHN0eWxlVGV4dCgiIik7Ci0gICAgYm9v
bCBhZGRlZERpcmVjdGlvbiA9IGZhbHNlOwotICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9u
Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtdXRhYmxlU3R5bGUtPmVuZCgpOwotICAgIGZvciAoQ1NT
TXV0YWJsZVN0eWxlRGVjbGFyYXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbXV0YWJsZVN0eWxl
LT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgQ1NTUHJvcGVydHkg
KnByb3BlcnR5ID0gJippdDsKLQotICAgICAgICAvLyBJZiBwb3NpdGlvbiBpcyBlbXB0eSBvciB0
aGUgcG9zaXRpb24gcGFzc2VkIGluIGFscmVhZHkgaGFzIHRoZSAKLSAgICAgICAgLy8gc3R5bGUs
IGp1c3QgbW92ZSBvbi4KLSAgICAgICAgaWYgKHBvc2l0aW9uLmlzTm90TnVsbCgpICYmIGN1cnJl
bnRseUhhc1N0eWxlKHBvc2l0aW9uLCBwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgCi0gICAgICAgIC8vIENoYW5naW5nIHRoZSB3aGl0ZXNwYWNlIHN0eWxlIGluIGEg
dGFiIHNwYW4gd291bGQgY29sbGFwc2UgdGhlIHRhYiBpbnRvIGEgc3BhY2UuCi0gICAgICAgIGlm
IChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2UgJiYgKGlzVGFiU3BhblRl
eHROb2RlKHBvc2l0aW9uLm5vZGUoKSkgfHwgaXNUYWJTcGFuTm9kZSgocG9zaXRpb24ubm9kZSgp
KSkpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBuZWVk
ZWQsIGZpZ3VyZSBvdXQgaWYgdGhpcyBjaGFuZ2UgaXMgYSBsZWdhY3kgSFRNTCBzdHlsZSBjaGFu
Z2UuCi0gICAgICAgIGlmICh1c2VIVE1MRm9ybWF0dGluZ1RhZ3MgJiYgY2hlY2tGb3JMZWdhY3lI
VE1MU3R5bGVDaGFuZ2UocHJvcGVydHkpKQotICAgICAgICAgICAgY29udGludWU7CisgICAgUmVm
UHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4gY29tcHV0ZWRTdHlsZSA9IHBvc2l0aW9u
LmNvbXB1dGVkU3R5bGUoKTsKKyAgICBSZWZQdHI8Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24+
IG11dGFibGVTdHlsZSA9IGdldFByb3BlcnRpZXNOb3RJbkNvbXB1dGVkU3R5bGUoc3R5bGUuZ2V0
KCksIGNvbXB1dGVkU3R5bGUuZ2V0KCkpOwogCi0gICAgICAgIGlmIChwcm9wZXJ0eS0+aWQoKSA9
PSBDU1NQcm9wZXJ0eURpcmVjdGlvbikgewotICAgICAgICAgICAgaWYgKGFkZGVkRGlyZWN0aW9u
KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYWRkZWREaXJlY3Rpb24g
PSB0cnVlOwotICAgICAgICB9CisgICAgcmVjb25jaWxlVGV4dERlY29yYXRpb25Qcm9wZXJ0aWVz
KG11dGFibGVTdHlsZS5nZXQoKSk7CisgICAgaWYgKCFkb2N1bWVudC0+ZnJhbWUoKS0+ZWRpdG9y
KCktPnNob3VsZFN0eWxlV2l0aENTUygpKQorICAgICAgICBleHRyYWN0VGV4dFN0eWxlcyhtdXRh
YmxlU3R5bGUuZ2V0KCkpOworCisgICAgLy8gQ2hhbmdpbmcgdGhlIHdoaXRlc3BhY2Ugc3R5bGUg
aW4gYSB0YWIgc3BhbiB3b3VsZCBjb2xsYXBzZSB0aGUgdGFiIGludG8gYSBzcGFjZS4KKyAgICBp
ZiAoaXNUYWJTcGFuVGV4dE5vZGUocG9zaXRpb24ubm9kZSgpKSB8fCBpc1RhYlNwYW5Ob2RlKChw
b3NpdGlvbi5ub2RlKCkpKSkKKyAgICAgICAgbXV0YWJsZVN0eWxlLT5yZW1vdmVQcm9wZXJ0eShD
U1NQcm9wZXJ0eVdoaXRlU3BhY2UpOworCisgICAgLy8gSWYgdW5pY29kZS1iaWRpIGlzIHByZXNl
bnQgaW4gbXV0YWJsZVN0eWxlIGFuZCBkaXJlY3Rpb24gaXMgbm90LCB0aGVuIGFkZCBkaXJlY3Rp
b24gdG8gbXV0YWJsZVN0eWxlLgorICAgIC8vIEZJWE1FOiBTaG91bGRuJ3QgdGhpcyBiZSBkb25l
IGluIGdldFByb3BlcnRpZXNOb3RJbkNvbXB1dGVkU3R5bGU/CisgICAgaWYgKG11dGFibGVTdHls
ZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpKSAmJiAhc3R5bGUt
PmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlEaXJlY3Rpb24pKQorICAgICAgICBtdXRh
YmxlU3R5bGUtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBzdHlsZS0+Z2V0UHJv
cGVydHlWYWx1ZShDU1NQcm9wZXJ0eURpcmVjdGlvbikpOwogCi0gICAgICAgIC8vIEFkZCB0aGlz
IHByb3BlcnR5Ci0gICAgICAgIGlmIChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVRleHRE
ZWNvcmF0aW9uIHx8IHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29y
YXRpb25zSW5FZmZlY3QpIHsKLSAgICAgICAgICAgIC8vIEFsd2F5cyB1c2UgdGV4dC1kZWNvcmF0
aW9uIGJlY2F1c2UgLXdlYmtpdC10ZXh0LWRlY29yYXRpb24taW4tZWZmZWN0IGlzIGludGVybmFs
LgotICAgICAgICAgICAgQ1NTUHJvcGVydHkgYWx0ZXJlZFByb3BlcnR5KENTU1Byb3BlcnR5VGV4
dERlY29yYXRpb24sIHByb3BlcnR5LT52YWx1ZSgpLCBwcm9wZXJ0eS0+aXNJbXBvcnRhbnQoKSk7
Ci0gICAgICAgICAgICAvLyBXZSBkb24ndCBhZGQgInRleHQtZGVjb3JhdGlvbjogbm9uZSIgYmVj
YXVzZSBpdCBkb2Vzbid0IG92ZXJyaWRlIHRoZSBleGlzdGluZyB0ZXh0IGRlY29yYXRpb25zOyBp
LmUuIHJlZHVuZGFudAotICAgICAgICAgICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShhbHRlcmVk
UHJvcGVydHkudmFsdWUoKS0+Y3NzVGV4dCgpLCAibm9uZSIpKQotICAgICAgICAgICAgICAgIHN0
eWxlVGV4dCArPSBhbHRlcmVkUHJvcGVydHkuY3NzVGV4dCgpOwotICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgIHN0eWxlVGV4dCArPSBwcm9wZXJ0eS0+Y3NzVGV4dCgpOworICAgIC8vIFNhdmUg
dGhlIHJlc3VsdCBmb3IgbGF0ZXIKKyAgICBtX2Nzc1N0eWxlID0gbXV0YWJsZVN0eWxlLT5jc3NU
ZXh0KCkuc3RyaXBXaGl0ZVNwYWNlKCk7Cit9CiAKLSAgICAgICAgaWYgKCFhZGRlZERpcmVjdGlv
biAmJiBwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpKSB7Ci0gICAgICAg
ICAgICBzdHlsZVRleHQgKz0gImRpcmVjdGlvbjogIiArIHN0eWxlLT5nZXRQcm9wZXJ0eVZhbHVl
KENTU1Byb3BlcnR5RGlyZWN0aW9uKSArICI7ICI7Ci0gICAgICAgICAgICBhZGRlZERpcmVjdGlv
biA9IHRydWU7Ci0gICAgICAgIH0KK3ZvaWQgU3R5bGVDaGFuZ2U6OnJlY29uY2lsZVRleHREZWNv
cmF0aW9uUHJvcGVydGllcyhDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUpCit7ICAg
IAorICAgIFJlZlB0cjxDU1NWYWx1ZT4gdGV4dERlY29yYXRpb25zSW5FZmZlY3QgPSBzdHlsZS0+
Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZm
ZWN0KTsKKyAgICBSZWZQdHI8Q1NTVmFsdWU+IHRleHREZWNvcmF0aW9uID0gc3R5bGUtPmdldFBy
b3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbik7CisgICAgLy8gV2Ugc2hv
dWxkbid0IGhhdmUgYm90aCB0ZXh0LWRlY29yYXRpb24gYW5kIC13ZWJraXQtdGV4dC1kZWNvcmF0
aW9ucy1pbi1lZmZlY3QgYmVjYXVzZSB0aGF0IHdvdWxkbid0IG1ha2Ugc2Vuc2UuCisgICAgQVNT
RVJUKCF0ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCB8fCAhdGV4dERlY29yYXRpb24pOworICAgIGlm
ICh0ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCkgeworICAgICAgICBzdHlsZS0+c2V0UHJvcGVydHko
Q1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbiwgdGV4dERlY29yYXRpb25zSW5FZmZlY3QtPmNzc1Rl
eHQoKSk7CisgICAgICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eVdlYmtpdFRl
eHREZWNvcmF0aW9uc0luRWZmZWN0KTsKKyAgICAgICAgdGV4dERlY29yYXRpb24gPSB0ZXh0RGVj
b3JhdGlvbnNJbkVmZmVjdDsKICAgICB9CiAKLSAgICAvLyBTYXZlIHRoZSByZXN1bHQgZm9yIGxh
dGVyCi0gICAgbV9jc3NTdHlsZSA9IHN0eWxlVGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICAv
LyBJZiB0ZXh0LWRlY3JhdGlvbiBpcyBzZXQgdG8gIm5vbmUiLCByZW1vdmUgdGhlIHByb3BlcnR5
IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhZGQgcmVkdW5kYW50ICJ0ZXh0LWRlY29yYXRpb246
IG5vbmUiLgorICAgIGlmICh0ZXh0RGVjb3JhdGlvbiAmJiAhdGV4dERlY29yYXRpb24tPmlzVmFs
dWVMaXN0KCkpCisgICAgICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eVRleHRE
ZWNvcmF0aW9uKTsKIH0KIAotLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWFwcGluZyBmcm9tIENT
UyBzdHlsZXMgdG8gc3R5bGluZyB0YWdzIChsaWtlIGZvbnQtd2VpZ2h0OiBib2xkIHRvIDxiPikK
LWJvb2wgU3R5bGVDaGFuZ2U6OmNoZWNrRm9yTGVnYWN5SFRNTFN0eWxlQ2hhbmdlKGNvbnN0IENT
U1Byb3BlcnR5KiBwcm9wZXJ0eSkKK2ludCBnZXRJZGVudGlmaWVyVmFsdWUoQ1NTTXV0YWJsZVN0
eWxlRGVjbGFyYXRpb24qIHN0eWxlLCBpbnQgcHJvcGVydHlJRCkKIHsKLSAgICBpZiAoIXByb3Bl
cnR5IHx8ICFwcm9wZXJ0eS0+dmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAot
ICAgIFN0cmluZyB2YWx1ZVRleHQocHJvcGVydHktPnZhbHVlKCktPmNzc1RleHQoKSk7Ci0gICAg
c3dpdGNoIChwcm9wZXJ0eS0+aWQoKSkgewotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdl
aWdodDoKLSAgICAgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJib2xk
IikpIHsKLSAgICAgICAgICAgICAgICBtX2FwcGx5Qm9sZCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBDU1NQcm9wZXJ0eVZlcnRpY2FsQWxpZ246Ci0gICAgICAgICAgICBpZiAoZXF1YWxJ
Z25vcmluZ0Nhc2UodmFsdWVUZXh0LCAic3ViIikpIHsKLSAgICAgICAgICAgICAgICBtX2FwcGx5
U3Vic2NyaXB0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2YWx1ZVRleHQsICJzdXBl
ciIpKSB7Ci0gICAgICAgICAgICAgICAgbV9hcHBseVN1cGVyc2NyaXB0ID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgotICAgICAgICAgICAgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHZhbHVlVGV4dCwgIml0YWxpYyIpIHx8IGVxdWFsSWdub3JpbmdDYXNl
KHZhbHVlVGV4dCwgIm9ibGlxdWUiKSkgewotICAgICAgICAgICAgICAgIG1fYXBwbHlJdGFsaWMg
PSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjogewotICAgICAg
ICAgICAgUkdCQTMyIHJnYmEgPSAwOwotICAgICAgICAgICAgQ1NTUGFyc2VyOjpwYXJzZUNvbG9y
KHJnYmEsIHZhbHVlVGV4dCk7Ci0gICAgICAgICAgICBDb2xvciBjb2xvcihyZ2JhKTsKLSAgICAg
ICAgICAgIG1fYXBwbHlGb250Q29sb3IgPSBjb2xvci5uYW1lKCk7Ci0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseToK
LSAgICAgICAgICAgIG1fYXBwbHlGb250RmFjZSA9IHZhbHVlVGV4dDsKLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgICAgICAg
ICBpZiAocHJvcGVydHktPnZhbHVlKCktPmNzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlOjpDU1Nf
UFJJTUlUSVZFX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUgKnZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUgKj4ocHJvcGVydHktPnZhbHVlKCkp
OwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPCBDU1NQcmlt
aXRpdmVWYWx1ZTo6Q1NTX1BYIHx8IHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPiBDU1NQcmltaXRp
dmVWYWx1ZTo6Q1NTX1BDKQotICAgICAgICAgICAgICAgICAgICAvLyBTaXplIGtleXdvcmQgb3Ig
cmVsYXRpdmUgdW5pdC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
ICghc3R5bGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgUmVmUHRyPENTU1ZhbHVlPiB2YWx1
ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHByb3BlcnR5SUQpOworICAgIGlmICghdmFs
dWUgfHwgIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUuZ2V0KCkpLT5n
ZXRJZGVudCgpOworfQorCit2b2lkIFN0eWxlQ2hhbmdlOjpleHRyYWN0VGV4dFN0eWxlcyhDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUpCit7CisgICAgQVNTRVJUKHN0eWxlKTsKKwor
ICAgIGlmIChnZXRJZGVudGlmaWVyVmFsdWUoc3R5bGUsIENTU1Byb3BlcnR5Rm9udFdlaWdodCkg
PT0gQ1NTVmFsdWVCb2xkKSB7CisgICAgICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9w
ZXJ0eUZvbnRXZWlnaHQpOworICAgICAgICBtX2FwcGx5Qm9sZCA9IHRydWU7CisgICAgfQorCisg
ICAgaW50IGZvbnRTdHlsZSA9IGdldElkZW50aWZpZXJWYWx1ZShzdHlsZSwgQ1NTUHJvcGVydHlG
b250U3R5bGUpOworICAgIGlmIChmb250U3R5bGUgPT0gQ1NTVmFsdWVJdGFsaWMgfHwgZm9udFN0
eWxlID09IENTU1ZhbHVlT2JsaXF1ZSkgeworICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHko
Q1NTUHJvcGVydHlGb250U3R5bGUpOworICAgICAgICBtX2FwcGx5SXRhbGljID0gdHJ1ZTsKKyAg
ICB9CisKKyAgICBpbnQgdmVydGljYWxBbGlnbiA9IGdldElkZW50aWZpZXJWYWx1ZShzdHlsZSwg
Q1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduKTsKKyAgICBzd2l0Y2ggKHZlcnRpY2FsQWxpZ24pIHsK
KyAgICBjYXNlIENTU1ZhbHVlU3ViOgorICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NT
UHJvcGVydHlWZXJ0aWNhbEFsaWduKTsKKyAgICAgICAgbV9hcHBseVN1YnNjcmlwdCA9IHRydWU7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTVmFsdWVTdXBlcjoKKyAgICAgICAgc3R5bGUt
PnJlbW92ZVByb3BlcnR5KENTU1Byb3BlcnR5VmVydGljYWxBbGlnbik7CisgICAgICAgIG1fYXBw
bHlTdXBlcnNjcmlwdCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChS
ZWZQdHI8Q1NTVmFsdWU+IGNvbG9yVmFsdWUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShD
U1NQcm9wZXJ0eUNvbG9yKSkgeworICAgICAgICBBU1NFUlQoY29sb3JWYWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpKTsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZUNvbG9yID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjb2xvclZhbHVlLmdldCgpKTsKKyAgICAg
ICAgUkdCQTMyIHJnYmE7CisgICAgICAgIGlmIChwcmltaXRpdmVDb2xvci0+cHJpbWl0aXZlVHlw
ZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUkdCQ09MT1IpIHsKKyAgICAgICAgICAgIENT
U1BhcnNlcjo6cGFyc2VDb2xvcihyZ2JhLCBjb2xvclZhbHVlLT5jc3NUZXh0KCkpOworICAgICAg
ICAgICAgLy8gTmVlZCB0byB0YWtlIGNhcmUgb2YgbmFtZWQgY29sb3Igc3VjaCBhcyBncmVlbiBh
bmQgYmxhY2sKKyAgICAgICAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgYmUgcmVtb3ZlZCBhZnRl
ciBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjgyODIgaXMgZml4ZWQu
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmdiYSA9IHByaW1pdGl2ZUNvbG9yLT5nZXRS
R0JBMzJWYWx1ZSgpOworICAgICAgICBtX2FwcGx5Rm9udENvbG9yID0gQ29sb3IocmdiYSkubmFt
ZSgpOworICAgICAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlDb2xvcik7Cisg
ICAgfQorCisgICAgbV9hcHBseUZvbnRGYWNlID0gc3R5bGUtPmdldFByb3BlcnR5VmFsdWUoQ1NT
UHJvcGVydHlGb250RmFtaWx5KTsKKyAgICBzdHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVy
dHlGb250RmFtaWx5KTsKKworICAgIGlmIChSZWZQdHI8Q1NTVmFsdWU+IGZvbnRTaXplID0gc3R5
bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlGb250U2l6ZSkpIHsKKyAgICAgICAg
aWYgKCFmb250U2l6ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgc3R5bGUtPnJl
bW92ZVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFNpemUpOyAvLyBDYW4ndCBtYWtlIHNlbnNlIG9m
IHRoZSBudW1iZXIuIFB1dCBubyBmb250IHNpemUuCisgICAgICAgIGVsc2UgeworICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPihmb250U2l6ZS5nZXQoKSk7CiAKKyAgICAgICAgICAgIC8vIE9ubHkgYWNjZXB0IGFic29s
dXRlIHNjYWxlCisgICAgICAgICAgICBpZiAodmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA+PSBDU1NQ
cmltaXRpdmVWYWx1ZTo6Q1NTX1BYICYmIHZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPD0gQ1NTUHJp
bWl0aXZlVmFsdWU6OkNTU19QQykgewogICAgICAgICAgICAgICAgIGZsb2F0IG51bWJlciA9IHZh
bHVlLT5nZXRGbG9hdFZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFgpOwogICAgICAgICAg
ICAgICAgIGlmIChudW1iZXIgPD0gOSkKICAgICAgICAgICAgICAgICAgICAgbV9hcHBseUZvbnRT
aXplID0gIjEiOwpAQCAtMjExLDM0ICsyMTUsMTIgQEAgYm9vbCBTdHlsZUNoYW5nZTo6Y2hlY2tG
b3JMZWdhY3lIVE1MU3R5bAogICAgICAgICAgICAgICAgICAgICBtX2FwcGx5Rm9udFNpemUgPSAi
NiI7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBtX2FwcGx5Rm9u
dFNpemUgPSAiNyI7Ci0gICAgICAgICAgICAgICAgLy8gSHVnZSBxdWlyayBpbiBNaWNyb3NmdCBF
bnRvdXJhZ2UgaXMgdGhhdCB0aGV5IHVuZGVyc3RhbmQgQ1NTIGZvbnQtc2l6ZSwgYnV0IGFsc28g
d3JpdGUgCi0gICAgICAgICAgICAgICAgLy8gb3V0IGxlZ2FjeSAxLTcgdmFsdWVzIGluIGZvbnQg
dGFncyAoSSBndWVzcyBmb3IgbWFpbGVycyB0aGF0IGFyZSBub3QgQ1NTLXNhdnZ5IGF0IGFsbCwg
Ci0gICAgICAgICAgICAgICAgLy8gbGlrZSBFdWRvcmEpLiBZZXMsIHRoZXkgd3JpdGUgb3V0ICpi
b3RoKi4gV2UgbmVlZCB0byB3cml0ZSBvdXQgYm90aCBhcyB3ZWxsLiBSZXR1cm4gZmFsc2UuCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENhbid0IG1ha2Ugc2Vuc2Ugb2YgdGhlIG51bWJl
ci4gUHV0IG5vIGZvbnQgc2l6ZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIC8vIEh1Z2UgcXVpcmsgaW4gTWljcm9zZnQgRW50b3VyYWdl
IGlzIHRoYXQgdGhleSB1bmRlcnN0YW5kIENTUyBmb250LXNpemUsIGJ1dCBhbHNvIHdyaXRlIAor
ICAgICAgICAgICAgLy8gb3V0IGxlZ2FjeSAxLTcgdmFsdWVzIGluIGZvbnQgdGFncyAoSSBndWVz
cyBmb3IgbWFpbGVycyB0aGF0IGFyZSBub3QgQ1NTLXNhdnZ5IGF0IGFsbCwgCisgICAgICAgICAg
ICAvLyBsaWtlIEV1ZG9yYSkuIFllcywgdGhleSB3cml0ZSBvdXQgKmJvdGgqLiBXZSBuZWVkIHRv
IHdyaXRlIG91dCBib3RoIGFzIHdlbGwuCisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1ib29sIFN0eWxlQ2hhbmdlOjpjdXJyZW50bHlIYXNTdHlsZShjb25zdCBQb3Np
dGlvbiAmcG9zLCBjb25zdCBDU1NQcm9wZXJ0eSAqcHJvcGVydHkpCi17Ci0gICAgQVNTRVJUKHBv
cy5pc05vdE51bGwoKSk7Ci0gICAgUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbj4g
c3R5bGUgPSBwb3MuY29tcHV0ZWRTdHlsZSgpOwotICAgIFJlZlB0cjxDU1NWYWx1ZT4gdmFsdWU7
Ci0gICAgaWYgKHByb3BlcnR5LT5pZCgpID09IENTU1Byb3BlcnR5Rm9udFNpemUpCi0gICAgICAg
IHZhbHVlID0gc3R5bGUtPmdldEZvbnRTaXplQ1NTVmFsdWVQcmVmZXJyaW5nS2V5d29yZCgpOwot
ICAgIC8vIFdlIG5lZWQgdG8gdXNlIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3Qg
dG8gdGFrZSBjYXJlIG9mIHRleHQgZGVjb3JhdGlvbnMgc2V0IGJ5IHUsIHMsIGFuZCBzdHJpa2UK
LSAgICBlbHNlIGlmIChwcm9wZXJ0eS0+aWQoKSA9PSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9u
KQotICAgICAgICB2YWx1ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1Byb3BlcnR5
V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3QpOwotICAgIGVsc2UKLSAgICAgICAgdmFsdWUg
PSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wZXJ0eS0+aWQoKSk7Ci0gICAgaWYgKCF2
YWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBlcXVhbElnbm9yaW5nQ2Fz
ZSh2YWx1ZS0+Y3NzVGV4dCgpLCBwcm9wZXJ0eS0+dmFsdWUoKS0+Y3NzVGV4dCgpKTsKIH0KIAog
c3RhdGljIFN0cmluZyYgc3R5bGVTcGFuQ2xhc3NTdHJpbmcoKQpAQCAtMzEwLDI3ICsyOTIsOSBA
QCBSZWZQdHI8Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24+IGdldFByCiAgICAgUmVmUHRyPENT
U011dGFibGVTdHlsZURlY2xhcmF0aW9uPiByZXN1bHQgPSBzdHlsZS0+Y29weSgpOwogICAgIGNv
bXB1dGVkU3R5bGUtPmRpZmYocmVzdWx0LmdldCgpKTsKIAotICAgIC8vIElmIHRleHQgZGVjb3Jh
dGlvbnMgaW4gZWZmZWN0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb21wdXRlZCBzdHlsZSwgdGhl
biB0aGVyZSBpcyBub3RoaW5nIHRvIHJlbW92ZSBmcm9tIHJlc3VsdAotICAgIFJlZlB0cjxDU1NW
YWx1ZT4gY29tcHV0ZWRWYWx1ZSA9IGNvbXB1dGVkU3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUo
Q1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCk7Ci0gICAgaWYgKCFjb21w
dXRlZFZhbHVlIHx8ICFjb21wdXRlZFZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1
cm4gcmVzdWx0OwotCi0gICAgLy8gVGFrZSBjYXJlIG9mIGJvdGggdGV4dC1kZWNvcmF0aW9uIGFu
ZCAtd2Via2l0LXRleHQtZGVjb3JhdGlvbnMtaW4tZWZmZWN0Ci0gICAgc3RhdGljIGNvbnN0IGlu
dCB0ZXh0RGVjb3JhdGlvblByb3BlcnRpZXNbXT17Q1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbiwg
Q1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdH07Ci0gICAgZm9yIChzaXpl
X3QgbiA9IDA7IG4gPCBzaXplb2YodGV4dERlY29yYXRpb25Qcm9wZXJ0aWVzKS9zaXplb2YodGV4
dERlY29yYXRpb25Qcm9wZXJ0aWVzWzFdKTsgbisrKSB7Ci0gICAgICAgIFJlZlB0cjxDU1NWYWx1
ZT4gc3R5bGVWYWx1ZSA9IHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHRleHREZWNvcmF0aW9u
UHJvcGVydGllc1tuXSk7Ci0gICAgICAgIGlmICghc3R5bGVWYWx1ZSB8fCAhc3R5bGVWYWx1ZS0+
aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIENTU1ZhbHVl
TGlzdCogZGVzaXJlZFZhbHVlTGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHN0eWxl
VmFsdWUuZ2V0KCkpOwotICAgICAgICBDU1NWYWx1ZUxpc3QqIGNvbXB1dGVkVmFsdWVMaXN0ID0g
c3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4oY29tcHV0ZWRWYWx1ZS5nZXQoKSk7Ci0gICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVzaXJlZFZhbHVlTGlzdC0+bGVuZ3RoKCk7IGkrKykg
ewotICAgICAgICAgICAgaWYgKCFjb21wdXRlZFZhbHVlTGlzdC0+aGFzVmFsdWUoZGVzaXJlZFZh
bHVlTGlzdC0+aXRlbShpKSkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnJlbW92ZVByb3Bl
cnR5KHRleHREZWNvcmF0aW9uUHJvcGVydGllc1tuXSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgLy8gaWYgdGV4dC1kZWNvcmF0
aW9uIGlzIGVxdWFsIHRvIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3QsIHRoZW4g
ZG9uJ3QgYWRkIHRoZSBwcm9wZXJ0eS4KKyAgICBpZiAocmVzdWx0LT5nZXRQcm9wZXJ0eVZhbHVl
KENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24pID09IGNvbXB1dGVkU3R5bGUtPmdldFByb3BlcnR5
VmFsdWUoQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCkpCisgICAgICAg
IHJlc3VsdC0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbik7CiAKICAg
ICByZXR1cm4gcmVzdWx0OwogfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>