<?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>25528</bug_id>
          
          <creation_ts>2009-05-03 14:59:37 -0700</creation_ts>
          <short_desc>[Gtk] Text attributes not exposed</short_desc>
          <delta_ts>2010-06-30 01:12:18 -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>Accessibility</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>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>25531</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Joanmarie Diggs">jdiggs</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apinheiro</cc>
    
    <cc>commit-queue</cc>
    
    <cc>jmillan</cc>
    
    <cc>mario</cc>
    
    <cc>walker.willie</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>119736</commentid>
    <comment_count>0</comment_count>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2009-05-03 14:59:37 -0700</bug_when>
    <thetext>Steps to reproduce:

1. Open the (to-be) attached test case.

2. In Accerciser, in the pane on the left, select any object from the page content for which the accessible text interface has been implemented. 

3. In Accerciser, in the pane on the right, choose the Interface Viewer from the notebook. Expand Text (Editable) to see the text, caret offset, the non-default text attributes associated at that offset, and the start and end offset for those attributes. 

4. Check the &quot;Include defaults&quot; checkbox to see the text attributes associated with the entire text object.

Expected results: The above attribute information and offsets would be exposed.

Actual results: None of the above attribute information or offsets are exposed.

Ideally, the attributes (and attribute names) exposed to assistive technologies would be taken from this list so as to be more consistent with existing Gtk+ apps:

http://library.gnome.org/devel/atk/unstable/AtkText.html#AtkTextAttribute</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>119737</commentid>
    <comment_count>1</comment_count>
      <attachid>29967</attachid>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2009-05-03 15:01:35 -0700</bug_when>
    <thetext>Created attachment 29967
aforementioned test case</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181245</commentid>
    <comment_count>2</comment_count>
      <attachid>46683</attachid>
    <who name="José Millán Soto">jmillan</who>
    <bug_when>2010-01-15 08:52:18 -0800</bug_when>
    <thetext>Created attachment 46683
Patch that implements webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes

This patch implements the following attributes:
  ATK_TEXT_ATTR_INVISIBLE,
  ATK_TEXT_ATTR_EDITABLE,
  ATK_TEXT_ATTR_RISE,
  ATK_TEXT_ATTR_UNDERLINE,
  ATK_TEXT_ATTR_STRIKETHROUGH,
  ATK_TEXT_ATTR_SIZE,
  ATK_TEXT_ATTR_WEIGHT,
  ATK_TEXT_ATTR_FAMILY_NAME,
  ATK_TEXT_ATTR_BG_COLOR,
  ATK_TEXT_ATTR_FG_COLOR,
  ATK_TEXT_ATTR_JUSTIFICATION and
  ATK_TEXT_ATTR_STYLE</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181246</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-15 08:55:58 -0800</bug_when>
    <thetext>Attachment 46683 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1271:  webkit_accessible_text_get_run_attributes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181631</commentid>
    <comment_count>4</comment_count>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2010-01-17 15:43:20 -0800</bug_when>
    <thetext>José, thanks for taking this on!

Having done some quick testing on it, it looks good. One minor thing I noticed with the following two lines from the test case:

* This sentence has the words sentence in superscript.
* This sentence has the word sentence in subscript.

The first instance of &lt;sup&gt;&lt;/sup&gt; and &lt;sub&gt;&lt;/sub&gt; each report a rise and size, but the second one does not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181792</commentid>
    <comment_count>5</comment_count>
    <who name="José Millán Soto">jmillan</who>
    <bug_when>2010-01-18 01:58:59 -0800</bug_when>
    <thetext>&gt; Having done some quick testing on it, it looks good. One minor thing I noticed
&gt; with the following two lines from the test case:
&gt; 
&gt; * This sentence has the words sentence in superscript.
&gt; * This sentence has the word sentence in subscript.
&gt; 
&gt; The first instance of &lt;sup&gt;&lt;/sup&gt; and &lt;sub&gt;&lt;/sub&gt; each report a rise and size,
&gt; but the second one does not.

I tested and both instances of &lt;sup&gt; and &lt;sub&gt; work fine to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182275</commentid>
    <comment_count>6</comment_count>
    <who name="Joanmarie Diggs">jdiggs</who>
    <bug_when>2010-01-19 09:13:21 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; Having done some quick testing on it, it looks good. One minor thing I noticed
&gt; &gt; with the following two lines from the test case:
&gt; &gt; 
&gt; &gt; * This sentence has the words sentence in superscript.
&gt; &gt; * This sentence has the word sentence in subscript.
&gt; &gt; 
&gt; &gt; The first instance of &lt;sup&gt;&lt;/sup&gt; and &lt;sub&gt;&lt;/sub&gt; each report a rise and size,
&gt; &gt; but the second one does not.
&gt; 
&gt; I tested and both instances of &lt;sup&gt; and &lt;sub&gt; work fine to me.

Hmmm. Are you testing this with Accerciser? 

Anyhoo, I&apos;ll try again....</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>185813</commentid>
    <comment_count>7</comment_count>
      <attachid>46683</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2010-01-29 04:05:57 -0800</bug_when>
    <thetext>Comment on attachment 46683
Patch that implements webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes

&gt;-static AtkAttributeSet* webkit_accessible_text_get_run_attributes(AtkText* text, gint offset, gint* start_offset, gint* end_offset)
&gt;+static void addAttribute(AtkAttributeSet* &amp;attributeSet, AtkTextAttribute textAttribute, gchar* value, bool copyValue = true)

So are pointers to references more idiomatic than pointers to pointers? I don&apos;t think I&apos;ve seen them used a lot (well, at all) in WebKit.

&gt; {
&gt;-    notImplemented();
&gt;-    return 0;
&gt;+    AtkAttribute* newAttribute = (AtkAttribute *)g_malloc(sizeof(AtkAttribute));

In theory the preferred method to allocate structures in glib is with g_slice_new. Also, C-style casts are against the style guidelines.

&gt;+    newAttribute-&gt;name = g_strdup(atk_text_attribute_get_name(textAttribute));
&gt;+    if (copyValue) value = g_strdup(value);

The assignment has to go in its own line.

&gt;+    newAttribute-&gt;value = value;

Or you could just do... = copyValue? g_strdup(value) : value;

&gt;+    attributeSet = g_slist_prepend(attributeSet, newAttribute);
&gt;+}
&gt;+
&gt;+/*
&gt;+    Returns an AtkAttributeSet with the AtkAttributes which define style.
&gt;+    If parentObject is given, only the ones which are different from style and
&gt;+    parentStyle would be in the result.
&gt;+*/

I think C++-style comments are preferred. Also, the comment seems to refer to a parameter that no longer exists?

&gt;+static AtkAttributeSet* getAttributeSetForAccessibilityObject(const AccessibilityObject* object, bool onlyDifferentFromParent = false)
&gt;+{
&gt;+    RenderObject* renderer;
&gt;+    RenderObject* parentRenderer = 0;
&gt;+    AtkAttributeSet* result = 0;
&gt;+    RenderStyle* style;
&gt;+    RenderStyle* parentStyle = 0;
&gt;+    int intProp;
&gt;+    bool styleProp;
&gt;+
&gt;+    if (object-&gt;isAccessibilityRenderObject()) {
&gt;+        AccessibilityObject* parent;
&gt;+        renderer = ((AccessibilityRenderObject*)object)-&gt;renderer();

Use C++ casts.

&gt;+        style = renderer-&gt;style();
&gt;+        if (onlyDifferentFromParent) {
&gt;+            parent = object-&gt;parentObject();
&gt;+            while (parent &amp;&amp; !parent-&gt;isAccessibilityRenderObject())
&gt;+                parent = parent-&gt;parentObject();

I believe you should check here if the parent objects you iterate through are not ignored (see parentObjectUnignored).

&gt;+            if (parent &amp;&amp; parent-&gt;isAccessibilityRenderObject())
&gt;+                parentRenderer = ((AccessibilityRenderObject*)parent)-&gt;renderer();

Casting again.

&gt;+        }
&gt;+    } else
&gt;+        return 0;

Just return early at the beginning of the function.

&gt;+
&gt;+    if (parentRenderer)
&gt;+        parentStyle = parentRenderer-&gt;style();
&gt;+
&gt;+    intProp = style-&gt;fontSize();
&gt;+    if (!parentStyle || (intProp != parentStyle-&gt;fontSize()))
&gt;+        addAttribute(result, ATK_TEXT_ATTR_SIZE, g_strdup_printf(&quot;%i&quot;, intProp), false);
&gt;+
&gt;+    if (style-&gt;hasBackground()
&gt;+        &amp;&amp; !(parentStyle
&gt;+             &amp;&amp; parentStyle-&gt;hasBackground()
&gt;+             &amp;&amp; (style-&gt;backgroundColor() == parentStyle-&gt;backgroundColor()))
&gt;+        &amp;&amp; style-&gt;color().isValid())
&gt;+        addAttribute(result, ATK_TEXT_ATTR_BG_COLOR, g_strdup_printf(&quot;%i,%i,%i&quot;, style-&gt;backgroundColor().red(), style-&gt;backgroundColor().green(), style-&gt;backgroundColor().blue()), false);
&gt;+    if (style-&gt;color().isValid()
&gt;+        &amp;&amp; !(parentStyle &amp;&amp; (style-&gt;color() == parentStyle-&gt;color())))
&gt;+        addAttribute(result, ATK_TEXT_ATTR_FG_COLOR, g_strdup_printf(&quot;%i,%i,%i&quot;, style-&gt;color().red(), style-&gt;color().green(), style-&gt;color().blue()), false);
&gt;+
&gt;+    intProp = renderer-&gt;baselinePosition(true);
&gt;+    if (!parentStyle
&gt;+        || (parentStyle-&gt;verticalAlign() != style-&gt;verticalAlign())
&gt;+        || (style-&gt;verticalAlign() == BASELINE ? false : (intProp != parentRenderer-&gt;baselinePosition(true)))) {
&gt;+        bool includeRise;
&gt;+        switch (style-&gt;verticalAlign()) {
&gt;+        case SUB:
&gt;+            intProp = -intProp;
&gt;+        case SUPER:
&gt;+            includeRise = true;
&gt;+            break;
&gt;+        case BASELINE:
&gt;+            includeRise = true;
&gt;+            intProp = 0;
&gt;+            break;
&gt;+        default:
&gt;+            includeRise = false;
&gt;+        }
&gt;+        if (includeRise)
&gt;+            addAttribute(result, ATK_TEXT_ATTR_RISE, g_strdup_printf(&quot;%i&quot;, intProp), false);
&gt;+    }
&gt;+
&gt;+    if (!parentStyle
&gt;+        || (parentStyle-&gt;textIndent() != style-&gt;textIndent())) {
&gt;+        gint value = style-&gt;textIndent().calcValue(object-&gt;size().width());
&gt;+        if (value != undefinedLength)
&gt;+            addAttribute(result, ATK_TEXT_ATTR_INDENT, g_strdup_printf(&quot;%i&quot;, value), false);
&gt;+    }
&gt;+
&gt;+    if (!parentStyle || (parentStyle-&gt;font().family().family() != style-&gt;font().family().family()))
&gt;+        addAttribute(result, ATK_TEXT_ATTR_FAMILY_NAME, g_strdup(style-&gt;font().family().family().string().utf8().data()), false);
&gt;+
&gt;+    intProp = style-&gt;font().weight();
&gt;+    if (!parentStyle || (intProp != parentStyle-&gt;font().weight())) {
&gt;+        int fontWeight = -1;
&gt;+        switch (intProp) {
&gt;+        case FontWeight100:
&gt;+            fontWeight = 100;
&gt;+            break;
&gt;+        case FontWeight200:
&gt;+            fontWeight = 200;
&gt;+            break;
&gt;+        case FontWeight300:
&gt;+            fontWeight = 300;
&gt;+            break;
&gt;+        case FontWeight400:
&gt;+            fontWeight = 400;
&gt;+            break;
&gt;+        case FontWeight500:
&gt;+            fontWeight = 500;
&gt;+            break;
&gt;+        case FontWeight600:
&gt;+            fontWeight = 600;
&gt;+            break;
&gt;+        case FontWeight700:
&gt;+            fontWeight = 700;
&gt;+            break;
&gt;+        case FontWeight800:
&gt;+            fontWeight = 800;
&gt;+            break;
&gt;+        case FontWeight900:
&gt;+            fontWeight = 900;
&gt;+        }
&gt;+        if (fontWeight &gt; 0)
&gt;+            addAttribute(result, ATK_TEXT_ATTR_WEIGHT, g_strdup_printf(&quot;%i&quot;, fontWeight), false);
&gt;+    }
&gt;+
&gt;+    intProp = style-&gt;textAlign();
&gt;+    if (!parentStyle || (intProp != parentStyle-&gt;textAlign())) {
&gt;+        switch (intProp) {
&gt;+        case TAAUTO:
&gt;+            break;
&gt;+        case LEFT:
&gt;+        case WEBKIT_LEFT:
&gt;+            addAttribute(result, ATK_TEXT_ATTR_JUSTIFICATION, (gchar *)&quot;left&quot;);
&gt;+            break;
&gt;+        case RIGHT:
&gt;+        case WEBKIT_RIGHT:
&gt;+            addAttribute(result, ATK_TEXT_ATTR_JUSTIFICATION, (gchar *)&quot;right&quot;);
&gt;+            break;
&gt;+        case CENTER:
&gt;+        case WEBKIT_CENTER:
&gt;+            addAttribute(result, ATK_TEXT_ATTR_JUSTIFICATION, (gchar *)&quot;center&quot;);
&gt;+            break;
&gt;+        case JUSTIFY:
&gt;+            addAttribute(result, ATK_TEXT_ATTR_JUSTIFICATION, (gchar *)&quot;fill&quot;);
&gt;+        }
&gt;+    }
&gt;+
&gt;+    styleProp = style-&gt;textDecoration() &amp; UNDERLINE;
&gt;+    if (!parentStyle || (styleProp != (parentStyle-&gt;textDecoration() &amp; UNDERLINE)))
&gt;+        addAttribute(result, ATK_TEXT_ATTR_UNDERLINE, (styleProp ? (gchar*)&quot;single&quot; : (gchar*)&quot;none&quot;));
&gt;+    styleProp = style-&gt;font().italic();
&gt;+    if (!parentStyle || (styleProp != (parentStyle-&gt;font().italic())))
&gt;+        addAttribute(result, ATK_TEXT_ATTR_STYLE, (styleProp ? (gchar*)&quot;italic&quot; : (gchar*)&quot;normal&quot;));
&gt;+    styleProp = style-&gt;textDecoration() &amp; LINE_THROUGH;
&gt;+    if (!parentStyle || (styleProp != (parentStyle-&gt;textDecoration() &amp; LINE_THROUGH)))
&gt;+        addAttribute(result, ATK_TEXT_ATTR_STRIKETHROUGH, (styleProp ? (gchar*)&quot;true&quot; : (gchar*)&quot;false&quot;));
&gt;+    styleProp = style-&gt;visibility() == HIDDEN;
&gt;+    if (!parentStyle || (styleProp != (parentStyle-&gt;visibility() == HIDDEN)))
&gt;+        addAttribute(result, ATK_TEXT_ATTR_INVISIBLE, (styleProp ? (gchar*)&quot;true&quot; : (gchar*)&quot;false&quot;));
&gt;+
&gt;+    return result;
&gt;+}

I honestly feel that having the logic of getting the difference from the parent object in the same function makes the code less clear than it could be. I think it would work better if you had a (simple) function to get the attributes of one object, another to get the difference between two attribute sets, and possibly a third helper function to get the difference between one object&apos;s and its parent set. It will probably be more code, but I think in the end things will be more understandable.

&gt;+
&gt;+static gint compareAttributeName(const AtkAttribute* a, const AtkAttribute* b)
&gt;+{
&gt;+    return g_strcmp0(a-&gt;name, b-&gt;name);
&gt;+}
&gt;+
&gt;+/*
&gt;+    Returns the union of two AtkAttributeSet, having the second one priority.
&gt;+    Releases a1, and the AtkAttributes no longer used

The memory management of the function seems a bit weird and tailored for you one use case. Making a new set with the union seems more reasonable if you think this could be used elsewhere in the future.

Another thing, possibly it would be more efficient to sort the attributes by name and then just iterate both lists at the same time.

&gt;+*/
&gt;+static AtkAttributeSet* attributeSetUnion(AtkAttributeSet* a1, AtkAttributeSet* a2)
&gt;+{
&gt;+    if (!a1)
&gt;+        return a2;
&gt;+    if (!a2)
&gt;+        return a1;
&gt;+
&gt;+    AtkAttributeSet* i = a1;
&gt;+    AtkAttributeSet* found;
&gt;+
&gt;+    do {
&gt;+        found = g_slist_find_custom(a2, i-&gt;data, (GCompareFunc)compareAttributeName);
&gt;+        if (!found) {
&gt;+            AtkAttributeSet* t = i-&gt;next;
&gt;+            a2 = g_slist_prepend(a2, i-&gt;data);
&gt;+            a1 = g_slist_delete_link(a1, i);
&gt;+            i = t;
&gt;+        } else
&gt;+            i = i-&gt;next;
&gt;+    } while (i);
&gt;+
&gt;+    atk_attribute_set_free(a1);
&gt;+    return a2;
&gt;+}
&gt;+
&gt;+static guint accessibilityObjectLength(const AccessibilityObject* object)
&gt;+{
&gt;+    int value = object-&gt;stringValue().length();
&gt;+    if (value)
&gt;+        return value;
&gt;+    if (object-&gt;isAccessibilityRenderObject()) {
&gt;+        const RenderObject* renderer = ((AccessibilityRenderObject*)object)-&gt;renderer();
&gt;+        if (renderer-&gt;isBR())
&gt;+            return 1;
&gt;+    }
&gt;+    return object-&gt;textUnderElement().length();
&gt;+}

use webkit_accessible_get_text and then calculate the length?

&gt;+
&gt;+/*
&gt;+    Returns a list of AccessibilityObjects, so that each one is the
&gt;+    child of the preceding one which is located in the desired offset.
&gt;+    *startOffset and *endOffset would be the beggining and next offset of the
&gt;+    most lower AccessibilityObject; if offset exceeds the length of the object
&gt;+    *startOffset and *endOffset will be set to -1.
&gt;+*/
&gt;+static GSList *getAccessibilityObjectsForOffset(const AccessibilityObject *object, guint offset, gint *start_offset, gint *end_offset)
&gt;+{
&gt;+    GSList* result = 0;
&gt;+    guint length = accessibilityObjectLength(object);
&gt;+    if (length &gt; offset) {
&gt;+        *start_offset = 0;
&gt;+        *end_offset = length;
&gt;+        result = g_slist_append(result, (gpointer)object);
&gt;+    } else {
&gt;+        *start_offset = -1;
&gt;+        *end_offset = -1;
&gt;+    }
&gt;+
&gt;+    if (object-&gt;hasChildren()) {
&gt;+        AccessibilityObject* child = object-&gt;firstChild();
&gt;+        guint childPosition = 0;
&gt;+        guint childLength;
&gt;+        while (child) {
&gt;+            childLength = accessibilityObjectLength(child);
&gt;+            if ((childLength + childPosition) &gt; offset) {
&gt;+                gint childStartOffset;
&gt;+                gint childEndOffset;
&gt;+                result = g_slist_concat(getAccessibilityObjectsForOffset(child, offset-childPosition, &amp;childStartOffset, &amp;childEndOffset), result);
&gt;+                if (childStartOffset &gt;= 0) {
&gt;+                    *start_offset = childStartOffset + childPosition;
&gt;+                    *end_offset = childEndOffset + childPosition;
&gt;+                }
&gt;+                break;
&gt;+            }
&gt;+            childPosition += childLength;
&gt;+            child = child-&gt;nextSibling();
&gt;+        }
&gt;+    }
&gt;+    return result;
&gt;+}
&gt;+
&gt;+static AtkAttributeSet* getRunAttributesFromAccesibilityObject(const AccessibilityObject* element, gint offset, gint* startOffset, gint* endOffset, RenderObject* defaultRenderer)
&gt;+{
&gt;+    AtkAttributeSet* result = 0;
&gt;+
&gt;+    GSList* childs = getAccessibilityObjectsForOffset(element, offset, startOffset, endOffset);

children.

&gt;+    GSList* child = childs;
&gt;+    bool previousReadOnly = element-&gt;isReadOnly();
&gt;+
&gt;+    while (child) {
&gt;+        const AccessibilityObject* childObject = (const AccessibilityObject *)child-&gt;data;
&gt;+        bool readOnly = childObject-&gt;isReadOnly();
&gt;+        AtkAttributeSet* differentAttributes = getAttributeSetForAccessibilityObject(childObject, true);
&gt;+        if (readOnly != previousReadOnly) {
&gt;+            previousReadOnly = readOnly;
&gt;+            addAttribute(differentAttributes, ATK_TEXT_ATTR_EDITABLE, readOnly ? (gchar *)&quot;false&quot; : (gchar *)&quot;true&quot;);
&gt;+        }
&gt;+        result = attributeSetUnion(result, differentAttributes);
&gt;+        child = child-&gt;next;
&gt;+    }
&gt;+    g_slist_free(childs);
&gt;+
&gt;+    return result;
&gt;+}
&gt;+
&gt;+static AtkAttributeSet* webkit_accessible_text_get_run_attributes(AtkText* text, gint offset, gint* startOffset, gint* endOffset)
&gt;+{
&gt;+    AccessibilityObject* coreObject = core(text);
&gt;+    AtkAttributeSet* result;
&gt;+    int rStartOffset, rEndOffset;
&gt;+
&gt;+    if ((!coreObject) || (!coreObject-&gt;hasChildren()))
&gt;+        return 0;
&gt;+
&gt;+    RenderObject* baseRenderer = 0;
&gt;+    if (coreObject-&gt;isAccessibilityRenderObject())
&gt;+        baseRenderer = ((AccessibilityRenderObject*)coreObject)-&gt;renderer();

This seems to be completely unused in getRunAttributesFromAccessibilityObject.

&gt;+
&gt;+    if (offset == -1)
&gt;+        offset = atk_text_get_caret_offset(text);
&gt;+
&gt;+    result = getRunAttributesFromAccesibilityObject(coreObject, offset, &amp;rStartOffset, &amp;rEndOffset, baseRenderer);
&gt;+
&gt;+    if (rStartOffset &gt;= 0) {
&gt;+        *startOffset = rStartOffset;
&gt;+        *endOffset = rEndOffset;
&gt;+    } else {
&gt;+        *startOffset = offset;
&gt;+        *endOffset = offset;
&gt;+    }
&gt;+
&gt;+    return result;
&gt; }
&gt; 
&gt; static AtkAttributeSet* webkit_accessible_text_get_default_attributes(AtkText* text)
&gt; {
&gt;-    notImplemented();
&gt;-    return 0;
&gt;+    AccessibilityObject* coreObject = core(text);
&gt;+    if ((!coreObject) || (!coreObject-&gt;isAccessibilityRenderObject()))
&gt;+        return 0;

Extra parens not needed.

&gt;+
&gt;+    AtkAttributeSet* result = 0;
&gt;+
&gt;+    result = getAttributeSetForAccessibilityObject(coreObject);
&gt;+    addAttribute(result, ATK_TEXT_ATTR_EDITABLE, coreObject-&gt;isReadOnly() ? (gchar*)&quot;false&quot; : (gchar*)&quot;true&quot;);

Why is that not handled by the function? Are the casts to (gchar*) really needed? Couldn&apos;t the function take &apos;const char*&apos;?

&gt;+    return result;
&gt; }
&gt; 
&gt; static void webkit_accessible_text_get_character_extents(AtkText* text, gint offset, gint* x, gint* y, gint* width, gint* height, AtkCoordType coords)


As a last comment, can we do first a patch just implementing webkit_accessible_text_get_default_attributes, seems it would get rid of the most complex functions needed for get_run_attributes, which we can add in a later patch.

Also, as always, it would be good to have some test for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193404</commentid>
    <comment_count>8</comment_count>
      <attachid>49407</attachid>
    <who name="José Millán Soto">jmillan</who>
    <bug_when>2010-02-24 10:27:06 -0800</bug_when>
    <thetext>Created attachment 49407
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

New version of the patch, which solves most of the issues appointed in comment 7.
It includes a new test in testatk.c also.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193406</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-02-24 10:32:39 -0800</bug_when>
    <thetext>Attachment 49407 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1238:  webkit_accessible_text_get_run_attributes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Ignoring &quot;WebKit/gtk/tests/testatk.c&quot;: this file is exempt from the style guide.
Total errors found: 1 in 3 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225196</commentid>
    <comment_count>10</comment_count>
      <attachid>49407</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2010-05-13 01:06:57 -0700</bug_when>
    <thetext>Comment on attachment 49407
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

&gt; Index: WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp
&gt; ===================================================================
&gt; --- WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp	(revision 55194)
&gt; +++ WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp	(working copy)
&gt; @@ -1012,16 +1012,263 @@ static gint webkit_accessible_text_get_c
&gt;      return offset;
&gt;  }
&gt;  
&gt; -static AtkAttributeSet* webkit_accessible_text_get_run_attributes(AtkText* text, gint offset, gint* start_offset, gint* end_offset)
&gt; +static AtkAttributeSet* getAttributeSetForAccessibilityObject(const AccessibilityObject* object)
&gt;  {
&gt; -    notImplemented();
&gt; -    return 0;
&gt; +    RenderObject* renderer;
&gt; +    AtkAttributeSet* result = 0;
&gt; +    RenderStyle* style;
&gt; +    const int bufferSize = 16;
&gt; +    gchar buffer[bufferSize];
&gt; +
&gt; +    if (!object-&gt;isAccessibilityRenderObject())
&gt; +        return 0;
&gt; +
&gt; +    renderer = (static_cast&lt;const AccessibilityRenderObject*&gt;(object))-&gt;renderer();
&gt; +    style = renderer-&gt;style();
&gt; +
&gt; +    g_snprintf(buffer, bufferSize, &quot;%i&quot;, style-&gt;fontSize());
&gt; +    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_SIZE), buffer);
&gt; +
&gt; +    if (style-&gt;hasBackground()
&gt; +        &amp;&amp; style-&gt;backgroundColor().isValid()) {
&gt; +        g_snprintf(buffer, bufferSize, &quot;%i,%i,%i&quot;, style-&gt;backgroundColor().red(), style-&gt;backgroundColor().green(), style-&gt;backgroundColor().blue());
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_BG_COLOR), buffer);
&gt; +    }
&gt; +    if (style-&gt;color().isValid()) {
&gt; +        g_snprintf(buffer, bufferSize, &quot;%i,%i,%i&quot;, style-&gt;color().red(), style-&gt;color().green(), style-&gt;color().blue());
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_FG_COLOR), buffer);
&gt; +    }
&gt; +
&gt; +    int baselinePosition = renderer-&gt;baselinePosition(true);
&gt; +    bool includeRise;
&gt; +    switch (style-&gt;verticalAlign()) {
&gt; +    case SUB:
&gt; +        baselinePosition = -baselinePosition;
&gt; +    case SUPER:
&gt; +        includeRise = true;
&gt; +        break;
&gt; +    case BASELINE:
&gt; +        includeRise = true;
&gt; +        baselinePosition = 0;
&gt; +        break;
&gt; +    default:
&gt; +        includeRise = false;
&gt; +    }
&gt; +    if (includeRise) {
&gt; +        g_snprintf(buffer, bufferSize, &quot;%i&quot;, baselinePosition);
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_RISE), buffer);
&gt; +    }
&gt; +
&gt; +    int indentation = style-&gt;textIndent().calcValue(object-&gt;size().width());
&gt; +    if (indentation != undefinedLength) {
&gt; +        g_snprintf(buffer, bufferSize, &quot;%i&quot;, indentation);
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_INDENT), buffer);
&gt; +    }
&gt; +
&gt; +    String fontFamilyName = style-&gt;font().family().family().string();
&gt; +    if (fontFamilyName.left(8) == &quot;-webkit-&quot;)
&gt; +        fontFamilyName = fontFamilyName.substring(8);
&gt; +
&gt; +    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_FAMILY_NAME), fontFamilyName.utf8().data());
&gt; +
&gt; +    int fontWeight = -1;
&gt; +    switch (style-&gt;font().weight()) {
&gt; +    case FontWeight100:
&gt; +        fontWeight = 100;
&gt; +        break;
&gt; +    case FontWeight200:
&gt; +        fontWeight = 200;
&gt; +        break;
&gt; +    case FontWeight300:
&gt; +        fontWeight = 300;
&gt; +        break;
&gt; +    case FontWeight400:
&gt; +        fontWeight = 400;
&gt; +        break;
&gt; +    case FontWeight500:
&gt; +        fontWeight = 500;
&gt; +        break;
&gt; +    case FontWeight600:
&gt; +        fontWeight = 600;
&gt; +        break;
&gt; +    case FontWeight700:
&gt; +        fontWeight = 700;
&gt; +        break;
&gt; +    case FontWeight800:
&gt; +        fontWeight = 800;
&gt; +        break;
&gt; +    case FontWeight900:
&gt; +        fontWeight = 900;
&gt; +    }
&gt; +    if (fontWeight &gt; 0) {
&gt; +        g_snprintf(buffer, bufferSize, &quot;%i&quot;, fontWeight);
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_WEIGHT), buffer);
&gt; +    }
&gt; +
&gt; +    switch (style-&gt;textAlign()) {
&gt; +    case TAAUTO:
&gt; +        break;
&gt; +    case LEFT:
&gt; +    case WEBKIT_LEFT:
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_JUSTIFICATION), &quot;left&quot;);
&gt; +        break;
&gt; +    case RIGHT:
&gt; +    case WEBKIT_RIGHT:
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_JUSTIFICATION), &quot;right&quot;);
&gt; +        break;
&gt; +    case CENTER:
&gt; +    case WEBKIT_CENTER:
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_JUSTIFICATION), &quot;center&quot;);
&gt; +        break;
&gt; +    case JUSTIFY:
&gt; +        result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_JUSTIFICATION), &quot;fill&quot;);
&gt; +    }
&gt; +
&gt; +    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_UNDERLINE), ((style-&gt;textDecoration() &amp; UNDERLINE) ? &quot;single&quot; : &quot;none&quot;));
&gt; +
&gt; +    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_STYLE), (style-&gt;font().italic() ? &quot;italic&quot; : &quot;normal&quot;));
&gt; +
&gt; +    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_STRIKETHROUGH), ((style-&gt;textDecoration() &amp; LINE_THROUGH) ? &quot;true&quot; : &quot;false&quot;));
&gt; +
&gt; +    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_INVISIBLE), ((style-&gt;visibility() == HIDDEN) ? &quot;true&quot; : &quot;false&quot;));
&gt; +
&gt; +    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_EDITABLE), object-&gt;isReadOnly() ? &quot;false&quot; : &quot;true&quot;);
&gt; +
&gt; +    return result;
&gt; +}
&gt; +
&gt; +static gint compareAttribute(const AtkAttribute* a, const AtkAttribute* b)
&gt; +{
&gt; +    return (g_strcmp0(a-&gt;name, b-&gt;name) || g_strcmp0(a-&gt;value, b-&gt;value));
&gt; +}
&gt; +
&gt; +//  Returns an AtkAttributeSet with the elements of a1 which are either not present or different in a2.
&gt; +//  Neither a1 nor a2 should be used after calling this function.
&gt; +static AtkAttributeSet* attributeSetDifference(AtkAttributeSet* a1, AtkAttributeSet* a2)
&gt; +{
&gt; +    if (!a2)
&gt; +        return a1;
&gt; +
&gt; +    AtkAttributeSet* i = a1;
&gt; +    AtkAttributeSet* found;
&gt; +    AtkAttributeSet* toDelete = 0;
&gt; +
&gt; +    while (i) {
&gt; +        found = g_slist_find_custom(a2, i-&gt;data, (GCompareFunc)compareAttribute);
&gt; +        if (found) {
&gt; +            AtkAttributeSet* t = i-&gt;next;
&gt; +            toDelete = g_slist_prepend(toDelete, i-&gt;data);
&gt; +            a1 = g_slist_delete_link(a1, i);
&gt; +            i = t;
&gt; +        } else
&gt; +            i = i-&gt;next;
&gt; +    }
&gt; +
&gt; +    atk_attribute_set_free(a2);
&gt; +    atk_attribute_set_free(toDelete);
&gt; +    return a1;
&gt; +}
&gt; +
&gt; +static guint accessibilityObjectLength(const AccessibilityObject* object)
&gt; +{
&gt; +    int value = object-&gt;stringValue().length();
&gt; +    if (value)
&gt; +        return value;
&gt; +    if (object-&gt;isAccessibilityRenderObject()) {
&gt; +        const RenderObject* renderer = (static_cast&lt;const AccessibilityRenderObject*&gt;(object))-&gt;renderer();
&gt; +        if (renderer-&gt;isBR())
&gt; +            return 1;
&gt; +    }
&gt; +    return object-&gt;textUnderElement().length();
&gt; +}
&gt; +
&gt; +static const AccessibilityObject* getAccessibilityObjectForOffset(const AccessibilityObject* object, guint offset, gint* startOffset, gint* endOffset)
&gt; +{
&gt; +    const AccessibilityObject* result;
&gt; +    guint length = accessibilityObjectLength(object);
&gt; +    if (length &gt; offset) {
&gt; +        *startOffset = 0;
&gt; +        *endOffset = length;
&gt; +        result = object;
&gt; +    } else {
&gt; +        *startOffset = -1;
&gt; +        *endOffset = -1;
&gt; +        result = 0;
&gt; +    }
&gt; +
&gt; +    if (object-&gt;firstChild()) {
&gt; +        AccessibilityObject* child = object-&gt;firstChild();
&gt; +        guint childPosition = 0;
&gt; +        guint childLength;
&gt; +        while (child) {
&gt; +            childLength = accessibilityObjectLength(child);
&gt; +            if ((childLength + childPosition) &gt; offset) {
&gt; +                gint childStartOffset;
&gt; +                gint childEndOffset;
&gt; +                const AccessibilityObject* grandChild = getAccessibilityObjectForOffset(child, offset-childPosition,  &amp;childStartOffset, &amp;childEndOffset);
&gt; +                if (childStartOffset &gt;= 0) {
&gt; +                    *startOffset = childStartOffset + childPosition;
&gt; +                    *endOffset = childEndOffset + childPosition;
&gt; +                    result = grandChild;
&gt; +                }
&gt; +                break;
&gt; +            }
&gt; +            childPosition += childLength;
&gt; +            child = child-&gt;nextSibling();
&gt; +        }
&gt; +    }
&gt; +    return result;
&gt; +}
&gt; +
&gt; +static AtkAttributeSet* getRunAttributesFromAccesibilityObject(const AccessibilityObject* element, gint offset, gint* startOffset, gint* endOffset)
&gt; +{
&gt; +    const AccessibilityObject *child = getAccessibilityObjectForOffset(element, offset, startOffset, endOffset);
&gt; +    if (!child) {
&gt; +        *startOffset = -1;
&gt; +        *endOffset = -1;
&gt; +        return 0;
&gt; +    }
&gt; +
&gt; +    AtkAttributeSet* defaultAttributes = getAttributeSetForAccessibilityObject(element);
&gt; +    AtkAttributeSet* childAttributes = getAttributeSetForAccessibilityObject(child);
&gt; +
&gt; +    return attributeSetDifference(childAttributes, defaultAttributes);
&gt; +}
&gt; +
&gt; +static AtkAttributeSet* webkit_accessible_text_get_run_attributes(AtkText* text, gint offset, gint* startOffset, gint* endOffset)
&gt; +{
&gt; +    AccessibilityObject* coreObject = core(text);
&gt; +    AtkAttributeSet* result;
&gt; +
&gt; +    if (!coreObject) {
&gt; +        *startOffset = 0;
&gt; +        *endOffset = atk_text_get_character_count(text);
&gt; +        return 0;
&gt; +    }
&gt; +
&gt; +    if (offset == -1)
&gt; +        offset = atk_text_get_caret_offset(text);
&gt; +
&gt; +    result = getRunAttributesFromAccesibilityObject(coreObject, offset, startOffset, endOffset);
&gt; +
&gt; +    if (*startOffset &lt; 0) {
&gt; +        *startOffset = offset;
&gt; +        *endOffset = offset;
&gt; +    }
&gt; +
&gt; +    return result;
&gt;  }
&gt;  
&gt;  static AtkAttributeSet* webkit_accessible_text_get_default_attributes(AtkText* text)
&gt;  {
&gt; -    notImplemented();
&gt; -    return 0;
&gt; +    AccessibilityObject* coreObject = core(text);
&gt; +    if (!coreObject || !coreObject-&gt;isAccessibilityRenderObject())
&gt; +        return 0;
&gt; +
&gt; +    AtkAttributeSet* result = 0;
&gt; +
&gt; +    result = getAttributeSetForAccessibilityObject(coreObject);
&gt; +    return result;
&gt;  }
&gt;  
&gt;  static void webkit_accessible_text_get_character_extents(AtkText* text, gint offset, gint* x, gint* y, gint* width, gint* height, AtkCoordType coords)
&gt; Index: WebKit/gtk/ChangeLog
&gt; ===================================================================
&gt; --- WebKit/gtk/ChangeLog	(revision 55194)
&gt; +++ WebKit/gtk/ChangeLog	(working copy)
&gt; @@ -1,3 +1,21 @@
&gt; +2010-02-24  JosÃ© MillÃ¡n Soto  &lt;jmillan@igalia.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        [Gtk] Text attributes not exposed
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=25528
&gt; +
&gt; +        Added new tests for accessible text attributes
&gt; +
&gt; +        * tests/testatk.c:
&gt; +        (testWebkitAtkGetTextInParagraphAndBodyModerate):
&gt; +        (compAtkAttribute):
&gt; +        (compAtkAttributeName):
&gt; +        (atkAttributeSetAttributeHasValue):
&gt; +        (atkAttributeSetAreEqual):
&gt; +        (testWebkitAtkTextAttributes):
&gt; +        (main):
&gt; +
&gt;  2010-02-23  Leandro Pereira  &lt;leandro@profusion.mobi&gt;
&gt;  
&gt;          Reviewed by Gustavo Noronha Silva.
&gt; Index: WebKit/gtk/tests/testatk.c
&gt; ===================================================================
&gt; --- WebKit/gtk/tests/testatk.c	(revision 55194)
&gt; +++ WebKit/gtk/tests/testatk.c	(working copy)
&gt; @@ -38,6 +38,8 @@ static const char* contentsInParagraphAn
&gt;  
&gt;  static const char* contentsInParagraphAndBodyModerate = &quot;&lt;html&gt;&lt;body&gt;&lt;p&gt;This is a test.&lt;/p&gt;Hello world.&lt;br /&gt;&lt;font color=&apos;#00cc00&apos;&gt;This sentence is green.&lt;/font&gt;&lt;br /&gt;This one is not.&lt;/body&gt;&lt;/html&gt;&quot;;
&gt;  
&gt; +static const char* textWithAttributes = &quot;&lt;html&gt;&lt;head&gt;&lt;style&gt;.st1 {font-family: monospace; color:rgb(120,121,122);} .st2 {text-decoration:underline; background-color:rgb(80,81,82);}&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;p style=\&quot;font-size:14; text-align:right;\&quot;&gt;This is the &lt;i&gt;first&lt;/i&gt;&lt;b&gt; sentence of this text.&lt;/b&gt;&lt;/p&gt;&lt;p class=\&quot;st1\&quot;&gt;This sentence should have an style applied &lt;span class=\&quot;st2\&quot;&gt;and this part should have another one&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;x&lt;sub&gt;1&lt;/sub&gt;&lt;sup&gt;2&lt;/sup&gt;=x&lt;sub&gt;2&lt;/sub&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/p&gt;&lt;p style=\&quot;text-align:center;\&quot;&gt;This sentence is the &lt;strike&gt;last&lt;/strike&gt; one.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&quot;;
&gt; +
&gt;  static gboolean bail_out(GMainLoop* loop)
&gt;  {
&gt;      if (g_main_loop_is_running(loop))
&gt; @@ -409,6 +411,7 @@ static void testWebkitAtkGetTextInParagr
&gt;  static void testWebkitAtkGetTextInParagraphAndBodyModerate(void)
&gt;  {
&gt;      WebKitWebView* webView;
&gt; +    WebKitWebFrame* webFrame;
&gt;      AtkObject* obj;
&gt;      AtkObject* obj1;
&gt;      AtkObject* obj2;
&gt; @@ -418,6 +421,7 @@ static void testWebkitAtkGetTextInParagr
&gt;  
&gt;      webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
&gt;      g_object_ref_sink(webView);
&gt; +    webFrame = webkit_web_view_get_main_frame(webView);
&gt;      GtkAllocation alloc = { 0, 0, 800, 600 };
&gt;      gtk_widget_size_allocate(GTK_WIDGET(webView), &amp;alloc);
&gt;      webkit_web_view_load_string(webView, contentsInParagraphAndBodyModerate, NULL, NULL, NULL);
&gt; @@ -450,6 +454,159 @@ static void testWebkitAtkGetTextInParagr
&gt;      g_object_unref(webView);
&gt;  }
&gt;  
&gt; +static gint compAtkAttribute(AtkAttribute *a1, AtkAttribute *a2)
&gt; +{
&gt; +    gint strcmpVal;
&gt; +    strcmpVal = g_strcmp0(a1-&gt;name, a2-&gt;name);
&gt; +    if (strcmpVal)
&gt; +        return strcmpVal;
&gt; +
&gt; +    return g_strcmp0(a1-&gt;value, a2-&gt;value);
&gt; +}
&gt; +
&gt; +static gint compAtkAttributeName(AtkAttribute *a1, AtkAttribute *a2)
&gt; +{
&gt; +    return g_strcmp0(a1-&gt;name, a2-&gt;name);
&gt; +}
&gt; +
&gt; +static gboolean atkAttributeSetAttributeHasValue(AtkAttributeSet *set, AtkTextAttribute attribute, const gchar *value)
&gt; +{
&gt; +    GSList *element;
&gt; +    AtkAttribute at;
&gt; +    gboolean result;
&gt; +    at.name = (gchar *)atk_text_attribute_get_name(attribute);
&gt; +    element = g_slist_find_custom(set, &amp;at, (GCompareFunc)compAtkAttributeName);
&gt; +    result = (element &amp;&amp; !g_strcmp0(((AtkAttribute*)(element-&gt;data))-&gt;value, value));
&gt; +    if (!result &amp;&amp; element)
&gt; +        printf(&quot;Expected %s got %s\n&quot;, value, ((AtkAttribute*)(element-&gt;data))-&gt;value);
&gt; +    return result;
&gt; +}
&gt; +
&gt; +static gboolean atkAttributeSetAreEqual(AtkAttributeSet *set1, AtkAttributeSet *set2)
&gt; +{
&gt; +    if (!set1)
&gt; +        return !set2;
&gt; +
&gt; +    set1 = g_slist_sort(set1, (GCompareFunc)compAtkAttribute);
&gt; +    set2 = g_slist_sort(set2, (GCompareFunc)compAtkAttribute);
&gt; +
&gt; +    while (set1) {
&gt; +        if (!set2 || compAtkAttribute(set1-&gt;data, set2-&gt;data))
&gt; +            return FALSE;
&gt; +
&gt; +        set1 = set1-&gt;next;
&gt; +        set2 = set2-&gt;next;
&gt; +    }
&gt; +
&gt; +    return (!set2);
&gt; +}
&gt; +
&gt; +static void testWebkitAtkTextAttributes(void)
&gt; +{
&gt; +    WebKitWebView* webView;
&gt; +    AtkObject* obj;
&gt; +    AtkObject* child;
&gt; +    GMainLoop* loop;
&gt; +    AtkText* childText;
&gt; +    AtkAttributeSet *set1, *set2, *set3, *set4;
&gt; +    gint startOffset, endOffset, length;
&gt; +
&gt; +    webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
&gt; +    g_object_ref_sink(webView);
&gt; +    GtkAllocation alloc = { 0, 0, 800, 600 };
&gt; +    gtk_widget_size_allocate(GTK_WIDGET(webView), &amp;alloc);
&gt; +
&gt; +    webkit_web_view_load_string(webView, textWithAttributes, NULL, NULL, NULL);
&gt; +    loop = g_main_loop_new(NULL, TRUE);
&gt; +
&gt; +    g_timeout_add(100, (GSourceFunc)bail_out, loop);
&gt; +    g_main_loop_run(loop);
&gt; +
&gt; +    obj = gtk_widget_get_accessible(GTK_WIDGET(webView));
&gt; +    g_assert(obj);
&gt; +
&gt; +    child = atk_object_ref_accessible_child(obj, 0);
&gt; +    g_assert(child &amp;&amp; ATK_IS_TEXT(child));
&gt; +    childText = ATK_TEXT(child);
&gt; +    set1 = atk_text_get_run_attributes(childText, 0, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert_cmpint(startOffset, ==, 0);
&gt; +    g_assert_cmpint(endOffset, ==, 12);
&gt; +    g_assert(atkAttributeSetAreEqual(set1, NULL));
&gt; +    set1 = atk_text_get_run_attributes(childText, 15, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert_cmpint(startOffset, ==, 12);
&gt; +    g_assert_cmpint(endOffset, ==, 17);
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set1, ATK_TEXT_ATTR_STYLE, &quot;italic&quot;));
&gt; +    set2 = atk_text_get_run_attributes(childText, 17, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert_cmpint(startOffset, ==, 17);
&gt; +    g_assert_cmpint(endOffset, ==, 40);
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set2, ATK_TEXT_ATTR_WEIGHT, &quot;700&quot;));
&gt; +    set3 = atk_text_get_default_attributes(childText);
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set3, ATK_TEXT_ATTR_STYLE, &quot;normal&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set3, ATK_TEXT_ATTR_JUSTIFICATION, &quot;right&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set3, ATK_TEXT_ATTR_SIZE, &quot;14&quot;));
&gt; +    atk_attribute_set_free(set1);
&gt; +    atk_attribute_set_free(set2);
&gt; +    atk_attribute_set_free(set3);
&gt; +
&gt; +    child = atk_object_ref_accessible_child(obj, 1);
&gt; +    g_assert(child &amp;&amp; ATK_IS_TEXT(child));
&gt; +    childText = ATK_TEXT(child);
&gt; +    set1 = atk_text_get_default_attributes(childText);
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set1, ATK_TEXT_ATTR_FAMILY_NAME, &quot;monospace&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set1, ATK_TEXT_ATTR_STYLE, &quot;normal&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set1, ATK_TEXT_ATTR_STRIKETHROUGH, &quot;false&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set1, ATK_TEXT_ATTR_WEIGHT, &quot;400&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set1, ATK_TEXT_ATTR_FG_COLOR, &quot;120,121,122&quot;));
&gt; +    set2 = atk_text_get_run_attributes(childText, 43, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert_cmpint(startOffset, ==, 43);
&gt; +    g_assert_cmpint(endOffset, ==, 80);
&gt; +    // Checks that default attributes of text are not returned when called to atk_text_get_run_attributes
&gt; +    g_assert(!atkAttributeSetAttributeHasValue(set2, ATK_TEXT_ATTR_FG_COLOR, &quot;120,121,122&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set2, ATK_TEXT_ATTR_UNDERLINE, &quot;single&quot;));
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set2, ATK_TEXT_ATTR_BG_COLOR, &quot;80,81,82&quot;));
&gt; +    atk_attribute_set_free(set1);
&gt; +    atk_attribute_set_free(set2);
&gt; +
&gt; +    child = atk_object_ref_accessible_child(obj, 2);
&gt; +    g_assert(child &amp;&amp; ATK_IS_TEXT(child));
&gt; +    childText = ATK_TEXT(child);
&gt; +    set1 = atk_text_get_run_attributes(childText, 0, &amp;startOffset, &amp;endOffset);
&gt; +    set2 = atk_text_get_run_attributes(childText, 3, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert(atkAttributeSetAreEqual(set1, set2));
&gt; +    atk_attribute_set_free(set2);
&gt; +    set2 = atk_text_get_run_attributes(childText, 1, &amp;startOffset, &amp;endOffset);
&gt; +    set3 = atk_text_get_run_attributes(childText, 5, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert(atkAttributeSetAreEqual(set2, set3));
&gt; +    g_assert(!atkAttributeSetAreEqual(set1, set2));
&gt; +    atk_attribute_set_free(set3);
&gt; +    set3 = atk_text_get_run_attributes(childText, 2, &amp;startOffset, &amp;endOffset);
&gt; +    set4 = atk_text_get_run_attributes(childText, 6, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert(atkAttributeSetAreEqual(set3, set4));
&gt; +    g_assert(!atkAttributeSetAreEqual(set1, set3));
&gt; +    g_assert(!atkAttributeSetAreEqual(set2, set3));
&gt; +    atk_attribute_set_free(set1);
&gt; +    atk_attribute_set_free(set2);
&gt; +    atk_attribute_set_free(set3);
&gt; +    atk_attribute_set_free(set4);
&gt; +
&gt; +    child = atk_object_ref_accessible_child(obj, 3);
&gt; +    g_assert(child &amp;&amp; ATK_IS_TEXT(child));
&gt; +    childText = ATK_TEXT(child);
&gt; +    set1 = atk_text_get_run_attributes(childText, 24, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert_cmpint(startOffset, ==, 21);
&gt; +    g_assert_cmpint(endOffset, ==, 25);
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set1, ATK_TEXT_ATTR_STRIKETHROUGH, &quot;true&quot;));
&gt; +    set2 = atk_text_get_run_attributes(childText, 25, &amp;startOffset, &amp;endOffset);
&gt; +    g_assert_cmpint(startOffset, ==, 25);
&gt; +    g_assert_cmpint(endOffset, ==, 30);
&gt; +    g_assert(atkAttributeSetAreEqual(set2, NULL));
&gt; +    set3 = atk_text_get_default_attributes(childText);
&gt; +    g_assert(atkAttributeSetAttributeHasValue(set3, ATK_TEXT_ATTR_JUSTIFICATION, &quot;center&quot;));
&gt; +    atk_attribute_set_free(set1);
&gt; +    atk_attribute_set_free(set2);
&gt; +    atk_attribute_set_free(set3);
&gt; +}
&gt; +
&gt;  int main(int argc, char** argv)
&gt;  {
&gt;      g_thread_init(NULL);
&gt; @@ -463,6 +620,7 @@ int main(int argc, char** argv)
&gt;      g_test_add_func(&quot;/webkit/atk/get_text_at_offset_text_input&quot;, test_webkit_atk_get_text_at_offset_text_input);
&gt;      g_test_add_func(&quot;/webkit/atk/getTextInParagraphAndBodySimple&quot;, testWebkitAtkGetTextInParagraphAndBodySimple);
&gt;      g_test_add_func(&quot;/webkit/atk/getTextInParagraphAndBodyModerate&quot;, testWebkitAtkGetTextInParagraphAndBodyModerate);
&gt; +    g_test_add_func(&quot;/webkit/atk/testWebkitAtkTextAttributes&quot;, testWebkitAtkTextAttributes);
&gt;      return g_test_run ();
&gt;  }
&gt;  

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1014
 +  
The ChangeLog for Webcore is missing.

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1022
 +  
A nit, but the style guide says to declare variables when needed, not at the beginning of the block.

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1036
 +      }
One space here?

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1046
 +          baselinePosition = -baselinePosition;
My guess is that you are falling through deliberately here to get a negative rise, with includeRise assigned to true in the next case. Please don&apos;t do this, makes the code much harder to guess just to save one variable assignment.

Init includeRise to true outside the switch, and put a break here.

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1110
 +          break;
Put this at the end together with default.

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1147
 +  static AtkAttributeSet* attributeSetDifference(AtkAttributeSet* a1, AtkAttributeSet* a2)
Extra space at the begining of the comment?

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1184
 +  
Still believe it makes sense to reuse webkit_accessible_text_get_text here.

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1271
 +      return result;
return getAttributeSetForAccessibilityObject(coreObject);

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1215
 +              }
Let&apos;s keep a variable with the current offset and use that as the while condition instead of using a break ...

WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1200
 +          AccessibilityObject* child = object-&gt;firstChild();
Just exit early if there&apos;s no firstChild, gets rid of one level of indentation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>235826</commentid>
    <comment_count>11</comment_count>
      <attachid>58253</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-06-09 09:31:26 -0700</bug_when>
    <thetext>Created attachment 58253
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

Trying to help unblock this issue, here is a new version of Jose&apos;s patch address all the issues in comment #10, almost one month ago.

I&apos;ve kept the authorship as it was since I did not introduce any major change on them, just those needed to address the mentioned issues and some other minor fixes and tweaks I found while testing this stuff both through unit tests and accerciser.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>235831</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-09 09:36:50 -0700</bug_when>
    <thetext>Attachment 58253 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1255:  webkit_accessible_text_get_run_attributes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WARNING: File exempt from style guide. Skipping: &quot;WebKit/gtk/tests/testatk.c&quot;
Total errors found: 1 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>235853</commentid>
    <comment_count>13</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-06-09 10:15:03 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; Attachment 58253 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1255:  webkit_accessible_text_get_run_attributes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
&gt; WARNING: File exempt from style guide. Skipping: &quot;WebKit/gtk/tests/testatk.c&quot;
&gt; Total errors found: 1 in 4 files

Yes, I already saw that but I don&apos;t have a clue of what to do here since it&apos;s a common practice in that file to name all the functions for the ATK roles that way.

Any suggestion?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237742</commentid>
    <comment_count>14</comment_count>
      <attachid>58253</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2010-06-14 01:06:24 -0700</bug_when>
    <thetext>Comment on attachment 58253
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

&gt;+    RenderObject* renderer = (static_cast&lt;const AccessibilityRenderObject*&gt;(object))-&gt;renderer();

You don&apos;t need those parenthesis.

&gt;+    RenderStyle* style = renderer-&gt;style();
&gt;+
&gt;+    const int bufferSize = 16;
&gt;+    gchar buffer[bufferSize];
&gt;+    g_snprintf(buffer, bufferSize, &quot;%i&quot;, style-&gt;fontSize());

Can we just use g_strdup_printf with GOwnPtr here and in the other places instead of buffers with hardcoded lenght?

&gt;+    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_UNDERLINE), ((style-&gt;textDecoration() &amp; UNDERLINE) ? &quot;single&quot; : &quot;none&quot;));

Don&apos;t really need that parenthesis either AFAIK.

&gt;+static gint compareAttribute(const AtkAttribute* a, const AtkAttribute* b)
&gt;+{
&gt;+    return (g_strcmp0(a-&gt;name, b-&gt;name) || g_strcmp0(a-&gt;value, b-&gt;value));

Neither this.

&gt;+}

&gt;+static guint accessibilityObjectLength(const AccessibilityObject* object)
&gt;+{
&gt;+    int value = object-&gt;stringValue().length();
&gt;+    if (value)
&gt;+        return value;
&gt;+    if (object-&gt;isAccessibilityRenderObject()) {
&gt;+        const RenderObject* renderer = (static_cast&lt;const AccessibilityRenderObject*&gt;(object))-&gt;renderer();
&gt;+        if (renderer-&gt;isBR())
&gt;+            return 1;
&gt;+    }
&gt;+    // return object-&gt;textUnderElement().length();
&gt;+    GOwnPtr&lt;gchar&gt; text(webkit_accessible_text_get_text(ATK_TEXT(object-&gt;wrapper()), 0, -1));
&gt;+    return g_utf8_strlen (text.get(), -1);

You are kind of duplicating, I think, everything webkit_accessible_get_text does (at least it has code for stringValue().lenght and some special casing for BR); do you positively know you can&apos;t just return the lenght of what is returned by that method? If not, why?. Also, there&apos;s an extra space in the strlen call.

&gt; 
&gt;+static gint compAtkAttribute(AtkAttribute *a1, AtkAttribute *a2)
&gt;+{
&gt;+    gint strcmpVal;
&gt;+    strcmpVal = g_strcmp0(a1-&gt;name, a2-&gt;name);
&gt;+    if (strcmpVal)
&gt;+        return strcmpVal;
&gt;+    return g_strcmp0(a1-&gt;value, a2-&gt;value);
&gt;+}
&gt;+
&gt;+static gint compAtkAttributeName(AtkAttribute *a1, AtkAttribute *a2)
&gt;+{
&gt;+    return g_strcmp0(a1-&gt;name, a2-&gt;name);
&gt;+}
&gt;+

The &apos;*&apos; are all wrong; I think the style script should just ignore this by now, but if it still gives false warnings just ignore it.

&gt;+static gboolean atkAttributeSetAttributeHasValue(AtkAttributeSet *set, AtkTextAttribute attribute, const gchar *value)
&gt;+{
&gt;+    AtkAttribute at;
&gt;+    at.name = g_strdup(atk_text_attribute_get_name(attribute));
&gt;+
&gt;+    GSList *element = g_slist_find_custom(set, &amp;at, (GCompareFunc)compAtkAttributeName);
&gt;+    g_free(at.name);

Do you really need to make that copy?

&gt;+
&gt;+    gboolean result = (element &amp;&amp; !g_strcmp0(((AtkAttribute*)(element-&gt;data))-&gt;value, value));

No parenthesis.

&gt;+    if (!result &amp;&amp; element)
&gt;+        printf(&quot;Expected %s got %s\n&quot;, value, ((AtkAttribute*)(element-&gt;data))-&gt;value);

What is this printf for? Shouldn&apos;t we assert or something, being this a test...

I think the patch is almost there, let&apos;s just fix those things.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237906</commentid>
    <comment_count>15</comment_count>
      <attachid>58670</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-06-14 10:55:07 -0700</bug_when>
    <thetext>Created attachment 58670
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

(In reply to comment #14)
&gt; (From update of attachment 58253 [details])
&gt; &gt;+    RenderObject* renderer = (static_cast&lt;const AccessibilityRenderObject*&gt;(object))-&gt;renderer();
&gt; 
&gt; You don&apos;t need those parenthesis.

Fixed

&gt; &gt;+    RenderStyle* style = renderer-&gt;style();
&gt; &gt;+
&gt; &gt;+    const int bufferSize = 16;
&gt; &gt;+    gchar buffer[bufferSize];
&gt; &gt;+    g_snprintf(buffer, bufferSize, &quot;%i&quot;, style-&gt;fontSize());
&gt; 
&gt; Can we just use g_strdup_printf with GOwnPtr here and in the other places instead of buffers with hardcoded lenght?

Sure! :-)
Done.

&gt; &gt;+    result = addAttributeToSet(result, atk_text_attribute_get_name(ATK_TEXT_ATTR_UNDERLINE), ((style-&gt;textDecoration() &amp; UNDERLINE) ? &quot;single&quot; : &quot;none&quot;));
&gt; 
&gt; Don&apos;t really need that parenthesis either AFAIK.

Fixed

&gt; &gt;+static gint compareAttribute(const AtkAttribute* a, const AtkAttribute* b)
&gt; &gt;+{
&gt; &gt;+    return (g_strcmp0(a-&gt;name, b-&gt;name) || g_strcmp0(a-&gt;value, b-&gt;value));
&gt; 
&gt; Neither this.

Fixed

&gt; &gt;+static guint accessibilityObjectLength(const AccessibilityObject* object)
&gt; &gt;+{
&gt; &gt;+    int value = object-&gt;stringValue().length();
&gt; &gt;+    if (value)
&gt; &gt;+        return value;
&gt; &gt;+    if (object-&gt;isAccessibilityRenderObject()) {
&gt; &gt;+        const RenderObject* renderer = (static_cast&lt;const AccessibilityRenderObject*&gt;(object))-&gt;renderer();
&gt; &gt;+        if (renderer-&gt;isBR())
&gt; &gt;+            return 1;
&gt; &gt;+    }
&gt; &gt;+    // return object-&gt;textUnderElement().length();
&gt; &gt;+    GOwnPtr&lt;gchar&gt; text(webkit_accessible_text_get_text(ATK_TEXT(object-&gt;wrapper()), 0, -1));
&gt; &gt;+    return g_utf8_strlen (text.get(), -1);
&gt; 
&gt; You are kind of duplicating, I think, everything webkit_accessible_get_text does (at least it has code for stringValue().lenght and some special casing for BR); do you positively know you can&apos;t just return the lenght of what is returned by that method? If not, why?. Also, there&apos;s an extra space in the strlen call.

Fixed
 
&gt; &gt; 
&gt; &gt;+static gint compAtkAttribute(AtkAttribute *a1, AtkAttribute *a2)
&gt; &gt;+{
&gt; &gt;+    gint strcmpVal;
&gt; &gt;+    strcmpVal = g_strcmp0(a1-&gt;name, a2-&gt;name);
&gt; &gt;+    if (strcmpVal)
&gt; &gt;+        return strcmpVal;
&gt; &gt;+    return g_strcmp0(a1-&gt;value, a2-&gt;value);
&gt; &gt;+}
&gt; &gt;+
&gt; &gt;+static gint compAtkAttributeName(AtkAttribute *a1, AtkAttribute *a2)
&gt; &gt;+{
&gt; &gt;+    return g_strcmp0(a1-&gt;name, a2-&gt;name);
&gt; &gt;+}
&gt; &gt;+
&gt; 
&gt; The &apos;*&apos; are all wrong; I think the style script should just ignore this by now, but if it still gives false warnings just ignore it.

Fixed

&gt; &gt;+static gboolean atkAttributeSetAttributeHasValue(AtkAttributeSet *set, AtkTextAttribute attribute, const gchar *value)
&gt; &gt;+{
&gt; &gt;+    AtkAttribute at;
&gt; &gt;+    at.name = g_strdup(atk_text_attribute_get_name(attribute));
&gt; &gt;+
&gt; &gt;+    GSList *element = g_slist_find_custom(set, &amp;at, (GCompareFunc)compAtkAttributeName);
&gt; &gt;+    g_free(at.name);
&gt; 
&gt; Do you really need to make that copy?

I guess not. Reverted to the original code from Millan, which didn&apos;t duplicate anything.

&gt; &gt;+
&gt; &gt;+    gboolean result = (element &amp;&amp; !g_strcmp0(((AtkAttribute*)(element-&gt;data))-&gt;value, value));
&gt; 
&gt; No parenthesis.

Fixed

&gt; &gt;+    if (!result &amp;&amp; element)
&gt; &gt;+        printf(&quot;Expected %s got %s\n&quot;, value, ((AtkAttribute*)(element-&gt;data))-&gt;value);
&gt; 
&gt; What is this printf for? Shouldn&apos;t we assert or something, being this a test...

Reading the whole patch I think this is just some legacy code for debugging purposes, as the return value for this function is immediately used in an assertion so it wouldn&apos;t make sense either to assert the same thing here also. Hence, code removed.

&gt; I think the patch is almost there, let&apos;s just fix those things.

Attached a new patch addressing all these issues, and tested it both in Accerciser and with the unittests/testatk binary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237917</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-14 10:59:42 -0700</bug_when>
    <thetext>Attachment 58670 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1243:  webkit_accessible_text_get_run_attributes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WARNING: File exempt from style guide. Skipping: &quot;WebKit/gtk/tests/testatk.c&quot;
Total errors found: 1 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240617</commentid>
    <comment_count>17</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-06-21 00:49:08 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; Attachment 58670 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
&gt; WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1243:  webkit_accessible_text_get_run_attributes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
&gt; WARNING: File exempt from style guide. Skipping: &quot;WebKit/gtk/tests/testatk.c&quot;
&gt; Total errors found: 1 in 4 files
&gt; 
&gt; 
&gt; If any of these errors are false positives, please file a bug against check-webkit-style.

Can&apos;t do anything about this, since that&apos;s the common codestyle used in this file and I guess it&apos;s better not to change it.

Any idea on how to workaround this? (I&apos;m usually working on this file and this kind of WK Bot failures are a bit annoying).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244223</commentid>
    <comment_count>18</comment_count>
      <attachid>58670</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2010-06-29 05:16:31 -0700</bug_when>
    <thetext>Comment on attachment 58670
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

Looks good, but this still uses g_timeout_add in the test. Can you change it to an idle and we get this in? Sorry for the trouble.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244295</commentid>
    <comment_count>19</comment_count>
      <attachid>60022</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2010-06-29 07:54:54 -0700</bug_when>
    <thetext>Created attachment 60022
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

(In reply to comment #18)
&gt; (From update of attachment 58670 [details])
&gt; Looks good, but this still uses g_timeout_add in the test. Can you change it to an idle and we get this in? Sorry for the trouble.

Thanks for noticing. After all it&apos;s not just a matter of replacing the timeout for and idle_add but also about having a patch that compiles against current status of trunk :-)

Created a new patch against trunk then and tested, so here you have it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244296</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-29 07:55:35 -0700</bug_when>
    <thetext>Attachment 60022 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:1229:  webkit_accessible_text_get_run_attributes is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WARNING: File exempt from style guide. Skipping: &quot;WebKit/gtk/tests/testatk.c&quot;
Total errors found: 1 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244661</commentid>
    <comment_count>21</comment_count>
      <attachid>60022</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2010-06-30 00:53:12 -0700</bug_when>
    <thetext>Comment on attachment 60022
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244668</commentid>
    <comment_count>22</comment_count>
      <attachid>60022</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-06-30 01:12:12 -0700</bug_when>
    <thetext>Comment on attachment 60022
webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation

Clearing flags on attachment: 60022

Committed r62164: &lt;http://trac.webkit.org/changeset/62164&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244669</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-06-30 01:12:18 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>29967</attachid>
            <date>2009-05-03 15:01:35 -0700</date>
            <delta_ts>2009-05-03 15:01:35 -0700</delta_ts>
            <desc>aforementioned test case</desc>
            <filename>textattributes.html</filename>
            <type>text/html</type>
            <size>5412</size>
            <attacher name="Joanmarie Diggs">jdiggs</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwv
L2VuIj4KPGh0bWw+CiAgPGhlYWQ+PHRpdGxlPlRleHQgQXR0cmlidXRlcyBhbmQgQWxpZ25tZW50
IFRlc3QgUGFnZTwvdGl0bGU+PC9oZWFkPgogIDxib2R5PgoKICA8aDE+VGV4dCBBdHRyaWJ1dGVz
PC9oMT4KCiAgPGI+VGhpcyBzZW50ZW5jZSBpcyBib2xkLjwvYj4KICA8cD48aT5UaGlzIHNlbnRl
bmNlIGlzIGl0YWxpY2l6ZWQuPC9pPjwvcD4KICA8cD48dT5UaGlzIHNlbnRlbmNlIGlzIHVuZGVy
bGluZWQuPC91PjwvcD4KICA8cD48c3RyaWtlPlRoaXMgc2VudGVuY2UgdXNlcyBzdHJpa2V0aHJv
dWdoLjwvc3RyaWtlPjwvcD4KICA8cD5UaGlzIDxzdXA+c2VudGVuY2UgPC9zdXA+aGFzIHRoZSB3
b3JkcyA8c3VwPnNlbnRlbmNlIDwvc3VwPmluIHN1cGVyc2NyaXB0LjwvcD4KICA8cD5UaGlzIDxz
dWI+c2VudGVuY2UgPC9zdWI+aGFzIHRoZSB3b3JkIDxzdWI+c2VudGVuY2UgPC9zdWI+aW4gc3Vi
c2NyaXB0LjwvcD4KICA8aDE+VGhpcyBpcyBhIEhlYWRpbmcgMS48L2gxPgogIDxoMj5UaGlzIGlz
IGEgSGVhZGluZyAyLjwvaDI+CiAgPGgzPlRoaXMgaXMgYSBIZWFkaW5nIDMuPC9oMz4KICA8aDQ+
VGhpcyBpcyBhIEhlYWRpbmcgNC48L2g0PgogIDxoNT5UaGlzIGlzIGEgSGVhZGluZyA1LjwvaDU+
CiAgPGg2PlRoaXMgaXMgYSBIZWFkaW5nIDYuPC9oNj4KCiAgPHA+PGZvbnQgZmFjZT0iQXJpYWwi
PlRoaXMgc2VudGVuY2UgaXMgaW4gQXJpYWwgZm9udC48L2ZvbnQ+PC9wPgogIDxicj48Zm9udCBm
YWNlPSJDb21pYyBTYW5zIE1TIj5UaGlzIHNlbnRlbmNlIGlzIGluIENvbWljIFNhbnMgTVNsIGZv
bnQuPC9mb250CiAgPGJyPjxmb250IGZhY2U9IkNvdXJpZXIgTmV3LENvdXJpZXIiPlRoaXMgc2Vu
dGVuY2UgaXMgaW4gQ291cmllciBOZXcgRm9udC48L2ZvbnQ+CiAgPGJyPjxmb250IGZhY2U9Ikdh
cmFtb25kIj5UaGlzIHNlbnRlbmNlIGlzIGluIEdhcmFtb25kbCBmb250LjwvZm9udD4KICA8YnI+
PGZvbnQgZmFjZT0iSW1wYWN0Ij5UaGlzIHNlbnRlbmNlIGlzIGluIEltcGFjdCBmb250LjwvZm9u
dD4KICA8YnI+PGZvbnQgZmFjZT0iTHVjaWRhIENvbnNvbGUiPlRoaXMgc2VudGVuY2UgaXMgaW4g
THVjaWRhIENvbnNvbGUgZm9udC48L2ZvbnQ+CiAgPGJyPjxmb250IGZhY2U9IlN5ZG5pZSI+VGhp
cyBzZW50ZW5jZSBpcyBpbiBTeWRuaWUgZm9udC48L2ZvbnQ+CiAgPGJyPjxmb250IGZhY2U9IlRh
aG9tYSI+VGhpcyBzZW50ZW5jZSBpcyBpbiBUYWhvbWEgZm9udC48L2ZvbnQ+CiAgPGJyPjxmb250
IGZhY2U9IlRpbWVzIE5ldyBSb21hbixUaW1lcyI+VGhpcyBzZW50ZW5jZSBpcyBpbiBUaW1lcyBO
ZXcgUm9tYW4gZm9udC48L2ZvbnQ+CiAgPGJyPjxmb250IHNpemU9IisyIj5UaGlzIHNlbnRlbmNl
IGlzIGluIGZvbnQgc2l6ZSAxOCBvbiBhIFBDIG9yIGZvbnQgc2l6ZSArMi48L2ZvbnQ+CiAgPGJy
Pjxmb250IHNpemU9Ii0xIj5UaGlzIHNlbnRlbmNlIGlzIGluIGZvbnQgc2l6ZSAxMCBvbiBhIFBD
LjwvZm9udD4KICA8YnI+PGZvbnQgY29sb3I9IiMwMGNjMDAiPlRoaXMgc2VudGVuY2UgaXMgZ3Jl
ZW4uPC9mb250PgogIDxicj48YWRkcmVzcz5UaGlzIHNlbnRlbmNlIGlzIGluIGFkZHJlc3MgZm9y
bWF0LjwvYWRkcmVzcz4KICA8YnI+PGJsaW5rPlRoaXMgc2VudGVuY2UgaXMgYmxpbmtpbmcuPC9i
bGluaz4KICA8YnI+PHByZT5UaGlzIHNlbnRlbmNlIGNvbnRhaW5zIHByZWZvcm1hdHRlZCBwbGFp
biB0ZXh0LjwvcHJlPgoKICA8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPgoK
ICA8aDE+QWxpZ25tZW50PC9oMT4KCiAgPGgyPkZyb20gU2hha2VzcGVhcmUncyBIYW1sZXQ8L2gy
PgogIDxwIGFsaWduPSJsZWZ0Ij5JIGhhdmUgb2YgbGF0ZSBidXQ8YnI+CiAgd2hlcmVmb3JlIEkg
a25vdyBub3QgbG9zdCBhbGwgbXkgbWlydGgsPGJyPgogIGZvcmdvbmUgYWxsIGN1c3RvbSBvZiBl
eGVyY2lzZXM7PGJyPgogIGFuZCBpbmRlZWQsIGl0IGdvZXMgc28gaGVhdmlseSB3aXRoPGJyPgog
IG15IGRpc3Bvc2l0aW9uIHRoYXQgdGhpcyBnb29kbHkgZnJhbWUsPGJyPgogIHRoZSBlYXJ0aCwg
c2VlbXMgdG8gbWUgYSBzdGVyaWxlIHByb21vbnRvcnk7PGJyPgogIHRoaXMgbW9zdCBleGNlbGxl
bnQgY2Fub3B5LCB0aGUgYWlyLCBsb29rIHlvdSw8YnI+CiAgdGhpcyBicmF2ZSBvJ2VyaGFuZ2lu
ZyBmaXJtYW1lbnQsPGJyPgogIHRoaXMgbWFqZXN0aWNhbCByb29mIGZyZXR0ZWQgd2l0aCBnb2xk
ZW4gZmlyZTxicj4KICB3aHksIGl0IGFwcGVhcmV0aCBubyBvdGhlciB0aGluZyB0byBtZSB0aGFu
IGEgZm91bDxicj4KICBhbmQgcGVzdGlsZW50IGNvbmdyZWdhdGlvbiBvZiB2YXBvdXJzLjxicj4K
ICBXaGF0IGEgcGllY2Ugb2Ygd29yayBpcyBhIG1hbiE8YnI+CiAgaG93IG5vYmxlIGluIHJlYXNv
biEgaG93IGluZmluaXRlIGluIGZhY3VsdGllcyE8YnI+CiAgaW4gZm9ybSBhbmQgbW92aW5nIGhv
dyBleHByZXNzIGFuZCBhZG1pcmFibGUhPGJyPgogIGluIGFjdGlvbiBob3cgbGlrZSBhbiBhbmdl
bCE8YnI+CiAgaW4gYXBwcmVoZW5zaW9uIGhvdyBsaWtlIGEgZ29kITxicj4KICB0aGUgYmVhdXR5
IG9mIHRoZSB3b3JsZCwgdGhlIHBhcmFnb24gb2YgYW5pbWFscyE8L3A+CgogIDxwIGFsaWduPSJj
ZW50ZXIiPkkgaGF2ZSBvZiBsYXRlIGJ1dDxicj4KICB3aGVyZWZvcmUgSSBrbm93IG5vdCBsb3N0
IGFsbCBteSBtaXJ0aCw8YnI+CiAgZm9yZ29uZSBhbGwgY3VzdG9tIG9mIGV4ZXJjaXNlczs8YnI+
CiAgYW5kIGluZGVlZCwgaXQgZ29lcyBzbyBoZWF2aWx5IHdpdGg8YnI+CiAgbXkgZGlzcG9zaXRp
b24gdGhhdCB0aGlzIGdvb2RseSBmcmFtZSw8YnI+CiAgdGhlIGVhcnRoLCBzZWVtcyB0byBtZSBh
IHN0ZXJpbGUgcHJvbW9udG9yeTs8YnI+CiAgdGhpcyBtb3N0IGV4Y2VsbGVudCBjYW5vcHksIHRo
ZSBhaXIsIGxvb2sgeW91LDxicj4KICB0aGlzIGJyYXZlIG8nZXJoYW5naW5nIGZpcm1hbWVudCw8
YnI+CiAgdGhpcyBtYWplc3RpY2FsIHJvb2YgZnJldHRlZCB3aXRoIGdvbGRlbiBmaXJlPGJyPgog
IHdoeSwgaXQgYXBwZWFyZXRoIG5vIG90aGVyIHRoaW5nIHRvIG1lIHRoYW4gYSBmb3VsPGJyPgog
IGFuZCBwZXN0aWxlbnQgY29uZ3JlZ2F0aW9uIG9mIHZhcG91cnMuPGJyPgogIFdoYXQgYSBwaWVj
ZSBvZiB3b3JrIGlzIGEgbWFuITxicj4KICBob3cgbm9ibGUgaW4gcmVhc29uISBob3cgaW5maW5p
dGUgaW4gZmFjdWx0aWVzITxicj4KICBpbiBmb3JtIGFuZCBtb3ZpbmcgaG93IGV4cHJlc3MgYW5k
IGFkbWlyYWJsZSE8YnI+CiAgaW4gYWN0aW9uIGhvdyBsaWtlIGFuIGFuZ2VsITxicj4KICBpbiBh
cHByZWhlbnNpb24gaG93IGxpa2UgYSBnb2QhPGJyPgogIHRoZSBiZWF1dHkgb2YgdGhlIHdvcmxk
LCB0aGUgcGFyYWdvbiBvZiBhbmltYWxzITwvcD4KCiAgPHAgYWxpZ249InJpZ2h0Ij5JIGhhdmUg
b2YgbGF0ZSBidXQ8YnI+CiAgd2hlcmVmb3JlIEkga25vdyBub3QgbG9zdCBhbGwgbXkgbWlydGgs
PGJyPgogIGZvcmdvbmUgYWxsIGN1c3RvbSBvZiBleGVyY2lzZXM7PGJyPgogIGFuZCBpbmRlZWQs
IGl0IGdvZXMgc28gaGVhdmlseSB3aXRoPGJyPgogIG15IGRpc3Bvc2l0aW9uIHRoYXQgdGhpcyBn
b29kbHkgZnJhbWUsPGJyPgogIHRoZSBlYXJ0aCwgc2VlbXMgdG8gbWUgYSBzdGVyaWxlIHByb21v
bnRvcnk7PGJyPgogIHRoaXMgbW9zdCBleGNlbGxlbnQgY2Fub3B5LCB0aGUgYWlyLCBsb29rIHlv
dSw8YnI+CiAgdGhpcyBicmF2ZSBvJ2VyaGFuZ2luZyBmaXJtYW1lbnQsPGJyPgogIHRoaXMgbWFq
ZXN0aWNhbCByb29mIGZyZXR0ZWQgd2l0aCBnb2xkZW4gZmlyZTxicj4KICB3aHksIGl0IGFwcGVh
cmV0aCBubyBvdGhlciB0aGluZyB0byBtZSB0aGFuIGEgZm91bDxicj4KICBhbmQgcGVzdGlsZW50
IGNvbmdyZWdhdGlvbiBvZiB2YXBvdXJzLjxicj4KICBXaGF0IGEgcGllY2Ugb2Ygd29yayBpcyBh
IG1hbiE8YnI+CiAgaG93IG5vYmxlIGluIHJlYXNvbiEgaG93IGluZmluaXRlIGluIGZhY3VsdGll
cyE8YnI+CiAgaW4gZm9ybSBhbmQgbW92aW5nIGhvdyBleHByZXNzIGFuZCBhZG1pcmFibGUhPGJy
PgogIGluIGFjdGlvbiBob3cgbGlrZSBhbiBhbmdlbCE8YnI+CiAgaW4gYXBwcmVoZW5zaW9uIGhv
dyBsaWtlIGEgZ29kITxicj4KICB0aGUgYmVhdXR5IG9mIHRoZSB3b3JsZCwgdGhlIHBhcmFnb24g
b2YgYW5pbWFscyE8L3A+CgogIDxociBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMnB4OyI+
CgogIDxoMT5JbmRlbnQ8L2gxPgoKICA8aDI+RnJvbSBXaXNsYXdhIFN6eW1ib3Jza2EgLSAxOTcy
PC9oMj4KCiAgPGJsb2NrcXVvdGU+SSBhbSBhIHRyYW5xdWlsaXplci4gPGJyPgogIEkgYW0gZWZm
ZWN0aXZlIGF0IGhvbWUsIDxicj4KICBJIHdvcmsgd2VsbCBhdCB0aGUgb2ZmaWNlLCA8YnI+CiAg
SSB0YWtlIGV4YW1zLCA8YnI+CiAgSSBhcHBlYXIgaW4gY291cnQsIDxicj4KICBJIGNhcmVmdWxs
eSBtZW5kIGJyb2tlbiBjcm9ja2VyeSAtIDxicj4KICBhbGwgeW91IG5lZWQgZG8gaXMgdGFrZSBt
ZSwgPGJyPgogIGRpc3NvbHZlIG1lIHVuZGVyIHRoZSB0b25ndWUsIDxicj4KICBhbGwgeW91IG5l
ZWQgZG8gaXMgc3dhbGxvdyBtZSwgPGJyPgogIGp1c3Qgd2FzaCBtZSBkb3duIHdpdGggd2F0ZXIu
CgogIDxwPkkga25vdyBob3cgdG8gY29wZSB3aXRoIG1pc2ZvcnR1bmUsIDxicj4KICBob3cgdG8g
ZW5kdXJlIGJhZCBuZXdzLCA8YnI+CiAgdGFrZSB0aGUgZWRnZSBvZiBpbmp1c3RpY2UsIDxicj4K
ICBtYWtlIHVwIGZvciB0aGUgYWJzZW5jZSBvZiBHb2QsIDxicj4KICBoZWxwIHBpY2sgb3V0IHlv
dXIgd2lkb3cncyB3ZWVkcy4gPGJyPgogIFdoYXQgYXJlIHlvdSB3YWl0aW5nIGZvciAtIDxicj4K
ICBoYXZlIGZhaXRoIGluIGNoZW1pc3RyeSdzIGNvbXBhc3Npb24uIDwvcD4KCiAgPHA+WW91J3Jl
IHN0aWxsIGEgeW91bmcgbWFuL3dvbWFuLCA8YnI+CiAgeW91IHJlYWxseSBzaG91bGQgc2V0dGxl
IGRvd24gc29tZWhvdy4gPGJyPgogIFdobyBzYWlkIDxicj4KICBsaWZlIG11c3QgYmUgbGl2ZWQg
Y291cmFnZW91c2x5PyA8L3A+CgogIDxwPkhhbmQgeW91ciBhYnlzcyBvdmVyIHRvIG1lIC0gPGJy
PgogIEkgd2lsbCBsaW5lIGl0IHVwIHdpdGggc29mdCBzbGVlcCwgPGJyPgogIHlvdSdsbCBiZSBn
cmF0ZWZ1bCBmb3IgPGJyPgogIHRoZSBmb3VyLWZvb3RlZCBsYW5kaW5nLiA8L3A+CgogIDxwPlNl
bGwgbWUgeW91ciBzb3VsLiA8YnI+CiAgVGhlcmUncyBubyBvdGhlciBidXllciBsaWtlbHkgdG8g
dHVybiB1cC4gPC9wPgogIDwvYmxvY2txdW90ZT4KCiAgPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0
MHB4OyI+VGhlcmUncyBubyBvdGhlciBkZXZpbCBsZWZ0Ljxicj4KCjwvYm9keT48L2h0bWw+
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46683</attachid>
            <date>2010-01-15 08:52:18 -0800</date>
            <delta_ts>2010-02-24 10:27:06 -0800</delta_ts>
            <desc>Patch that implements webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes</desc>
            <filename>20100115_atktextattributes.patch</filename>
            <type>text/plain</type>
            <size>13792</size>
            <attacher name="José Millán Soto">jmillan</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MzMzMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDEtMTUgIEpvc8OpIE1pbGzDoW4gU290byAgPGptaWxsYW5A
aWdhbGlhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBbR3RrXSBUZXh0IGF0dHJpYnV0ZXMgbm90IGV4cG9zZWQKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1NTI4CisKKyAgICAgICAgSW1wbGVtZW50
ZWQgd2Via2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMgYW5kCisgICAgICAg
IHdlYmtpdF9hY2Nlc3NpYmxlX3RleHRfZ2V0X2RlZmF1bHRfYXR0cmlidXRlcworCisgICAgICAg
IE5vIG5ldyB0ZXN0cy4gKE9PUFMhKQorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9ndGsvQWNj
ZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgorICAgICAgICAoYWRkQXR0cmlidXRlKToK
KyAgICAgICAgKGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2liaWxpdHlPYmplY3QpOgorICAgICAg
ICAoY29tcGFyZUF0dHJpYnV0ZU5hbWUpOgorICAgICAgICAoYXR0cmlidXRlU2V0VW5pb24pOgor
ICAgICAgICAoYWNjZXNzaWJpbGl0eU9iamVjdExlbmd0aCk6CisgICAgICAgIChnZXRBY2Nlc3Np
YmlsaXR5T2JqZWN0c0Zvck9mZnNldCk6CisgICAgICAgIChnZXRSdW5BdHRyaWJ1dGVzRnJvbUFj
Y2VzaWJpbGl0eU9iamVjdCk6CisgICAgICAgICh3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9y
dW5fYXR0cmlidXRlcyk6CisgICAgICAgICh3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9kZWZh
dWx0X2F0dHJpYnV0ZXMpOgorCiAyMDEwLTAxLTE1ICBPbGl2ZXIgSHVudCAgPG9saXZlckBhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTmlrb2xhcyBaaW1tZXJtYW5uLgpJbmRleDog
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5
T2JqZWN0V3JhcHBlckF0ay5jcHAJKHJldmlzaW9uIDUzMzMxKQorKysgV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTk5NCwxNiArOTk0LDMyMCBAQCBzdGF0aWMgZ2ludCB3ZWJraXRfYWNjZXNzaWJsZV90
ZXh0X2dldF9jCiAgICAgcmV0dXJuIG9mZnNldDsKIH0KIAotc3RhdGljIEF0a0F0dHJpYnV0ZVNl
dCogd2Via2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoQXRrVGV4dCogdGV4
dCwgZ2ludCBvZmZzZXQsIGdpbnQqIHN0YXJ0X29mZnNldCwgZ2ludCogZW5kX29mZnNldCkKK3N0
YXRpYyB2b2lkIGFkZEF0dHJpYnV0ZShBdGtBdHRyaWJ1dGVTZXQqICZhdHRyaWJ1dGVTZXQsIEF0
a1RleHRBdHRyaWJ1dGUgdGV4dEF0dHJpYnV0ZSwgZ2NoYXIqIHZhbHVlLCBib29sIGNvcHlWYWx1
ZSA9IHRydWUpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBB
dGtBdHRyaWJ1dGUqIG5ld0F0dHJpYnV0ZSA9IChBdGtBdHRyaWJ1dGUgKilnX21hbGxvYyhzaXpl
b2YoQXRrQXR0cmlidXRlKSk7CisgICAgbmV3QXR0cmlidXRlLT5uYW1lID0gZ19zdHJkdXAoYXRr
X3RleHRfYXR0cmlidXRlX2dldF9uYW1lKHRleHRBdHRyaWJ1dGUpKTsKKyAgICBpZiAoY29weVZh
bHVlKSB2YWx1ZSA9IGdfc3RyZHVwKHZhbHVlKTsKKyAgICBuZXdBdHRyaWJ1dGUtPnZhbHVlID0g
dmFsdWU7CisgICAgYXR0cmlidXRlU2V0ID0gZ19zbGlzdF9wcmVwZW5kKGF0dHJpYnV0ZVNldCwg
bmV3QXR0cmlidXRlKTsKK30KKworLyoKKyAgICBSZXR1cm5zIGFuIEF0a0F0dHJpYnV0ZVNldCB3
aXRoIHRoZSBBdGtBdHRyaWJ1dGVzIHdoaWNoIGRlZmluZSBzdHlsZS4KKyAgICBJZiBwYXJlbnRP
YmplY3QgaXMgZ2l2ZW4sIG9ubHkgdGhlIG9uZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBmcm9tIHN0
eWxlIGFuZAorICAgIHBhcmVudFN0eWxlIHdvdWxkIGJlIGluIHRoZSByZXN1bHQuCisqLworc3Rh
dGljIEF0a0F0dHJpYnV0ZVNldCogZ2V0QXR0cmlidXRlU2V0Rm9yQWNjZXNzaWJpbGl0eU9iamVj
dChjb25zdCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmplY3QsIGJvb2wgb25seURpZmZlcmVudEZy
b21QYXJlbnQgPSBmYWxzZSkKK3sKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyOworICAgIFJl
bmRlck9iamVjdCogcGFyZW50UmVuZGVyZXIgPSAwOworICAgIEF0a0F0dHJpYnV0ZVNldCogcmVz
dWx0ID0gMDsKKyAgICBSZW5kZXJTdHlsZSogc3R5bGU7CisgICAgUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlID0gMDsKKyAgICBpbnQgaW50UHJvcDsKKyAgICBib29sIHN0eWxlUHJvcDsKKworICAg
IGlmIChvYmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpKSB7CisgICAgICAgIEFj
Y2Vzc2liaWxpdHlPYmplY3QqIHBhcmVudDsKKyAgICAgICAgcmVuZGVyZXIgPSAoKEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3QqKW9iamVjdCktPnJlbmRlcmVyKCk7CisgICAgICAgIHN0eWxlID0g
cmVuZGVyZXItPnN0eWxlKCk7CisgICAgICAgIGlmIChvbmx5RGlmZmVyZW50RnJvbVBhcmVudCkg
eworICAgICAgICAgICAgcGFyZW50ID0gb2JqZWN0LT5wYXJlbnRPYmplY3QoKTsKKyAgICAgICAg
ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC0+aXNBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
KCkpCisgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT5wYXJlbnRPYmplY3QoKTsKKyAg
ICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LT5pc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3QoKSkKKyAgICAgICAgICAgICAgICBwYXJlbnRSZW5kZXJlciA9ICgoQWNjZXNzaWJpbGl0eVJl
bmRlck9iamVjdCopcGFyZW50KS0+cmVuZGVyZXIoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwYXJlbnRSZW5kZXJlcikKKyAgICAgICAgcGFy
ZW50U3R5bGUgPSBwYXJlbnRSZW5kZXJlci0+c3R5bGUoKTsKKworICAgIGludFByb3AgPSBzdHls
ZS0+Zm9udFNpemUoKTsKKyAgICBpZiAoIXBhcmVudFN0eWxlIHx8IChpbnRQcm9wICE9IHBhcmVu
dFN0eWxlLT5mb250U2l6ZSgpKSkKKyAgICAgICAgYWRkQXR0cmlidXRlKHJlc3VsdCwgQVRLX1RF
WFRfQVRUUl9TSVpFLCBnX3N0cmR1cF9wcmludGYoIiVpIiwgaW50UHJvcCksIGZhbHNlKTsKKwor
ICAgIGlmIChzdHlsZS0+aGFzQmFja2dyb3VuZCgpCisgICAgICAgICYmICEocGFyZW50U3R5bGUK
KyAgICAgICAgICAgICAmJiBwYXJlbnRTdHlsZS0+aGFzQmFja2dyb3VuZCgpCisgICAgICAgICAg
ICAgJiYgKHN0eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKSA9PSBwYXJlbnRTdHlsZS0+YmFja2dyb3Vu
ZENvbG9yKCkpKQorICAgICAgICAmJiBzdHlsZS0+Y29sb3IoKS5pc1ZhbGlkKCkpCisgICAgICAg
IGFkZEF0dHJpYnV0ZShyZXN1bHQsIEFUS19URVhUX0FUVFJfQkdfQ09MT1IsIGdfc3RyZHVwX3By
aW50ZigiJWksJWksJWkiLCBzdHlsZS0+YmFja2dyb3VuZENvbG9yKCkucmVkKCksIHN0eWxlLT5i
YWNrZ3JvdW5kQ29sb3IoKS5ncmVlbigpLCBzdHlsZS0+YmFja2dyb3VuZENvbG9yKCkuYmx1ZSgp
KSwgZmFsc2UpOworICAgIGlmIChzdHlsZS0+Y29sb3IoKS5pc1ZhbGlkKCkKKyAgICAgICAgJiYg
IShwYXJlbnRTdHlsZSAmJiAoc3R5bGUtPmNvbG9yKCkgPT0gcGFyZW50U3R5bGUtPmNvbG9yKCkp
KSkKKyAgICAgICAgYWRkQXR0cmlidXRlKHJlc3VsdCwgQVRLX1RFWFRfQVRUUl9GR19DT0xPUiwg
Z19zdHJkdXBfcHJpbnRmKCIlaSwlaSwlaSIsIHN0eWxlLT5jb2xvcigpLnJlZCgpLCBzdHlsZS0+
Y29sb3IoKS5ncmVlbigpLCBzdHlsZS0+Y29sb3IoKS5ibHVlKCkpLCBmYWxzZSk7CisKKyAgICBp
bnRQcm9wID0gcmVuZGVyZXItPmJhc2VsaW5lUG9zaXRpb24odHJ1ZSk7CisgICAgaWYgKCFwYXJl
bnRTdHlsZQorICAgICAgICB8fCAocGFyZW50U3R5bGUtPnZlcnRpY2FsQWxpZ24oKSAhPSBzdHls
ZS0+dmVydGljYWxBbGlnbigpKQorICAgICAgICB8fCAoc3R5bGUtPnZlcnRpY2FsQWxpZ24oKSA9
PSBCQVNFTElORSA/IGZhbHNlIDogKGludFByb3AgIT0gcGFyZW50UmVuZGVyZXItPmJhc2VsaW5l
UG9zaXRpb24odHJ1ZSkpKSkgeworICAgICAgICBib29sIGluY2x1ZGVSaXNlOworICAgICAgICBz
d2l0Y2ggKHN0eWxlLT52ZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgY2FzZSBTVUI6CisgICAg
ICAgICAgICBpbnRQcm9wID0gLWludFByb3A7CisgICAgICAgIGNhc2UgU1VQRVI6CisgICAgICAg
ICAgICBpbmNsdWRlUmlzZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBCQVNFTElORToKKyAgICAgICAgICAgIGluY2x1ZGVSaXNlID0gdHJ1ZTsKKyAgICAgICAgICAg
IGludFByb3AgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAg
ICAgICAgICBpbmNsdWRlUmlzZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpbmNs
dWRlUmlzZSkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShyZXN1bHQsIEFUS19URVhUX0FUVFJf
UklTRSwgZ19zdHJkdXBfcHJpbnRmKCIlaSIsIGludFByb3ApLCBmYWxzZSk7CisgICAgfQorCisg
ICAgaWYgKCFwYXJlbnRTdHlsZQorICAgICAgICB8fCAocGFyZW50U3R5bGUtPnRleHRJbmRlbnQo
KSAhPSBzdHlsZS0+dGV4dEluZGVudCgpKSkgeworICAgICAgICBnaW50IHZhbHVlID0gc3R5bGUt
PnRleHRJbmRlbnQoKS5jYWxjVmFsdWUob2JqZWN0LT5zaXplKCkud2lkdGgoKSk7CisgICAgICAg
IGlmICh2YWx1ZSAhPSB1bmRlZmluZWRMZW5ndGgpCisgICAgICAgICAgICBhZGRBdHRyaWJ1dGUo
cmVzdWx0LCBBVEtfVEVYVF9BVFRSX0lOREVOVCwgZ19zdHJkdXBfcHJpbnRmKCIlaSIsIHZhbHVl
KSwgZmFsc2UpOworICAgIH0KKworICAgIGlmICghcGFyZW50U3R5bGUgfHwgKHBhcmVudFN0eWxl
LT5mb250KCkuZmFtaWx5KCkuZmFtaWx5KCkgIT0gc3R5bGUtPmZvbnQoKS5mYW1pbHkoKS5mYW1p
bHkoKSkpCisgICAgICAgIGFkZEF0dHJpYnV0ZShyZXN1bHQsIEFUS19URVhUX0FUVFJfRkFNSUxZ
X05BTUUsIGdfc3RyZHVwKHN0eWxlLT5mb250KCkuZmFtaWx5KCkuZmFtaWx5KCkuc3RyaW5nKCku
dXRmOCgpLmRhdGEoKSksIGZhbHNlKTsKKworICAgIGludFByb3AgPSBzdHlsZS0+Zm9udCgpLndl
aWdodCgpOworICAgIGlmICghcGFyZW50U3R5bGUgfHwgKGludFByb3AgIT0gcGFyZW50U3R5bGUt
PmZvbnQoKS53ZWlnaHQoKSkpIHsKKyAgICAgICAgaW50IGZvbnRXZWlnaHQgPSAtMTsKKyAgICAg
ICAgc3dpdGNoIChpbnRQcm9wKSB7CisgICAgICAgIGNhc2UgRm9udFdlaWdodDEwMDoKKyAgICAg
ICAgICAgIGZvbnRXZWlnaHQgPSAxMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBGb250V2VpZ2h0MjAwOgorICAgICAgICAgICAgZm9udFdlaWdodCA9IDIwMDsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIEZvbnRXZWlnaHQzMDA6CisgICAgICAgICAgICBmb250
V2VpZ2h0ID0gMzAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRm9udFdlaWdo
dDQwMDoKKyAgICAgICAgICAgIGZvbnRXZWlnaHQgPSA0MDA7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBGb250V2VpZ2h0NTAwOgorICAgICAgICAgICAgZm9udFdlaWdodCA9IDUw
MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZvbnRXZWlnaHQ2MDA6CisgICAg
ICAgICAgICBmb250V2VpZ2h0ID0gNjAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgRm9udFdlaWdodDcwMDoKKyAgICAgICAgICAgIGZvbnRXZWlnaHQgPSA3MDA7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGb250V2VpZ2h0ODAwOgorICAgICAgICAgICAgZm9u
dFdlaWdodCA9IDgwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZvbnRXZWln
aHQ5MDA6CisgICAgICAgICAgICBmb250V2VpZ2h0ID0gOTAwOworICAgICAgICB9CisgICAgICAg
IGlmIChmb250V2VpZ2h0ID4gMCkKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShyZXN1bHQsIEFU
S19URVhUX0FUVFJfV0VJR0hULCBnX3N0cmR1cF9wcmludGYoIiVpIiwgZm9udFdlaWdodCksIGZh
bHNlKTsKKyAgICB9CisKKyAgICBpbnRQcm9wID0gc3R5bGUtPnRleHRBbGlnbigpOworICAgIGlm
ICghcGFyZW50U3R5bGUgfHwgKGludFByb3AgIT0gcGFyZW50U3R5bGUtPnRleHRBbGlnbigpKSkg
eworICAgICAgICBzd2l0Y2ggKGludFByb3ApIHsKKyAgICAgICAgY2FzZSBUQUFVVE86CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMRUZUOgorICAgICAgICBjYXNlIFdFQktJVF9M
RUZUOgorICAgICAgICAgICAgYWRkQXR0cmlidXRlKHJlc3VsdCwgQVRLX1RFWFRfQVRUUl9KVVNU
SUZJQ0FUSU9OLCAoZ2NoYXIgKikibGVmdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgUklHSFQ6CisgICAgICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAgICAgICAgICAgYWRk
QXR0cmlidXRlKHJlc3VsdCwgQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9OLCAoZ2NoYXIgKiki
cmlnaHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENFTlRFUjoKKyAgICAg
ICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAgICAgICAgICAgYWRkQXR0cmlidXRlKHJlc3VsdCwg
QVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9OLCAoZ2NoYXIgKikiY2VudGVyIik7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBKVVNUSUZZOgorICAgICAgICAgICAgYWRkQXR0cmli
dXRlKHJlc3VsdCwgQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9OLCAoZ2NoYXIgKikiZmlsbCIp
OworICAgICAgICB9CisgICAgfQorCisgICAgc3R5bGVQcm9wID0gc3R5bGUtPnRleHREZWNvcmF0
aW9uKCkgJiBVTkRFUkxJTkU7CisgICAgaWYgKCFwYXJlbnRTdHlsZSB8fCAoc3R5bGVQcm9wICE9
IChwYXJlbnRTdHlsZS0+dGV4dERlY29yYXRpb24oKSAmIFVOREVSTElORSkpKQorICAgICAgICBh
ZGRBdHRyaWJ1dGUocmVzdWx0LCBBVEtfVEVYVF9BVFRSX1VOREVSTElORSwgKHN0eWxlUHJvcCA/
IChnY2hhciopInNpbmdsZSIgOiAoZ2NoYXIqKSJub25lIikpOworICAgIHN0eWxlUHJvcCA9IHN0
eWxlLT5mb250KCkuaXRhbGljKCk7CisgICAgaWYgKCFwYXJlbnRTdHlsZSB8fCAoc3R5bGVQcm9w
ICE9IChwYXJlbnRTdHlsZS0+Zm9udCgpLml0YWxpYygpKSkpCisgICAgICAgIGFkZEF0dHJpYnV0
ZShyZXN1bHQsIEFUS19URVhUX0FUVFJfU1RZTEUsIChzdHlsZVByb3AgPyAoZ2NoYXIqKSJpdGFs
aWMiIDogKGdjaGFyKikibm9ybWFsIikpOworICAgIHN0eWxlUHJvcCA9IHN0eWxlLT50ZXh0RGVj
b3JhdGlvbigpICYgTElORV9USFJPVUdIOworICAgIGlmICghcGFyZW50U3R5bGUgfHwgKHN0eWxl
UHJvcCAhPSAocGFyZW50U3R5bGUtPnRleHREZWNvcmF0aW9uKCkgJiBMSU5FX1RIUk9VR0gpKSkK
KyAgICAgICAgYWRkQXR0cmlidXRlKHJlc3VsdCwgQVRLX1RFWFRfQVRUUl9TVFJJS0VUSFJPVUdI
LCAoc3R5bGVQcm9wID8gKGdjaGFyKikidHJ1ZSIgOiAoZ2NoYXIqKSJmYWxzZSIpKTsKKyAgICBz
dHlsZVByb3AgPSBzdHlsZS0+dmlzaWJpbGl0eSgpID09IEhJRERFTjsKKyAgICBpZiAoIXBhcmVu
dFN0eWxlIHx8IChzdHlsZVByb3AgIT0gKHBhcmVudFN0eWxlLT52aXNpYmlsaXR5KCkgPT0gSElE
REVOKSkpCisgICAgICAgIGFkZEF0dHJpYnV0ZShyZXN1bHQsIEFUS19URVhUX0FUVFJfSU5WSVNJ
QkxFLCAoc3R5bGVQcm9wID8gKGdjaGFyKikidHJ1ZSIgOiAoZ2NoYXIqKSJmYWxzZSIpKTsKKwor
ICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBnaW50IGNvbXBhcmVBdHRyaWJ1dGVOYW1l
KGNvbnN0IEF0a0F0dHJpYnV0ZSogYSwgY29uc3QgQXRrQXR0cmlidXRlKiBiKQoreworICAgIHJl
dHVybiBnX3N0cmNtcDAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKKy8qCisgICAgUmV0dXJucyB0
aGUgdW5pb24gb2YgdHdvIEF0a0F0dHJpYnV0ZVNldCwgaGF2aW5nIHRoZSBzZWNvbmQgb25lIHBy
aW9yaXR5LgorICAgIFJlbGVhc2VzIGExLCBhbmQgdGhlIEF0a0F0dHJpYnV0ZXMgbm8gbG9uZ2Vy
IHVzZWQKKyovCitzdGF0aWMgQXRrQXR0cmlidXRlU2V0KiBhdHRyaWJ1dGVTZXRVbmlvbihBdGtB
dHRyaWJ1dGVTZXQqIGExLCBBdGtBdHRyaWJ1dGVTZXQqIGEyKQoreworICAgIGlmICghYTEpCisg
ICAgICAgIHJldHVybiBhMjsKKyAgICBpZiAoIWEyKQorICAgICAgICByZXR1cm4gYTE7CisKKyAg
ICBBdGtBdHRyaWJ1dGVTZXQqIGkgPSBhMTsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIGZvdW5kOwor
CisgICAgZG8geworICAgICAgICBmb3VuZCA9IGdfc2xpc3RfZmluZF9jdXN0b20oYTIsIGktPmRh
dGEsIChHQ29tcGFyZUZ1bmMpY29tcGFyZUF0dHJpYnV0ZU5hbWUpOworICAgICAgICBpZiAoIWZv
dW5kKSB7CisgICAgICAgICAgICBBdGtBdHRyaWJ1dGVTZXQqIHQgPSBpLT5uZXh0OworICAgICAg
ICAgICAgYTIgPSBnX3NsaXN0X3ByZXBlbmQoYTIsIGktPmRhdGEpOworICAgICAgICAgICAgYTEg
PSBnX3NsaXN0X2RlbGV0ZV9saW5rKGExLCBpKTsKKyAgICAgICAgICAgIGkgPSB0OworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIGkgPSBpLT5uZXh0OworICAgIH0gd2hpbGUgKGkpOworCisg
ICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShhMSk7CisgICAgcmV0dXJuIGEyOworfQorCitzdGF0
aWMgZ3VpbnQgYWNjZXNzaWJpbGl0eU9iamVjdExlbmd0aChjb25zdCBBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KiBvYmplY3QpCit7CisgICAgaW50IHZhbHVlID0gb2JqZWN0LT5zdHJpbmdWYWx1ZSgpLmxl
bmd0aCgpOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIGlmIChv
YmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpKSB7CisgICAgICAgIGNvbnN0IFJl
bmRlck9iamVjdCogcmVuZGVyZXIgPSAoKEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QqKW9iamVj
dCktPnJlbmRlcmVyKCk7CisgICAgICAgIGlmIChyZW5kZXJlci0+aXNCUigpKQorICAgICAgICAg
ICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBvYmplY3QtPnRleHRVbmRlckVsZW1lbnQo
KS5sZW5ndGgoKTsKK30KKworLyoKKyAgICBSZXR1cm5zIGEgbGlzdCBvZiBBY2Nlc3NpYmlsaXR5
T2JqZWN0cywgc28gdGhhdCBlYWNoIG9uZSBpcyB0aGUKKyAgICBjaGlsZCBvZiB0aGUgcHJlY2Vk
aW5nIG9uZSB3aGljaCBpcyBsb2NhdGVkIGluIHRoZSBkZXNpcmVkIG9mZnNldC4KKyAgICAqc3Rh
cnRPZmZzZXQgYW5kICplbmRPZmZzZXQgd291bGQgYmUgdGhlIGJlZ2dpbmluZyBhbmQgbmV4dCBv
ZmZzZXQgb2YgdGhlCisgICAgbW9zdCBsb3dlciBBY2Nlc3NpYmlsaXR5T2JqZWN0OyBpZiBvZmZz
ZXQgZXhjZWVkcyB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QKKyAgICAqc3RhcnRPZmZzZXQgYW5k
ICplbmRPZmZzZXQgd2lsbCBiZSBzZXQgdG8gLTEuCisqLworc3RhdGljIEdTTGlzdCAqZ2V0QWNj
ZXNzaWJpbGl0eU9iamVjdHNGb3JPZmZzZXQoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCAqb2Jq
ZWN0LCBndWludCBvZmZzZXQsIGdpbnQgKnN0YXJ0X29mZnNldCwgZ2ludCAqZW5kX29mZnNldCkK
K3sKKyAgICBHU0xpc3QqIHJlc3VsdCA9IDA7CisgICAgZ3VpbnQgbGVuZ3RoID0gYWNjZXNzaWJp
bGl0eU9iamVjdExlbmd0aChvYmplY3QpOworICAgIGlmIChsZW5ndGggPiBvZmZzZXQpIHsKKyAg
ICAgICAgKnN0YXJ0X29mZnNldCA9IDA7CisgICAgICAgICplbmRfb2Zmc2V0ID0gbGVuZ3RoOwor
ICAgICAgICByZXN1bHQgPSBnX3NsaXN0X2FwcGVuZChyZXN1bHQsIChncG9pbnRlcilvYmplY3Qp
OworICAgIH0gZWxzZSB7CisgICAgICAgICpzdGFydF9vZmZzZXQgPSAtMTsKKyAgICAgICAgKmVu
ZF9vZmZzZXQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0LT5oYXNDaGlsZHJlbigpKSB7
CisgICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNoaWxkID0gb2JqZWN0LT5maXJzdENoaWxk
KCk7CisgICAgICAgIGd1aW50IGNoaWxkUG9zaXRpb24gPSAwOworICAgICAgICBndWludCBjaGls
ZExlbmd0aDsKKyAgICAgICAgd2hpbGUgKGNoaWxkKSB7CisgICAgICAgICAgICBjaGlsZExlbmd0
aCA9IGFjY2Vzc2liaWxpdHlPYmplY3RMZW5ndGgoY2hpbGQpOworICAgICAgICAgICAgaWYgKChj
aGlsZExlbmd0aCArIGNoaWxkUG9zaXRpb24pID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAg
Z2ludCBjaGlsZFN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgICAgIGdpbnQgY2hpbGRFbmRPZmZz
ZXQ7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ19zbGlzdF9jb25jYXQoZ2V0QWNjZXNzaWJp
bGl0eU9iamVjdHNGb3JPZmZzZXQoY2hpbGQsIG9mZnNldC1jaGlsZFBvc2l0aW9uLCAmY2hpbGRT
dGFydE9mZnNldCwgJmNoaWxkRW5kT2Zmc2V0KSwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBp
ZiAoY2hpbGRTdGFydE9mZnNldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGFydF9v
ZmZzZXQgPSBjaGlsZFN0YXJ0T2Zmc2V0ICsgY2hpbGRQb3NpdGlvbjsKKyAgICAgICAgICAgICAg
ICAgICAgKmVuZF9vZmZzZXQgPSBjaGlsZEVuZE9mZnNldCArIGNoaWxkUG9zaXRpb247CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgY2hpbGRQb3NpdGlvbiArPSBjaGlsZExlbmd0aDsKKyAgICAgICAgICAgIGNoaWxk
ID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJl
c3VsdDsKK30KKworc3RhdGljIEF0a0F0dHJpYnV0ZVNldCogZ2V0UnVuQXR0cmlidXRlc0Zyb21B
Y2Nlc2liaWxpdHlPYmplY3QoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogZWxlbWVudCwgZ2lu
dCBvZmZzZXQsIGdpbnQqIHN0YXJ0T2Zmc2V0LCBnaW50KiBlbmRPZmZzZXQsIFJlbmRlck9iamVj
dCogZGVmYXVsdFJlbmRlcmVyKQoreworICAgIEF0a0F0dHJpYnV0ZVNldCogcmVzdWx0ID0gMDsK
KworICAgIEdTTGlzdCogY2hpbGRzID0gZ2V0QWNjZXNzaWJpbGl0eU9iamVjdHNGb3JPZmZzZXQo
ZWxlbWVudCwgb2Zmc2V0LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKKyAgICBHU0xpc3QqIGNo
aWxkID0gY2hpbGRzOworICAgIGJvb2wgcHJldmlvdXNSZWFkT25seSA9IGVsZW1lbnQtPmlzUmVh
ZE9ubHkoKTsKKworICAgIHdoaWxlIChjaGlsZCkgeworICAgICAgICBjb25zdCBBY2Nlc3NpYmls
aXR5T2JqZWN0KiBjaGlsZE9iamVjdCA9IChjb25zdCBBY2Nlc3NpYmlsaXR5T2JqZWN0ICopY2hp
bGQtPmRhdGE7CisgICAgICAgIGJvb2wgcmVhZE9ubHkgPSBjaGlsZE9iamVjdC0+aXNSZWFkT25s
eSgpOworICAgICAgICBBdGtBdHRyaWJ1dGVTZXQqIGRpZmZlcmVudEF0dHJpYnV0ZXMgPSBnZXRB
dHRyaWJ1dGVTZXRGb3JBY2Nlc3NpYmlsaXR5T2JqZWN0KGNoaWxkT2JqZWN0LCB0cnVlKTsKKyAg
ICAgICAgaWYgKHJlYWRPbmx5ICE9IHByZXZpb3VzUmVhZE9ubHkpIHsKKyAgICAgICAgICAgIHBy
ZXZpb3VzUmVhZE9ubHkgPSByZWFkT25seTsKKyAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkaWZm
ZXJlbnRBdHRyaWJ1dGVzLCBBVEtfVEVYVF9BVFRSX0VESVRBQkxFLCByZWFkT25seSA/IChnY2hh
ciAqKSJmYWxzZSIgOiAoZ2NoYXIgKikidHJ1ZSIpOworICAgICAgICB9CisgICAgICAgIHJlc3Vs
dCA9IGF0dHJpYnV0ZVNldFVuaW9uKHJlc3VsdCwgZGlmZmVyZW50QXR0cmlidXRlcyk7CisgICAg
ICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CisgICAgfQorICAgIGdfc2xpc3RfZnJlZShjaGlsZHMp
OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEF0a0F0dHJpYnV0ZVNldCogd2Vi
a2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoQXRrVGV4dCogdGV4dCwgZ2lu
dCBvZmZzZXQsIGdpbnQqIHN0YXJ0T2Zmc2V0LCBnaW50KiBlbmRPZmZzZXQpCit7CisgICAgQWNj
ZXNzaWJpbGl0eU9iamVjdCogY29yZU9iamVjdCA9IGNvcmUodGV4dCk7CisgICAgQXRrQXR0cmli
dXRlU2V0KiByZXN1bHQ7CisgICAgaW50IHJTdGFydE9mZnNldCwgckVuZE9mZnNldDsKKworICAg
IGlmICgoIWNvcmVPYmplY3QpIHx8ICghY29yZU9iamVjdC0+aGFzQ2hpbGRyZW4oKSkpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgUmVuZGVyT2JqZWN0KiBiYXNlUmVuZGVyZXIgPSAwOworICAg
IGlmIChjb3JlT2JqZWN0LT5pc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSkKKyAgICAgICAg
YmFzZVJlbmRlcmVyID0gKChBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Kiljb3JlT2JqZWN0KS0+
cmVuZGVyZXIoKTsKKworICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgIG9mZnNldCA9IGF0
a190ZXh0X2dldF9jYXJldF9vZmZzZXQodGV4dCk7CisKKyAgICByZXN1bHQgPSBnZXRSdW5BdHRy
aWJ1dGVzRnJvbUFjY2VzaWJpbGl0eU9iamVjdChjb3JlT2JqZWN0LCBvZmZzZXQsICZyU3RhcnRP
ZmZzZXQsICZyRW5kT2Zmc2V0LCBiYXNlUmVuZGVyZXIpOworCisgICAgaWYgKHJTdGFydE9mZnNl
dCA+PSAwKSB7CisgICAgICAgICpzdGFydE9mZnNldCA9IHJTdGFydE9mZnNldDsKKyAgICAgICAg
KmVuZE9mZnNldCA9IHJFbmRPZmZzZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnN0YXJ0T2Zm
c2V0ID0gb2Zmc2V0OworICAgICAgICAqZW5kT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAg
IHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBBdGtBdHRyaWJ1dGVTZXQqIHdlYmtpdF9hY2Nl
c3NpYmxlX3RleHRfZ2V0X2RlZmF1bHRfYXR0cmlidXRlcyhBdGtUZXh0KiB0ZXh0KQogewotICAg
IG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgQWNjZXNzaWJpbGl0eU9iamVj
dCogY29yZU9iamVjdCA9IGNvcmUodGV4dCk7CisgICAgaWYgKCghY29yZU9iamVjdCkgfHwgKCFj
b3JlT2JqZWN0LT5pc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSkpCisgICAgICAgIHJldHVy
biAwOworCisgICAgQXRrQXR0cmlidXRlU2V0KiByZXN1bHQgPSAwOworCisgICAgcmVzdWx0ID0g
Z2V0QXR0cmlidXRlU2V0Rm9yQWNjZXNzaWJpbGl0eU9iamVjdChjb3JlT2JqZWN0KTsKKyAgICBh
ZGRBdHRyaWJ1dGUocmVzdWx0LCBBVEtfVEVYVF9BVFRSX0VESVRBQkxFLCBjb3JlT2JqZWN0LT5p
c1JlYWRPbmx5KCkgPyAoZ2NoYXIqKSJmYWxzZSIgOiAoZ2NoYXIqKSJ0cnVlIik7CisgICAgcmV0
dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQgd2Via2l0X2FjY2Vzc2libGVfdGV4dF9nZXRf
Y2hhcmFjdGVyX2V4dGVudHMoQXRrVGV4dCogdGV4dCwgZ2ludCBvZmZzZXQsIGdpbnQqIHgsIGdp
bnQqIHksIGdpbnQqIHdpZHRoLCBnaW50KiBoZWlnaHQsIEF0a0Nvb3JkVHlwZSBjb29yZHMpCg==
</data>
<flag name="review"
          id="28986"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49407</attachid>
            <date>2010-02-24 10:27:06 -0800</date>
            <delta_ts>2010-06-11 15:26:48 -0700</delta_ts>
            <desc>webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation</desc>
            <filename>20100224_TextAttributesNotExposed_25528_3.patch</filename>
            <type>text/plain</type>
            <size>20007</size>
            <attacher name="José Millán Soto">jmillan</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBw
ZXJBdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNz
aWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwCShyZXZpc2lvbiA1NTE5NCkKKysrIFdlYkNvcmUv
YWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMDEyLDE2ICsxMDEyLDI2MyBAQCBzdGF0aWMgZ2ludCB3ZWJraXRfYWNj
ZXNzaWJsZV90ZXh0X2dldF9jCiAgICAgcmV0dXJuIG9mZnNldDsKIH0KIAotc3RhdGljIEF0a0F0
dHJpYnV0ZVNldCogd2Via2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoQXRr
VGV4dCogdGV4dCwgZ2ludCBvZmZzZXQsIGdpbnQqIHN0YXJ0X29mZnNldCwgZ2ludCogZW5kX29m
ZnNldCkKK3N0YXRpYyBBdGtBdHRyaWJ1dGVTZXQqIGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2li
aWxpdHlPYmplY3QoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqZWN0KQogewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJl
cjsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIHJlc3VsdCA9IDA7CisgICAgUmVuZGVyU3R5bGUqIHN0
eWxlOworICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gMTY7CisgICAgZ2NoYXIgYnVmZmVyW2J1
ZmZlclNpemVdOworCisgICAgaWYgKCFvYmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJlbmRlcmVyID0gKHN0YXRpY19jYXN0PGNv
bnN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QqPihvYmplY3QpKS0+cmVuZGVyZXIoKTsKKyAg
ICBzdHlsZSA9IHJlbmRlcmVyLT5zdHlsZSgpOworCisgICAgZ19zbnByaW50ZihidWZmZXIsIGJ1
ZmZlclNpemUsICIlaSIsIHN0eWxlLT5mb250U2l6ZSgpKTsKKyAgICByZXN1bHQgPSBhZGRBdHRy
aWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9B
VFRSX1NJWkUpLCBidWZmZXIpOworCisgICAgaWYgKHN0eWxlLT5oYXNCYWNrZ3JvdW5kKCkKKyAg
ICAgICAgJiYgc3R5bGUtPmJhY2tncm91bmRDb2xvcigpLmlzVmFsaWQoKSkgeworICAgICAgICBn
X3NucHJpbnRmKGJ1ZmZlciwgYnVmZmVyU2l6ZSwgIiVpLCVpLCVpIiwgc3R5bGUtPmJhY2tncm91
bmRDb2xvcigpLnJlZCgpLCBzdHlsZS0+YmFja2dyb3VuZENvbG9yKCkuZ3JlZW4oKSwgc3R5bGUt
PmJhY2tncm91bmRDb2xvcigpLmJsdWUoKSk7CisgICAgICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0
ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJf
QkdfQ09MT1IpLCBidWZmZXIpOworICAgIH0KKyAgICBpZiAoc3R5bGUtPmNvbG9yKCkuaXNWYWxp
ZCgpKSB7CisgICAgICAgIGdfc25wcmludGYoYnVmZmVyLCBidWZmZXJTaXplLCAiJWksJWksJWki
LCBzdHlsZS0+Y29sb3IoKS5yZWQoKSwgc3R5bGUtPmNvbG9yKCkuZ3JlZW4oKSwgc3R5bGUtPmNv
bG9yKCkuYmx1ZSgpKTsKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0
LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9GR19DT0xPUiksIGJ1
ZmZlcik7CisgICAgfQorCisgICAgaW50IGJhc2VsaW5lUG9zaXRpb24gPSByZW5kZXJlci0+YmFz
ZWxpbmVQb3NpdGlvbih0cnVlKTsKKyAgICBib29sIGluY2x1ZGVSaXNlOworICAgIHN3aXRjaCAo
c3R5bGUtPnZlcnRpY2FsQWxpZ24oKSkgeworICAgIGNhc2UgU1VCOgorICAgICAgICBiYXNlbGlu
ZVBvc2l0aW9uID0gLWJhc2VsaW5lUG9zaXRpb247CisgICAgY2FzZSBTVVBFUjoKKyAgICAgICAg
aW5jbHVkZVJpc2UgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJBU0VMSU5FOgor
ICAgICAgICBpbmNsdWRlUmlzZSA9IHRydWU7CisgICAgICAgIGJhc2VsaW5lUG9zaXRpb24gPSAw
OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpbmNsdWRlUmlzZSA9IGZh
bHNlOworICAgIH0KKyAgICBpZiAoaW5jbHVkZVJpc2UpIHsKKyAgICAgICAgZ19zbnByaW50Zihi
dWZmZXIsIGJ1ZmZlclNpemUsICIlaSIsIGJhc2VsaW5lUG9zaXRpb24pOworICAgICAgICByZXN1
bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFt
ZShBVEtfVEVYVF9BVFRSX1JJU0UpLCBidWZmZXIpOworICAgIH0KKworICAgIGludCBpbmRlbnRh
dGlvbiA9IHN0eWxlLT50ZXh0SW5kZW50KCkuY2FsY1ZhbHVlKG9iamVjdC0+c2l6ZSgpLndpZHRo
KCkpOworICAgIGlmIChpbmRlbnRhdGlvbiAhPSB1bmRlZmluZWRMZW5ndGgpIHsKKyAgICAgICAg
Z19zbnByaW50ZihidWZmZXIsIGJ1ZmZlclNpemUsICIlaSIsIGluZGVudGF0aW9uKTsKKyAgICAg
ICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVf
Z2V0X25hbWUoQVRLX1RFWFRfQVRUUl9JTkRFTlQpLCBidWZmZXIpOworICAgIH0KKworICAgIFN0
cmluZyBmb250RmFtaWx5TmFtZSA9IHN0eWxlLT5mb250KCkuZmFtaWx5KCkuZmFtaWx5KCkuc3Ry
aW5nKCk7CisgICAgaWYgKGZvbnRGYW1pbHlOYW1lLmxlZnQoOCkgPT0gIi13ZWJraXQtIikKKyAg
ICAgICAgZm9udEZhbWlseU5hbWUgPSBmb250RmFtaWx5TmFtZS5zdWJzdHJpbmcoOCk7CisKKyAg
ICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9n
ZXRfbmFtZShBVEtfVEVYVF9BVFRSX0ZBTUlMWV9OQU1FKSwgZm9udEZhbWlseU5hbWUudXRmOCgp
LmRhdGEoKSk7CisKKyAgICBpbnQgZm9udFdlaWdodCA9IC0xOworICAgIHN3aXRjaCAoc3R5bGUt
PmZvbnQoKS53ZWlnaHQoKSkgeworICAgIGNhc2UgRm9udFdlaWdodDEwMDoKKyAgICAgICAgZm9u
dFdlaWdodCA9IDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0MjAwOgor
ICAgICAgICBmb250V2VpZ2h0ID0gMjAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvbnRX
ZWlnaHQzMDA6CisgICAgICAgIGZvbnRXZWlnaHQgPSAzMDA7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgRm9udFdlaWdodDQwMDoKKyAgICAgICAgZm9udFdlaWdodCA9IDQwMDsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0NTAwOgorICAgICAgICBmb250V2VpZ2h0ID0gNTAw
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvbnRXZWlnaHQ2MDA6CisgICAgICAgIGZvbnRX
ZWlnaHQgPSA2MDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9udFdlaWdodDcwMDoKKyAg
ICAgICAgZm9udFdlaWdodCA9IDcwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250V2Vp
Z2h0ODAwOgorICAgICAgICBmb250V2VpZ2h0ID0gODAwOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIEZvbnRXZWlnaHQ5MDA6CisgICAgICAgIGZvbnRXZWlnaHQgPSA5MDA7CisgICAgfQorICAg
IGlmIChmb250V2VpZ2h0ID4gMCkgeworICAgICAgICBnX3NucHJpbnRmKGJ1ZmZlciwgYnVmZmVy
U2l6ZSwgIiVpIiwgZm9udFdlaWdodCk7CisgICAgICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRv
U2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfV0VJ
R0hUKSwgYnVmZmVyKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0eWxlLT50ZXh0QWxpZ24oKSkg
eworICAgIGNhc2UgVEFBVVRPOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIExFRlQ6CisgICAg
Y2FzZSBXRUJLSVRfTEVGVDoKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVz
dWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FU
SU9OKSwgImxlZnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSSUdIVDoKKyAgICBjYXNl
IFdFQktJVF9SSUdIVDoKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0
LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9O
KSwgInJpZ2h0Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0VOVEVSOgorICAgIGNhc2Ug
V0VCS0lUX0NFTlRFUjoKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0
LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9O
KSwgImNlbnRlciIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpVU1RJRlk6CisgICAgICAg
IHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dl
dF9uYW1lKEFUS19URVhUX0FUVFJfSlVTVElGSUNBVElPTiksICJmaWxsIik7CisgICAgfQorCisg
ICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVf
Z2V0X25hbWUoQVRLX1RFWFRfQVRUUl9VTkRFUkxJTkUpLCAoKHN0eWxlLT50ZXh0RGVjb3JhdGlv
bigpICYgVU5ERVJMSU5FKSA/ICJzaW5nbGUiIDogIm5vbmUiKSk7CisKKyAgICByZXN1bHQgPSBh
ZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtf
VEVYVF9BVFRSX1NUWUxFKSwgKHN0eWxlLT5mb250KCkuaXRhbGljKCkgPyAiaXRhbGljIiA6ICJu
b3JtYWwiKSk7CisKKyAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190
ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX1NUUklLRVRIUk9VR0gpLCAoKHN0
eWxlLT50ZXh0RGVjb3JhdGlvbigpICYgTElORV9USFJPVUdIKSA/ICJ0cnVlIiA6ICJmYWxzZSIp
KTsKKworICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0
cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfSU5WSVNJQkxFKSwgKChzdHlsZS0+dmlzaWJp
bGl0eSgpID09IEhJRERFTikgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CisKKyAgICByZXN1bHQgPSBh
ZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtf
VEVYVF9BVFRSX0VESVRBQkxFKSwgb2JqZWN0LT5pc1JlYWRPbmx5KCkgPyAiZmFsc2UiIDogInRy
dWUiKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBnaW50IGNvbXBhcmVBdHRy
aWJ1dGUoY29uc3QgQXRrQXR0cmlidXRlKiBhLCBjb25zdCBBdGtBdHRyaWJ1dGUqIGIpCit7Cisg
ICAgcmV0dXJuIChnX3N0cmNtcDAoYS0+bmFtZSwgYi0+bmFtZSkgfHwgZ19zdHJjbXAwKGEtPnZh
bHVlLCBiLT52YWx1ZSkpOworfQorCisvLyAgUmV0dXJucyBhbiBBdGtBdHRyaWJ1dGVTZXQgd2l0
aCB0aGUgZWxlbWVudHMgb2YgYTEgd2hpY2ggYXJlIGVpdGhlciBub3QgcHJlc2VudCBvciBkaWZm
ZXJlbnQgaW4gYTIuCisvLyAgTmVpdGhlciBhMSBub3IgYTIgc2hvdWxkIGJlIHVzZWQgYWZ0ZXIg
Y2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorc3RhdGljIEF0a0F0dHJpYnV0ZVNldCogYXR0cmlidXRl
U2V0RGlmZmVyZW5jZShBdGtBdHRyaWJ1dGVTZXQqIGExLCBBdGtBdHRyaWJ1dGVTZXQqIGEyKQor
eworICAgIGlmICghYTIpCisgICAgICAgIHJldHVybiBhMTsKKworICAgIEF0a0F0dHJpYnV0ZVNl
dCogaSA9IGExOworICAgIEF0a0F0dHJpYnV0ZVNldCogZm91bmQ7CisgICAgQXRrQXR0cmlidXRl
U2V0KiB0b0RlbGV0ZSA9IDA7CisKKyAgICB3aGlsZSAoaSkgeworICAgICAgICBmb3VuZCA9IGdf
c2xpc3RfZmluZF9jdXN0b20oYTIsIGktPmRhdGEsIChHQ29tcGFyZUZ1bmMpY29tcGFyZUF0dHJp
YnV0ZSk7CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgQXRrQXR0cmlidXRlU2V0
KiB0ID0gaS0+bmV4dDsKKyAgICAgICAgICAgIHRvRGVsZXRlID0gZ19zbGlzdF9wcmVwZW5kKHRv
RGVsZXRlLCBpLT5kYXRhKTsKKyAgICAgICAgICAgIGExID0gZ19zbGlzdF9kZWxldGVfbGluayhh
MSwgaSk7CisgICAgICAgICAgICBpID0gdDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBp
ID0gaS0+bmV4dDsKKyAgICB9CisKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKGEyKTsKKyAg
ICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHRvRGVsZXRlKTsKKyAgICByZXR1cm4gYTE7Cit9CisK
K3N0YXRpYyBndWludCBhY2Nlc3NpYmlsaXR5T2JqZWN0TGVuZ3RoKGNvbnN0IEFjY2Vzc2liaWxp
dHlPYmplY3QqIG9iamVjdCkKK3sKKyAgICBpbnQgdmFsdWUgPSBvYmplY3QtPnN0cmluZ1ZhbHVl
KCkubGVuZ3RoKCk7CisgICAgaWYgKHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAg
aWYgKG9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0KCkpIHsKKyAgICAgICAgY29u
c3QgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IChzdGF0aWNfY2FzdDxjb25zdCBBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0Kj4ob2JqZWN0KSktPnJlbmRlcmVyKCk7CisgICAgICAgIGlmIChyZW5k
ZXJlci0+aXNCUigpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBv
YmplY3QtPnRleHRVbmRlckVsZW1lbnQoKS5sZW5ndGgoKTsKK30KKworc3RhdGljIGNvbnN0IEFj
Y2Vzc2liaWxpdHlPYmplY3QqIGdldEFjY2Vzc2liaWxpdHlPYmplY3RGb3JPZmZzZXQoY29uc3Qg
QWNjZXNzaWJpbGl0eU9iamVjdCogb2JqZWN0LCBndWludCBvZmZzZXQsIGdpbnQqIHN0YXJ0T2Zm
c2V0LCBnaW50KiBlbmRPZmZzZXQpCit7CisgICAgY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCog
cmVzdWx0OworICAgIGd1aW50IGxlbmd0aCA9IGFjY2Vzc2liaWxpdHlPYmplY3RMZW5ndGgob2Jq
ZWN0KTsKKyAgICBpZiAobGVuZ3RoID4gb2Zmc2V0KSB7CisgICAgICAgICpzdGFydE9mZnNldCA9
IDA7CisgICAgICAgICplbmRPZmZzZXQgPSBsZW5ndGg7CisgICAgICAgIHJlc3VsdCA9IG9iamVj
dDsKKyAgICB9IGVsc2UgeworICAgICAgICAqc3RhcnRPZmZzZXQgPSAtMTsKKyAgICAgICAgKmVu
ZE9mZnNldCA9IC0xOworICAgICAgICByZXN1bHQgPSAwOworICAgIH0KKworICAgIGlmIChvYmpl
Y3QtPmZpcnN0Q2hpbGQoKSkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjaGlsZCA9
IG9iamVjdC0+Zmlyc3RDaGlsZCgpOworICAgICAgICBndWludCBjaGlsZFBvc2l0aW9uID0gMDsK
KyAgICAgICAgZ3VpbnQgY2hpbGRMZW5ndGg7CisgICAgICAgIHdoaWxlIChjaGlsZCkgeworICAg
ICAgICAgICAgY2hpbGRMZW5ndGggPSBhY2Nlc3NpYmlsaXR5T2JqZWN0TGVuZ3RoKGNoaWxkKTsK
KyAgICAgICAgICAgIGlmICgoY2hpbGRMZW5ndGggKyBjaGlsZFBvc2l0aW9uKSA+IG9mZnNldCkg
eworICAgICAgICAgICAgICAgIGdpbnQgY2hpbGRTdGFydE9mZnNldDsKKyAgICAgICAgICAgICAg
ICBnaW50IGNoaWxkRW5kT2Zmc2V0OworICAgICAgICAgICAgICAgIGNvbnN0IEFjY2Vzc2liaWxp
dHlPYmplY3QqIGdyYW5kQ2hpbGQgPSBnZXRBY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yT2Zmc2V0KGNo
aWxkLCBvZmZzZXQtY2hpbGRQb3NpdGlvbiwgICZjaGlsZFN0YXJ0T2Zmc2V0LCAmY2hpbGRFbmRP
ZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZFN0YXJ0T2Zmc2V0ID49IDApIHsKKyAg
ICAgICAgICAgICAgICAgICAgKnN0YXJ0T2Zmc2V0ID0gY2hpbGRTdGFydE9mZnNldCArIGNoaWxk
UG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICplbmRPZmZzZXQgPSBjaGlsZEVuZE9mZnNl
dCArIGNoaWxkUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdyYW5kQ2hp
bGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgY2hpbGRQb3NpdGlvbiArPSBjaGlsZExlbmd0aDsKKyAgICAgICAg
ICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEF0a0F0dHJpYnV0ZVNldCogZ2V0UnVuQXR0cmli
dXRlc0Zyb21BY2Nlc2liaWxpdHlPYmplY3QoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogZWxl
bWVudCwgZ2ludCBvZmZzZXQsIGdpbnQqIHN0YXJ0T2Zmc2V0LCBnaW50KiBlbmRPZmZzZXQpCit7
CisgICAgY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCAqY2hpbGQgPSBnZXRBY2Nlc3NpYmlsaXR5
T2JqZWN0Rm9yT2Zmc2V0KGVsZW1lbnQsIG9mZnNldCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7
CisgICAgaWYgKCFjaGlsZCkgeworICAgICAgICAqc3RhcnRPZmZzZXQgPSAtMTsKKyAgICAgICAg
KmVuZE9mZnNldCA9IC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBBdGtBdHRy
aWJ1dGVTZXQqIGRlZmF1bHRBdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlU2V0Rm9yQWNjZXNzaWJp
bGl0eU9iamVjdChlbGVtZW50KTsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIGNoaWxkQXR0cmlidXRl
cyA9IGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2liaWxpdHlPYmplY3QoY2hpbGQpOworCisgICAg
cmV0dXJuIGF0dHJpYnV0ZVNldERpZmZlcmVuY2UoY2hpbGRBdHRyaWJ1dGVzLCBkZWZhdWx0QXR0
cmlidXRlcyk7Cit9CisKK3N0YXRpYyBBdGtBdHRyaWJ1dGVTZXQqIHdlYmtpdF9hY2Nlc3NpYmxl
X3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKEF0a1RleHQqIHRleHQsIGdpbnQgb2Zmc2V0LCBnaW50
KiBzdGFydE9mZnNldCwgZ2ludCogZW5kT2Zmc2V0KQoreworICAgIEFjY2Vzc2liaWxpdHlPYmpl
Y3QqIGNvcmVPYmplY3QgPSBjb3JlKHRleHQpOworICAgIEF0a0F0dHJpYnV0ZVNldCogcmVzdWx0
OworCisgICAgaWYgKCFjb3JlT2JqZWN0KSB7CisgICAgICAgICpzdGFydE9mZnNldCA9IDA7Cisg
ICAgICAgICplbmRPZmZzZXQgPSBhdGtfdGV4dF9nZXRfY2hhcmFjdGVyX2NvdW50KHRleHQpOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAg
ICBvZmZzZXQgPSBhdGtfdGV4dF9nZXRfY2FyZXRfb2Zmc2V0KHRleHQpOworCisgICAgcmVzdWx0
ID0gZ2V0UnVuQXR0cmlidXRlc0Zyb21BY2Nlc2liaWxpdHlPYmplY3QoY29yZU9iamVjdCwgb2Zm
c2V0LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKKworICAgIGlmICgqc3RhcnRPZmZzZXQgPCAw
KSB7CisgICAgICAgICpzdGFydE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgKmVuZE9mZnNldCA9
IG9mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgQXRrQXR0
cmlidXRlU2V0KiB3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0ZXMo
QXRrVGV4dCogdGV4dCkKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwor
ICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKHRleHQpOworICAgIGlm
ICghY29yZU9iamVjdCB8fCAhY29yZU9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgQXRrQXR0cmlidXRlU2V0KiByZXN1bHQgPSAw
OworCisgICAgcmVzdWx0ID0gZ2V0QXR0cmlidXRlU2V0Rm9yQWNjZXNzaWJpbGl0eU9iamVjdChj
b3JlT2JqZWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRf
YWNjZXNzaWJsZV90ZXh0X2dldF9jaGFyYWN0ZXJfZXh0ZW50cyhBdGtUZXh0KiB0ZXh0LCBnaW50
IG9mZnNldCwgZ2ludCogeCwgZ2ludCogeSwgZ2ludCogd2lkdGgsIGdpbnQqIGhlaWdodCwgQXRr
Q29vcmRUeXBlIGNvb3JkcykKSW5kZXg6IFdlYktpdC9ndGsvQ2hhbmdlTG9nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdC9ndGsvQ2hhbmdlTG9nCShyZXZpc2lvbiA1NTE5NCkKKysrIFdlYktpdC9ndGsv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDItMjQgIEpv
c8OpIE1pbGzDoW4gU290byAgPGptaWxsYW5AaWdhbGlhLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbR3RrXSBUZXh0IGF0dHJpYnV0ZXMgbm90
IGV4cG9zZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI1NTI4CisKKyAgICAgICAgQWRkZWQgbmV3IHRlc3RzIGZvciBhY2Nlc3NpYmxlIHRleHQgYXR0
cmlidXRlcworCisgICAgICAgICogdGVzdHMvdGVzdGF0ay5jOgorICAgICAgICAodGVzdFdlYmtp
dEF0a0dldFRleHRJblBhcmFncmFwaEFuZEJvZHlNb2RlcmF0ZSk6CisgICAgICAgIChjb21wQXRr
QXR0cmlidXRlKToKKyAgICAgICAgKGNvbXBBdGtBdHRyaWJ1dGVOYW1lKToKKyAgICAgICAgKGF0
a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKToKKyAgICAgICAgKGF0a0F0dHJpYnV0ZVNl
dEFyZUVxdWFsKToKKyAgICAgICAgKHRlc3RXZWJraXRBdGtUZXh0QXR0cmlidXRlcyk6CisgICAg
ICAgIChtYWluKToKKwogMjAxMC0wMi0yMyAgTGVhbmRybyBQZXJlaXJhICA8bGVhbmRyb0Bwcm9m
dXNpb24ubW9iaT4KIAogICAgICAgICBSZXZpZXdlZCBieSBHdXN0YXZvIE5vcm9uaGEgU2lsdmEu
CkluZGV4OiBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
Z3RrL3Rlc3RzL3Rlc3RhdGsuYwkocmV2aXNpb24gNTUxOTQpCisrKyBXZWJLaXQvZ3RrL3Rlc3Rz
L3Rlc3RhdGsuYwkod29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsOCBAQCBzdGF0aWMgY29uc3Qg
Y2hhciogY29udGVudHNJblBhcmFncmFwaEFuCiAKIHN0YXRpYyBjb25zdCBjaGFyKiBjb250ZW50
c0luUGFyYWdyYXBoQW5kQm9keU1vZGVyYXRlID0gIjxodG1sPjxib2R5PjxwPlRoaXMgaXMgYSB0
ZXN0LjwvcD5IZWxsbyB3b3JsZC48YnIgLz48Zm9udCBjb2xvcj0nIzAwY2MwMCc+VGhpcyBzZW50
ZW5jZSBpcyBncmVlbi48L2ZvbnQ+PGJyIC8+VGhpcyBvbmUgaXMgbm90LjwvYm9keT48L2h0bWw+
IjsKIAorc3RhdGljIGNvbnN0IGNoYXIqIHRleHRXaXRoQXR0cmlidXRlcyA9ICI8aHRtbD48aGVh
ZD48c3R5bGU+LnN0MSB7Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6cmdiKDEyMCwxMjEs
MTIyKTt9IC5zdDIge3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IGJhY2tncm91bmQtY29sb3I6
cmdiKDgwLDgxLDgyKTt9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PHAgc3R5bGU9XCJmb250LXNpemU6
MTQ7IHRleHQtYWxpZ246cmlnaHQ7XCI+VGhpcyBpcyB0aGUgPGk+Zmlyc3Q8L2k+PGI+IHNlbnRl
bmNlIG9mIHRoaXMgdGV4dC48L2I+PC9wPjxwIGNsYXNzPVwic3QxXCI+VGhpcyBzZW50ZW5jZSBz
aG91bGQgaGF2ZSBhbiBzdHlsZSBhcHBsaWVkIDxzcGFuIGNsYXNzPVwic3QyXCI+YW5kIHRoaXMg
cGFydCBzaG91bGQgaGF2ZSBhbm90aGVyIG9uZTwvc3Bhbj4uPC9wPjxwPng8c3ViPjE8L3N1Yj48
c3VwPjI8L3N1cD49eDxzdWI+Mjwvc3ViPjxzdXA+Mzwvc3VwPjwvcD48cCBzdHlsZT1cInRleHQt
YWxpZ246Y2VudGVyO1wiPlRoaXMgc2VudGVuY2UgaXMgdGhlIDxzdHJpa2U+bGFzdDwvc3RyaWtl
PiBvbmUuPC9wPjwvYm9keT48L2h0bWw+IjsKKwogc3RhdGljIGdib29sZWFuIGJhaWxfb3V0KEdN
YWluTG9vcCogbG9vcCkKIHsKICAgICBpZiAoZ19tYWluX2xvb3BfaXNfcnVubmluZyhsb29wKSkK
QEAgLTQwOSw2ICs0MTEsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0V2Via2l0QXRrR2V0VGV4dEluUGFy
YWdyCiBzdGF0aWMgdm9pZCB0ZXN0V2Via2l0QXRrR2V0VGV4dEluUGFyYWdyYXBoQW5kQm9keU1v
ZGVyYXRlKHZvaWQpCiB7CiAgICAgV2ViS2l0V2ViVmlldyogd2ViVmlldzsKKyAgICBXZWJLaXRX
ZWJGcmFtZSogd2ViRnJhbWU7CiAgICAgQXRrT2JqZWN0KiBvYmo7CiAgICAgQXRrT2JqZWN0KiBv
YmoxOwogICAgIEF0a09iamVjdCogb2JqMjsKQEAgLTQxOCw2ICs0MjEsNyBAQCBzdGF0aWMgdm9p
ZCB0ZXN0V2Via2l0QXRrR2V0VGV4dEluUGFyYWdyCiAKICAgICB3ZWJWaWV3ID0gV0VCS0lUX1dF
Ql9WSUVXKHdlYmtpdF93ZWJfdmlld19uZXcoKSk7CiAgICAgZ19vYmplY3RfcmVmX3Npbmsod2Vi
Vmlldyk7CisgICAgd2ViRnJhbWUgPSB3ZWJraXRfd2ViX3ZpZXdfZ2V0X21haW5fZnJhbWUod2Vi
Vmlldyk7CiAgICAgR3RrQWxsb2NhdGlvbiBhbGxvYyA9IHsgMCwgMCwgODAwLCA2MDAgfTsKICAg
ICBndGtfd2lkZ2V0X3NpemVfYWxsb2NhdGUoR1RLX1dJREdFVCh3ZWJWaWV3KSwgJmFsbG9jKTsK
ICAgICB3ZWJraXRfd2ViX3ZpZXdfbG9hZF9zdHJpbmcod2ViVmlldywgY29udGVudHNJblBhcmFn
cmFwaEFuZEJvZHlNb2RlcmF0ZSwgTlVMTCwgTlVMTCwgTlVMTCk7CkBAIC00NTAsNiArNDU0LDE1
OSBAQCBzdGF0aWMgdm9pZCB0ZXN0V2Via2l0QXRrR2V0VGV4dEluUGFyYWdyCiAgICAgZ19vYmpl
Y3RfdW5yZWYod2ViVmlldyk7CiB9CiAKK3N0YXRpYyBnaW50IGNvbXBBdGtBdHRyaWJ1dGUoQXRr
QXR0cmlidXRlICphMSwgQXRrQXR0cmlidXRlICphMikKK3sKKyAgICBnaW50IHN0cmNtcFZhbDsK
KyAgICBzdHJjbXBWYWwgPSBnX3N0cmNtcDAoYTEtPm5hbWUsIGEyLT5uYW1lKTsKKyAgICBpZiAo
c3RyY21wVmFsKQorICAgICAgICByZXR1cm4gc3RyY21wVmFsOworCisgICAgcmV0dXJuIGdfc3Ry
Y21wMChhMS0+dmFsdWUsIGEyLT52YWx1ZSk7Cit9CisKK3N0YXRpYyBnaW50IGNvbXBBdGtBdHRy
aWJ1dGVOYW1lKEF0a0F0dHJpYnV0ZSAqYTEsIEF0a0F0dHJpYnV0ZSAqYTIpCit7CisgICAgcmV0
dXJuIGdfc3RyY21wMChhMS0+bmFtZSwgYTItPm5hbWUpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4g
YXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoQXRrQXR0cmlidXRlU2V0ICpzZXQsIEF0
a1RleHRBdHRyaWJ1dGUgYXR0cmlidXRlLCBjb25zdCBnY2hhciAqdmFsdWUpCit7CisgICAgR1NM
aXN0ICplbGVtZW50OworICAgIEF0a0F0dHJpYnV0ZSBhdDsKKyAgICBnYm9vbGVhbiByZXN1bHQ7
CisgICAgYXQubmFtZSA9IChnY2hhciAqKWF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShhdHRy
aWJ1dGUpOworICAgIGVsZW1lbnQgPSBnX3NsaXN0X2ZpbmRfY3VzdG9tKHNldCwgJmF0LCAoR0Nv
bXBhcmVGdW5jKWNvbXBBdGtBdHRyaWJ1dGVOYW1lKTsKKyAgICByZXN1bHQgPSAoZWxlbWVudCAm
JiAhZ19zdHJjbXAwKCgoQXRrQXR0cmlidXRlKikoZWxlbWVudC0+ZGF0YSkpLT52YWx1ZSwgdmFs
dWUpKTsKKyAgICBpZiAoIXJlc3VsdCAmJiBlbGVtZW50KQorICAgICAgICBwcmludGYoIkV4cGVj
dGVkICVzIGdvdCAlc1xuIiwgdmFsdWUsICgoQXRrQXR0cmlidXRlKikoZWxlbWVudC0+ZGF0YSkp
LT52YWx1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuIGF0a0F0
dHJpYnV0ZVNldEFyZUVxdWFsKEF0a0F0dHJpYnV0ZVNldCAqc2V0MSwgQXRrQXR0cmlidXRlU2V0
ICpzZXQyKQoreworICAgIGlmICghc2V0MSkKKyAgICAgICAgcmV0dXJuICFzZXQyOworCisgICAg
c2V0MSA9IGdfc2xpc3Rfc29ydChzZXQxLCAoR0NvbXBhcmVGdW5jKWNvbXBBdGtBdHRyaWJ1dGUp
OworICAgIHNldDIgPSBnX3NsaXN0X3NvcnQoc2V0MiwgKEdDb21wYXJlRnVuYyljb21wQXRrQXR0
cmlidXRlKTsKKworICAgIHdoaWxlIChzZXQxKSB7CisgICAgICAgIGlmICghc2V0MiB8fCBjb21w
QXRrQXR0cmlidXRlKHNldDEtPmRhdGEsIHNldDItPmRhdGEpKQorICAgICAgICAgICAgcmV0dXJu
IEZBTFNFOworCisgICAgICAgIHNldDEgPSBzZXQxLT5uZXh0OworICAgICAgICBzZXQyID0gc2V0
Mi0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gKCFzZXQyKTsKK30KKworc3RhdGljIHZvaWQg
dGVzdFdlYmtpdEF0a1RleHRBdHRyaWJ1dGVzKHZvaWQpCit7CisgICAgV2ViS2l0V2ViVmlldyog
d2ViVmlldzsKKyAgICBBdGtPYmplY3QqIG9iajsKKyAgICBBdGtPYmplY3QqIGNoaWxkOworICAg
IEdNYWluTG9vcCogbG9vcDsKKyAgICBBdGtUZXh0KiBjaGlsZFRleHQ7CisgICAgQXRrQXR0cmli
dXRlU2V0ICpzZXQxLCAqc2V0MiwgKnNldDMsICpzZXQ0OworICAgIGdpbnQgc3RhcnRPZmZzZXQs
IGVuZE9mZnNldCwgbGVuZ3RoOworCisgICAgd2ViVmlldyA9IFdFQktJVF9XRUJfVklFVyh3ZWJr
aXRfd2ViX3ZpZXdfbmV3KCkpOworICAgIGdfb2JqZWN0X3JlZl9zaW5rKHdlYlZpZXcpOworICAg
IEd0a0FsbG9jYXRpb24gYWxsb2MgPSB7IDAsIDAsIDgwMCwgNjAwIH07CisgICAgZ3RrX3dpZGdl
dF9zaXplX2FsbG9jYXRlKEdUS19XSURHRVQod2ViVmlldyksICZhbGxvYyk7CisKKyAgICB3ZWJr
aXRfd2ViX3ZpZXdfbG9hZF9zdHJpbmcod2ViVmlldywgdGV4dFdpdGhBdHRyaWJ1dGVzLCBOVUxM
LCBOVUxMLCBOVUxMKTsKKyAgICBsb29wID0gZ19tYWluX2xvb3BfbmV3KE5VTEwsIFRSVUUpOwor
CisgICAgZ190aW1lb3V0X2FkZCgxMDAsIChHU291cmNlRnVuYyliYWlsX291dCwgbG9vcCk7Cisg
ICAgZ19tYWluX2xvb3BfcnVuKGxvb3ApOworCisgICAgb2JqID0gZ3RrX3dpZGdldF9nZXRfYWNj
ZXNzaWJsZShHVEtfV0lER0VUKHdlYlZpZXcpKTsKKyAgICBnX2Fzc2VydChvYmopOworCisgICAg
Y2hpbGQgPSBhdGtfb2JqZWN0X3JlZl9hY2Nlc3NpYmxlX2NoaWxkKG9iaiwgMCk7CisgICAgZ19h
c3NlcnQoY2hpbGQgJiYgQVRLX0lTX1RFWFQoY2hpbGQpKTsKKyAgICBjaGlsZFRleHQgPSBBVEtf
VEVYVChjaGlsZCk7CisgICAgc2V0MSA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGls
ZFRleHQsIDAsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgZ19hc3NlcnRfY21waW50
KHN0YXJ0T2Zmc2V0LCA9PSwgMCk7CisgICAgZ19hc3NlcnRfY21waW50KGVuZE9mZnNldCwgPT0s
IDEyKTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQxLCBOVUxMKSk7
CisgICAgc2V0MSA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDE1LCAm
c3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAgIGdfYXNzZXJ0X2NtcGludChzdGFydE9mZnNl
dCwgPT0sIDEyKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoZW5kT2Zmc2V0LCA9PSwgMTcpOworICAg
IGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhU
X0FUVFJfU1RZTEUsICJpdGFsaWMiKSk7CisgICAgc2V0MiA9IGF0a190ZXh0X2dldF9ydW5fYXR0
cmlidXRlcyhjaGlsZFRleHQsIDE3LCAmc3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAgIGdf
YXNzZXJ0X2NtcGludChzdGFydE9mZnNldCwgPT0sIDE3KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQo
ZW5kT2Zmc2V0LCA9PSwgNDApOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0
ZUhhc1ZhbHVlKHNldDIsIEFUS19URVhUX0FUVFJfV0VJR0hULCAiNzAwIikpOworICAgIHNldDMg
PSBhdGtfdGV4dF9nZXRfZGVmYXVsdF9hdHRyaWJ1dGVzKGNoaWxkVGV4dCk7CisgICAgZ19hc3Nl
cnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0MywgQVRLX1RFWFRfQVRUUl9T
VFlMRSwgIm5vcm1hbCIpKTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVI
YXNWYWx1ZShzZXQzLCBBVEtfVEVYVF9BVFRSX0pVU1RJRklDQVRJT04sICJyaWdodCIpKTsKKyAg
ICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQzLCBBVEtfVEVY
VF9BVFRSX1NJWkUsICIxNCIpKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDEpOwor
ICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Mik7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRf
ZnJlZShzZXQzKTsKKworICAgIGNoaWxkID0gYXRrX29iamVjdF9yZWZfYWNjZXNzaWJsZV9jaGls
ZChvYmosIDEpOworICAgIGdfYXNzZXJ0KGNoaWxkICYmIEFUS19JU19URVhUKGNoaWxkKSk7Cisg
ICAgY2hpbGRUZXh0ID0gQVRLX1RFWFQoY2hpbGQpOworICAgIHNldDEgPSBhdGtfdGV4dF9nZXRf
ZGVmYXVsdF9hdHRyaWJ1dGVzKGNoaWxkVGV4dCk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRl
U2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0MSwgQVRLX1RFWFRfQVRUUl9GQU1JTFlfTkFNRSwgIm1v
bm9zcGFjZSIpKTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1
ZShzZXQxLCBBVEtfVEVYVF9BVFRSX1NUWUxFLCAibm9ybWFsIikpOworICAgIGdfYXNzZXJ0KGF0
a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJfU1RSSUtF
VEhST1VHSCwgImZhbHNlIikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0
ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJfV0VJR0hULCAiNDAwIikpOworICAgIGdfYXNz
ZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJf
RkdfQ09MT1IsICIxMjAsMTIxLDEyMiIpKTsKKyAgICBzZXQyID0gYXRrX3RleHRfZ2V0X3J1bl9h
dHRyaWJ1dGVzKGNoaWxkVGV4dCwgNDMsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAg
Z19hc3NlcnRfY21waW50KHN0YXJ0T2Zmc2V0LCA9PSwgNDMpOworICAgIGdfYXNzZXJ0X2NtcGlu
dChlbmRPZmZzZXQsID09LCA4MCk7CisgICAgLy8gQ2hlY2tzIHRoYXQgZGVmYXVsdCBhdHRyaWJ1
dGVzIG9mIHRleHQgYXJlIG5vdCByZXR1cm5lZCB3aGVuIGNhbGxlZCB0byBhdGtfdGV4dF9nZXRf
cnVuX2F0dHJpYnV0ZXMKKyAgICBnX2Fzc2VydCghYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFz
VmFsdWUoc2V0MiwgQVRLX1RFWFRfQVRUUl9GR19DT0xPUiwgIjEyMCwxMjEsMTIyIikpOworICAg
IGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDIsIEFUS19URVhU
X0FUVFJfVU5ERVJMSU5FLCAic2luZ2xlIikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNl
dEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDIsIEFUS19URVhUX0FUVFJfQkdfQ09MT1IsICI4MCw4MSw4
MiIpKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDEpOworICAgIGF0a19hdHRyaWJ1
dGVfc2V0X2ZyZWUoc2V0Mik7CisKKyAgICBjaGlsZCA9IGF0a19vYmplY3RfcmVmX2FjY2Vzc2li
bGVfY2hpbGQob2JqLCAyKTsKKyAgICBnX2Fzc2VydChjaGlsZCAmJiBBVEtfSVNfVEVYVChjaGls
ZCkpOworICAgIGNoaWxkVGV4dCA9IEFUS19URVhUKGNoaWxkKTsKKyAgICBzZXQxID0gYXRrX3Rl
eHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMCwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zm
c2V0KTsKKyAgICBzZXQyID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwg
MywgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVT
ZXRBcmVFcXVhbChzZXQxLCBzZXQyKSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQy
KTsKKyAgICBzZXQyID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMSwg
JnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBzZXQzID0gYXRrX3RleHRfZ2V0X3J1bl9h
dHRyaWJ1dGVzKGNoaWxkVGV4dCwgNSwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBn
X2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQyLCBzZXQzKSk7CisgICAgZ19hc3Nl
cnQoIWF0a0F0dHJpYnV0ZVNldEFyZUVxdWFsKHNldDEsIHNldDIpKTsKKyAgICBhdGtfYXR0cmli
dXRlX3NldF9mcmVlKHNldDMpOworICAgIHNldDMgPSBhdGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0
ZXMoY2hpbGRUZXh0LCAyLCAmc3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAgIHNldDQgPSBh
dGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCA2LCAmc3RhcnRPZmZzZXQsICZl
bmRPZmZzZXQpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEFyZUVxdWFsKHNldDMsIHNl
dDQpKTsKKyAgICBnX2Fzc2VydCghYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwoc2V0MSwgc2V0Mykp
OworICAgIGdfYXNzZXJ0KCFhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQyLCBzZXQzKSk7Cisg
ICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQxKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9m
cmVlKHNldDIpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Myk7CisgICAgYXRrX2F0
dHJpYnV0ZV9zZXRfZnJlZShzZXQ0KTsKKworICAgIGNoaWxkID0gYXRrX29iamVjdF9yZWZfYWNj
ZXNzaWJsZV9jaGlsZChvYmosIDMpOworICAgIGdfYXNzZXJ0KGNoaWxkICYmIEFUS19JU19URVhU
KGNoaWxkKSk7CisgICAgY2hpbGRUZXh0ID0gQVRLX1RFWFQoY2hpbGQpOworICAgIHNldDEgPSBh
dGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCAyNCwgJnN0YXJ0T2Zmc2V0LCAm
ZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRPZmZzZXQsID09LCAyMSk7Cisg
ICAgZ19hc3NlcnRfY21waW50KGVuZE9mZnNldCwgPT0sIDI1KTsKKyAgICBnX2Fzc2VydChhdGtB
dHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQxLCBBVEtfVEVYVF9BVFRSX1NUUklLRVRI
Uk9VR0gsICJ0cnVlIikpOworICAgIHNldDIgPSBhdGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMo
Y2hpbGRUZXh0LCAyNSwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9j
bXBpbnQoc3RhcnRPZmZzZXQsID09LCAyNSk7CisgICAgZ19hc3NlcnRfY21waW50KGVuZE9mZnNl
dCwgPT0sIDMwKTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQyLCBO
VUxMKSk7CisgICAgc2V0MyA9IGF0a190ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0ZXMoY2hpbGRU
ZXh0KTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQz
LCBBVEtfVEVYVF9BVFRSX0pVU1RJRklDQVRJT04sICJjZW50ZXIiKSk7CisgICAgYXRrX2F0dHJp
YnV0ZV9zZXRfZnJlZShzZXQxKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDIpOwor
ICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Myk7Cit9CisKIGludCBtYWluKGludCBhcmdj
LCBjaGFyKiogYXJndikKIHsKICAgICBnX3RocmVhZF9pbml0KE5VTEwpOwpAQCAtNDYzLDYgKzYy
MCw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKICAgICBnX3Rlc3RfYWRkX2Z1
bmMoIi93ZWJraXQvYXRrL2dldF90ZXh0X2F0X29mZnNldF90ZXh0X2lucHV0IiwgdGVzdF93ZWJr
aXRfYXRrX2dldF90ZXh0X2F0X29mZnNldF90ZXh0X2lucHV0KTsKICAgICBnX3Rlc3RfYWRkX2Z1
bmMoIi93ZWJraXQvYXRrL2dldFRleHRJblBhcmFncmFwaEFuZEJvZHlTaW1wbGUiLCB0ZXN0V2Vi
a2l0QXRrR2V0VGV4dEluUGFyYWdyYXBoQW5kQm9keVNpbXBsZSk7CiAgICAgZ190ZXN0X2FkZF9m
dW5jKCIvd2Via2l0L2F0ay9nZXRUZXh0SW5QYXJhZ3JhcGhBbmRCb2R5TW9kZXJhdGUiLCB0ZXN0
V2Via2l0QXRrR2V0VGV4dEluUGFyYWdyYXBoQW5kQm9keU1vZGVyYXRlKTsKKyAgICBnX3Rlc3Rf
YWRkX2Z1bmMoIi93ZWJraXQvYXRrL3Rlc3RXZWJraXRBdGtUZXh0QXR0cmlidXRlcyIsIHRlc3RX
ZWJraXRBdGtUZXh0QXR0cmlidXRlcyk7CiAgICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CiAK
</data>
<flag name="review"
          id="32265"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58253</attachid>
            <date>2010-06-09 09:31:26 -0700</date>
            <delta_ts>2010-06-14 10:55:07 -0700</delta_ts>
            <desc>webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation</desc>
            <filename>0001-2010-06-09-Jos-Mill-n-Soto-jmillan-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>22359</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSAzZWI2MjExMzE0N2RkNjgyMTUzNDQ5NGNmYzIzZDljNTM1MTc3ZDhhIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBXZWQsIDkgSnVuIDIwMTAgMTg6MTU6NTAgKzAyMDAKU3ViamVjdDogW1BBVENI
XSA9P1VURi04P3E/MjAxMC0wNi0wOT0yMD0yMEpvcz1DMz1BOT0yME1pbGw9QzM9QTFuPTIwU290
bz0yMD0yMDxqbWlsbGFuQGlnYWxpYS5jb20+Pz0KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1U
eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6
IDhiaXQKCiAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCgogICAgICAgIFtHdGtd
IFRleHQgYXR0cmlidXRlcyBub3QgZXhwb3NlZAogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0yNTUyOAoKICAgICAgICBJbXBsZW1lbnRlZCB0aGUgZ2V0X3J1
bl9hdHRyaWJ1dGVzIGFuZCBnZXRfZGVmYXVsdF9hdHRyaWJ1dGVzCiAgICAgICAgZnVuY3Rpb25z
IGZvciB0aGUgQVRLX1RFWFQgcm9sZS4KCiAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L2d0ay9BY2Nl
c3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHA6CiAgICAgICAgKGdldEF0dHJpYnV0ZVNldEZv
ckFjY2Vzc2liaWxpdHlPYmplY3QpOgogICAgICAgIChjb21wYXJlQXR0cmlidXRlKToKICAgICAg
ICAoYXR0cmlidXRlU2V0RGlmZmVyZW5jZSk6CiAgICAgICAgKGFjY2Vzc2liaWxpdHlPYmplY3RM
ZW5ndGgpOgogICAgICAgIChnZXRBY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yT2Zmc2V0KToKICAgICAg
ICAoZ2V0UnVuQXR0cmlidXRlc0Zyb21BY2Nlc2liaWxpdHlPYmplY3QpOgogICAgICAgICh3ZWJr
aXRfYWNjZXNzaWJsZV90ZXh0X2dldF9ydW5fYXR0cmlidXRlcyk6CiAgICAgICAgKHdlYmtpdF9h
Y2Nlc3NpYmxlX3RleHRfZ2V0X2RlZmF1bHRfYXR0cmlidXRlcyk6CgoyMDEwLTA2LTA5ICBKb3PD
qSBNaWxsw6FuIFNvdG8gIDxqbWlsbGFuQGlnYWxpYS5jb20+CgogICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgoKICAgICAgICBbR3RrXSBUZXh0IGF0dHJpYnV0ZXMgbm90IGV4cG9z
ZWQKICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU1MjgK
CiAgICAgICAgQWRkZWQgbmV3IHRlc3RzIGZvciBhY2Nlc3NpYmxlIHRleHQgYXR0cmlidXRlcwoK
ICAgICAgICAqIHRlc3RzL3Rlc3RhdGsuYzoKICAgICAgICAoY29tcEF0a0F0dHJpYnV0ZSk6CiAg
ICAgICAgKGNvbXBBdGtBdHRyaWJ1dGVOYW1lKToKICAgICAgICAoYXRrQXR0cmlidXRlU2V0QXR0
cmlidXRlSGFzVmFsdWUpOgogICAgICAgIChhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbCk6CiAgICAg
ICAgKHRlc3RXZWJraXRBdGtUZXh0QXR0cmlidXRlcyk6CiAgICAgICAgKG1haW4pOgotLS0KIFdl
YkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyMCAr
KwogLi4uL2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAgICAgICAgICAgfCAg
MjY0ICsrKysrKysrKysrKysrKysrKystCiBXZWJLaXQvZ3RrL0NoYW5nZUxvZyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB8ICAgMTcgKysKIFdlYktpdC9ndGsvdGVzdHMvdGVzdGF0ay5j
ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE2NyArKysrKysrKysrKysKIDQgZmlsZXMgY2hh
bmdlZCwgNDYzIGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBlNTIzNTI2Li41OTA4NDFl
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDIzIEBACisyMDEwLTA2LTA5ICBKb3PDqSBNaWxsw6FuIFNvdG8gIDxqbWlsbGFu
QGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgW0d0a10gVGV4dCBhdHRyaWJ1dGVzIG5vdCBleHBvc2VkCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTUyOAorCisgICAgICAgIEltcGxlbWVu
dGVkIHRoZSBnZXRfcnVuX2F0dHJpYnV0ZXMgYW5kIGdldF9kZWZhdWx0X2F0dHJpYnV0ZXMKKyAg
ICAgICAgZnVuY3Rpb25zIGZvciB0aGUgQVRLX1RFWFQgcm9sZS4KKworICAgICAgICAqIGFjY2Vz
c2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcDoKKyAgICAgICAg
KGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2liaWxpdHlPYmplY3QpOgorICAgICAgICAoY29tcGFy
ZUF0dHJpYnV0ZSk6CisgICAgICAgIChhdHRyaWJ1dGVTZXREaWZmZXJlbmNlKToKKyAgICAgICAg
KGFjY2Vzc2liaWxpdHlPYmplY3RMZW5ndGgpOgorICAgICAgICAoZ2V0QWNjZXNzaWJpbGl0eU9i
amVjdEZvck9mZnNldCk6CisgICAgICAgIChnZXRSdW5BdHRyaWJ1dGVzRnJvbUFjY2VzaWJpbGl0
eU9iamVjdCk6CisgICAgICAgICh3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9ydW5fYXR0cmli
dXRlcyk6CisgICAgICAgICh3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9kZWZhdWx0X2F0dHJp
YnV0ZXMpOgorCiAyMDEwLTA2LTA4ICBEaXJrIFNjaHVsemUgIDxrcml0QHdlYmtpdC5vcmc+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgTmlrb2xhcyBaaW1tZXJtYW5uLgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAg
Yi9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRr
LmNwcAppbmRleCA1MTU4Nzc0Li5kZWNjZWEyIDEwMDY0NAotLS0gYS9XZWJDb3JlL2FjY2Vzc2li
aWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcAorKysgYi9XZWJDb3Jl
L2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcApAQCAt
NDcsNiArNDcsNyBAQAogI2luY2x1ZGUgIkVkaXRvci5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAj
aW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR093blB0ci5oIgogI2luY2x1ZGUgIkhv
c3RXaW5kb3cuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJIVE1MVGFibGVD
YXB0aW9uRWxlbWVudC5oIgpAQCAtMTAxOSwxNiArMTAyMCwyNjkgQEAgc3RhdGljIGdpbnQgd2Vi
a2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfY2FyZXRfb2Zmc2V0KEF0a1RleHQqIHRleHQpCiAgICAg
cmV0dXJuIG9mZnNldDsKIH0KIAotc3RhdGljIEF0a0F0dHJpYnV0ZVNldCogd2Via2l0X2FjY2Vz
c2libGVfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoQXRrVGV4dCogdGV4dCwgZ2ludCBvZmZzZXQs
IGdpbnQqIHN0YXJ0X29mZnNldCwgZ2ludCogZW5kX29mZnNldCkKK3N0YXRpYyBBdGtBdHRyaWJ1
dGVTZXQqIGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2liaWxpdHlPYmplY3QoY29uc3QgQWNjZXNz
aWJpbGl0eU9iamVjdCogb2JqZWN0KQogewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0
dXJuIDA7CisgICAgaWYgKCFvYmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSAoc3RhdGlj
X2Nhc3Q8Y29uc3QgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCo+KG9iamVjdCkpLT5yZW5kZXJl
cigpOworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHJlbmRlcmVyLT5zdHlsZSgpOworCisgICAg
Y29uc3QgaW50IGJ1ZmZlclNpemUgPSAxNjsKKyAgICBnY2hhciBidWZmZXJbYnVmZmVyU2l6ZV07
CisgICAgZ19zbnByaW50ZihidWZmZXIsIGJ1ZmZlclNpemUsICIlaSIsIHN0eWxlLT5mb250U2l6
ZSgpKTsKKworICAgIEF0a0F0dHJpYnV0ZVNldCogcmVzdWx0ID0gMDsKKyAgICByZXN1bHQgPSBh
ZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtf
VEVYVF9BVFRSX1NJWkUpLCBidWZmZXIpOworCisgICAgQ29sb3IgYmdDb2xvciA9IHN0eWxlLT52
aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpOworICAgIGlm
IChiZ0NvbG9yLmlzVmFsaWQoKSkgeworICAgICAgICBnX3NucHJpbnRmKGJ1ZmZlciwgYnVmZmVy
U2l6ZSwgIiVpLCVpLCVpIiwKKyAgICAgICAgICAgICAgICAgICBiZ0NvbG9yLnJlZCgpLCBiZ0Nv
bG9yLmdyZWVuKCksIGJnQ29sb3IuYmx1ZSgpKTsKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmli
dXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRU
Ul9CR19DT0xPUiksIGJ1ZmZlcik7CisgICAgfQorCisgICAgQ29sb3IgZmdDb2xvciA9IHN0eWxl
LT52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlDb2xvcik7CisgICAgaWYgKGZnQ29s
b3IuaXNWYWxpZCgpKSB7CisgICAgICAgIGdfc25wcmludGYoYnVmZmVyLCBidWZmZXJTaXplLCAi
JWksJWksJWkiLAorICAgICAgICAgICAgICAgICAgIGZnQ29sb3IucmVkKCksIGZnQ29sb3IuZ3Jl
ZW4oKSwgZmdDb2xvci5ibHVlKCkpOworICAgICAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1Nl
dChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX0ZHX0NP
TE9SKSwgYnVmZmVyKTsKKyAgICB9CisKKyAgICBpbnQgYmFzZWxpbmVQb3NpdGlvbjsKKyAgICBi
b29sIGluY2x1ZGVSaXNlID0gdHJ1ZTsKKyAgICBzd2l0Y2ggKHN0eWxlLT52ZXJ0aWNhbEFsaWdu
KCkpIHsKKyAgICBjYXNlIFNVQjoKKyAgICAgICAgYmFzZWxpbmVQb3NpdGlvbiA9IC0xICogcmVu
ZGVyZXItPmJhc2VsaW5lUG9zaXRpb24odHJ1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
U1VQRVI6CisgICAgICAgIGJhc2VsaW5lUG9zaXRpb24gPSByZW5kZXJlci0+YmFzZWxpbmVQb3Np
dGlvbih0cnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQVNFTElORToKKyAgICAgICAg
YmFzZWxpbmVQb3NpdGlvbiA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAg
ICAgIGluY2x1ZGVSaXNlID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlm
IChpbmNsdWRlUmlzZSkgeworICAgICAgICBnX3NucHJpbnRmKGJ1ZmZlciwgYnVmZmVyU2l6ZSwg
IiVpIiwgYmFzZWxpbmVQb3NpdGlvbik7CisgICAgICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRv
U2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfUklT
RSksIGJ1ZmZlcik7CisgICAgfQorCisgICAgaW50IGluZGVudGF0aW9uID0gc3R5bGUtPnRleHRJ
bmRlbnQoKS5jYWxjVmFsdWUob2JqZWN0LT5zaXplKCkud2lkdGgoKSk7CisgICAgaWYgKGluZGVu
dGF0aW9uICE9IHVuZGVmaW5lZExlbmd0aCkgeworICAgICAgICBnX3NucHJpbnRmKGJ1ZmZlciwg
YnVmZmVyU2l6ZSwgIiVpIiwgaW5kZW50YXRpb24pOworICAgICAgICByZXN1bHQgPSBhZGRBdHRy
aWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9B
VFRSX0lOREVOVCksIGJ1ZmZlcik7CisgICAgfQorCisgICAgU3RyaW5nIGZvbnRGYW1pbHlOYW1l
ID0gc3R5bGUtPmZvbnQoKS5mYW1pbHkoKS5mYW1pbHkoKS5zdHJpbmcoKTsKKyAgICBpZiAoZm9u
dEZhbWlseU5hbWUubGVmdCg4KSA9PSAiLXdlYmtpdC0iKQorICAgICAgICBmb250RmFtaWx5TmFt
ZSA9IGZvbnRGYW1pbHlOYW1lLnN1YnN0cmluZyg4KTsKKworICAgIHJlc3VsdCA9IGFkZEF0dHJp
YnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FU
VFJfRkFNSUxZX05BTUUpLCBmb250RmFtaWx5TmFtZS51dGY4KCkuZGF0YSgpKTsKKworICAgIGlu
dCBmb250V2VpZ2h0ID0gLTE7CisgICAgc3dpdGNoIChzdHlsZS0+Zm9udCgpLndlaWdodCgpKSB7
CisgICAgY2FzZSBGb250V2VpZ2h0MTAwOgorICAgICAgICBmb250V2VpZ2h0ID0gMTAwOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIEZvbnRXZWlnaHQyMDA6CisgICAgICAgIGZvbnRXZWlnaHQg
PSAyMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9udFdlaWdodDMwMDoKKyAgICAgICAg
Zm9udFdlaWdodCA9IDMwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0NDAw
OgorICAgICAgICBmb250V2VpZ2h0ID0gNDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZv
bnRXZWlnaHQ1MDA6CisgICAgICAgIGZvbnRXZWlnaHQgPSA1MDA7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgRm9udFdlaWdodDYwMDoKKyAgICAgICAgZm9udFdlaWdodCA9IDYwMDsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0NzAwOgorICAgICAgICBmb250V2VpZ2h0ID0g
NzAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvbnRXZWlnaHQ4MDA6CisgICAgICAgIGZv
bnRXZWlnaHQgPSA4MDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9udFdlaWdodDkwMDoK
KyAgICAgICAgZm9udFdlaWdodCA9IDkwMDsKKyAgICB9CisgICAgaWYgKGZvbnRXZWlnaHQgPiAw
KSB7CisgICAgICAgIGdfc25wcmludGYoYnVmZmVyLCBidWZmZXJTaXplLCAiJWkiLCBmb250V2Vp
Z2h0KTsKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4
dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9XRUlHSFQpLCBidWZmZXIpOworICAg
IH0KKworICAgIHN3aXRjaCAoc3R5bGUtPnRleHRBbGlnbigpKSB7CisgICAgY2FzZSBUQUFVVE86
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEVGVDoKKyAgICBjYXNlIFdFQktJVF9MRUZUOgor
ICAgICAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJp
YnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX0pVU1RJRklDQVRJT04pLCAibGVmdCIpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFJJR0hUOgorICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAg
ICAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0
ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX0pVU1RJRklDQVRJT04pLCAicmlnaHQiKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBDRU5URVI6CisgICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAg
ICAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0
ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX0pVU1RJRklDQVRJT04pLCAiY2VudGVyIik7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgSlVTVElGWToKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmli
dXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRU
Ul9KVVNUSUZJQ0FUSU9OKSwgImZpbGwiKTsKKyAgICB9CisKKyAgICByZXN1bHQgPSBhZGRBdHRy
aWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9B
VFRSX1VOREVSTElORSksICgoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkgJiBVTkRFUkxJTkUpID8g
InNpbmdsZSIgOiAibm9uZSIpKTsKKworICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJl
c3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfU1RZTEUpLCAo
c3R5bGUtPmZvbnQoKS5pdGFsaWMoKSA/ICJpdGFsaWMiIDogIm5vcm1hbCIpKTsKKworICAgIHJl
c3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9u
YW1lKEFUS19URVhUX0FUVFJfU1RSSUtFVEhST1VHSCksICgoc3R5bGUtPnRleHREZWNvcmF0aW9u
KCkgJiBMSU5FX1RIUk9VR0gpID8gInRydWUiIDogImZhbHNlIikpOworCisgICAgcmVzdWx0ID0g
YWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRL
X1RFWFRfQVRUUl9JTlZJU0lCTEUpLCAoKHN0eWxlLT52aXNpYmlsaXR5KCkgPT0gSElEREVOKSA/
ICJ0cnVlIiA6ICJmYWxzZSIpKTsKKworICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJl
c3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfRURJVEFCTEUp
LCBvYmplY3QtPmlzUmVhZE9ubHkoKSA/ICJmYWxzZSIgOiAidHJ1ZSIpOworCisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKworc3RhdGljIGdpbnQgY29tcGFyZUF0dHJpYnV0ZShjb25zdCBBdGtBdHRy
aWJ1dGUqIGEsIGNvbnN0IEF0a0F0dHJpYnV0ZSogYikKK3sKKyAgICByZXR1cm4gKGdfc3RyY21w
MChhLT5uYW1lLCBiLT5uYW1lKSB8fCBnX3N0cmNtcDAoYS0+dmFsdWUsIGItPnZhbHVlKSk7Cit9
CisKKy8vIFJldHVybnMgYW4gQXRrQXR0cmlidXRlU2V0IHdpdGggdGhlIGVsZW1lbnRzIG9mIGEx
IHdoaWNoIGFyZSBlaXRoZXIKKy8vIG5vdCBwcmVzZW50IG9yIGRpZmZlcmVudCBpbiBhMi4gIE5l
aXRoZXIgYTEgbm9yIGEyIHNob3VsZCBiZSB1c2VkCisvLyBhZnRlciBjYWxsaW5nIHRoaXMgZnVu
Y3Rpb24uCitzdGF0aWMgQXRrQXR0cmlidXRlU2V0KiBhdHRyaWJ1dGVTZXREaWZmZXJlbmNlKEF0
a0F0dHJpYnV0ZVNldCogYTEsIEF0a0F0dHJpYnV0ZVNldCogYTIpCit7CisgICAgaWYgKCFhMikK
KyAgICAgICAgcmV0dXJuIGExOworCisgICAgQXRrQXR0cmlidXRlU2V0KiBpID0gYTE7CisgICAg
QXRrQXR0cmlidXRlU2V0KiBmb3VuZDsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIHRvRGVsZXRlID0g
MDsKKworICAgIHdoaWxlIChpKSB7CisgICAgICAgIGZvdW5kID0gZ19zbGlzdF9maW5kX2N1c3Rv
bShhMiwgaS0+ZGF0YSwgKEdDb21wYXJlRnVuYyljb21wYXJlQXR0cmlidXRlKTsKKyAgICAgICAg
aWYgKGZvdW5kKSB7CisgICAgICAgICAgICBBdGtBdHRyaWJ1dGVTZXQqIHQgPSBpLT5uZXh0Owor
ICAgICAgICAgICAgdG9EZWxldGUgPSBnX3NsaXN0X3ByZXBlbmQodG9EZWxldGUsIGktPmRhdGEp
OworICAgICAgICAgICAgYTEgPSBnX3NsaXN0X2RlbGV0ZV9saW5rKGExLCBpKTsKKyAgICAgICAg
ICAgIGkgPSB0OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGkgPSBpLT5uZXh0OworICAg
IH0KKworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoYTIpOworICAgIGF0a19hdHRyaWJ1dGVf
c2V0X2ZyZWUodG9EZWxldGUpOworICAgIHJldHVybiBhMTsKK30KKworc3RhdGljIGd1aW50IGFj
Y2Vzc2liaWxpdHlPYmplY3RMZW5ndGgoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqZWN0
KQoreworICAgIGludCB2YWx1ZSA9IG9iamVjdC0+c3RyaW5nVmFsdWUoKS5sZW5ndGgoKTsKKyAg
ICBpZiAodmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICBpZiAob2JqZWN0LT5pc0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSkgeworICAgICAgICBjb25zdCBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gKHN0YXRpY19jYXN0PGNvbnN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Qq
PihvYmplY3QpKS0+cmVuZGVyZXIoKTsKKyAgICAgICAgaWYgKHJlbmRlcmVyLT5pc0JSKCkpCisg
ICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLy8gcmV0dXJuIG9iamVjdC0+dGV4dFVu
ZGVyRWxlbWVudCgpLmxlbmd0aCgpOworICAgIEdPd25QdHI8Z2NoYXI+IHRleHQod2Via2l0X2Fj
Y2Vzc2libGVfdGV4dF9nZXRfdGV4dChBVEtfVEVYVChvYmplY3QtPndyYXBwZXIoKSksIDAsIC0x
KSk7CisgICAgcmV0dXJuIGdfdXRmOF9zdHJsZW4gKHRleHQuZ2V0KCksIC0xKTsKK30KKworc3Rh
dGljIGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QqIGdldEFjY2Vzc2liaWxpdHlPYmplY3RGb3JP
ZmZzZXQoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqZWN0LCBndWludCBvZmZzZXQsIGdp
bnQqIHN0YXJ0T2Zmc2V0LCBnaW50KiBlbmRPZmZzZXQpCit7CisgICAgY29uc3QgQWNjZXNzaWJp
bGl0eU9iamVjdCogcmVzdWx0OworICAgIGd1aW50IGxlbmd0aCA9IGFjY2Vzc2liaWxpdHlPYmpl
Y3RMZW5ndGgob2JqZWN0KTsKKyAgICBpZiAobGVuZ3RoID4gb2Zmc2V0KSB7CisgICAgICAgICpz
dGFydE9mZnNldCA9IDA7CisgICAgICAgICplbmRPZmZzZXQgPSBsZW5ndGg7CisgICAgICAgIHJl
c3VsdCA9IG9iamVjdDsKKyAgICB9IGVsc2UgeworICAgICAgICAqc3RhcnRPZmZzZXQgPSAtMTsK
KyAgICAgICAgKmVuZE9mZnNldCA9IC0xOworICAgICAgICByZXN1bHQgPSAwOworICAgIH0KKwor
ICAgIGlmICghb2JqZWN0LT5maXJzdENoaWxkKCkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisK
KyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjaGlsZCA9IG9iamVjdC0+Zmlyc3RDaGlsZCgpOwor
ICAgIGd1aW50IGN1cnJlbnRPZmZzZXQgPSAwOworICAgIGd1aW50IGNoaWxkUG9zaXRpb24gPSAw
OworICAgIHdoaWxlIChjaGlsZCAmJiBjdXJyZW50T2Zmc2V0IDw9IG9mZnNldCkgeworICAgICAg
ICBndWludCBjaGlsZExlbmd0aCA9IGFjY2Vzc2liaWxpdHlPYmplY3RMZW5ndGgoY2hpbGQpOwor
ICAgICAgICBjdXJyZW50T2Zmc2V0ID0gY2hpbGRMZW5ndGggKyBjaGlsZFBvc2l0aW9uOworICAg
ICAgICBpZiAoY3VycmVudE9mZnNldCA+IG9mZnNldCkgeworICAgICAgICAgICAgZ2ludCBjaGls
ZFN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgZ2ludCBjaGlsZEVuZE9mZnNldDsKKyAgICAgICAg
ICAgIGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QqIGdyYW5kQ2hpbGQgPSBnZXRBY2Nlc3NpYmls
aXR5T2JqZWN0Rm9yT2Zmc2V0KGNoaWxkLCBvZmZzZXQtY2hpbGRQb3NpdGlvbiwgICZjaGlsZFN0
YXJ0T2Zmc2V0LCAmY2hpbGRFbmRPZmZzZXQpOworICAgICAgICAgICAgaWYgKGNoaWxkU3RhcnRP
ZmZzZXQgPj0gMCkgeworICAgICAgICAgICAgICAgICpzdGFydE9mZnNldCA9IGNoaWxkU3RhcnRP
ZmZzZXQgKyBjaGlsZFBvc2l0aW9uOworICAgICAgICAgICAgICAgICplbmRPZmZzZXQgPSBjaGls
ZEVuZE9mZnNldCArIGNoaWxkUG9zaXRpb247CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3Jh
bmRDaGlsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNo
aWxkUG9zaXRpb24gKz0gY2hpbGRMZW5ndGg7CisgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5u
ZXh0U2libGluZygpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K3N0YXRpYyBBdGtBdHRyaWJ1dGVTZXQqIGdldFJ1bkF0dHJpYnV0ZXNGcm9tQWNjZXNpYmlsaXR5
T2JqZWN0KGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QqIGVsZW1lbnQsIGdpbnQgb2Zmc2V0LCBn
aW50KiBzdGFydE9mZnNldCwgZ2ludCogZW5kT2Zmc2V0KQoreworICAgIGNvbnN0IEFjY2Vzc2li
aWxpdHlPYmplY3QgKmNoaWxkID0gZ2V0QWNjZXNzaWJpbGl0eU9iamVjdEZvck9mZnNldChlbGVt
ZW50LCBvZmZzZXQsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOworICAgIGlmICghY2hpbGQpIHsK
KyAgICAgICAgKnN0YXJ0T2Zmc2V0ID0gLTE7CisgICAgICAgICplbmRPZmZzZXQgPSAtMTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQXRrQXR0cmlidXRlU2V0KiBkZWZhdWx0QXR0
cmlidXRlcyA9IGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2liaWxpdHlPYmplY3QoZWxlbWVudCk7
CisgICAgQXRrQXR0cmlidXRlU2V0KiBjaGlsZEF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVTZXRG
b3JBY2Nlc3NpYmlsaXR5T2JqZWN0KGNoaWxkKTsKKworICAgIHJldHVybiBhdHRyaWJ1dGVTZXRE
aWZmZXJlbmNlKGNoaWxkQXR0cmlidXRlcywgZGVmYXVsdEF0dHJpYnV0ZXMpOworfQorCitzdGF0
aWMgQXRrQXR0cmlidXRlU2V0KiB3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9ydW5fYXR0cmli
dXRlcyhBdGtUZXh0KiB0ZXh0LCBnaW50IG9mZnNldCwgZ2ludCogc3RhcnRPZmZzZXQsIGdpbnQq
IGVuZE9mZnNldCkKK3sKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0gY29y
ZSh0ZXh0KTsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIHJlc3VsdDsKKworICAgIGlmICghY29yZU9i
amVjdCkgeworICAgICAgICAqc3RhcnRPZmZzZXQgPSAwOworICAgICAgICAqZW5kT2Zmc2V0ID0g
YXRrX3RleHRfZ2V0X2NoYXJhY3Rlcl9jb3VudCh0ZXh0KTsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgb2Zmc2V0ID0gYXRrX3RleHRf
Z2V0X2NhcmV0X29mZnNldCh0ZXh0KTsKKworICAgIHJlc3VsdCA9IGdldFJ1bkF0dHJpYnV0ZXNG
cm9tQWNjZXNpYmlsaXR5T2JqZWN0KGNvcmVPYmplY3QsIG9mZnNldCwgc3RhcnRPZmZzZXQsIGVu
ZE9mZnNldCk7CisKKyAgICBpZiAoKnN0YXJ0T2Zmc2V0IDwgMCkgeworICAgICAgICAqc3RhcnRP
ZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICplbmRPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisg
ICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIEF0a0F0dHJpYnV0ZVNldCogd2Via2l0X2Fj
Y2Vzc2libGVfdGV4dF9nZXRfZGVmYXVsdF9hdHRyaWJ1dGVzKEF0a1RleHQqIHRleHQpCiB7Ci0g
ICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KiBjb3JlT2JqZWN0ID0gY29yZSh0ZXh0KTsKKyAgICBpZiAoIWNvcmVPYmplY3QgfHwgIWNv
cmVPYmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIHJldHVybiBnZXRBdHRyaWJ1dGVTZXRGb3JBY2Nlc3NpYmlsaXR5T2JqZWN0KGNv
cmVPYmplY3QpOwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9j
aGFyYWN0ZXJfZXh0ZW50cyhBdGtUZXh0KiB0ZXh0LCBnaW50IG9mZnNldCwgZ2ludCogeCwgZ2lu
dCogeSwgZ2ludCogd2lkdGgsIGdpbnQqIGhlaWdodCwgQXRrQ29vcmRUeXBlIGNvb3JkcykKZGlm
ZiAtLWdpdCBhL1dlYktpdC9ndGsvQ2hhbmdlTG9nIGIvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKaW5k
ZXggZjdmNGM4Zi4uNDBjMTQwZiAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKKysr
IGIvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMCBAQAorMjAxMC0wNi0wOSAgSm9z
w6kgTWlsbMOhbiBTb3RvICA8am1pbGxhbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHdGtdIFRleHQgYXR0cmlidXRlcyBub3Qg
ZXhwb3NlZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjU1MjgKKworICAgICAgICBBZGRlZCBuZXcgdGVzdHMgZm9yIGFjY2Vzc2libGUgdGV4dCBhdHRy
aWJ1dGVzCisKKyAgICAgICAgKiB0ZXN0cy90ZXN0YXRrLmM6CisgICAgICAgIChjb21wQXRrQXR0
cmlidXRlKToKKyAgICAgICAgKGNvbXBBdGtBdHRyaWJ1dGVOYW1lKToKKyAgICAgICAgKGF0a0F0
dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKToKKyAgICAgICAgKGF0a0F0dHJpYnV0ZVNldEFy
ZUVxdWFsKToKKyAgICAgICAgKHRlc3RXZWJraXRBdGtUZXh0QXR0cmlidXRlcyk6CisgICAgICAg
IChtYWluKToKKwogMjAxMC0wNi0wOCAgWGFuIExvcGV6ICA8eGxvcGV6QGlnYWxpYS5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgR3VzdGF2byBOb3JvbmhhLgpkaWZmIC0tZ2l0IGEvV2ViS2l0
L2d0ay90ZXN0cy90ZXN0YXRrLmMgYi9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYwppbmRleCAx
ZjFhYjBjLi45MTkxMWUwIDEwMDY0NAotLS0gYS9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYwor
KysgYi9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYwpAQCAtNDAsNiArNDAsOCBAQCBzdGF0aWMg
Y29uc3QgY2hhciogY29udGVudHNJblBhcmFncmFwaEFuZEJvZHlNb2RlcmF0ZSA9ICI8aHRtbD48
Ym9keT48cD5UaGlzIGlzCiAKIHN0YXRpYyBjb25zdCBjaGFyKiBjb250ZW50c0luVGFibGUgPSAi
PGh0bWw+PGJvZHk+PHRhYmxlPjx0cj48dGQ+Zm9vPC90ZD48dGQ+YmFyPC90ZD48L3RyPjwvdGFi
bGU+PC9ib2R5PjwvaHRtbD4iOwogCitzdGF0aWMgY29uc3QgY2hhciogdGV4dFdpdGhBdHRyaWJ1
dGVzID0gIjxodG1sPjxoZWFkPjxzdHlsZT4uc3QxIHtmb250LWZhbWlseTogbW9ub3NwYWNlOyBj
b2xvcjpyZ2IoMTIwLDEyMSwxMjIpO30gLnN0MiB7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsg
YmFja2dyb3VuZC1jb2xvcjpyZ2IoODAsODEsODIpO308L3N0eWxlPjwvaGVhZD48Ym9keT48cCBz
dHlsZT1cImZvbnQtc2l6ZToxNDsgdGV4dC1hbGlnbjpyaWdodDtcIj5UaGlzIGlzIHRoZSA8aT5m
aXJzdDwvaT48Yj4gc2VudGVuY2Ugb2YgdGhpcyB0ZXh0LjwvYj48L3A+PHAgY2xhc3M9XCJzdDFc
Ij5UaGlzIHNlbnRlbmNlIHNob3VsZCBoYXZlIGFuIHN0eWxlIGFwcGxpZWQgPHNwYW4gY2xhc3M9
XCJzdDJcIj5hbmQgdGhpcyBwYXJ0IHNob3VsZCBoYXZlIGFub3RoZXIgb25lPC9zcGFuPi48L3A+
PHA+eDxzdWI+MTwvc3ViPjxzdXA+Mjwvc3VwPj14PHN1Yj4yPC9zdWI+PHN1cD4zPC9zdXA+PC9w
PjxwIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7XCI+VGhpcyBzZW50ZW5jZSBpcyB0aGUgPHN0
cmlrZT5sYXN0PC9zdHJpa2U+IG9uZS48L3A+PC9ib2R5PjwvaHRtbD4iOworCiBzdGF0aWMgZ2Jv
b2xlYW4gYmFpbF9vdXQoR01haW5Mb29wKiBsb29wKQogewogICAgIGlmIChnX21haW5fbG9vcF9p
c19ydW5uaW5nKGxvb3ApKQpAQCAtNDgwLDYgKzQ4MiwxNzAgQEAgc3RhdGljIHZvaWQgdGVzdFdl
YmtpdEF0a0dldFRleHRJblRhYmxlKHZvaWQpCiAgICAgZ19vYmplY3RfdW5yZWYod2ViVmlldyk7
CiB9CiAKK3N0YXRpYyBnaW50IGNvbXBBdGtBdHRyaWJ1dGUoQXRrQXR0cmlidXRlICphMSwgQXRr
QXR0cmlidXRlICphMikKK3sKKyAgICBnaW50IHN0cmNtcFZhbDsKKyAgICBzdHJjbXBWYWwgPSBn
X3N0cmNtcDAoYTEtPm5hbWUsIGEyLT5uYW1lKTsKKyAgICBpZiAoc3RyY21wVmFsKQorICAgICAg
ICByZXR1cm4gc3RyY21wVmFsOworICAgIHJldHVybiBnX3N0cmNtcDAoYTEtPnZhbHVlLCBhMi0+
dmFsdWUpOworfQorCitzdGF0aWMgZ2ludCBjb21wQXRrQXR0cmlidXRlTmFtZShBdGtBdHRyaWJ1
dGUgKmExLCBBdGtBdHRyaWJ1dGUgKmEyKQoreworICAgIHJldHVybiBnX3N0cmNtcDAoYTEtPm5h
bWUsIGEyLT5uYW1lKTsKK30KKworc3RhdGljIGdib29sZWFuIGF0a0F0dHJpYnV0ZVNldEF0dHJp
YnV0ZUhhc1ZhbHVlKEF0a0F0dHJpYnV0ZVNldCAqc2V0LCBBdGtUZXh0QXR0cmlidXRlIGF0dHJp
YnV0ZSwgY29uc3QgZ2NoYXIgKnZhbHVlKQoreworICAgIEF0a0F0dHJpYnV0ZSBhdDsKKyAgICBh
dC5uYW1lID0gZ19zdHJkdXAoYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKGF0dHJpYnV0ZSkp
OworCisgICAgR1NMaXN0ICplbGVtZW50ID0gZ19zbGlzdF9maW5kX2N1c3RvbShzZXQsICZhdCwg
KEdDb21wYXJlRnVuYyljb21wQXRrQXR0cmlidXRlTmFtZSk7CisgICAgZ19mcmVlKGF0Lm5hbWUp
OworCisgICAgZ2Jvb2xlYW4gcmVzdWx0ID0gKGVsZW1lbnQgJiYgIWdfc3RyY21wMCgoKEF0a0F0
dHJpYnV0ZSopKGVsZW1lbnQtPmRhdGEpKS0+dmFsdWUsIHZhbHVlKSk7CisgICAgaWYgKCFyZXN1
bHQgJiYgZWxlbWVudCkKKyAgICAgICAgcHJpbnRmKCJFeHBlY3RlZCAlcyBnb3QgJXNcbiIsIHZh
bHVlLCAoKEF0a0F0dHJpYnV0ZSopKGVsZW1lbnQtPmRhdGEpKS0+dmFsdWUpOworICAgIHJldHVy
biByZXN1bHQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiBhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChB
dGtBdHRyaWJ1dGVTZXQgKnNldDEsIEF0a0F0dHJpYnV0ZVNldCAqc2V0MikKK3sKKyAgICBpZiAo
IXNldDEpCisgICAgICAgIHJldHVybiAhc2V0MjsKKworICAgIHNldDEgPSBnX3NsaXN0X3NvcnQo
c2V0MSwgKEdDb21wYXJlRnVuYyljb21wQXRrQXR0cmlidXRlKTsKKyAgICBzZXQyID0gZ19zbGlz
dF9zb3J0KHNldDIsIChHQ29tcGFyZUZ1bmMpY29tcEF0a0F0dHJpYnV0ZSk7CisKKyAgICB3aGls
ZSAoc2V0MSkgeworICAgICAgICBpZiAoIXNldDIgfHwgY29tcEF0a0F0dHJpYnV0ZShzZXQxLT5k
YXRhLCBzZXQyLT5kYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICBz
ZXQxID0gc2V0MS0+bmV4dDsKKyAgICAgICAgc2V0MiA9IHNldDItPm5leHQ7CisgICAgfQorCisg
ICAgcmV0dXJuICghc2V0Mik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RXZWJraXRBdGtUZXh0QXR0
cmlidXRlcyh2b2lkKQoreworICAgIFdlYktpdFdlYlZpZXcqIHdlYlZpZXc7CisgICAgQXRrT2Jq
ZWN0KiBvYmo7CisgICAgQXRrT2JqZWN0KiBjaGlsZDsKKyAgICBHTWFpbkxvb3AqIGxvb3A7Cisg
ICAgQXRrVGV4dCogY2hpbGRUZXh0OworICAgIEF0a0F0dHJpYnV0ZVNldCAqc2V0MSwgKnNldDIs
ICpzZXQzLCAqc2V0NDsKKyAgICBnaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQsIGxlbmd0aDsK
KworICAgIHdlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJRVcod2Via2l0X3dlYl92aWV3X25ldygpKTsK
KyAgICBnX29iamVjdF9yZWZfc2luayh3ZWJWaWV3KTsKKyAgICBHdGtBbGxvY2F0aW9uIGFsbG9j
ID0geyAwLCAwLCA4MDAsIDYwMCB9OworICAgIGd0a193aWRnZXRfc2l6ZV9hbGxvY2F0ZShHVEtf
V0lER0VUKHdlYlZpZXcpLCAmYWxsb2MpOworCisgICAgd2Via2l0X3dlYl92aWV3X2xvYWRfc3Ry
aW5nKHdlYlZpZXcsIHRleHRXaXRoQXR0cmlidXRlcywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAg
bG9vcCA9IGdfbWFpbl9sb29wX25ldyhOVUxMLCBUUlVFKTsKKworICAgIGdfdGltZW91dF9hZGQo
MTAwLCAoR1NvdXJjZUZ1bmMpYmFpbF9vdXQsIGxvb3ApOworICAgIGdfbWFpbl9sb29wX3J1bihs
b29wKTsKKworICAgIG9iaiA9IGd0a193aWRnZXRfZ2V0X2FjY2Vzc2libGUoR1RLX1dJREdFVCh3
ZWJWaWV3KSk7CisgICAgZ19hc3NlcnQob2JqKTsKKworICAgIGNoaWxkID0gYXRrX29iamVjdF9y
ZWZfYWNjZXNzaWJsZV9jaGlsZChvYmosIDApOworICAgIGdfYXNzZXJ0KGNoaWxkICYmIEFUS19J
U19URVhUKGNoaWxkKSk7CisgICAgY2hpbGRUZXh0ID0gQVRLX1RFWFQoY2hpbGQpOworICAgIHNl
dDEgPSBhdGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCAwLCAmc3RhcnRPZmZz
ZXQsICZlbmRPZmZzZXQpOworICAgIGdfYXNzZXJ0X2NtcGludChzdGFydE9mZnNldCwgPT0sIDAp
OworICAgIGdfYXNzZXJ0X2NtcGludChlbmRPZmZzZXQsID09LCAxMik7CisgICAgZ19hc3NlcnQo
YXRrQXR0cmlidXRlU2V0QXJlRXF1YWwoc2V0MSwgTlVMTCkpOworCisgICAgc2V0MiA9IGF0a190
ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDE1LCAmc3RhcnRPZmZzZXQsICZlbmRP
ZmZzZXQpOworICAgIGdfYXNzZXJ0X2NtcGludChzdGFydE9mZnNldCwgPT0sIDEyKTsKKyAgICBn
X2Fzc2VydF9jbXBpbnQoZW5kT2Zmc2V0LCA9PSwgMTcpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJp
YnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDIsIEFUS19URVhUX0FUVFJfU1RZTEUsICJpdGFs
aWMiKSk7CisKKyAgICBzZXQzID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4
dCwgMTcsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgZ19hc3NlcnRfY21waW50KHN0
YXJ0T2Zmc2V0LCA9PSwgMTcpOworICAgIGdfYXNzZXJ0X2NtcGludChlbmRPZmZzZXQsID09LCA0
MCk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0Mywg
QVRLX1RFWFRfQVRUUl9XRUlHSFQsICI3MDAiKSk7CisKKyAgICBzZXQ0ID0gYXRrX3RleHRfZ2V0
X2RlZmF1bHRfYXR0cmlidXRlcyhjaGlsZFRleHQpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0
ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDQsIEFUS19URVhUX0FUVFJfU1RZTEUsICJub3JtYWwi
KSk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0NCwg
QVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9OLCAicmlnaHQiKSk7CisgICAgZ19hc3NlcnQoYXRr
QXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0NCwgQVRLX1RFWFRfQVRUUl9TSVpFLCAi
MTQiKSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQxKTsKKyAgICBhdGtfYXR0cmli
dXRlX3NldF9mcmVlKHNldDIpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Myk7Cisg
ICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQ0KTsKKworICAgIGNoaWxkID0gYXRrX29iamVj
dF9yZWZfYWNjZXNzaWJsZV9jaGlsZChvYmosIDEpOworICAgIGdfYXNzZXJ0KGNoaWxkICYmIEFU
S19JU19URVhUKGNoaWxkKSk7CisgICAgY2hpbGRUZXh0ID0gQVRLX1RFWFQoY2hpbGQpOworCisg
ICAgc2V0MSA9IGF0a190ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0ZXMoY2hpbGRUZXh0KTsKKyAg
ICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQxLCBBVEtfVEVY
VF9BVFRSX0ZBTUlMWV9OQU1FLCAibW9ub3NwYWNlIikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJp
YnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJfU1RZTEUsICJub3Jt
YWwiKSk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0
MSwgQVRLX1RFWFRfQVRUUl9TVFJJS0VUSFJPVUdILCAiZmFsc2UiKSk7CisgICAgZ19hc3NlcnQo
YXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0MSwgQVRLX1RFWFRfQVRUUl9XRUlH
SFQsICI0MDAiKSk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFs
dWUoc2V0MSwgQVRLX1RFWFRfQVRUUl9GR19DT0xPUiwgIjEyMCwxMjEsMTIyIikpOworCisgICAg
c2V0MiA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDQzLCAmc3RhcnRP
ZmZzZXQsICZlbmRPZmZzZXQpOworICAgIGdfYXNzZXJ0X2NtcGludChzdGFydE9mZnNldCwgPT0s
IDQzKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoZW5kT2Zmc2V0LCA9PSwgODApOworICAgIC8vIENo
ZWNrcyB0aGF0IGRlZmF1bHQgYXR0cmlidXRlcyBvZiB0ZXh0IGFyZSBub3QgcmV0dXJuZWQgd2hl
biBjYWxsZWQgdG8gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzCisgICAgZ19hc3NlcnQoIWF0
a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDIsIEFUS19URVhUX0FUVFJfRkdfQ09M
T1IsICIxMjAsMTIxLDEyMiIpKTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1
dGVIYXNWYWx1ZShzZXQyLCBBVEtfVEVYVF9BVFRSX1VOREVSTElORSwgInNpbmdsZSIpKTsKKyAg
ICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQyLCBBVEtfVEVY
VF9BVFRSX0JHX0NPTE9SLCAiODAsODEsODIiKSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJl
ZShzZXQxKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDIpOworCisgICAgY2hpbGQg
PSBhdGtfb2JqZWN0X3JlZl9hY2Nlc3NpYmxlX2NoaWxkKG9iaiwgMik7CisgICAgZ19hc3NlcnQo
Y2hpbGQgJiYgQVRLX0lTX1RFWFQoY2hpbGQpKTsKKyAgICBjaGlsZFRleHQgPSBBVEtfVEVYVChj
aGlsZCk7CisKKyAgICBzZXQxID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4
dCwgMCwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBzZXQyID0gYXRrX3RleHRfZ2V0
X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMywgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsK
KyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQxLCBzZXQyKSk7CisgICAg
YXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQyKTsKKworICAgIHNldDIgPSBhdGtfdGV4dF9nZXRf
cnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCAxLCAmc3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOwor
ICAgIHNldDMgPSBhdGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCA1LCAmc3Rh
cnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEFyZUVx
dWFsKHNldDIsIHNldDMpKTsKKyAgICBnX2Fzc2VydCghYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwo
c2V0MSwgc2V0MikpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Myk7CisKKyAgICBz
ZXQzID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMiwgJnN0YXJ0T2Zm
c2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBzZXQ0ID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVz
KGNoaWxkVGV4dCwgNiwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydChh
dGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQzLCBzZXQ0KSk7CisgICAgZ19hc3NlcnQoIWF0a0F0
dHJpYnV0ZVNldEFyZUVxdWFsKHNldDEsIHNldDMpKTsKKyAgICBnX2Fzc2VydCghYXRrQXR0cmli
dXRlU2V0QXJlRXF1YWwoc2V0Miwgc2V0MykpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUo
c2V0MSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQyKTsKKyAgICBhdGtfYXR0cmli
dXRlX3NldF9mcmVlKHNldDMpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0NCk7CisK
KyAgICBjaGlsZCA9IGF0a19vYmplY3RfcmVmX2FjY2Vzc2libGVfY2hpbGQob2JqLCAzKTsKKyAg
ICBnX2Fzc2VydChjaGlsZCAmJiBBVEtfSVNfVEVYVChjaGlsZCkpOworICAgIGNoaWxkVGV4dCA9
IEFUS19URVhUKGNoaWxkKTsKKyAgICBzZXQxID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVz
KGNoaWxkVGV4dCwgMjQsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgZ19hc3NlcnRf
Y21waW50KHN0YXJ0T2Zmc2V0LCA9PSwgMjEpOworICAgIGdfYXNzZXJ0X2NtcGludChlbmRPZmZz
ZXQsID09LCAyNSk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFs
dWUoc2V0MSwgQVRLX1RFWFRfQVRUUl9TVFJJS0VUSFJPVUdILCAidHJ1ZSIpKTsKKworICAgIHNl
dDIgPSBhdGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCAyNSwgJnN0YXJ0T2Zm
c2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRPZmZzZXQsID09LCAy
NSk7CisgICAgZ19hc3NlcnRfY21waW50KGVuZE9mZnNldCwgPT0sIDMwKTsKKyAgICBnX2Fzc2Vy
dChhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQyLCBOVUxMKSk7CisKKyAgICBzZXQzID0gYXRr
X3RleHRfZ2V0X2RlZmF1bHRfYXR0cmlidXRlcyhjaGlsZFRleHQpOworICAgIGdfYXNzZXJ0KGF0
a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDMsIEFUS19URVhUX0FUVFJfSlVTVElG
SUNBVElPTiwgImNlbnRlciIpKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDEpOwor
ICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Mik7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRf
ZnJlZShzZXQzKTsKK30KKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogewogICAg
IGdfdGhyZWFkX2luaXQoTlVMTCk7CkBAIC00OTQsNiArNjYwLDcgQEAgaW50IG1haW4oaW50IGFy
Z2MsIGNoYXIqKiBhcmd2KQogICAgIGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvZ2V0VGV4
dEluUGFyYWdyYXBoQW5kQm9keVNpbXBsZSIsIHRlc3RXZWJraXRBdGtHZXRUZXh0SW5QYXJhZ3Jh
cGhBbmRCb2R5U2ltcGxlKTsKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL2dldFRl
eHRJblBhcmFncmFwaEFuZEJvZHlNb2RlcmF0ZSIsIHRlc3RXZWJraXRBdGtHZXRUZXh0SW5QYXJh
Z3JhcGhBbmRCb2R5TW9kZXJhdGUpOwogICAgIGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsv
Z2V0VGV4dEluVGFibGUiLCB0ZXN0V2Via2l0QXRrR2V0VGV4dEluVGFibGUpOworICAgIGdfdGVz
dF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvdGVzdFdlYmtpdEF0a1RleHRBdHRyaWJ1dGVzIiwgdGVz
dFdlYmtpdEF0a1RleHRBdHRyaWJ1dGVzKTsKICAgICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0K
IAotLSAKMS43LjAuNAoK
</data>
<flag name="review"
          id="43210"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58670</attachid>
            <date>2010-06-14 10:55:07 -0700</date>
            <delta_ts>2010-06-29 07:54:54 -0700</delta_ts>
            <desc>webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation</desc>
            <filename>0001-2010-06-09-Jos-Mill-n-Soto-jmillan-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>21913</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSBiOGE4ZDlmYzRiYzQ1MmYxOGQwNjUzY2I2MjI5MDI5M2RlMTg1ZDI0IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBNb24sIDE0IEp1biAyMDEwIDE5OjQ2OjAyICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gPT9VVEYtOD9xPzIwMTAtMDYtMDk9MjA9MjBKb3M9RTk9MjBNaWxsPUUxbj0yMFNvdG89MjA9
MjA8am1pbGxhbkBpZ2FsaWEuY29tPj89Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTog
dGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0
CgogICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgoKICAgICAgICBbR3RrXSBUZXh0
IGF0dHJpYnV0ZXMgbm90IGV4cG9zZWQKICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjU1MjgKCiAgICAgICAgSW1wbGVtZW50ZWQgdGhlIGdldF9ydW5fYXR0
cmlidXRlcyBhbmQgZ2V0X2RlZmF1bHRfYXR0cmlidXRlcwogICAgICAgIGZ1bmN0aW9ucyBmb3Ig
dGhlIEFUS19URVhUIHJvbGUuCgogICAgICAgICogYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJp
bGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgogICAgICAgIChnZXRBdHRyaWJ1dGVTZXRGb3JBY2Nl
c3NpYmlsaXR5T2JqZWN0KToKICAgICAgICAoY29tcGFyZUF0dHJpYnV0ZSk6CiAgICAgICAgKGF0
dHJpYnV0ZVNldERpZmZlcmVuY2UpOgogICAgICAgIChhY2Nlc3NpYmlsaXR5T2JqZWN0TGVuZ3Ro
KToKICAgICAgICAoZ2V0QWNjZXNzaWJpbGl0eU9iamVjdEZvck9mZnNldCk6CiAgICAgICAgKGdl
dFJ1bkF0dHJpYnV0ZXNGcm9tQWNjZXNpYmlsaXR5T2JqZWN0KToKICAgICAgICAod2Via2l0X2Fj
Y2Vzc2libGVfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMpOgogICAgICAgICh3ZWJraXRfYWNjZXNz
aWJsZV90ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0ZXMpOgoKMjAxMC0wNi0wOSAgSm9zw6kgTWls
bMOhbiBTb3RvICA8am1pbGxhbkBpZ2FsaWEuY29tPgoKICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KCiAgICAgICAgW0d0a10gVGV4dCBhdHRyaWJ1dGVzIG5vdCBleHBvc2VkCiAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1NTI4CgogICAg
ICAgIEFkZGVkIG5ldyB0ZXN0cyBmb3IgYWNjZXNzaWJsZSB0ZXh0IGF0dHJpYnV0ZXMKCiAgICAg
ICAgKiB0ZXN0cy90ZXN0YXRrLmM6CiAgICAgICAgKGNvbXBBdGtBdHRyaWJ1dGUpOgogICAgICAg
IChjb21wQXRrQXR0cmlidXRlTmFtZSk6CiAgICAgICAgKGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0
ZUhhc1ZhbHVlKToKICAgICAgICAoYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwpOgogICAgICAgICh0
ZXN0V2Via2l0QXRrVGV4dEF0dHJpYnV0ZXMpOgogICAgICAgIChtYWluKToKLS0tCiBXZWJDb3Jl
L0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjAgKysKIC4u
Li9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwICAgICAgICAgIHwgIDI1MiAr
KysrKysrKysrKysrKysrKysrLQogV2ViS2l0L2d0ay9DaGFuZ2VMb2cgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfCAgIDE3ICsrCiBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYyAgICAg
ICAgICAgICAgICAgICAgICAgICB8ICAxNjcgKysrKysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2Vk
LCA0NTEgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L0NoYW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDIzOWNkYTYuLjM5ZmU1NDkgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMjMgQEAKKzIwMTAtMDYtMDkgIEpvc8OpIE1pbGzDoW4gU290byAgPGptaWxsYW5AaWdh
bGlhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBbR3RrXSBUZXh0IGF0dHJpYnV0ZXMgbm90IGV4cG9zZWQKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1NTI4CisKKyAgICAgICAgSW1wbGVtZW50ZWQg
dGhlIGdldF9ydW5fYXR0cmlidXRlcyBhbmQgZ2V0X2RlZmF1bHRfYXR0cmlidXRlcworICAgICAg
ICBmdW5jdGlvbnMgZm9yIHRoZSBBVEtfVEVYVCByb2xlLgorCisgICAgICAgICogYWNjZXNzaWJp
bGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgorICAgICAgICAoZ2V0
QXR0cmlidXRlU2V0Rm9yQWNjZXNzaWJpbGl0eU9iamVjdCk6CisgICAgICAgIChjb21wYXJlQXR0
cmlidXRlKToKKyAgICAgICAgKGF0dHJpYnV0ZVNldERpZmZlcmVuY2UpOgorICAgICAgICAoYWNj
ZXNzaWJpbGl0eU9iamVjdExlbmd0aCk6CisgICAgICAgIChnZXRBY2Nlc3NpYmlsaXR5T2JqZWN0
Rm9yT2Zmc2V0KToKKyAgICAgICAgKGdldFJ1bkF0dHJpYnV0ZXNGcm9tQWNjZXNpYmlsaXR5T2Jq
ZWN0KToKKyAgICAgICAgKHdlYmtpdF9hY2Nlc3NpYmxlX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVz
KToKKyAgICAgICAgKHdlYmtpdF9hY2Nlc3NpYmxlX3RleHRfZ2V0X2RlZmF1bHRfYXR0cmlidXRl
cyk6CisKIDIwMTAtMDYtMTMgIEFuZGVycyBCYWtrZW4gIDxhZ2Jha2tlbkBnbWFpbC5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCmRpZmYgLS1naXQgYS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQXRrLmNwcCBiL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwCmlu
ZGV4IDUxNTg3NzQuLjFkNTE1MjUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9n
dGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwCisrKyBiL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwCkBAIC00Nyw2ICs0
Nyw3IEBACiAjaW5jbHVkZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRl
ICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHT3duUHRyLmgiCiAjaW5jbHVkZSAiSG9zdFdpbmRv
dy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxUYWJsZUNhcHRpb25F
bGVtZW50LmgiCkBAIC0xMDE5LDE2ICsxMDIwLDI1NyBAQCBzdGF0aWMgZ2ludCB3ZWJraXRfYWNj
ZXNzaWJsZV90ZXh0X2dldF9jYXJldF9vZmZzZXQoQXRrVGV4dCogdGV4dCkKICAgICByZXR1cm4g
b2Zmc2V0OwogfQogCi1zdGF0aWMgQXRrQXR0cmlidXRlU2V0KiB3ZWJraXRfYWNjZXNzaWJsZV90
ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhBdGtUZXh0KiB0ZXh0LCBnaW50IG9mZnNldCwgZ2ludCog
c3RhcnRfb2Zmc2V0LCBnaW50KiBlbmRfb2Zmc2V0KQorc3RhdGljIEF0a0F0dHJpYnV0ZVNldCog
Z2V0QXR0cmlidXRlU2V0Rm9yQWNjZXNzaWJpbGl0eU9iamVjdChjb25zdCBBY2Nlc3NpYmlsaXR5
T2JqZWN0KiBvYmplY3QpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsK
KyAgICBpZiAoIW9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0KCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IHN0YXRpY19jYXN0PGNv
bnN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QqPihvYmplY3QpLT5yZW5kZXJlcigpOworICAg
IFJlbmRlclN0eWxlKiBzdHlsZSA9IHJlbmRlcmVyLT5zdHlsZSgpOworCisgICAgQXRrQXR0cmli
dXRlU2V0KiByZXN1bHQgPSAwOworICAgIEdPd25QdHI8Z2NoYXI+IGJ1ZmZlcihnX3N0cmR1cF9w
cmludGYoIiVpIiwgc3R5bGUtPmZvbnRTaXplKCkpKTsKKyAgICByZXN1bHQgPSBhZGRBdHRyaWJ1
dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRS
X1NJWkUpLCBidWZmZXIuZ2V0KCkpOworCisgICAgQ29sb3IgYmdDb2xvciA9IHN0eWxlLT52aXNp
dGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpOworICAgIGlmIChi
Z0NvbG9yLmlzVmFsaWQoKSkgeworICAgICAgICBidWZmZXIuc2V0KGdfc3RyZHVwX3ByaW50Zigi
JWksJWksJWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ0NvbG9yLnJl
ZCgpLCBiZ0NvbG9yLmdyZWVuKCksIGJnQ29sb3IuYmx1ZSgpKSk7CisgICAgICAgIHJlc3VsdCA9
IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFU
S19URVhUX0FUVFJfQkdfQ09MT1IpLCBidWZmZXIuZ2V0KCkpOworICAgIH0KKworICAgIENvbG9y
IGZnQ29sb3IgPSBzdHlsZS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3Ip
OworICAgIGlmIChmZ0NvbG9yLmlzVmFsaWQoKSkgeworICAgICAgICBidWZmZXIuc2V0KGdfc3Ry
ZHVwX3ByaW50ZigiJWksJWksJWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmZ0NvbG9yLnJlZCgpLCBmZ0NvbG9yLmdyZWVuKCksIGZnQ29sb3IuYmx1ZSgpKSk7CisgICAg
ICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRl
X2dldF9uYW1lKEFUS19URVhUX0FUVFJfRkdfQ09MT1IpLCBidWZmZXIuZ2V0KCkpOworICAgIH0K
KworICAgIGludCBiYXNlbGluZVBvc2l0aW9uOworICAgIGJvb2wgaW5jbHVkZVJpc2UgPSB0cnVl
OworICAgIHN3aXRjaCAoc3R5bGUtPnZlcnRpY2FsQWxpZ24oKSkgeworICAgIGNhc2UgU1VCOgor
ICAgICAgICBiYXNlbGluZVBvc2l0aW9uID0gLTEgKiByZW5kZXJlci0+YmFzZWxpbmVQb3NpdGlv
bih0cnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVVBFUjoKKyAgICAgICAgYmFzZWxp
bmVQb3NpdGlvbiA9IHJlbmRlcmVyLT5iYXNlbGluZVBvc2l0aW9uKHRydWUpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEJBU0VMSU5FOgorICAgICAgICBiYXNlbGluZVBvc2l0aW9uID0gMDsK
KyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaW5jbHVkZVJpc2UgPSBmYWxz
ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGluY2x1ZGVSaXNlKSB7CisgICAg
ICAgIGJ1ZmZlci5zZXQoZ19zdHJkdXBfcHJpbnRmKCIlaSIsIGJhc2VsaW5lUG9zaXRpb24pKTsK
KyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRy
aWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9SSVNFKSwgYnVmZmVyLmdldCgpKTsKKyAgICB9
CisKKyAgICBpbnQgaW5kZW50YXRpb24gPSBzdHlsZS0+dGV4dEluZGVudCgpLmNhbGNWYWx1ZShv
YmplY3QtPnNpemUoKS53aWR0aCgpKTsKKyAgICBpZiAoaW5kZW50YXRpb24gIT0gdW5kZWZpbmVk
TGVuZ3RoKSB7CisgICAgICAgIGJ1ZmZlci5zZXQoZ19zdHJkdXBfcHJpbnRmKCIlaSIsIGluZGVu
dGF0aW9uKSk7CisgICAgICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRr
X3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfSU5ERU5UKSwgYnVmZmVyLmdl
dCgpKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZm9udEZhbWlseU5hbWUgPSBzdHlsZS0+Zm9udCgp
LmZhbWlseSgpLmZhbWlseSgpLnN0cmluZygpOworICAgIGlmIChmb250RmFtaWx5TmFtZS5sZWZ0
KDgpID09ICItd2Via2l0LSIpCisgICAgICAgIGZvbnRGYW1pbHlOYW1lID0gZm9udEZhbWlseU5h
bWUuc3Vic3RyaW5nKDgpOworCisgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0
LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9GQU1JTFlfTkFNRSks
IGZvbnRGYW1pbHlOYW1lLnV0ZjgoKS5kYXRhKCkpOworCisgICAgaW50IGZvbnRXZWlnaHQgPSAt
MTsKKyAgICBzd2l0Y2ggKHN0eWxlLT5mb250KCkud2VpZ2h0KCkpIHsKKyAgICBjYXNlIEZvbnRX
ZWlnaHQxMDA6CisgICAgICAgIGZvbnRXZWlnaHQgPSAxMDA7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgRm9udFdlaWdodDIwMDoKKyAgICAgICAgZm9udFdlaWdodCA9IDIwMDsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0MzAwOgorICAgICAgICBmb250V2VpZ2h0ID0gMzAw
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvbnRXZWlnaHQ0MDA6CisgICAgICAgIGZvbnRX
ZWlnaHQgPSA0MDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9udFdlaWdodDUwMDoKKyAg
ICAgICAgZm9udFdlaWdodCA9IDUwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250V2Vp
Z2h0NjAwOgorICAgICAgICBmb250V2VpZ2h0ID0gNjAwOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIEZvbnRXZWlnaHQ3MDA6CisgICAgICAgIGZvbnRXZWlnaHQgPSA3MDA7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgRm9udFdlaWdodDgwMDoKKyAgICAgICAgZm9udFdlaWdodCA9IDgwMDsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0OTAwOgorICAgICAgICBmb250V2Vp
Z2h0ID0gOTAwOworICAgIH0KKyAgICBpZiAoZm9udFdlaWdodCA+IDApIHsKKyAgICAgICAgYnVm
ZmVyLnNldChnX3N0cmR1cF9wcmludGYoIiVpIiwgZm9udFdlaWdodCkpOworICAgICAgICByZXN1
bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFt
ZShBVEtfVEVYVF9BVFRSX1dFSUdIVCksIGJ1ZmZlci5nZXQoKSk7CisgICAgfQorCisgICAgc3dp
dGNoIChzdHlsZS0+dGV4dEFsaWduKCkpIHsKKyAgICBjYXNlIFRBQVVUTzoKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBMRUZUOgorICAgIGNhc2UgV0VCS0lUX0xFRlQ6CisgICAgICAgIHJlc3Vs
dCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1l
KEFUS19URVhUX0FUVFJfSlVTVElGSUNBVElPTiksICJsZWZ0Iik7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgUklHSFQ6CisgICAgY2FzZSBXRUJLSVRfUklHSFQ6CisgICAgICAgIHJlc3VsdCA9
IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFU
S19URVhUX0FUVFJfSlVTVElGSUNBVElPTiksICJyaWdodCIpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIENFTlRFUjoKKyAgICBjYXNlIFdFQktJVF9DRU5URVI6CisgICAgICAgIHJlc3VsdCA9
IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFU
S19URVhUX0FUVFJfSlVTVElGSUNBVElPTiksICJjZW50ZXIiKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBKVVNUSUZZOgorICAgICAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1
bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX0pVU1RJRklDQVRJ
T04pLCAiZmlsbCIpOworICAgIH0KKworICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJl
c3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfVU5ERVJMSU5F
KSwgKHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpICYgVU5ERVJMSU5FKSA/ICJzaW5nbGUiIDogIm5v
bmUiKTsKKworICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRf
YXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfU1RZTEUpLCBzdHlsZS0+Zm9udCgpLml0
YWxpYygpID8gIml0YWxpYyIgOiAibm9ybWFsIik7CisKKyAgICByZXN1bHQgPSBhZGRBdHRyaWJ1
dGVUb1NldChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRS
X1NUUklLRVRIUk9VR0gpLCAoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkgJiBMSU5FX1RIUk9VR0gp
ID8gInRydWUiIDogImZhbHNlIik7CisKKyAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChy
ZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX0lOVklTSUJM
RSksIChzdHlsZS0+dmlzaWJpbGl0eSgpID09IEhJRERFTikgPyAidHJ1ZSIgOiAiZmFsc2UiKTsK
KworICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmli
dXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfRURJVEFCTEUpLCBvYmplY3QtPmlzUmVhZE9ubHko
KSA/ICJmYWxzZSIgOiAidHJ1ZSIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGlj
IGdpbnQgY29tcGFyZUF0dHJpYnV0ZShjb25zdCBBdGtBdHRyaWJ1dGUqIGEsIGNvbnN0IEF0a0F0
dHJpYnV0ZSogYikKK3sKKyAgICByZXR1cm4gZ19zdHJjbXAwKGEtPm5hbWUsIGItPm5hbWUpIHx8
IGdfc3RyY21wMChhLT52YWx1ZSwgYi0+dmFsdWUpOworfQorCisvLyBSZXR1cm5zIGFuIEF0a0F0
dHJpYnV0ZVNldCB3aXRoIHRoZSBlbGVtZW50cyBvZiBhMSB3aGljaCBhcmUgZWl0aGVyCisvLyBu
b3QgcHJlc2VudCBvciBkaWZmZXJlbnQgaW4gYTIuICBOZWl0aGVyIGExIG5vciBhMiBzaG91bGQg
YmUgdXNlZAorLy8gYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorc3RhdGljIEF0a0F0dHJp
YnV0ZVNldCogYXR0cmlidXRlU2V0RGlmZmVyZW5jZShBdGtBdHRyaWJ1dGVTZXQqIGExLCBBdGtB
dHRyaWJ1dGVTZXQqIGEyKQoreworICAgIGlmICghYTIpCisgICAgICAgIHJldHVybiBhMTsKKwor
ICAgIEF0a0F0dHJpYnV0ZVNldCogaSA9IGExOworICAgIEF0a0F0dHJpYnV0ZVNldCogZm91bmQ7
CisgICAgQXRrQXR0cmlidXRlU2V0KiB0b0RlbGV0ZSA9IDA7CisKKyAgICB3aGlsZSAoaSkgewor
ICAgICAgICBmb3VuZCA9IGdfc2xpc3RfZmluZF9jdXN0b20oYTIsIGktPmRhdGEsIChHQ29tcGFy
ZUZ1bmMpY29tcGFyZUF0dHJpYnV0ZSk7CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAg
ICAgQXRrQXR0cmlidXRlU2V0KiB0ID0gaS0+bmV4dDsKKyAgICAgICAgICAgIHRvRGVsZXRlID0g
Z19zbGlzdF9wcmVwZW5kKHRvRGVsZXRlLCBpLT5kYXRhKTsKKyAgICAgICAgICAgIGExID0gZ19z
bGlzdF9kZWxldGVfbGluayhhMSwgaSk7CisgICAgICAgICAgICBpID0gdDsKKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBpID0gaS0+bmV4dDsKKyAgICB9CisKKyAgICBhdGtfYXR0cmlidXRl
X3NldF9mcmVlKGEyKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHRvRGVsZXRlKTsKKyAg
ICByZXR1cm4gYTE7Cit9CisKK3N0YXRpYyBndWludCBhY2Nlc3NpYmlsaXR5T2JqZWN0TGVuZ3Ro
KGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iamVjdCkKK3sKKyAgICBHT3duUHRyPGdjaGFy
PiB0ZXh0KHdlYmtpdF9hY2Nlc3NpYmxlX3RleHRfZ2V0X3RleHQoQVRLX1RFWFQob2JqZWN0LT53
cmFwcGVyKCkpLCAwLCAtMSkpOworICAgIHJldHVybiBnX3V0Zjhfc3RybGVuKHRleHQuZ2V0KCks
IC0xKTsKK30KKworc3RhdGljIGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QqIGdldEFjY2Vzc2li
aWxpdHlPYmplY3RGb3JPZmZzZXQoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqZWN0LCBn
dWludCBvZmZzZXQsIGdpbnQqIHN0YXJ0T2Zmc2V0LCBnaW50KiBlbmRPZmZzZXQpCit7CisgICAg
Y29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogcmVzdWx0OworICAgIGd1aW50IGxlbmd0aCA9IGFj
Y2Vzc2liaWxpdHlPYmplY3RMZW5ndGgob2JqZWN0KTsKKyAgICBpZiAobGVuZ3RoID4gb2Zmc2V0
KSB7CisgICAgICAgICpzdGFydE9mZnNldCA9IDA7CisgICAgICAgICplbmRPZmZzZXQgPSBsZW5n
dGg7CisgICAgICAgIHJlc3VsdCA9IG9iamVjdDsKKyAgICB9IGVsc2UgeworICAgICAgICAqc3Rh
cnRPZmZzZXQgPSAtMTsKKyAgICAgICAgKmVuZE9mZnNldCA9IC0xOworICAgICAgICByZXN1bHQg
PSAwOworICAgIH0KKworICAgIGlmICghb2JqZWN0LT5maXJzdENoaWxkKCkpCisgICAgICAgIHJl
dHVybiByZXN1bHQ7CisKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjaGlsZCA9IG9iamVjdC0+
Zmlyc3RDaGlsZCgpOworICAgIGd1aW50IGN1cnJlbnRPZmZzZXQgPSAwOworICAgIGd1aW50IGNo
aWxkUG9zaXRpb24gPSAwOworICAgIHdoaWxlIChjaGlsZCAmJiBjdXJyZW50T2Zmc2V0IDw9IG9m
ZnNldCkgeworICAgICAgICBndWludCBjaGlsZExlbmd0aCA9IGFjY2Vzc2liaWxpdHlPYmplY3RM
ZW5ndGgoY2hpbGQpOworICAgICAgICBjdXJyZW50T2Zmc2V0ID0gY2hpbGRMZW5ndGggKyBjaGls
ZFBvc2l0aW9uOworICAgICAgICBpZiAoY3VycmVudE9mZnNldCA+IG9mZnNldCkgeworICAgICAg
ICAgICAgZ2ludCBjaGlsZFN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgZ2ludCBjaGlsZEVuZE9m
ZnNldDsKKyAgICAgICAgICAgIGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QqIGdyYW5kQ2hpbGQg
PSBnZXRBY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yT2Zmc2V0KGNoaWxkLCBvZmZzZXQtY2hpbGRQb3Np
dGlvbiwgICZjaGlsZFN0YXJ0T2Zmc2V0LCAmY2hpbGRFbmRPZmZzZXQpOworICAgICAgICAgICAg
aWYgKGNoaWxkU3RhcnRPZmZzZXQgPj0gMCkgeworICAgICAgICAgICAgICAgICpzdGFydE9mZnNl
dCA9IGNoaWxkU3RhcnRPZmZzZXQgKyBjaGlsZFBvc2l0aW9uOworICAgICAgICAgICAgICAgICpl
bmRPZmZzZXQgPSBjaGlsZEVuZE9mZnNldCArIGNoaWxkUG9zaXRpb247CisgICAgICAgICAgICAg
ICAgcmVzdWx0ID0gZ3JhbmRDaGlsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIGNoaWxkUG9zaXRpb24gKz0gY2hpbGRMZW5ndGg7CisgICAgICAgICAgICBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVy
biByZXN1bHQ7Cit9CisKK3N0YXRpYyBBdGtBdHRyaWJ1dGVTZXQqIGdldFJ1bkF0dHJpYnV0ZXNG
cm9tQWNjZXNpYmlsaXR5T2JqZWN0KGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QqIGVsZW1lbnQs
IGdpbnQgb2Zmc2V0LCBnaW50KiBzdGFydE9mZnNldCwgZ2ludCogZW5kT2Zmc2V0KQoreworICAg
IGNvbnN0IEFjY2Vzc2liaWxpdHlPYmplY3QgKmNoaWxkID0gZ2V0QWNjZXNzaWJpbGl0eU9iamVj
dEZvck9mZnNldChlbGVtZW50LCBvZmZzZXQsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOworICAg
IGlmICghY2hpbGQpIHsKKyAgICAgICAgKnN0YXJ0T2Zmc2V0ID0gLTE7CisgICAgICAgICplbmRP
ZmZzZXQgPSAtMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQXRrQXR0cmlidXRl
U2V0KiBkZWZhdWx0QXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2liaWxpdHlP
YmplY3QoZWxlbWVudCk7CisgICAgQXRrQXR0cmlidXRlU2V0KiBjaGlsZEF0dHJpYnV0ZXMgPSBn
ZXRBdHRyaWJ1dGVTZXRGb3JBY2Nlc3NpYmlsaXR5T2JqZWN0KGNoaWxkKTsKKworICAgIHJldHVy
biBhdHRyaWJ1dGVTZXREaWZmZXJlbmNlKGNoaWxkQXR0cmlidXRlcywgZGVmYXVsdEF0dHJpYnV0
ZXMpOworfQorCitzdGF0aWMgQXRrQXR0cmlidXRlU2V0KiB3ZWJraXRfYWNjZXNzaWJsZV90ZXh0
X2dldF9ydW5fYXR0cmlidXRlcyhBdGtUZXh0KiB0ZXh0LCBnaW50IG9mZnNldCwgZ2ludCogc3Rh
cnRPZmZzZXQsIGdpbnQqIGVuZE9mZnNldCkKK3sKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBj
b3JlT2JqZWN0ID0gY29yZSh0ZXh0KTsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIHJlc3VsdDsKKwor
ICAgIGlmICghY29yZU9iamVjdCkgeworICAgICAgICAqc3RhcnRPZmZzZXQgPSAwOworICAgICAg
ICAqZW5kT2Zmc2V0ID0gYXRrX3RleHRfZ2V0X2NoYXJhY3Rlcl9jb3VudCh0ZXh0KTsKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgb2Zm
c2V0ID0gYXRrX3RleHRfZ2V0X2NhcmV0X29mZnNldCh0ZXh0KTsKKworICAgIHJlc3VsdCA9IGdl
dFJ1bkF0dHJpYnV0ZXNGcm9tQWNjZXNpYmlsaXR5T2JqZWN0KGNvcmVPYmplY3QsIG9mZnNldCwg
c3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7CisKKyAgICBpZiAoKnN0YXJ0T2Zmc2V0IDwgMCkgewor
ICAgICAgICAqc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICplbmRPZmZzZXQgPSBvZmZz
ZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIEF0a0F0dHJpYnV0
ZVNldCogd2Via2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfZGVmYXVsdF9hdHRyaWJ1dGVzKEF0a1Rl
eHQqIHRleHQpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBB
Y2Nlc3NpYmlsaXR5T2JqZWN0KiBjb3JlT2JqZWN0ID0gY29yZSh0ZXh0KTsKKyAgICBpZiAoIWNv
cmVPYmplY3QgfHwgIWNvcmVPYmplY3QtPmlzQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCgpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBnZXRBdHRyaWJ1dGVTZXRGb3JBY2Nlc3Np
YmlsaXR5T2JqZWN0KGNvcmVPYmplY3QpOwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRfYWNjZXNz
aWJsZV90ZXh0X2dldF9jaGFyYWN0ZXJfZXh0ZW50cyhBdGtUZXh0KiB0ZXh0LCBnaW50IG9mZnNl
dCwgZ2ludCogeCwgZ2ludCogeSwgZ2ludCogd2lkdGgsIGdpbnQqIGhlaWdodCwgQXRrQ29vcmRU
eXBlIGNvb3JkcykKZGlmZiAtLWdpdCBhL1dlYktpdC9ndGsvQ2hhbmdlTG9nIGIvV2ViS2l0L2d0
ay9DaGFuZ2VMb2cKaW5kZXggMjQzNjUxZi4uODBiZjhiYiAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0
ay9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMCBAQAor
MjAxMC0wNi0wOSAgSm9zw6kgTWlsbMOhbiBTb3RvICA8am1pbGxhbkBpZ2FsaWEuY29tPgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHdGtdIFRleHQg
YXR0cmlidXRlcyBub3QgZXhwb3NlZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjU1MjgKKworICAgICAgICBBZGRlZCBuZXcgdGVzdHMgZm9yIGFjY2Vz
c2libGUgdGV4dCBhdHRyaWJ1dGVzCisKKyAgICAgICAgKiB0ZXN0cy90ZXN0YXRrLmM6CisgICAg
ICAgIChjb21wQXRrQXR0cmlidXRlKToKKyAgICAgICAgKGNvbXBBdGtBdHRyaWJ1dGVOYW1lKToK
KyAgICAgICAgKGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKToKKyAgICAgICAgKGF0
a0F0dHJpYnV0ZVNldEFyZUVxdWFsKToKKyAgICAgICAgKHRlc3RXZWJraXRBdGtUZXh0QXR0cmli
dXRlcyk6CisgICAgICAgIChtYWluKToKKwogMjAxMC0wNi0xMCAgRXJpYyBTZWlkZWwgIDxlcmlj
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBCYXJ0aC4KZGlmZiAtLWdp
dCBhL1dlYktpdC9ndGsvdGVzdHMvdGVzdGF0ay5jIGIvV2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRr
LmMKaW5kZXggMWYxYWIwYy4uYzFjZjliMiAxMDA2NDQKLS0tIGEvV2ViS2l0L2d0ay90ZXN0cy90
ZXN0YXRrLmMKKysrIGIvV2ViS2l0L2d0ay90ZXN0cy90ZXN0YXRrLmMKQEAgLTQwLDYgKzQwLDgg
QEAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnRlbnRzSW5QYXJhZ3JhcGhBbmRCb2R5TW9kZXJhdGUg
PSAiPGh0bWw+PGJvZHk+PHA+VGhpcyBpcwogCiBzdGF0aWMgY29uc3QgY2hhciogY29udGVudHNJ
blRhYmxlID0gIjxodG1sPjxib2R5Pjx0YWJsZT48dHI+PHRkPmZvbzwvdGQ+PHRkPmJhcjwvdGQ+
PC90cj48L3RhYmxlPjwvYm9keT48L2h0bWw+IjsKIAorc3RhdGljIGNvbnN0IGNoYXIqIHRleHRX
aXRoQXR0cmlidXRlcyA9ICI8aHRtbD48aGVhZD48c3R5bGU+LnN0MSB7Zm9udC1mYW1pbHk6IG1v
bm9zcGFjZTsgY29sb3I6cmdiKDEyMCwxMjEsMTIyKTt9IC5zdDIge3RleHQtZGVjb3JhdGlvbjp1
bmRlcmxpbmU7IGJhY2tncm91bmQtY29sb3I6cmdiKDgwLDgxLDgyKTt9PC9zdHlsZT48L2hlYWQ+
PGJvZHk+PHAgc3R5bGU9XCJmb250LXNpemU6MTQ7IHRleHQtYWxpZ246cmlnaHQ7XCI+VGhpcyBp
cyB0aGUgPGk+Zmlyc3Q8L2k+PGI+IHNlbnRlbmNlIG9mIHRoaXMgdGV4dC48L2I+PC9wPjxwIGNs
YXNzPVwic3QxXCI+VGhpcyBzZW50ZW5jZSBzaG91bGQgaGF2ZSBhbiBzdHlsZSBhcHBsaWVkIDxz
cGFuIGNsYXNzPVwic3QyXCI+YW5kIHRoaXMgcGFydCBzaG91bGQgaGF2ZSBhbm90aGVyIG9uZTwv
c3Bhbj4uPC9wPjxwPng8c3ViPjE8L3N1Yj48c3VwPjI8L3N1cD49eDxzdWI+Mjwvc3ViPjxzdXA+
Mzwvc3VwPjwvcD48cCBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPlRoaXMgc2VudGVuY2Ug
aXMgdGhlIDxzdHJpa2U+bGFzdDwvc3RyaWtlPiBvbmUuPC9wPjwvYm9keT48L2h0bWw+IjsKKwog
c3RhdGljIGdib29sZWFuIGJhaWxfb3V0KEdNYWluTG9vcCogbG9vcCkKIHsKICAgICBpZiAoZ19t
YWluX2xvb3BfaXNfcnVubmluZyhsb29wKSkKQEAgLTQ4MCw2ICs0ODIsMTcwIEBAIHN0YXRpYyB2
b2lkIHRlc3RXZWJraXRBdGtHZXRUZXh0SW5UYWJsZSh2b2lkKQogICAgIGdfb2JqZWN0X3VucmVm
KHdlYlZpZXcpOwogfQogCitzdGF0aWMgZ2ludCBjb21wQXRrQXR0cmlidXRlKEF0a0F0dHJpYnV0
ZSogYTEsIEF0a0F0dHJpYnV0ZSogYTIpCit7CisgICAgZ2ludCBzdHJjbXBWYWw7CisgICAgc3Ry
Y21wVmFsID0gZ19zdHJjbXAwKGExLT5uYW1lLCBhMi0+bmFtZSk7CisgICAgaWYgKHN0cmNtcFZh
bCkKKyAgICAgICAgcmV0dXJuIHN0cmNtcFZhbDsKKyAgICByZXR1cm4gZ19zdHJjbXAwKGExLT52
YWx1ZSwgYTItPnZhbHVlKTsKK30KKworc3RhdGljIGdpbnQgY29tcEF0a0F0dHJpYnV0ZU5hbWUo
QXRrQXR0cmlidXRlKiBhMSwgQXRrQXR0cmlidXRlKiBhMikKK3sKKyAgICByZXR1cm4gZ19zdHJj
bXAwKGExLT5uYW1lLCBhMi0+bmFtZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiBhdGtBdHRyaWJ1
dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShBdGtBdHRyaWJ1dGVTZXQqIHNldCwgQXRrVGV4dEF0dHJp
YnV0ZSBhdHRyaWJ1dGUsIGNvbnN0IGdjaGFyKiB2YWx1ZSkKK3sKKyAgICBHU0xpc3QgKmVsZW1l
bnQ7CisgICAgQXRrQXR0cmlidXRlIGF0OworICAgIGdib29sZWFuIHJlc3VsdDsKKyAgICBhdC5u
YW1lID0gKGdjaGFyICopYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKGF0dHJpYnV0ZSk7Cisg
ICAgZWxlbWVudCA9IGdfc2xpc3RfZmluZF9jdXN0b20oc2V0LCAmYXQsIChHQ29tcGFyZUZ1bmMp
Y29tcEF0a0F0dHJpYnV0ZU5hbWUpOworICAgIHJlc3VsdCA9IGVsZW1lbnQgJiYgIWdfc3RyY21w
MCgoKEF0a0F0dHJpYnV0ZSopKGVsZW1lbnQtPmRhdGEpKS0+dmFsdWUsIHZhbHVlKTsKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4gYXRrQXR0cmlidXRlU2V0QXJlRXF1
YWwoQXRrQXR0cmlidXRlU2V0KiBzZXQxLCBBdGtBdHRyaWJ1dGVTZXQqIHNldDIpCit7CisgICAg
aWYgKCFzZXQxKQorICAgICAgICByZXR1cm4gIXNldDI7CisKKyAgICBzZXQxID0gZ19zbGlzdF9z
b3J0KHNldDEsIChHQ29tcGFyZUZ1bmMpY29tcEF0a0F0dHJpYnV0ZSk7CisgICAgc2V0MiA9IGdf
c2xpc3Rfc29ydChzZXQyLCAoR0NvbXBhcmVGdW5jKWNvbXBBdGtBdHRyaWJ1dGUpOworCisgICAg
d2hpbGUgKHNldDEpIHsKKyAgICAgICAgaWYgKCFzZXQyIHx8IGNvbXBBdGtBdHRyaWJ1dGUoc2V0
MS0+ZGF0YSwgc2V0Mi0+ZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAg
ICAgc2V0MSA9IHNldDEtPm5leHQ7CisgICAgICAgIHNldDIgPSBzZXQyLT5uZXh0OworICAgIH0K
KworICAgIHJldHVybiAoIXNldDIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0V2Via2l0QXRrVGV4
dEF0dHJpYnV0ZXModm9pZCkKK3sKKyAgICBXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3OworICAgIEF0
a09iamVjdCogb2JqOworICAgIEF0a09iamVjdCogY2hpbGQ7CisgICAgR01haW5Mb29wKiBsb29w
OworICAgIEF0a1RleHQqIGNoaWxkVGV4dDsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIHNldDE7Cisg
ICAgQXRrQXR0cmlidXRlU2V0KiBzZXQyOworICAgIEF0a0F0dHJpYnV0ZVNldCogc2V0MzsKKyAg
ICBBdGtBdHRyaWJ1dGVTZXQqIHNldDQ7CisgICAgZ2ludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0
LCBsZW5ndGg7CisKKyAgICB3ZWJWaWV3ID0gV0VCS0lUX1dFQl9WSUVXKHdlYmtpdF93ZWJfdmll
d19uZXcoKSk7CisgICAgZ19vYmplY3RfcmVmX3Npbmsod2ViVmlldyk7CisgICAgR3RrQWxsb2Nh
dGlvbiBhbGxvYyA9IHsgMCwgMCwgODAwLCA2MDAgfTsKKyAgICBndGtfd2lkZ2V0X3NpemVfYWxs
b2NhdGUoR1RLX1dJREdFVCh3ZWJWaWV3KSwgJmFsbG9jKTsKKworICAgIHdlYmtpdF93ZWJfdmll
d19sb2FkX3N0cmluZyh3ZWJWaWV3LCB0ZXh0V2l0aEF0dHJpYnV0ZXMsIE5VTEwsIE5VTEwsIE5V
TEwpOworICAgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcoTlVMTCwgVFJVRSk7CisKKyAgICBnX3Rp
bWVvdXRfYWRkKDEwMCwgKEdTb3VyY2VGdW5jKWJhaWxfb3V0LCBsb29wKTsKKyAgICBnX21haW5f
bG9vcF9ydW4obG9vcCk7CisKKyAgICBvYmogPSBndGtfd2lkZ2V0X2dldF9hY2Nlc3NpYmxlKEdU
S19XSURHRVQod2ViVmlldykpOworICAgIGdfYXNzZXJ0KG9iaik7CisKKyAgICBjaGlsZCA9IGF0
a19vYmplY3RfcmVmX2FjY2Vzc2libGVfY2hpbGQob2JqLCAwKTsKKyAgICBnX2Fzc2VydChjaGls
ZCAmJiBBVEtfSVNfVEVYVChjaGlsZCkpOworICAgIGNoaWxkVGV4dCA9IEFUS19URVhUKGNoaWxk
KTsKKyAgICBzZXQxID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMCwg
JnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRPZmZz
ZXQsID09LCAwKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoZW5kT2Zmc2V0LCA9PSwgMTIpOworICAg
IGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEFyZUVxdWFsKHNldDEsIE5VTEwpKTsKKworICAgIHNl
dDIgPSBhdGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCAxNSwgJnN0YXJ0T2Zm
c2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRPZmZzZXQsID09LCAx
Mik7CisgICAgZ19hc3NlcnRfY21waW50KGVuZE9mZnNldCwgPT0sIDE3KTsKKyAgICBnX2Fzc2Vy
dChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQyLCBBVEtfVEVYVF9BVFRSX1NU
WUxFLCAiaXRhbGljIikpOworCisgICAgc2V0MyA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRl
cyhjaGlsZFRleHQsIDE3LCAmc3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAgIGdfYXNzZXJ0
X2NtcGludChzdGFydE9mZnNldCwgPT0sIDE3KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoZW5kT2Zm
c2V0LCA9PSwgNDApOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1Zh
bHVlKHNldDMsIEFUS19URVhUX0FUVFJfV0VJR0hULCAiNzAwIikpOworCisgICAgc2V0NCA9IGF0
a190ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0ZXMoY2hpbGRUZXh0KTsKKyAgICBnX2Fzc2VydChh
dGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQ0LCBBVEtfVEVYVF9BVFRSX1NUWUxF
LCAibm9ybWFsIikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1Zh
bHVlKHNldDQsIEFUS19URVhUX0FUVFJfSlVTVElGSUNBVElPTiwgInJpZ2h0IikpOworICAgIGdf
YXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDQsIEFUS19URVhUX0FU
VFJfU0laRSwgIjE0IikpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0MSk7CisgICAg
YXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQyKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVl
KHNldDMpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0NCk7CisKKyAgICBjaGlsZCA9
IGF0a19vYmplY3RfcmVmX2FjY2Vzc2libGVfY2hpbGQob2JqLCAxKTsKKyAgICBnX2Fzc2VydChj
aGlsZCAmJiBBVEtfSVNfVEVYVChjaGlsZCkpOworICAgIGNoaWxkVGV4dCA9IEFUS19URVhUKGNo
aWxkKTsKKworICAgIHNldDEgPSBhdGtfdGV4dF9nZXRfZGVmYXVsdF9hdHRyaWJ1dGVzKGNoaWxk
VGV4dCk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0
MSwgQVRLX1RFWFRfQVRUUl9GQU1JTFlfTkFNRSwgIm1vbm9zcGFjZSIpKTsKKyAgICBnX2Fzc2Vy
dChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQxLCBBVEtfVEVYVF9BVFRSX1NU
WUxFLCAibm9ybWFsIikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhh
c1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJfU1RSSUtFVEhST1VHSCwgImZhbHNlIikpOworICAg
IGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhU
X0FUVFJfV0VJR0hULCAiNDAwIikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJp
YnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJfRkdfQ09MT1IsICIxMjAsMTIxLDEyMiIp
KTsKKworICAgIHNldDIgPSBhdGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCA0
MywgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRP
ZmZzZXQsID09LCA0Myk7CisgICAgZ19hc3NlcnRfY21waW50KGVuZE9mZnNldCwgPT0sIDgwKTsK
KyAgICAvLyBDaGVja3MgdGhhdCBkZWZhdWx0IGF0dHJpYnV0ZXMgb2YgdGV4dCBhcmUgbm90IHJl
dHVybmVkIHdoZW4gY2FsbGVkIHRvIGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcworICAgIGdf
YXNzZXJ0KCFhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQyLCBBVEtfVEVYVF9B
VFRSX0ZHX0NPTE9SLCAiMTIwLDEyMSwxMjIiKSk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRl
U2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0MiwgQVRLX1RFWFRfQVRUUl9VTkRFUkxJTkUsICJzaW5n
bGUiKSk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0
MiwgQVRLX1RFWFRfQVRUUl9CR19DT0xPUiwgIjgwLDgxLDgyIikpOworICAgIGF0a19hdHRyaWJ1
dGVfc2V0X2ZyZWUoc2V0MSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQyKTsKKwor
ICAgIGNoaWxkID0gYXRrX29iamVjdF9yZWZfYWNjZXNzaWJsZV9jaGlsZChvYmosIDIpOworICAg
IGdfYXNzZXJ0KGNoaWxkICYmIEFUS19JU19URVhUKGNoaWxkKSk7CisgICAgY2hpbGRUZXh0ID0g
QVRLX1RFWFQoY2hpbGQpOworCisgICAgc2V0MSA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRl
cyhjaGlsZFRleHQsIDAsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgc2V0MiA9IGF0
a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDMsICZzdGFydE9mZnNldCwgJmVu
ZE9mZnNldCk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwoc2V0MSwgc2V0
MikpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Mik7CisKKyAgICBzZXQyID0gYXRr
X3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMSwgJnN0YXJ0T2Zmc2V0LCAmZW5k
T2Zmc2V0KTsKKyAgICBzZXQzID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4
dCwgNSwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1
dGVTZXRBcmVFcXVhbChzZXQyLCBzZXQzKSk7CisgICAgZ19hc3NlcnQoIWF0a0F0dHJpYnV0ZVNl
dEFyZUVxdWFsKHNldDEsIHNldDIpKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDMp
OworCisgICAgc2V0MyA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDIs
ICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgc2V0NCA9IGF0a190ZXh0X2dldF9ydW5f
YXR0cmlidXRlcyhjaGlsZFRleHQsIDYsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAg
Z19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwoc2V0Mywgc2V0NCkpOworICAgIGdfYXNz
ZXJ0KCFhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQxLCBzZXQzKSk7CisgICAgZ19hc3NlcnQo
IWF0a0F0dHJpYnV0ZVNldEFyZUVxdWFsKHNldDIsIHNldDMpKTsKKyAgICBhdGtfYXR0cmlidXRl
X3NldF9mcmVlKHNldDEpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Mik7CisgICAg
YXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQzKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVl
KHNldDQpOworCisgICAgY2hpbGQgPSBhdGtfb2JqZWN0X3JlZl9hY2Nlc3NpYmxlX2NoaWxkKG9i
aiwgMyk7CisgICAgZ19hc3NlcnQoY2hpbGQgJiYgQVRLX0lTX1RFWFQoY2hpbGQpKTsKKyAgICBj
aGlsZFRleHQgPSBBVEtfVEVYVChjaGlsZCk7CisgICAgc2V0MSA9IGF0a190ZXh0X2dldF9ydW5f
YXR0cmlidXRlcyhjaGlsZFRleHQsIDI0LCAmc3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAg
IGdfYXNzZXJ0X2NtcGludChzdGFydE9mZnNldCwgPT0sIDIxKTsKKyAgICBnX2Fzc2VydF9jbXBp
bnQoZW5kT2Zmc2V0LCA9PSwgMjUpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJp
YnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJfU1RSSUtFVEhST1VHSCwgInRydWUiKSk7
CisKKyAgICBzZXQyID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMjUs
ICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgZ19hc3NlcnRfY21waW50KHN0YXJ0T2Zm
c2V0LCA9PSwgMjUpOworICAgIGdfYXNzZXJ0X2NtcGludChlbmRPZmZzZXQsID09LCAzMCk7Cisg
ICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwoc2V0MiwgTlVMTCkpOworCisgICAg
c2V0MyA9IGF0a190ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0ZXMoY2hpbGRUZXh0KTsKKyAgICBn
X2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQzLCBBVEtfVEVYVF9B
VFRSX0pVU1RJRklDQVRJT04sICJjZW50ZXIiKSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJl
ZShzZXQxKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDIpOworICAgIGF0a19hdHRy
aWJ1dGVfc2V0X2ZyZWUoc2V0Myk7Cit9CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJn
dikKIHsKICAgICBnX3RocmVhZF9pbml0KE5VTEwpOwpAQCAtNDk0LDYgKzY2MCw3IEBAIGludCBt
YWluKGludCBhcmdjLCBjaGFyKiogYXJndikKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQv
YXRrL2dldFRleHRJblBhcmFncmFwaEFuZEJvZHlTaW1wbGUiLCB0ZXN0V2Via2l0QXRrR2V0VGV4
dEluUGFyYWdyYXBoQW5kQm9keVNpbXBsZSk7CiAgICAgZ190ZXN0X2FkZF9mdW5jKCIvd2Via2l0
L2F0ay9nZXRUZXh0SW5QYXJhZ3JhcGhBbmRCb2R5TW9kZXJhdGUiLCB0ZXN0V2Via2l0QXRrR2V0
VGV4dEluUGFyYWdyYXBoQW5kQm9keU1vZGVyYXRlKTsKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93
ZWJraXQvYXRrL2dldFRleHRJblRhYmxlIiwgdGVzdFdlYmtpdEF0a0dldFRleHRJblRhYmxlKTsK
KyAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL3Rlc3RXZWJraXRBdGtUZXh0QXR0cmli
dXRlcyIsIHRlc3RXZWJraXRBdGtUZXh0QXR0cmlidXRlcyk7CiAgICAgcmV0dXJuIGdfdGVzdF9y
dW4gKCk7CiB9CiAKLS0gCjEuNy4wLjQKCg==
</data>
<flag name="review"
          id="45071"
          type_id="1"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>60022</attachid>
            <date>2010-06-29 07:54:54 -0700</date>
            <delta_ts>2010-06-30 01:12:12 -0700</delta_ts>
            <desc>webkit_accessible_text_get_default_attributes and webkit_accessible_text_get_run_attributes implementation</desc>
            <filename>0001-2010-06-09-Jos-Mill-n-Soto-jmillan-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>22196</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSAzODIwZmI0YWU2MWJmZjUzYjk0YTI4MGQ5ZGQxMzNlZmZhYTlkYTdkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBNb24sIDE0IEp1biAyMDEwIDE5OjQ2OjAyICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gPT9VVEYtOD9xPzIwMTAtMDYtMDk9MjA9MjBKb3M9QzM9QTk9MjBNaWxsPUMzPUExbj0yMFNv
dG89MjA9MjA8am1pbGxhbkBpZ2FsaWEuY29tPj89Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQt
VHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n
OiA4Yml0CgogICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgoKICAgICAgICBbR3Rr
XSBUZXh0IGF0dHJpYnV0ZXMgbm90IGV4cG9zZWQKICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU1MjgKCiAgICAgICAgSW1wbGVtZW50ZWQgdGhlIGdldF9y
dW5fYXR0cmlidXRlcyBhbmQgZ2V0X2RlZmF1bHRfYXR0cmlidXRlcwogICAgICAgIGZ1bmN0aW9u
cyBmb3IgdGhlIEFUS19URVhUIHJvbGUuCgogICAgICAgICogYWNjZXNzaWJpbGl0eS9ndGsvQWNj
ZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgogICAgICAgIChnZXRBdHRyaWJ1dGVTZXRG
b3JBY2Nlc3NpYmlsaXR5T2JqZWN0KToKICAgICAgICAoY29tcGFyZUF0dHJpYnV0ZSk6CiAgICAg
ICAgKGF0dHJpYnV0ZVNldERpZmZlcmVuY2UpOgogICAgICAgIChhY2Nlc3NpYmlsaXR5T2JqZWN0
TGVuZ3RoKToKICAgICAgICAoZ2V0QWNjZXNzaWJpbGl0eU9iamVjdEZvck9mZnNldCk6CiAgICAg
ICAgKGdldFJ1bkF0dHJpYnV0ZXNGcm9tQWNjZXNpYmlsaXR5T2JqZWN0KToKICAgICAgICAod2Vi
a2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMpOgogICAgICAgICh3ZWJraXRf
YWNjZXNzaWJsZV90ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0ZXMpOgoKMjAxMC0wNi0wOSAgSm9z
w6kgTWlsbMOhbiBTb3RvICA8am1pbGxhbkBpZ2FsaWEuY29tPgoKICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KCiAgICAgICAgW0d0a10gVGV4dCBhdHRyaWJ1dGVzIG5vdCBleHBv
c2VkCiAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1NTI4
CgogICAgICAgIEFkZGVkIG5ldyB0ZXN0cyBmb3IgYWNjZXNzaWJsZSB0ZXh0IGF0dHJpYnV0ZXMK
CiAgICAgICAgKiB0ZXN0cy90ZXN0YXRrLmM6CiAgICAgICAgKGNvbXBBdGtBdHRyaWJ1dGUpOgog
ICAgICAgIChjb21wQXRrQXR0cmlidXRlTmFtZSk6CiAgICAgICAgKGF0a0F0dHJpYnV0ZVNldEF0
dHJpYnV0ZUhhc1ZhbHVlKToKICAgICAgICAoYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwpOgogICAg
ICAgICh0ZXN0V2Via2l0QXRrVGV4dEF0dHJpYnV0ZXMpOgogICAgICAgIChtYWluKToKLS0tCiBX
ZWJDb3JlL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjAg
KysKIC4uLi9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwICAgICAgICAgIHwg
IDI1MiArKysrKysrKysrKysrKysrKysrLQogV2ViS2l0L2d0ay9DaGFuZ2VMb2cgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfCAgIDE3ICsrCiBXZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsu
YyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNjcgKysrKysrKysrKysrKwogNCBmaWxlcyBj
aGFuZ2VkLCA0NTEgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL0NoYW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IGI1ZWQyZGQuLmU1MGRk
OGEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9n
CkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDYtMDkgIEpvc8OpIE1pbGzDoW4gU290byAgPGptaWxs
YW5AaWdhbGlhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBbR3RrXSBUZXh0IGF0dHJpYnV0ZXMgbm90IGV4cG9zZWQKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1NTI4CisKKyAgICAgICAgSW1wbGVt
ZW50ZWQgdGhlIGdldF9ydW5fYXR0cmlidXRlcyBhbmQgZ2V0X2RlZmF1bHRfYXR0cmlidXRlcwor
ICAgICAgICBmdW5jdGlvbnMgZm9yIHRoZSBBVEtfVEVYVCByb2xlLgorCisgICAgICAgICogYWNj
ZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgorICAgICAg
ICAoZ2V0QXR0cmlidXRlU2V0Rm9yQWNjZXNzaWJpbGl0eU9iamVjdCk6CisgICAgICAgIChjb21w
YXJlQXR0cmlidXRlKToKKyAgICAgICAgKGF0dHJpYnV0ZVNldERpZmZlcmVuY2UpOgorICAgICAg
ICAoYWNjZXNzaWJpbGl0eU9iamVjdExlbmd0aCk6CisgICAgICAgIChnZXRBY2Nlc3NpYmlsaXR5
T2JqZWN0Rm9yT2Zmc2V0KToKKyAgICAgICAgKGdldFJ1bkF0dHJpYnV0ZXNGcm9tQWNjZXNpYmls
aXR5T2JqZWN0KToKKyAgICAgICAgKHdlYmtpdF9hY2Nlc3NpYmxlX3RleHRfZ2V0X3J1bl9hdHRy
aWJ1dGVzKToKKyAgICAgICAgKHdlYmtpdF9hY2Nlc3NpYmxlX3RleHRfZ2V0X2RlZmF1bHRfYXR0
cmlidXRlcyk6CisKIDIwMTAtMDYtMjggIENzYWJhIE9zenRyb2dvbsOhYyAgPG9zc3lAd2Via2l0
Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW50IFRhbXVyYS4KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3Bw
IGIvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0
ay5jcHAKaW5kZXggNWMwYTgzOC4uM2Q3ZTcxMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAKKysrIGIvV2ViQ29y
ZS9hY2Nlc3NpYmlsaXR5L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAKQEAg
LTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlICJFZGl0b3IuaCIKICNpbmNsdWRlICJGcmFtZS5oIgog
I2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdPd25QdHIuaCIKICNpbmNsdWRlICJI
b3N0V2luZG93LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTFRhYmxl
Q2FwdGlvbkVsZW1lbnQuaCIKQEAgLTEwMDUsMTYgKzEwMDYsMjU3IEBAIHN0YXRpYyBnaW50IHdl
YmtpdF9hY2Nlc3NpYmxlX3RleHRfZ2V0X2NhcmV0X29mZnNldChBdGtUZXh0KiB0ZXh0KQogICAg
IHJldHVybiBvZmZzZXQ7CiB9CiAKLXN0YXRpYyBBdGtBdHRyaWJ1dGVTZXQqIHdlYmtpdF9hY2Nl
c3NpYmxlX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKEF0a1RleHQqIHRleHQsIGdpbnQgb2Zmc2V0
LCBnaW50KiBzdGFydF9vZmZzZXQsIGdpbnQqIGVuZF9vZmZzZXQpCitzdGF0aWMgQXRrQXR0cmli
dXRlU2V0KiBnZXRBdHRyaWJ1dGVTZXRGb3JBY2Nlc3NpYmlsaXR5T2JqZWN0KGNvbnN0IEFjY2Vz
c2liaWxpdHlPYmplY3QqIG9iamVjdCkKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJl
dHVybiAwOworICAgIGlmICghb2JqZWN0LT5pc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSkK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdCo+KG9iamVjdCktPnJlbmRlcmVy
KCk7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gcmVuZGVyZXItPnN0eWxlKCk7CisKKyAgICBB
dGtBdHRyaWJ1dGVTZXQqIHJlc3VsdCA9IDA7CisgICAgR093blB0cjxnY2hhcj4gYnVmZmVyKGdf
c3RyZHVwX3ByaW50ZigiJWkiLCBzdHlsZS0+Zm9udFNpemUoKSkpOworICAgIHJlc3VsdCA9IGFk
ZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19U
RVhUX0FUVFJfU0laRSksIGJ1ZmZlci5nZXQoKSk7CisKKyAgICBDb2xvciBiZ0NvbG9yID0gc3R5
bGUtPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcik7Cisg
ICAgaWYgKGJnQ29sb3IuaXNWYWxpZCgpKSB7CisgICAgICAgIGJ1ZmZlci5zZXQoZ19zdHJkdXBf
cHJpbnRmKCIlaSwlaSwlaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJn
Q29sb3IucmVkKCksIGJnQ29sb3IuZ3JlZW4oKSwgYmdDb2xvci5ibHVlKCkpKTsKKyAgICAgICAg
cmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0
X25hbWUoQVRLX1RFWFRfQVRUUl9CR19DT0xPUiksIGJ1ZmZlci5nZXQoKSk7CisgICAgfQorCisg
ICAgQ29sb3IgZmdDb2xvciA9IHN0eWxlLT52aXNpdGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVy
dHlDb2xvcik7CisgICAgaWYgKGZnQ29sb3IuaXNWYWxpZCgpKSB7CisgICAgICAgIGJ1ZmZlci5z
ZXQoZ19zdHJkdXBfcHJpbnRmKCIlaSwlaSwlaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZnQ29sb3IucmVkKCksIGZnQ29sb3IuZ3JlZW4oKSwgZmdDb2xvci5ibHVlKCkp
KTsKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9h
dHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9GR19DT0xPUiksIGJ1ZmZlci5nZXQoKSk7
CisgICAgfQorCisgICAgaW50IGJhc2VsaW5lUG9zaXRpb247CisgICAgYm9vbCBpbmNsdWRlUmlz
ZSA9IHRydWU7CisgICAgc3dpdGNoIChzdHlsZS0+dmVydGljYWxBbGlnbigpKSB7CisgICAgY2Fz
ZSBTVUI6CisgICAgICAgIGJhc2VsaW5lUG9zaXRpb24gPSAtMSAqIHJlbmRlcmVyLT5iYXNlbGlu
ZVBvc2l0aW9uKHRydWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNVUEVSOgorICAgICAg
ICBiYXNlbGluZVBvc2l0aW9uID0gcmVuZGVyZXItPmJhc2VsaW5lUG9zaXRpb24odHJ1ZSk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgQkFTRUxJTkU6CisgICAgICAgIGJhc2VsaW5lUG9zaXRp
b24gPSAwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpbmNsdWRlUmlz
ZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaW5jbHVkZVJpc2Up
IHsKKyAgICAgICAgYnVmZmVyLnNldChnX3N0cmR1cF9wcmludGYoIiVpIiwgYmFzZWxpbmVQb3Np
dGlvbikpOworICAgICAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1NldChyZXN1bHQsIGF0a190
ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX1JJU0UpLCBidWZmZXIuZ2V0KCkp
OworICAgIH0KKworICAgIGludCBpbmRlbnRhdGlvbiA9IHN0eWxlLT50ZXh0SW5kZW50KCkuY2Fs
Y1ZhbHVlKG9iamVjdC0+c2l6ZSgpLndpZHRoKCkpOworICAgIGlmIChpbmRlbnRhdGlvbiAhPSB1
bmRlZmluZWRMZW5ndGgpIHsKKyAgICAgICAgYnVmZmVyLnNldChnX3N0cmR1cF9wcmludGYoIiVp
IiwgaW5kZW50YXRpb24pKTsKKyAgICAgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVz
dWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9JTkRFTlQpLCBi
dWZmZXIuZ2V0KCkpOworICAgIH0KKworICAgIFN0cmluZyBmb250RmFtaWx5TmFtZSA9IHN0eWxl
LT5mb250KCkuZmFtaWx5KCkuZmFtaWx5KCkuc3RyaW5nKCk7CisgICAgaWYgKGZvbnRGYW1pbHlO
YW1lLmxlZnQoOCkgPT0gIi13ZWJraXQtIikKKyAgICAgICAgZm9udEZhbWlseU5hbWUgPSBmb250
RmFtaWx5TmFtZS5zdWJzdHJpbmcoOCk7CisKKyAgICByZXN1bHQgPSBhZGRBdHRyaWJ1dGVUb1Nl
dChyZXN1bHQsIGF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShBVEtfVEVYVF9BVFRSX0ZBTUlM
WV9OQU1FKSwgZm9udEZhbWlseU5hbWUudXRmOCgpLmRhdGEoKSk7CisKKyAgICBpbnQgZm9udFdl
aWdodCA9IC0xOworICAgIHN3aXRjaCAoc3R5bGUtPmZvbnQoKS53ZWlnaHQoKSkgeworICAgIGNh
c2UgRm9udFdlaWdodDEwMDoKKyAgICAgICAgZm9udFdlaWdodCA9IDEwMDsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBGb250V2VpZ2h0MjAwOgorICAgICAgICBmb250V2VpZ2h0ID0gMjAwOwor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvbnRXZWlnaHQzMDA6CisgICAgICAgIGZvbnRXZWln
aHQgPSAzMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9udFdlaWdodDQwMDoKKyAgICAg
ICAgZm9udFdlaWdodCA9IDQwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0
NTAwOgorICAgICAgICBmb250V2VpZ2h0ID0gNTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IEZvbnRXZWlnaHQ2MDA6CisgICAgICAgIGZvbnRXZWlnaHQgPSA2MDA7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgRm9udFdlaWdodDcwMDoKKyAgICAgICAgZm9udFdlaWdodCA9IDcwMDsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250V2VpZ2h0ODAwOgorICAgICAgICBmb250V2VpZ2h0
ID0gODAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvbnRXZWlnaHQ5MDA6CisgICAgICAg
IGZvbnRXZWlnaHQgPSA5MDA7CisgICAgfQorICAgIGlmIChmb250V2VpZ2h0ID4gMCkgeworICAg
ICAgICBidWZmZXIuc2V0KGdfc3RyZHVwX3ByaW50ZigiJWkiLCBmb250V2VpZ2h0KSk7CisgICAg
ICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRl
X2dldF9uYW1lKEFUS19URVhUX0FUVFJfV0VJR0hUKSwgYnVmZmVyLmdldCgpKTsKKyAgICB9CisK
KyAgICBzd2l0Y2ggKHN0eWxlLT50ZXh0QWxpZ24oKSkgeworICAgIGNhc2UgVEFBVVRPOgorICAg
ICAgICBicmVhazsKKyAgICBjYXNlIExFRlQ6CisgICAgY2FzZSBXRUJLSVRfTEVGVDoKKyAgICAg
ICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVf
Z2V0X25hbWUoQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9OKSwgImxlZnQiKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBSSUdIVDoKKyAgICBjYXNlIFdFQktJVF9SSUdIVDoKKyAgICAgICAg
cmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0
X25hbWUoQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9OKSwgInJpZ2h0Iik7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ0VOVEVSOgorICAgIGNhc2UgV0VCS0lUX0NFTlRFUjoKKyAgICAgICAg
cmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0
X25hbWUoQVRLX1RFWFRfQVRUUl9KVVNUSUZJQ0FUSU9OKSwgImNlbnRlciIpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEpVU1RJRlk6CisgICAgICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0ZVRv
U2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJfSlVT
VElGSUNBVElPTiksICJmaWxsIik7CisgICAgfQorCisgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRl
VG9TZXQocmVzdWx0LCBhdGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9V
TkRFUkxJTkUpLCAoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkgJiBVTkRFUkxJTkUpID8gInNpbmds
ZSIgOiAibm9uZSIpOworCisgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBh
dGtfdGV4dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9TVFlMRSksIHN0eWxlLT5m
b250KCkuaXRhbGljKCkgPyAiaXRhbGljIiA6ICJub3JtYWwiKTsKKworICAgIHJlc3VsdCA9IGFk
ZEF0dHJpYnV0ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19U
RVhUX0FUVFJfU1RSSUtFVEhST1VHSCksIChzdHlsZS0+dGV4dERlY29yYXRpb24oKSAmIExJTkVf
VEhST1VHSCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworICAgIHJlc3VsdCA9IGFkZEF0dHJpYnV0
ZVRvU2V0KHJlc3VsdCwgYXRrX3RleHRfYXR0cmlidXRlX2dldF9uYW1lKEFUS19URVhUX0FUVFJf
SU5WSVNJQkxFKSwgKHN0eWxlLT52aXNpYmlsaXR5KCkgPT0gSElEREVOKSA/ICJ0cnVlIiA6ICJm
YWxzZSIpOworCisgICAgcmVzdWx0ID0gYWRkQXR0cmlidXRlVG9TZXQocmVzdWx0LCBhdGtfdGV4
dF9hdHRyaWJ1dGVfZ2V0X25hbWUoQVRLX1RFWFRfQVRUUl9FRElUQUJMRSksIG9iamVjdC0+aXNS
ZWFkT25seSgpID8gImZhbHNlIiA6ICJ0cnVlIik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CitzdGF0aWMgZ2ludCBjb21wYXJlQXR0cmlidXRlKGNvbnN0IEF0a0F0dHJpYnV0ZSogYSwgY29u
c3QgQXRrQXR0cmlidXRlKiBiKQoreworICAgIHJldHVybiBnX3N0cmNtcDAoYS0+bmFtZSwgYi0+
bmFtZSkgfHwgZ19zdHJjbXAwKGEtPnZhbHVlLCBiLT52YWx1ZSk7Cit9CisKKy8vIFJldHVybnMg
YW4gQXRrQXR0cmlidXRlU2V0IHdpdGggdGhlIGVsZW1lbnRzIG9mIGExIHdoaWNoIGFyZSBlaXRo
ZXIKKy8vIG5vdCBwcmVzZW50IG9yIGRpZmZlcmVudCBpbiBhMi4gIE5laXRoZXIgYTEgbm9yIGEy
IHNob3VsZCBiZSB1c2VkCisvLyBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCitzdGF0aWMg
QXRrQXR0cmlidXRlU2V0KiBhdHRyaWJ1dGVTZXREaWZmZXJlbmNlKEF0a0F0dHJpYnV0ZVNldCog
YTEsIEF0a0F0dHJpYnV0ZVNldCogYTIpCit7CisgICAgaWYgKCFhMikKKyAgICAgICAgcmV0dXJu
IGExOworCisgICAgQXRrQXR0cmlidXRlU2V0KiBpID0gYTE7CisgICAgQXRrQXR0cmlidXRlU2V0
KiBmb3VuZDsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIHRvRGVsZXRlID0gMDsKKworICAgIHdoaWxl
IChpKSB7CisgICAgICAgIGZvdW5kID0gZ19zbGlzdF9maW5kX2N1c3RvbShhMiwgaS0+ZGF0YSwg
KEdDb21wYXJlRnVuYyljb21wYXJlQXR0cmlidXRlKTsKKyAgICAgICAgaWYgKGZvdW5kKSB7Cisg
ICAgICAgICAgICBBdGtBdHRyaWJ1dGVTZXQqIHQgPSBpLT5uZXh0OworICAgICAgICAgICAgdG9E
ZWxldGUgPSBnX3NsaXN0X3ByZXBlbmQodG9EZWxldGUsIGktPmRhdGEpOworICAgICAgICAgICAg
YTEgPSBnX3NsaXN0X2RlbGV0ZV9saW5rKGExLCBpKTsKKyAgICAgICAgICAgIGkgPSB0OworICAg
ICAgICB9IGVsc2UKKyAgICAgICAgICAgIGkgPSBpLT5uZXh0OworICAgIH0KKworICAgIGF0a19h
dHRyaWJ1dGVfc2V0X2ZyZWUoYTIpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUodG9EZWxl
dGUpOworICAgIHJldHVybiBhMTsKK30KKworc3RhdGljIGd1aW50IGFjY2Vzc2liaWxpdHlPYmpl
Y3RMZW5ndGgoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqZWN0KQoreworICAgIEdPd25Q
dHI8Z2NoYXI+IHRleHQod2Via2l0X2FjY2Vzc2libGVfdGV4dF9nZXRfdGV4dChBVEtfVEVYVChv
YmplY3QtPndyYXBwZXIoKSksIDAsIC0xKSk7CisgICAgcmV0dXJuIGdfdXRmOF9zdHJsZW4odGV4
dC5nZXQoKSwgLTEpOworfQorCitzdGF0aWMgY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogZ2V0
QWNjZXNzaWJpbGl0eU9iamVjdEZvck9mZnNldChjb25zdCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBv
YmplY3QsIGd1aW50IG9mZnNldCwgZ2ludCogc3RhcnRPZmZzZXQsIGdpbnQqIGVuZE9mZnNldCkK
K3sKKyAgICBjb25zdCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiByZXN1bHQ7CisgICAgZ3VpbnQgbGVu
Z3RoID0gYWNjZXNzaWJpbGl0eU9iamVjdExlbmd0aChvYmplY3QpOworICAgIGlmIChsZW5ndGgg
PiBvZmZzZXQpIHsKKyAgICAgICAgKnN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgICAgKmVuZE9mZnNl
dCA9IGxlbmd0aDsKKyAgICAgICAgcmVzdWx0ID0gb2JqZWN0OworICAgIH0gZWxzZSB7CisgICAg
ICAgICpzdGFydE9mZnNldCA9IC0xOworICAgICAgICAqZW5kT2Zmc2V0ID0gLTE7CisgICAgICAg
IHJlc3VsdCA9IDA7CisgICAgfQorCisgICAgaWYgKCFvYmplY3QtPmZpcnN0Q2hpbGQoKSkKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNoaWxkID0g
b2JqZWN0LT5maXJzdENoaWxkKCk7CisgICAgZ3VpbnQgY3VycmVudE9mZnNldCA9IDA7CisgICAg
Z3VpbnQgY2hpbGRQb3NpdGlvbiA9IDA7CisgICAgd2hpbGUgKGNoaWxkICYmIGN1cnJlbnRPZmZz
ZXQgPD0gb2Zmc2V0KSB7CisgICAgICAgIGd1aW50IGNoaWxkTGVuZ3RoID0gYWNjZXNzaWJpbGl0
eU9iamVjdExlbmd0aChjaGlsZCk7CisgICAgICAgIGN1cnJlbnRPZmZzZXQgPSBjaGlsZExlbmd0
aCArIGNoaWxkUG9zaXRpb247CisgICAgICAgIGlmIChjdXJyZW50T2Zmc2V0ID4gb2Zmc2V0KSB7
CisgICAgICAgICAgICBnaW50IGNoaWxkU3RhcnRPZmZzZXQ7CisgICAgICAgICAgICBnaW50IGNo
aWxkRW5kT2Zmc2V0OworICAgICAgICAgICAgY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCogZ3Jh
bmRDaGlsZCA9IGdldEFjY2Vzc2liaWxpdHlPYmplY3RGb3JPZmZzZXQoY2hpbGQsIG9mZnNldC1j
aGlsZFBvc2l0aW9uLCAgJmNoaWxkU3RhcnRPZmZzZXQsICZjaGlsZEVuZE9mZnNldCk7CisgICAg
ICAgICAgICBpZiAoY2hpbGRTdGFydE9mZnNldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgKnN0
YXJ0T2Zmc2V0ID0gY2hpbGRTdGFydE9mZnNldCArIGNoaWxkUG9zaXRpb247CisgICAgICAgICAg
ICAgICAgKmVuZE9mZnNldCA9IGNoaWxkRW5kT2Zmc2V0ICsgY2hpbGRQb3NpdGlvbjsKKyAgICAg
ICAgICAgICAgICByZXN1bHQgPSBncmFuZENoaWxkOworICAgICAgICAgICAgfQorICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgY2hpbGRQb3NpdGlvbiArPSBjaGlsZExlbmd0aDsKKyAgICAg
ICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEF0a0F0dHJpYnV0ZVNldCogZ2V0UnVuQXR0
cmlidXRlc0Zyb21BY2Nlc2liaWxpdHlPYmplY3QoY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCog
ZWxlbWVudCwgZ2ludCBvZmZzZXQsIGdpbnQqIHN0YXJ0T2Zmc2V0LCBnaW50KiBlbmRPZmZzZXQp
Cit7CisgICAgY29uc3QgQWNjZXNzaWJpbGl0eU9iamVjdCAqY2hpbGQgPSBnZXRBY2Nlc3NpYmls
aXR5T2JqZWN0Rm9yT2Zmc2V0KGVsZW1lbnQsIG9mZnNldCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNl
dCk7CisgICAgaWYgKCFjaGlsZCkgeworICAgICAgICAqc3RhcnRPZmZzZXQgPSAtMTsKKyAgICAg
ICAgKmVuZE9mZnNldCA9IC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBBdGtB
dHRyaWJ1dGVTZXQqIGRlZmF1bHRBdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlU2V0Rm9yQWNjZXNz
aWJpbGl0eU9iamVjdChlbGVtZW50KTsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIGNoaWxkQXR0cmli
dXRlcyA9IGdldEF0dHJpYnV0ZVNldEZvckFjY2Vzc2liaWxpdHlPYmplY3QoY2hpbGQpOworCisg
ICAgcmV0dXJuIGF0dHJpYnV0ZVNldERpZmZlcmVuY2UoY2hpbGRBdHRyaWJ1dGVzLCBkZWZhdWx0
QXR0cmlidXRlcyk7Cit9CisKK3N0YXRpYyBBdGtBdHRyaWJ1dGVTZXQqIHdlYmtpdF9hY2Nlc3Np
YmxlX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKEF0a1RleHQqIHRleHQsIGdpbnQgb2Zmc2V0LCBn
aW50KiBzdGFydE9mZnNldCwgZ2ludCogZW5kT2Zmc2V0KQoreworICAgIEFjY2Vzc2liaWxpdHlP
YmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKHRleHQpOworICAgIEF0a0F0dHJpYnV0ZVNldCogcmVz
dWx0OworCisgICAgaWYgKCFjb3JlT2JqZWN0KSB7CisgICAgICAgICpzdGFydE9mZnNldCA9IDA7
CisgICAgICAgICplbmRPZmZzZXQgPSBhdGtfdGV4dF9nZXRfY2hhcmFjdGVyX2NvdW50KHRleHQp
OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IC0xKQorICAg
ICAgICBvZmZzZXQgPSBhdGtfdGV4dF9nZXRfY2FyZXRfb2Zmc2V0KHRleHQpOworCisgICAgcmVz
dWx0ID0gZ2V0UnVuQXR0cmlidXRlc0Zyb21BY2Nlc2liaWxpdHlPYmplY3QoY29yZU9iamVjdCwg
b2Zmc2V0LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKKworICAgIGlmICgqc3RhcnRPZmZzZXQg
PCAwKSB7CisgICAgICAgICpzdGFydE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgKmVuZE9mZnNl
dCA9IG9mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgQXRr
QXR0cmlidXRlU2V0KiB3ZWJraXRfYWNjZXNzaWJsZV90ZXh0X2dldF9kZWZhdWx0X2F0dHJpYnV0
ZXMoQXRrVGV4dCogdGV4dCkKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAw
OworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGNvcmVPYmplY3QgPSBjb3JlKHRleHQpOworICAg
IGlmICghY29yZU9iamVjdCB8fCAhY29yZU9iamVjdC0+aXNBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVNldEZv
ckFjY2Vzc2liaWxpdHlPYmplY3QoY29yZU9iamVjdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdlYmtp
dF9hY2Nlc3NpYmxlX3RleHRfZ2V0X2NoYXJhY3Rlcl9leHRlbnRzKEF0a1RleHQqIHRleHQsIGdp
bnQgb2Zmc2V0LCBnaW50KiB4LCBnaW50KiB5LCBnaW50KiB3aWR0aCwgZ2ludCogaGVpZ2h0LCBB
dGtDb29yZFR5cGUgY29vcmRzKQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2d0ay9DaGFuZ2VMb2cgYi9X
ZWJLaXQvZ3RrL0NoYW5nZUxvZwppbmRleCAzNTY0ZTAxLi40OWVlOWQ4IDEwMDY0NAotLS0gYS9X
ZWJLaXQvZ3RrL0NoYW5nZUxvZworKysgYi9XZWJLaXQvZ3RrL0NoYW5nZUxvZwpAQCAtMSwzICsx
LDIwIEBACisyMDEwLTA2LTA5ICBKb3PDqSBNaWxsw6FuIFNvdG8gIDxqbWlsbGFuQGlnYWxpYS5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0d0
a10gVGV4dCBhdHRyaWJ1dGVzIG5vdCBleHBvc2VkCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTUyOAorCisgICAgICAgIEFkZGVkIG5ldyB0ZXN0cyBm
b3IgYWNjZXNzaWJsZSB0ZXh0IGF0dHJpYnV0ZXMKKworICAgICAgICAqIHRlc3RzL3Rlc3RhdGsu
YzoKKyAgICAgICAgKGNvbXBBdGtBdHRyaWJ1dGUpOgorICAgICAgICAoY29tcEF0a0F0dHJpYnV0
ZU5hbWUpOgorICAgICAgICAoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUpOgorICAg
ICAgICAoYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwpOgorICAgICAgICAodGVzdFdlYmtpdEF0a1Rl
eHRBdHRyaWJ1dGVzKToKKyAgICAgICAgKG1haW4pOgorCiAyMDEwLTA2LTI1ICBNYXJpbyBTYW5j
aGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBY
YW4gTG9wZXouCmRpZmYgLS1naXQgYS9XZWJLaXQvZ3RrL3Rlc3RzL3Rlc3RhdGsuYyBiL1dlYktp
dC9ndGsvdGVzdHMvdGVzdGF0ay5jCmluZGV4IGIzZWMyMmYuLjhmMTNhOTUgMTAwNjQ0Ci0tLSBh
L1dlYktpdC9ndGsvdGVzdHMvdGVzdGF0ay5jCisrKyBiL1dlYktpdC9ndGsvdGVzdHMvdGVzdGF0
ay5jCkBAIC00Miw2ICs0Miw4IEBAIHN0YXRpYyBjb25zdCBjaGFyKiBjb250ZW50c0luVGFibGUg
PSAiPGh0bWw+PGJvZHk+PHRhYmxlPjx0cj48dGQ+Zm9vPC90ZD48dGQ+YmFyCiAKIHN0YXRpYyBj
b25zdCBjaGFyKiBjb250ZW50c0luVGFibGVXaXRoSGVhZGVycyA9ICI8aHRtbD48Ym9keT48dGFi
bGU+PHRyPjx0aD5mb288L3RoPjx0aD5iYXI8L3RoPjx0aCBjb2xzcGFuPScyJz5iYXo8L3RoPjwv
dHI+PHRyPjx0aD5xdXg8L3RoPjx0ZD4xPC90ZD48dGQ+MjwvdGQ+PHRkPjM8L3RkPjwvdHI+PHRy
Pjx0aCByb3dzcGFuPScyJz5xdXV4PC90aD48dGQ+NDwvdGQ+PHRkPjU8L3RkPjx0ZD42PC90ZD48
L3RyPjx0cj48dGQ+NjwvdGQ+PHRkPjc8L3RkPjx0ZD44PC90ZD48L3RyPjx0cj48dGg+Y29yZ2U8
L3RoPjx0ZD45PC90ZD48dGQ+MTA8L3RkPjx0ZD4xMTwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZT48
dHI+PHRkPjE8L3RkPjx0ZD4yPC90ZD48L3RyPjx0cj48dGQ+MzwvdGQ+PHRkPjQ8L3RkPjwvdHI+
PC90YWJsZT48L2JvZHk+PC9odG1sPiI7CiAKK3N0YXRpYyBjb25zdCBjaGFyKiB0ZXh0V2l0aEF0
dHJpYnV0ZXMgPSAiPGh0bWw+PGhlYWQ+PHN0eWxlPi5zdDEge2ZvbnQtZmFtaWx5OiBtb25vc3Bh
Y2U7IGNvbG9yOnJnYigxMjAsMTIxLDEyMik7fSAuc3QyIHt0ZXh0LWRlY29yYXRpb246dW5kZXJs
aW5lOyBiYWNrZ3JvdW5kLWNvbG9yOnJnYig4MCw4MSw4Mik7fTwvc3R5bGU+PC9oZWFkPjxib2R5
PjxwIHN0eWxlPVwiZm9udC1zaXplOjE0OyB0ZXh0LWFsaWduOnJpZ2h0O1wiPlRoaXMgaXMgdGhl
IDxpPmZpcnN0PC9pPjxiPiBzZW50ZW5jZSBvZiB0aGlzIHRleHQuPC9iPjwvcD48cCBjbGFzcz1c
InN0MVwiPlRoaXMgc2VudGVuY2Ugc2hvdWxkIGhhdmUgYW4gc3R5bGUgYXBwbGllZCA8c3BhbiBj
bGFzcz1cInN0MlwiPmFuZCB0aGlzIHBhcnQgc2hvdWxkIGhhdmUgYW5vdGhlciBvbmU8L3NwYW4+
LjwvcD48cD54PHN1Yj4xPC9zdWI+PHN1cD4yPC9zdXA+PXg8c3ViPjI8L3N1Yj48c3VwPjM8L3N1
cD48L3A+PHAgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj5UaGlzIHNlbnRlbmNlIGlzIHRo
ZSA8c3RyaWtlPmxhc3Q8L3N0cmlrZT4gb25lLjwvcD48L2JvZHk+PC9odG1sPiI7CisKIHN0YXRp
YyBnYm9vbGVhbiBiYWlsX291dChHTWFpbkxvb3AqIGxvb3ApCiB7CiAgICAgaWYgKGdfbWFpbl9s
b29wX2lzX3J1bm5pbmcobG9vcCkpCkBAIC01NzIsNiArNTc0LDE3MCBAQCBzdGF0aWMgdm9pZCB0
ZXN0V2Via2l0QXRrR2V0SGVhZGVyc0luVGFibGUodm9pZCkKICAgICBnX29iamVjdF91bnJlZih3
ZWJWaWV3KTsKIH0KIAorc3RhdGljIGdpbnQgY29tcEF0a0F0dHJpYnV0ZShBdGtBdHRyaWJ1dGUq
IGExLCBBdGtBdHRyaWJ1dGUqIGEyKQoreworICAgIGdpbnQgc3RyY21wVmFsOworICAgIHN0cmNt
cFZhbCA9IGdfc3RyY21wMChhMS0+bmFtZSwgYTItPm5hbWUpOworICAgIGlmIChzdHJjbXBWYWwp
CisgICAgICAgIHJldHVybiBzdHJjbXBWYWw7CisgICAgcmV0dXJuIGdfc3RyY21wMChhMS0+dmFs
dWUsIGEyLT52YWx1ZSk7Cit9CisKK3N0YXRpYyBnaW50IGNvbXBBdGtBdHRyaWJ1dGVOYW1lKEF0
a0F0dHJpYnV0ZSogYTEsIEF0a0F0dHJpYnV0ZSogYTIpCit7CisgICAgcmV0dXJuIGdfc3RyY21w
MChhMS0+bmFtZSwgYTItPm5hbWUpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gYXRrQXR0cmlidXRl
U2V0QXR0cmlidXRlSGFzVmFsdWUoQXRrQXR0cmlidXRlU2V0KiBzZXQsIEF0a1RleHRBdHRyaWJ1
dGUgYXR0cmlidXRlLCBjb25zdCBnY2hhciogdmFsdWUpCit7CisgICAgR1NMaXN0ICplbGVtZW50
OworICAgIEF0a0F0dHJpYnV0ZSBhdDsKKyAgICBnYm9vbGVhbiByZXN1bHQ7CisgICAgYXQubmFt
ZSA9IChnY2hhciAqKWF0a190ZXh0X2F0dHJpYnV0ZV9nZXRfbmFtZShhdHRyaWJ1dGUpOworICAg
IGVsZW1lbnQgPSBnX3NsaXN0X2ZpbmRfY3VzdG9tKHNldCwgJmF0LCAoR0NvbXBhcmVGdW5jKWNv
bXBBdGtBdHRyaWJ1dGVOYW1lKTsKKyAgICByZXN1bHQgPSBlbGVtZW50ICYmICFnX3N0cmNtcDAo
KChBdGtBdHRyaWJ1dGUqKShlbGVtZW50LT5kYXRhKSktPnZhbHVlLCB2YWx1ZSk7CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuIGF0a0F0dHJpYnV0ZVNldEFyZUVxdWFs
KEF0a0F0dHJpYnV0ZVNldCogc2V0MSwgQXRrQXR0cmlidXRlU2V0KiBzZXQyKQoreworICAgIGlm
ICghc2V0MSkKKyAgICAgICAgcmV0dXJuICFzZXQyOworCisgICAgc2V0MSA9IGdfc2xpc3Rfc29y
dChzZXQxLCAoR0NvbXBhcmVGdW5jKWNvbXBBdGtBdHRyaWJ1dGUpOworICAgIHNldDIgPSBnX3Ns
aXN0X3NvcnQoc2V0MiwgKEdDb21wYXJlRnVuYyljb21wQXRrQXR0cmlidXRlKTsKKworICAgIHdo
aWxlIChzZXQxKSB7CisgICAgICAgIGlmICghc2V0MiB8fCBjb21wQXRrQXR0cmlidXRlKHNldDEt
PmRhdGEsIHNldDItPmRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAg
IHNldDEgPSBzZXQxLT5uZXh0OworICAgICAgICBzZXQyID0gc2V0Mi0+bmV4dDsKKyAgICB9CisK
KyAgICByZXR1cm4gKCFzZXQyKTsKK30KKworc3RhdGljIHZvaWQgdGVzdFdlYmtpdEF0a1RleHRB
dHRyaWJ1dGVzKHZvaWQpCit7CisgICAgV2ViS2l0V2ViVmlldyogd2ViVmlldzsKKyAgICBBdGtP
YmplY3QqIG9iajsKKyAgICBBdGtPYmplY3QqIGNoaWxkOworICAgIEdNYWluTG9vcCogbG9vcDsK
KyAgICBBdGtUZXh0KiBjaGlsZFRleHQ7CisgICAgQXRrQXR0cmlidXRlU2V0KiBzZXQxOworICAg
IEF0a0F0dHJpYnV0ZVNldCogc2V0MjsKKyAgICBBdGtBdHRyaWJ1dGVTZXQqIHNldDM7CisgICAg
QXRrQXR0cmlidXRlU2V0KiBzZXQ0OworICAgIGdpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsK
KworICAgIHdlYlZpZXcgPSBXRUJLSVRfV0VCX1ZJRVcod2Via2l0X3dlYl92aWV3X25ldygpKTsK
KyAgICBnX29iamVjdF9yZWZfc2luayh3ZWJWaWV3KTsKKyAgICBHdGtBbGxvY2F0aW9uIGFsbG9j
ID0geyAwLCAwLCA4MDAsIDYwMCB9OworICAgIGd0a193aWRnZXRfc2l6ZV9hbGxvY2F0ZShHVEtf
V0lER0VUKHdlYlZpZXcpLCAmYWxsb2MpOworCisgICAgd2Via2l0X3dlYl92aWV3X2xvYWRfc3Ry
aW5nKHdlYlZpZXcsIHRleHRXaXRoQXR0cmlidXRlcywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAg
bG9vcCA9IGdfbWFpbl9sb29wX25ldyhOVUxMLCBUUlVFKTsKKworICAgIGdfaWRsZV9hZGQoKEdT
b3VyY2VGdW5jKWJhaWxfb3V0LCBsb29wKTsKKyAgICBnX21haW5fbG9vcF9ydW4obG9vcCk7CisK
KyAgICBvYmogPSBndGtfd2lkZ2V0X2dldF9hY2Nlc3NpYmxlKEdUS19XSURHRVQod2ViVmlldykp
OworICAgIGdfYXNzZXJ0KG9iaik7CisKKyAgICBjaGlsZCA9IGF0a19vYmplY3RfcmVmX2FjY2Vz
c2libGVfY2hpbGQob2JqLCAwKTsKKyAgICBnX2Fzc2VydChjaGlsZCAmJiBBVEtfSVNfVEVYVChj
aGlsZCkpOworICAgIGNoaWxkVGV4dCA9IEFUS19URVhUKGNoaWxkKTsKKyAgICBzZXQxID0gYXRr
X3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMCwgJnN0YXJ0T2Zmc2V0LCAmZW5k
T2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRPZmZzZXQsID09LCAwKTsKKyAgICBn
X2Fzc2VydF9jbXBpbnQoZW5kT2Zmc2V0LCA9PSwgMTIpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJp
YnV0ZVNldEFyZUVxdWFsKHNldDEsIE5VTEwpKTsKKworICAgIHNldDIgPSBhdGtfdGV4dF9nZXRf
cnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCAxNSwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsK
KyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRPZmZzZXQsID09LCAxMik7CisgICAgZ19hc3NlcnRf
Y21waW50KGVuZE9mZnNldCwgPT0sIDE3KTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRB
dHRyaWJ1dGVIYXNWYWx1ZShzZXQyLCBBVEtfVEVYVF9BVFRSX1NUWUxFLCAiaXRhbGljIikpOwor
CisgICAgc2V0MyA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDE3LCAm
c3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAgIGdfYXNzZXJ0X2NtcGludChzdGFydE9mZnNl
dCwgPT0sIDE3KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoZW5kT2Zmc2V0LCA9PSwgNDApOworICAg
IGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDMsIEFUS19URVhU
X0FUVFJfV0VJR0hULCAiNzAwIikpOworCisgICAgc2V0NCA9IGF0a190ZXh0X2dldF9kZWZhdWx0
X2F0dHJpYnV0ZXMoY2hpbGRUZXh0KTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBdHRy
aWJ1dGVIYXNWYWx1ZShzZXQ0LCBBVEtfVEVYVF9BVFRSX1NUWUxFLCAibm9ybWFsIikpOworICAg
IGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDQsIEFUS19URVhU
X0FUVFJfSlVTVElGSUNBVElPTiwgInJpZ2h0IikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0
ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDQsIEFUS19URVhUX0FUVFJfU0laRSwgIjE0IikpOwor
ICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0MSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRf
ZnJlZShzZXQyKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDMpOworICAgIGF0a19h
dHRyaWJ1dGVfc2V0X2ZyZWUoc2V0NCk7CisKKyAgICBjaGlsZCA9IGF0a19vYmplY3RfcmVmX2Fj
Y2Vzc2libGVfY2hpbGQob2JqLCAxKTsKKyAgICBnX2Fzc2VydChjaGlsZCAmJiBBVEtfSVNfVEVY
VChjaGlsZCkpOworICAgIGNoaWxkVGV4dCA9IEFUS19URVhUKGNoaWxkKTsKKworICAgIHNldDEg
PSBhdGtfdGV4dF9nZXRfZGVmYXVsdF9hdHRyaWJ1dGVzKGNoaWxkVGV4dCk7CisgICAgZ19hc3Nl
cnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0MSwgQVRLX1RFWFRfQVRUUl9G
QU1JTFlfTkFNRSwgIm1vbm9zcGFjZSIpKTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRB
dHRyaWJ1dGVIYXNWYWx1ZShzZXQxLCBBVEtfVEVYVF9BVFRSX1NUWUxFLCAibm9ybWFsIikpOwor
ICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19U
RVhUX0FUVFJfU1RSSUtFVEhST1VHSCwgImZhbHNlIikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJp
YnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEsIEFUS19URVhUX0FUVFJfV0VJR0hULCAiNDAw
IikpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEs
IEFUS19URVhUX0FUVFJfRkdfQ09MT1IsICIxMjAsMTIxLDEyMiIpKTsKKworICAgIHNldDIgPSBh
dGtfdGV4dF9nZXRfcnVuX2F0dHJpYnV0ZXMoY2hpbGRUZXh0LCA0MywgJnN0YXJ0T2Zmc2V0LCAm
ZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoc3RhcnRPZmZzZXQsID09LCA0Myk7Cisg
ICAgZ19hc3NlcnRfY21waW50KGVuZE9mZnNldCwgPT0sIDgwKTsKKyAgICAvLyBDaGVja3MgdGhh
dCBkZWZhdWx0IGF0dHJpYnV0ZXMgb2YgdGV4dCBhcmUgbm90IHJldHVybmVkIHdoZW4gY2FsbGVk
IHRvIGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcworICAgIGdfYXNzZXJ0KCFhdGtBdHRyaWJ1
dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQyLCBBVEtfVEVYVF9BVFRSX0ZHX0NPTE9SLCAiMTIw
LDEyMSwxMjIiKSk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFs
dWUoc2V0MiwgQVRLX1RFWFRfQVRUUl9VTkRFUkxJTkUsICJzaW5nbGUiKSk7CisgICAgZ19hc3Nl
cnQoYXRrQXR0cmlidXRlU2V0QXR0cmlidXRlSGFzVmFsdWUoc2V0MiwgQVRLX1RFWFRfQVRUUl9C
R19DT0xPUiwgIjgwLDgxLDgyIikpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0MSk7
CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQyKTsKKworICAgIGNoaWxkID0gYXRrX29i
amVjdF9yZWZfYWNjZXNzaWJsZV9jaGlsZChvYmosIDIpOworICAgIGdfYXNzZXJ0KGNoaWxkICYm
IEFUS19JU19URVhUKGNoaWxkKSk7CisgICAgY2hpbGRUZXh0ID0gQVRLX1RFWFQoY2hpbGQpOwor
CisgICAgc2V0MSA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDAsICZz
dGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgc2V0MiA9IGF0a190ZXh0X2dldF9ydW5fYXR0
cmlidXRlcyhjaGlsZFRleHQsIDMsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgZ19h
c3NlcnQoYXRrQXR0cmlidXRlU2V0QXJlRXF1YWwoc2V0MSwgc2V0MikpOworICAgIGF0a19hdHRy
aWJ1dGVfc2V0X2ZyZWUoc2V0Mik7CisKKyAgICBzZXQyID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRy
aWJ1dGVzKGNoaWxkVGV4dCwgMSwgJnN0YXJ0T2Zmc2V0LCAmZW5kT2Zmc2V0KTsKKyAgICBzZXQz
ID0gYXRrX3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgNSwgJnN0YXJ0T2Zmc2V0
LCAmZW5kT2Zmc2V0KTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1dGVTZXRBcmVFcXVhbChzZXQy
LCBzZXQzKSk7CisgICAgZ19hc3NlcnQoIWF0a0F0dHJpYnV0ZVNldEFyZUVxdWFsKHNldDEsIHNl
dDIpKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDMpOworCisgICAgc2V0MyA9IGF0
a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRleHQsIDIsICZzdGFydE9mZnNldCwgJmVu
ZE9mZnNldCk7CisgICAgc2V0NCA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRl
eHQsIDYsICZzdGFydE9mZnNldCwgJmVuZE9mZnNldCk7CisgICAgZ19hc3NlcnQoYXRrQXR0cmli
dXRlU2V0QXJlRXF1YWwoc2V0Mywgc2V0NCkpOworICAgIGdfYXNzZXJ0KCFhdGtBdHRyaWJ1dGVT
ZXRBcmVFcXVhbChzZXQxLCBzZXQzKSk7CisgICAgZ19hc3NlcnQoIWF0a0F0dHJpYnV0ZVNldEFy
ZUVxdWFsKHNldDIsIHNldDMpKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDEpOwor
ICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0Mik7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRf
ZnJlZShzZXQzKTsKKyAgICBhdGtfYXR0cmlidXRlX3NldF9mcmVlKHNldDQpOworCisgICAgY2hp
bGQgPSBhdGtfb2JqZWN0X3JlZl9hY2Nlc3NpYmxlX2NoaWxkKG9iaiwgMyk7CisgICAgZ19hc3Nl
cnQoY2hpbGQgJiYgQVRLX0lTX1RFWFQoY2hpbGQpKTsKKyAgICBjaGlsZFRleHQgPSBBVEtfVEVY
VChjaGlsZCk7CisgICAgc2V0MSA9IGF0a190ZXh0X2dldF9ydW5fYXR0cmlidXRlcyhjaGlsZFRl
eHQsIDI0LCAmc3RhcnRPZmZzZXQsICZlbmRPZmZzZXQpOworICAgIGdfYXNzZXJ0X2NtcGludChz
dGFydE9mZnNldCwgPT0sIDIxKTsKKyAgICBnX2Fzc2VydF9jbXBpbnQoZW5kT2Zmc2V0LCA9PSwg
MjUpOworICAgIGdfYXNzZXJ0KGF0a0F0dHJpYnV0ZVNldEF0dHJpYnV0ZUhhc1ZhbHVlKHNldDEs
IEFUS19URVhUX0FUVFJfU1RSSUtFVEhST1VHSCwgInRydWUiKSk7CisKKyAgICBzZXQyID0gYXRr
X3RleHRfZ2V0X3J1bl9hdHRyaWJ1dGVzKGNoaWxkVGV4dCwgMjUsICZzdGFydE9mZnNldCwgJmVu
ZE9mZnNldCk7CisgICAgZ19hc3NlcnRfY21waW50KHN0YXJ0T2Zmc2V0LCA9PSwgMjUpOworICAg
IGdfYXNzZXJ0X2NtcGludChlbmRPZmZzZXQsID09LCAzMCk7CisgICAgZ19hc3NlcnQoYXRrQXR0
cmlidXRlU2V0QXJlRXF1YWwoc2V0MiwgTlVMTCkpOworCisgICAgc2V0MyA9IGF0a190ZXh0X2dl
dF9kZWZhdWx0X2F0dHJpYnV0ZXMoY2hpbGRUZXh0KTsKKyAgICBnX2Fzc2VydChhdGtBdHRyaWJ1
dGVTZXRBdHRyaWJ1dGVIYXNWYWx1ZShzZXQzLCBBVEtfVEVYVF9BVFRSX0pVU1RJRklDQVRJT04s
ICJjZW50ZXIiKSk7CisgICAgYXRrX2F0dHJpYnV0ZV9zZXRfZnJlZShzZXQxKTsKKyAgICBhdGtf
YXR0cmlidXRlX3NldF9mcmVlKHNldDIpOworICAgIGF0a19hdHRyaWJ1dGVfc2V0X2ZyZWUoc2V0
Myk7Cit9CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKIHsKICAgICBnX3RocmVh
ZF9pbml0KE5VTEwpOwpAQCAtNTg3LDYgKzc1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFy
KiogYXJndikKICAgICBnX3Rlc3RfYWRkX2Z1bmMoIi93ZWJraXQvYXRrL2dldFRleHRJblBhcmFn
cmFwaEFuZEJvZHlNb2RlcmF0ZSIsIHRlc3RXZWJraXRBdGtHZXRUZXh0SW5QYXJhZ3JhcGhBbmRC
b2R5TW9kZXJhdGUpOwogICAgIGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvZ2V0VGV4dElu
VGFibGUiLCB0ZXN0V2Via2l0QXRrR2V0VGV4dEluVGFibGUpOwogICAgIGdfdGVzdF9hZGRfZnVu
YygiL3dlYmtpdC9hdGsvZ2V0SGVhZGVyc0luVGFibGUiLCB0ZXN0V2Via2l0QXRrR2V0SGVhZGVy
c0luVGFibGUpOworICAgIGdfdGVzdF9hZGRfZnVuYygiL3dlYmtpdC9hdGsvdGV4dEF0dHJpYnV0
ZXMiLCB0ZXN0V2Via2l0QXRrVGV4dEF0dHJpYnV0ZXMpOwogICAgIHJldHVybiBnX3Rlc3RfcnVu
ICgpOwogfQogCi0tIAoxLjcuMC40Cgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>