<?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>29489</bug_id>
          
          <creation_ts>2009-09-18 08:58:38 -0700</creation_ts>
          <short_desc>[Qt] WebKit bug resizing a plugin with JavaScript</short_desc>
          <delta_ts>2014-02-03 03:15:46 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Tor Arne Vestbø">vestbo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cmarcelo</cc>
    
    <cc>kent.hansen</cc>
    
    <cc>tonikitoo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>148207</commentid>
    <comment_count>0</comment_count>
    <who name="Tor Arne Vestbø">vestbo</who>
    <bug_when>2009-09-18 08:58:38 -0700</bug_when>
    <thetext>This bug report originated from issue QTBUG-3503
http://bugreports.qt.nokia.com/browse/QTBUG-3503

--- Description ---

The attached test cases will show two WebKit bugs. Tests have been
performed with both Qt 4.5.0-beta1 and the latest available snapshot
(20090130).


Test 1: tst_QWebPage::resizeJS()

This will add both a &lt;img&gt; and a &lt;object&gt; tag to the web page, the
latter used to embed a QWidget.

The test shows that WebKit won&apos;t allow changing the width or height
attributes of the &lt;object&gt; tag using JavaScript, while it will allow
to change other attributes (or the image size).


Test 2: tst_QWebPage::resizeWidgetNoRepaint() and
tst_QWebPage::resizeWidgetWithRepaint()

The tests will embed a QWidget as in the previous test but resize the 
QWidget.

Both will actually run the same code, except the latter adds a call to
QWebView::repaint().

The tests show that the &lt;object&gt; width and height are updated
correctly right after the widget is resized but that a paint event
will cause the widget size to be reset back to the initial size.

Looking at RenderWidget::paint() in webcore\rendering\renderwidget.cpp
I can see that m_widget-&gt;move() is being executed. This will,
unfortunately, use the size stored in WebCore::Widget::IntRect, which
is no longer the correct size.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148208</commentid>
    <comment_count>1</comment_count>
    <who name="Tor Arne Vestbø">vestbo</who>
    <bug_when>2009-09-18 08:59:08 -0700</bug_when>
    <thetext>/*
    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/


#include &lt;QtTest/QtTest&gt;

#include &lt;qwebpage.h&gt;
#include &lt;qwidget.h&gt;
#include &lt;qwebview.h&gt;
#include &lt;qwebframe.h&gt;
#include &lt;QDebug&gt;
#include &lt;QPushButton&gt;

// Will try to wait for the condition while allowing event processing
#define QTRY_COMPARE(__expr, __expected) \
    do { \
        const int __step = 50; \
        const int __timeout = 5000; \
        if ((__expr) != (__expected)) { \
            QTest::qWait(0); \
        } \
        for (int __i = 0; __i &lt; __timeout &amp;&amp; ((__expr) != (__expected)); __i+=__step) { \
            QTest::qWait(__step); \
        } \
        QCOMPARE(__expr, __expected); \
    } while(0)

//TESTED_CLASS=
//TESTED_FILES=


class tst_QWebPage : public QObject
{
    Q_OBJECT

public:
    tst_QWebPage();
    virtual ~tst_QWebPage();

public slots:
    void init();
    void cleanup();

private slots:
    void resizeJS();
    void resizeWidgetNoRepaint();
    void resizeWidgetWithRepaint();

private:
    void resizeWidget(bool resize);

    QWebView* m_view;
    QWebPage* m_page;
};

tst_QWebPage::tst_QWebPage()
{
}

tst_QWebPage::~tst_QWebPage()
{
}

void tst_QWebPage::init()
{
    m_view = new QWebView();
    m_page = m_view-&gt;page();
}

void tst_QWebPage::cleanup()
{
    delete m_view;
}

class PluginPage : public QWebPage
{
public:
    PluginPage(QObject *parent = 0)
        : QWebPage(parent) {}

    ~PluginPage() {

    }

    struct CallInfo
    {
        CallInfo(const QString &amp;c, const QUrl &amp;u,
                 const QStringList &amp;pn, const QStringList &amp;pv,
                 QObject *r)
            : classid(c), url(u), paramNames(pn),
              paramValues(pv), returnValue(r)
            {}
        QString classid;
        QUrl url;
        QStringList paramNames;
        QStringList paramValues;
        QObject *returnValue;
    };

    QList&lt;CallInfo&gt; calls;

protected:
    virtual QObject *createPlugin(const QString &amp;classid, const QUrl &amp;url,
                                  const QStringList &amp;paramNames,
                                  const QStringList &amp;paramValues)
    {
        QObject *result = 0;
        if (classid == &quot;pushbutton&quot;)
            result = new QPushButton();
        if (result) {
            result-&gt;setObjectName(classid);
        }
        calls.append(CallInfo(classid, url, paramNames, paramValues, result));
        return result;
    }
};

void tst_QWebPage::resizeJS()
{
    QSignalSpy loadSpy(m_view, SIGNAL(loadFinished(bool)));

    PluginPage* newPage = new PluginPage(m_view);
    m_view-&gt;setPage(newPage);

    m_view-&gt;settings()-&gt;setAttribute(QWebSettings::PluginsEnabled, true);
    m_view-&gt;settings()-&gt;setAttribute(QWebSettings::JavascriptEnabled, true);

    // add an image and a widget to the page using &lt;img&gt; and &lt;object&gt;.
    m_view-&gt;setHtml(QString(&quot;&lt;html&gt;&lt;body&gt;&lt;img id=&apos;qtlogo&apos; src=&apos;http://www.qtsoftware.com/logo.png&apos; width=&apos;71&apos; height=&apos;174&apos;/&gt;&lt;object type=&apos;application/x-qt-plugin&apos; classid=&apos;pushbutton&apos; id=&apos;mybutton&apos; width=&apos;100&apos; height=&apos;100&apos; foo=&apos;bar&apos;/&gt;&lt;/body&gt;&lt;/html&gt;&quot;));

    // wait for the page to load
    QTRY_COMPARE(loadSpy.count(), 1);

    // ensure the widget has been created correctly
    QCOMPARE(newPage-&gt;calls.count(), 1);
    {
        PluginPage::CallInfo ci = newPage-&gt;calls.first();
        QCOMPARE(ci.classid, QString::fromLatin1(&quot;pushbutton&quot;));
        QVERIFY(ci.returnValue != 0);
        QVERIFY(ci.returnValue-&gt;inherits(&quot;QPushButton&quot;));
        const int w_index = ci.paramNames.indexOf(&quot;width&quot;);
        const int h_index = ci.paramNames.indexOf(&quot;height&quot;);
        QVERIFY(w_index != -1);
        QVERIFY(h_index != -1);
        QVERIFY(ci.paramValues.value(w_index) == &quot;100&quot;);
        QVERIFY(ci.paramValues.value(h_index) == &quot;100&quot;);

        // test widget size
        QPushButton* pb = dynamic_cast&lt;QPushButton*&gt;(ci.returnValue);
        QVERIFY(pb);
        QVERIFY(pb-&gt;size() == QSize(100, 100));

        // test widget size (JS)
        {
        QString js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).width + &apos;x&apos; + document.getElementById(&apos;mybutton&apos;).height&quot;);
        QString js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
        QVERIFY(js_res == QString(&quot;100x100&quot;));
        }

        // test image size (JS)
        {
        QString js = QLatin1String(&quot;document.getElementById(&apos;qtlogo&apos;).width + &apos;x&apos; + document.getElementById(&apos;qtlogo&apos;).height&quot;);
        QString js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
        QVERIFY(js_res == QString(&quot;71x174&quot;));
        }
    }

    // resize image (JS)
    {
    QString js = QLatin1String(&quot;document.getElementById(&apos;qtlogo&apos;).width = &apos;142&apos;;&quot;);
    QString js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;142&quot;));

    js = QLatin1String(&quot;document.getElementById(&apos;qtlogo&apos;).height = &apos;348&apos;;&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;348&quot;));

    // check image size
    js = QLatin1String(&quot;document.getElementById(&apos;qtlogo&apos;).width + &apos;x&apos; + document.getElementById(&apos;qtlogo&apos;).height&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;142x348&quot;));
    }


    // resize widget (JS)
    {
    QString js, js_res;

    // test custom attribute (this works!)
    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).foo = &apos;bar2&apos;;&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;bar2&quot;));

    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).foo&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;bar2&quot;));

    // test width and height attributes
    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).width = 200;&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;200&quot;));

    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).height = 200;&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;200&quot;));

    // check widget size
    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).width + &apos;x&apos; + document.getElementById(&apos;mybutton&apos;).height&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;200x200&quot;));
    }

    // ensure the plugin has been resized as well
    {
        PluginPage::CallInfo ci = newPage-&gt;calls.first();
        QPushButton* pb = dynamic_cast&lt;QPushButton*&gt;(ci.returnValue);
        QVERIFY(pb);
        QVERIFY(pb-&gt;size() == QSize(200, 200));
    }
}

void tst_QWebPage::resizeWidgetNoRepaint()
{
    resizeWidget(false);
}

void tst_QWebPage::resizeWidgetWithRepaint()
{
    resizeWidget(true);
}

void tst_QWebPage::resizeWidget(bool repaint)
{
    QSignalSpy loadSpy(m_view, SIGNAL(loadFinished(bool)));

    PluginPage* newPage = new PluginPage(m_view);
    m_view-&gt;setPage(newPage);

    m_view-&gt;settings()-&gt;setAttribute(QWebSettings::PluginsEnabled, true);
    m_view-&gt;settings()-&gt;setAttribute(QWebSettings::JavascriptEnabled, true);

    // add a 100x100 widget
    m_view-&gt;setHtml(QString(&quot;&lt;html&gt;&lt;body&gt;&lt;object type=&apos;application/x-qt-plugin&apos; classid=&apos;pushbutton&apos; id=&apos;mybutton&apos; width=&apos;100&apos; height=&apos;100&apos;/&gt;&lt;/body&gt;&lt;/html&gt;&quot;));

    // wait for the page to load
    QTRY_COMPARE(loadSpy.count(), 1);

    m_view-&gt;show();

    // ensure the widget has been created correctly
    QCOMPARE(newPage-&gt;calls.count(), 1);
    {
        PluginPage::CallInfo ci = newPage-&gt;calls.first();
        QCOMPARE(ci.classid, QString::fromLatin1(&quot;pushbutton&quot;));
        QVERIFY(ci.returnValue != 0);
        QVERIFY(ci.returnValue-&gt;inherits(&quot;QPushButton&quot;));
        const int w_index = ci.paramNames.indexOf(&quot;width&quot;);
        const int h_index = ci.paramNames.indexOf(&quot;height&quot;);
        QVERIFY(w_index != -1);
        QVERIFY(h_index != -1);
        QVERIFY(ci.paramValues.value(w_index) == &quot;100&quot;);
        QVERIFY(ci.paramValues.value(h_index) == &quot;100&quot;);

        // test widget size
        QPushButton* pb = dynamic_cast&lt;QPushButton*&gt;(ci.returnValue);
        QVERIFY(pb);
        QVERIFY(pb-&gt;size() == QSize(100, 100));

        // now resize the widget
        pb-&gt;resize(QSize(300, 300));
        QVERIFY(pb-&gt;size() == QSize(300, 300));
    }

    // check &lt;object&gt; size
    {
    QString js, js_res;
    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).width + &apos;x&apos; + document.getElementById(&apos;mybutton&apos;).height&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;300x300&quot;));
    }

    if (repaint)
        m_view-&gt;repaint();

    {
    QString js, js_res;
    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).width + &apos;x&apos; + document.getElementById(&apos;mybutton&apos;).height&quot;);
    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
    QVERIFY(js_res == QString(&quot;300x300&quot;));
    }

    // re-check &lt;object&gt; size
    {
	    QString js, js_res;
	    js = QLatin1String(&quot;document.getElementById(&apos;mybutton&apos;).width + &apos;x&apos; + document.getElementById(&apos;mybutton&apos;).height&quot;);
	    js_res = newPage-&gt;mainFrame()-&gt;evaluateJavaScript(js).toString();
	    QVERIFY(js_res == QString(&quot;300x300&quot;));
    }

    // re-check the plugin size
    {
        PluginPage::CallInfo ci = newPage-&gt;calls.first();
        QPushButton* pb = dynamic_cast&lt;QPushButton*&gt;(ci.returnValue);
        QVERIFY(pb);
        QVERIFY(pb-&gt;size() == QSize(300, 300));
    }
}

QTEST_MAIN(tst_QWebPage)
#include &quot;tst_qwebpage.moc&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199041</commentid>
    <comment_count>2</comment_count>
      <attachid>50596</attachid>
    <who name="Kent Hansen">kent.hansen</who>
    <bug_when>2010-03-12 07:29:30 -0800</bug_when>
    <thetext>Created attachment 50596
Testcase</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199044</commentid>
    <comment_count>3</comment_count>
    <who name="Kent Hansen">kent.hansen</who>
    <bug_when>2010-03-12 07:31:05 -0800</bug_when>
    <thetext>Reproduced with r55658.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>356095</commentid>
    <comment_count>4</comment_count>
    <who name="Caio Marcelo de Oliveira Filho">cmarcelo</who>
    <bug_when>2011-02-23 08:29:33 -0800</bug_when>
    <thetext>Reproduced with r79439.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>975086</commentid>
    <comment_count>5</comment_count>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2014-02-03 03:15:46 -0800</bug_when>
    <thetext>=== Bulk closing of Qt bugs ===

If you believe that this bug report is still relevant for a non-Qt port of webkit.org, please re-open it and remove [Qt] from the summary.

If you believe that this is still an important QtWebKit bug, please fill a new report at https://bugreports.qt-project.org and add a link to this issue. See http://qt-project.org/wiki/ReportingBugsInQt for additional guidelines.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>50596</attachid>
            <date>2010-03-12 07:29:30 -0800</date>
            <delta_ts>2010-03-12 07:29:30 -0800</delta_ts>
            <desc>Testcase</desc>
            <filename>main.cpp</filename>
            <type>text/x-c++src</type>
            <size>10331</size>
            <attacher name="Kent Hansen">kent.hansen</attacher>
            
              <data encoding="base64">LyoKICAgIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykKCiAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAogICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCiov
CgoKI2luY2x1ZGUgPFF0VGVzdC9RdFRlc3Q+CgojaW5jbHVkZSA8cXdlYnBhZ2UuaD4KI2luY2x1
ZGUgPHF3aWRnZXQuaD4KI2luY2x1ZGUgPHF3ZWJ2aWV3Lmg+CiNpbmNsdWRlIDxxd2ViZnJhbWUu
aD4KI2luY2x1ZGUgPFFEZWJ1Zz4KI2luY2x1ZGUgPFFQdXNoQnV0dG9uPgoKLy8gV2lsbCB0cnkg
dG8gd2FpdCBmb3IgdGhlIGNvbmRpdGlvbiB3aGlsZSBhbGxvd2luZyBldmVudCBwcm9jZXNzaW5n
CiNkZWZpbmUgUVRSWV9DT01QQVJFKF9fZXhwciwgX19leHBlY3RlZCkgXAogICAgZG8geyBcCiAg
ICAgICAgY29uc3QgaW50IF9fc3RlcCA9IDUwOyBcCiAgICAgICAgY29uc3QgaW50IF9fdGltZW91
dCA9IDUwMDA7IFwKICAgICAgICBpZiAoKF9fZXhwcikgIT0gKF9fZXhwZWN0ZWQpKSB7IFwKICAg
ICAgICAgICAgUVRlc3Q6OnFXYWl0KDApOyBcCiAgICAgICAgfSBcCiAgICAgICAgZm9yIChpbnQg
X19pID0gMDsgX19pIDwgX190aW1lb3V0ICYmICgoX19leHByKSAhPSAoX19leHBlY3RlZCkpOyBf
X2krPV9fc3RlcCkgeyBcCiAgICAgICAgICAgIFFUZXN0OjpxV2FpdChfX3N0ZXApOyBcCiAgICAg
ICAgfSBcCiAgICAgICAgUUNPTVBBUkUoX19leHByLCBfX2V4cGVjdGVkKTsgXAogICAgfSB3aGls
ZSgwKQoKLy9URVNURURfQ0xBU1M9Ci8vVEVTVEVEX0ZJTEVTPQoKCmNsYXNzIHRzdF9RV2ViUGFn
ZSA6IHB1YmxpYyBRT2JqZWN0CnsKICAgIFFfT0JKRUNUCgpwdWJsaWM6CiAgICB0c3RfUVdlYlBh
Z2UoKTsKICAgIHZpcnR1YWwgfnRzdF9RV2ViUGFnZSgpOwoKcHVibGljIHNsb3RzOgogICAgdm9p
ZCBpbml0KCk7CiAgICB2b2lkIGNsZWFudXAoKTsKCnByaXZhdGUgc2xvdHM6CiAgICB2b2lkIHJl
c2l6ZUpTKCk7CiAgICB2b2lkIHJlc2l6ZVdpZGdldE5vUmVwYWludCgpOwogICAgdm9pZCByZXNp
emVXaWRnZXRXaXRoUmVwYWludCgpOwoKcHJpdmF0ZToKICAgIHZvaWQgcmVzaXplV2lkZ2V0KGJv
b2wgcmVzaXplKTsKCiAgICBRV2ViVmlldyogbV92aWV3OwogICAgUVdlYlBhZ2UqIG1fcGFnZTsK
fTsKCnRzdF9RV2ViUGFnZTo6dHN0X1FXZWJQYWdlKCkKewp9Cgp0c3RfUVdlYlBhZ2U6On50c3Rf
UVdlYlBhZ2UoKQp7Cn0KCnZvaWQgdHN0X1FXZWJQYWdlOjppbml0KCkKewogICAgbV92aWV3ID0g
bmV3IFFXZWJWaWV3KCk7CiAgICBtX3BhZ2UgPSBtX3ZpZXctPnBhZ2UoKTsKfQoKdm9pZCB0c3Rf
UVdlYlBhZ2U6OmNsZWFudXAoKQp7CiAgICBkZWxldGUgbV92aWV3Owp9CgpjbGFzcyBQbHVnaW5Q
YWdlIDogcHVibGljIFFXZWJQYWdlCnsKcHVibGljOgogICAgUGx1Z2luUGFnZShRT2JqZWN0ICpw
YXJlbnQgPSAwKQogICAgICAgIDogUVdlYlBhZ2UocGFyZW50KSB7fQoKICAgIH5QbHVnaW5QYWdl
KCkgewoKICAgIH0KCiAgICBzdHJ1Y3QgQ2FsbEluZm8KICAgIHsKICAgICAgICBDYWxsSW5mbyhj
b25zdCBRU3RyaW5nICZjLCBjb25zdCBRVXJsICZ1LAogICAgICAgICAgICAgICAgIGNvbnN0IFFT
dHJpbmdMaXN0ICZwbiwgY29uc3QgUVN0cmluZ0xpc3QgJnB2LAogICAgICAgICAgICAgICAgIFFP
YmplY3QgKnIpCiAgICAgICAgICAgIDogY2xhc3NpZChjKSwgdXJsKHUpLCBwYXJhbU5hbWVzKHBu
KSwKICAgICAgICAgICAgICBwYXJhbVZhbHVlcyhwdiksIHJldHVyblZhbHVlKHIpCiAgICAgICAg
ICAgIHt9CiAgICAgICAgUVN0cmluZyBjbGFzc2lkOwogICAgICAgIFFVcmwgdXJsOwogICAgICAg
IFFTdHJpbmdMaXN0IHBhcmFtTmFtZXM7CiAgICAgICAgUVN0cmluZ0xpc3QgcGFyYW1WYWx1ZXM7
CiAgICAgICAgUU9iamVjdCAqcmV0dXJuVmFsdWU7CiAgICB9OwoKICAgIFFMaXN0PENhbGxJbmZv
PiBjYWxsczsKCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgUU9iamVjdCAqY3JlYXRlUGx1Z2luKGNv
bnN0IFFTdHJpbmcgJmNsYXNzaWQsIGNvbnN0IFFVcmwgJnVybCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFFTdHJpbmdMaXN0ICZwYXJhbU5hbWVzLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVN0cmluZ0xpc3QgJnBhcmFtVmFsdWVzKQog
ICAgewogICAgICAgIFFPYmplY3QgKnJlc3VsdCA9IDA7CiAgICAgICAgaWYgKGNsYXNzaWQgPT0g
InB1c2hidXR0b24iKQogICAgICAgICAgICByZXN1bHQgPSBuZXcgUVB1c2hCdXR0b24oKTsKICAg
ICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgIHJlc3VsdC0+c2V0T2JqZWN0TmFtZShjbGFz
c2lkKTsKICAgICAgICB9CiAgICAgICAgY2FsbHMuYXBwZW5kKENhbGxJbmZvKGNsYXNzaWQsIHVy
bCwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMsIHJlc3VsdCkpOwogICAgICAgIHJldHVybiByZXN1
bHQ7CiAgICB9Cn07Cgp2b2lkIHRzdF9RV2ViUGFnZTo6cmVzaXplSlMoKQp7CiAgICBRU2lnbmFs
U3B5IGxvYWRTcHkobV92aWV3LCBTSUdOQUwobG9hZEZpbmlzaGVkKGJvb2wpKSk7CgogICAgUGx1
Z2luUGFnZSogbmV3UGFnZSA9IG5ldyBQbHVnaW5QYWdlKG1fdmlldyk7CiAgICBtX3ZpZXctPnNl
dFBhZ2UobmV3UGFnZSk7CgogICAgbV92aWV3LT5zZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdl
YlNldHRpbmdzOjpQbHVnaW5zRW5hYmxlZCwgdHJ1ZSk7CiAgICBtX3ZpZXctPnNldHRpbmdzKCkt
PnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkphdmFzY3JpcHRFbmFibGVkLCB0cnVlKTsKCiAg
ICAvLyBhZGQgYW4gaW1hZ2UgYW5kIGEgd2lkZ2V0IHRvIHRoZSBwYWdlIHVzaW5nIDxpbWc+IGFu
ZCA8b2JqZWN0Pi4KICAgIG1fdmlldy0+c2V0SHRtbChRU3RyaW5nKCI8aHRtbD48Ym9keT48aW1n
IGlkPSdxdGxvZ28nIHNyYz0naHR0cDovL3d3dy5xdHNvZnR3YXJlLmNvbS9sb2dvLnBuZycgd2lk
dGg9JzcxJyBoZWlnaHQ9JzE3NCcvPjxvYmplY3QgdHlwZT0nYXBwbGljYXRpb24veC1xdC1wbHVn
aW4nIGNsYXNzaWQ9J3B1c2hidXR0b24nIGlkPSdteWJ1dHRvbicgd2lkdGg9JzEwMCcgaGVpZ2h0
PScxMDAnIGZvbz0nYmFyJy8+PC9ib2R5PjwvaHRtbD4iKSk7CgogICAgLy8gd2FpdCBmb3IgdGhl
IHBhZ2UgdG8gbG9hZAogICAgUVRSWV9DT01QQVJFKGxvYWRTcHkuY291bnQoKSwgMSk7CgogICAg
Ly8gZW5zdXJlIHRoZSB3aWRnZXQgaGFzIGJlZW4gY3JlYXRlZCBjb3JyZWN0bHkKICAgIFFDT01Q
QVJFKG5ld1BhZ2UtPmNhbGxzLmNvdW50KCksIDEpOwogICAgewogICAgICAgIFBsdWdpblBhZ2U6
OkNhbGxJbmZvIGNpID0gbmV3UGFnZS0+Y2FsbHMuZmlyc3QoKTsKICAgICAgICBRQ09NUEFSRShj
aS5jbGFzc2lkLCBRU3RyaW5nOjpmcm9tTGF0aW4xKCJwdXNoYnV0dG9uIikpOwogICAgICAgIFFW
RVJJRlkoY2kucmV0dXJuVmFsdWUgIT0gMCk7CiAgICAgICAgUVZFUklGWShjaS5yZXR1cm5WYWx1
ZS0+aW5oZXJpdHMoIlFQdXNoQnV0dG9uIikpOwogICAgICAgIGNvbnN0IGludCB3X2luZGV4ID0g
Y2kucGFyYW1OYW1lcy5pbmRleE9mKCJ3aWR0aCIpOwogICAgICAgIGNvbnN0IGludCBoX2luZGV4
ID0gY2kucGFyYW1OYW1lcy5pbmRleE9mKCJoZWlnaHQiKTsKICAgICAgICBRVkVSSUZZKHdfaW5k
ZXggIT0gLTEpOwogICAgICAgIFFWRVJJRlkoaF9pbmRleCAhPSAtMSk7CiAgICAgICAgUVZFUklG
WShjaS5wYXJhbVZhbHVlcy52YWx1ZSh3X2luZGV4KSA9PSAiMTAwIik7CiAgICAgICAgUVZFUklG
WShjaS5wYXJhbVZhbHVlcy52YWx1ZShoX2luZGV4KSA9PSAiMTAwIik7CgogICAgICAgIC8vIHRl
c3Qgd2lkZ2V0IHNpemUKICAgICAgICBRUHVzaEJ1dHRvbiogcGIgPSBkeW5hbWljX2Nhc3Q8UVB1
c2hCdXR0b24qPihjaS5yZXR1cm5WYWx1ZSk7CiAgICAgICAgUVZFUklGWShwYik7CiAgICAgICAg
UVZFUklGWShwYi0+c2l6ZSgpID09IFFTaXplKDEwMCwgMTAwKSk7CgogICAgICAgIC8vIHRlc3Qg
d2lkZ2V0IHNpemUgKEpTKQogICAgICAgIHsKICAgICAgICBRU3RyaW5nIGpzID0gUUxhdGluMVN0
cmluZygiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215YnV0dG9uJykud2lkdGggKyAneCcgKyBk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlidXR0b24nKS5oZWlnaHQiKTsKICAgICAgICBRU3Ry
aW5nIGpzX3JlcyA9Cm5ld1BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoanMp
LnRvU3RyaW5nKCk7CiAgICAgICAgUVZFUklGWShqc19yZXMgPT0gUVN0cmluZygiMTAweDEwMCIp
KTsKICAgICAgICB9CgogICAgICAgIC8vIHRlc3QgaW1hZ2Ugc2l6ZSAoSlMpCiAgICAgICAgewog
ICAgICAgIFFTdHJpbmcganMgPSBRTGF0aW4xU3RyaW5nKCJkb2N1bWVudC5nZXRFbGVtZW50QnlJ
ZCgncXRsb2dvJykud2lkdGggKyAneCcgKyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXRsb2dv
JykuaGVpZ2h0Iik7CiAgICAgICAgUVN0cmluZyBqc19yZXMgPQpuZXdQYWdlLT5tYWluRnJhbWUo
KS0+ZXZhbHVhdGVKYXZhU2NyaXB0KGpzKS50b1N0cmluZygpOwogICAgICAgIFFWRVJJRlkoanNf
cmVzID09IFFTdHJpbmcoIjcxeDE3NCIpKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gcmVzaXpl
IGltYWdlIChKUykKICAgIHsKICAgIFFTdHJpbmcganMgPSBRTGF0aW4xU3RyaW5nKCJkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgncXRsb2dvJykud2lkdGggPSAnMTQyJzsiKTsKICAgIFFTdHJpbmcg
anNfcmVzID0gbmV3UGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdChqcykudG9T
dHJpbmcoKTsKICAgIFFWRVJJRlkoanNfcmVzID09IFFTdHJpbmcoIjE0MiIpKTsKCiAgICBqcyA9
IFFMYXRpbjFTdHJpbmcoImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdGxvZ28nKS5oZWlnaHQg
PSAnMzQ4JzsiKTsKICAgIGpzX3JlcyA9IG5ld1BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUph
dmFTY3JpcHQoanMpLnRvU3RyaW5nKCk7CiAgICBRVkVSSUZZKGpzX3JlcyA9PSBRU3RyaW5nKCIz
NDgiKSk7CgogICAgLy8gY2hlY2sgaW1hZ2Ugc2l6ZQogICAganMgPSBRTGF0aW4xU3RyaW5nKCJk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXRsb2dvJykud2lkdGggKyAneCcgKyBkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCgncXRsb2dvJykuaGVpZ2h0Iik7CiAgICBqc19yZXMgPSBuZXdQYWdlLT5t
YWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KGpzKS50b1N0cmluZygpOwogICAgUVZFUklG
WShqc19yZXMgPT0gUVN0cmluZygiMTQyeDM0OCIpKTsKICAgIH0KCgogICAgLy8gcmVzaXplIHdp
ZGdldCAoSlMpCiAgICB7CiAgICBRU3RyaW5nIGpzLCBqc19yZXM7CgogICAgLy8gdGVzdCBjdXN0
b20gYXR0cmlidXRlICh0aGlzIHdvcmtzISkKICAgIGpzID0gUUxhdGluMVN0cmluZygiZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoJ215YnV0dG9uJykuZm9vID0gJ2JhcjInOyIpOwogICAganNfcmVz
ID0gbmV3UGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdChqcykudG9TdHJpbmco
KTsKICAgIFFWRVJJRlkoanNfcmVzID09IFFTdHJpbmcoImJhcjIiKSk7CgogICAganMgPSBRTGF0
aW4xU3RyaW5nKCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlidXR0b24nKS5mb28iKTsKICAg
IGpzX3JlcyA9IG5ld1BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoanMpLnRv
U3RyaW5nKCk7CiAgICBRVkVSSUZZKGpzX3JlcyA9PSBRU3RyaW5nKCJiYXIyIikpOwoKICAgIC8v
IHRlc3Qgd2lkdGggYW5kIGhlaWdodCBhdHRyaWJ1dGVzCiAgICBqcyA9IFFMYXRpbjFTdHJpbmco
ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWJ1dHRvbicpLndpZHRoID0gMjAwOyIpOwogICAg
anNfcmVzID0gbmV3UGFnZS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdChqcykudG9T
dHJpbmcoKTsKICAgIFFWRVJJRlkoanNfcmVzID09IFFTdHJpbmcoIjIwMCIpKTsKCiAgICBqcyA9
IFFMYXRpbjFTdHJpbmcoImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWJ1dHRvbicpLmhlaWdo
dCA9IDIwMDsiKTsKICAgIGpzX3JlcyA9IG5ld1BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUph
dmFTY3JpcHQoanMpLnRvU3RyaW5nKCk7CiAgICBRVkVSSUZZKGpzX3JlcyA9PSBRU3RyaW5nKCIy
MDAiKSk7CgogICAgLy8gY2hlY2sgd2lkZ2V0IHNpemUKICAgIGpzID0gUUxhdGluMVN0cmluZygi
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215YnV0dG9uJykud2lkdGggKyAneCcgKyBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgnbXlidXR0b24nKS5oZWlnaHQiKTsKICAgIGpzX3JlcyA9IG5ld1Bh
Z2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoanMpLnRvU3RyaW5nKCk7CiAgICBR
VkVSSUZZKGpzX3JlcyA9PSBRU3RyaW5nKCIyMDB4MjAwIikpOwogICAgfQoKICAgIC8vIGVuc3Vy
ZSB0aGUgcGx1Z2luIGhhcyBiZWVuIHJlc2l6ZWQgYXMgd2VsbAogICAgewogICAgICAgIFBsdWdp
blBhZ2U6OkNhbGxJbmZvIGNpID0gbmV3UGFnZS0+Y2FsbHMuZmlyc3QoKTsKICAgICAgICBRUHVz
aEJ1dHRvbiogcGIgPSBkeW5hbWljX2Nhc3Q8UVB1c2hCdXR0b24qPihjaS5yZXR1cm5WYWx1ZSk7
CiAgICAgICAgUVZFUklGWShwYik7CiAgICAgICAgUVZFUklGWShwYi0+c2l6ZSgpID09IFFTaXpl
KDIwMCwgMjAwKSk7CiAgICB9Cn0KCnZvaWQgdHN0X1FXZWJQYWdlOjpyZXNpemVXaWRnZXROb1Jl
cGFpbnQoKQp7CiAgICByZXNpemVXaWRnZXQoZmFsc2UpOwp9Cgp2b2lkIHRzdF9RV2ViUGFnZTo6
cmVzaXplV2lkZ2V0V2l0aFJlcGFpbnQoKQp7CiAgICByZXNpemVXaWRnZXQodHJ1ZSk7Cn0KCnZv
aWQgdHN0X1FXZWJQYWdlOjpyZXNpemVXaWRnZXQoYm9vbCByZXBhaW50KQp7CiAgICBRU2lnbmFs
U3B5IGxvYWRTcHkobV92aWV3LCBTSUdOQUwobG9hZEZpbmlzaGVkKGJvb2wpKSk7CgogICAgUGx1
Z2luUGFnZSogbmV3UGFnZSA9IG5ldyBQbHVnaW5QYWdlKG1fdmlldyk7CiAgICBtX3ZpZXctPnNl
dFBhZ2UobmV3UGFnZSk7CgogICAgbV92aWV3LT5zZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdl
YlNldHRpbmdzOjpQbHVnaW5zRW5hYmxlZCwgdHJ1ZSk7CiAgICBtX3ZpZXctPnNldHRpbmdzKCkt
PnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkphdmFzY3JpcHRFbmFibGVkLCB0cnVlKTsKCiAg
ICAvLyBhZGQgYSAxMDB4MTAwIHdpZGdldAogICAgbV92aWV3LT5zZXRIdG1sKFFTdHJpbmcoIjxo
dG1sPjxib2R5PjxvYmplY3QgdHlwZT0nYXBwbGljYXRpb24veC1xdC1wbHVnaW4nIGNsYXNzaWQ9
J3B1c2hidXR0b24nIGlkPSdteWJ1dHRvbicgd2lkdGg9JzEwMCcgaGVpZ2h0PScxMDAnLz48L2Jv
ZHk+PC9odG1sPiIpKTsKCiAgICAvLyB3YWl0IGZvciB0aGUgcGFnZSB0byBsb2FkCiAgICBRVFJZ
X0NPTVBBUkUobG9hZFNweS5jb3VudCgpLCAxKTsKCiAgICBtX3ZpZXctPnNob3coKTsKCiAgICAv
LyBlbnN1cmUgdGhlIHdpZGdldCBoYXMgYmVlbiBjcmVhdGVkIGNvcnJlY3RseQogICAgUUNPTVBB
UkUobmV3UGFnZS0+Y2FsbHMuY291bnQoKSwgMSk7CiAgICB7CiAgICAgICAgUGx1Z2luUGFnZTo6
Q2FsbEluZm8gY2kgPSBuZXdQYWdlLT5jYWxscy5maXJzdCgpOwogICAgICAgIFFDT01QQVJFKGNp
LmNsYXNzaWQsIFFTdHJpbmc6OmZyb21MYXRpbjEoInB1c2hidXR0b24iKSk7CiAgICAgICAgUVZF
UklGWShjaS5yZXR1cm5WYWx1ZSAhPSAwKTsKICAgICAgICBRVkVSSUZZKGNpLnJldHVyblZhbHVl
LT5pbmhlcml0cygiUVB1c2hCdXR0b24iKSk7CiAgICAgICAgY29uc3QgaW50IHdfaW5kZXggPSBj
aS5wYXJhbU5hbWVzLmluZGV4T2YoIndpZHRoIik7CiAgICAgICAgY29uc3QgaW50IGhfaW5kZXgg
PSBjaS5wYXJhbU5hbWVzLmluZGV4T2YoImhlaWdodCIpOwogICAgICAgIFFWRVJJRlkod19pbmRl
eCAhPSAtMSk7CiAgICAgICAgUVZFUklGWShoX2luZGV4ICE9IC0xKTsKICAgICAgICBRVkVSSUZZ
KGNpLnBhcmFtVmFsdWVzLnZhbHVlKHdfaW5kZXgpID09ICIxMDAiKTsKICAgICAgICBRVkVSSUZZ
KGNpLnBhcmFtVmFsdWVzLnZhbHVlKGhfaW5kZXgpID09ICIxMDAiKTsKCiAgICAgICAgLy8gdGVz
dCB3aWRnZXQgc2l6ZQogICAgICAgIFFQdXNoQnV0dG9uKiBwYiA9IGR5bmFtaWNfY2FzdDxRUHVz
aEJ1dHRvbio+KGNpLnJldHVyblZhbHVlKTsKICAgICAgICBRVkVSSUZZKHBiKTsKICAgICAgICBR
VkVSSUZZKHBiLT5zaXplKCkgPT0gUVNpemUoMTAwLCAxMDApKTsKCiAgICAgICAgLy8gbm93IHJl
c2l6ZSB0aGUgd2lkZ2V0CiAgICAgICAgcGItPnJlc2l6ZShRU2l6ZSgzMDAsIDMwMCkpOwogICAg
ICAgIFFWRVJJRlkocGItPnNpemUoKSA9PSBRU2l6ZSgzMDAsIDMwMCkpOwogICAgfQoKICAgIC8v
IGNoZWNrIDxvYmplY3Q+IHNpemUKICAgIHsKICAgIFFTdHJpbmcganMsIGpzX3JlczsKICAgIGpz
ID0gUUxhdGluMVN0cmluZygiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215YnV0dG9uJykud2lk
dGggKyAneCcgKyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlidXR0b24nKS5oZWlnaHQiKTsK
ICAgIGpzX3JlcyA9IG5ld1BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoanMp
LnRvU3RyaW5nKCk7CiAgICBRVkVSSUZZKGpzX3JlcyA9PSBRU3RyaW5nKCIzMDB4MzAwIikpOwog
ICAgfQoKICAgIGlmIChyZXBhaW50KQogICAgICAgIG1fdmlldy0+cmVwYWludCgpOwoKICAgIHsK
ICAgIFFTdHJpbmcganMsIGpzX3JlczsKICAgIGpzID0gUUxhdGluMVN0cmluZygiZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoJ215YnV0dG9uJykud2lkdGggKyAneCcgKyBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgnbXlidXR0b24nKS5oZWlnaHQiKTsKICAgIGpzX3JlcyA9IG5ld1BhZ2UtPm1haW5G
cmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoanMpLnRvU3RyaW5nKCk7CiAgICBRVkVSSUZZKGpz
X3JlcyA9PSBRU3RyaW5nKCIzMDB4MzAwIikpOwogICAgfQoKICAgIC8vIHJlLWNoZWNrIDxvYmpl
Y3Q+IHNpemUKICAgIHsKICAgICAgICBRU3RyaW5nIGpzLCBqc19yZXM7CiAgICAgICAganMgPSBR
TGF0aW4xU3RyaW5nKCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlidXR0b24nKS53aWR0aCAr
ICd4JyArIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWJ1dHRvbicpLmhlaWdodCIpOwogICAg
ICAgIGpzX3JlcyA9IG5ld1BhZ2UtPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoanMp
LnRvU3RyaW5nKCk7CiAgICAgICAgUVZFUklGWShqc19yZXMgPT0gUVN0cmluZygiMzAweDMwMCIp
KTsKICAgIH0KCiAgICAvLyByZS1jaGVjayB0aGUgcGx1Z2luIHNpemUKICAgIHsKICAgICAgICBQ
bHVnaW5QYWdlOjpDYWxsSW5mbyBjaSA9IG5ld1BhZ2UtPmNhbGxzLmZpcnN0KCk7CiAgICAgICAg
UVB1c2hCdXR0b24qIHBiID0gZHluYW1pY19jYXN0PFFQdXNoQnV0dG9uKj4oY2kucmV0dXJuVmFs
dWUpOwogICAgICAgIFFWRVJJRlkocGIpOwogICAgICAgIFFWRVJJRlkocGItPnNpemUoKSA9PSBR
U2l6ZSgzMDAsIDMwMCkpOwogICAgfQp9CgpRVEVTVF9NQUlOKHRzdF9RV2ViUGFnZSkKI2luY2x1
ZGUgIm1haW4ubW9jIgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>