<?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>7450</bug_id>
          
          <creation_ts>2006-02-24 16:32:14 -0800</creation_ts>
          <short_desc>elementAtPoint is expensive and should return a smart dictionary</short_desc>
          <delta_ts>2006-03-01 10:05:27 -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>WebKit API</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Timothy Hatcher">timothy</reporter>
          <assigned_to name="Timothy Hatcher">timothy</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>33895</commentid>
    <comment_count>0</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2006-02-24 16:32:14 -0800</bug_when>
    <thetext>The elementAtPoint method returns a dictionary of 12 objects, this is a very hot method that is called during mouse moves. When hovering over an image, an NSImage is allocated and inserted into the returned dictionary, even though it is hardly used. We should return a smart dictionary that requests objects from the DOM as they are requested.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>33896</commentid>
    <comment_count>1</comment_count>
      <attachid>6706</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2006-02-24 16:34:11 -0800</bug_when>
    <thetext>Created attachment 6706
Implementation using a smart dictionary</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>33897</commentid>
    <comment_count>2</comment_count>
      <attachid>6706</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-02-24 17:02:43 -0800</bug_when>
    <thetext>Comment on attachment 6706
Implementation using a smart dictionary

titleDisplayString and other similar methods should get the backslashAsCurrencySymbol from the Frame rather than the renderer. This doesn&apos;t depend on rendering at all.

absoluteImageURL and similar functions need to make the NSURL using KURL, since that code path uses the appropriate NSURL/CFURL method. URLWithString: won&apos;t always work.

I suggest getNodesAtPoint: as the beginning of the method name. I think I&apos;ve noticed AppKit/Foundation methods that return multiple values using pointers with a get prefix. In fact, you might want to pass the point last so it&apos;s &quot;get these things, given this thing&quot; (ForPoint: or AtPoint:).

No need for all those nil checks in nodesAtPoint.

Please split innerNode, innerNonSharedNode, and URLElement into separate lines, and set all 3 to nil -- if bridge is nil you want to get nil for all 3, so please do set all 3 to nil.

nodesAtPoint and init for WebElementDictionary should do the nodes in the same order. Currently they don&apos;t.

WebElementDictionary was not included with the patch -- please add it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>33900</commentid>
    <comment_count>3</comment_count>
      <attachid>6708</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2006-02-24 17:36:22 -0800</bug_when>
    <thetext>Created attachment 6708
Implementation using a smart dictionary (round 2)

Addresses Darin&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>33905</commentid>
    <comment_count>4</comment_count>
      <attachid>6708</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-02-24 18:18:49 -0800</bug_when>
    <thetext>Comment on attachment 6708
Implementation using a smart dictionary (round 2)

If you look at Frame::backslashAsCurrencySymbol, you&apos;ll see that it&apos;s all done through the document. So this code can be written so that it works even when there&apos;s no Frame. Sorry I didn&apos;t notice that before. Please do that. Perhaps you could put the function in DocumentImpl, or you could just do the document()-&gt;decoder()-&gt;codec() thing yourself.

Identifiers like _WebElementSelf should not start with an underscore. First of all, there&apos;s no need to worry about conflict with end-user stuff since they are internal to the framework and the source file. Second, underscore followed by capital letter is reserved for the system and library.

In WebElementMethodMap, the &quot;object&quot; should be the enumeration type, not unsigned. I also suggest naming that structure WebElementMethod, since it&apos;s not a map.

I think NSMapTable is deprecated -- they encourage using CFDictionary instead, and that seems pretty easy to do. Or you could use an NSDictionary with NSValue for the values. But I could be wrong on this.

Inside WebKit files, #import &quot;&quot; is fine for WebKit headers. Some older files do #import &lt;WebKit/&gt;, but that&apos;s overkill.

All those checks after calling malloc on each node in initializeLookupTable aren&apos;t needed. When you&apos;re doing a small malloc during initialization checking the return value of malloc isn&apos;t really helpful. I don&apos;t think that function needs to have a return value.

Since the pattern malloc, set up, insert into map is repeated over and over again, I suggest making a function to do it, or putting the values into an array and then looping through the array to insert into the map.

The dealloc method doesn&apos;t have to nil things out, probably best not to.

+    else if(mapItem-&gt;object == _WebElementInnerNonSharedNode)

Needs a space after the if.

Also, the different mapItem-&gt;object values should be a switch statement.

Why the check for object == _WebElementSelf before checking respondsToSelector:? It seems fine to call respondsToSelector: on self.

+    if (!_URLElement) return nil;

Should be broken up over two lines.

I&apos;m concerned that the nodes are released in dealloc and returned from methods. They might need to be autoreleased by the methods or by dealloc in case the caller gets the node then releases the dictionary. Not sure about this one.

Why doesn&apos;t this patch remove all the WebCoreXXXKey constants from WebCoreFrameBridge?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>33993</commentid>
    <comment_count>5</comment_count>
      <attachid>6735</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2006-02-25 12:23:22 -0800</bug_when>
    <thetext>Created attachment 6735
Implementation using a smart dictionary (round 3)

Taking into account Darin&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>33994</commentid>
    <comment_count>6</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2006-02-25 12:26:24 -0800</bug_when>
    <thetext>To be safe about returning the DOM node I did this:

- (DOMNode *)_domNode
{
    return [[_innerNonSharedNode retain] autorelease];
}

This is the only place we return a DOM node directly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34016</commentid>
    <comment_count>7</comment_count>
      <attachid>6735</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-02-25 19:55:07 -0800</bug_when>
    <thetext>Comment on attachment 6735
Implementation using a smart dictionary (round 3)

Looks great! I almost want to do review+, but I have so many comments (although each one is minor) that I&apos;m going to review- this one more time:

It&apos;s a bit unfortunate introducing all these uses of QString -- we&apos;re trying to remove all use of QString. Ideally all these displayString methods would share a single function. But in any case, WebCore::String has a perfectly good replace function, which we would use and can convert itself to NSString without a function, so we could write:

+    return [self _HTMLElementImpl]-&gt;title().replace(QChar(&apos;\\&apos;), [self _elementImpl]-&gt;getDocument()-&gt;backslashAsCurrencySymbol());

+    QChar DocumentImpl::backslashAsCurrencySymbol() const;

The above is wrong. Should not include the class name DocumentImpl there.

Maybe we should change URLElement to actually be an ElementImpl instead of a NodeImpl. It&apos;s annoying to have the code here know that it&apos;s always an element, but not have the code it&apos;s bridging know. (Probably not something you have to fix in this patch though; just cleanup for later.)

WebElementDictionary.h should have a copyright date of 2006, not 2003, and WebElementDictionary.m have 2006 instead of 2005 unless there is code in those files published earlier which requires more than one year to be listed.

We should probably import &lt;Foundation/Foundation.h&gt; rather than individual Foundation headers in WebKit code.

I prefer a blank line after:

+#import &quot;WebElementDictionary.h&quot;

and before the other includes.

I don&apos;t think addLookupKey needs an &quot;if (!lookupTable)&quot; at the start of it; there&apos;s no practical case where that can be nil and if it&apos;s nil a crash is probably the best we can do.

There&apos;s no reason that addLookupKey needs to use CFAllocatorAllocate instead of malloc, is there?

Since we never plan to delete any values out of the lookup table, nor delete the table itself, we can pass NULL for the value callbacks instead of &amp;vcb.

I think it&apos;s a little fragile to have the hardcoded constant 12 and then 12 calls to addLookupKey below. It seems highly likely that someone would add a new call without noticing the number 12 they should be updating. I&apos;m not sure what the best fix is for this. Passing 0 is probably OK, even though we will give up a tiny bit of efficiency by doing so.

Since all callers check _cacheComplete before calling _fillCache, I think it should not also check _cacheComplete. An assert perhaps, but not an if ... return.

_fillCache does not need to initialize the key to nil.

I think that _fillCache should use CFDictionaryApplyFunction instead of casting to NSDictionary and using keyEnumerator. It would be pretty easy to do that, passing self through as the context, and then we would not be relying on toll-free bridging at all for the lookup table.

+    id value = [_cache objectForKey:key];
+    if (value || _cacheComplete || (_nilValues &amp;&amp; [_nilValues containsObject:key]))
+        return value;

It&apos;s a little inconsistent here to just use _cache without checking it for nil and then checking _nilValues for nil before calling containsObject:. I think you should check either both or neither.

I think you should do:

    typedef struct { ... } WebElementMethod;

and then refer to it as WebElementMethod everywhere instead of struct WebElementMethod.

Since CFDictionaryGetCount is used no matter what in objectForKey: I suggest putting it into a local variable. The local variable can be an unsigned type, which will obviate the need for the (unsigned long) cast in the _cacheComplete check.

This:

    _cacheComplete = ([_cache count] + [_nilValues count]) == lookupTableCount

will generate slightly better code than if (x) y = YES, so I suggest using that form.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34065</commentid>
    <comment_count>8</comment_count>
      <attachid>6747</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2006-02-26 12:56:29 -0800</bug_when>
    <thetext>Created attachment 6747
Implementation using a smart dictionary (round 4)

&gt; We should probably import &lt;Foundation/Foundation.h&gt; rather than individual Foundation headers in WebKit code.

I am under the impression it is better to include the specific header when you subclass, and add @class ... for any other classes you need. This speeds up compile time.

I was using CFAllocatorAllocate so we could safely use CFAllocatorDeallocate. No longer needed if we pass NULL for the value callbacks.

I falsely assumed what capacity meant to CFDictionary based on what NSMutableDictionary mean by dictionaryWithCapacity (as the initial size, not a hard maximum). Corrected.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34074</commentid>
    <comment_count>9</comment_count>
      <attachid>6747</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-02-26 15:38:48 -0800</bug_when>
    <thetext>Comment on attachment 6747
Implementation using a smart dictionary (round 4)

The _targetWebFrame method assumes that URLElement is a DOMHTMLAnchorElement, but that&apos;s not right. If you look at the code in WebCore you can see that a URLElement can be an HTMLAreaElement, an HTMLImageElement with a usemap attribute, an HTMLAnchorElement with an href attribute, or an SVGAElement with an XLink::href attribute. So we can get method-not-found if we just call target without checking the type.

I&apos;m setting this review- just for the _targetWebFrame issue. If you fix that it&apos;s fine to land it with &quot;Reviewed by Darin&quot; without an additional round of review.

Here are a few other minor nitpicks:

In all those replace calls, it can just be &apos;\\&apos;, doesn&apos;t have to be QChar(&apos;\\&apos;).

In getInnerNonSharedNode:, when there&apos;s no renderer, it should probably set the results to nil instead of leaving them untouched. The single caller is initializing all of them to nil anyway, so it won&apos;t matter in practice for us.

You apparently didn&apos;t heed my complaint about the inconsistency between _nilValues and _cache in objectForKey: -- there&apos;s still a nil check for _nilValues and no nil check for _cache. I suggest checking neither for nil or checking both for nil.

I preferred the old version of objectForKey: that would only look at the _nilValues set if [_cache objectForKey:] returned nil.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34653</commentid>
    <comment_count>10</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2006-03-01 10:05:27 -0800</bug_when>
    <thetext>A tweaked version based on Darin&apos;s last comments was landed as r13070.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6706</attachid>
            <date>2006-02-24 16:34:11 -0800</date>
            <delta_ts>2006-02-24 17:36:22 -0800</delta_ts>
            <desc>Implementation using a smart dictionary</desc>
            <filename>elementAtPoint.patch</filename>
            <type>text/plain</type>
            <size>19352</size>
            <attacher name="Timothy Hatcher">timothy</attacher>
            
              <data encoding="base64">SW5kZXg6IGJpbmRpbmdzL29iamMvRE9NLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL29iamMv
RE9NLm1tCShyZXZpc2lvbiAxMjk0NikKKysrIGJpbmRpbmdzL29iamMvRE9NLm1tCSh3b3JraW5n
IGNvcHkpCkBAIC0xNDUxLDYgKzE0NTEsMTcgQEAgc3RhdGljIExpc3RlbmVyTWFwICpsaXN0ZW5l
ck1hcDsKIAogQGltcGxlbWVudGF0aW9uIERPTUVsZW1lbnQgKERPTUVsZW1lbnRFeHRlbnNpb25z
KQogCistIChOU0ltYWdlKilpbWFnZQoreworICAgIFJlbmRlck9iamVjdCAqcmVuZGVyZXIgPSBb
c2VsZiBfZWxlbWVudEltcGxdLT5yZW5kZXJlcigpOworICAgIGlmIChyZW5kZXJlciAmJiByZW5k
ZXJlci0+aXNJbWFnZSgpKSB7CisgICAgICAgIFJlbmRlckltYWdlKiBpbWcgPSBzdGF0aWNfY2Fz
dDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKTsKKyAgICAgICAgaWYgKGltZy0+Y2FjaGVkSW1hZ2Uo
KSAmJiAhaW1nLT5jYWNoZWRJbWFnZSgpLT5pc0Vycm9ySW1hZ2UoKSkKKyAgICAgICAgICAgIHJl
dHVybiBpbWctPmNhY2hlZEltYWdlKCktPmltYWdlKCktPmdldE5TSW1hZ2UoKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG5pbDsKK30KKwogLSAodm9pZClmb2N1cwogewogICAgIFtzZWxmIF9lbGVtZW50
SW1wbF0tPmZvY3VzKCk7CkBAIC0xNDk4LDE3ICsxNTA5LDYgQEAgc3RhdGljIExpc3RlbmVyTWFw
ICpsaXN0ZW5lck1hcDsKICAgICByZXR1cm4gbmlsOwogfQogCi0tIChOU0ltYWdlKilfaW1hZ2UK
LXsKLSAgICBSZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gW3NlbGYgX2VsZW1lbnRJbXBsXS0+cmVu
ZGVyZXIoKTsKLSAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzSW1hZ2UoKSkgewotICAg
ICAgICBSZW5kZXJJbWFnZSogaW1nID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJl
cik7Ci0gICAgICAgIGlmIChpbWctPmNhY2hlZEltYWdlKCkgJiYgIWltZy0+Y2FjaGVkSW1hZ2Uo
KS0+aXNFcnJvckltYWdlKCkpCi0gICAgICAgICAgICByZXR1cm4gaW1nLT5jYWNoZWRJbWFnZSgp
LT5pbWFnZSgpLT5nZXROU0ltYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBuaWw7Ci19Ci0KIC0g
KE5TRGF0YSopX2ltYWdlVElGRlJlcHJlc2VudGF0aW9uCiB7CiAgICAgUmVuZGVyT2JqZWN0ICpy
ZW5kZXJlciA9IFtzZWxmIF9lbGVtZW50SW1wbF0tPnJlbmRlcmVyKCk7CkluZGV4OiBiaW5kaW5n
cy9vYmpjL0RPTVByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9vYmpjL0RPTVByaXZh
dGUuaAkocmV2aXNpb24gMTI5NDYpCisrKyBiaW5kaW5ncy9vYmpjL0RPTVByaXZhdGUuaAkod29y
a2luZyBjb3B5KQpAQCAtMzksNyArMzksNiBAQAogCiBAaW50ZXJmYWNlIERPTUVsZW1lbnQgKFdl
YlByaXZhdGUpCiAtIChOU0ZvbnQgKilfZm9udDsKLS0gKE5TSW1hZ2UgKilfaW1hZ2U7CiAtIChO
U0RhdGEgKilfaW1hZ2VUSUZGUmVwcmVzZW50YXRpb247CiAtIChOU1VSTCAqKV9nZXRVUkxBdHRy
aWJ1dGU6KE5TU3RyaW5nICopbmFtZTsKIEBlbmQKQEAgLTc2LDggKzc1LDggQEAKIC0gKHZvaWQp
X2FjdGl2YXRlSXRlbUF0SW5kZXg6KGludClpbmRleDsKIEBlbmQKIAotLy8gQkVHSU4gUEVORElO
RyBQVUJMSUMgV0VCIElOU1BFQ1RPUiBBUElTCi0vLyBUaGVzZSBBUElzIGFyZSBmb3IgdGhlIFdl
YiBJbnNwZWN0b3IsIGFuZCB0aGV5IHdpbGwgYmUgbWFkZSBwdWJsaWMgZXZlbnR1YWxseS4KKy8v
IEJFR0lOIFBFTkRJTkcgUFVCTElDIEFQSVMKKy8vIFRoZXNlIEFQSXMgd2lsbCBiZSBtYWRlIHB1
YmxpYyBldmVudHVhbGx5LgogQGludGVyZmFjZSBET01BdHRyIChET01BdHRyRXh0ZW5zaW9ucykK
IC0gKERPTUNTU1N0eWxlRGVjbGFyYXRpb24gKilzdHlsZTsKIEBlbmQKQEAgLTEwNywxMSArMTA2
LDMxIEBACiBAZW5kCiAKIEBpbnRlcmZhY2UgRE9NRWxlbWVudCAoRE9NRWxlbWVudEV4dGVuc2lv
bnMpCistIChOU0ltYWdlICopaW1hZ2U7CiAtICh2b2lkKWZvY3VzOwogLSAodm9pZClibHVyOwog
LSAodm9pZClzY3JvbGxJbnRvVmlldzooQk9PTClhbGlnblRvcDsKIC0gKHZvaWQpc2Nyb2xsSW50
b1ZpZXdJZk5lZWRlZDooQk9PTCljZW50ZXJJZk5lZWRlZDsKIEBlbmQKKworQGludGVyZmFjZSBE
T01IVE1MRWxlbWVudCAoRE9NSFRNTEVsZW1lbnRQZW5kaW5nUHVibGljKQorLSAoTlNTdHJpbmcg
Kil0aXRsZURpc3BsYXlTdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTElucHV0RWxl
bWVudCAoRE9NSFRNTElucHV0RWxlbWVudFBlbmRpbmdQdWJsaWMpCistIChOU1N0cmluZyAqKWFs
dERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29sdXRlSW1hZ2VVUkw7CitAZW5kCisKK0Bp
bnRlcmZhY2UgRE9NSFRNTEltYWdlRWxlbWVudCAoRE9NSFRNTEltYWdlRWxlbWVudFBlbmRpbmdQ
dWJsaWMpCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29s
dXRlSW1hZ2VVUkw7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTE9iamVjdEVsZW1lbnQgKERP
TUhUTUxPYmplY3RFbGVtZW50UGVuZGluZ1B1YmxpYykKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFn
ZVVSTDsKK0BlbmQKKwogLy8gRU5ECiAKIC8vIFBlbmRpbmcgRE9NMyBBUElzCkluZGV4OiBiaW5k
aW5ncy9vYmpjL0RPTUhUTUwubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYmluZGluZ3Mvb2JqYy9ET01IVE1M
Lm1tCShyZXZpc2lvbiAxMjk0NikKKysrIGJpbmRpbmdzL29iamMvRE9NSFRNTC5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtMjU5LDYgKzI1OSwxNiBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFt
ZXM7CiAgICAgcmV0dXJuIFtzZWxmIF9IVE1MRWxlbWVudEltcGxdLT50aXRsZSgpOwogfQogCist
IChOU1N0cmluZyAqKXRpdGxlRGlzcGxheVN0cmluZworeworICAgIFJlbmRlck9iamVjdCAqcmVu
ZGVyZXIgPSBbc2VsZiBfZWxlbWVudEltcGxdLT5yZW5kZXJlcigpOworICAgIGlmICghcmVuZGVy
ZXIpCisgICAgICAgIHJldHVybiBbc2VsZiB0aXRsZV07CisgICAgUVN0cmluZyB0aXRsZVRleHQg
PSBbc2VsZiBfSFRNTEVsZW1lbnRJbXBsXS0+dGl0bGUoKS5xc3RyaW5nKCk7CisgICAgdGl0bGVU
ZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIHJlbmRlcmVyLT5iYWNrc2xhc2hBc0N1cnJlbmN5U3lt
Ym9sKCkpOworICAgIHJldHVybiB0aXRsZVRleHQuZ2V0TlNTdHJpbmcoKTsKK30KKwogLSAodm9p
ZClzZXRUaXRsZTooTlNTdHJpbmcgKil0aXRsZQogewogICAgIFtzZWxmIF9IVE1MRWxlbWVudElt
cGxdLT5zZXRUaXRsZSh0aXRsZSk7CkBAIC0xMjgwLDYgKzEyOTAsMTYgQEAgdXNpbmcgbmFtZXNw
YWNlIERPTTo6SFRNTE5hbWVzOwogICAgIHJldHVybiBbc2VsZiBfaW5wdXRFbGVtZW50SW1wbF0t
PmFsdCgpOwogfQogCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmcKK3sKKyAgICBSZW5k
ZXJPYmplY3QgKnJlbmRlcmVyID0gW3NlbGYgX2VsZW1lbnRJbXBsXS0+cmVuZGVyZXIoKTsKKyAg
ICBpZiAoIXJlbmRlcmVyKQorICAgICAgICByZXR1cm4gW3NlbGYgYWx0XTsKKyAgICBRU3RyaW5n
IGFsdFRleHQgPSBbc2VsZiBfaW5wdXRFbGVtZW50SW1wbF0tPmFsdCgpLnFzdHJpbmcoKTsKKyAg
ICBhbHRUZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIHJlbmRlcmVyLT5iYWNrc2xhc2hBc0N1cnJl
bmN5U3ltYm9sKCkpOworICAgIHJldHVybiBhbHRUZXh0LmdldE5TU3RyaW5nKCk7Cit9CisKIC0g
KHZvaWQpc2V0QWx0OihOU1N0cmluZyAqKWFsdAogewogICAgIFtzZWxmIF9pbnB1dEVsZW1lbnRJ
bXBsXS0+c2V0QWx0KGFsdCk7CkBAIC0xMzQ1LDYgKzEzNjUsMTMgQEAgdXNpbmcgbmFtZXNwYWNl
IERPTTo6SFRNTE5hbWVzOwogICAgIFtzZWxmIF9pbnB1dEVsZW1lbnRJbXBsXS0+c2V0U2l6ZShz
aXplKTsKIH0KIAorLSAoTlNVUkwgKilhYnNvbHV0ZUltYWdlVVJMCit7CisgICAgaWYgKCFbc2Vs
ZiBfaW5wdXRFbGVtZW50SW1wbF0tPnJlbmRlcmVyKCkgfHwgIVtzZWxmIF9pbnB1dEVsZW1lbnRJ
bXBsXS0+cmVuZGVyZXIoKS0+aXNJbWFnZSgpKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHJl
dHVybiBbTlNVUkwgVVJMV2l0aFN0cmluZzpbc2VsZiBzcmNdXTsKK30KKwogLSAoTlNTdHJpbmcg
KilzcmMKIHsKICAgICByZXR1cm4gW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5zcmMoKTsKQEAg
LTIxNjUsNiArMjE5MiwxMSBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAgICAg
W3NlbGYgX2FuY2hvckVsZW1lbnRJbXBsXS0+c2V0QXR0cmlidXRlKGNvb3Jkc0F0dHIsIGNvb3Jk
cyk7CiB9CiAKKy0gKE5TVVJMICopYWJzb2x1dGVMaW5rVVJMCit7CisgICAgcmV0dXJuIFtOU1VS
TCBVUkxXaXRoU3RyaW5nOltzZWxmIGhyZWZdXTsKK30KKwogLSAoTlNTdHJpbmcgKilocmVmCiB7
CiAgICAgcmV0dXJuIFtzZWxmIF9hbmNob3JFbGVtZW50SW1wbF0tPmhyZWYoKTsKQEAgLTIzMDIs
NiArMjMzNCwxNiBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAgICAgcmV0dXJu
IFtzZWxmIF9pbWFnZUVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0dHIpOwogfQogCist
IChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmcKK3sKKyAgICBSZW5kZXJPYmplY3QgKnJlbmRl
cmVyID0gW3NlbGYgX2VsZW1lbnRJbXBsXS0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVy
KQorICAgICAgICByZXR1cm4gW3NlbGYgYWx0XTsKKyAgICBRU3RyaW5nIGFsdFRleHQgPSBbc2Vs
ZiBfSFRNTEVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0dHIpLnFzdHJpbmcoKTsKKyAg
ICBhbHRUZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIHJlbmRlcmVyLT5iYWNrc2xhc2hBc0N1cnJl
bmN5U3ltYm9sKCkpOworICAgIHJldHVybiBhbHRUZXh0LmdldE5TU3RyaW5nKCk7Cit9CisKIC0g
KHZvaWQpc2V0QWx0OihOU1N0cmluZyAqKWFsdAogewogICAgIFtzZWxmIF9pbWFnZUVsZW1lbnRJ
bXBsXS0+c2V0QXR0cmlidXRlKGFsdEF0dHIsIGFsdCk7CkBAIC0yMzU5LDYgKzI0MDEsMTEgQEAg
dXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAgIFtzZWxmIF9pbWFnZUVsZW1lbnRJ
bXBsXS0+c2V0QXR0cmlidXRlKGxvbmdkZXNjQXR0ciwgbG9uZ0Rlc2MpOwogfQogCistIChOU1VS
TCAqKWFic29sdXRlSW1hZ2VVUkwKK3sKKyAgICByZXR1cm4gW05TVVJMIFVSTFdpdGhTdHJpbmc6
W3NlbGYgc3JjXV07Cit9CisKIC0gKE5TU3RyaW5nICopc3JjCiB7CiAgICAgcmV0dXJuIFtzZWxm
IF9pbWFnZUVsZW1lbnRJbXBsXS0+c3JjKCk7CkBAIC0yNDc1LDYgKzI1MjIsMTQgQEAgdXNpbmcg
bmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAgIFtzZWxmIF9vYmplY3RFbGVtZW50SW1wbF0t
PnNldEF0dHJpYnV0ZShjb2RldHlwZUF0dHIsIGNvZGVUeXBlKTsKIH0KIAorLSAoTlNVUkwgKilh
YnNvbHV0ZUltYWdlVVJMCit7CisgICAgaWYgKCFbc2VsZiBfb2JqZWN0RWxlbWVudEltcGxdLT5y
ZW5kZXJlcigpIHx8ICFbc2VsZiBfb2JqZWN0RWxlbWVudEltcGxdLT5yZW5kZXJlcigpLT5pc0lt
YWdlKCkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgTlNTdHJpbmcgKnVybFN0cmluZyA9IFtz
ZWxmIF9vYmplY3RFbGVtZW50SW1wbF0tPmdldERvY3VtZW50KCktPmNvbXBsZXRlVVJMKFtzZWxm
IF9vYmplY3RFbGVtZW50SW1wbF0tPmdldEF0dHJpYnV0ZShkYXRhQXR0cikpOworICAgIHJldHVy
biBbTlNVUkwgVVJMV2l0aFN0cmluZzp1cmxTdHJpbmddOworfQorCiAtIChOU1N0cmluZyAqKWRh
dGEKIHsKICAgICByZXR1cm4gW3NlbGYgX29iamVjdEVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRl
KGRhdGFBdHRyKTsKQEAgLTI2NjYsNiArMjcyMSwxNiBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpI
VE1MTmFtZXM7CiAgICAgcmV0dXJuIFtzZWxmIF9hcHBsZXRFbGVtZW50SW1wbF0tPmdldEF0dHJp
YnV0ZShhbHRBdHRyKTsKIH0KIAorLSAoTlNTdHJpbmcgKilhbHREaXNwbGF5U3RyaW5nCit7Cisg
ICAgUmVuZGVyT2JqZWN0ICpyZW5kZXJlciA9IFtzZWxmIF9lbGVtZW50SW1wbF0tPnJlbmRlcmVy
KCk7CisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIFtzZWxmIGFsdF07CisgICAg
UVN0cmluZyBhbHRUZXh0ID0gW3NlbGYgX0hUTUxFbGVtZW50SW1wbF0tPmdldEF0dHJpYnV0ZShh
bHRBdHRyKS5xc3RyaW5nKCk7CisgICAgYWx0VGV4dC5yZXBsYWNlKFFDaGFyKCdcXCcpLCByZW5k
ZXJlci0+YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKKyAgICByZXR1cm4gYWx0VGV4dC5n
ZXROU1N0cmluZygpOworfQorCiAtICh2b2lkKXNldEFsdDooTlNTdHJpbmcgKilhbHQKIHsKICAg
ICBbc2VsZiBfYXBwbGV0RWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUoYWx0QXR0ciwgYWx0KTsK
QEAgLTI4MTIsNiArMjg3NywxNiBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAg
ICAgcmV0dXJuIFtzZWxmIF9hcmVhRWxlbWVudEltcGxdLT5nZXRBdHRyaWJ1dGUoYWx0QXR0cik7
CiB9CiAKKy0gKE5TU3RyaW5nICopYWx0RGlzcGxheVN0cmluZworeworICAgIFJlbmRlck9iamVj
dCAqcmVuZGVyZXIgPSBbc2VsZiBfZWxlbWVudEltcGxdLT5yZW5kZXJlcigpOworICAgIGlmICgh
cmVuZGVyZXIpCisgICAgICAgIHJldHVybiBbc2VsZiBhbHRdOworICAgIFFTdHJpbmcgYWx0VGV4
dCA9IFtzZWxmIF9IVE1MRWxlbWVudEltcGxdLT5nZXRBdHRyaWJ1dGUoYWx0QXR0cikucXN0cmlu
ZygpOworICAgIGFsdFRleHQucmVwbGFjZShRQ2hhcignXFwnKSwgcmVuZGVyZXItPmJhY2tzbGFz
aEFzQ3VycmVuY3lTeW1ib2woKSk7CisgICAgcmV0dXJuIGFsdFRleHQuZ2V0TlNTdHJpbmcoKTsK
K30KKwogLSAodm9pZClzZXRBbHQ6KE5TU3RyaW5nICopYWx0CiB7CiAgICAgW3NlbGYgX2FyZWFF
bGVtZW50SW1wbF0tPnNldEF0dHJpYnV0ZShhbHRBdHRyLCBhbHQpOwpJbmRleDogYnJpZGdlL21h
Yy9XZWJDb3JlRnJhbWVCcmlkZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBicmlkZ2UvbWFjL1dlYkNvcmVG
cmFtZUJyaWRnZS5oCShyZXZpc2lvbiAxMjk0NikKKysrIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1l
QnJpZGdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMwMiw2ICszMDIsOCBAQCB0eXBlZGVmIGVudW0g
ewogLSAoTlNPYmplY3QgKiljb3B5UmVuZGVyVHJlZTooaWQgPFdlYkNvcmVSZW5kZXJUcmVlQ29w
aWVyPiljb3BpZXI7CiAtIChOU1N0cmluZyAqKXJlbmRlclRyZWVBc0V4dGVybmFsUmVwcmVzZW50
YXRpb247CiAKKy0gKHZvaWQpbm9kZXNBdFBvaW50OihOU1BvaW50KXBvaW50IGlubmVyTm9uU2hh
cmVkTm9kZTooRE9NTm9kZSAqKilpbm5lck5vblNoYXJlZE5vZGUgaW5uZXJOb2RlOihET01Ob2Rl
ICoqKWlubmVyTm9kZSBVUkxFbGVtZW50OihET01FbGVtZW50ICoqKVVSTEVsZW1lbnQ7CistIChC
T09MKWlzUG9pbnRJbnNpZGVTZWxlY3Rpb246KE5TUG9pbnQpcG9pbnQ7CiAtIChOU0RpY3Rpb25h
cnkgKillbGVtZW50QXRQb2ludDooTlNQb2ludClwb2ludDsKIC0gKE5TVVJMICopVVJMV2l0aEF0
dHJpYnV0ZVN0cmluZzooTlNTdHJpbmcgKilzdHJpbmc7CiAKSW5kZXg6IGJyaWRnZS9tYWMvV2Vi
Q29yZUZyYW1lQnJpZGdlLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1l
QnJpZGdlLm1tCShyZXZpc2lvbiAxMjk0NikKKysrIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJp
ZGdlLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMzQsNyArMTM0LDcgQEAgTlNTdHJpbmcgKldlYkNv
cmVFbGVtZW50TGlua1RhcmdldEZyYW1lSwogTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50TGlua0xh
YmVsS2V5ID0gICAgICAgICAgQCJXZWJFbGVtZW50TGlua0xhYmVsIjsKIE5TU3RyaW5nICpXZWJD
b3JlRWxlbWVudExpbmtUaXRsZUtleSA9ICAgICAgICAgIEAiV2ViRWxlbWVudExpbmtUaXRsZSI7
CiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnROYW1lS2V5ID0gICAgICAgICAgICAgICBAIldlYkVs
ZW1lbnROYW1lIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudFRpdGxlS2V5ID0gICAgICAgICAg
ICAgIEAiV2ViQ29yZUVsZW1lbnRUaXRsZSI7IC8vIG5vdCBpbiBXZWJLaXQgQVBJIGZvciBub3cs
IGNvdWxkIGJlIGluIEFQSSBzb21lIGRheQorTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50VGl0bGVL
ZXkgPSAgICAgICAgICAgICAgQCJXZWJFbGVtZW50VGl0bGUiOyAvLyBub3QgaW4gV2ViS2l0IEFQ
SSBmb3Igbm93LCBjb3VsZCBiZSBpbiBBUEkgc29tZSBkYXkKIAogTlNTdHJpbmcgKldlYkNvcmVQ
YWdlQ2FjaGVTdGF0ZUtleSA9ICAgICAgICAgICAgQCJXZWJDb3JlUGFnZUNhY2hlU3RhdGUiOwog
CkBAIC0xMjgxLDYgKzEyODEsMzcgQEAgc3RhdGljIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm1F
bGVtZW50RgogICAgIHJldHVybiBtX2ZyYW1lLT5tYXRjaExhYmVsc0FnYWluc3RFbGVtZW50KGxh
YmVscywgW2VsZW1lbnQgX2VsZW1lbnRJbXBsXSk7CiB9CiAKKy0gKHZvaWQpbm9kZXNBdFBvaW50
OihOU1BvaW50KXBvaW50IGlubmVyTm9uU2hhcmVkTm9kZTooRE9NTm9kZSAqKilpbm5lck5vblNo
YXJlZE5vZGUgaW5uZXJOb2RlOihET01Ob2RlICoqKWlubmVyTm9kZSBVUkxFbGVtZW50OihET01F
bGVtZW50ICoqKVVSTEVsZW1lbnQKK3sKKyAgICBSZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gbV9m
cmFtZS0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKSAKKyAgICAgICAgcmV0dXJuOwor
CisgICAgUmVuZGVyT2JqZWN0OjpOb2RlSW5mbyBub2RlSW5mbyA9IFtzZWxmIG5vZGVJbmZvQXRQ
b2ludDpwb2ludF07CisgICAgTm9kZUltcGwgKm5vZGUgPSBub2RlSW5mby5pbm5lck5vblNoYXJl
ZE5vZGUoKTsKKyAgICBpZiAobm9kZSkKKyAgICAgICAgKmlubmVyTm9uU2hhcmVkTm9kZSA9IFtE
T01Ob2RlIF9ub2RlV2l0aEltcGw6bm9kZV07CisgICAgZWxzZQorICAgICAgICAqaW5uZXJOb25T
aGFyZWROb2RlID0gbmlsOworCisgICAgbm9kZSA9IG5vZGVJbmZvLmlubmVyTm9kZSgpOworICAg
IGlmIChub2RlKQorICAgICAgICAqaW5uZXJOb2RlID0gW0RPTU5vZGUgX25vZGVXaXRoSW1wbDpu
b2RlXTsKKyAgICBlbHNlCisgICAgICAgICppbm5lck5vZGUgPSBuaWw7CisKKyAgICBub2RlID0g
bm9kZUluZm8uVVJMRWxlbWVudCgpOworICAgIGlmIChub2RlKQorICAgICAgICAqVVJMRWxlbWVu
dCA9IFtET01Ob2RlIF9ub2RlV2l0aEltcGw6bm9kZV07CisgICAgZWxzZQorICAgICAgICAqVVJM
RWxlbWVudCA9IG5pbDsKK30KKworLSAoQk9PTClpc1BvaW50SW5zaWRlU2VsZWN0aW9uOihOU1Bv
aW50KXBvaW50Cit7CisgICAgcmV0dXJuIG1fZnJhbWUtPmlzUG9pbnRJbnNpZGVTZWxlY3Rpb24o
KGludClwb2ludC54LCAoaW50KXBvaW50LnkpOworfQorCiAtIChOU0RpY3Rpb25hcnkgKillbGVt
ZW50QXRQb2ludDooTlNQb2ludClwb2ludAogewogICAgIFJlbmRlck9iamVjdCAqcmVuZGVyZXIg
PSBtX2ZyYW1lLT5yZW5kZXJlcigpOwpJbmRleDogV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJl
dmlzaW9uIDEyOTQ2KQorKysgV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtp
bmcgY29weSkKQEAgLTI5NSw2ICsyOTUsOCBAQAogCQk5Mzk4MTEyRTA4MjRCRjAxMDA4REYwMzgg
LyogbGliaWN1Y29yZS5keWxpYiBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDkzRDYyM0REMDUxRTc5MUYwMDJGNDdERCAvKiBsaWJpY3Vjb3JlLmR5bGli
ICovOyB9OwogCQk5Mzk4MTEyRjA4MjRCRjAxMDA4REYwMzggLyogU2VjdXJpdHkuZnJhbWV3b3Jr
IGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODMwRTgx
RTAwNTg1M0FDMDAwQUQwODkxIC8qIFNlY3VyaXR5LmZyYW1ld29yayAqLzsgfTsKIAkJQUJEREYy
MEQwOEVCMEREQzAwMUUxMjQxIC8qIFdlYkRvd25sb2FkSW50ZXJuYWwuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEFCRERGMjBDMDhFQjBEREMwMDFFMTI0
MSAvKiBXZWJEb3dubG9hZEludGVybmFsLmggKi87IH07CisJCUREODk2ODIwMDlBQTg3MjQwMDk3
RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gREQ4OTY4MUUwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1l
bnREaWN0aW9uYXJ5LmggKi87IH07CisJCUREODk2ODIxMDlBQTg3MjQwMDk3RTdGMCAvKiBXZWJF
bGVtZW50RGljdGlvbmFyeS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gREQ4OTY4MUYwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5
Lm0gKi87IH07CiAJCUVENkJFMkU3MDg4QzMyQjUwMDQ0REVEQyAvKiBXZWJOU0F0dHJpYnV0ZWRT
dHJpbmdFeHRyYXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEVENkJFMkU1MDg4QzMyQjUwMDQ0REVEQyAvKiBXZWJOU0F0dHJpYnV0ZWRTdHJpbmdFeHRy
YXMuaCAqLzsgfTsKIAkJRUQ2QkUyRTgwODhDMzJCNTAwNDRERURDIC8qIFdlYk5TQXR0cmlidXRl
ZFN0cmluZ0V4dHJhcy5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRUQ2QkUyRTYwODhDMzJCNTAwNDRERURDIC8qIFdlYk5TQXR0cmlidXRlZFN0cmluZ0V4
dHJhcy5tICovOyB9OwogCQlFRDdGNkQ4QjA5ODA2ODM1MDBDMjM1RUQgLyogV2ViTlNEYXRhRXh0
cmFzUHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRUQ3RjZEOEEwOTgwNjgzNTAwQzIzNUVEIC8qIFdlYk5TRGF0YUV4dHJhc1ByaXZhdGUuaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAtNTUzLDYg
KzU1NSw4IEBACiAJCUJFRTE4RjlBMDQ3MkI3MzIwMENBMjg5QyAvKiBXZWJMb2NhbGl6YWJsZVN0
cmluZ3MubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsg
aW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBw
YXRoID0gV2ViTG9jYWxpemFibGVTdHJpbmdzLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRh
YldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlCRUU1MkQ0QTA0NzMwMzI1MDBDQTI4OUMg
LyogV2ViS2l0U3lzdGVtQml0cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IFdlYktpdFN5c3RlbUJpdHMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUJFRTUyRDRCMDQ3MzAzMjUwMENB
Mjg5QyAvKiBXZWJLaXRTeXN0ZW1CaXRzLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gV2ViS2l0U3lzdGVtQml0cy5tOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKKwkJREQ4OTY4MUUwOUFB
ODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5LmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2ViRWxlbWVudERpY3Rpb25hcnkuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CisJ
CUREODk2ODFGMDlBQTg3MjQwMDk3RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5tICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRoID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFdlYkVsZW1l
bnREaWN0aW9uYXJ5Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNl
c1RhYnMgPSAwOyB9OwogCQlFRDIxQjk4MTA1MjhGN0FBMDAzMjk5QUMgLyogV2ViRG9jdW1lbnRJ
bnRlcm5hbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFdlYkRvY3VtZW50SW50ZXJuYWwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lk
dGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUVEMkIyNDc0MDMzQTJEQTgwMEMxQTUyNiAvKiBX
ZWJOU1Bhc3RlYm9hcmRFeHRyYXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBXZWJOU1Bhc3RlYm9hcmRFeHRyYXMuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUVEMkIyNDc1MDMzQTJE
QTgwMEMxQTUyNiAvKiBXZWJOU1Bhc3RlYm9hcmRFeHRyYXMubSAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBXZWJOU1Bhc3RlYm9hcmRFeHRyYXMu
bTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07
CkBAIC04MDEsNiArODA1LDggQEAKIAkJCQlGNTk2NjhDOTAyQUQyOTIzMDE4NjM1Q0EgLyogV2Vi
U3RyaW5nVHJ1bmNhdG9yLm0gKi8sCiAJCQkJNjU3OEY1REUwNDVGODE3NDAwMDAwMTI4IC8qIFdl
YkRvd25sb2FkLmggKi8sCiAJCQkJNjU3OEY1REYwNDVGODE3NDAwMDAwMTI4IC8qIFdlYkRvd25s
b2FkLm0gKi8sCisJCQkJREQ4OTY4MUUwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0
aW9uYXJ5LmggKi8sCisJCQkJREQ4OTY4MUYwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnRE
aWN0aW9uYXJ5Lm0gKi8sCiAJCQkpOwogCQkJcGF0aCA9IE1pc2M7CiAJCQlzb3VyY2VUcmVlID0g
Ijxncm91cD4iOwpAQCAtMTMxMiw2ICsxMzE4LDcgQEAKIAkJCQlFRDdGNkQ4QjA5ODA2ODM1MDBD
MjM1RUQgLyogV2ViTlNEYXRhRXh0cmFzUHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNjUx
OTUxRTIwOTk3NDE3ODAwM0RGQzY1IC8qIFdlYkxvYWRlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
NjU1MEI3QzcwOTlFRkFFOTAwOTBENzgxIC8qIFdlYkFyY2hpdmVyLmggaW4gSGVhZGVycyAqLywK
KwkJCQlERDg5NjgyMDA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkuaCBp
biBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Np
bmcgPSAwOwogCQl9OwpAQCAtMTg0Miw2ICsxODQ5LDcgQEAKIAkJCQkxQzY4RjY3MjA5NUI1RkMx
MDBDMjk4NEUgLyogV2ViTm9kZUhpZ2hsaWdodFZpZXcubSBpbiBTb3VyY2VzICovLAogCQkJCTY1
QzdGNDJEMDk3OURFNjQwMDIyRTQ1MyAvKiBXZWJQYWdlQnJpZGdlLm0gaW4gU291cmNlcyAqLywK
IAkJCQk2NTUwQjdDODA5OUVGQUU5MDA5MEQ3ODEgLyogV2ViQXJjaGl2ZXIubSBpbiBTb3VyY2Vz
ICovLAorCQkJCUREODk2ODIxMDlBQTg3MjQwMDk3RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFy
eS5tIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJv
Y2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBNaXNjL1dlYk5TVmlld0V4dHJhcy5tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIE1pc2MvV2ViTlNWaWV3RXh0cmFzLm0JKHJldmlzaW9uIDEyOTQ2KQorKysgTWlzYy9X
ZWJOU1ZpZXdFeHRyYXMubQkod29ya2luZyBjb3B5KQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAg
TlNJbWFnZSAqZHJhZ0ltYWdlOwogICAgIE5TUG9pbnQgb3JpZ2luOwogCi0gICAgTlNJbWFnZSAq
aW1hZ2UgPSAod2lyICE9IG5pbCkgPyBbd2lyIGltYWdlXSA6IFtlbGVtZW50IF9pbWFnZV07Cisg
ICAgTlNJbWFnZSAqaW1hZ2UgPSAod2lyICE9IG5pbCkgPyBbd2lyIGltYWdlXSA6IFtlbGVtZW50
IGltYWdlXTsKICAgICBpZiAoaW1hZ2UgIT0gbmlsICYmIFtpbWFnZSBzaXplXS5oZWlnaHQgKiBb
aW1hZ2Ugc2l6ZV0ud2lkdGggPD0gV2ViTWF4T3JpZ2luYWxJbWFnZUFyZWEpIHsKICAgICAgICAg
TlNTaXplIG9yaWdpbmFsU2l6ZSA9IHJlY3Quc2l6ZTsKICAgICAgICAgb3JpZ2luID0gcmVjdC5v
cmlnaW47CkluZGV4OiBXZWJWaWV3L1dlYlZpZXdQcml2YXRlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Vmlldy9XZWJWaWV3UHJpdmF0ZS5oCShyZXZpc2lvbiAxMjk0NikKKysrIFdlYlZpZXcvV2ViVmll
d1ByaXZhdGUuaAkod29ya2luZyBjb3B5KQpAQCAtNjUsNiArNjUsOCBAQCBleHRlcm4gTlNTdHJp
bmcgKl9XZWJNYWluRnJhbWVJY29uS2V5OwogZXh0ZXJuIE5TU3RyaW5nICpfV2ViTWFpbkZyYW1l
VGl0bGVLZXk7CiBleHRlcm4gTlNTdHJpbmcgKl9XZWJNYWluRnJhbWVVUkxLZXk7CiAKK2V4dGVy
biBOU1N0cmluZyAqV2ViRWxlbWVudFRpdGxlS2V5OyAgIC8vIE5TU3RyaW5nIG9mIHRoZSB0aXRs
ZSBvZiB0aGUgZWxlbWVudCAocGVuZGluZyBwdWJsaWMsIHVzZWQgYnkgU2FmYXJpKQorCiB0eXBl
ZGVmIGVudW0gewogICAgIFdlYkRhc2hib2FyZEJlaGF2aW9yQWx3YXlzU2VuZE1vdXNlRXZlbnRz
VG9BbGxXaW5kb3dzLAogICAgIFdlYkRhc2hib2FyZEJlaGF2aW9yQWx3YXlzU2VuZEFjdGl2ZU51
bGxFdmVudHNUb1BsdWdJbnMsCkluZGV4OiBXZWJWaWV3L1dlYlZpZXcubQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJWaWV3L1dlYlZpZXcubQkocmV2aXNpb24gMTI5NDYpCisrKyBXZWJWaWV3L1dlYlZpZXcu
bQkod29ya2luZyBjb3B5KQpAQCAtMzA5LDYgKzMwOSw3IEBAIE5TU3RyaW5nICpXZWJFbGVtZW50
SW1hZ2VBbHRTdHJpbmdLZXkgPSAKIE5TU3RyaW5nICpXZWJFbGVtZW50SW1hZ2VSZWN0S2V5ID0g
ICAgICAgICAgQCJXZWJFbGVtZW50SW1hZ2VSZWN0IjsKIE5TU3RyaW5nICpXZWJFbGVtZW50SW1h
Z2VVUkxLZXkgPSAgICAgICAgICAgQCJXZWJFbGVtZW50SW1hZ2VVUkwiOwogTlNTdHJpbmcgKldl
YkVsZW1lbnRJc1NlbGVjdGVkS2V5ID0gICAgICAgICBAIldlYkVsZW1lbnRJc1NlbGVjdGVkIjsK
K05TU3RyaW5nICpXZWJFbGVtZW50VGl0bGVLZXkgPSAgICAgICAgICAgICAgQCJXZWJFbGVtZW50
VGl0bGUiOwogTlNTdHJpbmcgKldlYkVsZW1lbnRMaW5rVVJMS2V5ID0gICAgICAgICAgICBAIldl
YkVsZW1lbnRMaW5rVVJMIjsKIE5TU3RyaW5nICpXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5
ID0gICAgQCJXZWJFbGVtZW50VGFyZ2V0RnJhbWUiOwogTlNTdHJpbmcgKldlYkVsZW1lbnRMaW5r
TGFiZWxLZXkgPSAgICAgICAgICBAIldlYkVsZW1lbnRMaW5rTGFiZWwiOwpJbmRleDogV2ViVmll
dy9XZWJIVE1MVmlldy5tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYlZpZXcvV2ViSFRNTFZpZXcubQkocmV2
aXNpb24gMTI5NDYpCisrKyBXZWJWaWV3L1dlYkhUTUxWaWV3Lm0JKHdvcmtpbmcgY29weSkKQEAg
LTQyLDYgKzQyLDcgQEAKICNpbXBvcnQgPFdlYktpdC9XZWJEb2N1bWVudEludGVybmFsLmg+CiAj
aW1wb3J0IDxXZWJLaXQvV2ViRE9NT3BlcmF0aW9uc1ByaXZhdGUuaD4KICNpbXBvcnQgPFdlYktp
dC9XZWJFZGl0aW5nRGVsZWdhdGUuaD4KKyNpbXBvcnQgPFdlYktpdC9XZWJFbGVtZW50RGljdGlv
bmFyeS5oPgogI2ltcG9ydCA8V2ViS2l0L1dlYkZyYW1lUHJpdmF0ZS5oPgogI2ltcG9ydCA8V2Vi
S2l0L1dlYkZyYW1lSW50ZXJuYWwuaD4KICNpbXBvcnQgPFdlYktpdC9XZWJGcmFtZVZpZXdJbnRl
cm5hbC5oPgpAQCAtMTE5Myw3ICsxMTk0LDcgQEAgc3RhdGljIFdlYkhUTUxWaWV3ICpsYXN0SGl0
VmlldyA9IG5pbDsKIAogICAgIC8vIG5vdGUgcGVyIGt3ZWJzdGVyLCB0aGUgb2Zmc2V0IGFyZyBi
ZWxvdyBpcyBhbHdheXMgaWdub3JlZCBpbiBwb3NpdGlvbmluZyB0aGUgaW1hZ2UKICAgICBET01I
VE1MRWxlbWVudCAqaW1hZ2VFbGVtZW50ID0gW2VsZW1lbnQgb2JqZWN0Rm9yS2V5OldlYkVsZW1l
bnRET01Ob2RlS2V5XTsKLSAgICBpZiAoaW1hZ2VVUkwgIT0gbmlsICYmIFtpbWFnZUVsZW1lbnQg
X2ltYWdlXSAhPSBuaWwgJiYgKF9wcml2YXRlLT5kcmFnU291cmNlQWN0aW9uTWFzayAmIFdlYkRy
YWdTb3VyY2VBY3Rpb25JbWFnZSkpIHsKKyAgICBpZiAoaW1hZ2VVUkwgIT0gbmlsICYmIFtpbWFn
ZUVsZW1lbnQgaW1hZ2VdICE9IG5pbCAmJiAoX3ByaXZhdGUtPmRyYWdTb3VyY2VBY3Rpb25NYXNr
ICYgV2ViRHJhZ1NvdXJjZUFjdGlvbkltYWdlKSkgewogICAgICAgICBpZCBzb3VyY2UgPSBzZWxm
OwogICAgICAgICBpZiAoIWRodG1sV3JvdGVEYXRhKSB7CiAgICAgICAgICAgICAvLyBTZWxlY3Qg
dGhlIGltYWdlIHdoZW4gaXQgaXMgZHJhZ2dlZC4gVGhpcyBhbGxvd3MgdGhlIGltYWdlIHRvIGJl
IG1vdmVkIHZpYSBNb3ZlU2VsZWN0aW9uQ29tbWFuZEltcGwgYW5kIHRoaXMgbWF0Y2hlcyBOU1Rl
eHRWaWV3J3MgYmVoYXZpb3IuCkBAIC0yODY0LDM1ICsyODY1LDEwIEBAIGRvbmU6CiAKIC0gKE5T
RGljdGlvbmFyeSAqKWVsZW1lbnRBdFBvaW50OihOU1BvaW50KXBvaW50CiB7Ci0gICAgTlNEaWN0
aW9uYXJ5ICplbGVtZW50SW5mb1dDID0gW1tzZWxmIF9icmlkZ2VdIGVsZW1lbnRBdFBvaW50OnBv
aW50XTsKLSAgICBOU011dGFibGVEaWN0aW9uYXJ5ICplbGVtZW50SW5mbyA9IFtlbGVtZW50SW5m
b1dDIG11dGFibGVDb3B5XTsKLSAgICAKLSAgICAvLyBDb252ZXJ0IFVSTCBzdHJpbmdzIHRvIE5T
VVJMcy4KLSAgICBbZWxlbWVudEluZm8gX3dlYl9zZXRPYmplY3RJZk5vdE5pbDpbTlNVUkwgX3dl
Yl9VUkxXaXRoRGF0YUFzU3RyaW5nOltlbGVtZW50SW5mb1dDIG9iamVjdEZvcktleTpXZWJFbGVt
ZW50TGlua1VSTEtleV1dIGZvcktleTpXZWJFbGVtZW50TGlua1VSTEtleV07Ci0gICAgW2VsZW1l
bnRJbmZvIF93ZWJfc2V0T2JqZWN0SWZOb3ROaWw6W05TVVJMIF93ZWJfVVJMV2l0aERhdGFBc1N0
cmluZzpbZWxlbWVudEluZm9XQyBvYmplY3RGb3JLZXk6V2ViRWxlbWVudEltYWdlVVJMS2V5XV0g
Zm9yS2V5OldlYkVsZW1lbnRJbWFnZVVSTEtleV07Ci0gICAgaWYgKFtlbGVtZW50SW5mb1dDIG9i
amVjdEZvcktleTpXZWJFbGVtZW50SW1hZ2VVUkxLZXldKQotICAgICAgICBbZWxlbWVudEluZm8g
X3dlYl9zZXRPYmplY3RJZk5vdE5pbDpbW2VsZW1lbnRJbmZvV0Mgb2JqZWN0Rm9yS2V5OldlYkVs
ZW1lbnRET01Ob2RlS2V5XSBfaW1hZ2VdIGZvcktleTpXZWJFbGVtZW50SW1hZ2VLZXldOwotCi0g
ICAgV2ViRnJhbWVWaWV3ICp3ZWJGcmFtZVZpZXcgPSBbc2VsZiBfd2ViX3BhcmVudFdlYkZyYW1l
Vmlld107Ci0gICAgQVNTRVJUKHdlYkZyYW1lVmlldyk7Ci0gICAgV2ViRnJhbWUgKndlYkZyYW1l
ID0gW3dlYkZyYW1lVmlldyB3ZWJGcmFtZV07Ci0gICAgCi0gICAgaWYgKHdlYkZyYW1lKSB7Ci0g
ICAgICAgIE5TU3RyaW5nICpmcmFtZU5hbWUgPSBbZWxlbWVudEluZm9XQyBvYmplY3RGb3JLZXk6
V2ViRWxlbWVudExpbmtUYXJnZXRGcmFtZUtleV07Ci0gICAgICAgIGlmIChbZnJhbWVOYW1lIGxl
bmd0aF0gPT0gMCkgewotICAgICAgICAgICAgW2VsZW1lbnRJbmZvIHNldE9iamVjdDp3ZWJGcmFt
ZSBmb3JLZXk6V2ViRWxlbWVudExpbmtUYXJnZXRGcmFtZUtleV07Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBXZWJGcmFtZSAqd2YgPSBbd2ViRnJhbWUgZmluZEZyYW1lTmFtZWQ6ZnJh
bWVOYW1lXTsKLSAgICAgICAgICAgIGlmICh3ZiAhPSBuaWwpCi0gICAgICAgICAgICAgICAgW2Vs
ZW1lbnRJbmZvIHNldE9iamVjdDp3ZiBmb3JLZXk6V2ViRWxlbWVudExpbmtUYXJnZXRGcmFtZUtl
eV07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgW2VsZW1lbnRJbmZvIHJlbW92
ZU9iamVjdEZvcktleTpXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5XTsKLSAgICAgICAgfQot
ICAgICAgICAKLSAgICAgICAgW2VsZW1lbnRJbmZvIHNldE9iamVjdDp3ZWJGcmFtZSBmb3JLZXk6
V2ViRWxlbWVudEZyYW1lS2V5XTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFtlbGVtZW50SW5m
byBhdXRvcmVsZWFzZV07CisgICAgRE9NTm9kZSAqaW5uZXJOb2RlLCAqaW5uZXJOb25TaGFyZWRO
b2RlID0gbmlsOworICAgIERPTUVsZW1lbnQgKlVSTEVsZW1lbnQgPSBuaWw7CisgICAgW1tzZWxm
IF9icmlkZ2VdIG5vZGVzQXRQb2ludDpwb2ludCBpbm5lck5vblNoYXJlZE5vZGU6JmlubmVyTm9u
U2hhcmVkTm9kZSBpbm5lck5vZGU6JmlubmVyTm9kZSBVUkxFbGVtZW50OiZVUkxFbGVtZW50XTsK
KyAgICByZXR1cm4gW1tbV2ViRWxlbWVudERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoSW5uZXJO
b2RlOmlubmVyTm9kZSBpbm5lck5vblNoYXJlZE5vZGU6aW5uZXJOb25TaGFyZWROb2RlIFVSTEVs
ZW1lbnQ6VVJMRWxlbWVudCBhbmRQb2ludDpwb2ludF0gYXV0b3JlbGVhc2VdOwogfQogCiAtICh2
b2lkKW1vdXNlVXA6KE5TRXZlbnQgKilldmVudAo=
</data>
<flag name="review"
          id="1698"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6708</attachid>
            <date>2006-02-24 17:36:22 -0800</date>
            <delta_ts>2006-02-25 12:23:22 -0800</delta_ts>
            <desc>Implementation using a smart dictionary (round 2)</desc>
            <filename>elementAtPoint.patch</filename>
            <type>text/plain</type>
            <size>35545</size>
            <attacher name="Timothy Hatcher">timothy</attacher>
            
              <data encoding="base64">SW5kZXg6IGJpbmRpbmdzL29iamMvRE9NLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL29iamMv
RE9NLm1tCShyZXZpc2lvbiAxMjk0NikKKysrIGJpbmRpbmdzL29iamMvRE9NLm1tCSh3b3JraW5n
IGNvcHkpCkBAIC0xNDUxLDYgKzE0NTEsMTcgQEAgc3RhdGljIExpc3RlbmVyTWFwICpsaXN0ZW5l
ck1hcDsKIAogQGltcGxlbWVudGF0aW9uIERPTUVsZW1lbnQgKERPTUVsZW1lbnRFeHRlbnNpb25z
KQogCistIChOU0ltYWdlKilpbWFnZQoreworICAgIFJlbmRlck9iamVjdCAqcmVuZGVyZXIgPSBb
c2VsZiBfZWxlbWVudEltcGxdLT5yZW5kZXJlcigpOworICAgIGlmIChyZW5kZXJlciAmJiByZW5k
ZXJlci0+aXNJbWFnZSgpKSB7CisgICAgICAgIFJlbmRlckltYWdlKiBpbWcgPSBzdGF0aWNfY2Fz
dDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKTsKKyAgICAgICAgaWYgKGltZy0+Y2FjaGVkSW1hZ2Uo
KSAmJiAhaW1nLT5jYWNoZWRJbWFnZSgpLT5pc0Vycm9ySW1hZ2UoKSkKKyAgICAgICAgICAgIHJl
dHVybiBpbWctPmNhY2hlZEltYWdlKCktPmltYWdlKCktPmdldE5TSW1hZ2UoKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG5pbDsKK30KKwogLSAodm9pZClmb2N1cwogewogICAgIFtzZWxmIF9lbGVtZW50
SW1wbF0tPmZvY3VzKCk7CkBAIC0xNDk4LDE3ICsxNTA5LDYgQEAgc3RhdGljIExpc3RlbmVyTWFw
ICpsaXN0ZW5lck1hcDsKICAgICByZXR1cm4gbmlsOwogfQogCi0tIChOU0ltYWdlKilfaW1hZ2UK
LXsKLSAgICBSZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gW3NlbGYgX2VsZW1lbnRJbXBsXS0+cmVu
ZGVyZXIoKTsKLSAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzSW1hZ2UoKSkgewotICAg
ICAgICBSZW5kZXJJbWFnZSogaW1nID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJl
cik7Ci0gICAgICAgIGlmIChpbWctPmNhY2hlZEltYWdlKCkgJiYgIWltZy0+Y2FjaGVkSW1hZ2Uo
KS0+aXNFcnJvckltYWdlKCkpCi0gICAgICAgICAgICByZXR1cm4gaW1nLT5jYWNoZWRJbWFnZSgp
LT5pbWFnZSgpLT5nZXROU0ltYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBuaWw7Ci19Ci0KIC0g
KE5TRGF0YSopX2ltYWdlVElGRlJlcHJlc2VudGF0aW9uCiB7CiAgICAgUmVuZGVyT2JqZWN0ICpy
ZW5kZXJlciA9IFtzZWxmIF9lbGVtZW50SW1wbF0tPnJlbmRlcmVyKCk7CkluZGV4OiBiaW5kaW5n
cy9vYmpjL0RPTVByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9vYmpjL0RPTVByaXZh
dGUuaAkocmV2aXNpb24gMTI5NDYpCisrKyBiaW5kaW5ncy9vYmpjL0RPTVByaXZhdGUuaAkod29y
a2luZyBjb3B5KQpAQCAtMzksNyArMzksNiBAQAogCiBAaW50ZXJmYWNlIERPTUVsZW1lbnQgKFdl
YlByaXZhdGUpCiAtIChOU0ZvbnQgKilfZm9udDsKLS0gKE5TSW1hZ2UgKilfaW1hZ2U7CiAtIChO
U0RhdGEgKilfaW1hZ2VUSUZGUmVwcmVzZW50YXRpb247CiAtIChOU1VSTCAqKV9nZXRVUkxBdHRy
aWJ1dGU6KE5TU3RyaW5nICopbmFtZTsKIEBlbmQKQEAgLTc2LDggKzc1LDggQEAKIC0gKHZvaWQp
X2FjdGl2YXRlSXRlbUF0SW5kZXg6KGludClpbmRleDsKIEBlbmQKIAotLy8gQkVHSU4gUEVORElO
RyBQVUJMSUMgV0VCIElOU1BFQ1RPUiBBUElTCi0vLyBUaGVzZSBBUElzIGFyZSBmb3IgdGhlIFdl
YiBJbnNwZWN0b3IsIGFuZCB0aGV5IHdpbGwgYmUgbWFkZSBwdWJsaWMgZXZlbnR1YWxseS4KKy8v
IEJFR0lOIFBFTkRJTkcgUFVCTElDIEFQSVMKKy8vIFRoZXNlIEFQSXMgd2lsbCBiZSBtYWRlIHB1
YmxpYyBldmVudHVhbGx5LgogQGludGVyZmFjZSBET01BdHRyIChET01BdHRyRXh0ZW5zaW9ucykK
IC0gKERPTUNTU1N0eWxlRGVjbGFyYXRpb24gKilzdHlsZTsKIEBlbmQKQEAgLTEwNywxMSArMTA2
LDMxIEBACiBAZW5kCiAKIEBpbnRlcmZhY2UgRE9NRWxlbWVudCAoRE9NRWxlbWVudEV4dGVuc2lv
bnMpCistIChOU0ltYWdlICopaW1hZ2U7CiAtICh2b2lkKWZvY3VzOwogLSAodm9pZClibHVyOwog
LSAodm9pZClzY3JvbGxJbnRvVmlldzooQk9PTClhbGlnblRvcDsKIC0gKHZvaWQpc2Nyb2xsSW50
b1ZpZXdJZk5lZWRlZDooQk9PTCljZW50ZXJJZk5lZWRlZDsKIEBlbmQKKworQGludGVyZmFjZSBE
T01IVE1MRWxlbWVudCAoRE9NSFRNTEVsZW1lbnRQZW5kaW5nUHVibGljKQorLSAoTlNTdHJpbmcg
Kil0aXRsZURpc3BsYXlTdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTElucHV0RWxl
bWVudCAoRE9NSFRNTElucHV0RWxlbWVudFBlbmRpbmdQdWJsaWMpCistIChOU1N0cmluZyAqKWFs
dERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29sdXRlSW1hZ2VVUkw7CitAZW5kCisKK0Bp
bnRlcmZhY2UgRE9NSFRNTEltYWdlRWxlbWVudCAoRE9NSFRNTEltYWdlRWxlbWVudFBlbmRpbmdQ
dWJsaWMpCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29s
dXRlSW1hZ2VVUkw7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTE9iamVjdEVsZW1lbnQgKERP
TUhUTUxPYmplY3RFbGVtZW50UGVuZGluZ1B1YmxpYykKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFn
ZVVSTDsKK0BlbmQKKwogLy8gRU5ECiAKIC8vIFBlbmRpbmcgRE9NMyBBUElzCkluZGV4OiBiaW5k
aW5ncy9vYmpjL0RPTUhUTUwubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYmluZGluZ3Mvb2JqYy9ET01IVE1M
Lm1tCShyZXZpc2lvbiAxMjk0NikKKysrIGJpbmRpbmdzL29iamMvRE9NSFRNTC5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2ltcG9ydCAiRE9NSFRNTC5oIgogCiAjaW1wb3J0
ICJQbGF0Zm9ybVN0cmluZy5oIgorI2ltcG9ydCAiRnJhbWUuaCIKICNpbXBvcnQgImh0bWxfYmFz
ZWltcGwuaCIKICNpbXBvcnQgImh0bWxfYmxvY2tpbXBsLmgiCiAjaW1wb3J0ICJodG1sX2RvY3Vt
ZW50aW1wbC5oIgpAQCAtNTgsNiArNTksNyBAQAogCiAjaW1wb3J0ICJET01FeHRlbnNpb25zLmgi
CiAjaW1wb3J0ICJET01JbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NUHJpdmF0ZS5oIgogI2ltcG9y
dCAiRE9NSFRNTEludGVybmFsLmgiCiAjaW1wb3J0IDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CiAj
aW1wb3J0ICJLV1FGb3VuZGF0aW9uRXh0cmFzLmgiCkBAIC0yNTksNiArMjYxLDE2IEBAIHVzaW5n
IG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKICAgICByZXR1cm4gW3NlbGYgX0hUTUxFbGVtZW50
SW1wbF0tPnRpdGxlKCk7CiB9CiAKKy0gKE5TU3RyaW5nICopdGl0bGVEaXNwbGF5U3RyaW5nCit7
CisgICAgRnJhbWUgKmZyYW1lID0gW3NlbGYgX2VsZW1lbnRJbXBsXS0+Z2V0RG9jdW1lbnQoKS0+
ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gW3NlbGYgX0hUTUxFbGVt
ZW50SW1wbF0tPnRpdGxlKCk7CisgICAgUVN0cmluZyB0aXRsZVRleHQgPSBbc2VsZiBfSFRNTEVs
ZW1lbnRJbXBsXS0+dGl0bGUoKS5xc3RyaW5nKCk7CisgICAgdGl0bGVUZXh0LnJlcGxhY2UoUUNo
YXIoJ1xcJyksIGZyYW1lLT5iYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOworICAgIHJldHVy
biB0aXRsZVRleHQuZ2V0TlNTdHJpbmcoKTsKK30KKwogLSAodm9pZClzZXRUaXRsZTooTlNTdHJp
bmcgKil0aXRsZQogewogICAgIFtzZWxmIF9IVE1MRWxlbWVudEltcGxdLT5zZXRUaXRsZSh0aXRs
ZSk7CkBAIC0xMjgwLDYgKzEyOTIsMTYgQEAgdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVz
OwogICAgIHJldHVybiBbc2VsZiBfaW5wdXRFbGVtZW50SW1wbF0tPmFsdCgpOwogfQogCistIChO
U1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmcKK3sKKyAgICBGcmFtZSAqZnJhbWUgPSBbc2VsZiBf
ZWxlbWVudEltcGxdLT5nZXREb2N1bWVudCgpLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisg
ICAgICAgIHJldHVybiBbc2VsZiBfaW5wdXRFbGVtZW50SW1wbF0tPmFsdCgpOworICAgIFFTdHJp
bmcgYWx0VGV4dCA9IFtzZWxmIF9pbnB1dEVsZW1lbnRJbXBsXS0+YWx0KCkucXN0cmluZygpOwor
ICAgIGFsdFRleHQucmVwbGFjZShRQ2hhcignXFwnKSwgZnJhbWUtPmJhY2tzbGFzaEFzQ3VycmVu
Y3lTeW1ib2woKSk7CisgICAgcmV0dXJuIGFsdFRleHQuZ2V0TlNTdHJpbmcoKTsKK30KKwogLSAo
dm9pZClzZXRBbHQ6KE5TU3RyaW5nICopYWx0CiB7CiAgICAgW3NlbGYgX2lucHV0RWxlbWVudElt
cGxdLT5zZXRBbHQoYWx0KTsKQEAgLTEzNDUsNiArMTM2NywxMyBAQCB1c2luZyBuYW1lc3BhY2Ug
RE9NOjpIVE1MTmFtZXM7CiAgICAgW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5zZXRTaXplKHNp
emUpOwogfQogCistIChOU1VSTCAqKWFic29sdXRlSW1hZ2VVUkwKK3sKKyAgICBpZiAoIVtzZWxm
IF9pbnB1dEVsZW1lbnRJbXBsXS0+cmVuZGVyZXIoKSB8fCAhW3NlbGYgX2lucHV0RWxlbWVudElt
cGxdLT5yZW5kZXJlcigpLT5pc0ltYWdlKCkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgcmV0
dXJuIFtzZWxmIF9nZXRVUkxBdHRyaWJ1dGU6QCJzcmMiXTsKK30KKwogLSAoTlNTdHJpbmcgKilz
cmMKIHsKICAgICByZXR1cm4gW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5zcmMoKTsKQEAgLTIx
NjUsNiArMjE5NCwxMSBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAgICAgW3Nl
bGYgX2FuY2hvckVsZW1lbnRJbXBsXS0+c2V0QXR0cmlidXRlKGNvb3Jkc0F0dHIsIGNvb3Jkcyk7
CiB9CiAKKy0gKE5TVVJMICopYWJzb2x1dGVMaW5rVVJMCit7CisgICAgcmV0dXJuIFtzZWxmIF9n
ZXRVUkxBdHRyaWJ1dGU6QCJocmVmIl07Cit9CisKIC0gKE5TU3RyaW5nICopaHJlZgogewogICAg
IHJldHVybiBbc2VsZiBfYW5jaG9yRWxlbWVudEltcGxdLT5ocmVmKCk7CkBAIC0yMzAyLDYgKzIz
MzYsMTYgQEAgdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAgIHJldHVybiBbc2Vs
ZiBfaW1hZ2VFbGVtZW50SW1wbF0tPmdldEF0dHJpYnV0ZShhbHRBdHRyKTsKIH0KIAorLSAoTlNT
dHJpbmcgKilhbHREaXNwbGF5U3RyaW5nCit7CisgICAgRnJhbWUgKmZyYW1lID0gW3NlbGYgX2Vs
ZW1lbnRJbXBsXS0+Z2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAg
ICAgICByZXR1cm4gW3NlbGYgX2ltYWdlRWxlbWVudEltcGxdLT5nZXRBdHRyaWJ1dGUoYWx0QXR0
cik7CisgICAgUVN0cmluZyBhbHRUZXh0ID0gW3NlbGYgX2ltYWdlRWxlbWVudEltcGxdLT5nZXRB
dHRyaWJ1dGUoYWx0QXR0cikucXN0cmluZygpOworICAgIGFsdFRleHQucmVwbGFjZShRQ2hhcign
XFwnKSwgZnJhbWUtPmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7CisgICAgcmV0dXJuIGFs
dFRleHQuZ2V0TlNTdHJpbmcoKTsKK30KKwogLSAodm9pZClzZXRBbHQ6KE5TU3RyaW5nICopYWx0
CiB7CiAgICAgW3NlbGYgX2ltYWdlRWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUoYWx0QXR0ciwg
YWx0KTsKQEAgLTIzNTksNiArMjQwMywxMSBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFt
ZXM7CiAgICAgW3NlbGYgX2ltYWdlRWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUobG9uZ2Rlc2NB
dHRyLCBsb25nRGVzYyk7CiB9CiAKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFnZVVSTAoreworICAg
IHJldHVybiBbc2VsZiBfZ2V0VVJMQXR0cmlidXRlOkAic3JjIl07Cit9CisKIC0gKE5TU3RyaW5n
ICopc3JjCiB7CiAgICAgcmV0dXJuIFtzZWxmIF9pbWFnZUVsZW1lbnRJbXBsXS0+c3JjKCk7CkBA
IC0yNDc1LDYgKzI1MjQsMTMgQEAgdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAg
IFtzZWxmIF9vYmplY3RFbGVtZW50SW1wbF0tPnNldEF0dHJpYnV0ZShjb2RldHlwZUF0dHIsIGNv
ZGVUeXBlKTsKIH0KIAorLSAoTlNVUkwgKilhYnNvbHV0ZUltYWdlVVJMCit7CisgICAgaWYgKCFb
c2VsZiBfb2JqZWN0RWxlbWVudEltcGxdLT5yZW5kZXJlcigpIHx8ICFbc2VsZiBfb2JqZWN0RWxl
bWVudEltcGxdLT5yZW5kZXJlcigpLT5pc0ltYWdlKCkpCisgICAgICAgIHJldHVybiBuaWw7Cisg
ICAgcmV0dXJuIFtzZWxmIF9nZXRVUkxBdHRyaWJ1dGU6QCJkYXRhIl07Cit9CisKIC0gKE5TU3Ry
aW5nICopZGF0YQogewogICAgIHJldHVybiBbc2VsZiBfb2JqZWN0RWxlbWVudEltcGxdLT5nZXRB
dHRyaWJ1dGUoZGF0YUF0dHIpOwpAQCAtMjY2Niw2ICsyNzIyLDE2IEBAIHVzaW5nIG5hbWVzcGFj
ZSBET006OkhUTUxOYW1lczsKICAgICByZXR1cm4gW3NlbGYgX2FwcGxldEVsZW1lbnRJbXBsXS0+
Z2V0QXR0cmlidXRlKGFsdEF0dHIpOwogfQogCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJp
bmcKK3sKKyAgICBGcmFtZSAqZnJhbWUgPSBbc2VsZiBfZWxlbWVudEltcGxdLT5nZXREb2N1bWVu
dCgpLT5mcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBbc2VsZiBfYXBw
bGV0RWxlbWVudEltcGxdLT5nZXRBdHRyaWJ1dGUoYWx0QXR0cik7CisgICAgUVN0cmluZyBhbHRU
ZXh0ID0gW3NlbGYgX2FwcGxldEVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0dHIpLnFz
dHJpbmcoKTsKKyAgICBhbHRUZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIGZyYW1lLT5iYWNrc2xh
c2hBc0N1cnJlbmN5U3ltYm9sKCkpOworICAgIHJldHVybiBhbHRUZXh0LmdldE5TU3RyaW5nKCk7
Cit9CisKIC0gKHZvaWQpc2V0QWx0OihOU1N0cmluZyAqKWFsdAogewogICAgIFtzZWxmIF9hcHBs
ZXRFbGVtZW50SW1wbF0tPnNldEF0dHJpYnV0ZShhbHRBdHRyLCBhbHQpOwpAQCAtMjgxMiw2ICsy
ODc4LDE2IEBAIHVzaW5nIG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKICAgICByZXR1cm4gW3Nl
bGYgX2FyZWFFbGVtZW50SW1wbF0tPmdldEF0dHJpYnV0ZShhbHRBdHRyKTsKIH0KIAorLSAoTlNT
dHJpbmcgKilhbHREaXNwbGF5U3RyaW5nCit7CisgICAgRnJhbWUgKmZyYW1lID0gW3NlbGYgX2Vs
ZW1lbnRJbXBsXS0+Z2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAg
ICAgICByZXR1cm4gW3NlbGYgX2FyZWFFbGVtZW50SW1wbF0tPmdldEF0dHJpYnV0ZShhbHRBdHRy
KTsKKyAgICBRU3RyaW5nIGFsdFRleHQgPSBbc2VsZiBfYXJlYUVsZW1lbnRJbXBsXS0+Z2V0QXR0
cmlidXRlKGFsdEF0dHIpLnFzdHJpbmcoKTsKKyAgICBhbHRUZXh0LnJlcGxhY2UoUUNoYXIoJ1xc
JyksIGZyYW1lLT5iYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOworICAgIHJldHVybiBhbHRU
ZXh0LmdldE5TU3RyaW5nKCk7Cit9CisKIC0gKHZvaWQpc2V0QWx0OihOU1N0cmluZyAqKWFsdAog
ewogICAgIFtzZWxmIF9hcmVhRWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUoYWx0QXR0ciwgYWx0
KTsKSW5kZXg6IGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJpZGdlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
YnJpZGdlL21hYy9XZWJDb3JlRnJhbWVCcmlkZ2UuaAkocmV2aXNpb24gMTI5NDYpCisrKyBicmlk
Z2UvbWFjL1dlYkNvcmVGcmFtZUJyaWRnZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMDIsNyArMzAy
LDkgQEAgdHlwZWRlZiBlbnVtIHsKIC0gKE5TT2JqZWN0ICopY29weVJlbmRlclRyZWU6KGlkIDxX
ZWJDb3JlUmVuZGVyVHJlZUNvcGllcj4pY29waWVyOwogLSAoTlNTdHJpbmcgKilyZW5kZXJUcmVl
QXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOwogCi0tIChOU0RpY3Rpb25hcnkgKillbGVtZW50QXRQ
b2ludDooTlNQb2ludClwb2ludDsKKy0gKHZvaWQpZ2V0SW5uZXJOb25TaGFyZWROb2RlOihET01O
b2RlICoqKWlubmVyTm9uU2hhcmVkTm9kZSBpbm5lck5vZGU6KERPTU5vZGUgKiopaW5uZXJOb2Rl
IFVSTEVsZW1lbnQ6KERPTUVsZW1lbnQgKiopVVJMRWxlbWVudCBhdFBvaW50OihOU1BvaW50KXBv
aW50OworLSAoQk9PTClpc1BvaW50SW5zaWRlU2VsZWN0aW9uOihOU1BvaW50KXBvaW50OworCiAt
IChOU1VSTCAqKVVSTFdpdGhBdHRyaWJ1dGVTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5nOwogCiAt
IChET01FbGVtZW50ICopZWxlbWVudFdpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUgaW5Gb3JtOihE
T01FbGVtZW50ICopZm9ybTsKSW5kZXg6IGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJpZGdlLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJpZGdlLm1tCShyZXZpc2lv
biAxMjk0NikKKysrIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJpZGdlLm1tCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzQsNyArMTM0LDcgQEAgTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50TGlua1Rhcmdl
dEZyYW1lSwogTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50TGlua0xhYmVsS2V5ID0gICAgICAgICAg
QCJXZWJFbGVtZW50TGlua0xhYmVsIjsKIE5TU3RyaW5nICpXZWJDb3JlRWxlbWVudExpbmtUaXRs
ZUtleSA9ICAgICAgICAgIEAiV2ViRWxlbWVudExpbmtUaXRsZSI7CiBOU1N0cmluZyAqV2ViQ29y
ZUVsZW1lbnROYW1lS2V5ID0gICAgICAgICAgICAgICBAIldlYkVsZW1lbnROYW1lIjsKLU5TU3Ry
aW5nICpXZWJDb3JlRWxlbWVudFRpdGxlS2V5ID0gICAgICAgICAgICAgIEAiV2ViQ29yZUVsZW1l
bnRUaXRsZSI7IC8vIG5vdCBpbiBXZWJLaXQgQVBJIGZvciBub3csIGNvdWxkIGJlIGluIEFQSSBz
b21lIGRheQorTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50VGl0bGVLZXkgPSAgICAgICAgICAgICAg
QCJXZWJFbGVtZW50VGl0bGUiOyAvLyBub3QgaW4gV2ViS2l0IEFQSSBmb3Igbm93LCBjb3VsZCBi
ZSBpbiBBUEkgc29tZSBkYXkKIAogTlNTdHJpbmcgKldlYkNvcmVQYWdlQ2FjaGVTdGF0ZUtleSA9
ICAgICAgICAgICAgQCJXZWJDb3JlUGFnZUNhY2hlU3RhdGUiOwogCkBAIC0xMjgxLDEwNyArMTI4
MSwyMSBAQCBzdGF0aWMgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybUVsZW1lbnRGCiAgICAgcmV0
dXJuIG1fZnJhbWUtPm1hdGNoTGFiZWxzQWdhaW5zdEVsZW1lbnQobGFiZWxzLCBbZWxlbWVudCBf
ZWxlbWVudEltcGxdKTsKIH0KIAotLSAoTlNEaWN0aW9uYXJ5ICopZWxlbWVudEF0UG9pbnQ6KE5T
UG9pbnQpcG9pbnQKKy0gKHZvaWQpZ2V0SW5uZXJOb25TaGFyZWROb2RlOihET01Ob2RlICoqKWlu
bmVyTm9uU2hhcmVkTm9kZSBpbm5lck5vZGU6KERPTU5vZGUgKiopaW5uZXJOb2RlIFVSTEVsZW1l
bnQ6KERPTUVsZW1lbnQgKiopVVJMRWxlbWVudCBhdFBvaW50OihOU1BvaW50KXBvaW50CiB7CiAg
ICAgUmVuZGVyT2JqZWN0ICpyZW5kZXJlciA9IG1fZnJhbWUtPnJlbmRlcmVyKCk7CiAgICAgaWYg
KCFyZW5kZXJlcikgCi0gICAgICAgIHJldHVybiBuaWw7Ci0gICAgCi0gICAgUmVuZGVyT2JqZWN0
OjpOb2RlSW5mbyBub2RlSW5mbyA9IFtzZWxmIG5vZGVJbmZvQXRQb2ludDpwb2ludF07Ci0gICAg
Ci0gICAgTlNNdXRhYmxlRGljdGlvbmFyeSAqZWxlbWVudCA9IFtOU011dGFibGVEaWN0aW9uYXJ5
IGRpY3Rpb25hcnldOwotICAgIFtlbGVtZW50IHNldE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0
aEJvb2w6bV9mcmFtZS0+aXNQb2ludEluc2lkZVNlbGVjdGlvbigoaW50KXBvaW50LngsIChpbnQp
cG9pbnQueSldCi0gICAgICAgICAgICAgICAgZm9yS2V5OldlYkNvcmVFbGVtZW50SXNTZWxlY3Rl
ZEtleV07Ci0KLSAgICAvLyBGaW5kIHRoZSB0aXRsZSBpbiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcg
RE9NIG5vZGUuCi0gICAgLy8gRm9yIDxhcmVhPiB0YWdzIGluIGltYWdlIG1hcHMsIHdhbGsgdGhl
IHRyZWUgZm9yIHRoZSA8YXJlYT4sIG5vdCB0aGUgPGltZz4gdXNpbmcgaXQuCi0gICAgZm9yIChO
b2RlSW1wbCAqdGl0bGVOb2RlID0gbm9kZUluZm8uaW5uZXJOb2RlKCk7IHRpdGxlTm9kZTsgdGl0
bGVOb2RlID0gdGl0bGVOb2RlLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgaWYgKHRpdGxlTm9k
ZS0+aXNFbGVtZW50Tm9kZSgpKSB7Ci0gICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHRp
dGxlID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4odGl0bGVOb2RlKS0+Z2V0QXR0cmlidXRl
KHRpdGxlQXR0cik7Ci0gICAgICAgICAgICBpZiAoIXRpdGxlLmlzTnVsbCgpKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gV2UgZm91bmQgYSBub2RlIHdpdGggYSB0aXRsZS4KLSAgICAgICAgICAgICAg
ICBRU3RyaW5nIHRpdGxlVGV4dCA9IHRpdGxlLnFzdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB0
aXRsZVRleHQucmVwbGFjZShRQ2hhcignXFwnKSwgbV9mcmFtZS0+YmFja3NsYXNoQXNDdXJyZW5j
eVN5bWJvbCgpKTsKLSAgICAgICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6dGl0bGVUZXh0
LmdldE5TU3RyaW5nKCkgZm9yS2V5OldlYkNvcmVFbGVtZW50VGl0bGVLZXldOwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTm9k
ZUltcGwgKlVSTE5vZGUgPSBub2RlSW5mby5VUkxFbGVtZW50KCk7Ci0gICAgaWYgKFVSTE5vZGUp
IHsKLSAgICAgICAgRWxlbWVudEltcGwgKmUgPSBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihV
UkxOb2RlKTsKLSAgICAgICAgRG9jdW1lbnRJbXBsICpkb2MgPSBlLT5nZXREb2N1bWVudCgpOwot
ICAgICAgICBBU1NFUlQoZG9jKTsKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IEF0b21pY1N0cmlu
ZyYgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKLSAgICAgICAgaWYgKCF0aXRs
ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFFTdHJpbmcgdGl0bGVUZXh0ID0gdGl0bGUucXN0
cmluZygpOwotICAgICAgICAgICAgdGl0bGVUZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIG1fZnJh
bWUtPmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgICAgICAgICBbZWxlbWVudCBz
ZXRPYmplY3Q6dGl0bGVUZXh0LmdldE5TU3RyaW5nKCkgZm9yS2V5OldlYkNvcmVFbGVtZW50TGlu
a1RpdGxlS2V5XTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29uc3QgQXRvbWljU3Ry
aW5nJiBsaW5rID0gZS0+Z2V0QXR0cmlidXRlKGhyZWZBdHRyKTsKLSAgICAgICAgaWYgKCFsaW5r
LmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBRU3RyaW5nIHQgPSBwbGFpblRleHQocmFuZ2VPZkNv
bnRlbnRzKGUpLmdldCgpKTsKLSAgICAgICAgICAgIGlmICghdC5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6dC5nZXROU1N0cmluZygpIGZvcktleTpXZWJD
b3JlRWxlbWVudExpbmtMYWJlbEtleV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRU3Ry
aW5nIFVSTFN0cmluZyA9IHBhcnNlVVJMKGxpbmspLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIFtl
bGVtZW50IHNldE9iamVjdDpkb2MtPmNvbXBsZXRlVVJMKFVSTFN0cmluZykuZ2V0TlNTdHJpbmco
KSBmb3JLZXk6V2ViQ29yZUVsZW1lbnRMaW5rVVJMS2V5XTsKLSAgICAgICAgfQotICAgICAgICAK
LSAgICAgICAgRE9NU3RyaW5nIHRhcmdldCA9IGUtPmdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsK
LSAgICAgICAgaWYgKHRhcmdldC5pc0VtcHR5KCkgJiYgZG9jKSB7IC8vIEZJWE1FOiBUYWtlIG91
dCB0aGlzIGRvYyBjaGVjayB3aGVuIHdlJ3JlIG5vdCBqdXN0IGJlZm9yZSBhIHJlbGVhc2UuCi0g
ICAgICAgICAgICB0YXJnZXQgPSBkb2MtPmJhc2VUYXJnZXQoKTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAoIXRhcmdldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFtlbGVtZW50IHNldE9iamVj
dDp0YXJnZXQucXN0cmluZygpLmdldE5TU3RyaW5nKCkgZm9yS2V5OldlYkNvcmVFbGVtZW50TGlu
a1RhcmdldEZyYW1lS2V5XTsKLSAgICAgICAgfQotICAgIH0KKyAgICAgICAgcmV0dXJuOwogCi0g
ICAgTm9kZUltcGwgKm5vZGUgPSBub2RlSW5mby5pbm5lck5vblNoYXJlZE5vZGUoKTsKLSAgICBp
ZiAobm9kZSkgewotICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6W0RPTU5vZGUgX25vZGVXaXRo
SW1wbDpub2RlXSBmb3JLZXk6V2ViQ29yZUVsZW1lbnRET01Ob2RlS2V5XTsKLSAgICAKLSAgICAg
ICAgLy8gT25seSByZXR1cm4gaW1hZ2UgaW5mb3JtYXRpb24gaWYgdGhlcmUgaXMgYW4gaW1hZ2Uu
Ci0gICAgICAgIGlmIChub2RlLT5yZW5kZXJlcigpICYmIG5vZGUtPnJlbmRlcmVyKCktPmlzSW1h
Z2UoKSkgewotICAgICAgICAgICAgUmVuZGVySW1hZ2UgKnIgPSBzdGF0aWNfY2FzdDxSZW5kZXJJ
bWFnZSAqPihub2RlLT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIGludCB4LCB5OwotICAgICAg
ICAgICAgaWYgKHItPmFic29sdXRlUG9zaXRpb24oeCwgeSkpIHsKLSAgICAgICAgICAgICAgICBO
U1ZhbHVlICpyZWN0ID0gW05TVmFsdWUgdmFsdWVXaXRoUmVjdDpOU01ha2VSZWN0KHgsIHksIHIt
PmNvbnRlbnRXaWR0aCgpLCByLT5jb250ZW50SGVpZ2h0KCkpXTsKLSAgICAgICAgICAgICAgICBb
ZWxlbWVudCBzZXRPYmplY3Q6cmVjdCBmb3JLZXk6V2ViQ29yZUVsZW1lbnRJbWFnZVJlY3RLZXld
OwotICAgICAgICAgICAgfQorICAgIFJlbmRlck9iamVjdDo6Tm9kZUluZm8gbm9kZUluZm8gPSBb
c2VsZiBub2RlSW5mb0F0UG9pbnQ6cG9pbnRdOworICAgICppbm5lck5vblNoYXJlZE5vZGUgPSBb
RE9NTm9kZSBfbm9kZVdpdGhJbXBsOm5vZGVJbmZvLmlubmVyTm9uU2hhcmVkTm9kZSgpXTsKKyAg
ICAqaW5uZXJOb2RlID0gW0RPTU5vZGUgX25vZGVXaXRoSW1wbDpub2RlSW5mby5pbm5lck5vZGUo
KV07CisgICAgKlVSTEVsZW1lbnQgPSBbRE9NTm9kZSBfbm9kZVdpdGhJbXBsOm5vZGVJbmZvLlVS
TEVsZW1lbnQoKV07Cit9CiAKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsICppID0gc3RhdGljX2Nh
c3Q8RWxlbWVudEltcGwqPihub2RlKTsKLSAgICAKLSAgICAgICAgICAgIC8vIEZJWE1FOiBDb2Rl
IGNvcGllZCBmcm9tIFJlbmRlckltYWdlOjp1cGRhdGVGcm9tRWxlbWVudDsgc2hvdWxkIHNoYXJl
LgotICAgICAgICAgICAgRE9NU3RyaW5nIGF0dHI7Ci0gICAgICAgICAgICBpZiAoaS0+aGFzVGFn
TmFtZShvYmplY3RUYWcpKSB7Ci0gICAgICAgICAgICAgICAgYXR0ciA9IGktPmdldEF0dHJpYnV0
ZShkYXRhQXR0cik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF0dHIg
PSBpLT5nZXRBdHRyaWJ1dGUoc3JjQXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBp
ZiAoIWF0dHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgUVN0cmluZyBVUkxTdHJpbmcg
PSBwYXJzZVVSTChhdHRyKS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgW2VsZW1lbnQgc2V0
T2JqZWN0OmktPmdldERvY3VtZW50KCktPmNvbXBsZXRlVVJMKFVSTFN0cmluZykuZ2V0TlNTdHJp
bmcoKSBmb3JLZXk6V2ViQ29yZUVsZW1lbnRJbWFnZVVSTEtleV07Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZJWE1FOiBDb2RlIGNvcGllZCBmcm9tIFJlbmRl
ckltYWdlOjp1cGRhdGVGcm9tRWxlbWVudDsgc2hvdWxkIHNoYXJlLgotICAgICAgICAgICAgRE9N
U3RyaW5nIGFsdDsKLSAgICAgICAgICAgIGlmIChpLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkKLSAg
ICAgICAgICAgICAgICBhbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCAqPihp
KS0+YWx0VGV4dCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoaS0+aGFzVGFnTmFtZShpbWdUYWcp
KQotICAgICAgICAgICAgICAgIGFsdCA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1lbnRJbXBs
ICo+KGkpLT5hbHRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWFsdC5pc051bGwoKSkgewotICAg
ICAgICAgICAgICAgIFFTdHJpbmcgYWx0VGV4dCA9IGFsdC5xc3RyaW5nKCk7Ci0gICAgICAgICAg
ICAgICAgYWx0VGV4dC5yZXBsYWNlKFFDaGFyKCdcXCcpLCBtX2ZyYW1lLT5iYWNrc2xhc2hBc0N1
cnJlbmN5U3ltYm9sKCkpOwotICAgICAgICAgICAgICAgIFtlbGVtZW50IHNldE9iamVjdDphbHRU
ZXh0LmdldE5TU3RyaW5nKCkgZm9yS2V5OldlYkNvcmVFbGVtZW50SW1hZ2VBbHRTdHJpbmdLZXld
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBlbGVt
ZW50OworLSAoQk9PTClpc1BvaW50SW5zaWRlU2VsZWN0aW9uOihOU1BvaW50KXBvaW50Cit7Cisg
ICAgcmV0dXJuIG1fZnJhbWUtPmlzUG9pbnRJbnNpZGVTZWxlY3Rpb24oKGludClwb2ludC54LCAo
aW50KXBvaW50LnkpOwogfQogCiAtIChOU1VSTCAqKVVSTFdpdGhBdHRyaWJ1dGVTdHJpbmc6KE5T
U3RyaW5nICopc3RyaW5nCkluZGV4OiBXZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24g
MTI5NDYpCisrKyBXZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5
KQpAQCAtMjk1LDYgKzI5NSw4IEBACiAJCTkzOTgxMTJFMDgyNEJGMDEwMDhERjAzOCAvKiBsaWJp
Y3Vjb3JlLmR5bGliIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gOTNENjIzREQwNTFFNzkxRjAwMkY0N0REIC8qIGxpYmljdWNvcmUuZHlsaWIgKi87IH07
CiAJCTkzOTgxMTJGMDgyNEJGMDEwMDhERjAzOCAvKiBTZWN1cml0eS5mcmFtZXdvcmsgaW4gRnJh
bWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzBFODFFMDA1ODUz
QUMwMDBBRDA4OTEgLyogU2VjdXJpdHkuZnJhbWV3b3JrICovOyB9OwogCQlBQkRERjIwRDA4RUIw
RERDMDAxRTEyNDEgLyogV2ViRG93bmxvYWRJbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQUJEREYyMEMwOEVCMEREQzAwMUUxMjQxIC8qIFdl
YkRvd25sb2FkSW50ZXJuYWwuaCAqLzsgfTsKKwkJREQ4OTY4MjAwOUFBODcyNDAwOTdFN0YwIC8q
IFdlYkVsZW1lbnREaWN0aW9uYXJ5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBERDg5NjgxRTA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rp
b25hcnkuaCAqLzsgfTsKKwkJREQ4OTY4MjEwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnRE
aWN0aW9uYXJ5Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBERDg5NjgxRjA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkubSAqLzsg
fTsKIAkJRUQ2QkUyRTcwODhDMzJCNTAwNDRERURDIC8qIFdlYk5TQXR0cmlidXRlZFN0cmluZ0V4
dHJhcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUQ2
QkUyRTUwODhDMzJCNTAwNDRERURDIC8qIFdlYk5TQXR0cmlidXRlZFN0cmluZ0V4dHJhcy5oICov
OyB9OwogCQlFRDZCRTJFODA4OEMzMkI1MDA0NERFREMgLyogV2ViTlNBdHRyaWJ1dGVkU3RyaW5n
RXh0cmFzLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBF
RDZCRTJFNjA4OEMzMkI1MDA0NERFREMgLyogV2ViTlNBdHRyaWJ1dGVkU3RyaW5nRXh0cmFzLm0g
Ki87IH07CiAJCUVEN0Y2RDhCMDk4MDY4MzUwMEMyMzVFRCAvKiBXZWJOU0RhdGFFeHRyYXNQcml2
YXRlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFRDdG
NkQ4QTA5ODA2ODM1MDBDMjM1RUQgLyogV2ViTlNEYXRhRXh0cmFzUHJpdmF0ZS5oICovOyBzZXR0
aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC01NTMsNiArNTU1LDgg
QEAKIAkJQkVFMThGOUEwNDcyQjczMjAwQ0EyODlDIC8qIFdlYkxvY2FsaXphYmxlU3RyaW5ncy5t
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRX
aWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBX
ZWJMb2NhbGl6YWJsZVN0cmluZ3MubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGgg
PSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUJFRTUyRDRBMDQ3MzAzMjUwMENBMjg5QyAvKiBXZWJL
aXRTeXN0ZW1CaXRzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gV2ViS2l0U3lzdGVtQml0cy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJX
aWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJQkVFNTJENEIwNDczMDMyNTAwQ0EyODlDIC8q
IFdlYktpdFN5c3RlbUJpdHMubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLm9iamM7IHBhdGggPSBXZWJLaXRTeXN0ZW1CaXRzLm07IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OworCQlERDg5NjgxRTA5QUE4NzI0MDA5
N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXZWJFbGVtZW50RGljdGlvbmFyeS5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKKwkJREQ4OTY4
MUYwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5Lm0gKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gV2ViRWxlbWVudERpY3Rp
b25hcnkubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9
IDA7IH07CiAJCUVEMjFCOTgxMDUyOEY3QUEwMDMyOTlBQyAvKiBXZWJEb2N1bWVudEludGVybmFs
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50
V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2Vi
RG9jdW1lbnRJbnRlcm5hbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7
IHVzZXNUYWJzID0gMDsgfTsKIAkJRUQyQjI0NzQwMzNBMkRBODAwQzFBNTI2IC8qIFdlYk5TUGFz
dGVib2FyZEV4dHJhcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IFdlYk5TUGFzdGVib2FyZEV4dHJhcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJRUQyQjI0NzUwMzNBMkRBODAwQzFB
NTI2IC8qIFdlYk5TUGFzdGVib2FyZEV4dHJhcy5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFdlYk5TUGFzdGVib2FyZEV4dHJhcy5tOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKQEAgLTgw
MSw2ICs4MDUsOCBAQAogCQkJCUY1OTY2OEM5MDJBRDI5MjMwMTg2MzVDQSAvKiBXZWJTdHJpbmdU
cnVuY2F0b3IubSAqLywKIAkJCQk2NTc4RjVERTA0NUY4MTc0MDAwMDAxMjggLyogV2ViRG93bmxv
YWQuaCAqLywKIAkJCQk2NTc4RjVERjA0NUY4MTc0MDAwMDAxMjggLyogV2ViRG93bmxvYWQubSAq
LywKKwkJCQlERDg5NjgxRTA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnku
aCAqLywKKwkJCQlERDg5NjgxRjA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25h
cnkubSAqLywKIAkJCSk7CiAJCQlwYXRoID0gTWlzYzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7CkBAIC0xMzEyLDYgKzEzMTgsNyBAQAogCQkJCUVEN0Y2RDhCMDk4MDY4MzUwMEMyMzVFRCAv
KiBXZWJOU0RhdGFFeHRyYXNQcml2YXRlLmggaW4gSGVhZGVycyAqLywKIAkJCQk2NTE5NTFFMjA5
OTc0MTc4MDAzREZDNjUgLyogV2ViTG9hZGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk2NTUwQjdD
NzA5OUVGQUU5MDA5MEQ3ODEgLyogV2ViQXJjaGl2ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCURE
ODk2ODIwMDlBQTg3MjQwMDk3RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7
CiAJCX07CkBAIC0xODQyLDYgKzE4NDksNyBAQAogCQkJCTFDNjhGNjcyMDk1QjVGQzEwMEMyOTg0
RSAvKiBXZWJOb2RlSGlnaGxpZ2h0Vmlldy5tIGluIFNvdXJjZXMgKi8sCiAJCQkJNjVDN0Y0MkQw
OTc5REU2NDAwMjJFNDUzIC8qIFdlYlBhZ2VCcmlkZ2UubSBpbiBTb3VyY2VzICovLAogCQkJCTY1
NTBCN0M4MDk5RUZBRTkwMDkwRDc4MSAvKiBXZWJBcmNoaXZlci5tIGluIFNvdXJjZXMgKi8sCisJ
CQkJREQ4OTY4MjEwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5Lm0gaW4g
U291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5n
ID0gMDsKIAkJfTsKSW5kZXg6IE1pc2MvV2ViRWxlbWVudERpY3Rpb25hcnkuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBNaXNjL1dlYkVsZW1lbnREaWN0aW9uYXJ5LmgJKHJldmlzaW9uIDApCisrKyBNaXNjL1dl
YkVsZW1lbnREaWN0aW9uYXJ5LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDMgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9OU0RpY3Rpb25hcnkuaD4KKworQGNsYXNzIERP
TU5vZGU7CitAY2xhc3MgRE9NRWxlbWVudDsKKworQGludGVyZmFjZSBXZWJFbGVtZW50RGljdGlv
bmFyeSA6IE5TRGljdGlvbmFyeSB7CisgICAgRE9NTm9kZSAqX2lubmVyTm9kZTsKKyAgICBET01O
b2RlICpfaW5uZXJOb25TaGFyZWROb2RlOworICAgIERPTUVsZW1lbnQgKl9VUkxFbGVtZW50Owor
ICAgIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9jYWNoZTsKKyAgICBOU011dGFibGVTZXQgKl9uaWxW
YWx1ZXM7CisgICAgTlNQb2ludCBfcG9pbnQ7CisgICAgQk9PTCBfY2FjaGVDb21wbGV0ZTsKK30K
Ky0gKGlkKWluaXRXaXRoSW5uZXJOb25TaGFyZWROb2RlOihET01Ob2RlICopaW5uZXJOb25TaGFy
ZWROb2RlIGlubmVyTm9kZTooRE9NTm9kZSAqKWlubmVyTm9kZSBVUkxFbGVtZW50OihET01FbGVt
ZW50ICopVVJMRWxlbWVudCBhbmRQb2ludDooTlNQb2ludClwb2ludDsKK0BlbmQKSW5kZXg6IE1p
c2MvV2ViRWxlbWVudERpY3Rpb25hcnkubQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBNaXNjL1dlYkVsZW1lbnRE
aWN0aW9uYXJ5Lm0JKHJldmlzaW9uIDApCisrKyBNaXNjL1dlYkVsZW1lbnREaWN0aW9uYXJ5Lm0J
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1
IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAo
IkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9t
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
IAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgPFdl
YktpdC9XZWJFbGVtZW50RGljdGlvbmFyeS5oPgorI2ltcG9ydCA8V2ViS2l0L0RPTUNvcmUuaD4K
KyNpbXBvcnQgPFdlYktpdC9ET01Qcml2YXRlLmg+CisjaW1wb3J0IDxXZWJLaXQvV2ViRE9NT3Bl
cmF0aW9ucy5oPgorI2ltcG9ydCA8V2ViS2l0L1dlYkZyYW1lLmg+CisjaW1wb3J0IDxXZWJLaXQv
V2ViRnJhbWVCcmlkZ2UuaD4KKyNpbXBvcnQgPFdlYktpdC9XZWJWaWV3Lmg+CisjaW1wb3J0IDxX
ZWJLaXQvV2ViVmlld1ByaXZhdGUuaD4KKworZW51bSB7CisgICAgX1dlYkVsZW1lbnRTZWxmLAor
ICAgIF9XZWJFbGVtZW50SW5uZXJOb2RlLAorICAgIF9XZWJFbGVtZW50SW5uZXJOb25TaGFyZWRO
b2RlLAorICAgIF9XZWJFbGVtZW50VVJMRWxlbWVudAorfTsKKworc3RydWN0IF9XZWJFbGVtZW50
TWV0aG9kTWFwIHsKKyAgICB1bnNpZ25lZCBvYmplY3Q7CisgICAgU0VMIHNlbGVjdG9yOworfTsK
Kworc3RhdGljIE5TTWFwVGFibGUgKmxvb2t1cFRhYmxlID0gTlVMTDsKKworQGltcGxlbWVudGF0
aW9uIFdlYkVsZW1lbnREaWN0aW9uYXJ5CisrIChCT09MKWluaXRpYWxpemVMb29rdXBUYWJsZQor
eworICAgIGlmIChsb29rdXBUYWJsZSkKKyAgICAgICAgcmV0dXJuIFlFUzsKKworICAgIGxvb2t1
cFRhYmxlID0gTlNDcmVhdGVNYXBUYWJsZShOU05vblJldGFpbmVkT2JqZWN0TWFwS2V5Q2FsbEJh
Y2tzLCBOU093bmVkUG9pbnRlck1hcFZhbHVlQ2FsbEJhY2tzLCAxMik7CisKKyAgICBzdHJ1Y3Qg
X1dlYkVsZW1lbnRNZXRob2RNYXAgKm1hcEl0ZW0gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBfV2Vi
RWxlbWVudE1ldGhvZE1hcCkpOworICAgIGlmICghbWFwSXRlbSkKKyAgICAgICAgcmV0dXJuIE5P
OworICAgIG1hcEl0ZW0tPm9iamVjdCA9IF9XZWJFbGVtZW50U2VsZjsKKyAgICBtYXBJdGVtLT5z
ZWxlY3RvciA9IEBzZWxlY3RvcihfZG9tTm9kZSk7CisgICAgTlNNYXBJbnNlcnQobG9va3VwVGFi
bGUsIFdlYkVsZW1lbnRET01Ob2RlS2V5LCBtYXBJdGVtKTsKKworICAgIG1hcEl0ZW0gPSBtYWxs
b2Moc2l6ZW9mKHN0cnVjdCBfV2ViRWxlbWVudE1ldGhvZE1hcCkpOworICAgIGlmICghbWFwSXRl
bSkKKyAgICAgICAgcmV0dXJuIE5POworICAgIG1hcEl0ZW0tPm9iamVjdCA9IF9XZWJFbGVtZW50
U2VsZjsKKyAgICBtYXBJdGVtLT5zZWxlY3RvciA9IEBzZWxlY3Rvcihfd2ViRnJhbWUpOworICAg
IE5TTWFwSW5zZXJ0KGxvb2t1cFRhYmxlLCBXZWJFbGVtZW50RnJhbWVLZXksIG1hcEl0ZW0pOwor
CisgICAgbWFwSXRlbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IF9XZWJFbGVtZW50TWV0aG9kTWFw
KSk7CisgICAgaWYgKCFtYXBJdGVtKQorICAgICAgICByZXR1cm4gTk87CisgICAgbWFwSXRlbS0+
b2JqZWN0ID0gX1dlYkVsZW1lbnRJbm5lck5vblNoYXJlZE5vZGU7CisgICAgbWFwSXRlbS0+c2Vs
ZWN0b3IgPSBAc2VsZWN0b3IoYWx0RGlzcGxheVN0cmluZyk7CisgICAgTlNNYXBJbnNlcnQobG9v
a3VwVGFibGUsIFdlYkVsZW1lbnRJbWFnZUFsdFN0cmluZ0tleSwgbWFwSXRlbSk7CisKKyAgICBt
YXBJdGVtID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgX1dlYkVsZW1lbnRNZXRob2RNYXApKTsKKyAg
ICBpZiAoIW1hcEl0ZW0pCisgICAgICAgIHJldHVybiBOTzsKKyAgICBtYXBJdGVtLT5vYmplY3Qg
PSBfV2ViRWxlbWVudElubmVyTm9uU2hhcmVkTm9kZTsKKyAgICBtYXBJdGVtLT5zZWxlY3RvciA9
IEBzZWxlY3RvcihpbWFnZSk7CisgICAgTlNNYXBJbnNlcnQobG9va3VwVGFibGUsIFdlYkVsZW1l
bnRJbWFnZUtleSwgbWFwSXRlbSk7CisKKyAgICBtYXBJdGVtID0gbWFsbG9jKHNpemVvZihzdHJ1
Y3QgX1dlYkVsZW1lbnRNZXRob2RNYXApKTsKKyAgICBpZiAoIW1hcEl0ZW0pCisgICAgICAgIHJl
dHVybiBOTzsKKyAgICBtYXBJdGVtLT5vYmplY3QgPSBfV2ViRWxlbWVudFNlbGY7CisgICAgbWFw
SXRlbS0+c2VsZWN0b3IgPSBAc2VsZWN0b3IoX2ltYWdlUmVjdCk7CisgICAgTlNNYXBJbnNlcnQo
bG9va3VwVGFibGUsIFdlYkVsZW1lbnRJbWFnZVJlY3RLZXksIG1hcEl0ZW0pOworCisgICAgbWFw
SXRlbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IF9XZWJFbGVtZW50TWV0aG9kTWFwKSk7CisgICAg
aWYgKCFtYXBJdGVtKQorICAgICAgICByZXR1cm4gTk87CisgICAgbWFwSXRlbS0+b2JqZWN0ID0g
X1dlYkVsZW1lbnRJbm5lck5vblNoYXJlZE5vZGU7CisgICAgbWFwSXRlbS0+c2VsZWN0b3IgPSBA
c2VsZWN0b3IoYWJzb2x1dGVJbWFnZVVSTCk7CisgICAgTlNNYXBJbnNlcnQobG9va3VwVGFibGUs
IFdlYkVsZW1lbnRJbWFnZVVSTEtleSwgbWFwSXRlbSk7CisKKyAgICBtYXBJdGVtID0gbWFsbG9j
KHNpemVvZihzdHJ1Y3QgX1dlYkVsZW1lbnRNZXRob2RNYXApKTsKKyAgICBpZiAoIW1hcEl0ZW0p
CisgICAgICAgIHJldHVybiBOTzsKKyAgICBtYXBJdGVtLT5vYmplY3QgPSBfV2ViRWxlbWVudFNl
bGY7CisgICAgbWFwSXRlbS0+c2VsZWN0b3IgPSBAc2VsZWN0b3IoX2lzU2VsZWN0ZWQpOworICAg
IE5TTWFwSW5zZXJ0KGxvb2t1cFRhYmxlLCBXZWJFbGVtZW50SXNTZWxlY3RlZEtleSwgbWFwSXRl
bSk7CisKKyAgICBtYXBJdGVtID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgX1dlYkVsZW1lbnRNZXRo
b2RNYXApKTsKKyAgICBpZiAoIW1hcEl0ZW0pCisgICAgICAgIHJldHVybiBOTzsKKyAgICBtYXBJ
dGVtLT5vYmplY3QgPSBfV2ViRWxlbWVudElubmVyTm9uU2hhcmVkTm9kZTsKKyAgICBtYXBJdGVt
LT5zZWxlY3RvciA9IEBzZWxlY3Rvcih0aXRsZURpc3BsYXlTdHJpbmcpOworICAgIE5TTWFwSW5z
ZXJ0KGxvb2t1cFRhYmxlLCBXZWJFbGVtZW50VGl0bGVLZXksIG1hcEl0ZW0pOworCisgICAgbWFw
SXRlbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IF9XZWJFbGVtZW50TWV0aG9kTWFwKSk7CisgICAg
aWYgKCFtYXBJdGVtKQorICAgICAgICByZXR1cm4gTk87CisgICAgbWFwSXRlbS0+b2JqZWN0ID0g
X1dlYkVsZW1lbnRVUkxFbGVtZW50OworICAgIG1hcEl0ZW0tPnNlbGVjdG9yID0gQHNlbGVjdG9y
KGFic29sdXRlTGlua1VSTCk7CisgICAgTlNNYXBJbnNlcnQobG9va3VwVGFibGUsIFdlYkVsZW1l
bnRMaW5rVVJMS2V5LCBtYXBJdGVtKTsKKworICAgIG1hcEl0ZW0gPSBtYWxsb2Moc2l6ZW9mKHN0
cnVjdCBfV2ViRWxlbWVudE1ldGhvZE1hcCkpOworICAgIGlmICghbWFwSXRlbSkKKyAgICAgICAg
cmV0dXJuIE5POworICAgIG1hcEl0ZW0tPm9iamVjdCA9IF9XZWJFbGVtZW50U2VsZjsKKyAgICBt
YXBJdGVtLT5zZWxlY3RvciA9IEBzZWxlY3RvcihfdGFyZ2V0V2ViRnJhbWUpOworICAgIE5TTWFw
SW5zZXJ0KGxvb2t1cFRhYmxlLCBXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5LCBtYXBJdGVt
KTsKKworICAgIG1hcEl0ZW0gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBfV2ViRWxlbWVudE1ldGhv
ZE1hcCkpOworICAgIGlmICghbWFwSXRlbSkKKyAgICAgICAgcmV0dXJuIE5POworICAgIG1hcEl0
ZW0tPm9iamVjdCA9IF9XZWJFbGVtZW50VVJMRWxlbWVudDsKKyAgICBtYXBJdGVtLT5zZWxlY3Rv
ciA9IEBzZWxlY3Rvcih0aXRsZURpc3BsYXlTdHJpbmcpOworICAgIE5TTWFwSW5zZXJ0KGxvb2t1
cFRhYmxlLCBXZWJFbGVtZW50TGlua1RpdGxlS2V5LCBtYXBJdGVtKTsKKworICAgIG1hcEl0ZW0g
PSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBfV2ViRWxlbWVudE1ldGhvZE1hcCkpOworICAgIGlmICgh
bWFwSXRlbSkKKyAgICAgICAgcmV0dXJuIE5POworICAgIG1hcEl0ZW0tPm9iamVjdCA9IF9XZWJF
bGVtZW50VVJMRWxlbWVudDsKKyAgICBtYXBJdGVtLT5zZWxlY3RvciA9IEBzZWxlY3Rvcih0ZXh0
Q29udGVudCk7CisgICAgTlNNYXBJbnNlcnQobG9va3VwVGFibGUsIFdlYkVsZW1lbnRMaW5rTGFi
ZWxLZXksIG1hcEl0ZW0pOworCisgICAgcmV0dXJuIFlFUzsKK30KKworLSAoaWQpaW5pdFdpdGhJ
bm5lck5vblNoYXJlZE5vZGU6KERPTU5vZGUgKilpbm5lck5vblNoYXJlZE5vZGUgaW5uZXJOb2Rl
OihET01Ob2RlICopaW5uZXJOb2RlIFVSTEVsZW1lbnQ6KERPTUVsZW1lbnQgKilVUkxFbGVtZW50
IGFuZFBvaW50OihOU1BvaW50KXBvaW50Cit7CisgICAgaWYgKCFbW3NlbGYgY2xhc3NdIGluaXRp
YWxpemVMb29rdXBUYWJsZV0pCisgICAgICAgIHJldHVybiBuaWw7CisKKyAgICBbc3VwZXIgaW5p
dF07CisgICAgX3BvaW50ID0gcG9pbnQ7CisgICAgX2lubmVyTm9kZSA9IFtpbm5lck5vZGUgcmV0
YWluXTsKKyAgICBfaW5uZXJOb25TaGFyZWROb2RlID0gW2lubmVyTm9uU2hhcmVkTm9kZSByZXRh
aW5dOworICAgIF9VUkxFbGVtZW50ID0gW1VSTEVsZW1lbnQgcmV0YWluXTsKKyAgICByZXR1cm4g
c2VsZjsKK30KKworLSAodm9pZClkZWFsbG9jCit7CisgICAgW19pbm5lck5vZGUgcmVsZWFzZV07
CisgICAgW19pbm5lck5vblNoYXJlZE5vZGUgcmVsZWFzZV07CisgICAgW19VUkxFbGVtZW50IHJl
bGVhc2VdOworICAgIFtfY2FjaGUgcmVsZWFzZV07CisgICAgW19uaWxWYWx1ZXMgcmVsZWFzZV07
CisgICAgX2lubmVyTm9kZSA9IG5pbDsKKyAgICBfaW5uZXJOb25TaGFyZWROb2RlID0gbmlsOwor
ICAgIF9VUkxFbGVtZW50ID0gbmlsOworICAgIF9jYWNoZSA9IG5pbDsKKyAgICBfbmlsVmFsdWVz
ID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAodm9pZClfZmlsbENhY2hlCit7
CisgICAgaWYgKF9jYWNoZUNvbXBsZXRlKQorICAgICAgICByZXR1cm47CisgICAgTlNTdHJpbmcg
KmtleSA9IG5pbDsKKyAgICB2b2lkICp2YWx1ZSA9IE5VTEw7CisgICAgTlNNYXBFbnVtZXJhdG9y
IGVudW1lcmF0b3IgPSBOU0VudW1lcmF0ZU1hcFRhYmxlKGxvb2t1cFRhYmxlKTsKKyAgICB3aGls
ZSAoTlNOZXh0TWFwRW51bWVyYXRvclBhaXIoJmVudW1lcmF0b3IsICh2b2lkICoqKSZrZXksICh2
b2lkICoqKSZ2YWx1ZSkpCisgICAgICAgIFtzZWxmIG9iamVjdEZvcktleTprZXldOworICAgIE5T
RW5kTWFwVGFibGVFbnVtZXJhdGlvbigmZW51bWVyYXRvcik7CisgICAgX2NhY2hlQ29tcGxldGUg
PSBZRVM7Cit9CisKKy0gKHVuc2lnbmVkKWNvdW50Cit7CisgICAgaWYgKCFfY2FjaGVDb21wbGV0
ZSkKKyAgICAgICAgW3NlbGYgX2ZpbGxDYWNoZV07CisgICAgcmV0dXJuIFtfY2FjaGUgY291bnRd
OworfQorCistIChOU0VudW1lcmF0b3IgKilrZXlFbnVtZXJhdG9yCit7CisgICAgaWYgKCFfY2Fj
aGVDb21wbGV0ZSkKKyAgICAgICAgW3NlbGYgX2ZpbGxDYWNoZV07CisgICAgcmV0dXJuIFtfY2Fj
aGUga2V5RW51bWVyYXRvcl07Cit9CisKKy0gKGlkKW9iamVjdEZvcktleTooaWQpa2V5Cit7Cisg
ICAgaWQgdmFsdWUgPSBbX2NhY2hlIG9iamVjdEZvcktleTprZXldOworICAgIGlmICh2YWx1ZSB8
fCBfY2FjaGVDb21wbGV0ZSB8fCAoX25pbFZhbHVlcyAmJiBbX25pbFZhbHVlcyBjb250YWluc09i
amVjdDprZXldKSkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgc3RydWN0IF9XZWJFbGVt
ZW50TWV0aG9kTWFwICptYXBJdGVtID0gTlNNYXBHZXQobG9va3VwVGFibGUsIGtleSk7CisgICAg
aWYgKCFtYXBJdGVtKQorICAgICAgICByZXR1cm4gbmlsOworCisgICAgaWQgb2JqZWN0ID0gbmls
OworICAgIGlmIChtYXBJdGVtLT5vYmplY3QgPT0gX1dlYkVsZW1lbnRTZWxmKQorICAgICAgICBv
YmplY3QgPSBzZWxmOworICAgIGVsc2UgaWYobWFwSXRlbS0+b2JqZWN0ID09IF9XZWJFbGVtZW50
SW5uZXJOb25TaGFyZWROb2RlKQorICAgICAgICBvYmplY3QgPSBfaW5uZXJOb25TaGFyZWROb2Rl
OworICAgIGVsc2UgaWYobWFwSXRlbS0+b2JqZWN0ID09IF9XZWJFbGVtZW50VVJMRWxlbWVudCkK
KyAgICAgICAgb2JqZWN0ID0gX1VSTEVsZW1lbnQ7CisgICAgZWxzZSBpZihtYXBJdGVtLT5vYmpl
Y3QgPT0gX1dlYkVsZW1lbnRJbm5lck5vZGUpCisgICAgICAgIG9iamVjdCA9IF9pbm5lck5vZGU7
CisKKyAgICBpZiAobWFwSXRlbS0+b2JqZWN0ID09IF9XZWJFbGVtZW50U2VsZiB8fCAob2JqZWN0
ICYmIFtvYmplY3QgcmVzcG9uZHNUb1NlbGVjdG9yOm1hcEl0ZW0tPnNlbGVjdG9yXSkpCisgICAg
ICAgIHZhbHVlID0gW29iamVjdCBwZXJmb3JtU2VsZWN0b3I6bWFwSXRlbS0+c2VsZWN0b3JdOwor
CisgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGlmICghX2NhY2hlKQorICAgICAgICAgICAgX2Nh
Y2hlID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Ok5TQ291
bnRNYXBUYWJsZShsb29rdXBUYWJsZSldOworICAgICAgICBbX2NhY2hlIHNldE9iamVjdDp2YWx1
ZSBmb3JLZXk6a2V5XTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIV9uaWxWYWx1ZXMpCisg
ICAgICAgICAgICBfbmlsVmFsdWVzID0gW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2Fw
YWNpdHk6TlNDb3VudE1hcFRhYmxlKGxvb2t1cFRhYmxlKV07CisgICAgICAgIFtfbmlsVmFsdWVz
IGFkZE9iamVjdDprZXldOworICAgIH0KKworICAgIGlmICgoW19jYWNoZSBjb3VudF0gKyBbX25p
bFZhbHVlcyBjb3VudF0pID09IE5TQ291bnRNYXBUYWJsZShsb29rdXBUYWJsZSkpCisgICAgICAg
IF9jYWNoZUNvbXBsZXRlID0gWUVTOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCistIChET01O
b2RlICopX2RvbU5vZGUKK3sKKyAgICByZXR1cm4gX2lubmVyTm9uU2hhcmVkTm9kZTsKK30KKwor
LSAoV2ViRnJhbWUgKilfd2ViRnJhbWUKK3sKKyAgICByZXR1cm4gW1tfaW5uZXJOb25TaGFyZWRO
b2RlIG93bmVyRG9jdW1lbnRdIHdlYkZyYW1lXTsKK30KKworLSAoV2ViRnJhbWUgKilfdGFyZ2V0
V2ViRnJhbWUKK3sKKyAgICBpZiAoIV9VUkxFbGVtZW50KSByZXR1cm4gbmlsOworICAgIFdlYkZy
YW1lICp3ZWJGcmFtZSA9IFtbX2lubmVyTm9uU2hhcmVkTm9kZSBvd25lckRvY3VtZW50XSB3ZWJG
cmFtZV07CisgICAgTlNTdHJpbmcgKnRhcmdldE5hbWUgPSBbKERPTUhUTUxBbmNob3JFbGVtZW50
ICopX1VSTEVsZW1lbnQgdGFyZ2V0XTsKKyAgICBpZiAoW3RhcmdldE5hbWUgbGVuZ3RoXSkKKyAg
ICAgICAgcmV0dXJuIFt3ZWJGcmFtZSBmaW5kRnJhbWVOYW1lZDp0YXJnZXROYW1lXTsKKyAgICBy
ZXR1cm4gd2ViRnJhbWU7Cit9CisKKy0gKE5TVmFsdWUgKilfaW1hZ2VSZWN0Cit7CisgICAgcmV0
dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aFJlY3Q6W19pbm5lck5vblNoYXJlZE5vZGUgYm91bmRpbmdC
b3hdXTsKK30KKworLSAoTlNOdW1iZXIgKilfaXNTZWxlY3RlZAoreworICAgIHJldHVybiBbTlNO
dW1iZXIgbnVtYmVyV2l0aEJvb2w6W1tbW19pbm5lck5vblNoYXJlZE5vZGUgb3duZXJEb2N1bWVu
dF0gd2ViRnJhbWVdIF9icmlkZ2VdIGlzUG9pbnRJbnNpZGVTZWxlY3Rpb246X3BvaW50XV07Cit9
CitAZW5kCkluZGV4OiBNaXNjL1dlYk5TVmlld0V4dHJhcy5tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIE1pc2Mv
V2ViTlNWaWV3RXh0cmFzLm0JKHJldmlzaW9uIDEyOTQ2KQorKysgTWlzYy9XZWJOU1ZpZXdFeHRy
YXMubQkod29ya2luZyBjb3B5KQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgTlNJbWFnZSAqZHJh
Z0ltYWdlOwogICAgIE5TUG9pbnQgb3JpZ2luOwogCi0gICAgTlNJbWFnZSAqaW1hZ2UgPSAod2ly
ICE9IG5pbCkgPyBbd2lyIGltYWdlXSA6IFtlbGVtZW50IF9pbWFnZV07CisgICAgTlNJbWFnZSAq
aW1hZ2UgPSAod2lyICE9IG5pbCkgPyBbd2lyIGltYWdlXSA6IFtlbGVtZW50IGltYWdlXTsKICAg
ICBpZiAoaW1hZ2UgIT0gbmlsICYmIFtpbWFnZSBzaXplXS5oZWlnaHQgKiBbaW1hZ2Ugc2l6ZV0u
d2lkdGggPD0gV2ViTWF4T3JpZ2luYWxJbWFnZUFyZWEpIHsKICAgICAgICAgTlNTaXplIG9yaWdp
bmFsU2l6ZSA9IHJlY3Quc2l6ZTsKICAgICAgICAgb3JpZ2luID0gcmVjdC5vcmlnaW47CkluZGV4
OiBXZWJWaWV3L1dlYlZpZXdQcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViVmlldy9XZWJWaWV3
UHJpdmF0ZS5oCShyZXZpc2lvbiAxMjk0NikKKysrIFdlYlZpZXcvV2ViVmlld1ByaXZhdGUuaAko
d29ya2luZyBjb3B5KQpAQCAtNjUsNiArNjUsOCBAQCBleHRlcm4gTlNTdHJpbmcgKl9XZWJNYWlu
RnJhbWVJY29uS2V5OwogZXh0ZXJuIE5TU3RyaW5nICpfV2ViTWFpbkZyYW1lVGl0bGVLZXk7CiBl
eHRlcm4gTlNTdHJpbmcgKl9XZWJNYWluRnJhbWVVUkxLZXk7CiAKK2V4dGVybiBOU1N0cmluZyAq
V2ViRWxlbWVudFRpdGxlS2V5OyAgIC8vIE5TU3RyaW5nIG9mIHRoZSB0aXRsZSBvZiB0aGUgZWxl
bWVudCAocGVuZGluZyBwdWJsaWMsIHVzZWQgYnkgU2FmYXJpKQorCiB0eXBlZGVmIGVudW0gewog
ICAgIFdlYkRhc2hib2FyZEJlaGF2aW9yQWx3YXlzU2VuZE1vdXNlRXZlbnRzVG9BbGxXaW5kb3dz
LAogICAgIFdlYkRhc2hib2FyZEJlaGF2aW9yQWx3YXlzU2VuZEFjdGl2ZU51bGxFdmVudHNUb1Bs
dWdJbnMsCkluZGV4OiBXZWJWaWV3L1dlYlZpZXcubQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJWaWV3L1dl
YlZpZXcubQkocmV2aXNpb24gMTI5NDYpCisrKyBXZWJWaWV3L1dlYlZpZXcubQkod29ya2luZyBj
b3B5KQpAQCAtMzA5LDYgKzMwOSw3IEBAIE5TU3RyaW5nICpXZWJFbGVtZW50SW1hZ2VBbHRTdHJp
bmdLZXkgPSAKIE5TU3RyaW5nICpXZWJFbGVtZW50SW1hZ2VSZWN0S2V5ID0gICAgICAgICAgQCJX
ZWJFbGVtZW50SW1hZ2VSZWN0IjsKIE5TU3RyaW5nICpXZWJFbGVtZW50SW1hZ2VVUkxLZXkgPSAg
ICAgICAgICAgQCJXZWJFbGVtZW50SW1hZ2VVUkwiOwogTlNTdHJpbmcgKldlYkVsZW1lbnRJc1Nl
bGVjdGVkS2V5ID0gICAgICAgICBAIldlYkVsZW1lbnRJc1NlbGVjdGVkIjsKK05TU3RyaW5nICpX
ZWJFbGVtZW50VGl0bGVLZXkgPSAgICAgICAgICAgICAgQCJXZWJFbGVtZW50VGl0bGUiOwogTlNT
dHJpbmcgKldlYkVsZW1lbnRMaW5rVVJMS2V5ID0gICAgICAgICAgICBAIldlYkVsZW1lbnRMaW5r
VVJMIjsKIE5TU3RyaW5nICpXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5ID0gICAgQCJXZWJF
bGVtZW50VGFyZ2V0RnJhbWUiOwogTlNTdHJpbmcgKldlYkVsZW1lbnRMaW5rTGFiZWxLZXkgPSAg
ICAgICAgICBAIldlYkVsZW1lbnRMaW5rTGFiZWwiOwpJbmRleDogV2ViVmlldy9XZWJIVE1MVmll
dy5tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYlZpZXcvV2ViSFRNTFZpZXcubQkocmV2aXNpb24gMTI5NDYp
CisrKyBXZWJWaWV3L1dlYkhUTUxWaWV3Lm0JKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDcg
QEAKICNpbXBvcnQgPFdlYktpdC9XZWJEb2N1bWVudEludGVybmFsLmg+CiAjaW1wb3J0IDxXZWJL
aXQvV2ViRE9NT3BlcmF0aW9uc1ByaXZhdGUuaD4KICNpbXBvcnQgPFdlYktpdC9XZWJFZGl0aW5n
RGVsZWdhdGUuaD4KKyNpbXBvcnQgPFdlYktpdC9XZWJFbGVtZW50RGljdGlvbmFyeS5oPgogI2lt
cG9ydCA8V2ViS2l0L1dlYkZyYW1lUHJpdmF0ZS5oPgogI2ltcG9ydCA8V2ViS2l0L1dlYkZyYW1l
SW50ZXJuYWwuaD4KICNpbXBvcnQgPFdlYktpdC9XZWJGcmFtZVZpZXdJbnRlcm5hbC5oPgpAQCAt
MTE5Myw3ICsxMTk0LDcgQEAgc3RhdGljIFdlYkhUTUxWaWV3ICpsYXN0SGl0VmlldyA9IG5pbDsK
IAogICAgIC8vIG5vdGUgcGVyIGt3ZWJzdGVyLCB0aGUgb2Zmc2V0IGFyZyBiZWxvdyBpcyBhbHdh
eXMgaWdub3JlZCBpbiBwb3NpdGlvbmluZyB0aGUgaW1hZ2UKICAgICBET01IVE1MRWxlbWVudCAq
aW1hZ2VFbGVtZW50ID0gW2VsZW1lbnQgb2JqZWN0Rm9yS2V5OldlYkVsZW1lbnRET01Ob2RlS2V5
XTsKLSAgICBpZiAoaW1hZ2VVUkwgIT0gbmlsICYmIFtpbWFnZUVsZW1lbnQgX2ltYWdlXSAhPSBu
aWwgJiYgKF9wcml2YXRlLT5kcmFnU291cmNlQWN0aW9uTWFzayAmIFdlYkRyYWdTb3VyY2VBY3Rp
b25JbWFnZSkpIHsKKyAgICBpZiAoaW1hZ2VVUkwgIT0gbmlsICYmIFtpbWFnZUVsZW1lbnQgaW1h
Z2VdICE9IG5pbCAmJiAoX3ByaXZhdGUtPmRyYWdTb3VyY2VBY3Rpb25NYXNrICYgV2ViRHJhZ1Nv
dXJjZUFjdGlvbkltYWdlKSkgewogICAgICAgICBpZCBzb3VyY2UgPSBzZWxmOwogICAgICAgICBp
ZiAoIWRodG1sV3JvdGVEYXRhKSB7CiAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGltYWdlIHdo
ZW4gaXQgaXMgZHJhZ2dlZC4gVGhpcyBhbGxvd3MgdGhlIGltYWdlIHRvIGJlIG1vdmVkIHZpYSBN
b3ZlU2VsZWN0aW9uQ29tbWFuZEltcGwgYW5kIHRoaXMgbWF0Y2hlcyBOU1RleHRWaWV3J3MgYmVo
YXZpb3IuCkBAIC0yODY0LDM1ICsyODY1LDExIEBAIGRvbmU6CiAKIC0gKE5TRGljdGlvbmFyeSAq
KWVsZW1lbnRBdFBvaW50OihOU1BvaW50KXBvaW50CiB7Ci0gICAgTlNEaWN0aW9uYXJ5ICplbGVt
ZW50SW5mb1dDID0gW1tzZWxmIF9icmlkZ2VdIGVsZW1lbnRBdFBvaW50OnBvaW50XTsKLSAgICBO
U011dGFibGVEaWN0aW9uYXJ5ICplbGVtZW50SW5mbyA9IFtlbGVtZW50SW5mb1dDIG11dGFibGVD
b3B5XTsKLSAgICAKLSAgICAvLyBDb252ZXJ0IFVSTCBzdHJpbmdzIHRvIE5TVVJMcy4KLSAgICBb
ZWxlbWVudEluZm8gX3dlYl9zZXRPYmplY3RJZk5vdE5pbDpbTlNVUkwgX3dlYl9VUkxXaXRoRGF0
YUFzU3RyaW5nOltlbGVtZW50SW5mb1dDIG9iamVjdEZvcktleTpXZWJFbGVtZW50TGlua1VSTEtl
eV1dIGZvcktleTpXZWJFbGVtZW50TGlua1VSTEtleV07Ci0gICAgW2VsZW1lbnRJbmZvIF93ZWJf
c2V0T2JqZWN0SWZOb3ROaWw6W05TVVJMIF93ZWJfVVJMV2l0aERhdGFBc1N0cmluZzpbZWxlbWVu
dEluZm9XQyBvYmplY3RGb3JLZXk6V2ViRWxlbWVudEltYWdlVVJMS2V5XV0gZm9yS2V5OldlYkVs
ZW1lbnRJbWFnZVVSTEtleV07Ci0gICAgaWYgKFtlbGVtZW50SW5mb1dDIG9iamVjdEZvcktleTpX
ZWJFbGVtZW50SW1hZ2VVUkxLZXldKQotICAgICAgICBbZWxlbWVudEluZm8gX3dlYl9zZXRPYmpl
Y3RJZk5vdE5pbDpbW2VsZW1lbnRJbmZvV0Mgb2JqZWN0Rm9yS2V5OldlYkVsZW1lbnRET01Ob2Rl
S2V5XSBfaW1hZ2VdIGZvcktleTpXZWJFbGVtZW50SW1hZ2VLZXldOwotCi0gICAgV2ViRnJhbWVW
aWV3ICp3ZWJGcmFtZVZpZXcgPSBbc2VsZiBfd2ViX3BhcmVudFdlYkZyYW1lVmlld107Ci0gICAg
QVNTRVJUKHdlYkZyYW1lVmlldyk7Ci0gICAgV2ViRnJhbWUgKndlYkZyYW1lID0gW3dlYkZyYW1l
VmlldyB3ZWJGcmFtZV07Ci0gICAgCi0gICAgaWYgKHdlYkZyYW1lKSB7Ci0gICAgICAgIE5TU3Ry
aW5nICpmcmFtZU5hbWUgPSBbZWxlbWVudEluZm9XQyBvYmplY3RGb3JLZXk6V2ViRWxlbWVudExp
bmtUYXJnZXRGcmFtZUtleV07Ci0gICAgICAgIGlmIChbZnJhbWVOYW1lIGxlbmd0aF0gPT0gMCkg
ewotICAgICAgICAgICAgW2VsZW1lbnRJbmZvIHNldE9iamVjdDp3ZWJGcmFtZSBmb3JLZXk6V2Vi
RWxlbWVudExpbmtUYXJnZXRGcmFtZUtleV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBXZWJGcmFtZSAqd2YgPSBbd2ViRnJhbWUgZmluZEZyYW1lTmFtZWQ6ZnJhbWVOYW1lXTsKLSAg
ICAgICAgICAgIGlmICh3ZiAhPSBuaWwpCi0gICAgICAgICAgICAgICAgW2VsZW1lbnRJbmZvIHNl
dE9iamVjdDp3ZiBmb3JLZXk6V2ViRWxlbWVudExpbmtUYXJnZXRGcmFtZUtleV07Ci0gICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgW2VsZW1lbnRJbmZvIHJlbW92ZU9iamVjdEZvcktl
eTpXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5XTsKLSAgICAgICAgfQotICAgICAgICAKLSAg
ICAgICAgW2VsZW1lbnRJbmZvIHNldE9iamVjdDp3ZWJGcmFtZSBmb3JLZXk6V2ViRWxlbWVudEZy
YW1lS2V5XTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFtlbGVtZW50SW5mbyBhdXRvcmVsZWFz
ZV07CisgICAgRE9NTm9kZSAqaW5uZXJOb2RlID0gbmlsOworICAgIERPTU5vZGUgKmlubmVyTm9u
U2hhcmVkTm9kZSA9IG5pbDsKKyAgICBET01FbGVtZW50ICpVUkxFbGVtZW50ID0gbmlsOworICAg
IFtbc2VsZiBfYnJpZGdlXSBnZXRJbm5lck5vblNoYXJlZE5vZGU6JmlubmVyTm9uU2hhcmVkTm9k
ZSBpbm5lck5vZGU6JmlubmVyTm9kZSBVUkxFbGVtZW50OiZVUkxFbGVtZW50IGF0UG9pbnQ6cG9p
bnRdOworICAgIHJldHVybiBbW1tXZWJFbGVtZW50RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhJ
bm5lck5vblNoYXJlZE5vZGU6aW5uZXJOb25TaGFyZWROb2RlIGlubmVyTm9kZTppbm5lck5vZGUg
VVJMRWxlbWVudDpVUkxFbGVtZW50IGFuZFBvaW50OnBvaW50XSBhdXRvcmVsZWFzZV07CiB9CiAK
IC0gKHZvaWQpbW91c2VVcDooTlNFdmVudCAqKWV2ZW50Cg==
</data>
<flag name="review"
          id="1700"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6735</attachid>
            <date>2006-02-25 12:23:22 -0800</date>
            <delta_ts>2006-02-26 12:56:29 -0800</delta_ts>
            <desc>Implementation using a smart dictionary (round 3)</desc>
            <filename>elementAtPoint.patch</filename>
            <type>text/plain</type>
            <size>37680</size>
            <attacher name="Timothy Hatcher">timothy</attacher>
            
              <data encoding="base64">SW5kZXg6IGJpbmRpbmdzL29iamMvRE9NLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL29iamMv
RE9NLm1tCShyZXZpc2lvbiAxMjk4MykKKysrIGJpbmRpbmdzL29iamMvRE9NLm1tCSh3b3JraW5n
IGNvcHkpCkBAIC0xNDUxLDYgKzE0NTEsMTcgQEAgc3RhdGljIExpc3RlbmVyTWFwICpsaXN0ZW5l
ck1hcDsKIAogQGltcGxlbWVudGF0aW9uIERPTUVsZW1lbnQgKERPTUVsZW1lbnRFeHRlbnNpb25z
KQogCistIChOU0ltYWdlKilpbWFnZQoreworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBb
c2VsZiBfZWxlbWVudEltcGxdLT5yZW5kZXJlcigpOworICAgIGlmIChyZW5kZXJlciAmJiByZW5k
ZXJlci0+aXNJbWFnZSgpKSB7CisgICAgICAgIFJlbmRlckltYWdlKiBpbWcgPSBzdGF0aWNfY2Fz
dDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKTsKKyAgICAgICAgaWYgKGltZy0+Y2FjaGVkSW1hZ2Uo
KSAmJiAhaW1nLT5jYWNoZWRJbWFnZSgpLT5pc0Vycm9ySW1hZ2UoKSkKKyAgICAgICAgICAgIHJl
dHVybiBpbWctPmNhY2hlZEltYWdlKCktPmltYWdlKCktPmdldE5TSW1hZ2UoKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG5pbDsKK30KKwogLSAodm9pZClmb2N1cwogewogICAgIFtzZWxmIF9lbGVtZW50
SW1wbF0tPmZvY3VzKCk7CkBAIC0xNDk4LDE3ICsxNTA5LDYgQEAgc3RhdGljIExpc3RlbmVyTWFw
ICpsaXN0ZW5lck1hcDsKICAgICByZXR1cm4gbmlsOwogfQogCi0tIChOU0ltYWdlKilfaW1hZ2UK
LXsKLSAgICBSZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gW3NlbGYgX2VsZW1lbnRJbXBsXS0+cmVu
ZGVyZXIoKTsKLSAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzSW1hZ2UoKSkgewotICAg
ICAgICBSZW5kZXJJbWFnZSogaW1nID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJl
cik7Ci0gICAgICAgIGlmIChpbWctPmNhY2hlZEltYWdlKCkgJiYgIWltZy0+Y2FjaGVkSW1hZ2Uo
KS0+aXNFcnJvckltYWdlKCkpCi0gICAgICAgICAgICByZXR1cm4gaW1nLT5jYWNoZWRJbWFnZSgp
LT5pbWFnZSgpLT5nZXROU0ltYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBuaWw7Ci19Ci0KIC0g
KE5TRGF0YSopX2ltYWdlVElGRlJlcHJlc2VudGF0aW9uCiB7CiAgICAgUmVuZGVyT2JqZWN0ICpy
ZW5kZXJlciA9IFtzZWxmIF9lbGVtZW50SW1wbF0tPnJlbmRlcmVyKCk7CkluZGV4OiBiaW5kaW5n
cy9vYmpjL0RPTVByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9vYmpjL0RPTVByaXZh
dGUuaAkocmV2aXNpb24gMTI5ODMpCisrKyBiaW5kaW5ncy9vYmpjL0RPTVByaXZhdGUuaAkod29y
a2luZyBjb3B5KQpAQCAtMzksNyArMzksNiBAQAogCiBAaW50ZXJmYWNlIERPTUVsZW1lbnQgKFdl
YlByaXZhdGUpCiAtIChOU0ZvbnQgKilfZm9udDsKLS0gKE5TSW1hZ2UgKilfaW1hZ2U7CiAtIChO
U0RhdGEgKilfaW1hZ2VUSUZGUmVwcmVzZW50YXRpb247CiAtIChOU1VSTCAqKV9nZXRVUkxBdHRy
aWJ1dGU6KE5TU3RyaW5nICopbmFtZTsKIEBlbmQKQEAgLTc2LDggKzc1LDggQEAKIC0gKHZvaWQp
X2FjdGl2YXRlSXRlbUF0SW5kZXg6KGludClpbmRleDsKIEBlbmQKIAotLy8gQkVHSU4gUEVORElO
RyBQVUJMSUMgV0VCIElOU1BFQ1RPUiBBUElTCi0vLyBUaGVzZSBBUElzIGFyZSBmb3IgdGhlIFdl
YiBJbnNwZWN0b3IsIGFuZCB0aGV5IHdpbGwgYmUgbWFkZSBwdWJsaWMgZXZlbnR1YWxseS4KKy8v
IEJFR0lOIFBFTkRJTkcgUFVCTElDIEFQSVMKKy8vIFRoZXNlIEFQSXMgd2lsbCBiZSBtYWRlIHB1
YmxpYyBldmVudHVhbGx5LgogQGludGVyZmFjZSBET01BdHRyIChET01BdHRyRXh0ZW5zaW9ucykK
IC0gKERPTUNTU1N0eWxlRGVjbGFyYXRpb24gKilzdHlsZTsKIEBlbmQKQEAgLTEwNywxMSArMTA2
LDMxIEBACiBAZW5kCiAKIEBpbnRlcmZhY2UgRE9NRWxlbWVudCAoRE9NRWxlbWVudEV4dGVuc2lv
bnMpCistIChOU0ltYWdlICopaW1hZ2U7CiAtICh2b2lkKWZvY3VzOwogLSAodm9pZClibHVyOwog
LSAodm9pZClzY3JvbGxJbnRvVmlldzooQk9PTClhbGlnblRvcDsKIC0gKHZvaWQpc2Nyb2xsSW50
b1ZpZXdJZk5lZWRlZDooQk9PTCljZW50ZXJJZk5lZWRlZDsKIEBlbmQKKworQGludGVyZmFjZSBE
T01IVE1MRWxlbWVudCAoRE9NSFRNTEVsZW1lbnRQZW5kaW5nUHVibGljKQorLSAoTlNTdHJpbmcg
Kil0aXRsZURpc3BsYXlTdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTElucHV0RWxl
bWVudCAoRE9NSFRNTElucHV0RWxlbWVudFBlbmRpbmdQdWJsaWMpCistIChOU1N0cmluZyAqKWFs
dERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29sdXRlSW1hZ2VVUkw7CitAZW5kCisKK0Bp
bnRlcmZhY2UgRE9NSFRNTEltYWdlRWxlbWVudCAoRE9NSFRNTEltYWdlRWxlbWVudFBlbmRpbmdQ
dWJsaWMpCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29s
dXRlSW1hZ2VVUkw7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTE9iamVjdEVsZW1lbnQgKERP
TUhUTUxPYmplY3RFbGVtZW50UGVuZGluZ1B1YmxpYykKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFn
ZVVSTDsKK0BlbmQKKwogLy8gRU5ECiAKIC8vIFBlbmRpbmcgRE9NMyBBUElzCkluZGV4OiBiaW5k
aW5ncy9vYmpjL0RPTUhUTUwubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYmluZGluZ3Mvb2JqYy9ET01IVE1M
Lm1tCShyZXZpc2lvbiAxMjk4MykKKysrIGJpbmRpbmdzL29iamMvRE9NSFRNTC5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtNTgsNiArNTgsNyBAQAogCiAjaW1wb3J0ICJET01FeHRlbnNpb25zLmgiCiAj
aW1wb3J0ICJET01JbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NUHJpdmF0ZS5oIgogI2ltcG9ydCAi
RE9NSFRNTEludGVybmFsLmgiCiAjaW1wb3J0IDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CiAjaW1w
b3J0ICJGb3VuZGF0aW9uRXh0cmFzLmgiCkBAIC0yNTksNiArMjYwLDEzIEBAIHVzaW5nIG5hbWVz
cGFjZSBET006OkhUTUxOYW1lczsKICAgICByZXR1cm4gW3NlbGYgX0hUTUxFbGVtZW50SW1wbF0t
PnRpdGxlKCk7CiB9CiAKKy0gKE5TU3RyaW5nICopdGl0bGVEaXNwbGF5U3RyaW5nCit7CisgICAg
UVN0cmluZyB0aXRsZVRleHQgPSBbc2VsZiBfSFRNTEVsZW1lbnRJbXBsXS0+dGl0bGUoKS5xc3Ry
aW5nKCk7CisgICAgdGl0bGVUZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIFtzZWxmIF9lbGVtZW50
SW1wbF0tPmdldERvY3VtZW50KCktPmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7CisgICAg
cmV0dXJuIHRpdGxlVGV4dC5nZXROU1N0cmluZygpOworfQorCiAtICh2b2lkKXNldFRpdGxlOihO
U1N0cmluZyAqKXRpdGxlCiB7CiAgICAgW3NlbGYgX0hUTUxFbGVtZW50SW1wbF0tPnNldFRpdGxl
KHRpdGxlKTsKQEAgLTEyODAsNiArMTI4OCwxMyBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1M
TmFtZXM7CiAgICAgcmV0dXJuIFtzZWxmIF9pbnB1dEVsZW1lbnRJbXBsXS0+YWx0KCk7CiB9CiAK
Ky0gKE5TU3RyaW5nICopYWx0RGlzcGxheVN0cmluZworeworICAgIFFTdHJpbmcgYWx0VGV4dCA9
IFtzZWxmIF9pbnB1dEVsZW1lbnRJbXBsXS0+YWx0KCkucXN0cmluZygpOworICAgIGFsdFRleHQu
cmVwbGFjZShRQ2hhcignXFwnKSwgW3NlbGYgX2VsZW1lbnRJbXBsXS0+Z2V0RG9jdW1lbnQoKS0+
YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKKyAgICByZXR1cm4gYWx0VGV4dC5nZXROU1N0
cmluZygpOworfQorCiAtICh2b2lkKXNldEFsdDooTlNTdHJpbmcgKilhbHQKIHsKICAgICBbc2Vs
ZiBfaW5wdXRFbGVtZW50SW1wbF0tPnNldEFsdChhbHQpOwpAQCAtMTM0NSw2ICsxMzYwLDEzIEBA
IHVzaW5nIG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKICAgICBbc2VsZiBfaW5wdXRFbGVtZW50
SW1wbF0tPnNldFNpemUoc2l6ZSk7CiB9CiAKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFnZVVSTAor
eworICAgIGlmICghW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5yZW5kZXJlcigpIHx8ICFbc2Vs
ZiBfaW5wdXRFbGVtZW50SW1wbF0tPnJlbmRlcmVyKCktPmlzSW1hZ2UoKSkKKyAgICAgICAgcmV0
dXJuIG5pbDsKKyAgICByZXR1cm4gW3NlbGYgX2dldFVSTEF0dHJpYnV0ZTpAInNyYyJdOworfQor
CiAtIChOU1N0cmluZyAqKXNyYwogewogICAgIHJldHVybiBbc2VsZiBfaW5wdXRFbGVtZW50SW1w
bF0tPnNyYygpOwpAQCAtMjE2NSw2ICsyMTg3LDExIEBAIHVzaW5nIG5hbWVzcGFjZSBET006OkhU
TUxOYW1lczsKICAgICBbc2VsZiBfYW5jaG9yRWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUoY29v
cmRzQXR0ciwgY29vcmRzKTsKIH0KIAorLSAoTlNVUkwgKilhYnNvbHV0ZUxpbmtVUkwKK3sKKyAg
ICByZXR1cm4gW3NlbGYgX2dldFVSTEF0dHJpYnV0ZTpAImhyZWYiXTsKK30KKwogLSAoTlNTdHJp
bmcgKilocmVmCiB7CiAgICAgcmV0dXJuIFtzZWxmIF9hbmNob3JFbGVtZW50SW1wbF0tPmhyZWYo
KTsKQEAgLTIzMDIsNiArMjMyOSwxMyBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7
CiAgICAgcmV0dXJuIFtzZWxmIF9pbWFnZUVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0
dHIpOwogfQogCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmcKK3sKKyAgICBRU3RyaW5n
IGFsdFRleHQgPSBbc2VsZiBfaW1hZ2VFbGVtZW50SW1wbF0tPmdldEF0dHJpYnV0ZShhbHRBdHRy
KS5xc3RyaW5nKCk7CisgICAgYWx0VGV4dC5yZXBsYWNlKFFDaGFyKCdcXCcpLCBbc2VsZiBfZWxl
bWVudEltcGxdLT5nZXREb2N1bWVudCgpLT5iYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOwor
ICAgIHJldHVybiBhbHRUZXh0LmdldE5TU3RyaW5nKCk7Cit9CisKIC0gKHZvaWQpc2V0QWx0OihO
U1N0cmluZyAqKWFsdAogewogICAgIFtzZWxmIF9pbWFnZUVsZW1lbnRJbXBsXS0+c2V0QXR0cmli
dXRlKGFsdEF0dHIsIGFsdCk7CkBAIC0yMzU5LDYgKzIzOTMsMTEgQEAgdXNpbmcgbmFtZXNwYWNl
IERPTTo6SFRNTE5hbWVzOwogICAgIFtzZWxmIF9pbWFnZUVsZW1lbnRJbXBsXS0+c2V0QXR0cmli
dXRlKGxvbmdkZXNjQXR0ciwgbG9uZ0Rlc2MpOwogfQogCistIChOU1VSTCAqKWFic29sdXRlSW1h
Z2VVUkwKK3sKKyAgICByZXR1cm4gW3NlbGYgX2dldFVSTEF0dHJpYnV0ZTpAInNyYyJdOworfQor
CiAtIChOU1N0cmluZyAqKXNyYwogewogICAgIHJldHVybiBbc2VsZiBfaW1hZ2VFbGVtZW50SW1w
bF0tPnNyYygpOwpAQCAtMjQ3NSw2ICsyNTE0LDEzIEBAIHVzaW5nIG5hbWVzcGFjZSBET006OkhU
TUxOYW1lczsKICAgICBbc2VsZiBfb2JqZWN0RWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUoY29k
ZXR5cGVBdHRyLCBjb2RlVHlwZSk7CiB9CiAKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFnZVVSTAor
eworICAgIGlmICghW3NlbGYgX29iamVjdEVsZW1lbnRJbXBsXS0+cmVuZGVyZXIoKSB8fCAhW3Nl
bGYgX29iamVjdEVsZW1lbnRJbXBsXS0+cmVuZGVyZXIoKS0+aXNJbWFnZSgpKQorICAgICAgICBy
ZXR1cm4gbmlsOworICAgIHJldHVybiBbc2VsZiBfZ2V0VVJMQXR0cmlidXRlOkAiZGF0YSJdOwor
fQorCiAtIChOU1N0cmluZyAqKWRhdGEKIHsKICAgICByZXR1cm4gW3NlbGYgX29iamVjdEVsZW1l
bnRJbXBsXS0+Z2V0QXR0cmlidXRlKGRhdGFBdHRyKTsKQEAgLTI2NjYsNiArMjcxMiwxMyBAQCB1
c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAgICAgcmV0dXJuIFtzZWxmIF9hcHBsZXRF
bGVtZW50SW1wbF0tPmdldEF0dHJpYnV0ZShhbHRBdHRyKTsKIH0KIAorLSAoTlNTdHJpbmcgKilh
bHREaXNwbGF5U3RyaW5nCit7CisgICAgUVN0cmluZyBhbHRUZXh0ID0gW3NlbGYgX2FwcGxldEVs
ZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0dHIpLnFzdHJpbmcoKTsKKyAgICBhbHRUZXh0
LnJlcGxhY2UoUUNoYXIoJ1xcJyksIFtzZWxmIF9lbGVtZW50SW1wbF0tPmdldERvY3VtZW50KCkt
PmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7CisgICAgcmV0dXJuIGFsdFRleHQuZ2V0TlNT
dHJpbmcoKTsKK30KKwogLSAodm9pZClzZXRBbHQ6KE5TU3RyaW5nICopYWx0CiB7CiAgICAgW3Nl
bGYgX2FwcGxldEVsZW1lbnRJbXBsXS0+c2V0QXR0cmlidXRlKGFsdEF0dHIsIGFsdCk7CkBAIC0y
ODEyLDYgKzI4NjUsMTMgQEAgdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAgIHJl
dHVybiBbc2VsZiBfYXJlYUVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0dHIpOwogfQog
CistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmcKK3sKKyAgICBRU3RyaW5nIGFsdFRleHQg
PSBbc2VsZiBfYXJlYUVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0dHIpLnFzdHJpbmco
KTsKKyAgICBhbHRUZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIFtzZWxmIF9lbGVtZW50SW1wbF0t
PmdldERvY3VtZW50KCktPmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7CisgICAgcmV0dXJu
IGFsdFRleHQuZ2V0TlNTdHJpbmcoKTsKK30KKwogLSAodm9pZClzZXRBbHQ6KE5TU3RyaW5nICop
YWx0CiB7CiAgICAgW3NlbGYgX2FyZWFFbGVtZW50SW1wbF0tPnNldEF0dHJpYnV0ZShhbHRBdHRy
LCBhbHQpOwpJbmRleDogZG9tL0RvY3VtZW50SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9Eb2N1
bWVudEltcGwuaAkocmV2aXNpb24gMTI5ODMpCisrKyBkb20vRG9jdW1lbnRJbXBsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTY3Niw2ICs2NzYsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXREZWNvZGVy
KERlY29kZXIqKTsKICAgICBEZWNvZGVyKiBkZWNvZGVyKCkgY29uc3QgeyByZXR1cm4gbV9kZWNv
ZGVyLmdldCgpOyB9CiAKKyAgICBRQ2hhciBEb2N1bWVudEltcGw6OmJhY2tzbGFzaEFzQ3VycmVu
Y3lTeW1ib2woKSBjb25zdDsKKwogI2lmIF9fQVBQTEVfXwogICAgIHZvaWQgc2V0RGFzaGJvYXJk
UmVnaW9uc0RpcnR5KGJvb2wgZikgeyBtX2Rhc2hib2FyZFJlZ2lvbnNEaXJ0eSA9IGY7IH0KICAg
ICBib29sIGRhc2hib2FyZFJlZ2lvbnNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZGFzaGJvYXJk
UmVnaW9uc0RpcnR5OyB9CkluZGV4OiBkb20vRG9jdW1lbnRJbXBsLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBkb20vRG9jdW1lbnRJbXBsLmNwcAkocmV2aXNpb24gMTI5ODMpCisrKyBkb20vRG9jdW1lbnRJ
bXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsNyBAQAogI2luY2x1ZGUgInZpc2li
bGVfdGV4dC5oIgogI2luY2x1ZGUgInhtbF90b2tlbml6ZXIuaCIKICNpbmNsdWRlIDxxcmVnZXhw
Lmg+CisjaW5jbHVkZSA8cXRleHRjb2RlYy5oPgogCiAvLyBGSVhNRTogV2Ugd2FudCB0byBjdXQg
dGhlIHJlbWFpbmluZyBIVE1MIGRlcGVuZGVuY2llcyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8g
aW5jbHVkZSB0aGVzZSBmaWxlcy4KICNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50SW1wbC5oIgpA
QCAtMjQ5NSw2ICsyNDk2LDE3IEBAIHZvaWQgRG9jdW1lbnRJbXBsOjpzZXREZWNvZGVyKERlY29k
ZXIgKmQKICAgICBtX2RlY29kZXIgPSBkZWNvZGVyOwogfQogCitRQ2hhciBEb2N1bWVudEltcGw6
OmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSBjb25zdAoreworICAgIGlmICghbV9kZWNvZGVy
KQorICAgICAgICByZXR1cm4gJ1xcJzsKKyAgICBjb25zdCBRVGV4dENvZGVjICpjb2RlYyA9IG1f
ZGVjb2Rlci0+Y29kZWMoKTsKKyAgICBpZiAoIWNvZGVjKQorICAgICAgICByZXR1cm4gJ1xcJzsK
KworICAgIHJldHVybiBjb2RlYy0+YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpOworfQorCiBR
U3RyaW5nIERvY3VtZW50SW1wbDo6Y29tcGxldGVVUkwoY29uc3QgUVN0cmluZyAmVVJMKQogewog
ICAgIHJldHVybiBLVVJMKGJhc2VVUkwoKSwgVVJMLCBtX2RlY29kZXIgPyBtX2RlY29kZXItPmNv
ZGVjKCkgOiAwKS51cmwoKTsKSW5kZXg6IFdlYkNvcmUuZXhwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUuZXhwCShyZXZpc2lvbiAxMjk4MykKKysrIFdlYkNvcmUuZXhwCSh3b3JraW5nIGNvcHkpCkBA
IC0xMjAsMTcgKzEyMCw2IEBACiAub2JqY19jbGFzc19uYW1lX1dlYkNvcmVUZXh0UmVuZGVyZXJG
YWN0b3J5CiAub2JqY19jbGFzc19uYW1lX1dlYkNvcmVWaWV3RmFjdG9yeQogLm9iamNfY2xhc3Nf
bmFtZV9XZWJEYXNoYm9hcmRSZWdpb24KLV9XZWJDb3JlRWxlbWVudERPTU5vZGVLZXkKLV9XZWJD
b3JlRWxlbWVudEZyYW1lS2V5Ci1fV2ViQ29yZUVsZW1lbnRJbWFnZUFsdFN0cmluZ0tleQotX1dl
YkNvcmVFbGVtZW50SW1hZ2VSZWN0S2V5Ci1fV2ViQ29yZUVsZW1lbnRJbWFnZVVSTEtleQotX1dl
YkNvcmVFbGVtZW50SXNTZWxlY3RlZEtleQotX1dlYkNvcmVFbGVtZW50TGlua0xhYmVsS2V5Ci1f
V2ViQ29yZUVsZW1lbnRMaW5rVGFyZ2V0RnJhbWVLZXkKLV9XZWJDb3JlRWxlbWVudExpbmtUaXRs
ZUtleQotX1dlYkNvcmVFbGVtZW50TGlua1VSTEtleQotX1dlYkNvcmVFbGVtZW50VGl0bGVLZXkK
IF9XZWJDb3JlSW5pdGlhbGl6ZUVtcHR5VGV4dEdlb21ldHJ5CiBfV2ViQ29yZUluaXRpYWxpemVF
bXB0eVRleHRTdHlsZQogX1dlYkNvcmVJbml0aWFsaXplRm9udApJbmRleDogYnJpZGdlL21hYy9X
ZWJDb3JlRnJhbWVCcmlkZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBicmlkZ2UvbWFjL1dlYkNvcmVGcmFt
ZUJyaWRnZS5oCShyZXZpc2lvbiAxMjk4MykKKysrIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJp
ZGdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTY5LDE4ICs2OSw2IEBAIHR5cGVkZWYgV2ViQ29yZTo6
UmVuZGVyUGFydCBXZWJDb3JlUmVuZGUKIEBwcm90b2NvbCBXZWJDb3JlRmlsZUJ1dHRvbjsKIEBw
cm90b2NvbCBXZWJDb3JlRmlsZUJ1dHRvbkRlbGVnYXRlOwogCi1leHRlcm4gTlNTdHJpbmcgKldl
YkNvcmVFbGVtZW50RE9NTm9kZUtleTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRG
cmFtZUtleTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRJbWFnZUFsdFN0cmluZ0tl
eTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRJbWFnZVJlY3RLZXk7Ci1leHRlcm4g
TlNTdHJpbmcgKldlYkNvcmVFbGVtZW50SW1hZ2VVUkxLZXk7Ci1leHRlcm4gTlNTdHJpbmcgKldl
YkNvcmVFbGVtZW50SXNTZWxlY3RlZEtleTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1l
bnRMaW5rVVJMS2V5OwotZXh0ZXJuIE5TU3RyaW5nICpXZWJDb3JlRWxlbWVudExpbmtUYXJnZXRG
cmFtZUtleTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRMaW5rTGFiZWxLZXk7Ci1l
eHRlcm4gTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50TGlua1RpdGxlS2V5OwotZXh0ZXJuIE5TU3Ry
aW5nICpXZWJDb3JlRWxlbWVudFRpdGxlS2V5OwotCiBleHRlcm4gTlNTdHJpbmcgKldlYkNvcmVQ
YWdlQ2FjaGVTdGF0ZUtleTsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTMwMiw3ICsyOTAsOSBAQCB0
eXBlZGVmIGVudW0gewogLSAoTlNPYmplY3QgKiljb3B5UmVuZGVyVHJlZTooaWQgPFdlYkNvcmVS
ZW5kZXJUcmVlQ29waWVyPiljb3BpZXI7CiAtIChOU1N0cmluZyAqKXJlbmRlclRyZWVBc0V4dGVy
bmFsUmVwcmVzZW50YXRpb247CiAKLS0gKE5TRGljdGlvbmFyeSAqKWVsZW1lbnRBdFBvaW50OihO
U1BvaW50KXBvaW50OworLSAodm9pZClnZXRJbm5lck5vblNoYXJlZE5vZGU6KERPTU5vZGUgKiop
aW5uZXJOb25TaGFyZWROb2RlIGlubmVyTm9kZTooRE9NTm9kZSAqKilpbm5lck5vZGUgVVJMRWxl
bWVudDooRE9NRWxlbWVudCAqKilVUkxFbGVtZW50IGF0UG9pbnQ6KE5TUG9pbnQpcG9pbnQ7Cist
IChCT09MKWlzUG9pbnRJbnNpZGVTZWxlY3Rpb246KE5TUG9pbnQpcG9pbnQ7CisKIC0gKE5TVVJM
ICopVVJMV2l0aEF0dHJpYnV0ZVN0cmluZzooTlNTdHJpbmcgKilzdHJpbmc7CiAKIC0gKERPTUVs
ZW1lbnQgKillbGVtZW50V2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBpbkZvcm06KERPTUVsZW1l
bnQgKilmb3JtOwpJbmRleDogYnJpZGdlL21hYy9XZWJDb3JlRnJhbWVCcmlkZ2UubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gYnJpZGdlL21hYy9XZWJDb3JlRnJhbWVCcmlkZ2UubW0JKHJldmlzaW9uIDEyOTgz
KQorKysgYnJpZGdlL21hYy9XZWJDb3JlRnJhbWVCcmlkZ2UubW0JKHdvcmtpbmcgY29weSkKQEAg
LTEyMiwxOSArMTIyLDYgQEAgdXNpbmcgS0pTOjpCaW5kaW5nczo6Um9vdE9iamVjdDsKIAogdXNp
bmcgV2ViQ29yZTo6UmVuZGVyT2JqZWN0OwogCi1OU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRET01O
b2RlS2V5ID0gICAgICAgICAgICBAIldlYkVsZW1lbnRET01Ob2RlIjsKLU5TU3RyaW5nICpXZWJD
b3JlRWxlbWVudEZyYW1lS2V5ID0gICAgICAgICAgICAgIEAiV2ViRWxlbWVudEZyYW1lIjsKLU5T
U3RyaW5nICpXZWJDb3JlRWxlbWVudEltYWdlQWx0U3RyaW5nS2V5ID0gICAgIEAiV2ViRWxlbWVu
dEltYWdlQWx0U3RyaW5nIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudEltYWdlUmVjdEtleSA9
ICAgICAgICAgIEAiV2ViRWxlbWVudEltYWdlUmVjdCI7Ci1OU1N0cmluZyAqV2ViQ29yZUVsZW1l
bnRJbWFnZVVSTEtleSA9ICAgICAgICAgICBAIldlYkVsZW1lbnRJbWFnZVVSTCI7Ci1OU1N0cmlu
ZyAqV2ViQ29yZUVsZW1lbnRJc1NlbGVjdGVkS2V5ID0gICAgICAgICBAIldlYkVsZW1lbnRJc1Nl
bGVjdGVkIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudExpbmtVUkxLZXkgPSAgICAgICAgICAg
IEAiV2ViRWxlbWVudExpbmtVUkwiOwotTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50TGlua1Rhcmdl
dEZyYW1lS2V5ID0gICAgQCJXZWJFbGVtZW50VGFyZ2V0RnJhbWUiOwotTlNTdHJpbmcgKldlYkNv
cmVFbGVtZW50TGlua0xhYmVsS2V5ID0gICAgICAgICAgQCJXZWJFbGVtZW50TGlua0xhYmVsIjsK
LU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudExpbmtUaXRsZUtleSA9ICAgICAgICAgIEAiV2ViRWxl
bWVudExpbmtUaXRsZSI7Ci1OU1N0cmluZyAqV2ViQ29yZUVsZW1lbnROYW1lS2V5ID0gICAgICAg
ICAgICAgICBAIldlYkVsZW1lbnROYW1lIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudFRpdGxl
S2V5ID0gICAgICAgICAgICAgIEAiV2ViQ29yZUVsZW1lbnRUaXRsZSI7IC8vIG5vdCBpbiBXZWJL
aXQgQVBJIGZvciBub3csIGNvdWxkIGJlIGluIEFQSSBzb21lIGRheQotCiBOU1N0cmluZyAqV2Vi
Q29yZVBhZ2VDYWNoZVN0YXRlS2V5ID0gICAgICAgICAgICBAIldlYkNvcmVQYWdlQ2FjaGVTdGF0
ZSI7CiAKIEBpbnRlcmZhY2UgV2ViQ29yZUZyYW1lQnJpZGdlIChXZWJDb3JlQnJpZGdlSW50ZXJu
YWwpCkBAIC0xMjgwLDEwNyArMTI2NywyMSBAQCBzdGF0aWMgSFRNTEZvcm1FbGVtZW50SW1wbCAq
Zm9ybUVsZW1lbnRGCiAgICAgcmV0dXJuIG1fZnJhbWUtPm1hdGNoTGFiZWxzQWdhaW5zdEVsZW1l
bnQobGFiZWxzLCBbZWxlbWVudCBfZWxlbWVudEltcGxdKTsKIH0KIAotLSAoTlNEaWN0aW9uYXJ5
ICopZWxlbWVudEF0UG9pbnQ6KE5TUG9pbnQpcG9pbnQKKy0gKHZvaWQpZ2V0SW5uZXJOb25TaGFy
ZWROb2RlOihET01Ob2RlICoqKWlubmVyTm9uU2hhcmVkTm9kZSBpbm5lck5vZGU6KERPTU5vZGUg
KiopaW5uZXJOb2RlIFVSTEVsZW1lbnQ6KERPTUVsZW1lbnQgKiopVVJMRWxlbWVudCBhdFBvaW50
OihOU1BvaW50KXBvaW50CiB7CiAgICAgUmVuZGVyT2JqZWN0ICpyZW5kZXJlciA9IG1fZnJhbWUt
PnJlbmRlcmVyKCk7CiAgICAgaWYgKCFyZW5kZXJlcikgCi0gICAgICAgIHJldHVybiBuaWw7Ci0g
ICAgCi0gICAgUmVuZGVyT2JqZWN0OjpOb2RlSW5mbyBub2RlSW5mbyA9IFtzZWxmIG5vZGVJbmZv
QXRQb2ludDpwb2ludF07Ci0gICAgCi0gICAgTlNNdXRhYmxlRGljdGlvbmFyeSAqZWxlbWVudCA9
IFtOU011dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICAgIFtlbGVtZW50IHNldE9iamVj
dDpbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6bV9mcmFtZS0+aXNQb2ludEluc2lkZVNlbGVjdGlv
bigoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSldCi0gICAgICAgICAgICAgICAgZm9yS2V5Oldl
YkNvcmVFbGVtZW50SXNTZWxlY3RlZEtleV07Ci0KLSAgICAvLyBGaW5kIHRoZSB0aXRsZSBpbiB0
aGUgbmVhcmVzdCBlbmNsb3NpbmcgRE9NIG5vZGUuCi0gICAgLy8gRm9yIDxhcmVhPiB0YWdzIGlu
IGltYWdlIG1hcHMsIHdhbGsgdGhlIHRyZWUgZm9yIHRoZSA8YXJlYT4sIG5vdCB0aGUgPGltZz4g
dXNpbmcgaXQuCi0gICAgZm9yIChOb2RlSW1wbCAqdGl0bGVOb2RlID0gbm9kZUluZm8uaW5uZXJO
b2RlKCk7IHRpdGxlTm9kZTsgdGl0bGVOb2RlID0gdGl0bGVOb2RlLT5wYXJlbnROb2RlKCkpIHsK
LSAgICAgICAgaWYgKHRpdGxlTm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7Ci0gICAgICAgICAgICBj
b25zdCBBdG9taWNTdHJpbmcmIHRpdGxlID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4odGl0
bGVOb2RlKS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgICAgICAgICBpZiAoIXRpdGxl
LmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBub2RlIHdpdGggYSB0
aXRsZS4KLSAgICAgICAgICAgICAgICBRU3RyaW5nIHRpdGxlVGV4dCA9IHRpdGxlLnFzdHJpbmco
KTsKLSAgICAgICAgICAgICAgICB0aXRsZVRleHQucmVwbGFjZShRQ2hhcignXFwnKSwgbV9mcmFt
ZS0+YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKLSAgICAgICAgICAgICAgICBbZWxlbWVu
dCBzZXRPYmplY3Q6dGl0bGVUZXh0LmdldE5TU3RyaW5nKCkgZm9yS2V5OldlYkNvcmVFbGVtZW50
VGl0bGVLZXldOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgTm9kZUltcGwgKlVSTE5vZGUgPSBub2RlSW5mby5VUkxFbGVtZW50
KCk7Ci0gICAgaWYgKFVSTE5vZGUpIHsKLSAgICAgICAgRWxlbWVudEltcGwgKmUgPSBzdGF0aWNf
Y2FzdDxFbGVtZW50SW1wbCAqPihVUkxOb2RlKTsKLSAgICAgICAgRG9jdW1lbnRJbXBsICpkb2Mg
PSBlLT5nZXREb2N1bWVudCgpOwotICAgICAgICBBU1NFUlQoZG9jKTsKLSAgICAgICAgCi0gICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRy
KTsKLSAgICAgICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFFTdHJpbmcg
dGl0bGVUZXh0ID0gdGl0bGUucXN0cmluZygpOwotICAgICAgICAgICAgdGl0bGVUZXh0LnJlcGxh
Y2UoUUNoYXIoJ1xcJyksIG1fZnJhbWUtPmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0g
ICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6dGl0bGVUZXh0LmdldE5TU3RyaW5nKCkgZm9y
S2V5OldlYkNvcmVFbGVtZW50TGlua1RpdGxlS2V5XTsKLSAgICAgICAgfQotICAgICAgICAKLSAg
ICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsaW5rID0gZS0+Z2V0QXR0cmlidXRlKGhyZWZBdHRy
KTsKLSAgICAgICAgaWYgKCFsaW5rLmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBRU3RyaW5nIHQg
PSBwbGFpblRleHQocmFuZ2VPZkNvbnRlbnRzKGUpLmdldCgpKTsKLSAgICAgICAgICAgIGlmICgh
dC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6dC5nZXRO
U1N0cmluZygpIGZvcktleTpXZWJDb3JlRWxlbWVudExpbmtMYWJlbEtleV07Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBRU3RyaW5nIFVSTFN0cmluZyA9IHBhcnNlVVJMKGxpbmspLnFzdHJp
bmcoKTsKLSAgICAgICAgICAgIFtlbGVtZW50IHNldE9iamVjdDpkb2MtPmNvbXBsZXRlVVJMKFVS
TFN0cmluZykuZ2V0TlNTdHJpbmcoKSBmb3JLZXk6V2ViQ29yZUVsZW1lbnRMaW5rVVJMS2V5XTsK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRE9NU3RyaW5nIHRhcmdldCA9IGUtPmdldEF0
dHJpYnV0ZSh0YXJnZXRBdHRyKTsKLSAgICAgICAgaWYgKHRhcmdldC5pc0VtcHR5KCkgJiYgZG9j
KSB7IC8vIEZJWE1FOiBUYWtlIG91dCB0aGlzIGRvYyBjaGVjayB3aGVuIHdlJ3JlIG5vdCBqdXN0
IGJlZm9yZSBhIHJlbGVhc2UuCi0gICAgICAgICAgICB0YXJnZXQgPSBkb2MtPmJhc2VUYXJnZXQo
KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXRhcmdldC5pc0VtcHR5KCkpIHsKLSAgICAgICAg
ICAgIFtlbGVtZW50IHNldE9iamVjdDp0YXJnZXQucXN0cmluZygpLmdldE5TU3RyaW5nKCkgZm9y
S2V5OldlYkNvcmVFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5XTsKLSAgICAgICAgfQotICAgIH0K
KyAgICAgICAgcmV0dXJuOwogCi0gICAgTm9kZUltcGwgKm5vZGUgPSBub2RlSW5mby5pbm5lck5v
blNoYXJlZE5vZGUoKTsKLSAgICBpZiAobm9kZSkgewotICAgICAgICBbZWxlbWVudCBzZXRPYmpl
Y3Q6W0RPTU5vZGUgX25vZGVXaXRoSW1wbDpub2RlXSBmb3JLZXk6V2ViQ29yZUVsZW1lbnRET01O
b2RlS2V5XTsKLSAgICAKLSAgICAgICAgLy8gT25seSByZXR1cm4gaW1hZ2UgaW5mb3JtYXRpb24g
aWYgdGhlcmUgaXMgYW4gaW1hZ2UuCi0gICAgICAgIGlmIChub2RlLT5yZW5kZXJlcigpICYmIG5v
ZGUtPnJlbmRlcmVyKCktPmlzSW1hZ2UoKSkgewotICAgICAgICAgICAgUmVuZGVySW1hZ2UgKnIg
PSBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSAqPihub2RlLT5yZW5kZXJlcigpKTsKLSAgICAgICAg
ICAgIGludCB4LCB5OwotICAgICAgICAgICAgaWYgKHItPmFic29sdXRlUG9zaXRpb24oeCwgeSkp
IHsKLSAgICAgICAgICAgICAgICBOU1ZhbHVlICpyZWN0ID0gW05TVmFsdWUgdmFsdWVXaXRoUmVj
dDpOU01ha2VSZWN0KHgsIHksIHItPmNvbnRlbnRXaWR0aCgpLCByLT5jb250ZW50SGVpZ2h0KCkp
XTsKLSAgICAgICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6cmVjdCBmb3JLZXk6V2ViQ29y
ZUVsZW1lbnRJbWFnZVJlY3RLZXldOwotICAgICAgICAgICAgfQorICAgIFJlbmRlck9iamVjdDo6
Tm9kZUluZm8gbm9kZUluZm8gPSBbc2VsZiBub2RlSW5mb0F0UG9pbnQ6cG9pbnRdOworICAgICpp
bm5lck5vblNoYXJlZE5vZGUgPSBbRE9NTm9kZSBfbm9kZVdpdGhJbXBsOm5vZGVJbmZvLmlubmVy
Tm9uU2hhcmVkTm9kZSgpXTsKKyAgICAqaW5uZXJOb2RlID0gW0RPTU5vZGUgX25vZGVXaXRoSW1w
bDpub2RlSW5mby5pbm5lck5vZGUoKV07CisgICAgKlVSTEVsZW1lbnQgPSAoRE9NRWxlbWVudCAq
KVtET01Ob2RlIF9ub2RlV2l0aEltcGw6bm9kZUluZm8uVVJMRWxlbWVudCgpXTsKK30KIAotICAg
ICAgICAgICAgRWxlbWVudEltcGwgKmkgPSBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCo+KG5vZGUp
OwotICAgIAotICAgICAgICAgICAgLy8gRklYTUU6IENvZGUgY29waWVkIGZyb20gUmVuZGVySW1h
Z2U6OnVwZGF0ZUZyb21FbGVtZW50OyBzaG91bGQgc2hhcmUuCi0gICAgICAgICAgICBET01TdHJp
bmcgYXR0cjsKLSAgICAgICAgICAgIGlmIChpLT5oYXNUYWdOYW1lKG9iamVjdFRhZykpIHsKLSAg
ICAgICAgICAgICAgICBhdHRyID0gaS0+Z2V0QXR0cmlidXRlKGRhdGFBdHRyKTsKLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0ciA9IGktPmdldEF0dHJpYnV0ZShzcmNB
dHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYXR0ci5pc0VtcHR5KCkpIHsK
LSAgICAgICAgICAgICAgICBRU3RyaW5nIFVSTFN0cmluZyA9IHBhcnNlVVJMKGF0dHIpLnFzdHJp
bmcoKTsKLSAgICAgICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6aS0+Z2V0RG9jdW1lbnQo
KS0+Y29tcGxldGVVUkwoVVJMU3RyaW5nKS5nZXROU1N0cmluZygpIGZvcktleTpXZWJDb3JlRWxl
bWVudEltYWdlVVJMS2V5XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgLy8gRklYTUU6IENvZGUgY29waWVkIGZyb20gUmVuZGVySW1hZ2U6OnVwZGF0ZUZyb21FbGVt
ZW50OyBzaG91bGQgc2hhcmUuCi0gICAgICAgICAgICBET01TdHJpbmcgYWx0OwotICAgICAgICAg
ICAgaWYgKGktPmhhc1RhZ05hbWUoaW5wdXRUYWcpKQotICAgICAgICAgICAgICAgIGFsdCA9IHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KGkpLT5hbHRUZXh0KCk7Ci0gICAgICAg
ICAgICBlbHNlIGlmIChpLT5oYXNUYWdOYW1lKGltZ1RhZykpCi0gICAgICAgICAgICAgICAgYWx0
ID0gc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudEltcGwgKj4oaSktPmFsdFRleHQoKTsKLSAg
ICAgICAgICAgIGlmICghYWx0LmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgUVN0cmluZyBh
bHRUZXh0ID0gYWx0LnFzdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBhbHRUZXh0LnJlcGxhY2Uo
UUNoYXIoJ1xcJyksIG1fZnJhbWUtPmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAg
ICAgICAgICAgICAgW2VsZW1lbnQgc2V0T2JqZWN0OmFsdFRleHQuZ2V0TlNTdHJpbmcoKSBmb3JL
ZXk6V2ViQ29yZUVsZW1lbnRJbWFnZUFsdFN0cmluZ0tleV07Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGVsZW1lbnQ7CistIChCT09MKWlzUG9pbnRJ
bnNpZGVTZWxlY3Rpb246KE5TUG9pbnQpcG9pbnQKK3sKKyAgICByZXR1cm4gbV9mcmFtZS0+aXNQ
b2ludEluc2lkZVNlbGVjdGlvbigoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSk7CiB9CiAKIC0g
KE5TVVJMICopVVJMV2l0aEF0dHJpYnV0ZVN0cmluZzooTlNTdHJpbmcgKilzdHJpbmcKSW5kZXg6
IFdlYktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxMjk4MykKKysrIFdlYktpdC54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0yOTUsNiArMjk1LDggQEAK
IAkJOTM5ODExMkUwODI0QkYwMTAwOERGMDM4IC8qIGxpYmljdWNvcmUuZHlsaWIgaW4gRnJhbWV3
b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5M0Q2MjNERDA1MUU3OTFG
MDAyRjQ3REQgLyogbGliaWN1Y29yZS5keWxpYiAqLzsgfTsKIAkJOTM5ODExMkYwODI0QkYwMTAw
OERGMDM4IC8qIFNlY3VyaXR5LmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgzMEU4MUUwMDU4NTNBQzAwMEFEMDg5MSAvKiBTZWN1cml0
eS5mcmFtZXdvcmsgKi87IH07CiAJCUFCRERGMjBEMDhFQjBEREMwMDFFMTI0MSAvKiBXZWJEb3du
bG9hZEludGVybmFsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBQkRERjIwQzA4RUIwRERDMDAxRTEyNDEgLyogV2ViRG93bmxvYWRJbnRlcm5hbC5oICov
OyB9OworCQlERDg5NjgyMDA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnku
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEREODk2ODFF
MDlBQTg3MjQwMDk3RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5oICovOyB9OworCQlERDg5
NjgyMTA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkubSBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEREODk2ODFGMDlBQTg3MjQwMDk3
RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5tICovOyB9OwogCQlFRDZCRTJFNzA4OEMzMkI1
MDA0NERFREMgLyogV2ViTlNBdHRyaWJ1dGVkU3RyaW5nRXh0cmFzLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFRDZCRTJFNTA4OEMzMkI1MDA0NERFREMg
LyogV2ViTlNBdHRyaWJ1dGVkU3RyaW5nRXh0cmFzLmggKi87IH07CiAJCUVENkJFMkU4MDg4QzMy
QjUwMDQ0REVEQyAvKiBXZWJOU0F0dHJpYnV0ZWRTdHJpbmdFeHRyYXMubSBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVENkJFMkU2MDg4QzMyQjUwMDQ0REVE
QyAvKiBXZWJOU0F0dHJpYnV0ZWRTdHJpbmdFeHRyYXMubSAqLzsgfTsKIAkJRUQ3RjZEOEIwOTgw
NjgzNTAwQzIzNUVEIC8qIFdlYk5TRGF0YUV4dHJhc1ByaXZhdGUuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEVEN0Y2RDhBMDk4MDY4MzUwMEMyMzVFRCAv
KiBXZWJOU0RhdGFFeHRyYXNQcml2YXRlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAo
UHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTU1Myw2ICs1NTUsOCBAQAogCQlCRUUxOEY5QTA0NzJCNzMy
MDBDQTI4OUMgLyogV2ViTG9jYWxpemFibGVTdHJpbmdzLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFdlYkxvY2FsaXphYmxlU3RyaW5ncy5t
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsK
IAkJQkVFNTJENEEwNDczMDMyNTAwQ0EyODlDIC8qIFdlYktpdFN5c3RlbUJpdHMuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXZWJLaXRTeXN0ZW1C
aXRzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAw
OyB9OwogCQlCRUU1MkQ0QjA0NzMwMzI1MDBDQTI4OUMgLyogV2ViS2l0U3lzdGVtQml0cy5tICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRo
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFdlYktp
dFN5c3RlbUJpdHMubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2Vz
VGFicyA9IDA7IH07CisJCUREODk2ODFFMDlBQTg3MjQwMDk3RTdGMCAvKiBXZWJFbGVtZW50RGlj
dGlvbmFyeS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFdlYkVsZW1lbnREaWN0aW9uYXJ5Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldp
ZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OworCQlERDg5NjgxRjA5QUE4NzI0MDA5N0U3RjAgLyog
V2ViRWxlbWVudERpY3Rpb25hcnkubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLm9iamM7IHBhdGggPSBXZWJFbGVtZW50RGljdGlvbmFyeS5tOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJRUQyMUI5ODEwNTI4
RjdBQTAwMzI5OUFDIC8qIFdlYkRvY3VtZW50SW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXZWJEb2N1bWVudEludGVybmFsLmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlF
RDJCMjQ3NDAzM0EyREE4MDBDMUE1MjYgLyogV2ViTlNQYXN0ZWJvYXJkRXh0cmFzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2ViTlNQYXN0ZWJv
YXJkRXh0cmFzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1Rh
YnMgPSAwOyB9OwogCQlFRDJCMjQ3NTAzM0EyREE4MDBDMUE1MjYgLyogV2ViTlNQYXN0ZWJvYXJk
RXh0cmFzLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
aW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBw
YXRoID0gV2ViTlNQYXN0ZWJvYXJkRXh0cmFzLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRh
YldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwpAQCAtODAxLDYgKzgwNSw4IEBACiAJCQkJRjU5
NjY4QzkwMkFEMjkyMzAxODYzNUNBIC8qIFdlYlN0cmluZ1RydW5jYXRvci5tICovLAogCQkJCTY1
NzhGNURFMDQ1RjgxNzQwMDAwMDEyOCAvKiBXZWJEb3dubG9hZC5oICovLAogCQkJCTY1NzhGNURG
MDQ1RjgxNzQwMDAwMDEyOCAvKiBXZWJEb3dubG9hZC5tICovLAorCQkJCUREODk2ODFFMDlBQTg3
MjQwMDk3RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5oICovLAorCQkJCUREODk2ODFGMDlB
QTg3MjQwMDk3RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5tICovLAogCQkJKTsKIAkJCXBh
dGggPSBNaXNjOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTEzMTIsNiArMTMxOCw3
IEBACiAJCQkJRUQ3RjZEOEIwOTgwNjgzNTAwQzIzNUVEIC8qIFdlYk5TRGF0YUV4dHJhc1ByaXZh
dGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTY1MTk1MUUyMDk5NzQxNzgwMDNERkM2NSAvKiBXZWJM
b2FkZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTY1NTBCN0M3MDk5RUZBRTkwMDkwRDc4MSAvKiBX
ZWJBcmNoaXZlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJREQ4OTY4MjAwOUFBODcyNDAwOTdFN0Yw
IC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5LmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5P
bmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTE4NDIsNiArMTg0
OSw3IEBACiAJCQkJMUM2OEY2NzIwOTVCNUZDMTAwQzI5ODRFIC8qIFdlYk5vZGVIaWdobGlnaHRW
aWV3Lm0gaW4gU291cmNlcyAqLywKIAkJCQk2NUM3RjQyRDA5NzlERTY0MDAyMkU0NTMgLyogV2Vi
UGFnZUJyaWRnZS5tIGluIFNvdXJjZXMgKi8sCiAJCQkJNjU1MEI3QzgwOTlFRkFFOTAwOTBENzgx
IC8qIFdlYkFyY2hpdmVyLm0gaW4gU291cmNlcyAqLywKKwkJCQlERDg5NjgyMTA5QUE4NzI0MDA5
N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkubSBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogTWlz
Yy9XZWJFbGVtZW50RGljdGlvbmFyeS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIE1pc2MvV2ViRWxlbWVudERp
Y3Rpb25hcnkuaAkocmV2aXNpb24gMCkKKysrIE1pc2MvV2ViRWxlbWVudERpY3Rpb25hcnkuaAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBB
cHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJB
cHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAK
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJ
QlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW1wb3J0IDxGb3Vu
ZGF0aW9uL05TRGljdGlvbmFyeS5oPgorCitAY2xhc3MgRE9NTm9kZTsKK0BjbGFzcyBET01FbGVt
ZW50OworCitAaW50ZXJmYWNlIFdlYkVsZW1lbnREaWN0aW9uYXJ5IDogTlNEaWN0aW9uYXJ5IHsK
KyAgICBET01Ob2RlICpfaW5uZXJOb2RlOworICAgIERPTU5vZGUgKl9pbm5lck5vblNoYXJlZE5v
ZGU7CisgICAgRE9NRWxlbWVudCAqX1VSTEVsZW1lbnQ7CisgICAgTlNNdXRhYmxlRGljdGlvbmFy
eSAqX2NhY2hlOworICAgIE5TTXV0YWJsZVNldCAqX25pbFZhbHVlczsKKyAgICBOU1BvaW50IF9w
b2ludDsKKyAgICBCT09MIF9jYWNoZUNvbXBsZXRlOworfQorLSAoaWQpaW5pdFdpdGhJbm5lck5v
blNoYXJlZE5vZGU6KERPTU5vZGUgKilpbm5lck5vblNoYXJlZE5vZGUgaW5uZXJOb2RlOihET01O
b2RlICopaW5uZXJOb2RlIFVSTEVsZW1lbnQ6KERPTUVsZW1lbnQgKilVUkxFbGVtZW50IGFuZFBv
aW50OihOU1BvaW50KXBvaW50OworQGVuZApJbmRleDogTWlzYy9XZWJFbGVtZW50RGljdGlvbmFy
eS5tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIE1pc2MvV2ViRWxlbWVudERpY3Rpb25hcnkubQkocmV2aXNpb24g
MCkKKysrIE1pc2MvV2ViRWxlbWVudERpY3Rpb25hcnkubQkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9ydCAiV2ViRWxlbWVudERpY3Rpb25hcnkuaCIK
KyNpbXBvcnQgIldlYkRPTU9wZXJhdGlvbnMuaCIKKyNpbXBvcnQgIldlYkZyYW1lLmgiCisjaW1w
b3J0ICJXZWJGcmFtZUJyaWRnZS5oIgorI2ltcG9ydCAiV2ViVmlldy5oIgorI2ltcG9ydCAiV2Vi
Vmlld1ByaXZhdGUuaCIKKworI2ltcG9ydCA8V2ViS2l0L0RPTUNvcmUuaD4KKyNpbXBvcnQgPFdl
YktpdC9ET01Qcml2YXRlLmg+CisKK3R5cGVkZWYgZW51bSB7CisgICAgV2ViRWxlbWVudFNlbGYs
CisgICAgV2ViRWxlbWVudElubmVyTm9kZSwKKyAgICBXZWJFbGVtZW50SW5uZXJOb25TaGFyZWRO
b2RlLAorICAgIFdlYkVsZW1lbnRVUkxFbGVtZW50Cit9IFdlYkVsZW1lbnRUYXJnZXRPYmplY3Q7
CisKK3N0cnVjdCBXZWJFbGVtZW50TWV0aG9kIHsKKyAgICBXZWJFbGVtZW50VGFyZ2V0T2JqZWN0
IHRhcmdldDsKKyAgICBTRUwgc2VsZWN0b3I7Cit9OworCitzdGF0aWMgQ0ZNdXRhYmxlRGljdGlv
bmFyeVJlZiBsb29rdXBUYWJsZSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGFkZExvb2t1cEtleShO
U1N0cmluZyAqa2V5LCBTRUwgc2VsZWN0b3IsIFdlYkVsZW1lbnRUYXJnZXRPYmplY3QgdGFyZ2V0
KQoreworICAgIGlmICghbG9va3VwVGFibGUpCisgICAgICAgIHJldHVybjsKKyAgICBzdHJ1Y3Qg
V2ViRWxlbWVudE1ldGhvZCAqZWxlbWVudE1ldGhvZCA9IChzdHJ1Y3QgV2ViRWxlbWVudE1ldGhv
ZCAqKUNGQWxsb2NhdG9yQWxsb2NhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc2l6ZW9mKHN0cnVj
dCBXZWJFbGVtZW50TWV0aG9kKSwgMCk7CisgICAgZWxlbWVudE1ldGhvZC0+dGFyZ2V0ID0gdGFy
Z2V0OworICAgIGVsZW1lbnRNZXRob2QtPnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgQ0ZEaWN0
aW9uYXJ5QWRkVmFsdWUobG9va3VwVGFibGUsIGtleSwgZWxlbWVudE1ldGhvZCk7Cit9CisKK0Bp
bXBsZW1lbnRhdGlvbiBXZWJFbGVtZW50RGljdGlvbmFyeQorKyAodm9pZClpbml0aWFsaXplTG9v
a3VwVGFibGUKK3sKKyAgICBpZiAobG9va3VwVGFibGUpCisgICAgICAgIHJldHVybjsKKworICAg
IENGRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzIHZjYiA9IHswLCBOVUxMLCAodm9pZCAqKUNGQWxs
b2NhdG9yRGVhbGxvY2F0ZSwgTlVMTCwgTlVMTH07CisgICAgbG9va3VwVGFibGUgPSBDRkRpY3Rp
b25hcnlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsIDEyLCAma0NGQ29weVN0cmlu
Z0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZ2Y2IpOworCisgICAgYWRkTG9va3VwS2V5KFdlYkVs
ZW1lbnRET01Ob2RlS2V5LCBAc2VsZWN0b3IoX2RvbU5vZGUpLCBXZWJFbGVtZW50U2VsZik7Cisg
ICAgYWRkTG9va3VwS2V5KFdlYkVsZW1lbnRGcmFtZUtleSwgQHNlbGVjdG9yKF93ZWJGcmFtZSks
IFdlYkVsZW1lbnRTZWxmKTsKKyAgICBhZGRMb29rdXBLZXkoV2ViRWxlbWVudEltYWdlQWx0U3Ry
aW5nS2V5LCBAc2VsZWN0b3IoYWx0RGlzcGxheVN0cmluZyksIFdlYkVsZW1lbnRJbm5lck5vblNo
YXJlZE5vZGUpOworICAgIGFkZExvb2t1cEtleShXZWJFbGVtZW50SW1hZ2VLZXksIEBzZWxlY3Rv
cihpbWFnZSksIFdlYkVsZW1lbnRJbm5lck5vblNoYXJlZE5vZGUpOworICAgIGFkZExvb2t1cEtl
eShXZWJFbGVtZW50SW1hZ2VSZWN0S2V5LCBAc2VsZWN0b3IoX2ltYWdlUmVjdCksIFdlYkVsZW1l
bnRTZWxmKTsKKyAgICBhZGRMb29rdXBLZXkoV2ViRWxlbWVudEltYWdlVVJMS2V5LCBAc2VsZWN0
b3IoYWJzb2x1dGVJbWFnZVVSTCksIFdlYkVsZW1lbnRJbm5lck5vblNoYXJlZE5vZGUpOworICAg
IGFkZExvb2t1cEtleShXZWJFbGVtZW50SXNTZWxlY3RlZEtleSwgQHNlbGVjdG9yKF9pc1NlbGVj
dGVkKSwgV2ViRWxlbWVudFNlbGYpOworICAgIGFkZExvb2t1cEtleShXZWJFbGVtZW50VGl0bGVL
ZXksIEBzZWxlY3RvcihfdGl0bGUpLCBXZWJFbGVtZW50U2VsZik7CisgICAgYWRkTG9va3VwS2V5
KFdlYkVsZW1lbnRMaW5rVVJMS2V5LCBAc2VsZWN0b3IoYWJzb2x1dGVMaW5rVVJMKSwgV2ViRWxl
bWVudFVSTEVsZW1lbnQpOworICAgIGFkZExvb2t1cEtleShXZWJFbGVtZW50TGlua1RhcmdldEZy
YW1lS2V5LCBAc2VsZWN0b3IoX3RhcmdldFdlYkZyYW1lKSwgV2ViRWxlbWVudFNlbGYpOworICAg
IGFkZExvb2t1cEtleShXZWJFbGVtZW50TGlua1RpdGxlS2V5LCBAc2VsZWN0b3IodGl0bGVEaXNw
bGF5U3RyaW5nKSwgV2ViRWxlbWVudFVSTEVsZW1lbnQpOworICAgIGFkZExvb2t1cEtleShXZWJF
bGVtZW50TGlua0xhYmVsS2V5LCBAc2VsZWN0b3IodGV4dENvbnRlbnQpLCBXZWJFbGVtZW50VVJM
RWxlbWVudCk7Cit9CisKKy0gKGlkKWluaXRXaXRoSW5uZXJOb25TaGFyZWROb2RlOihET01Ob2Rl
ICopaW5uZXJOb25TaGFyZWROb2RlIGlubmVyTm9kZTooRE9NTm9kZSAqKWlubmVyTm9kZSBVUkxF
bGVtZW50OihET01FbGVtZW50ICopVVJMRWxlbWVudCBhbmRQb2ludDooTlNQb2ludClwb2ludAor
eworICAgIFtbc2VsZiBjbGFzc10gaW5pdGlhbGl6ZUxvb2t1cFRhYmxlXTsKKyAgICBbc3VwZXIg
aW5pdF07CisgICAgX3BvaW50ID0gcG9pbnQ7CisgICAgX2lubmVyTm9kZSA9IFtpbm5lck5vZGUg
cmV0YWluXTsKKyAgICBfaW5uZXJOb25TaGFyZWROb2RlID0gW2lubmVyTm9uU2hhcmVkTm9kZSBy
ZXRhaW5dOworICAgIF9VUkxFbGVtZW50ID0gW1VSTEVsZW1lbnQgcmV0YWluXTsKKyAgICByZXR1
cm4gc2VsZjsKK30KKworLSAodm9pZClkZWFsbG9jCit7CisgICAgW19pbm5lck5vZGUgcmVsZWFz
ZV07CisgICAgW19pbm5lck5vblNoYXJlZE5vZGUgcmVsZWFzZV07CisgICAgW19VUkxFbGVtZW50
IHJlbGVhc2VdOworICAgIFtfY2FjaGUgcmVsZWFzZV07CisgICAgW19uaWxWYWx1ZXMgcmVsZWFz
ZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistICh2b2lkKV9maWxsQ2FjaGUKK3sKKyAg
ICBpZiAoX2NhY2hlQ29tcGxldGUpCisgICAgICAgIHJldHVybjsKKyAgICBOU1N0cmluZyAqa2V5
ID0gbmlsOworICAgIE5TRW51bWVyYXRvciAqZW51bWVyYXRvciA9IFsoTlNEaWN0aW9uYXJ5ICop
bG9va3VwVGFibGUga2V5RW51bWVyYXRvcl07CisgICAgd2hpbGUgKChrZXkgPSBbZW51bWVyYXRv
ciBuZXh0T2JqZWN0XSkpCisgICAgICAgIFtzZWxmIG9iamVjdEZvcktleTprZXldOworICAgIF9j
YWNoZUNvbXBsZXRlID0gWUVTOworfQorCistICh1bnNpZ25lZCljb3VudAoreworICAgIGlmICgh
X2NhY2hlQ29tcGxldGUpCisgICAgICAgIFtzZWxmIF9maWxsQ2FjaGVdOworICAgIHJldHVybiBb
X2NhY2hlIGNvdW50XTsKK30KKworLSAoTlNFbnVtZXJhdG9yICopa2V5RW51bWVyYXRvcgorewor
ICAgIGlmICghX2NhY2hlQ29tcGxldGUpCisgICAgICAgIFtzZWxmIF9maWxsQ2FjaGVdOworICAg
IHJldHVybiBbX2NhY2hlIGtleUVudW1lcmF0b3JdOworfQorCistIChpZClvYmplY3RGb3JLZXk6
KGlkKWtleQoreworICAgIGlkIHZhbHVlID0gW19jYWNoZSBvYmplY3RGb3JLZXk6a2V5XTsKKyAg
ICBpZiAodmFsdWUgfHwgX2NhY2hlQ29tcGxldGUgfHwgKF9uaWxWYWx1ZXMgJiYgW19uaWxWYWx1
ZXMgY29udGFpbnNPYmplY3Q6a2V5XSkpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIHN0
cnVjdCBXZWJFbGVtZW50TWV0aG9kICplbGVtZW50TWV0aG9kID0gKHN0cnVjdCBXZWJFbGVtZW50
TWV0aG9kICopQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUobG9va3VwVGFibGUsIGtleSk7CisgICAgaWYg
KCFlbGVtZW50TWV0aG9kKQorICAgICAgICByZXR1cm4gbmlsOworCisgICAgaWQgdGFyZ2V0ID0g
bmlsOworICAgIHN3aXRjaCAoZWxlbWVudE1ldGhvZC0+dGFyZ2V0KSB7CisgICAgICAgIGNhc2Ug
V2ViRWxlbWVudFNlbGY6CisgICAgICAgICAgICB0YXJnZXQgPSBzZWxmOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgV2ViRWxlbWVudElubmVyTm9uU2hhcmVkTm9kZToKKyAgICAg
ICAgICAgIHRhcmdldCA9IF9pbm5lck5vblNoYXJlZE5vZGU7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBXZWJFbGVtZW50SW5uZXJOb2RlOgorICAgICAgICAgICAgdGFyZ2V0ID0g
X2lubmVyTm9kZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdlYkVsZW1lbnRV
UkxFbGVtZW50OgorICAgICAgICAgICAgdGFyZ2V0ID0gX1VSTEVsZW1lbnQ7CisgICAgICAgICAg
ICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodGFyZ2V0ICYmIFt0YXJnZXQgcmVzcG9uZHNUb1Nl
bGVjdG9yOmVsZW1lbnRNZXRob2QtPnNlbGVjdG9yXSkKKyAgICAgICAgdmFsdWUgPSBbdGFyZ2V0
IHBlcmZvcm1TZWxlY3RvcjplbGVtZW50TWV0aG9kLT5zZWxlY3Rvcl07CisKKyAgICBpZiAodmFs
dWUpIHsKKyAgICAgICAgaWYgKCFfY2FjaGUpCisgICAgICAgICAgICBfY2FjaGUgPSBbW05TTXV0
YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6Q0ZEaWN0aW9uYXJ5R2V0Q291
bnQobG9va3VwVGFibGUpXTsKKyAgICAgICAgW19jYWNoZSBzZXRPYmplY3Q6dmFsdWUgZm9yS2V5
OmtleV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFfbmlsVmFsdWVzKQorICAgICAgICAg
ICAgX25pbFZhbHVlcyA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OkNG
RGljdGlvbmFyeUdldENvdW50KGxvb2t1cFRhYmxlKV07CisgICAgICAgIFtfbmlsVmFsdWVzIGFk
ZE9iamVjdDprZXldOworICAgIH0KKworICAgIGlmICgoW19jYWNoZSBjb3VudF0gKyBbX25pbFZh
bHVlcyBjb3VudF0pID09ICh1bnNpZ25lZCBsb25nKUNGRGljdGlvbmFyeUdldENvdW50KGxvb2t1
cFRhYmxlKSkKKyAgICAgICAgX2NhY2hlQ29tcGxldGUgPSBZRVM7CisKKyAgICByZXR1cm4gdmFs
dWU7Cit9CisKKy0gKERPTU5vZGUgKilfZG9tTm9kZQoreworICAgIHJldHVybiBbW19pbm5lck5v
blNoYXJlZE5vZGUgcmV0YWluXSBhdXRvcmVsZWFzZV07Cit9CisKKy0gKFdlYkZyYW1lICopX3dl
YkZyYW1lCit7CisgICAgcmV0dXJuIFtbX2lubmVyTm9uU2hhcmVkTm9kZSBvd25lckRvY3VtZW50
XSB3ZWJGcmFtZV07Cit9CisKKy0gKFdlYkZyYW1lICopX3RhcmdldFdlYkZyYW1lCit7CisgICAg
aWYgKCFfVVJMRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICBXZWJGcmFtZSAqd2Vi
RnJhbWUgPSBbW19pbm5lck5vblNoYXJlZE5vZGUgb3duZXJEb2N1bWVudF0gd2ViRnJhbWVdOwor
ICAgIE5TU3RyaW5nICp0YXJnZXROYW1lID0gWyhET01IVE1MQW5jaG9yRWxlbWVudCAqKV9VUkxF
bGVtZW50IHRhcmdldF07CisgICAgaWYgKFt0YXJnZXROYW1lIGxlbmd0aF0pCisgICAgICAgIHJl
dHVybiBbd2ViRnJhbWUgZmluZEZyYW1lTmFtZWQ6dGFyZ2V0TmFtZV07CisgICAgcmV0dXJuIHdl
YkZyYW1lOworfQorCistIChOU1N0cmluZyAqKV90aXRsZQoreworICAgIC8vIEZpbmQgdGhlIHRp
dGxlIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBET00gbm9kZS4KKyAgICAvLyBGb3IgPGFyZWE+
IHRhZ3MgaW4gaW1hZ2UgbWFwcywgd2FsayB0aGUgdHJlZSBmb3IgdGhlIDxhcmVhPiwgbm90IHRo
ZSA8aW1nPiB1c2luZyBpdC4KKyAgICBmb3IgKERPTU5vZGUgKnRpdGxlTm9kZSA9IF9pbm5lck5v
ZGU7IHRpdGxlTm9kZTsgdGl0bGVOb2RlID0gW3RpdGxlTm9kZSBwYXJlbnROb2RlXSkgeworICAg
ICAgICBpZiAoW3RpdGxlTm9kZSBpc0tpbmRPZkNsYXNzOltET01IVE1MRWxlbWVudCBjbGFzc11d
KSB7CisgICAgICAgICAgICBOU1N0cmluZyAqdGl0bGUgPSBbKERPTUhUTUxFbGVtZW50ICopdGl0
bGVOb2RlIHRpdGxlRGlzcGxheVN0cmluZ107CisgICAgICAgICAgICBpZiAoW3RpdGxlIGxlbmd0
aF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlOworICAgICAgICB9CisgICAgfQorICAg
IHJldHVybiBuaWw7Cit9CisKKy0gKE5TVmFsdWUgKilfaW1hZ2VSZWN0Cit7CisgICAgcmV0dXJu
IFtOU1ZhbHVlIHZhbHVlV2l0aFJlY3Q6W19pbm5lck5vblNoYXJlZE5vZGUgYm91bmRpbmdCb3hd
XTsKK30KKworLSAoTlNOdW1iZXIgKilfaXNTZWxlY3RlZAoreworICAgIHJldHVybiBbTlNOdW1i
ZXIgbnVtYmVyV2l0aEJvb2w6W1tbW19pbm5lck5vblNoYXJlZE5vZGUgb3duZXJEb2N1bWVudF0g
d2ViRnJhbWVdIF9icmlkZ2VdIGlzUG9pbnRJbnNpZGVTZWxlY3Rpb246X3BvaW50XV07Cit9CitA
ZW5kCkluZGV4OiBNaXNjL1dlYk5TVmlld0V4dHJhcy5tCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIE1pc2MvV2Vi
TlNWaWV3RXh0cmFzLm0JKHJldmlzaW9uIDEyOTgzKQorKysgTWlzYy9XZWJOU1ZpZXdFeHRyYXMu
bQkod29ya2luZyBjb3B5KQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgTlNJbWFnZSAqZHJhZ0lt
YWdlOwogICAgIE5TUG9pbnQgb3JpZ2luOwogCi0gICAgTlNJbWFnZSAqaW1hZ2UgPSAod2lyICE9
IG5pbCkgPyBbd2lyIGltYWdlXSA6IFtlbGVtZW50IF9pbWFnZV07CisgICAgTlNJbWFnZSAqaW1h
Z2UgPSAod2lyICE9IG5pbCkgPyBbd2lyIGltYWdlXSA6IFtlbGVtZW50IGltYWdlXTsKICAgICBp
ZiAoaW1hZ2UgIT0gbmlsICYmIFtpbWFnZSBzaXplXS5oZWlnaHQgKiBbaW1hZ2Ugc2l6ZV0ud2lk
dGggPD0gV2ViTWF4T3JpZ2luYWxJbWFnZUFyZWEpIHsKICAgICAgICAgTlNTaXplIG9yaWdpbmFs
U2l6ZSA9IHJlY3Quc2l6ZTsKICAgICAgICAgb3JpZ2luID0gcmVjdC5vcmlnaW47CkluZGV4OiBX
ZWJWaWV3L1dlYlZpZXdQcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViVmlldy9XZWJWaWV3UHJp
dmF0ZS5oCShyZXZpc2lvbiAxMjk4MykKKysrIFdlYlZpZXcvV2ViVmlld1ByaXZhdGUuaAkod29y
a2luZyBjb3B5KQpAQCAtNjUsNiArNjUsOCBAQCBleHRlcm4gTlNTdHJpbmcgKl9XZWJNYWluRnJh
bWVJY29uS2V5OwogZXh0ZXJuIE5TU3RyaW5nICpfV2ViTWFpbkZyYW1lVGl0bGVLZXk7CiBleHRl
cm4gTlNTdHJpbmcgKl9XZWJNYWluRnJhbWVVUkxLZXk7CiAKK2V4dGVybiBOU1N0cmluZyAqV2Vi
RWxlbWVudFRpdGxlS2V5OyAgIC8vIE5TU3RyaW5nIG9mIHRoZSB0aXRsZSBvZiB0aGUgZWxlbWVu
dCAocGVuZGluZyBwdWJsaWMsIHVzZWQgYnkgU2FmYXJpKQorCiB0eXBlZGVmIGVudW0gewogICAg
IFdlYkRhc2hib2FyZEJlaGF2aW9yQWx3YXlzU2VuZE1vdXNlRXZlbnRzVG9BbGxXaW5kb3dzLAog
ICAgIFdlYkRhc2hib2FyZEJlaGF2aW9yQWx3YXlzU2VuZEFjdGl2ZU51bGxFdmVudHNUb1BsdWdJ
bnMsCkluZGV4OiBXZWJWaWV3L1dlYlZpZXcubQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJWaWV3L1dlYlZp
ZXcubQkocmV2aXNpb24gMTI5ODMpCisrKyBXZWJWaWV3L1dlYlZpZXcubQkod29ya2luZyBjb3B5
KQpAQCAtMzA5LDYgKzMwOSw3IEBAIE5TU3RyaW5nICpXZWJFbGVtZW50SW1hZ2VBbHRTdHJpbmdL
ZXkgPSAKIE5TU3RyaW5nICpXZWJFbGVtZW50SW1hZ2VSZWN0S2V5ID0gICAgICAgICAgQCJXZWJF
bGVtZW50SW1hZ2VSZWN0IjsKIE5TU3RyaW5nICpXZWJFbGVtZW50SW1hZ2VVUkxLZXkgPSAgICAg
ICAgICAgQCJXZWJFbGVtZW50SW1hZ2VVUkwiOwogTlNTdHJpbmcgKldlYkVsZW1lbnRJc1NlbGVj
dGVkS2V5ID0gICAgICAgICBAIldlYkVsZW1lbnRJc1NlbGVjdGVkIjsKK05TU3RyaW5nICpXZWJF
bGVtZW50VGl0bGVLZXkgPSAgICAgICAgICAgICAgQCJXZWJFbGVtZW50VGl0bGUiOwogTlNTdHJp
bmcgKldlYkVsZW1lbnRMaW5rVVJMS2V5ID0gICAgICAgICAgICBAIldlYkVsZW1lbnRMaW5rVVJM
IjsKIE5TU3RyaW5nICpXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5ID0gICAgQCJXZWJFbGVt
ZW50VGFyZ2V0RnJhbWUiOwogTlNTdHJpbmcgKldlYkVsZW1lbnRMaW5rTGFiZWxLZXkgPSAgICAg
ICAgICBAIldlYkVsZW1lbnRMaW5rTGFiZWwiOwpJbmRleDogV2ViVmlldy9XZWJIVE1MVmlldy5t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYlZpZXcvV2ViSFRNTFZpZXcubQkocmV2aXNpb24gMTI5ODMpCisr
KyBXZWJWaWV3L1dlYkhUTUxWaWV3Lm0JKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDcgQEAK
ICNpbXBvcnQgPFdlYktpdC9XZWJEb2N1bWVudEludGVybmFsLmg+CiAjaW1wb3J0IDxXZWJLaXQv
V2ViRE9NT3BlcmF0aW9uc1ByaXZhdGUuaD4KICNpbXBvcnQgPFdlYktpdC9XZWJFZGl0aW5nRGVs
ZWdhdGUuaD4KKyNpbXBvcnQgPFdlYktpdC9XZWJFbGVtZW50RGljdGlvbmFyeS5oPgogI2ltcG9y
dCA8V2ViS2l0L1dlYkZyYW1lUHJpdmF0ZS5oPgogI2ltcG9ydCA8V2ViS2l0L1dlYkZyYW1lSW50
ZXJuYWwuaD4KICNpbXBvcnQgPFdlYktpdC9XZWJGcmFtZVZpZXdJbnRlcm5hbC5oPgpAQCAtMTA1
MCwxMCArMTA1MSwxMCBAQCBzdGF0aWMgV2ViSFRNTFZpZXcgKmxhc3RIaXRWaWV3ID0gbmlsOwog
ICAgICAgICAgICAgICAgICAgICBuZXdUb29sVGlwID0gW1soRE9NSFRNTElucHV0RWxlbWVudCAq
KSBkb21FbGVtZW50IGZvcm1dIGFjdGlvbl07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBp
ZiAobmV3VG9vbFRpcCA9PSBuaWwpCi0gICAgICAgICAgICAgICAgbmV3VG9vbFRpcCA9IFtbZWxl
bWVudCBvYmplY3RGb3JLZXk6V2ViQ29yZUVsZW1lbnRMaW5rVVJMS2V5XSBfd2ViX3VzZXJWaXNp
YmxlU3RyaW5nXTsKKyAgICAgICAgICAgICAgICBuZXdUb29sVGlwID0gW1tlbGVtZW50IG9iamVj
dEZvcktleTpXZWJFbGVtZW50TGlua1VSTEtleV0gX3dlYl91c2VyVmlzaWJsZVN0cmluZ107CiAg
ICAgICAgIH0KICAgICAgICAgaWYgKG5ld1Rvb2xUaXAgPT0gbmlsKQotICAgICAgICAgICAgbmV3
VG9vbFRpcCA9IFtlbGVtZW50IG9iamVjdEZvcktleTpXZWJDb3JlRWxlbWVudFRpdGxlS2V5XTsK
KyAgICAgICAgICAgIG5ld1Rvb2xUaXAgPSBbZWxlbWVudCBvYmplY3RGb3JLZXk6V2ViRWxlbWVu
dFRpdGxlS2V5XTsKICAgICAgICAgW3ZpZXcgX3NldFRvb2xUaXA6bmV3VG9vbFRpcF07CiAKICAg
ICAgICAgW3ZpZXcgcmVsZWFzZV07CkBAIC0xMTkzLDcgKzExOTQsNyBAQCBzdGF0aWMgV2ViSFRN
TFZpZXcgKmxhc3RIaXRWaWV3ID0gbmlsOwogCiAgICAgLy8gbm90ZSBwZXIga3dlYnN0ZXIsIHRo
ZSBvZmZzZXQgYXJnIGJlbG93IGlzIGFsd2F5cyBpZ25vcmVkIGluIHBvc2l0aW9uaW5nIHRoZSBp
bWFnZQogICAgIERPTUhUTUxFbGVtZW50ICppbWFnZUVsZW1lbnQgPSBbZWxlbWVudCBvYmplY3RG
b3JLZXk6V2ViRWxlbWVudERPTU5vZGVLZXldOwotICAgIGlmIChpbWFnZVVSTCAhPSBuaWwgJiYg
W2ltYWdlRWxlbWVudCBfaW1hZ2VdICE9IG5pbCAmJiAoX3ByaXZhdGUtPmRyYWdTb3VyY2VBY3Rp
b25NYXNrICYgV2ViRHJhZ1NvdXJjZUFjdGlvbkltYWdlKSkgeworICAgIGlmIChpbWFnZVVSTCAh
PSBuaWwgJiYgW2ltYWdlRWxlbWVudCBpbWFnZV0gIT0gbmlsICYmIChfcHJpdmF0ZS0+ZHJhZ1Nv
dXJjZUFjdGlvbk1hc2sgJiBXZWJEcmFnU291cmNlQWN0aW9uSW1hZ2UpKSB7CiAgICAgICAgIGlk
IHNvdXJjZSA9IHNlbGY7CiAgICAgICAgIGlmICghZGh0bWxXcm90ZURhdGEpIHsKICAgICAgICAg
ICAgIC8vIFNlbGVjdCB0aGUgaW1hZ2Ugd2hlbiBpdCBpcyBkcmFnZ2VkLiBUaGlzIGFsbG93cyB0
aGUgaW1hZ2UgdG8gYmUgbW92ZWQgdmlhIE1vdmVTZWxlY3Rpb25Db21tYW5kSW1wbCBhbmQgdGhp
cyBtYXRjaGVzIE5TVGV4dFZpZXcncyBiZWhhdmlvci4KQEAgLTI4NjQsMzUgKzI4NjUsMTEgQEAg
ZG9uZToKIAogLSAoTlNEaWN0aW9uYXJ5ICopZWxlbWVudEF0UG9pbnQ6KE5TUG9pbnQpcG9pbnQK
IHsKLSAgICBOU0RpY3Rpb25hcnkgKmVsZW1lbnRJbmZvV0MgPSBbW3NlbGYgX2JyaWRnZV0gZWxl
bWVudEF0UG9pbnQ6cG9pbnRdOwotICAgIE5TTXV0YWJsZURpY3Rpb25hcnkgKmVsZW1lbnRJbmZv
ID0gW2VsZW1lbnRJbmZvV0MgbXV0YWJsZUNvcHldOwotICAgIAotICAgIC8vIENvbnZlcnQgVVJM
IHN0cmluZ3MgdG8gTlNVUkxzLgotICAgIFtlbGVtZW50SW5mbyBfd2ViX3NldE9iamVjdElmTm90
TmlsOltOU1VSTCBfd2ViX1VSTFdpdGhEYXRhQXNTdHJpbmc6W2VsZW1lbnRJbmZvV0Mgb2JqZWN0
Rm9yS2V5OldlYkVsZW1lbnRMaW5rVVJMS2V5XV0gZm9yS2V5OldlYkVsZW1lbnRMaW5rVVJMS2V5
XTsKLSAgICBbZWxlbWVudEluZm8gX3dlYl9zZXRPYmplY3RJZk5vdE5pbDpbTlNVUkwgX3dlYl9V
UkxXaXRoRGF0YUFzU3RyaW5nOltlbGVtZW50SW5mb1dDIG9iamVjdEZvcktleTpXZWJFbGVtZW50
SW1hZ2VVUkxLZXldXSBmb3JLZXk6V2ViRWxlbWVudEltYWdlVVJMS2V5XTsKLSAgICBpZiAoW2Vs
ZW1lbnRJbmZvV0Mgb2JqZWN0Rm9yS2V5OldlYkVsZW1lbnRJbWFnZVVSTEtleV0pCi0gICAgICAg
IFtlbGVtZW50SW5mbyBfd2ViX3NldE9iamVjdElmTm90TmlsOltbZWxlbWVudEluZm9XQyBvYmpl
Y3RGb3JLZXk6V2ViRWxlbWVudERPTU5vZGVLZXldIF9pbWFnZV0gZm9yS2V5OldlYkVsZW1lbnRJ
bWFnZUtleV07Ci0KLSAgICBXZWJGcmFtZVZpZXcgKndlYkZyYW1lVmlldyA9IFtzZWxmIF93ZWJf
cGFyZW50V2ViRnJhbWVWaWV3XTsKLSAgICBBU1NFUlQod2ViRnJhbWVWaWV3KTsKLSAgICBXZWJG
cmFtZSAqd2ViRnJhbWUgPSBbd2ViRnJhbWVWaWV3IHdlYkZyYW1lXTsKLSAgICAKLSAgICBpZiAo
d2ViRnJhbWUpIHsKLSAgICAgICAgTlNTdHJpbmcgKmZyYW1lTmFtZSA9IFtlbGVtZW50SW5mb1dD
IG9iamVjdEZvcktleTpXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5XTsKLSAgICAgICAgaWYg
KFtmcmFtZU5hbWUgbGVuZ3RoXSA9PSAwKSB7Ci0gICAgICAgICAgICBbZWxlbWVudEluZm8gc2V0
T2JqZWN0OndlYkZyYW1lIGZvcktleTpXZWJFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5XTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFdlYkZyYW1lICp3ZiA9IFt3ZWJGcmFtZSBmaW5k
RnJhbWVOYW1lZDpmcmFtZU5hbWVdOwotICAgICAgICAgICAgaWYgKHdmICE9IG5pbCkKLSAgICAg
ICAgICAgICAgICBbZWxlbWVudEluZm8gc2V0T2JqZWN0OndmIGZvcktleTpXZWJFbGVtZW50TGlu
a1RhcmdldEZyYW1lS2V5XTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBbZWxl
bWVudEluZm8gcmVtb3ZlT2JqZWN0Rm9yS2V5OldlYkVsZW1lbnRMaW5rVGFyZ2V0RnJhbWVLZXld
OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBbZWxlbWVudEluZm8gc2V0T2JqZWN0Ondl
YkZyYW1lIGZvcktleTpXZWJFbGVtZW50RnJhbWVLZXldOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4gW2VsZW1lbnRJbmZvIGF1dG9yZWxlYXNlXTsKKyAgICBET01Ob2RlICppbm5lck5vZGUgPSBu
aWw7CisgICAgRE9NTm9kZSAqaW5uZXJOb25TaGFyZWROb2RlID0gbmlsOworICAgIERPTUVsZW1l
bnQgKlVSTEVsZW1lbnQgPSBuaWw7CisgICAgW1tzZWxmIF9icmlkZ2VdIGdldElubmVyTm9uU2hh
cmVkTm9kZTomaW5uZXJOb25TaGFyZWROb2RlIGlubmVyTm9kZTomaW5uZXJOb2RlIFVSTEVsZW1l
bnQ6JlVSTEVsZW1lbnQgYXRQb2ludDpwb2ludF07CisgICAgcmV0dXJuIFtbW1dlYkVsZW1lbnRE
aWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aElubmVyTm9uU2hhcmVkTm9kZTppbm5lck5vblNoYXJl
ZE5vZGUgaW5uZXJOb2RlOmlubmVyTm9kZSBVUkxFbGVtZW50OlVSTEVsZW1lbnQgYW5kUG9pbnQ6
cG9pbnRdIGF1dG9yZWxlYXNlXTsKIH0KIAogLSAodm9pZCltb3VzZVVwOihOU0V2ZW50ICopZXZl
bnQK
</data>
<flag name="review"
          id="1709"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6747</attachid>
            <date>2006-02-26 12:56:29 -0800</date>
            <delta_ts>2006-03-01 10:05:44 -0800</delta_ts>
            <desc>Implementation using a smart dictionary (round 4)</desc>
            <filename>elementAtPoint.patch</filename>
            <type>text/plain</type>
            <size>39586</size>
            <attacher name="Timothy Hatcher">timothy</attacher>
            
              <data encoding="base64">SW5kZXg6IGJpbmRpbmdzL29iamMvRE9NLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJpbmRpbmdzL29iamMv
RE9NLm1tCShyZXZpc2lvbiAxMjk4MykKKysrIGJpbmRpbmdzL29iamMvRE9NLm1tCSh3b3JraW5n
IGNvcHkpCkBAIC0xNDUxLDYgKzE0NTEsMTcgQEAgc3RhdGljIExpc3RlbmVyTWFwICpsaXN0ZW5l
ck1hcDsKIAogQGltcGxlbWVudGF0aW9uIERPTUVsZW1lbnQgKERPTUVsZW1lbnRFeHRlbnNpb25z
KQogCistIChOU0ltYWdlKilpbWFnZQoreworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBb
c2VsZiBfZWxlbWVudEltcGxdLT5yZW5kZXJlcigpOworICAgIGlmIChyZW5kZXJlciAmJiByZW5k
ZXJlci0+aXNJbWFnZSgpKSB7CisgICAgICAgIFJlbmRlckltYWdlKiBpbWcgPSBzdGF0aWNfY2Fz
dDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKTsKKyAgICAgICAgaWYgKGltZy0+Y2FjaGVkSW1hZ2Uo
KSAmJiAhaW1nLT5jYWNoZWRJbWFnZSgpLT5pc0Vycm9ySW1hZ2UoKSkKKyAgICAgICAgICAgIHJl
dHVybiBpbWctPmNhY2hlZEltYWdlKCktPmltYWdlKCktPmdldE5TSW1hZ2UoKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG5pbDsKK30KKwogLSAodm9pZClmb2N1cwogewogICAgIFtzZWxmIF9lbGVtZW50
SW1wbF0tPmZvY3VzKCk7CkBAIC0xNDk4LDE3ICsxNTA5LDYgQEAgc3RhdGljIExpc3RlbmVyTWFw
ICpsaXN0ZW5lck1hcDsKICAgICByZXR1cm4gbmlsOwogfQogCi0tIChOU0ltYWdlKilfaW1hZ2UK
LXsKLSAgICBSZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gW3NlbGYgX2VsZW1lbnRJbXBsXS0+cmVu
ZGVyZXIoKTsKLSAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzSW1hZ2UoKSkgewotICAg
ICAgICBSZW5kZXJJbWFnZSogaW1nID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJl
cik7Ci0gICAgICAgIGlmIChpbWctPmNhY2hlZEltYWdlKCkgJiYgIWltZy0+Y2FjaGVkSW1hZ2Uo
KS0+aXNFcnJvckltYWdlKCkpCi0gICAgICAgICAgICByZXR1cm4gaW1nLT5jYWNoZWRJbWFnZSgp
LT5pbWFnZSgpLT5nZXROU0ltYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBuaWw7Ci19Ci0KIC0g
KE5TRGF0YSopX2ltYWdlVElGRlJlcHJlc2VudGF0aW9uCiB7CiAgICAgUmVuZGVyT2JqZWN0ICpy
ZW5kZXJlciA9IFtzZWxmIF9lbGVtZW50SW1wbF0tPnJlbmRlcmVyKCk7CkluZGV4OiBiaW5kaW5n
cy9vYmpjL0RPTVByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9vYmpjL0RPTVByaXZh
dGUuaAkocmV2aXNpb24gMTI5ODMpCisrKyBiaW5kaW5ncy9vYmpjL0RPTVByaXZhdGUuaAkod29y
a2luZyBjb3B5KQpAQCAtMzksNyArMzksNiBAQAogCiBAaW50ZXJmYWNlIERPTUVsZW1lbnQgKFdl
YlByaXZhdGUpCiAtIChOU0ZvbnQgKilfZm9udDsKLS0gKE5TSW1hZ2UgKilfaW1hZ2U7CiAtIChO
U0RhdGEgKilfaW1hZ2VUSUZGUmVwcmVzZW50YXRpb247CiAtIChOU1VSTCAqKV9nZXRVUkxBdHRy
aWJ1dGU6KE5TU3RyaW5nICopbmFtZTsKIEBlbmQKQEAgLTc2LDggKzc1LDggQEAKIC0gKHZvaWQp
X2FjdGl2YXRlSXRlbUF0SW5kZXg6KGludClpbmRleDsKIEBlbmQKIAotLy8gQkVHSU4gUEVORElO
RyBQVUJMSUMgV0VCIElOU1BFQ1RPUiBBUElTCi0vLyBUaGVzZSBBUElzIGFyZSBmb3IgdGhlIFdl
YiBJbnNwZWN0b3IsIGFuZCB0aGV5IHdpbGwgYmUgbWFkZSBwdWJsaWMgZXZlbnR1YWxseS4KKy8v
IEJFR0lOIFBFTkRJTkcgUFVCTElDIEFQSVMKKy8vIFRoZXNlIEFQSXMgd2lsbCBiZSBtYWRlIHB1
YmxpYyBldmVudHVhbGx5LgogQGludGVyZmFjZSBET01BdHRyIChET01BdHRyRXh0ZW5zaW9ucykK
IC0gKERPTUNTU1N0eWxlRGVjbGFyYXRpb24gKilzdHlsZTsKIEBlbmQKQEAgLTEwNywxMSArMTA2
LDMxIEBACiBAZW5kCiAKIEBpbnRlcmZhY2UgRE9NRWxlbWVudCAoRE9NRWxlbWVudEV4dGVuc2lv
bnMpCistIChOU0ltYWdlICopaW1hZ2U7CiAtICh2b2lkKWZvY3VzOwogLSAodm9pZClibHVyOwog
LSAodm9pZClzY3JvbGxJbnRvVmlldzooQk9PTClhbGlnblRvcDsKIC0gKHZvaWQpc2Nyb2xsSW50
b1ZpZXdJZk5lZWRlZDooQk9PTCljZW50ZXJJZk5lZWRlZDsKIEBlbmQKKworQGludGVyZmFjZSBE
T01IVE1MRWxlbWVudCAoRE9NSFRNTEVsZW1lbnRQZW5kaW5nUHVibGljKQorLSAoTlNTdHJpbmcg
Kil0aXRsZURpc3BsYXlTdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTElucHV0RWxl
bWVudCAoRE9NSFRNTElucHV0RWxlbWVudFBlbmRpbmdQdWJsaWMpCistIChOU1N0cmluZyAqKWFs
dERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29sdXRlSW1hZ2VVUkw7CitAZW5kCisKK0Bp
bnRlcmZhY2UgRE9NSFRNTEltYWdlRWxlbWVudCAoRE9NSFRNTEltYWdlRWxlbWVudFBlbmRpbmdQ
dWJsaWMpCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmc7CistIChOU1VSTCAqKWFic29s
dXRlSW1hZ2VVUkw7CitAZW5kCisKK0BpbnRlcmZhY2UgRE9NSFRNTE9iamVjdEVsZW1lbnQgKERP
TUhUTUxPYmplY3RFbGVtZW50UGVuZGluZ1B1YmxpYykKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFn
ZVVSTDsKK0BlbmQKKwogLy8gRU5ECiAKIC8vIFBlbmRpbmcgRE9NMyBBUElzCkluZGV4OiBiaW5k
aW5ncy9vYmpjL0RPTUhUTUwubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYmluZGluZ3Mvb2JqYy9ET01IVE1M
Lm1tCShyZXZpc2lvbiAxMjk4MykKKysrIGJpbmRpbmdzL29iamMvRE9NSFRNTC5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtNTgsNiArNTgsNyBAQAogCiAjaW1wb3J0ICJET01FeHRlbnNpb25zLmgiCiAj
aW1wb3J0ICJET01JbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NUHJpdmF0ZS5oIgogI2ltcG9ydCAi
RE9NSFRNTEludGVybmFsLmgiCiAjaW1wb3J0IDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CiAjaW1w
b3J0ICJGb3VuZGF0aW9uRXh0cmFzLmgiCkBAIC0yNTksNiArMjYwLDExIEBAIHVzaW5nIG5hbWVz
cGFjZSBET006OkhUTUxOYW1lczsKICAgICByZXR1cm4gW3NlbGYgX0hUTUxFbGVtZW50SW1wbF0t
PnRpdGxlKCk7CiB9CiAKKy0gKE5TU3RyaW5nICopdGl0bGVEaXNwbGF5U3RyaW5nCit7CisgICAg
cmV0dXJuIFtzZWxmIF9IVE1MRWxlbWVudEltcGxdLT50aXRsZSgpLnJlcGxhY2UoUUNoYXIoJ1xc
JyksIFtzZWxmIF9lbGVtZW50SW1wbF0tPmdldERvY3VtZW50KCktPmJhY2tzbGFzaEFzQ3VycmVu
Y3lTeW1ib2woKSk7Cit9CisKIC0gKHZvaWQpc2V0VGl0bGU6KE5TU3RyaW5nICopdGl0bGUKIHsK
ICAgICBbc2VsZiBfSFRNTEVsZW1lbnRJbXBsXS0+c2V0VGl0bGUodGl0bGUpOwpAQCAtMTI4MCw2
ICsxMjg2LDExIEBAIHVzaW5nIG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKICAgICByZXR1cm4g
W3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5hbHQoKTsKIH0KIAorLSAoTlNTdHJpbmcgKilhbHRE
aXNwbGF5U3RyaW5nCit7CisgICAgcmV0dXJuIFtzZWxmIF9pbnB1dEVsZW1lbnRJbXBsXS0+YWx0
KCkucmVwbGFjZShRQ2hhcignXFwnKSwgW3NlbGYgX2VsZW1lbnRJbXBsXS0+Z2V0RG9jdW1lbnQo
KS0+YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKK30KKwogLSAodm9pZClzZXRBbHQ6KE5T
U3RyaW5nICopYWx0CiB7CiAgICAgW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5zZXRBbHQoYWx0
KTsKQEAgLTEzNDUsNiArMTM1NiwxMyBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7
CiAgICAgW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5zZXRTaXplKHNpemUpOwogfQogCistIChO
U1VSTCAqKWFic29sdXRlSW1hZ2VVUkwKK3sKKyAgICBpZiAoIVtzZWxmIF9pbnB1dEVsZW1lbnRJ
bXBsXS0+cmVuZGVyZXIoKSB8fCAhW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5yZW5kZXJlcigp
LT5pc0ltYWdlKCkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgcmV0dXJuIFtzZWxmIF9nZXRV
UkxBdHRyaWJ1dGU6QCJzcmMiXTsKK30KKwogLSAoTlNTdHJpbmcgKilzcmMKIHsKICAgICByZXR1
cm4gW3NlbGYgX2lucHV0RWxlbWVudEltcGxdLT5zcmMoKTsKQEAgLTIxNjUsNiArMjE4MywxMSBA
QCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAgICAgW3NlbGYgX2FuY2hvckVsZW1l
bnRJbXBsXS0+c2V0QXR0cmlidXRlKGNvb3Jkc0F0dHIsIGNvb3Jkcyk7CiB9CiAKKy0gKE5TVVJM
ICopYWJzb2x1dGVMaW5rVVJMCit7CisgICAgcmV0dXJuIFtzZWxmIF9nZXRVUkxBdHRyaWJ1dGU6
QCJocmVmIl07Cit9CisKIC0gKE5TU3RyaW5nICopaHJlZgogewogICAgIHJldHVybiBbc2VsZiBf
YW5jaG9yRWxlbWVudEltcGxdLT5ocmVmKCk7CkBAIC0yMzAyLDYgKzIzMjUsMTIgQEAgdXNpbmcg
bmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAgIHJldHVybiBbc2VsZiBfaW1hZ2VFbGVtZW50
SW1wbF0tPmdldEF0dHJpYnV0ZShhbHRBdHRyKTsKIH0KIAorLSAoTlNTdHJpbmcgKilhbHREaXNw
bGF5U3RyaW5nCit7CisgICAgU3RyaW5nIGFsdCA9IFtzZWxmIF9pbWFnZUVsZW1lbnRJbXBsXS0+
Z2V0QXR0cmlidXRlKGFsdEF0dHIpOworICAgIHJldHVybiBhbHQucmVwbGFjZShRQ2hhcignXFwn
KSwgW3NlbGYgX2VsZW1lbnRJbXBsXS0+Z2V0RG9jdW1lbnQoKS0+YmFja3NsYXNoQXNDdXJyZW5j
eVN5bWJvbCgpKTsKK30KKwogLSAodm9pZClzZXRBbHQ6KE5TU3RyaW5nICopYWx0CiB7CiAgICAg
W3NlbGYgX2ltYWdlRWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUoYWx0QXR0ciwgYWx0KTsKQEAg
LTIzNTksNiArMjM4OCwxMSBAQCB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAgICAg
W3NlbGYgX2ltYWdlRWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUobG9uZ2Rlc2NBdHRyLCBsb25n
RGVzYyk7CiB9CiAKKy0gKE5TVVJMICopYWJzb2x1dGVJbWFnZVVSTAoreworICAgIHJldHVybiBb
c2VsZiBfZ2V0VVJMQXR0cmlidXRlOkAic3JjIl07Cit9CisKIC0gKE5TU3RyaW5nICopc3JjCiB7
CiAgICAgcmV0dXJuIFtzZWxmIF9pbWFnZUVsZW1lbnRJbXBsXS0+c3JjKCk7CkBAIC0yNDc1LDYg
KzI1MDksMTMgQEAgdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAgIFtzZWxmIF9v
YmplY3RFbGVtZW50SW1wbF0tPnNldEF0dHJpYnV0ZShjb2RldHlwZUF0dHIsIGNvZGVUeXBlKTsK
IH0KIAorLSAoTlNVUkwgKilhYnNvbHV0ZUltYWdlVVJMCit7CisgICAgaWYgKCFbc2VsZiBfb2Jq
ZWN0RWxlbWVudEltcGxdLT5yZW5kZXJlcigpIHx8ICFbc2VsZiBfb2JqZWN0RWxlbWVudEltcGxd
LT5yZW5kZXJlcigpLT5pc0ltYWdlKCkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgcmV0dXJu
IFtzZWxmIF9nZXRVUkxBdHRyaWJ1dGU6QCJkYXRhIl07Cit9CisKIC0gKE5TU3RyaW5nICopZGF0
YQogewogICAgIHJldHVybiBbc2VsZiBfb2JqZWN0RWxlbWVudEltcGxdLT5nZXRBdHRyaWJ1dGUo
ZGF0YUF0dHIpOwpAQCAtMjY2Niw2ICsyNzA3LDEyIEBAIHVzaW5nIG5hbWVzcGFjZSBET006OkhU
TUxOYW1lczsKICAgICByZXR1cm4gW3NlbGYgX2FwcGxldEVsZW1lbnRJbXBsXS0+Z2V0QXR0cmli
dXRlKGFsdEF0dHIpOwogfQogCistIChOU1N0cmluZyAqKWFsdERpc3BsYXlTdHJpbmcKK3sKKyAg
ICBTdHJpbmcgYWx0ID0gW3NlbGYgX2FwcGxldEVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFs
dEF0dHIpOworICAgIHJldHVybiBhbHQucmVwbGFjZShRQ2hhcignXFwnKSwgW3NlbGYgX2VsZW1l
bnRJbXBsXS0+Z2V0RG9jdW1lbnQoKS0+YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKK30K
KwogLSAodm9pZClzZXRBbHQ6KE5TU3RyaW5nICopYWx0CiB7CiAgICAgW3NlbGYgX2FwcGxldEVs
ZW1lbnRJbXBsXS0+c2V0QXR0cmlidXRlKGFsdEF0dHIsIGFsdCk7CkBAIC0yODEyLDYgKzI4NTks
MTIgQEAgdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwogICAgIHJldHVybiBbc2VsZiBf
YXJlYUVsZW1lbnRJbXBsXS0+Z2V0QXR0cmlidXRlKGFsdEF0dHIpOwogfQogCistIChOU1N0cmlu
ZyAqKWFsdERpc3BsYXlTdHJpbmcKK3sKKyAgICBTdHJpbmcgYWx0ID0gW3NlbGYgX2FyZWFFbGVt
ZW50SW1wbF0tPmdldEF0dHJpYnV0ZShhbHRBdHRyKTsKKyAgICByZXR1cm4gYWx0LnJlcGxhY2Uo
UUNoYXIoJ1xcJyksIFtzZWxmIF9lbGVtZW50SW1wbF0tPmdldERvY3VtZW50KCktPmJhY2tzbGFz
aEFzQ3VycmVuY3lTeW1ib2woKSk7Cit9CisKIC0gKHZvaWQpc2V0QWx0OihOU1N0cmluZyAqKWFs
dAogewogICAgIFtzZWxmIF9hcmVhRWxlbWVudEltcGxdLT5zZXRBdHRyaWJ1dGUoYWx0QXR0ciwg
YWx0KTsKSW5kZXg6IHJlbmRlcmluZy9yZW5kZXJfbGF5ZXIuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJl
bmRlcmluZy9yZW5kZXJfbGF5ZXIuY3BwCShyZXZpc2lvbiAxMjk4MykKKysrIHJlbmRlcmluZy9y
ZW5kZXJfbGF5ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIzLDcgKzExMjMsNyBAQCBSZW5k
ZXJMYXllcjo6aGl0VGVzdChSZW5kZXJPYmplY3Q6Ok5vZGVJCiAgICAgTm9kZUltcGwqIG5vZGUg
PSBpbmZvLmlubmVyTm9kZSgpOwogICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgIGlmIChub2Rl
LT5pc0xpbmsoKSAmJiAhaW5mby5VUkxFbGVtZW50KCkpCi0gICAgICAgICAgICBpbmZvLnNldFVS
TEVsZW1lbnQobm9kZSk7CisgICAgICAgICAgICBpbmZvLnNldFVSTEVsZW1lbnQoc3RhdGljX2Nh
c3Q8RWxlbWVudEltcGwqPihub2RlKSk7CiAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnROb2Rl
KCk7CiAgICAgfQogCkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX29iamVjdC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIHJlbmRlcmluZy9yZW5kZXJfb2JqZWN0LmgJKHJldmlzaW9uIDEyOTgzKQorKysgcmVuZGVy
aW5nL3JlbmRlcl9vYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtNDkwLDcgKzQ5MCw3IEBAIHB1
YmxpYzoKIAogICAgICAgICBET006Ok5vZGVJbXBsKiBpbm5lck5vZGUoKSBjb25zdCB7IHJldHVy
biBtX2lubmVyTm9kZTsgfQogICAgICAgICBET006Ok5vZGVJbXBsKiBpbm5lck5vblNoYXJlZE5v
ZGUoKSBjb25zdCB7IHJldHVybiBtX2lubmVyTm9uU2hhcmVkTm9kZTsgfQotICAgICAgICBET006
Ok5vZGVJbXBsKiBVUkxFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9pbm5lclVSTEVsZW1lbnQ7
IH0KKyAgICAgICAgRE9NOjpFbGVtZW50SW1wbCogVVJMRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJu
IG1faW5uZXJVUkxFbGVtZW50OyB9CiAgICAgICAgIGJvb2wgcmVhZG9ubHkoKSBjb25zdCB7IHJl
dHVybiBtX3JlYWRvbmx5OyB9CiAgICAgICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4g
bV9hY3RpdmU7IH0KICAgICAgICAgYm9vbCBtb3VzZU1vdmUoKSBjb25zdCB7IHJldHVybiBtX21v
dXNlTW92ZTsgfQpAQCAtNDk4LDExICs0OTgsMTEgQEAgcHVibGljOgogICAgIHByaXZhdGU6CiAg
ICAgICAgIHZvaWQgc2V0SW5uZXJOb2RlKERPTTo6Tm9kZUltcGwqIG4pIHsgbV9pbm5lck5vZGUg
PSBuOyB9CiAgICAgICAgIHZvaWQgc2V0SW5uZXJOb25TaGFyZWROb2RlKERPTTo6Tm9kZUltcGwq
IG4pIHsgbV9pbm5lck5vblNoYXJlZE5vZGUgPSBuOyB9Ci0gICAgICAgIHZvaWQgc2V0VVJMRWxl
bWVudChET006Ok5vZGVJbXBsKiBuKSB7IG1faW5uZXJVUkxFbGVtZW50ID0gbjsgfQorICAgICAg
ICB2b2lkIHNldFVSTEVsZW1lbnQoRE9NOjpFbGVtZW50SW1wbCogbikgeyBtX2lubmVyVVJMRWxl
bWVudCA9IG47IH0KIAogICAgICAgICBET006Ok5vZGVJbXBsKiBtX2lubmVyTm9kZTsKICAgICAg
ICAgRE9NOjpOb2RlSW1wbCogbV9pbm5lck5vblNoYXJlZE5vZGU7Ci0gICAgICAgIERPTTo6Tm9k
ZUltcGwqIG1faW5uZXJVUkxFbGVtZW50OworICAgICAgICBET006OkVsZW1lbnRJbXBsKiBtX2lu
bmVyVVJMRWxlbWVudDsKICAgICAgICAgYm9vbCBtX3JlYWRvbmx5OwogICAgICAgICBib29sIG1f
YWN0aXZlOwogICAgICAgICBib29sIG1fbW91c2VNb3ZlOwpJbmRleDogZG9tL0RvY3VtZW50SW1w
bC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGRvbS9Eb2N1bWVudEltcGwuaAkocmV2aXNpb24gMTI5ODMpCisr
KyBkb20vRG9jdW1lbnRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTY3Niw2ICs2NzYsOCBAQCBw
dWJsaWM6CiAgICAgdm9pZCBzZXREZWNvZGVyKERlY29kZXIqKTsKICAgICBEZWNvZGVyKiBkZWNv
ZGVyKCkgY29uc3QgeyByZXR1cm4gbV9kZWNvZGVyLmdldCgpOyB9CiAKKyAgICBRQ2hhciBiYWNr
c2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkgY29uc3Q7CisKICNpZiBfX0FQUExFX18KICAgICB2b2lk
IHNldERhc2hib2FyZFJlZ2lvbnNEaXJ0eShib29sIGYpIHsgbV9kYXNoYm9hcmRSZWdpb25zRGly
dHkgPSBmOyB9CiAgICAgYm9vbCBkYXNoYm9hcmRSZWdpb25zRGlydHkoKSBjb25zdCB7IHJldHVy
biBtX2Rhc2hib2FyZFJlZ2lvbnNEaXJ0eTsgfQpJbmRleDogZG9tL0RvY3VtZW50SW1wbC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gZG9tL0RvY3VtZW50SW1wbC5jcHAJKHJldmlzaW9uIDEyOTgzKQorKysg
ZG9tL0RvY3VtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY4LDYgKzY4LDcgQEAKICNp
bmNsdWRlICJ2aXNpYmxlX3RleHQuaCIKICNpbmNsdWRlICJ4bWxfdG9rZW5pemVyLmgiCiAjaW5j
bHVkZSA8cXJlZ2V4cC5oPgorI2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KIAogLy8gRklYTUU6IFdl
IHdhbnQgdG8gY3V0IHRoZSByZW1haW5pbmcgSFRNTCBkZXBlbmRlbmNpZXMgc28gdGhhdCB3ZSBk
b24ndCBuZWVkIHRvIGluY2x1ZGUgdGhlc2UgZmlsZXMuCiAjaW5jbHVkZSAiSFRNTElucHV0RWxl
bWVudEltcGwuaCIKQEAgLTE2NDcsOCArMTY0OCw3IEBAIE1vdXNlRXZlbnRXaXRoSGl0VGVzdFJl
c3VsdHMgRG9jdW1lbnRJbXAKICAgICBTdHJpbmcgaHJlZjsKICAgICBTdHJpbmcgdGFyZ2V0Owog
ICAgIGlmIChyZW5kZXJJbmZvLlVSTEVsZW1lbnQoKSkgewotICAgICAgICBhc3NlcnQocmVuZGVy
SW5mby5VUkxFbGVtZW50KCktPmlzRWxlbWVudE5vZGUoKSk7Ci0gICAgICAgIEVsZW1lbnRJbXBs
KiBlID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwqPihyZW5kZXJJbmZvLlVSTEVsZW1lbnQoKSk7
CisgICAgICAgIEVsZW1lbnRJbXBsKiBlID0gcmVuZGVySW5mby5VUkxFbGVtZW50KCk7CiAgICAg
ICAgIGhyZWYgPSBwYXJzZVVSTChlLT5nZXRBdHRyaWJ1dGUoaHJlZkF0dHIpKTsKICAgICAgICAg
aWYgKCFocmVmLmlzTnVsbCgpKQogICAgICAgICAgICAgdGFyZ2V0ID0gZS0+Z2V0QXR0cmlidXRl
KHRhcmdldEF0dHIpOwpAQCAtMjQ5NSw2ICsyNDk1LDE3IEBAIHZvaWQgRG9jdW1lbnRJbXBsOjpz
ZXREZWNvZGVyKERlY29kZXIgKmQKICAgICBtX2RlY29kZXIgPSBkZWNvZGVyOwogfQogCitRQ2hh
ciBEb2N1bWVudEltcGw6OmJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSBjb25zdAoreworICAg
IGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gJ1xcJzsKKyAgICBjb25zdCBRVGV4dENv
ZGVjICpjb2RlYyA9IG1fZGVjb2Rlci0+Y29kZWMoKTsKKyAgICBpZiAoIWNvZGVjKQorICAgICAg
ICByZXR1cm4gJ1xcJzsKKworICAgIHJldHVybiBjb2RlYy0+YmFja3NsYXNoQXNDdXJyZW5jeVN5
bWJvbCgpOworfQorCiBRU3RyaW5nIERvY3VtZW50SW1wbDo6Y29tcGxldGVVUkwoY29uc3QgUVN0
cmluZyAmVVJMKQogewogICAgIHJldHVybiBLVVJMKGJhc2VVUkwoKSwgVVJMLCBtX2RlY29kZXIg
PyBtX2RlY29kZXItPmNvZGVjKCkgOiAwKS51cmwoKTsKSW5kZXg6IFdlYkNvcmUuZXhwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUuZXhwCShyZXZpc2lvbiAxMjk4MykKKysrIFdlYkNvcmUuZXhwCSh3
b3JraW5nIGNvcHkpCkBAIC0xMjAsMTcgKzEyMCw2IEBACiAub2JqY19jbGFzc19uYW1lX1dlYkNv
cmVUZXh0UmVuZGVyZXJGYWN0b3J5CiAub2JqY19jbGFzc19uYW1lX1dlYkNvcmVWaWV3RmFjdG9y
eQogLm9iamNfY2xhc3NfbmFtZV9XZWJEYXNoYm9hcmRSZWdpb24KLV9XZWJDb3JlRWxlbWVudERP
TU5vZGVLZXkKLV9XZWJDb3JlRWxlbWVudEZyYW1lS2V5Ci1fV2ViQ29yZUVsZW1lbnRJbWFnZUFs
dFN0cmluZ0tleQotX1dlYkNvcmVFbGVtZW50SW1hZ2VSZWN0S2V5Ci1fV2ViQ29yZUVsZW1lbnRJ
bWFnZVVSTEtleQotX1dlYkNvcmVFbGVtZW50SXNTZWxlY3RlZEtleQotX1dlYkNvcmVFbGVtZW50
TGlua0xhYmVsS2V5Ci1fV2ViQ29yZUVsZW1lbnRMaW5rVGFyZ2V0RnJhbWVLZXkKLV9XZWJDb3Jl
RWxlbWVudExpbmtUaXRsZUtleQotX1dlYkNvcmVFbGVtZW50TGlua1VSTEtleQotX1dlYkNvcmVF
bGVtZW50VGl0bGVLZXkKIF9XZWJDb3JlSW5pdGlhbGl6ZUVtcHR5VGV4dEdlb21ldHJ5CiBfV2Vi
Q29yZUluaXRpYWxpemVFbXB0eVRleHRTdHlsZQogX1dlYkNvcmVJbml0aWFsaXplRm9udApJbmRl
eDogYnJpZGdlL21hYy9XZWJDb3JlRnJhbWVCcmlkZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBicmlkZ2Uv
bWFjL1dlYkNvcmVGcmFtZUJyaWRnZS5oCShyZXZpc2lvbiAxMjk4MykKKysrIGJyaWRnZS9tYWMv
V2ViQ29yZUZyYW1lQnJpZGdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTY5LDE4ICs2OSw2IEBAIHR5
cGVkZWYgV2ViQ29yZTo6UmVuZGVyUGFydCBXZWJDb3JlUmVuZGUKIEBwcm90b2NvbCBXZWJDb3Jl
RmlsZUJ1dHRvbjsKIEBwcm90b2NvbCBXZWJDb3JlRmlsZUJ1dHRvbkRlbGVnYXRlOwogCi1leHRl
cm4gTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50RE9NTm9kZUtleTsKLWV4dGVybiBOU1N0cmluZyAq
V2ViQ29yZUVsZW1lbnRGcmFtZUtleTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRJ
bWFnZUFsdFN0cmluZ0tleTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRJbWFnZVJl
Y3RLZXk7Ci1leHRlcm4gTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50SW1hZ2VVUkxLZXk7Ci1leHRl
cm4gTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50SXNTZWxlY3RlZEtleTsKLWV4dGVybiBOU1N0cmlu
ZyAqV2ViQ29yZUVsZW1lbnRMaW5rVVJMS2V5OwotZXh0ZXJuIE5TU3RyaW5nICpXZWJDb3JlRWxl
bWVudExpbmtUYXJnZXRGcmFtZUtleTsKLWV4dGVybiBOU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRM
aW5rTGFiZWxLZXk7Ci1leHRlcm4gTlNTdHJpbmcgKldlYkNvcmVFbGVtZW50TGlua1RpdGxlS2V5
OwotZXh0ZXJuIE5TU3RyaW5nICpXZWJDb3JlRWxlbWVudFRpdGxlS2V5OwotCiBleHRlcm4gTlNT
dHJpbmcgKldlYkNvcmVQYWdlQ2FjaGVTdGF0ZUtleTsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTMw
Miw3ICsyOTAsOSBAQCB0eXBlZGVmIGVudW0gewogLSAoTlNPYmplY3QgKiljb3B5UmVuZGVyVHJl
ZTooaWQgPFdlYkNvcmVSZW5kZXJUcmVlQ29waWVyPiljb3BpZXI7CiAtIChOU1N0cmluZyAqKXJl
bmRlclRyZWVBc0V4dGVybmFsUmVwcmVzZW50YXRpb247CiAKLS0gKE5TRGljdGlvbmFyeSAqKWVs
ZW1lbnRBdFBvaW50OihOU1BvaW50KXBvaW50OworLSAodm9pZClnZXRJbm5lck5vblNoYXJlZE5v
ZGU6KERPTU5vZGUgKiopaW5uZXJOb25TaGFyZWROb2RlIGlubmVyTm9kZTooRE9NTm9kZSAqKilp
bm5lck5vZGUgVVJMRWxlbWVudDooRE9NRWxlbWVudCAqKilVUkxFbGVtZW50IGF0UG9pbnQ6KE5T
UG9pbnQpcG9pbnQ7CistIChCT09MKWlzUG9pbnRJbnNpZGVTZWxlY3Rpb246KE5TUG9pbnQpcG9p
bnQ7CisKIC0gKE5TVVJMICopVVJMV2l0aEF0dHJpYnV0ZVN0cmluZzooTlNTdHJpbmcgKilzdHJp
bmc7CiAKIC0gKERPTUVsZW1lbnQgKillbGVtZW50V2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBp
bkZvcm06KERPTUVsZW1lbnQgKilmb3JtOwpJbmRleDogYnJpZGdlL21hYy9XZWJDb3JlRnJhbWVC
cmlkZ2UubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gYnJpZGdlL21hYy9XZWJDb3JlRnJhbWVCcmlkZ2UubW0J
KHJldmlzaW9uIDEyOTgzKQorKysgYnJpZGdlL21hYy9XZWJDb3JlRnJhbWVCcmlkZ2UubW0JKHdv
cmtpbmcgY29weSkKQEAgLTEyMiwxOSArMTIyLDYgQEAgdXNpbmcgS0pTOjpCaW5kaW5nczo6Um9v
dE9iamVjdDsKIAogdXNpbmcgV2ViQ29yZTo6UmVuZGVyT2JqZWN0OwogCi1OU1N0cmluZyAqV2Vi
Q29yZUVsZW1lbnRET01Ob2RlS2V5ID0gICAgICAgICAgICBAIldlYkVsZW1lbnRET01Ob2RlIjsK
LU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudEZyYW1lS2V5ID0gICAgICAgICAgICAgIEAiV2ViRWxl
bWVudEZyYW1lIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudEltYWdlQWx0U3RyaW5nS2V5ID0g
ICAgIEAiV2ViRWxlbWVudEltYWdlQWx0U3RyaW5nIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVu
dEltYWdlUmVjdEtleSA9ICAgICAgICAgIEAiV2ViRWxlbWVudEltYWdlUmVjdCI7Ci1OU1N0cmlu
ZyAqV2ViQ29yZUVsZW1lbnRJbWFnZVVSTEtleSA9ICAgICAgICAgICBAIldlYkVsZW1lbnRJbWFn
ZVVSTCI7Ci1OU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRJc1NlbGVjdGVkS2V5ID0gICAgICAgICBA
IldlYkVsZW1lbnRJc1NlbGVjdGVkIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudExpbmtVUkxL
ZXkgPSAgICAgICAgICAgIEAiV2ViRWxlbWVudExpbmtVUkwiOwotTlNTdHJpbmcgKldlYkNvcmVF
bGVtZW50TGlua1RhcmdldEZyYW1lS2V5ID0gICAgQCJXZWJFbGVtZW50VGFyZ2V0RnJhbWUiOwot
TlNTdHJpbmcgKldlYkNvcmVFbGVtZW50TGlua0xhYmVsS2V5ID0gICAgICAgICAgQCJXZWJFbGVt
ZW50TGlua0xhYmVsIjsKLU5TU3RyaW5nICpXZWJDb3JlRWxlbWVudExpbmtUaXRsZUtleSA9ICAg
ICAgICAgIEAiV2ViRWxlbWVudExpbmtUaXRsZSI7Ci1OU1N0cmluZyAqV2ViQ29yZUVsZW1lbnRO
YW1lS2V5ID0gICAgICAgICAgICAgICBAIldlYkVsZW1lbnROYW1lIjsKLU5TU3RyaW5nICpXZWJD
b3JlRWxlbWVudFRpdGxlS2V5ID0gICAgICAgICAgICAgIEAiV2ViQ29yZUVsZW1lbnRUaXRsZSI7
IC8vIG5vdCBpbiBXZWJLaXQgQVBJIGZvciBub3csIGNvdWxkIGJlIGluIEFQSSBzb21lIGRheQot
CiBOU1N0cmluZyAqV2ViQ29yZVBhZ2VDYWNoZVN0YXRlS2V5ID0gICAgICAgICAgICBAIldlYkNv
cmVQYWdlQ2FjaGVTdGF0ZSI7CiAKIEBpbnRlcmZhY2UgV2ViQ29yZUZyYW1lQnJpZGdlIChXZWJD
b3JlQnJpZGdlSW50ZXJuYWwpCkBAIC0xMjgwLDEwNyArMTI2NywyMSBAQCBzdGF0aWMgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZm9ybUVsZW1lbnRGCiAgICAgcmV0dXJuIG1fZnJhbWUtPm1hdGNoTGFi
ZWxzQWdhaW5zdEVsZW1lbnQobGFiZWxzLCBbZWxlbWVudCBfZWxlbWVudEltcGxdKTsKIH0KIAot
LSAoTlNEaWN0aW9uYXJ5ICopZWxlbWVudEF0UG9pbnQ6KE5TUG9pbnQpcG9pbnQKKy0gKHZvaWQp
Z2V0SW5uZXJOb25TaGFyZWROb2RlOihET01Ob2RlICoqKWlubmVyTm9uU2hhcmVkTm9kZSBpbm5l
ck5vZGU6KERPTU5vZGUgKiopaW5uZXJOb2RlIFVSTEVsZW1lbnQ6KERPTUVsZW1lbnQgKiopVVJM
RWxlbWVudCBhdFBvaW50OihOU1BvaW50KXBvaW50CiB7CiAgICAgUmVuZGVyT2JqZWN0ICpyZW5k
ZXJlciA9IG1fZnJhbWUtPnJlbmRlcmVyKCk7CiAgICAgaWYgKCFyZW5kZXJlcikgCi0gICAgICAg
IHJldHVybiBuaWw7Ci0gICAgCi0gICAgUmVuZGVyT2JqZWN0OjpOb2RlSW5mbyBub2RlSW5mbyA9
IFtzZWxmIG5vZGVJbmZvQXRQb2ludDpwb2ludF07Ci0gICAgCi0gICAgTlNNdXRhYmxlRGljdGlv
bmFyeSAqZWxlbWVudCA9IFtOU011dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICAgIFtl
bGVtZW50IHNldE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6bV9mcmFtZS0+aXNQb2lu
dEluc2lkZVNlbGVjdGlvbigoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSldCi0gICAgICAgICAg
ICAgICAgZm9yS2V5OldlYkNvcmVFbGVtZW50SXNTZWxlY3RlZEtleV07Ci0KLSAgICAvLyBGaW5k
IHRoZSB0aXRsZSBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgRE9NIG5vZGUuCi0gICAgLy8gRm9y
IDxhcmVhPiB0YWdzIGluIGltYWdlIG1hcHMsIHdhbGsgdGhlIHRyZWUgZm9yIHRoZSA8YXJlYT4s
IG5vdCB0aGUgPGltZz4gdXNpbmcgaXQuCi0gICAgZm9yIChOb2RlSW1wbCAqdGl0bGVOb2RlID0g
bm9kZUluZm8uaW5uZXJOb2RlKCk7IHRpdGxlTm9kZTsgdGl0bGVOb2RlID0gdGl0bGVOb2RlLT5w
YXJlbnROb2RlKCkpIHsKLSAgICAgICAgaWYgKHRpdGxlTm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7
Ci0gICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHRpdGxlID0gc3RhdGljX2Nhc3Q8RWxl
bWVudEltcGwgKj4odGl0bGVOb2RlKS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgICAg
ICAgICBpZiAoIXRpdGxlLmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQg
YSBub2RlIHdpdGggYSB0aXRsZS4KLSAgICAgICAgICAgICAgICBRU3RyaW5nIHRpdGxlVGV4dCA9
IHRpdGxlLnFzdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB0aXRsZVRleHQucmVwbGFjZShRQ2hh
cignXFwnKSwgbV9mcmFtZS0+YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKLSAgICAgICAg
ICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6dGl0bGVUZXh0LmdldE5TU3RyaW5nKCkgZm9yS2V5
OldlYkNvcmVFbGVtZW50VGl0bGVLZXldOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTm9kZUltcGwgKlVSTE5vZGUgPSBub2Rl
SW5mby5VUkxFbGVtZW50KCk7Ci0gICAgaWYgKFVSTE5vZGUpIHsKLSAgICAgICAgRWxlbWVudElt
cGwgKmUgPSBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihVUkxOb2RlKTsKLSAgICAgICAgRG9j
dW1lbnRJbXBsICpkb2MgPSBlLT5nZXREb2N1bWVudCgpOwotICAgICAgICBBU1NFUlQoZG9jKTsK
LSAgICAgICAgCi0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdGl0bGUgPSBlLT5nZXRBdHRy
aWJ1dGUodGl0bGVBdHRyKTsKLSAgICAgICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgIFFTdHJpbmcgdGl0bGVUZXh0ID0gdGl0bGUucXN0cmluZygpOwotICAgICAgICAgICAg
dGl0bGVUZXh0LnJlcGxhY2UoUUNoYXIoJ1xcJyksIG1fZnJhbWUtPmJhY2tzbGFzaEFzQ3VycmVu
Y3lTeW1ib2woKSk7Ci0gICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6dGl0bGVUZXh0Lmdl
dE5TU3RyaW5nKCkgZm9yS2V5OldlYkNvcmVFbGVtZW50TGlua1RpdGxlS2V5XTsKLSAgICAgICAg
fQotICAgICAgICAKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsaW5rID0gZS0+Z2V0QXR0
cmlidXRlKGhyZWZBdHRyKTsKLSAgICAgICAgaWYgKCFsaW5rLmlzTnVsbCgpKSB7Ci0gICAgICAg
ICAgICBRU3RyaW5nIHQgPSBwbGFpblRleHQocmFuZ2VPZkNvbnRlbnRzKGUpLmdldCgpKTsKLSAg
ICAgICAgICAgIGlmICghdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBbZWxlbWVudCBz
ZXRPYmplY3Q6dC5nZXROU1N0cmluZygpIGZvcktleTpXZWJDb3JlRWxlbWVudExpbmtMYWJlbEtl
eV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRU3RyaW5nIFVSTFN0cmluZyA9IHBhcnNl
VVJMKGxpbmspLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIFtlbGVtZW50IHNldE9iamVjdDpkb2Mt
PmNvbXBsZXRlVVJMKFVSTFN0cmluZykuZ2V0TlNTdHJpbmcoKSBmb3JLZXk6V2ViQ29yZUVsZW1l
bnRMaW5rVVJMS2V5XTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRE9NU3RyaW5nIHRh
cmdldCA9IGUtPmdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsKLSAgICAgICAgaWYgKHRhcmdldC5p
c0VtcHR5KCkgJiYgZG9jKSB7IC8vIEZJWE1FOiBUYWtlIG91dCB0aGlzIGRvYyBjaGVjayB3aGVu
IHdlJ3JlIG5vdCBqdXN0IGJlZm9yZSBhIHJlbGVhc2UuCi0gICAgICAgICAgICB0YXJnZXQgPSBk
b2MtPmJhc2VUYXJnZXQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXRhcmdldC5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgIFtlbGVtZW50IHNldE9iamVjdDp0YXJnZXQucXN0cmluZygpLmdl
dE5TU3RyaW5nKCkgZm9yS2V5OldlYkNvcmVFbGVtZW50TGlua1RhcmdldEZyYW1lS2V5XTsKLSAg
ICAgICAgfQotICAgIH0KKyAgICAgICAgcmV0dXJuOwogCi0gICAgTm9kZUltcGwgKm5vZGUgPSBu
b2RlSW5mby5pbm5lck5vblNoYXJlZE5vZGUoKTsKLSAgICBpZiAobm9kZSkgewotICAgICAgICBb
ZWxlbWVudCBzZXRPYmplY3Q6W0RPTU5vZGUgX25vZGVXaXRoSW1wbDpub2RlXSBmb3JLZXk6V2Vi
Q29yZUVsZW1lbnRET01Ob2RlS2V5XTsKLSAgICAKLSAgICAgICAgLy8gT25seSByZXR1cm4gaW1h
Z2UgaW5mb3JtYXRpb24gaWYgdGhlcmUgaXMgYW4gaW1hZ2UuCi0gICAgICAgIGlmIChub2RlLT5y
ZW5kZXJlcigpICYmIG5vZGUtPnJlbmRlcmVyKCktPmlzSW1hZ2UoKSkgewotICAgICAgICAgICAg
UmVuZGVySW1hZ2UgKnIgPSBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSAqPihub2RlLT5yZW5kZXJl
cigpKTsKLSAgICAgICAgICAgIGludCB4LCB5OwotICAgICAgICAgICAgaWYgKHItPmFic29sdXRl
UG9zaXRpb24oeCwgeSkpIHsKLSAgICAgICAgICAgICAgICBOU1ZhbHVlICpyZWN0ID0gW05TVmFs
dWUgdmFsdWVXaXRoUmVjdDpOU01ha2VSZWN0KHgsIHksIHItPmNvbnRlbnRXaWR0aCgpLCByLT5j
b250ZW50SGVpZ2h0KCkpXTsKLSAgICAgICAgICAgICAgICBbZWxlbWVudCBzZXRPYmplY3Q6cmVj
dCBmb3JLZXk6V2ViQ29yZUVsZW1lbnRJbWFnZVJlY3RLZXldOwotICAgICAgICAgICAgfQorICAg
IFJlbmRlck9iamVjdDo6Tm9kZUluZm8gbm9kZUluZm8gPSBbc2VsZiBub2RlSW5mb0F0UG9pbnQ6
cG9pbnRdOworICAgICppbm5lck5vblNoYXJlZE5vZGUgPSBbRE9NTm9kZSBfbm9kZVdpdGhJbXBs
Om5vZGVJbmZvLmlubmVyTm9uU2hhcmVkTm9kZSgpXTsKKyAgICAqaW5uZXJOb2RlID0gW0RPTU5v
ZGUgX25vZGVXaXRoSW1wbDpub2RlSW5mby5pbm5lck5vZGUoKV07CisgICAgKlVSTEVsZW1lbnQg
PSBbRE9NRWxlbWVudCBfZWxlbWVudFdpdGhJbXBsOm5vZGVJbmZvLlVSTEVsZW1lbnQoKV07Cit9
CiAKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsICppID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwq
Pihub2RlKTsKLSAgICAKLSAgICAgICAgICAgIC8vIEZJWE1FOiBDb2RlIGNvcGllZCBmcm9tIFJl
bmRlckltYWdlOjp1cGRhdGVGcm9tRWxlbWVudDsgc2hvdWxkIHNoYXJlLgotICAgICAgICAgICAg
RE9NU3RyaW5nIGF0dHI7Ci0gICAgICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShvYmplY3RUYWcp
KSB7Ci0gICAgICAgICAgICAgICAgYXR0ciA9IGktPmdldEF0dHJpYnV0ZShkYXRhQXR0cik7Ci0g
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF0dHIgPSBpLT5nZXRBdHRyaWJ1
dGUoc3JjQXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWF0dHIuaXNFbXB0
eSgpKSB7Ci0gICAgICAgICAgICAgICAgUVN0cmluZyBVUkxTdHJpbmcgPSBwYXJzZVVSTChhdHRy
KS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgW2VsZW1lbnQgc2V0T2JqZWN0OmktPmdldERv
Y3VtZW50KCktPmNvbXBsZXRlVVJMKFVSTFN0cmluZykuZ2V0TlNTdHJpbmcoKSBmb3JLZXk6V2Vi
Q29yZUVsZW1lbnRJbWFnZVVSTEtleV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAg
ICAgICAgICAgIC8vIEZJWE1FOiBDb2RlIGNvcGllZCBmcm9tIFJlbmRlckltYWdlOjp1cGRhdGVG
cm9tRWxlbWVudDsgc2hvdWxkIHNoYXJlLgotICAgICAgICAgICAgRE9NU3RyaW5nIGFsdDsKLSAg
ICAgICAgICAgIGlmIChpLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkKLSAgICAgICAgICAgICAgICBh
bHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCAqPihpKS0+YWx0VGV4dCgpOwot
ICAgICAgICAgICAgZWxzZSBpZiAoaS0+aGFzVGFnTmFtZShpbWdUYWcpKQotICAgICAgICAgICAg
ICAgIGFsdCA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1lbnRJbXBsICo+KGkpLT5hbHRUZXh0
KCk7Ci0gICAgICAgICAgICBpZiAoIWFsdC5pc051bGwoKSkgewotICAgICAgICAgICAgICAgIFFT
dHJpbmcgYWx0VGV4dCA9IGFsdC5xc3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYWx0VGV4dC5y
ZXBsYWNlKFFDaGFyKCdcXCcpLCBtX2ZyYW1lLT5iYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkp
OwotICAgICAgICAgICAgICAgIFtlbGVtZW50IHNldE9iamVjdDphbHRUZXh0LmdldE5TU3RyaW5n
KCkgZm9yS2V5OldlYkNvcmVFbGVtZW50SW1hZ2VBbHRTdHJpbmdLZXldOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBlbGVtZW50OworLSAoQk9PTClp
c1BvaW50SW5zaWRlU2VsZWN0aW9uOihOU1BvaW50KXBvaW50Cit7CisgICAgcmV0dXJuIG1fZnJh
bWUtPmlzUG9pbnRJbnNpZGVTZWxlY3Rpb24oKGludClwb2ludC54LCAoaW50KXBvaW50LnkpOwog
fQogCiAtIChOU1VSTCAqKVVSTFdpdGhBdHRyaWJ1dGVTdHJpbmc6KE5TU3RyaW5nICopc3RyaW5n
CkluZGV4OiBXZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTI5ODMpCisrKyBXZWJL
aXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjk1LDYgKzI5
NSw4IEBACiAJCTkzOTgxMTJFMDgyNEJGMDEwMDhERjAzOCAvKiBsaWJpY3Vjb3JlLmR5bGliIGlu
IEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTNENjIzREQw
NTFFNzkxRjAwMkY0N0REIC8qIGxpYmljdWNvcmUuZHlsaWIgKi87IH07CiAJCTkzOTgxMTJGMDgy
NEJGMDEwMDhERjAzOCAvKiBTZWN1cml0eS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4MzBFODFFMDA1ODUzQUMwMDBBRDA4OTEgLyog
U2VjdXJpdHkuZnJhbWV3b3JrICovOyB9OwogCQlBQkRERjIwRDA4RUIwRERDMDAxRTEyNDEgLyog
V2ViRG93bmxvYWRJbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQUJEREYyMEMwOEVCMEREQzAwMUUxMjQxIC8qIFdlYkRvd25sb2FkSW50ZXJu
YWwuaCAqLzsgfTsKKwkJREQ4OTY4MjAwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0
aW9uYXJ5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBE
RDg5NjgxRTA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkuaCAqLzsgfTsK
KwkJREQ4OTY4MjEwOUFBODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5Lm0gaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBERDg5NjgxRjA5QUE4
NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkubSAqLzsgfTsKIAkJRUQ2QkUyRTcw
ODhDMzJCNTAwNDRERURDIC8qIFdlYk5TQXR0cmlidXRlZFN0cmluZ0V4dHJhcy5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRUQ2QkUyRTUwODhDMzJCNTAw
NDRERURDIC8qIFdlYk5TQXR0cmlidXRlZFN0cmluZ0V4dHJhcy5oICovOyB9OwogCQlFRDZCRTJF
ODA4OEMzMkI1MDA0NERFREMgLyogV2ViTlNBdHRyaWJ1dGVkU3RyaW5nRXh0cmFzLm0gaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFRDZCRTJFNjA4OEMzMkI1
MDA0NERFREMgLyogV2ViTlNBdHRyaWJ1dGVkU3RyaW5nRXh0cmFzLm0gKi87IH07CiAJCUVEN0Y2
RDhCMDk4MDY4MzUwMEMyMzVFRCAvKiBXZWJOU0RhdGFFeHRyYXNQcml2YXRlLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFRDdGNkQ4QTA5ODA2ODM1MDBD
MjM1RUQgLyogV2ViTlNEYXRhRXh0cmFzUHJpdmF0ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC01NTMsNiArNTU1LDggQEAKIAkJQkVFMThGOUEw
NDcyQjczMjAwQ0EyODlDIC8qIFdlYkxvY2FsaXphYmxlU3RyaW5ncy5tICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBXZWJMb2NhbGl6YWJsZVN0
cmluZ3MubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9
IDA7IH07CiAJCUJFRTUyRDRBMDQ3MzAzMjUwMENBMjg5QyAvKiBXZWJLaXRTeXN0ZW1CaXRzLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lk
dGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2ViS2l0
U3lzdGVtQml0cy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNU
YWJzID0gMDsgfTsKIAkJQkVFNTJENEIwNDczMDMyNTAwQ0EyODlDIC8qIFdlYktpdFN5c3RlbUJp
dHMubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBpbmRl
bnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGgg
PSBXZWJLaXRTeXN0ZW1CaXRzLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0g
ODsgdXNlc1RhYnMgPSAwOyB9OworCQlERDg5NjgxRTA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxl
bWVudERpY3Rpb25hcnkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBXZWJFbGVtZW50RGljdGlvbmFyeS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKKwkJREQ4OTY4MUYwOUFBODcyNDAwOTdF
N0YwIC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gV2ViRWxlbWVudERpY3Rpb25hcnkubTsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUVEMjFC
OTgxMDUyOEY3QUEwMDMyOTlBQyAvKiBXZWJEb2N1bWVudEludGVybmFsLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2ViRG9jdW1lbnRJbnRlcm5h
bC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsg
fTsKIAkJRUQyQjI0NzQwMzNBMkRBODAwQzFBNTI2IC8qIFdlYk5TUGFzdGVib2FyZEV4dHJhcy5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdp
ZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdlYk5T
UGFzdGVib2FyZEV4dHJhcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7
IHVzZXNUYWJzID0gMDsgfTsKIAkJRUQyQjI0NzUwMzNBMkRBODAwQzFBNTI2IC8qIFdlYk5TUGFz
dGVib2FyZEV4dHJhcy5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
b2JqYzsgcGF0aCA9IFdlYk5TUGFzdGVib2FyZEV4dHJhcy5tOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKQEAgLTgwMSw2ICs4MDUsOCBAQAog
CQkJCUY1OTY2OEM5MDJBRDI5MjMwMTg2MzVDQSAvKiBXZWJTdHJpbmdUcnVuY2F0b3IubSAqLywK
IAkJCQk2NTc4RjVERTA0NUY4MTc0MDAwMDAxMjggLyogV2ViRG93bmxvYWQuaCAqLywKIAkJCQk2
NTc4RjVERjA0NUY4MTc0MDAwMDAxMjggLyogV2ViRG93bmxvYWQubSAqLywKKwkJCQlERDg5Njgx
RTA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkuaCAqLywKKwkJCQlERDg5
NjgxRjA5QUE4NzI0MDA5N0U3RjAgLyogV2ViRWxlbWVudERpY3Rpb25hcnkubSAqLywKIAkJCSk7
CiAJCQlwYXRoID0gTWlzYzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC0xMzEyLDYg
KzEzMTgsNyBAQAogCQkJCUVEN0Y2RDhCMDk4MDY4MzUwMEMyMzVFRCAvKiBXZWJOU0RhdGFFeHRy
YXNQcml2YXRlLmggaW4gSGVhZGVycyAqLywKIAkJCQk2NTE5NTFFMjA5OTc0MTc4MDAzREZDNjUg
LyogV2ViTG9hZGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk2NTUwQjdDNzA5OUVGQUU5MDA5MEQ3
ODEgLyogV2ViQXJjaGl2ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUREODk2ODIwMDlBQTg3MjQw
MDk3RTdGMCAvKiBXZWJFbGVtZW50RGljdGlvbmFyeS5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwog
CQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xODQy
LDYgKzE4NDksNyBAQAogCQkJCTFDNjhGNjcyMDk1QjVGQzEwMEMyOTg0RSAvKiBXZWJOb2RlSGln
aGxpZ2h0Vmlldy5tIGluIFNvdXJjZXMgKi8sCiAJCQkJNjVDN0Y0MkQwOTc5REU2NDAwMjJFNDUz
IC8qIFdlYlBhZ2VCcmlkZ2UubSBpbiBTb3VyY2VzICovLAogCQkJCTY1NTBCN0M4MDk5RUZBRTkw
MDkwRDc4MSAvKiBXZWJBcmNoaXZlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJREQ4OTY4MjEwOUFB
ODcyNDAwOTdFN0YwIC8qIFdlYkVsZW1lbnREaWN0aW9uYXJ5Lm0gaW4gU291cmNlcyAqLywKIAkJ
CSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5k
ZXg6IE1pc2MvV2ViRWxlbWVudERpY3Rpb25hcnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBNaXNjL1dlYkVs
ZW1lbnREaWN0aW9uYXJ5LmgJKHJldmlzaW9uIDApCisrKyBNaXNjL1dlYkVsZW1lbnREaWN0aW9u
YXJ5LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9y
dCA8Rm91bmRhdGlvbi9OU0RpY3Rpb25hcnkuaD4KKworQGNsYXNzIERPTU5vZGU7CitAY2xhc3Mg
RE9NRWxlbWVudDsKKworQGludGVyZmFjZSBXZWJFbGVtZW50RGljdGlvbmFyeSA6IE5TRGljdGlv
bmFyeSB7CisgICAgRE9NTm9kZSAqX2lubmVyTm9kZTsKKyAgICBET01Ob2RlICpfaW5uZXJOb25T
aGFyZWROb2RlOworICAgIERPTUVsZW1lbnQgKl9VUkxFbGVtZW50OworICAgIE5TTXV0YWJsZURp
Y3Rpb25hcnkgKl9jYWNoZTsKKyAgICBOU011dGFibGVTZXQgKl9uaWxWYWx1ZXM7CisgICAgTlNQ
b2ludCBfcG9pbnQ7CisgICAgQk9PTCBfY2FjaGVDb21wbGV0ZTsKK30KKy0gKGlkKWluaXRXaXRo
SW5uZXJOb25TaGFyZWROb2RlOihET01Ob2RlICopaW5uZXJOb25TaGFyZWROb2RlIGlubmVyTm9k
ZTooRE9NTm9kZSAqKWlubmVyTm9kZSBVUkxFbGVtZW50OihET01FbGVtZW50ICopVVJMRWxlbWVu
dCBhbmRQb2ludDooTlNQb2ludClwb2ludDsKK0BlbmQKSW5kZXg6IE1pc2MvV2ViRWxlbWVudERp
Y3Rpb25hcnkubQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBNaXNjL1dlYkVsZW1lbnREaWN0aW9uYXJ5Lm0JKHJl
dmlzaW9uIDApCisrKyBNaXNjL1dlYkVsZW1lbnREaWN0aW9uYXJ5Lm0JKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVy
LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgIldlYkVsZW1lbnREaWN0aW9u
YXJ5LmgiCisKKyNpbXBvcnQgIldlYkRPTU9wZXJhdGlvbnMuaCIKKyNpbXBvcnQgIldlYkZyYW1l
LmgiCisjaW1wb3J0ICJXZWJGcmFtZUJyaWRnZS5oIgorI2ltcG9ydCAiV2ViVmlldy5oIgorI2lt
cG9ydCAiV2ViVmlld1ByaXZhdGUuaCIKKworI2ltcG9ydCA8V2ViS2l0L0RPTUNvcmUuaD4KKyNp
bXBvcnQgPFdlYktpdC9ET01Qcml2YXRlLmg+CisKK3R5cGVkZWYgZW51bSB7CisgICAgV2ViRWxl
bWVudFNlbGYsCisgICAgV2ViRWxlbWVudElubmVyTm9kZSwKKyAgICBXZWJFbGVtZW50SW5uZXJO
b25TaGFyZWROb2RlLAorICAgIFdlYkVsZW1lbnRVUkxFbGVtZW50Cit9IFdlYkVsZW1lbnRUYXJn
ZXRPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IFdlYkVsZW1lbnRNZXRob2QgeworICAgIFdlYkVs
ZW1lbnRUYXJnZXRPYmplY3QgdGFyZ2V0OworICAgIFNFTCBzZWxlY3RvcjsKK30gV2ViRWxlbWVu
dE1ldGhvZDsKKworc3RhdGljIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgbG9va3VwVGFibGUgPSBO
VUxMOworCitzdGF0aWMgdm9pZCBhZGRMb29rdXBLZXkoTlNTdHJpbmcgKmtleSwgU0VMIHNlbGVj
dG9yLCBXZWJFbGVtZW50VGFyZ2V0T2JqZWN0IHRhcmdldCkKK3sKKyAgICBXZWJFbGVtZW50TWV0
aG9kICplbGVtZW50TWV0aG9kID0gbWFsbG9jKHNpemVvZihXZWJFbGVtZW50TWV0aG9kKSk7Cisg
ICAgZWxlbWVudE1ldGhvZC0+dGFyZ2V0ID0gdGFyZ2V0OworICAgIGVsZW1lbnRNZXRob2QtPnNl
bGVjdG9yID0gc2VsZWN0b3I7CisgICAgQ0ZEaWN0aW9uYXJ5QWRkVmFsdWUobG9va3VwVGFibGUs
IGtleSwgZWxlbWVudE1ldGhvZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNhY2hlVmFsdWVGb3JLZXko
Y29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICp2YWx1ZSwgdm9pZCAqc2VsZikKK3sKKyAgICAv
LyBjYWxsaW5nIG9iamVjdEZvcktleSB3aWxsIGNhY2hlIHRoZSB2YWx1ZSBpbiBvdXIgX2NhY2hl
IGRpY3Rpb25hcnkKKyAgICBbKFdlYkVsZW1lbnREaWN0aW9uYXJ5ICopc2VsZiBvYmplY3RGb3JL
ZXk6KE5TU3RyaW5nICopa2V5XTsKK30KKworQGltcGxlbWVudGF0aW9uIFdlYkVsZW1lbnREaWN0
aW9uYXJ5CisrICh2b2lkKWluaXRpYWxpemVMb29rdXBUYWJsZQoreworICAgIGlmIChsb29rdXBU
YWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbG9va3VwVGFibGUgPSBDRkRpY3Rpb25hcnlD
cmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsIDAsICZrQ0ZDb3B5U3RyaW5nRGljdGlv
bmFyeUtleUNhbGxCYWNrcywgTlVMTCk7CisKKyAgICBhZGRMb29rdXBLZXkoV2ViRWxlbWVudERP
TU5vZGVLZXksIEBzZWxlY3RvcihfZG9tTm9kZSksIFdlYkVsZW1lbnRTZWxmKTsKKyAgICBhZGRM
b29rdXBLZXkoV2ViRWxlbWVudEZyYW1lS2V5LCBAc2VsZWN0b3IoX3dlYkZyYW1lKSwgV2ViRWxl
bWVudFNlbGYpOworICAgIGFkZExvb2t1cEtleShXZWJFbGVtZW50SW1hZ2VBbHRTdHJpbmdLZXks
IEBzZWxlY3RvcihhbHREaXNwbGF5U3RyaW5nKSwgV2ViRWxlbWVudElubmVyTm9uU2hhcmVkTm9k
ZSk7CisgICAgYWRkTG9va3VwS2V5KFdlYkVsZW1lbnRJbWFnZUtleSwgQHNlbGVjdG9yKGltYWdl
KSwgV2ViRWxlbWVudElubmVyTm9uU2hhcmVkTm9kZSk7CisgICAgYWRkTG9va3VwS2V5KFdlYkVs
ZW1lbnRJbWFnZVJlY3RLZXksIEBzZWxlY3RvcihfaW1hZ2VSZWN0KSwgV2ViRWxlbWVudFNlbGYp
OworICAgIGFkZExvb2t1cEtleShXZWJFbGVtZW50SW1hZ2VVUkxLZXksIEBzZWxlY3RvcihhYnNv
bHV0ZUltYWdlVVJMKSwgV2ViRWxlbWVudElubmVyTm9uU2hhcmVkTm9kZSk7CisgICAgYWRkTG9v
a3VwS2V5KFdlYkVsZW1lbnRJc1NlbGVjdGVkS2V5LCBAc2VsZWN0b3IoX2lzU2VsZWN0ZWQpLCBX
ZWJFbGVtZW50U2VsZik7CisgICAgYWRkTG9va3VwS2V5KFdlYkVsZW1lbnRUaXRsZUtleSwgQHNl
bGVjdG9yKF90aXRsZSksIFdlYkVsZW1lbnRTZWxmKTsKKyAgICBhZGRMb29rdXBLZXkoV2ViRWxl
bWVudExpbmtVUkxLZXksIEBzZWxlY3RvcihhYnNvbHV0ZUxpbmtVUkwpLCBXZWJFbGVtZW50VVJM
RWxlbWVudCk7CisgICAgYWRkTG9va3VwS2V5KFdlYkVsZW1lbnRMaW5rVGFyZ2V0RnJhbWVLZXks
IEBzZWxlY3RvcihfdGFyZ2V0V2ViRnJhbWUpLCBXZWJFbGVtZW50U2VsZik7CisgICAgYWRkTG9v
a3VwS2V5KFdlYkVsZW1lbnRMaW5rVGl0bGVLZXksIEBzZWxlY3Rvcih0aXRsZURpc3BsYXlTdHJp
bmcpLCBXZWJFbGVtZW50VVJMRWxlbWVudCk7CisgICAgYWRkTG9va3VwS2V5KFdlYkVsZW1lbnRM
aW5rTGFiZWxLZXksIEBzZWxlY3Rvcih0ZXh0Q29udGVudCksIFdlYkVsZW1lbnRVUkxFbGVtZW50
KTsKK30KKworLSAoaWQpaW5pdFdpdGhJbm5lck5vblNoYXJlZE5vZGU6KERPTU5vZGUgKilpbm5l
ck5vblNoYXJlZE5vZGUgaW5uZXJOb2RlOihET01Ob2RlICopaW5uZXJOb2RlIFVSTEVsZW1lbnQ6
KERPTUVsZW1lbnQgKilVUkxFbGVtZW50IGFuZFBvaW50OihOU1BvaW50KXBvaW50Cit7CisgICAg
W1tzZWxmIGNsYXNzXSBpbml0aWFsaXplTG9va3VwVGFibGVdOworICAgIFtzdXBlciBpbml0XTsK
KyAgICBfcG9pbnQgPSBwb2ludDsKKyAgICBfaW5uZXJOb2RlID0gW2lubmVyTm9kZSByZXRhaW5d
OworICAgIF9pbm5lck5vblNoYXJlZE5vZGUgPSBbaW5uZXJOb25TaGFyZWROb2RlIHJldGFpbl07
CisgICAgX1VSTEVsZW1lbnQgPSBbVVJMRWxlbWVudCByZXRhaW5dOworICAgIHJldHVybiBzZWxm
OworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyAgICBbX2lubmVyTm9kZSByZWxlYXNlXTsKKyAg
ICBbX2lubmVyTm9uU2hhcmVkTm9kZSByZWxlYXNlXTsKKyAgICBbX1VSTEVsZW1lbnQgcmVsZWFz
ZV07CisgICAgW19jYWNoZSByZWxlYXNlXTsKKyAgICBbX25pbFZhbHVlcyByZWxlYXNlXTsKKyAg
ICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKHZvaWQpX2ZpbGxDYWNoZQoreworICAgIENGRGlj
dGlvbmFyeUFwcGx5RnVuY3Rpb24obG9va3VwVGFibGUsIGNhY2hlVmFsdWVGb3JLZXksIHNlbGYp
OworICAgIF9jYWNoZUNvbXBsZXRlID0gWUVTOworfQorCistICh1bnNpZ25lZCljb3VudAorewor
ICAgIGlmICghX2NhY2hlQ29tcGxldGUpCisgICAgICAgIFtzZWxmIF9maWxsQ2FjaGVdOworICAg
IHJldHVybiBbX2NhY2hlIGNvdW50XTsKK30KKworLSAoTlNFbnVtZXJhdG9yICopa2V5RW51bWVy
YXRvcgoreworICAgIGlmICghX2NhY2hlQ29tcGxldGUpCisgICAgICAgIFtzZWxmIF9maWxsQ2Fj
aGVdOworICAgIHJldHVybiBbX2NhY2hlIGtleUVudW1lcmF0b3JdOworfQorCistIChpZClvYmpl
Y3RGb3JLZXk6KGlkKWtleQoreworICAgIGlmIChfbmlsVmFsdWVzICYmIFtfbmlsVmFsdWVzIGNv
bnRhaW5zT2JqZWN0OmtleV0pCisgICAgICAgIHJldHVybiBuaWw7CisKKyAgICBpZCB2YWx1ZSA9
IFtfY2FjaGUgb2JqZWN0Rm9yS2V5OmtleV07CisgICAgaWYgKHZhbHVlIHx8IF9jYWNoZUNvbXBs
ZXRlKQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICBXZWJFbGVtZW50TWV0aG9kICplbGVt
ZW50TWV0aG9kID0gKFdlYkVsZW1lbnRNZXRob2QgKilDRkRpY3Rpb25hcnlHZXRWYWx1ZShsb29r
dXBUYWJsZSwga2V5KTsKKyAgICBpZiAoIWVsZW1lbnRNZXRob2QpCisgICAgICAgIHJldHVybiBu
aWw7CisKKyAgICBpZCB0YXJnZXQgPSBuaWw7CisgICAgc3dpdGNoIChlbGVtZW50TWV0aG9kLT50
YXJnZXQpIHsKKyAgICAgICAgY2FzZSBXZWJFbGVtZW50U2VsZjoKKyAgICAgICAgICAgIHRhcmdl
dCA9IHNlbGY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXZWJFbGVtZW50SW5u
ZXJOb25TaGFyZWROb2RlOgorICAgICAgICAgICAgdGFyZ2V0ID0gX2lubmVyTm9uU2hhcmVkTm9k
ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdlYkVsZW1lbnRJbm5lck5vZGU6
CisgICAgICAgICAgICB0YXJnZXQgPSBfaW5uZXJOb2RlOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgV2ViRWxlbWVudFVSTEVsZW1lbnQ6CisgICAgICAgICAgICB0YXJnZXQgPSBf
VVJMRWxlbWVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0YXJnZXQg
JiYgW3RhcmdldCByZXNwb25kc1RvU2VsZWN0b3I6ZWxlbWVudE1ldGhvZC0+c2VsZWN0b3JdKQor
ICAgICAgICB2YWx1ZSA9IFt0YXJnZXQgcGVyZm9ybVNlbGVjdG9yOmVsZW1lbnRNZXRob2QtPnNl
bGVjdG9yXTsKKworICAgIHVuc2lnbmVkIGxvb2t1cFRhYmxlQ291bnQgPSBDRkRpY3Rpb25hcnlH
ZXRDb3VudChsb29rdXBUYWJsZSk7CisKKyAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgaWYgKCFf
Y2FjaGUpCisgICAgICAgICAgICBfY2FjaGUgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2Nd
IGluaXRXaXRoQ2FwYWNpdHk6bG9va3VwVGFibGVDb3VudF07CisgICAgICAgIFtfY2FjaGUgc2V0
T2JqZWN0OnZhbHVlIGZvcktleTprZXldOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghX25p
bFZhbHVlcykKKyAgICAgICAgICAgIF9uaWxWYWx1ZXMgPSBbW05TTXV0YWJsZVNldCBhbGxvY10g
aW5pdFdpdGhDYXBhY2l0eTpsb29rdXBUYWJsZUNvdW50XTsKKyAgICAgICAgW19uaWxWYWx1ZXMg
YWRkT2JqZWN0OmtleV07CisgICAgfQorCisgICAgX2NhY2hlQ29tcGxldGUgPSAoW19jYWNoZSBj
b3VudF0gKyBbX25pbFZhbHVlcyBjb3VudF0pID09IGxvb2t1cFRhYmxlQ291bnQ7CisKKyAgICBy
ZXR1cm4gdmFsdWU7Cit9CisKKy0gKERPTU5vZGUgKilfZG9tTm9kZQoreworICAgIHJldHVybiBb
W19pbm5lck5vblNoYXJlZE5vZGUgcmV0YWluXSBhdXRvcmVsZWFzZV07Cit9CisKKy0gKFdlYkZy
YW1lICopX3dlYkZyYW1lCit7CisgICAgcmV0dXJuIFtbX2lubmVyTm9uU2hhcmVkTm9kZSBvd25l
ckRvY3VtZW50XSB3ZWJGcmFtZV07Cit9CisKKy0gKFdlYkZyYW1lICopX3RhcmdldFdlYkZyYW1l
Cit7CisgICAgaWYgKCFfVVJMRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICBXZWJG
cmFtZSAqd2ViRnJhbWUgPSBbW19pbm5lck5vblNoYXJlZE5vZGUgb3duZXJEb2N1bWVudF0gd2Vi
RnJhbWVdOworICAgIE5TU3RyaW5nICp0YXJnZXROYW1lID0gWyhET01IVE1MQW5jaG9yRWxlbWVu
dCAqKV9VUkxFbGVtZW50IHRhcmdldF07CisgICAgaWYgKFt0YXJnZXROYW1lIGxlbmd0aF0pCisg
ICAgICAgIHJldHVybiBbd2ViRnJhbWUgZmluZEZyYW1lTmFtZWQ6dGFyZ2V0TmFtZV07CisgICAg
cmV0dXJuIHdlYkZyYW1lOworfQorCistIChOU1N0cmluZyAqKV90aXRsZQoreworICAgIC8vIEZp
bmQgdGhlIHRpdGxlIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBET00gbm9kZS4KKyAgICAvLyBG
b3IgPGFyZWE+IHRhZ3MgaW4gaW1hZ2UgbWFwcywgd2FsayB0aGUgdHJlZSBmb3IgdGhlIDxhcmVh
Piwgbm90IHRoZSA8aW1nPiB1c2luZyBpdC4KKyAgICBmb3IgKERPTU5vZGUgKnRpdGxlTm9kZSA9
IF9pbm5lck5vZGU7IHRpdGxlTm9kZTsgdGl0bGVOb2RlID0gW3RpdGxlTm9kZSBwYXJlbnROb2Rl
XSkgeworICAgICAgICBpZiAoW3RpdGxlTm9kZSBpc0tpbmRPZkNsYXNzOltET01IVE1MRWxlbWVu
dCBjbGFzc11dKSB7CisgICAgICAgICAgICBOU1N0cmluZyAqdGl0bGUgPSBbKERPTUhUTUxFbGVt
ZW50ICopdGl0bGVOb2RlIHRpdGxlRGlzcGxheVN0cmluZ107CisgICAgICAgICAgICBpZiAoW3Rp
dGxlIGxlbmd0aF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKE5TVmFsdWUgKilfaW1hZ2VSZWN0Cit7Cisg
ICAgaWYgKFtzZWxmIG9iamVjdEZvcktleTpXZWJFbGVtZW50SW1hZ2VVUkxLZXldKQorICAgICAg
ICByZXR1cm4gW05TVmFsdWUgdmFsdWVXaXRoUmVjdDpbX2lubmVyTm9uU2hhcmVkTm9kZSBib3Vu
ZGluZ0JveF1dOworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKE5TTnVtYmVyICopX2lzU2VsZWN0
ZWQKK3sKKyAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhCb29sOltbW1tfaW5uZXJOb25T
aGFyZWROb2RlIG93bmVyRG9jdW1lbnRdIHdlYkZyYW1lXSBfYnJpZGdlXSBpc1BvaW50SW5zaWRl
U2VsZWN0aW9uOl9wb2ludF1dOworfQorQGVuZApJbmRleDogTWlzYy9XZWJOU1ZpZXdFeHRyYXMu
bQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBNaXNjL1dlYk5TVmlld0V4dHJhcy5tCShyZXZpc2lvbiAxMjk4MykK
KysrIE1pc2MvV2ViTlNWaWV3RXh0cmFzLm0JKHdvcmtpbmcgY29weSkKQEAgLTE3Nyw3ICsxNzcs
NyBAQAogICAgIE5TSW1hZ2UgKmRyYWdJbWFnZTsKICAgICBOU1BvaW50IG9yaWdpbjsKIAotICAg
IE5TSW1hZ2UgKmltYWdlID0gKHdpciAhPSBuaWwpID8gW3dpciBpbWFnZV0gOiBbZWxlbWVudCBf
aW1hZ2VdOworICAgIE5TSW1hZ2UgKmltYWdlID0gKHdpciAhPSBuaWwpID8gW3dpciBpbWFnZV0g
OiBbZWxlbWVudCBpbWFnZV07CiAgICAgaWYgKGltYWdlICE9IG5pbCAmJiBbaW1hZ2Ugc2l6ZV0u
aGVpZ2h0ICogW2ltYWdlIHNpemVdLndpZHRoIDw9IFdlYk1heE9yaWdpbmFsSW1hZ2VBcmVhKSB7
CiAgICAgICAgIE5TU2l6ZSBvcmlnaW5hbFNpemUgPSByZWN0LnNpemU7CiAgICAgICAgIG9yaWdp
biA9IHJlY3Qub3JpZ2luOwpJbmRleDogV2ViVmlldy9XZWJWaWV3UHJpdmF0ZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYlZpZXcvV2ViVmlld1ByaXZhdGUuaAkocmV2aXNpb24gMTI5ODMpCisrKyBXZWJW
aWV3L1dlYlZpZXdQcml2YXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTY1LDYgKzY1LDggQEAgZXh0
ZXJuIE5TU3RyaW5nICpfV2ViTWFpbkZyYW1lSWNvbktleTsKIGV4dGVybiBOU1N0cmluZyAqX1dl
Yk1haW5GcmFtZVRpdGxlS2V5OwogZXh0ZXJuIE5TU3RyaW5nICpfV2ViTWFpbkZyYW1lVVJMS2V5
OwogCitleHRlcm4gTlNTdHJpbmcgKldlYkVsZW1lbnRUaXRsZUtleTsgICAvLyBOU1N0cmluZyBv
ZiB0aGUgdGl0bGUgb2YgdGhlIGVsZW1lbnQgKHBlbmRpbmcgcHVibGljLCB1c2VkIGJ5IFNhZmFy
aSkKKwogdHlwZWRlZiBlbnVtIHsKICAgICBXZWJEYXNoYm9hcmRCZWhhdmlvckFsd2F5c1NlbmRN
b3VzZUV2ZW50c1RvQWxsV2luZG93cywKICAgICBXZWJEYXNoYm9hcmRCZWhhdmlvckFsd2F5c1Nl
bmRBY3RpdmVOdWxsRXZlbnRzVG9QbHVnSW5zLApJbmRleDogV2ViVmlldy9XZWJWaWV3Lm0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViVmlldy9XZWJWaWV3Lm0JKHJldmlzaW9uIDEyOTgzKQorKysgV2ViVmll
dy9XZWJWaWV3Lm0JKHdvcmtpbmcgY29weSkKQEAgLTMwOSw2ICszMDksNyBAQCBOU1N0cmluZyAq
V2ViRWxlbWVudEltYWdlQWx0U3RyaW5nS2V5ID0gCiBOU1N0cmluZyAqV2ViRWxlbWVudEltYWdl
UmVjdEtleSA9ICAgICAgICAgIEAiV2ViRWxlbWVudEltYWdlUmVjdCI7CiBOU1N0cmluZyAqV2Vi
RWxlbWVudEltYWdlVVJMS2V5ID0gICAgICAgICAgIEAiV2ViRWxlbWVudEltYWdlVVJMIjsKIE5T
U3RyaW5nICpXZWJFbGVtZW50SXNTZWxlY3RlZEtleSA9ICAgICAgICAgQCJXZWJFbGVtZW50SXNT
ZWxlY3RlZCI7CitOU1N0cmluZyAqV2ViRWxlbWVudFRpdGxlS2V5ID0gICAgICAgICAgICAgIEAi
V2ViRWxlbWVudFRpdGxlIjsKIE5TU3RyaW5nICpXZWJFbGVtZW50TGlua1VSTEtleSA9ICAgICAg
ICAgICAgQCJXZWJFbGVtZW50TGlua1VSTCI7CiBOU1N0cmluZyAqV2ViRWxlbWVudExpbmtUYXJn
ZXRGcmFtZUtleSA9ICAgIEAiV2ViRWxlbWVudFRhcmdldEZyYW1lIjsKIE5TU3RyaW5nICpXZWJF
bGVtZW50TGlua0xhYmVsS2V5ID0gICAgICAgICAgQCJXZWJFbGVtZW50TGlua0xhYmVsIjsKSW5k
ZXg6IFdlYlZpZXcvV2ViSFRNTFZpZXcubQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJWaWV3L1dlYkhUTUxW
aWV3Lm0JKHJldmlzaW9uIDEyOTgzKQorKysgV2ViVmlldy9XZWJIVE1MVmlldy5tCSh3b3JraW5n
IGNvcHkpCkBAIC00Miw2ICs0Miw3IEBACiAjaW1wb3J0IDxXZWJLaXQvV2ViRG9jdW1lbnRJbnRl
cm5hbC5oPgogI2ltcG9ydCA8V2ViS2l0L1dlYkRPTU9wZXJhdGlvbnNQcml2YXRlLmg+CiAjaW1w
b3J0IDxXZWJLaXQvV2ViRWRpdGluZ0RlbGVnYXRlLmg+CisjaW1wb3J0IDxXZWJLaXQvV2ViRWxl
bWVudERpY3Rpb25hcnkuaD4KICNpbXBvcnQgPFdlYktpdC9XZWJGcmFtZVByaXZhdGUuaD4KICNp
bXBvcnQgPFdlYktpdC9XZWJGcmFtZUludGVybmFsLmg+CiAjaW1wb3J0IDxXZWJLaXQvV2ViRnJh
bWVWaWV3SW50ZXJuYWwuaD4KQEAgLTEwNTAsMTAgKzEwNTEsMTAgQEAgc3RhdGljIFdlYkhUTUxW
aWV3ICpsYXN0SGl0VmlldyA9IG5pbDsKICAgICAgICAgICAgICAgICAgICAgbmV3VG9vbFRpcCA9
IFtbKERPTUhUTUxJbnB1dEVsZW1lbnQgKikgZG9tRWxlbWVudCBmb3JtXSBhY3Rpb25dOwogICAg
ICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5ld1Rvb2xUaXAgPT0gbmlsKQotICAgICAgICAg
ICAgICAgIG5ld1Rvb2xUaXAgPSBbW2VsZW1lbnQgb2JqZWN0Rm9yS2V5OldlYkNvcmVFbGVtZW50
TGlua1VSTEtleV0gX3dlYl91c2VyVmlzaWJsZVN0cmluZ107CisgICAgICAgICAgICAgICAgbmV3
VG9vbFRpcCA9IFtbZWxlbWVudCBvYmplY3RGb3JLZXk6V2ViRWxlbWVudExpbmtVUkxLZXldIF93
ZWJfdXNlclZpc2libGVTdHJpbmddOwogICAgICAgICB9CiAgICAgICAgIGlmIChuZXdUb29sVGlw
ID09IG5pbCkKLSAgICAgICAgICAgIG5ld1Rvb2xUaXAgPSBbZWxlbWVudCBvYmplY3RGb3JLZXk6
V2ViQ29yZUVsZW1lbnRUaXRsZUtleV07CisgICAgICAgICAgICBuZXdUb29sVGlwID0gW2VsZW1l
bnQgb2JqZWN0Rm9yS2V5OldlYkVsZW1lbnRUaXRsZUtleV07CiAgICAgICAgIFt2aWV3IF9zZXRU
b29sVGlwOm5ld1Rvb2xUaXBdOwogCiAgICAgICAgIFt2aWV3IHJlbGVhc2VdOwpAQCAtMTE5Myw3
ICsxMTk0LDcgQEAgc3RhdGljIFdlYkhUTUxWaWV3ICpsYXN0SGl0VmlldyA9IG5pbDsKIAogICAg
IC8vIG5vdGUgcGVyIGt3ZWJzdGVyLCB0aGUgb2Zmc2V0IGFyZyBiZWxvdyBpcyBhbHdheXMgaWdu
b3JlZCBpbiBwb3NpdGlvbmluZyB0aGUgaW1hZ2UKICAgICBET01IVE1MRWxlbWVudCAqaW1hZ2VF
bGVtZW50ID0gW2VsZW1lbnQgb2JqZWN0Rm9yS2V5OldlYkVsZW1lbnRET01Ob2RlS2V5XTsKLSAg
ICBpZiAoaW1hZ2VVUkwgIT0gbmlsICYmIFtpbWFnZUVsZW1lbnQgX2ltYWdlXSAhPSBuaWwgJiYg
KF9wcml2YXRlLT5kcmFnU291cmNlQWN0aW9uTWFzayAmIFdlYkRyYWdTb3VyY2VBY3Rpb25JbWFn
ZSkpIHsKKyAgICBpZiAoaW1hZ2VVUkwgIT0gbmlsICYmIFtpbWFnZUVsZW1lbnQgaW1hZ2VdICE9
IG5pbCAmJiAoX3ByaXZhdGUtPmRyYWdTb3VyY2VBY3Rpb25NYXNrICYgV2ViRHJhZ1NvdXJjZUFj
dGlvbkltYWdlKSkgewogICAgICAgICBpZCBzb3VyY2UgPSBzZWxmOwogICAgICAgICBpZiAoIWRo
dG1sV3JvdGVEYXRhKSB7CiAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGltYWdlIHdoZW4gaXQg
aXMgZHJhZ2dlZC4gVGhpcyBhbGxvd3MgdGhlIGltYWdlIHRvIGJlIG1vdmVkIHZpYSBNb3ZlU2Vs
ZWN0aW9uQ29tbWFuZEltcGwgYW5kIHRoaXMgbWF0Y2hlcyBOU1RleHRWaWV3J3MgYmVoYXZpb3Iu
CkBAIC0yODY0LDM1ICsyODY1LDExIEBAIGRvbmU6CiAKIC0gKE5TRGljdGlvbmFyeSAqKWVsZW1l
bnRBdFBvaW50OihOU1BvaW50KXBvaW50CiB7Ci0gICAgTlNEaWN0aW9uYXJ5ICplbGVtZW50SW5m
b1dDID0gW1tzZWxmIF9icmlkZ2VdIGVsZW1lbnRBdFBvaW50OnBvaW50XTsKLSAgICBOU011dGFi
bGVEaWN0aW9uYXJ5ICplbGVtZW50SW5mbyA9IFtlbGVtZW50SW5mb1dDIG11dGFibGVDb3B5XTsK
LSAgICAKLSAgICAvLyBDb252ZXJ0IFVSTCBzdHJpbmdzIHRvIE5TVVJMcy4KLSAgICBbZWxlbWVu
dEluZm8gX3dlYl9zZXRPYmplY3RJZk5vdE5pbDpbTlNVUkwgX3dlYl9VUkxXaXRoRGF0YUFzU3Ry
aW5nOltlbGVtZW50SW5mb1dDIG9iamVjdEZvcktleTpXZWJFbGVtZW50TGlua1VSTEtleV1dIGZv
cktleTpXZWJFbGVtZW50TGlua1VSTEtleV07Ci0gICAgW2VsZW1lbnRJbmZvIF93ZWJfc2V0T2Jq
ZWN0SWZOb3ROaWw6W05TVVJMIF93ZWJfVVJMV2l0aERhdGFBc1N0cmluZzpbZWxlbWVudEluZm9X
QyBvYmplY3RGb3JLZXk6V2ViRWxlbWVudEltYWdlVVJMS2V5XV0gZm9yS2V5OldlYkVsZW1lbnRJ
bWFnZVVSTEtleV07Ci0gICAgaWYgKFtlbGVtZW50SW5mb1dDIG9iamVjdEZvcktleTpXZWJFbGVt
ZW50SW1hZ2VVUkxLZXldKQotICAgICAgICBbZWxlbWVudEluZm8gX3dlYl9zZXRPYmplY3RJZk5v
dE5pbDpbW2VsZW1lbnRJbmZvV0Mgb2JqZWN0Rm9yS2V5OldlYkVsZW1lbnRET01Ob2RlS2V5XSBf
aW1hZ2VdIGZvcktleTpXZWJFbGVtZW50SW1hZ2VLZXldOwotCi0gICAgV2ViRnJhbWVWaWV3ICp3
ZWJGcmFtZVZpZXcgPSBbc2VsZiBfd2ViX3BhcmVudFdlYkZyYW1lVmlld107Ci0gICAgQVNTRVJU
KHdlYkZyYW1lVmlldyk7Ci0gICAgV2ViRnJhbWUgKndlYkZyYW1lID0gW3dlYkZyYW1lVmlldyB3
ZWJGcmFtZV07Ci0gICAgCi0gICAgaWYgKHdlYkZyYW1lKSB7Ci0gICAgICAgIE5TU3RyaW5nICpm
cmFtZU5hbWUgPSBbZWxlbWVudEluZm9XQyBvYmplY3RGb3JLZXk6V2ViRWxlbWVudExpbmtUYXJn
ZXRGcmFtZUtleV07Ci0gICAgICAgIGlmIChbZnJhbWVOYW1lIGxlbmd0aF0gPT0gMCkgewotICAg
ICAgICAgICAgW2VsZW1lbnRJbmZvIHNldE9iamVjdDp3ZWJGcmFtZSBmb3JLZXk6V2ViRWxlbWVu
dExpbmtUYXJnZXRGcmFtZUtleV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBXZWJG
cmFtZSAqd2YgPSBbd2ViRnJhbWUgZmluZEZyYW1lTmFtZWQ6ZnJhbWVOYW1lXTsKLSAgICAgICAg
ICAgIGlmICh3ZiAhPSBuaWwpCi0gICAgICAgICAgICAgICAgW2VsZW1lbnRJbmZvIHNldE9iamVj
dDp3ZiBmb3JLZXk6V2ViRWxlbWVudExpbmtUYXJnZXRGcmFtZUtleV07Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgW2VsZW1lbnRJbmZvIHJlbW92ZU9iamVjdEZvcktleTpXZWJF
bGVtZW50TGlua1RhcmdldEZyYW1lS2V5XTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAg
W2VsZW1lbnRJbmZvIHNldE9iamVjdDp3ZWJGcmFtZSBmb3JLZXk6V2ViRWxlbWVudEZyYW1lS2V5
XTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFtlbGVtZW50SW5mbyBhdXRvcmVsZWFzZV07Cisg
ICAgRE9NTm9kZSAqaW5uZXJOb2RlID0gbmlsOworICAgIERPTU5vZGUgKmlubmVyTm9uU2hhcmVk
Tm9kZSA9IG5pbDsKKyAgICBET01FbGVtZW50ICpVUkxFbGVtZW50ID0gbmlsOworICAgIFtbc2Vs
ZiBfYnJpZGdlXSBnZXRJbm5lck5vblNoYXJlZE5vZGU6JmlubmVyTm9uU2hhcmVkTm9kZSBpbm5l
ck5vZGU6JmlubmVyTm9kZSBVUkxFbGVtZW50OiZVUkxFbGVtZW50IGF0UG9pbnQ6cG9pbnRdOwor
ICAgIHJldHVybiBbW1tXZWJFbGVtZW50RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhJbm5lck5v
blNoYXJlZE5vZGU6aW5uZXJOb25TaGFyZWROb2RlIGlubmVyTm9kZTppbm5lck5vZGUgVVJMRWxl
bWVudDpVUkxFbGVtZW50IGFuZFBvaW50OnBvaW50XSBhdXRvcmVsZWFzZV07CiB9CiAKIC0gKHZv
aWQpbW91c2VVcDooTlNFdmVudCAqKWV2ZW50Cg==
</data>
<flag name="review"
          id="1716"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>