<?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>141558</bug_id>
          
          <creation_ts>2015-02-13 03:30:33 -0800</creation_ts>
          <short_desc>[GTK] GObject DOM bindings object are cached forever</short_desc>
          <delta_ts>2015-02-17 03:58:01 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk, Regression</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>141641</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Carlos Garcia Campos">cgarcia</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>clopez</cc>
    
    <cc>gustavo</cc>
    
    <cc>svillar</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1068883</commentid>
    <comment_count>0</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2015-02-13 03:30:33 -0800</bug_when>
    <thetext>DOMObjectCache::clearByFrame() is never called in WebKit2, so all objects are cached until the global cache is deleted (end of web process). In WebKit1 we call clearByFrame() from FrameLoaderClient::setMainFrameDocumentReady() when ready == False, and WebKitWebFrame when the core Frame object is destroyed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1069510</commentid>
    <comment_count>1</comment_count>
      <attachid>246665</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2015-02-16 11:27:51 -0800</bug_when>
    <thetext>Created attachment 246665
Patch

I&apos;ve reworked the DOMObjectCache so that we no longer need to manually clear objects when a frame is destroyed. I&apos;ve also cleaned up the code that was quite difficult to follow, added a bunch of assertions if DOM objects are leaked, and a new test case specific for the cache.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1069801</commentid>
    <comment_count>2</comment_count>
      <attachid>246665</attachid>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2015-02-17 00:54:26 -0800</bug_when>
    <thetext>Comment on attachment 246665
Patch

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

Awesome patch. The code is highly simplified and the new test coverage is simply superb.

I have a few comments.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:73
&gt; +static DOMObjectCacheFrameObserver&amp; getOrCreateDOMObjectCacheFrameObserver(WebCore::Frame* frame)

As frame is never null this should be a reference.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:87
&gt; +    DOMObjectCacheFrameObserver(WebCore::Frame* frame)

This should also be ideally a reference but the interface is a pointer :(

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:97
&gt; +    void addObjectCacheData(DOMObjectCacheData* data)

This can be a reference.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:101
&gt; +        m_objects.append(data);

See bellow my comment about m_objects.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:109
&gt; +        observer-&gt;m_objects.removeFirstMatching([finalizedObject](DOMObjectCacheData* data) {

See bellow my comment about m_objects.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:120
&gt; +        for (auto data : objects) {

I think it&apos;s preferred to be explicit about the type being a pointer, so &quot;auto*&quot; it&apos;s slightly better in this case.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:139
&gt; +    Vector&lt;DOMObjectCacheData*&gt; m_objects;

Since respecting the insertion order is not needed, I think we should use a HashSet here. Being a set means that we can be sure that the objects are only once in the data structure and will also help with searches (contains() and the like).

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:164
&gt;      if (domObjects().get(objectHandle))

!domObjects().contains(objectHandle) ?

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:171
&gt; +    if (domObjects().get(objectHandle))

Ditto.

&gt; Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMNodeTest.cpp:216
&gt; +        // Get the same elment twice should return the same pointer.

Nit: element</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1069804</commentid>
    <comment_count>3</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2015-02-17 01:24:26 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Comment on attachment 246665 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=246665&amp;action=review
&gt; 
&gt; Awesome patch. The code is highly simplified and the new test coverage is
&gt; simply superb.

Thanks, hopefully it&apos;s also correct :-)

&gt; I have a few comments.
&gt; 
&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:73
&gt; &gt; +static DOMObjectCacheFrameObserver&amp; getOrCreateDOMObjectCacheFrameObserver(WebCore::Frame* frame)
&gt; 
&gt; As frame is never null this should be a reference.

Ok.

&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:87
&gt; &gt; +    DOMObjectCacheFrameObserver(WebCore::Frame* frame)
&gt; 
&gt; This should also be ideally a reference but the interface is a pointer :(

We can still receive a Ref and pass the address to the parent constructor.

&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:97
&gt; &gt; +    void addObjectCacheData(DOMObjectCacheData* data)
&gt; 
&gt; This can be a reference.

Ok.

&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:101
&gt; &gt; +        m_objects.append(data);
&gt; 
&gt; See bellow my comment about m_objects.
&gt; 
&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:109
&gt; &gt; +        observer-&gt;m_objects.removeFirstMatching([finalizedObject](DOMObjectCacheData* data) {
&gt; 
&gt; See bellow my comment about m_objects.
&gt; 
&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:120
&gt; &gt; +        for (auto data : objects) {
&gt; 
&gt; I think it&apos;s preferred to be explicit about the type being a pointer, so
&gt; &quot;auto*&quot; it&apos;s slightly better in this case.

Ok.

&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:139
&gt; &gt; +    Vector&lt;DOMObjectCacheData*&gt; m_objects;
&gt; 
&gt; Since respecting the insertion order is not needed, I think we should use a
&gt; HashSet here. Being a set means that we can be sure that the objects are
&gt; only once in the data structure and will also help with searches (contains()
&gt; and the like).

It was a HashSet initially, I don&apos;t remember why I changed to a Vector.

&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:164
&gt; &gt;      if (domObjects().get(objectHandle))
&gt; 
&gt; !domObjects().contains(objectHandle) ?

Actually domObjects().contains(objectHandle), since we want to return early when the wrapped object is already cached, but yes, contains is better thnn get in this case.

&gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:171
&gt; &gt; +    if (domObjects().get(objectHandle))
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMNodeTest.cpp:216
&gt; &gt; +        // Get the same elment twice should return the same pointer.
&gt; 
&gt; Nit: element

Sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1069805</commentid>
    <comment_count>4</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2015-02-17 01:41:52 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; &gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:139
&gt; &gt; &gt; +    Vector&lt;DOMObjectCacheData*&gt; m_objects;
&gt; &gt; 
&gt; &gt; Since respecting the insertion order is not needed, I think we should use a
&gt; &gt; HashSet here. Being a set means that we can be sure that the objects are
&gt; &gt; only once in the data structure and will also help with searches (contains()
&gt; &gt; and the like).
&gt; 
&gt; It was a HashSet initially, I don&apos;t remember why I changed to a Vector.

I remember now. Switched to a Vector in the end mainly because of removeFirstMatching() that makes very convenient to find the data containing the GObject that has finalized. Note that we don&apos;t actually need hashes here, adding the same object twice would be a bug, and there&apos;s an assert for that case indeed. We always want either iterate all the elements, or find a particular element, but not using the data pointer, but the GObject, because in objectFinalizedCallback we don&apos;t have the data pointer corresponding to the finalized GObject. Also, all the contains uses are inside asserts. We could improve a bit the Vector by stack allocating a few entries, 8 for example.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1069808</commentid>
    <comment_count>5</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2015-02-17 01:57:59 -0800</bug_when>
    <thetext>Committed r180214: &lt;http://trac.webkit.org/changeset/180214&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1069809</commentid>
    <comment_count>6</comment_count>
      <attachid>246665</attachid>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2015-02-17 03:13:10 -0800</bug_when>
    <thetext>Comment on attachment 246665
Patch

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

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:82
&gt; +    auto observerPtr = domObjectCacheFrameObservers().get(frame);
&gt; +    if (observerPtr)
&gt; +        return *observerPtr;
&gt; +
&gt; +    std::unique_ptr&lt;DOMObjectCacheFrameObserver&gt; observer = std::make_unique&lt;DOMObjectCacheFrameObserver&gt;(frame);
&gt; +    observerPtr = observer.get();
&gt; +    domObjectCacheFrameObservers().set(frame, WTF::move(observer));
&gt; +    return *observerPtr;

This could just call HashMap&lt;&gt;::add(), and then use the AddResult object that&apos;s returned to set the observer object if necessary.
Document::addAutoSizingNode() is one example of that approach.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:166
&gt; +    domObjects().set(objectHandle, std::make_unique&lt;DOMObjectCacheData&gt;(G_OBJECT(wrapper)));

Same here.

&gt; Source/WebCore/bindings/gobject/DOMObjectCache.cpp:176
&gt; +    domObjects().set(objectHandle, WTF::move(data));

Same here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1069810</commentid>
    <comment_count>7</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2015-02-17 03:58:01 -0800</bug_when>
    <thetext>Committed r180216: &lt;http://trac.webkit.org/changeset/180216&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>246665</attachid>
            <date>2015-02-16 11:27:51 -0800</date>
            <delta_ts>2015-02-17 03:16:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>wk2-dom-object-cache.diff</filename>
            <type>text/plain</type>
            <size>41761</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAwMDMyODk1Li5lNTQzYjg3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDcg
QEAKKzIwMTUtMDItMTYgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29t
PgorCisgICAgICAgIFtHVEtdIEdPYmplY3QgRE9NIGJpbmRpbmdzIG9iamVjdCBhcmUgY2FjaGVk
IGZvcmV2ZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTE0MTU1OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFJld29yayB0aGUgRE9NT2JqZWN0Q2FjaGUgdG8gYXZvaWQgaGF2aW5nIHRvIG1hbnVhbGx5IGNs
ZWFyIHRoZQorICAgICAgICBvYmplY3RzIHdoZW4gdGhlIGZyYW1lIGlzIGRlc3Ryb3llZCwgdXNp
bmcgYSBGcmFtZURlc3RydWN0aW9uT2JzZXJ2ZXIKKyAgICAgICAgaW5zdGVhZC4gV2hlbiBhIG5l
dyBvYmplY3QgYXNzb2NpYXRlZCB0byBhIEZyYW1lIGlzIGFkZGVkIHRvIHRoZQorICAgICAgICBj
YWNoZSwgYSBGcmFtZURlc3RydWN0aW9uT2JzZXJ2ZXIgaXMgY3JlYXRlZCBmb3IgdGhlIGZyYW1l
IGlmCisgICAgICAgIG5lZWRlZCwgYW5kIHRoZSBET00gb2JqZWN0IGlzIHRyYWNrZWQgYnkgdGhl
IG9ic2VydmVyIHRvby4gV2hlbgorICAgICAgICB0aGUgZnJhbWUgaXMgZGV0YWNoZWQgZnJvbSB0
aGUgcGFnZSBhbGwgaXRzIG9iamVjdHMgYXJlIGNsZWFyZWQsCisgICAgICAgIGFuZCBpZiB0aGUg
YXJlbid0IGFkZGl0aW9uYWwgcmVmZXJlbmNlcywgdGhlIG9iamVjdCBpcyBmaW5hbGl6ZWQKKyAg
ICAgICAgYW5kIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgbm9ybWFsbHkuCisgICAgICAgIFRoaXMg
cGF0Y2ggYWxzbyBzaW1wbGlmaWVzIGFuZCBtb2Rlcm5pemVzIHRoZSBjb2RlIHRvIG1ha2UgaXQK
KyAgICAgICAgZWFzaWVyIHRvIHJlYWQgYW4gbWFpbnRhaW4uCisKKyAgICAgICAgKiBiaW5kaW5n
cy9nb2JqZWN0L0RPTU9iamVjdENhY2hlLmNwcDoKKyAgICAgICAgKFdlYktpdDo6RE9NT2JqZWN0
Q2FjaGVEYXRhOjpET01PYmplY3RDYWNoZURhdGEpOiBBZGQgY29uc3RydWN0b3IKKyAgICAgICAg
dG8gaW5pdGlhbGl6ZSBpdHMgbWVtYmVycyBhbmQgc2ltcGxpZnkgdGhlIGNhbGxlcnMuCisgICAg
ICAgIChXZWJLaXQ6OkRPTU9iamVjdENhY2hlRGF0YTo6Y2xlYXJPYmplY3QpOiBSZW1vdmUgdGhl
IHJlZmVyZW5jZXMKKyAgICAgICAgYWRkZWQgYnkgdGhlIGNhY2hlLCBlbnN1cmluZyB0aGUgR09i
amVjdCBpcyBub3QgZmluYWxpemVkIHVudGlsCisgICAgICAgIHRoZSBtZXRob2QgcmV0dXJucy4K
KyAgICAgICAgKFdlYktpdDo6RE9NT2JqZWN0Q2FjaGVEYXRhOjpyZWZPYmplY3QpOiBBZGRzIGEg
cmVmZXJlbmNlIG93bmVkIGJ5CisgICAgICAgIHRoZSBjYWNoZS4KKyAgICAgICAgKFdlYktpdDo6
ZG9tT2JqZWN0Q2FjaGVGcmFtZU9ic2VydmVycyk6IE1hcCBhIGZyYW1lIHRvIGEgRnJhbWVEZXN0
cnVjdGlvbk9ic2VydmVyLgorICAgICAgICAoV2ViS2l0OjpnZXRPckNyZWF0ZURPTU9iamVjdENh
Y2hlRnJhbWVPYnNlcnZlcik6IENyZWF0ZSBhIG5ldworICAgICAgICBGcmFtZURlc3RydWN0aW9u
T2JzZXJ2ZXIgZm9yIHRoZSBnaXZlbiBGcmFtZSBvciByZXR1cm4gdGhlCisgICAgICAgIGV4aXN0
aW5nIG9uZS4KKyAgICAgICAgKFdlYktpdDo6ZG9tT2JqZWN0cyk6IE1hcCB3cmFwcGVkIG9iamVj
dCB0byB3cmFwcGVyIG9iamVjdC4KKyAgICAgICAgKFdlYktpdDo6RE9NT2JqZWN0Q2FjaGU6OmZv
cmdldCk6IFJlbW92ZSB0aGUgd3JhcHBlZCBvYmplY3QgZnJvbQorICAgICAgICB0aGUgY2FjaGUu
CisgICAgICAgIChXZWJLaXQ6OkRPTU9iamVjdENhY2hlOjpnZXQpOiBSZXR1cm4gdGhlIHdyYXBw
ZWQgb2JqZWN0IGlmIGl0IGlzCisgICAgICAgIGluIHRoZSBjYWNoZSwgaW5jcmVhc2luZyB0aGUg
Y2FjaGUgcmVmZXJlbmNlcy4KKyAgICAgICAgKFdlYktpdDo6RE9NT2JqZWN0Q2FjaGU6OnB1dCk6
IEFkZCB0aGUgd3JhcHBlciBvYmplY3QgdG8gdGhlIGNhY2hlCisgICAgICAgIGZvciB0aGUgZ2l2
ZW4gd3JhcHBlZCBvYmplY3QuIElmIGl0J3MgYSBOb2RlIGFuZCBoYXMgYSBmcmFtZSBhZGQKKyAg
ICAgICAgdGhlIG5vZGUgdG8gdGhlIEZyYW1lRGVzdHJ1Y3Rpb25PYnNlcnZlciBjb3JyZXNwb25k
aW5nIHRvIHRoZSBmcmFtZS4KKyAgICAgICAgKFdlYktpdDo6Z2V0RnJhbWVGcm9tSGFuZGxlKTog
RGVsZXRlZC4KKyAgICAgICAgKFdlYktpdDo6d2Vha1JlZk5vdGlmeSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJLaXQ6OkRPTU9iamVjdENhY2hlOjpjbGVhckJ5RnJhbWUpOiBEZWxldGVkLgorICAg
ICAgICAoV2ViS2l0OjpET01PYmplY3RDYWNoZTo6fkRPTU9iamVjdENhY2hlKTogRGVsZXRlZC4K
KyAgICAgICAgKiBiaW5kaW5ncy9nb2JqZWN0L0RPTU9iamVjdENhY2hlLmg6CisKIDIwMTUtMDIt
MTUgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KIAogICAgICAgICBSRUdSRVNT
SU9OIChyMTgwMDgyKTogV2ViQ29yZSBEZWJ1ZyBidWlsZHMgZmFpbCBvbiBNYXZlcmlja3MgZHVl
IHRvIHdlYWsgZXhwb3J0IHN5bWJvbHMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL2dvYmplY3QvRE9NT2JqZWN0Q2FjaGUuY3BwIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
Z29iamVjdC9ET01PYmplY3RDYWNoZS5jcHAKaW5kZXggMGYwZmNjZC4uZGI4ZTZjZiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvZ29iamVjdC9ET01PYmplY3RDYWNoZS5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvZ29iamVjdC9ET01PYmplY3RDYWNoZS5jcHAK
QEAgLTEsNSArMSw1IEBACiAvKgotICogIENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgor
ICogIENvcHlyaWdodCAoQykgMjAxMCwgMjAxNSBJZ2FsaWEgUy5MLgogICoKICAqICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAg
KiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYwpAQCAtMjAsMTQxICsyMCwxNjMgQEAKICNpbmNsdWRlICJET01PYmplY3RDYWNoZS5oIgog
CiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZURlc3RydWN0aW9uT2JzZXJ2
ZXIuaCIKICNpbmNsdWRlICJOb2RlLmgiCiAjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KICNpbmNs
dWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9OZXZlckRlc3Ryb3llZC5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvZ29iamVjdC9HUmVmUHRyLmg+CiAK
IG5hbWVzcGFjZSBXZWJLaXQgewogCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgRE9NT2JqZWN0
Q2FjaGVEYXRhIHsKKyAgICBET01PYmplY3RDYWNoZURhdGEoR09iamVjdCogd3JhcHBlcikKKyAg
ICAgICAgOiBvYmplY3Qod3JhcHBlcikKKyAgICAgICAgLCBjYWNoZVJlZmVyZW5jZXMoMSkKKyAg
ICB7CisgICAgfQorCisgICAgdm9pZCBjbGVhck9iamVjdCgpCisgICAgeworICAgICAgICBBU1NF
UlQob2JqZWN0KTsKKyAgICAgICAgQVNTRVJUKGNhY2hlUmVmZXJlbmNlcyA+PSAxKTsKKworICAg
ICAgICBHUmVmUHRyPEdPYmplY3Q+IHByb3RlY3Qob2JqZWN0KTsKKyAgICAgICAgZG8geworICAg
ICAgICAgICAgZ19vYmplY3RfdW5yZWYob2JqZWN0KTsKKyAgICAgICAgfSB3aGlsZSAoLS1jYWNo
ZVJlZmVyZW5jZXMpOworICAgICAgICBvYmplY3QgPSBudWxscHRyOworICAgIH0KKworICAgIHZv
aWQqIHJlZk9iamVjdCgpCisgICAgeworICAgICAgICBBU1NFUlQob2JqZWN0KTsKKworICAgICAg
ICBjYWNoZVJlZmVyZW5jZXMrKzsKKyAgICAgICAgcmV0dXJuIGdfb2JqZWN0X3JlZihvYmplY3Qp
OworICAgIH0KKwogICAgIEdPYmplY3QqIG9iamVjdDsKLSAgICBXZWJDb3JlOjpGcmFtZSogZnJh
bWU7Ci0gICAgZ3VpbnQgdGltZXNSZXR1cm5lZDsKLX0gRE9NT2JqZWN0Q2FjaGVEYXRhOworICAg
IHVuc2lnbmVkIGNhY2hlUmVmZXJlbmNlczsKK307CiAKLXR5cGVkZWYgSGFzaE1hcDx2b2lkKiwg
RE9NT2JqZWN0Q2FjaGVEYXRhKj4gRE9NT2JqZWN0TWFwOworY2xhc3MgRE9NT2JqZWN0Q2FjaGVG
cmFtZU9ic2VydmVyOwordHlwZWRlZiBIYXNoTWFwPFdlYkNvcmU6OkZyYW1lKiwgc3RkOjp1bmlx
dWVfcHRyPERPTU9iamVjdENhY2hlRnJhbWVPYnNlcnZlcj4+IERPTU9iamVjdENhY2hlRnJhbWVP
YnNlcnZlck1hcDsKIAotc3RhdGljIERPTU9iamVjdE1hcCYgZG9tT2JqZWN0cygpCitzdGF0aWMg
RE9NT2JqZWN0Q2FjaGVGcmFtZU9ic2VydmVyTWFwJiBkb21PYmplY3RDYWNoZUZyYW1lT2JzZXJ2
ZXJzKCkKIHsKLSAgICBzdGF0aWMgRE9NT2JqZWN0TWFwIHN0YXRpY0RPTU9iamVjdHM7Ci0gICAg
cmV0dXJuIHN0YXRpY0RPTU9iamVjdHM7CisgICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPERPTU9i
amVjdENhY2hlRnJhbWVPYnNlcnZlck1hcD4gbWFwOworICAgIHJldHVybiBtYXA7CiB9CiAKLXN0
YXRpYyBXZWJDb3JlOjpGcmFtZSogZ2V0RnJhbWVGcm9tSGFuZGxlKHZvaWQqIG9iamVjdEhhbmRs
ZSkKK3N0YXRpYyBET01PYmplY3RDYWNoZUZyYW1lT2JzZXJ2ZXImIGdldE9yQ3JlYXRlRE9NT2Jq
ZWN0Q2FjaGVGcmFtZU9ic2VydmVyKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSkKIHsKLSAgICBXZWJD
b3JlOjpOb2RlKiBub2RlID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6Tm9kZSo+KG9iamVjdEhhbmRs
ZSk7Ci0gICAgaWYgKCFub2RlLT5pbkRvY3VtZW50KCkpCi0gICAgICAgIHJldHVybiAwOwotICAg
IHJldHVybiBub2RlLT5kb2N1bWVudCgpLmZyYW1lKCk7CisgICAgYXV0byBvYnNlcnZlclB0ciA9
IGRvbU9iamVjdENhY2hlRnJhbWVPYnNlcnZlcnMoKS5nZXQoZnJhbWUpOworICAgIGlmIChvYnNl
cnZlclB0cikKKyAgICAgICAgcmV0dXJuICpvYnNlcnZlclB0cjsKKworICAgIHN0ZDo6dW5pcXVl
X3B0cjxET01PYmplY3RDYWNoZUZyYW1lT2JzZXJ2ZXI+IG9ic2VydmVyID0gc3RkOjptYWtlX3Vu
aXF1ZTxET01PYmplY3RDYWNoZUZyYW1lT2JzZXJ2ZXI+KGZyYW1lKTsKKyAgICBvYnNlcnZlclB0
ciA9IG9ic2VydmVyLmdldCgpOworICAgIGRvbU9iamVjdENhY2hlRnJhbWVPYnNlcnZlcnMoKS5z
ZXQoZnJhbWUsIFdURjo6bW92ZShvYnNlcnZlcikpOworICAgIHJldHVybiAqb2JzZXJ2ZXJQdHI7
CiB9CiAKLXZvaWQgRE9NT2JqZWN0Q2FjaGU6OmZvcmdldCh2b2lkKiBvYmplY3RIYW5kbGUpCi17
Ci0gICAgRE9NT2JqZWN0Q2FjaGVEYXRhKiBjYWNoZURhdGEgPSBkb21PYmplY3RzKCkuZ2V0KG9i
amVjdEhhbmRsZSk7Ci0gICAgQVNTRVJUKGNhY2hlRGF0YSk7Ci0gICAgZ19zbGljZV9mcmVlKERP
TU9iamVjdENhY2hlRGF0YSwgY2FjaGVEYXRhKTsKLSAgICBkb21PYmplY3RzKCkudGFrZShvYmpl
Y3RIYW5kbGUpOwotfQorY2xhc3MgRE9NT2JqZWN0Q2FjaGVGcmFtZU9ic2VydmVyIGZpbmFsOiBw
dWJsaWMgV2ViQ29yZTo6RnJhbWVEZXN0cnVjdGlvbk9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBE
T01PYmplY3RDYWNoZUZyYW1lT2JzZXJ2ZXIoV2ViQ29yZTo6RnJhbWUqIGZyYW1lKQorICAgICAg
ICA6IEZyYW1lRGVzdHJ1Y3Rpb25PYnNlcnZlcihmcmFtZSkKKyAgICB7CisgICAgfQogCi1zdGF0
aWMgdm9pZCB3ZWFrUmVmTm90aWZ5KGdwb2ludGVyIGRhdGEsIEdPYmplY3QqKQotewotICAgIGdi
b29sZWFuKiBvYmplY3REZWFkID0gc3RhdGljX2Nhc3Q8Z2Jvb2xlYW4qPihkYXRhKTsKLSAgICAq
b2JqZWN0RGVhZCA9IFRSVUU7Ci19CisgICAgfkRPTU9iamVjdENhY2hlRnJhbWVPYnNlcnZlcigp
CisgICAgeworICAgICAgICBBU1NFUlQobV9vYmplY3RzLmlzRW1wdHkoKSk7CisgICAgfQogCi12
b2lkIERPTU9iamVjdENhY2hlOjpjbGVhckJ5RnJhbWUoV2ViQ29yZTo6RnJhbWUqIGZyYW1lKQot
ewotICAgIFZlY3RvcjxET01PYmplY3RDYWNoZURhdGEqPiB0b1VucmVmOwotCi0gICAgLy8gVW5y
ZWZmaW5nIHRoZSBvYmplY3RzIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBjYWNoZSBpbiB0aGVpcgot
ICAgIC8vIGZpbmFsaXplIG1ldGhvZCwgc28ganVzdCBzYXZlIHRoZW0gdG8gZG8gdGhhdCB3aGls
ZSB3ZSBhcmUgbm90Ci0gICAgLy8gaXRlcmF0aW5nIHRoZSBjYWNoZSBpdHNlbGYuCi0gICAgRE9N
T2JqZWN0TWFwOjppdGVyYXRvciBlbmQgPSBkb21PYmplY3RzKCkuZW5kKCk7Ci0gICAgZm9yIChE
T01PYmplY3RNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBkb21PYmplY3RzKCkuYmVnaW4oKTsgaXRlciAh
PSBlbmQ7ICsraXRlcikgewotICAgICAgICBET01PYmplY3RDYWNoZURhdGEqIGRhdGEgPSBpdGVy
LT52YWx1ZTsKLSAgICAgICAgQVNTRVJUKGRhdGEpOwotICAgICAgICBpZiAoKCFmcmFtZSB8fCBk
YXRhLT5mcmFtZSA9PSBmcmFtZSkgJiYgZGF0YS0+dGltZXNSZXR1cm5lZCkKLSAgICAgICAgICAg
IHRvVW5yZWYuYXBwZW5kKGRhdGEpOworICAgIHZvaWQgYWRkT2JqZWN0Q2FjaGVEYXRhKERPTU9i
amVjdENhY2hlRGF0YSogZGF0YSkKKyAgICB7CisgICAgICAgIEFTU0VSVCghbV9vYmplY3RzLmNv
bnRhaW5zKGRhdGEpKTsKKworICAgICAgICBtX29iamVjdHMuYXBwZW5kKGRhdGEpOworICAgICAg
ICBnX29iamVjdF93ZWFrX3JlZihkYXRhLT5vYmplY3QsIERPTU9iamVjdENhY2hlRnJhbWVPYnNl
cnZlcjo6b2JqZWN0RmluYWxpemVkQ2FsbGJhY2ssIHRoaXMpOwogICAgIH0KIAotICAgIFZlY3Rv
cjxET01PYmplY3RDYWNoZURhdGEqPjo6aXRlcmF0b3IgbGFzdCA9IHRvVW5yZWYuZW5kKCk7Ci0g
ICAgZm9yIChWZWN0b3I8RE9NT2JqZWN0Q2FjaGVEYXRhKj46Oml0ZXJhdG9yIGl0ID0gdG9VbnJl
Zi5iZWdpbigpOyBpdCAhPSBsYXN0OyArK2l0KSB7Ci0gICAgICAgIERPTU9iamVjdENhY2hlRGF0
YSogZGF0YSA9ICppdDsKLSAgICAgICAgLy8gV2UgY2FuJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGUg
dXNlciBoYXMgZG9uZSB3aXRoIHRoZSBET00KLSAgICAgICAgLy8gb2JqZWN0cywgc28gaW4gY2Fz
ZSBhbnkgb2YgdGhlIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlbQotICAgICAgICAvLyB3ZXJl
IHVucmVmZmVkIChidXQgbm90IGFsbCwgb3RoZXJ3aXNlIHRoZSBvYmplY3Qgd291bGQgYmUKLSAg
ICAgICAgLy8gZGVhZCBhbmQgb3V0IG9mIHRoZSBjYWNoZSkgd2UnbGwgYWRkIGEgd2VhayByZWYg
YmVmb3JlIHdlCi0gICAgICAgIC8vIHN0YXJ0IHRvIGdldCByaWQgb2YgdGhlIGNhY2hlJ3Mgb3du
IHJlZmVyZW5jZXM7IGlmIHRoZQotICAgICAgICAvLyBvYmplY3QgZGllcyBpbiB0aGUgbWlkZGxl
IG9mIHRoZSBwcm9jZXNzLCB3ZSdsbCBqdXN0IHN0b3AuCi0gICAgICAgIGdib29sZWFuIG9iamVj
dERlYWQgPSBGQUxTRTsKLSAgICAgICAgZ19vYmplY3Rfd2Vha19yZWYoZGF0YS0+b2JqZWN0LCB3
ZWFrUmVmTm90aWZ5LCAmb2JqZWN0RGVhZCk7Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sg
b2JqZWN0RGVhZCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBjYWNoZSBkYXRhCi0gICAgICAgIC8vIG1p
Z2h0IGJlIGdhcmJhZ2UgYWxyZWFkeS4KLSAgICAgICAgd2hpbGUgKCFvYmplY3REZWFkICYmIGRh
dGEtPnRpbWVzUmV0dXJuZWQgPiAwKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBs
YXN0IHVucmVmIHdlIGFyZSBnb2luZyB0byBkbywKLSAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3Qg
dGhlIHdlYWsgcmVmLiBXZSBjYW5ub3QgZG8gaXQgYWZ0ZXJ3YXJkcwotICAgICAgICAgICAgLy8g
YmVjYXVzZSB0aGUgb2JqZWN0IG1pZ2h0IGJlIGRlYWQgYXQgdGhhdCBwb2ludC4KLSAgICAgICAg
ICAgIGlmIChkYXRhLT50aW1lc1JldHVybmVkID09IDEpIHsKLSAgICAgICAgICAgICAgICBnX29i
amVjdF93ZWFrX3VucmVmKGRhdGEtPm9iamVjdCwgd2Vha1JlZk5vdGlmeSwgJm9iamVjdERlYWQp
OwotICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBuZXh0IHRpbWUgdGhlIERP
TU9iamVjdCBpcwotICAgICAgICAgICAgICAgIC8vIHVucmVmJ2VkIGl0IHdpbGwgYmUgZmluYWxp
emVkLAotICAgICAgICAgICAgICAgIC8vIERPTU9iamVjdDo6ZmluYWxpemUoKSB3aWxsIGNhbGwK
LSAgICAgICAgICAgICAgICAvLyBET01PYmplY3RDYWNoZTo6Zm9yZ2V0KCksIHdoaWNoIHdpbGwg
ZnJlZSAnZGF0YScuCi0gICAgICAgICAgICAgICAgLy8gVG9nZ2xpbmcgJ29iamVjdERlYWQnIGhl
cmUgd2lsbCBlbnN1cmUgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAvLyBkZXJlZmVyZW5jZSBh
biBpbnZhbGlkIHBvaW50ZXIgaW4gdGhlIG5leHQKLSAgICAgICAgICAgICAgICAvLyBpdGVyYXRp
b24uCi0gICAgICAgICAgICAgICAgb2JqZWN0RGVhZCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBkYXRhLT50aW1lc1JldHVybmVkLS07Ci0gICAgICAgICAgICBnX29iamVjdF91
bnJlZihkYXRhLT5vYmplY3QpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9pZCBvYmplY3RGaW5h
bGl6ZWRDYWxsYmFjayhncG9pbnRlciB1c2VyRGF0YSwgR09iamVjdCogZmluYWxpemVkT2JqZWN0
KQorICAgIHsKKyAgICAgICAgRE9NT2JqZWN0Q2FjaGVGcmFtZU9ic2VydmVyKiBvYnNlcnZlciA9
IHN0YXRpY19jYXN0PERPTU9iamVjdENhY2hlRnJhbWVPYnNlcnZlcio+KHVzZXJEYXRhKTsKKyAg
ICAgICAgb2JzZXJ2ZXItPm1fb2JqZWN0cy5yZW1vdmVGaXJzdE1hdGNoaW5nKFtmaW5hbGl6ZWRP
YmplY3RdKERPTU9iamVjdENhY2hlRGF0YSogZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIGRh
dGEtPm9iamVjdCA9PSBmaW5hbGl6ZWRPYmplY3Q7CisgICAgICAgIH0pOworICAgIH0KKworICAg
IHZvaWQgY2xlYXIoKQorICAgIHsKKyAgICAgICAgaWYgKG1fb2JqZWN0cy5pc0VtcHR5KCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYXV0byBvYmplY3RzID0gV1RGOjptb3ZlKG1f
b2JqZWN0cyk7CisgICAgICAgIGZvciAoYXV0byBkYXRhIDogb2JqZWN0cykgeworICAgICAgICAg
ICAgZ19vYmplY3Rfd2Vha191bnJlZihkYXRhLT5vYmplY3QsIERPTU9iamVjdENhY2hlRnJhbWVP
YnNlcnZlcjo6b2JqZWN0RmluYWxpemVkQ2FsbGJhY2ssIHRoaXMpOworICAgICAgICAgICAgZGF0
YS0+Y2xlYXJPYmplY3QoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB3
aWxsRGV0YWNoUGFnZSgpIG92ZXJyaWRlCisgICAgeworICAgICAgICBjbGVhcigpOworICAgIH0K
KworICAgIHZpcnR1YWwgdm9pZCBmcmFtZURlc3Ryb3llZCgpIG92ZXJyaWRlCisgICAgeworICAg
ICAgICBjbGVhcigpOworICAgICAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBtX2ZyYW1lOwor
ICAgICAgICBGcmFtZURlc3RydWN0aW9uT2JzZXJ2ZXI6OmZyYW1lRGVzdHJveWVkKCk7CisgICAg
ICAgIGRvbU9iamVjdENhY2hlRnJhbWVPYnNlcnZlcnMoKS5yZW1vdmUoZnJhbWUpOworICAgIH0K
KworICAgIFZlY3RvcjxET01PYmplY3RDYWNoZURhdGEqPiBtX29iamVjdHM7Cit9OworCit0eXBl
ZGVmIEhhc2hNYXA8dm9pZCosIHN0ZDo6dW5pcXVlX3B0cjxET01PYmplY3RDYWNoZURhdGE+PiBE
T01PYmplY3RNYXA7CisKK3N0YXRpYyBET01PYmplY3RNYXAmIGRvbU9iamVjdHMoKQoreworICAg
IHN0YXRpYyBOZXZlckRlc3Ryb3llZDxET01PYmplY3RNYXA+IHN0YXRpY0RPTU9iamVjdHM7Cisg
ICAgcmV0dXJuIHN0YXRpY0RPTU9iamVjdHM7CiB9CiAKLURPTU9iamVjdENhY2hlOjp+RE9NT2Jq
ZWN0Q2FjaGUoKQordm9pZCBET01PYmplY3RDYWNoZTo6Zm9yZ2V0KHZvaWQqIG9iamVjdEhhbmRs
ZSkKIHsKLSAgICBjbGVhckJ5RnJhbWUoKTsKKyAgICBBU1NFUlQoZG9tT2JqZWN0cygpLmNvbnRh
aW5zKG9iamVjdEhhbmRsZSkpOworICAgIGRvbU9iamVjdHMoKS5yZW1vdmUob2JqZWN0SGFuZGxl
KTsKIH0KIAogdm9pZCogRE9NT2JqZWN0Q2FjaGU6OmdldCh2b2lkKiBvYmplY3RIYW5kbGUpCiB7
CiAgICAgRE9NT2JqZWN0Q2FjaGVEYXRhKiBkYXRhID0gZG9tT2JqZWN0cygpLmdldChvYmplY3RI
YW5kbGUpOwotICAgIGlmICghZGF0YSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBXZSB3
YW50IHRvIGFkZCBvbmUgcmVmIGVhY2ggdGltZSBhIHdyYXBwZXIgaXMgcmV0dXJuZWQsIHNvIHRo
YXQKLSAgICAvLyB0aGUgdXNlciBjYW4gbWFudWFsbHkgdW5yZWYgdGhlbSBpZiBoZSBjaG9vc2Vz
IHRvLgotICAgIEFTU0VSVChkYXRhLT5vYmplY3QpOwotICAgIGRhdGEtPnRpbWVzUmV0dXJuZWQr
KzsKLSAgICByZXR1cm4gZ19vYmplY3RfcmVmKGRhdGEtPm9iamVjdCk7CisgICAgcmV0dXJuIGRh
dGEgPyBkYXRhLT5yZWZPYmplY3QoKSA6IG51bGxwdHI7CiB9CiAKLXZvaWQqIERPTU9iamVjdENh
Y2hlOjpwdXQodm9pZCogb2JqZWN0SGFuZGxlLCB2b2lkKiB3cmFwcGVyKQordm9pZCBET01PYmpl
Y3RDYWNoZTo6cHV0KHZvaWQqIG9iamVjdEhhbmRsZSwgdm9pZCogd3JhcHBlcikKIHsKICAgICBp
ZiAoZG9tT2JqZWN0cygpLmdldChvYmplY3RIYW5kbGUpKQotICAgICAgICByZXR1cm4gd3JhcHBl
cjsKLQotICAgIERPTU9iamVjdENhY2hlRGF0YSogZGF0YSA9IGdfc2xpY2VfbmV3KERPTU9iamVj
dENhY2hlRGF0YSk7Ci0gICAgZGF0YS0+b2JqZWN0ID0gc3RhdGljX2Nhc3Q8R09iamVjdCo+KHdy
YXBwZXIpOwotICAgIGRhdGEtPmZyYW1lID0gMDsKLSAgICBkYXRhLT50aW1lc1JldHVybmVkID0g
MTsKLQotICAgIGRvbU9iamVjdHMoKS5zZXQob2JqZWN0SGFuZGxlLCBkYXRhKTsKLSAgICByZXR1
cm4gd3JhcHBlcjsKKyAgICAgICAgcmV0dXJuOworICAgIGRvbU9iamVjdHMoKS5zZXQob2JqZWN0
SGFuZGxlLCBzdGQ6Om1ha2VfdW5pcXVlPERPTU9iamVjdENhY2hlRGF0YT4oR19PQkpFQ1Qod3Jh
cHBlcikpKTsKIH0KIAotdm9pZCogRE9NT2JqZWN0Q2FjaGU6OnB1dChXZWJDb3JlOjpOb2RlKiBv
YmplY3RIYW5kbGUsIHZvaWQqIHdyYXBwZXIpCit2b2lkIERPTU9iamVjdENhY2hlOjpwdXQoV2Vi
Q29yZTo6Tm9kZSogb2JqZWN0SGFuZGxlLCB2b2lkKiB3cmFwcGVyKQogewotICAgIC8vIGNhbGwg
dGhlIDo6cHV0IHZlcnNpb24gdGhhdCB0YWtlcyB2b2lkKiB0byBkbyB0aGUgYmFzaWMgY2FjaGUK
LSAgICAvLyBpbnNlcnRpb24gd29yawotICAgIHB1dChzdGF0aWNfY2FzdDx2b2lkKj4ob2JqZWN0
SGFuZGxlKSwgd3JhcHBlcik7Ci0KLSAgICBET01PYmplY3RDYWNoZURhdGEqIGRhdGEgPSBkb21P
YmplY3RzKCkuZ2V0KG9iamVjdEhhbmRsZSk7Ci0gICAgQVNTRVJUKGRhdGEpOworICAgIGlmIChk
b21PYmplY3RzKCkuZ2V0KG9iamVjdEhhbmRsZSkpCisgICAgICAgIHJldHVybjsKIAotICAgIGRh
dGEtPmZyYW1lID0gZ2V0RnJhbWVGcm9tSGFuZGxlKG9iamVjdEhhbmRsZSk7CisgICAgc3RkOjp1
bmlxdWVfcHRyPERPTU9iamVjdENhY2hlRGF0YT4gZGF0YSA9IHN0ZDo6bWFrZV91bmlxdWU8RE9N
T2JqZWN0Q2FjaGVEYXRhPihHX09CSkVDVCh3cmFwcGVyKSk7CisgICAgYXV0byBkYXRhUHRyID0g
ZGF0YS5nZXQoKTsKKyAgICBkb21PYmplY3RzKCkuc2V0KG9iamVjdEhhbmRsZSwgV1RGOjptb3Zl
KGRhdGEpKTsKIAotICAgIHJldHVybiB3cmFwcGVyOworICAgIGlmIChXZWJDb3JlOjpGcmFtZSog
ZnJhbWUgPSBvYmplY3RIYW5kbGUtPmRvY3VtZW50KCkuZnJhbWUoKSkKKyAgICAgICAgZ2V0T3JD
cmVhdGVET01PYmplY3RDYWNoZUZyYW1lT2JzZXJ2ZXIoZnJhbWUpLmFkZE9iamVjdENhY2hlRGF0
YShkYXRhUHRyKTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
Z29iamVjdC9ET01PYmplY3RDYWNoZS5oIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvZ29iamVj
dC9ET01PYmplY3RDYWNoZS5oCmluZGV4IDU2OGU4YjYuLmUzZTlmYzMgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2JpbmRpbmdzL2dvYmplY3QvRE9NT2JqZWN0Q2FjaGUuaAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9nb2JqZWN0L0RPTU9iamVjdENhY2hlLmgKQEAgLTIxLDE4ICsy
MSwxNSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBOb2RlOwotY2xhc3MgRnJhbWU7
CiB9OwogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIGNsYXNzIERPTU9iamVjdENhY2hlIHsKIHB1Ymxp
YzoKICAgICBzdGF0aWMgdm9pZCogZ2V0KHZvaWQqIG9iamVjdEhhbmRsZSk7Ci0gICAgc3RhdGlj
IHZvaWQqIHB1dCh2b2lkKiBvYmplY3RIYW5kbGUsIHZvaWQqIHdyYXBwZXIpOwotICAgIHN0YXRp
YyB2b2lkKiBwdXQoV2ViQ29yZTo6Tm9kZSogb2JqZWN0SGFuZGxlLCB2b2lkKiB3cmFwcGVyKTsK
LSAgICBzdGF0aWMgdm9pZCBjbGVhckJ5RnJhbWUoV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gMCk7
CisgICAgc3RhdGljIHZvaWQgcHV0KHZvaWQqIG9iamVjdEhhbmRsZSwgdm9pZCogd3JhcHBlcik7
CisgICAgc3RhdGljIHZvaWQgcHV0KFdlYkNvcmU6Ok5vZGUqIG9iamVjdEhhbmRsZSwgdm9pZCog
d3JhcHBlcik7CiAgICAgc3RhdGljIHZvaWQgZm9yZ2V0KHZvaWQqIG9iamVjdEhhbmRsZSk7Ci0g
ICAgfkRPTU9iamVjdENhY2hlKCk7CiB9OwogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CiAKZGlmZiAt
LWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAxNmI4ZGI4Li4x
ODAwN2IxIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9n
CkBAIC0xLDUgKzEsMzQgQEAKIDIwMTUtMDItMTYgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dh
cmNpYUBpZ2FsaWEuY29tPgogCisgICAgICAgIFtHVEtdIEdPYmplY3QgRE9NIGJpbmRpbmdzIG9i
amVjdCBhcmUgY2FjaGVkIGZvcmV2ZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE0MTU1OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEFkZCBjaGVja3MgZm9yIGFsbCBET00gb2JqZWN0cyB0byBlbnN1cmUg
dGhleSBhcmUgbm90IGxlYWtlZC4gQWxzbworICAgICAgICBhZGQgYSBkZWRpY2F0ZWQgdGVzdCBm
b3IgdGhlIERPTSBPYmplY3QgQ2FjaGUuCisKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rlc3Rz
L1dlYktpdDJHdGsvRE9NTm9kZUZpbHRlclRlc3QuY3BwOgorICAgICAgICAoV2ViS2l0RE9NTm9k
ZUZpbHRlclRlc3Q6OnRlc3RUcmVlV2Fsa2VyKToKKyAgICAgICAgKFdlYktpdERPTU5vZGVGaWx0
ZXJUZXN0Ojp0ZXN0Tm9kZUl0ZXJhdG9yKToKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rlc3Rz
L1dlYktpdDJHdGsvRE9NTm9kZVRlc3QuY3BwOgorICAgICAgICAoV2ViS2l0RE9NTm9kZVRlc3Q6
OnRlc3RIaWVyYXJjaHlOYXZpZ2F0aW9uKToKKyAgICAgICAgKFdlYktpdERPTU5vZGVUZXN0Ojp0
ZXN0SW5zZXJ0aW9uKToKKyAgICAgICAgKFdlYktpdERPTU5vZGVUZXN0Ojp0ZXN0VGFnTmFtZXMp
OgorICAgICAgICAoV2ViS2l0RE9NTm9kZVRlc3Q6OnRlc3RET01DYWNoZSk6CisgICAgICAgIChy
ZWdpc3RlclRlc3RzKToKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDJHdGsv
RE9NWFBhdGhOU1Jlc29sdmVyVGVzdC5jcHA6CisgICAgICAgIChXZWJLaXRET01YUGF0aE5TUmVz
b2x2ZXJUZXN0OjpldmFsdWF0ZUZvb0NoaWxkVGV4dEFuZENoZWNrUmVzdWx0KToKKyAgICAgICAg
KFdlYktpdERPTVhQYXRoTlNSZXNvbHZlclRlc3Q6OnRlc3RYUGF0aE5TUmVzb2x2ZXJOYXRpdmUp
OgorICAgICAgICAoV2ViS2l0RE9NWFBhdGhOU1Jlc29sdmVyVGVzdDo6dGVzdFhQYXRoTlNSZXNv
bHZlckN1c3RvbSk6CisgICAgICAgICogVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXQyR3RrL1Rl
c3RET01Ob2RlLmNwcDoKKyAgICAgICAgKHRlc3RXZWJLaXRET01PYmplY3RDYWNoZSk6CisgICAg
ICAgIChiZWZvcmVBbGwpOgorICAgICAgICAqIFRlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Mkd0
ay9XZWJFeHRlbnNpb25UZXN0LmNwcDoKKyAgICAgICAgKGRvY3VtZW50TG9hZGVkQ2FsbGJhY2sp
OgorCisyMDE1LTAyLTE2ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNv
bT4KKwogICAgICAgICBbR1RLXSBXZWJLaXRGcmFtZSBvYmplY3RzIGFyZSBuZXZlciByZWxlYXNl
ZAogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNjQx
CiAKZGlmZiAtLWdpdCBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Mkd0ay9ET01O
b2RlRmlsdGVyVGVzdC5jcHAgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDJHdGsv
RE9NTm9kZUZpbHRlclRlc3QuY3BwCmluZGV4IDI0YjM1ODkuLmVlNWUwZTMgMTAwNjQ0Ci0tLSBh
L1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Mkd0ay9ET01Ob2RlRmlsdGVyVGVzdC5j
cHAKKysrIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXQyR3RrL0RPTU5vZGVGaWx0
ZXJUZXN0LmNwcApAQCAtNjYsMTcgKzY2LDIxIEBAIHByaXZhdGU6CiAgICAgewogICAgICAgICBX
ZWJLaXRET01Eb2N1bWVudCogZG9jdW1lbnQgPSB3ZWJraXRfd2ViX3BhZ2VfZ2V0X2RvbV9kb2N1
bWVudChwYWdlKTsKICAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19ET0NVTUVOVChkb2N1
bWVudCkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdf
T0JKRUNUKGRvY3VtZW50KSk7CiAKICAgICAgICAgV2ViS2l0RE9NRWxlbWVudCogcm9vdCA9IHdl
YmtpdF9kb21fZG9jdW1lbnRfZ2V0X2VsZW1lbnRfYnlfaWQoZG9jdW1lbnQsICJyb290Iik7CiAg
ICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfTk9ERShyb290KSk7CisgICAgICAgIGFzc2Vy
dE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1Qocm9vdCkpOwogCiAgICAg
ICAgIC8vIE5vIGZpbHRlci4KLSAgICAgICAgV2ViS2l0RE9NVHJlZVdhbGtlciogd2Fsa2VyID0g
d2Via2l0X2RvbV9kb2N1bWVudF9jcmVhdGVfdHJlZV93YWxrZXIoZG9jdW1lbnQsIFdFQktJVF9E
T01fTk9ERShyb290KSwgV0VCS0lUX0RPTV9OT0RFX0ZJTFRFUl9TSE9XX0FMTCwgbnVsbHB0ciwg
RkFMU0UsIG51bGxwdHIpOwotICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX1RSRUVfV0FM
S0VSKHdhbGtlcikpOwotICAgICAgICBnX2Fzc2VydCghd2Via2l0X2RvbV90cmVlX3dhbGtlcl9n
ZXRfZmlsdGVyKHdhbGtlcikpOworICAgICAgICBHUmVmUHRyPFdlYktpdERPTVRyZWVXYWxrZXI+
IHdhbGtlciA9IGFkb3B0R1JlZih3ZWJraXRfZG9tX2RvY3VtZW50X2NyZWF0ZV90cmVlX3dhbGtl
cihkb2N1bWVudCwgV0VCS0lUX0RPTV9OT0RFKHJvb3QpLCBXRUJLSVRfRE9NX05PREVfRklMVEVS
X1NIT1dfQUxMLCBudWxscHRyLCBGQUxTRSwgbnVsbHB0cikpOworICAgICAgICBnX2Fzc2VydChX
RUJLSVRfRE9NX0lTX1RSRUVfV0FMS0VSKHdhbGtlci5nZXQoKSkpOworICAgICAgICBhc3NlcnRP
YmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNUKHdhbGtlci5nZXQoKSkpOwor
ICAgICAgICBnX2Fzc2VydCghd2Via2l0X2RvbV90cmVlX3dhbGtlcl9nZXRfZmlsdGVyKHdhbGtl
ci5nZXQoKSkpOwogCiAgICAgICAgIHVuc2lnbmVkIGkgPSAwOwotICAgICAgICBmb3IgKFdlYktp
dERPTU5vZGUqIG5vZGUgPSBXRUJLSVRfRE9NX05PREUocm9vdCk7IG5vZGU7IG5vZGUgPSB3ZWJr
aXRfZG9tX3RyZWVfd2Fsa2VyX25leHRfbm9kZSh3YWxrZXIpLCArK2kpIHsKKyAgICAgICAgZm9y
IChXZWJLaXRET01Ob2RlKiBub2RlID0gV0VCS0lUX0RPTV9OT0RFKHJvb3QpOyBub2RlOyBub2Rl
ID0gd2Via2l0X2RvbV90cmVlX3dhbGtlcl9uZXh0X25vZGUod2Fsa2VyLmdldCgpKSwgKytpKSB7
CisgICAgICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JK
RUNUKG5vZGUpKTsKICAgICAgICAgICAgIGdfYXNzZXJ0X2NtcHVpbnQoaSwgPCwgR19OX0VMRU1F
TlRTKGV4cGVjdGVkTm9kZXNBbGwpKTsKICAgICAgICAgICAgIEdVbmlxdWVQdHI8Y2hhcj4gbm9k
ZU5hbWUod2Via2l0X2RvbV9ub2RlX2dldF9ub2RlX25hbWUobm9kZSkpOwogICAgICAgICAgICAg
Z19hc3NlcnRfY21wc3RyKG5vZGVOYW1lLmdldCgpLCA9PSwgZXhwZWN0ZWROb2Rlc0FsbFtpXSk7
CkBAIC04NSwxMiArODksMTQgQEAgcHJpdmF0ZToKIAogICAgICAgICAvLyBJbnB1dCBlbGVtZW50
cyBmaWx0ZXIuCiAgICAgICAgIEdSZWZQdHI8V2ViS2l0RE9NTm9kZUZpbHRlcj4gZmlsdGVyID0g
YWRvcHRHUmVmKHN0YXRpY19jYXN0PFdlYktpdERPTU5vZGVGaWx0ZXIqPihnX29iamVjdF9uZXco
d2Via2l0X25vZGVfZmlsdGVyX2dldF90eXBlKCksIG51bGxwdHIpKSk7Ci0gICAgICAgIHdhbGtl
ciA9IHdlYmtpdF9kb21fZG9jdW1lbnRfY3JlYXRlX3RyZWVfd2Fsa2VyKGRvY3VtZW50LCBXRUJL
SVRfRE9NX05PREUocm9vdCksIFdFQktJVF9ET01fTk9ERV9GSUxURVJfU0hPV19BTEwsIGZpbHRl
ci5nZXQoKSwgRkFMU0UsIG51bGxwdHIpOwotICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lT
X1RSRUVfV0FMS0VSKHdhbGtlcikpOwotICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX3RyZWVf
d2Fsa2VyX2dldF9maWx0ZXIod2Fsa2VyKSA9PSBmaWx0ZXIuZ2V0KCkpOworICAgICAgICB3YWxr
ZXIgPSBhZG9wdEdSZWYod2Via2l0X2RvbV9kb2N1bWVudF9jcmVhdGVfdHJlZV93YWxrZXIoZG9j
dW1lbnQsIFdFQktJVF9ET01fTk9ERShyb290KSwgV0VCS0lUX0RPTV9OT0RFX0ZJTFRFUl9TSE9X
X0FMTCwgZmlsdGVyLmdldCgpLCBGQUxTRSwgbnVsbHB0cikpOworICAgICAgICBnX2Fzc2VydChX
RUJLSVRfRE9NX0lTX1RSRUVfV0FMS0VSKHdhbGtlci5nZXQoKSkpOworICAgICAgICBhc3NlcnRP
YmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNUKGZpbHRlci5nZXQoKSkpOwor
ICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX3RyZWVfd2Fsa2VyX2dldF9maWx0ZXIod2Fsa2Vy
LmdldCgpKSA9PSBmaWx0ZXIuZ2V0KCkpOwogCiAgICAgICAgIGkgPSAwOwotICAgICAgICBmb3Ig
KFdlYktpdERPTU5vZGUqIG5vZGUgPSBXRUJLSVRfRE9NX05PREUocm9vdCk7IG5vZGU7IG5vZGUg
PSB3ZWJraXRfZG9tX3RyZWVfd2Fsa2VyX25leHRfbm9kZSh3YWxrZXIpLCArK2kpIHsKKyAgICAg
ICAgZm9yIChXZWJLaXRET01Ob2RlKiBub2RlID0gV0VCS0lUX0RPTV9OT0RFKHJvb3QpOyBub2Rl
OyBub2RlID0gd2Via2l0X2RvbV90cmVlX3dhbGtlcl9uZXh0X25vZGUod2Fsa2VyLmdldCgpKSwg
KytpKSB7CisgICAgICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVz
KEdfT0JKRUNUKG5vZGUpKTsKICAgICAgICAgICAgIGdfYXNzZXJ0X2NtcHVpbnQoaSwgPCwgR19O
X0VMRU1FTlRTKGV4cGVjdGVkTm9kZXNOb0lucHV0KSk7CiAgICAgICAgICAgICBHVW5pcXVlUHRy
PGNoYXI+IG5vZGVOYW1lKHdlYmtpdF9kb21fbm9kZV9nZXRfbm9kZV9uYW1lKG5vZGUpKTsKICAg
ICAgICAgICAgIGdfYXNzZXJ0X2NtcHN0cihub2RlTmFtZS5nZXQoKSwgPT0sIGV4cGVjdGVkTm9k
ZXNOb0lucHV0W2ldKTsKQEAgLTk4LDEyICsxMDQsMTQgQEAgcHJpdmF0ZToKICAgICAgICAgZ19h
c3NlcnRfY21wdWludChpLCA9PSwgR19OX0VMRU1FTlRTKGV4cGVjdGVkTm9kZXNOb0lucHV0KSk7
CiAKICAgICAgICAgLy8gU2hvdyBvbmx5IGVsZW1lbnRzLCByZXVzaW5nIHRoZSBpbnB1dCBmaWx0
ZXIuCi0gICAgICAgIHdhbGtlciA9IHdlYmtpdF9kb21fZG9jdW1lbnRfY3JlYXRlX3RyZWVfd2Fs
a2VyKGRvY3VtZW50LCBXRUJLSVRfRE9NX05PREUocm9vdCksIFdFQktJVF9ET01fTk9ERV9GSUxU
RVJfU0hPV19FTEVNRU5ULCBmaWx0ZXIuZ2V0KCksIEZBTFNFLCBudWxscHRyKTsKLSAgICAgICAg
Z19hc3NlcnQoV0VCS0lUX0RPTV9JU19UUkVFX1dBTEtFUih3YWxrZXIpKTsKLSAgICAgICAgZ19h
c3NlcnQod2Via2l0X2RvbV90cmVlX3dhbGtlcl9nZXRfZmlsdGVyKHdhbGtlcikgPT0gZmlsdGVy
LmdldCgpKTsKKyAgICAgICAgd2Fsa2VyID0gYWRvcHRHUmVmKHdlYmtpdF9kb21fZG9jdW1lbnRf
Y3JlYXRlX3RyZWVfd2Fsa2VyKGRvY3VtZW50LCBXRUJLSVRfRE9NX05PREUocm9vdCksIFdFQktJ
VF9ET01fTk9ERV9GSUxURVJfU0hPV19FTEVNRU5ULCBmaWx0ZXIuZ2V0KCksIEZBTFNFLCBudWxs
cHRyKSk7CisgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfVFJFRV9XQUxLRVIod2Fsa2Vy
LmdldCgpKSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMo
R19PQkpFQ1Qod2Fsa2VyLmdldCgpKSk7CisgICAgICAgIGdfYXNzZXJ0KHdlYmtpdF9kb21fdHJl
ZV93YWxrZXJfZ2V0X2ZpbHRlcih3YWxrZXIuZ2V0KCkpID09IGZpbHRlci5nZXQoKSk7CiAKICAg
ICAgICAgaSA9IDA7Ci0gICAgICAgIGZvciAoV2ViS2l0RE9NTm9kZSogbm9kZSA9IFdFQktJVF9E
T01fTk9ERShyb290KTsgbm9kZTsgbm9kZSA9IHdlYmtpdF9kb21fdHJlZV93YWxrZXJfbmV4dF9u
b2RlKHdhbGtlciksICsraSkgeworICAgICAgICBmb3IgKFdlYktpdERPTU5vZGUqIG5vZGUgPSBX
RUJLSVRfRE9NX05PREUocm9vdCk7IG5vZGU7IG5vZGUgPSB3ZWJraXRfZG9tX3RyZWVfd2Fsa2Vy
X25leHRfbm9kZSh3YWxrZXIuZ2V0KCkpLCArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydE9iamVj
dElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1Qobm9kZSkpOwogICAgICAgICAgICAg
Z19hc3NlcnRfY21wdWludChpLCA8LCBHX05fRUxFTUVOVFMoZXhwZWN0ZWRFbGVtZW50c05vSW5w
dXQpKTsKICAgICAgICAgICAgIEdVbmlxdWVQdHI8Y2hhcj4gbm9kZU5hbWUod2Via2l0X2RvbV9u
b2RlX2dldF9ub2RlX25hbWUobm9kZSkpOwogICAgICAgICAgICAgZ19hc3NlcnRfY21wc3RyKG5v
ZGVOYW1lLmdldCgpLCA9PSwgZXhwZWN0ZWRFbGVtZW50c05vSW5wdXRbaV0pOwpAQCAtMTE3LDE3
ICsxMjUsMjEgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgICAgIFdlYktpdERPTURvY3VtZW50KiBk
b2N1bWVudCA9IHdlYmtpdF93ZWJfcGFnZV9nZXRfZG9tX2RvY3VtZW50KHBhZ2UpOwogICAgICAg
ICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX0RPQ1VNRU5UKGRvY3VtZW50KSk7CisgICAgICAgIGFz
c2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QoZG9jdW1lbnQpKTsK
IAogICAgICAgICBXZWJLaXRET01FbGVtZW50KiByb290ID0gd2Via2l0X2RvbV9kb2N1bWVudF9n
ZXRfZWxlbWVudF9ieV9pZChkb2N1bWVudCwgInJvb3QiKTsKICAgICAgICAgZ19hc3NlcnQoV0VC
S0lUX0RPTV9JU19OT0RFKHJvb3QpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hl
blRlc3RGaW5pc2hlcyhHX09CSkVDVChyb290KSk7CiAKICAgICAgICAgLy8gTm8gZmlsdGVyLgot
ICAgICAgICBXZWJLaXRET01Ob2RlSXRlcmF0b3IqIGl0ZXIgPSB3ZWJraXRfZG9tX2RvY3VtZW50
X2NyZWF0ZV9ub2RlX2l0ZXJhdG9yKGRvY3VtZW50LCBXRUJLSVRfRE9NX05PREUocm9vdCksIFdF
QktJVF9ET01fTk9ERV9GSUxURVJfU0hPV19BTEwsIG51bGxwdHIsIEZBTFNFLCBudWxscHRyKTsK
LSAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19OT0RFX0lURVJBVE9SKGl0ZXIpKTsKLSAg
ICAgICAgZ19hc3NlcnQoIXdlYmtpdF9kb21fbm9kZV9pdGVyYXRvcl9nZXRfZmlsdGVyKGl0ZXIp
KTsKKyAgICAgICAgR1JlZlB0cjxXZWJLaXRET01Ob2RlSXRlcmF0b3I+IGl0ZXIgPSBhZG9wdEdS
ZWYod2Via2l0X2RvbV9kb2N1bWVudF9jcmVhdGVfbm9kZV9pdGVyYXRvcihkb2N1bWVudCwgV0VC
S0lUX0RPTV9OT0RFKHJvb3QpLCBXRUJLSVRfRE9NX05PREVfRklMVEVSX1NIT1dfQUxMLCBudWxs
cHRyLCBGQUxTRSwgbnVsbHB0cikpOworICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX05P
REVfSVRFUkFUT1IoaXRlci5nZXQoKSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRX
aGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNUKGl0ZXIuZ2V0KCkpKTsKKyAgICAgICAgZ19hc3NlcnQo
IXdlYmtpdF9kb21fbm9kZV9pdGVyYXRvcl9nZXRfZmlsdGVyKGl0ZXIuZ2V0KCkpKTsKIAogICAg
ICAgICB1bnNpZ25lZCBpID0gMDsKLSAgICAgICAgd2hpbGUgKFdlYktpdERPTU5vZGUqIG5vZGUg
PSB3ZWJraXRfZG9tX25vZGVfaXRlcmF0b3JfbmV4dF9ub2RlKGl0ZXIsIG51bGxwdHIpKSB7Cisg
ICAgICAgIHdoaWxlIChXZWJLaXRET01Ob2RlKiBub2RlID0gd2Via2l0X2RvbV9ub2RlX2l0ZXJh
dG9yX25leHRfbm9kZShpdGVyLmdldCgpLCBudWxscHRyKSkgeworICAgICAgICAgICAgYXNzZXJ0
T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChub2RlKSk7CiAgICAgICAg
ICAgICBnX2Fzc2VydF9jbXB1aW50KGksIDwsIEdfTl9FTEVNRU5UUyhleHBlY3RlZE5vZGVzQWxs
KSk7CiAgICAgICAgICAgICBHVW5pcXVlUHRyPGNoYXI+IG5vZGVOYW1lKHdlYmtpdF9kb21fbm9k
ZV9nZXRfbm9kZV9uYW1lKG5vZGUpKTsKICAgICAgICAgICAgIGdfYXNzZXJ0X2NtcHN0cihub2Rl
TmFtZS5nZXQoKSwgPT0sIGV4cGVjdGVkTm9kZXNBbGxbaV0pOwpAQCAtMTM3LDEyICsxNDksMTQg
QEAgcHJpdmF0ZToKIAogICAgICAgICAvLyBJbnB1dCBlbGVtZW50cyBmaWx0ZXIuCiAgICAgICAg
IEdSZWZQdHI8V2ViS2l0RE9NTm9kZUZpbHRlcj4gZmlsdGVyID0gYWRvcHRHUmVmKHN0YXRpY19j
YXN0PFdlYktpdERPTU5vZGVGaWx0ZXIqPihnX29iamVjdF9uZXcod2Via2l0X25vZGVfZmlsdGVy
X2dldF90eXBlKCksIG51bGxwdHIpKSk7Ci0gICAgICAgIGl0ZXIgPSB3ZWJraXRfZG9tX2RvY3Vt
ZW50X2NyZWF0ZV9ub2RlX2l0ZXJhdG9yKGRvY3VtZW50LCBXRUJLSVRfRE9NX05PREUocm9vdCks
IFdFQktJVF9ET01fTk9ERV9GSUxURVJfU0hPV19BTEwsIGZpbHRlci5nZXQoKSwgRkFMU0UsIG51
bGxwdHIpOwotICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX05PREVfSVRFUkFUT1IoaXRl
cikpOwotICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX25vZGVfaXRlcmF0b3JfZ2V0X2ZpbHRl
cihpdGVyKSA9PSBmaWx0ZXIuZ2V0KCkpOworICAgICAgICBpdGVyID0gYWRvcHRHUmVmKHdlYmtp
dF9kb21fZG9jdW1lbnRfY3JlYXRlX25vZGVfaXRlcmF0b3IoZG9jdW1lbnQsIFdFQktJVF9ET01f
Tk9ERShyb290KSwgV0VCS0lUX0RPTV9OT0RFX0ZJTFRFUl9TSE9XX0FMTCwgZmlsdGVyLmdldCgp
LCBGQUxTRSwgbnVsbHB0cikpOworICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX05PREVf
SVRFUkFUT1IoaXRlci5nZXQoKSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVu
VGVzdEZpbmlzaGVzKEdfT0JKRUNUKGl0ZXIuZ2V0KCkpKTsKKyAgICAgICAgZ19hc3NlcnQod2Vi
a2l0X2RvbV9ub2RlX2l0ZXJhdG9yX2dldF9maWx0ZXIoaXRlci5nZXQoKSkgPT0gZmlsdGVyLmdl
dCgpKTsKIAogICAgICAgICBpID0gMDsKLSAgICAgICAgd2hpbGUgKFdlYktpdERPTU5vZGUqIG5v
ZGUgPSB3ZWJraXRfZG9tX25vZGVfaXRlcmF0b3JfbmV4dF9ub2RlKGl0ZXIsIG51bGxwdHIpKSB7
CisgICAgICAgIHdoaWxlIChXZWJLaXRET01Ob2RlKiBub2RlID0gd2Via2l0X2RvbV9ub2RlX2l0
ZXJhdG9yX25leHRfbm9kZShpdGVyLmdldCgpLCBudWxscHRyKSkgeworICAgICAgICAgICAgYXNz
ZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChub2RlKSk7CiAgICAg
ICAgICAgICBnX2Fzc2VydF9jbXB1aW50KGksIDwsIEdfTl9FTEVNRU5UUyhleHBlY3RlZE5vZGVz
Tm9JbnB1dCkpOwogICAgICAgICAgICAgR1VuaXF1ZVB0cjxjaGFyPiBub2RlTmFtZSh3ZWJraXRf
ZG9tX25vZGVfZ2V0X25vZGVfbmFtZShub2RlKSk7CiAgICAgICAgICAgICBnX2Fzc2VydF9jbXBz
dHIobm9kZU5hbWUuZ2V0KCksID09LCBleHBlY3RlZE5vZGVzTm9JbnB1dFtpXSk7CkBAIC0xNTEs
MTIgKzE2NSwxNCBAQCBwcml2YXRlOgogICAgICAgICBnX2Fzc2VydF9jbXB1aW50KGksID09LCBH
X05fRUxFTUVOVFMoZXhwZWN0ZWROb2Rlc05vSW5wdXQpKTsKIAogICAgICAgICAvLyBTaG93IG9u
bHkgZWxlbWVudHMsIHJldXNpbmcgdGhlIGlucHV0IGZpbHRlci4KLSAgICAgICAgaXRlciA9IHdl
YmtpdF9kb21fZG9jdW1lbnRfY3JlYXRlX25vZGVfaXRlcmF0b3IoZG9jdW1lbnQsIFdFQktJVF9E
T01fTk9ERShyb290KSwgV0VCS0lUX0RPTV9OT0RFX0ZJTFRFUl9TSE9XX0VMRU1FTlQsIGZpbHRl
ci5nZXQoKSwgRkFMU0UsIG51bGxwdHIpOwotICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lT
X05PREVfSVRFUkFUT1IoaXRlcikpOwotICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX25vZGVf
aXRlcmF0b3JfZ2V0X2ZpbHRlcihpdGVyKSA9PSBmaWx0ZXIuZ2V0KCkpOworICAgICAgICBpdGVy
ID0gYWRvcHRHUmVmKHdlYmtpdF9kb21fZG9jdW1lbnRfY3JlYXRlX25vZGVfaXRlcmF0b3IoZG9j
dW1lbnQsIFdFQktJVF9ET01fTk9ERShyb290KSwgV0VCS0lUX0RPTV9OT0RFX0ZJTFRFUl9TSE9X
X0VMRU1FTlQsIGZpbHRlci5nZXQoKSwgRkFMU0UsIG51bGxwdHIpKTsKKyAgICAgICAgZ19hc3Nl
cnQoV0VCS0lUX0RPTV9JU19OT0RFX0lURVJBVE9SKGl0ZXIuZ2V0KCkpKTsKKyAgICAgICAgYXNz
ZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChpdGVyLmdldCgpKSk7
CisgICAgICAgIGdfYXNzZXJ0KHdlYmtpdF9kb21fbm9kZV9pdGVyYXRvcl9nZXRfZmlsdGVyKGl0
ZXIuZ2V0KCkpID09IGZpbHRlci5nZXQoKSk7CiAKICAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdo
aWxlIChXZWJLaXRET01Ob2RlKiBub2RlID0gd2Via2l0X2RvbV9ub2RlX2l0ZXJhdG9yX25leHRf
bm9kZShpdGVyLCBudWxscHRyKSkgeworICAgICAgICB3aGlsZSAoV2ViS2l0RE9NTm9kZSogbm9k
ZSA9IHdlYmtpdF9kb21fbm9kZV9pdGVyYXRvcl9uZXh0X25vZGUoaXRlci5nZXQoKSwgbnVsbHB0
cikpIHsKKyAgICAgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMo
R19PQkpFQ1Qobm9kZSkpOwogICAgICAgICAgICAgZ19hc3NlcnRfY21wdWludChpLCA8LCBHX05f
RUxFTUVOVFMoZXhwZWN0ZWRFbGVtZW50c05vSW5wdXQpKTsKICAgICAgICAgICAgIEdVbmlxdWVQ
dHI8Y2hhcj4gbm9kZU5hbWUod2Via2l0X2RvbV9ub2RlX2dldF9ub2RlX25hbWUobm9kZSkpOwog
ICAgICAgICAgICAgZ19hc3NlcnRfY21wc3RyKG5vZGVOYW1lLmdldCgpLCA9PSwgZXhwZWN0ZWRF
bGVtZW50c05vSW5wdXRbaV0pOwpkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0
cy9XZWJLaXQyR3RrL0RPTU5vZGVUZXN0LmNwcCBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMv
V2ViS2l0Mkd0ay9ET01Ob2RlVGVzdC5jcHAKaW5kZXggZGRlYTkyYy4uOWQ3YzQ0MiAxMDA2NDQK
LS0tIGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXQyR3RrL0RPTU5vZGVUZXN0LmNw
cAorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDJHdGsvRE9NTm9kZVRlc3Qu
Y3BwCkBAIC0zMywyMSArMzMsMjYgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgICAgIFdlYktpdERP
TURvY3VtZW50KiBkb2N1bWVudCA9IHdlYmtpdF93ZWJfcGFnZV9nZXRfZG9tX2RvY3VtZW50KHBh
Z2UpOwogICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX0RPQ1VNRU5UKGRvY3VtZW50KSk7
CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1Qo
ZG9jdW1lbnQpKTsKIAogICAgICAgICBXZWJLaXRET01IVE1MSGVhZEVsZW1lbnQqIGhlYWQgPSB3
ZWJraXRfZG9tX2RvY3VtZW50X2dldF9oZWFkKGRvY3VtZW50KTsKICAgICAgICAgZ19hc3NlcnQo
V0VCS0lUX0RPTV9JU19IVE1MX0hFQURfRUxFTUVOVChoZWFkKSk7CisgICAgICAgIGFzc2VydE9i
amVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QoaGVhZCkpOwogCiAgICAgICAg
IC8vIFRpdGxlLCBoZWFkJ3MgY2hpbGQuCiAgICAgICAgIGdfYXNzZXJ0KHdlYmtpdF9kb21fbm9k
ZV9oYXNfY2hpbGRfbm9kZXMoV0VCS0lUX0RPTV9OT0RFKGhlYWQpKSk7CiAgICAgICAgIEdSZWZQ
dHI8V2ViS2l0RE9NTm9kZUxpc3Q+IGxpc3QgPSBhZG9wdEdSZWYod2Via2l0X2RvbV9ub2RlX2dl
dF9jaGlsZF9ub2RlcyhXRUJLSVRfRE9NX05PREUoaGVhZCkpKTsKICAgICAgICAgZ19hc3NlcnQo
V0VCS0lUX0RPTV9JU19OT0RFX0xJU1QobGlzdC5nZXQoKSkpOworICAgICAgICBhc3NlcnRPYmpl
Y3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNUKGxpc3QuZ2V0KCkpKTsKICAgICAg
ICAgZ19hc3NlcnRfY21waW50KHdlYmtpdF9kb21fbm9kZV9saXN0X2dldF9sZW5ndGgobGlzdC5n
ZXQoKSksID09LCAxKTsKICAgICAgICAgV2ViS2l0RE9NTm9kZSogbm9kZSA9IHdlYmtpdF9kb21f
bm9kZV9saXN0X2l0ZW0obGlzdC5nZXQoKSwgMCk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9E
T01fSVNfSFRNTF9USVRMRV9FTEVNRU5UKG5vZGUpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNE
ZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChub2RlKSk7CiAKICAgICAgICAgLy8gQm9k
eSwgSGVhZCBzaWJsaW5nLgogICAgICAgICBub2RlID0gd2Via2l0X2RvbV9ub2RlX2dldF9uZXh0
X3NpYmxpbmcoV0VCS0lUX0RPTV9OT0RFKGhlYWQpKTsKICAgICAgICAgZ19hc3NlcnQoV0VCS0lU
X0RPTV9JU19IVE1MX0JPRFlfRUxFTUVOVChub2RlKSk7CisgICAgICAgIGFzc2VydE9iamVjdElz
RGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1Qobm9kZSkpOwogICAgICAgICBXZWJLaXRE
T01IVE1MQm9keUVsZW1lbnQqIGJvZHkgPSBXRUJLSVRfRE9NX0hUTUxfQk9EWV9FTEVNRU5UKG5v
ZGUpOwogCiAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHRoaXJkIHNpYmxpbmcKQEAgLTU2LDEwICs2
MSwxMyBAQCBwcml2YXRlOgogICAgICAgICAvLyBCb2R5J3MgcHJldmlvdXMgc2libGluZyBpcyBI
ZWFkLgogICAgICAgICBub2RlID0gd2Via2l0X2RvbV9ub2RlX2dldF9wcmV2aW91c19zaWJsaW5n
KFdFQktJVF9ET01fTk9ERShib2R5KSk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNf
SFRNTF9IRUFEX0VMRU1FTlQobm9kZSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRX
aGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNUKG5vZGUpKTsKIAogICAgICAgICAvLyBCb2R5IGhhcyAz
IGNoaWxkcmVuLgogICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX25vZGVfaGFzX2NoaWxkX25v
ZGVzKFdFQktJVF9ET01fTk9ERShib2R5KSkpOwogICAgICAgICBsaXN0ID0gYWRvcHRHUmVmKHdl
YmtpdF9kb21fbm9kZV9nZXRfY2hpbGRfbm9kZXMoV0VCS0lUX0RPTV9OT0RFKGJvZHkpKSk7Cisg
ICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfTk9ERV9MSVNUKGxpc3QuZ2V0KCkpKTsKKyAg
ICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChsaXN0
LmdldCgpKSk7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gd2Via2l0X2RvbV9ub2Rl
X2xpc3RfZ2V0X2xlbmd0aChsaXN0LmdldCgpKTsKICAgICAgICAgZ19hc3NlcnRfY21waW50KGxl
bmd0aCwgPT0sIDMpOwogCkBAIC02Nyw2ICs3NSw3IEBAIHByaXZhdGU6CiAgICAgICAgIGZvciAo
dW5zaWduZWQgbG9uZyBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBub2Rl
ID0gd2Via2l0X2RvbV9ub2RlX2xpc3RfaXRlbShsaXN0LmdldCgpLCBpKTsKICAgICAgICAgICAg
IGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfSFRNTF9QQVJBR1JBUEhfRUxFTUVOVChub2RlKSk7Cisg
ICAgICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNU
KG5vZGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEdvIGJhY2t3YXJkcwpAQCAtODEsOSAr
OTAsMTEgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgICAgIFdlYktpdERPTURvY3VtZW50KiBkb2N1
bWVudCA9IHdlYmtpdF93ZWJfcGFnZV9nZXRfZG9tX2RvY3VtZW50KHBhZ2UpOwogICAgICAgICBn
X2Fzc2VydChXRUJLSVRfRE9NX0lTX0RPQ1VNRU5UKGRvY3VtZW50KSk7CisgICAgICAgIGFzc2Vy
dE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QoZG9jdW1lbnQpKTsKIAog
ICAgICAgICBXZWJLaXRET01IVE1MRWxlbWVudCogYm9keSA9IHdlYmtpdF9kb21fZG9jdW1lbnRf
Z2V0X2JvZHkoZG9jdW1lbnQpOwogICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX0hUTUxf
RUxFTUVOVChib2R5KSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0Rmlu
aXNoZXMoR19PQkpFQ1QoYm9keSkpOwogCiAgICAgICAgIC8vIEJvZHkgc2hvdWxkbid0IGhhdmUg
YW55IGNoaWxkcmVuIGF0IHRoaXMgcG9pbnQuCiAgICAgICAgIGdfYXNzZXJ0KCF3ZWJraXRfZG9t
X25vZGVfaGFzX2NoaWxkX25vZGVzKFdFQktJVF9ET01fTk9ERShib2R5KSkpOwpAQCAtOTQsNjAg
KzEwNSw3NCBAQCBwcml2YXRlOgogICAgICAgICAvLyBJbnNlcnQgb25lIFAgZWxlbWVudC4KICAg
ICAgICAgV2ViS2l0RE9NRWxlbWVudCogcCA9IHdlYmtpdF9kb21fZG9jdW1lbnRfY3JlYXRlX2Vs
ZW1lbnQoZG9jdW1lbnQsICJQIiwgMCk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNf
SFRNTF9FTEVNRU5UKHApKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RG
aW5pc2hlcyhHX09CSkVDVChwKSk7CiAgICAgICAgIHdlYmtpdF9kb21fbm9kZV9hcHBlbmRfY2hp
bGQoV0VCS0lUX0RPTV9OT0RFKGJvZHkpLCBXRUJLSVRfRE9NX05PREUocCksIDApOwogCiAgICAg
ICAgIC8vIE5vdyBpdCBzaG91bGQgaGF2ZSBvbmUsIHRoZSBzYW1lIHRoYXQgd2UgaW5zZXJ0ZWQu
CiAgICAgICAgIGdfYXNzZXJ0KHdlYmtpdF9kb21fbm9kZV9oYXNfY2hpbGRfbm9kZXMoV0VCS0lU
X0RPTV9OT0RFKGJvZHkpKSk7CiAgICAgICAgIEdSZWZQdHI8V2ViS2l0RE9NTm9kZUxpc3Q+IGxp
c3QgPSBhZG9wdEdSZWYod2Via2l0X2RvbV9ub2RlX2dldF9jaGlsZF9ub2RlcyhXRUJLSVRfRE9N
X05PREUoYm9keSkpKTsKICAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19OT0RFX0xJU1Qo
bGlzdC5nZXQoKSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlz
aGVzKEdfT0JKRUNUKGxpc3QuZ2V0KCkpKTsKICAgICAgICAgZ19hc3NlcnRfY21waW50KHdlYmtp
dF9kb21fbm9kZV9saXN0X2dldF9sZW5ndGgobGlzdC5nZXQoKSksID09LCAxKTsKICAgICAgICAg
V2ViS2l0RE9NTm9kZSogbm9kZSA9IHdlYmtpdF9kb21fbm9kZV9saXN0X2l0ZW0obGlzdC5nZXQo
KSwgMCk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfSFRNTF9FTEVNRU5UKG5vZGUp
KTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVD
VChub2RlKSk7CiAgICAgICAgIGdfYXNzZXJ0KHdlYmtpdF9kb21fbm9kZV9pc19zYW1lX25vZGUo
V0VCS0lUX0RPTV9OT0RFKHApLCBub2RlKSk7CiAKICAgICAgICAgLy8gUmVwbGFjZSB0aGUgUCB0
YWcgd2l0aCBhIERJViB0YWcuCiAgICAgICAgIFdlYktpdERPTUVsZW1lbnQqIGRpdiA9IHdlYmtp
dF9kb21fZG9jdW1lbnRfY3JlYXRlX2VsZW1lbnQoZG9jdW1lbnQsICJESVYiLCAwKTsKICAgICAg
ICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19IVE1MX0VMRU1FTlQoZGl2KSk7CisgICAgICAgIGFz
c2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QoZGl2KSk7CiAgICAg
ICAgIHdlYmtpdF9kb21fbm9kZV9yZXBsYWNlX2NoaWxkKFdFQktJVF9ET01fTk9ERShib2R5KSwg
V0VCS0lUX0RPTV9OT0RFKGRpdiksIFdFQktJVF9ET01fTk9ERShwKSwgMCk7CiAgICAgICAgIGdf
YXNzZXJ0KHdlYmtpdF9kb21fbm9kZV9oYXNfY2hpbGRfbm9kZXMoV0VCS0lUX0RPTV9OT0RFKGJv
ZHkpKSk7CiAgICAgICAgIGxpc3QgPSBhZG9wdEdSZWYod2Via2l0X2RvbV9ub2RlX2dldF9jaGls
ZF9ub2RlcyhXRUJLSVRfRE9NX05PREUoYm9keSkpKTsKICAgICAgICAgZ19hc3NlcnQoV0VCS0lU
X0RPTV9JU19OT0RFX0xJU1QobGlzdC5nZXQoKSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0Rl
bGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNUKGxpc3QuZ2V0KCkpKTsKICAgICAgICAgZ19h
c3NlcnRfY21waW50KHdlYmtpdF9kb21fbm9kZV9saXN0X2dldF9sZW5ndGgobGlzdC5nZXQoKSks
ID09LCAxKTsKICAgICAgICAgbm9kZSA9IHdlYmtpdF9kb21fbm9kZV9saXN0X2l0ZW0obGlzdC5n
ZXQoKSwgMCk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfSFRNTF9FTEVNRU5UKG5v
ZGUpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09C
SkVDVChub2RlKSk7CiAgICAgICAgIGdfYXNzZXJ0KHdlYmtpdF9kb21fbm9kZV9pc19zYW1lX25v
ZGUoV0VCS0lUX0RPTV9OT0RFKGRpdiksIG5vZGUpKTsKIAogICAgICAgICAvLyBOb3cgcmVtb3Zl
IHRoZSB0YWcuCiAgICAgICAgIHdlYmtpdF9kb21fbm9kZV9yZW1vdmVfY2hpbGQoV0VCS0lUX0RP
TV9OT0RFKGJvZHkpLCBub2RlLCAwKTsKICAgICAgICAgbGlzdCA9IGFkb3B0R1JlZih3ZWJraXRf
ZG9tX25vZGVfZ2V0X2NoaWxkX25vZGVzKFdFQktJVF9ET01fTk9ERShib2R5KSkpOwogICAgICAg
ICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX05PREVfTElTVChsaXN0LmdldCgpKSk7CisgICAgICAg
IGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QobGlzdC5nZXQo
KSkpOwogICAgICAgICBnX2Fzc2VydF9jbXBpbnQod2Via2l0X2RvbV9ub2RlX2xpc3RfZ2V0X2xl
bmd0aChsaXN0LmdldCgpKSwgPT0sIDApOwogCiAgICAgICAgIC8vIFRlc3QgaW5zZXJ0IGJlZm9y
ZS4gSWYgcmVmQ2hpbGQgaXMgbnVsbCwgaW5zZXJ0IG5ld0NoaWxkIGFzIGxhc3QgZWxlbWVudCBv
ZiBwYXJlbnQuCiAgICAgICAgIGRpdiA9IHdlYmtpdF9kb21fZG9jdW1lbnRfY3JlYXRlX2VsZW1l
bnQoZG9jdW1lbnQsICJESVYiLCAwKTsKICAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19I
VE1MX0VMRU1FTlQoZGl2KSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0
RmluaXNoZXMoR19PQkpFQ1QoZGl2KSk7CiAgICAgICAgIHdlYmtpdF9kb21fbm9kZV9pbnNlcnRf
YmVmb3JlKFdFQktJVF9ET01fTk9ERShib2R5KSwgV0VCS0lUX0RPTV9OT0RFKGRpdiksIDAsIDAp
OwogICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX25vZGVfaGFzX2NoaWxkX25vZGVzKFdFQktJ
VF9ET01fTk9ERShib2R5KSkpOwogICAgICAgICBsaXN0ID0gYWRvcHRHUmVmKHdlYmtpdF9kb21f
bm9kZV9nZXRfY2hpbGRfbm9kZXMoV0VCS0lUX0RPTV9OT0RFKGJvZHkpKSk7CiAgICAgICAgIGdf
YXNzZXJ0KFdFQktJVF9ET01fSVNfTk9ERV9MSVNUKGxpc3QuZ2V0KCkpKTsKKyAgICAgICAgYXNz
ZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChsaXN0LmdldCgpKSk7
CiAgICAgICAgIGdfYXNzZXJ0X2NtcGludCh3ZWJraXRfZG9tX25vZGVfbGlzdF9nZXRfbGVuZ3Ro
KGxpc3QuZ2V0KCkpLCA9PSwgMSk7CiAgICAgICAgIG5vZGUgPSB3ZWJraXRfZG9tX25vZGVfbGlz
dF9pdGVtKGxpc3QuZ2V0KCksIDApOwogICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX0hU
TUxfRUxFTUVOVChub2RlKSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0
RmluaXNoZXMoR19PQkpFQ1Qobm9kZSkpOwogICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX25v
ZGVfaXNfc2FtZV9ub2RlKFdFQktJVF9ET01fTk9ERShkaXYpLCBub2RlKSk7CiAKICAgICAgICAg
Ly8gTm93IGluc2VydCBhICdwJyBiZWZvcmUgJ2RpdicuCiAgICAgICAgIHAgPSB3ZWJraXRfZG9t
X2RvY3VtZW50X2NyZWF0ZV9lbGVtZW50KGRvY3VtZW50LCAiUCIsIDApOwogICAgICAgICBnX2Fz
c2VydChXRUJLSVRfRE9NX0lTX0hUTUxfRUxFTUVOVChwKSk7CisgICAgICAgIGFzc2VydE9iamVj
dElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QocCkpOwogICAgICAgICB3ZWJraXRf
ZG9tX25vZGVfaW5zZXJ0X2JlZm9yZShXRUJLSVRfRE9NX05PREUoYm9keSksIFdFQktJVF9ET01f
Tk9ERShwKSwgV0VCS0lUX0RPTV9OT0RFKGRpdiksIDApOwogICAgICAgICBnX2Fzc2VydCh3ZWJr
aXRfZG9tX25vZGVfaGFzX2NoaWxkX25vZGVzKFdFQktJVF9ET01fTk9ERShib2R5KSkpOwogICAg
ICAgICBsaXN0ID0gYWRvcHRHUmVmKHdlYmtpdF9kb21fbm9kZV9nZXRfY2hpbGRfbm9kZXMoV0VC
S0lUX0RPTV9OT0RFKGJvZHkpKSk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfTk9E
RV9MSVNUKGxpc3QuZ2V0KCkpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRl
c3RGaW5pc2hlcyhHX09CSkVDVChsaXN0LmdldCgpKSk7CiAgICAgICAgIGdfYXNzZXJ0X2NtcGlu
dCh3ZWJraXRfZG9tX25vZGVfbGlzdF9nZXRfbGVuZ3RoKGxpc3QuZ2V0KCkpLCA9PSwgMik7CiAg
ICAgICAgIG5vZGUgPSB3ZWJraXRfZG9tX25vZGVfbGlzdF9pdGVtKGxpc3QuZ2V0KCksIDApOwog
ICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX0hUTUxfRUxFTUVOVChub2RlKSk7CisgICAg
ICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1Qobm9kZSkp
OwogICAgICAgICBnX2Fzc2VydCh3ZWJraXRfZG9tX25vZGVfaXNfc2FtZV9ub2RlKFdFQktJVF9E
T01fTk9ERShwKSwgbm9kZSkpOwogICAgICAgICBub2RlID0gd2Via2l0X2RvbV9ub2RlX2xpc3Rf
aXRlbShsaXN0LmdldCgpLCAxKTsKICAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19IVE1M
X0VMRU1FTlQobm9kZSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZp
bmlzaGVzKEdfT0JKRUNUKG5vZGUpKTsKICAgICAgICAgZ19hc3NlcnQod2Via2l0X2RvbV9ub2Rl
X2lzX3NhbWVfbm9kZShXRUJLSVRfRE9NX05PREUoZGl2KSwgbm9kZSkpOwogCiAgICAgICAgIHJl
dHVybiB0cnVlOwpAQCAtMTU5LDEzICsxODQsMTcgQEAgcHJpdmF0ZToKIAogICAgICAgICBXZWJL
aXRET01Eb2N1bWVudCogZG9jdW1lbnQgPSB3ZWJraXRfd2ViX3BhZ2VfZ2V0X2RvbV9kb2N1bWVu
dChwYWdlKTsKICAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19ET0NVTUVOVChkb2N1bWVu
dCkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JK
RUNUKGRvY3VtZW50KSk7CiAKLSAgICAgICAgV2ViS2l0RE9NTm9kZUxpc3QqIGxpc3QgPSB3ZWJr
aXRfZG9tX2RvY3VtZW50X2dldF9lbGVtZW50c19ieV90YWdfbmFtZShkb2N1bWVudCwgIioiKTsK
LSAgICAgICAgZ3Vsb25nIG5vZGVDb3VudCA9IHdlYmtpdF9kb21fbm9kZV9saXN0X2dldF9sZW5n
dGgobGlzdCk7CisgICAgICAgIEdSZWZQdHI8V2ViS2l0RE9NTm9kZUxpc3Q+IGxpc3QgPSBhZG9w
dEdSZWYod2Via2l0X2RvbV9kb2N1bWVudF9nZXRfZWxlbWVudHNfYnlfdGFnX25hbWUoZG9jdW1l
bnQsICIqIikpOworICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX05PREVfTElTVChsaXN0
LmdldCgpKSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMo
R19PQkpFQ1QobGlzdC5nZXQoKSkpOworICAgICAgICBndWxvbmcgbm9kZUNvdW50ID0gd2Via2l0
X2RvbV9ub2RlX2xpc3RfZ2V0X2xlbmd0aChsaXN0LmdldCgpKTsKICAgICAgICAgZ19hc3NlcnRf
Y21wdWludChub2RlQ291bnQsID09LCBHX05fRUxFTUVOVFMoZXhwZWN0ZWRUYWdOYW1lcykpOwog
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspIHsKLSAgICAg
ICAgICAgIFdlYktpdERPTU5vZGUqIG5vZGUgPSB3ZWJraXRfZG9tX25vZGVfbGlzdF9pdGVtKGxp
c3QsIGkpOworICAgICAgICAgICAgV2ViS2l0RE9NTm9kZSogbm9kZSA9IHdlYmtpdF9kb21fbm9k
ZV9saXN0X2l0ZW0obGlzdC5nZXQoKSwgaSk7CiAgICAgICAgICAgICBnX2Fzc2VydChXRUJLSVRf
RE9NX0lTX05PREUobm9kZSkpOworICAgICAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hl
blRlc3RGaW5pc2hlcyhHX09CSkVDVChub2RlKSk7CiAgICAgICAgICAgICBHVW5pcXVlUHRyPGNo
YXI+IHRhZ05hbWUod2Via2l0X2RvbV9ub2RlX2dldF9ub2RlX25hbWUobm9kZSkpOwogICAgICAg
ICAgICAgZ19hc3NlcnRfY21wc3RyKHRhZ05hbWUuZ2V0KCksID09LCBleHBlY3RlZFRhZ05hbWVz
W2ldKTsKICAgICAgICAgfQpAQCAtMTczLDYgKzIwMiw0MiBAQCBwcml2YXRlOgogICAgICAgICBy
ZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBib29sIHRlc3RET01DYWNoZShXZWJLaXRXZWJQYWdl
KiBwYWdlKQorICAgIHsKKyAgICAgICAgV2ViS2l0RE9NRG9jdW1lbnQqIGRvY3VtZW50ID0gd2Vi
a2l0X3dlYl9wYWdlX2dldF9kb21fZG9jdW1lbnQocGFnZSk7CisgICAgICAgIGdfYXNzZXJ0KFdF
QktJVF9ET01fSVNfRE9DVU1FTlQoZG9jdW1lbnQpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNE
ZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChkb2N1bWVudCkpOworCisgICAgICAgIC8v
IERPTSBvYmplY3RzIGFscmVhZHkgaW4gdGhlIGRvY3VtZW50IHNob3VsZCBiZSBhdXRvbWF0aWNh
bGx5IGhhbmRsZWQgYnkgdGhlIGNhY2hlLgorICAgICAgICBXZWJLaXRET01FbGVtZW50KiBkaXYg
PSB3ZWJraXRfZG9tX2RvY3VtZW50X2dldF9lbGVtZW50X2J5X2lkKGRvY3VtZW50LCAiY29udGFp
bmVyIik7CisgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfSFRNTF9FTEVNRU5UKGRpdikp
OworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNU
KGRpdikpOworCisgICAgICAgIC8vIEdldCB0aGUgc2FtZSBlbG1lbnQgdHdpY2Ugc2hvdWxkIHJl
dHVybiB0aGUgc2FtZSBwb2ludGVyLgorICAgICAgICBnX2Fzc2VydChkaXYgPT0gd2Via2l0X2Rv
bV9kb2N1bWVudF9nZXRfZWxlbWVudF9ieV9pZChkb2N1bWVudCwgImNvbnRhaW5lciIpKTsKKwor
ICAgICAgICAvLyBBIG5ldyBET00gb2JqZWN0IGNyZWF0ZWQgdGhhdCBpcyBkZXJpdmVkIGZyb20g
Tm9kZSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBoYW5kbGVkIGJ5IHRoZSBjYWNoZS4KKyAgICAg
ICAgV2ViS2l0RE9NRWxlbWVudCogcCA9IHdlYmtpdF9kb21fZG9jdW1lbnRfY3JlYXRlX2VsZW1l
bnQoZG9jdW1lbnQsICJQIiwgbnVsbHB0cik7CisgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01f
SVNfSFRNTF9QQVJBR1JBUEhfRUxFTUVOVChwKSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVs
ZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QocCkpOworCisgICAgICAgIC8vIEEgbmV3IERP
TSBvYmplY3QgY3JlYXRlZCB0aGF0IGlzbid0IGRlcml2ZWQgZnJvbSBOb2RlIHNob3VsZCBiZSBt
YW51YWxseSBoYW5kbGVkLgorICAgICAgICBHUmVmUHRyPFdlYktpdERPTU5vZGVJdGVyYXRvcj4g
aXRlciA9IGFkb3B0R1JlZih3ZWJraXRfZG9tX2RvY3VtZW50X2NyZWF0ZV9ub2RlX2l0ZXJhdG9y
KGRvY3VtZW50LCBXRUJLSVRfRE9NX05PREUoZGl2KSwgV0VCS0lUX0RPTV9OT0RFX0ZJTFRFUl9T
SE9XX0FMTCwgbnVsbHB0ciwgRkFMU0UsIG51bGxwdHIpKTsKKyAgICAgICAgZ19hc3NlcnQoV0VC
S0lUX0RPTV9JU19OT0RFX0lURVJBVE9SKGl0ZXIuZ2V0KCkpKTsKKyAgICAgICAgYXNzZXJ0T2Jq
ZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChpdGVyLmdldCgpKSk7CisKKyAg
ICAgICAgLy8gV2UgY2FuIGFsc28gbWFudWFsbHkgaGFuZGxlIGEgRE9NIG9iamVjdCBoYW5kbGVk
IGJ5IHRoZSBjYWNoZS4KKyAgICAgICAgR1JlZlB0cjxXZWJLaXRET01FbGVtZW50PiBwMiA9IGFk
b3B0R1JlZih3ZWJraXRfZG9tX2RvY3VtZW50X2NyZWF0ZV9lbGVtZW50KGRvY3VtZW50LCAiUCIs
IG51bGxwdHIpKTsKKyAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19IVE1MX1BBUkFHUkFQ
SF9FTEVNRU5UKHAyLmdldCgpKSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5U
ZXN0RmluaXNoZXMoR19PQkpFQ1QocDIuZ2V0KCkpKTsKKworICAgICAgICAvLyBET00gb2JqZWN0
cyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50IGFyZSBhbHNvIGNvcnJlY3RseSBoYW5kbGVkIGJ5
IHRoZSBjYWNoZS4KKyAgICAgICAgV2ViS2l0RE9NRWxlbWVudCogYSA9IHdlYmtpdF9kb21fZG9j
dW1lbnRfY3JlYXRlX2VsZW1lbnQoZG9jdW1lbnQsICJBIiwgbnVsbHB0cik7CisgICAgICAgIGdf
YXNzZXJ0KFdFQktJVF9ET01fSVNfRUxFTUVOVChhKSk7CisgICAgICAgIGFzc2VydE9iamVjdElz
RGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19PQkpFQ1QoYSkpOworICAgICAgICB3ZWJraXRfZG9t
X25vZGVfcmVtb3ZlX2NoaWxkKFdFQktJVF9ET01fTk9ERShkaXYpLCBXRUJLSVRfRE9NX05PREUo
YSksIG51bGxwdHIpOworICAgIH0KKwogICAgIGJvb2wgcnVuVGVzdChjb25zdCBjaGFyKiB0ZXN0
TmFtZSwgV2ViS2l0V2ViUGFnZSogcGFnZSkgb3ZlcnJpZGUKICAgICB7CiAgICAgICAgIGlmICgh
c3RyY21wKHRlc3ROYW1lLCAiaGllcmFyY2h5LW5hdmlnYXRpb24iKSkKQEAgLTE4MSw2ICsyNDYs
OCBAQCBwcml2YXRlOgogICAgICAgICAgICAgcmV0dXJuIHRlc3RJbnNlcnRpb24ocGFnZSk7CiAg
ICAgICAgIGlmICghc3RyY21wKHRlc3ROYW1lLCAidGFnLW5hbWVzIikpCiAgICAgICAgICAgICBy
ZXR1cm4gdGVzdFRhZ05hbWVzKHBhZ2UpOworICAgICAgICBpZiAoIXN0cmNtcCh0ZXN0TmFtZSwg
ImRvbS1jYWNoZSIpKQorICAgICAgICAgICAgcmV0dXJuIHRlc3RET01DYWNoZShwYWdlKTsKIAog
ICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCgpOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBA
IC0xOTIsNiArMjU5LDcgQEAgc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3Ip
KSByZWdpc3RlclRlc3RzKCkKICAgICBSRUdJU1RFUl9URVNUKFdlYktpdERPTU5vZGVUZXN0LCAi
V2ViS2l0RE9NTm9kZS9oaWVyYXJjaHktbmF2aWdhdGlvbiIpOwogICAgIFJFR0lTVEVSX1RFU1Qo
V2ViS2l0RE9NTm9kZVRlc3QsICJXZWJLaXRET01Ob2RlL2luc2VydGlvbiIpOwogICAgIFJFR0lT
VEVSX1RFU1QoV2ViS2l0RE9NTm9kZVRlc3QsICJXZWJLaXRET01Ob2RlL3RhZy1uYW1lcyIpOwor
ICAgIFJFR0lTVEVSX1RFU1QoV2ViS2l0RE9NTm9kZVRlc3QsICJXZWJLaXRET01Ob2RlL2RvbS1j
YWNoZSIpOwogfQogCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2Vi
S2l0Mkd0ay9ET01YUGF0aE5TUmVzb2x2ZXJUZXN0LmNwcCBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkv
VGVzdHMvV2ViS2l0Mkd0ay9ET01YUGF0aE5TUmVzb2x2ZXJUZXN0LmNwcAppbmRleCAwNDM0YThi
Li4yMGU0ZGEwIDEwMDY0NAotLS0gYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDJH
dGsvRE9NWFBhdGhOU1Jlc29sdmVyVGVzdC5jcHAKKysrIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9U
ZXN0cy9XZWJLaXQyR3RrL0RPTVhQYXRoTlNSZXNvbHZlclRlc3QuY3BwCkBAIC02NCwxMiArNjQs
MTUgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgICAgIFdlYktpdERPTUVsZW1lbnQqIGRvY3VtZW50
RWxlbWVudCA9IHdlYmtpdF9kb21fZG9jdW1lbnRfZ2V0X2RvY3VtZW50X2VsZW1lbnQoZG9jdW1l
bnQpOwogICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX0VMRU1FTlQoZG9jdW1lbnRFbGVt
ZW50KSk7CisgICAgICAgIGFzc2VydE9iamVjdElzRGVsZXRlZFdoZW5UZXN0RmluaXNoZXMoR19P
QkpFQ1QoZG9jdW1lbnRFbGVtZW50KSk7CiAKLSAgICAgICAgV2ViS2l0RE9NWFBhdGhSZXN1bHQq
IHJlc3VsdCA9IHdlYmtpdF9kb21fZG9jdW1lbnRfZXZhbHVhdGUoZG9jdW1lbnQsICJmb286Y2hp
bGQvdGV4dCgpIiwgV0VCS0lUX0RPTV9OT0RFKGRvY3VtZW50RWxlbWVudCksIHJlc29sdmVyLCBX
RUJLSVRfRE9NX1hQQVRIX1JFU1VMVF9PUkRFUkVEX05PREVfSVRFUkFUT1JfVFlQRSwgbnVsbHB0
ciwgbnVsbHB0cik7Ci0gICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfWFBBVEhfUkVTVUxU
KHJlc3VsdCkpOworICAgICAgICBHUmVmUHRyPFdlYktpdERPTVhQYXRoUmVzdWx0PiByZXN1bHQg
PSBhZG9wdEdSZWYod2Via2l0X2RvbV9kb2N1bWVudF9ldmFsdWF0ZShkb2N1bWVudCwgImZvbzpj
aGlsZC90ZXh0KCkiLCBXRUJLSVRfRE9NX05PREUoZG9jdW1lbnRFbGVtZW50KSwgcmVzb2x2ZXIs
IFdFQktJVF9ET01fWFBBVEhfUkVTVUxUX09SREVSRURfTk9ERV9JVEVSQVRPUl9UWVBFLCBudWxs
cHRyLCBudWxscHRyKSk7CisgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfWFBBVEhfUkVT
VUxUKHJlc3VsdC5nZXQoKSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVz
dEZpbmlzaGVzKEdfT0JKRUNUKHJlc3VsdC5nZXQoKSkpOwogCi0gICAgICAgIFdlYktpdERPTU5v
ZGUqIG5vZGVSZXN1bHQgPSB3ZWJraXRfZG9tX3hwYXRoX3Jlc3VsdF9pdGVyYXRlX25leHQocmVz
dWx0LCBudWxscHRyKTsKKyAgICAgICAgV2ViS2l0RE9NTm9kZSogbm9kZVJlc3VsdCA9IHdlYmtp
dF9kb21feHBhdGhfcmVzdWx0X2l0ZXJhdGVfbmV4dChyZXN1bHQuZ2V0KCksIG51bGxwdHIpOwog
ICAgICAgICBnX2Fzc2VydChXRUJLSVRfRE9NX0lTX05PREUobm9kZVJlc3VsdCkpOworICAgICAg
ICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZpbmlzaGVzKEdfT0JKRUNUKG5vZGVSZXN1
bHQpKTsKIAogICAgICAgICBHVW5pcXVlUHRyPGNoYXI+IG5vZGVWYWx1ZSh3ZWJraXRfZG9tX25v
ZGVfZ2V0X25vZGVfdmFsdWUobm9kZVJlc3VsdCkpOwogICAgICAgICBnX2Fzc2VydF9jbXBzdHIo
bm9kZVZhbHVlLmdldCgpLCA9PSwgIlNVQ0NFU1MiKTsKQEAgLTc5LDEwICs4MiwxMiBAQCBwcml2
YXRlOgogICAgIHsKICAgICAgICAgV2ViS2l0RE9NRG9jdW1lbnQqIGRvY3VtZW50ID0gd2Via2l0
X3dlYl9wYWdlX2dldF9kb21fZG9jdW1lbnQocGFnZSk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJ
VF9ET01fSVNfRE9DVU1FTlQoZG9jdW1lbnQpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxl
dGVkV2hlblRlc3RGaW5pc2hlcyhHX09CSkVDVChkb2N1bWVudCkpOwogCi0gICAgICAgIFdlYktp
dERPTVhQYXRoTlNSZXNvbHZlciogcmVzb2x2ZXIgPSB3ZWJraXRfZG9tX2RvY3VtZW50X2NyZWF0
ZV9uc19yZXNvbHZlcihkb2N1bWVudCwgV0VCS0lUX0RPTV9OT0RFKHdlYmtpdF9kb21fZG9jdW1l
bnRfZ2V0X2RvY3VtZW50X2VsZW1lbnQoZG9jdW1lbnQpKSk7Ci0gICAgICAgIGdfYXNzZXJ0KFdF
QktJVF9ET01fSVNfWFBBVEhfTlNfUkVTT0xWRVIocmVzb2x2ZXIpKTsKLSAgICAgICAgZXZhbHVh
dGVGb29DaGlsZFRleHRBbmRDaGVja1Jlc3VsdChkb2N1bWVudCwgcmVzb2x2ZXIpOworICAgICAg
ICBHUmVmUHRyPFdlYktpdERPTVhQYXRoTlNSZXNvbHZlcj4gcmVzb2x2ZXIgPSBhZG9wdEdSZWYo
d2Via2l0X2RvbV9kb2N1bWVudF9jcmVhdGVfbnNfcmVzb2x2ZXIoZG9jdW1lbnQsIFdFQktJVF9E
T01fTk9ERSh3ZWJraXRfZG9tX2RvY3VtZW50X2dldF9kb2N1bWVudF9lbGVtZW50KGRvY3VtZW50
KSkpKTsKKyAgICAgICAgZ19hc3NlcnQoV0VCS0lUX0RPTV9JU19YUEFUSF9OU19SRVNPTFZFUihy
ZXNvbHZlci5nZXQoKSkpOworICAgICAgICBhc3NlcnRPYmplY3RJc0RlbGV0ZWRXaGVuVGVzdEZp
bmlzaGVzKEdfT0JKRUNUKHJlc29sdmVyLmdldCgpKSk7CisgICAgICAgIGV2YWx1YXRlRm9vQ2hp
bGRUZXh0QW5kQ2hlY2tSZXN1bHQoZG9jdW1lbnQsIHJlc29sdmVyLmdldCgpKTsKIAogICAgICAg
ICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC05MSw4ICs5NiwxMCBAQCBwcml2YXRlOgogICAgIHsK
ICAgICAgICAgV2ViS2l0RE9NRG9jdW1lbnQqIGRvY3VtZW50ID0gd2Via2l0X3dlYl9wYWdlX2dl
dF9kb21fZG9jdW1lbnQocGFnZSk7CiAgICAgICAgIGdfYXNzZXJ0KFdFQktJVF9ET01fSVNfRE9D
VU1FTlQoZG9jdW1lbnQpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RG
aW5pc2hlcyhHX09CSkVDVChkb2N1bWVudCkpOwogCiAgICAgICAgIEdSZWZQdHI8V2ViS2l0RE9N
WFBhdGhOU1Jlc29sdmVyPiByZXNvbHZlciA9IGFkb3B0R1JlZihXRUJLSVRfRE9NX1hQQVRIX05T
X1JFU09MVkVSKGdfb2JqZWN0X25ldyh3ZWJraXRfeHBhdGhfbnNfcmVzb2x2ZXJfZ2V0X3R5cGUo
KSwgbnVsbHB0cikpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5p
c2hlcyhHX09CSkVDVChyZXNvbHZlci5nZXQoKSkpOwogICAgICAgICBldmFsdWF0ZUZvb0NoaWxk
VGV4dEFuZENoZWNrUmVzdWx0KGRvY3VtZW50LCByZXNvbHZlci5nZXQoKSk7CiAKICAgICAgICAg
cmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktp
dDJHdGsvVGVzdERPTU5vZGUuY3BwIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXQy
R3RrL1Rlc3RET01Ob2RlLmNwcAppbmRleCBkNDI5MzVhLi4yNGQwYzAwIDEwMDY0NAotLS0gYS9U
b29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDJHdGsvVGVzdERPTU5vZGUuY3BwCisrKyBi
L1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Mkd0ay9UZXN0RE9NTm9kZS5jcHAKQEAg
LTU5LDExICs1OSwyMiBAQCBzdGF0aWMgdm9pZCB0ZXN0V2ViS2l0RE9NTm9kZVRhZ05hbWVzKFdl
YlZpZXdUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogICAgIGdfYXNzZXJ0KHRlc3QtPnJ1bldl
YlByb2Nlc3NUZXN0KCJXZWJLaXRET01Ob2RlIiwgInRhZy1uYW1lcyIpKTsKIH0KIAorc3RhdGlj
IHZvaWQgdGVzdFdlYktpdERPTU9iamVjdENhY2hlKFdlYlZpZXdUZXN0KiB0ZXN0LCBnY29uc3Rw
b2ludGVyKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0ZXN0SFRNTCA9ICI8aHRtbD48Ym9k
eT48ZGl2IGlkPSdjb250YWluZXInPjxwPkRPTSBDYWNoZSB0ZXN0PC9wPjxhIGlkPSdsaW5rIGhy
ZWY9JyMnPmxpbms8L2E+PC9kaXY+PC9ib2R5PjwvaHRtbD4iOworICAgIHRlc3QtPmxvYWRIdG1s
KHRlc3RIVE1MLCBudWxscHRyKTsKKyAgICB0ZXN0LT53YWl0VW50aWxMb2FkRmluaXNoZWQoKTsK
KworICAgIGdfYXNzZXJ0KHRlc3QtPnJ1bldlYlByb2Nlc3NUZXN0KCJXZWJLaXRET01Ob2RlIiwg
ImRvbS1jYWNoZSIpKTsKK30KKworCiB2b2lkIGJlZm9yZUFsbCgpCiB7CiAgICAgV2ViVmlld1Rl
c3Q6OmFkZCgiV2ViS2l0RE9NTm9kZSIsICJoaWVyYXJjaHktbmF2aWdhdGlvbiIsIHRlc3RXZWJL
aXRET01Ob2RlSGllcmFyY2h5TmF2aWdhdGlvbik7CiAgICAgV2ViVmlld1Rlc3Q6OmFkZCgiV2Vi
S2l0RE9NTm9kZSIsICJpbnNlcnRpb24iLCB0ZXN0V2ViS2l0RE9NTm9kZUluc2VydGlvbik7CiAg
ICAgV2ViVmlld1Rlc3Q6OmFkZCgiV2ViS2l0RE9NTm9kZSIsICJ0YWctbmFtZXMiLCB0ZXN0V2Vi
S2l0RE9NTm9kZVRhZ05hbWVzKTsKKyAgICBXZWJWaWV3VGVzdDo6YWRkKCJXZWJLaXRET01Ob2Rl
IiwgImRvbS1jYWNoZSIsIHRlc3RXZWJLaXRET01PYmplY3RDYWNoZSk7CiB9CiAKIHZvaWQgYWZ0
ZXJBbGwoKQpkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXQyR3Rr
L1dlYkV4dGVuc2lvblRlc3QuY3BwIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXQy
R3RrL1dlYkV4dGVuc2lvblRlc3QuY3BwCmluZGV4IGZkMDk1OTYuLjA2YzRlNWUgMTAwNjQ0Ci0t
LSBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Mkd0ay9XZWJFeHRlbnNpb25UZXN0
LmNwcAorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdDJHdGsvV2ViRXh0ZW5z
aW9uVGVzdC5jcHAKQEAgLTEwMiwxNCArMTAyLDE0IEBAIHN0YXRpYyB2b2lkIGRvY3VtZW50TG9h
ZGVkQ2FsbGJhY2soV2ViS2l0V2ViUGFnZSogd2ViUGFnZSwgV2ViS2l0V2ViRXh0ZW5zaW9uKiBl
CiB7CiAgICAgLy8gRklYTUU6IFRvbyBtdWNoIGNvZGUganVzdCB0byBzZW5kIGEgbWVzc2FnZSwg
d2UgbmVlZCBjb252ZW5pZW50IGN1c3RvbSBBUEkgZm9yIHRoaXMuCiAgICAgV2ViS2l0RE9NRG9j
dW1lbnQqIGRvY3VtZW50ID0gd2Via2l0X3dlYl9wYWdlX2dldF9kb21fZG9jdW1lbnQod2ViUGFn
ZSk7Ci0gICAgV2ViS2l0RE9NRE9NV2luZG93KiB3aW5kb3cgPSB3ZWJraXRfZG9tX2RvY3VtZW50
X2dldF9kZWZhdWx0X3ZpZXcoZG9jdW1lbnQpOwotICAgIGlmIChXZWJLaXRET01XZWJLaXROYW1l
c3BhY2UqIHdlYmtpdCA9IHdlYmtpdF9kb21fZG9tX3dpbmRvd19nZXRfd2Via2l0X25hbWVzcGFj
ZSh3aW5kb3cpKSB7CisgICAgR1JlZlB0cjxXZWJLaXRET01ET01XaW5kb3c+IHdpbmRvdyA9IGFk
b3B0R1JlZih3ZWJraXRfZG9tX2RvY3VtZW50X2dldF9kZWZhdWx0X3ZpZXcoZG9jdW1lbnQpKTsK
KyAgICBpZiAoV2ViS2l0RE9NV2ViS2l0TmFtZXNwYWNlKiB3ZWJraXQgPSB3ZWJraXRfZG9tX2Rv
bV93aW5kb3dfZ2V0X3dlYmtpdF9uYW1lc3BhY2Uod2luZG93LmdldCgpKSkgewogICAgICAgICBX
ZWJLaXRET01Vc2VyTWVzc2FnZUhhbmRsZXJzTmFtZXNwYWNlKiBtZXNzYWdlSGFuZGxlcnMgPSB3
ZWJraXRfZG9tX3dlYmtpdF9uYW1lc3BhY2VfZ2V0X21lc3NhZ2VfaGFuZGxlcnMod2Via2l0KTsK
ICAgICAgICAgaWYgKFdlYktpdERPTVVzZXJNZXNzYWdlSGFuZGxlciogaGFuZGxlciA9IHdlYmtp
dF9kb21fdXNlcl9tZXNzYWdlX2hhbmRsZXJzX25hbWVzcGFjZV9nZXRfaGFuZGxlcihtZXNzYWdl
SGFuZGxlcnMsICJkb20iKSkKICAgICAgICAgICAgIHdlYmtpdF9kb21fdXNlcl9tZXNzYWdlX2hh
bmRsZXJfcG9zdF9tZXNzYWdlKGhhbmRsZXIsICJEb2N1bWVudExvYWRlZCIpOwogICAgIH0KIAot
ICAgIHdlYmtpdF9kb21fZG9tX3dpbmRvd193ZWJraXRfbWVzc2FnZV9oYW5kbGVyc19wb3N0X21l
c3NhZ2Uod2luZG93LCAiZG9tLWNvbnZlbmllbmNlIiwgIkRvY3VtZW50TG9hZGVkIik7CisgICAg
d2Via2l0X2RvbV9kb21fd2luZG93X3dlYmtpdF9tZXNzYWdlX2hhbmRsZXJzX3Bvc3RfbWVzc2Fn
ZSh3aW5kb3cuZ2V0KCksICJkb20tY29udmVuaWVuY2UiLCAiRG9jdW1lbnRMb2FkZWQiKTsKIAog
ICAgIGdwb2ludGVyIGRhdGEgPSBnX29iamVjdF9nZXRfZGF0YShHX09CSkVDVChleHRlbnNpb24p
LCAiZGJ1cy1jb25uZWN0aW9uIik7CiAgICAgaWYgKGRhdGEpCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>