<?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>122848</bug_id>
          
          <creation_ts>2013-10-15 11:41:16 -0700</creation_ts>
          <short_desc>Adding Mock class to test RTCPeerConnection</short_desc>
          <delta_ts>2013-11-13 11:01:22 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>124288</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Thiago de Barros Lacerda">thiago.lacerda</reporter>
          <assigned_to name="Thiago de Barros Lacerda">thiago.lacerda</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>glenn</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>hta</cc>
    
    <cc>jer.noble</cc>
    
    <cc>pnormand</cc>
    
    <cc>rakuco</cc>
    
    <cc>sergio</cc>
    
    <cc>tommyw</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>940061</commentid>
    <comment_count>0</comment_count>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-15 11:41:16 -0700</bug_when>
    <thetext>In order to run the RTCPeerConnection Layout tests, a mock class must be provided, so we don&apos;t depend on the user&apos;s platform.
This patch adds a mock class RTCPeerConnectionHandler. Then the following tests can be run:

    * RTCPeerConnection-createAnswer.html
    * RTCPeerConnection-createOffer.html
    * RTCPeerConnection-ice.html
    * RTCPeerConnection-localDescription.html
    * RTCPeerConnection-remoteDescription.html
    * RTCPeerConnection-state.html

Tests that require a MediaStream object, by invoking getUserMedia, are not ready to run yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>940065</commentid>
    <comment_count>1</comment_count>
      <attachid>214287</attachid>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-15 11:50:03 -0700</bug_when>
    <thetext>Created attachment 214287
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>940649</commentid>
    <comment_count>2</comment_count>
      <attachid>214287</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2013-10-16 22:24:20 -0700</bug_when>
    <thetext>Comment on attachment 214287
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=214287&amp;action=review

&gt; Source/WebCore/ChangeLog:44
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::create):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::RTCPeerConnectionHandlerMock):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::initialize):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::createOffer):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::createAnswer):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::setLocalDescription):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::setRemoteDescription):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::localDescription):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::remoteDescription):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::updateIce):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::addIceCandidate):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::addStream):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::removeStream):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::getStats):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::createDataChannel):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::createDTMFSender):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::stop):

Nit: these un-commented method names for the newly added file are unnecessary.

&gt; Source/WebCore/ChangeLog:57
&gt; +        (WebCore::RequestNotifier::~RequestNotifier):
&gt; +        (WebCore::SessionRequestNotifier::SessionRequestNotifier):
&gt; +        (WebCore::SessionRequestNotifier::fire):
&gt; +        (WebCore::VoidRequestNotifier::VoidRequestNotifier):
&gt; +        (WebCore::VoidRequestNotifier::fire):
&gt; +        (WebCore::IceConnectionNotifier::IceConnectionNotifier):
&gt; +        (WebCore::IceConnectionNotifier::fire):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::~RTCPeerConnectionHandlerMock):
&gt; +        (WebCore::RTCPeerConnectionHandlerMock::removeEventFromVector):
&gt; +        (WebCore::TimerEvent::TimerEvent):
&gt; +        (WebCore::TimerEvent::~TimerEvent):
&gt; +        (WebCore::TimerEvent::timerFired):

Ditto.

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:2
&gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).

Is this correct?

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:48
&gt; +bool RTCPeerConnectionHandlerMock::initialize(PassRefPtr&lt;RTCConfiguration&gt;, PassRefPtr&lt;MediaConstraints&gt; constraints)

&quot;constraints&quot; is unused. The parameter name should be omitted and you should have a FIXME with a bug number about adding support.

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:67
&gt; +void RTCPeerConnectionHandlerMock::createAnswer(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;MediaConstraints&gt; constraints)

Ditto.

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:120
&gt; +bool RTCPeerConnectionHandlerMock::addIceCandidate(PassRefPtr&lt;RTCVoidRequest&gt; request, PassRefPtr&lt;RTCIceCandidateDescriptor&gt; iceDescriptor)

&quot;iceDescriptor&quot; is unused, you should omit the name.

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:127
&gt; +bool RTCPeerConnectionHandlerMock::addStream(PassRefPtr&lt;MediaStreamDescriptor&gt;, PassRefPtr&lt;MediaConstraints&gt;)

FIXME about adding support for constraints?

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:142
&gt; +void RTCPeerConnectionHandlerMock::getStats(PassRefPtr&lt;RTCStatsRequest&gt;)
&gt; +{
&gt; +}

FIXME?

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:152
&gt; +PassOwnPtr&lt;RTCDTMFSenderHandler&gt; RTCPeerConnectionHandlerMock::createDTMFSender(PassRefPtr&lt;MediaStreamSource&gt;)
&gt; +{
&gt; +    return 0;
&gt; +}

Ditto.

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:2
&gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).

Is this correct?

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:106
&gt; +class RequestNotifier : public RefCounted&lt;RequestNotifier&gt; {
&gt; +public:
&gt; +    virtual ~RequestNotifier() { }
&gt; +    virtual void fire() = 0;
&gt; +};
&gt; +
&gt; +class SessionRequestNotifier : public RequestNotifier {
&gt; +public:
&gt; +    SessionRequestNotifier(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; descriptor)
&gt; +        : m_request(request)
&gt; +        , m_descriptor(descriptor)
&gt; +    { }
&gt; +
&gt; +    void fire()
&gt; +    {
&gt; +        if (m_descriptor)
&gt; +            m_request-&gt;requestSucceeded(m_descriptor);
&gt; +        else
&gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; +    }
&gt; +
&gt; +private:
&gt; +    RefPtr&lt;RTCSessionDescriptionRequest&gt; m_request;
&gt; +    RefPtr&lt;RTCSessionDescriptionDescriptor&gt; m_descriptor;
&gt; +};
&gt; +
&gt; +class VoidRequestNotifier : public RequestNotifier {
&gt; +public:
&gt; +    VoidRequestNotifier(PassRefPtr&lt;RTCVoidRequest&gt; request, bool success)
&gt; +        : m_request(request)
&gt; +        , m_success(success)
&gt; +    { }
&gt; +
&gt; +    void fire()
&gt; +    {
&gt; +        if (m_success)
&gt; +            m_request-&gt;requestSucceeded();
&gt; +        else
&gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; +    }
&gt; +
&gt; +private:
&gt; +    RefPtr&lt;RTCVoidRequest&gt; m_request;
&gt; +    bool m_success;
&gt; +};
&gt; +
&gt; +class IceConnectionNotifier : public RequestNotifier {
&gt; +public:
&gt; +    IceConnectionNotifier(RTCPeerConnectionHandlerClient* client, RTCPeerConnectionHandlerClient::IceConnectionState connectionState, RTCPeerConnectionHandlerClient::IceGatheringState gatheringState)
&gt; +        : m_client(client)
&gt; +        , m_connectionState(connectionState)
&gt; +        , m_gatheringState(gatheringState)
&gt; +    { }
&gt; +
&gt; +    void fire()
&gt; +    {
&gt; +        m_client-&gt;didChangeIceGatheringState(m_gatheringState);
&gt; +        m_client-&gt;didChangeIceConnectionState(m_connectionState);
&gt; +    }
&gt; +
&gt; +private:
&gt; +    RTCPeerConnectionHandlerClient* m_client;
&gt; +    RTCPeerConnectionHandlerClient::IceConnectionState m_connectionState;
&gt; +    RTCPeerConnectionHandlerClient::IceGatheringState m_gatheringState;
&gt; +};

Do these need to be in the header file?

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:168
&gt; +struct TimerEvent : public RefCounted&lt;TimerEvent&gt; {
&gt; +    TimerEvent(RTCPeerConnectionHandlerMock* mock, PassRefPtr&lt;RequestNotifier&gt; notifier)
&gt; +        : m_mock(mock)
&gt; +        , m_timer(this, &amp;TimerEvent::timerFired)
&gt; +        , m_notifier(notifier)
&gt; +    {
&gt; +        m_timer.startOneShot(0.5);
&gt; +    }
&gt; +
&gt; +    virtual ~TimerEvent() { }
&gt; +
&gt; +    void timerFired(Timer&lt;TimerEvent&gt;*)
&gt; +    {
&gt; +        m_notifier-&gt;fire();
&gt; +        m_mock-&gt;removeEventFromVector(this);
&gt; +    }
&gt; +
&gt; +    RTCPeerConnectionHandlerMock* m_mock;
&gt; +    Timer&lt;TimerEvent&gt; m_timer;
&gt; +    RefPtr&lt;RequestNotifier&gt; m_notifier;
&gt; +};

Ditto.

&gt; Source/WebCore/testing/Internals.cpp:654
&gt; +    RTCPeerConnectionHandler::create = RTCPeerConnectionHandlerMock::create;

Clever!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>940758</commentid>
    <comment_count>3</comment_count>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-17 06:47:12 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 214287 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=214287&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:44
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::create):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::RTCPeerConnectionHandlerMock):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::initialize):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createOffer):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createAnswer):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::setLocalDescription):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::setRemoteDescription):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::localDescription):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::remoteDescription):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::updateIce):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::addIceCandidate):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::addStream):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::removeStream):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::getStats):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createDataChannel):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createDTMFSender):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::stop):
&gt; 
&gt; Nit: these un-commented method names for the newly added file are unnecessary.

OK, I will remove them

&gt; 
&gt; &gt; Source/WebCore/ChangeLog:57
&gt; &gt; +        (WebCore::RequestNotifier::~RequestNotifier):
&gt; &gt; +        (WebCore::SessionRequestNotifier::SessionRequestNotifier):
&gt; &gt; +        (WebCore::SessionRequestNotifier::fire):
&gt; &gt; +        (WebCore::VoidRequestNotifier::VoidRequestNotifier):
&gt; &gt; +        (WebCore::VoidRequestNotifier::fire):
&gt; &gt; +        (WebCore::IceConnectionNotifier::IceConnectionNotifier):
&gt; &gt; +        (WebCore::IceConnectionNotifier::fire):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::~RTCPeerConnectionHandlerMock):
&gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::removeEventFromVector):
&gt; &gt; +        (WebCore::TimerEvent::TimerEvent):
&gt; &gt; +        (WebCore::TimerEvent::~TimerEvent):
&gt; &gt; +        (WebCore::TimerEvent::timerFired):
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:2
&gt; &gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
&gt; 
&gt; Is this correct?

Yes :). We are a Nokia Research Center

&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:48
&gt; &gt; +bool RTCPeerConnectionHandlerMock::initialize(PassRefPtr&lt;RTCConfiguration&gt;, PassRefPtr&lt;MediaConstraints&gt; constraints)
&gt; 
&gt; &quot;constraints&quot; is unused. The parameter name should be omitted and you should have a FIXME with a bug number about adding support.

The constraints support depends on the RTCPeerConnectionHandler implementation (he is the one who will take care of that). By now there is no default RTCPeerConnectionHandler implementation (each platform is supposed to implement its own). So I think we don&apos;t need a bug to fix that, now.
Additionally, there is no LayouTests testing the RTCPeerConnection + constraints. If, in the future, is added a test like this, then this should be taken into account.
What do you think?
&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:67
&gt; &gt; +void RTCPeerConnectionHandlerMock::createAnswer(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;MediaConstraints&gt; constraints)
&gt; 
&gt; Ditto.

Ditto.

&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:120
&gt; &gt; +bool RTCPeerConnectionHandlerMock::addIceCandidate(PassRefPtr&lt;RTCVoidRequest&gt; request, PassRefPtr&lt;RTCIceCandidateDescriptor&gt; iceDescriptor)
&gt; 
&gt; &quot;iceDescriptor&quot; is unused, you should omit the name.

OK

&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:127
&gt; &gt; +bool RTCPeerConnectionHandlerMock::addStream(PassRefPtr&lt;MediaStreamDescriptor&gt;, PassRefPtr&lt;MediaConstraints&gt;)
&gt; 
&gt; FIXME about adding support for constraints?
&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:142
&gt; &gt; +void RTCPeerConnectionHandlerMock::getStats(PassRefPtr&lt;RTCStatsRequest&gt;)
&gt; &gt; +{
&gt; &gt; +}
&gt; 
&gt; FIXME?

This test requires getUserMedia support, which is not possible in the current trunk. I will put a &quot;notImplemented()&quot; and a comment telling that when getUserMedia is ready this method should be fixed. Is that OK for you?

&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:152
&gt; &gt; +PassOwnPtr&lt;RTCDTMFSenderHandler&gt; RTCPeerConnectionHandlerMock::createDTMFSender(PassRefPtr&lt;MediaStreamSource&gt;)
&gt; &gt; +{
&gt; &gt; +    return 0;
&gt; &gt; +}
&gt; 
&gt; Ditto.

Ditto.

&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:2
&gt; &gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
&gt; 
&gt; Is this correct?
&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:106
&gt; &gt; +class RequestNotifier : public RefCounted&lt;RequestNotifier&gt; {
&gt; &gt; +public:
&gt; &gt; +    virtual ~RequestNotifier() { }
&gt; &gt; +    virtual void fire() = 0;
&gt; &gt; +};
&gt; &gt; +
&gt; &gt; +class SessionRequestNotifier : public RequestNotifier {
&gt; &gt; +public:
&gt; &gt; +    SessionRequestNotifier(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; descriptor)
&gt; &gt; +        : m_request(request)
&gt; &gt; +        , m_descriptor(descriptor)
&gt; &gt; +    { }
&gt; &gt; +
&gt; &gt; +    void fire()
&gt; &gt; +    {
&gt; &gt; +        if (m_descriptor)
&gt; &gt; +            m_request-&gt;requestSucceeded(m_descriptor);
&gt; &gt; +        else
&gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +private:
&gt; &gt; +    RefPtr&lt;RTCSessionDescriptionRequest&gt; m_request;
&gt; &gt; +    RefPtr&lt;RTCSessionDescriptionDescriptor&gt; m_descriptor;
&gt; &gt; +};
&gt; &gt; +
&gt; &gt; +class VoidRequestNotifier : public RequestNotifier {
&gt; &gt; +public:
&gt; &gt; +    VoidRequestNotifier(PassRefPtr&lt;RTCVoidRequest&gt; request, bool success)
&gt; &gt; +        : m_request(request)
&gt; &gt; +        , m_success(success)
&gt; &gt; +    { }
&gt; &gt; +
&gt; &gt; +    void fire()
&gt; &gt; +    {
&gt; &gt; +        if (m_success)
&gt; &gt; +            m_request-&gt;requestSucceeded();
&gt; &gt; +        else
&gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +private:
&gt; &gt; +    RefPtr&lt;RTCVoidRequest&gt; m_request;
&gt; &gt; +    bool m_success;
&gt; &gt; +};
&gt; &gt; +
&gt; &gt; +class IceConnectionNotifier : public RequestNotifier {
&gt; &gt; +public:
&gt; &gt; +    IceConnectionNotifier(RTCPeerConnectionHandlerClient* client, RTCPeerConnectionHandlerClient::IceConnectionState connectionState, RTCPeerConnectionHandlerClient::IceGatheringState gatheringState)
&gt; &gt; +        : m_client(client)
&gt; &gt; +        , m_connectionState(connectionState)
&gt; &gt; +        , m_gatheringState(gatheringState)
&gt; &gt; +    { }
&gt; &gt; +
&gt; &gt; +    void fire()
&gt; &gt; +    {
&gt; &gt; +        m_client-&gt;didChangeIceGatheringState(m_gatheringState);
&gt; &gt; +        m_client-&gt;didChangeIceConnectionState(m_connectionState);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +private:
&gt; &gt; +    RTCPeerConnectionHandlerClient* m_client;
&gt; &gt; +    RTCPeerConnectionHandlerClient::IceConnectionState m_connectionState;
&gt; &gt; +    RTCPeerConnectionHandlerClient::IceGatheringState m_gatheringState;
&gt; &gt; +};
&gt; 
&gt; Do these need to be in the header file?

No, they do not need to be here. I just put them inside this header because they are small classes with tiny implementations. But I can put them in another header (maybe named Notifiers.h), what do you think? Do you think it is better to separate the methods and constructors implementations in a cpp file as well?

&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:168
&gt; &gt; +struct TimerEvent : public RefCounted&lt;TimerEvent&gt; {
&gt; &gt; +    TimerEvent(RTCPeerConnectionHandlerMock* mock, PassRefPtr&lt;RequestNotifier&gt; notifier)
&gt; &gt; +        : m_mock(mock)
&gt; &gt; +        , m_timer(this, &amp;TimerEvent::timerFired)
&gt; &gt; +        , m_notifier(notifier)
&gt; &gt; +    {
&gt; &gt; +        m_timer.startOneShot(0.5);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    virtual ~TimerEvent() { }
&gt; &gt; +
&gt; &gt; +    void timerFired(Timer&lt;TimerEvent&gt;*)
&gt; &gt; +    {
&gt; &gt; +        m_notifier-&gt;fire();
&gt; &gt; +        m_mock-&gt;removeEventFromVector(this);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    RTCPeerConnectionHandlerMock* m_mock;
&gt; &gt; +    Timer&lt;TimerEvent&gt; m_timer;
&gt; &gt; +    RefPtr&lt;RequestNotifier&gt; m_notifier;
&gt; &gt; +};
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Source/WebCore/testing/Internals.cpp:654
&gt; &gt; +    RTCPeerConnectionHandler::create = RTCPeerConnectionHandlerMock::create;
&gt; 
&gt; Clever!
Thanks :). hugopl also deserves this compliment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>940761</commentid>
    <comment_count>4</comment_count>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-17 06:52:35 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; (From update of attachment 214287 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=214287&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/ChangeLog:44
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::create):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::RTCPeerConnectionHandlerMock):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::initialize):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createOffer):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createAnswer):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::setLocalDescription):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::setRemoteDescription):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::localDescription):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::remoteDescription):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::updateIce):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::addIceCandidate):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::addStream):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::removeStream):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::getStats):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createDataChannel):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::createDTMFSender):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::stop):
&gt; &gt; 
&gt; &gt; Nit: these un-commented method names for the newly added file are unnecessary.
&gt; 
&gt; OK, I will remove them
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/ChangeLog:57
&gt; &gt; &gt; +        (WebCore::RequestNotifier::~RequestNotifier):
&gt; &gt; &gt; +        (WebCore::SessionRequestNotifier::SessionRequestNotifier):
&gt; &gt; &gt; +        (WebCore::SessionRequestNotifier::fire):
&gt; &gt; &gt; +        (WebCore::VoidRequestNotifier::VoidRequestNotifier):
&gt; &gt; &gt; +        (WebCore::VoidRequestNotifier::fire):
&gt; &gt; &gt; +        (WebCore::IceConnectionNotifier::IceConnectionNotifier):
&gt; &gt; &gt; +        (WebCore::IceConnectionNotifier::fire):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::~RTCPeerConnectionHandlerMock):
&gt; &gt; &gt; +        (WebCore::RTCPeerConnectionHandlerMock::removeEventFromVector):
&gt; &gt; &gt; +        (WebCore::TimerEvent::TimerEvent):
&gt; &gt; &gt; +        (WebCore::TimerEvent::~TimerEvent):
&gt; &gt; &gt; +        (WebCore::TimerEvent::timerFired):
&gt; &gt; 
&gt; &gt; Ditto.
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:2
&gt; &gt; &gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
&gt; &gt; 
&gt; &gt; Is this correct?
&gt; 
&gt; Yes :). We are a Nokia Research Center
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:48
&gt; &gt; &gt; +bool RTCPeerConnectionHandlerMock::initialize(PassRefPtr&lt;RTCConfiguration&gt;, PassRefPtr&lt;MediaConstraints&gt; constraints)
&gt; &gt; 
&gt; &gt; &quot;constraints&quot; is unused. The parameter name should be omitted and you should have a FIXME with a bug number about adding support.
&gt; 
&gt; The constraints support depends on the RTCPeerConnectionHandler implementation (he is the one who will take care of that). By now there is no default RTCPeerConnectionHandler implementation (each platform is supposed to implement its own). So I think we don&apos;t need a bug to fix that, now.
&gt; Additionally, there is no LayouTests testing the RTCPeerConnection + constraints. If, in the future, is added a test like this, then this should be taken into account.
&gt; What do you think?
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:67
&gt; &gt; &gt; +void RTCPeerConnectionHandlerMock::createAnswer(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;MediaConstraints&gt; constraints)
&gt; &gt; 
&gt; &gt; Ditto.
&gt; 
&gt; Ditto.

Sorry, this one we can do the same approach as in createOffer

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:120
&gt; &gt; &gt; +bool RTCPeerConnectionHandlerMock::addIceCandidate(PassRefPtr&lt;RTCVoidRequest&gt; request, PassRefPtr&lt;RTCIceCandidateDescriptor&gt; iceDescriptor)
&gt; &gt; 
&gt; &gt; &quot;iceDescriptor&quot; is unused, you should omit the name.
&gt; 
&gt; OK
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:127
&gt; &gt; &gt; +bool RTCPeerConnectionHandlerMock::addStream(PassRefPtr&lt;MediaStreamDescriptor&gt;, PassRefPtr&lt;MediaConstraints&gt;)
&gt; &gt; 
&gt; &gt; FIXME about adding support for constraints?
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:142
&gt; &gt; &gt; +void RTCPeerConnectionHandlerMock::getStats(PassRefPtr&lt;RTCStatsRequest&gt;)
&gt; &gt; &gt; +{
&gt; &gt; &gt; +}
&gt; &gt; 
&gt; &gt; FIXME?
&gt; 
&gt; This test requires getUserMedia support, which is not possible in the current trunk. I will put a &quot;notImplemented()&quot; and a comment telling that when getUserMedia is ready this method should be fixed. Is that OK for you?
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:152
&gt; &gt; &gt; +PassOwnPtr&lt;RTCDTMFSenderHandler&gt; RTCPeerConnectionHandlerMock::createDTMFSender(PassRefPtr&lt;MediaStreamSource&gt;)
&gt; &gt; &gt; +{
&gt; &gt; &gt; +    return 0;
&gt; &gt; &gt; +}
&gt; &gt; 
&gt; &gt; Ditto.
&gt; 
&gt; Ditto.

Ditto == Requires RTCDTMFSender support (handler as well)

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:2
&gt; &gt; &gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
&gt; &gt; 
&gt; &gt; Is this correct?
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:106
&gt; &gt; &gt; +class RequestNotifier : public RefCounted&lt;RequestNotifier&gt; {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    virtual ~RequestNotifier() { }
&gt; &gt; &gt; +    virtual void fire() = 0;
&gt; &gt; &gt; +};
&gt; &gt; &gt; +
&gt; &gt; &gt; +class SessionRequestNotifier : public RequestNotifier {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    SessionRequestNotifier(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; descriptor)
&gt; &gt; &gt; +        : m_request(request)
&gt; &gt; &gt; +        , m_descriptor(descriptor)
&gt; &gt; &gt; +    { }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        if (m_descriptor)
&gt; &gt; &gt; +            m_request-&gt;requestSucceeded(m_descriptor);
&gt; &gt; &gt; +        else
&gt; &gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +private:
&gt; &gt; &gt; +    RefPtr&lt;RTCSessionDescriptionRequest&gt; m_request;
&gt; &gt; &gt; +    RefPtr&lt;RTCSessionDescriptionDescriptor&gt; m_descriptor;
&gt; &gt; &gt; +};
&gt; &gt; &gt; +
&gt; &gt; &gt; +class VoidRequestNotifier : public RequestNotifier {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    VoidRequestNotifier(PassRefPtr&lt;RTCVoidRequest&gt; request, bool success)
&gt; &gt; &gt; +        : m_request(request)
&gt; &gt; &gt; +        , m_success(success)
&gt; &gt; &gt; +    { }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        if (m_success)
&gt; &gt; &gt; +            m_request-&gt;requestSucceeded();
&gt; &gt; &gt; +        else
&gt; &gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +private:
&gt; &gt; &gt; +    RefPtr&lt;RTCVoidRequest&gt; m_request;
&gt; &gt; &gt; +    bool m_success;
&gt; &gt; &gt; +};
&gt; &gt; &gt; +
&gt; &gt; &gt; +class IceConnectionNotifier : public RequestNotifier {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    IceConnectionNotifier(RTCPeerConnectionHandlerClient* client, RTCPeerConnectionHandlerClient::IceConnectionState connectionState, RTCPeerConnectionHandlerClient::IceGatheringState gatheringState)
&gt; &gt; &gt; +        : m_client(client)
&gt; &gt; &gt; +        , m_connectionState(connectionState)
&gt; &gt; &gt; +        , m_gatheringState(gatheringState)
&gt; &gt; &gt; +    { }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        m_client-&gt;didChangeIceGatheringState(m_gatheringState);
&gt; &gt; &gt; +        m_client-&gt;didChangeIceConnectionState(m_connectionState);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +private:
&gt; &gt; &gt; +    RTCPeerConnectionHandlerClient* m_client;
&gt; &gt; &gt; +    RTCPeerConnectionHandlerClient::IceConnectionState m_connectionState;
&gt; &gt; &gt; +    RTCPeerConnectionHandlerClient::IceGatheringState m_gatheringState;
&gt; &gt; &gt; +};
&gt; &gt; 
&gt; &gt; Do these need to be in the header file?
&gt; 
&gt; No, they do not need to be here. I just put them inside this header because they are small classes with tiny implementations. But I can put them in another header (maybe named Notifiers.h), what do you think? Do you think it is better to separate the methods and constructors implementations in a cpp file as well?
&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:168
&gt; &gt; &gt; +struct TimerEvent : public RefCounted&lt;TimerEvent&gt; {
&gt; &gt; &gt; +    TimerEvent(RTCPeerConnectionHandlerMock* mock, PassRefPtr&lt;RequestNotifier&gt; notifier)
&gt; &gt; &gt; +        : m_mock(mock)
&gt; &gt; &gt; +        , m_timer(this, &amp;TimerEvent::timerFired)
&gt; &gt; &gt; +        , m_notifier(notifier)
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        m_timer.startOneShot(0.5);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    virtual ~TimerEvent() { }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    void timerFired(Timer&lt;TimerEvent&gt;*)
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        m_notifier-&gt;fire();
&gt; &gt; &gt; +        m_mock-&gt;removeEventFromVector(this);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    RTCPeerConnectionHandlerMock* m_mock;
&gt; &gt; &gt; +    Timer&lt;TimerEvent&gt; m_timer;
&gt; &gt; &gt; +    RefPtr&lt;RequestNotifier&gt; m_notifier;
&gt; &gt; &gt; +};
&gt; &gt; 
&gt; &gt; Ditto.
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/testing/Internals.cpp:654
&gt; &gt; &gt; +    RTCPeerConnectionHandler::create = RTCPeerConnectionHandlerMock::create;
&gt; &gt; 
&gt; &gt; Clever!
&gt; Thanks :). hugopl also deserves this compliment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>940830</commentid>
    <comment_count>5</comment_count>
      <attachid>214471</attachid>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-17 10:38:21 -0700</bug_when>
    <thetext>Created attachment 214471
Refactored patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941451</commentid>
    <comment_count>6</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2013-10-18 21:58:41 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:2
&gt; &gt; &gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
&gt; &gt; 
&gt; &gt; Is this correct?
&gt; 
&gt; Yes :). We are a Nokia Research Center
&gt; 
  Fair enough :-)

&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:48
&gt; &gt; &gt; +bool RTCPeerConnectionHandlerMock::initialize(PassRefPtr&lt;RTCConfiguration&gt;, PassRefPtr&lt;MediaConstraints&gt; constraints)
&gt; &gt; 
&gt; &gt; &quot;constraints&quot; is unused. The parameter name should be omitted and you should have a FIXME with a bug number about adding support.
&gt; 
&gt; The constraints support depends on the RTCPeerConnectionHandler implementation (he is the one who will take care of that). By now there is no default RTCPeerConnectionHandler implementation (each platform is supposed to implement its own). So I think we don&apos;t need a bug to fix that, now.
&gt; Additionally, there is no LayouTests testing the RTCPeerConnection + constraints. If, in the future, is added a test like this, then this should be taken into account.
&gt; What do you think?
&gt; &gt; 

  We need test it at some point, can you please file a bug and add a FIXME to the code?

&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:67

&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:142
&gt; &gt; &gt; +void RTCPeerConnectionHandlerMock::getStats(PassRefPtr&lt;RTCStatsRequest&gt;)
&gt; &gt; &gt; +{
&gt; &gt; &gt; +}
&gt; &gt; 
&gt; &gt; FIXME?
&gt; 
&gt; This test requires getUserMedia support, which is not possible in the current trunk. I will put a &quot;notImplemented()&quot; and a comment telling that when getUserMedia is ready this method should be fixed. Is that OK for you?
&gt; 

  Sure, that sounds fine.


&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:106
&gt; &gt; &gt; +class RequestNotifier : public RefCounted&lt;RequestNotifier&gt; {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    virtual ~RequestNotifier() { }
&gt; &gt; &gt; +    virtual void fire() = 0;
&gt; &gt; &gt; +};
&gt; &gt; &gt; +
&gt; &gt; &gt; +class SessionRequestNotifier : public RequestNotifier {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    SessionRequestNotifier(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; descriptor)
&gt; &gt; &gt; +        : m_request(request)
&gt; &gt; &gt; +        , m_descriptor(descriptor)
&gt; &gt; &gt; +    { }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        if (m_descriptor)
&gt; &gt; &gt; +            m_request-&gt;requestSucceeded(m_descriptor);
&gt; &gt; &gt; +        else
&gt; &gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +private:
&gt; &gt; &gt; +    RefPtr&lt;RTCSessionDescriptionRequest&gt; m_request;
&gt; &gt; &gt; +    RefPtr&lt;RTCSessionDescriptionDescriptor&gt; m_descriptor;
&gt; &gt; &gt; +};
&gt; &gt; &gt; +
&gt; &gt; &gt; +class VoidRequestNotifier : public RequestNotifier {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    VoidRequestNotifier(PassRefPtr&lt;RTCVoidRequest&gt; request, bool success)
&gt; &gt; &gt; +        : m_request(request)
&gt; &gt; &gt; +        , m_success(success)
&gt; &gt; &gt; +    { }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        if (m_success)
&gt; &gt; &gt; +            m_request-&gt;requestSucceeded();
&gt; &gt; &gt; +        else
&gt; &gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +private:
&gt; &gt; &gt; +    RefPtr&lt;RTCVoidRequest&gt; m_request;
&gt; &gt; &gt; +    bool m_success;
&gt; &gt; &gt; +};
&gt; &gt; &gt; +
&gt; &gt; &gt; +class IceConnectionNotifier : public RequestNotifier {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    IceConnectionNotifier(RTCPeerConnectionHandlerClient* client, RTCPeerConnectionHandlerClient::IceConnectionState connectionState, RTCPeerConnectionHandlerClient::IceGatheringState gatheringState)
&gt; &gt; &gt; +        : m_client(client)
&gt; &gt; &gt; +        , m_connectionState(connectionState)
&gt; &gt; &gt; +        , m_gatheringState(gatheringState)
&gt; &gt; &gt; +    { }
&gt; &gt; &gt; +
&gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; +    {
&gt; &gt; &gt; +        m_client-&gt;didChangeIceGatheringState(m_gatheringState);
&gt; &gt; &gt; +        m_client-&gt;didChangeIceConnectionState(m_connectionState);
&gt; &gt; &gt; +    }
&gt; &gt; &gt; +
&gt; &gt; &gt; +private:
&gt; &gt; &gt; +    RTCPeerConnectionHandlerClient* m_client;
&gt; &gt; &gt; +    RTCPeerConnectionHandlerClient::IceConnectionState m_connectionState;
&gt; &gt; &gt; +    RTCPeerConnectionHandlerClient::IceGatheringState m_gatheringState;
&gt; &gt; &gt; +};
&gt; &gt; 
&gt; &gt; Do these need to be in the header file?
&gt; 
&gt; No, they do not need to be here. I just put them inside this header because they are small classes with tiny implementations. But I can put them in another header (maybe named Notifiers.h), what do you think? Do you think it is better to separate the methods and constructors implementations in a cpp file as well?
&gt; 

  I see that you split each out into a new file, which is fine but you could also put them into RTCPeerConnectionHandlerMock.cpp because they are completely private to that file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941452</commentid>
    <comment_count>7</comment_count>
      <attachid>214471</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2013-10-18 22:02:32 -0700</bug_when>
    <thetext>Comment on attachment 214471
Refactored patch

View in context: https://bugs.webkit.org/attachment.cgi?id=214471&amp;action=review

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:49
&gt; +    virtual PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; localDescription() OVERRIDE;
&gt; +    virtual PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; remoteDescription() OVERRIDE;

PassRefPtrs are no longer needed for return values because Anders added move-semantics to the RefPtr class. You can return RefPtr here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941507</commentid>
    <comment_count>8</comment_count>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-19 08:00:18 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #3)
&gt; &gt; (In reply to comment #2)
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:2
&gt; &gt; &gt; &gt; + *  Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
&gt; &gt; &gt; 
&gt; &gt; &gt; Is this correct?
&gt; &gt; 
&gt; &gt; Yes :). We are a Nokia Research Center
&gt; &gt; 
&gt;   Fair enough :-)
&gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:48
&gt; &gt; &gt; &gt; +bool RTCPeerConnectionHandlerMock::initialize(PassRefPtr&lt;RTCConfiguration&gt;, PassRefPtr&lt;MediaConstraints&gt; constraints)
&gt; &gt; &gt; 
&gt; &gt; &gt; &quot;constraints&quot; is unused. The parameter name should be omitted and you should have a FIXME with a bug number about adding support.
&gt; &gt; 
&gt; &gt; The constraints support depends on the RTCPeerConnectionHandler implementation (he is the one who will take care of that). By now there is no default RTCPeerConnectionHandler implementation (each platform is supposed to implement its own). So I think we don&apos;t need a bug to fix that, now.
&gt; &gt; Additionally, there is no LayouTests testing the RTCPeerConnection + constraints. If, in the future, is added a test like this, then this should be taken into account.
&gt; &gt; What do you think?
&gt; &gt; &gt; 
&gt; 
&gt;   We need test it at some point, can you please file a bug and add a FIXME to the code?

Sure.

&gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:67
&gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.cpp:142
&gt; &gt; &gt; &gt; +void RTCPeerConnectionHandlerMock::getStats(PassRefPtr&lt;RTCStatsRequest&gt;)
&gt; &gt; &gt; &gt; +{
&gt; &gt; &gt; &gt; +}
&gt; &gt; &gt; 
&gt; &gt; &gt; FIXME?
&gt; &gt; 
&gt; &gt; This test requires getUserMedia support, which is not possible in the current trunk. I will put a &quot;notImplemented()&quot; and a comment telling that when getUserMedia is ready this method should be fixed. Is that OK for you?
&gt; &gt; 
&gt; 
&gt;   Sure, that sounds fine.
&gt; 
&gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:106
&gt; &gt; &gt; &gt; +class RequestNotifier : public RefCounted&lt;RequestNotifier&gt; {
&gt; &gt; &gt; &gt; +public:
&gt; &gt; &gt; &gt; +    virtual ~RequestNotifier() { }
&gt; &gt; &gt; &gt; +    virtual void fire() = 0;
&gt; &gt; &gt; &gt; +};
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +class SessionRequestNotifier : public RequestNotifier {
&gt; &gt; &gt; &gt; +public:
&gt; &gt; &gt; &gt; +    SessionRequestNotifier(PassRefPtr&lt;RTCSessionDescriptionRequest&gt; request, PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; descriptor)
&gt; &gt; &gt; &gt; +        : m_request(request)
&gt; &gt; &gt; &gt; +        , m_descriptor(descriptor)
&gt; &gt; &gt; &gt; +    { }
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; &gt; +    {
&gt; &gt; &gt; &gt; +        if (m_descriptor)
&gt; &gt; &gt; &gt; +            m_request-&gt;requestSucceeded(m_descriptor);
&gt; &gt; &gt; &gt; +        else
&gt; &gt; &gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; &gt; &gt; +    }
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +private:
&gt; &gt; &gt; &gt; +    RefPtr&lt;RTCSessionDescriptionRequest&gt; m_request;
&gt; &gt; &gt; &gt; +    RefPtr&lt;RTCSessionDescriptionDescriptor&gt; m_descriptor;
&gt; &gt; &gt; &gt; +};
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +class VoidRequestNotifier : public RequestNotifier {
&gt; &gt; &gt; &gt; +public:
&gt; &gt; &gt; &gt; +    VoidRequestNotifier(PassRefPtr&lt;RTCVoidRequest&gt; request, bool success)
&gt; &gt; &gt; &gt; +        : m_request(request)
&gt; &gt; &gt; &gt; +        , m_success(success)
&gt; &gt; &gt; &gt; +    { }
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; &gt; +    {
&gt; &gt; &gt; &gt; +        if (m_success)
&gt; &gt; &gt; &gt; +            m_request-&gt;requestSucceeded();
&gt; &gt; &gt; &gt; +        else
&gt; &gt; &gt; &gt; +            m_request-&gt;requestFailed(&quot;TEST_ERROR&quot;);
&gt; &gt; &gt; &gt; +    }
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +private:
&gt; &gt; &gt; &gt; +    RefPtr&lt;RTCVoidRequest&gt; m_request;
&gt; &gt; &gt; &gt; +    bool m_success;
&gt; &gt; &gt; &gt; +};
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +class IceConnectionNotifier : public RequestNotifier {
&gt; &gt; &gt; &gt; +public:
&gt; &gt; &gt; &gt; +    IceConnectionNotifier(RTCPeerConnectionHandlerClient* client, RTCPeerConnectionHandlerClient::IceConnectionState connectionState, RTCPeerConnectionHandlerClient::IceGatheringState gatheringState)
&gt; &gt; &gt; &gt; +        : m_client(client)
&gt; &gt; &gt; &gt; +        , m_connectionState(connectionState)
&gt; &gt; &gt; &gt; +        , m_gatheringState(gatheringState)
&gt; &gt; &gt; &gt; +    { }
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +    void fire()
&gt; &gt; &gt; &gt; +    {
&gt; &gt; &gt; &gt; +        m_client-&gt;didChangeIceGatheringState(m_gatheringState);
&gt; &gt; &gt; &gt; +        m_client-&gt;didChangeIceConnectionState(m_connectionState);
&gt; &gt; &gt; &gt; +    }
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +private:
&gt; &gt; &gt; &gt; +    RTCPeerConnectionHandlerClient* m_client;
&gt; &gt; &gt; &gt; +    RTCPeerConnectionHandlerClient::IceConnectionState m_connectionState;
&gt; &gt; &gt; &gt; +    RTCPeerConnectionHandlerClient::IceGatheringState m_gatheringState;
&gt; &gt; &gt; &gt; +};
&gt; &gt; &gt; 
&gt; &gt; &gt; Do these need to be in the header file?
&gt; &gt; 
&gt; &gt; No, they do not need to be here. I just put them inside this header because they are small classes with tiny implementations. But I can put them in another header (maybe named Notifiers.h), what do you think? Do you think it is better to separate the methods and constructors implementations in a cpp file as well?
&gt; &gt; 
&gt; 
&gt;   I see that you split each out into a new file, which is fine but you could also put them into RTCPeerConnectionHandlerMock.cpp because they are completely private to that file.

I would prefer to put them in their own cpp file, because there will be other RTC related mock classes that will need notifiers as well (e.g. RTCDataChannelHandler). Sounds good to you?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>941508</commentid>
    <comment_count>9</comment_count>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-19 08:02:01 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 214471 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=214471&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:49
&gt; &gt; +    virtual PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; localDescription() OVERRIDE;
&gt; &gt; +    virtual PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; remoteDescription() OVERRIDE;
&gt; 
&gt; PassRefPtrs are no longer needed for return values because Anders added move-semantics to the RefPtr class. You can return RefPtr here.

Those methods overrides others in RTCPeerConnectionHandler class. So, in order to change their return value to RefPtr I would also have to change RTCPeerConnectionHandler class implementation. I think it is better to do that in the future, in a separated patch. What do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>942357</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2013-10-22 10:45:48 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #7)
&gt; &gt; (From update of attachment 214471 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=214471&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:49
&gt; &gt; &gt; +    virtual PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; localDescription() OVERRIDE;
&gt; &gt; &gt; +    virtual PassRefPtr&lt;RTCSessionDescriptionDescriptor&gt; remoteDescription() OVERRIDE;
&gt; &gt; 
&gt; &gt; PassRefPtrs are no longer needed for return values because Anders added move-semantics to the RefPtr class. You can return RefPtr here.
&gt; 
&gt; Those methods overrides others in RTCPeerConnectionHandler class. So, in order to change their return value to RefPtr I would also have to change RTCPeerConnectionHandler class implementation. I think it is better to do that in the future, in a separated patch. What do you think?

That sounds fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>942365</commentid>
    <comment_count>11</comment_count>
      <attachid>214873</attachid>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-22 11:46:18 -0700</bug_when>
    <thetext>Created attachment 214873
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>942370</commentid>
    <comment_count>12</comment_count>
      <attachid>214873</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2013-10-22 12:18:31 -0700</bug_when>
    <thetext>Comment on attachment 214873
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=214873&amp;action=review

&gt; Source/WebCore/ChangeLog:28
&gt; +        * platform/mock/RTCMockNotifiers.cpp: Added.
&gt; +        * platform/mock/RTCMockNotifiers.h: Added.

Sorry for just noticing this, but &quot;RTCNotifiersMock&quot; would probably be a better name than &quot;RTCMockNotifiers&quot;.

&gt; Source/WebCore/platform/mock/RTCPeerConnectionHandlerMock.h:37
&gt; +class RTCPeerConnectionHandlerMock : public RTCPeerConnectionHandler, public TimerEventBasedMock {

This can be FINAL (I should have also noticed this as well).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>942380</commentid>
    <comment_count>13</comment_count>
      <attachid>214877</attachid>
    <who name="Thiago de Barros Lacerda">thiago.lacerda</who>
    <bug_when>2013-10-22 12:38:27 -0700</bug_when>
    <thetext>Created attachment 214877
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>942390</commentid>
    <comment_count>14</comment_count>
      <attachid>214877</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-10-22 13:16:56 -0700</bug_when>
    <thetext>Comment on attachment 214877
Patch for landing

Clearing flags on attachment: 214877

Committed r157808: &lt;http://trac.webkit.org/changeset/157808&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>942391</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-10-22 13:16:58 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>214287</attachid>
            <date>2013-10-15 11:50:03 -0700</date>
            <delta_ts>2013-10-17 10:38:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-122848-20131015155002.patch</filename>
            <type>text/plain</type>
            <size>21599</size>
            <attacher name="Thiago de Barros Lacerda">thiago.lacerda</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU3NDU2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGU0NTBmNzAxYjcyNjhm
YzBjMjJiZjJiZDllZjFmYzJjNjhmMGEwNS4uOTRhOWI2MDZmZDBiZjk1ZDA4MWZmN2UwODZjNzgx
MjNlYjFjODhjOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY1IEBACisyMDEzLTEwLTE1ICBUaGlh
Z28gZGUgQmFycm9zIExhY2VyZGEgIDx0aGlhZ28ubGFjZXJkYUBvcGVuYm9zc2Eub3JnPgorCisg
ICAgICAgIEFkZGluZyBNb2NrIGNsYXNzIHRvIHRlc3QgUlRDUGVlckNvbm5lY3Rpb24KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMjg0OAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluIG9yZGVyIHRvIHJ1
biB0aGUgUlRDUGVlckNvbm5lY3Rpb24gTGF5b3V0IHRlc3RzLCBhIG1vY2sgY2xhc3MgbXVzdCBi
ZSBwcm92aWRlZCwKKyAgICAgICAgc28gd2UgZG9uJ3QgZGVwZW5kIG9uIHRoZSB1c2VyJ3MgcGxh
dGZvcm0uCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBhIG1vY2sgY2xhc3MgUlRDUGVlckNvbm5l
Y3Rpb25IYW5kbGVyLiBUaGVuIHRoZSBmb2xsb3dpbmcgdGVzdHMgY2FuIGJlIHJ1bjoKKworICAg
ICAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24tY3JlYXRlQW5zd2VyLmh0bWwKKyAgICAgICAgICAg
IFJUQ1BlZXJDb25uZWN0aW9uLWNyZWF0ZU9mZmVyLmh0bWwKKyAgICAgICAgICAgIFJUQ1BlZXJD
b25uZWN0aW9uLWljZS5odG1sCisgICAgICAgICAgICBSVENQZWVyQ29ubmVjdGlvbi1sb2NhbERl
c2NyaXB0aW9uLmh0bWwKKyAgICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLXJlbW90ZURlc2Ny
aXB0aW9uLmh0bWwKKyAgICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLXN0YXRlLmh0bWwKKwor
ICAgICAgICBUZXN0cyB0aGF0IHJlcXVpcmUgYSBNZWRpYVN0cmVhbSBvYmplY3QsIGJ5IGludm9r
aW5nIGdldFVzZXJNZWRpYSwgYXJlIG5vdCByZWFkeSB0byBydW4geWV0LgorCisgICAgICAgIE5v
IG5ldyB0ZXN0cyBuZWVkZWQuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6Y3JlYXRlSGFuZGxlcik6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFz
dHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyLmg6CisgICAgICAgICogcGxhdGZvcm0vbW9j
ay9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVhdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6UlRDUGVlckNvbm5lY3Rpb25IYW5k
bGVyTW9jayk6CisgICAgICAgIChXZWJDb3JlOjpSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2Nr
Ojppbml0aWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxl
ck1vY2s6OmNyZWF0ZU9mZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9u
SGFuZGxlck1vY2s6OmNyZWF0ZUFuc3dlcik6CisgICAgICAgIChXZWJDb3JlOjpSVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXJNb2NrOjpzZXRMb2NhbERlc2NyaXB0aW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OnNldFJlbW90ZURlc2NyaXB0aW9uKToK
KyAgICAgICAgKFdlYkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmxvY2FsRGVz
Y3JpcHRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9j
azo6cmVtb3RlRGVzY3JpcHRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyTW9jazo6dXBkYXRlSWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlJUQ1BlZXJDb25u
ZWN0aW9uSGFuZGxlck1vY2s6OmFkZEljZUNhbmRpZGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpS
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjphZGRTdHJlYW0pOgorICAgICAgICAoV2ViQ29y
ZTo6UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6cmVtb3ZlU3RyZWFtKToKKyAgICAgICAg
KFdlYkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmdldFN0YXRzKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmNyZWF0ZURhdGFDaGFu
bmVsKToKKyAgICAgICAgKFdlYkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmNy
ZWF0ZURUTUZTZW5kZXIpOgorICAgICAgICAoV2ViQ29yZTo6UlRDUGVlckNvbm5lY3Rpb25IYW5k
bGVyTW9jazo6c3RvcCk6CisgICAgICAgICogcGxhdGZvcm0vbW9jay9SVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXJNb2NrLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVxdWVzdE5vdGlmaWVy
Ojp+UmVxdWVzdE5vdGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OlNlc3Npb25SZXF1ZXN0Tm90
aWZpZXI6OlNlc3Npb25SZXF1ZXN0Tm90aWZpZXIpOgorICAgICAgICAoV2ViQ29yZTo6U2Vzc2lv
blJlcXVlc3ROb3RpZmllcjo6ZmlyZSk6CisgICAgICAgIChXZWJDb3JlOjpWb2lkUmVxdWVzdE5v
dGlmaWVyOjpWb2lkUmVxdWVzdE5vdGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OlZvaWRSZXF1
ZXN0Tm90aWZpZXI6OmZpcmUpOgorICAgICAgICAoV2ViQ29yZTo6SWNlQ29ubmVjdGlvbk5vdGlm
aWVyOjpJY2VDb25uZWN0aW9uTm90aWZpZXIpOgorICAgICAgICAoV2ViQ29yZTo6SWNlQ29ubmVj
dGlvbk5vdGlmaWVyOjpmaXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9u
SGFuZGxlck1vY2s6On5SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrKToKKyAgICAgICAgKFdl
YkNvcmU6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OnJlbW92ZUV2ZW50RnJvbVZlY3Rv
cik6CisgICAgICAgIChXZWJDb3JlOjpUaW1lckV2ZW50OjpUaW1lckV2ZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlRpbWVyRXZlbnQ6On5UaW1lckV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlRp
bWVyRXZlbnQ6OnRpbWVyRmlyZWQpOgorICAgICAgICAqIHRlc3RpbmcvSW50ZXJuYWxzLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkludGVybmFsczo6SW50ZXJuYWxzKToKKyAgICAgICAgKFdlYkNv
cmU6OkludGVybmFsczo6ZW5hYmxlTW9ja1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcik6CisgICAg
ICAgICogdGVzdGluZy9JbnRlcm5hbHMuaDoKKwogMjAxMy0xMC0xNSAgQW5kcmVhcyBLbGluZyAg
PGFrbGluZ0BhcHBsZS5jb20+CiAKICAgICAgICAgU2tpcCB1bm5lY2Vzc2FyeSBudWxsIGNoZWNr
IGluIFJlbmRlclRleHQ6OnRleHRMZW5ndGgoKS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKaW5kZXggOTU1
OWZhOTYzMjc4ODYwNTgzNjdhZGYzMmUwZWQ1NWM1YjU0M2ZjYy4uMmJhMzUyODM2MTg4ODE1OTgz
NzJlZmQ5OGQ0MGYyMjhjZmNkMzU4YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ01ha2VM
aXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKQEAgLTE5OTUsNiAr
MTk5NSw3IEBAIHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9tb2NrL0RldmljZU9y
aWVudGF0aW9uQ2xpZW50TW9jay5jcHAKICAgICBwbGF0Zm9ybS9tb2NrL0dlb2xvY2F0aW9uQ2xp
ZW50TW9jay5jcHAKICAgICBwbGF0Zm9ybS9tb2NrL01vY2tNZWRpYVN0cmVhbUNlbnRlci5jcHAK
KyAgICBwbGF0Zm9ybS9tb2NrL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2suY3BwCiAgICAg
cGxhdGZvcm0vbW9jay9TY3JvbGxiYXJUaGVtZU1vY2suY3BwCiAKICAgICBwbGF0Zm9ybS9uZXR3
b3JrL0F1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQmFzZS5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXIuY3BwCmluZGV4IDkwMGIwNDBmZjliNGFlYjhjYjVlNDg0MWFhOGY2ZmYzOTA4MThiZmUu
LmFkNzQwYWZmYTAyNmU2MjlkMzFkZTU3MTgzNDZlYTQ5YWZkZDBlODAgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxl
ci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNv
bm5lY3Rpb25IYW5kbGVyLmNwcApAQCAtMzksMTEgKzM5LDEzIEBACiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiBjbGFzcyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQ7CiAKLVBhc3NPd25QdHI8
UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyPiBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI6OmNyZWF0
ZShSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqKQorc3RhdGljIFBhc3NPd25QdHI8UlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyPiBjcmVhdGVIYW5kbGVyKFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlckNsaWVudCopCiB7CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKK0NyZWF0ZVBlZXJDb25u
ZWN0aW9uSGFuZGxlciBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI6OmNyZWF0ZSA9IGNyZWF0ZUhh
bmRsZXI7CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIEVOQUJMRShNRURJ
QV9TVFJFQU0pCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVh
bS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21l
ZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5oCmluZGV4IDYzNjJhMjQyZGNhYTM3
ZjI4NDU3OWQ1MDU1NzYxM2RiMmFlYmI5NDkuLmUzMzBmM2M4NGJlZDM2YzNkYTM4NmEyYjBlYjBl
YWQzY2U2YzMxN2UgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3Ry
ZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL21lZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5oCkBAIC00NSw2ICs0NSw3
IEBAIGNsYXNzIFJUQ0NvbmZpZ3VyYXRpb247CiBjbGFzcyBSVENEVE1GU2VuZGVySGFuZGxlcjsK
IGNsYXNzIFJUQ0RhdGFDaGFubmVsSGFuZGxlcjsKIGNsYXNzIFJUQ0ljZUNhbmRpZGF0ZURlc2Ny
aXB0b3I7CitjbGFzcyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI7CiBjbGFzcyBSVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXJDbGllbnQ7CiBjbGFzcyBSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlw
dG9yOwogY2xhc3MgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdDsKQEAgLTY3LDkgKzY4LDEx
IEBAIHB1YmxpYzoKICAgICBpbnQgaWQ7CiB9OwogCit0eXBlZGVmIFBhc3NPd25QdHI8UlRDUGVl
ckNvbm5lY3Rpb25IYW5kbGVyPiAoKkNyZWF0ZVBlZXJDb25uZWN0aW9uSGFuZGxlcikoUlRDUGVl
ckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50Kik7CisKIGNsYXNzIFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlciB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8UlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyPiBjcmVhdGUoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50Kik7CisgICAgc3Rh
dGljIENyZWF0ZVBlZXJDb25uZWN0aW9uSGFuZGxlciBjcmVhdGU7CiAgICAgdmlydHVhbCB+UlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyKCkgeyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6
ZShQYXNzUmVmUHRyPFJUQ0NvbmZpZ3VyYXRpb24+LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3RyYWlu
dHM+KSA9IDA7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tb2NrL1JUQ1Bl
ZXJDb25uZWN0aW9uSGFuZGxlck1vY2suY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9j
ay9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42ZTg1OGMyZTk2
ZDRhYzA1OGU1MzdmNzlmOTI4ZTRlNTI5Y2EzMzIyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbW9jay9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmNwcApA
QCAtMCwwICsxLDE2MCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTMgTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKworI2luY2x1
ZGUgIlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2suaCIKKworI2luY2x1ZGUgIlJUQ0RUTUZT
ZW5kZXJIYW5kbGVyLmgiCisjaW5jbHVkZSAiUlRDRGF0YUNoYW5uZWxIYW5kbGVyLmgiCisjaW5j
bHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bhc3NP
d25QdHI8UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyPiBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJN
b2NrOjpjcmVhdGUoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBjbGllbnQpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrKGNsaWVu
dCkpOworfQorCitSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpSVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXJNb2NrKFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudCogY2xpZW50KQorICAg
IDogbV9jbGllbnQoY2xpZW50KQoreworfQorCitib29sIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxl
ck1vY2s6OmluaXRpYWxpemUoUGFzc1JlZlB0cjxSVENDb25maWd1cmF0aW9uPiwgUGFzc1JlZlB0
cjxNZWRpYUNvbnN0cmFpbnRzPiBjb25zdHJhaW50cykKK3sKKyAgICBSZWZQdHI8SWNlQ29ubmVj
dGlvbk5vdGlmaWVyPiBub3RpZmllciA9IGFkb3B0UmVmKG5ldyBJY2VDb25uZWN0aW9uTm90aWZp
ZXIobV9jbGllbnQsIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlQ29ubmVjdGlv
blN0YXRlQ29tcGxldGVkLCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQ6OkljZUdhdGhl
cmluZ1N0YXRlQ29tcGxldGUpKTsKKyAgICBtX3RpbWVyRXZlbnRzLmFwcGVuZChhZG9wdFJlZihu
ZXcgVGltZXJFdmVudCh0aGlzLCBub3RpZmllcikpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
dm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVhdGVPZmZlcihQYXNzUmVmUHRy
PFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8TWVkaWFD
b25zdHJhaW50cz4gY29uc3RyYWludHMpCit7CisgICAgU3RyaW5nIHN1Y2NlZWRWYWx1ZTsKKyAg
ICBSZWZQdHI8U2Vzc2lvblJlcXVlc3ROb3RpZmllcj4gbm90aWZpZXI7CisgICAgaWYgKGNvbnN0
cmFpbnRzLT5nZXRNYW5kYXRvcnlDb25zdHJhaW50VmFsdWUoInN1Y2NlZWQiLCBzdWNjZWVkVmFs
dWUpICYmIHN1Y2NlZWRWYWx1ZSA9PSAidHJ1ZSIpCisgICAgICAgIG5vdGlmaWVyID0gYWRvcHRS
ZWYobmV3IFNlc3Npb25SZXF1ZXN0Tm90aWZpZXIocmVxdWVzdCwgUlRDU2Vzc2lvbkRlc2NyaXB0
aW9uRGVzY3JpcHRvcjo6Y3JlYXRlKCJvZmZlciIsICJsb2NhbCIpKSk7CisgICAgZWxzZQorICAg
ICAgICBub3RpZmllciA9IGFkb3B0UmVmKG5ldyBTZXNzaW9uUmVxdWVzdE5vdGlmaWVyKHJlcXVl
c3QsIDApKTsKKworICAgIG1fdGltZXJFdmVudHMuYXBwZW5kKGFkb3B0UmVmKG5ldyBUaW1lckV2
ZW50KHRoaXMsIG5vdGlmaWVyKSkpOworfQorCit2b2lkIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxl
ck1vY2s6OmNyZWF0ZUFuc3dlcihQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVl
c3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8TWVkaWFDb25zdHJhaW50cz4gY29uc3RyYWludHMpCit7
CisgICAgUmVmUHRyPFNlc3Npb25SZXF1ZXN0Tm90aWZpZXI+IG5vdGlmaWVyOworICAgIC8vIFdl
IGNhbiBvbmx5IGNyZWF0ZSBhbiBhbnN3ZXIgaWYgd2UgaGF2ZSBhbHJlYWR5IGhhZCBhbiBvZmZl
ciBhbmQgdGhlIHJlbW90ZSBzZXNzaW9uIGRlc2NyaXB0aW9uIGlzIHN0b3JlZC4KKyAgICBpZiAo
IW1fcmVtb3RlU2Vzc2lvbkRlc2NyaXB0aW9uLmdldCgpKQorICAgICAgICBub3RpZmllciA9IGFk
b3B0UmVmKG5ldyBTZXNzaW9uUmVxdWVzdE5vdGlmaWVyKHJlcXVlc3QsIDApKTsKKyAgICBlbHNl
CisgICAgICAgIG5vdGlmaWVyID0gYWRvcHRSZWYobmV3IFNlc3Npb25SZXF1ZXN0Tm90aWZpZXIo
cmVxdWVzdCwgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcjo6Y3JlYXRlKCJhbnN3ZXIi
LCAibG9jYWwiKSkpOworCisgICAgbV90aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRp
bWVyRXZlbnQodGhpcywgbm90aWZpZXIpKSk7Cit9CisKK3ZvaWQgUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyTW9jazo6c2V0TG9jYWxEZXNjcmlwdGlvbihQYXNzUmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0
PiByZXF1ZXN0LCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRlc2NyaXB0b3I+IGRl
c2NyaXB0b3IpCit7CisgICAgUmVmUHRyPFZvaWRSZXF1ZXN0Tm90aWZpZXI+IG5vdGlmaWVyOwor
ICAgIGlmICghZGVzY3JpcHRvci5nZXQoKSB8fCBkZXNjcmlwdG9yLT5zZHAoKSAhPSAibG9jYWwi
KQorICAgICAgICBub3RpZmllciA9IGFkb3B0UmVmKG5ldyBWb2lkUmVxdWVzdE5vdGlmaWVyKHJl
cXVlc3QsIGZhbHNlKSk7CisgICAgZWxzZSB7CisgICAgICAgIG1fbG9jYWxTZXNzaW9uRGVzY3Jp
cHRpb24gPSBkZXNjcmlwdG9yOworICAgICAgICBub3RpZmllciA9IGFkb3B0UmVmKG5ldyBWb2lk
UmVxdWVzdE5vdGlmaWVyKHJlcXVlc3QsIHRydWUpKTsKKyAgICB9CisKKyAgICBtX3RpbWVyRXZl
bnRzLmFwcGVuZChhZG9wdFJlZihuZXcgVGltZXJFdmVudCh0aGlzLCBub3RpZmllcikpKTsKK30K
Kwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpzZXRSZW1vdGVEZXNjcmlwdGlv
bihQYXNzUmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0PiByZXF1ZXN0LCBQYXNzUmVmUHRyPFJUQ1Nlc3Np
b25EZXNjcmlwdGlvbkRlc2NyaXB0b3I+IGRlc2NyaXB0b3IpCit7CisgICAgUmVmUHRyPFZvaWRS
ZXF1ZXN0Tm90aWZpZXI+IG5vdGlmaWVyOworICAgIGlmICghZGVzY3JpcHRvci5nZXQoKSB8fCBk
ZXNjcmlwdG9yLT5zZHAoKSAhPSAicmVtb3RlIikKKyAgICAgICAgbm90aWZpZXIgPSBhZG9wdFJl
ZihuZXcgVm9pZFJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCBmYWxzZSkpOworICAgIGVsc2Ugewor
ICAgICAgICBtX3JlbW90ZVNlc3Npb25EZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3I7CisgICAgICAg
IG5vdGlmaWVyID0gYWRvcHRSZWYobmV3IFZvaWRSZXF1ZXN0Tm90aWZpZXIocmVxdWVzdCwgdHJ1
ZSkpOworICAgIH0KKworICAgIG1fdGltZXJFdmVudHMuYXBwZW5kKGFkb3B0UmVmKG5ldyBUaW1l
ckV2ZW50KHRoaXMsIG5vdGlmaWVyKSkpOworfQorCitQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNj
cmlwdGlvbkRlc2NyaXB0b3I+IFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmxvY2FsRGVz
Y3JpcHRpb24oKQoreworICAgIHJldHVybiBtX2xvY2FsU2Vzc2lvbkRlc2NyaXB0aW9uOworfQor
CitQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRlc2NyaXB0b3I+IFJUQ1BlZXJDb25u
ZWN0aW9uSGFuZGxlck1vY2s6OnJlbW90ZURlc2NyaXB0aW9uKCkKK3sKKyAgICByZXR1cm4gbV9y
ZW1vdGVTZXNzaW9uRGVzY3JpcHRpb247Cit9CisKK2Jvb2wgUlRDUGVlckNvbm5lY3Rpb25IYW5k
bGVyTW9jazo6dXBkYXRlSWNlKFBhc3NSZWZQdHI8UlRDQ29uZmlndXJhdGlvbj4sIFBhc3NSZWZQ
dHI8TWVkaWFDb25zdHJhaW50cz4pCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6YWRkSWNlQ2FuZGlkYXRlKFBhc3NSZWZQdHI8UlRD
Vm9pZFJlcXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8UlRDSWNlQ2FuZGlkYXRlRGVzY3JpcHRv
cj4gaWNlRGVzY3JpcHRvcikKK3sKKyAgICBSZWZQdHI8Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90
aWZpZXIgPSBhZG9wdFJlZihuZXcgVm9pZFJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCB0cnVlKSk7
CisgICAgbV90aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRpbWVyRXZlbnQodGhpcywg
bm90aWZpZXIpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyTW9jazo6YWRkU3RyZWFtKFBhc3NSZWZQdHI8TWVkaWFTdHJlYW1EZXNjcmlwdG9y
PiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikKK3sKKyAgICAvLyBTcGVjIHN0YXRlcyB0
aGF0IGV2ZXJ5IHRpbWUgYSBzdHJlYW0gaXMgYWRkZWQsIGEgbmVnb3RpYXRpb25uZWVkZWQgZXZl
bnQgbXVzdCBiZSBmaXJlZC4KKyAgICBtX2NsaWVudC0+bmVnb3RpYXRpb25OZWVkZWQoKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpy
ZW1vdmVTdHJlYW0oUGFzc1JlZlB0cjxNZWRpYVN0cmVhbURlc2NyaXB0b3I+KQoreworICAgIC8v
IFNwZWMgc3RhdGVzIHRoYXQgZXZlcnkgdGltZSBhIHN0cmVhbSBpcyByZW1vdmVkLCBhIG5lZ290
aWF0aW9ubmVlZGVkIGV2ZW50IG11c3QgYmUgZmlyZWQuCisgICAgbV9jbGllbnQtPm5lZ290aWF0
aW9uTmVlZGVkKCk7Cit9CisKK3ZvaWQgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Z2V0
U3RhdHMoUGFzc1JlZlB0cjxSVENTdGF0c1JlcXVlc3Q+KQoreworfQorCitQYXNzT3duUHRyPFJU
Q0RhdGFDaGFubmVsSGFuZGxlcj4gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRl
RGF0YUNoYW5uZWwoY29uc3QgU3RyaW5nJiwgY29uc3QgUlRDRGF0YUNoYW5uZWxJbml0JikKK3sK
KyAgICByZXR1cm4gMDsKK30KKworUGFzc093blB0cjxSVENEVE1GU2VuZGVySGFuZGxlcj4gUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRlRFRNRlNlbmRlcihQYXNzUmVmUHRyPE1l
ZGlhU3RyZWFtU291cmNlPikKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBSVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXJNb2NrOjpzdG9wKCkKK3sKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gRU5BQkxFKE1FRElBX1NUUkVBTSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5oIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMWYwZTczZWQxZTk1MmQwMDE4NTU5YzdkY2YxYmI0MmE3OWU1NWY0ZgotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDUGVlckNvbm5l
Y3Rpb25IYW5kbGVyTW9jay5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogIENvcHlyaWdodCAo
QykgMjAxMyBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2tf
aAorI2RlZmluZSBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrX2gKKworI2lmIEVOQUJMRShN
RURJQV9TVFJFQU0pCisKKyNpbmNsdWRlICJSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuaCIKKyNp
bmNsdWRlICJSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQuaCIKKyNpbmNsdWRlICJSVENT
ZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiUlRDU2Vzc2lvbkRlc2Ny
aXB0aW9uUmVxdWVzdC5oIgorI2luY2x1ZGUgIlJUQ1ZvaWRSZXF1ZXN0LmgiCisjaW5jbHVkZSAi
VGltZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QgVGltZXJFdmVudDsKKwor
Y2xhc3MgUmVxdWVzdE5vdGlmaWVyIDogcHVibGljIFJlZkNvdW50ZWQ8UmVxdWVzdE5vdGlmaWVy
PiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UmVxdWVzdE5vdGlmaWVyKCkgeyB9CisgICAgdmly
dHVhbCB2b2lkIGZpcmUoKSA9IDA7Cit9OworCitjbGFzcyBTZXNzaW9uUmVxdWVzdE5vdGlmaWVy
IDogcHVibGljIFJlcXVlc3ROb3RpZmllciB7CitwdWJsaWM6CisgICAgU2Vzc2lvblJlcXVlc3RO
b3RpZmllcihQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVlc3Q+IHJlcXVlc3Qs
IFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gZGVzY3JpcHRvcikK
KyAgICAgICAgOiBtX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgLCBtX2Rlc2NyaXB0b3IoZGVz
Y3JpcHRvcikKKyAgICB7IH0KKworICAgIHZvaWQgZmlyZSgpCisgICAgeworICAgICAgICBpZiAo
bV9kZXNjcmlwdG9yKQorICAgICAgICAgICAgbV9yZXF1ZXN0LT5yZXF1ZXN0U3VjY2VlZGVkKG1f
ZGVzY3JpcHRvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcmVxdWVzdC0+cmVxdWVz
dEZhaWxlZCgiVEVTVF9FUlJPUiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZWZQdHI8UlRD
U2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdD4gbV9yZXF1ZXN0OworICAgIFJlZlB0cjxSVENTZXNz
aW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX2Rlc2NyaXB0b3I7Cit9OworCitjbGFzcyBWb2lk
UmVxdWVzdE5vdGlmaWVyIDogcHVibGljIFJlcXVlc3ROb3RpZmllciB7CitwdWJsaWM6CisgICAg
Vm9pZFJlcXVlc3ROb3RpZmllcihQYXNzUmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0PiByZXF1ZXN0LCBi
b29sIHN1Y2Nlc3MpCisgICAgICAgIDogbV9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICwgbV9z
dWNjZXNzKHN1Y2Nlc3MpCisgICAgeyB9CisKKyAgICB2b2lkIGZpcmUoKQorICAgIHsKKyAgICAg
ICAgaWYgKG1fc3VjY2VzcykKKyAgICAgICAgICAgIG1fcmVxdWVzdC0+cmVxdWVzdFN1Y2NlZWRl
ZCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3JlcXVlc3QtPnJlcXVlc3RGYWlsZWQo
IlRFU1RfRVJST1IiKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPFJUQ1ZvaWRSZXF1
ZXN0PiBtX3JlcXVlc3Q7CisgICAgYm9vbCBtX3N1Y2Nlc3M7Cit9OworCitjbGFzcyBJY2VDb25u
ZWN0aW9uTm90aWZpZXIgOiBwdWJsaWMgUmVxdWVzdE5vdGlmaWVyIHsKK3B1YmxpYzoKKyAgICBJ
Y2VDb25uZWN0aW9uTm90aWZpZXIoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBjbGll
bnQsIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlQ29ubmVjdGlvblN0YXRlIGNv
bm5lY3Rpb25TdGF0ZSwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OjpJY2VHYXRoZXJp
bmdTdGF0ZSBnYXRoZXJpbmdTdGF0ZSkKKyAgICAgICAgOiBtX2NsaWVudChjbGllbnQpCisgICAg
ICAgICwgbV9jb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvblN0YXRlKQorICAgICAgICAsIG1fZ2F0
aGVyaW5nU3RhdGUoZ2F0aGVyaW5nU3RhdGUpCisgICAgeyB9CisKKyAgICB2b2lkIGZpcmUoKQor
ICAgIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZENoYW5nZUljZUdhdGhlcmluZ1N0YXRlKG1fZ2F0
aGVyaW5nU3RhdGUpOworICAgICAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlSWNlQ29ubmVjdGlvblN0
YXRlKG1fY29ubmVjdGlvblN0YXRlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUlRDUGVlckNv
bm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBtX2NsaWVudDsKKyAgICBSVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXJDbGllbnQ6OkljZUNvbm5lY3Rpb25TdGF0ZSBtX2Nvbm5lY3Rpb25TdGF0ZTsKKyAgICBS
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQ6OkljZUdhdGhlcmluZ1N0YXRlIG1fZ2F0aGVy
aW5nU3RhdGU7Cit9OworCitjbGFzcyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrIDogcHVi
bGljIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlciB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NP
d25QdHI8UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyPiBjcmVhdGUoUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyQ2xpZW50Kik7CisgICAgdmlydHVhbCB+UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9j
aygpIHsgfQorCisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoUGFzc1JlZlB0cjxSVENDb25m
aWd1cmF0aW9uPiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikgT1ZFUlJJREU7CisKKyAg
ICB2aXJ0dWFsIHZvaWQgY3JlYXRlT2ZmZXIoUGFzc1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRp
b25SZXF1ZXN0PiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikgT1ZFUlJJREU7CisgICAg
dmlydHVhbCB2b2lkIGNyZWF0ZUFuc3dlcihQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlv
blJlcXVlc3Q+LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3RyYWludHM+KSBPVkVSUklERTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0TG9jYWxEZXNjcmlwdGlvbihQYXNzUmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0
PiwgUGFzc1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPikgT1ZFUlJJREU7
CisgICAgdmlydHVhbCB2b2lkIHNldFJlbW90ZURlc2NyaXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9p
ZFJlcXVlc3Q+LCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRlc2NyaXB0b3I+KSBP
VkVSUklERTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVz
Y3JpcHRvcj4gbG9jYWxEZXNjcmlwdGlvbigpIE9WRVJSSURFOworICAgIHZpcnR1YWwgUGFzc1Jl
ZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiByZW1vdGVEZXNjcmlwdGlvbigp
IE9WRVJSSURFOworICAgIHZpcnR1YWwgYm9vbCB1cGRhdGVJY2UoUGFzc1JlZlB0cjxSVENDb25m
aWd1cmF0aW9uPiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikgT1ZFUlJJREU7CisgICAg
dmlydHVhbCBib29sIGFkZEljZUNhbmRpZGF0ZShQYXNzUmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0Piwg
UGFzc1JlZlB0cjxSVENJY2VDYW5kaWRhdGVEZXNjcmlwdG9yPikgT1ZFUlJJREU7CisgICAgdmly
dHVhbCBib29sIGFkZFN0cmVhbShQYXNzUmVmUHRyPE1lZGlhU3RyZWFtRGVzY3JpcHRvcj4sIFBh
c3NSZWZQdHI8TWVkaWFDb25zdHJhaW50cz4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBy
ZW1vdmVTdHJlYW0oUGFzc1JlZlB0cjxNZWRpYVN0cmVhbURlc2NyaXB0b3I+KSBPVkVSUklERTsK
KyAgICB2aXJ0dWFsIHZvaWQgZ2V0U3RhdHMoUGFzc1JlZlB0cjxSVENTdGF0c1JlcXVlc3Q+KSBP
VkVSUklERTsKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8UlRDRGF0YUNoYW5uZWxIYW5kbGVyPiBj
cmVhdGVEYXRhQ2hhbm5lbChjb25zdCBTdHJpbmcmIGxhYmVsLCBjb25zdCBSVENEYXRhQ2hhbm5l
bEluaXQmKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8UlRDRFRNRlNlbmRlckhh
bmRsZXI+IGNyZWF0ZURUTUZTZW5kZXIoUGFzc1JlZlB0cjxNZWRpYVN0cmVhbVNvdXJjZT4pIE9W
RVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgT1ZFUlJJREU7CisKKyAgICB2b2lkIHJl
bW92ZUV2ZW50RnJvbVZlY3RvcihQYXNzUmVmUHRyPFRpbWVyRXZlbnQ+IGV2ZW50KQorICAgIHsK
KyAgICAgICAgc2l6ZV90IHBvcyA9IG1fdGltZXJFdmVudHMuZmluZChldmVudCk7CisgICAgICAg
IG1fdGltZXJFdmVudHMucmVtb3ZlKHBvcyk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jayhSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQq
KTsKKworcHJpdmF0ZToKKyAgICBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqIG1fY2xp
ZW50OworCisgICAgUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRlc2NyaXB0b3I+IG1fbG9j
YWxTZXNzaW9uRGVzY3JpcHRpb247CisgICAgUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRl
c2NyaXB0b3I+IG1fcmVtb3RlU2Vzc2lvbkRlc2NyaXB0aW9uOworCisgICAgVmVjdG9yPFJlZlB0
cjxUaW1lckV2ZW50PiA+IG1fdGltZXJFdmVudHM7Cit9OworCitzdHJ1Y3QgVGltZXJFdmVudCA6
IHB1YmxpYyBSZWZDb3VudGVkPFRpbWVyRXZlbnQ+IHsKKyAgICBUaW1lckV2ZW50KFJUQ1BlZXJD
b25uZWN0aW9uSGFuZGxlck1vY2sqIG1vY2ssIFBhc3NSZWZQdHI8UmVxdWVzdE5vdGlmaWVyPiBu
b3RpZmllcikKKyAgICAgICAgOiBtX21vY2sobW9jaykKKyAgICAgICAgLCBtX3RpbWVyKHRoaXMs
ICZUaW1lckV2ZW50Ojp0aW1lckZpcmVkKQorICAgICAgICAsIG1fbm90aWZpZXIobm90aWZpZXIp
CisgICAgeworICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgwLjUpOworICAgIH0KKworICAg
IHZpcnR1YWwgflRpbWVyRXZlbnQoKSB7IH0KKworICAgIHZvaWQgdGltZXJGaXJlZChUaW1lcjxU
aW1lckV2ZW50PiopCisgICAgeworICAgICAgICBtX25vdGlmaWVyLT5maXJlKCk7CisgICAgICAg
IG1fbW9jay0+cmVtb3ZlRXZlbnRGcm9tVmVjdG9yKHRoaXMpOworICAgIH0KKworICAgIFJUQ1Bl
ZXJDb25uZWN0aW9uSGFuZGxlck1vY2sqIG1fbW9jazsKKyAgICBUaW1lcjxUaW1lckV2ZW50PiBt
X3RpbWVyOworICAgIFJlZlB0cjxSZXF1ZXN0Tm90aWZpZXI+IG1fbm90aWZpZXI7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoTUVESUFfU1RSRUFNKQor
CisjZW5kaWYgLy8gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9ja19oCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS90ZXN0aW5nL0ludGVybmFscy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS90ZXN0
aW5nL0ludGVybmFscy5jcHAKaW5kZXggNWZkZjY4MzU2MTE0OTk4NDFiMGNiZGM1MDFhODRiYzYx
NDdmMTExZS4uYWY1NDFjOWMzYjA1OTBjZjA2NzkwMzI0Y2IwNTM2YmUyMzI0OTM0YyAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmNwcApAQCAtMTQ4LDYgKzE0OCw4IEBACiAKICNpZiBF
TkFCTEUoTUVESUFfU1RSRUFNKQogI2luY2x1ZGUgIk1vY2tNZWRpYVN0cmVhbUNlbnRlci5oIgor
I2luY2x1ZGUgIlJUQ1BlZXJDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyTW9jay5oIgogI2VuZGlmCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTI4MCw5
ICsyODIsMTAgQEAgSW50ZXJuYWxzOjpJbnRlcm5hbHMoRG9jdW1lbnQqIGRvY3VtZW50KQogICAg
IGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC0+cGFnZSgpKQogICAgICAgICBkb2N1bWVudC0+cGFn
ZSgpLT5ncm91cCgpLmNhcHRpb25QcmVmZXJlbmNlcygpLT5zZXRUZXN0aW5nTW9kZSh0cnVlKTsK
ICNlbmRpZgotICAgIAorCiAjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKICAgICBNb2NrTWVkaWFT
dHJlYW1DZW50ZXI6OnJlZ2lzdGVyTW9ja01lZGlhU3RyZWFtQ2VudGVyKCk7CisgICAgZW5hYmxl
TW9ja1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcigpOwogI2VuZGlmCiB9CiAKQEAgLTY0NCw3ICs2
NDcsMTQgQEAgdm9pZCBJbnRlcm5hbHM6OmVuYWJsZU1vY2tTcGVlY2hTeW50aGVzaXplcigpCiAg
ICAgc3ludGhlc2lzLT5zZXRQbGF0Zm9ybVN5bnRoZXNpemVyKFBsYXRmb3JtU3BlZWNoU3ludGhl
c2l6ZXJNb2NrOjpjcmVhdGUoc3ludGhlc2lzKSk7CiB9CiAjZW5kaWYKLSAgICAKKworI2lmIEVO
QUJMRShNRURJQV9TVFJFQU0pCit2b2lkIEludGVybmFsczo6ZW5hYmxlTW9ja1JUQ1BlZXJDb25u
ZWN0aW9uSGFuZGxlcigpCit7CisgICAgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyOjpjcmVhdGUg
PSBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVhdGU7Cit9CisjZW5kaWYKKwogUGFz
c1JlZlB0cjxDbGllbnRSZWN0PiBJbnRlcm5hbHM6OmFic29sdXRlQ2FyZXRCb3VuZHMoRXhjZXB0
aW9uQ29kZSYgZWMpCiB7CiAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gY29udGV4dERvY3VtZW50
KCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS90ZXN0aW5nL0ludGVybmFscy5oIGIvU291
cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuaAppbmRleCA5MGFhYWIxYTk0YjEyMjBhOGFk
NTE5YmFjMzkxZTI1NmFmN2FiZjVjLi4xYmViYTAzOTc4ZDJhYjRjN2NkOTIwZDhjN2UzMmZjMDQ0
YzYyMDg0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS90ZXN0aW5nL0ludGVybmFscy5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmgKQEAgLTI5Myw2ICsyOTMsMTAg
QEAgcHVibGljOgogICAgIHZvaWQgZW5hYmxlTW9ja1NwZWVjaFN5bnRoZXNpemVyKCk7CiAjZW5k
aWYKIAorI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCisgICAgdm9pZCBlbmFibGVNb2NrUlRDUGVl
ckNvbm5lY3Rpb25IYW5kbGVyKCk7CisjZW5kaWYKKwogICAgIFN0cmluZyBnZXRJbWFnZVNvdXJj
ZVVSTChFbGVtZW50KiwgRXhjZXB0aW9uQ29kZSYpOwogCiAjaWYgRU5BQkxFKFZJREVPKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>214471</attachid>
            <date>2013-10-17 10:38:21 -0700</date>
            <delta_ts>2013-10-22 11:46:11 -0700</delta_ts>
            <desc>Refactored patch</desc>
            <filename>bug-122848-20131017143819.patch</filename>
            <type>text/plain</type>
            <size>24222</size>
            <attacher name="Thiago de Barros Lacerda">thiago.lacerda</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU3NTc3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzQxOTgyZGFiZmQ4MmM4
NWYwNzIzMGQ0ODI3NWM5YjZiYjM3OTc1Zi4uZThlYWVjMjI5NTY3Mzg0OWUzZWU2OTZiZDYzZmY1
N2VlYTQwMTFkNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM4IEBACisyMDEzLTEwLTE3ICBUaGlh
Z28gZGUgQmFycm9zIExhY2VyZGEgIDx0aGlhZ28ubGFjZXJkYUBvcGVuYm9zc2Eub3JnPgorCisg
ICAgICAgIEFkZGluZyBNb2NrIGNsYXNzIHRvIHRlc3QgUlRDUGVlckNvbm5lY3Rpb24KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMjg0OAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vdyB0aGUgUlRDUGVl
ckNvbm5lY3Rpb24gTGF5b3V0VGVzdHMgY2FuIGJlIGV4ZWN1dGVkLgorICAgICAgICBUaGUgZm9s
bG93aW5nIHRlc3RzIGNhbiBub3cgYmUgcnVuOgorCisgICAgICAgICAgICBSVENQZWVyQ29ubmVj
dGlvbi1jcmVhdGVBbnN3ZXIuaHRtbAorICAgICAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24tY3Jl
YXRlT2ZmZXIuaHRtbAorICAgICAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24taWNlLmh0bWwKKyAg
ICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLWxvY2FsRGVzY3JpcHRpb24uaHRtbAorICAgICAg
ICAgICAgUlRDUGVlckNvbm5lY3Rpb24tcmVtb3RlRGVzY3JpcHRpb24uaHRtbAorICAgICAgICAg
ICAgUlRDUGVlckNvbm5lY3Rpb24tc3RhdGUuaHRtbAorCisgICAgICAgIFRlc3RzIHRoYXQgcmVx
dWlyZSBhIE1lZGlhU3RyZWFtIG9iamVjdCwgYnkgaW52b2tpbmcgZ2V0VXNlck1lZGlhLAorICAg
ICAgICBhcmUgbm90IHJlYWR5IHRvIHJ1biB5ZXQuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIG5l
ZWRlZC4KKworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIHBsYXRmb3JtL21l
ZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVIYW5kbGVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVy
Q29ubmVjdGlvbkhhbmRsZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9tb2NrL1JUQ01vY2tOb3Rp
ZmllcnMuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbW9jay9SVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXJNb2NrLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbW9jay9SVENQZWVy
Q29ubmVjdGlvbkhhbmRsZXJNb2NrLmg6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL21lZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5oLgorICAgICAgICAqIHBs
YXRmb3JtL21vY2svVGltZXJFdmVudEJhc2VkTW9jay5oOiBBZGRlZC4KKyAgICAgICAgKiB0ZXN0
aW5nL0ludGVybmFscy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbnRlcm5hbHM6OkludGVybmFs
cyk6CisgICAgICAgIChXZWJDb3JlOjpJbnRlcm5hbHM6OmVuYWJsZU1vY2tSVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXIpOgorICAgICAgICAqIHRlc3RpbmcvSW50ZXJuYWxzLmg6CisKIDIwMTMtMTAt
MTcgIEFuZHJlYXMgS2xpbmcgIDxha2xpbmdAYXBwbGUuY29tPgogCiAgICAgICAgIFN0eWxlUnVs
ZUZvbzo6bXV0YWJsZVByb3BlcnRpZXMoKSBzaG91bGQgcmV0dXJuIGEgcmVmZXJlbmNlLgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQgYi9Tb3VyY2UvV2ViQ29yZS9D
TWFrZUxpc3RzLnR4dAppbmRleCA2NDkwMzQ4MjVlMjg1ZDhhNDI0ODE0MDVjMzRjNmY2OTBmZTRh
MGMxLi40NGUxZWQ0YmMzNjk5NmE5YWQxMmUxYmRkYzA1MDRhOTFkNjhlYjFlIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAorKysgYi9Tb3VyY2UvV2ViQ29yZS9DTWFr
ZUxpc3RzLnR4dApAQCAtMTk5NSw2ICsxOTk1LDcgQEAgc2V0KFdlYkNvcmVfU09VUkNFUwogICAg
IHBsYXRmb3JtL21vY2svRGV2aWNlT3JpZW50YXRpb25DbGllbnRNb2NrLmNwcAogICAgIHBsYXRm
b3JtL21vY2svR2VvbG9jYXRpb25DbGllbnRNb2NrLmNwcAogICAgIHBsYXRmb3JtL21vY2svTW9j
a01lZGlhU3RyZWFtQ2VudGVyLmNwcAorICAgIHBsYXRmb3JtL21vY2svUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyTW9jay5jcHAKICAgICBwbGF0Zm9ybS9tb2NrL1Njcm9sbGJhclRoZW1lTW9jay5j
cHAKIAogICAgIHBsYXRmb3JtL25ldHdvcmsvQXV0aGVudGljYXRpb25DaGFsbGVuZ2VCYXNlLmNw
cApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVl
ckNvbm5lY3Rpb25IYW5kbGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3Ry
ZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5jcHAKaW5kZXggOTAwYjA0MGZmOWI0YWViOGNi
NWU0ODQxYWE4ZjZmZjM5MDgxOGJmZS4uYWQ3NDBhZmZhMDI2ZTYyOWQzMWRlNTcxODM0NmVhNDlh
ZmRkMGU4MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0v
UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwCkBAIC0zOSwxMSArMzks
MTMgQEAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxl
ckNsaWVudDsKIAotUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI+IFJUQ1BlZXJD
b25uZWN0aW9uSGFuZGxlcjo6Y3JlYXRlKFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudCop
CitzdGF0aWMgUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI+IGNyZWF0ZUhhbmRs
ZXIoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KikKIHsKICAgICByZXR1cm4gbnVsbHB0
cjsKIH0KIAorQ3JlYXRlUGVlckNvbm5lY3Rpb25IYW5kbGVyIFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlcjo6Y3JlYXRlID0gY3JlYXRlSGFuZGxlcjsKKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQog
CiAjZW5kaWYgLy8gRU5BQkxFKE1FRElBX1NUUkVBTSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5oIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVy
LmgKaW5kZXggNjM2MmEyNDJkY2FhMzdmMjg0NTc5ZDUwNTU3NjEzZGIyYWViYjk0OS4uZTMzMGYz
Yzg0YmVkMzZjM2RhMzg2YTJiMGViMGVhZDNjZTZjMzE3ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyLmgKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyLmgKQEAgLTQ1LDYgKzQ1LDcgQEAgY2xhc3MgUlRDQ29uZmlndXJhdGlvbjsKIGNsYXNz
IFJUQ0RUTUZTZW5kZXJIYW5kbGVyOwogY2xhc3MgUlRDRGF0YUNoYW5uZWxIYW5kbGVyOwogY2xh
c3MgUlRDSWNlQ2FuZGlkYXRlRGVzY3JpcHRvcjsKK2NsYXNzIFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlcjsKIGNsYXNzIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDsKIGNsYXNzIFJUQ1Nl
c3Npb25EZXNjcmlwdGlvbkRlc2NyaXB0b3I7CiBjbGFzcyBSVENTZXNzaW9uRGVzY3JpcHRpb25S
ZXF1ZXN0OwpAQCAtNjcsOSArNjgsMTEgQEAgcHVibGljOgogICAgIGludCBpZDsKIH07CiAKK3R5
cGVkZWYgUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI+ICgqQ3JlYXRlUGVlckNv
bm5lY3Rpb25IYW5kbGVyKShSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqKTsKKwogY2xh
c3MgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093
blB0cjxSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI+IGNyZWF0ZShSVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXJDbGllbnQqKTsKKyAgICBzdGF0aWMgQ3JlYXRlUGVlckNvbm5lY3Rpb25IYW5kbGVyIGNy
ZWF0ZTsKICAgICB2aXJ0dWFsIH5SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIoKSB7IH0KIAogICAg
IHZpcnR1YWwgYm9vbCBpbml0aWFsaXplKFBhc3NSZWZQdHI8UlRDQ29uZmlndXJhdGlvbj4sIFBh
c3NSZWZQdHI8TWVkaWFDb25zdHJhaW50cz4pID0gMDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL21vY2svUlRDTW9ja05vdGlmaWVycy5oIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbW9jay9SVENNb2NrTm90aWZpZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTVlYjA5NmViMTU1NTRk
NGIyMGI2YmY3ZjJhNDVmMGI1Yzg4MWFkNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL21vY2svUlRDTW9ja05vdGlmaWVycy5oCkBAIC0wLDAgKzEsMTAzIEBACisv
KgorICogIENvcHlyaWdodCAoQykgMjAxMyBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJUQ01vY2tOb3Rp
ZmllcnNfaAorI2RlZmluZSBSVENNb2NrTm90aWZpZXJzX2gKKworI2lmIEVOQUJMRShNRURJQV9T
VFJFQU0pCisKKyNpbmNsdWRlICJSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQuaCIKKyNp
bmNsdWRlICJSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmgiCisjaW5jbHVkZSAiUlRDU2Vz
c2lvbkRlc2NyaXB0aW9uUmVxdWVzdC5oIgorI2luY2x1ZGUgIlJUQ1ZvaWRSZXF1ZXN0LmgiCisj
aW5jbHVkZSAiVGltZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBTZXNzaW9u
UmVxdWVzdE5vdGlmaWVyIDogcHVibGljIE1vY2tOb3RpZmllciB7CitwdWJsaWM6CisgICAgU2Vz
c2lvblJlcXVlc3ROb3RpZmllcihQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVl
c3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4g
ZGVzY3JpcHRvcikKKyAgICAgICAgOiBtX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgLCBtX2Rl
c2NyaXB0b3IoZGVzY3JpcHRvcikKKyAgICB7IH0KKworICAgIHZvaWQgZmlyZSgpCisgICAgewor
ICAgICAgICBpZiAobV9kZXNjcmlwdG9yKQorICAgICAgICAgICAgbV9yZXF1ZXN0LT5yZXF1ZXN0
U3VjY2VlZGVkKG1fZGVzY3JpcHRvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcmVx
dWVzdC0+cmVxdWVzdEZhaWxlZCgiVEVTVF9FUlJPUiIpOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdD4gbV9yZXF1ZXN0OworICAgIFJl
ZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX2Rlc2NyaXB0b3I7Cit9Owor
CitjbGFzcyBWb2lkUmVxdWVzdE5vdGlmaWVyIDogcHVibGljIE1vY2tOb3RpZmllciB7CitwdWJs
aWM6CisgICAgVm9pZFJlcXVlc3ROb3RpZmllcihQYXNzUmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0PiBy
ZXF1ZXN0LCBib29sIHN1Y2Nlc3MpCisgICAgICAgIDogbV9yZXF1ZXN0KHJlcXVlc3QpCisgICAg
ICAgICwgbV9zdWNjZXNzKHN1Y2Nlc3MpCisgICAgeyB9CisKKyAgICB2b2lkIGZpcmUoKQorICAg
IHsKKyAgICAgICAgaWYgKG1fc3VjY2VzcykKKyAgICAgICAgICAgIG1fcmVxdWVzdC0+cmVxdWVz
dFN1Y2NlZWRlZCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3JlcXVlc3QtPnJlcXVl
c3RGYWlsZWQoIlRFU1RfRVJST1IiKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPFJU
Q1ZvaWRSZXF1ZXN0PiBtX3JlcXVlc3Q7CisgICAgYm9vbCBtX3N1Y2Nlc3M7Cit9OworCitjbGFz
cyBJY2VDb25uZWN0aW9uTm90aWZpZXIgOiBwdWJsaWMgTW9ja05vdGlmaWVyIHsKK3B1YmxpYzoK
KyAgICBJY2VDb25uZWN0aW9uTm90aWZpZXIoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50
KiBjbGllbnQsIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlQ29ubmVjdGlvblN0
YXRlIGNvbm5lY3Rpb25TdGF0ZSwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OjpJY2VH
YXRoZXJpbmdTdGF0ZSBnYXRoZXJpbmdTdGF0ZSkKKyAgICAgICAgOiBtX2NsaWVudChjbGllbnQp
CisgICAgICAgICwgbV9jb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvblN0YXRlKQorICAgICAgICAs
IG1fZ2F0aGVyaW5nU3RhdGUoZ2F0aGVyaW5nU3RhdGUpCisgICAgeyB9CisKKyAgICB2b2lkIGZp
cmUoKQorICAgIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZENoYW5nZUljZUdhdGhlcmluZ1N0YXRl
KG1fZ2F0aGVyaW5nU3RhdGUpOworICAgICAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlSWNlQ29ubmVj
dGlvblN0YXRlKG1fY29ubmVjdGlvblN0YXRlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBtX2NsaWVudDsKKyAgICBSVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXJDbGllbnQ6OkljZUNvbm5lY3Rpb25TdGF0ZSBtX2Nvbm5lY3Rpb25TdGF0ZTsK
KyAgICBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQ6OkljZUdhdGhlcmluZ1N0YXRlIG1f
Z2F0aGVyaW5nU3RhdGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBFTkFCTEUoTUVESUFfU1RSRUFNKQorCisjZW5kaWYgLy8gUlRDTW9ja05vdGlmaWVyc19oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tb2NrL1JUQ1BlZXJDb25uZWN0aW9u
SGFuZGxlck1vY2suY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9SVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXJNb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hMzNjMDIzMjg2ZTdlNzUxOWRjOTRh
NDdkZDJkNzUzMjY1OGViZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbW9jay9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmNwcApAQCAtMCwwICsxLDE2
OCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTMgTm9raWEgQ29ycG9yYXRpb24gYW5kL29y
IGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKworI2luY2x1ZGUgIlJUQ1BlZXJD
b25uZWN0aW9uSGFuZGxlck1vY2suaCIKKworI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisj
aW5jbHVkZSAiUlRDRFRNRlNlbmRlckhhbmRsZXIuaCIKKyNpbmNsdWRlICJSVENEYXRhQ2hhbm5l
bEhhbmRsZXIuaCIKKyNpbmNsdWRlICJSVENNb2NrTm90aWZpZXJzLmgiCisjaW5jbHVkZSA8d3Rm
L3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bhc3NPd25QdHI8UlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyPiBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVh
dGUoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJu
IGFkb3B0UHRyKG5ldyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrKGNsaWVudCkpOworfQor
CitSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJN
b2NrKFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudCogY2xpZW50KQorICAgIDogbV9jbGll
bnQoY2xpZW50KQoreworfQorCitib29sIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6Omlu
aXRpYWxpemUoUGFzc1JlZlB0cjxSVENDb25maWd1cmF0aW9uPiwgUGFzc1JlZlB0cjxNZWRpYUNv
bnN0cmFpbnRzPikKK3sKKyAgICAvLyBGSVhNRTogb25jZSB0aGVyZSBpcyBzdXBwb3J0IGluIFJU
Q1BlZXJDb25uZWN0aW9uICsgY29uc3RyYWludHMsIHRoaXMgc2hvdWxkIGJlIHRha2VuIGludG8g
YWNjb3VudCBoZXJlCisgICAgLy8gYW5kIGEgTGF5b3VUZXN0IGZvciB0aGF0IG11c3QgYmUgYWRk
ZWQuCisgICAgUmVmUHRyPEljZUNvbm5lY3Rpb25Ob3RpZmllcj4gbm90aWZpZXIgPSBhZG9wdFJl
ZihuZXcgSWNlQ29ubmVjdGlvbk5vdGlmaWVyKG1fY2xpZW50LCBSVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXJDbGllbnQ6OkljZUNvbm5lY3Rpb25TdGF0ZUNvbXBsZXRlZCwgUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyQ2xpZW50OjpJY2VHYXRoZXJpbmdTdGF0ZUNvbXBsZXRlKSk7CisgICAgbV90aW1l
ckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRpbWVyRXZlbnQodGhpcywgbm90aWZpZXIpKSk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9j
azo6Y3JlYXRlT2ZmZXIoUGFzc1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiBy
ZXF1ZXN0LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3RyYWludHM+IGNvbnN0cmFpbnRzKQoreworICAg
IFN0cmluZyBzdWNjZWVkVmFsdWU7CisgICAgUmVmUHRyPFNlc3Npb25SZXF1ZXN0Tm90aWZpZXI+
IG5vdGlmaWVyOworICAgIGlmIChjb25zdHJhaW50cy0+Z2V0TWFuZGF0b3J5Q29uc3RyYWludFZh
bHVlKCJzdWNjZWVkIiwgc3VjY2VlZFZhbHVlKSAmJiBzdWNjZWVkVmFsdWUgPT0gInRydWUiKQor
ICAgICAgICBub3RpZmllciA9IGFkb3B0UmVmKG5ldyBTZXNzaW9uUmVxdWVzdE5vdGlmaWVyKHJl
cXVlc3QsIFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRlc2NyaXB0b3I6OmNyZWF0ZSgib2ZmZXIiLCAi
bG9jYWwiKSkpOworICAgIGVsc2UKKyAgICAgICAgbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgU2Vz
c2lvblJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCAwKSk7CisKKyAgICBtX3RpbWVyRXZlbnRzLmFw
cGVuZChhZG9wdFJlZihuZXcgVGltZXJFdmVudCh0aGlzLCBub3RpZmllcikpKTsKK30KKwordm9p
ZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVhdGVBbnN3ZXIoUGFzc1JlZlB0cjxS
VENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiByZXF1ZXN0LCBQYXNzUmVmUHRyPE1lZGlhQ29u
c3RyYWludHM+IGNvbnN0cmFpbnRzKQoreworICAgIFJlZlB0cjxTZXNzaW9uUmVxdWVzdE5vdGlm
aWVyPiBub3RpZmllcjsKKyAgICAvLyBXZSBjYW4gb25seSBjcmVhdGUgYW4gYW5zd2VyIGlmIHdl
IGhhdmUgYWxyZWFkeSBoYWQgYW4gb2ZmZXIgYW5kIHRoZSByZW1vdGUgc2Vzc2lvbiBkZXNjcmlw
dGlvbiBpcyBzdG9yZWQuCisgICAgU3RyaW5nIHN1Y2NlZWRWYWx1ZTsKKyAgICBpZiAoIW1fcmVt
b3RlU2Vzc2lvbkRlc2NyaXB0aW9uLmdldCgpIHx8IChjb25zdHJhaW50cy0+Z2V0TWFuZGF0b3J5
Q29uc3RyYWludFZhbHVlKCJzdWNjZWVkIiwgc3VjY2VlZFZhbHVlKSAmJiBzdWNjZWVkVmFsdWUg
PT0gImZhbHNlIikpCisgICAgICAgIG5vdGlmaWVyID0gYWRvcHRSZWYobmV3IFNlc3Npb25SZXF1
ZXN0Tm90aWZpZXIocmVxdWVzdCwgMCkpOworICAgIGVsc2UKKyAgICAgICAgbm90aWZpZXIgPSBh
ZG9wdFJlZihuZXcgU2Vzc2lvblJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCBSVENTZXNzaW9uRGVz
Y3JpcHRpb25EZXNjcmlwdG9yOjpjcmVhdGUoImFuc3dlciIsICJsb2NhbCIpKSk7CisKKyAgICBt
X3RpbWVyRXZlbnRzLmFwcGVuZChhZG9wdFJlZihuZXcgVGltZXJFdmVudCh0aGlzLCBub3RpZmll
cikpKTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpzZXRMb2NhbERl
c2NyaXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8
UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gZGVzY3JpcHRvcikKK3sKKyAgICBSZWZQ
dHI8Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZpZXI7CisgICAgaWYgKCFkZXNjcmlwdG9yLmdl
dCgpIHx8IGRlc2NyaXB0b3ItPnNkcCgpICE9ICJsb2NhbCIpCisgICAgICAgIG5vdGlmaWVyID0g
YWRvcHRSZWYobmV3IFZvaWRSZXF1ZXN0Tm90aWZpZXIocmVxdWVzdCwgZmFsc2UpKTsKKyAgICBl
bHNlIHsKKyAgICAgICAgbV9sb2NhbFNlc3Npb25EZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3I7Cisg
ICAgICAgIG5vdGlmaWVyID0gYWRvcHRSZWYobmV3IFZvaWRSZXF1ZXN0Tm90aWZpZXIocmVxdWVz
dCwgdHJ1ZSkpOworICAgIH0KKworICAgIG1fdGltZXJFdmVudHMuYXBwZW5kKGFkb3B0UmVmKG5l
dyBUaW1lckV2ZW50KHRoaXMsIG5vdGlmaWVyKSkpOworfQorCit2b2lkIFJUQ1BlZXJDb25uZWN0
aW9uSGFuZGxlck1vY2s6OnNldFJlbW90ZURlc2NyaXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJl
cXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRv
cj4gZGVzY3JpcHRvcikKK3sKKyAgICBSZWZQdHI8Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZp
ZXI7CisgICAgaWYgKCFkZXNjcmlwdG9yLmdldCgpIHx8IGRlc2NyaXB0b3ItPnNkcCgpICE9ICJy
ZW1vdGUiKQorICAgICAgICBub3RpZmllciA9IGFkb3B0UmVmKG5ldyBWb2lkUmVxdWVzdE5vdGlm
aWVyKHJlcXVlc3QsIGZhbHNlKSk7CisgICAgZWxzZSB7CisgICAgICAgIG1fcmVtb3RlU2Vzc2lv
bkRlc2NyaXB0aW9uID0gZGVzY3JpcHRvcjsKKyAgICAgICAgbm90aWZpZXIgPSBhZG9wdFJlZihu
ZXcgVm9pZFJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCB0cnVlKSk7CisgICAgfQorCisgICAgbV90
aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRpbWVyRXZlbnQodGhpcywgbm90aWZpZXIp
KSk7Cit9CisKK1Bhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6bG9jYWxEZXNjcmlwdGlvbigpCit7CisgICAgcmV0
dXJuIG1fbG9jYWxTZXNzaW9uRGVzY3JpcHRpb247Cit9CisKK1Bhc3NSZWZQdHI8UlRDU2Vzc2lv
bkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6cmVt
b3RlRGVzY3JpcHRpb24oKQoreworICAgIHJldHVybiBtX3JlbW90ZVNlc3Npb25EZXNjcmlwdGlv
bjsKK30KKworYm9vbCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjp1cGRhdGVJY2UoUGFz
c1JlZlB0cjxSVENDb25maWd1cmF0aW9uPiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikK
K3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJN
b2NrOjphZGRJY2VDYW5kaWRhdGUoUGFzc1JlZlB0cjxSVENWb2lkUmVxdWVzdD4gcmVxdWVzdCwg
UGFzc1JlZlB0cjxSVENJY2VDYW5kaWRhdGVEZXNjcmlwdG9yPikKK3sKKyAgICBSZWZQdHI8Vm9p
ZFJlcXVlc3ROb3RpZmllcj4gbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgVm9pZFJlcXVlc3ROb3Rp
ZmllcihyZXF1ZXN0LCB0cnVlKSk7CisgICAgbV90aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYo
bmV3IFRpbWVyRXZlbnQodGhpcywgbm90aWZpZXIpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Jvb2wgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6YWRkU3RyZWFtKFBhc3NSZWZQdHI8
TWVkaWFTdHJlYW1EZXNjcmlwdG9yPiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikKK3sK
KyAgICAvLyBTcGVjIHN0YXRlcyB0aGF0IGV2ZXJ5IHRpbWUgYSBzdHJlYW0gaXMgYWRkZWQsIGEg
bmVnb3RpYXRpb25uZWVkZWQgZXZlbnQgbXVzdCBiZSBmaXJlZC4KKyAgICBtX2NsaWVudC0+bmVn
b3RpYXRpb25OZWVkZWQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXJNb2NrOjpyZW1vdmVTdHJlYW0oUGFzc1JlZlB0cjxNZWRpYVN0cmVhbURl
c2NyaXB0b3I+KQoreworICAgIC8vIFNwZWMgc3RhdGVzIHRoYXQgZXZlcnkgdGltZSBhIHN0cmVh
bSBpcyByZW1vdmVkLCBhIG5lZ290aWF0aW9ubmVlZGVkIGV2ZW50IG11c3QgYmUgZmlyZWQuCisg
ICAgbV9jbGllbnQtPm5lZ290aWF0aW9uTmVlZGVkKCk7Cit9CisKK3ZvaWQgUlRDUGVlckNvbm5l
Y3Rpb25IYW5kbGVyTW9jazo6Z2V0U3RhdHMoUGFzc1JlZlB0cjxSVENTdGF0c1JlcXVlc3Q+KQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK1Bhc3NPd25QdHI8UlRDRGF0YUNoYW5uZWxI
YW5kbGVyPiBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVhdGVEYXRhQ2hhbm5lbChj
b25zdCBTdHJpbmcmLCBjb25zdCBSVENEYXRhQ2hhbm5lbEluaXQmKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1Bhc3NPd25QdHI8UlRDRFRNRlNlbmRlckhh
bmRsZXI+IFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmNyZWF0ZURUTUZTZW5kZXIoUGFz
c1JlZlB0cjxNZWRpYVN0cmVhbVNvdXJjZT4pCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAg
ICByZXR1cm4gMDsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpzdG9w
KCkKK3sKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKE1F
RElBX1NUUkVBTSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9j
ay9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTI4YjM2MWQxMzMw
ZjM2NWE5MjJhMjFlMGIyMjBhYzc1MGJiODg0NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5oCkBAIC0w
LDAgKzEsNzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEzIE5va2lhIENvcnBvcmF0aW9u
IGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9ja19oCisjZGVmaW5lIFJUQ1BlZXJDb25uZWN0
aW9uSGFuZGxlck1vY2tfaAorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKworI2luY2x1ZGUg
IlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5oIgorI2luY2x1ZGUgIlJUQ1Nlc3Npb25EZXNjcmlw
dGlvbkRlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJUaW1lckV2ZW50QmFzZWRNb2NrLmgiCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jayA6
IHB1YmxpYyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIsIHB1YmxpYyBUaW1lckV2ZW50QmFzZWRN
b2NrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXI+IGNyZWF0ZShSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqKTsKKyAgICB2aXJ0
dWFsIH5SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrKCkgeyB9CisKKyAgICB2aXJ0dWFsIGJv
b2wgaW5pdGlhbGl6ZShQYXNzUmVmUHRyPFJUQ0NvbmZpZ3VyYXRpb24+LCBQYXNzUmVmUHRyPE1l
ZGlhQ29uc3RyYWludHM+KSBPVkVSUklERTsKKworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVPZmZl
cihQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVlc3Q+LCBQYXNzUmVmUHRyPE1l
ZGlhQ29uc3RyYWludHM+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQW5zd2Vy
KFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdD4sIFBhc3NSZWZQdHI8TWVk
aWFDb25zdHJhaW50cz4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2NhbERlc2Ny
aXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+LCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25E
ZXNjcmlwdGlvbkRlc2NyaXB0b3I+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UmVt
b3RlRGVzY3JpcHRpb24oUGFzc1JlZlB0cjxSVENWb2lkUmVxdWVzdD4sIFBhc3NSZWZQdHI8UlRD
U2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBsb2NhbERlc2NyaXB0aW9u
KCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlv
bkRlc2NyaXB0b3I+IHJlbW90ZURlc2NyaXB0aW9uKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBi
b29sIHVwZGF0ZUljZShQYXNzUmVmUHRyPFJUQ0NvbmZpZ3VyYXRpb24+LCBQYXNzUmVmUHRyPE1l
ZGlhQ29uc3RyYWludHM+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkSWNlQ2FuZGlk
YXRlKFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+LCBQYXNzUmVmUHRyPFJUQ0ljZUNhbmRpZGF0
ZURlc2NyaXB0b3I+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkU3RyZWFtKFBhc3NS
ZWZQdHI8TWVkaWFTdHJlYW1EZXNjcmlwdG9yPiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRz
PikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVN0cmVhbShQYXNzUmVmUHRyPE1l
ZGlhU3RyZWFtRGVzY3JpcHRvcj4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBnZXRTdGF0
cyhQYXNzUmVmUHRyPFJUQ1N0YXRzUmVxdWVzdD4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgUGFz
c093blB0cjxSVENEYXRhQ2hhbm5lbEhhbmRsZXI+IGNyZWF0ZURhdGFDaGFubmVsKGNvbnN0IFN0
cmluZyYgbGFiZWwsIGNvbnN0IFJUQ0RhdGFDaGFubmVsSW5pdCYpIE9WRVJSSURFOworICAgIHZp
cnR1YWwgUGFzc093blB0cjxSVENEVE1GU2VuZGVySGFuZGxlcj4gY3JlYXRlRFRNRlNlbmRlcihQ
YXNzUmVmUHRyPE1lZGlhU3RyZWFtU291cmNlPikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lk
IHN0b3AoKSBPVkVSUklERTsKKworcHJvdGVjdGVkOgorICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlck1vY2soUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50Kik7CisKK3ByaXZhdGU6Cisg
ICAgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBtX2NsaWVudDsKKworICAgIFJlZlB0
cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX2xvY2FsU2Vzc2lvbkRlc2NyaXB0
aW9uOworICAgIFJlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX3JlbW90
ZVNlc3Npb25EZXNjcmlwdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShNRURJQV9TVFJFQU0pCisKKyNlbmRpZiAvLyBSVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXJNb2NrX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2sv
VGltZXJFdmVudEJhc2VkTW9jay5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9UaW1l
ckV2ZW50QmFzZWRNb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDk1ZTA0ZGQ2MjdlYmJkMmJjZjMzMGQxODJh
NTA2YzdmNjA2M2ViNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L21vY2svVGltZXJFdmVudEJhc2VkTW9jay5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiAgQ29w
eXJpZ2h0IChDKSAyMDEzIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgt
aWVzKS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGltZXJFdmVudEJhc2VkTW9ja19o
CisjZGVmaW5lIFRpbWVyRXZlbnRCYXNlZE1vY2tfaAorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVB
TSkKKworI2luY2x1ZGUgIlRpbWVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
VGltZXJFdmVudDsKKworY2xhc3MgTW9ja05vdGlmaWVyIDogcHVibGljIFJlZkNvdW50ZWQ8TW9j
a05vdGlmaWVyPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TW9ja05vdGlmaWVyKCkgeyB9Cisg
ICAgdmlydHVhbCB2b2lkIGZpcmUoKSA9IDA7Cit9OworCitjbGFzcyBUaW1lckV2ZW50QmFzZWRN
b2NrIHsKK3B1YmxpYzoKKyAgICB2b2lkIHJlbW92ZUV2ZW50KFBhc3NSZWZQdHI8VGltZXJFdmVu
dD4gZXZlbnQpCisgICAgeworICAgICAgICBzaXplX3QgcG9zID0gbV90aW1lckV2ZW50cy5maW5k
KGV2ZW50KTsKKyAgICAgICAgbV90aW1lckV2ZW50cy5yZW1vdmUocG9zKTsKKyAgICB9CisKK3By
b3RlY3RlZDoKKyAgICBWZWN0b3I8UmVmUHRyPFRpbWVyRXZlbnQ+ID4gbV90aW1lckV2ZW50czsK
K307CisKK2NsYXNzIFRpbWVyRXZlbnQgOiBwdWJsaWMgUmVmQ291bnRlZDxUaW1lckV2ZW50PiB7
CitwdWJsaWM6CisgICAgVGltZXJFdmVudChUaW1lckV2ZW50QmFzZWRNb2NrKiBtb2NrLCBQYXNz
UmVmUHRyPE1vY2tOb3RpZmllcj4gbm90aWZpZXIpCisgICAgICAgIDogbV9tb2NrKG1vY2spCisg
ICAgICAgICwgbV90aW1lcih0aGlzLCAmVGltZXJFdmVudDo6dGltZXJGaXJlZCkKKyAgICAgICAg
LCBtX25vdGlmaWVyKG5vdGlmaWVyKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydE9uZVNo
b3QoMC41KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5UaW1lckV2ZW50KCkgeyB9CisKKyAgICB2
b2lkIHRpbWVyRmlyZWQoVGltZXI8VGltZXJFdmVudD4qKQorICAgIHsKKyAgICAgICAgbV9ub3Rp
Zmllci0+ZmlyZSgpOworICAgICAgICBtX21vY2stPnJlbW92ZUV2ZW50KHRoaXMpOworICAgIH0K
KworcHJpdmF0ZToKKyAgICBUaW1lckV2ZW50QmFzZWRNb2NrKiBtX21vY2s7CisgICAgVGltZXI8
VGltZXJFdmVudD4gbV90aW1lcjsKKyAgICBSZWZQdHI8TW9ja05vdGlmaWVyPiBtX25vdGlmaWVy
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKE1FRElB
X1NUUkVBTSkKKworI2VuZGlmIC8vIFRpbWVyRXZlbnRCYXNlZE1vY2tfaApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuY3BwIGIvU291cmNlL1dlYkNvcmUvdGVz
dGluZy9JbnRlcm5hbHMuY3BwCmluZGV4IDVmZGY2ODM1NjExNDk5ODQxYjBjYmRjNTAxYTg0YmM2
MTQ3ZjExMWUuLmFmNTQxYzljM2IwNTkwY2YwNjc5MDMyNGNiMDUzNmJlMjMyNDkzNGMgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS90ZXN0aW5nL0ludGVybmFscy5jcHAKQEAgLTE0OCw2ICsxNDgsOCBAQAogCiAjaWYg
RU5BQkxFKE1FRElBX1NUUkVBTSkKICNpbmNsdWRlICJNb2NrTWVkaWFTdHJlYW1DZW50ZXIuaCIK
KyNpbmNsdWRlICJSVENQZWVyQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIlJUQ1BlZXJDb25uZWN0
aW9uSGFuZGxlck1vY2suaCIKICNlbmRpZgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0yODAs
OSArMjgyLDEwIEBAIEludGVybmFsczo6SW50ZXJuYWxzKERvY3VtZW50KiBkb2N1bWVudCkKICAg
ICBpZiAoZG9jdW1lbnQgJiYgZG9jdW1lbnQtPnBhZ2UoKSkKICAgICAgICAgZG9jdW1lbnQtPnBh
Z2UoKS0+Z3JvdXAoKS5jYXB0aW9uUHJlZmVyZW5jZXMoKS0+c2V0VGVzdGluZ01vZGUodHJ1ZSk7
CiAjZW5kaWYKLSAgICAKKwogI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCiAgICAgTW9ja01lZGlh
U3RyZWFtQ2VudGVyOjpyZWdpc3Rlck1vY2tNZWRpYVN0cmVhbUNlbnRlcigpOworICAgIGVuYWJs
ZU1vY2tSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIoKTsKICNlbmRpZgogfQogCkBAIC02NDQsNyAr
NjQ3LDE0IEBAIHZvaWQgSW50ZXJuYWxzOjplbmFibGVNb2NrU3BlZWNoU3ludGhlc2l6ZXIoKQog
ICAgIHN5bnRoZXNpcy0+c2V0UGxhdGZvcm1TeW50aGVzaXplcihQbGF0Zm9ybVNwZWVjaFN5bnRo
ZXNpemVyTW9jazo6Y3JlYXRlKHN5bnRoZXNpcykpOwogfQogI2VuZGlmCi0gICAgCisKKyNpZiBF
TkFCTEUoTUVESUFfU1RSRUFNKQordm9pZCBJbnRlcm5hbHM6OmVuYWJsZU1vY2tSVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXIoKQoreworICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcjo6Y3JlYXRl
ID0gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRlOworfQorI2VuZGlmCisKIFBh
c3NSZWZQdHI8Q2xpZW50UmVjdD4gSW50ZXJuYWxzOjphYnNvbHV0ZUNhcmV0Qm91bmRzKEV4Y2Vw
dGlvbkNvZGUmIGVjKQogewogICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGNvbnRleHREb2N1bWVu
dCgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuaCBiL1Nv
dXJjZS9XZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmgKaW5kZXggOTBhYWFiMWE5NGIxMjIwYThh
ZDUxOWJhYzM5MWUyNTZhZjdhYmY1Yy4uMWJlYmEwMzk3OGQyYWI0YzdjZDkyMGQ4YzdlMzJmYzA0
NGM2MjA4NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS90ZXN0aW5nL0ludGVybmFscy5oCkBAIC0yOTMsNiArMjkzLDEw
IEBAIHB1YmxpYzoKICAgICB2b2lkIGVuYWJsZU1vY2tTcGVlY2hTeW50aGVzaXplcigpOwogI2Vu
ZGlmCiAKKyNpZiBFTkFCTEUoTUVESUFfU1RSRUFNKQorICAgIHZvaWQgZW5hYmxlTW9ja1JUQ1Bl
ZXJDb25uZWN0aW9uSGFuZGxlcigpOworI2VuZGlmCisKICAgICBTdHJpbmcgZ2V0SW1hZ2VTb3Vy
Y2VVUkwoRWxlbWVudCosIEV4Y2VwdGlvbkNvZGUmKTsKIAogI2lmIEVOQUJMRShWSURFTykK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>214873</attachid>
            <date>2013-10-22 11:46:18 -0700</date>
            <delta_ts>2013-10-22 12:52:36 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-122848-20131022154616.patch</filename>
            <type>text/plain</type>
            <size>28029</size>
            <attacher name="Thiago de Barros Lacerda">thiago.lacerda</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU3ODAwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjE4NGJiYTY2ZmNhNzNk
YzEwYjRlMzNiM2Q5YzJjMDJjY2Q3OGYwYi4uMjA3YWUwOTdiZmMwMjAzNTU4MWU2YjAwNTVjNDc1
NGM3MDVhZjgyNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM5IEBACisyMDEzLTEwLTIyICBUaGlh
Z28gZGUgQmFycm9zIExhY2VyZGEgIDx0aGlhZ28ubGFjZXJkYUBvcGVuYm9zc2Eub3JnPgorCisg
ICAgICAgIEFkZGluZyBNb2NrIGNsYXNzIHRvIHRlc3QgUlRDUGVlckNvbm5lY3Rpb24KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMjg0OAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBmb2xsb3dpbmcg
dGVzdHMgY2FuIGJlIHJ1bjoKKworICAgICAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24tY3JlYXRl
QW5zd2VyLmh0bWwKKyAgICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLWNyZWF0ZU9mZmVyLmh0
bWwKKyAgICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLWljZS5odG1sCisgICAgICAgICAgICBS
VENQZWVyQ29ubmVjdGlvbi1sb2NhbERlc2NyaXB0aW9uLmh0bWwKKyAgICAgICAgICAgIFJUQ1Bl
ZXJDb25uZWN0aW9uLXJlbW90ZURlc2NyaXB0aW9uLmh0bWwKKyAgICAgICAgICAgIFJUQ1BlZXJD
b25uZWN0aW9uLXN0YXRlLmh0bWwKKworICAgICAgICBUZXN0cyB0aGF0IHJlcXVpcmUgYSBNZWRp
YVN0cmVhbSBvYmplY3QsIGJ5IGludm9raW5nIGdldFVzZXJNZWRpYSwKKyAgICAgICAgYXJlIG5v
dCByZWFkeSB0byBydW4geWV0LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBuZWVkZWQuCisKKyAg
ICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9S
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlSGFu
ZGxlcik6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyLmg6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyQ2xpZW50Lmg6CisgICAgICAgICogcGxhdGZvcm0vbW9jay9SVENNb2NrTm90aWZp
ZXJzLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbW9jay9SVENNb2NrTm90aWZpZXJz
Lmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL21vY2svUlRDUGVlckNvbm5lY3Rpb25IYW5k
bGVyTW9jay5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL21vY2svUlRDUGVlckNvbm5l
Y3Rpb25IYW5kbGVyTW9jay5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
ZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuaC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9tb2NrL1RpbWVyRXZlbnRCYXNlZE1vY2suaDogQWRkZWQuCisgICAgICAgICogdGVzdGluZy9J
bnRlcm5hbHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW50ZXJuYWxzOjpJbnRlcm5hbHMpOgor
ICAgICAgICAoV2ViQ29yZTo6SW50ZXJuYWxzOjplbmFibGVNb2NrUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyKToKKyAgICAgICAgKiB0ZXN0aW5nL0ludGVybmFscy5oOgorCiAyMDEzLTEwLTIyICBw
ZWF2b0BvdXRsb29rLmNvbSAgPHBlYXZvQG91dGxvb2suY29tPgogCiAgICAgICAgIFtXaW5DYWly
b10gQ29tcGlsZSBlcnJvci4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMu
dHh0IGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKaW5kZXggYzFjYTZhNTAxYTRiOTI5
ZWJmM2Y3ODBhZGU1ZTUyMjUzN2JkN2FmNy4uNjZkYmRmZDU3ZTQ0NzM2ZTYwN2IxM2U1OWEyNTRj
ZjhhOTUzMmE0NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysr
IGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKQEAgLTE5OTYsNiArMTk5Niw4IEBAIHNl
dChXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9tb2NrL0RldmljZU9yaWVudGF0aW9uQ2xp
ZW50TW9jay5jcHAKICAgICBwbGF0Zm9ybS9tb2NrL0dlb2xvY2F0aW9uQ2xpZW50TW9jay5jcHAK
ICAgICBwbGF0Zm9ybS9tb2NrL01vY2tNZWRpYVN0cmVhbUNlbnRlci5jcHAKKyAgICBwbGF0Zm9y
bS9tb2NrL1JUQ01vY2tOb3RpZmllcnMuY3BwCisgICAgcGxhdGZvcm0vbW9jay9SVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXJNb2NrLmNwcAogICAgIHBsYXRmb3JtL21vY2svU2Nyb2xsYmFyVGhlbWVN
b2NrLmNwcAogCiAgICAgcGxhdGZvcm0vbmV0d29yay9BdXRoZW50aWNhdGlvbkNoYWxsZW5nZUJh
c2UuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9S
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVk
aWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyLmNwcAppbmRleCA5MDBiMDQwZmY5YjRh
ZWI4Y2I1ZTQ4NDFhYThmNmZmMzkwODE4YmZlLi5hZDc0MGFmZmEwMjZlNjI5ZDMxZGU1NzE4MzQ2
ZWE0OWFmZGQwZTgwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0
cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21lZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5jcHAKQEAgLTM5LDEx
ICszOSwxMyBAQAogbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyQ2xpZW50OwogCi1QYXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyOjpjcmVhdGUoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xp
ZW50KikKK3N0YXRpYyBQYXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gY3JlYXRl
SGFuZGxlcihSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqKQogewogICAgIHJldHVybiBu
dWxscHRyOwogfQogCitDcmVhdGVQZWVyQ29ubmVjdGlvbkhhbmRsZXIgUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyOjpjcmVhdGUgPSBjcmVhdGVIYW5kbGVyOworCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoTUVESUFfU1RSRUFNKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXIuaAppbmRleCA2MzYyYTI0MmRjYWEzN2YyODQ1NzlkNTA1NTc2MTNkYjJhZWJiOTQ5Li5l
MzMwZjNjODRiZWQzNmMzZGEzODZhMmIwZWIwZWFkM2NlNmMzMTdlIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXIuaApAQCAtNDUsNiArNDUsNyBAQCBjbGFzcyBSVENDb25maWd1cmF0aW9uOwog
Y2xhc3MgUlRDRFRNRlNlbmRlckhhbmRsZXI7CiBjbGFzcyBSVENEYXRhQ2hhbm5lbEhhbmRsZXI7
CiBjbGFzcyBSVENJY2VDYW5kaWRhdGVEZXNjcmlwdG9yOworY2xhc3MgUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyOwogY2xhc3MgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OwogY2xhc3Mg
UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcjsKIGNsYXNzIFJUQ1Nlc3Npb25EZXNjcmlw
dGlvblJlcXVlc3Q7CkBAIC02Nyw5ICs2OCwxMSBAQCBwdWJsaWM6CiAgICAgaW50IGlkOwogfTsK
IAordHlwZWRlZiBQYXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gKCpDcmVhdGVQ
ZWVyQ29ubmVjdGlvbkhhbmRsZXIpKFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudCopOwor
CiBjbGFzcyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIgewogcHVibGljOgotICAgIHN0YXRpYyBQ
YXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gY3JlYXRlKFJUQ1BlZXJDb25uZWN0
aW9uSGFuZGxlckNsaWVudCopOworICAgIHN0YXRpYyBDcmVhdGVQZWVyQ29ubmVjdGlvbkhhbmRs
ZXIgY3JlYXRlOwogICAgIHZpcnR1YWwgflJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcigpIHsgfQog
CiAgICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoUGFzc1JlZlB0cjxSVENDb25maWd1cmF0aW9u
PiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikgPSAwOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xp
ZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXJDbGllbnQuaAppbmRleCBmOGE3MTI2Y2NmODNkM2Y3MWRhMTI4ZDU0MDZhN2Jk
NTVjNGY1ODJjLi45ZTIyY2U5NTQ4NmVhNmNkYWQwMWRkZDhkNjgxNjNkMWViOGVmNDZhIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXJDbGllbnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0
cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQuaApAQCAtMzMsNiArMzMsNyBAQAog
CiAjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKIAorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+
CiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9SVENNb2NrTm90aWZpZXJzLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDTW9ja05vdGlmaWVycy5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uM2ZkODM4NDZjNjIwZDlkMDFjM2Q4ZTg4N2ZiMzMzODExMzFlZTQxOAotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDTW9ja05vdGlmaWVy
cy5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTMgTm9raWEg
Q29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKwor
I2luY2x1ZGUgIlJUQ01vY2tOb3RpZmllcnMuaCIKKworI2luY2x1ZGUgIlJUQ1Nlc3Npb25EZXNj
cmlwdGlvbkRlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1
ZXN0LmgiCisjaW5jbHVkZSAiUlRDVm9pZFJlcXVlc3QuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitTZXNzaW9uUmVxdWVzdE5vdGlmaWVyOjpTZXNzaW9uUmVxdWVzdE5vdGlmaWVyKFBhc3NS
ZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdD4gcmVxdWVzdCwgUGFzc1JlZlB0cjxS
VENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBkZXNjcmlwdG9yKQorICAgIDogbV9yZXF1
ZXN0KHJlcXVlc3QpCisgICAgLCBtX2Rlc2NyaXB0b3IoZGVzY3JpcHRvcikKK3sKK30KKwordm9p
ZCBTZXNzaW9uUmVxdWVzdE5vdGlmaWVyOjpmaXJlKCkKK3sKKyAgICBpZiAobV9kZXNjcmlwdG9y
KQorICAgICAgICBtX3JlcXVlc3QtPnJlcXVlc3RTdWNjZWVkZWQobV9kZXNjcmlwdG9yKTsKKyAg
ICBlbHNlCisgICAgICAgIG1fcmVxdWVzdC0+cmVxdWVzdEZhaWxlZCgiVEVTVF9FUlJPUiIpOwor
fQorCitWb2lkUmVxdWVzdE5vdGlmaWVyOjpWb2lkUmVxdWVzdE5vdGlmaWVyKFBhc3NSZWZQdHI8
UlRDVm9pZFJlcXVlc3Q+IHJlcXVlc3QsIGJvb2wgc3VjY2VzcykKKyAgICA6IG1fcmVxdWVzdChy
ZXF1ZXN0KQorICAgICwgbV9zdWNjZXNzKHN1Y2Nlc3MpCit7Cit9CisKK3ZvaWQgVm9pZFJlcXVl
c3ROb3RpZmllcjo6ZmlyZSgpCit7CisgICAgaWYgKG1fc3VjY2VzcykKKyAgICAgICAgbV9yZXF1
ZXN0LT5yZXF1ZXN0U3VjY2VlZGVkKCk7CisgICAgZWxzZQorICAgICAgICBtX3JlcXVlc3QtPnJl
cXVlc3RGYWlsZWQoIlRFU1RfRVJST1IiKTsKK30KKworSWNlQ29ubmVjdGlvbk5vdGlmaWVyOjpJ
Y2VDb25uZWN0aW9uTm90aWZpZXIoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBjbGll
bnQsIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlQ29ubmVjdGlvblN0YXRlIGNv
bm5lY3Rpb25TdGF0ZSwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OjpJY2VHYXRoZXJp
bmdTdGF0ZSBnYXRoZXJpbmdTdGF0ZSkKKyAgICA6IG1fY2xpZW50KGNsaWVudCkKKyAgICAsIG1f
Y29ubmVjdGlvblN0YXRlKGNvbm5lY3Rpb25TdGF0ZSkKKyAgICAsIG1fZ2F0aGVyaW5nU3RhdGUo
Z2F0aGVyaW5nU3RhdGUpCit7Cit9CisKK3ZvaWQgSWNlQ29ubmVjdGlvbk5vdGlmaWVyOjpmaXJl
KCkKK3sKKyAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlSWNlR2F0aGVyaW5nU3RhdGUobV9nYXRoZXJp
bmdTdGF0ZSk7CisgICAgbV9jbGllbnQtPmRpZENoYW5nZUljZUNvbm5lY3Rpb25TdGF0ZShtX2Nv
bm5lY3Rpb25TdGF0ZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShNRURJQV9TVFJFQU0pCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tb2NrL1JUQ01vY2tOb3RpZmllcnMuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2sv
UlRDTW9ja05vdGlmaWVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjA0Njk3ZGRjNjY1MDdhOGFkMDI0OWQzZDZj
MzRlYzJmMWY1Y2JjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tb2NrL1JUQ01vY2tOb3RpZmllcnMuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogIENvcHly
aWdodCAoQykgMjAxMyBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJUQ01vY2tOb3RpZmllcnNfaAorI2Rl
ZmluZSBSVENNb2NrTm90aWZpZXJzX2gKKworI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCisKKyNp
bmNsdWRlICJSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQuaCIKKyNpbmNsdWRlICJUaW1l
ckV2ZW50QmFzZWRNb2NrLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRl
IDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUlRDU2Vzc2lv
bkRlc2NyaXB0aW9uRGVzY3JpcHRvcjsKK2NsYXNzIFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVl
c3Q7CitjbGFzcyBSVENWb2lkUmVxdWVzdDsKKworY2xhc3MgU2Vzc2lvblJlcXVlc3ROb3RpZmll
ciA6IHB1YmxpYyBNb2NrTm90aWZpZXIgeworcHVibGljOgorICAgIFNlc3Npb25SZXF1ZXN0Tm90
aWZpZXIoUGFzc1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiwgUGFzc1JlZlB0
cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPik7CisKKyAgICB2b2lkIGZpcmUoKSBP
VkVSUklERTsKKworcHJpdmF0ZToKKyAgICBSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVx
dWVzdD4gbV9yZXF1ZXN0OworICAgIFJlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlw
dG9yPiBtX2Rlc2NyaXB0b3I7Cit9OworCitjbGFzcyBWb2lkUmVxdWVzdE5vdGlmaWVyIDogcHVi
bGljIE1vY2tOb3RpZmllciB7CitwdWJsaWM6CisgICAgVm9pZFJlcXVlc3ROb3RpZmllcihQYXNz
UmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0PiwgYm9vbCk7CisKKyAgICB2b2lkIGZpcmUoKSBPVkVSUklE
RTsKKworcHJpdmF0ZToKKyAgICBSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+IG1fcmVxdWVzdDsKKyAg
ICBib29sIG1fc3VjY2VzczsKK307CisKK2NsYXNzIEljZUNvbm5lY3Rpb25Ob3RpZmllciA6IHB1
YmxpYyBNb2NrTm90aWZpZXIgeworcHVibGljOgorICAgIEljZUNvbm5lY3Rpb25Ob3RpZmllcihS
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqLCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJD
bGllbnQ6OkljZUNvbm5lY3Rpb25TdGF0ZSwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50
OjpJY2VHYXRoZXJpbmdTdGF0ZSk7CisKKyAgICB2b2lkIGZpcmUoKSBPVkVSUklERTsKKworcHJp
dmF0ZToKKyAgICBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqIG1fY2xpZW50OworICAg
IFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlQ29ubmVjdGlvblN0YXRlIG1fY29u
bmVjdGlvblN0YXRlOworICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlR2F0
aGVyaW5nU3RhdGUgbV9nYXRoZXJpbmdTdGF0ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIEVOQUJMRShNRURJQV9TVFJFQU0pCisKKyNlbmRpZiAvLyBSVENNb2Nr
Tm90aWZpZXJzX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
b2NrL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ2MDYwYTBj
OTNjNzUxZmZlY2ZiNzBjMDQ2YTkzYjNmMmE3NmFmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9tb2NrL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2suY3Bw
CkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMyBOb2tpYSBDb3Jw
b3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoTUVESUFfU1RSRUFNKQorCisjaW5j
bHVkZSAiUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5oIgorCisjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJSVENEVE1GU2VuZGVySGFuZGxlci5oIgorI2luY2x1ZGUg
IlJUQ0RhdGFDaGFubmVsSGFuZGxlci5oIgorI2luY2x1ZGUgIlJUQ01vY2tOb3RpZmllcnMuaCIK
KyNpbmNsdWRlICJSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0LmgiCisjaW5jbHVkZSAiUlRD
Vm9pZFJlcXVlc3QuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI+IFJUQ1Bl
ZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmNyZWF0ZShSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJD
bGllbnQqIGNsaWVudCkKK3sKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFJUQ1BlZXJDb25uZWN0
aW9uSGFuZGxlck1vY2soY2xpZW50KSk7Cit9CisKK1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1v
Y2s6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2soUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVy
Q2xpZW50KiBjbGllbnQpCisgICAgOiBtX2NsaWVudChjbGllbnQpCit7Cit9CisKK2Jvb2wgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6aW5pdGlhbGl6ZShQYXNzUmVmUHRyPFJUQ0NvbmZp
Z3VyYXRpb24+LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3RyYWludHM+KQoreworICAgIC8vIEZJWE1F
OiBvbmNlIHRoZXJlIGlzIHN1cHBvcnQgaW4gUlRDUGVlckNvbm5lY3Rpb24gKyBjb25zdHJhaW50
cywgdGhpcyBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IGhlcmUKKyAgICAvLyBhbmQgYSBM
YXlvdVRlc3QgZm9yIHRoYXQgbXVzdCBiZSBhZGRlZC4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzMDkzCisgICAgUmVmUHRyPEljZUNvbm5lY3Rpb25O
b3RpZmllcj4gbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgSWNlQ29ubmVjdGlvbk5vdGlmaWVyKG1f
Y2xpZW50LCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQ6OkljZUNvbm5lY3Rpb25TdGF0
ZUNvbXBsZXRlZCwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OjpJY2VHYXRoZXJpbmdT
dGF0ZUNvbXBsZXRlKSk7CisgICAgbV90aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRp
bWVyRXZlbnQodGhpcywgbm90aWZpZXIpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRlT2ZmZXIoUGFzc1JlZlB0cjxSVENT
ZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiByZXF1ZXN0LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3Ry
YWludHM+IGNvbnN0cmFpbnRzKQoreworICAgIFN0cmluZyBzdWNjZWVkVmFsdWU7CisgICAgUmVm
UHRyPFNlc3Npb25SZXF1ZXN0Tm90aWZpZXI+IG5vdGlmaWVyOworICAgIGlmIChjb25zdHJhaW50
cy0+Z2V0TWFuZGF0b3J5Q29uc3RyYWludFZhbHVlKCJzdWNjZWVkIiwgc3VjY2VlZFZhbHVlKSAm
JiBzdWNjZWVkVmFsdWUgPT0gInRydWUiKQorICAgICAgICBub3RpZmllciA9IGFkb3B0UmVmKG5l
dyBTZXNzaW9uUmVxdWVzdE5vdGlmaWVyKHJlcXVlc3QsIFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRl
c2NyaXB0b3I6OmNyZWF0ZSgib2ZmZXIiLCAibG9jYWwiKSkpOworICAgIGVsc2UKKyAgICAgICAg
bm90aWZpZXIgPSBhZG9wdFJlZihuZXcgU2Vzc2lvblJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCAw
KSk7CisKKyAgICBtX3RpbWVyRXZlbnRzLmFwcGVuZChhZG9wdFJlZihuZXcgVGltZXJFdmVudCh0
aGlzLCBub3RpZmllcikpKTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2Nr
OjpjcmVhdGVBbnN3ZXIoUGFzc1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiBy
ZXF1ZXN0LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3RyYWludHM+IGNvbnN0cmFpbnRzKQoreworICAg
IFJlZlB0cjxTZXNzaW9uUmVxdWVzdE5vdGlmaWVyPiBub3RpZmllcjsKKyAgICAvLyBXZSBjYW4g
b25seSBjcmVhdGUgYW4gYW5zd2VyIGlmIHdlIGhhdmUgYWxyZWFkeSBoYWQgYW4gb2ZmZXIgYW5k
IHRoZSByZW1vdGUgc2Vzc2lvbiBkZXNjcmlwdGlvbiBpcyBzdG9yZWQuCisgICAgU3RyaW5nIHN1
Y2NlZWRWYWx1ZTsKKyAgICBpZiAoIW1fcmVtb3RlU2Vzc2lvbkRlc2NyaXB0aW9uLmdldCgpIHx8
IChjb25zdHJhaW50cy0+Z2V0TWFuZGF0b3J5Q29uc3RyYWludFZhbHVlKCJzdWNjZWVkIiwgc3Vj
Y2VlZFZhbHVlKSAmJiBzdWNjZWVkVmFsdWUgPT0gImZhbHNlIikpCisgICAgICAgIG5vdGlmaWVy
ID0gYWRvcHRSZWYobmV3IFNlc3Npb25SZXF1ZXN0Tm90aWZpZXIocmVxdWVzdCwgMCkpOworICAg
IGVsc2UKKyAgICAgICAgbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgU2Vzc2lvblJlcXVlc3ROb3Rp
ZmllcihyZXF1ZXN0LCBSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yOjpjcmVhdGUoImFu
c3dlciIsICJsb2NhbCIpKSk7CisKKyAgICBtX3RpbWVyRXZlbnRzLmFwcGVuZChhZG9wdFJlZihu
ZXcgVGltZXJFdmVudCh0aGlzLCBub3RpZmllcikpKTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXJNb2NrOjpzZXRMb2NhbERlc2NyaXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJl
cXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRv
cj4gZGVzY3JpcHRvcikKK3sKKyAgICBSZWZQdHI8Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZp
ZXI7CisgICAgaWYgKCFkZXNjcmlwdG9yLmdldCgpIHx8IGRlc2NyaXB0b3ItPnNkcCgpICE9ICJs
b2NhbCIpCisgICAgICAgIG5vdGlmaWVyID0gYWRvcHRSZWYobmV3IFZvaWRSZXF1ZXN0Tm90aWZp
ZXIocmVxdWVzdCwgZmFsc2UpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9sb2NhbFNlc3Npb25E
ZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3I7CisgICAgICAgIG5vdGlmaWVyID0gYWRvcHRSZWYobmV3
IFZvaWRSZXF1ZXN0Tm90aWZpZXIocmVxdWVzdCwgdHJ1ZSkpOworICAgIH0KKworICAgIG1fdGlt
ZXJFdmVudHMuYXBwZW5kKGFkb3B0UmVmKG5ldyBUaW1lckV2ZW50KHRoaXMsIG5vdGlmaWVyKSkp
OworfQorCit2b2lkIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OnNldFJlbW90ZURlc2Ny
aXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8UlRD
U2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gZGVzY3JpcHRvcikKK3sKKyAgICBSZWZQdHI8
Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZpZXI7CisgICAgaWYgKCFkZXNjcmlwdG9yLmdldCgp
IHx8IGRlc2NyaXB0b3ItPnNkcCgpICE9ICJyZW1vdGUiKQorICAgICAgICBub3RpZmllciA9IGFk
b3B0UmVmKG5ldyBWb2lkUmVxdWVzdE5vdGlmaWVyKHJlcXVlc3QsIGZhbHNlKSk7CisgICAgZWxz
ZSB7CisgICAgICAgIG1fcmVtb3RlU2Vzc2lvbkRlc2NyaXB0aW9uID0gZGVzY3JpcHRvcjsKKyAg
ICAgICAgbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgVm9pZFJlcXVlc3ROb3RpZmllcihyZXF1ZXN0
LCB0cnVlKSk7CisgICAgfQorCisgICAgbV90aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3
IFRpbWVyRXZlbnQodGhpcywgbm90aWZpZXIpKSk7Cit9CisKK1Bhc3NSZWZQdHI8UlRDU2Vzc2lv
bkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6bG9j
YWxEZXNjcmlwdGlvbigpCit7CisgICAgcmV0dXJuIG1fbG9jYWxTZXNzaW9uRGVzY3JpcHRpb247
Cit9CisKK1Bhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gUlRDUGVl
ckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6cmVtb3RlRGVzY3JpcHRpb24oKQoreworICAgIHJldHVy
biBtX3JlbW90ZVNlc3Npb25EZXNjcmlwdGlvbjsKK30KKworYm9vbCBSVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXJNb2NrOjp1cGRhdGVJY2UoUGFzc1JlZlB0cjxSVENDb25maWd1cmF0aW9uPiwgUGFz
c1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjphZGRJY2VDYW5kaWRhdGUoUGFzc1JlZlB0
cjxSVENWb2lkUmVxdWVzdD4gcmVxdWVzdCwgUGFzc1JlZlB0cjxSVENJY2VDYW5kaWRhdGVEZXNj
cmlwdG9yPikKK3sKKyAgICBSZWZQdHI8Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZpZXIgPSBh
ZG9wdFJlZihuZXcgVm9pZFJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCB0cnVlKSk7CisgICAgbV90
aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRpbWVyRXZlbnQodGhpcywgbm90aWZpZXIp
KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVy
TW9jazo6YWRkU3RyZWFtKFBhc3NSZWZQdHI8TWVkaWFTdHJlYW1EZXNjcmlwdG9yPiwgUGFzc1Jl
ZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikKK3sKKyAgICAvLyBTcGVjIHN0YXRlcyB0aGF0IGV2ZXJ5
IHRpbWUgYSBzdHJlYW0gaXMgYWRkZWQsIGEgbmVnb3RpYXRpb25uZWVkZWQgZXZlbnQgbXVzdCBi
ZSBmaXJlZC4KKyAgICBtX2NsaWVudC0+bmVnb3RpYXRpb25OZWVkZWQoKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpyZW1vdmVTdHJl
YW0oUGFzc1JlZlB0cjxNZWRpYVN0cmVhbURlc2NyaXB0b3I+KQoreworICAgIC8vIFNwZWMgc3Rh
dGVzIHRoYXQgZXZlcnkgdGltZSBhIHN0cmVhbSBpcyByZW1vdmVkLCBhIG5lZ290aWF0aW9ubmVl
ZGVkIGV2ZW50IG11c3QgYmUgZmlyZWQuCisgICAgbV9jbGllbnQtPm5lZ290aWF0aW9uTmVlZGVk
KCk7Cit9CisKK3ZvaWQgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Z2V0U3RhdHMoUGFz
c1JlZlB0cjxSVENTdGF0c1JlcXVlc3Q+KQoreworICAgIC8vIEN1cnJlbnQgdGVzdHMgZG9lcyBu
b3Qgc3VwcG9ydCBnZXRVc2VyTWVkaWEgYW5kIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgaXQuCisg
ICAgLy8gT25jZSBXZWJLaXQgaGFzIHRlc3Qgc3VwcG9ydCB0byBnZXRVc2VyTWVkaWEsIHRoaXMg
bXVzdCBiZSBmaXhlZC4KKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitQYXNzT3duUHRyPFJU
Q0RhdGFDaGFubmVsSGFuZGxlcj4gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRl
RGF0YUNoYW5uZWwoY29uc3QgU3RyaW5nJiwgY29uc3QgUlRDRGF0YUNoYW5uZWxJbml0JikKK3sK
KyAgICAvLyBSZXF1aXJlcyBhIG1vY2sgaW1wbGVtZW50YXRpb24gb2YgUlRDRGF0YUNoYW5uZWxI
YW5kbGVyLgorICAgIC8vIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBvbmNlIHRoZSBtb2NrIGlt
cGxlbWVudGF0aW9uIG9mIFJUQ0RhdGFDaGFubmVsSGFuZGxlciBpcyByZWFkeS4KKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitQYXNzT3duUHRyPFJUQ0RUTUZTZW5k
ZXJIYW5kbGVyPiBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVhdGVEVE1GU2VuZGVy
KFBhc3NSZWZQdHI8TWVkaWFTdHJlYW1Tb3VyY2U+KQoreworICAgIC8vIFJlcXVpcmVzIGEgbW9j
ayBpbXBsZW1lbnRhdGlvbiBvZiBSVENEVE1GU2VuZGVySGFuZGxlci4KKyAgICAvLyBUaGlzIG11
c3QgYmUgaW1wbGVtZW50ZWQgb25jZSB0aGUgbW9jayBpbXBsZW1lbnRhdGlvbiBvZiBSVENEYXRh
Q2hhbm5lbEhhbmRsZXIgaXMgcmVhZHkuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1
cm4gMDsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpzdG9wKCkKK3sK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKE1FRElBX1NU
UkVBTSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDUGVlckNv
bm5lY3Rpb25IYW5kbGVyTW9jay5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9SVENQ
ZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTI4YjM2MWQxMzMwZjM2NWE5
MjJhMjFlMGIyMjBhYzc1MGJiODg0NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL21vY2svUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5oCkBAIC0wLDAgKzEs
NzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEzIE5va2lhIENvcnBvcmF0aW9uIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9ja19oCisjZGVmaW5lIFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlck1vY2tfaAorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKworI2luY2x1ZGUgIlJUQ1Bl
ZXJDb25uZWN0aW9uSGFuZGxlci5oIgorI2luY2x1ZGUgIlJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRl
c2NyaXB0b3IuaCIKKyNpbmNsdWRlICJUaW1lckV2ZW50QmFzZWRNb2NrLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jayA6IHB1Ymxp
YyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIsIHB1YmxpYyBUaW1lckV2ZW50QmFzZWRNb2NrIHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI+
IGNyZWF0ZShSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqKTsKKyAgICB2aXJ0dWFsIH5S
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrKCkgeyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaW5p
dGlhbGl6ZShQYXNzUmVmUHRyPFJUQ0NvbmZpZ3VyYXRpb24+LCBQYXNzUmVmUHRyPE1lZGlhQ29u
c3RyYWludHM+KSBPVkVSUklERTsKKworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVPZmZlcihQYXNz
UmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVlc3Q+LCBQYXNzUmVmUHRyPE1lZGlhQ29u
c3RyYWludHM+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQW5zd2VyKFBhc3NS
ZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdD4sIFBhc3NSZWZQdHI8TWVkaWFDb25z
dHJhaW50cz4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2NhbERlc2NyaXB0aW9u
KFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+LCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlw
dGlvbkRlc2NyaXB0b3I+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UmVtb3RlRGVz
Y3JpcHRpb24oUGFzc1JlZlB0cjxSVENWb2lkUmVxdWVzdD4sIFBhc3NSZWZQdHI8UlRDU2Vzc2lv
bkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBsb2NhbERlc2NyaXB0aW9uKCkgT1ZF
UlJJREU7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRlc2Ny
aXB0b3I+IHJlbW90ZURlc2NyaXB0aW9uKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBib29sIHVw
ZGF0ZUljZShQYXNzUmVmUHRyPFJUQ0NvbmZpZ3VyYXRpb24+LCBQYXNzUmVmUHRyPE1lZGlhQ29u
c3RyYWludHM+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkSWNlQ2FuZGlkYXRlKFBh
c3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+LCBQYXNzUmVmUHRyPFJUQ0ljZUNhbmRpZGF0ZURlc2Ny
aXB0b3I+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkU3RyZWFtKFBhc3NSZWZQdHI8
TWVkaWFTdHJlYW1EZXNjcmlwdG9yPiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikgT1ZF
UlJJREU7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVN0cmVhbShQYXNzUmVmUHRyPE1lZGlhU3Ry
ZWFtRGVzY3JpcHRvcj4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBnZXRTdGF0cyhQYXNz
UmVmUHRyPFJUQ1N0YXRzUmVxdWVzdD4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgUGFzc093blB0
cjxSVENEYXRhQ2hhbm5lbEhhbmRsZXI+IGNyZWF0ZURhdGFDaGFubmVsKGNvbnN0IFN0cmluZyYg
bGFiZWwsIGNvbnN0IFJUQ0RhdGFDaGFubmVsSW5pdCYpIE9WRVJSSURFOworICAgIHZpcnR1YWwg
UGFzc093blB0cjxSVENEVE1GU2VuZGVySGFuZGxlcj4gY3JlYXRlRFRNRlNlbmRlcihQYXNzUmVm
UHRyPE1lZGlhU3RyZWFtU291cmNlPikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHN0b3Ao
KSBPVkVSUklERTsKKworcHJvdGVjdGVkOgorICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1v
Y2soUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50Kik7CisKK3ByaXZhdGU6CisgICAgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBtX2NsaWVudDsKKworICAgIFJlZlB0cjxSVENT
ZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX2xvY2FsU2Vzc2lvbkRlc2NyaXB0aW9uOwor
ICAgIFJlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX3JlbW90ZVNlc3Np
b25EZXNjcmlwdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShNRURJQV9TVFJFQU0pCisKKyNlbmRpZiAvLyBSVENQZWVyQ29ubmVjdGlvbkhhbmRs
ZXJNb2NrX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svVGltZXJF
dmVudEJhc2VkTW9jay5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9UaW1lckV2ZW50
QmFzZWRNb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTU3NWFjZmMzMmJjMDkzNjJjZDZiMWVjNmFiOTQ3MDk5
MzU0NjY3YQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2sv
VGltZXJFdmVudEJhc2VkTW9jay5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgQ29weXJpZ2h0
IChDKSAyMDEzIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGltZXJFdmVudEJhc2VkTW9ja19oCisjZGVm
aW5lIFRpbWVyRXZlbnRCYXNlZE1vY2tfaAorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKwor
I2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRl
IDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3
dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVGltZXJFdmVudDsK
KworY2xhc3MgTW9ja05vdGlmaWVyIDogcHVibGljIFJlZkNvdW50ZWQ8TW9ja05vdGlmaWVyPiB7
CitwdWJsaWM6CisgICAgdmlydHVhbCB+TW9ja05vdGlmaWVyKCkgeyB9CisgICAgdmlydHVhbCB2
b2lkIGZpcmUoKSA9IDA7Cit9OworCitjbGFzcyBUaW1lckV2ZW50QmFzZWRNb2NrIHsKK3B1Ymxp
YzoKKyAgICB2b2lkIHJlbW92ZUV2ZW50KFBhc3NSZWZQdHI8VGltZXJFdmVudD4gZXZlbnQpCisg
ICAgeworICAgICAgICBzaXplX3QgcG9zID0gbV90aW1lckV2ZW50cy5maW5kKGV2ZW50KTsKKyAg
ICAgICAgbV90aW1lckV2ZW50cy5yZW1vdmUocG9zKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAg
ICBWZWN0b3I8UmVmUHRyPFRpbWVyRXZlbnQ+ID4gbV90aW1lckV2ZW50czsKK307CisKK2NsYXNz
IFRpbWVyRXZlbnQgOiBwdWJsaWMgUmVmQ291bnRlZDxUaW1lckV2ZW50PiB7CitwdWJsaWM6Cisg
ICAgVGltZXJFdmVudChUaW1lckV2ZW50QmFzZWRNb2NrKiBtb2NrLCBQYXNzUmVmUHRyPE1vY2tO
b3RpZmllcj4gbm90aWZpZXIpCisgICAgICAgIDogbV9tb2NrKG1vY2spCisgICAgICAgICwgbV90
aW1lcih0aGlzLCAmVGltZXJFdmVudDo6dGltZXJGaXJlZCkKKyAgICAgICAgLCBtX25vdGlmaWVy
KG5vdGlmaWVyKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3QoMC41KTsKKyAg
ICB9CisKKyAgICB2aXJ0dWFsIH5UaW1lckV2ZW50KCkgeyB9CisKKyAgICB2b2lkIHRpbWVyRmly
ZWQoVGltZXI8VGltZXJFdmVudD4qKQorICAgIHsKKyAgICAgICAgbV9ub3RpZmllci0+ZmlyZSgp
OworICAgICAgICBtX21vY2stPnJlbW92ZUV2ZW50KHRoaXMpOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBUaW1lckV2ZW50QmFzZWRNb2NrKiBtX21vY2s7CisgICAgVGltZXI8VGltZXJFdmVudD4g
bV90aW1lcjsKKyAgICBSZWZQdHI8TW9ja05vdGlmaWVyPiBtX25vdGlmaWVyOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKE1FRElBX1NUUkVBTSkKKwor
I2VuZGlmIC8vIFRpbWVyRXZlbnRCYXNlZE1vY2tfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvdGVzdGluZy9JbnRlcm5hbHMuY3BwIGIvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5h
bHMuY3BwCmluZGV4IDM2NWNjYTFhMzlkZDBhZjFlNWU0N2FiNjQzMTQ3ZmYxNTczM2QyNWYuLjBi
N2Y4ZmIxODcxYmJhNjE4MzgyZDAyZjc2NTk5NDA3OWU0ODI0ODQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS90ZXN0
aW5nL0ludGVybmFscy5jcHAKQEAgLTE0OCw2ICsxNDgsOCBAQAogCiAjaWYgRU5BQkxFKE1FRElB
X1NUUkVBTSkKICNpbmNsdWRlICJNb2NrTWVkaWFTdHJlYW1DZW50ZXIuaCIKKyNpbmNsdWRlICJS
VENQZWVyQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1v
Y2suaCIKICNlbmRpZgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0yODAsOSArMjgyLDEwIEBA
IEludGVybmFsczo6SW50ZXJuYWxzKERvY3VtZW50KiBkb2N1bWVudCkKICAgICBpZiAoZG9jdW1l
bnQgJiYgZG9jdW1lbnQtPnBhZ2UoKSkKICAgICAgICAgZG9jdW1lbnQtPnBhZ2UoKS0+Z3JvdXAo
KS5jYXB0aW9uUHJlZmVyZW5jZXMoKS0+c2V0VGVzdGluZ01vZGUodHJ1ZSk7CiAjZW5kaWYKLSAg
ICAKKwogI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCiAgICAgTW9ja01lZGlhU3RyZWFtQ2VudGVy
OjpyZWdpc3Rlck1vY2tNZWRpYVN0cmVhbUNlbnRlcigpOworICAgIGVuYWJsZU1vY2tSVENQZWVy
Q29ubmVjdGlvbkhhbmRsZXIoKTsKICNlbmRpZgogfQogCkBAIC02NDQsNyArNjQ3LDE0IEBAIHZv
aWQgSW50ZXJuYWxzOjplbmFibGVNb2NrU3BlZWNoU3ludGhlc2l6ZXIoKQogICAgIHN5bnRoZXNp
cy0+c2V0UGxhdGZvcm1TeW50aGVzaXplcihQbGF0Zm9ybVNwZWVjaFN5bnRoZXNpemVyTW9jazo6
Y3JlYXRlKHN5bnRoZXNpcykpOwogfQogI2VuZGlmCi0gICAgCisKKyNpZiBFTkFCTEUoTUVESUFf
U1RSRUFNKQordm9pZCBJbnRlcm5hbHM6OmVuYWJsZU1vY2tSVENQZWVyQ29ubmVjdGlvbkhhbmRs
ZXIoKQoreworICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcjo6Y3JlYXRlID0gUlRDUGVlckNv
bm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRlOworfQorI2VuZGlmCisKIFBhc3NSZWZQdHI8Q2xp
ZW50UmVjdD4gSW50ZXJuYWxzOjphYnNvbHV0ZUNhcmV0Qm91bmRzKEV4Y2VwdGlvbkNvZGUmIGVj
KQogewogICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGNvbnRleHREb2N1bWVudCgpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuaCBiL1NvdXJjZS9XZWJDb3Jl
L3Rlc3RpbmcvSW50ZXJuYWxzLmgKaW5kZXggOTBhYWFiMWE5NGIxMjIwYThhZDUxOWJhYzM5MWUy
NTZhZjdhYmY1Yy4uMWJlYmEwMzk3OGQyYWI0YzdjZDkyMGQ4YzdlMzJmYzA0NGM2MjA4NCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuaAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS90ZXN0aW5nL0ludGVybmFscy5oCkBAIC0yOTMsNiArMjkzLDEwIEBAIHB1YmxpYzoK
ICAgICB2b2lkIGVuYWJsZU1vY2tTcGVlY2hTeW50aGVzaXplcigpOwogI2VuZGlmCiAKKyNpZiBF
TkFCTEUoTUVESUFfU1RSRUFNKQorICAgIHZvaWQgZW5hYmxlTW9ja1JUQ1BlZXJDb25uZWN0aW9u
SGFuZGxlcigpOworI2VuZGlmCisKICAgICBTdHJpbmcgZ2V0SW1hZ2VTb3VyY2VVUkwoRWxlbWVu
dCosIEV4Y2VwdGlvbkNvZGUmKTsKIAogI2lmIEVOQUJMRShWSURFTykK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>214877</attachid>
            <date>2013-10-22 12:38:27 -0700</date>
            <delta_ts>2013-10-22 13:16:55 -0700</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-122848-20131022163825.patch</filename>
            <type>text/plain</type>
            <size>28035</size>
            <attacher name="Thiago de Barros Lacerda">thiago.lacerda</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU3ODAwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjE4NGJiYTY2ZmNhNzNk
YzEwYjRlMzNiM2Q5YzJjMDJjY2Q3OGYwYi4uYTExYjUxMzNjOTRkYzQ1ZmM4NTVhMGI3NzU2NGQ4
NTNmNzc5ZWMyOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM5IEBACisyMDEzLTEwLTIyICBUaGlh
Z28gZGUgQmFycm9zIExhY2VyZGEgIDx0aGlhZ28ubGFjZXJkYUBvcGVuYm9zc2Eub3JnPgorCisg
ICAgICAgIEFkZGluZyBNb2NrIGNsYXNzIHRvIHRlc3QgUlRDUGVlckNvbm5lY3Rpb24KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMjg0OAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBmb2xsb3dpbmcg
dGVzdHMgY2FuIGJlIHJ1bjoKKworICAgICAgICAgICAgUlRDUGVlckNvbm5lY3Rpb24tY3JlYXRl
QW5zd2VyLmh0bWwKKyAgICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLWNyZWF0ZU9mZmVyLmh0
bWwKKyAgICAgICAgICAgIFJUQ1BlZXJDb25uZWN0aW9uLWljZS5odG1sCisgICAgICAgICAgICBS
VENQZWVyQ29ubmVjdGlvbi1sb2NhbERlc2NyaXB0aW9uLmh0bWwKKyAgICAgICAgICAgIFJUQ1Bl
ZXJDb25uZWN0aW9uLXJlbW90ZURlc2NyaXB0aW9uLmh0bWwKKyAgICAgICAgICAgIFJUQ1BlZXJD
b25uZWN0aW9uLXN0YXRlLmh0bWwKKworICAgICAgICBUZXN0cyB0aGF0IHJlcXVpcmUgYSBNZWRp
YVN0cmVhbSBvYmplY3QsIGJ5IGludm9raW5nIGdldFVzZXJNZWRpYSwKKyAgICAgICAgYXJlIG5v
dCByZWFkeSB0byBydW4geWV0LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBuZWVkZWQuCisKKyAg
ICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9S
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlSGFu
ZGxlcik6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyLmg6CisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyQ2xpZW50Lmg6CisgICAgICAgICogcGxhdGZvcm0vbW9jay9SVENOb3RpZmllcnNN
b2NrLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbW9jay9SVENOb3RpZmllcnNNb2Nr
Lmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL21vY2svUlRDUGVlckNvbm5lY3Rpb25IYW5k
bGVyTW9jay5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL21vY2svUlRDUGVlckNvbm5l
Y3Rpb25IYW5kbGVyTW9jay5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
ZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuaC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9tb2NrL1RpbWVyRXZlbnRCYXNlZE1vY2suaDogQWRkZWQuCisgICAgICAgICogdGVzdGluZy9J
bnRlcm5hbHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW50ZXJuYWxzOjpJbnRlcm5hbHMpOgor
ICAgICAgICAoV2ViQ29yZTo6SW50ZXJuYWxzOjplbmFibGVNb2NrUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyKToKKyAgICAgICAgKiB0ZXN0aW5nL0ludGVybmFscy5oOgorCiAyMDEzLTEwLTIyICBw
ZWF2b0BvdXRsb29rLmNvbSAgPHBlYXZvQG91dGxvb2suY29tPgogCiAgICAgICAgIFtXaW5DYWly
b10gQ29tcGlsZSBlcnJvci4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMu
dHh0IGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKaW5kZXggYzFjYTZhNTAxYTRiOTI5
ZWJmM2Y3ODBhZGU1ZTUyMjUzN2JkN2FmNy4uNmMyZDY5OTJhZGU3YzcxOGY4MTE4NzdiNjMwZTE5
Zjk4NjIzOTQzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysr
IGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKQEAgLTE5OTYsNiArMTk5Niw4IEBAIHNl
dChXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9tb2NrL0RldmljZU9yaWVudGF0aW9uQ2xp
ZW50TW9jay5jcHAKICAgICBwbGF0Zm9ybS9tb2NrL0dlb2xvY2F0aW9uQ2xpZW50TW9jay5jcHAK
ICAgICBwbGF0Zm9ybS9tb2NrL01vY2tNZWRpYVN0cmVhbUNlbnRlci5jcHAKKyAgICBwbGF0Zm9y
bS9tb2NrL1JUQ05vdGlmaWVyc01vY2suY3BwCisgICAgcGxhdGZvcm0vbW9jay9SVENQZWVyQ29u
bmVjdGlvbkhhbmRsZXJNb2NrLmNwcAogICAgIHBsYXRmb3JtL21vY2svU2Nyb2xsYmFyVGhlbWVN
b2NrLmNwcAogCiAgICAgcGxhdGZvcm0vbmV0d29yay9BdXRoZW50aWNhdGlvbkNoYWxsZW5nZUJh
c2UuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9S
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVk
aWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyLmNwcAppbmRleCA5MDBiMDQwZmY5YjRh
ZWI4Y2I1ZTQ4NDFhYThmNmZmMzkwODE4YmZlLi5hZDc0MGFmZmEwMjZlNjI5ZDMxZGU1NzE4MzQ2
ZWE0OWFmZGQwZTgwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0
cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21lZGlhc3RyZWFtL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlci5jcHAKQEAgLTM5LDEx
ICszOSwxMyBAQAogbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgUlRDUGVlckNvbm5lY3Rpb25I
YW5kbGVyQ2xpZW50OwogCi1QYXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyOjpjcmVhdGUoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xp
ZW50KikKK3N0YXRpYyBQYXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gY3JlYXRl
SGFuZGxlcihSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqKQogewogICAgIHJldHVybiBu
dWxscHRyOwogfQogCitDcmVhdGVQZWVyQ29ubmVjdGlvbkhhbmRsZXIgUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyOjpjcmVhdGUgPSBjcmVhdGVIYW5kbGVyOworCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoTUVESUFfU1RSRUFNKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXIuaAppbmRleCA2MzYyYTI0MmRjYWEzN2YyODQ1NzlkNTA1NTc2MTNkYjJhZWJiOTQ5Li5l
MzMwZjNjODRiZWQzNmMzZGEzODZhMmIwZWIwZWFkM2NlNmMzMTdlIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXIuaApAQCAtNDUsNiArNDUsNyBAQCBjbGFzcyBSVENDb25maWd1cmF0aW9uOwog
Y2xhc3MgUlRDRFRNRlNlbmRlckhhbmRsZXI7CiBjbGFzcyBSVENEYXRhQ2hhbm5lbEhhbmRsZXI7
CiBjbGFzcyBSVENJY2VDYW5kaWRhdGVEZXNjcmlwdG9yOworY2xhc3MgUlRDUGVlckNvbm5lY3Rp
b25IYW5kbGVyOwogY2xhc3MgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OwogY2xhc3Mg
UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcjsKIGNsYXNzIFJUQ1Nlc3Npb25EZXNjcmlw
dGlvblJlcXVlc3Q7CkBAIC02Nyw5ICs2OCwxMSBAQCBwdWJsaWM6CiAgICAgaW50IGlkOwogfTsK
IAordHlwZWRlZiBQYXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gKCpDcmVhdGVQ
ZWVyQ29ubmVjdGlvbkhhbmRsZXIpKFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudCopOwor
CiBjbGFzcyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIgewogcHVibGljOgotICAgIHN0YXRpYyBQ
YXNzT3duUHRyPFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcj4gY3JlYXRlKFJUQ1BlZXJDb25uZWN0
aW9uSGFuZGxlckNsaWVudCopOworICAgIHN0YXRpYyBDcmVhdGVQZWVyQ29ubmVjdGlvbkhhbmRs
ZXIgY3JlYXRlOwogICAgIHZpcnR1YWwgflJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcigpIHsgfQog
CiAgICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoUGFzc1JlZlB0cjxSVENDb25maWd1cmF0aW9u
PiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikgPSAwOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xp
ZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXJDbGllbnQuaAppbmRleCBmOGE3MTI2Y2NmODNkM2Y3MWRhMTI4ZDU0MDZhN2Jk
NTVjNGY1ODJjLi45ZTIyY2U5NTQ4NmVhNmNkYWQwMWRkZDhkNjgxNjNkMWViOGVmNDZhIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9SVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXJDbGllbnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0
cmVhbS9SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQuaApAQCAtMzMsNiArMzMsNyBAQAog
CiAjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKIAorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+
CiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9SVENOb3RpZmllcnNNb2NrLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDTm90aWZpZXJzTW9jay5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uY2M3MjYyYWFhZjU1MmY0MWE0ZTM5OGVlOTZjNGNiNWFlNGE1NDI5ZAotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDTm90aWZpZXJzTW9j
ay5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTMgTm9raWEg
Q29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKwor
I2luY2x1ZGUgIlJUQ05vdGlmaWVyc01vY2suaCIKKworI2luY2x1ZGUgIlJUQ1Nlc3Npb25EZXNj
cmlwdGlvbkRlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1
ZXN0LmgiCisjaW5jbHVkZSAiUlRDVm9pZFJlcXVlc3QuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitTZXNzaW9uUmVxdWVzdE5vdGlmaWVyOjpTZXNzaW9uUmVxdWVzdE5vdGlmaWVyKFBhc3NS
ZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdD4gcmVxdWVzdCwgUGFzc1JlZlB0cjxS
VENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBkZXNjcmlwdG9yKQorICAgIDogbV9yZXF1
ZXN0KHJlcXVlc3QpCisgICAgLCBtX2Rlc2NyaXB0b3IoZGVzY3JpcHRvcikKK3sKK30KKwordm9p
ZCBTZXNzaW9uUmVxdWVzdE5vdGlmaWVyOjpmaXJlKCkKK3sKKyAgICBpZiAobV9kZXNjcmlwdG9y
KQorICAgICAgICBtX3JlcXVlc3QtPnJlcXVlc3RTdWNjZWVkZWQobV9kZXNjcmlwdG9yKTsKKyAg
ICBlbHNlCisgICAgICAgIG1fcmVxdWVzdC0+cmVxdWVzdEZhaWxlZCgiVEVTVF9FUlJPUiIpOwor
fQorCitWb2lkUmVxdWVzdE5vdGlmaWVyOjpWb2lkUmVxdWVzdE5vdGlmaWVyKFBhc3NSZWZQdHI8
UlRDVm9pZFJlcXVlc3Q+IHJlcXVlc3QsIGJvb2wgc3VjY2VzcykKKyAgICA6IG1fcmVxdWVzdChy
ZXF1ZXN0KQorICAgICwgbV9zdWNjZXNzKHN1Y2Nlc3MpCit7Cit9CisKK3ZvaWQgVm9pZFJlcXVl
c3ROb3RpZmllcjo6ZmlyZSgpCit7CisgICAgaWYgKG1fc3VjY2VzcykKKyAgICAgICAgbV9yZXF1
ZXN0LT5yZXF1ZXN0U3VjY2VlZGVkKCk7CisgICAgZWxzZQorICAgICAgICBtX3JlcXVlc3QtPnJl
cXVlc3RGYWlsZWQoIlRFU1RfRVJST1IiKTsKK30KKworSWNlQ29ubmVjdGlvbk5vdGlmaWVyOjpJ
Y2VDb25uZWN0aW9uTm90aWZpZXIoUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBjbGll
bnQsIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlQ29ubmVjdGlvblN0YXRlIGNv
bm5lY3Rpb25TdGF0ZSwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OjpJY2VHYXRoZXJp
bmdTdGF0ZSBnYXRoZXJpbmdTdGF0ZSkKKyAgICA6IG1fY2xpZW50KGNsaWVudCkKKyAgICAsIG1f
Y29ubmVjdGlvblN0YXRlKGNvbm5lY3Rpb25TdGF0ZSkKKyAgICAsIG1fZ2F0aGVyaW5nU3RhdGUo
Z2F0aGVyaW5nU3RhdGUpCit7Cit9CisKK3ZvaWQgSWNlQ29ubmVjdGlvbk5vdGlmaWVyOjpmaXJl
KCkKK3sKKyAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlSWNlR2F0aGVyaW5nU3RhdGUobV9nYXRoZXJp
bmdTdGF0ZSk7CisgICAgbV9jbGllbnQtPmRpZENoYW5nZUljZUNvbm5lY3Rpb25TdGF0ZShtX2Nv
bm5lY3Rpb25TdGF0ZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShNRURJQV9TVFJFQU0pCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tb2NrL1JUQ05vdGlmaWVyc01vY2suaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2sv
UlRDTm90aWZpZXJzTW9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjZhYWM1ZGNhZTZiZGRhNWJlYjVmMzIyNDYy
MDgyNzY1YTRlZjk4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tb2NrL1JUQ05vdGlmaWVyc01vY2suaApAQCAtMCwwICsxLDgwIEBACisvKgorICogIENvcHly
aWdodCAoQykgMjAxMyBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJUQ05vdGlmaWVyc01vY2tfaAorI2Rl
ZmluZSBSVENOb3RpZmllcnNNb2NrX2gKKworI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCisKKyNp
bmNsdWRlICJSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQuaCIKKyNpbmNsdWRlICJUaW1l
ckV2ZW50QmFzZWRNb2NrLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRl
IDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUlRDU2Vzc2lv
bkRlc2NyaXB0aW9uRGVzY3JpcHRvcjsKK2NsYXNzIFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVl
c3Q7CitjbGFzcyBSVENWb2lkUmVxdWVzdDsKKworY2xhc3MgU2Vzc2lvblJlcXVlc3ROb3RpZmll
ciA6IHB1YmxpYyBNb2NrTm90aWZpZXIgeworcHVibGljOgorICAgIFNlc3Npb25SZXF1ZXN0Tm90
aWZpZXIoUGFzc1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiwgUGFzc1JlZlB0
cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPik7CisKKyAgICB2b2lkIGZpcmUoKSBP
VkVSUklERTsKKworcHJpdmF0ZToKKyAgICBSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVx
dWVzdD4gbV9yZXF1ZXN0OworICAgIFJlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlw
dG9yPiBtX2Rlc2NyaXB0b3I7Cit9OworCitjbGFzcyBWb2lkUmVxdWVzdE5vdGlmaWVyIDogcHVi
bGljIE1vY2tOb3RpZmllciB7CitwdWJsaWM6CisgICAgVm9pZFJlcXVlc3ROb3RpZmllcihQYXNz
UmVmUHRyPFJUQ1ZvaWRSZXF1ZXN0PiwgYm9vbCk7CisKKyAgICB2b2lkIGZpcmUoKSBPVkVSUklE
RTsKKworcHJpdmF0ZToKKyAgICBSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+IG1fcmVxdWVzdDsKKyAg
ICBib29sIG1fc3VjY2VzczsKK307CisKK2NsYXNzIEljZUNvbm5lY3Rpb25Ob3RpZmllciA6IHB1
YmxpYyBNb2NrTm90aWZpZXIgeworcHVibGljOgorICAgIEljZUNvbm5lY3Rpb25Ob3RpZmllcihS
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqLCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJD
bGllbnQ6OkljZUNvbm5lY3Rpb25TdGF0ZSwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50
OjpJY2VHYXRoZXJpbmdTdGF0ZSk7CisKKyAgICB2b2lkIGZpcmUoKSBPVkVSUklERTsKKworcHJp
dmF0ZToKKyAgICBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqIG1fY2xpZW50OworICAg
IFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlQ29ubmVjdGlvblN0YXRlIG1fY29u
bmVjdGlvblN0YXRlOworICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlckNsaWVudDo6SWNlR2F0
aGVyaW5nU3RhdGUgbV9nYXRoZXJpbmdTdGF0ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIEVOQUJMRShNRURJQV9TVFJFQU0pCisKKyNlbmRpZiAvLyBSVENOb3Rp
ZmllcnNNb2NrX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
b2NrL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRiMmFlYmNh
OThjMDYwOGIyZmNhMWQ3NTY5YTk5ZDc2Yzg4OGVkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9tb2NrL1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2suY3Bw
CkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMyBOb2tpYSBDb3Jw
b3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoTUVESUFfU1RSRUFNKQorCisjaW5j
bHVkZSAiUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5oIgorCisjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJSVENEVE1GU2VuZGVySGFuZGxlci5oIgorI2luY2x1ZGUg
IlJUQ0RhdGFDaGFubmVsSGFuZGxlci5oIgorI2luY2x1ZGUgIlJUQ05vdGlmaWVyc01vY2suaCIK
KyNpbmNsdWRlICJSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0LmgiCisjaW5jbHVkZSAiUlRD
Vm9pZFJlcXVlc3QuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXI+IFJUQ1Bl
ZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OmNyZWF0ZShSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJD
bGllbnQqIGNsaWVudCkKK3sKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFJUQ1BlZXJDb25uZWN0
aW9uSGFuZGxlck1vY2soY2xpZW50KSk7Cit9CisKK1JUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1v
Y2s6OlJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2soUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVy
Q2xpZW50KiBjbGllbnQpCisgICAgOiBtX2NsaWVudChjbGllbnQpCit7Cit9CisKK2Jvb2wgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6aW5pdGlhbGl6ZShQYXNzUmVmUHRyPFJUQ0NvbmZp
Z3VyYXRpb24+LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3RyYWludHM+KQoreworICAgIC8vIEZJWE1F
OiBvbmNlIHRoZXJlIGlzIHN1cHBvcnQgaW4gUlRDUGVlckNvbm5lY3Rpb24gKyBjb25zdHJhaW50
cywgdGhpcyBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IGhlcmUKKyAgICAvLyBhbmQgYSBM
YXlvdVRlc3QgZm9yIHRoYXQgbXVzdCBiZSBhZGRlZC4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzMDkzCisgICAgUmVmUHRyPEljZUNvbm5lY3Rpb25O
b3RpZmllcj4gbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgSWNlQ29ubmVjdGlvbk5vdGlmaWVyKG1f
Y2xpZW50LCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQ6OkljZUNvbm5lY3Rpb25TdGF0
ZUNvbXBsZXRlZCwgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50OjpJY2VHYXRoZXJpbmdT
dGF0ZUNvbXBsZXRlKSk7CisgICAgbV90aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRp
bWVyRXZlbnQodGhpcywgbm90aWZpZXIpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
UlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRlT2ZmZXIoUGFzc1JlZlB0cjxSVENT
ZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiByZXF1ZXN0LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3Ry
YWludHM+IGNvbnN0cmFpbnRzKQoreworICAgIFN0cmluZyBzdWNjZWVkVmFsdWU7CisgICAgUmVm
UHRyPFNlc3Npb25SZXF1ZXN0Tm90aWZpZXI+IG5vdGlmaWVyOworICAgIGlmIChjb25zdHJhaW50
cy0+Z2V0TWFuZGF0b3J5Q29uc3RyYWludFZhbHVlKCJzdWNjZWVkIiwgc3VjY2VlZFZhbHVlKSAm
JiBzdWNjZWVkVmFsdWUgPT0gInRydWUiKQorICAgICAgICBub3RpZmllciA9IGFkb3B0UmVmKG5l
dyBTZXNzaW9uUmVxdWVzdE5vdGlmaWVyKHJlcXVlc3QsIFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRl
c2NyaXB0b3I6OmNyZWF0ZSgib2ZmZXIiLCAibG9jYWwiKSkpOworICAgIGVsc2UKKyAgICAgICAg
bm90aWZpZXIgPSBhZG9wdFJlZihuZXcgU2Vzc2lvblJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCAw
KSk7CisKKyAgICBtX3RpbWVyRXZlbnRzLmFwcGVuZChhZG9wdFJlZihuZXcgVGltZXJFdmVudCh0
aGlzLCBub3RpZmllcikpKTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2Nr
OjpjcmVhdGVBbnN3ZXIoUGFzc1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0PiBy
ZXF1ZXN0LCBQYXNzUmVmUHRyPE1lZGlhQ29uc3RyYWludHM+IGNvbnN0cmFpbnRzKQoreworICAg
IFJlZlB0cjxTZXNzaW9uUmVxdWVzdE5vdGlmaWVyPiBub3RpZmllcjsKKyAgICAvLyBXZSBjYW4g
b25seSBjcmVhdGUgYW4gYW5zd2VyIGlmIHdlIGhhdmUgYWxyZWFkeSBoYWQgYW4gb2ZmZXIgYW5k
IHRoZSByZW1vdGUgc2Vzc2lvbiBkZXNjcmlwdGlvbiBpcyBzdG9yZWQuCisgICAgU3RyaW5nIHN1
Y2NlZWRWYWx1ZTsKKyAgICBpZiAoIW1fcmVtb3RlU2Vzc2lvbkRlc2NyaXB0aW9uLmdldCgpIHx8
IChjb25zdHJhaW50cy0+Z2V0TWFuZGF0b3J5Q29uc3RyYWludFZhbHVlKCJzdWNjZWVkIiwgc3Vj
Y2VlZFZhbHVlKSAmJiBzdWNjZWVkVmFsdWUgPT0gImZhbHNlIikpCisgICAgICAgIG5vdGlmaWVy
ID0gYWRvcHRSZWYobmV3IFNlc3Npb25SZXF1ZXN0Tm90aWZpZXIocmVxdWVzdCwgMCkpOworICAg
IGVsc2UKKyAgICAgICAgbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgU2Vzc2lvblJlcXVlc3ROb3Rp
ZmllcihyZXF1ZXN0LCBSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yOjpjcmVhdGUoImFu
c3dlciIsICJsb2NhbCIpKSk7CisKKyAgICBtX3RpbWVyRXZlbnRzLmFwcGVuZChhZG9wdFJlZihu
ZXcgVGltZXJFdmVudCh0aGlzLCBub3RpZmllcikpKTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVj
dGlvbkhhbmRsZXJNb2NrOjpzZXRMb2NhbERlc2NyaXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJl
cXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRv
cj4gZGVzY3JpcHRvcikKK3sKKyAgICBSZWZQdHI8Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZp
ZXI7CisgICAgaWYgKCFkZXNjcmlwdG9yLmdldCgpIHx8IGRlc2NyaXB0b3ItPnNkcCgpICE9ICJs
b2NhbCIpCisgICAgICAgIG5vdGlmaWVyID0gYWRvcHRSZWYobmV3IFZvaWRSZXF1ZXN0Tm90aWZp
ZXIocmVxdWVzdCwgZmFsc2UpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9sb2NhbFNlc3Npb25E
ZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3I7CisgICAgICAgIG5vdGlmaWVyID0gYWRvcHRSZWYobmV3
IFZvaWRSZXF1ZXN0Tm90aWZpZXIocmVxdWVzdCwgdHJ1ZSkpOworICAgIH0KKworICAgIG1fdGlt
ZXJFdmVudHMuYXBwZW5kKGFkb3B0UmVmKG5ldyBUaW1lckV2ZW50KHRoaXMsIG5vdGlmaWVyKSkp
OworfQorCit2b2lkIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlck1vY2s6OnNldFJlbW90ZURlc2Ny
aXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+IHJlcXVlc3QsIFBhc3NSZWZQdHI8UlRD
U2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gZGVzY3JpcHRvcikKK3sKKyAgICBSZWZQdHI8
Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZpZXI7CisgICAgaWYgKCFkZXNjcmlwdG9yLmdldCgp
IHx8IGRlc2NyaXB0b3ItPnNkcCgpICE9ICJyZW1vdGUiKQorICAgICAgICBub3RpZmllciA9IGFk
b3B0UmVmKG5ldyBWb2lkUmVxdWVzdE5vdGlmaWVyKHJlcXVlc3QsIGZhbHNlKSk7CisgICAgZWxz
ZSB7CisgICAgICAgIG1fcmVtb3RlU2Vzc2lvbkRlc2NyaXB0aW9uID0gZGVzY3JpcHRvcjsKKyAg
ICAgICAgbm90aWZpZXIgPSBhZG9wdFJlZihuZXcgVm9pZFJlcXVlc3ROb3RpZmllcihyZXF1ZXN0
LCB0cnVlKSk7CisgICAgfQorCisgICAgbV90aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3
IFRpbWVyRXZlbnQodGhpcywgbm90aWZpZXIpKSk7Cit9CisKK1Bhc3NSZWZQdHI8UlRDU2Vzc2lv
bkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6bG9j
YWxEZXNjcmlwdGlvbigpCit7CisgICAgcmV0dXJuIG1fbG9jYWxTZXNzaW9uRGVzY3JpcHRpb247
Cit9CisKK1Bhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4gUlRDUGVl
ckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6cmVtb3RlRGVzY3JpcHRpb24oKQoreworICAgIHJldHVy
biBtX3JlbW90ZVNlc3Npb25EZXNjcmlwdGlvbjsKK30KKworYm9vbCBSVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXJNb2NrOjp1cGRhdGVJY2UoUGFzc1JlZlB0cjxSVENDb25maWd1cmF0aW9uPiwgUGFz
c1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjphZGRJY2VDYW5kaWRhdGUoUGFzc1JlZlB0
cjxSVENWb2lkUmVxdWVzdD4gcmVxdWVzdCwgUGFzc1JlZlB0cjxSVENJY2VDYW5kaWRhdGVEZXNj
cmlwdG9yPikKK3sKKyAgICBSZWZQdHI8Vm9pZFJlcXVlc3ROb3RpZmllcj4gbm90aWZpZXIgPSBh
ZG9wdFJlZihuZXcgVm9pZFJlcXVlc3ROb3RpZmllcihyZXF1ZXN0LCB0cnVlKSk7CisgICAgbV90
aW1lckV2ZW50cy5hcHBlbmQoYWRvcHRSZWYobmV3IFRpbWVyRXZlbnQodGhpcywgbm90aWZpZXIp
KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVy
TW9jazo6YWRkU3RyZWFtKFBhc3NSZWZQdHI8TWVkaWFTdHJlYW1EZXNjcmlwdG9yPiwgUGFzc1Jl
ZlB0cjxNZWRpYUNvbnN0cmFpbnRzPikKK3sKKyAgICAvLyBTcGVjIHN0YXRlcyB0aGF0IGV2ZXJ5
IHRpbWUgYSBzdHJlYW0gaXMgYWRkZWQsIGEgbmVnb3RpYXRpb25uZWVkZWQgZXZlbnQgbXVzdCBi
ZSBmaXJlZC4KKyAgICBtX2NsaWVudC0+bmVnb3RpYXRpb25OZWVkZWQoKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpyZW1vdmVTdHJl
YW0oUGFzc1JlZlB0cjxNZWRpYVN0cmVhbURlc2NyaXB0b3I+KQoreworICAgIC8vIFNwZWMgc3Rh
dGVzIHRoYXQgZXZlcnkgdGltZSBhIHN0cmVhbSBpcyByZW1vdmVkLCBhIG5lZ290aWF0aW9ubmVl
ZGVkIGV2ZW50IG11c3QgYmUgZmlyZWQuCisgICAgbV9jbGllbnQtPm5lZ290aWF0aW9uTmVlZGVk
KCk7Cit9CisKK3ZvaWQgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Z2V0U3RhdHMoUGFz
c1JlZlB0cjxSVENTdGF0c1JlcXVlc3Q+KQoreworICAgIC8vIEN1cnJlbnQgdGVzdHMgZG9lcyBu
b3Qgc3VwcG9ydCBnZXRVc2VyTWVkaWEgYW5kIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgaXQuCisg
ICAgLy8gT25jZSBXZWJLaXQgaGFzIHRlc3Qgc3VwcG9ydCB0byBnZXRVc2VyTWVkaWEsIHRoaXMg
bXVzdCBiZSBmaXhlZC4KKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitQYXNzT3duUHRyPFJU
Q0RhdGFDaGFubmVsSGFuZGxlcj4gUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRl
RGF0YUNoYW5uZWwoY29uc3QgU3RyaW5nJiwgY29uc3QgUlRDRGF0YUNoYW5uZWxJbml0JikKK3sK
KyAgICAvLyBSZXF1aXJlcyBhIG1vY2sgaW1wbGVtZW50YXRpb24gb2YgUlRDRGF0YUNoYW5uZWxI
YW5kbGVyLgorICAgIC8vIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBvbmNlIHRoZSBtb2NrIGlt
cGxlbWVudGF0aW9uIG9mIFJUQ0RhdGFDaGFubmVsSGFuZGxlciBpcyByZWFkeS4KKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitQYXNzT3duUHRyPFJUQ0RUTUZTZW5k
ZXJIYW5kbGVyPiBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpjcmVhdGVEVE1GU2VuZGVy
KFBhc3NSZWZQdHI8TWVkaWFTdHJlYW1Tb3VyY2U+KQoreworICAgIC8vIFJlcXVpcmVzIGEgbW9j
ayBpbXBsZW1lbnRhdGlvbiBvZiBSVENEVE1GU2VuZGVySGFuZGxlci4KKyAgICAvLyBUaGlzIG11
c3QgYmUgaW1wbGVtZW50ZWQgb25jZSB0aGUgbW9jayBpbXBsZW1lbnRhdGlvbiBvZiBSVENEYXRh
Q2hhbm5lbEhhbmRsZXIgaXMgcmVhZHkuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1
cm4gMDsKK30KKwordm9pZCBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrOjpzdG9wKCkKK3sK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKE1FRElBX1NU
UkVBTSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2svUlRDUGVlckNv
bm5lY3Rpb25IYW5kbGVyTW9jay5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9SVENQ
ZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDVkZGEwOTA3OTI3NzcxY2Jh
Mzk1YTMzOWQ0MDVmYTJlZGNkMTc3OQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL21vY2svUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jay5oCkBAIC0wLDAgKzEs
NzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEzIE5va2lhIENvcnBvcmF0aW9uIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9ja19oCisjZGVmaW5lIFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlck1vY2tfaAorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKworI2luY2x1ZGUgIlJUQ1Bl
ZXJDb25uZWN0aW9uSGFuZGxlci5oIgorI2luY2x1ZGUgIlJUQ1Nlc3Npb25EZXNjcmlwdGlvbkRl
c2NyaXB0b3IuaCIKKyNpbmNsdWRlICJUaW1lckV2ZW50QmFzZWRNb2NrLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jayBGSU5BTCA6
IHB1YmxpYyBSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXIsIHB1YmxpYyBUaW1lckV2ZW50QmFzZWRN
b2NrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxSVENQZWVyQ29ubmVjdGlvbkhh
bmRsZXI+IGNyZWF0ZShSVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJDbGllbnQqKTsKKyAgICB2aXJ0
dWFsIH5SVENQZWVyQ29ubmVjdGlvbkhhbmRsZXJNb2NrKCkgeyB9CisKKyAgICB2aXJ0dWFsIGJv
b2wgaW5pdGlhbGl6ZShQYXNzUmVmUHRyPFJUQ0NvbmZpZ3VyYXRpb24+LCBQYXNzUmVmUHRyPE1l
ZGlhQ29uc3RyYWludHM+KSBPVkVSUklERTsKKworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVPZmZl
cihQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlvblJlcXVlc3Q+LCBQYXNzUmVmUHRyPE1l
ZGlhQ29uc3RyYWludHM+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQW5zd2Vy
KFBhc3NSZWZQdHI8UlRDU2Vzc2lvbkRlc2NyaXB0aW9uUmVxdWVzdD4sIFBhc3NSZWZQdHI8TWVk
aWFDb25zdHJhaW50cz4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2NhbERlc2Ny
aXB0aW9uKFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+LCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25E
ZXNjcmlwdGlvbkRlc2NyaXB0b3I+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UmVt
b3RlRGVzY3JpcHRpb24oUGFzc1JlZlB0cjxSVENWb2lkUmVxdWVzdD4sIFBhc3NSZWZQdHI8UlRD
U2Vzc2lvbkRlc2NyaXB0aW9uRGVzY3JpcHRvcj4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBsb2NhbERlc2NyaXB0aW9u
KCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPFJUQ1Nlc3Npb25EZXNjcmlwdGlv
bkRlc2NyaXB0b3I+IHJlbW90ZURlc2NyaXB0aW9uKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBi
b29sIHVwZGF0ZUljZShQYXNzUmVmUHRyPFJUQ0NvbmZpZ3VyYXRpb24+LCBQYXNzUmVmUHRyPE1l
ZGlhQ29uc3RyYWludHM+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkSWNlQ2FuZGlk
YXRlKFBhc3NSZWZQdHI8UlRDVm9pZFJlcXVlc3Q+LCBQYXNzUmVmUHRyPFJUQ0ljZUNhbmRpZGF0
ZURlc2NyaXB0b3I+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgYWRkU3RyZWFtKFBhc3NS
ZWZQdHI8TWVkaWFTdHJlYW1EZXNjcmlwdG9yPiwgUGFzc1JlZlB0cjxNZWRpYUNvbnN0cmFpbnRz
PikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVN0cmVhbShQYXNzUmVmUHRyPE1l
ZGlhU3RyZWFtRGVzY3JpcHRvcj4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBnZXRTdGF0
cyhQYXNzUmVmUHRyPFJUQ1N0YXRzUmVxdWVzdD4pIE9WRVJSSURFOworICAgIHZpcnR1YWwgUGFz
c093blB0cjxSVENEYXRhQ2hhbm5lbEhhbmRsZXI+IGNyZWF0ZURhdGFDaGFubmVsKGNvbnN0IFN0
cmluZyYgbGFiZWwsIGNvbnN0IFJUQ0RhdGFDaGFubmVsSW5pdCYpIE9WRVJSSURFOworICAgIHZp
cnR1YWwgUGFzc093blB0cjxSVENEVE1GU2VuZGVySGFuZGxlcj4gY3JlYXRlRFRNRlNlbmRlcihQ
YXNzUmVmUHRyPE1lZGlhU3RyZWFtU291cmNlPikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lk
IHN0b3AoKSBPVkVSUklERTsKKworcHJvdGVjdGVkOgorICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlck1vY2soUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50Kik7CisKK3ByaXZhdGU6Cisg
ICAgUlRDUGVlckNvbm5lY3Rpb25IYW5kbGVyQ2xpZW50KiBtX2NsaWVudDsKKworICAgIFJlZlB0
cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX2xvY2FsU2Vzc2lvbkRlc2NyaXB0
aW9uOworICAgIFJlZlB0cjxSVENTZXNzaW9uRGVzY3JpcHRpb25EZXNjcmlwdG9yPiBtX3JlbW90
ZVNlc3Npb25EZXNjcmlwdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShNRURJQV9TVFJFQU0pCisKKyNlbmRpZiAvLyBSVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXJNb2NrX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21vY2sv
VGltZXJFdmVudEJhc2VkTW9jay5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbW9jay9UaW1l
ckV2ZW50QmFzZWRNb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTU3NWFjZmMzMmJjMDkzNjJjZDZiMWVjNmFi
OTQ3MDk5MzU0NjY3YQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L21vY2svVGltZXJFdmVudEJhc2VkTW9jay5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgQ29w
eXJpZ2h0IChDKSAyMDEzIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgt
aWVzKS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGltZXJFdmVudEJhc2VkTW9ja19o
CisjZGVmaW5lIFRpbWVyRXZlbnRCYXNlZE1vY2tfaAorCisjaWYgRU5BQkxFKE1FRElBX1NUUkVB
TSkKKworI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVGltZXJF
dmVudDsKKworY2xhc3MgTW9ja05vdGlmaWVyIDogcHVibGljIFJlZkNvdW50ZWQ8TW9ja05vdGlm
aWVyPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TW9ja05vdGlmaWVyKCkgeyB9CisgICAgdmly
dHVhbCB2b2lkIGZpcmUoKSA9IDA7Cit9OworCitjbGFzcyBUaW1lckV2ZW50QmFzZWRNb2NrIHsK
K3B1YmxpYzoKKyAgICB2b2lkIHJlbW92ZUV2ZW50KFBhc3NSZWZQdHI8VGltZXJFdmVudD4gZXZl
bnQpCisgICAgeworICAgICAgICBzaXplX3QgcG9zID0gbV90aW1lckV2ZW50cy5maW5kKGV2ZW50
KTsKKyAgICAgICAgbV90aW1lckV2ZW50cy5yZW1vdmUocG9zKTsKKyAgICB9CisKK3Byb3RlY3Rl
ZDoKKyAgICBWZWN0b3I8UmVmUHRyPFRpbWVyRXZlbnQ+ID4gbV90aW1lckV2ZW50czsKK307CisK
K2NsYXNzIFRpbWVyRXZlbnQgOiBwdWJsaWMgUmVmQ291bnRlZDxUaW1lckV2ZW50PiB7CitwdWJs
aWM6CisgICAgVGltZXJFdmVudChUaW1lckV2ZW50QmFzZWRNb2NrKiBtb2NrLCBQYXNzUmVmUHRy
PE1vY2tOb3RpZmllcj4gbm90aWZpZXIpCisgICAgICAgIDogbV9tb2NrKG1vY2spCisgICAgICAg
ICwgbV90aW1lcih0aGlzLCAmVGltZXJFdmVudDo6dGltZXJGaXJlZCkKKyAgICAgICAgLCBtX25v
dGlmaWVyKG5vdGlmaWVyKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3QoMC41
KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5UaW1lckV2ZW50KCkgeyB9CisKKyAgICB2b2lkIHRp
bWVyRmlyZWQoVGltZXI8VGltZXJFdmVudD4qKQorICAgIHsKKyAgICAgICAgbV9ub3RpZmllci0+
ZmlyZSgpOworICAgICAgICBtX21vY2stPnJlbW92ZUV2ZW50KHRoaXMpOworICAgIH0KKworcHJp
dmF0ZToKKyAgICBUaW1lckV2ZW50QmFzZWRNb2NrKiBtX21vY2s7CisgICAgVGltZXI8VGltZXJF
dmVudD4gbV90aW1lcjsKKyAgICBSZWZQdHI8TW9ja05vdGlmaWVyPiBtX25vdGlmaWVyOworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKE1FRElBX1NUUkVB
TSkKKworI2VuZGlmIC8vIFRpbWVyRXZlbnRCYXNlZE1vY2tfaApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuY3BwIGIvU291cmNlL1dlYkNvcmUvdGVzdGluZy9J
bnRlcm5hbHMuY3BwCmluZGV4IDM2NWNjYTFhMzlkZDBhZjFlNWU0N2FiNjQzMTQ3ZmYxNTczM2Qy
NWYuLjBiN2Y4ZmIxODcxYmJhNjE4MzgyZDAyZjc2NTk5NDA3OWU0ODI0ODQgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS90ZXN0aW5nL0ludGVybmFscy5jcHAKQEAgLTE0OCw2ICsxNDgsOCBAQAogCiAjaWYgRU5BQkxF
KE1FRElBX1NUUkVBTSkKICNpbmNsdWRlICJNb2NrTWVkaWFTdHJlYW1DZW50ZXIuaCIKKyNpbmNs
dWRlICJSVENQZWVyQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIlJUQ1BlZXJDb25uZWN0aW9uSGFu
ZGxlck1vY2suaCIKICNlbmRpZgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0yODAsOSArMjgy
LDEwIEBAIEludGVybmFsczo6SW50ZXJuYWxzKERvY3VtZW50KiBkb2N1bWVudCkKICAgICBpZiAo
ZG9jdW1lbnQgJiYgZG9jdW1lbnQtPnBhZ2UoKSkKICAgICAgICAgZG9jdW1lbnQtPnBhZ2UoKS0+
Z3JvdXAoKS5jYXB0aW9uUHJlZmVyZW5jZXMoKS0+c2V0VGVzdGluZ01vZGUodHJ1ZSk7CiAjZW5k
aWYKLSAgICAKKwogI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCiAgICAgTW9ja01lZGlhU3RyZWFt
Q2VudGVyOjpyZWdpc3Rlck1vY2tNZWRpYVN0cmVhbUNlbnRlcigpOworICAgIGVuYWJsZU1vY2tS
VENQZWVyQ29ubmVjdGlvbkhhbmRsZXIoKTsKICNlbmRpZgogfQogCkBAIC02NDQsNyArNjQ3LDE0
IEBAIHZvaWQgSW50ZXJuYWxzOjplbmFibGVNb2NrU3BlZWNoU3ludGhlc2l6ZXIoKQogICAgIHN5
bnRoZXNpcy0+c2V0UGxhdGZvcm1TeW50aGVzaXplcihQbGF0Zm9ybVNwZWVjaFN5bnRoZXNpemVy
TW9jazo6Y3JlYXRlKHN5bnRoZXNpcykpOwogfQogI2VuZGlmCi0gICAgCisKKyNpZiBFTkFCTEUo
TUVESUFfU1RSRUFNKQordm9pZCBJbnRlcm5hbHM6OmVuYWJsZU1vY2tSVENQZWVyQ29ubmVjdGlv
bkhhbmRsZXIoKQoreworICAgIFJUQ1BlZXJDb25uZWN0aW9uSGFuZGxlcjo6Y3JlYXRlID0gUlRD
UGVlckNvbm5lY3Rpb25IYW5kbGVyTW9jazo6Y3JlYXRlOworfQorI2VuZGlmCisKIFBhc3NSZWZQ
dHI8Q2xpZW50UmVjdD4gSW50ZXJuYWxzOjphYnNvbHV0ZUNhcmV0Qm91bmRzKEV4Y2VwdGlvbkNv
ZGUmIGVjKQogewogICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGNvbnRleHREb2N1bWVudCgpOwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuaCBiL1NvdXJjZS9X
ZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmgKaW5kZXggOTBhYWFiMWE5NGIxMjIwYThhZDUxOWJh
YzM5MWUyNTZhZjdhYmY1Yy4uMWJlYmEwMzk3OGQyYWI0YzdjZDkyMGQ4YzdlMzJmYzA0NGM2MjA4
NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuaAorKysgYi9T
b3VyY2UvV2ViQ29yZS90ZXN0aW5nL0ludGVybmFscy5oCkBAIC0yOTMsNiArMjkzLDEwIEBAIHB1
YmxpYzoKICAgICB2b2lkIGVuYWJsZU1vY2tTcGVlY2hTeW50aGVzaXplcigpOwogI2VuZGlmCiAK
KyNpZiBFTkFCTEUoTUVESUFfU1RSRUFNKQorICAgIHZvaWQgZW5hYmxlTW9ja1JUQ1BlZXJDb25u
ZWN0aW9uSGFuZGxlcigpOworI2VuZGlmCisKICAgICBTdHJpbmcgZ2V0SW1hZ2VTb3VyY2VVUkwo
RWxlbWVudCosIEV4Y2VwdGlvbkNvZGUmKTsKIAogI2lmIEVOQUJMRShWSURFTykK
</data>

          </attachment>
      

    </bug>

</bugzilla>