<?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>20119</bug_id>
          
          <creation_ts>2008-07-20 13:24:44 -0700</creation_ts>
          <short_desc>Execute CSS Animations</short_desc>
          <delta_ts>2008-08-08 13:44:50 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>19028</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dean Jackson">dino</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>86493</commentid>
    <comment_count>0</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-07-20 13:24:44 -0700</bug_when>
    <thetext>Previous patches have added animation properties into the style system and allowed keyframe animations to be parsed in CSS, this patch does the actual animation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>86494</commentid>
    <comment_count>1</comment_count>
      <attachid>22397</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-07-20 13:26:06 -0700</bug_when>
    <thetext>Created attachment 22397
implements CSS animations (and also does some editorial cleanup)

I need to test this a bit more before review. I think it asserts when a new document loads. Something isn&apos;t getting cleaned up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>86686</commentid>
    <comment_count>2</comment_count>
      <attachid>22437</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-07-22 16:40:22 -0700</bug_when>
    <thetext>Created attachment 22437
Updated patch

This update fixes the assertion that we hit when unloading a page with running animations. I&apos;d like feedback on the fix because I&apos;m sure there is a better way to do it. This patch marks a document as it is being unloaded so that the style is not recalculated (the animation engine had marked the document as changed), and marks it loaded as it comes back from history. It would be better if the updateRendering is never called, but it seems to happen from multiple places.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>86692</commentid>
    <comment_count>3</comment_count>
      <attachid>22438</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-07-22 18:17:11 -0700</bug_when>
    <thetext>Created attachment 22438
Tests simple repeated animation</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>86693</commentid>
    <comment_count>4</comment_count>
      <attachid>22439</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-07-22 18:17:45 -0700</bug_when>
    <thetext>Created attachment 22439
Tests animation duration (and correct parsing)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>86694</commentid>
    <comment_count>5</comment_count>
      <attachid>22440</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-07-22 18:18:19 -0700</bug_when>
    <thetext>Created attachment 22440
Tests that &quot;none&quot; animation works</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>86695</commentid>
    <comment_count>6</comment_count>
      <attachid>22441</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-07-22 18:19:01 -0700</bug_when>
    <thetext>Created attachment 22441
Tests animation timing functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87771</commentid>
    <comment_count>7</comment_count>
      <attachid>22437</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-08-04 11:54:55 -0700</bug_when>
    <thetext>Comment on attachment 22437
Updated patch

I am concerned about the performance implications of:

 void RenderObject::setAnimatableStyle(RenderStyle* style)
 {
-    if (!isText() &amp;&amp; m_style &amp;&amp; style)
+    if (!isText() &amp;&amp; style)
         style = animation()-&gt;updateAnimations(this, style);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87772</commentid>
    <comment_count>8</comment_count>
      <attachid>22437</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-08-04 11:57:13 -0700</bug_when>
    <thetext>Comment on attachment 22437
Updated patch

Everything looks fine to me.  I am concerned that the line I linked above could cause a performance regression, since you&apos;ve added extra work to setStyle for every single RenderObject on a page by removing that null check.

r=me, but because of the setAnimatableStyle change you will need to run the performance tests before this can be landed to verify that no regression is caused.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87774</commentid>
    <comment_count>9</comment_count>
      <attachid>22437</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-08-04 12:02:04 -0700</bug_when>
    <thetext>Comment on attachment 22437
Updated patch

Bleh.  I really hate the use of long macros.  I&apos;d much rather see that code re-written to use static inlines with function pointers. You can use macros to call the static inlines if you would prefer to not type the 8 permutation of set/get/clear Prop or whatever you&apos;d need.

Style violation:
+    if (m_frame) {
         m_frame-&gt;animation()-&gt;styleAvailable();
+    }

I would have to look at the code... but &quot;f&quot; seems like a bad choice in variable name:
+    if (f)
+        f-&gt;animation()-&gt;resumeAnimations(this);

Personally I prefer using &quot;name&quot; in cases like this... but that said, it really doens&apos;t matter either way:
+    void setName(const String&amp; s) { m_name = s; }

+
+    if (m_animation-&gt;direction() &amp;&amp; (i &amp; 1))
+        t = 1 - t;
&quot;t&quot; is not a very clear variable name for &quot;number of iterations&quot;

tt could have a better name too:
+    double tt = solveCubicBezierFunction(m_animation-&gt;timingFunction().x1(),


I don&apos;t think you need the .get()s in these calls:
+        RefPtr&lt;TransformOperation&gt; fromOp = i &lt; fromSize ? from[i].get() : 0;

RefPtr will corectly construct from another RefPtr just fine.  Hum... of course the ternary operator might get made at you for having different types on each side of the : so you may need to leave it as .get()

Style:
+        if (!anim-&gt;isValidAnimation()) {
+            animsChanged = true;
+        } else {
+    if ((m_keyframeAnimations.isEmpty() &amp;&amp; !anim) ||
+        (currentStyle &amp;&amp; currentStyle-&gt;animations() &amp;&amp; *(currentStyle-&gt;animations()) == *anim)) {
+        return;
+    }

I would have just written out &quot;keyframeAnim&quot; here:
+            KeyframeAnimation* kfAnim = (numAnims &lt; m_keyframeAnimations.size()) ? m_keyframeAnimations[numAnims] : 0;

If I was writting this out, I might have tried to make it self-documenting:

+        // Don&apos;t bother adding the animation if it has no keyframes or won&apos;t animate
+        if ((anim-&gt;duration() || anim-&gt;delay()) &amp;&amp; anim-&gt;iterationCount() &amp;&amp;
+             anim-&gt;keyframeList().get() &amp;&amp; !anim-&gt;keyframeList()-&gt;isEmpty())

bool willAnimate = (anim-&gt;duration() || anim-&gt;delay()) &amp;&amp; anim-&gt;iterationCount();
bool hasKeyframes = anim-&gt;keyframeList() &amp;&amp; !anim-&gt;keyframeList()-&gt;isEmpty();
if (willAnimate &amp;&amp; hasKeyframes)
  m_keyframeAnimations.append(new KeyframeAnimation(const_cast&lt;Transition*&gt;(anim), renderer, index, this));

Why are you calling anim-&gt;keyframeList().get() here?  If that&apos;s returning a PassRefPtr, that&apos;s a horribly inefficient way to get a boolean answer. :)  (Since only functions which allocate return PassRefPtrs).  Generally we don&apos;t return RefPtr&apos;s from any function (since they cause ref-churn by copying and destroying the temporary.

Also, RefPtr knows how to transparently convert to a bool, so even if that function were returning a RefPtr, you wouldn&apos;t need to call .get() to convert it to a raw pointer to convert it to a bool.


There is a vector function &quot;deleteAllValues&quot; which will do this for you:
+    Vector&lt;KeyframeAnimation*&gt;::const_iterator kfend = m_keyframeAnimations.end();
+    for (Vector&lt;KeyframeAnimation*&gt;::const_iterator it = m_keyframeAnimations.begin(); it != kfend; ++it) {
+        KeyframeAnimation* anim = *it;
+        delete anim;
+    }

I take it this vector m_keyframeAnimations can have null values?  You check *it against null all over.  Yet I don&apos;t see (or must have just missed) where these values are ever set to null.

I don&apos;t believe it&apos;s webkit style to indicate that variables are in/out by prepending &quot;io&quot;:
+        if (!ioAnimatedStyle)
+            ioAnimatedStyle = const_cast&lt;RenderStyle*&gt;(targetStyle);

Bad variable names:
+    double t = m_animation-&gt;duration() ? (elapsedTime / m_animation-&gt;duration()) : 1;
+    int i = (int) t;
+    t -= i;
+    if (m_animation-&gt;direction() &amp;&amp; (i &amp; 1))
+        t = 1 - t;

I assume the compiler is smart enough to convert the 1 to a double instead of converting the division result to an int:
+    double t = m_animation-&gt;duration() ? (elapsedTime / m_animation-&gt;duration()) : 1;


In general I think we try and make double constants doubles (using 1.0 and 0.0, etc.) and floats floats, and ints ints.


If KeyframeAnimation is refcounted, it should be using the new create() syntax. instead of direct calls to &quot;new&quot;.

This is probably just a call to:
dispatchGenericEvent:

+bool KeyframeAnimation::sendAnimationEvent(const AtomicString&amp; inEventType, double inElapsedTime)
+{
+    // FIXME: Event dispatch goes here
+    return false; // didn&apos;t dispatch an event

However I can understand if you&apos;re trying to limit the scope of your patch. :)

Are there test cases for these changes?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87775</commentid>
    <comment_count>10</comment_count>
      <attachid>22437</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-08-04 12:02:41 -0700</bug_when>
    <thetext>Comment on attachment 22437
Updated patch

Ah, there are test cases attached.  The r- was for all my other comments of course. :)  Obviously you&apos;ll need a ChangeLog eventually too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88066</commentid>
    <comment_count>11</comment_count>
      <attachid>22700</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-08-07 15:04:46 -0700</bug_when>
    <thetext>Created attachment 22700
Updated patch

This is an updated patch, fairly similar to the one hyatt already reviewed. It has some fixes for Eric&apos;s review. I&apos;ll open bugs on anything I&apos;ve left out of here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88068</commentid>
    <comment_count>12</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-08-07 15:44:11 -0700</bug_when>
    <thetext>&gt; Bleh.  I really hate the use of long macros.  I&apos;d much rather see that code
&gt; re-written to use static inlines with function pointers. You can use macros to
&gt; call the static inlines if you would prefer to not type the 8 permutation of
&gt; set/get/clear Prop or whatever you&apos;d need.

Yeah, we hate the macros too. We&apos;ll open a bug to remove them (and the macros for
background layers, which is the code we copied)

&gt; 
&gt; Style violation:
&gt; +    if (m_frame) {
&gt;          m_frame-&gt;animation()-&gt;styleAvailable();
&gt; +    }

Fixed

&gt; I would have to look at the code... but &quot;f&quot; seems like a bad choice in variable
&gt; name:
&gt; +    if (f)
&gt; +        f-&gt;animation()-&gt;resumeAnimations(this);

This is pretty common throughout (ie. not just this function and file). In this case
it is Frame.

&gt; &gt; Personally I prefer using &quot;name&quot; in cases like this... but that said, it really
&gt; doens&apos;t matter either way:
&gt; +    void setName(const String&amp; s) { m_name = s; }

I&apos;m not sure what you mean. s/setName/name/ ?

&gt; +
&gt; +    if (m_animation-&gt;direction() &amp;&amp; (i &amp; 1))
&gt; +        t = 1 - t;
&gt; &quot;t&quot; is not a very clear variable name for &quot;number of iterations&quot;
&gt; 
&gt; tt could have a better name too:
&gt; +    double tt = solveCubicBezierFunction(m_animation-&gt;timingFunction().x1(),

I&apos;ve renamed these to something better.

&gt; I don&apos;t think you need the .get()s in these calls:
&gt; +        RefPtr&lt;TransformOperation&gt; fromOp = i &lt; fromSize ? from[i].get() : 0;
&gt; 
&gt; RefPtr will corectly construct from another RefPtr just fine.  Hum... of course
&gt; the ternary operator might get made at you for having different types on each
&gt; side of the : so you may need to leave it as .get()

I got rid of it in the lines above, but left it in this one since the compiler
complained.

&gt; Style:
&gt; +        if (!anim-&gt;isValidAnimation()) {
&gt; +            animsChanged = true;
&gt; +        } else {
&gt; +    if ((m_keyframeAnimations.isEmpty() &amp;&amp; !anim) ||
&gt; +        (currentStyle &amp;&amp; currentStyle-&gt;animations() &amp;&amp;
&gt; *(currentStyle-&gt;animations()) == *anim)) {
&gt; +        return;
&gt; +    }

Fixed

&gt; 
&gt; I would have just written out &quot;keyframeAnim&quot; here:
&gt; +            KeyframeAnimation* kfAnim = (numAnims &lt;
&gt; m_keyframeAnimations.size()) ? m_keyframeAnimations[numAnims] : 0;

Fixed

&gt; 
&gt; If I was writting this out, I might have tried to make it self-documenting:
&gt; 
&gt; +        // Don&apos;t bother adding the animation if it has no keyframes or won&apos;t
&gt; animate
&gt; +        if ((anim-&gt;duration() || anim-&gt;delay()) &amp;&amp; anim-&gt;iterationCount() &amp;&amp;
&gt; +             anim-&gt;keyframeList().get() &amp;&amp; !anim-&gt;keyframeList()-&gt;isEmpty())
&gt; 
&gt; bool willAnimate = (anim-&gt;duration() || anim-&gt;delay()) &amp;&amp;
&gt; anim-&gt;iterationCount();
&gt; bool hasKeyframes = anim-&gt;keyframeList() &amp;&amp; !anim-&gt;keyframeList()-&gt;isEmpty();
&gt; if (willAnimate &amp;&amp; hasKeyframes)
&gt;   m_keyframeAnimations.append(new
&gt; KeyframeAnimation(const_cast&lt;Transition*&gt;(anim), renderer, index, this));

I haven&apos;t fixed this one yet, but will.

&gt; Why are you calling anim-&gt;keyframeList().get() here?  If that&apos;s returning a
&gt; PassRefPtr, that&apos;s a horribly inefficient way to get a boolean answer. :) 
&gt; (Since only functions which allocate return PassRefPtrs).  Generally we don&apos;t
&gt; return RefPtr&apos;s from any function (since they cause ref-churn by copying and
&gt; destroying the temporary.

Again, haven&apos;t fixed yet but will.

&gt; 
&gt; Also, RefPtr knows how to transparently convert to a bool, so even if that
&gt; function were returning a RefPtr, you wouldn&apos;t need to call .get() to convert
&gt; it to a raw pointer to convert it to a bool.
&gt; 
&gt; 
&gt; There is a vector function &quot;deleteAllValues&quot; which will do this for you:
&gt; +    Vector&lt;KeyframeAnimation*&gt;::const_iterator kfend =
&gt; m_keyframeAnimations.end();
&gt; +    for (Vector&lt;KeyframeAnimation*&gt;::const_iterator it =
&gt; m_keyframeAnimations.begin(); it != kfend; ++it) {
&gt; +        KeyframeAnimation* anim = *it;
&gt; +        delete anim;
&gt; +    }
&gt; 
&gt; I take it this vector m_keyframeAnimations can have null values?  You check *it
&gt; against null all over.  Yet I don&apos;t see (or must have just missed) where these
&gt; values are ever set to null.
&gt; 
&gt; I don&apos;t believe it&apos;s webkit style to indicate that variables are in/out by
&gt; prepending &quot;io&quot;:
&gt; +        if (!ioAnimatedStyle)
&gt; +            ioAnimatedStyle = const_cast&lt;RenderStyle*&gt;(targetStyle);

Changed

&gt; Bad variable names:
&gt; +    double t = m_animation-&gt;duration() ? (elapsedTime /
&gt; m_animation-&gt;duration()) : 1;
&gt; +    int i = (int) t;
&gt; +    t -= i;
&gt; +    if (m_animation-&gt;direction() &amp;&amp; (i &amp; 1))
&gt; +        t = 1 - t;
&gt; 

Fixed.

&gt; I assume the compiler is smart enough to convert the 1 to a double instead of
&gt; converting the division result to an int:
&gt; +    double t = m_animation-&gt;duration() ? (elapsedTime /
&gt; m_animation-&gt;duration()) : 1;
&gt; 
&gt; 
&gt; In general I think we try and make double constants doubles (using 1.0 and 0.0,
&gt; etc.) and floats floats, and ints ints.

Fixed (although there may be other places I haven&apos;t checked yet)

&gt; If KeyframeAnimation is refcounted, it should be using the new create() syntax.
&gt; instead of direct calls to &quot;new&quot;.

Will fix this.

&gt;  This is probably just a call to:
&gt; dispatchGenericEvent:
&gt; 
&gt; +bool KeyframeAnimation::sendAnimationEvent(const AtomicString&amp; inEventType,
&gt; double inElapsedTime)
&gt; +{
&gt; +    // FIXME: Event dispatch goes here
&gt; +    return false; // didn&apos;t dispatch an event
&gt; 
&gt; However I can understand if you&apos;re trying to limit the scope of your patch. :)

In this case it was an intentional limitation. A subsequent bug will add the code.

Thanks Eric!!

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88113</commentid>
    <comment_count>13</comment_count>
      <attachid>22700</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-08-08 13:04:17 -0700</bug_when>
    <thetext>Comment on attachment 22700
Updated patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88122</commentid>
    <comment_count>14</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-08-08 13:44:50 -0700</bug_when>
    <thetext>Committed r35646
	A	WebCore/manual-tests/animate-duration.html
	A	WebCore/manual-tests/animate-left.html
	A	WebCore/manual-tests/animate-none.html
	M	WebCore/rendering/RenderObject.cpp
	M	WebCore/rendering/style/RenderStyle.h
	M	WebCore/dom/Document.cpp
	M	WebCore/ChangeLog
	M	WebCore/css/CSSStyleSelector.cpp
	M	WebCore/page/AnimationController.h
	M	WebCore/page/AnimationController.cpp

</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>22397</attachid>
            <date>2008-07-20 13:26:06 -0700</date>
            <delta_ts>2008-07-22 16:40:22 -0700</delta_ts>
            <desc>implements CSS animations (and also does some editorial cleanup)</desc>
            <filename>patch8-css-animations.patch</filename>
            <type>text/plain</type>
            <size>37669</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcCBiL1dlYkNvcmUvZG9tL0RvY3Vt
ZW50LmNwcAppbmRleCAwNWE3ZGIwLi44YjFlZTQ2IDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9E
b2N1bWVudC5jcHAKKysrIGIvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBAIC0xNTU1LDYgKzE1
NTYsOSBAQCB2b2lkIERvY3VtZW50OjppbXBsaWNpdENsb3NlKCkKIAogICAgIG1fbG9hZENvbXBs
ZXRlID0gdHJ1ZTsKIAorICAgIGlmIChmKQorICAgICAgICBmLT5hbmltYXRpb24oKS0+cmVzdW1l
QW5pbWF0aW9ucyh0aGlzKTsKKwogICAgIGRpc3BhdGNoSW1hZ2VMb2FkRXZlbnRzTm93KCk7CiAg
ICAgdGhpcy0+ZGlzcGF0Y2hXaW5kb3dFdmVudChsb2FkRXZlbnQsIGZhbHNlLCBmYWxzZSk7CiAg
ICAgaWYgKGYpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5j
cHAgYi9XZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5jcHAKaW5kZXggODk0MGEwOS4u
NTc1MjZhYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3Bw
CisrKyBiL1dlYkNvcmUvcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcApAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTYxLDYgKzE2MSw3
IEBAIHByaXZhdGU6CiAjcHJhZ21hIG1hcmsgLQogICAgIAogY2xhc3MgSW1wbGljaXRBbmltYXRp
b247CitjbGFzcyBLZXlmcmFtZUFuaW1hdGlvbjsKIGNsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXJQ
cml2YXRlOwogCiAvLyBBIENvbXBvc2l0ZUFuaW1hdGlvbiByZXByZXNlbnRzIGEgY29sbGVjdGlv
biBvZiBhbmltYXRpb25zIHRoYXQKQEAgLTE3Nyw2ICsxNzgsNyBAQCBwdWJsaWM6CiAgICAgfkNv
bXBvc2l0ZUFuaW1hdGlvbigpCiAgICAgewogICAgICAgICBkZWxldGVBbGxWYWx1ZXMobV90cmFu
c2l0aW9ucyk7CisgICAgICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2tleWZyYW1lQW5pbWF0aW9ucyk7
CiAgICAgfQogICAgIAogICAgIFJlbmRlclN0eWxlKiBhbmltYXRlKFJlbmRlck9iamVjdCosIFJl
bmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7CkBAIC0x
OTEsOSArMTkzLDEyIEBAIHB1YmxpYzoKICAgICAKICAgICB2b2lkIGNsZWFudXBGaW5pc2hlZEFu
aW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7CiAgICAgCisgICAgdm9pZCBzZXRBbmltYXRpb25TdGFy
dFRpbWUoZG91YmxlIHQpOworICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0YXJ0VGltZShpbnQgcHJv
cGVydHksIGRvdWJsZSB0KTsKKyAgICAKICAgICB2b2lkIHN1c3BlbmRBbmltYXRpb25zKCk7CiAg
ICAgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7Ci0gICAgYm9vbCBzdXNwZW5kZWQoKSBjb25zdCAg
ICAgIHsgcmV0dXJuIG1fc3VzcGVuZGVkOyB9CisgICAgYm9vbCBzdXNwZW5kZWQoKSBjb25zdCB7
IHJldHVybiBtX3N1c3BlbmRlZDsgfQogICAgIAogICAgIHZvaWQgb3ZlcnJpZGVJbXBsaWNpdEFu
aW1hdGlvbnMoaW50IHByb3BlcnR5KTsKICAgICB2b2lkIHJlc3VtZU92ZXJyaWRkZW5JbXBsaWNp
dEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KTsKQEAgLTIwMywxMyArMjA4LDE3IEBAIHB1YmxpYzoK
ICAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdDsKICAgICAK
ICAgICB2b2lkIHNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcpOworICAg
IAogcHJvdGVjdGVkOgogICAgIHZvaWQgdXBkYXRlVHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciwgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0
eWxlKTsKKyAgICB2b2lkIHVwZGF0ZUtleWZyYW1lQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJl
bmRlcmVyLCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5
bGUpOworICAgIGludCBmaW5kS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWljU3RyaW5nJiBu
YW1lKTsKICAgICAKIHByaXZhdGU6CiAgICAgdHlwZWRlZiBIYXNoTWFwPGludCwgSW1wbGljaXRB
bmltYXRpb24qPiBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOwogICAgIAogICAgIENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXAgICBtX3RyYW5zaXRpb25zOworICAgIFZlY3RvcjxLZXlmcmFtZUFu
aW1hdGlvbio+ICBtX2tleWZyYW1lQW5pbWF0aW9uczsKICAgICBib29sICAgICAgICAgICAgICAg
ICAgICAgICAgbV9zdXNwZW5kZWQ7CiAgICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUqIG1f
YW5pbWF0aW9uQ29udHJvbGxlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbV9u
dW1TdHlsZUF2YWlsYWJsZVdhaXRlcnM7CkBAIC0yODAsNyArMjg5LDcgQEAgcHVibGljOgogICAg
IAogICAgIC8vIENhbGxlZCB0byBjaGFuZ2UgdG8gb3IgZnJvbSBwYXVzZWQgc3RhdGUKICAgICB2
b2lkIHVwZGF0ZVBsYXlTdGF0ZShib29sIHJ1bm5pbmcpOwotICAgIGJvb2wgcGxheVN0YXRlUGxh
eWluZygpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbWF0aW9uOyB9CisgICAgYm9vbCBwbGF5U3RhdGVQ
bGF5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9hbmltYXRpb24gJiYgbV9hbmltYXRpb24tPnBsYXlT
dGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQbGF5aW5nOyB9CiAgICAgCiAgICAgYm9vbCB3YWl0aW5n
VG9TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX05FVyB8fCBtX2Fu
aW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOyB9CiAgICAgYm9vbCBwcmVhY3RpdmUo
KSBjb25zdApAQCAtMzYxLDcgKzM3MCw3IEBAIHByb3RlY3RlZDoKICAgICBib29sIG1fd2FpdGVk
Rm9yUmVzcG9uc2U7CiAgICAgZG91YmxlIG1fc3RhcnRUaW1lOwogICAgIGRvdWJsZSBtX3BhdXNl
VGltZTsKLSAgICBSZW5kZXJPYmplY3QqICAgbV9vYmplY3Q7CisgICAgUmVuZGVyT2JqZWN0KiBt
X29iamVjdDsKICAgICAKICAgICBBbmltYXRpb25UaW1lckNhbGxiYWNrIG1fYW5pbWF0aW9uVGlt
ZXJDYWxsYmFjazsKICAgICBBbmltYXRpb25FdmVudERpc3BhdGNoZXIgbV9hbmltYXRpb25FdmVu
dERpc3BhdGNoZXI7CkBAIC00MDAsOCArNDA5LDYgQEAgcHVibGljOgogICAgIGludCBwcm9wZXJ0
eSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVydHk7IH0KICAgICAKICAgICB2aXJ0dWFsIHZvaWQg
b25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUpOwotICAgIHZpcnR1YWwgYm9vbCBz
dGFydEFuaW1hdGlvbihkb3VibGUgYmVnaW5UaW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQgZW5kQW5p
bWF0aW9uKGJvb2wgcmVzZXQpOwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBv
c2l0ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50
U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJn
ZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBpb0FuaW1hdGVkU3R5bGUpOwpAQCAtNDIyLDcgKzQyOSw3
IEBAIHByb3RlY3RlZDoKICAgICAgICAgcmV0dXJuIG1fb2JqZWN0LT5kb2N1bWVudCgpLT5oYXNM
aXN0ZW5lclR5cGUoaW5MaXN0ZW5lclR5cGUpOwogICAgIH0KICAgICAKLSAgICBib29sIHNlbmRU
cmFuc2l0aW9uRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGlu
RWxhcHNlZFRpbWUpOyAgICAKKyAgICBib29sIHNlbmRUcmFuc2l0aW9uRXZlbnQoY29uc3QgQXRv
bWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpOwogICAgIAogcHJp
dmF0ZToKICAgICBpbnQgbV9wcm9wZXJ0eTsKQEAgLTQ0Nyw4ICs0NTQsNTggQEAgdm9pZCBBbmlt
YXRpb25FdmVudERpc3BhdGNoZXI6OnRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNl
PiopCiAKICNwcmFnbWEgbWFyayAtCiAKLSNwcmFnbWEgbWFyayAtCitjbGFzcyBLZXlmcmFtZUFu
aW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNlIHsKK3B1YmxpYzoKKyAgICBLZXlmcmFtZUFu
aW1hdGlvbihjb25zdCBUcmFuc2l0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBpbnQgaW5kZXgsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCisgICAgOiBBbmlt
YXRpb25CYXNlKHRyYW5zaXRpb24sIHJlbmRlcmVyLCBjb21wQW5pbSkKKyAgICAsIG1fa2V5ZnJh
bWVzKHRyYW5zaXRpb24tPmtleWZyYW1lTGlzdCgpKQorICAgICwgbV9uYW1lKHRyYW5zaXRpb24t
Pm5hbWUoKSkKKyAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgeworICAgIH0KKworICAgIHZpcnR1
YWwgfktleWZyYW1lQW5pbWF0aW9uKCkKKyAgICB7CisgICAgICAgIC8vIERvIHRoZSBjbGVhbnVw
IGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6ZWQgbWV0
aG9kcyBnZXQgY2FsbGVkCisgICAgICAgIGlmICghcG9zdGFjdGl2ZSgpKQorICAgICAgICAgICAg
dXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKKyAgICB9
CisKKyAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJP
YmplY3QqLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYg
aW9BbmltYXRlZFN0eWxlKTsKKyAgICAKKyAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiBz
KSB7IG1fbmFtZSA9IHM7IH0KKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBjb25zdCB7
IHJldHVybiBtX25hbWU7IH0KKworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRGaXJlRXZlbnRzKCkg
Y29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIG9u
QW5pbWF0aW9uU3RhcnQoZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIHZpcnR1YWwgdm9pZCBv
bkFuaW1hdGlvbkl0ZXJhdGlvbihkb3VibGUgaW5FbGFwc2VkVGltZSk7CisgICAgdmlydHVhbCB2
b2lkIG9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpOworCisgICAgdmlydHVhbCB2b2lkIG92ZXJyaWRl
QW5pbWF0aW9ucygpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9u
cygpOworICAgIAorICAgIGJvb2wgc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIoRG9jdW1lbnQ6
Okxpc3RlbmVyVHlwZSBpbkxpc3RlbmVyVHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX29i
amVjdC0+ZG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKGluTGlzdGVuZXJUeXBlKTsKKyAgICB9
CiAgICAgCisgICAgYm9vbCBzZW5kQW5pbWF0aW9uRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBp
bkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIAorICAgIHZpcnR1YWwgYm9v
bCBhZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAv
LyBUaGUga2V5ZnJhbWVzIHRoYXQgd2UgYXJlIGJsZW5kaW5nLgorICAgIFJlZlB0cjxLZXlmcmFt
ZUxpc3Q+IG1fa2V5ZnJhbWVzOworICAgIEF0b21pY1N0cmluZyBtX25hbWU7CisgICAgaW50IG1f
aW5kZXg7Cit9OworCisjcHJhZ21hIG1hcmsgLQorCiBBbmltYXRpb25CYXNlOjpBbmltYXRpb25C
YXNlKGNvbnN0IFRyYW5zaXRpb24qIHRyYW5zaXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIs
IENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCiA6IG1fYW5pbVN0YXRlKFNUQVRFX05FVykK
ICwgbV9pdGVyYXRpb24oMCkKQEAgLTUyNCw3ICs1ODEsOSBAQCB2b2lkIEFuaW1hdGlvbkJhc2U6
OnVwZGF0ZVN0YXRlTWFjaGluZShBbmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKQog
ICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgdGltZXIgdG8gdGhlIGluaXRpYWwgZGVs
YXkgKDAgaWYgbm8gZGVsYXkpCiAgICAgICAgICAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25zZSA9
IGZhbHNlOwogICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9U
SU1FUjsKLSAgICAgICAgICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2suc3RhcnRUaW1l
cihtX2FuaW1hdGlvbi0+ZGVsYXkoKSwgRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRF
dmVudCwgbV9hbmltYXRpb24tPmRlbGF5KCkpOworICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9u
VGltZXJDYWxsYmFjay5zdGFydFRpbWVyKG1fYW5pbWF0aW9uLT5kZWxheSgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TmFtZXM6Ondl
YmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPmRlbGF5KCkpOwogICAgICAgICAgICAg
fQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfU1RBUlRfV0FJVF9USU1F
UjoKQEAgLTU2MCw3ICs2MTksNyBAQCB2b2lkIEFuaW1hdGlvbkJhc2U6OnVwZGF0ZVN0YXRlTWFj
aGluZShBbmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKQogICAgICAgICAgICAgICAg
IG92ZXJyaWRlQW5pbWF0aW9ucygpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
IC8vIFNlbmQgc3RhcnQgZXZlbnQsIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgIG9uQW5pbWF0
aW9uU3RhcnQoMC4wZik7IC8vIHRoZSBlbGFwc2VkVGltZSBpcyBhbHdheXMgMCBoZXJlCisgICAg
ICAgICAgICAgICAgb25BbmltYXRpb25TdGFydCgwLjBmKTsgLy8gVGhlIGVsYXBzZWRUaW1lIGlz
IGFsd2F5cyAwIGhlcmUKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAvLyBTdGFy
dCB0aGUgYW5pbWF0aW9uCiAgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRkZW4oKSB8fCAhc3Rh
cnRBbmltYXRpb24oMCkpIHsKQEAgLTcyMSwxMiArNzgwLDE1IEBAIHZvaWQgQW5pbWF0aW9uQmFz
ZTo6YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQoSFRNTEVsZW1lbnQqIGVsZW1lbnQsIGNv
bnN0IEF0CiAgICAgQVNTRVJUKCFlbGVtZW50IHx8IChlbGVtZW50LT5kb2N1bWVudCgpICYmICFl
bGVtZW50LT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKSk7CiAgICAgaWYgKCFlbGVtZW50KQog
ICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIC8vIEZJWE1FOiBBY3R1YWwgZXZlbnQgZGlz
cGF0Y2hpbmcgd2lsbCBiZSBkb25lIGhlcmUKIH0KIAogdm9pZCBBbmltYXRpb25CYXNlOjp1cGRh
dGVQbGF5U3RhdGUoYm9vbCBydW4pCiB7CiAgICAgaWYgKHJ1bm5pbmcoKSAhPSBydW4gfHwgaXNu
ZXcoKSkgewotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUocnVuID8gU1RBVEVfSU5QVVRfUExB
WV9TVEFURV9SVU5OSU5HIDogU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQsIC0xKTsKKyAg
ICAgICAgaWYgKG1fb2JqZWN0LT5kb2N1bWVudCgpLT5sb2FkQ29tcGxldGUoKSkKKyAgICAgICAg
ICAgIHVwZGF0ZVN0YXRlTWFjaGluZShydW4gPyBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5J
TkcgOiBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCwgLTEpOwogICAgIH0KIH0KIApAQCAt
NzQwLDE2ICs4MDIsMjEgQEAgZG91YmxlIEFuaW1hdGlvbkJhc2U6OnByb2dyZXNzKGRvdWJsZSBz
Y2FsZSwgZG91YmxlIG9mZnNldCkgY29uc3QKICAgICAgICAgcmV0dXJuIDA7CiAgICAgCiAgICAg
ZG91YmxlIGR1ciA9IG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpOworICAgIGlmIChtX2FuaW1hdGlv
bi0+aXRlcmF0aW9uQ291bnQoKSA+IDApCisgICAgICAgIGR1ciAqPSBtX2FuaW1hdGlvbi0+aXRl
cmF0aW9uQ291bnQoKTsKICAgICAKLSAgICBpZiAocG9zdGFjdGl2ZSgpIHx8ICFtX2FuaW1hdGlv
bi0+ZHVyYXRpb24oKSB8fCBlbGFwc2VkVGltZSA+PSBkdXIpCisgICAgaWYgKHBvc3RhY3RpdmUo
KSB8fCAhbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgfHwgKG1fYW5pbWF0aW9uLT5pdGVyYXRpb25D
b3VudCgpID4gMCAmJiBlbGFwc2VkVGltZSA+PSBkdXIpKQogICAgICAgICByZXR1cm4gMS4wOwog
ICAgIAogICAgIC8vIENvbXB1dGUgdGhlIGZyYWN0aW9uYWwgdGltZSwgdGFraW5nIGludG8gYWNj
b3VudCBkaXJlY3Rpb24uCi0gICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBp
dGVyYXRpb25zLCB3ZSBhc3N1bWUgdGhhdCB3ZSB3b3VsZCBoYXZlIAorICAgIC8vIFRoZXJlIGlz
IG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgaXRlcmF0aW9ucywgd2UgYXNzdW1lIHRoYXQgd2Ugd291
bGQgaGF2ZQogICAgIC8vIHNob3J0IGNpcmN1aXRlZCBhYm92ZSBpZiB3ZSB3ZXJlIGRvbmUKICAg
ICBkb3VibGUgdCA9IGVsYXBzZWRUaW1lIC8gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7CiAgICAg
aW50IGkgPSAoaW50KSB0OwogICAgIHQgLT0gaTsKKworICAgIGlmIChtX2FuaW1hdGlvbi0+ZGly
ZWN0aW9uKCkgJiYgKGkgJiAxKSkKKyAgICAgICAgdCA9IDEgLSB0OwogICAgIAogICAgIGlmIChz
Y2FsZSAhPSAxIHx8IG9mZnNldCAhPSAwKQogICAgICAgICB0ID0gKHQgLSBvZmZzZXQpICogc2Nh
bGU7CkBAIC03NTgsOSArODI1LDkgQEAgZG91YmxlIEFuaW1hdGlvbkJhc2U6OnByb2dyZXNzKGRv
dWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgY29uc3QKICAgICAgICAgcmV0dXJuIHQ7CiAgICAg
CiAgICAgLy8gQ3ViaWMgYmV6aWVyLgotICAgIGRvdWJsZSB0dCA9IHNvbHZlQ3ViaWNCZXppZXJG
dW5jdGlvbihtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MSgpLCAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9u
KCkueTEoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5p
bWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLngyKCksIAorICAgIGRvdWJsZSB0dCA9IHNvbHZlQ3Vi
aWNCZXppZXJGdW5jdGlvbihtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FuaW1hdGlvbi0+dGltaW5n
RnVuY3Rpb24oKS55MSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MigpLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS55Migp
LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCBtX2FuaW1hdGlv
bi0+ZHVyYXRpb24oKSk7CiAgICAgcmV0dXJuIHR0OwpAQCAtNzczLDcgKzg0MCwxMCBAQCB2b2lk
IEFuaW1hdGlvbkJhc2U6OnByaW1lRXZlbnRUaW1lcnMoKQogICAgIGNvbnN0IGRvdWJsZSBlbGFw
c2VkRHVyYXRpb24gPSBjdCAtIG1fc3RhcnRUaW1lOwogICAgIEFTU0VSVChlbGFwc2VkRHVyYXRp
b24gPj0gMCk7CiAgICAgCi0gICAgZG91YmxlIHRvdGFsRHVyYXRpb24gPSBtX2FuaW1hdGlvbi0+
ZHVyYXRpb24oKTsKKyAgICBkb3VibGUgdG90YWxEdXJhdGlvbiA9IC0xOworICAgIGlmIChtX2Fu
aW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+IDApCisgICAgICAgIHRvdGFsRHVyYXRpb24gPSBt
X2FuaW1hdGlvbi0+ZHVyYXRpb24oKSAqIG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpOwor
ICAgIAogICAgIGRvdWJsZSBkdXJhdGlvbkxlZnQgPSAwOwogICAgIGRvdWJsZSBuZXh0SXRlcmF0
aW9uVGltZSA9IHRvdGFsRHVyYXRpb247CiAgICAgaWYgKHRvdGFsRHVyYXRpb24gPCAwIHx8IGVs
YXBzZWREdXJhdGlvbiA8IHRvdGFsRHVyYXRpb24pIHsKQEAgLTg0OSw5ICs5MTksOSBAQCBzdGF0
aWMgaW5saW5lIFRyYW5zZm9ybU9wZXJhdGlvbnMgYmxlbmRGdW5jKGNvbnN0IFRyYW5zZm9ybU9w
ZXJhdGlvbnMmIGZyb20sIGNvbgogICAgIHVuc2lnbmVkIHNpemUgPSBtYXgoZnJvbVNpemUsIHRv
U2l6ZSk7CiAgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyByZXN1bHQ7CiAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBUcmFuc2Zvcm1PcGVyYXRpb24qIGZy
b21PcCA9IGkgPCBmcm9tU2l6ZSA/IGZyb21baV0uZ2V0KCkgOiAwOwotICAgICAgICBUcmFuc2Zv
cm1PcGVyYXRpb24qIHRvT3AgPSBpIDwgdG9TaXplID8gdG9baV0uZ2V0KCkgOiAwOwotICAgICAg
ICBUcmFuc2Zvcm1PcGVyYXRpb24qIGJsZW5kZWRPcCA9IHRvT3AgPyB0b09wLT5ibGVuZChmcm9t
T3AsIHByb2dyZXNzKSA6IGZyb21PcC0+YmxlbmQoMCwgcHJvZ3Jlc3MsIHRydWUpOworICAgICAg
ICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiBmcm9tT3AgPSBpIDwgZnJvbVNpemUgPyBmcm9t
W2ldLmdldCgpIDogMDsKKyAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gdG9PcCA9
IGkgPCB0b1NpemUgPyB0b1tpXS5nZXQoKSA6IDA7CisgICAgICAgIFJlZlB0cjxUcmFuc2Zvcm1P
cGVyYXRpb24+IGJsZW5kZWRPcCA9IHRvT3AgPyB0b09wLT5ibGVuZChmcm9tT3AuZ2V0KCksIHBy
b2dyZXNzKSA6IGZyb21PcC0+YmxlbmQoMCwgcHJvZ3Jlc3MsIHRydWUpOwogICAgICAgICBpZiAo
YmxlbmRlZE9wKQogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChibGVuZGVkT3ApOwogICAgIH0K
QEAgLTg4Nyw4ICs5NTcsNyBAQCB2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6dXBkYXRlVHJhbnNp
dGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgUmVuZGVyU3R5bGUqCiAgICAgLy8gU2VlIGlm
IHRoZSBsaXN0cyBtYXRjaAogICAgIGZvciAoIDsgYW5pbTsgYW5pbSA9IGFuaW0tPm5leHQoKSkg
ewogICAgICAgICArK251bUFuaW1zOwotICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogaW1wbEFu
aW0gPSAoYW5pbS0+cHJvcGVydHkoKSA9PSBDU1NQcm9wZXJ0eUludmFsaWQpID8gMCA6Ci0gICAg
ICAgIG1fdHJhbnNpdGlvbnMuZ2V0KGFuaW0tPnByb3BlcnR5KCkpOworICAgICAgICBJbXBsaWNp
dEFuaW1hdGlvbiogaW1wbEFuaW0gPSAoYW5pbS0+cHJvcGVydHkoKSA9PSBDU1NQcm9wZXJ0eUlu
dmFsaWQpID8gMCA6IG1fdHJhbnNpdGlvbnMuZ2V0KGFuaW0tPnByb3BlcnR5KCkpOwogICAgICAg
ICBpZiAoIWltcGxBbmltIHx8ICFpbXBsQW5pbS0+YW5pbWF0aW9uc01hdGNoKGFuaW0pKSB7CiAg
ICAgICAgICAgICB0cmFuc2l0aW9uc0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7
CkBAIC05MTIsMTUgKzk4MSw4MyBAQCB2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6dXBkYXRlVHJh
bnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgUmVuZGVyU3R5bGUqCiAgICAgICAgIAog
ICAgICAgICBpbnQgcHJvcGVydHkgICAgICAgID0gYW5pbS0+cHJvcGVydHkoKTsKICAgICAgICAg
ZG91YmxlIGR1cmF0aW9uICAgICA9IGFuaW0tPmR1cmF0aW9uKCk7CisgICAgICAgIGludCBpdGVy
YXRpb25Db3VudCAgPSBhbmltLT5pdGVyYXRpb25Db3VudCgpOwogICAgICAgICBkb3VibGUgZGVs
YXkgICAgICAgID0gYW5pbS0+ZGVsYXkoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wZXJ0
eSAmJiAoZHVyYXRpb24gfHwgZGVsYXkpICYmICFtX3RyYW5zaXRpb25zLmNvbnRhaW5zKHByb3Bl
cnR5KSkgeworCisgICAgICAgIGlmIChwcm9wZXJ0eSAmJiAoZHVyYXRpb24gfHwgZGVsYXkpICYm
IGl0ZXJhdGlvbkNvdW50ICYmICFtX3RyYW5zaXRpb25zLmNvbnRhaW5zKHByb3BlcnR5KSkgewog
ICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW1hdGlvbiA9IG5ldyBJbXBsaWNpdEFu
aW1hdGlvbihjb25zdF9jYXN0PFRyYW5zaXRpb24qPihhbmltKSwgcmVuZGVyZXIsIHRoaXMpOwog
ICAgICAgICAgICAgbV90cmFuc2l0aW9ucy5zZXQocHJvcGVydHksIGFuaW1hdGlvbik7CiAgICAg
ICAgIH0KICAgICB9CiB9CiAKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjp1cGRhdGVLZXlmcmFt
ZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgUmVuZGVyU3R5bGUqIGN1cnJlbnRT
dHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQoreworICAgIGNvbnN0IFRyYW5zaXRpb24q
IGFuaW0gPSB0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpOworICAgIC8vIFRoZXJlIGlzIG5vdGhp
bmcgdG8gZG8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgYW5pbWF0aW9ucyBvciBpZiB0aGUgY3VycmVu
dCBhbmQgdGFyZ2V0IGFuaW1hdGlvbnMgYXJlIHRoZSBzYW1lCisgICAgaWYgKChtX2tleWZyYW1l
QW5pbWF0aW9ucy5pc0VtcHR5KCkgJiYgIWFuaW0pIHx8CisgICAgICAgIChjdXJyZW50U3R5bGUg
JiYgY3VycmVudFN0eWxlLT5hbmltYXRpb25zKCkgJiYgKihjdXJyZW50U3R5bGUtPmFuaW1hdGlv
bnMoKSkgPT0gKmFuaW0pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgICAgIAorICAg
IHNpemVfdCBudW1BbmltcyA9IDA7CisgICAgYm9vbCBhbmltc0NoYW5nZWQgPSBmYWxzZTsKKyAg
ICAKKyAgICAvLyBTZWUgaWYgdGhlIGxpc3RzIG1hdGNoCisgICAgZm9yICggOyBhbmltOyBhbmlt
ID0gYW5pbS0+bmV4dCgpKSB7CisgICAgICAgIGlmICghYW5pbS0+aXNWYWxpZEFuaW1hdGlvbigp
KSB7CisgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtmQW5pbSA9IChudW1BbmltcyA8IG1fa2V5
ZnJhbWVBbmltYXRpb25zLnNpemUoKSkgPyBtX2tleWZyYW1lQW5pbWF0aW9uc1tudW1Bbmltc10g
OiAwOworICAgICAgICAgICAgaWYgKCFrZkFuaW0gfHwgIWtmQW5pbS0+YW5pbWF0aW9uc01hdGNo
KGFuaW0pKQorICAgICAgICAgICAgICAgIGFuaW1zQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBBbmltYXRpb25zIG1hdGNoLCBidXQgcGxheSBzdGF0ZXMgbWF5IGRpZmZlci4gdXBkYXRl
IGlmIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnVwZGF0ZVBsYXlTdGF0ZShh
bmltLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxheVN0YXRlUGxheWluZyk7CisgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHNhdmVkIGFuaW1hdGlvbiB0
byB0aGlzIG5ldyBvbmUsIGp1c3QgaW4gY2FzZSB0aGUgcGxheSBzdGF0ZSBoYXMgY2hhbmdlZAor
ICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnNldEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytudW1BbmltczsK
KyAgICB9CisgICAgCisgICAgaWYgKCFhbmltc0NoYW5nZWQgJiYgbV9rZXlmcmFtZUFuaW1hdGlv
bnMuc2l6ZSgpICE9IG51bUFuaW1zKQorICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOworCisg
ICAgaWYgKCFhbmltc0NoYW5nZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEFuaW1hdGlv
bnMgaGF2ZSBjaGFuZ2VkLCB1cGRhdGUgdGhlIGxpc3QKKyAgICByZXNldEFuaW1hdGlvbnMocmVu
ZGVyZXIpOworCisgICAgaWYgKCF0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBBZGQgYWxsIHRoZSBuZXcgYW5pbWF0aW9ucworICAgIGludCBpbmRl
eCA9IDA7CisgICAgZm9yIChhbmltID0gdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKTsgYW5pbTsg
YW5pbSA9IGFuaW0tPm5leHQoKSwgKytpbmRleCkgeworCisgICAgICAgIGlmICghYW5pbS0+aXNW
YWxpZEFuaW1hdGlvbigpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAg
ICAgICAgLy8gRG9uJ3QgYm90aGVyIGFkZGluZyB0aGUgYW5pbWF0aW9uIGlmIGl0IGhhcyBubyBr
ZXlmcmFtZXMgb3Igd29uJ3QgYW5pbWF0ZQorICAgICAgICBpZiAoKGFuaW0tPmR1cmF0aW9uKCkg
fHwgYW5pbS0+ZGVsYXkoKSkgJiYgYW5pbS0+aXRlcmF0aW9uQ291bnQoKSAmJgorICAgICAgICAg
ICAgIGFuaW0tPmtleWZyYW1lTGlzdCgpLmdldCgpICYmICFhbmltLT5rZXlmcmFtZUxpc3QoKS0+
aXNFbXB0eSgpKQorICAgICAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMuYXBwZW5kKG5ldyBL
ZXlmcmFtZUFuaW1hdGlvbihjb25zdF9jYXN0PFRyYW5zaXRpb24qPihhbmltKSwgcmVuZGVyZXIs
IGluZGV4LCB0aGlzKSk7CisgICAgfQorfQorCitpbnQgQ29tcG9zaXRlQW5pbWF0aW9uOjpmaW5k
S2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQoreworICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgKGludCkgbV9rZXlmcmFtZUFuaW1hdGlvbnMuc2l6ZSgpOyArK2kpCisg
ICAgICAgIGlmIChtX2tleWZyYW1lQW5pbWF0aW9uc1tpXS0+bmFtZSgpID09IG5hbWUpCisgICAg
ICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7Cit9CisKIFJlbmRlclN0eWxlKiBDb21w
b3NpdGVBbmltYXRpb246OmFuaW1hdGUoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgUmVuZGVyU3R5
bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQogewogICAgIFJlbmRl
clN0eWxlKiByZXN1bHRTdHlsZSA9IDA7CkBAIC05MzksNiArMTA3NiwxNyBAQCBSZW5kZXJTdHls
ZSogQ29tcG9zaXRlQW5pbWF0aW9uOjphbmltYXRlKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJl
bmRlclN0eWxlKiBjdQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgdXBk
YXRlS2V5ZnJhbWVBbmltYXRpb25zKHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxl
KTsKKyAgICAKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFuaW1hdGlvbiBvYmplY3RzIHJlYWR5
LCBsZXQgdGhlbSBrbm93IGFib3V0IHRoZSBuZXcgZ29hbCBzdGF0ZS4gIFdlIHdhbnQgdGhlbQor
ICAgIC8vIHRvIGZpbGwgaW4gYSBSZW5kZXJTdHlsZSomIG9ubHkgaWYgbmVlZGVkLgorICAgIFZl
Y3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJh
bWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoVmVjdG9yPEtleWZyYW1lQW5pbWF0aW9uKj46
OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0g
a2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSAqaXQ7Cisg
ICAgICAgIGlmIChhbmltKQorICAgICAgICAgICAgYW5pbS0+YW5pbWF0ZSh0aGlzLCByZW5kZXJl
ciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSwgcmVzdWx0U3R5bGUpOworICAgIH0KICAgICAK
ICAgICByZXR1cm4gcmVzdWx0U3R5bGUgPyByZXN1bHRTdHlsZSA6IHRhcmdldFN0eWxlOwogfQpA
QCAtOTUyLDYgKzExMDAsMTIgQEAgdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldEFuaW1hdGlu
Zyhib29sIGluQW5pbWF0aW5nKQogICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIHRyYW5zaXRp
b24gPSBpdC0+c2Vjb25kOwogICAgICAgICB0cmFuc2l0aW9uLT5zZXRBbmltYXRpbmcoaW5Bbmlt
YXRpbmcpOwogICAgIH0gICAgCisKKyAgICBWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29u
c3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3Ig
KFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJh
bWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZy
YW1lQW5pbWF0aW9uKiBhbmltID0gKml0OworICAgICAgICBhbmltLT5zZXRBbmltYXRpbmcoaW5B
bmltYXRpbmcpOworICAgIH0KIH0KIAogYm9vbCBDb21wb3NpdGVBbmltYXRpb246OmFuaW1hdGlu
ZygpCkBAIC05NjEsNyArMTExNSwxNSBAQCBib29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0
aW5nKCkKICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFuc2l0aW9uID0gaXQtPnNlY29u
ZDsKICAgICAgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi0+YW5pbWF0aW5nKCkgJiYg
dHJhbnNpdGlvbi0+cnVubmluZygpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAg
ICAKKyAgICB9CisKKyAgICBWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0
b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxL
ZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRp
b25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0
aW9uKiBhbmltID0gKml0OworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5ydW5uaW5nKCkgJiYg
YW5pbS0+YW5pbWF0aW5nKCkgJiYgYW5pbS0+YWN0aXZlKCkpCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogICAgIHJldHVybiBmYWxzZTsKIH0KIApA
QCAtOTc2LDYgKzExMzgsMTYgQEAgdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnJlc2V0VHJhbnNp
dGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKICAgICBtX3RyYW5zaXRpb25zLmNsZWFyKCk7
CiB9CiAKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldEFuaW1hdGlvbnMoUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlcikKK3sKKyAgICBWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3Rf
aXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFZl
Y3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVB
bmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1l
QW5pbWF0aW9uKiBhbmltID0gKml0OworICAgICAgICBkZWxldGUgYW5pbTsKKyAgICB9CisgICAg
bV9rZXlmcmFtZUFuaW1hdGlvbnMuY2xlYXIoKTsKK30KKwogdm9pZCBDb21wb3NpdGVBbmltYXRp
b246OmNsZWFudXBGaW5pc2hlZEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKIHsK
ICAgICBpZiAoc3VzcGVuZGVkKCkpCkBAIC05OTIsNiArMTE2NCw0OCBAQCB2b2lkIENvbXBvc2l0
ZUFuaW1hdGlvbjo6Y2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRl
cmVyKQogICAgICAgICAgICAgYW5pbS0+cmVzZXQocmVuZGVyZXIpOwogICAgICAgICB9CiAgICAg
fQorCisgICAgLy8gTWFrZSBhIGxpc3Qgb2YgYW5pbWF0aW9ucyB0byBiZSBkZWxldGVkCisgICAg
VmVjdG9yPGludD4gZmluaXNoZWRBbmltYXRpb25zOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCAoaW50KSBtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBLZXlm
cmFtZUFuaW1hdGlvbiogYW5pbSA9IG1fa2V5ZnJhbWVBbmltYXRpb25zW2ldOworICAgICAgICBp
ZiAoIWFuaW0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFuaW0tPnBvc3Rh
Y3RpdmUoKSAmJiAhYW5pbS0+d2FpdGluZ0ZvckVuZEV2ZW50KCkpCisgICAgICAgICAgICBmaW5p
c2hlZEFuaW1hdGlvbnMuYXBwZW5kKGkpOworICAgIH0KKyAgICAKKyAgICAvLyBEZWxldGUgdGhl
bQorICAgIGZvciAoVmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ID0gZmluaXNoZWRBbmltYXRpb25z
LmJlZ2luKCk7IGl0ICE9IGZpbmlzaGVkQW5pbWF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAg
ICBtX2tleWZyYW1lQW5pbWF0aW9uc1sqaXRdLT5yZXNldChyZW5kZXJlcik7CisgICAgICAgIGRl
bGV0ZSBtX2tleWZyYW1lQW5pbWF0aW9uc1sqaXRdOworICAgICAgICBtX2tleWZyYW1lQW5pbWF0
aW9ucy5yZW1vdmUoKml0KTsKKyAgICB9CisgICAgCit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0
aW9uOjpzZXRBbmltYXRpb25TdGFydFRpbWUoZG91YmxlIHQpCit7CisgICAgLy8gc2V0IHN0YXJ0
IHRpbWUgb24gYWxsIGFuaW1hdGlvbnMgd2FpdGluZyBmb3IgaXQKKyAgICBWZWN0b3I8S2V5ZnJh
bWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9u
cy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0
KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gKml0OworICAgICAgICBpZiAo
YW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3RhcnRUaW1lKCkpCisgICAgICAgICAgICBhbmltLT51
cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RBUlRfVElNRV9T
RVQsIHQpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldFRyYW5zaXRp
b25TdGFydFRpbWUoaW50IHByb3BlcnR5LCBkb3VibGUgdCkKK3sKKyAgICAvLyBzZXQgc3RhcnQg
dGltZSBmb3IgZ2l2ZW4gcHJvcGVydHkgdHJhbnNpdGlvbgorICAgIENTU1Byb3BlcnR5VHJhbnNp
dGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CisgICAg
Zm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJh
bnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEltcGxpY2l0QW5p
bWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+d2Fp
dGluZ0ZvclN0YXJ0VGltZSgpICYmCisgICAgICAgICAgICAgICAgICAgIChhbmltLT5wcm9wZXJ0
eSgpID09IHByb3BlcnR5IHx8IGFuaW0tPnByb3BlcnR5KCkgPT0gY0FuaW1hdGVBbGwpKQorICAg
ICAgICAgICAgYW5pbS0+dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lO
UFVUX1NUQVJUX1RJTUVfU0VULCB0KTsKKyAgICB9CiB9CiAKIHZvaWQgQ29tcG9zaXRlQW5pbWF0
aW9uOjpzdXNwZW5kQW5pbWF0aW9ucygpCkBAIC0xMDAxLDYgKzEyMTUsMTQgQEAgdm9pZCBDb21w
b3NpdGVBbmltYXRpb246OnN1c3BlbmRBbmltYXRpb25zKCkKICAgICAKICAgICBtX3N1c3BlbmRl
ZCA9IHRydWU7CiAKKyAgICBWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0
b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxL
ZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRp
b25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0
aW9uKiBhbmltID0gKml0OworICAgICAgICBpZiAoYW5pbSkgeworICAgICAgICAgICAgYW5pbS0+
dXBkYXRlUGxheVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5k
KCk7CiAgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBp
dCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CiAgICAgICAgIElt
cGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKQEAgLTEwMTcsNiArMTIzOSwxNCBA
QCB2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lQW5pbWF0aW9ucygpCiAgICAgCiAgICAg
bV9zdXNwZW5kZWQgPSBmYWxzZTsKIAorICAgIFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpj
b25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZv
ciAoVmVjdG9yPEtleWZyYW1lQW5pbWF0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlm
cmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5
ZnJhbWVBbmltYXRpb24qIGFuaW0gPSAqaXQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPnBs
YXlTdGF0ZVBsYXlpbmcoKSkgeworICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKHRy
dWUpOworICAgICAgICB9CisgICAgfQorCiAgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKICAgICBmb3IgKENTU1By
b3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFu
aW0gPSBpdC0+c2Vjb25kOwpAQCAtMTA1MSw2ICsxMjgxLDEzIEBAIHZvaWQgQ29tcG9zaXRlQW5p
bWF0aW9uOjpzdHlsZUF2YWlsYWJsZSgpCiAgICAgaWYgKG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0
ZXJzID09IDApCiAgICAgICAgIHJldHVybjsKICAgICAKKyAgICBWZWN0b3I8S2V5ZnJhbWVBbmlt
YXRpb24qPjo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQo
KTsKKyAgICBmb3IgKFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVyYXRvciBp
dCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Cisg
ICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gKml0OworICAgICAgICBpZiAoYW5pbSAm
JiBhbmltLT53YWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoKSkKKyAgICAgICAgICAgIGFuaW0tPnVw
ZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFC
TEUsIC0xKTsKKyAgICB9CisgICAgCiAgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKICAgICBmb3IgKENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0g
PSBpdC0+c2Vjb25kOwpAQCAtMTA2MSwxMiArMTI5OCwyMCBAQCB2b2lkIENvbXBvc2l0ZUFuaW1h
dGlvbjo6c3R5bGVBdmFpbGFibGUoKQogCiBib29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6aXNBbmlt
YXRpbmdQcm9wZXJ0eShpbnQgcHJvcGVydHkpIGNvbnN0CiB7CisgICAgVmVjdG9yPEtleWZyYW1l
QW5pbWF0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMu
ZW5kKCk7CisgICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkg
eworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9ICppdDsKKyAgICAgICAgaWYgKGFu
aW0gJiYgYW5pbS0+aXNBbmltYXRpbmdQcm9wZXJ0eShwcm9wZXJ0eSkpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25z
dF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwogICAgIGZvciAoQ1NTUHJvcGVy
dHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2lu
KCk7IGl0ICE9IGVuZDsgKytpdCkgewogICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9
IGl0LT5zZWNvbmQ7CiAgICAgICAgIGlmIChhbmltICYmIGFuaW0tPmlzQW5pbWF0aW5nUHJvcGVy
dHkocHJvcGVydHkpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCiAgICAgcmV0
dXJuIGZhbHNlOwogfQogCkBAIC0xMTU4LDMzICsxNDAzLDYgQEAgcHJpdmF0ZToKICAgICB2b2lk
IChSZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShTaGFkb3dEYXRhKiwgYm9vbCk7CiB9OwogCi1jbGFz
cyBQcm9wZXJ0eVdyYXBwZXJJbnRTaXplIDogcHVibGljIFByb3BlcnR5V3JhcHBlckdldHRlcjxJ
bnRTaXplPiB7Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVySW50U2l6ZShpbnQgcHJvcCwg
SW50U2l6ZSAoUmVuZGVyU3R5bGU6OipnZXR0ZXIpKCkgY29uc3QsIHZvaWQgKFJlbmRlclN0eWxl
Ojoqc2V0dGVyKShjb25zdCBJbnRTaXplJikpCi0gICAgOiBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8
SW50U2l6ZT4ocHJvcCwgZ2V0dGVyKQotICAgICwgbV9zZXR0ZXIoc2V0dGVyKQotICAgIHsgfQot
ICAgIAotICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0
IFJlbmRlclN0eWxlKiBiKSBjb25zdAotICAgIHsKLSAgICAgICAgSW50U2l6ZSBzaXplYSA9IChh
LT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIEludFNpemUgc2l6ZWIgPSAoYi0+Km1fZ2V0dGVyKSgp
OwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChzaXplYSA9PSBzaXplYik7Ci0gICAgfQotICAg
IAotICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5kZXJT
dHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKSBjb25zdAotICAgIHsK
LSAgICAgICAgSW50U2l6ZSBzaXplYSA9IChhLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIEludFNp
emUgc2l6ZWIgPSAoYi0+Km1fZ2V0dGVyKSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAo
ZHN0LT4qbV9zZXR0ZXIpKGJsZW5kRnVuYyhzaXplYSwgc2l6ZWIsIHByb2cpKTsKLSAgICB9Ci0g
ICAgCi1wcml2YXRlOgotICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0ZXIpKGNvbnN0IElu
dFNpemUmKTsKLX07Ci0KIGNsYXNzIFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yIDog
cHVibGljIFByb3BlcnR5V3JhcHBlckJhc2UgewogcHVibGljOgogICAgIFByb3BlcnR5V3JhcHBl
ck1heWJlSW52YWxpZENvbG9yKGludCBwcm9wLCBjb25zdCBDb2xvciYgKFJlbmRlclN0eWxlOjoq
Z2V0dGVyKSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoY29uc3QgQ29sb3Im
KSkKQEAgLTEzMzEsMTAgKzE1NDksMTAgQEAgdm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0
ZTo6ZW5zdXJlUHJvcGVydHlNYXAoKQogICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmPihDU1NQcm9w
ZXJ0eVdlYmtpdFRyYW5zZm9ybSwgJlJlbmRlclN0eWxlOjp0cmFuc2Zvcm0sICZSZW5kZXJTdHls
ZTo6c2V0VHJhbnNmb3JtKSk7CiAgICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdp
blgsICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWCwgJlJlbmRlclN0eWxlOjpzZXRUcmFu
c2Zvcm1PcmlnaW5YKSk7CiAgICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblks
ICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWSwgJlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zv
cm1PcmlnaW5ZKSk7Ci0gICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXJJbnRTaXplKENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVG9wTGVmdFJhZGl1cywg
JlJlbmRlclN0eWxlOjpib3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRl
clRvcExlZnRSYWRpdXMpKTsKLSAgICAgICAgZ19wcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3
IFByb3BlcnR5V3JhcHBlckludFNpemUoQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJUb3BSaWdodFJh
ZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BSaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpz
ZXRCb3JkZXJUb3BSaWdodFJhZGl1cykpOwotICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVySW50U2l6ZShDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJv
dHRvbUxlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJl
bmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVzKSk7Ci0gICAgICAgIGdfcHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJJbnRTaXplKENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9t
UmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMpKTsK
KyAgICAgICAgZ19wcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxj
b25zdCBJbnRTaXplJj4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVu
ZGVyU3R5bGU6OmJvcmRlclRvcExlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9w
TGVmdFJhZGl1cykpOworICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclRvcFJp
Z2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5
bGU6OnNldEJvcmRlclRvcFJpZ2h0UmFkaXVzKSk7CisgICAgICAgIGdfcHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJCb3R0b21M
ZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbUxlZnRSYWRpdXMpKTsKKyAg
ICAgICAgZ19wcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25z
dCBJbnRTaXplJj4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJl
bmRlclN0eWxlOjpib3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3Jk
ZXJCb3R0b21SaWdodFJhZGl1cykpOwogICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPEVWaXNpYmlsaXR5PihDU1NQcm9wZXJ0eVZpc2liaWxpdHks
ICZSZW5kZXJTdHlsZTo6dmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjpzZXRWaXNpYmlsaXR5KSk7
CiAgICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
ZmxvYXQ+KENTU1Byb3BlcnR5Wm9vbSwgJlJlbmRlclN0eWxlOjp6b29tLCAmUmVuZGVyU3R5bGU6
OnNldFpvb20pKTsKICAgICAgICAgCkBAIC0xNDk4LDggKzE3MTYsNiBAQCB2b2lkIEFuaW1hdGlv
bkNvbnRyb2xsZXJQcml2YXRlOjpzdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKQogCiB2
b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphbmltYXRpb25UaW1lckZpcmVkKFRpbWVy
PEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlPiogdGltZXIpCiB7Ci0gICAgLy9jbGVhbnVwRmlu
aXNoZWRBbmltYXRpb25zKCk7Ci0gICAgCiAgICAgLy8gV2hlbiB0aGUgdGltZXIgZmlyZXMsIGFs
bCB3ZSBkbyBpcyBjYWxsIHNldENoYW5nZWQgb24gYWxsIERPTSBub2RlcyB3aXRoIHJ1bm5pbmcg
YW5pbWF0aW9ucyBhbmQgdGhlbiBkbyBhbiBpbW1lZGlhdGUKICAgICAvLyB1cGRhdGVSZW5kZXJp
bmcuICBJdCB3aWxsIHRoZW4gY2FsbCBiYWNrIHRvIHVzIHdpdGggbmV3IGluZm9ybWF0aW9uLgog
ICAgIGJvb2wgYW5pbWF0aW5nID0gZmFsc2U7CkBAIC0xNjA1LDIwICsxODIxLDExIEBAIHZvaWQg
SW1wbGljaXRBbmltYXRpb246OmFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRpb24s
IFJlbmRlck9iamVjdCogcmVuCiAgICAgLy9BU1NFUlQobmVlZHNBbmltICE9IG1fd2FpdGVkRm9y
UmVzcG9uc2UgfHwgcHJlYWN0aXZlKCkpOwogfQogCi1ib29sIEltcGxpY2l0QW5pbWF0aW9uOjpz
dGFydEFuaW1hdGlvbihkb3VibGUgYmVnaW5UaW1lKQotewotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotdm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6ZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpCi17Ci19
Ci0KIHZvaWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBz
ZWRUaW1lKQogewotICAgIC8vIHdlJ3JlIGNvbnZlcnRpbmcgdGhlIGFuaW1hdGlvbiBpbnRvIGEg
dHJhbnNpdGlvbiBoZXJlCisgICAgLy8gV2UncmUgY29udmVydGluZyB0aGUgYW5pbWF0aW9uIGlu
dG8gYSB0cmFuc2l0aW9uIGhlcmUKICAgICBpZiAoIXNlbmRUcmFuc2l0aW9uRXZlbnQoRXZlbnRO
YW1lczo6d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50LCBpbkVsYXBzZWRUaW1lKSkgewotICAgICAg
ICAvLyB3ZSBkaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQsIHdoaWNoIHdvdWxkIGNhbGwgZW5kQW5p
bWF0aW9uKCksIHNvIHdlJ2xsIGp1c3QgZW5kCisgICAgICAgIC8vIFdlIGRpZG4ndCBkaXNwYXRj
aCBhbiBldmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRBbmltYXRpb24oKSwgc28gd2UnbGwganVz
dCBlbmQKICAgICAgICAgLy8gaXQgaGVyZS4KICAgICAgICAgZW5kQW5pbWF0aW9uKHRydWUpOwog
ICAgIH0KQEAgLTE2MjYsNyArMTgzMyw4IEBAIHZvaWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5p
bWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKQogCiBib29sIEltcGxpY2l0QW5pbWF0aW9u
OjpzZW5kVHJhbnNpdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRv
dWJsZSBpbkVsYXBzZWRUaW1lKQogewotICAgIHJldHVybiBmYWxzZTsgLy8gZGlkbid0IGRpc3Bh
dGNoIGFuIGV2ZW50CisgICAgLy8gRklYTUU6IGV2ZW50IGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBn
byBoZXJlCisgICAgcmV0dXJuIGZhbHNlOyAvLyBEaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQKIH0K
IAogdm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6cmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwg
Y29uc3QgUmVuZGVyU3R5bGUqIGZyb20gLyogPSAwICovLCBjb25zdCBSZW5kZXJTdHlsZSogdG8g
LyogPSAwICovKQpAQCAtMTY2Nyw2ICsxODc1LDE0NiBAQCBib29sIEltcGxpY2l0QW5pbWF0aW9u
OjphZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAogCiAjcHJhZ21hIG1hcmsgLQog
Cit2b2lkIEtleWZyYW1lQW5pbWF0aW9uOjphbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiogYW5p
bWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVu
dFN0eWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRl
clN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBpb0FuaW1hdGVkU3R5bGUpCit7Cisg
ICAgLy8gSWYgd2UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQsIHdlIHdpbGwgbm90IGhhdmUgYSB2YWxp
ZCBzdGFydCB0aW1lLCBzbyBqdXN0IHN0YXJ0IHRoZSBhbmltYXRpb24gaWYgbmVlZGVkCisgICAg
aWYgKGlzbmV3KCkgJiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQ
bGF5aW5nICYmIG1fb2JqZWN0LT5kb2N1bWVudCgpLT5sb2FkQ29tcGxldGUoKSkKKyAgICAgICAg
dXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiwgLTEpOworICAg
IAorICAgIC8vIElmIHdlIGdldCB0aGlzIGZhciBhbmQgdGhlIGFuaW1hdGlvbiBpcyBkb25lLCBp
dCBtZWFucyB3ZSBhcmUgY2xlYW5pbmcgdXAgYSBqdXN0IGZpbmlzaGVkIGFuaW1hdGlvbi4KKyAg
ICAvLyBJZiBzbywgd2UgbmVlZCB0byBzZW5kIGJhY2sgdGhlIHRhcmdldFN0eWxlCisgICAgaWYg
KHBvc3RhY3RpdmUoKSkgeworICAgICAgICBpZiAoIWlvQW5pbWF0ZWRTdHlsZSkKKyAgICAgICAg
ICAgIGlvQW5pbWF0ZWRTdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0YXJnZXRTdHls
ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBhcmUgd2FpdGluZyBm
b3IgdGhlIHN0YXJ0IHRpbWVyLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc3R5bGUgeWV0
CisgICAgLy8gU3BlY2lhbCBjYXNlIC0gaWYgdGhlIGRlbGF5IHRpbWUgaXMgMCwgdGhlbiB3ZSBk
byB3YW50IHRvIHNldCB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlCisgICAgLy8gYW5pbWF0aW9uIHJp
Z2h0IGF3YXkuIFRoaXMgYXZvaWRzIGEgZmxhc2ggd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0cwor
ICAgIGlmICh3YWl0aW5nVG9TdGFydCgpICYmIG1fYW5pbWF0aW9uLT5kZWxheSgpID4gMCkKKyAg
ICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRvIGJlIG1vcmUgZWZm
aWNpZW50IGFib3V0IGRldGVybWluaW5nIHdoaWNoIGtleWZyYW1lcyB3ZSBhcmUgYW5pbWF0aW5n
IGJldHdlZW4uCisgICAgLy8gV2Ugc2hvdWxkIGNhY2hlIHRoZSBsYXN0IHBhaXIgb3Igc29tZXRo
aW5nCisgICAgCisgICAgLy8gRmluZCB0aGUgZmlyc3Qga2V5CisgICAgZG91YmxlIGVsYXBzZWRU
aW1lID0gKG1fc3RhcnRUaW1lID4gMCkgPyAoKHJ1bm5pbmcoKSA/IGN1cnJlbnRUaW1lKCkgOiBt
X3BhdXNlVGltZSkgLSBtX3N0YXJ0VGltZSkgOiAwOworICAgIGlmIChlbGFwc2VkVGltZSA8IDAp
CisgICAgICAgIGVsYXBzZWRUaW1lID0gMDsKKyAgICAgICAgCisgICAgZG91YmxlIHQgPSBtX2Fu
aW1hdGlvbi0+ZHVyYXRpb24oKSA/IChlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlv
bigpKSA6IDE7CisgICAgaW50IGkgPSAoaW50KSB0OworICAgIHQgLT0gaTsKKyAgICBpZiAobV9h
bmltYXRpb24tPmRpcmVjdGlvbigpICYmIChpICYgMSkpCisgICAgICAgIHQgPSAxIC0gdDsKKwor
ICAgIFJlbmRlclN0eWxlKiBmcm9tU3R5bGUgPSAwOworICAgIFJlbmRlclN0eWxlKiB0b1N0eWxl
ID0gMDsKKyAgICBkb3VibGUgc2NhbGUgPSAxOworICAgIGRvdWJsZSBvZmZzZXQgPSAwOworICAg
IGlmIChtX2tleWZyYW1lcy5nZXQoKSkgeworICAgICAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46
OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRLZXlmcmFtZXMoKTsKKyAgICAg
ICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlm
cmFtZXMtPmJlZ2luS2V5ZnJhbWVzKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAg
aWYgKHQgPCBpdC0+a2V5KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGtleSBzaG91
bGQgYWx3YXlzIGJlIDAsIHNvIHdlIHNob3VsZCBuZXZlciBzdWNjZWVkIG9uIHRoZSBmaXJzdCBr
ZXkKKyAgICAgICAgICAgICAgICBpZiAoIWZyb21TdHlsZSkKKyAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgc2NhbGUgPSAxIC8gKGl0LT5rZXkgLSBvZmZzZXQpOwor
ICAgICAgICAgICAgICAgIHRvU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oJihpdC0+
c3R5bGUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgb2Zmc2V0ID0gaXQtPmtleTsKKyAgICAgICAgICAgIGZyb21TdHls
ZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPigmKGl0LT5zdHlsZSkpOworICAgICAgICB9Cisg
ICAgfQorICAgIAorICAgIC8vIElmIGVpdGhlciBzdHlsZSBpcyAwIHdlIGhhdmUgYW4gaW52YWxp
ZCBjYXNlLCBqdXN0IHN0b3AgdGhlIGFuaW1hdGlvbgorICAgIGlmICghZnJvbVN0eWxlIHx8ICF0
b1N0eWxlKSB7CisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5J
TUFUSU9OLCAtMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLy8gUnVuIGEg
Y3ljbGUgb2YgYW5pbWF0aW9uLgorICAgIC8vIFdlIGtub3cgd2Ugd2lsbCBuZWVkIGEgbmV3IHJl
bmRlciBzdHlsZSwgc28gbWFrZSBvbmUgaWYgbmVlZGVkCisgICAgaWYgKCFpb0FuaW1hdGVkU3R5
bGUpCisgICAgICAgIGlvQW5pbWF0ZWRTdHlsZSA9IG5ldyAocmVuZGVyZXItPnJlbmRlckFyZW5h
KCkpIFJlbmRlclN0eWxlKCp0YXJnZXRTdHlsZSk7CisgICAgCisgICAgZG91YmxlIHByb2cgPSBw
cm9ncmVzcyhzY2FsZSwgb2Zmc2V0KTsKKworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hTZXQ8
aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoQW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGU6OmJsZW5kUHJvcGVydGllcygqaXQsIGlvQW5pbWF0ZWRTdHlsZSwgZnJvbVN0eWxlLCB0b1N0
eWxlLCBwcm9nKSkKKyAgICAgICAgICAgIHNldEFuaW1hdGluZygpOworICAgIH0KK30KKwordm9p
ZCBLZXlmcmFtZUFuaW1hdGlvbjo6ZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpCit7CisgICAgaWYg
KG1fb2JqZWN0KSB7CisgICAgICAgIC8vIEZJWE1FOiBuZWVkIHRvIGRldGVybWluZSBhY3R1YWwg
aW5kZXggKGluIGNhc2VzIHdoZXJlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYW5pbWF0aW9uIHBl
ciBUcmFuc2l0aW9uIG9iamVjdCkKKyAgICAgICAgCisgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9y
aWdpbmFsICh1bmFuaW1hdGVkKSBzdHlsZQorICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0LT5l
bGVtZW50KCkpOworICAgIH0KK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6b25BbmltYXRp
b25TdGFydChkb3VibGUgaW5FbGFwc2VkVGltZSkKK3sKKyAgICBzZW5kQW5pbWF0aW9uRXZlbnQo
RXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCwgaW5FbGFwc2VkVGltZSk7Cit9
CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uSXRlcmF0aW9uKGRvdWJsZSBp
bkVsYXBzZWRUaW1lKQoreworICAgIHNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJr
aXRBbmltYXRpb25JdGVyYXRpb25FdmVudCwgaW5FbGFwc2VkVGltZSk7Cit9CisKK3ZvaWQgS2V5
ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKQorewor
ICAgIC8vIEZJWE1FOiBzZXQgdGhlIHVuYW5pbWF0ZWQgc3R5bGUgb24gdGhlIGVsZW1lbnQKKyAg
ICBpZiAoIXNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRF
dmVudCwgaW5FbGFwc2VkVGltZSkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGRpc3BhdGNoIGFu
IGV2ZW50LCB3aGljaCB3b3VsZCBjYWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3ZSdsbCBqdXN0IGVu
ZAorICAgICAgICAvLyBpdCBoZXJlLgorICAgICAgICBlbmRBbmltYXRpb24odHJ1ZSk7CisgICAg
fQorfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9uOjpzZW5kQW5pbWF0aW9uRXZlbnQoY29uc3Qg
QXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpCit7CisgICAg
Ly8gRklYTUU6IEV2ZW50IGRpc3BhdGNoIGdvZXMgaGVyZQorICAgIHJldHVybiBmYWxzZTsgLy8g
ZGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om92
ZXJyaWRlQW5pbWF0aW9ucygpCit7CisgICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGltcGxpY2l0
IGFuaW1hdGlvbnMgdGhhdCBtYXRjaCB0aGUgcHJvcGVydGllcyBpbiB0aGUga2V5ZnJhbWUgYW5p
bWF0aW9uCisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1l
cy0+ZW5kUHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQor
ICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMo
Kml0KTsKK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1h
dGlvbnMoKQoreworICAgIC8vIFRoaXMgd2lsbCByZXN1bWUgb3ZlcnJpZGRlbiBpbXBsaWNpdCBh
bmltYXRpb25zCisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZy
YW1lcy0+ZW5kUHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0
KQorICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0
QW5pbWF0aW9ucygqaXQpOworfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9uOjphZmZlY3RzUHJv
cGVydHkoaW50IHByb3BlcnR5KSBjb25zdAoreworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hT
ZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVz
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoKCppdCkgPT0gcHJvcGVydHkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisj
cHJhZ21hIG1hcmsgLQorCiBBbmltYXRpb25Db250cm9sbGVyOjpBbmltYXRpb25Db250cm9sbGVy
KEZyYW1lKiBmcmFtZSkKIDogbV9kYXRhKG5ldyBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZShm
cmFtZSkpCiB7CkBAIC0xNjg4LDE2ICsyMDM2LDE4IEBAIHZvaWQgQW5pbWF0aW9uQ29udHJvbGxl
cjo6Y2FuY2VsQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQogfQogCiBSZW5kZXJT
dHlsZSogQW5pbWF0aW9uQ29udHJvbGxlcjo6dXBkYXRlQW5pbWF0aW9ucyhSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyLCBSZW5kZXJTdHlsZSogbmV3U3R5bGUpCi17ICAgIAorewogICAgIC8vIGRvbid0
IGRvIGFueXRoaW5nIGlmIHdlJ3JlIGluIHRoZSBjYWNoZQogICAgIGlmICghcmVuZGVyZXItPmRv
Y3VtZW50KCkgfHwgcmVuZGVyZXItPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpCiAgICAgICAg
IHJldHVybiBuZXdTdHlsZTsKICAgICAKICAgICBSZW5kZXJTdHlsZSogb2xkU3R5bGUgPSByZW5k
ZXJlci0+c3R5bGUoKTsKICAgICAKLSAgICBpZiAoKCFvbGRTdHlsZSB8fCAhb2xkU3R5bGUtPnRy
YW5zaXRpb25zKCkpICYmICFuZXdTdHlsZS0+dHJhbnNpdGlvbnMoKSkKLSAgICAgICAgcmV0dXJu
IG5ld1N0eWxlOwogICAgIAorICAgIGlmICgoIW9sZFN0eWxlIHx8ICghb2xkU3R5bGUtPmFuaW1h
dGlvbnMoKSAmJiAhb2xkU3R5bGUtPnRyYW5zaXRpb25zKCkpKSAmJiAKKyAgICAgICAgKCFuZXdT
dHlsZS0+YW5pbWF0aW9ucygpICYmICFuZXdTdHlsZS0+dHJhbnNpdGlvbnMoKSkpCisgICAgICAg
IHJldHVybiBuZXdTdHlsZTsKKwogICAgIFJlbmRlclN0eWxlKiBibGVuZGVkU3R5bGUgPSBuZXdT
dHlsZTsKICAgICAKICAgICAvLyBGZXRjaCBvdXIgY3VycmVudCBzZXQgb2YgaW1wbGljaXQgYW5p
bWF0aW9ucyBmcm9tIGEgaGFzaHRhYmxlLiAgV2UgdGhlbiBjb21wYXJlIHRoZW0KQEAgLTE3MjAs
NiArMjA3MCwxMiBAQCBSZW5kZXJTdHlsZSogQW5pbWF0aW9uQ29udHJvbGxlcjo6dXBkYXRlQW5p
bWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBSZW5kZQogICAgIHJldHVybiBibGVuZGVk
U3R5bGU7CiB9CiAKK3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c2V0QW5pbWF0aW9uU3RhcnRU
aW1lKFJlbmRlck9iamVjdCogb2JqLCBkb3VibGUgdCkKK3sKKyAgICBDb21wb3NpdGVBbmltYXRp
b24qIHJlbmRlcmVyQW5pbWF0aW9ucyA9IG1fZGF0YS0+YWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9u
KG9iaik7CisgICAgcmVuZGVyZXJBbmltYXRpb25zLT5zZXRBbmltYXRpb25TdGFydFRpbWUodCk7
Cit9CisKIGJvb2wgQW5pbWF0aW9uQ29udHJvbGxlcjo6aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVu
ZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSkgY29uc3QKIHsKICAgICByZXR1
cm4gbV9kYXRhLT5pc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihvYmosIHByb3BlcnR5KTsK
QEAgLTE3MjcsMTcgKzIwODMsMTEgQEAgYm9vbCBBbmltYXRpb25Db250cm9sbGVyOjppc0FuaW1h
dGluZ1Byb3BlcnR5T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHAKIAogdm9pZCBB
bmltYXRpb25Db250cm9sbGVyOjpzdXNwZW5kQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQp
CiB7Ci0jaWZkZWYgREVCVUdfU1RBVEVfTUFDSElORQotICAgIGZwcmludGYoc3RkZXJyLCAiQW5p
bWF0aW9uQ29udHJvbGxlciAlcCBzdXNwZW5kQW5pbWF0aW9ucyBmb3IgZG9jdW1lbnQgJXBcbiIs
IHRoaXMsIGRvY3VtZW50KTsKLSNlbmRpZgogICAgIG1fZGF0YS0+c3VzcGVuZEFuaW1hdGlvbnMo
ZG9jdW1lbnQpOwogfQogCiB2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6OnJlc3VtZUFuaW1hdGlv
bnMoRG9jdW1lbnQqIGRvY3VtZW50KQogewotI2lmZGVmIERFQlVHX1NUQVRFX01BQ0hJTkUKLSAg
ICBmcHJpbnRmKHN0ZGVyciwgIkFuaW1hdGlvbkNvbnRyb2xsZXIgJXAgcmVzdW1lQW5pbWF0aW9u
cyBmb3IgZG9jdW1lbnQgJXBcbiIsIHRoaXMsIGRvY3VtZW50KTsKLSNlbmRpZgogICAgIG1fZGF0
YS0+cmVzdW1lQW5pbWF0aW9ucyhkb2N1bWVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGFnZS9BbmltYXRpb25Db250cm9sbGVyLmggYi9XZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJv
bGxlci5oCmluZGV4IDkwYzQ5ZDkuLjkwOGRiMjIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGFnZS9B
bmltYXRpb25Db250cm9sbGVyLmgKKysrIGIvV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xs
ZXIuaApAQCAtNDgsNiArNDgsOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBjYW5jZWxBbmltYXRpb25z
KFJlbmRlck9iamVjdCopOwogICAgIFJlbmRlclN0eWxlKiB1cGRhdGVBbmltYXRpb25zKFJlbmRl
ck9iamVjdCosIFJlbmRlclN0eWxlKiBuZXdTdHlsZSk7CiAgICAgCisgICAgdm9pZCBzZXRBbmlt
YXRpb25TdGFydFRpbWUoUmVuZGVyT2JqZWN0KiBvYmosIGRvdWJsZSB0KTsKKyAgICB2b2lkIHNl
dFRyYW5zaXRpb25TdGFydFRpbWUoUmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgZG91
YmxlIHQpOworCiAgICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihSZW5kZXJP
YmplY3QqIG9iaiwgaW50IHByb3BlcnR5KSBjb25zdDsKICAgICAKICAgICB2b2lkIHN1c3BlbmRB
bmltYXRpb25zKERvY3VtZW50KiBkb2N1bWVudCk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJPYmplY3QuY3BwIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNw
cAppbmRleCAxMDdkNjFlLi41ZjAzYmZiIDEwMDY0NAotLS0gYS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuY3BwCisrKyBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAK
QEAgLTIxNTUsNyArMjE1NSw3IEBAIHZvaWQgUmVuZGVyT2JqZWN0OjpoYW5kbGVEeW5hbWljRmxv
YXRQb3NpdGlvbkNoYW5nZSgpCiAKIHZvaWQgUmVuZGVyT2JqZWN0OjpzZXRBbmltYXRhYmxlU3R5
bGUoUmVuZGVyU3R5bGUqIHN0eWxlKQogewotICAgIGlmICghaXNUZXh0KCkgJiYgbV9zdHlsZSAm
JiBzdHlsZSkKKyAgICBpZiAoIWlzVGV4dCgpICYmIHN0eWxlKQogICAgICAgICBzdHlsZSA9IGFu
aW1hdGlvbigpLT51cGRhdGVBbmltYXRpb25zKHRoaXMsIHN0eWxlKTsKIAogICAgIGlmIChzdHls
ZSkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL1JlbmRlclN0eWxlLmggYi9X
ZWJDb3JlL3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5oCmluZGV4IDZkMzFlMWEuLjVkZDFk
NjUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL1JlbmRlclN0eWxlLmgKKysr
IGIvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUvUmVuZGVyU3R5bGUuaApAQCAtMTkwNywxMCArMTkw
NywxMCBAQCBwdWJsaWM6CiAKICAgICBjb25zdCBOaW5lUGllY2VJbWFnZSYgYm9yZGVySW1hZ2Uo
KSBjb25zdCB7IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLmltYWdlOyB9CiAKLSAgICBJbnRTaXpl
IGJvcmRlclRvcExlZnRSYWRpdXMoKSBjb25zdCB7IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLnRv
cExlZnQ7IH0KLSAgICBJbnRTaXplIGJvcmRlclRvcFJpZ2h0UmFkaXVzKCkgY29uc3QgeyByZXR1
cm4gc3Vycm91bmQtPmJvcmRlci50b3BSaWdodDsgfQotICAgIEludFNpemUgYm9yZGVyQm90dG9t
TGVmdFJhZGl1cygpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIuYm90dG9tTGVmdDsg
fQotICAgIEludFNpemUgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMoKSBjb25zdCB7IHJldHVybiBz
dXJyb3VuZC0+Ym9yZGVyLmJvdHRvbVJpZ2h0OyB9CisgICAgY29uc3QgSW50U2l6ZSYgYm9yZGVy
VG9wTGVmdFJhZGl1cygpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIudG9wTGVmdDsg
fQorICAgIGNvbnN0IEludFNpemUmIGJvcmRlclRvcFJpZ2h0UmFkaXVzKCkgY29uc3QgeyByZXR1
cm4gc3Vycm91bmQtPmJvcmRlci50b3BSaWdodDsgfQorICAgIGNvbnN0IEludFNpemUmIGJvcmRl
ckJvdHRvbUxlZnRSYWRpdXMoKSBjb25zdCB7IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLmJvdHRv
bUxlZnQ7IH0KKyAgICBjb25zdCBJbnRTaXplJiBib3JkZXJCb3R0b21SaWdodFJhZGl1cygpIGNv
bnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIuYm90dG9tUmlnaHQ7IH0KICAgICBib29sIGhh
c0JvcmRlclJhZGl1cygpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIuaGFzQm9yZGVy
UmFkaXVzKCk7IH0KIAogICAgIHVuc2lnbmVkIHNob3J0ICBib3JkZXJMZWZ0V2lkdGgoKSBjb25z
dCB7IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLmJvcmRlckxlZnRXaWR0aCgpOyB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>22437</attachid>
            <date>2008-07-22 16:40:22 -0700</date>
            <delta_ts>2008-08-07 15:04:46 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>patch8-css-animations-updated.patch</filename>
            <type>text/plain</type>
            <size>43269</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwIGIvV2ViQ29yZS9j
c3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHAKaW5kZXggM2Q5N2ZiMi4uYmU3NTcyYiAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHAKKysrIGIvV2ViQ29yZS9jc3MvQ1NT
U3R5bGVTZWxlY3Rvci5jcHAKQEAgLTIwMiwyMiArMjAyLDIxIEBAIGlmIChpc0luaGVyaXQpIHsg
XAogICAgIH0gXAogICAgIFwKICAgICB3aGlsZSAoY3VyckNoaWxkKSB7IFwKLSAgICAgICAgLyog
UmVzZXQgYW55IHJlbWFpbmluZyB0cmFuc2l0aW9ucyB0byBub3QgaGF2ZSB0aGUgcHJvcGVydHkg
c2V0LiAqLyBcCisgICAgICAgIC8qIFJlc2V0IGFueSByZW1haW5pbmcgdHJhbnNpdGlvbiB0byBu
b3QgaGF2ZSB0aGUgcHJvcGVydHkgc2V0LiAqLyBcCiAgICAgICAgIGN1cnJDaGlsZC0+Y2xlYXIj
I1Byb3AoKTsgXAogICAgICAgICBjdXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPm5leHQoKTsgXAogICAg
IH0gXAotICAgIHJldHVybjsgXAotfSBcCi1pZiAoaXNJbml0aWFsKSB7IFwKK30gZWxzZSBpZiAo
aXNJbml0aWFsKSB7IFwKICAgICBUcmFuc2l0aW9uKiBjdXJyQ2hpbGQgPSBtX3N0eWxlLT5hY2Nl
c3NBbmltYXRpb25zKCk7IFwKICAgICBjdXJyQ2hpbGQtPnNldCMjUHJvcChSZW5kZXJTdHlsZTo6
aW5pdGlhbEFuaW1hdGlvbiMjUHJvcCgpKTsgXAogICAgIGZvciAoY3VyckNoaWxkID0gY3VyckNo
aWxkLT5uZXh0KCk7IGN1cnJDaGlsZDsgY3VyckNoaWxkID0gY3VyckNoaWxkLT5uZXh0KCkpIFwK
ICAgICAgICAgY3VyckNoaWxkLT5jbGVhciMjUHJvcCgpOyBcCi0gICAgcmV0dXJuOyBcCiB9CiAK
ICNkZWZpbmUgSEFORExFX0FOSU1BVElPTl9WQUxVRShwcm9wLCBQcm9wLCB2YWx1ZSkgeyBcCiBI
QU5ETEVfQU5JTUFUSU9OX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwgUHJvcCkgXAoraWYgKGlz
SW5oZXJpdCB8fCBpc0luaXRpYWwpIFwKKyAgICByZXR1cm47IFwKIFRyYW5zaXRpb24qIGN1cnJD
aGlsZCA9IG1fc3R5bGUtPmFjY2Vzc0FuaW1hdGlvbnMoKTsgXAogVHJhbnNpdGlvbiogcHJldkNo
aWxkID0gMDsgXAogaWYgKHZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7IFwKQEAgLTIyNSwxMSArMjI0
LDExIEBAIGlmICh2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkgeyBcCiAgICAgQ1NTVmFsdWVMaXN0KiB2
YWx1ZUxpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7IFwKICAgICBmb3Ig
KHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHZhbHVlTGlzdC0+bGVuZ3RoKCk7IGkrKykgeyBcCiAg
ICAgICAgIGlmICghY3VyckNoaWxkKSB7IFwKLSAgICAgICAgLyogTmVlZCB0byBtYWtlIGEgbmV3
IHRyYW5zaXRpb24gdG8gaG9sZCB0aGlzIHZhbHVlICovIFwKLSAgICAgICAgY3VyckNoaWxkID0g
bmV3IFRyYW5zaXRpb24oKTsgXAotICAgICAgICBwcmV2Q2hpbGQtPnNldE5leHQoY3VyckNoaWxk
KTsgXAorICAgICAgICAgICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IHRyYW5zaXRpb24gdG8gaG9s
ZCB0aGlzIHZhbHVlICovIFwKKyAgICAgICAgICAgIGN1cnJDaGlsZCA9IG5ldyBUcmFuc2l0aW9u
KCk7IFwKKyAgICAgICAgICAgIHByZXZDaGlsZC0+c2V0TmV4dChjdXJyQ2hpbGQpOyBcCiAgICAg
ICAgIH0gXAotICAgICAgICBtYXBBbmltYXRpb24jI1Byb3AoY3VyckNoaWxkLCB2YWx1ZUxpc3Qt
Pml0ZW0oaSkpOyBcCisgICAgICAgIG1hcEFuaW1hdGlvbiMjUHJvcChjdXJyQ2hpbGQsIHZhbHVl
TGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKSk7IFwKICAgICAgICAgcHJldkNoaWxkID0g
Y3VyckNoaWxkOyBcCiAgICAgICAgIGN1cnJDaGlsZCA9IGN1cnJDaGlsZC0+bmV4dCgpOyBcCiAg
ICAgfSBcCkBAIC0yMzgsNyArMjM3LDcgQEAgaWYgKHZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7IFwK
ICAgICBjdXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPm5leHQoKTsgXAogfSBcCiB3aGlsZSAoY3VyckNo
aWxkKSB7IFwKLSAgICAvKiBSZXNldCBhbGwgcmVtYWluaW5nIHRyYW5zaXRpb25zIHRvIG5vdCBo
YXZlIHRoZSBwcm9wZXJ0eSBzZXQuICovIFwKKyAgICAvKiBSZXNldCBhbGwgcmVtYWluaW5nIGxh
eWVycyB0byBub3QgaGF2ZSB0aGUgcHJvcGVydHkgc2V0LiAqLyBcCiAgICAgY3VyckNoaWxkLT5j
bGVhciMjUHJvcCgpOyBcCiAgICAgY3VyckNoaWxkID0gY3VyckNoaWxkLT5uZXh0KCk7IFwKIH0g
fQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwIGIvV2ViQ29yZS9kb20vRG9j
dW1lbnQuY3BwCmluZGV4IDA1YTdkYjAuLjI4NmJkMTAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZG9t
L0RvY3VtZW50LmNwcAorKysgYi9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKQEAgLTI5OSw2ICsy
OTksNyBAQCBEb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBib29sIGlzWEhUTUwpCiAg
ICAgLCBtX2luTG93QmFuZHdpZHRoRGlzcGxheShmYWxzZSkKICNlbmRpZgogICAgICwgbV9sb2Fk
Q29tcGxldGUoZmFsc2UpCisgICAgLCBtX3VubG9hZGluZyhmYWxzZSkKIHsKICAgICBtX2RvY3Vt
ZW50LnJlc2V0U2tpcHBpbmdSZWYodGhpcyk7CiAKQEAgLTExNjYsMTIgKzExNjcsMTMgQEAgYmFp
bF9vdXQ6CiAKIHZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVJlbmRlcmluZygpCiB7Ci0gICAgaWYgKGhh
c0NoYW5nZWRDaGlsZCgpKQorICAgIGlmIChoYXNDaGFuZ2VkQ2hpbGQoKSAmJiAhdW5sb2FkaW5n
KCkpCiAgICAgICAgIHJlY2FsY1N0eWxlKE5vQ2hhbmdlKTsKICAgICAKICAgICAvLyB0ZWxsIHRo
ZSBhbmltYXRpb24gY29udHJvbGxlciB0aGF0IHRoZSBzdHlsZSBpcyBhdmFpbGFibGUgYW5kIGl0
IGNhbiBzdGFydCBhbmltYXRpb25zCi0gICAgaWYgKG1fZnJhbWUpCisgICAgaWYgKG1fZnJhbWUp
IHsKICAgICAgICAgbV9mcmFtZS0+YW5pbWF0aW9uKCktPnN0eWxlQXZhaWxhYmxlKCk7CisgICAg
fQogfQogCiB2b2lkIERvY3VtZW50Ojp1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcoKQpAQCAtMTU1
NSw2ICsxNTU3LDkgQEAgdm9pZCBEb2N1bWVudDo6aW1wbGljaXRDbG9zZSgpCiAKICAgICBtX2xv
YWRDb21wbGV0ZSA9IHRydWU7CiAKKyAgICBpZiAoZikKKyAgICAgICAgZi0+YW5pbWF0aW9uKCkt
PnJlc3VtZUFuaW1hdGlvbnModGhpcyk7CisKICAgICBkaXNwYXRjaEltYWdlTG9hZEV2ZW50c05v
dygpOwogICAgIHRoaXMtPmRpc3BhdGNoV2luZG93RXZlbnQobG9hZEV2ZW50LCBmYWxzZSwgZmFs
c2UpOwogICAgIGlmIChmKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRG9jdW1lbnQuaCBiL1dl
YkNvcmUvZG9tL0RvY3VtZW50LmgKaW5kZXggOWIyOTY2ZS4uZTJiMDRmOCAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9kb20vRG9jdW1lbnQuaAorKysgYi9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCkBAIC03
NTMsNyArNzUzLDExIEBAIHB1YmxpYzoKICAgICAKICAgICAvLyBmb3IgYW5pbWF0aW9ucyB0byBr
bm93IHdoZXRoZXIgdGhleSBjYW4gcnVuIHlldCBvciBub3QKICAgICBib29sIGxvYWRDb21wbGV0
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbG9hZENvbXBsZXRlOyB9Ci0gICAgCisKKyAgICAvLyBmb3Ig
YW5pbWF0aW9ucyB0byBrbm93IHdoZXRoZXIgdGhleSBzaG91bGQgdXBkYXRlIHN0eWxlIHdoZW4g
ZG9jdW1lbnQgaXMgdW5sb2FkaW5nCisgICAgYm9vbCB1bmxvYWRpbmcoKSBjb25zdCB7IHJldHVy
biBtX3VubG9hZGluZzsgfQorICAgIHZvaWQgc2V0VW5sb2FkaW5nKGJvb2wgdW5sb2FkaW5nKSB7
IG1fdW5sb2FkaW5nID0gdW5sb2FkaW5nOyB9CisKICAgICAvLyBGRiBtZXRob2QgZm9yIGFjY2Vz
c2luZyB0aGUgc2VsZWN0aW9uIGFkZGVkIGZvciBjb21wYXRhYmlsaXR5LgogICAgIERPTVNlbGVj
dGlvbiogZ2V0U2VsZWN0aW9uKCkgY29uc3Q7CiAgICAgCkBAIC0xMDUxLDYgKzEwNTUsNyBAQCBw
cml2YXRlOgogI2VuZGlmCiAKICAgICBib29sIG1fbG9hZENvbXBsZXRlOyAgICAvLyBmb3IgYW5p
bWF0aW9ucyB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZXkgY2FuIHJ1biB5ZXQKKyAgICBib29s
IG1fdW5sb2FkaW5nOyAvLyBmb3IgYW5pbWF0aW9ucyB0byBrbm93IG5vdCB0byByZWNhbGMgc3R5
bGUgYWZ0ZXIgdGhlIGRvY3VtZW50IHN0YXJ0cyB1bmxvYWRpbmcKIH07CiAKIGlubGluZSBib29s
IERvY3VtZW50OjpoYXNFbGVtZW50V2l0aElkKEF0b21pY1N0cmluZ0ltcGwqIGlkKSBjb25zdApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuY3BwIGIvV2ViQ29yZS9sb2Fk
ZXIvRnJhbWVMb2FkZXIuY3BwCmluZGV4IGJjZWIxNDYuLjZjOWE2YWUgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVyLmNwcAorKysgYi9XZWJDb3JlL2xvYWRlci9GcmFtZUxv
YWRlci5jcHAKQEAgLTU4Myw4ICs1ODMsMTAgQEAgdm9pZCBGcmFtZUxvYWRlcjo6c3RvcExvYWRp
bmcoYm9vbCBzZW5kVW5sb2FkKQogICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Rm9jdXNlZE5v
ZGUpCiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGb2N1c2VkTm9kZS0+YWJvdXRUb1VubG9h
ZCgpOwogICAgICAgICAgICAgICAgIG1fZnJhbWUtPmRvY3VtZW50KCktPmRpc3BhdGNoV2luZG93
RXZlbnQodW5sb2FkRXZlbnQsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1f
ZnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgaWYgKG1fZnJhbWUtPmRvY3VtZW50
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+c2V0VW5sb2Fk
aW5nKHRydWUpOwogICAgICAgICAgICAgICAgICAgICBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cGRh
dGVSZW5kZXJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbV93YXNV
bmxvYWRFdmVudEVtaXR0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmIChtX2ZyYW1lLT5l
dmVudEhhbmRsZXIoKS0+cGVuZGluZ0ZyYW1lVW5sb2FkRXZlbnRDb3VudCgpKQogICAgICAgICAg
ICAgICAgICAgICBtX2ZyYW1lLT5ldmVudEhhbmRsZXIoKS0+Y2xlYXJQZW5kaW5nRnJhbWVVbmxv
YWRFdmVudENvdW50KCk7CkBAIC0zNjAzLDYgKzM2MDUsNyBAQCB2b2lkIEZyYW1lTG9hZGVyOjpv
cGVuZWQoKQogICAgICAgICB1cGRhdGVIaXN0b3J5Rm9yQ2xpZW50UmVkaXJlY3QoKTsKIAogICAg
IGlmIChtX2RvY3VtZW50TG9hZGVyLT5pc0xvYWRpbmdGcm9tQ2FjaGVkUGFnZSgpKSB7CisgICAg
ICAgIG1fZnJhbWUtPmRvY3VtZW50KCktPnNldFVubG9hZGluZyhmYWxzZSk7CiAgICAgICAgIG1f
ZnJhbWUtPmRvY3VtZW50KCktPmRpZFJlc3RvcmVGcm9tQ2FjaGUoKTsKICAgICAgICAgCiAgICAg
ICAgIC8vIEZvcmNlIGEgbGF5b3V0IHRvIHVwZGF0ZSB2aWV3IHNpemUgYW5kIHRoZXJlYnkgdXBk
YXRlIHNjcm9sbGJhcnMuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJv
bGxlci5jcHAgYi9XZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5jcHAKaW5kZXggODk0
MGEwOS4uNzk4N2UzNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xs
ZXIuY3BwCisrKyBiL1dlYkNvcmUvcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcApAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTYxLDYg
KzE2MSw3IEBAIHByaXZhdGU6CiAjcHJhZ21hIG1hcmsgLQogICAgIAogY2xhc3MgSW1wbGljaXRB
bmltYXRpb247CitjbGFzcyBLZXlmcmFtZUFuaW1hdGlvbjsKIGNsYXNzIEFuaW1hdGlvbkNvbnRy
b2xsZXJQcml2YXRlOwogCiAvLyBBIENvbXBvc2l0ZUFuaW1hdGlvbiByZXByZXNlbnRzIGEgY29s
bGVjdGlvbiBvZiBhbmltYXRpb25zIHRoYXQKQEAgLTE3Nyw2ICsxNzgsNyBAQCBwdWJsaWM6CiAg
ICAgfkNvbXBvc2l0ZUFuaW1hdGlvbigpCiAgICAgewogICAgICAgICBkZWxldGVBbGxWYWx1ZXMo
bV90cmFuc2l0aW9ucyk7CisgICAgICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2tleWZyYW1lQW5pbWF0
aW9ucyk7CiAgICAgfQogICAgIAogICAgIFJlbmRlclN0eWxlKiBhbmltYXRlKFJlbmRlck9iamVj
dCosIFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7
CkBAIC0xOTEsOSArMTkzLDEyIEBAIHB1YmxpYzoKICAgICAKICAgICB2b2lkIGNsZWFudXBGaW5p
c2hlZEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7CiAgICAgCisgICAgdm9pZCBzZXRBbmltYXRp
b25TdGFydFRpbWUoZG91YmxlIHQpOworICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0YXJ0VGltZShp
bnQgcHJvcGVydHksIGRvdWJsZSB0KTsKKyAgICAKICAgICB2b2lkIHN1c3BlbmRBbmltYXRpb25z
KCk7CiAgICAgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7Ci0gICAgYm9vbCBzdXNwZW5kZWQoKSBj
b25zdCAgICAgIHsgcmV0dXJuIG1fc3VzcGVuZGVkOyB9CisgICAgYm9vbCBzdXNwZW5kZWQoKSBj
b25zdCB7IHJldHVybiBtX3N1c3BlbmRlZDsgfQogICAgIAogICAgIHZvaWQgb3ZlcnJpZGVJbXBs
aWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KTsKICAgICB2b2lkIHJlc3VtZU92ZXJyaWRkZW5J
bXBsaWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KTsKQEAgLTIwMywxMyArMjA4LDE3IEBAIHB1
YmxpYzoKICAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdDsK
ICAgICAKICAgICB2b2lkIHNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcp
OworICAgIAogcHJvdGVjdGVkOgogICAgIHZvaWQgdXBkYXRlVHJhbnNpdGlvbnMoUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlciwgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRh
cmdldFN0eWxlKTsKKyAgICB2b2lkIHVwZGF0ZUtleWZyYW1lQW5pbWF0aW9ucyhSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyLCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFy
Z2V0U3R5bGUpOworICAgIGludCBmaW5kS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lKTsKICAgICAKIHByaXZhdGU6CiAgICAgdHlwZWRlZiBIYXNoTWFwPGludCwgSW1w
bGljaXRBbmltYXRpb24qPiBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOwogICAgIAogICAgIENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXAgICBtX3RyYW5zaXRpb25zOworICAgIFZlY3RvcjxLZXlm
cmFtZUFuaW1hdGlvbio+ICBtX2tleWZyYW1lQW5pbWF0aW9uczsKICAgICBib29sICAgICAgICAg
ICAgICAgICAgICAgICAgbV9zdXNwZW5kZWQ7CiAgICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGUqIG1fYW5pbWF0aW9uQ29udHJvbGxlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAg
ICAgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnM7CkBAIC0yODAsNyArMjg5LDcgQEAgcHVibGlj
OgogICAgIAogICAgIC8vIENhbGxlZCB0byBjaGFuZ2UgdG8gb3IgZnJvbSBwYXVzZWQgc3RhdGUK
ICAgICB2b2lkIHVwZGF0ZVBsYXlTdGF0ZShib29sIHJ1bm5pbmcpOwotICAgIGJvb2wgcGxheVN0
YXRlUGxheWluZygpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbWF0aW9uOyB9CisgICAgYm9vbCBwbGF5
U3RhdGVQbGF5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9hbmltYXRpb24gJiYgbV9hbmltYXRpb24t
PnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQbGF5aW5nOyB9CiAgICAgCiAgICAgYm9vbCB3
YWl0aW5nVG9TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX05FVyB8
fCBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOyB9CiAgICAgYm9vbCBwcmVh
Y3RpdmUoKSBjb25zdApAQCAtMzYxLDcgKzM3MCw3IEBAIHByb3RlY3RlZDoKICAgICBib29sIG1f
d2FpdGVkRm9yUmVzcG9uc2U7CiAgICAgZG91YmxlIG1fc3RhcnRUaW1lOwogICAgIGRvdWJsZSBt
X3BhdXNlVGltZTsKLSAgICBSZW5kZXJPYmplY3QqICAgbV9vYmplY3Q7CisgICAgUmVuZGVyT2Jq
ZWN0KiBtX29iamVjdDsKICAgICAKICAgICBBbmltYXRpb25UaW1lckNhbGxiYWNrIG1fYW5pbWF0
aW9uVGltZXJDYWxsYmFjazsKICAgICBBbmltYXRpb25FdmVudERpc3BhdGNoZXIgbV9hbmltYXRp
b25FdmVudERpc3BhdGNoZXI7CkBAIC00MDAsOCArNDA5LDYgQEAgcHVibGljOgogICAgIGludCBw
cm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVydHk7IH0KICAgICAKICAgICB2aXJ0dWFs
IHZvaWQgb25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUpOwotICAgIHZpcnR1YWwg
Ym9vbCBzdGFydEFuaW1hdGlvbihkb3VibGUgYmVnaW5UaW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQg
ZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpOwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBhbmltYXRl
KENvbXBvc2l0ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBj
dXJyZW50U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxl
KiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBpb0FuaW1hdGVkU3R5bGUpOwpAQCAtNDIyLDcg
KzQyOSw3IEBAIHByb3RlY3RlZDoKICAgICAgICAgcmV0dXJuIG1fb2JqZWN0LT5kb2N1bWVudCgp
LT5oYXNMaXN0ZW5lclR5cGUoaW5MaXN0ZW5lclR5cGUpOwogICAgIH0KICAgICAKLSAgICBib29s
IHNlbmRUcmFuc2l0aW9uRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91
YmxlIGluRWxhcHNlZFRpbWUpOyAgICAKKyAgICBib29sIHNlbmRUcmFuc2l0aW9uRXZlbnQoY29u
c3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpOwogICAg
IAogcHJpdmF0ZToKICAgICBpbnQgbV9wcm9wZXJ0eTsKQEAgLTQ0Nyw4ICs0NTQsNTggQEAgdm9p
ZCBBbmltYXRpb25FdmVudERpc3BhdGNoZXI6OnRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGlt
ZXJCYXNlPiopCiAKICNwcmFnbWEgbWFyayAtCiAKLSNwcmFnbWEgbWFyayAtCitjbGFzcyBLZXlm
cmFtZUFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNlIHsKK3B1YmxpYzoKKyAgICBLZXlm
cmFtZUFuaW1hdGlvbihjb25zdCBUcmFuc2l0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyLCBpbnQgaW5kZXgsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCisgICAg
OiBBbmltYXRpb25CYXNlKHRyYW5zaXRpb24sIHJlbmRlcmVyLCBjb21wQW5pbSkKKyAgICAsIG1f
a2V5ZnJhbWVzKHRyYW5zaXRpb24tPmtleWZyYW1lTGlzdCgpKQorICAgICwgbV9uYW1lKHRyYW5z
aXRpb24tPm5hbWUoKSkKKyAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgeworICAgIH0KKworICAg
IHZpcnR1YWwgfktleWZyYW1lQW5pbWF0aW9uKCkKKyAgICB7CisgICAgICAgIC8vIERvIHRoZSBj
bGVhbnVwIGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6
ZWQgbWV0aG9kcyBnZXQgY2FsbGVkCisgICAgICAgIGlmICghcG9zdGFjdGl2ZSgpKQorICAgICAg
ICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsK
KyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBS
ZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCAKKyAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0
eWxlKiYgaW9BbmltYXRlZFN0eWxlKTsKKyAgICAKKyAgICB2b2lkIHNldE5hbWUoY29uc3QgU3Ry
aW5nJiBzKSB7IG1fbmFtZSA9IHM7IH0KKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBj
b25zdCB7IHJldHVybiBtX25hbWU7IH0KKworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRGaXJlRXZl
bnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2
b2lkIG9uQW5pbWF0aW9uU3RhcnQoZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIHZpcnR1YWwg
dm9pZCBvbkFuaW1hdGlvbkl0ZXJhdGlvbihkb3VibGUgaW5FbGFwc2VkVGltZSk7CisgICAgdmly
dHVhbCB2b2lkIG9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpOworCisgICAgdmlydHVhbCB2b2lkIG92
ZXJyaWRlQW5pbWF0aW9ucygpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWVPdmVycmlkZGVuQW5p
bWF0aW9ucygpOworICAgIAorICAgIGJvb2wgc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIoRG9j
dW1lbnQ6Okxpc3RlbmVyVHlwZSBpbkxpc3RlbmVyVHlwZSkKKyAgICB7CisgICAgICAgIHJldHVy
biBtX29iamVjdC0+ZG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKGluTGlzdGVuZXJUeXBlKTsK
KyAgICB9CiAgICAgCisgICAgYm9vbCBzZW5kQW5pbWF0aW9uRXZlbnQoY29uc3QgQXRvbWljU3Ry
aW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIAorICAgIHZpcnR1
YWwgYm9vbCBhZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdDsKKworcHJpdmF0ZToK
KyAgICAvLyBUaGUga2V5ZnJhbWVzIHRoYXQgd2UgYXJlIGJsZW5kaW5nLgorICAgIFJlZlB0cjxL
ZXlmcmFtZUxpc3Q+IG1fa2V5ZnJhbWVzOworICAgIEF0b21pY1N0cmluZyBtX25hbWU7CisgICAg
aW50IG1faW5kZXg7Cit9OworCisjcHJhZ21hIG1hcmsgLQorCiBBbmltYXRpb25CYXNlOjpBbmlt
YXRpb25CYXNlKGNvbnN0IFRyYW5zaXRpb24qIHRyYW5zaXRpb24sIFJlbmRlck9iamVjdCogcmVu
ZGVyZXIsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCiA6IG1fYW5pbVN0YXRlKFNUQVRF
X05FVykKICwgbV9pdGVyYXRpb24oMCkKQEAgLTUyNCw3ICs1ODEsOSBAQCB2b2lkIEFuaW1hdGlv
bkJhc2U6OnVwZGF0ZVN0YXRlTWFjaGluZShBbmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBh
cmFtKQogICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgdGltZXIgdG8gdGhlIGluaXRp
YWwgZGVsYXkgKDAgaWYgbm8gZGVsYXkpCiAgICAgICAgICAgICAgICAgbV93YWl0ZWRGb3JSZXNw
b25zZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRf
V0FJVF9USU1FUjsKLSAgICAgICAgICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2suc3Rh
cnRUaW1lcihtX2FuaW1hdGlvbi0+ZGVsYXkoKSwgRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9u
U3RhcnRFdmVudCwgbV9hbmltYXRpb24tPmRlbGF5KCkpOworICAgICAgICAgICAgICAgIG1fYW5p
bWF0aW9uVGltZXJDYWxsYmFjay5zdGFydFRpbWVyKG1fYW5pbWF0aW9uLT5kZWxheSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TmFt
ZXM6OndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPmRlbGF5KCkpOwogICAgICAg
ICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfU1RBUlRfV0FJ
VF9USU1FUjoKQEAgLTU2MCw3ICs2MTksNyBAQCB2b2lkIEFuaW1hdGlvbkJhc2U6OnVwZGF0ZVN0
YXRlTWFjaGluZShBbmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKQogICAgICAgICAg
ICAgICAgIG92ZXJyaWRlQW5pbWF0aW9ucygpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgIC8vIFNlbmQgc3RhcnQgZXZlbnQsIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgIG9u
QW5pbWF0aW9uU3RhcnQoMC4wZik7IC8vIHRoZSBlbGFwc2VkVGltZSBpcyBhbHdheXMgMCBoZXJl
CisgICAgICAgICAgICAgICAgb25BbmltYXRpb25TdGFydCgwLjBmKTsgLy8gVGhlIGVsYXBzZWRU
aW1lIGlzIGFsd2F5cyAwIGhlcmUKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAv
LyBTdGFydCB0aGUgYW5pbWF0aW9uCiAgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRkZW4oKSB8
fCAhc3RhcnRBbmltYXRpb24oMCkpIHsKQEAgLTcyMSwxMyArNzgwLDIyIEBAIHZvaWQgQW5pbWF0
aW9uQmFzZTo6YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQoSFRNTEVsZW1lbnQqIGVsZW1l
bnQsIGNvbnN0IEF0CiAgICAgQVNTRVJUKCFlbGVtZW50IHx8IChlbGVtZW50LT5kb2N1bWVudCgp
ICYmICFlbGVtZW50LT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKSk7CiAgICAgaWYgKCFlbGVt
ZW50KQogICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIC8vIEZJWE1FOiBBY3R1YWwgZXZl
bnQgZGlzcGF0Y2hpbmcgd2lsbCBiZSBkb25lIGhlcmUKKyAgICAKKyAgICBpZiAoYW5pbUV2ZW50
VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkgeworICAgICAgICBp
ZiAoZWxlbWVudC0+cmVuZGVyZXIoKSkgeworICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgb3Jp
Z2luYWwgKHVuYW5pbWF0ZWQpIHN0eWxlCisgICAgICAgICAgICBzZXRDaGFuZ2VkKGVsZW1lbnQt
PnJlbmRlcmVyKCktPmVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgQW5p
bWF0aW9uQmFzZTo6dXBkYXRlUGxheVN0YXRlKGJvb2wgcnVuKQogewotICAgIGlmIChydW5uaW5n
KCkgIT0gcnVuIHx8IGlzbmV3KCkpIHsKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKHJ1biA/
IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVOTklORyA6IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVf
UEFVU0VELCAtMSk7Ci0gICAgfQorICAgIGlmIChydW5uaW5nKCkgIT0gcnVuIHx8IGlzbmV3KCkp
CisgICAgICAgIGlmIChtX29iamVjdC0+ZG9jdW1lbnQoKS0+bG9hZENvbXBsZXRlKCkpCisgICAg
ICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUocnVuID8gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9S
VU5OSU5HIDogU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQsIC0xKTsKIH0KIAogZG91Ymxl
IEFuaW1hdGlvbkJhc2U6OnByb2dyZXNzKGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgY29u
c3QKQEAgLTc0MCwxNiArODA4LDIxIEBAIGRvdWJsZSBBbmltYXRpb25CYXNlOjpwcm9ncmVzcyhk
b3VibGUgc2NhbGUsIGRvdWJsZSBvZmZzZXQpIGNvbnN0CiAgICAgICAgIHJldHVybiAwOwogICAg
IAogICAgIGRvdWJsZSBkdXIgPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKTsKKyAgICBpZiAobV9h
bmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwKQorICAgICAgICBkdXIgKj0gbV9hbmltYXRp
b24tPml0ZXJhdGlvbkNvdW50KCk7CiAgICAgCi0gICAgaWYgKHBvc3RhY3RpdmUoKSB8fCAhbV9h
bmltYXRpb24tPmR1cmF0aW9uKCkgfHwgZWxhcHNlZFRpbWUgPj0gZHVyKQorICAgIGlmIChwb3N0
YWN0aXZlKCkgfHwgIW1fYW5pbWF0aW9uLT5kdXJhdGlvbigpIHx8IChtX2FuaW1hdGlvbi0+aXRl
cmF0aW9uQ291bnQoKSA+IDAgJiYgZWxhcHNlZFRpbWUgPj0gZHVyKSkKICAgICAgICAgcmV0dXJu
IDEuMDsKICAgICAKICAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIHRpbWUsIHRha2luZyBp
bnRvIGFjY291bnQgZGlyZWN0aW9uLgotICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gd29ycnkg
YWJvdXQgaXRlcmF0aW9ucywgd2UgYXNzdW1lIHRoYXQgd2Ugd291bGQgaGF2ZSAKKyAgICAvLyBU
aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0ZXJhdGlvbnMsIHdlIGFzc3VtZSB0aGF0
IHdlIHdvdWxkIGhhdmUKICAgICAvLyBzaG9ydCBjaXJjdWl0ZWQgYWJvdmUgaWYgd2Ugd2VyZSBk
b25lCiAgICAgZG91YmxlIHQgPSBlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigp
OwogICAgIGludCBpID0gKGludCkgdDsKICAgICB0IC09IGk7CisKKyAgICBpZiAobV9hbmltYXRp
b24tPmRpcmVjdGlvbigpICYmIChpICYgMSkpCisgICAgICAgIHQgPSAxIC0gdDsKICAgICAKICAg
ICBpZiAoc2NhbGUgIT0gMSB8fCBvZmZzZXQgIT0gMCkKICAgICAgICAgdCA9ICh0IC0gb2Zmc2V0
KSAqIHNjYWxlOwpAQCAtNzU4LDkgKzgzMSw5IEBAIGRvdWJsZSBBbmltYXRpb25CYXNlOjpwcm9n
cmVzcyhkb3VibGUgc2NhbGUsIGRvdWJsZSBvZmZzZXQpIGNvbnN0CiAgICAgICAgIHJldHVybiB0
OwogICAgIAogICAgIC8vIEN1YmljIGJlemllci4KLSAgICBkb3VibGUgdHQgPSBzb2x2ZUN1Ymlj
QmV6aWVyRnVuY3Rpb24obV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDEoKSwgCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdG
dW5jdGlvbigpLnkxKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MigpLCAKKyAgICBkb3VibGUgdHQgPSBz
b2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24obV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDEo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24t
PnRpbWluZ0Z1bmN0aW9uKCkueTEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDIoKSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9u
KCkueTIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgbV9h
bmltYXRpb24tPmR1cmF0aW9uKCkpOwogICAgIHJldHVybiB0dDsKQEAgLTc3Myw3ICs4NDYsMTAg
QEAgdm9pZCBBbmltYXRpb25CYXNlOjpwcmltZUV2ZW50VGltZXJzKCkKICAgICBjb25zdCBkb3Vi
bGUgZWxhcHNlZER1cmF0aW9uID0gY3QgLSBtX3N0YXJ0VGltZTsKICAgICBBU1NFUlQoZWxhcHNl
ZER1cmF0aW9uID49IDApOwogICAgIAotICAgIGRvdWJsZSB0b3RhbER1cmF0aW9uID0gbV9hbmlt
YXRpb24tPmR1cmF0aW9uKCk7CisgICAgZG91YmxlIHRvdGFsRHVyYXRpb24gPSAtMTsKKyAgICBp
ZiAobV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwKQorICAgICAgICB0b3RhbER1cmF0
aW9uID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgKiBtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291
bnQoKTsKKyAgICAKICAgICBkb3VibGUgZHVyYXRpb25MZWZ0ID0gMDsKICAgICBkb3VibGUgbmV4
dEl0ZXJhdGlvblRpbWUgPSB0b3RhbER1cmF0aW9uOwogICAgIGlmICh0b3RhbER1cmF0aW9uIDwg
MCB8fCBlbGFwc2VkRHVyYXRpb24gPCB0b3RhbER1cmF0aW9uKSB7CkBAIC04NDksOSArOTI1LDkg
QEAgc3RhdGljIGlubGluZSBUcmFuc2Zvcm1PcGVyYXRpb25zIGJsZW5kRnVuYyhjb25zdCBUcmFu
c2Zvcm1PcGVyYXRpb25zJiBmcm9tLCBjb24KICAgICB1bnNpZ25lZCBzaXplID0gbWF4KGZyb21T
aXplLCB0b1NpemUpOwogICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgcmVzdWx0OwogICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgVHJhbnNmb3JtT3BlcmF0
aW9uKiBmcm9tT3AgPSBpIDwgZnJvbVNpemUgPyBmcm9tW2ldLmdldCgpIDogMDsKLSAgICAgICAg
VHJhbnNmb3JtT3BlcmF0aW9uKiB0b09wID0gaSA8IHRvU2l6ZSA/IHRvW2ldLmdldCgpIDogMDsK
LSAgICAgICAgVHJhbnNmb3JtT3BlcmF0aW9uKiBibGVuZGVkT3AgPSB0b09wID8gdG9PcC0+Ymxl
bmQoZnJvbU9wLCBwcm9ncmVzcykgOiBmcm9tT3AtPmJsZW5kKDAsIHByb2dyZXNzLCB0cnVlKTsK
KyAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gZnJvbU9wID0gaSA8IGZyb21TaXpl
ID8gZnJvbVtpXS5nZXQoKSA6IDA7CisgICAgICAgIFJlZlB0cjxUcmFuc2Zvcm1PcGVyYXRpb24+
IHRvT3AgPSBpIDwgdG9TaXplID8gdG9baV0uZ2V0KCkgOiAwOworICAgICAgICBSZWZQdHI8VHJh
bnNmb3JtT3BlcmF0aW9uPiBibGVuZGVkT3AgPSB0b09wID8gdG9PcC0+YmxlbmQoZnJvbU9wLmdl
dCgpLCBwcm9ncmVzcykgOiBmcm9tT3AtPmJsZW5kKDAsIHByb2dyZXNzLCB0cnVlKTsKICAgICAg
ICAgaWYgKGJsZW5kZWRPcCkKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYmxlbmRlZE9wKTsK
ICAgICB9CkBAIC04ODcsOCArOTYzLDcgQEAgdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnVwZGF0
ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJlbmRlclN0eWxlKgogICAgIC8v
IFNlZSBpZiB0aGUgbGlzdHMgbWF0Y2gKICAgICBmb3IgKCA7IGFuaW07IGFuaW0gPSBhbmltLT5u
ZXh0KCkpIHsKICAgICAgICAgKytudW1BbmltczsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24q
IGltcGxBbmltID0gKGFuaW0tPnByb3BlcnR5KCkgPT0gQ1NTUHJvcGVydHlJbnZhbGlkKSA/IDAg
OgotICAgICAgICBtX3RyYW5zaXRpb25zLmdldChhbmltLT5wcm9wZXJ0eSgpKTsKKyAgICAgICAg
SW1wbGljaXRBbmltYXRpb24qIGltcGxBbmltID0gKGFuaW0tPnByb3BlcnR5KCkgPT0gQ1NTUHJv
cGVydHlJbnZhbGlkKSA/IDAgOiBtX3RyYW5zaXRpb25zLmdldChhbmltLT5wcm9wZXJ0eSgpKTsK
ICAgICAgICAgaWYgKCFpbXBsQW5pbSB8fCAhaW1wbEFuaW0tPmFuaW1hdGlvbnNNYXRjaChhbmlt
KSkgewogICAgICAgICAgICAgdHJhbnNpdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAg
IGJyZWFrOwpAQCAtOTEyLDE1ICs5ODcsODMgQEAgdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnVw
ZGF0ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJlbmRlclN0eWxlKgogICAg
ICAgICAKICAgICAgICAgaW50IHByb3BlcnR5ICAgICAgICA9IGFuaW0tPnByb3BlcnR5KCk7CiAg
ICAgICAgIGRvdWJsZSBkdXJhdGlvbiAgICAgPSBhbmltLT5kdXJhdGlvbigpOworICAgICAgICBp
bnQgaXRlcmF0aW9uQ291bnQgID0gYW5pbS0+aXRlcmF0aW9uQ291bnQoKTsKICAgICAgICAgZG91
YmxlIGRlbGF5ICAgICAgICA9IGFuaW0tPmRlbGF5KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAo
cHJvcGVydHkgJiYgKGR1cmF0aW9uIHx8IGRlbGF5KSAmJiAhbV90cmFuc2l0aW9ucy5jb250YWlu
cyhwcm9wZXJ0eSkpIHsKKworICAgICAgICBpZiAocHJvcGVydHkgJiYgKGR1cmF0aW9uIHx8IGRl
bGF5KSAmJiBpdGVyYXRpb25Db3VudCAmJiAhbV90cmFuc2l0aW9ucy5jb250YWlucyhwcm9wZXJ0
eSkpIHsKICAgICAgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltYXRpb24gPSBuZXcgSW1w
bGljaXRBbmltYXRpb24oY29uc3RfY2FzdDxUcmFuc2l0aW9uKj4oYW5pbSksIHJlbmRlcmVyLCB0
aGlzKTsKICAgICAgICAgICAgIG1fdHJhbnNpdGlvbnMuc2V0KHByb3BlcnR5LCBhbmltYXRpb24p
OwogICAgICAgICB9CiAgICAgfQogfQogCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6dXBkYXRl
S2V5ZnJhbWVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJlbmRlclN0eWxlKiBj
dXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSkKK3sKKyAgICBjb25zdCBUcmFu
c2l0aW9uKiBhbmltID0gdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKTsKKyAgICAvLyBUaGVyZSBp
cyBub3RoaW5nIHRvIGRvIGlmIHdlIGRvbid0IGhhdmUgYW55IGFuaW1hdGlvbnMgb3IgaWYgdGhl
IGN1cnJlbnQgYW5kIHRhcmdldCBhbmltYXRpb25zIGFyZSB0aGUgc2FtZQorICAgIGlmICgobV9r
ZXlmcmFtZUFuaW1hdGlvbnMuaXNFbXB0eSgpICYmICFhbmltKSB8fAorICAgICAgICAoY3VycmVu
dFN0eWxlICYmIGN1cnJlbnRTdHlsZS0+YW5pbWF0aW9ucygpICYmICooY3VycmVudFN0eWxlLT5h
bmltYXRpb25zKCkpID09ICphbmltKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgICAg
ICAKKyAgICBzaXplX3QgbnVtQW5pbXMgPSAwOworICAgIGJvb2wgYW5pbXNDaGFuZ2VkID0gZmFs
c2U7CisgICAgCisgICAgLy8gU2VlIGlmIHRoZSBsaXN0cyBtYXRjaAorICAgIGZvciAoIDsgYW5p
bTsgYW5pbSA9IGFuaW0tPm5leHQoKSkgeworICAgICAgICBpZiAoIWFuaW0tPmlzVmFsaWRBbmlt
YXRpb24oKSkgeworICAgICAgICAgICAgYW5pbXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZkFuaW0gPSAobnVtQW5pbXMg
PCBtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXplKCkpID8gbV9rZXlmcmFtZUFuaW1hdGlvbnNbbnVt
QW5pbXNdIDogMDsKKyAgICAgICAgICAgIGlmICgha2ZBbmltIHx8ICFrZkFuaW0tPmFuaW1hdGlv
bnNNYXRjaChhbmltKSkKKyAgICAgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOworICAg
ICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFuaW0pIHsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gQW5pbWF0aW9ucyBtYXRjaCwgYnV0IHBsYXkgc3RhdGVzIG1heSBkaWZmZXIu
IHVwZGF0ZSBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAga2ZBbmltLT51cGRhdGVQbGF5
U3RhdGUoYW5pbS0+cGxheVN0YXRlKCkgPT0gQW5pbVBsYXlTdGF0ZVBsYXlpbmcpOworICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBzYXZlZCBhbmlt
YXRpb24gdG8gdGhpcyBuZXcgb25lLCBqdXN0IGluIGNhc2UgdGhlIHBsYXkgc3RhdGUgaGFzIGNo
YW5nZWQKKyAgICAgICAgICAgICAgICAgICAga2ZBbmltLT5zZXRBbmltYXRpb24oYW5pbSk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsrbnVt
QW5pbXM7CisgICAgfQorICAgIAorICAgIGlmICghYW5pbXNDaGFuZ2VkICYmIG1fa2V5ZnJhbWVB
bmltYXRpb25zLnNpemUoKSAhPSBudW1BbmltcykKKyAgICAgICAgYW5pbXNDaGFuZ2VkID0gdHJ1
ZTsKKworICAgIGlmICghYW5pbXNDaGFuZ2VkKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBB
bmltYXRpb25zIGhhdmUgY2hhbmdlZCwgdXBkYXRlIHRoZSBsaXN0CisgICAgcmVzZXRBbmltYXRp
b25zKHJlbmRlcmVyKTsKKworICAgIGlmICghdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gQWRkIGFsbCB0aGUgbmV3IGFuaW1hdGlvbnMKKyAgICBp
bnQgaW5kZXggPSAwOworICAgIGZvciAoYW5pbSA9IHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCk7
IGFuaW07IGFuaW0gPSBhbmltLT5uZXh0KCksICsraW5kZXgpIHsKKworICAgICAgICBpZiAoIWFu
aW0tPmlzVmFsaWRBbmltYXRpb24oKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgCisgICAgICAgIC8vIERvbid0IGJvdGhlciBhZGRpbmcgdGhlIGFuaW1hdGlvbiBpZiBpdCBo
YXMgbm8ga2V5ZnJhbWVzIG9yIHdvbid0IGFuaW1hdGUKKyAgICAgICAgaWYgKChhbmltLT5kdXJh
dGlvbigpIHx8IGFuaW0tPmRlbGF5KCkpICYmIGFuaW0tPml0ZXJhdGlvbkNvdW50KCkgJiYKKyAg
ICAgICAgICAgICBhbmltLT5rZXlmcmFtZUxpc3QoKS5nZXQoKSAmJiAhYW5pbS0+a2V5ZnJhbWVM
aXN0KCktPmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1fa2V5ZnJhbWVBbmltYXRpb25zLmFwcGVu
ZChuZXcgS2V5ZnJhbWVBbmltYXRpb24oY29uc3RfY2FzdDxUcmFuc2l0aW9uKj4oYW5pbSksIHJl
bmRlcmVyLCBpbmRleCwgdGhpcykpOworICAgIH0KK30KKworaW50IENvbXBvc2l0ZUFuaW1hdGlv
bjo6ZmluZEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKK3sKKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpIG1fa2V5ZnJhbWVBbmltYXRpb25zLnNpemUoKTsg
KytpKQorICAgICAgICBpZiAobV9rZXlmcmFtZUFuaW1hdGlvbnNbaV0tPm5hbWUoKSA9PSBuYW1l
KQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcmV0dXJuIC0xOworfQorCiBSZW5kZXJTdHls
ZSogQ29tcG9zaXRlQW5pbWF0aW9uOjphbmltYXRlKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJl
bmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSkKIHsKICAg
ICBSZW5kZXJTdHlsZSogcmVzdWx0U3R5bGUgPSAwOwpAQCAtOTM5LDYgKzEwODIsMTcgQEAgUmVu
ZGVyU3R5bGUqIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0ZShSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBSZW5kZXJTdHlsZSogY3UKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKwor
ICAgIHVwZGF0ZUtleWZyYW1lQW5pbWF0aW9ucyhyZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJn
ZXRTdHlsZSk7CisgICAgCisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhbmltYXRpb24gb2JqZWN0
cyByZWFkeSwgbGV0IHRoZW0ga25vdyBhYm91dCB0aGUgbmV3IGdvYWwgc3RhdGUuICBXZSB3YW50
IHRoZW0KKyAgICAvLyB0byBmaWxsIGluIGEgUmVuZGVyU3R5bGUqJiBvbmx5IGlmIG5lZWRlZC4K
KyAgICBWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBt
X2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxLZXlmcmFtZUFuaW1h
dGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7
IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0g
Kml0OworICAgICAgICBpZiAoYW5pbSkKKyAgICAgICAgICAgIGFuaW0tPmFuaW1hdGUodGhpcywg
cmVuZGVyZXIsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUsIHJlc3VsdFN0eWxlKTsKKyAgICB9
CiAgICAgCiAgICAgcmV0dXJuIHJlc3VsdFN0eWxlID8gcmVzdWx0U3R5bGUgOiB0YXJnZXRTdHls
ZTsKIH0KQEAgLTk1Miw2ICsxMTA2LDEyIEBAIHZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRB
bmltYXRpbmcoYm9vbCBpbkFuaW1hdGluZykKICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0
cmFuc2l0aW9uID0gaXQtPnNlY29uZDsKICAgICAgICAgdHJhbnNpdGlvbi0+c2V0QW5pbWF0aW5n
KGluQW5pbWF0aW5nKTsKICAgICB9ICAgIAorCisgICAgVmVjdG9yPEtleWZyYW1lQW5pbWF0aW9u
Kj46OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Cisg
ICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAg
ICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9ICppdDsKKyAgICAgICAgYW5pbS0+c2V0QW5pbWF0
aW5nKGluQW5pbWF0aW5nKTsKKyAgICB9CiB9CiAKIGJvb2wgQ29tcG9zaXRlQW5pbWF0aW9uOjph
bmltYXRpbmcoKQpAQCAtOTYxLDcgKzExMjEsMTUgQEAgYm9vbCBDb21wb3NpdGVBbmltYXRpb246
OmFuaW1hdGluZygpCiAgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiAgdHJhbnNpdGlvbiA9IGl0
LT5zZWNvbmQ7CiAgICAgICAgIGlmICh0cmFuc2l0aW9uICYmIHRyYW5zaXRpb24tPmFuaW1hdGlu
ZygpICYmIHRyYW5zaXRpb24tPnJ1bm5pbmcoKSkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgIH0gICAgCisgICAgfQorCisgICAgVmVjdG9yPEtleWZyYW1lQW5pbWF0aW9uKj46OmNvbnN0
X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChW
ZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1l
QW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFt
ZUFuaW1hdGlvbiogYW5pbSA9ICppdDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+cnVubmlu
ZygpICYmIGFuaW0tPmFuaW1hdGluZygpICYmIGFuaW0tPmFjdGl2ZSgpKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gZmFsc2U7
CiB9CiAKQEAgLTk3Niw2ICsxMTQ0LDE2IEBAIHZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXNl
dFRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIpCiAgICAgbV90cmFuc2l0aW9ucy5j
bGVhcigpOwogfQogCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzZXRBbmltYXRpb25zKFJl
bmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgVmVjdG9yPEtleWZyYW1lQW5pbWF0aW9uKj46
OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAg
Zm9yIChWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tl
eWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBL
ZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9ICppdDsKKyAgICAgICAgZGVsZXRlIGFuaW07CisgICAg
fQorICAgIG1fa2V5ZnJhbWVBbmltYXRpb25zLmNsZWFyKCk7Cit9CisKIHZvaWQgQ29tcG9zaXRl
QW5pbWF0aW9uOjpjbGVhbnVwRmluaXNoZWRBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVy
ZXIpCiB7CiAgICAgaWYgKHN1c3BlbmRlZCgpKQpAQCAtOTkyLDYgKzExNzAsNDggQEAgdm9pZCBD
b21wb3NpdGVBbmltYXRpb246OmNsZWFudXBGaW5pc2hlZEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0
KiByZW5kZXJlcikKICAgICAgICAgICAgIGFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKICAgICAgICAg
fQogICAgIH0KKworICAgIC8vIE1ha2UgYSBsaXN0IG9mIGFuaW1hdGlvbnMgdG8gYmUgZGVsZXRl
ZAorICAgIFZlY3RvcjxpbnQ+IGZpbmlzaGVkQW5pbWF0aW9uczsKKworICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgKGludCkgbV9rZXlmcmFtZUFuaW1hdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9uc1tpXTsKKyAg
ICAgICAgaWYgKCFhbmltKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChhbmlt
LT5wb3N0YWN0aXZlKCkgJiYgIWFuaW0tPndhaXRpbmdGb3JFbmRFdmVudCgpKQorICAgICAgICAg
ICAgZmluaXNoZWRBbmltYXRpb25zLmFwcGVuZChpKTsKKyAgICB9CisgICAgCisgICAgLy8gRGVs
ZXRlIHRoZW0KKyAgICBmb3IgKFZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdCA9IGZpbmlzaGVkQW5p
bWF0aW9ucy5iZWdpbigpOyBpdCAhPSBmaW5pc2hlZEFuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsK
KyAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnNbKml0XS0+cmVzZXQocmVuZGVyZXIpOworICAg
ICAgICBkZWxldGUgbV9rZXlmcmFtZUFuaW1hdGlvbnNbKml0XTsKKyAgICAgICAgbV9rZXlmcmFt
ZUFuaW1hdGlvbnMucmVtb3ZlKCppdCk7CisgICAgfQorICAgIAorfQorCit2b2lkIENvbXBvc2l0
ZUFuaW1hdGlvbjo6c2V0QW5pbWF0aW9uU3RhcnRUaW1lKGRvdWJsZSB0KQoreworICAgIC8vIHNl
dCBzdGFydCB0aW1lIG9uIGFsbCBhbmltYXRpb25zIHdhaXRpbmcgZm9yIGl0CisgICAgVmVjdG9y
PEtleWZyYW1lQW5pbWF0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFu
aW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVu
ZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9ICppdDsKKyAgICAg
ICAgaWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0ZvclN0YXJ0VGltZSgpKQorICAgICAgICAgICAg
YW5pbS0+dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUQVJU
X1RJTUVfU0VULCB0KTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRU
cmFuc2l0aW9uU3RhcnRUaW1lKGludCBwcm9wZXJ0eSwgZG91YmxlIHQpCit7CisgICAgLy8gc2V0
IHN0YXJ0IHRpbWUgZm9yIGdpdmVuIHByb3BlcnR5IHRyYW5zaXRpb24KKyAgICBDU1NQcm9wZXJ0
eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgp
OworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBs
aWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFu
aW0tPndhaXRpbmdGb3JTdGFydFRpbWUoKSAmJgorICAgICAgICAgICAgICAgICAgICAoYW5pbS0+
cHJvcGVydHkoKSA9PSBwcm9wZXJ0eSB8fCBhbmltLT5wcm9wZXJ0eSgpID09IGNBbmltYXRlQWxs
KSkKKyAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpT
VEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwgdCk7CisgICAgfQogfQogCiB2b2lkIENvbXBvc2l0
ZUFuaW1hdGlvbjo6c3VzcGVuZEFuaW1hdGlvbnMoKQpAQCAtMTAwMSw2ICsxMjIxLDEzIEBAIHZv
aWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzdXNwZW5kQW5pbWF0aW9ucygpCiAgICAgCiAgICAgbV9z
dXNwZW5kZWQgPSB0cnVlOwogCisgICAgVmVjdG9yPEtleWZyYW1lQW5pbWF0aW9uKj46OmNvbnN0
X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChW
ZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1l
QW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFt
ZUFuaW1hdGlvbiogYW5pbSA9ICppdDsKKyAgICAgICAgaWYgKGFuaW0pCisgICAgICAgICAgICBh
bmltLT51cGRhdGVQbGF5U3RhdGUoZmFsc2UpOworICAgIH0KKwogICAgIENTU1Byb3BlcnR5VHJh
bnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CiAg
ICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1f
dHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CiAgICAgICAgIEltcGxpY2l0
QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKQEAgLTEwMTcsNiArMTI0NCwxNCBAQCB2b2lk
IENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lQW5pbWF0aW9ucygpCiAgICAgCiAgICAgbV9zdXNw
ZW5kZWQgPSBmYWxzZTsKIAorICAgIFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9p
dGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoVmVj
dG9yPEtleWZyYW1lQW5pbWF0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFu
aW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVB
bmltYXRpb24qIGFuaW0gPSAqaXQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPnBsYXlTdGF0
ZVBsYXlpbmcoKSkgeworICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKHRydWUpOwor
ICAgICAgICB9CisgICAgfQorCiAgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKICAgICBmb3IgKENTU1Byb3BlcnR5
VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBp
dC0+c2Vjb25kOwpAQCAtMTA1MSw2ICsxMjg2LDEzIEBAIHZvaWQgQ29tcG9zaXRlQW5pbWF0aW9u
OjpzdHlsZUF2YWlsYWJsZSgpCiAgICAgaWYgKG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzID09
IDApCiAgICAgICAgIHJldHVybjsKICAgICAKKyAgICBWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24q
Pjo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAg
ICBmb3IgKFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1f
a2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAg
IEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gKml0OworICAgICAgICBpZiAoYW5pbSAmJiBhbmlt
LT53YWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoKSkKKyAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0
YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUsIC0x
KTsKKyAgICB9CisgICAgCiAgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKICAgICBmb3IgKENTU1Byb3BlcnR5VHJh
bnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+
c2Vjb25kOwpAQCAtMTA2MSwxMiArMTMwMywyMCBAQCB2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6
c3R5bGVBdmFpbGFibGUoKQogCiBib29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6aXNBbmltYXRpbmdQ
cm9wZXJ0eShpbnQgcHJvcGVydHkpIGNvbnN0CiB7CisgICAgVmVjdG9yPEtleWZyYW1lQW5pbWF0
aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7
CisgICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVBbmltYXRpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAg
ICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9ICppdDsKKyAgICAgICAgaWYgKGFuaW0gJiYg
YW5pbS0+aXNBbmltYXRpbmdQcm9wZXJ0eShwcm9wZXJ0eSkpCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKICAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVy
YXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwogICAgIGZvciAoQ1NTUHJvcGVydHlUcmFu
c2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0
ICE9IGVuZDsgKytpdCkgewogICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5z
ZWNvbmQ7CiAgICAgICAgIGlmIChhbmltICYmIGFuaW0tPmlzQW5pbWF0aW5nUHJvcGVydHkocHJv
cGVydHkpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCiAgICAgcmV0dXJuIGZh
bHNlOwogfQogCkBAIC0xMTU4LDMzICsxNDA4LDYgQEAgcHJpdmF0ZToKICAgICB2b2lkIChSZW5k
ZXJTdHlsZTo6Km1fc2V0dGVyKShTaGFkb3dEYXRhKiwgYm9vbCk7CiB9OwogCi1jbGFzcyBQcm9w
ZXJ0eVdyYXBwZXJJbnRTaXplIDogcHVibGljIFByb3BlcnR5V3JhcHBlckdldHRlcjxJbnRTaXpl
PiB7Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVySW50U2l6ZShpbnQgcHJvcCwgSW50U2l6
ZSAoUmVuZGVyU3R5bGU6OipnZXR0ZXIpKCkgY29uc3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0
dGVyKShjb25zdCBJbnRTaXplJikpCi0gICAgOiBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8SW50U2l6
ZT4ocHJvcCwgZ2V0dGVyKQotICAgICwgbV9zZXR0ZXIoc2V0dGVyKQotICAgIHsgfQotICAgIAot
ICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRl
clN0eWxlKiBiKSBjb25zdAotICAgIHsKLSAgICAgICAgSW50U2l6ZSBzaXplYSA9IChhLT4qbV9n
ZXR0ZXIpKCk7Ci0gICAgICAgIEludFNpemUgc2l6ZWIgPSAoYi0+Km1fZ2V0dGVyKSgpOwotICAg
ICAgICAKLSAgICAgICAgcmV0dXJuIChzaXplYSA9PSBzaXplYik7Ci0gICAgfQotICAgIAotICAg
IHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSog
YSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKSBjb25zdAotICAgIHsKLSAgICAg
ICAgSW50U2l6ZSBzaXplYSA9IChhLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIEludFNpemUgc2l6
ZWIgPSAoYi0+Km1fZ2V0dGVyKSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAoZHN0LT4q
bV9zZXR0ZXIpKGJsZW5kRnVuYyhzaXplYSwgc2l6ZWIsIHByb2cpKTsKLSAgICB9Ci0gICAgCi1w
cml2YXRlOgotICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0ZXIpKGNvbnN0IEludFNpemUm
KTsKLX07Ci0KIGNsYXNzIFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yIDogcHVibGlj
IFByb3BlcnR5V3JhcHBlckJhc2UgewogcHVibGljOgogICAgIFByb3BlcnR5V3JhcHBlck1heWJl
SW52YWxpZENvbG9yKGludCBwcm9wLCBjb25zdCBDb2xvciYgKFJlbmRlclN0eWxlOjoqZ2V0dGVy
KSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoY29uc3QgQ29sb3ImKSkKQEAg
LTEzMzEsMTAgKzE1NTQsMTAgQEAgdm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6ZW5z
dXJlUHJvcGVydHlNYXAoKQogICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmPihDU1NQcm9wZXJ0eVdl
YmtpdFRyYW5zZm9ybSwgJlJlbmRlclN0eWxlOjp0cmFuc2Zvcm0sICZSZW5kZXJTdHlsZTo6c2V0
VHJhbnNmb3JtKSk7CiAgICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblgsICZS
ZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWCwgJlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zvcm1P
cmlnaW5YKSk7CiAgICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblksICZSZW5k
ZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWSwgJlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zvcm1Pcmln
aW5ZKSk7Ci0gICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXJJbnRTaXplKENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVG9wTGVmdFJhZGl1cywgJlJlbmRl
clN0eWxlOjpib3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlclRvcExl
ZnRSYWRpdXMpKTsKLSAgICAgICAgZ19wcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlckludFNpemUoQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJUb3BSaWdodFJhZGl1cywg
JlJlbmRlclN0eWxlOjpib3JkZXJUb3BSaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3Jk
ZXJUb3BSaWdodFJhZGl1cykpOwotICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVySW50U2l6ZShDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJvdHRvbUxl
ZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJlbmRlclN0
eWxlOjpzZXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVzKSk7Ci0gICAgICAgIGdfcHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJJbnRTaXplKENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tUmlnaHRS
YWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMpKTsKKyAgICAg
ICAgZ19wcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJ
bnRTaXplJj4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5
bGU6OmJvcmRlclRvcExlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wTGVmdFJh
ZGl1cykpOworICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlX
cmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclRvcFJpZ2h0UmFk
aXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNl
dEJvcmRlclRvcFJpZ2h0UmFkaXVzKSk7CisgICAgICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBw
ZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJCb3R0b21MZWZ0UmFk
aXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbUxlZnRSYWRpdXMpKTsKKyAgICAgICAg
Z19wcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRT
aXplJj4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRlclN0
eWxlOjpib3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0
b21SaWdodFJhZGl1cykpOwogICAgICAgICBnX3Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPEVWaXNpYmlsaXR5PihDU1NQcm9wZXJ0eVZpc2liaWxpdHksICZSZW5k
ZXJTdHlsZTo6dmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjpzZXRWaXNpYmlsaXR5KSk7CiAgICAg
ICAgIGdfcHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+
KENTU1Byb3BlcnR5Wm9vbSwgJlJlbmRlclN0eWxlOjp6b29tLCAmUmVuZGVyU3R5bGU6OnNldFpv
b20pKTsKICAgICAgICAgCkBAIC0xNDk4LDggKzE3MjEsNiBAQCB2b2lkIEFuaW1hdGlvbkNvbnRy
b2xsZXJQcml2YXRlOjpzdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKQogCiB2b2lkIEFu
aW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphbmltYXRpb25UaW1lckZpcmVkKFRpbWVyPEFuaW1h
dGlvbkNvbnRyb2xsZXJQcml2YXRlPiogdGltZXIpCiB7Ci0gICAgLy9jbGVhbnVwRmluaXNoZWRB
bmltYXRpb25zKCk7Ci0gICAgCiAgICAgLy8gV2hlbiB0aGUgdGltZXIgZmlyZXMsIGFsbCB3ZSBk
byBpcyBjYWxsIHNldENoYW5nZWQgb24gYWxsIERPTSBub2RlcyB3aXRoIHJ1bm5pbmcgYW5pbWF0
aW9ucyBhbmQgdGhlbiBkbyBhbiBpbW1lZGlhdGUKICAgICAvLyB1cGRhdGVSZW5kZXJpbmcuICBJ
dCB3aWxsIHRoZW4gY2FsbCBiYWNrIHRvIHVzIHdpdGggbmV3IGluZm9ybWF0aW9uLgogICAgIGJv
b2wgYW5pbWF0aW5nID0gZmFsc2U7CkBAIC0xNjA1LDIwICsxODI2LDExIEBAIHZvaWQgSW1wbGlj
aXRBbmltYXRpb246OmFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRpb24sIFJlbmRl
ck9iamVjdCogcmVuCiAgICAgLy9BU1NFUlQobmVlZHNBbmltICE9IG1fd2FpdGVkRm9yUmVzcG9u
c2UgfHwgcHJlYWN0aXZlKCkpOwogfQogCi1ib29sIEltcGxpY2l0QW5pbWF0aW9uOjpzdGFydEFu
aW1hdGlvbihkb3VibGUgYmVnaW5UaW1lKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9p
ZCBJbXBsaWNpdEFuaW1hdGlvbjo6ZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpCi17Ci19Ci0KIHZv
aWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1l
KQogewotICAgIC8vIHdlJ3JlIGNvbnZlcnRpbmcgdGhlIGFuaW1hdGlvbiBpbnRvIGEgdHJhbnNp
dGlvbiBoZXJlCisgICAgLy8gV2UncmUgY29udmVydGluZyB0aGUgYW5pbWF0aW9uIGludG8gYSB0
cmFuc2l0aW9uIGhlcmUKICAgICBpZiAoIXNlbmRUcmFuc2l0aW9uRXZlbnQoRXZlbnROYW1lczo6
d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50LCBpbkVsYXBzZWRUaW1lKSkgewotICAgICAgICAvLyB3
ZSBkaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQsIHdoaWNoIHdvdWxkIGNhbGwgZW5kQW5pbWF0aW9u
KCksIHNvIHdlJ2xsIGp1c3QgZW5kCisgICAgICAgIC8vIFdlIGRpZG4ndCBkaXNwYXRjaCBhbiBl
dmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRBbmltYXRpb24oKSwgc28gd2UnbGwganVzdCBlbmQK
ICAgICAgICAgLy8gaXQgaGVyZS4KICAgICAgICAgZW5kQW5pbWF0aW9uKHRydWUpOwogICAgIH0K
QEAgLTE2MjYsNyArMTgzOCw4IEBAIHZvaWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9u
RW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKQogCiBib29sIEltcGxpY2l0QW5pbWF0aW9uOjpzZW5k
VHJhbnNpdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRvdWJsZSBp
bkVsYXBzZWRUaW1lKQogewotICAgIHJldHVybiBmYWxzZTsgLy8gZGlkbid0IGRpc3BhdGNoIGFu
IGV2ZW50CisgICAgLy8gRklYTUU6IGV2ZW50IGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBnbyBoZXJl
CisgICAgcmV0dXJuIGZhbHNlOyAvLyBEaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQKIH0KIAogdm9p
ZCBJbXBsaWNpdEFuaW1hdGlvbjo6cmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3Qg
UmVuZGVyU3R5bGUqIGZyb20gLyogPSAwICovLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gLyogPSAw
ICovKQpAQCAtMTY2Nyw2ICsxODgwLDE0NiBAQCBib29sIEltcGxpY2l0QW5pbWF0aW9uOjphZmZl
Y3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAogCiAjcHJhZ21hIG1hcmsgLQogCit2b2lk
IEtleWZyYW1lQW5pbWF0aW9uOjphbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9u
LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxl
LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxl
KiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBpb0FuaW1hdGVkU3R5bGUpCit7CisgICAgLy8g
SWYgd2UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQsIHdlIHdpbGwgbm90IGhhdmUgYSB2YWxpZCBzdGFy
dCB0aW1lLCBzbyBqdXN0IHN0YXJ0IHRoZSBhbmltYXRpb24gaWYgbmVlZGVkCisgICAgaWYgKGlz
bmV3KCkgJiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQbGF5aW5n
ICYmIG1fb2JqZWN0LT5kb2N1bWVudCgpLT5sb2FkQ29tcGxldGUoKSkKKyAgICAgICAgdXBkYXRl
U3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiwgLTEpOworICAgIAorICAg
IC8vIElmIHdlIGdldCB0aGlzIGZhciBhbmQgdGhlIGFuaW1hdGlvbiBpcyBkb25lLCBpdCBtZWFu
cyB3ZSBhcmUgY2xlYW5pbmcgdXAgYSBqdXN0IGZpbmlzaGVkIGFuaW1hdGlvbi4KKyAgICAvLyBJ
ZiBzbywgd2UgbmVlZCB0byBzZW5kIGJhY2sgdGhlIHRhcmdldFN0eWxlCisgICAgaWYgKHBvc3Rh
Y3RpdmUoKSkgeworICAgICAgICBpZiAoIWlvQW5pbWF0ZWRTdHlsZSkKKyAgICAgICAgICAgIGlv
QW5pbWF0ZWRTdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0YXJnZXRTdHlsZSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBhcmUgd2FpdGluZyBmb3IgdGhl
IHN0YXJ0IHRpbWVyLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc3R5bGUgeWV0CisgICAg
Ly8gU3BlY2lhbCBjYXNlIC0gaWYgdGhlIGRlbGF5IHRpbWUgaXMgMCwgdGhlbiB3ZSBkbyB3YW50
IHRvIHNldCB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlCisgICAgLy8gYW5pbWF0aW9uIHJpZ2h0IGF3
YXkuIFRoaXMgYXZvaWRzIGEgZmxhc2ggd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0cworICAgIGlm
ICh3YWl0aW5nVG9TdGFydCgpICYmIG1fYW5pbWF0aW9uLT5kZWxheSgpID4gMCkKKyAgICAgICAg
cmV0dXJuOworICAgIAorICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRvIGJlIG1vcmUgZWZmaWNpZW50
IGFib3V0IGRldGVybWluaW5nIHdoaWNoIGtleWZyYW1lcyB3ZSBhcmUgYW5pbWF0aW5nIGJldHdl
ZW4uCisgICAgLy8gV2Ugc2hvdWxkIGNhY2hlIHRoZSBsYXN0IHBhaXIgb3Igc29tZXRoaW5nCisg
ICAgCisgICAgLy8gRmluZCB0aGUgZmlyc3Qga2V5CisgICAgZG91YmxlIGVsYXBzZWRUaW1lID0g
KG1fc3RhcnRUaW1lID4gMCkgPyAoKHJ1bm5pbmcoKSA/IGN1cnJlbnRUaW1lKCkgOiBtX3BhdXNl
VGltZSkgLSBtX3N0YXJ0VGltZSkgOiAwOworICAgIGlmIChlbGFwc2VkVGltZSA8IDApCisgICAg
ICAgIGVsYXBzZWRUaW1lID0gMDsKKyAgICAgICAgCisgICAgZG91YmxlIHQgPSBtX2FuaW1hdGlv
bi0+ZHVyYXRpb24oKSA/IChlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpKSA6
IDE7CisgICAgaW50IGkgPSAoaW50KSB0OworICAgIHQgLT0gaTsKKyAgICBpZiAobV9hbmltYXRp
b24tPmRpcmVjdGlvbigpICYmIChpICYgMSkpCisgICAgICAgIHQgPSAxIC0gdDsKKworICAgIFJl
bmRlclN0eWxlKiBmcm9tU3R5bGUgPSAwOworICAgIFJlbmRlclN0eWxlKiB0b1N0eWxlID0gMDsK
KyAgICBkb3VibGUgc2NhbGUgPSAxOworICAgIGRvdWJsZSBvZmZzZXQgPSAwOworICAgIGlmICht
X2tleWZyYW1lcy5nZXQoKSkgeworICAgICAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRLZXlmcmFtZXMoKTsKKyAgICAgICAgZm9y
IChWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMt
PmJlZ2luS2V5ZnJhbWVzKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgaWYgKHQg
PCBpdC0+a2V5KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGtleSBzaG91bGQgYWx3
YXlzIGJlIDAsIHNvIHdlIHNob3VsZCBuZXZlciBzdWNjZWVkIG9uIHRoZSBmaXJzdCBrZXkKKyAg
ICAgICAgICAgICAgICBpZiAoIWZyb21TdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgc2NhbGUgPSAxIC8gKGl0LT5rZXkgLSBvZmZzZXQpOworICAgICAg
ICAgICAgICAgIHRvU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oJihpdC0+c3R5bGUp
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgb2Zmc2V0ID0gaXQtPmtleTsKKyAgICAgICAgICAgIGZyb21TdHlsZSA9IGNv
bnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPigmKGl0LT5zdHlsZSkpOworICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIC8vIElmIGVpdGhlciBzdHlsZSBpcyAwIHdlIGhhdmUgYW4gaW52YWxpZCBjYXNl
LCBqdXN0IHN0b3AgdGhlIGFuaW1hdGlvbgorICAgIGlmICghZnJvbVN0eWxlIHx8ICF0b1N0eWxl
KSB7CisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9O
LCAtMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLy8gUnVuIGEgY3ljbGUg
b2YgYW5pbWF0aW9uLgorICAgIC8vIFdlIGtub3cgd2Ugd2lsbCBuZWVkIGEgbmV3IHJlbmRlciBz
dHlsZSwgc28gbWFrZSBvbmUgaWYgbmVlZGVkCisgICAgaWYgKCFpb0FuaW1hdGVkU3R5bGUpCisg
ICAgICAgIGlvQW5pbWF0ZWRTdHlsZSA9IG5ldyAocmVuZGVyZXItPnJlbmRlckFyZW5hKCkpIFJl
bmRlclN0eWxlKCp0YXJnZXRTdHlsZSk7CisgICAgCisgICAgZG91YmxlIHByb2cgPSBwcm9ncmVz
cyhzY2FsZSwgb2Zmc2V0KTsKKworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5k
ID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9
IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJs
ZW5kUHJvcGVydGllcygqaXQsIGlvQW5pbWF0ZWRTdHlsZSwgZnJvbVN0eWxlLCB0b1N0eWxlLCBw
cm9nKSkKKyAgICAgICAgICAgIHNldEFuaW1hdGluZygpOworICAgIH0KK30KKwordm9pZCBLZXlm
cmFtZUFuaW1hdGlvbjo6ZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpCit7CisgICAgaWYgKG1fb2Jq
ZWN0KSB7CisgICAgICAgIC8vIEZJWE1FOiBuZWVkIHRvIGRldGVybWluZSBhY3R1YWwgaW5kZXgg
KGluIGNhc2VzIHdoZXJlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYW5pbWF0aW9uIHBlciBUcmFu
c2l0aW9uIG9iamVjdCkKKyAgICAgICAgCisgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFs
ICh1bmFuaW1hdGVkKSBzdHlsZQorICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0LT5lbGVtZW50
KCkpOworICAgIH0KK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25TdGFy
dChkb3VibGUgaW5FbGFwc2VkVGltZSkKK3sKKyAgICBzZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnRO
YW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCwgaW5FbGFwc2VkVGltZSk7Cit9CisKK3Zv
aWQgS2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uSXRlcmF0aW9uKGRvdWJsZSBpbkVsYXBz
ZWRUaW1lKQoreworICAgIHNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmlt
YXRpb25JdGVyYXRpb25FdmVudCwgaW5FbGFwc2VkVGltZSk7Cit9CisKK3ZvaWQgS2V5ZnJhbWVB
bmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKQoreworICAgIC8v
IEZJWE1FOiBzZXQgdGhlIHVuYW5pbWF0ZWQgc3R5bGUgb24gdGhlIGVsZW1lbnQKKyAgICBpZiAo
IXNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCwg
aW5FbGFwc2VkVGltZSkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50
LCB3aGljaCB3b3VsZCBjYWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3ZSdsbCBqdXN0IGVuZAorICAg
ICAgICAvLyBpdCBoZXJlLgorICAgICAgICBlbmRBbmltYXRpb24odHJ1ZSk7CisgICAgfQorfQor
Citib29sIEtleWZyYW1lQW5pbWF0aW9uOjpzZW5kQW5pbWF0aW9uRXZlbnQoY29uc3QgQXRvbWlj
U3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpCit7CisgICAgLy8gRklY
TUU6IEV2ZW50IGRpc3BhdGNoIGdvZXMgaGVyZQorICAgIHJldHVybiBmYWxzZTsgLy8gZGlkbid0
IGRpc3BhdGNoIGFuIGV2ZW50Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om92ZXJyaWRl
QW5pbWF0aW9ucygpCit7CisgICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGltcGxpY2l0IGFuaW1h
dGlvbnMgdGhhdCBtYXRjaCB0aGUgcHJvcGVydGllcyBpbiB0aGUga2V5ZnJhbWUgYW5pbWF0aW9u
CisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5k
UHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAg
ICBjb21wb3NpdGVBbmltYXRpb24oKS0+b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMoKml0KTsK
K30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMo
KQoreworICAgIC8vIFRoaXMgd2lsbCByZXN1bWUgb3ZlcnJpZGRlbiBpbXBsaWNpdCBhbmltYXRp
b25zCisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+
ZW5kUHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBp
dCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQorICAg
ICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0
aW9ucygqaXQpOworfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9uOjphZmZlY3RzUHJvcGVydHko
aW50IHByb3BlcnR5KSBjb25zdAoreworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hTZXQ8aW50
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0
ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoKCppdCkgPT0gcHJvcGVydHkpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjcHJhZ21h
IG1hcmsgLQorCiBBbmltYXRpb25Db250cm9sbGVyOjpBbmltYXRpb25Db250cm9sbGVyKEZyYW1l
KiBmcmFtZSkKIDogbV9kYXRhKG5ldyBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZShmcmFtZSkp
CiB7CkBAIC0xNjg4LDE2ICsyMDQxLDE4IEBAIHZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6Y2Fu
Y2VsQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQogfQogCiBSZW5kZXJTdHlsZSog
QW5pbWF0aW9uQ29udHJvbGxlcjo6dXBkYXRlQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBSZW5kZXJTdHlsZSogbmV3U3R5bGUpCi17ICAgIAorewogICAgIC8vIGRvbid0IGRvIGFu
eXRoaW5nIGlmIHdlJ3JlIGluIHRoZSBjYWNoZQogICAgIGlmICghcmVuZGVyZXItPmRvY3VtZW50
KCkgfHwgcmVuZGVyZXItPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpCiAgICAgICAgIHJldHVy
biBuZXdTdHlsZTsKICAgICAKICAgICBSZW5kZXJTdHlsZSogb2xkU3R5bGUgPSByZW5kZXJlci0+
c3R5bGUoKTsKICAgICAKLSAgICBpZiAoKCFvbGRTdHlsZSB8fCAhb2xkU3R5bGUtPnRyYW5zaXRp
b25zKCkpICYmICFuZXdTdHlsZS0+dHJhbnNpdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIG5ld1N0
eWxlOwogICAgIAorICAgIGlmICgoIW9sZFN0eWxlIHx8ICghb2xkU3R5bGUtPmFuaW1hdGlvbnMo
KSAmJiAhb2xkU3R5bGUtPnRyYW5zaXRpb25zKCkpKSAmJiAKKyAgICAgICAgKCFuZXdTdHlsZS0+
YW5pbWF0aW9ucygpICYmICFuZXdTdHlsZS0+dHJhbnNpdGlvbnMoKSkpCisgICAgICAgIHJldHVy
biBuZXdTdHlsZTsKKwogICAgIFJlbmRlclN0eWxlKiBibGVuZGVkU3R5bGUgPSBuZXdTdHlsZTsK
ICAgICAKICAgICAvLyBGZXRjaCBvdXIgY3VycmVudCBzZXQgb2YgaW1wbGljaXQgYW5pbWF0aW9u
cyBmcm9tIGEgaGFzaHRhYmxlLiAgV2UgdGhlbiBjb21wYXJlIHRoZW0KQEAgLTE3MjAsNiArMjA3
NSwxOCBAQCBSZW5kZXJTdHlsZSogQW5pbWF0aW9uQ29udHJvbGxlcjo6dXBkYXRlQW5pbWF0aW9u
cyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBSZW5kZQogICAgIHJldHVybiBibGVuZGVkU3R5bGU7
CiB9CiAKK3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c2V0QW5pbWF0aW9uU3RhcnRUaW1lKFJl
bmRlck9iamVjdCogb2JqLCBkb3VibGUgdCkKK3sKKyAgICBDb21wb3NpdGVBbmltYXRpb24qIHJl
bmRlcmVyQW5pbWF0aW9ucyA9IG1fZGF0YS0+YWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9uKG9iaik7
CisgICAgcmVuZGVyZXJBbmltYXRpb25zLT5zZXRBbmltYXRpb25TdGFydFRpbWUodCk7Cit9CisK
K3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c2V0VHJhbnNpdGlvblN0YXJ0VGltZShSZW5kZXJP
YmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBkb3VibGUgdCkKK3sKKyAgICBDb21wb3NpdGVBbmlt
YXRpb24qIHJlbmRlcmVyQW5pbWF0aW9ucyA9IG1fZGF0YS0+YWNjZXNzQ29tcG9zaXRlQW5pbWF0
aW9uKG9iaik7CisgICAgcmVuZGVyZXJBbmltYXRpb25zLT5zZXRUcmFuc2l0aW9uU3RhcnRUaW1l
KHByb3BlcnR5LCB0KTsKK30KKwogYm9vbCBBbmltYXRpb25Db250cm9sbGVyOjppc0FuaW1hdGlu
Z1Byb3BlcnR5T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5KSBjb25z
dAogewogICAgIHJldHVybiBtX2RhdGEtPmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKG9i
aiwgcHJvcGVydHkpOwpAQCAtMTcyNywxNyArMjA5NCwxMSBAQCBib29sIEFuaW1hdGlvbkNvbnRy
b2xsZXI6OmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBp
bnQgcAogCiB2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6OnN1c3BlbmRBbmltYXRpb25zKERvY3Vt
ZW50KiBkb2N1bWVudCkKIHsKLSNpZmRlZiBERUJVR19TVEFURV9NQUNISU5FCi0gICAgZnByaW50
ZihzdGRlcnIsICJBbmltYXRpb25Db250cm9sbGVyICVwIHN1c3BlbmRBbmltYXRpb25zIGZvciBk
b2N1bWVudCAlcFxuIiwgdGhpcywgZG9jdW1lbnQpOwotI2VuZGlmCiAgICAgbV9kYXRhLT5zdXNw
ZW5kQW5pbWF0aW9ucyhkb2N1bWVudCk7CiB9CiAKIHZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6
cmVzdW1lQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQpCiB7Ci0jaWZkZWYgREVCVUdfU1RB
VEVfTUFDSElORQotICAgIGZwcmludGYoc3RkZXJyLCAiQW5pbWF0aW9uQ29udHJvbGxlciAlcCBy
ZXN1bWVBbmltYXRpb25zIGZvciBkb2N1bWVudCAlcFxuIiwgdGhpcywgZG9jdW1lbnQpOwotI2Vu
ZGlmCiAgICAgbV9kYXRhLT5yZXN1bWVBbmltYXRpb25zKGRvY3VtZW50KTsKIH0KIApkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuaCBiL1dlYkNvcmUvcGFnZS9B
bmltYXRpb25Db250cm9sbGVyLmgKaW5kZXggOTBjNDlkOS4uOTA4ZGIyMiAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuaAorKysgYi9XZWJDb3JlL3BhZ2UvQW5p
bWF0aW9uQ29udHJvbGxlci5oCkBAIC00OCw2ICs0OCw5IEBAIHB1YmxpYzoKICAgICB2b2lkIGNh
bmNlbEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7CiAgICAgUmVuZGVyU3R5bGUqIHVwZGF0ZUFu
aW1hdGlvbnMoUmVuZGVyT2JqZWN0KiwgUmVuZGVyU3R5bGUqIG5ld1N0eWxlKTsKICAgICAKKyAg
ICB2b2lkIHNldEFuaW1hdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgZG91YmxlIHQp
OworICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgaW50
IHByb3BlcnR5LCBkb3VibGUgdCk7CisKICAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHlPblJl
bmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBpbnQgcHJvcGVydHkpIGNvbnN0OwogICAgIAogICAg
IHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoRG9jdW1lbnQqIGRvY3VtZW50KTsKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAgYi9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuY3BwCmluZGV4IDEwN2Q2MWUuLjVmMDNiZmIgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKKysrIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyT2JqZWN0LmNwcApAQCAtMjE1NSw3ICsyMTU1LDcgQEAgdm9pZCBSZW5kZXJPYmplY3Q6Omhh
bmRsZUR5bmFtaWNGbG9hdFBvc2l0aW9uQ2hhbmdlKCkKIAogdm9pZCBSZW5kZXJPYmplY3Q6OnNl
dEFuaW1hdGFibGVTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUpCiB7Ci0gICAgaWYgKCFpc1RleHQo
KSAmJiBtX3N0eWxlICYmIHN0eWxlKQorICAgIGlmICghaXNUZXh0KCkgJiYgc3R5bGUpCiAgICAg
ICAgIHN0eWxlID0gYW5pbWF0aW9uKCktPnVwZGF0ZUFuaW1hdGlvbnModGhpcywgc3R5bGUpOwog
CiAgICAgaWYgKHN0eWxlKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUvUmVu
ZGVyU3R5bGUuaCBiL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL1JlbmRlclN0eWxlLmgKaW5kZXgg
NmQzMWUxYS4uNWRkMWQ2NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUvUmVu
ZGVyU3R5bGUuaAorKysgYi9XZWJDb3JlL3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5oCkBA
IC0xOTA3LDEwICsxOTA3LDEwIEBAIHB1YmxpYzoKIAogICAgIGNvbnN0IE5pbmVQaWVjZUltYWdl
JiBib3JkZXJJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIuaW1hZ2U7IH0K
IAotICAgIEludFNpemUgYm9yZGVyVG9wTGVmdFJhZGl1cygpIGNvbnN0IHsgcmV0dXJuIHN1cnJv
dW5kLT5ib3JkZXIudG9wTGVmdDsgfQotICAgIEludFNpemUgYm9yZGVyVG9wUmlnaHRSYWRpdXMo
KSBjb25zdCB7IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLnRvcFJpZ2h0OyB9Ci0gICAgSW50U2l6
ZSBib3JkZXJCb3R0b21MZWZ0UmFkaXVzKCkgY29uc3QgeyByZXR1cm4gc3Vycm91bmQtPmJvcmRl
ci5ib3R0b21MZWZ0OyB9Ci0gICAgSW50U2l6ZSBib3JkZXJCb3R0b21SaWdodFJhZGl1cygpIGNv
bnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIuYm90dG9tUmlnaHQ7IH0KKyAgICBjb25zdCBJ
bnRTaXplJiBib3JkZXJUb3BMZWZ0UmFkaXVzKCkgY29uc3QgeyByZXR1cm4gc3Vycm91bmQtPmJv
cmRlci50b3BMZWZ0OyB9CisgICAgY29uc3QgSW50U2l6ZSYgYm9yZGVyVG9wUmlnaHRSYWRpdXMo
KSBjb25zdCB7IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLnRvcFJpZ2h0OyB9CisgICAgY29uc3Qg
SW50U2l6ZSYgYm9yZGVyQm90dG9tTGVmdFJhZGl1cygpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5k
LT5ib3JkZXIuYm90dG9tTGVmdDsgfQorICAgIGNvbnN0IEludFNpemUmIGJvcmRlckJvdHRvbVJp
Z2h0UmFkaXVzKCkgY29uc3QgeyByZXR1cm4gc3Vycm91bmQtPmJvcmRlci5ib3R0b21SaWdodDsg
fQogICAgIGJvb2wgaGFzQm9yZGVyUmFkaXVzKCkgY29uc3QgeyByZXR1cm4gc3Vycm91bmQtPmJv
cmRlci5oYXNCb3JkZXJSYWRpdXMoKTsgfQogCiAgICAgdW5zaWduZWQgc2hvcnQgIGJvcmRlckxl
ZnRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIuYm9yZGVyTGVmdFdpZHRo
KCk7IH0K
</data>
<flag name="review"
          id="9896"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>22438</attachid>
            <date>2008-07-22 18:17:11 -0700</date>
            <delta_ts>2008-07-22 18:17:11 -0700</delta_ts>
            <desc>Tests simple repeated animation</desc>
            <filename>animate_left.html</filename>
            <type>text/html</type>
            <size>1208</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFs
Ly9FTiIKICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cgo8aHRtbCBs
YW5nPSJlbiI+CjxoZWFkPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50
PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPHRpdGxlPkFuaW1hdGlvbiBvZiBsZWZ0IHBy
b3BlcnR5PC90aXRsZT4KICAgIDxzdHlsZT4KICAgICAgICAgZGl2IHsKICAgICAgICAgICAgIHBv
c2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgIGxlZnQ6IDEwMHB4OwogICAgICAgICAgICAg
aGVpZ2h0OiAyMDBweDsKICAgICAgICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICAgICAgIGJh
Y2tncm91bmQtY29sb3I6ICM5YmI7CiAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1l
OiBib3VuY2U7CiAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMnM7CiAg
ICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwog
ICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiBhbHRlcm5hdGU7CiAgICAg
ICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0Owog
ICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlIHsK
ICAgICAgICAgICBmcm9tIHsKICAgICAgICAgICAgIC8vLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5z
bGF0ZSgwcHgpOwogICAgICAgICAgICAgbGVmdDogMTAwcHg7CiAgICAgICAgICAgfQogICAgICAg
ICAgIHRvIHsKICAgICAgICAgICAgIC8vLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgyMDBw
eCk7CiAgICAgICAgICAgICBsZWZ0OiAzMDBweDsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAg
ICAgICAgCiAgICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICA8aDE+QW5pbWF0aW9uIG9mICds
ZWZ0JyBwcm9wZXJ0eTwvaDE+CgogIDxwPlRoZSBlbGVtZW50IGJlbG93IHNob3VsZCBib3VuY2Ug
MjAwIHBpeGVscyBsZWZ0IGFuZCByaWdodCBjb250aW51b3VzbHk8L3A+CiAgCiAgPGRpdiBpZD0i
dGFyZ2V0Ij4KICAgIFRoaXMgZWxlbWVudCBzaG91bGQgYW5pbWF0ZS4KICA8L2Rpdj4KCjwvYm9k
eT4KPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>22439</attachid>
            <date>2008-07-22 18:17:45 -0700</date>
            <delta_ts>2008-07-22 18:17:45 -0700</delta_ts>
            <desc>Tests animation duration (and correct parsing)</desc>
            <filename>animation_duration.html</filename>
            <type>text/html</type>
            <size>1692</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFs
Ly9FTiIKICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cgo8aHRtbCBs
YW5nPSJlbiI+CjxoZWFkPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50
PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPHRpdGxlPk92ZXJyaWRpbmcgQW5pbWF0aW9u
czwvdGl0bGU+CiAgPHNjcmlwdCBzcmM9Ii4uLy4uL3NoYXJlZC9qYXZhc2NyaXB0L3V0aWxzLmpz
IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICA8c3R5
bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgoKICAuY29udGFpbmVyIHsKICAgICBw
b3NpdGlvbjogcmVsYXRpdmU7CiAgICAgd2lkdGg6IDQwMHB4OwogICAgIGhlaWdodDogMTIwcHg7
CiAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgbWFyZ2luOiAxMHB4OwogICB9CiAg
IC5ib3ggewogICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICB3aWR0aDogMTAwcHg7CiAgICAg
aGVpZ2h0OiAxMDBweDsKICAgICBtYXJnaW46IDEwcHg7CiAgICAgYmFja2dyb3VuZC1jb2xvcjog
Ymx1ZTsKICAgICB6LWluZGV4OiAwOwogICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ICJzbGlk
ZSI7CiAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDFzOwogICAgIC13ZWJraXQtYW5p
bWF0aW9uLWRpcmVjdGlvbjogYWx0ZXJuYXRlOwogICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWlu
Zy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7CiAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9u
LWNvdW50OiBpbmZpbml0ZTsKICAgfSAgCgogICAub25lIHsKICAgICAtd2Via2l0LWFuaW1hdGlv
bi1kdXJhdGlvbjogMHM7CiAgIH0KCiAgIC50d28gewogICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1
cmF0aW9uOiAwOwogICB9CiAgIAogICBALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGUgewogICAgIGZy
b20geyAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgICAgICB9CiAgICAgdG8gICB7
IC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDI4MHB4KTsgIH0KICAgfQoKICA8L3N0eWxl
Pgo8L2hlYWQ+Cjxib2R5PgogIDxwPlNpbmdsZSBhbmltIChzaG91bGQga2VlcCBhbmltYXRpbmcp
PC9wPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciIgb25jbGljaz0idG9nZ2xlQ2xhc3NOYW1lKHRo
aXMsICdoaWdobGlnaHRlZCcpIj4KICAgIDxkaXYgY2xhc3M9ImJveCBub25lIj4KICAgIDwvZGl2
PgogIDwvZGl2PgogIDxwPmR1cmF0aW9uOiAiMHMiIChzaG91bGQgbm90IGFuaW1hdGUpPC9wPgog
IDxkaXYgY2xhc3M9ImNvbnRhaW5lciIgb25jbGljaz0idG9nZ2xlQ2xhc3NOYW1lKHRoaXMsICdo
aWdobGlnaHRlZCcpIj4KICAgIDxkaXYgY2xhc3M9ImJveCBvbmUiPgogICAgPC9kaXY+CiAgPC9k
aXY+CiAgPHA+ZHVyYXRpb246ICIwIiAoc2hvdWxkIGFuaW1hdGUgc2luY2UgaW5oZXJpdHMgdmFs
aWQgZHVyYXRpb24pPC9wPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciIgb25jbGljaz0idG9nZ2xl
Q2xhc3NOYW1lKHRoaXMsICdoaWdobGlnaHRlZCcpIj4KICAgIDxkaXYgY2xhc3M9ImJveCB0d28i
PgogICAgPC9kaXY+CiAgPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>22440</attachid>
            <date>2008-07-22 18:18:19 -0700</date>
            <delta_ts>2008-07-22 18:18:19 -0700</delta_ts>
            <desc>Tests that &quot;none&quot; animation works </desc>
            <filename>animation_none.html</filename>
            <type>text/html</type>
            <size>6036</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgogICJodHRw
Oi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KCjxodG1sPgogIDxoZWFkPgogICAg
PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJz
ZXQ9dXRmLTgiPgogICAgPHRpdGxlPlRlc3RpbmcgYW5pbWF0aW9uLW5hbWU6IG5vbmU8L3RpdGxl
PgogICAgCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgogICAgICBk
aXYgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBoZWlnaHQ6IDEwMHB4OwogICAgICAg
IG1hcmdpbjogMTBweDsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiAnZmFpbCc7CiAg
ICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDMuNXM7CiAgICAgICAgLXdlYmtpdC1h
bmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICAtd2Via2l0LWFuaW1h
dGlvbi1kaXJlY3Rpb246IGFsdGVybmF0ZTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1p
bmctZnVuY3Rpb246IGxpbmVhcjsgICAgICAgIAogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlm
cmFtZXMgJ2ZhaWwnIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3Jt
OiByb3RhdGUoLTkwZGVnKTsKICAgICAgICB9CiAgICAgICAgdG8gewogICAgICAgICAgLXdlYmtp
dC10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjYm94
MSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6
IGJsdWU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogJ3N3YXkxJzsKICAgICAgICAt
d2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMi41czsKICAgICAgICAtd2Via2l0LWFuaW1hdGlv
bi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWRp
cmVjdGlvbjogYWx0ZXJuYXRlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5j
dGlvbjogbGluZWFyOwogICAgICB9CiAgICAgIAogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgJ3N3
YXkxJyB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNs
YXRlKDAsIDApOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICAtd2Via2l0LXRyYW5z
Zm9ybTogdHJhbnNsYXRlKDIwMHB4LCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAg
ICNib3gyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZC1j
b2xvcjogcmVkOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ICdzd2F5Mic7CiAgICAg
ICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDNzOwogICAgICAgIC13ZWJraXQtYW5pbWF0
aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24t
ZGlyZWN0aW9uOiBhbHRlcm5hdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1
bmN0aW9uOiBsaW5lYXI7CiAgICAgIH0KICAgICAgCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyAn
c3dheTInIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFu
c2xhdGUoMHB4LCAwKTsKICAgICAgICB9CiAgICAgICAgdG8gewogICAgICAgICAgLXdlYmtpdC10
cmFuc2Zvcm06IHRyYW5zbGF0ZSgyMDBweCwgMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAj
Ym94MyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQtY29s
b3I6IGdyZWVuOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ICdzd2F5Myc7CiAgICAg
ICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDMuNXM7CiAgICAgICAgLXdlYmtpdC1hbmlt
YXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlv
bi1kaXJlY3Rpb246IGFsdGVybmF0ZTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmct
ZnVuY3Rpb246IGxpbmVhcjsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzICdzd2F5
MycgewogICAgICAgIGZyb20gewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0
ZSgwcHgsIDApOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICAtd2Via2l0LXRyYW5z
Zm9ybTogdHJhbnNsYXRlKDIwMHB4LCAwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNib3g0
IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjog
b3JhbmdlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ICdub25lJzsKICAgICAgICAt
d2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogM3M7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24t
aXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kaXJl
Y3Rpb246IGFsdGVybmF0ZTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rp
b246IGxpbmVhcjsKICAgICAgfQoKICAgICAgI2JveDUgewogICAgICAgIHBvc2l0aW9uOiByZWxh
dGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBwdXJwbGU7CiAgICAgICAgLXdlYmtpdC1h
bmltYXRpb24tbmFtZTogJ25vbmUnOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9u
OiAzczsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRl
OwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogYWx0ZXJuYXRlOwogICAgICAg
IC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyOwogICAgICB9CgogICAg
ICAjYm94NiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQt
Y29sb3I6IGJsdWU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogJ2ZhZGUnLCAnc3dh
eTYnOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAzcywgNHM7CiAgICAgICAg
LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZSwgaW5maW5pdGU7CiAg
ICAgICAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiBhbHRlcm5hdGUsIGFsdGVybmF0ZTsK
ICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhciwgbGluZWFy
OwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgJ3N3YXk2JyB7CiAgICAgICAgZnJv
bSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMCk7CiAgICAg
ICAgfQogICAgICAgIHRvIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUo
MjAwcHgsIDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzICdm
YWRlJyB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICBvcGFjaXR5OiAxLjA7CiAgICAgICAgfQog
ICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgICB9CiAgICAgIH0KCiAg
ICAgIC8qIHNldCB1cCBhbmltYXRpb24gdGhhdCBzaG91bGQgbmV2ZXIgYmUgcnVuICovCiAgICAg
IEAtd2Via2l0LWtleWZyYW1lcyBub25lIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIC13ZWJr
aXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMjAwcHgsIDApIHJvdGF0ZSgtOTBkZWcpOwogICAgICAg
IH0KICAgICAgICB0byB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBw
eCwgMCkgcm90YXRlKDkwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICA8L3N0eWxlPgogICAg
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KICAgICAgZnVu
Y3Rpb24ga2lsbGFuaW1zKCkgewogICAgICAgIGNvbnNvbGUubG9nKCJjbGljayIpOwogICAgICAg
IHZhciBib3gxID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJveDEiKTsKICAgICAgICBib3gx
LnN0eWxlLndlYmtpdEFuaW1hdGlvbk5hbWUgPSAnJzsKICAgICAgICB2YXIgYm94MiA9IGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJib3gyIik7CiAgICAgICAgYm94Mi5zdHlsZS53ZWJraXRBbmlt
YXRpb25OYW1lID0gJ25vbmUnOwogICAgICAgIHZhciBib3gzID0gZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoImJveDMiKTsKICAgICAgICBib3gzLnN0eWxlLndlYmtpdEFuaW1hdGlvbk5hbWUgPSAi
J25vbmUnIjsKICAgICAgICB2YXIgYm94NiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJib3g2
Iik7CiAgICAgICAgYm94Ni5zdHlsZS53ZWJraXRBbmltYXRpb25OYW1lID0gIm5vbmUsICdzd2F5
NiciOwogICAgICB9CiAgICAgIAogICAgICBzZXRUaW1lb3V0KGtpbGxhbmltcywgMjAwMCk7CiAg
ICA8L3NjcmlwdD4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICAKICAgIDxoMj5UZXN0aW5nIGFuaW1h
dGlvbjogbm9uZTwvaDI+CiAgICAKICAgICAgPHA+CiAgICAgICAgQWZ0ZXIgMiBzZWNvbmRzIG9u
bHkgdGhlIGJsdWUgcmVjdGFuZ2xlcyBzaG91bGQgYmUKICAgICAgICBhbmltYXRpbmcuCiAgICAg
IEFueSByZXN1bHRpbmcgYW5pbWF0aW9uCiAgICAgIHRoYXQgaW52b2x2ZXMgcm90YXRpb24gb3Ig
ZmFkaW5nIG1lYW5zIHRoYXQgdGhpcyB0ZXN0IGhhcyBGQUlMRUQuPC9wPgogICAgCiAgICA8ZGl2
IGlkPSJib3gxIj4KICAgICAgVGhpcyByZWN0YW5nbGUgc3RhcnRzIHdpdGggYW4gYW5pbWF0aW9u
LiBBZnRlciAyIHNlY29uZHMgYSB0aW1lcgogICAgICB3aWxsIHNldCB0aGUgYW5pbWF0aW9uLW5h
bWUgb24gdGhlIGVsZW1lbnQgdG8gJycgKHRoZSBlbXB0eSBzdHJpbmcpLgogICAgICBUaGUgQ1NT
IHJ1bGUgc2hvdWxkIGNhdXNlIHRoZSBhbmltYXRpb24gdG8gY29udGludWUuCiAgICA8L2Rpdj4K
CiAgICA8ZGl2IGlkPSJib3gyIj4KICAgICAgVGhpcyByZWN0YW5nbGUgc3RhcnRzIHdpdGggYW4g
YW5pbWF0aW9uLiBBZnRlciAyIHNlY29uZHMgYSB0aW1lcgogICAgICB3aWxsIHNldCB0aGUgYW5p
bWF0aW9uLW5hbWUgb24gdGhlIGVsZW1lbnQgdG8gJ25vbmUnIChhcyBhbiBpZGVudGlmaWVyKS4K
ICAgICAgVGhpcyBzaG91bGQgY2F1c2UgdGhlIGFuaW1hdGlvbiB0byBzdG9wLgogICAgPC9kaXY+
CgogICAgPGRpdiBpZD0iYm94MyI+CiAgICAgIFRoaXMgcmVjdGFuZ2xlIHN0YXJ0cyB3aXRoIGFu
IGFuaW1hdGlvbi4gQWZ0ZXIgMiBzZWNvbmRzIGEgdGltZXIKICAgICAgd2lsbCBzZXQgdGhlIGFu
aW1hdGlvbi1uYW1lIG9uIHRoZSBlbGVtZW50IHRvICdub25lJyAoYXMgYSBzdHJpbmcpLgogICAg
ICBUaGlzIHNob3VsZCBjYXVzZSB0aGUgYW5pbWF0aW9uIHRvIHN0b3AuCiAgICA8L2Rpdj4KCiAg
ICA8ZGl2IGlkPSJib3g0Ij4KICAgICAgVGhpcyByZWN0YW5nbGUgc3RhcnRzIHdpdGggYW4gYW5p
bWF0aW9uLCBidXQgYW5pbWF0aW9uLW5hbWUgaXMKICAgICAgc2V0IHRvICdub25lJyAoYXMgYW4g
aWRlbnRpZmllcikuIE5vIGFuaW1hdGlvbiBzaG91bGQgcnVuLgogICAgPC9kaXY+CgogICAgPGRp
diBpZD0iYm94NSI+CiAgICAgIFRoaXMgcmVjdGFuZ2xlIHN0YXJ0cyB3aXRoIGFuIGFuaW1hdGlv
biwgYnV0IGFuaW1hdGlvbi1uYW1lIGlzCiAgICAgIHNldCB0byAnbm9uZScgKGFzIGEgc3RyaW5n
KS4gTm8gYW5pbWF0aW9uIHNob3VsZCBydW4uCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJib3g2
Ij4KICAgICAgVGhpcyByZWN0YW5nbGUgc3RhcnRzIHdpdGggdHdvIGFuaW1hdGlvbnMuIEFmdGVy
IDIgc2Vjb25kcyBhIHRpbWVyCiAgICAgIHdpbGwgc2V0IHRoZSBhbmltYXRpb24tbmFtZSBvbiB0
aGUgZmFkZSB0byAnbm9uZScuIFRoZSBvdGhlcgogICAgICBhbmltYXRpb24gKGhvcml6b250YWwp
IHNob3VsZCBjb250aW51ZS4KICAgIDwvZGl2PgogICAgCiAgPC9ib2R5Pgo8L2h0bWw+
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>22441</attachid>
            <date>2008-07-22 18:19:01 -0700</date>
            <delta_ts>2008-07-22 18:19:01 -0700</delta_ts>
            <desc>Tests animation timing functions</desc>
            <filename>animation_timing_functions.html</filename>
            <type>text/html</type>
            <size>928</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">PGh0bWw+CgogIDxoZWFkPgogICAgPHRpdGxlPlVzaW5nIHNlcGVyYXRlIHRpbWluZyBmdW5jdGlv
bnMgZm9yIGVhY2gga2V5ZnJhbWU8L3RpdGxlPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIiBt
ZWRpYT0ic2NyZWVuIj4KICAgICAgCiAgICAgICN0YXJnZXQgewogICAgICAgIHBvc2l0aW9uOiBh
YnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgaGVpZ2h0OiAxMDBweDsKICAg
ICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5h
bWU6IGFuaW07CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDJzOwogICAgICB9
CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgYW5pbSB7CiAgICAgICAgMCUgICAgewogICAgICAg
ICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7CiAgICAgICAgICAgICAg
ICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjsKICAgICAgICAgICAg
ICB9CiAgICAgICAgNTAlICAgewogICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRy
YW5zbGF0ZVgoMTAwcHgpOwogICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5n
LWZ1bmN0aW9uOiBlYXNlLW91dDsKICAgICAgICAgICAgICB9CiAgICAgICAgMTAwJSAgeyAtd2Vi
a2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgyMDBweCk7IH0KICAgICAgfQogICAgICAKICAgIDwv
c3R5bGU+CiAgPC9oZWFkPgoKICA8cD5BbmltYXRpb24gdXNlcyBhIHNlcGFyYXRlIHRpbWluZyBm
dW5jdGlvbiBmb3IgZWFjaCBrZXlmcmFtZS4gSXQgc2hvdWxkIGJlCiAgICBsaW5lYXIgZnJvbSAw
LTUwJSwgYW5kIGVhc2Utb3V0IGZyb20gNTAgdG8gMTAwJTwvcD4KICA8ZGl2IGlkPSJ0YXJnZXQi
PjwvZGl2PgoKPC9odG1sPg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>22700</attachid>
            <date>2008-08-07 15:04:46 -0700</date>
            <delta_ts>2008-08-08 13:04:17 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>running-animations.patch</filename>
            <type>text/plain</type>
            <size>44372</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvY3NzL0NTU1N0eWxlU2VsZWN0b3IuY3BwIGIvV2ViQ29yZS9j
c3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHAKaW5kZXggMWM2MmYyZS4uN2RlNGQ1MiAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9jc3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHAKKysrIGIvV2ViQ29yZS9jc3MvQ1NT
U3R5bGVTZWxlY3Rvci5jcHAKQEAgLTE5NSw3ICsxOTUsNyBAQCBpZiAoaXNJbmhlcml0KSB7IFwK
ICAgICAgICAgKCpsaXN0KVtpXS0+c2V0IyNQcm9wKCgqcGFyZW50TGlzdClbaV0tPnByb3AoKSk7
IFwKICAgICB9IFwKICAgICBcCi0gICAgLyogUmVzZXQgYW55IHJlbWFpbmluZyBsYXllcnMgdG8g
bm90IGhhdmUgdGhlIHByb3BlcnR5IHNldC4gKi8gXAorICAgIC8qIFJlc2V0IGFueSByZW1haW5p
bmcgYW5pbWF0aW9ucyB0byBub3QgaGF2ZSB0aGUgcHJvcGVydHkgc2V0LiAqLyBcCiAgICAgZm9y
ICggOyBpIDwgbGlzdC0+c2l6ZSgpOyArK2kpIFwKICAgICAgICAgKCpsaXN0KVtpXS0+Y2xlYXIj
I1Byb3AoKTsgXAogfSBcCkBAIC0yMTMsNyArMjEzLDcgQEAgaWYgKGlzSW5oZXJpdCB8fCBpc0lu
aXRpYWwpIFwKIEFuaW1hdGlvbkxpc3QqIGxpc3QgPSBtX3N0eWxlLT5hY2Nlc3NBbmltYXRpb25z
KCk7IFwKIHNpemVfdCBjaGlsZEluZGV4ID0gMDsgXAogaWYgKHZhbHVlLT5pc1ZhbHVlTGlzdCgp
KSB7IFwKLSAgICAvKiBXYWxrIGVhY2ggdmFsdWUgYW5kIHB1dCBpdCBpbnRvIGEgbGF5ZXIsIGNy
ZWF0aW5nIG5ldyBsYXllcnMgYXMgbmVlZGVkLiAqLyBcCisgICAgLyogV2FsayBlYWNoIHZhbHVl
IGFuZCBwdXQgaXQgaW50byBhbiBhbmltYXRpb24sIGNyZWF0aW5nIG5ldyBhbmltYXRpb25zIGFz
IG5lZWRlZC4gKi8gXAogICAgIENTU1ZhbHVlTGlzdCogdmFsdWVMaXN0ID0gc3RhdGljX2Nhc3Q8
Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOyBcCiAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg
PCB2YWx1ZUxpc3QtPmxlbmd0aCgpOyBpKyspIHsgXAogICAgICAgICBpZiAoY2hpbGRJbmRleCA8
PSBsaXN0LT5zaXplKCkpIFwKQEAgLTIyOCw3ICsyMjgsNyBAQCBpZiAodmFsdWUtPmlzVmFsdWVM
aXN0KCkpIHsgXAogICAgIGNoaWxkSW5kZXggPSAxOyBcCiB9IFwKIGZvciAoIDsgY2hpbGRJbmRl
eCA8IGxpc3QtPnNpemUoKTsgKytjaGlsZEluZGV4KSB7IFwKLSAgICAvKiBSZXNldCBhbGwgcmVt
YWluaW5nIGxheWVycyB0byBub3QgaGF2ZSB0aGUgcHJvcGVydHkgc2V0LiAqLyBcCisgICAgLyog
UmVzZXQgYWxsIHJlbWFpbmluZyBhbmltYXRpb25zIHRvIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSBz
ZXQuICovIFwKICAgICAoKmxpc3QpW2NoaWxkSW5kZXhdLT5jbGVhciMjUHJvcCgpOyBcCiB9IFwK
IH0KQEAgLTI0NCw3ICsyNDQsNyBAQCBpZiAoaXNJbmhlcml0KSB7IFwKICAgICAgICAgKCpsaXN0
KVtpXS0+c2V0IyNQcm9wKCgqcGFyZW50TGlzdClbaV0tPnByb3AoKSk7IFwKICAgICB9IFwKICAg
ICBcCi0gICAgLyogUmVzZXQgYW55IHJlbWFpbmluZyBsYXllcnMgdG8gbm90IGhhdmUgdGhlIHBy
b3BlcnR5IHNldC4gKi8gXAorICAgIC8qIFJlc2V0IGFueSByZW1haW5pbmcgdHJhbnNpdGlvbnMg
dG8gbm90IGhhdmUgdGhlIHByb3BlcnR5IHNldC4gKi8gXAogICAgIGZvciAoIDsgaSA8IGxpc3Qt
PnNpemUoKTsgKytpKSBcCiAgICAgICAgICgqbGlzdClbaV0tPmNsZWFyIyNQcm9wKCk7IFwKIH0g
XApAQCAtMjYyLDcgKzI2Miw3IEBAIGlmIChpc0luaGVyaXQgfHwgaXNJbml0aWFsKSBcCiBBbmlt
YXRpb25MaXN0KiBsaXN0ID0gbV9zdHlsZS0+YWNjZXNzVHJhbnNpdGlvbnMoKTsgXAogc2l6ZV90
IGNoaWxkSW5kZXggPSAwOyBcCiBpZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsgXAotICAgIC8q
IFdhbGsgZWFjaCB2YWx1ZSBhbmQgcHV0IGl0IGludG8gYSBsYXllciwgY3JlYXRpbmcgbmV3IGxh
eWVycyBhcyBuZWVkZWQuICovIFwKKyAgICAvKiBXYWxrIGVhY2ggdmFsdWUgYW5kIHB1dCBpdCBp
bnRvIGEgdHJhbnNpdGlvbiwgY3JlYXRpbmcgbmV3IGFuaW1hdGlvbnMgYXMgbmVlZGVkLiAqLyBc
CiAgICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZUxpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3Qq
Pih2YWx1ZSk7IFwKICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHZhbHVlTGlzdC0+
bGVuZ3RoKCk7IGkrKykgeyBcCiAgICAgICAgIGlmIChjaGlsZEluZGV4IDw9IGxpc3QtPnNpemUo
KSkgXApAQCAtMjc3LDcgKzI3Nyw3IEBAIGlmICh2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkgeyBcCiAg
ICAgY2hpbGRJbmRleCA9IDE7IFwKIH0gXAogZm9yICggOyBjaGlsZEluZGV4IDwgbGlzdC0+c2l6
ZSgpOyArK2NoaWxkSW5kZXgpIHsgXAotICAgIC8qIFJlc2V0IGFsbCByZW1haW5pbmcgbGF5ZXJz
IHRvIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSBzZXQuICovIFwKKyAgICAvKiBSZXNldCBhbGwgcmVt
YWluaW5nIHRyYW5zaXRpb25zIHRvIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSBzZXQuICovIFwKICAg
ICAoKmxpc3QpW2NoaWxkSW5kZXhdLT5jbGVhciMjUHJvcCgpOyBcCiB9IFwKIH0KZGlmZiAtLWdp
dCBhL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcCBiL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcApp
bmRleCBkOTA1NTkxLi5iMjJlNjc2IDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5j
cHAKKysrIGIvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBAIC0xMTYxLDEwICsxMTYxLDEwIEBA
IGJhaWxfb3V0OgogCiB2b2lkIERvY3VtZW50Ojp1cGRhdGVSZW5kZXJpbmcoKQogewotICAgIGlm
IChoYXNDaGFuZ2VkQ2hpbGQoKSkKKyAgICBpZiAoaGFzQ2hhbmdlZENoaWxkKCkgJiYgIWluUGFn
ZUNhY2hlKCkpCiAgICAgICAgIHJlY2FsY1N0eWxlKE5vQ2hhbmdlKTsKICAgICAKLSAgICAvLyB0
ZWxsIHRoZSBhbmltYXRpb24gY29udHJvbGxlciB0aGF0IHRoZSBzdHlsZSBpcyBhdmFpbGFibGUg
YW5kIGl0IGNhbiBzdGFydCBhbmltYXRpb25zCisgICAgLy8gVGVsbCB0aGUgYW5pbWF0aW9uIGNv
bnRyb2xsZXIgdGhhdCB0aGUgc3R5bGUgaXMgYXZhaWxhYmxlIGFuZCBpdCBjYW4gc3RhcnQgYW5p
bWF0aW9ucwogICAgIGlmIChtX2ZyYW1lKQogICAgICAgICBtX2ZyYW1lLT5hbmltYXRpb24oKS0+
c3R5bGVBdmFpbGFibGUoKTsKIH0KQEAgLTE1NDgsNiArMTU0OCwxMCBAQCB2b2lkIERvY3VtZW50
OjppbXBsaWNpdENsb3NlKCkKICAgICBpZiAoZikKICAgICAgICAgZi0+bG9hZGVyKCktPnN0YXJ0
SWNvbkxvYWRlcigpOwogCisgICAgLy8gUmVzdW1lIHRoZSBhbmltYXRpb25zIChvciBzdGFydCB0
aGVtKQorICAgIGlmIChmKQorICAgICAgICBmLT5hbmltYXRpb24oKS0+cmVzdW1lQW5pbWF0aW9u
cyh0aGlzKTsKKwogICAgIGRpc3BhdGNoSW1hZ2VMb2FkRXZlbnRzTm93KCk7CiAgICAgdGhpcy0+
ZGlzcGF0Y2hXaW5kb3dFdmVudChsb2FkRXZlbnQsIGZhbHNlLCBmYWxzZSk7CiAgICAgaWYgKGYp
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5jcHAgYi9XZWJD
b3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5jcHAKaW5kZXggMDUxZjJlOC4uMzViZWI1MyAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCisrKyBiL1dl
YkNvcmUvcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcApAQCAtMTU3LDYgKzE1Nyw3IEBAIHBy
aXZhdGU6CiB9OwogCiBjbGFzcyBJbXBsaWNpdEFuaW1hdGlvbjsKK2NsYXNzIEtleWZyYW1lQW5p
bWF0aW9uOwogY2xhc3MgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU7CiAKIC8vIEEgQ29tcG9z
aXRlQW5pbWF0aW9uIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGFuaW1hdGlvbnMgdGhhdApA
QCAtMTczLDYgKzE3NCw3IEBAIHB1YmxpYzoKICAgICB+Q29tcG9zaXRlQW5pbWF0aW9uKCkKICAg
ICB7CiAgICAgICAgIGRlbGV0ZUFsbFZhbHVlcyhtX3RyYW5zaXRpb25zKTsKKyAgICAgICAgZGVs
ZXRlQWxsVmFsdWVzKG1fa2V5ZnJhbWVBbmltYXRpb25zKTsKICAgICB9CiAgICAgCiAgICAgUmVu
ZGVyU3R5bGUqIGFuaW1hdGUoUmVuZGVyT2JqZWN0KiwgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHls
ZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKQEAgLTE4MiwxMiArMTg0LDEzIEBAIHB1Ymxp
YzoKICAgICAKICAgICBib29sIGhhc0FuaW1hdGlvbkZvclByb3BlcnR5KGludCBwcm9wKSBjb25z
dCB7IHJldHVybiBtX3RyYW5zaXRpb25zLmNvbnRhaW5zKHByb3ApOyB9CiAgICAgCi0gICAgdm9p
ZCBzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKGludCBwcm9wZXJ0eSwgZG91YmxlIHQpOwotICAgIAog
ICAgIHZvaWQgcmVzZXRUcmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqKTsKICAgICB2b2lkIHJlc2V0
QW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqKTsKICAgICAKICAgICB2b2lkIGNsZWFudXBGaW5pc2hl
ZEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7CisKKyAgICB2b2lkIHNldEFuaW1hdGlvblN0YXJ0
VGltZShkb3VibGUgdCk7CisgICAgdm9pZCBzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKGludCBwcm9w
ZXJ0eSwgZG91YmxlIHQpOwogICAgIAogICAgIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoKTsKICAg
ICB2b2lkIHJlc3VtZUFuaW1hdGlvbnMoKTsKQEAgLTE5OCwxNiArMjAxLDIyIEBAIHB1YmxpYzoK
ICAgICAKICAgICB2b2lkIHN0eWxlQXZhaWxhYmxlKCk7CiAgICAgCi0gICAgYm9vbCBpc0FuaW1h
dGluZ1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7CisgICAgYm9vbCBpc0FuaW1hdGluZ1By
b3BlcnR5KGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0OwogICAgIAogICAg
IHZvaWQgc2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGJvb2wgd2FpdGluZyk7CisKIHByb3Rl
Y3RlZDoKICAgICB2b2lkIHVwZGF0ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIs
IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7Cisg
ICAgdm9pZCB1cGRhdGVLZXlmcmFtZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwg
UmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKKwor
ICAgIEtleWZyYW1lQW5pbWF0aW9uKiBmaW5kS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lKTsKICAgICAKIHByaXZhdGU6CiAgICAgdHlwZWRlZiBIYXNoTWFwPGludCwg
SW1wbGljaXRBbmltYXRpb24qPiBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOworICAgIHR5cGVk
ZWYgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgS2V5ZnJhbWVBbmltYXRpb24qPiAgQW5pbWF0
aW9uTmFtZU1hcDsKICAgICAKICAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwICAgbV90cmFu
c2l0aW9uczsKKyAgICBBbmltYXRpb25OYW1lTWFwICAgICAgICAgICAgbV9rZXlmcmFtZUFuaW1h
dGlvbnM7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1fc3VzcGVuZGVkOwogICAg
IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKiBtX2FuaW1hdGlvbkNvbnRyb2xsZXI7CiAgICAg
dWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzOwpA
QCAtMjcwLDEzICsyNzksMTEgQEAgcHVibGljOgogICAgIHZvaWQgdXBkYXRlU3RhdGVNYWNoaW5l
KEFuaW1TdGF0ZUlucHV0IGlucHV0LCBkb3VibGUgcGFyYW0pOwogICAgIAogICAgIC8vIEFuaW1h
dGlvbiBoYXMgYWN0dWFsbHkgc3RhcnRlZCwgYXQgcGFzc2VkIHRpbWUKLSAgICAvLyBUaGlzIGlz
IGEgY2FsbGJhY2sgYW5kIGlzIG9ubHkgcmVjZWl2ZWQgd2hlbiBSZW5kZXJPYmplY3Q6OnN0YXJ0
QW5pbWF0aW9uKCkgb3IgUmVuZGVyT2JqZWN0OjpzdGFydFRyYW5zaXRpb24oKSAKLSAgICAvLyBy
ZXR1cm5zIHRydWUuIElmIFJlbmRlck9iamVjdDo6CiAgICAgdm9pZCBvbkFuaW1hdGlvblN0YXJ0
UmVzcG9uc2UoZG91YmxlIHN0YXJ0VGltZSk7CiAgICAgCiAgICAgLy8gQ2FsbGVkIHRvIGNoYW5n
ZSB0byBvciBmcm9tIHBhdXNlZCBzdGF0ZQogICAgIHZvaWQgdXBkYXRlUGxheVN0YXRlKGJvb2wg
cnVubmluZyk7Ci0gICAgYm9vbCBwbGF5U3RhdGVQbGF5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9h
bmltYXRpb247IH0KKyAgICBib29sIHBsYXlTdGF0ZVBsYXlpbmcoKSBjb25zdCB7IHJldHVybiBt
X2FuaW1hdGlvbiAmJiBtX2FuaW1hdGlvbi0+cGxheVN0YXRlKCkgPT0gQW5pbVBsYXlTdGF0ZVBs
YXlpbmc7IH0KICAgICAKICAgICBib29sIHdhaXRpbmdUb1N0YXJ0KCkgY29uc3QgeyByZXR1cm4g
bV9hbmltU3RhdGUgPT0gU1RBVEVfTkVXIHx8IG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dB
SVRfVElNRVI7IH0KICAgICBib29sIHByZWFjdGl2ZSgpIGNvbnN0CkBAIC0zMDIsNyArMzA5LDcg
QEAgcHVibGljOgogICAgIGRvdWJsZSBwcm9ncmVzcyhkb3VibGUgc2NhbGUsIGRvdWJsZSBvZmZz
ZXQpIGNvbnN0OwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBvc2l0ZUFuaW1h
dGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIAot
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSwg
UmVuZGVyU3R5bGUqJiBpb0FuaW1hdGVkU3R5bGUpIHsgfQorICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRl
ZFN0eWxlKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJl
ciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gPSAwLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAw
KSB7IH0KICAgICAKICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CkBAIC0zMjMsOSArMzMwLDEyIEBAIHB1YmxpYzoKICAgICAKICAgICAv
LyBEb2VzIHRoaXMgYW5pbWF0aW9uL3RyYW5zaXRpb24gaW52b2x2ZSB0aGUgZ2l2ZW4gcHJvcGVy
dHk/CiAgICAgdmlydHVhbCBib29sIGFmZmVjdHNQcm9wZXJ0eShpbnQgcHJvcGVydHkpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5KGludCBwcm9w
ZXJ0eSkgY29uc3QKKyAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5LCBi
b29sIGlzUnVubmluZ05vdykgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiAoIXdhaXRpbmdU
b1N0YXJ0KCkgJiYgIXBvc3RhY3RpdmUoKSkgJiYgYWZmZWN0c1Byb3BlcnR5KHByb3BlcnR5KTsK
KyAgICAgICAgaWYgKGlzUnVubmluZ05vdykKKyAgICAgICAgICAgIHJldHVybiAoIXdhaXRpbmdU
b1N0YXJ0KCkgJiYgIXBvc3RhY3RpdmUoKSkgJiYgYWZmZWN0c1Byb3BlcnR5KHByb3BlcnR5KTsK
KworICAgICAgICByZXR1cm4gIXBvc3RhY3RpdmUoKSAmJiBhZmZlY3RzUHJvcGVydHkocHJvcGVy
dHkpOwogICAgIH0KICAgICAgICAgCiBwcm90ZWN0ZWQ6CkBAIC0zNTgsNyArMzY4LDcgQEAgcHJv
dGVjdGVkOgogICAgIGJvb2wgbV93YWl0ZWRGb3JSZXNwb25zZTsKICAgICBkb3VibGUgbV9zdGFy
dFRpbWU7CiAgICAgZG91YmxlIG1fcGF1c2VUaW1lOwotICAgIFJlbmRlck9iamVjdCogICBtX29i
amVjdDsKKyAgICBSZW5kZXJPYmplY3QqIG1fb2JqZWN0OwogICAgIAogICAgIEFuaW1hdGlvblRp
bWVyQ2FsbGJhY2sgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrOwogICAgIEFuaW1hdGlvbkV2ZW50
RGlzcGF0Y2hlciBtX2FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcjsKQEAgLTM5NSwxMSArNDA1LDkg
QEAgcHVibGljOgogICAgIGludCBwcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVydHk7
IH0KICAgICAKICAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNl
ZFRpbWUpOwotICAgIHZpcnR1YWwgYm9vbCBzdGFydEFuaW1hdGlvbihkb3VibGUgYmVnaW5UaW1l
KTsKLSAgICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpOwogICAgIAogICAg
IHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCos
IGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIAotICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBpb0FuaW1h
dGVkU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0
YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKTsKICAgICB2aXJ0dWFsIHZv
aWQgcmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20g
PSAwLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAwKTsKICAgICAKICAgICB2b2lkIHNldE92ZXJy
aWRkZW4oYm9vbCBiKTsKQEAgLTQ0MSw3ICs0NDksNTkgQEAgdm9pZCBBbmltYXRpb25FdmVudERp
c3BhdGNoZXI6OnRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiopCiB7CiAgICAg
bV9hbmltLT5hbmltYXRpb25FdmVudERpc3BhdGNoZXJGaXJlZChtX2VsZW1lbnQuZ2V0KCksIG1f
bmFtZSwgbV9wcm9wZXJ0eSwgbV9yZXNldCwgbV9ldmVudFR5cGUsIG1fZWxhcHNlZFRpbWUpOwog
fQorCitjbGFzcyBLZXlmcmFtZUFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNlIHsKK3B1
YmxpYzoKKyAgICBLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIGFuaW1hdGlvbiwg
UmVuZGVyT2JqZWN0KiByZW5kZXJlciwgaW50IGluZGV4LCBDb21wb3NpdGVBbmltYXRpb24qIGNv
bXBBbmltKQorICAgIDogQW5pbWF0aW9uQmFzZShhbmltYXRpb24sIHJlbmRlcmVyLCBjb21wQW5p
bSkKKyAgICAsIG1fa2V5ZnJhbWVzKGFuaW1hdGlvbi0+a2V5ZnJhbWVMaXN0KCkpCisgICAgLCBt
X25hbWUoYW5pbWF0aW9uLT5uYW1lKCkpCisgICAgLCBtX2luZGV4KGluZGV4KQorICAgIHsKKyAg
ICB9CisKKyAgICB2aXJ0dWFsIH5LZXlmcmFtZUFuaW1hdGlvbigpCisgICAgeworICAgICAgICAv
LyBEbyB0aGUgY2xlYW51cCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIGJhc2UgY2xhc3Mgc28gdGhl
IHNwZWNpYWxpemVkIG1ldGhvZHMgZ2V0IGNhbGxlZAorICAgICAgICBpZiAoIXBvc3RhY3RpdmUo
KSkKKyAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFU
SU9OLCAtMSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGFuaW1hdGUoQ29tcG9zaXRlQW5p
bWF0aW9uKiwgUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUs
IFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSk7CisKKyAgICB2b2lkIHNldE5hbWUoY29uc3Qg
U3RyaW5nJiBzKSB7IG1fbmFtZSA9IHM7IH0KKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUo
KSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKyAgICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVy
biBtX2luZGV4OyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0
IHsgcmV0dXJuIHRydWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1h
dGlvblN0YXJ0KGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Bbmlt
YXRpb25JdGVyYXRpb24oZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIHZpcnR1YWwgdm9pZCBv
bkFuaW1hdGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSk7CisgICAgdmlydHVhbCB2b2lkIGVu
ZEFuaW1hdGlvbihib29sIHJlc2V0KTsKKworICAgIHZpcnR1YWwgdm9pZCBvdmVycmlkZUFuaW1h
dGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMoKTsK
ICAgICAKKyAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3VtZW50OjpMaXN0
ZW5lclR5cGUgaW5MaXN0ZW5lclR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbV9vYmplY3Qt
PmRvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7CisgICAgfQorICAg
IAorICAgIGJvb2wgc2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVu
dFR5cGUsIGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgYWZm
ZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gVGhl
IGtleWZyYW1lcyB0aGF0IHdlIGFyZSBibGVuZGluZy4KKyAgICBSZWZQdHI8S2V5ZnJhbWVMaXN0
PiBtX2tleWZyYW1lczsKKyAgICBBdG9taWNTdHJpbmcgbV9uYW1lOworICAgIC8vIFRoZSBvcmRl
ciBpbiB3aGljaCB0aGlzIGFuaW1hdGlvbiBhcHBlYXJzIGluIHRoZSBhbmltYXRpb24tbmFtZSBz
dHlsZS4KKyAgICBpbnQgbV9pbmRleDsKK307CisKIEFuaW1hdGlvbkJhc2U6OkFuaW1hdGlvbkJh
c2UoY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBD
b21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltKQogOiBtX2FuaW1TdGF0ZShTVEFURV9ORVcpCiAs
IG1faXRlcmF0aW9uKDApCkBAIC00NjAsNyArNTIwLDcgQEAgQW5pbWF0aW9uQmFzZTo6QW5pbWF0
aW9uQmFzZShjb25zdCBBbmltYXRpb24qIHRyYW5zaXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVy
ZXIKIAogdm9pZCBBbmltYXRpb25CYXNlOjp1cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbVN0YXRlSW5w
dXQgaW5wdXQsIGRvdWJsZSBwYXJhbSkKIHsKLSAgICAvLyBpZiB3ZSBnZXQgYSBSRVNUQVJUIHRo
ZW4gd2UgZm9yY2UgYSBuZXcgYW5pbWF0aW9uLCByZWdhcmRsZXNzIG9mIHN0YXRlCisgICAgLy8g
SWYgd2UgZ2V0IGEgUkVTVEFSVCB0aGVuIHdlIGZvcmNlIGEgbmV3IGFuaW1hdGlvbiwgcmVnYXJk
bGVzcyBvZiBzdGF0ZQogICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9NQUtFX05FVykgewog
ICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFC
TEUpCiAgICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUo
ZmFsc2UpOwpAQCAtNTA5LDcgKzU2OSw3IEBAIHZvaWQgQW5pbWF0aW9uQmFzZTo6dXBkYXRlU3Rh
dGVNYWNoaW5lKEFuaW1TdGF0ZUlucHV0IGlucHV0LCBkb3VibGUgcGFyYW0pCiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAgICAgCi0gICAgLy8gZXhlY3V0ZSBzdGF0ZSBtYWNoaW5lCisgICAgLy8g
RXhlY3V0ZSBzdGF0ZSBtYWNoaW5lCiAgICAgc3dpdGNoKG1fYW5pbVN0YXRlKSB7CiAgICAgICAg
IGNhc2UgU1RBVEVfTkVXOgogICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVU
X1NUQVJUX0FOSU1BVElPTiB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5J
TkcgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwpAQCAtNTUzLDcg
KzYxMyw3IEBAIHZvaWQgQW5pbWF0aW9uQmFzZTo6dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1TdGF0
ZUlucHV0IGlucHV0LCBkb3VibGUgcGFyYW0pCiAgICAgICAgICAgICAgICAgb3ZlcnJpZGVBbmlt
YXRpb25zKCk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLy8gU2VuZCBzdGFy
dCBldmVudCwgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgb25BbmltYXRpb25TdGFydCgwLjBm
KTsgLy8gdGhlIGVsYXBzZWRUaW1lIGlzIGFsd2F5cyAwIGhlcmUKKyAgICAgICAgICAgICAgICBv
bkFuaW1hdGlvblN0YXJ0KDAuMGYpOyAvLyBUaGUgZWxhcHNlZFRpbWUgaXMgYWx3YXlzIDAgaGVy
ZQogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRp
b24KICAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGRlbigpIHx8ICFzdGFydEFuaW1hdGlvbigw
KSkgewpAQCAtNzE0LDYgKzc3NCwxNSBAQCB2b2lkIEFuaW1hdGlvbkJhc2U6OmFuaW1hdGlvbkV2
ZW50RGlzcGF0Y2hlckZpcmVkKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pYwogICAgIEFT
U0VSVCghZWxlbWVudCB8fCAoZWxlbWVudC0+ZG9jdW1lbnQoKSAmJiAhZWxlbWVudC0+ZG9jdW1l
bnQoKS0+aW5QYWdlQ2FjaGUoKSkpOwogICAgIGlmICghZWxlbWVudCkKICAgICAgICAgcmV0dXJu
OworCisgICAgLy8gRklYTUU6IEFjdHVhbCBldmVudCBkaXNwYXRjaGluZyB3aWxsIGJlIGRvbmUg
aGVyZQorCisgICAgaWYgKGFuaW1FdmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0
aW9uRW5kRXZlbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAg
ICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsICh1bmFuaW1hdGVkKSBzdHlsZQorICAgICAg
ICAgICAgc2V0Q2hhbmdlZChlbGVtZW50LT5yZW5kZXJlcigpLT5lbGVtZW50KCkpOworICAgICAg
ICB9CisgICAgfQogfQogCiB2b2lkIEFuaW1hdGlvbkJhc2U6OnVwZGF0ZVBsYXlTdGF0ZShib29s
IHJ1bikKQEAgLTczMiwzMCArODAxLDM1IEBAIGRvdWJsZSBBbmltYXRpb25CYXNlOjpwcm9ncmVz
cyhkb3VibGUgc2NhbGUsIGRvdWJsZSBvZmZzZXQpIGNvbnN0CiAgICAgICAgIHJldHVybiAwOwog
ICAgIAogICAgIGRvdWJsZSBkdXIgPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKTsKKyAgICBpZiAo
bV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwKQorICAgICAgICBkdXIgKj0gbV9hbmlt
YXRpb24tPml0ZXJhdGlvbkNvdW50KCk7CiAgICAgCi0gICAgaWYgKHBvc3RhY3RpdmUoKSB8fCAh
bV9hbmltYXRpb24tPmR1cmF0aW9uKCkgfHwgZWxhcHNlZFRpbWUgPj0gZHVyKQorICAgIGlmIChw
b3N0YWN0aXZlKCkgfHwgIW1fYW5pbWF0aW9uLT5kdXJhdGlvbigpIHx8IChtX2FuaW1hdGlvbi0+
aXRlcmF0aW9uQ291bnQoKSA+IDAgJiYgZWxhcHNlZFRpbWUgPj0gZHVyKSkKICAgICAgICAgcmV0
dXJuIDEuMDsKICAgICAKICAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIHRpbWUsIHRha2lu
ZyBpbnRvIGFjY291bnQgZGlyZWN0aW9uLgotICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gd29y
cnkgYWJvdXQgaXRlcmF0aW9ucywgd2UgYXNzdW1lIHRoYXQgd2Ugd291bGQgaGF2ZSAKKyAgICAv
LyBUaGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0ZXJhdGlvbnMsIHdlIGFzc3VtZSB0
aGF0IHdlIHdvdWxkIGhhdmUKICAgICAvLyBzaG9ydCBjaXJjdWl0ZWQgYWJvdmUgaWYgd2Ugd2Vy
ZSBkb25lCi0gICAgZG91YmxlIHQgPSBlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlv
bigpOwotICAgIGludCBpID0gKGludCkgdDsKLSAgICB0IC09IGk7CisgICAgZG91YmxlIGZyYWN0
aW9uYWxUaW1lID0gZWxhcHNlZFRpbWUgLyBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKTsKKyAgICBp
bnQgaW50ZWdyYWxUaW1lID0gKGludCkgZnJhY3Rpb25hbFRpbWU7CisgICAgZnJhY3Rpb25hbFRp
bWUgLT0gaW50ZWdyYWxUaW1lOworICAgIAorICAgIGlmIChtX2FuaW1hdGlvbi0+ZGlyZWN0aW9u
KCkgJiYgKGludGVncmFsVGltZSAmIDEpKQorICAgICAgICBmcmFjdGlvbmFsVGltZSA9IDEgLSBm
cmFjdGlvbmFsVGltZTsKICAgICAKICAgICBpZiAoc2NhbGUgIT0gMSB8fCBvZmZzZXQgIT0gMCkK
LSAgICAgICAgdCA9ICh0IC0gb2Zmc2V0KSAqIHNjYWxlOworICAgICAgICBmcmFjdGlvbmFsVGlt
ZSA9IChmcmFjdGlvbmFsVGltZSAtIG9mZnNldCkgKiBzY2FsZTsKICAgICAKICAgICBpZiAobV9h
bmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkudHlwZSgpID09IExpbmVhclRpbWluZ0Z1bmN0aW9u
KQotICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgcmV0dXJuIGZyYWN0aW9uYWxUaW1lOwogICAg
IAogICAgIC8vIEN1YmljIGJlemllci4KLSAgICBkb3VibGUgdHQgPSBzb2x2ZUN1YmljQmV6aWVy
RnVuY3Rpb24obV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDEoKSwgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlv
bigpLnkxKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Fu
aW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueTIoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgbV9hbmltYXRpb24tPmR1
cmF0aW9uKCkpOwotICAgIHJldHVybiB0dDsKKyAgICBkb3VibGUgcmVzdWx0ID0gc29sdmVDdWJp
Y0JlemllckZ1bmN0aW9uKG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLngxKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uLT50aW1p
bmdGdW5jdGlvbigpLnkxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLngyKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlv
bigpLnkyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZy
YWN0aW9uYWxUaW1lLCBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKIH0KIAogdm9pZCBBbmltYXRpb25CYXNlOjpwcmltZUV2ZW50VGltZXJzKCkKQEAgLTc2NSw3
ICs4MzksMTAgQEAgdm9pZCBBbmltYXRpb25CYXNlOjpwcmltZUV2ZW50VGltZXJzKCkKICAgICBj
b25zdCBkb3VibGUgZWxhcHNlZER1cmF0aW9uID0gY3QgLSBtX3N0YXJ0VGltZTsKICAgICBBU1NF
UlQoZWxhcHNlZER1cmF0aW9uID49IDApOwogICAgIAotICAgIGRvdWJsZSB0b3RhbER1cmF0aW9u
ID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7CisgICAgZG91YmxlIHRvdGFsRHVyYXRpb24gPSAt
MTsKKyAgICBpZiAobV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwKQorICAgICAgICB0
b3RhbER1cmF0aW9uID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgKiBtX2FuaW1hdGlvbi0+aXRl
cmF0aW9uQ291bnQoKTsKKwogICAgIGRvdWJsZSBkdXJhdGlvbkxlZnQgPSAwOwogICAgIGRvdWJs
ZSBuZXh0SXRlcmF0aW9uVGltZSA9IHRvdGFsRHVyYXRpb247CiAgICAgaWYgKHRvdGFsRHVyYXRp
b24gPCAwIHx8IGVsYXBzZWREdXJhdGlvbiA8IHRvdGFsRHVyYXRpb24pIHsKQEAgLTgzOSw5ICs5
MTYsOSBAQCBzdGF0aWMgaW5saW5lIFRyYW5zZm9ybU9wZXJhdGlvbnMgYmxlbmRGdW5jKGNvbnN0
IFRyYW5zZm9ybU9wZXJhdGlvbnMmIGZyb20sIGNvbgogICAgIHVuc2lnbmVkIHNpemUgPSBtYXgo
ZnJvbVNpemUsIHRvU2l6ZSk7CiAgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyByZXN1bHQ7CiAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBUcmFuc2Zvcm1P
cGVyYXRpb24qIGZyb21PcCA9IGkgPCBmcm9tU2l6ZSA/IGZyb21baV0uZ2V0KCkgOiAwOwotICAg
ICAgICBUcmFuc2Zvcm1PcGVyYXRpb24qIHRvT3AgPSBpIDwgdG9TaXplID8gdG9baV0uZ2V0KCkg
OiAwOwotICAgICAgICBUcmFuc2Zvcm1PcGVyYXRpb24qIGJsZW5kZWRPcCA9IHRvT3AgPyB0b09w
LT5ibGVuZChmcm9tT3AsIHByb2dyZXNzKSA6IGZyb21PcC0+YmxlbmQoMCwgcHJvZ3Jlc3MsIHRy
dWUpOworICAgICAgICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiBmcm9tT3AgPSBpIDwgZnJv
bVNpemUgPyBmcm9tW2ldIDogMDsKKyAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4g
dG9PcCA9IGkgPCB0b1NpemUgPyB0b1tpXSA6IDA7CisgICAgICAgIFJlZlB0cjxUcmFuc2Zvcm1P
cGVyYXRpb24+IGJsZW5kZWRPcCA9IHRvT3AgPyB0b09wLT5ibGVuZChmcm9tT3AuZ2V0KCksIHBy
b2dyZXNzKSA6IGZyb21PcC0+YmxlbmQoMCwgcHJvZ3Jlc3MsIHRydWUpOwogICAgICAgICBpZiAo
YmxlbmRlZE9wKQogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChibGVuZGVkT3ApOwogICAgIH0K
QEAgLTk0NiwzMyArMTAyMyw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCAoUmVuZGVyU3R5bGU6Oipt
X3NldHRlcikoU2hhZG93RGF0YSosIGJvb2wpOwogfTsKIAotY2xhc3MgUHJvcGVydHlXcmFwcGVy
SW50U2l6ZSA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8SW50U2l6ZT4gewotcHVibGlj
OgotICAgIFByb3BlcnR5V3JhcHBlckludFNpemUoaW50IHByb3AsIEludFNpemUgKFJlbmRlclN0
eWxlOjoqZ2V0dGVyKSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoY29uc3Qg
SW50U2l6ZSYpKQotICAgIDogUHJvcGVydHlXcmFwcGVyR2V0dGVyPEludFNpemU+KHByb3AsIGdl
dHRlcikKLSAgICAsIG1fc2V0dGVyKHNldHRlcikKLSAgICB7IH0KLSAgICAKLSAgICB2aXJ0dWFs
IGJvb2wgZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYikg
Y29uc3QKLSAgICB7Ci0gICAgICAgIEludFNpemUgc2l6ZWEgPSAoYS0+Km1fZ2V0dGVyKSgpOwot
ICAgICAgICBJbnRTaXplIHNpemViID0gKGItPiptX2dldHRlcikoKTsKLSAgICAgICAgCi0gICAg
ICAgIHJldHVybiAoc2l6ZWEgPT0gc2l6ZWIpOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIHZv
aWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJl
bmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3QKLSAgICB7Ci0gICAgICAgIEludFNpemUg
c2l6ZWEgPSAoYS0+Km1fZ2V0dGVyKSgpOwotICAgICAgICBJbnRTaXplIHNpemViID0gKGItPipt
X2dldHRlcikoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgKGRzdC0+Km1fc2V0dGVyKShi
bGVuZEZ1bmMoc2l6ZWEsIHNpemViLCBwcm9nKSk7Ci0gICAgfQotICAgIAotcHJpdmF0ZToKLSAg
ICB2b2lkIChSZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShjb25zdCBJbnRTaXplJik7Ci19OwotCiBj
bGFzcyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvciA6IHB1YmxpYyBQcm9wZXJ0eVdy
YXBwZXJCYXNlIHsKIHB1YmxpYzoKICAgICBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xv
cihpbnQgcHJvcCwgY29uc3QgQ29sb3ImIChSZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwg
dm9pZCAoUmVuZGVyU3R5bGU6OipzZXR0ZXIpKGNvbnN0IENvbG9yJikpCkBAIC0xMDMwLDcgKzEw
ODAsNyBAQCBwdWJsaWM6CiAgICAgCiAgICAgdm9pZCBzdHlsZUF2YWlsYWJsZSgpOwogICAgIAot
ICAgIGJvb2wgaXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmos
IGludCBwcm9wZXJ0eSkgY29uc3Q7CisgICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5k
ZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykg
Y29uc3Q7CiAgICAgCiAgICAgc3RhdGljIGJvb2wgcHJvcGVydGllc0VxdWFsKGludCBwcm9wLCBj
b25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpOwogICAgIHN0YXRpYyBp
bnQgZ2V0UHJvcGVydHlBdEluZGV4KGludCBpKTsKQEAgLTExMTcsMTAgKzExNjcsMTAgQEAgdm9p
ZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6ZW5zdXJlUHJvcGVydHlNYXAoKQogICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgVHJh
bnNmb3JtT3BlcmF0aW9ucyY+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtLCAmUmVuZGVyU3R5
bGU6OnRyYW5zZm9ybSwgJlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zvcm0pKTsKICAgICAgICAgZ1By
b3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5YLCAmUmVuZGVyU3R5bGU6OnRyYW5zZm9ybU9yaWdp
blgsICZSZW5kZXJTdHlsZTo6c2V0VHJhbnNmb3JtT3JpZ2luWCkpOwogICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0
eVdlYmtpdFRyYW5zZm9ybU9yaWdpblksICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWSwg
JlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zvcm1PcmlnaW5ZKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlckludFNpemUoQ1NTUHJvcGVydHlXZWJr
aXRCb3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcExlZnRSYWRpdXMs
ICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wTGVmdFJhZGl1cykpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJJbnRTaXplKENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVyVG9wUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyVG9wUmlnaHRS
YWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wUmlnaHRSYWRpdXMpKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVySW50U2l6ZShDU1NQ
cm9wZXJ0eVdlYmtpdEJvcmRlckJvdHRvbUxlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVy
Qm90dG9tTGVmdFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVz
KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
ckludFNpemUoQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRl
clN0eWxlOjpib3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJC
b3R0b21SaWdodFJhZGl1cykpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
VG9wTGVmdFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVy
U3R5bGU6OnNldEJvcmRlclRvcExlZnRSYWRpdXMpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBl
cnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlclRvcFJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFJpZ2h0
UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlclRvcFJpZ2h0UmFkaXVzKSk7CisgICAgICAg
IGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRT
aXplJj4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVzLCAmUmVuZGVyU3R5
bGU6OmJvcmRlckJvdHRvbUxlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9t
TGVmdFJhZGl1cykpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXI8Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQm90dG9t
UmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZSZW5k
ZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMpKTsKICAgICAgICAgZ1Byb3BlcnR5
V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPEVWaXNpYmlsaXR5PihDU1NQcm9w
ZXJ0eVZpc2liaWxpdHksICZSZW5kZXJTdHlsZTo6dmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjpz
ZXRWaXNpYmlsaXR5KSk7CiAgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjxmbG9hdD4oQ1NTUHJvcGVydHlab29tLCAmUmVuZGVyU3R5bGU6Onpvb20s
ICZSZW5kZXJTdHlsZTo6c2V0Wm9vbSkpOwogICAgICAgICAKQEAgLTEzMDIsMTIgKzEzNTIsMTIg
QEAgdm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YW5pbWF0aW9uVGltZXJGaXJlZChU
aW1lcjxBbmltYXRpb25Db250cm9sbGVyUHIKICAgICB1cGRhdGVBbmltYXRpb25UaW1lcigpOwog
fQogCi1ib29sIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjppc0FuaW1hdGluZ1Byb3BlcnR5
T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5KSBjb25zdAorYm9vbCBB
bmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIo
UmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0
CiB7CiAgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRpb24gPSBtX2NvbXBvc2l0ZUFuaW1h
dGlvbnMuZ2V0KG9iaik7CiAgICAgaWYgKCFhbmltYXRpb24pIHJldHVybiBmYWxzZTsKLSAgICAK
LSAgICByZXR1cm4gYW5pbWF0aW9uLT5pc0FuaW1hdGluZ1Byb3BlcnR5KHByb3BlcnR5KTsKKwor
ICAgIHJldHVybiBhbmltYXRpb24tPmlzQW5pbWF0aW5nUHJvcGVydHkocHJvcGVydHksIGlzUnVu
bmluZ05vdyk7CiB9CiAKIHZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnN1c3BlbmRB
bmltYXRpb25zKERvY3VtZW50KiBkb2N1bWVudCkKQEAgLTE0MDYsNiArMTQ1Niw3OCBAQCB2b2lk
IENvbXBvc2l0ZUFuaW1hdGlvbjo6dXBkYXRlVHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5k
ZXJlciwgUmVuZGVyU3R5bGUqCiAgICAgfQogfQogCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6
dXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJlbmRlclN0
eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSkKK3sKKyAgICAvLyBO
b3RoaW5nIHRvIGRvIGlmIHdlIGRvbid0IGhhdmUgYW55IGFuaW1hdGlvbnMsIGFuZCBkaWRuJ3Qg
aGF2ZSBhbnkgYmVmb3JlCisgICAgaWYgKG1fa2V5ZnJhbWVBbmltYXRpb25zLmlzRW1wdHkoKSAm
JiAhdGFyZ2V0U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAor
ICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlIGN1cnJlbnQgYW5kIHRhcmdldCBhbmltYXRpb25z
IGFyZSB0aGUgc2FtZQorICAgIGlmIChjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLT5oYXNB
bmltYXRpb25zKCkgJiYgdGFyZ2V0U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSAmJiAqKGN1cnJlbnRT
dHlsZS0+YW5pbWF0aW9ucygpKSA9PSAqKHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpKQorICAg
ICAgICByZXR1cm47CisgICAgICAgIAorICAgIGludCBudW1BbmltcyA9IDA7CisgICAgYm9vbCBh
bmltc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAKKyAgICAvLyBzZWUgaWYgdGhlIGxpc3RzIG1hdGNo
CisgICAgaWYgKHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpIHsKKyAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpLT5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gKCp0YXJnZXRTdHlsZS0+YW5pbWF0
aW9ucygpKVtpXS5nZXQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFhbmltLT5p
c1ZhbGlkQW5pbWF0aW9uKCkpCisgICAgICAgICAgICAgICAgYW5pbXNDaGFuZ2VkID0gdHJ1ZTsK
KyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEF0b21pY1N0cmluZyBuYW1lKGFu
aW0tPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtmQW5pbSA9
IG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldChuYW1lLmltcGwoKSk7CisgICAgICAgICAgICAgICAg
aWYgKCFrZkFuaW0gfHwgIWtmQW5pbS0+YW5pbWF0aW9uc01hdGNoKGFuaW0pKQorICAgICAgICAg
ICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKGFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8v
IGFuaW1hdGlvbnMgbWF0Y2gsIGJ1dCBwbGF5IHN0YXRlcyBtYXkgZGlmZmVyLiB1cGRhdGUgaWYg
bmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnVwZGF0ZVBsYXlTdGF0ZShh
bmltLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxheVN0YXRlUGxheWluZyk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2F2ZWQgYW5p
bWF0aW9uIHRvIHRoaXMgbmV3IG9uZSwganVzdCBpbiBjYXNlIHRoZSBwbGF5IHN0YXRlIGhhcyBj
aGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnNldEFuaW1hdGlvbihhbmlt
KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytu
dW1BbmltczsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoIWFuaW1zQ2hhbmdlZCAm
JiBtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXplKCkgIT0gbnVtQW5pbXMpCisgICAgICAgIGFuaW1z
Q2hhbmdlZCA9IHRydWU7CisKKyAgICBpZiAoIWFuaW1zQ2hhbmdlZCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gYW5pbWF0aW9ucyBoYXZlIGNoYW5nZWQsIHVwZGF0ZSB0aGUgbGlzdAorICAg
IHJlc2V0QW5pbWF0aW9ucyhyZW5kZXJlcik7CisKKyAgICBpZiAoIXRhcmdldFN0eWxlLT5hbmlt
YXRpb25zKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIGFkZCBhbGwgdGhlIG5ldyBhbmlt
YXRpb25zCisgICAgaW50IGluZGV4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRh
cmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEFu
aW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSlbaV0uZ2V0KCk7CisK
KyAgICAgICAgaWYgKCFhbmltLT5pc1ZhbGlkQW5pbWF0aW9uKCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIAorICAgICAgICAvLyBkb24ndCBib3RoZXIgYWRkaW5nIHRoZSBh
bmltYXRpb24gaWYgaXQgaGFzIG5vIGtleWZyYW1lcyBvciB3b24ndCBhbmltYXRlCisgICAgICAg
IGlmICgoYW5pbS0+ZHVyYXRpb24oKSB8fCBhbmltLT5kZWxheSgpKSAmJiBhbmltLT5pdGVyYXRp
b25Db3VudCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFuaW0tPmtleWZyYW1lTGlzdCgpLmdldCgpICYmICFhbmltLT5rZXlmcmFtZUxpc3QoKS0+aXNF
bXB0eSgpKSB7CisgICAgICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2ZhbmltID0gbmV3IEtl
eWZyYW1lQW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSksIHJlbmRlcmVyLCBp
bmRleCsrLCB0aGlzKTsKKyAgICAgICAgICAgIG1fa2V5ZnJhbWVBbmltYXRpb25zLnNldChrZmFu
aW0tPm5hbWUoKS5pbXBsKCksIGtmYW5pbSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0tleWZy
YW1lQW5pbWF0aW9uKiBDb21wb3NpdGVBbmltYXRpb246OmZpbmRLZXlmcmFtZUFuaW1hdGlvbihj
b25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAgcmV0dXJuIG1fa2V5ZnJhbWVBbmltYXRp
b25zLmdldChuYW1lLmltcGwoKSk7Cit9CisKIFJlbmRlclN0eWxlKiBDb21wb3NpdGVBbmltYXRp
b246OmFuaW1hdGUoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgUmVuZGVyU3R5bGUqIGN1cnJlbnRT
dHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQogewogICAgIFJlbmRlclN0eWxlKiByZXN1
bHRTdHlsZSA9IDA7CkBAIC0xNDI0LDkgKzE1NDYsMjYgQEAgUmVuZGVyU3R5bGUqIENvbXBvc2l0
ZUFuaW1hdGlvbjo6YW5pbWF0ZShSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBSZW5kZXJTdHlsZSog
Y3UKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIHVwZGF0ZUtleWZyYW1l
QW5pbWF0aW9ucyhyZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7CisKKyAgICAv
LyBOb3cgdGhhdCB3ZSBoYXZlIGFuaW1hdGlvbiBvYmplY3RzIHJlYWR5LCBsZXQgdGhlbSBrbm93
IGFib3V0IHRoZSBuZXcgZ29hbCBzdGF0ZS4gIFdlIHdhbnQgdGhlbQorICAgIC8vIHRvIGZpbGwg
aW4gYSBSZW5kZXJTdHlsZSomIG9ubHkgaWYgbmVlZGVkLgorICAgIGlmICh0YXJnZXRTdHlsZS0+
aGFzQW5pbWF0aW9ucygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0
U3R5bGUtPmFuaW1hdGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEFu
aW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSlbaV0uZ2V0KCk7CisK
KyAgICAgICAgICAgIGlmIChhbmltLT5pc1ZhbGlkQW5pbWF0aW9uKCkpIHsKKyAgICAgICAgICAg
ICAgICBBdG9taWNTdHJpbmcgbmFtZShhbmltLT5uYW1lKCkpOworICAgICAgICAgICAgICAgIEtl
eWZyYW1lQW5pbWF0aW9uKiBrZXlmcmFtZUFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQo
bmFtZS5pbXBsKCkpOworICAgICAgICAgICAgICAgIGlmIChrZXlmcmFtZUFuaW0pCisgICAgICAg
ICAgICAgICAgICAgIGtleWZyYW1lQW5pbS0+YW5pbWF0ZSh0aGlzLCByZW5kZXJlciwgY3VycmVu
dFN0eWxlLCB0YXJnZXRTdHlsZSwgcmVzdWx0U3R5bGUpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQogICAgIAogICAgIGNsZWFudXBGaW5pc2hlZEFuaW1hdGlvbnMocmVuZGVyZXIp
OwotICAgIAorCiAgICAgcmV0dXJuIHJlc3VsdFN0eWxlID8gcmVzdWx0U3R5bGUgOiB0YXJnZXRT
dHlsZTsKIH0KIApAQCAtMTQzOSw2ICsxNTc4LDEyIEBAIHZvaWQgQ29tcG9zaXRlQW5pbWF0aW9u
OjpzZXRBbmltYXRpbmcoYm9vbCBpbkFuaW1hdGluZykKICAgICAgICAgSW1wbGljaXRBbmltYXRp
b24qICB0cmFuc2l0aW9uID0gaXQtPnNlY29uZDsKICAgICAgICAgdHJhbnNpdGlvbi0+c2V0QW5p
bWF0aW5nKGluQW5pbWF0aW5nKTsKICAgICB9CisKKyAgICBBbmltYXRpb25OYW1lTWFwOjpjb25z
dF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAo
QW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9u
cy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlv
biogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGFuaW0tPnNldEFuaW1hdGluZyhpbkFuaW1h
dGluZyk7CisgICAgfQogfQogCiBib29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0aW5nKCkK
QEAgLTE0NDksNiArMTU5NCwxNCBAQCBib29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0aW5n
KCkKICAgICAgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi0+YW5pbWF0aW5nKCkgJiYg
dHJhbnNpdGlvbi0+cnVubmluZygpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQor
ICAgIAorICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlm
cmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyAr
K2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAg
ICAgICAgaWYgKGFuaW0gJiYgIWFuaW0tPnBhdXNlZCgpICYmIGFuaW0tPmFuaW1hdGluZygpICYm
IGFuaW0tPmFjdGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAg
cmV0dXJuIGZhbHNlOwogfQogCkBAIC0xNDYzLDYgKzE2MTYsMTYgQEAgdm9pZCBDb21wb3NpdGVB
bmltYXRpb246OnJlc2V0VHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKICAgICBt
X3RyYW5zaXRpb25zLmNsZWFyKCk7CiB9CiAKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXNl
dEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKK3sKKyAgICBBbmltYXRpb25OYW1l
TWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwor
ICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1l
QW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFt
ZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGRlbGV0ZSBhbmltOworICAg
IH0KKyAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5jbGVhcigpOworfQorCiB2b2lkIENvbXBvc2l0
ZUFuaW1hdGlvbjo6Y2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRl
cmVyKQogewogICAgIGlmIChzdXNwZW5kZWQoKSkKQEAgLTE0ODksNiArMTY1MiwzOSBAQCB2b2lk
IENvbXBvc2l0ZUFuaW1hdGlvbjo6Y2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyKQogICAgICAgICB9CiAgICAgICAgIG1fdHJhbnNpdGlvbnMucmVtb3ZlKCpp
dCk7CiAgICAgfQorCisgICAgLy8gTWFrZSBhIGxpc3Qgb2YgYW5pbWF0aW9ucyB0byBiZSBkZWxl
dGVkCisgICAgVmVjdG9yPEF0b21pY1N0cmluZ0ltcGwqPiBmaW5pc2hlZEFuaW1hdGlvbnM7Cisg
ICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5p
bWF0aW9ucy5lbmQoKTsKKworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkg
eworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAg
IGlmICghYW5pbSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYW5pbS0+cG9z
dGFjdGl2ZSgpICYmICFhbmltLT53YWl0aW5nRm9yRW5kRXZlbnQoKSkKKyAgICAgICAgICAgIGZp
bmlzaGVkQW5pbWF0aW9ucy5hcHBlbmQoYW5pbS0+bmFtZSgpLmltcGwoKSk7CisgICAgfQorICAg
IAorICAgIC8vIGRlbGV0ZSB0aGVtCisgICAgZm9yIChWZWN0b3I8QXRvbWljU3RyaW5nSW1wbCo+
OjppdGVyYXRvciBpdCA9IGZpbmlzaGVkQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBmaW5pc2hl
ZEFuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtm
YW5pbSA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldCgqaXQpOworICAgICAgICBpZiAoa2Zhbmlt
KSB7CisgICAgICAgICAgICBrZmFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKKyAgICAgICAgICAgIGRl
bGV0ZSBrZmFuaW07CisgICAgICAgIH0KKyAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMucmVt
b3ZlKCppdCk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0QW5pbWF0
aW9uU3RhcnRUaW1lKGRvdWJsZSB0KQoreworICAgIC8vIHNldCBzdGFydCB0aW1lIG9uIGFsbCBh
bmltYXRpb25zIHdhaXRpbmcgZm9yIGl0CisgICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRl
cmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKEFuaW1h
dGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVn
aW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFu
aW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3Rh
cnRUaW1lKCkpCisgICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9u
QmFzZTo6U1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIHQpOworICAgIH0KIH0KIAogdm9pZCBD
b21wb3NpdGVBbmltYXRpb246OnNldFRyYW5zaXRpb25TdGFydFRpbWUoaW50IHByb3BlcnR5LCBk
b3VibGUgdCkKQEAgLTE1MTAsMTIgKzE3MDYsMTggQEAgdm9pZCBDb21wb3NpdGVBbmltYXRpb246
OnN1c3BlbmRBbmltYXRpb25zKCkKICAgICAKICAgICBtX3N1c3BlbmRlZCA9IHRydWU7CiAKKyAg
ICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmlt
YXRpb25zLmVuZCgpOworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgewor
ICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlm
IChhbmltKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKGZhbHNlKTsKKyAgICB9
CisKICAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBt
X3RyYW5zaXRpb25zLmVuZCgpOwogICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgewogICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAg
ICAgIGlmIChhbmltICYmIGFuaW0tPmhhc1N0eWxlKCkpIHsKKyAgICAgICAgaWYgKGFuaW0gJiYg
YW5pbS0+aGFzU3R5bGUoKSkKICAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVBsYXlTdGF0ZShmYWxz
ZSk7Ci0gICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE1MjUsMTMgKzE3MjcsMTkgQEAgdm9pZCBD
b21wb3NpdGVBbmltYXRpb246OnJlc3VtZUFuaW1hdGlvbnMoKQogICAgICAgICByZXR1cm47CiAg
ICAgCiAgICAgbV9zdXNwZW5kZWQgPSBmYWxzZTsKLQorICAgIAorICAgIEFuaW1hdGlvbk5hbWVN
YXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Cisg
ICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVB
bmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1l
QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+
cGxheVN0YXRlUGxheWluZygpKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKHRy
dWUpOworICAgIH0KKyAgICAKICAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwogICAgIGZvciAoQ1NTUHJvcGVydHlU
cmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgewogICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0
LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChhbmltICYmIGFuaW0tPmhhc1N0eWxlKCkpIHsKKyAgICAg
ICAgaWYgKGFuaW0gJiYgYW5pbS0+aGFzU3R5bGUoKSkKICAgICAgICAgICAgIGFuaW0tPnVwZGF0
ZVBsYXlTdGF0ZSh0cnVlKTsKLSAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTU1NSwxMSArMTc2
MywzNyBAQCB2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0
QW5pbWF0aW9ucyhpbnQgcHJvcGVydHkpCiAgICAgfQogfQogCitzdGF0aWMgaW5saW5lIGJvb2wg
Y29tcGFyZUFuaW1hdGlvbkluZGljZXMoY29uc3QgS2V5ZnJhbWVBbmltYXRpb24qIGEsIGNvbnN0
IEtleWZyYW1lQW5pbWF0aW9uKiBiKQoreworICAgIHJldHVybiBhLT5pbmRleCgpIDwgYi0+aW5k
ZXgoKTsKK30KKwogdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnN0eWxlQXZhaWxhYmxlKCkKIHsK
ICAgICBpZiAobV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMgPT0gMCkKICAgICAgICAgcmV0dXJu
OwogICAgIAorICAgIC8vIFdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhbmltYXRpb25zIGluIHRoZSBv
cmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbgorICAgIC8vIHRoZSBzdHlsZSwgYmVjYXVzZSBv
cmRlciBtYXR0ZXJzIGZvciBhZGRpdGl2aXR5LgorICAgIFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlv
bio+IGFuaW1hdGlvbnMobV9rZXlmcmFtZUFuaW1hdGlvbnMuc2l6ZSgpKTsKKyAgICBBbmltYXRp
b25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVu
ZCgpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7
ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwor
ICAgICAgICAvLyBXZSBjYW4ndCBqdXN0IGluc2VydCBiYXNlZCBvbiBhbmltLT5pbmRleCgpIGJl
Y2F1c2UgaW52YWxpZCBhbmltYXRpb25zIGRvbid0CisgICAgICAgIC8vIG1ha2UgaXQgaW50byB0
aGUgaGFzaC4KKyAgICAgICAgYW5pbWF0aW9uc1tpKytdID0gYW5pbTsKKyAgICB9CisKKyAgICBp
ZiAoYW5pbWF0aW9ucy5zaXplKCkgPiAxKQorICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0KGFuaW1h
dGlvbnMuYmVnaW4oKSwgYW5pbWF0aW9ucy5lbmQoKSwgY29tcGFyZUFuaW1hdGlvbkluZGljZXMp
OworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBhbmltYXRpb25zLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gYW5pbWF0aW9uc1tpXTsKKyAgICAgICAg
aWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKCkpCisgICAgICAgICAg
ICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RZ
TEVfQVZBSUxBQkxFLCAtMSk7CisgICAgfQorICAgIAogICAgIENTU1Byb3BlcnR5VHJhbnNpdGlv
bnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CiAgICAgZm9y
IChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNp
dGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CiAgICAgICAgIEltcGxpY2l0QW5pbWF0
aW9uKiBhbmltID0gaXQtPnNlY29uZDsKQEAgLTE1NjgsMTkgKzE4MDIsMjYgQEAgdm9pZCBDb21w
b3NpdGVBbmltYXRpb246OnN0eWxlQXZhaWxhYmxlKCkKICAgICB9CiB9CiAKLWJvb2wgQ29tcG9z
aXRlQW5pbWF0aW9uOjppc0FuaW1hdGluZ1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3QKK2Jv
b2wgQ29tcG9zaXRlQW5pbWF0aW9uOjppc0FuaW1hdGluZ1Byb3BlcnR5KGludCBwcm9wZXJ0eSwg
Ym9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0CiB7CisgICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3Rf
aXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKEFu
aW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMu
YmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24q
IGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5pc0FuaW1hdGlu
Z1Byb3BlcnR5KHByb3BlcnR5LCBpc1J1bm5pbmdOb3cpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorICAgIAogICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CiAgICAgZm9yIChDU1NQcm9wZXJ0eVRy
YW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7CiAgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQt
PnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+aXNBbmltYXRpbmdQcm9wZXJ0eShw
cm9wZXJ0eSkpCisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPmlzQW5pbWF0aW5nUHJvcGVydHko
cHJvcGVydHksIGlzUnVubmluZ05vdykpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9
CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEltcGxpY2l0QW5pbWF0aW9uOjphbmltYXRl
KENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBj
b25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGlv
QW5pbWF0ZWRTdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVu
ZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUpCiB7CiAg
ICAgaWYgKHBhdXNlZCgpKQogICAgICAgICByZXR1cm47CkBAIC0xNTg4LDggKzE4MjksOCBAQCB2
b2lkIEltcGxpY2l0QW5pbWF0aW9uOjphbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0
aW9uLCBSZW5kZXJPYmplY3QqIHJlbgogICAgIC8vIElmIHdlIGdldCB0aGlzIGZhciBhbmQgdGhl
IGFuaW1hdGlvbiBpcyBkb25lLCBpdCBtZWFucyB3ZSBhcmUgY2xlYW5pbmcgdXAgYSBqdXN0IGZp
bmlzaGVkIGFuaW1hdGlvbi4KICAgICAvLyBJZiBzbywgc2VuZCBiYWNrIHRoZSB0YXJnZXRTdHls
ZSAoaXQgd2lsbCBnZXQgdG9zc2VkIGxhdGVyKQogICAgIGlmIChwb3N0YWN0aXZlKCkpIHsKLSAg
ICAgICAgaWYgKCFpb0FuaW1hdGVkU3R5bGUpCi0gICAgICAgICAgICBpb0FuaW1hdGVkU3R5bGUg
PSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4odGFyZ2V0U3R5bGUpOworICAgICAgICBpZiAoIWFu
aW1hdGVkU3R5bGUpCisgICAgICAgICAgICBhbmltYXRlZFN0eWxlID0gY29uc3RfY2FzdDxSZW5k
ZXJTdHlsZSo+KHRhcmdldFN0eWxlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTU5
OSwyNCArMTg0MCwxNSBAQCB2b2lkIEltcGxpY2l0QW5pbWF0aW9uOjphbmltYXRlKENvbXBvc2l0
ZUFuaW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbgogICAgIAogICAgIC8vIFJ1
biBhIGN5Y2xlIG9mIGFuaW1hdGlvbi4KICAgICAvLyBXZSBrbm93IHdlIHdpbGwgbmVlZCBhIG5l
dyByZW5kZXIgc3R5bGUsIHNvIG1ha2Ugb25lIGlmIG5lZWRlZAotICAgIGlmICghaW9BbmltYXRl
ZFN0eWxlKQotICAgICAgICBpb0FuaW1hdGVkU3R5bGUgPSBuZXcgKHJlbmRlcmVyLT5yZW5kZXJB
cmVuYSgpKSBSZW5kZXJTdHlsZSgqdGFyZ2V0U3R5bGUpOworICAgIGlmICghYW5pbWF0ZWRTdHls
ZSkKKyAgICAgICAgYW5pbWF0ZWRTdHlsZSA9IG5ldyAocmVuZGVyZXItPnJlbmRlckFyZW5hKCkp
IFJlbmRlclN0eWxlKCp0YXJnZXRTdHlsZSk7CiAgICAgCiAgICAgZG91YmxlIHByb2cgPSBwcm9n
cmVzcygxLCAwKTsKLSAgICBib29sIG5lZWRzQW5pbSA9IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2
YXRlOjpibGVuZFByb3BlcnRpZXMobV9wcm9wZXJ0eSwgaW9BbmltYXRlZFN0eWxlLCBtX2Zyb21T
dHlsZSwgbV90b1N0eWxlLCBwcm9nKTsKKyAgICBib29sIG5lZWRzQW5pbSA9IEFuaW1hdGlvbkNv
bnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3BlcnRpZXMobV9wcm9wZXJ0eSwgYW5pbWF0ZWRTdHls
ZSwgbV9mcm9tU3R5bGUsIG1fdG9TdHlsZSwgcHJvZyk7CiAgICAgaWYgKG5lZWRzQW5pbSkKICAg
ICAgICAgc2V0QW5pbWF0aW5nKCk7CiB9CiAKLWJvb2wgSW1wbGljaXRBbmltYXRpb246OnN0YXJ0
QW5pbWF0aW9uKGRvdWJsZSBiZWdpblRpbWUpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12
b2lkIEltcGxpY2l0QW5pbWF0aW9uOjplbmRBbmltYXRpb24oYm9vbCByZXNldCkKLXsKLX0KLQog
dm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6b25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRp
bWUpCiB7CiAgICAgLy8gd2UncmUgY29udmVydGluZyB0aGUgYW5pbWF0aW9uIGludG8gYSB0cmFu
c2l0aW9uIGhlcmUKQEAgLTE2MjksNyArMTg2MSw4IEBAIHZvaWQgSW1wbGljaXRBbmltYXRpb246
Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKQogCiBib29sIEltcGxpY2l0QW5p
bWF0aW9uOjpzZW5kVHJhbnNpdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5
cGUsIGRvdWJsZSBpbkVsYXBzZWRUaW1lKQogewotICAgIHJldHVybiBmYWxzZTsgLy8gZGlkbid0
IGRpc3BhdGNoIGFuIGV2ZW50CisgICAgLy8gRklYTUU6IGV2ZW50IGRpc3BhdGNoaW5nIGNvZGUg
d2lsbCBnbyBoZXJlCisgICAgcmV0dXJuIGZhbHNlOyAvLyBEaWRuJ3QgZGlzcGF0Y2ggYW4gZXZl
bnQKIH0KIAogdm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6cmVzZXQoUmVuZGVyT2JqZWN0KiByZW5k
ZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gLyogPSAwICovLCBjb25zdCBSZW5kZXJTdHls
ZSogdG8gLyogPSAwICovKQpAQCAtMTY3OSw2ICsxOTEyLDE0MiBAQCB2b2lkIEltcGxpY2l0QW5p
bWF0aW9uOjpibGVuZFByb3BlcnR5VmFsdWVJblN0eWxlKGludCBwcm9wLCBSZW5kZXJTdHlsZSog
Y3VycmVudAogICAgIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3BlcnRpZXMo
cHJvcCwgY3VycmVudFN0eWxlLCBtX2Zyb21TdHlsZSwgbV90b1N0eWxlLCBwcm9nKTsKIH0gICAg
CiAKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246OmFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiBh
bmltYXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJy
ZW50U3R5bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVu
ZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUpCit7Cisg
ICAgLy8gaWYgd2UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQsIHdlIHdpbGwgbm90IGhhdmUgYSB2YWxp
ZCBzdGFydCB0aW1lLCBzbyBqdXN0IHN0YXJ0IHRoZSBhbmltYXRpb24gaWYgbmVlZGVkCisgICAg
aWYgKGlzbmV3KCkgJiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQ
bGF5aW5nKQorICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfQU5J
TUFUSU9OLCAtMSk7CisgICAgCisgICAgLy8gSWYgd2UgZ2V0IHRoaXMgZmFyIGFuZCB0aGUgYW5p
bWF0aW9uIGlzIGRvbmUsIGl0IG1lYW5zIHdlIGFyZSBjbGVhbmluZyB1cCBhIGp1c3QgZmluaXNo
ZWQgYW5pbWF0aW9uLgorICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIHNlbmQgYmFjayB0aGUgdGFy
Z2V0U3R5bGUKKyAgICBpZiAocG9zdGFjdGl2ZSgpKSB7CisgICAgICAgIGlmICghYW5pbWF0ZWRT
dHlsZSkKKyAgICAgICAgICAgIGFuaW1hdGVkU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxl
Kj4odGFyZ2V0U3R5bGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgd2Ug
YXJlIHdhaXRpbmcgZm9yIHRoZSBzdGFydCB0aW1lciwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2Ug
dGhlIHN0eWxlIHlldAorICAgIC8vIFNwZWNpYWwgY2FzZSAtIGlmIHRoZSBkZWxheSB0aW1lIGlz
IDAsIHRoZW4gd2UgZG8gd2FudCB0byBzZXQgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZQorICAgIC8v
IGFuaW1hdGlvbiByaWdodCBhd2F5LiBUaGlzIGF2b2lkcyBhIGZsYXNoIHdoZW4gdGhlIGFuaW1h
dGlvbiBzdGFydHMKKyAgICBpZiAod2FpdGluZ1RvU3RhcnQoKSAmJiBtX2FuaW1hdGlvbi0+ZGVs
YXkoKSA+IDApCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBGSVhNRTogd2UgbmVlZCB0
byBiZSBtb3JlIGVmZmljaWVudCBhYm91dCBkZXRlcm1pbmluZyB3aGljaCBrZXlmcmFtZXMgd2Ug
YXJlIGFuaW1hdGluZyBiZXR3ZWVuLgorICAgIC8vIFdlIHNob3VsZCBjYWNoZSB0aGUgbGFzdCBw
YWlyIG9yIHNvbWV0aGluZworICAgIAorICAgIC8vIGZpbmQgdGhlIGZpcnN0IGtleQorICAgIGRv
dWJsZSBlbGFwc2VkVGltZSA9IChtX3N0YXJ0VGltZSA+IDApID8gKCghcGF1c2VkKCkgPyBjdXJy
ZW50VGltZSgpIDogbV9wYXVzZVRpbWUpIC0gbV9zdGFydFRpbWUpIDogMC4wOworICAgIGlmIChl
bGFwc2VkVGltZSA8IDAuMCkKKyAgICAgICAgZWxhcHNlZFRpbWUgPSAwLjA7CisgICAgICAgIAor
ICAgIGRvdWJsZSB0ID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgPyAoZWxhcHNlZFRpbWUgLyBt
X2FuaW1hdGlvbi0+ZHVyYXRpb24oKSkgOiAxLjA7CisgICAgaW50IGkgPSAoaW50KSB0OworICAg
IHQgLT0gaTsKKyAgICBpZiAobV9hbmltYXRpb24tPmRpcmVjdGlvbigpICYmIChpICYgMSkpCisg
ICAgICAgIHQgPSAxIC0gdDsKKworICAgIFJlbmRlclN0eWxlKiBmcm9tU3R5bGUgPSAwOworICAg
IFJlbmRlclN0eWxlKiB0b1N0eWxlID0gMDsKKyAgICBkb3VibGUgc2NhbGUgPSAxLjA7CisgICAg
ZG91YmxlIG9mZnNldCA9IDAuMDsKKyAgICBpZiAobV9rZXlmcmFtZXMuZ2V0KCkpIHsKKyAgICAg
ICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1l
cy0+ZW5kS2V5ZnJhbWVzKCk7CisgICAgICAgIGZvciAoVmVjdG9yPEtleWZyYW1lVmFsdWU+Ojpj
b25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpbktleWZyYW1lcygpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKKyAgICAgICAgICAgIGlmICh0IDwgaXQtPmtleSkgeworICAgICAgICAgICAg
ICAgIC8vIFRoZSBmaXJzdCBrZXkgc2hvdWxkIGFsd2F5cyBiZSAwLCBzbyB3ZSBzaG91bGQgbmV2
ZXIgc3VjY2VlZCBvbiB0aGUgZmlyc3Qga2V5CisgICAgICAgICAgICAgICAgaWYgKCFmcm9tU3R5
bGUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHNjYWxlID0g
MS4wIC8gKGl0LT5rZXkgLSBvZmZzZXQpOworICAgICAgICAgICAgICAgIHRvU3R5bGUgPSBjb25z
dF9jYXN0PFJlbmRlclN0eWxlKj4oJihpdC0+c3R5bGUpKTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb2Zmc2V0ID0gaXQt
PmtleTsKKyAgICAgICAgICAgIGZyb21TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPigm
KGl0LT5zdHlsZSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIGlmIGVpdGhlciBz
dHlsZSBpcyAwIHdlIGhhdmUgYW4gaW52YWxpZCBjYXNlLCBqdXN0IHN0b3AgdGhlIGFuaW1hdGlv
bgorICAgIGlmICghZnJvbVN0eWxlIHx8ICF0b1N0eWxlKSB7CisgICAgICAgIHVwZGF0ZVN0YXRl
TWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OLCAtMSk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgCisgICAgLy8gcnVuIGEgY3ljbGUgb2YgYW5pbWF0aW9uLgorICAgIC8vIFdl
IGtub3cgd2Ugd2lsbCBuZWVkIGEgbmV3IHJlbmRlciBzdHlsZSwgc28gbWFrZSBvbmUgaWYgbmVl
ZGVkCisgICAgaWYgKCFhbmltYXRlZFN0eWxlKQorICAgICAgICBhbmltYXRlZFN0eWxlID0gbmV3
IChyZW5kZXJlci0+cmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKnRhcmdldFN0eWxlKTsKKyAg
ICAKKyAgICBkb3VibGUgcHJvZyA9IHByb2dyZXNzKHNjYWxlLCBvZmZzZXQpOworCisgICAgSGFz
aFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGll
cygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJh
bWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGlmIChB
bmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YmxlbmRQcm9wZXJ0aWVzKCppdCwgYW5pbWF0ZWRT
dHlsZSwgZnJvbVN0eWxlLCB0b1N0eWxlLCBwcm9nKSkKKyAgICAgICAgICAgIHNldEFuaW1hdGlu
ZygpOworICAgIH0KK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6ZW5kQW5pbWF0aW9uKGJv
b2wgcmVzZXQpCit7CisgICAgaWYgKG1fb2JqZWN0KSB7CisgICAgICAgIC8vIHJlc3RvcmUgdGhl
IG9yaWdpbmFsICh1bmFuaW1hdGVkKSBzdHlsZQorICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0
LT5lbGVtZW50KCkpOworICAgIH0KK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6b25Bbmlt
YXRpb25TdGFydChkb3VibGUgaW5FbGFwc2VkVGltZSkKK3sKKyAgICBzZW5kQW5pbWF0aW9uRXZl
bnQoRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCwgaW5FbGFwc2VkVGltZSk7
Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uSXRlcmF0aW9uKGRvdWJs
ZSBpbkVsYXBzZWRUaW1lKQoreworICAgIHNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3
ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVudCwgaW5FbGFwc2VkVGltZSk7Cit9CisKK3ZvaWQg
S2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKQor
eworICAgIC8vIEZJWE1FOiBzZXQgdGhlIHVuYW5pbWF0ZWQgc3R5bGUgb24gdGhlIGVsZW1lbnQK
KyAgICBpZiAoIXNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25F
bmRFdmVudCwgaW5FbGFwc2VkVGltZSkpIHsKKyAgICAgICAgLy8gd2UgZGlkbid0IGRpc3BhdGNo
IGFuIGV2ZW50LCB3aGljaCB3b3VsZCBjYWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3ZSdsbCBqdXN0
IGVuZAorICAgICAgICAvLyBpdCBoZXJlLgorICAgICAgICBlbmRBbmltYXRpb24odHJ1ZSk7Cisg
ICAgfQorfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9uOjpzZW5kQW5pbWF0aW9uRXZlbnQoY29u
c3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpCit7Cisg
ICAgLy8gRklYTUU6IEV2ZW50IGRpc3BhdGNoIGdvZXMgaGVyZQorICAgIHJldHVybiBmYWxzZTsg
Ly8gZGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246
Om92ZXJyaWRlQW5pbWF0aW9ucygpCit7CisgICAgLy8gdGhpcyB3aWxsIG92ZXJyaWRlIGltcGxp
Y2l0IGFuaW1hdGlvbnMgdGhhdCBtYXRjaCB0aGUgcHJvcGVydGllcyBpbiB0aGUga2V5ZnJhbWUg
YW5pbWF0aW9uCisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZy
YW1lcy0+ZW5kUHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0
KQorICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlv
bnMoKml0KTsKK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFu
aW1hdGlvbnMoKQoreworICAgIC8vIHRoaXMgd2lsbCByZXN1bWUgb3ZlcnJpZGRlbiBpbXBsaWNp
dCBhbmltYXRpb25zCisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tl
eWZyYW1lcy0+ZW5kUHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyAr
K2l0KQorICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+cmVzdW1lT3ZlcnJpZGRlbkltcGxp
Y2l0QW5pbWF0aW9ucygqaXQpOworfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9uOjphZmZlY3Rz
UHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAoreworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhh
c2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0
aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoKCppdCkgPT0gcHJvcGVydHkp
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQor
CiBBbmltYXRpb25Db250cm9sbGVyOjpBbmltYXRpb25Db250cm9sbGVyKEZyYW1lKiBmcmFtZSkK
IDogbV9kYXRhKG5ldyBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZShmcmFtZSkpCiB7CkBAIC0x
NzA3LDcgKzIwNzYsOCBAQCBSZW5kZXJTdHlsZSogQW5pbWF0aW9uQ29udHJvbGxlcjo6dXBkYXRl
QW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBSZW5kZQogICAgIAogICAgIFJlbmRl
clN0eWxlKiBvbGRTdHlsZSA9IHJlbmRlcmVyLT5zdHlsZSgpOwogICAgIAotICAgIGlmICgoIW9s
ZFN0eWxlIHx8ICFvbGRTdHlsZS0+dHJhbnNpdGlvbnMoKSkgJiYgIW5ld1N0eWxlLT50cmFuc2l0
aW9ucygpKQorICAgIGlmICgoIW9sZFN0eWxlIHx8ICghb2xkU3R5bGUtPmFuaW1hdGlvbnMoKSAm
JiAhb2xkU3R5bGUtPnRyYW5zaXRpb25zKCkpKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICghbmV3U3R5bGUtPmFuaW1hdGlvbnMoKSAmJiAhbmV3U3R5bGUtPnRyYW5zaXRpb25zKCkpKQog
ICAgICAgICByZXR1cm4gbmV3U3R5bGU7CiAgICAgCiAgICAgUmVuZGVyU3R5bGUqIGJsZW5kZWRT
dHlsZSA9IG5ld1N0eWxlOwpAQCAtMTczMyw5ICsyMTAzLDIxIEBAIFJlbmRlclN0eWxlKiBBbmlt
YXRpb25Db250cm9sbGVyOjp1cGRhdGVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIs
IFJlbmRlCiAgICAgcmV0dXJuIGJsZW5kZWRTdHlsZTsKIH0KIAotYm9vbCBBbmltYXRpb25Db250
cm9sbGVyOjppc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwg
aW50IHByb3BlcnR5KSBjb25zdAordm9pZCBBbmltYXRpb25Db250cm9sbGVyOjpzZXRBbmltYXRp
b25TdGFydFRpbWUoUmVuZGVyT2JqZWN0KiBvYmosIGRvdWJsZSB0KQoreworICAgIENvbXBvc2l0
ZUFuaW1hdGlvbiogcmVuZGVyZXJBbmltYXRpb25zID0gbV9kYXRhLT5hY2Nlc3NDb21wb3NpdGVB
bmltYXRpb24ob2JqKTsKKyAgICByZW5kZXJlckFuaW1hdGlvbnMtPnNldEFuaW1hdGlvblN0YXJ0
VGltZSh0KTsKK30KKwordm9pZCBBbmltYXRpb25Db250cm9sbGVyOjpzZXRUcmFuc2l0aW9uU3Rh
cnRUaW1lKFJlbmRlck9iamVjdCogb2JqLCBpbnQgcHJvcGVydHksIGRvdWJsZSB0KQoreworICAg
IENvbXBvc2l0ZUFuaW1hdGlvbiogcmVuZGVyZXJBbmltYXRpb25zID0gbV9kYXRhLT5hY2Nlc3ND
b21wb3NpdGVBbmltYXRpb24ob2JqKTsKKyAgICByZW5kZXJlckFuaW1hdGlvbnMtPnNldFRyYW5z
aXRpb25TdGFydFRpbWUocHJvcGVydHksIHQpOworfQorCitib29sIEFuaW1hdGlvbkNvbnRyb2xs
ZXI6OmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBpbnQg
cHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBjb25zdAogewotICAgIHJldHVybiBtX2RhdGEt
PmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKG9iaiwgcHJvcGVydHkpOworICAgIHJldHVy
biBtX2RhdGEtPmlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKG9iaiwgcHJvcGVydHksIGlz
UnVubmluZ05vdyk7CiB9CiAKIHZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c3VzcGVuZEFuaW1h
dGlvbnMoRG9jdW1lbnQqIGRvY3VtZW50KQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wYWdlL0FuaW1h
dGlvbkNvbnRyb2xsZXIuaCBiL1dlYkNvcmUvcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmgKaW5k
ZXggOTBjNDlkOS4uMmI5Mjc3NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNv
bnRyb2xsZXIuaAorKysgYi9XZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5oCkBAIC00
OCw3ICs0OCwxMCBAQCBwdWJsaWM6CiAgICAgdm9pZCBjYW5jZWxBbmltYXRpb25zKFJlbmRlck9i
amVjdCopOwogICAgIFJlbmRlclN0eWxlKiB1cGRhdGVBbmltYXRpb25zKFJlbmRlck9iamVjdCos
IFJlbmRlclN0eWxlKiBuZXdTdHlsZSk7CiAgICAgCi0gICAgYm9vbCBpc0FuaW1hdGluZ1Byb3Bl
cnR5T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5KSBjb25zdDsKKyAg
ICB2b2lkIHNldEFuaW1hdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgZG91YmxlIHQp
OworICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgaW50
IHByb3BlcnR5LCBkb3VibGUgdCk7CisgICAgCisgICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5
T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBib29sIGlzUnVubmlu
Z05vdykgY29uc3Q7CiAgICAgCiAgICAgdm9pZCBzdXNwZW5kQW5pbWF0aW9ucyhEb2N1bWVudCog
ZG9jdW1lbnQpOwogICAgIHZvaWQgcmVzdW1lQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQp
OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcCBiL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKaW5kZXggYjY5MjJlMS4uMTI3OGFmYSAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAorKysgYi9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCkBAIC0yMTU1LDcgKzIxNTUsNyBAQCB2b2lkIFJl
bmRlck9iamVjdDo6aGFuZGxlRHluYW1pY0Zsb2F0UG9zaXRpb25DaGFuZ2UoKQogCiB2b2lkIFJl
bmRlck9iamVjdDo6c2V0QW5pbWF0YWJsZVN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSkKIHsKLSAg
ICBpZiAoIWlzVGV4dCgpICYmIG1fc3R5bGUgJiYgc3R5bGUpCisgICAgaWYgKCFpc1RleHQoKSAm
JiBzdHlsZSkKICAgICAgICAgc3R5bGUgPSBhbmltYXRpb24oKS0+dXBkYXRlQW5pbWF0aW9ucyh0
aGlzLCBzdHlsZSk7CiAKICAgICBzZXRTdHlsZShzdHlsZSk7CmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5oIGIvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUv
UmVuZGVyU3R5bGUuaAppbmRleCBmYWVkYmM1Li4zNmUwMDE1IDEwMDY0NAotLS0gYS9XZWJDb3Jl
L3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5oCisrKyBiL1dlYkNvcmUvcmVuZGVyaW5nL3N0
eWxlL1JlbmRlclN0eWxlLmgKQEAgLTE5MTMsMTAgKzE5MTMsMTAgQEAgcHVibGljOgogCiAgICAg
Y29uc3QgTmluZVBpZWNlSW1hZ2UmIGJvcmRlckltYWdlKCkgY29uc3QgeyByZXR1cm4gc3Vycm91
bmQtPmJvcmRlci5pbWFnZTsgfQogCi0gICAgSW50U2l6ZSBib3JkZXJUb3BMZWZ0UmFkaXVzKCkg
Y29uc3QgeyByZXR1cm4gc3Vycm91bmQtPmJvcmRlci50b3BMZWZ0OyB9Ci0gICAgSW50U2l6ZSBi
b3JkZXJUb3BSaWdodFJhZGl1cygpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIudG9w
UmlnaHQ7IH0KLSAgICBJbnRTaXplIGJvcmRlckJvdHRvbUxlZnRSYWRpdXMoKSBjb25zdCB7IHJl
dHVybiBzdXJyb3VuZC0+Ym9yZGVyLmJvdHRvbUxlZnQ7IH0KLSAgICBJbnRTaXplIGJvcmRlckJv
dHRvbVJpZ2h0UmFkaXVzKCkgY29uc3QgeyByZXR1cm4gc3Vycm91bmQtPmJvcmRlci5ib3R0b21S
aWdodDsgfQorICAgIGNvbnN0IEludFNpemUmIGJvcmRlclRvcExlZnRSYWRpdXMoKSBjb25zdCB7
IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLnRvcExlZnQ7IH0KKyAgICBjb25zdCBJbnRTaXplJiBi
b3JkZXJUb3BSaWdodFJhZGl1cygpIGNvbnN0IHsgcmV0dXJuIHN1cnJvdW5kLT5ib3JkZXIudG9w
UmlnaHQ7IH0KKyAgICBjb25zdCBJbnRTaXplJiBib3JkZXJCb3R0b21MZWZ0UmFkaXVzKCkgY29u
c3QgeyByZXR1cm4gc3Vycm91bmQtPmJvcmRlci5ib3R0b21MZWZ0OyB9CisgICAgY29uc3QgSW50
U2l6ZSYgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMoKSBjb25zdCB7IHJldHVybiBzdXJyb3VuZC0+
Ym9yZGVyLmJvdHRvbVJpZ2h0OyB9CiAgICAgYm9vbCBoYXNCb3JkZXJSYWRpdXMoKSBjb25zdCB7
IHJldHVybiBzdXJyb3VuZC0+Ym9yZGVyLmhhc0JvcmRlclJhZGl1cygpOyB9CiAKICAgICB1bnNp
Z25lZCBzaG9ydCAgYm9yZGVyTGVmdFdpZHRoKCkgY29uc3QgeyByZXR1cm4gc3Vycm91bmQtPmJv
cmRlci5ib3JkZXJMZWZ0V2lkdGgoKTsgfQo=
</data>
<flag name="review"
          id="10060"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>