<?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>31749</bug_id>
          
          <creation_ts>2009-11-20 15:07:59 -0800</creation_ts>
          <short_desc>ER: Add a few C-string alternatives to methods that take AtomicString</short_desc>
          <delta_ts>2009-12-02 12:47:55 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>30187</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jens Alfke">jens</reporter>
          <assigned_to name="Jens Alfke">jens</assigned_to>
          <cc>abarth</cc>
    
    <cc>ap</cc>
    
    <cc>darin</cc>
    
    <cc>jens</cc>
    
    <cc>mrowe</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>165470</commentid>
    <comment_count>0</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-11-20 15:07:59 -0800</bug_when>
    <thetext>In preparation for disabling implicit char*-to-AtomicString conversions (bug 30187) I&apos;m adding a few char* equivalents of commonly-used WebCore methods that take an AtomicString parameter:

HTTPHeaderMap::get
HTTPHeaderMap::contains
ResourceRequestBase::httpHeaderField
ResourceRequestBase::setHTTPHeaderField
ResourceResponseBase::httpHeaderField
QualifiedName::QualifiedName
Element::setCStringAttribute [different name to prevent accidental usage]

I&apos;ve also added ResourceRequestBase::contentType, as there were a number of calls to httpHeaderField(&quot;Content-Type&quot;).

To make HTTP header lookup by C string more efficient, I ported the alternate-key-type support from HashSet into HashMap. This allows HTTPHeaderMap to look up keys by char* without having to create a temporary AtomicString.

I didn&apos;t similarly optimize _setting_ HTTP headers, because that doesn&apos;t occur nearly as much. The new setHTTPHeaderField(char*) is just a convenience, to avoid having to insert a bunch of occurrences of &quot;AtomicString(...)&quot; in calling code.

Similarly, Element::setCStringAttribute is only a convenience, for use in code that isn&apos;t performance-sensitive, for example ImageDocument.cpp. I did give it a different name so that people won&apos;t call it by accident or through laziness; in general it&apos;s better to create a static AtomicString instead of using a string literal.

Finally, I collected the C string literals for HTTP header names into a group of symbolic constants in the HTTPHeaders namespace (in HTTPHeaderMap.h). I originally did this to make them into AtomicStrings, but that didn&apos;t work out for thread-safety reasons; I still think it&apos;s valuable to do for code cleanliness, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>165471</commentid>
    <comment_count>1</comment_count>
      <attachid>43616</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-11-20 15:08:35 -0800</bug_when>
    <thetext>Created attachment 43616
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>165949</commentid>
    <comment_count>2</comment_count>
      <attachid>43738</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-11-23 14:59:44 -0800</bug_when>
    <thetext>Created attachment 43738
patch 2 (smaller)

I&apos;ve removed some of the nonessential parts to make this patch smaller and easier to read.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167316</commentid>
    <comment_count>3</comment_count>
      <attachid>43738</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-11-30 11:59:09 -0800</bug_when>
    <thetext>Comment on attachment 43738
patch 2 (smaller)

&gt; +void Element::setCStringAttribute(const QualifiedName&amp; name, const char* cStringValue) {
&gt; +    ExceptionCode ec;
&gt; +    setAttribute(name, AtomicString(cStringValue), ec);
&gt; +}

Brace needs to go on the next line.

&gt; +    // Please don&apos;t use setCStringAttribute in performance-sensitive code;
&gt; +    // use a static AtomicString value instead to avoid the conversion overhead.
&gt; +    void setCStringAttribute(const QualifiedName&amp;, const char* cStringValue);

I am not entirely comfortable with adding this and then advising people not to use it. Also, is there a reason we do this with a separate name and not with overloading?

&gt; -QualifiedName::QualifiedName(const AtomicString&amp; p, const AtomicString&amp; l, const AtomicString&amp; n)
&gt; +void QualifiedName::init(const AtomicString&amp; p, const AtomicString&amp; l, const AtomicString&amp; n)
&gt;  {
&gt;      if (!gNameCache)
&gt;          gNameCache = new QNameSet;
&gt; @@ -62,6 +62,16 @@ QualifiedName::QualifiedName(const Atomi
&gt;          m_impl-&gt;ref();
&gt;  }

I think this could be marked inline so we don&apos;t do an extra function call just to get in; or maybe the function call is worth it. If we do inline, we would probably get better code if we put the line of code that creates the QNameSet into a separate non-inline function.

    if (!gNameCache)
        createNameCache();

Something like that.

&gt;      QualifiedName(const AtomicString&amp; prefix, const AtomicString&amp; localName, const AtomicString&amp; namespaceURI);
&gt; +    QualifiedName(const AtomicString&amp; prefix, const char* localName, const AtomicString&amp; namespaceURI);

Does this need advice about when to use it and when to not use it?

&gt; +// Magic adapter that allows the HashMap to take C strings as keys.

Not a big fan of the word &quot;Magic&quot; in this comment.

&gt; +    static unsigned hash(const char* c)
&gt; +    {
&gt; +        return CaseFoldingHash::hash(c);
&gt; +    }

The use of &quot;c&quot; as the argument name here is a bit strange. I would name it string.

&gt; +    static bool equal(AtomicString key, const char* s)

I think this needs to take const AtomicString&amp; to avoid causing unnecessary reference count thrash.

&gt; +        return equalIgnoringCase(key,s);

We use spaces after commas, so &quot;key&quot; needs a space after it.

&gt; +    static void translate(AtomicString&amp; location, const char* const&amp; c, unsigned /*hash*/)
&gt; +    {
&gt; +        location = AtomicString(c);
&gt; +    }

We should make sure we have a member function on AtomicString so we don&apos;t have to construct a temporary AtomicString just to do this operation.

I think the &quot;c&quot; argument can just be const char* and doesn&apos;t need to be const char* const&amp;. And also it&apos;s a strange name.

&gt; +String HTTPHeaderMap::get(const char* name) const
&gt; +{
&gt; +    const_iterator i = find&lt;const char*, CaseFoldingCStringTranslator&gt;(name);
&gt; +    if (i == end())
&gt; +        return String();
&gt; +    else 
&gt; +        return i-&gt;second;
&gt; +}

We normally do not do else after return.

&gt; +bool HTTPHeaderMap::contains(const char* name) const {

Brace needs to be on the next line.

&gt; +pair&lt;HTTPHeaderMap::iterator, bool&gt; HTTPHeaderMap::add(const char *name, String value)

The &quot;*&quot; for const char* needs to be next to &quot;char&quot;. The argument should be const String&amp; instead of String to avoid causing unnecessary reference count thrash.

&gt; +        String get(const AtomicString &amp;name) const

The &quot;&amp;&quot; should be moved next to the AtomicString.

&gt; +        pair&lt;iterator, bool&gt; add(AtomicString name, String value)

This should take a const AtomicString&amp; and a const String&amp;.

&gt; +        pair&lt;iterator, bool&gt; add(const char *name, String value);

The &quot;*&quot; should be moved next to the char. This should take a const String&amp;.

&gt; +        void setHTTPHeaderField(const char* name, const String&amp; value) { setHTTPHeaderField(AtomicString(name), value); }

Could we put this out of line?

I think at least a few of the suggestions above are mandatory, so review-.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167434</commentid>
    <comment_count>4</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-11-30 15:12:32 -0800</bug_when>
    <thetext>&gt;I am not entirely comfortable with adding this and then advising people not to
&gt;use it. 

It&apos;s not that people shouldn&apos;t use it; it&apos;s a trade-off of performance vs (convenience + code size). In a lot of places it probably doesn&apos;t matter; the comment just says not to use it in performance-sensitive code.

&gt;Also, is there a reason we do this with a separate name and not with overloading?

To make the choice explicit by the caller, which is the theme of this series of patches. It&apos;s very easy to type setAttribute(&quot;foo&quot;,...) without realizing the conversion that&apos;s going to be incurred, so this makes the caller think about it.

&gt;I think this could be marked inline so we don&apos;t do an extra function call just
&gt;to get in; or maybe the function call is worth it.

The constructor is called in a lot of places in the code to create all the standard identifiers, so I&apos;d rather not inline it. What happens instead is that in the .cpp file the init() method gets inlined into both constructors, so I don&apos;t think there is any net effect on performance by this change.

&gt;Does this need advice about when to use it and when to not use it?

In theory, but I don&apos;t think there are any situations where we create QualifiedNames in performance-critical code.

&gt;Not a big fan of the word &quot;Magic&quot; in this comment.

I&apos;ll change it to &quot;Sorcerous&quot;, or maybe &quot;Thaumaturgical&quot;. ;-)

&gt;The use of &quot;c&quot; as the argument name here is a bit strange.
&gt;I think the &quot;c&quot; argument can just be const char* and doesn&apos;t need to be const
&gt;char* const&amp;. And also it&apos;s a strange name.

Fixed. (BTW, those lines are directly copied from AtomicString.cpp, lines 49 and 66).

I&apos;ve fixed the other things you pointed out and will upload a new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167435</commentid>
    <comment_count>5</comment_count>
      <attachid>44043</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-11-30 15:12:57 -0800</bug_when>
    <thetext>Created attachment 44043
patch 3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167436</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-11-30 15:14:35 -0800</bug_when>
    <thetext>Attachment 44043 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Done processing WebCore/platform/network/HTTPHeaderMap.cpp
JavaScriptCore/wtf/HashMap.h:127:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/HashMap.h:215:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/HashMap.h:224:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/HashMap.h:233:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/HashMap.h:262:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Done processing JavaScriptCore/wtf/HashMap.h
Done processing WebCore/platform/network/ResourceRequestBase.cpp
Done processing WebCore/dom/Element.h
Done processing WebCore/dom/QualifiedName.h
Done processing WebCore/platform/network/ResourceResponseBase.cpp
Done processing WebCore/platform/network/HTTPHeaderMap.h
Done processing WebCore/platform/network/ResourceResponseBase.h
Done processing WebCore/dom/Element.cpp
Done processing WebCore/dom/QualifiedName.cpp
Done processing WebCore/platform/network/ResourceRequestBase.h
Total errors found: 5</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167442</commentid>
    <comment_count>7</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-11-30 15:34:57 -0800</bug_when>
    <thetext>&gt;Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
&gt;Done processing WebCore/platform/network/HTTPHeaderMap.cpp
&gt;JavaScriptCore/wtf/HashMap.h:127:  Code inside a namespace should not be
&gt;indented.  [whitespace/indent] [4]

HashMap.h was already indented. All I did was make my changes follow the indentation of the surrounding code.

It might be a better idea to hold off on automated style nags until you can get top-of-tree to pass without any warnings?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167666</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-01 10:29:54 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt;I think this could be marked inline so we don&apos;t do an extra function call just
&gt; &gt;to get in; or maybe the function call is worth it.
&gt; 
&gt; The constructor is called in a lot of places in the code to create all the
&gt; standard identifiers, so I&apos;d rather not inline it. What happens instead is that
&gt; in the .cpp file the init() method gets inlined into both constructors, so I
&gt; don&apos;t think there is any net effect on performance by this change.

My comment was about the init function. It&apos;s not marked inline, so I don&apos;t think it will get inlined into the constructors in as many situations as it would if it was marked inline.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167668</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-01 10:37:34 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt;Also, is there a reason we do this with a separate name and not with overloading?
&gt; 
&gt; To make the choice explicit by the caller, which is the theme of this series of
&gt; patches. It&apos;s very easy to type setAttribute(&quot;foo&quot;,...) without realizing the
&gt; conversion that&apos;s going to be incurred, so this makes the caller think about
&gt; it.

I think the same issue applies to the QualifiedName constructor, but there we are using overloading. And ResourceRequestBase::setHTTPHeaderField. Are there different circumstances that make that the right tradeoff in those cases?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167669</commentid>
    <comment_count>10</comment_count>
      <attachid>44043</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-01 10:39:13 -0800</bug_when>
    <thetext>Comment on attachment 44043
patch 3

&gt; +        // An alternate version of add() that finds the object by hashing and comparing
&gt; +        // with some other type, to avoid the cost of type conversion if the object is already
&gt; +        // in the table. HashTranslator must have the following methods:

Better terminology is probably &quot;function members&quot;, not &quot;methods&quot;, as in the previous comment.

&gt; +void QualifiedName::init(const AtomicString&amp; p, const AtomicString&amp; l, const AtomicString&amp; n)

I think we should consider marking this member function inline so it gets inlined into the constructors. Not sure it&apos;s needed, but maybe it would be better than the extra level of function call. I raised this issue last time, but I think you may have misunderstood my comment.

&gt; +String HTTPHeaderMap::get(const char* name) const
&gt; +{
&gt; +    const_iterator i = find&lt;const char*, CaseFoldingCStringTranslator&gt;(name);
&gt; +    if (i == end())
&gt; +        return String();
&gt; +    return i-&gt;second;
&gt; +}

Should we offer a HashMap::get that works with a custom key translator? If we had one we could use it here.

&gt; +        String get(const AtomicString &amp;name) const

Wrong position here for the &quot;&amp;&quot; character. It should be by the type name. I wonder why that style checker script didn&apos;t notice.

&gt; +        pair&lt;iterator, bool&gt; add(const AtomicString &amp;name, const String &amp;value)

And here.

&gt; +        // Alternate accessors that are faster than converting the char* to AtomicString first

Need a period here.

&gt; +        pair&lt;iterator, bool&gt; add(const char* name, const String &amp;value);

Wrong position here for the &quot;&amp;&quot; character. It should be by the type name.

It&apos;s probably not good that the HTTPHeaderMap::get function takes an const AtomicString&amp; rather than a const String&amp;. If the caller has a String but not an AtomicString, it will make things slower with no benefit. Similar issue, but debatable with the HTTPHeaderMap::add function -- tradeoff is slightly different because the string needs to be made into an AtomicString if it&apos;s a new key. I see no downside to taking a const String&amp; in the get function, though.

r=me, but I think you could do some further refinement here</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167731</commentid>
    <comment_count>11</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-12-01 13:53:28 -0800</bug_when>
    <thetext>&gt;Should we offer a HashMap::get that works with a custom key translator? If we
&gt;had one we could use it here.

I thought about it, but there wasn&apos;t an equivalent in HashSet&apos;s translated-key code that I could crib from, and I don&apos;t trust my template fu enough to write one. Maybe Maciej could look at that (I never heard back from him about this patch.)

&gt;I think we should consider marking this member function inline so it gets
&gt;inlined into the constructors.

It already does get inlined by the -O3 optimizer (I disassembled to make sure.) IMHO I&apos;d rather leave it up to the optimizer to make the decision in this case, esp. since I can imagine some WebKit clients (like mobile devices) may want different size/speed tradeoffs.

&gt;Wrong position here for the &quot;&amp;&quot; character.

Ack! I&apos;m sorry I keep messing these up. I swear to god I pored over my last patch to make sure I hadn&apos;t left any punctuation in the ri^H^Hwrong place, but I was clearly being blind to ampersands. I&apos;ll fix those, and the comments too.

&gt;It&apos;s probably not good that the HTTPHeaderMap::get function takes an const
&gt;AtomicString&amp; rather than a const String&amp;. If the caller has a String but not
&gt;an AtomicString, it will make things slower with no benefit.

Are you suggesting to implement get(String) by writing another alternate-key adapter? Or do you think the class declaration itself should change to be based on a HashMap&lt;String,String&gt;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167775</commentid>
    <comment_count>12</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-12-01 16:07:21 -0800</bug_when>
    <thetext>Committed r51566 (incorporating spelling and comment fixes.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167817</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-01 17:56:47 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; It already does get inlined by the -O3 optimizer (I disassembled to make sure.)

I don&apos;t think the Mac OS X WebKit is built with -O3.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>167824</commentid>
    <comment_count>14</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2009-12-01 18:15:08 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #11)
&gt; &gt; It already does get inlined by the -O3 optimizer (I disassembled to make sure.)
&gt; 
&gt; I don&apos;t think the Mac OS X WebKit is built with -O3.

From WebCore/Configurations/Base.xcconfig:
GCC_OPTIMIZATION_LEVEL_normal = 2;
GCC_OPTIMIZATION_LEVEL_debug = 0;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168127</commentid>
    <comment_count>15</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-12-02 12:47:55 -0800</bug_when>
    <thetext>Ah, good point Mark. I was disassembling in Chromium&apos;s WebCore.xcodeproj, not Safari&apos;s.
I tried this with Safari&apos;s WebCore project, and the init method is not inlined. Sorry about that.

Whether this is worthwhile depends on how many QualifiedName objects get constructed. There&apos;s one instance per unique HTML/XML tag, i.e. a couple of hundred at most. Shaving a couple of nanoseconds off of each constructor doesn&apos;t seem like it would make any difference. You can file a new bug on this if you disagree, though.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43616</attachid>
            <date>2009-11-20 15:08:35 -0800</date>
            <delta_ts>2009-11-23 14:59:44 -0800</delta_ts>
            <desc>patch</desc>
            <filename>CStringAccess.patch</filename>
            <type>text/plain</type>
            <size>25575</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUxMjU4KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMDktMTEtMjAgIEplbnMgQWxm
a2UgIDxzbmVqQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBBZGRlZCB2YXJpYW50cyBvZiBmaW5kL2NvbnRhaW5zL2FkZCB0aGF0
IGFsbG93IGEgZm9yZWlnbiBrZXkgdHlwZSB0byBiZSB1c2VkLgorICAgICAgICBUaGlzIHdpbGwg
YWxsb3cgQXRvbWljU3RyaW5nLWtleWVkIG1hcHMgdG8gYmUgcXVlcmllZCBieSBDIHN0cmluZyB3
aXRob3V0CisgICAgICAgIGhhdmluZyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgQXRvbWljU3RyaW5n
IChzZWUgSFRUUEhlYWRlck1hcC4pCisgICAgICAgIFRoZSBjb2RlIGZvciB0aGlzIGlzIGFkYXB0
ZWQgZnJvbSB0aGUgZXF1aXZhbGVudCBpbiBIYXNoU2V0LmguCisKKyAgICAgICAgKiB3dGYvSGFz
aE1hcC5oOgorICAgICAgICAoV1RGOjpIYXNoTWFwOjpmaW5kKToKKyAgICAgICAgKFdURjo6SGFz
aE1hcDo6Y29udGFpbnMpOgorICAgICAgICAoV1RGOjpIYXNoTWFwOjphZGQpOgorCiAyMDA5LTEx
LTE5ICBTdGV2ZSBCbG9jayAgPHN0ZXZlYmxvY2tAZ29vZ2xlLmNvbT4KIAogICAgICAgICBBbmRy
b2lkIHBvcnQgbGFja3MgY29uZmlndXJhdGlvbiBpbiBQbGF0Zm9ybS5oIGFuZCBjb25maWcuaC4K
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9IYXNoTWFwLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvd3RmL0hhc2hNYXAuaAkocmV2aXNpb24gNTExMzQpCisrKyBKYXZhU2NyaXB0Q29y
ZS93dGYvSGFzaE1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC04Myw2ICs4MywyMyBAQCBuYW1lc3Bh
Y2UgV1RGIHsKIAogICAgICAgICBNYXBwZWRUeXBlIHRha2UoY29uc3QgS2V5VHlwZSYpOyAvLyBl
ZmZpY2llbnQgY29tYmluYXRpb24gb2YgZ2V0IHdpdGggcmVtb3ZlCiAKKyAgICAgICAgLy8gQW4g
YWx0ZXJuYXRlIHZlcnNpb24gb2YgZmluZCgpIHRoYXQgZmluZHMgdGhlIG9iamVjdCBieSBoYXNo
aW5nIGFuZCBjb21wYXJpbmcKKyAgICAgICAgLy8gd2l0aCBzb21lIG90aGVyIHR5cGUsIHRvIGF2
b2lkIHRoZSBjb3N0IG9mIHR5cGUgY29udmVyc2lvbi4gSGFzaFRyYW5zbGF0b3IKKyAgICAgICAg
Ly8gbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gbWVtYmVyczoKKyAgICAgICAgLy8g
ICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUJik7CisgICAgICAgIC8vICAgc3RhdGljIGJv
b2wgZXF1YWwoY29uc3QgVmFsdWVUeXBlJiwgY29uc3QgVCYpOworICAgICAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBULCB0eXBlbmFtZSBIYXNoVHJhbnNsYXRvcj4gaXRlcmF0b3IgZmluZChjb25zdCBU
Jik7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEhhc2hUcmFuc2xhdG9y
PiBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IFQmKSBjb25zdDsKKyAgICAgICAgdGVtcGxhdGU8
dHlwZW5hbWUgVCwgdHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+IGJvb2wgY29udGFpbnMoY29uc3Qg
VCYpIGNvbnN0OworICAgIAorICAgICAgICAvLyBBbiBhbHRlcm5hdGUgdmVyc2lvbiBvZiBhZGQo
KSB0aGF0IGZpbmRzIHRoZSBvYmplY3QgYnkgaGFzaGluZyBhbmQgY29tcGFyaW5nCisgICAgICAg
IC8vIHdpdGggc29tZSBvdGhlciB0eXBlLCB0byBhdm9pZCB0aGUgY29zdCBvZiB0eXBlIGNvbnZl
cnNpb24gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5CisgICAgICAgIC8vIGluIHRoZSB0YWJsZS4g
SGFzaFRyYW5zbGF0b3IgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgICAgICAg
Ly8gICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUJik7CisgICAgICAgIC8vICAgc3RhdGlj
IGJvb2wgZXF1YWwoY29uc3QgVmFsdWVUeXBlJiwgY29uc3QgVCYpOworICAgICAgICAvLyAgIHN0
YXRpYyB0cmFuc2xhdGUoVmFsdWVUeXBlJiwgY29uc3QgVCYsIHVuc2lnbmVkIGhhc2hDb2RlKTsK
KyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+IHBh
aXI8aXRlcmF0b3IsIGJvb2w+IGFkZChjb25zdCBUJiwgY29uc3QgTWFwcGVkVHlwZSYpOworCiAg
ICAgcHJpdmF0ZToKICAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5saW5lQWRkKGNvbnN0
IEtleVR5cGUmLCBjb25zdCBNYXBwZWRUeXBlJik7CiAKQEAgLTEwNyw2ICsxMjQsMTkgQEAgbmFt
ZXNwYWNlIFdURiB7CiAgICAgICAgIH0KICAgICB9OwogCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
VmFsdWVUeXBlLCB0eXBlbmFtZSBWYWx1ZVRyYWl0cywgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVHJh
bnNsYXRvcj4KKyAgICBzdHJ1Y3QgSGFzaE1hcFRyYW5zbGF0b3JBZGFwdGVyIHsKKyAgICAgICAg
dHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OmZpcnN0X3R5cGUgS2V5VHlwZTsKKyAgICAgICAg
dHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OnNlY29uZF90eXBlIE1hcHBlZFR5cGU7CisgICAg
ICAgIAorICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUJiBrZXkpIHsgcmV0dXJu
IFRyYW5zbGF0b3I6Omhhc2goa2V5KTsgfQorICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25z
dCBLZXlUeXBlJiBhLCBjb25zdCBUJiBiKSB7IHJldHVybiBUcmFuc2xhdG9yOjplcXVhbChhLCBi
KTsgfQorICAgICAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoVmFsdWVUeXBlJiBsb2NhdGlvbiwg
Y29uc3QgVCYga2V5LCBjb25zdCBNYXBwZWRUeXBlJiwgdW5zaWduZWQgaGFzaENvZGUpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIFRyYW5zbGF0b3I6OnRyYW5zbGF0ZShsb2NhdGlvbi5maXJzdCwg
a2V5LCBoYXNoQ29kZSk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgdGVtcGxhdGU8dHlwZW5h
bWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgVywgdHlwZW5hbWUgWD4KICAg
ICBpbmxpbmUgdm9pZCBIYXNoTWFwPFQsIFUsIFYsIFcsIFg+Ojpzd2FwKEhhc2hNYXAmIG90aGVy
KQogICAgIHsKQEAgLTE3NCw2ICsyMDQsMzMgQEAgbmFtZXNwYWNlIFdURiB7CiAgICAgfQogCiAg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUg
VywgdHlwZW5hbWUgWD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFLCB0eXBlbmFtZSBIYXNo
VHJhbnNsYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgSGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6
aXRlcmF0b3IgCisgICAgSGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6ZmluZChjb25zdCBUWVBFJiB2
YWx1ZSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgSGFzaE1hcFRyYW5zbGF0b3JBZGFwdGVyPFZh
bHVlVHlwZSwgVmFsdWVUcmFpdHMsIFRZUEUsIEhhc2hUcmFuc2xhdG9yPiBBZGFwdGVyOworICAg
ICAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIGZpbmQ8VFlQRSwgQWRhcHRlcj4odmFsdWUpOwor
ICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFYs
IHR5cGVuYW1lIFcsIHR5cGVuYW1lIFg+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFlQRSwgdHlw
ZW5hbWUgSGFzaFRyYW5zbGF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIEhhc2hNYXA8VCwgVSwg
ViwgVywgWD46OmNvbnN0X2l0ZXJhdG9yIAorICAgIEhhc2hNYXA8VCwgVSwgViwgVywgWD46OmZp
bmQoY29uc3QgVFlQRSYgdmFsdWUpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIEhhc2hN
YXBUcmFuc2xhdG9yQWRhcHRlcjxWYWx1ZVR5cGUsIFZhbHVlVHJhaXRzLCBUWVBFLCBIYXNoVHJh
bnNsYXRvcj4gQWRhcHRlcjsKKyAgICAgICAgcmV0dXJuIG1faW1wbC50ZW1wbGF0ZSBmaW5kPFRZ
UEUsIEFkYXB0ZXI+KHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0
eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYPgorICAgIHRlbXBs
YXRlPHR5cGVuYW1lIFRZUEUsIHR5cGVuYW1lIEhhc2hUcmFuc2xhdG9yPgorICAgIGlubGluZSBi
b29sIAorICAgIEhhc2hNYXA8VCwgVSwgViwgVywgWD46OmNvbnRhaW5zKGNvbnN0IFRZUEUmIHZh
bHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgdHlwZWRlZiBIYXNoTWFwVHJhbnNsYXRvckFkYXB0
ZXI8VmFsdWVUeXBlLCBWYWx1ZVRyYWl0cywgVFlQRSwgSGFzaFRyYW5zbGF0b3I+IEFkYXB0ZXI7
CisgICAgICAgIHJldHVybiBtX2ltcGwudGVtcGxhdGUgY29udGFpbnM8VFlQRSwgQWRhcHRlcj4o
dmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5
cGVuYW1lIFYsIHR5cGVuYW1lIFcsIHR5cGVuYW1lIFg+CiAgICAgaW5saW5lIHBhaXI8dHlwZW5h
bWUgSGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6aXRlcmF0b3IsIGJvb2w+CiAgICAgSGFzaE1hcDxU
LCBVLCBWLCBXLCBYPjo6aW5saW5lQWRkKGNvbnN0IEtleVR5cGUmIGtleSwgY29uc3QgTWFwcGVk
VHlwZSYgbWFwcGVkKSAKICAgICB7CkBAIC0xOTQsNiArMjUxLDE1IEBAIG5hbWVzcGFjZSBXVEYg
ewogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1l
IFYsIHR5cGVuYW1lIFcsIHR5cGVuYW1lIFg+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFlQRSwg
dHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+CisgICAgcGFpcjx0eXBlbmFtZSBIYXNoTWFwPFQsIFUs
IFYsIFcsIFg+OjppdGVyYXRvciwgYm9vbD4KKyAgICBIYXNoTWFwPFQsIFUsIFYsIFcsIFg+Ojph
ZGQoY29uc3QgVFlQRSYga2V5LCBjb25zdCBNYXBwZWRUeXBlJiB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIHR5cGVkZWYgSGFzaE1hcFRyYW5zbGF0b3JBZGFwdGVyPFZhbHVlVHlwZSwgVmFsdWVUcmFp
dHMsIFRZUEUsIEhhc2hUcmFuc2xhdG9yPiBBZGFwdGVyOworICAgICAgICByZXR1cm4gbV9pbXBs
LnRlbXBsYXRlIGFkZFBhc3NpbmdIYXNoQ29kZTxUWVBFLCBNYXBwZWRUeXBlLCBBZGFwdGVyPihr
ZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBV
LCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYPgogICAgIHBhaXI8dHlwZW5hbWUg
SGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6aXRlcmF0b3IsIGJvb2w+CiAgICAgSGFzaE1hcDxULCBV
LCBWLCBXLCBYPjo6YWRkKGNvbnN0IEtleVR5cGUmIGtleSwgY29uc3QgTWFwcGVkVHlwZSYgbWFw
cGVkKQogICAgIHsKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvQ2hhbmdlTG9nCShyZXZpc2lvbiA1MTI1OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsNzYgQEAKKzIwMDktMTEtMjAgIEplbnMgQWxma2UgIDxzbmVq
QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBBZGQgY29udmVuaWVuY2UgbWV0aG9kcyB0byBFbGVtZW50IGFuZCBRdWFsaWZpZWRO
YW1lIHRoYXQgdGFrZQorICAgICAgICBjaGFyKiBpbnN0ZWFkIG9mIEF0b21pY1N0cmluZywgaW4g
cHJlcGFyYXRpb24gZm9yIHJlbW92aW5nIHRoZQorICAgICAgICBpbXBsaWNpdCBjb252ZXJzaW9u
IGJldHdlZW4gdGhlIHR3byB0eXBlcyAoMzAxODcpLgorCisgICAgICAgICogZG9tL0VsZW1lbnQu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0Q1N0cmluZ0F0dHJpYnV0ZSk6ICBF
cXVpdmFsZW50IHRvIHNldEF0dHJpYnV0ZS4KKyAgICAgICAgKiBkb20vRWxlbWVudC5oOgorICAg
ICAgICAqIGRvbS9RdWFsaWZpZWROYW1lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlF1YWxpZmll
ZE5hbWU6OmluaXQpOiAgU2hhcmVkIGltcGwgb2YgYm90aCBjb25zdHJ1Y3RvcnMKKyAgICAgICAg
KFdlYkNvcmU6OlF1YWxpZmllZE5hbWU6OlF1YWxpZmllZE5hbWUpOiAgTmV3IGMndG9yIHRha2lu
ZyBjaGFyKi4KKyAgICAgICAgKiBkb20vUXVhbGlmaWVkTmFtZS5oOgorICAgICAgICAqIFdlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkNhc2VGb2xkaW5nQ1N0cmluZ1RyYW5zbGF0b3IpOgorICAgICAgICAoV2ViQ29yZTo6SFRUUEhl
YWRlck1hcDo6Z2V0KQorICAgICAgICAoV2ViQ29yZTo6SFRUUEhlYWRlck1hcDo6Y29udGFpbnMp
CisgICAgICAgIChXZWJDb3JlOjpIVFRQSGVhZGVyTWFwOjphZGQpCisgICAgICAgICogV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuaDoKKyAgICAgICAgKFdlYkNvcmU6OkhU
VFBIZWFkZXJOYW1lcykKKyAgICAgICAgKiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3Vy
Y2VSZXF1ZXN0QmFzZS5jcHA6CisgICAgICAgICogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jl
c291cmNlUmVxdWVzdEJhc2UuaDoKKyAgICAgICAgKiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
UmVzb3VyY2VSZXNwb25zZUJhc2UuY3BwOgorICAgICAgICAqIFdlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9SZXNvdXJjZVJlc3BvbnNlQmFzZS5oOgorCisyMDA5LTExLTIwICBKZW5zIEFsZmtlICA8
c25lakBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQWRkIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gRWxlbWVudCBhbmQgUXVhbGlm
aWVkTmFtZSB0aGF0IHRha2UKKyAgICAgICAgY2hhciogaW5zdGVhZCBvZiBBdG9taWNTdHJpbmcs
IGluIHByZXBhcmF0aW9uIGZvciByZW1vdmluZyB0aGUKKyAgICAgICAgaW1wbGljaXQgY29udmVy
c2lvbiBiZXR3ZWVuIHRoZSB0d28gdHlwZXMgKDMwMTg3KS4KKworICAgICAgICAqIGRvbS9FbGVt
ZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnNldENTdHJpbmdBdHRyaWJ1dGUp
OiAgRXF1aXZhbGVudCB0byBzZXRBdHRyaWJ1dGUuCisgICAgICAgICogZG9tL0VsZW1lbnQuaDoK
KyAgICAgICAgKiBkb20vUXVhbGlmaWVkTmFtZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpRdWFs
aWZpZWROYW1lOjppbml0KTogIFNoYXJlZCBpbXBsIG9mIGJvdGggY29uc3RydWN0b3JzCisgICAg
ICAgIChXZWJDb3JlOjpRdWFsaWZpZWROYW1lOjpRdWFsaWZpZWROYW1lKTogIE5ldyBjJ3RvciB0
YWtpbmcgY2hhciouCisgICAgICAgICogZG9tL1F1YWxpZmllZE5hbWUuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2Fz
ZUZvbGRpbmdDU3RyaW5nVHJhbnNsYXRvcik6ICBFbmFibGVzIGxvb2t1cCBieSBDIHN0cmluZwor
ICAgICAgICAoV2ViQ29yZTo6SFRUUEhlYWRlck1hcDo6Z2V0KTogIE5ldyB2YXJpYW50IHRoYXQg
dGFrZXMgQyBzdHJpbmcKKyAgICAgICAgKFdlYkNvcmU6OkhUVFBIZWFkZXJNYXA6OmNvbnRhaW5z
KTogIE5ldyB2YXJpYW50IHRoYXQgdGFrZXMgQyBzdHJpbmcKKyAgICAgICAgKFdlYkNvcmU6OkhU
VFBIZWFkZXJNYXA6OmFkZCk6ICBOZXcgdmFyaWFudCB0aGF0IHRha2VzIEMgc3RyaW5nCisgICAg
ICAgICogcGxhdGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmg6CisgICAgICAgIChXZWJDb3Jl
OjpIVFRQSGVhZGVyTWFwOjpnZXQpOgorICAgICAgICAoV2ViQ29yZTo6SFRUUEhlYWRlck1hcDo6
YWRkKToKKyAgICAgICAgKFdlYkNvcmU6OkhUVFBIZWFkZXJzKTogIEFkZGVkIHN0cmluZyBjb25z
dGFudHMgZm9yIGNvbW1vbmx5IHVzZWQgSFRUUCBoZWFkZXIgbmFtZXMKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
UmVzb3VyY2VSZXF1ZXN0QmFzZTo6aHR0cEhlYWRlckZpZWxkKTogIE5ldyB2YXJpYW50IHRoYXQg
dGFrZXMgQyBzdHJpbmcKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdEJhc2U6OmNs
ZWFySFRUUFJlZmVycmVyKTogIFVzZSBzeW1ib2xpYyBuYW1lcyBmb3IgaGVhZGVycworICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0QmFzZTo6Y2xlYXJIVFRQT3JpZ2luKTogIFVzZSBz
eW1ib2xpYyBuYW1lcyBmb3IgaGVhZGVycworICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VSZXF1
ZXN0QmFzZTo6aXNDb25kaXRpb25hbCk6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhlYWRlcnMK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdEJhc2U6OnNldEhUVFBIZWFkZXJGaWVsZCk6ICBV
c2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhlYWRlcnMKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
UmVxdWVzdEJhc2U6Omh0dHBDb250ZW50VHlwZSk6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhl
YWRlcnMKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdEJhc2U6OnNldEhUVFBDb250
ZW50VHlwZSk6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhlYWRlcnMKKyAgICAgICAgKFdlYkNv
cmU6OlJlc291cmNlUmVxdWVzdEJhc2U6Omh0dHBSZWZlcnJlcik6ICBVc2Ugc3ltYm9saWMgbmFt
ZXMgZm9yIGhlYWRlcnMKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdEJhc2U6OnNl
dEhUVFBSZWZlcnJlcik6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhlYWRlcnMKKyAgICAgICAg
KFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdEJhc2U6Omh0dHBPcmlnaW4pOiAgVXNlIHN5bWJvbGlj
IG5hbWVzIGZvciBoZWFkZXJzCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3RCYXNl
OjpzZXRIVFRQT3JpZ2luKTogIFVzZSBzeW1ib2xpYyBuYW1lcyBmb3IgaGVhZGVycworICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0QmFzZTo6aHR0cFVzZXJBZ2VudCk6ICBVc2Ugc3lt
Ym9saWMgbmFtZXMgZm9yIGhlYWRlcnMKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVxdWVz
dEJhc2U6OnNldEhUVFBVc2VyQWdlbnQpOiAgVXNlIHN5bWJvbGljIG5hbWVzIGZvciBoZWFkZXJz
CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3RCYXNlOjpodHRwQWNjZXB0KTogIFVz
ZSBzeW1ib2xpYyBuYW1lcyBmb3IgaGVhZGVycworICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VS
ZXF1ZXN0QmFzZTo6c2V0SFRUUEFjY2VwdCk6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhlYWRl
cnMKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVzcG9uc2VCYXNlOjpodHRwSGVhZGVyRmllbGQp
OiAgTmV3IHZhcmlhbnQgdGhhdCB0YWtlcyBDIHN0cmluZworICAgICAgICAoV2ViQ29yZTo6UmVz
b3VyY2VSZXNwb25zZUJhc2U6OmNvbnRlbnRUeXBlKTogIE5ldyBtZXRob2QKKyAgICAgICAgKiBw
bGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNlLmg6CisKIDIwMDktMTEtMjAgIEpl
bnMgQWxma2UgIDxzbmVqQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KIAogICAgICAgICBBZGQgY29udmVuaWVuY2UgbWV0aG9kcyB0byBFbGVtZW50
IGFuZCBRdWFsaWZpZWROYW1lIHRoYXQgdGFrZQogICAgICAgICBjaGFyKiBpbnN0ZWFkIG9mIEF0
b21pY1N0cmluZywgaW4gcHJlcGFyYXRpb24gZm9yIHJlbW92aW5nIHRoZQogICAgICAgICBpbXBs
aWNpdCBjb252ZXJzaW9uIGJldHdlZW4gdGhlIHR3byB0eXBlcyAoMzAxODcpLgogCiAgICAgICAg
ICogZG9tL0VsZW1lbnQuY3BwOgogICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0Q1N0cmlu
Z0F0dHJpYnV0ZSk6ICBFcXVpdmFsZW50IHRvIHNldEF0dHJpYnV0ZS4KICAgICAgICAgKiBkb20v
RWxlbWVudC5oOgogICAgICAgICAqIGRvbS9RdWFsaWZpZWROYW1lLmNwcDoKICAgICAgICAgKFdl
YkNvcmU6OlF1YWxpZmllZE5hbWU6OmluaXQpOiAgU2hhcmVkIGltcGwgb2YgYm90aCBjb25zdHJ1
Y3RvcnMKICAgICAgICAgKFdlYkNvcmU6OlF1YWxpZmllZE5hbWU6OlF1YWxpZmllZE5hbWUpOiAg
TmV3IGMndG9yIHRha2luZyBjaGFyKi4KICAgICAgICAgKiBkb20vUXVhbGlmaWVkTmFtZS5oOgog
ICAgICAgICAqIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmNwcDoKICAg
ICAgICAgKFdlYkNvcmU6OkNhc2VGb2xkaW5nQ1N0cmluZ1RyYW5zbGF0b3IpOgogICAgICAgICAo
V2ViQ29yZTo6SFRUUEhlYWRlck1hcDo6Z2V0KQogICAgICAgICAoV2ViQ29yZTo6SFRUUEhlYWRl
ck1hcDo6Y29udGFpbnMpCiAgICAgICAgIChXZWJDb3JlOjpIVFRQSGVhZGVyTWFwOjphZGQpCiAg
ICAgICAgICogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuaDoKICAgICAg
ICAgKFdlYkNvcmU6OkhUVFBIZWFkZXJOYW1lcykKICAgICAgICAgKiBXZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvUmVzb3VyY2VSZXF1ZXN0QmFzZS5jcHA6CiAgICAgICAgICogV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuaDoKICAgICAgICAgKiBXZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNwb25zZUJhc2UuY3BwOgogICAgICAgICAqIFdlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlc3BvbnNlQmFzZS5oOgogCkluZGV4OiBXZWJD
b3JlL2RvbS9FbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9FbGVtZW50LmNw
cAkocmV2aXNpb24gNTExMzQpCisrKyBXZWJDb3JlL2RvbS9FbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTM2LDYgKzEzNiwxMSBAQCB2b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25z
dCBRdWFsaWZpCiAgICAgRXhjZXB0aW9uQ29kZSBlYzsKICAgICBzZXRBdHRyaWJ1dGUobmFtZSwg
dmFsdWUsIGVjKTsKIH0KKyAgICAKK3ZvaWQgRWxlbWVudDo6c2V0Q1N0cmluZ0F0dHJpYnV0ZShj
b25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBjaGFyKiBjU3RyaW5nVmFsdWUpIHsKKyAg
ICBFeGNlcHRpb25Db2RlIGVjOworICAgIHNldEF0dHJpYnV0ZShuYW1lLCBBdG9taWNTdHJpbmco
Y1N0cmluZ1ZhbHVlKSwgZWMpOworfQogCiB2b2lkIEVsZW1lbnQ6OnNldEJvb2xlYW5BdHRyaWJ1
dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgYm9vbCBiKQogewpJbmRleDogV2ViQ29yZS9k
b20vRWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL0VsZW1lbnQuaAkocmV2aXNp
b24gNTExMzQpCisrKyBXZWJDb3JlL2RvbS9FbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTE2
Nyw2ICsxNjcsOSBAQCBwdWJsaWM6CiAgICAgLy8gY29udmVuaWVuY2UgbWV0aG9kcyB3aGljaCBp
Z25vcmUgZXhjZXB0aW9ucwogICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5h
bWUmLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKTsKICAgICB2b2lkIHNldEJvb2xlYW5BdHRy
aWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgYm9vbCk7CisgICAgLy8gUGxlYXNlIGRv
bid0IHVzZSBzZXRDU3RyaW5nQXR0cmlidXRlIGluIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBjb2Rl
OworICAgIC8vIHVzZSBhIHN0YXRpYyBBdG9taWNTdHJpbmcgdmFsdWUgaW5zdGVhZCB0byBhdm9p
ZCB0aGUgY29udmVyc2lvbiBvdmVyaGVhZC4KKyAgICB2b2lkIHNldENTdHJpbmdBdHRyaWJ1dGUo
Y29uc3QgUXVhbGlmaWVkTmFtZSYsIGNvbnN0IGNoYXIqIGNTdHJpbmdWYWx1ZSk7CiAKICAgICB2
aXJ0dWFsIE5hbWVkTm9kZU1hcCogYXR0cmlidXRlcygpIGNvbnN0OwogICAgIE5hbWVkTm9kZU1h
cCogYXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBjb25zdDsKSW5kZXg6IFdlYkNvcmUvZG9tL1F1
YWxpZmllZE5hbWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUu
Y3BwCShyZXZpc2lvbiA1MTEzNCkKKysrIFdlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01MSw3ICs1MSw3IEBAIHN0cnVjdCBRTmFtZUNvbXBvbmVudHNUcmFu
c2xhdG9yIHsKIAogc3RhdGljIFFOYW1lU2V0KiBnTmFtZUNhY2hlOwogCi1RdWFsaWZpZWROYW1l
OjpRdWFsaWZpZWROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgcCwgY29uc3QgQXRvbWljU3RyaW5n
JiBsLCBjb25zdCBBdG9taWNTdHJpbmcmIG4pCit2b2lkIFF1YWxpZmllZE5hbWU6OmluaXQoY29u
c3QgQXRvbWljU3RyaW5nJiBwLCBjb25zdCBBdG9taWNTdHJpbmcmIGwsIGNvbnN0IEF0b21pY1N0
cmluZyYgbikKIHsKICAgICBpZiAoIWdOYW1lQ2FjaGUpCiAgICAgICAgIGdOYW1lQ2FjaGUgPSBu
ZXcgUU5hbWVTZXQ7CkBAIC02Miw2ICs2MiwxNiBAQCBRdWFsaWZpZWROYW1lOjpRdWFsaWZpZWRO
YW1lKGNvbnN0IEF0b21pCiAgICAgICAgIG1faW1wbC0+cmVmKCk7CiB9CiAKK1F1YWxpZmllZE5h
bWU6OlF1YWxpZmllZE5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiBwLCBjb25zdCBBdG9taWNTdHJp
bmcmIGwsIGNvbnN0IEF0b21pY1N0cmluZyYgbikKK3sKKyAgICBpbml0KHAsIGwsIG4pOworfQor
CitRdWFsaWZpZWROYW1lOjpRdWFsaWZpZWROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgcCwgY29u
c3QgY2hhciogbCwgY29uc3QgQXRvbWljU3RyaW5nJiBuKQoreworICAgIGluaXQocCwgQXRvbWlj
U3RyaW5nKGwpLCBuKTsKK30KKwogdm9pZCBRdWFsaWZpZWROYW1lOjpkZXJlZigpCiB7CiAjaWZk
ZWYgUU5BTUVfREVGQVVMVF9DT05TVFJVQ1RPUgpJbmRleDogV2ViQ29yZS9kb20vUXVhbGlmaWVk
TmFtZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUuaAkocmV2aXNp
b24gNTExMzQpCisrKyBXZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmgJKHdvcmtpbmcgY29weSkK
QEAgLTU3LDYgKzU3LDcgQEAgcHVibGljOgogICAgIH07CiAKICAgICBRdWFsaWZpZWROYW1lKGNv
bnN0IEF0b21pY1N0cmluZyYgcHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSwg
Y29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkkpOworICAgIFF1YWxpZmllZE5hbWUoY29u
c3QgQXRvbWljU3RyaW5nJiBwcmVmaXgsIGNvbnN0IGNoYXIqIGxvY2FsTmFtZSwgY29uc3QgQXRv
bWljU3RyaW5nJiBuYW1lc3BhY2VVUkkpOwogICAgIH5RdWFsaWZpZWROYW1lKCkgeyBkZXJlZigp
OyB9CiAjaWZkZWYgUU5BTUVfREVGQVVMVF9DT05TVFJVQ1RPUgogICAgIFF1YWxpZmllZE5hbWUo
KSA6IG1faW1wbCgwKSB7IH0KQEAgLTg4LDYgKzg5LDcgQEAgcHVibGljOgogICAgIHN0YXRpYyB2
b2lkIGluaXQoKTsKICAgICAKIHByaXZhdGU6CisgICAgdm9pZCBpbml0KGNvbnN0IEF0b21pY1N0
cmluZyYgcHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSwgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lc3BhY2VVUkkpOwogICAgIHZvaWQgcmVmKCkgY29uc3QgeyBtX2ltcGwtPnJl
ZigpOyB9CiAgICAgdm9pZCBkZXJlZigpOwogICAgIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL0hUVFBIZWFkZXJNYXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9IVFRQSGVhZGVyTWFwLmNwcAkocmV2aXNpb24gNTExMzQpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvSFRUUEhlYWRlck1hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYg
KzM4LDI0IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAor
bmFtZXNwYWNlIEhUVFBIZWFkZXJzIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBBY2NlcHQgPSAi
QWNjZXB0IjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBBdXRob3JpemF0aW9uID0gIkF1dGhvcml6
YXRpb24iOworICAgIGNvbnN0IGNoYXIqIGNvbnN0IENhY2hlQ29udHJvbCA9ICJDYWNoZS1Db250
cm9sIjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBDb250ZW50VHlwZSA9ICJDb250ZW50LVR5cGUi
OworICAgIGNvbnN0IGNoYXIqIGNvbnN0IEVUYWcgPSAiRVRhZyI7CisgICAgY29uc3QgY2hhciog
Y29uc3QgSWZNYXRjaCA9ICJJZi1NYXRjaCI7CisgICAgY29uc3QgY2hhciogY29uc3QgSWZNb2Rp
ZmllZFNpbmNlID0gIklmLU1vZGlmaWVkLVNpbmNlIjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBJ
Zk5vbmVNYXRjaCA9ICJJZi1Ob25lLU1hdGNoIjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBJZlJh
bmdlID0gIklmLVJhbmdlIjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBJZlVubW9kaWZpZWRTaW5j
ZSA9ICJJZi1Vbm1vZGlmaWVkLVNpbmNlIjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBMYXN0TW9k
aWZpZWQgPSAiTGFzdC1Nb2RpZmllZCI7CisgICAgY29uc3QgY2hhciogY29uc3QgT3JpZ2luID0g
Ik9yaWdpbiI7CisgICAgY29uc3QgY2hhciogY29uc3QgUHJhZ21hID0gIlByYWdtYSI7CisgICAg
Y29uc3QgY2hhciogY29uc3QgUmVmZXJlciA9ICJSZWZlcmVyIjsKKyAgICBjb25zdCBjaGFyKiBj
b25zdCBVc2VyQWdlbnQgPSAiVXNlci1BZ2VudCI7Cit9CisgICAgCiBhdXRvX3B0cjxDcm9zc1Ro
cmVhZEhUVFBIZWFkZXJNYXBEYXRhPiBIVFRQSGVhZGVyTWFwOjpjb3B5RGF0YSgpIGNvbnN0CiB7
CiAgICAgYXV0b19wdHI8Q3Jvc3NUaHJlYWRIVFRQSGVhZGVyTWFwRGF0YT4gZGF0YShuZXcgQ3Jv
c3NUaHJlYWRIVFRQSGVhZGVyTWFwRGF0YSgpKTsKQEAgLTU5LDUgKzc3LDQxIEBAIHZvaWQgSFRU
UEhlYWRlck1hcDo6YWRvcHQoYXV0b19wdHI8Q3Jvc3MKICAgICAgICAgc2V0KGhlYWRlci5maXJz
dCwgaGVhZGVyLnNlY29uZCk7CiAgICAgfQogfQorICAgIAorLy8gTWFnaWMgYWRhcHRlciB0aGF0
IGFsbG93cyB0aGUgSGFzaE1hcCB0byB0YWtlIEMgc3RyaW5ncyBhcyBrZXlzLgorc3RydWN0IENh
c2VGb2xkaW5nQ1N0cmluZ1RyYW5zbGF0b3IgeworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNv
bnN0IGNoYXIqIGMpCisgICAgeworICAgICAgICByZXR1cm4gQ2FzZUZvbGRpbmdIYXNoOjpoYXNo
KGMpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBlcXVhbChBdG9taWNTdHJpbmcga2V5
LCBjb25zdCBjaGFyKiBzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVxdWFsSWdub3JpbmdDYXNl
KGtleSxzKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKEF0b21pY1N0
cmluZyYgbG9jYXRpb24sIGNvbnN0IGNoYXIqIGNvbnN0JiBjLCB1bnNpZ25lZCAvKmhhc2gqLykK
KyAgICB7CisgICAgICAgIGxvY2F0aW9uID0gQXRvbWljU3RyaW5nKGMpOworICAgIH0KK307CisK
K1N0cmluZyBIVFRQSGVhZGVyTWFwOjpnZXQoY29uc3QgY2hhciogbmFtZSkgY29uc3QKK3sKKyAg
ICBjb25zdF9pdGVyYXRvciBpID0gZmluZDxjb25zdCBjaGFyKiwgQ2FzZUZvbGRpbmdDU3RyaW5n
VHJhbnNsYXRvcj4obmFtZSk7CisgICAgaWYgKGkgPT0gZW5kKCkpCisgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKKyAgICBlbHNlIAorICAgICAgICByZXR1cm4gaS0+c2Vjb25kOworfQorICAgIAor
Ym9vbCBIVFRQSGVhZGVyTWFwOjpjb250YWlucyhjb25zdCBjaGFyKiBuYW1lKSBjb25zdCB7Cisg
ICAgcmV0dXJuIGZpbmQ8Y29uc3QgY2hhciosIENhc2VGb2xkaW5nQ1N0cmluZ1RyYW5zbGF0b3I+
KG5hbWUpICE9IGVuZCgpOworfQorCitwYWlyPEhUVFBIZWFkZXJNYXA6Oml0ZXJhdG9yLCBib29s
PiBIVFRQSGVhZGVyTWFwOjphZGQoY29uc3QgY2hhciAqbmFtZSwgU3RyaW5nIHZhbHVlKQorewor
ICAgIHJldHVybiBIYXNoTWFwPEF0b21pY1N0cmluZywgU3RyaW5nLCBDYXNlRm9sZGluZ0hhc2g+
OjphZGQ8Y29uc3QgY2hhciosIENhc2VGb2xkaW5nQ1N0cmluZ1RyYW5zbGF0b3I+KG5hbWUsIHZh
bHVlKTsKK30KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvSFRUUEhlYWRlck1hcC5oCShyZXZpc2lvbiA1MTEzNCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1
LDQ0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgc3RkOjphdXRvX3B0cjxDcm9zc1Ro
cmVhZEhUVFBIZWFkZXJNYXBEYXRhPiBjb3B5RGF0YSgpIGNvbnN0OwogCiAgICAgICAgIHZvaWQg
YWRvcHQoc3RkOjphdXRvX3B0cjxDcm9zc1RocmVhZEhUVFBIZWFkZXJNYXBEYXRhPik7CisgICAg
ICAgIAorICAgICAgICBTdHJpbmcgZ2V0KGNvbnN0IEF0b21pY1N0cmluZyAmbmFtZSkgY29uc3QK
KyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhhc2hNYXA8QXRvbWljU3RyaW5nLCBTdHJp
bmcsIENhc2VGb2xkaW5nSGFzaD46OmdldChuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHBh
aXI8aXRlcmF0b3IsIGJvb2w+IGFkZChBdG9taWNTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSGFzaE1hcDxBdG9taWNTdHJpbmcsIFN0cmlu
ZywgQ2FzZUZvbGRpbmdIYXNoPjo6YWRkKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIEFsdGVybmF0ZSBhY2Nlc3NvcnMgdGhhdCBhcmUgZmFzdGVyIHRoYW4gY29udmVydGlu
ZyB0aGUgY2hhciogdG8gQXRvbWljU3RyaW5nIGZpcnN0CisgICAgICAgIGJvb2wgY29udGFpbnMo
Y29uc3QgY2hhciopIGNvbnN0OworICAgICAgICBTdHJpbmcgZ2V0KGNvbnN0IGNoYXIqKSBjb25z
dDsKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gYWRkKGNvbnN0IGNoYXIgKm5hbWUsIFN0
cmluZyB2YWx1ZSk7CisgICAgICAgIAogICAgIH07CisgICAgCisgICAgLy8gQ29tbW9uIEhUVFAg
aGVhZGVyIG5hbWVzLgorICAgIC8vIChJdCB3b3VsZCBiZSBtb3JlIGNvbnZlbmllbnQgaWYgdGhl
c2Ugd2VyZSBBdG9taWNTdHJpbmdzLCBidXQgdGhleSBnZXQKKyAgICAvLyBhY2Nlc3NlZCBvbiBt
dWx0aXBsZSB0aHJlYWRzLCBhbmQgQXRvbWljU3RyaW5nIGlzbid0IHRocmVhZC1zYWZlLikKKyAg
ICBuYW1lc3BhY2UgSFRUUEhlYWRlcnMgeworICAgICAgICBleHRlcm4gY29uc3QgY2hhciogY29u
c3QgQWNjZXB0OworICAgICAgICBleHRlcm4gY29uc3QgY2hhciogY29uc3QgQXV0aG9yaXphdGlv
bjsKKyAgICAgICAgZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IENhY2hlQ29udHJvbDsKKyAgICAg
ICAgZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IENvbnRlbnRUeXBlOworICAgICAgICBleHRlcm4g
Y29uc3QgY2hhciogY29uc3QgRVRhZzsKKyAgICAgICAgZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0
IElmTWF0Y2g7CisgICAgICAgIGV4dGVybiBjb25zdCBjaGFyKiBjb25zdCBJZk1vZGlmaWVkU2lu
Y2U7CisgICAgICAgIGV4dGVybiBjb25zdCBjaGFyKiBjb25zdCBJZk5vbmVNYXRjaDsKKyAgICAg
ICAgZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IElmUmFuZ2U7CisgICAgICAgIGV4dGVybiBjb25z
dCBjaGFyKiBjb25zdCBJZlVubW9kaWZpZWRTaW5jZTsKKyAgICAgICAgZXh0ZXJuIGNvbnN0IGNo
YXIqIGNvbnN0IExhc3RNb2RpZmllZDsKKyAgICAgICAgZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0
IE9yaWdpbjsKKyAgICAgICAgZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IFByYWdtYTsKKyAgICAg
ICAgZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IFJlZmVyZXI7CisgICAgICAgIGV4dGVybiBjb25z
dCBjaGFyKiBjb25zdCBVc2VyQWdlbnQ7CisgICAgfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlcXVlc3RCYXNlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXF1ZXN0
QmFzZS5jcHAJKHJldmlzaW9uIDUxMTM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jl
c291cmNlUmVxdWVzdEJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMDgsNiArMjA4LDEzIEBA
IFN0cmluZyBSZXNvdXJjZVJlcXVlc3RCYXNlOjpodHRwSGVhZGVyRmkKICAgICByZXR1cm4gbV9o
dHRwSGVhZGVyRmllbGRzLmdldChuYW1lKTsKIH0KIAorU3RyaW5nIFJlc291cmNlUmVxdWVzdEJh
c2U6Omh0dHBIZWFkZXJGaWVsZChjb25zdCBjaGFyKiBuYW1lKSBjb25zdAoreworICAgIHVwZGF0
ZVJlc291cmNlUmVxdWVzdCgpOyAKKyAgICAKKyAgICByZXR1cm4gbV9odHRwSGVhZGVyRmllbGRz
LmdldChuYW1lKTsKK30KKwogdm9pZCBSZXNvdXJjZVJlcXVlc3RCYXNlOjpzZXRIVFRQSGVhZGVy
RmllbGQoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQogewog
ICAgIHVwZGF0ZVJlc291cmNlUmVxdWVzdCgpOyAKQEAgLTIyMiw3ICsyMjksNyBAQCB2b2lkIFJl
c291cmNlUmVxdWVzdEJhc2U6OmNsZWFySFRUUFJlZmVyCiB7CiAgICAgdXBkYXRlUmVzb3VyY2VS
ZXF1ZXN0KCk7IAogCi0gICAgbV9odHRwSGVhZGVyRmllbGRzLnJlbW92ZSgiUmVmZXJlciIpOwor
ICAgIG1faHR0cEhlYWRlckZpZWxkcy5yZW1vdmUoQXRvbWljU3RyaW5nKEhUVFBIZWFkZXJzOjpS
ZWZlcmVyKSk7CiAKICAgICBpZiAodXJsKCkucHJvdG9jb2xJbkhUVFBGYW1pbHkoKSkKICAgICAg
ICAgbV9wbGF0Zm9ybVJlcXVlc3RVcGRhdGVkID0gZmFsc2U7CkBAIC0yMzIsNyArMjM5LDcgQEAg
dm9pZCBSZXNvdXJjZVJlcXVlc3RCYXNlOjpjbGVhckhUVFBPcmlnaQogewogICAgIHVwZGF0ZVJl
c291cmNlUmVxdWVzdCgpOyAKIAotICAgIG1faHR0cEhlYWRlckZpZWxkcy5yZW1vdmUoIk9yaWdp
biIpOworICAgIG1faHR0cEhlYWRlckZpZWxkcy5yZW1vdmUoQXRvbWljU3RyaW5nKEhUVFBIZWFk
ZXJzOjpPcmlnaW4pKTsKIAogICAgIGlmICh1cmwoKS5wcm90b2NvbEluSFRUUEZhbWlseSgpKQog
ICAgICAgICBtX3BsYXRmb3JtUmVxdWVzdFVwZGF0ZWQgPSBmYWxzZTsKQEAgLTM1MywxMSArMzYw
LDExIEBAIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZXNvdXJjZVJlcXVlc3RCYXMKIAogYm9vbCBS
ZXNvdXJjZVJlcXVlc3RCYXNlOjppc0NvbmRpdGlvbmFsKCkgY29uc3QKIHsKLSAgICByZXR1cm4g
KG1faHR0cEhlYWRlckZpZWxkcy5jb250YWlucygiSWYtTWF0Y2giKSB8fAotICAgICAgICAgICAg
bV9odHRwSGVhZGVyRmllbGRzLmNvbnRhaW5zKCJJZi1Nb2RpZmllZC1TaW5jZSIpIHx8Ci0gICAg
ICAgICAgICBtX2h0dHBIZWFkZXJGaWVsZHMuY29udGFpbnMoIklmLU5vbmUtTWF0Y2giKSB8fAot
ICAgICAgICAgICAgbV9odHRwSGVhZGVyRmllbGRzLmNvbnRhaW5zKCJJZi1SYW5nZSIpIHx8Ci0g
ICAgICAgICAgICBtX2h0dHBIZWFkZXJGaWVsZHMuY29udGFpbnMoIklmLVVubW9kaWZpZWQtU2lu
Y2UiKSk7CisgICAgcmV0dXJuIChtX2h0dHBIZWFkZXJGaWVsZHMuY29udGFpbnMoSFRUUEhlYWRl
cnM6OklmTWF0Y2gpIHx8CisgICAgICAgICAgICBtX2h0dHBIZWFkZXJGaWVsZHMuY29udGFpbnMo
SFRUUEhlYWRlcnM6OklmTW9kaWZpZWRTaW5jZSkgfHwKKyAgICAgICAgICAgIG1faHR0cEhlYWRl
ckZpZWxkcy5jb250YWlucyhIVFRQSGVhZGVyczo6SWZOb25lTWF0Y2gpIHx8CisgICAgICAgICAg
ICBtX2h0dHBIZWFkZXJGaWVsZHMuY29udGFpbnMoSFRUUEhlYWRlcnM6OklmUmFuZ2UpIHx8Cisg
ICAgICAgICAgICBtX2h0dHBIZWFkZXJGaWVsZHMuY29udGFpbnMoSFRUUEhlYWRlcnM6OklmVW5t
b2RpZmllZFNpbmNlKSk7CiB9CiAKIHZvaWQgUmVzb3VyY2VSZXF1ZXN0QmFzZTo6dXBkYXRlUGxh
dGZvcm1SZXF1ZXN0KCkgY29uc3QKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNv
dXJjZVJlcXVlc3RCYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L1Jlc291cmNlUmVxdWVzdEJhc2UuaAkocmV2aXNpb24gNTExMzQpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvUmVzb3VyY2VSZXF1ZXN0QmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC03OSwy
NiArNzksMjggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICAKICAgICAgICAgY29uc3Qg
SFRUUEhlYWRlck1hcCYgaHR0cEhlYWRlckZpZWxkcygpIGNvbnN0OwogICAgICAgICBTdHJpbmcg
aHR0cEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkgY29uc3Q7CisgICAgICAg
IFN0cmluZyBodHRwSGVhZGVyRmllbGQoY29uc3QgY2hhciogbmFtZSkgY29uc3Q7CiAgICAgICAg
IHZvaWQgc2V0SFRUUEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiB2YWx1ZSk7CisgICAgICAgIHZvaWQgc2V0SFRUUEhlYWRlckZpZWxkKGNvbnN0IGNo
YXIqIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpIHsgc2V0SFRUUEhlYWRlckZpZWxkKEF0b21p
Y1N0cmluZyhuYW1lKSwgdmFsdWUpOyB9CiAgICAgICAgIHZvaWQgYWRkSFRUUEhlYWRlckZpZWxk
KGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CiAgICAgICAg
IHZvaWQgYWRkSFRUUEhlYWRlckZpZWxkcyhjb25zdCBIVFRQSGVhZGVyTWFwJiBoZWFkZXJGaWVs
ZHMpOwogICAgICAgICAKLSAgICAgICAgU3RyaW5nIGh0dHBDb250ZW50VHlwZSgpIGNvbnN0IHsg
cmV0dXJuIGh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1UeXBlIik7ICB9Ci0gICAgICAgIHZvaWQg
c2V0SFRUUENvbnRlbnRUeXBlKGNvbnN0IFN0cmluZyYgaHR0cENvbnRlbnRUeXBlKSB7IHNldEhU
VFBIZWFkZXJGaWVsZCgiQ29udGVudC1UeXBlIiwgaHR0cENvbnRlbnRUeXBlKTsgfQorICAgICAg
ICBTdHJpbmcgaHR0cENvbnRlbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gaHR0cEhlYWRlckZpZWxk
KEhUVFBIZWFkZXJzOjpDb250ZW50VHlwZSk7ICB9CisgICAgICAgIHZvaWQgc2V0SFRUUENvbnRl
bnRUeXBlKGNvbnN0IFN0cmluZyYgaHR0cENvbnRlbnRUeXBlKSB7IHNldEhUVFBIZWFkZXJGaWVs
ZChIVFRQSGVhZGVyczo6Q29udGVudFR5cGUsIGh0dHBDb250ZW50VHlwZSk7IH0KICAgICAgICAg
Ci0gICAgICAgIFN0cmluZyBodHRwUmVmZXJyZXIoKSBjb25zdCB7IHJldHVybiBodHRwSGVhZGVy
RmllbGQoIlJlZmVyZXIiKTsgfQotICAgICAgICB2b2lkIHNldEhUVFBSZWZlcnJlcihjb25zdCBT
dHJpbmcmIGh0dHBSZWZlcnJlcikgeyBzZXRIVFRQSGVhZGVyRmllbGQoIlJlZmVyZXIiLCBodHRw
UmVmZXJyZXIpOyB9CisgICAgICAgIFN0cmluZyBodHRwUmVmZXJyZXIoKSBjb25zdCB7IHJldHVy
biBodHRwSGVhZGVyRmllbGQoSFRUUEhlYWRlcnM6OlJlZmVyZXIpOyB9CisgICAgICAgIHZvaWQg
c2V0SFRUUFJlZmVycmVyKGNvbnN0IFN0cmluZyYgaHR0cFJlZmVycmVyKSB7IHNldEhUVFBIZWFk
ZXJGaWVsZChIVFRQSGVhZGVyczo6UmVmZXJlciwgaHR0cFJlZmVycmVyKTsgfQogICAgICAgICB2
b2lkIGNsZWFySFRUUFJlZmVycmVyKCk7CiAgICAgICAgIAotICAgICAgICBTdHJpbmcgaHR0cE9y
aWdpbigpIGNvbnN0IHsgcmV0dXJuIGh0dHBIZWFkZXJGaWVsZCgiT3JpZ2luIik7IH0KLSAgICAg
ICAgdm9pZCBzZXRIVFRQT3JpZ2luKGNvbnN0IFN0cmluZyYgaHR0cE9yaWdpbikgeyBzZXRIVFRQ
SGVhZGVyRmllbGQoIk9yaWdpbiIsIGh0dHBPcmlnaW4pOyB9CisgICAgICAgIFN0cmluZyBodHRw
T3JpZ2luKCkgY29uc3QgeyByZXR1cm4gaHR0cEhlYWRlckZpZWxkKEhUVFBIZWFkZXJzOjpPcmln
aW4pOyB9CisgICAgICAgIHZvaWQgc2V0SFRUUE9yaWdpbihjb25zdCBTdHJpbmcmIGh0dHBPcmln
aW4pIHsgc2V0SFRUUEhlYWRlckZpZWxkKEhUVFBIZWFkZXJzOjpPcmlnaW4sIGh0dHBPcmlnaW4p
OyB9CiAgICAgICAgIHZvaWQgY2xlYXJIVFRQT3JpZ2luKCk7CiAKLSAgICAgICAgU3RyaW5nIGh0
dHBVc2VyQWdlbnQoKSBjb25zdCB7IHJldHVybiBodHRwSGVhZGVyRmllbGQoIlVzZXItQWdlbnQi
KTsgfQotICAgICAgICB2b2lkIHNldEhUVFBVc2VyQWdlbnQoY29uc3QgU3RyaW5nJiBodHRwVXNl
ckFnZW50KSB7IHNldEhUVFBIZWFkZXJGaWVsZCgiVXNlci1BZ2VudCIsIGh0dHBVc2VyQWdlbnQp
OyB9CisgICAgICAgIFN0cmluZyBodHRwVXNlckFnZW50KCkgY29uc3QgeyByZXR1cm4gaHR0cEhl
YWRlckZpZWxkKEhUVFBIZWFkZXJzOjpVc2VyQWdlbnQpOyB9CisgICAgICAgIHZvaWQgc2V0SFRU
UFVzZXJBZ2VudChjb25zdCBTdHJpbmcmIGh0dHBVc2VyQWdlbnQpIHsgc2V0SFRUUEhlYWRlckZp
ZWxkKEhUVFBIZWFkZXJzOjpVc2VyQWdlbnQsIGh0dHBVc2VyQWdlbnQpOyB9CiAKLSAgICAgICAg
U3RyaW5nIGh0dHBBY2NlcHQoKSBjb25zdCB7IHJldHVybiBodHRwSGVhZGVyRmllbGQoIkFjY2Vw
dCIpOyB9Ci0gICAgICAgIHZvaWQgc2V0SFRUUEFjY2VwdChjb25zdCBTdHJpbmcmIGh0dHBBY2Nl
cHQpIHsgc2V0SFRUUEhlYWRlckZpZWxkKCJBY2NlcHQiLCBodHRwQWNjZXB0KTsgfQorICAgICAg
ICBTdHJpbmcgaHR0cEFjY2VwdCgpIGNvbnN0IHsgcmV0dXJuIGh0dHBIZWFkZXJGaWVsZChIVFRQ
SGVhZGVyczo6QWNjZXB0KTsgfQorICAgICAgICB2b2lkIHNldEhUVFBBY2NlcHQoY29uc3QgU3Ry
aW5nJiBodHRwQWNjZXB0KSB7IHNldEhUVFBIZWFkZXJGaWVsZChIVFRQSGVhZGVyczo6QWNjZXB0
LCBodHRwQWNjZXB0KTsgfQogCiAgICAgICAgIHZvaWQgc2V0UmVzcG9uc2VDb250ZW50RGlzcG9z
aXRpb25FbmNvZGluZ0ZhbGxiYWNrQXJyYXkoY29uc3QgU3RyaW5nJiBlbmNvZGluZzEsIGNvbnN0
IFN0cmluZyYgZW5jb2RpbmcyID0gU3RyaW5nKCksIGNvbnN0IFN0cmluZyYgZW5jb2RpbmczID0g
U3RyaW5nKCkpOwogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNw
b25zZUJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNv
dXJjZVJlc3BvbnNlQmFzZS5jcHAJKHJldmlzaW9uIDUxMTM0KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjM5
LDYgKzIzOSwxMyBAQCBTdHJpbmcgUmVzb3VyY2VSZXNwb25zZUJhc2U6Omh0dHBIZWFkZXJGCiAg
ICAgcmV0dXJuIG1faHR0cEhlYWRlckZpZWxkcy5nZXQobmFtZSk7IAogfQogCitTdHJpbmcgUmVz
b3VyY2VSZXNwb25zZUJhc2U6Omh0dHBIZWFkZXJGaWVsZChjb25zdCBjaGFyKiBuYW1lKSBjb25z
dAoreworICAgIGxhenlJbml0KCk7CisKKyAgICByZXR1cm4gbV9odHRwSGVhZGVyRmllbGRzLmdl
dChuYW1lKTsgCit9CisKIHZvaWQgUmVzb3VyY2VSZXNwb25zZUJhc2U6OnNldEhUVFBIZWFkZXJG
aWVsZChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpCiB7CiAg
ICAgbGF6eUluaXQoKTsKQEAgLTQzMCw2ICs0MzcsMTEgQEAgYm9vbCBSZXNvdXJjZVJlc3BvbnNl
QmFzZTo6aXNBdHRhY2htZW50KAogICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgQXRvbWlj
U3RyaW5nLCBhdHRhY2htZW50U3RyaW5nLCAoImF0dGFjaG1lbnQiKSk7CiAgICAgcmV0dXJuIGVx
dWFsSWdub3JpbmdDYXNlKHZhbHVlLCBhdHRhY2htZW50U3RyaW5nKTsKIH0KKworU3RyaW5nIFJl
c291cmNlUmVzcG9uc2VCYXNlOjpjb250ZW50VHlwZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGh0
dHBIZWFkZXJGaWVsZChIVFRQSGVhZGVyczo6Q29udGVudFR5cGUpOworfQogICAKIHZvaWQgUmVz
b3VyY2VSZXNwb25zZUJhc2U6OnNldExhc3RNb2RpZmllZERhdGUodGltZV90IGxhc3RNb2RpZmll
ZERhdGUpCiB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNwb25z
ZUJhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VS
ZXNwb25zZUJhc2UuaAkocmV2aXNpb24gNTExMzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvUmVzb3VyY2VSZXNwb25zZUJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNzEsNiArNzEsNyBA
QCBwdWJsaWM6CiAgICAgdm9pZCBzZXRIVFRQU3RhdHVzVGV4dChjb25zdCBTdHJpbmcmKTsKICAg
ICAKICAgICBTdHJpbmcgaHR0cEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkg
Y29uc3Q7CisgICAgU3RyaW5nIGh0dHBIZWFkZXJGaWVsZChjb25zdCBjaGFyKiBuYW1lKSBjb25z
dDsKICAgICB2b2lkIHNldEhUVFBIZWFkZXJGaWVsZChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUs
IGNvbnN0IFN0cmluZyYgdmFsdWUpOwogICAgIGNvbnN0IEhUVFBIZWFkZXJNYXAmIGh0dHBIZWFk
ZXJGaWVsZHMoKSBjb25zdDsKIApAQCAtNzgsNiArNzksOCBAQCBwdWJsaWM6CiAKICAgICBib29s
IGlzQXR0YWNobWVudCgpIGNvbnN0OwogICAgIAorICAgIFN0cmluZyBjb250ZW50VHlwZSgpIGNv
bnN0OworICAgIAogICAgIC8vIEZJWE1FOiBUaGVzZSBhcmUgdXNlZCBieSBQbHVnaW5TdHJlYW0g
b24gc29tZSBwbGF0Zm9ybXMuIENhbGN1bGF0aW9ucyBtYXkgZGlmZmVyIGZyb20ganVzdCByZXR1
cm5pbmcgcGxhaW4gTGFzdC1vZGlmaWVkIGhlYWRlci4KICAgICAvLyBMZWF2aW5nIGl0IGZvciBu
b3cgYnV0IHRoaXMgc2hvdWxkIGdvIGF3YXkgaW4gZmF2b3Igb2YgZ2VuZXJpYyBzb2x1dGlvbi4K
ICAgICB2b2lkIHNldExhc3RNb2RpZmllZERhdGUodGltZV90KTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43738</attachid>
            <date>2009-11-23 14:59:44 -0800</date>
            <delta_ts>2009-11-30 15:12:57 -0800</delta_ts>
            <desc>patch 2 (smaller)</desc>
            <filename>CStringAccess2.patch</filename>
            <type>text/plain</type>
            <size>15677</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUxMjUzKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMDktMTEtMjMgIEplbnMgQWxm
a2UgIDxzbmVqQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBBZGRlZCB2YXJpYW50cyBvZiBmaW5kL2NvbnRhaW5zL2FkZCB0aGF0
IGFsbG93IGEgZm9yZWlnbiBrZXkgdHlwZSB0byBiZSB1c2VkLgorICAgICAgICBUaGlzIHdpbGwg
YWxsb3cgQXRvbWljU3RyaW5nLWtleWVkIG1hcHMgdG8gYmUgcXVlcmllZCBieSBDIHN0cmluZyB3
aXRob3V0CisgICAgICAgIGhhdmluZyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgQXRvbWljU3RyaW5n
IChzZWUgSFRUUEhlYWRlck1hcC4pCisgICAgICAgIFRoZSBjb2RlIGZvciB0aGlzIGlzIGFkYXB0
ZWQgZnJvbSB0aGUgZXF1aXZhbGVudCBpbiBIYXNoU2V0LmguCisKKyAgICAgICAgKiB3dGYvSGFz
aE1hcC5oOgorICAgICAgICAoV1RGOjpIYXNoTWFwOjpmaW5kKToKKyAgICAgICAgKFdURjo6SGFz
aE1hcDo6Y29udGFpbnMpOgorICAgICAgICAoV1RGOjpIYXNoTWFwOjphZGQpOgorCiAyMDA5LTEx
LTE5ICBTdGV2ZSBCbG9jayAgPHN0ZXZlYmxvY2tAZ29vZ2xlLmNvbT4KIAogICAgICAgICBBbmRy
b2lkIHBvcnQgbGFja3MgY29uZmlndXJhdGlvbiBpbiBQbGF0Zm9ybS5oIGFuZCBjb25maWcuaC4K
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9IYXNoTWFwLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvd3RmL0hhc2hNYXAuaAkocmV2aXNpb24gNTEyNTMpCisrKyBKYXZhU2NyaXB0Q29y
ZS93dGYvSGFzaE1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC04Myw2ICs4MywyMyBAQCBuYW1lc3Bh
Y2UgV1RGIHsKIAogICAgICAgICBNYXBwZWRUeXBlIHRha2UoY29uc3QgS2V5VHlwZSYpOyAvLyBl
ZmZpY2llbnQgY29tYmluYXRpb24gb2YgZ2V0IHdpdGggcmVtb3ZlCiAKKyAgICAgICAgLy8gQW4g
YWx0ZXJuYXRlIHZlcnNpb24gb2YgZmluZCgpIHRoYXQgZmluZHMgdGhlIG9iamVjdCBieSBoYXNo
aW5nIGFuZCBjb21wYXJpbmcKKyAgICAgICAgLy8gd2l0aCBzb21lIG90aGVyIHR5cGUsIHRvIGF2
b2lkIHRoZSBjb3N0IG9mIHR5cGUgY29udmVyc2lvbi4gSGFzaFRyYW5zbGF0b3IKKyAgICAgICAg
Ly8gbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gbWVtYmVyczoKKyAgICAgICAgLy8g
ICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUJik7CisgICAgICAgIC8vICAgc3RhdGljIGJv
b2wgZXF1YWwoY29uc3QgVmFsdWVUeXBlJiwgY29uc3QgVCYpOworICAgICAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBULCB0eXBlbmFtZSBIYXNoVHJhbnNsYXRvcj4gaXRlcmF0b3IgZmluZChjb25zdCBU
Jik7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEhhc2hUcmFuc2xhdG9y
PiBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IFQmKSBjb25zdDsKKyAgICAgICAgdGVtcGxhdGU8
dHlwZW5hbWUgVCwgdHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+IGJvb2wgY29udGFpbnMoY29uc3Qg
VCYpIGNvbnN0OworICAgIAorICAgICAgICAvLyBBbiBhbHRlcm5hdGUgdmVyc2lvbiBvZiBhZGQo
KSB0aGF0IGZpbmRzIHRoZSBvYmplY3QgYnkgaGFzaGluZyBhbmQgY29tcGFyaW5nCisgICAgICAg
IC8vIHdpdGggc29tZSBvdGhlciB0eXBlLCB0byBhdm9pZCB0aGUgY29zdCBvZiB0eXBlIGNvbnZl
cnNpb24gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5CisgICAgICAgIC8vIGluIHRoZSB0YWJsZS4g
SGFzaFRyYW5zbGF0b3IgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgICAgICAg
Ly8gICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUJik7CisgICAgICAgIC8vICAgc3RhdGlj
IGJvb2wgZXF1YWwoY29uc3QgVmFsdWVUeXBlJiwgY29uc3QgVCYpOworICAgICAgICAvLyAgIHN0
YXRpYyB0cmFuc2xhdGUoVmFsdWVUeXBlJiwgY29uc3QgVCYsIHVuc2lnbmVkIGhhc2hDb2RlKTsK
KyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+IHBh
aXI8aXRlcmF0b3IsIGJvb2w+IGFkZChjb25zdCBUJiwgY29uc3QgTWFwcGVkVHlwZSYpOworCiAg
ICAgcHJpdmF0ZToKICAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gaW5saW5lQWRkKGNvbnN0
IEtleVR5cGUmLCBjb25zdCBNYXBwZWRUeXBlJik7CiAKQEAgLTEwNyw2ICsxMjQsMTkgQEAgbmFt
ZXNwYWNlIFdURiB7CiAgICAgICAgIH0KICAgICB9OwogCisgICAgdGVtcGxhdGU8dHlwZW5hbWUg
VmFsdWVUeXBlLCB0eXBlbmFtZSBWYWx1ZVRyYWl0cywgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVHJh
bnNsYXRvcj4KKyAgICBzdHJ1Y3QgSGFzaE1hcFRyYW5zbGF0b3JBZGFwdGVyIHsKKyAgICAgICAg
dHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OmZpcnN0X3R5cGUgS2V5VHlwZTsKKyAgICAgICAg
dHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OnNlY29uZF90eXBlIE1hcHBlZFR5cGU7CisgICAg
ICAgIAorICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUJiBrZXkpIHsgcmV0dXJu
IFRyYW5zbGF0b3I6Omhhc2goa2V5KTsgfQorICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25z
dCBLZXlUeXBlJiBhLCBjb25zdCBUJiBiKSB7IHJldHVybiBUcmFuc2xhdG9yOjplcXVhbChhLCBi
KTsgfQorICAgICAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoVmFsdWVUeXBlJiBsb2NhdGlvbiwg
Y29uc3QgVCYga2V5LCBjb25zdCBNYXBwZWRUeXBlJiwgdW5zaWduZWQgaGFzaENvZGUpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIFRyYW5zbGF0b3I6OnRyYW5zbGF0ZShsb2NhdGlvbi5maXJzdCwg
a2V5LCBoYXNoQ29kZSk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgdGVtcGxhdGU8dHlwZW5h
bWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgVywgdHlwZW5hbWUgWD4KICAg
ICBpbmxpbmUgdm9pZCBIYXNoTWFwPFQsIFUsIFYsIFcsIFg+Ojpzd2FwKEhhc2hNYXAmIG90aGVy
KQogICAgIHsKQEAgLTE3NCw2ICsyMDQsMzMgQEAgbmFtZXNwYWNlIFdURiB7CiAgICAgfQogCiAg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUg
VywgdHlwZW5hbWUgWD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFLCB0eXBlbmFtZSBIYXNo
VHJhbnNsYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgSGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6
aXRlcmF0b3IgCisgICAgSGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6ZmluZChjb25zdCBUWVBFJiB2
YWx1ZSkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgSGFzaE1hcFRyYW5zbGF0b3JBZGFwdGVyPFZh
bHVlVHlwZSwgVmFsdWVUcmFpdHMsIFRZUEUsIEhhc2hUcmFuc2xhdG9yPiBBZGFwdGVyOworICAg
ICAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIGZpbmQ8VFlQRSwgQWRhcHRlcj4odmFsdWUpOwor
ICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFYs
IHR5cGVuYW1lIFcsIHR5cGVuYW1lIFg+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFlQRSwgdHlw
ZW5hbWUgSGFzaFRyYW5zbGF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIEhhc2hNYXA8VCwgVSwg
ViwgVywgWD46OmNvbnN0X2l0ZXJhdG9yIAorICAgIEhhc2hNYXA8VCwgVSwgViwgVywgWD46OmZp
bmQoY29uc3QgVFlQRSYgdmFsdWUpIGNvbnN0CisgICAgeworICAgICAgICB0eXBlZGVmIEhhc2hN
YXBUcmFuc2xhdG9yQWRhcHRlcjxWYWx1ZVR5cGUsIFZhbHVlVHJhaXRzLCBUWVBFLCBIYXNoVHJh
bnNsYXRvcj4gQWRhcHRlcjsKKyAgICAgICAgcmV0dXJuIG1faW1wbC50ZW1wbGF0ZSBmaW5kPFRZ
UEUsIEFkYXB0ZXI+KHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0
eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYPgorICAgIHRlbXBs
YXRlPHR5cGVuYW1lIFRZUEUsIHR5cGVuYW1lIEhhc2hUcmFuc2xhdG9yPgorICAgIGlubGluZSBi
b29sIAorICAgIEhhc2hNYXA8VCwgVSwgViwgVywgWD46OmNvbnRhaW5zKGNvbnN0IFRZUEUmIHZh
bHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgdHlwZWRlZiBIYXNoTWFwVHJhbnNsYXRvckFkYXB0
ZXI8VmFsdWVUeXBlLCBWYWx1ZVRyYWl0cywgVFlQRSwgSGFzaFRyYW5zbGF0b3I+IEFkYXB0ZXI7
CisgICAgICAgIHJldHVybiBtX2ltcGwudGVtcGxhdGUgY29udGFpbnM8VFlQRSwgQWRhcHRlcj4o
dmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5
cGVuYW1lIFYsIHR5cGVuYW1lIFcsIHR5cGVuYW1lIFg+CiAgICAgaW5saW5lIHBhaXI8dHlwZW5h
bWUgSGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6aXRlcmF0b3IsIGJvb2w+CiAgICAgSGFzaE1hcDxU
LCBVLCBWLCBXLCBYPjo6aW5saW5lQWRkKGNvbnN0IEtleVR5cGUmIGtleSwgY29uc3QgTWFwcGVk
VHlwZSYgbWFwcGVkKSAKICAgICB7CkBAIC0xOTQsNiArMjUxLDE1IEBAIG5hbWVzcGFjZSBXVEYg
ewogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1l
IFYsIHR5cGVuYW1lIFcsIHR5cGVuYW1lIFg+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFlQRSwg
dHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+CisgICAgcGFpcjx0eXBlbmFtZSBIYXNoTWFwPFQsIFUs
IFYsIFcsIFg+OjppdGVyYXRvciwgYm9vbD4KKyAgICBIYXNoTWFwPFQsIFUsIFYsIFcsIFg+Ojph
ZGQoY29uc3QgVFlQRSYga2V5LCBjb25zdCBNYXBwZWRUeXBlJiB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIHR5cGVkZWYgSGFzaE1hcFRyYW5zbGF0b3JBZGFwdGVyPFZhbHVlVHlwZSwgVmFsdWVUcmFp
dHMsIFRZUEUsIEhhc2hUcmFuc2xhdG9yPiBBZGFwdGVyOworICAgICAgICByZXR1cm4gbV9pbXBs
LnRlbXBsYXRlIGFkZFBhc3NpbmdIYXNoQ29kZTxUWVBFLCBNYXBwZWRUeXBlLCBBZGFwdGVyPihr
ZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBV
LCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYPgogICAgIHBhaXI8dHlwZW5hbWUg
SGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6aXRlcmF0b3IsIGJvb2w+CiAgICAgSGFzaE1hcDxULCBV
LCBWLCBXLCBYPjo6YWRkKGNvbnN0IEtleVR5cGUmIGtleSwgY29uc3QgTWFwcGVkVHlwZSYgbWFw
cGVkKQogICAgIHsKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvQ2hhbmdlTG9nCShyZXZpc2lvbiA1MTMyMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMzUgQEAKKzIwMDktMTEtMjMgIEplbnMgQWxma2UgIDxzbmVq
QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBBZGQgY29udmVuaWVuY2UgbWV0aG9kcyB0byBFbGVtZW50IGFuZCBRdWFsaWZpZWRO
YW1lIHRoYXQgdGFrZQorICAgICAgICBjaGFyKiBpbnN0ZWFkIG9mIEF0b21pY1N0cmluZywgaW4g
cHJlcGFyYXRpb24gZm9yIHJlbW92aW5nIHRoZQorICAgICAgICBpbXBsaWNpdCBjb252ZXJzaW9u
IGJldHdlZW4gdGhlIHR3byB0eXBlcyAoMzAxODcpLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NDkKKworICAgICAgICAqIGRvbS9FbGVtZW50LmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnNldENTdHJpbmdBdHRyaWJ1dGUpOiAgRXF1
aXZhbGVudCB0byBzZXRBdHRyaWJ1dGUuCisgICAgICAgICogZG9tL0VsZW1lbnQuaDoKKyAgICAg
ICAgKiBkb20vUXVhbGlmaWVkTmFtZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpRdWFsaWZpZWRO
YW1lOjppbml0KTogIFNoYXJlZCBpbXBsIG9mIGJvdGggY29uc3RydWN0b3JzCisgICAgICAgIChX
ZWJDb3JlOjpRdWFsaWZpZWROYW1lOjpRdWFsaWZpZWROYW1lKTogIE5ldyBjJ3RvciB0YWtpbmcg
Y2hhciouCisgICAgICAgICogZG9tL1F1YWxpZmllZE5hbWUuaDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2FzZUZvbGRp
bmdDU3RyaW5nVHJhbnNsYXRvcik6ICBFbmFibGVzIGxvb2t1cCBieSBDIHN0cmluZworICAgICAg
ICAoV2ViQ29yZTo6SFRUUEhlYWRlck1hcDo6Z2V0KTogIE5ldyB2YXJpYW50IHRoYXQgdGFrZXMg
QyBzdHJpbmcKKyAgICAgICAgKFdlYkNvcmU6OkhUVFBIZWFkZXJNYXA6OmNvbnRhaW5zKTogIE5l
dyB2YXJpYW50IHRoYXQgdGFrZXMgQyBzdHJpbmcKKyAgICAgICAgKFdlYkNvcmU6OkhUVFBIZWFk
ZXJNYXA6OmFkZCk6ICBOZXcgdmFyaWFudCB0aGF0IHRha2VzIEMgc3RyaW5nCisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmg6CisgICAgICAgIChXZWJDb3JlOjpIVFRQ
SGVhZGVyTWFwOjpnZXQpOgorICAgICAgICAoV2ViQ29yZTo6SFRUUEhlYWRlck1hcDo6YWRkKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0QmFzZTo6aHR0cEhlYWRlckZpZWxkKTogIE5l
dyB2YXJpYW50IHRoYXQgdGFrZXMgQyBzdHJpbmcKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3Jr
L1Jlc291cmNlUmVxdWVzdEJhc2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVxdWVz
dEJhc2U6OnNldEhUVFBIZWFkZXJGaWVsZCk6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhlYWRl
cnMKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVzcG9uc2VCYXNlOjpodHRwSGVhZGVyRmllbGQp
OiAgTmV3IHZhcmlhbnQgdGhhdCB0YWtlcyBDIHN0cmluZworICAgICAgICAqIHBsYXRmb3JtL25l
dHdvcmsvUmVzb3VyY2VSZXNwb25zZUJhc2UuaDoKKwogMjAwOS0xMS0yMyAgRGlyayBTY2h1bHpl
ICA8a3JpdEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE9saXZlciBIdW50LgpJ
bmRleDogV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20v
RWxlbWVudC5jcHAJKHJldmlzaW9uIDUxMjUzKQorKysgV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEzNiw2ICsxMzYsMTEgQEAgdm9pZCBFbGVtZW50OjpzZXRBdHRy
aWJ1dGUoY29uc3QgUXVhbGlmaQogICAgIEV4Y2VwdGlvbkNvZGUgZWM7CiAgICAgc2V0QXR0cmli
dXRlKG5hbWUsIHZhbHVlLCBlYyk7CiB9CisgICAgCit2b2lkIEVsZW1lbnQ6OnNldENTdHJpbmdB
dHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3QgY2hhciogY1N0cmluZ1Zh
bHVlKSB7CisgICAgRXhjZXB0aW9uQ29kZSBlYzsKKyAgICBzZXRBdHRyaWJ1dGUobmFtZSwgQXRv
bWljU3RyaW5nKGNTdHJpbmdWYWx1ZSksIGVjKTsKK30KIAogdm9pZCBFbGVtZW50OjpzZXRCb29s
ZWFuQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGJvb2wgYikKIHsKSW5kZXg6
IFdlYkNvcmUvZG9tL0VsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9FbGVtZW50
LmgJKHJldmlzaW9uIDUxMjUzKQorKysgV2ViQ29yZS9kb20vRWxlbWVudC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xNjcsNiArMTY3LDkgQEAgcHVibGljOgogICAgIC8vIGNvbnZlbmllbmNlIG1ldGhv
ZHMgd2hpY2ggaWdub3JlIGV4Y2VwdGlvbnMKICAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBR
dWFsaWZpZWROYW1lJiwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSk7CiAgICAgdm9pZCBzZXRC
b29sZWFuQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGJvb2wpOworICAgIC8v
IFBsZWFzZSBkb24ndCB1c2Ugc2V0Q1N0cmluZ0F0dHJpYnV0ZSBpbiBwZXJmb3JtYW5jZS1zZW5z
aXRpdmUgY29kZTsKKyAgICAvLyB1c2UgYSBzdGF0aWMgQXRvbWljU3RyaW5nIHZhbHVlIGluc3Rl
YWQgdG8gYXZvaWQgdGhlIGNvbnZlcnNpb24gb3ZlcmhlYWQuCisgICAgdm9pZCBzZXRDU3RyaW5n
QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmLCBjb25zdCBjaGFyKiBjU3RyaW5nVmFsdWUp
OwogCiAgICAgdmlydHVhbCBOYW1lZE5vZGVNYXAqIGF0dHJpYnV0ZXMoKSBjb25zdDsKICAgICBO
YW1lZE5vZGVNYXAqIGF0dHJpYnV0ZXMoYm9vbCByZWFkb25seSkgY29uc3Q7CkluZGV4OiBXZWJD
b3JlL2RvbS9RdWFsaWZpZWROYW1lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9RdWFs
aWZpZWROYW1lLmNwcAkocmV2aXNpb24gNTEyNTMpCisrKyBXZWJDb3JlL2RvbS9RdWFsaWZpZWRO
YW1lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTEsNyArNTEsNyBAQCBzdHJ1Y3QgUU5hbWVDb21w
b25lbnRzVHJhbnNsYXRvciB7CiAKIHN0YXRpYyBRTmFtZVNldCogZ05hbWVDYWNoZTsKIAotUXVh
bGlmaWVkTmFtZTo6UXVhbGlmaWVkTmFtZShjb25zdCBBdG9taWNTdHJpbmcmIHAsIGNvbnN0IEF0
b21pY1N0cmluZyYgbCwgY29uc3QgQXRvbWljU3RyaW5nJiBuKQordm9pZCBRdWFsaWZpZWROYW1l
Ojppbml0KGNvbnN0IEF0b21pY1N0cmluZyYgcCwgY29uc3QgQXRvbWljU3RyaW5nJiBsLCBjb25z
dCBBdG9taWNTdHJpbmcmIG4pCiB7CiAgICAgaWYgKCFnTmFtZUNhY2hlKQogICAgICAgICBnTmFt
ZUNhY2hlID0gbmV3IFFOYW1lU2V0OwpAQCAtNjIsNiArNjIsMTYgQEAgUXVhbGlmaWVkTmFtZTo6
UXVhbGlmaWVkTmFtZShjb25zdCBBdG9taQogICAgICAgICBtX2ltcGwtPnJlZigpOwogfQogCitR
dWFsaWZpZWROYW1lOjpRdWFsaWZpZWROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgcCwgY29uc3Qg
QXRvbWljU3RyaW5nJiBsLCBjb25zdCBBdG9taWNTdHJpbmcmIG4pCit7CisgICAgaW5pdChwLCBs
LCBuKTsKK30KKworUXVhbGlmaWVkTmFtZTo6UXVhbGlmaWVkTmFtZShjb25zdCBBdG9taWNTdHJp
bmcmIHAsIGNvbnN0IGNoYXIqIGwsIGNvbnN0IEF0b21pY1N0cmluZyYgbikKK3sKKyAgICBpbml0
KHAsIEF0b21pY1N0cmluZyhsKSwgbik7Cit9CisKIHZvaWQgUXVhbGlmaWVkTmFtZTo6ZGVyZWYo
KQogewogI2lmZGVmIFFOQU1FX0RFRkFVTFRfQ09OU1RSVUNUT1IKSW5kZXg6IFdlYkNvcmUvZG9t
L1F1YWxpZmllZE5hbWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1l
LmgJKHJldmlzaW9uIDUxMjUzKQorKysgV2ViQ29yZS9kb20vUXVhbGlmaWVkTmFtZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC01Nyw2ICs1Nyw3IEBAIHB1YmxpYzoKICAgICB9OwogCiAgICAgUXVhbGlm
aWVkTmFtZShjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5nJiBs
b2NhbE5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKTsKKyAgICBRdWFsaWZp
ZWROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4LCBjb25zdCBjaGFyKiBsb2NhbE5hbWUs
IGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKTsKICAgICB+UXVhbGlmaWVkTmFtZSgp
IHsgZGVyZWYoKTsgfQogI2lmZGVmIFFOQU1FX0RFRkFVTFRfQ09OU1RSVUNUT1IKICAgICBRdWFs
aWZpZWROYW1lKCkgOiBtX2ltcGwoMCkgeyB9CkBAIC04OCw2ICs4OSw3IEBAIHB1YmxpYzoKICAg
ICBzdGF0aWMgdm9pZCBpbml0KCk7CiAgICAgCiBwcml2YXRlOgorICAgIHZvaWQgaW5pdChjb25z
dCBBdG9taWNTdHJpbmcmIHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUsIGNv
bnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKTsKICAgICB2b2lkIHJlZigpIGNvbnN0IHsg
bV9pbXBsLT5yZWYoKTsgfQogICAgIHZvaWQgZGVyZWYoKTsKICAgICAKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvSFRUUEhlYWRlck1hcC5jcHAJKHJldmlzaW9uIDUxMjUzKQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC01OSw1ICs1OSw0MSBAQCB2b2lkIEhUVFBIZWFkZXJNYXA6OmFkb3B0KGF1dG9fcHRyPENy
b3NzCiAgICAgICAgIHNldChoZWFkZXIuZmlyc3QsIGhlYWRlci5zZWNvbmQpOwogICAgIH0KIH0K
KyAgICAKKy8vIE1hZ2ljIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdGhlIEhhc2hNYXAgdG8gdGFrZSBD
IHN0cmluZ3MgYXMga2V5cy4KK3N0cnVjdCBDYXNlRm9sZGluZ0NTdHJpbmdUcmFuc2xhdG9yIHsK
KyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBjaGFyKiBjKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIENhc2VGb2xkaW5nSGFzaDo6aGFzaChjKTsKKyAgICB9CisgICAgCisgICAgc3RhdGlj
IGJvb2wgZXF1YWwoQXRvbWljU3RyaW5nIGtleSwgY29uc3QgY2hhciogcykKKyAgICB7CisgICAg
ICAgIHJldHVybiBlcXVhbElnbm9yaW5nQ2FzZShrZXkscyk7CisgICAgfQorICAgIAorICAgIHN0
YXRpYyB2b2lkIHRyYW5zbGF0ZShBdG9taWNTdHJpbmcmIGxvY2F0aW9uLCBjb25zdCBjaGFyKiBj
b25zdCYgYywgdW5zaWduZWQgLypoYXNoKi8pCisgICAgeworICAgICAgICBsb2NhdGlvbiA9IEF0
b21pY1N0cmluZyhjKTsKKyAgICB9Cit9OworCitTdHJpbmcgSFRUUEhlYWRlck1hcDo6Z2V0KGNv
bnN0IGNoYXIqIG5hbWUpIGNvbnN0Cit7CisgICAgY29uc3RfaXRlcmF0b3IgaSA9IGZpbmQ8Y29u
c3QgY2hhciosIENhc2VGb2xkaW5nQ1N0cmluZ1RyYW5zbGF0b3I+KG5hbWUpOworICAgIGlmIChp
ID09IGVuZCgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgZWxzZSAKKyAgICAgICAg
cmV0dXJuIGktPnNlY29uZDsKK30KKyAgICAKK2Jvb2wgSFRUUEhlYWRlck1hcDo6Y29udGFpbnMo
Y29uc3QgY2hhciogbmFtZSkgY29uc3QgeworICAgIHJldHVybiBmaW5kPGNvbnN0IGNoYXIqLCBD
YXNlRm9sZGluZ0NTdHJpbmdUcmFuc2xhdG9yPihuYW1lKSAhPSBlbmQoKTsKK30KKworcGFpcjxI
VFRQSGVhZGVyTWFwOjppdGVyYXRvciwgYm9vbD4gSFRUUEhlYWRlck1hcDo6YWRkKGNvbnN0IGNo
YXIgKm5hbWUsIFN0cmluZyB2YWx1ZSkKK3sKKyAgICByZXR1cm4gSGFzaE1hcDxBdG9taWNTdHJp
bmcsIFN0cmluZywgQ2FzZUZvbGRpbmdIYXNoPjo6YWRkPGNvbnN0IGNoYXIqLCBDYXNlRm9sZGlu
Z0NTdHJpbmdUcmFuc2xhdG9yPihuYW1lLCB2YWx1ZSk7Cit9CiAKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuaAkocmV2
aXNpb24gNTEyNTMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvSFRUUEhlYWRlck1hcC5o
CSh3b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSwyMiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAg
ICAgICAgIHN0ZDo6YXV0b19wdHI8Q3Jvc3NUaHJlYWRIVFRQSGVhZGVyTWFwRGF0YT4gY29weURh
dGEoKSBjb25zdDsKIAogICAgICAgICB2b2lkIGFkb3B0KHN0ZDo6YXV0b19wdHI8Q3Jvc3NUaHJl
YWRIVFRQSGVhZGVyTWFwRGF0YT4pOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGdldChjb25z
dCBBdG9taWNTdHJpbmcgJm5hbWUpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVy
biBIYXNoTWFwPEF0b21pY1N0cmluZywgU3RyaW5nLCBDYXNlRm9sZGluZ0hhc2g+OjpnZXQobmFt
ZSk7CisgICAgICAgIH0KKworICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPiBhZGQoQXRvbWlj
U3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJu
IEhhc2hNYXA8QXRvbWljU3RyaW5nLCBTdHJpbmcsIENhc2VGb2xkaW5nSGFzaD46OmFkZChuYW1l
LCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbHRlcm5hdGUgYWNjZXNzb3JzIHRo
YXQgYXJlIGZhc3RlciB0aGFuIGNvbnZlcnRpbmcgdGhlIGNoYXIqIHRvIEF0b21pY1N0cmluZyBm
aXJzdAorICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IGNoYXIqKSBjb25zdDsKKyAgICAgICAg
U3RyaW5nIGdldChjb25zdCBjaGFyKikgY29uc3Q7CisgICAgICAgIHBhaXI8aXRlcmF0b3IsIGJv
b2w+IGFkZChjb25zdCBjaGFyICpuYW1lLCBTdHJpbmcgdmFsdWUpOworICAgICAgICAKICAgICB9
OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvUmVzb3VyY2VSZXF1ZXN0QmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuY3BwCShyZXZpc2lvbiA1MTI1MykKKysrIFdl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlcXVlc3RCYXNlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjA4LDYgKzIwOCwxMyBAQCBTdHJpbmcgUmVzb3VyY2VSZXF1ZXN0QmFzZTo6aHR0
cEhlYWRlckZpCiAgICAgcmV0dXJuIG1faHR0cEhlYWRlckZpZWxkcy5nZXQobmFtZSk7CiB9CiAK
K1N0cmluZyBSZXNvdXJjZVJlcXVlc3RCYXNlOjpodHRwSGVhZGVyRmllbGQoY29uc3QgY2hhciog
bmFtZSkgY29uc3QKK3sKKyAgICB1cGRhdGVSZXNvdXJjZVJlcXVlc3QoKTsgCisgICAgCisgICAg
cmV0dXJuIG1faHR0cEhlYWRlckZpZWxkcy5nZXQobmFtZSk7Cit9CisKIHZvaWQgUmVzb3VyY2VS
ZXF1ZXN0QmFzZTo6c2V0SFRUUEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKIHsKICAgICB1cGRhdGVSZXNvdXJjZVJlcXVlc3QoKTsgCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXF1ZXN0QmFzZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlcXVlc3RCYXNlLmgJ
KHJldmlzaW9uIDUxMjUzKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVx
dWVzdEJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNzksNyArNzksOSBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAgICAgICAgIAogICAgICAgICBjb25zdCBIVFRQSGVhZGVyTWFwJiBodHRwSGVhZGVy
RmllbGRzKCkgY29uc3Q7CiAgICAgICAgIFN0cmluZyBodHRwSGVhZGVyRmllbGQoY29uc3QgQXRv
bWljU3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgICAgICAgU3RyaW5nIGh0dHBIZWFkZXJGaWVsZChj
b25zdCBjaGFyKiBuYW1lKSBjb25zdDsKICAgICAgICAgdm9pZCBzZXRIVFRQSGVhZGVyRmllbGQo
Y29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKKyAgICAgICAg
dm9pZCBzZXRIVFRQSGVhZGVyRmllbGQoY29uc3QgY2hhciogbmFtZSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSkgeyBzZXRIVFRQSGVhZGVyRmllbGQoQXRvbWljU3RyaW5nKG5hbWUpLCB2YWx1ZSk7IH0K
ICAgICAgICAgdm9pZCBhZGRIVFRQSGVhZGVyRmllbGQoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1l
LCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKICAgICAgICAgdm9pZCBhZGRIVFRQSGVhZGVyRmllbGRz
KGNvbnN0IEhUVFBIZWFkZXJNYXAmIGhlYWRlckZpZWxkcyk7CiAgICAgICAgIApJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNwb25zZUJhc2UuY3BwCShy
ZXZpc2lvbiA1MTI1MykKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlc3Bv
bnNlQmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzOSw2ICsyMzksMTMgQEAgU3RyaW5nIFJl
c291cmNlUmVzcG9uc2VCYXNlOjpodHRwSGVhZGVyRgogICAgIHJldHVybiBtX2h0dHBIZWFkZXJG
aWVsZHMuZ2V0KG5hbWUpOyAKIH0KIAorU3RyaW5nIFJlc291cmNlUmVzcG9uc2VCYXNlOjpodHRw
SGVhZGVyRmllbGQoY29uc3QgY2hhciogbmFtZSkgY29uc3QKK3sKKyAgICBsYXp5SW5pdCgpOwor
CisgICAgcmV0dXJuIG1faHR0cEhlYWRlckZpZWxkcy5nZXQobmFtZSk7IAorfQorCiB2b2lkIFJl
c291cmNlUmVzcG9uc2VCYXNlOjpzZXRIVFRQSGVhZGVyRmllbGQoY29uc3QgQXRvbWljU3RyaW5n
JiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQogewogICAgIGxhenlJbml0KCk7CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNwb25zZUJhc2UuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNwb25zZUJhc2UuaAkocmV2
aXNpb24gNTEyNTMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNwb25z
ZUJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNzEsNiArNzEsNyBAQCBwdWJsaWM6CiAgICAgdm9p
ZCBzZXRIVFRQU3RhdHVzVGV4dChjb25zdCBTdHJpbmcmKTsKICAgICAKICAgICBTdHJpbmcgaHR0
cEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkgY29uc3Q7CisgICAgU3RyaW5n
IGh0dHBIZWFkZXJGaWVsZChjb25zdCBjaGFyKiBuYW1lKSBjb25zdDsKICAgICB2b2lkIHNldEhU
VFBIZWFkZXJGaWVsZChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFs
dWUpOwogICAgIGNvbnN0IEhUVFBIZWFkZXJNYXAmIGh0dHBIZWFkZXJGaWVsZHMoKSBjb25zdDsK
IAo=
</data>
<flag name="review"
          id="25465"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44043</attachid>
            <date>2009-11-30 15:12:57 -0800</date>
            <delta_ts>2009-12-01 10:39:13 -0800</delta_ts>
            <desc>patch 3</desc>
            <filename>textmate stdin xT9ChZ.txt</filename>
            <type>text/plain</type>
            <size>15916</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCAyNGJhOTkzLi4xYzYxYmRmIDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcg
QEAKKzIwMDktMTEtMjQgIEplbnMgQWxma2UgIDxzbmVqQGNocm9taXVtLm9yZz4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRlZCB2YXJpYW50cyBv
ZiBmaW5kL2NvbnRhaW5zL2FkZCB0aGF0IGFsbG93IGEgZm9yZWlnbiBrZXkgdHlwZSB0byBiZSB1
c2VkLgorICAgICAgICBUaGlzIHdpbGwgYWxsb3cgQXRvbWljU3RyaW5nLWtleWVkIG1hcHMgdG8g
YmUgcXVlcmllZCBieSBDIHN0cmluZyB3aXRob3V0CisgICAgICAgIGhhdmluZyB0byBjcmVhdGUg
YSB0ZW1wb3JhcnkgQXRvbWljU3RyaW5nIChzZWUgSFRUUEhlYWRlck1hcC4pCisgICAgICAgIFRo
ZSBjb2RlIGZvciB0aGlzIGlzIGFkYXB0ZWQgZnJvbSB0aGUgZXF1aXZhbGVudCBpbiBIYXNoU2V0
LmguCisKKyAgICAgICAgKiB3dGYvSGFzaE1hcC5oOgorICAgICAgICAoV1RGOjpIYXNoTWFwOjpm
aW5kKToKKyAgICAgICAgKFdURjo6SGFzaE1hcDo6Y29udGFpbnMpOgorICAgICAgICAoV1RGOjpI
YXNoTWFwOjphZGQpOgorCiAyMDA5LTExLTI5ICBMYXN6bG8gR29tYm9zICA8bGFzemxvLjEuZ29t
Ym9zQG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBFcmljIFNlaWRlbC4KZGlmZiAt
LWdpdCBhL0phdmFTY3JpcHRDb3JlL3d0Zi9IYXNoTWFwLmggYi9KYXZhU2NyaXB0Q29yZS93dGYv
SGFzaE1hcC5oCmluZGV4IDNkZTVlZTYuLjBkZjQxZjQgMTAwNjQ0Ci0tLSBhL0phdmFTY3JpcHRD
b3JlL3d0Zi9IYXNoTWFwLmgKKysrIGIvSmF2YVNjcmlwdENvcmUvd3RmL0hhc2hNYXAuaApAQCAt
ODMsNiArODMsMjMgQEAgbmFtZXNwYWNlIFdURiB7CiAKICAgICAgICAgTWFwcGVkVHlwZSB0YWtl
KGNvbnN0IEtleVR5cGUmKTsgLy8gZWZmaWNpZW50IGNvbWJpbmF0aW9uIG9mIGdldCB3aXRoIHJl
bW92ZQogCisgICAgICAgIC8vIEFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIGZpbmQoKSB0aGF0IGZp
bmRzIHRoZSBvYmplY3QgYnkgaGFzaGluZyBhbmQgY29tcGFyaW5nCisgICAgICAgIC8vIHdpdGgg
c29tZSBvdGhlciB0eXBlLCB0byBhdm9pZCB0aGUgY29zdCBvZiB0eXBlIGNvbnZlcnNpb24uIEhh
c2hUcmFuc2xhdG9yCisgICAgICAgIC8vIG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9u
IG1lbWJlcnM6CisgICAgICAgIC8vICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgVCYpOwor
ICAgICAgICAvLyAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IFZhbHVlVHlwZSYsIGNvbnN0IFQm
KTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+
IGl0ZXJhdG9yIGZpbmQoY29uc3QgVCYpOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0
eXBlbmFtZSBIYXNoVHJhbnNsYXRvcj4gY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBUJikgY29u
c3Q7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEhhc2hUcmFuc2xhdG9y
PiBib29sIGNvbnRhaW5zKGNvbnN0IFQmKSBjb25zdDsKKyAgICAKKyAgICAgICAgLy8gQW4gYWx0
ZXJuYXRlIHZlcnNpb24gb2YgYWRkKCkgdGhhdCBmaW5kcyB0aGUgb2JqZWN0IGJ5IGhhc2hpbmcg
YW5kIGNvbXBhcmluZworICAgICAgICAvLyB3aXRoIHNvbWUgb3RoZXIgdHlwZSwgdG8gYXZvaWQg
dGhlIGNvc3Qgb2YgdHlwZSBjb252ZXJzaW9uIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeQorICAg
ICAgICAvLyBpbiB0aGUgdGFibGUuIEhhc2hUcmFuc2xhdG9yIG11c3QgaGF2ZSB0aGUgZm9sbG93
aW5nIG1ldGhvZHM6CisgICAgICAgIC8vICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgVCYp
OworICAgICAgICAvLyAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IFZhbHVlVHlwZSYsIGNvbnN0
IFQmKTsKKyAgICAgICAgLy8gICBzdGF0aWMgdHJhbnNsYXRlKFZhbHVlVHlwZSYsIGNvbnN0IFQm
LCB1bnNpZ25lZCBoYXNoQ29kZSk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVu
YW1lIEhhc2hUcmFuc2xhdG9yPiBwYWlyPGl0ZXJhdG9yLCBib29sPiBhZGQoY29uc3QgVCYsIGNv
bnN0IE1hcHBlZFR5cGUmKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIHBhaXI8aXRlcmF0b3Is
IGJvb2w+IGlubGluZUFkZChjb25zdCBLZXlUeXBlJiwgY29uc3QgTWFwcGVkVHlwZSYpOwogCkBA
IC0xMDcsNiArMTI0LDE5IEBAIG5hbWVzcGFjZSBXVEYgewogICAgICAgICB9CiAgICAgfTsKIAor
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgVmFsdWVUcmFpdHMsIHR5
cGVuYW1lIFQsIHR5cGVuYW1lIFRyYW5zbGF0b3I+CisgICAgc3RydWN0IEhhc2hNYXBUcmFuc2xh
dG9yQWRhcHRlciB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpmaXJzdF90
eXBlIEtleVR5cGU7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpzZWNvbmRf
dHlwZSBNYXBwZWRUeXBlOworICAgICAgICAKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2go
Y29uc3QgVCYga2V5KSB7IHJldHVybiBUcmFuc2xhdG9yOjpoYXNoKGtleSk7IH0KKyAgICAgICAg
c3RhdGljIGJvb2wgZXF1YWwoY29uc3QgS2V5VHlwZSYgYSwgY29uc3QgVCYgYikgeyByZXR1cm4g
VHJhbnNsYXRvcjo6ZXF1YWwoYSwgYik7IH0KKyAgICAgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRl
KFZhbHVlVHlwZSYgbG9jYXRpb24sIGNvbnN0IFQmIGtleSwgY29uc3QgTWFwcGVkVHlwZSYsIHVu
c2lnbmVkIGhhc2hDb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc2xhdG9yOjp0cmFu
c2xhdGUobG9jYXRpb24uZmlyc3QsIGtleSwgaGFzaENvZGUpOworICAgICAgICB9CisgICAgfTsK
KwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFYsIHR5cGVu
YW1lIFcsIHR5cGVuYW1lIFg+CiAgICAgaW5saW5lIHZvaWQgSGFzaE1hcDxULCBVLCBWLCBXLCBY
Pjo6c3dhcChIYXNoTWFwJiBvdGhlcikKICAgICB7CkBAIC0xNzQsNiArMjA0LDMzIEBAIG5hbWVz
cGFjZSBXVEYgewogICAgIH0KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUs
IHR5cGVuYW1lIFYsIHR5cGVuYW1lIFcsIHR5cGVuYW1lIFg+CisgICAgdGVtcGxhdGU8dHlwZW5h
bWUgVFlQRSwgdHlwZW5hbWUgSGFzaFRyYW5zbGF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIEhh
c2hNYXA8VCwgVSwgViwgVywgWD46Oml0ZXJhdG9yIAorICAgIEhhc2hNYXA8VCwgVSwgViwgVywg
WD46OmZpbmQoY29uc3QgVFlQRSYgdmFsdWUpCisgICAgeworICAgICAgICB0eXBlZGVmIEhhc2hN
YXBUcmFuc2xhdG9yQWRhcHRlcjxWYWx1ZVR5cGUsIFZhbHVlVHJhaXRzLCBUWVBFLCBIYXNoVHJh
bnNsYXRvcj4gQWRhcHRlcjsKKyAgICAgICAgcmV0dXJuIG1faW1wbC50ZW1wbGF0ZSBmaW5kPFRZ
UEUsIEFkYXB0ZXI+KHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0
eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYPgorICAgIHRlbXBs
YXRlPHR5cGVuYW1lIFRZUEUsIHR5cGVuYW1lIEhhc2hUcmFuc2xhdG9yPgorICAgIGlubGluZSB0
eXBlbmFtZSBIYXNoTWFwPFQsIFUsIFYsIFcsIFg+Ojpjb25zdF9pdGVyYXRvciAKKyAgICBIYXNo
TWFwPFQsIFUsIFYsIFcsIFg+OjpmaW5kKGNvbnN0IFRZUEUmIHZhbHVlKSBjb25zdAorICAgIHsK
KyAgICAgICAgdHlwZWRlZiBIYXNoTWFwVHJhbnNsYXRvckFkYXB0ZXI8VmFsdWVUeXBlLCBWYWx1
ZVRyYWl0cywgVFlQRSwgSGFzaFRyYW5zbGF0b3I+IEFkYXB0ZXI7CisgICAgICAgIHJldHVybiBt
X2ltcGwudGVtcGxhdGUgZmluZDxUWVBFLCBBZGFwdGVyPih2YWx1ZSk7CisgICAgfQorCisgICAg
dGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgVywg
dHlwZW5hbWUgWD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFLCB0eXBlbmFtZSBIYXNoVHJh
bnNsYXRvcj4KKyAgICBpbmxpbmUgYm9vbCAKKyAgICBIYXNoTWFwPFQsIFUsIFYsIFcsIFg+Ojpj
b250YWlucyhjb25zdCBUWVBFJiB2YWx1ZSkgY29uc3QKKyAgICB7CisgICAgICAgIHR5cGVkZWYg
SGFzaE1hcFRyYW5zbGF0b3JBZGFwdGVyPFZhbHVlVHlwZSwgVmFsdWVUcmFpdHMsIFRZUEUsIEhh
c2hUcmFuc2xhdG9yPiBBZGFwdGVyOworICAgICAgICByZXR1cm4gbV9pbXBsLnRlbXBsYXRlIGNv
bnRhaW5zPFRZUEUsIEFkYXB0ZXI+KHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYPgog
ICAgIGlubGluZSBwYWlyPHR5cGVuYW1lIEhhc2hNYXA8VCwgVSwgViwgVywgWD46Oml0ZXJhdG9y
LCBib29sPgogICAgIEhhc2hNYXA8VCwgVSwgViwgVywgWD46OmlubGluZUFkZChjb25zdCBLZXlU
eXBlJiBrZXksIGNvbnN0IE1hcHBlZFR5cGUmIG1hcHBlZCkgCiAgICAgewpAQCAtMTk0LDYgKzI1
MSwxNSBAQCBuYW1lc3BhY2UgV1RGIHsKICAgICB9CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
LCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBXLCB0eXBlbmFtZSBYPgorICAgIHRl
bXBsYXRlPHR5cGVuYW1lIFRZUEUsIHR5cGVuYW1lIEhhc2hUcmFuc2xhdG9yPgorICAgIHBhaXI8
dHlwZW5hbWUgSGFzaE1hcDxULCBVLCBWLCBXLCBYPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgSGFz
aE1hcDxULCBVLCBWLCBXLCBYPjo6YWRkKGNvbnN0IFRZUEUmIGtleSwgY29uc3QgTWFwcGVkVHlw
ZSYgdmFsdWUpCisgICAgeworICAgICAgICB0eXBlZGVmIEhhc2hNYXBUcmFuc2xhdG9yQWRhcHRl
cjxWYWx1ZVR5cGUsIFZhbHVlVHJhaXRzLCBUWVBFLCBIYXNoVHJhbnNsYXRvcj4gQWRhcHRlcjsK
KyAgICAgICAgcmV0dXJuIG1faW1wbC50ZW1wbGF0ZSBhZGRQYXNzaW5nSGFzaENvZGU8VFlQRSwg
TWFwcGVkVHlwZSwgQWRhcHRlcj4oa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgVywgdHlwZW5hbWUg
WD4KICAgICBwYWlyPHR5cGVuYW1lIEhhc2hNYXA8VCwgVSwgViwgVywgWD46Oml0ZXJhdG9yLCBi
b29sPgogICAgIEhhc2hNYXA8VCwgVSwgViwgVywgWD46OmFkZChjb25zdCBLZXlUeXBlJiBrZXks
IGNvbnN0IE1hcHBlZFR5cGUmIG1hcHBlZCkKICAgICB7CmRpZmYgLS1naXQgYS9XZWJDb3JlL0No
YW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDFjNDQyNTMuLjEyYWNkN2EgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMzUgQEAKKzIwMDktMTEtMjQgIEplbnMgQWxma2UgIDxzbmVqQGNocm9taXVtLm9yZz4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgY29udmVu
aWVuY2UgbWV0aG9kcyB0byBFbGVtZW50IGFuZCBRdWFsaWZpZWROYW1lIHRoYXQgdGFrZQorICAg
ICAgICBjaGFyKiBpbnN0ZWFkIG9mIEF0b21pY1N0cmluZywgaW4gcHJlcGFyYXRpb24gZm9yIHJl
bW92aW5nIHRoZQorICAgICAgICBpbXBsaWNpdCBjb252ZXJzaW9uIGJldHdlZW4gdGhlIHR3byB0
eXBlcyAoMzAxODcpLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MzE3NDkKKworICAgICAgICAqIGRvbS9FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OkVsZW1lbnQ6OnNldENTdHJpbmdBdHRyaWJ1dGUpOiAgRXF1aXZhbGVudCB0byBzZXRBdHRy
aWJ1dGUuCisgICAgICAgICogZG9tL0VsZW1lbnQuaDoKKyAgICAgICAgKiBkb20vUXVhbGlmaWVk
TmFtZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpRdWFsaWZpZWROYW1lOjppbml0KTogIFNoYXJl
ZCBpbXBsIG9mIGJvdGggY29uc3RydWN0b3JzCisgICAgICAgIChXZWJDb3JlOjpRdWFsaWZpZWRO
YW1lOjpRdWFsaWZpZWROYW1lKTogIE5ldyBjJ3RvciB0YWtpbmcgY2hhciouCisgICAgICAgICog
ZG9tL1F1YWxpZmllZE5hbWUuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFk
ZXJNYXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2FzZUZvbGRpbmdDU3RyaW5nVHJhbnNsYXRv
cik6ICBFbmFibGVzIGxvb2t1cCBieSBDIHN0cmluZworICAgICAgICAoV2ViQ29yZTo6SFRUUEhl
YWRlck1hcDo6Z2V0KTogIE5ldyB2YXJpYW50IHRoYXQgdGFrZXMgQyBzdHJpbmcKKyAgICAgICAg
KFdlYkNvcmU6OkhUVFBIZWFkZXJNYXA6OmNvbnRhaW5zKTogIE5ldyB2YXJpYW50IHRoYXQgdGFr
ZXMgQyBzdHJpbmcKKyAgICAgICAgKFdlYkNvcmU6OkhUVFBIZWFkZXJNYXA6OmFkZCk6ICBOZXcg
dmFyaWFudCB0aGF0IHRha2VzIEMgc3RyaW5nCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9I
VFRQSGVhZGVyTWFwLmg6CisgICAgICAgIChXZWJDb3JlOjpIVFRQSGVhZGVyTWFwOjpnZXQpOgor
ICAgICAgICAoV2ViQ29yZTo6SFRUUEhlYWRlck1hcDo6YWRkKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVz
b3VyY2VSZXF1ZXN0QmFzZTo6aHR0cEhlYWRlckZpZWxkKTogIE5ldyB2YXJpYW50IHRoYXQgdGFr
ZXMgQyBzdHJpbmcKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJh
c2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdEJhc2U6OnNldEhUVFBIZWFk
ZXJGaWVsZCk6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhlYWRlcnMKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OlJlc291cmNlUmVzcG9uc2VCYXNlOjpodHRwSGVhZGVyRmllbGQpOiAgTmV3IHZhcmlhbnQgdGhh
dCB0YWtlcyBDIHN0cmluZworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNw
b25zZUJhc2UuaDoKKwogMjAwOS0xMS0yOCAgT2xpdmVyIEh1bnQgIDxvbGl2ZXJAYXBwbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L2RvbS9FbGVtZW50LmNwcCBiL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCmluZGV4IDRhZGU0Mzku
LmQ3ZjFiMTEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCisrKyBiL1dlYkNv
cmUvZG9tL0VsZW1lbnQuY3BwCkBAIC0xMzYsNiArMTM2LDEyIEBAIHZvaWQgRWxlbWVudDo6c2V0
QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYg
dmFsdWUpCiAgICAgRXhjZXB0aW9uQ29kZSBlYzsKICAgICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFs
dWUsIGVjKTsKIH0KKyAgICAKK3ZvaWQgRWxlbWVudDo6c2V0Q1N0cmluZ0F0dHJpYnV0ZShjb25z
dCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBjaGFyKiBjU3RyaW5nVmFsdWUpCit7CisgICAg
RXhjZXB0aW9uQ29kZSBlYzsKKyAgICBzZXRBdHRyaWJ1dGUobmFtZSwgQXRvbWljU3RyaW5nKGNT
dHJpbmdWYWx1ZSksIGVjKTsKK30KIAogdm9pZCBFbGVtZW50OjpzZXRCb29sZWFuQXR0cmlidXRl
KGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGJvb2wgYikKIHsKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvZG9tL0VsZW1lbnQuaCBiL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAppbmRleCBkMjc5NzZhLi45
N2QzZWI0IDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9FbGVtZW50LmgKKysrIGIvV2ViQ29yZS9k
b20vRWxlbWVudC5oCkBAIC0xNjcsNiArMTY3LDkgQEAgcHVibGljOgogICAgIC8vIGNvbnZlbmll
bmNlIG1ldGhvZHMgd2hpY2ggaWdub3JlIGV4Y2VwdGlvbnMKICAgICB2b2lkIHNldEF0dHJpYnV0
ZShjb25zdCBRdWFsaWZpZWROYW1lJiwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSk7CiAgICAg
dm9pZCBzZXRCb29sZWFuQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGJvb2wp
OworICAgIC8vIFBsZWFzZSBkb24ndCB1c2Ugc2V0Q1N0cmluZ0F0dHJpYnV0ZSBpbiBwZXJmb3Jt
YW5jZS1zZW5zaXRpdmUgY29kZTsKKyAgICAvLyB1c2UgYSBzdGF0aWMgQXRvbWljU3RyaW5nIHZh
bHVlIGluc3RlYWQgdG8gYXZvaWQgdGhlIGNvbnZlcnNpb24gb3ZlcmhlYWQuCisgICAgdm9pZCBz
ZXRDU3RyaW5nQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmLCBjb25zdCBjaGFyKiBjU3Ry
aW5nVmFsdWUpOwogCiAgICAgdmlydHVhbCBOYW1lZE5vZGVNYXAqIGF0dHJpYnV0ZXMoKSBjb25z
dDsKICAgICBOYW1lZE5vZGVNYXAqIGF0dHJpYnV0ZXMoYm9vbCByZWFkb25seSkgY29uc3Q7CmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2RvbS9RdWFsaWZpZWROYW1lLmNwcCBiL1dlYkNvcmUvZG9tL1F1
YWxpZmllZE5hbWUuY3BwCmluZGV4IDJjNWYzOWEuLjc5NWJkYjYgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvZG9tL1F1YWxpZmllZE5hbWUuY3BwCisrKyBiL1dlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUu
Y3BwCkBAIC01MSw3ICs1MSw3IEBAIHN0cnVjdCBRTmFtZUNvbXBvbmVudHNUcmFuc2xhdG9yIHsK
IAogc3RhdGljIFFOYW1lU2V0KiBnTmFtZUNhY2hlOwogCi1RdWFsaWZpZWROYW1lOjpRdWFsaWZp
ZWROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgcCwgY29uc3QgQXRvbWljU3RyaW5nJiBsLCBjb25z
dCBBdG9taWNTdHJpbmcmIG4pCit2b2lkIFF1YWxpZmllZE5hbWU6OmluaXQoY29uc3QgQXRvbWlj
U3RyaW5nJiBwLCBjb25zdCBBdG9taWNTdHJpbmcmIGwsIGNvbnN0IEF0b21pY1N0cmluZyYgbikK
IHsKICAgICBpZiAoIWdOYW1lQ2FjaGUpCiAgICAgICAgIGdOYW1lQ2FjaGUgPSBuZXcgUU5hbWVT
ZXQ7CkBAIC02Miw2ICs2MiwxNiBAQCBRdWFsaWZpZWROYW1lOjpRdWFsaWZpZWROYW1lKGNvbnN0
IEF0b21pY1N0cmluZyYgcCwgY29uc3QgQXRvbWljU3RyaW5nJiBsLCBjb25zdAogICAgICAgICBt
X2ltcGwtPnJlZigpOwogfQogCitRdWFsaWZpZWROYW1lOjpRdWFsaWZpZWROYW1lKGNvbnN0IEF0
b21pY1N0cmluZyYgcCwgY29uc3QgQXRvbWljU3RyaW5nJiBsLCBjb25zdCBBdG9taWNTdHJpbmcm
IG4pCit7CisgICAgaW5pdChwLCBsLCBuKTsKK30KKworUXVhbGlmaWVkTmFtZTo6UXVhbGlmaWVk
TmFtZShjb25zdCBBdG9taWNTdHJpbmcmIHAsIGNvbnN0IGNoYXIqIGwsIGNvbnN0IEF0b21pY1N0
cmluZyYgbikKK3sKKyAgICBpbml0KHAsIEF0b21pY1N0cmluZyhsKSwgbik7Cit9CisKIHZvaWQg
UXVhbGlmaWVkTmFtZTo6ZGVyZWYoKQogewogI2lmZGVmIFFOQU1FX0RFRkFVTFRfQ09OU1RSVUNU
T1IKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL1F1YWxpZmllZE5hbWUuaCBiL1dlYkNvcmUvZG9t
L1F1YWxpZmllZE5hbWUuaAppbmRleCBmZDMwNzllLi5hN2UxZmNiIDEwMDY0NAotLS0gYS9XZWJD
b3JlL2RvbS9RdWFsaWZpZWROYW1lLmgKKysrIGIvV2ViQ29yZS9kb20vUXVhbGlmaWVkTmFtZS5o
CkBAIC01Nyw2ICs1Nyw3IEBAIHB1YmxpYzoKICAgICB9OwogCiAgICAgUXVhbGlmaWVkTmFtZShj
b25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUs
IGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKTsKKyAgICBRdWFsaWZpZWROYW1lKGNv
bnN0IEF0b21pY1N0cmluZyYgcHJlZml4LCBjb25zdCBjaGFyKiBsb2NhbE5hbWUsIGNvbnN0IEF0
b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKTsKICAgICB+UXVhbGlmaWVkTmFtZSgpIHsgZGVyZWYo
KTsgfQogI2lmZGVmIFFOQU1FX0RFRkFVTFRfQ09OU1RSVUNUT1IKICAgICBRdWFsaWZpZWROYW1l
KCkgOiBtX2ltcGwoMCkgeyB9CkBAIC04OCw2ICs4OSw3IEBAIHB1YmxpYzoKICAgICBzdGF0aWMg
dm9pZCBpbml0KCk7CiAgICAgCiBwcml2YXRlOgorICAgIHZvaWQgaW5pdChjb25zdCBBdG9taWNT
dHJpbmcmIHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUsIGNvbnN0IEF0b21p
Y1N0cmluZyYgbmFtZXNwYWNlVVJJKTsKICAgICB2b2lkIHJlZigpIGNvbnN0IHsgbV9pbXBsLT5y
ZWYoKTsgfQogICAgIHZvaWQgZGVyZWYoKTsKICAgICAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9IVFRQSGVhZGVyTWFwLmNwcAppbmRleCAwN2M2NmU4Li5lOWM1YTBmIDEwMDY0NAotLS0gYS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvSFRUUEhlYWRlck1hcC5jcHAKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuY3BwCkBAIC01OSw1ICs1OSw0MSBAQCB2b2lk
IEhUVFBIZWFkZXJNYXA6OmFkb3B0KGF1dG9fcHRyPENyb3NzVGhyZWFkSFRUUEhlYWRlck1hcERh
dGE+IGRhdGEpCiAgICAgICAgIHNldChoZWFkZXIuZmlyc3QsIGhlYWRlci5zZWNvbmQpOwogICAg
IH0KIH0KKyAgICAKKy8vIEFkYXB0ZXIgdGhhdCBhbGxvd3MgdGhlIEhhc2hNYXAgdG8gdGFrZSBD
IHN0cmluZ3MgYXMga2V5cy4KK3N0cnVjdCBDYXNlRm9sZGluZ0NTdHJpbmdUcmFuc2xhdG9yIHsK
KyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBjaGFyKiBjU3RyaW5nKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIENhc2VGb2xkaW5nSGFzaDo6aGFzaChjU3RyaW5nLCBzdHJsZW4oY1N0cmlu
ZykpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBBdG9taWNTdHJp
bmcmIGtleSwgY29uc3QgY2hhciogY1N0cmluZykKKyAgICB7CisgICAgICAgIHJldHVybiBlcXVh
bElnbm9yaW5nQ2FzZShrZXksIGNTdHJpbmcpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgdm9p
ZCB0cmFuc2xhdGUoQXRvbWljU3RyaW5nJiBsb2NhdGlvbiwgY29uc3QgY2hhciogY1N0cmluZywg
dW5zaWduZWQgLypoYXNoKi8pCisgICAgeworICAgICAgICBsb2NhdGlvbiA9IEF0b21pY1N0cmlu
ZyhjU3RyaW5nKTsKKyAgICB9Cit9OworCitTdHJpbmcgSFRUUEhlYWRlck1hcDo6Z2V0KGNvbnN0
IGNoYXIqIG5hbWUpIGNvbnN0Cit7CisgICAgY29uc3RfaXRlcmF0b3IgaSA9IGZpbmQ8Y29uc3Qg
Y2hhciosIENhc2VGb2xkaW5nQ1N0cmluZ1RyYW5zbGF0b3I+KG5hbWUpOworICAgIGlmIChpID09
IGVuZCgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgcmV0dXJuIGktPnNlY29uZDsK
K30KKyAgICAKK2Jvb2wgSFRUUEhlYWRlck1hcDo6Y29udGFpbnMoY29uc3QgY2hhciogbmFtZSkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZmluZDxjb25zdCBjaGFyKiwgQ2FzZUZvbGRpbmdDU3RyaW5n
VHJhbnNsYXRvcj4obmFtZSkgIT0gZW5kKCk7Cit9CisKK3BhaXI8SFRUUEhlYWRlck1hcDo6aXRl
cmF0b3IsIGJvb2w+IEhUVFBIZWFkZXJNYXA6OmFkZChjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBT
dHJpbmcgJnZhbHVlKQoreworICAgIHJldHVybiBIYXNoTWFwPEF0b21pY1N0cmluZywgU3RyaW5n
LCBDYXNlRm9sZGluZ0hhc2g+OjphZGQ8Y29uc3QgY2hhciosIENhc2VGb2xkaW5nQ1N0cmluZ1Ry
YW5zbGF0b3I+KG5hbWUsIHZhbHVlKTsKK30KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuaCBiL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9IVFRQSGVhZGVyTWFwLmgKaW5kZXggNmRhMWI5MC4uNTVmYzU2
YSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBIZWFkZXJNYXAuaAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvSFRUUEhlYWRlck1hcC5oCkBAIC00NSw2ICs0
NSwyMiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHN0ZDo6YXV0b19wdHI8Q3Jvc3NU
aHJlYWRIVFRQSGVhZGVyTWFwRGF0YT4gY29weURhdGEoKSBjb25zdDsKIAogICAgICAgICB2b2lk
IGFkb3B0KHN0ZDo6YXV0b19wdHI8Q3Jvc3NUaHJlYWRIVFRQSGVhZGVyTWFwRGF0YT4pOworICAg
ICAgICAKKyAgICAgICAgU3RyaW5nIGdldChjb25zdCBBdG9taWNTdHJpbmcgJm5hbWUpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIYXNoTWFwPEF0b21pY1N0cmluZywgU3Ry
aW5nLCBDYXNlRm9sZGluZ0hhc2g+OjpnZXQobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBw
YWlyPGl0ZXJhdG9yLCBib29sPiBhZGQoY29uc3QgQXRvbWljU3RyaW5nICZuYW1lLCBjb25zdCBT
dHJpbmcgJnZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSGFzaE1hcDxBdG9t
aWNTdHJpbmcsIFN0cmluZywgQ2FzZUZvbGRpbmdIYXNoPjo6YWRkKG5hbWUsIHZhbHVlKTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIEFsdGVybmF0ZSBhY2Nlc3NvcnMgdGhhdCBhcmUgZmFzdGVy
IHRoYW4gY29udmVydGluZyB0aGUgY2hhciogdG8gQXRvbWljU3RyaW5nIGZpcnN0CisgICAgICAg
IGJvb2wgY29udGFpbnMoY29uc3QgY2hhciopIGNvbnN0OworICAgICAgICBTdHJpbmcgZ2V0KGNv
bnN0IGNoYXIqKSBjb25zdDsKKyAgICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4gYWRkKGNvbnN0
IGNoYXIqIG5hbWUsIGNvbnN0IFN0cmluZyAmdmFsdWUpOworICAgICAgICAKICAgICB9OwogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvUmVzb3VyY2VSZXF1ZXN0QmFzZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVz
b3VyY2VSZXF1ZXN0QmFzZS5jcHAKaW5kZXggZTA3MDdkOS4uNGQ5YzEwMiAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuY3BwCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlcXVlc3RCYXNlLmNwcApAQCAtMjA4LDYg
KzIwOCwxMyBAQCBTdHJpbmcgUmVzb3VyY2VSZXF1ZXN0QmFzZTo6aHR0cEhlYWRlckZpZWxkKGNv
bnN0IEF0b21pY1N0cmluZyYgbmFtZSkgY29uc3QKICAgICByZXR1cm4gbV9odHRwSGVhZGVyRmll
bGRzLmdldChuYW1lKTsKIH0KIAorU3RyaW5nIFJlc291cmNlUmVxdWVzdEJhc2U6Omh0dHBIZWFk
ZXJGaWVsZChjb25zdCBjaGFyKiBuYW1lKSBjb25zdAoreworICAgIHVwZGF0ZVJlc291cmNlUmVx
dWVzdCgpOyAKKyAgICAKKyAgICByZXR1cm4gbV9odHRwSGVhZGVyRmllbGRzLmdldChuYW1lKTsK
K30KKwogdm9pZCBSZXNvdXJjZVJlcXVlc3RCYXNlOjpzZXRIVFRQSGVhZGVyRmllbGQoY29uc3Qg
QXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQogewogICAgIHVwZGF0ZVJl
c291cmNlUmVxdWVzdCgpOyAKQEAgLTIxOCw2ICsyMjUsMTEgQEAgdm9pZCBSZXNvdXJjZVJlcXVl
c3RCYXNlOjpzZXRIVFRQSGVhZGVyRmllbGQoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25z
dCBTdHIKICAgICAgICAgbV9wbGF0Zm9ybVJlcXVlc3RVcGRhdGVkID0gZmFsc2U7CiB9CiAKK3Zv
aWQgUmVzb3VyY2VSZXF1ZXN0QmFzZTo6c2V0SFRUUEhlYWRlckZpZWxkKGNvbnN0IGNoYXIqIG5h
bWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgc2V0SFRUUEhlYWRlckZpZWxkKEF0b21p
Y1N0cmluZyhuYW1lKSwgdmFsdWUpOworfQorCiB2b2lkIFJlc291cmNlUmVxdWVzdEJhc2U6OmNs
ZWFySFRUUFJlZmVycmVyKCkKIHsKICAgICB1cGRhdGVSZXNvdXJjZVJlcXVlc3QoKTsgCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXF1ZXN0QmFzZS5oIGIv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVxdWVzdEJhc2UuaAppbmRleCBmOGUx
ZDQ2Li40NjZiNDg3IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3Vy
Y2VSZXF1ZXN0QmFzZS5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJl
cXVlc3RCYXNlLmgKQEAgLTc5LDcgKzc5LDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAg
ICAKICAgICAgICAgY29uc3QgSFRUUEhlYWRlck1hcCYgaHR0cEhlYWRlckZpZWxkcygpIGNvbnN0
OwogICAgICAgICBTdHJpbmcgaHR0cEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0cmluZyYgbmFt
ZSkgY29uc3Q7CisgICAgICAgIFN0cmluZyBodHRwSGVhZGVyRmllbGQoY29uc3QgY2hhciogbmFt
ZSkgY29uc3Q7CiAgICAgICAgIHZvaWQgc2V0SFRUUEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisgICAgICAgIHZvaWQgc2V0SFRUUEhl
YWRlckZpZWxkKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpOwogICAgICAg
ICB2b2lkIGFkZEhUVFBIZWFkZXJGaWVsZChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0
IFN0cmluZyYgdmFsdWUpOwogICAgICAgICB2b2lkIGFkZEhUVFBIZWFkZXJGaWVsZHMoY29uc3Qg
SFRUUEhlYWRlck1hcCYgaGVhZGVyRmllbGRzKTsKICAgICAgICAgCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNwb25zZUJhc2UuY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNlLmNwcAppbmRleCBmZDQ0MjI1Li5m
OWNkMjcxIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VSZXNw
b25zZUJhc2UuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlc3Bv
bnNlQmFzZS5jcHAKQEAgLTIzOSw2ICsyMzksMTMgQEAgU3RyaW5nIFJlc291cmNlUmVzcG9uc2VC
YXNlOjpodHRwSGVhZGVyRmllbGQoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKSBjb25zdAogICAg
IHJldHVybiBtX2h0dHBIZWFkZXJGaWVsZHMuZ2V0KG5hbWUpOyAKIH0KIAorU3RyaW5nIFJlc291
cmNlUmVzcG9uc2VCYXNlOjpodHRwSGVhZGVyRmllbGQoY29uc3QgY2hhciogbmFtZSkgY29uc3QK
K3sKKyAgICBsYXp5SW5pdCgpOworCisgICAgcmV0dXJuIG1faHR0cEhlYWRlckZpZWxkcy5nZXQo
bmFtZSk7IAorfQorCiB2b2lkIFJlc291cmNlUmVzcG9uc2VCYXNlOjpzZXRIVFRQSGVhZGVyRmll
bGQoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQogewogICAg
IGxhenlJbml0KCk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3Vy
Y2VSZXNwb25zZUJhc2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlc3Bv
bnNlQmFzZS5oCmluZGV4IDc1OTRjMDkuLmUwNmM2ZjggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9SZXNvdXJjZVJlc3BvbnNlQmFzZS5oCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9SZXNvdXJjZVJlc3BvbnNlQmFzZS5oCkBAIC03MSw2ICs3MSw3IEBAIHB1Ymxp
YzoKICAgICB2b2lkIHNldEhUVFBTdGF0dXNUZXh0KGNvbnN0IFN0cmluZyYpOwogICAgIAogICAg
IFN0cmluZyBodHRwSGVhZGVyRmllbGQoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKSBjb25zdDsK
KyAgICBTdHJpbmcgaHR0cEhlYWRlckZpZWxkKGNvbnN0IGNoYXIqIG5hbWUpIGNvbnN0OwogICAg
IHZvaWQgc2V0SFRUUEhlYWRlckZpZWxkKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiB2YWx1ZSk7CiAgICAgY29uc3QgSFRUUEhlYWRlck1hcCYgaHR0cEhlYWRlckZpZWxk
cygpIGNvbnN0OwogCg==
</data>
<flag name="review"
          id="25815"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>