<?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>48012</bug_id>
          
          <creation_ts>2010-10-20 15:01:23 -0700</creation_ts>
          <short_desc>Add AudioBufferSourceNode files</short_desc>
          <delta_ts>2010-11-02 19:36:03 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>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>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris Rogers">crogers</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>jamesr</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>297056</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-10-20 15:01:23 -0700</bug_when>
    <thetext>Add AudioBufferSourceNode files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297057</commentid>
    <comment_count>1</comment_count>
      <attachid>71344</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-10-20 15:03:14 -0700</bug_when>
    <thetext>Created attachment 71344
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297061</commentid>
    <comment_count>2</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-10-20 15:06:57 -0700</bug_when>
    <thetext>This is the implementation for AudioBufferSourceNode as described in the audio specification:
http://chromium.googlecode.com/svn/trunk/samples/audio/specification/specification.html#AudioBufferSourceNode-section</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303181</commentid>
    <comment_count>3</comment_count>
      <attachid>71344</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-11-01 20:06:50 -0700</bug_when>
    <thetext>Comment on attachment 71344
Patch

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

Overall the code basically looks good to a layman not experienced in audio processing. r- for a few minor issues, and a couple of larger / higher-level comments.

&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:83
&gt; +    // Careful - this is a tryLock() and not an autolocker, so we must unlock() before every return.

Please consider adding a TryLocker class and MutexTryLocker typedef to WTF. The TryLocker class could have a bool holdsLock() method, and would only unlock the mutex in its destructor if it successfully acquired it in its constructor. This would clean up this class and I&apos;m pretty sure a few others. This can be a separate bug following this one.

&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:145
&gt; +    bool channelCountGood = numberOfChannels == busNumberOfChannels &amp;&amp; (numberOfChannels == 1 || numberOfChannels == 2);

How about a FIXME here as below? This is the first case of this test in this file reading from the top down.

&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:264
&gt; +    // FIXME: we can add support for sources with more than two channels, but this is not a common case.

Is it expected that it may be more of a common case in the future? Is there any real problem with generalizing this code to arrays of channels, source pointers, destination pointers, etc.? It seems it might cut in half the amount of code in certain places.

&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:280
&gt; +    sourceR += m_readIndex;

Please add assertions that you&apos;re not walking off the end of the source, and won&apos;t when accessing framesToProcess frames past these pointers.

&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:405
&gt; +void AudioBufferSourceNode::noteOff(double /*when*/)

Just remove the commented-out variable name.

&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:411
&gt; +    // FIXME: when is ignored.

Put quotes around &quot;when&quot;. Confusing to read otherwise.

&gt; WebCore/webaudio/AudioBufferSourceNode.h:48
&gt; +    static PassRefPtr&lt;AudioBufferSourceNode&gt; create(AudioContext* context, double sampleRate)

Is there a particular reason to inline this creation method in the header? If not please move its body to the .cpp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303650</commentid>
    <comment_count>4</comment_count>
      <attachid>71344</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-11-02 14:10:48 -0700</bug_when>
    <thetext>Comment on attachment 71344
Patch

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

&gt;&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:145
&gt;&gt; +    bool channelCountGood = numberOfChannels == busNumberOfChannels &amp;&amp; (numberOfChannels == 1 || numberOfChannels == 2);
&gt; 
&gt; How about a FIXME here as below? This is the first case of this test in this file reading from the top down.

FIXED

&gt;&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:264
&gt;&gt; +    // FIXME: we can add support for sources with more than two channels, but this is not a common case.
&gt; 
&gt; Is it expected that it may be more of a common case in the future? Is there any real problem with generalizing this code to arrays of channels, source pointers, destination pointers, etc.? It seems it might cut in half the amount of code in certain places.

Even in the future the mono and stereo cases will by far be the most common.  It&apos;s important to keep the structure of the code such that the inner-loops may be optimized, especially for stereo.  Fairly soon, we&apos;re anticipating adding automation curves and more generalized envelopes in here which can especially benefit from these optimizations.

&gt;&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:280
&gt;&gt; +    sourceR += m_readIndex;
&gt; 
&gt; Please add assertions that you&apos;re not walking off the end of the source, and won&apos;t when accessing framesToProcess frames past these pointers.

FIXED: added this check in isSourceGood above

&gt;&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:405
&gt;&gt; +void AudioBufferSourceNode::noteOff(double /*when*/)
&gt; 
&gt; Just remove the commented-out variable name.

FIXED

&gt;&gt; WebCore/webaudio/AudioBufferSourceNode.cpp:411
&gt;&gt; +    // FIXME: when is ignored.
&gt; 
&gt; Put quotes around &quot;when&quot;. Confusing to read otherwise.

FIXED

&gt;&gt; WebCore/webaudio/AudioBufferSourceNode.h:48
&gt;&gt; +    static PassRefPtr&lt;AudioBufferSourceNode&gt; create(AudioContext* context, double sampleRate)
&gt; 
&gt; Is there a particular reason to inline this creation method in the header? If not please move its body to the .cpp.

FIXED</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303651</commentid>
    <comment_count>5</comment_count>
      <attachid>72734</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-11-02 14:13:08 -0700</bug_when>
    <thetext>Created attachment 72734
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303827</commentid>
    <comment_count>6</comment_count>
      <attachid>72734</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-11-02 17:59:02 -0700</bug_when>
    <thetext>Comment on attachment 72734
Patch

Looks good to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303863</commentid>
    <comment_count>7</comment_count>
      <attachid>72734</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-11-02 19:35:57 -0700</bug_when>
    <thetext>Comment on attachment 72734
Patch

Clearing flags on attachment: 72734

Committed r71205: &lt;http://trac.webkit.org/changeset/71205&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303864</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-11-02 19:36:03 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71344</attachid>
            <date>2010-10-20 15:03:14 -0700</date>
            <delta_ts>2010-11-02 14:13:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-48012-20101020150312.patch</filename>
            <type>text/plain</type>
            <size>28756</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MDE4MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzYgQEAKKzIwMTAtMTAtMjAgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD00ODAxMgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5j
ZSBhdWRpbyBBUEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlv
L0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9CdWZmZXJTb3VyY2VOb2RlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGUpOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjp+QXVkaW9CdWZmZXJTb3VyY2VOb2RlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cHJvY2Vzcyk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnByb3ZpZGVJbnB1dCk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnJlYWRGcm9tQnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cmVhZEZyb21CdWZmZXJXaXRoR3Jh
aW5FbnZlbG9wZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnJl
c2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6c2V0QnVmZmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6bnVtYmVyT2ZDaGFu
bmVscyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6Om5vdGVPbik6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6Om5vdGVHcmFpbk9uKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6bm90ZU9mZik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnRvdGFsUGl0Y2hSYXRlKToKKyAg
ICAgICAgKiB3ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuaDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OmNyZWF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0J1ZmZlclNvdXJjZU5vZGU6Omxvb3BpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9C
dWZmZXJTb3VyY2VOb2RlOjpzZXRMb29waW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVm
ZmVyU291cmNlTm9kZTo6Z2Fpbik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJj
ZU5vZGU6OnBsYXliYWNrUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJj
ZU5vZGU6OnNldFBhbm5lck5vZGUpOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQnVmZmVyU291
cmNlTm9kZS5pZGw6IEFkZGVkLgorCiAyMDEwLTEwLTIwICBTaGVyaWZmIEJvdCAgPHdlYmtpdC5y
ZXZpZXcuYm90QGdtYWlsLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCBy
NzAxNjUuCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3Bw
CShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUu
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJV
VE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJBdWRpb0J1
ZmZlclNvdXJjZU5vZGUuaCIKKworI2luY2x1ZGUgIkF1ZGlvQ29udGV4dC5oIgorI2luY2x1ZGUg
IkF1ZGlvTm9kZU91dHB1dC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwordXNpbmcgbmFtZXNw
YWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBkb3VibGUgRGVmYXVsdEdy
YWluRHVyYXRpb24gPSAwLjAyMDsgLy8gMjBtcworCitBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OkF1
ZGlvQnVmZmVyU291cmNlTm9kZShBdWRpb0NvbnRleHQqIGNvbnRleHQsIGRvdWJsZSBzYW1wbGVS
YXRlKQorICAgIDogQXVkaW9Tb3VyY2VOb2RlKGNvbnRleHQsIHNhbXBsZVJhdGUpCisgICAgLCBt
X2J1ZmZlcigwKQorICAgICwgbV9pc1BsYXlpbmcoZmFsc2UpCisgICAgLCBtX2lzTG9vcGluZyhm
YWxzZSkKKyAgICAsIG1faGFzRmluaXNoZWQoZmFsc2UpCisgICAgLCBtX3N0YXJ0VGltZSgwLjAp
CisgICAgLCBtX3NjaGVkdWxpbmdGcmFtZURlbGF5KDApCisgICAgLCBtX3JlYWRJbmRleCgwKQor
ICAgICwgbV9pc0dyYWluKGZhbHNlKQorICAgICwgbV9ncmFpbk9mZnNldCgwLjApCisgICAgLCBt
X2dyYWluRHVyYXRpb24oRGVmYXVsdEdyYWluRHVyYXRpb24pCisgICAgLCBtX2dyYWluRnJhbWVD
b3VudCgwKQorICAgICwgbV9sYXN0R2FpbigxLjApCisgICAgLCBtX3Bhbm5lck5vZGUoMCkKK3sK
KyAgICBzZXRUeXBlKE5vZGVUeXBlQXVkaW9CdWZmZXJTb3VyY2UpOworCisgICAgbV9nYWluID0g
QXVkaW9HYWluOjpjcmVhdGUoImdhaW4iLCAxLjAsIDAuMCwgMS4wKTsKKyAgICBtX3BsYXliYWNr
UmF0ZSA9IEF1ZGlvUGFyYW06OmNyZWF0ZSgicGxheWJhY2tSYXRlIiwgMS4wLCAwLjAsIEF1ZGlv
UmVzYW1wbGVyOjpNYXhSYXRlKTsKKworICAgIC8vIERlZmF1bHQgdG8gbW9uby4gIEEgY2FsbCB0
byBzZXRCdWZmZXIoKSB3aWxsIHNldCB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyB0byB0
aGF0IG9mIHRoZSBidWZmZXIuCisgICAgYWRkT3V0cHV0KGFkb3B0UHRyKG5ldyBBdWRpb05vZGVP
dXRwdXQodGhpcywgMSkpKTsKKworICAgIGluaXRpYWxpemUoKTsKK30KKworQXVkaW9CdWZmZXJT
b3VyY2VOb2RlOjp+QXVkaW9CdWZmZXJTb3VyY2VOb2RlKCkKK3sKKyAgICB1bmluaXRpYWxpemUo
KTsKK30KKwordm9pZCBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnByb2Nlc3Moc2l6ZV90IGZyYW1l
c1RvUHJvY2VzcykKK3sKKyAgICBBdWRpb0J1cyogb3V0cHV0QnVzID0gb3V0cHV0KDApLT5idXMo
KTsKKworICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgIG91dHB1dEJ1cy0+emVy
bygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGF1ZGlvIHRocmVhZCBj
YW4ndCBibG9jayBvbiB0aGlzIGxvY2ssIHNvIHdlIGNhbGwgdHJ5TG9jaygpIGluc3RlYWQuCisg
ICAgLy8gQ2FyZWZ1bCAtIHRoaXMgaXMgYSB0cnlMb2NrKCkgYW5kIG5vdCBhbiBhdXRvbG9ja2Vy
LCBzbyB3ZSBtdXN0IHVubG9jaygpIGJlZm9yZSBldmVyeSByZXR1cm4uCisgICAgaWYgKG1fcHJv
Y2Vzc0xvY2sudHJ5TG9jaygpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgdGltZSB0byBz
dGFydCBwbGF5aW5nLgorICAgICAgICBkb3VibGUgc2FtcGxlUmF0ZSA9IHRoaXMtPnNhbXBsZVJh
dGUoKTsKKyAgICAgICAgZG91YmxlIHBpdGNoUmF0ZSA9IHRvdGFsUGl0Y2hSYXRlKCk7CisgICAg
ICAgIGRvdWJsZSBxdWFudHVtU3RhcnRUaW1lID0gY29udGV4dCgpLT5jdXJyZW50VGltZSgpOwor
ICAgICAgICBkb3VibGUgcXVhbnR1bUVuZFRpbWUgPSBxdWFudHVtU3RhcnRUaW1lICsgZnJhbWVz
VG9Qcm9jZXNzIC8gc2FtcGxlUmF0ZTsKKworICAgICAgICBpZiAoIW1faXNQbGF5aW5nIHx8IG1f
aGFzRmluaXNoZWQgfHwgIWJ1ZmZlcigpIHx8IG1fc3RhcnRUaW1lID49IHF1YW50dW1FbmRUaW1l
KSB7CisgICAgICAgICAgICAvLyBGSVhNRTogY2FuIG9wdGltaXplIGhlcmUgYnkgcHJvcGFnYXRp
bmcgc2lsZW50IGhpbnQgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZSB3aG9sZSBjaGFpbiB0byBwcm9j
ZXNzIHNpbGVuY2UuCisgICAgICAgICAgICBvdXRwdXRCdXMtPnplcm8oKTsKKyAgICAgICAgICAg
IG1fcHJvY2Vzc0xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KworICAgICAgICAvLyBIYW5kbGUgc2FtcGxlLWFjY3VyYXRlIHNjaGVkdWxpbmcgc28gdGhhdCBi
dWZmZXIgcGxheWJhY2sgd2lsbCBoYXBwZW4gYXQgYSB2ZXJ5IHByZWNpc2UgdGltZS4KKyAgICAg
ICAgbV9zY2hlZHVsaW5nRnJhbWVEZWxheSA9IDA7CisgICAgICAgIGlmIChtX3N0YXJ0VGltZSA+
PSBxdWFudHVtU3RhcnRUaW1lKSB7CisgICAgICAgICAgICAvLyBtX3NjaGVkdWxpbmdGcmFtZURl
bGF5IGlzIHNldCBoZXJlIG9ubHkgdGhlIHZlcnkgZmlyc3QgcmVuZGVyIHF1YW50dW0gKGJlY2F1
c2Ugb2YgYWJvdmUgY2hlY2s6IG1fc3RhcnRUaW1lID49IHF1YW50dW1FbmRUaW1lKQorICAgICAg
ICAgICAgLy8gU286IHF1YW50dW1TdGFydFRpbWUgPD0gbV9zdGFydFRpbWUgPCBxdWFudHVtRW5k
VGltZQorICAgICAgICAgICAgQVNTRVJUKG1fc3RhcnRUaW1lIDwgcXVhbnR1bUVuZFRpbWUpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBkb3VibGUgc3RhcnRUaW1lSW5RdWFudHVtID0gbV9z
dGFydFRpbWUgLSBxdWFudHVtU3RhcnRUaW1lOworICAgICAgICAgICAgZG91YmxlIHN0YXJ0RnJh
bWVJblF1YW50dW0gPSBzdGFydFRpbWVJblF1YW50dW0gKiBzYW1wbGVSYXRlOworICAgICAgICAg
ICAgCisgICAgICAgICAgICAvLyBtX3NjaGVkdWxpbmdGcmFtZURlbGF5IGlzIHVzZWQgaW4gcHJv
dmlkZUlucHV0KCksIHNvIGZhY3RvciBpbiB0aGUgY3VycmVudCBwbGF5YmFjayBwaXRjaCByYXRl
LgorICAgICAgICAgICAgbV9zY2hlZHVsaW5nRnJhbWVEZWxheSA9IHN0YXRpY19jYXN0PGludD4o
cGl0Y2hSYXRlICogc3RhcnRGcmFtZUluUXVhbnR1bSk7CisgICAgICAgIH0KKworICAgICAgICAv
LyBGSVhNRTogb3B0aW1pemF0aW9uIG9wcG9ydHVuaXR5OgorICAgICAgICAvLyBXaXRoIGEgYml0
IG9mIHdvcmssIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhdm9pZCBnb2luZyB0aHJvdWdoIHRo
ZSByZXNhbXBsZXIgY29tcGxldGVseSB3aGVuIHRoZSBwaXRjaFJhdGUgPT0gMSwKKyAgICAgICAg
Ly8gZXNwZWNpYWxseSBpZiB0aGUgcGl0Y2hSYXRlIGhhcyBuZXZlciBkZXZpYXRlZCBmcm9tIDEg
aW4gdGhlIHBhc3QuCisKKyAgICAgICAgLy8gUmVhZCB0aGUgc2FtcGxlcyB0aHJvdWdoIHRoZSBw
aXRjaCByZXNhbXBsZXIuICBPdXIgcHJvdmlkZUlucHV0KCkgbWV0aG9kIHdpbGwgYmUgY2FsbGVk
IGJ5IHRoZSByZXNhbXBsZXIuCisgICAgICAgIG1fcmVzYW1wbGVyLnNldFJhdGUocGl0Y2hSYXRl
KTsKKyAgICAgICAgbV9yZXNhbXBsZXIucHJvY2Vzcyh0aGlzLCBvdXRwdXRCdXMsIGZyYW1lc1Rv
UHJvY2Vzcyk7CisKKyAgICAgICAgLy8gQXBwbHkgdGhlIGdhaW4gKGluLXBsYWNlKSB0byB0aGUg
b3V0cHV0IGJ1cy4KKyAgICAgICAgZG91YmxlIHRvdGFsR2FpbiA9IGdhaW4oKS0+dmFsdWUoKSAq
IG1fYnVmZmVyLT5nYWluKCk7CisgICAgICAgIG91dHB1dEJ1cy0+Y29weVdpdGhHYWluRnJvbSgq
b3V0cHV0QnVzLCAmbV9sYXN0R2FpbiwgdG90YWxHYWluKTsKKworICAgICAgICBtX3Byb2Nlc3NM
b2NrLnVubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRvbyBiYWQgLSB0aGUgdHJ5
TG9jaygpIGZhaWxlZC4gIFdlIG11c3QgYmUgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZyBidWZm
ZXJzIGFuZCB3ZXJlIGFscmVhZHkgb3V0cHV0dGluZyBzaWxlbmNlIGFueXdheS4KKyAgICAgICAg
b3V0cHV0QnVzLT56ZXJvKCk7CisgICAgfQorfQorCisvLyBUaGUgcmVzYW1wbGVyIGNhbGxzIHVz
IGJhY2sgaGVyZSB0byBnZXQgdGhlIGlucHV0IHNhbXBsZXMgZnJvbSBvdXIgYnVmZmVyLgordm9p
ZCBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnByb3ZpZGVJbnB1dChBdWRpb0J1cyogYnVzLCBzaXpl
X3QgbnVtYmVyT2ZGcmFtZXMpCit7CisgICAgQVNTRVJUKGNvbnRleHQoKS0+aXNBdWRpb1RocmVh
ZCgpKTsKKyAgICAKKyAgICAvLyBCYXNpYyBzYW5pdHkgY2hlY2tpbmcKKyAgICBBU1NFUlQoYnVz
KTsKKyAgICBBU1NFUlQoYnVmZmVyKCkpOworICAgIGlmICghYnVzIHx8ICFidWZmZXIoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IHRoaXMtPm51
bWJlck9mQ2hhbm5lbHMoKTsKKyAgICB1bnNpZ25lZCBidXNOdW1iZXJPZkNoYW5uZWxzID0gYnVz
LT5udW1iZXJPZkNoYW5uZWxzKCk7CisKKyAgICBib29sIGNoYW5uZWxDb3VudEdvb2QgPSBudW1i
ZXJPZkNoYW5uZWxzID09IGJ1c051bWJlck9mQ2hhbm5lbHMgJiYgKG51bWJlck9mQ2hhbm5lbHMg
PT0gMSB8fCBudW1iZXJPZkNoYW5uZWxzID09IDIpOworICAgIEFTU0VSVChjaGFubmVsQ291bnRH
b29kKTsKKyAgICBpZiAoIWNoYW5uZWxDb3VudEdvb2QpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIEdldCB0aGUgZGVzdGluYXRpb24gcG9pbnRlcnMuCisgICAgZmxvYXQqIGRlc3RpbmF0aW9u
TCA9IGJ1cy0+Y2hhbm5lbCgwKS0+ZGF0YSgpOworICAgIEFTU0VSVChkZXN0aW5hdGlvbkwpOwor
ICAgIGlmICghZGVzdGluYXRpb25MKQorICAgICAgICByZXR1cm47CisgICAgZmxvYXQqIGRlc3Rp
bmF0aW9uUiA9IChudW1iZXJPZkNoYW5uZWxzIDwgMikgPyAwIDogYnVzLT5jaGFubmVsKDEpLT5k
YXRhKCk7CisKKyAgICBzaXplX3QgYnVmZmVyTGVuZ3RoID0gYnVmZmVyKCktPmxlbmd0aCgpOwor
ICAgIGRvdWJsZSBidWZmZXJTYW1wbGVSYXRlID0gYnVmZmVyKCktPnNhbXBsZVJhdGUoKTsKKwor
ICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCBmcmFtZXMgaW4gb3VyIGJ1ZmZlciB0
aGF0IHdlIHdhbnQgdG8gcGxheS4KKyAgICAvLyBJZiBtX2lzR3JhaW4gaXMgdHJ1ZSwgdGhlbiB3
ZSB3aWxsIGJlIHBsYXlpbmcgYSBwb3J0aW9uIG9mIHRoZSB0b3RhbCBidWZmZXIuCisgICAgdW5z
aWduZWQgc3RhcnRGcmFtZSA9IG1faXNHcmFpbiA/IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtX2dy
YWluT2Zmc2V0ICogYnVmZmVyU2FtcGxlUmF0ZSkgOiAwOworICAgIHVuc2lnbmVkIGVuZEZyYW1l
ID0gbV9pc0dyYWluID8gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0YXJ0RnJhbWUgKyBtX2dyYWlu
RHVyYXRpb24gKiBidWZmZXJTYW1wbGVSYXRlKSA6IGJ1ZmZlckxlbmd0aDsKKworICAgIC8vIFRo
aXMgaXMgYSBIQUNLIHRvIGFsbG93IGZvciBIUlRGIHRhaWwtdGltZSAtIGF2b2lkcyBnbGl0Y2gg
YXQgZW5kLgorICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgdGFpbFRpbWUgZm9yIGVhY2ggQXVkaW9O
b2RlIGZvciBhIG1vcmUgZ2VuZXJhbCBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0uCisgICAgaWYg
KG1faXNHcmFpbikKKyAgICAgICAgZW5kRnJhbWUgKz0gNTEyOworCisgICAgLy8gRG8gc29tZSBz
YW5pdHkgY2hlY2tpbmcuCisgICAgaWYgKHN0YXJ0RnJhbWUgPj0gYnVmZmVyTGVuZ3RoKQorICAg
ICAgICBzdGFydEZyYW1lID0gIWJ1ZmZlckxlbmd0aCA/IDAgOiBidWZmZXJMZW5ndGggLSAxOwor
ICAgIGlmIChlbmRGcmFtZSA+IGJ1ZmZlckxlbmd0aCkKKyAgICAgICAgZW5kRnJhbWUgPSBidWZm
ZXJMZW5ndGg7CisgICAgaWYgKG1fcmVhZEluZGV4ID49IGVuZEZyYW1lKQorICAgICAgICBtX3Jl
YWRJbmRleCA9IHN0YXJ0RnJhbWU7IC8vIHJlc2V0IHRvIHN0YXJ0CisgICAgCisgICAgaW50IGZy
YW1lc1RvUHJvY2VzcyA9IG51bWJlck9mRnJhbWVzOworCisgICAgLy8gSGFuZGxlIHNhbXBsZS1h
Y2N1cmF0ZSBzY2hlZHVsaW5nIHNvIHRoYXQgd2UgcGxheSB0aGUgYnVmZmVyIGF0IGEgdmVyeSBw
cmVjaXNlIHRpbWUuCisgICAgLy8gbV9zY2hlZHVsaW5nRnJhbWVEZWxheSB3aWxsIG9ubHkgYmUg
bm9uLXplcm8gdGhlIHZlcnkgZmlyc3QgdGltZSB0aGF0IHByb3ZpZGVJbnB1dCgpIGlzIGNhbGxl
ZCwgd2hpY2ggY29ycmVzcG9uZHMKKyAgICAvLyB3aXRoIHRoZSB2ZXJ5IHN0YXJ0IG9mIHRoZSBi
dWZmZXIgcGxheWJhY2suCisgICAgaWYgKG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXkgPiAwKSB7Cisg
ICAgICAgIEFTU0VSVChtX3NjaGVkdWxpbmdGcmFtZURlbGF5IDw9IGZyYW1lc1RvUHJvY2Vzcyk7
CisgICAgICAgIGlmIChtX3NjaGVkdWxpbmdGcmFtZURlbGF5IDw9IGZyYW1lc1RvUHJvY2Vzcykg
eworICAgICAgICAgICAgLy8gR2VuZXJhdGUgc2lsZW5jZSBmb3IgdGhlIGluaXRpYWwgcG9ydGlv
biBvZiB0aGUgZGVzdGluYXRpb24uCisgICAgICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25MLCAw
LCBzaXplb2YoZmxvYXQpICogbV9zY2hlZHVsaW5nRnJhbWVEZWxheSk7CisgICAgICAgICAgICBk
ZXN0aW5hdGlvbkwgKz0gbV9zY2hlZHVsaW5nRnJhbWVEZWxheTsKKyAgICAgICAgICAgIGlmIChk
ZXN0aW5hdGlvblIpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25SLCAwLCBz
aXplb2YoZmxvYXQpICogbV9zY2hlZHVsaW5nRnJhbWVEZWxheSk7CisgICAgICAgICAgICAgICAg
ZGVzdGluYXRpb25SICs9IG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXk7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIC8vIFNpbmNlIHdlIGp1c3QgZ2VuZXJhdGVkIHNpbGVuY2UgZm9yIHRoZSBp
bml0aWFsIHBvcnRpb24sIHdlIGhhdmUgZmV3ZXIgZnJhbWVzIHRvIHByb3ZpZGUuCisgICAgICAg
ICAgICBmcmFtZXNUb1Byb2Nlc3MgLT0gbV9zY2hlZHVsaW5nRnJhbWVEZWxheTsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICAvLyBXZSBoYXZlIHRvIGdlbmVyYXRlIGEgY2VydGFpbiBudW1i
ZXIgb2Ygb3V0cHV0IHNhbXBsZS1mcmFtZXMsIGJ1dCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2Fz
ZSB3aGVyZSB3ZSB3cmFwIGFyb3VuZAorICAgIC8vIGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVy
IHRvIHRoZSBzdGFydCBpZiBwbGF5aW5nIGJhY2sgd2l0aCBsb29waW5nIGFuZCBhbHNvIHRoZSBj
YXNlIHdoZXJlIHdlIHNpbXBseSByZWFjaCB0aGUKKyAgICAvLyBlbmQgb2YgdGhlIHNhbXBsZSBk
YXRhLCBidXQgaGF2ZW4ndCB5ZXQgcmVuZGVyZWQgbnVtYmVyT2ZGcmFtZXMgd29ydGggb2Ygb3V0
cHV0LgorICAgIHdoaWxlIChmcmFtZXNUb1Byb2Nlc3MgPiAwKSB7CisgICAgICAgIEFTU0VSVCht
X3JlYWRJbmRleCA8PSBlbmRGcmFtZSk7CisgICAgICAgIGlmIChtX3JlYWRJbmRleCA+IGVuZEZy
YW1lKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgCisgICAgICAgIC8vIEZpZ3Vy
ZSBvdXQgaG93IG1hbnkgZnJhbWVzIHdlIGNhbiBwcm9jZXNzIHRoaXMgdGltZS4KKyAgICAgICAg
aW50IGZyYW1lc0F2YWlsYWJsZSA9IGVuZEZyYW1lIC0gbV9yZWFkSW5kZXg7CisgICAgICAgIGlu
dCBmcmFtZXNUaGlzVGltZSA9IG1pbihmcmFtZXNUb1Byb2Nlc3MsIGZyYW1lc0F2YWlsYWJsZSk7
CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1cyBmb3IgdGhl
IHBhcnQgb2YgdGhlIGRlc3RpbmF0aW9uIHdlJ3JlIHByb2Nlc3NpbmcgdGhpcyB0aW1lLgorICAg
ICAgICBBdWRpb0J1cyBjdXJyZW50RGVzdGluYXRpb25CdXMoYnVzTnVtYmVyT2ZDaGFubmVscywg
ZnJhbWVzVGhpc1RpbWUsIGZhbHNlKTsKKyAgICAgICAgY3VycmVudERlc3RpbmF0aW9uQnVzLnNl
dENoYW5uZWxNZW1vcnkoMCwgZGVzdGluYXRpb25MLCBmcmFtZXNUaGlzVGltZSk7CisgICAgICAg
IGlmIChidXNOdW1iZXJPZkNoYW5uZWxzID4gMSkKKyAgICAgICAgICAgIGN1cnJlbnREZXN0aW5h
dGlvbkJ1cy5zZXRDaGFubmVsTWVtb3J5KDEsIGRlc3RpbmF0aW9uUiwgZnJhbWVzVGhpc1RpbWUp
OworCisgICAgICAgIC8vIEdlbmVyYXRlIG91dHB1dCBmcm9tIHRoZSBidWZmZXIuCisgICAgICAg
IHJlYWRGcm9tQnVmZmVyKCZjdXJyZW50RGVzdGluYXRpb25CdXMsIGZyYW1lc1RoaXNUaW1lKTsK
KworICAgICAgICAvLyBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXJzLgorICAgICAgICBk
ZXN0aW5hdGlvbkwgKz0gZnJhbWVzVGhpc1RpbWU7CisgICAgICAgIGlmIChidXNOdW1iZXJPZkNo
YW5uZWxzID4gMSkKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uUiArPSBmcmFtZXNUaGlzVGltZTsK
KworICAgICAgICBmcmFtZXNUb1Byb2Nlc3MgLT0gZnJhbWVzVGhpc1RpbWU7CisKKyAgICAgICAg
Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHBhcnQgb2Yg
dGhlIHNhbXBsZSBkYXRhIHdlJ3JlIHN1cHBvc2VkIHRvIHBsYXkgZm9yIHRoZSBidWZmZXIuCisg
ICAgICAgIGlmIChtX3JlYWRJbmRleCA+PSBlbmRGcmFtZSkgeworICAgICAgICAgICAgbV9yZWFk
SW5kZXggPSBzdGFydEZyYW1lOworICAgICAgICAgICAgbV9ncmFpbkZyYW1lQ291bnQgPSAwOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWxvb3BpbmcoKSkgeworICAgICAgICAgICAg
ICAgIC8vIElmIHdlJ3JlIG5vdCBsb29waW5nLCB0aGVuIHN0b3AgcGxheWluZyB3aGVuIHdlIGdl
dCB0byB0aGUgZW5kLgorICAgICAgICAgICAgICAgIG1faXNQbGF5aW5nID0gZmFsc2U7CisKKyAg
ICAgICAgICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gMCkgeworICAgICAgICAgICAgICAg
ICAgICAvLyBXZSdyZSBub3QgbG9vcGluZyBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRo
ZSBzYW1wbGUgZGF0YSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBtb3JlIG91dHB1dCwK
KyAgICAgICAgICAgICAgICAgICAgLy8gc28gZ2VuZXJhdGUgc2lsZW5jZSBmb3IgdGhlIHJlbWFp
bmluZy4KKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uTCwgMCwgc2l6ZW9m
KGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRl
c3RpbmF0aW9uUikKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0aW5hdGlvblIs
IDAsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGlmICghbV9oYXNGaW5pc2hlZCkgeworICAgICAgICAgICAgICAg
ICAgICAvLyBMZXQgdGhlIGNvbnRleHQgZGVyZWZlcmVuY2UgdGhpcyBBdWRpb05vZGUuCisgICAg
ICAgICAgICAgICAgICAgIGNvbnRleHQoKS0+bm90aWZ5Tm9kZUZpbmlzaGVkUHJvY2Vzc2luZyh0
aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbV9oYXNGaW5pc2hlZCA9IHRydWU7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnJlYWRGcm9tQnVm
ZmVyKEF1ZGlvQnVzKiBkZXN0aW5hdGlvbkJ1cywgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sK
KyAgICBib29sIGlzQnVzR29vZCA9IGRlc3RpbmF0aW9uQnVzICYmIGRlc3RpbmF0aW9uQnVzLT5s
ZW5ndGgoKSA9PSBmcmFtZXNUb1Byb2Nlc3MgJiYgZGVzdGluYXRpb25CdXMtPm51bWJlck9mQ2hh
bm5lbHMoKSA9PSBudW1iZXJPZkNoYW5uZWxzKCk7CisgICAgQVNTRVJUKGlzQnVzR29vZCk7Cisg
ICAgaWYgKCFpc0J1c0dvb2QpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICB1bnNpZ25lZCBu
dW1iZXJPZkNoYW5uZWxzID0gdGhpcy0+bnVtYmVyT2ZDaGFubmVscygpOworICAgIC8vIEZJWE1F
OiB3ZSBjYW4gYWRkIHN1cHBvcnQgZm9yIHNvdXJjZXMgd2l0aCBtb3JlIHRoYW4gdHdvIGNoYW5u
ZWxzLCBidXQgdGhpcyBpcyBub3QgYSBjb21tb24gY2FzZS4KKyAgICBib29sIGNoYW5uZWxDb3Vu
dEdvb2QgPSBudW1iZXJPZkNoYW5uZWxzID09IDEgfHwgbnVtYmVyT2ZDaGFubmVscyA9PSAyOwor
ICAgIEFTU0VSVChjaGFubmVsQ291bnRHb29kKTsKKyAgICBpZiAoIWNoYW5uZWxDb3VudEdvb2Qp
CisgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgIC8vIEdldCBwb2ludGVycyB0byB0
aGUgc3RhcnQgb2YgdGhlIHNhbXBsZSBidWZmZXIuCisgICAgZmxvYXQqIHNvdXJjZUwgPSBtX2J1
ZmZlci0+Z2V0Q2hhbm5lbERhdGEoMCktPmRhdGEoKTsKKyAgICBmbG9hdCogc291cmNlUiA9IG1f
YnVmZmVyLT5udW1iZXJPZkNoYW5uZWxzKCkgPT0gMiA/IG1fYnVmZmVyLT5nZXRDaGFubmVsRGF0
YSgxKS0+ZGF0YSgpIDogMDsKKyAgICBib29sIGlzU291cmNlR29vZCA9IHNvdXJjZUwgJiYgKG51
bWJlck9mQ2hhbm5lbHMgPT0gMSB8fCBzb3VyY2VSKTsKKyAgICBBU1NFUlQoaXNTb3VyY2VHb29k
KTsKKyAgICBpZiAoIWlzU291cmNlR29vZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gT2Zm
c2V0IHRoZSBwb2ludGVycyB0byB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIGluIHRoZSBzYW1w
bGUgYnVmZmVyLgorICAgIHNvdXJjZUwgKz0gbV9yZWFkSW5kZXg7CisgICAgc291cmNlUiArPSBt
X3JlYWRJbmRleDsKKworICAgIC8vIEdldCBwb2ludGVycyB0byB0aGUgZGVzdGluYXRpb24uCisg
ICAgZmxvYXQqIGRlc3RpbmF0aW9uTCA9IGRlc3RpbmF0aW9uQnVzLT5jaGFubmVsKDApLT5kYXRh
KCk7CisgICAgZmxvYXQqIGRlc3RpbmF0aW9uUiA9IG51bWJlck9mQ2hhbm5lbHMgPT0gMiA/IGRl
c3RpbmF0aW9uQnVzLT5jaGFubmVsKDEpLT5kYXRhKCkgOiAwOworICAgIGJvb2wgaXNEZXN0aW5h
dGlvbkdvb2QgPSBkZXN0aW5hdGlvbkwgJiYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMSB8fCBkZXN0
aW5hdGlvblIpOworICAgIEFTU0VSVChpc0Rlc3RpbmF0aW9uR29vZCk7CisgICAgaWYgKCFpc0Rl
c3RpbmF0aW9uR29vZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1faXNHcmFpbikKKyAg
ICAgICAgcmVhZEZyb21CdWZmZXJXaXRoR3JhaW5FbnZlbG9wZShzb3VyY2VMLCBzb3VyY2VSLCBk
ZXN0aW5hdGlvbkwsIGRlc3RpbmF0aW9uUiwgZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICBlbHNlIHsK
KyAgICAgICAgLy8gU2ltcGx5IGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciB0
byB0aGUgZGVzdGluYXRpb24uCisgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbkwsIHNvdXJjZUws
IHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICBpZiAobnVtYmVyT2ZD
aGFubmVscyA9PSAyKQorICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uUiwgc291cmNlUiwg
c2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgfQorCisgICAgLy8gQWR2YW5j
ZSB0aGUgYnVmZmVyJ3MgcmVhZCBpbmRleC4KKyAgICBtX3JlYWRJbmRleCArPSBmcmFtZXNUb1By
b2Nlc3M7Cit9CisKK3ZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpyZWFkRnJvbUJ1ZmZlcldp
dGhHcmFpbkVudmVsb3BlKGZsb2F0KiBzb3VyY2VMLCBmbG9hdCogc291cmNlUiwgZmxvYXQqIGRl
c3RpbmF0aW9uTCwgZmxvYXQqIGRlc3RpbmF0aW9uUiwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykK
K3sKKyAgICBBU1NFUlQoc291cmNlTCAmJiBkZXN0aW5hdGlvbkwpOworICAgIGlmICghc291cmNl
TCB8fCAhZGVzdGluYXRpb25MKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIGludCBn
cmFpbkZyYW1lTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihtX2dyYWluRHVyYXRpb24gKiBtX2J1
ZmZlci0+c2FtcGxlUmF0ZSgpKTsKKyAgICBib29sIGlzU3RlcmVvID0gc291cmNlUiAmJiBkZXN0
aW5hdGlvblI7CisgICAgCisgICAgaW50IG4gPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgd2hpbGUg
KG4tLSkgeworICAgICAgICAvLyBBcHBseSB0aGUgZ3JhaW4gZW52ZWxvcGUuCisgICAgICAgIGZs
b2F0IHggPSBzdGF0aWNfY2FzdDxmbG9hdD4obV9ncmFpbkZyYW1lQ291bnQpIC8gc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGdyYWluRnJhbWVMZW5ndGgpOworICAgICAgICBtX2dyYWluRnJhbWVDb3VudCsr
OworCisgICAgICAgIHggPSBtaW4oMS4wZiwgeCk7CisgICAgICAgIGZsb2F0IGdyYWluRW52ZWxv
cGUgPSBzaW5mKE1fUEkgKiB4KTsKKyAgICAgICAgCisgICAgICAgICpkZXN0aW5hdGlvbkwrKyA9
IGdyYWluRW52ZWxvcGUgKiAqc291cmNlTCsrOworCisgICAgICAgIGlmIChpc1N0ZXJlbykKKyAg
ICAgICAgICAgICpkZXN0aW5hdGlvblIrKyA9IGdyYWluRW52ZWxvcGUgKiAqc291cmNlUisrOwor
ICAgIH0KK30KKwordm9pZCBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnJlc2V0KCkKK3sKKyAgICBt
X3Jlc2FtcGxlci5yZXNldCgpOworICAgIG1fcmVhZEluZGV4ID0gMDsKKyAgICBtX2dyYWluRnJh
bWVDb3VudCA9IDA7CisgICAgbV9sYXN0R2FpbiA9IGdhaW4oKS0+dmFsdWUoKTsKK30KKwordm9p
ZCBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnNldEJ1ZmZlcihBdWRpb0J1ZmZlciogYnVmZmVyKQor
eworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgCisgICAgLy8gVGhlIGNvbnRleHQg
bXVzdCBiZSBsb2NrZWQgc2luY2UgY2hhbmdpbmcgdGhlIGJ1ZmZlciBjYW4gcmUtY29uZmlndXJl
IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCBhcmUgb3V0cHV0LgorICAgIEF1ZGlvQ29udGV4
dDo6QXV0b0xvY2tlciBjb250ZXh0TG9ja2VyKGNvbnRleHQoKSk7CisgICAgCisgICAgLy8gVGhp
cyBzeW5jaHJvbml6ZXMgd2l0aCBwcm9jZXNzKCkuCisgICAgTXV0ZXhMb2NrZXIgcHJvY2Vzc0xv
Y2tlcihtX3Byb2Nlc3NMb2NrKTsKKyAgICAKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIC8v
IERvIGFueSBuZWNlc3NzYXJ5IHJlLWNvbmZpZ3VyYXRpb24gdG8gdGhlIGJ1ZmZlcidzIG51bWJl
ciBvZiBjaGFubmVscy4KKyAgICAgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IGJ1ZmZl
ci0+bnVtYmVyT2ZDaGFubmVscygpOworICAgICAgICBtX3Jlc2FtcGxlci5jb25maWd1cmVDaGFu
bmVscyhudW1iZXJPZkNoYW5uZWxzKTsKKyAgICAgICAgb3V0cHV0KDApLT5zZXROdW1iZXJPZkNo
YW5uZWxzKG51bWJlck9mQ2hhbm5lbHMpOworICAgIH0KKworICAgIG1fcmVhZEluZGV4ID0gMDsK
KyAgICBtX2J1ZmZlciA9IGJ1ZmZlcjsKK30KKwordW5zaWduZWQgQXVkaW9CdWZmZXJTb3VyY2VO
b2RlOjpudW1iZXJPZkNoYW5uZWxzKCkKK3sKKyAgICByZXR1cm4gb3V0cHV0KDApLT5udW1iZXJP
ZkNoYW5uZWxzKCk7Cit9CisKK3ZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpub3RlT24oZG91
YmxlIHdoZW4pCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAobV9pc1Bs
YXlpbmcpCisgICAgICAgIHJldHVybjsKKworICAgIG1faXNHcmFpbiA9IGZhbHNlOworICAgIG1f
c3RhcnRUaW1lID0gd2hlbjsKKyAgICBtX3JlYWRJbmRleCA9IDA7CisgICAgbV9pc1BsYXlpbmcg
PSB0cnVlOworfQorCit2b2lkIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6bm90ZUdyYWluT24oZG91
YmxlIHdoZW4sIGRvdWJsZSBncmFpbk9mZnNldCwgZG91YmxlIGdyYWluRHVyYXRpb24pCit7Cisg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAobV9pc1BsYXlpbmcpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmICghYnVmZmVyKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgICAg
CisgICAgLy8gRG8gc2FuaXR5IGNoZWNraW5nIG9mIGdyYWluIHBhcmFtZXRlcnMgdmVyc3VzIGJ1
ZmZlciBzaXplLgorICAgIGRvdWJsZSBidWZmZXJEdXJhdGlvbiA9IGJ1ZmZlcigpLT5kdXJhdGlv
bigpOworCisgICAgaWYgKGdyYWluRHVyYXRpb24gPiBidWZmZXJEdXJhdGlvbikKKyAgICAgICAg
cmV0dXJuOyAvLyBGSVhNRTogbWF5YmUgc2hvdWxkIHRocm93IGV4Y2VwdGlvbiAtIGNvbnNpZGVy
IGluIHNwZWNpZmljYXRpb24uCisgICAgCisgICAgZG91YmxlIG1heEdyYWluT2Zmc2V0ID0gYnVm
ZmVyRHVyYXRpb24gLSBncmFpbkR1cmF0aW9uOworICAgIG1heEdyYWluT2Zmc2V0ID0gbWF4KDAu
MCwgbWF4R3JhaW5PZmZzZXQpOworCisgICAgZ3JhaW5PZmZzZXQgPSBtYXgoMC4wLCBncmFpbk9m
ZnNldCk7CisgICAgZ3JhaW5PZmZzZXQgPSBtaW4obWF4R3JhaW5PZmZzZXQsIGdyYWluT2Zmc2V0
KTsgICAgCisgICAgbV9ncmFpbk9mZnNldCA9IGdyYWluT2Zmc2V0OworCisgICAgbV9ncmFpbkR1
cmF0aW9uID0gZ3JhaW5EdXJhdGlvbjsKKyAgICBtX2dyYWluRnJhbWVDb3VudCA9IDA7CisgICAg
CisgICAgbV9pc0dyYWluID0gdHJ1ZTsKKyAgICBtX3N0YXJ0VGltZSA9IHdoZW47CisgICAgbV9y
ZWFkSW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KG1fZ3JhaW5PZmZzZXQgKiBidWZmZXIoKS0+c2Ft
cGxlUmF0ZSgpKTsKKyAgICBtX2lzUGxheWluZyA9IHRydWU7Cit9CisKK3ZvaWQgQXVkaW9CdWZm
ZXJTb3VyY2VOb2RlOjpub3RlT2ZmKGRvdWJsZSAvKndoZW4qLykKK3sKKyAgICBBU1NFUlQoaXNN
YWluVGhyZWFkKCkpOworICAgIGlmICghbV9pc1BsYXlpbmcpCisgICAgICAgIHJldHVybjsKKyAg
ICAgICAgCisgICAgLy8gRklYTUU6IHdoZW4gaXMgaWdub3JlZC4KKyAgICBtX2lzUGxheWluZyA9
IGZhbHNlOworICAgIG1fcmVhZEluZGV4ID0gMDsKK30KKworZG91YmxlIEF1ZGlvQnVmZmVyU291
cmNlTm9kZTo6dG90YWxQaXRjaFJhdGUoKQoreworICAgIGRvdWJsZSBkb3BwbGVyUmF0ZSA9IDEu
MDsKKyAgICBpZiAobV9wYW5uZXJOb2RlLmdldCgpKQorICAgICAgICBkb3BwbGVyUmF0ZSA9IG1f
cGFubmVyTm9kZS0+ZG9wcGxlclJhdGUoKTsKKyAgICAKKyAgICAvLyBJbmNvcnBvcmF0ZSBidWZm
ZXIncyBzYW1wbGUtcmF0ZSB2ZXJzdXMgQXVkaW9Db250ZXh0J3Mgc2FtcGxlLXJhdGUuCisgICAg
Ly8gTm9ybWFsbHkgaXQncyBub3QgYW4gaXNzdWUgYmVjYXVzZSBidWZmZXJzIGFyZSBsb2FkZWQg
YXQgdGhlIEF1ZGlvQ29udGV4dCdzIHNhbXBsZS1yYXRlLCBidXQgd2UgY2FuIGhhbmRsZSBpdCBp
biBhbnkgY2FzZS4KKyAgICBkb3VibGUgc2FtcGxlUmF0ZUZhY3RvciA9IDEuMDsKKyAgICBpZiAo
YnVmZmVyKCkpCisgICAgICAgIHNhbXBsZVJhdGVGYWN0b3IgPSBidWZmZXIoKS0+c2FtcGxlUmF0
ZSgpIC8gc2FtcGxlUmF0ZSgpOworICAgIAorICAgIGRvdWJsZSBiYXNlUGl0Y2hSYXRlID0gcGxh
eWJhY2tSYXRlKCktPnZhbHVlKCk7CisKKyAgICBkb3VibGUgdG90YWxSYXRlID0gZG9wcGxlclJh
dGUgKiBzYW1wbGVSYXRlRmFjdG9yICogYmFzZVBpdGNoUmF0ZTsKKworICAgIC8vIFNhbml0eSBj
aGVjayB0aGUgdG90YWwgcmF0ZS4gIEl0J3MgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgcmVzYW1w
bGVyIG5vdCBnZXQgYW55IGJhZCByYXRlIHZhbHVlcy4KKyAgICB0b3RhbFJhdGUgPSBtYXgoMC4w
LCB0b3RhbFJhdGUpOworICAgIHRvdGFsUmF0ZSA9IG1pbihBdWRpb1Jlc2FtcGxlcjo6TWF4UmF0
ZSwgdG90YWxSYXRlKTsKKyAgICAKKyAgICBib29sIGlzVG90YWxSYXRlVmFsaWQgPSAhaXNuYW4o
dG90YWxSYXRlKSAmJiAhaXNpbmYodG90YWxSYXRlKTsKKyAgICBBU1NFUlQoaXNUb3RhbFJhdGVW
YWxpZCk7CisgICAgaWYgKCFpc1RvdGFsUmF0ZVZhbGlkKQorICAgICAgICB0b3RhbFJhdGUgPSAx
LjA7CisgICAgCisgICAgcmV0dXJuIHRvdGFsUmF0ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvd2ViYXVk
aW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRp
by9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvd2ViYXVk
aW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTUwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwor
ICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBBdWRpb0J1ZmZlclNvdXJjZU5vZGVfaAorI2RlZmluZSBB
dWRpb0J1ZmZlclNvdXJjZU5vZGVfaAorCisjaW5jbHVkZSAiQXVkaW9CdWZmZXIuaCIKKyNpbmNs
dWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlv
UGFubmVyTm9kZS5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAiQXVk
aW9Tb3VyY2VOb2RlLmgiCisjaW5jbHVkZSAiQXVkaW9Tb3VyY2VQcm92aWRlci5oIgorI2luY2x1
ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUg
PHd0Zi9UaHJlYWRpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBdWRpb0Nv
bnRleHQ7CisKKy8vIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBpcyBhbiBBdWRpb05vZGUgcmVwcmVz
ZW50aW5nIGFuIGF1ZGlvIHNvdXJjZSBmcm9tIGFuIGluLW1lbW9yeSBhdWRpbyBhc3NldCByZXBy
ZXNlbnRlZCBieSBhbiBBdWRpb0J1ZmZlci4KKy8vIEl0IGdlbmVyYWxseSB3aWxsIGJlIHVzZWQg
Zm9yIHNob3J0IHNvdW5kcyB3aGljaCByZXF1aXJlIGEgaGlnaCBkZWdyZWUgb2Ygc2NoZWR1bGlu
ZyBmbGV4aWJpbGl0eSAoY2FuIHBsYXliYWNrIGluIHJoeXRobWljYWxseSBwZXJmZWN0IHdheXMp
LgorCitjbGFzcyBBdWRpb0J1ZmZlclNvdXJjZU5vZGUgOiBwdWJsaWMgQXVkaW9Tb3VyY2VOb2Rl
LCBwdWJsaWMgQXVkaW9Tb3VyY2VQcm92aWRlciB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8QXVkaW9CdWZmZXJTb3VyY2VOb2RlPiBjcmVhdGUoQXVkaW9Db250ZXh0KiBjb250ZXh0
LCBkb3VibGUgc2FtcGxlUmF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
QXVkaW9CdWZmZXJTb3VyY2VOb2RlKGNvbnRleHQsIHNhbXBsZVJhdGUpKTsKKyAgICB9CisKKyAg
ICB2aXJ0dWFsIH5BdWRpb0J1ZmZlclNvdXJjZU5vZGUoKTsKKyAgICAKKyAgICAvLyBBdWRpb05v
ZGUKKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIEF1ZGlvU291cmNlUHJvdmlkZXIKKyAg
ICAvLyBXaGVuIHByb2Nlc3MoKSBpcyBjYWxsZWQsIHRoZSByZXNhbXBsZXIgY2FsbHMgcHJvdmlk
ZUlucHV0IChpbiB0aGUgYXVkaW8gdGhyZWFkKSB0byBnZXRzIGl0cyBpbnB1dCBzdHJlYW0uCisg
ICAgdmlydHVhbCB2b2lkIHByb3ZpZGVJbnB1dChBdWRpb0J1cyosIHNpemVfdCBudW1iZXJPZkZy
YW1lcyk7CisgICAgCisgICAgLy8gc2V0QnVmZmVyKCkgaXMgY2FsbGVkIG9uIHRoZSBtYWluIHRo
cmVhZC4gIFRoaXMgaXMgdGhlIGJ1ZmZlciB3ZSB1c2UgZm9yIHBsYXliYWNrLgorICAgIHZvaWQg
c2V0QnVmZmVyKEF1ZGlvQnVmZmVyKik7CisgICAgQXVkaW9CdWZmZXIqIGJ1ZmZlcigpIHsgcmV0
dXJuIG1fYnVmZmVyLmdldCgpOyB9CisgICAgICAgICAgICAgICAgICAgIAorICAgIC8vIG51bWJl
ck9mQ2hhbm5lbHMoKSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiAgVGhp
cyB2YWx1ZSBlcXVhbHMgdGhlIG51bWJlciBvZiBjaGFubmVscyBmcm9tIHRoZSBidWZmZXIuCisg
ICAgLy8gSWYgYSBuZXcgYnVmZmVyIGlzIHNldCB3aXRoIGEgZGlmZmVyZW50IG51bWJlciBvZiBj
aGFubmVscywgdGhlbiB0aGlzIHZhbHVlIHdpbGwgZHluYW1pY2FsbHkgY2hhbmdlLgorICAgIHVu
c2lnbmVkIG51bWJlck9mQ2hhbm5lbHMoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgLy8g
UGxheS1zdGF0ZQorICAgIC8vIG5vdGVPbigpLCBub3RlR3JhaW5PbigpLCBhbmQgbm90ZU9mZigp
IG11c3QgYWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICB2b2lkIG5vdGVP
bihkb3VibGUgd2hlbik7CisgICAgdm9pZCBub3RlR3JhaW5Pbihkb3VibGUgd2hlbiwgZG91Ymxl
IGdyYWluT2Zmc2V0LCBkb3VibGUgZ3JhaW5EdXJhdGlvbik7CisgICAgdm9pZCBub3RlT2ZmKGRv
dWJsZSB3aGVuKTsKKworICAgIGJvb2wgbG9vcGluZygpIGNvbnN0IHsgcmV0dXJuIG1faXNMb29w
aW5nOyB9CisgICAgdm9pZCBzZXRMb29waW5nKGJvb2wgbG9vcGluZykgeyBtX2lzTG9vcGluZyA9
IGxvb3Bpbmc7IH0KKyAgICAKKyAgICBBdWRpb0dhaW4qIGdhaW4oKSB7IHJldHVybiBtX2dhaW4u
Z2V0KCk7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgQXVk
aW9QYXJhbSogcGxheWJhY2tSYXRlKCkgeyByZXR1cm4gbV9wbGF5YmFja1JhdGUuZ2V0KCk7IH0K
KworICAgIC8vIElmIGEgcGFubmVyIG5vZGUgaXMgc2V0LCB0aGVuIHdlIGNhbiBpbmNvcnBvcmF0
ZSBkb3BwbGVyIHNoaWZ0IGludG8gdGhlIHBsYXliYWNrIHBpdGNoIHJhdGUuCisgICAgdm9pZCBz
ZXRQYW5uZXJOb2RlKFBhc3NSZWZQdHI8QXVkaW9QYW5uZXJOb2RlPiBwYW5uZXJOb2RlKSB7IG1f
cGFubmVyTm9kZSA9IHBhbm5lck5vZGU7IH0KKworcHJpdmF0ZToKKyAgICBBdWRpb0J1ZmZlclNv
dXJjZU5vZGUoQXVkaW9Db250ZXh0KiwgZG91YmxlIHNhbXBsZVJhdGUpOworCisgICAgLy8gbV9i
dWZmZXIgaG9sZHMgdGhlIHNhbXBsZSBkYXRhIHdoaWNoIHRoaXMgbm9kZSBvdXRwdXRzLgorICAg
IFJlZlB0cjxBdWRpb0J1ZmZlcj4gbV9idWZmZXI7CisKKyAgICAvLyBVc2VkIGZvciB0aGUgImdh
aW4iIGFuZCAicGxheWJhY2tSYXRlIiBhdHRyaWJ1dGVzLgorICAgIFJlZlB0cjxBdWRpb0dhaW4+
IG1fZ2FpbjsKKyAgICBSZWZQdHI8QXVkaW9QYXJhbT4gbV9wbGF5YmFja1JhdGU7CisKKyAgICAv
LyBtX2lzUGxheWluZyBpcyBzZXQgdG8gdHJ1ZSB3aGVuIG5vdGVPbigpIG9yIG5vdGVHcmFpbk9u
KCkgaXMgY2FsbGVkLgorICAgIGJvb2wgbV9pc1BsYXlpbmc7CisKKyAgICAvLyBJZiBtX2lzTG9v
cGluZyBpcyBmYWxzZSwgdGhlbiB0aGlzIG5vZGUgd2lsbCBiZSBkb25lIHBsYXlpbmcgYW5kIGJl
Y29tZSBpbmFjdGl2ZSBhZnRlciBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHNhbXBsZSBkYXRh
IGluIHRoZSBidWZmZXIuCisgICAgLy8gSWYgdHJ1ZSwgaXQgd2lsbCB3cmFwIGFyb3VuZCB0byB0
aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciBlYWNoIHRpbWUgaXQgcmVhY2hlcyB0aGUgZW5kLgorICAg
IGJvb2wgbV9pc0xvb3Bpbmc7CisKKyAgICAvLyBUaGlzIG5vZGUgaXMgY29uc2lkZXJlZCBmaW5p
c2hlZCB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyJ3Mgc2FtcGxlIGRhdGEg
YWZ0ZXIgbm90ZU9uKCkgaGFzIGJlZW4gY2FsbGVkLgorICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJl
IHNldCB0byB0cnVlIGlmIG1faXNMb29waW5nID09IGZhbHNlLgorICAgIGJvb2wgbV9oYXNGaW5p
c2hlZDsKKworICAgIC8vIG1fc3RhcnRUaW1lIGlzIHRoZSB0aW1lIHRvIHN0YXJ0IHBsYXlpbmcg
YmFzZWQgb24gdGhlIGNvbnRleHQncyB0aW1lbGluZSAoMC4wIG9yIGEgdGltZSBsZXNzIHRoYW4g
dGhlIGNvbnRleHQncyBjdXJyZW50IHRpbWUgbWVhbnMgIm5vdyIpLgorICAgIGRvdWJsZSBtX3N0
YXJ0VGltZTsgLy8gaW4gc2Vjb25kcworCisgICAgLy8gbV9zY2hlZHVsaW5nRnJhbWVEZWxheSBp
cyB0aGUgc2FtcGxlLWFjY3VyYXRlIHNjaGVkdWxpbmcgb2Zmc2V0LgorICAgIC8vIEl0J3MgdXNl
ZCBzbyB0aGF0IHdlIHN0YXJ0IHJlbmRlcmluZyBhdWRpbyBzYW1wbGVzIGF0IGEgdmVyeSBwcmVj
aXNlIHBvaW50IGluIHRpbWUuCisgICAgLy8gSXQgd2lsbCBvbmx5IGJlIGEgbm9uLXplcm8gdmFs
dWUgdGhlIHZlcnkgZmlyc3QgcmVuZGVyIHF1YW50dW0gdGhhdCB3ZSByZW5kZXIgZnJvbSB0aGUg
YnVmZmVyLgorICAgIGludCBtX3NjaGVkdWxpbmdGcmFtZURlbGF5OworCisgICAgLy8gbV9yZWFk
SW5kZXggaXMgYSBzYW1wbGUtZnJhbWUgaW5kZXggaW50byBvdXIgYnVmZmVyIHJlcHJlc2VudGlu
ZyB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbi4KKyAgICB1bnNpZ25lZCBtX3JlYWRJbmRl
eDsKKworICAgIC8vIEdyYW51bGFyIHBsYXliYWNrCisgICAgYm9vbCBtX2lzR3JhaW47CisgICAg
ZG91YmxlIG1fZ3JhaW5PZmZzZXQ7IC8vIGluIHNlY29uZHMKKyAgICBkb3VibGUgbV9ncmFpbkR1
cmF0aW9uOyAvLyBpbiBzZWNvbmRzCisgICAgaW50IG1fZ3JhaW5GcmFtZUNvdW50OyAvLyBrZWVw
cyB0cmFjayBvZiB3aGljaCBmcmFtZSBpbiB0aGUgZ3JhaW4gd2UncmUgY3VycmVudGx5IHJlbmRl
cmluZworCisgICAgLy8gdG90YWxQaXRjaFJhdGUoKSByZXR1cm5zIHRoZSBpbnN0YW50YW5lb3Vz
IHBpdGNoIHJhdGUgKG5vbi10aW1lIHByZXNlcnZpbmcpLgorICAgIC8vIEl0IGluY29ycG9yYXRl
cyB0aGUgYmFzZSBwaXRjaCByYXRlLCBhbnkgc2FtcGxlLXJhdGUgY29udmVyc2lvbiBmYWN0b3Ig
ZnJvbSB0aGUgYnVmZmVyLCBhbmQgYW55IGRvcHBsZXIgc2hpZnQgZnJvbSBhbiBhc3NvY2lhdGVk
IHBhbm5lciBub2RlLgorICAgIGRvdWJsZSB0b3RhbFBpdGNoUmF0ZSgpOworCisgICAgLy8gbV9y
ZXNhbXBsZXIgcGVyZm9ybXMgdGhlIHBpdGNoIHJhdGUgY2hhbmdlcyB0byB0aGUgYnVmZmVyIHBs
YXliYWNrLgorICAgIEF1ZGlvUmVzYW1wbGVyIG1fcmVzYW1wbGVyOworCisgICAgLy8gbV9sYXN0
R2FpbiBwcm92aWRlcyBjb250aW51aXR5IHdoZW4gd2UgZHluYW1pY2FsbHkgYWRqdXN0IHRoZSBn
YWluLgorICAgIGRvdWJsZSBtX2xhc3RHYWluOworICAgIAorICAgIC8vIFdlIG9wdGlvbmFsbHkg
a2VlcCB0cmFjayBvZiBhIHBhbm5lciBub2RlIHdoaWNoIGhhcyBhIGRvcHBsZXIgc2hpZnQgdGhh
dCBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgcGl0Y2ggcmF0ZS4KKyAgICBSZWZQdHI8QXVkaW9Q
YW5uZXJOb2RlPiBtX3Bhbm5lck5vZGU7CisKKyAgICAvLyBUaGlzIHN5bmNocm9uaXplcyBwcm9j
ZXNzKCkgd2l0aCBzZXRCdWZmZXIoKSB3aGljaCBjYW4gY2F1c2UgZHluYW1pYyBjaGFubmVsIGNv
dW50IGNoYW5nZXMuCisgICAgbXV0YWJsZSBNdXRleCBtX3Byb2Nlc3NMb2NrOworCisgICAgLy8g
UmVhZHMgdGhlIG5leHQgZnJhbWVzVG9Qcm9jZXNzIHNhbXBsZS1mcmFtZXMgZnJvbSB0aGUgQXVk
aW9CdWZmZXIgaW50byBkZXN0aW5hdGlvbkJ1cy4KKyAgICAvLyBBIGdyYWluIGVudmVsb3BlIHdp
bGwgYmUgYXBwbGllZCBpZiBtX2lzR3JhaW4gaXMgc2V0IHRvIHRydWUuCisgICAgdm9pZCByZWFk
RnJvbUJ1ZmZlcihBdWRpb0J1cyogZGVzdGluYXRpb25CdXMsIHNpemVfdCBmcmFtZXNUb1Byb2Nl
c3MpOworCisgICAgLy8gcmVhZEZyb21CdWZmZXJXaXRoR3JhaW5FbnZlbG9wZSgpIGlzIGEgbG93
LWxldmVsIGJsaXR0ZXIgd2hpY2ggcmVhZHMgZnJvbSB0aGUgQXVkaW9CdWZmZXIgYW5kIGFwcGxp
ZXMgYSBncmFpbiBlbnZlbG9wZS4KKyAgICB2b2lkIHJlYWRGcm9tQnVmZmVyV2l0aEdyYWluRW52
ZWxvcGUoZmxvYXQqIHNvdXJjZUwsIGZsb2F0KiBzb3VyY2VSLCBmbG9hdCogZGVzdGluYXRpb25M
LCBmbG9hdCogZGVzdGluYXRpb25SLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKK307CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEF1ZGlvQnVmZmVyU291cmNlTm9kZV9o
CkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5pZGwKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuaWRsCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuaWRsCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbW9kdWxlIGF1ZGlvIHsK
KyAgICAvLyBBIGNhY2hlZCAobm9uLXN0cmVhbWVkKSwgbWVtb3J5LXJlc2lkZW50IGF1ZGlvIHNv
dXJjZQorICAgIGludGVyZmFjZSBbCisgICAgICAgIENvbmRpdGlvbmFsPVdFQl9BVURJTywKKyAg
ICAgICAgR2VuZXJhdGVUb0pTCisgICAgXSBBdWRpb0J1ZmZlclNvdXJjZU5vZGUgOiBBdWRpb1Nv
dXJjZU5vZGUgeworICAgICAgICBhdHRyaWJ1dGUgW0N1c3RvbV0gQXVkaW9CdWZmZXIgYnVmZmVy
OworCisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBdWRpb0dhaW4gZ2FpbjsKKyAgICAgICAg
cmVhZG9ubHkgYXR0cmlidXRlIEF1ZGlvUGFyYW0gcGxheWJhY2tSYXRlOworICAgICAgICBhdHRy
aWJ1dGUgYm9vbGVhbiBsb29waW5nOyAvLyBGSVhNRTogY2hhbmdlIG5hbWUgdG8gJ2xvb3AnIG9u
Y2Ugc2FtcGxlcyBhcmUgdXBkYXRlZAorCisgICAgICAgIHZvaWQgbm90ZU9uKGluIGZsb2F0IHdo
ZW4pOworICAgICAgICB2b2lkIG5vdGVHcmFpbk9uKGluIGZsb2F0IHdoZW4sIGluIGZsb2F0IGdy
YWluT2Zmc2V0LCBpbiBmbG9hdCBncmFpbkR1cmF0aW9uKTsKKyAgICAgICAgdm9pZCBub3RlT2Zm
KGluIGZsb2F0IHdoZW4pOworICAgIH07Cit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72734</attachid>
            <date>2010-11-02 14:13:08 -0700</date>
            <delta_ts>2010-11-02 19:35:57 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-48012-20101102141307.patch</filename>
            <type>text/plain</type>
            <size>29049</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MTE2NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzYgQEAKKzIwMTAtMTEtMDIgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD00ODAxMgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5j
ZSBhdWRpbyBBUEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlv
L0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9CdWZmZXJTb3VyY2VOb2RlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdWZm
ZXJTb3VyY2VOb2RlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjp+QXVkaW9CdWZmZXJTb3VyY2VOb2RlKToKKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnByb3ZpZGVJbnB1dCk6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnJlYWRGcm9tQnVmZmVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6cmVhZEZyb21CdWZmZXJXaXRoR3JhaW5FbnZl
bG9wZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnJlc2V0KToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6c2V0QnVmZmVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6bnVtYmVyT2ZDaGFubmVscyk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6Om5vdGVPbik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6Om5vdGVHcmFpbk9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvQnVmZmVyU291cmNlTm9kZTo6bm90ZU9mZik6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnRvdGFsUGl0Y2hSYXRlKToKKyAgICAgICAg
KiB3ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0J1ZmZlclNvdXJjZU5vZGU6Omxvb3BpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9C
dWZmZXJTb3VyY2VOb2RlOjpzZXRMb29waW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVm
ZmVyU291cmNlTm9kZTo6Z2Fpbik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJj
ZU5vZGU6OnBsYXliYWNrUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJj
ZU5vZGU6OnNldFBhbm5lck5vZGUpOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvQnVmZmVyU291
cmNlTm9kZS5pZGw6IEFkZGVkLgorCiAyMDEwLTEwLTI4ICBaaGVueWFvIE1vICA8em1vQGdvb2ds
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSdXNzZWxsLgpJbmRleDogV2Vi
Q29yZS93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNp
ZiBFTkFCTEUoV0VCX0FVRElPKQorCisjaW5jbHVkZSAiQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmgi
CisKKyNpbmNsdWRlICJBdWRpb0NvbnRleHQuaCIKKyNpbmNsdWRlICJBdWRpb05vZGVPdXRwdXQu
aCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY29uc3QgZG91YmxlIERlZmF1bHRHcmFpbkR1cmF0aW9uID0gMC4w
MjA7IC8vIDIwbXMKKworUGFzc1JlZlB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IEF1ZGlvQnVm
ZmVyU291cmNlTm9kZTo6Y3JlYXRlKEF1ZGlvQ29udGV4dCogY29udGV4dCwgZG91YmxlIHNhbXBs
ZVJhdGUpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBBdWRpb0J1ZmZlclNvdXJjZU5vZGUo
Y29udGV4dCwgc2FtcGxlUmF0ZSkpOworfQorCitBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OkF1ZGlv
QnVmZmVyU291cmNlTm9kZShBdWRpb0NvbnRleHQqIGNvbnRleHQsIGRvdWJsZSBzYW1wbGVSYXRl
KQorICAgIDogQXVkaW9Tb3VyY2VOb2RlKGNvbnRleHQsIHNhbXBsZVJhdGUpCisgICAgLCBtX2J1
ZmZlcigwKQorICAgICwgbV9pc1BsYXlpbmcoZmFsc2UpCisgICAgLCBtX2lzTG9vcGluZyhmYWxz
ZSkKKyAgICAsIG1faGFzRmluaXNoZWQoZmFsc2UpCisgICAgLCBtX3N0YXJ0VGltZSgwLjApCisg
ICAgLCBtX3NjaGVkdWxpbmdGcmFtZURlbGF5KDApCisgICAgLCBtX3JlYWRJbmRleCgwKQorICAg
ICwgbV9pc0dyYWluKGZhbHNlKQorICAgICwgbV9ncmFpbk9mZnNldCgwLjApCisgICAgLCBtX2dy
YWluRHVyYXRpb24oRGVmYXVsdEdyYWluRHVyYXRpb24pCisgICAgLCBtX2dyYWluRnJhbWVDb3Vu
dCgwKQorICAgICwgbV9sYXN0R2FpbigxLjApCisgICAgLCBtX3Bhbm5lck5vZGUoMCkKK3sKKyAg
ICBzZXRUeXBlKE5vZGVUeXBlQXVkaW9CdWZmZXJTb3VyY2UpOworCisgICAgbV9nYWluID0gQXVk
aW9HYWluOjpjcmVhdGUoImdhaW4iLCAxLjAsIDAuMCwgMS4wKTsKKyAgICBtX3BsYXliYWNrUmF0
ZSA9IEF1ZGlvUGFyYW06OmNyZWF0ZSgicGxheWJhY2tSYXRlIiwgMS4wLCAwLjAsIEF1ZGlvUmVz
YW1wbGVyOjpNYXhSYXRlKTsKKworICAgIC8vIERlZmF1bHQgdG8gbW9uby4gIEEgY2FsbCB0byBz
ZXRCdWZmZXIoKSB3aWxsIHNldCB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyB0byB0aGF0
IG9mIHRoZSBidWZmZXIuCisgICAgYWRkT3V0cHV0KGFkb3B0UHRyKG5ldyBBdWRpb05vZGVPdXRw
dXQodGhpcywgMSkpKTsKKworICAgIGluaXRpYWxpemUoKTsKK30KKworQXVkaW9CdWZmZXJTb3Vy
Y2VOb2RlOjp+QXVkaW9CdWZmZXJTb3VyY2VOb2RlKCkKK3sKKyAgICB1bmluaXRpYWxpemUoKTsK
K30KKwordm9pZCBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnByb2Nlc3Moc2l6ZV90IGZyYW1lc1Rv
UHJvY2VzcykKK3sKKyAgICBBdWRpb0J1cyogb3V0cHV0QnVzID0gb3V0cHV0KDApLT5idXMoKTsK
KworICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgIG91dHB1dEJ1cy0+emVybygp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGF1ZGlvIHRocmVhZCBjYW4n
dCBibG9jayBvbiB0aGlzIGxvY2ssIHNvIHdlIGNhbGwgdHJ5TG9jaygpIGluc3RlYWQuCisgICAg
Ly8gQ2FyZWZ1bCAtIHRoaXMgaXMgYSB0cnlMb2NrKCkgYW5kIG5vdCBhbiBhdXRvbG9ja2VyLCBz
byB3ZSBtdXN0IHVubG9jaygpIGJlZm9yZSBldmVyeSByZXR1cm4uCisgICAgaWYgKG1fcHJvY2Vz
c0xvY2sudHJ5TG9jaygpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgdGltZSB0byBzdGFy
dCBwbGF5aW5nLgorICAgICAgICBkb3VibGUgc2FtcGxlUmF0ZSA9IHRoaXMtPnNhbXBsZVJhdGUo
KTsKKyAgICAgICAgZG91YmxlIHBpdGNoUmF0ZSA9IHRvdGFsUGl0Y2hSYXRlKCk7CisgICAgICAg
IGRvdWJsZSBxdWFudHVtU3RhcnRUaW1lID0gY29udGV4dCgpLT5jdXJyZW50VGltZSgpOworICAg
ICAgICBkb3VibGUgcXVhbnR1bUVuZFRpbWUgPSBxdWFudHVtU3RhcnRUaW1lICsgZnJhbWVzVG9Q
cm9jZXNzIC8gc2FtcGxlUmF0ZTsKKworICAgICAgICBpZiAoIW1faXNQbGF5aW5nIHx8IG1faGFz
RmluaXNoZWQgfHwgIWJ1ZmZlcigpIHx8IG1fc3RhcnRUaW1lID49IHF1YW50dW1FbmRUaW1lKSB7
CisgICAgICAgICAgICAvLyBGSVhNRTogY2FuIG9wdGltaXplIGhlcmUgYnkgcHJvcGFnYXRpbmcg
c2lsZW50IGhpbnQgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZSB3aG9sZSBjaGFpbiB0byBwcm9jZXNz
IHNpbGVuY2UuCisgICAgICAgICAgICBvdXRwdXRCdXMtPnplcm8oKTsKKyAgICAgICAgICAgIG1f
cHJvY2Vzc0xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBIYW5kbGUgc2FtcGxlLWFjY3VyYXRlIHNjaGVkdWxpbmcgc28gdGhhdCBidWZm
ZXIgcGxheWJhY2sgd2lsbCBoYXBwZW4gYXQgYSB2ZXJ5IHByZWNpc2UgdGltZS4KKyAgICAgICAg
bV9zY2hlZHVsaW5nRnJhbWVEZWxheSA9IDA7CisgICAgICAgIGlmIChtX3N0YXJ0VGltZSA+PSBx
dWFudHVtU3RhcnRUaW1lKSB7CisgICAgICAgICAgICAvLyBtX3NjaGVkdWxpbmdGcmFtZURlbGF5
IGlzIHNldCBoZXJlIG9ubHkgdGhlIHZlcnkgZmlyc3QgcmVuZGVyIHF1YW50dW0gKGJlY2F1c2Ug
b2YgYWJvdmUgY2hlY2s6IG1fc3RhcnRUaW1lID49IHF1YW50dW1FbmRUaW1lKQorICAgICAgICAg
ICAgLy8gU286IHF1YW50dW1TdGFydFRpbWUgPD0gbV9zdGFydFRpbWUgPCBxdWFudHVtRW5kVGlt
ZQorICAgICAgICAgICAgQVNTRVJUKG1fc3RhcnRUaW1lIDwgcXVhbnR1bUVuZFRpbWUpOworICAg
ICAgICAgICAgCisgICAgICAgICAgICBkb3VibGUgc3RhcnRUaW1lSW5RdWFudHVtID0gbV9zdGFy
dFRpbWUgLSBxdWFudHVtU3RhcnRUaW1lOworICAgICAgICAgICAgZG91YmxlIHN0YXJ0RnJhbWVJ
blF1YW50dW0gPSBzdGFydFRpbWVJblF1YW50dW0gKiBzYW1wbGVSYXRlOworICAgICAgICAgICAg
CisgICAgICAgICAgICAvLyBtX3NjaGVkdWxpbmdGcmFtZURlbGF5IGlzIHVzZWQgaW4gcHJvdmlk
ZUlucHV0KCksIHNvIGZhY3RvciBpbiB0aGUgY3VycmVudCBwbGF5YmFjayBwaXRjaCByYXRlLgor
ICAgICAgICAgICAgbV9zY2hlZHVsaW5nRnJhbWVEZWxheSA9IHN0YXRpY19jYXN0PGludD4ocGl0
Y2hSYXRlICogc3RhcnRGcmFtZUluUXVhbnR1bSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBG
SVhNRTogb3B0aW1pemF0aW9uIG9wcG9ydHVuaXR5OgorICAgICAgICAvLyBXaXRoIGEgYml0IG9m
IHdvcmssIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhdm9pZCBnb2luZyB0aHJvdWdoIHRoZSBy
ZXNhbXBsZXIgY29tcGxldGVseSB3aGVuIHRoZSBwaXRjaFJhdGUgPT0gMSwKKyAgICAgICAgLy8g
ZXNwZWNpYWxseSBpZiB0aGUgcGl0Y2hSYXRlIGhhcyBuZXZlciBkZXZpYXRlZCBmcm9tIDEgaW4g
dGhlIHBhc3QuCisKKyAgICAgICAgLy8gUmVhZCB0aGUgc2FtcGxlcyB0aHJvdWdoIHRoZSBwaXRj
aCByZXNhbXBsZXIuICBPdXIgcHJvdmlkZUlucHV0KCkgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJ5
IHRoZSByZXNhbXBsZXIuCisgICAgICAgIG1fcmVzYW1wbGVyLnNldFJhdGUocGl0Y2hSYXRlKTsK
KyAgICAgICAgbV9yZXNhbXBsZXIucHJvY2Vzcyh0aGlzLCBvdXRwdXRCdXMsIGZyYW1lc1RvUHJv
Y2Vzcyk7CisKKyAgICAgICAgLy8gQXBwbHkgdGhlIGdhaW4gKGluLXBsYWNlKSB0byB0aGUgb3V0
cHV0IGJ1cy4KKyAgICAgICAgZG91YmxlIHRvdGFsR2FpbiA9IGdhaW4oKS0+dmFsdWUoKSAqIG1f
YnVmZmVyLT5nYWluKCk7CisgICAgICAgIG91dHB1dEJ1cy0+Y29weVdpdGhHYWluRnJvbSgqb3V0
cHV0QnVzLCAmbV9sYXN0R2FpbiwgdG90YWxHYWluKTsKKworICAgICAgICBtX3Byb2Nlc3NMb2Nr
LnVubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRvbyBiYWQgLSB0aGUgdHJ5TG9j
aygpIGZhaWxlZC4gIFdlIG11c3QgYmUgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZyBidWZmZXJz
IGFuZCB3ZXJlIGFscmVhZHkgb3V0cHV0dGluZyBzaWxlbmNlIGFueXdheS4KKyAgICAgICAgb3V0
cHV0QnVzLT56ZXJvKCk7CisgICAgfQorfQorCisvLyBUaGUgcmVzYW1wbGVyIGNhbGxzIHVzIGJh
Y2sgaGVyZSB0byBnZXQgdGhlIGlucHV0IHNhbXBsZXMgZnJvbSBvdXIgYnVmZmVyLgordm9pZCBB
dWRpb0J1ZmZlclNvdXJjZU5vZGU6OnByb3ZpZGVJbnB1dChBdWRpb0J1cyogYnVzLCBzaXplX3Qg
bnVtYmVyT2ZGcmFtZXMpCit7CisgICAgQVNTRVJUKGNvbnRleHQoKS0+aXNBdWRpb1RocmVhZCgp
KTsKKyAgICAKKyAgICAvLyBCYXNpYyBzYW5pdHkgY2hlY2tpbmcKKyAgICBBU1NFUlQoYnVzKTsK
KyAgICBBU1NFUlQoYnVmZmVyKCkpOworICAgIGlmICghYnVzIHx8ICFidWZmZXIoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscyA9IHRoaXMtPm51bWJl
ck9mQ2hhbm5lbHMoKTsKKyAgICB1bnNpZ25lZCBidXNOdW1iZXJPZkNoYW5uZWxzID0gYnVzLT5u
dW1iZXJPZkNoYW5uZWxzKCk7CisKKyAgICAvLyBGSVhNRTogd2UgY2FuIGFkZCBzdXBwb3J0IGZv
ciBzb3VyY2VzIHdpdGggbW9yZSB0aGFuIHR3byBjaGFubmVscywgYnV0IHRoaXMgaXMgbm90IGEg
Y29tbW9uIGNhc2UuCisgICAgYm9vbCBjaGFubmVsQ291bnRHb29kID0gbnVtYmVyT2ZDaGFubmVs
cyA9PSBidXNOdW1iZXJPZkNoYW5uZWxzICYmIChudW1iZXJPZkNoYW5uZWxzID09IDEgfHwgbnVt
YmVyT2ZDaGFubmVscyA9PSAyKTsKKyAgICBBU1NFUlQoY2hhbm5lbENvdW50R29vZCk7CisgICAg
aWYgKCFjaGFubmVsQ291bnRHb29kKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBHZXQgdGhl
IGRlc3RpbmF0aW9uIHBvaW50ZXJzLgorICAgIGZsb2F0KiBkZXN0aW5hdGlvbkwgPSBidXMtPmNo
YW5uZWwoMCktPmRhdGEoKTsKKyAgICBBU1NFUlQoZGVzdGluYXRpb25MKTsKKyAgICBpZiAoIWRl
c3RpbmF0aW9uTCkKKyAgICAgICAgcmV0dXJuOworICAgIGZsb2F0KiBkZXN0aW5hdGlvblIgPSAo
bnVtYmVyT2ZDaGFubmVscyA8IDIpID8gMCA6IGJ1cy0+Y2hhbm5lbCgxKS0+ZGF0YSgpOworCisg
ICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlcigpLT5sZW5ndGgoKTsKKyAgICBkb3VibGUg
YnVmZmVyU2FtcGxlUmF0ZSA9IGJ1ZmZlcigpLT5zYW1wbGVSYXRlKCk7CisKKyAgICAvLyBDYWxj
dWxhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgZnJhbWVzIGluIG91ciBidWZmZXIgdGhhdCB3ZSB3YW50
IHRvIHBsYXkuCisgICAgLy8gSWYgbV9pc0dyYWluIGlzIHRydWUsIHRoZW4gd2Ugd2lsbCBiZSBw
bGF5aW5nIGEgcG9ydGlvbiBvZiB0aGUgdG90YWwgYnVmZmVyLgorICAgIHVuc2lnbmVkIHN0YXJ0
RnJhbWUgPSBtX2lzR3JhaW4gPyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obV9ncmFpbk9mZnNldCAq
IGJ1ZmZlclNhbXBsZVJhdGUpIDogMDsKKyAgICB1bnNpZ25lZCBlbmRGcmFtZSA9IG1faXNHcmFp
biA/IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzdGFydEZyYW1lICsgbV9ncmFpbkR1cmF0aW9uICog
YnVmZmVyU2FtcGxlUmF0ZSkgOiBidWZmZXJMZW5ndGg7CisKKyAgICAvLyBUaGlzIGlzIGEgSEFD
SyB0byBhbGxvdyBmb3IgSFJURiB0YWlsLXRpbWUgLSBhdm9pZHMgZ2xpdGNoIGF0IGVuZC4KKyAg
ICAvLyBGSVhNRTogaW1wbGVtZW50IHRhaWxUaW1lIGZvciBlYWNoIEF1ZGlvTm9kZSBmb3IgYSBt
b3JlIGdlbmVyYWwgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtLgorICAgIGlmIChtX2lzR3JhaW4p
CisgICAgICAgIGVuZEZyYW1lICs9IDUxMjsKKworICAgIC8vIERvIHNvbWUgc2FuaXR5IGNoZWNr
aW5nLgorICAgIGlmIChzdGFydEZyYW1lID49IGJ1ZmZlckxlbmd0aCkKKyAgICAgICAgc3RhcnRG
cmFtZSA9ICFidWZmZXJMZW5ndGggPyAwIDogYnVmZmVyTGVuZ3RoIC0gMTsKKyAgICBpZiAoZW5k
RnJhbWUgPiBidWZmZXJMZW5ndGgpCisgICAgICAgIGVuZEZyYW1lID0gYnVmZmVyTGVuZ3RoOwor
ICAgIGlmIChtX3JlYWRJbmRleCA+PSBlbmRGcmFtZSkKKyAgICAgICAgbV9yZWFkSW5kZXggPSBz
dGFydEZyYW1lOyAvLyByZXNldCB0byBzdGFydAorICAgIAorICAgIGludCBmcmFtZXNUb1Byb2Nl
c3MgPSBudW1iZXJPZkZyYW1lczsKKworICAgIC8vIEhhbmRsZSBzYW1wbGUtYWNjdXJhdGUgc2No
ZWR1bGluZyBzbyB0aGF0IHdlIHBsYXkgdGhlIGJ1ZmZlciBhdCBhIHZlcnkgcHJlY2lzZSB0aW1l
LgorICAgIC8vIG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXkgd2lsbCBvbmx5IGJlIG5vbi16ZXJvIHRo
ZSB2ZXJ5IGZpcnN0IHRpbWUgdGhhdCBwcm92aWRlSW5wdXQoKSBpcyBjYWxsZWQsIHdoaWNoIGNv
cnJlc3BvbmRzCisgICAgLy8gd2l0aCB0aGUgdmVyeSBzdGFydCBvZiB0aGUgYnVmZmVyIHBsYXli
YWNrLgorICAgIGlmIChtX3NjaGVkdWxpbmdGcmFtZURlbGF5ID4gMCkgeworICAgICAgICBBU1NF
UlQobV9zY2hlZHVsaW5nRnJhbWVEZWxheSA8PSBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICBp
ZiAobV9zY2hlZHVsaW5nRnJhbWVEZWxheSA8PSBmcmFtZXNUb1Byb2Nlc3MpIHsKKyAgICAgICAg
ICAgIC8vIEdlbmVyYXRlIHNpbGVuY2UgZm9yIHRoZSBpbml0aWFsIHBvcnRpb24gb2YgdGhlIGRl
c3RpbmF0aW9uLgorICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uTCwgMCwgc2l6ZW9mKGZs
b2F0KSAqIG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXkpOworICAgICAgICAgICAgZGVzdGluYXRpb25M
ICs9IG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXk7CisgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25S
KSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KGRlc3RpbmF0aW9uUiwgMCwgc2l6ZW9mKGZsb2F0
KSAqIG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXkpOworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9u
UiArPSBtX3NjaGVkdWxpbmdGcmFtZURlbGF5OworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAvLyBTaW5jZSB3ZSBqdXN0IGdlbmVyYXRlZCBzaWxlbmNlIGZvciB0aGUgaW5pdGlhbCBwb3J0
aW9uLCB3ZSBoYXZlIGZld2VyIGZyYW1lcyB0byBwcm92aWRlLgorICAgICAgICAgICAgZnJhbWVz
VG9Qcm9jZXNzIC09IG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgLy8gV2UgaGF2ZSB0byBnZW5lcmF0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIG91dHB1
dCBzYW1wbGUtZnJhbWVzLCBidXQgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Ug
d3JhcCBhcm91bmQKKyAgICAvLyBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0byB0aGUgc3Rh
cnQgaWYgcGxheWluZyBiYWNrIHdpdGggbG9vcGluZyBhbmQgYWxzbyB0aGUgY2FzZSB3aGVyZSB3
ZSBzaW1wbHkgcmVhY2ggdGhlCisgICAgLy8gZW5kIG9mIHRoZSBzYW1wbGUgZGF0YSwgYnV0IGhh
dmVuJ3QgeWV0IHJlbmRlcmVkIG51bWJlck9mRnJhbWVzIHdvcnRoIG9mIG91dHB1dC4KKyAgICB3
aGlsZSAoZnJhbWVzVG9Qcm9jZXNzID4gMCkgeworICAgICAgICBBU1NFUlQobV9yZWFkSW5kZXgg
PD0gZW5kRnJhbWUpOworICAgICAgICBpZiAobV9yZWFkSW5kZXggPiBlbmRGcmFtZSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBt
YW55IGZyYW1lcyB3ZSBjYW4gcHJvY2VzcyB0aGlzIHRpbWUuCisgICAgICAgIGludCBmcmFtZXNB
dmFpbGFibGUgPSBlbmRGcmFtZSAtIG1fcmVhZEluZGV4OworICAgICAgICBpbnQgZnJhbWVzVGhp
c1RpbWUgPSBtaW4oZnJhbWVzVG9Qcm9jZXNzLCBmcmFtZXNBdmFpbGFibGUpOworICAgICAgICAK
KyAgICAgICAgLy8gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBidXMgZm9yIHRoZSBwYXJ0IG9mIHRo
ZSBkZXN0aW5hdGlvbiB3ZSdyZSBwcm9jZXNzaW5nIHRoaXMgdGltZS4KKyAgICAgICAgQXVkaW9C
dXMgY3VycmVudERlc3RpbmF0aW9uQnVzKGJ1c051bWJlck9mQ2hhbm5lbHMsIGZyYW1lc1RoaXNU
aW1lLCBmYWxzZSk7CisgICAgICAgIGN1cnJlbnREZXN0aW5hdGlvbkJ1cy5zZXRDaGFubmVsTWVt
b3J5KDAsIGRlc3RpbmF0aW9uTCwgZnJhbWVzVGhpc1RpbWUpOworICAgICAgICBpZiAoYnVzTnVt
YmVyT2ZDaGFubmVscyA+IDEpCisgICAgICAgICAgICBjdXJyZW50RGVzdGluYXRpb25CdXMuc2V0
Q2hhbm5lbE1lbW9yeSgxLCBkZXN0aW5hdGlvblIsIGZyYW1lc1RoaXNUaW1lKTsKKworICAgICAg
ICAvLyBHZW5lcmF0ZSBvdXRwdXQgZnJvbSB0aGUgYnVmZmVyLgorICAgICAgICByZWFkRnJvbUJ1
ZmZlcigmY3VycmVudERlc3RpbmF0aW9uQnVzLCBmcmFtZXNUaGlzVGltZSk7CisKKyAgICAgICAg
Ly8gVXBkYXRlIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVycy4KKyAgICAgICAgZGVzdGluYXRpb25M
ICs9IGZyYW1lc1RoaXNUaW1lOworICAgICAgICBpZiAoYnVzTnVtYmVyT2ZDaGFubmVscyA+IDEp
CisgICAgICAgICAgICBkZXN0aW5hdGlvblIgKz0gZnJhbWVzVGhpc1RpbWU7CisKKyAgICAgICAg
ZnJhbWVzVG9Qcm9jZXNzIC09IGZyYW1lc1RoaXNUaW1lOworCisgICAgICAgIC8vIEhhbmRsZSB0
aGUgY2FzZSB3aGVyZSB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBwYXJ0IG9mIHRoZSBzYW1wbGUg
ZGF0YSB3ZSdyZSBzdXBwb3NlZCB0byBwbGF5IGZvciB0aGUgYnVmZmVyLgorICAgICAgICBpZiAo
bV9yZWFkSW5kZXggPj0gZW5kRnJhbWUpIHsKKyAgICAgICAgICAgIG1fcmVhZEluZGV4ID0gc3Rh
cnRGcmFtZTsKKyAgICAgICAgICAgIG1fZ3JhaW5GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgaWYgKCFsb29waW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3
ZSdyZSBub3QgbG9vcGluZywgdGhlbiBzdG9wIHBsYXlpbmcgd2hlbiB3ZSBnZXQgdG8gdGhlIGVu
ZC4KKyAgICAgICAgICAgICAgICBtX2lzUGxheWluZyA9IGZhbHNlOworCisgICAgICAgICAgICAg
ICAgaWYgKGZyYW1lc1RvUHJvY2VzcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Un
cmUgbm90IGxvb3BpbmcgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2FtcGxlIGRh
dGEsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGUgbW9yZSBvdXRwdXQsCisgICAgICAgICAg
ICAgICAgICAgIC8vIHNvIGdlbmVyYXRlIHNpbGVuY2UgZm9yIHRoZSByZW1haW5pbmcuCisgICAg
ICAgICAgICAgICAgICAgIG1lbXNldChkZXN0aW5hdGlvbkwsIDAsIHNpemVvZihmbG9hdCkgKiBm
cmFtZXNUb1Byb2Nlc3MpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvblIp
CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGVzdGluYXRpb25SLCAwLCBzaXplb2Yo
ZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICBpZiAoIW1faGFzRmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGV0
IHRoZSBjb250ZXh0IGRlcmVmZXJlbmNlIHRoaXMgQXVkaW9Ob2RlLgorICAgICAgICAgICAgICAg
ICAgICBjb250ZXh0KCktPm5vdGlmeU5vZGVGaW5pc2hlZFByb2Nlc3NpbmcodGhpcyk7CisgICAg
ICAgICAgICAgICAgICAgIG1faGFzRmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
Cit9CisKK3ZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpyZWFkRnJvbUJ1ZmZlcihBdWRpb0J1
cyogZGVzdGluYXRpb25CdXMsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgYm9vbCBp
c0J1c0dvb2QgPSBkZXN0aW5hdGlvbkJ1cyAmJiBkZXN0aW5hdGlvbkJ1cy0+bGVuZ3RoKCkgPT0g
ZnJhbWVzVG9Qcm9jZXNzICYmIGRlc3RpbmF0aW9uQnVzLT5udW1iZXJPZkNoYW5uZWxzKCkgPT0g
bnVtYmVyT2ZDaGFubmVscygpOworICAgIEFTU0VSVChpc0J1c0dvb2QpOworICAgIGlmICghaXNC
dXNHb29kKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFu
bmVscyA9IHRoaXMtPm51bWJlck9mQ2hhbm5lbHMoKTsKKyAgICAvLyBGSVhNRTogd2UgY2FuIGFk
ZCBzdXBwb3J0IGZvciBzb3VyY2VzIHdpdGggbW9yZSB0aGFuIHR3byBjaGFubmVscywgYnV0IHRo
aXMgaXMgbm90IGEgY29tbW9uIGNhc2UuCisgICAgYm9vbCBjaGFubmVsQ291bnRHb29kID0gbnVt
YmVyT2ZDaGFubmVscyA9PSAxIHx8IG51bWJlck9mQ2hhbm5lbHMgPT0gMjsKKyAgICBBU1NFUlQo
Y2hhbm5lbENvdW50R29vZCk7CisgICAgaWYgKCFjaGFubmVsQ291bnRHb29kKQorICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICAKKyAgICAvLyBHZXQgcG9pbnRlcnMgdG8gdGhlIHN0YXJ0IG9m
IHRoZSBzYW1wbGUgYnVmZmVyLgorICAgIGZsb2F0KiBzb3VyY2VMID0gbV9idWZmZXItPmdldENo
YW5uZWxEYXRhKDApLT5kYXRhKCk7CisgICAgZmxvYXQqIHNvdXJjZVIgPSBtX2J1ZmZlci0+bnVt
YmVyT2ZDaGFubmVscygpID09IDIgPyBtX2J1ZmZlci0+Z2V0Q2hhbm5lbERhdGEoMSktPmRhdGEo
KSA6IDA7CisKKyAgICAvLyBTYW5pdHkgY2hlY2sgYnVmZmVyIGFjY2Vzcy4KKyAgICBib29sIGlz
U291cmNlR29vZCA9IHNvdXJjZUwgJiYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMSB8fCBzb3VyY2VS
KSAmJiBtX3JlYWRJbmRleCArIGZyYW1lc1RvUHJvY2VzcyA8PSBtX2J1ZmZlci0+bGVuZ3RoKCk7
CisgICAgQVNTRVJUKGlzU291cmNlR29vZCk7CisgICAgaWYgKCFpc1NvdXJjZUdvb2QpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIE9mZnNldCB0aGUgcG9pbnRlcnMgdG8gdGhlIGN1cnJlbnQg
cmVhZCBwb3NpdGlvbiBpbiB0aGUgc2FtcGxlIGJ1ZmZlci4KKyAgICBzb3VyY2VMICs9IG1fcmVh
ZEluZGV4OworICAgIHNvdXJjZVIgKz0gbV9yZWFkSW5kZXg7CisKKyAgICAvLyBHZXQgcG9pbnRl
cnMgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgIGZsb2F0KiBkZXN0aW5hdGlvbkwgPSBkZXN0aW5h
dGlvbkJ1cy0+Y2hhbm5lbCgwKS0+ZGF0YSgpOworICAgIGZsb2F0KiBkZXN0aW5hdGlvblIgPSBu
dW1iZXJPZkNoYW5uZWxzID09IDIgPyBkZXN0aW5hdGlvbkJ1cy0+Y2hhbm5lbCgxKS0+ZGF0YSgp
IDogMDsKKyAgICBib29sIGlzRGVzdGluYXRpb25Hb29kID0gZGVzdGluYXRpb25MICYmIChudW1i
ZXJPZkNoYW5uZWxzID09IDEgfHwgZGVzdGluYXRpb25SKTsKKyAgICBBU1NFUlQoaXNEZXN0aW5h
dGlvbkdvb2QpOworICAgIGlmICghaXNEZXN0aW5hdGlvbkdvb2QpCisgICAgICAgIHJldHVybjsK
KworICAgIGlmIChtX2lzR3JhaW4pCisgICAgICAgIHJlYWRGcm9tQnVmZmVyV2l0aEdyYWluRW52
ZWxvcGUoc291cmNlTCwgc291cmNlUiwgZGVzdGluYXRpb25MLCBkZXN0aW5hdGlvblIsIGZyYW1l
c1RvUHJvY2Vzcyk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFNpbXBseSBjb3B5IHRoZSBkYXRh
IGZyb20gdGhlIHNvdXJjZSBidWZmZXIgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAgICBtZW1j
cHkoZGVzdGluYXRpb25MLCBzb3VyY2VMLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNz
KTsKKyAgICAgICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikKKyAgICAgICAgICAgIG1lbWNw
eShkZXN0aW5hdGlvblIsIHNvdXJjZVIsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3Mp
OworICAgIH0KKworICAgIC8vIEFkdmFuY2UgdGhlIGJ1ZmZlcidzIHJlYWQgaW5kZXguCisgICAg
bV9yZWFkSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworfQorCit2b2lkIEF1ZGlvQnVmZmVyU291
cmNlTm9kZTo6cmVhZEZyb21CdWZmZXJXaXRoR3JhaW5FbnZlbG9wZShmbG9hdCogc291cmNlTCwg
ZmxvYXQqIHNvdXJjZVIsIGZsb2F0KiBkZXN0aW5hdGlvbkwsIGZsb2F0KiBkZXN0aW5hdGlvblIs
IHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgQVNTRVJUKHNvdXJjZUwgJiYgZGVzdGlu
YXRpb25MKTsKKyAgICBpZiAoIXNvdXJjZUwgfHwgIWRlc3RpbmF0aW9uTCkKKyAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICBpbnQgZ3JhaW5GcmFtZUxlbmd0aCA9IHN0YXRpY19jYXN0PGlu
dD4obV9ncmFpbkR1cmF0aW9uICogbV9idWZmZXItPnNhbXBsZVJhdGUoKSk7CisgICAgYm9vbCBp
c1N0ZXJlbyA9IHNvdXJjZVIgJiYgZGVzdGluYXRpb25SOworICAgIAorICAgIGludCBuID0gZnJh
bWVzVG9Qcm9jZXNzOworICAgIHdoaWxlIChuLS0pIHsKKyAgICAgICAgLy8gQXBwbHkgdGhlIGdy
YWluIGVudmVsb3BlLgorICAgICAgICBmbG9hdCB4ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fZ3Jh
aW5GcmFtZUNvdW50KSAvIHN0YXRpY19jYXN0PGZsb2F0PihncmFpbkZyYW1lTGVuZ3RoKTsKKyAg
ICAgICAgbV9ncmFpbkZyYW1lQ291bnQrKzsKKworICAgICAgICB4ID0gbWluKDEuMGYsIHgpOwor
ICAgICAgICBmbG9hdCBncmFpbkVudmVsb3BlID0gc2luZihNX1BJICogeCk7CisgICAgICAgIAor
ICAgICAgICAqZGVzdGluYXRpb25MKysgPSBncmFpbkVudmVsb3BlICogKnNvdXJjZUwrKzsKKwor
ICAgICAgICBpZiAoaXNTdGVyZW8pCisgICAgICAgICAgICAqZGVzdGluYXRpb25SKysgPSBncmFp
bkVudmVsb3BlICogKnNvdXJjZVIrKzsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9CdWZmZXJTb3Vy
Y2VOb2RlOjpyZXNldCgpCit7CisgICAgbV9yZXNhbXBsZXIucmVzZXQoKTsKKyAgICBtX3JlYWRJ
bmRleCA9IDA7CisgICAgbV9ncmFpbkZyYW1lQ291bnQgPSAwOworICAgIG1fbGFzdEdhaW4gPSBn
YWluKCktPnZhbHVlKCk7Cit9CisKK3ZvaWQgQXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpzZXRCdWZm
ZXIoQXVkaW9CdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwor
ICAgIAorICAgIC8vIFRoZSBjb250ZXh0IG11c3QgYmUgbG9ja2VkIHNpbmNlIGNoYW5naW5nIHRo
ZSBidWZmZXIgY2FuIHJlLWNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgYXJl
IG91dHB1dC4KKyAgICBBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIgY29udGV4dExvY2tlcihjb250
ZXh0KCkpOworICAgIAorICAgIC8vIFRoaXMgc3luY2hyb25pemVzIHdpdGggcHJvY2VzcygpLgor
ICAgIE11dGV4TG9ja2VyIHByb2Nlc3NMb2NrZXIobV9wcm9jZXNzTG9jayk7CisgICAgCisgICAg
aWYgKGJ1ZmZlcikgeworICAgICAgICAvLyBEbyBhbnkgbmVjZXNzc2FyeSByZS1jb25maWd1cmF0
aW9uIHRvIHRoZSBidWZmZXIncyBudW1iZXIgb2YgY2hhbm5lbHMuCisgICAgICAgIHVuc2lnbmVk
IG51bWJlck9mQ2hhbm5lbHMgPSBidWZmZXItPm51bWJlck9mQ2hhbm5lbHMoKTsKKyAgICAgICAg
bV9yZXNhbXBsZXIuY29uZmlndXJlQ2hhbm5lbHMobnVtYmVyT2ZDaGFubmVscyk7CisgICAgICAg
IG91dHB1dCgwKS0+c2V0TnVtYmVyT2ZDaGFubmVscyhudW1iZXJPZkNoYW5uZWxzKTsKKyAgICB9
CisKKyAgICBtX3JlYWRJbmRleCA9IDA7CisgICAgbV9idWZmZXIgPSBidWZmZXI7Cit9CisKK3Vu
c2lnbmVkIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6bnVtYmVyT2ZDaGFubmVscygpCit7CisgICAg
cmV0dXJuIG91dHB1dCgwKS0+bnVtYmVyT2ZDaGFubmVscygpOworfQorCit2b2lkIEF1ZGlvQnVm
ZmVyU291cmNlTm9kZTo6bm90ZU9uKGRvdWJsZSB3aGVuKQoreworICAgIEFTU0VSVChpc01haW5U
aHJlYWQoKSk7CisgICAgaWYgKG1faXNQbGF5aW5nKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X2lzR3JhaW4gPSBmYWxzZTsKKyAgICBtX3N0YXJ0VGltZSA9IHdoZW47CisgICAgbV9yZWFkSW5k
ZXggPSAwOworICAgIG1faXNQbGF5aW5nID0gdHJ1ZTsKK30KKwordm9pZCBBdWRpb0J1ZmZlclNv
dXJjZU5vZGU6Om5vdGVHcmFpbk9uKGRvdWJsZSB3aGVuLCBkb3VibGUgZ3JhaW5PZmZzZXQsIGRv
dWJsZSBncmFpbkR1cmF0aW9uKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAg
aWYgKG1faXNQbGF5aW5nKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWJ1ZmZlcigpKQor
ICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIC8vIERvIHNhbml0eSBjaGVja2luZyBvZiBn
cmFpbiBwYXJhbWV0ZXJzIHZlcnN1cyBidWZmZXIgc2l6ZS4KKyAgICBkb3VibGUgYnVmZmVyRHVy
YXRpb24gPSBidWZmZXIoKS0+ZHVyYXRpb24oKTsKKworICAgIGlmIChncmFpbkR1cmF0aW9uID4g
YnVmZmVyRHVyYXRpb24pCisgICAgICAgIHJldHVybjsgLy8gRklYTUU6IG1heWJlIHNob3VsZCB0
aHJvdyBleGNlcHRpb24gLSBjb25zaWRlciBpbiBzcGVjaWZpY2F0aW9uLgorICAgIAorICAgIGRv
dWJsZSBtYXhHcmFpbk9mZnNldCA9IGJ1ZmZlckR1cmF0aW9uIC0gZ3JhaW5EdXJhdGlvbjsKKyAg
ICBtYXhHcmFpbk9mZnNldCA9IG1heCgwLjAsIG1heEdyYWluT2Zmc2V0KTsKKworICAgIGdyYWlu
T2Zmc2V0ID0gbWF4KDAuMCwgZ3JhaW5PZmZzZXQpOworICAgIGdyYWluT2Zmc2V0ID0gbWluKG1h
eEdyYWluT2Zmc2V0LCBncmFpbk9mZnNldCk7ICAgIAorICAgIG1fZ3JhaW5PZmZzZXQgPSBncmFp
bk9mZnNldDsKKworICAgIG1fZ3JhaW5EdXJhdGlvbiA9IGdyYWluRHVyYXRpb247CisgICAgbV9n
cmFpbkZyYW1lQ291bnQgPSAwOworICAgIAorICAgIG1faXNHcmFpbiA9IHRydWU7CisgICAgbV9z
dGFydFRpbWUgPSB3aGVuOworICAgIG1fcmVhZEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihtX2dy
YWluT2Zmc2V0ICogYnVmZmVyKCktPnNhbXBsZVJhdGUoKSk7CisgICAgbV9pc1BsYXlpbmcgPSB0
cnVlOworfQorCit2b2lkIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6bm90ZU9mZihkb3VibGUpCit7
CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAoIW1faXNQbGF5aW5nKQorICAg
ICAgICByZXR1cm47CisgICAgICAgIAorICAgIC8vIEZJWE1FOiB0aGUgIndoZW4iIGFyZ3VtZW50
IHRvIHRoaXMgbWV0aG9kIGlzIGlnbm9yZWQuCisgICAgbV9pc1BsYXlpbmcgPSBmYWxzZTsKKyAg
ICBtX3JlYWRJbmRleCA9IDA7Cit9CisKK2RvdWJsZSBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnRv
dGFsUGl0Y2hSYXRlKCkKK3sKKyAgICBkb3VibGUgZG9wcGxlclJhdGUgPSAxLjA7CisgICAgaWYg
KG1fcGFubmVyTm9kZS5nZXQoKSkKKyAgICAgICAgZG9wcGxlclJhdGUgPSBtX3Bhbm5lck5vZGUt
PmRvcHBsZXJSYXRlKCk7CisgICAgCisgICAgLy8gSW5jb3Jwb3JhdGUgYnVmZmVyJ3Mgc2FtcGxl
LXJhdGUgdmVyc3VzIEF1ZGlvQ29udGV4dCdzIHNhbXBsZS1yYXRlLgorICAgIC8vIE5vcm1hbGx5
IGl0J3Mgbm90IGFuIGlzc3VlIGJlY2F1c2UgYnVmZmVycyBhcmUgbG9hZGVkIGF0IHRoZSBBdWRp
b0NvbnRleHQncyBzYW1wbGUtcmF0ZSwgYnV0IHdlIGNhbiBoYW5kbGUgaXQgaW4gYW55IGNhc2Uu
CisgICAgZG91YmxlIHNhbXBsZVJhdGVGYWN0b3IgPSAxLjA7CisgICAgaWYgKGJ1ZmZlcigpKQor
ICAgICAgICBzYW1wbGVSYXRlRmFjdG9yID0gYnVmZmVyKCktPnNhbXBsZVJhdGUoKSAvIHNhbXBs
ZVJhdGUoKTsKKyAgICAKKyAgICBkb3VibGUgYmFzZVBpdGNoUmF0ZSA9IHBsYXliYWNrUmF0ZSgp
LT52YWx1ZSgpOworCisgICAgZG91YmxlIHRvdGFsUmF0ZSA9IGRvcHBsZXJSYXRlICogc2FtcGxl
UmF0ZUZhY3RvciAqIGJhc2VQaXRjaFJhdGU7CisKKyAgICAvLyBTYW5pdHkgY2hlY2sgdGhlIHRv
dGFsIHJhdGUuICBJdCdzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIHJlc2FtcGxlciBub3QgZ2V0
IGFueSBiYWQgcmF0ZSB2YWx1ZXMuCisgICAgdG90YWxSYXRlID0gbWF4KDAuMCwgdG90YWxSYXRl
KTsKKyAgICB0b3RhbFJhdGUgPSBtaW4oQXVkaW9SZXNhbXBsZXI6Ok1heFJhdGUsIHRvdGFsUmF0
ZSk7CisgICAgCisgICAgYm9vbCBpc1RvdGFsUmF0ZVZhbGlkID0gIWlzbmFuKHRvdGFsUmF0ZSkg
JiYgIWlzaW5mKHRvdGFsUmF0ZSk7CisgICAgQVNTRVJUKGlzVG90YWxSYXRlVmFsaWQpOworICAg
IGlmICghaXNUb3RhbFJhdGVWYWxpZCkKKyAgICAgICAgdG90YWxSYXRlID0gMS4wOworICAgIAor
ICAgIHJldHVybiB0b3RhbFJhdGU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVm
ZmVyU291cmNlTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZm
ZXJTb3VyY2VOb2RlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVm
ZmVyU291cmNlTm9kZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
CisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgQXVkaW9CdWZmZXJTb3VyY2VOb2RlX2gKKyNkZWZpbmUgQXVkaW9CdWZmZXJT
b3VyY2VOb2RlX2gKKworI2luY2x1ZGUgIkF1ZGlvQnVmZmVyLmgiCisjaW5jbHVkZSAiQXVkaW9C
dXMuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJBdWRpb1Bhbm5lck5vZGUu
aCIKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgorI2luY2x1ZGUgIkF1ZGlvU291cmNlTm9k
ZS5oIgorI2luY2x1ZGUgIkF1ZGlvU291cmNlUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDx3dGYvUGFz
c1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXVkaW9Db250ZXh0OworCisv
LyBBdWRpb0J1ZmZlclNvdXJjZU5vZGUgaXMgYW4gQXVkaW9Ob2RlIHJlcHJlc2VudGluZyBhbiBh
dWRpbyBzb3VyY2UgZnJvbSBhbiBpbi1tZW1vcnkgYXVkaW8gYXNzZXQgcmVwcmVzZW50ZWQgYnkg
YW4gQXVkaW9CdWZmZXIuCisvLyBJdCBnZW5lcmFsbHkgd2lsbCBiZSB1c2VkIGZvciBzaG9ydCBz
b3VuZHMgd2hpY2ggcmVxdWlyZSBhIGhpZ2ggZGVncmVlIG9mIHNjaGVkdWxpbmcgZmxleGliaWxp
dHkgKGNhbiBwbGF5YmFjayBpbiByaHl0aG1pY2FsbHkgcGVyZmVjdCB3YXlzKS4KKworY2xhc3Mg
QXVkaW9CdWZmZXJTb3VyY2VOb2RlIDogcHVibGljIEF1ZGlvU291cmNlTm9kZSwgcHVibGljIEF1
ZGlvU291cmNlUHJvdmlkZXIgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEF1ZGlv
QnVmZmVyU291cmNlTm9kZT4gY3JlYXRlKEF1ZGlvQ29udGV4dCosIGRvdWJsZSBzYW1wbGVSYXRl
KTsKKworICAgIHZpcnR1YWwgfkF1ZGlvQnVmZmVyU291cmNlTm9kZSgpOworICAgIAorICAgIC8v
IEF1ZGlvTm9kZQorICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHNpemVfdCBmcmFtZXNUb1Byb2Nl
c3MpOworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgLy8gQXVkaW9Tb3VyY2VQcm92
aWRlcgorICAgIC8vIFdoZW4gcHJvY2VzcygpIGlzIGNhbGxlZCwgdGhlIHJlc2FtcGxlciBjYWxs
cyBwcm92aWRlSW5wdXQgKGluIHRoZSBhdWRpbyB0aHJlYWQpIHRvIGdldHMgaXRzIGlucHV0IHN0
cmVhbS4KKyAgICB2aXJ0dWFsIHZvaWQgcHJvdmlkZUlucHV0KEF1ZGlvQnVzKiwgc2l6ZV90IG51
bWJlck9mRnJhbWVzKTsKKyAgICAKKyAgICAvLyBzZXRCdWZmZXIoKSBpcyBjYWxsZWQgb24gdGhl
IG1haW4gdGhyZWFkLiAgVGhpcyBpcyB0aGUgYnVmZmVyIHdlIHVzZSBmb3IgcGxheWJhY2suCisg
ICAgdm9pZCBzZXRCdWZmZXIoQXVkaW9CdWZmZXIqKTsKKyAgICBBdWRpb0J1ZmZlciogYnVmZmVy
KCkgeyByZXR1cm4gbV9idWZmZXIuZ2V0KCk7IH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAg
Ly8gbnVtYmVyT2ZDaGFubmVscygpIHJldHVybnMgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5l
bHMuICBUaGlzIHZhbHVlIGVxdWFscyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gdGhlIGJ1
ZmZlci4KKyAgICAvLyBJZiBhIG5ldyBidWZmZXIgaXMgc2V0IHdpdGggYSBkaWZmZXJlbnQgbnVt
YmVyIG9mIGNoYW5uZWxzLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBkeW5hbWljYWxseSBjaGFuZ2Uu
CisgICAgdW5zaWduZWQgbnVtYmVyT2ZDaGFubmVscygpOworICAgICAgICAgICAgICAgICAgICAK
KyAgICAvLyBQbGF5LXN0YXRlCisgICAgLy8gbm90ZU9uKCksIG5vdGVHcmFpbk9uKCksIGFuZCBu
b3RlT2ZmKCkgbXVzdCBhbGwgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAgIHZv
aWQgbm90ZU9uKGRvdWJsZSB3aGVuKTsKKyAgICB2b2lkIG5vdGVHcmFpbk9uKGRvdWJsZSB3aGVu
LCBkb3VibGUgZ3JhaW5PZmZzZXQsIGRvdWJsZSBncmFpbkR1cmF0aW9uKTsKKyAgICB2b2lkIG5v
dGVPZmYoZG91YmxlIHdoZW4pOworCisgICAgYm9vbCBsb29waW5nKCkgY29uc3QgeyByZXR1cm4g
bV9pc0xvb3Bpbmc7IH0KKyAgICB2b2lkIHNldExvb3BpbmcoYm9vbCBsb29waW5nKSB7IG1faXNM
b29waW5nID0gbG9vcGluZzsgfQorICAgIAorICAgIEF1ZGlvR2FpbiogZ2FpbigpIHsgcmV0dXJu
IG1fZ2Fpbi5nZXQoKTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
KyAgICBBdWRpb1BhcmFtKiBwbGF5YmFja1JhdGUoKSB7IHJldHVybiBtX3BsYXliYWNrUmF0ZS5n
ZXQoKTsgfQorCisgICAgLy8gSWYgYSBwYW5uZXIgbm9kZSBpcyBzZXQsIHRoZW4gd2UgY2FuIGlu
Y29ycG9yYXRlIGRvcHBsZXIgc2hpZnQgaW50byB0aGUgcGxheWJhY2sgcGl0Y2ggcmF0ZS4KKyAg
ICB2b2lkIHNldFBhbm5lck5vZGUoUGFzc1JlZlB0cjxBdWRpb1Bhbm5lck5vZGU+IHBhbm5lck5v
ZGUpIHsgbV9wYW5uZXJOb2RlID0gcGFubmVyTm9kZTsgfQorCitwcml2YXRlOgorICAgIEF1ZGlv
QnVmZmVyU291cmNlTm9kZShBdWRpb0NvbnRleHQqLCBkb3VibGUgc2FtcGxlUmF0ZSk7CisKKyAg
ICAvLyBtX2J1ZmZlciBob2xkcyB0aGUgc2FtcGxlIGRhdGEgd2hpY2ggdGhpcyBub2RlIG91dHB1
dHMuCisgICAgUmVmUHRyPEF1ZGlvQnVmZmVyPiBtX2J1ZmZlcjsKKworICAgIC8vIFVzZWQgZm9y
IHRoZSAiZ2FpbiIgYW5kICJwbGF5YmFja1JhdGUiIGF0dHJpYnV0ZXMuCisgICAgUmVmUHRyPEF1
ZGlvR2Fpbj4gbV9nYWluOworICAgIFJlZlB0cjxBdWRpb1BhcmFtPiBtX3BsYXliYWNrUmF0ZTsK
KworICAgIC8vIG1faXNQbGF5aW5nIGlzIHNldCB0byB0cnVlIHdoZW4gbm90ZU9uKCkgb3Igbm90
ZUdyYWluT24oKSBpcyBjYWxsZWQuCisgICAgYm9vbCBtX2lzUGxheWluZzsKKworICAgIC8vIElm
IG1faXNMb29waW5nIGlzIGZhbHNlLCB0aGVuIHRoaXMgbm9kZSB3aWxsIGJlIGRvbmUgcGxheWlu
ZyBhbmQgYmVjb21lIGluYWN0aXZlIGFmdGVyIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc2Ft
cGxlIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAgICAvLyBJZiB0cnVlLCBpdCB3aWxsIHdyYXAgYXJv
dW5kIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIGVhY2ggdGltZSBpdCByZWFjaGVzIHRoZSBl
bmQuCisgICAgYm9vbCBtX2lzTG9vcGluZzsKKworICAgIC8vIFRoaXMgbm9kZSBpcyBjb25zaWRl
cmVkIGZpbmlzaGVkIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIncyBzYW1w
bGUgZGF0YSBhZnRlciBub3RlT24oKSBoYXMgYmVlbiBjYWxsZWQuCisgICAgLy8gVGhpcyB3aWxs
IG9ubHkgYmUgc2V0IHRvIHRydWUgaWYgbV9pc0xvb3BpbmcgPT0gZmFsc2UuCisgICAgYm9vbCBt
X2hhc0ZpbmlzaGVkOworCisgICAgLy8gbV9zdGFydFRpbWUgaXMgdGhlIHRpbWUgdG8gc3RhcnQg
cGxheWluZyBiYXNlZCBvbiB0aGUgY29udGV4dCdzIHRpbWVsaW5lICgwLjAgb3IgYSB0aW1lIGxl
c3MgdGhhbiB0aGUgY29udGV4dCdzIGN1cnJlbnQgdGltZSBtZWFucyAibm93IikuCisgICAgZG91
YmxlIG1fc3RhcnRUaW1lOyAvLyBpbiBzZWNvbmRzCisKKyAgICAvLyBtX3NjaGVkdWxpbmdGcmFt
ZURlbGF5IGlzIHRoZSBzYW1wbGUtYWNjdXJhdGUgc2NoZWR1bGluZyBvZmZzZXQuCisgICAgLy8g
SXQncyB1c2VkIHNvIHRoYXQgd2Ugc3RhcnQgcmVuZGVyaW5nIGF1ZGlvIHNhbXBsZXMgYXQgYSB2
ZXJ5IHByZWNpc2UgcG9pbnQgaW4gdGltZS4KKyAgICAvLyBJdCB3aWxsIG9ubHkgYmUgYSBub24t
emVybyB2YWx1ZSB0aGUgdmVyeSBmaXJzdCByZW5kZXIgcXVhbnR1bSB0aGF0IHdlIHJlbmRlciBm
cm9tIHRoZSBidWZmZXIuCisgICAgaW50IG1fc2NoZWR1bGluZ0ZyYW1lRGVsYXk7CisKKyAgICAv
LyBtX3JlYWRJbmRleCBpcyBhIHNhbXBsZS1mcmFtZSBpbmRleCBpbnRvIG91ciBidWZmZXIgcmVw
cmVzZW50aW5nIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLgorICAgIHVuc2lnbmVkIG1f
cmVhZEluZGV4OworCisgICAgLy8gR3JhbnVsYXIgcGxheWJhY2sKKyAgICBib29sIG1faXNHcmFp
bjsKKyAgICBkb3VibGUgbV9ncmFpbk9mZnNldDsgLy8gaW4gc2Vjb25kcworICAgIGRvdWJsZSBt
X2dyYWluRHVyYXRpb247IC8vIGluIHNlY29uZHMKKyAgICBpbnQgbV9ncmFpbkZyYW1lQ291bnQ7
IC8vIGtlZXBzIHRyYWNrIG9mIHdoaWNoIGZyYW1lIGluIHRoZSBncmFpbiB3ZSdyZSBjdXJyZW50
bHkgcmVuZGVyaW5nCisKKyAgICAvLyB0b3RhbFBpdGNoUmF0ZSgpIHJldHVybnMgdGhlIGluc3Rh
bnRhbmVvdXMgcGl0Y2ggcmF0ZSAobm9uLXRpbWUgcHJlc2VydmluZykuCisgICAgLy8gSXQgaW5j
b3Jwb3JhdGVzIHRoZSBiYXNlIHBpdGNoIHJhdGUsIGFueSBzYW1wbGUtcmF0ZSBjb252ZXJzaW9u
IGZhY3RvciBmcm9tIHRoZSBidWZmZXIsIGFuZCBhbnkgZG9wcGxlciBzaGlmdCBmcm9tIGFuIGFz
c29jaWF0ZWQgcGFubmVyIG5vZGUuCisgICAgZG91YmxlIHRvdGFsUGl0Y2hSYXRlKCk7CisKKyAg
ICAvLyBtX3Jlc2FtcGxlciBwZXJmb3JtcyB0aGUgcGl0Y2ggcmF0ZSBjaGFuZ2VzIHRvIHRoZSBi
dWZmZXIgcGxheWJhY2suCisgICAgQXVkaW9SZXNhbXBsZXIgbV9yZXNhbXBsZXI7CisKKyAgICAv
LyBtX2xhc3RHYWluIHByb3ZpZGVzIGNvbnRpbnVpdHkgd2hlbiB3ZSBkeW5hbWljYWxseSBhZGp1
c3QgdGhlIGdhaW4uCisgICAgZG91YmxlIG1fbGFzdEdhaW47CisgICAgCisgICAgLy8gV2Ugb3B0
aW9uYWxseSBrZWVwIHRyYWNrIG9mIGEgcGFubmVyIG5vZGUgd2hpY2ggaGFzIGEgZG9wcGxlciBz
aGlmdCB0aGF0IGlzIGluY29ycG9yYXRlZCBpbnRvIHRoZSBwaXRjaCByYXRlLgorICAgIFJlZlB0
cjxBdWRpb1Bhbm5lck5vZGU+IG1fcGFubmVyTm9kZTsKKworICAgIC8vIFRoaXMgc3luY2hyb25p
emVzIHByb2Nlc3MoKSB3aXRoIHNldEJ1ZmZlcigpIHdoaWNoIGNhbiBjYXVzZSBkeW5hbWljIGNo
YW5uZWwgY291bnQgY2hhbmdlcy4KKyAgICBtdXRhYmxlIE11dGV4IG1fcHJvY2Vzc0xvY2s7CisK
KyAgICAvLyBSZWFkcyB0aGUgbmV4dCBmcmFtZXNUb1Byb2Nlc3Mgc2FtcGxlLWZyYW1lcyBmcm9t
IHRoZSBBdWRpb0J1ZmZlciBpbnRvIGRlc3RpbmF0aW9uQnVzLgorICAgIC8vIEEgZ3JhaW4gZW52
ZWxvcGUgd2lsbCBiZSBhcHBsaWVkIGlmIG1faXNHcmFpbiBpcyBzZXQgdG8gdHJ1ZS4KKyAgICB2
b2lkIHJlYWRGcm9tQnVmZmVyKEF1ZGlvQnVzKiBkZXN0aW5hdGlvbkJ1cywgc2l6ZV90IGZyYW1l
c1RvUHJvY2Vzcyk7CisKKyAgICAvLyByZWFkRnJvbUJ1ZmZlcldpdGhHcmFpbkVudmVsb3BlKCkg
aXMgYSBsb3ctbGV2ZWwgYmxpdHRlciB3aGljaCByZWFkcyBmcm9tIHRoZSBBdWRpb0J1ZmZlciBh
bmQgYXBwbGllcyBhIGdyYWluIGVudmVsb3BlLgorICAgIHZvaWQgcmVhZEZyb21CdWZmZXJXaXRo
R3JhaW5FbnZlbG9wZShmbG9hdCogc291cmNlTCwgZmxvYXQqIHNvdXJjZVIsIGZsb2F0KiBkZXN0
aW5hdGlvbkwsIGZsb2F0KiBkZXN0aW5hdGlvblIsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQXVkaW9CdWZmZXJTb3Vy
Y2VOb2RlX2gKSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmlk
bAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5p
ZGwJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9k
ZS5pZGwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCittb2R1bGUg
YXVkaW8geworICAgIC8vIEEgY2FjaGVkIChub24tc3RyZWFtZWQpLCBtZW1vcnktcmVzaWRlbnQg
YXVkaW8gc291cmNlCisgICAgaW50ZXJmYWNlIFsKKyAgICAgICAgQ29uZGl0aW9uYWw9V0VCX0FV
RElPLAorICAgICAgICBHZW5lcmF0ZVRvSlMKKyAgICBdIEF1ZGlvQnVmZmVyU291cmNlTm9kZSA6
IEF1ZGlvU291cmNlTm9kZSB7CisgICAgICAgIGF0dHJpYnV0ZSBbQ3VzdG9tXSBBdWRpb0J1ZmZl
ciBidWZmZXI7CisKKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIEF1ZGlvR2FpbiBnYWluOwor
ICAgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9QYXJhbSBwbGF5YmFja1JhdGU7CisgICAg
ICAgIGF0dHJpYnV0ZSBib29sZWFuIGxvb3Bpbmc7IC8vIEZJWE1FOiBjaGFuZ2UgbmFtZSB0byAn
bG9vcCcgb25jZSBzYW1wbGVzIGFyZSB1cGRhdGVkCisKKyAgICAgICAgdm9pZCBub3RlT24oaW4g
ZmxvYXQgd2hlbik7CisgICAgICAgIHZvaWQgbm90ZUdyYWluT24oaW4gZmxvYXQgd2hlbiwgaW4g
ZmxvYXQgZ3JhaW5PZmZzZXQsIGluIGZsb2F0IGdyYWluRHVyYXRpb24pOworICAgICAgICB2b2lk
IG5vdGVPZmYoaW4gZmxvYXQgd2hlbik7CisgICAgfTsKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>