<?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>16464</bug_id>
          
          <creation_ts>2007-12-16 17:01:40 -0800</creation_ts>
          <short_desc>Modify WebCore to use win32 thread primitives</short_desc>
          <delta_ts>2007-12-18 13:52:32 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows XP</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>16428</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Brent Fulgham">bfulgham</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>64440</commentid>
    <comment_count>0</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-16 17:01:40 -0800</bug_when>
    <thetext>This Bug complements Bug #16428.  It removes the need on Windows builds to link against (and ship) the pthreads threading library.

The patches are broken into two parts.
1.  A patch to add a windows-specific thread implementation to WebCore/platforms/win.
2.  A patch to modify the config, Threading header, and build project to actually build and link against the win32 threading primitives.

The first patch should be safe to apply as it just adds a source file.  The second patch should be tested carefully before accepting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64441</commentid>
    <comment_count>1</comment_count>
      <attachid>17944</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-16 17:05:24 -0800</bug_when>
    <thetext>Created attachment 17944
Patch to add win32-based threading implementation.

This first patch just adds a new source file to the project.  It does not modify the build or change any build commands or configuration.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64442</commentid>
    <comment_count>2</comment_count>
      <attachid>17945</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-16 17:09:42 -0800</bug_when>
    <thetext>Created attachment 17945
Patch to add win32-based threading implementation.

This patch just adds a single file to the platform/win directory that implements a win32-based threading implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64446</commentid>
    <comment_count>3</comment_count>
      <attachid>17946</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-16 17:23:10 -0800</bug_when>
    <thetext>Created attachment 17946
Patch to add win32-based threading implementation (modifications to build system)

This second patch modifies the build environment to switch to the native win32 threading primitives.  It seems to work well when testing with database-based pages (such as http://webkit.org/misc/DatabaseExample.html).  This patch should be carefully reviewed!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64457</commentid>
    <comment_count>4</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-12-16 18:31:10 -0800</bug_when>
    <thetext>I&apos;m a little concerned at how many thread operations grab a global mutex. But I guess this is carried over from the original.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64471</commentid>
    <comment_count>5</comment_count>
      <attachid>17950</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-16 20:40:42 -0800</bug_when>
    <thetext>Created attachment 17950
Patch to add win32-based threading implementation (includes changes to build system).

Revised patches based on first round of comments from reviewers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64521</commentid>
    <comment_count>6</comment_count>
      <attachid>17950</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-12-17 07:42:43 -0800</bug_when>
    <thetext>Comment on attachment 17950
Patch to add win32-based threading implementation (includes changes to build system).

Looks good.

I would have expected the Mutex.cpp file to be named MutexWin.cpp. We&apos;ve been using both filenames and directory names to distinguish these platform-specific files.

These types with _t in their names aren&apos;t needed. It can just be:

    struct PlatformMutex { };

Rather than:

    struct PlatformMutex_t { };
    typedef PlatformMutex_t PlatformMutex.

And in fact the extra types don&apos;t do any good.

Also, we don&apos;t normally format members with their names lined up at tab stops.

 53     // Warning:  pthread_mutex_trylock will return an error
 54     // if the lock is already owned by the current thread.  Win32
 55     // threads make no such complaint.

This comment will be confusing in the future. At the moment you are writing this, pthreads seems relevant, but later people will wonder why you mention it. I think you need to say more clearly that this is modeled after the pthread_mutex_trylock semantic, and why it is.

 68         return true;
 69     } else if (result == 0)   // ... failed

We normally don&apos;t do else after return. Further, there&apos;s no need for the else to check the opposite of the if condition. The style we normally use is &quot;early exit&quot;. If you straighten out the logic here there won&apos;t be an unreached code that uses ASSERT(false). By the way, when it does arise we write that as ASSERT_NOT_REACHED().

If you&apos;re going to quote the Boost license, it needs to be at the top of the file with the other license, not inside the contents.

 70 static const long MAX_SEMAPHORE_COUNT = ((int) ((~0u) &gt;&gt; 1));

We normally do not use the ALL_CAPS form for things that are not macros. Also, since this constant is a long, it doesn&apos;t really make sense that it uses unsigned and int in its declaration. It should also use static_cast rather than C-style cast and fewer extraneous parentheses and it would be easier to read.

 102     // Enter the wait state...

I&apos;m not a big fan of &quot;...&quot; in cases like this. A normal period would do as well.

3232 #include &quot;Logging.h&quot;
3333 #include &quot;Page.h&quot;
 34 
 35 #include &lt;wtf/HashMap.h&gt;
3436 #include &lt;windows.h&gt;
 37 #include &lt;errno.h&gt;

We sort includes alphabetically and we don&apos;t put spaces between the quoted and angle bracket ones.

 66 static ThreadIdentifier identifierByThreadHandle(const HANDLE threadHandle)

The const here doesn&apos;t mean anything useful. It just says that this argument isn&apos;t modified inside the function and there&apos;s no reason for this particular function to have it.

 72         const HANDLE currHandle = i-&gt;second;

The const here also has limited value.

 74             return (ThreadIdentifier)i-&gt;first;

This should use static_cast. But I&apos;m surprised a cast is needed at all. This may be a problem under 64-bit.

 88     MutexLocker locker(threadMapMutex());
 89 
 90     ASSERT(threadMap().contains(id));
 91     
 92     threadMap().remove(id);

Would read better without the blank lines.

 101     if (0 == threadHandle) {

We use &quot;!threadHandle&quot; for cases like this.

 106     threadID = (ThreadIdentifier)threadIdentifier;

And static_cast here.

 143     return (ThreadIdentifier)::GetCurrentThreadId ();

And here, and no space before the () in the function call.

These points of style are relatively minor, but review- so we can get them fixed. The most important one is probably the extra code paths in Mutex::tryLock.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64544</commentid>
    <comment_count>7</comment_count>
      <attachid>17965</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-17 10:07:33 -0800</bug_when>
    <thetext>Created attachment 17965
Updated based on review.

Combined patch to move WebCore from pthreads emulation library to native Win32 threading primitives.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64545</commentid>
    <comment_count>8</comment_count>
      <attachid>17965</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-17 10:07:57 -0800</bug_when>
    <thetext>Comment on attachment 17965
Updated based on review.

Updated based on darin&apos;s review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64547</commentid>
    <comment_count>9</comment_count>
      <attachid>17965</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-12-17 10:24:33 -0800</bug_when>
    <thetext>Comment on attachment 17965
Updated based on review.

 71 static const long MaxSemaphoreCount = static_cast&lt;long&gt;((~0u) &gt;&gt; 1);

I think it needs to be ~0UL rather than ~0U. And also there is no need for parentheses there -- the precedence of the ~ operator is tighter than the &gt;&gt; operator, and I think it&apos;s easier to read as is.

Patch has some tabs in it. We can&apos;t check in patches with tabs.

 115     unsigned was_gone=0;

Unused local variable here.

Otherwise looks good. r=me, although I&apos;m a little nervous about the level of testing that will be required to vet this on Windows with Safari.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64556</commentid>
    <comment_count>10</comment_count>
      <attachid>17967</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2007-12-17 13:14:57 -0800</bug_when>
    <thetext>Created attachment 17967
Patch to add win32-based threading implementation (includes changes to build system).

Revised again to remove unused local variable, change &quot;~0u&quot; to &quot;~0ul&quot;, and to remove tab characters.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64558</commentid>
    <comment_count>11</comment_count>
      <attachid>17967</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-12-17 13:25:29 -0800</bug_when>
    <thetext>Comment on attachment 17967
Patch to add win32-based threading implementation (includes changes to build system).

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>64666</commentid>
    <comment_count>12</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-12-18 13:52:32 -0800</bug_when>
    <thetext>Landed in r28835.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17944</attachid>
            <date>2007-12-16 17:05:24 -0800</date>
            <delta_ts>2007-12-16 17:09:42 -0800</delta_ts>
            <desc>Patch to add win32-based threading implementation.</desc>
            <filename>winthreads.patch</filename>
            <type>text/plain</type>
            <size>14836</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI4Nzgx
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzIgQEAKKzIwMDctMTIt
MTYgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBB
RERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vVGhyZWFkaW5nV2luLmNw
cDoKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vd2ludGhyZWFkc3VwcG9ydC5jcHA6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6dGhyZWFkTWFwTXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6dGhy
ZWFkTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OnN0b3JlVGhyZWFkSGFuZGxlQnlJZGVudGlmaWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OmlkZW50aWZpZXJCeVRocmVhZEhhbmRsZSk6CisgICAgICAg
IChXZWJDb3JlOjp0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6
OmNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3JlOjpjcmVh
dGVUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6d2FpdEZvclRocmVhZENvbXBsZXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6ZGV0YWNoVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OmN1cnJl
bnRUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6TXV0ZXg6Ok11dGV4KToKKyAgICAgICAgKFdl
YkNvcmU6Ok11dGV4Ojp+TXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6TXV0ZXg6OmxvY2spOgor
ICAgICAgICAoV2ViQ29yZTo6TXV0ZXg6OnRyeUxvY2spOgorICAgICAgICAoV2ViQ29yZTo6TXV0
ZXg6OnVubG9jayk6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRDb25kaXRpb246OlRocmVhZENv
bmRpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRDb25kaXRpb246On5UaHJlYWRDb25k
aXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkQ29uZGl0aW9uOjp3YWl0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlRocmVhZENvbmRpdGlvbjo6c2lnbmFsKToKKyAgICAgICAgKFdlYkNvcmU6
OlRocmVhZENvbmRpdGlvbjo6YnJvYWRjYXN0KToKKwogMjAwNy0xMi0xNiAgU2FtIFdlaW5pZyAg
PHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluLgogI2lmIFBMQVRG
T1JNKE1BQykKSW5kZXg6IHBsYXRmb3JtL3dpbi93aW50aHJlYWRzdXBwb3J0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBwbGF0Zm9ybS93aW4vd2ludGhyZWFkc3VwcG9ydC5jcHAJKHJldmlzaW9uIDApCisr
KyBwbGF0Zm9ybS93aW4vd2ludGhyZWFkc3VwcG9ydC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMzg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRocmVhZGluZy5oIgor
CisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKKyNpbmNs
dWRlIDxlcnJuby5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBNdXRleCYgdGhy
ZWFkTWFwTXV0ZXgoKQoreworICAgIHN0YXRpYyBNdXRleCBtdXRleDsKKyAgICByZXR1cm4gbXV0
ZXg7Cit9CisKK3N0YXRpYyBIYXNoTWFwPERXT1JELCBIQU5ETEU+JiB0aHJlYWRNYXAoKQorewor
ICAgIHN0YXRpYyBIYXNoTWFwPERXT1JELCBIQU5ETEU+IG1hcDsKKyAgICByZXR1cm4gbWFwOwor
fQorCitzdGF0aWMgdm9pZCBzdG9yZVRocmVhZEhhbmRsZUJ5SWRlbnRpZmllcihEV09SRCB0aHJl
YWRJRCwgSEFORExFIHRocmVhZEhhbmRsZSkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrZXIodGhy
ZWFkTWFwTXV0ZXgoKSk7CisgICAgdGhyZWFkTWFwKCkuYWRkKHRocmVhZElELCB0aHJlYWRIYW5k
bGUpOworfQorCitzdGF0aWMgVGhyZWFkSWRlbnRpZmllciBpZGVudGlmaWVyQnlUaHJlYWRIYW5k
bGUoY29uc3QgSEFORExFIHRocmVhZEhhbmRsZSkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrZXIo
dGhyZWFkTWFwTXV0ZXgoKSk7CisKKyAgICBIYXNoTWFwPERXT1JELCBIQU5ETEU+OjppdGVyYXRv
ciBpID0gdGhyZWFkTWFwKCkuYmVnaW4oKTsKKyAgICBmb3IgKDsgaSAhPSB0aHJlYWRNYXAoKS5l
bmQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEhBTkRMRSBjdXJySGFuZGxlID0gaS0+c2Vjb25k
OworICAgICAgICBpZiAoY3VyckhhbmRsZSA9PSB0aHJlYWRIYW5kbGUpCisgICAgICAgICAgICBy
ZXR1cm4gKFRocmVhZElkZW50aWZpZXIpaS0+Zmlyc3Q7CisgICAgfQorCisgICAgcmV0dXJuIDA7
Cit9CisKK3N0YXRpYyBIQU5ETEUgdGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcihUaHJlYWRJZGVu
dGlmaWVyIGlkKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJlYWRNYXBNdXRleCgpKTsK
KyAgICByZXR1cm4gdGhyZWFkTWFwKCkuZ2V0KGlkKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJU
aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKFRocmVhZElkZW50aWZpZXIgaWQpCit7CisgICAgTXV0
ZXhMb2NrZXIgbG9ja2VyKHRocmVhZE1hcE11dGV4KCkpOworCisgICAgQVNTRVJUKHRocmVhZE1h
cCgpLmNvbnRhaW5zKGlkKSk7CisgICAgCisgICAgdGhyZWFkTWFwKCkucmVtb3ZlKGlkKTsKK30K
KworVGhyZWFkSWRlbnRpZmllciBjcmVhdGVUaHJlYWQoVGhyZWFkRnVuY3Rpb24gZW50cnlQb2lu
dCwgdm9pZCogZGF0YSkKK3sKKyAgICBEV09SRCB0aHJlYWRJZGVudGlmaWVyID0gMDsKKyAgICBU
aHJlYWRJZGVudGlmaWVyIHRocmVhZElEID0gMDsKKyAgICBIQU5ETEUgaEV2ZW50ID0gOjpDcmVh
dGVFdmVudCgwLCBGQUxTRSwgRkFMU0UsIDApOworICAgIEhBTkRMRSB0aHJlYWRIYW5kbGUgPSA6
OkNyZWF0ZVRocmVhZCgwLCAwLCAoTFBUSFJFQURfU1RBUlRfUk9VVElORSllbnRyeVBvaW50LCBk
YXRhLCAwLCAmdGhyZWFkSWRlbnRpZmllcik7CisgICAgaWYgKDAgPT0gdGhyZWFkSGFuZGxlKSB7
CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQgYXQgZW50cnkgcG9p
bnQgJXAgd2l0aCBkYXRhICVwIiwgZW50cnlQb2ludCwgZGF0YSk7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKworICAgIHRocmVhZElEID0gKFRocmVhZElkZW50aWZpZXIpdGhyZWFkSWRlbnRp
ZmllcjsKKyAgICBzdG9yZVRocmVhZEhhbmRsZUJ5SWRlbnRpZmllcih0aHJlYWRJZGVudGlmaWVy
LCB0aHJlYWRIYW5kbGUpOworCisgICAgTE9HKFRocmVhZGluZywgIkNyZWF0ZWQgdGhyZWFkIHdp
dGggdGhyZWFkIGlkICV1IiwgdGhyZWFkSUQpOworICAgIHJldHVybiB0aHJlYWRJRDsKK30KKwor
aW50IHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKFRocmVhZElkZW50aWZpZXIgdGhyZWFkSUQsIHZv
aWQqKiByZXN1bHQpCit7CisgICAgQVNTRVJUKHRocmVhZElEKTsKKyAgICAKKyAgICBIQU5ETEUg
dGhyZWFkSGFuZGxlID0gdGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcih0aHJlYWRJRCk7CisgICAg
aWYgKCF0aHJlYWRIYW5kbGUpCisgICAgICAgIExPR19FUlJPUigiVGhyZWFkSWRlbnRpZmllciAl
dSBkaWQgbm90IGNvcnJlc3BvbmQgdG8gYW4gYWN0aXZlIHRocmVhZCB3aGVuIHRyeWluZyB0byBx
dWl0IiwgdGhyZWFkSUQpOworIAorICAgIERXT1JEIGpvaW5SZXN1bHQgPSA6OldhaXRGb3JTaW5n
bGVPYmplY3QodGhyZWFkSGFuZGxlLCBJTkZJTklURSk7CisgICAgaWYgKGpvaW5SZXN1bHQgPT0g
V0FJVF9GQUlMRUQpCisgICAgICAgIExPR19FUlJPUigiVGhyZWFkSWRlbnRpZmllciAldSB3YXMg
Zm91bmQgdG8gYmUgZGVhZGxvY2tlZCB0cnlpbmcgdG8gcXVpdCIsIHRocmVhZElEKTsKKworICAg
IDo6Q2xvc2VIYW5kbGUodGhyZWFkSGFuZGxlKTsKKyAgICBjbGVhclRocmVhZEhhbmRsZUZvcklk
ZW50aWZpZXIodGhyZWFkSUQpOworCisgICAgcmV0dXJuIGpvaW5SZXN1bHQ7Cit9CisKK3ZvaWQg
ZGV0YWNoVGhyZWFkKFRocmVhZElkZW50aWZpZXIgdGhyZWFkSUQpCit7CisgICAgQVNTRVJUKHRo
cmVhZElEKTsKKyAgICAKKyAgICBIQU5ETEUgdGhyZWFkSGFuZGxlID0gdGhyZWFkSGFuZGxlRm9y
SWRlbnRpZmllcih0aHJlYWRJRCk7CisgICAgaWYgKHRocmVhZEhhbmRsZSkKKyAgICAgICAgOjpD
bG9zZUhhbmRsZSh0aHJlYWRIYW5kbGUpOworICAgIGNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRp
Zmllcih0aHJlYWRJRCk7Cit9CisKK1RocmVhZElkZW50aWZpZXIgY3VycmVudFRocmVhZCgpCit7
CisgICAgcmV0dXJuIChUaHJlYWRJZGVudGlmaWVyKTo6R2V0Q3VycmVudFRocmVhZElkICgpOwor
fQorCitNdXRleDo6TXV0ZXgoKQoreworICAgIG1fbXV0ZXgubV9yZWN1cnNpb25Db3VudCA9IDA7
CisgICAgOjpJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZtX211dGV4Lm1faW50ZXJuYWxNdXRl
eCk7Cit9CisKK011dGV4Ojp+TXV0ZXgoKQoreworICAgIDo6RGVsZXRlQ3JpdGljYWxTZWN0aW9u
KCZtX211dGV4Lm1faW50ZXJuYWxNdXRleCk7Cit9CisKK3ZvaWQgTXV0ZXg6OmxvY2soKQorewor
ICAgIDo6RW50ZXJDcml0aWNhbFNlY3Rpb24oJm1fbXV0ZXgubV9pbnRlcm5hbE11dGV4KTsKKyAg
ICArK21fbXV0ZXgubV9yZWN1cnNpb25Db3VudDsKK30KKyAgICAKK2Jvb2wgTXV0ZXg6OnRyeUxv
Y2soKQoreworICAgIC8vIFdhcm5pbmc6ICBwdGhyZWFkX211dGV4X3RyeWxvY2sgd2lsbCByZXR1
cm4gYW4gZXJyb3IKKyAgICAvLyBpZiB0aGUgbG9jayBpcyBhbHJlYWR5IG93bmVkIGJ5IHRoZSBj
dXJyZW50IHRocmVhZC4gIFdpbjMyCisgICAgLy8gdGhyZWFkcyBtYWtlIG5vIHN1Y2ggY29tcGxh
aW50LgorICAgIERXT1JEIHJlc3VsdCA9IDo6VHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24oJm1fbXV0
ZXgubV9pbnRlcm5hbE11dGV4KTsKKyAgICAKKyAgICBpZiAocmVzdWx0ICE9IDApIHsgICAgICAg
Ly8gV2UgZ290IHRoZSBsb2NrCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGFscmVhZHkgaGFk
IHRoZSBsb2NrLCB3ZSBtdXN0IHVubG9jayBhbmQKKyAgICAgICAgLy8gcmV0dXJuIGZhbHNlIHNv
IHRoYXQgd2UgbWltaWMgdGhlIGJlaGF2aW9yIG9mIFBPU0lYJ3MKKyAgICAgICAgLy8gcHRocmVh
ZF9tdXRleF90cnlsb2NrOgorICAgICAgICBpZiAobV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50ID4g
MCkgeworICAgICAgICAgICAgOjpMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbV9tdXRleC5tX2ludGVy
bmFsTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAg
ICAgKyttX211dGV4Lm1fcmVjdXJzaW9uQ291bnQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0gZWxzZSBpZiAocmVzdWx0ID09IDApICAgLy8gLi4uIGZhaWxlZAorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBBU1NFUlQoZmFsc2UpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9p
ZCBNdXRleDo6dW5sb2NrKCkKK3sKKyAgICAtLW1fbXV0ZXgubV9yZWN1cnNpb25Db3VudDsKKyAg
ICA6OkxlYXZlQ3JpdGljYWxTZWN0aW9uKCZtX211dGV4Lm1faW50ZXJuYWxNdXRleCk7Cit9CisK
Ky8vIE5vdGU6ICBUaGUgaW1wbGVtZW50YXRpb24gb2YgY29uZGl0aW9uIHZhcmlhYmxlcyB1bmRl
ciB0aGUgV2luZG93cworLy8gcGxhZm9ybSB3YXMgYmFzZWQgb24gdGhhdCBvZiB0aGUgZXhjZWxs
ZW50IEJPT1NUIEMrKyBsaWJyYXJ5LiAgSXQKKy8vIGhhcyBiZWVuIHJld3JpdHRlbiB0byBmaXQg
aW4gd2l0aCB0aGUgV2ViS2l0IGFyY2hpdGVjdHVyZSBhbmQgdG8KKy8vIHVzZSBpdHMgY29kaW5n
IGNvbnZlbnRpb25zLgorLy8KKy8vIFRoZSBCb29zdCBsaWNlbnNlIGlzIHZpcnR1YWxseSBpZGVu
dGljYWwgdG8gdGhlIEFwcGxlIHZhcmlhdGlvbiBhdCB0aGUKKy8vIHRvcCBvZiB0aGlzIGZpbGUs
IGJ1dCBpcyBpbmNsdWRlZCBoZXJlIGZvciBjb21wbGV0ZW5lc3M6CisvLworLy8gQm9vc3QgU29m
dHdhcmUgTGljZW5zZSAtIFZlcnNpb24gMS4wIC0gQXVndXN0IDE3dGgsIDIwMDMKKy8vCisvLyBQ
ZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNv
biBvciBvcmdhbml6YXRpb24KKy8vIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3YXJlIGFu
ZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmVkIGJ5CisvLyB0aGlzIGxpY2Vuc2Ug
KHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwK
Ky8vIGV4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIGRl
cml2YXRpdmUgd29ya3Mgb2YgdGhlCisvLyBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCB0aGlyZC1w
YXJ0aWVzIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0bworLy8gZG8gc28sIGFs
bCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmc6CisvLworLy8gVGhlIGNvcHlyaWdodCBub3RpY2Vz
IGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKKy8v
IHRoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIsCisvLyBtdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhl
IFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKKy8vIGFsbCBkZXJpdmF0aXZlIHdv
cmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKKy8v
IHdvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVj
dCBjb2RlIGdlbmVyYXRlZCBieQorLy8gYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgorLy8K
Ky8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9G
IEFOWSBLSU5ELCBFWFBSRVNTIE9SCisvLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1J
VEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKy8vIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8g
RVZFTlQKKy8vIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBBTllPTkUgRElTVFJJQlVU
SU5HIFRIRSBTT0ZUV0FSRSBCRSBMSUFCTEUKKy8vIEZPUiBBTlkgREFNQUdFUyBPUiBPVEhFUiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorLy8gQVJJ
U0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBU
SEUgVVNFIE9SIE9USEVSCisvLyBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK3N0YXRpYyBj
b25zdCBsb25nIE1BWF9TRU1BUEhPUkVfQ09VTlQgPSAoKGludCkgKCh+MHUpID4+IDEpKTsKKwor
VGhyZWFkQ29uZGl0aW9uOjpUaHJlYWRDb25kaXRpb24oKQoreworICAgIG1fY29uZGl0aW9uLm1f
dGltZWRPdXQgPSAwOworICAgIG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9IDA7CisgICAgbV9jb25k
aXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbCA9IDA7CisgICAgbV9jb25kaXRpb24ubV9nYXRlID0g
OjpDcmVhdGVTZW1hcGhvcmUoMCwgMSwgMSwgMCk7CisgICAgbV9jb25kaXRpb24ubV9xdWV1ZSA9
IDo6Q3JlYXRlU2VtYXBob3JlKDAsIDAsIE1BWF9TRU1BUEhPUkVfQ09VTlQsIDApOworICAgIG1f
Y29uZGl0aW9uLm1fbXV0ZXggPSA6OkNyZWF0ZU11dGV4KDAsIDAsIDApOworCisgICAgaWYgKCFt
X2NvbmRpdGlvbi5tX2dhdGUgfHwgIW1fY29uZGl0aW9uLm1fcXVldWUgfHwgIW1fY29uZGl0aW9u
Lm1fbXV0ZXgpIHsKKyAgICAgICAgaWYgKG1fY29uZGl0aW9uLm1fZ2F0ZSkKKyAgICAgICAgICAg
IDo6Q2xvc2VIYW5kbGUobV9jb25kaXRpb24ubV9nYXRlKTsKKyAgICAgICAgaWYgKG1fY29uZGl0
aW9uLm1fcXVldWUpCisJICAgIDo6Q2xvc2VIYW5kbGUobV9jb25kaXRpb24ubV9xdWV1ZSk7Cisg
ICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX211dGV4KQorCSAgICA6OkNsb3NlSGFuZGxlKG1fY29u
ZGl0aW9uLm1fbXV0ZXgpOworICAgIH0KK30KKworVGhyZWFkQ29uZGl0aW9uOjp+VGhyZWFkQ29u
ZGl0aW9uKCkKK3sKKyAgICA6OkNsb3NlSGFuZGxlKG1fY29uZGl0aW9uLm1fZ2F0ZSk7CisgICAg
OjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX3F1ZXVlKTsKKyAgICA6OkNsb3NlSGFuZGxlKG1f
Y29uZGl0aW9uLm1fbXV0ZXgpOworfQorICAgIAordm9pZCBUaHJlYWRDb25kaXRpb246OndhaXQo
TXV0ZXgmIG11dGV4KQoreworICAgIFBsYXRmb3JtTXV0ZXgmIGNzID0gbXV0ZXguaW1wbCgpOwor
CisgICAgLy8gRW50ZXIgdGhlIHdhaXQgc3RhdGUuLi4KKyAgICBEV09SRCByZXMgPSA6OldhaXRG
b3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9nYXRlLCBJTkZJTklURSk7CisgICAgQVNTRVJU
KHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKyAgICArK21fY29uZGl0aW9uLm1fYmxvY2tlZDsKKyAg
ICByZXMgPSA6OlJlbGVhc2VTZW1hcGhvcmUobV9jb25kaXRpb24ubV9nYXRlLCAxLCAwKTsKKyAg
ICBBU1NFUlQocmVzKTsKKworICAgIDo6TGVhdmVDcml0aWNhbFNlY3Rpb24oJmNzLm1faW50ZXJu
YWxNdXRleCk7CisKKyAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24u
bV9xdWV1ZSwgSU5GSU5JVEUpOworICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisK
KyAgICB1bnNpZ25lZCB3YXNfZ29uZT0wOworCisgICAgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2Jq
ZWN0KG1fY29uZGl0aW9uLm1fbXV0ZXgsIElORklOSVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdB
SVRfT0JKRUNUXzApOworICAgIHNpemVfdCB3YXNXYWl0aW5nID0gbV9jb25kaXRpb24ubV93YWl0
aW5nRm9yUmVtb3ZhbDsKKyAgICBzaXplX3Qgd2FzVGltZWRPdXQgPSBtX2NvbmRpdGlvbi5tX3Rp
bWVkT3V0OworICAgIGlmICh3YXNXYWl0aW5nICE9IDApIHsKKyAgICAgICAgaWYgKC0tbV9jb25k
aXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbCA9PSAwKSB7CisgICAgICAgICAgICBpZiAobV9jb25k
aXRpb24ubV9ibG9ja2VkICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXMgPSA6OlJlbGVhc2VT
ZW1hcGhvcmUobV9jb25kaXRpb24ubV9nYXRlLCAxLCAwKTsgIC8vIG9wZW4gbV9nYXRlCisgICAg
ICAgICAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgICAgICAgICAgICAgd2FzV2FpdGluZyA9IDA7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtX2NvbmRpdGlvbi5tX3RpbWVk
T3V0ICE9IDApCisgICAgICAgICAgICAgICAgbV9jb25kaXRpb24ubV90aW1lZE91dCA9IDA7Cisg
ICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCsrbV9jb25kaXRpb24ubV90aW1lZE91dCA9PSAoKHN0
ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgpKCkgLyAyKSkgeworICAgICAgICAvLyB0
aW1lb3V0IG9jY3VyZWQsIG5vcm1hbGl6ZSB0aGUgbV9jb25kaXRpb24ubV90aW1lZE91dCBjb3Vu
dAorICAgICAgICAvLyB0aGlzIG1heSBvY2N1ciBpZiBtYW55IGNhbGxzIHRvIHdhaXQgd2l0aCBh
IHRpbWVvdXQgYXJlIG1hZGUgYW5kCisgICAgICAgIC8vIG5vIGNhbGwgdG8gbm90aWZ5XyogaXMg
bWFkZQorICAgICAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9n
YXRlLCBJTkZJTklURSk7CisgICAgICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7Cisg
ICAgICAgIG1fY29uZGl0aW9uLm1fYmxvY2tlZCAtPSBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0Owor
ICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1hcGhvcmUobV9jb25kaXRpb24ubV9nYXRlLCAxLCAw
KTsKKyAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgICAgIG1fY29uZGl0aW9uLm1fdGltZWRPdXQg
PSAwOworICAgIH0KKyAgICByZXMgPSA6OlJlbGVhc2VNdXRleChtX2NvbmRpdGlvbi5tX211dGV4
KTsKKyAgICBBU1NFUlQocmVzKTsKKworICAgIGlmICh3YXNXYWl0aW5nID09IDEpIHsKKyAgICAg
ICAgZm9yICgvKiovIDsgd2FzVGltZWRPdXQ7IC0td2FzVGltZWRPdXQpIHsKKyAgICAgICAgICAg
IC8vIGJldHRlciBub3cgdGhhbiBzcHVyaW91cyBsYXRlcgorICAgICAgICAgICAgcmVzID0gOjpX
YWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0aW9uLm1fcXVldWUsIElORklOSVRFKTsKKyAgICAg
ICAgICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisgICAgICAgIH0KKyAgICAgICAg
cmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0aW9uLm1fZ2F0ZSwgMSwgMCk7CisgICAg
ICAgIEFTU0VSVChyZXMpOworICAgIH0KKworICAgIDo6RW50ZXJDcml0aWNhbFNlY3Rpb24gKCZj
cy5tX2ludGVybmFsTXV0ZXgpOworfQorCit2b2lkIFRocmVhZENvbmRpdGlvbjo6c2lnbmFsKCkK
K3sKKyAgICB1bnNpZ25lZCBzaWduYWxzID0gMDsKKworICAgIERXT1JEIHJlcyA9IDo6V2FpdEZv
clNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX211dGV4LCBJTkZJTklURSk7CisgICAgQVNTRVJU
KHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKworICAgIGlmIChtX2NvbmRpdGlvbi5tX3dhaXRpbmdG
b3JSZW1vdmFsICE9IDApIHsgLy8gdGhlIG1fZ2F0ZSBpcyBhbHJlYWR5IGNsb3NlZAorICAgICAg
ICBpZiAobV9jb25kaXRpb24ubV9ibG9ja2VkID09IDApIHsKKyAgICAgICAgICAgIHJlcyA9IDo6
UmVsZWFzZU11dGV4KG1fY29uZGl0aW9uLm1fbXV0ZXgpOworICAgICAgICAgICAgQVNTRVJUKHJl
cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICArK21fY29uZGl0
aW9uLm1fd2FpdGluZ0ZvclJlbW92YWw7CisgICAgICAgIC0tbV9jb25kaXRpb24ubV9ibG9ja2Vk
OworCisgICAgICAgIHNpZ25hbHMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IDo6
V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX2dhdGUsIElORklOSVRFKTsKKyAgICAg
ICAgQVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKyAgICAgICAgaWYgKG1fY29uZGl0aW9u
Lm1fYmxvY2tlZCA+IG1fY29uZGl0aW9uLm1fdGltZWRPdXQpIHsKKyAgICAgICAgICAgIGlmICht
X2NvbmRpdGlvbi5tX3RpbWVkT3V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX2NvbmRpdGlv
bi5tX2Jsb2NrZWQgLT0gbV9jb25kaXRpb24ubV90aW1lZE91dDsKKyAgICAgICAgICAgICAgICBt
X2NvbmRpdGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNp
Z25hbHMgPSBtX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFsID0gMTsKKyAgICAgICAgICAg
IC0tbV9jb25kaXRpb24ubV9ibG9ja2VkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
cmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0aW9uLm1fZ2F0ZSwgMSwgMCk7CisgICAg
ICAgICAgICBBU1NFUlQocmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9OjpSZWxl
YXNlTXV0ZXgobV9jb25kaXRpb24ubV9tdXRleCk7CisgICAgQVNTRVJUKHJlcyk7CisKKyAgICBp
ZiAoc2lnbmFscykgeworICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1hcGhvcmUobV9jb25kaXRp
b24ubV9xdWV1ZSwgc2lnbmFscywgMCk7CisgICAgICAgIEFTU0VSVChyZXMpOworICAgIH0KK30K
Kwordm9pZCBUaHJlYWRDb25kaXRpb246OmJyb2FkY2FzdCgpCit7CisgICAgdW5zaWduZWQgc2ln
bmFscyA9IDA7CisKKyAgICBXT1JEIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRp
dGlvbi5tX211dGV4LCBJTkZJTklURSk7CisgICAgQVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8w
KTsKKworICAgIGlmIChtX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFsICE9IDApIHsgLy8g
dGhlIG1fZ2F0ZSBpcyBhbHJlYWR5IGNsb3NlZAorICAgICAgICBpZiAobV9jb25kaXRpb24ubV9i
bG9ja2VkID09IDApIHsKKyAgICAgICAgICAgIHJlcyA9IDo6UmVsZWFzZU11dGV4KG1fY29uZGl0
aW9uLm1fbXV0ZXgpOworICAgICAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKworICAgICAgICBtX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFs
ICs9IChzaWduYWxzID0gbV9jb25kaXRpb24ubV9ibG9ja2VkKTsKKyAgICAgICAgbV9jb25kaXRp
b24ubV9ibG9ja2VkID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSA6OldhaXRGb3JT
aW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9nYXRlLCBJTkZJTklURSk7CisgICAgICAgIEFTU0VS
VChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX2Jsb2Nr
ZWQgPiBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0KSB7CisgICAgICAgICAgICBpZiAobV9jb25kaXRp
b24ubV90aW1lZE91dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9jb25kaXRpb24ubV9ibG9j
a2VkIC09IG1fY29uZGl0aW9uLm1fdGltZWRPdXQ7CisgICAgICAgICAgICAgICAgbV9jb25kaXRp
b24ubV90aW1lZE91dCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaWduYWxzID0g
bV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbCA9IG1fY29uZGl0aW9uLm1fYmxvY2tlZDsK
KyAgICAgICAgICAgIG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9IDA7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1hcGhvcmUobV9jb25kaXRpb24ubV9nYXRl
LCAxLCAwKTsKKyAgICAgICAgICAgIEFTU0VSVChyZXMpOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmVzID0gOjpSZWxlYXNlTXV0ZXgobV9jb25kaXRpb24ubV9tdXRleCk7CisgICAgQVNTRVJU
KHJlcyk7CisKKyAgICBpZiAoc2lnbmFscykgeworICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1h
cGhvcmUobV9jb25kaXRpb24ubV9xdWV1ZSwgc2lnbmFscywgMCk7CisgICAgICAgIEFTU0VSVChy
ZXMpOworICAgIH0KK30KKy8vIEVuZCBCb29zdC1yZWxhdGVkIGxvZ2ljCisgICAgCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17945</attachid>
            <date>2007-12-16 17:09:42 -0800</date>
            <delta_ts>2007-12-16 20:40:42 -0800</delta_ts>
            <desc>Patch to add win32-based threading implementation.</desc>
            <filename>winthreads.patch</filename>
            <type>text/plain</type>
            <size>14817</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI4Nzgx
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzIgQEAKKzIwMDctMTIt
MTYgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBB
RERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vVGhyZWFkaW5nV2luLmNw
cDoKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vd2ludGhyZWFkc3VwcG9ydC5jcHA6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6dGhyZWFkTWFwTXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6dGhy
ZWFkTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OnN0b3JlVGhyZWFkSGFuZGxlQnlJZGVudGlmaWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OmlkZW50aWZpZXJCeVRocmVhZEhhbmRsZSk6CisgICAgICAg
IChXZWJDb3JlOjp0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6
OmNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3JlOjpjcmVh
dGVUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6d2FpdEZvclRocmVhZENvbXBsZXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6ZGV0YWNoVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OmN1cnJl
bnRUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6TXV0ZXg6Ok11dGV4KToKKyAgICAgICAgKFdl
YkNvcmU6Ok11dGV4Ojp+TXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6TXV0ZXg6OmxvY2spOgor
ICAgICAgICAoV2ViQ29yZTo6TXV0ZXg6OnRyeUxvY2spOgorICAgICAgICAoV2ViQ29yZTo6TXV0
ZXg6OnVubG9jayk6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRDb25kaXRpb246OlRocmVhZENv
bmRpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRDb25kaXRpb246On5UaHJlYWRDb25k
aXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkQ29uZGl0aW9uOjp3YWl0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlRocmVhZENvbmRpdGlvbjo6c2lnbmFsKToKKyAgICAgICAgKFdlYkNvcmU6
OlRocmVhZENvbmRpdGlvbjo6YnJvYWRjYXN0KToKKwogMjAwNy0xMi0xNiAgU2FtIFdlaW5pZyAg
PHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluLgpJbmRleDogcGxh
dGZvcm0vd2luL3dpbnRocmVhZHN1cHBvcnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL3dp
bi93aW50aHJlYWRzdXBwb3J0LmNwcAkocmV2aXNpb24gMCkKKysrIHBsYXRmb3JtL3dpbi93aW50
aHJlYWRzdXBwb3J0LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwg
SW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAg
ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGhyZWFkaW5nLmgiCisKKyNpbmNsdWRlICJMb2dnaW5n
LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIE11dGV4JiB0aHJlYWRNYXBNdXRleCgpCit7Cisg
ICAgc3RhdGljIE11dGV4IG11dGV4OworICAgIHJldHVybiBtdXRleDsKK30KKworc3RhdGljIEhh
c2hNYXA8RFdPUkQsIEhBTkRMRT4mIHRocmVhZE1hcCgpCit7CisgICAgc3RhdGljIEhhc2hNYXA8
RFdPUkQsIEhBTkRMRT4gbWFwOworICAgIHJldHVybiBtYXA7Cit9CisKK3N0YXRpYyB2b2lkIHN0
b3JlVGhyZWFkSGFuZGxlQnlJZGVudGlmaWVyKERXT1JEIHRocmVhZElELCBIQU5ETEUgdGhyZWFk
SGFuZGxlKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJlYWRNYXBNdXRleCgpKTsKKyAg
ICB0aHJlYWRNYXAoKS5hZGQodGhyZWFkSUQsIHRocmVhZEhhbmRsZSk7Cit9CisKK3N0YXRpYyBU
aHJlYWRJZGVudGlmaWVyIGlkZW50aWZpZXJCeVRocmVhZEhhbmRsZShjb25zdCBIQU5ETEUgdGhy
ZWFkSGFuZGxlKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJlYWRNYXBNdXRleCgpKTsK
KworICAgIEhhc2hNYXA8RFdPUkQsIEhBTkRMRT46Oml0ZXJhdG9yIGkgPSB0aHJlYWRNYXAoKS5i
ZWdpbigpOworICAgIGZvciAoOyBpICE9IHRocmVhZE1hcCgpLmVuZCgpOyArK2kpIHsKKyAgICAg
ICAgY29uc3QgSEFORExFIGN1cnJIYW5kbGUgPSBpLT5zZWNvbmQ7CisgICAgICAgIGlmIChjdXJy
SGFuZGxlID09IHRocmVhZEhhbmRsZSkKKyAgICAgICAgICAgIHJldHVybiAoVGhyZWFkSWRlbnRp
ZmllcilpLT5maXJzdDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEhBTkRM
RSB0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKFRocmVhZElkZW50aWZpZXIgaWQpCit7CisgICAg
TXV0ZXhMb2NrZXIgbG9ja2VyKHRocmVhZE1hcE11dGV4KCkpOworICAgIHJldHVybiB0aHJlYWRN
YXAoKS5nZXQoaWQpOworfQorCitzdGF0aWMgdm9pZCBjbGVhclRocmVhZEhhbmRsZUZvcklkZW50
aWZpZXIoVGhyZWFkSWRlbnRpZmllciBpZCkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrZXIodGhy
ZWFkTWFwTXV0ZXgoKSk7CisKKyAgICBBU1NFUlQodGhyZWFkTWFwKCkuY29udGFpbnMoaWQpKTsK
KyAgICAKKyAgICB0aHJlYWRNYXAoKS5yZW1vdmUoaWQpOworfQorCitUaHJlYWRJZGVudGlmaWVy
IGNyZWF0ZVRocmVhZChUaHJlYWRGdW5jdGlvbiBlbnRyeVBvaW50LCB2b2lkKiBkYXRhKQorewor
ICAgIERXT1JEIHRocmVhZElkZW50aWZpZXIgPSAwOworICAgIFRocmVhZElkZW50aWZpZXIgdGhy
ZWFkSUQgPSAwOworICAgIEhBTkRMRSBoRXZlbnQgPSA6OkNyZWF0ZUV2ZW50KDAsIEZBTFNFLCBG
QUxTRSwgMCk7CisgICAgSEFORExFIHRocmVhZEhhbmRsZSA9IDo6Q3JlYXRlVGhyZWFkKDAsIDAs
IChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKWVudHJ5UG9pbnQsIGRhdGEsIDAsICZ0aHJlYWRJZGVu
dGlmaWVyKTsKKyAgICBpZiAoMCA9PSB0aHJlYWRIYW5kbGUpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gY3JlYXRlIHRocmVhZCBhdCBlbnRyeSBwb2ludCAlcCB3aXRoIGRhdGEgJXAi
LCBlbnRyeVBvaW50LCBkYXRhKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdGhy
ZWFkSUQgPSAoVGhyZWFkSWRlbnRpZmllcil0aHJlYWRJZGVudGlmaWVyOworICAgIHN0b3JlVGhy
ZWFkSGFuZGxlQnlJZGVudGlmaWVyKHRocmVhZElkZW50aWZpZXIsIHRocmVhZEhhbmRsZSk7CisK
KyAgICBMT0coVGhyZWFkaW5nLCAiQ3JlYXRlZCB0aHJlYWQgd2l0aCB0aHJlYWQgaWQgJXUiLCB0
aHJlYWRJRCk7CisgICAgcmV0dXJuIHRocmVhZElEOworfQorCitpbnQgd2FpdEZvclRocmVhZENv
bXBsZXRpb24oVGhyZWFkSWRlbnRpZmllciB0aHJlYWRJRCwgdm9pZCoqIHJlc3VsdCkKK3sKKyAg
ICBBU1NFUlQodGhyZWFkSUQpOworICAgIAorICAgIEhBTkRMRSB0aHJlYWRIYW5kbGUgPSB0aHJl
YWRIYW5kbGVGb3JJZGVudGlmaWVyKHRocmVhZElEKTsKKyAgICBpZiAoIXRocmVhZEhhbmRsZSkK
KyAgICAgICAgTE9HX0VSUk9SKCJUaHJlYWRJZGVudGlmaWVyICV1IGRpZCBub3QgY29ycmVzcG9u
ZCB0byBhbiBhY3RpdmUgdGhyZWFkIHdoZW4gdHJ5aW5nIHRvIHF1aXQiLCB0aHJlYWRJRCk7Cisg
CisgICAgRFdPUkQgam9pblJlc3VsdCA9IDo6V2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWRIYW5k
bGUsIElORklOSVRFKTsKKyAgICBpZiAoam9pblJlc3VsdCA9PSBXQUlUX0ZBSUxFRCkKKyAgICAg
ICAgTE9HX0VSUk9SKCJUaHJlYWRJZGVudGlmaWVyICV1IHdhcyBmb3VuZCB0byBiZSBkZWFkbG9j
a2VkIHRyeWluZyB0byBxdWl0IiwgdGhyZWFkSUQpOworCisgICAgOjpDbG9zZUhhbmRsZSh0aHJl
YWRIYW5kbGUpOworICAgIGNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcih0aHJlYWRJRCk7
CisKKyAgICByZXR1cm4gam9pblJlc3VsdDsKK30KKwordm9pZCBkZXRhY2hUaHJlYWQoVGhyZWFk
SWRlbnRpZmllciB0aHJlYWRJRCkKK3sKKyAgICBBU1NFUlQodGhyZWFkSUQpOworICAgIAorICAg
IEhBTkRMRSB0aHJlYWRIYW5kbGUgPSB0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKHRocmVhZElE
KTsKKyAgICBpZiAodGhyZWFkSGFuZGxlKQorICAgICAgICA6OkNsb3NlSGFuZGxlKHRocmVhZEhh
bmRsZSk7CisgICAgY2xlYXJUaHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKHRocmVhZElEKTsKK30K
KworVGhyZWFkSWRlbnRpZmllciBjdXJyZW50VGhyZWFkKCkKK3sKKyAgICByZXR1cm4gKFRocmVh
ZElkZW50aWZpZXIpOjpHZXRDdXJyZW50VGhyZWFkSWQgKCk7Cit9CisKK011dGV4OjpNdXRleCgp
Cit7CisgICAgbV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50ID0gMDsKKyAgICA6OkluaXRpYWxpemVD
cml0aWNhbFNlY3Rpb24oJm1fbXV0ZXgubV9pbnRlcm5hbE11dGV4KTsKK30KKworTXV0ZXg6On5N
dXRleCgpCit7CisgICAgOjpEZWxldGVDcml0aWNhbFNlY3Rpb24oJm1fbXV0ZXgubV9pbnRlcm5h
bE11dGV4KTsKK30KKwordm9pZCBNdXRleDo6bG9jaygpCit7CisgICAgOjpFbnRlckNyaXRpY2Fs
U2VjdGlvbigmbV9tdXRleC5tX2ludGVybmFsTXV0ZXgpOworICAgICsrbV9tdXRleC5tX3JlY3Vy
c2lvbkNvdW50OworfQorICAgIAorYm9vbCBNdXRleDo6dHJ5TG9jaygpCit7CisgICAgLy8gV2Fy
bmluZzogIHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayB3aWxsIHJldHVybiBhbiBlcnJvcgorICAgIC8v
IGlmIHRoZSBsb2NrIGlzIGFscmVhZHkgb3duZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLiAgV2lu
MzIKKyAgICAvLyB0aHJlYWRzIG1ha2Ugbm8gc3VjaCBjb21wbGFpbnQuCisgICAgRFdPUkQgcmVz
dWx0ID0gOjpUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigmbV9tdXRleC5tX2ludGVybmFsTXV0ZXgp
OworICAgIAorICAgIGlmIChyZXN1bHQgIT0gMCkgeyAgICAgICAvLyBXZSBnb3QgdGhlIGxvY2sK
KyAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgYWxyZWFkeSBoYWQgdGhlIGxvY2ssIHdlIG11c3Qg
dW5sb2NrIGFuZAorICAgICAgICAvLyByZXR1cm4gZmFsc2Ugc28gdGhhdCB3ZSBtaW1pYyB0aGUg
YmVoYXZpb3Igb2YgUE9TSVgncworICAgICAgICAvLyBwdGhyZWFkX211dGV4X3RyeWxvY2s6Cisg
ICAgICAgIGlmIChtX211dGV4Lm1fcmVjdXJzaW9uQ291bnQgPiAwKSB7CisgICAgICAgICAgICA6
OkxlYXZlQ3JpdGljYWxTZWN0aW9uKCZtX211dGV4Lm1faW50ZXJuYWxNdXRleCk7CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICArK21fbXV0ZXgubV9yZWN1
cnNpb25Db3VudDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXN1bHQg
PT0gMCkgICAvLyAuLi4gZmFpbGVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VS
VChmYWxzZSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE11dGV4Ojp1bmxvY2soKQor
eworICAgIC0tbV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50OworICAgIDo6TGVhdmVDcml0aWNhbFNl
Y3Rpb24oJm1fbXV0ZXgubV9pbnRlcm5hbE11dGV4KTsKK30KKworLy8gTm90ZTogIFRoZSBpbXBs
ZW1lbnRhdGlvbiBvZiBjb25kaXRpb24gdmFyaWFibGVzIHVuZGVyIHRoZSBXaW5kb3dzCisvLyBw
bGFmb3JtIHdhcyBiYXNlZCBvbiB0aGF0IG9mIHRoZSBleGNlbGxlbnQgQk9PU1QgQysrIGxpYnJh
cnkuICBJdAorLy8gaGFzIGJlZW4gcmV3cml0dGVuIHRvIGZpdCBpbiB3aXRoIHRoZSBXZWJLaXQg
YXJjaGl0ZWN0dXJlIGFuZCB0bworLy8gdXNlIGl0cyBjb2RpbmcgY29udmVudGlvbnMuCisvLwor
Ly8gVGhlIEJvb3N0IGxpY2Vuc2UgaXMgdmlydHVhbGx5IGlkZW50aWNhbCB0byB0aGUgQXBwbGUg
dmFyaWF0aW9uIGF0IHRoZQorLy8gdG9wIG9mIHRoaXMgZmlsZSwgYnV0IGlzIGluY2x1ZGVkIGhl
cmUgZm9yIGNvbXBsZXRlbmVzczoKKy8vCisvLyBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlIC0gVmVy
c2lvbiAxLjAgLSBBdWd1c3QgMTd0aCwgMjAwMworLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5
IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbgor
Ly8gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1
bWVudGF0aW9uIGNvdmVyZWQgYnkKKy8vIHRoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRv
IHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAorLy8gZXhlY3V0ZSwgYW5kIHRy
YW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0
aGUKKy8vIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUg
U29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCisvLyBkbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZv
bGxvd2luZzoKKy8vCisvLyBUaGUgY29weXJpZ2h0IG5vdGljZXMgaW4gdGhlIFNvZnR3YXJlIGFu
ZCB0aGlzIGVudGlyZSBzdGF0ZW1lbnQsIGluY2x1ZGluZworLy8gdGhlIGFib3ZlIGxpY2Vuc2Ug
Z3JhbnQsIHRoaXMgcmVzdHJpY3Rpb24gYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKy8v
IG11c3QgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGluIHdob2xl
IG9yIGluIHBhcnQsIGFuZAorLy8gYWxsIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNvZnR3YXJl
LCB1bmxlc3Mgc3VjaCBjb3BpZXMgb3IgZGVyaXZhdGl2ZQorLy8gd29ya3MgYXJlIHNvbGVseSBp
biB0aGUgZm9ybSBvZiBtYWNoaW5lLWV4ZWN1dGFibGUgb2JqZWN0IGNvZGUgZ2VuZXJhdGVkIGJ5
CisvLyBhIHNvdXJjZSBsYW5ndWFnZSBwcm9jZXNzb3IuCisvLworLy8gVEhFIFNPRlRXQVJFIElT
IFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Mg
T1IKKy8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVAorLy8gU0hBTEwgVEhF
IENPUFlSSUdIVCBIT0xERVJTIE9SIEFOWU9ORSBESVNUUklCVVRJTkcgVEhFIFNPRlRXQVJFIEJF
IExJQUJMRQorLy8gRk9SIEFOWSBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisvLyBBUklTSU5HIEZST00sIE9VVCBPRiBP
UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKy8v
IERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworc3RhdGljIGNvbnN0IGxvbmcgTUFYX1NFTUFQ
SE9SRV9DT1VOVCA9ICgoaW50KSAoKH4wdSkgPj4gMSkpOworCitUaHJlYWRDb25kaXRpb246OlRo
cmVhZENvbmRpdGlvbigpCit7CisgICAgbV9jb25kaXRpb24ubV90aW1lZE91dCA9IDA7CisgICAg
bV9jb25kaXRpb24ubV9ibG9ja2VkID0gMDsKKyAgICBtX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JS
ZW1vdmFsID0gMDsKKyAgICBtX2NvbmRpdGlvbi5tX2dhdGUgPSA6OkNyZWF0ZVNlbWFwaG9yZSgw
LCAxLCAxLCAwKTsKKyAgICBtX2NvbmRpdGlvbi5tX3F1ZXVlID0gOjpDcmVhdGVTZW1hcGhvcmUo
MCwgMCwgTUFYX1NFTUFQSE9SRV9DT1VOVCwgMCk7CisgICAgbV9jb25kaXRpb24ubV9tdXRleCA9
IDo6Q3JlYXRlTXV0ZXgoMCwgMCwgMCk7CisKKyAgICBpZiAoIW1fY29uZGl0aW9uLm1fZ2F0ZSB8
fCAhbV9jb25kaXRpb24ubV9xdWV1ZSB8fCAhbV9jb25kaXRpb24ubV9tdXRleCkgeworICAgICAg
ICBpZiAobV9jb25kaXRpb24ubV9nYXRlKQorICAgICAgICAgICAgOjpDbG9zZUhhbmRsZShtX2Nv
bmRpdGlvbi5tX2dhdGUpOworICAgICAgICBpZiAobV9jb25kaXRpb24ubV9xdWV1ZSkKKwkgICAg
OjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX3F1ZXVlKTsKKyAgICAgICAgaWYgKG1fY29uZGl0
aW9uLm1fbXV0ZXgpCisJICAgIDo6Q2xvc2VIYW5kbGUobV9jb25kaXRpb24ubV9tdXRleCk7Cisg
ICAgfQorfQorCitUaHJlYWRDb25kaXRpb246On5UaHJlYWRDb25kaXRpb24oKQoreworICAgIDo6
Q2xvc2VIYW5kbGUobV9jb25kaXRpb24ubV9nYXRlKTsKKyAgICA6OkNsb3NlSGFuZGxlKG1fY29u
ZGl0aW9uLm1fcXVldWUpOworICAgIDo6Q2xvc2VIYW5kbGUobV9jb25kaXRpb24ubV9tdXRleCk7
Cit9CisgICAgCit2b2lkIFRocmVhZENvbmRpdGlvbjo6d2FpdChNdXRleCYgbXV0ZXgpCit7Cisg
ICAgUGxhdGZvcm1NdXRleCYgY3MgPSBtdXRleC5pbXBsKCk7CisKKyAgICAvLyBFbnRlciB0aGUg
d2FpdCBzdGF0ZS4uLgorICAgIERXT1JEIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2Nv
bmRpdGlvbi5tX2dhdGUsIElORklOSVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNU
XzApOworICAgICsrbV9jb25kaXRpb24ubV9ibG9ja2VkOworICAgIHJlcyA9IDo6UmVsZWFzZVNl
bWFwaG9yZShtX2NvbmRpdGlvbi5tX2dhdGUsIDEsIDApOworICAgIEFTU0VSVChyZXMpOworCisg
ICAgOjpMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY3MubV9pbnRlcm5hbE11dGV4KTsKKworICAgIHJl
cyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX3F1ZXVlLCBJTkZJTklURSk7
CisgICAgQVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKworICAgIHVuc2lnbmVkIHdhc19n
b25lPTA7CisKKyAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9t
dXRleCwgSU5GSU5JVEUpOworICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisgICAg
c2l6ZV90IHdhc1dhaXRpbmcgPSBtX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFsOworICAg
IHNpemVfdCB3YXNUaW1lZE91dCA9IG1fY29uZGl0aW9uLm1fdGltZWRPdXQ7CisgICAgaWYgKHdh
c1dhaXRpbmcgIT0gMCkgeworICAgICAgICBpZiAoLS1tX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JS
ZW1vdmFsID09IDApIHsKKyAgICAgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgIT0g
MCkgeworICAgICAgICAgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlv
bi5tX2dhdGUsIDEsIDApOyAgLy8gb3BlbiBtX2dhdGUKKyAgICAgICAgICAgICAgICBBU1NFUlQo
cmVzKTsKKyAgICAgICAgICAgICAgICB3YXNXYWl0aW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGVsc2UgaWYgKG1fY29uZGl0aW9uLm1fdGltZWRPdXQgIT0gMCkKKyAgICAgICAg
ICAgICAgICBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxz
ZSBpZiAoKyttX2NvbmRpdGlvbi5tX3RpbWVkT3V0ID09ICgoc3RkOjpudW1lcmljX2xpbWl0czx1
bnNpZ25lZD46Om1heCkoKSAvIDIpKSB7CisgICAgICAgIC8vIHRpbWVvdXQgb2NjdXJlZCwgbm9y
bWFsaXplIHRoZSBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0IGNvdW50CisgICAgICAgIC8vIHRoaXMg
bWF5IG9jY3VyIGlmIG1hbnkgY2FsbHMgdG8gd2FpdCB3aXRoIGEgdGltZW91dCBhcmUgbWFkZSBh
bmQKKyAgICAgICAgLy8gbm8gY2FsbCB0byBub3RpZnlfKiBpcyBtYWRlCisgICAgICAgIHJlcyA9
IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX2dhdGUsIElORklOSVRFKTsKKyAg
ICAgICAgQVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKyAgICAgICAgbV9jb25kaXRpb24u
bV9ibG9ja2VkIC09IG1fY29uZGl0aW9uLm1fdGltZWRPdXQ7CisgICAgICAgIHJlcyA9IDo6UmVs
ZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dhdGUsIDEsIDApOworICAgICAgICBBU1NFUlQo
cmVzKTsKKyAgICAgICAgbV9jb25kaXRpb24ubV90aW1lZE91dCA9IDA7CisgICAgfQorICAgIHJl
cyA9IDo6UmVsZWFzZU11dGV4KG1fY29uZGl0aW9uLm1fbXV0ZXgpOworICAgIEFTU0VSVChyZXMp
OworCisgICAgaWYgKHdhc1dhaXRpbmcgPT0gMSkgeworICAgICAgICBmb3IgKC8qKi8gOyB3YXNU
aW1lZE91dDsgLS13YXNUaW1lZE91dCkgeworICAgICAgICAgICAgLy8gYmV0dGVyIG5vdyB0aGFu
IHNwdXJpb3VzIGxhdGVyCisgICAgICAgICAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3Qo
bV9jb25kaXRpb24ubV9xdWV1ZSwgSU5GSU5JVEUpOworICAgICAgICAgICAgQVNTRVJUKHJlcyA9
PSBXQUlUX09CSkVDVF8wKTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1h
cGhvcmUobV9jb25kaXRpb24ubV9nYXRlLCAxLCAwKTsKKyAgICAgICAgQVNTRVJUKHJlcyk7Cisg
ICAgfQorCisgICAgOjpFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmNzLm1faW50ZXJuYWxNdXRleCk7
Cit9CisKK3ZvaWQgVGhyZWFkQ29uZGl0aW9uOjpzaWduYWwoKQoreworICAgIHVuc2lnbmVkIHNp
Z25hbHMgPSAwOworCisgICAgRFdPUkQgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29u
ZGl0aW9uLm1fbXV0ZXgsIElORklOSVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNU
XzApOworCisgICAgaWYgKG1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgIT0gMCkgeyAv
LyB0aGUgbV9nYXRlIGlzIGFscmVhZHkgY2xvc2VkCisgICAgICAgIGlmIChtX2NvbmRpdGlvbi5t
X2Jsb2NrZWQgPT0gMCkgeworICAgICAgICAgICAgcmVzID0gOjpSZWxlYXNlTXV0ZXgobV9jb25k
aXRpb24ubV9tdXRleCk7CisgICAgICAgICAgICBBU1NFUlQocmVzKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorCisgICAgICAgICsrbV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVt
b3ZhbDsKKyAgICAgICAgLS1tX2NvbmRpdGlvbi5tX2Jsb2NrZWQ7CisKKyAgICAgICAgc2lnbmFs
cyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0
KG1fY29uZGl0aW9uLm1fZ2F0ZSwgSU5GSU5JVEUpOworICAgICAgICBBU1NFUlQocmVzID09IFdB
SVRfT0JKRUNUXzApOworICAgICAgICBpZiAobV9jb25kaXRpb24ubV9ibG9ja2VkID4gbV9jb25k
aXRpb24ubV90aW1lZE91dCkgeworICAgICAgICAgICAgaWYgKG1fY29uZGl0aW9uLm1fdGltZWRP
dXQgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fY29uZGl0aW9uLm1fYmxvY2tlZCAtPSBtX2Nv
bmRpdGlvbi5tX3RpbWVkT3V0OworICAgICAgICAgICAgICAgIG1fY29uZGl0aW9uLm1fdGltZWRP
dXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lnbmFscyA9IG1fY29uZGl0aW9u
Lm1fd2FpdGluZ0ZvclJlbW92YWwgPSAxOworICAgICAgICAgICAgLS1tX2NvbmRpdGlvbi5tX2Js
b2NrZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1h
cGhvcmUobV9jb25kaXRpb24ubV9nYXRlLCAxLCAwKTsKKyAgICAgICAgICAgIEFTU0VSVChyZXMp
OworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID06OlJlbGVhc2VNdXRleChtX2NvbmRpdGlv
bi5tX211dGV4KTsKKyAgICBBU1NFUlQocmVzKTsKKworICAgIGlmIChzaWduYWxzKSB7CisgICAg
ICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX3F1ZXVlLCBzaWduYWxz
LCAwKTsKKyAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgfQorfQorCit2b2lkIFRocmVhZENvbmRp
dGlvbjo6YnJvYWRjYXN0KCkKK3sKKyAgICB1bnNpZ25lZCBzaWduYWxzID0gMDsKKworICAgIFdP
UkQgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0aW9uLm1fbXV0ZXgsIElORklO
SVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworCisgICAgaWYgKG1fY29u
ZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgIT0gMCkgeyAvLyB0aGUgbV9nYXRlIGlzIGFscmVh
ZHkgY2xvc2VkCisgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPT0gMCkgeworICAg
ICAgICAgICAgcmVzID0gOjpSZWxlYXNlTXV0ZXgobV9jb25kaXRpb24ubV9tdXRleCk7CisgICAg
ICAgICAgICBBU1NFUlQocmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg
ICAgICAgIG1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgKz0gKHNpZ25hbHMgPSBtX2Nv
bmRpdGlvbi5tX2Jsb2NrZWQpOworICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPSAwOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRp
dGlvbi5tX2dhdGUsIElORklOSVRFKTsKKyAgICAgICAgQVNTRVJUKHJlcyA9PSBXQUlUX09CSkVD
VF8wKTsKKyAgICAgICAgaWYgKG1fY29uZGl0aW9uLm1fYmxvY2tlZCA+IG1fY29uZGl0aW9uLm1f
dGltZWRPdXQpIHsKKyAgICAgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX3RpbWVkT3V0ICE9IDAp
IHsKKyAgICAgICAgICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgLT0gbV9jb25kaXRpb24u
bV90aW1lZE91dDsKKyAgICAgICAgICAgICAgICBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0ID0gMDsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpZ25hbHMgPSBtX2NvbmRpdGlvbi5tX3dhaXRp
bmdGb3JSZW1vdmFsID0gbV9jb25kaXRpb24ubV9ibG9ja2VkOworICAgICAgICAgICAgbV9jb25k
aXRpb24ubV9ibG9ja2VkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9
IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dhdGUsIDEsIDApOworICAgICAgICAg
ICAgQVNTRVJUKHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSA6OlJlbGVhc2VN
dXRleChtX2NvbmRpdGlvbi5tX211dGV4KTsKKyAgICBBU1NFUlQocmVzKTsKKworICAgIGlmIChz
aWduYWxzKSB7CisgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5t
X3F1ZXVlLCBzaWduYWxzLCAwKTsKKyAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgfQorfQorLy8g
RW5kIEJvb3N0LXJlbGF0ZWQgbG9naWMKKyAgICAKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17946</attachid>
            <date>2007-12-16 17:23:10 -0800</date>
            <delta_ts>2007-12-16 20:40:42 -0800</delta_ts>
            <desc>Patch to add win32-based threading implementation (modifications to build system)</desc>
            <filename>winthreads_buildchange.patch</filename>
            <type>text/plain</type>
            <size>2426</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI4Nzgy
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMDctMTIt
MTYgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBB
RERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgU2Vjb25kIHBhcnQgb2YgcGF0Y2hlcyBmb3IgQnVn
ICMxNjQ2NCB0bworICAgICAgICBtb3ZlIHRvIG5hdGl2ZSB3aW4zMiB0aHJlYWQgcHJpbWl0aXZl
cy4gCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAg
KiBjb25maWcuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9UaHJlYWRpbmcuaDoKKwogMjAwNy0xMi0x
NiAgU2FtIFdlaW5pZyAgPHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERh
cmluLgpJbmRleDogY29uZmlnLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gY29uZmlnLmgJKHJldmlzaW9uIDI4
NzgyKQorKysgY29uZmlnLmgJKHdvcmtpbmcgY29weSkKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZp
bmUgV1RGX1VTRV9DRk5FVFdPUksgMQogI3VuZGVmIFdURl9VU0VfV0lOSU5FVAogI2RlZmluZSBX
VEZfUExBVEZPUk1fQ0YgMQotI2RlZmluZSBXVEZfVVNFX1BUSFJFQURTIDEKKyNkZWZpbmUgV1RG
X1VTRV9QVEhSRUFEUyAwCiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKE1BQykKSW5kZXg6IFdlYkNv
cmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUudmNwcm9qL1dl
YkNvcmUudmNwcm9qCShyZXZpc2lvbiAyODc4MikKKysrIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0zNjkyLDYgKzM2OTIsMTAgQEAKIAkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cV2luZG93TWVzc2FnZUxpc3RlbmVyLmgiDQogCQkJCQk+
DQogCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZv
cm1cd2luXFdpblRocmVhZFN1cHBvcnQuY3BwIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQogCQkJ
PC9GaWx0ZXI+DQogCQkJPEZpbHRlcg0KIAkJCQlOYW1lPSJjZiINCkBAIC00MDg2LDE0ICs0MDkw
LDYgQEAKIAkJCQk8L0ZpbHRlcj4NCiAJCQk8L0ZpbHRlcj4NCiAJCQk8RmlsdGVyDQotCQkJCU5h
bWU9InB0aHJlYWRzIg0KLQkJCQk+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXHB0aHJlYWRzXFRocmVhZGluZ1B0aHJlYWRzLmNwcCINCi0JCQkJCT4NCi0JCQkJ
PC9GaWxlPg0KLQkJCTwvRmlsdGVyPg0KLQkJCTxGaWx0ZXINCiAJCQkJTmFtZT0ic3FsIg0KIAkJ
CQk+DQogCQkJCTxGaWxlDQpJbmRleDogcGxhdGZvcm0vVGhyZWFkaW5nLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gcGxhdGZvcm0vVGhyZWFkaW5nLmgJKHJldmlzaW9uIDI4NzgyKQorKysgcGxhdGZvcm0vVGhy
ZWFkaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTY5LDYgKzY5LDIxIEBAIHR5cGVkZWYgR0NvbmQq
IFBsYXRmb3JtQ29uZGl0aW9uOwogI2VsaWYgUExBVEZPUk0oUVQpCiB0eXBlZGVmIFFNdXRleCog
UGxhdGZvcm1NdXRleDsKIHR5cGVkZWYgUVdhaXRDb25kaXRpb24qIFBsYXRmb3JtQ29uZGl0aW9u
OworI2VsaWYgUExBVEZPUk0oV0lOX09TKQorc3RydWN0IFBsYXRmb3JtTXV0ZXhfdCB7CisgICAg
Q1JJVElDQUxfU0VDVElPTiBtX2ludGVybmFsTXV0ZXg7CisgICAgc2l6ZV90ICAgICAgICAgICBt
X3JlY3Vyc2lvbkNvdW50OworfTsKK3R5cGVkZWYgUGxhdGZvcm1NdXRleF90IFBsYXRmb3JtTXV0
ZXg7CitzdHJ1Y3QgUGxhdGZvcm1Db25kaXRpb25fdCB7CisgICAgc2l6ZV90ICAgIG1fdGltZWRP
dXQ7CisgICAgc2l6ZV90ICAgIG1fYmxvY2tlZDsKKyAgICBzaXplX3QgICAgbV93YWl0aW5nRm9y
UmVtb3ZhbDsKKyAgICBIQU5ETEUgICAgbV9nYXRlOworICAgIEhBTkRMRSAgICBtX3F1ZXVlOwor
ICAgIEhBTkRMRSAgICBtX211dGV4OworfTsKK3R5cGVkZWYgUGxhdGZvcm1Db25kaXRpb25fdCBQ
bGF0Zm9ybUNvbmRpdGlvbjsKICNlbHNlCiB0eXBlZGVmIHZvaWQqIFBsYXRmb3JtTXV0ZXg7CiB0
eXBlZGVmIHZvaWQqIFBsYXRmb3JtQ29uZGl0aW9uOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17950</attachid>
            <date>2007-12-16 20:40:42 -0800</date>
            <delta_ts>2007-12-17 10:07:33 -0800</delta_ts>
            <desc>Patch to add win32-based threading implementation (includes changes to build system).</desc>
            <filename>threading.patch</filename>
            <type>text/plain</type>
            <size>19550</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI4Nzkz
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzYgQEAKKzIwMDctMTIt
MTYgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBB
RERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJv
ajoKKyAgICAgICAgKiBjb25maWcuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9UaHJlYWRpbmcuaDoK
KyAgICAgICAgKiBwbGF0Zm9ybS93aW4vTXV0ZXguY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6Ok11dGV4OjpNdXRleCk6CisgICAgICAgIChXZWJDb3JlOjpNdXRleDo6fk11dGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6Ok11dGV4Ojpsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4Ojp0
cnlMb2NrKToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4Ojp1bmxvY2spOgorICAgICAgICAqIHBs
YXRmb3JtL3dpbi9UaHJlYWRDb25kaXRpb24uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlRocmVhZENvbmRpdGlvbjo6VGhyZWFkQ29uZGl0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlRo
cmVhZENvbmRpdGlvbjo6flRocmVhZENvbmRpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpUaHJl
YWRDb25kaXRpb246OndhaXQpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkQ29uZGl0aW9uOjpz
aWduYWwpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkQ29uZGl0aW9uOjpicm9hZGNhc3QpOgor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9UaHJlYWRpbmdXaW4uY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6dGhyZWFkTWFwTXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6dGhyZWFkTWFwKToKKyAgICAg
ICAgKFdlYkNvcmU6OnN0b3JlVGhyZWFkSGFuZGxlQnlJZGVudGlmaWVyKToKKyAgICAgICAgKFdl
YkNvcmU6OmlkZW50aWZpZXJCeVRocmVhZEhhbmRsZSk6CisgICAgICAgIChXZWJDb3JlOjp0aHJl
YWRIYW5kbGVGb3JJZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OmNsZWFyVGhyZWFkSGFu
ZGxlRm9ySWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVUaHJlYWQpOgorICAg
ICAgICAoV2ViQ29yZTo6d2FpdEZvclRocmVhZENvbXBsZXRpb24pOgorICAgICAgICAoV2ViQ29y
ZTo6ZGV0YWNoVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OmN1cnJlbnRUaHJlYWQpOgorCiAy
MDA3LTEyLTE2ICBBbHAgVG9rZXIgIDxhbHBAYXRva2VyLmNvbT4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBNYWNpZWouCkluZGV4OiBjb25maWcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBjb25maWcuaAkocmV2
aXNpb24gMjg3OTEpCisrKyBjb25maWcuaAkod29ya2luZyBjb3B5KQpAQCAtODgsNyArODgsNyBA
QAogI2RlZmluZSBXVEZfVVNFX0NGTkVUV09SSyAxCiAjdW5kZWYgV1RGX1VTRV9XSU5JTkVUCiAj
ZGVmaW5lIFdURl9QTEFURk9STV9DRiAxCi0jZGVmaW5lIFdURl9VU0VfUFRIUkVBRFMgMQorI2Rl
ZmluZSBXVEZfVVNFX1BUSFJFQURTIDAKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oTUFDKQpJbmRl
eDogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS52
Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDI4NzkxKQorKysgV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM1NDIsNiArMzU0MiwxMCBAQAogCQkJ
CQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxh
dGZvcm1cd2luXE11dGV4LmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0K
IAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cUGFzdGVib2FyZFdpbi5jcHAiDQog
CQkJCQk+DQogCQkJCTwvRmlsZT4NCkBAIC0zNjAyLDYgKzM2MDYsMTAgQEAKIAkJCQkJPg0KIAkJ
CQk8L0ZpbGU+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXHdp
blxUaHJlYWRDb25kaXRpb24uY3BwIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxl
DQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXHdpblxUaHJlYWRpbmdXaW4uY3BwIg0K
IAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQpAQCAtNDA3OCwxNCArNDA4Niw2IEBACiAJCQkJPC9GaWx0
ZXI+DQogCQkJPC9GaWx0ZXI+DQogCQkJPEZpbHRlcg0KLQkJCQlOYW1lPSJwdGhyZWFkcyINCi0J
CQkJPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxwdGhyZWFk
c1xUaHJlYWRpbmdQdGhyZWFkcy5jcHAiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQk8L0Zp
bHRlcj4NCi0JCQk8RmlsdGVyDQogCQkJCU5hbWU9InNxbCINCiAJCQkJPg0KIAkJCQk8RmlsZQ0K
SW5kZXg6IHBsYXRmb3JtL1RocmVhZGluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL1RocmVh
ZGluZy5oCShyZXZpc2lvbiAyODc5MSkKKysrIHBsYXRmb3JtL1RocmVhZGluZy5oCSh3b3JraW5n
IGNvcHkpCkBAIC02OSw2ICs2OSwyMSBAQCB0eXBlZGVmIEdDb25kKiBQbGF0Zm9ybUNvbmRpdGlv
bjsKICNlbGlmIFBMQVRGT1JNKFFUKQogdHlwZWRlZiBRTXV0ZXgqIFBsYXRmb3JtTXV0ZXg7CiB0
eXBlZGVmIFFXYWl0Q29uZGl0aW9uKiBQbGF0Zm9ybUNvbmRpdGlvbjsKKyNlbGlmIFBMQVRGT1JN
KFdJTl9PUykKK3N0cnVjdCBQbGF0Zm9ybU11dGV4X3QgeworICAgIENSSVRJQ0FMX1NFQ1RJT04g
bV9pbnRlcm5hbE11dGV4OworICAgIHNpemVfdCAgICAgICAgICAgbV9yZWN1cnNpb25Db3VudDsK
K307Cit0eXBlZGVmIFBsYXRmb3JtTXV0ZXhfdCBQbGF0Zm9ybU11dGV4Oworc3RydWN0IFBsYXRm
b3JtQ29uZGl0aW9uX3QgeworICAgIHNpemVfdCAgICBtX3RpbWVkT3V0OworICAgIHNpemVfdCAg
ICBtX2Jsb2NrZWQ7CisgICAgc2l6ZV90ICAgIG1fd2FpdGluZ0ZvclJlbW92YWw7CisgICAgSEFO
RExFICAgIG1fZ2F0ZTsKKyAgICBIQU5ETEUgICAgbV9xdWV1ZTsKKyAgICBIQU5ETEUgICAgbV9t
dXRleDsKK307Cit0eXBlZGVmIFBsYXRmb3JtQ29uZGl0aW9uX3QgUGxhdGZvcm1Db25kaXRpb247
CiAjZWxzZQogdHlwZWRlZiB2b2lkKiBQbGF0Zm9ybU11dGV4OwogdHlwZWRlZiB2b2lkKiBQbGF0
Zm9ybUNvbmRpdGlvbjsKSW5kZXg6IHBsYXRmb3JtL3dpbi9NdXRleC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gcGxhdGZvcm0vd2luL011dGV4LmNwcAkocmV2aXNpb24gMCkKKysrIHBsYXRmb3JtL3dpbi9N
dXRleC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEJyZW50IEZ1bGdoYW0KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRocmVh
ZGluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK011dGV4OjpNdXRleCgpCit7CisgICAg
bV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50ID0gMDsKKyAgICA6OkluaXRpYWxpemVDcml0aWNhbFNl
Y3Rpb24oJm1fbXV0ZXgubV9pbnRlcm5hbE11dGV4KTsKK30KKworTXV0ZXg6On5NdXRleCgpCit7
CisgICAgOjpEZWxldGVDcml0aWNhbFNlY3Rpb24oJm1fbXV0ZXgubV9pbnRlcm5hbE11dGV4KTsK
K30KKwordm9pZCBNdXRleDo6bG9jaygpCit7CisgICAgOjpFbnRlckNyaXRpY2FsU2VjdGlvbigm
bV9tdXRleC5tX2ludGVybmFsTXV0ZXgpOworICAgICsrbV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50
OworfQorICAgIAorYm9vbCBNdXRleDo6dHJ5TG9jaygpCit7CisgICAgLy8gV2FybmluZzogIHB0
aHJlYWRfbXV0ZXhfdHJ5bG9jayB3aWxsIHJldHVybiBhbiBlcnJvcgorICAgIC8vIGlmIHRoZSBs
b2NrIGlzIGFscmVhZHkgb3duZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkLiAgV2luMzIKKyAgICAv
LyB0aHJlYWRzIG1ha2Ugbm8gc3VjaCBjb21wbGFpbnQuCisgICAgRFdPUkQgcmVzdWx0ID0gOjpU
cnlFbnRlckNyaXRpY2FsU2VjdGlvbigmbV9tdXRleC5tX2ludGVybmFsTXV0ZXgpOworICAgIAor
ICAgIGlmIChyZXN1bHQgIT0gMCkgeyAgICAgICAvLyBXZSBnb3QgdGhlIGxvY2sKKyAgICAgICAg
Ly8gSWYgdGhpcyB0aHJlYWQgYWxyZWFkeSBoYWQgdGhlIGxvY2ssIHdlIG11c3QgdW5sb2NrIGFu
ZAorICAgICAgICAvLyByZXR1cm4gZmFsc2Ugc28gdGhhdCB3ZSBtaW1pYyB0aGUgYmVoYXZpb3Ig
b2YgUE9TSVgncworICAgICAgICAvLyBwdGhyZWFkX211dGV4X3RyeWxvY2s6CisgICAgICAgIGlm
IChtX211dGV4Lm1fcmVjdXJzaW9uQ291bnQgPiAwKSB7CisgICAgICAgICAgICA6OkxlYXZlQ3Jp
dGljYWxTZWN0aW9uKCZtX211dGV4Lm1faW50ZXJuYWxNdXRleCk7CisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICArK21fbXV0ZXgubV9yZWN1cnNpb25Db3Vu
dDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMCkgICAv
LyAuLi4gZmFpbGVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChmYWxzZSk7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE11dGV4Ojp1bmxvY2soKQoreworICAgIC0t
bV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50OworICAgIDo6TGVhdmVDcml0aWNhbFNlY3Rpb24oJm1f
bXV0ZXgubV9pbnRlcm5hbE11dGV4KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRl
eDogcGxhdGZvcm0vd2luL1RocmVhZENvbmRpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZv
cm0vd2luL1RocmVhZENvbmRpdGlvbi5jcHAJKHJldmlzaW9uIDApCisrKyBwbGF0Zm9ybS93aW4v
VGhyZWFkQ29uZGl0aW9uLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRl
ciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAq
ICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGhyZWFkaW5nLmgiCisKKyNpbmNsdWRlICJMb2dn
aW5nLmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCisvLyBOb3RlOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIGNvbmRpdGlv
biB2YXJpYWJsZXMgdW5kZXIgdGhlIFdpbmRvd3MKKy8vIHBsYWZvcm0gd2FzIGJhc2VkIG9uIHRo
YXQgb2YgdGhlIGV4Y2VsbGVudCBCT09TVCBDKysgbGlicmFyeS4gIEl0CisvLyBoYXMgYmVlbiBy
ZXdyaXR0ZW4gdG8gZml0IGluIHdpdGggdGhlIFdlYktpdCBhcmNoaXRlY3R1cmUgYW5kIHRvCisv
LyB1c2UgaXRzIGNvZGluZyBjb252ZW50aW9ucy4KKy8vCisvLyBUaGUgQm9vc3QgbGljZW5zZSBp
cyB2aXJ0dWFsbHkgaWRlbnRpY2FsIHRvIHRoZSBBcHBsZSB2YXJpYXRpb24gYXQgdGhlCisvLyB0
b3Agb2YgdGhpcyBmaWxlLCBidXQgaXMgaW5jbHVkZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzOgor
Ly8KKy8vIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UgLSBWZXJzaW9uIDEuMCAtIEF1Z3VzdCAxN3Ro
LCAyMDAzCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFy
Z2UsIHRvIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uCisvLyBvYnRhaW5pbmcgYSBjb3B5IG9m
IHRoZSBzb2Z0d2FyZSBhbmQgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gY292ZXJlZCBieQor
Ly8gdGhpcyBsaWNlbnNlICh0aGUgIlNvZnR3YXJlIikgdG8gdXNlLCByZXByb2R1Y2UsIGRpc3Bs
YXksIGRpc3RyaWJ1dGUsCisvLyBleGVjdXRlLCBhbmQgdHJhbnNtaXQgdGhlIFNvZnR3YXJlLCBh
bmQgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQorLy8gU29mdHdhcmUsIGFuZCB0
byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQg
dG8KKy8vIGRvIHNvLCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgorLy8KKy8vIFRoZSBj
b3B5cmlnaHQgbm90aWNlcyBpbiB0aGUgU29mdHdhcmUgYW5kIHRoaXMgZW50aXJlIHN0YXRlbWVu
dCwgaW5jbHVkaW5nCisvLyB0aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlv
biBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorLy8gbXVzdCBiZSBpbmNsdWRlZCBpbiBh
bGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kCisvLyBh
bGwgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU29mdHdhcmUsIHVubGVzcyBzdWNoIGNvcGllcyBv
ciBkZXJpdmF0aXZlCisvLyB3b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUt
ZXhlY3V0YWJsZSBvYmplY3QgY29kZSBnZW5lcmF0ZWQgYnkKKy8vIGEgc291cmNlIGxhbmd1YWdl
IHByb2Nlc3Nvci4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lU
SE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorLy8gSU1QTElFRCwgSU5DTFVE
SU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFks
CisvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZS
SU5HRU1FTlQuIElOIE5PIEVWRU5UCisvLyBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1Ig
QU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCisvLyBGT1IgQU5ZIERB
TUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9U
SEVSV0lTRSwKKy8vIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBU
SEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorLy8gREVBTElOR1MgSU4gVEhFIFNPRlRX
QVJFLgorCitzdGF0aWMgY29uc3QgbG9uZyBNQVhfU0VNQVBIT1JFX0NPVU5UID0gKChpbnQpICgo
fjB1KSA+PiAxKSk7CisKK1RocmVhZENvbmRpdGlvbjo6VGhyZWFkQ29uZGl0aW9uKCkKK3sKKyAg
ICBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQg
PSAwOworICAgIG1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgPSAwOworICAgIG1fY29u
ZGl0aW9uLm1fZ2F0ZSA9IDo6Q3JlYXRlU2VtYXBob3JlKDAsIDEsIDEsIDApOworICAgIG1fY29u
ZGl0aW9uLm1fcXVldWUgPSA6OkNyZWF0ZVNlbWFwaG9yZSgwLCAwLCBNQVhfU0VNQVBIT1JFX0NP
VU5ULCAwKTsKKyAgICBtX2NvbmRpdGlvbi5tX211dGV4ID0gOjpDcmVhdGVNdXRleCgwLCAwLCAw
KTsKKworICAgIGlmICghbV9jb25kaXRpb24ubV9nYXRlIHx8ICFtX2NvbmRpdGlvbi5tX3F1ZXVl
IHx8ICFtX2NvbmRpdGlvbi5tX211dGV4KSB7CisgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX2dh
dGUpCisgICAgICAgICAgICA6OkNsb3NlSGFuZGxlKG1fY29uZGl0aW9uLm1fZ2F0ZSk7CisgICAg
ICAgIGlmIChtX2NvbmRpdGlvbi5tX3F1ZXVlKQorCSAgICA6OkNsb3NlSGFuZGxlKG1fY29uZGl0
aW9uLm1fcXVldWUpOworICAgICAgICBpZiAobV9jb25kaXRpb24ubV9tdXRleCkKKwkgICAgOjpD
bG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX211dGV4KTsKKyAgICB9Cit9CisKK1RocmVhZENvbmRp
dGlvbjo6flRocmVhZENvbmRpdGlvbigpCit7CisgICAgOjpDbG9zZUhhbmRsZShtX2NvbmRpdGlv
bi5tX2dhdGUpOworICAgIDo6Q2xvc2VIYW5kbGUobV9jb25kaXRpb24ubV9xdWV1ZSk7CisgICAg
OjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX211dGV4KTsKK30KKyAgICAKK3ZvaWQgVGhyZWFk
Q29uZGl0aW9uOjp3YWl0KE11dGV4JiBtdXRleCkKK3sKKyAgICBQbGF0Zm9ybU11dGV4JiBjcyA9
IG11dGV4LmltcGwoKTsKKworICAgIC8vIEVudGVyIHRoZSB3YWl0IHN0YXRlLi4uCisgICAgRFdP
UkQgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0aW9uLm1fZ2F0ZSwgSU5GSU5J
VEUpOworICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisgICAgKyttX2NvbmRpdGlv
bi5tX2Jsb2NrZWQ7CisgICAgcmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0aW9uLm1f
Z2F0ZSwgMSwgMCk7CisgICAgQVNTRVJUKHJlcyk7CisKKyAgICA6OkxlYXZlQ3JpdGljYWxTZWN0
aW9uKCZjcy5tX2ludGVybmFsTXV0ZXgpOworCisgICAgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2Jq
ZWN0KG1fY29uZGl0aW9uLm1fcXVldWUsIElORklOSVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdB
SVRfT0JKRUNUXzApOworCisgICAgdW5zaWduZWQgd2FzX2dvbmU9MDsKKworICAgIHJlcyA9IDo6
V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX211dGV4LCBJTkZJTklURSk7CisgICAg
QVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKyAgICBzaXplX3Qgd2FzV2FpdGluZyA9IG1f
Y29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWw7CisgICAgc2l6ZV90IHdhc1RpbWVkT3V0ID0g
bV9jb25kaXRpb24ubV90aW1lZE91dDsKKyAgICBpZiAod2FzV2FpdGluZyAhPSAwKSB7CisgICAg
ICAgIGlmICgtLW1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgPT0gMCkgeworICAgICAg
ICAgICAgaWYgKG1fY29uZGl0aW9uLm1fYmxvY2tlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAg
cmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0aW9uLm1fZ2F0ZSwgMSwgMCk7ICAvLyBv
cGVuIG1fZ2F0ZQorICAgICAgICAgICAgICAgIEFTU0VSVChyZXMpOworICAgICAgICAgICAgICAg
IHdhc1dhaXRpbmcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9j
b25kaXRpb24ubV90aW1lZE91dCAhPSAwKQorICAgICAgICAgICAgICAgIG1fY29uZGl0aW9uLm1f
dGltZWRPdXQgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgrK21fY29uZGl0aW9uLm1f
dGltZWRPdXQgPT0gKChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KSgpIC8gMikp
IHsKKyAgICAgICAgLy8gdGltZW91dCBvY2N1cmVkLCBub3JtYWxpemUgdGhlIG1fY29uZGl0aW9u
Lm1fdGltZWRPdXQgY291bnQKKyAgICAgICAgLy8gdGhpcyBtYXkgb2NjdXIgaWYgbWFueSBjYWxs
cyB0byB3YWl0IHdpdGggYSB0aW1lb3V0IGFyZSBtYWRlIGFuZAorICAgICAgICAvLyBubyBjYWxs
IHRvIG5vdGlmeV8qIGlzIG1hZGUKKyAgICAgICAgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0
KG1fY29uZGl0aW9uLm1fZ2F0ZSwgSU5GSU5JVEUpOworICAgICAgICBBU1NFUlQocmVzID09IFdB
SVRfT0JKRUNUXzApOworICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgLT0gbV9jb25kaXRp
b24ubV90aW1lZE91dDsKKyAgICAgICAgcmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0
aW9uLm1fZ2F0ZSwgMSwgMCk7CisgICAgICAgIEFTU0VSVChyZXMpOworICAgICAgICBtX2NvbmRp
dGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICB9CisgICAgcmVzID0gOjpSZWxlYXNlTXV0ZXgobV9j
b25kaXRpb24ubV9tdXRleCk7CisgICAgQVNTRVJUKHJlcyk7CisKKyAgICBpZiAod2FzV2FpdGlu
ZyA9PSAxKSB7CisgICAgICAgIGZvciAoLyoqLyA7IHdhc1RpbWVkT3V0OyAtLXdhc1RpbWVkT3V0
KSB7CisgICAgICAgICAgICAvLyBiZXR0ZXIgbm93IHRoYW4gc3B1cmlvdXMgbGF0ZXIKKyAgICAg
ICAgICAgIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX3F1ZXVlLCBJ
TkZJTklURSk7CisgICAgICAgICAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworICAg
ICAgICB9CisgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dh
dGUsIDEsIDApOworICAgICAgICBBU1NFUlQocmVzKTsKKyAgICB9CisKKyAgICA6OkVudGVyQ3Jp
dGljYWxTZWN0aW9uICgmY3MubV9pbnRlcm5hbE11dGV4KTsKK30KKwordm9pZCBUaHJlYWRDb25k
aXRpb246OnNpZ25hbCgpCit7CisgICAgdW5zaWduZWQgc2lnbmFscyA9IDA7CisKKyAgICBEV09S
RCByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9tdXRleCwgSU5GSU5J
VEUpOworICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisKKyAgICBpZiAobV9jb25k
aXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbCAhPSAwKSB7IC8vIHRoZSBtX2dhdGUgaXMgYWxyZWFk
eSBjbG9zZWQKKyAgICAgICAgaWYgKG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9PSAwKSB7CisgICAg
ICAgICAgICByZXMgPSA6OlJlbGVhc2VNdXRleChtX2NvbmRpdGlvbi5tX211dGV4KTsKKyAgICAg
ICAgICAgIEFTU0VSVChyZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgKyttX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFsOworICAgICAgICAtLW1fY29u
ZGl0aW9uLm1fYmxvY2tlZDsKKworICAgICAgICBzaWduYWxzID0gMTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9nYXRlLCBJ
TkZJTklURSk7CisgICAgICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisgICAgICAg
IGlmIChtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPiBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0KSB7Cisg
ICAgICAgICAgICBpZiAobV9jb25kaXRpb24ubV90aW1lZE91dCAhPSAwKSB7CisgICAgICAgICAg
ICAgICAgbV9jb25kaXRpb24ubV9ibG9ja2VkIC09IG1fY29uZGl0aW9uLm1fdGltZWRPdXQ7Cisg
ICAgICAgICAgICAgICAgbV9jb25kaXRpb24ubV90aW1lZE91dCA9IDA7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBzaWduYWxzID0gbV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbCA9
IDE7CisgICAgICAgICAgICAtLW1fY29uZGl0aW9uLm1fYmxvY2tlZDsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dh
dGUsIDEsIDApOworICAgICAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICByZXMgPTo6UmVsZWFzZU11dGV4KG1fY29uZGl0aW9uLm1fbXV0ZXgpOworICAgIEFTU0VS
VChyZXMpOworCisgICAgaWYgKHNpZ25hbHMpIHsKKyAgICAgICAgcmVzID0gOjpSZWxlYXNlU2Vt
YXBob3JlKG1fY29uZGl0aW9uLm1fcXVldWUsIHNpZ25hbHMsIDApOworICAgICAgICBBU1NFUlQo
cmVzKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkQ29uZGl0aW9uOjpicm9hZGNhc3QoKQorewor
ICAgIHVuc2lnbmVkIHNpZ25hbHMgPSAwOworCisgICAgV09SRCByZXMgPSA6OldhaXRGb3JTaW5n
bGVPYmplY3QobV9jb25kaXRpb24ubV9tdXRleCwgSU5GSU5JVEUpOworICAgIEFTU0VSVChyZXMg
PT0gV0FJVF9PQkpFQ1RfMCk7CisKKyAgICBpZiAobV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVt
b3ZhbCAhPSAwKSB7IC8vIHRoZSBtX2dhdGUgaXMgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgaWYg
KG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9PSAwKSB7CisgICAgICAgICAgICByZXMgPSA6OlJlbGVh
c2VNdXRleChtX2NvbmRpdGlvbi5tX211dGV4KTsKKyAgICAgICAgICAgIEFTU0VSVChyZXMpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbV9jb25kaXRpb24ubV93
YWl0aW5nRm9yUmVtb3ZhbCArPSAoc2lnbmFscyA9IG1fY29uZGl0aW9uLm1fYmxvY2tlZCk7Cisg
ICAgICAgIG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
cmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0aW9uLm1fZ2F0ZSwgSU5GSU5JVEUp
OworICAgICAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworICAgICAgICBpZiAobV9j
b25kaXRpb24ubV9ibG9ja2VkID4gbV9jb25kaXRpb24ubV90aW1lZE91dCkgeworICAgICAgICAg
ICAgaWYgKG1fY29uZGl0aW9uLm1fdGltZWRPdXQgIT0gMCkgeworICAgICAgICAgICAgICAgIG1f
Y29uZGl0aW9uLm1fYmxvY2tlZCAtPSBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0OworICAgICAgICAg
ICAgICAgIG1fY29uZGl0aW9uLm1fdGltZWRPdXQgPSAwOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgc2lnbmFscyA9IG1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgPSBtX2NvbmRp
dGlvbi5tX2Jsb2NrZWQ7CisgICAgICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPSAwOwor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1f
Y29uZGl0aW9uLm1fZ2F0ZSwgMSwgMCk7CisgICAgICAgICAgICBBU1NFUlQocmVzKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIHJlcyA9IDo6UmVsZWFzZU11dGV4KG1fY29uZGl0aW9uLm1fbXV0
ZXgpOworICAgIEFTU0VSVChyZXMpOworCisgICAgaWYgKHNpZ25hbHMpIHsKKyAgICAgICAgcmVz
ID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0aW9uLm1fcXVldWUsIHNpZ25hbHMsIDApOwor
ICAgICAgICBBU1NFUlQocmVzKTsKKyAgICB9Cit9CisvLyBFbmQgQm9vc3QtcmVsYXRlZCBsb2dp
YworICAgIAorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogcGxhdGZvcm0vd2luL1RocmVh
ZGluZ1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vd2luL1RocmVhZGluZ1dpbi5jcHAJ
KHJldmlzaW9uIDI4NzkxKQorKysgcGxhdGZvcm0vd2luL1RocmVhZGluZ1dpbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTMxLDcgKzMxLDEwIEBACiAKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5j
bHVkZSAiUGFnZS5oIgorCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3aW5k
b3dzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC00
Miw2ICs0NSwxMDQgQEAgc3RhdGljIFVJTlQgdGhyZWFkaW5nRmlyZWRNZXNzYWdlID0gMDsKIGNv
bnN0IExQQ1dTVFIga1RocmVhZGluZ1dpbmRvd0NsYXNzTmFtZSA9IEwiVGhyZWFkaW5nV2luZG93
Q2xhc3MiOwogc3RhdGljIGJvb2wgcHJvY2Vzc2luZ0N1c3RvbVRocmVhZGluZ01lc3NhZ2UgPSBm
YWxzZTsKIAorc3RhdGljIE11dGV4JiB0aHJlYWRNYXBNdXRleCgpCit7CisgICAgc3RhdGljIE11
dGV4IG11dGV4OworICAgIHJldHVybiBtdXRleDsKK30KKworc3RhdGljIEhhc2hNYXA8RFdPUkQs
IEhBTkRMRT4mIHRocmVhZE1hcCgpCit7CisgICAgc3RhdGljIEhhc2hNYXA8RFdPUkQsIEhBTkRM
RT4gbWFwOworICAgIHJldHVybiBtYXA7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlVGhyZWFkSGFu
ZGxlQnlJZGVudGlmaWVyKERXT1JEIHRocmVhZElELCBIQU5ETEUgdGhyZWFkSGFuZGxlKQorewor
ICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJlYWRNYXBNdXRleCgpKTsKKyAgICB0aHJlYWRNYXAo
KS5hZGQodGhyZWFkSUQsIHRocmVhZEhhbmRsZSk7Cit9CisKK3N0YXRpYyBUaHJlYWRJZGVudGlm
aWVyIGlkZW50aWZpZXJCeVRocmVhZEhhbmRsZShjb25zdCBIQU5ETEUgdGhyZWFkSGFuZGxlKQor
eworICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJlYWRNYXBNdXRleCgpKTsKKworICAgIEhhc2hN
YXA8RFdPUkQsIEhBTkRMRT46Oml0ZXJhdG9yIGkgPSB0aHJlYWRNYXAoKS5iZWdpbigpOworICAg
IGZvciAoOyBpICE9IHRocmVhZE1hcCgpLmVuZCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgSEFO
RExFIGN1cnJIYW5kbGUgPSBpLT5zZWNvbmQ7CisgICAgICAgIGlmIChjdXJySGFuZGxlID09IHRo
cmVhZEhhbmRsZSkKKyAgICAgICAgICAgIHJldHVybiAoVGhyZWFkSWRlbnRpZmllcilpLT5maXJz
dDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEhBTkRMRSB0aHJlYWRIYW5k
bGVGb3JJZGVudGlmaWVyKFRocmVhZElkZW50aWZpZXIgaWQpCit7CisgICAgTXV0ZXhMb2NrZXIg
bG9ja2VyKHRocmVhZE1hcE11dGV4KCkpOworICAgIHJldHVybiB0aHJlYWRNYXAoKS5nZXQoaWQp
OworfQorCitzdGF0aWMgdm9pZCBjbGVhclRocmVhZEhhbmRsZUZvcklkZW50aWZpZXIoVGhyZWFk
SWRlbnRpZmllciBpZCkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrZXIodGhyZWFkTWFwTXV0ZXgo
KSk7CisKKyAgICBBU1NFUlQodGhyZWFkTWFwKCkuY29udGFpbnMoaWQpKTsKKyAgICAKKyAgICB0
aHJlYWRNYXAoKS5yZW1vdmUoaWQpOworfQorCitUaHJlYWRJZGVudGlmaWVyIGNyZWF0ZVRocmVh
ZChUaHJlYWRGdW5jdGlvbiBlbnRyeVBvaW50LCB2b2lkKiBkYXRhKQoreworICAgIERXT1JEIHRo
cmVhZElkZW50aWZpZXIgPSAwOworICAgIFRocmVhZElkZW50aWZpZXIgdGhyZWFkSUQgPSAwOwor
ICAgIEhBTkRMRSBoRXZlbnQgPSA6OkNyZWF0ZUV2ZW50KDAsIEZBTFNFLCBGQUxTRSwgMCk7Cisg
ICAgSEFORExFIHRocmVhZEhhbmRsZSA9IDo6Q3JlYXRlVGhyZWFkKDAsIDAsIChMUFRIUkVBRF9T
VEFSVF9ST1VUSU5FKWVudHJ5UG9pbnQsIGRhdGEsIDAsICZ0aHJlYWRJZGVudGlmaWVyKTsKKyAg
ICBpZiAoMCA9PSB0aHJlYWRIYW5kbGUpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8g
Y3JlYXRlIHRocmVhZCBhdCBlbnRyeSBwb2ludCAlcCB3aXRoIGRhdGEgJXAiLCBlbnRyeVBvaW50
LCBkYXRhKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdGhyZWFkSUQgPSAoVGhy
ZWFkSWRlbnRpZmllcil0aHJlYWRJZGVudGlmaWVyOworICAgIHN0b3JlVGhyZWFkSGFuZGxlQnlJ
ZGVudGlmaWVyKHRocmVhZElkZW50aWZpZXIsIHRocmVhZEhhbmRsZSk7CisKKyAgICBMT0coVGhy
ZWFkaW5nLCAiQ3JlYXRlZCB0aHJlYWQgd2l0aCB0aHJlYWQgaWQgJXUiLCB0aHJlYWRJRCk7Cisg
ICAgcmV0dXJuIHRocmVhZElEOworfQorCitpbnQgd2FpdEZvclRocmVhZENvbXBsZXRpb24oVGhy
ZWFkSWRlbnRpZmllciB0aHJlYWRJRCwgdm9pZCoqIHJlc3VsdCkKK3sKKyAgICBBU1NFUlQodGhy
ZWFkSUQpOworICAgIAorICAgIEhBTkRMRSB0aHJlYWRIYW5kbGUgPSB0aHJlYWRIYW5kbGVGb3JJ
ZGVudGlmaWVyKHRocmVhZElEKTsKKyAgICBpZiAoIXRocmVhZEhhbmRsZSkKKyAgICAgICAgTE9H
X0VSUk9SKCJUaHJlYWRJZGVudGlmaWVyICV1IGRpZCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3Rp
dmUgdGhyZWFkIHdoZW4gdHJ5aW5nIHRvIHF1aXQiLCB0aHJlYWRJRCk7CisgCisgICAgRFdPUkQg
am9pblJlc3VsdCA9IDo6V2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWRIYW5kbGUsIElORklOSVRF
KTsKKyAgICBpZiAoam9pblJlc3VsdCA9PSBXQUlUX0ZBSUxFRCkKKyAgICAgICAgTE9HX0VSUk9S
KCJUaHJlYWRJZGVudGlmaWVyICV1IHdhcyBmb3VuZCB0byBiZSBkZWFkbG9ja2VkIHRyeWluZyB0
byBxdWl0IiwgdGhyZWFkSUQpOworCisgICAgOjpDbG9zZUhhbmRsZSh0aHJlYWRIYW5kbGUpOwor
ICAgIGNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcih0aHJlYWRJRCk7CisKKyAgICByZXR1
cm4gam9pblJlc3VsdDsKK30KKwordm9pZCBkZXRhY2hUaHJlYWQoVGhyZWFkSWRlbnRpZmllciB0
aHJlYWRJRCkKK3sKKyAgICBBU1NFUlQodGhyZWFkSUQpOworICAgIAorICAgIEhBTkRMRSB0aHJl
YWRIYW5kbGUgPSB0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKHRocmVhZElEKTsKKyAgICBpZiAo
dGhyZWFkSGFuZGxlKQorICAgICAgICA6OkNsb3NlSGFuZGxlKHRocmVhZEhhbmRsZSk7CisgICAg
Y2xlYXJUaHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKHRocmVhZElEKTsKK30KKworVGhyZWFkSWRl
bnRpZmllciBjdXJyZW50VGhyZWFkKCkKK3sKKyAgICByZXR1cm4gKFRocmVhZElkZW50aWZpZXIp
OjpHZXRDdXJyZW50VGhyZWFkSWQgKCk7Cit9CisKIHN0YXRpYyBNdXRleCYgZnVuY3Rpb25RdWV1
ZU11dGV4KCkKIHsKICAgICBzdGF0aWMgTXV0ZXggc3RhdGljRnVuY3Rpb25RdWV1ZU11dGV4Owo=
</data>
<flag name="review"
          id="7783"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17965</attachid>
            <date>2007-12-17 10:07:33 -0800</date>
            <delta_ts>2007-12-17 13:25:37 -0800</delta_ts>
            <desc>Updated based on review.</desc>
            <filename>threading.patch</filename>
            <type>text/plain</type>
            <size>19951</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI4ODEx
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzkgQEAKKzIwMDctMTIt
MTcgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBB
RERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgVXBkYXRlcyB0byBzdXBwb3J0IG5hdGl2ZSB3aW5k
b3dzIHRocmVhZGluZyBwcmltaXRpdmVzLgorICAgICAgICByYXRoZXIgdGhhbiBwdGhyZWFkcyBl
bXVsYXRpb24gbGlicmFyeSAoc2VlIEJ1ZyMxNjQ2NCkuCisKKyAgICAgICAgKiBXZWJDb3JlLnZj
cHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBjb25maWcuaDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9UaHJlYWRpbmcuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vTXV0ZXhXaW4uY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4OjpNdXRleCk6CisgICAgICAgIChXZWJDb3Jl
OjpNdXRleDo6fk11dGV4KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4Ojpsb2NrKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok11dGV4Ojp0cnlMb2NrKToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4Ojp1
bmxvY2spOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9UaHJlYWRDb25kaXRpb25XaW4uY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZENvbmRpdGlvbjo6VGhyZWFkQ29uZGl0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZENvbmRpdGlvbjo6flRocmVhZENvbmRpdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRDb25kaXRpb246OndhaXQpOgorICAgICAgICAoV2Vi
Q29yZTo6VGhyZWFkQ29uZGl0aW9uOjpzaWduYWwpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFk
Q29uZGl0aW9uOjpicm9hZGNhc3QpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9UaHJlYWRpbmdX
aW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6dGhyZWFkTWFwTXV0ZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6dGhyZWFkTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OnN0b3JlVGhyZWFkSGFuZGxlQnlJ
ZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OmlkZW50aWZpZXJCeVRocmVhZEhhbmRsZSk6
CisgICAgICAgIChXZWJDb3JlOjp0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKToKKyAgICAgICAg
KFdlYkNvcmU6OmNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcik6CisgICAgICAgIChXZWJD
b3JlOjpjcmVhdGVUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6d2FpdEZvclRocmVhZENvbXBs
ZXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6ZGV0YWNoVGhyZWFkKToKKyAgICAgICAgKFdlYkNv
cmU6OmN1cnJlbnRUaHJlYWQpOgorCiAyMDA3LTEyLTE3ICBEYXJpbiBBZGxlciAgPGRhcmluQGFw
cGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBNYXJrIFJvd2UuCkluZGV4OiBjb25maWcu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBjb25maWcuaAkocmV2aXNpb24gMjg3OTEpCisrKyBjb25maWcuaAko
d29ya2luZyBjb3B5KQpAQCAtODgsNyArODgsNyBAQAogI2RlZmluZSBXVEZfVVNFX0NGTkVUV09S
SyAxCiAjdW5kZWYgV1RGX1VTRV9XSU5JTkVUCiAjZGVmaW5lIFdURl9QTEFURk9STV9DRiAxCi0j
ZGVmaW5lIFdURl9VU0VfUFRIUkVBRFMgMQorI2RlZmluZSBXVEZfVVNFX1BUSFJFQURTIDAKICNl
bmRpZgogCiAjaWYgUExBVEZPUk0oTUFDKQpJbmRleDogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52
Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlz
aW9uIDI4NzkxKQorKysgV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTM1NDIsNiArMzU0MiwxMCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZp
bGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cd2luXE11dGV4V2luLmNwcCINCisJ
CQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxw
bGF0Zm9ybVx3aW5cUGFzdGVib2FyZFdpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkBA
IC0zNjAyLDYgKzM2MDYsMTAgQEAKIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQogCQkJCTxGaWxlDQor
CQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXHdpblxUaHJlYWRDb25kaXRpb25XaW4uY3Bw
Ig0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXHBsYXRmb3JtXHdpblxUaHJlYWRpbmdXaW4uY3BwIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+
DQpAQCAtNDA3OCwxNCArNDA4Niw2IEBACiAJCQkJPC9GaWx0ZXI+DQogCQkJPC9GaWx0ZXI+DQog
CQkJPEZpbHRlcg0KLQkJCQlOYW1lPSJwdGhyZWFkcyINCi0JCQkJPg0KLQkJCQk8RmlsZQ0KLQkJ
CQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxwdGhyZWFkc1xUaHJlYWRpbmdQdGhyZWFkcy5j
cHAiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQk8L0ZpbHRlcj4NCi0JCQk8RmlsdGVyDQog
CQkJCU5hbWU9InNxbCINCiAJCQkJPg0KIAkJCQk8RmlsZQ0KSW5kZXg6IHBsYXRmb3JtL1RocmVh
ZGluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL1RocmVhZGluZy5oCShyZXZpc2lvbiAyODc5
MSkKKysrIHBsYXRmb3JtL1RocmVhZGluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC02OSw2ICs2OSwx
OSBAQCB0eXBlZGVmIEdDb25kKiBQbGF0Zm9ybUNvbmRpdGlvbjsKICNlbGlmIFBMQVRGT1JNKFFU
KQogdHlwZWRlZiBRTXV0ZXgqIFBsYXRmb3JtTXV0ZXg7CiB0eXBlZGVmIFFXYWl0Q29uZGl0aW9u
KiBQbGF0Zm9ybUNvbmRpdGlvbjsKKyNlbGlmIFBMQVRGT1JNKFdJTl9PUykKK3N0cnVjdCBQbGF0
Zm9ybU11dGV4IHsKKyAgICBDUklUSUNBTF9TRUNUSU9OIG1faW50ZXJuYWxNdXRleDsKKyAgICBz
aXplX3QgbV9yZWN1cnNpb25Db3VudDsKK307CitzdHJ1Y3QgUGxhdGZvcm1Db25kaXRpb24gewor
ICAgIHNpemVfdCBtX3RpbWVkT3V0OworICAgIHNpemVfdCBtX2Jsb2NrZWQ7CisgICAgc2l6ZV90
IG1fd2FpdGluZ0ZvclJlbW92YWw7CisgICAgSEFORExFIG1fZ2F0ZTsKKyAgICBIQU5ETEUgbV9x
dWV1ZTsKKyAgICBIQU5ETEUgbV9tdXRleDsKK307CiAjZWxzZQogdHlwZWRlZiB2b2lkKiBQbGF0
Zm9ybU11dGV4OwogdHlwZWRlZiB2b2lkKiBQbGF0Zm9ybUNvbmRpdGlvbjsKSW5kZXg6IHBsYXRm
b3JtL3dpbi9NdXRleFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vd2luL011dGV4V2lu
LmNwcAkocmV2aXNpb24gMCkKKysrIHBsYXRmb3JtL3dpbi9NdXRleFdpbi5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEJyZW50IEZ1bGdo
YW0KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUg
Q29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRocmVhZGluZy5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK011dGV4OjpNdXRleCgpCit7CisgICAgbV9tdXRleC5tX3JlY3Vyc2lv
bkNvdW50ID0gMDsKKyAgICA6OkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJm1fbXV0ZXgubV9p
bnRlcm5hbE11dGV4KTsKK30KKworTXV0ZXg6On5NdXRleCgpCit7CisgICAgOjpEZWxldGVDcml0
aWNhbFNlY3Rpb24oJm1fbXV0ZXgubV9pbnRlcm5hbE11dGV4KTsKK30KKwordm9pZCBNdXRleDo6
bG9jaygpCit7CisgICAgOjpFbnRlckNyaXRpY2FsU2VjdGlvbigmbV9tdXRleC5tX2ludGVybmFs
TXV0ZXgpOworICAgICsrbV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50OworfQorICAgIAorYm9vbCBN
dXRleDo6dHJ5TG9jaygpCit7CisgICAgLy8gVGhpcyBtZXRob2QgaXMgbW9kZWxlZCBhZnRlciB0
aGUgYmVoYXZpb3Igb2YgcHRocmVhZF9tdXRleF90cnlsb2NrLAorICAgIC8vIHdoaWNoIHdpbGwg
cmV0dXJuIGFuIGVycm9yIGlmIHRoZSBsb2NrIGlzIGFscmVhZHkgb3duZWQgYnkgdGhlCisgICAg
Ly8gY3VycmVudCB0aHJlYWQuICBTaW5jZSB0aGUgcHJpbWl0aXZlIFdpbjMyICdUcnlFbnRlckNy
aXRpY2FsU2VjdGlvbicKKyAgICAvLyB0cmVhdHMgdGhpcyBhcyBhIHN1Y2Nlc3NmdWwgY2FzZSwg
aXQgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2Ygc2V2ZXJhbAorICAgIC8vIHRlc3RzIGluIFdlYktp
dCB0aGF0IGNoZWNrIHRvIHNlZSBpZiB0aGUgY3VycmVudCB0aHJlYWQgYWxyZWFkeQorICAgIC8v
IG93bmVkIHRoaXMgbXV0ZXggKHNlZSBlLmcuLCBJY29uRGF0YWJhc2U6OmdldE9yQ3JlYXRlSWNv
blJlY29yZCkKKyAgICBEV09SRCByZXN1bHQgPSA6OlRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKCZt
X211dGV4Lm1faW50ZXJuYWxNdXRleCk7CisgICAgCisgICAgaWYgKHJlc3VsdCAhPSAwKSB7ICAg
ICAgIC8vIFdlIGdvdCB0aGUgbG9jaworICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBhbHJlYWR5
IGhhZCB0aGUgbG9jaywgd2UgbXVzdCB1bmxvY2sgYW5kCisgICAgICAgIC8vIHJldHVybiBmYWxz
ZSBzbyB0aGF0IHdlIG1pbWljIHRoZSBiZWhhdmlvciBvZiBQT1NJWCdzCisgICAgICAgIC8vIHB0
aHJlYWRfbXV0ZXhfdHJ5bG9jazoKKyAgICAgICAgaWYgKG1fbXV0ZXgubV9yZWN1cnNpb25Db3Vu
dCA+IDApIHsKKyAgICAgICAgICAgIDo6TGVhdmVDcml0aWNhbFNlY3Rpb24oJm1fbXV0ZXgubV9p
bnRlcm5hbE11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisg
ICAgICAgICsrbV9tdXRleC5tX3JlY3Vyc2lvbkNvdW50OworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTXV0ZXg6OnVubG9jaygpCit7
CisgICAgLS1tX211dGV4Lm1fcmVjdXJzaW9uQ291bnQ7CisgICAgOjpMZWF2ZUNyaXRpY2FsU2Vj
dGlvbigmbV9tdXRleC5tX2ludGVybmFsTXV0ZXgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBwbGF0Zm9ybS93aW4vVGhyZWFkQ29uZGl0aW9uV2luLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBwbGF0Zm9ybS93aW4vVGhyZWFkQ29uZGl0aW9uV2luLmNwcAkocmV2aXNpb24gMCkKKysr
IHBsYXRmb3JtL3dpbi9UaHJlYWRDb25kaXRpb25XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDI0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE5vdGU6ICBUaGUgaW1wbGVt
ZW50YXRpb24gb2YgY29uZGl0aW9uIHZhcmlhYmxlcyB1bmRlciB0aGUgV2luZG93cworICogcGxh
Zm9ybSB3YXMgYmFzZWQgb24gdGhhdCBvZiB0aGUgZXhjZWxsZW50IEJPT1NUIEMrKyBsaWJyYXJ5
LiAgSXQKKyAqIGhhcyBiZWVuIHJld3JpdHRlbiB0byBmaXQgaW4gd2l0aCB0aGUgV2ViS2l0IGFy
Y2hpdGVjdHVyZSBhbmQgdG8KKyAqIHVzZSBpdHMgY29kaW5nIGNvbnZlbnRpb25zLgorICogPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGUgQm9vc3QgbGljZW5zZSBpcyB2aXJ0dWFsbHkg
aWRlbnRpY2FsIHRvIHRoZSBBcHBsZSB2YXJpYXRpb24gYXQgdGhlCisgKiB0b3Agb2YgdGhpcyBm
aWxlLCBidXQgaXMgaW5jbHVkZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzOgorICoKKyAqIEJvb3N0
IFNvZnR3YXJlIExpY2Vuc2UgLSBWZXJzaW9uIDEuMCAtIEF1Z3VzdCAxN3RoLCAyMDAzCisgKgor
ICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBw
ZXJzb24gb3Igb3JnYW5pemF0aW9uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBzb2Z0d2Fy
ZSBhbmQgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gY292ZXJlZCBieQorICogdGhpcyBsaWNl
bnNlICh0aGUgIlNvZnR3YXJlIikgdG8gdXNlLCByZXByb2R1Y2UsIGRpc3BsYXksIGRpc3RyaWJ1
dGUsCisgKiBleGVjdXRlLCBhbmQgdHJhbnNtaXQgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcHJlcGFy
ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQorICogU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhp
cmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8KKyAqIGRvIHNv
LCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgorICoKKyAqIFRoZSBjb3B5cmlnaHQgbm90
aWNlcyBpbiB0aGUgU29mdHdhcmUgYW5kIHRoaXMgZW50aXJlIHN0YXRlbWVudCwgaW5jbHVkaW5n
CisgKiB0aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlvbiBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLAorICogbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9m
IHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kCisgKiBhbGwgZGVyaXZhdGl2
ZSB3b3JrcyBvZiB0aGUgU29mdHdhcmUsIHVubGVzcyBzdWNoIGNvcGllcyBvciBkZXJpdmF0aXZl
CisgKiB3b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUtZXhlY3V0YWJsZSBv
YmplY3QgY29kZSBnZW5lcmF0ZWQgYnkKKyAqIGEgc291cmNlIGxhbmd1YWdlIHByb2Nlc3Nvci4K
KyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U
WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1Qg
TElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElO
IE5PIEVWRU5UCisgKiBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RS
SUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERBTUFHRVMgT1IgT1RI
RVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAq
IEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUg
T1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiVGhy
ZWFkaW5nLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGNvbnN0IGxvbmcgTWF4U2VtYXBob3JlQ291bnQgPSBz
dGF0aWNfY2FzdDxsb25nPigofjB1KSA+PiAxKTsKKworVGhyZWFkQ29uZGl0aW9uOjpUaHJlYWRD
b25kaXRpb24oKQoreworICAgIG1fY29uZGl0aW9uLm1fdGltZWRPdXQgPSAwOworICAgIG1fY29u
ZGl0aW9uLm1fYmxvY2tlZCA9IDA7CisgICAgbV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVtb3Zh
bCA9IDA7CisgICAgbV9jb25kaXRpb24ubV9nYXRlID0gOjpDcmVhdGVTZW1hcGhvcmUoMCwgMSwg
MSwgMCk7CisgICAgbV9jb25kaXRpb24ubV9xdWV1ZSA9IDo6Q3JlYXRlU2VtYXBob3JlKDAsIDAs
IE1heFNlbWFwaG9yZUNvdW50LCAwKTsKKyAgICBtX2NvbmRpdGlvbi5tX211dGV4ID0gOjpDcmVh
dGVNdXRleCgwLCAwLCAwKTsKKworICAgIGlmICghbV9jb25kaXRpb24ubV9nYXRlIHx8ICFtX2Nv
bmRpdGlvbi5tX3F1ZXVlIHx8ICFtX2NvbmRpdGlvbi5tX211dGV4KSB7CisgICAgICAgIGlmICht
X2NvbmRpdGlvbi5tX2dhdGUpCisgICAgICAgICAgICA6OkNsb3NlSGFuZGxlKG1fY29uZGl0aW9u
Lm1fZ2F0ZSk7CisgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX3F1ZXVlKQorCSAgICA6OkNsb3Nl
SGFuZGxlKG1fY29uZGl0aW9uLm1fcXVldWUpOworICAgICAgICBpZiAobV9jb25kaXRpb24ubV9t
dXRleCkKKwkgICAgOjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX211dGV4KTsKKyAgICB9Cit9
CisKK1RocmVhZENvbmRpdGlvbjo6flRocmVhZENvbmRpdGlvbigpCit7CisgICAgOjpDbG9zZUhh
bmRsZShtX2NvbmRpdGlvbi5tX2dhdGUpOworICAgIDo6Q2xvc2VIYW5kbGUobV9jb25kaXRpb24u
bV9xdWV1ZSk7CisgICAgOjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX211dGV4KTsKK30KKyAg
ICAKK3ZvaWQgVGhyZWFkQ29uZGl0aW9uOjp3YWl0KE11dGV4JiBtdXRleCkKK3sKKyAgICBQbGF0
Zm9ybU11dGV4JiBjcyA9IG11dGV4LmltcGwoKTsKKworICAgIC8vIEVudGVyIHRoZSB3YWl0IHN0
YXRlLgorICAgIERXT1JEIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5t
X2dhdGUsIElORklOSVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworICAg
ICsrbV9jb25kaXRpb24ubV9ibG9ja2VkOworICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZSht
X2NvbmRpdGlvbi5tX2dhdGUsIDEsIDApOworICAgIEFTU0VSVChyZXMpOworCisgICAgOjpMZWF2
ZUNyaXRpY2FsU2VjdGlvbigmY3MubV9pbnRlcm5hbE11dGV4KTsKKworICAgIHJlcyA9IDo6V2Fp
dEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX3F1ZXVlLCBJTkZJTklURSk7CisgICAgQVNT
RVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKworICAgIHVuc2lnbmVkIHdhc19nb25lPTA7CisK
KyAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9tdXRleCwgSU5G
SU5JVEUpOworICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisgICAgc2l6ZV90IHdh
c1dhaXRpbmcgPSBtX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFsOworICAgIHNpemVfdCB3
YXNUaW1lZE91dCA9IG1fY29uZGl0aW9uLm1fdGltZWRPdXQ7CisgICAgaWYgKHdhc1dhaXRpbmcg
IT0gMCkgeworICAgICAgICBpZiAoLS1tX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFsID09
IDApIHsKKyAgICAgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgIT0gMCkgeworICAg
ICAgICAgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dhdGUs
IDEsIDApOyAgLy8gb3BlbiBtX2dhdGUKKyAgICAgICAgICAgICAgICBBU1NFUlQocmVzKTsKKyAg
ICAgICAgICAgICAgICB3YXNXYWl0aW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGVsc2UgaWYgKG1fY29uZGl0aW9uLm1fdGltZWRPdXQgIT0gMCkKKyAgICAgICAgICAgICAgICBt
X2NvbmRpdGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKytt
X2NvbmRpdGlvbi5tX3RpbWVkT3V0ID09ICgoc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46
Om1heCkoKSAvIDIpKSB7CisgICAgICAgIC8vIHRpbWVvdXQgb2NjdXJlZCwgbm9ybWFsaXplIHRo
ZSBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0IGNvdW50CisgICAgICAgIC8vIHRoaXMgbWF5IG9jY3Vy
IGlmIG1hbnkgY2FsbHMgdG8gd2FpdCB3aXRoIGEgdGltZW91dCBhcmUgbWFkZSBhbmQKKyAgICAg
ICAgLy8gbm8gY2FsbCB0byBub3RpZnlfKiBpcyBtYWRlCisgICAgICAgIHJlcyA9IDo6V2FpdEZv
clNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX2dhdGUsIElORklOSVRFKTsKKyAgICAgICAgQVNT
RVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKyAgICAgICAgbV9jb25kaXRpb24ubV9ibG9ja2Vk
IC09IG1fY29uZGl0aW9uLm1fdGltZWRPdXQ7CisgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFw
aG9yZShtX2NvbmRpdGlvbi5tX2dhdGUsIDEsIDApOworICAgICAgICBBU1NFUlQocmVzKTsKKyAg
ICAgICAgbV9jb25kaXRpb24ubV90aW1lZE91dCA9IDA7CisgICAgfQorICAgIHJlcyA9IDo6UmVs
ZWFzZU11dGV4KG1fY29uZGl0aW9uLm1fbXV0ZXgpOworICAgIEFTU0VSVChyZXMpOworCisgICAg
aWYgKHdhc1dhaXRpbmcgPT0gMSkgeworICAgICAgICBmb3IgKC8qKi8gOyB3YXNUaW1lZE91dDsg
LS13YXNUaW1lZE91dCkgeworICAgICAgICAgICAgLy8gYmV0dGVyIG5vdyB0aGFuIHNwdXJpb3Vz
IGxhdGVyCisgICAgICAgICAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRp
b24ubV9xdWV1ZSwgSU5GSU5JVEUpOworICAgICAgICAgICAgQVNTRVJUKHJlcyA9PSBXQUlUX09C
SkVDVF8wKTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1hcGhvcmUobV9j
b25kaXRpb24ubV9nYXRlLCAxLCAwKTsKKyAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgfQorCisg
ICAgOjpFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmNzLm1faW50ZXJuYWxNdXRleCk7Cit9CisKK3Zv
aWQgVGhyZWFkQ29uZGl0aW9uOjpzaWduYWwoKQoreworICAgIHVuc2lnbmVkIHNpZ25hbHMgPSAw
OworCisgICAgRFdPUkQgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0aW9uLm1f
bXV0ZXgsIElORklOSVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworCisg
ICAgaWYgKG1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgIT0gMCkgeyAvLyB0aGUgbV9n
YXRlIGlzIGFscmVhZHkgY2xvc2VkCisgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX2Jsb2NrZWQg
PT0gMCkgeworICAgICAgICAgICAgcmVzID0gOjpSZWxlYXNlTXV0ZXgobV9jb25kaXRpb24ubV9t
dXRleCk7CisgICAgICAgICAgICBBU1NFUlQocmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgICsrbV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbDsKKyAg
ICAgICAgLS1tX2NvbmRpdGlvbi5tX2Jsb2NrZWQ7CisKKyAgICAgICAgc2lnbmFscyA9IDE7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0
aW9uLm1fZ2F0ZSwgSU5GSU5JVEUpOworICAgICAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNU
XzApOworICAgICAgICBpZiAobV9jb25kaXRpb24ubV9ibG9ja2VkID4gbV9jb25kaXRpb24ubV90
aW1lZE91dCkgeworICAgICAgICAgICAgaWYgKG1fY29uZGl0aW9uLm1fdGltZWRPdXQgIT0gMCkg
eworICAgICAgICAgICAgICAgIG1fY29uZGl0aW9uLm1fYmxvY2tlZCAtPSBtX2NvbmRpdGlvbi5t
X3RpbWVkT3V0OworICAgICAgICAgICAgICAgIG1fY29uZGl0aW9uLm1fdGltZWRPdXQgPSAwOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lnbmFscyA9IG1fY29uZGl0aW9uLm1fd2FpdGlu
Z0ZvclJlbW92YWwgPSAxOworICAgICAgICAgICAgLS1tX2NvbmRpdGlvbi5tX2Jsb2NrZWQ7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSA6OlJlbGVhc2VTZW1hcGhvcmUobV9j
b25kaXRpb24ubV9nYXRlLCAxLCAwKTsKKyAgICAgICAgICAgIEFTU0VSVChyZXMpOworICAgICAg
ICB9CisgICAgfQorCisgICAgcmVzID06OlJlbGVhc2VNdXRleChtX2NvbmRpdGlvbi5tX211dGV4
KTsKKyAgICBBU1NFUlQocmVzKTsKKworICAgIGlmIChzaWduYWxzKSB7CisgICAgICAgIHJlcyA9
IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX3F1ZXVlLCBzaWduYWxzLCAwKTsKKyAg
ICAgICAgQVNTRVJUKHJlcyk7CisgICAgfQorfQorCit2b2lkIFRocmVhZENvbmRpdGlvbjo6YnJv
YWRjYXN0KCkKK3sKKyAgICB1bnNpZ25lZCBzaWduYWxzID0gMDsKKworICAgIFdPUkQgcmVzID0g
OjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0aW9uLm1fbXV0ZXgsIElORklOSVRFKTsKKyAg
ICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworCisgICAgaWYgKG1fY29uZGl0aW9uLm1f
d2FpdGluZ0ZvclJlbW92YWwgIT0gMCkgeyAvLyB0aGUgbV9nYXRlIGlzIGFscmVhZHkgY2xvc2Vk
CisgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPT0gMCkgeworICAgICAgICAgICAg
cmVzID0gOjpSZWxlYXNlTXV0ZXgobV9jb25kaXRpb24ubV9tdXRleCk7CisgICAgICAgICAgICBB
U1NFUlQocmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1f
Y29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgKz0gKHNpZ25hbHMgPSBtX2NvbmRpdGlvbi5t
X2Jsb2NrZWQpOworICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPSAwOworICAgIH0gZWxz
ZSB7CisgICAgICAgIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX2dh
dGUsIElORklOSVRFKTsKKyAgICAgICAgQVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKyAg
ICAgICAgaWYgKG1fY29uZGl0aW9uLm1fYmxvY2tlZCA+IG1fY29uZGl0aW9uLm1fdGltZWRPdXQp
IHsKKyAgICAgICAgICAgIGlmIChtX2NvbmRpdGlvbi5tX3RpbWVkT3V0ICE9IDApIHsKKyAgICAg
ICAgICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgLT0gbV9jb25kaXRpb24ubV90aW1lZE91
dDsKKyAgICAgICAgICAgICAgICBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHNpZ25hbHMgPSBtX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1v
dmFsID0gbV9jb25kaXRpb24ubV9ibG9ja2VkOworICAgICAgICAgICAgbV9jb25kaXRpb24ubV9i
bG9ja2VkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IDo6UmVsZWFz
ZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dhdGUsIDEsIDApOworICAgICAgICAgICAgQVNTRVJU
KHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSA6OlJlbGVhc2VNdXRleChtX2Nv
bmRpdGlvbi5tX211dGV4KTsKKyAgICBBU1NFUlQocmVzKTsKKworICAgIGlmIChzaWduYWxzKSB7
CisgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX3F1ZXVlLCBz
aWduYWxzLCAwKTsKKyAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgfQorfQorICAgIAorfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogcGxhdGZvcm0vd2luL1RocmVhZGluZ1dpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcGxhdGZvcm0vd2luL1RocmVhZGluZ1dpbi5jcHAJKHJldmlzaW9uIDI4Nzkx
KQorKysgcGxhdGZvcm0vd2luL1RocmVhZGluZ1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3
LDExICsyNywxMiBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUaHJl
YWRpbmcuaCIKLQogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJQYWdlLmgiCisjaW5j
bHVkZSAiVGhyZWFkaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx3aW5kb3dz
Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBA
IC00Miw2ICs0MywxMDEgQEAgc3RhdGljIFVJTlQgdGhyZWFkaW5nRmlyZWRNZXNzYWdlID0gMDsK
IGNvbnN0IExQQ1dTVFIga1RocmVhZGluZ1dpbmRvd0NsYXNzTmFtZSA9IEwiVGhyZWFkaW5nV2lu
ZG93Q2xhc3MiOwogc3RhdGljIGJvb2wgcHJvY2Vzc2luZ0N1c3RvbVRocmVhZGluZ01lc3NhZ2Ug
PSBmYWxzZTsKIAorc3RhdGljIE11dGV4JiB0aHJlYWRNYXBNdXRleCgpCit7CisgICAgc3RhdGlj
IE11dGV4IG11dGV4OworICAgIHJldHVybiBtdXRleDsKK30KKworc3RhdGljIEhhc2hNYXA8RFdP
UkQsIEhBTkRMRT4mIHRocmVhZE1hcCgpCit7CisgICAgc3RhdGljIEhhc2hNYXA8RFdPUkQsIEhB
TkRMRT4gbWFwOworICAgIHJldHVybiBtYXA7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlVGhyZWFk
SGFuZGxlQnlJZGVudGlmaWVyKERXT1JEIHRocmVhZElELCBIQU5ETEUgdGhyZWFkSGFuZGxlKQor
eworICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJlYWRNYXBNdXRleCgpKTsKKyAgICB0aHJlYWRN
YXAoKS5hZGQodGhyZWFkSUQsIHRocmVhZEhhbmRsZSk7Cit9CisKK3N0YXRpYyBUaHJlYWRJZGVu
dGlmaWVyIGlkZW50aWZpZXJCeVRocmVhZEhhbmRsZShIQU5ETEUgdGhyZWFkSGFuZGxlKQorewor
ICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJlYWRNYXBNdXRleCgpKTsKKworICAgIEhhc2hNYXA8
RFdPUkQsIEhBTkRMRT46Oml0ZXJhdG9yIGkgPSB0aHJlYWRNYXAoKS5iZWdpbigpOworICAgIGZv
ciAoOyBpICE9IHRocmVhZE1hcCgpLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKGktPnNlY29u
ZCA9PSB0aHJlYWRIYW5kbGUpCisgICAgICAgICAgICByZXR1cm4gaS0+Zmlyc3Q7CisgICAgfQor
CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIQU5ETEUgdGhyZWFkSGFuZGxlRm9ySWRlbnRp
ZmllcihUaHJlYWRJZGVudGlmaWVyIGlkKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tlcih0aHJl
YWRNYXBNdXRleCgpKTsKKyAgICByZXR1cm4gdGhyZWFkTWFwKCkuZ2V0KGlkKTsKK30KKworc3Rh
dGljIHZvaWQgY2xlYXJUaHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKFRocmVhZElkZW50aWZpZXIg
aWQpCit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHRocmVhZE1hcE11dGV4KCkpOworICAgIEFT
U0VSVCh0aHJlYWRNYXAoKS5jb250YWlucyhpZCkpOworICAgIHRocmVhZE1hcCgpLnJlbW92ZShp
ZCk7Cit9CisKK1RocmVhZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkKFRocmVhZEZ1bmN0aW9uIGVu
dHJ5UG9pbnQsIHZvaWQqIGRhdGEpCit7CisgICAgRFdPUkQgdGhyZWFkSWRlbnRpZmllciA9IDA7
CisgICAgVGhyZWFkSWRlbnRpZmllciB0aHJlYWRJRCA9IDA7CisgICAgSEFORExFIGhFdmVudCA9
IDo6Q3JlYXRlRXZlbnQoMCwgRkFMU0UsIEZBTFNFLCAwKTsKKyAgICBIQU5ETEUgdGhyZWFkSGFu
ZGxlID0gOjpDcmVhdGVUaHJlYWQoMCwgMCwgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpZW50cnlQ
b2ludCwgZGF0YSwgMCwgJnRocmVhZElkZW50aWZpZXIpOworICAgIGlmICghdGhyZWFkSGFuZGxl
KSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQgYXQgZW50cnkg
cG9pbnQgJXAgd2l0aCBkYXRhICVwIiwgZW50cnlQb2ludCwgZGF0YSk7CisgICAgICAgIHJldHVy
biAwOworICAgIH0KKworICAgIHRocmVhZElEID0gc3RhdGljX2Nhc3Q8VGhyZWFkSWRlbnRpZmll
cj4odGhyZWFkSWRlbnRpZmllcik7CisgICAgc3RvcmVUaHJlYWRIYW5kbGVCeUlkZW50aWZpZXIo
dGhyZWFkSWRlbnRpZmllciwgdGhyZWFkSGFuZGxlKTsKKworICAgIExPRyhUaHJlYWRpbmcsICJD
cmVhdGVkIHRocmVhZCB3aXRoIHRocmVhZCBpZCAldSIsIHRocmVhZElEKTsKKyAgICByZXR1cm4g
dGhyZWFkSUQ7Cit9CisKK2ludCB3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbihUaHJlYWRJZGVudGlm
aWVyIHRocmVhZElELCB2b2lkKiogcmVzdWx0KQoreworICAgIEFTU0VSVCh0aHJlYWRJRCk7Cisg
ICAgCisgICAgSEFORExFIHRocmVhZEhhbmRsZSA9IHRocmVhZEhhbmRsZUZvcklkZW50aWZpZXIo
dGhyZWFkSUQpOworICAgIGlmICghdGhyZWFkSGFuZGxlKQorICAgICAgICBMT0dfRVJST1IoIlRo
cmVhZElkZW50aWZpZXIgJXUgZGlkIG5vdCBjb3JyZXNwb25kIHRvIGFuIGFjdGl2ZSB0aHJlYWQg
d2hlbiB0cnlpbmcgdG8gcXVpdCIsIHRocmVhZElEKTsKKyAKKyAgICBEV09SRCBqb2luUmVzdWx0
ID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZEhhbmRsZSwgSU5GSU5JVEUpOworICAgIGlm
IChqb2luUmVzdWx0ID09IFdBSVRfRkFJTEVEKQorICAgICAgICBMT0dfRVJST1IoIlRocmVhZElk
ZW50aWZpZXIgJXUgd2FzIGZvdW5kIHRvIGJlIGRlYWRsb2NrZWQgdHJ5aW5nIHRvIHF1aXQiLCB0
aHJlYWRJRCk7CisKKyAgICA6OkNsb3NlSGFuZGxlKHRocmVhZEhhbmRsZSk7CisgICAgY2xlYXJU
aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKHRocmVhZElEKTsKKworICAgIHJldHVybiBqb2luUmVz
dWx0OworfQorCit2b2lkIGRldGFjaFRocmVhZChUaHJlYWRJZGVudGlmaWVyIHRocmVhZElEKQor
eworICAgIEFTU0VSVCh0aHJlYWRJRCk7CisgICAgCisgICAgSEFORExFIHRocmVhZEhhbmRsZSA9
IHRocmVhZEhhbmRsZUZvcklkZW50aWZpZXIodGhyZWFkSUQpOworICAgIGlmICh0aHJlYWRIYW5k
bGUpCisgICAgICAgIDo6Q2xvc2VIYW5kbGUodGhyZWFkSGFuZGxlKTsKKyAgICBjbGVhclRocmVh
ZEhhbmRsZUZvcklkZW50aWZpZXIodGhyZWFkSUQpOworfQorCitUaHJlYWRJZGVudGlmaWVyIGN1
cnJlbnRUaHJlYWQoKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUaHJlYWRJZGVudGlmaWVy
Pig6OkdldEN1cnJlbnRUaHJlYWRJZCgpKTsKK30KKwogc3RhdGljIE11dGV4JiBmdW5jdGlvblF1
ZXVlTXV0ZXgoKQogewogICAgIHN0YXRpYyBNdXRleCBzdGF0aWNGdW5jdGlvblF1ZXVlTXV0ZXg7
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17967</attachid>
            <date>2007-12-17 13:14:57 -0800</date>
            <delta_ts>2007-12-17 13:25:29 -0800</delta_ts>
            <desc>Patch to add win32-based threading implementation (includes changes to build system).</desc>
            <filename>threading.patch</filename>
            <type>text/plain</type>
            <size>19938</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI4ODE0
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzkgQEAKKzIwMDctMTIt
MTcgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBB
RERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgVXBkYXRlcyB0byBzdXBwb3J0IG5hdGl2ZSB3aW5k
b3dzIHRocmVhZGluZyBwcmltaXRpdmVzLgorICAgICAgICByYXRoZXIgdGhhbiBwdGhyZWFkcyBl
bXVsYXRpb24gbGlicmFyeSAoc2VlIEJ1ZyMxNjQ2NCkuCisKKyAgICAgICAgKiBXZWJDb3JlLnZj
cHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBjb25maWcuaDoKKyAgICAgICAgKiBwbGF0
Zm9ybS9UaHJlYWRpbmcuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vTXV0ZXhXaW4uY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4OjpNdXRleCk6CisgICAgICAgIChXZWJDb3Jl
OjpNdXRleDo6fk11dGV4KToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4Ojpsb2NrKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok11dGV4Ojp0cnlMb2NrKToKKyAgICAgICAgKFdlYkNvcmU6Ok11dGV4Ojp1
bmxvY2spOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9UaHJlYWRDb25kaXRpb25XaW4uY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZENvbmRpdGlvbjo6VGhyZWFkQ29uZGl0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZENvbmRpdGlvbjo6flRocmVhZENvbmRpdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRDb25kaXRpb246OndhaXQpOgorICAgICAgICAoV2Vi
Q29yZTo6VGhyZWFkQ29uZGl0aW9uOjpzaWduYWwpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFk
Q29uZGl0aW9uOjpicm9hZGNhc3QpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9UaHJlYWRpbmdX
aW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6dGhyZWFkTWFwTXV0ZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6dGhyZWFkTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OnN0b3JlVGhyZWFkSGFuZGxlQnlJ
ZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6OmlkZW50aWZpZXJCeVRocmVhZEhhbmRsZSk6
CisgICAgICAgIChXZWJDb3JlOjp0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKToKKyAgICAgICAg
KFdlYkNvcmU6OmNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcik6CisgICAgICAgIChXZWJD
b3JlOjpjcmVhdGVUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6d2FpdEZvclRocmVhZENvbXBs
ZXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6ZGV0YWNoVGhyZWFkKToKKyAgICAgICAgKFdlYkNv
cmU6OmN1cnJlbnRUaHJlYWQpOgorCiAyMDA3LTEyLTE3ICBBbGV4ZXkgUHJvc2t1cnlha292ICA8
YXBAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbi4KSW5kZXg6IGNvbmZp
Zy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGNvbmZpZy5oCShyZXZpc2lvbiAyODgxNCkKKysrIGNvbmZpZy5o
CSh3b3JraW5nIGNvcHkpCkBAIC04OCw3ICs4OCw3IEBACiAjZGVmaW5lIFdURl9VU0VfQ0ZORVRX
T1JLIDEKICN1bmRlZiBXVEZfVVNFX1dJTklORVQKICNkZWZpbmUgV1RGX1BMQVRGT1JNX0NGIDEK
LSNkZWZpbmUgV1RGX1VTRV9QVEhSRUFEUyAxCisjZGVmaW5lIFdURl9VU0VfUFRIUkVBRFMgMAog
I2VuZGlmCiAKICNpZiBQTEFURk9STShNQUMpCkluZGV4OiBXZWJDb3JlLnZjcHJvai9XZWJDb3Jl
LnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkocmV2
aXNpb24gMjg4MTQpCisrKyBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBj
b3B5KQpAQCAtMzU0Niw2ICszNTQ2LDEwIEBACiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KIAkJCQk8
RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cTXV0ZXhXaW4uY3BwIg0K
KwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXHdpblxQYXN0ZWJvYXJkV2luLmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0K
QEAgLTM2MDYsNiArMzYxMCwxMCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUN
CisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cd2luXFRocmVhZENvbmRpdGlvbldpbi5j
cHAiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccGxhdGZvcm1cd2luXFRocmVhZGluZ1dpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmls
ZT4NCkBAIC00MDgyLDE0ICs0MDkwLDYgQEAKIAkJCQk8L0ZpbHRlcj4NCiAJCQk8L0ZpbHRlcj4N
CiAJCQk8RmlsdGVyDQotCQkJCU5hbWU9InB0aHJlYWRzIg0KLQkJCQk+DQotCQkJCTxGaWxlDQot
CQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXHB0aHJlYWRzXFRocmVhZGluZ1B0aHJlYWRz
LmNwcCINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCTwvRmlsdGVyPg0KLQkJCTxGaWx0ZXIN
CiAJCQkJTmFtZT0ic3FsIg0KIAkJCQk+DQogCQkJCTxGaWxlDQpJbmRleDogcGxhdGZvcm0vVGhy
ZWFkaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vVGhyZWFkaW5nLmgJKHJldmlzaW9uIDI4
ODE0KQorKysgcGxhdGZvcm0vVGhyZWFkaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTY5LDYgKzY5
LDE5IEBAIHR5cGVkZWYgR0NvbmQqIFBsYXRmb3JtQ29uZGl0aW9uOwogI2VsaWYgUExBVEZPUk0o
UVQpCiB0eXBlZGVmIFFNdXRleCogUGxhdGZvcm1NdXRleDsKIHR5cGVkZWYgUVdhaXRDb25kaXRp
b24qIFBsYXRmb3JtQ29uZGl0aW9uOworI2VsaWYgUExBVEZPUk0oV0lOX09TKQorc3RydWN0IFBs
YXRmb3JtTXV0ZXggeworICAgIENSSVRJQ0FMX1NFQ1RJT04gbV9pbnRlcm5hbE11dGV4OworICAg
IHNpemVfdCBtX3JlY3Vyc2lvbkNvdW50OworfTsKK3N0cnVjdCBQbGF0Zm9ybUNvbmRpdGlvbiB7
CisgICAgc2l6ZV90IG1fdGltZWRPdXQ7CisgICAgc2l6ZV90IG1fYmxvY2tlZDsKKyAgICBzaXpl
X3QgbV93YWl0aW5nRm9yUmVtb3ZhbDsKKyAgICBIQU5ETEUgbV9nYXRlOworICAgIEhBTkRMRSBt
X3F1ZXVlOworICAgIEhBTkRMRSBtX211dGV4OworfTsKICNlbHNlCiB0eXBlZGVmIHZvaWQqIFBs
YXRmb3JtTXV0ZXg7CiB0eXBlZGVmIHZvaWQqIFBsYXRmb3JtQ29uZGl0aW9uOwpJbmRleDogcGxh
dGZvcm0vd2luL011dGV4V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS93aW4vTXV0ZXhX
aW4uY3BwCShyZXZpc2lvbiAwKQorKysgcGxhdGZvcm0vd2luL011dGV4V2luLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQnJlbnQgRnVs
Z2hhbQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAq
IDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBs
ZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGhyZWFkaW5nLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworTXV0ZXg6Ok11dGV4KCkKK3sKKyAgICBtX211dGV4Lm1fcmVjdXJz
aW9uQ291bnQgPSAwOworICAgIDo6SW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbV9tdXRleC5t
X2ludGVybmFsTXV0ZXgpOworfQorCitNdXRleDo6fk11dGV4KCkKK3sKKyAgICA6OkRlbGV0ZUNy
aXRpY2FsU2VjdGlvbigmbV9tdXRleC5tX2ludGVybmFsTXV0ZXgpOworfQorCit2b2lkIE11dGV4
Ojpsb2NrKCkKK3sKKyAgICA6OkVudGVyQ3JpdGljYWxTZWN0aW9uKCZtX211dGV4Lm1faW50ZXJu
YWxNdXRleCk7CisgICAgKyttX211dGV4Lm1fcmVjdXJzaW9uQ291bnQ7Cit9CisgICAgCitib29s
IE11dGV4Ojp0cnlMb2NrKCkKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBpcyBtb2RlbGVkIGFmdGVy
IHRoZSBiZWhhdmlvciBvZiBwdGhyZWFkX211dGV4X3RyeWxvY2ssCisgICAgLy8gd2hpY2ggd2ls
bCByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGxvY2sgaXMgYWxyZWFkeSBvd25lZCBieSB0aGUKKyAg
ICAvLyBjdXJyZW50IHRocmVhZC4gIFNpbmNlIHRoZSBwcmltaXRpdmUgV2luMzIgJ1RyeUVudGVy
Q3JpdGljYWxTZWN0aW9uJworICAgIC8vIHRyZWF0cyB0aGlzIGFzIGEgc3VjY2Vzc2Z1bCBjYXNl
LCBpdCBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiBzZXZlcmFsCisgICAgLy8gdGVzdHMgaW4gV2Vi
S2l0IHRoYXQgY2hlY2sgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHRocmVhZCBhbHJlYWR5CisgICAg
Ly8gb3duZWQgdGhpcyBtdXRleCAoc2VlIGUuZy4sIEljb25EYXRhYmFzZTo6Z2V0T3JDcmVhdGVJ
Y29uUmVjb3JkKQorICAgIERXT1JEIHJlc3VsdCA9IDo6VHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24o
Jm1fbXV0ZXgubV9pbnRlcm5hbE11dGV4KTsKKyAgICAKKyAgICBpZiAocmVzdWx0ICE9IDApIHsg
ICAgICAgLy8gV2UgZ290IHRoZSBsb2NrCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGFscmVh
ZHkgaGFkIHRoZSBsb2NrLCB3ZSBtdXN0IHVubG9jayBhbmQKKyAgICAgICAgLy8gcmV0dXJuIGZh
bHNlIHNvIHRoYXQgd2UgbWltaWMgdGhlIGJlaGF2aW9yIG9mIFBPU0lYJ3MKKyAgICAgICAgLy8g
cHRocmVhZF9tdXRleF90cnlsb2NrOgorICAgICAgICBpZiAobV9tdXRleC5tX3JlY3Vyc2lvbkNv
dW50ID4gMCkgeworICAgICAgICAgICAgOjpMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbV9tdXRleC5t
X2ludGVybmFsTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisK
KyAgICAgICAgKyttX211dGV4Lm1fcmVjdXJzaW9uQ291bnQ7CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNdXRleDo6dW5sb2NrKCkK
K3sKKyAgICAtLW1fbXV0ZXgubV9yZWN1cnNpb25Db3VudDsKKyAgICA6OkxlYXZlQ3JpdGljYWxT
ZWN0aW9uKCZtX211dGV4Lm1faW50ZXJuYWxNdXRleCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IHBsYXRmb3JtL3dpbi9UaHJlYWRDb25kaXRpb25XaW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHBsYXRmb3JtL3dpbi9UaHJlYWRDb25kaXRpb25XaW4uY3BwCShyZXZpc2lvbiAwKQor
KysgcGxhdGZvcm0vd2luL1RocmVhZENvbmRpdGlvbldpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMjQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5h
bWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAq
ICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTm90ZTogIFRoZSBpbXBs
ZW1lbnRhdGlvbiBvZiBjb25kaXRpb24gdmFyaWFibGVzIHVuZGVyIHRoZSBXaW5kb3dzCisgKiBw
bGFmb3JtIHdhcyBiYXNlZCBvbiB0aGF0IG9mIHRoZSBleGNlbGxlbnQgQk9PU1QgQysrIGxpYnJh
cnkuICBJdAorICogaGFzIGJlZW4gcmV3cml0dGVuIHRvIGZpdCBpbiB3aXRoIHRoZSBXZWJLaXQg
YXJjaGl0ZWN0dXJlIGFuZCB0bworICogdXNlIGl0cyBjb2RpbmcgY29udmVudGlvbnMuCisgKiA9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoZSBCb29zdCBsaWNlbnNlIGlzIHZpcnR1YWxs
eSBpZGVudGljYWwgdG8gdGhlIEFwcGxlIHZhcmlhdGlvbiBhdCB0aGUKKyAqIHRvcCBvZiB0aGlz
IGZpbGUsIGJ1dCBpcyBpbmNsdWRlZCBoZXJlIGZvciBjb21wbGV0ZW5lc3M6CisgKgorICogQm9v
c3QgU29mdHdhcmUgTGljZW5zZSAtIFZlcnNpb24gMS4wIC0gQXVndXN0IDE3dGgsIDIwMDMKKyAq
CisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55
IHBlcnNvbiBvciBvcmdhbml6YXRpb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3
YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmVkIGJ5CisgKiB0aGlzIGxp
Y2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJp
YnV0ZSwKKyAqIGV4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVw
YXJlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlCisgKiBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCB0
aGlyZC1wYXJ0aWVzIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0bworICogZG8g
c28sIGFsbCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmc6CisgKgorICogVGhlIGNvcHlyaWdodCBu
b3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRp
bmcKKyAqIHRoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiBtdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMg
b2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKKyAqIGFsbCBkZXJpdmF0
aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRp
dmUKKyAqIHdvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxl
IG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQorICogYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29y
LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB
TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P
VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4g
SU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBBTllPTkUgRElT
VFJJQlVUSU5HIFRIRSBTT0ZUV0FSRSBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgREFNQUdFUyBPUiBP
VEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAor
ICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FS
RSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJU
aHJlYWRpbmcuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgbG9uZyBNYXhTZW1hcGhvcmVDb3VudCA9
IHN0YXRpY19jYXN0PGxvbmc+KH4wVUwgPj4gMSk7CisKK1RocmVhZENvbmRpdGlvbjo6VGhyZWFk
Q29uZGl0aW9uKCkKK3sKKyAgICBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICBtX2Nv
bmRpdGlvbi5tX2Jsb2NrZWQgPSAwOworICAgIG1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92
YWwgPSAwOworICAgIG1fY29uZGl0aW9uLm1fZ2F0ZSA9IDo6Q3JlYXRlU2VtYXBob3JlKDAsIDEs
IDEsIDApOworICAgIG1fY29uZGl0aW9uLm1fcXVldWUgPSA6OkNyZWF0ZVNlbWFwaG9yZSgwLCAw
LCBNYXhTZW1hcGhvcmVDb3VudCwgMCk7CisgICAgbV9jb25kaXRpb24ubV9tdXRleCA9IDo6Q3Jl
YXRlTXV0ZXgoMCwgMCwgMCk7CisKKyAgICBpZiAoIW1fY29uZGl0aW9uLm1fZ2F0ZSB8fCAhbV9j
b25kaXRpb24ubV9xdWV1ZSB8fCAhbV9jb25kaXRpb24ubV9tdXRleCkgeworICAgICAgICBpZiAo
bV9jb25kaXRpb24ubV9nYXRlKQorICAgICAgICAgICAgOjpDbG9zZUhhbmRsZShtX2NvbmRpdGlv
bi5tX2dhdGUpOworICAgICAgICBpZiAobV9jb25kaXRpb24ubV9xdWV1ZSkKKyAgICAgICAgICAg
IDo6Q2xvc2VIYW5kbGUobV9jb25kaXRpb24ubV9xdWV1ZSk7CisgICAgICAgIGlmIChtX2NvbmRp
dGlvbi5tX211dGV4KQorICAgICAgICAgICAgOjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX211
dGV4KTsKKyAgICB9Cit9CisKK1RocmVhZENvbmRpdGlvbjo6flRocmVhZENvbmRpdGlvbigpCit7
CisgICAgOjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5tX2dhdGUpOworICAgIDo6Q2xvc2VIYW5k
bGUobV9jb25kaXRpb24ubV9xdWV1ZSk7CisgICAgOjpDbG9zZUhhbmRsZShtX2NvbmRpdGlvbi5t
X211dGV4KTsKK30KKyAgICAKK3ZvaWQgVGhyZWFkQ29uZGl0aW9uOjp3YWl0KE11dGV4JiBtdXRl
eCkKK3sKKyAgICBQbGF0Zm9ybU11dGV4JiBjcyA9IG11dGV4LmltcGwoKTsKKworICAgIC8vIEVu
dGVyIHRoZSB3YWl0IHN0YXRlLgorICAgIERXT1JEIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVj
dChtX2NvbmRpdGlvbi5tX2dhdGUsIElORklOSVRFKTsKKyAgICBBU1NFUlQocmVzID09IFdBSVRf
T0JKRUNUXzApOworICAgICsrbV9jb25kaXRpb24ubV9ibG9ja2VkOworICAgIHJlcyA9IDo6UmVs
ZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dhdGUsIDEsIDApOworICAgIEFTU0VSVChyZXMp
OworCisgICAgOjpMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY3MubV9pbnRlcm5hbE11dGV4KTsKKwor
ICAgIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX3F1ZXVlLCBJTkZJ
TklURSk7CisgICAgQVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKworICAgIHJlcyA9IDo6
V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX211dGV4LCBJTkZJTklURSk7CisgICAg
QVNTRVJUKHJlcyA9PSBXQUlUX09CSkVDVF8wKTsKKyAgICBzaXplX3Qgd2FzV2FpdGluZyA9IG1f
Y29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWw7CisgICAgc2l6ZV90IHdhc1RpbWVkT3V0ID0g
bV9jb25kaXRpb24ubV90aW1lZE91dDsKKyAgICBpZiAod2FzV2FpdGluZyAhPSAwKSB7CisgICAg
ICAgIGlmICgtLW1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgPT0gMCkgeworICAgICAg
ICAgICAgaWYgKG1fY29uZGl0aW9uLm1fYmxvY2tlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAg
cmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0aW9uLm1fZ2F0ZSwgMSwgMCk7ICAvLyBv
cGVuIG1fZ2F0ZQorICAgICAgICAgICAgICAgIEFTU0VSVChyZXMpOworICAgICAgICAgICAgICAg
IHdhc1dhaXRpbmcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9j
b25kaXRpb24ubV90aW1lZE91dCAhPSAwKQorICAgICAgICAgICAgICAgIG1fY29uZGl0aW9uLm1f
dGltZWRPdXQgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgrK21fY29uZGl0aW9uLm1f
dGltZWRPdXQgPT0gKChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KSgpIC8gMikp
IHsKKyAgICAgICAgLy8gdGltZW91dCBvY2N1cmVkLCBub3JtYWxpemUgdGhlIG1fY29uZGl0aW9u
Lm1fdGltZWRPdXQgY291bnQKKyAgICAgICAgLy8gdGhpcyBtYXkgb2NjdXIgaWYgbWFueSBjYWxs
cyB0byB3YWl0IHdpdGggYSB0aW1lb3V0IGFyZSBtYWRlIGFuZAorICAgICAgICAvLyBubyBjYWxs
IHRvIG5vdGlmeV8qIGlzIG1hZGUKKyAgICAgICAgcmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0
KG1fY29uZGl0aW9uLm1fZ2F0ZSwgSU5GSU5JVEUpOworICAgICAgICBBU1NFUlQocmVzID09IFdB
SVRfT0JKRUNUXzApOworICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgLT0gbV9jb25kaXRp
b24ubV90aW1lZE91dDsKKyAgICAgICAgcmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0
aW9uLm1fZ2F0ZSwgMSwgMCk7CisgICAgICAgIEFTU0VSVChyZXMpOworICAgICAgICBtX2NvbmRp
dGlvbi5tX3RpbWVkT3V0ID0gMDsKKyAgICB9CisgICAgcmVzID0gOjpSZWxlYXNlTXV0ZXgobV9j
b25kaXRpb24ubV9tdXRleCk7CisgICAgQVNTRVJUKHJlcyk7CisKKyAgICBpZiAod2FzV2FpdGlu
ZyA9PSAxKSB7CisgICAgICAgIGZvciAoLyoqLyA7IHdhc1RpbWVkT3V0OyAtLXdhc1RpbWVkT3V0
KSB7CisgICAgICAgICAgICAvLyBiZXR0ZXIgbm93IHRoYW4gc3B1cmlvdXMgbGF0ZXIKKyAgICAg
ICAgICAgIHJlcyA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChtX2NvbmRpdGlvbi5tX3F1ZXVlLCBJ
TkZJTklURSk7CisgICAgICAgICAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworICAg
ICAgICB9CisgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dh
dGUsIDEsIDApOworICAgICAgICBBU1NFUlQocmVzKTsKKyAgICB9CisKKyAgICA6OkVudGVyQ3Jp
dGljYWxTZWN0aW9uICgmY3MubV9pbnRlcm5hbE11dGV4KTsKK30KKwordm9pZCBUaHJlYWRDb25k
aXRpb246OnNpZ25hbCgpCit7CisgICAgdW5zaWduZWQgc2lnbmFscyA9IDA7CisKKyAgICBEV09S
RCByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9tdXRleCwgSU5GSU5J
VEUpOworICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisKKyAgICBpZiAobV9jb25k
aXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbCAhPSAwKSB7IC8vIHRoZSBtX2dhdGUgaXMgYWxyZWFk
eSBjbG9zZWQKKyAgICAgICAgaWYgKG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9PSAwKSB7CisgICAg
ICAgICAgICByZXMgPSA6OlJlbGVhc2VNdXRleChtX2NvbmRpdGlvbi5tX211dGV4KTsKKyAgICAg
ICAgICAgIEFTU0VSVChyZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgKyttX2NvbmRpdGlvbi5tX3dhaXRpbmdGb3JSZW1vdmFsOworICAgICAgICAtLW1fY29u
ZGl0aW9uLm1fYmxvY2tlZDsKKworICAgICAgICBzaWduYWxzID0gMTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICByZXMgPSA6OldhaXRGb3JTaW5nbGVPYmplY3QobV9jb25kaXRpb24ubV9nYXRlLCBJ
TkZJTklURSk7CisgICAgICAgIEFTU0VSVChyZXMgPT0gV0FJVF9PQkpFQ1RfMCk7CisgICAgICAg
IGlmIChtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPiBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0KSB7Cisg
ICAgICAgICAgICBpZiAobV9jb25kaXRpb24ubV90aW1lZE91dCAhPSAwKSB7CisgICAgICAgICAg
ICAgICAgbV9jb25kaXRpb24ubV9ibG9ja2VkIC09IG1fY29uZGl0aW9uLm1fdGltZWRPdXQ7Cisg
ICAgICAgICAgICAgICAgbV9jb25kaXRpb24ubV90aW1lZE91dCA9IDA7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBzaWduYWxzID0gbV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVtb3ZhbCA9
IDE7CisgICAgICAgICAgICAtLW1fY29uZGl0aW9uLm1fYmxvY2tlZDsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIHJlcyA9IDo6UmVsZWFzZVNlbWFwaG9yZShtX2NvbmRpdGlvbi5tX2dh
dGUsIDEsIDApOworICAgICAgICAgICAgQVNTRVJUKHJlcyk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICByZXMgPTo6UmVsZWFzZU11dGV4KG1fY29uZGl0aW9uLm1fbXV0ZXgpOworICAgIEFTU0VS
VChyZXMpOworCisgICAgaWYgKHNpZ25hbHMpIHsKKyAgICAgICAgcmVzID0gOjpSZWxlYXNlU2Vt
YXBob3JlKG1fY29uZGl0aW9uLm1fcXVldWUsIHNpZ25hbHMsIDApOworICAgICAgICBBU1NFUlQo
cmVzKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkQ29uZGl0aW9uOjpicm9hZGNhc3QoKQorewor
ICAgIHVuc2lnbmVkIHNpZ25hbHMgPSAwOworCisgICAgV09SRCByZXMgPSA6OldhaXRGb3JTaW5n
bGVPYmplY3QobV9jb25kaXRpb24ubV9tdXRleCwgSU5GSU5JVEUpOworICAgIEFTU0VSVChyZXMg
PT0gV0FJVF9PQkpFQ1RfMCk7CisKKyAgICBpZiAobV9jb25kaXRpb24ubV93YWl0aW5nRm9yUmVt
b3ZhbCAhPSAwKSB7IC8vIHRoZSBtX2dhdGUgaXMgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgaWYg
KG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9PSAwKSB7CisgICAgICAgICAgICByZXMgPSA6OlJlbGVh
c2VNdXRleChtX2NvbmRpdGlvbi5tX211dGV4KTsKKyAgICAgICAgICAgIEFTU0VSVChyZXMpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbV9jb25kaXRpb24ubV93
YWl0aW5nRm9yUmVtb3ZhbCArPSAoc2lnbmFscyA9IG1fY29uZGl0aW9uLm1fYmxvY2tlZCk7Cisg
ICAgICAgIG1fY29uZGl0aW9uLm1fYmxvY2tlZCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
cmVzID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG1fY29uZGl0aW9uLm1fZ2F0ZSwgSU5GSU5JVEUp
OworICAgICAgICBBU1NFUlQocmVzID09IFdBSVRfT0JKRUNUXzApOworICAgICAgICBpZiAobV9j
b25kaXRpb24ubV9ibG9ja2VkID4gbV9jb25kaXRpb24ubV90aW1lZE91dCkgeworICAgICAgICAg
ICAgaWYgKG1fY29uZGl0aW9uLm1fdGltZWRPdXQgIT0gMCkgeworICAgICAgICAgICAgICAgIG1f
Y29uZGl0aW9uLm1fYmxvY2tlZCAtPSBtX2NvbmRpdGlvbi5tX3RpbWVkT3V0OworICAgICAgICAg
ICAgICAgIG1fY29uZGl0aW9uLm1fdGltZWRPdXQgPSAwOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgc2lnbmFscyA9IG1fY29uZGl0aW9uLm1fd2FpdGluZ0ZvclJlbW92YWwgPSBtX2NvbmRp
dGlvbi5tX2Jsb2NrZWQ7CisgICAgICAgICAgICBtX2NvbmRpdGlvbi5tX2Jsb2NrZWQgPSAwOwor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gOjpSZWxlYXNlU2VtYXBob3JlKG1f
Y29uZGl0aW9uLm1fZ2F0ZSwgMSwgMCk7CisgICAgICAgICAgICBBU1NFUlQocmVzKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIHJlcyA9IDo6UmVsZWFzZU11dGV4KG1fY29uZGl0aW9uLm1fbXV0
ZXgpOworICAgIEFTU0VSVChyZXMpOworCisgICAgaWYgKHNpZ25hbHMpIHsKKyAgICAgICAgcmVz
ID0gOjpSZWxlYXNlU2VtYXBob3JlKG1fY29uZGl0aW9uLm1fcXVldWUsIHNpZ25hbHMsIDApOwor
ICAgICAgICBBU1NFUlQocmVzKTsKKyAgICB9Cit9CisgICAgCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBwbGF0Zm9ybS93aW4vVGhyZWFkaW5nV2luLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBw
bGF0Zm9ybS93aW4vVGhyZWFkaW5nV2luLmNwcAkocmV2aXNpb24gMjg4MTQpCisrKyBwbGF0Zm9y
bS93aW4vVGhyZWFkaW5nV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsMTEgKzI3LDEyIEBA
CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRocmVhZGluZy5oIgotCiAj
aW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJUaHJlYWRp
bmcuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRl
IDx3dGYvSGFzaE1hcC5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTQyLDYgKzQzLDEw
MSBAQCBzdGF0aWMgVUlOVCB0aHJlYWRpbmdGaXJlZE1lc3NhZ2UgPSAwOwogY29uc3QgTFBDV1NU
UiBrVGhyZWFkaW5nV2luZG93Q2xhc3NOYW1lID0gTCJUaHJlYWRpbmdXaW5kb3dDbGFzcyI7CiBz
dGF0aWMgYm9vbCBwcm9jZXNzaW5nQ3VzdG9tVGhyZWFkaW5nTWVzc2FnZSA9IGZhbHNlOwogCitz
dGF0aWMgTXV0ZXgmIHRocmVhZE1hcE11dGV4KCkKK3sKKyAgICBzdGF0aWMgTXV0ZXggbXV0ZXg7
CisgICAgcmV0dXJuIG11dGV4OworfQorCitzdGF0aWMgSGFzaE1hcDxEV09SRCwgSEFORExFPiYg
dGhyZWFkTWFwKCkKK3sKKyAgICBzdGF0aWMgSGFzaE1hcDxEV09SRCwgSEFORExFPiBtYXA7Cisg
ICAgcmV0dXJuIG1hcDsKK30KKworc3RhdGljIHZvaWQgc3RvcmVUaHJlYWRIYW5kbGVCeUlkZW50
aWZpZXIoRFdPUkQgdGhyZWFkSUQsIEhBTkRMRSB0aHJlYWRIYW5kbGUpCit7CisgICAgTXV0ZXhM
b2NrZXIgbG9ja2VyKHRocmVhZE1hcE11dGV4KCkpOworICAgIHRocmVhZE1hcCgpLmFkZCh0aHJl
YWRJRCwgdGhyZWFkSGFuZGxlKTsKK30KKworc3RhdGljIFRocmVhZElkZW50aWZpZXIgaWRlbnRp
ZmllckJ5VGhyZWFkSGFuZGxlKEhBTkRMRSB0aHJlYWRIYW5kbGUpCit7CisgICAgTXV0ZXhMb2Nr
ZXIgbG9ja2VyKHRocmVhZE1hcE11dGV4KCkpOworCisgICAgSGFzaE1hcDxEV09SRCwgSEFORExF
Pjo6aXRlcmF0b3IgaSA9IHRocmVhZE1hcCgpLmJlZ2luKCk7CisgICAgZm9yICg7IGkgIT0gdGhy
ZWFkTWFwKCkuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoaS0+c2Vjb25kID09IHRocmVhZEhh
bmRsZSkKKyAgICAgICAgICAgIHJldHVybiBpLT5maXJzdDsKKyAgICB9CisKKyAgICByZXR1cm4g
MDsKK30KKworc3RhdGljIEhBTkRMRSB0aHJlYWRIYW5kbGVGb3JJZGVudGlmaWVyKFRocmVhZElk
ZW50aWZpZXIgaWQpCit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHRocmVhZE1hcE11dGV4KCkp
OworICAgIHJldHVybiB0aHJlYWRNYXAoKS5nZXQoaWQpOworfQorCitzdGF0aWMgdm9pZCBjbGVh
clRocmVhZEhhbmRsZUZvcklkZW50aWZpZXIoVGhyZWFkSWRlbnRpZmllciBpZCkKK3sKKyAgICBN
dXRleExvY2tlciBsb2NrZXIodGhyZWFkTWFwTXV0ZXgoKSk7CisgICAgQVNTRVJUKHRocmVhZE1h
cCgpLmNvbnRhaW5zKGlkKSk7CisgICAgdGhyZWFkTWFwKCkucmVtb3ZlKGlkKTsKK30KKworVGhy
ZWFkSWRlbnRpZmllciBjcmVhdGVUaHJlYWQoVGhyZWFkRnVuY3Rpb24gZW50cnlQb2ludCwgdm9p
ZCogZGF0YSkKK3sKKyAgICBEV09SRCB0aHJlYWRJZGVudGlmaWVyID0gMDsKKyAgICBUaHJlYWRJ
ZGVudGlmaWVyIHRocmVhZElEID0gMDsKKyAgICBIQU5ETEUgaEV2ZW50ID0gOjpDcmVhdGVFdmVu
dCgwLCBGQUxTRSwgRkFMU0UsIDApOworICAgIEhBTkRMRSB0aHJlYWRIYW5kbGUgPSA6OkNyZWF0
ZVRocmVhZCgwLCAwLCAoTFBUSFJFQURfU1RBUlRfUk9VVElORSllbnRyeVBvaW50LCBkYXRhLCAw
LCAmdGhyZWFkSWRlbnRpZmllcik7CisgICAgaWYgKCF0aHJlYWRIYW5kbGUpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHRocmVhZCBhdCBlbnRyeSBwb2ludCAlcCB3aXRo
IGRhdGEgJXAiLCBlbnRyeVBvaW50LCBkYXRhKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgdGhyZWFkSUQgPSBzdGF0aWNfY2FzdDxUaHJlYWRJZGVudGlmaWVyPih0aHJlYWRJZGVu
dGlmaWVyKTsKKyAgICBzdG9yZVRocmVhZEhhbmRsZUJ5SWRlbnRpZmllcih0aHJlYWRJZGVudGlm
aWVyLCB0aHJlYWRIYW5kbGUpOworCisgICAgTE9HKFRocmVhZGluZywgIkNyZWF0ZWQgdGhyZWFk
IHdpdGggdGhyZWFkIGlkICV1IiwgdGhyZWFkSUQpOworICAgIHJldHVybiB0aHJlYWRJRDsKK30K
KworaW50IHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKFRocmVhZElkZW50aWZpZXIgdGhyZWFkSUQs
IHZvaWQqKiByZXN1bHQpCit7CisgICAgQVNTRVJUKHRocmVhZElEKTsKKyAgICAKKyAgICBIQU5E
TEUgdGhyZWFkSGFuZGxlID0gdGhyZWFkSGFuZGxlRm9ySWRlbnRpZmllcih0aHJlYWRJRCk7Cisg
ICAgaWYgKCF0aHJlYWRIYW5kbGUpCisgICAgICAgIExPR19FUlJPUigiVGhyZWFkSWRlbnRpZmll
ciAldSBkaWQgbm90IGNvcnJlc3BvbmQgdG8gYW4gYWN0aXZlIHRocmVhZCB3aGVuIHRyeWluZyB0
byBxdWl0IiwgdGhyZWFkSUQpOworIAorICAgIERXT1JEIGpvaW5SZXN1bHQgPSA6OldhaXRGb3JT
aW5nbGVPYmplY3QodGhyZWFkSGFuZGxlLCBJTkZJTklURSk7CisgICAgaWYgKGpvaW5SZXN1bHQg
PT0gV0FJVF9GQUlMRUQpCisgICAgICAgIExPR19FUlJPUigiVGhyZWFkSWRlbnRpZmllciAldSB3
YXMgZm91bmQgdG8gYmUgZGVhZGxvY2tlZCB0cnlpbmcgdG8gcXVpdCIsIHRocmVhZElEKTsKKwor
ICAgIDo6Q2xvc2VIYW5kbGUodGhyZWFkSGFuZGxlKTsKKyAgICBjbGVhclRocmVhZEhhbmRsZUZv
cklkZW50aWZpZXIodGhyZWFkSUQpOworCisgICAgcmV0dXJuIGpvaW5SZXN1bHQ7Cit9CisKK3Zv
aWQgZGV0YWNoVGhyZWFkKFRocmVhZElkZW50aWZpZXIgdGhyZWFkSUQpCit7CisgICAgQVNTRVJU
KHRocmVhZElEKTsKKyAgICAKKyAgICBIQU5ETEUgdGhyZWFkSGFuZGxlID0gdGhyZWFkSGFuZGxl
Rm9ySWRlbnRpZmllcih0aHJlYWRJRCk7CisgICAgaWYgKHRocmVhZEhhbmRsZSkKKyAgICAgICAg
OjpDbG9zZUhhbmRsZSh0aHJlYWRIYW5kbGUpOworICAgIGNsZWFyVGhyZWFkSGFuZGxlRm9ySWRl
bnRpZmllcih0aHJlYWRJRCk7Cit9CisKK1RocmVhZElkZW50aWZpZXIgY3VycmVudFRocmVhZCgp
Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRocmVhZElkZW50aWZpZXI+KDo6R2V0Q3VycmVu
dFRocmVhZElkKCkpOworfQorCiBzdGF0aWMgTXV0ZXgmIGZ1bmN0aW9uUXVldWVNdXRleCgpCiB7
CiAgICAgc3RhdGljIE11dGV4IHN0YXRpY0Z1bmN0aW9uUXVldWVNdXRleDsK
</data>
<flag name="review"
          id="7795"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>