<?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>112336</bug_id>
          
          <creation_ts>2013-03-14 02:45:59 -0700</creation_ts>
          <short_desc>HTMLIdentifier uses 8-12 bytes when it only needs 4-8</short_desc>
          <delta_ts>2023-04-01 00:53:15 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>CONFIGURATION CHANGED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>111645</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          <cc>abarth</cc>
    
    <cc>annevk</cc>
    
    <cc>benjamin</cc>
    
    <cc>tonyg</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>855095</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2013-03-14 02:45:59 -0700</bug_when>
    <thetext>HTMLIdentifier uses 8-12 bytes when it only needs 4-8

http://trac.webkit.org/browser/trunk/Source/WebCore/html/parser/HTMLIdentifier.h#L80

    // FIXME: This could be a union.
    unsigned m_index;
    String m_string;

(I no longer believe that it needs to be a Union, but rather just a StringImpl* with one bit stolen -- perhaps even there is a PointerWithMask template class to help us with this?)

The one masked bit would tell you which mode it was in.  Either we could treat the &quot;known identifier&quot; mode as a StringImpl* to a const (non-reffed) AtomicStringImpl*, or we could use an index (like the current implementation does).

Using a StringImpl* for both the owned and non-owned case is nice because then the nameForIndex function completely disappears!

Basically we&apos;d just be implementing a static version of the AtomicString hash table, which held a known set of AtomicStrings and only exposed StringImpl* access to them.  (And magically acted like a String in the case where the character buffer in question did not match one of our known strings.)

We&apos;ve sorta implemented a &quot;ThreadPortableAtomicString&quot; of sorts. :)

Making this smaller will also make the maximum memory consumed during speculation smaller, which may affect bug 112335.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>855098</commentid>
    <comment_count>1</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2013-03-14 02:51:08 -0700</bug_when>
    <thetext>This sentence was confusing:
&gt; Either we could treat the &quot;known identifier&quot; mode as a StringImpl* to a const (non-reffed)
&gt; AtomicStringImpl*, or we could use an index (like the current implementation does).

I&apos;ve fully given up on the &quot;index&quot; based approach.  It shoudl always be a pointer to a StringImpl*, teh question is just if we own (ref) that StringImpl or not.  If it&apos;s a known identifier (AtomicStringImpl*) then we don&apos;t own it, and depend on something else to keep it alive (and in the AtomicStringTable on the main thread) forever.  If we own it, then it&apos;s just a plain old StringImpl which we need to manually ref/deref since we can&apos;t steal a bit and still use RefPtr or String. :)

This class would only ever provide String access to its storage from the main thread, but could provide const StringImpl* access on any thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>855302</commentid>
    <comment_count>2</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-03-14 10:33:04 -0700</bug_when>
    <thetext>&gt; I&apos;ve fully given up on the &quot;index&quot; based approach.  It shoudl always be a pointer to a StringImpl*, teh question is just if we own (ref) that StringImpl or not.  If it&apos;s a known identifier (AtomicStringImpl*) then we don&apos;t own it, and depend on something else to keep it alive (and in the AtomicStringTable on the main thread) forever.  If we own it, then it&apos;s just a plain old StringImpl which we need to manually ref/deref since we can&apos;t steal a bit and still use RefPtr or String. :)

I am unfamiliar with the ownership here.

Is it that if it is a AtomicStringImpl*, it must be a HTMLName, if not, it is a custom string?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>855376</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2013-03-14 11:48:22 -0700</bug_when>
    <thetext>I wasn&apos;t very clear, sorry.  I&apos;ll just code up an implementation and post it. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>855561</commentid>
    <comment_count>4</comment_count>
      <attachid>193200</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2013-03-14 16:34:52 -0700</bug_when>
    <thetext>Created attachment 193200
About what I had in mind</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>856183</commentid>
    <comment_count>5</comment_count>
      <attachid>193200</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2013-03-15 12:18:06 -0700</bug_when>
    <thetext>Comment on attachment 193200
About what I had in mind

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

&gt; Source/WebCore/html/parser/BackgroundHTMLParser.cpp:64
&gt; -static void checkThatTokensAreSafeToSendToAnotherThread(const CompactHTMLTokenStream* tokens)
&gt; +static void checkThatTokensAreSafeToSendToAnotherThread(CompactHTMLTokenStream* tokens)

Should we rename this function to make it clear that it has side-effects?  I presume those side effects are only relevant in debug.

&gt; Source/WebCore/html/parser/CompactHTMLToken.h:61
&gt; +    void markForTransferToMainThread();

Can you make this a DEBUG only function?

&gt; Source/WebCore/html/parser/HTMLIdentifier.cpp:71
&gt; +    const_cast&lt;StringImpl*&gt;(m_pointerWithFlags.ptr())-&gt;deref();

Woah.

&gt; Source/WebCore/html/parser/HTMLIdentifier.h:45
&gt; +// This is basically just a bitfield for a pointer.
&gt; +template &lt;typename T&gt;
&gt; +class PointerWithFlags {

This should probably be in WTF.

&gt; Source/WebCore/html/parser/HTMLIdentifier.h:56
&gt; +    bool flag1() const { return maskedValue(kFlag1Mask); }
&gt; +    void setFlag1(bool flag) { setMaskedValue(flag, kFlag1Mask); }
&gt; +
&gt; +    bool flag2() const { return maskedValue(kFlag2Mask); }
&gt; +    void setFlag2(bool flag) { setMaskedValue(flag, kFlag2Mask); }

Should these methods be protected?  Presumably the way to use this class is to subclass it and give these flags reasonable names.

&gt; Source/WebCore/html/parser/HTMLIdentifier.h:116
&gt; +#ifndef NDEBUG
&gt; +    bool isMarkedForTransferToMainThread() { return m_pointerWithFlags.flag2(); }
&gt; +#endif

If this is debug-only, why not introduce debug-only storage for this value?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1945929</commentid>
    <comment_count>6</comment_count>
    <who name="Anne van Kesteren">annevk</who>
    <bug_when>2023-04-01 00:53:15 -0700</bug_when>
    <thetext>This no longer exists.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>193200</attachid>
            <date>2013-03-14 16:34:52 -0700</date>
            <delta_ts>2013-03-15 12:18:06 -0700</delta_ts>
            <desc>About what I had in mind</desc>
            <filename>bug-112336-20130314163048.patch</filename>
            <type>text/plain</type>
            <size>20832</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQ1ODMyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYzg4N2M1NjZjZWQ5Njkw
NmIwYTE0NzY3ZDAwMzczYzdjOGQ4ODRmOC4uOTdhN2I4MWM5N2ZkNzAwYzEyMDJkYjQ4OTE3ZWU1
MWM2YTkzNmI4ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU1IEBACisyMDEzLTAzLTE0ICBFcmlj
IFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KKworICAgICAgICBIVE1MSWRlbnRpZmllciB1c2Vz
IDgtMTIgYnl0ZXMgd2hlbiBpdCBvbmx5IG5lZWRzIDQtOAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMzM2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIChPT1BTISkuCisKKyAgICAg
ICAgKiBodG1sL3BhcnNlci9BdG9taWNIVE1MVG9rZW4uaDoKKyAgICAgICAgKFdlYkNvcmU6OkF0
b21pY0hUTUxUb2tlbjo6QXRvbWljSFRNTFRva2VuKToKKyAgICAgICAgKiBodG1sL3BhcnNlci9C
YWNrZ3JvdW5kSFRNTFBhcnNlci5jcHA6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdl
YkNvcmU6OmNoZWNrVGhhdFRva2Vuc0FyZVNhZmVUb1NlbmRUb0Fub3RoZXJUaHJlYWQpOgorICAg
ICAgICAqIGh0bWwvcGFyc2VyL0NvbXBhY3RIVE1MVG9rZW4uY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGFjdEhUTUxUb2tlbjo6bWFya0ZvclRyYW5zZmVyVG9NYWluVGhyZWFkKToKKyAgICAg
ICAgKFdlYkNvcmUpOgorICAgICAgICAqIGh0bWwvcGFyc2VyL0NvbXBhY3RIVE1MVG9rZW4uaDoK
KyAgICAgICAgKENvbXBhY3RIVE1MVG9rZW4pOgorICAgICAgICAqIGh0bWwvcGFyc2VyL0hUTUxJ
ZGVudGlmaWVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SFRN
TElkZW50aWZpZXI6OmlzS25vd25TdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElkZW50
aWZpZXI6On5IVE1MSWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSWRlbnRpZmll
cjo6YXNNdXRhYmxlU3RyaW5nSW1wbCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSWRlbnRpZmll
cjo6bG9va3VwU3RhdGljU3RyaW5nSW1wbCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSWRlbnRp
Zmllcjo6YWRkTmFtZXMpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElkZW50aWZpZXI6OmluaXQp
OgorICAgICAgICAqIGh0bWwvcGFyc2VyL0hUTUxJZGVudGlmaWVyLmg6CisgICAgICAgIChQb2lu
dGVyV2l0aEZsYWdzKToKKyAgICAgICAgKFdlYkNvcmU6OlBvaW50ZXJXaXRoRmxhZ3M6OlBvaW50
ZXJXaXRoRmxhZ3MpOgorICAgICAgICAoV2ViQ29yZTo6UG9pbnRlcldpdGhGbGFnczo6cHRyKToK
KyAgICAgICAgKFdlYkNvcmU6OlBvaW50ZXJXaXRoRmxhZ3M6OnNldFB0cik6CisgICAgICAgIChX
ZWJDb3JlOjpQb2ludGVyV2l0aEZsYWdzOjpmbGFnMSk6CisgICAgICAgIChXZWJDb3JlOjpQb2lu
dGVyV2l0aEZsYWdzOjpzZXRGbGFnMSk6CisgICAgICAgIChXZWJDb3JlOjpQb2ludGVyV2l0aEZs
YWdzOjpmbGFnMik6CisgICAgICAgIChXZWJDb3JlOjpQb2ludGVyV2l0aEZsYWdzOjpzZXRGbGFn
Mik6CisgICAgICAgIChXZWJDb3JlOjpQb2ludGVyV2l0aEZsYWdzOjptYXNrZWRWYWx1ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpQb2ludGVyV2l0aEZsYWdzOjpzZXRNYXNrZWRWYWx1ZSk6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJZGVudGlmaWVyOjpIVE1MSWRl
bnRpZmllcik6CisgICAgICAgIChIVE1MSWRlbnRpZmllcik6CisgICAgICAgIChXZWJDb3JlOjpI
VE1MSWRlbnRpZmllcjo6YXNTdHJpbmdJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJZGVu
dGlmaWVyOjppc1N0YXRpYyk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSWRlbnRpZmllcjo6aXNT
YWZlVG9TZW5kVG9Bbm90aGVyVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJZGVudGlm
aWVyOjptYXJrRm9yVHJhbnNmZXJUb01haW5UaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6SFRN
TElkZW50aWZpZXI6OmlzTWFya2VkRm9yVHJhbnNmZXJUb01haW5UaHJlYWQpOgorICAgICAgICAo
V2ViQ29yZTo6SFRNTElkZW50aWZpZXI6OnNldFN0YXRpYyk6CisgICAgICAgIChXZWJDb3JlOjpI
VE1MSWRlbnRpZmllcjo6c2V0T3duZWRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElk
ZW50aWZpZXI6OnNldFN0YXRpY1N0cmluZyk6CisgICAgICAgICogaHRtbC9wYXJzZXIvSFRNTFBh
cnNlcklkaW9tcy5oOgorICAgICAgICAoV2ViQ29yZTo6dGhyZWFkU2FmZUhUTUxOYW1lc01hdGNo
KToKKwogMjAxMy0wMy0xNCAgWGFiaWVyIFJvZHJpZ3VleiBDYWx2YXIgIDxjYWx2YXJpc0BpZ2Fs
aWEuY29tPgogCiAgICAgICAgIFtHU3RyZWFtZXJdIHNpbXVsYXRlQXVkaW9JbnRlcnJ1cHRpb24g
bmVlZHMgdG8gYmUgZ3VhcmRlZCBieSBFTkFCTEUoVklERU8pIgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvaHRtbC9wYXJzZXIvQXRvbWljSFRNTFRva2VuLmggYi9Tb3VyY2UvV2ViQ29yZS9o
dG1sL3BhcnNlci9BdG9taWNIVE1MVG9rZW4uaAppbmRleCA0MTViMGQyNmM0MDQ4ZDRhNzI4MzNm
ODMwYzNiYzYzNjA5OTRlMzg1Li42ZWYwYzY1Nzk3N2FlMmM0NmQ4YTliMDkyOThmNTI3ZDQ3ZWUz
ZTg5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9BdG9taWNIVE1MVG9r
ZW4uaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9BdG9taWNIVE1MVG9rZW4uaApA
QCAtMTYzLDEwICsxNjMsMTAgQEAgcHVibGljOgogICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBIVE1MVG9rZW46OkRPQ1RZ
UEU6Ci0gICAgICAgICAgICBtX25hbWUgPSB0b2tlbi5kYXRhKCkuYXNTdHJpbmcoKTsKKyAgICAg
ICAgICAgIG1fbmFtZSA9IHRva2VuLmRhdGEoKS5hc011dGFibGVTdHJpbmdJbXBsKCk7CiAgICAg
ICAgICAgICBtX2RvY3R5cGVEYXRhID0gYWRvcHRQdHIobmV3IERvY3R5cGVEYXRhKCkpOwogICAg
ICAgICAgICAgbV9kb2N0eXBlRGF0YS0+bV9oYXNQdWJsaWNJZGVudGlmaWVyID0gdHJ1ZTsKLSAg
ICAgICAgICAgIGFwcGVuZChtX2RvY3R5cGVEYXRhLT5tX3B1YmxpY0lkZW50aWZpZXIsIHRva2Vu
LnB1YmxpY0lkZW50aWZpZXIoKS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgIGFwcGVuZChtX2Rv
Y3R5cGVEYXRhLT5tX3B1YmxpY0lkZW50aWZpZXIsIHRva2VuLnB1YmxpY0lkZW50aWZpZXIoKS5h
c011dGFibGVTdHJpbmdJbXBsKCkpOwogICAgICAgICAgICAgbV9kb2N0eXBlRGF0YS0+bV9oYXNT
eXN0ZW1JZGVudGlmaWVyID0gdHJ1ZTsKICAgICAgICAgICAgIGFwcGVuZChtX2RvY3R5cGVEYXRh
LT5tX3N5c3RlbUlkZW50aWZpZXIsIHRva2VuLnN5c3RlbUlkZW50aWZpZXIoKSk7CiAgICAgICAg
ICAgICBtX2RvY3R5cGVEYXRhLT5tX2ZvcmNlUXVpcmtzID0gdG9rZW4uZG9jdHlwZUZvcmNlc1F1
aXJrcygpOwpAQCAtMTc2LDcgKzE3Niw3IEBAIHB1YmxpYzoKICAgICAgICAgY2FzZSBIVE1MVG9r
ZW46OlN0YXJ0VGFnOgogICAgICAgICAgICAgbV9hdHRyaWJ1dGVzLnJlc2VydmVJbml0aWFsQ2Fw
YWNpdHkodG9rZW4uYXR0cmlidXRlcygpLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKFZlY3Rv
cjxDb21wYWN0SFRNTFRva2VuOjpBdHRyaWJ1dGU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHRva2Vu
LmF0dHJpYnV0ZXMoKS5iZWdpbigpOyBpdCAhPSB0b2tlbi5hdHRyaWJ1dGVzKCkuZW5kKCk7ICsr
aXQpIHsKLSAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIG5hbWUobnVsbEF0b20sIGl0LT5u
YW1lLmFzU3RyaW5nKCksIG51bGxBdG9tKTsKKyAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1l
IG5hbWUobnVsbEF0b20sIGl0LT5uYW1lLmFzTXV0YWJsZVN0cmluZ0ltcGwoKSwgbnVsbEF0b20p
OwogICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIE5eMiBmb3IgdGhlIG51bWJlciBv
ZiBhdHRyaWJ1dGVzLgogICAgICAgICAgICAgICAgIGlmICghZmluZEF0dHJpYnV0ZUluVmVjdG9y
KG1fYXR0cmlidXRlcywgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgIG1fYXR0cmlidXRlcy5h
cHBlbmQoQXR0cmlidXRlKG5hbWUsIGl0LT52YWx1ZSkpOwpAQCAtMTg0LDIxICsxODQsMjUgQEAg
cHVibGljOgogICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIQogICAgICAgICBjYXNlIEhUTUxU
b2tlbjo6RW5kVGFnOgogICAgICAgICAgICAgbV9zZWxmQ2xvc2luZyA9IHRva2VuLnNlbGZDbG9z
aW5nKCk7Ci0gICAgICAgICAgICBtX25hbWUgPSB0b2tlbi5kYXRhKCkuYXNTdHJpbmcoKTsKKyAg
ICAgICAgICAgIG1fbmFtZSA9IHRva2VuLmRhdGEoKS5hc011dGFibGVTdHJpbmdJbXBsKCk7CiAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBIVE1MVG9rZW46OkNvbW1lbnQ6Ci0gICAg
ICAgICAgICBtX2RhdGEgPSB0b2tlbi5kYXRhKCkuYXNTdHJpbmcoKTsKKyAgICAgICAgICAgIG1f
ZGF0YSA9IHRva2VuLmRhdGEoKS5hc011dGFibGVTdHJpbmdJbXBsKCk7CiAgICAgICAgICAgICBi
cmVhazsKICAgICAgICAgY2FzZSBIVE1MVG9rZW46OkNoYXJhY3RlcjogewotICAgICAgICAgICAg
Y29uc3QgU3RyaW5nJiBzdHJpbmcgPSB0b2tlbi5kYXRhKCkuYXNTdHJpbmcoKTsKLSAgICAgICAg
ICAgIG1fZXh0ZXJuYWxDaGFyYWN0ZXJzID0gc3RyaW5nLmNoYXJhY3RlcnMoKTsKLSAgICAgICAg
ICAgIG1fZXh0ZXJuYWxDaGFyYWN0ZXJzTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOworICAgICAg
ICAgICAgLy8gRklYTUU6IEhUTUxDb21wYWN0VG9rZW4gaGFzIGFscmVhZHkgYWxsb2NhdGVkIGEg
U3RyaW5nSW1wbCBmb3IgdXMKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZCB0YWtlIG93bmVyc2hp
cCBvZiBpdCBoZXJlIHNvIHRoZSBIVE1MVHJlZUJ1aWxkZXIgZG9lcworICAgICAgICAgICAgLy8g
bm90IG5lZWQgdG8gY29weSB0aGUgYnl0ZXMhCisgICAgICAgICAgICAvLyBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTExNzg5CisgICAgICAgICAgICBjb25zdCBTdHJp
bmdJbXBsKiBzdHJpbmdJbXBsID0gdG9rZW4uZGF0YSgpLmFzU3RyaW5nSW1wbCgpOworICAgICAg
ICAgICAgbV9leHRlcm5hbENoYXJhY3RlcnMgPSBzdHJpbmdJbXBsLT5jaGFyYWN0ZXJzKCk7Cisg
ICAgICAgICAgICBtX2V4dGVybmFsQ2hhcmFjdGVyc0xlbmd0aCA9IHN0cmluZ0ltcGwtPmxlbmd0
aCgpOwogICAgICAgICAgICAgbV9pc0FsbDhCaXREYXRhID0gdG9rZW4uaXNBbGw4Qml0RGF0YSgp
OwogICAgICAgICAgICAgLy8gRklYTUU6IFdlIHdvdWxkIGxpa2UgYSBzdHJvbmdlciBBU1NFUlQg
aGVyZToKLSAgICAgICAgICAgIC8vIEFTU0VSVChzdHJpbmcuaXM4Qml0KCkgPT0gdG9rZW4uaXNB
bGw4Qml0RGF0YSgpKTsKKyAgICAgICAgICAgIC8vIEFTU0VSVChzdHJpbmdJbXBsLT5pczhCaXQo
KSA9PSB0b2tlbi5pc0FsbDhCaXREYXRhKCkpOwogICAgICAgICAgICAgLy8gYnV0IGN1cnJlbnRs
eSB0aGF0IGZpcmVzLCBsaWtlbHkgZHVlIHRvIGJ1Z3MgaW4gSFRNTFRva2VuaXplcgogICAgICAg
ICAgICAgLy8gbm90IHNldHRpbmcgaXNBbGw4Qml0RGF0YSBpbiBhbGwgdGhlIHRpbWVzIGl0IGNv
dWxkLgotICAgICAgICAgICAgQVNTRVJUKCF0b2tlbi5pc0FsbDhCaXREYXRhKCkgfHwgc3RyaW5n
LmlzOEJpdCgpKTsKKyAgICAgICAgICAgIEFTU0VSVCghdG9rZW4uaXNBbGw4Qml0RGF0YSgpIHx8
IHN0cmluZ0ltcGwtPmlzOEJpdCgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAg
ICAgICAgIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0JhY2tncm91
bmRIVE1MUGFyc2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0JhY2tncm91bmRI
VE1MUGFyc2VyLmNwcAppbmRleCA4ZDYyOWQxYzU3OWRmMjkzMTM1YTIyMjU4YzMxZDI0OTZiNTQ2
ZmVmLi4yZDgyZjgxNzJlYjA0ZWMwODE0MTU5NzhmYzc1Njc0NTEzNjYwOTM3IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9CYWNrZ3JvdW5kSFRNTFBhcnNlci5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvQmFja2dyb3VuZEhUTUxQYXJzZXIuY3BwCkBA
IC00NSw3ICs0NSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIC8vIFRoaXMgaXMgYSB3YXN0ZSBv
ZiBtZW1vcnkgKGFuZCBwb3RlbnRpYWxseSB0aW1lIGlmIHRoZSBzcGVjdWxhdGlvbiBmYWlscyku
CiAvLyBTbyB3ZSBsaW1pdCBvdXIgb3V0c3RhbmRpbmcgc3BlY3VsYXRpb25zIGFyYml0cmFyaWx5
IHRvIDEwLgogLy8gT3VyIG1heGltYWwgbWVtb3J5IHNwZW50IHNwZWN1bGF0aW5nIHdpbGwgYmUg
YXBwcm94aW1hdGVseToKLS8vIG91dHN0YW5kaW5nQ2hlY2twb2ludExpbWl0ICogcGVuZGluZ1Rv
a2VuTGltaXQgKiBzaXplb2YoQ29tcGFjdFRva2VuKQorLy8gb3V0c3RhbmRpbmdDaGVja3BvaW50
TGltaXQgKiBwZW5kaW5nVG9rZW5MaW1pdCAqIHNpemVvZihDb21wYWN0SFRNTFRva2VuKQogLy8g
V2UgdXNlIGEgc2VwYXJhdGUgbG93IGFuZCBoaWdoIHdhdGVyIG1hcmsgdG8gYXZvaWQgY29uc3Rh
bnRseSB0b3BwaW5nCiAvLyBvZmYgdGhlIG1haW4gdGhyZWFkJ3MgdG9rZW4gYnVmZmVyLgogLy8g
QXQgdGltZSBvZiB3cml0aW5nLCB0aGlzIGlzIDEwICogMTAwMCAqIDI4IGJ5dGVzID0gYXBwb3gg
Mjgwa2Igb2YgbWVtb3J5LgpAQCAtNjEsMTAgKzYxLDEzIEBAIHVzaW5nIG5hbWVzcGFjZSBIVE1M
TmFtZXM7CiAKICNpZm5kZWYgTkRFQlVHCiAKLXN0YXRpYyB2b2lkIGNoZWNrVGhhdFRva2Vuc0Fy
ZVNhZmVUb1NlbmRUb0Fub3RoZXJUaHJlYWQoY29uc3QgQ29tcGFjdEhUTUxUb2tlblN0cmVhbSog
dG9rZW5zKQorc3RhdGljIHZvaWQgY2hlY2tUaGF0VG9rZW5zQXJlU2FmZVRvU2VuZFRvQW5vdGhl
clRocmVhZChDb21wYWN0SFRNTFRva2VuU3RyZWFtKiB0b2tlbnMpCiB7Ci0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCB0b2tlbnMtPnNpemUoKTsgKytpKQotICAgICAgICBBU1NFUlQodG9rZW5z
LT5hdChpKS5pc1NhZmVUb1NlbmRUb0Fub3RoZXJUaHJlYWQoKSk7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCB0b2tlbnMtPnNpemUoKTsgKytpKSB7CisgICAgICAgIENvbXBhY3RIVE1MVG9r
ZW4mIHRva2VuID0gdG9rZW5zLT5hdChpKTsKKyAgICAgICAgQVNTRVJUKHRva2VuLmlzU2FmZVRv
U2VuZFRvQW5vdGhlclRocmVhZCgpKTsKKyAgICAgICAgdG9rZW4ubWFya0ZvclRyYW5zZmVyVG9N
YWluVGhyZWFkKCk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBjaGVja1RoYXRQcmVsb2Fkc0Fy
ZVNhZmVUb1NlbmRUb0Fub3RoZXJUaHJlYWQoY29uc3QgUHJlbG9hZFJlcXVlc3RTdHJlYW0mIHBy
ZWxvYWRzKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvQ29tcGFjdEhU
TUxUb2tlbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9Db21wYWN0SFRNTFRva2Vu
LmNwcAppbmRleCA3NmRkYzZiNmM3NmUzYTU1MGM0NmVjZWQwNjkwYzkwOGEyNTNkN2Q5Li4zY2Jh
MjljM2ZmNzI1NGEzNTk3Mzc5MzkxYjdjYWIyZDYzYjBiZjE2IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9odG1sL3BhcnNlci9Db21wYWN0SFRNTFRva2VuLmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9odG1sL3BhcnNlci9Db21wYWN0SFRNTFRva2VuLmNwcApAQCAtMTA1LDYgKzEwNSwxMyBA
QCBib29sIENvbXBhY3RIVE1MVG9rZW46OmlzU2FmZVRvU2VuZFRvQW5vdGhlclRocmVhZCgpIGNv
bnN0CiAgICAgcmV0dXJuIG1fZGF0YS5pc1NhZmVUb1NlbmRUb0Fub3RoZXJUaHJlYWQoKTsKIH0K
IAordm9pZCBDb21wYWN0SFRNTFRva2VuOjptYXJrRm9yVHJhbnNmZXJUb01haW5UaHJlYWQoKQor
eworICAgIGZvciAoVmVjdG9yPEF0dHJpYnV0ZT46Oml0ZXJhdG9yIGl0ID0gbV9hdHRyaWJ1dGVz
LmJlZ2luKCk7IGl0ICE9IG1fYXR0cmlidXRlcy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPm5h
bWUubWFya0ZvclRyYW5zZmVyVG9NYWluVGhyZWFkKCk7CisgICAgcmV0dXJuIG1fZGF0YS5tYXJr
Rm9yVHJhbnNmZXJUb01haW5UaHJlYWQoKTsKK30KKwogfQogCiAjZW5kaWYgLy8gRU5BQkxFKFRI
UkVBREVEX0hUTUxfUEFSU0VSKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9wYXJz
ZXIvQ29tcGFjdEhUTUxUb2tlbi5oIGIvU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvQ29tcGFj
dEhUTUxUb2tlbi5oCmluZGV4IGZmYTRhZTQzY2QxZjNlYmYwZTNlYmMzZTg5ZWE0OTRmNjJmNTMz
MDkuLjg4ZmM2NTI0MTVlNzNjMjUzNGRiYzE3M2E5ZGNlOTA3MjdmY2Y4YzQgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0NvbXBhY3RIVE1MVG9rZW4uaAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL3BhcnNlci9Db21wYWN0SFRNTFRva2VuLmgKQEAgLTU4LDYgKzU4LDcg
QEAgcHVibGljOgogICAgIENvbXBhY3RIVE1MVG9rZW4oY29uc3QgSFRNTFRva2VuKiwgY29uc3Qg
VGV4dFBvc2l0aW9uJik7CiAKICAgICBib29sIGlzU2FmZVRvU2VuZFRvQW5vdGhlclRocmVhZCgp
IGNvbnN0OworICAgIHZvaWQgbWFya0ZvclRyYW5zZmVyVG9NYWluVGhyZWFkKCk7CiAKICAgICBI
VE1MVG9rZW46OlR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxUb2tl
bjo6VHlwZT4obV90eXBlKTsgfQogICAgIGNvbnN0IEhUTUxJZGVudGlmaWVyJiBkYXRhKCkgY29u
c3QgeyByZXR1cm4gbV9kYXRhOyB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL3Bh
cnNlci9IVE1MSWRlbnRpZmllci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9IVE1M
SWRlbnRpZmllci5jcHAKaW5kZXggN2E4ZWM2ZDA3NDI5NzNmZWFjMGZhNzZhMTlkMWZmZTlmNmM3
NTUyZC4uNDYyY2IwMDIwMjIyYTczODAyNmJjM2ZlY2MwMDZiYmY2NDk0YjE3MyAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvSFRNTElkZW50aWZpZXIuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0hUTUxJZGVudGlmaWVyLmNwcApAQCAtMzgsOCArMzgs
OSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAK
LXR5cGVkZWYgc3RkOjpwYWlyPHVuc2lnbmVkLCBTdHJpbmdJbXBsKj4gSWRlbnRpZmllckVudHJ5
OwotdHlwZWRlZiBIYXNoTWFwPHVuc2lnbmVkLCBJZGVudGlmaWVyRW50cnksIEFscmVhZHlIYXNo
ZWQ+IElkZW50aWZpZXJUYWJsZTsKKy8vIFRoaXMgZXNzZW50aWFsbHkgZW5kcyB1cCBhcyBhIHJl
YWQtb25seSBBdG9taWNTdHJpbmcgdGFibGUgZm9yIHRoZQorLy8ga25vd24gSFRNTE5hbWVzIHN0
cmluZ3MuCit0eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIGNvbnN0IFN0cmluZ0ltcGwqLCBBbHJl
YWR5SGFzaGVkPiBJZGVudGlmaWVyVGFibGU7CiAKIHVuc2lnbmVkIEhUTUxJZGVudGlmaWVyOjpt
YXhOYW1lTGVuZ3RoID0gMDsKIApAQCAtNTEsMTggKzUyLDQxIEBAIHN0YXRpYyBJZGVudGlmaWVy
VGFibGUmIGlkZW50aWZpZXJUYWJsZSgpCiB9CiAKICNpZm5kZWYgTkRFQlVHCi1ib29sIEhUTUxJ
ZGVudGlmaWVyOjpoYXNJbmRleChjb25zdCBTdHJpbmdJbXBsKiBzdHJpbmcpCitib29sIEhUTUxJ
ZGVudGlmaWVyOjppc0tub3duU3RyaW5nKGNvbnN0IFN0cmluZ0ltcGwqIHN0cmluZykKIHsKLSAg
ICBjb25zdCBJZGVudGlmaWVyVGFibGUmIHRhYmxlID0gaWRlbnRpZmllclRhYmxlKCk7Ci0gICAg
cmV0dXJuIHRhYmxlLmNvbnRhaW5zKHN0cmluZy0+aGFzaCgpKTsKKyAgICByZXR1cm4gaWRlbnRp
ZmllclRhYmxlKCkuY29udGFpbnMoc3RyaW5nLT5oYXNoKCkpOwogfQogI2VuZGlmCiAKLXVuc2ln
bmVkIEhUTUxJZGVudGlmaWVyOjpmaW5kSW5kZXgoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVu
c2lnbmVkIGxlbmd0aCkKK0hUTUxJZGVudGlmaWVyOjp+SFRNTElkZW50aWZpZXIoKQoreworICAg
IGlmIChpc1N0YXRpYygpKQorICAgICAgICByZXR1cm47CisgICAgLy8gT3RoZXJ3aXNlIHdlIGNy
ZWF0ZWQgdGhlIFN0cmluZ0ltcGwgYW5kIG5lZWQgdG8gcmVsZWFzZSBvdXIgcmVmLgorICAgIC8v
IFdlJ3JlIG5vdCB1c2luZyBhc011dGFibGVTdHJpbmdJbXBsIGhlcmUsIGFzIHRoZSBkZXN0cnVj
dG9yIGlzIGEKKyAgICAvLyBzcGVjaWFsIGNhc2UuIFVudGlsIHdlJ3ZlIGJlZW4gbWFya2VkIGFz
IHJlYWR5IGZvciB0aHJlYWQgdHJhbnNmZXIKKyAgICAvLyBpdCdzIE9LIHRvIGRlcmVmIG91ciBz
dHJpbmcuIE9uY2Ugd2UndmUgYmVlbiBoYW5kZWQgdG8gdGhlIG1haW4KKyAgICAvLyB0aHJlYWQg
aXQgaXMgYW4gZXJyb3IgdG8gZGVyZWYgb3VyIHN0cmluZyBvdXRzaWRlIHRoZSBtYWluIHRocmVh
ZCEKKyAgICBBU1NFUlQoIWlzTWFya2VkRm9yVHJhbnNmZXJUb01haW5UaHJlYWQoKSB8fCBpc01h
aW5UaHJlYWQoKSk7CisgICAgY29uc3RfY2FzdDxTdHJpbmdJbXBsKj4obV9wb2ludGVyV2l0aEZs
YWdzLnB0cigpKS0+ZGVyZWYoKTsKK30KKworU3RyaW5nSW1wbCogSFRNTElkZW50aWZpZXI6OmFz
TXV0YWJsZVN0cmluZ0ltcGwoKSBjb25zdAoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisgICAgLy8gQWx0aG91Z2ggaXQgY291bGQgYmUgc2FmZSB0byByZWYgb3duZWQgc3RyaW5nIGlt
cGxzIG9uIGFueSB0aHJlYWQKKyAgICAvLyBvbmNlIHRoZXkncmUgcmVmZmVkIG9uIG9uZSB0aHJl
YWQsIGl0cyBvbmx5IHNhZmUgdG8gcmVmL2RlcmVmCisgICAgLy8gdGhlbSBmcm9tIHRoYXQgdGhy
ZWFkLiBTbyB3ZSBjcmVhdGUgYW5kIHJlZiB0aGVtIG9uY2UgZHVyaW5nCisgICAgLy8gaW5pdGlh
bGl6YXRpb24gYW5kIHRoZW4gb25seSByZWYvZGVyZWYgdGhlbSBmdXJ0aGVyIGZyb20gdGhlCisg
ICAgLy8gbWFpbiB0aHJlYWQuCisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U3RyaW5nSW1wbCo+KG1f
cG9pbnRlcldpdGhGbGFncy5wdHIoKSk7Cit9CisKK2NvbnN0IFN0cmluZ0ltcGwqIEhUTUxJZGVu
dGlmaWVyOjpsb29rdXBTdGF0aWNTdHJpbmdJbXBsKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1
bnNpZ25lZCBsZW5ndGgpCiB7CiAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB0cnkgaGFzaGluZyBp
ZiB3ZSBrbm93IHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcuCiAgICAgaWYgKGxlbmd0aCA+IG1heE5h
bWVMZW5ndGgpCi0gICAgICAgIHJldHVybiBpbnZhbGlkSW5kZXg7CisgICAgICAgIHJldHVybiAw
OwogICAgIC8vIGNvbXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzIGlzIHRoZSBmdW5jdGlvbiBTdHJp
bmdJbXBsOjpoYXNoKCkgdXNlcy4KICAgICB1bnNpZ25lZCBoYXNoID0gU3RyaW5nSGFzaGVyOjpj
b21wdXRlSGFzaEFuZE1hc2tUb3A4Qml0cyhjaGFyYWN0ZXJzLCBsZW5ndGgpOwogICAgIGNvbnN0
IElkZW50aWZpZXJUYWJsZSYgdGFibGUgPSBpZGVudGlmaWVyVGFibGUoKTsKQEAgLTcwLDY2ICs5
NCwyNSBAQCB1bnNpZ25lZCBIVE1MSWRlbnRpZmllcjo6ZmluZEluZGV4KGNvbnN0IFVDaGFyKiBj
aGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCiAKICAgICBJZGVudGlmaWVyVGFibGU6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gdGFibGUuZmluZChoYXNoKTsKICAgICBpZiAoaXQgPT0gdGFibGUuZW5k
KCkpCi0gICAgICAgIHJldHVybiBpbnZhbGlkSW5kZXg7Ci0gICAgcmV0dXJuIGl0LT52YWx1ZS5m
aXJzdDsKLX0KLQotY29uc3QgdW5zaWduZWQga0hUTUxOYW1lc0luZGV4T2Zmc2V0ID0gMDsKLWNv
bnN0IHVuc2lnbmVkIGtIVE1MQXR0cnNJbmRleE9mZnNldCA9IDEwMDA7Ci1DT01QSUxFX0FTU0VS
VChrSFRNTEF0dHJzSW5kZXhPZmZzZXQgPiBIVE1MVGFnc0NvdW50LCBrSFRNTEF0dHJzSW5kZXhP
ZmZzZXRfc2hvdWxkX2JlX2xhcmdlcl90aGFuX0hUTUxUYWdzQ291bnQpOwotCi1zdGF0aWMgY29u
c3QgU3RyaW5nJiBuYW1lRm9ySW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0gICAgdW5zaWduZWQg
YWRqdXN0ZWRJbmRleDsKLSAgICBRdWFsaWZpZWROYW1lKiogbmFtZXM7Ci0gICAgaWYgKGluZGV4
IDwga0hUTUxBdHRyc0luZGV4T2Zmc2V0KSB7Ci0gICAgICAgIEFTU0VSVChpbmRleCA8IGtIVE1M
TmFtZXNJbmRleE9mZnNldCArIEhUTUxUYWdzQ291bnQpOwotICAgICAgICBhZGp1c3RlZEluZGV4
ID0gaW5kZXggLSBrSFRNTE5hbWVzSW5kZXhPZmZzZXQ7Ci0gICAgICAgIG5hbWVzID0gZ2V0SFRN
TFRhZ3MoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlQoaW5kZXggPCBrSFRNTEF0dHJz
SW5kZXhPZmZzZXQgKyBIVE1MQXR0cnNDb3VudCk7Ci0gICAgICAgIGFkanVzdGVkSW5kZXggPSBp
bmRleCAtIGtIVE1MQXR0cnNJbmRleE9mZnNldDsKLSAgICAgICAgbmFtZXMgPSBnZXRIVE1MQXR0
cnMoKTsKLSAgICB9Ci0gICAgLy8gSFRNTEF0dHJzIGFuZCBIVE1MTmFtZXMgbWF5IGhhdmUgY29s
bGlzaW9ucywgYnV0Ci0gICAgLy8gd2Ugc2hvdWxkbid0IGNhcmUgd2hpY2ggd2UgZW5kZWQgdXAg
c3RvcmluZywgc2luY2UgdGhlaXIKLSAgICAvLyBjb21wb25lbnRzIGFyZSBhbGwgQXRvbWljU3Ry
aW5ncyBhbmQgc2hvdWxkIHVzZSB0aGUgc2FtZQotICAgIC8vIHVuZGVybHlpbmcgU3RyaW5nSW1w
bCouCi0gICAgcmV0dXJuIG5hbWVzW2FkanVzdGVkSW5kZXhdLT5sb2NhbE5hbWUoKS5zdHJpbmco
KTsKLX0KLQotY29uc3QgU3RyaW5nJiBIVE1MSWRlbnRpZmllcjo6YXNTdHJpbmcoKSBjb25zdAot
ewotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgaWYgKG1faW5kZXggIT0gaW52YWxp
ZEluZGV4KQotICAgICAgICByZXR1cm4gbmFtZUZvckluZGV4KG1faW5kZXgpOwotICAgIHJldHVy
biBtX3N0cmluZzsKLX0KLQotY29uc3QgU3RyaW5nSW1wbCogSFRNTElkZW50aWZpZXI6OmFzU3Ry
aW5nSW1wbCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1faW5kZXggIT0gaW52YWxpZEluZGV4KQotICAg
ICAgICByZXR1cm4gbmFtZUZvckluZGV4KG1faW5kZXgpLmltcGwoKTsKLSAgICByZXR1cm4gbV9z
dHJpbmcuaW1wbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gaXQtPnZhbHVlOwog
fQogCi12b2lkIEhUTUxJZGVudGlmaWVyOjphZGROYW1lcyhRdWFsaWZpZWROYW1lKiogbmFtZXMs
IHVuc2lnbmVkIG5hbWVzQ291bnQsIHVuc2lnbmVkIGluZGV4T2Zmc2V0KQordm9pZCBIVE1MSWRl
bnRpZmllcjo6YWRkTmFtZXMoUXVhbGlmaWVkTmFtZSoqIG5hbWVzLCB1bnNpZ25lZCBuYW1lc0Nv
dW50KQogewogICAgIElkZW50aWZpZXJUYWJsZSYgdGFibGUgPSBpZGVudGlmaWVyVGFibGUoKTsK
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmFtZXNDb3VudDsgKytpKSB7CiAgICAgICAg
IFN0cmluZ0ltcGwqIG5hbWUgPSBuYW1lc1tpXS0+bG9jYWxOYW1lKCkuaW1wbCgpOwogICAgICAg
ICB1bnNpZ25lZCBoYXNoID0gbmFtZS0+aGFzaCgpOwotICAgICAgICB1bnNpZ25lZCBpbmRleCA9
IGkgKyBpbmRleE9mZnNldDsKLSAgICAgICAgSWRlbnRpZmllckVudHJ5IGVudHJ5KGluZGV4LCBu
YW1lKTsKLSAgICAgICAgSWRlbnRpZmllclRhYmxlOjpBZGRSZXN1bHQgYWRkUmVzdWx0ID0gdGFi
bGUuYWRkKGhhc2gsIGVudHJ5KTsKKyAgICAgICAgSWRlbnRpZmllclRhYmxlOjpBZGRSZXN1bHQg
YWRkUmVzdWx0ID0gdGFibGUuYWRkKGhhc2gsIG5hbWUpOwogICAgICAgICBtYXhOYW1lTGVuZ3Ro
ID0gc3RkOjptYXgobWF4TmFtZUxlbmd0aCwgbmFtZS0+bGVuZ3RoKCkpOwogICAgICAgICAvLyBF
bnN1cmUgd2UncmUgdXNpbmcgdGhlIHNhbWUgaGFzaGluZyBhbGdvcml0aG0gdG8gZ2V0IGFuZCBz
ZXQuCi0gICAgICAgIEFTU0VSVF9VTlVTRUQoYWRkUmVzdWx0LCAhYWRkUmVzdWx0LmlzTmV3RW50
cnkgfHwgSFRNTElkZW50aWZpZXI6OmZpbmRJbmRleChuYW1lLT5jaGFyYWN0ZXJzKCksIG5hbWUt
Pmxlbmd0aCgpKSA9PSBpbmRleCk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQoYWRkUmVzdWx0LCAh
YWRkUmVzdWx0LmlzTmV3RW50cnkgfHwgSFRNTElkZW50aWZpZXI6Omxvb2t1cFN0YXRpY1N0cmlu
Z0ltcGwobmFtZS0+Y2hhcmFjdGVycygpLCBuYW1lLT5sZW5ndGgoKSkgPT0gbmFtZSk7CiAgICAg
ICAgIC8vIFdlIGV4cGVjdCBzb21lIGhhc2ggY29sbGlzaW9ucywgYnV0IG9ubHkgZm9yIGlkZW50
aWNhbCBzdHJpbmdzLgogICAgICAgICAvLyBTaW5jZSBhbGwgb2YgdGhlc2UgbmFtZXMgYXJlIEF0
b21pY1N0cmluZ3MgcG9pbnRlcnMgc2hvdWxkIGJlIGVxdWFsLgogICAgICAgICAvLyBOb3RlOiBJ
ZiB5b3UgaGl0IHRoaXMgQVNTRVJULCB0aGVuIHdlIGhhZCBhIGhhc2ggY29sbGlzaW9uIGFtb25n
CiAgICAgICAgIC8vIEhUTUxOYW1lcyBzdHJpbmdzLCBhbmQgd2UgbmVlZCB0byByZS1kZXNpZ24g
aG93IHdlIHVzZSB0aGlzIGhhc2ghCi0gICAgICAgIEFTU0VSVF9VTlVTRUQoYWRkUmVzdWx0LCAh
YWRkUmVzdWx0LmlzTmV3RW50cnkgfHwgbmFtZSA9PSBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVl
LnNlY29uZCk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQoYWRkUmVzdWx0LCAhYWRkUmVzdWx0Lmlz
TmV3RW50cnkgfHwgbmFtZSA9PSBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVlKTsKICAgICB9CiB9
CiAKQEAgLTE0Miw4ICsxMjUsOCBAQCB2b2lkIEhUTUxJZGVudGlmaWVyOjppbml0KCkKICAgICBp
c0luaXRpYWxpemVkID0gdHJ1ZTsKIAogICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYXRvbWl6ZSBz
bWFsbCB3aGl0ZXNwYWNlIChcbiwgXG5cbiwgZXRjLikKLSAgICBhZGROYW1lcyhnZXRIVE1MVGFn
cygpLCBIVE1MVGFnc0NvdW50LCBrSFRNTE5hbWVzSW5kZXhPZmZzZXQpOwotICAgIGFkZE5hbWVz
KGdldEhUTUxBdHRycygpLCBIVE1MQXR0cnNDb3VudCwga0hUTUxBdHRyc0luZGV4T2Zmc2V0KTsK
KyAgICBhZGROYW1lcyhnZXRIVE1MVGFncygpLCBIVE1MVGFnc0NvdW50KTsKKyAgICBhZGROYW1l
cyhnZXRIVE1MQXR0cnMoKSwgSFRNTEF0dHJzQ291bnQpOwogfQogCiB9CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9IVE1MSWRlbnRpZmllci5oIGIvU291cmNlL1dlYkNv
cmUvaHRtbC9wYXJzZXIvSFRNTElkZW50aWZpZXIuaAppbmRleCA3MjFmNzQ3NGJmNTQ2ZjM0NzNl
MzI1MjM0NDk4Y2QxZTI5Nzk2MDZkLi5hZTM5NDM3YzhiNGI4ODZjZjgxNGNiNzgwODExYjkzOTRm
MzUyNTM0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9IVE1MSWRlbnRp
Zmllci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0hUTUxJZGVudGlmaWVyLmgK
QEAgLTQwLDQ2ICs0MCwxMDAgQEAgZW51bSBDaGFyYWN0ZXJXaWR0aCB7CiAgICAgRm9yY2UxNkJp
dAogfTsKIAorLy8gVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIGJpdGZpZWxkIGZvciBhIHBvaW50
ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBvaW50ZXJXaXRoRmxhZ3MgeworcHVi
bGljOgorICAgIFBvaW50ZXJXaXRoRmxhZ3MoKSA6IG1fc3RvcmFnZSgwKSB7IH0KKworICAgIFQq
IHB0cigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KG1hc2tlZFZhbHVlKGtQ
b2ludGVyTWFzaykpOyB9CisgICAgdm9pZCBzZXRQdHIoVCogcHRyKSB7IHNldE1hc2tlZFZhbHVl
KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwdHIpLCBrUG9pbnRlck1hc2spOyB9CisKKyAg
ICBib29sIGZsYWcxKCkgY29uc3QgeyByZXR1cm4gbWFza2VkVmFsdWUoa0ZsYWcxTWFzayk7IH0K
KyAgICB2b2lkIHNldEZsYWcxKGJvb2wgZmxhZykgeyBzZXRNYXNrZWRWYWx1ZShmbGFnLCBrRmxh
ZzFNYXNrKTsgfQorCisgICAgYm9vbCBmbGFnMigpIGNvbnN0IHsgcmV0dXJuIG1hc2tlZFZhbHVl
KGtGbGFnMk1hc2spOyB9CisgICAgdm9pZCBzZXRGbGFnMihib29sIGZsYWcpIHsgc2V0TWFza2Vk
VmFsdWUoZmxhZywga0ZsYWcyTWFzayk7IH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGNvdWxk
IGJlIGV4dGVuZGVkIHRvIHN1cHBvcnQgYSB0aGlyZCBmbGFnIGFzIG1vc3QKKyAgICAvLyBzeXN0
ZW1zIGFsaWduIHBvaW50ZXJzIHRvIDggYnl0ZXMsIHdoaWNoIG1lYW5zIHdlIDMgYml0cworICAg
IC8vIHdlIGNvdWxkIHVzZSBmb3IgZmxhZ3MuCisgICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBr
RmxhZzFNYXNrID0gMHgxOworICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3Qga0ZsYWcyTWFzayA9
IDB4MjsKKyAgICBzdGF0aWMgY29uc3QgdWludHB0cl90IGtQb2ludGVyTWFzayA9IHN0YXRpY19j
YXN0PHVpbnRwdHJfdD4oLTEpIDw8IDI7CisKKyAgICB1aW50cHRyX3QgbWFza2VkVmFsdWUodWlu
dHB0cl90IG1hc2spIGNvbnN0IHsgcmV0dXJuIG1fc3RvcmFnZSAmIG1hc2s7IH0KKyAgICB2b2lk
IHNldE1hc2tlZFZhbHVlKHVpbnRwdHJfdCB2YWx1ZSwgdWludHB0cl90IG1hc2spIHsgbV9zdG9y
YWdlID0gKG1fc3RvcmFnZSAmICFtYXNrKSB8IHZhbHVlOyB9CisKKyAgICB1aW50cHRyX3QgbV9z
dG9yYWdlOworfTsKKworCiBjbGFzcyBIVE1MSWRlbnRpZmllciB7CiBwdWJsaWM6Ci0gICAgSFRN
TElkZW50aWZpZXIoKSA6IG1faW5kZXgoMCkgeyB9CisgICAgSFRNTElkZW50aWZpZXIoKSB7IH0K
IAogICAgIHRlbXBsYXRlPHNpemVfdCBpbmxpbmVDYXBhY2l0eT4KICAgICBIVE1MSWRlbnRpZmll
cihjb25zdCBWZWN0b3I8VUNoYXIsIGlubGluZUNhcGFjaXR5PiYgdmVjdG9yLCBDaGFyYWN0ZXJX
aWR0aCB3aWR0aCkKLSAgICAgICAgOiBtX2luZGV4KGZpbmRJbmRleCh2ZWN0b3IuZGF0YSgpLCB2
ZWN0b3Iuc2l6ZSgpKSkKICAgICB7Ci0gICAgICAgIGlmIChtX2luZGV4ICE9IGludmFsaWRJbmRl
eCkKKyAgICAgICAgY29uc3QgU3RyaW5nSW1wbCogc3RhdGljU3RyaW5nSW1wbCA9IGxvb2t1cFN0
YXRpY1N0cmluZ0ltcGwodmVjdG9yLmRhdGEoKSwgdmVjdG9yLnNpemUoKSk7CisgICAgICAgIHNl
dFN0YXRpYyghIXN0YXRpY1N0cmluZ0ltcGwpOworICAgICAgICBpZiAoc3RhdGljU3RyaW5nSW1w
bCkgeworICAgICAgICAgICAgc2V0U3RhdGljU3RyaW5nKHN0YXRpY1N0cmluZ0ltcGwpOwogICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIGlmICh3aWR0aCA9PSBMaWtlbHk4
Qml0KQotICAgICAgICAgICAgbV9zdHJpbmcgPSBTdHJpbmdJbXBsOjpjcmVhdGU4Qml0SWZQb3Nz
aWJsZSh2ZWN0b3IpOworICAgICAgICAgICAgc2V0T3duZWRTdHJpbmcoU3RyaW5nSW1wbDo6Y3Jl
YXRlOEJpdElmUG9zc2libGUodmVjdG9yKSk7CiAgICAgICAgIGVsc2UgaWYgKHdpZHRoID09IEZv
cmNlOEJpdCkKLSAgICAgICAgICAgIG1fc3RyaW5nID0gU3RyaW5nOjptYWtlOEJpdEZyb20xNkJp
dFNvdXJjZSh2ZWN0b3IpOworICAgICAgICAgICAgc2V0T3duZWRTdHJpbmcoU3RyaW5nOjptYWtl
OEJpdEZyb20xNkJpdFNvdXJjZSh2ZWN0b3IpLnJlbGVhc2VJbXBsKCkpOwogICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBtX3N0cmluZyA9IFN0cmluZyh2ZWN0b3IpOworICAgICAgICAgICAgc2V0
T3duZWRTdHJpbmcoU3RyaW5nKHZlY3RvcikucmVsZWFzZUltcGwoKSk7CiAgICAgfQogCi0gICAg
Ly8gYXNTdHJpbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gICAg
Y29uc3QgU3RyaW5nJiBhc1N0cmluZygpIGNvbnN0OwotICAgIC8vIGFzU3RyaW5nSW1wbCgpIGlz
IHNhZmUgdG8gY2FsbCBmcm9tIGFueSB0aHJlYWQuCi0gICAgY29uc3QgU3RyaW5nSW1wbCogYXNT
dHJpbmdJbXBsKCkgY29uc3Q7CisgICAgfkhUTUxJZGVudGlmaWVyKCk7CisKKyAgICAvLyBhc011
dGFibGVTdHJpbmdJbXBsIGNhbiBvbmx5IGJlIHVzZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAg
IFN0cmluZ0ltcGwqIGFzTXV0YWJsZVN0cmluZ0ltcGwoKSBjb25zdDsKKworICAgIC8vIGFzU3Ry
aW5nSW1wbCgpIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGFueSB0aHJlYWQsIGl0IGlzIGltcG9ydGFu
dCB0aGF0CisgICAgLy8gdGhpcyByZXR1cm5zIGEgY29uc3QgU3RyaW5nSW1wbCogc28gaXQgY2Fu
bm90IGJlIHJlZmZlZC4KKyAgICBjb25zdCBTdHJpbmdJbXBsKiBhc1N0cmluZ0ltcGwoKSBjb25z
dCB7IHJldHVybiBtX3BvaW50ZXJXaXRoRmxhZ3MucHRyKCk7IH0KKyAgICBib29sIGlzU3RhdGlj
KCkgY29uc3QgeyByZXR1cm4gbV9wb2ludGVyV2l0aEZsYWdzLmZsYWcxKCk7IH0KIAogICAgIHN0
YXRpYyB2b2lkIGluaXQoKTsKIAotICAgIGJvb2wgaXNTYWZlVG9TZW5kVG9Bbm90aGVyVGhyZWFk
KCkgY29uc3QgeyByZXR1cm4gbV9zdHJpbmcuaXNTYWZlVG9TZW5kVG9Bbm90aGVyVGhyZWFkKCk7
IH0KKyAgICBib29sIGlzU2FmZVRvU2VuZFRvQW5vdGhlclRocmVhZCgpIGNvbnN0IHsgcmV0dXJu
IGlzU3RhdGljKCkgfHwgYXNTdHJpbmdJbXBsKCktPmhhc09uZVJlZigpOyB9CiAKICNpZm5kZWYg
TkRFQlVHCi0gICAgc3RhdGljIGJvb2wgaGFzSW5kZXgoY29uc3QgU3RyaW5nSW1wbCopOworICAg
IHZvaWQgbWFya0ZvclRyYW5zZmVyVG9NYWluVGhyZWFkKCkgeyBtX3BvaW50ZXJXaXRoRmxhZ3Mu
c2V0RmxhZzIodHJ1ZSk7IH0KKyAgICBzdGF0aWMgYm9vbCBpc0tub3duU3RyaW5nKGNvbnN0IFN0
cmluZ0ltcGwqKTsKICNlbmRpZgogCiBwcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25l
ZCBpbnZhbGlkSW5kZXggPSAtMTsKKyNpZm5kZWYgTkRFQlVHCisgICAgYm9vbCBpc01hcmtlZEZv
clRyYW5zZmVyVG9NYWluVGhyZWFkKCkgeyByZXR1cm4gbV9wb2ludGVyV2l0aEZsYWdzLmZsYWcy
KCk7IH0KKyNlbmRpZgorCisgICAgdm9pZCBzZXRTdGF0aWMoYm9vbCBpc1N0YXRpYykgeyBtX3Bv
aW50ZXJXaXRoRmxhZ3Muc2V0RmxhZzEoaXNTdGF0aWMpOyB9CisgICAgdm9pZCBzZXRPd25lZFN0
cmluZyhQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHN0cmluZ0ltcGwpCisgICAgeworICAgICAgICBB
U1NFUlQoIWlzU3RhdGljKCkpOworICAgICAgICBBU1NFUlQoIW1fcG9pbnRlcldpdGhGbGFncy5w
dHIoKSk7IC8vIFRoaXMgaGFzIG5vdCBiZSB3cml0dGVuIGFzIGEgZ2VuZXJpYyBzZXR0ZXIuCisg
ICAgICAgIG1fcG9pbnRlcldpdGhGbGFncy5zZXRQdHIoc3RyaW5nSW1wbC5sZWFrUmVmKCkpOwor
ICAgIH0KKyAgICB2b2lkIHNldFN0YXRpY1N0cmluZyhjb25zdCBTdHJpbmdJbXBsKiBzdGF0aWNT
dHJpbmdQdHIpCisgICAgeworICAgICAgICBBU1NFUlQoaXNTdGF0aWMoKSk7CisgICAgICAgIEFT
U0VSVCghbV9wb2ludGVyV2l0aEZsYWdzLnB0cigpKTsgLy8gVGhpcyBoYXMgbm90IGJlIHdyaXR0
ZW4gYXMgYSBnZW5lcmljIHNldHRlci4KKyAgICAgICAgbV9wb2ludGVyV2l0aEZsYWdzLnNldFB0
cihzdGF0aWNTdHJpbmdQdHIpOworICAgIH0KKwogICAgIHN0YXRpYyB1bnNpZ25lZCBtYXhOYW1l
TGVuZ3RoOwotICAgIHN0YXRpYyB1bnNpZ25lZCBmaW5kSW5kZXgoY29uc3QgVUNoYXIqIGNoYXJh
Y3RlcnMsIHVuc2lnbmVkIGxlbmd0aCk7Ci0gICAgc3RhdGljIHZvaWQgYWRkTmFtZXMoUXVhbGlm
aWVkTmFtZSoqIG5hbWVzLCB1bnNpZ25lZCBuYW1lc0NvdW50LCB1bnNpZ25lZCBpbmRleE9mZnNl
dCk7CisgICAgc3RhdGljIHZvaWQgYWRkTmFtZXMoUXVhbGlmaWVkTmFtZSoqIG5hbWVzLCB1bnNp
Z25lZCBuYW1lc0NvdW50KTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nSW1wbCogbG9va3VwU3Rh
dGljU3RyaW5nSW1wbChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKTsK
IAotICAgIC8vIEZJWE1FOiBUaGlzIGNvdWxkIGJlIGEgdW5pb24uCi0gICAgdW5zaWduZWQgbV9p
bmRleDsKLSAgICBTdHJpbmcgbV9zdHJpbmc7CisgICAgUG9pbnRlcldpdGhGbGFnczxjb25zdCBT
dHJpbmdJbXBsPiBtX3BvaW50ZXJXaXRoRmxhZ3M7CiB9OwogCiB9CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL3BhcnNlci9IVE1MUGFyc2VySWRpb21zLmggYi9Tb3VyY2UvV2ViQ29y
ZS9odG1sL3BhcnNlci9IVE1MUGFyc2VySWRpb21zLmgKaW5kZXggYmM1ODA4OTEwNjdlMDEzOTU2
Mjk1ZWMzYzVhYjk0ZTgwM2RlZjdmOS4uNjNhOTg5ZDQzMzk3YmJiNWNmMDk4MzI4YmFlNTY4NGQ5
Mjg1YWNiMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvSFRNTFBhcnNl
cklkaW9tcy5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvcGFyc2VyL0hUTUxQYXJzZXJJZGlv
bXMuaApAQCAtMTAwLDcgKzEwMCw3IEBAIGlubGluZSBib29sIHRocmVhZFNhZmVIVE1MTmFtZXNN
YXRjaChjb25zdCBIVE1MSWRlbnRpZmllciYgdGFnTmFtZSwgY29uc3QgUXVhbGlmCiB7CiAgICAg
Ly8gV2hlbiB0aGUgUXVhbGlmaWVkTmFtZSBpcyBrbm93biB0byBIVE1MSWRlbnRpZmllciwKICAg
ICAvLyBhbGwgd2UgaGF2ZSB0byBkbyBpcyBhIHBvaW50ZXIgY29tcGFyZS4KLSAgICBBU1NFUlQo
SFRNTElkZW50aWZpZXI6Omhhc0luZGV4KHFOYW1lLmxvY2FsTmFtZSgpLmltcGwoKSkpOworICAg
IEFTU0VSVChIVE1MSWRlbnRpZmllcjo6aXNLbm93blN0cmluZyhxTmFtZS5sb2NhbE5hbWUoKS5p
bXBsKCkpKTsKICAgICByZXR1cm4gdGFnTmFtZS5hc1N0cmluZ0ltcGwoKSA9PSBxTmFtZS5sb2Nh
bE5hbWUoKS5pbXBsKCk7CiB9CiAjZW5kaWYK
</data>

          </attachment>
      

    </bug>

</bugzilla>