<?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>136523</bug_id>
          
          <creation_ts>2014-09-03 23:26:32 -0700</creation_ts>
          <short_desc>Crash in GMainLoopSource when destroying the object during callback dispatch</short_desc>
          <delta_ts>2014-09-18 00:01:48 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>135800</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Zan Dobersek">zan</reporter>
          <assigned_to name="Zan Dobersek">zan</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cgarcia</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1033142</commentid>
    <comment_count>0</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2014-09-03 23:26:32 -0700</bug_when>
    <thetext>Crash in GMainLoopSource when destroying the object during callback dispatch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1033147</commentid>
    <comment_count>1</comment_count>
      <attachid>237612</attachid>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2014-09-03 23:40:18 -0700</bug_when>
    <thetext>Created attachment 237612
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1033149</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-09-03 23:42:16 -0700</bug_when>
    <thetext>Attachment 237612 did not pass style-queue:


ERROR: Source/WTF/wtf/gobject/GMainLoopSource.h:77:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/WTF/wtf/gobject/GMainLoopSource.cpp:334:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:47:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 3 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1033158</commentid>
    <comment_count>3</comment_count>
      <attachid>237612</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2014-09-04 00:24:41 -0700</bug_when>
    <thetext>Comment on attachment 237612
Patch

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

&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:79
&gt; +    if (m_cancellable)
&gt; +        g_cancellable_cancel(m_cancellable.get());

g_cancellable_cancel is null safe, so we can avoid the if.

&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:94
&gt; -    if (context.cancellable)
&gt; -        g_cancellable_cancel(context.cancellable.get());
&gt; +    if (context.socketCancellable)
&gt; +        g_cancellable_cancel(context.socketCancellable.get());

And we can do it here too.

&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:224
&gt; +    if (g_cancellable_is_cancelled(context.cancellable.get())) {
&gt; +        dispatchDestroyCallback(context.destroyCallback);
&gt; +        return;
&gt; +    }

Why only dispatch? we also want to delete the object in case of delete on destroy.

&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:260
&gt; +    if (g_cancellable_is_cancelled(context.cancellable.get())) {
&gt; +        dispatchDestroyCallback(context.destroyCallback);
&gt; +        return Stop;
&gt; +    }

Ditto.

&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:338
&gt; +void GMainLoopSource::dispatchDestroyCallback(const std::function&lt;void ()&gt;&amp; destroyCallback)
&gt; +{
&gt; +    if (destroyCallback)
&gt; +        destroyCallback();
&gt; +}

I&apos;m not sure I understand why we would want to do this instead of destroy().

&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:46
&gt; +        g_timeout_add(250,

Why 250?

&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:181
&gt; +            context.test.source().cancel();

Why not finishing the loop here?

&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:185
&gt; +    context.test.delayedFinish();

What&apos;s the delayed finish for? To prevent a timeout?

&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:245
&gt; +                context.test.source().cancel();

Ditto.

&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:264
&gt; +                    context.test.source().cancel();

Ditto.

&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:303
&gt; +                // Should not be called.
&gt; +                context.firstDestroyCallbackCalled = true;

I don&apos;t think this is right. The destroy callback is not for the GMainLoopSource object, but for the glib source. The only case where the destroy is not called is when the source is cancelled before being scheduled (that&apos;s the reason of the early return in cancel when the source is NULL). This is not actually a re-schedule, but a new source using the same GMainLoopSource.

&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:331
&gt; +                // Should not be called.
&gt; +                context.firstDestroyCallbackCalled = true;

Same here. We are only testing cancellation during dispatch, but there are at least 3 more cases of cancellation that it would be good to test as well.

 - Cancel before scheduling. This is what happens in every cancel() called from schedule methods the first time. It should do nothing since there&apos;s no active source, so no destroy either.
 - Cancel once scheduled, but before dispatched. The callback should not be called, the source is destroyed and the destroy should be dispatched. This is already covered by cancel(), because the move to the context hasn&apos;t happened and m_context.source is a valid pointer.
 - Cancel once dispatched, but before finished. That&apos;s what this patch is about. The ongoing source should be destroyed (the glib source is destroyed by the callbacks returning Stop), and destroy should happen.
 - Cancel after source is destroyed. This should be the same than the first case, nothing should happen.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1033162</commentid>
    <comment_count>4</comment_count>
      <attachid>237612</attachid>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2014-09-04 00:48:24 -0700</bug_when>
    <thetext>Comment on attachment 237612
Patch

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

&gt;&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:79
&gt;&gt; +        g_cancellable_cancel(m_cancellable.get());
&gt; 
&gt; g_cancellable_cancel is null safe, so we can avoid the if.

OK.

&gt;&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:94
&gt;&gt; +        g_cancellable_cancel(context.socketCancellable.get());
&gt; 
&gt; And we can do it here too.

OK.

&gt;&gt; Source/WTF/wtf/gobject/GMainLoopSource.cpp:224
&gt;&gt; +    }
&gt; 
&gt; Why only dispatch? we also want to delete the object in case of delete on destroy.

Right, another special case.

The original crash was caused because GMainLoopSource was being deleted during the callback dispatch. Calling ::destroy() under that condition here would just repeat the problem since you&apos;d again operate on a destroyed object.

&gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:46
&gt;&gt; +        g_timeout_add(250,
&gt; 
&gt; Why 250?

Arbitrary, it should be enough for all the tasks on the main context to be dispatched.

&gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:181
&gt;&gt; +            context.test.source().cancel();
&gt; 
&gt; Why not finishing the loop here?

To avoid having the tested code controlling its own harness.

Basically we&apos;d just like for the callback to only cancel itself, not to finish the test ...

&gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:185
&gt;&gt; +    context.test.delayedFinish();
&gt; 
&gt; What&apos;s the delayed finish for? To prevent a timeout?

... which is done here, after a quarter of a second.

&gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:303
&gt;&gt; +                context.firstDestroyCallbackCalled = true;
&gt; 
&gt; I don&apos;t think this is right. The destroy callback is not for the GMainLoopSource object, but for the glib source. The only case where the destroy is not called is when the source is cancelled before being scheduled (that&apos;s the reason of the early return in cancel when the source is NULL). This is not actually a re-schedule, but a new source using the same GMainLoopSource.

OK, understood.

&gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:331
&gt;&gt; +                context.firstDestroyCallbackCalled = true;
&gt; 
&gt; Same here. We are only testing cancellation during dispatch, but there are at least 3 more cases of cancellation that it would be good to test as well.
&gt; 
&gt;  - Cancel before scheduling. This is what happens in every cancel() called from schedule methods the first time. It should do nothing since there&apos;s no active source, so no destroy either.
&gt;  - Cancel once scheduled, but before dispatched. The callback should not be called, the source is destroyed and the destroy should be dispatched. This is already covered by cancel(), because the move to the context hasn&apos;t happened and m_context.source is a valid pointer.
&gt;  - Cancel once dispatched, but before finished. That&apos;s what this patch is about. The ongoing source should be destroyed (the glib source is destroyed by the callbacks returning Stop), and destroy should happen.
&gt;  - Cancel after source is destroyed. This should be the same than the first case, nothing should happen.

OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1033163</commentid>
    <comment_count>5</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2014-09-04 00:59:10 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 237612 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=237612&amp;action=review
&gt; 

&gt; &gt; Why only dispatch? we also want to delete the object in case of delete on destroy.
&gt; 
&gt; Right, another special case.
&gt; 
&gt; The original crash was caused because GMainLoopSource was being deleted during the callback dispatch. Calling ::destroy() under that condition here would just repeat the problem since you&apos;d again operate on a destroyed object.

That&apos;s also why we called cancel() in the destructor (that ensured destroy happened before the object is destroyed, this is probably another case to test since you are not checking that the destroy callback is called in DestructionDuringDispatch, I think) and destroy() was the last thing done in all callbacks.

&gt; &gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:46
&gt; &gt;&gt; +        g_timeout_add(250,
&gt; &gt; 
&gt; &gt; Why 250?
&gt; 
&gt; Arbitrary, it should be enough for all the tasks on the main context to be dispatched.
&gt; 
&gt; &gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:181
&gt; &gt;&gt; +            context.test.source().cancel();
&gt; &gt; 
&gt; &gt; Why not finishing the loop here?
&gt; 
&gt; To avoid having the tested code controlling its own harness.

Isn&apos;t that what the other tests do?

&gt; Basically we&apos;d just like for the callback to only cancel itself, not to finish the test ...
&gt; 
&gt; &gt;&gt; Tools/TestWebKitAPI/Tests/WTF/gobject/GMainLoopSource.cpp:185
&gt; &gt;&gt; +    context.test.delayedFinish();
&gt; &gt; 
&gt; &gt; What&apos;s the delayed finish for? To prevent a timeout?
&gt; 
&gt; ... which is done here, after a quarter of a second.
&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1033788</commentid>
    <comment_count>6</comment_count>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2014-09-08 01:09:54 -0700</bug_when>
    <thetext>I&apos;ll incorporate these changes and the reviewing feedback in bug #135800 which was reopened after rolling out the original patch in r173267.
http://trac.webkit.org/changeset/173267

*** This bug has been marked as a duplicate of bug 135800 ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1035852</commentid>
    <comment_count>7</comment_count>
      <attachid>237612</attachid>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2014-09-18 00:01:48 -0700</bug_when>
    <thetext>Comment on attachment 237612
Patch

Clearing the review flags.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>237612</attachid>
            <date>2014-09-03 23:40:18 -0700</date>
            <delta_ts>2014-09-18 00:01:47 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-136523-20140903234011.patch</filename>
            <type>text/plain</type>
            <size>16402</size>
            <attacher name="Zan Dobersek">zan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTczMjAxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IDNhOGRkN2M5MDM2NDIxNTdkNWQwMzA4
MTcxMzZiODg0YjA5ZjU1NzAuLmRlZTljNTZiZWNlZWUwMTc4NGNiM2VmYzRiMzQxYjBkZWZkZmM5
YzkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDUgKzEsMzkgQEAKIDIwMTQtMDktMDMgIFphbiBEb2JlcnNlayAgPHpkb2Jl
cnNla0BpZ2FsaWEuY29tPgogCisgICAgICAgIENyYXNoIGluIEdNYWluTG9vcFNvdXJjZSB3aGVu
IGRlc3Ryb3lpbmcgdGhlIG9iamVjdCBkdXJpbmcgY2FsbGJhY2sgZGlzcGF0Y2gKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjUyMworCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBsYWNlIGEgR1JlZlB0cjxH
Q2FuY2VsbGFibGU+IG9uIHRoZSBHTWFpbkxvb3BTb3VyY2UgYW5kIHRoZSBDb250ZXh0IHN0cnVj
dCwKKyAgICAgICAgYm90aCBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEdDYW5jZWxs
YWJsZSBvYmplY3QgZHVyaW5nIGNhbGxiYWNrCisgICAgICAgIGRpc3BhdGNoIHRoYXQgaXMgY2Fu
Y2VsZWQgd2hlbiB0aGUgY2FuY2VsKCkgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUKKyAgICAgICAg
R01haW5Mb29wU291cmNlIG9iamVjdC4KKworICAgICAgICBUaGlzIG1pZ2h0IGhhcHBlbiBkdXJp
bmcgR01haW5Mb29wU291cmNlIGRlc3RydWN0aW9uIGFuZCBwcmV2ZW50cyB0aGUKKyAgICAgICAg
OjoqQ2FsbGJhY2soKSBtZXRob2RzIGZyb20gY29udGludWluZyB0byBsb2NrIGEgbXV0ZXggdGhh
dCB3YXMgYWxyZWFkeSBjbGVhcmVkLgorICAgICAgICBVc2luZyBhIEdDYW5jZWxsYWJsZSB0aGlz
IHdheSBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIGZvciByZXBlYXRpbmcgY2FsbGJhY2tzCisgICAg
ICAgIHRvIHByb3Blcmx5IGRlc3Ryb3kgdGhlaXIgc291cmNlIGFuZCBzdG9wIHJlcGVhdGluZyBv
bmNlIDo6Y2FuY2VsKCkgd2FzIGNhbGxlZC4KKworICAgICAgICBUaGUgZGVzdHJveSBjYWxsYmFj
ayBpcyBub3cgYWxzbyBwcm9wZXJseSBkaXNwYXRjaGVkIGlmIHRoZSBHTWFpbkxvb3BTb3VyY2UK
KyAgICAgICAgb2JqZWN0IHdhcyBjYW5jZWxlZCBkdXJpbmcgZGlzcGF0Y2guCisKKyAgICAgICAg
VGhlIHNvY2tldC1zcGVjaWZpYyBHQ2FuY2VsbGFibGUgb24gdGhlIENvbnRleHQgc3RydWN0IGlz
IHJlbmFtZWQgdG8KKyAgICAgICAgc29ja2V0Q2FuY2VsbGFibGUuCisKKyAgICAgICAgKiB3dGYv
Z29iamVjdC9HTWFpbkxvb3BTb3VyY2UuY3BwOgorICAgICAgICAoV1RGOjpHTWFpbkxvb3BTb3Vy
Y2U6OmNhbmNlbCk6CisgICAgICAgIChXVEY6OkdNYWluTG9vcFNvdXJjZTo6Y2FuY2VsV2l0aG91
dExvY2tpbmcpOgorICAgICAgICAoV1RGOjpHTWFpbkxvb3BTb3VyY2U6OnNjaGVkdWxlKToKKyAg
ICAgICAgKFdURjo6R01haW5Mb29wU291cmNlOjp2b2lkQ2FsbGJhY2spOgorICAgICAgICAoV1RG
OjpHTWFpbkxvb3BTb3VyY2U6OmJvb2xDYWxsYmFjayk6CisgICAgICAgIChXVEY6OkdNYWluTG9v
cFNvdXJjZTo6c29ja2V0Q2FsbGJhY2spOgorICAgICAgICAoV1RGOjpHTWFpbkxvb3BTb3VyY2U6
OmRlc3Ryb3kpOgorICAgICAgICAoV1RGOjpHTWFpbkxvb3BTb3VyY2U6OmRpc3BhdGNoRGVzdHJv
eUNhbGxiYWNrKToKKyAgICAgICAgKiB3dGYvZ29iamVjdC9HTWFpbkxvb3BTb3VyY2UuaDoKKwor
MjAxNC0wOS0wMyAgWmFuIERvYmVyc2VrICA8emRvYmVyc2VrQGlnYWxpYS5jb20+CisKICAgICAg
ICAgR01haW5Mb29wU291cmNlIGlzIGV4cG9zZWQgdG8gcmFjZSBjb25kaXRpb25zCiAgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzU4MDAKIApkaWZmIC0t
Z2l0IGEvU291cmNlL1dURi93dGYvZ29iamVjdC9HTWFpbkxvb3BTb3VyY2UuY3BwIGIvU291cmNl
L1dURi93dGYvZ29iamVjdC9HTWFpbkxvb3BTb3VyY2UuY3BwCmluZGV4IDgyMjc3ZjhjNGY5MTI4
NTkwODExNTJjNDExMTcyMTMwNTcyYzAzNTQuLmQyZGViOTJjNjgyZDFlYzllZjcwM2JmZDEzZjM2
NmMwZmE2YTY1OWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL2dvYmplY3QvR01haW5Mb29w
U291cmNlLmNwcAorKysgYi9Tb3VyY2UvV1RGL3d0Zi9nb2JqZWN0L0dNYWluTG9vcFNvdXJjZS5j
cHAKQEAgLTcxLDYgKzcxLDEzIEBAIGJvb2wgR01haW5Mb29wU291cmNlOjppc0FjdGl2ZSgpIGNv
bnN0CiB2b2lkIEdNYWluTG9vcFNvdXJjZTo6Y2FuY2VsKCkKIHsKICAgICBHTXV0ZXhMb2NrZXIg
bG9ja2VyKG1fbXV0ZXgpOworCisgICAgLy8gVGhlIHNvdXJjZSBtaWdodCBiZSBiZWluZyBjYW5j
ZWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBjYWxsYmFjayBkaXNwYXRjaC4KKyAgICAvLyBDYW5jZWxs
aW5nIHRoaXMgR0NhbmNlbGxhYmxlIG9iamVjdCB3aWxsIGNvbnZlcnkgdGhpcyBpbmZvcm1hdGlv
biB0bworICAgIC8vIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IHdoZW4gdGhlIGNhbGxi
YWNrIGRpc3BhdGNoIGlzIGZpbmlzaGVkLgorICAgIGlmIChtX2NhbmNlbGxhYmxlKQorICAgICAg
ICBnX2NhbmNlbGxhYmxlX2NhbmNlbChtX2NhbmNlbGxhYmxlLmdldCgpKTsKKwogICAgIGNhbmNl
bFdpdGhvdXRMb2NraW5nKCk7CiB9CiAKQEAgLTgzLDggKzkwLDggQEAgdm9pZCBHTWFpbkxvb3BT
b3VyY2U6OmNhbmNlbFdpdGhvdXRMb2NraW5nKCkKIAogICAgIENvbnRleHQgY29udGV4dCA9IFdU
Rjo6bW92ZShtX2NvbnRleHQpOwogCi0gICAgaWYgKGNvbnRleHQuY2FuY2VsbGFibGUpCi0gICAg
ICAgIGdfY2FuY2VsbGFibGVfY2FuY2VsKGNvbnRleHQuY2FuY2VsbGFibGUuZ2V0KCkpOworICAg
IGlmIChjb250ZXh0LnNvY2tldENhbmNlbGxhYmxlKQorICAgICAgICBnX2NhbmNlbGxhYmxlX2Nh
bmNlbChjb250ZXh0LnNvY2tldENhbmNlbGxhYmxlLmdldCgpKTsKIAogICAgIGdfc291cmNlX2Rl
c3Ryb3koY29udGV4dC5zb3VyY2UuZ2V0KCkpOwogICAgIGRlc3Ryb3koY29udGV4dC5kZXN0cm95
Q2FsbGJhY2spOwpAQCAtMTMwLDggKzEzNyw4IEBAIHZvaWQgR01haW5Mb29wU291cmNlOjpzY2hl
ZHVsZShjb25zdCBjaGFyKiBuYW1lLCBzdGQ6OmZ1bmN0aW9uPGJvb2wgKEdJT0NvbmRpdGlvCiAK
ICAgICBtX2NvbnRleHQuc29ja2V0Q2FsbGJhY2sgPSBXVEY6Om1vdmUoZnVuY3Rpb24pOwogICAg
IG1fY29udGV4dC5kZXN0cm95Q2FsbGJhY2sgPSBXVEY6Om1vdmUoZGVzdHJveUZ1bmN0aW9uKTsK
LSAgICBtX2NvbnRleHQuY2FuY2VsbGFibGUgPSBhZG9wdEdSZWYoZ19jYW5jZWxsYWJsZV9uZXco
KSk7Ci0gICAgbV9jb250ZXh0LnNvdXJjZSA9IGFkb3B0R1JlZihnX3NvY2tldF9jcmVhdGVfc291
cmNlKHNvY2tldCwgY29uZGl0aW9uLCBtX2NvbnRleHQuY2FuY2VsbGFibGUuZ2V0KCkpKTsKKyAg
ICBtX2NvbnRleHQuc29ja2V0Q2FuY2VsbGFibGUgPSBhZG9wdEdSZWYoZ19jYW5jZWxsYWJsZV9u
ZXcoKSk7CisgICAgbV9jb250ZXh0LnNvdXJjZSA9IGFkb3B0R1JlZihnX3NvY2tldF9jcmVhdGVf
c291cmNlKHNvY2tldCwgY29uZGl0aW9uLCBtX2NvbnRleHQuc29ja2V0Q2FuY2VsbGFibGUuZ2V0
KCkpKTsKICAgICBnX3NvdXJjZV9zZXRfbmFtZShtX2NvbnRleHQuc291cmNlLmdldCgpLCBuYW1l
KTsKICAgICBnX3NvdXJjZV9zZXRfY2FsbGJhY2sobV9jb250ZXh0LnNvdXJjZS5nZXQoKSwgcmVp
bnRlcnByZXRfY2FzdDxHU291cmNlRnVuYz4oc29ja2V0U291cmNlQ2FsbGJhY2spLCB0aGlzLCBu
dWxscHRyKTsKICAgICBnX3NvdXJjZV9hdHRhY2gobV9jb250ZXh0LnNvdXJjZS5nZXQoKSwgY29u
dGV4dCk7CkBAIC0yMDQsMTAgKzIxMSwxOCBAQCB2b2lkIEdNYWluTG9vcFNvdXJjZTo6dm9pZENh
bGxiYWNrKCkKICAgICAgICAgQVNTRVJUKGNvbnRleHQudm9pZENhbGxiYWNrKTsKICAgICAgICAg
QVNTRVJUKG1fc3RhdHVzID09IFNjaGVkdWxlZCk7CiAgICAgICAgIG1fc3RhdHVzID0gRGlzcGF0
Y2hlZDsKKworICAgICAgICBjb250ZXh0LmNhbmNlbGxhYmxlID0gYWRvcHRHUmVmKGdfY2FuY2Vs
bGFibGVfbmV3KCkpOworICAgICAgICBtX2NhbmNlbGxhYmxlID0gY29udGV4dC5jYW5jZWxsYWJs
ZTsKICAgICB9CiAKICAgICBjb250ZXh0LnZvaWRDYWxsYmFjaygpOwogCisgICAgaWYgKGdfY2Fu
Y2VsbGFibGVfaXNfY2FuY2VsbGVkKGNvbnRleHQuY2FuY2VsbGFibGUuZ2V0KCkpKSB7CisgICAg
ICAgIGRpc3BhdGNoRGVzdHJveUNhbGxiYWNrKGNvbnRleHQuZGVzdHJveUNhbGxiYWNrKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGJvb2wgc2hvdWxkRGVzdHJveSA9IGZhbHNlOwog
ICAgIHsKICAgICAgICAgR011dGV4TG9ja2VyIGxvY2tlcihtX211dGV4KTsKQEAgLTIzMiwxMCAr
MjQ3LDE4IEBAIGJvb2wgR01haW5Mb29wU291cmNlOjpib29sQ2FsbGJhY2soKQogICAgICAgICBB
U1NFUlQoY29udGV4dC5ib29sQ2FsbGJhY2spOwogICAgICAgICBBU1NFUlQobV9zdGF0dXMgPT0g
U2NoZWR1bGVkIHx8IG1fc3RhdHVzID09IERpc3BhdGNoZWQpOwogICAgICAgICBtX3N0YXR1cyA9
IERpc3BhdGNoZWQ7CisKKyAgICAgICAgY29udGV4dC5jYW5jZWxsYWJsZSA9IGFkb3B0R1JlZihn
X2NhbmNlbGxhYmxlX25ldygpKTsKKyAgICAgICAgbV9jYW5jZWxsYWJsZSA9IGNvbnRleHQuY2Fu
Y2VsbGFibGU7CiAgICAgfQogCiAgICAgYm9vbCByZXR2YWwgPSBjb250ZXh0LmJvb2xDYWxsYmFj
aygpOwogCisgICAgaWYgKGdfY2FuY2VsbGFibGVfaXNfY2FuY2VsbGVkKGNvbnRleHQuY2FuY2Vs
bGFibGUuZ2V0KCkpKSB7CisgICAgICAgIGRpc3BhdGNoRGVzdHJveUNhbGxiYWNrKGNvbnRleHQu
ZGVzdHJveUNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIFN0b3A7CisgICAgfQorCiAgICAgYm9v
bCBzaG91bGREZXN0cm95ID0gZmFsc2U7CiAgICAgewogICAgICAgICBHTXV0ZXhMb2NrZXIgbG9j
a2VyKG1fbXV0ZXgpOwpAQCAtMjY0LDE1ICsyODcsMjEgQEAgYm9vbCBHTWFpbkxvb3BTb3VyY2U6
OnNvY2tldENhbGxiYWNrKEdJT0NvbmRpdGlvbiBjb25kaXRpb24pCiAgICAgICAgIEFTU0VSVChj
b250ZXh0LnNvY2tldENhbGxiYWNrKTsKICAgICAgICAgQVNTRVJUKG1fc3RhdHVzID09IFNjaGVk
dWxlZCB8fCBtX3N0YXR1cyA9PSBEaXNwYXRjaGVkKTsKICAgICAgICAgbV9zdGF0dXMgPSBEaXNw
YXRjaGVkOworCisgICAgICAgIGNvbnRleHQuY2FuY2VsbGFibGUgPSBhZG9wdEdSZWYoZ19jYW5j
ZWxsYWJsZV9uZXcoKSk7CisgICAgICAgIG1fY2FuY2VsbGFibGUgPSBjb250ZXh0LmNhbmNlbGxh
YmxlOwogICAgIH0KIAotICAgIGlmIChnX2NhbmNlbGxhYmxlX2lzX2NhbmNlbGxlZChjb250ZXh0
LmNhbmNlbGxhYmxlLmdldCgpKSkgeworICAgIGlmIChnX2NhbmNlbGxhYmxlX2lzX2NhbmNlbGxl
ZChjb250ZXh0LnNvY2tldENhbmNlbGxhYmxlLmdldCgpKSkgewogICAgICAgICBkZXN0cm95KGNv
bnRleHQuZGVzdHJveUNhbGxiYWNrKTsKICAgICAgICAgcmV0dXJuIFN0b3A7CiAgICAgfQogCiAg
ICAgYm9vbCByZXR2YWwgPSBjb250ZXh0LnNvY2tldENhbGxiYWNrKGNvbmRpdGlvbik7CiAKKyAg
ICBpZiAoZ19jYW5jZWxsYWJsZV9pc19jYW5jZWxsZWQoY29udGV4dC5jYW5jZWxsYWJsZS5nZXQo
KSkpCisgICAgICAgIHJldHVybiBTdG9wOworCiAgICAgYm9vbCBzaG91bGREZXN0cm95ID0gZmFs
c2U7CiAgICAgewogICAgICAgICBHTXV0ZXhMb2NrZXIgbG9ja2VyKG1fbXV0ZXgpOwpAQCAtMjk0
LDggKzMyMyw3IEBAIHZvaWQgR01haW5Mb29wU291cmNlOjpkZXN0cm95KGNvbnN0IHN0ZDo6ZnVu
Y3Rpb248dm9pZCAoKT4mIGRlc3Ryb3lDYWxsYmFjaykKICAgICBtX3N0YXR1cyA9IFJlYWR5Owog
ICAgIERlbGV0ZU9uRGVzdHJveVR5cGUgZGVsZXRlT25EZXN0cm95ID0gbV9kZWxldGVPbkRlc3Ry
b3k7CiAKLSAgICBpZiAoZGVzdHJveUNhbGxiYWNrKQotICAgICAgICBkZXN0cm95Q2FsbGJhY2so
KTsKKyAgICBkaXNwYXRjaERlc3Ryb3lDYWxsYmFjayhkZXN0cm95Q2FsbGJhY2spOwogCiAgICAg
aWYgKGRlbGV0ZU9uRGVzdHJveSA9PSBEb05vdERlbGV0ZU9uRGVzdHJveSkKICAgICAgICAgcmV0
dXJuOwpAQCAtMzAzLDYgKzMzMSwxMiBAQCB2b2lkIEdNYWluTG9vcFNvdXJjZTo6ZGVzdHJveShj
b25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+JiBkZXN0cm95Q2FsbGJhY2spCiAgICAgZGVsZXRl
IHRoaXM7CiB9CiAKK3ZvaWQgR01haW5Mb29wU291cmNlOjpkaXNwYXRjaERlc3Ryb3lDYWxsYmFj
ayhjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+JiBkZXN0cm95Q2FsbGJhY2spCit7CisgICAg
aWYgKGRlc3Ryb3lDYWxsYmFjaykKKyAgICAgICAgZGVzdHJveUNhbGxiYWNrKCk7Cit9CisKIGdi
b29sZWFuIEdNYWluTG9vcFNvdXJjZTo6dm9pZFNvdXJjZUNhbGxiYWNrKEdNYWluTG9vcFNvdXJj
ZSogc291cmNlKQogewogICAgIHNvdXJjZS0+dm9pZENhbGxiYWNrKCk7CmRpZmYgLS1naXQgYS9T
b3VyY2UvV1RGL3d0Zi9nb2JqZWN0L0dNYWluTG9vcFNvdXJjZS5oIGIvU291cmNlL1dURi93dGYv
Z29iamVjdC9HTWFpbkxvb3BTb3VyY2UuaAppbmRleCBiMDdhYjg5MmM0NzEzMWE0ZGRjZTZiOGU1
MThjZmRlODM1MGUwYjE4Li42NjJlYzU3YjhlNDExZmVlODlhYTljZDM1NjQ1YmNmMDZkYTIzZDJj
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi9nb2JqZWN0L0dNYWluTG9vcFNvdXJjZS5oCisr
KyBiL1NvdXJjZS9XVEYvd3RmL2dvYmplY3QvR01haW5Mb29wU291cmNlLmgKQEAgLTcyLDcgKzcy
LDkgQEAgcHJpdmF0ZToKICAgICB2b2lkIHZvaWRDYWxsYmFjaygpOwogICAgIGJvb2wgYm9vbENh
bGxiYWNrKCk7CiAgICAgYm9vbCBzb2NrZXRDYWxsYmFjayhHSU9Db25kaXRpb24pOworCiAgICAg
dm9pZCBkZXN0cm95KGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCAoKT4mKTsKKyAgICBzdGF0aWMg
dm9pZCBkaXNwYXRjaERlc3Ryb3lDYWxsYmFjayhjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+
Jik7CiAKICAgICBzdGF0aWMgZ2Jvb2xlYW4gdm9pZFNvdXJjZUNhbGxiYWNrKEdNYWluTG9vcFNv
dXJjZSopOwogICAgIHN0YXRpYyBnYm9vbGVhbiBib29sU291cmNlQ2FsbGJhY2soR01haW5Mb29w
U291cmNlKik7CkBAIC04MSw2ICs4Myw3IEBAIHByaXZhdGU6CiAgICAgRGVsZXRlT25EZXN0cm95
VHlwZSBtX2RlbGV0ZU9uRGVzdHJveTsKICAgICBTdGF0dXMgbV9zdGF0dXM7CiAgICAgR011dGV4
IG1fbXV0ZXg7CisgICAgR1JlZlB0cjxHQ2FuY2VsbGFibGU+IG1fY2FuY2VsbGFibGU7CiAKICAg
ICBzdHJ1Y3QgQ29udGV4dCB7CiAgICAgICAgIENvbnRleHQoKSA9IGRlZmF1bHQ7CkBAIC04OSw2
ICs5Miw3IEBAIHByaXZhdGU6CiAKICAgICAgICAgR1JlZlB0cjxHU291cmNlPiBzb3VyY2U7CiAg
ICAgICAgIEdSZWZQdHI8R0NhbmNlbGxhYmxlPiBjYW5jZWxsYWJsZTsKKyAgICAgICAgR1JlZlB0
cjxHQ2FuY2VsbGFibGU+IHNvY2tldENhbmNlbGxhYmxlOwogICAgICAgICBzdGQ6OmZ1bmN0aW9u
PHZvaWQgKCk+IHZvaWRDYWxsYmFjazsKICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sICgpPiBi
b29sQ2FsbGJhY2s7CiAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbCAoR0lPQ29uZGl0aW9uKT4g
c29ja2V0Q2FsbGJhY2s7CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cgYi9Ub29scy9DaGFu
Z2VMb2cKaW5kZXggY2QwMzJkNTZhYzVmMzM4Mjk1YmE1M2RlZGI4ODllOTNjNjZkMWYxZi4uZjBk
NDIwZmU1ZDhkNzE5YzZkMTI3NjY1Nzk1ODYyM2VhN2IzNTMwMSAxMDA2NDQKLS0tIGEvVG9vbHMv
Q2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDIxIEBACiAyMDE0LTA5
LTAzICBaYW4gRG9iZXJzZWsgIDx6ZG9iZXJzZWtAaWdhbGlhLmNvbT4KIAorICAgICAgICBDcmFz
aCBpbiBHTWFpbkxvb3BTb3VyY2Ugd2hlbiBkZXN0cm95aW5nIHRoZSBvYmplY3QgZHVyaW5nIGNh
bGxiYWNrIGRpc3BhdGNoCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xMzY1MjMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBBZGQgbW9yZSB1bml0IHRlc3RzIHRoYXQgY292ZXIgZGVzdHJveWluZyB0aGUgR01h
aW5Mb29wU291cmNlIG9iamVjdAorICAgICAgICBkdXJpbmcgZGlzcGF0Y2gsIGNhbmNlbGxpbmcg
YSByZXBlYXRpbmcgR01haW5Mb29wU291cmNlIG9iamVjdCBkdXJpbmcKKyAgICAgICAgZGlzcGF0
Y2gsIGFuZCBwcm9wZXIgZGlzcGF0Y2hpbmcgb2YgZGVzdHJveSBjYWxsYmFja3MgaW4gZGlmZmVy
ZW50CisgICAgICAgIGNpcmN1bXN0YW5jZXMuCisKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rl
c3RzL1dURi9nb2JqZWN0L0dNYWluTG9vcFNvdXJjZS5jcHA6CisgICAgICAgIChUZXN0V2ViS2l0
QVBJOjpHTWFpbkxvb3BTb3VyY2VUZXN0OjpkZWxheWVkRmluaXNoKToKKyAgICAgICAgKFRlc3RX
ZWJLaXRBUEk6OlRFU1QpOgorCisyMDE0LTA5LTAzICBaYW4gRG9iZXJzZWsgIDx6ZG9iZXJzZWtA
aWdhbGlhLmNvbT4KKwogICAgICAgICBHTWFpbkxvb3BTb3VyY2UgaXMgZXhwb3NlZCB0byByYWNl
IGNvbmRpdGlvbnMKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTEzNTgwMAogCmRpZmYgLS1naXQgYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9n
b2JqZWN0L0dNYWluTG9vcFNvdXJjZS5jcHAgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dU
Ri9nb2JqZWN0L0dNYWluTG9vcFNvdXJjZS5jcHAKaW5kZXggNmVmODg2YzI0N2E1Y2U5NDBhMzU3
NjhjNmI1ODhiMTZiOGMyZWVkYi4uZDYzYzY5NDY0NzRhMWVjYWMxMTg4NzEwNmU5Mjk4MDJiOTM1
YmMwMSAxMDA2NDQKLS0tIGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XVEYvZ29iamVjdC9H
TWFpbkxvb3BTb3VyY2UuY3BwCisrKyBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV1RGL2dv
YmplY3QvR01haW5Mb29wU291cmNlLmNwcApAQCAtNDEsNiArNDEsMTYgQEAgcHVibGljOgogICAg
ICAgICBnX21haW5fbG9vcF9ydW4obV9tYWluTG9vcCk7CiAgICAgfQogCisgICAgdm9pZCBkZWxh
eWVkRmluaXNoKCkKKyAgICB7CisgICAgICAgIGdfdGltZW91dF9hZGQoMjUwLAorICAgICAgICAg
ICAgW10oZ3BvaW50ZXIgZGF0YSkgeworICAgICAgICAgICAgICAgIEdNYWluTG9vcFNvdXJjZVRl
c3QmIHRlc3QgPSAqc3RhdGljX2Nhc3Q8R01haW5Mb29wU291cmNlVGVzdCo+KGRhdGEpOworICAg
ICAgICAgICAgICAgIHRlc3QuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdfU09V
UkNFX1JFTU9WRTsKKyAgICAgICAgICAgIH0sIHRoaXMpOworICAgIH0KKwogICAgIHZvaWQgZmlu
aXNoKCkKICAgICB7CiAgICAgICAgIGdfbWFpbl9sb29wX3F1aXQobV9tYWluTG9vcCk7CkBAIC0x
MTMsNyArMTIzLDcgQEAgVEVTVChXVEZfR01haW5Mb29wU291cmNlLCBSZXNjaGVkdWxpbmdGcm9t
RGlmZmVyZW50VGhyZWFkKQogICAgICAgICBjb250ZXh0LmZpbmlzaGVkRmlyc3RUYXNrID0gdHJ1
ZTsKICAgICB9KTsKIAotICAgIGdfdGhyZWFkX25ldyhudWxscHRyLCBbXShncG9pbnRlciBkYXRh
KSAtPiBncG9pbnRlciB7CisgICAgR1RocmVhZCogaGVscGVyVGhyZWFkID0gZ190aHJlYWRfbmV3
KG51bGxwdHIsIFtdKGdwb2ludGVyIGRhdGEpIC0+IGdwb2ludGVyIHsKICAgICAgICAgZ191c2xl
ZXAoMC4yNSAqIEdfVVNFQ19QRVJfU0VDKTsKIAogICAgICAgICBUZXN0aW5nQ29udGV4dCYgY29u
dGV4dCA9ICpzdGF0aWNfY2FzdDxUZXN0aW5nQ29udGV4dCo+KGRhdGEpOwpAQCAtMTMwLDggKzE0
MCwyMDQgQEAgVEVTVChXVEZfR01haW5Mb29wU291cmNlLCBSZXNjaGVkdWxpbmdGcm9tRGlmZmVy
ZW50VGhyZWFkKQogICAgIH0sICZjb250ZXh0KTsKIAogICAgIGNvbnRleHQudGVzdC5ydW5Mb29w
KCk7CisgICAgZ190aHJlYWRfdW5yZWYoaGVscGVyVGhyZWFkKTsKICAgICBFWFBFQ1RfVFJVRShj
b250ZXh0LmZpbmlzaGVkRmlyc3RUYXNrKTsKICAgICBFWFBFQ1RfVFJVRShjb250ZXh0LmZpbmlz
aGVkU2Vjb25kVGFzayk7CiB9CiAKK1RFU1QoV1RGX0dNYWluTG9vcFNvdXJjZSwgRGVzdHJ1Y3Rp
b25EdXJpbmdEaXNwYXRjaCkKK3sKKyAgICBHTWFpbkxvb3BTb3VyY2UqIHNvdXJjZTsKKyAgICBH
TWFpbkxvb3AqIGxvb3AgPSBnX21haW5fbG9vcF9uZXcobnVsbHB0ciwgVFJVRSk7CisKKyAgICBz
b3VyY2UgPSBuZXcgR01haW5Mb29wU291cmNlOworICAgIHNvdXJjZS0+c2NoZWR1bGUoIltUZXN0
XSBEZXN0cm95U291cmNlVGFzayIsIFsmXSB7CisgICAgICAgIGRlbGV0ZSBzb3VyY2U7CisgICAg
ICAgIGdfbWFpbl9sb29wX3F1aXQobG9vcCk7CisgICAgfSk7CisgICAgZ19tYWluX2xvb3BfcnVu
KGxvb3ApOworCisgICAgc291cmNlID0gbmV3IEdNYWluTG9vcFNvdXJjZTsKKyAgICBzb3VyY2Ut
PnNjaGVkdWxlKCJbVGVzdF0gRGVzdHJveVNvdXJjZVRhc2siLCBbJl0geworICAgICAgICBkZWxl
dGUgc291cmNlOworICAgICAgICBnX21haW5fbG9vcF9xdWl0KGxvb3ApOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfSk7CisgICAgZ19tYWluX2xvb3BfcnVuKGxvb3ApOworCisgICAgZ19t
YWluX2xvb3BfdW5yZWYobG9vcCk7Cit9CisKK1RFU1QoV1RGX0dNYWluTG9vcFNvdXJjZSwgQ2Fu
Y2VsUmVwZWF0aW5nU291cmNlRHVyaW5nRGlzcGF0Y2gpCit7CisgICAgc3RydWN0IFRlc3RpbmdD
b250ZXh0IHsKKyAgICAgICAgR01haW5Mb29wU291cmNlVGVzdCB0ZXN0OworICAgICAgICB1bnNp
Z25lZCBjYWxsQ291bnQgPSAwOworICAgIH0gY29udGV4dDsKKworICAgIGNvbnRleHQudGVzdC5z
b3VyY2UoKS5zY2hlZHVsZSgiW1Rlc3RdIFJlcGVhdGluZ1Rhc2siLCBbJl0geworICAgICAgICBj
b250ZXh0LmNhbGxDb3VudCsrOworICAgICAgICBpZiAoY29udGV4dC5jYWxsQ291bnQgPT0gMykK
KyAgICAgICAgICAgIGNvbnRleHQudGVzdC5zb3VyY2UoKS5jYW5jZWwoKTsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfSk7CisKKyAgICBjb250ZXh0LnRlc3QuZGVsYXllZEZpbmlzaCgpOwor
ICAgIGNvbnRleHQudGVzdC5ydW5Mb29wKCk7CisgICAgRVhQRUNUX0VRKDMsIGNvbnRleHQuY2Fs
bENvdW50KTsKK30KKworVEVTVChXVEZfR01haW5Mb29wU291cmNlLCBCYXNpY0Rlc3Ryb3lDYWxs
YmFja3MpCit7CisgICAgc3RydWN0IFRlc3RpbmdDb250ZXh0IHsKKyAgICAgICAgR01haW5Mb29w
U291cmNlVGVzdCB0ZXN0OworICAgICAgICBib29sIGNhbGxiYWNrQ2FsbGVkID0gZmFsc2U7Cisg
ICAgICAgIGJvb2wgZGVzdHJveUNhbGxiYWNrQ2FsbGVkID0gZmFsc2U7CisgICAgfTsKKworICAg
IHsKKyAgICAgICAgVGVzdGluZ0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgY29udGV4dC50ZXN0
LnNvdXJjZSgpLnNjaGVkdWxlKCJbVGVzdF0gRGVzdHJveUNhbGxiYWNrIiwKKyAgICAgICAgICAg
IFsmXSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5jYWxsYmFja0NhbGxlZCA9IHRydWU7Cisg
ICAgICAgICAgICB9LCBHX1BSSU9SSVRZX0RFRkFVTFQsCisgICAgICAgICAgICBbJl0geworICAg
ICAgICAgICAgICAgIGNvbnRleHQuZGVzdHJveUNhbGxiYWNrQ2FsbGVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICBjb250ZXh0LnRlc3QuZmluaXNoKCk7CisgICAgICAgICAgICB9KTsKKworICAg
ICAgICBjb250ZXh0LnRlc3QucnVuTG9vcCgpOworICAgICAgICBFWFBFQ1RfVFJVRShjb250ZXh0
LmNhbGxiYWNrQ2FsbGVkKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29udGV4dC5kZXN0cm95Q2Fs
bGJhY2tDYWxsZWQpOworICAgIH0KKworICAgIHsKKyAgICAgICAgVGVzdGluZ0NvbnRleHQgY29u
dGV4dDsKKyAgICAgICAgY29udGV4dC50ZXN0LnNvdXJjZSgpLnNjaGVkdWxlKCJbVGVzdF0gRGVz
dHJveUNhbGxiYWNrIiwKKyAgICAgICAgICAgIFsmXSB7CisgICAgICAgICAgICAgICAgY29udGV4
dC5jYWxsYmFja0NhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgfSwgR19QUklPUklUWV9ERUZBVUxULAorICAgICAgICAgICAgWyZdIHsKKyAg
ICAgICAgICAgICAgICBjb250ZXh0LmRlc3Ryb3lDYWxsYmFja0NhbGxlZCA9IHRydWU7CisgICAg
ICAgICAgICAgICAgY29udGV4dC50ZXN0LmZpbmlzaCgpOworICAgICAgICAgICAgfSk7CisKKyAg
ICAgICAgY29udGV4dC50ZXN0LnJ1bkxvb3AoKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29udGV4
dC5jYWxsYmFja0NhbGxlZCk7CisgICAgICAgIEVYUEVDVF9UUlVFKGNvbnRleHQuZGVzdHJveUNh
bGxiYWNrQ2FsbGVkKTsKKyAgICB9Cit9CisKK1RFU1QoV1RGX0dNYWluTG9vcFNvdXJjZSwgRGVz
dHJveUNhbGxiYWNrc0FmdGVyQ2FuY2VsbGluZ0R1cmluZ0Rpc3BhdGNoKQoreworICAgIHN0cnVj
dCBUZXN0aW5nQ29udGV4dCB7CisgICAgICAgIEdNYWluTG9vcFNvdXJjZVRlc3QgdGVzdDsKKyAg
ICAgICAgdW5zaWduZWQgY2FsbGJhY2tDYWxsQ291bnQ9IDA7CisgICAgICAgIGJvb2wgZGVzdHJv
eUNhbGxiYWNrQ2FsbGVkID0gZmFsc2U7CisgICAgfTsKKworICAgIHsKKyAgICAgICAgVGVzdGlu
Z0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgY29udGV4dC50ZXN0LnNvdXJjZSgpLnNjaGVkdWxl
KCJbVGVzdF0gRGVzdHJveUNhbGxiYWNrIiwKKyAgICAgICAgICAgIFsmXSB7CisgICAgICAgICAg
ICAgICAgY29udGV4dC5jYWxsYmFja0NhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIGNvbnRl
eHQudGVzdC5zb3VyY2UoKS5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0sIEdfUFJJT1JJVFlfREVG
QVVMVCwKKyAgICAgICAgICAgIFsmXSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5kZXN0cm95
Q2FsbGJhY2tDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRleHQudGVzdC5maW5p
c2goKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIGNvbnRleHQudGVzdC5kZWxheWVkRmlu
aXNoKCk7CisgICAgICAgIGNvbnRleHQudGVzdC5ydW5Mb29wKCk7CisgICAgICAgIEVYUEVDVF9F
USgxLCBjb250ZXh0LmNhbGxiYWNrQ2FsbENvdW50KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29u
dGV4dC5kZXN0cm95Q2FsbGJhY2tDYWxsZWQpOworICAgIH0KKworICAgIHsKKyAgICAgICAgVGVz
dGluZ0NvbnRleHQgY29udGV4dDsKKyAgICAgICAgY29udGV4dC50ZXN0LnNvdXJjZSgpLnNjaGVk
dWxlKCJbVGVzdF0gRGVzdHJveUNhbGxiYWNrIiwKKyAgICAgICAgICAgIFsmXSB7CisgICAgICAg
ICAgICAgICAgY29udGV4dC5jYWxsYmFja0NhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIGlm
IChjb250ZXh0LmNhbGxiYWNrQ2FsbENvdW50ID09IDMpCisgICAgICAgICAgICAgICAgICAgIGNv
bnRleHQudGVzdC5zb3VyY2UoKS5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgIH0sIEdfUFJJT1JJVFlfREVGQVVMVCwKKyAgICAgICAgICAgIFsmXSB7
CisgICAgICAgICAgICAgICAgY29udGV4dC5kZXN0cm95Q2FsbGJhY2tDYWxsZWQgPSB0cnVlOwor
ICAgICAgICAgICAgfSk7CisKKyAgICAgICAgY29udGV4dC50ZXN0LmRlbGF5ZWRGaW5pc2goKTsK
KyAgICAgICAgY29udGV4dC50ZXN0LnJ1bkxvb3AoKTsKKyAgICAgICAgRVhQRUNUX0VRKDMsIGNv
bnRleHQuY2FsbGJhY2tDYWxsQ291bnQpOworICAgICAgICBFWFBFQ1RfVFJVRShjb250ZXh0LmRl
c3Ryb3lDYWxsYmFja0NhbGxlZCk7CisgICAgfQorfQorCitURVNUKFdURl9HTWFpbkxvb3BTb3Vy
Y2UsIERlc3Ryb3lDYWxsYmFja3NBZnRlclJlc2NoZWR1bGluZ0R1cmluZ0Rpc3BhdGNoKQorewor
ICAgIHN0cnVjdCBUZXN0aW5nQ29udGV4dCB7CisgICAgICAgIEdNYWluTG9vcFNvdXJjZVRlc3Qg
dGVzdDsKKyAgICAgICAgdW5zaWduZWQgZmlyc3RDYWxsYmFja0NhbGxDb3VudCA9IDA7CisgICAg
ICAgIGJvb2wgZmlyc3REZXN0cm95Q2FsbGJhY2tDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdW5z
aWduZWQgc2Vjb25kQ2FsbGJhY2tDYWxsQ291bnQgPSAwOworICAgICAgICBib29sIHNlY29uZERl
c3Ryb3lDYWxsYmFja0NhbGxlZCA9IGZhbHNlOworICAgIH07CisKKyAgICB7CisgICAgICAgIFRl
c3RpbmdDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIGNvbnRleHQudGVzdC5zb3VyY2UoKS5zY2hl
ZHVsZSgiW1Rlc3RdIEJhc2VDYWxsYmFjayIsCisgICAgICAgICAgICBbJl0geworICAgICAgICAg
ICAgICAgIGNvbnRleHQuZmlyc3RDYWxsYmFja0NhbGxDb3VudCsrOworICAgICAgICAgICAgICAg
IGNvbnRleHQudGVzdC5zb3VyY2UoKS5zY2hlZHVsZSgiW1Rlc3RdIFJlc2NoZWR1bGluZ0NhbGxi
YWNrIiwKKyAgICAgICAgICAgICAgICAgICAgWyZdIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnRleHQuc2Vjb25kQ2FsbGJhY2tDYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAg
fSwgR19QUklPUklUWV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICBbJl0geworICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGV4dC5zZWNvbmREZXN0cm95Q2FsbGJhY2tDYWxsZWQgPSB0
cnVlOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0sIEdfUFJJT1JJVFlf
REVGQVVMVCwKKyAgICAgICAgICAgIFsmXSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5v
dCBiZSBjYWxsZWQuCisgICAgICAgICAgICAgICAgY29udGV4dC5maXJzdERlc3Ryb3lDYWxsYmFj
a0NhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9KTsKKworICAgICAgICBjb250ZXh0LnRlc3Qu
ZGVsYXllZEZpbmlzaCgpOworICAgICAgICBjb250ZXh0LnRlc3QucnVuTG9vcCgpOworICAgICAg
ICBFWFBFQ1RfRVEoMSwgY29udGV4dC5maXJzdENhbGxiYWNrQ2FsbENvdW50KTsKKyAgICAgICAg
RVhQRUNUX0ZBTFNFKGNvbnRleHQuZmlyc3REZXN0cm95Q2FsbGJhY2tDYWxsZWQpOworICAgICAg
ICBFWFBFQ1RfRVEoMSwgY29udGV4dC5zZWNvbmRDYWxsYmFja0NhbGxDb3VudCk7CisgICAgICAg
IEVYUEVDVF9UUlVFKGNvbnRleHQuc2Vjb25kRGVzdHJveUNhbGxiYWNrQ2FsbGVkKTsKKyAgICB9
CisKKyAgICB7CisgICAgICAgIFRlc3RpbmdDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIGNvbnRl
eHQudGVzdC5zb3VyY2UoKS5zY2hlZHVsZSgiW1Rlc3RdIEJhc2VDYWxsYmFjayIsCisgICAgICAg
ICAgICBbJl0geworICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyc3RDYWxsYmFja0NhbGxDb3Vu
dCsrOworICAgICAgICAgICAgICAgIGNvbnRleHQudGVzdC5zb3VyY2UoKS5zY2hlZHVsZSgiW1Rl
c3RdIFJlc2NoZWR1bGluZ0NhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgWyZdIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2Vjb25kQ2FsbGJhY2tDYWxsQ291bnQrKzsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnNlY29uZENhbGxiYWNrQ2Fs
bENvdW50ICE9IDM7CisgICAgICAgICAgICAgICAgICAgIH0sIEdfUFJJT1JJVFlfREVGQVVMVCwK
KyAgICAgICAgICAgICAgICAgICAgWyZdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRl
eHQuc2Vjb25kRGVzdHJveUNhbGxiYWNrQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAg
ICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9LCBHX1BS
SU9SSVRZX0RFRkFVTFQsCisgICAgICAgICAgICBbJl0geworICAgICAgICAgICAgICAgIC8vIFNo
b3VsZCBub3QgYmUgY2FsbGVkLgorICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyc3REZXN0cm95
Q2FsbGJhY2tDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgY29udGV4
dC50ZXN0LmRlbGF5ZWRGaW5pc2goKTsKKyAgICAgICAgY29udGV4dC50ZXN0LnJ1bkxvb3AoKTsK
KyAgICAgICAgRVhQRUNUX0VRKDEsIGNvbnRleHQuZmlyc3RDYWxsYmFja0NhbGxDb3VudCk7Cisg
ICAgICAgIEVYUEVDVF9GQUxTRShjb250ZXh0LmZpcnN0RGVzdHJveUNhbGxiYWNrQ2FsbGVkKTsK
KyAgICAgICAgRVhQRUNUX0VRKDMsIGNvbnRleHQuc2Vjb25kQ2FsbGJhY2tDYWxsQ291bnQpOwor
ICAgICAgICBFWFBFQ1RfVFJVRShjb250ZXh0LnNlY29uZERlc3Ryb3lDYWxsYmFja0NhbGxlZCk7
CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBUZXN0V2ViS2l0QVBJCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>