<?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>17727</bug_id>
          
          <creation_ts>2008-03-08 12:33:59 -0800</creation_ts>
          <short_desc>[wx] Implement non-kerned drawing on wxGTK w/wxGC</short_desc>
          <delta_ts>2009-05-11 05:23:38 -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>WebKit wx</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Wx</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kevin Ollivier">kevino</reporter>
          <assigned_to name="Kevin Ollivier">kevino</assigned_to>
          <cc>alp</cc>
    
    <cc>aroben</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>73094</commentid>
    <comment_count>0</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2008-03-08 12:33:59 -0800</bug_when>
    <thetext>wx currently only draws text kerned, so we need to provide our own implementation of non-kerned drawing there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>73095</commentid>
    <comment_count>1</comment_count>
      <attachid>19611</attachid>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2008-03-08 12:35:06 -0800</bug_when>
    <thetext>Created attachment 19611
Implementation for wxGC mode

Here is the implementation using wxGC (which is basically Cairo under the hood).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74564</commentid>
    <comment_count>2</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-03-20 14:22:10 -0700</bug_when>
    <thetext>Hey, we have three copies of some of this code already, and there is at least one bug bug in the part you ended up copying (which we now have in three places). Wonder if we can find a better way to share this Cairo code. It really is mostly identical for each port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74681</commentid>
    <comment_count>3</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2008-03-21 13:20:10 -0700</bug_when>
    <thetext>I much prefer sharing code as well, but which copy should I base the shared code off of? I see there are now Pango and non-Pango versions... We (wx) can use Pango I think, but does GTK need to support both? </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>82695</commentid>
    <comment_count>4</comment_count>
      <attachid>19611</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-06-08 18:06:27 -0700</bug_when>
    <thetext>Comment on attachment 19611
Implementation for wxGC mode

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>95085</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-10-12 15:14:21 -0700</bug_when>
    <thetext>Kevin, why haven&apos;t you landed this yet?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>95488</commentid>
    <comment_count>6</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2008-10-15 18:58:28 -0700</bug_when>
    <thetext>Sorry, there were a couple issues I found with this patch that turned out to be really hard to resolve, which in turn led me to think the way I approached this problem might not have been the right one. I actually did recently get a chance to redo the implementation using Pango which gives much better results. Should I just clear the review field for this patch until I&apos;ve got the new one ready to upload? </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96815</commentid>
    <comment_count>7</comment_count>
      <attachid>24701</attachid>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2008-10-27 16:27:07 -0700</bug_when>
    <thetext>Created attachment 24701
new patch using PANGO instead of FT for better results

Here&apos;s the new patch I promised. This one has been better tested and doesn&apos;t have the issues the old one did.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>99979</commentid>
    <comment_count>8</comment_count>
      <attachid>24701</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-11-24 09:42:21 -0800</bug_when>
    <thetext>Comment on attachment 24701
new patch using PANGO instead of FT for better results

&gt; +++ WebCore/platform/graphics/GlyphBuffer.h	(working copy)
&gt; @@ -33,7 +33,7 @@
&gt;  
&gt;  #if PLATFORM(CG)
&gt;  #include &lt;ApplicationServices/ApplicationServices.h&gt;
&gt; -#elif PLATFORM(CAIRO)
&gt; +#elif PLATFORM(CAIRO) || (PLATFORM(WX) &amp;&amp; defined(__WXGTK__))

Should we just make PLATFORM(CAIRO) be defined globally when building wxgtk?

&gt;  float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
&gt;  {
&gt; +#if __WXGTK__ &amp;&amp; USE(WXGC)
&gt; +    PangoFont* pangoFont = createPangoFontForFont(m_font.font());

Do you need to free this font somewhere? I guess WXGC might mean &quot;garbage collection&quot;?

It seems kind of strange that all non-wxgtk/wxgc cases will fall into the Windows-only code path.

&gt; +++ WebCore/platform/wx/wxcode/gtk/non-kerned-drawing.cpp	(working copy)
&gt; @@ -33,15 +33,163 @@
&gt;  #include &lt;wx/gdicmn.h&gt;
&gt;  #include &lt;vector&gt;
&gt;  
&gt; +#if USE(WXGC)
&gt; +#include &lt;cairo.h&gt;
&gt; +#include &lt;assert.h&gt;
&gt; +
&gt; +#include &lt;pango/pango.h&gt;
&gt; +#include &lt;pango/pangocairo.h&gt;
&gt; +
&gt; +// Use cairo-ft i a recent enough Pango version isn&apos;t available

Typo: i -&gt; if

&gt; +PangoFontMap* g_fontMap = 0;

This should be marked static. That will give it internal linkage. Once you do that you won&apos;t have to explicitly initialize to 0, either.

&gt; +PangoFontMap* pangoFontMap()
&gt; +{
&gt; +    return g_fontMap;
&gt; +}

Should this function perform initialization of g_fontMap?

&gt; +
&gt; +PangoFont* createPangoFontForFont(const wxFont wxfont)
&gt; +{
&gt; +const char* face = wxfont.GetFaceName().mb_str(wxConvUTF8);
&gt; +    char const* families[] = {
&gt; +      face,
&gt; +      NULL
&gt; +    };

Indentation seems wrong here. We also use 0 instead of NULL in C++ code, though maybe this file is trying to follow wx coding style?

&gt; +
&gt; +   switch (wxfont.GetFamily()) {
&gt; +        case wxFONTFAMILY_ROMAN:
&gt; +            families[1] = &quot;serif&quot;;
&gt; +            break;
&gt; +        case wxFONTFAMILY_SWISS:
&gt; +            families[1] = &quot;sans&quot;;
&gt; +            break;
&gt; +        case wxFONTFAMILY_MODERN:
&gt; +            families[1] = &quot;monospace&quot;;
&gt; +            break;
&gt; +        default:
&gt; +            families[1] = &quot;sans&quot;;
&gt; +    }
&gt; +    
&gt; +    PangoFontDescription* description = pango_font_description_new();
&gt; +    pango_font_description_set_absolute_size(description, wxfont.GetPointSize() * PANGO_SCALE);
&gt; + 
&gt; +    PangoFont* pangoFont = 0;
&gt; +    PangoContext* pangoContext = 0;
&gt; +    // FIXME: Map all FontWeight values to Pango font weights.
&gt; +    if (wxfont.GetWeight() == wxFONTWEIGHT_BOLD)
&gt; +        pango_font_description_set_weight(description, PANGO_WEIGHT_BOLD);
&gt; +    if (wxfont.GetStyle() == wxFONTSTYLE_ITALIC)
&gt; +        pango_font_description_set_style(description, PANGO_STYLE_ITALIC);
&gt; +
&gt; +    if (!g_fontMap)
&gt; +        g_fontMap = pango_cairo_font_map_get_default();
&gt; +
&gt; +    pangoContext = pango_cairo_font_map_create_context(PANGO_CAIRO_FONT_MAP(g_fontMap));

&gt; +    for (unsigned int i = 0; !pangoFont &amp;&amp; i &lt; G_N_ELEMENTS(families); i++) {

We normally just say &quot;unsigned&quot; instead of &quot;unsigned int&quot;.

&gt; +        pango_font_description_set_family(description, &quot;sans&quot;); //families[i]);

This looks wrong.

&gt; +PangoGlyph pango_font_get_glyph(PangoFont* font, PangoContext* context, gunichar wc)
&gt; +{
&gt; +    PangoGlyph result = 0;
&gt; +    gchar buffer[7];
&gt; +
&gt; +    gint  length = g_unichar_to_utf8(wc, buffer);
&gt; +    g_return_val_if_fail(length, 0);
&gt; +
&gt; +    GList* items = pango_itemize(context, buffer, 0, length, NULL, NULL);
&gt; +
&gt; +    if (g_list_length(items) == 1) {
&gt; +        PangoItem* item = reinterpret_cast&lt;PangoItem*&gt;(items-&gt;data);

static_cast would be better here.

&gt;  void drawTextWithSpacing(GraphicsContext* graphicsContext, const SimpleFontData* font, const wxColour&amp; color, const GlyphBuffer&amp; glyphBuffer, int from, int numGlyphs, const FloatPoint&amp; point)
&gt;  {
&gt;  #if USE(WXGC)
&gt;      wxGCDC* dc = static_cast&lt;wxGCDC*&gt;(graphicsContext-&gt;platformContext());
&gt; +    wxGraphicsContext* gc = dc-&gt;GetGraphicsContext();
&gt; +    gc-&gt;PushState();
&gt; +    cairo_t* cr = (cairo_t*)gc-&gt;GetNativeContext();
&gt; +
&gt; +    wxFont wxfont = font-&gt;getWxFont();
&gt; +    PangoFont* pangoFont = createPangoFontForFont(wxfont);
&gt; +    PangoContext* pangoContext = pango_cairo_font_map_create_context(PANGO_CAIRO_FONT_MAP(g_fontMap));
&gt; +    cairo_scaled_font_t* scaled_font = createScaledFontForFont(wxfont); 
&gt; +    ASSERT(scaled_font);
&gt; +
&gt; +    cairo_glyph_t* glyphs = NULL;
&gt; +    glyphs = (cairo_glyph_t*)malloc (sizeof(cairo_glyph_t) * numGlyphs);

Extra space after &quot;malloc&quot;. static_cast would be better than a C-style cast.

&gt;  wxFontProperties::wxFontProperties(wxFont* font):
&gt;  m_ascent(0), m_descent(0), m_lineGap(0), m_lineSpacing(0), m_xHeight(0)
&gt;  {
&gt; +#if USE(WXGC)
&gt; +    cairo_font_extents_t font_extents;
&gt; +    cairo_text_extents_t text_extents;
&gt; +    cairo_scaled_font_t* scaled_font = WebCore::createScaledFontForFont(*font);
&gt; +    
&gt; +    cairo_scaled_font_extents(scaled_font, &amp;font_extents);
&gt; +    m_ascent = static_cast&lt;int&gt;(font_extents.ascent);
&gt; +    m_descent = static_cast&lt;int&gt;(font_extents.descent);
&gt; +    m_lineSpacing = static_cast&lt;int&gt;(font_extents.height);
&gt; +    cairo_scaled_font_text_extents(scaled_font, &quot;x&quot;, &amp;text_extents);
&gt; +    m_xHeight = text_extents.height;
&gt; +    cairo_scaled_font_text_extents(scaled_font, &quot; &quot;, &amp;text_extents);
&gt; +    //m_spaceWidth =  static_cast&lt;int&gt;(text_extents.x_advance);

We don&apos;t like to commit commented-out code.

r- so this can be cleaned up a little more before going in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>100973</commentid>
    <comment_count>9</comment_count>
      <attachid>25665</attachid>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2008-12-01 22:27:18 -0800</bug_when>
    <thetext>Created attachment 25665
Revised patch with Adam&apos;s comments addressed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>100977</commentid>
    <comment_count>10</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2008-12-01 22:41:44 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 24701 [review])
&gt; &gt; +++ WebCore/platform/graphics/GlyphBuffer.h	(working copy)
&gt; &gt; @@ -33,7 +33,7 @@
&gt; &gt;  
&gt; &gt;  #if PLATFORM(CG)
&gt; &gt;  #include &lt;ApplicationServices/ApplicationServices.h&gt;
&gt; &gt; -#elif PLATFORM(CAIRO)
&gt; &gt; +#elif PLATFORM(CAIRO) || (PLATFORM(WX) &amp;&amp; defined(__WXGTK__))
&gt; 
&gt; Should we just make PLATFORM(CAIRO) be defined globally when building wxgtk?

We do not use all of the Cairo port, in fact we don&apos;t use most of it. As a result, we&apos;d probably actually end up with many more #ifdefs, mostly #if PLATFORM(CAIRO) &amp;&amp; !PLATFORM(WX), for things that the wx port implements separately from Cairo.

These special platform-specific defines will eventually go away, as this code is eventually going to be part of wx once we craft a proper API for it. If we move it there now, though, wxWebKit could no longer be used with the current stable release (2.8.9) and there aren&apos;t any releases of the 2.9 cycle yet, which would cause problems for some projects currently using wxWebKit.

&gt; &gt;  float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
&gt; &gt;  {
&gt; &gt; +#if __WXGTK__ &amp;&amp; USE(WXGC)
&gt; &gt; +    PangoFont* pangoFont = createPangoFontForFont(m_font.font());
&gt; 
&gt; Do you need to free this font somewhere? I guess WXGC might mean &quot;garbage
&gt; collection&quot;?

No, sorry, I overlooked this. WXGC actually stands for wxGraphicsContext, which is a frontend to the various vector-based drawing APIs (GDI+, Cairo, and Core Graphics). 

&gt; It seems kind of strange that all non-wxgtk/wxgc cases will fall into the
&gt; Windows-only code path.

The fallback is actually a wx codepath, not Windows, and in the latest path I removed the special case so that there&apos;s no special case for wxGTK/Cairo in SimpleFontData. The necessary code was moved into WebCore/platform/wx/wxcode/gtk/fontprops.cpp

&gt; &gt; +++ WebCore/platform/wx/wxcode/gtk/non-kerned-drawing.cpp	(working copy)
&gt; &gt; @@ -33,15 +33,163 @@
&gt; &gt;  #include &lt;wx/gdicmn.h&gt;
&gt; &gt;  #include &lt;vector&gt;
&gt; &gt;  
&gt; &gt; +#if USE(WXGC)
&gt; &gt; +#include &lt;cairo.h&gt;
&gt; &gt; +#include &lt;assert.h&gt;
&gt; &gt; +
&gt; &gt; +#include &lt;pango/pango.h&gt;
&gt; &gt; +#include &lt;pango/pangocairo.h&gt;
&gt; &gt; +
&gt; &gt; +// Use cairo-ft i a recent enough Pango version isn&apos;t available
&gt; 
&gt; Typo: i -&gt; if
&gt; 
&gt; &gt; +PangoFontMap* g_fontMap = 0;
&gt; 
&gt; This should be marked static. That will give it internal linkage. Once you do
&gt; that you won&apos;t have to explicitly initialize to 0, either.

Done, thanks!

&gt; &gt; +PangoFontMap* pangoFontMap()
&gt; &gt; +{
&gt; &gt; +    return g_fontMap;
&gt; &gt; +}
&gt; 
&gt; Should this function perform initialization of g_fontMap?

yeah, this is definitely better. I&apos;ve implemented that in the latest patch.

&gt; &gt; +
&gt; &gt; +PangoFont* createPangoFontForFont(const wxFont wxfont)
&gt; &gt; +{
&gt; &gt; +const char* face = wxfont.GetFaceName().mb_str(wxConvUTF8);
&gt; &gt; +    char const* families[] = {
&gt; &gt; +      face,
&gt; &gt; +      NULL
&gt; &gt; +    };
&gt; 
&gt; Indentation seems wrong here. We also use 0 instead of NULL in C++ code, though
&gt; maybe this file is trying to follow wx coding style?

No, not sure how that got messed up, but I fixed it.

&gt; &gt; +
&gt; &gt; +   switch (wxfont.GetFamily()) {
&gt; &gt; +        case wxFONTFAMILY_ROMAN:
&gt; &gt; +            families[1] = &quot;serif&quot;;
&gt; &gt; +            break;
&gt; &gt; +        case wxFONTFAMILY_SWISS:
&gt; &gt; +            families[1] = &quot;sans&quot;;
&gt; &gt; +            break;
&gt; &gt; +        case wxFONTFAMILY_MODERN:
&gt; &gt; +            families[1] = &quot;monospace&quot;;
&gt; &gt; +            break;
&gt; &gt; +        default:
&gt; &gt; +            families[1] = &quot;sans&quot;;
&gt; &gt; +    }
&gt; &gt; +    
&gt; &gt; +    PangoFontDescription* description = pango_font_description_new();
&gt; &gt; +    pango_font_description_set_absolute_size(description, wxfont.GetPointSize() * PANGO_SCALE);
&gt; &gt; + 
&gt; &gt; +    PangoFont* pangoFont = 0;
&gt; &gt; +    PangoContext* pangoContext = 0;
&gt; &gt; +    // FIXME: Map all FontWeight values to Pango font weights.
&gt; &gt; +    if (wxfont.GetWeight() == wxFONTWEIGHT_BOLD)
&gt; &gt; +        pango_font_description_set_weight(description, PANGO_WEIGHT_BOLD);
&gt; &gt; +    if (wxfont.GetStyle() == wxFONTSTYLE_ITALIC)
&gt; &gt; +        pango_font_description_set_style(description, PANGO_STYLE_ITALIC);
&gt; &gt; +
&gt; &gt; +    if (!g_fontMap)
&gt; &gt; +        g_fontMap = pango_cairo_font_map_get_default();
&gt; &gt; +
&gt; &gt; +    pangoContext = pango_cairo_font_map_create_context(PANGO_CAIRO_FONT_MAP(g_fontMap));
&gt; 
&gt; &gt; +    for (unsigned int i = 0; !pangoFont &amp;&amp; i &lt; G_N_ELEMENTS(families); i++) {
&gt; 
&gt; We normally just say &quot;unsigned&quot; instead of &quot;unsigned int&quot;.

Okay, done.

&gt; &gt; +        pango_font_description_set_family(description, &quot;sans&quot;); //families[i]);
&gt; 
&gt; This looks wrong.

Yeah, I think I added that when debugging and forgot to undo it. :( Fixed now.

&gt; &gt; +PangoGlyph pango_font_get_glyph(PangoFont* font, PangoContext* context, gunichar wc)
&gt; &gt; +{
&gt; &gt; +    PangoGlyph result = 0;
&gt; &gt; +    gchar buffer[7];
&gt; &gt; +
&gt; &gt; +    gint  length = g_unichar_to_utf8(wc, buffer);
&gt; &gt; +    g_return_val_if_fail(length, 0);
&gt; &gt; +
&gt; &gt; +    GList* items = pango_itemize(context, buffer, 0, length, NULL, NULL);
&gt; &gt; +
&gt; &gt; +    if (g_list_length(items) == 1) {
&gt; &gt; +        PangoItem* item = reinterpret_cast&lt;PangoItem*&gt;(items-&gt;data);
&gt; 
&gt; static_cast would be better here.

Done.

&gt; &gt;  void drawTextWithSpacing(GraphicsContext* graphicsContext, const SimpleFontData* font, const wxColour&amp; color, const GlyphBuffer&amp; glyphBuffer, int from, int numGlyphs, const FloatPoint&amp; point)
&gt; &gt;  {
&gt; &gt;  #if USE(WXGC)
&gt; &gt;      wxGCDC* dc = static_cast&lt;wxGCDC*&gt;(graphicsContext-&gt;platformContext());
&gt; &gt; +    wxGraphicsContext* gc = dc-&gt;GetGraphicsContext();
&gt; &gt; +    gc-&gt;PushState();
&gt; &gt; +    cairo_t* cr = (cairo_t*)gc-&gt;GetNativeContext();
&gt; &gt; +
&gt; &gt; +    wxFont wxfont = font-&gt;getWxFont();
&gt; &gt; +    PangoFont* pangoFont = createPangoFontForFont(wxfont);
&gt; &gt; +    PangoContext* pangoContext = pango_cairo_font_map_create_context(PANGO_CAIRO_FONT_MAP(g_fontMap));
&gt; &gt; +    cairo_scaled_font_t* scaled_font = createScaledFontForFont(wxfont); 
&gt; &gt; +    ASSERT(scaled_font);
&gt; &gt; +
&gt; &gt; +    cairo_glyph_t* glyphs = NULL;
&gt; &gt; +    glyphs = (cairo_glyph_t*)malloc (sizeof(cairo_glyph_t) * numGlyphs);
&gt; 
&gt; Extra space after &quot;malloc&quot;. static_cast would be better than a C-style cast.

Done. :)

&gt; &gt;  wxFontProperties::wxFontProperties(wxFont* font):
&gt; &gt;  m_ascent(0), m_descent(0), m_lineGap(0), m_lineSpacing(0), m_xHeight(0)
&gt; &gt;  {
&gt; &gt; +#if USE(WXGC)
&gt; &gt; +    cairo_font_extents_t font_extents;
&gt; &gt; +    cairo_text_extents_t text_extents;
&gt; &gt; +    cairo_scaled_font_t* scaled_font = WebCore::createScaledFontForFont(*font);
&gt; &gt; +    
&gt; &gt; +    cairo_scaled_font_extents(scaled_font, &amp;font_extents);
&gt; &gt; +    m_ascent = static_cast&lt;int&gt;(font_extents.ascent);
&gt; &gt; +    m_descent = static_cast&lt;int&gt;(font_extents.descent);
&gt; &gt; +    m_lineSpacing = static_cast&lt;int&gt;(font_extents.height);
&gt; &gt; +    cairo_scaled_font_text_extents(scaled_font, &quot;x&quot;, &amp;text_extents);
&gt; &gt; +    m_xHeight = text_extents.height;
&gt; &gt; +    cairo_scaled_font_text_extents(scaled_font, &quot; &quot;, &amp;text_extents);
&gt; &gt; +    //m_spaceWidth =  static_cast&lt;int&gt;(text_extents.x_advance);
&gt; 
&gt; We don&apos;t like to commit commented-out code.

Yes, sorry, another oversight. Fixed now.

&gt; r- so this can be cleaned up a little more before going in.
&gt; 

Thanks a lot for taking a look at this! </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103081</commentid>
    <comment_count>11</comment_count>
    <who name="Diggilin">mr.diggilin</who>
    <bug_when>2008-12-20 15:41:25 -0800</bug_when>
    <thetext>Any chance this can get the fast lane?
wxWebKit is useless under linux without it...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106690</commentid>
    <comment_count>12</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-22 20:35:20 -0800</bug_when>
    <thetext>Adding Adam to the CC list, in case he forgot about this long-pending bug.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>109433</commentid>
    <comment_count>13</comment_count>
      <attachid>27588</attachid>
    <who name="Diggilin">mr.diggilin</who>
    <bug_when>2009-02-11 23:09:13 -0800</bug_when>
    <thetext>Created attachment 27588
Updated the patch to support recent changes and satisfied a FIXME</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>109618</commentid>
    <comment_count>14</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2009-02-12 21:42:55 -0800</bug_when>
    <thetext>Landed in r40965, thanks! :-)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19611</attachid>
            <date>2008-03-08 12:35:06 -0800</date>
            <delta_ts>2008-10-27 16:27:07 -0700</delta_ts>
            <desc>Implementation for wxGC mode</desc>
            <filename>wx-cairo-text.patch</filename>
            <type>text/plain</type>
            <size>10097</size>
            <attacher name="Kevin Ollivier">kevino</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvU2ltcGxlRm9udERhdGFXeC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9TaW1wbGVGb250RGF0
YVd4LmNwcAkocmV2aXNpb24gMzA5MDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4
L1NpbXBsZUZvbnREYXRhV3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw2ICs0MCwxMSBAQAog
I2luY2x1ZGUgPHd4L2Rjc2NyZWVuLmg+CiAjaW5jbHVkZSAiZm9udHByb3BzLmgiCiAKKyNpZiBf
X1dYR1RLX18gJiYgVVNFKFdYR0MpCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlICJub24t
a2VybmVkLWRyYXdpbmcuaCIKKyNlbmRpZgorCiBuYW1lc3BhY2UgV2ViQ29yZQogewogCkBAIC04
Nyw5ICs5MiwyMiBAQAogCiBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckds
eXBoKEdseXBoIGdseXBoKSBjb25zdAogeworI2lmIF9fV1hHVEtfXyAmJiBVU0UoV1hHQykKKyAg
ICBjYWlyb19nbHlwaF90IGNnbHlwaCA9IHsgZ2x5cGgsIDAsIDAgfTsKKyAgICBjYWlyb190ZXh0
X2V4dGVudHNfdCBleHRlbnRzOworICAgIGNhaXJvX3NjYWxlZF9mb250X3QqIHNjYWxlZF9mb250
ID0gY3JlYXRlU2NhbGVkRm9udEZvckZvbnQobV9mb250LmZvbnQoKSk7CisgICAgY2Fpcm9fc2Nh
bGVkX2ZvbnRfZ2x5cGhfZXh0ZW50cyhzY2FsZWRfZm9udCwgJmNnbHlwaCwgMSwgJmV4dGVudHMp
OworCisgICAgZmxvYXQgd2lkdGggPSAoZmxvYXQpMTA7CisgICAgaWYgKGNhaXJvX3NjYWxlZF9m
b250X3N0YXR1cyhzY2FsZWRfZm9udCkgPT0gQ0FJUk9fU1RBVFVTX1NVQ0NFU1MgJiYgZXh0ZW50
cy54X2FkdmFuY2UgIT0gMCkKKyAgICAgICAgd2lkdGggPSAoZmxvYXQpZXh0ZW50cy54X2FkdmFu
Y2U7CisKKyAgICBjYWlyb19zY2FsZWRfZm9udF9kZXN0cm95KHNjYWxlZF9mb250KTsKKyNlbHNl
CiAgICAgLy8gVE9ETzogZml4IHRoaXMhIE1ha2UgR2V0VGV4dEV4dGVudHMgYSBtZXRob2Qgb2Yg
d3hGb250IGluIDIuOQogICAgIGludCB3aWR0aCA9IDEwOwogICAgIEdldFRleHRFeHRlbnQobV9m
b250LmZvbnQoKSwgKHd4Q2hhcilnbHlwaCwgJndpZHRoLCBOVUxMKTsKKyNlbmRpZgogICAgIHJl
dHVybiB3aWR0aDsKIH0KIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvbm9uLWtl
cm5lZC1kcmF3aW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUv
bm9uLWtlcm5lZC1kcmF3aW5nLmgJKHJldmlzaW9uIDMwOTAwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS93eC93eGNvZGUvbm9uLWtlcm5lZC1kcmF3aW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTI4LDkg
KzI4LDE3IEBACiANCiAjaW5jbHVkZSA8d3gvZGVmcy5oPg0KICNpbmNsdWRlIDx3eC9kY2NsaWVu
dC5oPg0KKworI2lmIF9fV1hHVEtfXyAmJiBVU0UoV1hHQykKKyNpbmNsdWRlIDxjYWlyby5oPgor
I2VuZGlmCiANCiBuYW1lc3BhY2UgV2ViQ29yZSB7DQogDQogZXh0ZXJuIHZvaWQgZHJhd1RleHRX
aXRoU3BhY2luZyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxl
Rm9udERhdGEqIGZvbnQsIGNvbnN0IHd4Q29sb3VyJiBjb2xvciwgY29uc3QgR2x5cGhCdWZmZXIm
IGdseXBoQnVmZmVyLCBpbnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQpOw0KLSAgICANCi19DQorCisjaWYgX19XWEdUS19fICYmIFVTRShXWEdDKQorY2Fpcm9f
c2NhbGVkX2ZvbnRfdCogY3JlYXRlU2NhbGVkRm9udEZvckZvbnQoY29uc3Qgd3hGb250IHd4Zm9u
dCk7CisjZW5kaWYNCit9CisNCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9ndGsv
bm9uLWtlcm5lZC1kcmF3aW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3d4
L3d4Y29kZS9ndGsvbm9uLWtlcm5lZC1kcmF3aW5nLmNwcAkocmV2aXNpb24gMzA5MDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9ndGsvbm9uLWtlcm5lZC1kcmF3aW5nLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzMsMTUgKzMzLDE0MSBAQAogI2luY2x1ZGUgPHd4L2dkaWNtbi5oPgog
I2luY2x1ZGUgPHZlY3Rvcj4KIAorI2lmIFVTRShXWEdDKQorI2luY2x1ZGUgPGNhaXJvLWZ0Lmg+
CisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxmb250Y29uZmlnL2ZjZnJlZXR5cGUuaD4K
KyNlbmRpZgorCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
KyNpZiBVU0UoV1hHQykKK2NhaXJvX3NjYWxlZF9mb250X3QqIGNyZWF0ZVNjYWxlZEZvbnRGb3JG
b250KGNvbnN0IHd4Rm9udCB3eGZvbnQpCit7CisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRfdCogc2Nh
bGVkRm9udCA9IE5VTEw7CisgICAgY29uc3QgY2hhciogZmNmYW1pbHkgPSB3eGZvbnQuR2V0RmFj
ZU5hbWUoKS5tYl9zdHIod3hDb252VVRGOCk7CisgICAgaW50IGZjc2xhbnQgPSBGQ19TTEFOVF9S
T01BTjsKKyAgICBpbnQgZmN3ZWlnaHQgPSBGQ19XRUlHSFRfTk9STUFMOworICAgIGZsb2F0IGZj
c2l6ZSA9IHd4Zm9udC5HZXRQb2ludFNpemUoKTsKKyAgICBpZiAod3hmb250LkdldFN0eWxlKCkg
PT0gd3hGT05UU1RZTEVfSVRBTElDKQorICAgICAgICBmY3NsYW50ID0gRkNfU0xBTlRfSVRBTElD
OworICAgIGlmICh3eGZvbnQuR2V0V2VpZ2h0KCkgPT0gd3hGT05UV0VJR0hUX0JPTEQpCisgICAg
ICAgIGZjd2VpZ2h0ID0gRkNfV0VJR0hUX0JPTEQ7CisKKyAgICBpbnQgdHlwZSA9IHd4Zm9udC5H
ZXRGYW1pbHkoKTsKKworICAgIEZjUGF0dGVybiogcGF0dGVybiA9IEZjUGF0dGVybkNyZWF0ZSgp
OworICAgIEZjUGF0dGVybiogbXlwYXR0ZXJuID0gTlVMTDsKKyAgICBjYWlyb19mb250X2ZhY2Vf
dCogZm9udEZhY2U7CisgICAgY2Fpcm9fbWF0cml4X3QgZm9udE1hdHJpeDsKKyAgICBzdGF0aWMg
Y29uc3QgY2Fpcm9fZm9udF9vcHRpb25zX3QqIGRlZmF1bHRPcHRpb25zID0gY2Fpcm9fZm9udF9v
cHRpb25zX2NyZWF0ZSgpOworICAgIGNvbnN0IGNhaXJvX2ZvbnRfb3B0aW9uc190KiBvcHRpb25z
ID0gTlVMTDsKKworICAgIGlmICghRmNQYXR0ZXJuQWRkU3RyaW5nKHBhdHRlcm4sIEZDX0ZBTUlM
WSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGY0NoYXI4Kj4oZmNmYW1pbHkpKSkKKyAgICAgICAg
Z290byBmcmVlUGF0dGVybjsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIHd4
Rk9OVEZBTUlMWV9ST01BTjoKKyAgICAgICAgICAgIGZjZmFtaWx5ID0gInNlcmlmIjsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHd4Rk9OVEZBTUlMWV9TV0lTUzoKKyAgICAgICAg
ICAgIGZjZmFtaWx5ID0gInNhbnMtc2VyaWYiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2Ugd3hGT05URkFNSUxZX01PREVSTjoKKyAgICAgICAgICAgIGZjZmFtaWx5ID0gIm1vbm9z
cGFjZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
IGZjZmFtaWx5ID0gInNhbnMtc2VyaWYiOworICAgIH0KKworICAgIGlmICghRmNQYXR0ZXJuQWRk
U3RyaW5nKHBhdHRlcm4sIEZDX0ZBTUlMWSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGY0NoYXI4
Kj4oZmNmYW1pbHkpKSkKKyAgICAgICAgZ290byBmcmVlUGF0dGVybjsKKyAgICBpZiAoIUZjUGF0
dGVybkFkZEludGVnZXIocGF0dGVybiwgRkNfU0xBTlQsIGZjc2xhbnQpKQorICAgICAgICBnb3Rv
IGZyZWVQYXR0ZXJuOworICAgIGlmICghRmNQYXR0ZXJuQWRkSW50ZWdlcihwYXR0ZXJuLCBGQ19X
RUlHSFQsIGZjd2VpZ2h0KSkKKyAgICAgICAgZ290byBmcmVlUGF0dGVybjsKKyAgICBpZiAoIUZj
UGF0dGVybkFkZERvdWJsZShwYXR0ZXJuLCBGQ19QSVhFTF9TSVpFLCBmY3NpemUpKQorICAgICAg
ICBnb3RvIGZyZWVQYXR0ZXJuOworCisgICAgRmNDb25maWdTdWJzdGl0dXRlKE5VTEwsIHBhdHRl
cm4sIEZjTWF0Y2hQYXR0ZXJuKTsKKyAgICBGY0RlZmF1bHRTdWJzdGl0dXRlKHBhdHRlcm4pOwor
CisgICAgRmNSZXN1bHQgZmNyZXN1bHQ7CisgICAgbXlwYXR0ZXJuID0gRmNGb250TWF0Y2goTlVM
TCwgcGF0dGVybiwgJmZjcmVzdWx0KTsKKyAgICAKKyAgICBpZiAoIW15cGF0dGVybikKKyAgICAg
ICAgZ290byBmcmVlUGF0dGVybjsKKyAgICBmb250RmFjZSA9IGNhaXJvX2Z0X2ZvbnRfZmFjZV9j
cmVhdGVfZm9yX3BhdHRlcm4obXlwYXR0ZXJuKTsKKyAgICBjYWlyb19tYXRyaXhfdCBjdG07Cisg
ICAgY2Fpcm9fbWF0cml4X2luaXRfc2NhbGUoJmZvbnRNYXRyaXgsIHd4Zm9udC5HZXRQb2ludFNp
emUoKSwgd3hmb250LkdldFBvaW50U2l6ZSgpKTsKKyAgICBjYWlyb19tYXRyaXhfaW5pdF9pZGVu
dGl0eSgmY3RtKTsKKworI2lmIEdUS19DSEVDS19WRVJTSU9OKDIsMTAsMCkKKyAgICBpZiAoR2Rr
U2NyZWVuKiBzY3JlZW4gPSBnZGtfc2NyZWVuX2dldF9kZWZhdWx0KCkpCisgICAgICAgIG9wdGlv
bnMgPSBnZGtfc2NyZWVuX2dldF9mb250X29wdGlvbnMoc2NyZWVuKTsKKyNlbmRpZgorICAgIC8v
IGdka19zY3JlZW5fZ2V0X2ZvbnRfb3B0aW9ucygpIHJldHVybnMgTlVMTCBpZiBubyBkZWZhdWx0
IG9wdGlvbnMgYXJlCisgICAgLy8gc2V0LCBzbyB3ZSBhbHdheXMgaGF2ZSB0byBjaGVjay4KKyAg
ICBpZiAoIW9wdGlvbnMpCisgICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uczsKKworICAg
IHNjYWxlZEZvbnQgPSBjYWlyb19zY2FsZWRfZm9udF9jcmVhdGUoZm9udEZhY2UsICZmb250TWF0
cml4LCAmY3RtLCBvcHRpb25zKTsKKyAgICBjYWlyb19mb250X2ZhY2VfZGVzdHJveShmb250RmFj
ZSk7CisKK2ZyZWVQYXR0ZXJuOgorICAgIEZjUGF0dGVybkRlc3Ryb3kocGF0dGVybik7CisgICAg
RmNQYXR0ZXJuRGVzdHJveShteXBhdHRlcm4pOworCisgICAgcmV0dXJuIHNjYWxlZEZvbnQ7Cit9
CisjZW5kaWYgLy8gVVNFKFdYR0MpCisKIHZvaWQgZHJhd1RleHRXaXRoU3BhY2luZyhHcmFwaGlj
c0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNv
bnN0IHd4Q29sb3VyJiBjb2xvciwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBpbnQg
ZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCiB7CiAjaWYgVVNF
KFdYR0MpCiAgICAgd3hHQ0RDKiBkYyA9IHN0YXRpY19jYXN0PHd4R0NEQyo+KGdyYXBoaWNzQ29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCkpOworICAgIHd4R3JhcGhpY3NDb250ZXh0KiBnYyA9IGRj
LT5HZXRHcmFwaGljc0NvbnRleHQoKTsKKyAgICBnYy0+UHVzaFN0YXRlKCk7CisgICAgd3hGb250
IHd4Zm9udCA9IGZvbnQtPmdldFd4Rm9udCgpOworCisgICAgY2Fpcm9fZ2x5cGhfdCogZ2x5cGhz
ID0gTlVMTDsKKyAgICBnbHlwaHMgPSAoY2Fpcm9fZ2x5cGhfdCopbWFsbG9jIChzaXplb2YoY2Fp
cm9fZ2x5cGhfdCkgKiBudW1HbHlwaHMpOworCisgICAgZmxvYXQgb2Zmc2V0ID0gcG9pbnQueCgp
OworCisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRfdCogc2NhbGVkX2ZvbnQgPSBjcmVhdGVTY2FsZWRG
b250Rm9yRm9udCh3eGZvbnQpOworICAgIEFTU0VSVChzY2FsZWRfZm9udCk7CisgICAgRlRfRmFj
ZSBmYWNlID0gY2Fpcm9fZnRfc2NhbGVkX2ZvbnRfbG9ja19mYWNlKHNjYWxlZF9mb250KTsKKyAg
ICBpZiAoIWZhY2UpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bnVtR2x5cGhzOyBpKyspIHsKKyAgICAgICAgZ2x5cGhzW2ldLmluZGV4ID0gRmNGcmVlVHlwZUNo
YXJJbmRleChmYWNlLCBnbHlwaEJ1ZmZlci5nbHlwaEF0KGZyb20gKyBpKSk7CisgICAgICAgIGds
eXBoc1tpXS54ID0gb2Zmc2V0OworICAgICAgICBnbHlwaHNbaV0ueSA9IHBvaW50LnkoKTsKKyAg
ICAgICAgb2Zmc2V0ICs9IGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSk7CisgICAgfQor
CisgICAgY2Fpcm9fZnRfc2NhbGVkX2ZvbnRfdW5sb2NrX2ZhY2Uoc2NhbGVkX2ZvbnQpOworCisg
ICAgY2Fpcm9fZm9udF9zbGFudF90IHNsYW50ID0gd3hmb250LkdldFN0eWxlKCkgPT0gd3hGT05U
U1RZTEVfSVRBTElDID8gQ0FJUk9fRk9OVF9TTEFOVF9JVEFMSUM6Q0FJUk9fRk9OVF9TTEFOVF9O
T1JNQUw7CisgICAgY2Fpcm9fZm9udF93ZWlnaHRfdCB3ZWlnaHQgPSB3eGZvbnQuR2V0V2VpZ2h0
KCkgPT0gd3hGT05UV0VJR0hUX0JPTEQgPyBDQUlST19GT05UX1dFSUdIVF9CT0xEOkNBSVJPX0ZP
TlRfV0VJR0hUX05PUk1BTDsKKworICAgIGNhaXJvX3QqIGNyID0gKGNhaXJvX3QqKWdjLT5HZXRO
YXRpdmVDb250ZXh0KCk7CisgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCBjb2xvci5SZWQo
KS8yNTUuMCwgY29sb3IuR3JlZW4oKS8yNTUuMCwgY29sb3IuQmx1ZSgpLzI1NS4wLCBjb2xvci5B
bHBoYSgpLzI1NS4wKTsKKyAgICAvLyBjYWlyb19zZWxlY3RfZm9udF9mYWNlKGNyLCB3eGZvbnQu
R2V0RmFjZU5hbWUoKS5tYl9zdHIod3hDb252VVRGOCksIHNsYW50LCB3ZWlnaHQpOworICAgIGNh
aXJvX3NldF9zY2FsZWRfZm9udChjciwgc2NhbGVkX2ZvbnQpOworICAgIAorICAgIC8vY2Fpcm9f
c2V0X2ZvbnRfc2l6ZShjciwgd3hmb250LkdldFBvaW50U2l6ZSgpKTsKKyAgICBjYWlyb19zaG93
X2dseXBocyhjciwgZ2x5cGhzLCBudW1HbHlwaHMpOworCisgICAgZnJlZShnbHlwaHMpOworICAg
IGNhaXJvX3NjYWxlZF9mb250X2Rlc3Ryb3koc2NhbGVkX2ZvbnQpOworICAgIGdjLT5Qb3BTdGF0
ZSgpOwogI2Vsc2UKICAgICB3eERDKiBkYyA9IGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCk7Ci0jZW5kaWYKIAogICAgIHd4Rm9udCB3eGZvbnQgPSBmb250LT5nZXRXeEZvbnQoKTsK
ICAgICBpZiAod3hmb250LklzT2soKSkKQEAgLTYyLDYgKzE4OCw3IEBACiAgICAgd3hDb29yZCB5
cG9pbnQgPSAod3hDb29yZCkgKHBvaW50LnkoKSAtIGhlaWdodCk7CiAgICAgIAogICAgIGRjLT5E
cmF3VGV4dCh0ZXh0LCAod3hDb29yZClwb2ludC54KCksIHlwb2ludCk7CisjZW5kaWYKIH0KIAog
fQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvZ3RrL2ZvbnRwcm9wcy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvZ3RrL2ZvbnRwcm9wcy5jcHAJ
KHJldmlzaW9uIDMwOTAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvZ3RrL2ZvbnRw
cm9wcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDEyICsyOCwzNiBAQAogI2luY2x1ZGUgPHd4
L2ZvbnQuaD4KICNpbmNsdWRlIDx3eC9mb250dXRpbC5oPgogI2luY2x1ZGUgImZvbnRwcm9wcy5o
IgorI2luY2x1ZGUgIm5vbi1rZXJuZWQtZHJhd2luZy5oIgogCiAjaW5jbHVkZSA8Z2RrL2dkay5o
PgogCisjaWYgVVNFKFdYR0MpCisjaW5jbHVkZSA8Y2Fpcm8tZnQuaD4KKyNpbmNsdWRlIDxjYWly
by5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgorI2VuZGlmCisKIHd4Rm9u
dFByb3BlcnRpZXM6Ond4Rm9udFByb3BlcnRpZXMod3hGb250KiBmb250KToKIG1fYXNjZW50KDAp
LCBtX2Rlc2NlbnQoMCksIG1fbGluZUdhcCgwKSwgbV9saW5lU3BhY2luZygwKSwgbV94SGVpZ2h0
KDApCiB7CisjaWYgVVNFKFdYR0MpCisgICAgY2Fpcm9fZm9udF9leHRlbnRzX3QgZm9udF9leHRl
bnRzOworICAgIGNhaXJvX3RleHRfZXh0ZW50c190IHRleHRfZXh0ZW50czsKKyAgICBjYWlyb19z
Y2FsZWRfZm9udF90KiBzY2FsZWRfZm9udCA9IFdlYkNvcmU6OmNyZWF0ZVNjYWxlZEZvbnRGb3JG
b250KCpmb250KTsKKyAgICAKKyAgICBjYWlyb19zY2FsZWRfZm9udF9leHRlbnRzKHNjYWxlZF9m
b250LCAmZm9udF9leHRlbnRzKTsKKyAgICBtX2FzY2VudCA9IHN0YXRpY19jYXN0PGludD4oZm9u
dF9leHRlbnRzLmFzY2VudCk7CisgICAgbV9kZXNjZW50ID0gc3RhdGljX2Nhc3Q8aW50Pihmb250
X2V4dGVudHMuZGVzY2VudCk7CisgICAgbV9saW5lU3BhY2luZyA9IHN0YXRpY19jYXN0PGludD4o
Zm9udF9leHRlbnRzLmhlaWdodCk7CisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRfdGV4dF9leHRlbnRz
KHNjYWxlZF9mb250LCAieCIsICZ0ZXh0X2V4dGVudHMpOworICAgIG1feEhlaWdodCA9IHRleHRf
ZXh0ZW50cy5oZWlnaHQ7CisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRfdGV4dF9leHRlbnRzKHNjYWxl
ZF9mb250LCAiICIsICZ0ZXh0X2V4dGVudHMpOworICAgIC8vbV9zcGFjZVdpZHRoID0gIHN0YXRp
Y19jYXN0PGludD4odGV4dF9leHRlbnRzLnhfYWR2YW5jZSk7CisgICAgbV9saW5lR2FwID0gbV9s
aW5lU3BhY2luZyAtIG1fYXNjZW50IC0gbV9kZXNjZW50OworICAgIAorICAgIGNhaXJvX3NjYWxl
ZF9mb250X2Rlc3Ryb3koc2NhbGVkX2ZvbnQpOworI2Vsc2UKICAgICBQYW5nb0NvbnRleHQqIGNv
bnRleHQgPSBnZGtfcGFuZ29fY29udGV4dF9nZXRfZm9yX3NjcmVlbiggZ2RrX3NjcmVlbl9nZXRf
ZGVmYXVsdCgpICk7CiAgICAgUGFuZ29MYXlvdXQqIGxheW91dCA9IHBhbmdvX2xheW91dF9uZXco
Y29udGV4dCk7CiAgICAgLy8gYW5kIHVzZSBpdCBpZiBpdCdzIHZhbGlkCkBAIC02NCw2ICs4OCw3
IEBACiAgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50OwogCiAgICAgcGFu
Z29fZm9udF9tZXRyaWNzX3VucmVmKG1ldHJpY3MpOworI2VuZGlmCiB9CiAKIHZvaWQgR2V0VGV4
dEV4dGVudCggY29uc3Qgd3hGb250JiBmb250LCBjb25zdCB3eFN0cmluZyYgc3RyLCB3eENvb3Jk
ICp3aWR0aCwgd3hDb29yZCAqaGVpZ2h0LApAQCAtMTIzLDQgKzE0OCw0IEBACiAgICAgLy8gUmVz
ZXQgb2xkIGZvbnQgZGVzY3JpcHRpb24KICAgICAvL2lmIChmb250ICE9IHd4TnVsbEZvbnQpCiAg
ICAgLy8gICAgcGFuZ29fbGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uKCBtX2xheW91dCwgbV9m
b250ZGVzYyApOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KSW5kZXg6IFdlYkNv
cmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAz
MDkwMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTkg
QEAKKzIwMDgtMDMtMDggIEtldmluIE9sbGl2aWVyICA8a2V2aW5vQHRoZW9sbGl2aWVycy5jb20+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVt
ZW50IG5vbi1rZXJuZWQgdGV4dCBkcmF3aW5nIGFuZCB0ZXh0IG1lYXN1cmVtZW50IGZvciB3eCB1
c2luZyBDYWlyby4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3d4L1NpbXBsZUZvbnRE
YXRhV3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lk
dGhGb3JHbHlwaCk6CisgICAgICAgICogcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9mb250cHJvcHMu
Y3BwOgorICAgICAgICAod3hGb250UHJvcGVydGllczo6d3hGb250UHJvcGVydGllcyk6CisgICAg
ICAgIChHZXRUZXh0RXh0ZW50KToKKyAgICAgICAgKiBwbGF0Zm9ybS93eC93eGNvZGUvZ3RrL25v
bi1rZXJuZWQtZHJhd2luZy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVTY2FsZWRGb250
Rm9yRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpkcmF3VGV4dFdpdGhTcGFjaW5nKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS93eC93eGNvZGUvbm9uLWtlcm5lZC1kcmF3aW5nLmg6CisKIDIwMDgtMDMt
MDggIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEFkZWxlLgo=
</data>
<flag name="review"
          id="8577"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24701</attachid>
            <date>2008-10-27 16:27:07 -0700</date>
            <delta_ts>2008-12-01 22:27:18 -0800</delta_ts>
            <desc>new patch using PANGO instead of FT for better results</desc>
            <filename>wx_cairo_text.patch</filename>
            <type>text/plain</type>
            <size>12292</size>
            <attacher name="Kevin Ollivier">kevino</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhCdWZmZXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVyLmgJKHJldmlzaW9uIDM3
OTA2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaEJ1ZmZlci5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zMyw3ICszMyw3IEBACiAKICNpZiBQTEFURk9STShDRykKICNpbmNsdWRlIDxB
cHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNlbGlmIFBMQVRGT1JN
KENBSVJPKQorI2VsaWYgUExBVEZPUk0oQ0FJUk8pIHx8IChQTEFURk9STShXWCkgJiYgZGVmaW5l
ZChfX1dYR1RLX18pKQogI2luY2x1ZGUgPGNhaXJvLmg+CiAjZW5kaWYKIApJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9TaW1wbGVGb250RGF0YVd4LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L1NpbXBsZUZvbnREYXRhV3guY3BwCShyZXZp
c2lvbiAzNzkwNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvU2ltcGxlRm9udERh
dGFXeC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDEzIEBACiAjaW5jbHVkZSA8d3gv
ZGNzY3JlZW4uaD4KICNpbmNsdWRlICJmb250cHJvcHMuaCIKIAorI2lmIF9fV1hHVEtfXyAmJiBV
U0UoV1hHQykKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+Cisj
aW5jbHVkZSA8cGFuZ28vcGFuZ29jYWlyby5oPgorI2luY2x1ZGUgIm5vbi1rZXJuZWQtZHJhd2lu
Zy5oIgorI2VuZGlmCisKIG5hbWVzcGFjZSBXZWJDb3JlCiB7CiAKQEAgLTg3LDkgKzk0LDI1IEBA
CiAKIGZsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5
cGgpIGNvbnN0CiB7CisjaWYgX19XWEdUS19fICYmIFVTRShXWEdDKQorICAgIFBhbmdvRm9udCog
cGFuZ29Gb250ID0gY3JlYXRlUGFuZ29Gb250Rm9yRm9udChtX2ZvbnQuZm9udCgpKTsKKyAgICBQ
YW5nb0NvbnRleHQqIHBhbmdvQ29udGV4dCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2NyZWF0ZV9j
b250ZXh0KFBBTkdPX0NBSVJPX0ZPTlRfTUFQKHBhbmdvRm9udE1hcCgpKSk7CisgICAgUGFuZ29H
bHlwaCBwYW5nb0dseXBoID0gcGFuZ29fZm9udF9nZXRfZ2x5cGgocGFuZ29Gb250LCBwYW5nb0Nv
bnRleHQsIGdseXBoKTsKKyAgICBjYWlyb19nbHlwaF90IGNnbHlwaCA9IHsgcGFuZ29HbHlwaCwg
MCwgMCB9OworICAgIGNhaXJvX3RleHRfZXh0ZW50c190IGV4dGVudHM7CisgICAgY2Fpcm9fc2Nh
bGVkX2ZvbnRfdCogc2NhbGVkX2ZvbnQgPSBjcmVhdGVTY2FsZWRGb250Rm9yRm9udChtX2ZvbnQu
Zm9udCgpKTsKKyAgICBjYWlyb19zY2FsZWRfZm9udF9nbHlwaF9leHRlbnRzKHNjYWxlZF9mb250
LCAmY2dseXBoLCAxLCAmZXh0ZW50cyk7CisKKyAgICBmbG9hdCB3aWR0aCA9IChmbG9hdCkxMDsK
KyAgICBpZiAoY2Fpcm9fc2NhbGVkX2ZvbnRfc3RhdHVzKHNjYWxlZF9mb250KSA9PSBDQUlST19T
VEFUVVNfU1VDQ0VTUyAmJiBleHRlbnRzLnhfYWR2YW5jZSAhPSAwKQorICAgICAgICB3aWR0aCA9
IChmbG9hdClleHRlbnRzLnhfYWR2YW5jZTsKKworICAgIGNhaXJvX3NjYWxlZF9mb250X2Rlc3Ry
b3koc2NhbGVkX2ZvbnQpOworI2Vsc2UKICAgICAvLyBUT0RPOiBmaXggdGhpcyEgTWFrZSBHZXRU
ZXh0RXh0ZW50cyBhIG1ldGhvZCBvZiB3eEZvbnQgaW4gMi45CiAgICAgaW50IHdpZHRoID0gMTA7
CiAgICAgR2V0VGV4dEV4dGVudChtX2ZvbnQuZm9udCgpLCAod3hDaGFyKWdseXBoLCAmd2lkdGgs
IE5VTEwpOworI2VuZGlmCiAgICAgcmV0dXJuIHdpZHRoOwogfQogCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL3d4L3d4Y29kZS9ub24ta2VybmVkLWRyYXdpbmcuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9ub24ta2VybmVkLWRyYXdpbmcuaAkocmV2aXNpb24gMzc5
MDYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9ub24ta2VybmVkLWRyYXdpbmcuaAko
d29ya2luZyBjb3B5KQpAQCAtMjgsOSArMjgsMjQgQEAKIA0KICNpbmNsdWRlIDx3eC9kZWZzLmg+
DQogI2luY2x1ZGUgPHd4L2RjY2xpZW50Lmg+DQorCisjaWYgX19XWEdUS19fICYmIFVTRShXWEdD
KQorI2luY2x1ZGUgPGNhaXJvLmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRl
IDxwYW5nby9wYW5nb2NhaXJvLmg+CisjZW5kaWYKIA0KIG5hbWVzcGFjZSBXZWJDb3JlIHsNCiAN
CiBleHRlcm4gdm9pZCBkcmF3VGV4dFdpdGhTcGFjaW5nKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhp
Y3NDb250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgY29uc3Qgd3hDb2xvdXImIGNv
bG9yLCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIGludCBmcm9tLCBpbnQgbnVtR2x5
cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCk7DQotICAgIA0KLX0NCisKKyNpZiBfX1dYR1RL
X18gJiYgVVNFKFdYR0MpCitQYW5nb0ZvbnRNYXAqIHBhbmdvRm9udE1hcCgpOworCitQYW5nb0Zv
bnQqIGNyZWF0ZVBhbmdvRm9udEZvckZvbnQoY29uc3Qgd3hGb250IHd4Zm9udCk7CitjYWlyb19z
Y2FsZWRfZm9udF90KiBjcmVhdGVTY2FsZWRGb250Rm9yRm9udChjb25zdCB3eEZvbnQgd3hmb250
KTsKK1BhbmdvR2x5cGggcGFuZ29fZm9udF9nZXRfZ2x5cGgoUGFuZ29Gb250KiBmb250LCBQYW5n
b0NvbnRleHQqIGNvbnRleHQsIGd1bmljaGFyIHdjKTsKKworI2VuZGlmDQorfQorDQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvZ3RrL25vbi1rZXJuZWQtZHJhd2luZy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvZ3RrL25vbi1rZXJuZWQtZHJh
d2luZy5jcHAJKHJldmlzaW9uIDM3OTA2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUv
Z3RrL25vbi1rZXJuZWQtZHJhd2luZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDE1ICszMywx
NjMgQEAKICNpbmNsdWRlIDx3eC9nZGljbW4uaD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpZiBV
U0UoV1hHQykKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5j
bHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRlIDxwYW5nby9wYW5nb2NhaXJvLmg+CisKKy8v
IFVzZSBjYWlyby1mdCBpIGEgcmVjZW50IGVub3VnaCBQYW5nbyB2ZXJzaW9uIGlzbid0IGF2YWls
YWJsZQorI2lmICFQQU5HT19WRVJTSU9OX0NIRUNLKDEsMTgsMCkKKyNpbmNsdWRlIDxjYWlyby1m
dC5oPgorI2luY2x1ZGUgPHBhbmdvL3BhbmdvZmMtZm9udG1hcC5oPgorI2VuZGlmCisKKyNlbmRp
ZgorCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKyNpZiBV
U0UoV1hHQykKK1BhbmdvRm9udE1hcCogZ19mb250TWFwID0gMDsKKworUGFuZ29Gb250TWFwKiBw
YW5nb0ZvbnRNYXAoKQoreworICAgIHJldHVybiBnX2ZvbnRNYXA7Cit9CisKK1BhbmdvRm9udCog
Y3JlYXRlUGFuZ29Gb250Rm9yRm9udChjb25zdCB3eEZvbnQgd3hmb250KQoreworY29uc3QgY2hh
ciogZmFjZSA9IHd4Zm9udC5HZXRGYWNlTmFtZSgpLm1iX3N0cih3eENvbnZVVEY4KTsKKyAgICBj
aGFyIGNvbnN0KiBmYW1pbGllc1tdID0geworICAgICAgZmFjZSwKKyAgICAgIE5VTEwKKyAgICB9
OworCisgICBzd2l0Y2ggKHd4Zm9udC5HZXRGYW1pbHkoKSkgeworICAgICAgICBjYXNlIHd4Rk9O
VEZBTUlMWV9ST01BTjoKKyAgICAgICAgICAgIGZhbWlsaWVzWzFdID0gInNlcmlmIjsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHd4Rk9OVEZBTUlMWV9TV0lTUzoKKyAgICAgICAg
ICAgIGZhbWlsaWVzWzFdID0gInNhbnMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2Ugd3hGT05URkFNSUxZX01PREVSTjoKKyAgICAgICAgICAgIGZhbWlsaWVzWzFdID0gIm1vbm9z
cGFjZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
IGZhbWlsaWVzWzFdID0gInNhbnMiOworICAgIH0KKyAgICAKKyAgICBQYW5nb0ZvbnREZXNjcmlw
dGlvbiogZGVzY3JpcHRpb24gPSBwYW5nb19mb250X2Rlc2NyaXB0aW9uX25ldygpOworICAgIHBh
bmdvX2ZvbnRfZGVzY3JpcHRpb25fc2V0X2Fic29sdXRlX3NpemUoZGVzY3JpcHRpb24sIHd4Zm9u
dC5HZXRQb2ludFNpemUoKSAqIFBBTkdPX1NDQUxFKTsKKyAKKyAgICBQYW5nb0ZvbnQqIHBhbmdv
Rm9udCA9IDA7CisgICAgUGFuZ29Db250ZXh0KiBwYW5nb0NvbnRleHQgPSAwOworICAgIC8vIEZJ
WE1FOiBNYXAgYWxsIEZvbnRXZWlnaHQgdmFsdWVzIHRvIFBhbmdvIGZvbnQgd2VpZ2h0cy4KKyAg
ICBpZiAod3hmb250LkdldFdlaWdodCgpID09IHd4Rk9OVFdFSUdIVF9CT0xEKQorICAgICAgICBw
YW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF93ZWlnaHQoZGVzY3JpcHRpb24sIFBBTkdPX1dFSUdI
VF9CT0xEKTsKKyAgICBpZiAod3hmb250LkdldFN0eWxlKCkgPT0gd3hGT05UU1RZTEVfSVRBTElD
KQorICAgICAgICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHlsZShkZXNjcmlwdGlvbiwg
UEFOR09fU1RZTEVfSVRBTElDKTsKKworICAgIGlmICghZ19mb250TWFwKQorICAgICAgICBnX2Zv
bnRNYXAgPSBwYW5nb19jYWlyb19mb250X21hcF9nZXRfZGVmYXVsdCgpOworCisgICAgcGFuZ29D
b250ZXh0ID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2NvbnRleHQoUEFOR09fQ0FJUk9f
Rk9OVF9NQVAoZ19mb250TWFwKSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7ICFwYW5n
b0ZvbnQgJiYgaSA8IEdfTl9FTEVNRU5UUyhmYW1pbGllcyk7IGkrKykgeworICAgICAgICBwYW5n
b19mb250X2Rlc2NyaXB0aW9uX3NldF9mYW1pbHkoZGVzY3JpcHRpb24sICJzYW5zIik7IC8vZmFt
aWxpZXNbaV0pOworICAgICAgICBwYW5nb19jb250ZXh0X3NldF9mb250X2Rlc2NyaXB0aW9uKHBh
bmdvQ29udGV4dCwgZGVzY3JpcHRpb24pOworICAgICAgICBwYW5nb0ZvbnQgPSBwYW5nb19mb250
X21hcF9sb2FkX2ZvbnQoZ19mb250TWFwLCBwYW5nb0NvbnRleHQsIGRlc2NyaXB0aW9uKTsKKyAg
ICB9CisgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcmVlKGRlc2NyaXB0aW9uKTsKKworICAg
IHJldHVybiBwYW5nb0ZvbnQ7Cit9CisKK2NhaXJvX3NjYWxlZF9mb250X3QqIGNyZWF0ZVNjYWxl
ZEZvbnRGb3JGb250KGNvbnN0IHd4Rm9udCB3eGZvbnQpCit7CisgICAgY2Fpcm9fc2NhbGVkX2Zv
bnRfdCogc2NhbGVkRm9udCA9IE5VTEw7CisgICAgUGFuZ29Gb250KiBwYW5nb0ZvbnQgPSBjcmVh
dGVQYW5nb0ZvbnRGb3JGb250KHd4Zm9udCk7CisgICAgCisjaWYgUEFOR09fVkVSU0lPTl9DSEVD
SygxLDE4LDApCisgICAgaWYgKHBhbmdvRm9udCkKKyAgICAgICAgc2NhbGVkRm9udCA9IGNhaXJv
X3NjYWxlZF9mb250X3JlZmVyZW5jZShwYW5nb19jYWlyb19mb250X2dldF9zY2FsZWRfZm9udChQ
QU5HT19DQUlST19GT05UKHBhbmdvRm9udCkpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHNjYWxl
ZEZvbnQ7Cit9CisKK1BhbmdvR2x5cGggcGFuZ29fZm9udF9nZXRfZ2x5cGgoUGFuZ29Gb250KiBm
b250LCBQYW5nb0NvbnRleHQqIGNvbnRleHQsIGd1bmljaGFyIHdjKQoreworICAgIFBhbmdvR2x5
cGggcmVzdWx0ID0gMDsKKyAgICBnY2hhciBidWZmZXJbN107CisKKyAgICBnaW50ICBsZW5ndGgg
PSBnX3VuaWNoYXJfdG9fdXRmOCh3YywgYnVmZmVyKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFp
bChsZW5ndGgsIDApOworCisgICAgR0xpc3QqIGl0ZW1zID0gcGFuZ29faXRlbWl6ZShjb250ZXh0
LCBidWZmZXIsIDAsIGxlbmd0aCwgTlVMTCwgTlVMTCk7CisKKyAgICBpZiAoZ19saXN0X2xlbmd0
aChpdGVtcykgPT0gMSkgeworICAgICAgICBQYW5nb0l0ZW0qIGl0ZW0gPSByZWludGVycHJldF9j
YXN0PFBhbmdvSXRlbSo+KGl0ZW1zLT5kYXRhKTsKKyAgICAgICAgUGFuZ29Gb250KiB0bXBGb250
ID0gaXRlbS0+YW5hbHlzaXMuZm9udDsKKyAgICAgICAgaXRlbS0+YW5hbHlzaXMuZm9udCA9IGZv
bnQ7CisKKyAgICAgICAgUGFuZ29HbHlwaFN0cmluZyogZ2x5cGhzID0gcGFuZ29fZ2x5cGhfc3Ry
aW5nX25ldygpOworICAgICAgICBwYW5nb19zaGFwZShidWZmZXIsIGxlbmd0aCwgJml0ZW0tPmFu
YWx5c2lzLCBnbHlwaHMpOworCisgICAgICAgIGl0ZW0tPmFuYWx5c2lzLmZvbnQgPSB0bXBGb250
OworCisgICAgICAgIGlmIChnbHlwaHMtPm51bV9nbHlwaHMgPT0gMSkKKyAgICAgICAgICAgIHJl
c3VsdCA9IGdseXBocy0+Z2x5cGhzWzBdLmdseXBoOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBnX3dhcm5pbmcoImRpZG4ndCBnZXQgMSBnbHlwaCBidXQgJWQiLCBnbHlwaHMtPm51bV9nbHlw
aHMpOworCisgICAgICAgIHBhbmdvX2dseXBoX3N0cmluZ19mcmVlKGdseXBocyk7CisgICAgfQor
CisgICAgZ19saXN0X2ZvcmVhY2goaXRlbXMsIChHRnVuYylwYW5nb19pdGVtX2ZyZWUsIE5VTEwp
OworICAgIGdfbGlzdF9mcmVlKGl0ZW1zKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5k
aWYgLy8gVVNFKFdYR0MpCisKIHZvaWQgZHJhd1RleHRXaXRoU3BhY2luZyhHcmFwaGljc0NvbnRl
eHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IHd4
Q29sb3VyJiBjb2xvciwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBpbnQgZnJvbSwg
aW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCiB7CiAjaWYgVVNFKFdYR0Mp
CiAgICAgd3hHQ0RDKiBkYyA9IHN0YXRpY19jYXN0PHd4R0NEQyo+KGdyYXBoaWNzQ29udGV4dC0+
cGxhdGZvcm1Db250ZXh0KCkpOworICAgIHd4R3JhcGhpY3NDb250ZXh0KiBnYyA9IGRjLT5HZXRH
cmFwaGljc0NvbnRleHQoKTsKKyAgICBnYy0+UHVzaFN0YXRlKCk7CisgICAgY2Fpcm9fdCogY3Ig
PSAoY2Fpcm9fdCopZ2MtPkdldE5hdGl2ZUNvbnRleHQoKTsKKworICAgIHd4Rm9udCB3eGZvbnQg
PSBmb250LT5nZXRXeEZvbnQoKTsKKyAgICBQYW5nb0ZvbnQqIHBhbmdvRm9udCA9IGNyZWF0ZVBh
bmdvRm9udEZvckZvbnQod3hmb250KTsKKyAgICBQYW5nb0NvbnRleHQqIHBhbmdvQ29udGV4dCA9
IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2NyZWF0ZV9jb250ZXh0KFBBTkdPX0NBSVJPX0ZPTlRfTUFQ
KGdfZm9udE1hcCkpOworICAgIGNhaXJvX3NjYWxlZF9mb250X3QqIHNjYWxlZF9mb250ID0gY3Jl
YXRlU2NhbGVkRm9udEZvckZvbnQod3hmb250KTsgCisgICAgQVNTRVJUKHNjYWxlZF9mb250KTsK
KworICAgIGNhaXJvX2dseXBoX3QqIGdseXBocyA9IE5VTEw7CisgICAgZ2x5cGhzID0gKGNhaXJv
X2dseXBoX3QqKW1hbGxvYyAoc2l6ZW9mKGNhaXJvX2dseXBoX3QpICogbnVtR2x5cGhzKTsKKwor
ICAgIGZsb2F0IG9mZnNldCA9IHBvaW50LngoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bnVtR2x5cGhzOyBpKyspIHsKKyAgICAgICAgZ2x5cGhzW2ldLmluZGV4ID0gcGFuZ29fZm9udF9n
ZXRfZ2x5cGgocGFuZ29Gb250LCBwYW5nb0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBoQXQoZnJv
bSArIGkpKTsKKyAgICAgICAgZ2x5cGhzW2ldLnggPSBvZmZzZXQ7CisgICAgICAgIGdseXBoc1tp
XS55ID0gcG9pbnQueSgpOworICAgICAgICBvZmZzZXQgKz0gZ2x5cGhCdWZmZXIuYWR2YW5jZUF0
KGZyb20gKyBpKTsKKyAgICB9CisKKyAgICBjYWlyb19zZXRfc291cmNlX3JnYmEoY3IsIGNvbG9y
LlJlZCgpLzI1NS4wLCBjb2xvci5HcmVlbigpLzI1NS4wLCBjb2xvci5CbHVlKCkvMjU1LjAsIGNv
bG9yLkFscGhhKCkvMjU1LjApOworICAgIGNhaXJvX3NldF9zY2FsZWRfZm9udChjciwgc2NhbGVk
X2ZvbnQpOworICAgIAorICAgIGNhaXJvX3Nob3dfZ2x5cGhzKGNyLCBnbHlwaHMsIG51bUdseXBo
cyk7CisKKyAgICBjYWlyb19zY2FsZWRfZm9udF9kZXN0cm95KHNjYWxlZF9mb250KTsKKyAgICBn
Yy0+UG9wU3RhdGUoKTsKICNlbHNlCiAgICAgd3hEQyogZGMgPSBncmFwaGljc0NvbnRleHQtPnBs
YXRmb3JtQ29udGV4dCgpOwotI2VuZGlmCiAKICAgICB3eEZvbnQgd3hmb250ID0gZm9udC0+Z2V0
V3hGb250KCk7CiAgICAgaWYgKHd4Zm9udC5Jc09rKCkpCkBAIC02Miw2ICsyMTAsNyBAQAogICAg
IHd4Q29vcmQgeXBvaW50ID0gKHd4Q29vcmQpIChwb2ludC55KCkgLSBoZWlnaHQpOwogICAgICAK
ICAgICBkYy0+RHJhd1RleHQodGV4dCwgKHd4Q29vcmQpcG9pbnQueCgpLCB5cG9pbnQpOworI2Vu
ZGlmCiB9CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9mb250cHJv
cHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9mb250
cHJvcHMuY3BwCShyZXZpc2lvbiAzNzkwNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2Rl
L2d0ay9mb250cHJvcHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCwxMiArMjgsMzYgQEAKICNp
bmNsdWRlIDx3eC9mb250Lmg+CiAjaW5jbHVkZSA8d3gvZm9udHV0aWwuaD4KICNpbmNsdWRlICJm
b250cHJvcHMuaCIKKyNpbmNsdWRlICJub24ta2VybmVkLWRyYXdpbmcuaCIKIAogI2luY2x1ZGUg
PGdkay9nZGsuaD4KIAorI2lmIFVTRShXWEdDKQorI2luY2x1ZGUgPGNhaXJvLWZ0Lmg+CisjaW5j
bHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxmb250Y29uZmlnL2ZjZnJlZXR5cGUuaD4KKyNlbmRp
ZgorCiB3eEZvbnRQcm9wZXJ0aWVzOjp3eEZvbnRQcm9wZXJ0aWVzKHd4Rm9udCogZm9udCk6CiBt
X2FzY2VudCgwKSwgbV9kZXNjZW50KDApLCBtX2xpbmVHYXAoMCksIG1fbGluZVNwYWNpbmcoMCks
IG1feEhlaWdodCgwKQogeworI2lmIFVTRShXWEdDKQorICAgIGNhaXJvX2ZvbnRfZXh0ZW50c190
IGZvbnRfZXh0ZW50czsKKyAgICBjYWlyb190ZXh0X2V4dGVudHNfdCB0ZXh0X2V4dGVudHM7Cisg
ICAgY2Fpcm9fc2NhbGVkX2ZvbnRfdCogc2NhbGVkX2ZvbnQgPSBXZWJDb3JlOjpjcmVhdGVTY2Fs
ZWRGb250Rm9yRm9udCgqZm9udCk7CisgICAgCisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRfZXh0ZW50
cyhzY2FsZWRfZm9udCwgJmZvbnRfZXh0ZW50cyk7CisgICAgbV9hc2NlbnQgPSBzdGF0aWNfY2Fz
dDxpbnQ+KGZvbnRfZXh0ZW50cy5hc2NlbnQpOworICAgIG1fZGVzY2VudCA9IHN0YXRpY19jYXN0
PGludD4oZm9udF9leHRlbnRzLmRlc2NlbnQpOworICAgIG1fbGluZVNwYWNpbmcgPSBzdGF0aWNf
Y2FzdDxpbnQ+KGZvbnRfZXh0ZW50cy5oZWlnaHQpOworICAgIGNhaXJvX3NjYWxlZF9mb250X3Rl
eHRfZXh0ZW50cyhzY2FsZWRfZm9udCwgIngiLCAmdGV4dF9leHRlbnRzKTsKKyAgICBtX3hIZWln
aHQgPSB0ZXh0X2V4dGVudHMuaGVpZ2h0OworICAgIGNhaXJvX3NjYWxlZF9mb250X3RleHRfZXh0
ZW50cyhzY2FsZWRfZm9udCwgIiAiLCAmdGV4dF9leHRlbnRzKTsKKyAgICAvL21fc3BhY2VXaWR0
aCA9ICBzdGF0aWNfY2FzdDxpbnQ+KHRleHRfZXh0ZW50cy54X2FkdmFuY2UpOworICAgIG1fbGlu
ZUdhcCA9IG1fbGluZVNwYWNpbmcgLSBtX2FzY2VudCAtIG1fZGVzY2VudDsKKyAgICAKKyAgICBj
YWlyb19zY2FsZWRfZm9udF9kZXN0cm95KHNjYWxlZF9mb250KTsKKyNlbHNlCiAgICAgUGFuZ29D
b250ZXh0KiBjb250ZXh0ID0gZ2RrX3BhbmdvX2NvbnRleHRfZ2V0X2Zvcl9zY3JlZW4oIGdka19z
Y3JlZW5fZ2V0X2RlZmF1bHQoKSApOwogICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQgPSBwYW5nb19s
YXlvdXRfbmV3KGNvbnRleHQpOwogICAgIC8vIGFuZCB1c2UgaXQgaWYgaXQncyB2YWxpZApAQCAt
NjQsNiArODgsNyBAQAogICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudDsK
IAogICAgIHBhbmdvX2ZvbnRfbWV0cmljc191bnJlZihtZXRyaWNzKTsKKyNlbmRpZgogfQogCiB2
b2lkIEdldFRleHRFeHRlbnQoIGNvbnN0IHd4Rm9udCYgZm9udCwgY29uc3Qgd3hTdHJpbmcmIHN0
ciwgd3hDb29yZCAqd2lkdGgsIHd4Q29vcmQgKmhlaWdodCwKQEAgLTEwMywyNCArMTI4LDIyIEBA
CiAKICAgICBwYW5nb19sYXlvdXRfc2V0X3RleHQoIG1fbGF5b3V0LCBkYXRhVVRGOCwgc3RybGVu
KGRhdGFVVEY4KSApOwogCisgICAgaW50IGggPSAwOworICAgIHBhbmdvX2xheW91dF9nZXRfcGl4
ZWxfc2l6ZSggbV9sYXlvdXQsIHdpZHRoLCAmaCApOworCiAgICAgaWYgKGRlc2NlbnQpCiAgICAg
ewotICAgICAgICBpbnQgaDsKLSAgICAgICAgcGFuZ29fbGF5b3V0X2dldF9waXhlbF9zaXplKCBt
X2xheW91dCwgd2lkdGgsICZoICk7CiAgICAgICAgIFBhbmdvTGF5b3V0SXRlciAqaXRlciA9IHBh
bmdvX2xheW91dF9nZXRfaXRlcihtX2xheW91dCk7CiAgICAgICAgIGludCBiYXNlbGluZSA9IHBh
bmdvX2xheW91dF9pdGVyX2dldF9iYXNlbGluZShpdGVyKTsKICAgICAgICAgcGFuZ29fbGF5b3V0
X2l0ZXJfZnJlZShpdGVyKTsKICAgICAgICAgKmRlc2NlbnQgPSBoIC0gUEFOR09fUElYRUxTKGJh
c2VsaW5lKTsKLQotICAgICAgICBpZiAoaGVpZ2h0KQotICAgICAgICAgICAgKmhlaWdodCA9ICh3
eENvb3JkKSBoOwogICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwYW5nb19sYXlvdXRf
Z2V0X3BpeGVsX3NpemUoIG1fbGF5b3V0LCB3aWR0aCwgaGVpZ2h0ICk7Ci0gICAgfQogCisgICAg
aWYgKGhlaWdodCkKKyAgICAgICAgKmhlaWdodCA9ICh3eENvb3JkKSBoOworCiAgICAgLy8gUmVz
ZXQgb2xkIGZvbnQgZGVzY3JpcHRpb24KICAgICAvL2lmIChmb250ICE9IHd4TnVsbEZvbnQpCiAg
ICAgLy8gICAgcGFuZ29fbGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uKCBtX2xheW91dCwgbV9m
b250ZGVzYyApOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKwpJbmRleDogV2Vi
Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9u
IDM3OTA3KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwy
MyBAQAorMjAwOC0xMC0yNyAgS2V2aW4gT2xsaXZpZXIgIDxrZXZpbm9AdGhlb2xsaXZpZXJzLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBVc2Ug
Q2Fpcm8vUEFOR08gdG8gZml4IHRleHQgbWVhc3VyZW1lbnRzIGFuZCBpbXBsZW1lbnQgcHJvcGVy
IG5vbi1rZXJuZWQgZHJhd2luZyBvbiB3eEdUSy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL0dseXBoQnVmZmVyLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvU2ltcGxl
Rm9udERhdGFXeC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZv
cm1XaWR0aEZvckdseXBoKToKKyAgICAgICAgKiBwbGF0Zm9ybS93eC93eGNvZGUvZ3RrL2ZvbnRw
cm9wcy5jcHA6CisgICAgICAgICh3eEZvbnRQcm9wZXJ0aWVzOjp3eEZvbnRQcm9wZXJ0aWVzKToK
KyAgICAgICAgKEdldFRleHRFeHRlbnQpOgorICAgICAgICAqIHBsYXRmb3JtL3d4L3d4Y29kZS9n
dGsvbm9uLWtlcm5lZC1kcmF3aW5nLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnBhbmdvRm9udE1h
cCk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVQYW5nb0ZvbnRGb3JGb250KToKKyAgICAgICAg
KFdlYkNvcmU6OmNyZWF0ZVNjYWxlZEZvbnRGb3JGb250KToKKyAgICAgICAgKFdlYkNvcmU6OnBh
bmdvX2ZvbnRfZ2V0X2dseXBoKToKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdUZXh0V2l0aFNwYWNp
bmcpOgorICAgICAgICAqIHBsYXRmb3JtL3d4L3d4Y29kZS9ub24ta2VybmVkLWRyYXdpbmcuaDoK
KwogMjAwOC0xMC0yNyAgS2V2aW4gV2F0dGVycyAgPGtldmlud2F0dGVyc0BnbWFpbC5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgS2V2aW4gT2xsaXZpZXIuCg==
</data>
<flag name="review"
          id="11289"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>25665</attachid>
            <date>2008-12-01 22:27:18 -0800</date>
            <delta_ts>2009-05-11 05:23:38 -0700</delta_ts>
            <desc>Revised patch with Adam&apos;s comments addressed</desc>
            <filename>wx_cairo_text2.patch</filename>
            <type>text/plain</type>
            <size>11945</size>
            <attacher name="Kevin Ollivier">kevino</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzODg5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMDgtMTItMDEgIEtldmluIE9sbGl2aWVyICA8c2V0IEVNQUlMX0FE
RFJFU1MgZW52aXJvbm1lbnQgdmFyaWFibGU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgVXNlIENhaXJvL1BBTkdPIHRvIGZpeCB0ZXh0IG1lYXN1cmVt
ZW50cyBhbmQgaW1wbGVtZW50IHByb3BlciBub24ta2VybmVkIGRyYXdpbmcgb24gd3hHVEsuCisK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HbHlwaEJ1ZmZlci5oOgorICAgICAgICAqIHBs
YXRmb3JtL3d4L3d4Y29kZS9ndGsvZm9udHByb3BzLmNwcDoKKyAgICAgICAgKHd4Rm9udFByb3Bl
cnRpZXM6Ond4Rm9udFByb3BlcnRpZXMpOgorICAgICAgICAoR2V0VGV4dEV4dGVudCk6CisgICAg
ICAgICogcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9ub24ta2VybmVkLWRyYXdpbmcuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6cGFuZ29Gb250TWFwKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZVBh
bmdvRm9udEZvckZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlU2NhbGVkRm9udEZvckZv
bnQpOgorICAgICAgICAoV2ViQ29yZTo6cGFuZ29fZm9udF9nZXRfZ2x5cGgpOgorICAgICAgICAo
V2ViQ29yZTo6ZHJhd1RleHRXaXRoU3BhY2luZyk6CisgICAgICAgICogcGxhdGZvcm0vd3gvd3hj
b2RlL25vbi1rZXJuZWQtZHJhd2luZy5oOgorCiAyMDA4LTEyLTAxICBTdGV2ZSBGYWxrZW5idXJn
ICA8c2ZhbGtlbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aXNlIG5vZGUvc2VsZWN0aW9uIGlt
YWdlIGZpeC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhCdWZmZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVyLmgJKHJl
dmlzaW9uIDM4ODkyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaEJ1ZmZlci5o
CSh3b3JraW5nIGNvcHkpCkBAIC0zMyw3ICszMyw3IEBACiAKICNpZiBQTEFURk9STShDRykKICNp
bmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNlbGlm
IFBMQVRGT1JNKENBSVJPKQorI2VsaWYgUExBVEZPUk0oQ0FJUk8pIHx8IChQTEFURk9STShXWCkg
JiYgZGVmaW5lZChfX1dYR1RLX18pKQogI2luY2x1ZGUgPGNhaXJvLmg+CiAjZW5kaWYKIApJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvbm9uLWtlcm5lZC1kcmF3aW5nLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvbm9uLWtlcm5lZC1kcmF3aW5nLmgJ
KHJldmlzaW9uIDM4ODkyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvbm9uLWtlcm5l
ZC1kcmF3aW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTI4LDkgKzI4LDI0IEBACiANCiAjaW5jbHVk
ZSA8d3gvZGVmcy5oPg0KICNpbmNsdWRlIDx3eC9kY2NsaWVudC5oPg0KKworI2lmIF9fV1hHVEtf
XyAmJiBVU0UoV1hHQykKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPHBhbmdvL3Bhbmdv
Lmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ29jYWlyby5oPgorI2VuZGlmCiANCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7DQogDQogZXh0ZXJuIHZvaWQgZHJhd1RleHRXaXRoU3BhY2luZyhHcmFwaGljc0Nv
bnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0
IHd4Q29sb3VyJiBjb2xvciwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBpbnQgZnJv
bSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpOw0KLSAgICANCi19DQor
CisjaWYgX19XWEdUS19fICYmIFVTRShXWEdDKQorUGFuZ29Gb250TWFwKiBwYW5nb0ZvbnRNYXAo
KTsKKworUGFuZ29Gb250KiBjcmVhdGVQYW5nb0ZvbnRGb3JGb250KGNvbnN0IHd4Rm9udCB3eGZv
bnQpOworY2Fpcm9fc2NhbGVkX2ZvbnRfdCogY3JlYXRlU2NhbGVkRm9udEZvckZvbnQoY29uc3Qg
d3hGb250IHd4Zm9udCk7CitQYW5nb0dseXBoIHBhbmdvX2ZvbnRfZ2V0X2dseXBoKFBhbmdvRm9u
dCogZm9udCwgUGFuZ29Db250ZXh0KiBjb250ZXh0LCBndW5pY2hhciB3Yyk7CisKKyNlbmRpZg0K
K30KKw0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9ub24ta2VybmVkLWRy
YXdpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9u
b24ta2VybmVkLWRyYXdpbmcuY3BwCShyZXZpc2lvbiAzODg5MikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vd3gvd3hjb2RlL2d0ay9ub24ta2VybmVkLWRyYXdpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMywxNSArMzMsMTY2IEBACiAjaW5jbHVkZSA8d3gvZ2RpY21uLmg+CiAjaW5jbHVkZSA8dmVj
dG9yPgogCisjaWYgVVNFKFdYR0MpCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxhc3Nl
cnQuaD4KKworI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ29j
YWlyby5oPgorCisvLyBVc2UgY2Fpcm8tZnQgaWYgYSByZWNlbnQgZW5vdWdoIFBhbmdvIHZlcnNp
b24gaXNuJ3QgYXZhaWxhYmxlCisjaWYgIVBBTkdPX1ZFUlNJT05fQ0hFQ0soMSwxOCwwKQorI2lu
Y2x1ZGUgPGNhaXJvLWZ0Lmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ29mYy1mb250bWFwLmg+Cisj
ZW5kaWYKKworI2VuZGlmCisKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAorI2lmIFVTRShXWEdDKQorc3RhdGljIFBhbmdvRm9udE1hcCogZ19mb250TWFwOwor
CitQYW5nb0ZvbnRNYXAqIHBhbmdvRm9udE1hcCgpCit7CisgICAgaWYgKCFnX2ZvbnRNYXApCisg
ICAgICAgIGdfZm9udE1hcCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2dldF9kZWZhdWx0KCk7CisK
KyAgICByZXR1cm4gZ19mb250TWFwOworfQorCitQYW5nb0ZvbnQqIGNyZWF0ZVBhbmdvRm9udEZv
ckZvbnQoY29uc3Qgd3hGb250IHd4Zm9udCkKK3sKKyAgICBjb25zdCBjaGFyKiBmYWNlID0gd3hm
b250LkdldEZhY2VOYW1lKCkubWJfc3RyKHd4Q29udlVURjgpOworICAgIGNoYXIgY29uc3QqIGZh
bWlsaWVzW10gPSB7CisgICAgICAgIGZhY2UsCisgICAgICAgIDAKKyAgICB9OworCisgICBzd2l0
Y2ggKHd4Zm9udC5HZXRGYW1pbHkoKSkgeworICAgICAgICBjYXNlIHd4Rk9OVEZBTUlMWV9ST01B
TjoKKyAgICAgICAgICAgIGZhbWlsaWVzWzFdID0gInNlcmlmIjsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIHd4Rk9OVEZBTUlMWV9TV0lTUzoKKyAgICAgICAgICAgIGZhbWlsaWVz
WzFdID0gInNhbnMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugd3hGT05URkFN
SUxZX01PREVSTjoKKyAgICAgICAgICAgIGZhbWlsaWVzWzFdID0gIm1vbm9zcGFjZSI7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZhbWlsaWVzWzFd
ID0gInNhbnMiOworICAgIH0KKyAgICAKKyAgICBQYW5nb0ZvbnREZXNjcmlwdGlvbiogZGVzY3Jp
cHRpb24gPSBwYW5nb19mb250X2Rlc2NyaXB0aW9uX25ldygpOworICAgIHBhbmdvX2ZvbnRfZGVz
Y3JpcHRpb25fc2V0X2Fic29sdXRlX3NpemUoZGVzY3JpcHRpb24sIHd4Zm9udC5HZXRQb2ludFNp
emUoKSAqIFBBTkdPX1NDQUxFKTsKKyAKKyAgICBQYW5nb0ZvbnQqIHBhbmdvRm9udCA9IDA7Cisg
ICAgUGFuZ29Db250ZXh0KiBwYW5nb0NvbnRleHQgPSAwOworICAgIC8vIEZJWE1FOiBNYXAgYWxs
IEZvbnRXZWlnaHQgdmFsdWVzIHRvIFBhbmdvIGZvbnQgd2VpZ2h0cy4KKyAgICBpZiAod3hmb250
LkdldFdlaWdodCgpID09IHd4Rk9OVFdFSUdIVF9CT0xEKQorICAgICAgICBwYW5nb19mb250X2Rl
c2NyaXB0aW9uX3NldF93ZWlnaHQoZGVzY3JpcHRpb24sIFBBTkdPX1dFSUdIVF9CT0xEKTsKKyAg
ICBpZiAod3hmb250LkdldFN0eWxlKCkgPT0gd3hGT05UU1RZTEVfSVRBTElDKQorICAgICAgICBw
YW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHlsZShkZXNjcmlwdGlvbiwgUEFOR09fU1RZTEVf
SVRBTElDKTsKKworICAgIFBhbmdvRm9udE1hcCogZm9udE1hcCA9IHBhbmdvRm9udE1hcCgpOwor
CisgICAgcGFuZ29Db250ZXh0ID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2NvbnRleHQo
UEFOR09fQ0FJUk9fRk9OVF9NQVAoZm9udE1hcCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7
ICFwYW5nb0ZvbnQgJiYgaSA8IEdfTl9FTEVNRU5UUyhmYW1pbGllcyk7IGkrKykgeworICAgICAg
ICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9mYW1pbHkoZGVzY3JpcHRpb24sIGZhbWlsaWVz
W2ldKTsKKyAgICAgICAgcGFuZ29fY29udGV4dF9zZXRfZm9udF9kZXNjcmlwdGlvbihwYW5nb0Nv
bnRleHQsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgcGFuZ29Gb250ID0gcGFuZ29fZm9udF9tYXBf
bG9hZF9mb250KGZvbnRNYXAsIHBhbmdvQ29udGV4dCwgZGVzY3JpcHRpb24pOworICAgIH0KKyAg
ICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX2ZyZWUoZGVzY3JpcHRpb24pOworCisgICAgcmV0dXJu
IHBhbmdvRm9udDsKK30KKworY2Fpcm9fc2NhbGVkX2ZvbnRfdCogY3JlYXRlU2NhbGVkRm9udEZv
ckZvbnQoY29uc3Qgd3hGb250IHd4Zm9udCkKK3sKKyAgICBjYWlyb19zY2FsZWRfZm9udF90KiBz
Y2FsZWRGb250ID0gTlVMTDsKKyAgICBQYW5nb0ZvbnQqIHBhbmdvRm9udCA9IGNyZWF0ZVBhbmdv
Rm9udEZvckZvbnQod3hmb250KTsKKyAgICAKKyNpZiBQQU5HT19WRVJTSU9OX0NIRUNLKDEsMTgs
MCkKKyAgICBpZiAocGFuZ29Gb250KQorICAgICAgICBzY2FsZWRGb250ID0gY2Fpcm9fc2NhbGVk
X2ZvbnRfcmVmZXJlbmNlKHBhbmdvX2NhaXJvX2ZvbnRfZ2V0X3NjYWxlZF9mb250KFBBTkdPX0NB
SVJPX0ZPTlQocGFuZ29Gb250KSkpOworI2VuZGlmCisKKyAgICByZXR1cm4gc2NhbGVkRm9udDsK
K30KKworUGFuZ29HbHlwaCBwYW5nb19mb250X2dldF9nbHlwaChQYW5nb0ZvbnQqIGZvbnQsIFBh
bmdvQ29udGV4dCogY29udGV4dCwgZ3VuaWNoYXIgd2MpCit7CisgICAgUGFuZ29HbHlwaCByZXN1
bHQgPSAwOworICAgIGdjaGFyIGJ1ZmZlcls3XTsKKworICAgIGdpbnQgIGxlbmd0aCA9IGdfdW5p
Y2hhcl90b191dGY4KHdjLCBidWZmZXIpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKGxlbmd0
aCwgMCk7CisKKyAgICBHTGlzdCogaXRlbXMgPSBwYW5nb19pdGVtaXplKGNvbnRleHQsIGJ1ZmZl
ciwgMCwgbGVuZ3RoLCBOVUxMLCBOVUxMKTsKKworICAgIGlmIChnX2xpc3RfbGVuZ3RoKGl0ZW1z
KSA9PSAxKSB7CisgICAgICAgIFBhbmdvSXRlbSogaXRlbSA9IHN0YXRpY19jYXN0PFBhbmdvSXRl
bSo+KGl0ZW1zLT5kYXRhKTsKKyAgICAgICAgUGFuZ29Gb250KiB0bXBGb250ID0gaXRlbS0+YW5h
bHlzaXMuZm9udDsKKyAgICAgICAgaXRlbS0+YW5hbHlzaXMuZm9udCA9IGZvbnQ7CisKKyAgICAg
ICAgUGFuZ29HbHlwaFN0cmluZyogZ2x5cGhzID0gcGFuZ29fZ2x5cGhfc3RyaW5nX25ldygpOwor
ICAgICAgICBwYW5nb19zaGFwZShidWZmZXIsIGxlbmd0aCwgJml0ZW0tPmFuYWx5c2lzLCBnbHlw
aHMpOworCisgICAgICAgIGl0ZW0tPmFuYWx5c2lzLmZvbnQgPSB0bXBGb250OworCisgICAgICAg
IGlmIChnbHlwaHMtPm51bV9nbHlwaHMgPT0gMSkKKyAgICAgICAgICAgIHJlc3VsdCA9IGdseXBo
cy0+Z2x5cGhzWzBdLmdseXBoOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnX3dhcm5pbmco
ImRpZG4ndCBnZXQgMSBnbHlwaCBidXQgJWQiLCBnbHlwaHMtPm51bV9nbHlwaHMpOworCisgICAg
ICAgIHBhbmdvX2dseXBoX3N0cmluZ19mcmVlKGdseXBocyk7CisgICAgfQorCisgICAgZ19saXN0
X2ZvcmVhY2goaXRlbXMsIChHRnVuYylwYW5nb19pdGVtX2ZyZWUsIE5VTEwpOworICAgIGdfbGlz
dF9mcmVlKGl0ZW1zKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLy8gVVNFKFdY
R0MpCisKIHZvaWQgZHJhd1RleHRXaXRoU3BhY2luZyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNz
Q29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IHd4Q29sb3VyJiBjb2xv
ciwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBpbnQgZnJvbSwgaW50IG51bUdseXBo
cywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCiB7CiAjaWYgVVNFKFdYR0MpCiAgICAgd3hHQ0RD
KiBkYyA9IHN0YXRpY19jYXN0PHd4R0NEQyo+KGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCkpOworICAgIHd4R3JhcGhpY3NDb250ZXh0KiBnYyA9IGRjLT5HZXRHcmFwaGljc0NvbnRl
eHQoKTsKKyAgICBnYy0+UHVzaFN0YXRlKCk7CisgICAgY2Fpcm9fdCogY3IgPSAoY2Fpcm9fdCop
Z2MtPkdldE5hdGl2ZUNvbnRleHQoKTsKKworICAgIHd4Rm9udCB3eGZvbnQgPSBmb250LT5nZXRX
eEZvbnQoKTsKKyAgICBQYW5nb0ZvbnQqIHBhbmdvRm9udCA9IGNyZWF0ZVBhbmdvRm9udEZvckZv
bnQod3hmb250KTsKKyAgICBQYW5nb0ZvbnRNYXAqIGZvbnRNYXAgPSBwYW5nb0ZvbnRNYXAoKTsK
KyAgICBQYW5nb0NvbnRleHQqIHBhbmdvQ29udGV4dCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2Ny
ZWF0ZV9jb250ZXh0KFBBTkdPX0NBSVJPX0ZPTlRfTUFQKGZvbnRNYXApKTsKKyAgICBjYWlyb19z
Y2FsZWRfZm9udF90KiBzY2FsZWRfZm9udCA9IGNyZWF0ZVNjYWxlZEZvbnRGb3JGb250KHd4Zm9u
dCk7IAorICAgIEFTU0VSVChzY2FsZWRfZm9udCk7CisKKyAgICBjYWlyb19nbHlwaF90KiBnbHlw
aHMgPSBOVUxMOworICAgIGdseXBocyA9IHN0YXRpY19jYXN0PGNhaXJvX2dseXBoX3QqPihtYWxs
b2Moc2l6ZW9mKGNhaXJvX2dseXBoX3QpICogbnVtR2x5cGhzKSk7CisKKyAgICBmbG9hdCBvZmZz
ZXQgPSBwb2ludC54KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsr
KSB7CisgICAgICAgIGdseXBoc1tpXS5pbmRleCA9IHBhbmdvX2ZvbnRfZ2V0X2dseXBoKHBhbmdv
Rm9udCwgcGFuZ29Db250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaEF0KGZyb20gKyBpKSk7CisgICAg
ICAgIGdseXBoc1tpXS54ID0gb2Zmc2V0OworICAgICAgICBnbHlwaHNbaV0ueSA9IHBvaW50Lnko
KTsKKyAgICAgICAgb2Zmc2V0ICs9IGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSk7Cisg
ICAgfQorCisgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCBjb2xvci5SZWQoKS8yNTUuMCwg
Y29sb3IuR3JlZW4oKS8yNTUuMCwgY29sb3IuQmx1ZSgpLzI1NS4wLCBjb2xvci5BbHBoYSgpLzI1
NS4wKTsKKyAgICBjYWlyb19zZXRfc2NhbGVkX2ZvbnQoY3IsIHNjYWxlZF9mb250KTsKKyAgICAK
KyAgICBjYWlyb19zaG93X2dseXBocyhjciwgZ2x5cGhzLCBudW1HbHlwaHMpOworCisgICAgY2Fp
cm9fc2NhbGVkX2ZvbnRfZGVzdHJveShzY2FsZWRfZm9udCk7CisgICAgZ2MtPlBvcFN0YXRlKCk7
CiAjZWxzZQogICAgIHd4REMqIGRjID0gZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQo
KTsKLSNlbmRpZgogCiAgICAgd3hGb250IHd4Zm9udCA9IGZvbnQtPmdldFd4Rm9udCgpOwogICAg
IGlmICh3eGZvbnQuSXNPaygpKQpAQCAtNjIsNiArMjEzLDcgQEAKICAgICB3eENvb3JkIHlwb2lu
dCA9ICh3eENvb3JkKSAocG9pbnQueSgpIC0gaGVpZ2h0KTsKICAgICAgCiAgICAgZGMtPkRyYXdU
ZXh0KHRleHQsICh3eENvb3JkKXBvaW50LngoKSwgeXBvaW50KTsKKyNlbmRpZgogfQogCiB9Cklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9ndGsvZm9udHByb3BzLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9ndGsvZm9udHByb3BzLmNwcAkocmV2
aXNpb24gMzg4OTIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9ndGsvZm9udHByb3Bz
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsMTIgKzI4LDM0IEBACiAjaW5jbHVkZSA8d3gvZm9u
dC5oPgogI2luY2x1ZGUgPHd4L2ZvbnR1dGlsLmg+CiAjaW5jbHVkZSAiZm9udHByb3BzLmgiCisj
aW5jbHVkZSAibm9uLWtlcm5lZC1kcmF3aW5nLmgiCiAKICNpbmNsdWRlIDxnZGsvZ2RrLmg+CiAK
KyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8
cGFuZ28vcGFuZ29jYWlyby5oPgorCisKIHd4Rm9udFByb3BlcnRpZXM6Ond4Rm9udFByb3BlcnRp
ZXMod3hGb250KiBmb250KToKIG1fYXNjZW50KDApLCBtX2Rlc2NlbnQoMCksIG1fbGluZUdhcCgw
KSwgbV9saW5lU3BhY2luZygwKSwgbV94SGVpZ2h0KDApCiB7CisjaWYgVVNFKFdYR0MpCisgICAg
Y2Fpcm9fZm9udF9leHRlbnRzX3QgZm9udF9leHRlbnRzOworICAgIGNhaXJvX3RleHRfZXh0ZW50
c190IHRleHRfZXh0ZW50czsKKyAgICBjYWlyb19zY2FsZWRfZm9udF90KiBzY2FsZWRfZm9udCA9
IFdlYkNvcmU6OmNyZWF0ZVNjYWxlZEZvbnRGb3JGb250KCpmb250KTsKKyAgICAKKyAgICBjYWly
b19zY2FsZWRfZm9udF9leHRlbnRzKHNjYWxlZF9mb250LCAmZm9udF9leHRlbnRzKTsKKyAgICBt
X2FzY2VudCA9IHN0YXRpY19jYXN0PGludD4oZm9udF9leHRlbnRzLmFzY2VudCk7CisgICAgbV9k
ZXNjZW50ID0gc3RhdGljX2Nhc3Q8aW50Pihmb250X2V4dGVudHMuZGVzY2VudCk7CisgICAgbV9s
aW5lU3BhY2luZyA9IHN0YXRpY19jYXN0PGludD4oZm9udF9leHRlbnRzLmhlaWdodCk7CisgICAg
Y2Fpcm9fc2NhbGVkX2ZvbnRfdGV4dF9leHRlbnRzKHNjYWxlZF9mb250LCAieCIsICZ0ZXh0X2V4
dGVudHMpOworICAgIG1feEhlaWdodCA9IHRleHRfZXh0ZW50cy5oZWlnaHQ7CisgICAgY2Fpcm9f
c2NhbGVkX2ZvbnRfdGV4dF9leHRlbnRzKHNjYWxlZF9mb250LCAiICIsICZ0ZXh0X2V4dGVudHMp
OworICAgIG1fbGluZUdhcCA9IG1fbGluZVNwYWNpbmcgLSBtX2FzY2VudCAtIG1fZGVzY2VudDsK
KyAgICAKKyAgICBjYWlyb19zY2FsZWRfZm9udF9kZXN0cm95KHNjYWxlZF9mb250KTsKKyNlbHNl
CiAgICAgUGFuZ29Db250ZXh0KiBjb250ZXh0ID0gZ2RrX3BhbmdvX2NvbnRleHRfZ2V0X2Zvcl9z
Y3JlZW4oIGdka19zY3JlZW5fZ2V0X2RlZmF1bHQoKSApOwogICAgIFBhbmdvTGF5b3V0KiBsYXlv
dXQgPSBwYW5nb19sYXlvdXRfbmV3KGNvbnRleHQpOwogICAgIC8vIGFuZCB1c2UgaXQgaWYgaXQn
cyB2YWxpZApAQCAtNjQsNiArODYsNyBAQAogICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCAr
IG1fZGVzY2VudDsKIAogICAgIHBhbmdvX2ZvbnRfbWV0cmljc191bnJlZihtZXRyaWNzKTsKKyNl
bmRpZgogfQogCiB2b2lkIEdldFRleHRFeHRlbnQoIGNvbnN0IHd4Rm9udCYgZm9udCwgY29uc3Qg
d3hTdHJpbmcmIHN0ciwgd3hDb29yZCAqd2lkdGgsIHd4Q29vcmQgKmhlaWdodCwKQEAgLTgwLDcg
KzEwMywyNSBAQAogCiAgICAgaWYgKHN0ci5lbXB0eSgpKQogICAgICAgICByZXR1cm47Ci0gICAg
ICAgIAorCisvLyBGSVhNRTogRG9lc24ndCBzdXBwb3J0IGhlaWdodCwgZGVzY2VudCBvciBleHRl
cm5hbCBsZWFkaW5nLCB0aG91Z2ggd2UgZG9uJ3QgbmVlZCB0aGlzIGZvciBXZWJLaXQKKy8vIGl0
IHdpbGwgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCBiZWZvcmUgbWVyZ2luZyBpbnRvIHd4IHVubGVz
cyB3ZSBjcmFmdCBhIG5ldyBBUEkuCisjaWYgVVNFKFdYR0MpCisgICAgUGFuZ29Gb250KiBwYW5n
b0ZvbnQgPSBXZWJDb3JlOjpjcmVhdGVQYW5nb0ZvbnRGb3JGb250KGZvbnQpOworICAgIFBhbmdv
Q29udGV4dCogcGFuZ29Db250ZXh0ID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2NvbnRl
eHQoUEFOR09fQ0FJUk9fRk9OVF9NQVAoV2ViQ29yZTo6cGFuZ29Gb250TWFwKCkpKTsKKyAgICBQ
YW5nb0dseXBoIHBhbmdvR2x5cGggPSBXZWJDb3JlOjpwYW5nb19mb250X2dldF9nbHlwaChwYW5n
b0ZvbnQsIHBhbmdvQ29udGV4dCwgKGd1bmljaGFyKWdfdXRmOF9nZXRfY2hhcihzdHIuVG9VVEY4
KCkpKTsKKyAgICBjYWlyb19nbHlwaF90IGNnbHlwaCA9IHsgcGFuZ29HbHlwaCwgMCwgMCB9Owor
ICAgIGNhaXJvX3RleHRfZXh0ZW50c190IGV4dGVudHM7CisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRf
dCogc2NhbGVkX2ZvbnQgPSBXZWJDb3JlOjpjcmVhdGVTY2FsZWRGb250Rm9yRm9udChmb250KTsK
KyAgICBjYWlyb19zY2FsZWRfZm9udF9nbHlwaF9leHRlbnRzKHNjYWxlZF9mb250LCAmY2dseXBo
LCAxLCAmZXh0ZW50cyk7CisKKyAgICBpZiAoY2Fpcm9fc2NhbGVkX2ZvbnRfc3RhdHVzKHNjYWxl
ZF9mb250KSA9PSBDQUlST19TVEFUVVNfU1VDQ0VTUyAmJiBleHRlbnRzLnhfYWR2YW5jZSAhPSAw
KQorICAgICAgICAqd2lkdGggPSAod3hDb29yZClleHRlbnRzLnhfYWR2YW5jZTsKKworICAgIGNh
aXJvX3NjYWxlZF9mb250X2Rlc3Ryb3koc2NhbGVkX2ZvbnQpOworICAgIGdfb2JqZWN0X3VucmVm
KHBhbmdvQ29udGV4dCk7CisgICAgZ19vYmplY3RfdW5yZWYocGFuZ29Gb250KTsKKyNlbHNlICAg
ICAgICAKICAgICBQYW5nb0NvbnRleHQqIGNvbnRleHQgPSBnZGtfcGFuZ29fY29udGV4dF9nZXRf
Zm9yX3NjcmVlbiggZ2RrX3NjcmVlbl9nZXRfZGVmYXVsdCgpICk7CiAgICAgUGFuZ29MYXlvdXQq
IG1fbGF5b3V0ID0gcGFuZ29fbGF5b3V0X25ldyhjb250ZXh0KTsKICAgICAvLyBhbmQgdXNlIGl0
IGlmIGl0J3MgdmFsaWQKQEAgLTEwMywyNCArMTQ0LDE5IEBACiAKICAgICBwYW5nb19sYXlvdXRf
c2V0X3RleHQoIG1fbGF5b3V0LCBkYXRhVVRGOCwgc3RybGVuKGRhdGFVVEY4KSApOwogCisgICAg
aW50IGggPSAwOworICAgIHBhbmdvX2xheW91dF9nZXRfcGl4ZWxfc2l6ZSggbV9sYXlvdXQsIHdp
ZHRoLCAmaCApOworCiAgICAgaWYgKGRlc2NlbnQpCiAgICAgewotICAgICAgICBpbnQgaDsKLSAg
ICAgICAgcGFuZ29fbGF5b3V0X2dldF9waXhlbF9zaXplKCBtX2xheW91dCwgd2lkdGgsICZoICk7
CiAgICAgICAgIFBhbmdvTGF5b3V0SXRlciAqaXRlciA9IHBhbmdvX2xheW91dF9nZXRfaXRlciht
X2xheW91dCk7CiAgICAgICAgIGludCBiYXNlbGluZSA9IHBhbmdvX2xheW91dF9pdGVyX2dldF9i
YXNlbGluZShpdGVyKTsKICAgICAgICAgcGFuZ29fbGF5b3V0X2l0ZXJfZnJlZShpdGVyKTsKICAg
ICAgICAgKmRlc2NlbnQgPSBoIC0gUEFOR09fUElYRUxTKGJhc2VsaW5lKTsKLQotICAgICAgICBp
ZiAoaGVpZ2h0KQotICAgICAgICAgICAgKmhlaWdodCA9ICh3eENvb3JkKSBoOwogICAgIH0KLSAg
ICBlbHNlCi0gICAgewotICAgICAgICBwYW5nb19sYXlvdXRfZ2V0X3BpeGVsX3NpemUoIG1fbGF5
b3V0LCB3aWR0aCwgaGVpZ2h0ICk7Ci0gICAgfQogCi0gICAgLy8gUmVzZXQgb2xkIGZvbnQgZGVz
Y3JpcHRpb24KLSAgICAvL2lmIChmb250ICE9IHd4TnVsbEZvbnQpCi0gICAgLy8gICAgcGFuZ29f
bGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uKCBtX2xheW91dCwgbV9mb250ZGVzYyApOwotfQpc
IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBpZiAoaGVpZ2h0KQorICAgICAgICAqaGVp
Z2h0ID0gKHd4Q29vcmQpIGg7CisjZW5kaWYKK30KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27588</attachid>
            <date>2009-02-11 23:09:13 -0800</date>
            <delta_ts>2009-02-12 21:10:30 -0800</delta_ts>
            <desc>Updated the patch to support recent changes and satisfied a FIXME</desc>
            <filename>non_kerned_drawing.diff</filename>
            <type>text/plain</type>
            <size>15112</size>
            <attacher name="Diggilin">mr.diggilin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MDg4NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMDktMDItMTEgIG1pZ2dpbGluICA8bXIuZGlnZ2lsaW5AZ21haWwu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdB
Uk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAgICAgIFVzZSBDYWly
by9QQU5HTyB0byBmaXggdGV4dCBtZWFzdXJlbWVudHMgYW5kIGltcGxlbWVudCBwcm9wZXIgbm9u
LWtlcm5lZCBkcmF3aW5nIG9uIHd4R1RLLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
R2x5cGhCdWZmZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93eC9Gb250UGxhdGZv
cm1EYXRhV3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6Zm9udFdlaWdodFRvV3hGb250V2VpZ2h0
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93eC9TaW1wbGVGb250RGF0YVd4LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgp
OgorICAgICAgICAqIHBsYXRmb3JtL3d4L3d4Y29kZS9mb250cHJvcHMuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS93eC93eGNvZGUvZ3RrL2ZvbnRwcm9wcy5jcHA6CisgICAgICAgICh3eEZvbnRQcm9w
ZXJ0aWVzOjp3eEZvbnRQcm9wZXJ0aWVzKToKKyAgICAgICAgKEdldFRleHRFeHRlbnQpOgorICAg
ICAgICAqIHBsYXRmb3JtL3d4L3d4Y29kZS9ndGsvbm9uLWtlcm5lZC1kcmF3aW5nLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OnBhbmdvRm9udE1hcCk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVQ
YW5nb0ZvbnRGb3JGb250KToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZVNjYWxlZEZvbnRGb3JG
b250KToKKyAgICAgICAgKFdlYkNvcmU6OnBhbmdvX2ZvbnRfZ2V0X2dseXBoKToKKyAgICAgICAg
KFdlYkNvcmU6OmRyYXdUZXh0V2l0aFNwYWNpbmcpOgorICAgICAgICAqIHBsYXRmb3JtL3d4L3d4
Y29kZS9ub24ta2VybmVkLWRyYXdpbmcuaDoKKwogMjAwOS0wMi0xMSAgU2ltb24gRnJhc2VyICA8
c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZlIEh5YXR0
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVyLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaEJ1ZmZlci5oCShyZXZpc2lvbiA0
MDg1NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhCdWZmZXIuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMv
QXBwbGljYXRpb25TZXJ2aWNlcy5oPgogI2VuZGlmCiAKLSNpZiBQTEFURk9STShDQUlSTykKKyNp
ZiBQTEFURk9STShDQUlSTykgfHwgKFBMQVRGT1JNKFdYKSAmJiBkZWZpbmVkKF9fV1hHVEtfXykp
CiAjaW5jbHVkZSA8Y2Fpcm8uaD4KICNlbmRpZgogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3d4L0ZvbnRQbGF0Zm9ybURhdGFXeC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93eC9Gb250UGxhdGZvcm1EYXRhV3guY3BwCShyZXZpc2lvbiA0MDg1
NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvRm9udFBsYXRmb3JtRGF0YVd4LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTgsNiArNTgsOSBAQAogewogICAgIGlmICh3ZWlnaHQgPj0g
Rm9udFdlaWdodDYwMCkKICAgICAgICAgcmV0dXJuIHd4Rk9OVFdFSUdIVF9CT0xEOworCisgICAg
aWYgKHdlaWdodCA8PSBGb250V2VpZ2h0MzAwKQorICAgICAgICByZXR1cm4gd3hGT05UV0VJR0hU
X0xJR0hUOwogICAgIAogICAgIHJldHVybiB3eEZPTlRXRUlHSFRfTk9STUFMOwogfSAKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvU2ltcGxlRm9udERhdGFXeC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93eC9TaW1wbGVGb250RGF0YVd4LmNw
cAkocmV2aXNpb24gNDA4NTQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L1NpbXBs
ZUZvbnREYXRhV3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05Miw3ICs5Miw3IEBACiB7CiAgICAg
Ly8gVE9ETzogZml4IHRoaXMhIE1ha2UgR2V0VGV4dEV4dGVudHMgYSBtZXRob2Qgb2Ygd3hGb250
IGluIDIuOQogICAgIGludCB3aWR0aCA9IDEwOwotICAgIEdldFRleHRFeHRlbnQoKm1fZm9udC5m
b250KCksICh3eENoYXIpZ2x5cGgsICZ3aWR0aCwgTlVMTCk7CisgICAgR2V0VGV4dEV4dGVudCht
X2ZvbnQuZm9udCgpLCAod3hDaGFyKWdseXBoLCAmd2lkdGgsIE5VTEwpOwogICAgIHJldHVybiB3
aWR0aDsKIH0KIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvbm9uLWtlcm5lZC1k
cmF3aW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93eC93eGNvZGUvbm9uLWtl
cm5lZC1kcmF3aW5nLmgJKHJldmlzaW9uIDQwODU0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93eC93
eGNvZGUvbm9uLWtlcm5lZC1kcmF3aW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDEwICsyNywy
NSBAQAogI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiDQogDQogI2luY2x1ZGUgPHd4L2RlZnMuaD4N
Ci0jaW5jbHVkZSA8d3gvZGNjbGllbnQuaD4NCisjaW5jbHVkZSA8d3gvZGNjbGllbnQuaD4KKwor
I2lmIF9fV1hHVEtfXyAmJiBVU0UoV1hHQykKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUg
PHBhbmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ29jYWlyby5oPgorI2VuZGlmDQog
DQogbmFtZXNwYWNlIFdlYkNvcmUgew0KIA0KIGV4dGVybiB2b2lkIGRyYXdUZXh0V2l0aFNwYWNp
bmcoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBmb250LCBjb25zdCB3eENvbG91ciYgY29sb3IsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1
ZmZlciwgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KTsN
Ci0gICAgDQotfQ0KKworI2lmIF9fV1hHVEtfXyAmJiBVU0UoV1hHQykKK1BhbmdvRm9udE1hcCog
cGFuZ29Gb250TWFwKCk7CisKK1BhbmdvRm9udCogY3JlYXRlUGFuZ29Gb250Rm9yRm9udChjb25z
dCB3eEZvbnQqIHd4Zm9udCk7CitjYWlyb19zY2FsZWRfZm9udF90KiBjcmVhdGVTY2FsZWRGb250
Rm9yRm9udChjb25zdCB3eEZvbnQqIHd4Zm9udCk7CitQYW5nb0dseXBoIHBhbmdvX2ZvbnRfZ2V0
X2dseXBoKFBhbmdvRm9udCogZm9udCwgUGFuZ29Db250ZXh0KiBjb250ZXh0LCBndW5pY2hhciB3
Yyk7CisKKyNlbmRpZgorfQorCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9mb250
cHJvcHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9mb250cHJv
cHMuaAkocmV2aXNpb24gNDA4NTQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3d4L3d4Y29kZS9mb250
cHJvcHMuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPHd4L2Rl
ZnMuaD4KICNpbmNsdWRlIDx3eC9mb250Lmg+CiAKLXZvaWQgR2V0VGV4dEV4dGVudCggY29uc3Qg
d3hGb250JiBmb250LCBjb25zdCB3eFN0cmluZyYgc3RyLCB3eENvb3JkICp3aWR0aCwgd3hDb29y
ZCAqaGVpZ2h0LAordm9pZCBHZXRUZXh0RXh0ZW50KCBjb25zdCB3eEZvbnQqIGZvbnQsIGNvbnN0
IHd4U3RyaW5nJiBzdHIsIHd4Q29vcmQgKndpZHRoLCB3eENvb3JkICpoZWlnaHQsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd3hDb29yZCAqZGVzY2VudCA9IE5VTEwsIHd4Q29vcmQgKmV4
dGVybmFsTGVhZGluZyA9IE5VTEwgKTsKIAogY2xhc3Mgd3hGb250UHJvcGVydGllc3sKQEAgLTQ2
LDQgKzQ2LDUgQEAKICAgICBmbG9hdCBtX2xpbmVTcGFjaW5nOwogICAgIGZsb2F0IG1feEhlaWdo
dDsKICAgICAgICAgCi19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK307CisKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9ub24ta2VybmVkLWRyYXdpbmcuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9ub24ta2VybmVkLWRy
YXdpbmcuY3BwCShyZXZpc2lvbiA0MDg1NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd3gvd3hjb2Rl
L2d0ay9ub24ta2VybmVkLWRyYXdpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCwxNSArMzQs
MTkwIEBACiAjaW5jbHVkZSA8d3gvZ2RpY21uLmg+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaWYg
VVNFKFdYR0MpCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2lu
Y2x1ZGUgPHBhbmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ29jYWlyby5oPgorCisv
LyBVc2UgY2Fpcm8tZnQgaWYgYSByZWNlbnQgZW5vdWdoIFBhbmdvIHZlcnNpb24gaXNuJ3QgYXZh
aWxhYmxlCisjaWYgIVBBTkdPX1ZFUlNJT05fQ0hFQ0soMSwxOCwwKQorI2luY2x1ZGUgPGNhaXJv
LWZ0Lmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ29mYy1mb250bWFwLmg+CisjZW5kaWYKKworI2Vu
ZGlmCisKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lm
IFVTRShXWEdDKQorc3RhdGljIFBhbmdvRm9udE1hcCogZ19mb250TWFwOworCitQYW5nb0ZvbnRN
YXAqIHBhbmdvRm9udE1hcCgpCit7CisgICAgaWYgKCFnX2ZvbnRNYXApCisgICAgICAgIGdfZm9u
dE1hcCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2dldF9kZWZhdWx0KCk7CisKKyAgICByZXR1cm4g
Z19mb250TWFwOworfQorCitQYW5nb0ZvbnQqIGNyZWF0ZVBhbmdvRm9udEZvckZvbnQoY29uc3Qg
d3hGb250KiB3eGZvbnQpCit7CisgICAgQVNTRVJUKHd4Zm9udCAmJiB3eGZvbnQtPk9rKCkpOwor
CisgICAgY29uc3QgY2hhciogZmFjZSA9IHd4Zm9udC0+R2V0RmFjZU5hbWUoKS5tYl9zdHIod3hD
b252VVRGOCk7CisgICAgY2hhciBjb25zdCogZmFtaWxpZXNbXSA9IHsKKyAgICAgICAgZmFjZSwK
KyAgICAgICAgMAorICAgIH07CisKKyAgICBzd2l0Y2ggKHd4Zm9udC0+R2V0RmFtaWx5KCkpIHsK
KyAgICBjYXNlIHd4Rk9OVEZBTUlMWV9ST01BTjoKKyAgICAgICAgZmFtaWxpZXNbMV0gPSAic2Vy
aWYiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHd4Rk9OVEZBTUlMWV9TV0lTUzoKKyAgICAg
ICAgZmFtaWxpZXNbMV0gPSAic2FucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugd3hGT05U
RkFNSUxZX01PREVSTjoKKyAgICAgICAgZmFtaWxpZXNbMV0gPSAibW9ub3NwYWNlIjsKKyAgICAg
ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmFtaWxpZXNbMV0gPSAic2FucyI7Cisg
ICAgfQorICAgIAorICAgIFBhbmdvRm9udERlc2NyaXB0aW9uKiBkZXNjcmlwdGlvbiA9IHBhbmdv
X2ZvbnRfZGVzY3JpcHRpb25fbmV3KCk7CisgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRf
YWJzb2x1dGVfc2l6ZShkZXNjcmlwdGlvbiwgd3hmb250LT5HZXRQb2ludFNpemUoKSAqIFBBTkdP
X1NDQUxFKTsKKyAKKyAgICBQYW5nb0ZvbnQqIHBhbmdvRm9udCA9IDA7CisgICAgUGFuZ29Db250
ZXh0KiBwYW5nb0NvbnRleHQgPSAwOworCisgICAgc3dpdGNoICh3eGZvbnQtPkdldFdlaWdodCgp
KSB7CisgICAgY2FzZSB3eEZPTlRXRUlHSFRfTElHSFQ6CisgICAgICAgIHBhbmdvX2ZvbnRfZGVz
Y3JpcHRpb25fc2V0X3dlaWdodChkZXNjcmlwdGlvbiwgUEFOR09fV0VJR0hUX0xJR0hUKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSB3eEZPTlRXRUlHSFRfTk9STUFMOgorICAgICAgICBwYW5n
b19mb250X2Rlc2NyaXB0aW9uX3NldF93ZWlnaHQoZGVzY3JpcHRpb24sIFBBTkdPX1dFSUdIVF9O
T1JNQUwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHd4Rk9OVFdFSUdIVF9CT0xEOgorICAg
ICAgICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF93ZWlnaHQoZGVzY3JpcHRpb24sIFBBTkdP
X1dFSUdIVF9CT0xEKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICh3eGZv
bnQtPkdldFN0eWxlKCkpIHsKKyAgICBjYXNlIHd4Rk9OVFNUWUxFX05PUk1BTDoKKyAgICAgICAg
cGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc3R5bGUoZGVzY3JpcHRpb24sIFBBTkdPX1NUWUxF
X05PUk1BTCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ugd3hGT05UU1RZTEVfSVRBTElDOgor
ICAgICAgICBwYW5nb19mb250X2Rlc2NyaXB0aW9uX3NldF9zdHlsZShkZXNjcmlwdGlvbiwgUEFO
R09fU1RZTEVfSVRBTElDKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSB3eEZPTlRTVFlMRV9T
TEFOVDoKKyAgICAgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9zZXRfc3R5bGUoZGVzY3JpcHRp
b24sIFBBTkdPX1NUWUxFX09CTElRVUUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBQ
YW5nb0ZvbnRNYXAqIGZvbnRNYXAgPSBwYW5nb0ZvbnRNYXAoKTsKKworICAgIHBhbmdvQ29udGV4
dCA9IHBhbmdvX2NhaXJvX2ZvbnRfbWFwX2NyZWF0ZV9jb250ZXh0KFBBTkdPX0NBSVJPX0ZPTlRf
TUFQKGZvbnRNYXApKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyAhcGFuZ29Gb250ICYmIGkg
PCBHX05fRUxFTUVOVFMoZmFtaWxpZXMpOyBpKyspIHsKKyAgICAgICAgcGFuZ29fZm9udF9kZXNj
cmlwdGlvbl9zZXRfZmFtaWx5KGRlc2NyaXB0aW9uLCBmYW1pbGllc1tpXSk7CisgICAgICAgIHBh
bmdvX2NvbnRleHRfc2V0X2ZvbnRfZGVzY3JpcHRpb24ocGFuZ29Db250ZXh0LCBkZXNjcmlwdGlv
bik7CisgICAgICAgIHBhbmdvRm9udCA9IHBhbmdvX2ZvbnRfbWFwX2xvYWRfZm9udChmb250TWFw
LCBwYW5nb0NvbnRleHQsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisgICAgcGFuZ29fZm9udF9kZXNj
cmlwdGlvbl9mcmVlKGRlc2NyaXB0aW9uKTsKKworICAgIHJldHVybiBwYW5nb0ZvbnQ7Cit9CisK
K2NhaXJvX3NjYWxlZF9mb250X3QqIGNyZWF0ZVNjYWxlZEZvbnRGb3JGb250KGNvbnN0IHd4Rm9u
dCogd3hmb250KQoreworICAgIEFTU0VSVCh3eGZvbnQgJiYgd3hmb250LT5PaygpKTsKKworICAg
IGNhaXJvX3NjYWxlZF9mb250X3QqIHNjYWxlZEZvbnQgPSBOVUxMOworICAgIFBhbmdvRm9udCog
cGFuZ29Gb250ID0gY3JlYXRlUGFuZ29Gb250Rm9yRm9udCh3eGZvbnQpOworICAgIAorI2lmIFBB
TkdPX1ZFUlNJT05fQ0hFQ0soMSwxOCwwKQorICAgIGlmIChwYW5nb0ZvbnQpCisgICAgICAgIHNj
YWxlZEZvbnQgPSBjYWlyb19zY2FsZWRfZm9udF9yZWZlcmVuY2UocGFuZ29fY2Fpcm9fZm9udF9n
ZXRfc2NhbGVkX2ZvbnQoUEFOR09fQ0FJUk9fRk9OVChwYW5nb0ZvbnQpKSk7CisjZW5kaWYKKwor
ICAgIHJldHVybiBzY2FsZWRGb250OworfQorCitQYW5nb0dseXBoIHBhbmdvX2ZvbnRfZ2V0X2ds
eXBoKFBhbmdvRm9udCogZm9udCwgUGFuZ29Db250ZXh0KiBjb250ZXh0LCBndW5pY2hhciB3YykK
K3sKKyAgICBQYW5nb0dseXBoIHJlc3VsdCA9IDA7CisgICAgZ2NoYXIgYnVmZmVyWzddOworCisg
ICAgZ2ludCAgbGVuZ3RoID0gZ191bmljaGFyX3RvX3V0Zjgod2MsIGJ1ZmZlcik7CisgICAgZ19y
ZXR1cm5fdmFsX2lmX2ZhaWwobGVuZ3RoLCAwKTsKKworICAgIEdMaXN0KiBpdGVtcyA9IHBhbmdv
X2l0ZW1pemUoY29udGV4dCwgYnVmZmVyLCAwLCBsZW5ndGgsIE5VTEwsIE5VTEwpOworCisgICAg
aWYgKGdfbGlzdF9sZW5ndGgoaXRlbXMpID09IDEpIHsKKyAgICAgICAgUGFuZ29JdGVtKiBpdGVt
ID0gc3RhdGljX2Nhc3Q8UGFuZ29JdGVtKj4oaXRlbXMtPmRhdGEpOworICAgICAgICBQYW5nb0Zv
bnQqIHRtcEZvbnQgPSBpdGVtLT5hbmFseXNpcy5mb250OworICAgICAgICBpdGVtLT5hbmFseXNp
cy5mb250ID0gZm9udDsKKworICAgICAgICBQYW5nb0dseXBoU3RyaW5nKiBnbHlwaHMgPSBwYW5n
b19nbHlwaF9zdHJpbmdfbmV3KCk7CisgICAgICAgIHBhbmdvX3NoYXBlKGJ1ZmZlciwgbGVuZ3Ro
LCAmaXRlbS0+YW5hbHlzaXMsIGdseXBocyk7CisKKyAgICAgICAgaXRlbS0+YW5hbHlzaXMuZm9u
dCA9IHRtcEZvbnQ7CisKKyAgICAgICAgaWYgKGdseXBocy0+bnVtX2dseXBocyA9PSAxKQorICAg
ICAgICAgICAgcmVzdWx0ID0gZ2x5cGhzLT5nbHlwaHNbMF0uZ2x5cGg7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIGdfd2FybmluZygiZGlkbid0IGdldCAxIGdseXBoIGJ1dCAlZCIsIGdseXBo
cy0+bnVtX2dseXBocyk7CisKKyAgICAgICAgcGFuZ29fZ2x5cGhfc3RyaW5nX2ZyZWUoZ2x5cGhz
KTsKKyAgICB9CisKKyAgICBnX2xpc3RfZm9yZWFjaChpdGVtcywgKEdGdW5jKXBhbmdvX2l0ZW1f
ZnJlZSwgTlVMTCk7CisgICAgZ19saXN0X2ZyZWUoaXRlbXMpOworCisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKyNlbmRpZiAvLyBVU0UoV1hHQykKKworCiB2b2lkIGRyYXdUZXh0V2l0aFNwYWNpbmco
R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBm
b250LCBjb25zdCB3eENvbG91ciYgY29sb3IsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZl
ciwgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQogewog
I2lmIFVTRShXWEdDKQogICAgIHd4R0NEQyogZGMgPSBzdGF0aWNfY2FzdDx3eEdDREMqPihncmFw
aGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICB3eEdyYXBoaWNzQ29udGV4dCog
Z2MgPSBkYy0+R2V0R3JhcGhpY3NDb250ZXh0KCk7CisgICAgZ2MtPlB1c2hTdGF0ZSgpOworICAg
IGNhaXJvX3QqIGNyID0gKGNhaXJvX3QqKWdjLT5HZXROYXRpdmVDb250ZXh0KCk7CisKKyAgICB3
eEZvbnQqIHd4Zm9udCA9IGZvbnQtPmdldFd4Rm9udCgpOworICAgIFBhbmdvRm9udCogcGFuZ29G
b250ID0gY3JlYXRlUGFuZ29Gb250Rm9yRm9udCh3eGZvbnQpOworICAgIFBhbmdvRm9udE1hcCog
Zm9udE1hcCA9IHBhbmdvRm9udE1hcCgpOworICAgIFBhbmdvQ29udGV4dCogcGFuZ29Db250ZXh0
ID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2NvbnRleHQoUEFOR09fQ0FJUk9fRk9OVF9N
QVAoZm9udE1hcCkpOworICAgIGNhaXJvX3NjYWxlZF9mb250X3QqIHNjYWxlZF9mb250ID0gY3Jl
YXRlU2NhbGVkRm9udEZvckZvbnQod3hmb250KTsgCisgICAgQVNTRVJUKHNjYWxlZF9mb250KTsK
KworICAgIGNhaXJvX2dseXBoX3QqIGdseXBocyA9IE5VTEw7CisgICAgZ2x5cGhzID0gc3RhdGlj
X2Nhc3Q8Y2Fpcm9fZ2x5cGhfdCo+KG1hbGxvYyhzaXplb2YoY2Fpcm9fZ2x5cGhfdCkgKiBudW1H
bHlwaHMpKTsKKworICAgIGZsb2F0IG9mZnNldCA9IHBvaW50LngoKTsKKworICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKKyAgICAgICAgZ2x5cGhzW2ldLmluZGV4ID0g
cGFuZ29fZm9udF9nZXRfZ2x5cGgocGFuZ29Gb250LCBwYW5nb0NvbnRleHQsIGdseXBoQnVmZmVy
LmdseXBoQXQoZnJvbSArIGkpKTsKKyAgICAgICAgZ2x5cGhzW2ldLnggPSBvZmZzZXQ7CisgICAg
ICAgIGdseXBoc1tpXS55ID0gcG9pbnQueSgpOworICAgICAgICBvZmZzZXQgKz0gZ2x5cGhCdWZm
ZXIuYWR2YW5jZUF0KGZyb20gKyBpKTsKKyAgICB9CisKKyAgICBjYWlyb19zZXRfc291cmNlX3Jn
YmEoY3IsIGNvbG9yLlJlZCgpLzI1NS4wLCBjb2xvci5HcmVlbigpLzI1NS4wLCBjb2xvci5CbHVl
KCkvMjU1LjAsIGNvbG9yLkFscGhhKCkvMjU1LjApOworICAgIGNhaXJvX3NldF9zY2FsZWRfZm9u
dChjciwgc2NhbGVkX2ZvbnQpOworICAgIAorICAgIGNhaXJvX3Nob3dfZ2x5cGhzKGNyLCBnbHlw
aHMsIG51bUdseXBocyk7CisKKyAgICBjYWlyb19zY2FsZWRfZm9udF9kZXN0cm95KHNjYWxlZF9m
b250KTsKKyAgICBnYy0+UG9wU3RhdGUoKTsKICNlbHNlCiAgICAgd3hEQyogZGMgPSBncmFwaGlj
c0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwotI2VuZGlmCiAKICAgICB3eEZvbnQqIHd4Zm9u
dCA9IGZvbnQtPmdldFd4Rm9udCgpOwogICAgIGlmICh3eGZvbnQgJiYgd3hmb250LT5Jc09rKCkp
CkBAIC02Myw2ICsyMzgsNyBAQAogICAgIHd4Q29vcmQgeXBvaW50ID0gKHd4Q29vcmQpIChwb2lu
dC55KCkgLSBoZWlnaHQpOwogICAgICAKICAgICBkYy0+RHJhd1RleHQodGV4dCwgKHd4Q29vcmQp
cG9pbnQueCgpLCB5cG9pbnQpOworI2VuZGlmCiB9CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vd3gvd3hjb2RlL2d0ay9mb250cHJvcHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vd3gvd3hjb2RlL2d0ay9mb250cHJvcHMuY3BwCShyZXZpc2lvbiA0MDg1NCkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vd3gvd3hjb2RlL2d0ay9mb250cHJvcHMuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yOCwxMiArMjgsMzUgQEAKICNpbmNsdWRlIDx3eC9mb250Lmg+CiAjaW5jbHVkZSA8d3gv
Zm9udHV0aWwuaD4KICNpbmNsdWRlICJmb250cHJvcHMuaCIKKyNpbmNsdWRlICJub24ta2VybmVk
LWRyYXdpbmcuaCIKIAogI2luY2x1ZGUgPGdkay9nZGsuaD4KIAorI2luY2x1ZGUgPGNhaXJvLmg+
CisjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRlIDxwYW5nby9wYW5nb2NhaXJvLmg+
CisKIHd4Rm9udFByb3BlcnRpZXM6Ond4Rm9udFByb3BlcnRpZXMod3hGb250KiBmb250KToKIG1f
YXNjZW50KDApLCBtX2Rlc2NlbnQoMCksIG1fbGluZUdhcCgwKSwgbV9saW5lU3BhY2luZygwKSwg
bV94SGVpZ2h0KDApCiB7CisgICAgQVNTRVJUKGZvbnQgJiYgZm9udC0+T2soKSk7CisKKyNpZiBV
U0UoV1hHQykKKyAgICBjYWlyb19mb250X2V4dGVudHNfdCBmb250X2V4dGVudHM7CisgICAgY2Fp
cm9fdGV4dF9leHRlbnRzX3QgdGV4dF9leHRlbnRzOworICAgIGNhaXJvX3NjYWxlZF9mb250X3Qq
IHNjYWxlZF9mb250ID0gV2ViQ29yZTo6Y3JlYXRlU2NhbGVkRm9udEZvckZvbnQoZm9udCk7Cisg
ICAgCisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRfZXh0ZW50cyhzY2FsZWRfZm9udCwgJmZvbnRfZXh0
ZW50cyk7CisgICAgbV9hc2NlbnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGZvbnRfZXh0ZW50cy5hc2Nl
bnQpOworICAgIG1fZGVzY2VudCA9IHN0YXRpY19jYXN0PGludD4oZm9udF9leHRlbnRzLmRlc2Nl
bnQpOworICAgIG1fbGluZVNwYWNpbmcgPSBzdGF0aWNfY2FzdDxpbnQ+KGZvbnRfZXh0ZW50cy5o
ZWlnaHQpOworICAgIGNhaXJvX3NjYWxlZF9mb250X3RleHRfZXh0ZW50cyhzY2FsZWRfZm9udCwg
IngiLCAmdGV4dF9leHRlbnRzKTsKKyAgICBtX3hIZWlnaHQgPSB0ZXh0X2V4dGVudHMuaGVpZ2h0
OworICAgIGNhaXJvX3NjYWxlZF9mb250X3RleHRfZXh0ZW50cyhzY2FsZWRfZm9udCwgIiAiLCAm
dGV4dF9leHRlbnRzKTsKKyAgICBtX2xpbmVHYXAgPSBtX2xpbmVTcGFjaW5nIC0gbV9hc2NlbnQg
LSBtX2Rlc2NlbnQ7CisgICAgCisgICAgY2Fpcm9fc2NhbGVkX2ZvbnRfZGVzdHJveShzY2FsZWRf
Zm9udCk7CisjZWxzZQogICAgIFBhbmdvQ29udGV4dCogY29udGV4dCA9IGdka19wYW5nb19jb250
ZXh0X2dldF9mb3Jfc2NyZWVuKCBnZGtfc2NyZWVuX2dldF9kZWZhdWx0KCkgKTsKICAgICBQYW5n
b0xheW91dCogbGF5b3V0ID0gcGFuZ29fbGF5b3V0X25ldyhjb250ZXh0KTsKICAgICAvLyBhbmQg
dXNlIGl0IGlmIGl0J3MgdmFsaWQKQEAgLTY0LDExICs4NywxNCBAQAogICAgIG1fbGluZVNwYWNp
bmcgPSBtX2FzY2VudCArIG1fZGVzY2VudDsKIAogICAgIHBhbmdvX2ZvbnRfbWV0cmljc191bnJl
ZihtZXRyaWNzKTsKKyNlbmRpZgogfQogCi12b2lkIEdldFRleHRFeHRlbnQoIGNvbnN0IHd4Rm9u
dCYgZm9udCwgY29uc3Qgd3hTdHJpbmcmIHN0ciwgd3hDb29yZCAqd2lkdGgsIHd4Q29vcmQgKmhl
aWdodCwKK3ZvaWQgR2V0VGV4dEV4dGVudCggY29uc3Qgd3hGb250KiBmb250LCBjb25zdCB3eFN0
cmluZyYgc3RyLCB3eENvb3JkICp3aWR0aCwgd3hDb29yZCAqaGVpZ2h0LAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHd4Q29vcmQgKmRlc2NlbnQsIHd4Q29vcmQgKmV4dGVybmFsTGVhZGlu
ZyApCiB7CisgICAgQVNTRVJUKGZvbnQgJiYgZm9udC0+T2soKSk7CisKICAgICBpZiAoIHdpZHRo
ICkKICAgICAgICAgKndpZHRoID0gMDsKICAgICBpZiAoIGhlaWdodCApCkBAIC04MCwxNiArMTA2
LDM0IEBACiAKICAgICBpZiAoc3RyLmVtcHR5KCkpCiAgICAgICAgIHJldHVybjsKLSAgICAgICAg
CisKKy8vIEZJWE1FOiBEb2Vzbid0IHN1cHBvcnQgaGVpZ2h0LCBkZXNjZW50IG9yIGV4dGVybmFs
IGxlYWRpbmcsIHRob3VnaCB3ZSBkb24ndCBuZWVkIHRoaXMgZm9yIFdlYktpdAorLy8gaXQgd2ls
bCBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGJlZm9yZSBtZXJnaW5nIGludG8gd3ggdW5sZXNzIHdl
IGNyYWZ0IGEgbmV3IEFQSS4KKyNpZiBVU0UoV1hHQykKKyAgICBQYW5nb0ZvbnQqIHBhbmdvRm9u
dCA9IFdlYkNvcmU6OmNyZWF0ZVBhbmdvRm9udEZvckZvbnQoZm9udCk7CisgICAgUGFuZ29Db250
ZXh0KiBwYW5nb0NvbnRleHQgPSBwYW5nb19jYWlyb19mb250X21hcF9jcmVhdGVfY29udGV4dChQ
QU5HT19DQUlST19GT05UX01BUChXZWJDb3JlOjpwYW5nb0ZvbnRNYXAoKSkpOworICAgIFBhbmdv
R2x5cGggcGFuZ29HbHlwaCA9IFdlYkNvcmU6OnBhbmdvX2ZvbnRfZ2V0X2dseXBoKHBhbmdvRm9u
dCwgcGFuZ29Db250ZXh0LCAoZ3VuaWNoYXIpZ191dGY4X2dldF9jaGFyKHN0ci5Ub1VURjgoKSkp
OworICAgIGNhaXJvX2dseXBoX3QgY2dseXBoID0geyBwYW5nb0dseXBoLCAwLCAwIH07CisgICAg
Y2Fpcm9fdGV4dF9leHRlbnRzX3QgZXh0ZW50czsKKyAgICBjYWlyb19zY2FsZWRfZm9udF90KiBz
Y2FsZWRfZm9udCA9IFdlYkNvcmU6OmNyZWF0ZVNjYWxlZEZvbnRGb3JGb250KGZvbnQpOworICAg
IGNhaXJvX3NjYWxlZF9mb250X2dseXBoX2V4dGVudHMoc2NhbGVkX2ZvbnQsICZjZ2x5cGgsIDEs
ICZleHRlbnRzKTsKKworICAgIGlmIChjYWlyb19zY2FsZWRfZm9udF9zdGF0dXMoc2NhbGVkX2Zv
bnQpID09IENBSVJPX1NUQVRVU19TVUNDRVNTICYmIGV4dGVudHMueF9hZHZhbmNlICE9IDApCisg
ICAgICAgICp3aWR0aCA9ICh3eENvb3JkKWV4dGVudHMueF9hZHZhbmNlOworCisgICAgY2Fpcm9f
c2NhbGVkX2ZvbnRfZGVzdHJveShzY2FsZWRfZm9udCk7CisgICAgZ19vYmplY3RfdW5yZWYocGFu
Z29Db250ZXh0KTsKKyAgICBnX29iamVjdF91bnJlZihwYW5nb0ZvbnQpOworI2Vsc2UKICAgICBQ
YW5nb0NvbnRleHQqIGNvbnRleHQgPSBnZGtfcGFuZ29fY29udGV4dF9nZXRfZm9yX3NjcmVlbigg
Z2RrX3NjcmVlbl9nZXRfZGVmYXVsdCgpICk7CiAgICAgUGFuZ29MYXlvdXQqIG1fbGF5b3V0ID0g
cGFuZ29fbGF5b3V0X25ldyhjb250ZXh0KTsKICAgICAvLyBhbmQgdXNlIGl0IGlmIGl0J3MgdmFs
aWQKLSAgICBpZiAoIGZvbnQgIT0gd3hOdWxsRm9udCApCisgICAgaWYgKCBmb250ICYmIGZvbnQt
PklzT2soKSApCiAgICAgewogICAgICAgICBwYW5nb19sYXlvdXRfc2V0X2ZvbnRfZGVzY3JpcHRp
b24KICAgICAgICAgKAogICAgICAgICAgICAgbV9sYXlvdXQsCi0gICAgICAgICAgICBmb250Lkdl
dE5hdGl2ZUZvbnRJbmZvKCktPmRlc2NyaXB0aW9uCisgICAgICAgICAgICBmb250LT5HZXROYXRp
dmVGb250SW5mbygpLT5kZXNjcmlwdGlvbgogICAgICAgICApOwogICAgIH0KIApAQCAtMTAzLDI0
ICsxNDcsMTkgQEAKIAogICAgIHBhbmdvX2xheW91dF9zZXRfdGV4dCggbV9sYXlvdXQsIGRhdGFV
VEY4LCBzdHJsZW4oZGF0YVVURjgpICk7CiAKKyAgICBpbnQgaCA9IDA7CisgICAgcGFuZ29fbGF5
b3V0X2dldF9waXhlbF9zaXplKCBtX2xheW91dCwgd2lkdGgsICZoICk7CisKICAgICBpZiAoZGVz
Y2VudCkKICAgICB7Ci0gICAgICAgIGludCBoOwotICAgICAgICBwYW5nb19sYXlvdXRfZ2V0X3Bp
eGVsX3NpemUoIG1fbGF5b3V0LCB3aWR0aCwgJmggKTsKICAgICAgICAgUGFuZ29MYXlvdXRJdGVy
ICppdGVyID0gcGFuZ29fbGF5b3V0X2dldF9pdGVyKG1fbGF5b3V0KTsKICAgICAgICAgaW50IGJh
c2VsaW5lID0gcGFuZ29fbGF5b3V0X2l0ZXJfZ2V0X2Jhc2VsaW5lKGl0ZXIpOwogICAgICAgICBw
YW5nb19sYXlvdXRfaXRlcl9mcmVlKGl0ZXIpOwogICAgICAgICAqZGVzY2VudCA9IGggLSBQQU5H
T19QSVhFTFMoYmFzZWxpbmUpOwotCi0gICAgICAgIGlmIChoZWlnaHQpCi0gICAgICAgICAgICAq
aGVpZ2h0ID0gKHd4Q29vcmQpIGg7CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBh
bmdvX2xheW91dF9nZXRfcGl4ZWxfc2l6ZSggbV9sYXlvdXQsIHdpZHRoLCBoZWlnaHQgKTsKLSAg
ICB9CiAKLSAgICAvLyBSZXNldCBvbGQgZm9udCBkZXNjcmlwdGlvbgotICAgIC8vaWYgKGZvbnQg
IT0gd3hOdWxsRm9udCkKLSAgICAvLyAgICBwYW5nb19sYXlvdXRfc2V0X2ZvbnRfZGVzY3JpcHRp
b24oIG1fbGF5b3V0LCBtX2ZvbnRkZXNjICk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQorICAgIGlmIChoZWlnaHQpCisgICAgICAgICpoZWlnaHQgPSAod3hDb29yZCkgaDsKKyNlbmRp
ZgorfQorCg==
</data>
<flag name="review"
          id="13377"
          type_id="1"
          status="+"
          setter="kevino"
    />
          </attachment>
      

    </bug>

</bugzilla>