<?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>149419</bug_id>
          
          <creation_ts>2015-09-21 15:11:05 -0700</creation_ts>
          <short_desc>[MediaStream Mac] implement WebAudioSourceProvider</short_desc>
          <delta_ts>2015-09-22 09:14:13 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Media</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Carlson">eric.carlson</reporter>
          <assigned_to name="Eric Carlson">eric.carlson</assigned_to>
          <cc>jer.noble</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1127770</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2015-09-21 15:11:05 -0700</bug_when>
    <thetext>Make live audio available to WebAudio.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127771</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2015-09-21 15:12:51 -0700</bug_when>
    <thetext>&lt;rdar://problem/22789888&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127788</commentid>
    <comment_count>2</comment_count>
      <attachid>261692</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2015-09-21 15:40:33 -0700</bug_when>
    <thetext>Created attachment 261692
Proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127819</commentid>
    <comment_count>3</comment_count>
      <attachid>261692</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-09-21 16:28:17 -0700</bug_when>
    <thetext>Comment on attachment 261692
Proposed patch.

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

&gt; Source/WebCore/Modules/webaudio/AudioContext.cpp:466
&gt; +    MediaStreamTrackVector audioTracks = mediaStream-&gt;getAudioTracks();

I think I like auto better here than a type name.

&gt; Source/WebCore/Modules/webaudio/AudioContext.cpp:487
&gt; +    RefPtr&lt;MediaStreamAudioSourceNode&gt; node = MediaStreamAudioSourceNode::create(*this, *mediaStream, *providerTrack);

Consider using auto here instead of RefPtr. Also, type should probably be Ref, not RefPtr.

&gt; Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.cpp:54
&gt; +    audioSources.reserveCapacity(1);
&gt;      audioSources.append(m_source);

Should be reserveInitialCapacity(1) and then uncheckedAppend(m_source) or we could just construct the vector with a single element instead of appending (not sure what the syntax is for that, but I am pretty sure we support it).

&gt; Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.cpp:55
&gt;      m_stream = MediaStream::create(*context-&gt;scriptExecutionContext(), MediaStreamPrivate::create(audioSources, Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt;()));

Seems like this should move the audio sources Vector in. I’d expect to see a WTF::move here.

&gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp:65
&gt; +    AudioSourceProvider* audioSourceProvider = m_audioTrack-&gt;audioSourceProvider();
&gt; +    if (audioSourceProvider)
&gt; +        audioSourceProvider-&gt;setClient(nullptr);

I don’t understand why this is OK. If audioSourceProvider is null, then we have left a dangling client pointer pointing to this node and it seems we will inevitably crash.

&gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp:90
&gt; +        if (sourceSampleRate != sampleRate()) {
&gt; +            double scaleFactor = sourceSampleRate / sampleRate();
&gt; +            m_multiChannelResampler = std::make_unique&lt;MultiChannelResampler&gt;(scaleFactor, numberOfChannels);
&gt; +        } else
&gt; +            m_multiChannelResampler = nullptr;

Is it OK for efficiency purposes to call sampleRate() twice? I would use == instead of != and do the shorter nullptr case first.

&gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h:53
&gt; +    void reset() override { };

No semicolon needed here.

&gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h:68
&gt;      RefPtr&lt;MediaStream&gt; m_mediaStream;
&gt;      RefPtr&lt;MediaStreamTrack&gt; m_audioTrack;

These should be Ref instead of RefPtr.

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h:67
&gt; +    // AudioSourceProvider
&gt; +    virtual void provideInput(AudioBus*, size_t) override;
&gt; +    virtual void setClient(AudioSourceProviderClient*) override;
&gt; +
&gt; +    // AVAudioCaptureSource::Observer
&gt; +    void prepare(const AudioStreamBasicDescription *) override;
&gt; +    void unprepare() override;
&gt; +    void process(CMFormatDescriptionRef, CMSampleBufferRef) override;

Why use the virtual keyword on one set of overrides, but not on the other?

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:76
&gt; +    setClient(nullptr);

I am not sure that sharing code with setClient is that valuable. I think that this might be better:

    if (m_connected)
        m_captureSource-&gt;removeObserver(this);

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:105
&gt; +    size_t framesAvailable = static_cast&lt;size_t&gt;(endFrame - (m_readCount + m_writeAheadCount));

Why the use of size_t here? If the underlying type is uint64_t, then size_t seems really risky since on 32-bit platforms it will truncate the value. Why not uint64_t? Not sure why size_t gets involved at all, nor why everything is 64-bit.

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:114
&gt; +        AudioChannel* channel = bus-&gt;channel(i);

Should use a reference here instead of a pointer.

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:117
&gt; +        m_list-&gt;mBuffers[i].mNumberChannels = 1;
&gt; +        m_list-&gt;mBuffers[i].mData = channel-&gt;mutableData();
&gt; +        m_list-&gt;mBuffers[i].mDataByteSize = channel-&gt;length() * sizeof(float);

Maybe put a reference to m_list-&gt;mBuffers[i] into a local variable?

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:161
&gt; +void WebAudioSourceProviderAVFObjC::prepare(const AudioStreamBasicDescription *format)

Misplaced * here.

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:165
&gt; +    size_t bytesPerFrame = format-&gt;mBytesPerFrame;

Strange use of size_t.

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:190
&gt; +    m_ringBuffer-&gt;allocate(numberOfChannels, bytesPerFrame, static_cast&lt;size_t&gt;(kRingBufferDuration * sampleRate));

I think we need to check the range of sampleRate. What prevents overflow here?

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:194
&gt; +    m_listBufferSize = offsetof(AudioBufferList, mBuffers) + (sizeof(AudioBuffer) * std::max(1, numberOfChannels));

I think we need to check the range of numberOfChannels. What prevents overflow here?

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:195
&gt; +    m_list = std::unique_ptr&lt;AudioBufferList&gt;((AudioBufferList*) ::operator new (m_listBufferSize));

The use of a C style cast here is strange. There must be a better way to write this.

&gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:201
&gt; +        strongThis-&gt;m_client-&gt;setFormat(numberOfChannels, sampleRate);

What guarantees m_client won’t be null when this is called on the main thread?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127995</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2015-09-22 07:15:49 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Comment on attachment 261692 [details]
&gt; Proposed patch.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=261692&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/AudioContext.cpp:466
&gt; &gt; +    MediaStreamTrackVector audioTracks = mediaStream-&gt;getAudioTracks();
&gt; 
&gt; I think I like auto better here than a type name.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/Modules/webaudio/AudioContext.cpp:487
&gt; &gt; +    RefPtr&lt;MediaStreamAudioSourceNode&gt; node = MediaStreamAudioSourceNode::create(*this, *mediaStream, *providerTrack);
&gt; 
&gt; Consider using auto here instead of RefPtr. Also, type should probably be
&gt; Ref, not RefPtr.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.cpp:54
&gt; &gt; +    audioSources.reserveCapacity(1);
&gt; &gt;      audioSources.append(m_source);
&gt; 
&gt; Should be reserveInitialCapacity(1) and then uncheckedAppend(m_source) or we
&gt; could just construct the vector with a single element instead of appending
&gt; (not sure what the syntax is for that, but I am pretty sure we support it).
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.cpp:55
&gt; &gt;      m_stream = MediaStream::create(*context-&gt;scriptExecutionContext(), MediaStreamPrivate::create(audioSources, Vector&lt;RefPtr&lt;RealtimeMediaSource&gt;&gt;()));
&gt; 
&gt; Seems like this should move the audio sources Vector in. I’d expect to see a
&gt; WTF::move here.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp:65
&gt; &gt; +    AudioSourceProvider* audioSourceProvider = m_audioTrack-&gt;audioSourceProvider();
&gt; &gt; +    if (audioSourceProvider)
&gt; &gt; +        audioSourceProvider-&gt;setClient(nullptr);
&gt; 
&gt; I don’t understand why this is OK. If audioSourceProvider is null, then we
&gt; have left a dangling client pointer pointing to this node and it seems we
&gt; will inevitably crash.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp:90
&gt; &gt; +        if (sourceSampleRate != sampleRate()) {
&gt; &gt; +            double scaleFactor = sourceSampleRate / sampleRate();
&gt; &gt; +            m_multiChannelResampler = std::make_unique&lt;MultiChannelResampler&gt;(scaleFactor, numberOfChannels);
&gt; &gt; +        } else
&gt; &gt; +            m_multiChannelResampler = nullptr;
&gt; 
&gt; Is it OK for efficiency purposes to call sampleRate() twice? I would use ==
&gt; instead of != and do the shorter nullptr case first.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h:53
&gt; &gt; +    void reset() override { };
&gt; 
&gt; No semicolon needed here.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h:68
&gt; &gt;      RefPtr&lt;MediaStream&gt; m_mediaStream;
&gt; &gt;      RefPtr&lt;MediaStreamTrack&gt; m_audioTrack;
&gt; 
&gt; These should be Ref instead of RefPtr.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h:67
&gt; &gt; +    // AudioSourceProvider
&gt; &gt; +    virtual void provideInput(AudioBus*, size_t) override;
&gt; &gt; +    virtual void setClient(AudioSourceProviderClient*) override;
&gt; &gt; +
&gt; &gt; +    // AVAudioCaptureSource::Observer
&gt; &gt; +    void prepare(const AudioStreamBasicDescription *) override;
&gt; &gt; +    void unprepare() override;
&gt; &gt; +    void process(CMFormatDescriptionRef, CMSampleBufferRef) override;
&gt; 
&gt; Why use the virtual keyword on one set of overrides, but not on the other?
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:76
&gt; &gt; +    setClient(nullptr);
&gt; 
&gt; I am not sure that sharing code with setClient is that valuable. I think
&gt; that this might be better:
&gt; 
&gt;     if (m_connected)
&gt;         m_captureSource-&gt;removeObserver(this);
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:105
&gt; &gt; +    size_t framesAvailable = static_cast&lt;size_t&gt;(endFrame - (m_readCount + m_writeAheadCount));
&gt; 
&gt; Why the use of size_t here? If the underlying type is uint64_t, then size_t
&gt; seems really risky since on 32-bit platforms it will truncate the value. Why
&gt; not uint64_t? Not sure why size_t gets involved at all, nor why everything
&gt; is 64-bit.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:114
&gt; &gt; +        AudioChannel* channel = bus-&gt;channel(i);
&gt; 
&gt; Should use a reference here instead of a pointer.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:117
&gt; &gt; +        m_list-&gt;mBuffers[i].mNumberChannels = 1;
&gt; &gt; +        m_list-&gt;mBuffers[i].mData = channel-&gt;mutableData();
&gt; &gt; +        m_list-&gt;mBuffers[i].mDataByteSize = channel-&gt;length() * sizeof(float);
&gt; 
&gt; Maybe put a reference to m_list-&gt;mBuffers[i] into a local variable?
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:161
&gt; &gt; +void WebAudioSourceProviderAVFObjC::prepare(const AudioStreamBasicDescription *format)
&gt; 
&gt; Misplaced * here.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:165
&gt; &gt; +    size_t bytesPerFrame = format-&gt;mBytesPerFrame;
&gt; 
&gt; Strange use of size_t.
&gt; 
Indeed, fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:190
&gt; &gt; +    m_ringBuffer-&gt;allocate(numberOfChannels, bytesPerFrame, static_cast&lt;size_t&gt;(kRingBufferDuration * sampleRate));
&gt; 
&gt; I think we need to check the range of sampleRate. What prevents overflow
&gt; here?
&gt; 
Added an ASSERT.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:194
&gt; &gt; +    m_listBufferSize = offsetof(AudioBufferList, mBuffers) + (sizeof(AudioBuffer) * std::max(1, numberOfChannels));
&gt; 
&gt; I think we need to check the range of numberOfChannels. What prevents
&gt; overflow here?
&gt; 
Ditto.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:195
&gt; &gt; +    m_list = std::unique_ptr&lt;AudioBufferList&gt;((AudioBufferList*) ::operator new (m_listBufferSize));
&gt; 
&gt; The use of a C style cast here is strange. There must be a better way to
&gt; write this.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:201
&gt; &gt; +        strongThis-&gt;m_client-&gt;setFormat(numberOfChannels, sampleRate);
&gt; 
&gt; What guarantees m_client won’t be null when this is called on the main
&gt; thread?
&gt;
Nothing, fixed.

Thanks for the thorough review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127997</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2015-09-22 07:35:01 -0700</bug_when>
    <thetext>Committed r190115: https://trac.webkit.org/r190115</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1128009</commentid>
    <comment_count>6</comment_count>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2015-09-22 09:14:13 -0700</bug_when>
    <thetext>Plus https://trac.webkit.org/r190117 to fix the Yosemite 32-bit build.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>261692</attachid>
            <date>2015-09-21 15:40:33 -0700</date>
            <delta_ts>2015-09-22 07:35:09 -0700</delta_ts>
            <desc>Proposed patch.</desc>
            <filename>web_audio_patch_1.txt</filename>
            <type>text/plain</type>
            <size>44341</size>
            <attacher name="Eric Carlson">eric.carlson</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5MDA4MykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcxIEBACisyMDE1LTA5LTIxICBFcmljIENh
cmxzb24gIDxlcmljLmNhcmxzb25AYXBwbGUuY29tPgorCisgICAgICAgIFtNZWRpYVN0cmVhbSBN
YWNdIGltcGxlbWVudCBXZWJBdWRpb1NvdXJjZVByb3ZpZGVyCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDk0MTkKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIE1vZHVsZXMvbWVkaWFzdHJlYW0vTWVkaWFT
dHJlYW1UcmFjay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVN0cmVhbVRyYWNrOjphdWRp
b1NvdXJjZVByb3ZpZGVyKTogTmV3LgorICAgICAgICAqIE1vZHVsZXMvbWVkaWFzdHJlYW0vTWVk
aWFTdHJlYW1UcmFjay5oOgorCisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9BdWRpb0NvbnRl
eHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Db250ZXh0OjpjcmVhdGVNZWRpYVN0cmVh
bVNvdXJjZSk6IFJld3JpdGUuCisKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL01lZGlhU3Ry
ZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFTdHJl
YW1BdWRpb0Rlc3RpbmF0aW9uTm9kZTo6TWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZSk6
IFdlIGtub3cgdGhlIFZlY3RvcgorICAgICAgICAgIHNpemUsIHNvIHJlc2VydmUgY2FwYWNpdHku
CisKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL01lZGlhU3RyZWFtQXVkaW9Tb3VyY2UuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFTdHJlYW1BdWRpb1NvdXJjZTo6YXVkaW9Tb3VyY2VQ
cm92aWRlcik6IEFkZC4KKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL01lZGlhU3RyZWFtQXVk
aW9Tb3VyY2UuaDoKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhU3RyZWFtQXVkaW9Tb3VyY2U6On5N
ZWRpYVN0cmVhbUF1ZGlvU291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhU3RyZWFtQXVk
aW9Tb3VyY2U6OmRldmljZUlkKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhU3RyZWFtQXVkaW9T
b3VyY2U6OnNldERldmljZUlkKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhU3RyZWFtQXVkaW9T
b3VyY2U6OnVzZUlERm9yVHJhY2tJRCk6IERlbGV0ZWQuCisKKyAgICAgICAgKiBNb2R1bGVzL3dl
YmF1ZGlvL01lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
Ok1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpjcmVhdGUpOiBDb250ZXh0IGFuZCB0cmFjayBj
YW4ndCBiZSBudWxsIHNvIHRha2UgcmVmZXJlbmNlcy4KKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlh
U3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSk6IERpdHRv
LgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGU6On5NZWRpYVN0
cmVhbUF1ZGlvU291cmNlTm9kZSk6IENsZWFyIHByb3ZpZGVyIGNsaWVudC4KKyAgICAgICAgKFdl
YkNvcmU6Ok1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpzZXRGb3JtYXQpOiBDcmVhdGUgYSBy
ZXNhbXBsZXIgd2hlbiBuZWNlc3NhcnkuCisgICAgICAgIChXZWJDb3JlOjpNZWRpYVN0cmVhbUF1
ZGlvU291cmNlTm9kZTo6cHJvY2Vzcyk6IFByb2Nlc3MuCisgICAgICAgIChXZWJDb3JlOjpNZWRp
YVN0cmVhbUF1ZGlvU291cmNlTm9kZTo6cmVzZXQpOiBEZWxldGVkLgorICAgICAgICAqIE1vZHVs
ZXMvd2ViYXVkaW8vTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGUuaDoKKyAgICAgICAgKFdlYkNv
cmU6Ok1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjptZWRpYVN0cmVhbSk6CisgICAgICAgIChX
ZWJDb3JlOjpNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZTo6YXVkaW9Tb3VyY2VQcm92aWRlcik6
IERlbGV0ZWQuCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6
IEFkZCBXZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQy5jcHAvaC4KKworICAgICAgICAqIHBs
YXRmb3JtL21lZGlhc3RyZWFtL01lZGlhU3RyZWFtVHJhY2tQcml2YXRlLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6Ok1lZGlhU3RyZWFtVHJhY2tQcml2YXRlOjphdWRpb1NvdXJjZVByb3ZpZGVyKTog
TmV3LCBwYXNzdGhyb3VnaCB0byBzb3VyY2UuCisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJl
YW0vTWVkaWFTdHJlYW1UcmFja1ByaXZhdGUuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9tZWRpYXN0
cmVhbS9SZWFsdGltZU1lZGlhU291cmNlLmg6CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZU1l
ZGlhU291cmNlOjphdWRpb1NvdXJjZVByb3ZpZGVyKToKKworICAgICAgICAqIHBsYXRmb3JtL21l
ZGlhc3RyZWFtL21hYy9BVkF1ZGlvQ2FwdHVyZVNvdXJjZS5oOgorICAgICAgICAqIHBsYXRmb3Jt
L21lZGlhc3RyZWFtL21hYy9BVkF1ZGlvQ2FwdHVyZVNvdXJjZS5tbToKKyAgICAgICAgKFdlYkNv
cmU6OkFWQXVkaW9DYXB0dXJlU291cmNlOjphdWRpb1NvdXJjZVByb3ZpZGVyKTogTmV3LgorICAg
ICAgICAqIHBsYXRmb3JtL21lZGlhc3RyZWFtL21hYy9BVkNhcHR1cmVEZXZpY2VNYW5hZ2VyLm1t
OgorICAgICAgICAqIHBsYXRmb3JtL21lZGlhc3RyZWFtL21hYy9BVk1lZGlhQ2FwdHVyZVNvdXJj
ZS5oOgorICAgICAgICAqIHBsYXRmb3JtL21lZGlhc3RyZWFtL21hYy9BVk1lZGlhQ2FwdHVyZVNv
dXJjZS5tbToKKyAgICAgICAgKFdlYkNvcmU6OkFWTWVkaWFDYXB0dXJlU291cmNlOjphdWRpb1Nv
dXJjZVByb3ZpZGVyKTogQXNzZXJ0LCB0aGlzIHNob3VsZG4ndCBiZSByZWFjaGFibGUuCisKKyAg
ICAgICAgKiBwbGF0Zm9ybS9tZWRpYXN0cmVhbS9tYWMvV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFW
Rk9iakMuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vbWVkaWFzdHJlYW0vbWFjL1dlYkF1
ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDLm1tOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oldl
YkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
V2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakM6OldlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZP
YmpDKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDOjp+
V2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakMpOgorICAgICAgICAoV2ViQ29yZTo6V2ViQXVk
aW9Tb3VyY2VQcm92aWRlckFWRk9iakM6OnN0YXJ0UHJvZHVjaW5nRGF0YSk6CisgICAgICAgIChX
ZWJDb3JlOjpXZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQzo6c3RvcFByb2R1Y2luZ0RhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6V2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakM6OnByb3Zp
ZGVJbnB1dCk6CisgICAgICAgIChXZWJDb3JlOjpXZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2Jq
Qzo6c2V0Q2xpZW50KToKKyAgICAgICAgKFdlYkNvcmU6Om9wZXJhdG9yPT0pOgorICAgICAgICAo
V2ViQ29yZTo6b3BlcmF0b3IhPSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJBdWRpb1NvdXJjZVBy
b3ZpZGVyQVZGT2JqQzo6cHJlcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJBdWRpb1NvdXJj
ZVByb3ZpZGVyQVZGT2JqQzo6dW5wcmVwYXJlKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkF1ZGlv
U291cmNlUHJvdmlkZXJBVkZPYmpDOjpwcm9jZXNzKToKKwogMjAxNS0wOS0yMSAgVGltIEhvcnRv
biAgPHRpbW90aHlfaG9ydG9uQGFwcGxlLmNvbT4KIAogICAgICAgICBzdmcvY3VzdG9tL2hpZHBp
LW1hc2tpbmctY2xpcHBpbmcuc3ZnIGZhaWxzIHdpdGggYWNjZWxlcmF0ZWQgZHJhd2luZyBvbgpJ
bmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy9tZWRpYXN0cmVhbS9NZWRpYVN0cmVhbVRyYWNr
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL21lZGlhc3RyZWFtL01l
ZGlhU3RyZWFtVHJhY2suY3BwCShyZXZpc2lvbiAxOTAwNzIpCisrKyBTb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL21lZGlhc3RyZWFtL01lZGlhU3RyZWFtVHJhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMzUsNiArMjM1LDExIEBAIGJvb2wgTWVkaWFTdHJlYW1UcmFjazo6Y2FuU3VzcGVuZEZvclBh
Z2UKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK0F1ZGlvU291cmNlUHJvdmlkZXIqIE1lZGlhU3Ry
ZWFtVHJhY2s6OmF1ZGlvU291cmNlUHJvdmlkZXIoKQoreworICAgIHJldHVybiBtX3ByaXZhdGUt
PmF1ZGlvU291cmNlUHJvdmlkZXIoKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAj
ZW5kaWYgLy8gRU5BQkxFKE1FRElBX1NUUkVBTSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW1UcmFjay5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW1UcmFjay5oCShyZXZpc2lvbiAx
OTAwNzIpCisrKyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL21lZGlhc3RyZWFtL01lZGlhU3RyZWFt
VHJhY2suaAkod29ya2luZyBjb3B5KQpAQCAtODcsNiArODcsOCBAQCBwdWJsaWM6CiAgICAgUmVh
bHRpbWVNZWRpYVNvdXJjZSogc291cmNlKCkgY29uc3QgeyByZXR1cm4gbV9wcml2YXRlLT5zb3Vy
Y2UoKTsgfQogICAgIE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlJiBwcml2YXRlVHJhY2soKSB7IHJl
dHVybiBtX3ByaXZhdGUuZ2V0KCk7IH0KIAorICAgIEF1ZGlvU291cmNlUHJvdmlkZXIqIGF1ZGlv
U291cmNlUHJvdmlkZXIoKTsKKwogICAgIHZvaWQgYWRkT2JzZXJ2ZXIoT2JzZXJ2ZXIqKTsKICAg
ICB2b2lkIHJlbW92ZU9ic2VydmVyKE9ic2VydmVyKik7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvQ29udGV4dC5jcHAJKHJldmlzaW9uIDE4OTk4
MykKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Db250ZXh0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNDU1LDM0ICs0NTUsMzYgQEAgUGFzc1JlZlB0cjxNZWRpYUVsZW1l
bnRBdWRpb1NvdXJjZU5vZGU+IAogI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCiBQYXNzUmVmUHRy
PE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlPiBBdWRpb0NvbnRleHQ6OmNyZWF0ZU1lZGlhU3Ry
ZWFtU291cmNlKE1lZGlhU3RyZWFtKiBtZWRpYVN0cmVhbSwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7
CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKwogICAgIEFTU0VSVChtZWRpYVN0cmVhbSk7
CiAgICAgaWYgKCFtZWRpYVN0cmVhbSkgewogICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJS
OwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOwotICAgIGxhenlJbml0aWFsaXplKCk7Ci0KLSAgICBBdWRpb1NvdXJjZVByb3ZpZGVy
KiBwcm92aWRlciA9IG51bGxwdHI7Ci0KLSAgICBSZWZQdHI8TWVkaWFTdHJlYW1UcmFjaz4gYXVk
aW9UcmFjazsKKyAgICBNZWRpYVN0cmVhbVRyYWNrVmVjdG9yIGF1ZGlvVHJhY2tzID0gbWVkaWFT
dHJlYW0tPmdldEF1ZGlvVHJhY2tzKCk7CisgICAgaWYgKGF1ZGlvVHJhY2tzLmlzRW1wdHkoKSkg
eworICAgICAgICBlYyA9IElOVkFMSURfU1RBVEVfRVJSOworICAgICAgICByZXR1cm4gbnVsbHB0
cjsKKyAgICB9CiAKLSAgICAvLyBGSVhNRTogZ2V0IGEgcHJvdmlkZXIgZm9yIG5vbi1sb2NhbCBN
ZWRpYVN0cmVhbXMgKGxpa2UgZnJvbSBhIHJlbW90ZSBwZWVyKS4KLSAgICBmb3IgKGF1dG8mIHRy
YWNrIDogbWVkaWFTdHJlYW0tPmdldEF1ZGlvVHJhY2tzKCkpIHsKLSAgICAgICAgYXVkaW9UcmFj
ayA9IHRyYWNrOwotICAgICAgICBpZiAoYXVkaW9UcmFjay0+c291cmNlKCktPmlzQXVkaW9TdHJl
YW1Tb3VyY2UoKSkgewotICAgICAgICAgICAgYXV0byBzb3VyY2UgPSBzdGF0aWNfY2FzdDxNZWRp
YVN0cmVhbUF1ZGlvU291cmNlKj4oYXVkaW9UcmFjay0+c291cmNlKCkpOwotICAgICAgICAgICAg
QVNTRVJUKCFzb3VyY2UtPmRldmljZUlkKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGRlc3Rp
bmF0aW9uKCktPmVuYWJsZUlucHV0KHNvdXJjZS0+ZGV2aWNlSWQoKSk7Ci0gICAgICAgICAgICBw
cm92aWRlciA9IGRlc3RpbmF0aW9uKCktPmxvY2FsQXVkaW9JbnB1dFByb3ZpZGVyKCk7CisgICAg
TWVkaWFTdHJlYW1UcmFjayogcHJvdmlkZXJUcmFjayA9IG51bGxwdHI7CisgICAgZm9yIChhdXRv
JiB0cmFjayA6IGF1ZGlvVHJhY2tzKSB7CisgICAgICAgIGlmICh0cmFjay0+YXVkaW9Tb3VyY2VQ
cm92aWRlcigpKSB7CisgICAgICAgICAgICBwcm92aWRlclRyYWNrID0gdHJhY2suZ2V0KCk7CiAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIFJlZlB0cjxNZWRpYVN0
cmVhbUF1ZGlvU291cmNlTm9kZT4gbm9kZSA9IE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpj
cmVhdGUodGhpcywgbWVkaWFTdHJlYW0sIGF1ZGlvVHJhY2suZ2V0KCksIHByb3ZpZGVyKTsKKyAg
ICBpZiAoIXByb3ZpZGVyVHJhY2spIHsKKyAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsK
KyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgbGF6eUluaXRpYWxpemUoKTsK
IAotICAgIC8vIEZJWE1FOiBPbmx5IHN0ZXJlbyBzdHJlYW1zIGFyZSBzdXBwb3J0ZWQgcmlnaHQg
bm93LiBXZSBzaG91bGQgYmUgYWJsZSB0byBhY2NlcHQgbXVsdGktY2hhbm5lbCBzdHJlYW1zLgor
ICAgIFJlZlB0cjxNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZT4gbm9kZSA9IE1lZGlhU3RyZWFt
QXVkaW9Tb3VyY2VOb2RlOjpjcmVhdGUoKnRoaXMsICptZWRpYVN0cmVhbSwgKnByb3ZpZGVyVHJh
Y2spOwogICAgIG5vZGUtPnNldEZvcm1hdCgyLCBzYW1wbGVSYXRlKCkpOwogCiAgICAgcmVmTm9k
ZShub2RlLmdldCgpKTsgLy8gY29udGV4dCBrZWVwcyByZWZlcmVuY2UgdW50aWwgbm9kZSBpcyBk
aXNjb25uZWN0ZWQKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9E
ZXN0aW5hdGlvbk5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViYXVkaW8vQXVkaW9EZXN0aW5hdGlvbk5vZGUuY3BwCShyZXZpc2lvbiAxODk5ODMpCisrKyBT
b3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvRGVzdGluYXRpb25Ob2RlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTMsNyArNTMsNyBAQCBBdWRpb0Rlc3RpbmF0aW9uTm9kZTo6fkF1
ZGlvRGVzdGluYXRpb25OCiAgICAgdW5pbml0aWFsaXplKCk7CiB9CiAKLXZvaWQgQXVkaW9EZXN0
aW5hdGlvbk5vZGU6OnJlbmRlcihBdWRpb0J1cyogc291cmNlQnVzLCBBdWRpb0J1cyogZGVzdGlu
YXRpb25CdXMsIHNpemVfdCBudW1iZXJPZkZyYW1lcykKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbk5v
ZGU6OnJlbmRlcihBdWRpb0J1cyosIEF1ZGlvQnVzKiBkZXN0aW5hdGlvbkJ1cywgc2l6ZV90IG51
bWJlck9mRnJhbWVzKQogewogICAgIC8vIFdlIGRvbid0IHdhbnQgZGVub3JtYWxzIHNsb3dpbmcg
ZG93biBhbnkgb2YgdGhlIGF1ZGlvIHByb2Nlc3NpbmcKICAgICAvLyBzaW5jZSB0aGV5IGNhbiB2
ZXJ5IHNlcmlvdXNseSBodXJ0IHBlcmZvcm1hbmNlLgpAQCAtNzEsMTAgKzcxLDYgQEAgdm9pZCBB
dWRpb0Rlc3RpbmF0aW9uTm9kZTo6cmVuZGVyKEF1ZGlvQgogICAgIC8vIExldCB0aGUgY29udGV4
dCB0YWtlIGNhcmUgb2YgYW55IGJ1c2luZXNzIGF0IHRoZSBzdGFydCBvZiBlYWNoIHJlbmRlciBx
dWFudHVtLgogICAgIGNvbnRleHQoKS0+aGFuZGxlUHJlUmVuZGVyVGFza3MoKTsKIAotICAgIC8v
IFByZXBhcmUgdGhlIGxvY2FsIGF1ZGlvIGlucHV0IHByb3ZpZGVyIGZvciB0aGlzIHJlbmRlciBx
dWFudHVtLgotICAgIGlmIChzb3VyY2VCdXMpCi0gICAgICAgIG1fbG9jYWxBdWRpb0lucHV0UHJv
dmlkZXIuc2V0KHNvdXJjZUJ1cyk7Ci0KICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgdGhlIG5vZGUo
cykgY29ubmVjdGVkIHRvIHVzIHRvIHByb2Nlc3MsIHdoaWNoIGluIHR1cm4gd2lsbCBwdWxsIG9u
IHRoZWlyIGlucHV0KHMpLAogICAgIC8vIGFsbCB0aGUgd2F5IGJhY2t3YXJkcyB0aHJvdWdoIHRo
ZSByZW5kZXJpbmcgZ3JhcGguCiAgICAgQXVkaW9CdXMqIHJlbmRlcmVkQnVzID0gaW5wdXQoMCkt
PnB1bGwoZGVzdGluYXRpb25CdXMsIG51bWJlck9mRnJhbWVzKTsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9EZXN0aW5hdGlvbk5vZGUuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvRGVzdGluYXRpb25Ob2RlLmgJ
KHJldmlzaW9uIDE4OTk4MykKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVk
aW9EZXN0aW5hdGlvbk5vZGUuaAkod29ya2luZyBjb3B5KQpAQCAtNjIsNDIgKzYyLDEyIEBAIHB1
YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgc3VzcGVuZChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4pIHsg
fQogICAgIHZpcnR1YWwgdm9pZCBjbG9zZShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4pIHsgfQogCi0g
ICAgQXVkaW9Tb3VyY2VQcm92aWRlciogbG9jYWxBdWRpb0lucHV0UHJvdmlkZXIoKSB7IHJldHVy
biAmbV9sb2NhbEF1ZGlvSW5wdXRQcm92aWRlcjsgfQotCiAgICAgdmlydHVhbCBib29sIGlzUGxh
eWluZygpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCB2b2lkIGlzUGxheWluZ0RpZENo
YW5nZSgpIG92ZXJyaWRlOwogICAgIGJvb2wgaXNQbGF5aW5nQXVkaW8oKSBjb25zdCB7IHJldHVy
biBtX2lzRWZmZWN0aXZlbHlQbGF5aW5nQXVkaW87IH0KICAgICB2b2lkIHNldE11dGVkKGJvb2wg
bXV0ZWQpIHsgbV9tdXRlZCA9IG11dGVkOyB9CiAKIHByb3RlY3RlZDoKLSAgICAvLyBMb2NhbEF1
ZGlvSW5wdXRQcm92aWRlciBhbGxvd3MgdXMgdG8gZXhwb3NlIGFuIEF1ZGlvU291cmNlUHJvdmlk
ZXIgZm9yIGxvY2FsL2xpdmUgYXVkaW8gaW5wdXQuCi0gICAgLy8gSWYgdGhlcmUgaXMgbG9jYWwv
bGl2ZSBhdWRpbyBpbnB1dCwgd2UgY2FsbCBzZXQoKSB3aXRoIHRoZSBhdWRpbyBpbnB1dCBkYXRh
IGV2ZXJ5IHJlbmRlciBxdWFudHVtLgotICAgIGNsYXNzIExvY2FsQXVkaW9JbnB1dFByb3ZpZGVy
IDogcHVibGljIEF1ZGlvU291cmNlUHJvdmlkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9j
YWxBdWRpb0lucHV0UHJvdmlkZXIoKQotICAgICAgICAgICAgOiBtX3NvdXJjZUJ1cyhBdWRpb0J1
czo6Y3JlYXRlKDIsIEF1ZGlvTm9kZTo6UHJvY2Vzc2luZ1NpemVJbkZyYW1lcykpIC8vIEZJWE1F
OiBoYW5kbGUgbm9uLXN0ZXJlbyBsb2NhbCBpbnB1dC4KLSAgICAgICAgewotICAgICAgICB9Ci0K
LSAgICAgICAgdm9pZCBzZXQoQXVkaW9CdXMqIGJ1cykKLSAgICAgICAgewotICAgICAgICAgICAg
aWYgKGJ1cykKLSAgICAgICAgICAgICAgICBtX3NvdXJjZUJ1cy0+Y29weUZyb20oKmJ1cyk7Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBBdWRpb1NvdXJjZVByb3ZpZGVyLgotICAgICAgICB2aXJ0
dWFsIHZvaWQgcHJvdmlkZUlucHV0KEF1ZGlvQnVzKiBkZXN0aW5hdGlvbkJ1cywgc2l6ZV90IG51
bWJlck9mRnJhbWVzKSBvdmVycmlkZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sIGlzR29v
ZCA9IGRlc3RpbmF0aW9uQnVzICYmIGRlc3RpbmF0aW9uQnVzLT5sZW5ndGgoKSA9PSBudW1iZXJP
ZkZyYW1lcyAmJiBtX3NvdXJjZUJ1cy0+bGVuZ3RoKCkgPT0gbnVtYmVyT2ZGcmFtZXM7Ci0gICAg
ICAgICAgICBBU1NFUlQoaXNHb29kKTsKLSAgICAgICAgICAgIGlmIChpc0dvb2QpCi0gICAgICAg
ICAgICAgICAgZGVzdGluYXRpb25CdXMtPmNvcHlGcm9tKCptX3NvdXJjZUJ1cyk7Ci0gICAgICAg
IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFJlZlB0cjxBdWRpb0J1cz4gbV9zb3VyY2VCdXM7
Ci0gICAgfTsKLQogICAgIHZpcnR1YWwgZG91YmxlIHRhaWxUaW1lKCkgY29uc3Qgb3ZlcnJpZGUg
eyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgZG91YmxlIGxhdGVuY3lUaW1lKCkgY29uc3Qgb3Zl
cnJpZGUgeyByZXR1cm4gMDsgfQogCkBAIC0xMDcsNyArNzcsNiBAQCBwcm90ZWN0ZWQ6CiAgICAg
Ly8gQ291bnRzIHRoZSBudW1iZXIgb2Ygc2FtcGxlLWZyYW1lcyBwcm9jZXNzZWQgYnkgdGhlIGRl
c3RpbmF0aW9uLgogICAgIHNpemVfdCBtX2N1cnJlbnRTYW1wbGVGcmFtZTsKIAotICAgIExvY2Fs
QXVkaW9JbnB1dFByb3ZpZGVyIG1fbG9jYWxBdWRpb0lucHV0UHJvdmlkZXI7CiAgICAgYm9vbCBt
X2lzU2lsZW50OwogICAgIGJvb2wgbV9pc0VmZmVjdGl2ZWx5UGxheWluZ0F1ZGlvOwogICAgIGJv
b2wgbV9tdXRlZDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFT
dHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlLmNwcAko
cmV2aXNpb24gMTg5OTgzKQorKysgU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRp
YVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAsNiAr
NTAsNyBAQCBNZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlOjpNZWRpYVN0CiAKICAgICBt
X3NvdXJjZSA9IE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2U6OmNyZWF0ZSgpOwogICAgIFZlY3RvcjxS
ZWZQdHI8UmVhbHRpbWVNZWRpYVNvdXJjZT4+IGF1ZGlvU291cmNlczsKKyAgICBhdWRpb1NvdXJj
ZXMucmVzZXJ2ZUNhcGFjaXR5KDEpOwogICAgIGF1ZGlvU291cmNlcy5hcHBlbmQobV9zb3VyY2Up
OwogICAgIG1fc3RyZWFtID0gTWVkaWFTdHJlYW06OmNyZWF0ZSgqY29udGV4dC0+c2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCgpLCBNZWRpYVN0cmVhbVByaXZhdGU6OmNyZWF0ZShhdWRpb1NvdXJjZXMs
IFZlY3RvcjxSZWZQdHI8UmVhbHRpbWVNZWRpYVNvdXJjZT4+KCkpKTsKIApJbmRleDogU291cmNl
L1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1ZGlvU291cmNlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL01lZGlhU3RyZWFtQXVk
aW9Tb3VyY2UuY3BwCShyZXZpc2lvbiAxODk5ODMpCisrKyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL01lZGlhU3RyZWFtQXVkaW9Tb3VyY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
NCwxMSArMjQsMTEgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTWVk
aWFTdHJlYW1BdWRpb1NvdXJjZS5oIgogCiAjaWYgRU5BQkxFKE1FRElBX1NUUkVBTSkKIAotI2lu
Y2x1ZGUgIk1lZGlhU3RyZWFtQXVkaW9Tb3VyY2UuaCIKLQorI2luY2x1ZGUgIkF1ZGlvU291cmNl
UHJvdmlkZXIuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlVVSUQu
aCIKIApAQCAtNTgsNyArNTgsMTMgQEAgY29uc3QgUmVhbHRpbWVNZWRpYVNvdXJjZVN0YXRlcyYg
TWVkaWFTdAogICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
MjI0MzAKICAgICBub3RJbXBsZW1lbnRlZCgpOwogICAgIHJldHVybiBtX2N1cnJlbnRTdGF0ZXM7
Ci0gICAgCit9CisKK0F1ZGlvU291cmNlUHJvdmlkZXIqIE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2U6
OmF1ZGlvU291cmNlUHJvdmlkZXIoKQoreworICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgdGhpcy4K
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBudWxscHRyOwogfQogCiB2b2lkIE1l
ZGlhU3RyZWFtQXVkaW9Tb3VyY2U6OmFkZEF1ZGlvQ29uc3VtZXIoUGFzc1JlZlB0cjxBdWRpb0Rl
c3RpbmF0aW9uQ29uc3VtZXI+IGNvbnN1bWVyKQpJbmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1ZGlvU291cmNlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1ZGlvU291cmNlLmgJKHJldmlz
aW9uIDE4OTk4MykKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFTdHJl
YW1BdWRpb1NvdXJjZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00NywxMCArNDcsOCBAQCBwdWJsaWM6
CiAKICAgICB+TWVkaWFTdHJlYW1BdWRpb1NvdXJjZSgpIHsgfQogCi0gICAgdmlydHVhbCBib29s
IHVzZUlERm9yVHJhY2tJRCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwg
UmVmUHRyPFJlYWx0aW1lTWVkaWFTb3VyY2VDYXBhYmlsaXRpZXM+IGNhcGFiaWxpdGllcygpIGNv
bnN0OwotICAgIHZpcnR1YWwgY29uc3QgUmVhbHRpbWVNZWRpYVNvdXJjZVN0YXRlcyYgc3RhdGVz
KCk7CisgICAgUmVmUHRyPFJlYWx0aW1lTWVkaWFTb3VyY2VDYXBhYmlsaXRpZXM+IGNhcGFiaWxp
dGllcygpIGNvbnN0IG92ZXJyaWRlOworICAgIGNvbnN0IFJlYWx0aW1lTWVkaWFTb3VyY2VTdGF0
ZXMmIHN0YXRlcygpIG92ZXJyaWRlOwogICAgIAogICAgIGNvbnN0IFN0cmluZyYgZGV2aWNlSWQo
KSBjb25zdCB7IHJldHVybiBtX2RldmljZUlkOyB9CiAgICAgdm9pZCBzZXREZXZpY2VJZChjb25z
dCBTdHJpbmcmIGRldmljZUlkKSB7IG1fZGV2aWNlSWQgPSBkZXZpY2VJZDsgfQpAQCAtNjUsNiAr
NjMsOCBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2UoKTsK
IAorICAgIEF1ZGlvU291cmNlUHJvdmlkZXIqIGF1ZGlvU291cmNlUHJvdmlkZXIoKSBvdmVycmlk
ZTsKKwogICAgIFN0cmluZyBtX2RldmljZUlkOwogICAgIExvY2sgbV9hdWRpb0NvbnN1bWVyc0xv
Y2s7CiAgICAgVmVjdG9yPFJlZlB0cjxBdWRpb0Rlc3RpbmF0aW9uQ29uc3VtZXI+PiBtX2F1ZGlv
Q29uc3VtZXJzOwpJbmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYVN0
cmVhbUF1ZGlvU291cmNlTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvTW9k
dWxlcy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jcHAJKHJldmlzaW9uIDE4
OTk4MykKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFTdHJlYW1BdWRp
b1NvdXJjZU5vZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSwxOCArMzUsMjEgQEAKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi1SZWY8TWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGU+IE1lZGlh
U3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpjcmVhdGUoQXVkaW9Db250ZXh0KiBjb250ZXh0LCBNZWRp
YVN0cmVhbSogbWVkaWFTdHJlYW0sIE1lZGlhU3RyZWFtVHJhY2sqIGF1ZGlvVHJhY2ssIEF1ZGlv
U291cmNlUHJvdmlkZXIqIGF1ZGlvU291cmNlUHJvdmlkZXIpCitSZWY8TWVkaWFTdHJlYW1BdWRp
b1NvdXJjZU5vZGU+IE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpjcmVhdGUoQXVkaW9Db250
ZXh0JiBjb250ZXh0LCBNZWRpYVN0cmVhbSYgbWVkaWFTdHJlYW0sIE1lZGlhU3RyZWFtVHJhY2sm
IGF1ZGlvVHJhY2spCiB7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgTWVkaWFTdHJlYW1BdWRp
b1NvdXJjZU5vZGUoY29udGV4dCwgbWVkaWFTdHJlYW0sIGF1ZGlvVHJhY2ssIGF1ZGlvU291cmNl
UHJvdmlkZXIpKTsKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBNZWRpYVN0cmVhbUF1ZGlvU291
cmNlTm9kZShjb250ZXh0LCBtZWRpYVN0cmVhbSwgYXVkaW9UcmFjaykpOwogfQogCi1NZWRpYVN0
cmVhbUF1ZGlvU291cmNlTm9kZTo6TWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGUoQXVkaW9Db250
ZXh0KiBjb250ZXh0LCBNZWRpYVN0cmVhbSogbWVkaWFTdHJlYW0sIE1lZGlhU3RyZWFtVHJhY2sq
IGF1ZGlvVHJhY2ssIEF1ZGlvU291cmNlUHJvdmlkZXIqIGF1ZGlvU291cmNlUHJvdmlkZXIpCi0g
ICAgOiBBdWRpb05vZGUoY29udGV4dCwgY29udGV4dC0+c2FtcGxlUmF0ZSgpKQotICAgICwgbV9t
ZWRpYVN0cmVhbShtZWRpYVN0cmVhbSkKLSAgICAsIG1fYXVkaW9UcmFjayhhdWRpb1RyYWNrKQot
ICAgICwgbV9hdWRpb1NvdXJjZVByb3ZpZGVyKGF1ZGlvU291cmNlUHJvdmlkZXIpCi0gICAgLCBt
X3NvdXJjZU51bWJlck9mQ2hhbm5lbHMoMCkKK01lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpN
ZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZShBdWRpb0NvbnRleHQmIGNvbnRleHQsIE1lZGlhU3Ry
ZWFtJiBtZWRpYVN0cmVhbSwgTWVkaWFTdHJlYW1UcmFjayYgYXVkaW9UcmFjaykKKyAgICA6IEF1
ZGlvTm9kZSgmY29udGV4dCwgY29udGV4dC5zYW1wbGVSYXRlKCkpCisgICAgLCBtX21lZGlhU3Ry
ZWFtKCZtZWRpYVN0cmVhbSkKKyAgICAsIG1fYXVkaW9UcmFjaygmYXVkaW9UcmFjaykKIHsKKyAg
ICBBdWRpb1NvdXJjZVByb3ZpZGVyKiBhdWRpb1NvdXJjZVByb3ZpZGVyID0gbV9hdWRpb1RyYWNr
LT5hdWRpb1NvdXJjZVByb3ZpZGVyKCk7CisgICAgQVNTRVJUKGF1ZGlvU291cmNlUHJvdmlkZXIp
OworCisgICAgYXVkaW9Tb3VyY2VQcm92aWRlci0+c2V0Q2xpZW50KHRoaXMpOworICAgIAogICAg
IC8vIERlZmF1bHQgdG8gc3RlcmVvLiBUaGlzIGNvdWxkIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhl
IGZvcm1hdCBvZiB0aGUgTWVkaWFTdHJlYW0ncyBhdWRpbyB0cmFjay4KICAgICBhZGRPdXRwdXQo
c3RkOjptYWtlX3VuaXF1ZTxBdWRpb05vZGVPdXRwdXQ+KHRoaXMsIDIpKTsKIApAQCAtNTcsNiAr
NjAsOSBAQCBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZTo6TWVkaWFTdHJlYW1BCiAKIE1lZGlh
U3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjp+TWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGUoKQogewor
ICAgIEF1ZGlvU291cmNlUHJvdmlkZXIqIGF1ZGlvU291cmNlUHJvdmlkZXIgPSBtX2F1ZGlvVHJh
Y2stPmF1ZGlvU291cmNlUHJvdmlkZXIoKTsKKyAgICBpZiAoYXVkaW9Tb3VyY2VQcm92aWRlcikK
KyAgICAgICAgYXVkaW9Tb3VyY2VQcm92aWRlci0+c2V0Q2xpZW50KG51bGxwdHIpOwogICAgIHVu
aW5pdGlhbGl6ZSgpOwogfQogCkBAIC03NSw2ICs4MSwxNSBAQCB2b2lkIE1lZGlhU3RyZWFtQXVk
aW9Tb3VyY2VOb2RlOjpzZXRGb3JtCiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxMb2NrPiBsb2Nr
KG1fcHJvY2Vzc011dGV4KTsKIAogICAgICAgICBtX3NvdXJjZU51bWJlck9mQ2hhbm5lbHMgPSBu
dW1iZXJPZkNoYW5uZWxzOworICAgICAgICBtX3NvdXJjZVNhbXBsZVJhdGUgPSBzb3VyY2VTYW1w
bGVSYXRlOworCisgICAgICAgIGlmIChzb3VyY2VTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUoKSkg
eworICAgICAgICAgICAgZG91YmxlIHNjYWxlRmFjdG9yID0gc291cmNlU2FtcGxlUmF0ZSAvIHNh
bXBsZVJhdGUoKTsKKyAgICAgICAgICAgIG1fbXVsdGlDaGFubmVsUmVzYW1wbGVyID0gc3RkOjpt
YWtlX3VuaXF1ZTxNdWx0aUNoYW5uZWxSZXNhbXBsZXI+KHNjYWxlRmFjdG9yLCBudW1iZXJPZkNo
YW5uZWxzKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX211bHRpQ2hhbm5lbFJlc2Ft
cGxlciA9IG51bGxwdHI7CisKKyAgICAgICAgbV9zb3VyY2VOdW1iZXJPZkNoYW5uZWxzID0gbnVt
YmVyT2ZDaGFubmVsczsKIAogICAgICAgICB7CiAgICAgICAgICAgICAvLyBUaGUgY29udGV4dCBt
dXN0IGJlIGxvY2tlZCB3aGVuIGNoYW5naW5nIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxz
LgpAQCAtODksMTMgKzEwNCw5IEBAIHZvaWQgTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGU6OnNl
dEZvcm0KIHZvaWQgTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGU6OnByb2Nlc3Moc2l6ZV90IG51
bWJlck9mRnJhbWVzKQogewogICAgIEF1ZGlvQnVzKiBvdXRwdXRCdXMgPSBvdXRwdXQoMCktPmJ1
cygpOworICAgIEF1ZGlvU291cmNlUHJvdmlkZXIqIHByb3ZpZGVyID0gbV9hdWRpb1RyYWNrLT5h
dWRpb1NvdXJjZVByb3ZpZGVyKCk7CiAKLSAgICBpZiAoIWF1ZGlvU291cmNlUHJvdmlkZXIoKSkg
ewotICAgICAgICBvdXRwdXRCdXMtPnplcm8oKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGlmICghbWVkaWFTdHJlYW0oKSB8fCBtX3NvdXJjZU51bWJlck9mQ2hhbm5lbHMgIT0gb3V0
cHV0QnVzLT5udW1iZXJPZkNoYW5uZWxzKCkpIHsKKyAgICBpZiAoIW1lZGlhU3RyZWFtKCkgfHwg
IW1fc291cmNlTnVtYmVyT2ZDaGFubmVscyB8fCAhbV9zb3VyY2VTYW1wbGVSYXRlIHx8ICFwcm92
aWRlcikgewogICAgICAgICBvdXRwdXRCdXMtPnplcm8oKTsKICAgICAgICAgcmV0dXJuOwogICAg
IH0KQEAgLTExMCwxMSArMTIxLDE0IEBAIHZvaWQgTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGU6
OnByb2Nlc3MKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1ZGlvU291cmNlUHJvdmlk
ZXIoKS0+cHJvdmlkZUlucHV0KG91dHB1dEJ1cywgbnVtYmVyT2ZGcmFtZXMpOwotfQotCi12b2lk
IE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpyZXNldCgpCi17CisgICAgaWYgKG1fbXVsdGlD
aGFubmVsUmVzYW1wbGVyLmdldCgpKSB7CisgICAgICAgIEFTU0VSVChtX3NvdXJjZVNhbXBsZVJh
dGUgIT0gc2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgbV9tdWx0aUNoYW5uZWxSZXNhbXBsZXItPnBy
b2Nlc3MocHJvdmlkZXIsIG91dHB1dEJ1cywgbnVtYmVyT2ZGcmFtZXMpOworICAgIH0gZWxzZSB7
CisgICAgICAgIC8vIEJ5cGFzcyB0aGUgcmVzYW1wbGVyIGNvbXBsZXRlbHkgaWYgdGhlIHNvdXJj
ZSBpcyBhdCB0aGUgY29udGV4dCdzIHNhbXBsZS1yYXRlLgorICAgICAgICBBU1NFUlQobV9zb3Vy
Y2VTYW1wbGVSYXRlID09IHNhbXBsZVJhdGUoKSk7CisgICAgICAgIHByb3ZpZGVyLT5wcm92aWRl
SW5wdXQob3V0cHV0QnVzLCBudW1iZXJPZkZyYW1lcyk7CisgICAgfQogfQogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL01lZGlh
U3RyZWFtQXVkaW9Tb3VyY2VOb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvTW9k
dWxlcy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5oCShyZXZpc2lvbiAxODk5
ODMpCisrKyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL01lZGlhU3RyZWFtQXVkaW9T
b3VyY2VOb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxLDMyICszMSwzMiBAQAogI2luY2x1ZGUg
IkF1ZGlvU291cmNlUHJvdmlkZXIuaCIKICNpbmNsdWRlICJBdWRpb1NvdXJjZVByb3ZpZGVyQ2xp
ZW50LmgiCiAjaW5jbHVkZSAiTWVkaWFTdHJlYW0uaCIKKyNpbmNsdWRlICJNdWx0aUNoYW5uZWxS
ZXNhbXBsZXIuaCIKICNpbmNsdWRlIDx3dGYvTG9jay5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzUmVm
UHRyLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgQXVkaW9Db250ZXh0OworY2xh
c3MgTXVsdGlDaGFubmVsUmVzYW1wbGVyOwogCiBjbGFzcyBNZWRpYVN0cmVhbUF1ZGlvU291cmNl
Tm9kZSA6IHB1YmxpYyBBdWRpb05vZGUsIHB1YmxpYyBBdWRpb1NvdXJjZVByb3ZpZGVyQ2xpZW50
IHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlPiBj
cmVhdGUoQXVkaW9Db250ZXh0KiwgTWVkaWFTdHJlYW0qLCBNZWRpYVN0cmVhbVRyYWNrKiwgQXVk
aW9Tb3VyY2VQcm92aWRlciopOworICAgIHN0YXRpYyBSZWY8TWVkaWFTdHJlYW1BdWRpb1NvdXJj
ZU5vZGU+IGNyZWF0ZShBdWRpb0NvbnRleHQmLCBNZWRpYVN0cmVhbSYsIE1lZGlhU3RyZWFtVHJh
Y2smKTsKIAogICAgIHZpcnR1YWwgfk1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlKCk7CiAKICAg
ICBNZWRpYVN0cmVhbSogbWVkaWFTdHJlYW0oKSB7IHJldHVybiBtX21lZGlhU3RyZWFtLmdldCgp
OyB9CiAKICAgICAvLyBBdWRpb05vZGUKLSAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzaXplX3Qg
ZnJhbWVzVG9Qcm9jZXNzKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSBvdmVy
cmlkZTsKKyAgICB2b2lkIHByb2Nlc3Moc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcykgb3ZlcnJpZGU7
CisgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsgfTsKIAogICAgIC8vIEF1ZGlvU291cmNlUHJv
dmlkZXJDbGllbnQKICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9ybWF0KHNpemVfdCBudW1iZXJPZkNo
YW5uZWxzLCBmbG9hdCBzYW1wbGVSYXRlKSBvdmVycmlkZTsKIAotICAgIEF1ZGlvU291cmNlUHJv
dmlkZXIqIGF1ZGlvU291cmNlUHJvdmlkZXIoKSBjb25zdCB7IHJldHVybiBtX2F1ZGlvU291cmNl
UHJvdmlkZXI7IH0KLQogcHJpdmF0ZToKLSAgICBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZShB
dWRpb0NvbnRleHQqLCBNZWRpYVN0cmVhbSosIE1lZGlhU3RyZWFtVHJhY2sqLCBBdWRpb1NvdXJj
ZVByb3ZpZGVyKik7CisgICAgTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGUoQXVkaW9Db250ZXh0
JiwgTWVkaWFTdHJlYW0mLCBNZWRpYVN0cmVhbVRyYWNrJik7CiAKICAgICB2aXJ0dWFsIGRvdWJs
ZSB0YWlsVGltZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIGRv
dWJsZSBsYXRlbmN5VGltZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KQEAgLTY2LDEx
ICs2NiwxMiBAQCBwcml2YXRlOgogCiAgICAgUmVmUHRyPE1lZGlhU3RyZWFtPiBtX21lZGlhU3Ry
ZWFtOwogICAgIFJlZlB0cjxNZWRpYVN0cmVhbVRyYWNrPiBtX2F1ZGlvVHJhY2s7Ci0gICAgQXVk
aW9Tb3VyY2VQcm92aWRlciogbV9hdWRpb1NvdXJjZVByb3ZpZGVyOworICAgIHN0ZDo6dW5pcXVl
X3B0cjxNdWx0aUNoYW5uZWxSZXNhbXBsZXI+IG1fbXVsdGlDaGFubmVsUmVzYW1wbGVyOwogCiAg
ICAgTG9jayBtX3Byb2Nlc3NNdXRleDsKIAotICAgIHVuc2lnbmVkIG1fc291cmNlTnVtYmVyT2ZD
aGFubmVsczsKKyAgICB1bnNpZ25lZCBtX3NvdXJjZU51bWJlck9mQ2hhbm5lbHMgeyAwIH07Cisg
ICAgZG91YmxlIG1fc291cmNlU2FtcGxlUmF0ZSB7IDAgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDE4OTk4MykKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMzQwLDYgKzM0
MCw4IEBACiAJCTA3Q0ExMjBFMTgyRDY3RDgwMEQxMjE5NyAvKiBKU1JUQ1BlZXJDb25uZWN0aW9u
Q3VzdG9tLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDA3Q0ExMjBEMTgyRDY3RDgwMEQxMjE5NyAvKiBKU1JUQ1BlZXJDb25uZWN0aW9uQ3VzdG9tLmNw
cCAqLzsgfTsKIAkJMDdDRTc3RDUxNjcxMkE2QTAwQzU1QTQ3IC8qIEluYmFuZFRleHRUcmFja1By
aXZhdGVDbGllbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDA3Q0U3N0Q0MTY3MTJBNkEwMEM1NUE0NyAvKiBJbmJhbmRUZXh0VHJhY2tQcml2YXRlQ2xp
ZW50LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJ
MDdEMDdCMTQxODM0MTU4ODAwQUJERDNDIC8qIEpTUlRDU2Vzc2lvbkRlc2NyaXB0aW9uQ3VzdG9t
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA3RDA3
QjEzMTgzNDE1ODgwMEFCREQzQyAvKiBKU1JUQ1Nlc3Npb25EZXNjcmlwdGlvbkN1c3RvbS5jcHAg
Ki87IH07CisJCTA3RDYzNzQwMUJCMEIxMTMwMDI1NkNFOSAvKiBXZWJBdWRpb1NvdXJjZVByb3Zp
ZGVyQVZGT2JqQy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMDdENjM3M0UxQkIwQjExMzAwMjU2Q0U5IC8qIFdlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZP
YmpDLmggKi87IH07CisJCTA3RDYzNzQxMUJCMEIxMTMwMDI1NkNFOSAvKiBXZWJBdWRpb1NvdXJj
ZVByb3ZpZGVyQVZGT2JqQy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDA3RDYzNzNGMUJCMEIxMTMwMDI1NkNFOSAvKiBXZWJBdWRpb1NvdXJjZVByb3Zp
ZGVyQVZGT2JqQy5tbSAqLzsgfTsKIAkJMDdEQzVGRDQxN0QzRUVFOTAwOTlGODkwIC8qIEpTUlRD
U3RhdHNSZXNwb25zZUN1c3RvbS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwN0RDNUZEMzE3RDNFRUU5MDA5OUY4OTAgLyogSlNSVENTdGF0c1Jlc3Bv
bnNlQ3VzdG9tLmNwcCAqLzsgfTsKIAkJMDdFMTE2QjExNDg5QzlBMTAwRUM1QUNFIC8qIEpTVGV4
dFRyYWNrQ3VzdG9tLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDA3RTExNkIwMTQ4OUM5QTEwMEVDNUFDRSAvKiBKU1RleHRUcmFja0N1c3RvbS5jcHAg
Ki87IH07CiAJCTA3RTExNzA3MTQ4OUVCRUIwMEVDNUFDRSAvKiBKU1RleHRUcmFja0N1ZUN1c3Rv
bS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwN0Ux
MTcwNjE0ODlFQkVCMDBFQzVBQ0UgLyogSlNUZXh0VHJhY2tDdWVDdXN0b20uY3BwICovOyB9OwpA
QCAtNjY5MSw3ICs2NjkzLDcgQEAKIAkJRkQzMTYwODYxMkIwMjZGNzAwQzFBMzU5IC8qIEF1ZGlv
UmVzYW1wbGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBGRDMxNjA1MDEyQjAyNkY3MDBDMUEzNTkgLyogQXVkaW9SZXNhbXBsZXIuaCAqLzsgfTsKIAkJ
RkQzMTYwODcxMkIwMjZGNzAwQzFBMzU5IC8qIEF1ZGlvUmVzYW1wbGVyS2VybmVsLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZEMzE2MDUxMTJCMDI2
RjcwMEMxQTM1OSAvKiBBdWRpb1Jlc2FtcGxlcktlcm5lbC5jcHAgKi87IH07CiAJCUZEMzE2MDg4
MTJCMDI2RjcwMEMxQTM1OSAvKiBBdWRpb1Jlc2FtcGxlcktlcm5lbC5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkQzMTYwNTIxMkIwMjZGNzAwQzFBMzU5
IC8qIEF1ZGlvUmVzYW1wbGVyS2VybmVsLmggKi87IH07Ci0JCUZEMzE2MDg5MTJCMDI2RjcwMEMx
QTM1OSAvKiBBdWRpb1NvdXJjZVByb3ZpZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGRDMxNjA1MzEyQjAyNkY3MDBDMUEzNTkgLyogQXVkaW9Tb3Vy
Y2VQcm92aWRlci5oICovOyB9OworCQlGRDMxNjA4OTEyQjAyNkY3MDBDMUEzNTkgLyogQXVkaW9T
b3VyY2VQcm92aWRlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRkQzMTYwNTMxMkIwMjZGNzAwQzFBMzU5IC8qIEF1ZGlvU291cmNlUHJvdmlkZXIuaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlGRDMxNjA4
QTEyQjAyNkY3MDBDMUEzNTkgLyogQXVkaW9VdGlsaXRpZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkQzMTYwNTQxMkIwMjZGNzAwQzFBMzU5IC8q
IEF1ZGlvVXRpbGl0aWVzLmNwcCAqLzsgfTsKIAkJRkQzMTYwOEIxMkIwMjZGNzAwQzFBMzU5IC8q
IEF1ZGlvVXRpbGl0aWVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBGRDMxNjA1NTEyQjAyNkY3MDBDMUEzNTkgLyogQXVkaW9VdGlsaXRpZXMuaCAqLzsg
fTsKIAkJRkQzMTYwOEMxMkIwMjZGNzAwQzFBMzU5IC8qIEJpcXVhZC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRDMxNjA1NjEyQjAyNkY3MDBDMUEz
NTkgLyogQmlxdWFkLmNwcCAqLzsgfTsKQEAgLTc0ODksNiArNzQ5MSw4IEBACiAJCTA3Q0ExMjBE
MTgyRDY3RDgwMEQxMjE5NyAvKiBKU1JUQ1BlZXJDb25uZWN0aW9uQ3VzdG9tLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTUlRDUGVlckNvbm5lY3Rpb25DdXN0b20u
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwN0NFNzdENDE2NzEyQTZBMDBDNTVB
NDcgLyogSW5iYW5kVGV4dFRyYWNrUHJpdmF0ZUNsaWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBJbmJhbmRUZXh0VHJhY2tQcml2YXRlQ2xpZW50Lmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTA3RDA3QjEzMTgzNDE1ODgwMEFCREQzQyAvKiBKU1JUQ1Nlc3Np
b25EZXNjcmlwdGlvbkN1c3RvbS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBKU1JUQ1Nlc3Npb25EZXNjcmlwdGlvbkN1c3RvbS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCTA3RDYzNzNFMUJCMEIxMTMwMDI1NkNFOSAvKiBXZWJBdWRpb1NvdXJjZVBy
b3ZpZGVyQVZGT2JqQy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXZWJBdWRp
b1NvdXJjZVByb3ZpZGVyQVZGT2JqQy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkw
N0Q2MzczRjFCQjBCMTEzMDAyNTZDRTkgLyogV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakMu
bW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBXZWJBdWRpb1NvdXJj
ZVByb3ZpZGVyQVZGT2JqQy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDdEQzVG
RDMxN0QzRUVFOTAwOTlGODkwIC8qIEpTUlRDU3RhdHNSZXNwb25zZUN1c3RvbS5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1JUQ1N0YXRzUmVzcG9uc2VDdXN0b20u
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwN0UxMTZCMDE0ODlDOUExMDBFQzVB
Q0UgLyogSlNUZXh0VHJhY2tDdXN0b20uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gSlNUZXh0VHJhY2tDdXN0b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkwN0UxMTcwNjE0ODlFQkVCMDBFQzVBQ0UgLyogSlNUZXh0VHJhY2tDdWVDdXN0b20uY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNUZXh0VHJhY2tDdWVDdXN0
b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQ5OTUsNiArMTQ5OTksOCBA
QAogCQkJCTA3MDM2M0RGMTgxQTFDREMwMEMwNzRBNSAvKiBBVlZpZGVvQ2FwdHVyZVNvdXJjZS5t
bSAqLywKIAkJCQk0QTBGRkFBMzFBQUY1RUY2MDA2MjgwM0IgLyogUmVhbHRpbWVNZWRpYVNvdXJj
ZUNlbnRlck1hYy5jcHAgKi8sCiAJCQkJNEEwRkZBQTQxQUFGNUVGNjAwNjI4MDNCIC8qIFJlYWx0
aW1lTWVkaWFTb3VyY2VDZW50ZXJNYWMuaCAqLywKKwkJCQkwN0Q2MzczRTFCQjBCMTEzMDAyNTZD
RTkgLyogV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakMuaCAqLywKKwkJCQkwN0Q2MzczRjFC
QjBCMTEzMDAyNTZDRTkgLyogV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakMubW0gKi8sCiAJ
CQkpOwogCQkJcGF0aCA9IG1hYzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC0yNjU4
MCw2ICsyNjU4Niw3IEBACiAJCQkJQkM4NUYyM0QxNTE5MTVFMDAwQkMxN0JFIC8qIFJlbmRlck5h
bWVkRmxvd1RocmVhZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4ODAwOTdEOTMwMjAwOTRD
OUU0IC8qIFJlbmRlck9iamVjdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNGQTkzMDgxMDMzMzE5
MzAwN0IyNUQxIC8qIFJlbmRlck92ZXJmbG93LmggaW4gSGVhZGVycyAqLywKKwkJCQkwN0Q2Mzc0
MDFCQjBCMTEzMDAyNTZDRTkgLyogV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakMuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUE0M0JGNTlEMTE0OTI5MjgwMEM2NDNDQSAvKiBSZW5kZXJQcm9ncmVz
cy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQjVCNjU4NzQxODZGREU0QzAwOUMyNkU4IC8qIFJlbmRl
clB0ci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMzFCMzEzREYxQjY5ODhDNTAwRjJBQUJDIC8qIE5T
QnV0dG9uQ2VsbFNQSS5oIGluIEhlYWRlcnMgKi8sCkBAIC0zMDM3OSw2ICszMDM4Niw3IEBACiAJ
CQkJQUEyQTVBQ0QxNkE0ODVGQTAwOTc1QTI1IC8qIFNwZWVjaFN5bnRoZXNpc1ZvaWNlLmNwcCBp
biBTb3VyY2VzICovLAogCQkJCUE3OEZFMTNCMTIzNjZCMTAwMEFDRThEMCAvKiBTcGVsbENoZWNr
ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjhEQkRCNEQxMzBCMEY4QTAwRjVDREIxIC8qIFNw
ZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMDdENjM3NDEx
QkIwQjExMzAwMjU2Q0U5IC8qIFdlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDLm1tIGluIFNv
dXJjZXMgKi8sCiAJCQkJNTEwM0MyQjExQkEyMkQxQTAwRTI2MzM3IC8qIExlZ2FjeUFueS5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk0NTEyNTAyMjE1RENFMzdEMDAyRjg0RTIgLyogU3BpbkJ1dHRv
bkVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTMzMDlFMTEwOTlFNjQ5MjAwNTZFNTgx
IC8qIFNwbGl0RWxlbWVudENvbW1hbmQuY3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9NZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFT
dHJlYW1UcmFja1ByaXZhdGUuY3BwCShyZXZpc2lvbiAxOTAwNzIpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9NZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTE1MCw2ICsxNTAsMTEgQEAgdm9pZCBNZWRpYVN0cmVhbVRyYWNrUHJpdmF0
ZTo6YXBwbHlDb25zdAogICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0xMjI0MjgKIH0KIAorQXVkaW9Tb3VyY2VQcm92aWRlciogTWVkaWFTdHJlYW1UcmFja1By
aXZhdGU6OmF1ZGlvU291cmNlUHJvdmlkZXIoKQoreworICAgIHJldHVybiBtX3NvdXJjZS0+YXVk
aW9Tb3VyY2VQcm92aWRlcigpOworfQorCiB2b2lkIE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlOjpz
b3VyY2VTdG9wcGVkKCkKIHsKICAgICBpZiAobV9pc0VuZGVkKQpJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW1UcmFja1ByaXZhdGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9NZWRpYVN0cmVhbVRy
YWNrUHJpdmF0ZS5oCShyZXZpc2lvbiAxOTAwNzIpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9tZWRpYXN0cmVhbS9NZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC04OCw2ICs4OCw4IEBAIHB1YmxpYzoKICAgICBSZWZQdHI8TWVkaWFDb25zdHJhaW50cz4gY29u
c3RyYWludHMoKSBjb25zdDsKICAgICB2b2lkIGFwcGx5Q29uc3RyYWludHMoY29uc3QgTWVkaWFD
b25zdHJhaW50cyYpOwogCisgICAgQXVkaW9Tb3VyY2VQcm92aWRlciogYXVkaW9Tb3VyY2VQcm92
aWRlcigpOworCiBwcml2YXRlOgogICAgIGV4cGxpY2l0IE1lZGlhU3RyZWFtVHJhY2tQcml2YXRl
KGNvbnN0IE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlJik7CiAgICAgTWVkaWFTdHJlYW1UcmFja1By
aXZhdGUoUmVmUHRyPFJlYWx0aW1lTWVkaWFTb3VyY2U+JiYsIGNvbnN0IFN0cmluZyYgaWQpOwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUmVhbHRpbWVNZWRpYVNv
dXJjZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFt
L1JlYWx0aW1lTWVkaWFTb3VyY2UuaAkocmV2aXNpb24gMTkwMDcyKQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vUmVhbHRpbWVNZWRpYVNvdXJjZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zNiw2ICszNiw3IEBACiAKICNpZiBFTkFCTEUoTUVESUFfU1RSRUFNKQogCisjaW5j
bHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgogI2luY2x1ZGUgIk1lZGlhQ29uc3RyYWludHMu
aCIKICNpbmNsdWRlICJSZWFsdGltZU1lZGlhU291cmNlQ2FwYWJpbGl0aWVzLmgiCiAjaW5jbHVk
ZSA8d3RmL1JlZkNvdW50ZWQuaD4KQEAgLTEwNyw2ICsxMDgsOCBAQCBwdWJsaWM6CiAKICAgICB2
b2lkIHJlc2V0KCk7CiAKKyAgICB2aXJ0dWFsIEF1ZGlvU291cmNlUHJvdmlkZXIqIGF1ZGlvU291
cmNlUHJvdmlkZXIoKSB7IHJldHVybiBudWxscHRyOyB9CisgICAgCiBwcm90ZWN0ZWQ6CiAgICAg
UmVhbHRpbWVNZWRpYVNvdXJjZShjb25zdCBTdHJpbmcmIGlkLCBUeXBlLCBjb25zdCBTdHJpbmcm
IG5hbWUpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9tYWMv
QVZBdWRpb0NhcHR1cmVTb3VyY2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9tZWRpYXN0cmVhbS9tYWMvQVZBdWRpb0NhcHR1cmVTb3VyY2UuaAkocmV2aXNpb24gMTg5
OTgzKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vbWFjL0FWQXVkaW9D
YXB0dXJlU291cmNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDggQEAgdHlwZWRlZiBj
b25zdCBzdHJ1Y3Qgb3BhcXVlQ01Gb3JtYXREZXNjcgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
K2NsYXNzIFdlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDOworCiBjbGFzcyBBVkF1ZGlvQ2Fw
dHVyZVNvdXJjZSA6IHB1YmxpYyBBVk1lZGlhQ2FwdHVyZVNvdXJjZSB7CiBwdWJsaWM6CiAKQEAg
LTYxLDkgKzYzLDExIEBAIHByaXZhdGU6CiAgICAgCiAgICAgdm9pZCBzZXR1cENhcHR1cmVTZXNz
aW9uKCkgb3ZlcnJpZGU7CiAgICAgdm9pZCB1cGRhdGVTdGF0ZXMoKSBvdmVycmlkZTsKKyAgICBB
dWRpb1NvdXJjZVByb3ZpZGVyKiBhdWRpb1NvdXJjZVByb3ZpZGVyKCkgb3ZlcnJpZGU7CiAKICAg
ICBSZXRhaW5QdHI8QVZDYXB0dXJlQ29ubmVjdGlvbj4gbV9hdWRpb0Nvbm5lY3Rpb247CiAKKyAg
ICBSZWZQdHI8V2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakM+IG1fYXVkaW9Tb3VyY2VQcm92
aWRlcjsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uPiBt
X2lucHV0RGVzY3JpcHRpb247CiAgICAgVmVjdG9yPE9ic2VydmVyKj4gbV9vYnNlcnZlcnM7CiAg
ICAgTG9jayBtX2xvY2s7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVh
bS9tYWMvQVZBdWRpb0NhcHR1cmVTb3VyY2UubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vbWFjL0FWQXVkaW9DYXB0dXJlU291cmNlLm1tCShyZXZp
c2lvbiAxODk5ODMpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9tYWMv
QVZBdWRpb0NhcHR1cmVTb3VyY2UubW0JKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDcgQEAK
ICNpbXBvcnQgIk5vdEltcGxlbWVudGVkLmgiCiAjaW1wb3J0ICJSZWFsdGltZU1lZGlhU291cmNl
U3RhdGVzLmgiCiAjaW1wb3J0ICJTb2Z0TGlua2luZy5oIgorI2ltcG9ydCAiV2ViQXVkaW9Tb3Vy
Y2VQcm92aWRlckFWRk9iakMuaCIKICNpbXBvcnQgPEFWRm91bmRhdGlvbi9BVkZvdW5kYXRpb24u
aD4KICNpbXBvcnQgPENvcmVBdWRpby9Db3JlQXVkaW9UeXBlcy5oPgogI2ltcG9ydCA8d3RmL0hh
c2hTZXQuaD4KQEAgLTE2NCw2ICsxNjUsMTQgQEAgdm9pZCBBVkF1ZGlvQ2FwdHVyZVNvdXJjZTo6
Y2FwdHVyZU91dHB1dAogICAgICAgICBvYnNlcnZlci0+cHJvY2Vzcyhmb3JtYXREZXNjcmlwdGlv
biwgc2FtcGxlQnVmZmVyKTsKIH0KIAorQXVkaW9Tb3VyY2VQcm92aWRlciogQVZBdWRpb0NhcHR1
cmVTb3VyY2U6OmF1ZGlvU291cmNlUHJvdmlkZXIoKQoreworICAgIGlmICghbV9hdWRpb1NvdXJj
ZVByb3ZpZGVyKQorICAgICAgICBtX2F1ZGlvU291cmNlUHJvdmlkZXIgPSBXZWJBdWRpb1NvdXJj
ZVByb3ZpZGVyQVZGT2JqQzo6Y3JlYXRlKCp0aGlzKTsKKworICAgIHJldHVybiBtX2F1ZGlvU291
cmNlUHJvdmlkZXIuZ2V0KCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlm
IC8vIEVOQUJMRShNRURJQV9TVFJFQU0pCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
ZWRpYXN0cmVhbS9tYWMvQVZNZWRpYUNhcHR1cmVTb3VyY2UuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9tYWMvQVZNZWRpYUNhcHR1cmVTb3VyY2Uu
aAkocmV2aXNpb24gMTg5OTgzKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJl
YW0vbWFjL0FWTWVkaWFDYXB0dXJlU291cmNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTYzLDYgKzYz
LDcgQEAgcHJvdGVjdGVkOgogICAgIEFWTWVkaWFDYXB0dXJlU291cmNlKEFWQ2FwdHVyZURldmlj
ZSosIGNvbnN0IEF0b21pY1N0cmluZyYsIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGUsIFBhc3NS
ZWZQdHI8TWVkaWFDb25zdHJhaW50cz4pOwogCiAgICAgY29uc3QgUmVhbHRpbWVNZWRpYVNvdXJj
ZVN0YXRlcyYgc3RhdGVzKCkgb3ZlcnJpZGU7CisgICAgQXVkaW9Tb3VyY2VQcm92aWRlciogYXVk
aW9Tb3VyY2VQcm92aWRlcigpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB2b2lkIHNldHVwQ2Fw
dHVyZVNlc3Npb24oKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0YXRlcygpID0gMDsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL21hYy9BVk1lZGlhQ2Fw
dHVyZVNvdXJjZS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRp
YXN0cmVhbS9tYWMvQVZNZWRpYUNhcHR1cmVTb3VyY2UubW0JKHJldmlzaW9uIDE4OTk4MykKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL21hYy9BVk1lZGlhQ2FwdHVyZVNv
dXJjZS5tbQkod29ya2luZyBjb3B5KQpAQCAtMjA5LDYgKzIwOSwxMiBAQCB2b2lkIEFWTWVkaWFD
YXB0dXJlU291cmNlOjpzY2hlZHVsZURlZmVyCiAgICAgfSk7CiB9CiAKK0F1ZGlvU291cmNlUHJv
dmlkZXIqIEFWTWVkaWFDYXB0dXJlU291cmNlOjphdWRpb1NvdXJjZVByb3ZpZGVyKCkKK3sKKyAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQogCiBAaW1wbGVtZW50YXRpb24gV2ViQ29yZUFWTWVkaWFDYXB0dXJl
U291cmNlT2JzZXJ2ZXIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFt
L21hYy9XZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL21hYy9XZWJBdWRpb1NvdXJjZVByb3ZpZGVy
QVZGT2JqQy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFz
dHJlYW0vbWFjL1dlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgV2ViQXVkaW9Tb3VyY2VQcm92aWRl
ckFWRk9iakNfaAorI2RlZmluZSBXZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQ19oCisKKyNp
ZiBFTkFCTEUoV0VCX0FVRElPKSAmJiBFTkFCTEUoTUVESUFfU1RSRUFNKQorCisjaW5jbHVkZSAi
QVZBdWRpb0NhcHR1cmVTb3VyY2UuaCIKKyNpbmNsdWRlICJBdWRpb1NvdXJjZVByb3ZpZGVyLmgi
CisjaW5jbHVkZSA8d3RmL0xvY2suaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2lu
Y2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+CisKK3R5cGVk
ZWYgc3RydWN0IEF1ZGlvQnVmZmVyTGlzdCBBdWRpb0J1ZmZlckxpc3Q7Cit0eXBlZGVmIHN0cnVj
dCBPcGFxdWVBdWRpb0NvbnZlcnRlciogQXVkaW9Db252ZXJ0ZXJSZWY7Cit0eXBlZGVmIHN0cnVj
dCBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9u
OwordHlwZWRlZiBjb25zdCBzdHJ1Y3Qgb3BhcXVlQ01Gb3JtYXREZXNjcmlwdGlvbiAqQ01Gb3Jt
YXREZXNjcmlwdGlvblJlZjsKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZUNNU2FtcGxlQnVmZmVyICpD
TVNhbXBsZUJ1ZmZlclJlZjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBVkF1ZGlv
Q2FwdHVyZVNvdXJjZTsKK2NsYXNzIENBUmluZ0J1ZmZlcjsKKworY2xhc3MgV2ViQXVkaW9Tb3Vy
Y2VQcm92aWRlckFWRk9iakMgOiBwdWJsaWMgUmVmQ291bnRlZDxXZWJBdWRpb1NvdXJjZVByb3Zp
ZGVyQVZGT2JqQz4sIHB1YmxpYyBBdWRpb1NvdXJjZVByb3ZpZGVyLCBwdWJsaWMgQVZBdWRpb0Nh
cHR1cmVTb3VyY2U6Ok9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFdlYkF1ZGlv
U291cmNlUHJvdmlkZXJBVkZPYmpDPiBjcmVhdGUoQVZBdWRpb0NhcHR1cmVTb3VyY2UmKTsKKyAg
ICB2aXJ0dWFsIH5XZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQygpOworCitwcml2YXRlOgor
ICAgIFdlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDKEFWQXVkaW9DYXB0dXJlU291cmNlJik7
CisKKyAgICB2b2lkIHN0YXJ0UHJvZHVjaW5nRGF0YSgpOworICAgIHZvaWQgc3RvcFByb2R1Y2lu
Z0RhdGEoKTsKKworICAgIC8vIEF1ZGlvU291cmNlUHJvdmlkZXIKKyAgICB2aXJ0dWFsIHZvaWQg
cHJvdmlkZUlucHV0KEF1ZGlvQnVzKiwgc2l6ZV90KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0Q2xpZW50KEF1ZGlvU291cmNlUHJvdmlkZXJDbGllbnQqKSBvdmVycmlkZTsKKworICAg
IC8vIEFWQXVkaW9DYXB0dXJlU291cmNlOjpPYnNlcnZlcgorICAgIHZvaWQgcHJlcGFyZShjb25z
dCBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gKikgb3ZlcnJpZGU7CisgICAgdm9pZCB1bnBy
ZXBhcmUoKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoQ01Gb3JtYXREZXNjcmlwdGlvblJl
ZiwgQ01TYW1wbGVCdWZmZXJSZWYpIG92ZXJyaWRlOworCisgICAgc2l6ZV90IG1fbGlzdEJ1ZmZl
clNpemUgeyAwIH07CisgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvQnVmZmVyTGlzdD4gbV9saXN0
OworICAgIFJldGFpblB0cjxBdWRpb0NvbnZlcnRlclJlZj4gbV9jb252ZXJ0ZXI7CisgICAgc3Rk
Ojp1bmlxdWVfcHRyPEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbj4gbV9pbnB1dERlc2NyaXB0
aW9uOworICAgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24+IG1f
b3V0cHV0RGVzY3JpcHRpb247CisgICAgc3RkOjp1bmlxdWVfcHRyPENBUmluZ0J1ZmZlcj4gbV9y
aW5nQnVmZmVyOworCisgICAgdWludDY0X3QgbV93cml0ZUFoZWFkQ291bnQgeyAwIH07CisgICAg
dWludDY0X3QgbV93cml0ZUNvdW50IHsgMCB9OworICAgIHVpbnQ2NF90IG1fcmVhZENvdW50IHsg
MCB9OworICAgIEF1ZGlvU291cmNlUHJvdmlkZXJDbGllbnQqIG1fY2xpZW50IHsgbnVsbHB0ciB9
OworICAgIEFWQXVkaW9DYXB0dXJlU291cmNlKiBtX2NhcHR1cmVTb3VyY2UgeyBudWxscHRyIH07
CisgICAgYm9vbCBtX2Nvbm5lY3RlZCB7IGZhbHNlIH07Cit9OworICAgIAorfQorCisjZW5kaWYK
KworI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9tYWMv
V2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakMubW0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vbWFjL1dlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZP
YmpDLm1tCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJl
YW0vbWFjL1dlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDLm1tCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJX
ZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQy5oIgorCisjaWYgRU5BQkxFKFdFQl9BVURJTykg
JiYgRU5BQkxFKE1FRElBX1NUUkVBTSkKKworI2ltcG9ydCAiQXVkaW9CdXMuaCIKKyNpbXBvcnQg
IkF1ZGlvQ2hhbm5lbC5oIgorI2ltcG9ydCAiQXVkaW9Tb3VyY2VQcm92aWRlckNsaWVudC5oIgor
I2ltcG9ydCAiQ0FSaW5nQnVmZmVyLmgiCisjaW1wb3J0ICJMb2dnaW5nLmgiCisjaW1wb3J0ICJN
ZWRpYVRpbWVBVkZvdW5kYXRpb24uaCIKKyNpbXBvcnQgPEFWRm91bmRhdGlvbi9BVkFzc2V0VHJh
Y2suaD4KKyNpbXBvcnQgPEFWRm91bmRhdGlvbi9BVkF1ZGlvTWl4Lmg+CisjaW1wb3J0IDxBVkZv
dW5kYXRpb24vQVZNZWRpYUZvcm1hdC5oPgorI2ltcG9ydCA8QVZGb3VuZGF0aW9uL0FWUGxheWVy
SXRlbS5oPgorI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+CisjaW1wb3J0IDx3dGYvTWFpblRocmVh
ZC5oPgorCisjaWYgIUxPR19ESVNBQkxFRAorI2ltcG9ydCA8d3RmL1N0cmluZ1ByaW50U3RyZWFt
Lmg+CisjZW5kaWYKKworI2ltcG9ydCAiQ29yZU1lZGlhU29mdExpbmsuaCIKKworU09GVF9MSU5L
X0ZSQU1FV09SSyhBVkZvdW5kYXRpb24pCitTT0ZUX0xJTktfRlJBTUVXT1JLKEF1ZGlvVG9vbGJv
eCkKKworU09GVF9MSU5LX0NMQVNTKEFWRm91bmRhdGlvbiwgQVZQbGF5ZXJJdGVtKQorU09GVF9M
SU5LX0NMQVNTKEFWRm91bmRhdGlvbiwgQVZNdXRhYmxlQXVkaW9NaXgpCitTT0ZUX0xJTktfQ0xB
U1MoQVZGb3VuZGF0aW9uLCBBVk11dGFibGVBdWRpb01peElucHV0UGFyYW1ldGVycykKKworU09G
VF9MSU5LKEF1ZGlvVG9vbGJveCwgQXVkaW9Db252ZXJ0ZXJDb252ZXJ0Q29tcGxleEJ1ZmZlciwg
T1NTdGF0dXMsIChBdWRpb0NvbnZlcnRlclJlZiBpbkF1ZGlvQ29udmVydGVyLCBVSW50MzIgaW5O
dW1iZXJQQ01GcmFtZXMsIGNvbnN0IEF1ZGlvQnVmZmVyTGlzdCogaW5JbnB1dERhdGEsIEF1ZGlv
QnVmZmVyTGlzdCogb3V0T3V0cHV0RGF0YSksIChpbkF1ZGlvQ29udmVydGVyLCBpbk51bWJlclBD
TUZyYW1lcywgaW5JbnB1dERhdGEsIG91dE91dHB1dERhdGEpKQorU09GVF9MSU5LKEF1ZGlvVG9v
bGJveCwgQXVkaW9Db252ZXJ0ZXJOZXcsIE9TU3RhdHVzLCAoY29uc3QgQXVkaW9TdHJlYW1CYXNp
Y0Rlc2NyaXB0aW9uKiBpblNvdXJjZUZvcm1hdCwgY29uc3QgQXVkaW9TdHJlYW1CYXNpY0Rlc2Ny
aXB0aW9uKiBpbkRlc3RpbmF0aW9uRm9ybWF0LCBBdWRpb0NvbnZlcnRlclJlZiogb3V0QXVkaW9D
b252ZXJ0ZXIpLCAoaW5Tb3VyY2VGb3JtYXQsIGluRGVzdGluYXRpb25Gb3JtYXQsIG91dEF1ZGlv
Q29udmVydGVyKSkKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgZG91Ymxl
IGtSaW5nQnVmZmVyRHVyYXRpb24gPSAxOworCitSZWY8V2ViQXVkaW9Tb3VyY2VQcm92aWRlckFW
Rk9iakM+IFdlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDOjpjcmVhdGUoQVZBdWRpb0NhcHR1
cmVTb3VyY2UmIHNvdXJjZSkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBXZWJBdWRpb1Nv
dXJjZVByb3ZpZGVyQVZGT2JqQyhzb3VyY2UpKTsKK30KKworV2ViQXVkaW9Tb3VyY2VQcm92aWRl
ckFWRk9iakM6OldlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpDKEFWQXVkaW9DYXB0dXJlU291
cmNlJiBzb3VyY2UpCisgICAgOiBtX2NhcHR1cmVTb3VyY2UoJnNvdXJjZSkKK3sKK30KKworV2Vi
QXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakM6On5XZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2Jq
QygpCit7CisgICAgc2V0Q2xpZW50KG51bGxwdHIpOworfQorCit2b2lkIFdlYkF1ZGlvU291cmNl
UHJvdmlkZXJBVkZPYmpDOjpzdGFydFByb2R1Y2luZ0RhdGEoKQoreworICAgIG1fY2FwdHVyZVNv
dXJjZS0+c3RhcnRQcm9kdWNpbmdEYXRhKCk7Cit9CisKK3ZvaWQgV2ViQXVkaW9Tb3VyY2VQcm92
aWRlckFWRk9iakM6OnN0b3BQcm9kdWNpbmdEYXRhKCkKK3sKKyAgICBtX2NhcHR1cmVTb3VyY2Ut
PnN0b3BQcm9kdWNpbmdEYXRhKCk7Cit9CisKK3ZvaWQgV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFW
Rk9iakM6OnByb3ZpZGVJbnB1dChBdWRpb0J1cyogYnVzLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNz
KQoreworICAgIGlmICghbV9yaW5nQnVmZmVyKSB7CisgICAgICAgIGJ1cy0+emVybygpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3Qgc3RhcnRGcmFtZSA9IDA7CisgICAg
dWludDY0X3QgZW5kRnJhbWUgPSAwOworICAgIG1fcmluZ0J1ZmZlci0+Z2V0Q3VycmVudEZyYW1l
Qm91bmRzKHN0YXJ0RnJhbWUsIGVuZEZyYW1lKTsKKworICAgIGlmIChtX3dyaXRlQ291bnQgPD0g
bV9yZWFkQ291bnQgKyBtX3dyaXRlQWhlYWRDb3VudCkgeworICAgICAgICBidXMtPnplcm8oKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBmcmFtZXNBdmFpbGFibGUgPSBz
dGF0aWNfY2FzdDxzaXplX3Q+KGVuZEZyYW1lIC0gKG1fcmVhZENvdW50ICsgbV93cml0ZUFoZWFk
Q291bnQpKTsKKyAgICBpZiAoZnJhbWVzQXZhaWxhYmxlIDwgZnJhbWVzVG9Qcm9jZXNzKSB7Cisg
ICAgICAgIGZyYW1lc1RvUHJvY2VzcyA9IGZyYW1lc0F2YWlsYWJsZTsKKyAgICAgICAgYnVzLT56
ZXJvKCk7CisgICAgfQorCisgICAgQVNTRVJUKGJ1cy0+bnVtYmVyT2ZDaGFubmVscygpID09IG1f
cmluZ0J1ZmZlci0+Y2hhbm5lbENvdW50KCkpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG1fbGlzdC0+bU51bWJlckJ1ZmZlcnM7ICsraSkgeworICAgICAgICBBdWRpb0NoYW5uZWwq
IGNoYW5uZWwgPSBidXMtPmNoYW5uZWwoaSk7CisgICAgICAgIG1fbGlzdC0+bUJ1ZmZlcnNbaV0u
bU51bWJlckNoYW5uZWxzID0gMTsKKyAgICAgICAgbV9saXN0LT5tQnVmZmVyc1tpXS5tRGF0YSA9
IGNoYW5uZWwtPm11dGFibGVEYXRhKCk7CisgICAgICAgIG1fbGlzdC0+bUJ1ZmZlcnNbaV0ubURh
dGFCeXRlU2l6ZSA9IGNoYW5uZWwtPmxlbmd0aCgpICogc2l6ZW9mKGZsb2F0KTsKKyAgICB9CisK
KyAgICBtX3JpbmdCdWZmZXItPmZldGNoKG1fbGlzdC5nZXQoKSwgZnJhbWVzVG9Qcm9jZXNzLCBt
X3JlYWRDb3VudCk7CisgICAgbV9yZWFkQ291bnQgKz0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAg
aWYgKG1fY29udmVydGVyKQorICAgICAgICBBdWRpb0NvbnZlcnRlckNvbnZlcnRDb21wbGV4QnVm
ZmVyKG1fY29udmVydGVyLmdldCgpLCBmcmFtZXNUb1Byb2Nlc3MsIG1fbGlzdC5nZXQoKSwgbV9s
aXN0LmdldCgpKTsKK30KKwordm9pZCBXZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQzo6c2V0
Q2xpZW50KEF1ZGlvU291cmNlUHJvdmlkZXJDbGllbnQqIGNsaWVudCkKK3sKKyAgICBpZiAobV9j
bGllbnQgPT0gY2xpZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2NsaWVudCA9IGNsaWVu
dDsKKworICAgIGlmIChtX2NsaWVudCAmJiAhbV9jb25uZWN0ZWQpIHsKKyAgICAgICAgbV9jb25u
ZWN0ZWQgPSB0cnVlOworICAgICAgICBtX2NhcHR1cmVTb3VyY2UtPmFkZE9ic2VydmVyKHRoaXMp
OworICAgICAgICBtX2NhcHR1cmVTb3VyY2UtPnN0YXJ0UHJvZHVjaW5nRGF0YSgpOworICAgIH0g
ZWxzZSBpZiAoIW1fY2xpZW50ICYmIG1fY29ubmVjdGVkKSB7CisgICAgICAgIG1fY2FwdHVyZVNv
dXJjZS0+cmVtb3ZlT2JzZXJ2ZXIodGhpcyk7CisgICAgICAgIG1fY29ubmVjdGVkID0gZmFsc2U7
CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF1ZGlvU3RyZWFtQmFz
aWNEZXNjcmlwdGlvbiYgYSwgY29uc3QgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uJiBiKQor
eworICAgIHJldHVybiBhLm1TYW1wbGVSYXRlID09IGIubVNhbXBsZVJhdGUKKyAgICAgICAgJiYg
YS5tRm9ybWF0SUQgPT0gYi5tRm9ybWF0SUQKKyAgICAgICAgJiYgYS5tRm9ybWF0RmxhZ3MgPT0g
Yi5tRm9ybWF0RmxhZ3MKKyAgICAgICAgJiYgYS5tQnl0ZXNQZXJQYWNrZXQgPT0gYi5tQnl0ZXNQ
ZXJQYWNrZXQKKyAgICAgICAgJiYgYS5tRnJhbWVzUGVyUGFja2V0ID09IGIubUZyYW1lc1BlclBh
Y2tldAorICAgICAgICAmJiBhLm1CeXRlc1BlckZyYW1lID09IGIubUJ5dGVzUGVyRnJhbWUKKyAg
ICAgICAgJiYgYS5tQ2hhbm5lbHNQZXJGcmFtZSA9PSBiLm1DaGFubmVsc1BlckZyYW1lCisgICAg
ICAgICYmIGEubUJpdHNQZXJDaGFubmVsID09IGIubUJpdHNQZXJDaGFubmVsOworfQorCitzdGF0
aWMgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiYgYSwg
Y29uc3QgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uJiBiKQoreworICAgIHJldHVybiAhKGEg
PT0gYik7Cit9CisKK3ZvaWQgV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakM6OnByZXBhcmUo
Y29uc3QgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICpmb3JtYXQpCit7CisgICAgbV9pbnB1
dERlc2NyaXB0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRp
b24+KCpmb3JtYXQpOworICAgIGludCBudW1iZXJPZkNoYW5uZWxzID0gZm9ybWF0LT5tQ2hhbm5l
bHNQZXJGcmFtZTsKKyAgICBzaXplX3QgYnl0ZXNQZXJGcmFtZSA9IGZvcm1hdC0+bUJ5dGVzUGVy
RnJhbWU7CisgICAgZG91YmxlIHNhbXBsZVJhdGUgPSBmb3JtYXQtPm1TYW1wbGVSYXRlOworICAg
IEFTU0VSVChzYW1wbGVSYXRlID49IDApOworCisgICAgbV9vdXRwdXREZXNjcmlwdGlvbiA9IHN0
ZDo6bWFrZV91bmlxdWU8QXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uPigpOworICAgIG1fb3V0
cHV0RGVzY3JpcHRpb24tPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBtX291dHB1dERl
c2NyaXB0aW9uLT5tRm9ybWF0SUQgPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ007CisgICAgbV9vdXRw
dXREZXNjcmlwdGlvbi0+bUZvcm1hdEZsYWdzID0ga0F1ZGlvRm9ybWF0RmxhZ3NOYXRpdmVGbG9h
dFBhY2tlZDsKKyAgICBtX291dHB1dERlc2NyaXB0aW9uLT5tQml0c1BlckNoYW5uZWwgPSA4ICog
c2l6ZW9mKEZsb2F0MzIpOworICAgIG1fb3V0cHV0RGVzY3JpcHRpb24tPm1DaGFubmVsc1BlckZy
YW1lID0gbnVtYmVyT2ZDaGFubmVsczsKKyAgICBtX291dHB1dERlc2NyaXB0aW9uLT5tRnJhbWVz
UGVyUGFja2V0ID0gMTsKKyAgICBtX291dHB1dERlc2NyaXB0aW9uLT5tQnl0ZXNQZXJQYWNrZXQg
PSBzaXplb2YoRmxvYXQzMik7CisgICAgbV9vdXRwdXREZXNjcmlwdGlvbi0+bUJ5dGVzUGVyRnJh
bWUgPSBzaXplb2YoRmxvYXQzMik7CisgICAgbV9vdXRwdXREZXNjcmlwdGlvbi0+bUZvcm1hdEZs
YWdzIHw9IGtBdWRpb0Zvcm1hdEZsYWdJc05vbkludGVybGVhdmVkOworCisgICAgaWYgKCptX2lu
cHV0RGVzY3JpcHRpb24gIT0gKm1fb3V0cHV0RGVzY3JpcHRpb24pIHsKKyAgICAgICAgQXVkaW9D
b252ZXJ0ZXJSZWYgb3V0Q29udmVydGVyID0gbnVsbHB0cjsKKyAgICAgICAgQXVkaW9Db252ZXJ0
ZXJOZXcobV9pbnB1dERlc2NyaXB0aW9uLmdldCgpLCBtX291dHB1dERlc2NyaXB0aW9uLmdldCgp
LCAmb3V0Q29udmVydGVyKTsKKyAgICAgICAgbV9jb252ZXJ0ZXIgPSBvdXRDb252ZXJ0ZXI7Cisg
ICAgfQorCisgICAgTE9HKE1lZGlhLCAiV2ViQXVkaW9Tb3VyY2VQcm92aWRlckFWRk9iakM6OnBy
ZXBhcmUoJXApIiwgdGhpcyk7CisKKyAgICAvLyBNYWtlIHRoZSByaW5nYnVmZmVyIGxhcmdlIGVu
b3VnaCB0byBzdG9yZSBhdCBsZWFzdCB0d28gY2FsbGJhY2tzIHdvcnRoIG9mIGF1ZGlvLCBvciAx
cywgd2hpY2hldmVyIGlzIGxhcmdlci4KKyAgICBtX3JpbmdCdWZmZXIgPSBzdGQ6Om1ha2VfdW5p
cXVlPENBUmluZ0J1ZmZlcj4oKTsKKyAgICBtX3JpbmdCdWZmZXItPmFsbG9jYXRlKG51bWJlck9m
Q2hhbm5lbHMsIGJ5dGVzUGVyRnJhbWUsIHN0YXRpY19jYXN0PHNpemVfdD4oa1JpbmdCdWZmZXJE
dXJhdGlvbiAqIHNhbXBsZVJhdGUpKTsKKworICAgIC8vIEF1ZGlvQnVmZmVyTGlzdCBpcyBhIHZh
cmlhYmxlLWxlbmd0aCBzdHJ1Y3QsIHNvIGNyZWF0ZSBvbiB0aGUgaGVhcCB3aXRoIGEgZ2VuZXJp
YyBuZXcoKSBvcGVyYXRvcgorICAgIC8vIHdpdGggYSBjdXN0b20gc2l6ZSwgYW5kIGluaXRpYWxp
emUgdGhlIHN0cnVjdCBtYW51YWxseS4KKyAgICBtX2xpc3RCdWZmZXJTaXplID0gb2Zmc2V0b2Yo
QXVkaW9CdWZmZXJMaXN0LCBtQnVmZmVycykgKyAoc2l6ZW9mKEF1ZGlvQnVmZmVyKSAqIHN0ZDo6
bWF4KDEsIG51bWJlck9mQ2hhbm5lbHMpKTsKKyAgICBtX2xpc3QgPSBzdGQ6OnVuaXF1ZV9wdHI8
QXVkaW9CdWZmZXJMaXN0PigoQXVkaW9CdWZmZXJMaXN0KikgOjpvcGVyYXRvciBuZXcgKG1fbGlz
dEJ1ZmZlclNpemUpKTsKKyAgICBtZW1zZXQobV9saXN0LmdldCgpLCAwLCBtX2xpc3RCdWZmZXJT
aXplKTsKKyAgICBtX2xpc3QtPm1OdW1iZXJCdWZmZXJzID0gbnVtYmVyT2ZDaGFubmVsczsKKwor
ICAgIFJlZlB0cjxXZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQz4gc3Ryb25nVGhpcyA9IHRo
aXM7CisgICAgY2FsbE9uTWFpblRocmVhZChbc3Ryb25nVGhpcywgbnVtYmVyT2ZDaGFubmVscywg
c2FtcGxlUmF0ZV0geworICAgICAgICBzdHJvbmdUaGlzLT5tX2NsaWVudC0+c2V0Rm9ybWF0KG51
bWJlck9mQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIH0pOworfQorCit2b2lkIFdlYkF1ZGlv
U291cmNlUHJvdmlkZXJBVkZPYmpDOjp1bnByZXBhcmUoKQoreworICAgIG1faW5wdXREZXNjcmlw
dGlvbiA9IG51bGxwdHI7CisgICAgbV9vdXRwdXREZXNjcmlwdGlvbiA9IG51bGxwdHI7CisgICAg
bV9yaW5nQnVmZmVyID0gbnVsbHB0cjsKKyAgICBtX2xpc3QgPSBudWxscHRyOworICAgIG1fbGlz
dEJ1ZmZlclNpemUgPSAwOworfQorCit2b2lkIFdlYkF1ZGlvU291cmNlUHJvdmlkZXJBVkZPYmpD
Ojpwcm9jZXNzKENNRm9ybWF0RGVzY3JpcHRpb25SZWYsIENNU2FtcGxlQnVmZmVyUmVmIHNhbXBs
ZUJ1ZmZlcikKK3sKKyAgICBDTUl0ZW1Db3VudCBmcmFtZUNvdW50ID0gQ01TYW1wbGVCdWZmZXJH
ZXROdW1TYW1wbGVzKHNhbXBsZUJ1ZmZlcik7CisgICAgQ01CbG9ja0J1ZmZlclJlZiBidWZmZXIg
PSBuaWw7CisKKyAgICBPU1N0YXR1cyBlcnIgPSBDTVNhbXBsZUJ1ZmZlckdldEF1ZGlvQnVmZmVy
TGlzdFdpdGhSZXRhaW5lZEJsb2NrQnVmZmVyKHNhbXBsZUJ1ZmZlciwgbnVsbHB0ciwgbV9saXN0
LmdldCgpLCBtX2xpc3RCdWZmZXJTaXplLCBrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LCBrQ0ZB
bGxvY2F0b3JTeXN0ZW1EZWZhdWx0LCBrQ01TYW1wbGVCdWZmZXJGbGFnX0F1ZGlvQnVmZmVyTGlz
dF9Bc3N1cmUxNkJ5dGVBbGlnbm1lbnQsICZidWZmZXIpOworCisgICAgaWYgKGVycikgeworICAg
ICAgICBMT0coTWVkaWEsICJXZWJBdWRpb1NvdXJjZVByb3ZpZGVyQVZGT2JqQzo6cHJvZXNzKCVw
KSAtIENNU2FtcGxlQnVmZmVyR2V0QXVkaW9CdWZmZXJMaXN0V2l0aFJldGFpbmVkQmxvY2tCdWZm
ZXIgcmV0dXJuZWQgZXJyb3IgJWkiLCB0aGlzLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgbV9yaW5nQnVmZmVyLT5zdG9yZShtX2xpc3QuZ2V0KCksIGZyYW1lQ291bnQsIG1f
d3JpdGVDb3VudCk7CisgICAgbV93cml0ZUNvdW50ICs9IGZyYW1lQ291bnQ7Cit9CisKK30KKwor
I2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pICYmIEVOQUJMRShNRURJQV9TVFJFQU0pCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>