<?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>95570</bug_id>
          
          <creation_ts>2012-08-31 07:54:02 -0700</creation_ts>
          <short_desc>[Qt] Port core QObject bridge to use JSC C API</short_desc>
          <delta_ts>2014-01-13 21:45:11 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>94702</dependson>
    
    <dependson>95325</dependson>
          <blocked>60842</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Hausmann">hausmann</reporter>
          <assigned_to name="Simon Hausmann">hausmann</assigned_to>
          <cc>andersca</cc>
    
    <cc>cmarcelo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>709615</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-31 07:54:02 -0700</bug_when>
    <thetext>[Qt] Port core QObject bridge to use JSC C API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>709638</commentid>
    <comment_count>1</comment_count>
      <attachid>161704</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-31 08:08:32 -0700</bug_when>
    <thetext>Created attachment 161704
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>709639</commentid>
    <comment_count>2</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-31 08:09:51 -0700</bug_when>
    <thetext>(The EWS won&apos;t like this patch as it depends on the previous patches :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>709701</commentid>
    <comment_count>3</comment_count>
      <attachid>161704</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-08-31 09:12:23 -0700</bug_when>
    <thetext>Comment on attachment 161704
Patch

Attachment 161704 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/13705013</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>709712</commentid>
    <comment_count>4</comment_count>
      <attachid>161704</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-08-31 09:23:43 -0700</bug_when>
    <thetext>Comment on attachment 161704
Patch

Attachment 161704 did not pass qt-wk2-ews (qt):
Output: http://queues.webkit.org/results/13713268</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>711578</commentid>
    <comment_count>5</comment_count>
      <attachid>161704</attachid>
    <who name="Caio Marcelo de Oliveira Filho">cmarcelo</who>
    <bug_when>2012-09-04 16:57:43 -0700</bug_when>
    <thetext>Comment on attachment 161704
Patch

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

Couldn&apos;t look at everything today, will continue tomorrow.

&gt; Source/WebCore/bridge/qt/qt_class.cpp:75
&gt; +    JSWeakObjectMapSet(m_impl-&gt;m_context, m_impl-&gt;m_map, key, object);

What if m_impl was created in one context group, wrap a certain QObject, then later in another context group we ask for wrapped version again. It&apos;ll give us one that is tied to the first context group. I don&apos;t know whether this case could happen, but the fact that set() is parametrized by context (group) and get() is not seems confusing at first to me.

You can think of this at QtClass level too: QtClasses are ultimately tied with a certain context group.

Question: do you know if there are cases in the our API tests in which we have two different context groups being used?

&gt; Source/WebCore/bridge/qt/qt_class.cpp:95
&gt; +    QtSafeObject(QObject* object, bool own)

Minor idea: use &quot;type tag&quot; to identify the ownership cases more explicitly when creating QtSafeObject.

&gt; Source/WebCore/bridge/qt/qt_class.cpp:115
&gt; +    if (!object)
&gt; +        return 0;
&gt; +    if (!JSValueIsObjectOfClass(context, object, qtObjectBaseClass()))

&quot;if (!object || !JSValue...)&quot;.

&gt; Source/WebCore/bridge/qt/qt_class.cpp:208
&gt; +        JSStringRef stringRef = JSStringCreateWithCharacters(reinterpret_cast&lt;const JSChar*&gt;(string.data()), string.length() + 1);

JSRetainPtr.

&gt; Source/WebCore/bridge/qt/qt_class.cpp:224
&gt; +QString QtClass::toString(QObject* obj)

Would a &quot;QVariant callToStringMetaMethod()&quot; helper function make things clearer? Return QVariant() if call fails,   This would get the Qt meta object method out of the way, and you might even get by without the goto...

&gt; Source/WebCore/bridge/qt/qt_class.cpp:245
&gt; +    if (m.access() == QMetaMethod::Private
&gt; +        || m.methodType() == QMetaMethod::Signal
&gt; +        || m.parameterCount())

Should we check if returnType() is not void?

Minor: m.parameterCount &gt; 0 also reads better here.

&gt; Source/WebCore/bridge/qt/qt_class.cpp:252
&gt; +    retsig = m.typeName();
&gt; +    if (retsig &amp;&amp; *retsig) {
&gt; +        ret = QVariant(QMetaType::type(retsig), (void*)0);
&gt; +        qargs[0] = ret.data();
&gt; +    }

I think we can use returnType() here instead of retsig.

&gt; Source/WebCore/bridge/qt/qt_class.cpp:329
&gt; +    static HashMap&lt;const QMetaObject*, QtClass*&gt; classes;

DEFINE_STATIC_LOCAL?

&gt; Source/WebCore/bridge/qt/qt_class.h:34
&gt; +class WeakMapImpl : public RefCounted&lt;WeakMapImpl&gt; {

I think would be good mention in the ChangeLog that QtClasses will end up sharing the same WeakMapImpl.

&gt; Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp:624
&gt; +// The JavaScriptCore GC marks the C stack. To try to ensure that there is
&gt; +// no JSObject* left in stack memory by the compiler, we call this function
&gt; +// to zap some bytes of memory before calling collectGarbage().

Just curious: can&apos;t JSC GC stop at the SP (stack pointer)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>935654</commentid>
    <comment_count>6</comment_count>
      <attachid>161704</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2013-10-02 21:15:00 -0700</bug_when>
    <thetext>Comment on attachment 161704
Patch

Qt has been removed, clearing review flags.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>161704</attachid>
            <date>2012-08-31 08:08:32 -0700</date>
            <delta_ts>2013-10-02 21:15:00 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-95570-20120831171007.patch</filename>
            <type>text/plain</type>
            <size>77466</size>
            <attacher name="Simon Hausmann">hausmann</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI3MjM4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOWI1ZTFiMDhmMThiMjhm
NGM4NjYxZTA0YTliMDY0MTQ1YjBmYjQyZC4uMmQ2MzNiNTJlYTJmOGZhNjBkOGQzMjFhNTVjYzkx
NGM0M2NhMDI4YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDg5IEBACiAyMDEyLTA4LTMxICBTaW1v
biBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KIAorICAgICAgICBbUXRdIFBv
cnQgY29yZSBRT2JqZWN0IGJyaWRnZSB0byB1c2UgSlNDIEMgQVBJCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NTU3MAorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBvcnRlZCB0aGUgY29yZSBRT2JqZWN0IGJp
bmRpbmdzIGF3YXkgZnJvbSBKU0M6OkJpbmRpbmdzOjpDbGFzcyB0byB1c2UgSlNDbGFzc1JlZi4K
KyAgICAgICAgVGhpcyB1bnRpZXMgdGhlIEpTIHdyYXBwZXIgb2JqZWN0cyBjcmVhdGVkIGZyb20g
UU9iamVjdHMgZnJvbSB0aGUgcnVudGltZSBpbnN0YW5jZQorICAgICAgICBtZWNoYW5pY3MgYW5k
IG1ha2VzIHRoZW0gc3ViamVjdCB0byByZWd1bGFyIGdhcmJhZ2UgY29sbGVjdGlvbi4gRm9yIFFP
YmplY3RzIGVtYmVkZGVkCisgICAgICAgIHZpYSB0aGUgPG9iamVjdD4gdGFnIHdlIG5lZWQgYSBk
aXJlY3QgaG9vayBpbiBKU1BsdWdpbkVsZW1lbnRGdW5jdGlvbnMuY3BwLCBhcyB3ZSBkbyBub3QK
KyAgICAgICAgdXNlIEpTQzo6QmluZGluZ3M6Okluc3RhbmNlIGFueW1vcmUuIE1vc3Qgb2YgdGhl
IGNvZGUgYmVjb21lcyBzaW1wbGVyIGFuZCB0aGVyZSBpcyBhIGxvdAorICAgICAgICBvZiByb29t
IGZvciBmdXJ0aGVyIGltcHJvdmVtZW50cywgaW5jbHVkaW5nIGhvcGVmdWxseSB0aGUgZWxpbWlu
YXRpb24gb2YgUXRSdW50aW1lTWV0aG9kCisgICAgICAgIGluIHRoZSBmdXR1cmUuCisKKyAgICAg
ICAgKiBUYXJnZXQucHJpOgorICAgICAgICAqIGJpbmRpbmdzL2pzL0pTUGx1Z2luRWxlbWVudEZ1
bmN0aW9ucy5jcHA6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OnBsdWdp
blNjcmlwdE9iamVjdEZvclFPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6cGx1Z2luU2NyaXB0
T2JqZWN0KToKKyAgICAgICAgKiBiaW5kaW5ncy9qcy9TY3JpcHRDb250cm9sbGVyLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmUpOgorICAgICAgICAqIGJpbmRpbmdzL2pzL1NjcmlwdENvbnRyb2xsZXJR
dC5jcHA6IFJlbW92ZWQuCisgICAgICAgICogYnJpZGdlL2pzYy9CcmlkZ2VKU0MuY3BwOgorICAg
ICAgICAqIGJyaWRnZS9xdC9xdF9jbGFzcy5jcHA6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjp1
bnVzZWRXZWFrT2JqZWN0TWFwQ2FsbGJhY2spOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6V2Vh
a01hcEltcGw6OldlYWtNYXBJbXBsKToKKyAgICAgICAgKEJpbmRpbmdzKToKKyAgICAgICAgKEpT
Qzo6QmluZGluZ3M6OldlYWtNYXBJbXBsOjp+V2Vha01hcEltcGwpOgorICAgICAgICAoSlNDOjpC
aW5kaW5nczo6V2Vha01hcDo6fldlYWtNYXApOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6V2Vh
a01hcDo6c2V0KToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OldlYWtNYXA6OmdldCk6CisgICAg
ICAgIChKU0M6OkJpbmRpbmdzOjpXZWFrTWFwOjpyZW1vdmUpOgorICAgICAgICAoUXRTYWZlT2Jq
ZWN0KToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OlF0U2FmZU9iamVjdDo6ZGF0YSk6CisgICAg
ICAgIChKU0M6OkJpbmRpbmdzOjpRdFNhZmVPYmplY3Q6OlF0U2FmZU9iamVjdCk6CisgICAgICAg
IChKU0M6OkJpbmRpbmdzOjpRdFNhZmVPYmplY3Q6On5RdFNhZmVPYmplY3QpOgorICAgICAgICAo
SlNDOjpCaW5kaW5nczo6UXRDbGFzczo6dG9RT2JqZWN0KToKKyAgICAgICAgKEpTQzo6QmluZGlu
Z3M6OlF0Q2xhc3M6OndyYXBwZWRRT2JqZWN0RGVzdHJveWVkKToKKyAgICAgICAgKEpTQzo6Qmlu
ZGluZ3M6OmpzU3RyaW5nVG9CeXRlQXJyYXkpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6aGFz
UHJvcGVydHlRdCk6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjpnZXRQcm9wZXJ0eVF0KToKKyAg
ICAgICAgKEpTQzo6QmluZGluZ3M6OmdldFByb3BlcnR5TmFtZXNRdCk6CisgICAgICAgIChKU0M6
OkJpbmRpbmdzOjpzZXRQcm9wZXJ0eVF0KToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OmRlbGV0
ZVByb3BlcnR5UXQpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6Y29udmVydFRvVHlwZVF0KToK
KyAgICAgICAgKEpTQzo6QmluZGluZ3M6OmZpbmFsaXplUXQpOgorICAgICAgICAoSlNDOjpCaW5k
aW5nczo6UXRDbGFzczo6dG9TdHJpbmcpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6UXRDbGFz
czo6aW5zdGFuY2VGb3JRT2JqZWN0KToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OlF0Q2xhc3M6
OnF0T2JqZWN0QmFzZUNsYXNzKToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OlF0Q2xhc3M6OlF0
Q2xhc3MpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6UXRDbGFzczo6flF0Q2xhc3MpOgorICAg
ICAgICAoSlNDOjpCaW5kaW5nczo6Y2xhc3Nlc0J5TWV0YU9iamVjdCk6CisgICAgICAgIChKU0M6
OkJpbmRpbmdzOjpRdENsYXNzOjpoYXNQcm9wZXJ0eSk6CisgICAgICAgIChKU0M6OkJpbmRpbmdz
OjpRdENsYXNzOjpnZXRQcm9wZXJ0eSk6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjphcHBlbmRO
YW1lKToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OlF0Q2xhc3M6OmdldFByb3BlcnR5TmFtZXMp
OgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6UXRDbGFzczo6c2V0UHJvcGVydHkpOgorICAgICAg
ICAoSlNDOjpCaW5kaW5nczo6UXRDbGFzczo6Y2xhc3NGb3JPYmplY3QpOgorICAgICAgICAqIGJy
aWRnZS9xdC9xdF9jbGFzcy5oOgorICAgICAgICAoV2Vha01hcEltcGwpOgorICAgICAgICAoQmlu
ZGluZ3MpOgorICAgICAgICAoV2Vha01hcCk6CisgICAgICAgIChRdENsYXNzKToKKyAgICAgICAg
KiBicmlkZ2UvcXQvcXRfaW5zdGFuY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIGJyaWRnZS9x
dC9xdF9pbnN0YW5jZS5oOiBSZW1vdmVkLgorICAgICAgICAqIGJyaWRnZS9xdC9xdF9ydW50aW1l
LmNwcDoKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OnZhbHVlUmVhbFR5cGUpOgorICAgICAgICAo
SlNDOjpCaW5kaW5nczo6Y29udmVydFZhbHVlVG9RVmFyaWFudCk6CisgICAgICAgIChKU0M6OkJp
bmRpbmdzOjpjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6
OmZpbmFsaXplTWV0aG9kKToKKyAgICAgICAgKEJpbmRpbmdzKToKKyAgICAgICAgKEpTQzo6Qmlu
ZGluZ3M6OnByb3RvdHlwZUZvclNpZ25hbHNBbmRTbG90cyk6CisgICAgICAgIChKU0M6OkJpbmRp
bmdzOjpRdFJ1bnRpbWVNZXRob2Q6OlF0UnVudGltZU1ldGhvZCk6CisgICAgICAgIChKU0M6OkJp
bmRpbmdzOjpRdFJ1bnRpbWVNZXRob2Q6OmNhbGwpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6
UXRSdW50aW1lTWV0aG9kOjpqc09iamVjdFJlZik6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjpR
dFJ1bnRpbWVNZXRob2Q6OmNvbm5lY3RPckRpc2Nvbm5lY3QpOgorICAgICAgICAoSlNDOjpCaW5k
aW5nczo6UXRDb25uZWN0aW9uT2JqZWN0OjpRdENvbm5lY3Rpb25PYmplY3QpOgorICAgICAgICAo
SlNDOjpCaW5kaW5nczo6UXRDb25uZWN0aW9uT2JqZWN0OjpleGVjdXRlKToKKyAgICAgICAgKiBi
cmlkZ2UvcXQvcXRfcnVudGltZS5oOgorICAgICAgICAoUXRSdW50aW1lTWV0aG9kKToKKyAgICAg
ICAgKFF0Q29ubmVjdGlvbk9iamVjdCk6CisgICAgICAgIChCaW5kaW5ncyk6CisKKzIwMTItMDgt
MzEgIFNpbW9uIEhhdXNtYW5uICA8c2ltb24uaGF1c21hbm5Abm9raWEuY29tPgorCiAgICAgICAg
IFtRdF0gUG9ydCB0aGUgUXQgcGl4bWFwIEpTIGJpbmRpbmdzIHRvIHVzZSB0aGUgSlNDIEMgQVBJ
CiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NDcwMgog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQv
cXQvQ2hhbmdlTG9nCmluZGV4IDY0Yjk2OTFiOWYxNjVhNjYxNjE0OTNhNjU3NmIzYTBkOGJjZTNj
OTUuLmQ5ZjFjYTU0OGI5Y2U2NzVhZDgyYjE3N2U1ZDQ5ZTNlZWQ0ODY2MjkgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJLaXQvcXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvQ2hhbmdl
TG9nCkBAIC0xLDUgKzEsMzAgQEAKIDIwMTItMDgtMzEgIFNpbW9uIEhhdXNtYW5uICA8c2ltb24u
aGF1c21hbm5Abm9raWEuY29tPgogCisgICAgICAgIFtRdF0gUG9ydCBjb3JlIFFPYmplY3QgYnJp
ZGdlIHRvIHVzZSBKU0MgQyBBUEkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTk1NTcwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQWRhcHQgdG8gbmV3IGNvcmUgUU9iamVjdCBiaW5kaW5nIEFQSS4KKworICAg
ICAgICAqIEFwaS9xd2ViZnJhbWUuY3BwOgorICAgICAgICAoUVdlYkZyYW1lOjphZGRUb0phdmFT
Y3JpcHRXaW5kb3dPYmplY3QpOgorICAgICAgICAqIHRlc3RzL3FvYmplY3RicmlkZ2UvcW9iamVj
dGJyaWRnZS5wcm86CisgICAgICAgICogdGVzdHMvcW9iamVjdGJyaWRnZS90c3RfcW9iamVjdGJy
aWRnZS5jcHA6CisgICAgICAgIChNeVFPYmplY3QpOgorICAgICAgICAoTXlRT2JqZWN0Ojpwcm9w
ZXJ0eVdpdGhTYW1lU2xvdEdldHRlck5hbWUpOgorICAgICAgICAoemFwU29tZVN0YWNrKTogSGVs
cGVyIGZ1bmN0aW9uIHRvIG1ha2UgR0MgbW9yZSByZWxpYWJsZSBieSBjbGVhcmluZyBwb3RlbnRp
YWxseSBzdGFsZSBKU1ZhbHVlUmVmCisgICAgICAgIHBvaW50ZXJzIGZyb20gdGhlIHN0YWNrLgor
ICAgICAgICAoZ2FyYmFnZUNvbGxlY3QpOgorICAgICAgICAodHN0X1FPYmplY3RCcmlkZ2UpOgor
ICAgICAgICAodHN0X1FPYmplY3RCcmlkZ2U6OmdldFNldFN0YXRpY1Byb3BlcnR5KTogRmluZS10
dW5lIHRoZSBleHBlY3RhdGlvbnMgd2hlbiBkZWxldGluZyBwcm9wZXJ0aWVzLgorICAgICAgICAo
dHN0X1FPYmplY3RCcmlkZ2U6OmdldFNldER5bmFtaWNQcm9wZXJ0eSk6CisgICAgICAgICh0c3Rf
UU9iamVjdEJyaWRnZTo6b3duZXJzaGlwKTogQWRkIGV4cGxpY3QgZ2MgY2FsbHMgdG8gZW5zdXJl
IGNvbGxlY3Rpb24uCisgICAgICAgICh0c3RfUU9iamVjdEJyaWRnZTo6cHJvcGVydHlBbmRTbG90
V2l0aFNhbWVOYW1lKTogTmV3IHRlc3QgdG8gdmVyaWZ5IHRoYXQgbG9va3VwcyBvZiBwcm9wZXJ0
aWVzCisgICAgICAgIHdoZXJlIHRoZSBuYW1lIGlzIGlkZW50aWNhbCB0byBhIHNsb3QgaGF2ZSBw
cmlvcml0eSBvdmVyIHRoZSBzbG90LgorCisyMDEyLTA4LTMxICBTaW1vbiBIYXVzbWFubiAgPHNp
bW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KKwogICAgICAgICBbUXRdIFBvcnQgY29udmVydFZhbHVl
VG9RVmFyaWFudCB0byB1c2UgdGhlIEpTQyBDIEFQSQogICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTQ2OTUKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvVGFyZ2V0LnByaSBiL1NvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkKaW5kZXggZjczNTlhZjhm
YzEyMWY2NzA2ZGQ2YTExNzAzOWNkMTFiMGZlYmI0ZC4uYTg3NDQxYzI2MWU2NjM2NTc5OWQ0ODA4
ZjVlZDgxMzc5NmFjZWMxZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQor
KysgYi9Tb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCkBAIC0xOTcsNyArMTk3LDYgQEAgU09VUkNF
UyArPSBcCiAgICAgIGJpbmRpbmdzL2pzL1NjcmlwdENhY2hlZEZyYW1lRGF0YS5jcHAgXAogICAg
ICBiaW5kaW5ncy9qcy9TY3JpcHRDYWxsU3RhY2tGYWN0b3J5LmNwcCBcCiAgICAgIGJpbmRpbmdz
L2pzL1NjcmlwdENvbnRyb2xsZXIuY3BwIFwKLSAgICAgYmluZGluZ3MvanMvU2NyaXB0Q29udHJv
bGxlclF0LmNwcCBcCiAgICAgIGJpbmRpbmdzL2pzL1NjcmlwdERlYnVnU2VydmVyLmNwcCBcCiAg
ICAgIGJpbmRpbmdzL2pzL1NjcmlwdEV2ZW50TGlzdGVuZXIuY3BwIFwKICAgICAgYmluZGluZ3Mv
anMvU2NyaXB0RnVuY3Rpb25DYWxsLmNwcCBcCkBAIC0yMTcsNyArMjE2LDYgQEAgU09VUkNFUyAr
PSBcCiAgICAgIGJyaWRnZS9qc2MvQnJpZGdlSlNDLmNwcCBcCiAgICAgIGJyaWRnZS9ucHJ1bnRp
bWUuY3BwIFwKICAgICAgYnJpZGdlL3F0L3F0X2NsYXNzLmNwcCBcCi0gICAgIGJyaWRnZS9xdC9x
dF9pbnN0YW5jZS5jcHAgXAogICAgICBicmlkZ2UvcXQvcXRfcGl4bWFwcnVudGltZS5jcHAgXAog
ICAgICBicmlkZ2UvcXQvcXRfcnVudGltZS5jcHAgXAogICAgICBicmlkZ2UvcnVudGltZV9hcnJh
eS5jcHAgXApAQCAtMTM1Myw3ICsxMzUxLDYgQEAgSEVBREVSUyArPSBcCiAgICAgYnJpZGdlL0lk
ZW50aWZpZXJSZXAuaCBcCiAgICAgYnJpZGdlL05QX2pzb2JqZWN0LmggXAogICAgIGJyaWRnZS9x
dC9xdF9jbGFzcy5oIFwKLSAgICBicmlkZ2UvcXQvcXRfaW5zdGFuY2UuaCBcCiAgICAgYnJpZGdl
L3F0L3F0X3J1bnRpbWUuaCBcCiAgICAgYnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuaCBcCiAg
ICAgYnJpZGdlL3J1bnRpbWVfYXJyYXkuaCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9i
aW5kaW5ncy9qcy9KU1BsdWdpbkVsZW1lbnRGdW5jdGlvbnMuY3BwIGIvU291cmNlL1dlYkNvcmUv
YmluZGluZ3MvanMvSlNQbHVnaW5FbGVtZW50RnVuY3Rpb25zLmNwcAppbmRleCA2ZjE2NmFjOWQ3
YjU3ZTg2ZjNmNTQ5MmI5ZGEzZThkYjRmOGE0YjRmLi44YTJiMGQwMDJkMzkyZDg1ODVjNjZjNjA0
ODlmZmI4ZTBhZTZlYzU4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9qcy9K
U1BsdWdpbkVsZW1lbnRGdW5jdGlvbnMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdz
L2pzL0pTUGx1Z2luRWxlbWVudEZ1bmN0aW9ucy5jcHAKQEAgLTI2LDYgKzI2LDExIEBACiAjaW5j
bHVkZSAiSlNIVE1MRWxlbWVudC5oIgogI2luY2x1ZGUgIlBsdWdpblZpZXdCYXNlLmgiCiAKKyNp
ZiBQTEFURk9STShRVCkKKyNpbmNsdWRlIDxBUElDYXN0Lmg+CisjaW5jbHVkZSA8cXRfY2xhc3Mu
aD4KKyNlbmRpZgorCiB1c2luZyBuYW1lc3BhY2UgSlNDOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CkBAIC03OCw2ICs4MywyNyBAQCBzdGF0aWMgSlNPYmplY3QqIHBsdWdpblNjcmlwdE9iamVjdEZy
b21QbHVnaW5WaWV3QmFzZShKU0hUTUxFbGVtZW50KiBqc0hUTUxFbGVtZQogICAgIHJldHVybiBw
bHVnaW5TY3JpcHRPYmplY3RGcm9tUGx1Z2luVmlld0Jhc2UocGx1Z2luRWxlbWVudCwganNIVE1M
RWxlbWVudC0+Z2xvYmFsT2JqZWN0KCkpOwogfQogCisjaWYgUExBVEZPUk0oUVQpCitzdGF0aWMg
SlNPYmplY3QqIHBsdWdpblNjcmlwdE9iamVjdEZvclFPYmplY3QoSFRNTFBsdWdJbkVsZW1lbnQq
IHBsdWdpbkVsZW1lbnQsIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QpCit7CisgICAgV2lk
Z2V0KiBwbHVnaW5XaWRnZXQgPSBwbHVnaW5FbGVtZW50LT5wbHVnaW5XaWRnZXQoKTsKKyAgICBp
ZiAoIXBsdWdpbldpZGdldCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBRT2JqZWN0KiBvYmpl
Y3QgPSBwbHVnaW5XaWRnZXQtPmJpbmRpbmdPYmplY3QoKTsKKyAgICBpZiAoIW9iamVjdCkKKyAg
ICAgICAgb2JqZWN0ID0gcGx1Z2luV2lkZ2V0LT5wbGF0Zm9ybVdpZGdldCgpOworCisgICAgaWYg
KCFvYmplY3QpCisgICAgICAgIHJldHVybiAwOworCisgICAgSlNPYmplY3RSZWYgd3JhcHBlciA9
IFF0Q2xhc3M6Omluc3RhbmNlRm9yUU9iamVjdCh0b1JlZihnbG9iYWxPYmplY3QtPmdsb2JhbEV4
ZWMoKSksIG9iamVjdCwgUXRDbGFzczo6UXRPd25lcnNoaXApOworICAgIGlmICh3cmFwcGVyKQor
ICAgICAgICByZXR1cm4gdG9KUyh3cmFwcGVyKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgor
CiBKU09iamVjdCogcGx1Z2luU2NyaXB0T2JqZWN0KEV4ZWNTdGF0ZSogZXhlYywgSlNIVE1MRWxl
bWVudCoganNIVE1MRWxlbWVudCkKIHsKICAgICBIVE1MRWxlbWVudCogZWxlbWVudCA9IGpzSFRN
TEVsZW1lbnQtPmltcGwoKTsKQEAgLTk0LDEwICsxMjAsMTYgQEAgSlNPYmplY3QqIHBsdWdpblNj
cmlwdE9iamVjdChFeGVjU3RhdGUqIGV4ZWMsIEpTSFRNTEVsZW1lbnQqIGpzSFRNTEVsZW1lbnQp
CiAKICAgICAvLyBUaGUgcGx1Z2luIGVsZW1lbnQgaG9sZHMgYW4gb3duaW5nIHJlZmVyZW5jZSwg
c28gd2UgZG9uJ3QgaGF2ZSB0by4KICAgICBJbnN0YW5jZSogaW5zdGFuY2UgPSBwbHVnaW5FbGVt
ZW50LT5nZXRJbnN0YW5jZSgpLmdldCgpOwotICAgIGlmICghaW5zdGFuY2UgfHwgIWluc3RhbmNl
LT5yb290T2JqZWN0KCkpCi0gICAgICAgIHJldHVybiAwOworICAgIGlmIChpbnN0YW5jZSAmJiBp
bnN0YW5jZS0+cm9vdE9iamVjdCgpKQorICAgICAgICByZXR1cm4gaW5zdGFuY2UtPmNyZWF0ZVJ1
bnRpbWVPYmplY3QoZXhlYyk7CisKKyNpZiBQTEFURk9STShRVCkKKyAgICAvLyBMYXN0IGNhc2Ug
Zm9yIFF0OiBQbHVnaW4gZW1iZWRkZWQgYXMgUU9iamVjdAorICAgIGlmIChKU09iamVjdCogc2Ny
aXB0T2JqZWN0ID0gcGx1Z2luU2NyaXB0T2JqZWN0Rm9yUU9iamVjdChwbHVnaW5FbGVtZW50LCBq
c0hUTUxFbGVtZW50LT5nbG9iYWxPYmplY3QoKSkpCisgICAgICAgIHJldHVybiBzY3JpcHRPYmpl
Y3Q7CisjZW5kaWYKIAotICAgIHJldHVybiBpbnN0YW5jZS0+Y3JlYXRlUnVudGltZU9iamVjdChl
eGVjKTsKKyAgICByZXR1cm4gMDsKIH0KICAgICAKIEpTVmFsdWUgcnVudGltZU9iamVjdFByb3Bl
cnR5R2V0dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBzbG90QmFzZSwgUHJvcGVydHlOYW1l
IHByb3BlcnR5TmFtZSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL2pzL1Nj
cmlwdENvbnRyb2xsZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMvU2NyaXB0Q29u
dHJvbGxlci5jcHAKaW5kZXggMWYyZTlkMzcyNzE4YzNiNjA0MzMyNTQwZDMyY2JhODEyNTA3ZmY0
OC4uYWEzOGUyZDU0NjdkYzEwZDg2Yjg0ZjVhYTYyMWU5OWQzNTVhODcyNSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMvU2NyaXB0Q29udHJvbGxlci5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvYmluZGluZ3MvanMvU2NyaXB0Q29udHJvbGxlci5jcHAKQEAgLTM5MSw3ICsz
OTEsNyBAQCBOUE9iamVjdCogU2NyaXB0Q29udHJvbGxlcjo6Y3JlYXRlU2NyaXB0T2JqZWN0Rm9y
UGx1Z2luRWxlbWVudChIVE1MUGx1Z0luRWxlbWVudAogCiAjZW5kaWYKIAotI2lmICFQTEFURk9S
TShNQUMpICYmICFQTEFURk9STShRVCkKKyNpZiAhUExBVEZPUk0oTUFDKQogUGFzc1JlZlB0cjxK
U0M6OkJpbmRpbmdzOjpJbnN0YW5jZT4gU2NyaXB0Q29udHJvbGxlcjo6Y3JlYXRlU2NyaXB0SW5z
dGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCiB7CiAgICAgaWYgKCF3aWRnZXQtPmlzUGx1
Z2luVmlldygpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMvU2NyaXB0
Q29udHJvbGxlclF0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL2pzL1NjcmlwdENvbnRy
b2xsZXJRdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTg5NDI1NjA2YmE2
MTk3OGUyNWI5YWU1Zjc2N2Y4ZDk2MmYxZTIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMvU2NyaXB0Q29udHJv
bGxlclF0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMDYgRGlyayBNdWVsbGVyIDxtdWVsbGVyQGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQg
KEMpIDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2
IEdlb3JnZSBTdGFpa29zIDxzdGFpa29zQGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYg
U2ltb24gSGF1c21hbm4gPGhhdXNtYW5uQGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYg
Um9iIEJ1aXMgPGJ1aXNAa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBOaWtvbGFzIFpp
bW1lcm1hbm4gPHppbW1lcm1hbm5Aa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tp
YSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAqIENvcHlyaWdodCAo
QykgMjAwOCBDb2xsYWJvcmEgTHRkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdo
dCAoQykgMjAwOCBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgotICoKLSAqIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlNjcmlw
dENvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgIkJyaWRnZUpTQy5oIgotI2luY2x1ZGUgIkRPTVdp
bmRvdy5oIgotI2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKLSNpbmNsdWRlICJxdF9pbnN0YW5jZS5o
IgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLVBh
c3NSZWZQdHI8SlNDOjpCaW5kaW5nczo6SW5zdGFuY2U+IFNjcmlwdENvbnRyb2xsZXI6OmNyZWF0
ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KFdlYkNvcmU6OldpZGdldCogd2lkZ2V0KQotewotICAg
IGlmICh3aWRnZXQtPmlzUGx1Z2luVmlldygpKSB7Ci0gICAgICAgIFBsdWdpblZpZXcqIHBsdWdp
blZpZXcgPSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4od2lkZ2V0KTsKLSAgICAgICAgcmV0dXJu
IHBsdWdpblZpZXctPmJpbmRpbmdJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIFFPYmplY3QqIG9i
amVjdCA9IHdpZGdldC0+YmluZGluZ09iamVjdCgpOwotCi0gICAgaWYgKCFvYmplY3QpCi0gICAg
ICAgIG9iamVjdCA9IHdpZGdldC0+cGxhdGZvcm1XaWRnZXQoKTsKLQotICAgIGlmICghb2JqZWN0
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBKU0M6OkJpbmRpbmdzOjpRdEluc3Rh
bmNlOjpnZXRRdEluc3RhbmNlKG9iamVjdCwgYmluZGluZ1Jvb3RPYmplY3QoKSwgSlNDOjpCaW5k
aW5nczo6UXRJbnN0YW5jZTo6UXRPd25lcnNoaXApOwotfQotCi19Ci0vLyB2aW06IHRzPTQgc3c9
NCBldApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYnJpZGdlL2pzYy9CcmlkZ2VKU0MuY3Bw
IGIvU291cmNlL1dlYkNvcmUvYnJpZGdlL2pzYy9CcmlkZ2VKU0MuY3BwCmluZGV4IDRjYzgwMDM0
ZTlhYzMzZDg5OTk0N2EzODRlZWRlMWIwMWFiYTZlMDAuLmFkZjRhNWE5NjE3ZTEwY2ZkMjU2ZDlm
NjZjY2FmZGIxODMwMGUzNDggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9qc2Mv
QnJpZGdlSlNDLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvanNjL0JyaWRnZUpTQy5j
cHAKQEAgLTM0LDEwICszNCw2IEBACiAjaW5jbHVkZSAicnVudGltZS9PYmplY3RQcm90b3R5cGUu
aCIKIAogCi0jaWYgUExBVEZPUk0oUVQpCi0jaW5jbHVkZSAicXRfaW5zdGFuY2UuaCIKLSNlbmRp
ZgotCiBuYW1lc3BhY2UgSlNDIHsKIAogbmFtZXNwYWNlIEJpbmRpbmdzIHsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9jbGFzcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9i
cmlkZ2UvcXQvcXRfY2xhc3MuY3BwCmluZGV4IDc2MTc4NzFmM2YzZTBlZTNjMWE4N2Q5ODUyYzAz
OTg2NDUwOTljZTYuLmQ5ZmI4N2NkOTZkZWVlNjUxYzMwYzczNTdkNTc2NDE3ZjY1NzYwOGIgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9jbGFzcy5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvYnJpZGdlL3F0L3F0X2NsYXNzLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29y
IGl0cyBzdWJzaWRpYXJ5KC1pZXMpCiAgKgogICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yMiw3ICsyMiw4
IEBACiAKICNpbmNsdWRlICJBUElDYXN0LmgiCiAjaW5jbHVkZSAiSWRlbnRpZmllci5oIgotI2lu
Y2x1ZGUgInF0X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiSlNDb250ZXh0UmVmUHJpdmF0ZS5oIgor
I2luY2x1ZGUgIkpTT2JqZWN0UmVmUHJpdmF0ZS5oIgogI2luY2x1ZGUgInF0X3J1bnRpbWUuaCIK
IAogI2luY2x1ZGUgPHFkZWJ1Zy5oPgpAQCAtMzEsMjAyICszMiw0MjMgQEAKIG5hbWVzcGFjZSBK
U0MgewogbmFtZXNwYWNlIEJpbmRpbmdzIHsKIAotUXRDbGFzczo6UXRDbGFzcyhjb25zdCBRTWV0
YU9iamVjdCogbW8pCi0gICAgOiBtX21ldGFPYmplY3QobW8pCitzdGF0aWMgdm9pZCB1bnVzZWRX
ZWFrT2JqZWN0TWFwQ2FsbGJhY2soSlNXZWFrT2JqZWN0TWFwUmVmLCB2b2lkKikKIHsKIH0KIAot
UXRDbGFzczo6flF0Q2xhc3MoKQorV2Vha01hcEltcGw6OldlYWtNYXBJbXBsKEpTQ29udGV4dEdy
b3VwUmVmIGdyb3VwKQoreworICAgIG1fY29udGV4dCA9IEpTR2xvYmFsQ29udGV4dENyZWF0ZUlu
R3JvdXAoZ3JvdXAsIDApOworICAgIC8vIERlbGV0ZWQgYnkgR0Mgd2hlbiBtX2NvbnRleHQncyBn
bG9iYWxPYmplY3QgZ2V0cyBjb2xsZWN0ZWQuCisgICAgbV9tYXAgPSBKU1dlYWtPYmplY3RNYXBD
cmVhdGUobV9jb250ZXh0LCAwLCB1bnVzZWRXZWFrT2JqZWN0TWFwQ2FsbGJhY2spOworfQorCitX
ZWFrTWFwSW1wbDo6fldlYWtNYXBJbXBsKCkKIHsKKyAgICBKU0dsb2JhbENvbnRleHRSZWxlYXNl
KG1fY29udGV4dCk7CisgICAgbV9jb250ZXh0ID0gMDsKKyAgICBtX21hcCA9IDA7CiB9CiAKLXR5
cGVkZWYgSGFzaE1hcDxjb25zdCBRTWV0YU9iamVjdCosIFF0Q2xhc3MqPiBDbGFzc2VzQnlNZXRh
T2JqZWN0Owotc3RhdGljIENsYXNzZXNCeU1ldGFPYmplY3QqIGNsYXNzZXNCeU1ldGFPYmplY3Qg
PSAwOwordHlwZWRlZiBIYXNoTWFwPEpTQ29udGV4dEdyb3VwUmVmLCBSZWZQdHI8V2Vha01hcElt
cGw+ID4gV2Vha01hcFNldDsKK3N0YXRpYyBXZWFrTWFwU2V0IHdlYWtNYXBzOwogCi1RdENsYXNz
KiBRdENsYXNzOjpjbGFzc0Zvck9iamVjdChRT2JqZWN0KiBvKQorV2Vha01hcDo6fldlYWtNYXAo
KQogewotICAgIGlmICghY2xhc3Nlc0J5TWV0YU9iamVjdCkKLSAgICAgICAgY2xhc3Nlc0J5TWV0
YU9iamVjdCA9IG5ldyBDbGFzc2VzQnlNZXRhT2JqZWN0OworICAgIC8vIElmIHRoaXMgaXMgdGhl
IGxhc3QgV2Vha01hcCBpbnN0YW5jZSBsZWZ0LCB0aGVuIHdlIHNob3VsZCByZW1vdmUKKyAgICAv
LyB0aGUgY2FjaGVkIFdlYWtNYXBJbXBsIGZyb20gdGhlIGdsb2JhbCB3ZWFrTWFwcywgdG9vLgor
ICAgIGlmIChtX2ltcGwgJiYgbV9pbXBsLT5yZWZDb3VudCgpID09IDIpIHsKKyAgICAgICAgd2Vh
a01hcHMucmVtb3ZlKEpTQ29udGV4dEdldEdyb3VwKG1faW1wbC0+bV9jb250ZXh0KSk7CisgICAg
ICAgIEFTU0VSVChtX2ltcGwtPmhhc09uZVJlZigpKTsKKyAgICB9Cit9CiAKLSAgICBjb25zdCBR
TWV0YU9iamVjdCogbW8gPSBvLT5tZXRhT2JqZWN0KCk7Ci0gICAgUXRDbGFzcyogYUNsYXNzID0g
Y2xhc3Nlc0J5TWV0YU9iamVjdC0+Z2V0KG1vKTsKLSAgICBpZiAoIWFDbGFzcykgewotICAgICAg
ICBhQ2xhc3MgPSBuZXcgUXRDbGFzcyhtbyk7Ci0gICAgICAgIGNsYXNzZXNCeU1ldGFPYmplY3Qt
PnNldChtbywgYUNsYXNzKTsKK3ZvaWQgV2Vha01hcDo6c2V0KEpTQ29udGV4dFJlZiBjb250ZXh0
LCB2b2lkICprZXksIEpTT2JqZWN0UmVmIG9iamVjdCkKK3sKKyAgICBpZiAoIW1faW1wbCkgewor
ICAgICAgICBKU0NvbnRleHRHcm91cFJlZiBncm91cCA9IEpTQ29udGV4dEdldEdyb3VwKGNvbnRl
eHQpOworICAgICAgICBXZWFrTWFwU2V0OjpBZGRSZXN1bHQgZW50cnkgPSB3ZWFrTWFwcy5hZGQo
Z3JvdXAsIDApOworICAgICAgICBpZiAoZW50cnkuaXNOZXdFbnRyeSkKKyAgICAgICAgICAgIGVu
dHJ5Lml0ZXJhdG9yLT5zZWNvbmQgPSBhZG9wdFJlZihuZXcgV2Vha01hcEltcGwoZ3JvdXApKTsK
KyAgICAgICAgbV9pbXBsID0gZW50cnkuaXRlcmF0b3ItPnNlY29uZDsKICAgICB9CisgICAgSlNX
ZWFrT2JqZWN0TWFwU2V0KG1faW1wbC0+bV9jb250ZXh0LCBtX2ltcGwtPm1fbWFwLCBrZXksIG9i
amVjdCk7Cit9CiAKLSAgICByZXR1cm4gYUNsYXNzOworSlNPYmplY3RSZWYgV2Vha01hcDo6Z2V0
KHZvaWQqIGtleSkKK3sKKyAgICBpZiAoIW1faW1wbCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIEpTV2Vha09iamVjdE1hcEdldChtX2ltcGwtPm1fY29udGV4dCwgbV9pbXBsLT5tX21h
cCwga2V5KTsKIH0KIAotY29uc3QgY2hhciogUXRDbGFzczo6bmFtZSgpIGNvbnN0Cit2b2lkIFdl
YWtNYXA6OnJlbW92ZSh2b2lkICprZXkpCiB7Ci0gICAgcmV0dXJuIG1fbWV0YU9iamVjdC0+Y2xh
c3NOYW1lKCk7CisgICAgaWYgKCFtX2ltcGwpCisgICAgICAgIHJldHVybjsKKyAgICBKU1dlYWtP
YmplY3RNYXBSZW1vdmUobV9pbXBsLT5tX2NvbnRleHQsIG1faW1wbC0+bV9tYXAsIGtleSk7CiB9
CiAKLS8vIFdlIHVzZSB0aGlzIHRvIGdldCBhdCBzaWduYWxzIChzbyB3ZSBjYW4gcmV0dXJuIGEg
cHJvcGVyIGZ1bmN0aW9uIG9iamVjdCwKLS8vIGFuZCBub3QgZ2V0IHdyYXBwZWQgaW4gUnVudGlt
ZU1ldGhvZCkuIEFsc28sIHVzZSB0aGlzIGZvciBtZXRob2RzLAotLy8gc28gd2UgY2FuIGNhY2hl
IHRoZSBvYmplY3QgYW5kIHJldHVybiB0aGUgc2FtZSBvYmplY3QgZm9yIHRoZSBzYW1lCi0vLyBp
ZGVudGlmaWVyLgotSlNWYWx1ZSBRdENsYXNzOjpmYWxsYmFja09iamVjdChFeGVjU3RhdGUqIGV4
ZWMsIEluc3RhbmNlKiBpbnN0LCBQcm9wZXJ0eU5hbWUgaWRlbnRpZmllcikKK2NsYXNzIFF0U2Fm
ZU9iamVjdCB7CitwdWJsaWM6CisgICAgUU9iamVjdCogZGF0YSgpIHsgcmV0dXJuIG1fb2JqZWN0
LmRhdGEoKTsgfQorICAgIFF0U2FmZU9iamVjdChRT2JqZWN0KiBvYmplY3QsIGJvb2wgb3duKQor
ICAgICAgICA6IG1fb2JqZWN0KG9iamVjdCkKKyAgICAgICAgLCBtX293bihvd24pCisgICAgeyB9
CisKKyAgICB2aXJ0dWFsIH5RdFNhZmVPYmplY3QoKQorICAgIHsKKyAgICAgICAgaWYgKG1fb3du
ICYmIG1fb2JqZWN0KQorICAgICAgICAgICAgZGVsZXRlIG1fb2JqZWN0LmRhdGEoKTsKKyAgICB9
CisKK3ByaXZhdGU6CisgICAgUVBvaW50ZXI8UU9iamVjdD4gbV9vYmplY3Q7CisgICAgYm9vbCBt
X293bjsKK307CisKK1FPYmplY3QqIFF0Q2xhc3M6OnRvUU9iamVjdChKU0NvbnRleHRSZWYgY29u
dGV4dCwgSlNPYmplY3RSZWYgb2JqZWN0KQogewotICAgIFF0SW5zdGFuY2UqIHF0aW5zdCA9IHN0
YXRpY19jYXN0PFF0SW5zdGFuY2UqPihpbnN0KTsKLSAgICBKU0NvbnRleHRSZWYgY29udGV4dCA9
IHRvUmVmKGV4ZWMpOwotICAgIEpTVmFsdWVSZWYgZXhjZXB0aW9uID0gMDsKKyAgICBpZiAoIW9i
amVjdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFKU1ZhbHVlSXNPYmplY3RPZkNsYXNz
KGNvbnRleHQsIG9iamVjdCwgcXRPYmplY3RCYXNlQ2xhc3MoKSkpCisgICAgICAgIHJldHVybiAw
OworICAgIFF0U2FmZU9iamVjdCogc2FmZSA9IHN0YXRpY19jYXN0PFF0U2FmZU9iamVjdCo+KEpT
T2JqZWN0R2V0UHJpdmF0ZShvYmplY3QpKTsKKyAgICByZXR1cm4gc2FmZSA/IHNhZmUtPmRhdGEo
KSA6IDA7Cit9CiAKLSAgICBTdHJpbmcgdXN0cmluZyhpZGVudGlmaWVyLnB1YmxpY05hbWUoKSk7
Ci0gICAgY29uc3QgUUJ5dGVBcnJheSBuYW1lID0gUVN0cmluZyhyZWludGVycHJldF9jYXN0PGNv
bnN0IFFDaGFyKj4odXN0cmluZy5jaGFyYWN0ZXJzKCkpLCB1c3RyaW5nLmxlbmd0aCgpKS50b0xh
dGluMSgpOwordm9pZCBRdENsYXNzOjp3cmFwcGVkUU9iamVjdERlc3Ryb3llZChRT2JqZWN0ICpv
YmopCit7CisgICAgbV9vYmplY3RDYWNoZS5yZW1vdmUob2JqKTsKK30KKworc3RhdGljIFFCeXRl
QXJyYXkganNTdHJpbmdUb0J5dGVBcnJheShKU1N0cmluZ1JlZiBzdHIpCit7CisgICAgc2l6ZV90
IGxlbmd0aCA9IEpTU3RyaW5nR2V0TGVuZ3RoKHN0cik7CisgICAgY29uc3QgSlNDaGFyKiBzdHJE
YXRhID0gSlNTdHJpbmdHZXRDaGFyYWN0ZXJzUHRyKHN0cik7CisgICAgcmV0dXJuIFFTdHJpbmc6
OmZyb21SYXdEYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUUNoYXIqPihzdHJEYXRhKSwgbGVu
Z3RoKS50b1V0ZjgoKTsKK30KIAotICAgIC8vIEZpcnN0IHNlZSBpZiB3ZSBoYXZlIGEgY2FjaGUg
aGl0Ci0gICAgaWYgKFF0UnVudGltZU1ldGhvZCogbWV0aG9kID0gcXRpbnN0LT5tX21ldGhvZHMu
dmFsdWUobmFtZSkpIHsKLSAgICAgICAgSlNWYWx1ZSBvYmogPSB0b0pTKG1ldGhvZC0+anNPYmpl
Y3RSZWYoY29udGV4dCwgJmV4Y2VwdGlvbikpOwotICAgICAgICBpZiAoZXhjZXB0aW9uKQotICAg
ICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgdG9KUyhleGVjLCBleGNlcHRpb24pKTsK
LSAgICAgICAgcmV0dXJuIG9iajsKK3N0YXRpYyBib29sIGhhc1Byb3BlcnR5UXQoSlNDb250ZXh0
UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIG9iamVjdCwgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1l
KQoreworICAgIFFPYmplY3QqIHFPYmplY3QgPSBRdENsYXNzOjp0b1FPYmplY3QoY29udGV4dCwg
b2JqZWN0KTsKKyAgICBpZiAoIXFPYmplY3QpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
UXRDbGFzcyogcXRDbGFzcyA9IFF0Q2xhc3M6OmNsYXNzRm9yT2JqZWN0KHFPYmplY3QpOworICAg
IHJldHVybiBxdENsYXNzLT5oYXNQcm9wZXJ0eShjb250ZXh0LCBxT2JqZWN0LCBqc1N0cmluZ1Rv
Qnl0ZUFycmF5KHByb3BlcnR5TmFtZSkpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBnZXRQcm9w
ZXJ0eVF0KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBvYmplY3QsIEpTU3RyaW5n
UmVmIHByb3BlcnR5TmFtZSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIEpTVmFsdWVS
ZWYgY2FjaGVkUHJvcGVydHkgPSBKU09iamVjdEdldFByaXZhdGVQcm9wZXJ0eShjb250ZXh0LCBv
YmplY3QsIHByb3BlcnR5TmFtZSk7CisgICAgaWYgKGNhY2hlZFByb3BlcnR5KQorICAgICAgICBy
ZXR1cm4gY2FjaGVkUHJvcGVydHk7CisgICAgUU9iamVjdCogcU9iamVjdCA9IFF0Q2xhc3M6OnRv
UU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICAgIGlmICghcU9iamVjdCkgeworICAgICAgICBz
ZXRFeGNlcHRpb24oY29udGV4dCwgZXhjZXB0aW9uLCBRU3RyaW5nOjpmcm9tTGF0aW4xKCJjYW5u
b3QgYWNjZXNzIG1lbWJlciBgJTEnIG9mIGRlbGV0ZWQgUU9iamVjdCIpCisgICAgICAgICAgICAg
ICAgICAgICAuYXJnKFFTdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBRQ2hhcio+KEpTU3Ry
aW5nR2V0Q2hhcmFjdGVyc1B0cihwcm9wZXJ0eU5hbWUpKSwgSlNTdHJpbmdHZXRMZW5ndGgocHJv
cGVydHlOYW1lKSkpKTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRl
eHQpOwogICAgIH0KIAotICAgIC8vIE5vcGUsIGNyZWF0ZSBhbiBlbnRyeQotICAgIGNvbnN0IFFC
eXRlQXJyYXkgbm9ybWFsID0gUU1ldGFPYmplY3Q6Om5vcm1hbGl6ZWRTaWduYXR1cmUobmFtZS5j
b25zdERhdGEoKSk7CisgICAgUXRDbGFzcyogcXRDbGFzcyA9IFF0Q2xhc3M6OmNsYXNzRm9yT2Jq
ZWN0KHFPYmplY3QpOworICAgIHJldHVybiBxdENsYXNzLT5nZXRQcm9wZXJ0eShjb250ZXh0LCBv
YmplY3QsIHFPYmplY3QsIGpzU3RyaW5nVG9CeXRlQXJyYXkocHJvcGVydHlOYW1lKSwgZXhjZXB0
aW9uKTsKK30KKworc3RhdGljIHZvaWQgZ2V0UHJvcGVydHlOYW1lc1F0KEpTQ29udGV4dFJlZiBj
b250ZXh0LCBKU09iamVjdFJlZiBvYmplY3QsIEpTUHJvcGVydHlOYW1lQWNjdW11bGF0b3JSZWYg
cHJvcGVydHlOYW1lcykKK3sKKyAgICBRT2JqZWN0KiBxT2JqZWN0ID0gUXRDbGFzczo6dG9RT2Jq
ZWN0KGNvbnRleHQsIG9iamVjdCk7CisgICAgaWYgKCFxT2JqZWN0KQorICAgICAgICByZXR1cm47
CisKKyAgICBRdENsYXNzKiBxdENsYXNzID0gUXRDbGFzczo6Y2xhc3NGb3JPYmplY3QocU9iamVj
dCk7CisgICAgcXRDbGFzcy0+Z2V0UHJvcGVydHlOYW1lcyhjb250ZXh0LCBxT2JqZWN0LCBwcm9w
ZXJ0eU5hbWVzKTsKK30KIAotICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhbiBleGFjdCBtYXRjaAot
ICAgIGludCBpbmRleCA9IC0xOwotICAgIFFNZXRhTWV0aG9kIG1ldGFNZXRob2Q7Ci0gICAgaWYg
KG5vcm1hbC5jb250YWlucygnKCcpICYmIChpbmRleCA9IG1fbWV0YU9iamVjdC0+aW5kZXhPZk1l
dGhvZChub3JtYWwpKSAhPSAtMSkgewotICAgICAgICBtZXRhTWV0aG9kID0gbV9tZXRhT2JqZWN0
LT5tZXRob2QoaW5kZXgpOwotICAgICAgICBpZiAobWV0YU1ldGhvZC5hY2Nlc3MoKSA9PSBRTWV0
YU1ldGhvZDo6UHJpdmF0ZSkKLSAgICAgICAgICAgIGluZGV4ID0gLTE7CitzdGF0aWMgYm9vbCBz
ZXRQcm9wZXJ0eVF0KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBvYmplY3QsIEpT
U3RyaW5nUmVmIHByb3BlcnR5TmFtZSwgSlNWYWx1ZVJlZiB2YWx1ZSwgSlNWYWx1ZVJlZiogZXhj
ZXB0aW9uKQoreworICAgIFFPYmplY3QqIHFPYmplY3QgPSBRdENsYXNzOjp0b1FPYmplY3QoY29u
dGV4dCwgb2JqZWN0KTsKKyAgICBpZiAoIXFPYmplY3QpIHsKKyAgICAgICAgc2V0RXhjZXB0aW9u
KGNvbnRleHQsIGV4Y2VwdGlvbiwgUVN0cmluZzo6ZnJvbUxhdGluMSgiY2Fubm90IGFjY2VzcyBt
ZW1iZXIgYCUxJyBvZiBkZWxldGVkIFFPYmplY3QiKQorICAgICAgICAgICAgICAgICAgICAgLmFy
ZyhRU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUUNoYXIqPihKU1N0cmluZ0dldENoYXJh
Y3RlcnNQdHIocHJvcGVydHlOYW1lKSksIEpTU3RyaW5nR2V0TGVuZ3RoKHByb3BlcnR5TmFtZSkp
KSk7CisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKICAgICB9
CiAKLSAgICAvLyBOb3BlLi4gdHJ5IGEgYmFzZW5hbWUgbWF0Y2gKLSAgICBpZiAoaW5kZXggPT0g
LTEpIHsKLSAgICAgICAgY29uc3QgaW50IGNvdW50ID0gbV9tZXRhT2JqZWN0LT5tZXRob2RDb3Vu
dCgpOwotICAgICAgICBmb3IgKGluZGV4ID0gY291bnQgLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4
KSB7Ci0gICAgICAgICAgICBtZXRhTWV0aG9kID0gbV9tZXRhT2JqZWN0LT5tZXRob2QoaW5kZXgp
OwotICAgICAgICAgICAgaWYgKG1ldGFNZXRob2QuYWNjZXNzKCkgPT0gUU1ldGFNZXRob2Q6OlBy
aXZhdGUpCi0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgUXRDbGFzcyogcXRDbGFzcyA9
IFF0Q2xhc3M6OmNsYXNzRm9yT2JqZWN0KHFPYmplY3QpOworICAgIHJldHVybiBxdENsYXNzLT5z
ZXRQcm9wZXJ0eShjb250ZXh0LCBxT2JqZWN0LCBqc1N0cmluZ1RvQnl0ZUFycmF5KHByb3BlcnR5
TmFtZSksIHZhbHVlLCBleGNlcHRpb24pOworfQogCi0gICAgICAgICAgICBpZiAobWV0YU1ldGhv
ZC5uYW1lKCkgPT0gbm9ybWFsKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Citz
dGF0aWMgYm9vbCBkZWxldGVQcm9wZXJ0eVF0KEpTQ29udGV4dFJlZiwgSlNPYmplY3RSZWYsIEpT
U3RyaW5nUmVmLCBKU1ZhbHVlUmVmKikKK3sKKyAgICAvLyAjIyMgSlNDIGRvZXMgbm90IHBhc3Mg
dGhlIHJldHVybiB2YWx1ZSBiYWNrIHRvIEphdmFTY3JpcHQgYnV0IGluc3RlYWQgdXNlcyAiZmFs
c2UiIHRvIGluZGljYXRlCisgICAgLy8gdGhhdCB0aGUgcHJvcGVydHkgaXMgdW5rbm93bi4gRm9y
IG1ldGEgb2JqZWN0IHByb3BlcnRpZXMgdGhlIGNvcnJlY3QgcmV0dXJuIHZhbHVlIGZvciB0aGUg
ZGVsZXRlCisgICAgLy8gc3RhdGVtZW50IGNvdWxkIGJlIGltcGxlbWVudGVkIHVzaW5nIEpTQ2xh
c3NSZWY6OnN0YXRpY1ZhbHVlcy4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBKU1Zh
bHVlUmVmIGNvbnZlcnRUb1R5cGVRdChKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYg
b2JqZWN0LCA6OkpTVHlwZSB0eXBlLCBKU1ZhbHVlUmVmKikKK3sKKyAgICBRT2JqZWN0KiBxT2Jq
ZWN0ID0gUXRDbGFzczo6dG9RT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgICAgaWYgKCFxT2Jq
ZWN0KQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAg
ICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtKU1R5cGVVbmRlZmluZWQ6CisgICAgICAgIHJl
dHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICBjYXNlIGtKU1R5cGVCb29s
ZWFuOgorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VCb29sZWFuKGNvbnRleHQsIHFPYmplY3Qp
OworICAgIGNhc2Uga0pTVHlwZU51bWJlcjoKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlTnVt
YmVyKGNvbnRleHQsIDAuMCk7CisgICAgY2FzZSBrSlNUeXBlTnVsbDoKKyAgICAgICAgcmV0dXJu
IEpTVmFsdWVNYWtlTnVsbChjb250ZXh0KTsKKyAgICBjYXNlIGtKU1R5cGVTdHJpbmc6IHsKKyAg
ICAgICAgUXRDbGFzcyogcXRDbGFzcyA9IFF0Q2xhc3M6OmNsYXNzRm9yT2JqZWN0KHFPYmplY3Qp
OworICAgICAgICBRU3RyaW5nIHN0cmluZyA9IHF0Q2xhc3MtPnRvU3RyaW5nKHFPYmplY3QpOwor
ICAgICAgICBKU1N0cmluZ1JlZiBzdHJpbmdSZWYgPSBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0
ZXJzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSlNDaGFyKj4oc3RyaW5nLmRhdGEoKSksIHN0cmlu
Zy5sZW5ndGgoKSArIDEpOworICAgICAgICBKU1ZhbHVlUmVmIHZhbHVlID0gSlNWYWx1ZU1ha2VT
dHJpbmcoY29udGV4dCwgc3RyaW5nUmVmKTsKKyAgICAgICAgSlNTdHJpbmdSZWxlYXNlKHN0cmlu
Z1JlZik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgY2FzZSBrSlNUeXBlT2Jq
ZWN0OgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgfQorfQogCi0g
ICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAg
IGludCBmbGFncyA9IG1ldGFNZXRob2QubWV0aG9kVHlwZSgpID09IFFNZXRhTWV0aG9kOjpTaWdu
YWwgPyBRdFJ1bnRpbWVNZXRob2Q6Ok1ldGhvZElzU2lnbmFsIDogMDsKLSAgICBRdFJ1bnRpbWVN
ZXRob2QqIG1ldGhvZCA9IG5ldyBRdFJ1bnRpbWVNZXRob2QoY29udGV4dCwgc3RhdGljX2Nhc3Q8
UXRJbnN0YW5jZSo+KGluc3QpLT5nZXRPYmplY3QoKSwgbm9ybWFsLCBpbmRleCwgZmxhZ3MsIHF0
aW5zdCk7Ci0gICAgcXRpbnN0LT5tX21ldGhvZHMuaW5zZXJ0KG5hbWUsIG1ldGhvZCk7Ci0gICAg
SlNWYWx1ZSBvYmogPSB0b0pTKG1ldGhvZC0+anNPYmplY3RSZWYoY29udGV4dCwgJmV4Y2VwdGlv
bikpOwotICAgIGlmIChleGNlcHRpb24pCi0gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMs
IHRvSlMoZXhlYywgZXhjZXB0aW9uKSk7Ci0gICAgcmV0dXJuIG9iajsKLX0KLQotLy8gVGhpcyBm
dW5jdGlvbmFsaXR5IGlzIGhhbmRsZWQgYnkgdGhlIGZhbGxiYWNrIGNhc2UgYWJvdmUuLi4KLU1l
dGhvZExpc3QgUXRDbGFzczo6bWV0aG9kc05hbWVkKFByb3BlcnR5TmFtZSwgSW5zdGFuY2UqKSBj
b25zdAotewotICAgIHJldHVybiBNZXRob2RMaXN0KCk7Ci19Ci0KLS8vICMjIyB3ZSBtYXkgZW5k
IHVwIHdpdGggYSBkaWZmZXJlbnQgc2VhcmNoIG9yZGVyIHRoYW4gUXRTY3JpcHQgYnkgbm90Ci0v
LyBmb2xkaW5nIHRoaXMgY29kZSBpbnRvIHRoZSBmYWxsYmFja01ldGhvZCBhYm92ZSwgYnV0IEZp
ZWxkcyBwcm9wYWdhdGUgb3V0Ci0vLyBvZiB0aGUgYmluZGluZyBjb2RlCi1GaWVsZCogUXRDbGFz
czo6ZmllbGROYW1lZChQcm9wZXJ0eU5hbWUgaWRlbnRpZmllciwgSW5zdGFuY2UqIGluc3RhbmNl
KSBjb25zdAotewotICAgIC8vIENoZWNrIHN0YXRpYyBwcm9wZXJ0aWVzIGZpcnN0Ci0gICAgUXRJ
bnN0YW5jZSogcXRpbnN0ID0gc3RhdGljX2Nhc3Q8UXRJbnN0YW5jZSo+KGluc3RhbmNlKTsKLQot
ICAgIFFPYmplY3QqIG9iaiA9IHF0aW5zdC0+Z2V0T2JqZWN0KCk7Ci0gICAgU3RyaW5nIHVzdHJp
bmcoaWRlbnRpZmllci5wdWJsaWNOYW1lKCkpOwotICAgIGNvbnN0IFFTdHJpbmcgbmFtZShyZWlu
dGVycHJldF9jYXN0PGNvbnN0IFFDaGFyKj4odXN0cmluZy5jaGFyYWN0ZXJzKCkpLCB1c3RyaW5n
Lmxlbmd0aCgpKTsKLSAgICBjb25zdCBRQnl0ZUFycmF5IGFzY2lpID0gbmFtZS50b0xhdGluMSgp
OwotCi0gICAgLy8gRmlyc3QgY2hlY2sgZm9yIGEgY2FjaGVkIGZpZWxkCi0gICAgUXRGaWVsZCog
ZiA9IHF0aW5zdC0+bV9maWVsZHMudmFsdWUobmFtZSk7Ci0KLSAgICBpZiAob2JqKSB7Ci0gICAg
ICAgIGlmIChmKSB7Ci0gICAgICAgICAgICAvLyBXZSBvbmx5IGNhY2hlIHJlYWwgbWV0YXByb3Bl
cnRpZXMsIGJ1dCB3ZSBkbyBzdG9yZSB0aGUKLSAgICAgICAgICAgIC8vIG90aGVyIHR5cGVzIHNv
IHdlIGNhbiBkZWxldGUgdGhlbSBsYXRlcgotICAgICAgICAgICAgaWYgKGYtPmZpZWxkVHlwZSgp
ID09IFF0RmllbGQ6Ok1ldGFQcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZjsKLSNp
Zm5kZWYgUVRfTk9fUFJPUEVSVElFUwotICAgICAgICAgICAgaWYgKGYtPmZpZWxkVHlwZSgpID09
IFF0RmllbGQ6OkR5bmFtaWNQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgIGlmIChvYmotPmR5
bmFtaWNQcm9wZXJ0eU5hbWVzKCkuaW5kZXhPZihhc2NpaSkgPj0gMCkKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGY7Ci0gICAgICAgICAgICAgICAgLy8gRHluYW1pYyBwcm9wZXJ0eSB0aGF0
IGRpc2FwcGVhcmVkCi0gICAgICAgICAgICAgICAgcXRpbnN0LT5tX2ZpZWxkcy5yZW1vdmUobmFt
ZSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGY7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAg
ICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnN0IFFMaXN0PFFPYmplY3QqPiYg
Y2hpbGRyZW4gPSBvYmotPmNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGNv
dW50ID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0g
MDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBRT2JqZWN0
KiBjaGlsZCA9IGNoaWxkcmVuLmF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNo
aWxkLT5vYmplY3ROYW1lKCkgPT0gbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaW5k
IGl0LCBkZWxldGUgaXQgZnJvbSB0aGUgY2FjaGUKLSAgICAgICAgICAgICAgICBxdGluc3QtPm1f
ZmllbGRzLnJlbW92ZShuYW1lKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgZjsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQorc3RhdGljIHZvaWQgZmluYWxpemVRdChKU09iamVjdFJlZiBvYmpl
Y3QpCit7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PFF0U2FmZU9iamVjdCo+KEpTT2JqZWN0R2V0
UHJpdmF0ZShvYmplY3QpKTsKK30KIAotICAgICAgICBpbnQgaW5kZXggPSBtX21ldGFPYmplY3Qt
PmluZGV4T2ZQcm9wZXJ0eShhc2NpaSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAg
ICAgICAgICBjb25zdCBRTWV0YVByb3BlcnR5IHByb3AgPSBtX21ldGFPYmplY3QtPnByb3BlcnR5
KGluZGV4KTsKK1FTdHJpbmcgUXRDbGFzczo6dG9TdHJpbmcoUU9iamVjdCogb2JqKQoreworICAg
IGlmICghb2JqKQorICAgICAgICByZXR1cm4gUVN0cmluZygpOworCisgICAgLy8gSG1tLi4gc2Vl
IGlmIHRoZXJlIGlzIGEgdG9TdHJpbmcgZGVmaW5lZAorICAgIFFCeXRlQXJyYXkgYnVmOworICAg
IC8vIENoZWF0IGFuZCBkb24ndCB1c2UgdGhlIGZ1bGwgbmFtZSByZXNvbHV0aW9uCisgICAgaW50
IGluZGV4ID0gbV9tZXRhT2JqZWN0LT5pbmRleE9mTWV0aG9kKCJ0b1N0cmluZygpIik7CisgICAg
UU1ldGFNZXRob2QgbTsKKyAgICBjb25zdCBjaGFyKiByZXRzaWc7CisgICAgdm9pZCogcWFyZ3Nb
MV07CisgICAgUVZhcmlhbnQgcmV0OworCisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgZ290
byB1c2VEZWZhdWx0OworCisgICAgbSA9IG9iai0+bWV0YU9iamVjdCgpLT5tZXRob2QoaW5kZXgp
OworICAgIC8vIENoZWNrIHRvIHNlZSBob3cgbXVjaCB3ZSBjYW4gY2FsbCBpdAorICAgIGlmICht
LmFjY2VzcygpID09IFFNZXRhTWV0aG9kOjpQcml2YXRlCisgICAgICAgIHx8IG0ubWV0aG9kVHlw
ZSgpID09IFFNZXRhTWV0aG9kOjpTaWduYWwKKyAgICAgICAgfHwgbS5wYXJhbWV0ZXJDb3VudCgp
KQorICAgICAgICBnb3RvIHVzZURlZmF1bHQ7CisKKyAgICByZXRzaWcgPSBtLnR5cGVOYW1lKCk7
CisgICAgaWYgKHJldHNpZyAmJiAqcmV0c2lnKSB7CisgICAgICAgIHJldCA9IFFWYXJpYW50KFFN
ZXRhVHlwZTo6dHlwZShyZXRzaWcpLCAodm9pZCopMCk7CisgICAgICAgIHFhcmdzWzBdID0gcmV0
LmRhdGEoKTsKKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChwcm9wLmlzU2NyaXB0YWJsZShvYmop
KSB7Ci0gICAgICAgICAgICAgICAgZiA9IG5ldyBRdEZpZWxkKHByb3ApOwotICAgICAgICAgICAg
ICAgIHF0aW5zdC0+bV9maWVsZHMuaW5zZXJ0KG5hbWUsIGYpOwotICAgICAgICAgICAgICAgIHJl
dHVybiBmOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKFFNZXRhT2JqZWN0Ojpt
ZXRhY2FsbChvYmosIFFNZXRhT2JqZWN0OjpJbnZva2VNZXRhTWV0aG9kLCBpbmRleCwgcWFyZ3Mp
ID49IDApCisgICAgICAgIGdvdG8gdXNlRGVmYXVsdDsKIAotI2lmbmRlZiBRVF9OT19QUk9QRVJU
SUVTCi0gICAgICAgIC8vIER5bmFtaWMgcHJvcGVydGllcwotICAgICAgICBpbmRleCA9IG9iai0+
ZHluYW1pY1Byb3BlcnR5TmFtZXMoKS5pbmRleE9mKGFzY2lpKTsKLSAgICAgICAgaWYgKGluZGV4
ID49IDApIHsKLSAgICAgICAgICAgIGYgPSBuZXcgUXRGaWVsZChhc2NpaSk7Ci0gICAgICAgICAg
ICBxdGluc3QtPm1fZmllbGRzLmluc2VydChuYW1lLCBmKTsKLSAgICAgICAgICAgIHJldHVybiBm
OwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAvLyBDaGlsZCBvYmplY3RzCi0KLSAgICAg
ICAgY29uc3QgUUxpc3Q8UU9iamVjdCo+JiBjaGlsZHJlbiA9IG9iai0+Y2hpbGRyZW4oKTsKLSAg
ICAgICAgY29uc3QgaW50IGNvdW50ID0gY2hpbGRyZW4uY291bnQoKTsKLSAgICAgICAgZm9yIChp
bmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpIHsKLSAgICAgICAgICAgIFFPYmplY3Qq
IGNoaWxkID0gY2hpbGRyZW4uYXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKGNoaWxkLT5vYmpl
Y3ROYW1lKCkgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgIGYgPSBuZXcgUXRGaWVsZChjaGls
ZCk7Ci0gICAgICAgICAgICAgICAgcXRpbnN0LT5tX2ZpZWxkcy5pbnNlcnQobmFtZSwgZik7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIGY7Ci0gICAgICAgICAgICB9CisgICAgaWYgKHJldC5pc1Zh
bGlkKCkgJiYgcmV0LmNhbkNvbnZlcnQoUVZhcmlhbnQ6OlN0cmluZykpCisgICAgICAgIHJldHVy
biByZXQudG9TdHJpbmcoKTsKKwordXNlRGVmYXVsdDoKKyAgICBjb25zdCBRTWV0YU9iamVjdCog
bWV0YSA9IG9iaiA/IG9iai0+bWV0YU9iamVjdCgpIDogJlFPYmplY3Q6OnN0YXRpY01ldGFPYmpl
Y3Q7CisgICAgUVN0cmluZyBuYW1lID0gb2JqID8gb2JqLT5vYmplY3ROYW1lKCkgOiBRU3RyaW5n
Ojpmcm9tVXRmOCgidW5uYW1lZCIpOworICAgIHJldHVybiBRU3RyaW5nOjpmcm9tVXRmOCgiJTAo
bmFtZSA9IFwiJTFcIikiKQorICAgICAgICAgICAgICAgICAgLmFyZyhRTGF0aW4xU3RyaW5nKG1l
dGEtPmNsYXNzTmFtZSgpKSkuYXJnKG5hbWUpOworfQorCitKU09iamVjdFJlZiBRdENsYXNzOjpp
bnN0YW5jZUZvclFPYmplY3QoSlNDb250ZXh0UmVmIGNvbnRleHQsIFFPYmplY3QqIG9iamVjdCwg
VmFsdWVPd25lcnNoaXAgb3duZXJzaGlwKQoreworICAgIFF0Q2xhc3MqIGNscyA9IFF0Q2xhc3M6
OmNsYXNzRm9yT2JqZWN0KG9iamVjdCk7CisgICAgSlNPYmplY3RSZWYgcmVmID0gY2xzLT5tX29i
amVjdENhY2hlLmdldChvYmplY3QpOworICAgIGlmIChyZWYgJiYgdG9RT2JqZWN0KGNvbnRleHQs
IHJlZikpCisgICAgICAgIHJldHVybiByZWY7CisKKyAgICBib29sIG93biA9IG93bmVyc2hpcCA9
PSBTY3JpcHRPd25lcnNoaXAgfHwgKG93bmVyc2hpcCA9PSBBdXRvT3duZXJzaGlwICYmICFvYmpl
Y3QtPnBhcmVudCgpKTsKKworICAgIHJlZiA9IEpTT2JqZWN0TWFrZShjb250ZXh0LCBjbHMtPm1f
Y2xhc3MsIG5ldyBRdFNhZmVPYmplY3Qob2JqZWN0LCBvd24pKTsKKyAgICBjb25uZWN0KG9iamVj
dCwgU0lHTkFMKGRlc3Ryb3llZChRT2JqZWN0KikpLCBjbHMsIFNMT1Qod3JhcHBlZFFPYmplY3RE
ZXN0cm95ZWQoUU9iamVjdCopKSk7CisgICAgY2xzLT5tX29iamVjdENhY2hlLnNldChjb250ZXh0
LCBvYmplY3QsIHJlZik7CisgICAgcmV0dXJuIHJlZjsKK30KKworSlNDbGFzc1JlZiBRdENsYXNz
OjpxdE9iamVjdEJhc2VDbGFzcygpCit7CisgICAgc3RhdGljIEpTQ2xhc3NSZWYgY2xhc3NSZWYg
PSAwOworICAgIGlmICghY2xhc3NSZWYpCisgICAgICAgIGNsYXNzUmVmID0gSlNDbGFzc0NyZWF0
ZSgma0pTQ2xhc3NEZWZpbml0aW9uRW1wdHkpOworCisgICAgcmV0dXJuIGNsYXNzUmVmOworfQor
CitRdENsYXNzOjpRdENsYXNzKGNvbnN0IFFNZXRhT2JqZWN0KiBtbykKKyAgICA6IG1fbWV0YU9i
amVjdChtbykKK3sKKyAgICBjb25zdCBpbnQgY291bnQgPSBtX21ldGFPYmplY3QtPm1ldGhvZENv
dW50KCk7CisKKyAgICBmb3IgKGludCBpbmRleCA9IGNvdW50IC0gMTsgaW5kZXggPj0gMDsgLS1p
bmRleCkgeworICAgICAgICBjb25zdCBRTWV0YU1ldGhvZCBtID0gbV9tZXRhT2JqZWN0LT5tZXRo
b2QoaW5kZXgpOworICAgICAgICBpZiAobS5hY2Nlc3MoKSA9PSBRTWV0YU1ldGhvZDo6UHJpdmF0
ZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFFCeXRlQXJyYXkgc2lnbmF0dXJl
KG0ubWV0aG9kU2lnbmF0dXJlKCkpOworICAgICAgICBRQnl0ZUFycmF5IGJhc2VOYW1lID0gc2ln
bmF0dXJlLmxlZnQoc2lnbmF0dXJlLmluZGV4T2YoJygnKSk7CisgICAgICAgIG1fbWV0aG9kSW5k
ZXhbc2lnbmF0dXJlXSA9IGluZGV4OworICAgICAgICBtX21ldGhvZEluZGV4W2Jhc2VOYW1lXSA9
IGluZGV4OworICAgICAgICBtX3Byb3BlcnRpZXNGcm9tTWV0YU9iamVjdC5hcHBlbmQoYmFzZU5h
bWUpOworICAgICAgICBtX3Byb3BlcnRpZXNGcm9tTWV0YU9iamVjdC5hcHBlbmQoc2lnbmF0dXJl
KTsKKyAgICB9CisKKyAgICBpbnQgcHJvcGVydHlDb3VudCA9IG1fbWV0YU9iamVjdC0+cHJvcGVy
dHlDb3VudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7
CisgICAgICAgIFFNZXRhUHJvcGVydHkgcHJvcGVydHkgPSBtX21ldGFPYmplY3QtPnByb3BlcnR5
KGkpOworICAgICAgICBpZiAocHJvcGVydHkuaXNTY3JpcHRhYmxlKCkpCisgICAgICAgICAgICBt
X3Byb3BlcnRpZXNGcm9tTWV0YU9iamVjdC5hcHBlbmQobV9tZXRhT2JqZWN0LT5wcm9wZXJ0eShp
KS5uYW1lKCkpOworICAgIH0KKworICAgIGNvbnN0IEpTQ2xhc3NEZWZpbml0aW9uIGRlZiA9IHsg
MCwgMCwgbW8tPmNsYXNzTmFtZSgpLCBxdE9iamVjdEJhc2VDbGFzcygpLCAwLCAwLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmluYWxpemVRdCwgaGFzUHJvcGVydHlR
dCwgZ2V0UHJvcGVydHlRdCwgc2V0UHJvcGVydHlRdCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRlbGV0ZVByb3BlcnR5UXQsIGdldFByb3BlcnR5TmFtZXNRdCwgMCwgMCwg
MCwgY29udmVydFRvVHlwZVF0IH07CisKKyAgICBtX2NsYXNzID0gSlNDbGFzc0NyZWF0ZSgmZGVm
KTsKK30KKworUXRDbGFzczo6flF0Q2xhc3MoKQoreworfQorCitzdGF0aWMgSGFzaE1hcDxjb25z
dCBRTWV0YU9iamVjdCosIFF0Q2xhc3MqPiYgY2xhc3Nlc0J5TWV0YU9iamVjdCgpCit7CisgICAg
c3RhdGljIEhhc2hNYXA8Y29uc3QgUU1ldGFPYmplY3QqLCBRdENsYXNzKj4gY2xhc3NlczsKKyAg
ICByZXR1cm4gY2xhc3NlczsKK30KKworYm9vbCBRdENsYXNzOjpoYXNQcm9wZXJ0eShKU0NvbnRl
eHRSZWYsIFFPYmplY3QqIG9iamVjdCwgY29uc3QgUUJ5dGVBcnJheSYgcHJvcGVydHkpCit7Cisg
ICAgaWYgKG1fcHJvcGVydGllc0Zyb21NZXRhT2JqZWN0LmNvbnRhaW5zKHByb3BlcnR5KSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAob2JqZWN0LT5keW5hbWljUHJvcGVydHlOYW1l
cygpLmNvbnRhaW5zKHByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBRT2Jq
ZWN0TGlzdCBjaGlsZHJlbiA9IG9iamVjdC0+Y2hpbGRyZW4oKTsKKyAgICBmb3IgKGludCBpID0g
MDsgaSA8IGNoaWxkcmVuLmNvdW50KCk7ICsraSkgeworICAgICAgICBRT2JqZWN0KiBjaGlsZCA9
IGNoaWxkcmVuW2ldOworICAgICAgICBpZiAoY2hpbGQtPm9iamVjdE5hbWUoKS50b1V0ZjgoKSA9
PSBwcm9wZXJ0eSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVy
biBmYWxzZTsKK30KKworSlNWYWx1ZVJlZiBRdENsYXNzOjpnZXRQcm9wZXJ0eShKU0NvbnRleHRS
ZWYgY29udGV4dCwgSlNPYmplY3RSZWYganNPYmplY3QsIFFPYmplY3QqIG9iamVjdCwgY29uc3Qg
UUJ5dGVBcnJheSYgcHJvcGVydHksIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpZiAo
IW1fcHJvcGVydGllc0Zyb21NZXRhT2JqZWN0LmNvbnRhaW5zKHByb3BlcnR5KSkgeworICAgICAg
ICBRT2JqZWN0TGlzdCBjaGlsZHJlbiA9IG9iamVjdC0+Y2hpbGRyZW4oKTsKKyAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5jb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIFFP
YmplY3QqIGNoaWxkID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBpZiAoY2hpbGQtPm9iamVj
dE5hbWUoKS50b1V0ZjgoKSA9PSBwcm9wZXJ0eSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5z
dGFuY2VGb3JRT2JqZWN0KGNvbnRleHQsIGNoaWxkLCBRdE93bmVyc2hpcCk7CiAgICAgICAgIH0K
KyAgICB9CiAKLSAgICAgICAgLy8gTm90aGluZyBuYW1lZCB0aGlzCi0gICAgICAgIHJldHVybiAw
OworICAgIGNvbnN0IFFNZXRhT2JqZWN0KiBtZXRhT2JqZWN0ID0gb2JqZWN0LT5tZXRhT2JqZWN0
KCk7CisgICAgaW50IHByb3BlcnR5SW5kZXggPSBtZXRhT2JqZWN0LT5pbmRleE9mUHJvcGVydHko
cHJvcGVydHkpOworICAgIGlmIChwcm9wZXJ0eUluZGV4ICE9IC0xKSB7CisgICAgICAgIFFNZXRh
UHJvcGVydHkgcXRQcm9wZXJ0eSA9IG1ldGFPYmplY3QtPnByb3BlcnR5KHByb3BlcnR5SW5kZXgp
OworICAgICAgICBpZiAoIXF0UHJvcGVydHkuaXNSZWFkYWJsZSgpKQorICAgICAgICAgICAgcmV0
dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworICAgICAgICBRVmFyaWFudCB2YWx1
ZSA9IHF0UHJvcGVydHkucmVhZChvYmplY3QpOworICAgICAgICByZXR1cm4gY29udmVydFFWYXJp
YW50VG9WYWx1ZShjb250ZXh0LCB2YWx1ZSwgZXhjZXB0aW9uKTsKICAgICB9Ci0gICAgLy8gRm9y
IGNvbXBhdGliaWxpdHkgd2l0aCBxdHNjcmlwdCwgY2FjaGVkIG1ldGhvZHMgZG9uJ3QgY2F1c2UK
LSAgICAvLyBlcnJvcnMgdW50aWwgdGhleSBhcmUgYWNjZXNzZWQsIHNvIGRvbid0IGJsaW5kbHkg
Y3JlYXRlIGFuIGVycm9yCi0gICAgLy8gaGVyZS4KLSAgICBpZiAocXRpbnN0LT5tX21ldGhvZHMu
Y29udGFpbnMoYXNjaWkpKQotICAgICAgICByZXR1cm4gMDsKIAotI2lmbmRlZiBRVF9OT19QUk9Q
RVJUSUVTCi0gICAgLy8gZGVsZXRlZCBxb2JqZWN0LCBidXQgY2FuJ3QgdGhyb3cgYW4gZXJyb3Ig
ZnJvbSBoZXJlIChubyBleGVjKQotICAgIC8vIGNyZWF0ZSBhIGZha2UgUXRGaWVsZCB0aGF0IHdp
bGwgdGhyb3cgdXBvbiBhY2Nlc3MKLSAgICBpZiAoIWYpIHsKLSAgICAgICAgZiA9IG5ldyBRdEZp
ZWxkKGFzY2lpKTsKLSAgICAgICAgcXRpbnN0LT5tX2ZpZWxkcy5pbnNlcnQobmFtZSwgZik7Cisg
ICAgUU1hcDxRQnl0ZUFycmF5LCBpbnQ+OjppdGVyYXRvciBpbmRleEl0ID0gbV9tZXRob2RJbmRl
eC5maW5kKHByb3BlcnR5KTsKKyAgICBpZiAoaW5kZXhJdCAhPSBtX21ldGhvZEluZGV4LmVuZCgp
KSB7CisgICAgICAgIGludCBpbmRleCA9IGluZGV4SXQudmFsdWUoKTsKKyAgICAgICAgUU1ldGFN
ZXRob2QgbWV0YU1ldGhvZCA9IG1fbWV0YU9iamVjdC0+bWV0aG9kKGluZGV4KTsKKyAgICAgICAg
Ly8gbWV0aG9kIG9iamVjdCBpcyBkZWxldGVkIHRocm91Z2ggZmluYWxpemUgY2FsbGJhY2sgZnJv
bSBpdHMgb3duIEpTQ2xhc3NSZWYuCisgICAgICAgIFF0UnVudGltZU1ldGhvZCogbWV0aG9kID0g
bmV3IFF0UnVudGltZU1ldGhvZChvYmplY3QsIHByb3BlcnR5LCBpbmRleCwgbWV0YU1ldGhvZC5t
ZXRob2RUeXBlKCkgPT0gUU1ldGFNZXRob2Q6OlNpZ25hbCA/IFF0UnVudGltZU1ldGhvZDo6TWV0
aG9kSXNTaWduYWwgOiAwKTsKKyAgICAgICAgSlNPYmplY3RSZWYgZnVuY3Rpb24gPSBtZXRob2Qt
PmpzT2JqZWN0UmVmKGNvbnRleHQsIGV4Y2VwdGlvbik7CisgICAgICAgIEpTU3RyaW5nUmVmIHBy
b3BOYW1lU3RyID0gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcocHJvcGVydHkuY29uc3RE
YXRhKCkpOworICAgICAgICBKU09iamVjdFNldFByaXZhdGVQcm9wZXJ0eShjb250ZXh0LCBqc09i
amVjdCwgcHJvcE5hbWVTdHIsIGZ1bmN0aW9uKTsKKyAgICAgICAgSlNTdHJpbmdSZWxlYXNlKHBy
b3BOYW1lU3RyKTsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uOworICAgIH0KKworICAgIC8vIER5
bmFtaWMgcHJvcGVydHkgbG9va3VwCisgICAgUVZhcmlhbnQgdmFsdWUgPSBvYmplY3QtPnByb3Bl
cnR5KHByb3BlcnR5KTsKKyAgICByZXR1cm4gY29udmVydFFWYXJpYW50VG9WYWx1ZShjb250ZXh0
LCB2YWx1ZSwgZXhjZXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kTmFtZShKU1Byb3Bl
cnR5TmFtZUFjY3VtdWxhdG9yUmVmIG5hbWVzLCBjb25zdCBjaGFyKiBuYW1lKQoreworICAgIEpT
U3RyaW5nUmVmIHN0ciA9IEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKG5hbWUpOworICAg
IEpTUHJvcGVydHlOYW1lQWNjdW11bGF0b3JBZGROYW1lKG5hbWVzLCBzdHIpOworICAgIEpTU3Ry
aW5nUmVsZWFzZShzdHIpOworfQorCit2b2lkIFF0Q2xhc3M6OmdldFByb3BlcnR5TmFtZXMoSlND
b250ZXh0UmVmLCBRT2JqZWN0KiBvYmplY3QsIEpTUHJvcGVydHlOYW1lQWNjdW11bGF0b3JSZWYg
bmFtZXMpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX21ldGFPYmplY3QtPnByb3BlcnR5
Q291bnQoKTsgKytpKSB7CisgICAgICAgIFFNZXRhUHJvcGVydHkgbXByb3AgPSBtX21ldGFPYmpl
Y3QtPnByb3BlcnR5KGkpOworICAgICAgICBpZiAobXByb3AuaXNTY3JpcHRhYmxlKCkpCisgICAg
ICAgICAgICBhcHBlbmROYW1lKG5hbWVzLCBtcHJvcC5uYW1lKCkpOworICAgIH0KKworICAgIFFM
aXN0PFFCeXRlQXJyYXk+IHByb3BlcnRpZXMgPSBvYmplY3QtPmR5bmFtaWNQcm9wZXJ0eU5hbWVz
KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aCgpOyArK2kpCisg
ICAgICAgIGFwcGVuZE5hbWUobmFtZXMsIHByb3BlcnRpZXNbaV0uY29uc3REYXRhKCkpOworCisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX21ldGFPYmplY3QtPm1ldGhvZENvdW50KCk7ICsraSkg
eworICAgICAgICBRTWV0YU1ldGhvZCBtZXRob2QgPSBtX21ldGFPYmplY3QtPm1ldGhvZChpKTsK
KyAgICAgICAgaWYgKCFtZXRob2QuYWNjZXNzKCkgPT0gUU1ldGFNZXRob2Q6OlByaXZhdGUpCisg
ICAgICAgICAgICBhcHBlbmROYW1lKG5hbWVzLCBtZXRob2QubWV0aG9kU2lnbmF0dXJlKCkpOwor
ICAgIH0KKworICAgIGNvbnN0IFFMaXN0PFFPYmplY3QqPiBjaGlsZHJlbiA9IG9iamVjdC0+Y2hp
bGRyZW4oKTsKKyAgICBjb25zdCBpbnQgY291bnQgPSBjaGlsZHJlbi5jb3VudCgpOworICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAgYXBwZW5kTmFtZShuYW1lcywg
Y2hpbGRyZW5baV0tPm9iamVjdE5hbWUoKS50b1V0ZjgoKSk7Cit9CisKK2Jvb2wgUXRDbGFzczo6
c2V0UHJvcGVydHkoSlNDb250ZXh0UmVmIGNvbnRleHQsIFFPYmplY3QqIG9iamVjdCwgY29uc3Qg
UUJ5dGVBcnJheSYgcHJvcGVydHksIEpTVmFsdWVSZWYgdmFsdWUsIEpTVmFsdWVSZWYqIGV4Y2Vw
dGlvbikKK3sKKyAgICBpbnQgcHJvcGVydHlJbmRleCA9IG1fbWV0YU9iamVjdC0+aW5kZXhPZlBy
b3BlcnR5KHByb3BlcnR5KTsKKyAgICBRTWV0YVR5cGU6OlR5cGUgYXJnVHlwZSA9IFFNZXRhVHlw
ZTo6Vm9pZDsKKyAgICBib29sIGZvdW5kU3RhdGljUHJvcGVydHkgPSBmYWxzZTsKKyAgICBpZiAo
cHJvcGVydHlJbmRleCA+PSAwKSB7CisgICAgICAgIFFNZXRhUHJvcGVydHkgbWV0YVByb3AgPSBt
X21ldGFPYmplY3QtPnByb3BlcnR5KHByb3BlcnR5SW5kZXgpOworICAgICAgICBpZiAobWV0YVBy
b3AuaXNTY3JpcHRhYmxlKCkpCisgICAgICAgICAgICBmb3VuZFN0YXRpY1Byb3BlcnR5ID0gdHJ1
ZTsKKyAgICAgICAgYXJnVHlwZSA9IHN0YXRpY19jYXN0PFFNZXRhVHlwZTo6VHlwZT4oUU1ldGFU
eXBlOjp0eXBlKG1ldGFQcm9wLnR5cGVOYW1lKCkpKTsKICAgICB9Ci0jZW5kaWYKLSAgICByZXR1
cm4gZjsKKworICAgIGlmICghZm91bmRTdGF0aWNQcm9wZXJ0eSAmJiAhb2JqZWN0LT5keW5hbWlj
UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKHByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgb2JqZWN0LT5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgY29udmVydFZhbHVlVG9RVmFy
aWFudChjb250ZXh0LCB2YWx1ZSwgYXJnVHlwZSwgMCwgZXhjZXB0aW9uKSk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK1F0Q2xhc3MqIFF0Q2xhc3M6OmNsYXNzRm9yT2JqZWN0KFFPYmplY3QqIG8p
Cit7CisgICAgY29uc3QgUU1ldGFPYmplY3QqIG1vID0gby0+bWV0YU9iamVjdCgpOworICAgIFF0
Q2xhc3MqIGFDbGFzcyA9IGNsYXNzZXNCeU1ldGFPYmplY3QoKS5nZXQobW8pOworICAgIGlmICgh
YUNsYXNzKSB7CisgICAgICAgIGFDbGFzcyA9IG5ldyBRdENsYXNzKG1vKTsKKyAgICAgICAgY2xh
c3Nlc0J5TWV0YU9iamVjdCgpLnNldChtbywgYUNsYXNzKTsKKyAgICB9CisgICAgcmV0dXJuIGFD
bGFzczsKIH0KIAogfQogfQogCisjaW5jbHVkZSAibW9jX3F0X2NsYXNzLmNwcCIKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9jbGFzcy5oIGIvU291cmNlL1dlYkNvcmUv
YnJpZGdlL3F0L3F0X2NsYXNzLmgKaW5kZXggY2U5YmJjNDQ2N2NiMDIyNmJmMzgzN2I2Mjc1Zjg0
YjYxODI4NDYzMy4uNjNiZDQ2OWQ4OTY5MmNlZGFlY2U1YWRhNDkyNTg5MTgwYTU4NTUxYSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYnJpZGdlL3F0L3F0X2NsYXNzLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvYnJpZGdlL3F0L3F0X2NsYXNzLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29w
eXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgt
aWVzKQorICogQ29weXJpZ2h0IChDKSAyMDEyIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQogICoKICAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtMjEsMzQgKzIxLDcxIEBA
CiAjZGVmaW5lIHF0X2NsYXNzX2gKIAogI2luY2x1ZGUgIkJyaWRnZUpTQy5oIgotI2luY2x1ZGUg
InFnbG9iYWwuaCIKLQotUVRfQkVHSU5fTkFNRVNQQUNFCi1jbGFzcyBRT2JqZWN0Owotc3RydWN0
IFFNZXRhT2JqZWN0OwotUVRfRU5EX05BTUVTUEFDRQorI2luY2x1ZGUgIkpTV2Vha09iamVjdE1h
cFJlZlByaXZhdGUuaCIKKyNpbmNsdWRlICJKYXZhU2NyaXB0LmgiCisjaW5jbHVkZSA8UU1hcD4K
KyNpbmNsdWRlIDxRT2JqZWN0PgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZlB0ci5oPgogCiBuYW1lc3BhY2UgSlNDIHsKIG5hbWVzcGFjZSBCaW5kaW5ncyB7
CiAKK2NsYXNzIFdlYWtNYXBJbXBsIDogcHVibGljIFJlZkNvdW50ZWQ8V2Vha01hcEltcGw+IHsK
K3B1YmxpYzoKKyAgICBXZWFrTWFwSW1wbChKU0NvbnRleHRHcm91cFJlZik7CisgICAgfldlYWtN
YXBJbXBsKCk7CisKKyAgICBKU0dsb2JhbENvbnRleHRSZWYgbV9jb250ZXh0OworICAgIEpTV2Vh
a09iamVjdE1hcFJlZiBtX21hcDsKK307CisKK2NsYXNzIFdlYWtNYXAgeworcHVibGljOgorICAg
IH5XZWFrTWFwKCk7CisKKyAgICB2b2lkIHNldChKU0NvbnRleHRSZWYsIHZvaWQqIGtleSwgSlNP
YmplY3RSZWYpOworICAgIEpTT2JqZWN0UmVmIGdldCh2b2lkKiBrZXkpOworICAgIHZvaWQgcmVt
b3ZlKHZvaWQqIGtleSk7CiAKLWNsYXNzIFF0Q2xhc3MgOiBwdWJsaWMgQ2xhc3MgeworcHJpdmF0
ZToKKyAgICBSZWZQdHI8V2Vha01hcEltcGw+IG1faW1wbDsKK307CisKK2NsYXNzIFF0Q2xhc3Mg
OiBwdWJsaWMgUU9iamVjdCB7CisgICAgUV9PQkpFQ1QKIHByb3RlY3RlZDoKICAgICBRdENsYXNz
KGNvbnN0IFFNZXRhT2JqZWN0Kik7CiAKIHB1YmxpYzoKKyAgICBlbnVtIFZhbHVlT3duZXJzaGlw
IHsKKyAgICAgICAgUXRPd25lcnNoaXAsCisgICAgICAgIFNjcmlwdE93bmVyc2hpcCwKKyAgICAg
ICAgQXV0b093bmVyc2hpcAorICAgIH07CisKICAgICBzdGF0aWMgUXRDbGFzcyogY2xhc3NGb3JP
YmplY3QoUU9iamVjdCopOwogICAgIHZpcnR1YWwgflF0Q2xhc3MoKTsKIAotICAgIHZpcnR1YWwg
Y29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgTWV0aG9kTGlzdCBtZXRob2Rz
TmFtZWQoUHJvcGVydHlOYW1lLCBJbnN0YW5jZSopIGNvbnN0OwotICAgIHZpcnR1YWwgRmllbGQq
IGZpZWxkTmFtZWQoUHJvcGVydHlOYW1lLCBJbnN0YW5jZSopIGNvbnN0OworICAgIGJvb2wgaGFz
UHJvcGVydHkoSlNDb250ZXh0UmVmLCBRT2JqZWN0KiwgY29uc3QgUUJ5dGVBcnJheSYpOworICAg
IEpTVmFsdWVSZWYgZ2V0UHJvcGVydHkoSlNDb250ZXh0UmVmLCBKU09iamVjdFJlZiwgUU9iamVj
dCosIGNvbnN0IFFCeXRlQXJyYXkmLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pOworICAgIHZvaWQg
Z2V0UHJvcGVydHlOYW1lcyhKU0NvbnRleHRSZWYsIFFPYmplY3QqLCBKU1Byb3BlcnR5TmFtZUFj
Y3VtdWxhdG9yUmVmKTsKKyAgICBib29sIHNldFByb3BlcnR5KEpTQ29udGV4dFJlZiwgUU9iamVj
dCosIGNvbnN0IFFCeXRlQXJyYXkmLCBKU1ZhbHVlUmVmLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24p
OworICAgIFFTdHJpbmcgdG9TdHJpbmcoUU9iamVjdCopOworCisgICAgc3RhdGljIEpTT2JqZWN0
UmVmIGluc3RhbmNlRm9yUU9iamVjdChKU0NvbnRleHRSZWYsIFFPYmplY3QqLCBWYWx1ZU93bmVy
c2hpcCk7CisgICAgc3RhdGljIEpTQ2xhc3NSZWYgcXRPYmplY3RCYXNlQ2xhc3MoKTsKKworICAg
IHN0YXRpYyBRT2JqZWN0KiB0b1FPYmplY3QoSlNDb250ZXh0UmVmLCBKU09iamVjdFJlZik7CiAK
LSAgICB2aXJ0dWFsIEpTVmFsdWUgZmFsbGJhY2tPYmplY3QoRXhlY1N0YXRlKiwgSW5zdGFuY2Uq
LCBQcm9wZXJ0eU5hbWUpOworcHJpdmF0ZSBzbG90czoKKyAgICB2b2lkIHdyYXBwZWRRT2JqZWN0
RGVzdHJveWVkKFFPYmplY3QqKTsKIAogcHJpdmF0ZToKLSAgICBRdENsYXNzKGNvbnN0IFF0Q2xh
c3MmKTsgLy8gcHJvaGliaXQgY29weWluZwotICAgIFF0Q2xhc3MmIG9wZXJhdG9yPShjb25zdCBR
dENsYXNzJik7IC8vIHByb2hpYml0IGFzc2lnbm1lbnQKKyAgICBKU0NsYXNzUmVmIG1fY2xhc3M7
CisgICAgUU1hcDxRQnl0ZUFycmF5LCBpbnQ+IG1fbWV0aG9kSW5kZXg7CisgICAgV2Vha01hcCBt
X29iamVjdENhY2hlOworICAgIFFMaXN0PFFCeXRlQXJyYXk+IG1fcHJvcGVydGllc0Zyb21NZXRh
T2JqZWN0OwogCiAgICAgY29uc3QgUU1ldGFPYmplY3QqIG1fbWV0YU9iamVjdDsKIH07CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRfaW5zdGFuY2UuY3BwIGIvU291cmNl
L1dlYkNvcmUvYnJpZGdlL3F0L3F0X2luc3RhbmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggZmU5NDJiYWY2NTQ5ODRiMzgyYTM0ZmRmZGUyYTY5YjdmMGYxMjQxMy4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9i
cmlkZ2UvcXQvcXRfaW5zdGFuY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBz
dWJzaWRpYXJ5KC1pZXMpCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiAgdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGVzc2VyIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwot
ICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqCi0gKi8KLQotI2lu
Y2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInF0X2luc3RhbmNlLmgiCi0KLSNpbmNsdWRlICJB
UElDYXN0LmgiCi0jaW5jbHVkZSAiRXJyb3IuaCIKLSNpbmNsdWRlICJKU0RPTUJpbmRpbmcuaCIK
LSNpbmNsdWRlICJKU0RPTVdpbmRvd0Jhc2UuaCIKLSNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5o
IgotI2luY2x1ZGUgIkpTTG9jay5oIgotI2luY2x1ZGUgIk9iamVjdFByb3RvdHlwZS5oIgotI2lu
Y2x1ZGUgIlByb3BlcnR5TmFtZUFycmF5LmgiCi0jaW5jbHVkZSAicXRfY2xhc3MuaCIKLSNpbmNs
dWRlICJxdF9ydW50aW1lLmgiCi0jaW5jbHVkZSAicnVudGltZV9vYmplY3QuaCIKLSNpbmNsdWRl
ICJydW50aW1lL0Z1bmN0aW9uUHJvdG90eXBlLmgiCi0KLSNpbmNsdWRlIDxxZGVidWcuaD4KLSNp
bmNsdWRlIDxxaGFzaC5oPgotI2luY2x1ZGUgPHFtZXRhb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8cW1l
dGF0eXBlLmg+Ci0KLW5hbWVzcGFjZSBKU0MgewotbmFtZXNwYWNlIEJpbmRpbmdzIHsKLQotLy8g
Q2FjaGUgUXRJbnN0YW5jZXMKLXR5cGVkZWYgUU11bHRpSGFzaDx2b2lkKiwgUXRJbnN0YW5jZSo+
IFFPYmplY3RJbnN0YW5jZU1hcDsKLXN0YXRpYyBRT2JqZWN0SW5zdGFuY2VNYXAgY2FjaGVkSW5z
dGFuY2VzOwotCi0vLyBEZXJpdmVkIFJ1bnRpbWVPYmplY3QKLWNsYXNzIFF0UnVudGltZU9iamVj
dCA6IHB1YmxpYyBSdW50aW1lT2JqZWN0IHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFJ1bnRpbWVP
YmplY3QgQmFzZTsKLQotICAgIHN0YXRpYyBRdFJ1bnRpbWVPYmplY3QqIGNyZWF0ZShFeGVjU3Rh
dGUqIGV4ZWMsIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIFBhc3NSZWZQdHI8SW5zdGFu
Y2U+IGluc3RhbmNlKQotICAgIHsKLSAgICAgICAgU3RydWN0dXJlKiBkb21TdHJ1Y3R1cmUgPSBX
ZWJDb3JlOjpkZXByZWNhdGVkR2V0RE9NU3RydWN0dXJlPFF0UnVudGltZU9iamVjdD4oZXhlYyk7
Ci0gICAgICAgIFF0UnVudGltZU9iamVjdCogb2JqZWN0ID0gbmV3IChhbGxvY2F0ZUNlbGw8UXRS
dW50aW1lT2JqZWN0PigqZXhlYy0+aGVhcCgpKSkgUXRSdW50aW1lT2JqZWN0KGV4ZWMsIGdsb2Jh
bE9iamVjdCwgZG9tU3RydWN0dXJlLCBpbnN0YW5jZSk7Ci0gICAgICAgIG9iamVjdC0+ZmluaXNo
Q3JlYXRpb24oZ2xvYmFsT2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0g
ICAgCi0gICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBzX2luZm87Ci0KLSAgICBzdGF0aWMgU3Ry
dWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoSlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBKU0dsb2Jh
bE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvdHlwZSkKLSAgICB7Ci0gICAgICAg
IHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZShnbG9iYWxEYXRhLCBnbG9iYWxPYmplY3QsIHByb3Rv
dHlwZSwgVHlwZUluZm8oT2JqZWN0VHlwZSwgIFN0cnVjdHVyZUZsYWdzKSwgJnNfaW5mbyk7Ci0g
ICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZs
YWdzID0gUnVudGltZU9iamVjdDo6U3RydWN0dXJlRmxhZ3MgfCBPdmVycmlkZXNWaXNpdENoaWxk
cmVuOwotCi1wcml2YXRlOgotICAgIFF0UnVudGltZU9iamVjdChFeGVjU3RhdGUqLCBKU0dsb2Jh
bE9iamVjdCosIFN0cnVjdHVyZSosIFBhc3NSZWZQdHI8SW5zdGFuY2U+KTsKLX07Ci0KLWNvbnN0
IENsYXNzSW5mbyBRdFJ1bnRpbWVPYmplY3Q6OnNfaW5mbyA9IHsgIlF0UnVudGltZU9iamVjdCIs
ICZSdW50aW1lT2JqZWN0OjpzX2luZm8sIDAsIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoUXRSdW50
aW1lT2JqZWN0KSB9OwotCi1RdFJ1bnRpbWVPYmplY3Q6OlF0UnVudGltZU9iamVjdChFeGVjU3Rh
dGUqIGV4ZWMsIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIFN0cnVjdHVyZSogc3RydWN0
dXJlLCBQYXNzUmVmUHRyPEluc3RhbmNlPiBpbnN0YW5jZSkKLSAgICA6IFJ1bnRpbWVPYmplY3Qo
ZXhlYywgZ2xvYmFsT2JqZWN0LCBzdHJ1Y3R1cmUsIGluc3RhbmNlKQotewotfQotCi0vLyBRdElu
c3RhbmNlCi1RdEluc3RhbmNlOjpRdEluc3RhbmNlKFFPYmplY3QqIG8sIFBhc3NSZWZQdHI8Um9v
dE9iamVjdD4gcm9vdE9iamVjdCwgVmFsdWVPd25lcnNoaXAgb3duZXJzaGlwKQotICAgIDogSW5z
dGFuY2Uocm9vdE9iamVjdCkKLSAgICAsIG1fY2xhc3MoMCkKLSAgICAsIG1fb2JqZWN0KG8pCi0g
ICAgLCBtX2hhc2hrZXkobykKLSAgICAsIG1fb3duZXJzaGlwKG93bmVyc2hpcCkKLXsKLX0KLQot
UXRJbnN0YW5jZTo6flF0SW5zdGFuY2UoKQotewotICAgIEpTTG9ja0hvbGRlciBsb2NrKFdlYkNv
cmU6OkpTRE9NV2luZG93QmFzZTo6Y29tbW9uSlNHbG9iYWxEYXRhKCkpOwotCi0gICAgY2FjaGVk
SW5zdGFuY2VzLnJlbW92ZShtX2hhc2hrZXkpOwotCi0gICAgcURlbGV0ZUFsbChtX21ldGhvZHMp
OwotICAgIG1fbWV0aG9kcy5jbGVhcigpOwotCi0gICAgcURlbGV0ZUFsbChtX2ZpZWxkcyk7Ci0g
ICAgbV9maWVsZHMuY2xlYXIoKTsKLQotICAgIGlmIChtX29iamVjdCkgewotICAgICAgICBzd2l0
Y2ggKG1fb3duZXJzaGlwKSB7Ci0gICAgICAgIGNhc2UgUXRPd25lcnNoaXA6Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBBdXRvT3duZXJzaGlwOgotICAgICAgICAgICAgaWYgKG1f
b2JqZWN0LmRhdGEoKS0+cGFyZW50KCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAvLyBmYWxsIHRocm91Z2ghCi0gICAgICAgIGNhc2UgU2NyaXB0T3duZXJzaGlwOgotICAg
ICAgICAgICAgZGVsZXRlIG1fb2JqZWN0LmRhdGEoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgfQotfQotCi1QYXNzUmVmUHRyPFF0SW5zdGFuY2U+IFF0SW5zdGFuY2U6Omdl
dFF0SW5zdGFuY2UoUU9iamVjdCogbywgUGFzc1JlZlB0cjxSb290T2JqZWN0PiByb290T2JqZWN0
LCBWYWx1ZU93bmVyc2hpcCBvd25lcnNoaXApCi17Ci0gICAgSlNMb2NrSG9sZGVyIGxvY2soV2Vi
Q29yZTo6SlNET01XaW5kb3dCYXNlOjpjb21tb25KU0dsb2JhbERhdGEoKSk7Ci0KLSAgICBmb3Jl
YWNoIChRdEluc3RhbmNlKiBpbnN0YW5jZSwgY2FjaGVkSW5zdGFuY2VzLnZhbHVlcyhvKSkKLSAg
ICAgICAgaWYgKGluc3RhbmNlLT5yb290T2JqZWN0KCkgPT0gcm9vdE9iamVjdCkgewotICAgICAg
ICAgICAgLy8gVGhlIGdhcmJhZ2UgY29sbGVjdG9yIHJlbW92ZXMgaW5zdGFuY2VzLCBidXQgaXQg
bWF5IGhhcHBlbiB0aGF0IHRoZSB3cmFwcGVkCi0gICAgICAgICAgICAvLyBRT2JqZWN0IGRpZXMg
YmVmb3JlIHRoZSBnYyBraWNrcyBpbi4gVG8gaGFuZGxlIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGRv
IGFuIGFkZGl0aW9uYWwKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRvIHNlZSBpZiB0aGUgaW5z
dGFuY2UncyB3cmFwcGVkIG9iamVjdCBpcyBzdGlsbCBhbGl2ZS4gSWYgaXQgaXNuJ3QsIHRoZW4K
LSAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IHdyYXBwZXIuCi0gICAgICAg
ICAgICBpZiAoIWluc3RhbmNlLT5nZXRPYmplY3QoKSkKLSAgICAgICAgICAgICAgICBjYWNoZWRJ
bnN0YW5jZXMucmVtb3ZlKGluc3RhbmNlLT5oYXNoS2V5KCkpOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgUmVmUHRy
PFF0SW5zdGFuY2U+IHJldCA9IFF0SW5zdGFuY2U6OmNyZWF0ZShvLCByb290T2JqZWN0LCBvd25l
cnNoaXApOwotICAgIGNhY2hlZEluc3RhbmNlcy5pbnNlcnQobywgcmV0LmdldCgpKTsKLQotICAg
IHJldHVybiByZXQucmVsZWFzZSgpOwotfQotCi1ib29sIFF0SW5zdGFuY2U6OmdldE93blByb3Bl
cnR5U2xvdChKU09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBw
cm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xvdCkKLXsKLSAgICByZXR1cm4gSlNPYmplY3Q6
OmdldE93blByb3BlcnR5U2xvdChvYmplY3QsIGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xvdCk7Ci19
Ci0KLXZvaWQgUXRJbnN0YW5jZTo6cHV0KEpTT2JqZWN0KiBvYmplY3QsIEV4ZWNTdGF0ZSogZXhl
YywgUHJvcGVydHlOYW1lIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSB2YWx1ZSwgUHV0UHJvcGVydHlT
bG90JiBzbG90KQotewotICAgIEpTT2JqZWN0OjpwdXQob2JqZWN0LCBleGVjLCBwcm9wZXJ0eU5h
bWUsIHZhbHVlLCBzbG90KTsKLX0KLQotUXRJbnN0YW5jZSogUXRJbnN0YW5jZTo6Z2V0SW5zdGFu
Y2UoSlNPYmplY3QqIG9iamVjdCkKLXsKLSAgICBpZiAoIW9iamVjdCkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgaWYgKCFvYmplY3QtPmluaGVyaXRzKCZRdFJ1bnRpbWVPYmplY3Q6OnNfaW5mbykp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxRdEluc3RhbmNlKj4o
c3RhdGljX2Nhc3Q8UnVudGltZU9iamVjdCo+KG9iamVjdCktPmdldEludGVybmFsSW5zdGFuY2Uo
KSk7Ci19Ci0KLUNsYXNzKiBRdEluc3RhbmNlOjpnZXRDbGFzcygpIGNvbnN0Ci17Ci0gICAgaWYg
KCFtX2NsYXNzKSB7Ci0gICAgICAgIGlmICghbV9vYmplY3QpCi0gICAgICAgICAgICByZXR1cm4g
MDsKLSAgICAgICAgbV9jbGFzcyA9IFF0Q2xhc3M6OmNsYXNzRm9yT2JqZWN0KG1fb2JqZWN0LmRh
dGEoKSk7Ci0gICAgfQotICAgIHJldHVybiBtX2NsYXNzOwotfQotCi1SdW50aW1lT2JqZWN0KiBR
dEluc3RhbmNlOjpuZXdSdW50aW1lT2JqZWN0KEV4ZWNTdGF0ZSogZXhlYykKLXsKLSAgICBKU0xv
Y2tIb2xkZXIgbG9jayhleGVjKTsKLSAgICBxRGVsZXRlQWxsKG1fbWV0aG9kcyk7Ci0gICAgbV9t
ZXRob2RzLmNsZWFyKCk7Ci0gICAgcmV0dXJuIFF0UnVudGltZU9iamVjdDo6Y3JlYXRlKGV4ZWMs
IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKSwgdGhpcyk7Ci19Ci0KLXZvaWQgUXRJbnN0YW5j
ZTo6YmVnaW4oKQotewotICAgIC8vIERvIG5vdGhpbmcuCi19Ci0KLXZvaWQgUXRJbnN0YW5jZTo6
ZW5kKCkKLXsKLSAgICAvLyBEbyBub3RoaW5nLgotfQotCi12b2lkIFF0SW5zdGFuY2U6OmdldFBy
b3BlcnR5TmFtZXMoRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWVBcnJheSYgYXJyYXkpCi17
Ci0gICAgLy8gVGhpcyBpcyB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLCBzbyBwdXQ6Ci0gICAg
Ly8gcHJvcGVydGllcwotICAgIC8vIGR5bmFtaWMgcHJvcGVydGllcwotICAgIC8vIHNsb3RzCi0g
ICAgUU9iamVjdCogb2JqID0gZ2V0T2JqZWN0KCk7Ci0gICAgaWYgKG9iaikgewotICAgICAgICBj
b25zdCBRTWV0YU9iamVjdCogbWV0YSA9IG9iai0+bWV0YU9iamVjdCgpOwotCi0gICAgICAgIGlu
dCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWV0YS0+cHJvcGVydHlDb3VudCgpOyBpKysp
IHsKLSAgICAgICAgICAgIFFNZXRhUHJvcGVydHkgcHJvcCA9IG1ldGEtPnByb3BlcnR5KGkpOwot
ICAgICAgICAgICAgaWYgKHByb3AuaXNTY3JpcHRhYmxlKCkpCi0gICAgICAgICAgICAgICAgYXJy
YXkuYWRkKElkZW50aWZpZXIoZXhlYywgcHJvcC5uYW1lKCkpKTsKLSAgICAgICAgfQotCi0jaWZu
ZGVmIFFUX05PX1BST1BFUlRJRVMKLSAgICAgICAgUUxpc3Q8UUJ5dGVBcnJheT4gZHluUHJvcHMg
PSBvYmotPmR5bmFtaWNQcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgIGZvcmVhY2ggKGNvbnN0IFFC
eXRlQXJyYXkmIGJhLCBkeW5Qcm9wcykKLSAgICAgICAgICAgIGFycmF5LmFkZChJZGVudGlmaWVy
KGV4ZWMsIGJhLmNvbnN0RGF0YSgpKSk7Ci0jZW5kaWYKLQotICAgICAgICBjb25zdCBpbnQgbWV0
aG9kQ291bnQgPSBtZXRhLT5tZXRob2RDb3VudCgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwg
bWV0aG9kQ291bnQ7IGkrKykgewotICAgICAgICAgICAgUU1ldGFNZXRob2QgbWV0aG9kID0gbWV0
YS0+bWV0aG9kKGkpOwotICAgICAgICAgICAgaWYgKG1ldGhvZC5hY2Nlc3MoKSAhPSBRTWV0YU1l
dGhvZDo6UHJpdmF0ZSkgewotICAgICAgICAgICAgICAgIFFCeXRlQXJyYXkgc2lnID0gbWV0aG9k
Lm1ldGhvZFNpZ25hdHVyZSgpOwotICAgICAgICAgICAgICAgIGFycmF5LmFkZChJZGVudGlmaWVy
KGV4ZWMsIFN0cmluZyhzaWcuY29uc3REYXRhKCksIHNpZy5sZW5ndGgoKSkpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotSlNWYWx1ZSBRdEluc3RhbmNlOjpnZXRNZXRo
b2QoRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lKQotewotICAgIGlm
ICghZ2V0Q2xhc3MoKSkKLSAgICAgICAgcmV0dXJuIGpzTnVsbCgpOwotICAgIE1ldGhvZExpc3Qg
bWV0aG9kTGlzdCA9IG1fY2xhc3MtPm1ldGhvZHNOYW1lZChwcm9wZXJ0eU5hbWUsIHRoaXMpOwot
ICAgIHJldHVybiBSdW50aW1lTWV0aG9kOjpjcmVhdGUoZXhlYywgZXhlYy0+bGV4aWNhbEdsb2Jh
bE9iamVjdCgpLCBXZWJDb3JlOjpkZXByZWNhdGVkR2V0RE9NU3RydWN0dXJlPFJ1bnRpbWVNZXRo
b2Q+KGV4ZWMpLCBwcm9wZXJ0eU5hbWUucHVibGljTmFtZSgpLCBtZXRob2RMaXN0KTsKLX0KLQot
SlNWYWx1ZSBRdEluc3RhbmNlOjppbnZva2VNZXRob2QoRXhlY1N0YXRlKiwgUnVudGltZU1ldGhv
ZCopCi17Ci0gICAgLy8gSW1wbGVtZW50ZWQgdmlhIGZhbGxiYWNrTWV0aG9kICYgUXRSdW50aW1l
TWV0YU1ldGhvZDo6Y2FsbEFzRnVuY3Rpb24KLSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLX0K
LQotSlNWYWx1ZSBRdEluc3RhbmNlOjpkZWZhdWx0VmFsdWUoRXhlY1N0YXRlKiBleGVjLCBQcmVm
ZXJyZWRQcmltaXRpdmVUeXBlIGhpbnQpIGNvbnN0Ci17Ci0gICAgaWYgKGhpbnQgPT0gUHJlZmVy
U3RyaW5nKQotICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUoZXhlYyk7Ci0gICAgaWYgKGhpbnQg
PT0gUHJlZmVyTnVtYmVyKQotICAgICAgICByZXR1cm4gbnVtYmVyVmFsdWUoZXhlYyk7Ci0gICAg
cmV0dXJuIHZhbHVlT2YoZXhlYyk7Ci19Ci0KLUpTVmFsdWUgUXRJbnN0YW5jZTo6c3RyaW5nVmFs
dWUoRXhlY1N0YXRlKiBleGVjKSBjb25zdAotewotICAgIFFPYmplY3QqIG9iaiA9IGdldE9iamVj
dCgpOwotICAgIGlmICghb2JqKQotICAgICAgICByZXR1cm4ganNOdWxsKCk7Ci0KLSAgICAvLyBI
bW0uLiBzZWUgaWYgdGhlcmUgaXMgYSB0b1N0cmluZyBkZWZpbmVkCi0gICAgUUJ5dGVBcnJheSBi
dWY7Ci0gICAgYm9vbCB1c2VEZWZhdWx0ID0gdHJ1ZTsKLSAgICBnZXRDbGFzcygpOwotICAgIGlm
IChtX2NsYXNzKSB7Ci0gICAgICAgIC8vIENoZWF0IGFuZCBkb24ndCB1c2UgdGhlIGZ1bGwgbmFt
ZSByZXNvbHV0aW9uCi0gICAgICAgIGludCBpbmRleCA9IG9iai0+bWV0YU9iamVjdCgpLT5pbmRl
eE9mTWV0aG9kKCJ0b1N0cmluZygpIik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAg
ICAgICAgICBRTWV0YU1ldGhvZCBtID0gb2JqLT5tZXRhT2JqZWN0KCktPm1ldGhvZChpbmRleCk7
Ci0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaG93IG11Y2ggd2UgY2FuIGNhbGwgaXQKLSAg
ICAgICAgICAgIGlmIChtLmFjY2VzcygpICE9IFFNZXRhTWV0aG9kOjpQcml2YXRlCi0gICAgICAg
ICAgICAgICAgJiYgbS5tZXRob2RUeXBlKCkgIT0gUU1ldGFNZXRob2Q6OlNpZ25hbAotICAgICAg
ICAgICAgICAgICYmIG0ucGFyYW1ldGVyQ291bnQoKSA9PSAwCi0gICAgICAgICAgICAgICAgJiYg
bS5yZXR1cm5UeXBlKCkgIT0gUU1ldGFUeXBlOjpWb2lkKSB7Ci0gICAgICAgICAgICAgICAgUVZh
cmlhbnQgcmV0KG0ucmV0dXJuVHlwZSgpLCAodm9pZCopMCk7Ci0gICAgICAgICAgICAgICAgdm9p
ZCAqIHFhcmdzWzFdOwotICAgICAgICAgICAgICAgIHFhcmdzWzBdID0gcmV0LmRhdGEoKTsKLQot
ICAgICAgICAgICAgICAgIGlmIChRTWV0YU9iamVjdDo6bWV0YWNhbGwob2JqLCBRTWV0YU9iamVj
dDo6SW52b2tlTWV0YU1ldGhvZCwgaW5kZXgsIHFhcmdzKSA8IDApIHsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKHJldC5pc1ZhbGlkKCkgJiYgcmV0LmNhbkNvbnZlcnQoUVZhcmlhbnQ6OlN0cmlu
ZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHJldC50b1N0cmluZygpLnRvTGF0
aW4xKCkuY29uc3REYXRhKCk7IC8vICMjIyBMYXRpbiAxPyBBc2NpaT8KLSAgICAgICAgICAgICAg
ICAgICAgICAgIHVzZURlZmF1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlm
ICh1c2VEZWZhdWx0KSB7Ci0gICAgICAgIGNvbnN0IFFNZXRhT2JqZWN0KiBtZXRhID0gb2JqID8g
b2JqLT5tZXRhT2JqZWN0KCkgOiAmUU9iamVjdDo6c3RhdGljTWV0YU9iamVjdDsKLSAgICAgICAg
UVN0cmluZyBuYW1lID0gb2JqID8gb2JqLT5vYmplY3ROYW1lKCkgOiBRU3RyaW5nOjpmcm9tVXRm
OCgidW5uYW1lZCIpOwotICAgICAgICBRU3RyaW5nIHN0ciA9IFFTdHJpbmc6OmZyb21VdGY4KCIl
MChuYW1lID0gXCIlMVwiKSIpCi0gICAgICAgICAgICAgICAgICAgICAgLmFyZyhRTGF0aW4xU3Ry
aW5nKG1ldGEtPmNsYXNzTmFtZSgpKSkuYXJnKG5hbWUpOwotCi0gICAgICAgIGJ1ZiA9IHN0ci50
b0xhdGluMSgpOwotICAgIH0KLSAgICByZXR1cm4ganNTdHJpbmcoZXhlYywgYnVmLmNvbnN0RGF0
YSgpKTsKLX0KLQotSlNWYWx1ZSBRdEluc3RhbmNlOjpudW1iZXJWYWx1ZShFeGVjU3RhdGUqKSBj
b25zdAotewotICAgIHJldHVybiBqc051bWJlcigwKTsKLX0KLQotSlNWYWx1ZSBRdEluc3RhbmNl
Ojpib29sZWFuVmFsdWUoKSBjb25zdAotewotICAgIC8vIEVDTUEgOS4yCi0gICAgcmV0dXJuIGpz
Qm9vbGVhbihnZXRPYmplY3QoKSk7Ci19Ci0KLUpTVmFsdWUgUXRJbnN0YW5jZTo6dmFsdWVPZihF
eGVjU3RhdGUqIGV4ZWMpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmluZ1ZhbHVlKGV4ZWMpOwot
fQotCi1RQnl0ZUFycmF5IFF0RmllbGQ6Om5hbWUoKSBjb25zdAotewotICAgIGlmIChtX3R5cGUg
PT0gTWV0YVByb3BlcnR5KQotICAgICAgICByZXR1cm4gbV9wcm9wZXJ0eS5uYW1lKCk7Ci0gICAg
aWYgKG1fdHlwZSA9PSBDaGlsZE9iamVjdCAmJiBtX2NoaWxkT2JqZWN0KQotICAgICAgICByZXR1
cm4gbV9jaGlsZE9iamVjdC5kYXRhKCktPm9iamVjdE5hbWUoKS50b0xhdGluMSgpOwotI2lmbmRl
ZiBRVF9OT19QUk9QRVJUSUVTCi0gICAgaWYgKG1fdHlwZSA9PSBEeW5hbWljUHJvcGVydHkpCi0g
ICAgICAgIHJldHVybiBtX2R5bmFtaWNQcm9wZXJ0eTsKLSNlbmRpZgotICAgIHJldHVybiBRQnl0
ZUFycmF5KCk7IC8vIGRlbGV0ZWQgY2hpbGQgb2JqZWN0Ci19Ci0KLUpTVmFsdWUgUXRGaWVsZDo6
dmFsdWVGcm9tSW5zdGFuY2UoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJbnN0YW5jZSogaW5zdCkg
Y29uc3QKLXsKLSAgICBjb25zdCBRdEluc3RhbmNlKiBpbnN0YW5jZSA9IHN0YXRpY19jYXN0PGNv
bnN0IFF0SW5zdGFuY2UqPihpbnN0KTsKLSAgICBRT2JqZWN0KiBvYmogPSBpbnN0YW5jZS0+Z2V0
T2JqZWN0KCk7Ci0KLSAgICBpZiAob2JqKSB7Ci0gICAgICAgIFFWYXJpYW50IHZhbDsKLSAgICAg
ICAgaWYgKG1fdHlwZSA9PSBNZXRhUHJvcGVydHkpIHsKLSAgICAgICAgICAgIGlmIChtX3Byb3Bl
cnR5LmlzUmVhZGFibGUoKSkKLSAgICAgICAgICAgICAgICB2YWwgPSBtX3Byb3BlcnR5LnJlYWQo
b2JqKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4ganNVbmRlZmlu
ZWQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtX3R5cGUgPT0gQ2hpbGRPYmplY3QpCi0gICAgICAg
ICAgICB2YWwgPSBRVmFyaWFudDo6ZnJvbVZhbHVlKChRT2JqZWN0KikgbV9jaGlsZE9iamVjdC5k
YXRhKCkpOwotI2lmbmRlZiBRVF9OT19QUk9QRVJUSUVTCi0gICAgICAgIGVsc2UgaWYgKG1fdHlw
ZSA9PSBEeW5hbWljUHJvcGVydHkpCi0gICAgICAgICAgICB2YWwgPSBvYmotPnByb3BlcnR5KG1f
ZHluYW1pY1Byb3BlcnR5KTsKLSNlbmRpZgotICAgICAgICBKU1ZhbHVlUmVmIGV4Y2VwdGlvbiA9
IDA7Ci0gICAgICAgIEpTVmFsdWVSZWYganNWYWx1ZSA9IGNvbnZlcnRRVmFyaWFudFRvVmFsdWUo
dG9SZWYoZXhlYyksIGluc3QtPnJvb3RPYmplY3QoKSwgdmFsLCAmZXhjZXB0aW9uKTsKLSAgICAg
ICAgaWYgKGV4Y2VwdGlvbikKLSAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIHRv
SlMoZXhlYywgZXhjZXB0aW9uKSk7Ci0gICAgICAgIHJldHVybiB0b0pTKGV4ZWMsIGpzVmFsdWUp
OwotICAgIH0KLSAgICBRU3RyaW5nIG1zZyA9IFFTdHJpbmcoUUxhdGluMVN0cmluZygiY2Fubm90
IGFjY2VzcyBtZW1iZXIgYCUxJyBvZiBkZWxldGVkIFFPYmplY3QiKSkuYXJnKFFMYXRpbjFTdHJp
bmcobmFtZSgpKSk7Ci0gICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgY3JlYXRlRXJyb3IoZXhl
YywgbXNnLnRvTGF0aW4xKCkuY29uc3REYXRhKCkpKTsKLX0KLQotdm9pZCBRdEZpZWxkOjpzZXRW
YWx1ZVRvSW5zdGFuY2UoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJbnN0YW5jZSogaW5zdCwgSlNW
YWx1ZSBhVmFsdWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fdHlwZSA9PSBDaGlsZE9iamVjdCkgLy8g
UXRTY3JpcHQgZG9lc24ndCBhbGxvdyBzZXR0aW5nIHRvIGEgbmFtZWQgY2hpbGQKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgY29uc3QgUXRJbnN0YW5jZSogaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxj
b25zdCBRdEluc3RhbmNlKj4oaW5zdCk7Ci0gICAgUU9iamVjdCogb2JqID0gaW5zdGFuY2UtPmdl
dE9iamVjdCgpOwotICAgIGlmIChvYmopIHsKLSAgICAgICAgUU1ldGFUeXBlOjpUeXBlIGFyZ3R5
cGUgPSBRTWV0YVR5cGU6OlZvaWQ7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gTWV0YVByb3BlcnR5
KQotICAgICAgICAgICAgYXJndHlwZSA9IChRTWV0YVR5cGU6OlR5cGUpIG1fcHJvcGVydHkudXNl
clR5cGUoKTsKLQotICAgICAgICAvLyBkeW5hbWljIHByb3BlcnRpZXMganVzdCBnZXQgYW55IFFW
YXJpYW50Ci0gICAgICAgIEpTVmFsdWVSZWYgZXhjZXB0aW9uID0gMDsKLSAgICAgICAgUVZhcmlh
bnQgdmFsID0gY29udmVydFZhbHVlVG9RVmFyaWFudCh0b1JlZihleGVjKSwgdG9SZWYoZXhlYywg
YVZhbHVlKSwgYXJndHlwZSwgMCwgJmV4Y2VwdGlvbik7Ci0gICAgICAgIGlmIChleGNlcHRpb24p
IHsKLSAgICAgICAgICAgIHRocm93RXJyb3IoZXhlYywgdG9KUyhleGVjLCBleGNlcHRpb24pKTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobV90eXBlID09IE1l
dGFQcm9wZXJ0eSkgewotICAgICAgICAgICAgaWYgKG1fcHJvcGVydHkuaXNXcml0YWJsZSgpKQot
ICAgICAgICAgICAgICAgIG1fcHJvcGVydHkud3JpdGUob2JqLCB2YWwpOwotICAgICAgICB9Ci0j
aWZuZGVmIFFUX05PX1BST1BFUlRJRVMKLSAgICAgICAgZWxzZSBpZiAobV90eXBlID09IER5bmFt
aWNQcm9wZXJ0eSkKLSAgICAgICAgICAgIG9iai0+c2V0UHJvcGVydHkobV9keW5hbWljUHJvcGVy
dHkuY29uc3REYXRhKCksIHZhbCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgICBRU3Ry
aW5nIG1zZyA9IFFTdHJpbmcoUUxhdGluMVN0cmluZygiY2Fubm90IGFjY2VzcyBtZW1iZXIgYCUx
JyBvZiBkZWxldGVkIFFPYmplY3QiKSkuYXJnKFFMYXRpbjFTdHJpbmcobmFtZSgpKSk7Ci0gICAg
ICAgIHRocm93RXJyb3IoZXhlYywgY3JlYXRlRXJyb3IoZXhlYywgbXNnLnRvTGF0aW4xKCkuY29u
c3REYXRhKCkpKTsKLSAgICB9Ci19Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvYnJpZGdlL3F0L3F0X2luc3RhbmNlLmggYi9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRf
aW5zdGFuY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZjM0YmIwZTVlOTMw
NmIxZjNkNGE1ZjUzZmI5NzVmNzA2MDg3Yi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRfaW5zdGFuY2UuaAor
KysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4
IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICoKLSAqICBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgcXRfaW5zdGFuY2VfaAotI2RlZmlu
ZSBxdF9pbnN0YW5jZV9oCi0KLSNpbmNsdWRlICJCcmlkZ2VKU0MuaCIKLSNpbmNsdWRlICJKU1dl
YWtPYmplY3RNYXBSZWZQcml2YXRlLmgiCi0jaW5jbHVkZSA8UVBvaW50ZXI+Ci0jaW5jbHVkZSAi
V2Vhay5oIgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgotI2luY2x1ZGUgPHFoYXNoLmg+Ci0j
aW5jbHVkZSA8cXNldC5oPgotCi1uYW1lc3BhY2UgSlNDIHsKLQotbmFtZXNwYWNlIEJpbmRpbmdz
IHsKLQotY2xhc3MgUXRDbGFzczsKLWNsYXNzIFF0RmllbGQ7Ci1jbGFzcyBRdFJ1bnRpbWVNZXRo
b2Q7Ci0KLWNsYXNzIFdlYWtNYXBJbXBsIDogcHVibGljIFJlZkNvdW50ZWQ8V2Vha01hcEltcGw+
IHsKLXB1YmxpYzoKLSAgICBXZWFrTWFwSW1wbChKU0NvbnRleHRHcm91cFJlZik7Ci0gICAgfldl
YWtNYXBJbXBsKCk7Ci0KLSAgICBKU0dsb2JhbENvbnRleHRSZWYgbV9jb250ZXh0OwotICAgIEpT
V2Vha09iamVjdE1hcFJlZiBtX21hcDsKLX07Ci0KLWNsYXNzIFdlYWtNYXAgewotcHVibGljOgot
ICAgIH5XZWFrTWFwKCk7Ci0KLSAgICB2b2lkIHNldChKU0NvbnRleHRSZWYsIHZvaWQqIGtleSwg
SlNPYmplY3RSZWYpOwotICAgIEpTT2JqZWN0UmVmIGdldCh2b2lkKiBrZXkpOwotICAgIHZvaWQg
cmVtb3ZlKHZvaWQqIGtleSk7Ci0KLXByaXZhdGU6Ci0gICAgUmVmUHRyPFdlYWtNYXBJbXBsPiBt
X2ltcGw7Ci19OwotCi1jbGFzcyBRdEluc3RhbmNlIDogcHVibGljIEluc3RhbmNlIHsKLXB1Ymxp
YzoKLSAgICBlbnVtIFZhbHVlT3duZXJzaGlwIHsKLSAgICAgICAgUXRPd25lcnNoaXAsCi0gICAg
ICAgIFNjcmlwdE93bmVyc2hpcCwKLSAgICAgICAgQXV0b093bmVyc2hpcAotICAgIH07Ci0KLSAg
ICB+UXRJbnN0YW5jZSgpOwotCi0gICAgdmlydHVhbCBDbGFzcyogZ2V0Q2xhc3MoKSBjb25zdDsK
LSAgICB2aXJ0dWFsIFJ1bnRpbWVPYmplY3QqIG5ld1J1bnRpbWVPYmplY3QoRXhlY1N0YXRlKik7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYmVnaW4oKTsKLSAgICB2aXJ0dWFsIHZvaWQgZW5kKCk7Ci0K
LSAgICB2aXJ0dWFsIEpTVmFsdWUgdmFsdWVPZihFeGVjU3RhdGUqKSBjb25zdDsKLSAgICB2aXJ0
dWFsIEpTVmFsdWUgZGVmYXVsdFZhbHVlKEV4ZWNTdGF0ZSosIFByZWZlcnJlZFByaW1pdGl2ZVR5
cGUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBKU1ZhbHVlIGdldE1ldGhvZChFeGVjU3RhdGUqLCBQ
cm9wZXJ0eU5hbWUpOwotICAgIHZpcnR1YWwgSlNWYWx1ZSBpbnZva2VNZXRob2QoRXhlY1N0YXRl
KiwgUnVudGltZU1ldGhvZCopOwotCi0gICAgdmlydHVhbCB2b2lkIGdldFByb3BlcnR5TmFtZXMo
RXhlY1N0YXRlKiwgUHJvcGVydHlOYW1lQXJyYXkmKTsKLQotICAgIEpTVmFsdWUgc3RyaW5nVmFs
dWUoRXhlY1N0YXRlKiBleGVjKSBjb25zdDsKLSAgICBKU1ZhbHVlIG51bWJlclZhbHVlKEV4ZWNT
dGF0ZSogZXhlYykgY29uc3Q7Ci0gICAgSlNWYWx1ZSBib29sZWFuVmFsdWUoKSBjb25zdDsKLQot
ICAgIFFPYmplY3QqIGdldE9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0LmRhdGEoKTsg
fQotICAgIFFPYmplY3QqIGhhc2hLZXkoKSBjb25zdCB7IHJldHVybiBtX2hhc2hrZXk7IH0KLQot
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFF0SW5zdGFuY2U+IGdldFF0SW5zdGFuY2UoUU9iamVjdCos
IFBhc3NSZWZQdHI8Um9vdE9iamVjdD4sIFZhbHVlT3duZXJzaGlwKTsKLQotICAgIHZpcnR1YWwg
Ym9vbCBnZXRPd25Qcm9wZXJ0eVNsb3QoSlNPYmplY3QqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5h
bWUsIFByb3BlcnR5U2xvdCYpOwotICAgIHZpcnR1YWwgdm9pZCBwdXQoSlNPYmplY3QqLCBFeGVj
U3RhdGUqLCBQcm9wZXJ0eU5hbWUsIEpTVmFsdWUsIFB1dFByb3BlcnR5U2xvdCYpOwotCi0gICAg
c3RhdGljIFF0SW5zdGFuY2UqIGdldEluc3RhbmNlKEpTT2JqZWN0Kik7Ci0KLXByaXZhdGU6Ci0g
ICAgc3RhdGljIFBhc3NSZWZQdHI8UXRJbnN0YW5jZT4gY3JlYXRlKFFPYmplY3QgKmluc3RhbmNl
LCBQYXNzUmVmUHRyPFJvb3RPYmplY3Q+IHJvb3RPYmplY3QsIFZhbHVlT3duZXJzaGlwIG93bmVy
c2hpcCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgUXRJbnN0YW5jZShpbnN0
YW5jZSwgcm9vdE9iamVjdCwgb3duZXJzaGlwKSk7Ci0gICAgfQotCi0gICAgZnJpZW5kIGNsYXNz
IFF0Q2xhc3M7Ci0gICAgZnJpZW5kIGNsYXNzIFF0RmllbGQ7Ci0gICAgZnJpZW5kIGNsYXNzIFF0
UnVudGltZU1ldGhvZDsKLSAgICBRdEluc3RhbmNlKFFPYmplY3QqLCBQYXNzUmVmUHRyPFJvb3RP
YmplY3Q+LCBWYWx1ZU93bmVyc2hpcCk7IC8vIEZhY3RvcnkgcHJvZHVjZWQgb25seS4uCi0gICAg
bXV0YWJsZSBRdENsYXNzKiBtX2NsYXNzOwotICAgIFFQb2ludGVyPFFPYmplY3Q+IG1fb2JqZWN0
OwotICAgIFFPYmplY3QqIG1faGFzaGtleTsKLSAgICBtdXRhYmxlIFFIYXNoPFFCeXRlQXJyYXks
IFF0UnVudGltZU1ldGhvZCo+IG1fbWV0aG9kczsKLSAgICBtdXRhYmxlIFFIYXNoPFFTdHJpbmcs
IFF0RmllbGQqPiBtX2ZpZWxkczsKLSAgICBWYWx1ZU93bmVyc2hpcCBtX293bmVyc2hpcDsKLX07
Ci0KLX0gLy8gbmFtZXNwYWNlIEJpbmRpbmdzCi0KLX0gLy8gbmFtZXNwYWNlIEpTQwotCi0jZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9ydW50aW1lLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9ydW50aW1lLmNwcAppbmRleCA5ZmY2MjNjZjQ1
MDUwNGQ2ZDkyMzI4NTE5MDExNzQyZTJlN2Y5YjgxLi5hYTEyYmNkMWFjNDI4OGFiZmQzYzdiMzkz
MTEyMGY3Y2Y2M2Y5ZDVmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRf
cnVudGltZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvYnJpZGdlL3F0L3F0X3J1bnRpbWUuY3Bw
CkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSAicW1ldGF0eXBlLmgiCiAjaW5jbHVkZSAicW9i
amVjdC5oIgogI2luY2x1ZGUgInFzdHJpbmdsaXN0LmgiCi0jaW5jbHVkZSAicXRfaW5zdGFuY2Uu
aCIKKyNpbmNsdWRlICJxdF9jbGFzcy5oIgogI2luY2x1ZGUgInF0X3BpeG1hcHJ1bnRpbWUuaCIK
ICNpbmNsdWRlICJxdmFybGVuZ3RoYXJyYXkuaCIKIApAQCAtMTYwLDExICsxNjAsNiBAQCBzdGF0
aWMgYm9vbCBpc0pTRGF0ZShKU09iamVjdFJlZiBvYmplY3QpCiAgICAgcmV0dXJuIHRvSlMob2Jq
ZWN0KS0+aW5oZXJpdHMoJkRhdGVJbnN0YW5jZTo6c19pbmZvKTsKIH0KIAotc3RhdGljIGJvb2wg
aXNRdE9iamVjdChKU09iamVjdFJlZiBvYmplY3QpCi17Ci0gICAgcmV0dXJuIHRvSlMob2JqZWN0
KS0+aW5oZXJpdHMoJlJ1bnRpbWVPYmplY3Q6OnNfaW5mbyk7Ci19Ci0KIHN0YXRpYyBKU1JlYWxU
eXBlIHZhbHVlUmVhbFR5cGUoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTVmFsdWVSZWYgdmFsdWUs
IEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKIHsKICAgICBpZiAoSlNWYWx1ZUlzTnVtYmVyKGNvbnRl
eHQsIHZhbHVlKSkKQEAgLTE4MywxMSArMTc4LDExIEBAIHN0YXRpYyBKU1JlYWxUeXBlIHZhbHVl
UmVhbFR5cGUoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTVmFsdWVSZWYgdmFsdWUsIEpTVmFsdWVS
CiAgICAgaWYgKGlzSlNVaW50OENsYW1wZWRBcnJheShvYmplY3QpKQogICAgICAgICByZXR1cm4g
UlRVaW50OENsYW1wZWRBcnJheTsKICAgICBpZiAoaXNKU0FycmF5KG9iamVjdCkpCi0gICAgICAg
ICAgICByZXR1cm4gQXJyYXk7CisgICAgICAgIHJldHVybiBBcnJheTsKICAgICBpZiAoaXNKU0Rh
dGUob2JqZWN0KSkKLSAgICAgICAgICAgIHJldHVybiBEYXRlOwotICAgIGlmIChpc1F0T2JqZWN0
KG9iamVjdCkpCi0gICAgICAgICAgICByZXR1cm4gUU9iajsKKyAgICAgICAgcmV0dXJuIERhdGU7
CisgICAgaWYgKEpTVmFsdWVJc09iamVjdE9mQ2xhc3MoY29udGV4dCwgb2JqZWN0LCBRdENsYXNz
OjpxdE9iamVjdEJhc2VDbGFzcygpKSkKKyAgICAgICAgcmV0dXJuIFFPYmo7CiAKICAgICByZXR1
cm4gT2JqZWN0OwogfQpAQCAtNTY0LDE4ICs1NTksMTAgQEAgUVZhcmlhbnQgY29udmVydFZhbHVl
VG9RVmFyaWFudChKU0NvbnRleHRSZWYgY29udGV4dCwgSlNWYWx1ZVJlZiB2YWx1ZSwgUU1ldGFU
eXAKIAogICAgICAgICBjYXNlIFFNZXRhVHlwZTo6UU9iamVjdFN0YXI6CiAgICAgICAgICAgICBp
ZiAodHlwZSA9PSBRT2JqKSB7Ci0gICAgICAgICAgICAgICAgUXRJbnN0YW5jZSogcXRpbnN0ID0g
UXRJbnN0YW5jZTo6Z2V0SW5zdGFuY2UodG9KUyhvYmplY3QpKTsKLSAgICAgICAgICAgICAgICBp
ZiAocXRpbnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdGluc3QtPmdldE9iamVjdCgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxQ29udkRlYnVnKCkgPDwgImZvdW5kIGluc3Rh
bmNlLCB3aXRoIG9iamVjdDoiIDw8ICh2b2lkKikgcXRpbnN0LT5nZXRPYmplY3QoKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHJldCA9IFFWYXJpYW50Ojpmcm9tVmFsdWUocXRpbnN0LT5nZXRP
YmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxQ29udkRlYnVnKCkgPDwgcmV0Owot
ICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxQ29udkRlYnVnKCkgPDwgImNhbid0IGNv
bnZlcnQgZGVsZXRlZCBxb2JqZWN0IjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHFDb252RGVidWcoKSA8PCAid2Fz
bid0IGEgcXRpbnN0YW5jZSI7CisgICAgICAgICAgICAgICAgUU9iamVjdCogb2JqID0gUXRDbGFz
czo6dG9RT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgICAgICAgICAgICAgICAgaWYgKG9iaikg
eworICAgICAgICAgICAgICAgICAgICByZXQgPSBRVmFyaWFudDo6ZnJvbVZhbHVlKG9iaik7Cisg
ICAgICAgICAgICAgICAgICAgIGRpc3QgPSAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgIH0gZWxzZSBpZiAodHlwZSA9PSBOdWxsKSB7CiAgICAgICAgICAgICAgICAgUU9iamVjdCog
bnVsbG9iaiA9IDA7CkBAIC01ODcsMjAgKzU3NCwxMiBAQCBRVmFyaWFudCBjb252ZXJ0VmFsdWVU
b1FWYXJpYW50KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU1ZhbHVlUmVmIHZhbHVlLCBRTWV0YVR5
cAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBRTWV0YVR5cGU6OlZvaWRTdGFy
OgotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUU9iaikgewotICAgICAgICAgICAgICAgIFF0SW5z
dGFuY2UqIHF0aW5zdCA9IFF0SW5zdGFuY2U6OmdldEluc3RhbmNlKHRvSlMob2JqZWN0KSk7Ci0g
ICAgICAgICAgICAgICAgaWYgKHF0aW5zdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocXRp
bnN0LT5nZXRPYmplY3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcUNvbnZEZWJ1Zygp
IDw8ICJmb3VuZCBpbnN0YW5jZSwgd2l0aCBvYmplY3Q6IiA8PCAodm9pZCopIHF0aW5zdC0+Z2V0
T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBRVmFyaWFudDo6ZnJvbVZh
bHVlKCh2b2lkICopcXRpbnN0LT5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBxQ29udkRlYnVnKCkgPDwgcmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCA9IDA7
Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBx
Q29udkRlYnVnKCkgPDwgImNhbid0IGNvbnZlcnQgZGVsZXRlZCBxb2JqZWN0IjsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
ICAgIHFDb252RGVidWcoKSA8PCAid2Fzbid0IGEgcXRpbnN0YW5jZSI7Ci0gICAgICAgICAgICAg
ICAgfQorICAgICAgICBpZiAodHlwZSA9PSBRT2JqKSB7CisgICAgICAgICAgICBRT2JqZWN0KiBv
YmogPSBRdENsYXNzOjp0b1FPYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgICAgICAgICAgIGlm
IChvYmopIHsKKyAgICAgICAgICAgICAgICByZXQgPSBRVmFyaWFudDo6ZnJvbVZhbHVlKCh2b2lk
KilvYmopOworICAgICAgICAgICAgICAgIGRpc3QgPSAwOworICAgICAgICAgICAgfQogICAgICAg
ICAgICAgfSBlbHNlIGlmICh0eXBlID09IE51bGwpIHsKICAgICAgICAgICAgICAgICByZXQgPSBR
VmFyaWFudDo6ZnJvbVZhbHVlKCh2b2lkKikwKTsKICAgICAgICAgICAgICAgICBkaXN0ID0gMDsK
QEAgLTY2NSw3ICs2NDQsNyBAQCBRVmFyaWFudCBjb252ZXJ0VmFsdWVUb1FWYXJpYW50KEpTQ29u
dGV4dFJlZiBjb250ZXh0LCBKU1ZhbHVlUmVmIHZhbHVlLCBRTWV0YVR5cAogICAgIHJldHVybiBj
b252ZXJ0VmFsdWVUb1FWYXJpYW50KGNvbnRleHQsIHZhbHVlLCBoaW50LCBkaXN0YW5jZSwgJnZp
c2l0ZWRPYmplY3RzLCByZWN1cnNpb25MaW1pdCwgZXhjZXB0aW9uKTsKIH0KIAotSlNWYWx1ZVJl
ZiBjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKEpTQ29udGV4dFJlZiBjb250ZXh0LCBQYXNzUmVmUHRy
PFJvb3RPYmplY3Q+IHJvb3QsIGNvbnN0IFFWYXJpYW50JiB2YXJpYW50LCBKU1ZhbHVlUmVmICpl
eGNlcHRpb24pCitKU1ZhbHVlUmVmIGNvbnZlcnRRVmFyaWFudFRvVmFsdWUoSlNDb250ZXh0UmVm
IGNvbnRleHQsIGNvbnN0IFFWYXJpYW50JiB2YXJpYW50LCBKU1ZhbHVlUmVmKiBleGNlcHRpb24p
CiB7CiAgICAgLy8gVmFyaWFudHMgd2l0aCBRT2JqZWN0ICogY2FuIGJlIGlzTnVsbCBidXQgbm90
IGEgbnVsbCBwb2ludGVyCiAgICAgLy8gQW4gZW1wdHkgUVN0cmluZyB2YXJpYW50IGlzIGFsc28g
bnVsbApAQCAtNzM2LDggKzcxNSw3IEBAIEpTVmFsdWVSZWYgY29udmVydFFWYXJpYW50VG9WYWx1
ZShKU0NvbnRleHRSZWYgY29udGV4dCwgUGFzc1JlZlB0cjxSb290T2JqZWN0PiByCiAgICAgICAg
IFFPYmplY3QqIG9iaiA9IHZhcmlhbnQudmFsdWU8UU9iamVjdCo+KCk7CiAgICAgICAgIGlmICgh
b2JqKQogICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlTnVsbChjb250ZXh0KTsKLSAgICAg
ICAgRXhlY1N0YXRlKiBleGVjID0gdG9KUyhjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIHRvUmVm
KGV4ZWMsIFF0SW5zdGFuY2U6OmdldFF0SW5zdGFuY2Uob2JqLCByb290LCBRdEluc3RhbmNlOjpR
dE93bmVyc2hpcCktPmNyZWF0ZVJ1bnRpbWVPYmplY3QoZXhlYykpOworICAgICAgICByZXR1cm4g
UXRDbGFzczo6aW5zdGFuY2VGb3JRT2JqZWN0KGNvbnRleHQsIG9iaiwgUXRDbGFzczo6UXRPd25l
cnNoaXApOwogICAgIH0KIAogICAgIGlmIChRdFBpeG1hcFJ1bnRpbWU6OmNhbkhhbmRsZShzdGF0
aWNfY2FzdDxRTWV0YVR5cGU6OlR5cGU+KHZhcmlhbnQudHlwZSgpKSkpCkBAIC03NTQsNyArNzMy
LDcgQEAgSlNWYWx1ZVJlZiBjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKEpTQ29udGV4dFJlZiBjb250
ZXh0LCBQYXNzUmVmUHRyPFJvb3RPYmplY3Q+IHIKICAgICAgICAgd2hpbGUgKGkgIT0gbWFwLmNv
bnN0RW5kKCkpIHsKICAgICAgICAgICAgIFFTdHJpbmcgcyA9IGkua2V5KCk7CiAgICAgICAgICAg
ICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWUgPSBKU1N0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJz
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSlNDaGFyKj4ocy5jb25zdERhdGEoKSksIHMubGVuZ3Ro
KCkpOwotICAgICAgICAgICAgSlNWYWx1ZVJlZiBwcm9wZXJ0eVZhbHVlID0gY29udmVydFFWYXJp
YW50VG9WYWx1ZShjb250ZXh0LCByb290LmdldCgpLCBpLnZhbHVlKCksIC8qaWdub3JlZCBleGNl
cHRpb24qLzApOworICAgICAgICAgICAgSlNWYWx1ZVJlZiBwcm9wZXJ0eVZhbHVlID0gY29udmVy
dFFWYXJpYW50VG9WYWx1ZShjb250ZXh0LCBpLnZhbHVlKCksIC8qaWdub3JlZCBleGNlcHRpb24q
LzApOwogICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUpCiAgICAgICAgICAgICAgICAgSlNP
YmplY3RTZXRQcm9wZXJ0eShjb250ZXh0LCByZXQsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1
ZSwga0pTUHJvcGVydHlBdHRyaWJ1dGVOb25lLCAvKmlnbm9yZWQgZXhjZXB0aW9uKi8wKTsKICAg
ICAgICAgICAgIEpTU3RyaW5nUmVsZWFzZShwcm9wZXJ0eU5hbWUpOwpAQCAtNzczLDcgKzc1MSw3
IEBAIEpTVmFsdWVSZWYgY29udmVydFFWYXJpYW50VG9WYWx1ZShKU0NvbnRleHRSZWYgY29udGV4
dCwgUGFzc1JlZlB0cjxSb290T2JqZWN0PiByCiAgICAgICAgIGlmIChleGNlcHRpb24gJiYgKmV4
Y2VwdGlvbikKICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCB2bC5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIEpTVmFsdWVSZWYgcHJvcGVy
dHkgPSBjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKGNvbnRleHQsIHJvb3QuZ2V0KCksIHZsLmF0KGkp
LCAvKmlnbm9yZWQgZXhjZXB0aW9uKi8wKTsKKyAgICAgICAgICAgIEpTVmFsdWVSZWYgcHJvcGVy
dHkgPSBjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKGNvbnRleHQsIHZsLmF0KGkpLCAvKmlnbm9yZWQg
ZXhjZXB0aW9uKi8wKTsKICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkKICAgICAgICAgICAgICAg
ICBKU09iamVjdFNldFByb3BlcnR5QXRJbmRleChjb250ZXh0LCBhcnJheSwgaSwgcHJvcGVydHks
IC8qaWdub3JlZCBleGNlcHRpb24qLzApOwogICAgICAgICB9CkBAIC03OTEsOSArNzY5LDggQEAg
SlNWYWx1ZVJlZiBjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKEpTQ29udGV4dFJlZiBjb250ZXh0LCBQ
YXNzUmVmUHRyPFJvb3RPYmplY3Q+IHIKICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gc3RhdGljX2Nh
c3Q8UU1ldGFUeXBlOjpUeXBlPihxTWV0YVR5cGVJZDxRT2JqZWN0TGlzdD4oKSkpIHsKICAgICAg
ICAgUU9iamVjdExpc3Qgb2wgPSB2YXJpYW50LnZhbHVlPFFPYmplY3RMaXN0PigpOwogICAgICAg
ICBKU09iamVjdFJlZiBhcnJheSA9IEpTT2JqZWN0TWFrZUFycmF5KGNvbnRleHQsIDAsIDAsIGV4
Y2VwdGlvbik7Ci0gICAgICAgIEV4ZWNTdGF0ZSogZXhlYyA9IHRvSlMoY29udGV4dCk7CiAgICAg
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2wuY291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBK
U1ZhbHVlUmVmIGpzT2JqZWN0ID0gdG9SZWYoZXhlYywgUXRJbnN0YW5jZTo6Z2V0UXRJbnN0YW5j
ZShvbC5hdChpKSwgcm9vdCwgUXRJbnN0YW5jZTo6UXRPd25lcnNoaXApLT5jcmVhdGVSdW50aW1l
T2JqZWN0KGV4ZWMpKTsKKyAgICAgICAgICAgIEpTVmFsdWVSZWYganNPYmplY3QgPSBRdENsYXNz
OjppbnN0YW5jZUZvclFPYmplY3QoY29udGV4dCwgb2wuYXQoaSksIFF0Q2xhc3M6OlF0T3duZXJz
aGlwKTsKICAgICAgICAgICAgIEpTT2JqZWN0U2V0UHJvcGVydHlBdEluZGV4KGNvbnRleHQsIGFy
cmF5LCBpLCBqc09iamVjdCwgLyppZ25vcmVkIGV4Y2VwdGlvbiovMCk7CiAgICAgICAgIH0KICAg
ICAgICAgcmV0dXJuIGFycmF5OwpAQCAtODA4LDcgKzc4NSw3IEBAIEpTVmFsdWVSZWYgY29udmVy
dFFWYXJpYW50VG9WYWx1ZShKU0NvbnRleHRSZWYgY29udGV4dCwgUGFzc1JlZlB0cjxSb290T2Jq
ZWN0PiByCiAgICAgaWYgKHR5cGUgPT0gKFFNZXRhVHlwZTo6VHlwZSlxTWV0YVR5cGVJZDxRVmFy
aWFudD4oKSkgewogICAgICAgICBRVmFyaWFudCByZWFsID0gdmFyaWFudC52YWx1ZTxRVmFyaWFu
dD4oKTsKICAgICAgICAgcUNvbnZEZWJ1ZygpIDw8ICJyZWFsIHZhcmlhbnQgaXM6IiA8PCByZWFs
OwotICAgICAgICByZXR1cm4gY29udmVydFFWYXJpYW50VG9WYWx1ZShjb250ZXh0LCByb290Lmdl
dCgpLCByZWFsLCBleGNlcHRpb24pOworICAgICAgICByZXR1cm4gY29udmVydFFWYXJpYW50VG9W
YWx1ZShjb250ZXh0LCByZWFsLCBleGNlcHRpb24pOwogICAgIH0KIAogICAgIHFDb252RGVidWco
KSA8PCAiZmFsbGJhY2sgcGF0aCBmb3IiIDw8IHZhcmlhbnQgPDwgdmFyaWFudC51c2VyVHlwZSgp
OwpAQCAtMTE4NywyMiArMTE2NCwyNyBAQCBzdGF0aWMgaW50IGZpbmRTaWduYWxJbmRleChjb25z
dCBRTWV0YU9iamVjdCogbWV0YSwgaW50IGluaXRpYWxJbmRleCwgUUJ5dGVBcnJheQogICAgIHJl
dHVybiBpbmRleDsKIH0KIAorc3RhdGljIHZvaWQgZmluYWxpemVNZXRob2QoSlNPYmplY3RSZWYg
b2JqZWN0KQoreworICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxRdFJ1bnRpbWVNZXRob2QqPihKU09i
amVjdEdldFByaXZhdGUob2JqZWN0KSk7Cit9CisKIHN0YXRpYyBKU0NsYXNzUmVmIHByb3RvdHlw
ZUZvclNpZ25hbHNBbmRTbG90cygpCiB7CiAgICAgc3RhdGljIEpTQ2xhc3NEZWZpbml0aW9uIGNs
YXNzRGVmID0gewogICAgICAgICAwLCBrSlNDbGFzc0F0dHJpYnV0ZU5vQXV0b21hdGljUHJvdG90
eXBlLCAwLCAwLCAwLCAwLAotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
CisgICAgICAgIDAsIGZpbmFsaXplTWV0aG9kLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiAg
ICAgfTsKICAgICBzdGF0aWMgSlNDbGFzc1JlZiBjbHMgPSBKU0NsYXNzQ3JlYXRlKCZjbGFzc0Rl
Zik7CiAgICAgcmV0dXJuIGNsczsKIH0KIAotUXRSdW50aW1lTWV0aG9kOjpRdFJ1bnRpbWVNZXRo
b2QoSlNDb250ZXh0UmVmIGN0eCwgUU9iamVjdCogb2JqZWN0LCBjb25zdCBRQnl0ZUFycmF5JiBp
ZGVudGlmaWVyLCBpbnQgaW5kZXgsIGludCBmbGFncywgUXRJbnN0YW5jZSogaW5zdGFuY2UpCisK
K1F0UnVudGltZU1ldGhvZDo6UXRSdW50aW1lTWV0aG9kKFFPYmplY3QqIG9iamVjdCwgY29uc3Qg
UUJ5dGVBcnJheSYgaWRlbnRpZmllciwgaW50IHNpZ25hbEluZGV4LCBpbnQgZmxhZ3MpCiAgICAg
OiBtX29iamVjdChvYmplY3QpCiAgICAgLCBtX2lkZW50aWZpZXIoaWRlbnRpZmllcikKLSAgICAs
IG1faW5kZXgoaW5kZXgpCisgICAgLCBtX2luZGV4KHNpZ25hbEluZGV4KQogICAgICwgbV9mbGFn
cyhmbGFncykKLSAgICAsIG1faW5zdGFuY2UoaW5zdGFuY2UpCiB7CiB9CiAKQEAgLTEyMTcsOCAr
MTE5OSw4IEBAIEpTVmFsdWVSZWYgUXRSdW50aW1lTWV0aG9kOjpjYWxsKEpTQ29udGV4dFJlZiBj
b250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPCiAgICAgICAgIHNldEV4Y2VwdGlvbihj
b250ZXh0LCBleGNlcHRpb24sIFFTdHJpbmdMaXRlcmFsKCJjYW5ub3QgY2FsbCBmdW5jdGlvbiBv
ZiBkZWxldGVkIHJ1bnRpbWUgbWV0aG9kIikpOwogICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VV
bmRlZmluZWQoY29udGV4dCk7CiAgICAgfQotICAgIFFPYmplY3QqIG9iaiA9IGQtPm1fb2JqZWN0
OwogCisgICAgUU9iamVjdCogb2JqID0gZC0+bV9vYmplY3Q7CiAgICAgaWYgKCFvYmopIHsKICAg
ICAgICAgc2V0RXhjZXB0aW9uKGNvbnRleHQsIGV4Y2VwdGlvbiwgUVN0cmluZ0xpdGVyYWwoImNh
bm5vdCBjYWxsIGZ1bmN0aW9uIG9mIGRlbGV0ZWQgUU9iamVjdCIpKTsKICAgICAgICAgcmV0dXJu
IEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOwpAQCAtMTIzOCw3ICsxMjIwLDcgQEAgSlNW
YWx1ZVJlZiBRdFJ1bnRpbWVNZXRob2Q6OmNhbGwoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2Jq
ZWN0UmVmIGZ1bmN0aW9uLCBKU08KICAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVk
KGNvbnRleHQpOwogCiAgICAgaWYgKHZhcmdzLnNpemUoKSA+IDAgJiYgdmFyZ3NbMF0uaXNWYWxp
ZCgpKQotICAgICAgICByZXR1cm4gY29udmVydFFWYXJpYW50VG9WYWx1ZShjb250ZXh0LCBkLT5t
X2luc3RhbmNlLT5yb290T2JqZWN0KCksIHZhcmdzWzBdLCBleGNlcHRpb24pOworICAgICAgICBy
ZXR1cm4gY29udmVydFFWYXJpYW50VG9WYWx1ZShjb250ZXh0LCB2YXJnc1swXSwgZXhjZXB0aW9u
KTsKIAogICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKIH0KQEAgLTEy
NTUsOSArMTIzNyw2IEBAIEpTVmFsdWVSZWYgUXRSdW50aW1lTWV0aG9kOjpkaXNjb25uZWN0KEpT
Q29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvCiAKIEpTT2JqZWN0UmVmIFF0
UnVudGltZU1ldGhvZDo6anNPYmplY3RSZWYoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTVmFsdWVS
ZWYqIGV4Y2VwdGlvbikKIHsKLSAgICBpZiAobV9qc09iamVjdCkKLSAgICAgICAgcmV0dXJuIHRv
UmVmKG1fanNPYmplY3QuZ2V0KCkpOwotCiAgICAgc3RhdGljIEpTU3RyaW5nUmVmIGNvbm5lY3RT
dHIgPSBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZygiY29ubmVjdCIpOwogICAgIHN0YXRp
YyBKU1N0cmluZ1JlZiBkaXNjb25uZWN0U3RyID0gSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJp
bmcoImRpc2Nvbm5lY3QiKTsKICAgICBKU1JldGFpblB0cjxKU1N0cmluZ1JlZj4gYWN0dWFsTmFt
ZVN0cihBZG9wdCwgSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcobV9pZGVudGlmaWVyLmNv
bnN0RGF0YSgpKSk7CkBAIC0xMjgwLDggKzEyNTksNiBAQCBKU09iamVjdFJlZiBRdFJ1bnRpbWVN
ZXRob2Q6OmpzT2JqZWN0UmVmKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU1ZhbHVlUmVmKiBleGNl
cAogICAgIEpTT2JqZWN0U2V0UHJvcGVydHkoY29udGV4dCwgb2JqZWN0LCBjb25uZWN0U3RyLCBj
b25uZWN0RnVuY3Rpb24sIGF0dHJpYnV0ZXMsIGV4Y2VwdGlvbik7CiAgICAgSlNPYmplY3RTZXRQ
cm9wZXJ0eShjb250ZXh0LCBvYmplY3QsIGRpc2Nvbm5lY3RTdHIsIGRpc2Nvbm5lY3RGdW5jdGlv
biwgYXR0cmlidXRlcywgZXhjZXB0aW9uKTsKIAotICAgIG1fanNPYmplY3QgPSBQYXNzV2VhazxK
U09iamVjdD4odG9KUyhvYmplY3QpKTsKLQogICAgIHJldHVybiBvYmplY3Q7CiB9CiAKQEAgLTEz
NDIsNyArMTMxOSw3IEBAIEpTVmFsdWVSZWYgUXRSdW50aW1lTWV0aG9kOjpjb25uZWN0T3JEaXNj
b25uZWN0KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlCiAgICAgICAgIGlmIChKU09i
amVjdElzRnVuY3Rpb24oY29udGV4dCwgdGFyZ2V0RnVuY3Rpb24pKSB7CiAgICAgICAgICAgICAv
LyBvYmplY3Quc2lnbmFsLmNvbm5lY3Qob3RoZXJPYmplY3Quc2xvdCk7CiAgICAgICAgICAgICBp
ZiAoUXRSdW50aW1lTWV0aG9kKiB0YXJnZXRNZXRob2QgPSB0b1J1bnRpbWVNZXRob2QoY29udGV4
dCwgdGFyZ2V0RnVuY3Rpb24pKQotICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdCA9IHRvUmVm
KFF0SW5zdGFuY2U6OmdldFF0SW5zdGFuY2UodGFyZ2V0TWV0aG9kLT5tX29iamVjdC5kYXRhKCks
IGQtPm1faW5zdGFuY2UtPnJvb3RPYmplY3QoKSwgUXRJbnN0YW5jZTo6UXRPd25lcnNoaXApLT5j
cmVhdGVSdW50aW1lT2JqZWN0KHRvSlMoY29udGV4dCkpKTsKKyAgICAgICAgICAgICAgICB0YXJn
ZXRPYmplY3QgPSBRdENsYXNzOjppbnN0YW5jZUZvclFPYmplY3QoY29udGV4dCwgdGFyZ2V0TWV0
aG9kLT5tX29iamVjdC5kYXRhKCksIFF0Q2xhc3M6OlF0T3duZXJzaGlwKTsKICAgICAgICAgfSBl
bHNlCiAgICAgICAgICAgICB0YXJnZXRGdW5jdGlvbiA9IDA7CiAgICAgfSBlbHNlIHsKQEAgLTEz
ODYsNyArMTM2Myw3IEBAIEpTVmFsdWVSZWYgUXRSdW50aW1lTWV0aG9kOjpjb25uZWN0T3JEaXNj
b25uZWN0KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlCiAgICAgICAgIC8vICByZWNl
aXZlciBmdW5jdGlvbiBbZnJvbSBhcmd1bWVudHNdCiAgICAgICAgIC8vICByZWNlaXZlciB0aGlz
IG9iamVjdCBbZnJvbSBhcmd1bWVudHNdCiAKLSAgICAgICAgUXRDb25uZWN0aW9uT2JqZWN0KiBj
b25uID0gbmV3IFF0Q29ubmVjdGlvbk9iamVjdChjb250ZXh0LCBRdEluc3RhbmNlOjpnZXRRdElu
c3RhbmNlKHNlbmRlciwgZC0+bV9pbnN0YW5jZS0+cm9vdE9iamVjdCgpLCBRdEluc3RhbmNlOjpR
dE93bmVyc2hpcCksIHNpZ25hbEluZGV4LCB0YXJnZXRPYmplY3QsIHRhcmdldEZ1bmN0aW9uKTsK
KyAgICAgICAgUXRDb25uZWN0aW9uT2JqZWN0KiBjb25uID0gbmV3IFF0Q29ubmVjdGlvbk9iamVj
dChjb250ZXh0LCBzZW5kZXIsIHNpZ25hbEluZGV4LCB0YXJnZXRPYmplY3QsIHRhcmdldEZ1bmN0
aW9uKTsKICAgICAgICAgYm9vbCBvayA9IFFNZXRhT2JqZWN0Ojpjb25uZWN0KHNlbmRlciwgc2ln
bmFsSW5kZXgsIGNvbm4sIGNvbm4tPm1ldGFPYmplY3QoKS0+bWV0aG9kT2Zmc2V0KCkpOwogICAg
ICAgICBpZiAoIW9rKSB7CiAgICAgICAgICAgICBkZWxldGUgY29ubjsKQEAgLTE0MjksMTAgKzE0
MDYsOSBAQCBKU1ZhbHVlUmVmIFF0UnVudGltZU1ldGhvZDo6Y29ubmVjdE9yRGlzY29ubmVjdChK
U0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZQogCiBRTXVsdGlNYXA8UU9iamVjdCosIFF0
Q29ubmVjdGlvbk9iamVjdCo+IFF0Q29ubmVjdGlvbk9iamVjdDo6Y29ubmVjdGlvbnM7CiAKLVF0
Q29ubmVjdGlvbk9iamVjdDo6UXRDb25uZWN0aW9uT2JqZWN0KEpTQ29udGV4dFJlZiBjb250ZXh0
LCBQYXNzUmVmUHRyPFF0SW5zdGFuY2U+IHNlbmRlckluc3RhbmNlLCBpbnQgc2lnbmFsSW5kZXgs
IEpTT2JqZWN0UmVmIHJlY2VpdmVyLCBKU09iamVjdFJlZiByZWNlaXZlckZ1bmN0aW9uKQotICAg
IDogUU9iamVjdChzZW5kZXJJbnN0YW5jZS0+Z2V0T2JqZWN0KCkpCitRdENvbm5lY3Rpb25PYmpl
Y3Q6OlF0Q29ubmVjdGlvbk9iamVjdChKU0NvbnRleHRSZWYgY29udGV4dCwgUU9iamVjdCogc2Vu
ZGVyLCBpbnQgc2lnbmFsSW5kZXgsIEpTT2JqZWN0UmVmIHJlY2VpdmVyLCBKU09iamVjdFJlZiBy
ZWNlaXZlckZ1bmN0aW9uKQorICAgIDogUU9iamVjdChzZW5kZXIpCiAgICAgLCBtX2NvbnRleHQo
SlNDb250ZXh0R2V0R2xvYmFsQ29udGV4dChjb250ZXh0KSkKLSAgICAsIG1fcm9vdE9iamVjdChz
ZW5kZXJJbnN0YW5jZS0+cm9vdE9iamVjdCgpKQogICAgICwgbV9zaWduYWxJbmRleChzaWduYWxJ
bmRleCkKICAgICAsIG1fcmVjZWl2ZXIocmVjZWl2ZXIpCiAgICAgLCBtX3JlY2VpdmVyRnVuY3Rp
b24ocmVjZWl2ZXJGdW5jdGlvbikKQEAgLTE1NTIsNyArMTUyOCw3IEBAIHZvaWQgUXRDb25uZWN0
aW9uT2JqZWN0OjpleGVjdXRlKHZvaWQqKiBhcmd2KQogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBhcmdjOyBpKyspIHsKICAgICAgICAgaW50IGFyZ1R5cGUgPSBtZXRob2QucGFyYW1ldGVyVHlw
ZShpKTsKLSAgICAgICAgYXJnc1tpXSA9IGNvbnZlcnRRVmFyaWFudFRvVmFsdWUobV9jb250ZXh0
LCBtX3Jvb3RPYmplY3QsIFFWYXJpYW50KGFyZ1R5cGUsIGFyZ3ZbaSsxXSksIGlnbm9yZWRFeGNl
cHRpb24pOworICAgICAgICBhcmdzW2ldID0gY29udmVydFFWYXJpYW50VG9WYWx1ZShtX2NvbnRl
eHQsIFFWYXJpYW50KGFyZ1R5cGUsIGFyZ3ZbaSsxXSksIGlnbm9yZWRFeGNlcHRpb24pOwogICAg
IH0KIAogICAgIEpTT2JqZWN0Q2FsbEFzRnVuY3Rpb24obV9jb250ZXh0LCBtX3JlY2VpdmVyRnVu
Y3Rpb24sIG1fcmVjZWl2ZXIsIGFyZ2MsIGFyZ3MuZGF0YSgpLCAwKTsKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9ydW50aW1lLmggYi9Tb3VyY2UvV2ViQ29yZS9icmlk
Z2UvcXQvcXRfcnVudGltZS5oCmluZGV4IGJhYmIyZTYwNDZkMDE0Zjc2NTYwMTE3MmNlODk0OTcz
NjIwNjI0ODcuLjU4MDA1N2U1ZWVlYTFmODE0ZjlkMDBlODA2ODlhODcwNzVhN2FhN2MgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9ydW50aW1lLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvYnJpZGdlL3F0L3F0X3J1bnRpbWUuaApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1
ZGUgIkpTRE9NQmluZGluZy5oIgogI2luY2x1ZGUgIkphdmFTY3JpcHQuaCIKICNpbmNsdWRlICJX
ZWFrLmgiCi0jaW5jbHVkZSAicXRfaW5zdGFuY2UuaCIKICNpbmNsdWRlICJydW50aW1lX21ldGhv
ZC5oIgogCiAjaW5jbHVkZSA8UVBvaW50ZXI+CkBAIC04Myw3ICs4Miw3IEBAIHB1YmxpYzoKICAg
ICAgICAgQWxsb3dQcml2YXRlID0gMgogICAgIH07CiAKLSAgICBRdFJ1bnRpbWVNZXRob2QoSlND
b250ZXh0UmVmLCBRT2JqZWN0KiwgY29uc3QgUUJ5dGVBcnJheSYgaWRlbnRpZmllciwgaW50IHNp
Z25hbEluZGV4LCBpbnQgZmxhZ3MsIFF0SW5zdGFuY2UqKTsKKyAgICBRdFJ1bnRpbWVNZXRob2Qo
UU9iamVjdCosIGNvbnN0IFFCeXRlQXJyYXkmIGlkZW50aWZpZXIsIGludCBzaWduYWxJbmRleCwg
aW50IGZsYWdzKTsKICAgICB+UXRSdW50aW1lTWV0aG9kKCk7CiAKICAgICBzdGF0aWMgSlNWYWx1
ZVJlZiBjYWxsKEpTQ29udGV4dFJlZiBjdHgsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVj
dFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBh
cmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKTsKQEAgLTEwMiw4ICsxMDEsNiBAQCBw
cml2YXRlOgogICAgIFFCeXRlQXJyYXkgbV9pZGVudGlmaWVyOwogICAgIGludCBtX2luZGV4Owog
ICAgIGludCBtX2ZsYWdzOwotICAgIFdlYWs8SlNPYmplY3Q+IG1fanNPYmplY3Q7Ci0gICAgUXRJ
bnN0YW5jZSogbV9pbnN0YW5jZTsKIH07CiAKIC8vIEEgUXRDb25uZWN0aW9uT2JqZWN0IHJlcHJl
c2VudHMgYSBjb25uZWN0aW9uIGNyZWF0ZWQgaW5zaWRlIEpTLiBJdCB3aWxsIGNvbm5lY3QgaXRz
IG93biBleGVjdXRlKCkgc2xvdApAQCAtMTEyLDcgKzEwOSw3IEBAIGNsYXNzIFF0Q29ubmVjdGlv
bk9iamVjdCA6IHB1YmxpYyBRT2JqZWN0CiB7CiAgICAgUV9PQkpFQ1RfRkFLRQogcHVibGljOgot
ICAgIFF0Q29ubmVjdGlvbk9iamVjdChKU0NvbnRleHRSZWYsIFBhc3NSZWZQdHI8UXRJbnN0YW5j
ZT4gc2VuZGVySW5zdGFuY2UsIGludCBzaWduYWxJbmRleCwgSlNPYmplY3RSZWYgcmVjZWl2ZXIs
IEpTT2JqZWN0UmVmIHJlY2VpdmVyRnVuY3Rpb24pOworICAgIFF0Q29ubmVjdGlvbk9iamVjdChK
U0NvbnRleHRSZWYsIFFPYmplY3QgKnNlbmRlciwgaW50IHNpZ25hbEluZGV4LCBKU09iamVjdFJl
ZiByZWNlaXZlciwgSlNPYmplY3RSZWYgcmVjZWl2ZXJGdW5jdGlvbik7CiAgICAgflF0Q29ubmVj
dGlvbk9iamVjdCgpOwogCiAgICAgdm9pZCBleGVjdXRlKHZvaWQgKiphcmd2KTsKQEAgLTEyMSw3
ICsxMTgsNiBAQCBwdWJsaWM6CiAKIHByaXZhdGU6CiAgICAgSlNHbG9iYWxDb250ZXh0UmVmIG1f
Y29udGV4dDsKLSAgICBSZWZQdHI8Um9vdE9iamVjdD4gbV9yb290T2JqZWN0OwogCiAgICAgaW50
IG1fc2lnbmFsSW5kZXg7CiAgICAgSlNPYmplY3RSZWYgbV9yZWNlaXZlcjsKQEAgLTEzOCw3ICsx
MzQsNyBAQCB0eXBlZGVmIEpTVmFsdWVSZWYgKCpDb252ZXJ0VG9KU1ZhbHVlRnVuY3Rpb24pKEpT
Q29udGV4dFJlZiwgY29uc3QgUVZhcmlhbnQmIHZhcgogdm9pZCByZWdpc3RlckN1c3RvbVR5cGUo
aW50IHF0TWV0YVR5cGVJZCwgQ29udmVydFRvVmFyaWFudEZ1bmN0aW9uLCBDb252ZXJ0VG9KU1Zh
bHVlRnVuY3Rpb24pOwogCiBRVmFyaWFudCBjb252ZXJ0VmFsdWVUb1FWYXJpYW50KEpTQ29udGV4
dFJlZiwgSlNWYWx1ZVJlZiwgUU1ldGFUeXBlOjpUeXBlIGhpbnQsIGludCAqZGlzdGFuY2UsIEpT
VmFsdWVSZWYqIGV4Y2VwdGlvbik7Ci1KU1ZhbHVlUmVmIGNvbnZlcnRRVmFyaWFudFRvVmFsdWUo
SlNDb250ZXh0UmVmLCBQYXNzUmVmUHRyPFJvb3RPYmplY3Q+LCBjb25zdCBRVmFyaWFudCYsIEpT
VmFsdWVSZWYqIGV4Y2VwdGlvbik7CitKU1ZhbHVlUmVmIGNvbnZlcnRRVmFyaWFudFRvVmFsdWUo
SlNDb250ZXh0UmVmLCBjb25zdCBRVmFyaWFudCYsIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbik7CiAK
IHZvaWQgc2V0RXhjZXB0aW9uKEpTQ29udGV4dFJlZiwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uLCBj
b25zdCBRU3RyaW5nJiB0ZXh0KTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9BcGkv
cXdlYmZyYW1lLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJmcmFtZS5jcHAKaW5kZXgg
YWRiZmExY2NkZTRmYTc0NTVlMGI2YmM3NWJiMTM3YTVmZjRhY2FiMy4uYjJlZGJhN2EzNTQ1MzBl
YTE0NWMwYTQ3ODkyYTI5MWRjNjRiMGQ0NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9xdC9B
cGkvcXdlYmZyYW1lLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWUuY3Bw
CkBAIC03MSw3ICs3MSw3IEBACiAjaW5jbHVkZSAiVGlsZWRCYWNraW5nU3RvcmUuaCIKICNpbmNs
dWRlICJodG1sZWRpdGluZy5oIgogI2luY2x1ZGUgIm1hcmt1cC5oIgotI2luY2x1ZGUgInF0X2lu
c3RhbmNlLmgiCisjaW5jbHVkZSAicXRfY2xhc3MuaCIKICNpbmNsdWRlICJxdF9ydW50aW1lLmgi
CiAjaW5jbHVkZSAicXdlYmVsZW1lbnQuaCIKICNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgpAQCAt
NjE2LDI4ICs2MTYsMTggQEAgdm9pZCBRV2ViRnJhbWU6OmFkZFRvSmF2YVNjcmlwdFdpbmRvd09i
amVjdChjb25zdCBRU3RyaW5nICZuYW1lLCBRT2JqZWN0ICpvYmplY3QKIHsKICAgICBpZiAoIXBh
Z2UoKS0+c2V0dGluZ3MoKS0+dGVzdEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkphdmFzY3JpcHRF
bmFibGVkKSkKICAgICAgICAgcmV0dXJuOwotICAgIEpTQzo6QmluZGluZ3M6OlF0SW5zdGFuY2U6
OlZhbHVlT3duZXJzaGlwIHZhbHVlT3duZXJzaGlwID0gc3RhdGljX2Nhc3Q8SlNDOjpCaW5kaW5n
czo6UXRJbnN0YW5jZTo6VmFsdWVPd25lcnNoaXA+KG93bmVyc2hpcCk7CisgICAgSlNDOjpCaW5k
aW5nczo6UXRDbGFzczo6VmFsdWVPd25lcnNoaXAgdmFsdWVPd25lcnNoaXAgPSBzdGF0aWNfY2Fz
dDxKU0M6OkJpbmRpbmdzOjpRdENsYXNzOjpWYWx1ZU93bmVyc2hpcD4ob3duZXJzaGlwKTsKICAg
ICBKU0RPTVdpbmRvdyogd2luZG93ID0gdG9KU0RPTVdpbmRvdyhkLT5mcmFtZSwgbWFpblRocmVh
ZE5vcm1hbFdvcmxkKCkpOwotICAgIEpTQzo6QmluZGluZ3M6OlJvb3RPYmplY3QqIHJvb3Q7Ci0g
ICAgaWYgKHZhbHVlT3duZXJzaGlwID09IEpTQzo6QmluZGluZ3M6OlF0SW5zdGFuY2U6OlF0T3du
ZXJzaGlwKQotICAgICAgICByb290ID0gZC0+ZnJhbWUtPnNjcmlwdCgpLT5jYWNoZWFibGVCaW5k
aW5nUm9vdE9iamVjdCgpOwotICAgIGVsc2UKLSAgICAgICAgcm9vdCA9IGQtPmZyYW1lLT5zY3Jp
cHQoKS0+YmluZGluZ1Jvb3RPYmplY3QoKTsKIAogICAgIGlmICghd2luZG93KSB7CiAgICAgICAg
IHFEZWJ1ZygpIDw8ICJXYXJuaW5nOiBjb3VsZG4ndCBnZXQgd2luZG93IG9iamVjdCI7CiAgICAg
ICAgIHJldHVybjsKICAgICB9Ci0gICAgaWYgKCFyb290KSB7Ci0gICAgICAgIHFEZWJ1ZygpIDw8
ICJXYXJuaW5nOiBjb3VsZG4ndCBnZXQgcm9vdCBvYmplY3QiOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQogCiAgICAgSlNDOjpFeGVjU3RhdGUqIGV4ZWMgPSB3aW5kb3ctPmdsb2JhbEV4ZWMoKTsK
ICAgICBKU0M6OkpTTG9ja0hvbGRlciBsb2NrKGV4ZWMpOwogCi0gICAgSlNDOjpKU09iamVjdCog
cnVudGltZU9iamVjdCA9Ci0gICAgICAgICAgICBKU0M6OkJpbmRpbmdzOjpRdEluc3RhbmNlOjpn
ZXRRdEluc3RhbmNlKG9iamVjdCwgcm9vdCwgdmFsdWVPd25lcnNoaXApLT5jcmVhdGVSdW50aW1l
T2JqZWN0KGV4ZWMpOworICAgIEpTQzo6SlNPYmplY3QqIHJ1bnRpbWVPYmplY3QgPSB0b0pTKEpT
Qzo6QmluZGluZ3M6OlF0Q2xhc3M6Omluc3RhbmNlRm9yUU9iamVjdCh0b1JlZihleGVjKSwgb2Jq
ZWN0LCB2YWx1ZU93bmVyc2hpcCkpOwogCiAgICAgSlNDOjpQdXRQcm9wZXJ0eVNsb3Qgc2xvdDsK
ICAgICB3aW5kb3ctPm1ldGhvZFRhYmxlKCktPnB1dCh3aW5kb3csIGV4ZWMsIEpTQzo6SWRlbnRp
ZmllcigmZXhlYy0+Z2xvYmFsRGF0YSgpLCByZWludGVycHJldF9jYXN0X3B0cjxjb25zdCBVQ2hh
cio+KG5hbWUuY29uc3REYXRhKCkpLCBuYW1lLmxlbmd0aCgpKSwgcnVudGltZU9iamVjdCwgc2xv
dCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L3Rlc3RzL3FvYmplY3RicmlkZ2UvcW9i
amVjdGJyaWRnZS5wcm8gYi9Tb3VyY2UvV2ViS2l0L3F0L3Rlc3RzL3FvYmplY3RicmlkZ2UvcW9i
amVjdGJyaWRnZS5wcm8KaW5kZXggZjQzNGNjYmMxMjAzMWFhMTJjYjg4ZDE4OWQ0NDIyYThlM2Ji
ZGQ4OC4uZmY2YzQ5NjI4OTZlNGMwNTY3OTllZjE2NDBjYjE1NjA3ODFjYWE1YiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdC9xdC90ZXN0cy9xb2JqZWN0YnJpZGdlL3FvYmplY3RicmlkZ2UucHJv
CisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvdGVzdHMvcW9iamVjdGJyaWRnZS9xb2JqZWN0YnJpZGdl
LnBybwpAQCAtMSwzICsxLDIgQEAKIGluY2x1ZGUoLi4vdGVzdHMucHJpKQogZXhpc3RzKCQke1RB
UkdFVH0ucXJjKTpSRVNPVVJDRVMgKz0gJCR7VEFSR0VUfS5xcmMKLQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9xdC90ZXN0cy9xb2JqZWN0YnJpZGdlL3RzdF9xb2JqZWN0YnJpZGdlLmNwcCBi
L1NvdXJjZS9XZWJLaXQvcXQvdGVzdHMvcW9iamVjdGJyaWRnZS90c3RfcW9iamVjdGJyaWRnZS5j
cHAKaW5kZXggMTNkOThhZjkzZjAyYWRkNzgzZDc5MDY0ZTQzYzExODcyNTA2NTNmYy4uNDg2YjFi
ODJkOTY3YjEwMzAzZjU3MDA1M2JiNjMyZjc3NWJiOTI5ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YktpdC9xdC90ZXN0cy9xb2JqZWN0YnJpZGdlL3RzdF9xb2JqZWN0YnJpZGdlLmNwcAorKysgYi9T
b3VyY2UvV2ViS2l0L3F0L3Rlc3RzL3FvYmplY3RicmlkZ2UvdHN0X3FvYmplY3RicmlkZ2UuY3Bw
CkBAIC0xNyw2ICsxNyw4IEBACiAgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCiAqLwog
CisjaW5jbHVkZSAiLi4vV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuaCIK
KwogI2luY2x1ZGUgPFF0VGVzdC9RdFRlc3Q+CiAKICNpbmNsdWRlIDxxYnJ1c2guaD4KQEAgLTI1
LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxxd2VicGFnZS5oPgogI2luY2x1ZGUgPHF3ZWJ2aWV3Lmg+
CiAKKwogc3RydWN0IEN1c3RvbVR5cGUgewogICAgIFFTdHJpbmcgc3RyaW5nOwogfTsKQEAgLTU1
LDYgKzU4LDcgQEAgY2xhc3MgTXlRT2JqZWN0IDogcHVibGljIFFPYmplY3QgewogICAgIFFfUFJP
UEVSVFkoQ3VzdG9tVHlwZSBwcm9wV2l0aEN1c3RvbVR5cGUgUkVBRCBwcm9wV2l0aEN1c3RvbVR5
cGUgV1JJVEUgc2V0UHJvcFdpdGhDdXN0b21UeXBlKQogICAgIFFfUFJPUEVSVFkoUVdlYkVsZW1l
bnQgd2ViRWxlbWVudFByb3BlcnR5IFJFQUQgd2ViRWxlbWVudFByb3BlcnR5IFdSSVRFIHNldFdl
YkVsZW1lbnRQcm9wZXJ0eSkKICAgICBRX1BST1BFUlRZKFFPYmplY3QqIG9iamVjdFN0YXJQcm9w
ZXJ0eSBSRUFEIG9iamVjdFN0YXJQcm9wZXJ0eSBXUklURSBzZXRPYmplY3RTdGFyUHJvcGVydHkp
CisgICAgUV9QUk9QRVJUWShpbnQgcHJvcGVydHlXaXRoU2FtZVNsb3RHZXR0ZXJOYW1lIFJFQUQg
cHJvcGVydHlXaXRoU2FtZVNsb3RHZXR0ZXJOYW1lKQogICAgIFFfRU5VTVMoUG9saWN5IFN0cmF0
ZWd5KQogICAgIFFfRkxBR1MoQWJpbGl0eSkKIApAQCAtNTUwLDYgKzU1NCwxMSBAQCBwdWJsaWMg
UV9TTE9UUzoKICAgICAgICAgbV9hY3R1YWxzIDw8IFFWYXJpYW50Ojpmcm9tVmFsdWU8UVdlYkVs
ZW1lbnQ+KGFyZyk7CiAgICAgfQogCisgICAgaW50IHByb3BlcnR5V2l0aFNhbWVTbG90R2V0dGVy
TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gNDI7CisgICAgfQorCiBwcm90ZWN0ZWQgUV9T
TE9UUzoKICAgICB2b2lkIG15UHJvdGVjdGVkU2xvdCgpCiAgICAgewpAQCAtNjEwLDYgKzYxOSwy
MSBAQCBwdWJsaWM6CiAgICAgICAgIDogTXlRT2JqZWN0KHBhcmVudCkgeyB9CiB9OwogCisvLyBU
aGUgSmF2YVNjcmlwdENvcmUgR0MgbWFya3MgdGhlIEMgc3RhY2suIFRvIHRyeSB0byBlbnN1cmUg
dGhhdCB0aGVyZSBpcworLy8gbm8gSlNPYmplY3QqIGxlZnQgaW4gc3RhY2sgbWVtb3J5IGJ5IHRo
ZSBjb21waWxlciwgd2UgY2FsbCB0aGlzIGZ1bmN0aW9uCisvLyB0byB6YXAgc29tZSBieXRlcyBv
ZiBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgY29sbGVjdEdhcmJhZ2UoKS4KK3N0YXRpYyB2b2lkIHph
cFNvbWVTdGFjaygpCit7CisgICAgY2hhciBidWZbNDA5Nl07CisgICAgbWVtc2V0KGJ1ZiwgMCwg
c2l6ZW9mKGJ1ZikpOworfQorCitzdGF0aWMgdm9pZCBnYXJiYWdlQ29sbGVjdCgpCit7CisgICAg
emFwU29tZVN0YWNrKCk7CisgICAgRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ6OmdhcmJhZ2VDb2xs
ZWN0b3JDb2xsZWN0KCk7Cit9CisKIGNsYXNzIHRzdF9RT2JqZWN0QnJpZGdlIDogcHVibGljIFFP
YmplY3QgewogICAgIFFfT0JKRUNUCiAKQEAgLTY0Miw2ICs2NjYsNyBAQCBwcml2YXRlIFFfU0xP
VFM6CiAgICAgdm9pZCBpbnRyb3NwZWN0UXRNZXRob2RzX2RhdGEoKTsKICAgICB2b2lkIGludHJv
c3BlY3RRdE1ldGhvZHMoKTsKICAgICB2b2lkIHNjcmlwdGFibGVQbHVnaW4oKTsKKyAgICB2b2lk
IHByb3BlcnR5QW5kU2xvdFdpdGhTYW1lTmFtZSgpOwogCiBwcml2YXRlOgogICAgIFFTdHJpbmcg
ZXZhbEpTKGNvbnN0IFFTdHJpbmcmIHMpCkBAIC04OTUsOSArOTIwLDExIEBAIHZvaWQgdHN0X1FP
YmplY3RCcmlkZ2U6OmdldFNldFN0YXRpY1Byb3BlcnR5KCkKICAgICBRQ09NUEFSRShldmFsSlMo
Im15T2JqZWN0LndlYkVsZW1lbnRQcm9wZXJ0eS50YWdOYW1lIiksIFFMYXRpbjFTdHJpbmcoIkJP
RFkiKSk7CiAKICAgICAvLyB0cnkgdG8gZGVsZXRlCisgICAgUUVYUEVDVF9GQUlMKCIiLCAiVGhl
IHJldHVybiB2YWx1ZSBvZiB0aGUgZGVsZXRlIG9wZXJhdG9yIGlzIGluY29ycmVjdC4iLCBDb250
aW51ZSk7CiAgICAgUUNPTVBBUkUoZXZhbEpTKCJkZWxldGUgbXlPYmplY3QuaW50UHJvcGVydHki
KSwgc0ZhbHNlKTsKICAgICBRQ09NUEFSRShldmFsSlMoIm15T2JqZWN0LmludFByb3BlcnR5ID09
IDEyMyIpLCBzVHJ1ZSk7CiAKKyAgICBRRVhQRUNUX0ZBSUwoIiIsICJUaGUgcmV0dXJuIHZhbHVl
IG9mIHRoZSBkZWxldGUgb3BlcmF0b3IgaXMgaW5jb3JyZWN0LiIsIENvbnRpbnVlKTsKICAgICBR
Q09NUEFSRShldmFsSlMoImRlbGV0ZSBteU9iamVjdC52YXJpYW50UHJvcGVydHkiKSwgc0ZhbHNl
KTsKICAgICBRQ09NUEFSRShldmFsSlMoIm15T2JqZWN0LnZhcmlhbnRQcm9wZXJ0eSIpLnRvRG91
YmxlKCksIDQyLjApOwogCkBAIC05NjUsOSArOTkyLDkgQEAgdm9pZCB0c3RfUU9iamVjdEJyaWRn
ZTo6Z2V0U2V0RHluYW1pY1Byb3BlcnR5KCkKICAgICAgICAgICAgICAgICAgICAgIm15T2JqZWN0
LmR5bmFtaWNQcm9wZXJ0eSIpLCBRTGF0aW4xU3RyaW5nKCJmb28iKSk7CiAgICAgUUNPTVBBUkUo
bV9teU9iamVjdC0+cHJvcGVydHkoImR5bmFtaWNQcm9wZXJ0eSIpLnRvU3RyaW5nKCksIFFMYXRp
bjFTdHJpbmcoImZvbyIpKTsKIAotICAgIC8vIGRlbGV0ZSB0aGUgcHJvcGVydHkgKFhGQUlMIC0g
Y2FuJ3QgZGVsZXRlIHByb3BlcnRpZXMpCi0gICAgUUVYUEVDVF9GQUlMKCIiLCAiY2FuJ3QgZGVs
ZXRlIHByb3BlcnRpZXMiLCBDb250aW51ZSk7CiAgICAgUUNPTVBBUkUoZXZhbEpTKCJkZWxldGUg
bXlPYmplY3QuZHluYW1pY1Byb3BlcnR5IiksIHNUcnVlKTsKKyAgICBRRVhQRUNUX0ZBSUwoIiIs
ICJjYW4ndCBkZWxldGUgZHluYW1pYyBwcm9wZXJ0aWVzIiwgQ29udGludWUpOworICAgIFFWRVJJ
RlkoIW1fbXlPYmplY3QtPnByb3BlcnR5KCJkeW5hbWljUHJvcGVydHkiKS5pc1ZhbGlkKCkpOwog
ICAgIC8qCiAgICAgUUNPTVBBUkUobV9teU9iamVjdC0+cHJvcGVydHkoImR5bmFtaWNQcm9wZXJ0
eSIpLmlzVmFsaWQoKSwgZmFsc2UpOwogICAgIFFDT01QQVJFKGV2YWxKUygidHlwZW9mIG15T2Jq
ZWN0LmR5bmFtaWNQcm9wZXJ0eSIpLCBzVW5kZWZpbmVkKTsKQEAgLTIwNDYsNiArMjA3Myw3IEBA
IHZvaWQgdHN0X1FPYmplY3RCcmlkZ2U6Om93bmVyc2hpcCgpCiAgICAgICAgICAgICBRV2ViRnJh
bWUqIGZyYW1lID0gcGFnZS5tYWluRnJhbWUoKTsKICAgICAgICAgICAgIGZyYW1lLT5hZGRUb0ph
dmFTY3JpcHRXaW5kb3dPYmplY3QoInRlc3QiLCBwdHIuZGF0YSgpLCBRV2ViRnJhbWU6OlNjcmlw
dE93bmVyc2hpcCk7CiAgICAgICAgIH0KKyAgICAgICAgZ2FyYmFnZUNvbGxlY3QoKTsKICAgICAg
ICAgUVZFUklGWSghcHRyKTsKICAgICB9CiAgICAgewpAQCAtMjA1Nyw2ICsyMDg1LDcgQEAgdm9p
ZCB0c3RfUU9iamVjdEJyaWRnZTo6b3duZXJzaGlwKCkKICAgICAgICAgICAgIFFXZWJGcmFtZSog
ZnJhbWUgPSBwYWdlLm1haW5GcmFtZSgpOwogICAgICAgICAgICAgZnJhbWUtPmFkZFRvSmF2YVNj
cmlwdFdpbmRvd09iamVjdCgidGVzdCIsIHB0ci5kYXRhKCksIFFXZWJGcmFtZTo6UXRPd25lcnNo
aXApOwogICAgICAgICB9CisgICAgICAgIGdhcmJhZ2VDb2xsZWN0KCk7CiAgICAgICAgIFFWRVJJ
RlkocHRyLmRhdGEoKSA9PSBiZWZvcmUpOwogICAgICAgICBkZWxldGUgcHRyLmRhdGEoKTsKICAg
ICB9CkBAIC0yMDgwLDYgKzIxMDksNyBAQCB2b2lkIHRzdF9RT2JqZWN0QnJpZGdlOjpvd25lcnNo
aXAoKQogICAgICAgICAgICAgUVdlYkZyYW1lKiBmcmFtZSA9IHBhZ2UubWFpbkZyYW1lKCk7CiAg
ICAgICAgICAgICBmcmFtZS0+YWRkVG9KYXZhU2NyaXB0V2luZG93T2JqZWN0KCJ0ZXN0IiwgcHRy
LmRhdGEoKSwgUVdlYkZyYW1lOjpBdXRvT3duZXJzaGlwKTsKICAgICAgICAgfQorICAgICAgICBn
YXJiYWdlQ29sbGVjdCgpOwogICAgICAgICAvLyBubyBwYXJlbnQsIHNvIGl0IHNob3VsZCBiZSBs
aWtlIFNjcmlwdE93bmVyc2hpcAogICAgICAgICBRVkVSSUZZKCFwdHIpOwogICAgIH0KQEAgLTIw
OTIsNiArMjEyMiw3IEBAIHZvaWQgdHN0X1FPYmplY3RCcmlkZ2U6Om93bmVyc2hpcCgpCiAgICAg
ICAgICAgICBRV2ViRnJhbWUqIGZyYW1lID0gcGFnZS5tYWluRnJhbWUoKTsKICAgICAgICAgICAg
IGZyYW1lLT5hZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoInRlc3QiLCBjaGlsZC5kYXRhKCks
IFFXZWJGcmFtZTo6QXV0b093bmVyc2hpcCk7CiAgICAgICAgIH0KKyAgICAgICAgZ2FyYmFnZUNv
bGxlY3QoKTsKICAgICAgICAgLy8gaGFzIHBhcmVudCwgc28gaXQgc2hvdWxkIGJlIGxpa2UgUXRP
d25lcnNoaXAKICAgICAgICAgUVZFUklGWShjaGlsZCk7CiAgICAgICAgIGRlbGV0ZSBwYXJlbnQ7
CkBAIC0yMjM0LDUgKzIyNjUsMTQgQEAgdm9pZCB0c3RfUU9iamVjdEJyaWRnZTo6c2NyaXB0YWJs
ZVBsdWdpbigpCiAgICAgUUNPTVBBUkUocmVzdWx0LnRvU3RyaW5nKCksIFFMYXRpbjFTdHJpbmco
IjQyIikpOwogfQogCit2b2lkIHRzdF9RT2JqZWN0QnJpZGdlOjpwcm9wZXJ0eUFuZFNsb3RXaXRo
U2FtZU5hbWUoKQoreworICAgIFFTdHJpbmcgdHlwZTsKKyAgICBRVmFyaWFudCByZXQgPSBldmFs
SlNWKCJteU9iamVjdC5wcm9wZXJ0eVdpdGhTYW1lU2xvdEdldHRlck5hbWUiLCB0eXBlKTsKKyAg
ICBRQ09NUEFSRSh0eXBlLCBzTnVtYmVyKTsKKyAgICBRQ09NUEFSRShyZXQudHlwZSgpLCBRVmFy
aWFudDo6RG91YmxlKTsKKyAgICBRQ09NUEFSRShyZXQudG9JbnQoKSwgNDIpOworfQorCiBRVEVT
VF9NQUlOKHRzdF9RT2JqZWN0QnJpZGdlKQogI2luY2x1ZGUgInRzdF9xb2JqZWN0YnJpZGdlLm1v
YyIK
</data>
<flag name="commit-queue"
          id="172615"
          type_id="3"
          status="-"
          setter="webkit-ews"
    />
          </attachment>
      

    </bug>

</bugzilla>