<?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>45571</bug_id>
          
          <creation_ts>2010-09-10 16:17:42 -0700</creation_ts>
          <short_desc>Add AudioNode files</short_desc>
          <delta_ts>2010-09-27 16:01:18 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>277514</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-10 16:17:42 -0700</bug_when>
    <thetext>Add AudioNode files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277517</commentid>
    <comment_count>1</comment_count>
      <attachid>67257</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-10 16:20:06 -0700</bug_when>
    <thetext>Created attachment 67257
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277518</commentid>
    <comment_count>2</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-10 16:21:20 -0700</bug_when>
    <thetext>This is the implementation for the AudioNode object as defined in the web audio specification:

http://chromium.googlecode.com/svn/trunk/samples/audio/specification/specification.html#AudioNode-section</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>278657</commentid>
    <comment_count>3</comment_count>
      <attachid>67257</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-13 19:24:18 -0700</bug_when>
    <thetext>Comment on attachment 67257
Patch

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

Here are my thoughts upon initial review. I&apos;d like to hear your comments before we decide how to proceed with the review.

&gt; WebCore/webaudio/AudioNode.cpp:54
&gt; +        memset(s_nodeCount, 0, sizeof(s_nodeCount));
Static data in C is specified as being initialized to zero, so the memset isn&apos;t necessary.

&gt; WebCore/webaudio/AudioNode.cpp:149
&gt; +    // These requests would be handled in the real-time audio thread.
We&apos;ve talked somewhat offline about what the real thread safety issues are throughout this code; for example, that using WTF&apos;s atomicIncrement/atomicDecrement in ref/deref wouldn&apos;t help because higher-level locking is needed for consistency of the overall audio graph. The fact that this code works is certainly a strong point in favor of its current structure, but I think it&apos;s very important to have good documentation and as many verified invariants as possible to ensure its thread safety, because multithreading bugs and crashes are among the hardest to debug. For one thing, AudioNode.h should document which threads call which methods, and if it is the case that certain methods are only called by one thread (like the real-time audio thread), there should be an assertion to that effect.

&gt; WebCore/webaudio/AudioNode.cpp:202
&gt; +                // Garbage collection - we&apos;ve already be disconnected
be -&gt; been

&gt; WebCore/webaudio/AudioNode.h:50
&gt; +class AudioNode {
As mentioned in my comments in the .cpp file, this class should document which methods are called on which threads (i.e., the main thread or the real-time audio thread). If a given method is only called by one type of thread or the other, there should be assertions to that effect.

&gt; WebCore/webaudio/AudioNode.h:105
&gt; +    AudioNodeInput* input(unsigned);
These should match the order of numberOfInputs() / numberOfOutputs().

&gt; WebCore/webaudio/AudioNode.h:136
&gt; +    Vector&lt;OwnPtr&lt;AudioNodeInput&gt; &gt; m_inputs;
&gt; +    Vector&lt;OwnPtr&lt;AudioNodeOutput&gt; &gt; m_outputs;
Because these members are protected rather than private, it is difficult to make any guarantees about the overall thread safety of this code. It appears that AudioNodeInputs and AudioNodeOutputs are instantiated by subclasses or other classes, since I don&apos;t see any creation in the reviews for AudioNode, AudioNodeInput or AudioNodeOutput. Is there any way to make these members private and encapsulate their creation within the AudioNode class?

&gt; WebCore/webaudio/AudioNode.h:143
&gt; +    int m_disabledRefCount;
These should be marked volatile.

&gt; WebCore/webaudio/AudioNode.idl:33
&gt; +        readonly attribute AudioContext context;
This attribute isn&apos;t in the Web Audio API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279196</commentid>
    <comment_count>4</comment_count>
      <attachid>67611</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-14 14:58:52 -0700</bug_when>
    <thetext>Created attachment 67611
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279200</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-14 15:08:32 -0700</bug_when>
    <thetext>&gt; Here are my thoughts upon initial review. I&apos;d like to hear your comments before we decide how to proceed with the review.

After discussing this with you in some detail, I think that a global recursive lock is the right approach for the connect(), disconnect(), ref(), and deref() methods.  The lock can be taken normally on the main thread, but in the real-time audio thread I will use tryLock().  If this tryLock() fails then the AudioNode being referenced or de-referenced will be added to a queue and will be tried again the next time the tryLock() is successfully acquired.  Because the real-time audio thread is being called very frequently and the tryLock() very rarely fails, this extra queue will rarely be used and will never grow that big.




&gt; WebCore/webaudio/AudioNode.cpp:54
&gt; +        memset(s_nodeCount, 0, sizeof(s_nodeCount));
Static data in C is specified as being initialized to zero, so the memset isn&apos;t necessary.

FIXED




&gt; WebCore/webaudio/AudioNode.cpp:149
&gt; +    // These requests would be handled in the real-time audio thread.
We&apos;ve talked somewhat offline about what the real thread safety issues are throughout this code; for example, that using WTF&apos;s atomicIncrement/atomicDecrement in ref/deref wouldn&apos;t help because higher-level locking is needed for consistency of the overall audio graph. The fact that this code works is certainly a strong point in favor of its current structure, but I think it&apos;s very important to have good documentation and as many verified invariants as possible to ensure its thread safety, because multithreading bugs and crashes are among the hardest to debug. For one thing, AudioNode.h should document which threads call which methods, and if it is the case that certain methods are only called by one thread (like the real-time audio thread), there should be an assertion to that effect.

ADDED ASSERTIONS TO IMPORTANT METHODS: connect(), disconnect(), processIfNecessary(), pullInputs()




&gt; WebCore/webaudio/AudioNode.cpp:202
&gt; +                // Garbage collection - we&apos;ve already be disconnected
be -&gt; been

FIXED



&gt; WebCore/webaudio/AudioNode.h:50
&gt; +class AudioNode {
As mentioned in my comments in the .cpp file, this class should document which methods are called on which threads (i.e., the main thread or the real-time audio thread). If a given method is only called by one type of thread or the other, there should be assertions to that effect.

ADDED COMMENTS TO IMPORTANT THREAD SAFETY METHODS




&gt; WebCore/webaudio/AudioNode.h:105
&gt; +    AudioNodeInput* input(unsigned);
These should match the order of numberOfInputs() / numberOfOutputs().

FIXED




&gt; WebCore/webaudio/AudioNode.h:136
&gt; +    Vector&lt;OwnPtr&lt;AudioNodeInput&gt; &gt; m_inputs;
&gt; +    Vector&lt;OwnPtr&lt;AudioNodeOutput&gt; &gt; m_outputs;
Because these members are protected rather than private, it is difficult to make any guarantees about the overall thread safety of this code. It appears that AudioNodeInputs and AudioNodeOutputs are instantiated by subclasses or other classes, since I don&apos;t see any creation in the reviews for AudioNode, AudioNodeInput or AudioNodeOutput. Is there any way to make these members private and encapsulate their creation within the AudioNode class?


There shouldn&apos;t be any thread safety issues with m_inputs and m_outputs since inputs and outputs are only created in the constructor and never dynamically changed during operation.


&gt; WebCore/webaudio/AudioNode.h:143
&gt; +    int m_disabledRefCount;
These should be marked volatile.

FIXED



&gt; WebCore/webaudio/AudioNode.idl:33
&gt; +        readonly attribute AudioContext context;
This attribute isn&apos;t in the Web Audio API.

ADDED ATTRIBUTE TO SPEC</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279774</commentid>
    <comment_count>6</comment_count>
      <attachid>67732</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 15:39:19 -0700</bug_when>
    <thetext>Created attachment 67732
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279777</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 15:41:25 -0700</bug_when>
    <thetext>I&apos;ve added the locking that I mentioned in the previous comment.  This involves a locking mechanism implemented in AudioContext, please see this patch for details:

https://bugs.webkit.org/show_bug.cgi?id=44890</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282509</commentid>
    <comment_count>8</comment_count>
      <attachid>68282</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 13:13:18 -0700</bug_when>
    <thetext>Created attachment 68282
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282510</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 13:15:42 -0700</bug_when>
    <thetext>This patch adds more rigorous thread safety.  I&apos;ve added extensive asserts about threads and locks being held in the important methods.  I&apos;ve tested this in both multicore and simulated single-core modes (by turning off all but one thread using hwprefs) under stress tests, repeatedly re-loading the page etc.  I have tested by adding test code to simulate the try locks failing much more frequently than normal to make sure we handle those code paths.  I&apos;ve run with the instrumentation to make sure that the reference counting doesn&apos;t create any memory leaks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285814</commentid>
    <comment_count>10</comment_count>
      <attachid>68282</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-27 15:39:11 -0700</bug_when>
    <thetext>Comment on attachment 68282
Patch

We&apos;ve discussed both this patch and that for AudioContext extensively offline and at this point I think this looks very good. One comment for the record: the reason that the atomic increments in AudioNode::ref() aren&apos;t guarded by the graph lock is covered by the FIXME in that method; this would only be necessary if waking up of a note which has already played were supported, which currently it is not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285840</commentid>
    <comment_count>11</comment_count>
      <attachid>68282</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-27 16:01:12 -0700</bug_when>
    <thetext>Comment on attachment 68282
Patch

Clearing flags on attachment: 68282

Committed r68438: &lt;http://trac.webkit.org/changeset/68438&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285841</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-27 16:01:18 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67257</attachid>
            <date>2010-09-10 16:20:06 -0700</date>
            <delta_ts>2010-09-14 14:58:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45571-20100910162005.patch</filename>
            <type>text/plain</type>
            <size>19713</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzI0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzYgQEAKKzIwMTAtMDktMTAgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Ob2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD00NTU3MQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBBUEkg
aXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvTm9kZS5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpBdWRpb05vZGUpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjp+QXVkaW9Ob2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvTm9kZTo6c2V0VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmxhenlJ
bml0aWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6b3V0cHV0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6aW5wdXQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9O
b2RlOjpjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6ZGlzY29ubmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnByb2Nlc3NJZk5lY2Vzc2FyeSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnB1bGxJbnB1dHMpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Ob2RlOjpyZWYpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpkZXJlZik6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnByaW50Tm9kZUNvdW50cyk6CisgICAgICAgICog
d2ViYXVkaW8vQXVkaW9Ob2RlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2Rl
Ojpjb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6dHlwZSk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb05vZGU6OmlzSW5pdGlhbGl6ZWQpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Ob2RlOjpudW1iZXJPZklucHV0cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6
Om51bWJlck9mT3V0cHV0cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnNhbXBsZVJh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpjaGVja051bWJlck9mQ2hhbm5lbHNG
b3JJbnB1dCk6CisgICAgICAgICogd2ViYXVkaW8vQXVkaW9Ob2RlLmlkbDogQWRkZWQuCisKIDIw
MTAtMDktMTA5ICBQZXRlciBLYXN0aW5nICA8cGthc3RpbmdAZ29vZ2xlLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9O
b2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBv
ZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdF
Ql9BVURJTykKKworI2luY2x1ZGUgIkF1ZGlvTm9kZS5oIgorCisjaW5jbHVkZSAiQXVkaW9Db250
ZXh0LmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlSW5wdXQuaCIKKyNpbmNsdWRlICJBdWRpb05vZGVP
dXRwdXQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitBdWRpb05vZGU6OkF1ZGlvTm9kZShB
dWRpb0NvbnRleHQqIGNvbnRleHQsIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgIDogbV90eXBlKE5v
ZGVUeXBlVW5rbm93bikKKyAgICAsIG1fY29udGV4dChjb250ZXh0KQorICAgICwgbV9zYW1wbGVS
YXRlKHNhbXBsZVJhdGUpCisgICAgLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgLCBtX2xh
c3RQcm9jZXNzaW5nVGltZSgtMS4wKQorICAgICwgbV9ub3JtYWxSZWZDb3VudCgxKSAvLyBzdGFy
dCBvdXQgd2l0aCBub3JtYWwgcmVmQ291bnQgPT0gMSAobGlrZSBXVEY6OlJlZkNvdW50ZWQgY2xh
c3MpCisgICAgLCBtX2Nvbm5lY3Rpb25SZWZDb3VudCgwKQorICAgICwgbV9kaXNhYmxlZFJlZkNv
dW50KDApCit7CisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBpZiAoIXNfaXNO
b2RlQ291bnRJbml0aWFsaXplZCkgeworICAgICAgICBzX2lzTm9kZUNvdW50SW5pdGlhbGl6ZWQg
PSB0cnVlOworICAgICAgICBtZW1zZXQoc19ub2RlQ291bnQsIDAsIHNpemVvZihzX25vZGVDb3Vu
dCkpOworICAgICAgICBhdGV4aXQoQXVkaW9Ob2RlOjpwcmludE5vZGVDb3VudHMpOworICAgIH0K
KyNlbmRpZgorfQorCitBdWRpb05vZGU6On5BdWRpb05vZGUoKQoreworI2lmIERFQlVHX0FVRElP
Tk9ERV9SRUZFUkVOQ0VTCisgICAgLS1zX25vZGVDb3VudFt0eXBlKCldOworI2VuZGlmCit9CisK
K3ZvaWQgQXVkaW9Ob2RlOjpzZXRUeXBlKE5vZGVUeXBlIHR5cGUpCit7CisgICAgbV90eXBlID0g
dHlwZTsKKworI2lmIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisgICAgKytzX25vZGVDb3Vu
dFt0eXBlXTsKKyNlbmRpZgorfQorCit2b2lkIEF1ZGlvTm9kZTo6bGF6eUluaXRpYWxpemUoKQor
eworICAgIGlmICghaXNJbml0aWFsaXplZCgpKQorICAgICAgICBpbml0aWFsaXplKCk7Cit9CisK
K0F1ZGlvTm9kZU91dHB1dCogQXVkaW9Ob2RlOjpvdXRwdXQodW5zaWduZWQgaSkKK3sKKyAgICBy
ZXR1cm4gbV9vdXRwdXRzW2ldLmdldCgpOworfQorCitBdWRpb05vZGVJbnB1dCogQXVkaW9Ob2Rl
OjppbnB1dCh1bnNpZ25lZCBpKQoreworICAgIHJldHVybiBtX2lucHV0c1tpXS5nZXQoKTsKK30K
KworYm9vbCBBdWRpb05vZGU6OmNvbm5lY3QoQXVkaW9Ob2RlKiBkZXN0aW5hdGlvbiwgdW5zaWdu
ZWQgb3V0cHV0SW5kZXgsIHVuc2lnbmVkIGlucHV0SW5kZXgpCit7CisgICAgLy8gU2FuaXR5IGNo
ZWNrIGlucHV0IGFuZCBvdXRwdXQgaW5kaWNlcy4KKyAgICBpZiAob3V0cHV0SW5kZXggPj0gbnVt
YmVyT2ZPdXRwdXRzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZGVzdGluYXRp
b24gJiYgaW5wdXRJbmRleCA+PSBkZXN0aW5hdGlvbi0+bnVtYmVyT2ZJbnB1dHMoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgQXVkaW9Ob2RlT3V0cHV0KiBvdXRwdXQgPSB0aGlzLT5v
dXRwdXQob3V0cHV0SW5kZXgpOworICAgIGlmICghZGVzdGluYXRpb24pIHsKKyAgICAgICAgLy8g
RGlzY29ubmVjdCBvdXRwdXQgZnJvbSBhbnkgaW5wdXRzIGl0IG1heSBiZSBjdXJyZW50bHkgY29u
bmVjdGVkIHRvLgorICAgICAgICBvdXRwdXQtPmRpc2Nvbm5lY3RBbGxJbnB1dHMoKTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQXVkaW9Ob2RlSW5wdXQqIGlucHV0ID0gZGVz
dGluYXRpb24tPmlucHV0KGlucHV0SW5kZXgpOworICAgIGlucHV0LT5jb25uZWN0KG91dHB1dCk7
CisKKyAgICAvLyBMZXQgY29udGV4dCBrbm93IHRoYXQgYSBjb25uZWN0aW9uIGhhcyBiZWVuIG1h
ZGUuCisgICAgY29udGV4dCgpLT5pbmNyZW1lbnRDb25uZWN0aW9uQ291bnQoKTsKKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIEF1ZGlvTm9kZTo6ZGlzY29ubmVjdCh1bnNpZ25lZCBvdXRw
dXRJbmRleCkKK3sKKyAgICByZXR1cm4gY29ubmVjdCgwLCBvdXRwdXRJbmRleCk7Cit9CisKK3Zv
aWQgQXVkaW9Ob2RlOjpwcm9jZXNzSWZOZWNlc3Nhcnkoc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykK
K3sKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8g
RW5zdXJlIHRoYXQgd2Ugb25seSBwcm9jZXNzIG9uY2UgcGVyIHJlbmRlcmluZyBxdWFudHVtLgor
ICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgImZhbm91dCIgcHJvYmxlbSB3aGVyZSBhbiBvdXRwdXQg
aXMgY29ubmVjdGVkIHRvIG11bHRpcGxlIGlucHV0cy4KKyAgICAvLyBUaGUgZmlyc3QgdGltZSB3
ZSdyZSBjYWxsZWQgZHVyaW5nIHRoaXMgdGltZSBzbGljZSB3ZSBwcm9jZXNzLCBidXQgYWZ0ZXIg
dGhhdCB3ZSBkb24ndCB3YW50IHRvIHJlLXByb2Nlc3MsCisgICAgLy8gaW5zdGVhZCBvdXIgb3V0
cHV0KHMpIHdpbGwgYWxyZWFkeSBoYXZlIHRoZSByZXN1bHRzIGNhY2hlZCBpbiB0aGVpciBidXM7
CisgICAgZG91YmxlIGN1cnJlbnRUaW1lID0gY29udGV4dCgpLT5jdXJyZW50VGltZSgpOworICAg
IGlmIChtX2xhc3RQcm9jZXNzaW5nVGltZSAhPSBjdXJyZW50VGltZSkgeworICAgICAgICBtX2xh
c3RQcm9jZXNzaW5nVGltZSA9IGN1cnJlbnRUaW1lOyAvLyBpbXBvcnRhbnQgdG8gZmlyc3QgdXBk
YXRlIHRoaXMgdGltZSBiZWNhdXNlIG9mIGZlZWRiYWNrIGxvb3BzIGluIHRoZSByZW5kZXJpbmcg
Z3JhcGgKKyAgICAgICAgcHVsbElucHV0cyhmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICBwcm9j
ZXNzKGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvTm9kZTo6cHVsbElu
cHV0cyhzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIC8vIFByb2Nlc3MgYWxsIG9mIHRo
ZSBBdWRpb05vZGVzIGNvbm5lY3RlZCB0byBvdXIgaW5wdXRzLgorICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBtX2lucHV0cy5zaXplKCk7ICsraSkKKyAgICAgICAgaW5wdXQoaSktPnB1bGwo
MCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCBBdWRpb05vZGU6OnJlZihSZWZUeXBlIHJl
ZlR5cGUpCit7CisgICAgLy8gRklYTUU6IG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRyaWNreSBzaW5j
ZSBjYW4ndCBjb250ZW5kIGxvY2sgaW4gcmVhbC10aW1lIHRocmVhZAorICAgIC8vIEluc3RlYWQs
IGEgZ29vZCBzb2x1dGlvbiBtYXkgYmUgdG8gdXNlIGEgbG9jay1mcmVlIHF1ZXVlIGZvciB0aGUg
cmVmIHJlcXVlc3RzIG9mIFJlZlR5cGVOb3JtYWwuCisgICAgLy8gVGhlc2UgcmVxdWVzdHMgd291
bGQgYmUgaGFuZGxlZCBpbiB0aGUgcmVhbC10aW1lIGF1ZGlvIHRocmVhZC4KKworICAgIGlmICgh
bV9jb25uZWN0aW9uUmVmQ291bnQgJiYgcmVmVHlwZSA9PSBSZWZUeXBlQ29ubmVjdGlvbikgewor
ICAgICAgICAvLyBXZSBzaG91bGQgbm90IGJlICJhY3RpdmVseSIgY29ubmVjdGVkIHRvIGFueXRo
aW5nLCBidXQgbm93IHdlJ3JlICJ3YWtpbmcgdXAiCisgICAgICAgIC8vIEZvciBleGFtcGxlLCBh
IG5vdGUgd2hpY2ggaGFzIGZpbmlzaGVkIHBsYXlpbmcsIGJ1dCBpcyBub3cgYmVpbmcgcGxheWVk
IGFnYWluLgorICAgICAgICAvLyBGSVhNRTogaW1wbGVtZW50IHdha2UtdXAKKyAgICB9CisKKyAg
ICBzd2l0Y2ggKHJlZlR5cGUpIHsKKyAgICBjYXNlIFJlZlR5cGVOb3JtYWw6CisgICAgICAgIG1f
bm9ybWFsUmVmQ291bnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSZWZUeXBlQ29ubmVj
dGlvbjoKKyAgICAgICAgbV9jb25uZWN0aW9uUmVmQ291bnQrKzsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBSZWZUeXBlRGlzYWJsZWQ6CisgICAgICAgIG1fZGlzYWJsZWRSZWZDb3VudCsrOwor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5D
RVMKKyAgICBwcmludGYoIiVwOiAlZDogQXVkaW9Ob2RlOjpyZWYoKSAlZCAlZCAlZFxuIiwgdGhp
cywgdHlwZSgpLCBtX25vcm1hbFJlZkNvdW50LCBtX2Nvbm5lY3Rpb25SZWZDb3VudCwgbV9kaXNh
YmxlZFJlZkNvdW50KTsKKyNlbmRpZgorfQorCit2b2lkIEF1ZGlvTm9kZTo6ZGVyZWYoUmVmVHlw
ZSByZWZUeXBlKQoreworICAgIC8vIEZJWE1FOiBub3QgdGhyZWFkLXNhZmUsIGJ1dCB0cmlja3kg
c2luY2UgY2FuJ3QgY29udGVuZCBsb2NrIGluIHJlYWwtdGltZSB0aHJlYWQKKyAgICAvLyBJbnN0
ZWFkLCBhIGdvb2Qgc29sdXRpb24gbWF5IGJlIHRvIHVzZSBhIGxvY2stZnJlZSBxdWV1ZSBmb3Ig
dGhlIGRlcmVmIHJlcXVlc3RzIG9mIFJlZlR5cGVOb3JtYWwuCisgICAgLy8gVGhlc2UgcmVxdWVz
dHMgd291bGQgYmUgaGFuZGxlZCBpbiB0aGUgcmVhbC10aW1lIGF1ZGlvIHRocmVhZC4KKworICAg
IHN3aXRjaCAocmVmVHlwZSkgeworICAgIGNhc2UgUmVmVHlwZU5vcm1hbDoKKyAgICAgICAgQVNT
RVJUKG1fbm9ybWFsUmVmQ291bnQgPiAwKTsKKyAgICAgICAgbV9ub3JtYWxSZWZDb3VudC0tOwor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIFJlZlR5cGVDb25uZWN0aW9uOgorICAgICAgICBBU1NF
UlQobV9jb25uZWN0aW9uUmVmQ291bnQgPiAwKTsKKyAgICAgICAgbV9jb25uZWN0aW9uUmVmQ291
bnQtLTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSZWZUeXBlRGlzYWJsZWQ6CisgICAgICAg
IEFTU0VSVChtX2Rpc2FibGVkUmVmQ291bnQgPiAwKTsKKyAgICAgICAgbV9kaXNhYmxlZFJlZkNv
dW50LS07CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghbV9jb25uZWN0aW9uUmVm
Q291bnQpIHsKKyAgICAgICAgaWYgKCFtX25vcm1hbFJlZkNvdW50ICYmICFtX2Rpc2FibGVkUmVm
Q291bnQpIHsKKyAgICAgICAgICAgIC8vIEFsbCByZWZlcmVuY2VzIGFyZSBnb25lIC0gd2UgbmVl
ZCB0byBnbyBhd2F5LgorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fb3V0
cHV0cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICBvdXRwdXQoaSktPmRpc2Nvbm5lY3RB
bGxJbnB1dHMoKTsgLy8gdGhpcyB3aWxsIGRlcmVmKCkgbm9kZXMgd2UncmUgY29ubmVjdGVkIHRv
Li4uCisKKyAgICAgICAgICAgIGlmIChyZWZUeXBlID09IFJlZlR5cGVOb3JtYWwpIHsKKyAgICAg
ICAgICAgICAgICAvLyBHYXJiYWdlIGNvbGxlY3Rpb24gLSB3ZSd2ZSBhbHJlYWR5IGJlIGRpc2Nv
bm5lY3RlZAorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzOyAvLyBzYWZlIHRvIGRlbGV0ZSBy
aWdodCBhd2F5CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlJ3Jl
IGluIHJlYWwtdGltZSB0aHJlYWQsIG1hcmsgZm9yIGRlbGV0aW9uIGF0IGVuZCBvZiByZW5kZXIg
Y3ljbGUuCisgICAgICAgICAgICAgICAgY29udGV4dCgpLT5tYXJrRm9yRGVsZXRpb24odGhpcyk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVmVHlwZSA9PSBSZWZUeXBlQ29u
bmVjdGlvbikgeworICAgICAgICAgICAgLy8gU3RpbGwgbWF5IGhhdmUgSmF2YVNjcmlwdCByZWZl
cmVuY2VzLCBidXQgbm8gbW9yZSAiYWN0aXZlIiBjb25uZWN0aW9uIHJlZmVyZW5jZXMsIHNvIHB1
dCBhbGwgb2Ygb3VyIG91dHB1dHMgaW4gYSAiZG9ybWFudCIgZGlzYWJsZWQgc3RhdGUuCisgICAg
ICAgICAgICAvLyBHYXJiYWdlIGNvbGxlY3Rpb24gbWF5IHRha2UgYSB2ZXJ5IGxvbmcgdGltZSBh
ZnRlciB0aGlzIHRpbWUsIHNvIHRoZSAiZG9ybWFudCIgZGlzYWJsZWQgbm9kZXMgc2hvdWxkIG5v
dCBib2cgZG93biB0aGUgcmVuZGVyaW5nLi4uCisKKyAgICAgICAgICAgIC8vIEFzIGZhciBhcyBK
YXZhU2NyaXB0IGlzIGNvbmNlcm5lZCwgb3VyIG91dHB1dHMgbXVzdCBzdGlsbCBhcHBlYXIgdG8g
YmUgY29ubmVjdGVkLgorICAgICAgICAgICAgLy8gQnV0IGludGVybmFsbHkgb3VyIG91dHB1dHMg
c2hvdWxkIGJlIGRpc2FibGVkIGZyb20gdGhlIGlucHV0cyB0aGV5J3JlIGNvbm5lY3RlZCB0by4K
KyAgICAgICAgICAgIC8vIGRpc2FibGUoKSBjYW4gcmVjdXJzaXZlbHkgZGVyZWYgY29ubmVjdGlv
bnMgKGFuZCBjYWxsIGRpc2FibGUoKSkgZG93biBhIHdob2xlIGNoYWluIG9mIGNvbm5lY3RlZCBu
b2Rlcy4KKworICAgICAgICAgICAgLy8gRklYTUU6IHdlIHNwZWNpYWwgY2FzZSB0aGUgY29udm9s
dmVyIGFuZCBkZWxheSBzaW5jZSB0aGV5IGhhdmUgYSBzaWduaWZpY2FudCB0YWlsLXRpbWUgYW5k
IHNob3VsZG4ndCBiZSBkaXNjb25uZWN0ZWQgc2ltcGx5CisgICAgICAgICAgICAvLyBiZWNhdXNl
IGl0IG5vIGxvbmdlciBoYXMgYW55IGlucHV0IGNvbm5lY3Rpb25zLiAgVGhpcyBuZWVkcyB0byBi
ZSBoYW5kbGVkIG1vcmUgZ2VuZXJhbGx5IHdoZXJlIEF1ZGlvTm9kZXMgaGF2ZQorICAgICAgICAg
ICAgLy8gYSB0YWlsVGltZSBhdHRyaWJ1dGUuICBUaGVuIHRoZSBBdWRpb05vZGUgb25seSBuZWVk
cyB0byByZW1haW4gImFjdGl2ZSIgZm9yIHRhaWxUaW1lIHNlY29uZHMgYWZ0ZXIgdGhlcmUgYXJl
IG5vCisgICAgICAgICAgICAvLyBsb25nZXIgYW55IGFjdGl2ZSBjb25uZWN0aW9ucy4KKyAgICAg
ICAgICAgIGlmICh0eXBlKCkgIT0gTm9kZVR5cGVDb252b2x2ZXIgJiYgdHlwZSgpICE9IE5vZGVU
eXBlRGVsYXkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9v
dXRwdXRzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBvdXRwdXQoaSktPmRpc2Fi
bGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmIERFQlVHX0FVRElP
Tk9ERV9SRUZFUkVOQ0VTCisgICAgcHJpbnRmKCIlcDogJWQ6IEF1ZGlvTm9kZTo6ZGVyZWYoKSAl
ZCAlZCAlZFxuIiwgdGhpcywgdHlwZSgpLCBtX25vcm1hbFJlZkNvdW50LCBtX2Nvbm5lY3Rpb25S
ZWZDb3VudCwgbV9kaXNhYmxlZFJlZkNvdW50KTsKKyNlbmRpZgorfQorCisjaWYgREVCVUdfQVVE
SU9OT0RFX1JFRkVSRU5DRVMKKworYm9vbCBBdWRpb05vZGU6OnNfaXNOb2RlQ291bnRJbml0aWFs
aXplZCA9IGZhbHNlOworaW50IEF1ZGlvTm9kZTo6c19ub2RlQ291bnRbTm9kZVR5cGVFbmRdOwor
Cit2b2lkIEF1ZGlvTm9kZTo6cHJpbnROb2RlQ291bnRzKCkKK3sKKyAgICBwcmludGYoIlxuXG4i
KTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgcHJp
bnRmKCJBdWRpb05vZGU6IHJlZmVyZW5jZSBjb3VudHNcbiIpOworICAgIHByaW50ZigiPT09PT09
PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBOb2RlVHlwZUVuZDsgKytpKQorICAgICAgICBwcmludGYoIiVkOiAlZFxuIiwgaSwgc19ub2Rl
Q291bnRbaV0pOworCisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxu
XG4iKTsKK30KKworI2VuZGlmIC8vIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4OiBX
ZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVk
aW8vQXVkaW9Ob2RlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9k
ZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIp
IG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQXVkaW9Ob2RlX2gK
KyNkZWZpbmUgQXVkaW9Ob2RlX2gKKworI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRl
IDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjZGVmaW5lIERFQlVH
X0FVRElPTk9ERV9SRUZFUkVOQ0VTIDAKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBB
dWRpb0NvbnRleHQ7CitjbGFzcyBBdWRpb05vZGVJbnB1dDsKK2NsYXNzIEF1ZGlvTm9kZU91dHB1
dDsKKworLy8gQW4gQXVkaW9Ob2RlIGlzIHRoZSBiYXNpYyBidWlsZGluZyBibG9jayBmb3IgaGFu
ZGxpbmcgYXVkaW8gd2l0aGluIGFuIEF1ZGlvQ29udGV4dC4KKy8vIEl0IG1heSBiZSBhbiBhdWRp
byBzb3VyY2UsIGFuIGludGVybWVkaWF0ZSBwcm9jZXNzaW5nIG1vZHVsZSwgb3IgYW4gYXVkaW8g
ZGVzdGluYXRpb24uCisvLyBFYWNoIEF1ZGlvTm9kZSBjYW4gaGF2ZSBpbnB1dHMgYW5kL29yIG91
dHB1dHMuIEFuIEF1ZGlvU291cmNlTm9kZSBoYXMgbm8gaW5wdXRzIGFuZCBhIHNpbmdsZSBvdXRw
dXQuCisvLyBBbiBBdWRpb0Rlc3RpbmF0aW9uTm9kZSBoYXMgb25lIGlucHV0IGFuZCBubyBvdXRw
dXRzIGFuZCByZXByZXNlbnRzIHRoZSBmaW5hbCBkZXN0aW5hdGlvbiB0byB0aGUgYXVkaW8gaGFy
ZHdhcmUuCisvLyBNb3N0IHByb2Nlc3Npbmcgbm9kZXMgc3VjaCBhcyBmaWx0ZXJzIHdpbGwgaGF2
ZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQsIGFsdGhvdWdoIG11bHRpcGxlIGlucHV0cyBhbmQg
b3V0cHV0cyBhcmUgcG9zc2libGUuCisKK2NsYXNzIEF1ZGlvTm9kZSB7CitwdWJsaWM6CisgICAg
ZW51bSB7IFByb2Nlc3NpbmdTaXplSW5GcmFtZXMgPSAxMjggfTsKKworICAgIEF1ZGlvTm9kZShB
dWRpb0NvbnRleHQqLCBkb3VibGUgc2FtcGxlUmF0ZSk7CisgICAgdmlydHVhbCB+QXVkaW9Ob2Rl
KCk7CisKKyAgICBBdWRpb0NvbnRleHQqIGNvbnRleHQoKSB7IHJldHVybiBtX2NvbnRleHQ7IH0K
KworICAgIGVudW0gTm9kZVR5cGUgeworICAgICAgICBOb2RlVHlwZVVua25vd24sCisgICAgICAg
IE5vZGVUeXBlRGVzdGluYXRpb24sCisgICAgICAgIE5vZGVUeXBlQXVkaW9CdWZmZXJTb3VyY2Us
CisgICAgICAgIE5vZGVUeXBlSmF2YVNjcmlwdCwKKyAgICAgICAgTm9kZVR5cGVMb3dQYXNzMkZp
bHRlciwKKyAgICAgICAgTm9kZVR5cGVIaWdoUGFzczJGaWx0ZXIsCisgICAgICAgIE5vZGVUeXBl
UGFubmVyLAorICAgICAgICBOb2RlVHlwZUNvbnZvbHZlciwKKyAgICAgICAgTm9kZVR5cGVEZWxh
eSwKKyAgICAgICAgTm9kZVR5cGVHYWluLAorICAgICAgICBOb2RlVHlwZUNoYW5uZWxTcGxpdHRl
ciwKKyAgICAgICAgTm9kZVR5cGVDaGFubmVsTWVyZ2VyLAorICAgICAgICBOb2RlVHlwZUFuYWx5
c2VyLAorICAgICAgICBOb2RlVHlwZUVuZAorICAgIH07CisKKyAgICBOb2RlVHlwZSB0eXBlKCkg
Y29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisgICAgdm9pZCBzZXRUeXBlKE5vZGVUeXBlKTsKKwor
ICAgIC8vIFdlIGhhbmRsZSBvdXIgb3duIHJlZi1jb3VudGluZyBiZWNhdXNlIG9mIHRoZSB0aHJl
YWRpbmcgaXNzdWVzIGFuZCBzdWJ0bGUgbmF0dXJlIG9mCisgICAgLy8gaG93IEF1ZGlvTm9kZXMg
Y2FuIGNvbnRpbnVlIHByb2Nlc3NpbmcgKHBsYXlpbmcgb25lLXNob3Qgc291bmQpIGFmdGVyIHRo
ZXJlIGFyZSBubyBtb3JlCisgICAgLy8gSmF2YVNjcmlwdCByZWZlcmVuY2VzIHRvIHRoZSBvYmpl
Y3QuCisgICAgZW51bSBSZWZUeXBlIHsgUmVmVHlwZU5vcm1hbCwgUmVmVHlwZUNvbm5lY3Rpb24s
IFJlZlR5cGVEaXNhYmxlZCB9OworICAgIHZvaWQgcmVmKFJlZlR5cGUgcmVmVHlwZSA9IFJlZlR5
cGVOb3JtYWwpOworICAgIHZvaWQgZGVyZWYoUmVmVHlwZSByZWZUeXBlID0gUmVmVHlwZU5vcm1h
bCk7CisKKyAgICAvLyBUaGUgQXVkaW9Ob2RlSW5wdXQocykgKGlmIGFueSkgd2lsbCBhbHJlYWR5
IGhhdmUgdGhlaXIgaW5wdXQgZGF0YSBhdmFpbGFibGUgd2hlbiBwcm9jZXNzKCkgaXMgY2FsbGVk
LgorICAgIC8vIFN1YmNsYXNzZXMgd2lsbCB0YWtlIHRoaXMgaW5wdXQgZGF0YSBhbmQgcHV0IHRo
ZSByZXN1bHRzIGluIHRoZSBBdWRpb0J1cyhzKSBvZiBpdHMgQXVkaW9Ob2RlT3V0cHV0KHMpIChp
ZiBhbnkpCisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcykg
PSAwOworCisgICAgLy8gUmVzZXRzIERTUCBwcm9jZXNzaW5nIHN0YXRlIChjbGVhcnMgZGVsYXkg
bGluZXMsIGZpbHRlciBtZW1vcnksIGV0Yy4pCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAw
OworCisgICAgLy8gTm8gc2lnbmlmaWNhbnQgcmVzb3VyY2VzIHNob3VsZCBiZSBhbGxvY2F0ZWQg
dW50aWwgaW5pdGlhbGl6ZSgpIGlzIGNhbGxlZC4KKyAgICAvLyBQcm9jZXNzaW5nIG1heSBub3Qg
b2NjdXIgdW50aWwgYSBub2RlIGlzIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgdm9pZCBpbml0
aWFsaXplKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCB1bmluaXRpYWxpemUoKSA9IDA7CisKKyAg
ICBib29sIGlzSW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBtX2lzSW5pdGlhbGl6ZWQ7IH0K
KyAgICB2b2lkIGxhenlJbml0aWFsaXplKCk7CisKKyAgICB1bnNpZ25lZCBudW1iZXJPZklucHV0
cygpIGNvbnN0IHsgcmV0dXJuIG1faW5wdXRzLnNpemUoKTsgfQorICAgIHVuc2lnbmVkIG51bWJl
ck9mT3V0cHV0cygpIGNvbnN0IHsgcmV0dXJuIG1fb3V0cHV0cy5zaXplKCk7IH0KKworICAgIEF1
ZGlvTm9kZU91dHB1dCogb3V0cHV0KHVuc2lnbmVkKTsKKyAgICBBdWRpb05vZGVJbnB1dCogaW5w
dXQodW5zaWduZWQpOworCisgICAgLy8gY29ubmVjdCgpIC8gZGlzY29ubmVjdCgpIHJldHVybiB0
cnVlIG9uIHN1Y2Nlc3MuCisgICAgYm9vbCBjb25uZWN0KEF1ZGlvTm9kZSogZGVzdGluYXRpb24s
IHVuc2lnbmVkIG91dHB1dEluZGV4ID0gMCwgdW5zaWduZWQgaW5wdXRJbmRleCA9IDApOworICAg
IGJvb2wgZGlzY29ubmVjdCh1bnNpZ25lZCBvdXRwdXRJbmRleCA9IDApOworCisgICAgZG91Ymxl
IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtX3NhbXBsZVJhdGU7IH0KKworICAgIC8vIHBy
b2Nlc3NJZk5lY2Vzc2FyeSgpIGlzIGNhbGxlZCBieSBvdXIgb3V0cHV0KHMpIHdoZW4gdGhlIHJl
bmRlcmluZyBncmFwaCBuZWVkcyB0aGlzIEF1ZGlvTm9kZSB0byBwcm9jZXNzLgorICAgIC8vIFRo
aXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgQXVkaW9Ob2RlIHdpbGwgb25seSBwcm9jZXNzIG9u
Y2UgcGVyIHJlbmRlcmluZyB0aW1lIHF1YW50dW0gZXZlbiBpZiBpdCdzIGNhbGxlZCByZXBlYXRl
ZGx5LgorICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiAiZmFub3V0IiB3aGVyZSBhbiBv
dXRwdXQgaXMgY29ubmVjdGVkIHRvIG11bHRpcGxlIEF1ZGlvTm9kZSBpbnB1dHMuCisgICAgdm9p
ZCBwcm9jZXNzSWZOZWNlc3Nhcnkoc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAvLyBD
YWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGhhcyBiZWVuIG1hZGUgdG8gb25lIG9mIG91ciBp
bnB1dHMgb3IgdGhlIGNvbm5lY3Rpb24gbnVtYmVyIG9mIGNoYW5uZWxzIGhhcyBjaGFuZ2VkLgor
ICAgIC8vIFRoaXMgcG90ZW50aWFsbHkgZ2l2ZXMgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBl
cmZvcm0gYSBsYXp5IGluaXRpYWxpemF0aW9uIG9yLCBpZiBuZWNlc3NhcnksIGEgcmUtaW5pdGlh
bGl6YXRpb24uCisgICAgdmlydHVhbCB2b2lkIGNoZWNrTnVtYmVyT2ZDaGFubmVsc0ZvcklucHV0
KEF1ZGlvTm9kZUlucHV0KikgeyB9CisKKyNpZiBERUJVR19BVURJT05PREVfUkVGRVJFTkNFUwor
ICAgIHN0YXRpYyB2b2lkIHByaW50Tm9kZUNvdW50cygpOworI2VuZGlmCisKK3Byb3RlY3RlZDoK
KyAgICAvLyBDYWxsZWQgYnkgcHJvY2Vzc0lmTmVjZXNzYXJ5KCkgdG8gY2F1c2UgYWxsIHBhcnRz
IG9mIHRoZSByZW5kZXJpbmcgZ3JhcGggY29ubmVjdGVkIHRvIHVzIHRvIHByb2Nlc3MuCisgICAg
Ly8gRWFjaCByZW5kZXJpbmcgcXVhbnR1bSwgdGhlIGF1ZGlvIGRhdGEgZm9yIGVhY2ggb2YgdGhl
IEF1ZGlvTm9kZSdzIGlucHV0cyB3aWxsIGJlIGF2YWlsYWJsZSBhZnRlciB0aGlzIG1ldGhvZCBp
cyBjYWxsZWQuCisgICAgdmlydHVhbCB2b2lkIHB1bGxJbnB1dHMoc2l6ZV90IGZyYW1lc1RvUHJv
Y2Vzcyk7CisKKyAgICBOb2RlVHlwZSBtX3R5cGU7CisgICAgQXVkaW9Db250ZXh0KiBtX2NvbnRl
eHQ7CisgICAgZG91YmxlIG1fc2FtcGxlUmF0ZTsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsK
KyAgICBWZWN0b3I8T3duUHRyPEF1ZGlvTm9kZUlucHV0PiA+IG1faW5wdXRzOworICAgIFZlY3Rv
cjxPd25QdHI8QXVkaW9Ob2RlT3V0cHV0PiA+IG1fb3V0cHV0czsKKworICAgIGRvdWJsZSBtX2xh
c3RQcm9jZXNzaW5nVGltZTsKKworICAgIC8vIFJlZi1jb3VudGluZworICAgIGludCBtX25vcm1h
bFJlZkNvdW50OworICAgIGludCBtX2Nvbm5lY3Rpb25SZWZDb3VudDsKKyAgICBpbnQgbV9kaXNh
YmxlZFJlZkNvdW50OworCisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBzdGF0
aWMgYm9vbCBzX2lzTm9kZUNvdW50SW5pdGlhbGl6ZWQ7CisgICAgc3RhdGljIGludCBzX25vZGVD
b3VudFtOb2RlVHlwZUVuZF07CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIEF1ZGlvTm9kZV9oCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9k
ZS5pZGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworbW9kdWxlIGF1ZGlvIHsKKyAgICBpbnRlcmZhY2UgWworICAgICAg
ICBDb25kaXRpb25hbD1XRUJfQVVESU8KKyAgICBdIEF1ZGlvTm9kZSB7CisgICAgICAgIHJlYWRv
bmx5IGF0dHJpYnV0ZSBBdWRpb0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgcmVhZG9ubHkgYXR0
cmlidXRlIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZJbnB1dHM7CisgICAgICAgIHJlYWRvbmx5IGF0
dHJpYnV0ZSB1bnNpZ25lZCBsb25nIG51bWJlck9mT3V0cHV0czsKKworICAgICAgICBbQ3VzdG9t
XSB2b2lkIGNvbm5lY3QoaW4gQXVkaW9Ob2RlIGRlc3RpbmF0aW9uLCBpbiB1bnNpZ25lZCBsb25n
IG91dHB1dCwgaW4gdW5zaWduZWQgbG9uZyBpbnB1dCk7CisgICAgICAgIFtDdXN0b21dIHZvaWQg
ZGlzY29ubmVjdChpbiB1bnNpZ25lZCBsb25nIG91dHB1dCk7CisgICAgfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67611</attachid>
            <date>2010-09-14 14:58:52 -0700</date>
            <delta_ts>2010-09-15 15:39:15 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45571-20100914145851.patch</filename>
            <type>text/plain</type>
            <size>20325</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzUwMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzYgQEAKKzIwMTAtMDktMTQgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Ob2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD00NTU3MQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBBUEkg
aXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvTm9kZS5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpBdWRpb05vZGUpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjp+QXVkaW9Ob2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvTm9kZTo6c2V0VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmxhenlJ
bml0aWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6b3V0cHV0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6aW5wdXQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9O
b2RlOjpjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6ZGlzY29ubmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnByb2Nlc3NJZk5lY2Vzc2FyeSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnB1bGxJbnB1dHMpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Ob2RlOjpyZWYpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpkZXJlZik6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnByaW50Tm9kZUNvdW50cyk6CisgICAgICAgICog
d2ViYXVkaW8vQXVkaW9Ob2RlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2Rl
Ojpjb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6dHlwZSk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb05vZGU6OmlzSW5pdGlhbGl6ZWQpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Ob2RlOjpudW1iZXJPZklucHV0cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6
Om51bWJlck9mT3V0cHV0cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnNhbXBsZVJh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpjaGVja051bWJlck9mQ2hhbm5lbHNG
b3JJbnB1dCk6CisgICAgICAgICogd2ViYXVkaW8vQXVkaW9Ob2RlLmlkbDogQWRkZWQuCisKIDIw
MTAtMDktMTQgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUB3ZWJraXQub3JnPgogCiAgICAgICAg
IEJ1aWxkIGNvcnJlY3Rpb24sIG5vIHJldmlldy4KSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVk
aW9Ob2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxF
KFdFQl9BVURJTykKKworI2luY2x1ZGUgIkF1ZGlvTm9kZS5oIgorCisjaW5jbHVkZSAiQXVkaW9D
b250ZXh0LmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlSW5wdXQuaCIKKyNpbmNsdWRlICJBdWRpb05v
ZGVPdXRwdXQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitBdWRpb05vZGU6OkF1ZGlvTm9k
ZShBdWRpb0NvbnRleHQqIGNvbnRleHQsIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgIDogbV90eXBl
KE5vZGVUeXBlVW5rbm93bikKKyAgICAsIG1fY29udGV4dChjb250ZXh0KQorICAgICwgbV9zYW1w
bGVSYXRlKHNhbXBsZVJhdGUpCisgICAgLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgLCBt
X2xhc3RQcm9jZXNzaW5nVGltZSgtMS4wKQorICAgICwgbV9ub3JtYWxSZWZDb3VudCgxKSAvLyBz
dGFydCBvdXQgd2l0aCBub3JtYWwgcmVmQ291bnQgPT0gMSAobGlrZSBXVEY6OlJlZkNvdW50ZWQg
Y2xhc3MpCisgICAgLCBtX2Nvbm5lY3Rpb25SZWZDb3VudCgwKQorICAgICwgbV9kaXNhYmxlZFJl
ZkNvdW50KDApCit7CisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBpZiAoIXNf
aXNOb2RlQ291bnRJbml0aWFsaXplZCkgeworICAgICAgICBzX2lzTm9kZUNvdW50SW5pdGlhbGl6
ZWQgPSB0cnVlOworICAgICAgICBhdGV4aXQoQXVkaW9Ob2RlOjpwcmludE5vZGVDb3VudHMpOwor
ICAgIH0KKyNlbmRpZgorfQorCitBdWRpb05vZGU6On5BdWRpb05vZGUoKQoreworI2lmIERFQlVH
X0FVRElPTk9ERV9SRUZFUkVOQ0VTCisgICAgLS1zX25vZGVDb3VudFt0eXBlKCldOworI2VuZGlm
Cit9CisKK3ZvaWQgQXVkaW9Ob2RlOjpzZXRUeXBlKE5vZGVUeXBlIHR5cGUpCit7CisgICAgbV90
eXBlID0gdHlwZTsKKworI2lmIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisgICAgKytzX25v
ZGVDb3VudFt0eXBlXTsKKyNlbmRpZgorfQorCit2b2lkIEF1ZGlvTm9kZTo6bGF6eUluaXRpYWxp
emUoKQoreworICAgIGlmICghaXNJbml0aWFsaXplZCgpKQorICAgICAgICBpbml0aWFsaXplKCk7
Cit9CisKK0F1ZGlvTm9kZU91dHB1dCogQXVkaW9Ob2RlOjpvdXRwdXQodW5zaWduZWQgaSkKK3sK
KyAgICByZXR1cm4gbV9vdXRwdXRzW2ldLmdldCgpOworfQorCitBdWRpb05vZGVJbnB1dCogQXVk
aW9Ob2RlOjppbnB1dCh1bnNpZ25lZCBpKQoreworICAgIHJldHVybiBtX2lucHV0c1tpXS5nZXQo
KTsKK30KKworYm9vbCBBdWRpb05vZGU6OmNvbm5lY3QoQXVkaW9Ob2RlKiBkZXN0aW5hdGlvbiwg
dW5zaWduZWQgb3V0cHV0SW5kZXgsIHVuc2lnbmVkIGlucHV0SW5kZXgpCit7CisgICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKKyAgICAKKyAgICAvLyBTYW5pdHkgY2hlY2sgaW5wdXQgYW5kIG91
dHB1dCBpbmRpY2VzLgorICAgIGlmIChvdXRwdXRJbmRleCA+PSBudW1iZXJPZk91dHB1dHMoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChkZXN0aW5hdGlvbiAmJiBpbnB1dEluZGV4
ID49IGRlc3RpbmF0aW9uLT5udW1iZXJPZklucHV0cygpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBBdWRpb05vZGVPdXRwdXQqIG91dHB1dCA9IHRoaXMtPm91dHB1dChvdXRwdXRJbmRl
eCk7CisgICAgaWYgKCFkZXN0aW5hdGlvbikgeworICAgICAgICAvLyBEaXNjb25uZWN0IG91dHB1
dCBmcm9tIGFueSBpbnB1dHMgaXQgbWF5IGJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8uCisgICAg
ICAgIG91dHB1dC0+ZGlzY29ubmVjdEFsbElucHV0cygpOworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICBBdWRpb05vZGVJbnB1dCogaW5wdXQgPSBkZXN0aW5hdGlvbi0+aW5wdXQo
aW5wdXRJbmRleCk7CisgICAgaW5wdXQtPmNvbm5lY3Qob3V0cHV0KTsKKworICAgIC8vIExldCBj
b250ZXh0IGtub3cgdGhhdCBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gbWFkZS4KKyAgICBjb250ZXh0
KCktPmluY3JlbWVudENvbm5lY3Rpb25Db3VudCgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Jvb2wgQXVkaW9Ob2RlOjpkaXNjb25uZWN0KHVuc2lnbmVkIG91dHB1dEluZGV4KQoreworICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgCisgICAgcmV0dXJuIGNvbm5lY3QoMCwgb3V0
cHV0SW5kZXgpOworfQorCit2b2lkIEF1ZGlvTm9kZTo6cHJvY2Vzc0lmTmVjZXNzYXJ5KHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgQVNTRVJUKGNvbnRleHQoKS0+aXNBdWRpb1RocmVh
ZCgpKTsKKyAgICAKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gRW5zdXJlIHRoYXQgd2Ugb25seSBwcm9jZXNzIG9uY2UgcGVyIHJlbmRlcmluZyBx
dWFudHVtLgorICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgImZhbm91dCIgcHJvYmxlbSB3aGVyZSBh
biBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIG11bHRpcGxlIGlucHV0cy4KKyAgICAvLyBUaGUgZmly
c3QgdGltZSB3ZSdyZSBjYWxsZWQgZHVyaW5nIHRoaXMgdGltZSBzbGljZSB3ZSBwcm9jZXNzLCBi
dXQgYWZ0ZXIgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJlLXByb2Nlc3MsCisgICAgLy8gaW5zdGVh
ZCBvdXIgb3V0cHV0KHMpIHdpbGwgYWxyZWFkeSBoYXZlIHRoZSByZXN1bHRzIGNhY2hlZCBpbiB0
aGVpciBidXM7CisgICAgZG91YmxlIGN1cnJlbnRUaW1lID0gY29udGV4dCgpLT5jdXJyZW50VGlt
ZSgpOworICAgIGlmIChtX2xhc3RQcm9jZXNzaW5nVGltZSAhPSBjdXJyZW50VGltZSkgeworICAg
ICAgICBtX2xhc3RQcm9jZXNzaW5nVGltZSA9IGN1cnJlbnRUaW1lOyAvLyBpbXBvcnRhbnQgdG8g
Zmlyc3QgdXBkYXRlIHRoaXMgdGltZSBiZWNhdXNlIG9mIGZlZWRiYWNrIGxvb3BzIGluIHRoZSBy
ZW5kZXJpbmcgZ3JhcGgKKyAgICAgICAgcHVsbElucHV0cyhmcmFtZXNUb1Byb2Nlc3MpOworICAg
ICAgICBwcm9jZXNzKGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvTm9k
ZTo6cHVsbElucHV0cyhzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIEFTU0VSVChjb250
ZXh0KCktPmlzQXVkaW9UaHJlYWQoKSk7CisgICAgCisgICAgLy8gUHJvY2VzcyBhbGwgb2YgdGhl
IEF1ZGlvTm9kZXMgY29ubmVjdGVkIHRvIG91ciBpbnB1dHMuCisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1faW5wdXRzLnNpemUoKTsgKytpKQorICAgICAgICBpbnB1dChpKS0+cHVsbCgw
LCBmcmFtZXNUb1Byb2Nlc3MpOworfQorCit2b2lkIEF1ZGlvTm9kZTo6cmVmKFJlZlR5cGUgcmVm
VHlwZSkKK3sKKyAgICAvLyBGSVhNRTogbm90IHRocmVhZC1zYWZlLCBidXQgdHJpY2t5IHNpbmNl
IGNhbid0IGNvbnRlbmQgbG9jayBpbiByZWFsLXRpbWUgdGhyZWFkCisgICAgLy8gSW5zdGVhZCwg
YSBnb29kIHNvbHV0aW9uIG1heSBiZSB0byB1c2UgYSBsb2NrLWZyZWUgcXVldWUgZm9yIHRoZSBy
ZWYgcmVxdWVzdHMgb2YgUmVmVHlwZU5vcm1hbC4KKyAgICAvLyBUaGVzZSByZXF1ZXN0cyB3b3Vs
ZCBiZSBoYW5kbGVkIGluIHRoZSByZWFsLXRpbWUgYXVkaW8gdGhyZWFkLgorCisgICAgaWYgKCFt
X2Nvbm5lY3Rpb25SZWZDb3VudCAmJiByZWZUeXBlID09IFJlZlR5cGVDb25uZWN0aW9uKSB7Cisg
ICAgICAgIC8vIFdlIHNob3VsZCBub3QgYmUgImFjdGl2ZWx5IiBjb25uZWN0ZWQgdG8gYW55dGhp
bmcsIGJ1dCBub3cgd2UncmUgIndha2luZyB1cCIKKyAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGEg
bm90ZSB3aGljaCBoYXMgZmluaXNoZWQgcGxheWluZywgYnV0IGlzIG5vdyBiZWluZyBwbGF5ZWQg
YWdhaW4uCisgICAgICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgd2FrZS11cAorICAgIH0KKworICAg
IHN3aXRjaCAocmVmVHlwZSkgeworICAgIGNhc2UgUmVmVHlwZU5vcm1hbDoKKyAgICAgICAgbV9u
b3JtYWxSZWZDb3VudCsrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJlZlR5cGVDb25uZWN0
aW9uOgorICAgICAgICBtX2Nvbm5lY3Rpb25SZWZDb3VudCsrOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFJlZlR5cGVEaXNhYmxlZDoKKyAgICAgICAgbV9kaXNhYmxlZFJlZkNvdW50Kys7Cisg
ICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KKyAgICAKKyNpZiBERUJVR19BVURJT05PREVfUkVGRVJFTkNFUworICAgIHByaW50
ZigiJXA6ICVkOiBBdWRpb05vZGU6OnJlZigpICVkICVkICVkXG4iLCB0aGlzLCB0eXBlKCksIG1f
bm9ybWFsUmVmQ291bnQsIG1fY29ubmVjdGlvblJlZkNvdW50LCBtX2Rpc2FibGVkUmVmQ291bnQp
OworI2VuZGlmCit9CisKK3ZvaWQgQXVkaW9Ob2RlOjpkZXJlZihSZWZUeXBlIHJlZlR5cGUpCit7
CisgICAgLy8gRklYTUU6IG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRyaWNreSBzaW5jZSBjYW4ndCBj
b250ZW5kIGxvY2sgaW4gcmVhbC10aW1lIHRocmVhZAorICAgIC8vIEluc3RlYWQsIGEgZ29vZCBz
b2x1dGlvbiBtYXkgYmUgdG8gdXNlIGEgbG9jay1mcmVlIHF1ZXVlIGZvciB0aGUgZGVyZWYgcmVx
dWVzdHMgb2YgUmVmVHlwZU5vcm1hbC4KKyAgICAvLyBUaGVzZSByZXF1ZXN0cyB3b3VsZCBiZSBo
YW5kbGVkIGluIHRoZSByZWFsLXRpbWUgYXVkaW8gdGhyZWFkLgorCisgICAgc3dpdGNoIChyZWZU
eXBlKSB7CisgICAgY2FzZSBSZWZUeXBlTm9ybWFsOgorICAgICAgICBBU1NFUlQobV9ub3JtYWxS
ZWZDb3VudCA+IDApOworICAgICAgICBtX25vcm1hbFJlZkNvdW50LS07CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgUmVmVHlwZUNvbm5lY3Rpb246CisgICAgICAgIEFTU0VSVChtX2Nvbm5lY3Rp
b25SZWZDb3VudCA+IDApOworICAgICAgICBtX2Nvbm5lY3Rpb25SZWZDb3VudC0tOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFJlZlR5cGVEaXNhYmxlZDoKKyAgICAgICAgQVNTRVJUKG1fZGlz
YWJsZWRSZWZDb3VudCA+IDApOworICAgICAgICBtX2Rpc2FibGVkUmVmQ291bnQtLTsKKyAgICAg
ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgfQorCisgICAgaWYgKCFtX2Nvbm5lY3Rpb25SZWZDb3VudCkgeworICAgICAgICBpZiAoIW1f
bm9ybWFsUmVmQ291bnQgJiYgIW1fZGlzYWJsZWRSZWZDb3VudCkgeworICAgICAgICAgICAgLy8g
QWxsIHJlZmVyZW5jZXMgYXJlIGdvbmUgLSB3ZSBuZWVkIHRvIGdvIGF3YXkuCisgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9vdXRwdXRzLnNpemUoKTsgKytpKQorICAgICAg
ICAgICAgICAgIG91dHB1dChpKS0+ZGlzY29ubmVjdEFsbElucHV0cygpOyAvLyB0aGlzIHdpbGwg
ZGVyZWYoKSBub2RlcyB3ZSdyZSBjb25uZWN0ZWQgdG8uLi4KKworICAgICAgICAgICAgaWYgKHJl
ZlR5cGUgPT0gUmVmVHlwZU5vcm1hbCkgeworICAgICAgICAgICAgICAgIC8vIEdhcmJhZ2UgY29s
bGVjdGlvbiAtIHdlJ3ZlIGFscmVhZHkgYmVlbiBkaXNjb25uZWN0ZWQKKyAgICAgICAgICAgICAg
ICBkZWxldGUgdGhpczsgLy8gc2FmZSB0byBkZWxldGUgcmlnaHQgYXdheQorICAgICAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBpbiByZWFsLXRpbWUgdGhyZWFkLCBt
YXJrIGZvciBkZWxldGlvbiBhdCBlbmQgb2YgcmVuZGVyIGN5Y2xlLgorICAgICAgICAgICAgICAg
IGNvbnRleHQoKS0+bWFya0ZvckRlbGV0aW9uKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAg
ICB9IGVsc2UgaWYgKHJlZlR5cGUgPT0gUmVmVHlwZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAg
IC8vIFN0aWxsIG1heSBoYXZlIEphdmFTY3JpcHQgcmVmZXJlbmNlcywgYnV0IG5vIG1vcmUgImFj
dGl2ZSIgY29ubmVjdGlvbiByZWZlcmVuY2VzLCBzbyBwdXQgYWxsIG9mIG91ciBvdXRwdXRzIGlu
IGEgImRvcm1hbnQiIGRpc2FibGVkIHN0YXRlLgorICAgICAgICAgICAgLy8gR2FyYmFnZSBjb2xs
ZWN0aW9uIG1heSB0YWtlIGEgdmVyeSBsb25nIHRpbWUgYWZ0ZXIgdGhpcyB0aW1lLCBzbyB0aGUg
ImRvcm1hbnQiIGRpc2FibGVkIG5vZGVzIHNob3VsZCBub3QgYm9nIGRvd24gdGhlIHJlbmRlcmlu
Zy4uLgorCisgICAgICAgICAgICAvLyBBcyBmYXIgYXMgSmF2YVNjcmlwdCBpcyBjb25jZXJuZWQs
IG91ciBvdXRwdXRzIG11c3Qgc3RpbGwgYXBwZWFyIHRvIGJlIGNvbm5lY3RlZC4KKyAgICAgICAg
ICAgIC8vIEJ1dCBpbnRlcm5hbGx5IG91ciBvdXRwdXRzIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9t
IHRoZSBpbnB1dHMgdGhleSdyZSBjb25uZWN0ZWQgdG8uCisgICAgICAgICAgICAvLyBkaXNhYmxl
KCkgY2FuIHJlY3Vyc2l2ZWx5IGRlcmVmIGNvbm5lY3Rpb25zIChhbmQgY2FsbCBkaXNhYmxlKCkp
IGRvd24gYSB3aG9sZSBjaGFpbiBvZiBjb25uZWN0ZWQgbm9kZXMuCisKKyAgICAgICAgICAgIC8v
IEZJWE1FOiB3ZSBzcGVjaWFsIGNhc2UgdGhlIGNvbnZvbHZlciBhbmQgZGVsYXkgc2luY2UgdGhl
eSBoYXZlIGEgc2lnbmlmaWNhbnQgdGFpbC10aW1lIGFuZCBzaG91bGRuJ3QgYmUgZGlzY29ubmVj
dGVkIHNpbXBseQorICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCBubyBsb25nZXIgaGFzIGFueSBp
bnB1dCBjb25uZWN0aW9ucy4gIFRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyYWxs
eSB3aGVyZSBBdWRpb05vZGVzIGhhdmUKKyAgICAgICAgICAgIC8vIGEgdGFpbFRpbWUgYXR0cmli
dXRlLiAgVGhlbiB0aGUgQXVkaW9Ob2RlIG9ubHkgbmVlZHMgdG8gcmVtYWluICJhY3RpdmUiIGZv
ciB0YWlsVGltZSBzZWNvbmRzIGFmdGVyIHRoZXJlIGFyZSBubworICAgICAgICAgICAgLy8gbG9u
Z2VyIGFueSBhY3RpdmUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICBpZiAodHlwZSgpICE9IE5v
ZGVUeXBlQ29udm9sdmVyICYmIHR5cGUoKSAhPSBOb2RlVHlwZURlbGF5KSB7CisgICAgICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fb3V0cHV0cy5zaXplKCk7ICsraSkKKyAg
ICAgICAgICAgICAgICAgICAgb3V0cHV0KGkpLT5kaXNhYmxlKCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyNpZiBERUJVR19BVURJT05PREVfUkVGRVJFTkNFUworICAgIHBy
aW50ZigiJXA6ICVkOiBBdWRpb05vZGU6OmRlcmVmKCkgJWQgJWQgJWRcbiIsIHRoaXMsIHR5cGUo
KSwgbV9ub3JtYWxSZWZDb3VudCwgbV9jb25uZWN0aW9uUmVmQ291bnQsIG1fZGlzYWJsZWRSZWZD
b3VudCk7CisjZW5kaWYKK30KKworI2lmIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisKK2Jv
b2wgQXVkaW9Ob2RlOjpzX2lzTm9kZUNvdW50SW5pdGlhbGl6ZWQgPSBmYWxzZTsKK2ludCBBdWRp
b05vZGU6OnNfbm9kZUNvdW50W05vZGVUeXBlRW5kXTsKKwordm9pZCBBdWRpb05vZGU6OnByaW50
Tm9kZUNvdW50cygpCit7CisgICAgcHJpbnRmKCJcblxuIik7CisgICAgcHJpbnRmKCI9PT09PT09
PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiQXVkaW9Ob2RlOiByZWZlcmVu
Y2UgY291bnRzXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PVxu
Iik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTm9kZVR5cGVFbmQ7ICsraSkKKyAg
ICAgICAgcHJpbnRmKCIlZDogJWRcbiIsIGksIHNfbm9kZUNvdW50W2ldKTsKKworICAgIHByaW50
ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuIik7Cit9CisKKyNlbmRpZiAvLyBE
RUJVR19BVURJT05PREVfUkVGRVJFTkNFUworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRpb05v
ZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5oCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaWZuZGVmIEF1ZGlvTm9kZV9oCisjZGVmaW5lIEF1ZGlvTm9kZV9oCisK
KyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2RlZmluZSBERUJVR19BVURJT05PREVfUkVGRVJFTkNFUyAw
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXVkaW9Db250ZXh0OworY2xhc3MgQXVk
aW9Ob2RlSW5wdXQ7CitjbGFzcyBBdWRpb05vZGVPdXRwdXQ7CisKKy8vIEFuIEF1ZGlvTm9kZSBp
cyB0aGUgYmFzaWMgYnVpbGRpbmcgYmxvY2sgZm9yIGhhbmRsaW5nIGF1ZGlvIHdpdGhpbiBhbiBB
dWRpb0NvbnRleHQuCisvLyBJdCBtYXkgYmUgYW4gYXVkaW8gc291cmNlLCBhbiBpbnRlcm1lZGlh
dGUgcHJvY2Vzc2luZyBtb2R1bGUsIG9yIGFuIGF1ZGlvIGRlc3RpbmF0aW9uLgorLy8gRWFjaCBB
dWRpb05vZGUgY2FuIGhhdmUgaW5wdXRzIGFuZC9vciBvdXRwdXRzLiBBbiBBdWRpb1NvdXJjZU5v
ZGUgaGFzIG5vIGlucHV0cyBhbmQgYSBzaW5nbGUgb3V0cHV0LgorLy8gQW4gQXVkaW9EZXN0aW5h
dGlvbk5vZGUgaGFzIG9uZSBpbnB1dCBhbmQgbm8gb3V0cHV0cyBhbmQgcmVwcmVzZW50cyB0aGUg
ZmluYWwgZGVzdGluYXRpb24gdG8gdGhlIGF1ZGlvIGhhcmR3YXJlLgorLy8gTW9zdCBwcm9jZXNz
aW5nIG5vZGVzIHN1Y2ggYXMgZmlsdGVycyB3aWxsIGhhdmUgb25lIGlucHV0IGFuZCBvbmUgb3V0
cHV0LCBhbHRob3VnaCBtdWx0aXBsZSBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBvc3NpYmxlLgor
CitjbGFzcyBBdWRpb05vZGUgeworcHVibGljOgorICAgIGVudW0geyBQcm9jZXNzaW5nU2l6ZUlu
RnJhbWVzID0gMTI4IH07CisKKyAgICBBdWRpb05vZGUoQXVkaW9Db250ZXh0KiwgZG91YmxlIHNh
bXBsZVJhdGUpOworICAgIHZpcnR1YWwgfkF1ZGlvTm9kZSgpOworCisgICAgQXVkaW9Db250ZXh0
KiBjb250ZXh0KCkgeyByZXR1cm4gbV9jb250ZXh0OyB9CisKKyAgICBlbnVtIE5vZGVUeXBlIHsK
KyAgICAgICAgTm9kZVR5cGVVbmtub3duLAorICAgICAgICBOb2RlVHlwZURlc3RpbmF0aW9uLAor
ICAgICAgICBOb2RlVHlwZUF1ZGlvQnVmZmVyU291cmNlLAorICAgICAgICBOb2RlVHlwZUphdmFT
Y3JpcHQsCisgICAgICAgIE5vZGVUeXBlTG93UGFzczJGaWx0ZXIsCisgICAgICAgIE5vZGVUeXBl
SGlnaFBhc3MyRmlsdGVyLAorICAgICAgICBOb2RlVHlwZVBhbm5lciwKKyAgICAgICAgTm9kZVR5
cGVDb252b2x2ZXIsCisgICAgICAgIE5vZGVUeXBlRGVsYXksCisgICAgICAgIE5vZGVUeXBlR2Fp
biwKKyAgICAgICAgTm9kZVR5cGVDaGFubmVsU3BsaXR0ZXIsCisgICAgICAgIE5vZGVUeXBlQ2hh
bm5lbE1lcmdlciwKKyAgICAgICAgTm9kZVR5cGVBbmFseXNlciwKKyAgICAgICAgTm9kZVR5cGVF
bmQKKyAgICB9OworCisgICAgTm9kZVR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsg
fQorICAgIHZvaWQgc2V0VHlwZShOb2RlVHlwZSk7CisKKyAgICAvLyBXZSBoYW5kbGUgb3VyIG93
biByZWYtY291bnRpbmcgYmVjYXVzZSBvZiB0aGUgdGhyZWFkaW5nIGlzc3VlcyBhbmQgc3VidGxl
IG5hdHVyZSBvZgorICAgIC8vIGhvdyBBdWRpb05vZGVzIGNhbiBjb250aW51ZSBwcm9jZXNzaW5n
IChwbGF5aW5nIG9uZS1zaG90IHNvdW5kKSBhZnRlciB0aGVyZSBhcmUgbm8gbW9yZQorICAgIC8v
IEphdmFTY3JpcHQgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgorICAgIGVudW0gUmVmVHlwZSB7
IFJlZlR5cGVOb3JtYWwsIFJlZlR5cGVDb25uZWN0aW9uLCBSZWZUeXBlRGlzYWJsZWQgfTsKKwor
ICAgIC8vIENhbiBiZSBjYWxsZWQgZnJvbSBtYWluIHRocmVhZCBvciBjb250ZXh0J3MgYXVkaW8g
dGhyZWFkLgorICAgIHZvaWQgcmVmKFJlZlR5cGUgcmVmVHlwZSA9IFJlZlR5cGVOb3JtYWwpOwor
ICAgIHZvaWQgZGVyZWYoUmVmVHlwZSByZWZUeXBlID0gUmVmVHlwZU5vcm1hbCk7CisKKyAgICAv
LyBUaGUgQXVkaW9Ob2RlSW5wdXQocykgKGlmIGFueSkgd2lsbCBhbHJlYWR5IGhhdmUgdGhlaXIg
aW5wdXQgZGF0YSBhdmFpbGFibGUgd2hlbiBwcm9jZXNzKCkgaXMgY2FsbGVkLgorICAgIC8vIFN1
YmNsYXNzZXMgd2lsbCB0YWtlIHRoaXMgaW5wdXQgZGF0YSBhbmQgcHV0IHRoZSByZXN1bHRzIGlu
IHRoZSBBdWRpb0J1cyhzKSBvZiBpdHMgQXVkaW9Ob2RlT3V0cHV0KHMpIChpZiBhbnkpLgorICAg
IC8vIENhbGxlZCBmcm9tIGNvbnRleHQncyBhdWRpbyB0aHJlYWQuCisgICAgdmlydHVhbCB2b2lk
IHByb2Nlc3Moc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykgPSAwOworCisgICAgLy8gUmVzZXRzIERT
UCBwcm9jZXNzaW5nIHN0YXRlIChjbGVhcnMgZGVsYXkgbGluZXMsIGZpbHRlciBtZW1vcnksIGV0
Yy4pCisgICAgLy8gQ2FsbGVkIGZyb20gY29udGV4dCdzIGF1ZGlvIHRocmVhZC4KKyAgICB2aXJ0
dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisKKyAgICAvLyBObyBzaWduaWZpY2FudCByZXNvdXJjZXMg
c2hvdWxkIGJlIGFsbG9jYXRlZCB1bnRpbCBpbml0aWFsaXplKCkgaXMgY2FsbGVkLgorICAgIC8v
IFByb2Nlc3NpbmcgbWF5IG5vdCBvY2N1ciB1bnRpbCBhIG5vZGUgaXMgaW5pdGlhbGl6ZWQuCisg
ICAgLy8gQ2FsbGVkIGZyb20gbWFpbiB0aHJlYWQuCisgICAgdmlydHVhbCB2b2lkIGluaXRpYWxp
emUoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHVuaW5pdGlhbGl6ZSgpID0gMDsKKworICAgIGJv
b2wgaXNJbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbml0aWFsaXplZDsgfQorICAg
IHZvaWQgbGF6eUluaXRpYWxpemUoKTsKKworICAgIHVuc2lnbmVkIG51bWJlck9mSW5wdXRzKCkg
Y29uc3QgeyByZXR1cm4gbV9pbnB1dHMuc2l6ZSgpOyB9CisgICAgdW5zaWduZWQgbnVtYmVyT2ZP
dXRwdXRzKCkgY29uc3QgeyByZXR1cm4gbV9vdXRwdXRzLnNpemUoKTsgfQorCisgICAgQXVkaW9O
b2RlSW5wdXQqIGlucHV0KHVuc2lnbmVkKTsKKyAgICBBdWRpb05vZGVPdXRwdXQqIG91dHB1dCh1
bnNpZ25lZCk7CisKKyAgICAvLyBjb25uZWN0KCkgLyBkaXNjb25uZWN0KCkgcmV0dXJuIHRydWUg
b24gc3VjY2Vzcy4KKyAgICAvLyBDYWxsZWQgZnJvbSBtYWluIHRocmVhZCBieSBjb3JyZXNwb25k
aW5nIEphdmFTY3JpcHQgbWV0aG9kcy4KKyAgICBib29sIGNvbm5lY3QoQXVkaW9Ob2RlKiBkZXN0
aW5hdGlvbiwgdW5zaWduZWQgb3V0cHV0SW5kZXggPSAwLCB1bnNpZ25lZCBpbnB1dEluZGV4ID0g
MCk7CisgICAgYm9vbCBkaXNjb25uZWN0KHVuc2lnbmVkIG91dHB1dEluZGV4ID0gMCk7CisKKyAg
ICBkb3VibGUgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtcGxlUmF0ZTsgfQorCisg
ICAgLy8gcHJvY2Vzc0lmTmVjZXNzYXJ5KCkgaXMgY2FsbGVkIGJ5IG91ciBvdXRwdXQocykgd2hl
biB0aGUgcmVuZGVyaW5nIGdyYXBoIG5lZWRzIHRoaXMgQXVkaW9Ob2RlIHRvIHByb2Nlc3MuCisg
ICAgLy8gVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBBdWRpb05vZGUgd2lsbCBvbmx5IHBy
b2Nlc3Mgb25jZSBwZXIgcmVuZGVyaW5nIHRpbWUgcXVhbnR1bSBldmVuIGlmIGl0J3MgY2FsbGVk
IHJlcGVhdGVkbHkuCisgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mICJmYW5vdXQiIHdo
ZXJlIGFuIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgQXVkaW9Ob2RlIGlucHV0cy4K
KyAgICAvLyBDYWxsZWQgZnJvbSBjb250ZXh0J3MgYXVkaW8gdGhyZWFkLgorICAgIHZvaWQgcHJv
Y2Vzc0lmTmVjZXNzYXJ5KHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8gQ2FsbGVk
IHdoZW4gYSBuZXcgY29ubmVjdGlvbiBoYXMgYmVlbiBtYWRlIHRvIG9uZSBvZiBvdXIgaW5wdXRz
IG9yIHRoZSBjb25uZWN0aW9uIG51bWJlciBvZiBjaGFubmVscyBoYXMgY2hhbmdlZC4KKyAgICAv
LyBUaGlzIHBvdGVudGlhbGx5IGdpdmVzIHVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwZXJmb3Jt
IGEgbGF6eSBpbml0aWFsaXphdGlvbiBvciwgaWYgbmVjZXNzYXJ5LCBhIHJlLWluaXRpYWxpemF0
aW9uLgorICAgIC8vIENhbGxlZCBmcm9tIG1haW4gdGhyZWFkLgorICAgIHZpcnR1YWwgdm9pZCBj
aGVja051bWJlck9mQ2hhbm5lbHNGb3JJbnB1dChBdWRpb05vZGVJbnB1dCopIHsgfQorCisjaWYg
REVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBzdGF0aWMgdm9pZCBwcmludE5vZGVDb3Vu
dHMoKTsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgLy8gQ2FsbGVkIGJ5IHByb2Nlc3NJZk5l
Y2Vzc2FyeSgpIHRvIGNhdXNlIGFsbCBwYXJ0cyBvZiB0aGUgcmVuZGVyaW5nIGdyYXBoIGNvbm5l
Y3RlZCB0byB1cyB0byBwcm9jZXNzLgorICAgIC8vIEVhY2ggcmVuZGVyaW5nIHF1YW50dW0sIHRo
ZSBhdWRpbyBkYXRhIGZvciBlYWNoIG9mIHRoZSBBdWRpb05vZGUncyBpbnB1dHMgd2lsbCBiZSBh
dmFpbGFibGUgYWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgIC8vIENhbGxlZCBmcm9t
IGNvbnRleHQncyBhdWRpbyB0aHJlYWQuCisgICAgdmlydHVhbCB2b2lkIHB1bGxJbnB1dHMoc2l6
ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICBOb2RlVHlwZSBtX3R5cGU7CisgICAgQXVkaW9D
b250ZXh0KiBtX2NvbnRleHQ7CisgICAgZG91YmxlIG1fc2FtcGxlUmF0ZTsKKyAgICBib29sIG1f
aXNJbml0aWFsaXplZDsKKyAgICBWZWN0b3I8T3duUHRyPEF1ZGlvTm9kZUlucHV0PiA+IG1faW5w
dXRzOworICAgIFZlY3RvcjxPd25QdHI8QXVkaW9Ob2RlT3V0cHV0PiA+IG1fb3V0cHV0czsKKwor
ICAgIGRvdWJsZSBtX2xhc3RQcm9jZXNzaW5nVGltZTsKKworICAgIC8vIFJlZi1jb3VudGluZwor
ICAgIHZvbGF0aWxlIGludCBtX25vcm1hbFJlZkNvdW50OworICAgIHZvbGF0aWxlIGludCBtX2Nv
bm5lY3Rpb25SZWZDb3VudDsKKyAgICB2b2xhdGlsZSBpbnQgbV9kaXNhYmxlZFJlZkNvdW50Owor
CisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBzdGF0aWMgYm9vbCBzX2lzTm9k
ZUNvdW50SW5pdGlhbGl6ZWQ7CisgICAgc3RhdGljIGludCBzX25vZGVDb3VudFtOb2RlVHlwZUVu
ZF07CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEF1
ZGlvTm9kZV9oCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5pZGwKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBD
b21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAq
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworbW9kdWxlIGF1ZGlvIHsKKyAgICBpbnRlcmZhY2UgWworICAgICAgICBDb25kaXRpb25hbD1X
RUJfQVVESU8KKyAgICBdIEF1ZGlvTm9kZSB7CisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBB
dWRpb0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVk
IGxvbmcgbnVtYmVyT2ZJbnB1dHM7CisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25l
ZCBsb25nIG51bWJlck9mT3V0cHV0czsKKworICAgICAgICBbQ3VzdG9tXSB2b2lkIGNvbm5lY3Qo
aW4gQXVkaW9Ob2RlIGRlc3RpbmF0aW9uLCBpbiB1bnNpZ25lZCBsb25nIG91dHB1dCwgaW4gdW5z
aWduZWQgbG9uZyBpbnB1dCk7CisgICAgICAgIFtDdXN0b21dIHZvaWQgZGlzY29ubmVjdChpbiB1
bnNpZ25lZCBsb25nIG91dHB1dCk7CisgICAgfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67732</attachid>
            <date>2010-09-15 15:39:19 -0700</date>
            <delta_ts>2010-09-21 13:13:14 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45571-20100915153917.patch</filename>
            <type>text/plain</type>
            <size>21015</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzU3MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzcgQEAKKzIwMTAtMDktMTUgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Ob2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD00NTU3MQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBBUEkg
aXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvTm9kZS5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpBdWRpb05vZGUpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjp+QXVkaW9Ob2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvTm9kZTo6c2V0VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmxhenlJ
bml0aWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6b3V0cHV0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6aW5wdXQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9O
b2RlOjpjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6ZGlzY29ubmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnByb2Nlc3NJZk5lY2Vzc2FyeSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnB1bGxJbnB1dHMpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Ob2RlOjpyZWYpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpkZXJlZik6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmZpbmlzaERlcmVmKToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvTm9kZTo6cHJpbnROb2RlQ291bnRzKToKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRp
b05vZGUuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmNvbnRleHQpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjp0eXBlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvTm9kZTo6aXNJbml0aWFsaXplZCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6Om51
bWJlck9mSW5wdXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6bnVtYmVyT2ZPdXRw
dXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6c2FtcGxlUmF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb05vZGU6OmNoZWNrTnVtYmVyT2ZDaGFubmVsc0ZvcklucHV0KToKKyAg
ICAgICAgKiB3ZWJhdWRpby9BdWRpb05vZGUuaWRsOiBBZGRlZC4KKwogMjAxMC0wOS0xNSAgSnVs
aWVuIENoYWZmcmFpeCAgPGpjaGFmZnJhaXhAY29kZWF1cm9yYS5vcmc+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgQW5kcmVhcyBLbGluZy4KSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9Ob2Rl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdFQl9B
VURJTykKKworI2luY2x1ZGUgIkF1ZGlvTm9kZS5oIgorCisjaW5jbHVkZSAiQXVkaW9Db250ZXh0
LmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlSW5wdXQuaCIKKyNpbmNsdWRlICJBdWRpb05vZGVPdXRw
dXQuaCIKKyNpbmNsdWRlIDx3dGYvQXRvbWljcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K0F1ZGlvTm9kZTo6QXVkaW9Ob2RlKEF1ZGlvQ29udGV4dCogY29udGV4dCwgZG91YmxlIHNhbXBs
ZVJhdGUpCisgICAgOiBtX3R5cGUoTm9kZVR5cGVVbmtub3duKQorICAgICwgbV9jb250ZXh0KGNv
bnRleHQpCisgICAgLCBtX3NhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKKyAgICAsIG1faXNJbml0aWFs
aXplZChmYWxzZSkKKyAgICAsIG1fbGFzdFByb2Nlc3NpbmdUaW1lKC0xLjApCisgICAgLCBtX25v
cm1hbFJlZkNvdW50KDEpIC8vIHN0YXJ0IG91dCB3aXRoIG5vcm1hbCByZWZDb3VudCA9PSAxIChs
aWtlIFdURjo6UmVmQ291bnRlZCBjbGFzcykKKyAgICAsIG1fY29ubmVjdGlvblJlZkNvdW50KDAp
CisgICAgLCBtX2Rpc2FibGVkUmVmQ291bnQoMCkKK3sKKyNpZiBERUJVR19BVURJT05PREVfUkVG
RVJFTkNFUworICAgIGlmICghc19pc05vZGVDb3VudEluaXRpYWxpemVkKSB7CisgICAgICAgIHNf
aXNOb2RlQ291bnRJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIGF0ZXhpdChBdWRpb05vZGU6
OnByaW50Tm9kZUNvdW50cyk7CisgICAgfQorI2VuZGlmCit9CisKK0F1ZGlvTm9kZTo6fkF1ZGlv
Tm9kZSgpCit7CisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICAtLXNfbm9kZUNv
dW50W3R5cGUoKV07CisjZW5kaWYKK30KKwordm9pZCBBdWRpb05vZGU6OnNldFR5cGUoTm9kZVR5
cGUgdHlwZSkKK3sKKyAgICBtX3R5cGUgPSB0eXBlOworCisjaWYgREVCVUdfQVVESU9OT0RFX1JF
RkVSRU5DRVMKKyAgICArK3Nfbm9kZUNvdW50W3R5cGVdOworI2VuZGlmCit9CisKK3ZvaWQgQXVk
aW9Ob2RlOjpsYXp5SW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKCFpc0luaXRpYWxpemVkKCkpCisg
ICAgICAgIGluaXRpYWxpemUoKTsKK30KKworQXVkaW9Ob2RlT3V0cHV0KiBBdWRpb05vZGU6Om91
dHB1dCh1bnNpZ25lZCBpKQoreworICAgIHJldHVybiBtX291dHB1dHNbaV0uZ2V0KCk7Cit9CisK
K0F1ZGlvTm9kZUlucHV0KiBBdWRpb05vZGU6OmlucHV0KHVuc2lnbmVkIGkpCit7CisgICAgcmV0
dXJuIG1faW5wdXRzW2ldLmdldCgpOworfQorCitib29sIEF1ZGlvTm9kZTo6Y29ubmVjdChBdWRp
b05vZGUqIGRlc3RpbmF0aW9uLCB1bnNpZ25lZCBvdXRwdXRJbmRleCwgdW5zaWduZWQgaW5wdXRJ
bmRleCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworIAorICAgIEF1ZGlvQ29udGV4
dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICAKKyAgICAvLyBTYW5pdHkgY2hl
Y2sgaW5wdXQgYW5kIG91dHB1dCBpbmRpY2VzLgorICAgIGlmIChvdXRwdXRJbmRleCA+PSBudW1i
ZXJPZk91dHB1dHMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChkZXN0aW5hdGlv
biAmJiBpbnB1dEluZGV4ID49IGRlc3RpbmF0aW9uLT5udW1iZXJPZklucHV0cygpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBBdWRpb05vZGVPdXRwdXQqIG91dHB1dCA9IHRoaXMtPm91
dHB1dChvdXRwdXRJbmRleCk7CisgICAgaWYgKCFkZXN0aW5hdGlvbikgeworICAgICAgICAvLyBE
aXNjb25uZWN0IG91dHB1dCBmcm9tIGFueSBpbnB1dHMgaXQgbWF5IGJlIGN1cnJlbnRseSBjb25u
ZWN0ZWQgdG8uCisgICAgICAgIG91dHB1dC0+ZGlzY29ubmVjdEFsbElucHV0cygpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBBdWRpb05vZGVJbnB1dCogaW5wdXQgPSBkZXN0
aW5hdGlvbi0+aW5wdXQoaW5wdXRJbmRleCk7CisgICAgaW5wdXQtPmNvbm5lY3Qob3V0cHV0KTsK
KworICAgIC8vIExldCBjb250ZXh0IGtub3cgdGhhdCBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gbWFk
ZS4KKyAgICBjb250ZXh0KCktPmluY3JlbWVudENvbm5lY3Rpb25Db3VudCgpOworCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgQXVkaW9Ob2RlOjpkaXNjb25uZWN0KHVuc2lnbmVkIG91dHB1
dEluZGV4KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBBdWRpb0NvbnRl
eHQ6OkF1dG9Mb2NrZXIgbG9ja2VyKGNvbnRleHQoKSk7CisgICAgCisgICAgcmV0dXJuIGNvbm5l
Y3QoMCwgb3V0cHV0SW5kZXgpOworfQorCit2b2lkIEF1ZGlvTm9kZTo6cHJvY2Vzc0lmTmVjZXNz
YXJ5KHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgQVNTRVJUKGNvbnRleHQoKS0+aXNB
dWRpb1RocmVhZCgpKTsKKyAgICAKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gRW5zdXJlIHRoYXQgd2Ugb25seSBwcm9jZXNzIG9uY2UgcGVyIHJl
bmRlcmluZyBxdWFudHVtLgorICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgImZhbm91dCIgcHJvYmxl
bSB3aGVyZSBhbiBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIG11bHRpcGxlIGlucHV0cy4KKyAgICAv
LyBUaGUgZmlyc3QgdGltZSB3ZSdyZSBjYWxsZWQgZHVyaW5nIHRoaXMgdGltZSBzbGljZSB3ZSBw
cm9jZXNzLCBidXQgYWZ0ZXIgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJlLXByb2Nlc3MsCisgICAg
Ly8gaW5zdGVhZCBvdXIgb3V0cHV0KHMpIHdpbGwgYWxyZWFkeSBoYXZlIHRoZSByZXN1bHRzIGNh
Y2hlZCBpbiB0aGVpciBidXM7CisgICAgZG91YmxlIGN1cnJlbnRUaW1lID0gY29udGV4dCgpLT5j
dXJyZW50VGltZSgpOworICAgIGlmIChtX2xhc3RQcm9jZXNzaW5nVGltZSAhPSBjdXJyZW50VGlt
ZSkgeworICAgICAgICBtX2xhc3RQcm9jZXNzaW5nVGltZSA9IGN1cnJlbnRUaW1lOyAvLyBpbXBv
cnRhbnQgdG8gZmlyc3QgdXBkYXRlIHRoaXMgdGltZSBiZWNhdXNlIG9mIGZlZWRiYWNrIGxvb3Bz
IGluIHRoZSByZW5kZXJpbmcgZ3JhcGgKKyAgICAgICAgcHVsbElucHV0cyhmcmFtZXNUb1Byb2Nl
c3MpOworICAgICAgICBwcm9jZXNzKGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgfQorfQorCit2b2lk
IEF1ZGlvTm9kZTo6cHVsbElucHV0cyhzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIEFT
U0VSVChjb250ZXh0KCktPmlzQXVkaW9UaHJlYWQoKSk7CisgICAgCisgICAgLy8gUHJvY2VzcyBh
bGwgb2YgdGhlIEF1ZGlvTm9kZXMgY29ubmVjdGVkIHRvIG91ciBpbnB1dHMuCisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IG1faW5wdXRzLnNpemUoKTsgKytpKQorICAgICAgICBpbnB1dChp
KS0+cHVsbCgwLCBmcmFtZXNUb1Byb2Nlc3MpOworfQorCit2b2lkIEF1ZGlvTm9kZTo6cmVmKFJl
ZlR5cGUgcmVmVHlwZSkKK3sKKyAgICBzd2l0Y2ggKHJlZlR5cGUpIHsKKyAgICBjYXNlIFJlZlR5
cGVOb3JtYWw6CisgICAgICAgIGF0b21pY0luY3JlbWVudCgmbV9ub3JtYWxSZWZDb3VudCk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgUmVmVHlwZUNvbm5lY3Rpb246CisgICAgICAgIGF0b21p
Y0luY3JlbWVudCgmbV9jb25uZWN0aW9uUmVmQ291bnQpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFJlZlR5cGVEaXNhYmxlZDoKKyAgICAgICAgYXRvbWljSW5jcmVtZW50KCZtX2Rpc2FibGVk
UmVmQ291bnQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyNpZiBERUJVR19BVURJT05PREVfUkVGRVJFTkNFUwor
ICAgIHByaW50ZigiJXA6ICVkOiBBdWRpb05vZGU6OnJlZigpICVkICVkICVkXG4iLCB0aGlzLCB0
eXBlKCksIG1fbm9ybWFsUmVmQ291bnQsIG1fY29ubmVjdGlvblJlZkNvdW50LCBtX2Rpc2FibGVk
UmVmQ291bnQpOworI2VuZGlmCisKKyAgICBpZiAobV9jb25uZWN0aW9uUmVmQ291bnQgPT0gMSAm
JiByZWZUeXBlID09IFJlZlR5cGVDb25uZWN0aW9uKSB7CisgICAgICAgIC8vIFdlIHNob3VsZCBu
b3QgYmUgImFjdGl2ZWx5IiBjb25uZWN0ZWQgdG8gYW55dGhpbmcsIGJ1dCBub3cgd2UncmUgIndh
a2luZyB1cCIKKyAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGEgbm90ZSB3aGljaCBoYXMgZmluaXNo
ZWQgcGxheWluZywgYnV0IGlzIG5vdyBiZWluZyBwbGF5ZWQgYWdhaW4uCisgICAgICAgIC8vIEZJ
WE1FOiBpbXBsZW1lbnQgd2FrZS11cCAtIHRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZSBhbmQg
aXMgbm90IG5lY2Vzc2FyeSBpbiBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9Cit9CisK
K3ZvaWQgQXVkaW9Ob2RlOjpkZXJlZihSZWZUeXBlIHJlZlR5cGUpCit7CisgICAgc3dpdGNoIChy
ZWZUeXBlKSB7CisgICAgY2FzZSBSZWZUeXBlTm9ybWFsOgorICAgICAgICBBU1NFUlQobV9ub3Jt
YWxSZWZDb3VudCA+IDApOworICAgICAgICBhdG9taWNEZWNyZW1lbnQoJm1fbm9ybWFsUmVmQ291
bnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJlZlR5cGVDb25uZWN0aW9uOgorICAgICAg
ICBBU1NFUlQobV9jb25uZWN0aW9uUmVmQ291bnQgPiAwKTsKKyAgICAgICAgYXRvbWljRGVjcmVt
ZW50KCZtX2Nvbm5lY3Rpb25SZWZDb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUmVm
VHlwZURpc2FibGVkOgorICAgICAgICBBU1NFUlQobV9kaXNhYmxlZFJlZkNvdW50ID4gMCk7Cisg
ICAgICAgIGF0b21pY0RlY3JlbWVudCgmbV9kaXNhYmxlZFJlZkNvdW50KTsKKyAgICAgICAgYnJl
YWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQor
CisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBwcmludGYoIiVwOiAlZDogQXVk
aW9Ob2RlOjpkZXJlZigpICVkICVkICVkXG4iLCB0aGlzLCB0eXBlKCksIG1fbm9ybWFsUmVmQ291
bnQsIG1fY29ubmVjdGlvblJlZkNvdW50LCBtX2Rpc2FibGVkUmVmQ291bnQpOworI2VuZGlmCisK
KyAgICBib29sIHNob3VsZERlbGV0ZSA9IGZhbHNlOworICAgIGJvb2wgaGFzTG9jayA9IGZhbHNl
OworICAgIGJvb2wgbXVzdFJlbGVhc2VMb2NrID0gZmFsc2U7CisgICAgCisgICAgaWYgKGNvbnRl
eHQoKS0+aXNBdWRpb1RocmVhZCgpKSB7CisgICAgICAgIC8vIFJlYWwtdGltZSBhdWRpbyB0aHJl
YWQgbXVzdCBub3QgY29udGVuZCBsb2NrICh0byBhdm9pZCBnbGl0Y2hlcykuCisgICAgICAgIGhh
c0xvY2sgPSBjb250ZXh0KCktPnRyeUxvY2sobXVzdFJlbGVhc2VMb2NrKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBjb250ZXh0KCktPmxvY2sobXVzdFJlbGVhc2VMb2NrKTsKKyAgICAgICAgaGFz
TG9jayA9IHRydWU7CisgICAgfQorICAgIAorICAgIGlmIChoYXNMb2NrKSB7CisgICAgICAgIHNo
b3VsZERlbGV0ZSA9IGZpbmlzaERlcmVmKHJlZlR5cGUpOworCisgICAgICAgIGlmIChtdXN0UmVs
ZWFzZUxvY2spCisgICAgICAgICAgICBjb250ZXh0KCktPnVubG9jaygpOworICAgIH0gZWxzZSB7
CisgICAgICAgIGNvbnRleHQoKS0+YWRkRGVmZXJyZWRGaW5pc2hEZXJlZih0aGlzLCByZWZUeXBl
KTsKKyAgICB9ICAgCisgICAgCisgICAgaWYgKHNob3VsZERlbGV0ZSkKKyAgICAgICAgZGVsZXRl
IHRoaXM7Cit9CisKK2Jvb2wgQXVkaW9Ob2RlOjpmaW5pc2hEZXJlZihSZWZUeXBlIHJlZlR5cGUp
Cit7CisgICAgYm9vbCBzaG91bGREZWxldGUgPSBmYWxzZTsKKyAgICAKKyAgICBpZiAoIW1fY29u
bmVjdGlvblJlZkNvdW50KSB7CisgICAgICAgIGlmICghbV9ub3JtYWxSZWZDb3VudCAmJiAhbV9k
aXNhYmxlZFJlZkNvdW50KSB7CisgICAgICAgICAgICAvLyBBbGwgcmVmZXJlbmNlcyBhcmUgZ29u
ZSAtIHdlIG5lZWQgdG8gZ28gYXdheS4KKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBtX291dHB1dHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgb3V0cHV0KGkpLT5k
aXNjb25uZWN0QWxsSW5wdXRzKCk7IC8vIHRoaXMgd2lsbCBkZXJlZigpIG5vZGVzIHdlJ3JlIGNv
bm5lY3RlZCB0by4uLgorCisgICAgICAgICAgICBpZiAoaXNNYWluVGhyZWFkKCkpIHsKKyAgICAg
ICAgICAgICAgICAvLyBHYXJiYWdlIGNvbGxlY3Rpb24gLSB3ZSd2ZSBhbHJlYWR5IGJlZW4gZGlz
Y29ubmVjdGVkCisgICAgICAgICAgICAgICAgc2hvdWxkRGVsZXRlID0gdHJ1ZTsKKyAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgaW4gcmVhbC10aW1lIHRocmVh
ZCwgbWFyayBmb3IgZGVsZXRpb24gYXQgZW5kIG9mIHJlbmRlciBjeWNsZS4KKyAgICAgICAgICAg
ICAgICBjb250ZXh0KCktPm1hcmtGb3JEZWxldGlvbih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfSBlbHNlIGlmIChyZWZUeXBlID09IFJlZlR5cGVDb25uZWN0aW9uKSB7CisgICAgICAg
ICAgICAvLyBTdGlsbCBtYXkgaGF2ZSBKYXZhU2NyaXB0IHJlZmVyZW5jZXMsIGJ1dCBubyBtb3Jl
ICJhY3RpdmUiIGNvbm5lY3Rpb24gcmVmZXJlbmNlcywgc28gcHV0IGFsbCBvZiBvdXIgb3V0cHV0
cyBpbiBhICJkb3JtYW50IiBkaXNhYmxlZCBzdGF0ZS4KKyAgICAgICAgICAgIC8vIEdhcmJhZ2Ug
Y29sbGVjdGlvbiBtYXkgdGFrZSBhIHZlcnkgbG9uZyB0aW1lIGFmdGVyIHRoaXMgdGltZSwgc28g
dGhlICJkb3JtYW50IiBkaXNhYmxlZCBub2RlcyBzaG91bGQgbm90IGJvZyBkb3duIHRoZSByZW5k
ZXJpbmcuLi4KKworICAgICAgICAgICAgLy8gQXMgZmFyIGFzIEphdmFTY3JpcHQgaXMgY29uY2Vy
bmVkLCBvdXIgb3V0cHV0cyBtdXN0IHN0aWxsIGFwcGVhciB0byBiZSBjb25uZWN0ZWQuCisgICAg
ICAgICAgICAvLyBCdXQgaW50ZXJuYWxseSBvdXIgb3V0cHV0cyBzaG91bGQgYmUgZGlzYWJsZWQg
ZnJvbSB0aGUgaW5wdXRzIHRoZXkncmUgY29ubmVjdGVkIHRvLgorICAgICAgICAgICAgLy8gZGlz
YWJsZSgpIGNhbiByZWN1cnNpdmVseSBkZXJlZiBjb25uZWN0aW9ucyAoYW5kIGNhbGwgZGlzYWJs
ZSgpKSBkb3duIGEgd2hvbGUgY2hhaW4gb2YgY29ubmVjdGVkIG5vZGVzLgorCisgICAgICAgICAg
ICAvLyBGSVhNRTogd2Ugc3BlY2lhbCBjYXNlIHRoZSBjb252b2x2ZXIgYW5kIGRlbGF5IHNpbmNl
IHRoZXkgaGF2ZSBhIHNpZ25pZmljYW50IHRhaWwtdGltZSBhbmQgc2hvdWxkbid0IGJlIGRpc2Nv
bm5lY3RlZCBzaW1wbHkKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgbm8gbG9uZ2VyIGhhcyBh
bnkgaW5wdXQgY29ubmVjdGlvbnMuICBUaGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5l
cmFsbHkgd2hlcmUgQXVkaW9Ob2RlcyBoYXZlCisgICAgICAgICAgICAvLyBhIHRhaWxUaW1lIGF0
dHJpYnV0ZS4gIFRoZW4gdGhlIEF1ZGlvTm9kZSBvbmx5IG5lZWRzIHRvIHJlbWFpbiAiYWN0aXZl
IiBmb3IgdGFpbFRpbWUgc2Vjb25kcyBhZnRlciB0aGVyZSBhcmUgbm8KKyAgICAgICAgICAgIC8v
IGxvbmdlciBhbnkgYWN0aXZlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgaWYgKHR5cGUoKSAh
PSBOb2RlVHlwZUNvbnZvbHZlciAmJiB0eXBlKCkgIT0gTm9kZVR5cGVEZWxheSkgeworICAgICAg
ICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX291dHB1dHMuc2l6ZSgpOyArK2kp
CisgICAgICAgICAgICAgICAgICAgIG91dHB1dChpKS0+ZGlzYWJsZSgpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNob3VsZERlbGV0ZTsKK30KKworI2lm
IERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisKK2Jvb2wgQXVkaW9Ob2RlOjpzX2lzTm9kZUNv
dW50SW5pdGlhbGl6ZWQgPSBmYWxzZTsKK2ludCBBdWRpb05vZGU6OnNfbm9kZUNvdW50W05vZGVU
eXBlRW5kXTsKKwordm9pZCBBdWRpb05vZGU6OnByaW50Tm9kZUNvdW50cygpCit7CisgICAgcHJp
bnRmKCJcblxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIp
OworICAgIHByaW50ZigiQXVkaW9Ob2RlOiByZWZlcmVuY2UgY291bnRzXG4iKTsKKyAgICBwcmlu
dGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgTm9kZVR5cGVFbmQ7ICsraSkKKyAgICAgICAgcHJpbnRmKCIlZDogJWRcbiIs
IGksIHNfbm9kZUNvdW50W2ldKTsKKworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09
PT09PT09XG5cblxuIik7Cit9CisKKyNlbmRpZiAvLyBERUJVR19BVURJT05PREVfUkVGRVJFTkNF
UworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElP
KQpJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRp
by9BdWRpb05vZGUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMu
ICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZy
b20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEF1
ZGlvTm9kZV9oCisjZGVmaW5lIEF1ZGlvTm9kZV9oCisKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2Rl
ZmluZSBERUJVR19BVURJT05PREVfUkVGRVJFTkNFUyAwCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgQXVkaW9Db250ZXh0OworY2xhc3MgQXVkaW9Ob2RlSW5wdXQ7CitjbGFzcyBBdWRp
b05vZGVPdXRwdXQ7CisKKy8vIEFuIEF1ZGlvTm9kZSBpcyB0aGUgYmFzaWMgYnVpbGRpbmcgYmxv
Y2sgZm9yIGhhbmRsaW5nIGF1ZGlvIHdpdGhpbiBhbiBBdWRpb0NvbnRleHQuCisvLyBJdCBtYXkg
YmUgYW4gYXVkaW8gc291cmNlLCBhbiBpbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBtb2R1bGUsIG9y
IGFuIGF1ZGlvIGRlc3RpbmF0aW9uLgorLy8gRWFjaCBBdWRpb05vZGUgY2FuIGhhdmUgaW5wdXRz
IGFuZC9vciBvdXRwdXRzLiBBbiBBdWRpb1NvdXJjZU5vZGUgaGFzIG5vIGlucHV0cyBhbmQgYSBz
aW5nbGUgb3V0cHV0LgorLy8gQW4gQXVkaW9EZXN0aW5hdGlvbk5vZGUgaGFzIG9uZSBpbnB1dCBh
bmQgbm8gb3V0cHV0cyBhbmQgcmVwcmVzZW50cyB0aGUgZmluYWwgZGVzdGluYXRpb24gdG8gdGhl
IGF1ZGlvIGhhcmR3YXJlLgorLy8gTW9zdCBwcm9jZXNzaW5nIG5vZGVzIHN1Y2ggYXMgZmlsdGVy
cyB3aWxsIGhhdmUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0LCBhbHRob3VnaCBtdWx0aXBsZSBp
bnB1dHMgYW5kIG91dHB1dHMgYXJlIHBvc3NpYmxlLgorCitjbGFzcyBBdWRpb05vZGUgeworcHVi
bGljOgorICAgIGVudW0geyBQcm9jZXNzaW5nU2l6ZUluRnJhbWVzID0gMTI4IH07CisKKyAgICBB
dWRpb05vZGUoQXVkaW9Db250ZXh0KiwgZG91YmxlIHNhbXBsZVJhdGUpOworICAgIHZpcnR1YWwg
fkF1ZGlvTm9kZSgpOworCisgICAgQXVkaW9Db250ZXh0KiBjb250ZXh0KCkgeyByZXR1cm4gbV9j
b250ZXh0LmdldCgpOyB9CisKKyAgICBlbnVtIE5vZGVUeXBlIHsKKyAgICAgICAgTm9kZVR5cGVV
bmtub3duLAorICAgICAgICBOb2RlVHlwZURlc3RpbmF0aW9uLAorICAgICAgICBOb2RlVHlwZUF1
ZGlvQnVmZmVyU291cmNlLAorICAgICAgICBOb2RlVHlwZUphdmFTY3JpcHQsCisgICAgICAgIE5v
ZGVUeXBlTG93UGFzczJGaWx0ZXIsCisgICAgICAgIE5vZGVUeXBlSGlnaFBhc3MyRmlsdGVyLAor
ICAgICAgICBOb2RlVHlwZVBhbm5lciwKKyAgICAgICAgTm9kZVR5cGVDb252b2x2ZXIsCisgICAg
ICAgIE5vZGVUeXBlRGVsYXksCisgICAgICAgIE5vZGVUeXBlR2FpbiwKKyAgICAgICAgTm9kZVR5
cGVDaGFubmVsU3BsaXR0ZXIsCisgICAgICAgIE5vZGVUeXBlQ2hhbm5lbE1lcmdlciwKKyAgICAg
ICAgTm9kZVR5cGVBbmFseXNlciwKKyAgICAgICAgTm9kZVR5cGVFbmQKKyAgICB9OworCisgICAg
Tm9kZVR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorICAgIHZvaWQgc2V0VHlw
ZShOb2RlVHlwZSk7CisKKyAgICAvLyBXZSBoYW5kbGUgb3VyIG93biByZWYtY291bnRpbmcgYmVj
YXVzZSBvZiB0aGUgdGhyZWFkaW5nIGlzc3VlcyBhbmQgc3VidGxlIG5hdHVyZSBvZgorICAgIC8v
IGhvdyBBdWRpb05vZGVzIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nIChwbGF5aW5nIG9uZS1zaG90
IHNvdW5kKSBhZnRlciB0aGVyZSBhcmUgbm8gbW9yZQorICAgIC8vIEphdmFTY3JpcHQgcmVmZXJl
bmNlcyB0byB0aGUgb2JqZWN0LgorICAgIGVudW0gUmVmVHlwZSB7IFJlZlR5cGVOb3JtYWwsIFJl
ZlR5cGVDb25uZWN0aW9uLCBSZWZUeXBlRGlzYWJsZWQgfTsKKworICAgIC8vIENhbiBiZSBjYWxs
ZWQgZnJvbSBtYWluIHRocmVhZCBvciBjb250ZXh0J3MgYXVkaW8gdGhyZWFkLgorICAgIHZvaWQg
cmVmKFJlZlR5cGUgcmVmVHlwZSA9IFJlZlR5cGVOb3JtYWwpOworICAgIHZvaWQgZGVyZWYoUmVm
VHlwZSByZWZUeXBlID0gUmVmVHlwZU5vcm1hbCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYg
Y2FsbGVyIHNob3VsZCBkZWxldGUgdGhpcyBub2RlLgorICAgIC8vIENhbiBiZSBjYWxsZWQgZnJv
bSBtYWluIHRocmVhZCBvciBjb250ZXh0J3MgYXVkaW8gdGhyZWFkLgorICAgIGJvb2wgZmluaXNo
RGVyZWYoUmVmVHlwZSByZWZUeXBlKTsKKworICAgIC8vIFRoZSBBdWRpb05vZGVJbnB1dChzKSAo
aWYgYW55KSB3aWxsIGFscmVhZHkgaGF2ZSB0aGVpciBpbnB1dCBkYXRhIGF2YWlsYWJsZSB3aGVu
IHByb2Nlc3MoKSBpcyBjYWxsZWQuCisgICAgLy8gU3ViY2xhc3NlcyB3aWxsIHRha2UgdGhpcyBp
bnB1dCBkYXRhIGFuZCBwdXQgdGhlIHJlc3VsdHMgaW4gdGhlIEF1ZGlvQnVzKHMpIG9mIGl0cyBB
dWRpb05vZGVPdXRwdXQocykgKGlmIGFueSkuCisgICAgLy8gQ2FsbGVkIGZyb20gY29udGV4dCdz
IGF1ZGlvIHRocmVhZC4KKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzaXplX3QgZnJhbWVzVG9Q
cm9jZXNzKSA9IDA7CisKKyAgICAvLyBSZXNldHMgRFNQIHByb2Nlc3Npbmcgc3RhdGUgKGNsZWFy
cyBkZWxheSBsaW5lcywgZmlsdGVyIG1lbW9yeSwgZXRjLikKKyAgICAvLyBDYWxsZWQgZnJvbSBj
b250ZXh0J3MgYXVkaW8gdGhyZWFkLgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKKwor
ICAgIC8vIE5vIHNpZ25pZmljYW50IHJlc291cmNlcyBzaG91bGQgYmUgYWxsb2NhdGVkIHVudGls
IGluaXRpYWxpemUoKSBpcyBjYWxsZWQuCisgICAgLy8gUHJvY2Vzc2luZyBtYXkgbm90IG9jY3Vy
IHVudGlsIGEgbm9kZSBpcyBpbml0aWFsaXplZC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6
ZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgdW5pbml0aWFsaXplKCkgPSAwOworCisgICAgYm9v
bCBpc0luaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gbV9pc0luaXRpYWxpemVkOyB9CisgICAg
dm9pZCBsYXp5SW5pdGlhbGl6ZSgpOworCisgICAgdW5zaWduZWQgbnVtYmVyT2ZJbnB1dHMoKSBj
b25zdCB7IHJldHVybiBtX2lucHV0cy5zaXplKCk7IH0KKyAgICB1bnNpZ25lZCBudW1iZXJPZk91
dHB1dHMoKSBjb25zdCB7IHJldHVybiBtX291dHB1dHMuc2l6ZSgpOyB9CisKKyAgICBBdWRpb05v
ZGVJbnB1dCogaW5wdXQodW5zaWduZWQpOworICAgIEF1ZGlvTm9kZU91dHB1dCogb3V0cHV0KHVu
c2lnbmVkKTsKKworICAgIC8vIGNvbm5lY3QoKSAvIGRpc2Nvbm5lY3QoKSByZXR1cm4gdHJ1ZSBv
biBzdWNjZXNzLgorICAgIC8vIENhbGxlZCBmcm9tIG1haW4gdGhyZWFkIGJ5IGNvcnJlc3BvbmRp
bmcgSmF2YVNjcmlwdCBtZXRob2RzLgorICAgIGJvb2wgY29ubmVjdChBdWRpb05vZGUqIGRlc3Rp
bmF0aW9uLCB1bnNpZ25lZCBvdXRwdXRJbmRleCA9IDAsIHVuc2lnbmVkIGlucHV0SW5kZXggPSAw
KTsKKyAgICBib29sIGRpc2Nvbm5lY3QodW5zaWduZWQgb3V0cHV0SW5kZXggPSAwKTsKKworICAg
IGRvdWJsZSBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbV9zYW1wbGVSYXRlOyB9CisKKyAg
ICAvLyBwcm9jZXNzSWZOZWNlc3NhcnkoKSBpcyBjYWxsZWQgYnkgb3VyIG91dHB1dChzKSB3aGVu
IHRoZSByZW5kZXJpbmcgZ3JhcGggbmVlZHMgdGhpcyBBdWRpb05vZGUgdG8gcHJvY2Vzcy4KKyAg
ICAvLyBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIEF1ZGlvTm9kZSB3aWxsIG9ubHkgcHJv
Y2VzcyBvbmNlIHBlciByZW5kZXJpbmcgdGltZSBxdWFudHVtIGV2ZW4gaWYgaXQncyBjYWxsZWQg
cmVwZWF0ZWRseS4KKyAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgImZhbm91dCIgd2hl
cmUgYW4gb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBBdWRpb05vZGUgaW5wdXRzLgor
ICAgIC8vIENhbGxlZCBmcm9tIGNvbnRleHQncyBhdWRpbyB0aHJlYWQuCisgICAgdm9pZCBwcm9j
ZXNzSWZOZWNlc3Nhcnkoc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAvLyBDYWxsZWQg
d2hlbiBhIG5ldyBjb25uZWN0aW9uIGhhcyBiZWVuIG1hZGUgdG8gb25lIG9mIG91ciBpbnB1dHMg
b3IgdGhlIGNvbm5lY3Rpb24gbnVtYmVyIG9mIGNoYW5uZWxzIGhhcyBjaGFuZ2VkLgorICAgIC8v
IFRoaXMgcG90ZW50aWFsbHkgZ2l2ZXMgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBlcmZvcm0g
YSBsYXp5IGluaXRpYWxpemF0aW9uIG9yLCBpZiBuZWNlc3NhcnksIGEgcmUtaW5pdGlhbGl6YXRp
b24uCisgICAgLy8gQ2FsbGVkIGZyb20gbWFpbiB0aHJlYWQuCisgICAgdmlydHVhbCB2b2lkIGNo
ZWNrTnVtYmVyT2ZDaGFubmVsc0ZvcklucHV0KEF1ZGlvTm9kZUlucHV0KikgeyB9CisKKyNpZiBE
RUJVR19BVURJT05PREVfUkVGRVJFTkNFUworICAgIHN0YXRpYyB2b2lkIHByaW50Tm9kZUNvdW50
cygpOworI2VuZGlmCisKK3Byb3RlY3RlZDoKKyAgICAvLyBDYWxsZWQgYnkgcHJvY2Vzc0lmTmVj
ZXNzYXJ5KCkgdG8gY2F1c2UgYWxsIHBhcnRzIG9mIHRoZSByZW5kZXJpbmcgZ3JhcGggY29ubmVj
dGVkIHRvIHVzIHRvIHByb2Nlc3MuCisgICAgLy8gRWFjaCByZW5kZXJpbmcgcXVhbnR1bSwgdGhl
IGF1ZGlvIGRhdGEgZm9yIGVhY2ggb2YgdGhlIEF1ZGlvTm9kZSdzIGlucHV0cyB3aWxsIGJlIGF2
YWlsYWJsZSBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgLy8gQ2FsbGVkIGZyb20g
Y29udGV4dCdzIGF1ZGlvIHRocmVhZC4KKyAgICB2aXJ0dWFsIHZvaWQgcHVsbElucHV0cyhzaXpl
X3QgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIE5vZGVUeXBlIG1fdHlwZTsKKyAgICBSZWZQdHI8
QXVkaW9Db250ZXh0PiBtX2NvbnRleHQ7CisgICAgZG91YmxlIG1fc2FtcGxlUmF0ZTsKKyAgICBi
b29sIG1faXNJbml0aWFsaXplZDsKKyAgICBWZWN0b3I8T3duUHRyPEF1ZGlvTm9kZUlucHV0PiA+
IG1faW5wdXRzOworICAgIFZlY3RvcjxPd25QdHI8QXVkaW9Ob2RlT3V0cHV0PiA+IG1fb3V0cHV0
czsKKworICAgIGRvdWJsZSBtX2xhc3RQcm9jZXNzaW5nVGltZTsKKworICAgIC8vIFJlZi1jb3Vu
dGluZworICAgIHZvbGF0aWxlIGludCBtX25vcm1hbFJlZkNvdW50OworICAgIHZvbGF0aWxlIGlu
dCBtX2Nvbm5lY3Rpb25SZWZDb3VudDsKKyAgICB2b2xhdGlsZSBpbnQgbV9kaXNhYmxlZFJlZkNv
dW50OworCisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBzdGF0aWMgYm9vbCBz
X2lzTm9kZUNvdW50SW5pdGlhbGl6ZWQ7CisgICAgc3RhdGljIGludCBzX25vZGVDb3VudFtOb2Rl
VHlwZUVuZF07CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
IC8vIEF1ZGlvTm9kZV9oCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5pZGwKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBB
cHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0
cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworbW9kdWxlIGF1ZGlvIHsKKyAgICBpbnRlcmZhY2UgWworICAgICAgICBDb25kaXRp
b25hbD1XRUJfQVVESU8KKyAgICBdIEF1ZGlvTm9kZSB7CisgICAgICAgIHJlYWRvbmx5IGF0dHJp
YnV0ZSBBdWRpb0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIHVu
c2lnbmVkIGxvbmcgbnVtYmVyT2ZJbnB1dHM7CisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1
bnNpZ25lZCBsb25nIG51bWJlck9mT3V0cHV0czsKKworICAgICAgICBbQ3VzdG9tXSB2b2lkIGNv
bm5lY3QoaW4gQXVkaW9Ob2RlIGRlc3RpbmF0aW9uLCBpbiB1bnNpZ25lZCBsb25nIG91dHB1dCwg
aW4gdW5zaWduZWQgbG9uZyBpbnB1dCk7CisgICAgICAgIFtDdXN0b21dIHZvaWQgZGlzY29ubmVj
dChpbiB1bnNpZ25lZCBsb25nIG91dHB1dCk7CisgICAgfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68282</attachid>
            <date>2010-09-21 13:13:18 -0700</date>
            <delta_ts>2010-09-27 16:01:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45571-20100921131316.patch</filename>
            <type>text/plain</type>
            <size>22671</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzk3OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzkgQEAKKzIwMTAtMDktMjEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9Ob2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD00NTU3MQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRpbyBBUEkg
aXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvTm9kZS5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpBdWRpb05vZGUpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjp+QXVkaW9Ob2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvTm9kZTo6c2V0VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmxhenlJ
bml0aWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6YWRkSW5wdXQpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjphZGRPdXRwdXQpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Ob2RlOjppbnB1dCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6Om91dHB1dCk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmNvbm5lY3QpOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9Ob2RlOjpkaXNjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6
cHJvY2Vzc0lmTmVjZXNzYXJ5KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6cHVsbElu
cHV0cyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnJlZik6CisgICAgICAgIChXZWJD
b3JlOjpBdWRpb05vZGU6OmRlcmVmKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6Zmlu
aXNoRGVyZWYpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpwcmludE5vZGVDb3VudHMp
OgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvTm9kZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvTm9kZTo6Y29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnR5
cGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjppc0luaXRpYWxpemVkKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6bnVtYmVyT2ZJbnB1dHMpOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9Ob2RlOjpudW1iZXJPZk91dHB1dHMpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9O
b2RlOjpzYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6Y2hlY2tOdW1i
ZXJPZkNoYW5uZWxzRm9ySW5wdXQpOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvTm9kZS5pZGw6
IEFkZGVkLgorCiAyMDEwLTA5LTIxICBWYW5nZWxpcyBLb2trZXZpcyAgPHZhbmdlbGlzQGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBKYW1lcyBSb2JpbnNvbi4KSW5kZXg6IFdl
YkNvcmUvd2ViYXVkaW8vQXVkaW9Ob2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1
ZGlvL0F1ZGlvTm9kZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlv
Tm9kZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFw
cGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorCisjaWYgRU5BQkxFKFdFQl9BVURJTykKKworI2luY2x1ZGUgIkF1ZGlvTm9kZS5oIgor
CisjaW5jbHVkZSAiQXVkaW9Db250ZXh0LmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlSW5wdXQuaCIK
KyNpbmNsdWRlICJBdWRpb05vZGVPdXRwdXQuaCIKKyNpbmNsdWRlIDx3dGYvQXRvbWljcy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0F1ZGlvTm9kZTo6QXVkaW9Ob2RlKEF1ZGlvQ29udGV4
dCogY29udGV4dCwgZG91YmxlIHNhbXBsZVJhdGUpCisgICAgOiBtX2lzSW5pdGlhbGl6ZWQoZmFs
c2UpCisgICAgLCBtX3R5cGUoTm9kZVR5cGVVbmtub3duKQorICAgICwgbV9jb250ZXh0KGNvbnRl
eHQpCisgICAgLCBtX3NhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKKyAgICAsIG1fbGFzdFByb2Nlc3Np
bmdUaW1lKC0xLjApCisgICAgLCBtX25vcm1hbFJlZkNvdW50KDEpIC8vIHN0YXJ0IG91dCB3aXRo
IG5vcm1hbCByZWZDb3VudCA9PSAxIChsaWtlIFdURjo6UmVmQ291bnRlZCBjbGFzcykKKyAgICAs
IG1fY29ubmVjdGlvblJlZkNvdW50KDApCisgICAgLCBtX2Rpc2FibGVkUmVmQ291bnQoMCkKKyAg
ICAsIG1faXNNYXJrZWRGb3JEZWxldGlvbihmYWxzZSkKKyAgICAsIG1faXNEaXNhYmxlZChmYWxz
ZSkKK3sKKyNpZiBERUJVR19BVURJT05PREVfUkVGRVJFTkNFUworICAgIGlmICghc19pc05vZGVD
b3VudEluaXRpYWxpemVkKSB7CisgICAgICAgIHNfaXNOb2RlQ291bnRJbml0aWFsaXplZCA9IHRy
dWU7CisgICAgICAgIGF0ZXhpdChBdWRpb05vZGU6OnByaW50Tm9kZUNvdW50cyk7CisgICAgfQor
I2VuZGlmCit9CisKK0F1ZGlvTm9kZTo6fkF1ZGlvTm9kZSgpCit7CisjaWYgREVCVUdfQVVESU9O
T0RFX1JFRkVSRU5DRVMKKyAgICAtLXNfbm9kZUNvdW50W3R5cGUoKV07CisgICAgcHJpbnRmKCIl
cDogJWQ6IEF1ZGlvTm9kZTo6fkF1ZGlvTm9kZSgpICVkICVkICVkXG4iLCB0aGlzLCB0eXBlKCks
IG1fbm9ybWFsUmVmQ291bnQsIG1fY29ubmVjdGlvblJlZkNvdW50LCBtX2Rpc2FibGVkUmVmQ291
bnQpOworI2VuZGlmCit9CisKK3ZvaWQgQXVkaW9Ob2RlOjpzZXRUeXBlKE5vZGVUeXBlIHR5cGUp
Cit7CisgICAgbV90eXBlID0gdHlwZTsKKworI2lmIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VT
CisgICAgKytzX25vZGVDb3VudFt0eXBlXTsKKyNlbmRpZgorfQorCit2b2lkIEF1ZGlvTm9kZTo6
bGF6eUluaXRpYWxpemUoKQoreworICAgIGlmICghaXNJbml0aWFsaXplZCgpKQorICAgICAgICBp
bml0aWFsaXplKCk7Cit9CisKK3ZvaWQgQXVkaW9Ob2RlOjphZGRJbnB1dChQYXNzT3duUHRyPEF1
ZGlvTm9kZUlucHV0PiBpbnB1dCkKK3sKKyAgICBtX2lucHV0cy5hcHBlbmQoaW5wdXQpOworfQor
Cit2b2lkIEF1ZGlvTm9kZTo6YWRkT3V0cHV0KFBhc3NPd25QdHI8QXVkaW9Ob2RlT3V0cHV0PiBv
dXRwdXQpCit7CisgICAgbV9vdXRwdXRzLmFwcGVuZChvdXRwdXQpOworfQorCitBdWRpb05vZGVJ
bnB1dCogQXVkaW9Ob2RlOjppbnB1dCh1bnNpZ25lZCBpKQoreworICAgIHJldHVybiBtX2lucHV0
c1tpXS5nZXQoKTsKK30KKworQXVkaW9Ob2RlT3V0cHV0KiBBdWRpb05vZGU6Om91dHB1dCh1bnNp
Z25lZCBpKQoreworICAgIHJldHVybiBtX291dHB1dHNbaV0uZ2V0KCk7Cit9CisKK2Jvb2wgQXVk
aW9Ob2RlOjpjb25uZWN0KEF1ZGlvTm9kZSogZGVzdGluYXRpb24sIHVuc2lnbmVkIG91dHB1dElu
ZGV4LCB1bnNpZ25lZCBpbnB1dEluZGV4KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
IAorICAgIEF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICAK
KyAgICAvLyBTYW5pdHkgY2hlY2sgaW5wdXQgYW5kIG91dHB1dCBpbmRpY2VzLgorICAgIGlmIChv
dXRwdXRJbmRleCA+PSBudW1iZXJPZk91dHB1dHMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChkZXN0aW5hdGlvbiAmJiBpbnB1dEluZGV4ID49IGRlc3RpbmF0aW9uLT5udW1iZXJP
ZklucHV0cygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBdWRpb05vZGVPdXRwdXQq
IG91dHB1dCA9IHRoaXMtPm91dHB1dChvdXRwdXRJbmRleCk7CisgICAgaWYgKCFkZXN0aW5hdGlv
bikgeworICAgICAgICAvLyBEaXNjb25uZWN0IG91dHB1dCBmcm9tIGFueSBpbnB1dHMgaXQgbWF5
IGJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8uCisgICAgICAgIG91dHB1dC0+ZGlzY29ubmVjdEFs
bElucHV0cygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBBdWRpb05vZGVJ
bnB1dCogaW5wdXQgPSBkZXN0aW5hdGlvbi0+aW5wdXQoaW5wdXRJbmRleCk7CisgICAgaW5wdXQt
PmNvbm5lY3Qob3V0cHV0KTsKKworICAgIC8vIExldCBjb250ZXh0IGtub3cgdGhhdCBhIGNvbm5l
Y3Rpb24gaGFzIGJlZW4gbWFkZS4KKyAgICBjb250ZXh0KCktPmluY3JlbWVudENvbm5lY3Rpb25D
b3VudCgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQXVkaW9Ob2RlOjpkaXNjb25u
ZWN0KHVuc2lnbmVkIG91dHB1dEluZGV4KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisgICAgQXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIAor
ICAgIHJldHVybiBjb25uZWN0KDAsIG91dHB1dEluZGV4KTsKK30KKwordm9pZCBBdWRpb05vZGU6
OnByb2Nlc3NJZk5lY2Vzc2FyeShzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIEFTU0VS
VChjb250ZXh0KCktPmlzQXVkaW9UaHJlYWQoKSk7CisgICAgCisgICAgaWYgKCFpc0luaXRpYWxp
emVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEVuc3VyZSB0aGF0IHdlIG9ubHkgcHJv
Y2VzcyBvbmNlIHBlciByZW5kZXJpbmcgcXVhbnR1bS4KKyAgICAvLyBUaGlzIGhhbmRsZXMgdGhl
ICJmYW5vdXQiIHByb2JsZW0gd2hlcmUgYW4gb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBtdWx0aXBs
ZSBpbnB1dHMuCisgICAgLy8gVGhlIGZpcnN0IHRpbWUgd2UncmUgY2FsbGVkIGR1cmluZyB0aGlz
IHRpbWUgc2xpY2Ugd2UgcHJvY2VzcywgYnV0IGFmdGVyIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBy
ZS1wcm9jZXNzLAorICAgIC8vIGluc3RlYWQgb3VyIG91dHB1dChzKSB3aWxsIGFscmVhZHkgaGF2
ZSB0aGUgcmVzdWx0cyBjYWNoZWQgaW4gdGhlaXIgYnVzOworICAgIGRvdWJsZSBjdXJyZW50VGlt
ZSA9IGNvbnRleHQoKS0+Y3VycmVudFRpbWUoKTsKKyAgICBpZiAobV9sYXN0UHJvY2Vzc2luZ1Rp
bWUgIT0gY3VycmVudFRpbWUpIHsKKyAgICAgICAgbV9sYXN0UHJvY2Vzc2luZ1RpbWUgPSBjdXJy
ZW50VGltZTsgLy8gaW1wb3J0YW50IHRvIGZpcnN0IHVwZGF0ZSB0aGlzIHRpbWUgYmVjYXVzZSBv
ZiBmZWVkYmFjayBsb29wcyBpbiB0aGUgcmVuZGVyaW5nIGdyYXBoCisgICAgICAgIHB1bGxJbnB1
dHMoZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICAgICAgcHJvY2VzcyhmcmFtZXNUb1Byb2Nlc3MpOwor
ICAgIH0KK30KKwordm9pZCBBdWRpb05vZGU6OnB1bGxJbnB1dHMoc2l6ZV90IGZyYW1lc1RvUHJv
Y2VzcykKK3sKKyAgICBBU1NFUlQoY29udGV4dCgpLT5pc0F1ZGlvVGhyZWFkKCkpOworICAgIAor
ICAgIC8vIFByb2Nlc3MgYWxsIG9mIHRoZSBBdWRpb05vZGVzIGNvbm5lY3RlZCB0byBvdXIgaW5w
dXRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2lucHV0cy5zaXplKCk7ICsraSkK
KyAgICAgICAgaW5wdXQoaSktPnB1bGwoMCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCBB
dWRpb05vZGU6OnJlZihSZWZUeXBlIHJlZlR5cGUpCit7CisgICAgc3dpdGNoIChyZWZUeXBlKSB7
CisgICAgY2FzZSBSZWZUeXBlTm9ybWFsOgorICAgICAgICBhdG9taWNJbmNyZW1lbnQoJm1fbm9y
bWFsUmVmQ291bnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJlZlR5cGVDb25uZWN0aW9u
OgorICAgICAgICBhdG9taWNJbmNyZW1lbnQoJm1fY29ubmVjdGlvblJlZkNvdW50KTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBSZWZUeXBlRGlzYWJsZWQ6CisgICAgICAgIGF0b21pY0luY3Jl
bWVudCgmbV9kaXNhYmxlZFJlZkNvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisjaWYgREVCVUdfQVVESU9O
T0RFX1JFRkVSRU5DRVMKKyAgICBwcmludGYoIiVwOiAlZDogQXVkaW9Ob2RlOjpyZWYoJWQpICVk
ICVkICVkXG4iLCB0aGlzLCB0eXBlKCksIHJlZlR5cGUsIG1fbm9ybWFsUmVmQ291bnQsIG1fY29u
bmVjdGlvblJlZkNvdW50LCBtX2Rpc2FibGVkUmVmQ291bnQpOworI2VuZGlmCisKKyAgICBpZiAo
bV9jb25uZWN0aW9uUmVmQ291bnQgPT0gMSAmJiByZWZUeXBlID09IFJlZlR5cGVDb25uZWN0aW9u
KSB7CisgICAgICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgd2FrZS11cCAtIHRoaXMgaXMgYW4gYWR2
YW5jZWQgZmVhdHVyZSBhbmQgaXMgbm90IG5lY2Vzc2FyeSBpbiBhIHNpbXBsZSBpbXBsZW1lbnRh
dGlvbi4KKyAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBiZSAiYWN0aXZlbHkiIGNvbm5lY3RlZCB0
byBhbnl0aGluZywgYnV0IG5vdyB3ZSdyZSAid2FraW5nIHVwIgorICAgICAgICAvLyBGb3IgZXhh
bXBsZSwgYSBub3RlIHdoaWNoIGhhcyBmaW5pc2hlZCBwbGF5aW5nLCBidXQgaXMgbm93IGJlaW5n
IHBsYXllZCBhZ2Fpbi4KKyAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoaXMgaXMgY29uc2lkZXJl
ZCBhIHdvcnRod2hpbGUgZmVhdHVyZSB0byBhZGQsIHRoZW4gYW4gZXZhbHVhdGlvbiBvZiB0aGUg
bG9ja2luZyBjb25zaWRlcmF0aW9ucyBtdXN0IGJlIG1hZGUuCisgICAgfQorfQorCit2b2lkIEF1
ZGlvTm9kZTo6ZGVyZWYoUmVmVHlwZSByZWZUeXBlKQoreworICAgIC8vIFRoZSBhY3R1YWxseSB3
b3JrIGZvciBkZXJlZiBoYXBwZW5zIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBhdWRpbyBjb250ZXh0
J3MgZ3JhcGggbG9jay4KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiB0aGUgYXVkaW8gdGhyZWFkLCB3
ZSBtdXN0IHVzZSBhIHRyeUxvY2sgdG8gYXZvaWQgZ2xpdGNoZXMuCisgICAgYm9vbCBoYXNMb2Nr
ID0gZmFsc2U7CisgICAgYm9vbCBtdXN0UmVsZWFzZUxvY2sgPSBmYWxzZTsKKyAgICAKKyAgICBp
ZiAoY29udGV4dCgpLT5pc0F1ZGlvVGhyZWFkKCkpIHsKKyAgICAgICAgLy8gUmVhbC10aW1lIGF1
ZGlvIHRocmVhZCBtdXN0IG5vdCBjb250ZW5kIGxvY2sgKHRvIGF2b2lkIGdsaXRjaGVzKS4KKyAg
ICAgICAgaGFzTG9jayA9IGNvbnRleHQoKS0+dHJ5TG9jayhtdXN0UmVsZWFzZUxvY2spOworICAg
IH0gZWxzZSB7CisgICAgICAgIGNvbnRleHQoKS0+bG9jayhtdXN0UmVsZWFzZUxvY2spOworICAg
ICAgICBoYXNMb2NrID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaWYgKGhhc0xvY2spIHsKKyAg
ICAgICAgLy8gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCBkZXJlZiB3b3JrIGhhcHBlbnMuCisgICAg
ICAgIGZpbmlzaERlcmVmKHJlZlR5cGUpOworCisgICAgICAgIGlmIChtdXN0UmVsZWFzZUxvY2sp
CisgICAgICAgICAgICBjb250ZXh0KCktPnVubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAg
IC8vIFdlIHdlcmUgdW5hYmxlIHRvIGdldCB0aGUgbG9jaywgc28gcHV0IHRoaXMgaW4gYSBsaXN0
IHRvIGZpbmlzaCB1cCBsYXRlci4KKyAgICAgICAgQVNTRVJUKGNvbnRleHQoKS0+aXNBdWRpb1Ro
cmVhZCgpKTsKKyAgICAgICAgY29udGV4dCgpLT5hZGREZWZlcnJlZEZpbmlzaERlcmVmKHRoaXMs
IHJlZlR5cGUpOworICAgIH0KKworICAgIC8vIE9uY2UgQXVkaW9Db250ZXh0Ojp1bmluaXRpYWxp
emUoKSBpcyBjYWxsZWQgdGhlcmUncyBubyBtb3JlIGNoYW5jZXMgZm9yIGRlbGV0ZU1hcmtlZE5v
ZGVzKCkgdG8gZ2V0IGNhbGxlZCwgc28gd2UgY2FsbCBoZXJlLgorICAgIC8vIFdlIGNhbid0IGNh
bGwgaW4gQXVkaW9Db250ZXh0Ojp+QXVkaW9Db250ZXh0KCkgc2luY2UgaXQgd2lsbCBuZXZlciBi
ZSBjYWxsZWQgYXMgbG9uZyBhcyBhbnkgQXVkaW9Ob2RlIGlzIGFsaXZlCisgICAgLy8gYmVjYXVz
ZSBBdWRpb05vZGVzIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRleHQuCisgICAgaWYgKGNv
bnRleHQoKS0+aXNBdWRpb1RocmVhZEZpbmlzaGVkKCkpCisgICAgICAgIGNvbnRleHQoKS0+ZGVs
ZXRlTWFya2VkTm9kZXMoKTsKK30KKwordm9pZCBBdWRpb05vZGU6OmZpbmlzaERlcmVmKFJlZlR5
cGUgcmVmVHlwZSkKK3sKKyAgICBBU1NFUlQoY29udGV4dCgpLT5pc0dyYXBoT3duZXIoKSk7Cisg
ICAgCisgICAgc3dpdGNoIChyZWZUeXBlKSB7CisgICAgY2FzZSBSZWZUeXBlTm9ybWFsOgorICAg
ICAgICBBU1NFUlQobV9ub3JtYWxSZWZDb3VudCA+IDApOworICAgICAgICBhdG9taWNEZWNyZW1l
bnQoJm1fbm9ybWFsUmVmQ291bnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJlZlR5cGVD
b25uZWN0aW9uOgorICAgICAgICBBU1NFUlQobV9jb25uZWN0aW9uUmVmQ291bnQgPiAwKTsKKyAg
ICAgICAgYXRvbWljRGVjcmVtZW50KCZtX2Nvbm5lY3Rpb25SZWZDb3VudCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgUmVmVHlwZURpc2FibGVkOgorICAgICAgICBBU1NFUlQobV9kaXNhYmxl
ZFJlZkNvdW50ID4gMCk7CisgICAgICAgIGF0b21pY0RlY3JlbWVudCgmbV9kaXNhYmxlZFJlZkNv
dW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgfQorICAgIAorI2lmIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisg
ICAgcHJpbnRmKCIlcDogJWQ6IEF1ZGlvTm9kZTo6ZGVyZWYoJWQpICVkICVkICVkXG4iLCB0aGlz
LCB0eXBlKCksIHJlZlR5cGUsIG1fbm9ybWFsUmVmQ291bnQsIG1fY29ubmVjdGlvblJlZkNvdW50
LCBtX2Rpc2FibGVkUmVmQ291bnQpOworI2VuZGlmCisKKyAgICBpZiAoIW1fY29ubmVjdGlvblJl
ZkNvdW50KSB7CisgICAgICAgIGlmICghbV9ub3JtYWxSZWZDb3VudCAmJiAhbV9kaXNhYmxlZFJl
ZkNvdW50KSB7CisgICAgICAgICAgICBpZiAoIW1faXNNYXJrZWRGb3JEZWxldGlvbikgeworICAg
ICAgICAgICAgICAgIC8vIEFsbCByZWZlcmVuY2VzIGFyZSBnb25lIC0gd2UgbmVlZCB0byBnbyBh
d2F5LgorICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX291dHB1dHMu
c2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dChpKS0+ZGlzY29ubmVjdEFs
bElucHV0cygpOyAvLyB0aGlzIHdpbGwgZGVyZWYoKSBub2RlcyB3ZSdyZSBjb25uZWN0ZWQgdG8u
Li4KKworICAgICAgICAgICAgICAgIC8vIE1hcmsgZm9yIGRlbGV0aW9uIGF0IGVuZCBvZiBlYWNo
IHJlbmRlciBxdWFudHVtIG9yIHdoZW4gY29udGV4dCBzaHV0cyBkb3duLgorICAgICAgICAgICAg
ICAgIGNvbnRleHQoKS0+bWFya0ZvckRlbGV0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIG1f
aXNNYXJrZWRGb3JEZWxldGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSBpZiAocmVmVHlwZSA9PSBSZWZUeXBlQ29ubmVjdGlvbikgeworICAgICAgICAgICAgaWYgKCFt
X2lzRGlzYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBTdGlsbCBtYXkgaGF2ZSBKYXZhU2Ny
aXB0IHJlZmVyZW5jZXMsIGJ1dCBubyBtb3JlICJhY3RpdmUiIGNvbm5lY3Rpb24gcmVmZXJlbmNl
cywgc28gcHV0IGFsbCBvZiBvdXIgb3V0cHV0cyBpbiBhICJkb3JtYW50IiBkaXNhYmxlZCBzdGF0
ZS4KKyAgICAgICAgICAgICAgICAvLyBHYXJiYWdlIGNvbGxlY3Rpb24gbWF5IHRha2UgYSB2ZXJ5
IGxvbmcgdGltZSBhZnRlciB0aGlzIHRpbWUsIHNvIHRoZSAiZG9ybWFudCIgZGlzYWJsZWQgbm9k
ZXMgc2hvdWxkIG5vdCBib2cgZG93biB0aGUgcmVuZGVyaW5nLi4uCisKKyAgICAgICAgICAgICAg
ICAvLyBBcyBmYXIgYXMgSmF2YVNjcmlwdCBpcyBjb25jZXJuZWQsIG91ciBvdXRwdXRzIG11c3Qg
c3RpbGwgYXBwZWFyIHRvIGJlIGNvbm5lY3RlZC4KKyAgICAgICAgICAgICAgICAvLyBCdXQgaW50
ZXJuYWxseSBvdXIgb3V0cHV0cyBzaG91bGQgYmUgZGlzYWJsZWQgZnJvbSB0aGUgaW5wdXRzIHRo
ZXkncmUgY29ubmVjdGVkIHRvLgorICAgICAgICAgICAgICAgIC8vIGRpc2FibGUoKSBjYW4gcmVj
dXJzaXZlbHkgZGVyZWYgY29ubmVjdGlvbnMgKGFuZCBjYWxsIGRpc2FibGUoKSkgZG93biBhIHdo
b2xlIGNoYWluIG9mIGNvbm5lY3RlZCBub2Rlcy4KKworICAgICAgICAgICAgICAgIC8vIEZJWE1F
OiB3ZSBzcGVjaWFsIGNhc2UgdGhlIGNvbnZvbHZlciBhbmQgZGVsYXkgc2luY2UgdGhleSBoYXZl
IGEgc2lnbmlmaWNhbnQgdGFpbC10aW1lIGFuZCBzaG91bGRuJ3QgYmUgZGlzY29ubmVjdGVkIHNp
bXBseQorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBubyBsb25nZXIgaGF2ZSBhbnkg
aW5wdXQgY29ubmVjdGlvbnMuICBUaGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmFs
bHkgd2hlcmUgQXVkaW9Ob2RlcyBoYXZlCisgICAgICAgICAgICAgICAgLy8gYSB0YWlsVGltZSBh
dHRyaWJ1dGUuICBUaGVuIHRoZSBBdWRpb05vZGUgb25seSBuZWVkcyB0byByZW1haW4gImFjdGl2
ZSIgZm9yIHRhaWxUaW1lIHNlY29uZHMgYWZ0ZXIgdGhlcmUgYXJlIG5vCisgICAgICAgICAgICAg
ICAgLy8gbG9uZ2VyIGFueSBhY3RpdmUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgaWYg
KHR5cGUoKSAhPSBOb2RlVHlwZUNvbnZvbHZlciAmJiB0eXBlKCkgIT0gTm9kZVR5cGVEZWxheSkg
eworICAgICAgICAgICAgICAgICAgICBtX2lzRGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9vdXRwdXRzLnNpemUoKTsgKytpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KGkpLT5kaXNhYmxlKCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjaWYgREVCVUdf
QVVESU9OT0RFX1JFRkVSRU5DRVMKKworYm9vbCBBdWRpb05vZGU6OnNfaXNOb2RlQ291bnRJbml0
aWFsaXplZCA9IGZhbHNlOworaW50IEF1ZGlvTm9kZTo6c19ub2RlQ291bnRbTm9kZVR5cGVFbmRd
OworCit2b2lkIEF1ZGlvTm9kZTo6cHJpbnROb2RlQ291bnRzKCkKK3sKKyAgICBwcmludGYoIlxu
XG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAg
cHJpbnRmKCJBdWRpb05vZGU6IHJlZmVyZW5jZSBjb3VudHNcbiIpOworICAgIHByaW50ZigiPT09
PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBOb2RlVHlwZUVuZDsgKytpKQorICAgICAgICBwcmludGYoIiVkOiAlZFxuIiwgaSwgc19u
b2RlQ291bnRbaV0pOworCisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT1c
blxuXG4iKTsKK30KKworI2VuZGlmIC8vIERFQlVHX0FVRElPTk9ERV9SRUZFUkVOQ0VTCisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4
OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9Ob2RlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlv
Tm9kZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQXVkaW9Ob2Rl
X2gKKyNkZWZpbmUgQXVkaW9Ob2RlX2gKKworI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNs
dWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRl
IDx3dGYvVmVjdG9yLmg+CisKKyNkZWZpbmUgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMgMAor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQ29udGV4dDsKK2NsYXNzIEF1ZGlv
Tm9kZUlucHV0OworY2xhc3MgQXVkaW9Ob2RlT3V0cHV0OworCisvLyBBbiBBdWRpb05vZGUgaXMg
dGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrIGZvciBoYW5kbGluZyBhdWRpbyB3aXRoaW4gYW4gQXVk
aW9Db250ZXh0LgorLy8gSXQgbWF5IGJlIGFuIGF1ZGlvIHNvdXJjZSwgYW4gaW50ZXJtZWRpYXRl
IHByb2Nlc3NpbmcgbW9kdWxlLCBvciBhbiBhdWRpbyBkZXN0aW5hdGlvbi4KKy8vIEVhY2ggQXVk
aW9Ob2RlIGNhbiBoYXZlIGlucHV0cyBhbmQvb3Igb3V0cHV0cy4gQW4gQXVkaW9Tb3VyY2VOb2Rl
IGhhcyBubyBpbnB1dHMgYW5kIGEgc2luZ2xlIG91dHB1dC4KKy8vIEFuIEF1ZGlvRGVzdGluYXRp
b25Ob2RlIGhhcyBvbmUgaW5wdXQgYW5kIG5vIG91dHB1dHMgYW5kIHJlcHJlc2VudHMgdGhlIGZp
bmFsIGRlc3RpbmF0aW9uIHRvIHRoZSBhdWRpbyBoYXJkd2FyZS4KKy8vIE1vc3QgcHJvY2Vzc2lu
ZyBub2RlcyBzdWNoIGFzIGZpbHRlcnMgd2lsbCBoYXZlIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1
dCwgYWx0aG91Z2ggbXVsdGlwbGUgaW5wdXRzIGFuZCBvdXRwdXRzIGFyZSBwb3NzaWJsZS4KKwor
Y2xhc3MgQXVkaW9Ob2RlIHsKK3B1YmxpYzoKKyAgICBlbnVtIHsgUHJvY2Vzc2luZ1NpemVJbkZy
YW1lcyA9IDEyOCB9OworCisgICAgQXVkaW9Ob2RlKEF1ZGlvQ29udGV4dCosIGRvdWJsZSBzYW1w
bGVSYXRlKTsKKyAgICB2aXJ0dWFsIH5BdWRpb05vZGUoKTsKKworICAgIEF1ZGlvQ29udGV4dCog
Y29udGV4dCgpIHsgcmV0dXJuIG1fY29udGV4dC5nZXQoKTsgfQorCisgICAgZW51bSBOb2RlVHlw
ZSB7CisgICAgICAgIE5vZGVUeXBlVW5rbm93biwKKyAgICAgICAgTm9kZVR5cGVEZXN0aW5hdGlv
biwKKyAgICAgICAgTm9kZVR5cGVBdWRpb0J1ZmZlclNvdXJjZSwKKyAgICAgICAgTm9kZVR5cGVK
YXZhU2NyaXB0LAorICAgICAgICBOb2RlVHlwZUxvd1Bhc3MyRmlsdGVyLAorICAgICAgICBOb2Rl
VHlwZUhpZ2hQYXNzMkZpbHRlciwKKyAgICAgICAgTm9kZVR5cGVQYW5uZXIsCisgICAgICAgIE5v
ZGVUeXBlQ29udm9sdmVyLAorICAgICAgICBOb2RlVHlwZURlbGF5LAorICAgICAgICBOb2RlVHlw
ZUdhaW4sCisgICAgICAgIE5vZGVUeXBlQ2hhbm5lbFNwbGl0dGVyLAorICAgICAgICBOb2RlVHlw
ZUNoYW5uZWxNZXJnZXIsCisgICAgICAgIE5vZGVUeXBlQW5hbHlzZXIsCisgICAgICAgIE5vZGVU
eXBlRW5kCisgICAgfTsKKworICAgIE5vZGVUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5
cGU7IH0KKyAgICB2b2lkIHNldFR5cGUoTm9kZVR5cGUpOworCisgICAgLy8gV2UgaGFuZGxlIG91
ciBvd24gcmVmLWNvdW50aW5nIGJlY2F1c2Ugb2YgdGhlIHRocmVhZGluZyBpc3N1ZXMgYW5kIHN1
YnRsZSBuYXR1cmUgb2YKKyAgICAvLyBob3cgQXVkaW9Ob2RlcyBjYW4gY29udGludWUgcHJvY2Vz
c2luZyAocGxheWluZyBvbmUtc2hvdCBzb3VuZCkgYWZ0ZXIgdGhlcmUgYXJlIG5vIG1vcmUKKyAg
ICAvLyBKYXZhU2NyaXB0IHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KKyAgICBlbnVtIFJlZlR5
cGUgeyBSZWZUeXBlTm9ybWFsLCBSZWZUeXBlQ29ubmVjdGlvbiwgUmVmVHlwZURpc2FibGVkIH07
CisKKyAgICAvLyBDYW4gYmUgY2FsbGVkIGZyb20gbWFpbiB0aHJlYWQgb3IgY29udGV4dCdzIGF1
ZGlvIHRocmVhZC4KKyAgICB2b2lkIHJlZihSZWZUeXBlIHJlZlR5cGUgPSBSZWZUeXBlTm9ybWFs
KTsKKyAgICB2b2lkIGRlcmVmKFJlZlR5cGUgcmVmVHlwZSA9IFJlZlR5cGVOb3JtYWwpOworCisg
ICAgLy8gQ2FuIGJlIGNhbGxlZCBmcm9tIG1haW4gdGhyZWFkIG9yIGNvbnRleHQncyBhdWRpbyB0
aHJlYWQuICBJdCBtdXN0IGJlIGNhbGxlZCB3aGlsZSB0aGUgY29udGV4dCdzIGdyYXBoIGxvY2sg
aXMgaGVsZC4KKyAgICB2b2lkIGZpbmlzaERlcmVmKFJlZlR5cGUgcmVmVHlwZSk7CisKKyAgICAv
LyBUaGUgQXVkaW9Ob2RlSW5wdXQocykgKGlmIGFueSkgd2lsbCBhbHJlYWR5IGhhdmUgdGhlaXIg
aW5wdXQgZGF0YSBhdmFpbGFibGUgd2hlbiBwcm9jZXNzKCkgaXMgY2FsbGVkLgorICAgIC8vIFN1
YmNsYXNzZXMgd2lsbCB0YWtlIHRoaXMgaW5wdXQgZGF0YSBhbmQgcHV0IHRoZSByZXN1bHRzIGlu
IHRoZSBBdWRpb0J1cyhzKSBvZiBpdHMgQXVkaW9Ob2RlT3V0cHV0KHMpIChpZiBhbnkpLgorICAg
IC8vIENhbGxlZCBmcm9tIGNvbnRleHQncyBhdWRpbyB0aHJlYWQuCisgICAgdmlydHVhbCB2b2lk
IHByb2Nlc3Moc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykgPSAwOworCisgICAgLy8gUmVzZXRzIERT
UCBwcm9jZXNzaW5nIHN0YXRlIChjbGVhcnMgZGVsYXkgbGluZXMsIGZpbHRlciBtZW1vcnksIGV0
Yy4pCisgICAgLy8gQ2FsbGVkIGZyb20gY29udGV4dCdzIGF1ZGlvIHRocmVhZC4KKyAgICB2aXJ0
dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisKKyAgICAvLyBObyBzaWduaWZpY2FudCByZXNvdXJjZXMg
c2hvdWxkIGJlIGFsbG9jYXRlZCB1bnRpbCBpbml0aWFsaXplKCkgaXMgY2FsbGVkLgorICAgIC8v
IFByb2Nlc3NpbmcgbWF5IG5vdCBvY2N1ciB1bnRpbCBhIG5vZGUgaXMgaW5pdGlhbGl6ZWQuCisg
ICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemUoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHVuaW5p
dGlhbGl6ZSgpID0gMDsKKworICAgIGJvb2wgaXNJbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJu
IG1faXNJbml0aWFsaXplZDsgfQorICAgIHZvaWQgbGF6eUluaXRpYWxpemUoKTsKKworICAgIHVu
c2lnbmVkIG51bWJlck9mSW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dHMuc2l6ZSgpOyB9
CisgICAgdW5zaWduZWQgbnVtYmVyT2ZPdXRwdXRzKCkgY29uc3QgeyByZXR1cm4gbV9vdXRwdXRz
LnNpemUoKTsgfQorCisgICAgQXVkaW9Ob2RlSW5wdXQqIGlucHV0KHVuc2lnbmVkKTsKKyAgICBB
dWRpb05vZGVPdXRwdXQqIG91dHB1dCh1bnNpZ25lZCk7CisKKyAgICAvLyBjb25uZWN0KCkgLyBk
aXNjb25uZWN0KCkgcmV0dXJuIHRydWUgb24gc3VjY2Vzcy4KKyAgICAvLyBDYWxsZWQgZnJvbSBt
YWluIHRocmVhZCBieSBjb3JyZXNwb25kaW5nIEphdmFTY3JpcHQgbWV0aG9kcy4KKyAgICBib29s
IGNvbm5lY3QoQXVkaW9Ob2RlKiBkZXN0aW5hdGlvbiwgdW5zaWduZWQgb3V0cHV0SW5kZXggPSAw
LCB1bnNpZ25lZCBpbnB1dEluZGV4ID0gMCk7CisgICAgYm9vbCBkaXNjb25uZWN0KHVuc2lnbmVk
IG91dHB1dEluZGV4ID0gMCk7CisKKyAgICBkb3VibGUgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fc2FtcGxlUmF0ZTsgfQorCisgICAgLy8gcHJvY2Vzc0lmTmVjZXNzYXJ5KCkgaXMgY2Fs
bGVkIGJ5IG91ciBvdXRwdXQocykgd2hlbiB0aGUgcmVuZGVyaW5nIGdyYXBoIG5lZWRzIHRoaXMg
QXVkaW9Ob2RlIHRvIHByb2Nlc3MuCisgICAgLy8gVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRo
ZSBBdWRpb05vZGUgd2lsbCBvbmx5IHByb2Nlc3Mgb25jZSBwZXIgcmVuZGVyaW5nIHRpbWUgcXVh
bnR1bSBldmVuIGlmIGl0J3MgY2FsbGVkIHJlcGVhdGVkbHkuCisgICAgLy8gVGhpcyBoYW5kbGVz
IHRoZSBjYXNlIG9mICJmYW5vdXQiIHdoZXJlIGFuIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gbXVs
dGlwbGUgQXVkaW9Ob2RlIGlucHV0cy4KKyAgICAvLyBDYWxsZWQgZnJvbSBjb250ZXh0J3MgYXVk
aW8gdGhyZWFkLgorICAgIHZvaWQgcHJvY2Vzc0lmTmVjZXNzYXJ5KHNpemVfdCBmcmFtZXNUb1By
b2Nlc3MpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBoYXMgYmVlbiBt
YWRlIHRvIG9uZSBvZiBvdXIgaW5wdXRzIG9yIHRoZSBjb25uZWN0aW9uIG51bWJlciBvZiBjaGFu
bmVscyBoYXMgY2hhbmdlZC4KKyAgICAvLyBUaGlzIHBvdGVudGlhbGx5IGdpdmVzIHVzIGVub3Vn
aCBpbmZvcm1hdGlvbiB0byBwZXJmb3JtIGEgbGF6eSBpbml0aWFsaXphdGlvbiBvciwgaWYgbmVj
ZXNzYXJ5LCBhIHJlLWluaXRpYWxpemF0aW9uLgorICAgIC8vIENhbGxlZCBmcm9tIG1haW4gdGhy
ZWFkLgorICAgIHZpcnR1YWwgdm9pZCBjaGVja051bWJlck9mQ2hhbm5lbHNGb3JJbnB1dChBdWRp
b05vZGVJbnB1dCopIHsgfQorCisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBz
dGF0aWMgdm9pZCBwcmludE5vZGVDb3VudHMoKTsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAg
Ly8gSW5wdXRzIGFuZCBvdXRwdXRzIG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdGhlIEF1ZGlvTm9k
ZSBpcyBpbml0aWFsaXplZC4KKyAgICB2b2lkIGFkZElucHV0KFBhc3NPd25QdHI8QXVkaW9Ob2Rl
SW5wdXQ+KTsKKyAgICB2b2lkIGFkZE91dHB1dChQYXNzT3duUHRyPEF1ZGlvTm9kZU91dHB1dD4p
OworICAgIAorICAgIC8vIENhbGxlZCBieSBwcm9jZXNzSWZOZWNlc3NhcnkoKSB0byBjYXVzZSBh
bGwgcGFydHMgb2YgdGhlIHJlbmRlcmluZyBncmFwaCBjb25uZWN0ZWQgdG8gdXMgdG8gcHJvY2Vz
cy4KKyAgICAvLyBFYWNoIHJlbmRlcmluZyBxdWFudHVtLCB0aGUgYXVkaW8gZGF0YSBmb3IgZWFj
aCBvZiB0aGUgQXVkaW9Ob2RlJ3MgaW5wdXRzIHdpbGwgYmUgYXZhaWxhYmxlIGFmdGVyIHRoaXMg
bWV0aG9kIGlzIGNhbGxlZC4KKyAgICAvLyBDYWxsZWQgZnJvbSBjb250ZXh0J3MgYXVkaW8gdGhy
ZWFkLgorICAgIHZpcnR1YWwgdm9pZCBwdWxsSW5wdXRzKHNpemVfdCBmcmFtZXNUb1Byb2Nlc3Mp
OworCisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7CisKK3ByaXZhdGU6CisgICAgTm9kZVR5cGUg
bV90eXBlOworICAgIFJlZlB0cjxBdWRpb0NvbnRleHQ+IG1fY29udGV4dDsKKyAgICBkb3VibGUg
bV9zYW1wbGVSYXRlOworICAgIFZlY3RvcjxPd25QdHI8QXVkaW9Ob2RlSW5wdXQ+ID4gbV9pbnB1
dHM7CisgICAgVmVjdG9yPE93blB0cjxBdWRpb05vZGVPdXRwdXQ+ID4gbV9vdXRwdXRzOworCisg
ICAgZG91YmxlIG1fbGFzdFByb2Nlc3NpbmdUaW1lOworCisgICAgLy8gUmVmLWNvdW50aW5nCisg
ICAgdm9sYXRpbGUgaW50IG1fbm9ybWFsUmVmQ291bnQ7CisgICAgdm9sYXRpbGUgaW50IG1fY29u
bmVjdGlvblJlZkNvdW50OworICAgIHZvbGF0aWxlIGludCBtX2Rpc2FibGVkUmVmQ291bnQ7Cisg
ICAgCisgICAgYm9vbCBtX2lzTWFya2VkRm9yRGVsZXRpb247CisgICAgYm9vbCBtX2lzRGlzYWJs
ZWQ7CisgICAgCisjaWYgREVCVUdfQVVESU9OT0RFX1JFRkVSRU5DRVMKKyAgICBzdGF0aWMgYm9v
bCBzX2lzTm9kZUNvdW50SW5pdGlhbGl6ZWQ7CisgICAgc3RhdGljIGludCBzX25vZGVDb3VudFtO
b2RlVHlwZUVuZF07CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEF1ZGlvTm9kZV9oCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvTm9kZS5pZGwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZpc2lvbiAw
KQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb05vZGUuaWRsCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBv
ZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAg
IGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworbW9kdWxlIGF1ZGlvIHsKKyAgICBpbnRlcmZhY2UgWworICAgICAgICBDb25k
aXRpb25hbD1XRUJfQVVESU8KKyAgICBdIEF1ZGlvTm9kZSB7CisgICAgICAgIHJlYWRvbmx5IGF0
dHJpYnV0ZSBBdWRpb0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRl
IHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZJbnB1dHM7CisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0
ZSB1bnNpZ25lZCBsb25nIG51bWJlck9mT3V0cHV0czsKKworICAgICAgICBbQ3VzdG9tXSB2b2lk
IGNvbm5lY3QoaW4gQXVkaW9Ob2RlIGRlc3RpbmF0aW9uLCBpbiB1bnNpZ25lZCBsb25nIG91dHB1
dCwgaW4gdW5zaWduZWQgbG9uZyBpbnB1dCk7CisgICAgICAgIFtDdXN0b21dIHZvaWQgZGlzY29u
bmVjdChpbiB1bnNpZ25lZCBsb25nIG91dHB1dCk7CisgICAgfTsKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>